From 91e9e464fe5400192d13e1f9240cbf180200a103 Mon Sep 17 00:00:00 2001 From: SQIsign team Date: Thu, 6 Feb 2025 00:00:00 +0000 Subject: [PATCH] second-round version of SQIsign MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Marius A. Aardal Co-authored-by: Gora Adj Co-authored-by: Diego F. Aranha Co-authored-by: Andrea Basso Co-authored-by: Isaac Andrés Canales Martínez Co-authored-by: Jorge Chávez-Saab Co-authored-by: Maria Corte-Real Santos Co-authored-by: Luca De Feo Co-authored-by: Max Duparc Co-authored-by: Jonathan Komada Eriksen Co-authored-by: Décio Luiz Gazzoni Filho Co-authored-by: Basil Hess Co-authored-by: Antonin Leroux Co-authored-by: Patrick Longa Co-authored-by: Luciano Maino Co-authored-by: Michael Meyer Co-authored-by: Hiroshi Onuki Co-authored-by: Lorenz Panny Co-authored-by: Giacomo Pope Co-authored-by: Krijn Reijnders Co-authored-by: Damien Robert Co-authored-by: Francisco Rodríguez-Henriquez Co-authored-by: Sina Schaeffler Co-authored-by: Benjamin Wesolowski --- .astylerc | 16 - .clang-format | 246 + .cmake/32bit.cmake | 8 + .cmake/bm.cmake | 12 + .cmake/flags.cmake | 22 +- .cmake/gmpconfig.cmake | 80 +- .cmake/impl_type.cmake | 8 + .cmake/sqisign_variant.cmake | 2 +- .cmake/target.cmake | 113 +- .dir-locals.el | 16 - .github/workflows/checks-daily.yml | 19 + .github/workflows/cmake.yml | 208 +- .github/workflows/daily.yml | 54 + .github/workflows/daily_trigger.yml | 60 + .github/workflows/kat.yml | 189 + .github/workflows/s390-daily.yml | 33 + .gitignore | 5 +- .pre-commit-config.yaml | 7 + CMakeLists.txt | 49 +- COPYING.LGPL | 165 + DEVELOPERS.md | 313 +- KAT/PQCsignKAT_1138_lvl3.rsp | 902 --- KAT/PQCsignKAT_1509_lvl5.rsp | 902 --- ...l3.req => PQCsignKAT_353_SQIsign_lvl1.req} | 0 KAT/PQCsignKAT_353_SQIsign_lvl1.rsp | 902 +++ ...l5.req => PQCsignKAT_529_SQIsign_lvl3.req} | 0 KAT/PQCsignKAT_529_SQIsign_lvl3.rsp | 902 +++ ...l1.req => PQCsignKAT_701_SQIsign_lvl5.req} | 0 KAT/PQCsignKAT_701_SQIsign_lvl5.rsp | 902 +++ KAT/PQCsignKAT_782_lvl1.rsp | 902 --- NOTICE | 10 +- README.md | 308 +- apps/CMakeLists.txt | 65 +- apps/PQCgenKAT_sign_pqm4.c | 297 + apps/benchmark.c | 124 + apps/example_nistapi.c | 133 +- apps/fuzz_sign.c | 151 + apps/fuzz_verify.c | 117 + include/mem.h | 7 +- include/rng.h | 15 + include/sig.h | 32 +- include/sqisign_namespace.h | 1022 +++ scripts/Namespace.scala | 148 + scripts/cformat.py | 92 - scripts/check_namespace.sh | 36 + scripts/gen_kat_files.sh | 16 + scripts/gen_pqm4_sources.sh | 60 + scripts/parameters.py | 31 - scripts/precomp/cformat.py | 128 + scripts/precomp/ec_params.sage | 41 + scripts/precomp/maxorders.py | 88 + scripts/precomp/parameters.py | 16 + scripts/precomp/precompute_E0_basis.sage | 38 + .../precompute_endomorphism_action.sage | 303 + scripts/precomp/precompute_hd_splitting.sage | 158 + .../precompute_quaternion_constants.sage | 44 + .../precomp/precompute_quaternion_data.sage | 91 + scripts/precomp/precompute_sizes.sage | 93 + .../precomp/precompute_torsion_constants.sage | 40 + scripts/precomp/torsion_basis.py | 75 + scripts/precompute_endomorphism_action.sage | 203 - scripts/precompute_klpt_constants.sage | 114 - scripts/precompute_quaternion_data.sage | 115 - scripts/precompute_sizes.sage | 92 - scripts/precompute_torsion_constants.sage | 67 - src/CMakeLists.txt | 106 +- src/common/CMakeLists.txt | 5 + src/common/arm64crypto/CMakeLists.txt | 40 + .../include/randombytes_arm64crypto.h | 27 + src/common/arm64crypto/randombytes_ctrdrbg.c | 276 + .../randombytes_ctrdrbg_inline_asm.c | 422 ++ src/common/broadwell/CMakeLists.txt | 43 + src/common/broadwell/aes_ni.c | 258 + src/common/broadwell/ctr_drbg.c | 201 + src/common/broadwell/include/aes_ni.h | 85 + src/common/broadwell/include/ctr_drbg.h | 78 + src/common/broadwell/include/defs.h | 63 + .../broadwell/randombytes_ctrdrbg_aesni.c | 87 + src/common/broadwell/vaes256_key_expansion.S | 122 + src/common/generic/CMakeLists.txt | 31 +- src/common/generic/fips202.c | 242 +- src/common/generic/include/aes.h | 23 - src/common/generic/include/bench.h | 139 +- src/common/generic/include/bench_macos.h | 143 + .../generic/include/bench_test_arguments.h | 32 + src/common/generic/include/fips202.h | 164 +- src/common/generic/include/tools.h | 49 + src/common/generic/include/tutil.h | 9 +- src/common/generic/mem.c | 9 +- src/common/generic/randombytes_ctrdrbg.c | 140 - src/common/generic/randombytes_system.c | 575 +- src/common/generic/test/bench_ctrdrbg.c | 57 + src/common/generic/test/test_ctrdrbg.c | 68 + src/common/generic/tools.c | 75 + src/common/ref/CMakeLists.txt | 10 + src/common/{generic => ref}/aes_c.c | 303 +- src/common/ref/include/aes.h | 29 + src/common/ref/randombytes_ctrdrbg.c | 161 + src/ec/ref/CMakeLists.txt | 2 +- src/ec/ref/ecx/basis.c | 508 -- src/ec/ref/ecx/ec.c | 1461 ----- src/ec/ref/ecx/fp2-test.c | 90 - src/ec/ref/ecx/isog_chains.c | 298 - src/ec/ref/ecx/kps.c | 228 - src/ec/ref/ecx/poly-mul.c | 1025 --- src/ec/ref/ecx/poly-redc.c | 349 -- src/ec/ref/ecx/tedwards.c | 231 - src/ec/ref/ecx/test/ec-test.c | 18 - src/ec/ref/ecx/test/fp2-test.c | 142 - src/ec/ref/ecx/test/isog-test.c | 1067 ---- src/ec/ref/ecx/test/mont-test.c | 386 -- src/ec/ref/ecx/test/poly-mul-test.c | 445 -- src/ec/ref/ecx/test/poly-redc-test.c | 461 -- src/ec/ref/ecx/test/test_extras.c | 75 - src/ec/ref/ecx/test/test_extras.h | 29 - src/ec/ref/ecx/test/velu-test.c | 298 - src/ec/ref/ecx/xeval.c | 299 - src/ec/ref/ecx/xisog.c | 295 - src/ec/ref/include/biextension.h | 82 + src/ec/ref/include/curve_extras.h | 28 - src/ec/ref/include/ec.h | 1444 ++--- src/ec/ref/include/isog.h | 94 +- src/ec/ref/include/poly.h | 28 - src/ec/ref/include/sdacs.h | 50 - src/ec/ref/include/tedwards.h | 28 - src/ec/ref/lvl1/CMakeLists.txt | 18 +- src/ec/ref/lvl1/test/CMakeLists.txt | 37 +- src/ec/ref/lvl1/test/ec-tests.h | 400 -- src/ec/ref/lvl1/test/test-basis.h | 24 - src/ec/ref/lvl3/CMakeLists.txt | 18 +- src/ec/ref/lvl3/test/CMakeLists.txt | 37 +- src/ec/ref/lvl3/test/ec-tests.h | 400 -- src/ec/ref/lvl3/test/test-basis.h | 24 - src/ec/ref/lvl5/CMakeLists.txt | 18 +- src/ec/ref/lvl5/test/CMakeLists.txt | 37 +- src/ec/ref/lvl5/test/ec-tests.h | 400 -- src/ec/ref/lvl5/test/test-basis.h | 24 - src/ec/ref/lvlx.cmake | 17 + src/ec/ref/lvlx/basis.c | 416 ++ src/ec/ref/lvlx/biextension.c | 770 +++ src/ec/ref/lvlx/ec.c | 665 ++ src/ec/ref/lvlx/ec_jac.c | 335 + src/ec/ref/lvlx/isog_chains.c | 241 + src/ec/ref/lvlx/test/basis-gen-bench.c | 143 + src/ec/ref/lvlx/test/basis-gen-test.c | 195 + src/ec/ref/lvlx/test/biextension-bench.c | 113 + src/ec/ref/lvlx/test/biextension-test.c | 259 + src/ec/ref/lvlx/test/curve-arith-bench.c | 163 + src/ec/ref/lvlx/test/curve-arith-test.c | 404 ++ src/ec/ref/lvlx/test/test_extras.c | 116 + src/ec/ref/lvlx/test/test_extras.h | 43 + src/ec/ref/lvlx/xeval.c | 64 + src/ec/ref/lvlx/xisog.c | 61 + src/ec/ref/lvlx_test.cmake | 32 + src/gf/broadwell/CMakeLists.txt | 2 + src/gf/broadwell/include/asm_preamble.h | 22 + src/gf/broadwell/include/fp2x.h | 162 + src/gf/broadwell/lvl1/CMakeLists.txt | 12 +- src/gf/broadwell/lvl1/Makefile | 46 - src/gf/broadwell/lvl1/fp.c | 267 +- src/gf/broadwell/lvl1/fp2.c | 190 - src/gf/broadwell/lvl1/fp_asm.S | 237 +- src/gf/broadwell/lvl1/gf5248.c | 767 +++ src/gf/broadwell/lvl1/include/fp.h | 169 +- src/gf/broadwell/lvl1/include/fp2.h | 58 +- src/gf/broadwell/lvl1/include/gf5248.h | 912 +++ src/gf/broadwell/lvl1/test/CMakeLists.txt | 10 +- src/gf/broadwell/lvl1/test/test_extras.c | 74 - src/gf/broadwell/lvl1/test/test_extras.h | 25 - src/gf/broadwell/lvl1/test/test_fp.c | 295 - src/gf/broadwell/lvl1/test/test_fp2.c | 307 - src/gf/broadwell/lvl3/CMakeLists.txt | 6 + src/gf/broadwell/lvl3/fp.c | 108 + src/gf/broadwell/lvl3/fp_asm.S | 825 +++ src/gf/broadwell/lvl3/gf65376.c | 792 +++ src/gf/broadwell/lvl3/include/fp.h | 139 + src/gf/broadwell/lvl3/include/fp2.h | 45 + src/gf/broadwell/lvl3/include/gf65376.h | 1121 ++++ src/gf/broadwell/lvl3/test/CMakeLists.txt | 1 + src/gf/broadwell/lvl5/CMakeLists.txt | 6 + src/gf/broadwell/lvl5/fp.c | 112 + src/gf/broadwell/lvl5/fp_asm.S | 784 +++ src/gf/broadwell/lvl5/gf27500.c | 839 +++ src/gf/broadwell/lvl5/include/fp.h | 141 + src/gf/broadwell/lvl5/include/fp2.h | 49 + src/gf/broadwell/lvl5/include/gf27500.h | 1409 +++++ src/gf/broadwell/lvl5/test/CMakeLists.txt | 1 + src/gf/broadwell/lvlx.cmake | 12 + src/gf/broadwell/lvlx/fp2.c | 188 + src/gf/broadwell/lvlx_test.cmake | 23 + src/gf/gfx/test/bench_fp.c | 254 + src/gf/gfx/test/bench_fp2.c | 234 + src/gf/gfx/test/test_fp.c | 460 ++ src/gf/gfx/test/test_fp2.c | 349 ++ src/gf/gfx/test/test_utils.c | 39 + src/gf/gfx/test/test_utils.h | 19 + src/gf/ref/CMakeLists.txt | 2 + src/gf/ref/include/fp.h | 48 + src/gf/ref/include/fp2.h | 41 + src/gf/ref/lvl1/CMakeLists.txt | 11 +- src/gf/ref/lvl1/Makefile | 43 - src/gf/ref/lvl1/fp.c | 169 - src/gf/ref/lvl1/fp2.c | 192 - src/gf/ref/lvl1/fp_p1913.c | 1876 ------ src/gf/ref/lvl1/fp_p3923.c | 1781 ------ src/gf/ref/lvl1/fp_p5248_32.c | 942 +++ src/gf/ref/lvl1/fp_p5248_64.c | 791 +++ src/gf/ref/lvl1/include/fp.h | 76 - src/gf/ref/lvl1/include/fp2.h | 29 - src/gf/ref/lvl1/test/CMakeLists.txt | 10 +- src/gf/ref/lvl1/test/test_extras.c | 74 - src/gf/ref/lvl1/test/test_extras.h | 25 - src/gf/ref/lvl1/test/test_fp.c | 295 - src/gf/ref/lvl1/test/test_fp2.c | 307 - src/gf/ref/lvl3/CMakeLists.txt | 11 +- src/gf/ref/lvl3/Makefile | 43 - src/gf/ref/lvl3/fp.c | 171 - src/gf/ref/lvl3/fp2.c | 194 - src/gf/ref/lvl3/fp_p47441.c | 3424 ---------- src/gf/ref/lvl3/fp_p65376_32.c | 1231 ++++ src/gf/ref/lvl3/fp_p65376_64.c | 872 +++ src/gf/ref/lvl3/include/fp.h | 76 - src/gf/ref/lvl3/include/fp2.h | 29 - src/gf/ref/lvl3/test/CMakeLists.txt | 10 +- src/gf/ref/lvl3/test/test_extras.c | 74 - src/gf/ref/lvl3/test/test_extras.h | 25 - src/gf/ref/lvl3/test/test_fp.c | 295 - src/gf/ref/lvl3/test/test_fp2.c | 307 - src/gf/ref/lvl5/CMakeLists.txt | 11 +- src/gf/ref/lvl5/Makefile | 43 - src/gf/ref/lvl5/fp.c | 168 - src/gf/ref/lvl5/fp2.c | 193 - src/gf/ref/lvl5/fp_p27500_32.c | 1514 +++++ src/gf/ref/lvl5/fp_p27500_64.c | 970 +++ src/gf/ref/lvl5/fp_p318233.c | 5491 ----------------- src/gf/ref/lvl5/include/fp.h | 76 - src/gf/ref/lvl5/include/fp2.h | 29 - src/gf/ref/lvl5/test/CMakeLists.txt | 10 +- src/gf/ref/lvl5/test/test_extras.c | 74 - src/gf/ref/lvl5/test/test_extras.h | 25 - src/gf/ref/lvl5/test/test_fp.c | 296 - src/gf/ref/lvl5/test/test_fp2.c | 307 - src/gf/ref/lvlx.cmake | 13 + src/gf/ref/lvlx/fp.c | 15 + src/gf/ref/lvlx/fp2.c | 328 + src/gf/ref/lvlx_test.cmake | 23 + src/{intbig => hd}/CMakeLists.txt | 0 src/hd/ref/CMakeLists.txt | 3 + src/hd/ref/include/hd.h | 435 ++ src/hd/ref/lvl1/CMakeLists.txt | 1 + src/hd/ref/lvl3/CMakeLists.txt | 1 + src/hd/ref/lvl5/CMakeLists.txt | 1 + src/hd/ref/lvlx.cmake | 11 + src/hd/ref/lvlx/hd.c | 93 + src/hd/ref/lvlx/theta_isogenies.c | 1283 ++++ src/hd/ref/lvlx/theta_isogenies.h | 18 + src/hd/ref/lvlx/theta_structure.c | 78 + src/hd/ref/lvlx/theta_structure.h | 135 + src/id2iso/ref/CMakeLists.txt | 2 +- src/id2iso/ref/id2isox/id2iso.c | 1096 ---- src/id2iso/ref/id2isox/test/id2iso.c | 254 - src/id2iso/ref/id2isox/test/id2ker_even.c | 190 - src/id2iso/ref/id2isox/test/id2ker_odd.c | 189 - src/id2iso/ref/id2isox/test/ker2id.c | 65 - src/id2iso/ref/id2isox/test/test_id2iso.c | 24 - src/id2iso/ref/include/id2iso.h | 349 +- src/id2iso/ref/lvl1/CMakeLists.txt | 11 +- src/id2iso/ref/lvl1/test/CMakeLists.txt | 13 +- src/id2iso/ref/lvl3/CMakeLists.txt | 11 +- src/id2iso/ref/lvl3/test/CMakeLists.txt | 13 +- src/id2iso/ref/lvl5/CMakeLists.txt | 11 +- src/id2iso/ref/lvl5/test/CMakeLists.txt | 13 +- src/id2iso/ref/lvlx.cmake | 12 + src/id2iso/ref/lvlx/dim2id2iso.c | 1172 ++++ src/id2iso/ref/lvlx/id2iso.c | 338 + src/id2iso/ref/lvlx/test/dim2id2iso_tests.h | 30 + .../ref/{id2isox => lvlx}/test/id2iso_tests.h | 13 +- src/id2iso/ref/lvlx/test/ker2id.c | 54 + .../lvlx/test/represent_integer_benchmarks.c | 272 + src/id2iso/ref/lvlx/test/test_dim2id2iso.c | 343 + src/id2iso/ref/lvlx/test/test_id2iso.c | 78 + src/id2iso/ref/lvlx_test.cmake | 18 + src/intbig/ref/generic/CMakeLists.txt | 9 - src/intbig/ref/generic/include/intbig.h | 545 -- src/intbig/ref/generic/intbig.c | 1114 ---- src/intbig/ref/generic/test/CMakeLists.txt | 9 - src/intbig/ref/generic/test/test_intbig.c | 551 -- src/klpt/ref/CMakeLists.txt | 3 - src/klpt/ref/include/klpt.h | 218 - src/klpt/ref/klptx/eichler.c | 735 --- src/klpt/ref/klptx/equiv.c | 249 - src/klpt/ref/klptx/klpt.c | 634 -- src/klpt/ref/klptx/test/eichler.c | 335 - src/klpt/ref/klptx/test/equiv.c | 159 - src/klpt/ref/klptx/test/klpt.c | 272 - src/klpt/ref/klptx/test/klpt_tests.h | 41 - src/klpt/ref/klptx/test/test_klpt.c | 23 - src/klpt/ref/klptx/test/tools.c | 514 -- src/klpt/ref/klptx/tools.c | 730 --- src/klpt/ref/klptx/tools.h | 168 - src/klpt/ref/lvl1/CMakeLists.txt | 12 - src/klpt/ref/lvl1/test/CMakeLists.txt | 12 - src/klpt/ref/lvl3/CMakeLists.txt | 12 - src/klpt/ref/lvl3/test/CMakeLists.txt | 12 - src/klpt/ref/lvl5/CMakeLists.txt | 12 - src/klpt/ref/lvl5/test/CMakeLists.txt | 12 - src/mini-gmp/mini-gmp-extra.c | 73 + src/mini-gmp/mini-gmp-extra.h | 19 + src/mini-gmp/mini-gmp.c | 4671 ++++++++++++++ src/mini-gmp/mini-gmp.h | 311 + src/{klpt => mp}/CMakeLists.txt | 0 src/{intbig => mp}/ref/CMakeLists.txt | 0 src/mp/ref/generic/CMakeLists.txt | 7 + src/mp/ref/generic/include/mp.h | 88 + src/mp/ref/generic/mp.c | 357 ++ src/nistapi/lvl1/api.c | 15 +- src/nistapi/lvl1/api.h | 15 +- src/nistapi/lvl3/api.c | 14 +- src/nistapi/lvl3/api.h | 15 +- src/nistapi/lvl5/api.c | 14 +- src/nistapi/lvl5/api.h | 15 +- src/precomp/ref/lvl1/CMakeLists.txt | 50 +- src/precomp/ref/lvl1/e0_basis.c | 55 + src/precomp/ref/lvl1/ec_params.c | 4 + src/precomp/ref/lvl1/endomorphism_action.c | 3382 +++++++++- .../ref/lvl1/hd_splitting_transforms.c | 143 + src/precomp/ref/lvl1/include/e0_basis.h | 3 + src/precomp/ref/lvl1/include/ec_params.h | 52 +- src/precomp/ref/lvl1/include/encoded_sizes.h | 17 +- .../ref/lvl1/include/endomorphism_action.h | 46 +- src/precomp/ref/lvl1/include/fp_constants.h | 15 +- .../lvl1/include/hd_splitting_transforms.h | 18 + src/precomp/ref/lvl1/include/klpt_constants.h | 27 - .../ref/lvl1/include/quaternion_constants.h | 6 + .../ref/lvl1/include/quaternion_data.h | 15 +- .../ref/lvl1/include/torsion_constants.h | 28 +- src/precomp/ref/lvl1/klpt_constants.c | 14 - src/precomp/ref/lvl1/quaternion_data.c | 3186 +++++++++- src/precomp/ref/lvl1/sqisign_parameters.txt | 4 +- src/precomp/ref/lvl1/torsion_constants.c | 101 +- src/precomp/ref/lvl3/CMakeLists.txt | 50 +- src/precomp/ref/lvl3/e0_basis.c | 55 + src/precomp/ref/lvl3/ec_params.c | 4 + src/precomp/ref/lvl3/endomorphism_action.c | 3858 +++++++++++- .../ref/lvl3/hd_splitting_transforms.c | 143 + src/precomp/ref/lvl3/include/e0_basis.h | 3 + src/precomp/ref/lvl3/include/ec_params.h | 69 +- src/precomp/ref/lvl3/include/encoded_sizes.h | 17 +- .../ref/lvl3/include/endomorphism_action.h | 46 +- src/precomp/ref/lvl3/include/fp_constants.h | 15 +- .../lvl3/include/hd_splitting_transforms.h | 18 + src/precomp/ref/lvl3/include/klpt_constants.h | 27 - .../ref/lvl3/include/quaternion_constants.h | 6 + .../ref/lvl3/include/quaternion_data.h | 13 +- .../ref/lvl3/include/torsion_constants.h | 28 +- src/precomp/ref/lvl3/klpt_constants.c | 14 - src/precomp/ref/lvl3/quaternion_data.c | 3636 ++++++++++- src/precomp/ref/lvl3/sqisign_parameters.txt | 4 +- src/precomp/ref/lvl3/torsion_constants.c | 101 +- src/precomp/ref/lvl5/CMakeLists.txt | 50 +- src/precomp/ref/lvl5/e0_basis.c | 55 + src/precomp/ref/lvl5/ec_params.c | 4 + src/precomp/ref/lvl5/endomorphism_action.c | 3382 +++++++++- .../ref/lvl5/hd_splitting_transforms.c | 143 + src/precomp/ref/lvl5/include/e0_basis.h | 3 + src/precomp/ref/lvl5/include/ec_params.h | 76 +- src/precomp/ref/lvl5/include/encoded_sizes.h | 17 +- .../ref/lvl5/include/endomorphism_action.h | 46 +- src/precomp/ref/lvl5/include/fp_constants.h | 17 +- .../lvl5/include/hd_splitting_transforms.h | 18 + src/precomp/ref/lvl5/include/klpt_constants.h | 27 - .../ref/lvl5/include/quaternion_constants.h | 6 + .../ref/lvl5/include/quaternion_data.h | 15 +- .../ref/lvl5/include/torsion_constants.h | 28 +- src/precomp/ref/lvl5/klpt_constants.c | 14 - src/precomp/ref/lvl5/quaternion_data.c | 3186 +++++++++- src/precomp/ref/lvl5/sqisign_parameters.txt | 4 +- src/precomp/ref/lvl5/torsion_constants.c | 101 +- src/precomp/ref/lvlx.cmake | 40 + src/protocols/ref/CMakeLists.txt | 3 - src/protocols/ref/include/protocols.h | 269 - src/protocols/ref/lvl1/CMakeLists.txt | 13 - src/protocols/ref/lvl1/test/CMakeLists.txt | 13 - src/protocols/ref/lvl3/CMakeLists.txt | 13 - src/protocols/ref/lvl3/test/CMakeLists.txt | 13 - src/protocols/ref/lvl5/CMakeLists.txt | 13 - src/protocols/ref/lvl5/test/CMakeLists.txt | 13 - src/protocols/ref/protocolsx/encode.c | 467 -- src/protocols/ref/protocolsx/keygen.c | 238 - src/protocols/ref/protocolsx/sign.c | 762 --- src/protocols/ref/protocolsx/test/challenge.c | 83 - .../ref/protocolsx/test/commitment.c | 56 - src/protocols/ref/protocolsx/test/encode.c | 104 - src/protocols/ref/protocolsx/test/keygen.c | 32 - .../ref/protocolsx/test/test_protocols.c | 88 - .../ref/protocolsx/test/test_protocols.h | 21 - src/protocols/ref/protocolsx/test/verif.c | 153 - src/protocols/ref/protocolsx/verif.c | 236 - src/quaternion/ref/generic/CMakeLists.txt | 19 +- src/quaternion/ref/generic/algebra.c | 489 +- src/quaternion/ref/generic/dim2.c | 593 +- src/quaternion/ref/generic/dim4.c | 994 +-- src/quaternion/ref/generic/finit.c | 180 +- src/quaternion/ref/generic/hnf/hnf.c | 210 + src/quaternion/ref/generic/hnf/hnf_internal.c | 182 + src/quaternion/ref/generic/hnf/hnf_tests.c | 1019 +++ src/quaternion/ref/generic/hnf/ibz_division.c | 12 + src/quaternion/ref/generic/ideal.c | 598 +- src/quaternion/ref/generic/include/intbig.h | 303 + .../ref/generic/include/quaternion.h | 970 ++- src/quaternion/ref/generic/intbig.c | 791 +++ src/quaternion/ref/generic/integers.c | 383 +- src/quaternion/ref/generic/internal.h | 740 --- .../generic/internal_quaternion_headers/dpe.h | 743 +++ .../hnf_internal.h | 94 + .../intbig_internal.h | 123 + .../internal_quaternion_headers/internal.h | 812 +++ .../lll_internals.h | 238 + .../quaternion_tests.h | 349 ++ src/quaternion/ref/generic/lat_ball.c | 139 + src/quaternion/ref/generic/lattice.c | 687 +-- src/quaternion/ref/generic/lll.c | 366 -- src/quaternion/ref/generic/lll/l2.c | 190 + .../ref/generic/lll/lll_applications.c | 127 + .../ref/generic/lll/lll_benchmarks.c | 377 ++ src/quaternion/ref/generic/lll/lll_tests.c | 794 +++ .../ref/generic/lll/lll_verification.c | 174 + src/quaternion/ref/generic/lll/rationals.c | 233 + src/quaternion/ref/generic/matkermod.c | 421 -- src/quaternion/ref/generic/normeq.c | 369 ++ src/quaternion/ref/generic/printer.c | 248 +- .../ref/generic/test/CMakeLists.txt | 31 +- src/quaternion/ref/generic/test/algebra.c | 1616 +++-- src/quaternion/ref/generic/test/dim2.c | 1101 +--- src/quaternion/ref/generic/test/dim4.c | 2099 +++---- src/quaternion/ref/generic/test/finit.c | 298 +- src/quaternion/ref/generic/test/ideal.c | 1231 ++-- src/quaternion/ref/generic/test/intbig.c | 977 +++ src/quaternion/ref/generic/test/integers.c | 603 +- src/quaternion/ref/generic/test/lat_ball.c | 266 + src/quaternion/ref/generic/test/lattice.c | 1179 ++-- src/quaternion/ref/generic/test/matkermod.c | 218 - src/quaternion/ref/generic/test/mini-gmp.c | 211 + src/quaternion/ref/generic/test/normeq.c | 384 ++ .../ref/generic/test/quaternion_tests.h | 188 - .../generic/test/random_input_generation.c | 109 + src/quaternion/ref/generic/test/randomized.c | 805 +-- .../ref/generic/test/test_quaternions.c | 58 +- src/{protocols => signature}/CMakeLists.txt | 0 src/signature/ref/CMakeLists.txt | 3 + src/signature/ref/include/signature.h | 97 + src/signature/ref/lvl1/CMakeLists.txt | 1 + src/signature/ref/lvl1/test/CMakeLists.txt | 1 + src/signature/ref/lvl3/CMakeLists.txt | 1 + src/signature/ref/lvl3/test/CMakeLists.txt | 1 + src/signature/ref/lvl5/CMakeLists.txt | 1 + src/signature/ref/lvl5/test/CMakeLists.txt | 1 + src/signature/ref/lvlx.cmake | 13 + src/signature/ref/lvlx/encode_signature.c | 208 + src/signature/ref/lvlx/keygen.c | 64 + src/signature/ref/lvlx/sign.c | 634 ++ src/signature/ref/lvlx/test/bench_signature.c | 140 + src/signature/ref/lvlx/test/test_signature.c | 102 + .../ref/lvlx/test/test_threadsafety.c | 125 + src/signature/ref/lvlx_test.cmake | 23 + src/sqisign.c | 119 +- src/verification/CMakeLists.txt | 1 + src/verification/ref/CMakeLists.txt | 3 + src/verification/ref/include/verification.h | 123 + src/verification/ref/lvl1/CMakeLists.txt | 1 + src/verification/ref/lvl3/CMakeLists.txt | 1 + src/verification/ref/lvl5/CMakeLists.txt | 1 + src/verification/ref/lvlx.cmake | 11 + src/verification/ref/lvlx/common.c | 88 + .../ref/lvlx/encode_verification.c | 220 + src/verification/ref/lvlx/verify.c | 309 + test/CMakeLists.txt | 23 +- test/bench.c | 135 - test/test_kat.c | 43 +- test/test_sqisign.c | 107 +- test/test_sqisign_prof.c | 102 - 481 files changed, 80785 insertions(+), 55963 deletions(-) delete mode 100644 .astylerc create mode 100644 .clang-format create mode 100644 .cmake/32bit.cmake create mode 100644 .cmake/bm.cmake delete mode 100644 .dir-locals.el create mode 100644 .github/workflows/checks-daily.yml create mode 100644 .github/workflows/daily.yml create mode 100644 .github/workflows/daily_trigger.yml create mode 100644 .github/workflows/kat.yml create mode 100644 .github/workflows/s390-daily.yml create mode 100644 .pre-commit-config.yaml create mode 100644 COPYING.LGPL delete mode 100644 KAT/PQCsignKAT_1138_lvl3.rsp delete mode 100644 KAT/PQCsignKAT_1509_lvl5.rsp rename KAT/{PQCsignKAT_1138_lvl3.req => PQCsignKAT_353_SQIsign_lvl1.req} (100%) create mode 100644 KAT/PQCsignKAT_353_SQIsign_lvl1.rsp rename KAT/{PQCsignKAT_1509_lvl5.req => PQCsignKAT_529_SQIsign_lvl3.req} (100%) create mode 100644 KAT/PQCsignKAT_529_SQIsign_lvl3.rsp rename KAT/{PQCsignKAT_782_lvl1.req => PQCsignKAT_701_SQIsign_lvl5.req} (100%) create mode 100644 KAT/PQCsignKAT_701_SQIsign_lvl5.rsp delete mode 100644 KAT/PQCsignKAT_782_lvl1.rsp create mode 100644 apps/PQCgenKAT_sign_pqm4.c create mode 100644 apps/benchmark.c create mode 100644 apps/fuzz_sign.c create mode 100644 apps/fuzz_verify.c create mode 100644 include/sqisign_namespace.h create mode 100644 scripts/Namespace.scala delete mode 100644 scripts/cformat.py create mode 100755 scripts/check_namespace.sh create mode 100755 scripts/gen_kat_files.sh create mode 100755 scripts/gen_pqm4_sources.sh delete mode 100644 scripts/parameters.py create mode 100644 scripts/precomp/cformat.py create mode 100755 scripts/precomp/ec_params.sage create mode 100644 scripts/precomp/maxorders.py create mode 100644 scripts/precomp/parameters.py create mode 100755 scripts/precomp/precompute_E0_basis.sage create mode 100755 scripts/precomp/precompute_endomorphism_action.sage create mode 100755 scripts/precomp/precompute_hd_splitting.sage create mode 100755 scripts/precomp/precompute_quaternion_constants.sage create mode 100755 scripts/precomp/precompute_quaternion_data.sage create mode 100755 scripts/precomp/precompute_sizes.sage create mode 100755 scripts/precomp/precompute_torsion_constants.sage create mode 100644 scripts/precomp/torsion_basis.py delete mode 100755 scripts/precompute_endomorphism_action.sage delete mode 100755 scripts/precompute_klpt_constants.sage delete mode 100755 scripts/precompute_quaternion_data.sage delete mode 100755 scripts/precompute_sizes.sage delete mode 100755 scripts/precompute_torsion_constants.sage create mode 100644 src/common/arm64crypto/CMakeLists.txt create mode 100644 src/common/arm64crypto/include/randombytes_arm64crypto.h create mode 100644 src/common/arm64crypto/randombytes_ctrdrbg.c create mode 100644 src/common/arm64crypto/randombytes_ctrdrbg_inline_asm.c create mode 100644 src/common/broadwell/CMakeLists.txt create mode 100644 src/common/broadwell/aes_ni.c create mode 100644 src/common/broadwell/ctr_drbg.c create mode 100644 src/common/broadwell/include/aes_ni.h create mode 100644 src/common/broadwell/include/ctr_drbg.h create mode 100644 src/common/broadwell/include/defs.h create mode 100644 src/common/broadwell/randombytes_ctrdrbg_aesni.c create mode 100644 src/common/broadwell/vaes256_key_expansion.S delete mode 100644 src/common/generic/include/aes.h create mode 100644 src/common/generic/include/bench_macos.h create mode 100644 src/common/generic/include/bench_test_arguments.h create mode 100644 src/common/generic/include/tools.h delete mode 100644 src/common/generic/randombytes_ctrdrbg.c create mode 100644 src/common/generic/test/bench_ctrdrbg.c create mode 100644 src/common/generic/test/test_ctrdrbg.c create mode 100644 src/common/generic/tools.c create mode 100644 src/common/ref/CMakeLists.txt rename src/common/{generic => ref}/aes_c.c (72%) create mode 100644 src/common/ref/include/aes.h create mode 100644 src/common/ref/randombytes_ctrdrbg.c mode change 100755 => 100644 src/ec/ref/CMakeLists.txt delete mode 100644 src/ec/ref/ecx/basis.c delete mode 100755 src/ec/ref/ecx/ec.c delete mode 100644 src/ec/ref/ecx/fp2-test.c delete mode 100644 src/ec/ref/ecx/isog_chains.c delete mode 100644 src/ec/ref/ecx/kps.c delete mode 100644 src/ec/ref/ecx/poly-mul.c delete mode 100644 src/ec/ref/ecx/poly-redc.c delete mode 100755 src/ec/ref/ecx/tedwards.c delete mode 100644 src/ec/ref/ecx/test/ec-test.c delete mode 100644 src/ec/ref/ecx/test/fp2-test.c delete mode 100644 src/ec/ref/ecx/test/isog-test.c delete mode 100644 src/ec/ref/ecx/test/mont-test.c delete mode 100644 src/ec/ref/ecx/test/poly-mul-test.c delete mode 100644 src/ec/ref/ecx/test/poly-redc-test.c delete mode 100755 src/ec/ref/ecx/test/test_extras.c delete mode 100755 src/ec/ref/ecx/test/test_extras.h delete mode 100644 src/ec/ref/ecx/test/velu-test.c delete mode 100644 src/ec/ref/ecx/xeval.c delete mode 100644 src/ec/ref/ecx/xisog.c create mode 100644 src/ec/ref/include/biextension.h delete mode 100644 src/ec/ref/include/curve_extras.h delete mode 100644 src/ec/ref/include/poly.h delete mode 100644 src/ec/ref/include/sdacs.h delete mode 100755 src/ec/ref/include/tedwards.h delete mode 100644 src/ec/ref/lvl1/test/ec-tests.h delete mode 100644 src/ec/ref/lvl1/test/test-basis.h delete mode 100644 src/ec/ref/lvl3/test/ec-tests.h delete mode 100644 src/ec/ref/lvl3/test/test-basis.h delete mode 100644 src/ec/ref/lvl5/test/ec-tests.h delete mode 100644 src/ec/ref/lvl5/test/test-basis.h create mode 100644 src/ec/ref/lvlx.cmake create mode 100644 src/ec/ref/lvlx/basis.c create mode 100644 src/ec/ref/lvlx/biextension.c create mode 100644 src/ec/ref/lvlx/ec.c create mode 100644 src/ec/ref/lvlx/ec_jac.c create mode 100644 src/ec/ref/lvlx/isog_chains.c create mode 100644 src/ec/ref/lvlx/test/basis-gen-bench.c create mode 100644 src/ec/ref/lvlx/test/basis-gen-test.c create mode 100644 src/ec/ref/lvlx/test/biextension-bench.c create mode 100644 src/ec/ref/lvlx/test/biextension-test.c create mode 100644 src/ec/ref/lvlx/test/curve-arith-bench.c create mode 100644 src/ec/ref/lvlx/test/curve-arith-test.c create mode 100644 src/ec/ref/lvlx/test/test_extras.c create mode 100644 src/ec/ref/lvlx/test/test_extras.h create mode 100644 src/ec/ref/lvlx/xeval.c create mode 100644 src/ec/ref/lvlx/xisog.c create mode 100644 src/ec/ref/lvlx_test.cmake create mode 100644 src/gf/broadwell/include/asm_preamble.h create mode 100644 src/gf/broadwell/include/fp2x.h delete mode 100644 src/gf/broadwell/lvl1/Makefile delete mode 100644 src/gf/broadwell/lvl1/fp2.c mode change 100644 => 100755 src/gf/broadwell/lvl1/fp_asm.S create mode 100644 src/gf/broadwell/lvl1/gf5248.c create mode 100644 src/gf/broadwell/lvl1/include/gf5248.h delete mode 100644 src/gf/broadwell/lvl1/test/test_extras.c delete mode 100644 src/gf/broadwell/lvl1/test/test_extras.h delete mode 100644 src/gf/broadwell/lvl1/test/test_fp.c delete mode 100644 src/gf/broadwell/lvl1/test/test_fp2.c create mode 100644 src/gf/broadwell/lvl3/CMakeLists.txt create mode 100644 src/gf/broadwell/lvl3/fp.c create mode 100755 src/gf/broadwell/lvl3/fp_asm.S create mode 100644 src/gf/broadwell/lvl3/gf65376.c create mode 100644 src/gf/broadwell/lvl3/include/fp.h create mode 100644 src/gf/broadwell/lvl3/include/fp2.h create mode 100644 src/gf/broadwell/lvl3/include/gf65376.h create mode 100644 src/gf/broadwell/lvl3/test/CMakeLists.txt create mode 100644 src/gf/broadwell/lvl5/CMakeLists.txt create mode 100644 src/gf/broadwell/lvl5/fp.c create mode 100755 src/gf/broadwell/lvl5/fp_asm.S create mode 100644 src/gf/broadwell/lvl5/gf27500.c create mode 100644 src/gf/broadwell/lvl5/include/fp.h create mode 100644 src/gf/broadwell/lvl5/include/fp2.h create mode 100644 src/gf/broadwell/lvl5/include/gf27500.h create mode 100644 src/gf/broadwell/lvl5/test/CMakeLists.txt create mode 100644 src/gf/broadwell/lvlx.cmake create mode 100644 src/gf/broadwell/lvlx/fp2.c create mode 100644 src/gf/broadwell/lvlx_test.cmake create mode 100644 src/gf/gfx/test/bench_fp.c create mode 100644 src/gf/gfx/test/bench_fp2.c create mode 100644 src/gf/gfx/test/test_fp.c create mode 100644 src/gf/gfx/test/test_fp2.c create mode 100644 src/gf/gfx/test/test_utils.c create mode 100644 src/gf/gfx/test/test_utils.h create mode 100644 src/gf/ref/include/fp.h create mode 100644 src/gf/ref/include/fp2.h delete mode 100755 src/gf/ref/lvl1/Makefile delete mode 100755 src/gf/ref/lvl1/fp.c delete mode 100755 src/gf/ref/lvl1/fp2.c delete mode 100755 src/gf/ref/lvl1/fp_p1913.c delete mode 100644 src/gf/ref/lvl1/fp_p3923.c create mode 100644 src/gf/ref/lvl1/fp_p5248_32.c create mode 100644 src/gf/ref/lvl1/fp_p5248_64.c delete mode 100644 src/gf/ref/lvl1/include/fp.h delete mode 100755 src/gf/ref/lvl1/include/fp2.h delete mode 100755 src/gf/ref/lvl1/test/test_extras.c delete mode 100755 src/gf/ref/lvl1/test/test_extras.h delete mode 100755 src/gf/ref/lvl1/test/test_fp.c delete mode 100755 src/gf/ref/lvl1/test/test_fp2.c delete mode 100644 src/gf/ref/lvl3/Makefile delete mode 100644 src/gf/ref/lvl3/fp.c delete mode 100644 src/gf/ref/lvl3/fp2.c delete mode 100644 src/gf/ref/lvl3/fp_p47441.c create mode 100644 src/gf/ref/lvl3/fp_p65376_32.c create mode 100644 src/gf/ref/lvl3/fp_p65376_64.c delete mode 100644 src/gf/ref/lvl3/include/fp.h delete mode 100644 src/gf/ref/lvl3/include/fp2.h delete mode 100644 src/gf/ref/lvl3/test/test_extras.c delete mode 100644 src/gf/ref/lvl3/test/test_extras.h delete mode 100644 src/gf/ref/lvl3/test/test_fp.c delete mode 100644 src/gf/ref/lvl3/test/test_fp2.c delete mode 100644 src/gf/ref/lvl5/Makefile delete mode 100644 src/gf/ref/lvl5/fp.c delete mode 100644 src/gf/ref/lvl5/fp2.c create mode 100644 src/gf/ref/lvl5/fp_p27500_32.c create mode 100644 src/gf/ref/lvl5/fp_p27500_64.c delete mode 100644 src/gf/ref/lvl5/fp_p318233.c delete mode 100644 src/gf/ref/lvl5/include/fp.h delete mode 100644 src/gf/ref/lvl5/include/fp2.h delete mode 100644 src/gf/ref/lvl5/test/test_extras.c delete mode 100644 src/gf/ref/lvl5/test/test_extras.h delete mode 100644 src/gf/ref/lvl5/test/test_fp.c delete mode 100644 src/gf/ref/lvl5/test/test_fp2.c create mode 100644 src/gf/ref/lvlx.cmake create mode 100644 src/gf/ref/lvlx/fp.c create mode 100644 src/gf/ref/lvlx/fp2.c create mode 100644 src/gf/ref/lvlx_test.cmake rename src/{intbig => hd}/CMakeLists.txt (100%) create mode 100644 src/hd/ref/CMakeLists.txt create mode 100644 src/hd/ref/include/hd.h create mode 100644 src/hd/ref/lvl1/CMakeLists.txt create mode 100644 src/hd/ref/lvl3/CMakeLists.txt create mode 100644 src/hd/ref/lvl5/CMakeLists.txt create mode 100644 src/hd/ref/lvlx.cmake create mode 100644 src/hd/ref/lvlx/hd.c create mode 100644 src/hd/ref/lvlx/theta_isogenies.c create mode 100644 src/hd/ref/lvlx/theta_isogenies.h create mode 100644 src/hd/ref/lvlx/theta_structure.c create mode 100644 src/hd/ref/lvlx/theta_structure.h delete mode 100644 src/id2iso/ref/id2isox/id2iso.c delete mode 100644 src/id2iso/ref/id2isox/test/id2iso.c delete mode 100644 src/id2iso/ref/id2isox/test/id2ker_even.c delete mode 100644 src/id2iso/ref/id2isox/test/id2ker_odd.c delete mode 100644 src/id2iso/ref/id2isox/test/ker2id.c delete mode 100644 src/id2iso/ref/id2isox/test/test_id2iso.c create mode 100644 src/id2iso/ref/lvlx.cmake create mode 100644 src/id2iso/ref/lvlx/dim2id2iso.c create mode 100644 src/id2iso/ref/lvlx/id2iso.c create mode 100644 src/id2iso/ref/lvlx/test/dim2id2iso_tests.h rename src/id2iso/ref/{id2isox => lvlx}/test/id2iso_tests.h (68%) create mode 100644 src/id2iso/ref/lvlx/test/ker2id.c create mode 100644 src/id2iso/ref/lvlx/test/represent_integer_benchmarks.c create mode 100644 src/id2iso/ref/lvlx/test/test_dim2id2iso.c create mode 100644 src/id2iso/ref/lvlx/test/test_id2iso.c create mode 100644 src/id2iso/ref/lvlx_test.cmake delete mode 100644 src/intbig/ref/generic/CMakeLists.txt delete mode 100644 src/intbig/ref/generic/include/intbig.h delete mode 100644 src/intbig/ref/generic/intbig.c delete mode 100644 src/intbig/ref/generic/test/CMakeLists.txt delete mode 100644 src/intbig/ref/generic/test/test_intbig.c delete mode 100644 src/klpt/ref/CMakeLists.txt delete mode 100644 src/klpt/ref/include/klpt.h delete mode 100644 src/klpt/ref/klptx/eichler.c delete mode 100644 src/klpt/ref/klptx/equiv.c delete mode 100644 src/klpt/ref/klptx/klpt.c delete mode 100644 src/klpt/ref/klptx/test/eichler.c delete mode 100644 src/klpt/ref/klptx/test/equiv.c delete mode 100644 src/klpt/ref/klptx/test/klpt.c delete mode 100644 src/klpt/ref/klptx/test/klpt_tests.h delete mode 100644 src/klpt/ref/klptx/test/test_klpt.c delete mode 100644 src/klpt/ref/klptx/test/tools.c delete mode 100644 src/klpt/ref/klptx/tools.c delete mode 100644 src/klpt/ref/klptx/tools.h delete mode 100644 src/klpt/ref/lvl1/CMakeLists.txt delete mode 100644 src/klpt/ref/lvl1/test/CMakeLists.txt delete mode 100644 src/klpt/ref/lvl3/CMakeLists.txt delete mode 100644 src/klpt/ref/lvl3/test/CMakeLists.txt delete mode 100644 src/klpt/ref/lvl5/CMakeLists.txt delete mode 100644 src/klpt/ref/lvl5/test/CMakeLists.txt create mode 100644 src/mini-gmp/mini-gmp-extra.c create mode 100644 src/mini-gmp/mini-gmp-extra.h create mode 100644 src/mini-gmp/mini-gmp.c create mode 100644 src/mini-gmp/mini-gmp.h rename src/{klpt => mp}/CMakeLists.txt (100%) rename src/{intbig => mp}/ref/CMakeLists.txt (100%) create mode 100644 src/mp/ref/generic/CMakeLists.txt create mode 100644 src/mp/ref/generic/include/mp.h create mode 100644 src/mp/ref/generic/mp.c create mode 100644 src/precomp/ref/lvl1/e0_basis.c create mode 100644 src/precomp/ref/lvl1/ec_params.c create mode 100644 src/precomp/ref/lvl1/hd_splitting_transforms.c create mode 100644 src/precomp/ref/lvl1/include/e0_basis.h create mode 100644 src/precomp/ref/lvl1/include/hd_splitting_transforms.h delete mode 100644 src/precomp/ref/lvl1/include/klpt_constants.h create mode 100644 src/precomp/ref/lvl1/include/quaternion_constants.h delete mode 100644 src/precomp/ref/lvl1/klpt_constants.c create mode 100644 src/precomp/ref/lvl3/e0_basis.c create mode 100644 src/precomp/ref/lvl3/ec_params.c create mode 100644 src/precomp/ref/lvl3/hd_splitting_transforms.c create mode 100644 src/precomp/ref/lvl3/include/e0_basis.h create mode 100644 src/precomp/ref/lvl3/include/hd_splitting_transforms.h delete mode 100644 src/precomp/ref/lvl3/include/klpt_constants.h create mode 100644 src/precomp/ref/lvl3/include/quaternion_constants.h delete mode 100644 src/precomp/ref/lvl3/klpt_constants.c create mode 100644 src/precomp/ref/lvl5/e0_basis.c create mode 100644 src/precomp/ref/lvl5/ec_params.c create mode 100644 src/precomp/ref/lvl5/hd_splitting_transforms.c create mode 100644 src/precomp/ref/lvl5/include/e0_basis.h create mode 100644 src/precomp/ref/lvl5/include/hd_splitting_transforms.h delete mode 100644 src/precomp/ref/lvl5/include/klpt_constants.h create mode 100644 src/precomp/ref/lvl5/include/quaternion_constants.h delete mode 100644 src/precomp/ref/lvl5/klpt_constants.c create mode 100644 src/precomp/ref/lvlx.cmake delete mode 100644 src/protocols/ref/CMakeLists.txt delete mode 100644 src/protocols/ref/include/protocols.h delete mode 100644 src/protocols/ref/lvl1/CMakeLists.txt delete mode 100644 src/protocols/ref/lvl1/test/CMakeLists.txt delete mode 100644 src/protocols/ref/lvl3/CMakeLists.txt delete mode 100644 src/protocols/ref/lvl3/test/CMakeLists.txt delete mode 100644 src/protocols/ref/lvl5/CMakeLists.txt delete mode 100644 src/protocols/ref/lvl5/test/CMakeLists.txt delete mode 100644 src/protocols/ref/protocolsx/encode.c delete mode 100644 src/protocols/ref/protocolsx/keygen.c delete mode 100644 src/protocols/ref/protocolsx/sign.c delete mode 100644 src/protocols/ref/protocolsx/test/challenge.c delete mode 100644 src/protocols/ref/protocolsx/test/commitment.c delete mode 100644 src/protocols/ref/protocolsx/test/encode.c delete mode 100644 src/protocols/ref/protocolsx/test/keygen.c delete mode 100644 src/protocols/ref/protocolsx/test/test_protocols.c delete mode 100644 src/protocols/ref/protocolsx/test/test_protocols.h delete mode 100644 src/protocols/ref/protocolsx/test/verif.c delete mode 100644 src/protocols/ref/protocolsx/verif.c create mode 100644 src/quaternion/ref/generic/hnf/hnf.c create mode 100644 src/quaternion/ref/generic/hnf/hnf_internal.c create mode 100644 src/quaternion/ref/generic/hnf/hnf_tests.c create mode 100644 src/quaternion/ref/generic/hnf/ibz_division.c create mode 100644 src/quaternion/ref/generic/include/intbig.h create mode 100644 src/quaternion/ref/generic/intbig.c delete mode 100644 src/quaternion/ref/generic/internal.h create mode 100644 src/quaternion/ref/generic/internal_quaternion_headers/dpe.h create mode 100644 src/quaternion/ref/generic/internal_quaternion_headers/hnf_internal.h create mode 100644 src/quaternion/ref/generic/internal_quaternion_headers/intbig_internal.h create mode 100644 src/quaternion/ref/generic/internal_quaternion_headers/internal.h create mode 100644 src/quaternion/ref/generic/internal_quaternion_headers/lll_internals.h create mode 100644 src/quaternion/ref/generic/internal_quaternion_headers/quaternion_tests.h create mode 100644 src/quaternion/ref/generic/lat_ball.c delete mode 100644 src/quaternion/ref/generic/lll.c create mode 100644 src/quaternion/ref/generic/lll/l2.c create mode 100644 src/quaternion/ref/generic/lll/lll_applications.c create mode 100644 src/quaternion/ref/generic/lll/lll_benchmarks.c create mode 100644 src/quaternion/ref/generic/lll/lll_tests.c create mode 100644 src/quaternion/ref/generic/lll/lll_verification.c create mode 100644 src/quaternion/ref/generic/lll/rationals.c delete mode 100644 src/quaternion/ref/generic/matkermod.c create mode 100644 src/quaternion/ref/generic/normeq.c create mode 100644 src/quaternion/ref/generic/test/intbig.c create mode 100644 src/quaternion/ref/generic/test/lat_ball.c delete mode 100644 src/quaternion/ref/generic/test/matkermod.c create mode 100644 src/quaternion/ref/generic/test/mini-gmp.c create mode 100644 src/quaternion/ref/generic/test/normeq.c delete mode 100644 src/quaternion/ref/generic/test/quaternion_tests.h create mode 100644 src/quaternion/ref/generic/test/random_input_generation.c rename src/{protocols => signature}/CMakeLists.txt (100%) create mode 100644 src/signature/ref/CMakeLists.txt create mode 100644 src/signature/ref/include/signature.h create mode 100644 src/signature/ref/lvl1/CMakeLists.txt create mode 100644 src/signature/ref/lvl1/test/CMakeLists.txt create mode 100644 src/signature/ref/lvl3/CMakeLists.txt create mode 100644 src/signature/ref/lvl3/test/CMakeLists.txt create mode 100644 src/signature/ref/lvl5/CMakeLists.txt create mode 100644 src/signature/ref/lvl5/test/CMakeLists.txt create mode 100644 src/signature/ref/lvlx.cmake create mode 100644 src/signature/ref/lvlx/encode_signature.c create mode 100644 src/signature/ref/lvlx/keygen.c create mode 100644 src/signature/ref/lvlx/sign.c create mode 100644 src/signature/ref/lvlx/test/bench_signature.c create mode 100644 src/signature/ref/lvlx/test/test_signature.c create mode 100644 src/signature/ref/lvlx/test/test_threadsafety.c create mode 100644 src/signature/ref/lvlx_test.cmake create mode 100644 src/verification/CMakeLists.txt create mode 100644 src/verification/ref/CMakeLists.txt create mode 100644 src/verification/ref/include/verification.h create mode 100644 src/verification/ref/lvl1/CMakeLists.txt create mode 100644 src/verification/ref/lvl3/CMakeLists.txt create mode 100644 src/verification/ref/lvl5/CMakeLists.txt create mode 100644 src/verification/ref/lvlx.cmake create mode 100644 src/verification/ref/lvlx/common.c create mode 100644 src/verification/ref/lvlx/encode_verification.c create mode 100644 src/verification/ref/lvlx/verify.c delete mode 100644 test/bench.c delete mode 100644 test/test_sqisign_prof.c diff --git a/.astylerc b/.astylerc deleted file mode 100644 index 23f5919..0000000 --- a/.astylerc +++ /dev/null @@ -1,16 +0,0 @@ -# find include src test -name '*.[ch]' | xargs astyle --options=.astylerc ---style=google ---indent=spaces -#--indent-preproc-define -#--indent-preproc-cond ---pad-oper ---pad-comma ---pad-header -#--unpad-paren ---align-pointer=name ---add-braces ---convert-tabs ---mode=c -# disable backup files ---suffix=none ---lineend=linux diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..1bc78a5 --- /dev/null +++ b/.clang-format @@ -0,0 +1,246 @@ +--- +Language: Cpp +# BasedOnStyle: Mozilla +AccessModifierOffset: -2 +AlignAfterOpenBracket: Align +AlignArrayOfStructures: Right +AlignConsecutiveAssignments: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: true + AlignFunctionPointers: false + PadOperators: true +AlignConsecutiveBitFields: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveDeclarations: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveMacros: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveShortCaseStatements: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCaseColons: false +AlignEscapedNewlines: Right +AlignOperands: Align +AlignTrailingComments: + Kind: Always + OverEmptyLines: 0 +AllowAllArgumentsOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: false +AllowBreakBeforeNoexceptSpecifier: Never +AllowShortBlocksOnASingleLine: Never +AllowShortCaseLabelsOnASingleLine: false +AllowShortCompoundRequirementOnASingleLine: true +AllowShortEnumsOnASingleLine: true +AllowShortFunctionsOnASingleLine: Inline +AllowShortIfStatementsOnASingleLine: Never +AllowShortLambdasOnASingleLine: All +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: TopLevel +AlwaysBreakAfterReturnType: AllDefinitions +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: Yes +AttributeMacros: + - __capability +BinPackArguments: false +BinPackParameters: false +BitFieldColonSpacing: Both +BraceWrapping: + AfterCaseLabel: false + AfterClass: true + AfterControlStatement: Never + AfterEnum: true + AfterExternBlock: true + AfterFunction: true + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: true + AfterUnion: true + BeforeCatch: false + BeforeElse: false + BeforeLambdaBody: false + BeforeWhile: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: false + SplitEmptyNamespace: true +BreakAdjacentStringLiterals: true +BreakAfterAttributes: Leave +BreakAfterJavaFieldAnnotations: false +BreakArrays: true +BreakBeforeBinaryOperators: None +BreakBeforeConceptDeclarations: Always +BreakBeforeBraces: Mozilla +BreakBeforeInlineASMColon: OnlyMultiline +BreakBeforeTernaryOperators: true +BreakConstructorInitializers: BeforeComma +BreakInheritanceList: BeforeComma +BreakStringLiterals: true +ColumnLimit: 120 +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: false +DerivePointerAlignment: false +DisableFormat: false +EmptyLineAfterAccessModifier: Never +EmptyLineBeforeAccessModifier: LogicalBlock +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: false +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IfMacros: + - KJ_IF_MAYBE +IncludeBlocks: Preserve +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + SortPriority: 0 + CaseSensitive: false + - Regex: '^(<|"(gtest|gmock|isl|json)/)' + Priority: 3 + SortPriority: 0 + CaseSensitive: false + - Regex: '.*' + Priority: 1 + SortPriority: 0 + CaseSensitive: false +IncludeIsMainRegex: '(Test)?$' +IncludeIsMainSourceRegex: '' +IndentAccessModifiers: false +IndentCaseBlocks: false +IndentCaseLabels: true +IndentExternBlock: AfterExternBlock +IndentGotoLabels: true +IndentPPDirectives: None +IndentRequiresClause: true +IndentWidth: 4 +IndentWrappedFunctionNames: false +InsertBraces: false +InsertNewlineAtEOF: false +InsertTrailingCommas: None +IntegerLiteralSeparator: + Binary: 0 + BinaryMinDigits: 0 + Decimal: 0 + DecimalMinDigits: 0 + Hex: 0 + HexMinDigits: 0 +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: true +KeepEmptyLinesAtEOF: false +LambdaBodyIndentation: Signature +LineEnding: DeriveLF +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 4 +ObjCBreakBeforeNestedBlockParam: true +ObjCSpaceAfterProperty: true +ObjCSpaceBeforeProtocolList: false +PackConstructorInitializers: BinPack +PenaltyBreakAssignment: 4 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakOpenParenthesis: 0 +PenaltyBreakScopeResolution: 500 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyIndentedWhitespace: 0 +PenaltyReturnTypeOnItsOwnLine: 200 +PointerAlignment: Right +PPIndentWidth: -1 +QualifierAlignment: Leave +ReferenceAlignment: Pointer +ReflowComments: true +RemoveBracesLLVM: false +RemoveParentheses: Leave +RemoveSemicolon: false +RequiresClausePosition: OwnLine +RequiresExpressionIndentation: OuterScope +SeparateDefinitionBlocks: Leave +ShortNamespaceLines: 1 +SkipMacroDefinitionBody: false +SortIncludes: false +SortJavaStaticImport: Before +SortUsingDeclarations: LexicographicNumeric +SpaceAfterCStyleCast: false +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: false +SpaceAroundPointerQualifiers: Default +SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: false +SpaceBeforeCpp11BracedList: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeJsonColon: false +SpaceBeforeParens: ControlStatements +SpaceBeforeParensOptions: + AfterControlStatements: true + AfterForeachMacros: true + AfterFunctionDefinitionName: false + AfterFunctionDeclarationName: false + AfterIfMacros: true + AfterOverloadedOperator: false + AfterPlacementOperator: true + AfterRequiresInClause: false + AfterRequiresInExpression: false + BeforeNonEmptyParentheses: false +SpaceBeforeRangeBasedForLoopColon: true +SpaceBeforeSquareBrackets: false +SpaceInEmptyBlock: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: Never +SpacesInContainerLiterals: true +SpacesInLineCommentPrefix: + Minimum: 1 + Maximum: -1 +SpacesInParens: Never +SpacesInParensOptions: + InCStyleCasts: false + InConditionalStatements: false + InEmptyParentheses: false + Other: false +SpacesInSquareBrackets: false +Standard: Latest +StatementAttributeLikeMacros: + - Q_EMIT +StatementMacros: + - Q_UNUSED + - QT_REQUIRE_VERSION +TabWidth: 8 +UseTab: Never +VerilogBreakBetweenInstancePorts: true +WhitespaceSensitiveMacros: + - BOOST_PP_STRINGIZE + - CF_SWIFT_NAME + - NS_SWIFT_NAME + - PP_STRINGIZE + - STRINGIZE +... + diff --git a/.cmake/32bit.cmake b/.cmake/32bit.cmake new file mode 100644 index 0000000..bd98bdf --- /dev/null +++ b/.cmake/32bit.cmake @@ -0,0 +1,8 @@ +set(CMAKE_SYSTEM_NAME ${CMAKE_HOST_SYSTEM_NAME}) +if(${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES "x86_64") + set(CMAKE_SYSTEM_PROCESSOR i686) +endif() +set(GMP_LIBRARY "BUILD" CACHE STRING "" FORCE) +set(GMP_BUILD_CONFIG_ARGS "ABI=32" CACHE STRING "" FORCE) +set(CMAKE_C_FLAGS "-m32" CACHE STRING "" FORCE) +set(CMAKE_EXE_LINKER_FLAGS "-m32" CACHE STRING "" FORCE) diff --git a/.cmake/bm.cmake b/.cmake/bm.cmake new file mode 100644 index 0000000..5f95ef2 --- /dev/null +++ b/.cmake/bm.cmake @@ -0,0 +1,12 @@ +add_custom_target(bm + COMMAND ${CMAKE_COMMAND} -E echo "Running all benchmarks..." +) + +foreach(bm_bin ${BM_BINS}) + add_custom_command( + TARGET bm + POST_BUILD + COMMAND $ + COMMENT "Running ${bm_bin}" + ) +endforeach() \ No newline at end of file diff --git a/.cmake/flags.cmake b/.cmake/flags.cmake index 2a9cdda..ab450be 100644 --- a/.cmake/flags.cmake +++ b/.cmake/flags.cmake @@ -24,19 +24,29 @@ if(MSVC) endif() else() set(STRICT_OPTIONS_CXX "${STRICT_OPTIONS_CXX} -std=c++14 -O2") - set(STRICT_OPTIONS_CPP "${STRICT_OPTIONS_CPP} -Wall -Wuninitialized -Wno-deprecated-declarations -Wno-missing-field-initializers") - if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug") + set(STRICT_OPTIONS_CPP "${STRICT_OPTIONS_CPP} -Wall -Wuninitialized -Wno-deprecated-declarations -Wno-missing-field-initializers -Wno-unused-function -Wno-missing-braces") + if (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(STRICT_OPTIONS_C "${STRICT_OPTIONS_C} -Og -g") + else() set(STRICT_OPTIONS_C "${STRICT_OPTIONS_C} -O3") endif() - set(STRICT_OPTIONS_C "${STRICT_OPTIONS_C} -std=c99 -Wno-error=strict-prototypes -fvisibility=hidden -funroll-loops -Wno-error=implicit-function-declaration -Wno-error=attributes") + set(STRICT_OPTIONS_C "${STRICT_OPTIONS_C} -std=c11 -Wno-error=strict-prototypes -fvisibility=hidden -funroll-loops -Wno-error=implicit-function-declaration -Wno-error=attributes") if(CMAKE_C_COMPILER_ID MATCHES "Clang") set(STRICT_OPTIONS_CPP "${STRICT_OPTIONS_CPP} -Wno-error=unknown-warning-option -Qunused-arguments -Wno-tautological-compare") - set(STRICT_OPTIONS_CPP "${STRICT_OPTIONS_CPP} -Wno-unused-function -Wno-pass-failed") + set(STRICT_OPTIONS_CPP "${STRICT_OPTIONS_CPP} -Wno-pass-failed") endif() if(ENABLE_STRICT) - set(STRICT_OPTIONS_C "${STRICT_OPTIONS_C} -Werror -Wextra -Wno-unused-parameter -fno-strict-aliasing") + set(STRICT_OPTIONS_C "${STRICT_OPTIONS_C} ${STRICT_OPTIONS_CPP} -Werror -Wextra -Wno-unused-parameter -fno-strict-aliasing") endif() endif() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${STRICT_OPTIONS_C}") -#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${STRICT_OPTIONS_CXX} ${STRICT_OPTIONS_CPP}") \ No newline at end of file + +if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug") + # enable link-time optimization (LTO) + include(CheckIPOSupported) + check_ipo_supported(RESULT result) + if(result) + set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) + endif() +endif() diff --git a/.cmake/gmpconfig.cmake b/.cmake/gmpconfig.cmake index 027a016..34a8e37 100644 --- a/.cmake/gmpconfig.cmake +++ b/.cmake/gmpconfig.cmake @@ -1,5 +1,16 @@ +if (GMP_LIBRARY STREQUAL "SYSTEM") + # use system gmp version + message(STATUS "Using system GMP") -if (ENABLE_GMP_BUILD) + find_library(GMP gmp) + find_path(GMP_INCLUDE gmp.h) + + add_library(GMP UNKNOWN IMPORTED) + set_target_properties(GMP PROPERTIES + IMPORTED_LOCATION ${GMP} + INTERFACE_INCLUDE_DIRECTORIES ${GMP_INCLUDE} + ) +elseif (GMP_LIBRARY STREQUAL "BUILD") # Download and build own libgmp version if (POLICY CMP0135) cmake_policy(SET CMP0135 NEW) @@ -8,29 +19,70 @@ if (ENABLE_GMP_BUILD) option(ENABLE_GMP_STATIC "Option to statically link. Default is dynamic linking" OFF) if (ENABLE_GMP_STATIC) - set(GMP_LIB_SUFFIX ${CMAKE_SHARED_LIBRARY_SUFFIX}) - else() set(GMP_LIB_SUFFIX ${CMAKE_STATIC_LIBRARY_SUFFIX}) + else() + set(GMP_LIB_SUFFIX ${CMAKE_SHARED_LIBRARY_SUFFIX}) endif() - message("${GMP_BUILD_CONFIG_ARGS}") + cmake_host_system_information(RESULT N QUERY NUMBER_OF_PHYSICAL_CORES) + if (N EQUAL 0) + # Choose a "safe" amount + set(N 8) + endif() + set(GMP_PARALLEL_BUILD_ARGS -j${N}) + + message(STATUS "Building GMP with additional options: ${GMP_BUILD_CONFIG_ARGS}") include(ExternalProject) find_program(MAKE_EXE NAMES make gmake nmake) set(libgmp_INSTALL_DIR "${CMAKE_BINARY_DIR}/libgmp") ExternalProject_Add(libgmp_external PREFIX ${libgmp_INSTALL_DIR} - URL https://gmplib.org/download/gmp/gmp-6.2.1.tar.xz - URL_HASH SHA256=fd4829912cddd12f84181c3451cc752be224643e87fac497b69edddadc49b4f2 + URL https://gmplib.org/download/gmp/gmp-6.3.0.tar.xz + URL_HASH SHA256=a3c2b80201b89e68616f4ad30bc66aee4927c3ce50e33929ca819d5c43538898 CONFIGURE_COMMAND ${libgmp_INSTALL_DIR}/src/libgmp_external/configure --prefix=${libgmp_INSTALL_DIR} ${GMP_BUILD_CONFIG_ARGS} - BUILD_COMMAND ${MAKE_EXE} -j8 + BUILD_COMMAND ${MAKE_EXE} ${GMP_PARALLEL_BUILD_ARGS} INSTALL_COMMAND ${MAKE_EXE} install + BUILD_BYPRODUCTS ${libgmp_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}gmp${GMP_LIB_SUFFIX} ) - set(GMP ${libgmp_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}gmp${GMP_LIB_SUFFIX}) - include_directories(${libgmp_INSTALL_DIR}/include) + # Needed to avoid errors about missing directory when creating the GMP target + file(MAKE_DIRECTORY ${libgmp_INSTALL_DIR}/include) + + if(ENABLE_GMP_STATIC) + add_library(GMP STATIC IMPORTED) + set_target_properties(GMP PROPERTIES + IMPORTED_LOCATION ${libgmp_INSTALL_DIR}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}gmp${GMP_LIB_SUFFIX} + INTERFACE_INCLUDE_DIRECTORIES ${libgmp_INSTALL_DIR}/include + ) + else() + add_library(GMP SHARED IMPORTED) + set_target_properties(GMP PROPERTIES + IMPORTED_LOCATION ${libgmp_INSTALL_DIR}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}gmp${GMP_LIB_SUFFIX} + INTERFACE_INCLUDE_DIRECTORIES ${libgmp_INSTALL_DIR}/include + ) + endif() + + add_dependencies(GMP libgmp_external) +elseif (GMP_LIBRARY STREQUAL "MINI") + # Use mini-gmp + message(STATUS "Using mini-GMP") + + include(CheckTypeSize) + + add_library(GMP STATIC + ${PROJECT_SOURCE_DIR}/src/mini-gmp/mini-gmp.c ${PROJECT_SOURCE_DIR}/src/mini-gmp/mini-gmp-extra.c) + target_include_directories(GMP PRIVATE ${PROJECT_SOURCE_DIR}/src/common/generic/include) # for tutil.h + target_include_directories(GMP INTERFACE ${PROJECT_SOURCE_DIR}/src/mini-gmp) + set_source_files_properties(${PROJECT_SOURCE_DIR}/src/mini-gmp/mini-gmp.c PROPERTIES COMPILE_OPTIONS "-w") + + set(CMAKE_REQUIRED_INCLUDES "${PROJECT_SOURCE_DIR}/src/mini-gmp") + set(CMAKE_EXTRA_INCLUDE_FILES "mini-gmp.h") + check_type_size("mp_limb_t" MP_LIMB_T_BYTES) + + math(EXPR GMP_LIMB_BITS "${MP_LIMB_T_BYTES} * 8") + + add_compile_definitions(GMP_LIMB_BITS=${GMP_LIMB_BITS}) + add_compile_definitions(MINI_GMP) else() - # use system gmp version - find_library(GMP gmp) - find_path(GMP_INCLUDE gmp.h) - include_directories(${GMP_INCLUDE}) -endif() + message(FATAL_ERROR "Invalid choice for GMP_LIBRARY: ${GMP_LIBRARY}") +endif() \ No newline at end of file diff --git a/.cmake/impl_type.cmake b/.cmake/impl_type.cmake index a0a74dd..6079df9 100644 --- a/.cmake/impl_type.cmake +++ b/.cmake/impl_type.cmake @@ -1,7 +1,15 @@ get_filename_component(CCSD_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) string(TOUPPER ${CCSD_NAME} CCSD_NAME_UPPER) +if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/include) + set(INC_${CCSD_NAME_UPPER}_GENERIC ${CMAKE_CURRENT_SOURCE_DIR}/include) +endif() +if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${CCSD_NAME}x) + set(${CCSD_NAME_UPPER}_GENERIC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${CCSD_NAME}x) +endif() if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/broadwell AND SQISIGN_BUILD_TYPE MATCHES "broadwell") add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/broadwell) +elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/arm64crypto AND SQISIGN_BUILD_TYPE MATCHES "arm64crypto") + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/arm64crypto) elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/opt AND SQISIGN_BUILD_TYPE MATCHES "opt") add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/opt) elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/ref) diff --git a/.cmake/sqisign_variant.cmake b/.cmake/sqisign_variant.cmake index 04f6878..9909d74 100644 --- a/.cmake/sqisign_variant.cmake +++ b/.cmake/sqisign_variant.cmake @@ -1,6 +1,6 @@ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/generic) set(LIB_${CCSD_NAME_UPPER} sqisign_${CCSD_NAME}_generic CACHE INTERNAL "LIB") - set(INC_${CCSD_NAME_UPPER} ${CMAKE_CURRENT_SOURCE_DIR}/generic/include CACHE INTERNAL "LIB") + set(INC_${CCSD_NAME_UPPER} ${CMAKE_CURRENT_SOURCE_DIR}/generic/include CACHE INTERNAL "INC") add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/generic) FOREACH(SVARIANT ${SVARIANT_S}) string(TOUPPER ${SVARIANT} SVARIANT_UPPER) diff --git a/.cmake/target.cmake b/.cmake/target.cmake index 67096a1..75d0cde 100644 --- a/.cmake/target.cmake +++ b/.cmake/target.cmake @@ -1,39 +1,100 @@ # SPDX-License-Identifier: Apache-2.0 -if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm64") - add_definitions(-DTARGET_ARM64) - add_definitions(-DRADIX_64) -elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm") - add_definitions(-DTARGET_ARM) - add_definitions(-DRADIX_32) -elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86_64") - add_definitions(-DTARGET_AMD64) - add_definitions(-DRADIX_64) -elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "i386" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "i686") - add_definitions(-DTARGET_X86) - add_definitions(-DRADIX_32) -elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(s390x.*|S390X.*)") - add_definitions(-DTARGET_S390X) - add_definitions(-DTARGET_BIG_ENDIAN) - add_definitions(-DRADIX_64) +include(CheckTypeSize) + +function(check_target_feature CODE RUN_RESULT) + set(TEMP_FILE "${CMAKE_BINARY_DIR}/check_target_feature.c") + file(WRITE + ${TEMP_FILE} + "int main(void) { + ${CODE} + return 0; + }") + + try_run(TEMP_RUN_RESULT TEMP_COMPILE_RESULT ${CMAKE_BINARY_DIR} ${TEMP_FILE}) + + set(${RUN_RESULT} ${TEMP_RUN_RESULT} PARENT_SCOPE) + if (ARGC EQUAL 3) + set(${ARGV2} ${TEMP_COMPILE_RESULT} PARENT_SCOPE) + endif() + + file(REMOVE ${TEMP_FILE}) +endfunction() + +if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm64") + add_compile_definitions(TARGET_ARM64) + set(RADIX 64) + + if (NOT APPLE) + check_target_feature("asm volatile(\"mrs x0, PMCCNTR_EL0\" : : : \"x0\");" CYCCNT) + + if (CYCCNT STREQUAL "FAILED_TO_RUN") + message(STATUS "Cycle counter not supported, reverting to fallback measurement") + add_compile_definitions(NO_CYCLE_COUNTER) + endif() + endif() +elseif (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm") + add_compile_definitions(TARGET_ARM) + set(RADIX 32) +elseif (${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86_64") + add_compile_definitions(TARGET_AMD64) + set(RADIX 64) +elseif (${CMAKE_SYSTEM_PROCESSOR} MATCHES "i386" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "i686") + add_compile_definitions(TARGET_X86) + set(RADIX 32) +elseif (${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(s390x.*|S390X.*)") + add_compile_definitions(TARGET_S390X TARGET_BIG_ENDIAN) + set(RADIX 64) else() - add_definitions(-DTARGET_OTHER) - add_definitions(-DRADIX_64) + add_compile_definitions(TARGET_OTHER) + set(RADIX 64) message("Warning: system architecture not detected, defaulting to 64 bit") endif() -if (UNIX) - add_definitions(-DTARGET_OS_UNIX) +if (NOT GF_RADIX STREQUAL "AUTO") + if (NOT((GF_RADIX EQUAL 64) OR (GF_RADIX EQUAL 32))) + message(FATAL_ERROR "Currently supported options for GF_RADIX: 32 or 64. Aborting") + endif() + set(RADIX ${GF_RADIX}) +endif() + +if (NOT DEFINED SQISIGN_BUILD_TYPE) + set(SQISIGN_BUILD_TYPE "ref") +endif() + +if (RADIX EQUAL 32) + if (${SQISIGN_BUILD_TYPE} MATCHES "broadwell") + message(FATAL_ERROR "Broadwell implementation not supported in 32-bit build") + endif() else() - add_definitions(-DTARGET_OS_OTHER) + # Testing for unsigned 128-bit integer support + check_type_size("__uint128_t" uint128_t) + if (${HAVE_uint128_t} AND (uint128_t EQUAL 16)) + add_compile_definitions(HAVE_UINT128) + elseif(${SQISIGN_BUILD_TYPE} MATCHES "ref") + message(WARNING "Compiler/platform does not support unsigned 128-bit integers, falling back to 32-bit build") + set(RADIX 32) + endif() +endif() + +message(STATUS "Using ${RADIX}-bit radix for gf module") + +if (RADIX EQUAL 32) + add_compile_definitions(RADIX_32) +elseif (RADIX EQUAL 64) + add_compile_definitions(RADIX_64) +endif() + +if (UNIX) + add_compile_definitions(TARGET_OS_UNIX) +else() + add_compile_definitions(TARGET_OS_OTHER) endif() set(C_OPT_FLAGS "") -if ((NOT DEFINED SQISIGN_BUILD_TYPE)) - set(SQISIGN_BUILD_TYPE opt) +if (NOT DEFINED SQISIGN_TEST_REPS) + set(SQISIGN_TEST_REPS 10) endif() -if ((NOT DEFINED SQISIGN_TEST_REPS)) - set(SQISIGN_TEST_REPS 1000) -endif() +add_compile_definitions(SQISIGN_TEST_REPS=${SQISIGN_TEST_REPS}) diff --git a/.dir-locals.el b/.dir-locals.el deleted file mode 100644 index 51fa635..0000000 --- a/.dir-locals.el +++ /dev/null @@ -1,16 +0,0 @@ -;; Emacs style file -;; -;; Sets spaces-only indentation, 4-spaces tab stops, linux kernel -;; coding style -( - (nil . ((indent-tabs-mode . nil) - (tab-width . 4) - ) - ) - (c-default-style . ((c-mode . "linux") - )) - (c-mode . ((c-file-style . "linux") - (c-basic-offset . 4) - ) - ) - ) diff --git a/.github/workflows/checks-daily.yml b/.github/workflows/checks-daily.yml new file mode 100644 index 0000000..4c0b3a6 --- /dev/null +++ b/.github/workflows/checks-daily.yml @@ -0,0 +1,19 @@ +name: Daily workflow for various checks + +on: + schedule: + - cron: '0 0 * * *' # This cron expression means "run at midnight UTC every day" + +jobs: + checks: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install dependencies + run: | + sudo apt -y update && sudo apt -y install gcc cmake libgmp-dev scala + + - name: Check namespace + run: scripts/check_namespace.sh \ No newline at end of file diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 598e62c..6046f68 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -2,113 +2,179 @@ name: CMake on: push: - branches: [ '*' ] - pull_request: - branches: [ "main" ] + branches: ["**"] +# pull_request: +# branches: [ "main" ] env: # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) - BUILD_TYPE: Release + BUILD_TYPE: Debug jobs: build: # The CMake configure and build commands are platform agnostic and should work equally well on Windows or Mac. - # You can convert this to a matrix build if you need cross-platform coverage. - # See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix - runs-on: ubuntu-latest - strategy: matrix: + platform: [x64, arm64] + toolchain: [""] sqisign_build_type: [ref] sqisign_test_reps: [10] + gf_radix: [AUTO, 32] + enable_sign: [ON] + gmp_library: [SYSTEM] + include: + - platform: x64 + toolchain: "" + sqisign_build_type: broadwell + sqisign_test_reps: 10 + gf_radix: AUTO + enable_sign: ON + gmp_library: SYSTEM + - platform: x64 + toolchain: .cmake/32bit.cmake + sqisign_build_type: ref + sqisign_test_reps: 10 + gf_radix: 32 + enable_sign: ON + gmp_library: BUILD # Redundant, as it's set in .cmake/32bit.cmake + - platform: x64 + toolchain: "" + sqisign_build_type: ref + sqisign_test_reps: 10 + gf_radix: AUTO + enable_sign: OFF + gmp_library: SYSTEM + - platform: x64 + toolchain: "" + sqisign_build_type: ref + sqisign_test_reps: 10 + gf_radix: AUTO + enable_sign: ON + gmp_library: MINI + + runs-on: [self-hosted, "${{ matrix.platform }}"] steps: - - uses: actions/checkout@v3 - - - name: Install dependencies Valgrind, GMP, Doxygen, TeX - run: | - sudo apt update && sudo apt --fix-missing install valgrind libgmp-dev doxygen texlive-xetex - echo "Valgrind installed" + - uses: actions/checkout@v4 - - name: Configure CMake - # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. - # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type - run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DSQISIGN_TEST_REPS=${{ matrix.sqisign_test_reps }} + ## - name: Install dependencies Valgrind, GMP, Doxygen, TeX, gcc-multilib + ## run: | + ## sudo apt update && sudo apt --fix-missing install valgrind libgmp-dev doxygen texlive-xetex gcc-multilib - - name: Build - # Build your program with the given configuration - run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} + - name: Set up environment for ccache + run: echo "PATH=/usr/lib/ccache:$PATH" >> $GITHUB_ENV - - name: Build documentation - # Create html and latex documentation, TODO: do we need different docs for ref and opt? - run: doxygen Doxyfile && cd latex && xelatex refman + - name: Configure CMake + # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. + # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type + run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DSQISIGN_TEST_REPS=${{ matrix.sqisign_test_reps }} -DGF_RADIX=${{ matrix.gf_radix }} -DENABLE_SIGN=${{ matrix.enable_sign }} -DGMP_LIBRARY=${{ matrix.gmp_library }} ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} -G Ninja - - name: Upload latex documentation - uses: actions/upload-artifact@v3 - with: - name: docs - path: latex/refman.pdf + - name: Build + # Build your program with the given configuration + run: | + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi + cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} - - name: Test - working-directory: ${{github.workspace}}/build - # Execute tests defined by the CMake configuration. - # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail - run: ctest -j4 -C ${{env.BUILD_TYPE}} - - - name: Examples - working-directory: ${{github.workspace}}/build/apps - run: | + - name: Build documentation + # Create html and latex documentation, TODO: do we need different docs for ref and opt? + if: ${{ ((matrix.gf_radix != 32) && (matrix.enable_sign == 'ON') && (matrix.gmp_library == 'SYSTEM')) }} + run: doxygen Doxyfile && cd latex && xelatex refman + + - name: Upload latex documentation + if: ${{ ((matrix.gf_radix != 32) && (matrix.enable_sign == 'ON') && (matrix.gmp_library == 'SYSTEM')) }} + uses: actions/upload-artifact@v4 + with: + name: docs-${{ matrix.platform }}-${{ matrix.sqisign_build_type }} + path: latex/refman.pdf + + - name: Test + working-directory: ${{github.workspace}}/build + # Execute tests defined by the CMake configuration. + # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail + run: ctest -j16 -C ${{env.BUILD_TYPE}} -E "KAT$" + + - name: Examples + working-directory: ${{github.workspace}}/build/apps + run: | ./example_nistapi_lvl1 ./example_nistapi_lvl3 ./example_nistapi_lvl5 + if: ${{ matrix.enable_sign == 'ON' }} - - name: CT-Tests - # TODO: re-enable for those tests that should be ct - if: false - run: | + - name: Release build & test + run: | rm -rf build - cmake -Bbuild -DENABLE_CT_TESTING=ON -DCMAKE_BUILD_TYPE=Debug -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DSQISIGN_TEST_REPS=${{ matrix.sqisign_test_reps }} + cmake -Bbuild -DCMAKE_BUILD_TYPE=Release -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DCMAKE_C_COMPILER=clang -DSQISIGN_TEST_REPS=1 -DGF_RADIX=${{ matrix.gf_radix }} -DENABLE_SIGN=${{ matrix.enable_sign }} -DGMP_LIBRARY=${{ matrix.gmp_library }} ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} -G Ninja + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi cmake --build build - # valgrind --track-origins=yes build/ - # valgrind --track-origins=yes build/ - # valgrind --track-origins=yes build/ - # valgrind --track-origins=yes build/ + CTEST_OUTPUT_ON_FAILURE=1 ctest -j16 -V --test-dir build -E "KAT$" - - name: Memcheck - run: | + - name: Memcheck + run: | rm -rf build - cmake -Bbuild -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DSQISIGN_TEST_REPS=${{ matrix.sqisign_test_reps }} + cmake -Bbuild -DSQISIGN_TEST_REPS=1 -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DSQISIGN_TEST_REPS=1 -DGF_RADIX=${{ matrix.gf_radix }} -DENABLE_SIGN=${{ matrix.enable_sign }} -DGMP_LIBRARY=${{ matrix.gmp_library }} ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} -G Ninja + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi cmake --build build - ctest -T memcheck --test-dir build - if: false + valgrind --error-exitcode=1 --max-stackframe=4116160 ./build/test/sqisign_test_scheme_lvl3 + valgrind --error-exitcode=1 --max-stackframe=4116160 ./build/test/sqisign_test_scheme_lvl1 + valgrind --error-exitcode=1 --max-stackframe=4116160 ./build/test/sqisign_test_scheme_lvl5 + if: ${{ matrix.toolchain == '' && matrix.platform == 'arm64' && matrix.gf_radix == 'AUTO' }} - - name: Address Sanitizer ASAN - run: | + - name: Build shared libraries + run: | rm -rf build - cmake -Bbuild -DCMAKE_BUILD_TYPE=ASAN -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DCMAKE_C_COMPILER=clang -DSQISIGN_TEST_REPS=1 + cmake -Bbuild -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Release -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DGF_RADIX=${{ matrix.gf_radix }} -DENABLE_SIGN=${{ matrix.enable_sign }} -DGMP_LIBRARY=${{ matrix.gmp_library }} -DCMAKE_C_COMPILER=clang ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} -G Ninja + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi cmake --build build - ctest -j4 -v --test-dir build + find . -name '*.so' | grep so + CTEST_OUTPUT_ON_FAILURE=1 ctest -j16 -V --test-dir build -E "KAT$" - # MSAN needs instrumented gmp - - name: Memory Sanitizer MSAN - run: | + - name: Address Sanitizer ASAN + run: | rm -rf build - cmake -Bbuild -DCMAKE_BUILD_TYPE=MSAN -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DCMAKE_C_COMPILER=clang -DSQISIGN_TEST_REPS=1 + cmake -Bbuild -DCMAKE_BUILD_TYPE=ASAN -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DCMAKE_C_COMPILER=clang -DSQISIGN_TEST_REPS=1 -DGF_RADIX=${{ matrix.gf_radix }} -DENABLE_SIGN=${{ matrix.enable_sign }} -DGMP_LIBRARY=${{ matrix.gmp_library }} ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} -G Ninja + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi cmake --build build - ctest -j4 -v --test-dir build + CTEST_OUTPUT_ON_FAILURE=1 ctest -j16 -V --test-dir build -E "KAT$" - if: false - - - name: Leak Sanitizer LSAN - run: | + # MSAN needs instrumented gmp + - name: Memory Sanitizer MSAN + run: | rm -rf build - cmake -Bbuild -DCMAKE_BUILD_TYPE=LSAN -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DCMAKE_C_COMPILER=clang -DSQISIGN_TEST_REPS=1 + cmake -Bbuild -DCMAKE_BUILD_TYPE=MSAN -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DCMAKE_C_COMPILER=clang -DSQISIGN_TEST_REPS=1 -DGF_RADIX=${{ matrix.gf_radix }} -DENABLE_SIGN=${{ matrix.enable_sign }} -DGMP_LIBRARY=${{ matrix.gmp_library }} ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} -G Ninja + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi cmake --build build - ctest -j4 -v --test-dir build + CTEST_OUTPUT_ON_FAILURE=1 ctest -j16 -V --test-dir build -E "KAT$" + if: ${{ matrix.gmp_library == 'MINI' }} - - name: Undefined Behavior Sanitizer UBSAN - run: | + - name: Leak Sanitizer LSAN + run: | rm -rf build - cmake -Bbuild -DCMAKE_BUILD_TYPE=UBSAN -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DCMAKE_C_COMPILER=clang -DSQISIGN_TEST_REPS=1 + cmake -Bbuild -DCMAKE_BUILD_TYPE=LSAN -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DCMAKE_C_COMPILER=clang -DSQISIGN_TEST_REPS=1 -DGF_RADIX=${{ matrix.gf_radix }} -DENABLE_SIGN=${{ matrix.enable_sign }} -DGMP_LIBRARY=${{ matrix.gmp_library }} ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} -G Ninja + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi cmake --build build - ctest -j4 -v --test-dir build + CTEST_OUTPUT_ON_FAILURE=1 ctest -j16 -V --test-dir build -E "KAT$" + + - name: Undefined Behavior Sanitizer UBSAN + run: | + rm -rf build + cmake -Bbuild -DCMAKE_BUILD_TYPE=UBSAN -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DCMAKE_C_COMPILER=clang -DSQISIGN_TEST_REPS=1 -DGF_RADIX=${{ matrix.gf_radix }} -DENABLE_SIGN=${{ matrix.enable_sign }} -DGMP_LIBRARY=${{ matrix.gmp_library }} ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} -G Ninja + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi + cmake --build build + CTEST_OUTPUT_ON_FAILURE=1 ctest -j16 -V --test-dir build -E "KAT$" diff --git a/.github/workflows/daily.yml b/.github/workflows/daily.yml new file mode 100644 index 0000000..d03da0a --- /dev/null +++ b/.github/workflows/daily.yml @@ -0,0 +1,54 @@ +name: Benchmarks (Daily Workflow) + +on: + schedule: + - cron: '0 0 * * *' # This cron expression means "run at midnight UTC every day" + +env: + # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) + BUILD_TYPE: Release + +jobs: + benchmarks: + # The CMake configure and build commands are platform agnostic and should work equally well on Windows or Mac. + strategy: + matrix: + platform: [x64, arm64] + toolchain: [""] + sqisign_build_type: [ref] + include: + - platform: x64 + toolchain: "" + sqisign_build_type: broadwell + sqisign_test_reps: 10 + - platform: x64 + toolchain: .cmake/32bit.cmake + sqisign_build_type: ref + sqisign_test_reps: 10 + + runs-on: [self-hosted, "${{ matrix.platform }}"] + + steps: + - uses: actions/checkout@v4 + + - name: Configure CMake + # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. + # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type + run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} + + - name: Build + # Build your program with the given configuration + run: | + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi + cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} + + - name: Run benchmarks in apps folder + run: | + build/apps/benchmark_lvl1 50 + build/apps/benchmark_lvl3 20 + build/apps/benchmark_lvl5 10 + + - name: Run Benchmarks (make bm) + run: cd build && make bm diff --git a/.github/workflows/daily_trigger.yml b/.github/workflows/daily_trigger.yml new file mode 100644 index 0000000..71fe078 --- /dev/null +++ b/.github/workflows/daily_trigger.yml @@ -0,0 +1,60 @@ +name: Benchmarks (Daily Workflow, manual trigger) + +on: + workflow_dispatch: + inputs: + commit_sha: + description: 'The commit SHA to run the workflow on' + required: true + type: string + +env: + # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) + BUILD_TYPE: Release + +jobs: + benchmarks: + # The CMake configure and build commands are platform agnostic and should work equally well on Windows or Mac. + strategy: + matrix: + platform: [x64, arm64] + toolchain: [""] + sqisign_build_type: [ref] + include: + - platform: x64 + toolchain: "" + sqisign_build_type: broadwell + sqisign_test_reps: 10 + - platform: x64 + toolchain: .cmake/32bit.cmake + sqisign_build_type: ref + sqisign_test_reps: 10 + + runs-on: [self-hosted, "${{ matrix.platform }}"] + + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.commit_sha }} + + - name: Configure CMake + # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. + # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type + run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} + + - name: Build + # Build your program with the given configuration + run: | + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi + cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} + + - name: Run benchmarks in apps folder + run: | + build/apps/benchmark_lvl1 50 + build/apps/benchmark_lvl3 20 + build/apps/benchmark_lvl5 10 + + - name: Run Benchmarks (make bm) + run: cd build && make bm diff --git a/.github/workflows/kat.yml b/.github/workflows/kat.yml new file mode 100644 index 0000000..6a6765e --- /dev/null +++ b/.github/workflows/kat.yml @@ -0,0 +1,189 @@ +name: Known Answer Tests (KAT) + +on: + workflow_dispatch: + inputs: + commit_sha: + description: 'The commit SHA to run the workflow on' + required: true + type: string + +jobs: + x86-KAT: + # The CMake configure and build commands are platform agnostic and should work equally well on Windows or Mac. + strategy: + matrix: + compiler: [gcc] + build_type: [Release] + platform: [x64] + #fast_math: [-ffast-math, -fno-fast-math] + #fp_contract: [-ffp-contract=on, -ffp-contract=fast, -ffp-contract=off] + fast_math: [""] + fp_contract: [""] + toolchain: ["", ".cmake/32bit.cmake"] + sqisign_build_type: [ref] + gf_radix: [AUTO, 32] + gmp_library: [SYSTEM, MINI] + + runs-on: [self-hosted, "${{ matrix.platform }}"] + + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.commit_sha }} + + ## - name: Install dependencies Valgrind, GMP, Doxygen, TeX, gcc-multilib + ## run: | + ## sudo apt update && sudo apt --fix-missing install valgrind libgmp-dev doxygen texlive-xetex gcc-multilib + + - name: Configure CMake + # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. + # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type + run: cmake -B ${{github.workspace}}/build -DCMAKE_C_COMPILER=${{matrix.compiler}} -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DGF_RADIX=${{ matrix.gf_radix }} -DGMP_LIBRARY=${{ matrix.gmp_library }} ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} -DCMAKE_C_FLAGS="${{ matrix.fast_math }} ${{ matrix.fp_contract }}" + + - name: Build + # Build your program with the given configuration + run: | + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi + cmake --build ${{github.workspace}}/build --parallel 8 --config ${{matrix.build_type}} + + - name: Test + working-directory: ${{github.workspace}}/build + # Execute tests defined by the CMake configuration. + # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail + run: ctest -R KAT$ -j3 -C ${{matrix.build_type}} + + broadwell-KAT: + # The CMake configure and build commands are platform agnostic and should work equally well on Windows or Mac. + strategy: + matrix: + compiler: [clang, gcc] + build_type: [Release] + platform: [x64] + #fast_math: [ON, OFF] + #fp_contract: [ON, FAST, OFF] + fast_math: [""] + fp_contract: [""] + toolchain: [""] + sqisign_build_type: [broadwell] + gf_radix: [AUTO] + gmp_library: [SYSTEM, MINI] + + runs-on: [self-hosted, "${{ matrix.platform }}"] + + steps: + - uses: actions/checkout@v4 + + ## - name: Install dependencies Valgrind, GMP, Doxygen, TeX, gcc-multilib + ## run: | + ## sudo apt update && sudo apt --fix-missing install valgrind libgmp-dev doxygen texlive-xetex gcc-multilib + + - name: Configure CMake + # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. + # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type + run: cmake -B ${{github.workspace}}/build -DCMAKE_C_COMPILER=${{matrix.compiler}} -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DGF_RADIX=${{ matrix.gf_radix }} -DGMP_LIBRARY=${{ matrix.gmp_library }} ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} -DCMAKE_C_FLAGS="${{ matrix.fast_math }} ${{ matrix.fp_contract }}" + + - name: Build + # Build your program with the given configuration + run: | + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi + cmake --build ${{github.workspace}}/build --parallel 8 --config ${{matrix.build_type}} + + - name: Test + working-directory: ${{github.workspace}}/build + # Execute tests defined by the CMake configuration. + # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail + run: ctest -R KAT$ -j3 -C ${{matrix.build_type}} + + arm64-KAT: + # The CMake configure and build commands are platform agnostic and should work equally well on Windows or Mac. + strategy: + matrix: + compiler: [clang, gcc] + build_type: [Release] + platform: [arm64] + #fast_math: [ON, OFF] + #fp_contract: [ON, FAST, OFF] + fast_math: [""] + fp_contract: [""] + toolchain: [""] + sqisign_build_type: [ref] + gf_radix: [AUTO] + gmp_library: [SYSTEM, MINI] + + runs-on: [self-hosted, "${{ matrix.platform }}"] + + steps: + - uses: actions/checkout@v4 + + ## - name: Install dependencies Valgrind, GMP, Doxygen, TeX, gcc-multilib + ## run: | + ## sudo apt update && sudo apt --fix-missing install valgrind libgmp-dev doxygen texlive-xetex gcc-multilib + + - name: Configure CMake + # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. + # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type + run: cmake -B ${{github.workspace}}/build -DCMAKE_C_COMPILER=${{matrix.compiler}} -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DGF_RADIX=${{ matrix.gf_radix }} -DGMP_LIBRARY=${{ matrix.gmp_library }} ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} -DCMAKE_C_FLAGS="${{ matrix.fast_math }} ${{ matrix.fp_contract }}" + + - name: Build + # Build your program with the given configuration + run: | + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi + cmake --build ${{github.workspace}}/build --parallel 8 --config ${{matrix.build_type}} + + - name: Test + working-directory: ${{github.workspace}}/build + # Execute tests defined by the CMake configuration. + # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail + run: ctest -R KAT$ -j3 -C ${{matrix.build_type}} + + DebugKAT: + # The CMake configure and build commands are platform agnostic and should work equally well on Windows or Mac. + strategy: + matrix: + compiler: [clang, gcc] + build_type: [Debug] + platform: [x64] + #fast_math: [OFF] + #fp_contract: [FAST] + fast_math: [""] + fp_contract: [""] + toolchain: [""] + sqisign_build_type: [ref, broadwell] + gf_radix: [AUTO] + gmp_library: [SYSTEM] + + runs-on: [self-hosted, "${{ matrix.platform }}"] + + steps: + - uses: actions/checkout@v4 + + ## - name: Install dependencies Valgrind, GMP, Doxygen, TeX, gcc-multilib + ## run: | + ## sudo apt update && sudo apt --fix-missing install valgrind libgmp-dev doxygen texlive-xetex gcc-multilib + + - name: Configure CMake + # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. + # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type + run: cmake -B ${{github.workspace}}/build -DCMAKE_C_COMPILER=${{matrix.compiler}} -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DGF_RADIX=${{ matrix.gf_radix }} -DGMP_LIBRARY=${{ matrix.gmp_library }} ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} -DCMAKE_C_FLAGS="${{ matrix.fast_math }} ${{ matrix.fp_contract }}" + + - name: Build + # Build your program with the given configuration + run: | + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi + cmake --build ${{github.workspace}}/build --parallel 8 --config ${{matrix.build_type}} + + - name: Test + working-directory: ${{github.workspace}}/build + # Execute tests defined by the CMake configuration. + # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail + run: ctest -R KAT$ -j3 -C ${{matrix.build_type}} + \ No newline at end of file diff --git a/.github/workflows/s390-daily.yml b/.github/workflows/s390-daily.yml new file mode 100644 index 0000000..1cdcc40 --- /dev/null +++ b/.github/workflows/s390-daily.yml @@ -0,0 +1,33 @@ +name: Big-endian s390x test (Daily Workflow) + +on: + schedule: + - cron: '0 0 * * *' # This cron expression means "run at midnight UTC every day" + +jobs: + s390-be: + strategy: + matrix: + BUILD_TYPE: [Debug, Release] + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + - name: Setup multiarch/qemu-user-static + run: | + docker run --rm --privileged multiarch/qemu-user-static:register --reset + - name: Run build and tests in s390x container + run: | + docker run --rm -v ${{ github.workspace }}:/workspace multiarch/ubuntu-core:s390x-focal bash -c " + set -x && + cd /workspace && + ls -l . && + uname -a && + lscpu | grep Endian && + apt -y update && + apt -y install cmake gcc libgmp-dev && + cmake -B build -DCMAKE_BUILD_TYPE=${{ matrix.BUILD_TYPE }} -DSQISIGN_BUILD_TYPE=ref && + cmake --build build --config ${{ matrix.BUILD_TYPE }} && + cd /workspace/build && + ctest -j4 -C ${{ matrix.BUILD_TYPE }} + " diff --git a/.gitignore b/.gitignore index c095a45..ef8e9b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ -build/ +build*/ html/ latex/ +.vscode + +*.DS_Store diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..4032020 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,7 @@ +repos: +- repo: https://github.com/pre-commit/mirrors-clang-format + rev: v18.1.6 + hooks: + - id: clang-format + types_or: [c] + exclude: ^src/precomp/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 3f059fb..42ae352 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,48 +1,59 @@ # SPDX-License-Identifier: Apache-2.0 -cmake_minimum_required(VERSION 3.5) -project(SQIsign VERSION 1.0 LANGUAGES C ASM) +cmake_minimum_required(VERSION 3.13) +project(SQIsign VERSION 2.0 LANGUAGES C ASM) set(SQISIGN_SO_VERSION "0") -set(CMAKE_C_STANDARD 99) +set(CMAKE_C_STANDARD 11) +set(CMAKE_POSITION_INDEPENDENT_CODE ON) include(CTest) -option(ENABLE_STRICT "Build with strict compile options." OFF) +option(ENABLE_STRICT "Build with strict compile options." ON) option(ENABLE_TESTS "Enable compilation of tests." ON) option(ENABLE_CT_TESTING "Enable compilation for constant time testing." OFF) -option(ENABLE_GMP_BUILD "Download and build external version of GMP" OFF) -option(ENABLE_DOC_TARGET "Enable building API documentation using doxygen" OFF) +option(ENABLE_SIGN "Build with sign functionality" ON) +set(GMP_LIBRARY "SYSTEM" CACHE STRING "Which version of GMP to use: SYSTEM, BUILD or MINI") +set(GF_RADIX "AUTO" CACHE STRING "Set the radix for the gf module (currently supported values: 32 or 64), or AUTO.") if (NOT DEFINED SQISIGN_BUILD_TYPE) - SET(SQISIGN_BUILD_TYPE "ref") + SET(SQISIGN_BUILD_TYPE "ref") endif() -if(SQISIGN_BUILD_TYPE STREQUAL "broadwell") - SET(SVARIANT_S "lvl1") -else() - SET(SVARIANT_S "lvl1;lvl3;lvl5") +if (${SQISIGN_BUILD_TYPE} MATCHES "ref") + add_compile_definitions(SQISIGN_BUILD_TYPE_REF SQISIGN_GF_IMPL_REF) +elseif (${SQISIGN_BUILD_TYPE} MATCHES "opt") + add_compile_definitions(SQISIGN_BUILD_TYPE_OPT SQISIGN_GF_IMPL_REF) +elseif (${SQISIGN_BUILD_TYPE} MATCHES "broadwell") + add_compile_definitions(SQISIGN_BUILD_TYPE_BROADWELL SQISIGN_GF_IMPL_BROADWELL) +elseif (${SQISIGN_BUILD_TYPE} MATCHES "arm64crypto") + add_compile_definitions(SQISIGN_BUILD_TYPE_ARM64CRYPTO SQISIGN_GF_IMPL_REF) endif() +SET(SVARIANT_S "lvl1;lvl3;lvl5") + include(.cmake/flags.cmake) include(.cmake/sanitizers.cmake) include(.cmake/target.cmake) -if(ENABLE_DOC_TARGET) - include(.cmake/target_docs.cmake) +if(ENABLE_SIGN) + include(.cmake/gmpconfig.cmake) + add_compile_definitions(ENABLE_SIGN) endif() -include(.cmake/gmpconfig.cmake) +set(BM_BINS "" CACHE INTERNAL "List of benchmark binaries") set(SELECT_IMPL_TYPE ${PROJECT_SOURCE_DIR}/.cmake/impl_type.cmake) set(SELECT_SQISIGN_VARIANT ${PROJECT_SOURCE_DIR}/.cmake/sqisign_variant.cmake) set(INC_PUBLIC ${PROJECT_SOURCE_DIR}/include) - add_subdirectory(src) add_subdirectory(apps) +add_subdirectory(test) -if(ENABLE_TESTS) - enable_testing() - add_subdirectory(test) -endif() +include(.cmake/bm.cmake) + +#if(ENABLE_TESTS) +# enable_testing() +# add_subdirectory(test) +#endif() diff --git a/COPYING.LGPL b/COPYING.LGPL new file mode 100644 index 0000000..0a04128 --- /dev/null +++ b/COPYING.LGPL @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/DEVELOPERS.md b/DEVELOPERS.md index 4b8a76b..67c86c2 100644 --- a/DEVELOPERS.md +++ b/DEVELOPERS.md @@ -4,106 +4,196 @@ Please read carefully before contributing to this repo. ## Code structure -The code is split into the modules below: - +The source code is in the [`src/`](src) directory and it is split into the +following modules: - `common`: common code for AES, SHAKE, (P)RNG, memory handling. Every - module that needs a hash function, seed expansion (e.g., KLPT), + module that needs a hash function, seed expansion, deterministic alea for tests, should call to this module. -- `uintbig`: multi-precision big integers. +- `mp`: code for saturated-representation multiprecision arithmetic. - `gf`: GF(p^2) and GF(p) arithmetic. - `ec`: elliptic curves, isogenies and pairings. Everything that is purely finite-fieldy. -- `quaternion`: quaternion orders and ideals. This is, essentially, - replacing PARI/GP. -- `klpt`: implementation of KLPT. +- `precomp`: constants and precomputed values. +- `quaternion`: quaternion orders and ideals. +- `hd`: code to compute (2,2)-isogenies in the theta model. - `id2iso`: code for Iso <-> Ideal. -- `util`: auxilary code shared among libraries. - -The sources for the modules are in [`src/`](src). Each module is -structured as follows: - -``` -SQIsign -└── src - └── - ├── - │ ├── generic - │ └── lvl1 - ├── opt - │ ├── generic - │ ├── lvl1 - │ ├── lvl1_var1 - │ ├── lvl3 - │ └── lvl5 - └── ref - └── generic -``` - -where: - -- `` is the name of the module. -- `` are optional architecture-specific implementations of the - module (e.g., `broadwell` for code using assembly instructions - specific to the Broadwell platform). -- `opt` and `ref` are the portable *optimized* and *reference* - implementations. -- `lvl1`, `lvl3`, `lvl5` are parameter-dependent implementations of - the module, corresponding to NIST levels 1, 3 and 5, respectively. -- `lvl1_var1` is a variant of `lvl1`, e.g., using a different prime - characteristic. The naming is free, and implementors are encouraged - to choose more explicit naming, e.g., `lvl1_varp6983` for the - variant using the `p6983` prime defined in the SQIsign AC20 variant. -- `generic` is a parameter-independent implementation of the module. - If no folder is named like the currently selected variant (see - [Build](README.md#Build)), then this is compiled instead. - -Each of the folders above is allowed to be a symlink. E.g., if a -module has no separate optimized and reference implementation, then -`opt` can be a symlink to `ref`. Other example: a module's code only -depends on the field size, but not the specific prime, then -`lvl1_varp6983` could be a symlink to `lvl1`. +- `verification`: code for the verification protocol. +- `signature`: code for the key generation and signature protocols. ### Contents of a module -The leaf folders described above should arrange code as described -below. We use the `generic` implementation of the `uintbig` module as -an example. - +Each module is comprised of *implementation types* and common code. An +implementation type refers to the *portable optimized*, *portable reference* or +any architecture-specific implementation of the module; a module must contain at +least one implementation type. Each implementation type must be in its own +directory within the directory of the module. The optimized and reference +implementation types must be placed in the `opt` and `ref` directories, +respectively; there is no rule for naming other architecture-specific +implementations. Common code refers to optional generic code that is shared +among all implementation types. Common code is placed in special directories +within the directory of a module: header files in the `include` directory and +source files in the `x` directory, where `` is the +name of the module. An example of a module is given below: ``` -generic -├── bench -│ ├── CmakeLists.txt -│ ├── bench1.c -│ └── bench2.c -├── include -│ └── uintbig.h -├── test -│ ├── CmakeLists.txt -│ ├── test1.c -│ └── test2.c -├── CmakeLists.txt -├── internal_header.h -├── soruce1.c -└── soruce2.c +src +└── + ├── include + ├── x + ├── opt + ├── ref + └── ``` - where: +- `` is the name of the module. +- `opt` and `ref` are the portable optimized and reference + implementation types, respectively. +- `` is an optional architecture-specific implementation type of the + module (e.g., `broadwell` for code using assembly instructions + specific to the Broadwell platform). +- `include` contains header files common to all implementation types. +- `x` contains source files common to all implementation types + (i.e., `opt`, `ref` and ``). -- `include/` shall contain a **unique header file** named - `.h`, where `` is the name of the module. - This header contains the public API of the module, and is the only - header that can be included by other modules (e.g., via `#include - `). These files must contain extensive doxygen-formatted - documentation describing the module, see - [Documentation](#Documentation). -- `bench` and `test` contain one executable per file, containing, - well, benchmarks and unit tests. Refer to [Benchmarks](#Benchmarks) - and [Tests](#Tests) for instructions on how to write these. -- Internal headers for the private use of the module, such as - `internal_header.h` go to the root. Include these using `#include - "internal_header.h"`. -- The implementation of the module also goes into the root. +Header files in the `include` directory above can be included by other modules +and must contain extensive doxygen-formatted documentation describing the +functions declared there; see [Documentation](#Documentation). Any +implementation-type directory above is allowed to be a symlink; e.g., if a +module has no separate optimized and reference implementation, then +`opt` can be a symlink to `ref`. +Similar to a module, each implementation type is comprised of implementation +*variants* and common code. A variant refers to either a *generic* +implementation, an implementation whose parameters are defined by one of the +NIST levels (i.e., 1, 3 or 5) or a variation of the latter. An implementation +type must contain at least one variant. Each variant must be in its own +directory within that of the implementation type. The generic variant must be +placed in the `generic` directory and variants corresponding to NIST levels 1, +3 and 5 are placed in the directories `lvl1`, `lvl3` and `lvl5`, respectively; +there is no rule for naming the directory of a NIST variation, but +implementors are encouraged to choose informative namings. Common code refers to +optional variant-independent code that is shared among all variants of the same +implementation type. Common code is placed in special directories within that of +the implementation type: header files in the `include` directory and source +files in the `lvlx` directory. Expanding on the example above, we show the +details of its implementation types: +``` +src +└── + ├── include + ├── x + ├── opt + │ ├── include + │ ├── lvlx + │ ├── lvl1 + │ ├── lvl1_var1 + │ ├── lvl3 + │ └── lvl5 + ├── ref + │ ├── generic + │ └── lvl1 + └── + ├── include + ├── lvlx + ├── lvl3 + └── lvl5 +``` +where: +- `lvl1`, `lvl3`, `lvl5` are implementations of NIST levels 1, 3 and 5, + respectively, for the corresponding implementation type. +- `lvl1_var1` is a variation of `lvl1` for the `opt` implementation type (e.g., + using a different prime characteristic). +- `opt/include` contains header files common to all variants in the `opt` + implementation type (i.e., `lvl1`, `lvl1_var1`, `lvl3` and `lvl5`). + Similarly, `/include` for all variants in the `` implementation + type (i.e., `lvl3` and `lvl5`). +- `opt/lvlx` contains source files common to all variants in the `opt` + implementation type. Similarly, `/lvlx` for all variants in the `` + implementation type. +- `generic` contains a parameter-independent implementation of the `ref` + implementation type. + +As the name suggests, the `generic` variant is a generic implementation which +does not depend on the parameters defined by the NIST levels or any variation +of these. If this directory is present, all other parameter-dependent +implementations are ignored and the `generic` implementation is built instead. +As with modules, header files in the `include` directory of an implementation +type (e.g., `opt/include` and `/include` above) can be included by other +modules and must contain extensive doxygen-formatted documentation describing +the functions declared there. + +Each implementation variant must be organized as follows: +- Header files that can be included by other modules are placed in the `include` + directory. These files must contain extensive doxygen-formatted documentation + describing the functions declared there. +- Source files of the implementation and their private internal header files are + placed directly in the implementation variant directory. +- Source files of unit tests and their private internal header files are placed + in the `test` directory. Refer to [Tests](#Tests) for instructions on how to + write these. + +Common code (in `lvlx`) for all variants in an implementation type follows the +same organization as above, with the exception that `lvlx` never contains an +`include` directory. This role is taken by the `include` directory in the +implementation type. Below is an example with the detailed organization of the +common code and the `lvl1` variant for the `ref` implementation type of a +module: +``` + +├──ref +│ ├── include +│ │ └── header_ref.h +│ ├──lvlx +│ │ ├── test +│ │ │ ├── test_internal_header_ref.h +│ │ │ │ ... +│ │ │ ├── test1_ref.c +│ │ │ └── test2_ref.c +│ │ ├── internal_header_ref.h +│ │ ├── source1_ref.c +│ │ └── source2_ref.c +│ ├──lvl1 +│ │ ├── include +│ │ │ └── header_ref_lvl1.h +│ │ ├── test +│ │ │ ├── test_internal_header_ref_lvl1.h +│ │ │ │ ... +│ │ │ ├── test1_ref_lvl1.c +│ │ │ └── test2_ref_lvl1.c +│ │ ├── internal_header_ref_lvl1.h +│ │ ├── source1_ref_lvl1.c +│ │ └── source2_ref_lvl1.c +│ ├──lvl3 +│ └──lvl5 +``` + +Finally, common code for a module must be organized as follows: +- Header files that can be included by other modules are placed in the `include` + directory. As mentionde before, these files must contain extensive + doxygen-formatted documentation describing the functions declared there. +- Source files and their private internal header files are placed in the + `x` directory. +- Source files of unit tests and their private internal header files are placed + in the `x/test` directory. Again, refer to [Tests](#Tests) for + instructions on how to write these. + +The example below shows the detailed organization of the common code of a +module: +``` + +├── include +│ └── header.h +├── x +│ ├── test +│ │ ├── test_internal_header.h +│ │ │ ... +│ │ ├── test1.c +│ │ └── test2.c +│ ├── internal_header.h +│ ├── source1.c +│ └── source2.c +├── opt +└── ref +``` ## Tests @@ -113,27 +203,28 @@ to ensure consistency across the modules. ### Unit tests -These go into `src////test/`. -Refer to ... for an example of how to write tests. +These go in the `src//x/test` and +`src////test/` directories. +Refer to [`src/gf/gfx/test/test_fp.c`](src/gf/gfx/test/test_fp.c) for an example +of how to write tests. ### Integration tests -These go into `test/`. Refer to +These go in the `test/` directory. Refer to [`test/test_sqisign.c`](test/test_sqisign.c) for an example. ### Known Answer Tests (KAT) KATs help validate consistency across implementations. By ensuring that, e.g., the optimized and reference implementation produce the -same signatures. - -See [Known Answer Tests in README.md](README.md#Known Answer Tests (KAT)). +same signatures. KATs are generated by executing `PQCgenKAT_sign_` in +the `apps` directory. KAT tests go in the `test/` directory. ## Benchmarks -Benchmarks for a module go into -`src////bench/`. Global -benchmarks go... +Benchmarks for a module go in the same directories as for tests. +Global benchmarks go in the `apps` directory; e.g., +[`apps/benchmark.c`](apps/benchmark.c). ## Documentation @@ -145,9 +236,9 @@ All code should be extensively documented. The public module headers CI automatically builds a PDF of the doc every time code is pushed. To download the PDF, go to -[Actions](https://github.com/SQIsign/sqisign-nist/actions), click on +[Actions](https://github.com/SQIsign/sqisign-nist2/actions), click on the workflow run you're interested in, then go to Artifacts -> docs -(see figure). +(see figure). PDFs are retained for 2 days. ![](https://user-images.githubusercontent.com/149199/231756751-0f2780f8-33fe-4db9-8800-b5f145423b65.png) @@ -155,11 +246,11 @@ the workflow run you're interested in, then go to Artifacts -> docs Always work on topic branches, never push work in progress on the `main` branch. Once a task / issue / work unit is completed, create a -pull-request and ask your team leader for a review. +pull-request and ask for at least one review. ## Coding style -- **C version**: All code must compile cleanly as *C99*, without +- **C version**: All code must compile cleanly as *C11*, without emitting any warnings, using recent versions of GCC and clang. - **Names**: Externally visible functions and types should be prefixed @@ -187,7 +278,23 @@ pull-request and ask your team leader for a review. Global *state* (modifiable global variables), on the other hand, is strictly forbidden. -- **Whitespace**: Try not to mix tabs and spaces. Line endings - should be UNIX-style (i.e., `\n` rather than `\r\n`). Whitespace - characters at the end of a line, or by themselves on an otherwise - empty line, are to be avoided. +- **Formatting**: This project uses + [`clang-format`](https://clang.llvm.org/docs/ClangFormat.html) to + format the code. From the root of the project run the following + command: + + ``` + find ./src -path ./src/precomp -prune -type f -o -iname '*.h' -o -iname '*.c' | xargs clang-format -i + ``` + + to automatically format all appropriate files with `clang-format`. + + If you want, you can install a [pre-commit + hook](https://pre-commit.com/) to ensure that your work is correctly + formatted before pushing + + ``` + pre-commit install + ``` + + Will use the `.pre-commit-config.yaml` file. diff --git a/KAT/PQCsignKAT_1138_lvl3.rsp b/KAT/PQCsignKAT_1138_lvl3.rsp deleted file mode 100644 index 33b6c7d..0000000 --- a/KAT/PQCsignKAT_1138_lvl3.rsp +++ /dev/null @@ -1,902 +0,0 @@ -# lvl3 - -count = 0 -seed = 061550234D158C5EC95595FE04EF7A25767F2E24CC2BC479D09D86DC9ABCFDE7056A8C266F9EF97ED08541DBD2E1FFA1 -mlen = 33 -msg = D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8 -pk = C5CD571DF86630A93C72B41595D1FC20D258095588CB6409FEA9A4E183B866C77D2F423A7559FB3D6E1ADF0604B36802DDC5C9420E8EC55D547FB02B83346DC9CC1857EB589EE94E666B37D8C5F2DF6BBBD3EAE8E28078D54659765E2FCFCD00 -sk = C5CD571DF86630A93C72B41595D1FC20D258095588CB6409FEA9A4E183B866C77D2F423A7559FB3D6E1ADF0604B36802DDC5C9420E8EC55D547FB02B83346DC9CC1857EB589EE94E666B37D8C5F2DF6BBBD3EAE8E28078D54659765E2FCFCD000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A625A3E972588FA81DF7633783A07C1706821432C975D27F15A34FA67B9D225ADACED4DE4B43D8FC47CE7D27ED46915D23B7C424097C49DAF3083D638019A408E2600D00000000000000650856D96EDE15B689CE0AAC09EBD75779A4C3E7816D66392EF00ACA5A174C391ABB6DF1706D1ACE4EC456C71703E733458A34E4A65EE8BD4A590E8FB76BDC3FA51A0200000000000000451F15E02AF5A3796577D51000D0AEDAAD344FB7BD70CE10690A93BFE3EBFE1066B17B6B9F8B1976EC074A00000000000000000000000000000000000000000000000000000000000000D60B8866D7E34F7DC07FD5B384EA6CDAD7E5C33CAC15B2035BB11F6B637C4B61C0C19BF3C2BBD72A141FDC01000000000000000000000000000000000000000000000000000000000000509418E5DABD7787AF06C141853A097DBC384998A77136B9944C8398B09C49587037D8999B47A57622EAF23ADF634F01142EA3263617904DD61CA29F8C0AE547143E5A59F4357EBE87E5C67A3FE28F49AC8BC61CE6938A2976088558AD7EFA025BFC8FB940465800FB71D1347090AD23EEC7F19B6099C5CFC307F271E35830A72081FDDF66E65C398B6844D2008DFF02BC760CD8961696C1C75386B52F814D0B1CBE5101AA668E9E0F8CDBB8515FC443CB82647FDE4DCD0CDF7F59E6A3769B0178F1327684445B4C4CFCD115DA53DA7BE29A03FB454A61DF6C4062E249F6B449DE28C128CF03F15B2B0A50DBBB1D8802106C7086570F99C384EB115DB6C61C70CDBDC68CCA2D8CA3E0BB0ED711224F336FDB396EAA9DECD1F4ADF7B4E71C08003862E5998B4E6417E9B9E8D1BAAA8C9D57D922D52BFC7B865933E315F35367A16A6CA84747373FF1F343EFC250E6E3010A3A303E4C7468D7CD5A4473E2D89D868027B20FF8A65FC28E563B1F9083BBF8ADC8A25587AC8464A9CF2A3064155600495ADE62542A878A3B51E75BA0244679132FCD7C223B3C52292A242C0F834749B30F0FD7C882F14822D713F87FF24D01A217899BD7C71D24DDA2AD2E307ACF65097882D67DE556BBFB89DD329155B8DA34E7F76E8C7DF7850D0F8F0DE667C503EF710825A9E70D2BCF08A2308F2B13DEE2447AE1E82299A8E2DD7D1FE8326A8752FFCDB63FD265CADEF4C36011987D00543309DA51AC698E8EFA3C9E4C425EB7D28F6E8909071453019CB5F15F0FE1152E565E94B48E35129D684C72AF2351010881E4CA2FB863959490737DF96A3AF85123CC5F918BA09B3538C25F8F186B1D29A33E2B24D320411D42E38A79C4DD000933533CBFA2EC6970E8E23EB5E4BE7CAA3C06E43508F0A8F4D1B6374D3F7622B164918A85E81D90B23A7213EF532502 -smlen = 296 -sm = 306CE5F32F4582C3500AF2620155D3E371A3F8F8E97FC2B12201EF741C2EDB2AA406E7E8E55000166D1779123BBDA1EAC94E37015CA5A4EBFF19E4C1A4BF973001B51F41475C42458883DCF70C000FD50A8A817E14ECD7D19C5301F2C0589E87A226D1254C3CB2009EBF2C4AE9900BA151FEB479005B2CBBE93071BB4E3FAC2B3C01E750294D05CC03DA2EC8F20F0013E028CAC06488DDD5BEF3BD005DA9BA82D8F2A214E087844C00658066AA9B238B339B36556B015F8787BE4932E28B70EF6947001AF5C0DF52E41321862E8136000069018C3FEB9FAC4DCF6F4B852C8D42F7A6F0B8A622FEBC42220001B0745E9F8D6E8A54CE67030801F56FA9FE51B512AF06FC50F9EC0AD81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8 - -count = 1 -seed = 64335BF29E5DE62842C941766BA129B0643B5E7121CA26CFC190EC7DC3543830557FDD5C03CF123A456D48EFEA43C868 -mlen = 66 -msg = 225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1AB2568209E46DBA961869C6F83983B17DCD49 -pk = E5FD4F342B0F422134B7E8D38C5338DFF5DBCEC0E4AFC0BA8FEC4277220C660F05E2718D3FE0EB3A7005B89F91FF2C00EEABFA2CF43413F058388EB8B3E080C0A5BD31DDA29DC788F9DE291F88950F249F1A51AEE8C4C5B339B0C359DC855203 -sk = E5FD4F342B0F422134B7E8D38C5338DFF5DBCEC0E4AFC0BA8FEC4277220C660F05E2718D3FE0EB3A7005B89F91FF2C00EEABFA2CF43413F058388EB8B3E080C0A5BD31DDA29DC788F9DE291F88950F249F1A51AEE8C4C5B339B0C359DC8552030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A52C3344510A501811CB798AC8DAC14711D6EB097FAF009BF3A1B8141CCE083ABDDAB4ED5C1370C50932C4B5DC273928E5BA196C1950E7FA49F85EA38C7BEEC52173DAFFFFFFFFFFFFFF9E1D3BBED732E021A1FB542D4A020D029A52871841211ED197616F24DF30BA0B6446824BB3AD87003E82D48E75B3540D14AF7468B1C5624DFC808A52C54A362B1640EAFFFFFFFFFFFFFF6665350E0C47F9FF022FF6DF34538CCF306139A1D8126F5B73A6B7EE558C6B5D1BC14866AB0BFF657348C1FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD509FD98D1C4548514973C2ED7D9BFCD7DAEAF5CCB05A999452ECD9D48C752ED0E1461AC7DA5F0B0768FBD00000000000000000000000000000000000000000000000000000000000000C900EBD4A6094EBE5543787DCA057B49D5DC91A020B27457FDB99947A15B25F0384BA48303699FB8B88993BF95F441035A36007842763F83033067DAA80E9CB82FAC0947588EFCDC0123D879E43C509A7B7F1A3DEB798DBA6DD9E20330832E0006756CF309B94C8BC6750E3FB75851C13AB49815351CB7583F285AF80472564883C5260FDC4F3CC94FD170C9F269B10254D90A9994C9E58ABBCFAC068593FED8017F5F3BF5CB512A7A13D5047996C8FAD15691C1F068AB5500C716530CC46F010F424C440D21BACE88634787A0F937CF74455EA3C708776DCD2E145777E51C5CB79B8A380264966033B955CECC8A9D03BE4132911B318442A0CFBA8B02DE787E9745A7259C426A150C5D6D8B7C68134FE850E387CEA22E0DA3DC1A646668B602173EAAA869901A5A31C8FCFE58B8A8960F1C8C6704CEC475DC316CC7336948A508F4D8C67F86327841F8A441E6779301AABD40CEFA1FFE267F164849CD7302D793309A8FBFC964B0D1353DCA601677DAD3D95AE1785F75FB275DE14C9528FD02D2D0B5C92AE5816755943F84C276CB74B67557D947A4F9A5BBE9CB754FB6958E96C9B4ECF6495A3E42174DED5CFA84031FF1A2BD5F109BA2353CFDCCAD97B370FDF22D3202D8DB09CD539804E51BD4901BE0ADD34390CFD7009365F9D2AE88018C457D02EF0CAEBEE57C4C9A375F8C34BEB7404B563ED437D4D07309DAC04ED0FC599180A11E9920F8282D754A6A6401E778B227A3F47515DCC8130799830BC58484F82132E20BC4073631D9FE7DE4110DF02E27BAAD00E561D66F1A3BEE2B0070131CE2C831E47CB819C67DA1AA1D3459018B1D8BCE7DC8EEF560F03736F7CFD5132FDB0FF3068000BAAA1256671600406E7B6D0EA886E409B3D49D4028055BC736D6F23648251BC7E7F3CC50D46382677533AD7091D021B75DD10C6FF3B903 -smlen = 329 -sm = 8FCDA231661A15C8E995251A009B38ECEE3AADFF1E005733AD01ADDC30B7EF7F4B85F6891ACF00F1394D69FE4F2E94CCCD7DCF01827CB2FD00E50C3A9F8835F3002DFCCF996BE8DF3179A5AC4101B6804A54868C79BB69B3F4890067783728BBF2B47D5D3EA7CF008025879917C609A6CAEEAF48002CDA30B4CBF4A719FBF1A09C018A50B758B842A9E73A0BCFE40107E41555C57661CD9B528D77011275011B2359908F07F3BAB40165C06E6F4A03AC7EE943E08000A291818A5334FB32379334410138C4896BE0D38483304E85D00101CBD6548000E88466AD9BE9809E6E39EC675735611B08D289C01503C23AAA6C1A568089C504DE31012C0928FF52198EE78BC0420F400D225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1AB2568209E46DBA961869C6F83983B17DCD49 - -count = 2 -seed = BFF58FDA9DB4C2D8BD02E4647868D4A2FA12500A65CA4C9F918B505707FA775951018D9149C97D443EA16B07DD68435B -mlen = 99 -msg = 2B8C4B0F29363EAEE469A7E33524538AA066AE98980EAA19D1F10593203DA2143B9E9E1973F7FF0E6C6AAA3C0B900E50D003412EFE96DEECE3046D8C46BC7709228789775ABDF56AED6416C90033780CB7A4984815DA1B14660DCF34AA34BF82CEBBCF -pk = FB8D0F03C7088BC719F4D6602FAAC589D8F1F98CA633CB9AEF846A4178120B978FB0142A835B06807114CCEF22DD5D024463EBD6504E103154EFCBA00D60437CE20090AEB2454382BD32C2C01758951963746523AA80F539820F6FC1E4F91903 -sk = FB8D0F03C7088BC719F4D6602FAAC589D8F1F98CA633CB9AEF846A4178120B978FB0142A835B06807114CCEF22DD5D024463EBD6504E103154EFCBA00D60437CE20090AEB2454382BD32C2C01758951963746523AA80F539820F6FC1E4F9190302000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ADFD9364EE2AE0C2D2CC1C574E299FD3D0BC481BF1951889DC2C4F505B635505BD876C54FCDE57A5573FAD424CECE656BD6F73AC6E9E280AAC2D37F7A431B01834A10000000000000004D347ED377DE046F9CE495D7E5B736DE189BE39343E236EAA39B9CD0BF29F32624F84FC1361A9463D058BA29AFDCDA7DBBDFBD878E8AFAE4E65F0E52EFEAB73EEE93D2FFFFFFFFFFFFFF3D184FC9AB3E0EBE7E4C9EA0BBF076FF95079D3E6A8CBDF1E885CB813C48C6585DAF68B3CC9F290E9DA1B6FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF728581D29F5C1D73C9F1F775A16F37CA612EC250E444F4CE6A7EAA2C2E43A8BD5F9731C578B7D24C9AF6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD60B357ADD7DC9B6013DD6CA3A89EF70D3C84F7000724D1BC69DF4791D58839D8EA5A5EA7E50DA0B61ABCF87ABC1DB03DFCA0132F4D78F8F3923AC500E9C421E031703DA803D6CCD5E0569A8B254DF86980A8164FEC379D0E207C14D774FEE00C0EFEDDBB2F39AFB7FC9DF6ED43DE165228774D52CD0033FC3669442D214A638C680EDB0DB00470B48593ED84FC6F2001956BA48E0F7A7E35BC54E06E441AFFEEB55B73703DA9BE45ACDD50326BD77F901E404DA9F66BAE1666951466921D101FBAAFB4C262AD7207C05C3552559EC186FA35761E616C2EA2BAC6D803D80D89D1839A46C8D2FF39555F99589B18255026E1FFB4D43FF228DDD34680A80D6898E43C1BC2854C30418BE8BA89203B186C49F2092B14A651E6CF16BC280348B0702CEA5847FFA92130E5355AC85916CAEB693A660FF840353F28B71C7119E4AE0DFBB564BC324BE135269F03DE6A1D6B4016368F9B2A31DA13685371FADF898FD3B5FCBB935008F744244B73CBEDE4DE97E97DA443438879914272BE30364D431025A8341F9541488952E3BA60E94337F5CF8D8B41D5C05C41F1245A5EEBB9DD11DED6747A873C001454F975AA8049165017267EBD876841B571B9AAE6F665D3CDBC78A331D089832EEF8BAF74C7C5557A46D2919553C0714196F2EBE3E4E6D8F02440CF01C48883FEFFB96C2FCDD76E4653215A2F267385F333BE18953DB140FDD22A7EE192ED87B1F8BC57F020EBB8202BA028E4E9DEA7FD038CC1D3C6FAD7CB6987450FF11AABA6723969FB46874C875AA1DD2627DF21F83DC2DBC81A2FADE036F55CE1A859502F9006C2505B324E1838938F0109AB4FA5A1C988827C19796F1275FDA23DE311CDA4DCA04D5AFD1CC005A09DE37CA0F6E1FED973850590FE59217A0D5ADF4E30C2D99D2126EF3DD45605E674793E5379BAFD419E21452072101 -smlen = 362 -sm = 7AA1040252794075DC273D0A001F17C530F3EF4BF5A41EB7D901DF6F9DB63BF482507B3F3D83011C205516BF0A12A890FDE8DB00A1667C1121C07606897D055801468FC0DC4F052A4110F5436E0036CA201AD113B48F3717A7FE00FABB1C0B700415D3FAC8FF260035E9ADF3E019A7935A5603D3015FAAA0390BB38372BC4055C801E72DF5F420B3580B943F1CB0017C07CC9D2BAEAB927D5FE3BD008C7D4ECF1FA4EFEC3A6D509901B834727B42D98FD90998E82601E5C695C614C1DE249BB69EDE01AB595AE3379048291764885B000137BA8955B2F3E0F7DD5FD3E058B381E17D83AEC7059C5600231801E00B1CF2584E1120D25A143C00018CDCF2B57A829847400645D6082B8C4B0F29363EAEE469A7E33524538AA066AE98980EAA19D1F10593203DA2143B9E9E1973F7FF0E6C6AAA3C0B900E50D003412EFE96DEECE3046D8C46BC7709228789775ABDF56AED6416C90033780CB7A4984815DA1B14660DCF34AA34BF82CEBBCF - -count = 3 -seed = 58C094D217BC13EDFDBEA57EDBF3A536F8F69FED1D54648CE3D0CCB4847A5C9917C2E2BC4D5F620E937F0D329FCF8A16 -mlen = 132 -msg = 2F7AF5B52A046471EFCD720C9384919BE05A61CDE8E8B01251C5AB885E820FD36ED9FF6FDF45783EC81A86728CBB74B426ADFF96123C08FAC2BC6C58A9C0DD71761292262C65F20DF47751F0831770A6BB7B3760BB7F5EFFFB6E11AC35F353A6F24400B80B287834E92C9CF0D3C949D6DCA31B0B94E0E3312E8BD02174B170C2CA9355FE -pk = 7A231E42490FEB4377812D4A3A18A14886D035BE73F7C34E0C38B8B07CBBDC25081DF000A3C9807C87BB0C650796B60241D12CA461969CE95D9DD6652863D74AEE53A5580B030A0338EACEEDED43C20CBF9D4E313477112CB5D84F5F033F8A03 -sk = 7A231E42490FEB4377812D4A3A18A14886D035BE73F7C34E0C38B8B07CBBDC25081DF000A3C9807C87BB0C650796B60241D12CA461969CE95D9DD6652863D74AEE53A5580B030A0338EACEEDED43C20CBF9D4E313477112CB5D84F5F033F8A030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000685DD55D0659673760302ECB6124DD2C3AF371B9D8C4AAB180DC0BE9D769F6C8BE9BD77634E60C6082B31D3D2E90B7958CD37F9EAA72830F7240CB0224EDDAC340801000000000000000FB56048A0E5790A761D97FE1F487185079BB8733F36A61CEB43A5940DE507E4C8D635A6959BD89FA6B0C970B30172ECF1AEAE2F9E5F60257BE9C1998CF84699279671500000000000000FB1BF171F497ACE6D5B7ED6E8C9968B714991F3C639845846057F7D3A1FDED9C21AE0983965A90C9B3165B00000000000000000000000000000000000000000000000000000000000000C8456E04B73AAF7485C7C8501F9BFADF26FF385FC856D14EE3F427D55CE0B4E6B14E87AAB95A6855DDD13C01000000000000000000000000000000000000000000000000000000000000ADFD06F4238A8FC1E8BFF2EA8CB258841426DD726A3E3D026FDCBECBC365EF5FEA4BDCFDE5268A35F59D91CBB6DF1E027A9ABAA332F4A9634D85D8F2547520C30A2D2AFD7510652D0F892604071610C91F3F2336422B549A6D32E518DD4DDF0099AD647128980E25C7FB0EE152C786824EE28324B671FA80E728D6B8B47B24E8D57CA496A29B46CC019D38EA8DD777037F5BD06EBC7F92DC18146D100E4E5B71DE1B360319ED4127896B95975BF405405F8B1DA4AA2B6D0E2AB27E8D224E89017051EC51101700AB3F263E437CC6EB45EB16F3BFB0E8DA20F4E4D62DE91261CBAE9161C8C3D398CAD9142DDE8EE31201759F3E76EAEC3EEA09D280DD328AD1C0EEF903C8033D992003F29F576D559F51D16F13B0F9E487F679CEC6992D89DE00EDE7C07D134F6D47E0A36DD7392B3C68558F9F9D6E7B6A4B20F35FD3F20719505821935FB08531CAE556098F06A9D703FE7BE795D0EEA931F1AB9F7575C8DF4AE11A434AAB6B1758A441CA85D85AFA7ABF9A76B4B0FF6356F2B05F890B0A130193286130A2A8B876501AB08591FF96461AB342DB05BC1E249F3E0CF908EA4814B6BC34257734FA492503C3B590769403A8793580A0FE75347EC83F053F9F0284261E7EB0B7FB2CE52186453FF90DEA732A0958AA5D2046F8C18211EBA7B3C0016FEBBE37159D80CFFA542A7D5915EFD50C405BAEE4AF1065C601341137F81BB42073991F987DEB6E8185DCB8F0E38C027E4F76782914516826C4053FFAE88DC77026562CEB2F648116247F02F20B4BE1EFFD5DCE15034ED94C063011310BAD007FC0B67B6194FFFC180560DADE6CE9A9E288EEB7E5ADF0F0AA5D5D459B9FAF3EC10C52A0980EC9EA3441A4035069270318E5BCBE688B79E917B767C83D8434823352FA6DC8CA8F8486D76D681850FB92AE99EABA9ED666A594EFD56F444B4F01 -smlen = 395 -sm = 4CB23CF8A6928F98527A1F3E0003FFFCCF382529B6570912C200C5B16BBC22CC874346FAA42A00420BAF6AB17442345A1517F9005C3FCB574331A95834FAECF20180BC164ACD4CEEDBBC1281980190E42D544E26D3113235244700D5CA534653B1AF4CF4FAE8D201FF7A9C5617E1ED30F12A37F6019B5775718E2E1A98A5AEE9A201D46B3540FDAB07800870FDF400DF1BA69AF62A7C4694623FC30016160D4522F55F739898031D00A02936673CAB028691E646240084352B296836F333A0B00BEF011FD32415EB28145827F663D80101A550B1970D7D106B08A28B7661A39529472344A3967F8A7FC20A02508EABF9908E0883CC43158A01679B6E3E0F485C9A14C5565E820B2F7AF5B52A046471EFCD720C9384919BE05A61CDE8E8B01251C5AB885E820FD36ED9FF6FDF45783EC81A86728CBB74B426ADFF96123C08FAC2BC6C58A9C0DD71761292262C65F20DF47751F0831770A6BB7B3760BB7F5EFFFB6E11AC35F353A6F24400B80B287834E92C9CF0D3C949D6DCA31B0B94E0E3312E8BD02174B170C2CA9355FE - -count = 4 -seed = F1902A7815F37BC7F5802D8CBCE5B48D82EB85691718062BFB84D8C06AA41D6E9039B0A107245DAFA4EC109A57332914 -mlen = 165 -msg = 1CDF0AE1124780A8FF00318F779A3B86B3504D059CA7AB3FE4D6EAE9FD46428D1DABB704C0735A8FE8708F409741017B723D9A304E54FDC5789A7B0748C2464B7308AC9665115644C569AE253D5205751342574C03346DDDC1950A6273546616B96D0C5ECE0A044AF0EDEFBE445F9AE37DA5AFB8D22A56D9FD1801425A0A276F48431D7AF039521E549551481391FE5F4EBFB7644D9F9782D83A95137E84EA3AEB3C2F8099 -pk = 5401A37B4D8E4EDA5DF9D4A08D36E5289D7E44799C6B30F66E811ED3BF3A4B2322F510DD523E435D26E174ED17F7BF01DFFE3B0C958A640C3860D28F573DF0616C5F5DCCFF391CE8ACFBEAFE9F648984597E3984A6680952F8D184EF4EB50303 -sk = 5401A37B4D8E4EDA5DF9D4A08D36E5289D7E44799C6B30F66E811ED3BF3A4B2322F510DD523E435D26E174ED17F7BF01DFFE3B0C958A640C3860D28F573DF0616C5F5DCCFF391CE8ACFBEAFE9F648984597E3984A6680952F8D184EF4EB50303020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095FEC774BB3782121B099DCBAC921C06BB463FBE6143422113DD42B094941EB6E68250EB9B322AED968B35F8D8D58F7A0CA442EEAD2EBD53978A25EB43B88E8726902E00000000000000D42C84692991610AF7E489990866BFC2693238398B8181285EF8AF1531C739018B1E8EBCE88B6CF94ED38DC72654AE2D5DA9EBEC15975BB9AA6520BDECEB1D562CC217000000000000006CAF7B491A4A4174004B109166E17FF8B2F46064297021B0CF725EBE935765B3C81EEAD41CD3FA615812E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6BD8C742547D128FFAD1C76F828EC115C706B0B6F897D737FA29244CA2F8B972EF28EE3C63760ED814489E0000000000000000000000000000000000000000000000000000000000000008E9AE2624801BB1BC845740CDDEEBF74AC98E5EA2974D04D97F43BE5AF148493AFCF52254FF30085A8417A139908302E4BFE270250FD2340E793E5E07F787B26930D49E7566A0CD59B0BAF6448B8C5CC55A6FCE796D7257015A3A37FAD03A01E92EB62C92B1D9DD904464A6C797C25573F104C51F14B1902F3B27DFA8BA4F34E04616A964AD4B6724C7D199489E180022F48AE78E2CBF4C980EBAE727D267E59A0DD250A9A4F355BF9A7918A0226D8FFCD4C61FB4045B94EA9BCBFE1D6EC101E86C2288A5767E2EAF7E28C65C990B67ED794F2F94ADD9309E2EDA6035A74A9C8E80F6A9329DCDC0FAF5C99B28A67B00F18C76AB5DAEE08560A2AA8F1AC1BF82F66A3DB460F3BE684F6592028F10FF24FF4A9765312388A23905F7EE505D9C02820D50F7579D1B4221CBCE4CF3B58D7F47177E54F34C49BA35D5CD696E1FDFBE1FE504DCF032AAB07183D2BC79C85F00FC460B48F874FB58D7FD4C0AFF111E696AD371D87D364A773B8164A12502A6C11BDBFF65D5D04C85FF0D3A1ADFFEFF008EF61B1EA762AFF46CCDE80D6FD4294802B522FB3692964FF107569A59FCE82902DC2EDF0FBED1EB2439BA87FC0E6D00941B9140730CF53B84CA3D2767A6EBBEF69C965E8FD9D848792894ADA0A3EFB901F410CF23AC99372035F1D2D5CD5502D48401424339458CB3522C5DC4C13F7DCB4E6FF256E9521A0A6042CF1AB822C7664E9FA22B8E99774AE22B69280E26011AAF17D7A713C89444CE78473B5F5DCACB15574C21C66E5D38875206D3257AC6FB5B2785F1BF49E4B6B1B2BEAE675C034580188D0F3742D4273D7F6F32EE2FD6D08449F0EDBCF57D0BFA4F5BE2806117BAC8956867028552715C0CF37CF5BD00B3E8FDD2883A7541EF7F93606DACF87FB45052FA1C6E182293CE5BBDF65ABA434D1E129EF83BE279E7112BF0B0185A01 -smlen = 428 -sm = 98C00ADC55617000C2EC326100509BFF0E70FC796A6D8B44B601B02FA0B6A198DD451F8AE60F01CE55166BF95FF680691C856F011BD864ED6CFA5EEA69B9908300D43F4A75C44317B482FA120301FAB87128AC75E45AE547EB12003C065D5E8D9A62F076C39AD900B90EFD85B9200ADCEEF413DB010C8C0DAAE962230C8400B489007F284F7878B9778CA498E63F0061D68A29D9B80139AE54D57B0161C0F41BAED5178180A2DBAF0066ED0855460C5179A24DF4AD0090BEB7AC935ADF0710845416002E35006C99FA81A735CC46DC0001ABC148656A573AD585AF9CA2E23610EBF0FA655E85286BD0910F023C81EEB4E2CFFED04C5FC9C101B6897F0DB42AA195F4AC5F1169021CDF0AE1124780A8FF00318F779A3B86B3504D059CA7AB3FE4D6EAE9FD46428D1DABB704C0735A8FE8708F409741017B723D9A304E54FDC5789A7B0748C2464B7308AC9665115644C569AE253D5205751342574C03346DDDC1950A6273546616B96D0C5ECE0A044AF0EDEFBE445F9AE37DA5AFB8D22A56D9FD1801425A0A276F48431D7AF039521E549551481391FE5F4EBFB7644D9F9782D83A95137E84EA3AEB3C2F8099 - -count = 5 -seed = 75224ECC026C18159FF92256844D0ADF953F0A4DD8D74D4EBF1DC5EE8F5630B011A447FD4DC34A2404D620CA0E1F273E -mlen = 198 -msg = DBE5B6C299B44F8D60FA972A336DF789EF4534EC9BA90DF92AD401D1907951EB6285EDA8F134277AB0A1145001C34E392187122506AA2DBB8617D7943A129EB5C07DF133D7CCDE94A7CB7F1795C62493ED375353D1F044257DA799F7D112C174FBC35687E2F87FEFBE2D83D29D7314B30A749FE41B1B81095638F112BC4563420AF235280E466FFBE7050C4937C60FC18D1A6025BCBD489F0C538E088E906ABE8597E2C8EBB64F01D225C847AAE4B77BAE6EBA9269962C4B94A9732CEAA2CB4093D442FFBCDD -pk = 22726A97C996F2F6685827CFD87CB205B0AB116B2D39BABBFAA65FAB5DFECC4C6035826AC3831A98CE25885B8FB847030F4ABE7C54041E3A52F58355D38D97E8D1D4CBB064EF94E31287EBBFA99AAA2B67A8650D9850EF6F33727210AE58BA00 -sk = 22726A97C996F2F6685827CFD87CB205B0AB116B2D39BABBFAA65FAB5DFECC4C6035826AC3831A98CE25885B8FB847030F4ABE7C54041E3A52F58355D38D97E8D1D4CBB064EF94E31287EBBFA99AAA2B67A8650D9850EF6F33727210AE58BA0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009C2B4768B32E2EDD6E50895160435C13398A6677588B8C4E5122C0EB48E0FD00DAB3852DADFC006EB8BE4AA64AD3B5CD17DCFF427BD509268FB87DD054E4346C01D3010000000000000047729C5E8621D1C843E951FBC44967642DB82C25B3AB369F3A080B3F74002F92DF62FDDDC82C389B0F72E5D63F0B89397A5559B922064136474ED9DA1AF7C877F0B90600000000000000475557BCA8B2B9FA25ADC3E7CB23E0B4C96D006AFE89E0EC95C66FD227FD17C39A769A5F0DB8F233C3CD9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC5C830E42852204E4D3F49A24236D0BD845AA6ADCE5EA56C3DD8EA426BC8E9AD70287AAD27AC73A4BC57001000000000000000000000000000000000000000000000000000000000000E7721641E7D148C0A5696B2860DB5B198E0C9F157F5014DC4CF220C562671799BCEB86F849D7C616AA8B2406F0321400A180850CDE42DF4186395022BDE2670A1FB98762A3AE3DF9A28BFE5D78A14580EB785BCEE7584B039CE87E8FDC235603324DB484E1320B1616BCE540C030A81FB904521F6E78E8532BB8AE1101F9CB7A0A636E1E4AC3E11FA75FF95000D4B80270F7F104FD976A10A802E1ED1B4F52B08A73D2898B94D76A9FAF2F7BED3A6C00C2582D55C2E464129DC547FCC7FDBB0143E783BF83C0DF124DB5038E154F8C66064D946E976C09C91DC92E7421F533C85C47F56D36487F746FB11BFC7912970012D896B3715E624A1B59F9571D177AB67ACB97ED7F047794C0D7C6D0D44AEEF7E2981675B11FB5106A1C42BFB399250290FCB1FA3195EC33EC0DE04A277A509EE1DC7E7636851F4286F00D847AD4D43040D5F7F5572CDCDAEF12419D1F4C12006DAD5F60A523E7095DDCA48430A8EA1A46B5511434DB642E6A064FFB0893BC4FB7B038E0A0B5C890D4FFE5B5682A670190F6173C2359065368D2F7B488B28D07F8324FB1A50C0D761B70D5B0A54E8A42D5699B5058FB2E6D6429C69CD5F8BD023545F2FB226D0381A32414FB25A2E2C47CF82C9110A6A57AB757E1E2169E9B34EE7B55002DB2F655CBC606FF5FCDC10268C798D36862A13B13AC66531B02EB4F673827D5545D6DA4FB75D99E3DBDA74719FC8E3326B7F835CBE378529A61C303FD6B6F6EC6BEC70ECB7E6BE5241E9AAA0E0246779CAA7B76A8E647104B87461D1C49628E5D8D5573A6702B15289747013B708F63488F26343DB058B8F97F71491AA2910A856578BC57ED3CF0B8A8A4439DFD85341F51631CE9D36ABD8C4A7C02A3B9F5ED2DDF224DD4C41D03E0C52D8902F77C64835EA0C1730C384CC47D2B2CC6DEE0DE662940138A93BF7E4D99AB01 -smlen = 461 -sm = 3CE3736EA44AD0CED73C5BC500E75ACFB1575ACB39AA97654C019A310B02655D991709A90FBE0060CFA34A16E8A6A10C3C31C1001CC45D9071ACCA6348771C18012BDF3DA51765112F67CBE8CE005F2E6BCA6DB2F46ECF04A125008743C868FB85AE2745EF3B99007A903D3FD9E0C30980E2EB6C016989B6CCA2118E0E38116B580141E98B6FCD2C251C99FF05B8014ACF72C299D3B1E329BA940B00E11C6B639AFA2F5E5A5FA5BE00CC4CEC41F385719B7A0FD45D01E9A50FD324F2D9D29309537900545DA94F8001CBF33CB3356E000123DDA4EB7C2B6C7066411067F5EE4670FA2ED8F9E56BB78A251303122DE8CBC015286433036DA600DAD294C9B1305FCDB4EB7C42A601DBE5B6C299B44F8D60FA972A336DF789EF4534EC9BA90DF92AD401D1907951EB6285EDA8F134277AB0A1145001C34E392187122506AA2DBB8617D7943A129EB5C07DF133D7CCDE94A7CB7F1795C62493ED375353D1F044257DA799F7D112C174FBC35687E2F87FEFBE2D83D29D7314B30A749FE41B1B81095638F112BC4563420AF235280E466FFBE7050C4937C60FC18D1A6025BCBD489F0C538E088E906ABE8597E2C8EBB64F01D225C847AAE4B77BAE6EBA9269962C4B94A9732CEAA2CB4093D442FFBCDD - -count = 6 -seed = 447F03C8CD27EDAA1FA0436DA492812F57AC946479A9F1F90EC4F5E913A05F8AB0DD7645026A96510F6D40AF05D85B07 -mlen = 231 -msg = 0073BEE97FC97C0FBC750D474AEB93189F061E1A5CF6600C04FB0464338EC7E85252F94FCBC7B2BD00E438480D9AF3ADD92A92E3E2E8ACB55077C3278FC7503988A76E9B6062996B20889AA55B343D5A003C8A8852D738F955799FA3426BE5CCD3AA6B6EDA04D4884941FFC0B69C5ACF12B347A74D0580CC3335BA816200F87674A4C1D98097C70F2F27C74E94A661850610ECF4847AB5B58344F958C5719E06BA396225BBE21ACB0FDC512B885D391E11B0C0ED5CE6B5DD8FAFF91F50025C69D43072F7706D80D9FD786E1104125D79A5F4B5FD838815D44FC8B1AB678078CC174DDE970D448B -pk = 1CDB64FFB7E1DADF70A2289611A0B768AF64EF0016648ACFDE96F6980FBD43CA2A660A8B97C2294ABF098D0D508F30001633D00212B782F833C978CB13796B7945473D5075C200393E99DCEA32268B961D6161A8CB25D669FF2D6DE55D3F9903 -sk = 1CDB64FFB7E1DADF70A2289611A0B768AF64EF0016648ACFDE96F6980FBD43CA2A660A8B97C2294ABF098D0D508F30001633D00212B782F833C978CB13796B7945473D5075C200393E99DCEA32268B961D6161A8CB25D669FF2D6DE55D3F990302000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007BA6362853E5F36DE2A5F667D0B5985889B50B598CF0225C06AFCA71FD1C4FCBF2964E2757C7C2826C2D1CF2AF3212BECF7B87187A070DA023C06F44A0114AFAD8DA2D000000000000009E017023046E388002AD167C7AFF386521275EE9C5E98CE521506BD854C00DFA1ACD1DB0A6346EFBEE1A83486F6970AD5D2825E564CFB5213040A069AC84365EFDDDF1FFFFFFFFFFFFFFEA215A1FEE48429CD6C8A14F0440202444CE08550CC723C8239B069CF47A26584831ED665C620B1315F8C8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B494138C9176F2F23B66670C35B22AFEF340741A5EF32A9AA703BB5321C85AE17BBDEE47C4680271A3634010000000000000000000000000000000000000000000000000000000000001BEA9A159D03DB96C1C84CEF7F39AEB6B867E1E14BA4BDCCD9F7305EE7508E76A9C1A9C616774686123B8B841C82A303D2D6393E67A4ABAF1EEE74DBA0FE35507B637AB9ED3BF10F9B2AFBAB382061BA81476B7C98042A685491221526124E036C923D42C5B9114B6B5E0FC313A6A19EE7D915A162C7BB5AD1174EB4C0A5B7A1AA1A3AD8522FD4C404EEA7CA14A951024DA6EA4786373D6AF20A91FF4D0F1583749CB36AE15838CBCD5BE42D8F8B52F6391A86C3B388A60F35B09D42D4AB1E030E30627A4D0289DDE7129506952064B24F7D8B52ABE404A70B94F92A377238F5A43EA445C466CA6090BAF0F4D105D900DBF958CF2DA2EFBF73F39A92A133068D68B9711863F9A4857DDB9F2A46AC918D52D18752BB8947184875E364A893AC01ED49EABAAFE3C623B74E2A3FBB0CAB447AEB30443841362125BFCC9C35D3D49F8E5525885CACB290D328C9F380DCF101528683B3350CABB0B7E87EC6A3FF9E39D44791F433969B1AF46DC5BA9636B1FD5A4FC9CBCD9D0461957FA97E350B08030E708092EE3CC0E4F04D6708FBFCCA9EAE3C91910F1C80573308D0E82F74348D559B994F2E7665AEF616067CD16E3702C5D5BE19F317F6D5A09B44F9D7530787FF8A0B6E9FAC5ED16BF27337F146FD152C2B61377562D2BCC0B250EFC5D77B03B57F0824889A188308465194284BFABF9682A2D6BB20EF5A581240ABEA17845867DB878BDA6BC0A5F926416889F90600F0259AD9C9E5C7B576350B3CA5EF20811B4DA5452FB62BCE686B0A399A5EEC43A34C533F9B6D60E43F61948F1512A4008E33DF33CE467B56C62F49AA90CEFE4DFFAF294373B3CF91E85EC34CE15E7559F60DDE356EEAACA94013FDD6080EB00224E9CABA4D37F39E50130D6D972A30DDCB32868D731081CEED4270A3972FCB9CE9B699A0284DF0858B152B98DBD0D903 -smlen = 494 -sm = 5C8F77CC8AB52F7DA8019BC500135EF2032B4BB046A019FB7F010CF2E5FE40B1924DD42595F8008913CE7404D9219D86676567008E9139910D32F04EF5618FD20130FBCA8240CF0462C9510C5B00D562B33FEB6483DDB9646CDE00F48EC4A5A6C5EDD2839F894E00EF96CCF5948DC1FBCC73633801991232646118E943059781C301A3AAAEAC273389D46B06A1470053281AF1A36984E26AB7D7230022907F0EB5773EEC3E4630EA01931E22A9391B987C50DC324C0021FEA398C942DFE9FF50B3B90110143EE7FFC3B77F30EC05AA0101292E524EC41056D9E77C4B4A8A2D52C595AF631AD11E513B421402FE896C39972EB11A13106DBF00C62D9948E50FC3122FD372AE37050073BEE97FC97C0FBC750D474AEB93189F061E1A5CF6600C04FB0464338EC7E85252F94FCBC7B2BD00E438480D9AF3ADD92A92E3E2E8ACB55077C3278FC7503988A76E9B6062996B20889AA55B343D5A003C8A8852D738F955799FA3426BE5CCD3AA6B6EDA04D4884941FFC0B69C5ACF12B347A74D0580CC3335BA816200F87674A4C1D98097C70F2F27C74E94A661850610ECF4847AB5B58344F958C5719E06BA396225BBE21ACB0FDC512B885D391E11B0C0ED5CE6B5DD8FAFF91F50025C69D43072F7706D80D9FD786E1104125D79A5F4B5FD838815D44FC8B1AB678078CC174DDE970D448B - -count = 7 -seed = 8C151C556DA912A82DEB32144C8A8C9090CFAF5C12AB822AC3C72618837A41C2453B715EEFF3724CAFE69B1ADCAE9DDA -mlen = 264 -msg = A1586245D81F96BD8EE81AA30F10C0ADB343D74CF72C4DFF71550C12873AF89FA1874D4731C996243C3749AF3F6188FFE9FA45430549045134EB29EF3CEC37E72904AA082B1C6161E6B52361E49AF4933A8D8C0734F21CAFD7467B0C02876F43211D6122E3E735FE36064DF7A0C91449237C2BC7C3A78AC7BB0F9567F2576F05802C872ADF183A87AA3B8217188F2F3535F877724F35B29E545DE4BCF258F13BBC7EDD8C6587F733C9691F74B4151CF8C060C3AE9E8D49FE7C77BF477DC9F23FD0F0B67320275529034B84F94176730923C03AA50F9584D9C2D60B8DCCF85A13F243F30A51ABEFBBF2CDA602BF3D75E849EB92422B808416C7E56B046CE38E4677AD24D23D7237A9 -pk = 866BE432A05A94254CC007E4B30043056B3034AF8E2D79B8C1B636E19B6F31C85C14E4B1F9F901F94E741453A27A4F020BEA7DE808280DC63399BAC0B5C0005E597B99822FD0E8C5600670E6296B0BB669A924C2211B814F7872E49731D30A03 -sk = 866BE432A05A94254CC007E4B30043056B3034AF8E2D79B8C1B636E19B6F31C85C14E4B1F9F901F94E741453A27A4F020BEA7DE808280DC63399BAC0B5C0005E597B99822FD0E8C5600670E6296B0BB669A924C2211B814F7872E49731D30A0302000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001D1047606FBE743FFCF572596D16D3D348430C98F5D629A9499684B899F96F6993D26EC3FEC7AB63D13D115A35B278F6744778962DB772E6F123166B89BBB0E6E0C31D000000000000002E12A6FF081E3851FA1475398B9C687BC422C4FE623692028F2A5B4517536686FB2620E2372267944478C19D293C071AD10FF3E947BD6C0E83C54CFF2FEAADE0F8F5D4FFFFFFFFFFFFFFA6C9A1971D7CBDA4BA942CC6B1D13842A804A0F59D3EFA7C04FAE1106AD3EBB7B96FC825A8C88B33EF8F4C000000000000000000000000000000000000000000000000000000000000002D4A0EB5A629529381E97F97F24C3AE21B827F15AB5180A2DD360F48200236FA17D11B5F9AC58B9C6928A600000000000000000000000000000000000000000000000000000000000000B889B33024A80C46C2717D6EC99758CDD4A9FA82FDC806F68A4DEF6A7416A440C9EDC46D2EA33895531B72B8558A1600B7D140AB5C364FE7415720E73ADAAF510B2C05ED61C0F4DFFFFFE2D409E3516C6ED37E45C26096FDC0EB4D653CEE0603BA33279AE035DC03160631CAB97E0A7221B7F0A167F13792B09B0DCF33A3C406784693E6B9D0392CF55FA20F37FB3B00ACB8B6754DA69A1BA1FF2D384F5B39E5D0AEA0EDC122B1DCE25A04F0EB294DC3DF9B11681B171A104890A1D26BB44F02A7643497C08B0E4F24928F7455BE72D14A1261F3AB8C649F9C64BA1999A5EB1BE7538AB36FDA74BFC5937711640C3000BD2963A33F9C63115E8C8698950E2EE0D1DE202ECF7CE31B2CE63060ED1E41E68F8252A6228840E57B7D634072B744011AD27E3C6B9BA714CD6DA447F7DF1B6FE27EA1DD51B5B8B8CA7B2B4F91461C858F91357089280B5A18288257F95CC703CCBB5C09BEBF518355136F5E0E14302A9AE5F67726F9A062B3C3E7716B2D21004E3EB28FCFCA40785DB564CF1A376B033196310676529245CF9B417A21A16A7CEC4A2CFD01FFE0C6CDE2A371B41806866B85A0460E916B357FFBD54D4E623A020635A8391B67BCDDD561EFBDB583EE07C00912408FF88A0CE41875D41569D22D90F9A3792C0B1185074B01D78AFE68031D18FD566342E0EFA69343BB792807E2827EC0D0FAAECB7E20F168B8AE94F28A4B1130FDB6E1A17601824E53FC3CC201EF27FFECAC03F18D7708B642478EC1666B890741DC0EFF3A98FA04FDE18F1335934319A08B05546F2F5E3DB4F6D51900A46975B555051098736412A49098DA21FBA68A35A5921711699943BE2BC269D20F061A3B7BE5ED0B5551544171592102061F013CD91244207897EAA7E0E3E845B8986BCAD801DD45B7C85D27EBD57A075BFDA012EE85B06E87CEE8976E17E402 -smlen = 527 -sm = 2FE0DB2C3CC984EB3E63163501D083D2022FC57F933C14723D00E33F8A5FEA4C01B885CD1DE90044D627710C3124D460CEC502000C59C3A3EF1B5D1481648CEA01029E8BF8B22004CC5F3B126100ED9A4A61FC29F6FA2A2959C0014F394701FB9E82E5FFB79B6F0040EF2F71DEF2E36EB811482A01ABE1629F0C956BA4B531E57B0084B8F1DB3B4143185F1CBC7C00543AB3239CB29BB58CCCF36301FE546E0C25B8BFECCA0D618100E994DE25B50F1E9A1AE4F2C600787156A2D1413826962CE91700CD305879EE7E22FBA5B1DCF600019144BA9649BE8609E592E9DA1FCBF12C35C0AFEC0579243A5B140242C41D90A65ECD4A21E16FEE0186F85F5EF1F63ACD73A811466009A1586245D81F96BD8EE81AA30F10C0ADB343D74CF72C4DFF71550C12873AF89FA1874D4731C996243C3749AF3F6188FFE9FA45430549045134EB29EF3CEC37E72904AA082B1C6161E6B52361E49AF4933A8D8C0734F21CAFD7467B0C02876F43211D6122E3E735FE36064DF7A0C91449237C2BC7C3A78AC7BB0F9567F2576F05802C872ADF183A87AA3B8217188F2F3535F877724F35B29E545DE4BCF258F13BBC7EDD8C6587F733C9691F74B4151CF8C060C3AE9E8D49FE7C77BF477DC9F23FD0F0B67320275529034B84F94176730923C03AA50F9584D9C2D60B8DCCF85A13F243F30A51ABEFBBF2CDA602BF3D75E849EB92422B808416C7E56B046CE38E4677AD24D23D7237A9 - -count = 8 -seed = 9B42F41492530EAC81992F17613EFDF155F407D7E67F18AE193EDCE714D65D1031E7AD10839AAB46D0850EAF5997AB4D -mlen = 297 -msg = 9366ED7B3B623C411448B634446F1A3FAABDD163A6CC1E2BCAE4A98703CD8CEE441405892FBA051BE2A586A6950A5EF73A255E5F86B0D7212E0C51C3BC79BE4B88E76ED6F043FEF3204FAF044BFB1ED722D61EB5D0B74C66A257E8AC3A2206273C80D2EC2123A4DBB715D60118D99ED7322E38F1562F82379138DA3DDB8BAA7CE61AB729AFC3748C0134633CF45A9973C05C75D04E82F631845427626B5799DC07DDF830BA01E8BC6236BB6D03B37D949DBB29EEC7DFE60FBC17EA590956D251539792016E2A8B01E70476961BC9ADA43CDA682D0CAA4FCC58810BBA1A673EF8F6BC90BAEE701E8E4F7C04A346CA56C7B2862FF57756CE6CD1EE22D677BCDAA896EAE96F87870E032C18B6C6A0C1A191FAE2ED487CE55296CC4B6339EAC9E8A742BD0A44C3525CC750 -pk = 2B8305440715FCF923C30F6F18D37ACB2CC2503366F932586F969E1405ED383A484BC1CDAC048522C8563280205DEF027619C19D0A288D64AC99FDBE1F9E86EDA15EA2AD173635D1EF61EBEA208AFF32F6DD63158BDE47979DF4E4C3C1597001 -sk = 2B8305440715FCF923C30F6F18D37ACB2CC2503366F932586F969E1405ED383A484BC1CDAC048522C8563280205DEF027619C19D0A288D64AC99FDBE1F9E86EDA15EA2AD173635D1EF61EBEA208AFF32F6DD63158BDE47979DF4E4C3C159700102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006798F59D52E0B8107E0AFE7233D6AFDD93206E46EEB17137CD593A40C2DD4CCC39992841A7B82E94E0043F56811FC6C9854C041A73073D0474D3DA7824B32998660C1300000000000000B821BE7E9BFCC97B8042934419F20FE3B9E3E9D063D5611E4E0E2102C2EAEEAE83CA93B23EE91B0E48A21DBB3A7AA660DA81885BB7C7F5EC88ACCB355ED66F6E2B5F2400000000000000548DE0001978FF8EE3C157A7023B56B75DADAF055859A67A8B584B95F82AAA3898DD555B340769F7C839B40000000000000000000000000000000000000000000000000000000000000091FC2F203E6CA400C7CE89A0E528C6583615F5E72A575E0F43EF5E1DA79EF0209FE8DF7B7DFE9763847CE600000000000000000000000000000000000000000000000000000000000000397F00D74816BC72EAADC587F1007FC66A236930C10B84D00004C3B33AA8C564B98BAB92CA9B5EC0407C133BA22D7503424CD18C5A1F65964F91CD127D3F08F3A5EA48B0678BCF27E74DCC3A5469CC733E1B729F0F0F0B06EF31D786C167170006DE0DB6BB80D3269C24D00F7A775AA0542F88138904DDD560B518DFAEC9B2DD9526BED1EF29C82B5ED4E55AD870D603762F45BD1ED46C303D2636EA86AE017450427FD2BB1BFB553325E78C200FBFB91889AE2C58444D2508B439B13FE09100FF268AFB70DC0E2DEB34BFB8E8E9E7AC9159717A47AA8445650869EB7CF7D6B73415072F036D6DD68C7D480ED885CA034CAE7494AA9602D77E52D8B1A941E1EB4104E555724E566DE39A50285823733CE52AF7D45B497C128300F992C951C2039E90212FB1A9215F0A288DD1396A131CA0622730B1BA29FF47711FB153C1EC730CA90FC451D8E0FA9581BECA292EBC003EB4E01EE00744C3D874E7217F471DD7FD4B404018DA1586E8669EE46F82CBF5E6D55EA7B287E39EDB7459FE32063600E5A2A0EFFB613CCC621D654AB5BAE113EE049394594398EFF5797CFF2B8A61C26E796C1FCB75E8AA8B71ABCDBCC088019116FA4E0EAA6C3ABF3745E70CACA8A16CFD982645689F7CAF744651689681F76DE018C776BC458690AA04F9D9F2BF005C75C19A0D43527D2D0C15A189EA9AB759BC556FC64DB8433877F37F25252316F5215A9FA496C07552FC32E4CC8B8103C4127F0605DEF24EC3C54C9C04FEC3FE325C503993ACA805523707CB034CC070002E49B52A1E2E12B5CD87D8757BF1016142BD42823CCECCAA48CDC0671821E9BC69443EDC7A9CA99F08283B3707BE1694432A1174034A2144AC2268288C47003F930B2C6A1DCE7D51B9555784E4C78DDDE8DCAEAEB71550E45815A1B98CDFC50C5807651BB33196E69166E1521FDA01 -smlen = 560 -sm = A5619595B53234C411453D54006A55B3B4DF8BE9D83CE80F040160880B418B62B57FC26879DC01D4A7135A9811ADFF25FF50D500CDF83692B7ECEE464216616A009DFB30FC3AE230E6187761370064AE5B950C637376E5909AB501FF937A926AE50D06A6B5FB9B01BC4380E0A961B385E717F4F1002CD1613A491D8CF4E3D18F790173FFD97128A2E52F4EFCD6F901A4F70C9EA6F17DFAA535CC9D018252A6B8278E32EFECFD18D4016716FBEE67E21DA2931E94EF01073EFC6F6C4C3FDF2CCF4590002B80CCD02E75D3E6EF09985E0101A71ACBE800D520CD8EC039720370538C68C8956C7BE9DCF20E0302B0090B44CFFF7E6B772BEF55010601A62D8A31157397B6A0C3C9069366ED7B3B623C411448B634446F1A3FAABDD163A6CC1E2BCAE4A98703CD8CEE441405892FBA051BE2A586A6950A5EF73A255E5F86B0D7212E0C51C3BC79BE4B88E76ED6F043FEF3204FAF044BFB1ED722D61EB5D0B74C66A257E8AC3A2206273C80D2EC2123A4DBB715D60118D99ED7322E38F1562F82379138DA3DDB8BAA7CE61AB729AFC3748C0134633CF45A9973C05C75D04E82F631845427626B5799DC07DDF830BA01E8BC6236BB6D03B37D949DBB29EEC7DFE60FBC17EA590956D251539792016E2A8B01E70476961BC9ADA43CDA682D0CAA4FCC58810BBA1A673EF8F6BC90BAEE701E8E4F7C04A346CA56C7B2862FF57756CE6CD1EE22D677BCDAA896EAE96F87870E032C18B6C6A0C1A191FAE2ED487CE55296CC4B6339EAC9E8A742BD0A44C3525CC750 - -count = 9 -seed = 11134936880F5A11ED3504CF7B273E55A351FCCB10943BBBD186623EE6C7A13A6565C3080D1F536BFDB018F99C4E46CD -mlen = 330 -msg = 0998114C84F84080E7EEBB47D248980FAC9D28F1ABB6DBAB3DD59A5CFD2C7CFF7F308372874DD5447C7B02E30165501C0C673128E4C543A414222BDF47E7F4E8DCA757B0F4A3281C0D10C4F02AB52AAF5B9A715E012607BA310947A60A5F62D6B8CFA96386D27CFA709189202421C078934AA2D955468E550AD4D0D4ACDD98B168A9568E232192E92789830317FBC959087FFFE353B6C168F3EFBE7164444F1D6CBA5246E31658C65440A841DBA78257E78502843EC1A6E9710229C8EEB85D6CDDC7D543285624AA1F756A5DD4F1A5D4FA52DB8C5C34880ED448FBB6D254509FBEEA0FA022F276B6A66BEF7ABFEA6049FF74291BABE781F718683397077B29FA9E2B46BC6B09251E587CC5B182195DD4060CC4A319BFBE251A5B660A739DFE5D0E5B93F3CB7E440194F1C8BDA922CB1A3EE3D27EDFD61C1D31A7F4534E84889EC83B51F1641892766434 -pk = 9D969E69442572212B591746566C094C298A3C53E8C89D8C1013C18A4CE4B1380B19FCF41197FE1C588A192C61A22A001D1F3889095DD08BC8B2CA69D7445942846C7BDCF5F37E246E4766C7E7171BFD2A0BA1FB8B2B642E1F6A72A777975800 -sk = 9D969E69442572212B591746566C094C298A3C53E8C89D8C1013C18A4CE4B1380B19FCF41197FE1C588A192C61A22A001D1F3889095DD08BC8B2CA69D7445942846C7BDCF5F37E246E4766C7E7171BFD2A0BA1FB8B2B642E1F6A72A77797580002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009EAF38E21AB4854724866EA370C9B87B87B0342C2599299F77690EFDD25800E19DB3721E0993080CCF2C868A0972B41E6C3A68FF1DB3A1B04AA14F35D2AB118A5EF31F00000000000000214CE65D2900082BAE3297F13CBEF6058DE882110E7362223B814F980EF6B086062C161FC27FC34BB320E04409F2374BD327D5F3CA2287C28562E56C0BA14882EE28DEFFFFFFFFFFFFFFF14EA289E6F1C436B9A2FC63D54AAC0989C720F553D2DD0DE37CFEABF4C3755F6460E5698BF32036E00A90FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A9391E5CDC14B3F21BECB93114AFB26B122BE5A35F2330723AD09D44BCCBE6FFF834F659CA478D4C855A5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCDC7EC3B9FC6FED48EAA05AF0CA9498A546B83A1DB7ADAA6650A7D482FF06CD3BDE332BE730ECCAABF3AB174D96DAA037F05A0A9534BE1BBF367CDF3260D80ACCD4BC4245CEC09721D08E3776315684084D2AB4CC88A91681B0E36DA4FD02200D2EB982269B435936444BF813037AB4C33BD3C9DF2B6F84F6B30A40445F791D87012718C85EABFB11E8A2670B51ABF00798A70C645825F97BF0EF458FB8008F6E8CEBB2814DA8CE91CC567923DC697FB3CDDC59A4C62BDFB5EDBB8BFA407FF022E2C24F9A73B1E0AA8309A6BAB5FD8D7F2179EC048C9BA11E9901D70E97DB654AB35AA821675175FD37442DF78585F0249140E02174CD344A6052A10DA2405ECD3F4E305AACC4559B3616994C8926974A82D1612CD68E6D273CAA0F27376C0002B0B972818C040EC81BB4F71B413492BA42585690EEFE3D3E0BC4CDD1EB3E28E92C78E73BF040F57415C3C5C15C1680256F3262DF2204FC4D070672CE8C1F532A543642F111446D289BE597D768D0A68FA242E0D000396798FCC4E7259641F01D67256D4CD88AE1BFBDC3B77CC92176CB64AEA877D18E4AEE3ADBCFF8B7F9B1D5D23B0F2718D789A37FD52EEB1543A0371C9F9A61290A00A2ED5D8A2B513CA12881BB98608457D50C4BC4817253DCDB0F3B5FD0DF11F46DE81712B52435A5E02E7E3C6E6779EF3FCCC82571EB91CF0D12ACE08E9E27C9509373F85A2A2B8A2BA69F17285406592B22288DC1890263B02D16F7E49C91E0EA7E0F7F9FE1EE6CA4CF3275470325CA50FEB1A3F0C7883F6939D927531486002AEC1942D3A17CE43021152E747087E9F11BD8DB8DBEC7B993314224C73CEC8D987F24FA9195E53EAD31E60EA6E3FD37ECF82250E793FE644021B9D4D121844AC3FD76CCE1D813C4DD8210A08501A1C2245057D84AC0827A7339B2C3C383F04FAEFC06AE5B5C3A4C703 -smlen = 593 -sm = F888FEEA4392C1CEA73B8C6B0034C89ACAC73CB8C913B8BEF401B602A67ADA12E56C9248D96401637041C059B243613133E2D30178146D7E4514268B4549FDA201504AC4115770AEB5DA085198009EC3987E83C6109113D7C3E2003218BDDEA4FCF836F7CA084E000B7B6AC7F5F76919F73967E0005FD907329AF2B0D9B8A8674E0082716577ED3F86B0D8192A7201D55813B127FA80EEFC9CB7F701D40A331B65230CD0FC221AFE00CF29D1C4D74BE7BD3D2096BD001DC1C99AF6CC0CF4797D6DA30169E76FC933F56303860AACA500019790355096BD85ABE86630A119AE97B4334C9D89B17B07C3AB0D007C3288A9CEF0F050219D2DBC018A8CA067017A588A60FFAB48D60C0998114C84F84080E7EEBB47D248980FAC9D28F1ABB6DBAB3DD59A5CFD2C7CFF7F308372874DD5447C7B02E30165501C0C673128E4C543A414222BDF47E7F4E8DCA757B0F4A3281C0D10C4F02AB52AAF5B9A715E012607BA310947A60A5F62D6B8CFA96386D27CFA709189202421C078934AA2D955468E550AD4D0D4ACDD98B168A9568E232192E92789830317FBC959087FFFE353B6C168F3EFBE7164444F1D6CBA5246E31658C65440A841DBA78257E78502843EC1A6E9710229C8EEB85D6CDDC7D543285624AA1F756A5DD4F1A5D4FA52DB8C5C34880ED448FBB6D254509FBEEA0FA022F276B6A66BEF7ABFEA6049FF74291BABE781F718683397077B29FA9E2B46BC6B09251E587CC5B182195DD4060CC4A319BFBE251A5B660A739DFE5D0E5B93F3CB7E440194F1C8BDA922CB1A3EE3D27EDFD61C1D31A7F4534E84889EC83B51F1641892766434 - -count = 10 -seed = 98DDA6B97E89A479D5EE214E660DD6B5D8F6CC638A1CD4F462A0EC545F5B0B0A1A403AADF566F7B1C0C5FFCA29B36FCB -mlen = 363 -msg = 4CCA95CB9F254C2EAA7DCFFEF662EE03320D5FC626A6484304BF62FC20F341FBE26E1537D7BD20E95440F7CC95EE84E1297C807A0BC9006DFCD5C22A5C1FC0865F5D70E5D63AD677FFFDEA52BF85D1A4F159F7ED16A745B4D971B620048B5F518EB2DC672CA35022578059E1ADAD7C07FE910A5D566B8321D9A12F34C250BE35CE964DDDEA23C90EA77C9C1BBE3532FEEFDA3637157786EC7D37775AE5CB0BB92EAB45A0FB1E833E8A6F3D06B85946E31A79B64A02B31FA640ED514A85882C89F693A06354DFDDB0B5E23E7792134C69C1D3908882DF3A7694A05B241B87FB2DBD1A4D9F26943B69F3CDF730301663089D1EBFC23299DA21300F735CEDF7B109F3E0BBE273776E6AAFA7054A6CD9682B967EB7903DE549E9558E62DCF3AC444DD7042FEA362EFB555BB97FB464AD7FAEABA3197C14A6740477DB50CE3FB8B762F48F880381D510FCC836E5880B48F08BD6333202E838AB73F2E106CFBFB218AAB802DA8A00F13F78FFB70C -pk = 793B5BA0BC8D543BB3D7028833B0AF7D0ED0616BD6849C0DE8C5F7191898D7EB668C57C635B51BF9EF3CF98ED04ECA020AAC76AED929208B9DABD28AD54A1C50DAD29464AFC9B40926CB7BCAA8820AA30EC49B7A2D561A0F5613B017C120EB00 -sk = 793B5BA0BC8D543BB3D7028833B0AF7D0ED0616BD6849C0DE8C5F7191898D7EB668C57C635B51BF9EF3CF98ED04ECA020AAC76AED929208B9DABD28AD54A1C50DAD29464AFC9B40926CB7BCAA8820AA30EC49B7A2D561A0F5613B017C120EB000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A924780887BEB4D31113FBAF3FF9564BBC6618476D9E655D48F39F40D85F017DBABCEF5316597F9A5AB013B1485C637FE631E92D24A2132BF2C83460EAD9D20F709715000000000000003CEB8C794E18265D4FE8B93762895A92D2D70D785D375566FE43455EC24BCD80C8B73394BF6A3131F40B2C80BD40A6EAA6430951241B316C59271B6E798271DF1F90DDFFFFFFFFFFFFFF34639C01BC10FF81B4CF2D71C38E03AAFDBCE734BA7DE4F0AADD543CDF950D7B4BC1B9374B23C38963141600000000000000000000000000000000000000000000000000000000000000971F2061EEA47FA9E65131D34F63988E5A006D8BA7568E51C17E5FBB6FE089B2C1FA41A08C909778E4942FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1924B5C5B9F242A8DE89D383C9E244A07E28BE8291B64AF362B685CCB5AF925EE4C06FE189784CFF9FD4B3D5BCD2ED00F76A0A4112E60807AD8491F7AAFC52992C04A5AFFE463E09AF07130C161704BE97F597005A581D1D7008BAFCCB4FA002840570A442EAB4AC1725EEFE9CBA1DC95BDC0AD8143FFE027DE9A3FEBADED13CB6EC80894E43DAFCD654B4230A9F2300115EE3F284B97A7DD8706386ECEB68B7234C8DBB6D82EF0BB32FA748B8D2CBF2B858A51AA8982A2077B3C9FC594EC900CC19560B52B2AB9D5DD042280EE90B9898918D7496700984D0BF0EBCF510325FE552B3FD649D9B10D17EA4EEF99388025D557A2738703FF1F0D2A0A2736B0B4252809AC67CCBFE1928A9CA41ADD60A10CCC50DDAAFD1EC4CC8166A10B1BFCB0099C0EFE71D4FEB9D4C076B41C3413EFBDA7376921C4E38D3D25C1D82CA7631C00A157F584396ACF1768F639435FF1D01B0667BB297675FE7AD6993D1F95BEA111B3CD28405850743485C8E9A2714A26B11B46904DCECD518A6AFE7FED5801A008E926A1F3327CA5EF423099F15F68987D5B27DF15E162C812CB06A8D4A12A4C93F2F02DD009E8B95B5374AAB3898D5019B6F1690E28004DF8AFB3EE911E79E6CBD7F1E79001794D006ADE334C93C30D09965CB0C1F2ADE9578DF09E16468D6020B67BF2E648FF115D640290D46D9594146C67C2942E4F5DFF7CA911C6DE7581BEEA69CCFD43CF8B94CE3AC1B8F2B1E031E1ED8BBE6499487E1DD5EA8F5D2D3A5E513F95574EAC1BACE0BC59CBFF466BD5CDDC6DC3F1FD68953D405D3FC225C0152E1CF5BE6687E7B59123A91AFBA1567893745F960C6E6AA75DCFE4256A4D510DFB8E9FCDE030A03409D18B1A240EF01655C664F793AF086B7D79FB256DDA01D684F908D7E69EF45262526841C06EE9FDF715BA2B7E86EC96CF221B4CF750703 -smlen = 626 -sm = B14015330240C36212CE676C01374A01A4413AE73B631CA3AD0093FE9598864C727FCEB0E3DF00B4772D1D9964046975DCB97800778FE078822F60AE0032488201118D18A9732CCD11DDEFDC3D0054DE8F1F36EA25E21965112200099FA2D97A2B2B5CF7CB75850094F041853084EF431EBADF96011186AA36F9341146F2BD4B4E010582A5648692544332B6FEF300B085BB3D3D10560F14A5B47D00446E9B0112141F717E835649005CF38D984BF0F2C92C78DD060140AB6BAE1C93453CE333955001E9C0002F1B02268C4B875570000183408CDE44C1647DE2BE22FF05DB147DA806D4D5D1565A143A0C03CA6D668A05A4FCCC9D8A1F9801AA01764B4A82EB5BEC289A70B6084CCA95CB9F254C2EAA7DCFFEF662EE03320D5FC626A6484304BF62FC20F341FBE26E1537D7BD20E95440F7CC95EE84E1297C807A0BC9006DFCD5C22A5C1FC0865F5D70E5D63AD677FFFDEA52BF85D1A4F159F7ED16A745B4D971B620048B5F518EB2DC672CA35022578059E1ADAD7C07FE910A5D566B8321D9A12F34C250BE35CE964DDDEA23C90EA77C9C1BBE3532FEEFDA3637157786EC7D37775AE5CB0BB92EAB45A0FB1E833E8A6F3D06B85946E31A79B64A02B31FA640ED514A85882C89F693A06354DFDDB0B5E23E7792134C69C1D3908882DF3A7694A05B241B87FB2DBD1A4D9F26943B69F3CDF730301663089D1EBFC23299DA21300F735CEDF7B109F3E0BBE273776E6AAFA7054A6CD9682B967EB7903DE549E9558E62DCF3AC444DD7042FEA362EFB555BB97FB464AD7FAEABA3197C14A6740477DB50CE3FB8B762F48F880381D510FCC836E5880B48F08BD6333202E838AB73F2E106CFBFB218AAB802DA8A00F13F78FFB70C - -count = 11 -seed = D34A0AAD27ECAD31A5E08E9A2D7901A9B85F864D9B1B46F40CDCA0B3615B2CBA04EF82AD7BD8CF627C3E861477030BE2 -mlen = 396 -msg = 5C4B2E1A344DA1418B0F4BE3FD99505FC30F2A1E5B696E943BEE2451D7B268F722E04F8E00FDD9E1A470F8C977A6D45A5F621B8815E352FA14F64977D1FA08082A48AF495719EA6AC1C0B3D898603B4CF7EC88E68DD7190884382896D953D612CC21ABECFB01A04A1BB1BBE8986D34625756396CCD84BD1A6B5454DDA98824CD4844D98F356AB485EEB19F9196ABB1C3088C0C3C5846C88760B696D91A232D6F4CFFC85BFF33DE1A3433A27A209A461FCF37F2289F98BEA7CCF183DB1FC42A7EDF958E7913F8711DC375E43F09BE7C7A2C2B1318AE2A9CF5988FBC2CE0735A2CD9FB6C8496C34406C538C01BD494193240BFF947FED47B7CCE99A1747973F1FAA5223AC564BBA0CA8973D1310B5BFA1452CACE9110BC22A8D4080A8BAAA8ADFA3CFB6685679B648484E3A43F9B1B2531949BBB8FAE1846F6D45D9272FC2CAA2913B5D9F8D322E9B18A685122D74634C60730C101578BEF2480711FEFFE02123E76D6C846559E2EA99A98923EF095630102A5573EF027E0AB6E52555A9EDE0D15A73C8B2FEF87CA6FD9F903F0 -pk = 6FACD3337F04F658AA05E91CF9F2809996363A5064A5C543F980F0E40B2D89D5660682AD44D74983B43391756BBBF100CF76F9CC3A5691F24FFBE443EE73D9EDB317CD0AFA0ED99EA0678C3506995E523EA5E23A7B0399901B20586A67EBA000 -sk = 6FACD3337F04F658AA05E91CF9F2809996363A5064A5C543F980F0E40B2D89D5660682AD44D74983B43391756BBBF100CF76F9CC3A5691F24FFBE443EE73D9EDB317CD0AFA0ED99EA0678C3506995E523EA5E23A7B0399901B20586A67EBA0000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730C8995A1B0A0A99E129FC8B82CDDDFECDE6C33B389DED4B1BAC853B58D9CD3B27BE1199FA0B0297CBDB2BFCCADA438B8ABD4642F5B62CC0CDB35B00A9C3868EB7019000000000000002AC5DEA65216A5A8F18AF6087B2FA3CF199926811DC2BC8DEE79AB0897F59BE0F28417685916143F2720F8373AC09B8DE321042586B74666D7022BF2DD1E43E47293F7FFFFFFFFFFFFFFFEB18C4A0587D53104765A2DC66EE54357715A8A57353FBC1918B8CC8C46E777CF6AD68F86BE289D369778010000000000000000000000000000000000000000000000000000000000003D70E60720C7A448D270955D117CDD1DFD9AEC0DFF90D99BFD72B445F11A5C378277AEDE1BAE9832EB65E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF624D2B8047A262CC0F7BCFA49784F385C63A5882341ECB2D8A680D511BEC97A82CAD972CCB806037F4DB37EA34424A02A635B6293316E9D1F932D69C245D4DE744AE435148BD51D2F19D5EF2FE76CCC4872FE4776B4A3247C870E7E824A00900565FAF85798A02FF87B0EFD16D913AAE8DCEC6C261896BC6919A851B8E4D856DF815B58DA3999B406ABEB1AB90955902C4BB2A7C76E73563DE18EE91428691FF705E388785A77A722777BCFE157035A7055194769A737444E84BE5B0651524028CDF160BB93DA47EA5FE4BF5383FB59858EF3C598B1DFC2705465A8D7862B1C2889EE5EAC9C785BDF35CE4BA95D4A1039C838935474D8CEBC901BA62F63348186CB5D8266BC36A0597EF35552FF41CB59142CAEEE2AE66B5C1FA556035CBC103AE9ED6680DA52555DDDAC74288D5FF5DE25F50467C0DA74863210F24722C005F8479CAA9D9CB71731AE1B46466AC4102DA13DCED6E5E6A15AB31202FB2573EBA69EA2E4FCDC9A0276F3CA8DDA89F088671A0E48771CD80DE30D961B1D77BD100DA3538D4EE89C88A0FAC4EC799B233AABDB26D1DAB5971914BA3FF893F9985F5D2797D5B284E3676D4CF804E8D052C019A8176724BABEACEEB8E6DD1F2B38BE8960F347F3A79C765D6A7E94DF73CB26263A4788CB6B2487B3B030954CB8EA70229D464BA6104A9707A9DB6E820D27AE73F2E2017D8ACFF63C8C67271A683D01C601126856CFDA13DD5334B196F21A800A789BA732B105DEA4133D2AD35EB4267CDABD3813DB2EAB7925A654B7A515EC232856C6A05A84BC110FBBB84EE52F5013B68E9EF17496AF3C5496F7FBD38403DB8A109CC635E78B6B870546A8B06A2EB15CAEADD318377C43EBABBCB8CC6CD005A2CFE711E4EBD930CCC710A0A3B9667090CFFFB68DDCAC30AA3F61629ED0E85EE7699A70BDAB516BDC8C8755EE2D703 -smlen = 659 -sm = 768CBBD7750DBE7FFE26754501CFC02B4B8E461FC65D01D6EA012BE45BC54EC36E5D0EBA83260048222EE4459349717BDE997A0131CE0A9E2B921BE212572C05010735DD1ADDD43395ECB379380041BD49BED9ABDAFE0C213E78006169E6C57418BBE1FC09E742018D2CDB8C997591EBFB83E43A00330CCF2E0C700CDC9B7642930088D74CA94A1AE32E21FDF0CB01D19880DD543E5540A9D163C400F4FE2E6A480BA9B19564E36A0193B0B0DE412457DB3E4351740178975EF929DDA118E91BD99600BB5D328AC1864EA02DAEAFA200019F2FDE185BFAF66253EF908E4268F75DD55F5CC245B2BE2D150001F7B42910E9BAEDFB80DF85F0008A92D95B93BA3C4EA57091E1A10D5C4B2E1A344DA1418B0F4BE3FD99505FC30F2A1E5B696E943BEE2451D7B268F722E04F8E00FDD9E1A470F8C977A6D45A5F621B8815E352FA14F64977D1FA08082A48AF495719EA6AC1C0B3D898603B4CF7EC88E68DD7190884382896D953D612CC21ABECFB01A04A1BB1BBE8986D34625756396CCD84BD1A6B5454DDA98824CD4844D98F356AB485EEB19F9196ABB1C3088C0C3C5846C88760B696D91A232D6F4CFFC85BFF33DE1A3433A27A209A461FCF37F2289F98BEA7CCF183DB1FC42A7EDF958E7913F8711DC375E43F09BE7C7A2C2B1318AE2A9CF5988FBC2CE0735A2CD9FB6C8496C34406C538C01BD494193240BFF947FED47B7CCE99A1747973F1FAA5223AC564BBA0CA8973D1310B5BFA1452CACE9110BC22A8D4080A8BAAA8ADFA3CFB6685679B648484E3A43F9B1B2531949BBB8FAE1846F6D45D9272FC2CAA2913B5D9F8D322E9B18A685122D74634C60730C101578BEF2480711FEFFE02123E76D6C846559E2EA99A98923EF095630102A5573EF027E0AB6E52555A9EDE0D15A73C8B2FEF87CA6FD9F903F0 - -count = 12 -seed = 4FDA9FB6929E3F391901D69FA0AA2F25A9657D249A620F1B9E305A5965676BA76794CAD3355EB632579C3958CA7D443D -mlen = 429 -msg = 49755A7B1A7CDC5C9BDF5149968061D3C95EE67BFBAF02750C45094303A9D9CD23A08F19B9C768ADC63FFD1527186D09CA4E0356BB882E263BF015CBE3716C05B31A69DDDB790BA82C341AC9B6BE68A81B8BEF8D882304BAF0020D761A0DB04412033DC369961A5213B04E81736A580F1162780599CC029E262D67F31B2773AFB457A1ADAAA292163144F17DE384234F3303111FCD89BCB30333C6C6486F775ED099043C34E6C86450B650F1A02D03781B1D20691B767D166DADF1DCC4D8604D976EFDC9168373A7316DDA9B9FB02A4A321218D9F54E287B7167A08BC0153843BD6355AEA1310824DD5D5EC458BE694AF176119D9E588A29C650FF5500293659EA478B39A62149F819CDB7E7CB32E1D7B1284F159E2AB1B1EA41AF4D0AC94FF3111FC1CCD818F9B2CC7A259701405FDF6A51D2D3EF62789297BD16A659F14968EF902C4A23DA409BF13A4913467B5C991854B2CA6CC006D3F4197A6AA58BD5DD95C36928DA9583332C3FB134FA3890FE7E299F1C17205366C4F4230724C43E4803912E72B816658BBB1B63780865A1F66A2A49B96E93711B1BE97B827D12173402828B1A065B94310D5BD6098D -pk = 2FBAEE10339D9B2FD8934806E7D0B22002765370F889C8E32B389361B0C8E1F59CBBEB99582BB8726727211E1F44CB00BD7C437E589DBF54F0F7CC10AEDDDE2DC29FC9BC91435162814D61A16D9D5B3061545A82FED69A5242458ED320880400 -sk = 2FBAEE10339D9B2FD8934806E7D0B22002765370F889C8E32B389361B0C8E1F59CBBEB99582BB8726727211E1F44CB00BD7C437E589DBF54F0F7CC10AEDDDE2DC29FC9BC91435162814D61A16D9D5B3061545A82FED69A5242458ED320880400020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075BB8FECF65210D70644E6F9C438FC39EF682ACBFD22E6E3891690BD6657030B1D0AED1A8A4E72EFA418845403E1C175CD66A4F4A21ED3B779C0360895D4E3EF8183000000000000000082243295526DFCE24EEE93595750501A7992685F4C59BB59B26E1B9E69B392DC542DCA899E9139DD421BD163B215F7ED6738B21E8AF92B662C84E35DE0B691D8C5BDC8FFFFFFFFFFFFFF220842421575E4F2B59DC5912C22F9F322E234D385228E42A1E08D0649661ADC6AB252245E8CE7F4701F83FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB4897AA7945BD204AC7CB8F7D73973918D958F3F9DACBE7792702FB0429256AF068F560852F04383A882C00000000000000000000000000000000000000000000000000000000000000B5E0A98A052459DF5290BFA117E9B1208AC9DC2F3827D826E600D226BEFE5AE4ED3F641626229F21569A820D81C03F035FA68280A3D5346BC7994066F12ECFB82B36751C20167E91C476DE35271527E094159299B28A5E1252BFF8DB12682101BF4A654810AD053B03D475D73E155127529E9D54875C0A0C3FAEDBDEFB9BF7B27F053808BB4D4243692434F0E36DAF0056430F75FC88FD2FF9CD9C0CD5E528E5B3360CFF75DDFBEAC18F2D022BAF193A6DAEA94D92937349BD6632F62CE1D7031A884CD67FD3180E506E4B7B87ACC072EE96F9516D311560D1C4C72223CADC0AB558DD80E7CD53A7A0A482056E067B011A646A8927865FF0BF3D333E3EFBDAD73EFBBFDBC0811280E321AB816933002DA57DC82E94A3AEF90007B12C71614601910865AF2273992496841C98693938D78D19866E57F5F060691B26CD17269EFE0294AF20A9E66211F81E04805A7D9603AA19406C76627C9398B18ED534BCA9E2E9A88BCEB6FFF245A30079C80C4998691A4FDE8095F586E1C0473BC654DC13010427F3B8654936570BB89A6228B969E30549AEB8E916BED172A4E0F53FF1E28969E7EADCAC7354A025BB2B12F475B8015663D5622CE18A16AAAC419E584CB1D7B714311C02C390E02B0803360DD2CC5B79D95BABCE8F185AC1BEC694650ABC039B4653B628E6BD147D9AC2E1FEF3498506AB9FBCA744DF87E3F3A41B7437AFA4B954B43F0C0DB581A522CA8BCDFE8B03BBCD8C383E1CA87D8C268DEBF9E5F6D1959729E1A1FAD18A284CD606E8A1ADB6B129A14D68CB04782D1DBC3A8A97E902CEC81C4EF4526DB0D31C13B56256C3C5B4B9F18F8EC0485B2F8F6A1BA33DD01BA29C97DCA02934382125A3A971AEEE01C7EAA5DE55738FFD643FAA07E23A8C9A35359C9A75040073D2A3B118BCEBC54AF14C0399F469D888A730601E822BC903 -smlen = 692 -sm = ACB167C19814EC822FB0D5AA01D29CC593F00E2025DAEEFD260130F22EC91535CF7CCEF529B600F973385F14BDA88CE815B93A012ADB21BA41C03FAB8ABD6DEE01CDD9061ED64C91CC9C46A432004C4155FDDAAD572F2CB9931B01520E327CAF3E33EE744460000145D52B543936348D5F0DCE8B006918DC8C0DA682C43A339ED000421AC21C11DA2271883386AF01D66D7017538F1625E0B5668A013DCC0EAF31DFD88EED7EBBFE01978823CFF1226A52B50171D3019A9CA6B83A33FFF1D0336BE001796A2B7DEFC5247E21E4792F010153ACFE2CB4D6DA78D52512F245D1F4507A27A6DE2F6C657AA90C026421D3F461E4AF0D52003E6800C48F65077A0CFE9C74DDEA7B8C0A49755A7B1A7CDC5C9BDF5149968061D3C95EE67BFBAF02750C45094303A9D9CD23A08F19B9C768ADC63FFD1527186D09CA4E0356BB882E263BF015CBE3716C05B31A69DDDB790BA82C341AC9B6BE68A81B8BEF8D882304BAF0020D761A0DB04412033DC369961A5213B04E81736A580F1162780599CC029E262D67F31B2773AFB457A1ADAAA292163144F17DE384234F3303111FCD89BCB30333C6C6486F775ED099043C34E6C86450B650F1A02D03781B1D20691B767D166DADF1DCC4D8604D976EFDC9168373A7316DDA9B9FB02A4A321218D9F54E287B7167A08BC0153843BD6355AEA1310824DD5D5EC458BE694AF176119D9E588A29C650FF5500293659EA478B39A62149F819CDB7E7CB32E1D7B1284F159E2AB1B1EA41AF4D0AC94FF3111FC1CCD818F9B2CC7A259701405FDF6A51D2D3EF62789297BD16A659F14968EF902C4A23DA409BF13A4913467B5C991854B2CA6CC006D3F4197A6AA58BD5DD95C36928DA9583332C3FB134FA3890FE7E299F1C17205366C4F4230724C43E4803912E72B816658BBB1B63780865A1F66A2A49B96E93711B1BE97B827D12173402828B1A065B94310D5BD6098D - -count = 13 -seed = B0E6A23FAB10A7A333E3720BE00D31507917F39C5EFE1C98CA18BEB5C3101FB4479B478A1558C4C00398C55C9822FC44 -mlen = 462 -msg = 439529DF1864297E33956AFEE00A60099B658A67830A6A6ABDDC329E87831D9F9B647917FEDF1AE182A40402143285516FCAB83F447354C72FAE81AC26E7005C2AA561763C152E66BD80F14565F47DEFA440DBB491E7994AB9FE35995D5FBB3800CA030B43DF611141637A5246AB9D9CAC02EFE14AF60736B6BDB2BABB97CF21E831E5D04D41C00F090B154977900EFADD3A9313389A3F84CB3AC38E8B57B70A43DD08A8243F8154013FD5CF29DE5A8DF0B197C12B17E0610FCFE3625CC94067E01E23D23A243AD1C1F805CC50E1447D1DF93C25B8D76396BB7199E64129522462C5FC8B30C132D4EE9E0BF6F52961FCE7ECF650647E7064AA5A6574649A323E144D7C5491DE4C0A1A76D08F93F87A2FC7F6955FEF86991E62E2CB42908E83B0C0A8BC180B7453CED293F1E20F300431EC1D395E8A537F0BC36A673D491F14381DEA90D8F176D06031B0A7AFB40EA8F76D37FA82E2572B9799A5FC7CF4C49BC20AD78EFA8CD989A84D72ED680AC3C0F64155C56ACBFD7C7D628B418A489F961357F77BD62204ADB079DD3106485A37FEE535C9CF82E832D8AADCBF686976B806B02AE733DB46DB0BF162E973931C3E338CC86DB38C66262D1B2EBC7691B8281E0B20BF36305FBA996D20ECFDC695 -pk = 1625D3A657B6DD38CBAD17D7B3C061F8964BE10A0928CA62E708FB1E5870D06D7890B31E0A75E6E16DAE9A68575F870141C2ED5D121AA5C0046D5E020F8BCA847ED3C698392B1FB2A22A5A8FFC1F2CF5C2EF7D144EE512A9CF05A22F3E939F03 -sk = 1625D3A657B6DD38CBAD17D7B3C061F8964BE10A0928CA62E708FB1E5870D06D7890B31E0A75E6E16DAE9A68575F870141C2ED5D121AA5C0046D5E020F8BCA847ED3C698392B1FB2A22A5A8FFC1F2CF5C2EF7D144EE512A9CF05A22F3E939F030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B9CDC445B6FBFD3E431CBF0AB094A910DE805DD58FD8AAE8E88F2616053BE94BB3A46E891E85B716F30A7777975654A90EC0ED56BEA8B78E03412180A281699864EBE6FFFFFFFFFFFFFFB29C56E0F52B32A0C778FFDB3DB6948DAC4CFBD23F7F436D07E811BBAA16D9204A6BAC699E2D0458B5E06AF58CE521C989CF43980C7DDE26579975CA4DD53BCB4B5CE4FFFFFFFFFFFFFFC6CA1A92B8B1DDD6E017E07CD8EAE5D157887572E4F5EC56A96F92FF5801A17B6FBF508C49ACDD28C4D32DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D27AF0A7A016CF548B5E8B739AEF830FDBD64B616EB2B95CC023F2A8784061DCD3FB2B00DCD033D3F89D00000000000000000000000000000000000000000000000000000000000000C6AF9310F5C8B6666E743D99F5D48549113B9A874DC3446D826B5B367C8A806F3BC39328056B28468AF00C026DD7E4009078FCAC1B828518E1D5B8AEC3501F6A98EBB6BFA96B7DA127FFFAF62171A587F5826B55204A849366E4BE9A6C288200907B232117B98F2E17005FD52678F65CA28B4566324D56D14B7C605E8797433AC936C749F287F2461504225F798EDA004A4376353E2466C10D43B0D599EF3A6F2D870BC8531F103A18CDA06C68639CBB7383228B94A085D404E8E78415D53D03BB6CE2FF03E8E24AC13BDF8A950958C58DA1CF4256E4953D5EDD14AE9911BA9E6744C62D8F6D18FBE8F9C1B2962370029B259400C417BEA4BDCF16DD35E4E3E055206F921910FDF384768AF0352706D50BB4F84BE2BDC2521616578487F6940205BCAF7F4A709DD2ED7D1D5EA531FEFFB47E28BB38BA6B45C7CA358A41F7D34ECAF8728167F42F4B8D9817A31C718102078D7B2714C69161491FFB37E5BBCA762BCB3415469E4D1F0E5E2AF8905A4C981EB645222E80E581D8F9E54753BA3A03B0FF8135A10952AA3F3F01CB83B4CCADE1ACD7C10EF7379138A353383EFC4C1D1185BFEBF9FE15AD812150BA6A7B330387D2515BC2F80E04E50F60B87FD09D9D49CB4E8DA9692BA98CF4D356DAC543C44B9DBCC8814E47C000E744DEAFCD43022183EAFF3B17F78D42C2C0DC03C5828A4D946D29D7DF1A90E40DF97E172BEC75B78E2A5A3C28BBDB8654A3C20B54F002792CED296F06916F6546B93C50CAB2019DE18E50F84FFF405093A535C41A9EA60F86569031B49C6B2B441C6021AE1800A681DC5DB41A7D25E6C35DCDD383996313E48DA442873E990BA6D1F198F7F401E2E835FBDF640E2E0207703A13847902A980593FE43987C402B62096342389858151B0858D739B72954E5969D04C3930C242D3CEB6A21E4F6997103B4483DA03 -smlen = 725 -sm = 8240C7AC2D952BA0D22EB5D4010D3006A15FE61A63CBF0EAD5003A6BD485A2E696B882B10EAF01EC3022E82BA4C67E322F2696006313F8D2B553F3AA734F7F5600CE84F55DA3A5A1407B2996BA00BBD392801E524B8989D4F1250101B595239D798A5D4CC224920176747402BFA218830B7C5F4900B80D95C6A9D5A0DBCDDC987A017CBA77BB69E7B6B73875DBFA01AF0E301E9280C250D4D3C0AE00698BA23A8BCA721FBE39576200AF0CAA46E6448A0C2DD7BEA301C665E0E8FFD55E9BEE756E0700A41ABA2DF9A42C46DB8086DD000113281F0DCE4DED2362C9CB5AAC091E04EB3F9D59AB41C553A11902E09E63174FCCBE1C95D4D9E700A039499E00DD6F63670F88D19B00439529DF1864297E33956AFEE00A60099B658A67830A6A6ABDDC329E87831D9F9B647917FEDF1AE182A40402143285516FCAB83F447354C72FAE81AC26E7005C2AA561763C152E66BD80F14565F47DEFA440DBB491E7994AB9FE35995D5FBB3800CA030B43DF611141637A5246AB9D9CAC02EFE14AF60736B6BDB2BABB97CF21E831E5D04D41C00F090B154977900EFADD3A9313389A3F84CB3AC38E8B57B70A43DD08A8243F8154013FD5CF29DE5A8DF0B197C12B17E0610FCFE3625CC94067E01E23D23A243AD1C1F805CC50E1447D1DF93C25B8D76396BB7199E64129522462C5FC8B30C132D4EE9E0BF6F52961FCE7ECF650647E7064AA5A6574649A323E144D7C5491DE4C0A1A76D08F93F87A2FC7F6955FEF86991E62E2CB42908E83B0C0A8BC180B7453CED293F1E20F300431EC1D395E8A537F0BC36A673D491F14381DEA90D8F176D06031B0A7AFB40EA8F76D37FA82E2572B9799A5FC7CF4C49BC20AD78EFA8CD989A84D72ED680AC3C0F64155C56ACBFD7C7D628B418A489F961357F77BD62204ADB079DD3106485A37FEE535C9CF82E832D8AADCBF686976B806B02AE733DB46DB0BF162E973931C3E338CC86DB38C66262D1B2EBC7691B8281E0B20BF36305FBA996D20ECFDC695 - -count = 14 -seed = 0A98A2BD2B9FF42CFC18D3396BAD052E1D0F3372854DA69A318B142F7A1AAC609C3861263BD8FB0549DA7266784DB8B4 -mlen = 495 -msg = 8CB18850E27D8416B88A9A71F4A66BDF447814DB6C82098C371B53F61600EF5DFD88E4FB34200207C3F6F55166AF4878D38FCA7E2DC18FE662E3EA491B58A86246CAE16090FB7ADA53B9A67B3D0E3787D3323EA921274C60CFFB19A889BCF0300FE10E242AAE025F374DD83FBE9D007C8B9D9D75574C74146331DDEC6F0E49C10DBAF15654897E33E2B4780DBA484224AA6FAC79015D5792FAA2D532BB7D239B11D91420B98690B1FBDE9632223927E0804BFB284368A426C414C3DB8EA82F0D246413861475ED2DCA9E80FB4F3C34FEF7528069AE1975AFC52AC5AD2CDBCA1459E140F655556093210D7905A1A1E6CEEAEF0194A0B2EAB2C1EE853484E715D2A1DB551FDC620D5331164C74CA4848B61D408D2F2A943FA09EFEB63D524691C99DCC0B22CC61B98E6FB8039E5E0B2D7DE2CAAA900A44184BD56C9F02141A3AE8AFC661E3E898ECD3004FDB0704272BA780CD5DE35153B6FE223843024273642DCF8E4B58BE2AB1F61668680084AA0B75A32E766C8AE5EB30D4E02A12E6798DEA40F80D8DDFAD2041A52922701C689F46F49F84CFC05ECA6D7D4C356D50B6A0BA61966245D45134D6A1F5197540A1C39C36BB0B78831AF3F5156E669FD9213B64E0CF1C5A31E88AE79AD61757EC67B551B9F0A760F646BF81F6B92403A62840CC29FA4F3949B3A9F0A9A4286EE7808A -pk = F68E28E922444EC662819A1B5E1687DB88A895B147A15A14FB30A2F477EC7D8DC74AA8CAA10839994EFA20CB079DAB015CC975E42A2EC94A367DD167FFDC122347CCE54619645B3F16CACB6C9D14483484BC72F8407EFFD0DCF51109CAA3C203 -sk = F68E28E922444EC662819A1B5E1687DB88A895B147A15A14FB30A2F477EC7D8DC74AA8CAA10839994EFA20CB079DAB015CC975E42A2EC94A367DD167FFDC122347CCE54619645B3F16CACB6C9D14483484BC72F8407EFFD0DCF51109CAA3C203020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090BC2BF29A2AC160DEDEE9D8DC9998A7674946827699189EDDDB8B9C86537229D5225FCF38862FC6383D3FD1AC6A23D2BDF3620F388D6E5C01536D9E4ACAB1CC39281300000000000000EDBFFC833F3E9734876818710AB9A03208EDF91BF66FE11E9BC3F2BE47DCC82C2E9DF55A37DBC4A61054F332B50A4F47189B8AE7EC99A246E9C387474C1FE1AFF34FEFFFFFFFFFFFFFFFDBFB1AADBB5B9FB7AA5A2B44382C6E2074FFC08D3C0062C0E4D5D4C2D852501783CA308195C6D8D1B290D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC9B0577ACB94005F279F718262F7CF40E83A80E06EC9145C70993879AD49BD7F57BB59D4D0D6C4A248E7201000000000000000000000000000000000000000000000000000000000000541393992930289430D2EE0209064EC40F81B725EF813EE3FED9E646066CFF3D2B79430EF5FBFA1EEA48A462FBA6A400AFA4911713611B79A42FA31569B4441A177EDB0FB76736926D1D0AA34FCAF8815729DE1B2C68B76A1503F23227F8520339EE81DDE2D400F12E9347EA1DDF0EF0BB2CBC46679AEAD7CB5DEE440C39A60F0CE7FA6E87A48D4E3694B9FA4D873B032047D44625DEF845C67F86DE37B4F1CAA18B23AFF21D6E03235A905B71455CC5C70673846AB60EDD123C7144B74A53004A951F2258F1265FE05AF735A72110F7DF9BD47A8DC97624B0E6B0681A2FC0E7D43B744F5D9A7BAC811838C4D3EEA102F75F184B8212211C30E6CA3EEA5ECEABD3463D85FB9D530972D870D4012FEA8D294279EA9B39ABB8CB5B75E5C8F5D20192CD9470F039DD2FFFDE3ED041242E689F0265FB11AF2BCF6AACAEAFF1A423695C5944EF6396D67A05105915DDBEFC007D53EE7E2359A7023E1D72445F5B6136E911BB423A2FB661386B715A515BBE1C89AC0831393A71A255891DE8C03A21004EA9F769D1ECB9BD24E2DB77B26F59953F9638BBB55F5577FF7714F6EFF16FE2FE04572E4EECCB659FAC663CEE2B83036EB7BF8C59AAA609EAF51EB3E2082432C3BAD3C2B7323D0C530D75F75F276703F322B9DA171C17C157672C3F07741B003F9088A9D06346C303C82B4C755593DEE6753118608066C0FF620B48FD16F10A1CB05395CCF6DF35A34C8FBAA0E63F01F787DAEF31D2C5946DCE0CB117654212FFA446FD0E6CF1B93119E73DC9BEE58B13DA4E6ABF3D0A92A0DE718DD2032502556F89319D73CD86D39238DF5CA85929A5D17782D35DB3F9DC68305A62504BD494D6658261319AA722550D23E26C3700CCFDC50001331DC031D3B5CCB25B4C741DC13CF9F56B814203E88EE1B3B02E09F714FD3DCFA28DD29E9743819B543502 -smlen = 758 -sm = BC246918E0E15EFCE7704345016090378E22160C7C9ECFD778002C135BA9F5EB43588169E7CF00777092929A12655F0EF9884B01647F037034A856AE91AC92D2002182AF64F315B16FF1DC1970019D614A8B1316CAB47DAF8F7400707EF2F030F7F065B92E8D69014706334B2B49DBD16FC06E5E014DFEB25595EBA760E9D7235501CE23488D0B793682316EF4270156D171749B745C9CF14AA8D6018984818C49C230ADEA9B866500C5A813867F6E53CC43A8779501E749A8CC0D0FBC6D4D243A720102B4E7178BA39AD848D8089600013BDD79DF0B36FAD6C3CDFA398207F85B1D8ACA8F7F5FFF208E010238FB6D42EA599A8FB308B5E0019CC33ECCB270AE5BF711BD4754058CB18850E27D8416B88A9A71F4A66BDF447814DB6C82098C371B53F61600EF5DFD88E4FB34200207C3F6F55166AF4878D38FCA7E2DC18FE662E3EA491B58A86246CAE16090FB7ADA53B9A67B3D0E3787D3323EA921274C60CFFB19A889BCF0300FE10E242AAE025F374DD83FBE9D007C8B9D9D75574C74146331DDEC6F0E49C10DBAF15654897E33E2B4780DBA484224AA6FAC79015D5792FAA2D532BB7D239B11D91420B98690B1FBDE9632223927E0804BFB284368A426C414C3DB8EA82F0D246413861475ED2DCA9E80FB4F3C34FEF7528069AE1975AFC52AC5AD2CDBCA1459E140F655556093210D7905A1A1E6CEEAEF0194A0B2EAB2C1EE853484E715D2A1DB551FDC620D5331164C74CA4848B61D408D2F2A943FA09EFEB63D524691C99DCC0B22CC61B98E6FB8039E5E0B2D7DE2CAAA900A44184BD56C9F02141A3AE8AFC661E3E898ECD3004FDB0704272BA780CD5DE35153B6FE223843024273642DCF8E4B58BE2AB1F61668680084AA0B75A32E766C8AE5EB30D4E02A12E6798DEA40F80D8DDFAD2041A52922701C689F46F49F84CFC05ECA6D7D4C356D50B6A0BA61966245D45134D6A1F5197540A1C39C36BB0B78831AF3F5156E669FD9213B64E0CF1C5A31E88AE79AD61757EC67B551B9F0A760F646BF81F6B92403A62840CC29FA4F3949B3A9F0A9A4286EE7808A - -count = 15 -seed = 9887F1FD854241A301EE0120645CD8E119B43F7BEE11F77A835E9ADF518C3A51CB76D86653FBE73AA716264C146797EE -mlen = 528 -msg = 9B64813C058F07A09A796FD764604EAF58CE144363702896DF0AB5FF26D5DE000D14BB8FD358FF5532D3B909AB62C18AC30F1900F84EBD3F4F18BD532D16C7B3470F0F8BDF72938C916DB18BCF1429DC1635B1C152C5F89A9EDB17116C11815A6C06273A889132923DA908FF39F4940A840D3CB575DC4D637AAFD37968EC61FC4EA04B4C320491A73ECFBDD8E10F1DFE902FCCEF93DD287ED872F67146BB8CA5A6ADCF0350E8BBA7F2F9762C4AA748FCE19748EB17334146C152FD63FAE3DFBB1A2C2B3C78960369551FDAC5D54643BEEAA59C1FEB0C21DBBB19977D848CD82A7AE0005F45956E0FE4700F14FBAA0C12FB8C65A6AEC95C5A5C8E79A6DA9C4E446872575C06AE49A31B82245E1757C7CE84D6D5DF3F642D3434B7E1A15A8B8A9DB460826B6CDCA69022DBF87595B582DDBB90A81E09A13C2AB1C125E4435FF30ABC9C56A00EDFA979F79D9C895E800D2DD6372FAE5FAACD83ADF8A6D55279D52DF547E9BAB39D99076AD7D297371344D35BD584E0FB5932F92FD5183B9250CD180FC645BEF6028C405B0EF35DAF783428173F1F2482AA1363640F66AF0FE8ECACC0DAB84ABD2A1FB53AF44445698CF1DDF4C2EA214DD339BE004E75BF76E95CA5C16981ABA5540689C1C1F1DAF4D0F89D62CCB3496340D61E7D5F5156FD3EDD02EDFEC8FCDD0B231697B0E66F4A3AAF46117532F5EE2CB4D2B3B82B0BEAE0A45A482CE9A976CC99AA82BEB0FE08CB68C4 -pk = 29C975FD609AA3D25732895EC1D7CBF8A410A65E04E89AAE67F0CBE4D101383FDA23CDB8FFC453AE9CC96160EA547B006D4BE1A3A659621B2A1238EE819EB1C2B42B37467A25BD47A2A0F0C5F8ABC1B6B7FE89BCF6470F360CD179F6B15D0103 -sk = 29C975FD609AA3D25732895EC1D7CBF8A410A65E04E89AAE67F0CBE4D101383FDA23CDB8FFC453AE9CC96160EA547B006D4BE1A3A659621B2A1238EE819EB1C2B42B37467A25BD47A2A0F0C5F8ABC1B6B7FE89BCF6470F360CD179F6B15D0103020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000099DE3F4AD937911F14B0ACF87864EB8E1CA0A2BE4C80A4B2D76EFBD974CD67E4CE3EC9A3BA978F48FB901013369F77B7720CBE1A2C4820A7A79165E83CAE4A3729A522000000000000007AAF8C4BC202952F9794246CECDD318B2406492C147D9D8D0539FFC0628D067F6D77D9E5C8A0CF66436BC38903016D7B6F1DB8F88C3E013D7CED34B00E550E9FAA8AFFFFFFFFFFFFFFFFD2CF8086C1A8A100871F02D6381AD6306714584879A24938691F8E55F6CD61431A3DA11B01B394FF973CD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89E69288FD5D966F96EB076374CC1E5CA779B5B1DB4A129561B7FDBBCE611ACA1E520E7BDA0E57F1F3CC3E0100000000000000000000000000000000000000000000000000000000000005430E96C53952411B4E165DBCF8951D65BA2B3220AD3A1AE73FDB9A3D69A1AC60AE3A1F295FE73926000DBA0BA9A603C9BF5E4650CBF59F39E1A0E9D5270FA61780E91831CE299C1B3AEA2FEF01091894FCD65F2084C3B9E23725119D32A9005FCECF6D864D52E444B7BCCE7A9196A299455B4A0A2FFA8CEFB97FE0CA1C0DC46F2F7E5BB6C8B595FF9583707D748102CBCA77775B6DCE530C39CA8477D77312518F8C0FF947A170F581D14E52F0E1DB8AAF03FFA33CAE8011BDBBB9525EDE014517AFE709723F4432D49007C1A7DCC5905B300B6D975194F3940538421F6DE28D17667CC7CE8805248EEE17138D9F03EB00725646E668A0074B0BAB6B43F0434AADCE4E3B7DD37518A430132802455A5650F5D9BBACBF1B64EA7635A7588F02D491C3B41C7FABA7D2620C9FA1798AA6F2A4B32D4B974E314EF78D718038A08391B7627C59268975218921546236C700C959E349C26A41D5C5A40B6D0EA9E1FFB4B6E1EEEA84F6F064419AFC3AA779267510AFF6FB51CB0C99A096C78136FB01467F4AD2CF7ED730795DA43CF759753DD2D2E292D9D75163EAB369BC2985F033F2849887AAE2893562ACE8B023C6CA0295ED0D76545F3EDCB3311848C30C3963C3C93B4BE4455460C571C5491AAC6AB89016E463C6E0AC83AFB74EB3BEFFD300AC45A5C6042A39A04ECF53F50B3DA1E5A9E5C86858F9F80D0BF59B6B7CB9F4E5B541011830ADD58E6479724C18C8AA0337C54060446A37EF9CFEB4C09FAB3AB1E55C81C83511719C33CB048CB0CD76B9D579176990D69A42A35D5CAD03514D02E917BF23932DA6E3A6C3E9CFDD7FC70D410EE2ADBA3E251555B8F6680688E8581A83EF2C674CEE43B1F80001676D5B00950B30ED96392291A7FDD3EB5D51BC9348D70359BAA6A5597D58E1AB7BF82737AAE521CCA3063E1D5147E13EC9ED9203 -smlen = 791 -sm = 75E1CE64122E3C590665440001E3EAA6B5B037E7C354A8D3F4005F91CDEB32440AD2F1414D79019A84CCFD5125EE2204EA4C4B01D36B40B54F36329A1AEDFC8800932ADBAF79BABB1DAD35E20B01C867E5E957F7F22E88F386E90046DD69B2C039EBCCF3127C3E00D28F38A60DA07CE5485C80CA00D0FCA2505BD259E5BDC3E8D1014DB70C4B53473E3676A478D80141580B6EED45554BBFC1A94001548DD810FD86AE5B987C987701055A92270E1B06CD9AD369EF012351A1F609CE94CE413B017101010236CE94C05BDAC44B548F0101533A7AB6791DE345895A5E88E5AD40BC4AF92A4E7049632C4E13035FAF328773FD25AA62DB89A30125A61C69C8C01E86F5F5FB9A810C9B64813C058F07A09A796FD764604EAF58CE144363702896DF0AB5FF26D5DE000D14BB8FD358FF5532D3B909AB62C18AC30F1900F84EBD3F4F18BD532D16C7B3470F0F8BDF72938C916DB18BCF1429DC1635B1C152C5F89A9EDB17116C11815A6C06273A889132923DA908FF39F4940A840D3CB575DC4D637AAFD37968EC61FC4EA04B4C320491A73ECFBDD8E10F1DFE902FCCEF93DD287ED872F67146BB8CA5A6ADCF0350E8BBA7F2F9762C4AA748FCE19748EB17334146C152FD63FAE3DFBB1A2C2B3C78960369551FDAC5D54643BEEAA59C1FEB0C21DBBB19977D848CD82A7AE0005F45956E0FE4700F14FBAA0C12FB8C65A6AEC95C5A5C8E79A6DA9C4E446872575C06AE49A31B82245E1757C7CE84D6D5DF3F642D3434B7E1A15A8B8A9DB460826B6CDCA69022DBF87595B582DDBB90A81E09A13C2AB1C125E4435FF30ABC9C56A00EDFA979F79D9C895E800D2DD6372FAE5FAACD83ADF8A6D55279D52DF547E9BAB39D99076AD7D297371344D35BD584E0FB5932F92FD5183B9250CD180FC645BEF6028C405B0EF35DAF783428173F1F2482AA1363640F66AF0FE8ECACC0DAB84ABD2A1FB53AF44445698CF1DDF4C2EA214DD339BE004E75BF76E95CA5C16981ABA5540689C1C1F1DAF4D0F89D62CCB3496340D61E7D5F5156FD3EDD02EDFEC8FCDD0B231697B0E66F4A3AAF46117532F5EE2CB4D2B3B82B0BEAE0A45A482CE9A976CC99AA82BEB0FE08CB68C4 - -count = 16 -seed = 5B485527C3B9A5E5B7579950049CD357975D4BCFEF83FE33C087ACBFCC10A0BE4225E7F8A5F77203B5FC7C0B5FC0E78B -mlen = 561 -msg = 922320F7439E492F13C272A5738FF7122DD7A6B2832632E1F7A653FEF3B8639BCB9E84F482F22A948EA17DDE6958489593D2CB268BB52DF8ED612F2317BD6847D1622CF0532CB499ADC432233B93B6F7B1866B38975AC87859AC49F91E8D235846775F9E6E6D052339C741EF6178016EDB3D0B1E3F3536667B3EA2D489F88D254B8582421A31461374F465D7AD62E896BE0857134707A70477FABC09FE0A5CC3B3F32911F5FF3806B878205525AF69007F50535DF05C33AF3B0D00E297AC7EAA012E1D863DD5DD5FA47FB09467DBAD8BC42EDBAB42A9625BFDB9FE578343297506A3B71CDC8D5919955AF4605FCB0C7164D96A187AFF65D0F6210FEF2D11BA08D90C4458542BE72E084577BE9E451B8B6F4909884BCC5D25316ADCCD0925664D4D91C2E56433C1B68C632B0CA56D856DF1EDD5E113D1F026B30DAC4FD648A504F8F6809C701C97BCAC2B99286CEF5C1C923200B1BF6141EE1CFC51C5E14554BC02D7E058970254D2C02948360ABC4DFB439E66946A8AD615147BD8A6CB0886211E8B15DFF3C72B6F8908CE56BBC1B40E838103202E9F188D98E07555DB61778F895F76FBD838B6D14209D28EB393668924AC0E61072CBD9F93B864904FF4302DCEA131B2CA16BB04959ACEE096B1963CE07F59AB505FCC8D89FE08FC58751965F2F5CA753D76D58705652D3B1505E0F720EDE3142DE9776FFE4AA0C8A25E76C7A04843377C59F1002844E89189E22F621467B813A98BF07540A1649264F14A6844D65692617F7A4D93FA9A23829E256626 -pk = 7B6CBB5AB868F7E3624C758FB6DCA6BE32EEB377DC60751A960EDB965E6839F7D88F9CA606A697427CAAE7CDF3D9BF00F4F7B2299C5E51609D69F539A6CAAD1F65CC37C8C8A87C49EF109AEA2C1749EDD4A026971A071376509978148CCA1602 -sk = 7B6CBB5AB868F7E3624C758FB6DCA6BE32EEB377DC60751A960EDB965E6839F7D88F9CA606A697427CAAE7CDF3D9BF00F4F7B2299C5E51609D69F539A6CAAD1F65CC37C8C8A87C49EF109AEA2C1749EDD4A026971A071376509978148CCA16020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A3659FBE03AF88E2115636FF9E19FA94F863666EFCB51CEED51771BE39F0FD35834F698BC5513792BBBAF41EE164BA462DC39A79C8A77D3FB63DB7613111BF88AE2332000000000000001A914EB3E8854387A1BF0610E336DC8B3AD797E0205F29CE2741D93996DA2292FAEBA8699BD0CE51D2DD7AF9D6F3F0CFC63187653F01455503AD4F7C09143003434CF7FFFFFFFFFFFFFFEA2AAA7CC2891048890C702F60B5B0E6D705B8EBE3EC35077F79FE9AD9FDB0064E1696D89475FDED2C68AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D889838B523D8F6C90D3ED679DB956E9C47BAD49ADE2CDC1F06F70E5BD2D1DEE015E92CEDDF9A9455CC8A00000000000000000000000000000000000000000000000000000000000000300AFDDBDC39A47B7CBACC0B5653D04CAC88159CCE9C0703458C025C907FE6299963B170069CDC40EE2EEA19248E3C0071E4121472A1228F0AF6B42D552C3AAA443BAE1AC785AEBBB9C1B71AC7685B50DD7786E55AD85D3DCE1E322381566503D85D82D5FB3DD3F24BDB42A9676F1E5C4074C1DBAEA1368A518B7A8F6D3EF702392E710DC60B72B3C63655B653D87602ABC6A5464A198239317B9E35602EE11DF89059AFD6314965DB971C822DB64F1D75DFFD9C389A5CD00735320A039B4303E949BBB9AD99AE391B16C79261F8ACD62CCE0EB50B76AD997B8C7D33B02B261F3418286E5F54F7F7C4EDB50A3C5324038FF6E4002991767DF016EF3A71A7A73816F7D01D9F53FB8021568FC68C9388F9DE3D540154FC62249777E1D64AC9A70276FFA8F0C810C89D84058330C12BE01D099BF3EDC9093B41E2113A0F1AC76659EA2E3BD826D3520BD8B552A95FB81100B167AAD3BDE60ED914FD547F6258B317645F4C3AFAFC47036A787EE7BDE5F7252E74AC47E5404F80887EAE9DF769580234E2EC7C4BF0F9C838421ACFA5D8D3156FA623E806F758C3D8BF17AB3063C55781B510A22C4DD2A2D72DDF884C658700E4DB5C8B48F578A53492C561085157F7775FF0A0AB474DFDD456CFEB1D75E4754E82A279A5480E9012B020D8CE0A8E02C2E999AFEE33A669BA46535A7447D3E5A8C3D2363578615B3D7843E5314EE38D9B7CE7DB69B4618F6411D56E8102750348C8970AD32CB1FC94C4233790F0854E7265E8216FFF39C7D4925957D9D00D2D3E7A3C16CD54E6079E5771BF28A046034E1760225794C47A0B422CBD02A2A405F0B695FB3F1250A6CE13D38B0F82B891AB64FF912EAB3DF899B34196228A20037C40CAF6C0D01CD05794B82BD22F952D798B1003A0C37B675B3BAC7A688F1828290F7521582845A27591E89C206E1300 -smlen = 824 -sm = C3E23989E8D4B9E974E2787501D20D54B95C5DB410F13A6A380098E00540D1E28F88886FF21200EA2855035E2420F22334CF78003B1302870392A46969C7606F008202DBE5C26E75ADD64C33A4011467A25236E1AB2D07B8EB63014CC8D8104083369722A53FF801CFBC37F910E8AA0BC884BADC005BFE9E58205E2C2941A930CB0076A70E5B9C7438517A656CF600CA234B42BF452F3A5BC1D9D201A289B1D5802745F27119E0B200FE2F7AB746F44F3046B71AE40185C5F290174B07B6BB9EBEBC00B1E9B66E37F90B1202D73F340101A550CAA40FC832567F773BE321465E8FFC34AC1B49B819E0420E03E25487CBACCC9C392D553CFA01C04094B60A9B70ED06FE890A380D922320F7439E492F13C272A5738FF7122DD7A6B2832632E1F7A653FEF3B8639BCB9E84F482F22A948EA17DDE6958489593D2CB268BB52DF8ED612F2317BD6847D1622CF0532CB499ADC432233B93B6F7B1866B38975AC87859AC49F91E8D235846775F9E6E6D052339C741EF6178016EDB3D0B1E3F3536667B3EA2D489F88D254B8582421A31461374F465D7AD62E896BE0857134707A70477FABC09FE0A5CC3B3F32911F5FF3806B878205525AF69007F50535DF05C33AF3B0D00E297AC7EAA012E1D863DD5DD5FA47FB09467DBAD8BC42EDBAB42A9625BFDB9FE578343297506A3B71CDC8D5919955AF4605FCB0C7164D96A187AFF65D0F6210FEF2D11BA08D90C4458542BE72E084577BE9E451B8B6F4909884BCC5D25316ADCCD0925664D4D91C2E56433C1B68C632B0CA56D856DF1EDD5E113D1F026B30DAC4FD648A504F8F6809C701C97BCAC2B99286CEF5C1C923200B1BF6141EE1CFC51C5E14554BC02D7E058970254D2C02948360ABC4DFB439E66946A8AD615147BD8A6CB0886211E8B15DFF3C72B6F8908CE56BBC1B40E838103202E9F188D98E07555DB61778F895F76FBD838B6D14209D28EB393668924AC0E61072CBD9F93B864904FF4302DCEA131B2CA16BB04959ACEE096B1963CE07F59AB505FCC8D89FE08FC58751965F2F5CA753D76D58705652D3B1505E0F720EDE3142DE9776FFE4AA0C8A25E76C7A04843377C59F1002844E89189E22F621467B813A98BF07540A1649264F14A6844D65692617F7A4D93FA9A23829E256626 - -count = 17 -seed = 327CE565CFF6CD9A25EDD84F482FA0758B78CBC246567DAE98B818314AE28CD438E339043EB3FF16E1C2B4B104A717B8 -mlen = 594 -msg = 576289D10AB03D5699EAC322D349F55C547101E4424BFA43BBBA3747B79F075AE1153A7A0AC8BB51D24FC46B7604E42EFE4343FA34AA4EB16D918F25E8A4D67C860CCA3F7480E1221ED3AE13A138F079FC252C6D7BEBC55CB81B86E74F339614BEBCF7E8F4440DF8678B01A4A41B3AFB1D112FE1C4C8D8C6BFE9D3EE2A335D477C60FBF43B2E5FFFE1546F5172EF51CFFB2A772E1575EAC79B24D49FD77F0BE351233E57EE6DCC7E2E29994873ABD434D34ACE83400C026E27E27888EA0BDD1BDE5A3E55AA8B5F2FEB57B8B0A96CD831906297C8169D04F15843A3249C50523CF56A4E19492EA16927DBA8759B88A99E0D20820E51FC9B6A6863115CF05C5BC3F4C869EB5A87124DF5DB102D737F3899CFAA5FEA4DD62DC4FEDB1AAFF67906ADAF8968020EFA5B10190F70E5F2C0F0457E4341BD449201D3A80AEB791254EC1C46DDCEBC3896C6DF702509BA62CD446D275806438EB4C03132B2E6BD01BD2F832D1D3C053C48C5A9DB1C4A22B130C4C9E96A2BF4C2A8F7DE0217A52D9AA5AEEE5E6A49708237EAB60B4019A51390C3EF10572A73D436875BB8D7D78543F96376E4BF3BCAABB92F89215E8D1093F3B287945708B5514BD7E62654D3BDF34B29009C64829A0CBF33C54D7AB0E81B81BDDA93028B341AB1DFF3D752DC4A1E5F9636A5C46E137EA35919D99E6571C5370C6E804BD2E2ABF566F035D65CF8F97E3E8F2ECAFA153BC6D8EC2831667A37FC96D1C2DA40BA84D0FB041DEF32AADAEF3F98CAFA957F6552F79D28A36B8BA20A9452671DE1BE8AF5D66714232507EDB9FF657F3D7E5FA7320FC0359A5F99280D446283BC -pk = 9B2F28DDF24B629FC6BEB208E36122D3B6581D35716125BAA41A8A4B48080AE37326940248B6EEF5001410EEBEAF18031109BBC1DFB214D443D368AF4BAD55D2AA96354A36C3BAB7A9B13E242E2EAF00EB65CA2E6BBF28082E3E062394176600 -sk = 9B2F28DDF24B629FC6BEB208E36122D3B6581D35716125BAA41A8A4B48080AE37326940248B6EEF5001410EEBEAF18031109BBC1DFB214D443D368AF4BAD55D2AA96354A36C3BAB7A9B13E242E2EAF00EB65CA2E6BBF28082E3E0623941766000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000395756E33E3E07B0FCD10DFBD74DC8EDCA88A110FF83B355F2A51756AF2F4376FFF3749201424E424CCD927406E66F35D31EEC2E4AE48D6ABF6D32DF3EB8A9D614860B000000000000007EE829437673F96059C40131605BBF8310D9ABE72A434BFC7C74DEFE7B21B361DA7156F46F765D669146DBC4F9D767F6E4111F1EE9267C4C8F462229BF86FA2ED976D8FFFFFFFFFFFFFFE219B0F78CA9C3147F3892E39AD4AA514AE0D98B664CD10C6DF4AFD071D03598999B63A23087DF7C3661990000000000000000000000000000000000000000000000000000000000000079B2851D2CCF7506CD68941FF25B1C3D048C7514C8B823C5C699A3D3047550605FDBD6028FE9BF702ACB010100000000000000000000000000000000000000000000000000000000000050C49BA0135B88F5226FF1DAC5E1C1BD6FC3CD07F4BB5575642587AE9468B2DC87A9820CC0AC6EFD53A851BD9A23E101F0DA8D4304B34A89589D839E57BE1CCBA677DCD7115B6460EA42B7DCBD289EDEDD7582E356AAEA44D1AD54E63722920080D2B33980B21D60ECB0B7EB3E41C372FC62736875D27F215B376C10B8A8F01EE00ADB8AD35ED0BABEBD377E38FBFC01D13DDCF0AA2CABE67A0AFD263B9BDE6A9DB684FD333BF2674E7BE420C870AF3424D4C296F11B6C7C9E9BEDA6A10451023BDFDA3CE4132D988437A04B3DC4A92BC8DACD6CD66A8ABBD3A7DB6A22FC734C4F283E134C13B183D5BD454BEAF1B60270B973E69FF2CDC61EB07360120FD339AEC5A2989A0B4D8188F3B1B1C51AACBF789FB373ABC322AE73591514EFA651032CC0381557DCCFEC6CF58650F3FC645C02204A59BC36A0FFADE34D8AC472F159EFF8534E5520AFDC25221276830518019B30AD5F9B0F7D10365BD04A8B094AFB089B92EE448DCD45229AE21EE85A0C7CD450BC170FB8A03241542B0D31CED703598256FD29135E7AD4497EC7497D6046CD7A2A57C01026F6F88819D1568382044E66E2B03C350A4F15ACF03138892301EB5B38D87E9BC4F81E1468C6A89D5139629373826734656B31B401EC13F6F002E69AD47AFB2D5C4A9AB28FB08428EC01350FD4E22C861CA090F2949D9E585727D2AC328D7682FE89992833E4B534887064ECA065E56D08E4A9EF24602D37D202582FF16A4379FFD66433541DCA09676723B31C1A7453EA2108BC7F488FF0F945EA2CE8D9F04A302573F8C839C03C25009B84B3B594ADDCB761ABA88D16E9737735247827612257925601E3C135548064385813C79DC7BF9CC8712862CBB695033E3C72F45F0E9574C48CBC104E73653AB4E9E122911E208451FFC84B3858CE51C8D330FAFC6B26DA0741C749DA680803 -smlen = 857 -sm = DFC59FD03716C32577D59BE60085D59BF7B3092D7029EB2FCD01173A3A05F843EEDBC049FA45003569A78F675C5F6C86E9564D00C582043DD8F29E3193BE882D00CCD1C0008D284A269C4B3F65007483E4D18ACA1B33BF895BA8017CC651588241FB335BE50F3400103292376EF930D0AB2F58D3000AF881EF156F935791B35AC000D70DF42594A90BD4F12E611201FE54C7BDDCD06748ECC0C45600F61B28936C375F06B918A86B00E404759A7B62704DBA5EDA8500DA47216A3DA55FD0D4B28F38009142457DA84DA5FECB98638E00012760003042ED991E53DE310493D3458FE0EDDE6043011A35841300E27125B7E1C6988098D7613301FB101DB39E36289C676411B75908576289D10AB03D5699EAC322D349F55C547101E4424BFA43BBBA3747B79F075AE1153A7A0AC8BB51D24FC46B7604E42EFE4343FA34AA4EB16D918F25E8A4D67C860CCA3F7480E1221ED3AE13A138F079FC252C6D7BEBC55CB81B86E74F339614BEBCF7E8F4440DF8678B01A4A41B3AFB1D112FE1C4C8D8C6BFE9D3EE2A335D477C60FBF43B2E5FFFE1546F5172EF51CFFB2A772E1575EAC79B24D49FD77F0BE351233E57EE6DCC7E2E29994873ABD434D34ACE83400C026E27E27888EA0BDD1BDE5A3E55AA8B5F2FEB57B8B0A96CD831906297C8169D04F15843A3249C50523CF56A4E19492EA16927DBA8759B88A99E0D20820E51FC9B6A6863115CF05C5BC3F4C869EB5A87124DF5DB102D737F3899CFAA5FEA4DD62DC4FEDB1AAFF67906ADAF8968020EFA5B10190F70E5F2C0F0457E4341BD449201D3A80AEB791254EC1C46DDCEBC3896C6DF702509BA62CD446D275806438EB4C03132B2E6BD01BD2F832D1D3C053C48C5A9DB1C4A22B130C4C9E96A2BF4C2A8F7DE0217A52D9AA5AEEE5E6A49708237EAB60B4019A51390C3EF10572A73D436875BB8D7D78543F96376E4BF3BCAABB92F89215E8D1093F3B287945708B5514BD7E62654D3BDF34B29009C64829A0CBF33C54D7AB0E81B81BDDA93028B341AB1DFF3D752DC4A1E5F9636A5C46E137EA35919D99E6571C5370C6E804BD2E2ABF566F035D65CF8F97E3E8F2ECAFA153BC6D8EC2831667A37FC96D1C2DA40BA84D0FB041DEF32AADAEF3F98CAFA957F6552F79D28A36B8BA20A9452671DE1BE8AF5D66714232507EDB9FF657F3D7E5FA7320FC0359A5F99280D446283BC - -count = 18 -seed = 790FC03F956D1301A735504075B67A05944A762E0A4BDA77BB8C036C5CF911E2B561EC1CA6AA355D5CEC919AED42A1D2 -mlen = 627 -msg = 021E9C06A2E4EF63D1A61958620C40016783879080D44311E04F2A446BCAEE5A486D17FF0F356BA70FF1C2B55BF957A59202903AE349878CB822E04275E0AFAABC0803BB6CDE3741E0BF9FCE0C5D5C814977474533DC63F9ED4F32AC3477A3EC9893EF55186728C85B03F4C2E61CA7733E1706766AEB8FEA80E233E8761B57FD5A3CEF700196674B34A3A55F68B3368B688FB1DDC976FF48BA6A98E2D66023F291A3C617A56CCBDB8732B8C34369ED11F4CCEA8FC8F673AD9FA0FD8990BEF70AF44C617FDFA096695D0C94EA8E17554F4461DC776DB2F416448B17680FE4D29B09E57603D8EBF55771AF84D8D4B9097302901C25CB6D73932E67C323D12C8ACB0E74CB89755F7EB3999D4EAB5E1B775E6B5C29D9733697030A26F3B93B3F286DB0F2DBDA71E1F103878063E77919D8892EB6A34F821B603ED4A898A9F30D00FEEF20985FEF1A7B7AF70DD29C269E88687F005D551EF05EB0603FD38745AED4F5BF4C2FC09F0604C98AE3A89E46BBFE907B87A1672DE547D651F035F392A8D4DB5E7260F43953028E312B95B9F25FFF2C0C579218390411D13D9A25F22DE4C7AA05FD11781DB08977160D48E02372C7D826F5CAC37D1A9B4230BE99A2D13CC2E9B2B17F0A1044EB9E0A2FBA376D35CDD2BC05F57DCE4BBC3BF07A09BCDE369929E6250EFDC61689466B040AEA376B09453A2C16813BBB685B54A225C49008BA6811E8BB5B3627F8C281244FDF5533216D126ED0E64FDABEC533424BFF77FE722CC438CA7587C19D965F0BF085D8692C27C5C84A9DEE53256D978948D89ABDF9842E0B765BE6A507D8630CBC5CA7FA0FBCA1CECC78D2E536AA7B2B902C4379777AC0920D69C57CC4E6032252BDE99E1A555E80D4 -pk = 17DBBC260C7A797E46664337301D2DC067BFF2C35C024F29BC96FB80A5F13F97242DC66B591B0749A2905BDD3CAA37013EB6FA4FD8ED0250891DB52964BE46ECA786FB85D82C9538DDFE9148225D68800A6614480B0D5446B7A770C3841C0703 -sk = 17DBBC260C7A797E46664337301D2DC067BFF2C35C024F29BC96FB80A5F13F97242DC66B591B0749A2905BDD3CAA37013EB6FA4FD8ED0250891DB52964BE46ECA786FB85D82C9538DDFE9148225D68800A6614480B0D5446B7A770C3841C070302000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009F6F6799295B7409ED32914DBD6D4CDC921FE85EB3B21E81AA1A68F4AF9A46D0BD8DC4AD43C1D2E903FA787FB95A74EC78B4F7D28DF8E55A647F63557A632AB8F0BFFFFFFFFFFFFFFFFF1E9B2636075FE121C5D8CDE2E8E5E414224ACF28B095BE749CB78323FF82F6CF266DFC907706020F906943923B356C38314DEFB0B5745DCFE0C7F8A1D2DE638ECCBDE6FFFFFFFFFFFFFF5A3AADDC99BF5B94AC7A0CB5B26163D6BE13BD8FCA7BE50CF903365FA742C723971955600DB1DFC6E3E6C1FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1F504C789BD8C39CF8889B2DE035FD37D66DEF40661A0022128319071BF2488CF3C17A1C0C522C5C9AB520100000000000000000000000000000000000000000000000000000000000065345CA9EC46ADBA1318605B601917F3963448CFBAF2DF349458A66B7C66D3BA8FCFDE1D040A0B13FC6C7BA848CB0B01F11E95A5432F59467C3928D7DE9ED841E05238BB5F29515B1AB5B7A1596A1DE45392EA38375EDA156E1709A67ADB99013BB26B2162BEA63486689B66CD214A57AFAA27DF18AAB5D45EBB916D0F58D0671807752B3A24C6335CFB60019216AE01D89EB347B271A6076E34F11627BE25A6DBB491B825B905DFB3FD4088F41CF18CEC33864C949C67EC32FDC443697C2A006E06B43CF8C5230EE2522F0AF13BD54BE10CA224FB9330DFCE761EF3DCEF899A8072506AE9073BE642F11573B5BA2203B1B60E4D53D2196F77650A1F88181292122B6A01B0361686950608A7595D9CF1F4206B66A2281D1D83CF39D5FA28EB01CAFB4FEFA6462A6B8CD164FE2D04A478DB795F0736A6F14BBA696DF6D53AEB9A538D26623248D68AE217BF3F797F2700B3EAD099BE1083594083F6CFA7CC71DC17B2F90DE741366609E6556BE59C3F8F23A47DE9B925090046D249008B057B01D415346C6D8A8D552216DC335EA4C94C18CF482A4197DA78C16EE7D1F84D4319832FC7F6C8D0D6C8645A8BC825A5CD023D13FE945DCAAD9267FDB74C2E4C0DE0006E4CF0A89A7C619C808DFC97C2569E6463357D068B0480611DFBDBB1DAFF01D5FF0374FD475FE60F35531F64597295403BF3BEB02DF7380FA15C285CCBB4D32C07A09141B9455499C4F3647A9F89009F5A5357111B5830C0686B32B24BBD8366037EDA6E48DD5BAEB3110EDF274D7DD927F84AAB5BE56F0ED34CAC66D71500AE3071EAC9C8F5117E67896725A20279571ED6B91C87CCC1577A649E51429C9F8DFF673F7BCDEA06778A9B66347759025929FBA349FB8145AC3898C7939F06120A845EBF7FA3C4EE4EC05728A03C08041D750994E9C325C9572645D579A03D02 -smlen = 890 -sm = C621A055785106E211F06D1300835CF5384885B866267262F70034ACB6F3157FFA4781752A0001A2DB07B7624BB0501D339294012B158B89E0CE535E69A7C4D2006E192A6F73D85D2B0D81845B00345A56E0EBA8B93DC974FA8601117E73674E43E7ED1E1FB8D200E5404D2427E5F0F3470D82F3008308B641180A7D5F41CF231D0097CDD76CCFE0AEE64374A8F80196FA831793C90F49770488FA0199E74E7F1299B5334312678D00C0C54B2F9023E35981FC2C3101FBED526981367AC947ECCACC00A8521075765BB19607185194010099F663AB6B5F0BAC826059158BBEBAE094E090FA6815D1ADA11A035E0BEFFFD525800201EB7279011F2E69E39FE0143B11439E636F07021E9C06A2E4EF63D1A61958620C40016783879080D44311E04F2A446BCAEE5A486D17FF0F356BA70FF1C2B55BF957A59202903AE349878CB822E04275E0AFAABC0803BB6CDE3741E0BF9FCE0C5D5C814977474533DC63F9ED4F32AC3477A3EC9893EF55186728C85B03F4C2E61CA7733E1706766AEB8FEA80E233E8761B57FD5A3CEF700196674B34A3A55F68B3368B688FB1DDC976FF48BA6A98E2D66023F291A3C617A56CCBDB8732B8C34369ED11F4CCEA8FC8F673AD9FA0FD8990BEF70AF44C617FDFA096695D0C94EA8E17554F4461DC776DB2F416448B17680FE4D29B09E57603D8EBF55771AF84D8D4B9097302901C25CB6D73932E67C323D12C8ACB0E74CB89755F7EB3999D4EAB5E1B775E6B5C29D9733697030A26F3B93B3F286DB0F2DBDA71E1F103878063E77919D8892EB6A34F821B603ED4A898A9F30D00FEEF20985FEF1A7B7AF70DD29C269E88687F005D551EF05EB0603FD38745AED4F5BF4C2FC09F0604C98AE3A89E46BBFE907B87A1672DE547D651F035F392A8D4DB5E7260F43953028E312B95B9F25FFF2C0C579218390411D13D9A25F22DE4C7AA05FD11781DB08977160D48E02372C7D826F5CAC37D1A9B4230BE99A2D13CC2E9B2B17F0A1044EB9E0A2FBA376D35CDD2BC05F57DCE4BBC3BF07A09BCDE369929E6250EFDC61689466B040AEA376B09453A2C16813BBB685B54A225C49008BA6811E8BB5B3627F8C281244FDF5533216D126ED0E64FDABEC533424BFF77FE722CC438CA7587C19D965F0BF085D8692C27C5C84A9DEE53256D978948D89ABDF9842E0B765BE6A507D8630CBC5CA7FA0FBCA1CECC78D2E536AA7B2B902C4379777AC0920D69C57CC4E6032252BDE99E1A555E80D4 - -count = 19 -seed = 716354F7DEAE272CD26929C0932CA257AED1DD23D67260726B5213D82E61466FA99BB6A7D81DEE9D0EBE03DEEE4DBFC7 -mlen = 660 -msg = 7BEDAFEBABBBFB863CE496475F54E69A905AFA45899C3D7C16CFC73E31597D2404AE7014612E4CBFA238EFAF5B396B0B7435ADA5DE817E013188C280423C68924E1FA2A33CA56E6B85B7CCA7F00D3A6151F0629C1B92A13573320E0025863BBA7F3EEB987EE1B1A6230B10765DFC1FEEA498AE4B83521188E7503B506259103CEFB370E3651B06DD4F08013FF3AB9E2430626B0BD584232948462D85C0F82DA07B96FC65F62A43CD2F132D1A1D691C085980DAD8796CCE2FA0B268395EAC3DA2CC400F30F75BE87316216980CE213B48651DDB9E294F8CDB2CA05D3F2A507E4A03E2849AA8062918AFB5BCE9E4C3ABF2FFD4751DDDCF08AB09E36A29B830F3BAC6FEEBEA084575472E6F4B239AF89965A72954769A83E391DE467934237B07D8884A6B14CAD034FBF9BD7531D50D742E234E227E1A2DAF77A2FFACC579525134B15186D81AE6E5538871024BD2897475D6EE5B11BC51EDBB928D98475073785A75B331BF3D2297165AE6CF95C3A05F06DF747498462054F58A5AC736F96014B1A8CDB319D030D06DAD9CAB2B913F35FC392E1FC4B027CDBE775D64B04F1076A7C8F44C360745F98E87B84C18AB76F84F373F635AF4C8A87DF08DD4507899BAD892FF8CC1EE534D3277B5B82095628B84A7D5582149CF46C50AA963B56B4B91966B106B4B2EAA45D83A10993E8F933370AB29C6606B7CCFC41B21C6B99F2B9AC643E24300B350FA199EC10E64E4AF19181F78E8C43B2FA796241DC42CC8992BDFCDC39E7BC41BE68CDCE4FBC47C996DB42E8249EEDC146C216B514430C705FC939B9EEF677AD87F9CEE3398551FA0DAF774302324A410F4A4F4FC035CFBE960B38C390441E92D9E5624A8745976BC88FA538E398712361B77AD4CA5FF038D9F6CE157EB8A6137420D4E57018275DCEEBC4E480A5D -pk = 41EE2696CA7E20546B312E67EB5F8D3B05FEB5B1C20C500319E71DB7007296CA4E49C4D2449B7ACFF625D38FA8447603C69EF2C5176CDA89D6CCBA01DECCEC0B06A85E5DEA5B4814CEF75469C43C72CBBAA55F9149118233762493D6F64C6302 -sk = 41EE2696CA7E20546B312E67EB5F8D3B05FEB5B1C20C500319E71DB7007296CA4E49C4D2449B7ACFF625D38FA8447603C69EF2C5176CDA89D6CCBA01DECCEC0B06A85E5DEA5B4814CEF75469C43C72CBBAA55F9149118233762493D6F64C630202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001CF5027541AEEDCD20AD293C45D45EA7A232023758A0BBED0609B670B5B66EA418B7B4E1A17975A42676D0F994642924A8B4C98F7F897839A9882F7AEAD99E7B3F641400000000000000E5507A51854FBC046AB6D8573297F615FE70BF12505F7C3D395E7656874038B64CDB79CF3BDB6334F96BCE4E15CC37501FC8D132F74017CD12EFBF1BED4E9A634AE90C00000000000000A5FAED0AAFADECBA21AD36C7B433843BB0BF3BA7FED314EC5BE0DB9474BD98029846253BF8C8F33FA5FEF1FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF149F2EB31D5F03510E0934600FB839D096B8C62FB344DCE298283555ED8DED1DB661E3F71853725C09C9EB000000000000000000000000000000000000000000000000000000000000006272D4FC93C923A8B63190945DF52EE6E7C4D9E42A723672EF7032083E434B103CAC65930C4C24D33D8D602715259C02E474BF35BFB698D55227665173C51DC465BB4D90F78B7544D91D0F72D30DFC03FE02E621ED3BAE65A11EDC56CA4E2900120EBDFFB3EBAA54310FAE55B3B341C4A5DA73BFCD0C6B090453FB6BA1C3A47C630A67A39BB66916DA7D307348C26C02E5F65CF4737292BCEEF9FF62055919AC74EB2A07AEDC833FE3179B9950AE28306577F1D1F1056CFD94D6EEEF0CBDDE0266718176B07C834E0981A4DE58D5EB89ABC774EFA7E0B76CD073FC83057899D165722CE86C352F4E49BC8FE88CA1A703B57F091AF741C5899FDE8BA0BBB3BC03685784F51CD0AA5101E0F696F8AFCCBFB1E4618E7FF824B4638D9DB48735670346A5D271B354D9911FD13C75C3CC54236495431FE0EF91560476080FA34EE24D854D48C97E7C9ED98AA2D0BB54603100659A27AD99DBDE9DD9216E7440619F66A1D73066FEC0CBA7374275A10D7839EDB2504D9E771700592D80C642FB64B403EE74D9605F5B50D76EC48D548AA8C68D37BAB8D85194786771FD12B8D5929D98ADD44DC0449F3589363C030C1CEFCE0299037CCE078613B1BB91F15B965F4FF574061DDCD0E1186DEC4987927F6BC27E060752163E24FB855A524871FC293D021969EDA07AD91A7BE70F056E0062F84EC388184B543866EFA4E6624D12FDCB2849B200A5AB1D2C6CDDC888010BBD47023265046EA2B142EB9872AF4ECA2EC9357867048D8A94D747A858D75868865A2FF1570247EFCDE3AD4658F21DA5522802F41DF3D2A2FF383A8D655B827217AB4BDE0C04958C0BBD17716B12D4B2D8F775D5CB4C6D374298441C4C47704DEBB003A533CA162A90B9D4B9940D9A011B52FEC7E59BBF8B37F14C4468BC4DAD8C18DA762B73257C3A5E780BBEAFA0EF900102 -smlen = 923 -sm = 56E583E95D5F5B14613DABB101FD66511DCE17D0DB203DAC2B0164A8D3B34DDC52BC4A52B73C01D46C08D0A4712446924E75F00021DE8CC95DDAC100A9A89B8401B328B5799DE8A8AC345DE2A60066DB2205393F1621C511516500B771B82C3A71A85B4ADF484100B2CABD99318EAA75BE98D566005ABA2F0373331DA54047A83A0110F4AF88A832AA28E781410C0173C0DD8580F03CBE567D4EEB01620001447DC77B1336304CCF006A627BA74F36D0CF43748B4100050471DE0CC94CCEA5162EC80030A811FD86050F79F629D7BE010149183A4BA660A712FF23F190EC8D713CD7FDB9BA75BBA0D13B0302446D27AC7DBF72F0EFC588450024B968F61B02EBB11980CCFE4B007BEDAFEBABBBFB863CE496475F54E69A905AFA45899C3D7C16CFC73E31597D2404AE7014612E4CBFA238EFAF5B396B0B7435ADA5DE817E013188C280423C68924E1FA2A33CA56E6B85B7CCA7F00D3A6151F0629C1B92A13573320E0025863BBA7F3EEB987EE1B1A6230B10765DFC1FEEA498AE4B83521188E7503B506259103CEFB370E3651B06DD4F08013FF3AB9E2430626B0BD584232948462D85C0F82DA07B96FC65F62A43CD2F132D1A1D691C085980DAD8796CCE2FA0B268395EAC3DA2CC400F30F75BE87316216980CE213B48651DDB9E294F8CDB2CA05D3F2A507E4A03E2849AA8062918AFB5BCE9E4C3ABF2FFD4751DDDCF08AB09E36A29B830F3BAC6FEEBEA084575472E6F4B239AF89965A72954769A83E391DE467934237B07D8884A6B14CAD034FBF9BD7531D50D742E234E227E1A2DAF77A2FFACC579525134B15186D81AE6E5538871024BD2897475D6EE5B11BC51EDBB928D98475073785A75B331BF3D2297165AE6CF95C3A05F06DF747498462054F58A5AC736F96014B1A8CDB319D030D06DAD9CAB2B913F35FC392E1FC4B027CDBE775D64B04F1076A7C8F44C360745F98E87B84C18AB76F84F373F635AF4C8A87DF08DD4507899BAD892FF8CC1EE534D3277B5B82095628B84A7D5582149CF46C50AA963B56B4B91966B106B4B2EAA45D83A10993E8F933370AB29C6606B7CCFC41B21C6B99F2B9AC643E24300B350FA199EC10E64E4AF19181F78E8C43B2FA796241DC42CC8992BDFCDC39E7BC41BE68CDCE4FBC47C996DB42E8249EEDC146C216B514430C705FC939B9EEF677AD87F9CEE3398551FA0DAF774302324A410F4A4F4FC035CFBE960B38C390441E92D9E5624A8745976BC88FA538E398712361B77AD4CA5FF038D9F6CE157EB8A6137420D4E57018275DCEEBC4E480A5D - -count = 20 -seed = A32E6FF879EC8866A5F5E4F6318DA8FE6743812ED2CF5FB94F5C3AA3EDF953CBC32665810B71B2CFEBF343A571CBC570 -mlen = 693 -msg = A86EE95388DF139F9C5A84108D1E63F7A7842909B818E9A0425C257649ABF125386FB5286031E7E6D0EEB85C452E254DA39BBDA51F0D2167EC0A51992753DDFA76874AA80804E705CF8BBADF3B82B6D7FBA3D1CAD130ABCC0B44D6D893356F3E94BF8E82AC532EF8C5E5F4200207BCF6B754F14E57A889FFB753F516EF8DE2A647FAD8E449264F0BBB4CF48BD01501736DA49509C3426A3D4108B98E6A4AA6C4430E8EE76540051FBD1DFBFC01750E26547F8718EF7D897A0342BB000FB99AA63B781C9A4B831DA798C014E58725E03D2F8B1A029C3337F4099239244AA320965B2CB5075052D901B6077A18C1ECFA5F272850A475B5F6BBC83F3C09A27072F80743B23EC6A9870913EE2805B4D296B2F81A9D733E5C8D5C0B477E51F9328AF3AF8ABED960408AFECD27FBDD08FEF50F4B07959646E0A02104A69674294A79DE0B25B65F4DBFA797E5FA56D66E8BC07D5E2E7C7D2E845699ACEA3BFAC60B2C0B988CBAB949A5B598D8E2F1AEC66196E115AD7F237A1C7FCFB95A1BBD6939A250E7BB0F4A02C23CB1BD81090CB770E3A70CB081D121BD0BD5ED1DC06D61282B98BF2DD7B13D2C6CF833891C67951D7D0F429EBDE3F1DA943ADB8AD285E6F13F798D6CD9A0A06BCD6125EBAA48F8F3BD5100A122F617817E3C42EBC3C3B154258FA26B9FD886EBFAD42DEDC6A2C4F9986BAD88A2A79D7EE603554E9CFC5FE33A3A171CF7BA94FD43228019B2F6FF96A8ABBC58D2098AD95A95442F6858EB69E131D7BCADAD81B9BB69D7682A978279B631E22927DECFFBEFBE8FB2E51D46A3FCA66225D30451CEF9953EF94F30B99F2B26EA75B84935EA4FB257DBE5734454B8087B3A4E115C6D31E72709303E9F0BB8C86FC6B11B93B53F9781BB92851A5CB5DC00D0B4E15683DBE4EDBE986966FE1F711F24DE9A0E1BEAEA8E835C70CDDC589773D31191B74AF780EB69867829ABED6D3FFA94D577 -pk = 94FCBA9C18FA774B67447891DE1B55C3C8A9D3211915EC41CE70E069B20BC23C11606C679318E3510530E32859822603325F8C69E292B8F6647787EB33E6BBD7BF65813E9677A4E8659947F46ECFE83409031FBF0327895DB577C7F575DAAC01 -sk = 94FCBA9C18FA774B67447891DE1B55C3C8A9D3211915EC41CE70E069B20BC23C11606C679318E3510530E32859822603325F8C69E292B8F6647787EB33E6BBD7BF65813E9677A4E8659947F46ECFE83409031FBF0327895DB577C7F575DAAC0102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001D732137AF903B7AD07BD3F5E28E11D469FACA71680781E197D87A3FBEA1EF1E3C5C809437C902C06BA00F82042F2EDB663500C67C4241CED0D779AD2192631F1E58170000000000000032510EE2166A806FBEB40D272434BB8439BA7DB1494373412922E9CC6A018225E89926559361732B2CC4EC4AA7B7004EE25E578CACF2D95ED299874298511E46D224E4FFFFFFFFFFFFFFD63FC9D0CC262F4DE3FE49C5249F252310025E03C1EB4967A26D2CFBCCAA14162DF5123224D99EC8E50BA4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD320958F1DFDA19A09D80F1EBE56CDCEBB27B44AF624FCAEA9AF0F1C1438CE5CF406B375F1E94A61D7557010000000000000000000000000000000000000000000000000000000000005148BB4C341F2EFD5A58CD24E5FBF4C80096D25959C1AC73D8FDF0D53030B9019BC6E322ED1028F7C234E8C4FD73D502E5FB53517742C910D277C70EEEA25A624BE6F7C504D75673BE8572E65C5AC3013B810EFF684552633D70E52AC38F7000D1D130F9388BC55B35A658E6F2C8DC2F3D06C7FEDAD155A42312335C72CAFED5C8646CAED4D56B92136C7B523C3D3700A0331CE342A611F8F92ED8A369187FD76E209B00120498C28681D8EC7D3398E37225C6F5E2E2C7B5A7EBDA12C8C5A903306423A0F5C803C55D20C607207494281188EAA887B703ABFD483196D5F9A0FD3387D24EEF8BDBF5751C87DD62E5E801FB883FD8B8BBCB130A11E134B5914D13D18626277CAF888B6DE69D1B8DF06F915F00FCA982796CF6070B3A50C044A4027EF4C32222C7849F23399F5AB929B8CD2C644583D2A0FC0D8130F60093C1BF451C50D0F8803221898452F67BF137A001DE66C9477569EAB489FB41C9EC89A2CFDF0C7DF0D39297800D43D10647C10D94D4B3225C62983EFC6B8816D173F71403B8FADBC6E90C9D192A93C6C7052D29CB7FDD5B1BC7611EDB0B2DA1A4FBC88755B53587BFEE4699FA47A474E43463B30307845CEFF39BE69E4CD50AD1DEB3225CE9D96776ADBE0A4D58EC981AA2296A584F0A25E7E160C85C7F225BDFA959BD000BAB910A8801AE391E27AA28154443FBB3F4C92C29EEAF9B0D72A803DB88FCDEEFE4ECC4A5D5FC9A2FE07F67A785EF00864A27A0F9DF9C8156EA7AE813B96B8052531531E8E54717043546E6234153BC5E2DD4E44FB11EDBF30A7516396F0E02137C98D63456B8302657AC83403B53231E546CEB6BA2CC6A5F3D9D635A2BE3328E6E4522F4B2C83B5E88AD6E4CC04A01C53AC0D83AA72F29CC162CC681857552D614E1BC9077551D8B5295E272CB1B29D19648C24C81C4A6F33B7AD4F8FDFB01 -smlen = 956 -sm = DC8EAB9397118D077704DE310076812B98B0427D3E3FFEA56C01C210C59FF961B1AA9A1D3F1200D4DAF523E08504A4A4F076DC00F71FD476D34D7F9B890B2166012924AAB3868CD3AFED38335601F9B6B72229037BF3FE252ABB018FCDD604966729723F34F9B0015D9231E8C009F29F985F9F130085598C0D5C7FCBCA1C5FF3460182B8534A664BE4667492DC5801337866CCC41FEBAD4FC9ED12008500B02A7D5B3C989A32350901C51B0CB9D52998EA54D5F1EA00D8F57E784E85792FA67A2B6800F2F89705E0EFE40618AADF10010087084DADDEED691FD53CCC74F4E621252AC0B25857AD379FD50D01E0771B2BE0BB2E6A51E5D7F600996CA49E62F80B98EE07D75FDD0AA86EE95388DF139F9C5A84108D1E63F7A7842909B818E9A0425C257649ABF125386FB5286031E7E6D0EEB85C452E254DA39BBDA51F0D2167EC0A51992753DDFA76874AA80804E705CF8BBADF3B82B6D7FBA3D1CAD130ABCC0B44D6D893356F3E94BF8E82AC532EF8C5E5F4200207BCF6B754F14E57A889FFB753F516EF8DE2A647FAD8E449264F0BBB4CF48BD01501736DA49509C3426A3D4108B98E6A4AA6C4430E8EE76540051FBD1DFBFC01750E26547F8718EF7D897A0342BB000FB99AA63B781C9A4B831DA798C014E58725E03D2F8B1A029C3337F4099239244AA320965B2CB5075052D901B6077A18C1ECFA5F272850A475B5F6BBC83F3C09A27072F80743B23EC6A9870913EE2805B4D296B2F81A9D733E5C8D5C0B477E51F9328AF3AF8ABED960408AFECD27FBDD08FEF50F4B07959646E0A02104A69674294A79DE0B25B65F4DBFA797E5FA56D66E8BC07D5E2E7C7D2E845699ACEA3BFAC60B2C0B988CBAB949A5B598D8E2F1AEC66196E115AD7F237A1C7FCFB95A1BBD6939A250E7BB0F4A02C23CB1BD81090CB770E3A70CB081D121BD0BD5ED1DC06D61282B98BF2DD7B13D2C6CF833891C67951D7D0F429EBDE3F1DA943ADB8AD285E6F13F798D6CD9A0A06BCD6125EBAA48F8F3BD5100A122F617817E3C42EBC3C3B154258FA26B9FD886EBFAD42DEDC6A2C4F9986BAD88A2A79D7EE603554E9CFC5FE33A3A171CF7BA94FD43228019B2F6FF96A8ABBC58D2098AD95A95442F6858EB69E131D7BCADAD81B9BB69D7682A978279B631E22927DECFFBEFBE8FB2E51D46A3FCA66225D30451CEF9953EF94F30B99F2B26EA75B84935EA4FB257DBE5734454B8087B3A4E115C6D31E72709303E9F0BB8C86FC6B11B93B53F9781BB92851A5CB5DC00D0B4E15683DBE4EDBE986966FE1F711F24DE9A0E1BEAEA8E835C70CDDC589773D31191B74AF780EB69867829ABED6D3FFA94D577 - -count = 21 -seed = 5A64401EF8E63AEE18E8CC0162845DC7AF388230E86728ECB330007F2546F949764273EA05B397FE71F567E1527FA445 -mlen = 726 -msg = F5ABE373CE1F6FB14F2014F5BC0071B17AB2C84E8845FCBF4B15C79FBF2E5E06CFFE6CAD9A283014A975F81C9216B261CBC79EDCD58D0E20C586D7C641E0EE97221BEFE54DBCC56A594DF103EC24B52DDBB6052D1644972640F39DEB98997FEE7A252A65070798B7E46707FA440375B1BA705B3ECC7EAC56D9C45297E585299C7D747B430F0D01E82081C70B4A87846F90267D5163181DED63E089A00AFD33B0E2B3ACE91182D8CC899223CE65A5D84B86BB3E8B34B13949BC800F2145468BA5411EACD6A6C331C340D4442D28EFA0DA959A2797C7181BD4BBE6E6DFFD134CEF373ECB0EC08590F06BE0CE292D3718E2C0EFC7CB40F1DB26F5F38FDC82A72F81AFBBC16591EE02DC818D63CAE69FF0A28F942F7E07F6B0A741F3F0EBE3D0EA5859024AA408462D3D268C23F95D717C0A685A4CA73AD90EE923DB57CD6CDD828B7AB0D4AFA6A9AD7E32D407A44D7515C0A6AF52A66AD72119BA1DAEC6514DE3F8B462EC473072226AAD61135B0F5EC646BA9A127C9894E51FDD1B2D38011A2A6D7497A55283133695D0AF9B3FF7C5A8FD667231F9E511E3B8C4C3ADC44D02DE08C47B2382DE67B32826754C6BE5231CE0FC657341E20247CC6CE574F3D1A9376AC8237B49E5030E877A4E33CDE25D838EAD659EB1678706C759707FC66CE84CC968A8334C18F1632348824A6985A0331A93B59497B70C1A03A6848F18F5992972BC79F07F4222D2612797F495463836AE6CD3858D5B9BDF744A1CF361B5D454D41AC899A4FA61081B937CBABBF0FFEC1B31C162224EA36CA2CD7FCE54EC1A504932ACC5BD0B17A156DA7488F7017E4916A687FDE7FCEBB2901813B07964084AB0447A94DAC3A0D3FDA05B9F497CC1555A8C74838E29CB8CE89D304DEBE419D26BA7F3DC6E9526BD895495A5FF1D7EC83F70D045E306E7C2487A52CD7553F062D31888EF7FD27F667FCFFA984AFE0B9A4C4E85CA943812CDC157C5486B0B5EA6DA05E4BB8697113190321A976D1806DA129101E60A28B7 -pk = 06634F3B6837211D6CA7BEB76253A3D7E3EE14FFDB0FBAF2CD52F9FE224FF692FEDE8AE7A06A1E7795446DCFFFF1CF015785FAE7BEBA447620C66EF41A632682B8ABAEB82ED1E3E9D03853E9D67A2971CBB9953075688AE3E7F030DF98956401 -sk = 06634F3B6837211D6CA7BEB76253A3D7E3EE14FFDB0FBAF2CD52F9FE224FF692FEDE8AE7A06A1E7795446DCFFFF1CF015785FAE7BEBA447620C66EF41A632682B8ABAEB82ED1E3E9D03853E9D67A2971CBB9953075688AE3E7F030DF9895640102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008B3F36E4465B70D96CC7014EE829C5BD9C1FD68588FF7D78AB411676233F528317F3093EC1327945D72512DB82E0136A44B1CEE9E6256732CD2C6F5D21C2510E39D81900000000000000A6C5D9FA0A18E5794E23F5225153E18E1AC73CE7A2D19E292D87F4BFD96357263090A982A67BA94EEDC829EF173BE0460FAD4ED818AD83DB96BFE25459DDF2F3E147DBFFFFFFFFFFFFFFF6630FE88DFB5B756EE7D24DBA82635E5653597B0C3B1199509AD12A97813E46482F3223794AEEEBBA4F6CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B60A3089BA493A3FCAA3340AC6FFB722754CB714B48EBFC7375662A472872CDA1EB3F7654E44277EE80BBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E9B2534CF2F686BADBA8986EFB81BD1E4A7364C6DF2D690E86092C464E165D74EF5BD04B781B6F04E40DFE8B0EA0102638A6A1938A0D73CC197E331375B9282A96E036A0E77F9A08B84D2472B4E5149AA3CD056BD2162DB03037FDD0EB5D70359F3F6C07276E075EEBF3FBA01A66290E925FB72527E15DC13D0F9EE93B592048AC061EE9C55766D3C26233DAF034103B17DD7A8FCCCF1A2DAFBC4A462EC4F815508F30099B244F628F7DA78F69C5447C676672EE3174F04DC599BCAE380AB004B23CFC05E16B7C1F675DB161F150A3DAB6B40FA1721C61B4D82CEC6176C05E44BB5483DB649FDDE87D27016D420BC02AF06502035667E9B3EDBD0E959996CFA403C9A4F58C6B3C63030116471CAC09992BDCDF468256E608017661CE31AF00266216E85CE13168D70427975208794B0874BCDCFD371384E5C52E9CF03A1B521A6797FF6B94C9B0797DBA92E1BFD8B01CCD74E80B657D1FC7BDF6B53294C958713C8AB09A96254D66C74F314041734955F7C13781629FBB392908A654E1EAA01CCC624D7343454319631BC914FB42AEB7D6A69220ACFD73A271BF3010D3018C10EE183A10D1E72DEEEA466CC02CA79016C310C336D146A522C76CE1892423A101FF775C1BEB3C7802E6A06AEA7A7A4973DFF267121607588A6D2082A8D38710018C388DF9D000B58E17A78E6F8FC5B24A53B88DD370C78774758748A394092B07A2D340D28C634343D6E0FA5E2E45802978A9060CCDE3B407F262F0EB896A4FE43190A5FB94982C8EC21B7A4FFDA2CF3C7F4DD892A70F49B5621F1175B7BA500E05289704452E75258E049D85ED12DEE4869727172113CCB515F2EC3924CBBE4468C5849DB2A2155885603CA54F40A0178F29DE8497BC92DFBBEE8EF84700384153A5ACAF724DD4B9558106825CF96258F599DBAF370BDEBCFB7C602AA73C301 -smlen = 989 -sm = 0C090C13F4F11EB32706693B01908866FAC51C16FA32FB517F010CBCF8E219EEA5DB4021B0A0000FE20C0D5D5D8B55691A5CF701150EE396743F4463DA7F1248012E42172A1242625462AE119A0109C1798220319174A7E2B2F30195D476776290E1B7262DB09D009BE25D8AABFD286ABC0EFC750013D17A6F282462D40C484DED01B101F86550398E41832B0A8F01E1A592F5B5ED0239EF99895C01EB16AFBABA2BB9C653E1C3760142B5DDD4EE0437975EED027C0179F04B73B234E69ED3E16A4F015CFFBA4C3B6520EE6ADB0A61000189DF2E8BDCF87EA389E94D5E8FB341AB4F32F4B0C6CBA94BF6060113F8FA4931DF2671986F8D1701321EF2C99348F5E6E930A62A2707F5ABE373CE1F6FB14F2014F5BC0071B17AB2C84E8845FCBF4B15C79FBF2E5E06CFFE6CAD9A283014A975F81C9216B261CBC79EDCD58D0E20C586D7C641E0EE97221BEFE54DBCC56A594DF103EC24B52DDBB6052D1644972640F39DEB98997FEE7A252A65070798B7E46707FA440375B1BA705B3ECC7EAC56D9C45297E585299C7D747B430F0D01E82081C70B4A87846F90267D5163181DED63E089A00AFD33B0E2B3ACE91182D8CC899223CE65A5D84B86BB3E8B34B13949BC800F2145468BA5411EACD6A6C331C340D4442D28EFA0DA959A2797C7181BD4BBE6E6DFFD134CEF373ECB0EC08590F06BE0CE292D3718E2C0EFC7CB40F1DB26F5F38FDC82A72F81AFBBC16591EE02DC818D63CAE69FF0A28F942F7E07F6B0A741F3F0EBE3D0EA5859024AA408462D3D268C23F95D717C0A685A4CA73AD90EE923DB57CD6CDD828B7AB0D4AFA6A9AD7E32D407A44D7515C0A6AF52A66AD72119BA1DAEC6514DE3F8B462EC473072226AAD61135B0F5EC646BA9A127C9894E51FDD1B2D38011A2A6D7497A55283133695D0AF9B3FF7C5A8FD667231F9E511E3B8C4C3ADC44D02DE08C47B2382DE67B32826754C6BE5231CE0FC657341E20247CC6CE574F3D1A9376AC8237B49E5030E877A4E33CDE25D838EAD659EB1678706C759707FC66CE84CC968A8334C18F1632348824A6985A0331A93B59497B70C1A03A6848F18F5992972BC79F07F4222D2612797F495463836AE6CD3858D5B9BDF744A1CF361B5D454D41AC899A4FA61081B937CBABBF0FFEC1B31C162224EA36CA2CD7FCE54EC1A504932ACC5BD0B17A156DA7488F7017E4916A687FDE7FCEBB2901813B07964084AB0447A94DAC3A0D3FDA05B9F497CC1555A8C74838E29CB8CE89D304DEBE419D26BA7F3DC6E9526BD895495A5FF1D7EC83F70D045E306E7C2487A52CD7553F062D31888EF7FD27F667FCFFA984AFE0B9A4C4E85CA943812CDC157C5486B0B5EA6DA05E4BB8697113190321A976D1806DA129101E60A28B7 - -count = 22 -seed = 3222E4B55D6767E300FDE03DB3D8227E19FB8B08EA9B923FEDE18D699DC3694EFFA7C4DAE2AF57E4A0162B7C564199BD -mlen = 759 -msg = 4C4697A7D8195BC7D4B8F2FCF3A7E9419E8FC9AC6BAFC5D658260511C697286BFE44E2CE98C21C98BE42E5AF0FCEEF8AA54C5770AF287A81C7481FE3391A6111AE6243D545B2A651599B45931D7640579F8659A8BD6F77260F235F71476ED64714FDDB70C549CBE089322130F7B0A21F530508970D55CBA55BAEACBEDF684C7979078102ECFFC2C3F182F710280CABC2DECD3D3B5D3CE908CB2307B00FCC0C5412A12AECD041B5F70CC0149390312B9C81592BB0E2ECE83D4495944E29AA798DE67FD69E2BD0695DC573F78D8BB48E6B8679E1C50D1E6E58E218B77EE51597EB43ECF7301D86F457353D60E98CEDC95B4A76844E889BF7E9D03503757569E40D55AB43D63293EDDBB579FE981FFD4DAB056F85006FFB5E759B9C16F5F6B235D7DD78458A73EF37118EDF599AA504E9DB9AB5DBC90B8E478F3DC1F35A7C4604A383BBBB410CFB2C5F746F83EF94BDB2F244D421818C26827D5B7D665B8A802181EB7A9CE95B6633E24D914FECA7E969F64038ACC3009B15168426EDB67AF2CCF4E859F5C616891D355F7910ACFA599C396BBB2D2782CBF1432E6259FAA77730B6B86FE0D67730152CD2AE0F9B0314048CCD25772C01FC9773EBF06618A8CE1E940F48663427775990CDC41C4DD3E9AC6EDA1EA50E04F1D329E64C8532A7AE32238C131753D60A25810A5FFBEAA9007A6984EF69EED92B777E079CE0FF48C2AEE9C18D1DB9F49B5419EC6C0E2212DDD2E2FDEAF0FE9F2B84D9C50DDE86A70FC28BBF8918A973CC67A36E97CE3027D73891E7AEB24BAF4B12A9DC8AAB5D6AFA380BFAC3703D2D32F1E40FBB532FD6D7D710DC0741DFC7EABFE55BA5C311A00E3BE55C2EE74155E3A06685071A962D7532AC76D59FC187EFF01F8D339F74323732168FA5D14F4B2A72C9164A04A6EF14BF5DEB1833E4BAA19A55AE590F542D4448E0EAFF0E0AFD2FB30FD671631B9325F4A0BAC9A43DCD2840185A2F601117A625B0DAD5503578537BE2A535D2F556F371536BCF68C0E01C96301F08E1567DBF9D8504096A8FD89C086DB695DA191099FD1E8EA94035276D1D -pk = E5942917AFA9085E87E2A4F03A5F68C96EAA3CB5F6A9BD4E99E88EBFCDC65097D1226EFF828E157C9D0CD9B62A79840284B05A70800CE23B8622E6C7388B4DFB4BFB06FB03044085D970CF750178178CB533506963BC30D189BE9000A5CF3702 -sk = E5942917AFA9085E87E2A4F03A5F68C96EAA3CB5F6A9BD4E99E88EBFCDC65097D1226EFF828E157C9D0CD9B62A79840284B05A70800CE23B8622E6C7388B4DFB4BFB06FB03044085D970CF750178178CB533506963BC30D189BE9000A5CF370202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004AEEE1992FF3419C88D18C821DA5F083031F126A58B623D4507E685C8ADE02D3A84CCDC171A2197AE5DE8647BD9CD1D2A074022D4AB51945B5AD7F912B3B3902D9F30400000000000000A178E55FAB986CADCC154C78C20A1087924730D47C3CC361991479D3875BA27452FEF3938E3A115A4AC60B43EF001A7353046D29B9A6FE29812F8E0DE97D4DF84F0DFDFFFFFFFFFFFFFF8FFE88821AB419086AC6CF76D6CDAF3A0CD609573751108EA3E2DD7714000114C54D115446296366A722D5000000000000000000000000000000000000000000000000000000000000008E187A61121ACDA57FD8CC3015724871D216FD8921BD34BC94F810767EE6352BBB350318F9AD9783CD4A4E010000000000000000000000000000000000000000000000000000000000001B2625D54201A1976E473FE92EC9A8A1BBEC042932A576D27DCB05B4CB9A99300D2E63EC8B984EB20957E6071549A20106F907F6BED607FC291F33582EA8B177095418351A21292260414FB4798EAB9965632A822410CE6F37B4E8D5B542150235618C12AD0778453BE17FE9397BDE37519B65D098FECE942F7D2A7B8A5F01BC37FF2F6FAD182517CDF3DED1379F1B00D832CDE946DA7C9674A19AA01D10FFF395E90212E51F33CB842B49E62A2104C0E74C1513D7D552628296BF17243BB90192E2842FF8D3BCEFDB463C7EC3198AC023665092F8718D7D5F35A968458F81DC5A698C818EABAB59C324D466451C1F01DB82116A59AE116D1028FC149D15022F1EA61D49C17DE3BED6851E7F8C9C9C7E347F19B23818B334C78038A4B6DE0A035C623E2D746EA32A66FDF9610A35B931DE49469C62ACF2CBB93DE2650E915FE427186D0F409C3D1EE3CA2B69DAABDE014F11CFA51F0B8DE4FA61BE5DCBC6FD8CF7F1DBAB8D3F1A3DA51E3A990E7D6A1CAD04179DC5E4F592AE83CBBB4EE78B02363BD9F84A2C360195DD6B5936C446B567FF9FFB93B7EDDA938D895B4CA30EB347E4D82C25B49DCED752340B085D6E00411D89A549B68E442C3C86405A2FF8D26806AC54E1E8D1CC1FAE9EA9807AD2700AAC048EBD523684BAFB4AB92D8811027163E885072A1E46A51CBC03AB4AA2BC9D873640C2DD092946DF917F5B37E01E517CC81C3F43CCE1AEB4BB819BC43A0257277DBCCA453F519CEDD72B98AB378588F8F89A40C64F332D4E707BA41832EB74752EAED4A46D67C2A1F27EE5BC5B00DA23515FC66469C13202100D5133DFB44D63EE2A01247C48A35816CFCD6B412E923408EE6494C382F4B5A042041B2003E5353BFAA366E3F8C7012BD5880505D60ADBDB99819BA6FE5A585577C1C0CABED3101008E6E0C333D18416F4803E8201 -smlen = 1022 -sm = B77ED4B98C918F6635AAD1C80057BAA969C70063A4205B691F0160DE5D3CF63D395880C1CB79011328ADF5CC4E1C96BFEDFEE501E92072C199D38195FC5B1D7C0192EC3AA39159ED33FA2E05B601579C649E5937DE772BF6D6130031ABECAF1BA99071CF05E21E01F6A626F3E5CEE83304855FEB0014416F93CC060CD9ACAB5D1301E085AA0254E5891F2A18740600CC4B663CE142EB698E44F380019390D9D4911FA6071622522701635397047B5E8200059E35AE009E45FD81A817EF45D4DD004C00A61152753BE205E2D1A92F3D0101F17C3C6D0433468720A3A88D60D06A699E85C50C4DC4B9ABD21103A6C2D38424C00387FFD3357E015B8F3E6A384F630161E2962A270A4C4697A7D8195BC7D4B8F2FCF3A7E9419E8FC9AC6BAFC5D658260511C697286BFE44E2CE98C21C98BE42E5AF0FCEEF8AA54C5770AF287A81C7481FE3391A6111AE6243D545B2A651599B45931D7640579F8659A8BD6F77260F235F71476ED64714FDDB70C549CBE089322130F7B0A21F530508970D55CBA55BAEACBEDF684C7979078102ECFFC2C3F182F710280CABC2DECD3D3B5D3CE908CB2307B00FCC0C5412A12AECD041B5F70CC0149390312B9C81592BB0E2ECE83D4495944E29AA798DE67FD69E2BD0695DC573F78D8BB48E6B8679E1C50D1E6E58E218B77EE51597EB43ECF7301D86F457353D60E98CEDC95B4A76844E889BF7E9D03503757569E40D55AB43D63293EDDBB579FE981FFD4DAB056F85006FFB5E759B9C16F5F6B235D7DD78458A73EF37118EDF599AA504E9DB9AB5DBC90B8E478F3DC1F35A7C4604A383BBBB410CFB2C5F746F83EF94BDB2F244D421818C26827D5B7D665B8A802181EB7A9CE95B6633E24D914FECA7E969F64038ACC3009B15168426EDB67AF2CCF4E859F5C616891D355F7910ACFA599C396BBB2D2782CBF1432E6259FAA77730B6B86FE0D67730152CD2AE0F9B0314048CCD25772C01FC9773EBF06618A8CE1E940F48663427775990CDC41C4DD3E9AC6EDA1EA50E04F1D329E64C8532A7AE32238C131753D60A25810A5FFBEAA9007A6984EF69EED92B777E079CE0FF48C2AEE9C18D1DB9F49B5419EC6C0E2212DDD2E2FDEAF0FE9F2B84D9C50DDE86A70FC28BBF8918A973CC67A36E97CE3027D73891E7AEB24BAF4B12A9DC8AAB5D6AFA380BFAC3703D2D32F1E40FBB532FD6D7D710DC0741DFC7EABFE55BA5C311A00E3BE55C2EE74155E3A06685071A962D7532AC76D59FC187EFF01F8D339F74323732168FA5D14F4B2A72C9164A04A6EF14BF5DEB1833E4BAA19A55AE590F542D4448E0EAFF0E0AFD2FB30FD671631B9325F4A0BAC9A43DCD2840185A2F601117A625B0DAD5503578537BE2A535D2F556F371536BCF68C0E01C96301F08E1567DBF9D8504096A8FD89C086DB695DA191099FD1E8EA94035276D1D - -count = 23 -seed = F41B3C6225245C06455272A6A073F363E5F19F09A0B146AFCDFC2B3B0EA64BAA3F90359F32B2D1017608B03064E90AB2 -mlen = 792 -msg = 72713EA55F1E5CCD5787F172657C6F6C74081DE2D70816E8531497965DF02DAC04D91C4D09DCF8904CB152E2138F829386F4351015DA253A5B5EB92D96E537DAE3CE809443EA90332D9C754EB11F4DE586A83B5DEE7B1B9BD547EE7107530249B14279BAA04683D74B69D7BFC8BBCD447FE7706593C01188FE6AD8D0E2572D49F83E93986B380D4169BDD94E3311941DD2B041DFABC5AEA1297C65BB5C8352C99FF838D46B93B3E5F79E3CC5BE5408FE5E59A10D488DD65A997B086FDD96CEFB0247B2BAF7B490317E34330A879D04E374C92ADA33EE243D84DA015FDDEC243B00BD7488AEFE373E8AB1890273A7A2285988E9DAF9C4E7C5A17F54AD6195EDE2C79657E1BCCED0641E20F7EE26EAF53DD8C82827F2D2783D44FB030C95791F41653E628062267A5CF534DF00116C1ED1DE9F360B97555C65CDD80724104FB1BD4DA5785B5D9C24438557E48AEE58D57A03E06D553B05B67E1C8D10085C2F153647F174F7922FB8D2210454F7014BDDBC627756EB7CDEF99B6E3A2779F82088E3F2DA14C2DCB5B185AEB5D6ACBFAD43E286AAE8F84A58E8DF6ABC64E4A8EFD69FEA18DBFA6808F25FD418DE8BA923500B74E34DDA3CA6AD8DC208102DC4A876D8B8CD2926AEA4B3AE11A546F6235ABEA152DBDF43E0BCDFCDC83299207F294A707C8B4D1F56AA64A205C718ACA69B862AFE7489F11B324E7AF6BE68380D2CA6E0AF0E2E20F890F2CF98907A9D43135C03E85E86C9EE417140EFEE9054B46C110A84F1841AE3CFAFE5B4A95D6B2B606D8D0A70BAEA85C9412BC2D54146E9F866800E8E8615A0D64D1D595677E8C88699E3CA6097D47E9FE64050FB55033FAD4D5F226DA8EB5DDF99369ACC7552927ED3AC7368B9EFEA2443926DF26D1C172858FD8A5D4E1D7D39E7F7DF047385D39131184087CDC45B299BD1F7048E918223DA3F960608E853EE49EA667465DBBD889CBDA20FFBB540C9EBBA5C2CD16A22A57B561E01331D6EA6BDADBD6A5D2BD1441EF4E1D9DD11CC62A0FA5BBFFCBED0D27B6ACAF0889EAA5863DD9BB35920707B71A0805630D1769FEA320516E71CB2B125AC274F16F7A6876F4B922C7C006F38AE1F7183CA768715D2AF -pk = 2CE2179848EA0B165B6C95FE487FA5A30D9F079FF9E200ECFEDD41223A82A70908AF7C2D95F587AB063239A7BE14A203EECCEB2550882D62E63406A92E7D239C46FA31F41E368EC5DC544345E4559A156525DBB9068D850CF3023D79D73FAF01 -sk = 2CE2179848EA0B165B6C95FE487FA5A30D9F079FF9E200ECFEDD41223A82A70908AF7C2D95F587AB063239A7BE14A203EECCEB2550882D62E63406A92E7D239C46FA31F41E368EC5DC544345E4559A156525DBB9068D850CF3023D79D73FAF010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C4B17352253997A2819A943A02587C5CDD37FE2B7A19DAF2F3F5E439DC420E589E9611A5BD24F777F30A8F4DE06959D072359E51F39FF584622A7CFB6F07368814F71D000000000000004B87DB9AEEADD52FBD93028E8A83211605E999B2B18A21399D9F2E4D7612F0A9803B6301D46D42E8FA487427C1EFE26EC495A87DFA20A42169A8DAD0DB4F3B747053060000000000000075B9DD9FF48BDF15A4C099E231DE0BE848A1B0E7820936D9AC29FEF0E20E59629872AF271C0C89213C452901000000000000000000000000000000000000000000000000000000000000B4C0766B8EB8B2445CA305BE4A227244A5ADC80D206C711B8A7452B56C427F40FA8A64FA13031D685353A2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0EB472CB6FD96781A09073313DAD600297DFD00C00DB46356EAE9F7FA2CA41FDE6B3E082467BEE2F21D74E75A0951B03F7762B0030A7D80852D7AB538145EC08275DDB7B07ABBAA2748E74279822D747A53228FD598BD585703D1515DB9971035C33031DBDACE596537C7E573C611F2C580B86A291C35CCED1861C4187296D3A2483122C48E9A57795002164C8A40C00304BC8CEBF5D29C74C2638D58ACD52DB7D9802BB52C23F1AA57CC826198F50A1CE1B987569EBEC37CA5D1F507984B102153C454D5AA798E224B9519ED3855CA6980B64A3866920A96A6BA90D5146FB1C8FC20733A2FB0E670FAAC9EC7F930403CF387C08215E5693D04A12E8DDC5A5DEF2CECEA337102381DF122C31851FC821E24C1192441FC82BB50A44FB79B4C403A84124E524944050F7A9B73E777A2BEF9338F38809B1ECF120FE06FE42F7349E112B727324D97E1385E7C1B0687D7400A124599BD3A24BBCED6004D853336EFC95E2012CCEFC8CAECCF1B621FA6BF9C662C09493BBE17E6250568544761DCA0377928CE0DBC8DF1A15F6705114C210947E5F7E210F903BAFA4449BA8E56A2129A28E02CCB462A01CD6540CE56B5FBA005EA8A85D13024871DA8BE6C1DB7B1A6C87B3CB49167511DD26F878DC69157872C99805195B80454A858E4DC5175353004A8194C7DB29F00853B3093817835AFD39E0B44272D492BF94ECDD8BC81E8BB540E86F188A49395FBB33FF87E7DBC0009B03A63F64A0585C0562F0960372D89075742F17DA06AF373E487BFB0B616F28B76BA13EF0CA19B2BC58BD7A21BC970174B07E5919594155C3E3CAF3EEE4EE08EF1B43CE78758C5EB039DF23CE1C7988D89E63EE6AD2FD1EAA3FB62F51EC4C02C09C92272DECA829D9D2F36FAA0DBEB29D44459FE06520519683FB0A87F23B0069E390509A0B34FF22D55F35C15BE600 -smlen = 1055 -sm = BE12FF8EC60932A838B57DFF0199E7936C637A1726B1B25D1A0105BD2F218D50F1FAFAFBA11B002F2699591E5F3ACDBCC17A7A011575DCA00AC1FC0FC0575D2E01378F4E2AEA3427E8E733103E0188AAEF2C1A8991E4587F4AA50017792C035B7433A4B55F168401C0AB977E7E5C706519A95CEC01E0DD23CA9BC92AAF7F25A70A01A91E2A9878A7F9E4696878D3018DF6BA4CE4EF9D8B8878A8A000C8686DA15770C237CD4E0E30013B31A99965F934947AFCC3B20039FDFA634C1D21A44BD48AF8008D9E64B2EC66AE62232DF3E50100B7B716F3381A11624EB1F1904CFDE1C45AEB20BAC21051B9CA1203937E151ABF4C69ACDDACA3160005B27B60C854C381F9C189C6730972713EA55F1E5CCD5787F172657C6F6C74081DE2D70816E8531497965DF02DAC04D91C4D09DCF8904CB152E2138F829386F4351015DA253A5B5EB92D96E537DAE3CE809443EA90332D9C754EB11F4DE586A83B5DEE7B1B9BD547EE7107530249B14279BAA04683D74B69D7BFC8BBCD447FE7706593C01188FE6AD8D0E2572D49F83E93986B380D4169BDD94E3311941DD2B041DFABC5AEA1297C65BB5C8352C99FF838D46B93B3E5F79E3CC5BE5408FE5E59A10D488DD65A997B086FDD96CEFB0247B2BAF7B490317E34330A879D04E374C92ADA33EE243D84DA015FDDEC243B00BD7488AEFE373E8AB1890273A7A2285988E9DAF9C4E7C5A17F54AD6195EDE2C79657E1BCCED0641E20F7EE26EAF53DD8C82827F2D2783D44FB030C95791F41653E628062267A5CF534DF00116C1ED1DE9F360B97555C65CDD80724104FB1BD4DA5785B5D9C24438557E48AEE58D57A03E06D553B05B67E1C8D10085C2F153647F174F7922FB8D2210454F7014BDDBC627756EB7CDEF99B6E3A2779F82088E3F2DA14C2DCB5B185AEB5D6ACBFAD43E286AAE8F84A58E8DF6ABC64E4A8EFD69FEA18DBFA6808F25FD418DE8BA923500B74E34DDA3CA6AD8DC208102DC4A876D8B8CD2926AEA4B3AE11A546F6235ABEA152DBDF43E0BCDFCDC83299207F294A707C8B4D1F56AA64A205C718ACA69B862AFE7489F11B324E7AF6BE68380D2CA6E0AF0E2E20F890F2CF98907A9D43135C03E85E86C9EE417140EFEE9054B46C110A84F1841AE3CFAFE5B4A95D6B2B606D8D0A70BAEA85C9412BC2D54146E9F866800E8E8615A0D64D1D595677E8C88699E3CA6097D47E9FE64050FB55033FAD4D5F226DA8EB5DDF99369ACC7552927ED3AC7368B9EFEA2443926DF26D1C172858FD8A5D4E1D7D39E7F7DF047385D39131184087CDC45B299BD1F7048E918223DA3F960608E853EE49EA667465DBBD889CBDA20FFBB540C9EBBA5C2CD16A22A57B561E01331D6EA6BDADBD6A5D2BD1441EF4E1D9DD11CC62A0FA5BBFFCBED0D27B6ACAF0889EAA5863DD9BB35920707B71A0805630D1769FEA320516E71CB2B125AC274F16F7A6876F4B922C7C006F38AE1F7183CA768715D2AF - -count = 24 -seed = A08AD391E0FC57A83B74CA8CF44DB67F8178262ED9B20AA0163CDD8274AC2BE05F558B112B094244370C1AAAB75077E6 -mlen = 825 -msg = 209658CD1D801079FFE8E950BAFD70A028CFCC35B9FB00D232C5603A1D51BA13E5DE59E0277962C4474E9F3F60FCD99C9B79665B3839D5C037B921A4DE8E144FA1D38182FBDEECDA6934E814D9186591F01C5E23349B34F4439B4D402C4072CB4D702966AB473D2C39443F41FBDD0C48E566D33E076422EE72FB47B2FFD661F367E9EFDDC988BCA02382EF93590D4FE3ECE8B1D9D8B3A653219C7D131B43E2FDE2851541F467C31129E6F9B9D124221CD52610B9F138EAC1D01F193148FA0415B29F5C86D15067EB1E26C9D51F05655E8545F734F8F244854AD76C6B04C230898BEA33EFDCEEF100D79F8E3B894BA583466749B82007067806E3A7B3BA954F6FC5ABFF0E099A24D14D865F6F4538736124ACC5EAD4169DDF2144AD558DA3C74CDABEC147D2AFA113EDFD1E2280766B18792310FB6B4FE5D0D9F65906B1CC43655BB3D6178EF9093AC9C8F1A91BF49008179394EEE79E1D8E3228F567770C1BA1E30BA4BCE2465AB68F53CE21C0D8AB2F6E535828F211D4DB957DC3AF8B7E00DABD8F1F74C959B2AFF45121C5B5ABD3136C6F55D5F5FFDBCEBC3CD7A430FF3813D23BCDC1254FE6949DA4E7694028B7FCB876099E91B92C65D85C39D4BE9325AFE81703E5B18CBD7BD9EB59A9BB9408ABD966ADE9A60303807AD1B2C14C04CDF8FAE6950A55B21C9EBB5E94713BF8C2890215C5DA94B59CB31EDC671093B15FF5014DB4CD3EA8060260DC1612E9FD6E5AB40F0656121F689C8E94212269A7B24305C83BF0583418755CE690913CB081F2893FB42BC4750F2C053C48C1552430793CDDE1A49AC9E21913210D727C4BEB5640AB9B7505EA4E59AF417A085394181784BF1BB0BC32BD71CC57CE77541581F14B8BA4B758500694796262B561A38C72893C77B548D779A3833EEB064CDDBA5471CBFFBC769E139946155BF376A56415AB743DE568CD21895ED6951B5BFE1B1629DD6510DCD4483F206954964E0517546DD96900A2540A51835818D1730B0C9123E7FD8B28E6843BFFB659945A273CEA944FF6E83C234B3E43DB4630614E0B67778EA760EE341FE68C525E90475A1560821AE6B2A85015292C36EAA2E041AC04FB55922C48204525187C7E0476A9FED04EFBBA96F369D8AE709506620127FD399613A9796C4FF96D7E -pk = 9175BD572F74F2D3318D7513C97D695096D0012D81A9D7B2765125A4ADC2446D4E43CD287D7E34A15BC7F1D22A121101878D8BC1B56085B458ECFB28528FA60AA432C17468D16409C970FF27BCB8644A17FF3E455CFD2BBBB0B4C47191CC7401 -sk = 9175BD572F74F2D3318D7513C97D695096D0012D81A9D7B2765125A4ADC2446D4E43CD287D7E34A15BC7F1D22A121101878D8BC1B56085B458ECFB28528FA60AA432C17468D16409C970FF27BCB8644A17FF3E455CFD2BBBB0B4C47191CC74010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B1EA1FE926DE1634E54D1AD3258AC13F2A37FF1D65E736DEE69A0593077895B02DC8251B7C223553003FF6FE970AFA86E986F12EA6DB463E14C3BCED0427B75B0D6B0300000000000000CE9A04EF2A214CB2FCFBD616AA45E92DE276AA478A10E7C719B2625A3E9AB846D9170C0CDB8F9D95E8C119A5144DDF652B69A7372F4C506FB8C29333E849F30FDB11E6FFFFFFFFFFFFFF8698AC9F8C7015BF1E35A5CF0B7FEFF1DE9E88BA3E594A00F81743F9EA44A82BD5660DFDB9D005F2CFC0C3FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC226D41E145232C1A805AE3229FE6792783F982CAAC04D396F97B01EE81E6C0C757F495B46CFF6DEF400000000000000000000000000000000000000000000000000000000000000032AF9F3307210BA47E0CA3FCD9C5948434C0EF7D6F601170A5398627897742E34E4F02670D2C62BA4DE8C6239BC90200520753029A269AD944328FDB2200D7F113D1202BD0069D2867C73D08BEC3B4C5FCB90F11EEC8E9E967240DEA16096300818E0EB0C7C3876A74DA90F23526D12A625F4B3CC65AF0DFC2B08D3B4A193AEC593E7F31F4041E996A67C8758A8F2502A3B0427E18313DB133A04B2807F944960DEE653835DCF259B36F60FE5090ECBB7FF8F1C676671687A2BC410726C8EF01396E7BBE9D0064D79A4128ADA28165F1375C828513B2C4C9F21CE31F0CA0B84A9FCF823BC86C7C171647AFA04443E2005E5EB4CDF6625B62372739F3CA7698ABF71BCE64B03B176270F6C35BE3E840A5E3D24B20023A46E2F69CC325BA121F011AFD6DC22A5A73AE7969153B5A1565EAB0BF33D0D3BF3C93CCBD45EE56D0D07F854C248B7E93050FD2D829A0EEAE6D033FE3DB366A8A769392DCE67D3FD1A89B0229627D4CE6F164057BABC3457F4CE1484370698298C5DBB46921B66C82BD016410073E6E5C0DDA6C1BBCFCBFB1898F9C0F78FD0D7CE2ADE60BA8DED248D08417559F4B96655DCA1E78754C60DD5F03A0FD2D6114B79AEAECAE66C279D65DB5BC1BBFC353B727A4C8B8BE7762DE93BF8B62DF688CBA5B544D65C85189D0D4008247067CD0A358A3EB80F239F97B3A1F31CD1507E08890216D1814A15A37CEFDA5B350FC26B88D1D6FB11B2E4F576B00E35F4DC601234062DBB009EBE27D970CE4BC0475AE6262F44A408D4B2816592D93E84C16791B4480026FD912F132B50013BB632857380E667D83B588CEF0B3C00F207BEC68A933217F959B710BFC166FD63CEE5BDCEBB7E60B491B5CB3D82C004AF23158B4C6976B96561B0EEEFCEB85E313598C35B686E4EC7FC78DD895CF527E2D8FF6BC055D9ED59A31E5B1F2CA00 -smlen = 1088 -sm = 5E6DCF5C60317567555DE1F601F1DED6474949D7D682ACD34501F5EBF543CF91B20144A6F62C00BC67C0B0A04C0976BB9B1EE800C5A720AB8FE616B03307B28B01D32D84952A0572A9C911D17000BEEF99E8136A8666CC5CCE4D016109E8B81708FADE3F6E11270149F13E140D87231DEA2E755201033688680340C68FE9EA5E01002B482651D24B383EB3DAFE8F00BDCB9BC0B883EAE490EBD08A0096565F2149C30B4310C7923A0081B03E158210AA59C31C515901A97F3029AB20297306D9B85401A158317515745FE9E225592500009D0B9B8AE5F0B12167EAAB33B4030498DF1F04CDC1094CDBD416036DA93A332D15B7E1574DCF830002ACDA3B92639D7A90EA764E050B209658CD1D801079FFE8E950BAFD70A028CFCC35B9FB00D232C5603A1D51BA13E5DE59E0277962C4474E9F3F60FCD99C9B79665B3839D5C037B921A4DE8E144FA1D38182FBDEECDA6934E814D9186591F01C5E23349B34F4439B4D402C4072CB4D702966AB473D2C39443F41FBDD0C48E566D33E076422EE72FB47B2FFD661F367E9EFDDC988BCA02382EF93590D4FE3ECE8B1D9D8B3A653219C7D131B43E2FDE2851541F467C31129E6F9B9D124221CD52610B9F138EAC1D01F193148FA0415B29F5C86D15067EB1E26C9D51F05655E8545F734F8F244854AD76C6B04C230898BEA33EFDCEEF100D79F8E3B894BA583466749B82007067806E3A7B3BA954F6FC5ABFF0E099A24D14D865F6F4538736124ACC5EAD4169DDF2144AD558DA3C74CDABEC147D2AFA113EDFD1E2280766B18792310FB6B4FE5D0D9F65906B1CC43655BB3D6178EF9093AC9C8F1A91BF49008179394EEE79E1D8E3228F567770C1BA1E30BA4BCE2465AB68F53CE21C0D8AB2F6E535828F211D4DB957DC3AF8B7E00DABD8F1F74C959B2AFF45121C5B5ABD3136C6F55D5F5FFDBCEBC3CD7A430FF3813D23BCDC1254FE6949DA4E7694028B7FCB876099E91B92C65D85C39D4BE9325AFE81703E5B18CBD7BD9EB59A9BB9408ABD966ADE9A60303807AD1B2C14C04CDF8FAE6950A55B21C9EBB5E94713BF8C2890215C5DA94B59CB31EDC671093B15FF5014DB4CD3EA8060260DC1612E9FD6E5AB40F0656121F689C8E94212269A7B24305C83BF0583418755CE690913CB081F2893FB42BC4750F2C053C48C1552430793CDDE1A49AC9E21913210D727C4BEB5640AB9B7505EA4E59AF417A085394181784BF1BB0BC32BD71CC57CE77541581F14B8BA4B758500694796262B561A38C72893C77B548D779A3833EEB064CDDBA5471CBFFBC769E139946155BF376A56415AB743DE568CD21895ED6951B5BFE1B1629DD6510DCD4483F206954964E0517546DD96900A2540A51835818D1730B0C9123E7FD8B28E6843BFFB659945A273CEA944FF6E83C234B3E43DB4630614E0B67778EA760EE341FE68C525E90475A1560821AE6B2A85015292C36EAA2E041AC04FB55922C48204525187C7E0476A9FED04EFBBA96F369D8AE709506620127FD399613A9796C4FF96D7E - -count = 25 -seed = 6E0A8EF5156D693FD0140BC4A31084E79773A83F42C8D133AC8A9D62DE3CD74511F893DCB26041E6B35E2B175408FCE7 -mlen = 858 -msg = 8F37A065DD696AD437EC82909261B842EC0A3E66F8AC574105A3C82EC8B4926F2466FA550F8EA1B6A9A142C00AFA44BE6512A85350930DFFC99B95AA21012057051B68C48581AE439B9290A163AA4B6AFCF80FFB91A3321C7B9ABAD56D5DC1BE4E67E5576C9F3A7DB96071859B94EB22A73DD96C66AE67AB11D1AB62A86D826C682DFB8CCA3259DCB5B34BE635421CD4206E7D92147F14C36424EAA407B441F58E5C187E58A26B2AE144888A3CC1387AC7D0A681EEDDC3B7781AB282E8185CCF33FB27500CFD119E0415DB1E45237520A868C8457C88A1D3EE97EC9451DA35D7E74924F8902949E7EB14BA87C8AC672D7E4F3BEC1B2814DFA67A8DD2E2D4FF4661D64BC4C6D6A78D4E489689B6063CDFF5A3F1554501B424284A9F4B8FE777FE4E6AFB83A85E36200A9AB40B9C18678454B2A3F50A4862BA1E36F0C57AD004FF90192B5619614E37DBB38A1B8A65AC613F7796C70772128377065B84F122540106D1B4F9123C4E009B4C0A85D59B35F72DEBDDD154ABEC7F3FB25FD1FA04367386098DE610B26FA3ECB031A6072D14607E92FFBE195ABFF71E586A984131AF24E18AE94DBAB0544FD2AD217960F337111BFBD4046809EA03C7C47B7177757A4A43E1FD0134859BA735A8FC17597E593BB58322136602954D3A21096B0D1DEE5CF0AD17A5FCF561FFA21CAA70D33998840E4CFA18BA481704A8B82D2CC1C110FC9A6704751365AE9F338AFE4CF9C811697DDDFA8635A2F3CD02DD1845251014BF2F2D6C02A907BD783207C4773A937048A07C500D7C424B5F65A2C376523740DF9A0B60437CB8AE17D64DD51DD4E433AF83B20C4B6B890B97976DF09E3A86AC19006C229D59FC7A2923245B7B1F0ACF7C42E486D41CA1AC1D7051AEEF6003CE94182F97D099C74317F61EB47AE18C2BED6A3CB253C21EC835E435123E0A657ED926F880CE8E5DE3155272328A467278F52AC50A1121AE818A3EA3A2E1F7401CE23AAF66A4AC289748A7E98A5124C586D8957BB4EDD3F091492BB1A64D75EFCD45AD51CA420F15DA848B20DC6BB765E7B71359B3A9E95E121266AE4A40DC2E9A3D81EA1B1A643594B3D4E6ABB7D1202201DE92BDF0CC1ED977E2D5851822A01F48A6F23180822888CE345AC9BE0CC69BC448D41CA20B79C35B1DAD73E6C683E70C4439B404CBF07FCC39B0E5A1D33F3717A6BAD28A6DA4F091BC7A -pk = 571CC2FFA75C8111F0F1D25CA09D3DE6B2F102908B1890EBF0779F92AF88CB31D4D31F6B7D0DA9487855AAB77E3E140159CA3CAF65D18242CDF87745A04040B528C1C46EB73B1C41427C85EE8771E3BA267A475B87775FAC6F459705F4E3C901 -sk = 571CC2FFA75C8111F0F1D25CA09D3DE6B2F102908B1890EBF0779F92AF88CB31D4D31F6B7D0DA9487855AAB77E3E140159CA3CAF65D18242CDF87745A04040B528C1C46EB73B1C41427C85EE8771E3BA267A475B87775FAC6F459705F4E3C9010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E6F40F655B904C729D13EB1211C73929EE46467724C3379858A094C72473244D85A8C37F63E7FA49DAB4C276B6F4679B134AFFFDBFFC49080FCFB09C8CE2652DA9240300000000000000A5D016EB78D8E0512838831A84A8E7C5589EE81C33C9DCABB467F522FD5B43A0744DE58D184BAE37031C1455E922780F426559724BEF1EDAD95E30370345386D57AAE3FFFFFFFFFFFFFFFB0227B4A1652F0D3A47EB021B0D1C6222608D8ED4875AF7D38ECAA55148D51E8F5894C8D1FA00F456B7DAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A582D149895C0FA3F52028E04AB3F18C2EFD8C7970B48B24E149AB8A0EA023E80FD1A5B5FE4741B8BF3920100000000000000000000000000000000000000000000000000000000000040C3C1764A1BF62C24B22F8E67479F6BDEE3E5DF49502E0339C371ECABF15228FDB3A9C724465D0B744E3788E28166017D7B1E154C62268DE0A182589646823A5211154682C837E8790E8F11766E3B4E33E8827DBC1DDF50AA9B6EE9F1EFFB019CC780883EF101C3AEF928F6C76B9AABE46FDCC55F1D6620F32DC6882B01742F4332D083EB3037399FF3150204801700DABD33D7B74878FEB3CE9A60935156F345414DD2D26625615742A7746F7CABCF370A0F877E4F192FB788B8E06BCDE901BB247767428036E6EF04C05AC167372C89060BCDF25F1CCEB73C33CCAB9765BA4C1BCCDEC5056C6FF67A1AE711D73601EF32892B9F7D175B5FF3820DEE7C4D822A538E8E9F7E62E01554397CECAFCAF42A1B3C02FC4BCB34506A5330152DC403DF9F1D05E0D3DF5B2DEE0AA9088D107B125785FE321A9F6602E69C8D31F90E17509C2A187255E1A08308A21F1EA61203E34F2DB3BE3AF105BB647603AD5A4296977BD7FB7F22850C0167B3E052B3DC84A2801A29DE331ABD7C4C8F2233AF4900D3E77CED9C4F9665855ACF264941414A2D299ADB6A11878C236AFF71429A9D8B9E2A5B4356F695372B144530BBF5930068ED887E92AC0D2A614DE813BD65143D72C695800EB0F405D96BB258335A40F3B9E942AAE4BA66F6544EB13895209001E2B0985465B44CAF4675C9DD1EAF91D3BB2BF42EE3233A1A0367B40B2ECB18E7AA84E10F6C32D855874B17BF6AB7D8025441DECD256B35811934E5F17E0C57F9F64E6BB9B54FF4222C5B2F30801132388CDA2CBFF330D323301A2F1626405A037DEC2F70613758D60EE63FA4EF302C303EE7B0A8C0A6687C33DC551DB073678CF61FDB7E8CFF963E2281D405077B2500C1D238832FFB1339BA64940CF86AC50722CE668827702306DCF5BD224D1D99634373602358487D75E8EA31584CD40903 -smlen = 1121 -sm = 2287F02B654F133D54E73EE00011C5035D9C15C61B20504416005DC37F9018DC0A9DFD2BDBC5008DC353D6D6A2DDC3D97C3A81016F2AAED0E8B101A31B95859B0148F36F0A2DBBAD647374C2E900E9B7E60861D45A329F02D1A001DFE2E4674860E235E95DB27F0013B8E4341C52E6F8A782C1890190A003F6E5DD1C8F53DE4145011639F55D7ECA2B2AACBEE006001D8C01F51582DFD3E66DA27A0184C8984791C4922652AA80BE00AB5247E30C7DC8D4A537C609018A8A94D1F38F5BDE3E9FAB8D016AB63BE4970BE99C61858AB20100990ADD12587385C0D0DFD1B45682CBDF696B7CA8222938F7DA1102925493DFF3E75F9DDF94CE2701DEC7942354725E2C92160AFB31038F37A065DD696AD437EC82909261B842EC0A3E66F8AC574105A3C82EC8B4926F2466FA550F8EA1B6A9A142C00AFA44BE6512A85350930DFFC99B95AA21012057051B68C48581AE439B9290A163AA4B6AFCF80FFB91A3321C7B9ABAD56D5DC1BE4E67E5576C9F3A7DB96071859B94EB22A73DD96C66AE67AB11D1AB62A86D826C682DFB8CCA3259DCB5B34BE635421CD4206E7D92147F14C36424EAA407B441F58E5C187E58A26B2AE144888A3CC1387AC7D0A681EEDDC3B7781AB282E8185CCF33FB27500CFD119E0415DB1E45237520A868C8457C88A1D3EE97EC9451DA35D7E74924F8902949E7EB14BA87C8AC672D7E4F3BEC1B2814DFA67A8DD2E2D4FF4661D64BC4C6D6A78D4E489689B6063CDFF5A3F1554501B424284A9F4B8FE777FE4E6AFB83A85E36200A9AB40B9C18678454B2A3F50A4862BA1E36F0C57AD004FF90192B5619614E37DBB38A1B8A65AC613F7796C70772128377065B84F122540106D1B4F9123C4E009B4C0A85D59B35F72DEBDDD154ABEC7F3FB25FD1FA04367386098DE610B26FA3ECB031A6072D14607E92FFBE195ABFF71E586A984131AF24E18AE94DBAB0544FD2AD217960F337111BFBD4046809EA03C7C47B7177757A4A43E1FD0134859BA735A8FC17597E593BB58322136602954D3A21096B0D1DEE5CF0AD17A5FCF561FFA21CAA70D33998840E4CFA18BA481704A8B82D2CC1C110FC9A6704751365AE9F338AFE4CF9C811697DDDFA8635A2F3CD02DD1845251014BF2F2D6C02A907BD783207C4773A937048A07C500D7C424B5F65A2C376523740DF9A0B60437CB8AE17D64DD51DD4E433AF83B20C4B6B890B97976DF09E3A86AC19006C229D59FC7A2923245B7B1F0ACF7C42E486D41CA1AC1D7051AEEF6003CE94182F97D099C74317F61EB47AE18C2BED6A3CB253C21EC835E435123E0A657ED926F880CE8E5DE3155272328A467278F52AC50A1121AE818A3EA3A2E1F7401CE23AAF66A4AC289748A7E98A5124C586D8957BB4EDD3F091492BB1A64D75EFCD45AD51CA420F15DA848B20DC6BB765E7B71359B3A9E95E121266AE4A40DC2E9A3D81EA1B1A643594B3D4E6ABB7D1202201DE92BDF0CC1ED977E2D5851822A01F48A6F23180822888CE345AC9BE0CC69BC448D41CA20B79C35B1DAD73E6C683E70C4439B404CBF07FCC39B0E5A1D33F3717A6BAD28A6DA4F091BC7A - -count = 26 -seed = 49CC05312D1DBE216FF03B60575017A6A1464C06D2C5A4A6F973AD9F275F7C66163A29A803BE759B117043862D277C27 -mlen = 891 -msg = 30D61C6FBD64113FCED8C5205026EBAC0D9F3522182617CB00B6E70C8DA62ECC1BBC8E1FDAF17CC61DD01CE85A9072CC1D9D34FDADBA5B93E0AAB4C9C4C9E26D3F7F145FCB23673B6E0B373C0FD1A58F52486B72624EF91A539519EE5305772A006E49521744912BCF3CDBAD424F00428AA96CCC21D000EFB09DA5CE652E361A6FB649A060835E3B9DC9CBEC660C7531620115EC905DCA6EE2A1CE36554C0FC1D6DD6863B8F3843508ED5C214B6923E7F5C0304E9B0D5E5E433BD029116A33A60CB980737AC950577D0594BFE0AD2225CB8D3FA42F192B0EC05A49391632A32FA931C0FBD83A7B6EA24301AD0906E7911F9D900D19AE1247ABABB1C0E9B9BD165185D9D7413EA068FE8824CCE5B3AD51FE8E2BB2C4022C61B002C1DF4852E4910F38613787CA12371038B6364D920E07B4B417401253451DDC25624B5D038B2DFE29B8494EC960F87803CAA256A95C9868AF819747E4BF26FAABA6DDBAED93A7815C795AD5EB7FB4592DF678AC1375388CC7ED3A6230CBE80ABBB113C80B70C789CF0C66B943E67CE814F12D3D83F3B90A4320FEB7FB81DC93B05D7FE2D36584399214D3D7C71AEF322A5D04B5470703B3660BF86B0B17BA9FF23E45F7BEFEC3758786D2111C81BA4D81B83FEEA35A0668E5EB3694963BB4DB3ACCE4FCBA6F3F6FED9627580DD2D2DC103EF7E52BB9745BD42A7FBDB459B5C8AAEBA67686EB899E3177FAF0897C61B008ACE3304C41B4C79E2EF9C865E9958D8716BDDB69154FB33187D927B5296C1589FB1AE3D553F116FF6CAE56910CE6717C446B9947AB2A981A8F5999C1C6E517EB3FE584F5D10059910E22F40FBDDB709C9F686F51ABF7D7206A8BAB4A346B51523C362D749238D7EF6671A89CD86A8540604F134D760267E91EB92FC0FC275CAB69C776EF81DBAD35027E5307F1D34EBF5D6E4DF424D709666A1E649C044C4930098B2E6E3782A93976B55073C504563C7E052B6816C07F0FD54A759D2BC189FAC3FF54549FC4DE192EFB58A9E301863A77380967735910F63D35EF5FDBD8751DE4BC6BF2E3095628DC7F67C1F5571D17AA342593B2C7F953C3F0F22DA1862122031BBEAF0D00A029C043304E3E2609C4FED8A7404FA10E2EC846A70EB0E37C5BE61E698CF2296EC1FBE6FED75F6FE3113C23B29AFB5A6D7E3A9E46E2D89D8C06450CEA11492C1A97F7D6BE8FF6C014930043022B264FD32593952BC606F779598631E48EED86EC2A013D8EB866F311A400 -pk = BA9DB4A1D2ADC3C0159EFBD93B2194E185E0FD0D546546C86E29059F67204C444D455FCCA5E348117B3B5AD2C3C2C301C4C147ABB9994E528278FB0724C0BE878878D074451E4807D4D678BA153358C51994C1D3FF4AF574A4CD9F9D3B828A01 -sk = BA9DB4A1D2ADC3C0159EFBD93B2194E185E0FD0D546546C86E29059F67204C444D455FCCA5E348117B3B5AD2C3C2C301C4C147ABB9994E528278FB0724C0BE878878D074451E4807D4D678BA153358C51994C1D3FF4AF574A4CD9F9D3B828A010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D3D62CD3CA7548A8FE6A6AF0770150DC810433F370EDF19DEFB2B691C74792B3F2C695C98CBCC33072C9D30BF124A07C0BF0FCB304CFED009B9AA13CEEAEB421FDB4E6FFFFFFFFFFFFFF58F1562B04B7B95020C9080130469DAA31D9347D6020C54E76534482EF00FAB7673030D725551ABEECCC9DE0812A06747FEAEFF931201F8B27581B39A19A8013BB04EBFFFFFFFFFFFFFF50F43DB13874C55A225A069884B067FCBC5ECB380F795BB61790A44EAAF6CFDED1FC7F353C0BC37E6D1B09FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4DE870CE120D0090B583BEA9A30C1E19F67D84BA5C51782E513D73719E756946F8603EF00D615510178949010000000000000000000000000000000000000000000000000000000000006D23670C8EA30F6955A023416F700D847D94B435BF551D6381FC5216FA45096870BF19E97DF4D62A057CF99ABAAFF802D754B5F404136C728D7CC8B100B06C6EFCE2C14E827F75D7ACFD8B26B1665E974D624119FEA3B8F937D16688E4F5060252193ACCD2F773D9076EA34D1BD445019B493030A3407B17BF19A71B4ABD4F46146A723DB666E4E87DA8910781B27602A271262E9DDD26C6A55DF7C890FC58381E45D30DF401F0ECEEE07D8F2A81E21659DB90487449D8C9C729536EB42F790106C23F8C3C82973B020D471E266DDD97A15BBB8F2571BFFF2F7CFE949F22DD4BDD8337FCAF13B6AB46407EB420187E00F6210F9F2AB7DA2C83700BC33BC4789FBE0226D39884D946EE1DD24E8B4002F691612E3F4919F9808A231CFB5BE02701390DFBB61BDA2DC7AD1804C9592E59C1C84857FA80F3021392B93A85E2BEEDD92E3E82CF732837E138A64192194BAA02440B577F9F2DE3FE795156AC111518C4682B9370E120D8B672A826C619339AB50AFFDDE494D408BCEF6741DC2ED6960361AF4D57B36D8ABA4B3BAFAD42176AB5959A6291656DB9270F23A5F029BBA55F44C423ADDF455BB1A1B0D64A21DF1201ACE641078C1BC6A4BDDA99320DEEAAA365DA6FE701FC56CDC4D41513C344635E6CB27DD8675395835F49F8882F62C901FF010B4763BF55BBBE0670E43FFA7FF6AE125D12183FDD710BDB19F89D98C143A077FB4B85DAD580F896E18A0E8E080343822AAB2A072163DFD2DA33E76B6A46FA2CF39963F4837C3D8ECA39C6ABF7D4F052C1D3C2AFAA93CCBC0274797BFC0180EA21DED53D8A154981B783343C3D9FD4A7E83BEBD9A59A5C2CCADB238F2E49C71D422913EDFF4DA46EA9F9F58B7E0087FB6863F368C02DAC2FDE6740304FF7D2C140D96E9B9780D1D998502452AEE853404F64A95CEC4CB49987EC47036101 -smlen = 1154 -sm = 36453464F6B3AEA160137BCA011F2C2CF59877677FF9D6BAFA00AAF331971EC847F845F69F0E01B6A0727DCD5CFF126093590D004F66F90BD927BDB0978A560301CA75940D823652CDD2E752E3000FC91A2F86A36544404826220118C1DFD0CFEB0D160515F25F01BD8B9989D5C7D6B2A53D2E4D0062C5614CDBD016597625BF5000BB988EC869621B342F8204C6010018DEB988A6DE992393556D00435DD350B6286500705904590096B0A7ECBD90E38B3064A70E001DD47DCD41B85B1DFBF0B595007EA8C4EF0DAC4066F78FB2EC0001E7CE7061CE39E55C8E16BA294D34200CA79721747F4B4C87F1120388810D7C9B25B9154E5AC96501488FAE0BFED79B51A47945C06E0930D61C6FBD64113FCED8C5205026EBAC0D9F3522182617CB00B6E70C8DA62ECC1BBC8E1FDAF17CC61DD01CE85A9072CC1D9D34FDADBA5B93E0AAB4C9C4C9E26D3F7F145FCB23673B6E0B373C0FD1A58F52486B72624EF91A539519EE5305772A006E49521744912BCF3CDBAD424F00428AA96CCC21D000EFB09DA5CE652E361A6FB649A060835E3B9DC9CBEC660C7531620115EC905DCA6EE2A1CE36554C0FC1D6DD6863B8F3843508ED5C214B6923E7F5C0304E9B0D5E5E433BD029116A33A60CB980737AC950577D0594BFE0AD2225CB8D3FA42F192B0EC05A49391632A32FA931C0FBD83A7B6EA24301AD0906E7911F9D900D19AE1247ABABB1C0E9B9BD165185D9D7413EA068FE8824CCE5B3AD51FE8E2BB2C4022C61B002C1DF4852E4910F38613787CA12371038B6364D920E07B4B417401253451DDC25624B5D038B2DFE29B8494EC960F87803CAA256A95C9868AF819747E4BF26FAABA6DDBAED93A7815C795AD5EB7FB4592DF678AC1375388CC7ED3A6230CBE80ABBB113C80B70C789CF0C66B943E67CE814F12D3D83F3B90A4320FEB7FB81DC93B05D7FE2D36584399214D3D7C71AEF322A5D04B5470703B3660BF86B0B17BA9FF23E45F7BEFEC3758786D2111C81BA4D81B83FEEA35A0668E5EB3694963BB4DB3ACCE4FCBA6F3F6FED9627580DD2D2DC103EF7E52BB9745BD42A7FBDB459B5C8AAEBA67686EB899E3177FAF0897C61B008ACE3304C41B4C79E2EF9C865E9958D8716BDDB69154FB33187D927B5296C1589FB1AE3D553F116FF6CAE56910CE6717C446B9947AB2A981A8F5999C1C6E517EB3FE584F5D10059910E22F40FBDDB709C9F686F51ABF7D7206A8BAB4A346B51523C362D749238D7EF6671A89CD86A8540604F134D760267E91EB92FC0FC275CAB69C776EF81DBAD35027E5307F1D34EBF5D6E4DF424D709666A1E649C044C4930098B2E6E3782A93976B55073C504563C7E052B6816C07F0FD54A759D2BC189FAC3FF54549FC4DE192EFB58A9E301863A77380967735910F63D35EF5FDBD8751DE4BC6BF2E3095628DC7F67C1F5571D17AA342593B2C7F953C3F0F22DA1862122031BBEAF0D00A029C043304E3E2609C4FED8A7404FA10E2EC846A70EB0E37C5BE61E698CF2296EC1FBE6FED75F6FE3113C23B29AFB5A6D7E3A9E46E2D89D8C06450CEA11492C1A97F7D6BE8FF6C014930043022B264FD32593952BC606F779598631E48EED86EC2A013D8EB866F311A400 - -count = 27 -seed = C33EE43A9CBB4347BFAF71147B7FBDD88D212462CB06FBE695A35402C503CD15732B7D0E8BF829A555B9167BCFA2F2BF -mlen = 924 -msg = C83441B16B39BD7993766E7260D07751AF2F19A41E70689B0EEED0C118D9EF109866AAEF31B2D2962A25A3D1CA999214CDF0EB54598382EEAD64435B7122D275EA8879BD47B41EB64EA908867FD78ECFBE8E992A2636AA7477DE5058179565D3A2CEB8ACE5C0302018043C411D89975A64927B48CB622A13F1ED85CC1113897A68488161AFA1E636EC786A0AA37B928BA88A50164A9EC372523AA9EC8885AA9C95B29F7CA1BBF0652BAC195BA94E976D336B69A9F5346B4C7C81457F802DC9757C7A2435A617317340F764C1A2AE131A716318F00AF0EFA89D3B57D8F31E155598B3944D950D6A1D6485B509358EFB3745B95EDC30DCFF02574F54DFB2D31B259D132D18897DF868115679F06D41102CD4EED4EA290F711148B99B647B8555A4C0DCA1D2D0871C59AB1382A2D6417E6236D71E2BFA1A75CDA54F93E6C087D611878AC7670A04FD7D8CB0993F456E3BC1C3B5898076E22D2D9E0EEBC7D7BB8D142BD2B5F6FA42B40BF676FB69C532D7520A4A105EF0C1337F53D6E9B4BA17F1E76AF4CFDF08F794752D2BF71E8777E2A209F8891B1A53D7BF2A5786B00B9A0CD0FCE79408F26BEFA2535BE188A68201B1514074CD70660971F86E8D3E92790AE7AC591AA7A996149BCDF060C615209FFAB82E6000F41B2A5606FDAF4CD08CAB0C2F1103B2436B1FD7DEC477C6233FBCA3B07A0CA01BF3476BFE5334E32AAA2ED35D5747D673E7BB622E1AA7901C77F28A3AB2197C8B8253A1D28C969EEE73D17AD71C7919E7F217BA2BADBD1EBF986CFE981024FC347028C1109CD4204C7D53535A9B677E39A43193E054D0FD68104D88934DC7BA6CB3E942AEC744B935CDCFEEF4221784F96798E650FFB0FEBF2715D75339D0CB6C2E57C1E9D10F13E6786B7F041AB307B8CFA51A2F10B622995230FBA54B70D94AE278EC224D9D0950BA97BEBA7EEB0E2FBC4093E548D9EC09CA1A08E5F0483024D7C1927FF8DC270900D42D31B81B13A29839BD746CBB3591BC33817741A31DEA308F549A74F3A4E5478844183B8D7363AC1F4D4A5E907D9ED98AFD08FB8BAA84C324563495387A4F12C239FB63F0810447131311B2D2CA302C7DA2DA57C94C3B5E844F537886FB766EC0E977254DBCA8FC84AD77430428F0692E55D8E2CAB294B857AB51A2CE4A725433DF28D9CABA86C770743AD987BBA58C0565BD18590931E283292889294B607A5F19D9E905AA3940836E2A74A2E94FF3062E85A5C6C978B5EB2B254BBCDE128280E6CF02C11A0C2066F349E3C6C083965D5B8A9C000E15FF36C5BF3A6D42 -pk = 936CA59F9F37E0E2881CD3DE4FC1D73554BFD57E956B01C97BF3BAADD9E988D0BBED6C969FB01169484149F9A3E0F802A71572AF443082448B9AFBDC04B895C65D95501B6B617A5489ADEBBD60BB42ECCC644DAB8D969F213DD7713886842B00 -sk = 936CA59F9F37E0E2881CD3DE4FC1D73554BFD57E956B01C97BF3BAADD9E988D0BBED6C969FB01169484149F9A3E0F802A71572AF443082448B9AFBDC04B895C65D95501B6B617A5489ADEBBD60BB42ECCC644DAB8D969F213DD7713886842B00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016B74B3E067CA8240845E688C3D0F7247E288DE12F228CDE1435C1AA22F998FE996BAD0C819F657EFCF5D17F778732DCA206462AA4163AE70E41370919DC7431838A2B000000000000004778E38226A70F303D426D33660138F83B6294E35BCD74B31D31BE214D61E0152FE1CA3B46373150B7F63D3A9733B9D180DBA05012A2A029EB89F5996BB80546369C04000000000000000798C3465486ED717AEC15F23DD960DD3DEBE0FD8E7651A9F3FBA11DDB2F6A50BB6F71BBE97221DEC88A53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AA9CBF8FDB1EFF4741A040C826E43C046D947AA7957E06A3753FA2E38699B2A0C00280E0C5C4552C4A643010000000000000000000000000000000000000000000000000000000000004D9F72451038B56AD5FB7536F4184C9B7D72007CCE9757858529714CEE9B10F268A1107CEFC6FABEBAFA4C5F9AAAC00382D6B4FE3298DA5BD865EFE64C468B8281D0A721B4A21A4CFBF6923CB5ECAA89D43AF635B30C044C55439432EC6293008EA3BE611EA0008BBDB17BB71299C4964FC51654EB38FAE8A5886274FC9C0EDAD705D5D888BA09107D20923C8B3180019DD52F5DACF8FBC6E2838569997E2CCF50C04105191E65AA9BCE668C0D1A45FA06242B32BD21F603138FE8F79F7C7602516D8B2811AB11E6C397F401EAF5390688BDC381C88BEC92034C665035AC272E3B065625CC0BB32032D0CA6D062AC50287AEA84A3E7791EF6E6D2920A227EC12DF9FB259A543D06BB22C1C1E01697C2A4DF8019D49F65AC3D94D754097956F035BFC73C4B3FE2F5A3B595F683CD3716A89354822162255CB25E6FB0A7AFC59E2DFEA2F3684C15B367B8B5FD281564101892B2CDC3CF0BB4AF492322865273879011676161B7A791C39AD67156066F56DD7EA69DA4A010F68B13B4D3833213502B2EB84F8B2CBA8673FCEAF4F128CF873BF44580B62BBC05F53738022D3968AB603168679ADB0DDA09FD37C2F9377B70005DDCE19710118C46C8957B26D3042787D4FBB1FE7ED1E2C7C951552CE68BD521268F607719198CD90D18654A0075F01B52ACFB494595D4BE1807CC0C5C7F245403A84907E788A149F6E6AE4898FFB754408F756EF9D45686C3E62C56FC74D02187E9A6C6CC7F286B712159F4F5974F13C0A502C08FFB4F16F8999A76E1543D2E798866B05CA56BBB785B4898DAD9C010D354D053A38BA3E4F12C027AE9B65D69CB59E869AEB0882E6A6E9DD01FD4224E7F0CA38054D7464BA9E2E3F7C16C70265AE1F68E086C555881DFBA7EF18B1483465A04397EE265C7DD712E0BF2680A6693AAF330B5401465C53873051705D03 -smlen = 1187 -sm = C8CD3B5EED5963E1DF6F137C01BE1226CD65FA4E9F1551605001B49CEE80BD95262430C026600092B3019A7FC4F2FDA4811FB401D85EF3E195975A4234E2A43F0057625E9F062A6EACF1E1DB7F01453BFC5EDAB5E547FDD260A90149C3FE76919F551997E32F5F016DF16E20F083618FA310EFA50134FC94D2ACBFDC959B0B15C300AB506BD6A2897C3C3233DD6F00A23B6291B681ECB6967F2BBA019F9F6B6D0FB029B264579FE90196ED15DBE0043725B22D0B7701C50DC8C588DB1F3669C0079900A14F963625CDEABA6E4766A1000021C4ED07E025C5412826BCCB0D98D2076AD4B8EE5783B0E3AC1802B0B3F003D3D29ED87E6192D6000F235076FF09F312130462D69B00C83441B16B39BD7993766E7260D07751AF2F19A41E70689B0EEED0C118D9EF109866AAEF31B2D2962A25A3D1CA999214CDF0EB54598382EEAD64435B7122D275EA8879BD47B41EB64EA908867FD78ECFBE8E992A2636AA7477DE5058179565D3A2CEB8ACE5C0302018043C411D89975A64927B48CB622A13F1ED85CC1113897A68488161AFA1E636EC786A0AA37B928BA88A50164A9EC372523AA9EC8885AA9C95B29F7CA1BBF0652BAC195BA94E976D336B69A9F5346B4C7C81457F802DC9757C7A2435A617317340F764C1A2AE131A716318F00AF0EFA89D3B57D8F31E155598B3944D950D6A1D6485B509358EFB3745B95EDC30DCFF02574F54DFB2D31B259D132D18897DF868115679F06D41102CD4EED4EA290F711148B99B647B8555A4C0DCA1D2D0871C59AB1382A2D6417E6236D71E2BFA1A75CDA54F93E6C087D611878AC7670A04FD7D8CB0993F456E3BC1C3B5898076E22D2D9E0EEBC7D7BB8D142BD2B5F6FA42B40BF676FB69C532D7520A4A105EF0C1337F53D6E9B4BA17F1E76AF4CFDF08F794752D2BF71E8777E2A209F8891B1A53D7BF2A5786B00B9A0CD0FCE79408F26BEFA2535BE188A68201B1514074CD70660971F86E8D3E92790AE7AC591AA7A996149BCDF060C615209FFAB82E6000F41B2A5606FDAF4CD08CAB0C2F1103B2436B1FD7DEC477C6233FBCA3B07A0CA01BF3476BFE5334E32AAA2ED35D5747D673E7BB622E1AA7901C77F28A3AB2197C8B8253A1D28C969EEE73D17AD71C7919E7F217BA2BADBD1EBF986CFE981024FC347028C1109CD4204C7D53535A9B677E39A43193E054D0FD68104D88934DC7BA6CB3E942AEC744B935CDCFEEF4221784F96798E650FFB0FEBF2715D75339D0CB6C2E57C1E9D10F13E6786B7F041AB307B8CFA51A2F10B622995230FBA54B70D94AE278EC224D9D0950BA97BEBA7EEB0E2FBC4093E548D9EC09CA1A08E5F0483024D7C1927FF8DC270900D42D31B81B13A29839BD746CBB3591BC33817741A31DEA308F549A74F3A4E5478844183B8D7363AC1F4D4A5E907D9ED98AFD08FB8BAA84C324563495387A4F12C239FB63F0810447131311B2D2CA302C7DA2DA57C94C3B5E844F537886FB766EC0E977254DBCA8FC84AD77430428F0692E55D8E2CAB294B857AB51A2CE4A725433DF28D9CABA86C770743AD987BBA58C0565BD18590931E283292889294B607A5F19D9E905AA3940836E2A74A2E94FF3062E85A5C6C978B5EB2B254BBCDE128280E6CF02C11A0C2066F349E3C6C083965D5B8A9C000E15FF36C5BF3A6D42 - -count = 28 -seed = 19CB4BE2332F7FF0C078BC001FAB3C5FD8569A76EBCE373D1ED4FC8EB5D744C6464E2B5EECB9EE836CD5D87BEDA78BA7 -mlen = 957 -msg = 86D27C1FCDB8164F8909073F590D0A280E5EF193B0C42863BA518BC8A51E625658DBE2184C3353FAEB674C991EED3F1B0FE3BBE50A21EC70E9F57B97C38D6E436D3DD577D7056B07A401FF0EBBBEFAF8212B993A39281190E309ED0C50B269E4852DEA85432A5941269FDF63766B21D25D8816DE5E87FFA051009D232D6B258C5F43F45F2D48BE09B2CCD8FC963FAD81FB368502057AFA7C865D62D932F652802A299295B29411439DCF832E8367A749B4D7ADF7E8ABDE3EBFB844A9B1D32F77B2BF96B5D29FC15DAE83EA80A990AEF6590776CE1CB81587ADA80B9A7B45ACA3BBC54DBE67DF090104FA196701280B97607A333A9B56A728710CC1CBB7569B79FF034572495181A92D2380A7EE5E9CD1B0F758C2BFBCC4E11464F1CC7D91F117319C30CCBF4C11E60B5DEC724225B8D77B71AA58F5FBD498A3F49115687D58393BE648805BA1737BB921A08D738243920C3834F8782A8256B7DD22CCD5F4ECE86B8A0860BFF21C5C8F0BE987F2D510ED4DF9CF94BF698680B7CFA22A575A3D1B5B431734B59A4B31913019C1F42DCB76A9FF32BFBC6E16D2FADE26E3C17BAE49CC415E4B370D1FB43FF652BE62D18B0AFFDF286765F4F30FC8D6F2C4A58CD17B3BDFA013BB2DAA075BE5F522EF9BFC2E1506CC1C4D381B3342EDC19C955A5FE48A712AF5ACE66A028D03FC859711C9D33231E48D41E58A2C2AD81DA77529AD5E6B73E1AC96F0C8E53F153FAEA7903F917492A1D2B1203174A08551FF0F9F91E32BD0F31D606C80A505D5EB55265542DB3653C2621E7EB3FD677F49534F261205F834EEF1645AF419EF6BE5CFC16D54C7EEEA12D2EB9458831F77FA558E4D5C7FE446DDAAC3E1D502C941C95F572AD545ECC7CAD21F0DD50845CBDEDF589505FD34CD8C00D57243C3AA3615D84C39B0A72C28F40AC72DA25EBC6987DF5A7E390399463786E75D524FFB6C961BBC9301264BFE3C699101D18ADA4A72D193971D54089E6FFFA684CD3D77570CE0BB9179A156D3E2DCF266358499BFC158AC9A6913F622CA861C968EBBA0A59A12674BFE39389A2125A02563B082259483E80C89A3763C0A9C3DB485AEBF22C844539EDAA28A3FBC0053EEC475679B741D9AFC16B5FA109399FDD1FC3574DF8A1292B8D7401AAC1BE452D38F97D531813369EE4C50F36736B95AE9C3E4F91AE85E2D664337DAA40F75CCED2F4A4D210BB4EE25A56DC217DD176DB5ACA43C002AFD63ED8712D89E266674D9736FE4A9F202A81D177970411DCCD289B25798272D2647CE6451906A4F7D46E87A46CF6CD048B6BDB62488A24F48D1EBD61FFA474321B929E0A7B6F9D0F6D777ACC14815F343E1 -pk = D9EDF479425F72DDF1FFF7A66794C8BC00D61746AEA6B128AA15EF1CE781F772BDA908DF71055FB0DAEC7F1C26EF8101DC68DE617DE594FFE57BD34909D03621DA1DF8BB3AD2886B7AD581AF6A307D116A5527814893597221E42FF7E4C57B01 -sk = D9EDF479425F72DDF1FFF7A66794C8BC00D61746AEA6B128AA15EF1CE781F772BDA908DF71055FB0DAEC7F1C26EF8101DC68DE617DE594FFE57BD34909D03621DA1DF8BB3AD2886B7AD581AF6A307D116A5527814893597221E42FF7E4C57B0102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E840FAD75A5E8484E42502BA194AE7F3062D147BB6920657AA0CF2533ED8C93B5B389CA03B08F7F06A8BA6BBD92F04D05ED23C310EF603D702EFFA0037BEE905C92110000000000000017B3CB969CC5CEC803310A1ED14ED8C08E30BA6E78DB962A969A46460EEF8B7EBD0398BF1B813E2C58B45E55FAAC70C18228A57F198060753C0F6A401EC75E328C57D3FFFFFFFFFFFFFFA9CC9A4EE6CCF7B8D5F13685D413D59D69654A30354E8733A3070FE66369E293B97BED62FAF184039A943400000000000000000000000000000000000000000000000000000000000000EEB2E74881D2AA7D9BA871A94EE7B909BA17AC338336D147B0C71F1D068F214E25D8251CE249747DA8BCF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1036C4B2E0F1F36494D2C142E3ED6F16BC640DB2898A45FFFA6B9F3C797C6F61ACE7698693291AB5F18277D21A074B03B33E6D07A60A429BFE50DB32A1B78328B21B44D1C16737FF523E6ED59795EAD3BC075485EC1B1ADF33B41E99679A5B02255E07077EC0C94369CA7E4DD499B7203CEFD2DB22859FB9F2093EABEDB61CDA099419E3EBCEDBF128901FA19CA01700A8124835D533056807103B17E6103390C055540B5A1163246025F9446F12ED0AC4AB96CEEEDE902FA514BAB3478653028E397364C2723DB79103BECC07100DCBB074FA29D4079071443EFE1C8889A9489165757067D9967DE3A70046678416038D36E21BECA7299A2EA95DDC54A0DA0EBA65503A8C137E9532ED19D15B36ACD1372BE98F86B45E5F54907BA7AE0C2F0028250DB22BD05B91B62EE658E61A4769A05ED6BE9861A35F37D70F1AA665A5C8EE73BD63284DE6293E22C4348E46C503F092E2E14C2E62D37634792B57741DAA76D5D3674A59F2E4C141017760E5BFD7ADCB77F5EC975C77CB3B24811806DB00186F0B4721E16821F600DC0BEAF4167C818D7CD85B755304FA83D9572E603E0B470C06C02E7C8DBA11B522370FEC1201B814940BD9758876C5BB5FFCA8AA2D7187D3EF4C64AB4631DB048A498BA02F899FB4893471D653ABEFDAC2B7615F8A00C006D8C46A547EDA368DDB958AF1A7E066EC14FA3EC710341F2FB7A2741B103A0B601ED28C6D385FC70ED63BF72FB5022F7263CC494A42677582F77F6B3A41B8990DD76319C950EB56B2BF939D2AECD50E82D4624799EE15AC0BF022EF060C02EF2E2779A48DF76E6FD8E261379830B2FE2BBABF2B31C7D0D5C6115D1EB6E3F8AE9582C889580A6DE1FB5A1C22B630026869A25C041ABB075BF4CB965D20D6819A220C35120ADF803E4A928E34DB745E2F5A1CBED6BDCA75035383EA2CCF8700 -smlen = 1220 -sm = 66D50FAFF43B06D992D54F3401A464C51E4001E1AC8D1B7098001391575A8BBCA5A59F32BA880013E9B4E5D169BA5F7BC58B470061416253FA85F668C305D75E0030D1DB2994A658CA89A6B8540044FBD748729D465D9B4AD29400CB8D9248F0512E053D4D1A2200AECEE230028D592867897FDD01B598E0A1FF0C965D7A2EFC5E0185E4903F8D8F0E3B7F5671A700AD9C96705D976368F5C3231901BAEE0016F776F9663E809F3901844780CDFA72DF88259C583800997D607EB4C07B330EA34FE5014FA7F3BDD9EA0105F4549B4C01017746087A80DF02F17EA2696FE5745321525E2EB2D644B5152606013DE1E6117B9CB19C065C4E03005BC0E7672942E7AF9A96AC74B50586D27C1FCDB8164F8909073F590D0A280E5EF193B0C42863BA518BC8A51E625658DBE2184C3353FAEB674C991EED3F1B0FE3BBE50A21EC70E9F57B97C38D6E436D3DD577D7056B07A401FF0EBBBEFAF8212B993A39281190E309ED0C50B269E4852DEA85432A5941269FDF63766B21D25D8816DE5E87FFA051009D232D6B258C5F43F45F2D48BE09B2CCD8FC963FAD81FB368502057AFA7C865D62D932F652802A299295B29411439DCF832E8367A749B4D7ADF7E8ABDE3EBFB844A9B1D32F77B2BF96B5D29FC15DAE83EA80A990AEF6590776CE1CB81587ADA80B9A7B45ACA3BBC54DBE67DF090104FA196701280B97607A333A9B56A728710CC1CBB7569B79FF034572495181A92D2380A7EE5E9CD1B0F758C2BFBCC4E11464F1CC7D91F117319C30CCBF4C11E60B5DEC724225B8D77B71AA58F5FBD498A3F49115687D58393BE648805BA1737BB921A08D738243920C3834F8782A8256B7DD22CCD5F4ECE86B8A0860BFF21C5C8F0BE987F2D510ED4DF9CF94BF698680B7CFA22A575A3D1B5B431734B59A4B31913019C1F42DCB76A9FF32BFBC6E16D2FADE26E3C17BAE49CC415E4B370D1FB43FF652BE62D18B0AFFDF286765F4F30FC8D6F2C4A58CD17B3BDFA013BB2DAA075BE5F522EF9BFC2E1506CC1C4D381B3342EDC19C955A5FE48A712AF5ACE66A028D03FC859711C9D33231E48D41E58A2C2AD81DA77529AD5E6B73E1AC96F0C8E53F153FAEA7903F917492A1D2B1203174A08551FF0F9F91E32BD0F31D606C80A505D5EB55265542DB3653C2621E7EB3FD677F49534F261205F834EEF1645AF419EF6BE5CFC16D54C7EEEA12D2EB9458831F77FA558E4D5C7FE446DDAAC3E1D502C941C95F572AD545ECC7CAD21F0DD50845CBDEDF589505FD34CD8C00D57243C3AA3615D84C39B0A72C28F40AC72DA25EBC6987DF5A7E390399463786E75D524FFB6C961BBC9301264BFE3C699101D18ADA4A72D193971D54089E6FFFA684CD3D77570CE0BB9179A156D3E2DCF266358499BFC158AC9A6913F622CA861C968EBBA0A59A12674BFE39389A2125A02563B082259483E80C89A3763C0A9C3DB485AEBF22C844539EDAA28A3FBC0053EEC475679B741D9AFC16B5FA109399FDD1FC3574DF8A1292B8D7401AAC1BE452D38F97D531813369EE4C50F36736B95AE9C3E4F91AE85E2D664337DAA40F75CCED2F4A4D210BB4EE25A56DC217DD176DB5ACA43C002AFD63ED8712D89E266674D9736FE4A9F202A81D177970411DCCD289B25798272D2647CE6451906A4F7D46E87A46CF6CD048B6BDB62488A24F48D1EBD61FFA474321B929E0A7B6F9D0F6D777ACC14815F343E1 - -count = 29 -seed = 6BD93FD13C0299B3EC7403638673F3DBC449F3A617B691DDF73C072B62BF028913375D7460BED2CF9FDCA517690CBAC3 -mlen = 990 -msg = 56ED7708F98432FBC623424C2A3634780470A01784BECFF01BEA5BA192D02C33675084263C4315420A009579EF80DD15ECCBB812652421872A9577EF7D07896A727A64141BAE7173426DD5A3925159BFA927FF1039E70F729847B48365B4D3551476206AA049BA5AE8F605847AA03965F058FCFD478961EBEED06530ABE900042321059C297DACFE76CC12D52311B2FF8EE1231C77049E232D9FDB751FB27EB7EB6A373B4B1C06BD0FF46B1B208072C873E6F938E689839079E48C6D18F678769F5F28A903467F2FF2A8B02CB19DF675A8FC7560A7D38A918AB8BE083EC4E0EA148517AB90F38394833304F245BFFC47F9ECA771FB80B9C71CCD05FC3B0D66EB06D24B914B63D9F16AD2F2BC454B591D01ECFC527277AE71E3DC683161A53F129743F3428FB82A89DBD5D42F3EED237CD2F8D76DE2E56A2143AC6B2BA811F745CC72132028EECD4412B76FDD87A2E396ADCE72DC69B8FE053042E798B220974587AF96BA419DA6888B13FFE217C9D01434347F4162FD554B760883E8EB1AEE46C4C26B990C6BA10D2D939F513BF0EECADE8B5DEB8DE2BC8C8894ACA51E65AA696E390C11689F1C2CFBB70BC5F72C1872D99BABE8DE8FE2DBB446A8129AF0AB8D9613F0CBF3CFA6EA3CC409F4A97581D5012707756994B6C8D4FE7F64E0F0B85A85D0A5FE23224DFD7ABEBA8E3FB2E97AD87FA8DD477ADF48F64FAF486D0DF11AE9C3BD3A04ABC962C5B02CDA02D48F0B52D84D4920C116C22455DF291A96E6ADFF91E3CD35CB8B5B4E70E3DA8B87CDC969643A32B1F97131C5E0BAE7F6DFBFAC32218EAA596D444574EE85EF7C9998DC1088E5813D50A4377D29506817E4234F68B32AD68E00ADBF6462F8D4E215F15A19DFDE452F0A65360F7C1F20E11C42EEC55565CCB23CE248BD62E9DBE8A7D6639028A92B422AB444C5688B5D191A4BA8956F358D131E2FF6DFC607ACCC5D31AF9678F1A226530078FF9A73D681DEB697670DDC3E9096AB0FEDAB664473DCFFEDF9BE62A5C7C54FA2EB5059E9A1D38413B1A4FE6D531B799453BC7185ABAF78CABCF65F365B00827CEC5F29C4737047E3B2932A78757E9626A958486D1740ECF1EC17A01AAE6ADEC5104EB934F432207CE31D7096ACB3A0FE2F5DD7890C021892FE7D3F34596CF20B6B12FD55911ACB46D7386F99A9E9EE067A45C6A1FBB463E63D69CB582DA6EBD6330F4F80A1FA72F2ED24CE9BBCD967118CFC7E21F6BFB68A905F532BCF8B8BEFA03295D362B41D25CDCCFC9B41767858F651BC56AB2BB4A8675513C5D6F1C943A20A27DD29F941AD141DEBAAD219E056510BC984063FA0F389090D434157438BB1759690C453A2F55F72C033797A4B0C534EA2EA084B3B6F8966AC56B106FCC11EF08902F2ED -pk = 5889EC0267113885A8BFDAC3F44456629B70213AA523C4C6F7C6256E5E962125957C7A671832E99338A38BAEE16EFC0099FD5ABF074FEBC9F1D9CFBFF56969CCE52A70DAA5A3678E05A7627A5E65ABC206D2CCC496C101EA24EF74CF4E1F9B03 -sk = 5889EC0267113885A8BFDAC3F44456629B70213AA523C4C6F7C6256E5E962125957C7A671832E99338A38BAEE16EFC0099FD5ABF074FEBC9F1D9CFBFF56969CCE52A70DAA5A3678E05A7627A5E65ABC206D2CCC496C101EA24EF74CF4E1F9B030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DD3746268796D145EF9BADC3BFBF6B2B1F92B338627EC2A20823D8D5BC0F6188DF854ABB1CBDB5BD537D66E91EC7CA23DB04DB97B7818BB5E5B272DD304D27D4CF130400000000000000A0C007C4482353ABBA85EDD41DAAB1F7CB670AB37F6B436F8729D799CB74E3B6C70E95D7BE826579A149DB2DA282D0619EEA0BDEC443A0035BA8E81F5E56041E19B4D3FFFFFFFFFFFFFF0859743AC256CE81B5E67A52DBC8B4678C2C89999DBC1EB6383F981F3829A74B94F81485B13745C78E2DDBFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D8174C0EF744ADF05EE8E503D2571B98A40F57D9879AF2F69A0FD04919887EC5D5CF5AC1557A07E2FAA96000000000000000000000000000000000000000000000000000000000000002545C681D3104779834515488136E3AA5B81B133AF3024117C44701157A779AA9F4811F420E8E7B59BE60CFF98F4E1010C035A9AE645498C7FD0CFD541C4B6DAF950B4C861D09E233C613AF1F97498855CB107DB103A7ADC393C655E043082015DFFD5382E38AEB4DC2EA4FFF190DE12232A0CFAE1C9212FE08D41EBBA4A4B85CC6D198ADF4FAF24EAE5C069D6F8D30302121A1DB1B2DD942403793EC6CFFD0084759AAFCE495E8257F5D2DA7A8119866902BCE33FB8759F699F7F528AA6BB017201B35AD59DA4C55827BF9FB8F5D7850A89F984B2B011382C1DFCCAA03A655CFF24351794A7E33A8FA5C5B731F58D019A9EFC83591D233B5EDB91179A635516DDC11FD3DB11694B85513ACF9FA4C6427BC7D58D1DD8E075F315125CAE9008018B17AFDD7129100C9BBD6F3142B2A5CBFD037F9AC8D9B29C619E725C3C7B7B707321BF1FCDB814B57490BAE7700F510283DA5B84C540A668787D76624ADAC01278EF5087F38D6BF199C2401DD4DF68D2FC502D93CC5068B42192F0FABBF62002E7111C7B0AFF6A90FBD33FF9566E224D31174E1F2B5253F6B06EBE464579AC35E66BBE1E11CBA1396D3A96D2A34BA6004A66644D20C77BDB4270F2A8D55A73CA4C190DF692D16DEC537D21E47BAE7444A094F4545E4BEE3A13778CD14B57AC00417497AD9F009AD59667C96EF79E6B833F2203A3B3E5C3639CDD81100D83DE16FC45E3D5B50AFC607BC8B9B36B253C0283E026D5FBE4DFB77B9CD5959B37AFF6AC535F7F261DD3E0F4AB896F33C77A78153CC4E693719AB0776C371A0036A00089ED9D63248A2049EEAEC7C9F6C10FBA94DAD145A7FEB1DEBC41121F3C810C9CD493599927F94E8A5A82CABA63628B025DD8496D70AE9FAEA9A8A356A983D6CE5A19FFF051711EE34F799B90CD0C6727C77F8883E5BCA0FD71775FB391806E00 -smlen = 1253 -sm = 032FB4B7B277A71C9CD2D0ED00F3D0B057FFEE5ACB056C3E8600B07639E6B6244002362418BD00A3669444B86F00D595A806CA00296E91645367DE794CF42BEA0126BD565B925E802067A2576C00DCA2BB876718A3DAE18DB1BD00EF3E85BBB7EB75CEE3AFB15100F0D2E69C6171FA46C2CD4D1700AA25EBED33FB41F50CDC4818015BB687018886A40F7C750EF30182159E03C44DD93F53CA9CBC0070471E4D1858030BFF49157A00A172A45F8C067BE30796A5D601E8C5496262D57E02C54922D200DA2BC1F333FBCF70693274690001B1F8D8DC6E1B412C29AAFD685CC55037E455CC58EBE67B8615100218FAB0A8C04D77CF036DFFF50028312CB5AA4C6A1B47201A4AE70856ED7708F98432FBC623424C2A3634780470A01784BECFF01BEA5BA192D02C33675084263C4315420A009579EF80DD15ECCBB812652421872A9577EF7D07896A727A64141BAE7173426DD5A3925159BFA927FF1039E70F729847B48365B4D3551476206AA049BA5AE8F605847AA03965F058FCFD478961EBEED06530ABE900042321059C297DACFE76CC12D52311B2FF8EE1231C77049E232D9FDB751FB27EB7EB6A373B4B1C06BD0FF46B1B208072C873E6F938E689839079E48C6D18F678769F5F28A903467F2FF2A8B02CB19DF675A8FC7560A7D38A918AB8BE083EC4E0EA148517AB90F38394833304F245BFFC47F9ECA771FB80B9C71CCD05FC3B0D66EB06D24B914B63D9F16AD2F2BC454B591D01ECFC527277AE71E3DC683161A53F129743F3428FB82A89DBD5D42F3EED237CD2F8D76DE2E56A2143AC6B2BA811F745CC72132028EECD4412B76FDD87A2E396ADCE72DC69B8FE053042E798B220974587AF96BA419DA6888B13FFE217C9D01434347F4162FD554B760883E8EB1AEE46C4C26B990C6BA10D2D939F513BF0EECADE8B5DEB8DE2BC8C8894ACA51E65AA696E390C11689F1C2CFBB70BC5F72C1872D99BABE8DE8FE2DBB446A8129AF0AB8D9613F0CBF3CFA6EA3CC409F4A97581D5012707756994B6C8D4FE7F64E0F0B85A85D0A5FE23224DFD7ABEBA8E3FB2E97AD87FA8DD477ADF48F64FAF486D0DF11AE9C3BD3A04ABC962C5B02CDA02D48F0B52D84D4920C116C22455DF291A96E6ADFF91E3CD35CB8B5B4E70E3DA8B87CDC969643A32B1F97131C5E0BAE7F6DFBFAC32218EAA596D444574EE85EF7C9998DC1088E5813D50A4377D29506817E4234F68B32AD68E00ADBF6462F8D4E215F15A19DFDE452F0A65360F7C1F20E11C42EEC55565CCB23CE248BD62E9DBE8A7D6639028A92B422AB444C5688B5D191A4BA8956F358D131E2FF6DFC607ACCC5D31AF9678F1A226530078FF9A73D681DEB697670DDC3E9096AB0FEDAB664473DCFFEDF9BE62A5C7C54FA2EB5059E9A1D38413B1A4FE6D531B799453BC7185ABAF78CABCF65F365B00827CEC5F29C4737047E3B2932A78757E9626A958486D1740ECF1EC17A01AAE6ADEC5104EB934F432207CE31D7096ACB3A0FE2F5DD7890C021892FE7D3F34596CF20B6B12FD55911ACB46D7386F99A9E9EE067A45C6A1FBB463E63D69CB582DA6EBD6330F4F80A1FA72F2ED24CE9BBCD967118CFC7E21F6BFB68A905F532BCF8B8BEFA03295D362B41D25CDCCFC9B41767858F651BC56AB2BB4A8675513C5D6F1C943A20A27DD29F941AD141DEBAAD219E056510BC984063FA0F389090D434157438BB1759690C453A2F55F72C033797A4B0C534EA2EA084B3B6F8966AC56B106FCC11EF08902F2ED - -count = 30 -seed = 1787C82DA9F2E6CA9ACF7D6CCA70116A1724902C81EDC1439F332C74807AF2BCCCCDC7AC1788BA798520B2999F39DC3B -mlen = 1023 -msg = E42C006F144B0B4E188FEBC82D63D3D37096DEEC9D3DFC3B421635DDDB73C76F6260FF1C53222A50D30B26E2DE3D16E3AA64C78604E1191BBC0E2553117A441159B2A35FC8889499A2EFBDD2F30B8B4C6CEA38EB5B2575926E6F22AB96DDB4B0C5C6D78C3754A1B6DEBA49FFBCFA7477BE9A0F74EC379D1C9AA59247C091611573AF765AE698D78152187B291717A9F03FE767BCBB12F52311215579352E7CEAA8654B5403F18CE82E0A73BFD5FEC1063B506F44EB1C9C5A03697D03DCB2AE15C5095F292B4BCB130B55C19AB728B3232EF77D1594611573CC6BDAA254F05934A329DC27CFA6CD8C02CB51C3C295C964C40502FE2B1A81A51C866F7C7380BFBE339B39C8F51F73722A05B5D1E9CB6313557B3656863803C9DC99BB1905D7F729B2DB8DA23D88200032F36FFD04DA11FFDF6277ACC69C5407289D00FDC3C56B32D54877F4A8DC70ABD37EC532B8617D9F3C535B8E962FB389E976B4D1AA12DE5C1C2FFACD50ACFFF65201104648E0C04CF7C1F880E8BDA1D68404BA67C4BF64C9D2ACEEF81B35FABCE58645E0F2F61EB4CCFEFDE7239BE408710D349987D849D40B3AD294B9D815A91848F9ED53B69F78D9E955F6D1FD7E38EC291664D54C2BC359FBA241BA6ABCBF5FC2502D93760D9F6B1F7FB766040E98BDC23A6047134A35327FE128AE24B4C7D0CDCF1801947A1821DDD7424892DF50E2DD5C1E2E6C5BFB4467524FB45C7D977604E7E0F1F98EB8C03EEE1D9A5796C8A801F082678940F076BF44D3496730C9A640FEFCE385865899FC33B5DD34D036F2FD5D07FDC0A40FB725E84CE403B46DE712B4B44CA8801A1CCF58233C5DA06719769823B5945849DDABCA56B0B4EF9327C8B5E5A445E6853E5B66B8D590759D6B2DB722C22F8C741CF3C6325A76D93F4FDE5872D5732FB19AAADEB7C18094727ED43B305B87AE2DBAAD67F90FEB86498CF65CC57EA635340F27AE5C5CD60AD3C763223AF877E65A005C488AA4AF9309E1AA02002B01DF8865FD481EA254015796985969997A53B06DF0355A6AB3C8219B652B09E1F86A6CA12D27C4BCB9E8D35E6889198C8FED71AD5642F5F9F7CE1DF270D68AA05467EF9ACD9A51347AF1EE9CA7C4A5D78189042900C6D561F68D410A77E79726DC123B196C78829F02CAE7D0623BFE9E7B0D8BF84033086295992B77ACF027489D51BC7FF006A8D4AB8079D494413A565E7F687AF40DD18B86AA4274EDB8845DF114C0146DE3199CB55F773A87FFB126B3A4D00D38835CFD2D6652C07F572F39D0397FCD62ACF6ED9F3E8951348AE7E52A669FA4E2BFCDA548ABB1989A1D74A27B73103770290E6ECAC87029359354EE4C87A77BCB5CEB10162DD54499905AC8ED442C173CACDE068BC546720D1284015ACB90CA19147694B53899395DC663D6683908F3CBA29AD37F15CD3903C4C7F4BD73 -pk = E6BD469126B7BD10562779F412461308530503F6335C389206913CBF4D8C84276CEB1EFD13279A2912A4EDF2CC2F4E038B67A830DE7AE358E84BE2B1723A14AB1A721F63E805D7A0C3DE64E7B71C3CB71D0767719CC36A1F20587AFF98974700 -sk = E6BD469126B7BD10562779F412461308530503F6335C389206913CBF4D8C84276CEB1EFD13279A2912A4EDF2CC2F4E038B67A830DE7AE358E84BE2B1723A14AB1A721F63E805D7A0C3DE64E7B71C3CB71D0767719CC36A1F20587AFF989747000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B3E3840484DE1C88342B2DF37AC6CC905C32FECE6E7E58AE690C0906AEC2FD0E1D73C41CA20B1FFECDE52DDC388FAC1960818D725C5C1E60E6D7EF46994C1985862C1C00000000000000DA4B645B7B4E845CD705657D29EFDFCB2D2FC960DEBF7C75C83248611DC39FB5109BD36C5C28F508CA1E09B06B3E72FA357FE1580585C5E33817C4B442AB831B4505FFFFFFFFFFFFFFFF0E3E4E813E02302E7BC2039861DC8D0C851A9F613BD3531650A6B695A447A2DDECE88FC9A16C0B8767F47AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF039A9D8CC80B2E22A10BFFD322179F6CA9C7ED752D07D7BDDEE41F7A9E276F9078644BAAAEFD26D6861F0801000000000000000000000000000000000000000000000000000000000000653D2DE8D0AC453CBE55FC68B2CB0D2109EEA7DDF4D4B28DC6F594171983EBA5734B1B942E75EECED4EB724E4D9438007B865893BBCB10D73FDA512B2399935B5BB184811B767E8F4E0568A21DF41AAD3C977B0B38F8D555AC44A2BE7FCF3B03EB58F5B858BAD39FCDA11C8291054DAC515BAF38BF97FD4FC704B365F6D1010BFAC7C48EF9B5DAF53139B879F3214C02945B2DE642DB7566C518C2C532B316298EE662D1BCAC0AB139AE1845338E62166E3E4DBDD54D031E58E2FE3F6ACCE8009CE0B57D99940106BF6CA3E8F90633A686663DBEC17BA1CACEA98CE759AFBE764C3E592E5B56B2A17C316903163C87021DF64D843AFE02AAD5EEAEAD64C69B2E05B1A90400E9CCF826B4B9403D2BD61250CE0E9D46F5B14D4667FE0823274C00B35E151CCC094E1E11B403F6E861AB8C3D4F01A3BC2DE7C2899CA9F054BC4064F1CBBC0501A809FA9E22EA509FEB5703BED23687731CF66B0C9191D658EC17FAF25998BC3E21C995496A309011B0FB05F9455E39A1BC573CB0514CD8D70A9601414F36F9641A59574E90A12A630DF2CD3346A94212D02B31858EAB51431487F9C6A3BE2E7CFAC1139809EBAE9089A2008134C29ECD5DECC876861D43D8DBE67B3863145C9F0496538D0D225DF9DCC37DA3829BCBCEB5130BE2487C2E7CF07100AF8081D2AE1D2FB732C66BD5ED704A1841B545E649BB08B8E053CBB479920DA93DCC470076232455243ACE71904CA902834C83FC3127A239ACEBADC7EFAE1D24A971068D2268F25E723ABBDE2344E699E8FEC2EF9893C7D2CAC9611A0CEDFF011E13EF8F3709ABDD672040C4FBBE0333AB3550F59013BCC8D178FF096727DBC8330C156FEF3454B132EF68FF7077A20200DFBC3C35AD6A7866BBA8A9311ED518BF167D518EEDD1AC59897FC2048FF88EC659D751045FBD123A1D42CC8AE32901 -smlen = 1286 -sm = B418B142443DFCE789DCDAEF00BED3E7D1477CE22D94B36F06018E9A13494482751371153E6D014330BE175DF2E3DF56CD2C4300A9A30A4EEF8909E3E859CD1500077156C9A3239EB15B89B69F00C82433DC09157409E626C76A00DD150696C783AFE8A03FAA1A00D2D3A118EA6B5CE8018EEA0801326B442F072EA3AF0AB78445013AD640429C57F8546CA3BD480138A4921342EBDFFE8ECC95AE003B9FEE335929070A6549398C01A1A409041E97249EC67FEF93010126D46C0870FBD8179A65300121C1F2B477A679AA30653D2601005F8E48CC5D7B512A66052E34BEFFED65EAE6073D396EB908FF00034033FCEBA6EC68767557A43101F85752048435E47829BF4305D001E42C006F144B0B4E188FEBC82D63D3D37096DEEC9D3DFC3B421635DDDB73C76F6260FF1C53222A50D30B26E2DE3D16E3AA64C78604E1191BBC0E2553117A441159B2A35FC8889499A2EFBDD2F30B8B4C6CEA38EB5B2575926E6F22AB96DDB4B0C5C6D78C3754A1B6DEBA49FFBCFA7477BE9A0F74EC379D1C9AA59247C091611573AF765AE698D78152187B291717A9F03FE767BCBB12F52311215579352E7CEAA8654B5403F18CE82E0A73BFD5FEC1063B506F44EB1C9C5A03697D03DCB2AE15C5095F292B4BCB130B55C19AB728B3232EF77D1594611573CC6BDAA254F05934A329DC27CFA6CD8C02CB51C3C295C964C40502FE2B1A81A51C866F7C7380BFBE339B39C8F51F73722A05B5D1E9CB6313557B3656863803C9DC99BB1905D7F729B2DB8DA23D88200032F36FFD04DA11FFDF6277ACC69C5407289D00FDC3C56B32D54877F4A8DC70ABD37EC532B8617D9F3C535B8E962FB389E976B4D1AA12DE5C1C2FFACD50ACFFF65201104648E0C04CF7C1F880E8BDA1D68404BA67C4BF64C9D2ACEEF81B35FABCE58645E0F2F61EB4CCFEFDE7239BE408710D349987D849D40B3AD294B9D815A91848F9ED53B69F78D9E955F6D1FD7E38EC291664D54C2BC359FBA241BA6ABCBF5FC2502D93760D9F6B1F7FB766040E98BDC23A6047134A35327FE128AE24B4C7D0CDCF1801947A1821DDD7424892DF50E2DD5C1E2E6C5BFB4467524FB45C7D977604E7E0F1F98EB8C03EEE1D9A5796C8A801F082678940F076BF44D3496730C9A640FEFCE385865899FC33B5DD34D036F2FD5D07FDC0A40FB725E84CE403B46DE712B4B44CA8801A1CCF58233C5DA06719769823B5945849DDABCA56B0B4EF9327C8B5E5A445E6853E5B66B8D590759D6B2DB722C22F8C741CF3C6325A76D93F4FDE5872D5732FB19AAADEB7C18094727ED43B305B87AE2DBAAD67F90FEB86498CF65CC57EA635340F27AE5C5CD60AD3C763223AF877E65A005C488AA4AF9309E1AA02002B01DF8865FD481EA254015796985969997A53B06DF0355A6AB3C8219B652B09E1F86A6CA12D27C4BCB9E8D35E6889198C8FED71AD5642F5F9F7CE1DF270D68AA05467EF9ACD9A51347AF1EE9CA7C4A5D78189042900C6D561F68D410A77E79726DC123B196C78829F02CAE7D0623BFE9E7B0D8BF84033086295992B77ACF027489D51BC7FF006A8D4AB8079D494413A565E7F687AF40DD18B86AA4274EDB8845DF114C0146DE3199CB55F773A87FFB126B3A4D00D38835CFD2D6652C07F572F39D0397FCD62ACF6ED9F3E8951348AE7E52A669FA4E2BFCDA548ABB1989A1D74A27B73103770290E6ECAC87029359354EE4C87A77BCB5CEB10162DD54499905AC8ED442C173CACDE068BC546720D1284015ACB90CA19147694B53899395DC663D6683908F3CBA29AD37F15CD3903C4C7F4BD73 - -count = 31 -seed = 9E6E12F025B2A57B0F5A3A9FA70396FC332E1802608E5CA07CC4FBA922F1FE5DEA6721B96F1BA2BFB97825A19F08FF2F -mlen = 1056 -msg = 9C311FF20F574CD9B7BCE1DF705AE7DCE6E7A621C935A6E57A59EB31FC443AB1E014AD332FA784583260AA6153C464565C4568108D60CC126F6E8EC3BC9120E5659C86CDA8A31A7131936DE7B3DB39A4692808DC3D2BEE8A99880FF9D1D5EFF1E825A0F043D908D62A99779E013845AC0C21ABE8E4DF0EE901E4C6BEB8BB36B30228B7756D617A8F30C16351D8FF91786F7406F75D9FB648830F88EA4537F42EAD62E8790E9CF11F72C31D718221049C9AA35376AD8FB065F4809F4383A23C2B29425836C2DBCE4680450896EEADEE6B83539ADFDF59AA4FCE709D601640EB9A22DC3B41108A8EE1FCCDE9945EBB1D3F676EC8395255E125E62A32149C73451F597E1C32AD979E5BE914FFC7C548D6AE92ED08501831E9007770A0233E5778F22ADF7F1AAADF9C9A7C82D2F42989BF21627D3EF8BD0377A5BE5C9F5A585A246A73DE4340E6B43B36DB775B34033962646C16F26A2B7179C40A721FEA54805B9EC42177B42160B1A67341235B5AF9F30B2703BFF8CDEEE5BD7CE506B0707A69F84225B6E5A92E80EDFA235803DBE2CEC47CFEF0D9FAC95C3379816A39F4550BDBFB45609C76D0351DDF8D61724BD5E8BE94673B3013EEBE172CACE247D79925B12B5DBA2F6FB72E797B2DA849B79DEE3DB76775F5F1DD4595678671C7B18BB3749FBB0C6A7135D639F16B3864B5A251114DE7E9F8CB02B4CC69902EC8D7D544D98E24A05F8ACCB182E2EB44BDE868B077B1FAC4726E8B01CDD0D024405665F7ADB60A23FDBACF421246354E824CB74DFB35E57902794E459493905400D0A0BAD51D8EB94EFAD55C67CD0C7CEFE7A1B055F06371AEC7F490FA685C611D553D8430992EE7B1855A9CB305B5CE53154345D7DEF6110DDBDB5CB59559EB664C6439E057DC022F8686F2AA0CA81552428437B0CEB5FBB5DF254036BD2BAE7290D947C963046771A39D2656312236569E775E7D2A041B7EECCEC99C1B9D2757C7370E474012AE707AE00AC37B73ED9C8E1A2774E54BACEB42E8B31BEA734463CC15576BD4F7A33430B1987D62E47473391938312F2481838F286C4DFAF701ECBC6EAB1A9F074C1F8D8963457DFAAC9A9A8EEA70C50CE70D1BA1006760AD3887605EC38861DC1A777D21E46EA169537057CDFE256CC08699D73B1AC4FBC62F863353581CAD358B9C573D77585DF6544E5D55048D66A352828CD1ADF5F42310FFAC022A25824430F741371027B2DC14717DC87342A74F0038674187E478D8ECEFFC16474A4AA8BDA0C8D41962EF2A4B64A036C888CCF4EA628E1CB9EE0F9A918FB1B22B9367FEEEE0218C83CC7E27C5CB2AC64DC7E111E3C85CA0E6BD4F685E5DDD428E028D192142CCEE3F0C8337BDF43CE4B62704AA53C703EC334FB56FFDFB81D7D4419535D17E5FCC0E6F558AD82149C591FE0357DA15660F61544B4041128218B6DE2B75D3801510669A3977E2983BCAF957EE2942E504C29890A81542EA208E1CEC -pk = 0E244EF601FD2E9D2D29CE2FC29AE6932845432EA6928AE6DA09098A945B0BF86F6B21C378029F44479A93D77C11A102859DD585CEB68379BAA8FBE6E32381DAA5BB2F593876DA960761146790BF019C9B0506B92CC63784E070C77B5D8C2401 -sk = 0E244EF601FD2E9D2D29CE2FC29AE6932845432EA6928AE6DA09098A945B0BF86F6B21C378029F44479A93D77C11A102859DD585CEB68379BAA8FBE6E32381DAA5BB2F593876DA960761146790BF019C9B0506B92CC63784E070C77B5D8C24010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F46E2F5C8F0DA12A26C39F811968D62D51FFD3547078263A6F515773D4651C52697059F20B0CEBA1D511CE598F3B008906FE35026C7FADD35F08CBFC5904BCD565C70000000000000000DF8822F0CEA675D761B7AB420237D752DC91386C81A75E99E0E7DC9E67BCAD804750EA79975F17960970EE265767986A9F1F3DFC7965C41281200208D8B0BCFB7341D0FFFFFFFFFFFFFFD778975A9CC75015F8008802E5936A8FB8F2E1E922A5A7AF42FF503E8F570FE96DD07EC932FC1C070DDA240000000000000000000000000000000000000000000000000000000000000028C097F68B2D8C2157EA0AD6B377D31389DDEC3C68301BD7807258CDD43AA20A2309E9FF53E751FA10B37DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08C857B9CB488A9506DEF23C09DFF5D935150EE28DEB8AA2DD825BF27D8601F1A47B0DD9142B49E8AC070812369FB002EC7B61BFA9414E5FEC867E7E757CCAE8B6423C74B50AED7B6404A4EDAA3119C450B0AA6F0A79077A3CBDF917F1280D02B21DC75C7848FD5947FDE86395D5AE58297E974B0E34927626B8B5554B1295ECE5A45AF7E0371150DEF630FD41CB0F0139940A6A9CF29DF6528C36C659269E6784D0D2C41D453101443899024C2CAD0D7E4A4B4F6D90C2852B5B2BB6CFD01802DF311E021F66F68DE0A422E21F74FC73CD00A03625ED13B4D5315963DCCA34475793F468299854F5A2A11AE0D0059C03E12BE1B1F60D09409717D9806004DF8CFF7CB4A2F3D92A1D7A6A36FEDCD450FA4936EDBE505236C555E8487343C86B01CECB8FD236F487DF093B491B6FDA6BC45F686735EE577E64D3044BB595FB12195DFA7319012A0276DBBF35D4EE587E02D51F0A4DB151BA425C3A1806E2AFA5056A813FA8B7E727196CAC1691795DD5100F9EBEC285028A82913E9D55E982EE00AD096FB1A1BBAC41434483359395ECFF78F7F70236AC5EA7DE78DD8197EAF403B434F165E652C734B147847B27AB4A0145EA17ABB7666911A2635EF53CD70DC4F1B10E20540C628918B3C61E34F7600A24EA9AC66B987C74B82685F783455703FE3A76D2F0026643AEE93FAED58D4D179672A1CBD6A2E9402591FB394FD57C8BF3A0AE7E9371532F19F59B124A902600B869E96B0F1A61EBCF3220B396BDC15826D4534ADC91D59671EA506E396A7C9646B5AC05C4A8F029C0E3EB46E1713E03027488E6FDB5BFD1862E9F61B3FD1D0B855D3F907AE138B1BCE1614D5454D45D1F0F710DCA2F48A7B1268AEC237A0B00974DA1C628426AC2D78829E8BEB34C97E70B678F634BD2A0546C77E353715D1532207D5A8D003816E702BCCD1E407501 -smlen = 1319 -sm = 39A42C588D3D02D49025600A003074C5D54980A7C0A66B31DE00ED328377A3085EE968778632018A41F6A218C69FF9673B2DD4010C85AC378FAFAEA0949F5B40010B8ECC7E1FCD9420A4C20C8900D6B77018748AAFC9CA6BFE15007C401406022A946A97C25A2F01980F63FD4455437E5C1299B900160D6184FA3EF2E7DB507EF201FA69275AEF435000D9023C31003ABFB0512E2FF9621776200E0188390BAEED8663C97E0A2D020139B75F69601083303E2EFE8200683ABBE74B055FE8C524C52200E53B9CA5073E7A2E9C3597970101D7A420AE6DC70B8E7345DA8FB823C732E9266BFBA4AFE2EC2E18033FC828C4F532ADFAEE94766601488FDDF9539EB1E69E89C6027C039C311FF20F574CD9B7BCE1DF705AE7DCE6E7A621C935A6E57A59EB31FC443AB1E014AD332FA784583260AA6153C464565C4568108D60CC126F6E8EC3BC9120E5659C86CDA8A31A7131936DE7B3DB39A4692808DC3D2BEE8A99880FF9D1D5EFF1E825A0F043D908D62A99779E013845AC0C21ABE8E4DF0EE901E4C6BEB8BB36B30228B7756D617A8F30C16351D8FF91786F7406F75D9FB648830F88EA4537F42EAD62E8790E9CF11F72C31D718221049C9AA35376AD8FB065F4809F4383A23C2B29425836C2DBCE4680450896EEADEE6B83539ADFDF59AA4FCE709D601640EB9A22DC3B41108A8EE1FCCDE9945EBB1D3F676EC8395255E125E62A32149C73451F597E1C32AD979E5BE914FFC7C548D6AE92ED08501831E9007770A0233E5778F22ADF7F1AAADF9C9A7C82D2F42989BF21627D3EF8BD0377A5BE5C9F5A585A246A73DE4340E6B43B36DB775B34033962646C16F26A2B7179C40A721FEA54805B9EC42177B42160B1A67341235B5AF9F30B2703BFF8CDEEE5BD7CE506B0707A69F84225B6E5A92E80EDFA235803DBE2CEC47CFEF0D9FAC95C3379816A39F4550BDBFB45609C76D0351DDF8D61724BD5E8BE94673B3013EEBE172CACE247D79925B12B5DBA2F6FB72E797B2DA849B79DEE3DB76775F5F1DD4595678671C7B18BB3749FBB0C6A7135D639F16B3864B5A251114DE7E9F8CB02B4CC69902EC8D7D544D98E24A05F8ACCB182E2EB44BDE868B077B1FAC4726E8B01CDD0D024405665F7ADB60A23FDBACF421246354E824CB74DFB35E57902794E459493905400D0A0BAD51D8EB94EFAD55C67CD0C7CEFE7A1B055F06371AEC7F490FA685C611D553D8430992EE7B1855A9CB305B5CE53154345D7DEF6110DDBDB5CB59559EB664C6439E057DC022F8686F2AA0CA81552428437B0CEB5FBB5DF254036BD2BAE7290D947C963046771A39D2656312236569E775E7D2A041B7EECCEC99C1B9D2757C7370E474012AE707AE00AC37B73ED9C8E1A2774E54BACEB42E8B31BEA734463CC15576BD4F7A33430B1987D62E47473391938312F2481838F286C4DFAF701ECBC6EAB1A9F074C1F8D8963457DFAAC9A9A8EEA70C50CE70D1BA1006760AD3887605EC38861DC1A777D21E46EA169537057CDFE256CC08699D73B1AC4FBC62F863353581CAD358B9C573D77585DF6544E5D55048D66A352828CD1ADF5F42310FFAC022A25824430F741371027B2DC14717DC87342A74F0038674187E478D8ECEFFC16474A4AA8BDA0C8D41962EF2A4B64A036C888CCF4EA628E1CB9EE0F9A918FB1B22B9367FEEEE0218C83CC7E27C5CB2AC64DC7E111E3C85CA0E6BD4F685E5DDD428E028D192142CCEE3F0C8337BDF43CE4B62704AA53C703EC334FB56FFDFB81D7D4419535D17E5FCC0E6F558AD82149C591FE0357DA15660F61544B4041128218B6DE2B75D3801510669A3977E2983BCAF957EE2942E504C29890A81542EA208E1CEC - -count = 32 -seed = 569B8B9BDB707B19CD6F9BEB29F304D603C1509B9CF25987C280C342E870B1E13EFC7DD7E41DC85BF4F42D0493B84B0F -mlen = 1089 -msg = 7FF38725F35312D75E58845FBC33E112DD95D5C1CF78119CB413AC839377C7051BF5F17ADD1484F5EE12F42B0587AB41DF487BA5E4D8836777B614A9931A5FEFDC4AC451662B342D675C940061C4FF01F747B69CFF585FC5317636E2A830140C0007F73C76FCAB96195C86DB98E5E65C733825DB0325407E5BB059490F2E9133F9B4AA328976256EAAED2FBC59D00288D4830D99731A3AEF36E5BF5239F2899C500F942B80B00C3B33307450FF0C105BEDB7DF84231C5D24C3C3475AE2F46336582DE93AADBFD385C824F21362C19B1C6A75F56B69297FB3084B6164204E2348CB1D7CD3AB494BFA7EC8FE346251C874085F803BD7F4DDE1995F0D3D17033C461D06B49ECCEEE0D5312C3A435AF5BEC9808ACC524599668AACD95ECEA7EF07C4CA3FAB1CF964FDBA987C345046E6507AC3D372BF07D72CAB816BA627C2BD452AB8DC3044A7F0A01D8C0EA47904A5DD66C6B7EF9130D628A4F2CEA5A0D05AEAB7DAF2729C1041FBDB3C2D17BD66AE293C03E77A0837419471C29691EDFB20CF69BC6260975089AA437628F140A44FA2E2967357AC1BF1345E4208C33CFFEDE6CD634B371E7745143FF848F77E5130D1E0F51868585509F9CD3B906EE0A5072CA2E908D6765C74D9B5C35B6BA784A3EA59D808ACBB1C24D6C088CA6C9E17BCEB18337A4DA0C1DAEB5D51EFB35712A475D6C5A2EA51E93FD79F7DEB127F3418F354DF06489E10B42BC1F20651660CAEA17F67F306F48E15DB7E67A1B56578BA7BE6C229FED9567E128D48551E6EEFA17AF5B95A716555571F44FBC41AB29208DB7C1846E130866D5C9BE6F73E601C55610DFD0F67D98933D252059DAA1DEC20AE0E5BED6568A6322322D8A40E6835FA66E317733E1B465434532EEA8FA76886B600E06EFC1DA41F8DCEC0A5E8BA8419F0B7879CC0A93BD14D99608B5BEA931D8971DA8D2D89053E1DE40209E257E741BEF48C17FA15467F1312A368D4A061BFC76C2B7BBD900B4A34DA51B7CB5BD6E2FB08806A53C0D60273167D822FB6982785F2C3B0EC7D893B615724D0193928D0EA8EA2A1DEC5ABDCAA904C754CB7747449E87221B3D86BD5DF26E11DA753E768A8B481C306E485EC91074377DFC68BE74A444906E420C2D8BCCD84BE13AA5CCD11115B669C89E9C0CE374BC4059C696E5F8344FEE467AC8C8ADE37DAF614992914C763D971327B60946943847FB6B82672CC376B780953B6F4433DF69AC61E110FBF1A35F6272561193D8652EBCE3291333FDD4D84B9CFBC60A57E1F8B817E84EA15D440D4A4B4F7E19C08DDFC5949FE8CBDDCD0296A62F12F53D48B1288B80E24C756FC38E2FAE9C7A3315D1C6DA42AE838AFBBF5569F633A68289EB7073BABCB210F4E08856FA65057BFABC70AD3B58C2C870DFB5E1B0D11B6FA6D5BBB68285D8F9C21BD89669781C9F4DC32EB1EF58B80B1D371334D36FA66A2B3DD4B3E4DEDBA7AA9FB7E0245F5FDBB66CDA653C5232A131EC1F0C21DB1C47B990A64A24DC8C4DA951F419F57C03FF506E0147C22E99461 -pk = 12B645881B466A168B09C241AF12B0169AC97C529512C24CBCABC0F57973EB2CB91BD1F505A4D41527F16BB87E07E9025EE8A9A56EAD59F29D9A32246DB58216592570ABCD1FA4C58ABF7607F0E0027D35A61C597F648870093F46D480DC6000 -sk = 12B645881B466A168B09C241AF12B0169AC97C529512C24CBCABC0F57973EB2CB91BD1F505A4D41527F16BB87E07E9025EE8A9A56EAD59F29D9A32246DB58216592570ABCD1FA4C58ABF7607F0E0027D35A61C597F648870093F46D480DC60000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F54D029501322702F4CA993BF9429FEEEAC3353E1F5A766002C4E6C30ADDC2CBD88025A05A08B2065E2316F96085292BBC6DCB68BAF1A765ED82AA3A050E48AB8B0AF1FFFFFFFFFFFFFFE452A499460C92E5DD33233D9D6E7E9DD3258BB01C9B4420A53EABFABBA9F800351997CEAE6BBCDE9527A1C5FA18EA874C56069A860BD5A7A725FC04B6CB6CA95F26D3FFFFFFFFFFFFFFC8EA5EDAAB0370D4A2EB4767CFAB22DE9AD7E32100708B67D4E4ADC4B2CD84AAC8B3799326456FCAB1EBD3FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE37BDBF687BD3FD642BF3FFC669329D34D5AC704B6DB6A2DCFBAE1FD0A49AC49CA0547290E72BEE4C5E8EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB50B3DD41891257E8D7188EE5716EF53C05F0608898A7D021FCD9277120D8D3FF9125A2C89B3F062AA4589F146CA7C007209AFEF52F1EF040B6FDB5B1C77379115882B3A5247A1DC2BD6E99D4E43000865BABC86BB508CAACD622B53641D8401B6506C9006D1566FBE0256AC0603292DEEBA0345C3E5E5700F7284B0E1948C28B2C8C5AF47D02D12B247731A884D98023952E05814E2188C96AE9DFC72592439092DCB56590EBEEE6B65763031825C7BA5F86E5CBB0147FA8A0E3F66D2084D0258BA0CB777EFD3A30FBC8F6FA6C35B0D3C8B847C9794DCD1551F37F667880855EF25B69F141187B749848FF5020A8D011E11CE37914760D7F3B2E81C42CEF6421CD54C6D0A46E65B2451E2623164A067F8F5D9DDB0CB5852A0ABA36188CCC002448588053D588DB7B70463022A16C0D6768623B032697A3271E98BDFDA9C5466B5ED1076F54766647C577C1B796BA7016DC26203A805A393AC2D14E5B4798ADAF15459C512DC25D331FCA4A288349804168EEDA7DEB457B8846F7A0AE620EA02F49F914732BA8BB353D4321739B07B72A4EAB39B9602FFF71068A5EDB397A48746135E922A513FB588D7A77555A02803BE770A909F0BE19C89A88412C498D4C00CA1B0FCD9A2252327CCFF52B8D9501DA02375F570F9A5043DA2F5F9364EEB020C4E65B7F61BBD02AA536C1A8E7F4B87D312259F1FBF5C83670B3228AC21E2934438CC724464A789C32E1891DEAE65025022EEA991C5C9EFDEAE3DF9C0A3872F8E3DA2F77665A156ECD96BC1C02512B53005588FAF3D40C405F1B4B04387F301058CA842BEA6E9FA5D12892207A3FDCA24C88665056E75A3000384590E793DBE5FEDC62451C5B719EB76EC47030841018B933C411A274A5F045E1BECA4C078B2ACAD4616C7DCF38721060723E905031040A1DDFBAA56FB52539295F15CB16301 -smlen = 1352 -sm = 6299A4B659E6C238EFEEE4DC00C0856F809A95D4080E49058101ECEEF1D72850EC39533521F9005F574E4C48E325EEEF44F70A0037A7210105CA7BDF2E424DBF008A7060E59E1AFF84F2FDA51D00C725B528563CBD42EB7AE47900C663EE1E57AF7933DBA9A81000C42085CD951D19BA93D551040151F123A9EF90F09A5A980A45007D6B859820CA1C71A7A5A66700694385B6DBD65A6C824850BB0104D10016050A559453A664AF007836774C459DBD0303D9D4E20108BBAFE508F54FF264FE50DF0135E221B2B2BD9CED7195EF7F0101A5F83347C8E350ABCC119B044068FED0DC3A9261D171FDBF530F02DA68C1D2BF08D965F50FC4BD0052865CAA8030762115D708F36F0B7FF38725F35312D75E58845FBC33E112DD95D5C1CF78119CB413AC839377C7051BF5F17ADD1484F5EE12F42B0587AB41DF487BA5E4D8836777B614A9931A5FEFDC4AC451662B342D675C940061C4FF01F747B69CFF585FC5317636E2A830140C0007F73C76FCAB96195C86DB98E5E65C733825DB0325407E5BB059490F2E9133F9B4AA328976256EAAED2FBC59D00288D4830D99731A3AEF36E5BF5239F2899C500F942B80B00C3B33307450FF0C105BEDB7DF84231C5D24C3C3475AE2F46336582DE93AADBFD385C824F21362C19B1C6A75F56B69297FB3084B6164204E2348CB1D7CD3AB494BFA7EC8FE346251C874085F803BD7F4DDE1995F0D3D17033C461D06B49ECCEEE0D5312C3A435AF5BEC9808ACC524599668AACD95ECEA7EF07C4CA3FAB1CF964FDBA987C345046E6507AC3D372BF07D72CAB816BA627C2BD452AB8DC3044A7F0A01D8C0EA47904A5DD66C6B7EF9130D628A4F2CEA5A0D05AEAB7DAF2729C1041FBDB3C2D17BD66AE293C03E77A0837419471C29691EDFB20CF69BC6260975089AA437628F140A44FA2E2967357AC1BF1345E4208C33CFFEDE6CD634B371E7745143FF848F77E5130D1E0F51868585509F9CD3B906EE0A5072CA2E908D6765C74D9B5C35B6BA784A3EA59D808ACBB1C24D6C088CA6C9E17BCEB18337A4DA0C1DAEB5D51EFB35712A475D6C5A2EA51E93FD79F7DEB127F3418F354DF06489E10B42BC1F20651660CAEA17F67F306F48E15DB7E67A1B56578BA7BE6C229FED9567E128D48551E6EEFA17AF5B95A716555571F44FBC41AB29208DB7C1846E130866D5C9BE6F73E601C55610DFD0F67D98933D252059DAA1DEC20AE0E5BED6568A6322322D8A40E6835FA66E317733E1B465434532EEA8FA76886B600E06EFC1DA41F8DCEC0A5E8BA8419F0B7879CC0A93BD14D99608B5BEA931D8971DA8D2D89053E1DE40209E257E741BEF48C17FA15467F1312A368D4A061BFC76C2B7BBD900B4A34DA51B7CB5BD6E2FB08806A53C0D60273167D822FB6982785F2C3B0EC7D893B615724D0193928D0EA8EA2A1DEC5ABDCAA904C754CB7747449E87221B3D86BD5DF26E11DA753E768A8B481C306E485EC91074377DFC68BE74A444906E420C2D8BCCD84BE13AA5CCD11115B669C89E9C0CE374BC4059C696E5F8344FEE467AC8C8ADE37DAF614992914C763D971327B60946943847FB6B82672CC376B780953B6F4433DF69AC61E110FBF1A35F6272561193D8652EBCE3291333FDD4D84B9CFBC60A57E1F8B817E84EA15D440D4A4B4F7E19C08DDFC5949FE8CBDDCD0296A62F12F53D48B1288B80E24C756FC38E2FAE9C7A3315D1C6DA42AE838AFBBF5569F633A68289EB7073BABCB210F4E08856FA65057BFABC70AD3B58C2C870DFB5E1B0D11B6FA6D5BBB68285D8F9C21BD89669781C9F4DC32EB1EF58B80B1D371334D36FA66A2B3DD4B3E4DEDBA7AA9FB7E0245F5FDBB66CDA653C5232A131EC1F0C21DB1C47B990A64A24DC8C4DA951F419F57C03FF506E0147C22E99461 - -count = 33 -seed = F32C3715B0BA8C1D0BD59F0645E9697DFCF9AEAF761A71ECDF9672215B9F138C0502D7214F6B1BB4D6612432F9FBED5E -mlen = 1122 -msg = 789518EE21DC99CAC94DD5298B2F3EB8F6AB8D0705D24D9AA3012F217464E7F203E08E5CEA9E44F54A6F73E88D81592826E243B7F0B2A1B3A06E5AFDE23A2985183A0E430E01C3FA90E9F1DB7E69DD8E7DC6FB802933E04A18834C091ECD46F0DD423F532668CEE8A12A06BBC7E5FF3B9488B8F4A87A92BB8D6F313269AD95C574245E06563BB58BFF6169B8F4C333033BC128B91CB81DD41B831DF5103B295F744EDE95FC3A0C72F1134A9321836AFCFD563192C343040B943F69C0E98E8D740C06CCF840CBFC6BF777C9561065916F13D116D758A151E8FF4C355363AAE8E4F49D2A2E062A2BB213AFF25662D95549B4B025E70AA3363B50D25AF84A3E5B0FFA598CE074733AD191C86C351592299C26C0A4933573EF436B73DFD0C4EACF93D361AFE5F824B91BC178EE8381B9EFD52302AB8CAD6C08C7E090393B9B8ABC78AF374FAC6E60BD104BAABA524E68D75A759B94176105A9CFF2E5B9C3984FF61C5AFBF22B8E1B9E4F9BDFFEC0B19C2A5C8DB3B8B2C02115D101805C1BD6652F738F02600E38998CA41BA8955094FAD5BDC34133D4B523EDE66CF483F1CD5ACD9EFAA69703807410939974D6DC033BC696541357DA9881A4FD1385671B6E4BB889C68B544175C1E2EC1395DFF4CC87E037087C615CAF40804D5F44A2DE301961A59818173730A45CF4C2DF172614AFF7199A40C9FFB9957242A89FF86B36A4F4D60F15DB569C2FEFAF677B35FE5F12AD5A323397714286E338FF6B9080FCA50B657DB477A52A93B243BF28CE2743794C361F443AD81EBAAEAB2B237EBBC572D8586C3EAB1F42BAEC1C985D28BC58B296A11D96A04B0E1F7F6790B92E450248804F3F62B5865941BFD444A910F31E1D6B79D8906E7E9828618F960EC14124FBEED28E1F58A8BC9D31773442FEDC5A220F3912D0B41267D427C0C15BB76F9200C54B5F050307E13F1EB3DE92B864C994A3DF4CEBD1BCA634710FA342E23D7C8A5BAC1B58AA321E215E4418428206F05232E2BCD1B5EE1BB7E34E7D4C93088991EE9DD643FD08B0185A2F0AEFFB0EF0EEA3ACB4CE234BD5479A4F4296001305826F23083CC9DC99011864F250E77E42A0DE26AB09FF6E3F32552F6F913256729B357CBF5DFC825E91BB5D3FAC1F729803D431D339955960EAD69B1E54536CFD774341CDFDE1D1F527DA4E738B2E292BDC884687D1016DC193EDF34A37D284D026D33698295E864196E0BF16FA83A35F65FF2B38B7030E9E63EAAF594F272E07941313D538546BC84671739AF822391CA4DBE6A579A81F45FF51FA5B7EF49BEEE7BEBA4AE07452C13366668F02752923EA3653043B26C883799FE6352F95144283D946CA87143B74C8A009C024D073BAAB9BC4DA6C87D35FFFD753E1EEC7F01944639E566FE17A6F715F4197D1CBA58D3D153BDA37D7D2D5E19620FF0842527D109333FA2BA8BFC491689F4551BEE6C9D13BB9E69EE4F44B782BB05D1E48D293BC15B9FC706D52B021C7159FF7DF80E55627DD7555795F1FC616830A4BA2C02FE1A19DABE088E460BF3C5A88313C443179C593458467FAA468791CA74E9B1E759847B6939F -pk = 7AB1E4E13DED41143AB6320A5C6E1911B5E8C5DBDE42F560EAAB0A49AD507A347C8064D98EA81A5FC182493ED22E680268B8E41D5ED91D4E022917925A6A8C746398DF0C693A8267274ADE0B28BDA51D52A73760A7406DF5CD691FFF05C58003 -sk = 7AB1E4E13DED41143AB6320A5C6E1911B5E8C5DBDE42F560EAAB0A49AD507A347C8064D98EA81A5FC182493ED22E680268B8E41D5ED91D4E022917925A6A8C746398DF0C693A8267274ADE0B28BDA51D52A73760A7406DF5CD691FFF05C5800302000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005337A298B3029EB9CE8C435329A372103BA96F6F53A8CC67F86B56A4B83BB5629E673C329765D85046AB3C23092CF39825946C5964164DA645BC19E1EDFDF7E1F5A2F3FFFFFFFFFFFFFFD60A1B2FA63328FC4E6FA49674473D07781D1D5AB6F54E0D327F7CF3B0A1F8B51B4272D48CC7F2CD3EDB7B2D4854D61BB5C8C82B15B4311819AE2818B477A9777FA8D7FFFFFFFFFFFFFF4A57DCCF3CF400090B5CB3605EDCDA9FDAA39EFBB82BC3BC2FA7D331ED490CF37AD04F18C20883C5FBFE4EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D90AE949FDD3CFBFCF76BF28944FB7FFF1F20A2AB811EBA3CC90456059FBB37777AC51FA9AE68D8A80A0801000000000000000000000000000000000000000000000000000000000000FC167B48A3BAED5EB78C40B3D8424F1CA4A6638A635E0C5154690C3A39710672101B391FE32EFEC7962CE7575CD93503D17D09A97F90BF04E551BAE145C445D9AD881AE587E617EEFE7BC1AFFF1D30569E6D5A6C1E1E9831D8938FABAEEE48018D379FAC60B0269FD04514BCFB95BDC0E744808820B9CE25DCE10FEB60CD44367312D0BB9FDE6485AD46DA57D72FAA02BC3DDF77F5FB6B570C64493B34D9C50783329E7052FA9769D56233B41AC153310E5823EA5062EDC06E83B5FC86125D016AC74D8F8D365E4399BB08F0664AA80C5459570174155AC7557EC4821796EA0EF33690AD81A6EAD762E53C977EB83901C7C82EF34A54699BA21092010F533C112453BF9E9D819722A0F3C6F3E34243C0CC3180C9E25F5F45B31CFAB6FD806A0063AED42A6C58960A97819DD075CDF1C4A054A520E0734580945FF6A6026D0FD464108313BEB32594014EEE3F0F0E2B02AFCF9470F5DD4377C542968EECF9128BAEB31A977B4E727BF70892C34B61C92F0BF618C845D62C9A4F282A6B1F1B4C03568748C569B6A7E099AF3B0621CBAABCB536D9108B2CF08D6847F97996E643039A08707416C3C8F39271B740B0422603462103DD095D440D32ECDCDC2228A65F80449C9A007EE5A1033FAB94988DA4FED45F49ABBC2BB3478C0D6304401CA000652769D5EE0DC4C5E639DEFA3530D4C854200B5B5FDABE5BC132D39198AB7AC992CAF9EB7238B3A0B240D62BBF5B8E00E6F8F6C7A963CAFB50283D0EFC44D6EEBC16E28608CBE776B254C1F1AA2D58448C658F6B3966129A6E7D09626AAE7D0266BDB950CDDC854CE5247F830FD7B77B406C5C9DBDB2A4510045858B634DED92E9F7314B6F50606541B86B8C177AA001A0CE4EFA4CED372A023372A9F8E73C00F5353FBBD8621EA34A5F5FA2CE4741E24D3B3BB162C2179CCE93788D43E32903 -smlen = 1385 -sm = B4E739CA8A30DD47EC3B30770103D348810DE85E4714C9B530009A312951D157347EBFC7311600DDA1B63E6F2907520563AF4C00C58E5B6F17458EF2E1BFF868004E7D4762142797B09DE0447B016896F5725195D9A10EE0A66500FC9FC4DBE13FC8E84F3CB409001FB716C66A2339BDB5B1C7A401A92DF2B681FC4748B75C411A0166416F2B5C70272A83C3FBEC01E39C5099A024A3DAA19C5D98001FE03DF89763690DE98E70610083549043A0F806229575D8D800986C71D1F235D3CD99F52AF20091AA033B1AB9411AEBA4F0E30000897F7F4228EB765A6CFF4037C9EABC37BDB4778FD02B6B065C0101E648E9BAB7BF1B111743A050001BD787031D12649037FB22BADE0C789518EE21DC99CAC94DD5298B2F3EB8F6AB8D0705D24D9AA3012F217464E7F203E08E5CEA9E44F54A6F73E88D81592826E243B7F0B2A1B3A06E5AFDE23A2985183A0E430E01C3FA90E9F1DB7E69DD8E7DC6FB802933E04A18834C091ECD46F0DD423F532668CEE8A12A06BBC7E5FF3B9488B8F4A87A92BB8D6F313269AD95C574245E06563BB58BFF6169B8F4C333033BC128B91CB81DD41B831DF5103B295F744EDE95FC3A0C72F1134A9321836AFCFD563192C343040B943F69C0E98E8D740C06CCF840CBFC6BF777C9561065916F13D116D758A151E8FF4C355363AAE8E4F49D2A2E062A2BB213AFF25662D95549B4B025E70AA3363B50D25AF84A3E5B0FFA598CE074733AD191C86C351592299C26C0A4933573EF436B73DFD0C4EACF93D361AFE5F824B91BC178EE8381B9EFD52302AB8CAD6C08C7E090393B9B8ABC78AF374FAC6E60BD104BAABA524E68D75A759B94176105A9CFF2E5B9C3984FF61C5AFBF22B8E1B9E4F9BDFFEC0B19C2A5C8DB3B8B2C02115D101805C1BD6652F738F02600E38998CA41BA8955094FAD5BDC34133D4B523EDE66CF483F1CD5ACD9EFAA69703807410939974D6DC033BC696541357DA9881A4FD1385671B6E4BB889C68B544175C1E2EC1395DFF4CC87E037087C615CAF40804D5F44A2DE301961A59818173730A45CF4C2DF172614AFF7199A40C9FFB9957242A89FF86B36A4F4D60F15DB569C2FEFAF677B35FE5F12AD5A323397714286E338FF6B9080FCA50B657DB477A52A93B243BF28CE2743794C361F443AD81EBAAEAB2B237EBBC572D8586C3EAB1F42BAEC1C985D28BC58B296A11D96A04B0E1F7F6790B92E450248804F3F62B5865941BFD444A910F31E1D6B79D8906E7E9828618F960EC14124FBEED28E1F58A8BC9D31773442FEDC5A220F3912D0B41267D427C0C15BB76F9200C54B5F050307E13F1EB3DE92B864C994A3DF4CEBD1BCA634710FA342E23D7C8A5BAC1B58AA321E215E4418428206F05232E2BCD1B5EE1BB7E34E7D4C93088991EE9DD643FD08B0185A2F0AEFFB0EF0EEA3ACB4CE234BD5479A4F4296001305826F23083CC9DC99011864F250E77E42A0DE26AB09FF6E3F32552F6F913256729B357CBF5DFC825E91BB5D3FAC1F729803D431D339955960EAD69B1E54536CFD774341CDFDE1D1F527DA4E738B2E292BDC884687D1016DC193EDF34A37D284D026D33698295E864196E0BF16FA83A35F65FF2B38B7030E9E63EAAF594F272E07941313D538546BC84671739AF822391CA4DBE6A579A81F45FF51FA5B7EF49BEEE7BEBA4AE07452C13366668F02752923EA3653043B26C883799FE6352F95144283D946CA87143B74C8A009C024D073BAAB9BC4DA6C87D35FFFD753E1EEC7F01944639E566FE17A6F715F4197D1CBA58D3D153BDA37D7D2D5E19620FF0842527D109333FA2BA8BFC491689F4551BEE6C9D13BB9E69EE4F44B782BB05D1E48D293BC15B9FC706D52B021C7159FF7DF80E55627DD7555795F1FC616830A4BA2C02FE1A19DABE088E460BF3C5A88313C443179C593458467FAA468791CA74E9B1E759847B6939F - -count = 34 -seed = B0C7530A52AC9F561C2C14548D3A5F5053396B738EA1C7A5190F5AB01C9C38719C4DBE856E42D37A114FA24FD5DF5081 -mlen = 1155 -msg = A4117808D9D05B702483924E99623E778E7A3B7623739AB7AC488ED93E711EBDDEC383BFB7E06086FD0C374F4668AB744AD99B8AF1C75309B60F55DC03FF7BE6F23187FFD5CB224068568CE2D06ABE441557B04A5A0C2858C416F6F7AA89A96ADFC2AFC54E0F31416CEED005B7B140B342652DAC7BF401FED4D94D475784936FCEB4B4F334BB14BA55B1EA9A36E2B0591287EAF4ACED997162691A96E7F59853E609ECA9A225F615A49A12763D80B5DFE6F8638923C39BD652936B19B944D5116F790E866A61947EB60CD1F3A1F319710D0F40E487EFBEF51FB4D00F5DBB94810128215F72B1AEDD74A1B1D237088DE3098417714EEB67D6A3E6BB647B6B0AC6D0BA3089D4CF6252B69C414E2BD6614429B6FCEABEBA50A4B53C7394652ACF7DD9403AE14436ED5FD4D1C9E238A8399A763806FEF5C3742C55B7159EBF5A13B271428F91229C191D617808A26AF9190F9D445BFD3B273702BC3E7F610854C8E86066BE7757960A880CB6727CEF19DC7B464C464A7DAC9AE85B799747B8488A4123B6BC7F0F7C2A8E53FD4F8687075B4E25660F5107ACF22CA688057DAE0496FF15A3EB9379A9F6E22FA43C932F137E389478C05DB86060686AFEAFBCB9ED79AE194C4146A48CE5E07EAF585279313851CB864A50075AE46C1AAB3B3CB920DEE2652F5AFA0138051C7C980946E8D5E18C16789CD184DC5598F65875EF43418DD56E11DEFB5A4A6AFBCE041BB292E0E2EC563296BA4EA6CBFDCCA32A18C8AA395515A83D0FB7819413E5AE056FF0EC2F63F1D52A8BE0B334A628D00995BEC7E46A34BCD2DCA0E9C5A88E0FC8C43843D6AE074C699276293FD8DB2BE48885155688428C2F5A6C6C91BD4A03CDE2126205F9EBAFE319D1B4F80277FE99211A09628AD840046EB9AA568EC71252CE9F69827B677D9C0D99546DF5A48A8D253AC0036DDAF4D045A70F94EC54BF5F06296B2C2617F2B0EC0B8374DD28DE269FAF739B1E55AE1846F548FB6C0403C5ECEE3CF9D1927E317F0D07E11AEBA01C240FE17C6660F7CB32305AF1EB6DE4312FDEA6990DA4E9135DBC0B88AD0AE0847E1576F3C2711B785B846C7A4B823688E4218596CAED583A90DC46BB9B27E00E4C1110B65F77E602F043A8441563667691C07162E52A53CD76E2D74DCAAA2983BF2E8F02CC30B05BD4F9AC731931C59F9EBC038FAFB09FBC886F4C4191352206BB49ADAEF9D74BD08A5B780FF0FA301343F5EA81D36912ECCB0FF24BBF0BE6A8283EBDECA79CFB22639DA38C9C639C4BD66FE5A75F0414FCC1455702856E6FC58344BF02998E17E967183AE920B7E04F58AA09145D6DA79B65EFCD18EC55BB9CFD53914F80D73C2B08BB754AC63E4C82D44B72376A544D97394B7C99678758B15CB94E71F9FCCF674B29ED5AFDCE452959BE5AF510D57F9E5395A576EAA1FA7BA9AA4122A779727071FA485C005B447760410DEE20B7C2299B4A0D5D9E5E4E038A19C87806C3FB875EA5BD7F47D034D7D5FEC4BF132B04E47574172D392EA7B371516190AB81C67B45FEF6332848A51B6C7DBA90C410A44E9A88AC082FE296A7435E7D2DDFC645D5AEBBC29620525757DAD1B0222159D658C7225D02374EE6AF479FCF1AA28CD91B -pk = F7A6AA7E85E12180E2F0B9EE8ECC77D2F08D13FC8756EFFD322A14B1FAA78CB845DAEB81D0253663890A1A7549F4A403C60EF486D7CF1B1F87FFEDF11A82E604A7E421C7F255D648F0DE04B8B5B819EE5CFD705D3535B7EC5047A7AD04482C01 -sk = F7A6AA7E85E12180E2F0B9EE8ECC77D2F08D13FC8756EFFD322A14B1FAA78CB845DAEB81D0253663890A1A7549F4A403C60EF486D7CF1B1F87FFEDF11A82E604A7E421C7F255D648F0DE04B8B5B819EE5CFD705D3535B7EC5047A7AD04482C010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F1B8DCFC18CF48204C0F71515B780245554904C1EDCDE8619D644B2F776773372D051B13A5209D2EF9B81B7A9F8E815036B3CF6021E8A4AC7158B9BA5ED0DC03D3FFF9FFFFFFFFFFFFFFA4DE43668D67EB8F0AEB0E5D71D73BC494FCB0889F9418CCD208B62C3EBB117E40F6BDA9E947A65A547F970BEEE7FAD43FFD94471434A543F6B28E7B734C09CCC8E9CFFFFFFFFFFFFFFF4C3CFD2D0A978D0B659D28FFC131714CD1C74062E3A1895DA7F40E460FA667AEFCA0D900AA7520A83445B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFE965385B71B38139A6DEB62C470F2929CBCC723AA1822F141FCEFE4694241EEF3AD8CA7F153797BE29C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE941F2C9511742116B63DE0E93F3028594A39CB7FF8D593FAC6E7238AD1401195594F4F9AB20A3E2BA429E97027310029F2B3D08497D8F2F9F949334353214A068BE37E9D5C1EA41132662065398C732BAB55CDF2B8250D80CF1D29033C09901ADA120E87500B73D7BA91A84C77E32D7DF6EB65F16CC2A67CD7603FC15FFB3BBDC138E132694E47197A4763E8C3EFB00B4C47597D60067868AE3611342E0C572CE9B74DA8DE069187EAC8DFD0E129AC0ADA78ED031F974CD47998AC6F4BA0301ABCAF7EACD091E5FAE8CEC0EB4A07E8049EF9F310F34A95BC98092F0792EC351A5971EC3F39203B7754A89991D6764038CEBED1133FA1DDBEF084B3F73F2E005016757C3CA4580A4F129F5BA494C72C8E22E3057F86A052F623EF9E4C1ED7202C5E95458D47BCC4B1968199FE92B26D8A84CE21FFA9176D59D40169325377F02ECBE84AB161AB9EE79067F30E0B72103C4A6554E11B0B671BC09659605A40AF1BB439E6C714CAEE96B15F09C609BF74B91380BAE73B60F720FB626CFDD88A801827869669FF58CB6B15C666599D911089F1184A0D5D3FE162E5FF5F12E2EB186D0FBBCADADC63760D91F12C62E31A30175650C404B7640D7CB35B73EE8D746B8189AB73D4A3F3DFC3743D4A9056C0898EDC0B3D1A5342F244441FB377D22FA0109C10898EF471D06F957EA15C2251E6D0FB13B7E0B4D07B2AF66FAF511A41A6A77D31B759060143B04CD5442741F1D01111A2C6354C27642D82CACA9D4D776F5857B9D0194262EFC11986539557F504A000F8F31C66DD3CF8E689A63DD995C01C852D86127A71C3E056176DEF84C9387B90B97C908E2367C0A83030905DA3326C5B60639B14D10208C61DDB22D450A01A37135E449EE9C822C3277B13B650520541818BA7FAE06936DF81C7B3C631752BD6022073E55B83A521D263083F34F01 -smlen = 1418 -sm = 746BF7E4E896E5C3F9B020B101775EA1D34E67A48FEF4C375F0022FCF7690C6C0110A59DDD54019076716B946A767AE1E85F1A012606312DF10D9C5FACA172A4018E052DF4B390FA4885428AB300359018982CD3DA152DD5D2800088CFEF96F1EF0B8B2C44C42300B9EBD392EF5145FEE02BA69300801378C4CB62DEAB3BAB2CDA01CD9F357ABA6AAA9FB25B54AC0148267524B844FCCDF74722B9005C2EAD2F0E0266F1F8879A17019DD0BFF2E0AA68966A79D88501E9779C24C5DB86CC73D5A3350081230E9BDA01A4B4A24CB14100006732E8DA01C7EA68A5B1294DA99EC361550B282CAEEF8BFDFC10026A15000C66B2275CF0B6430500662D60860F05D7606DB4D5FAE10CA4117808D9D05B702483924E99623E778E7A3B7623739AB7AC488ED93E711EBDDEC383BFB7E06086FD0C374F4668AB744AD99B8AF1C75309B60F55DC03FF7BE6F23187FFD5CB224068568CE2D06ABE441557B04A5A0C2858C416F6F7AA89A96ADFC2AFC54E0F31416CEED005B7B140B342652DAC7BF401FED4D94D475784936FCEB4B4F334BB14BA55B1EA9A36E2B0591287EAF4ACED997162691A96E7F59853E609ECA9A225F615A49A12763D80B5DFE6F8638923C39BD652936B19B944D5116F790E866A61947EB60CD1F3A1F319710D0F40E487EFBEF51FB4D00F5DBB94810128215F72B1AEDD74A1B1D237088DE3098417714EEB67D6A3E6BB647B6B0AC6D0BA3089D4CF6252B69C414E2BD6614429B6FCEABEBA50A4B53C7394652ACF7DD9403AE14436ED5FD4D1C9E238A8399A763806FEF5C3742C55B7159EBF5A13B271428F91229C191D617808A26AF9190F9D445BFD3B273702BC3E7F610854C8E86066BE7757960A880CB6727CEF19DC7B464C464A7DAC9AE85B799747B8488A4123B6BC7F0F7C2A8E53FD4F8687075B4E25660F5107ACF22CA688057DAE0496FF15A3EB9379A9F6E22FA43C932F137E389478C05DB86060686AFEAFBCB9ED79AE194C4146A48CE5E07EAF585279313851CB864A50075AE46C1AAB3B3CB920DEE2652F5AFA0138051C7C980946E8D5E18C16789CD184DC5598F65875EF43418DD56E11DEFB5A4A6AFBCE041BB292E0E2EC563296BA4EA6CBFDCCA32A18C8AA395515A83D0FB7819413E5AE056FF0EC2F63F1D52A8BE0B334A628D00995BEC7E46A34BCD2DCA0E9C5A88E0FC8C43843D6AE074C699276293FD8DB2BE48885155688428C2F5A6C6C91BD4A03CDE2126205F9EBAFE319D1B4F80277FE99211A09628AD840046EB9AA568EC71252CE9F69827B677D9C0D99546DF5A48A8D253AC0036DDAF4D045A70F94EC54BF5F06296B2C2617F2B0EC0B8374DD28DE269FAF739B1E55AE1846F548FB6C0403C5ECEE3CF9D1927E317F0D07E11AEBA01C240FE17C6660F7CB32305AF1EB6DE4312FDEA6990DA4E9135DBC0B88AD0AE0847E1576F3C2711B785B846C7A4B823688E4218596CAED583A90DC46BB9B27E00E4C1110B65F77E602F043A8441563667691C07162E52A53CD76E2D74DCAAA2983BF2E8F02CC30B05BD4F9AC731931C59F9EBC038FAFB09FBC886F4C4191352206BB49ADAEF9D74BD08A5B780FF0FA301343F5EA81D36912ECCB0FF24BBF0BE6A8283EBDECA79CFB22639DA38C9C639C4BD66FE5A75F0414FCC1455702856E6FC58344BF02998E17E967183AE920B7E04F58AA09145D6DA79B65EFCD18EC55BB9CFD53914F80D73C2B08BB754AC63E4C82D44B72376A544D97394B7C99678758B15CB94E71F9FCCF674B29ED5AFDCE452959BE5AF510D57F9E5395A576EAA1FA7BA9AA4122A779727071FA485C005B447760410DEE20B7C2299B4A0D5D9E5E4E038A19C87806C3FB875EA5BD7F47D034D7D5FEC4BF132B04E47574172D392EA7B371516190AB81C67B45FEF6332848A51B6C7DBA90C410A44E9A88AC082FE296A7435E7D2DDFC645D5AEBBC29620525757DAD1B0222159D658C7225D02374EE6AF479FCF1AA28CD91B - -count = 35 -seed = B2FD7BFAAFB667C9DABE5915C3BC271EF41F18588666A6F4990C09D098E62DB590110DF6A56F08C5E0DE65B00F91D60F -mlen = 1188 -msg = E82F5ACC7C1A326D430475357629D568EA3D0DBE131114781D5BF8DAA32FDE9F3CECD288ACD14445678C5EA6D3AFAFCE48EA3957A6AF8D8F23F78D84130FB6419F706EADD430CC85AFF48283F15602265059ABB075E011E3941834EBE70787CDD55F1E604C6B86F761D94C4F5E525791333DF6D43869D6F36B212A8F35583D38A21D0947CBE26FBE6A36E189C73137F2F2D89F48566D04D2DD9125D2EA4E0B2A7E5C1E9D2EA036CFADCF7BB28F6DF3B7D6395230C9D39D1E7558EA25340252708BE23EC6C0C9A0946C5C5AF0FE037C254D1A5B2B70B8F916CF37945BEF76BDFDFB19A0DAAC5A83A6357E986B3155CFF31024121634C3700CA99E5ECEF1F2E411C6621FED6092C1AB59860271AC7F431E568075D59F71AA18096195F30BBEB1A6BAC20E034F83C72BE0536315879F1D1B7F31D38C12DD8E97819B4803D02BECD436B61D1296CEB78EBF857E34087EC8AE8395269B5B0770B3423B39638910D2A3DDFEC8502389FD8B5B09FFD10CAAD1A5C86E7E39629AB09A4ABCDD00FBB9821F92E7DD24DDA83D1D9762F52A89BED6C20648EA04FBAD4233E5920AE83FFEC28FDB5E432929A41DB782B2CEA8FEB40CAD0B27903050B650477E5D9443A536ECDFDAC673952810596F1985427359D9E4797CABCCD2FA0C0A2394D853B4E6F8E150B3E3AB5136CF476605FF5FFA9067C0FE58A143B50B18B09256657CF091132D449A6E7EE79AA870E9DBE46BF840EDCB983F585EC2856C059808E72B8C901A25D6AFD5372F168D533052A6D26418E035D87D0BF818ADEA19915047C8D824A425A8C7915756673E0F5FCCB1B4FE7C1FDFCE505F7E18F023FDD32A605906EC48E0FA755B6D87E47711E158D672C5FB4CD3B8D1D13FE9EECE58453987CFCDD87B621B870F3AA27E73B6FB7FC0A6757893B978C63B7723C49D1005A1E5B1A4D60C4A2FEF392DF7EF97F149B499164455633FA485BDF92F804A47C8703D124522D73887A2B032F10F45343993FFB009D69E80FB54B6999A5BDB2760F8BCCA648F3C52BFA1D887AE49862DB4CBCCC7213ACBFDC48A57C3DA1F1EBBEA828182432AA1C593C3E5591C825E5706A5F9503311E91EC3D8F4A9554C3DF915B5FBE0516A7A5597ECF8862A8DF286ADA96C90C9F2783F7F947A18EBBC64C1BAF24B29F77521A9EBE09BECFFDB902EFCD024046FD3E6182BF0C84BD3A0A5410EEDBABFC60114E5DB28B0943D79F58F766E2EDB16759850D4CC3A9A57AE073CF6F3B24D36A4365E2BC64674259170B6D11DFF63D0DEED085B6321C45F218E09351AA0D4155189CC98DE5627A03396A067AB3FEA2C133062E3823FB1CAFA5D592070C8E82ABE812979DBDCB6D2E595F33830AD0E8E2F9E6CDC4D9C74B8026EAD1815DE36772769C4E00806F79950A40C979C14A4BDBFDB79DF1DE01FDFCAAEBC93DDBAD62BA166843A121D2B144559064E9DE9E310DFC93D624C1061BAD3195D6C9F46DB64C65A31E90371F9B644E2A15E01C262395269A9AE83F50776F852903F86E5518BD008CF1B35E78F910D48C0B7BBAAAD5DFF2375C55D56B8F65B922229D5F494EDCCD2D676361619FEDFE6BF0BFD7E4C77FC459F181120C4430C409BA89D2E5A8C36CC6200497611D9D705DA6AE1ACA4E16B389D632A982E017E1DAD95DFFBC7A7D7191E7B8FA1C0ED -pk = 4DE1EDE62CDB3E91B039D8F339E3FEED1B81D0882C7A0AEFBA4AB304D6919F63B431471CAD4AF1C10BF4E6F4107C8E001F1871DD1821639F8E2C532B00C521725CFD6C43FCD3853D4EC850095C5BD7CD8DC6215BD1FB7AC0C35099EF2FE74900 -sk = 4DE1EDE62CDB3E91B039D8F339E3FEED1B81D0882C7A0AEFBA4AB304D6919F63B431471CAD4AF1C10BF4E6F4107C8E001F1871DD1821639F8E2C532B00C521725CFD6C43FCD3853D4EC850095C5BD7CD8DC6215BD1FB7AC0C35099EF2FE7490002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007987023E2142B83EE0615FF19D37B8E62DAB3E7B2BFC6934E13B54C275056B674E2AF8187B6F2F0D8DA4E123A0C57DA76DF6A2D62142858A03DF7D307F93BC3EB9FE230000000000000034237B62FDF5F0483FBE036C4DB08BACD0720D5073ADE4FC1ADEF807571DC64F29C652ADE192514B675227DD409423EE05139E52F044DAE546DE74F65125758E38501100000000000000ECAF3EC0FC4FCEB08F9D255D0CA705BC4B28222842976BC81BCDC919C4075F8750A6ED8788D0B06D84D1C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07D466BDAF5F1959AEAE0F96EDDB6384052FDEF9B4D522F06698BE9CE65B355A69FA9D179C5354195E35D6000000000000000000000000000000000000000000000000000000000000009D5B10FBCBABF4C2B1EEA26D43E4BF230FC8D7D7BEEBA6A6EC970634537E47A49208B9AFD4D8646A208C4C8933DFEA00EA5E144E5F75338860F680780E8464A80C34C516C2A344FD7E10E26E0657514CB3422C12090316998D9B658DEF532D02E565C6D98F57031B042DF00B7EEB2DB4D49898D4AC7734A4553F14CC810679FAA66B562EEF72F76B76D59D3CB5905A005C6B7834919415B4928D7F03D4D6FC5B5836C246DA52F4A83DB63F4556AEF1C39BAAEC5411416426A4FFC31CBFB2CD005CD666D7051E41232D1A05A110FCA031F84DFE69C4F6C27473B6FCC863B2DBB174BD3883D43097A165E30FB9B6D7FF0193AD72C10C9F3C12B1EF0416878570D88F419D0CA486ACBE64EA1322218B29E186D655CB9784CD3B0FB9577554078A006B0C2FAEF9ECA6DC3CD594D2E52F8DFCC9A65A936199BC3425E51ECCF476F8FF945597EC8E7E6A663B16FC7AEFAEAE020886DE010911156D43899BB3792324A1409F42DD5EB577D0AD8B1D06029D69944C367180C7EB95D6AE39755B50694400A55DDB641233AF55696F8F0A8481A240CC1D4F746C4EE8DFCD3F69C75ADC47E236C91F1E41D153851BF032E0268BB903B5EBE6343E97CE109E107B7548EEDC155F096F724A1D862BD0378FA866BB3898CBE6A88813490E4DD0D68C909456BD03AD2CF32F82C407C91C9FA8B62BDA1721A22124A6E06CB19F0B069E33BC773A102DDF6FB67CD8F4C73823397B35937800F6570ADE073FB83C21BD50EA89A815A91B45809B84664CD3047A3A8EFAA88FB96AF47E9DE51E7E6246153F5DD9E45B003B736AAF50D8BE3F5B8889E12591206BB550D1651F19E957398A2350D90DD401A0E4FF007C01A20E948379E91FA59303F6562E5029EB69A6548AE45ED032BD3996556BCBB366A3F369966358BB7339764C53F507885C002A136F3E4C32A89F02 -smlen = 1451 -sm = 64A5F9E69FC46D6806BCFD0C013E07CDA1879CDB3BFA6D5281006D89D139C9D5B07095B15E65018ABBE3F419C7143FEA8859C00168E40B9E8C43B7506C387249002218733DA03379ABE989138C01E7D2F788D26925DC180EB88A006EA34411E197B2F9B155E60C008A63C4BA93F7A86739A58A9C015C45D62591D432BA7CE9219C01B82E317C5173BDE743F7248100FB760462A651B8FFAD9BFFB40051FDCB72A1C37D6956A4522800AC9629A9C5A1C7FF96610CC900FB982DF14F77422388DD48C700528430834225A2D5B750F114010173FED8B2D251400742036A7A7D7123E1A1F242F3629DC4DB24120129226B8E2125530E69D06B55009C03EDCA6B7B4A925C81CEAF1302E82F5ACC7C1A326D430475357629D568EA3D0DBE131114781D5BF8DAA32FDE9F3CECD288ACD14445678C5EA6D3AFAFCE48EA3957A6AF8D8F23F78D84130FB6419F706EADD430CC85AFF48283F15602265059ABB075E011E3941834EBE70787CDD55F1E604C6B86F761D94C4F5E525791333DF6D43869D6F36B212A8F35583D38A21D0947CBE26FBE6A36E189C73137F2F2D89F48566D04D2DD9125D2EA4E0B2A7E5C1E9D2EA036CFADCF7BB28F6DF3B7D6395230C9D39D1E7558EA25340252708BE23EC6C0C9A0946C5C5AF0FE037C254D1A5B2B70B8F916CF37945BEF76BDFDFB19A0DAAC5A83A6357E986B3155CFF31024121634C3700CA99E5ECEF1F2E411C6621FED6092C1AB59860271AC7F431E568075D59F71AA18096195F30BBEB1A6BAC20E034F83C72BE0536315879F1D1B7F31D38C12DD8E97819B4803D02BECD436B61D1296CEB78EBF857E34087EC8AE8395269B5B0770B3423B39638910D2A3DDFEC8502389FD8B5B09FFD10CAAD1A5C86E7E39629AB09A4ABCDD00FBB9821F92E7DD24DDA83D1D9762F52A89BED6C20648EA04FBAD4233E5920AE83FFEC28FDB5E432929A41DB782B2CEA8FEB40CAD0B27903050B650477E5D9443A536ECDFDAC673952810596F1985427359D9E4797CABCCD2FA0C0A2394D853B4E6F8E150B3E3AB5136CF476605FF5FFA9067C0FE58A143B50B18B09256657CF091132D449A6E7EE79AA870E9DBE46BF840EDCB983F585EC2856C059808E72B8C901A25D6AFD5372F168D533052A6D26418E035D87D0BF818ADEA19915047C8D824A425A8C7915756673E0F5FCCB1B4FE7C1FDFCE505F7E18F023FDD32A605906EC48E0FA755B6D87E47711E158D672C5FB4CD3B8D1D13FE9EECE58453987CFCDD87B621B870F3AA27E73B6FB7FC0A6757893B978C63B7723C49D1005A1E5B1A4D60C4A2FEF392DF7EF97F149B499164455633FA485BDF92F804A47C8703D124522D73887A2B032F10F45343993FFB009D69E80FB54B6999A5BDB2760F8BCCA648F3C52BFA1D887AE49862DB4CBCCC7213ACBFDC48A57C3DA1F1EBBEA828182432AA1C593C3E5591C825E5706A5F9503311E91EC3D8F4A9554C3DF915B5FBE0516A7A5597ECF8862A8DF286ADA96C90C9F2783F7F947A18EBBC64C1BAF24B29F77521A9EBE09BECFFDB902EFCD024046FD3E6182BF0C84BD3A0A5410EEDBABFC60114E5DB28B0943D79F58F766E2EDB16759850D4CC3A9A57AE073CF6F3B24D36A4365E2BC64674259170B6D11DFF63D0DEED085B6321C45F218E09351AA0D4155189CC98DE5627A03396A067AB3FEA2C133062E3823FB1CAFA5D592070C8E82ABE812979DBDCB6D2E595F33830AD0E8E2F9E6CDC4D9C74B8026EAD1815DE36772769C4E00806F79950A40C979C14A4BDBFDB79DF1DE01FDFCAAEBC93DDBAD62BA166843A121D2B144559064E9DE9E310DFC93D624C1061BAD3195D6C9F46DB64C65A31E90371F9B644E2A15E01C262395269A9AE83F50776F852903F86E5518BD008CF1B35E78F910D48C0B7BBAAAD5DFF2375C55D56B8F65B922229D5F494EDCCD2D676361619FEDFE6BF0BFD7E4C77FC459F181120C4430C409BA89D2E5A8C36CC6200497611D9D705DA6AE1ACA4E16B389D632A982E017E1DAD95DFFBC7A7D7191E7B8FA1C0ED - -count = 36 -seed = C08E846A8E039C8655651919A8433D475F494899FB617DC3B4715DEF0C992C195CE38158B7FF40E0684B30FD7E623265 -mlen = 1221 -msg = 743E5D96B9B4C1469E7AD2B3703F711FAF60CA335358FF3EFC8FCFF02CD020A443243B4169F9123351B6C36762B85BE5E5EDDF8D4B43D82CAA615788406A31CDF4F7087D42DB21AE48A069AA23A8F6D20A1C0762F973E526F011DEC737E986CC324724BC5336D0362525757410E21046A12AC54F2237E68DA036A5C1389E46A53ED8C21774906948D4C9E14F40519C54DBD02B7A4ACAABD24FFD7F6CA4D6D582EF48940296D2893415E811FE7EF0801B35F1C594E6FEA2C293869BBD45618B6F04FC26B55D55A0AE99445AEA12F851B7E58A49CC6A0044F28E3EB838CFA6BAC5DF53B0DB78BE2CA2BEA1BF2DEFFEBD673A783C91A6C9EE710B12042EC2863A9B52EADA5B0D32101BBA8338F7C75CDAE7B7FD6797B25F96ABD53A24A7647A1C91610306FFC72A8DA4D46B1778146A98BD59CEA3173D41D5A53F9A7F9E282B5FDA1AFB062D8AFB63CB19B0E76DF782FEB9F7FD50902133529CFDD7C51AF297895EF6E1871AFD4C3DE93DEFA8FCF1FE67BD27B7EEB0CF37A6A8E09AF1203922BD9B62672D4756519CD09DD9271ECD0285F92030A9FC81C09BF2FAE86F5F50596C628E0BE673571CBC2FD76C563E113004529B234FB50E9E3D6D1F814CB8E5B5CC3EA365D0BC7602B146CC0361397D9BEE9246FBA3A724C462E177D27836093EC009741ABFA28379AEBCF5EF09BBCE00CE449FEC3A3302FB9AD0F010CA338363539DA545F159FBCD3D6A0482454023587A324F5132FB6F4CA602FAB2CF6CD59104427264CC9EDE8D10CD9DD7FA6133E65693DBF744443AE920994226E21D98634BC7F0710DBC37C18203EFA5ADB467B523322E21E4E686B6B85B00CB501ED84153BAECD4D6CAC9D1183E38B510F7B1DBBE5995BCB717529B83FBBE969DFD8DE21183762FCDED692B16502834FE8E7A7C46F84ACDCD2C9975098CF0CDE8AC0EFAFA449DC26840180DCD9353A2F1B06962677C808B07345E8ABE95B8D24F21D751A4EDCFA0E02FF077DE64E6B992E8C8822682DCC7F03CA7582FE7C74E0A9822A02D888FDDE1FC9E73C2EDEDDF32001E918771E5F511EF8F88AC19B76FAC0C812F56938F814D712D99269D7802E47634E541B54E00F9EAF78A421506A88B4BF7332DFC7D79E8C41835031FB449507D19D5A8A512A5C527C95B6F21EE3E41FA43591DD9BD2E4293701BDAFB624E0EA290DA4B7A173003867C4CC3FD814E117B4EEE283C58F5FB33D653E410F68C8962155B8C4FBC13BB750A0343737D1FAB36EBC618A6A7C8E6F93855CB24937B01C438FA713D334DF335D0745582F680627D8B94CBC25F0D12E3B1C27A3ED72E2558B800C19DC6B719B961E0FEE43BFC34E999027CA1969ABA4C45FDAB9AF01B955E948DE951F5A1088BEDA43AC930FE99D8CBB3473475C444F43E928E1A44966265B38FADF9B1183700A95A81F85EA43E5C61DD9B2D67701C95583E8E3F15083717E1722D764B6E624505347C30E5E70163ED9A046C504FF534956E911294D2B9097BBEEF8740377EF0D6C4CC8086422902BF63556CE6DA8E33E68FCFB42707C00693A995D17680B76293194DB217EB5A928303DCF1814E4A881B057BAF2553AC4FAAC8E4BF23FD4074154CD4AE189FF7E204EEDB8EDD594CDC21B5B7D73A712B511D068F4D217C0F91F9D84C524D973D67AA741EB13FE922AFABF79CD2396181143783030FD2D0CFEFC877934D8037A4C32AE8E15B50A6FA4269 -pk = BCFF8131A36AB271C13AFD573AD887219CA9A9D965D35F57C32EDF64CD03C4B3466B052AA3434C11E52A3E2519C68103F032DD41F16407C75A706C5AE5F4F718F768498617EF4A3400CF9CE7B2DB487DF9BBF3428C542CA2CC1D42CDF7B2E502 -sk = BCFF8131A36AB271C13AFD573AD887219CA9A9D965D35F57C32EDF64CD03C4B3466B052AA3434C11E52A3E2519C68103F032DD41F16407C75A706C5AE5F4F718F768498617EF4A3400CF9CE7B2DB487DF9BBF3428C542CA2CC1D42CDF7B2E502020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012BEDC55490052272216E1C469AB1F23D9C5A5FC15EB9ECEA4580A306073FEDE9EAB9650A4A0A891810B4E622D85ADEA4B72EEE87AE7A4AE1A63D5628CD627864145F0FFFFFFFFFFFFFFDD003021AAF724B82229A42846DED7B62D7170C1015E9814C0B999DFFA106A0590CF634D7C7404E07F3AFC68ECEB0D16A45681897FB71ED1530CA44B96D167DA3413D1FFFFFFFFFFFFFF53FF97D994A0AFD65A2164B0F640A1AC146696D9B549E194BFC72AF12161AB7995ADBDE2AF885F9D5C197E00000000000000000000000000000000000000000000000000000000000000BAEBE4EEEB9552586EDE7307E76685E52BF9E898F1DEFA47CE8E6F867A258B362EBF5351821BB269E0B02F00000000000000000000000000000000000000000000000000000000000000A2AC39B0B88EF0608F97D438A8811F572C97BEFEC7CA8268EA0CB3C9F58BD6BE61DF04824E5E2AE81E0D0AD7C494B1008EE0F2EBA6D8E0080B0E31402399593CD10A7EA4E30451CC048590E15B05CD342773E3345C48906DA8213C63CF4DAF003EB9F4762E2190C5E8676CA0960663A0B56AA7158CCF8D7911779B294BFA0B2999760E72B8C301069241EAE1204925038C3A2708ED8A94DB0BEB709B2EF6D2A118587AA3C680ABA42C30162250D07BBB5C2C386763648B6DD7C8C2FB0DE11100164BA1707892E466BBD49216503C432B8B7E2BA2B831F334ACED338CD75C7D0B3AD15924DA8DC5A269CF4DC8A0336C00F560A10F80904EF6B31CDAD4F7947DCE5842F20D30DAD1D31526B982532B81799049A8230E353398FD4355D52D84E600F23FE4A55D39252C1D68226EB6A4A9075CEEF8FF8C2392A43A6096F792CCB5778B54A337AC943828551BC14E746D6701BC538FD6470227BA78A4ABD40E61F53CF5B2AE7D92618DAF393105CAA4D37BE17EFB87BB9DEC87AC8AC5EB1794B4C301052084D5324012DBFC5B24AE031C09CF8A5C68C907537D88B7D1AEBFDC67943E7DC1AC683D41B251CA8AE5AC1A8EAE033E45CDCA4E885A97CB54FB8E8E5386022D49276331CFEBC4A253A0716F9020812BE5E7883E63A1F717ADE9B84036280351A550B4C1B66D3C8E52F14263F948A0B4D8437672754FB58B5BE46D2F733D9E108FC48F2B631B75396720586AD1B30217AA586274AC0E6874A832E83637562F5272B1B45890596E01FF27A08AB025D42966F762C6728CAEE5904622E709FF0207431892773D93ECC67EF52792F37842DB3432143A2D25EBEC1D86CA43B8350A32BD83BE8E5C8054A2504EFE15D419014BC5B353CA7642B82137B14C70A81F84844F823CECA7C9C3C9B40A88726570270B2B4C79BD92DF573CE6AD7DEFD9DF02 -smlen = 1484 -sm = 113E6656F9928DE141561EC1003900707D25436746DC7C8C5200EDF5A67E11EC85A9E3553A15019A140C620A8F891008D6EFEE00FE4DF994AF6894CE0BD340B800E40C0448E6BB1189BE87ECFB008F6492B0FD7FBF92F996B5A800377FF43F920D631DCFA2265101BD0D9439185B762688AFB4160132156030137FC1BDD2555ECD018D8A9D8E05AE70BF6CBBBCF40080AC0C7CFE7BE4D64CD99AF50093542D2AED6D826A3F03E76C00B8ABAC943510722581C796690082C4E9111E059F960F33FE90011FFCBD0CDCC6233C9D9485AF01010F2F5747AFEF24E0BFA77A1F5D4DBE109DF2A235BA7E0121E61201E06FA2D4EBB5DA2A874D091D0085571618D1D199C0E54D5CD90300743E5D96B9B4C1469E7AD2B3703F711FAF60CA335358FF3EFC8FCFF02CD020A443243B4169F9123351B6C36762B85BE5E5EDDF8D4B43D82CAA615788406A31CDF4F7087D42DB21AE48A069AA23A8F6D20A1C0762F973E526F011DEC737E986CC324724BC5336D0362525757410E21046A12AC54F2237E68DA036A5C1389E46A53ED8C21774906948D4C9E14F40519C54DBD02B7A4ACAABD24FFD7F6CA4D6D582EF48940296D2893415E811FE7EF0801B35F1C594E6FEA2C293869BBD45618B6F04FC26B55D55A0AE99445AEA12F851B7E58A49CC6A0044F28E3EB838CFA6BAC5DF53B0DB78BE2CA2BEA1BF2DEFFEBD673A783C91A6C9EE710B12042EC2863A9B52EADA5B0D32101BBA8338F7C75CDAE7B7FD6797B25F96ABD53A24A7647A1C91610306FFC72A8DA4D46B1778146A98BD59CEA3173D41D5A53F9A7F9E282B5FDA1AFB062D8AFB63CB19B0E76DF782FEB9F7FD50902133529CFDD7C51AF297895EF6E1871AFD4C3DE93DEFA8FCF1FE67BD27B7EEB0CF37A6A8E09AF1203922BD9B62672D4756519CD09DD9271ECD0285F92030A9FC81C09BF2FAE86F5F50596C628E0BE673571CBC2FD76C563E113004529B234FB50E9E3D6D1F814CB8E5B5CC3EA365D0BC7602B146CC0361397D9BEE9246FBA3A724C462E177D27836093EC009741ABFA28379AEBCF5EF09BBCE00CE449FEC3A3302FB9AD0F010CA338363539DA545F159FBCD3D6A0482454023587A324F5132FB6F4CA602FAB2CF6CD59104427264CC9EDE8D10CD9DD7FA6133E65693DBF744443AE920994226E21D98634BC7F0710DBC37C18203EFA5ADB467B523322E21E4E686B6B85B00CB501ED84153BAECD4D6CAC9D1183E38B510F7B1DBBE5995BCB717529B83FBBE969DFD8DE21183762FCDED692B16502834FE8E7A7C46F84ACDCD2C9975098CF0CDE8AC0EFAFA449DC26840180DCD9353A2F1B06962677C808B07345E8ABE95B8D24F21D751A4EDCFA0E02FF077DE64E6B992E8C8822682DCC7F03CA7582FE7C74E0A9822A02D888FDDE1FC9E73C2EDEDDF32001E918771E5F511EF8F88AC19B76FAC0C812F56938F814D712D99269D7802E47634E541B54E00F9EAF78A421506A88B4BF7332DFC7D79E8C41835031FB449507D19D5A8A512A5C527C95B6F21EE3E41FA43591DD9BD2E4293701BDAFB624E0EA290DA4B7A173003867C4CC3FD814E117B4EEE283C58F5FB33D653E410F68C8962155B8C4FBC13BB750A0343737D1FAB36EBC618A6A7C8E6F93855CB24937B01C438FA713D334DF335D0745582F680627D8B94CBC25F0D12E3B1C27A3ED72E2558B800C19DC6B719B961E0FEE43BFC34E999027CA1969ABA4C45FDAB9AF01B955E948DE951F5A1088BEDA43AC930FE99D8CBB3473475C444F43E928E1A44966265B38FADF9B1183700A95A81F85EA43E5C61DD9B2D67701C95583E8E3F15083717E1722D764B6E624505347C30E5E70163ED9A046C504FF534956E911294D2B9097BBEEF8740377EF0D6C4CC8086422902BF63556CE6DA8E33E68FCFB42707C00693A995D17680B76293194DB217EB5A928303DCF1814E4A881B057BAF2553AC4FAAC8E4BF23FD4074154CD4AE189FF7E204EEDB8EDD594CDC21B5B7D73A712B511D068F4D217C0F91F9D84C524D973D67AA741EB13FE922AFABF79CD2396181143783030FD2D0CFEFC877934D8037A4C32AE8E15B50A6FA4269 - -count = 37 -seed = 1D9C060EA0408A068BD982D9694D39D02BA5A473378F6F9F09349F686566F331E767263FAFF5DC0E823BB6F648843876 -mlen = 1254 -msg = 3382E87BA70EA986A044B0CBA2EAFC3316C1AC95A5F16F6368C210DBEADFAE6CF2382DDF5078AD594CDE3BD1A837C517B1A20A2099D938DF6AA02B6C0E62FE6147C904BCF3EDE51DDDA60DE7887DFEB2866DB402D23E5934A74C9CE4852D4B2F53CC9BCDDA312964A548F6F7C8320AF1D1BDBA7FD32EC6C86BC3FCB4205ED3DB092FDCAD9AC4D2B8575883E13F69D8C16CB18D1B9284B31823ECE917C905C5C8B9D180C1BD87975871014F773FB57D402B8FE16EE312692665824CF0BCE4509326A31957319364CD421E9B21BBC1DFF663ED850858A2450C2FFE64B65E009A3999CE4504BA5313BA0EE4A8843349C30FA6E59FD3ACECA130A37C04F9B64722608768973996112684B64D0C87BF95E5DD60661935831A6A1A9575EBCB2F64A15296BE788C775D80523D6BB4267D91B0C71BA5F90DDF1933DE898E79FC7E39D0A3D146F185214468DA50AEB47402AB542E52CEB768A70CB1F749E4164CF20E549B674CE965FFBB98D874D34B5B7851E575E6C1E4DE9C170A10DAB84940AF055A951260B0119F5ACBA320B55CDCE4F16346905A2073CD9FEFBA95734E4F4DFDB7A33F292D45698831F1D3E9FBF56D9692C14A8F9887265CBB4441AB331D977E3A68A1BC9F406AE0FB1C6E91205670641B9868E2A987BACEEE2364FDB089A63B53976D600BD7A8AE88A02872E46927269D281CEFA385C98CCDFA6609394943FAC32237368C6203AAFABDE072054AB5A14A91391D5A943F4ED4A4407F275CCFD15FD28F1AE0EB6EDCC6612E3436572919E4DFB57C049BD77B344D8E04152863EFD4FAE8FE3A7230AEAAAF82870820085F4B3EB5215111B6B8952CF2FF468B3D10F3AF849F16E190E9560F40B05E6E2204591B58A850E2710F7043AEE2A44A6D4A108CEEDEB2D216E51102DD08751925DE6A7F67BCA1980F0789B34E2F86729621F2285C5D3A036CD87C76102E9D607C37CCDAC8062CEB961053F3195B5ABD88BC64FC65F8BE34166841683F1EED291938F75DFDB3AF4FD2AA98CE95382ACFB5D5DFE6EF243C8A0B19B80584FC0CD533E38BD485D1C52E0EB5BFF90C0A947D9B9095AC1C0CE9754EABFC860990206B981235C7B612DB61C9FDEFC0F14DBF68A8A0EA4986CDC4AABAD6C218559E11CCEECD804EB98446FB33EAE47C0388BD8972DDAC02CE807B707D6D188CB31A1D76D44323E93DAC4F8ECF77E7896C052EF16009CE4D1147DF84FD5785D95D77310783F9AEFF1DDA693F4BED26457ED82A1CEA19D9C4919257E3050B25A7D1CE7561740DDAC3FD93A607C79875E050E40498BFBCCA95BDB3D0FE639DC7CEA80E3DAB3AD73A4265F012451C1BCC2FDA1E1AEBB7FB18407F31E7496E2A18D2C686B47120688240A2FB134A3C314D4CB422811E850524684EC485E061F7365494A6403AF170DA461A3BC32FFAF9143D5E9B17B2285C56977AECAF880CDD34F26120DAC4C950198233A50654EFACA6EA97333D2BBC024A5E668821D20333DF0B712510100AECAB6B484CCB7814178F851A3E6BA0B76F16C4685D5AC8BA48558D382ABECBDCF0B919C1ACAE46EBEB5011DD0B3C22B539810720CFBE4CBADB111E100C09C811E724A67C66A1B89EED1E7218861F55A4DC55E236C6E3521DCB374437A14E8000DBEBF0F7F9BF409AF952888675C11326D9E3E8A8828BF50CAECFF96075CF29446CADA373529D310660CBD60C042C143E1736FE7AFAF6FBE42791A8DB01EC0475145257FE2DF766D4EA972B14AE5110B8F8F42D659383E9BD76 -pk = 531E1A910A4868D349A4174674B39AC0B2471061CF75DBB291ED7BAFFAD4BFB61DB2BA1BF04A823B41B334787B23EE0200DD6C8169C424F1FA3CF7651569A619133D36DE8BCDF828E2C16A262363CF3F6E8350996C09122367D85707AFFD2A03 -sk = 531E1A910A4868D349A4174674B39AC0B2471061CF75DBB291ED7BAFFAD4BFB61DB2BA1BF04A823B41B334787B23EE0200DD6C8169C424F1FA3CF7651569A619133D36DE8BCDF828E2C16A262363CF3F6E8350996C09122367D85707AFFD2A0302000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E549A3EE86F6FD66030CB6ED39B7AE98EA995BA08B71F72F9A84BEE548C933C9299F3B927AA56CB8CADB79B45DF46122389EDFD48198151159D8608DDEA7138C14BE4FFFFFFFFFFFFFF4DCE135D29C5498DD095B0A1C97448781A379066EE95140D46BCEE6BAC507204F7EBE3CA6B44B48C02331227BE9379E456FFD6396A58FACDDA62C6666F5E86BF5E7C260000000000000053540295DE98467C6BEDEB40C2B078BCD32F9CDD385E2AD92BD9396D288D992398214F2364F811FF6342D0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42A4AA68789FA4F253B1C15E6EF32041B70F664A95234D595C5E79981938B17F2D41B88069C556F758D7D600000000000000000000000000000000000000000000000000000000000000C754C02902BE4E102C6E4F249FB42D1190702887BF97CD15EFC50D195476F038592A6FAB1CBD8EF354B2851C34453F018268FB536C4308965312D9A94AC324CA49FE5577AB485F7F0196E1D9161C30F77552C0BBF9B90BFDA0C87F88AD3930019DACD423396A412523E83B065CF6B0A3AC77292D5ABE6034418E5E1259594D8FE2E9A1EC973435509F66DE18F6D9C6002D528872A7E87BE3C298EC535A39C16CDC6857C836F81CBD14504015DCEB1E94A98A2FA028891F603842B63D9B47CA02DAD5A031133C305DFE79A559F88B7B16A27BD4DEBAF5695BA99A1C8487EBE00604C00C10178F0A1828C38869BB8D9D010DAD79A7D319CDB2F79CAC09948045C05183169897C0A08D6ED28D200A0A7FE7D3C25FA482A116965CF09D55E8138C0006B2259336482D83DDE19FEFB2435A9C66BCEDB2A7D0FC52994A5AEC110CA991941E111D121B3835B48C9868519200031417975B7430F2FAF1A7A32C70F6C2BBD78A6267CAE8A66F559298B0A320DBFD56A7EF1085A1A3090CBA9A03871958010EC38A3E4E0294C3755D14152BCF2F752122B2F9894619EB6AB77215E4BD257408B1790BF679585379CBAC416A4D16028DB1C82F199FD36CAEC498356F684F6D27050C1CDCFBECB3A385A11950E8E48F55F743FD3EDBB06007EFA14466CDE202BA5CA206E8F2FD153121A7FAFD74C901B9EC0BAF377E0A9A5CDC7A14EA3FD7366BF68A594BCA69B7CE89B258D0D6D3024130C1234A94A8C9C4656BCADA0CE4127220BF2DCC89ED22C0B024D00390BE5EDA4A8644E074E16857F24C7E15DD8E00E0CD02D32CB426FACBD95A5831EE2C91F1E13DCE0F2453340719B1E954B88D12BB48BFF730A96615E7B4938C983FCD03B2DC2DD7C6F73B89A07F1B1C97C3C606896AE388A31C1D0A28A09800D226BD3F0AA883BEE9492EFDE2F1EE5617793003 -smlen = 1517 -sm = 1F07E916BF9A5D1FC58D95D4005E087A0BFC0B1DA1AD91A41700F4B5B4B5EBBEA443155D74D8003828A89B1AC5B82228317ABD01FCC78BF3D63F28D99825A0E1007D3FF2937E5472EDF6FE642400A9CC1623B90FBED797B08D6F01334F066BA3956672DCC0549B011AD58F4025F5A3AB2D1C403F014B61BE724D1C7F1B1655AF7900D23009957F711FA484E04619002BC98FE9FFA0D291A1B714930041F7F954EE43DAB768332039011B71F95836C61B878BB3920F0143BCECDAD11D085CE08AF0290164899700D8B7C55A088B1D2400018F5026C306A9E398D0AE43B3A90BD7BC1DBB1A3150C052A3681902D4666237D9F703DE659D74F1012B41767CF15842380DEA45335D083382E87BA70EA986A044B0CBA2EAFC3316C1AC95A5F16F6368C210DBEADFAE6CF2382DDF5078AD594CDE3BD1A837C517B1A20A2099D938DF6AA02B6C0E62FE6147C904BCF3EDE51DDDA60DE7887DFEB2866DB402D23E5934A74C9CE4852D4B2F53CC9BCDDA312964A548F6F7C8320AF1D1BDBA7FD32EC6C86BC3FCB4205ED3DB092FDCAD9AC4D2B8575883E13F69D8C16CB18D1B9284B31823ECE917C905C5C8B9D180C1BD87975871014F773FB57D402B8FE16EE312692665824CF0BCE4509326A31957319364CD421E9B21BBC1DFF663ED850858A2450C2FFE64B65E009A3999CE4504BA5313BA0EE4A8843349C30FA6E59FD3ACECA130A37C04F9B64722608768973996112684B64D0C87BF95E5DD60661935831A6A1A9575EBCB2F64A15296BE788C775D80523D6BB4267D91B0C71BA5F90DDF1933DE898E79FC7E39D0A3D146F185214468DA50AEB47402AB542E52CEB768A70CB1F749E4164CF20E549B674CE965FFBB98D874D34B5B7851E575E6C1E4DE9C170A10DAB84940AF055A951260B0119F5ACBA320B55CDCE4F16346905A2073CD9FEFBA95734E4F4DFDB7A33F292D45698831F1D3E9FBF56D9692C14A8F9887265CBB4441AB331D977E3A68A1BC9F406AE0FB1C6E91205670641B9868E2A987BACEEE2364FDB089A63B53976D600BD7A8AE88A02872E46927269D281CEFA385C98CCDFA6609394943FAC32237368C6203AAFABDE072054AB5A14A91391D5A943F4ED4A4407F275CCFD15FD28F1AE0EB6EDCC6612E3436572919E4DFB57C049BD77B344D8E04152863EFD4FAE8FE3A7230AEAAAF82870820085F4B3EB5215111B6B8952CF2FF468B3D10F3AF849F16E190E9560F40B05E6E2204591B58A850E2710F7043AEE2A44A6D4A108CEEDEB2D216E51102DD08751925DE6A7F67BCA1980F0789B34E2F86729621F2285C5D3A036CD87C76102E9D607C37CCDAC8062CEB961053F3195B5ABD88BC64FC65F8BE34166841683F1EED291938F75DFDB3AF4FD2AA98CE95382ACFB5D5DFE6EF243C8A0B19B80584FC0CD533E38BD485D1C52E0EB5BFF90C0A947D9B9095AC1C0CE9754EABFC860990206B981235C7B612DB61C9FDEFC0F14DBF68A8A0EA4986CDC4AABAD6C218559E11CCEECD804EB98446FB33EAE47C0388BD8972DDAC02CE807B707D6D188CB31A1D76D44323E93DAC4F8ECF77E7896C052EF16009CE4D1147DF84FD5785D95D77310783F9AEFF1DDA693F4BED26457ED82A1CEA19D9C4919257E3050B25A7D1CE7561740DDAC3FD93A607C79875E050E40498BFBCCA95BDB3D0FE639DC7CEA80E3DAB3AD73A4265F012451C1BCC2FDA1E1AEBB7FB18407F31E7496E2A18D2C686B47120688240A2FB134A3C314D4CB422811E850524684EC485E061F7365494A6403AF170DA461A3BC32FFAF9143D5E9B17B2285C56977AECAF880CDD34F26120DAC4C950198233A50654EFACA6EA97333D2BBC024A5E668821D20333DF0B712510100AECAB6B484CCB7814178F851A3E6BA0B76F16C4685D5AC8BA48558D382ABECBDCF0B919C1ACAE46EBEB5011DD0B3C22B539810720CFBE4CBADB111E100C09C811E724A67C66A1B89EED1E7218861F55A4DC55E236C6E3521DCB374437A14E8000DBEBF0F7F9BF409AF952888675C11326D9E3E8A8828BF50CAECFF96075CF29446CADA373529D310660CBD60C042C143E1736FE7AFAF6FBE42791A8DB01EC0475145257FE2DF766D4EA972B14AE5110B8F8F42D659383E9BD76 - -count = 38 -seed = A4563D09AD21D3916BF4636301F2E64183A8F003DA186753D7F2DC3BE0089BA09C62B8A52B72C2C8451213606801FB29 -mlen = 1287 -msg = 67109894C579974373CA0054ED5F7C373B7AEB810721C3D9CEFA02EB244EF6B17507300370ADB24AE0173C6D114C51E05F822A770318033C082B6502F70012283EDA2A9DC0A1381F145470E5D3729D201773D2AA63C18885A92C962BCD3628835391D70DC36273DFAA4966F65AD40EB51FB4B416A8D0B1DDF39CB932EC4503BEA23E3D9D3B4501DB426C6AD99C28D415FB565F62EB5C22BB043C8CAFC42EBD1C7190DD32A5B14B571644471453740C081F3E3305F9AE70A5BD505874382EC0F6E2188563E763BB8D1BB8B16587AE25A6252F51E4AD02D0483C4A6E8AA2849C44629CF4B7C6DD6A5FECDAB0F9B2F0B35E306C7532B64BD5A3CE67A0247D97024AAFE5CBC13E375AA69B8287BBA9DDC9AAAC2BCF41A71E373EE36B13DF9F829BBEE8F48802DD9E03BE42A5E290251BB130E0E2ABCC4E096DD0F264E5D29F8C2388A0C3010E78F2A03F5BA1BE13AA5E50F2BA67A031CE3F787754B8276EA1AF62BC5FB4DD9A9B9BB84217A37EB9FC7AAFB517337B30454200D6AAE491E50D5007EAC2150F60F640A5C4624CE6D8112119413731322BAD9762BCF72349EE38E2A41102BC5461D72033072A90E82D105E6FCDAED9C223A4142CD55920196D7B1B9278C84B67A2E35BDE3C9CEEBB8E9007BA8758BD35C875DD5FA0A8FDAAAA9A09629B9DF69AFAAB456E105DABF2AC5834B8D223B0A406E0D1295C876C447E8E09C93FB09ED1B3EF6E1F3B7FCB029F576A45A12620567E05F218BC3753109DD29AE0ADE1370C0F871AB5AD8A9DBAA277FB869EE552E8733E73886D6DFEACE6B35E481F37A516EBE191DAA6F83E4FF453CF9CC9DDEA8EE507AF0E62EF3CB8C22949CB828E21C6AAF3FA9AC301E2257B0A054FF0A237F527D53EB757820AF637FFC9F983A2B5AFF0B4CC493E610314432C9C2F0FF73C4240D520D1D73721B429CE41807B7424B14F5EB1CD23D5562263FE1D58CB1D52E5175414800CB090242E240C3A7ACAD4C84DBD8ABC2731FA2B1D9820DA60FDB6BAA7EA849B6A146E07AF7FC201B3A98E5194BB5826945FACA3690209E5726F070A71EE07AE76ADB7E6199FCCC81C8AF7A463633A58873B4F7E65F522FDA409979DE41CF54F659E66CD5950A3A3E01570526C46417A00EC2E8821DC380ABFA21384D141D259CBB9722F267E46272ADC5CC4BCE382B554226996F4A6A1605287276C18A48C8FF1A92ECD2815CA5452FD6157FC27532680022993535549BF9AB064052E6DB4E9F83B5D0D885B94A90F59E67B9DF0C321EB0F95AC07007E4EE33BA89AABEEEEA01FD1172ECA4E31FB02C507FFE43CD0D6C8570769A180E68A70BD344B4C992E7D3A6BFB96AC4D69C2D4F5EFACA1D348DC1988DE44B30DA76BABC307A88124F96F26737A85FE6047E7E485C7E4B6B99B575FAEDC9BACA3E080E2B074CFFCE1F716C6A1D08234C45706D2883C6E5A001D02596CFE5B260DE6134C75DF3AC8BCF1919759E15576CA147CEBE041D04E369BDE70CC64157AEDA311C8DA520EAE907C33E30DD89013E24B7B02E66C9F285BF7D5C3FD65BAE24AB20D40ADDB451AB4BC4B9772D0B9039461BCA8D3D2A4D71A2E6BFBE7F02325FD571FCAE1FB47F855612F382188A5FA3D61C3E8E59EF016DB0149C52E1C7DC84030E6C93C4F32DA6CE5F3B8196AFFDE834D2ADC26CFA05940055401891519386BCD33D85584D74B2F16D8E19556C272AEE8397A1741EFFC283DBAD317740C1B67F8F4B7D2D1EDD68D6615EAC3F8E3CD26AC4F8058667FB388B19C654711B5B2EDA75A9AB55174157CBE08C186A3D0963BB3011A9567BD499AD2A8 -pk = EFD001F0602B7DA66828F198CF4E1B147E83E1F963CB52EF3C85BE2C3027BD2FC219BFC84ECDF6A64064125683327803594638FD484033B6867142000161F6710CA53304400B9017650B24AEDAA5CCB4EFCCFCD7FC0E2735A92C40689A860F00 -sk = EFD001F0602B7DA66828F198CF4E1B147E83E1F963CB52EF3C85BE2C3027BD2FC219BFC84ECDF6A64064125683327803594638FD484033B6867142000161F6710CA53304400B9017650B24AEDAA5CCB4EFCCFCD7FC0E2735A92C40689A860F0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003176055B8A14474CDC6B4C21B94D08A836C78A8C70FEB9175C5282927CFB5C4D13713A6B8EF1819EACF402B5B7CD62F41983371936D06F84278E92D3997BFCC57A69EDFFFFFFFFFFFFFFC6849DC57AD411AEB8884ACC30C17CAC7B48A4DB224344342E8689D81F5AFD365BE1F1F38101A66910BF48315C48319CFF4FE5D24FF92542BA3C3EB342522190799ED1FFFFFFFFFFFFFFDEDAC002A1617C57C58DB4E02CAFECC5B2DD6CFED33A0649CE2F87F0C2187BA7842475AFB97B6322EB084D0000000000000000000000000000000000000000000000000000000000000001135620AA24C1852BC082BAF783CB7DEB055E9F2421CCCD7E557FAB05AE648DD6567735975D44F25CDC37010000000000000000000000000000000000000000000000000000000000008A5A739A3790E3CA2D2E149800B0B028716598F9677B9A313E2B2AF652CFDDA765F1F6EF8FAEF6F59B046E7B07EC1F01321980F4486E3C5867F1A0D4CC16A123B8DCF4F96B4F4261D5DCA3E74AA9CFDCAEEEA5DD9D9A66096D00257CA7AD3A018AB47FBC4E30A31306E9A2E9949FB2A245BD29750BB23655C1C6E2A6E4084E93B28DAED8E0FBDF1FD9662A4687B90A00A2709041137347FE1066F57B60845CFBA8A379E21E5A56EB7E82361A5ED01D85636AAD04802A8CA5C1830BC6970A3C03F5A404D153D73D2D0DCA6E06ABB08FEB40045D5A97D775A2FBCEDB01749E2EF350BA395165C9F251BE9EAFFE7D87DE0296DAEC77A20630A5EBBEA148588F0CB3A9DBA2898E31897716E02F27BB7132323A053113F4FBC919229F8B918EA59402C8675DDDF78A3166D851B428282DD7BE8372CB991CFDCFE315FAA2CBB866313D10177AFBE3E5D371C6C8010AAA7042037D1DDE42F9AE60C8579F545AC3C2DEAFE6567F0844EDE98ABD439E9BC9581A99EEE8022AAF90EF13BF459EACA8B3420201CB1649534A5BEBD2B38FDD124BF253F205D11D9F54E04CB731662B9EE32959B798A6061DFF044255EA2B34E553D600F678714257CFFE79A0083D2BEE4A1F3DAE920B10350D79A59631D8E30FC82E0FB4A5437BBA7DA32765FED6AF321CD902C8508C7B4C647B6B80EE688F98130620732F707BE75FBFEFF63ACE4D23D019EC3A1775FA4EFE1F7F0653A2C990598F01E0880B756F1085A69D01D485B9A446FB1C04F9AEAED8FB0CF54C08E10674ECAACBCC530047CFF067BA428A4395550101642786AD562EA84930811F16F4DC421535F69ACD67B81879AACEFA841FACDE8AA9252CDF822B72A108469BDC22E101027F96D13F1299FB51ACF2920EB05539501E5C0285F8961F561790492973FF58B416986D4D7C7DB28A25EFA7C02D76E001 -smlen = 1550 -sm = AA38145A7A85BB7104B0CED50192A03A4F7B0472E43E5397520123D2ECB8E041BA477D4FCA870133C92D55084685827102E4E901113931531A57BA697728AA0F01D85A7DD50B74C546A5B8499E00F25A4FBC655E93B1E9B50F6D01AE7FFA0FCD1AE4F7E1A9A6820169D6CA352E3334B77E9D8B71017D814D83C63B862004A8330C019DA685921F12FB1685E7E77D01FF67F80B37EC6D7D301D04A701BB64469E9C0E883077C06C4600301DA9B3855F59B25462B59201B55DC3517A22D8AF9939DE1A0188065E0898C47E03C6BFF39D0000BB4FCB0F1D24857CCD555B696A5D540B9E37B5DAF17F8695651001E5894CD5008999F28CE658B7003DB3517B370B49E661D5BD6F7A0067109894C579974373CA0054ED5F7C373B7AEB810721C3D9CEFA02EB244EF6B17507300370ADB24AE0173C6D114C51E05F822A770318033C082B6502F70012283EDA2A9DC0A1381F145470E5D3729D201773D2AA63C18885A92C962BCD3628835391D70DC36273DFAA4966F65AD40EB51FB4B416A8D0B1DDF39CB932EC4503BEA23E3D9D3B4501DB426C6AD99C28D415FB565F62EB5C22BB043C8CAFC42EBD1C7190DD32A5B14B571644471453740C081F3E3305F9AE70A5BD505874382EC0F6E2188563E763BB8D1BB8B16587AE25A6252F51E4AD02D0483C4A6E8AA2849C44629CF4B7C6DD6A5FECDAB0F9B2F0B35E306C7532B64BD5A3CE67A0247D97024AAFE5CBC13E375AA69B8287BBA9DDC9AAAC2BCF41A71E373EE36B13DF9F829BBEE8F48802DD9E03BE42A5E290251BB130E0E2ABCC4E096DD0F264E5D29F8C2388A0C3010E78F2A03F5BA1BE13AA5E50F2BA67A031CE3F787754B8276EA1AF62BC5FB4DD9A9B9BB84217A37EB9FC7AAFB517337B30454200D6AAE491E50D5007EAC2150F60F640A5C4624CE6D8112119413731322BAD9762BCF72349EE38E2A41102BC5461D72033072A90E82D105E6FCDAED9C223A4142CD55920196D7B1B9278C84B67A2E35BDE3C9CEEBB8E9007BA8758BD35C875DD5FA0A8FDAAAA9A09629B9DF69AFAAB456E105DABF2AC5834B8D223B0A406E0D1295C876C447E8E09C93FB09ED1B3EF6E1F3B7FCB029F576A45A12620567E05F218BC3753109DD29AE0ADE1370C0F871AB5AD8A9DBAA277FB869EE552E8733E73886D6DFEACE6B35E481F37A516EBE191DAA6F83E4FF453CF9CC9DDEA8EE507AF0E62EF3CB8C22949CB828E21C6AAF3FA9AC301E2257B0A054FF0A237F527D53EB757820AF637FFC9F983A2B5AFF0B4CC493E610314432C9C2F0FF73C4240D520D1D73721B429CE41807B7424B14F5EB1CD23D5562263FE1D58CB1D52E5175414800CB090242E240C3A7ACAD4C84DBD8ABC2731FA2B1D9820DA60FDB6BAA7EA849B6A146E07AF7FC201B3A98E5194BB5826945FACA3690209E5726F070A71EE07AE76ADB7E6199FCCC81C8AF7A463633A58873B4F7E65F522FDA409979DE41CF54F659E66CD5950A3A3E01570526C46417A00EC2E8821DC380ABFA21384D141D259CBB9722F267E46272ADC5CC4BCE382B554226996F4A6A1605287276C18A48C8FF1A92ECD2815CA5452FD6157FC27532680022993535549BF9AB064052E6DB4E9F83B5D0D885B94A90F59E67B9DF0C321EB0F95AC07007E4EE33BA89AABEEEEA01FD1172ECA4E31FB02C507FFE43CD0D6C8570769A180E68A70BD344B4C992E7D3A6BFB96AC4D69C2D4F5EFACA1D348DC1988DE44B30DA76BABC307A88124F96F26737A85FE6047E7E485C7E4B6B99B575FAEDC9BACA3E080E2B074CFFCE1F716C6A1D08234C45706D2883C6E5A001D02596CFE5B260DE6134C75DF3AC8BCF1919759E15576CA147CEBE041D04E369BDE70CC64157AEDA311C8DA520EAE907C33E30DD89013E24B7B02E66C9F285BF7D5C3FD65BAE24AB20D40ADDB451AB4BC4B9772D0B9039461BCA8D3D2A4D71A2E6BFBE7F02325FD571FCAE1FB47F855612F382188A5FA3D61C3E8E59EF016DB0149C52E1C7DC84030E6C93C4F32DA6CE5F3B8196AFFDE834D2ADC26CFA05940055401891519386BCD33D85584D74B2F16D8E19556C272AEE8397A1741EFFC283DBAD317740C1B67F8F4B7D2D1EDD68D6615EAC3F8E3CD26AC4F8058667FB388B19C654711B5B2EDA75A9AB55174157CBE08C186A3D0963BB3011A9567BD499AD2A8 - -count = 39 -seed = 811A8A2ED2917CC616FAF246C5F9BB902E5FBF5430AB078AD6CE871CF8C160512A748216EFAB3A4CE1271AAFEA12C11B -mlen = 1320 -msg = 061934748C6758ECDEDDF3A2DF78574A470621496CE3F12E5E4555FEBCCC1A46A772FCBADEBA8B2EB5231B5B15DEDA5A38076C737E5D091A8CA8482F84EC4A20A51DDDA391088F2C3926F8E1D8B77DD0ABD606E9AC25A17A86A5C75ADC215C5030355C4A1B307C1CC80A3BC4A7D4B4044FD35D173A2C7C081318F707828A3438DABE0836C2D6C14E1643F05EF8405531D5594411AE4DAC6F3992279CAE379D7C1762B122037301D3FFE8EFD1BEB4E027E055527D485D0871F2013E7B25CC26531C2CA6DDB98B31F0AC2C3BDF400A0BAE942C9D4C4003F9952B67AF67E85F572EDC3345A84B6DC3CEBBAADB7E3C876AB2DA16ED0EACF4858033BF5A4F739F9E083A345C2BB5D8611DAE90D25AC45D8B3D39B4DE584CBEACCC6F5B6E61524349B50E818BB6B03C7E5B86795D49324CE6B1603791F20B3500A1B8ADE82359263470D777B35DBA38276096445842BA5D5E960FB2AB58730F970A15AA42D9737C33BE700127A7CE7CADE024D3ABCA59CA49F9A7EDF44DB62CCC07A595016868AA97A140178DC92530EFF864C24954464BA886DB7D74BE7B540BAAF807F1AEBD014680FF4A51E16E1391E32069EE823F3D23DB72244D657233578CB7D29A33E6EC31DF1FDD43B51742CC30EFC54BE83149177E7BCDE4450DCD142EB2CB745F8865DFD99DC84AB92750F1CFB0F3944E4E4EAA41261A1E8C58D9B230ADD792DCE20D2612823C0FF9F82E04B61E48DBB83F1A6DD5CC7F92BCD0A37AB3053803D1188029AA1FED9BA04F4C961588C9AD2BA7EF1CFBC50FA69B799898EB0DFE9668260CA5680F91A10D2BEF8F108AB28FCAB693ECDB942070D2B9B8BBB22609C8395C23D7482C31B69B0F555B7C079D3DEFAA5FB302ED92619C058ADF334E845EB1C6EDD903C0DE2AEDD3D9830943F8BCC5954B65DF37C901A17EF13FA75B0F2C8C1D2E38681874AEBFE90B463F2CC7831958FDC0DE0446991EB3C3612CC00188DFC1078FE458D2E5B80EFA7BFCE800C6B4CA0E570FA5858859633551DA28F36F1FF418A9B7AD18AA89B4612F9D676D5FD98BCE6F144CD7458CA9F2BC732A36A4D186EA290A009A870DA3C1F60617D56EA7554062367121F3E5E569503AA573B172C6278DDE5AA4CCDA79D9D8FAF41C6C9040C1D1D3CB78B41FFA8A0180395439F0D1B72E42471A9100973AB3BC7AEC559D94D2D6402374BA5A584DE168395A156324E1E4149ABD35C72AE0F79863CB59EE6BA22145E36E0D85D3CAF8A427D38C96CE489CD0AEA20D7960608C074CE3CD0494B6D6D5EC8895F0F03CE78982AD8FD6784BCF16825286C51325662F34726BA66D3A91EEB598124D6755DA090EF863FA31CCD5B08909A3279A35CFDCE24D2BA16F42AD280B029A0E27137A671C862B0E6F73FF4A1DE320C4DAFFB5CD4AC3522EF1C10E8A918005535F355CE6366B43A757938594366831DBF7EE72F311BE4953EDD1EA1C598960745D3DBB7F1E2D882CC063BC0791D18C6376A8497F2F91389A13AA96DAB78FECA081D761479848A5B4CC2E3D015F343B9000583E95E785A45A06842D7C6C0FE9AC4D70F085503D7AC954516953C497635AC8B7698BB784F73FE6E7F9D0AB9473E828168DF4EC142CC1FE18FA067525915ADF0764E44292A0316EF3C0A443683C92C4661409589EABD7B4DBD43F54317AE0E3D1C69C35A7868991FA0BC2F83430D89821B91A08DDC2D314A717F5BC6F3D89DAF163AF73E10C61630139E3FEDA723FEB2EDFFE6C7F364FBA22E6AAB75E267065B5E7575946C56265743816B2CF12A106AE21921E3E92BFB7FF80E105468F8409D6698E8660B5B05F3F4BB19A0BD4BE3569D24F51795752BE74C429AECA5BE737DE8C01 -pk = 4808FDEFD4E1A93F36790F970AAFABE77F40C9F892D9D512EF72975444271DB887D36CBD85BCC8A0108B2207C4C0A1006C5235B91B33B5CE35B166FF24ECC2A7061EC4A29DAE93368901F6651A5731A46629838C3C5DD55CD51A6B4DEC0F9F00 -sk = 4808FDEFD4E1A93F36790F970AAFABE77F40C9F892D9D512EF72975444271DB887D36CBD85BCC8A0108B2207C4C0A1006C5235B91B33B5CE35B166FF24ECC2A7061EC4A29DAE93368901F6651A5731A46629838C3C5DD55CD51A6B4DEC0F9F0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007D4A70E465ABFCD96DCC7A17F0DBB3E2359B4BBA3E33A493F0D2E7171FF4B40680415F8772A786D7096AF8D65BDEEAFFB421B4C2D3C3A07A1C3F3617CD2D49E8F462030000000000000032B999589F73763AD949AFDA65D039746D54DC6CF823963B5BA9F70F9FAACC906A495E12413B722993012649BF6E621D72B5E5B353C8F77C362A08DAE27544929DCFDCFFFFFFFFFFFFFF3E536A72B761F6D9511B27B22A4F60C4FB850E6BA88F7EFB9AE7E392798E91D34CC673B4527777356A507FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D399F9B30AE61D7A87825C18A33B4E9ABD973730AF86DC46C9EA1541C2F041C65D7F9A4F31A3385CDC44F00000000000000000000000000000000000000000000000000000000000000794BFCBC62ED6E6027FF575D26499A54481135AD759FA07EC8699282421AEFE58F2C59326EB894C7131707C5A88206033328CA692C533F40F5A27F4AD98B7F293987091BF4379588E4DF7AD619CB02B50FE56A37016B12DEAD29E9841692A003C38A04D039F4ACBFD3C69E6BE71A5FCC3DA6983D380D2B2739DCB943C7AFCEA5CCF968ECE856588607181375D0DC7C0204EC5BD9815F1F0244AA993A8963B1BF578188DB5C334B0367CA83B1D4CBB907BE3AFB7A9E596DA7AB11F192E3D6CC012AD426ABA6FC02C2019F5C12707ACEDB5FCF5555EC0FB245F06E0B4C7381536E755361705AA35840CFEA11E2A2AE0401CB508FFCADC0B0014EF651BAC629FB3FE44B7232C897E805A40907210C0E8B880EF3BFA2873710453EFECFE35E831B02800039F39BD33FFBBD22E8BF4B639C1109DAA5B7816D8F30AB6D28C8EB9E7462EA871E8EB77CDA514B99E7BE8E8C9800B82F39A2BC5DB451E659B72A2F609203E9BE378476EAD3F0990CDBE27145725B7073E27F4DC505C01563B1B280255E025BC1D7C8E3FC256A38DFA0EFB163F4560A4EB5A705FF21311FB8475C58B061E395403ADD1D828EA76037273D84EB8B006AA2B14F7DF0D1713E364A6393DA4E5F42A7B4446168357F1019F26C11EBAF6300D5E4CA31C63EA9EF372B2F4B08250179E3623DABE67EF85F7C9D737C69932E041CDEEB7DA54E4309AD51DD6EADE21E27D339DE3808E1B7AC5AACD20F2C3F03D6B58344F3F5CF8424EAF4AE16FBA12754FDA40E7AB9D85068DF66E1C6684CC5AF9BCBB263B6C8650E81605B7E336103DD48DE94F49E0FF508D4543801BAFBCBEFDBB9239B1B003D406865227A00A95AE5FDBC10E9FFD37E3FE0426855E9A3016034EF566F309B45536F4DAD8D7210FE029B5FD0A0A523BE67FD1101B754CE9C71DD4ACB82BFB099F6D7726B9F7F0C01 -smlen = 1583 -sm = A28115A2070462969772A6540016643A37DD63AA9172326FD100B54ACE2A9A14C606A37DF3A8015EA185CE8B31EDE299E83C5E01F6B5388C65D50BFAB3C660290195728011241477450E69111A00613AE86F66B13B13AA7C69F9017E0F5C4799AE163F273F09A4017C2184200570796B6CEB6B5200125E4667488666D0C3510E750161126770214668928AC92E8701AD0B0CFA9F8511EF19D958E200EBC303810E860A644F12A31B012F615027A534051E565A870F00048827135DAEE4548DB4EF23006298A4874F9F825CAFBE2734010043839A0810FDF12215966F5EB07AA96F77DCB22565A99C02BD1703FEF11EA211D819A0EB2752D5002D0AC3F76FD7E5DC4E272FB0AB0D061934748C6758ECDEDDF3A2DF78574A470621496CE3F12E5E4555FEBCCC1A46A772FCBADEBA8B2EB5231B5B15DEDA5A38076C737E5D091A8CA8482F84EC4A20A51DDDA391088F2C3926F8E1D8B77DD0ABD606E9AC25A17A86A5C75ADC215C5030355C4A1B307C1CC80A3BC4A7D4B4044FD35D173A2C7C081318F707828A3438DABE0836C2D6C14E1643F05EF8405531D5594411AE4DAC6F3992279CAE379D7C1762B122037301D3FFE8EFD1BEB4E027E055527D485D0871F2013E7B25CC26531C2CA6DDB98B31F0AC2C3BDF400A0BAE942C9D4C4003F9952B67AF67E85F572EDC3345A84B6DC3CEBBAADB7E3C876AB2DA16ED0EACF4858033BF5A4F739F9E083A345C2BB5D8611DAE90D25AC45D8B3D39B4DE584CBEACCC6F5B6E61524349B50E818BB6B03C7E5B86795D49324CE6B1603791F20B3500A1B8ADE82359263470D777B35DBA38276096445842BA5D5E960FB2AB58730F970A15AA42D9737C33BE700127A7CE7CADE024D3ABCA59CA49F9A7EDF44DB62CCC07A595016868AA97A140178DC92530EFF864C24954464BA886DB7D74BE7B540BAAF807F1AEBD014680FF4A51E16E1391E32069EE823F3D23DB72244D657233578CB7D29A33E6EC31DF1FDD43B51742CC30EFC54BE83149177E7BCDE4450DCD142EB2CB745F8865DFD99DC84AB92750F1CFB0F3944E4E4EAA41261A1E8C58D9B230ADD792DCE20D2612823C0FF9F82E04B61E48DBB83F1A6DD5CC7F92BCD0A37AB3053803D1188029AA1FED9BA04F4C961588C9AD2BA7EF1CFBC50FA69B799898EB0DFE9668260CA5680F91A10D2BEF8F108AB28FCAB693ECDB942070D2B9B8BBB22609C8395C23D7482C31B69B0F555B7C079D3DEFAA5FB302ED92619C058ADF334E845EB1C6EDD903C0DE2AEDD3D9830943F8BCC5954B65DF37C901A17EF13FA75B0F2C8C1D2E38681874AEBFE90B463F2CC7831958FDC0DE0446991EB3C3612CC00188DFC1078FE458D2E5B80EFA7BFCE800C6B4CA0E570FA5858859633551DA28F36F1FF418A9B7AD18AA89B4612F9D676D5FD98BCE6F144CD7458CA9F2BC732A36A4D186EA290A009A870DA3C1F60617D56EA7554062367121F3E5E569503AA573B172C6278DDE5AA4CCDA79D9D8FAF41C6C9040C1D1D3CB78B41FFA8A0180395439F0D1B72E42471A9100973AB3BC7AEC559D94D2D6402374BA5A584DE168395A156324E1E4149ABD35C72AE0F79863CB59EE6BA22145E36E0D85D3CAF8A427D38C96CE489CD0AEA20D7960608C074CE3CD0494B6D6D5EC8895F0F03CE78982AD8FD6784BCF16825286C51325662F34726BA66D3A91EEB598124D6755DA090EF863FA31CCD5B08909A3279A35CFDCE24D2BA16F42AD280B029A0E27137A671C862B0E6F73FF4A1DE320C4DAFFB5CD4AC3522EF1C10E8A918005535F355CE6366B43A757938594366831DBF7EE72F311BE4953EDD1EA1C598960745D3DBB7F1E2D882CC063BC0791D18C6376A8497F2F91389A13AA96DAB78FECA081D761479848A5B4CC2E3D015F343B9000583E95E785A45A06842D7C6C0FE9AC4D70F085503D7AC954516953C497635AC8B7698BB784F73FE6E7F9D0AB9473E828168DF4EC142CC1FE18FA067525915ADF0764E44292A0316EF3C0A443683C92C4661409589EABD7B4DBD43F54317AE0E3D1C69C35A7868991FA0BC2F83430D89821B91A08DDC2D314A717F5BC6F3D89DAF163AF73E10C61630139E3FEDA723FEB2EDFFE6C7F364FBA22E6AAB75E267065B5E7575946C56265743816B2CF12A106AE21921E3E92BFB7FF80E105468F8409D6698E8660B5B05F3F4BB19A0BD4BE3569D24F51795752BE74C429AECA5BE737DE8C01 - -count = 40 -seed = 41CC9DB2E90239AB5158A2628E7478D0B3512FDF84CD27A4CA5FE3119A455C22045F198C3C5C39F491FB975BD1CFF7F8 -mlen = 1353 -msg = AE2638D944822298959F47B2173DE7D1E58AAA622296AD4A4CB67EC7EAD8220AC2F171605BA2D08AF3D6FF5849566EAF96209E9E00CC28EB9A517CF5061545AAD24CCE143A2EE1AB7CFA259AD9C01860B33B0036F2CB3A5086861212F408C5F055D226CCC77CC884452B2670D89548EC1C6E98FB311DF03979CABF725E78956AF185447287BCA2517F554E9F25E19D93790318EFC5D2602FABF262E5C7FC307E5A991E0122E332A803AC4A91B318B30D79394248521190D2BE326037A89FE918D139F763DC8DAA2C3BBCE53F04809F0D97303F2F1B88B572B3086ACAF38EEF36B4C0791B4918204B0E1E923BCE9E3BB1E7BAA07135B176E266AF174D5DF26C44842CEAC4AE4C1CFF05557DA3DB8651261BE78D766699B1891CB825FA9A418C45BB9F7F2D347F3F92F9529CA6DB94E2FFCC69337FB3690F556C5A44CBBD9D79F60AFF063DE68B14BD2F4B7E8CDF94F6C2F40219D27F71E8AB3D4D6872A5D4B82EAF8E3943A6D425ED04FBC5C7596AE929AD680B245E3D6A7C5CCD7FDFA1D14EF0F72B9BAAEF05B7B84ADC02913DDBC76D5FE80DE30527FFAD1825CCBA34F8587C5B0291471D6957AD99C5FBCF3669B4AE5930C8AF68305C2D3E84E714CB9049A9560A3C94AEB95A252F69B68F755DC0E0AAB52DD054B670A275BD2BAD7FF8EC0CDE6224E9A0EB537E95DAB992C382D6B03FA045DA402CE7C5B55138FB400D9E86AFE30923AFEE82C4528D1B38CE16D33BEB47A96C18428D919BA98C9782806D6F4A40B52F7F0989337C724BE24E9A5430CFEA470D02EA36CA479FAEAD94A74049898D1F1BE53D5AB8CC0CDD5438A7C55827131DE264AECD18E5F5F2F9FD60E8D2D6F55BEB27EB77AEEAC2A15432A5F1467483BE6073243D0165A6C242FE1BD7B7AA701A0827F286ECB51E4C2626DCBE95466BC94A7E2A09AB334FEE3959CA31974B6286E2A2051653341623CF3ACA65637DF657280B6025DB0C0377EC09E6E32010F0F59711A30496695D23728319DFD0AB5F3AA69025276E68808130659D912A53693584188E310B1CACC41AF4B19FAD8DA95D4B35E2569053F553A9DFCBB8FDEE1455DFA0E4F5E94324C86A24288AE27F3576AE15FBC8BED49BFD8521D77A61FB523BADF0E3CEE53799016C6EE4E1E5DEFC19C7717A5C41ED8FA6BF0E5811BAEA76676DE03767A607735C2A48BEDE511012EAF1F79E4D2C3566042FF2C63BB82FBB399CE20E1F268D3844BB473AD7366EF86D064C5BA080FC0C01BDD2AD343C5367D80D2A058CF40725268CD34123C219D9109780335611B008EE3F8848EA9D174D7B96BD2FD9A04FA2B550DCF0B301D64C0764299D317DCD0CA05718A1AC008D86FEA330095E81567E83BDE31A0D635098D7B86176CE6CC4025E8628C73B394D9A45B09B64BFD3A424162B16E1ADAA1AB60006847C6D5CA5733237A330147CFE6B9170D7B88834BB79F1FDDEFCC0EBB1D4FEF326E28C41C919607BF12AD112807BF8582933DDB096F1F3E2BCD6BCBD844DA317CEA2A7688A5FBBA14D84C537814EC2B171ADE28ACF83EA481631B968C26F8D2BF2C5AF7D61A93378E1E23FC756E2F0EE79199475AB4BA1FBC55D9ADC2B05888B2910049BCA98DEFEFE96CDCB67CA9D4AA5BBFC6CA0ECBB78BF29035D158DE2A1708D98BEB85C70AD1C64B39B387516073E2FE85BD9EFA25CB048C224E0EF76547DCA67FD66485A97EB5E56C06C78FFA08EC1C9C6F2380912A2585CBCBA2CD702CD2B51022F63EC920412989BD743A8A8BEB07241E3E8EB38CA14CD400C83DBFA6FC8E04F58529007A1477E9613291AF877692E4CA9AE118A1902AE7B4AE7DC2E992A6495CD19DF32CE64131A8D8C41969A8BAE1D870DD5F1360BA9278D5B76E746FAF99D526199E87A4B1D3A5C48A33989F103CFB2 -pk = 1D4F35FA430B677EC7CCE0A7ACE49FB4E4440A05C38DAFBEF1FC8F6AB130F92BFB6B4394ADAD2EE7E3A256A149C82B017A35EDEA43A3BDD021B7CEF942E9CE29195299BA3C665BA82A31A5AA6CDC093CDDB5B20179F718DA2C79D8A99C676B01 -sk = 1D4F35FA430B677EC7CCE0A7ACE49FB4E4440A05C38DAFBEF1FC8F6AB130F92BFB6B4394ADAD2EE7E3A256A149C82B017A35EDEA43A3BDD021B7CEF942E9CE29195299BA3C665BA82A31A5AA6CDC093CDDB5B20179F718DA2C79D8A99C676B010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000391286EE2F440780ADC735C8C0923A6E6B23159FB1B5F89E0ABFC6C3D29AB3C38F6733347EE8210A144CB80F81A3AA4F9958C0B2F975EB55814E8C953C56DDE5A871290000000000000028C81A4C1302C18F7AACD29E5AFE62C302E67281549DE2B6DEE10F3225E4AEBB518C4F655EE9DC8FAD18FFC018BD939C4FB4103909459312ED93656E62368E405848F8FFFFFFFFFFFFFF307BA00DF1D5D80646CF65E4C584F252A1894627FB0E5F1725B71FE732F616B863882848FB4B7A26E83B4900000000000000000000000000000000000000000000000000000000000000272C7FCC26C9E91664D3A30B73C41C87988E44CE49595E5F271741D4A4A5C44CA69DB6328CD1584C3A9D67010000000000000000000000000000000000000000000000000000000000002F92D89E737AFEA71B974574A2D08622A117781B42B2A11FF0238460584B9DF0E926D4D938532AB4440D1DE7424C32036935B2EF535BFA854112AAFCCBCF5655549145E03A00AE4DE4FD3CDB12EA3DA2A78881804D7B4B862FAB71D68DEB210063F9E1A7925A46A33756D773D30D2C5673B181C668B5FE8FA84C075A3EE39369A4B3DE6AACF50072226BFA427C5DA5034F23DB66BDE60BBC6859A137484423B179E26BD6D9367C26441B23907C02A5C79C65DAA23E9A572AFFFE2B182A3C910079B0932F709FEAEF4C339861AC06C80368A6167D4DD915CB4D5141AAF1519C0F729541B6A4A90816675D2AB8B521D303567477FEB246598446229B775DD975BBD92B8E3F0C5355CF43A7B5BEF9060316B9AB4FFFDC546106DB11AD26BB16C60301577DCA6927FA1CAFB1339C8D5F742F0012EC2E28F6555EC884BADA88B7DF988A5AAB3FD43DA7F043C2B7F7EE5F90009B0E734F2519C221F420D10B73B3D661389531B09AE10FA8500C0C9197FAA9122F408750B71E7B38BDC973B65242EE0289D6F135478F9BF27329922BFEF2CB54EBC9A2772151D81E9F4E459F918D4F8BC5DF3F19D01BF2EE1192C902DF4B6D02F9F6F46868BB8677F78DD995D99426E30F1E85FE4070196EF1DE772EE139980AC6FFBF37A84679521E19908D956A530267A7EE9ACF218E80D0AB5A1FC8E3C255DE73FF34EAADCF68AB733B50C701ED4666E5BE5F454CF3AAFB6765C083FD86035ADDE512D29AF15E5D278D593DED0DA13CCED55ECCF439871BF6CF6012F1D59519B4F4C398A6E8FD0AAEFD78DF1CA302538EB218FF7760222B65F203494CA2270FA4C96D427A4144743191247513F7B0C92224CB634675511C3A0B81F54DE802CFF9A0BCEE4078C342E0316E0B72D6F77E64E4115B6B4D14B6371C99ED9F029A4ECEC220A480884CB0B41D2B896B8101 -smlen = 1616 -sm = 4476AFA0B15FFF5AAFFC5BA40128ACDE874DC04F64745603F501AA65C023ECB79335DD681C0B01104BDCB28245912F31FCC3D90028CF252C938505A816975B5E00CE3ECD61D68E393C9FB61776000F63A1020142904E19551A1500D2561BC6D64B00B388DB2DAC01369E527F6EA6CCFDDA48727900BB3FF62EC2572FED960C054A00EF7975956B7CAD2088A6633900859BF5A91BEAC31BD10B71D6018210560EADB811D7AF49459E007CA927297CA5063DB46B9B0F00DFDCBAA31F0C3327995B0990013B7138CCEDEE85AB4B17C4DF000091058D7C96026394ACF0469ABEC3695ED679BF29AF71B7513C1703744CB15CEF65915FC6DCD52E01D854F2AC5C09407A912A42BCBC06AE2638D944822298959F47B2173DE7D1E58AAA622296AD4A4CB67EC7EAD8220AC2F171605BA2D08AF3D6FF5849566EAF96209E9E00CC28EB9A517CF5061545AAD24CCE143A2EE1AB7CFA259AD9C01860B33B0036F2CB3A5086861212F408C5F055D226CCC77CC884452B2670D89548EC1C6E98FB311DF03979CABF725E78956AF185447287BCA2517F554E9F25E19D93790318EFC5D2602FABF262E5C7FC307E5A991E0122E332A803AC4A91B318B30D79394248521190D2BE326037A89FE918D139F763DC8DAA2C3BBCE53F04809F0D97303F2F1B88B572B3086ACAF38EEF36B4C0791B4918204B0E1E923BCE9E3BB1E7BAA07135B176E266AF174D5DF26C44842CEAC4AE4C1CFF05557DA3DB8651261BE78D766699B1891CB825FA9A418C45BB9F7F2D347F3F92F9529CA6DB94E2FFCC69337FB3690F556C5A44CBBD9D79F60AFF063DE68B14BD2F4B7E8CDF94F6C2F40219D27F71E8AB3D4D6872A5D4B82EAF8E3943A6D425ED04FBC5C7596AE929AD680B245E3D6A7C5CCD7FDFA1D14EF0F72B9BAAEF05B7B84ADC02913DDBC76D5FE80DE30527FFAD1825CCBA34F8587C5B0291471D6957AD99C5FBCF3669B4AE5930C8AF68305C2D3E84E714CB9049A9560A3C94AEB95A252F69B68F755DC0E0AAB52DD054B670A275BD2BAD7FF8EC0CDE6224E9A0EB537E95DAB992C382D6B03FA045DA402CE7C5B55138FB400D9E86AFE30923AFEE82C4528D1B38CE16D33BEB47A96C18428D919BA98C9782806D6F4A40B52F7F0989337C724BE24E9A5430CFEA470D02EA36CA479FAEAD94A74049898D1F1BE53D5AB8CC0CDD5438A7C55827131DE264AECD18E5F5F2F9FD60E8D2D6F55BEB27EB77AEEAC2A15432A5F1467483BE6073243D0165A6C242FE1BD7B7AA701A0827F286ECB51E4C2626DCBE95466BC94A7E2A09AB334FEE3959CA31974B6286E2A2051653341623CF3ACA65637DF657280B6025DB0C0377EC09E6E32010F0F59711A30496695D23728319DFD0AB5F3AA69025276E68808130659D912A53693584188E310B1CACC41AF4B19FAD8DA95D4B35E2569053F553A9DFCBB8FDEE1455DFA0E4F5E94324C86A24288AE27F3576AE15FBC8BED49BFD8521D77A61FB523BADF0E3CEE53799016C6EE4E1E5DEFC19C7717A5C41ED8FA6BF0E5811BAEA76676DE03767A607735C2A48BEDE511012EAF1F79E4D2C3566042FF2C63BB82FBB399CE20E1F268D3844BB473AD7366EF86D064C5BA080FC0C01BDD2AD343C5367D80D2A058CF40725268CD34123C219D9109780335611B008EE3F8848EA9D174D7B96BD2FD9A04FA2B550DCF0B301D64C0764299D317DCD0CA05718A1AC008D86FEA330095E81567E83BDE31A0D635098D7B86176CE6CC4025E8628C73B394D9A45B09B64BFD3A424162B16E1ADAA1AB60006847C6D5CA5733237A330147CFE6B9170D7B88834BB79F1FDDEFCC0EBB1D4FEF326E28C41C919607BF12AD112807BF8582933DDB096F1F3E2BCD6BCBD844DA317CEA2A7688A5FBBA14D84C537814EC2B171ADE28ACF83EA481631B968C26F8D2BF2C5AF7D61A93378E1E23FC756E2F0EE79199475AB4BA1FBC55D9ADC2B05888B2910049BCA98DEFEFE96CDCB67CA9D4AA5BBFC6CA0ECBB78BF29035D158DE2A1708D98BEB85C70AD1C64B39B387516073E2FE85BD9EFA25CB048C224E0EF76547DCA67FD66485A97EB5E56C06C78FFA08EC1C9C6F2380912A2585CBCBA2CD702CD2B51022F63EC920412989BD743A8A8BEB07241E3E8EB38CA14CD400C83DBFA6FC8E04F58529007A1477E9613291AF877692E4CA9AE118A1902AE7B4AE7DC2E992A6495CD19DF32CE64131A8D8C41969A8BAE1D870DD5F1360BA9278D5B76E746FAF99D526199E87A4B1D3A5C48A33989F103CFB2 - -count = 41 -seed = 1C13369824A3FDD41B1065E17297574715D9BD9CE5BB733D36D22C31B62BB1033989A604D78BFB1A0746BD4A2271FC0C -mlen = 1386 -msg = 9D84E1DD28C513987D5587A4427853762B7D7AF668FF9EC2E90211D6CF5C0DE6C7E54B298C1A6C67EA9A693CEDC4FCA1A6ADC2C6DD0E5BBCEE7266B9C6AC8FA8AF5E50078A6151F938161F1FEACDE4D8079B5A9D563423258CF3AE9E47D8E75740314F2FFA63865A8B30743F773A53E1AEDEAC45CAAE01993B75C8116FB0B431631AC001AA8BD02E5B83DE627AF0CCB3A3D86F66A7E5FB658F9226DF31095780A6E8262A247D70F4E7C971D108567FFBD7FED0E16B7FFDDD93F5764C3E02A61998C32146564D46589538B2E071AF86A26321A3523354F4F0C396B863FC8E9E2E3A173901D0D178A9D2828D0E0974B72CEDFB17937D6054F185A81D4F853787E6C3681A74FE25FAA6C256A9F9E9A9253F98B9AE4B8FA0068DC28BC7E8D5785CFAD20F7DDD643DAE6A2DDB02713C9CAFC2EB2FD18EFDECED05CC24913061BDC38E932DB5E8181FC0D3DE26A94E2138800B3C01E07E83B3B0BE187EDC75DA576AF1CC7B7122367EFFD6EBF05F4C2EEB0AB6E9F91201A4237910A87DE9FEF777981D48FBA28AB8D64D76380911F2A6621335DFA96B331AE8B3242EA1F2A260260244196B0B9596C411218A17D0A58D3B5735B9AD7B6259655CF6E2D0FE5B37D0A0B02E67951F5D3FB277B6E1EC87528B08229AB0EBD895CBA2D075A47CC8100E9DD17DE7D951BF0A68D710AAC21C8226D8CA95AC49FCBE9D493A8D3C7F93FA61685BE57FF422FAD036304F317A3DBCFEE7A4610C8C1DDAA79E37C19D6414F47230E01EF1CD5C7C2FFC319A29AE6A9C95B06C603F2CFC1D1FC914B036CDA6CF9A876946983B06123C2E5C7D09BC190647CDC0512F35DB9E214C77D3D7D0234C3F2590941236A367700F9C04D3AFB949DCA2067571BF28E78ED35FC026BD801C4AFEE9BF31C97580953950D2E81EE6426E78D6F8134ED19707473F0874367C86C9BE170BE63405A9BF7C46A420724B6CCFF9C21B015E21BB02C5A7AEABCA873B46571530DE56E47288C3424DA398517ABB6502A9A6A65D4983D97E479941C44CF0136D225991226F70837E2A7D1E9CB1226F40BF59D52C66549BF8E360096954F5875C466160A0C75A252E5FE6B8F1841FE210BF08520CE74D77B69692086EF50BB64732F19D1A49E5800F077700553290635D418168A6B9E3AE980112AFB9D58A18B94F972845C309E86FEC7E456191D8760A1C2106036E44C5C9A5F2CFBC67D741E8E937E99ED7820AB0787E39C385356EF0F05CD3E31C44115A8892224197B1D1F554D5098B72058FAD49C665F716A266CB4DB6204666E1DC07B6CFDE0EA00345661E0F94A5025D2EC98483CF482058D2EDDB018CEC11D91EB46B63971AB29367DB46137CD7690D5782E3A3DDC8CABD545FC1AAD8A9A0A39542AEC55CC3D58A5BB5E4A559DB1FCD2932EFF6E81C8B8E5AD5B4E0424A444BC55D96DF63C8971A5890310FE19DFF8ACBA72D96FD3F32D67D41A2F3D0B343489C7FDEE7556012C2D88E2BA9D512B71E7D04F92E6BE3A9386565271D755BED752C853E4539F95C3287A275004F76B9A93837C6EFC6760BE4A39B8AA92C7605AC369472FB29E11ACAD98FC91B1B9BB3505638D4D46A3AE3C10C8DC115C35725F06649BFB00BA1EF214B9F2FE98BE2DA99AB23E7B9F014F5C5D0248A9E0E088AC175C8048C6BEB5108DA59DC234E9EDFBE603BA912BEA22505C2A9EAAE766FF55AAC8392AEA5C722DF25BC6C9FCF9B0275DF71206A4E5290FC5E71D79928E357400DCB04EFD7CC9BD0B86E04BFED9BDBCE5787E40FCD6041ADDA615B5ECF03C30AB9B2809E3514E9AC87226C55F259C5F157945B0073431715E1740DCB319EDDDD1B5F2763F0439CC0D6ED5867D9D98C227CA3008F30D1B2AEA40DC73FF8289E4A21586EFF519520F888E7E2F6D29A269C12607D13D398F437CD7F0A07C94EE1E1E3D8518D0C97BE1E250D79C5AE1709AD8A638F55 -pk = 23DE594EE88C72B6622330C4D15A5E2E22C366DEC094FEADB45AE128530958A2F87FDC3A199E95227657463BE335F401FE5A436B54B93D5CE79EE8FD2EC26742276721A489EFB483E6ED2A966F9C45BD2EBDE3CF7131B9852AE00279824C3602 -sk = 23DE594EE88C72B6622330C4D15A5E2E22C366DEC094FEADB45AE128530958A2F87FDC3A199E95227657463BE335F401FE5A436B54B93D5CE79EE8FD2EC26742276721A489EFB483E6ED2A966F9C45BD2EBDE3CF7131B9852AE00279824C36020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A1163462944DE49B35BFE7645F4D8B39A6304437590579F9D6664042A42F464937CDA697ABACFA85A62B8ABCD5767618FDB965512C2FE8944866D0C0F6BC4CC87CFA15000000000000004E8F424DE15B56F14E541FA736B4A0C2E7D37DF70ECF2F4F805300481E0B2B615734C8E916B1DF5F940C71A2885BB7FB514399A9255D0E9591CCD3B462ACF29D2799CDFFFFFFFFFFFFFFD6819529CA4F710B4E9CD172BCA99499D56D115D564C7DB51569BE807D96CEA2D7498D4A335EC541957535FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF916E01FD84ECC2DF1E67DB390DB2B0052742A9CD2E8DBEF492C11335A6BCEA1D68E0C196A828BA3E4A4A58FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7EC5AF8D69727B9675EF62BF48D0BCEF336A902F96F2B8EF14ACBCF565B6BE024698C18D153E5CA6EE5A52F619CCBF019A452B69BF82568712369F35BFEB78DB4A82BB561BEEA3A9EDDA5E4B130C1C61FE5094668069EA2B3A048A0187387700A622F4F29B5BD6710AA7E6D2C38C31FBE4E4A940CB1108EEF3CC27DC56C61832D6F964B35F3DEEAB84D1CDE1849A4E03BC0647B745E7F6A8C0F410C99410BB2895F97233FE3B38D575C7C77A7BA1255A3BC9E93E15B4CE2CE63E5EA097BBBA008CF5ADF4877D5DBD345F8D5117DD8521AA78C02E13FCFAF07C60BE5C99F0BD2EAE576645455D8574313AE6700A55E702EED87FB3F4C71E26FDA40A9BDD765E80A05C74A40C854DC1E253238E55D06413E63884F5723C19F693B1C1C782D85F00005D14CB75433AE6F8371A51AB16D6F4E2351477EAE60B182220A004AB18F250D29D5E776FFC054EBFD18B9AC8942802F97BD0C98525B576CEB28AC878402357466CE99075299CDC11FA317618455A1B7D0A87C87F090E9C9004757D210B0702444DA04D1E8B0C7DBB205E8171620225FF2E7D83CAD0DB5636E222477F5BC23B77DD0ADDCCD2D87EB47678DCA591C302A78372C9ED25031F5E66034BE22DCC8DC4BB81AF481BFCECE8CA2D05CC221DC31C6DD507D21748CABA10E2769230B600D2AFB7F2C4BCF29B7A0C97702819EA8CAA41262FBC936B890123FDF70D70DBD6B85AEA1C5952D9C928EF5FAB90F3EA02B726FB4B6F1F241479E2F19A6B535A7D9D103B9835FCC15EC85E5E1347E922F0C44BB739AC223A0745E01CF35BF4B500379DA545E3767AB83BA64C83FF74B24C6D25B4AB04EE3B9D178E908EF5983049E290FA77C8B07034769B0C542FB3AA032195DA80B6D51A73A39896C68BD5EDA997BE62DCB54AC30B42B9799CD142523EF2643F7C32340B719799FA76E28E2203 -smlen = 1649 -sm = 34023E0450DED8F9B557574F0132C36F5B527A7C1B260D435100398A27D99522363FE34A2F5201004428A155EFA9915051B868006DF8B4A0E71CBAB33494A84D01459360CA5A8C1400E19567C50120BBB64D66DED4A4B365D5F900B04311D76C61FF4C1B35834B014112EAB338A7AFE27772A00300B7505509C463DA587F59D18E01515EC2098E70E5D795F35BC1006AE5F3892B7B92CFC2FDDCA50085DA2960450AA2161BD4DCB400E9769C35AE2C0324331FC58401BC5EB148DF85287839DE09C400B6237A732506E207E5C17C150101B5FB382C19EA98D7C35B5173C08043273CB52D31BA67D499E8140358186F8574132313F22CD45900D3B6DED23195B1CD48EF91FEE2019D84E1DD28C513987D5587A4427853762B7D7AF668FF9EC2E90211D6CF5C0DE6C7E54B298C1A6C67EA9A693CEDC4FCA1A6ADC2C6DD0E5BBCEE7266B9C6AC8FA8AF5E50078A6151F938161F1FEACDE4D8079B5A9D563423258CF3AE9E47D8E75740314F2FFA63865A8B30743F773A53E1AEDEAC45CAAE01993B75C8116FB0B431631AC001AA8BD02E5B83DE627AF0CCB3A3D86F66A7E5FB658F9226DF31095780A6E8262A247D70F4E7C971D108567FFBD7FED0E16B7FFDDD93F5764C3E02A61998C32146564D46589538B2E071AF86A26321A3523354F4F0C396B863FC8E9E2E3A173901D0D178A9D2828D0E0974B72CEDFB17937D6054F185A81D4F853787E6C3681A74FE25FAA6C256A9F9E9A9253F98B9AE4B8FA0068DC28BC7E8D5785CFAD20F7DDD643DAE6A2DDB02713C9CAFC2EB2FD18EFDECED05CC24913061BDC38E932DB5E8181FC0D3DE26A94E2138800B3C01E07E83B3B0BE187EDC75DA576AF1CC7B7122367EFFD6EBF05F4C2EEB0AB6E9F91201A4237910A87DE9FEF777981D48FBA28AB8D64D76380911F2A6621335DFA96B331AE8B3242EA1F2A260260244196B0B9596C411218A17D0A58D3B5735B9AD7B6259655CF6E2D0FE5B37D0A0B02E67951F5D3FB277B6E1EC87528B08229AB0EBD895CBA2D075A47CC8100E9DD17DE7D951BF0A68D710AAC21C8226D8CA95AC49FCBE9D493A8D3C7F93FA61685BE57FF422FAD036304F317A3DBCFEE7A4610C8C1DDAA79E37C19D6414F47230E01EF1CD5C7C2FFC319A29AE6A9C95B06C603F2CFC1D1FC914B036CDA6CF9A876946983B06123C2E5C7D09BC190647CDC0512F35DB9E214C77D3D7D0234C3F2590941236A367700F9C04D3AFB949DCA2067571BF28E78ED35FC026BD801C4AFEE9BF31C97580953950D2E81EE6426E78D6F8134ED19707473F0874367C86C9BE170BE63405A9BF7C46A420724B6CCFF9C21B015E21BB02C5A7AEABCA873B46571530DE56E47288C3424DA398517ABB6502A9A6A65D4983D97E479941C44CF0136D225991226F70837E2A7D1E9CB1226F40BF59D52C66549BF8E360096954F5875C466160A0C75A252E5FE6B8F1841FE210BF08520CE74D77B69692086EF50BB64732F19D1A49E5800F077700553290635D418168A6B9E3AE980112AFB9D58A18B94F972845C309E86FEC7E456191D8760A1C2106036E44C5C9A5F2CFBC67D741E8E937E99ED7820AB0787E39C385356EF0F05CD3E31C44115A8892224197B1D1F554D5098B72058FAD49C665F716A266CB4DB6204666E1DC07B6CFDE0EA00345661E0F94A5025D2EC98483CF482058D2EDDB018CEC11D91EB46B63971AB29367DB46137CD7690D5782E3A3DDC8CABD545FC1AAD8A9A0A39542AEC55CC3D58A5BB5E4A559DB1FCD2932EFF6E81C8B8E5AD5B4E0424A444BC55D96DF63C8971A5890310FE19DFF8ACBA72D96FD3F32D67D41A2F3D0B343489C7FDEE7556012C2D88E2BA9D512B71E7D04F92E6BE3A9386565271D755BED752C853E4539F95C3287A275004F76B9A93837C6EFC6760BE4A39B8AA92C7605AC369472FB29E11ACAD98FC91B1B9BB3505638D4D46A3AE3C10C8DC115C35725F06649BFB00BA1EF214B9F2FE98BE2DA99AB23E7B9F014F5C5D0248A9E0E088AC175C8048C6BEB5108DA59DC234E9EDFBE603BA912BEA22505C2A9EAAE766FF55AAC8392AEA5C722DF25BC6C9FCF9B0275DF71206A4E5290FC5E71D79928E357400DCB04EFD7CC9BD0B86E04BFED9BDBCE5787E40FCD6041ADDA615B5ECF03C30AB9B2809E3514E9AC87226C55F259C5F157945B0073431715E1740DCB319EDDDD1B5F2763F0439CC0D6ED5867D9D98C227CA3008F30D1B2AEA40DC73FF8289E4A21586EFF519520F888E7E2F6D29A269C12607D13D398F437CD7F0A07C94EE1E1E3D8518D0C97BE1E250D79C5AE1709AD8A638F55 - -count = 42 -seed = 7AD6C7DF00C9E52A75290D28DA946305D83CCF6DE2515C19A8E26850C34C8C2E545E2E32108F13B9C97F87AB68D10131 -mlen = 1419 -msg = AF2860129C08A1A9C7A7BB3120B3E40AFA1A4A09050C8483E7511FABF3285544D4CE3F41401DAB8C17DA547F6777A72519F6EEAAC83016FA0E0FB0B33329DD02AB8EB1F291758074EBB5B7C4C102B75BA422821E6755B37B914D689D84808A89CF88F69A446F489A260BA03CA52A4AA14E8BCF4BFE5134DD2918A88D67329B9BADC6ADA4A3071FD21CFC45235FA0A1B82D91C5877F10AE087464251C8899732AA7FC8F6C0A5BEAF4FA41E64CA97932925A06E218272500249577705804C6DD9F0F61DEE6AAE096BE0AE5E67923137933FE4D61E9A88DFD5B3BD75AEEAF5018A5153985E2837AD1AAD5EED91620D935EB9982DD2364B5413F490BF251FC783503FA146300E6ADAE0682E0597C3839C645DBE855919BB1CB80C3DC6E233909017BB31F5ADAEE05CE442EEF594FC15FEC3A2B4B81ECAAD1340B0677F27009290AB3AB8788556389047F63C2CE9390658E151CA85BAAE45ED2FE12B6667967F6B772EE683AC2E7347C7B0EFA332B3354B5043CB86200F8E4249F68030844D00A86FAA7B79A4129AD676D1E9D58828A1AF4C6BD68C29CC23002E0A0313500BA717B8756D4A18E41E381DF8D7A999A153876DB876CA4A508486A4F331CAC9CB3E7C416C6329713CAB76E1C8B63A8CAD46F8EB1E65116F89A3B4EB8FAA14A73097CA71AEA3220BE7FB7FE64919893930445D962C309E23332E4B3ED8CA768EF0ED46EAAB199827AD628A1BC20CCD9F61BEF67F7FCB017300EBC7493A7CCDAEDBFCA5F91E80B80DECBFD9EAD9BF22FE16B563512C7383D34801C504202D7A0E19821EC8495016362EDAC165904D2BBAC484DE1D4112C3A3E6EA56A78785B7CAF2A44B5BC8BECBC50BF4B521C1D086086FEB009C06ACB8FA0F53E7654FB02AD7898E35E5F3A7DCFC50124BA1F30178C707F4D36E4E7758C4CF82747753CC30A836311794A6A9017F53ABD17A1C9647AB38BA56AAC83C1812DEE8A5A75C5CC958780A3E9C3C1F39729BD365948F7FCD8104CF09660060FBAD2BE9B8D8E5BDD22286EB0BFD4010681AE7928D0FC008E21C8F877D97B5B9C7A06C02530FBC6A9D6FCEDFEDF68A9682177757CDDDFFA6CB9086B8330E61851E2761D84DA37635EA8441E3B23FD165CCEA562B0A3616B30EE5FAE00F76D6801B22F2215D80829E01DB2C0743E3074CF26C96B0EDDF97D79FB9C7FFE9B5CDB891F9E61FEFE7E1CBD28FE25B7858921C8C99C45A84B50A8233037DACC20BEEEBB9B22089DDAF2EBF0698498DA694F75ED2463D09BA2C757A986B8CA556CDF46CBCDF288C078041D497242F66411F47F35A21918855F105F24686076FA21BC1283F17245A7122A848B4BC10D996B2C5161FCE0336B2EC747A4A07FA9851AC5423D1EFC4B524E795B2E4BFFD1C5CD21F5FEC954824DCC53BC3883A7F571A9323DFDD2682C4A4C54E8862F347C9A8897779170B257AD26D90121DDE722A3F214A44CF6C5A5DDB2452A2471EBE7FC8D0EF7F1EDC7920CB42A71E4DB49A0168D51843F47D17BADE50DCB340E5F7B7E5B6A6C3AFE0FB26B5EA172A4011EEE838E5634E521483C6EDBE9994B0658406ED8F4998C7B4E869845CD16CC4368DA3BC1B025A6FFAFBF540133C372D452DD831DCAD39D61CCED0A0AD193FA9886EAC749001E3BEAD5A7962275FC62298A1BD054F4BD97ACAB2BBFDC355C73509D98B6DE5B4CD774BDCAF1398532BB3DB56524CC047ABDE6880C3B282FCE0FB2AD7E4C5F7BC138B48D194E8C8036DF4B9F3949E912AFE5D2734662F27583193D0FBA2B73C1A0D012DB853BBBE4383F6C391F3220E1B5761C337A054FC9FDF09C01864B87324A90C776EFBF5D34A68DEE38EBAACCBB61B4C79A58CC848184F605D43CF9D40BE90C1FBCF6735270132B59A636B16ED28111246270AF32EA2CB7A42A084005AEBB6161002E65B37217361BC269F5ED12F7D50613C82934A6D1D98D1308AC82827B7504F3FD351E0ACA1C62843C9219023FD092692BA4B83BE198EA -pk = F2434A723059C395A29790FBB2CB12C2645A2D41854E1CBF1C379D5BE339453015E96610F59E8D2B535966F6DE72D7004A4880DC6FA275577A27D83E573AE361688E1F09AE5268A404421D619D210E807FBEF0AE5B38D60F0D8191B5AC391002 -sk = F2434A723059C395A29790FBB2CB12C2645A2D41854E1CBF1C379D5BE339453015E96610F59E8D2B535966F6DE72D7004A4880DC6FA275577A27D83E573AE361688E1F09AE5268A404421D619D210E807FBEF0AE5B38D60F0D8191B5AC3910020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095014FBA35A2EF2ECCA1129E90362BAB382C870FF12963DBB6B7240176BE1C4AAB2DCD99CA94DE2E3E2F8042D32212816AE1090A994B312273F0EF8FA8451BA1606E0FFFFFFFFFFFFFF98AF20B9DFA168CD9DD9421653BC1C31C3EBC220EE11E0281B9B87B155B05ACCAAE0C7FA491A5EFDEE298759F494BB858C13E9D53F74684B0F90CB419192217FE150E9FFFFFFFFFFFFFF34683713DC0A656559424DA11D4C5905DB4038606E582D614D71089A379C3FEC2DDB374CA66D29C8A2442D00000000000000000000000000000000000000000000000000000000000000FFBFF1342BCBD8E84F4517F7DD9A2EA95BE9BA1095411F1903B88A74D29989FCDAB91EF6DC1E8A6F2AB1070100000000000000000000000000000000000000000000000000000000000072D987183F7869E46494BFB5E3496AC6DDB9A32DEA9580F044CBAF67C3FECDA0C0E9F583723ECB07E57A34349495170159B864A9064E3A77F152DFB34DC6D7E2F757A195F17F5DC0D1BCBD9CB26788B215716E0D341808D572664801A500A9037F0362C1964F30828286A2D4DA927F27A92264F32BACB6DFFBE035D0B8D99BE9E1FB2464B3F4FE967D478DA1D81E6D0243B79EB7CE37C9B33C8E03B20203292ECC8B9B735B4F9D7CC4D0EE8FC87648AC85FCDD3B05C7617578C7C1DED8AA710353D60F9F09F11E6A44CE8E90B053B3DE2DA5F3F1720D1B8DDB42904D8343049B72842B9EEDE43BCB3859C9A918BF580073DC6E741A6C78B8C86DC834EA0E3D42305E0A4AF221B28FDF948149E177808553937CCC072E8BC72B4FC9EC219DA0027BDE85D53E21BED03C9FF5B775C055C3C420499CE4617421AA19F57412F13A602ED2217A13349C83C39EF3A0934C0601A0605B807C73D1377B91D975DE88F6028F492755C716E604AC92109BB8A641E5A12552A257E6B3DD190156C963C09F02D9DA559A2FF871A3DB24D358AF009ABB68B028E340206BAE902734BF769ED3E7E60005EFE05B9C5E32F03C5656C2CD033B278BE134D2F65D973C311A41497AE338770BF7E1B8E719AAA86FC2380FEBFB089A9AE291AC1D61FF2C2261A910DA009BBCD6622212B41C6FA172EFC743E402AC02D3916E2E8AF35EA39F23046D8147F97CFAAF5375F32507E6958BBB2E6201C8C1CE2413689EB682E4F9D22F98493A796D8E4977DB13FB3956D7DD3D43E2DEE2574EEC245E254ABE6AD1531ECFB803EC11E690B43D3E6CBFA375EFA4CFBC605DBD90A53E14CEC69ACCFE2582D7AF56B17877EC71EB9B25EC5E07182DC786007BEE68605A13E14B878969F6A7EC13E3F14B4E2312D3E7BB12D908AAFE6D237D05C2C040C3D7B689B30C7629952BE802 -smlen = 1682 -sm = A57F660AFD0D38BB26205D8A009D4D16D68C2009F62F20261000A3D8A448B5C993E812A1F0A100BFE07E904E16F312ED1EB6BA01024830C4EA626F24C32B54B900C2A5D3F7C6E30D8BA2FDBACD00567148550129216BD7CC9B1F003A80E29D41C3AD1AE42395FF01915ED2C95467B5ED36D34C6200AFBB866B26C69B2721878E2D0072BDFBC12514C1079F62E7050117598CB2E2CD4F6E10883E5A00353B9C24C19A9ED465A0B0F801C8CB7153735E81C513B6F62101EE6F1AE15E83B71253CD8FC3011BFB2EC754DBBDB545605F260001F54D79482A51BF8F3C1E4AF8BE96435B65943D1672A625107D0E005A8C066431525F21F9CB4029001C9FB68896AECAC34B7444196B0CAF2860129C08A1A9C7A7BB3120B3E40AFA1A4A09050C8483E7511FABF3285544D4CE3F41401DAB8C17DA547F6777A72519F6EEAAC83016FA0E0FB0B33329DD02AB8EB1F291758074EBB5B7C4C102B75BA422821E6755B37B914D689D84808A89CF88F69A446F489A260BA03CA52A4AA14E8BCF4BFE5134DD2918A88D67329B9BADC6ADA4A3071FD21CFC45235FA0A1B82D91C5877F10AE087464251C8899732AA7FC8F6C0A5BEAF4FA41E64CA97932925A06E218272500249577705804C6DD9F0F61DEE6AAE096BE0AE5E67923137933FE4D61E9A88DFD5B3BD75AEEAF5018A5153985E2837AD1AAD5EED91620D935EB9982DD2364B5413F490BF251FC783503FA146300E6ADAE0682E0597C3839C645DBE855919BB1CB80C3DC6E233909017BB31F5ADAEE05CE442EEF594FC15FEC3A2B4B81ECAAD1340B0677F27009290AB3AB8788556389047F63C2CE9390658E151CA85BAAE45ED2FE12B6667967F6B772EE683AC2E7347C7B0EFA332B3354B5043CB86200F8E4249F68030844D00A86FAA7B79A4129AD676D1E9D58828A1AF4C6BD68C29CC23002E0A0313500BA717B8756D4A18E41E381DF8D7A999A153876DB876CA4A508486A4F331CAC9CB3E7C416C6329713CAB76E1C8B63A8CAD46F8EB1E65116F89A3B4EB8FAA14A73097CA71AEA3220BE7FB7FE64919893930445D962C309E23332E4B3ED8CA768EF0ED46EAAB199827AD628A1BC20CCD9F61BEF67F7FCB017300EBC7493A7CCDAEDBFCA5F91E80B80DECBFD9EAD9BF22FE16B563512C7383D34801C504202D7A0E19821EC8495016362EDAC165904D2BBAC484DE1D4112C3A3E6EA56A78785B7CAF2A44B5BC8BECBC50BF4B521C1D086086FEB009C06ACB8FA0F53E7654FB02AD7898E35E5F3A7DCFC50124BA1F30178C707F4D36E4E7758C4CF82747753CC30A836311794A6A9017F53ABD17A1C9647AB38BA56AAC83C1812DEE8A5A75C5CC958780A3E9C3C1F39729BD365948F7FCD8104CF09660060FBAD2BE9B8D8E5BDD22286EB0BFD4010681AE7928D0FC008E21C8F877D97B5B9C7A06C02530FBC6A9D6FCEDFEDF68A9682177757CDDDFFA6CB9086B8330E61851E2761D84DA37635EA8441E3B23FD165CCEA562B0A3616B30EE5FAE00F76D6801B22F2215D80829E01DB2C0743E3074CF26C96B0EDDF97D79FB9C7FFE9B5CDB891F9E61FEFE7E1CBD28FE25B7858921C8C99C45A84B50A8233037DACC20BEEEBB9B22089DDAF2EBF0698498DA694F75ED2463D09BA2C757A986B8CA556CDF46CBCDF288C078041D497242F66411F47F35A21918855F105F24686076FA21BC1283F17245A7122A848B4BC10D996B2C5161FCE0336B2EC747A4A07FA9851AC5423D1EFC4B524E795B2E4BFFD1C5CD21F5FEC954824DCC53BC3883A7F571A9323DFDD2682C4A4C54E8862F347C9A8897779170B257AD26D90121DDE722A3F214A44CF6C5A5DDB2452A2471EBE7FC8D0EF7F1EDC7920CB42A71E4DB49A0168D51843F47D17BADE50DCB340E5F7B7E5B6A6C3AFE0FB26B5EA172A4011EEE838E5634E521483C6EDBE9994B0658406ED8F4998C7B4E869845CD16CC4368DA3BC1B025A6FFAFBF540133C372D452DD831DCAD39D61CCED0A0AD193FA9886EAC749001E3BEAD5A7962275FC62298A1BD054F4BD97ACAB2BBFDC355C73509D98B6DE5B4CD774BDCAF1398532BB3DB56524CC047ABDE6880C3B282FCE0FB2AD7E4C5F7BC138B48D194E8C8036DF4B9F3949E912AFE5D2734662F27583193D0FBA2B73C1A0D012DB853BBBE4383F6C391F3220E1B5761C337A054FC9FDF09C01864B87324A90C776EFBF5D34A68DEE38EBAACCBB61B4C79A58CC848184F605D43CF9D40BE90C1FBCF6735270132B59A636B16ED28111246270AF32EA2CB7A42A084005AEBB6161002E65B37217361BC269F5ED12F7D50613C82934A6D1D98D1308AC82827B7504F3FD351E0ACA1C62843C9219023FD092692BA4B83BE198EA - -count = 43 -seed = 38FFDE9B60DEDB5BBFAD6C52AA02EF6D49369BF276C99E588D796A4F260E0FF0A65C96C35863BAACFFD9B212EC305E7F -mlen = 1452 -msg = ECA4505D43235F274D902464F4E763312BD11060F908621A063409EB42FAA6BB5E20FACD87B8FF41767C20F69B1F7E05D5F3A957F48DEA57DCC91824FA48DA6DDBDE7E3327A0A8D46A47606EDA01E67CEA1F29BDC5FBA446DE60541DBED6F73D1FC5F49BD77D45285D3D8CA93F6DF25AEEF9324BEDB40E800ACB49794AB05E6D0AEB11A5994FBA36DABB9559CD93CF522174061C116CF31874A18C46689FB8C075079DFAF73EA0EA7FAADD47AD8EF68C06AF9738B41BE771020FEDB79CA3D0165427B58E547105FCF82A12B67579D1D3AAB29968817068732CDBC5A2E9E8D55D17468D03F38D564F5AC6EFE1538E4A680E9E15E35AB54D07B6B58EC9EA7815CCF29F4F880CBF1946F39556BDC2BBC78A5134FA7A086DDC146AD9D503A4CA837E0823BF0728453F6B053788C69EFF8D11ACDF5F07282A75CBD17F2AED58E39D862FF056DF17178625234CA7E03D22AAAFC4C07E3FB08F4297B511B10579934D2761FBB600C9454AC05FFF80CFB93DE3B9E0DDD0AB1E494DE477DA2B5635E48D5BED5CE359E66A3AC845826BE2B4BBFA6D825373BB2A4E93AA417648D1CEA755AA4978784D6D9489F6738B4DA03FAEDC659408D9395C934AF774749A498B1406522351F86838865F53CB0157247484FD37EA59BA72FF3226AFF1EEE353ABD34DDD63FCC89387B947027E04A6F4ECCA1EE5F6BD1CA758AA4F796FE839338164B58D8E5D71E6D5CDEEF6B279EF15A7BAD873B12F7C5B3E2817C37BF00802D2534D425D52D0BD5935BF8658E5BD39B5268CC45D0F27CEE5A57300F497E77AF5268970782030E6928281379CB14BB56D2ACD963D189C078C7A60E98A782F9483ECE7B4871A061277186A01E878087381704BD72C63C32CBF2470A561C22A5DD3A1988B7ED0D274182E1B075AF277920B362D612DC7ED82057EBFE51A3CA5A9A9A45DE015C460BE6A48CF67C820813048A1CEA0FC3D7307F802B4FB7E523E7C8555FA56DCF66237F176D3D973C47F55AF93FC4BC92B98B7DE89829B1471DFF53B649CB03B719DB58DAF824DAA2DE570DF6314DCAF5B705557F9D783559277A754F3CD5B783D5A577EBE4A065D320284B01F71540F1986BCD443CF4FD480DBE06EF7710387CB5185DEACB5C2A612BCA275950B8988F247C4B773D8983D87F47D60F5BF80E6E7BAEDEB14B5FFBC46893A81C63F99F511D3E24FA8F7B1BA66A7DB0C1D9ACC6B5010AD725BDC2282D8A24018C975C8B12ED3326F48194D4FF93EBF051204CD224EA39F27D63FE07CFD0162358B412DBFD4715AD049EE5A31638D3111AF2DB7952F3A973646612712A607EA35826249D14CBDE4380D8BC986067B1CC27503449FB128767986A406585C3D40DACA75C27BD36117D2487BAE82CF639ED1FA016ADD279D109B8CDAE59EB31E1F006CB7AF000A267E8582E55375CF6F06D1A47BE9BFA21C8428045B9DF96808AD74D054820A4D0873257EB318A3DC9B6D9585D973E26D435345B4D699A952C3092EEDDD975FB59474212080D03EC489C695F19CBA4D1CAB1AE8D2E2C730B06E657D33722D24222FF7B613B6E8608E8A6003E11C80239FF431B5D8FA52B84B867A581798833590524C7B84EAF6CDA9CA94C5AB8EF55A1262EEC5C37467807C89FF7D075606A3902E7247E9C6646839C18493584D33DB65D6DFC0F23E68C9D13FD57FAF4836C28926693DC3EE372DE27A9D3E4AB4229425EF48CC410F1792A51C9F6FA5316A1D9A7C99979884EF350B4882F6045921CA88D4E44B435C69C1AAC11660971C2A3F6480C79E6E146C0B5CD2371BF5E7486AD7D0BE88D62A2AE8F0D73C17CBAC86FF6BDA55A880B182A5237498E9CB343A9CD82D7784B72473D222E688D13CB81B2908BBA854B9624A11DBE8CEE9C3825C1BFBA476B4D23D0B0C325F1C498A65A3589EA8E8DF8DD9030B279EDE30443CF80367CEEA4A122DC8329E5AD42491CF57EF47AE2B15F9C54120966B95ACD727A4A2B686B00626BC808F43D82D20DEEBCA79B074A7BFF38D2531AB2F726AC7087236EB3FB4BEC8A2D4207DC84C -pk = 11484B2EBF62D5E01D7DCD1B00DF62CEB104BAB484CA2C2314350F95678DA611D8224D9917BA3FCD435A415CDFC35A0258B077E8D4DFA7502E2AE8BE31C70B878317EBA517CCA35E04B47D21DF79FA481E0EE58473637A3AE3C04ABEEF1D1100 -sk = 11484B2EBF62D5E01D7DCD1B00DF62CEB104BAB484CA2C2314350F95678DA611D8224D9917BA3FCD435A415CDFC35A0258B077E8D4DFA7502E2AE8BE31C70B878317EBA517CCA35E04B47D21DF79FA481E0EE58473637A3AE3C04ABEEF1D11000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A677DCA866D471CF686A4EF3714C145D62EB86FBFF5B958B9C8937388ACA019DF7D44B626EC1A8B639A9A384A851BF9EDB7885DFEBC96E09E9D8BA11AEFA33632236EAFFFFFFFFFFFFFFF98A300DB81B23C47E466A8AE727530B14A35B38CFCE059A056C48C11B44B30F0E7531930A2F4F43F1B2F0460A90FC07BC9294955CF6DFD922DCDD67BAA4C86005CD0D000000000000005775C2F34C8592FC0B2CAA35CE318C701F971636085A98F9189452B27A1A2EEB1FB7F3CBD0D7A17604DB3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE758C658F897755F4A7140426B8199B1B6E56831B3BAF81F0E0CA090DAD45F0FF4A1F3DDA951F247C8C4101000000000000000000000000000000000000000000000000000000000000A79EAE15A3B232F7C359DE88E275383AF598E8032BA07E96AE5004969BD111DCE02F6ECD907124590D6C9CEF81796C032BED09E5188E0222DB0B79473D055970C34ED0950E04946606FCAFADA0A564641048A8836242FBC5BBAC7E3C7750FB01DA1F555AABE2FA108A6C8FA17790A78EE44C4294738BD0FDF84D57F61C90DBB869667A134EFEE9B9A16BF299CECEDB03CB94C00318E187D1BDD9E0BA479754AAC18A7BF9BDB81F73E283025E671D744B1E993AB916086BA316B9F7C78FE3680098AC70DEB00875C62951637D98A0F31A10DE9898759DC52D97F9D5CD0FE54702B5395B90ADF5B09B6B644AFA2ECB24038FC511B88F1E58373EEF6901364C8D0D24DB17076E9FEB7B5CE09C53C4C1D8BE5187B7D0F24B814068CDF0CD08C381037C92302EF36628252812D5E573F6423AA0D446EFCC803B0E2633E7FEC34E242A33F034D3E96CA67A6A5749F7D3A92E00E23BA74C0E2F23BD3D85F16E98D2FCC7F8A51BEF938645AAA858391734B48BA269F6D799EE5C5178A4B1D4A27C832E011F44E097B6D0BF22FF596C906D85F254C2C661DA21A33A7D73F7F5849CD957CC9F8A517D1B8D5B6FEFBF93B125B6E801897C769EC6D1BA21075085017778515D8D93DDEDA0E64DD309C7817D666BEA47CB721352B65D926ED8E6D8FB437B0B02F6DE0B815607EBD0B4C09AA65EBFF7E26EB39C43167A90220AAACDB597FB2F03CAB4ABBA58EA87666C061B8B0E5F1A003402B6C262F196EAF421D0713B83A1243FF851B9D9B17AE144EB9E47DF136FB0F54AE2F101A24BE9B984597CB757CC0164D0DFEE598427A3099D2AB56CF8D89A4841A12F2572CC6249E25BAC4EFCA522390826D328A7A91241EC44E79E0B5A01F796D825EF6F2EF679F435567E9E40163E1758E86A50CB2EA658F5EE0BA7F2CF4E238536B587B0A2E7203DE5C5BF9C02 -smlen = 1715 -sm = 1695B64C71BE6EA964D7C5C001F05B4F85F3C5168A0D4B311701C272DEB77F87B4F1B61280F0018CC237355776C85B5EF8C9DA00FE7278BA199C176ACD1683410028190445FA02A1C4CFF4110E01A68B12962E3D15DFD3B1D3C3005F4627AFEDE55A25E7C851220118BB9F324290B96B7AE788C7006B9D08B7560CBB021AE8EED300C3972AAF94A61BA9DA81760F01175D7ABE37373DF93D185B93019D818CA49E2E10EB664487D6003D090887C0509928E570E3E9014BACB633C5D451F4FDA6111A00688746393A647198160F86600001CF22DDB54D14D7CDB5B34AA8B65A5F625D5D58EF201E2AD1420B02781E37D54A8C84C69F2E3B1700F02DAC8AC504FDEE86AD41AEA206ECA4505D43235F274D902464F4E763312BD11060F908621A063409EB42FAA6BB5E20FACD87B8FF41767C20F69B1F7E05D5F3A957F48DEA57DCC91824FA48DA6DDBDE7E3327A0A8D46A47606EDA01E67CEA1F29BDC5FBA446DE60541DBED6F73D1FC5F49BD77D45285D3D8CA93F6DF25AEEF9324BEDB40E800ACB49794AB05E6D0AEB11A5994FBA36DABB9559CD93CF522174061C116CF31874A18C46689FB8C075079DFAF73EA0EA7FAADD47AD8EF68C06AF9738B41BE771020FEDB79CA3D0165427B58E547105FCF82A12B67579D1D3AAB29968817068732CDBC5A2E9E8D55D17468D03F38D564F5AC6EFE1538E4A680E9E15E35AB54D07B6B58EC9EA7815CCF29F4F880CBF1946F39556BDC2BBC78A5134FA7A086DDC146AD9D503A4CA837E0823BF0728453F6B053788C69EFF8D11ACDF5F07282A75CBD17F2AED58E39D862FF056DF17178625234CA7E03D22AAAFC4C07E3FB08F4297B511B10579934D2761FBB600C9454AC05FFF80CFB93DE3B9E0DDD0AB1E494DE477DA2B5635E48D5BED5CE359E66A3AC845826BE2B4BBFA6D825373BB2A4E93AA417648D1CEA755AA4978784D6D9489F6738B4DA03FAEDC659408D9395C934AF774749A498B1406522351F86838865F53CB0157247484FD37EA59BA72FF3226AFF1EEE353ABD34DDD63FCC89387B947027E04A6F4ECCA1EE5F6BD1CA758AA4F796FE839338164B58D8E5D71E6D5CDEEF6B279EF15A7BAD873B12F7C5B3E2817C37BF00802D2534D425D52D0BD5935BF8658E5BD39B5268CC45D0F27CEE5A57300F497E77AF5268970782030E6928281379CB14BB56D2ACD963D189C078C7A60E98A782F9483ECE7B4871A061277186A01E878087381704BD72C63C32CBF2470A561C22A5DD3A1988B7ED0D274182E1B075AF277920B362D612DC7ED82057EBFE51A3CA5A9A9A45DE015C460BE6A48CF67C820813048A1CEA0FC3D7307F802B4FB7E523E7C8555FA56DCF66237F176D3D973C47F55AF93FC4BC92B98B7DE89829B1471DFF53B649CB03B719DB58DAF824DAA2DE570DF6314DCAF5B705557F9D783559277A754F3CD5B783D5A577EBE4A065D320284B01F71540F1986BCD443CF4FD480DBE06EF7710387CB5185DEACB5C2A612BCA275950B8988F247C4B773D8983D87F47D60F5BF80E6E7BAEDEB14B5FFBC46893A81C63F99F511D3E24FA8F7B1BA66A7DB0C1D9ACC6B5010AD725BDC2282D8A24018C975C8B12ED3326F48194D4FF93EBF051204CD224EA39F27D63FE07CFD0162358B412DBFD4715AD049EE5A31638D3111AF2DB7952F3A973646612712A607EA35826249D14CBDE4380D8BC986067B1CC27503449FB128767986A406585C3D40DACA75C27BD36117D2487BAE82CF639ED1FA016ADD279D109B8CDAE59EB31E1F006CB7AF000A267E8582E55375CF6F06D1A47BE9BFA21C8428045B9DF96808AD74D054820A4D0873257EB318A3DC9B6D9585D973E26D435345B4D699A952C3092EEDDD975FB59474212080D03EC489C695F19CBA4D1CAB1AE8D2E2C730B06E657D33722D24222FF7B613B6E8608E8A6003E11C80239FF431B5D8FA52B84B867A581798833590524C7B84EAF6CDA9CA94C5AB8EF55A1262EEC5C37467807C89FF7D075606A3902E7247E9C6646839C18493584D33DB65D6DFC0F23E68C9D13FD57FAF4836C28926693DC3EE372DE27A9D3E4AB4229425EF48CC410F1792A51C9F6FA5316A1D9A7C99979884EF350B4882F6045921CA88D4E44B435C69C1AAC11660971C2A3F6480C79E6E146C0B5CD2371BF5E7486AD7D0BE88D62A2AE8F0D73C17CBAC86FF6BDA55A880B182A5237498E9CB343A9CD82D7784B72473D222E688D13CB81B2908BBA854B9624A11DBE8CEE9C3825C1BFBA476B4D23D0B0C325F1C498A65A3589EA8E8DF8DD9030B279EDE30443CF80367CEEA4A122DC8329E5AD42491CF57EF47AE2B15F9C54120966B95ACD727A4A2B686B00626BC808F43D82D20DEEBCA79B074A7BFF38D2531AB2F726AC7087236EB3FB4BEC8A2D4207DC84C - -count = 44 -seed = ACC98B16DCC9A50EF57F332D66255CA56C2BB679CAE705B4297F1418DA845861448DA6CC5CC458DE6C6E96128EEB2898 -mlen = 1485 -msg = 96E2865A0E602EA4E3C5657A7F761A6F771007989FF885261F5638C14C1BF80AADE34CB956D2B5FA1CE38FDE831423201D3692E8E6F40E68A68C085DBE3C4CD8E35394F74072F44DE98A74E42C9176A86AC06BED8C0CA937DB4C3BF92371106B7A68EA8FDE1D1E082CCF522A397401AD0F8DA6C82BF76EAB8AFE101C7FF023A0FCF015B40ADA0073363E7CB25260C18662D651222A4CCF1B290EE6F7B111B9A963211D67D7674B499449F760352FEEB9FB7265A5F2F7F20C0174802C7F48226D92620D3E009E85B104230C21BA2FB0012DAC4BDF9FD184E09CB3E593EB1F3EEB418A8BF3173E6CB91FD8080C7E80DBE6730833A4A9F22C52716731C7CEA4F70CDE0F81D2D9AAFB6B60820598A7F6AA1B963B7686528E6E7885AE085C3D26C4ACBF9FC15080D972CA841175B343E59FED79AE3CB4DBB4F0D7D463BD3E0C4B2090139145B8D7DB5DB10ABFA51DC909C5CF7809030D72A5090CDC765EECADE2B365F719127548CA601AE0D21E402E18050ACAED30EE13CDDADACC9373A87A218787B585319A7E66FBB13851F7AD0D2BBC1EFE6EFE4F7ED248D844F58B6A5A21FA9295E0044982AF6286DE296550F72B5E416373F1DAC006687DED1E7D40961E5177C207579F25E77BE808A6BA33DCE8A2A6F88E97AE98ECFBEE5296D4A170E3574D9BA592A384CB0545BCFC32B3831C0B736AB77440722299F192DCAD519523995F71F2983BA87AAD2261E6E01C19DCCAE00F8D6914501D1AC3D4AFF0C12FA125ECDCA34DCDD8407F0045F8E8BE0763E19EB007ED4DAE36E30AFB07F8DAA7431B72F4A0A8017B3FDE27123AC3E8EE575F8BE310F68F81B696DB1FE63CCB8D32B899B209B2205956D209BD6E48166BBB4372A607E83C47698DB5AC8F9B40D05F38EFC4A4A1309D999D5CE1E1A5828D56EDA4666995897C8E6362D0B5054F04BCCF79D03852D1003C80CCD55E9F4578D8BB2C8E220A4D7A4E2190024C85C718654CCF174AC96C1BC50EA49F961EE7697C88E6BB718679F1D1F1118376B31A4B8C0471F6D7AEFC5AB426515D1B2CF0EAE66246B3C4132A63C63D7E33EB9DF8D8807215D58F46EE832AD3EC893D74E00C73510B9625F62D4EB5B500EECDBC7D088D3D318077A4A0F7D64ADB13220232C08DA75D23CA7B20CB109C972B7C159863991C32508339558B9383DDFE7E7DDA740E5BED0EBD14ED300C634DB01F359F81A7133669183EB187C17A2C8AB855BFCE73E34A1F59ADB0EC39EC0C7573AD3620A819333EE79D5E09CB8449F91923EF4C5E21549EB7F56075C014E1C3AD2805E682F07BA8AA265745CB600A460069678745FB9638F6709D62D2DAD8DEFDD5A4D0C2AE7401292BD1DA5F40D4CF5D59A403932FFB677237AD74691CAE29FA31B955172EFC5E83C225F2DC0430AB0C909A97BFB468AE182ECF91E9026DE819F3440FBE69B9DE26F812FF3F3CE8037F124AB368B1153C1CC127D140F754C525D4799E1A19D93B90460E6518F0B6936DC6310B7E9E6534B595E00225978214EE5AEB12A6F45B5C73FE86771818843FF7A6B88379C37165D9DAD48AFFD6FBABD11B1FB90AA5A78918B317C5F9B2CED6B9647F130DA9F91E1B1CEB84F6E1618248F06D654E159F71033072F1517064BD96A5C138402771ABE7F39F53A798C2423B748EB7F310485D6376722E204FA33B9740E7FA68364289A677C5C78A19A7707D2549BF9329334478C64351FEA1634388ACD4BE57E4ABE9374A0E999B770CD81B1BF4A8FF300C297B116CEDA1A4A1C1BD5A2275581A0589A46142139FC596A1406D16293076527CDF9AEA2D0919F9678423B7D95B153DD1D9D62B72A12F6491A36604D19E7BB83C476D232769425557D3480623D40B7AC27C0F67D4ED5CA4D487BE915A68352DCB03A3929A4BB795248EBE2FBE0612833D9305A0A31D195718BAC193FC59B880042A7F61358104A919C7E7C210F02A856B8B1057DD8527FD4AE1EA81F9E1BF7C614ED8A312C95154873F86632CBD60C65176F13CAC695BB4C23675331058397D6E96E4F9DEEB859E3937553D94BEDE3C2B9A5EBF00964A49AB294BCCEE09E5A97381D2375941AA775A47F726E9 -pk = C07501C20FAE425E98295740CB466F5259DBA03EE202FD52B48D8BA8661088ACB5105FC5319A4FB5DA6A5D5317061001BA84AE7079EF3E8CD49C0063642230D75FE14A97F019696187169ED28C9519EA9D9FB05D24B0A89B8A4D3E694EE95E03 -sk = C07501C20FAE425E98295740CB466F5259DBA03EE202FD52B48D8BA8661088ACB5105FC5319A4FB5DA6A5D5317061001BA84AE7079EF3E8CD49C0063642230D75FE14A97F019696187169ED28C9519EA9D9FB05D24B0A89B8A4D3E694EE95E030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000923F39884833C82E1AD88C1DDB3174D4332D9A5234D6A03F712DE4C9884612C205740AE371457DFCF4F261F127C0796B8509AFBE0A29627679A2A4DFF5E7E5A2E296F6FFFFFFFFFFFFFFD9B6FD515FFB89CADDAD6C5D1E2F0B1685197018FE29E2D732F03D71A43513AD5B7C3FEAB9EBEA0A93987416CB893964522BC9E68BA9644A56D6D8CC1EC3A03390AED9FFFFFFFFFFFFFFD977ABA68092B3366A86D4E1DAA6F6C5313A61D6DEEFABA8B8A0D6D5EC0EF2878EE7FC85A3FB6CA8CDF0CDFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEB842F173F5AA217D3B6C731273CC0D9FE3B371466B94AC3C919539F3F796BB872017B572A0EA77CF1135000000000000000000000000000000000000000000000000000000000000003F0CB59BE30A393D381F1DA0F8D6B0F466124F1A2CABC741EEA913876468CCE3A8F4331DF7225C9035D644FDD3ABC20217B39AFF5A1D15AF13C4FED52B5CD2988542C6216F92DD07ECE8B7367DC5F179265D2E062F36A481CA64DDB85E1DA9039DFAE8E77E21A4D232AA92DDE7EC2EFCEDEC6E54591CCC4B675935D629A562D236B9E1C5605C3643ED0EA2DBA4B783018FC65EC4A649EC4F79E262A4B4C661D9CFB75811BE6479DB3FE6DBE74F38E4FBD81D049463E3BFCEBF5E17389DA73E01876CFA9B8AA6D7BF8731B2FE7CA0904EEB94FD6F1E27A7EA2D66C40868320E403657534EB0970C2EDBCD3E987F673A0018C7299343186E06ABB9ECCD1141858B1574C38FA760D4535DD48D11B19DAA475D274966C6BB0FAFAF574AA6C9D4EC003EB5DC58C8B335410760BE9AE9D00414EB6F4EFA4CA739C080315E3BE6108B53B0DA09EC48B32C2059AE3A4C237E330313E6762660CDC8E7BEA54D0AA219F853357AA7AA351E9314A8266C92E0EA7C303CA1D9A7080DE30AD9F9E5F1353B2902B19796F51B1989B0B18FE351EDBED75A2FC4074DD0D43C43803C9295BAECBB6FADAB7C2504C3C4BD4682F29D07E07B03D47B93F0059D331C9F9481BEF7567831327A7A8712634967939991C66482382A260E6C1832E218CAD116BB9E11B38402BFC29AAEB8DE4550453E63047DB419B09218E9A156F411179455B685DA2B58A498252FD2F9A9E44DBFFDDA8118C718020AC27169880DDD8C1816326ECAC72A40146167C97357E2611B12E5A5A4133EC2A244CB2CAA7F9C8C4C3680677654A8017AF127517EEC5A76E109406B0DC1823AB066551D287C495E2B16F55A8372D3AE625A39834CF385CA93AC302F9CD47203C9731FFD978B127E96DE9AFBAC4F375702CA5E68276407AE9E8AD0F0551C250C87707D2BD4478A365FD62FCA980EAC03 -smlen = 1748 -sm = E28E451128940BEF0DAE68B500C4FA40E5AD7538587957DE6C0013D4AA76CCF23399D380F7FB013AA50B8CFB987F039818013D01F77B2D34911ACF19C37E9B9501BB7E76FD8290187C061463EF00CB2A8369C6A12ED6496E318901866731C5AF96D5500CFF4A5901E35D83295AA8DD307AAB639900F3CB54F8DBB18FBCC80BDA86009B7A8445095455347875BAAA0059FBC557C62B0790C3C09DDE01B6A6A50958C08CAD2A3686360077FF06F03CB4E3D7D5CDF1710163D69CF406C9F7B99F1C752801F936C4F888ECB7F517AFAEF00000C5EFF8D87AF5425778835B15D906259ED5E2C8BDAFC59299CF1201F82259517F289F1024AD7F0E0111597B4F791FAF9D5500D6D5440B96E2865A0E602EA4E3C5657A7F761A6F771007989FF885261F5638C14C1BF80AADE34CB956D2B5FA1CE38FDE831423201D3692E8E6F40E68A68C085DBE3C4CD8E35394F74072F44DE98A74E42C9176A86AC06BED8C0CA937DB4C3BF92371106B7A68EA8FDE1D1E082CCF522A397401AD0F8DA6C82BF76EAB8AFE101C7FF023A0FCF015B40ADA0073363E7CB25260C18662D651222A4CCF1B290EE6F7B111B9A963211D67D7674B499449F760352FEEB9FB7265A5F2F7F20C0174802C7F48226D92620D3E009E85B104230C21BA2FB0012DAC4BDF9FD184E09CB3E593EB1F3EEB418A8BF3173E6CB91FD8080C7E80DBE6730833A4A9F22C52716731C7CEA4F70CDE0F81D2D9AAFB6B60820598A7F6AA1B963B7686528E6E7885AE085C3D26C4ACBF9FC15080D972CA841175B343E59FED79AE3CB4DBB4F0D7D463BD3E0C4B2090139145B8D7DB5DB10ABFA51DC909C5CF7809030D72A5090CDC765EECADE2B365F719127548CA601AE0D21E402E18050ACAED30EE13CDDADACC9373A87A218787B585319A7E66FBB13851F7AD0D2BBC1EFE6EFE4F7ED248D844F58B6A5A21FA9295E0044982AF6286DE296550F72B5E416373F1DAC006687DED1E7D40961E5177C207579F25E77BE808A6BA33DCE8A2A6F88E97AE98ECFBEE5296D4A170E3574D9BA592A384CB0545BCFC32B3831C0B736AB77440722299F192DCAD519523995F71F2983BA87AAD2261E6E01C19DCCAE00F8D6914501D1AC3D4AFF0C12FA125ECDCA34DCDD8407F0045F8E8BE0763E19EB007ED4DAE36E30AFB07F8DAA7431B72F4A0A8017B3FDE27123AC3E8EE575F8BE310F68F81B696DB1FE63CCB8D32B899B209B2205956D209BD6E48166BBB4372A607E83C47698DB5AC8F9B40D05F38EFC4A4A1309D999D5CE1E1A5828D56EDA4666995897C8E6362D0B5054F04BCCF79D03852D1003C80CCD55E9F4578D8BB2C8E220A4D7A4E2190024C85C718654CCF174AC96C1BC50EA49F961EE7697C88E6BB718679F1D1F1118376B31A4B8C0471F6D7AEFC5AB426515D1B2CF0EAE66246B3C4132A63C63D7E33EB9DF8D8807215D58F46EE832AD3EC893D74E00C73510B9625F62D4EB5B500EECDBC7D088D3D318077A4A0F7D64ADB13220232C08DA75D23CA7B20CB109C972B7C159863991C32508339558B9383DDFE7E7DDA740E5BED0EBD14ED300C634DB01F359F81A7133669183EB187C17A2C8AB855BFCE73E34A1F59ADB0EC39EC0C7573AD3620A819333EE79D5E09CB8449F91923EF4C5E21549EB7F56075C014E1C3AD2805E682F07BA8AA265745CB600A460069678745FB9638F6709D62D2DAD8DEFDD5A4D0C2AE7401292BD1DA5F40D4CF5D59A403932FFB677237AD74691CAE29FA31B955172EFC5E83C225F2DC0430AB0C909A97BFB468AE182ECF91E9026DE819F3440FBE69B9DE26F812FF3F3CE8037F124AB368B1153C1CC127D140F754C525D4799E1A19D93B90460E6518F0B6936DC6310B7E9E6534B595E00225978214EE5AEB12A6F45B5C73FE86771818843FF7A6B88379C37165D9DAD48AFFD6FBABD11B1FB90AA5A78918B317C5F9B2CED6B9647F130DA9F91E1B1CEB84F6E1618248F06D654E159F71033072F1517064BD96A5C138402771ABE7F39F53A798C2423B748EB7F310485D6376722E204FA33B9740E7FA68364289A677C5C78A19A7707D2549BF9329334478C64351FEA1634388ACD4BE57E4ABE9374A0E999B770CD81B1BF4A8FF300C297B116CEDA1A4A1C1BD5A2275581A0589A46142139FC596A1406D16293076527CDF9AEA2D0919F9678423B7D95B153DD1D9D62B72A12F6491A36604D19E7BB83C476D232769425557D3480623D40B7AC27C0F67D4ED5CA4D487BE915A68352DCB03A3929A4BB795248EBE2FBE0612833D9305A0A31D195718BAC193FC59B880042A7F61358104A919C7E7C210F02A856B8B1057DD8527FD4AE1EA81F9E1BF7C614ED8A312C95154873F86632CBD60C65176F13CAC695BB4C23675331058397D6E96E4F9DEEB859E3937553D94BEDE3C2B9A5EBF00964A49AB294BCCEE09E5A97381D2375941AA775A47F726E9 - -count = 45 -seed = 8BEA4E384E73C7E0B47381B3063334291A0F06D28DB61B5BF65B01D0A747722E0AA62B81AD46C00C8A5C31494E513836 -mlen = 1518 -msg = 047E2D484D798B3829CA6037D6C1588A2349DE09C5DDFBEC987652CFDA01454ED791DBFFA3D9DA13A35230ADBE1B39B042E3C70589658A03F75447C1CF3970DC10FE5A4A9E980F2A33B642B42E5E66E9AC4E7A56888FCD72913A79489B5B163BD37B8C3C8D242FFEB37D0C1ECE21034BE9E3685798C2EBC6B809DEFC02C6F0C2A3AD70EC0BAD12D57ADD63EC3584CA98E680267FA514B34DE4147C9D901B59914D49CE9E0F885855ED0CE7973F3307B675408F90B51C6A4D38A414D970EEC989CC7900D7723E19ACC4EF743F6D39EB1B563B8C13D42C0056B6C49732854925B606467F7BC662D17B924FC65E9C3CDC2AE73FF73040011A152B05ED7F96B2FF4CC39A22484AF72812EF02B08EF4DCB64C8936E74549AFDD5D876027FE2B431E61E52E8793888473F4C1E5C1BED2C4AEF8E5E300A735B302474FC6F54869984F1A62DAE29C7C9A0CCDECAA55FE137BA14B5C5C121E0C5EB33B035E01F3415529E0826B27498D7A71B0C086BACD140C02A5948AA54799D0DD0FFD384C7E68578247FA28D205B18ADAC94F7D3C8ACB7DAF71AEE347B577D97EE8E7E865CF4FC1C16640AD1E9D0192AA13AE81A71118408E145B6121ABB75B4BFFD1D403057D4AD5CC730452475A7F067690BB81E81E17BA8DBC31059969B20D387BA59CA8CE499E59A65C8583F29CD539F4F75DDCC68C7BBBC43C849802D8347143E2FE78C1AB6D7AB6BA9917301C88386B294AAC995C24AD680A8C3BDD7AEBEF21E84F5A1909A2D83A8DFE46A75F4B2B47614CD39BF3CA3460DE9BB5C37EB7349A17AB32214D031CE927806FA394470F407673B0CDC3D9A7E3749F09CA895D464A4269682CE6DDCB8FA0EC2F05372C73DC3D06FA6F58090EFBBC6D619A7A565D4EFE441AD7E018A7F5E1384B88EB4506FC54E0AB0A8B9EE3641760FFC08F6BDA78C12396473D1243BAAF6AE10316213115441C0B65C7E475B4E1578D066A47D9C6E92FA32D0F2C365FD15F5A2E88A81691F039DC642ECEDB6652D08ACBE64625B46083CE758FA96C142EB34477E065AEA04A45FF4FCC3E3D146ACD7041F5F7E4C6B26C8205BE7B66DB46DA55556CE02B48AF55A4710BB28B8CE102CB15C1A4AF59D9A17A2DDA6E2D1E96987F6AA9F4216D8D5E5CBFF7E2CB775E83A776063A4AAF937BF0EC84149EC1A7EE21F735D21625E85831B80DC11EBF04F30B13E3A7E4D4784C5F8C61C679E0B6863958F42ED31DEAFFB4C272A3731C1407445CA7673D225EB6509469DC6C1F0AF43EB00F18B3A210AA57D51169F2A9FC251BB338ED4E9DDB19282DCE871211D26482E13A8D533DEE00D36FF5CEA98DEA72D9F0B32DC398A3D5537A3373058FAAA3926C127A1EC739FAF3D57CC1A05D578074A3A72C3F2B1692C2BA1F1FFED943E7BFCBF1E664C4F52F7BF8D86174CA8910C290C06804A7748DB21008AC43E653D7FD7E0C982EDA9356F68DDEC26473956DFF281F7B767010C57F4AD09A05063A6B3CE078DD32F3DE1F40526C06A2D60E36E2C70502D5BEBFD2F3BFCACF8720CDE1657B9892406BAA3DF01E59313EB655B6A545331EBA01BCDB9C99E4AD7FEF7438AE8715FBE589A2F99CB9CA34B9610B3CE5BE38FCF979240698174348417420AAB069B8AD5F646F82958A136DC9F2F81E601056BB4AB5E10F4EBC4A00E18924C51D0FD104078471C6805C49D92C78C832EC3F10D8966E19ADD3D3B4516E12DAF4F63FE6BBD228062DB743D1F867800854F7BB7FFC2CAA0D01A0BB683E368673A8E664BBAA17A8C0C04BCFF05246F9C4F3020510A992EF26FD0933BBFDE9D042862DFFD33A6465F590A2287D8154777A89724FC3DF9F2F1B1ED8765E7C7B761CA4781006822065703ADE07A6E874E70928E1ABA29EE490690D24F6E73D96B85FB53ABFD1C1FDE439279E08FA232043B2344B267CFE5901C60E7CA14B0C85EDCFA2AB90F341821D2B4E25FE23129F2432DB932F23B5957706A433B308FB918D1C8D81EEB399BABE95E7229AD41F30460CF28671A4508B0BD1C61F48CDC23587BB9BDC6F565E76C86547CB71396661BEC8C7FC2223751F765C91C45C674C36B49AEDEF3DF2537F888904B507EDCD89155D40CB81DDA74376BC9CDCAFF8A368F1086C99EDE25526BC53F95F4017 -pk = FEAB1D7143B33F90CA9A6BF64BE0FCE2A8D478147801C386383D8FFC81DBBF0439D37AA7CE963322AD4F5B79C2DC4A0228D381D66DD6F0068CAD9058154216DA2F8CB50EA4C43FE01D2CC6EF73E183408B69BF770475E3EA6AB989E1DDF9BA00 -sk = FEAB1D7143B33F90CA9A6BF64BE0FCE2A8D478147801C386383D8FFC81DBBF0439D37AA7CE963322AD4F5B79C2DC4A0228D381D66DD6F0068CAD9058154216DA2F8CB50EA4C43FE01D2CC6EF73E183408B69BF770475E3EA6AB989E1DDF9BA000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000646AA84BB2E09FF9A3213DBB3BF91F7ED18388D6D9F8A0E334A85D9799917A7ED9932F4C4D88C83AD778CF6FD34283B95EF295CB3940DDA6517E7F5354DFEAF2F3851800000000000000A9C0F2FF7543CF51D257EA899909B9178168F603C44DF547DF0BEF66823339BF4A25E872AA01E9AE39F8F5BAE983E776A7196FB2204C71DC7CF46E14B3693F70E5F5E0FFFFFFFFFFFFFFB179A4F95CD1011F69F6821A0C0109894EE9885D92900801187D96579C1E41AD73C396ACDB1ED15AA64AFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68EB66B060D5F7BFCBBC0D99224400448424C6F558895E23B82A417257B17293797B85837687E33F9B0FFF0000000000000000000000000000000000000000000000000000000000000060AF975B984B6EDFE56438CD49B92A77B7AC16A1873A22016D4B8F8B2162338F0A1B5059398DE5722CA84FC590FCD603708B2ECB73C030205F32EAEA59D8DDEA1A29CB716C97FAE23D1D341A4F8D9B6A9A14C79E09D8C1A55E6CA7597C591803E9BEF2B1FA1DEEB6B356E19E3D419D371602FA98C34E3B9D3A7BC6B47212FFA1F39DF263617AAE16B4B88EA9E7ACEA023B82BF34DF231029A078B24911BDD0BE8CCF5400D0973BEBA25E4454A5AC78213AA7CC2A578DDB7678D7C1F2AE5D5D006B31C5BDE54A0E73299EF4E7D914894BFF9485155D3C484206C774EC731385FAF256998781697BD33611F55B09A11F01D437A67D25E1A0A86EA62CD4795592A924F1ECF8DD15310F67982D43270C4CF3462805FE106CEABCF5C1699F94A28A030E03A5AA4EA472D927027DAA0D53883207E92BA14F8AB6EBEF35B299106BE16CCABE33FA74EE570151E1D31AC30B5D02393C5EDC0EF5AAE944212E71EBFBBA0E82E0E9630157AE585DB1227D1FF1329F071E7EB3514DB2373C6CAA6C2208B50244D43B403D4629481E2647754477AD36A7FD0B02EDC6BA8CD5683932912DD6ABCE95E3843245C22BCFBFD28CA7FAC400006A9A05E409D521993DF8F4DAD47B4E40F3C34E972C648D014BB1203569354EC9018448A1BAFCAFA6C6EE3120A74003046487993F521EC95544CBF157EDE0DE35A35D58A735184F8318DAA8E45EA83F4D589C85D8348FC818DA891B06CF5E031538C5E8A74063E6B6BCF4340B10879C925052D1F97D317B0804BFC96AB39C4771803F9904E87D6BBCDB06B5E6E13602962ED8F3464AB3EC47DB2A58DDD5F8F3BEEA71D5B509E3627AA14DFE9252248E9066D55DDAFF99DB1CEFD93449E223029D3384E1F702086E389E979BD65AF2C4F9358EFB0920D4C3B25965DD7E05E3AB3431F4E5318B766ABEB94BAC978EC202 -smlen = 1781 -sm = 9AA6E8A1DF75D8FF03CAEDCB00FB10C01E835F359442FB272500EBA17F06F57DDCA48CB17FEA012287A9D72F2FB03A8F1BA8B900D409141416838A51192E4787012443261D0743DFD55FD4962100A1E4B10EB065A7EE329AD2640009FE63F8AA3F754B8BE5050100B19DAFBA1ED8B78E71838E2D00B5D7F3B3BA778642A905929E01CCD6753B2751607D020F1A4C01709259B9B5C1C89E8C62DBB50074D163B92BEA19FE2F06D09301A7FD891CC473044398AEBE050074F88A50036040A1E490945300895F2996B4F2700335FBF56C0000FFB1BE6C834B3259706A5C38F384A12697B7BBCAF95ED33E3B1B0110C16D82FAF5DF2A145E094B0183B0A2005B373F19400940B19606047E2D484D798B3829CA6037D6C1588A2349DE09C5DDFBEC987652CFDA01454ED791DBFFA3D9DA13A35230ADBE1B39B042E3C70589658A03F75447C1CF3970DC10FE5A4A9E980F2A33B642B42E5E66E9AC4E7A56888FCD72913A79489B5B163BD37B8C3C8D242FFEB37D0C1ECE21034BE9E3685798C2EBC6B809DEFC02C6F0C2A3AD70EC0BAD12D57ADD63EC3584CA98E680267FA514B34DE4147C9D901B59914D49CE9E0F885855ED0CE7973F3307B675408F90B51C6A4D38A414D970EEC989CC7900D7723E19ACC4EF743F6D39EB1B563B8C13D42C0056B6C49732854925B606467F7BC662D17B924FC65E9C3CDC2AE73FF73040011A152B05ED7F96B2FF4CC39A22484AF72812EF02B08EF4DCB64C8936E74549AFDD5D876027FE2B431E61E52E8793888473F4C1E5C1BED2C4AEF8E5E300A735B302474FC6F54869984F1A62DAE29C7C9A0CCDECAA55FE137BA14B5C5C121E0C5EB33B035E01F3415529E0826B27498D7A71B0C086BACD140C02A5948AA54799D0DD0FFD384C7E68578247FA28D205B18ADAC94F7D3C8ACB7DAF71AEE347B577D97EE8E7E865CF4FC1C16640AD1E9D0192AA13AE81A71118408E145B6121ABB75B4BFFD1D403057D4AD5CC730452475A7F067690BB81E81E17BA8DBC31059969B20D387BA59CA8CE499E59A65C8583F29CD539F4F75DDCC68C7BBBC43C849802D8347143E2FE78C1AB6D7AB6BA9917301C88386B294AAC995C24AD680A8C3BDD7AEBEF21E84F5A1909A2D83A8DFE46A75F4B2B47614CD39BF3CA3460DE9BB5C37EB7349A17AB32214D031CE927806FA394470F407673B0CDC3D9A7E3749F09CA895D464A4269682CE6DDCB8FA0EC2F05372C73DC3D06FA6F58090EFBBC6D619A7A565D4EFE441AD7E018A7F5E1384B88EB4506FC54E0AB0A8B9EE3641760FFC08F6BDA78C12396473D1243BAAF6AE10316213115441C0B65C7E475B4E1578D066A47D9C6E92FA32D0F2C365FD15F5A2E88A81691F039DC642ECEDB6652D08ACBE64625B46083CE758FA96C142EB34477E065AEA04A45FF4FCC3E3D146ACD7041F5F7E4C6B26C8205BE7B66DB46DA55556CE02B48AF55A4710BB28B8CE102CB15C1A4AF59D9A17A2DDA6E2D1E96987F6AA9F4216D8D5E5CBFF7E2CB775E83A776063A4AAF937BF0EC84149EC1A7EE21F735D21625E85831B80DC11EBF04F30B13E3A7E4D4784C5F8C61C679E0B6863958F42ED31DEAFFB4C272A3731C1407445CA7673D225EB6509469DC6C1F0AF43EB00F18B3A210AA57D51169F2A9FC251BB338ED4E9DDB19282DCE871211D26482E13A8D533DEE00D36FF5CEA98DEA72D9F0B32DC398A3D5537A3373058FAAA3926C127A1EC739FAF3D57CC1A05D578074A3A72C3F2B1692C2BA1F1FFED943E7BFCBF1E664C4F52F7BF8D86174CA8910C290C06804A7748DB21008AC43E653D7FD7E0C982EDA9356F68DDEC26473956DFF281F7B767010C57F4AD09A05063A6B3CE078DD32F3DE1F40526C06A2D60E36E2C70502D5BEBFD2F3BFCACF8720CDE1657B9892406BAA3DF01E59313EB655B6A545331EBA01BCDB9C99E4AD7FEF7438AE8715FBE589A2F99CB9CA34B9610B3CE5BE38FCF979240698174348417420AAB069B8AD5F646F82958A136DC9F2F81E601056BB4AB5E10F4EBC4A00E18924C51D0FD104078471C6805C49D92C78C832EC3F10D8966E19ADD3D3B4516E12DAF4F63FE6BBD228062DB743D1F867800854F7BB7FFC2CAA0D01A0BB683E368673A8E664BBAA17A8C0C04BCFF05246F9C4F3020510A992EF26FD0933BBFDE9D042862DFFD33A6465F590A2287D8154777A89724FC3DF9F2F1B1ED8765E7C7B761CA4781006822065703ADE07A6E874E70928E1ABA29EE490690D24F6E73D96B85FB53ABFD1C1FDE439279E08FA232043B2344B267CFE5901C60E7CA14B0C85EDCFA2AB90F341821D2B4E25FE23129F2432DB932F23B5957706A433B308FB918D1C8D81EEB399BABE95E7229AD41F30460CF28671A4508B0BD1C61F48CDC23587BB9BDC6F565E76C86547CB71396661BEC8C7FC2223751F765C91C45C674C36B49AEDEF3DF2537F888904B507EDCD89155D40CB81DDA74376BC9CDCAFF8A368F1086C99EDE25526BC53F95F4017 - -count = 46 -seed = CFA713E4A63A6FFBA43BFB898956DC400507F68AD164C3D24A67B5F8D7548C9DB44DAA43E5E4A0990325A4233089318A -mlen = 1551 -msg = 6A58AA820275A2F43D0F05DD0EE484AF42B665FFB8F21DB322ABD256A5C753BC8FF6A2C71467922E09726655F1A7218E736752065C871221C0B9DEE6A9D56B78A1C3B7357774396F6980226DCA1F91BA828E06BBF324D5CCE8D584D9D298261C7149899FC9F74D501E920F22AA34706A79213E35914DBF57B9642A42EF0D8226E31ADF89D18C5F3163ADECC79172C95650D764E3729EDAA08C207D930C26DF8EE1291C1CF889283B70AF00C0489175F799273C837B281A5D1284E4447ED72598EFAE23B523274644DA19BC0359BA59E5BE9E5828FF587C335E136C1D789257864D2648EF9C03D1C4B9809DD07CEABD865254D3D8D597587D71E374FC2DDE89C22C2330E8904F6B53F637348434A21ACEAB9892D5DF8FF84CC58229782BED739BFB13448896F7B1064B499087F7547CFC0A49272C2A670A9431B1B5A07284B6749EF834510A3EC0C61A43D5D0EB48C8F487947C4FCCEFCC49DECCB6111D617407C76A1B4A849C9A190310711B102F142F9E9CBB29F46447265E2C8DDB9174B780EB4A51003FB68483A265F2475D5BF6ECE18AF0CF31BF24CDD56583E777C4340086917B78068DFD380466F43D020E285CEED97A467DB96BFAEC22D80B4A6EC0DBB98CFC44436A41CADC85A90B214F00990D7B7010BBE4AC94809A0450C9ABEE5AA4037A44B0B4DEBD264120E762086B8D6F17AFD37086C93A8A368BE97E0F7546AF16D731C21878063E38DF3DCF3ADE6DD2DAA43C198F49B5D9FF5362333F29EC2F13CBB90DBE4E703EDAE9A4F7334A1C5AC60D5972C4AF2BA61B63C93BF719854E615D16BA4F704C55260A8838679815FA59BE08C4243CACC1A584CC1B4E777FCDC6E5A167C4CC9093749ACE4836AE058BE89CCA3221A3F63F07089006E4C44E40653BF262945A640D8C2A24E7CC3529E4BE76286C86CA2089CB8D4684508D1FAB81EAE7D8C731B65A22700BF9009A3190F5ED837EC22F9112383422027AED838F16A7740CF79EC101865D320E380D4ABA745ACC8EED376DC5B3AABE58DEBC35F8E983C92906AA2E3D8FBBE237325302E2A23CB1312EA7F532D64E79B9815996D28E0183EB728A37E19CB219987576C142F4B2F66AC6C7C77028ED59A8DF27F78ACD3910DDFCEB88888B4A604E5D07AE1B53EA6DF6EC2163DDC4BAB422D2438FFA543B22441E50E4087FDE4BEE6D79D90A2F72548DDC41C5AE07DCC87666EA3C4B89A0B14AFE03B585E7CA507E5F29997F2368B0C68C6AB6E344C082BD06AE922CD8089634918D9132DF9CBD665A4149C59BF76B0E94F66481766FD79054AA80C02E0AE04A6E2BE090582171B2A9AF455CD9FC302CA9D1EC837EE26E0E4D0AC8F0692CB9ABAC979B58CA92E5194EBE46B520125BD0B3ED1AC2BD817D3510E33CFD17058F865DBC64E9B99352B6CAF10F0A5A47449BF927A8EBA06D34C80D77A0B00B88B25A4C8747AADBB11BA15ADF9C959B05C4371CD8439FE5028E004A2E1D2F21190466FC7FD56E9BA0599A0EEDD98246AEB4B85994787B7604CB52F5515B42C2FBD4B5E9E372A36CC4E66483DD884DFE42AAA5EE7FAB200D8EC6E3556DDE0F9E9C7346F9967F8F3CEBE1E4D1CD8E6046E5E94BBC74AD3D51DB0DC704F4A4025383F0391B9DA37BCA8EC59E807593A4F040FBB186607280967E5048CAB92215DC783D9045F7A0922008628C771778661E97E9F88EA84BDAA8BA61126F71D193A2A564E3ACDE7ADF2C0B3D5B022EB6E0C629782B0025C9079D4545D88AA2BA27D10C5DCBCFB7CF648939155066518878CC54A4F611AAC21BD3A1EC628D3352F049915FCA55234B9146ECE5F78FBE7CFFB35695363202EDB9EC3501A93B4B6FC81B3DFDB5245FEEC8AA54195262C2467E15506B7D42A7FF61D75998722D0208BBFEA05CE7D2E66900A9B34F44C2A21257C220C03F9D6D7F0312A36F5C12DA20FB5290D5CFBC1DEC7D05C44820885C479063CA88783C5AA128829417EC4DD41CF83A1D991DF2EFDFEFE375E93F0371695E353EF737F4A75106211A5F70C82B4F360ABCD078C9E829C82A6B7A36D22B8D1F6E3101BA009C759FC83999D52E29B387A8DC1658A43EC4C4D9330A4ED2138E035EBEAE6343A76A82849E37141FCE34E9A41EB5EF88BBB9257017AD8696C3847FD77AE103A082ED1A05DE9420984C147AFF927E1950244912079BDBE5CC07 -pk = A7B2625D4C4CDBEFB08B2C8F1F8FB440B2E1ED8768D848C7E1616BC068C535FC173CE7C39D25DAD657EE74216828D601286B9EEDEED252DC85139743137BB65BDF5E13A179A028AC1AC156AB6185D372B13A7CFB04815E8F6F4ABD7E667DEF00 -sk = A7B2625D4C4CDBEFB08B2C8F1F8FB440B2E1ED8768D848C7E1616BC068C535FC173CE7C39D25DAD657EE74216828D601286B9EEDEED252DC85139743137BB65BDF5E13A179A028AC1AC156AB6185D372B13A7CFB04815E8F6F4ABD7E667DEF000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D470B7D65ABE08F4DFD9FB21DE7E5FDCEA79D2605A36B13D6C1BFE12F471E984C280C961201B64ED453B817D34640A10B98C3596E64966E5B3829516A2ECAB029E181F00000000000000D19A76B2FC3F581D70ADDEE0CAEC902FCAE3EA5D85FF6F7E075002D88D16BB6A9197EBA2564C8E52E7D8CF997DE7B24B449463F06E494F2DD5B6DD1DA428EB9E8651ECFFFFFFFFFFFFFF27C1255167214B5A1B5AE038339C65935B989D4206B42417896681F324616A5FBCD057ADEE80ADEF35E4B10000000000000000000000000000000000000000000000000000000000000098B60ACFA525BFA7D2C04C1528BBD4148A0915F06D5E99B43B64FE55441942F63562EEF7EC7647225C0A59FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6BF623E3EFE3C20D71F2CC3A7931ACF253DD147C7531D994DF05A7B898BD5AC06391C6C06F42AA62592874219910C7020440E93EA229915C9C8CB6C51402C9926E0A8EB0A8CC06F9D1A6AC118741FC6090207FDD08DBD2A12869CCEE26EBD001C8F6912BBF11D3E57554ED25F1588FD699DC7EC2D7AF897143C87E48795898386630543511FF5A5D8C8A4BEC02468400B7ADC3206F701C6BC960969CB5C663FA549BD529260E804FC2DE17AA1B38D48C5F7D8965F56AF96501BFD2F46816EE01568F8D634DCADD262332782BB633783899693FE5889BD20C48B81A950F0F5B17A1A89B084EE0271B2861014D92BCE9018E89D78444DAE12FFBAC380CB7594CA9B3DE92EF94E4A7CADBA50639E897036C5649F6D380DF69C37AAB98AAB5C0B603E27D80F25131E3C2A32BD9FD147022C074887DEA5EC0B9FE0E62DDF318CC3EE9C8F2382F81DEA50E790AFF0F827632030FCE67B0D2D126B282AF30F3C4D0EB0D0CBE536F989F4824159B352E23FECDD4C28C9D6E9B3618E5913F3BECB8CF5D0345221C7F55A699DD80F37E28F0074C96088F6606DB8975886D7913A0FAF1E164A224C7A1CE370B9F1AB1C9B4BF25E002EF62251F728E3325D96ED344851AC3FEDAF013A3BCA78C84B4B064F4249717C571F3D49FE784BA0524DB8A515A637103808C03E89CE8307B225FB4853F4C3B94040F67DD69AB0740048C75D4C214D186D6EE4AB954721125C8F36DDCA508B3005B5BFCFF25746A102B0561D3E9F51194DE1D7633680C9381E6D887CEBCE38468D7D8CF34B0644EB88152A35BCA864302AC20651060253D0C3C1CAC86C56BB552696B5A752C957AB4EA9A6DEB010A680BC0730BD052977C807D0704D97109D4010177CFB30806E5C0145AD94B027A3C7B1F5033EFE58B80C3E7CCC914302B4E3F81BDA5550E6A4C906DD5C148B99A1303 -smlen = 1814 -sm = DC2BA004051D38C8AD9E5F9B00670DBD058339D7F983D1E44E0068893DEF3E93B17E37B649A801EB91515462E1B7D00AA63214014090704A95403C37AA864FCB01066E2DFBD4391F177B8C495300546C8A8D79CCD33A9E58E6AB01C18B0B9B94D2FC497575307200CF2715AF9B8866DB205C778101C67AC3A91A6AA358B4170EF801255E0F679B9E1F413C64175900BFA68C43A663FF7E8A4B028E00E22BF3A9C762459D75BAF82401602831B80E0D40962DD3E798002E14C41CD00AF2513F8380DE010BCFEC954DED1C59528102CF01019BC4A7A7F4A500C93F2E00D758CF97E36AB718934E84B3A221130325BEF5AE51E883BDC9FAAFB400AF82DB37E74DF202C7359CCF3E0C6A58AA820275A2F43D0F05DD0EE484AF42B665FFB8F21DB322ABD256A5C753BC8FF6A2C71467922E09726655F1A7218E736752065C871221C0B9DEE6A9D56B78A1C3B7357774396F6980226DCA1F91BA828E06BBF324D5CCE8D584D9D298261C7149899FC9F74D501E920F22AA34706A79213E35914DBF57B9642A42EF0D8226E31ADF89D18C5F3163ADECC79172C95650D764E3729EDAA08C207D930C26DF8EE1291C1CF889283B70AF00C0489175F799273C837B281A5D1284E4447ED72598EFAE23B523274644DA19BC0359BA59E5BE9E5828FF587C335E136C1D789257864D2648EF9C03D1C4B9809DD07CEABD865254D3D8D597587D71E374FC2DDE89C22C2330E8904F6B53F637348434A21ACEAB9892D5DF8FF84CC58229782BED739BFB13448896F7B1064B499087F7547CFC0A49272C2A670A9431B1B5A07284B6749EF834510A3EC0C61A43D5D0EB48C8F487947C4FCCEFCC49DECCB6111D617407C76A1B4A849C9A190310711B102F142F9E9CBB29F46447265E2C8DDB9174B780EB4A51003FB68483A265F2475D5BF6ECE18AF0CF31BF24CDD56583E777C4340086917B78068DFD380466F43D020E285CEED97A467DB96BFAEC22D80B4A6EC0DBB98CFC44436A41CADC85A90B214F00990D7B7010BBE4AC94809A0450C9ABEE5AA4037A44B0B4DEBD264120E762086B8D6F17AFD37086C93A8A368BE97E0F7546AF16D731C21878063E38DF3DCF3ADE6DD2DAA43C198F49B5D9FF5362333F29EC2F13CBB90DBE4E703EDAE9A4F7334A1C5AC60D5972C4AF2BA61B63C93BF719854E615D16BA4F704C55260A8838679815FA59BE08C4243CACC1A584CC1B4E777FCDC6E5A167C4CC9093749ACE4836AE058BE89CCA3221A3F63F07089006E4C44E40653BF262945A640D8C2A24E7CC3529E4BE76286C86CA2089CB8D4684508D1FAB81EAE7D8C731B65A22700BF9009A3190F5ED837EC22F9112383422027AED838F16A7740CF79EC101865D320E380D4ABA745ACC8EED376DC5B3AABE58DEBC35F8E983C92906AA2E3D8FBBE237325302E2A23CB1312EA7F532D64E79B9815996D28E0183EB728A37E19CB219987576C142F4B2F66AC6C7C77028ED59A8DF27F78ACD3910DDFCEB88888B4A604E5D07AE1B53EA6DF6EC2163DDC4BAB422D2438FFA543B22441E50E4087FDE4BEE6D79D90A2F72548DDC41C5AE07DCC87666EA3C4B89A0B14AFE03B585E7CA507E5F29997F2368B0C68C6AB6E344C082BD06AE922CD8089634918D9132DF9CBD665A4149C59BF76B0E94F66481766FD79054AA80C02E0AE04A6E2BE090582171B2A9AF455CD9FC302CA9D1EC837EE26E0E4D0AC8F0692CB9ABAC979B58CA92E5194EBE46B520125BD0B3ED1AC2BD817D3510E33CFD17058F865DBC64E9B99352B6CAF10F0A5A47449BF927A8EBA06D34C80D77A0B00B88B25A4C8747AADBB11BA15ADF9C959B05C4371CD8439FE5028E004A2E1D2F21190466FC7FD56E9BA0599A0EEDD98246AEB4B85994787B7604CB52F5515B42C2FBD4B5E9E372A36CC4E66483DD884DFE42AAA5EE7FAB200D8EC6E3556DDE0F9E9C7346F9967F8F3CEBE1E4D1CD8E6046E5E94BBC74AD3D51DB0DC704F4A4025383F0391B9DA37BCA8EC59E807593A4F040FBB186607280967E5048CAB92215DC783D9045F7A0922008628C771778661E97E9F88EA84BDAA8BA61126F71D193A2A564E3ACDE7ADF2C0B3D5B022EB6E0C629782B0025C9079D4545D88AA2BA27D10C5DCBCFB7CF648939155066518878CC54A4F611AAC21BD3A1EC628D3352F049915FCA55234B9146ECE5F78FBE7CFFB35695363202EDB9EC3501A93B4B6FC81B3DFDB5245FEEC8AA54195262C2467E15506B7D42A7FF61D75998722D0208BBFEA05CE7D2E66900A9B34F44C2A21257C220C03F9D6D7F0312A36F5C12DA20FB5290D5CFBC1DEC7D05C44820885C479063CA88783C5AA128829417EC4DD41CF83A1D991DF2EFDFEFE375E93F0371695E353EF737F4A75106211A5F70C82B4F360ABCD078C9E829C82A6B7A36D22B8D1F6E3101BA009C759FC83999D52E29B387A8DC1658A43EC4C4D9330A4ED2138E035EBEAE6343A76A82849E37141FCE34E9A41EB5EF88BBB9257017AD8696C3847FD77AE103A082ED1A05DE9420984C147AFF927E1950244912079BDBE5CC07 - -count = 47 -seed = 1F3193EBC58EF65E9E396D69220ADB8ADC729BB388A72CEC9028A094F1CBDED21CFB0C41356AF31E0CF66A3B0D843666 -mlen = 1584 -msg = 139BA17ED7B476DBB1CDFE3C42B3A57AF5BBCB3BE19ED04D6C3072FDFE917ECB9272D59EE89EF83522531D83AFF8B9934A8423315C350D1481A4B02980DC29E1CB83B76623869649AC40EF297B153B679C327BB251C6E6BC169C48ABA2A439F9EA24EF94656A415C3E86D7BCB43CB3717D54D773F1937DC8B0E02D4E6ABBB1C83FE73F1B221C9A359E454C19DE5E71EA4CB8C560EABF1DA133FF20D81785D2ECD935B99F24840761446C324DF81484C5C05045C0949DF8D0F10F942E1B5B79074B358C25B6EC2B0B42DF65D998B666CF1BC568E7D737F22FF541807BE95ED85A9980E940E24D2C506BB0F9BEE32EFFD85A2017DE694F61BCC2B292595C97FF4C2145E48AF8F0F3D71763B4DB433ED7BDB8DBF8643475FB2B9155F0CC6A0048C5546900792BC01EBA4B06C83A0C447EA0CF05410DE55ACB8E5521829C89BFBC084CD86E7CA3D701283B70F78E1CE9C3888AD2689E0EF5593D656285066F319E155F86C0A71256484F42A0C40E7CF13AF0CF77C6D1CC7231A48538E9060A7863B774C9CC65E321E45AACC002C0170EDDD18CC1424159D46BF99D08A28D2DEA8917D28D91A1D6C409D945A5EEA19413A1ADCA40DE9458FA6BDF1E5308EF9E67E1E90E9D92BF19B5351FC49DFF0A31E035038AAEC651C0F20F276E4EF0EE35C14BB625EB34205516D95ABEAA06A7A3BB3AF2F12236406689BFAB11E65FC63EBC5B944818DD1D53C0E7B88CE7AEBAE581D995AE7D8423778DFE20D6CEA7AC0B1B4EFE2B9D571DE77BD8F71E89D9F6A2DC89103B73625887AB376BD12CE89A65E6280515A44A80D6C32799669260167DA0A214AD0FB803930AB1952D93360B54433CE8220B29339DCF2702581E88952A5A1549DBA11F4CCDB6FEFD6D24522F3207796C8D5BA9D1582F888F2500964F2B975AED5D5AF83409FF9720EDCF5CE3FE9B6B586B08DE21956E7970D8DC28F6208A80F5378ECBC506333A1D98C58EB0E2EB0CDECE0F5D16A069FFD742D1E589F546C4F2EA3DA0A56F984CFD93F5F2912FB1D068F2BD7C1B5E979ABCC62E3A0164445398F5C0208E82B99AED1200D36289B1FDBBF03E43995341AED3AD712CC7C7530C751B40B765073EE4E4CDD411AE543AD5E2793F294320E9791AB35AE1697F23EBFA0280B8041859909B0089C101D7CC429408FABD2E073FCA7F2C2886031E9F6A32F2B596A799967BA8A47E87DCC8854D45DDB6DE39160600EB4235F4E3424D75DDC8CCF041AA05B25B5A3811540EA5B77CD8D7D611A63BEF5C26D57475B28E961645AEE0B9C8D47954FAF634017787A21A671493E7C5F1A4C553E0A68DDD726DB1DED4321DC735332FEFDF2A84C22097AB3552F878E304598EC40EB349E1C1AE416F94112A2CF8E8702A4C3BDE2F58245166550FC238E153D10F90652518B1D84CCD3ED836F150F1FF103976E743137DA5A97A61276DFB0C11D071B240069582265A9CAE4987B6C6B017DCD1594024D7B1336FF141E59936EC4CE5410E1B73BA6FB42D35F8999225CB1A135260967F4F6EF2172D53FA6AB6D1A2E3174B46C24BC103BAF69C2128F093AECEEBE8753EB352E2804EE64AE5140DF1ACDACD8F225B3C9A61264245B8E5CF759CDDD75E25E2D790FFAE8421515E0CD6F279D0080A3F80BB2E0729C0D2626B6ACE31CE20BCDA490C7660D04D1D82E6403000578926C52D8F9A4BE7103D64E0F03E8F148BB2236781EC30F6D8BC827C107FCC40F26DDAD485E6135BDC3BB331BE139A07891717B692E23312D0E5B1C41F30C3B4B4700EFFB481A835AB54340269FFF365FF87F58245621ACFD83B7FCC6FF108132D8966F9836544354F7E216FBBB851F390DCE8A72362F0454730B90D35AB3859763AEE35668310FD501C7501F4599563006AAEE9B636B676F3DBB6787317885B0F4A64171BF19CBF2EA7A625E1563032C196E1292D82C7484817DBF78D8E9E478FDC4C92CBEF48D4CB4F0E6DCDCA6682DC0A56C3E45EA0350D9FF88073748305FD7DF3A3BE8C055CB1C55167560D5C99345BA80C21CE791C4A511E384A02833B78E8AA02B1B877A9B8D806978519D716C611DF54AE8EA2691540E87C6E79EB006569E02745021BDC7852E1FA4177E2C3EC89257618B38719CB07B0BA68F600236167F019694959C2AB6FB39D5890CB176F6ACC3B9656E495C07027E3D4DE781F48C1F1A8AA1B41449689E191E495FF3F263DDAAA8DE0DF6F1A4AA3EF1F5EDFE437BB74BA -pk = 177591826BAD1B073E5B69A5A83410ACE58C26CCD4B183BE75FD328D0604C60FF2ED81B6259605C9187390AA451271011A8F2DAE49703E1687F9B4740249FD830846755F16D9E65ABA0097803B86CADC8E0F0D8E6FFA3FF05C343C64A359C803 -sk = 177591826BAD1B073E5B69A5A83410ACE58C26CCD4B183BE75FD328D0604C60FF2ED81B6259605C9187390AA451271011A8F2DAE49703E1687F9B4740249FD830846755F16D9E65ABA0097803B86CADC8E0F0D8E6FFA3FF05C343C64A359C803020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068EFFC0E03C3ED2EC246C66B16E2BA7869BA6F3095E459F70794EEEFF7306DE2C51F4ED8014930410D499EAB6311FFD05A598D9D80F26D3C2BA1FA2CA37326309C3F070000000000000031D69E90C90589825D803D93C2719C4007E293DF27961A8843110564CF019BF0ED9A4A3CB7835816D11B7EAAE452B87D4394E9267B709B638B444CCE7E28D1671872EAFFFFFFFFFFFFFFCF5C779B01F4B209106EEE9C087C10797E9DF61599264BE7CD3A7B74F315E883CEA1169F65D1800EC7B490FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF861D48BF4C23D231F0EA40F120E31BB8DF2D3C97BF20A65695DFFB61EC1535353E4A5D2DF3B13A3DC175400000000000000000000000000000000000000000000000000000000000000F95CDF3980CEA66B564F00B812509E82ABF3475D370EA48D61A517C3681E7C5138A43C53F44DB123CE5D2AD3FC22A5034AA9835AF0414647446F3F0BF2EEB906EAB0B66202DB80592065DD82708069D21CD42D47533E036264E73886229C6F01BE71A140188AA5C13CB5FF568295512B44280C929A5C25C424A6C832BC4452DA541B3AE745C44F5A93475933C040C002FFCF9597D4F93E7AA1820CA15841AFCF9AA78BAB871567CB818B03AD01194DCD05EA96EDAD15437EE98AB53CD3B27001E626CB1C35610D0D472E4FEA2610D75958B815A7C7F73099326A5A95139D62284E6E2CC734FC6BF899713E6212C5520208670CA48479EEB232B30C66045D13970C4CBA44D141ACD1AFF095193FB25D7E9FF306BA36842109ECC4AA6853B0D303E7A83502111BC626953580C1A390EF7FBB36B627F989E37C20DEEC440ADD8E0FD45BD4B920578D1AF242659EE6F71C004E75DFB295CFDC396F10259584D16D32DE3C94826C265E51A3E6F632B9F06D2FE325117DA657B8C5F1460AAC2A792C02D00F78ECDF9E26016C069B9ED2A5CDDE834CA340CF242A3EBC9D672EAEE52C740A5B5EE8307391DB10829BBB157C4802C4C3A15FD39EB1E7419B4586AEE94BBADAA04900FACFC75F3C93D32FF8E67AEDC7CB80F6CB32B163013A0AF8DAA24B02390B402D82300E121F4CD01CBDB15E9DC143AE7DE5CAB6B1F97148B3BB3B2D3A42326660C6EA2BE06BDDF23A3E41BF031A19A9D452D6945080B781B9B89D33BF6287E430998400B8AD371F1CEF97673E7B9B7ECFC758D974E6C8FC5911463503ADF062E8FF1BAEC181E14FB21949155E20F4C58550452AC37AAD90F7DA4D11345C7F4BC14C6527092DFC5EA121BFC20386BDF3CA563EEEF4CBECE6722B0A35382A2F94B7481FC170F004C0FB044159A7D3041D5EB6400F4800271DA293C55201 -smlen = 1847 -sm = 51CA650E16296CF1A92A6BFA00842D81E8E21F86F36BE046F30187CD5489A4FCE7BEFD82566700C037DCDB04E93C973932058500F297F7DD21100214A6C9023201458792E563FFBC8056398190012350D1DA692B7351EF22FC01011AB7A651337E13FB930FF42A01818031D5555E81A253D1A9C7004372FEABCAB5B8874C7A6D12016CFAB41F670C7240DDE589D001EB568E05EC41E0CA9EA5D34F0013FB79C2953D2F744317CEE201D341F5EDF060B75ED914B6BF01F5C4446DD9EB73BD5DDDB1AF01CEC4796BAD5170973692C52B0001D12805422451CC73C5F8A7501F47AFBA39701AE210BBCF133A000238EF0E7B46B4BEFF18EF44B401928E9144F158F81D459E0603FE0B139BA17ED7B476DBB1CDFE3C42B3A57AF5BBCB3BE19ED04D6C3072FDFE917ECB9272D59EE89EF83522531D83AFF8B9934A8423315C350D1481A4B02980DC29E1CB83B76623869649AC40EF297B153B679C327BB251C6E6BC169C48ABA2A439F9EA24EF94656A415C3E86D7BCB43CB3717D54D773F1937DC8B0E02D4E6ABBB1C83FE73F1B221C9A359E454C19DE5E71EA4CB8C560EABF1DA133FF20D81785D2ECD935B99F24840761446C324DF81484C5C05045C0949DF8D0F10F942E1B5B79074B358C25B6EC2B0B42DF65D998B666CF1BC568E7D737F22FF541807BE95ED85A9980E940E24D2C506BB0F9BEE32EFFD85A2017DE694F61BCC2B292595C97FF4C2145E48AF8F0F3D71763B4DB433ED7BDB8DBF8643475FB2B9155F0CC6A0048C5546900792BC01EBA4B06C83A0C447EA0CF05410DE55ACB8E5521829C89BFBC084CD86E7CA3D701283B70F78E1CE9C3888AD2689E0EF5593D656285066F319E155F86C0A71256484F42A0C40E7CF13AF0CF77C6D1CC7231A48538E9060A7863B774C9CC65E321E45AACC002C0170EDDD18CC1424159D46BF99D08A28D2DEA8917D28D91A1D6C409D945A5EEA19413A1ADCA40DE9458FA6BDF1E5308EF9E67E1E90E9D92BF19B5351FC49DFF0A31E035038AAEC651C0F20F276E4EF0EE35C14BB625EB34205516D95ABEAA06A7A3BB3AF2F12236406689BFAB11E65FC63EBC5B944818DD1D53C0E7B88CE7AEBAE581D995AE7D8423778DFE20D6CEA7AC0B1B4EFE2B9D571DE77BD8F71E89D9F6A2DC89103B73625887AB376BD12CE89A65E6280515A44A80D6C32799669260167DA0A214AD0FB803930AB1952D93360B54433CE8220B29339DCF2702581E88952A5A1549DBA11F4CCDB6FEFD6D24522F3207796C8D5BA9D1582F888F2500964F2B975AED5D5AF83409FF9720EDCF5CE3FE9B6B586B08DE21956E7970D8DC28F6208A80F5378ECBC506333A1D98C58EB0E2EB0CDECE0F5D16A069FFD742D1E589F546C4F2EA3DA0A56F984CFD93F5F2912FB1D068F2BD7C1B5E979ABCC62E3A0164445398F5C0208E82B99AED1200D36289B1FDBBF03E43995341AED3AD712CC7C7530C751B40B765073EE4E4CDD411AE543AD5E2793F294320E9791AB35AE1697F23EBFA0280B8041859909B0089C101D7CC429408FABD2E073FCA7F2C2886031E9F6A32F2B596A799967BA8A47E87DCC8854D45DDB6DE39160600EB4235F4E3424D75DDC8CCF041AA05B25B5A3811540EA5B77CD8D7D611A63BEF5C26D57475B28E961645AEE0B9C8D47954FAF634017787A21A671493E7C5F1A4C553E0A68DDD726DB1DED4321DC735332FEFDF2A84C22097AB3552F878E304598EC40EB349E1C1AE416F94112A2CF8E8702A4C3BDE2F58245166550FC238E153D10F90652518B1D84CCD3ED836F150F1FF103976E743137DA5A97A61276DFB0C11D071B240069582265A9CAE4987B6C6B017DCD1594024D7B1336FF141E59936EC4CE5410E1B73BA6FB42D35F8999225CB1A135260967F4F6EF2172D53FA6AB6D1A2E3174B46C24BC103BAF69C2128F093AECEEBE8753EB352E2804EE64AE5140DF1ACDACD8F225B3C9A61264245B8E5CF759CDDD75E25E2D790FFAE8421515E0CD6F279D0080A3F80BB2E0729C0D2626B6ACE31CE20BCDA490C7660D04D1D82E6403000578926C52D8F9A4BE7103D64E0F03E8F148BB2236781EC30F6D8BC827C107FCC40F26DDAD485E6135BDC3BB331BE139A07891717B692E23312D0E5B1C41F30C3B4B4700EFFB481A835AB54340269FFF365FF87F58245621ACFD83B7FCC6FF108132D8966F9836544354F7E216FBBB851F390DCE8A72362F0454730B90D35AB3859763AEE35668310FD501C7501F4599563006AAEE9B636B676F3DBB6787317885B0F4A64171BF19CBF2EA7A625E1563032C196E1292D82C7484817DBF78D8E9E478FDC4C92CBEF48D4CB4F0E6DCDCA6682DC0A56C3E45EA0350D9FF88073748305FD7DF3A3BE8C055CB1C55167560D5C99345BA80C21CE791C4A511E384A02833B78E8AA02B1B877A9B8D806978519D716C611DF54AE8EA2691540E87C6E79EB006569E02745021BDC7852E1FA4177E2C3EC89257618B38719CB07B0BA68F600236167F019694959C2AB6FB39D5890CB176F6ACC3B9656E495C07027E3D4DE781F48C1F1A8AA1B41449689E191E495FF3F263DDAAA8DE0DF6F1A4AA3EF1F5EDFE437BB74BA - -count = 48 -seed = CF5A04DDB5EBC45328F703D486D24443A7692D65AA55F054E3078DB76A7939590A3F35CF1A21E82A845445DD1B64A85A -mlen = 1617 -msg = EDD4DA833528B0511534F77857FFD16EAFB1A2AC87E6844612DBB104B9F32025B7F54E993D65CE85A061B6AC6D70A15BB42BBBBB6E2E21AEA55BB8A556120EB15EF35FD9774FC7B5C2894B747D3E4965B77DD8D5B26F38D413662783DCD332765B4DE534D08D6514CA9DC6ED7F2BDB4B5C437178710B04491708836CF2CCA08F28582107D27AC305EDE6030B1F8AADC4A1D29AD16CB4D739D8F813D47DA715CAD6B5CDE24EA95DFF4415B527DD900442D9ED1CA712C58B206D6E79F8AEFB882013358BC578638225BE79B58FB677277F072AEBCF8CCD6AB61A9D98A3B260E60AA625D78058FAE6028E4C5562A0F3473C3AD530BC4471228F27502A8F8FE2D1F72022103C3A2DEA363E68248ED8693B3B066B495561CF4468E8EBF32B454E54DF1766468AD3831D56EF7EB9C231E999C4CC3A6B0EBBF2C4F22820E256F67497427F53AD22D42C9293DC8682D0BE3517B63C6E871910ADBB3406B6B3B1CAD980AAE47BF9686E80B6E5DF2DACCCEAF9506B4667271779D00B4C1065951E21F2ACF6CF3CCCB8A633D1114CE9D531D94420E4AE496086638F031C0BAAB5722A41A66788D3885EFC7FE1C3DB54BC69E35B7489A0237A37AFE5194B5F424F792CC1D696098BCF327D87EBC50429A95ED82105C4328D0095A9775589FDB6C262FA51FFEE4D99C6D1A68FA661D1B6A0A2E0693D73B39218A6895BD83FC1D54831B7DF146FE7BD2A91B979018787B9904285A35922E22A7F1761BEA541EAF21D74E3A2F3C6F2247B042379CA4C553FD9256DD0C63E4C9DEA60912D02FBE4CE7762069A86CDE02A4E1E311B2AFDE435DA0816ACA659BD8C0650C1F118C0EA3622D72A5E96132F8B0FF8458C757648BD46E58195FAA0FC4FF8FA44238E35A25C9807B6229000EE560D8E085F27375C2F659BAA5FDE302B9529BF4699505C28DE33AB5DC2B8C02967947CD24C6A599ACB5C2D1E7D6BF3BCCEA0253FBE11D8043FED532AAFC9EE1151243BB80B92BE239BC4FD1D1CAFF502951205F2E6393B704E67141E1218963F664FE0759C15E6C0A1B40602A73990F040502867A9EDDBD4DB0E554AEA4BB9597949D5FB32C2E3AF92CF7816BEDAD5EDE1B769C823CABDEFCA1D1B85213C79EB03E065146B58E3BFBE80B4D4683B65AD1E0611372729B99A0B93934D52DDE40C19FED5A2B3DC3030E0B5F26B66474A5CCA6D741AB294BBBA6BE516105C08BDBABC97BDEC2141D035BF6C3A71553D6F6350229CA2626B8B0B56A24F2D6EECE436ECB77A70D747B6A6F830578B4792DE533879B174353424E7D0EADF6BD5A74B36A4E6EA7E39A4215559557BCE7A00FAAF0D1F81016F913A10F3C9F406C7CB53282CA8FD5FE4F5FABB96F891583E0507912BA02709764694296A5248C340A1B9EC3DB0F926F438CA96FECD40C4AD8DAED9B8A29691601835FE14283762236EF2135443307E5F0082D1C2180AE96ED0DD99A6E9172088E8B94AA2952BA5E128B202B2CBC1966E69B6E6384820D9AB624BC71788EA84B4ADFCFAA2EFA1DDAA8855D1DB3F58EEF2D54FE11A8A5D78ED46B58460E6F2FBA6CB70640700A4520AA1A2A9B336AEFB17CDE8AC78D67F194662642A0107CE38B74D731380A72AD4A0A068F09E0878E521F15CE8134780C3FD0CAB2DC2473448654F88BF1FE2020901B90C0ED670866B1BC337881292FBA885FE2BFEF6FE74765CA12372C8CBD698AC41A4C337374587DB15AFFB511D8C224F1743498D7173897FF5B8D070B89592BEBE053D5C10DCE67CA8542781AE749F3A42FAD7E4A2004A565F81D5FAECF11115C270155FB8AF6AEDA138B9C71458D6D2FF63441130EE9107C39260469521E020D2B42CB5A51098027F23890DAE8B28BF722AF9ABA6224E02FEB47E40112CCB164E8CF174BC9AC4C11AF9B482DF9C9F7F5F1B826428C21BE395EB1F07DE511E8258C84F5F035F4787ACE18C190808EFE99FCB455A54D366DDE2E230B575ED5A4A75D57C9A38DDE3D91D0D1A1C4DE7F277CAF23E0C5DD8E3B693DBC66B6BF1679B0AF74A2B9065B64CF0978115CC456AF685B22D85135727A8AAD96338611DC109B36C85A92E4A0180AADD1D25C5B3D4C681A44BACB953E50F994FCF5281366CDEC0CC50976074D91840B5079180CF643184ADCF9E4CCB44328E7BB9EB2BD06DBB7A757C35EC3DCF795A5E05ED250159EC453A1692426F624CC0737F691E475804F155E44293151E42D3C0F115ECEE53C6EEEF69788F7E8E5C422BB102237499F2638244C0C080B3639A49FFC1730EBB0CFD8A46 -pk = F464A4C3C2F326E373AB65DD1D049FC1F6F8B9CEC859ABBFC7E6FDD7B500672868F87AED9C799241ECAD83ADF1A44400629AC272218F030942F177CF8B4F5C3FCA51616BF578547195CC38DCC548B8EF512155A639DA2E67C5CF9A09CB0D2202 -sk = F464A4C3C2F326E373AB65DD1D049FC1F6F8B9CEC859ABBFC7E6FDD7B500672868F87AED9C799241ECAD83ADF1A44400629AC272218F030942F177CF8B4F5C3FCA51616BF578547195CC38DCC548B8EF512155A639DA2E67C5CF9A09CB0D22020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A2EDAC48E3F6E6EFAD6185E417A16F25D5B0B071345E36846D9C7D76E2F23BAB1BF19976F7436879CEF72FC6184223A18E4BD0EF534A416242E3F0BC6075E500CA85F3FFFFFFFFFFFFFF8FD2A9A97A5FA86A4D76478AA5740317C7C6BB20BF7FBAEB810DFD23D5925A8259FF8B7D14A0DA56FCD1F529C31C18FE3038D80B8FC80F0EC8B536CC8FA27D41B1A1E6FFFFFFFFFFFFFF613F04651214A56CE93BDA9C62183A0AD13974331A6E9EE32729EDF2489F2826B8EED5638632C247B56ACFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA60AE23E0B48BD8D32804BBA3D9563911A9CDBEEEC841C24F55FA1CC40CA3F0E6A81BCAC2181CBEB6DD9A5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E0D2F67E8D10ABDAF470415B450C9B18E52F35E676EFBE16752345D481342E2E0E6D31F268634A8008E5EC2C63E06038E26BB64721FD5BE9FB212CBF452148179581BC4FD933AF07CFF115E0B6402181AC6BF305C3590CFB6782FBD10451D03D69C1C5C0DA69A78C7A6333B735E962BFCF0CC97723614AB207CA001A26B1F4F47B8184384EF428537A8129B20004E01360916DF6B72C71AEBFE5A613045FC22E0E6BC326CD74208FDF959C1433E301462329A835BA4BEE08204E295138E5D031EFDCB672AEFA1B46870FF9015B870F44AE478142FCF4B3E3B4DA617BA12B815A2DDE6A455B67E4C02A1D5AE19C58202D245509BB143555D16E05F4AD5F08B5E8C40366D664D027F1A348BB29E6046B7F137C469727CF4247862175C382D70030CCE5DB282CE01B3D086FF0F032025F8FE592A4FBD328F193F139C59D58F9BFA25C660C0B52DC92C424622061B9F80035ABD514E0969679D388B5AB270FEB1DE563EF1C5CD5917693BD49EEA1D09545E8F8348D1D29E80E1479B45A5E79D7B02AC5A7087770DF355973A87C0FE04DDB0F99A3CB381142307EDD804072EB4E8190AE8839D24C09691080A2E1B15658A01B2CDBB4FFEF6A3FE40C2A69A596396D63365534F55372707D3E06BA1452797EBCC37780653004B9F37AF25F0A9DC71001FBBD8B5B99067E9C81525B85E1AB603F6DE20852931967EFECCD30AC0E5911E0AA6AE5457B516F6BB7D140724231B03066F2E25802F6CEA2B24C8BA4336BB3B37390C621A3335905803941B1BF916C51A267BC46416BA81226FC45E3CA12902F4A1A97711CC6F9C79F77C63C4A910B1BEEC195CF5BD6A033E8F48DA6121D43E7C329E740F5E294FCCEEB9E6BAD63001F635E6079549701EB8F2B5CAA1B29AB64AE5B8919B0D1EF68B542AC0753291B2AD4199BA61F261F0577249117F96B102 -smlen = 1880 -sm = A899C74AF7D92A165A6F37C40041C1C3AB7679CA6E5405C544001EC14AAD8B18A7BF38E0629300099B287B03819FD9F5FDE543000F20FF64EA18A2F6368217F100DB6739BFFA94E5B7C74D4223003F6B106A039BD7430E42BEB700D06A532A0FD4C847EFD1D7C100EA193AA3D42F4E7AB70871FA01380BC737883AF7553EF1E2B401D3BA7E32DA202EB5AAC19D99002C9A139C992251945F85A70B003E4C402023545C1FA9EDEDD10132B0F508FED03214EDF036600128C78BC338DC32DDF28795AE01AC08A9C133346AD8B371688B01015123901D57CB0EB1233BFFEA95B41EA85EA3950D8C4F88C45710032ED6B82762AD662753EBDBB2006E50AB0BA642C4748D438DBC1207EDD4DA833528B0511534F77857FFD16EAFB1A2AC87E6844612DBB104B9F32025B7F54E993D65CE85A061B6AC6D70A15BB42BBBBB6E2E21AEA55BB8A556120EB15EF35FD9774FC7B5C2894B747D3E4965B77DD8D5B26F38D413662783DCD332765B4DE534D08D6514CA9DC6ED7F2BDB4B5C437178710B04491708836CF2CCA08F28582107D27AC305EDE6030B1F8AADC4A1D29AD16CB4D739D8F813D47DA715CAD6B5CDE24EA95DFF4415B527DD900442D9ED1CA712C58B206D6E79F8AEFB882013358BC578638225BE79B58FB677277F072AEBCF8CCD6AB61A9D98A3B260E60AA625D78058FAE6028E4C5562A0F3473C3AD530BC4471228F27502A8F8FE2D1F72022103C3A2DEA363E68248ED8693B3B066B495561CF4468E8EBF32B454E54DF1766468AD3831D56EF7EB9C231E999C4CC3A6B0EBBF2C4F22820E256F67497427F53AD22D42C9293DC8682D0BE3517B63C6E871910ADBB3406B6B3B1CAD980AAE47BF9686E80B6E5DF2DACCCEAF9506B4667271779D00B4C1065951E21F2ACF6CF3CCCB8A633D1114CE9D531D94420E4AE496086638F031C0BAAB5722A41A66788D3885EFC7FE1C3DB54BC69E35B7489A0237A37AFE5194B5F424F792CC1D696098BCF327D87EBC50429A95ED82105C4328D0095A9775589FDB6C262FA51FFEE4D99C6D1A68FA661D1B6A0A2E0693D73B39218A6895BD83FC1D54831B7DF146FE7BD2A91B979018787B9904285A35922E22A7F1761BEA541EAF21D74E3A2F3C6F2247B042379CA4C553FD9256DD0C63E4C9DEA60912D02FBE4CE7762069A86CDE02A4E1E311B2AFDE435DA0816ACA659BD8C0650C1F118C0EA3622D72A5E96132F8B0FF8458C757648BD46E58195FAA0FC4FF8FA44238E35A25C9807B6229000EE560D8E085F27375C2F659BAA5FDE302B9529BF4699505C28DE33AB5DC2B8C02967947CD24C6A599ACB5C2D1E7D6BF3BCCEA0253FBE11D8043FED532AAFC9EE1151243BB80B92BE239BC4FD1D1CAFF502951205F2E6393B704E67141E1218963F664FE0759C15E6C0A1B40602A73990F040502867A9EDDBD4DB0E554AEA4BB9597949D5FB32C2E3AF92CF7816BEDAD5EDE1B769C823CABDEFCA1D1B85213C79EB03E065146B58E3BFBE80B4D4683B65AD1E0611372729B99A0B93934D52DDE40C19FED5A2B3DC3030E0B5F26B66474A5CCA6D741AB294BBBA6BE516105C08BDBABC97BDEC2141D035BF6C3A71553D6F6350229CA2626B8B0B56A24F2D6EECE436ECB77A70D747B6A6F830578B4792DE533879B174353424E7D0EADF6BD5A74B36A4E6EA7E39A4215559557BCE7A00FAAF0D1F81016F913A10F3C9F406C7CB53282CA8FD5FE4F5FABB96F891583E0507912BA02709764694296A5248C340A1B9EC3DB0F926F438CA96FECD40C4AD8DAED9B8A29691601835FE14283762236EF2135443307E5F0082D1C2180AE96ED0DD99A6E9172088E8B94AA2952BA5E128B202B2CBC1966E69B6E6384820D9AB624BC71788EA84B4ADFCFAA2EFA1DDAA8855D1DB3F58EEF2D54FE11A8A5D78ED46B58460E6F2FBA6CB70640700A4520AA1A2A9B336AEFB17CDE8AC78D67F194662642A0107CE38B74D731380A72AD4A0A068F09E0878E521F15CE8134780C3FD0CAB2DC2473448654F88BF1FE2020901B90C0ED670866B1BC337881292FBA885FE2BFEF6FE74765CA12372C8CBD698AC41A4C337374587DB15AFFB511D8C224F1743498D7173897FF5B8D070B89592BEBE053D5C10DCE67CA8542781AE749F3A42FAD7E4A2004A565F81D5FAECF11115C270155FB8AF6AEDA138B9C71458D6D2FF63441130EE9107C39260469521E020D2B42CB5A51098027F23890DAE8B28BF722AF9ABA6224E02FEB47E40112CCB164E8CF174BC9AC4C11AF9B482DF9C9F7F5F1B826428C21BE395EB1F07DE511E8258C84F5F035F4787ACE18C190808EFE99FCB455A54D366DDE2E230B575ED5A4A75D57C9A38DDE3D91D0D1A1C4DE7F277CAF23E0C5DD8E3B693DBC66B6BF1679B0AF74A2B9065B64CF0978115CC456AF685B22D85135727A8AAD96338611DC109B36C85A92E4A0180AADD1D25C5B3D4C681A44BACB953E50F994FCF5281366CDEC0CC50976074D91840B5079180CF643184ADCF9E4CCB44328E7BB9EB2BD06DBB7A757C35EC3DCF795A5E05ED250159EC453A1692426F624CC0737F691E475804F155E44293151E42D3C0F115ECEE53C6EEEF69788F7E8E5C422BB102237499F2638244C0C080B3639A49FFC1730EBB0CFD8A46 - -count = 49 -seed = 8C3D2FBBE0D39E293AF2D2CC5A9BEDEAAE3752DFD19CDC1E186D41E717A0412AA429CBDF005445AFDE684656B5D17690 -mlen = 1650 -msg = D868EC985F946F3C31B6CFE4811BA530EACD0ED061EC383C203B2481AC697B8B88BC0F72B635027E443AB1F54478440DE16E596D30A0F1252E0AF54C0F382BBF5655BEA8C6B9A2F6382D003CC7E4D4F223F8E35EC87CC543EAD52E0E1ED956CFB32E8075715C07CA4817C4B8DACE68C8B0DA459271746BE41D6102B3FA5E49AEE8D443E78AD3246D0B9BCCF6AB7CB7CF72B8A847CA16B435F0618594400037179441F3BF524231F747D920E86506E84C61D4D038D42E82D52D97ABFF896C1DB1C646807156324F7B68DB620EE435C7B8C9AC8B193B7C892565C3631E297495BD3B59293F9A9CEA5E29E23A242B81DD05C8DC9DD669424573298C85870B109C7B593BF864B56895D81386466CA5CB6071005781FB214F1EAE9672D0D16351A627A3FAAC49BE4E13D552340328323CDCB4703BBE07C2A39D75D7737D5C1BD04355B8694432DFB7CB4F1901550C7D6F41080C0F6A2CC49D63A69243D137A78260C06E7A53AAF4F4B086E0220EBC5361A6A78C9B2EC09C2EA4EC45A41065B4B2DAA866D9BABD71C8E6CB378595F068EDB258B2AD1F420B304E5924EBE273AD6D00684F75B6A31DC5290A37D0F9A848B1FC4A67DD9A4FB1F9B4C6CD45E87FAB4A09129C9AB95C44703B75B54C9EF9E825928ACA56527D79B338C5AC639D0265010F3C085D2B09AEF0E4F55D080FB5FF79F13E8E4E8DB020F4C095140D46A93F2E4811BFBC1393EC24F6B7EF31F13623DF0360B1E335FC42098CA1EFCD0306C5FECCE942F6E299AC9ED81054FE452D3F63991DA42D5680EEF749C02FCBA78DB5F4F7C734C6B4D99AF79711A0BAB723C24364AC85700242878CCA93465F286D5F7ADAD7F68F1D38CD6C6E0575A36F1E5521E420D348D947E745C2355FB5FB0F12DC6FB5E9435CF8E552C174A617151AF8D5E7D469AD5CD741E16EB88EA6D7C5806B08571697D22A525C2E30DFF608C921B955D2A990D9466829385DE0A81875BE564942AE740D15AC0AF46A876426EBBE481738BE19BE06F174D975AE8DFB52A94AF9A77E56267C0BB62169165ACE155041406CAF507146A02FB760629CC4C0E7D29108CB7C779455A3EF359BB6198AC75E16148998C16C9410DFF2DAE5F3C79DA61D371992D4A151BA91DAE8814C81EEA4F78D23871326BAFAA349C8EB57231B590F1AC13F599DF5B39DF36455F05E53CDC4D025410E8F8F8BB74854FEFE0C4F790F58434309D36C1E7F3935D4F896368C91AF95EC2DF292AE3166B83976ABD95089B05B461D4E9171CBB4747F3CD9BAB04E5A3B98095754021229B4B820EBDE63E463F2EE479FBFD83CACC61878773B129CD4B3E9AFBAEDB27C7FEDEC2F2D405B99933FE2C203D9949C567A7752AEF8A7788D2375900E70315823DACCD4F2A674196835C35EF813826B310346ABB16B0145CD70FD0A04611ED5AD0B8DDFCA6EBA6B93445038C3DD23D3D15E8899F9C889AF417E5662D538E466447E514A8897C21FE0BE2EF18948B66EB04051C0BC961FA485422A66D649DFA86D4B3DD504A89919A9928EF96FD467713DCCC1F19EE69CE3935F0416D9C5752B7DCF9272D2DB86C3EB6F4897D94DDBEF7C483FCC66232E535A8B0A5AA4BD443493FE539A32D433D9E89F7758DB5B0606A96455B39F92AA788FBBE43CEC8F1D36FEA3ADFD0353EA5532B49A7286381D985E018E6534005F605BF67AB4AAAFDCC499AC0882FCD9D90BD88053CFDADAF466E536F2FFA7F18B3DC254E42FFFC777E0339181473E2B7FC844B687ECCC0EB543A54211084B1EC06B0D9EB0A0C96B88D6585F414873C13EF7002AF2D47D5859A23D12A7D401FFD4BCF642DB96C70FDAD0CB03A6098437795BC9C7C6C804A26225EAA53F52747F01DB4E62471A21DBC1DED9C4DE2508812AB11F61F6364FCFEED445FFBA549E45E641A80FB4B58EE20677C7D6CF0526DBF4E26D9E5AFAC5429B4474DFFE709D09D766542D65E668D59C836BDFD0F78B846BC412F29DA00291871D94BB5E6557D833C8DB3D9BEB37888C3A70684ADC6B063FEC3D847C42E0CE20E05482DB165FFAC5D1F2C661B9DB6D19FB3E8909587351B25F2C225CB26BB137BC52D04AD8157F7D634F29A3623B4EB53B4EF9A78945280BCA8C5E1882FAE373EAC69EA366E2F13A9FEA75A6B7EB5CD4D9EB14F68A231BAC780F84200146CE7795282952382E2393F0C2A99DE830D3AA517DAC4AC97F2AAD3F7F8E3B49B22B078E3708C9CDD1B2A2A129656066C0030D747EDD646384611D4ECCC5B0B9DF4852AF7BFA94F6DD7584F6285CA2EA7ED3F8DECB534E6D31D7165C609FD9AD235F5AF8E4E8E58FD3D248D822C202 -pk = F0F8D8C3B3BE3CB941020490DF8612E032DCC2CD3A642F50C0F6328EF6A8AAAA7E0A86EA46FFF5C4ED3785F18A4E86036D198C0F46753C0239924607E30DE923DACB8E66C468490187AE99868F2E69AEBE667E0616DD8CEAD771DBD5F7831C01 -sk = F0F8D8C3B3BE3CB941020490DF8612E032DCC2CD3A642F50C0F6328EF6A8AAAA7E0A86EA46FFF5C4ED3785F18A4E86036D198C0F46753C0239924607E30DE923DACB8E66C468490187AE99868F2E69AEBE667E0616DD8CEAD771DBD5F7831C0102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008E490D37AAB6C269FA2592CCBF41AD8590BDC0D953A13643CF23E08B20542EEBE7651AE862344677A140F9C8DFA5846B34BA3F521D40A207A432732A8B770F4B0F3B0600000000000000299D00110896A0DF9ADAF57921E6704F8EDCA32209D85B699F85EDDE8645F1ACC248B2D0425B9A176CD2565D195CDDD32582681719D1FF7BFA79589C0101107CF3D9DBFFFFFFFFFFFFFFF99B67AFD68738DC72ED1A9346650A926196D4FF2C44F97D29D48AF0B3A580FAC08B514C4279509ED02A89FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBAD3CA8512027A572BA0BDE0DAD80199E41D61FEA2ABA774D4378DE955F6881D15962FF26821FC4CA40F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7E7CE885BC33AA1CFD1F019F8D1D04D722B7CC2DE8DA3B599D753F19C7487F47477BC1CA859D6A6C023F4A061D2DD01C75A6A1E3480FE1B133F88B5A0B735D90772D2C1B6E1BEFE63FBB77D179054FA6C43AEC4A1398C64FF08CA8D8D9504039A863EBCA64C15E355A182A13C5F780D3BD2ED6A427F087D6A361DCD57E3B52A5DBD5F4E772AEBDC6E060BFA012BB5017EC4F8EA386EBE02D117533D145C80AA85F813E8E2077122D8916B16288EE8A9423F856AE8B598FE64B1DC84FAD09B00687C7B11578CC5AB55C1ADFF05E2B623D580A4AAE8496ABA0BA4271BF761BC12197E30E6BD8BAB9DD5D107FE029372034AA8B2C44FE3D18F211ABB4296601DDF90ADD8C6910CAE005E362D042BAECD824746F1AAD45133923775F307F9C63802CEC43C311B693343EEDDE326F37D31C01EBB0193FEA0DFFF5D497E92605D4057966D6DBEA3C9979EB7D7E0BDDEF34F00215B6B403C9BD9A0F4D276C752F747CC655D347305AA41617B93E3C1FC2ABFB8AB58B6ACB32872C0553CA0DCD6921802DDE64576DA33E530244A0ED822AE4CD31275070AA24C47E762EC411FF72822A3F2C7667BA4EFB87B5838F1435B3EA003F6E4B6D9B4BED33BD9546B87F0D2F4E3DBB824E98DBCE0EF0C8119D96AF2D05B21CFB5D2C77CC0CBE0135C1D97AEA403E3B095AFE04509EA436D2995443145D2F9EC6779AEB3C01527F2710BB1EB0978BF174D7D93FD86586437D1678FA8C600779487C9B5D99E54359C73A7AA1DCB2F77CEBEC3059CB3066457338BCFEAED6FBB63177CD16C055FFA77EE38BE9D4100B831DF4DF4684F73B3755703E62831E9CE6D77547B3A5A1F9DC9AA0758638450081F35B5A867EA0A66F1BE0F50145D03FF4C8F58A09B7ECB9C74BFCDE8991EF823CB0D1B6C70DBB8B5ADF6F6A26EB5126F126BC1DE1114FC7852884F246CB402 -smlen = 1913 -sm = 6A3D614AD571B8AB672ED78A01ACFDD07A04A1F6D90936BD5D01A2FE23DCCC67576E7F2AD08D017A0C65FFC3C17946FE0F48AA00C29424FA886D091329A1FA920140E0F2EF852E075DC5F2D02A0003F0E8DEF6E9897474D7851C01FB4D7F5FEB56C809A05C83B6013F27F4AAD385BD7419D21C2001A85196F867AC49EFED5DF932010E27B12F10133DB8B06784C6005425CEFA65423EA0CDFC4AB001321FEED4E5F3F00334BD2E64011C7EE8987D039E21B208E563016C00D9492EB578118F2E6D9501CA23E211BA967F1F5011C8B60101559B68ED2FA041AC515C06DBA2D5C91AE2E54EE0FED0130F480301C9FB44426AA92237E7C462EC0034263265BECC9B10F79F975F3000D868EC985F946F3C31B6CFE4811BA530EACD0ED061EC383C203B2481AC697B8B88BC0F72B635027E443AB1F54478440DE16E596D30A0F1252E0AF54C0F382BBF5655BEA8C6B9A2F6382D003CC7E4D4F223F8E35EC87CC543EAD52E0E1ED956CFB32E8075715C07CA4817C4B8DACE68C8B0DA459271746BE41D6102B3FA5E49AEE8D443E78AD3246D0B9BCCF6AB7CB7CF72B8A847CA16B435F0618594400037179441F3BF524231F747D920E86506E84C61D4D038D42E82D52D97ABFF896C1DB1C646807156324F7B68DB620EE435C7B8C9AC8B193B7C892565C3631E297495BD3B59293F9A9CEA5E29E23A242B81DD05C8DC9DD669424573298C85870B109C7B593BF864B56895D81386466CA5CB6071005781FB214F1EAE9672D0D16351A627A3FAAC49BE4E13D552340328323CDCB4703BBE07C2A39D75D7737D5C1BD04355B8694432DFB7CB4F1901550C7D6F41080C0F6A2CC49D63A69243D137A78260C06E7A53AAF4F4B086E0220EBC5361A6A78C9B2EC09C2EA4EC45A41065B4B2DAA866D9BABD71C8E6CB378595F068EDB258B2AD1F420B304E5924EBE273AD6D00684F75B6A31DC5290A37D0F9A848B1FC4A67DD9A4FB1F9B4C6CD45E87FAB4A09129C9AB95C44703B75B54C9EF9E825928ACA56527D79B338C5AC639D0265010F3C085D2B09AEF0E4F55D080FB5FF79F13E8E4E8DB020F4C095140D46A93F2E4811BFBC1393EC24F6B7EF31F13623DF0360B1E335FC42098CA1EFCD0306C5FECCE942F6E299AC9ED81054FE452D3F63991DA42D5680EEF749C02FCBA78DB5F4F7C734C6B4D99AF79711A0BAB723C24364AC85700242878CCA93465F286D5F7ADAD7F68F1D38CD6C6E0575A36F1E5521E420D348D947E745C2355FB5FB0F12DC6FB5E9435CF8E552C174A617151AF8D5E7D469AD5CD741E16EB88EA6D7C5806B08571697D22A525C2E30DFF608C921B955D2A990D9466829385DE0A81875BE564942AE740D15AC0AF46A876426EBBE481738BE19BE06F174D975AE8DFB52A94AF9A77E56267C0BB62169165ACE155041406CAF507146A02FB760629CC4C0E7D29108CB7C779455A3EF359BB6198AC75E16148998C16C9410DFF2DAE5F3C79DA61D371992D4A151BA91DAE8814C81EEA4F78D23871326BAFAA349C8EB57231B590F1AC13F599DF5B39DF36455F05E53CDC4D025410E8F8F8BB74854FEFE0C4F790F58434309D36C1E7F3935D4F896368C91AF95EC2DF292AE3166B83976ABD95089B05B461D4E9171CBB4747F3CD9BAB04E5A3B98095754021229B4B820EBDE63E463F2EE479FBFD83CACC61878773B129CD4B3E9AFBAEDB27C7FEDEC2F2D405B99933FE2C203D9949C567A7752AEF8A7788D2375900E70315823DACCD4F2A674196835C35EF813826B310346ABB16B0145CD70FD0A04611ED5AD0B8DDFCA6EBA6B93445038C3DD23D3D15E8899F9C889AF417E5662D538E466447E514A8897C21FE0BE2EF18948B66EB04051C0BC961FA485422A66D649DFA86D4B3DD504A89919A9928EF96FD467713DCCC1F19EE69CE3935F0416D9C5752B7DCF9272D2DB86C3EB6F4897D94DDBEF7C483FCC66232E535A8B0A5AA4BD443493FE539A32D433D9E89F7758DB5B0606A96455B39F92AA788FBBE43CEC8F1D36FEA3ADFD0353EA5532B49A7286381D985E018E6534005F605BF67AB4AAAFDCC499AC0882FCD9D90BD88053CFDADAF466E536F2FFA7F18B3DC254E42FFFC777E0339181473E2B7FC844B687ECCC0EB543A54211084B1EC06B0D9EB0A0C96B88D6585F414873C13EF7002AF2D47D5859A23D12A7D401FFD4BCF642DB96C70FDAD0CB03A6098437795BC9C7C6C804A26225EAA53F52747F01DB4E62471A21DBC1DED9C4DE2508812AB11F61F6364FCFEED445FFBA549E45E641A80FB4B58EE20677C7D6CF0526DBF4E26D9E5AFAC5429B4474DFFE709D09D766542D65E668D59C836BDFD0F78B846BC412F29DA00291871D94BB5E6557D833C8DB3D9BEB37888C3A70684ADC6B063FEC3D847C42E0CE20E05482DB165FFAC5D1F2C661B9DB6D19FB3E8909587351B25F2C225CB26BB137BC52D04AD8157F7D634F29A3623B4EB53B4EF9A78945280BCA8C5E1882FAE373EAC69EA366E2F13A9FEA75A6B7EB5CD4D9EB14F68A231BAC780F84200146CE7795282952382E2393F0C2A99DE830D3AA517DAC4AC97F2AAD3F7F8E3B49B22B078E3708C9CDD1B2A2A129656066C0030D747EDD646384611D4ECCC5B0B9DF4852AF7BFA94F6DD7584F6285CA2EA7ED3F8DECB534E6D31D7165C609FD9AD235F5AF8E4E8E58FD3D248D822C202 - -count = 50 -seed = C10427EF0B26328163F85D45E22EC5215415326F013FF31EDD58BD3E97B1A72FF07D275D4C1B517F4661B0638F75640C -mlen = 1683 -msg = 4BEAF8CC3A7C393932CD37A2CD8ED790F05E4038ADF1287E2ACDCC0BED9BDBF92CE44AAE95CAF4EB142B858E1421610EAFC47DE566182835BDACD4C836F19BD686D53C3834EFD928487A2AB3402C2E3AB3AF97AA802B05223CA6927722C3BD1FE3F8C20F93C3951F907314896CD21CB99306FD7E5B6176945C2898B10C1DF62FBB2680752CABC8980B5A0430BE39D34BB7DE9544BCCCBFABAB709C11BFFF5C958C8763D8D5830235B49EAD26C834E63C3F3F2D6BA944FD2688F6350EC99DAF4CCCC42C6BE1CB19DD46514D71CB6E887DBA80EDB580B27F1142A20EA0D497E0336D55F1FFD4BB3D4B3521F0A01C7BB09258971D1ED4A98EC052B24776623D7B9A83C818795E3989EAEBA8C9142A97AFCE855CC6AC0ABA15F0546684AB5C2F48B23BB72A88B6AF2BA9C73881103CB6FA99E3B03119EAB03BC3B9BC365EFCD7B9F49A8BAB6A34A00AA8F2C88D7BEBBA808BD97111EBB192D82AD244E18BCA732FE6F72FDE5BD533E4BCCD3F50332DAD3A4169EA85C324D165413F10888AC3B21B91DE09FCBB9B636ED00FAAA669ABF6429B78C3C04F239722F31FB0B1A20CB1A6B553908070AC13521DF66772A6036E6695CF66B9A90E2111E499BCBF5DCD19744F43DEB943445248A5E84F168E7BFEA2DC4E1D0A87FB4140EB7C72D2DFCC27923206054CEC870888A79938DACBAACF1F122B22AB5C9701D777BCF9809CEBC9B7AAC52468134FC4A92C2BAA9B8C0F6249130A50337F460A42CB5364A5E7408CAEF8D12BA6934AB645DE9832818F9DB71F5EB0B158DE6A76619E75245B56020E1664D8FAF1C1782DE4A688D4055E07D842410600E9454E28676D44357853FFA7740200C91EAFA16BCA21D0006F47FE8159A733E0E91549DF434EF316E1DF9BB97DA6A2C2E2F20A65B3C00041A903270CBB55AE2432AEE25C71CE73BC2322CCB8E5BD0E24820616A890B0851D825D79411C14948DCDF48776D72565422056FE75765E50736C82F71270BBCF229A7B7A45DC88AADF4F84238C896DAB889E16C17DB7BE551AB24873FDA82F102D0FCFC139C9FEBE9FA99819CEF0E2684DFC5C843A6D496D8A595D33C51E1FDE9A84059C7BC596D32D53E2FE046F23FEFA51D13F9C28E227F5E24429B851ADDBF578922AEB0C5A61BBB666D11D127BA45C9E6378C70D75643DE776483582E034E81FAE0A3F029C47FB192CFA018CE1F68261D77CFC9E05EF19438E47F3DE9A68C8DC09D07B1BDC6CED69592623750F72EC2FB8C5CA981DFB84B4BF0734377EE9DD8EF5DDCD96F438D30AB78F402EBFF2163D43345EE8CA119F3208E21AA3A2185DE967B475B9ABFBC86465275F9A634FC22015E94A298E9C204E9786CB1FF14A5E99F942D42AB5DF51AD09654083DF0259AA1C26A760CCFDF4A276600C5FD3A54F210B20731941EB48A79435F1F86C45F8181D9758A1835721B87D36C725878375FEBCB8D48ED2CE8892DB50965753A98F4E7110281DB40ED64DD8EB51AB9CE41042589152D8CD5876FF30536F8955172A7A8F5C3F5FFD22C9954903136F781F0574F45F909BDF1657FC1CDCB9C4689F41E462C8D39108B10D78B6892C8775FDEB139258F8130BD1D2A1C72B5026506409F9862AA8729B35C652074494FEB84A553CEFBEED19D6EE94758E800F5FCBCAEC19B6A00F33EB237AAA6FC0B3A08C1D8829C180BF95E7D05F919A929933B7A032CD20ACE82AA5A45E5B2FB09812F36974B5EDA1B387FEB13BD49AC374F821341282C8FE2FB0CC5C075356833FF8CC6B648729A4298ECD73BD0EC73957077AC65722D0BE23C1536B8DB7B0506DAE47C0070564E7D7F9444F47B22C679EB8ACA4826F974A42043863E498E5301EA162C4E96684ACC5CA26CCD083541BC4C1D2FD690E51F07FB08337450A204B0F4F2C17785E037424FD6E78746764584D5F19255496DF1E524BFF0AAC31BDE9254429565278A39ECE4627C023EDF18BC21BB523D44EFC259742DEE9FF7159D5F700D957CCBB505A88C2037629402C2A322D17647E430777B184FF7B4E8D6B94724ABC36A5CCFAC08E2479E8310BCB7A617A25FAC6EFD10D0A07248F7D4597F14309B8064FE3BC4A4479F905E832210D49363D1E5D58176DEC9ABCC0C5132FD6ECCEAD2B05B56C96ECBBEB0B803E43DB2F982AD9EFE1E2A49649ED8E42707970C93615D54A3E673559B996E48A3B73143BA0884E918888156CA78F793DFF990FD721DE0C0B7916A5CED736E31292C5AF062D7CCD83FE653294FAC8C50CF6BA37B37D5A9BFD1E3B92D1825C1BE0795F9B257CDAB91CE99C0C51BDFCD6C0AB5A3BC6E30F884ECB4F1F61A3259CD279205B2C21CDDB196360061758E67B1C3724F5CB6311EB4FB92E6C0D71E6D1EA45 -pk = D5E9DAF8A6DFB3C39DE1E862EF16E6A9CCC37F732B332250711ECCB384A4A8659DCEF76C2012D48377900D3360561003B4BDAD3E910A6A5408EEDA34F56E8AA3DE368401CF51A7699DD93E51429BEBD7ED90B85F286A0649120D649D90683900 -sk = D5E9DAF8A6DFB3C39DE1E862EF16E6A9CCC37F732B332250711ECCB384A4A8659DCEF76C2012D48377900D3360561003B4BDAD3E910A6A5408EEDA34F56E8AA3DE368401CF51A7699DD93E51429BEBD7ED90B85F286A0649120D649D906839000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A6A64B3FB17A05B21163F9BB32262C2F137936A7C62500F82BAB7C97D0B6068C04BF9A55811B0E3BF13E9A027A8C0A8072E5EC1FF48321E1DE54EC2B291BBF5437DE0800000000000000C313FA0C4266B411DAD383BF3E72513AD031BCEF5FBAFE040DDE82757DFB7C55603983D4E0EB07181ACC3480AA11F6C738EBB591E0BF4C8A4052E039FC774C4254B3D2FFFFFFFFFFFFFFC30A928804AA5B62E306B0C52A7B3B932CD0CDF3884B8B26635221F72A8210A027339592901D8BE58F43C800000000000000000000000000000000000000000000000000000000000000DA9C32CF4332EEA6C4DEFE6251B768ACD74F7AD41C8DA785531830BC661226B872C5D51E52987FD9838DD100000000000000000000000000000000000000000000000000000000000000BC743A9EC72F996B85BE2BC3953A2184E46FCF614CBF26D5068A853417E8B3AC7651D4AD8D6DEF4E8367C84FF87E8C01F7258813326E774220959FD937F2B5FCA0E0D3F707CBD8971EDB80328FC72684F21F87EB36A79CEBDB9CFC7E9EFD7E00E65FB36CBF57BDA1E6AB8864D1F55AD3ACC7517241EA34ACF86F63824E4DAEF29B73C50BFBA2C4F92DECFB1A0AB79E000034D6C14D9454D16F460409AE3D5D4E06A50E0F0634A1249DB1AA68DA11F3A2320881FAD68EE415E1487BCE25AFB3016B7E630F97876466137C48A9F7BA0C89955783CA98DF176D5CF8D654B9539C6EB93420903D9FF68C78EA7F91B3C800020E45CF848659CC0F7BFE545EBB398044707A50B655089236DDA795E14D1CCF3B43FF0422B10DBDD78FBC0452DCF8730140901698F5497D8538F0B3197B12EB22BFFFF2BEDA93A2FD24AF09746420BC7C1762E8DAF7F68EB3DB02598D021C4002E2CA28CA734660B5F7C798FBBA8D505B8CA0461112E1F8AD97853FE98E942CF99AE2697F895C51049077A146195F2C01C7D26153292ADCFE0EED56E3C24A890B9BD7B2849D8B5903EC1396F1D18DE1F576AF39EE944D090CB5C8BF7C2DBDBA00D6044A85F1DAFDDD50BA16F635FC8B73A3EB95E8DFF541CEFAA65573D10E94E4B145CFF418E60D89E16658FD0606B200ED65709E1A18987A0A91A9594988BC6C9A1F0CB9F74EEC94BE696353498CC614E75262ED9F82A1A0323FC1F7EF8909010DF984A019FE99246D5C257AD34D1824DA79DE4C2884DA3D129DC23B8C397553C25FF0BA0D715AA4918E17D365C3AC03205F23DA7164E64C781DB923D7EE5A2262218F8B9ABCEE210642F39CBA327349C7F78DD47954A194FBAA793AE191310389CCD3EEBBA407C5EE810D00B4DB98DA8AEB94628DB5242D1F9F75C7145387008590C3009D50E9581DF5C583DD160F03 -smlen = 1946 -sm = 180415C0CFF5D63DB079398A0061697D161FD60CC5B2517A7300CDB76792C0C701B85A1F209501E73C77EE401338C224170F290043E79EE86CF70E2ABA71B68C002B595AA783327A7CCCF1E87301D786F5B860DFB105480AD4730197DB37220B75856F45BD196000C736D7B8E192DC1938D2BE5F01BA1186335E0AA7AB2D9857DA01450D1C9CE60D642D375E34D0009131E29CCBA4992C0F7807CA0173331A177308DF123D2D2F88015C4E6AB5541D99E3E8DAC8B70128D44AC970A7D7D69E472F4901FE45D9E58C4FDE198C498461000073240092EDBB0AA89DE48D7687CF85550E88EC0148BCC868780D0294CF94E174245D200A084B220194BB560B634E183B0281AA2AEC0B4BEAF8CC3A7C393932CD37A2CD8ED790F05E4038ADF1287E2ACDCC0BED9BDBF92CE44AAE95CAF4EB142B858E1421610EAFC47DE566182835BDACD4C836F19BD686D53C3834EFD928487A2AB3402C2E3AB3AF97AA802B05223CA6927722C3BD1FE3F8C20F93C3951F907314896CD21CB99306FD7E5B6176945C2898B10C1DF62FBB2680752CABC8980B5A0430BE39D34BB7DE9544BCCCBFABAB709C11BFFF5C958C8763D8D5830235B49EAD26C834E63C3F3F2D6BA944FD2688F6350EC99DAF4CCCC42C6BE1CB19DD46514D71CB6E887DBA80EDB580B27F1142A20EA0D497E0336D55F1FFD4BB3D4B3521F0A01C7BB09258971D1ED4A98EC052B24776623D7B9A83C818795E3989EAEBA8C9142A97AFCE855CC6AC0ABA15F0546684AB5C2F48B23BB72A88B6AF2BA9C73881103CB6FA99E3B03119EAB03BC3B9BC365EFCD7B9F49A8BAB6A34A00AA8F2C88D7BEBBA808BD97111EBB192D82AD244E18BCA732FE6F72FDE5BD533E4BCCD3F50332DAD3A4169EA85C324D165413F10888AC3B21B91DE09FCBB9B636ED00FAAA669ABF6429B78C3C04F239722F31FB0B1A20CB1A6B553908070AC13521DF66772A6036E6695CF66B9A90E2111E499BCBF5DCD19744F43DEB943445248A5E84F168E7BFEA2DC4E1D0A87FB4140EB7C72D2DFCC27923206054CEC870888A79938DACBAACF1F122B22AB5C9701D777BCF9809CEBC9B7AAC52468134FC4A92C2BAA9B8C0F6249130A50337F460A42CB5364A5E7408CAEF8D12BA6934AB645DE9832818F9DB71F5EB0B158DE6A76619E75245B56020E1664D8FAF1C1782DE4A688D4055E07D842410600E9454E28676D44357853FFA7740200C91EAFA16BCA21D0006F47FE8159A733E0E91549DF434EF316E1DF9BB97DA6A2C2E2F20A65B3C00041A903270CBB55AE2432AEE25C71CE73BC2322CCB8E5BD0E24820616A890B0851D825D79411C14948DCDF48776D72565422056FE75765E50736C82F71270BBCF229A7B7A45DC88AADF4F84238C896DAB889E16C17DB7BE551AB24873FDA82F102D0FCFC139C9FEBE9FA99819CEF0E2684DFC5C843A6D496D8A595D33C51E1FDE9A84059C7BC596D32D53E2FE046F23FEFA51D13F9C28E227F5E24429B851ADDBF578922AEB0C5A61BBB666D11D127BA45C9E6378C70D75643DE776483582E034E81FAE0A3F029C47FB192CFA018CE1F68261D77CFC9E05EF19438E47F3DE9A68C8DC09D07B1BDC6CED69592623750F72EC2FB8C5CA981DFB84B4BF0734377EE9DD8EF5DDCD96F438D30AB78F402EBFF2163D43345EE8CA119F3208E21AA3A2185DE967B475B9ABFBC86465275F9A634FC22015E94A298E9C204E9786CB1FF14A5E99F942D42AB5DF51AD09654083DF0259AA1C26A760CCFDF4A276600C5FD3A54F210B20731941EB48A79435F1F86C45F8181D9758A1835721B87D36C725878375FEBCB8D48ED2CE8892DB50965753A98F4E7110281DB40ED64DD8EB51AB9CE41042589152D8CD5876FF30536F8955172A7A8F5C3F5FFD22C9954903136F781F0574F45F909BDF1657FC1CDCB9C4689F41E462C8D39108B10D78B6892C8775FDEB139258F8130BD1D2A1C72B5026506409F9862AA8729B35C652074494FEB84A553CEFBEED19D6EE94758E800F5FCBCAEC19B6A00F33EB237AAA6FC0B3A08C1D8829C180BF95E7D05F919A929933B7A032CD20ACE82AA5A45E5B2FB09812F36974B5EDA1B387FEB13BD49AC374F821341282C8FE2FB0CC5C075356833FF8CC6B648729A4298ECD73BD0EC73957077AC65722D0BE23C1536B8DB7B0506DAE47C0070564E7D7F9444F47B22C679EB8ACA4826F974A42043863E498E5301EA162C4E96684ACC5CA26CCD083541BC4C1D2FD690E51F07FB08337450A204B0F4F2C17785E037424FD6E78746764584D5F19255496DF1E524BFF0AAC31BDE9254429565278A39ECE4627C023EDF18BC21BB523D44EFC259742DEE9FF7159D5F700D957CCBB505A88C2037629402C2A322D17647E430777B184FF7B4E8D6B94724ABC36A5CCFAC08E2479E8310BCB7A617A25FAC6EFD10D0A07248F7D4597F14309B8064FE3BC4A4479F905E832210D49363D1E5D58176DEC9ABCC0C5132FD6ECCEAD2B05B56C96ECBBEB0B803E43DB2F982AD9EFE1E2A49649ED8E42707970C93615D54A3E673559B996E48A3B73143BA0884E918888156CA78F793DFF990FD721DE0C0B7916A5CED736E31292C5AF062D7CCD83FE653294FAC8C50CF6BA37B37D5A9BFD1E3B92D1825C1BE0795F9B257CDAB91CE99C0C51BDFCD6C0AB5A3BC6E30F884ECB4F1F61A3259CD279205B2C21CDDB196360061758E67B1C3724F5CB6311EB4FB92E6C0D71E6D1EA45 - -count = 51 -seed = 4B6B73E042CE76DBE39535E45D3BB2F3B9F8B2BDA170E76CC88666844703E32B2367460A0F6A0A2E3F4E7A6CD32BE998 -mlen = 1716 -msg = 0BF9A7C0F63CDCF3F850ED7C5DB6191EEEFE29E498A19F9D89BE4698821ABD72EDC34317B4F8EC2736DC83C24AC195BD55AFF00E797A83DFFADC7970FE53304F16F5DD92E6EC362B9E283E41EBF121FB2FA2A3F60124EF3EBF836AE51FDD55CA9F59B085DDD660724C072B86041B50A3A446CDB20A45BA65380ADF007E005DF2D9AA16A9D22B11DCF6F0B1964F04F45441A923691A15D80DC85003B9AE281F2B5983DD1A04D80A4D9C4372D9820BBFAE3AF7735E7C71E9F085C0A6E4BC107D9E4BA222B38FB236B2CC3A19DD6067BEAC460383FF2BCC771A7F1AAF092FC72C292FC1D5C6FC6B9715F1E1272EB22F8E0B33A2830E31BD6C531677902F6A95CABC3E9C1AE36F77037A785FEA355137A581FC14E6BD5F1F7AD1A5DD19DEDD448B47B558C22DD0FCBF296A812A726E7D1B57F4688D3F577104CFB15FC63C27F7B6051C7AED7D645186FCA63AD9C2D68BFF442466EFF76BCF0E398D2BF54C2CA4CC614839E9BCA48AB2CC53865803710A98D313AFF1DDD06A65680EB83C640052DB807EB2F38ED0CC211128044D331FEC3E6B0B2F3B675C631FDADE62C16D1719278413EA3F8E54BA34EDE7E73F3D94802D2F9CB9794D257C46679A3F00015945903190B97071F8FB55F8696253AA3F39B3FAD344FB88224F5313B43889B768171895F7AABEFF25E21E525EA01A996C764A3ACF12BFFED08F3F751F5CC094B50B325F8B62C7A5B3256964D48543690538E634E5730354358534B65EDDD44A526BB4B15E2042B6210F503EEE06D00D615CCAD10D73CDCBF5264B526674D85C0ED31BA5EE584F21FE6D13F883ACE4B094768865E43099E54671240E8E2AF8A7D7D22335B3974CE860E7238A7C1CA8A009EB51C8636F0659189AC8EF01C871E9008957CECE0A367B63BD2852BDE8690BD74C6D956435D0AB82F94A90CD00FC840DFC7036B84D51F1FF5076CA0974DB6CF25AF42EF7DC8C30C2B04CEB2510E86FFC510BF4C931639478FD1520AD571FA17958CCF8E37F5F6360030300EDE3A33871E9582808BDA2233996C5005FD0C23D99261F570AD9027767F6FC96D18BA98E8DDFC2B79AC12CDA5F2367B4BB6B99A3E07B59882E49A92AECE85339BBB18AB9644D20A3B2A795240492CE4EAF09D9EF728FB82B1DE7B64B5D391251FFB0699335CED8C7CE642FF1A79F04C3EA0DC37EA101188361AFAD236EB218CFBD1D0EBD784CE27DCBA0266DDEB87B59B66A4F75BB44665643FA358DD3D0B69B49F45A752B5C410E2299A62BE4B57B32B0924A069A8E8C15D754CC34DEBB0D967E70693A6FFA58CF7099C2C2458B437C7B205CC7E815F6CB494080F9EAF3017E5FF918558DDE415FF72E954EBC2ED4C20C8ECE38CC916060D22E582D54F74C6C181C2601400110A683F4A365E45FF1387BCE4E152A740136BB762B03A99FB68F6AB42620B2E3C00FA8D150944230A6330409B27E4AAD1693E2C3DD12216C4E2DDBC5E9CBA68B8B5417A7B2EDAE7EB67D25F4EDECBB087F93DC9C927C33076B1C71A2B83B33870D602562ED378805A690DD2A427D86C2C46BA4741F3DEFEB91A05EACE975C836E52868CFFE52CA92F97DE94768161A3E953BAB6A28016782909EC53C02F35184AA9CCBD5B793B525204B72DEB63E104376893B9452C3F2C492F423CBEF1EC87C85788CF3073FFBBCD67FF79BD038672943AE4BC68DA131DBA8D7B41C83B4E9CFB6931987B270C74919BBD40612F823114E4BB148671F1AA62BD2BDFCC8B0B24010EC112E883AEC9746D0F5DE467ADDAF51F8C070A359108B1F91643071438F098233AD9A94D0FAA665A39291A98D14A861905ECDE4755D00E690429C57580DCB6D51BB6186CE72EBB1FA8413892CAFB8713E89775013E546FDA30AEB8AF9F7155C08B25810C80CCAA5E700C124CFF59FA32E0293ADADBCC7B1A99F67E66B28DA614C5A4CCD706AFD05388C65EBCE07A543D3DC1E5A5D1F307F675728D4C629A04E9E455B4DA35236C677F26EDC622C1FBF29568D509EA0690AF4CB5DBB4E418B6162888E43B458774A31324BFD5EE8D2152E4AD43A3007D7D4AF5FDA172C2779837AD3A09E135DE953CE966727A7183BF77ADFC76430666B526692991D3C9DB5BB377552A7801C548AA63F6931D3EE91B875CDBCBB7441A4FF81F86762332D7192FBC2F7B69A58DB6CCD3558047F1940A1CACD6FA28A000B9795A2860394BF05F0120E6D85F96B1FE9DE14E3ED66A31D747924B6FF2620778E0714AEB34B79A5D935A0306E55C36506A292C5DC568403551907E49A43A6263D2915108916F1E27CF3529D1B7BD1544AF83A7CBE58547F192A93CE5C5BC6D652405FFCB95345F522B2D34E8EE0960BB85537A46121BD9A408D283A125EAA745BBAB04E2231C19AE95E13901C69E5C9C4D70B104478F4A70D64F81269A8 -pk = 56D29578FF9CD55CAD548E99E8B15B9B4A4553EEEF992DEC87D1E82A2E9766F3D2C189C1896ED93E0E96CA592E4A24027C437B82FED405DDD00F4F1448C19560A08467093BB1E9EC293548C096DEFD1D872369826CF19DDC51DBD0D8B5803A03 -sk = 56D29578FF9CD55CAD548E99E8B15B9B4A4553EEEF992DEC87D1E82A2E9766F3D2C189C1896ED93E0E96CA592E4A24027C437B82FED405DDD00F4F1448C19560A08467093BB1E9EC293548C096DEFD1D872369826CF19DDC51DBD0D8B5803A030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B498FB1BFA20B5A3A9BAD0C90E30C724C740D1BCA1D1D9FF1363FE7556B396B197993242D1B616E68567B7F44A863C4053F24AABFFC610A8384E763F75F10A0B03F902000000000000000B38634EE2D9E6D6803CE60A25B0035B6E1D2A8733B2C2D09047472D9196F0B58412D98DB35A426FDF10ABBFDA58819E39B6146744AB401FAB9C73C005380A23671BF2FFFFFFFFFFFFFFDDD0E855FC59EFFBADBACF788EB6672247010921B7BD70E74148D68C75F2371477CA1914337F8DF2C31873FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8BCFA1C76EDC4E52704999229CC1B5CCC7F456BE5C7FE2C160880B43FFE5970ED4899DF9DA4642927FFC8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF157F5DC7EEE0578C4D12A6EFF0573584117F9450BBDB5554D3DE25E51226E9FC93E0C74805813996238E71A7F375A902F6BD3815CA8E286F11D3AA83D210FB2C518CA1175F4A7172FD1DD1714CBCA8AFBC935DA3D4EEAFA42EC7D4A497858001D7C6ECA04A83EAB30CD3FAD44983D7DD87B2F3D3298DDE8535954FBC4539A14152C07DD4B6E19B10C71D2FF16F8F2C00B6518D31937BC13543D3FC956C89AE849ECD658327C2BCDE96C3728DC1BAEC6F4C5B3B67511CEEB55C1BC07C851A3C00CA8B5CF939BB4E06C171F75275DD9FB98E84E7BD1954563315E64CC535598BC64BC69FB58A0721C20FC8CBAAE2FB5502A4179BBB4BBE23E551509930891E00F355FB602802F3D094E171AEB6BC1466000B6AD9AF9A38820F70D1F0F2585CB402EC20D1AF429F5F45FC1AFCC0271D8F9D7D1C936F2B391E89287B227E0D358AC09CA145B1B02067B2A8BB923DBEB2FD0020E140B9FC3F0F6DF4A8C883319050DF541A2CDAADEE4C5F59E9D438EBC116F002A020362F7DCCF535731A53EA0BCA000DEA2BFB24D1F97119EBE25CCB2E47518738541E3870E962E76D739E9D1D01AC53F626BFCADE59D956E3364B198C180064E1A6B885ED62F2A9F11F3218BA3067476EAA38EDDB862BCCBBD708566617E361E2B735B57A426D99246221E4628B0051741191DE1C3C39174B54E4AA163E7E63F3693B2D4A97FFEDB2049E1C9EED0338C8178B5DC08D1232190DC151AA0A01FDD63145D09906F6BCE3D750AD1DA4E4512BA3ADEECE2BA19F18117497D1EFD39C78EB1B3AD49C2E83D8F97DCA5FDC018C08FA54FAFA56CC0CE94FFB6A81383E1EA61B62D1218AC8CFC5C1E890D3506B0896FE83C267D5A623F707F9DAFB920164EA02B0B0FF4A956AE22B4C7BA43A8052535F405F41765914704DBAE4D6FAF8B72C1EB4403AC598E16B48663AC4A103 -smlen = 1979 -sm = 09D9B092F3BF16FBC8FFF1FD012F972BE2B8AD35AD61214D9401FDA8C2FFDFFE0F4F9FA2DB0C011346D7B9F4123987780B1C3A0052E25E00085B9A76426011280195D5389330EEAE57411370D001B22E275C3D066C06E89C0CC800D89F181110AF76C6F2F07841002D739D50725D798A71C83C1900753108B56E353CD9C17D64390164A94356B857B6A09DEF60FC00AFCA87918D361886CD20C653019B3DEFA4903E3582DD40B2470159D9D23DD321EC41D7B9B9A5005907D0522A4EA234063DFA8D0138D05FF4E30FC5AA847627270101E5CD47C39CDD4125B5A1C8106A2C302C3A71280B2A69B82E9B07036F8ED37962859D514DBF5C0C003EDB165691B4388DBA9F202231030BF9A7C0F63CDCF3F850ED7C5DB6191EEEFE29E498A19F9D89BE4698821ABD72EDC34317B4F8EC2736DC83C24AC195BD55AFF00E797A83DFFADC7970FE53304F16F5DD92E6EC362B9E283E41EBF121FB2FA2A3F60124EF3EBF836AE51FDD55CA9F59B085DDD660724C072B86041B50A3A446CDB20A45BA65380ADF007E005DF2D9AA16A9D22B11DCF6F0B1964F04F45441A923691A15D80DC85003B9AE281F2B5983DD1A04D80A4D9C4372D9820BBFAE3AF7735E7C71E9F085C0A6E4BC107D9E4BA222B38FB236B2CC3A19DD6067BEAC460383FF2BCC771A7F1AAF092FC72C292FC1D5C6FC6B9715F1E1272EB22F8E0B33A2830E31BD6C531677902F6A95CABC3E9C1AE36F77037A785FEA355137A581FC14E6BD5F1F7AD1A5DD19DEDD448B47B558C22DD0FCBF296A812A726E7D1B57F4688D3F577104CFB15FC63C27F7B6051C7AED7D645186FCA63AD9C2D68BFF442466EFF76BCF0E398D2BF54C2CA4CC614839E9BCA48AB2CC53865803710A98D313AFF1DDD06A65680EB83C640052DB807EB2F38ED0CC211128044D331FEC3E6B0B2F3B675C631FDADE62C16D1719278413EA3F8E54BA34EDE7E73F3D94802D2F9CB9794D257C46679A3F00015945903190B97071F8FB55F8696253AA3F39B3FAD344FB88224F5313B43889B768171895F7AABEFF25E21E525EA01A996C764A3ACF12BFFED08F3F751F5CC094B50B325F8B62C7A5B3256964D48543690538E634E5730354358534B65EDDD44A526BB4B15E2042B6210F503EEE06D00D615CCAD10D73CDCBF5264B526674D85C0ED31BA5EE584F21FE6D13F883ACE4B094768865E43099E54671240E8E2AF8A7D7D22335B3974CE860E7238A7C1CA8A009EB51C8636F0659189AC8EF01C871E9008957CECE0A367B63BD2852BDE8690BD74C6D956435D0AB82F94A90CD00FC840DFC7036B84D51F1FF5076CA0974DB6CF25AF42EF7DC8C30C2B04CEB2510E86FFC510BF4C931639478FD1520AD571FA17958CCF8E37F5F6360030300EDE3A33871E9582808BDA2233996C5005FD0C23D99261F570AD9027767F6FC96D18BA98E8DDFC2B79AC12CDA5F2367B4BB6B99A3E07B59882E49A92AECE85339BBB18AB9644D20A3B2A795240492CE4EAF09D9EF728FB82B1DE7B64B5D391251FFB0699335CED8C7CE642FF1A79F04C3EA0DC37EA101188361AFAD236EB218CFBD1D0EBD784CE27DCBA0266DDEB87B59B66A4F75BB44665643FA358DD3D0B69B49F45A752B5C410E2299A62BE4B57B32B0924A069A8E8C15D754CC34DEBB0D967E70693A6FFA58CF7099C2C2458B437C7B205CC7E815F6CB494080F9EAF3017E5FF918558DDE415FF72E954EBC2ED4C20C8ECE38CC916060D22E582D54F74C6C181C2601400110A683F4A365E45FF1387BCE4E152A740136BB762B03A99FB68F6AB42620B2E3C00FA8D150944230A6330409B27E4AAD1693E2C3DD12216C4E2DDBC5E9CBA68B8B5417A7B2EDAE7EB67D25F4EDECBB087F93DC9C927C33076B1C71A2B83B33870D602562ED378805A690DD2A427D86C2C46BA4741F3DEFEB91A05EACE975C836E52868CFFE52CA92F97DE94768161A3E953BAB6A28016782909EC53C02F35184AA9CCBD5B793B525204B72DEB63E104376893B9452C3F2C492F423CBEF1EC87C85788CF3073FFBBCD67FF79BD038672943AE4BC68DA131DBA8D7B41C83B4E9CFB6931987B270C74919BBD40612F823114E4BB148671F1AA62BD2BDFCC8B0B24010EC112E883AEC9746D0F5DE467ADDAF51F8C070A359108B1F91643071438F098233AD9A94D0FAA665A39291A98D14A861905ECDE4755D00E690429C57580DCB6D51BB6186CE72EBB1FA8413892CAFB8713E89775013E546FDA30AEB8AF9F7155C08B25810C80CCAA5E700C124CFF59FA32E0293ADADBCC7B1A99F67E66B28DA614C5A4CCD706AFD05388C65EBCE07A543D3DC1E5A5D1F307F675728D4C629A04E9E455B4DA35236C677F26EDC622C1FBF29568D509EA0690AF4CB5DBB4E418B6162888E43B458774A31324BFD5EE8D2152E4AD43A3007D7D4AF5FDA172C2779837AD3A09E135DE953CE966727A7183BF77ADFC76430666B526692991D3C9DB5BB377552A7801C548AA63F6931D3EE91B875CDBCBB7441A4FF81F86762332D7192FBC2F7B69A58DB6CCD3558047F1940A1CACD6FA28A000B9795A2860394BF05F0120E6D85F96B1FE9DE14E3ED66A31D747924B6FF2620778E0714AEB34B79A5D935A0306E55C36506A292C5DC568403551907E49A43A6263D2915108916F1E27CF3529D1B7BD1544AF83A7CBE58547F192A93CE5C5BC6D652405FFCB95345F522B2D34E8EE0960BB85537A46121BD9A408D283A125EAA745BBAB04E2231C19AE95E13901C69E5C9C4D70B104478F4A70D64F81269A8 - -count = 52 -seed = 3D4607399F6FCBE074FD2BEAB1A7571239D6BE6308617866B65B892EE65399E14DC7FA612CDBC5F7E23116FA86C3133D -mlen = 1749 -msg = DBFC582AE98D8FD326FAE96A1849EFE729A1173339D90C48C3A2B867135F1DFF5B497D05FD55130694B5F9C62D136647D767AE682A0F05C670CEECC03475FFD39E0BD4E45B720D9D7E8DD04E69C969627682AD83F48609F6E66D0BE99064988E4654E3913B7CAF1475622E211BC247B98E5BABA1B804E2BF651713197D8A610CC111BA5FD98A053408AD155DCB756D28A283BF3B20E6F3785DD5F105F8D7D9F2956064860B097C675630EDEE1F17E2EB0B26B6C20E260F9A5915D63F1BE2C74FB0B37013244481A2D0C581C4EE12516E0FD4701E9835C8526A490CB39E99FAE07C40236808F9605A63A5106C19517C3711CA4B9E8EDDC77B242575D904DBE64223CF14A8E39FEEDA9D6C5F9CD0D0719A7EB5EFA71453636F78CAB8262636FF1E136C787E38A43FAF02699C1F260EC45B068EDBEEBBB8A0E08CE282BF47D27A33216856F0C59E743DEB13397656FF17FC4B3C694B189C35E516BE719CDA6542260D1301DF93A5D93EE118F7CB0AC94D0364C9EA66718A4BC7F3D7ACFFA60AFB7100F7D97E98DFFE167D1D8E46C912D41EA057362C13B078CB1D9C443C1A57AC18C4566F5F5388F47A40CA49CDAAF34BD4C9A597FFBF7AB20D7CE88DD76A639E09ADA323C588B08140E9350268C1FF76079093A05CCF5E1613A70E6E37CD257875049A767332E5F7420F319F9AC78F97C0C4FA40B1EEF8C8B48045C78F73584590FE41F9F274DEA838DE75DADE66D04E9D9308CB0A9948320D28D9CA8F1F51E39FF3DE20FD5A2A267D127C317ACD51FB779E597A8DC7359D920548B8BCAD761C6B8012304E12628A2652D12A8161E538C20D582BF567E9C2B46B4CFE2D2DA31120C6DF50DF45C80513AA9EEE9F2613A221AA1D23F861C7F26AAC7813B7ED7278EB420A5C44F2A5879A2F1F9F11E14602762E3389B152C014EA9DDC9DDDE9ED1D6F74E7526F690EF37E71D448342C012E032C00E480A699ADE617434C12DA0E69139D0D9036743B9E2B9134B5086FCB96B193330ACE8E4F77148AD0F532E72E1792795080B54D7172FB9AF1972D00AE24D0B3D86528675B3BC8C7B80598D855B95A77667AD0F671F00039C08CC99F5644BB006BA9356B9C02BC935212C43490C741B0845CD7B4247592374AEAA1B589E670AC62777293870963B5132DCC27088F5DA5B831FA570766FA81C2A07B88BBD45B81992EDFD2A7FE934219B1F648DD8A414FA03EAFCD39E72BDF7D4F6B9C1F31A0A67DF03F6709F2BE0E7D1B1690C92CE7B8C6B1054270D796B16D6E445D24CB11229CB0F92DD81190A37838951AD28BE2AEEE6C5F63DA60A911AE0A24B1D05EF2F814FB30AAE8CA3BD9F01D4FABE5B279142AF948B0E6BBCCF7560107C161C816A0D8E61DD908445079BAAFB78C14F68B8B2BB241FB03C237A4CB250911142D0B460ACC75E6B0F58BF28546A4779EA7342238826F636A510CC9CFFEE8BB0292A58A07694C05672B560B26158A8566D01D0EEA0773E81F3F84376B29CE375FC56A0689A7CA5CE94B91814B62CBB61EA2EFCA0CE6712A941D612B0F700C56B46D464C2AAAB3F64A89CAA8561A1DAB2869D79DA1720274D031946C4C7715FB9C243DC95CCA7AECFF55EBA4044467EB922E93F57E3E39B93876A03936DFFDD2AF48D055C6C188F2F229812EC94F3FBDF7D7DB62E4274DC91718710EEC2CE034AEF266207C5CCBA21552D6FB8DDBEE8E931067010594A9E0CB37250F67281C0A369965367424D454CDD05D3C8F35A15F76B4C8C3FEE42F4C9CAD68849837DED3BE58730B94AE3A5F9146F90E03B4C0836381B3F9CCB5DE6BD2455D241BE9132EB6D4937FF27663F4CADAA9CDA193919F4CB0D0F727F6C7B26E831C3AC8DECC234D79D1B3BD28305E3012A3733AD718FDAB7DD1A6400BC47F47D20F627D2449DBFF10E37A62299E22E408A28A806D403CBEE19AFF6FA9B1814B35B9573ADC86F829A08893CFAE4A0212293447D3086E21BBA28049F3ED383519917B169E8A1B7DD64CEFE0DA643A97950A205CBFF6BD9334180556E84199F0B60738715CD69AAD7C882430578F6FBA4579D908F863CA54D0B9862EEA6ABED31301D183CF465B1A256CBD597A629307A8A890F11C23DBFF895B932E9CD2F5F06A4183D6F2D61117126FCD2CE2B86BB44A9A5B402E3EEDBE4ED1DF11716E91A2302CB72D8F0DAE132E16311C80DCA041694AF1EF63F659959FCAA133D9E5668F94D0489311AF3BAD379DE17793BB3EE8A284529A72CDEC474B3A82D92C6CB21C63017F262E0D7DD47AA5C58F5E23F8A37F00D5438717F05BB974F18A5D3E1CA054EA053C30B34FBFAEE88BC0195F061AC32F5B71B2A8A3ED4B8BC4EDAB40A6396C052DCE72E10768526C00610E96DF38AA70938CF844CF445D8E2BF73C4F32A742812D8C1DB53AFC6B6C0A4BC67C3CF7579702312D6C89BF14E9585D2C624D07FEB4B5B57F8E4C5CFDA69A5E922CC1E9 -pk = 70B38D1D39B25486815C9832B21DB9B356A2FB0BE11D03C40078F21B9C219B1DF7A18B138B711B24C6FFD1BDB32F020310CEAAE0EDD865C249AE3BC51E49AD9A2D493BBD133CAA12B214A58D9CE8DF9DF94ED92B839A0AC2B73B2D3ACB7DE200 -sk = 70B38D1D39B25486815C9832B21DB9B356A2FB0BE11D03C40078F21B9C219B1DF7A18B138B711B24C6FFD1BDB32F020310CEAAE0EDD865C249AE3BC51E49AD9A2D493BBD133CAA12B214A58D9CE8DF9DF94ED92B839A0AC2B73B2D3ACB7DE2000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000333266B8041A74B14FA8215534E65D423096ECABA77ACC731ACC66F41BFC3D606C0E6946937C5F1E3680F3EEE65D08C2A966E9E599BD87D826EA9E4D8D89D9779CAED2FFFFFFFFFFFFFF5E5E07385FC5354FE99F381621643E6F26622C2FB6F1B673B1DB2C7C0F91CB9FD4921D190144DFB1141A4946C76391702614D523F90DD64CD552928D797741DCAECA0300000000000000FA84A933F9879C5E3209B608CBFE09F0AE29AA9767366E3929F23400D2C04E549A6E9A5BB5E3798D97D29AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC34C75C3986C1121F2FEDE4D3DB987D8E20B4DD2326FFFD218D7BE63319120B6735DBC457CDB56A02199E100000000000000000000000000000000000000000000000000000000000000172E864AD5E7FFBF0F2B8035D9D7F5768ABBE7B9F3E81E744D03B90C93FFDEBC810D324E65A24640B281449D4BD64D001A052F7C3B826DE934D7B4C9D924D1E49958DFE6E587D6E77ADEB189D7547068856A33FA5AA4EAA29DC511D47E8EBC00093F09CC8993CB6839A22960B9F38DC7ADB3D30CE29506F1B025F54A3AC5B254E6B2FF6E38BD9833256F5763FFDF6102197D508CEE4B6D9C799DA55472465F309BE4F172171F22C96D79AFE2A2E6BD0B211A9904301454CD615AF9B0349C8400111CFD2FC83C1D7A4D66C5EACB288FBF955D062165A5C47CE7D1A121F36A9CE56796C544A5AE27EE640F075C54CB9C02082F52D3B630A8726EAB315477AA2CEB692CED638A767863A2A17A4A4E0F174CF2EF7BAD4B7EF47518F12F31CF91C8006C7E2D7D57A30513B158D27C3771480421FBCACD9E975F1E0AF9DB804B2B52E16D047D78D5B4A6A51681A91A11A72200F43649C967D66426C856535CC0F0552C2CB180CAF38777BD9FA2E75DD82F61744DD593038869E7927C9556E7CF69AF0056DB551B65D2EF2C8DA7868A562B254ACDF9A0865579EE72901C6792985AB5A5E4F835A1248C4A3BD06BC433AE09F3028984C64C3EAC7057E1C101F49AF8A027905137046A65CAE8BD18F4F5E562DEF94E2494F667B22C5CF95100C54BDD4D01BF4DE9477E1B5CDD9AE99B85EE9E8B8CE47C19010E9D94617AB6F86BF891DBABDED77630ABA69C3A06C58C6F4D2A1002B8B1969C6A60AF5B92BB638D36EBB00F2D9B922E32BDA403BB09349BA28B9480167F676C0BE7566CD1FC731BA5EA61035ABCDFDA7C03D533DB125A52D0F188793EDAD9DFDDFA9D3A4358FD64CF0F9B5E63A7C6A1BAFD289E86A33371709BAC00A4AFF61662F4C4BD759BC0E91A0C057823E9218105E10AEB2A6CCA9278441762B91BAEDDFC8F21FDFFD8914C76E45D03 -smlen = 2012 -sm = B21F725DF226FFC3A6DBEC90008BD3DB7F86C6AECB3E29E89901732C8CD7FE1AE237A3C880B3006F174CC97CD0AECF9421E03401C20EA0C2AC57B631ECA773CD01DCAB760DA1255B47049CCE0000206C3C5CB8DCFF9E466BE933011BF9651E9C6BDABD194B306B018381E94AA33C6BCBF1011286002E8BF60EE0FEB12B1ED92B4F014327141291000AA099B1D08301C527E37BBBCC0886B2831E15008A2AE0190E2DE0E1B437283001EF88418757BECFCEEAC7ED5401E61B48996344E7F1B4CA2C350130C0F4B12B863A9F145AD2AB0000AB6881BD222E6EC94CD9407ABE8B1BBC9B51E3E3A0C448964A07037C87C3165DEEA52598FFF7950165BEA932AA78034347819981710CDBFC582AE98D8FD326FAE96A1849EFE729A1173339D90C48C3A2B867135F1DFF5B497D05FD55130694B5F9C62D136647D767AE682A0F05C670CEECC03475FFD39E0BD4E45B720D9D7E8DD04E69C969627682AD83F48609F6E66D0BE99064988E4654E3913B7CAF1475622E211BC247B98E5BABA1B804E2BF651713197D8A610CC111BA5FD98A053408AD155DCB756D28A283BF3B20E6F3785DD5F105F8D7D9F2956064860B097C675630EDEE1F17E2EB0B26B6C20E260F9A5915D63F1BE2C74FB0B37013244481A2D0C581C4EE12516E0FD4701E9835C8526A490CB39E99FAE07C40236808F9605A63A5106C19517C3711CA4B9E8EDDC77B242575D904DBE64223CF14A8E39FEEDA9D6C5F9CD0D0719A7EB5EFA71453636F78CAB8262636FF1E136C787E38A43FAF02699C1F260EC45B068EDBEEBBB8A0E08CE282BF47D27A33216856F0C59E743DEB13397656FF17FC4B3C694B189C35E516BE719CDA6542260D1301DF93A5D93EE118F7CB0AC94D0364C9EA66718A4BC7F3D7ACFFA60AFB7100F7D97E98DFFE167D1D8E46C912D41EA057362C13B078CB1D9C443C1A57AC18C4566F5F5388F47A40CA49CDAAF34BD4C9A597FFBF7AB20D7CE88DD76A639E09ADA323C588B08140E9350268C1FF76079093A05CCF5E1613A70E6E37CD257875049A767332E5F7420F319F9AC78F97C0C4FA40B1EEF8C8B48045C78F73584590FE41F9F274DEA838DE75DADE66D04E9D9308CB0A9948320D28D9CA8F1F51E39FF3DE20FD5A2A267D127C317ACD51FB779E597A8DC7359D920548B8BCAD761C6B8012304E12628A2652D12A8161E538C20D582BF567E9C2B46B4CFE2D2DA31120C6DF50DF45C80513AA9EEE9F2613A221AA1D23F861C7F26AAC7813B7ED7278EB420A5C44F2A5879A2F1F9F11E14602762E3389B152C014EA9DDC9DDDE9ED1D6F74E7526F690EF37E71D448342C012E032C00E480A699ADE617434C12DA0E69139D0D9036743B9E2B9134B5086FCB96B193330ACE8E4F77148AD0F532E72E1792795080B54D7172FB9AF1972D00AE24D0B3D86528675B3BC8C7B80598D855B95A77667AD0F671F00039C08CC99F5644BB006BA9356B9C02BC935212C43490C741B0845CD7B4247592374AEAA1B589E670AC62777293870963B5132DCC27088F5DA5B831FA570766FA81C2A07B88BBD45B81992EDFD2A7FE934219B1F648DD8A414FA03EAFCD39E72BDF7D4F6B9C1F31A0A67DF03F6709F2BE0E7D1B1690C92CE7B8C6B1054270D796B16D6E445D24CB11229CB0F92DD81190A37838951AD28BE2AEEE6C5F63DA60A911AE0A24B1D05EF2F814FB30AAE8CA3BD9F01D4FABE5B279142AF948B0E6BBCCF7560107C161C816A0D8E61DD908445079BAAFB78C14F68B8B2BB241FB03C237A4CB250911142D0B460ACC75E6B0F58BF28546A4779EA7342238826F636A510CC9CFFEE8BB0292A58A07694C05672B560B26158A8566D01D0EEA0773E81F3F84376B29CE375FC56A0689A7CA5CE94B91814B62CBB61EA2EFCA0CE6712A941D612B0F700C56B46D464C2AAAB3F64A89CAA8561A1DAB2869D79DA1720274D031946C4C7715FB9C243DC95CCA7AECFF55EBA4044467EB922E93F57E3E39B93876A03936DFFDD2AF48D055C6C188F2F229812EC94F3FBDF7D7DB62E4274DC91718710EEC2CE034AEF266207C5CCBA21552D6FB8DDBEE8E931067010594A9E0CB37250F67281C0A369965367424D454CDD05D3C8F35A15F76B4C8C3FEE42F4C9CAD68849837DED3BE58730B94AE3A5F9146F90E03B4C0836381B3F9CCB5DE6BD2455D241BE9132EB6D4937FF27663F4CADAA9CDA193919F4CB0D0F727F6C7B26E831C3AC8DECC234D79D1B3BD28305E3012A3733AD718FDAB7DD1A6400BC47F47D20F627D2449DBFF10E37A62299E22E408A28A806D403CBEE19AFF6FA9B1814B35B9573ADC86F829A08893CFAE4A0212293447D3086E21BBA28049F3ED383519917B169E8A1B7DD64CEFE0DA643A97950A205CBFF6BD9334180556E84199F0B60738715CD69AAD7C882430578F6FBA4579D908F863CA54D0B9862EEA6ABED31301D183CF465B1A256CBD597A629307A8A890F11C23DBFF895B932E9CD2F5F06A4183D6F2D61117126FCD2CE2B86BB44A9A5B402E3EEDBE4ED1DF11716E91A2302CB72D8F0DAE132E16311C80DCA041694AF1EF63F659959FCAA133D9E5668F94D0489311AF3BAD379DE17793BB3EE8A284529A72CDEC474B3A82D92C6CB21C63017F262E0D7DD47AA5C58F5E23F8A37F00D5438717F05BB974F18A5D3E1CA054EA053C30B34FBFAEE88BC0195F061AC32F5B71B2A8A3ED4B8BC4EDAB40A6396C052DCE72E10768526C00610E96DF38AA70938CF844CF445D8E2BF73C4F32A742812D8C1DB53AFC6B6C0A4BC67C3CF7579702312D6C89BF14E9585D2C624D07FEB4B5B57F8E4C5CFDA69A5E922CC1E9 - -count = 53 -seed = 7031BA806F4D8BC28529163B239E0EE836871C51D2D62B601B71D6F2B69B203C81440F8FFC09C3AAD94DB1D880160671 -mlen = 1782 -msg = 6103E5B22F934203B5CA87337095C9A19267AFB9695D309BEB8A557BB7CC90332C4A03E1D416D397B945B607268F545928104CFFD71B02864E010B666CFCB68B762FA5EC839B5AEFD0407419441B38E6D881BD5218DF73C675DF101BF2C53D90FF86D4A3C7DB19EC9CAC044E0467A36337AAEEC32217FAF86CBD7BC2B663421754CFF1200A8A66E18F812868BC8D1C8CA495E6462DA4B8B96D4167F040F04927A7C27AD35CF174D42684ED55AC80D14CBE4CC2570642DDEC4F44880D967E9AF77EE27D0D3DBAEC9067FB6FC957AC4A136C1D564E17F59AC4938D43FB9050D810989907125C47FCEA6C162C723E79F68339CD1B3BF596988BD6E215271385CD50616868C6BF40FDC34BD30E5A00773E2C039723F2AC3A3FA45F4CE870841762D7435BD6CCC5FD3D58FE059EE455A806FDE89155C84797FBB73691A1FC6921859E99066A3239E31F28D1A46100DB1917621D9E61473CF1E71F9850B584B459D5690941E676A7DD56796313ED9ABDBE03DC75AFC1430DBA27FE0F8DF48EF7C339F462AF1A6D30A5F8B480DFBBE860C4C0BC136393C8FA0875AF454273C3CFDBA7EEA44EEF1A4060136948CD98B9D2C19AEA4934F3455F31DD15BE6545134F17A195B6BC409159C0975E592A15E86CA4943CCACF4B46719A072DB8C629B67768F1956F8158F179A0B645320489DEE404C8D0C4E786CFF39B324053F102C118E7D51173CEC0FDD017F213B2B07AC6B2C7DEC04172DD5396A020EDFB74ED86FC31952D241A7C3D139DEF543D90976AA70599792E73CF73AD0BD4A359BF60DFB2CE96A784D8DE5E23A95E831CA6FFBA6B187BC5F29A7757185EC06AC882572EC6283A1875B54FE4F295E1970BF311DBABAF9F894D3364D68F529C4EF9030AB934BCB09459D5AAC61919946FD28DF1AC85876F979E8B8528E9BBE69F03DEEF136EEA6A8FC86F31BD64285C8C9F49ADF53A8BAA7867CE52E72DC4A63929DF3BA2662DC77D71F88D8AF42B8D67AD54884EE11F5A6B3B794F7D5610909B0B740937587CF475DA903159994A262B6F32A3D1723FDAAE65E636B71CB0EF0A744F359BF08AC8231ED2970CE8C451266F703DA3B57F85ACEED4C1C174C50D9C226F028E972AC124FAA6F60518699CB4C499220EA51A538F9EDE67D0E98E1BF8FB4B24B1D8EF50A28A93E20076F8FB812CDAB04871D331FF434BA66DD4577B18DC3F471B3E96A174B58A7AC2470EB8463A71FFCBA2D064470FD2D4E15F9491DB09DF3E3BA376A3DDCC437312BE5848DB3B9079F2AE046798473BB970D725E1D7C6FDF405AE387DD7CC1735A7FC27D1A476592A514B87C9017E1E5D37E338F37916F3C72C5F2AF75185B88694D4E8E0A93FBF20CE81A7A0C10D55737B6473FBD92BBB39FEBC6167336BEB9C235997796B9C0DC18C353E80305175BB412ACC29E647813D0003F727ED0577A7C14BCF67173DA569320E887BDC8F5AD27FD8864261E802A6753C6F9BAC844B5900ED0D4274C0E6EDE42367079188B10BED5999501164FA4C5A818ED6EE229C3E0E0F7804B19EAF5D1132BE1D7FC18BE834C842B21F8DDB11F8CFAAC10D2E124981ED698EE7CACA211C5624F09C62E1D451429048B55ED0F8A714BB77A0D4B40F0A446EDDFB27602B7BF894805C4AAD9252658F6B21A05DC0CF6A3ACDC227FA867A4E5B1DB63A14DE26A79AACF1900A7B7D867C15CFD1DAA712F2A1E2A6C7B31B121465539CD0164E3CCF79A978B543AE9602996448C6F68069D044FC958911EF40B0B9AFC78ED014D94571F6771EA5E2306A7CAC32C135FEC0BBF1DCA3CB0B57DAA239C01671718017C907048E0D19515CBF430D4B3B4FF4FC9A391D15A38B39C4E528FAC04EBD3DC69144C98AFA75102D21FF961BAD2E1F25562AF92554814405C4EC08DAE4A0CD28BE592C9C9BF997CC0FE31502DD541000D4640D59654D26CA2A17BA4CAB0518EE097C05B2984FFC56E8182368E216768E0D07E17FB64003E95194D04C6E00E08386084FEBB6CBC841E8F3FE2A069C45554BC502C27591CA3C1DC9E6B1694BA2C1BC0713C1CF738DB22FFEEB7443D72D5BDB975D192976A58AB33DB58F5DAE497A0B24011E15E3256FF124DD99AF6FC300D1FECDCEE18DD4FBF25E901125D4E80EFA8E2A211701B74FD992E63376996994E054CC00E7E1DE7DB8E7D2898A735EC4920DBEFAAEA66B456CF6A12324C5D56762313A627B3523AB1E2C1C82E4FBAB136AE4395FCF2672A58011D96BBDCF2A7478305756D66B30A4AC44E48B18A5964AA89F14187EA114084D52B4BA77755BA04C34777409BDB782B7B645E93B4DB284525E2F9C9C38D73B475DDE2251277A2E6C3183D5DEA78414E22CC8FB4B2C7EFA797CD4A87AC81D3242EC8D2C2EFD6BCFD69C39F14B0B365F3151A96F75454A3A1400C76A4390FE9F2E7A22A0CFA687A5BEF1C905D3A893B0DFD35BDA184F25E62FDDC2A52B6A67E76F550ABE4CC8D1D63CC8631E4CC315E46D3015C3B8636B92B8D07075D401C654FB4A -pk = FFB4EA24E3E743581E84A1C31B3EC7177E1C5424168D84241AF68AFC49BEBD3042F4A9BFDD08CEA0157A250E4F10730189EE4E80C633DC34BB201A5D0E49008D6E558A7CA44D29D85B35CE06F8F3D4F6C427BD859FF91526E8E6C661B21F9003 -sk = FFB4EA24E3E743581E84A1C31B3EC7177E1C5424168D84241AF68AFC49BEBD3042F4A9BFDD08CEA0157A250E4F10730189EE4E80C633DC34BB201A5D0E49008D6E558A7CA44D29D85B35CE06F8F3D4F6C427BD859FF91526E8E6C661B21F90030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FA89D776AF830E0FFE8F39E6109C119F3C47698677C575954E4977CE460AF3A7DCC12931D3C3A62A327E316B62A68FA80307D8371CCB7D2054ADF62A0FAA29EFBF800F00000000000000C73F54B28437ACE7354F2C70AEE72AD80C6EA2E6F9F6C63E601CA445C3C4481705B1C030FB2F19975D12A86284F6CAC4D2855B0E72E1D685A0517CD3F0FB2AE8BBFFE7FFFFFFFFFFFFFF2793E51A98F76CBF16D761DCF605D919C7426F2CC8DD7CCAD68E9C4A8462F58D2B301EB8727996108BCC16FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA21031EEE3C55255676C483D6768AF89186DED03692F88361A3D3944F6989EC95EE4ADC7BACE4AA413C2A01000000000000000000000000000000000000000000000000000000000000CD08533A0EF010AD75F41BFAF9D4459EAB0F1868BD4DABA9895F888BCD655A719C05EE6177C2E0F4A46FC7AC7981100323106F06FA60FD5DB9884433E3A846B80692FE05C6C2215A8C459356616F277FC38B5FAE4379A9B749368430E7787300AC49CE0D37A88705620BEE2FB422DBC22D1F2664F87A7396C5190C7254CE00938EB2F40785DB2CECDC0AD3CBD6FEFB00EF05A5FE4CD75A670245236255757F1F0DFE904D6907081CC464151DFF2789C4039F33A47C3EB55139B8437E7846F502ECB4BA86E3068F548FE9E61BF57546500D0D671015BAEEFCE230E8489A0822D76EDBA0E4812D9AF88067E1B524A89C037CE382B198E34BD025CA1A59D3593918ED3DF01587C49D1435D99FD1F0AA7FCE10A5E461B1B327EB7B46AECCF10C40027C3E7461FD32BCF77D32D089A14EC4827D085ED75C8719350DCA98461AD8199AFE8BB827752607E8BA2B1629DA5D3503E719FBBBCFCAED325AA9C46C1DCF14D97E545CF9F288B9C9AB4E9FCC50E0BB88F65ED97AAC2EF45D306156FA5EC11903D807F4631F385FD768F168B8108E7CB88E667106C1C82160AAF091D4AAB0C24867864F15639030814CB7183D042BF5012370DEC7E9108DA37F0753F6D52FCC21A3E9491C617CFFB13E9705226642BE386DBB16329A0365D5D44805C082B190000BBC4727F2D3578D55F8AF7EB1DF34ACFD38D691CAFD2418B6AEFD8E412AB6558C4EDEAB6D665B69A759F406537D46032BBDD65B964E546C82F8904C6FB4FD3DC08D176C9BA1F98784040E5FA92BCA457903D7D9088CDEBF38E397C8DB3FE000F4722D6F78CC895E940AE149D886A619AFC1E363B5B3794ADA5189C94AADB639B76E943EF7393C5300834DD20D73A5002C9F3BA4DCC5FDD1A88AF123604DE6972FCE83C6F00B5A53E1256BC043DB9B9337888B6427B3B37847DF34AC8064E402 -smlen = 2045 -sm = 4179A2653654C1220962074900F0233DB38F3ADE1AAF1FDEE7004556FF3B6E43A5178EC50B3501081FEA662477A8EA9F42043501EEB1C3310D8A286259C6B3B1013C23479E339F4ED85DD1198A013A3366F308F0B0C95F700C9A01D1D85CB8F558C7A9C3D2934C01E620F4DCBFE5F4D3C89EF41D0132B8AD6644BCFDE060A65EAB016DE746C2D77069F86F8A8B6F01F5D74E99F438B9018338E67801A234A322C465F3A2D8CF9BCF01022C8E35703F9988376BB41C00468B477D47E3DFE40BBDDC7B00FA03698086364EBC9D31E1B4000175E9E924B415606977D37CD4E798D74AADA85451A4B0CCF2C604037BA07062106D09BD627F283C008E1691250292C7C1BB8760F6BF0B6103E5B22F934203B5CA87337095C9A19267AFB9695D309BEB8A557BB7CC90332C4A03E1D416D397B945B607268F545928104CFFD71B02864E010B666CFCB68B762FA5EC839B5AEFD0407419441B38E6D881BD5218DF73C675DF101BF2C53D90FF86D4A3C7DB19EC9CAC044E0467A36337AAEEC32217FAF86CBD7BC2B663421754CFF1200A8A66E18F812868BC8D1C8CA495E6462DA4B8B96D4167F040F04927A7C27AD35CF174D42684ED55AC80D14CBE4CC2570642DDEC4F44880D967E9AF77EE27D0D3DBAEC9067FB6FC957AC4A136C1D564E17F59AC4938D43FB9050D810989907125C47FCEA6C162C723E79F68339CD1B3BF596988BD6E215271385CD50616868C6BF40FDC34BD30E5A00773E2C039723F2AC3A3FA45F4CE870841762D7435BD6CCC5FD3D58FE059EE455A806FDE89155C84797FBB73691A1FC6921859E99066A3239E31F28D1A46100DB1917621D9E61473CF1E71F9850B584B459D5690941E676A7DD56796313ED9ABDBE03DC75AFC1430DBA27FE0F8DF48EF7C339F462AF1A6D30A5F8B480DFBBE860C4C0BC136393C8FA0875AF454273C3CFDBA7EEA44EEF1A4060136948CD98B9D2C19AEA4934F3455F31DD15BE6545134F17A195B6BC409159C0975E592A15E86CA4943CCACF4B46719A072DB8C629B67768F1956F8158F179A0B645320489DEE404C8D0C4E786CFF39B324053F102C118E7D51173CEC0FDD017F213B2B07AC6B2C7DEC04172DD5396A020EDFB74ED86FC31952D241A7C3D139DEF543D90976AA70599792E73CF73AD0BD4A359BF60DFB2CE96A784D8DE5E23A95E831CA6FFBA6B187BC5F29A7757185EC06AC882572EC6283A1875B54FE4F295E1970BF311DBABAF9F894D3364D68F529C4EF9030AB934BCB09459D5AAC61919946FD28DF1AC85876F979E8B8528E9BBE69F03DEEF136EEA6A8FC86F31BD64285C8C9F49ADF53A8BAA7867CE52E72DC4A63929DF3BA2662DC77D71F88D8AF42B8D67AD54884EE11F5A6B3B794F7D5610909B0B740937587CF475DA903159994A262B6F32A3D1723FDAAE65E636B71CB0EF0A744F359BF08AC8231ED2970CE8C451266F703DA3B57F85ACEED4C1C174C50D9C226F028E972AC124FAA6F60518699CB4C499220EA51A538F9EDE67D0E98E1BF8FB4B24B1D8EF50A28A93E20076F8FB812CDAB04871D331FF434BA66DD4577B18DC3F471B3E96A174B58A7AC2470EB8463A71FFCBA2D064470FD2D4E15F9491DB09DF3E3BA376A3DDCC437312BE5848DB3B9079F2AE046798473BB970D725E1D7C6FDF405AE387DD7CC1735A7FC27D1A476592A514B87C9017E1E5D37E338F37916F3C72C5F2AF75185B88694D4E8E0A93FBF20CE81A7A0C10D55737B6473FBD92BBB39FEBC6167336BEB9C235997796B9C0DC18C353E80305175BB412ACC29E647813D0003F727ED0577A7C14BCF67173DA569320E887BDC8F5AD27FD8864261E802A6753C6F9BAC844B5900ED0D4274C0E6EDE42367079188B10BED5999501164FA4C5A818ED6EE229C3E0E0F7804B19EAF5D1132BE1D7FC18BE834C842B21F8DDB11F8CFAAC10D2E124981ED698EE7CACA211C5624F09C62E1D451429048B55ED0F8A714BB77A0D4B40F0A446EDDFB27602B7BF894805C4AAD9252658F6B21A05DC0CF6A3ACDC227FA867A4E5B1DB63A14DE26A79AACF1900A7B7D867C15CFD1DAA712F2A1E2A6C7B31B121465539CD0164E3CCF79A978B543AE9602996448C6F68069D044FC958911EF40B0B9AFC78ED014D94571F6771EA5E2306A7CAC32C135FEC0BBF1DCA3CB0B57DAA239C01671718017C907048E0D19515CBF430D4B3B4FF4FC9A391D15A38B39C4E528FAC04EBD3DC69144C98AFA75102D21FF961BAD2E1F25562AF92554814405C4EC08DAE4A0CD28BE592C9C9BF997CC0FE31502DD541000D4640D59654D26CA2A17BA4CAB0518EE097C05B2984FFC56E8182368E216768E0D07E17FB64003E95194D04C6E00E08386084FEBB6CBC841E8F3FE2A069C45554BC502C27591CA3C1DC9E6B1694BA2C1BC0713C1CF738DB22FFEEB7443D72D5BDB975D192976A58AB33DB58F5DAE497A0B24011E15E3256FF124DD99AF6FC300D1FECDCEE18DD4FBF25E901125D4E80EFA8E2A211701B74FD992E63376996994E054CC00E7E1DE7DB8E7D2898A735EC4920DBEFAAEA66B456CF6A12324C5D56762313A627B3523AB1E2C1C82E4FBAB136AE4395FCF2672A58011D96BBDCF2A7478305756D66B30A4AC44E48B18A5964AA89F14187EA114084D52B4BA77755BA04C34777409BDB782B7B645E93B4DB284525E2F9C9C38D73B475DDE2251277A2E6C3183D5DEA78414E22CC8FB4B2C7EFA797CD4A87AC81D3242EC8D2C2EFD6BCFD69C39F14B0B365F3151A96F75454A3A1400C76A4390FE9F2E7A22A0CFA687A5BEF1C905D3A893B0DFD35BDA184F25E62FDDC2A52B6A67E76F550ABE4CC8D1D63CC8631E4CC315E46D3015C3B8636B92B8D07075D401C654FB4A - -count = 54 -seed = C8671A5D752CC6DDF075C899797603A625C142485EAC3D57CAF14F2244D7F84D116B28F959912A758E519D588A6A07EB -mlen = 1815 -msg = 3EAC87B3D642CEAA3DC904AC3C4245CB2A260E4B74D0394D33D4B71024144180A727F80B092305F31B2526998EDF6F98E46933FDAF0E8709E98D54F13C2701C58BBE35292FD3334C5E03D345A9A2EA1E01B2C4573567FF1FF3BA7406A16F5A5805EDD760AC78A3AB8602E415F67C7CEA5B36421C79F83CBB14FA775448A832A4B28851CE215C11DCBAEE652CDD7342B6B1204727479E6208FB556CF08BF7EE230F32659E829CE4FBCE0955D01D36624BBAC18C1D25A3E187722F8F74C88B56E518CF0E78B3B0EAC56D8F13C4AFC4DA3613A41CCC2B0B0E2EBBFE5799E479F81335360D483596E9AE926751EC9B956555F271C2CCD85F0F6C1BBB2C326C29B5DDF6B5C4C11F8EED15C0143993FEB626543E92CE4D66C0BD28C79ED1ECB793A3091D6B9AB510B0D41AA42D70C2D8F26EA0B826C8C375E1DD89B3E2A48FE5D88A462DEAC33BAC35AA32EBC010AF7E47B77AD23653D747760914E0CA12864CD401787EFD96F30D82D8907DC68578067703DD19B2377DF319EB540E8AE78B2BE86BEE1C915FF3B2F4B25C0AC22CCF89BD85371961944D8A4E6D20E2D3E9DF3A07D3BF6986898786F0667545275FAC3EB0F069B457D8EBBE5F60125F94756DB04EA203451A0DE160CBCE2A34650D92F200448B097691A61361AC487FBC3C82B2BD7C1ACCA02031311971C3CF69BA459A0B640A702DB4467973713A6F2466560FFAC0592D64FF1D4A935220826EB559CFE0144EA4B8E54EAF67DDF91988DD4B3749C865008C0C1CF98BBF76D929B85C8C426C15FA56706984E0F2E90658FA3CC33EC9FC700976870C94035ECF9A0534B18D07F55923663835416E40235CC2550BD9822F0912CF101F86039830AD9102AA4A3B6777EDEC5EBE621082FCF81A1C6A528F0324EC9D39FA80B6E87D6366E7EDAA0E14337D6708F7C3D2FB1978F4F5CD594FD35B267F9CD09370D3366DCE286CCB9647A1944F8D8BE63E5EF8F6108CC5E9AFE9127DA84E1913439EC35A4E17F7782DF042DC2F7C5CAD8A659DB282E61763539B56C2AFA0F2B507D549EC8C9E76C7DB306380CD7B46C9699B6DB8BE06CCA15E8E83763137B06BFF02DE2738A46C61B70EDF4F394D54D0453DABF689FB6BA41616BC589CB9847224E74F919B6E03672EC6A52584FE81456D6E648DD6F0F9B068EB72241F067BF6B891A498A9A59356C735E10EFB37B3ECF47CC5620A35442DD81E25D2C6DB0E9E871301ADD193D628B30E3B4345751BC17E0B5B05AF758A653DE7BED3763303FFE1AF05E407F296C736CA6F4C348B25718C7A814BD0730AFFC057842AF3D9B9ADB12FCCD740ADD16218AA57E43835821A2BCD70F1027F3042D4A92F10D0A1FB8323E87869BFA8DA24DA75F8743FA3038C24FEDC0C987065421BF4B300BE3ED3F6D6D590968D3EE32A8F5E20EA6168756AA18BB78B6AA48C299C36D0E78B6F84CACAB5946C69179E461F4C2DD201D8032A29EC6C52942AC37D9C76AB4A401C9AFF96284E1E9E39BFF6D912CA33B6118067605EA65D7F611DD963F4F75F97346FFFD1DF84C79CCBA06804B3017775D8C0BF614FCF4D824709557937B22E1805A0A961ECF226F26E3706362BF6D8D1DD30BE7EEDA481A64961641DC57B9F0211F8EE43578E4C2B6507114DFFF3C3F884586BFD1278D117F7C6014FD5980CDF1E2FD1F34CCAD170842B9E819C22FAB9890AE265C3BB6946FCCFE218544D00A6BA5BEF5224EAE24002B6E83E0B35E98C2322BE2EB3D8234BE8B048C54E40782C9A24D7A8B461EC05F38A94AAEF3DA3B46D0D85B0D949CF1089408189FF97C56C7DEE50A004AEAD82C15C7C0D0965F3C65A9A715A65D29CD3614954EBD91EEB4E74F862FBC944C56F2EDEC4D344F92E8154708AD0F5575880503EF0F107A9A9DB99BAE82357C16578F3E6CBDF9B427DA88DC322D11C6AB2A6AE6F5179C94454E09DF5CAA6A519A4C1903C8F2925639E12AF793695F256BF0E55E0D45B73880358F09719ED89A4A1A07868BFBF16095A20035D5D4F99FDA19DDAE3E21CB98308F4508B5CEE706C27898F03A2BF14F29ACBF055E4AB0713A7B6FC1A7853EFD36E1290E69587FEC15D492A66B9A4FEA6E2BCDE61E02FE18E06F59A2F4E06F177B14CE4C1CF1A8D1F49C554A8A4C68B9937B4C230320C80753D4B071BAB2DEDA89C9181820336F1E766E447EA1C44E15CBB7C002C1813D2C1726DB0E4DE289466077DA9610E5F3AA313B1B01DD79A4056A8BBE9D843CE5B0439325FFDFE91FDADDEC6CB86D5CEBB68D8F9C0ED237A4648C412780ACFF48FD9CE817EA70D950DCB989EA6B11FD87EA4F30347A27488C5C15BE7FD6D1280FEA3A7C022F8D9881FAC93176DB2025B4C7914A51099893A791BF5BE851F325347484CA6ED51B2BA71548A6046EA7EC85B31A9967E7D119D2CA3A51C1E14D5A3EEF0D41BDD615DA01D45979007A1997DE281BC340C3203D5BC0075B1AA38873A9DBB9D18E6E26971E70B54E41E2C8C91D2E60FBF85435C1EBC4893C45A201B1D2391549F52A1CA3E0440ADFB746FBBF0D9933F9FA0220B3E04EBEBB29D2A9AC1 -pk = F652B3FE6D86C39D18397348BE8B83C257EB3037B9C6D4CECAF6845C6F88D21F39AB315C9B3A5EB8D80D7F197885A9016221C6F0E7850B526A4A2DAA3406D12580631D74CBDDEEFA9FCF6A4EF3FCB417A88F3AEE4FC0BB5FA0A5F143911F8400 -sk = F652B3FE6D86C39D18397348BE8B83C257EB3037B9C6D4CECAF6845C6F88D21F39AB315C9B3A5EB8D80D7F197885A9016221C6F0E7850B526A4A2DAA3406D12580631D74CBDDEEFA9FCF6A4EF3FCB417A88F3AEE4FC0BB5FA0A5F143911F84000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CB88DD90E881B4F8CD9C4A9BF3650A50384B96474DB292E52FFEC1AC02FE4F0B20980591F791A7F4BFDF2C4AE96507C10E5FE7CEC58FF4BFB3CBA1A384933AE199DEF3FFFFFFFFFFFFFF56F1BB3D81D127A60455F6AA7C2954CD0C000B3169E73DC3B8F09AD5F701C17FDB8D7FEF46BCAC71EF98BAB67558A771D21BAB66C5B6BE3B4ADCC69E5804723DF3BBD5FFFFFFFFFFFFFFCA8ACE57ADC73986D05B717A00AF3B0F05AE7A01F09913A142D2BCFB7C434BF262AA8C9513FC30AF1E8F82FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B8BF3DEED21CB807DE4F6327E6407AA2FA9904957A44283A71096490677A771F8E450ADE7E1EAA4CAFDD4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF704902571162B196A389FCF5AB3184FCF67BC95201C5BB7CA1EBD1D36D4BAB7FFE9C14D7B1159823CD2E8F46B44E6D033C7BE035CB4C2BE677EDEC10540BA0F76FDEB83DAB1FAE6A1D30C0C28784B30D8C5C14AF79F32D8D892D62CF3F3C8E00D80AE7FBA2FC34456F52952B02114AA2477AF195DDFEF68A44ABB602BB71FB3813C0EDC9DEC60897058CD7AD4C3BB902E2BA16E3B2BA832F24B0099451705E2DE14CDA6E16129471EA914A9A3B368684105F727EFF354F23215C688BB359710047C67667E94A8CB2E2C24E508A637F9D3BB1AE7E8B35B17114A01301C6498140EBEE692EA55CE4784FB6A9FCBA8B260224B74CB42D56EB7C7121269253D721B6C80C05A9C54945ABC4C423BF7F4FDC968200AD848AE0C8CE844F1D297A8ADB02BBEF48D9EB2ABEAD3654397587ACF77701E68EC49B375AA49FEA293D3F502848B62BE775583BFBB9C19FA6A9DAB5D40148E7E75AB18726FAE00130525871A222780AABE8664E5B34E2031BDF7958086B1EE26FE2A0826BF4306577A0FCB4E801A3700202F10EFEAED96284E2F9BDA523C01206C0CF565A9E68C00A33ABF94921A5FE3A91AF46D0968127798CC08D8B014205B3569AA1655BFA4B2C6A373298D8856F231DE36C0F0A6D6BBA5A16BA7229EAFAE7CCDD4804DC940DC001E23D740177FEFCCDF42C7C701B05512D5D622C3C29D873C2842EC3A601E333F2049CEA2DC35AB1278F0EF089DA0CC07C92DFDB03D9FF5782BBF7C4A8D8697CCA6FB35812A066EEA3580D81060258680DA23429A7EF8EF1B0FF5E2C0AE6CC67152463B900166E6A4B75F95E05FB97F5D14B8075E9C644245378AF1544644D735C4B1A1C68CE76F3335FB24C5BF9420273184D0302EDECF0071C58CDEBF292E8E89B9B25AC032DA7BAC76D52FBBEF0D70863B3B29AF05B1F149147C90493D0CBE4D0B80201 -smlen = 2078 -sm = 932D3B1AC4048E06F9596D28001DE0EEA24C150D334E1C496B01DFC3A57BF2108BD07BD428E00001D272389085A69229E1045200288BD87A5785A90E89AB5F0D017DAA9AEFFB9611698DD70EE50015FD3F3B5779E05D554F326701D66EA1B2FB5D6B8EAFF9FD5400A0C5C11A57CB7C96038E1F5B0031906BE452E050212BBF45DF0085623D60685B43EE68752BDE0183D27FD973488938A330F6CB0090658A25209519F5827D958001340A22B757A5CAB464163761002765693C6388591A0CCD4A99019808F0B34C342209FD85DB540101E9D4F1F5BEC5F5A955E7148A138AA6EF14AE5D804A0DB7E6FB120328F5B55BAFB10522EC8322AB004547841AF47E6BE95EF0543408013EAC87B3D642CEAA3DC904AC3C4245CB2A260E4B74D0394D33D4B71024144180A727F80B092305F31B2526998EDF6F98E46933FDAF0E8709E98D54F13C2701C58BBE35292FD3334C5E03D345A9A2EA1E01B2C4573567FF1FF3BA7406A16F5A5805EDD760AC78A3AB8602E415F67C7CEA5B36421C79F83CBB14FA775448A832A4B28851CE215C11DCBAEE652CDD7342B6B1204727479E6208FB556CF08BF7EE230F32659E829CE4FBCE0955D01D36624BBAC18C1D25A3E187722F8F74C88B56E518CF0E78B3B0EAC56D8F13C4AFC4DA3613A41CCC2B0B0E2EBBFE5799E479F81335360D483596E9AE926751EC9B956555F271C2CCD85F0F6C1BBB2C326C29B5DDF6B5C4C11F8EED15C0143993FEB626543E92CE4D66C0BD28C79ED1ECB793A3091D6B9AB510B0D41AA42D70C2D8F26EA0B826C8C375E1DD89B3E2A48FE5D88A462DEAC33BAC35AA32EBC010AF7E47B77AD23653D747760914E0CA12864CD401787EFD96F30D82D8907DC68578067703DD19B2377DF319EB540E8AE78B2BE86BEE1C915FF3B2F4B25C0AC22CCF89BD85371961944D8A4E6D20E2D3E9DF3A07D3BF6986898786F0667545275FAC3EB0F069B457D8EBBE5F60125F94756DB04EA203451A0DE160CBCE2A34650D92F200448B097691A61361AC487FBC3C82B2BD7C1ACCA02031311971C3CF69BA459A0B640A702DB4467973713A6F2466560FFAC0592D64FF1D4A935220826EB559CFE0144EA4B8E54EAF67DDF91988DD4B3749C865008C0C1CF98BBF76D929B85C8C426C15FA56706984E0F2E90658FA3CC33EC9FC700976870C94035ECF9A0534B18D07F55923663835416E40235CC2550BD9822F0912CF101F86039830AD9102AA4A3B6777EDEC5EBE621082FCF81A1C6A528F0324EC9D39FA80B6E87D6366E7EDAA0E14337D6708F7C3D2FB1978F4F5CD594FD35B267F9CD09370D3366DCE286CCB9647A1944F8D8BE63E5EF8F6108CC5E9AFE9127DA84E1913439EC35A4E17F7782DF042DC2F7C5CAD8A659DB282E61763539B56C2AFA0F2B507D549EC8C9E76C7DB306380CD7B46C9699B6DB8BE06CCA15E8E83763137B06BFF02DE2738A46C61B70EDF4F394D54D0453DABF689FB6BA41616BC589CB9847224E74F919B6E03672EC6A52584FE81456D6E648DD6F0F9B068EB72241F067BF6B891A498A9A59356C735E10EFB37B3ECF47CC5620A35442DD81E25D2C6DB0E9E871301ADD193D628B30E3B4345751BC17E0B5B05AF758A653DE7BED3763303FFE1AF05E407F296C736CA6F4C348B25718C7A814BD0730AFFC057842AF3D9B9ADB12FCCD740ADD16218AA57E43835821A2BCD70F1027F3042D4A92F10D0A1FB8323E87869BFA8DA24DA75F8743FA3038C24FEDC0C987065421BF4B300BE3ED3F6D6D590968D3EE32A8F5E20EA6168756AA18BB78B6AA48C299C36D0E78B6F84CACAB5946C69179E461F4C2DD201D8032A29EC6C52942AC37D9C76AB4A401C9AFF96284E1E9E39BFF6D912CA33B6118067605EA65D7F611DD963F4F75F97346FFFD1DF84C79CCBA06804B3017775D8C0BF614FCF4D824709557937B22E1805A0A961ECF226F26E3706362BF6D8D1DD30BE7EEDA481A64961641DC57B9F0211F8EE43578E4C2B6507114DFFF3C3F884586BFD1278D117F7C6014FD5980CDF1E2FD1F34CCAD170842B9E819C22FAB9890AE265C3BB6946FCCFE218544D00A6BA5BEF5224EAE24002B6E83E0B35E98C2322BE2EB3D8234BE8B048C54E40782C9A24D7A8B461EC05F38A94AAEF3DA3B46D0D85B0D949CF1089408189FF97C56C7DEE50A004AEAD82C15C7C0D0965F3C65A9A715A65D29CD3614954EBD91EEB4E74F862FBC944C56F2EDEC4D344F92E8154708AD0F5575880503EF0F107A9A9DB99BAE82357C16578F3E6CBDF9B427DA88DC322D11C6AB2A6AE6F5179C94454E09DF5CAA6A519A4C1903C8F2925639E12AF793695F256BF0E55E0D45B73880358F09719ED89A4A1A07868BFBF16095A20035D5D4F99FDA19DDAE3E21CB98308F4508B5CEE706C27898F03A2BF14F29ACBF055E4AB0713A7B6FC1A7853EFD36E1290E69587FEC15D492A66B9A4FEA6E2BCDE61E02FE18E06F59A2F4E06F177B14CE4C1CF1A8D1F49C554A8A4C68B9937B4C230320C80753D4B071BAB2DEDA89C9181820336F1E766E447EA1C44E15CBB7C002C1813D2C1726DB0E4DE289466077DA9610E5F3AA313B1B01DD79A4056A8BBE9D843CE5B0439325FFDFE91FDADDEC6CB86D5CEBB68D8F9C0ED237A4648C412780ACFF48FD9CE817EA70D950DCB989EA6B11FD87EA4F30347A27488C5C15BE7FD6D1280FEA3A7C022F8D9881FAC93176DB2025B4C7914A51099893A791BF5BE851F325347484CA6ED51B2BA71548A6046EA7EC85B31A9967E7D119D2CA3A51C1E14D5A3EEF0D41BDD615DA01D45979007A1997DE281BC340C3203D5BC0075B1AA38873A9DBB9D18E6E26971E70B54E41E2C8C91D2E60FBF85435C1EBC4893C45A201B1D2391549F52A1CA3E0440ADFB746FBBF0D9933F9FA0220B3E04EBEBB29D2A9AC1 - -count = 55 -seed = D780D7688AF364949A196657A066BD48FFA8DC45B4885279B6DEF362E5957F398CDCE1D20FC3F8F63A275C325FCCE654 -mlen = 1848 -msg = BAA4A41E4B68FE333FFA5EE97FD3DE18F0EECE8EB83E46A8E3505E2EF8AEA2C4040BA3809A764B681EC7449F41A2463651A8CC6DEF0E4A058EB843EF016E5CBA8D55F925E66524BE55CB98FC3169082E52E0D6CC3600C4E8A560B6D448A72CCC95620101323F98B43E28D6357414185ECB0263C7BB94E7F86146661FC897844CF52873114D39123260893DEF13516F982783B927864B61B56D3A8E5B4705DA3A95F6D12A6637C9CED02F07B4AA0B08B4924103036C2A93B31C91EBB6C5B77DE090EBF60A04191EB6CE9CC9B550F5B0C9104B74D15358854181C0C5640FC74CAEE14FED6577FD75EECA14070B6D02A9A421247A5BB262D6E62B04649E75BBD3ED8E72752289FA7C1A68096DD96A4BAC8A2DC27C44881DD2416387D74A005680A3D229D562D3DAAF8DC37B4C87CC86A8C991E9327CDD43BA930CDD8D1E44AEFB084B51111965C5DFB0EE2F09112B070CBFC545119ABA823EB3F65F26BCC025B39F79BE42C0396C5FC9FC924EF1B7EE9DDB71B6E69B579C0A64C5B020206CD3515B8D5F4FF29378B9580D282F7E5ECEEB5CE9C09A7B334E62151100CD658DFFFA66F4091231BEA6C9DE8129EC4F5FBE8BE0FF4BC93367DC69D9E38C177B23AFBA5C27FEE3E2B73C0037DD7C419C854DF7C2412349BAB43869469E80527C3AD3A7103152F9E0B03353A596002FF54ABA8B14AC393EE52EB5564D63BC2738D571FA3C255ABD20102BB299441B00EB988F3A5CFB238EF8C49963B4AE8877E6B317E208821510BF446CE6B06C33717C91C460924248382159198F09D0F5A25C1611B2D39CC6D2ED149FDF0E09A0B0B2BB77067182E386F5F6A55B68808DAD98E5CEB0FDFAE6A0315845ACC7B9C172B0E82190A5EB7C58DE4F86D883292A883045C62D6A1B3C886C345AA6158276EFA6B93AB2188E47ABDD25D332146E980E1B1E043CF63EE35A5AA01AB6CC62F77699DCA16FA30E3632DC5CCD3253D01E547746C78021AC307F0EF1A0119AD11504803EDAD933150981C4D9FD181835C507651DC92A86737E3AFD0EB4DDEF6182872FBD31BFC6D8427C2F4D3A39BCBE6B5120B8CF2AF5DC59949C92D10B1C6A96810564DD335E0755F9DE25EC26C102355688C38250DF8F96E105136855C8DE4BDCD86DF03F92977DA16908CAEEB4056F4A5F751A57BA057AC0309F1C107E594CF3C31544E4F1D93FB9AE7E1A2451E7082CF0C850990EE71ADE0498F6A3852DC4FC128BFDB8ABDDA3D759C8D4F83FED8509CDE5EED38410FB9F0A5F30EA45C9270BA2395DF645AAEE03F56158685A0BA65DE3D2C5209A7EF4BDD4BBE0CDC966DD1BDF1FE0BE06C7115F7CCD80F8012E5D17955AE0C9E4220076882F30DC5E391295994B9F809C09DBED8CCDFC89669F40492944FF20948080A4ED66AD8166B613AB2F4414762AE493EA6661950E8E56B3758A77CDBCFBF24FBBBF20EACD5CBF8815899A1C3FD20B1D04920025885388012D9C58EA842DB9530B7ADA901AB9CE46A12700687BDE07FB99BF66D0C775218B8454C936F03558B899B59361A0C664081CE8A7858DDBC5E7C5480280411C9ACF4D1EC45035D97524E9E44F963532CA5067609540C1BCB5627F99D5C61CB9A6D400F0BA0A74E45DDAB5A4E8A765DCF2F3684E3A2661A78AC069FA38163AD9F9713EB45C841C6617697CF8A72C54B550DBE9C22B04D579B09AAB0EF4EE8B70CA563F81EF9700C07761C944926F9A76A8C3EEE1CF7E7524D65908C47C35B0453DC10DB5B75123A5B26B9612C0AE18816A71F34638798DFCA21F5073CE771500034F9A71FEB8B621356C430B4D47CB1B59AD4677B5C679188D8861BEAF52558165F691F65A692E8CB8D24ABB74B8885EDEBBE52FB13DAC16E3A8EBC4EF192FD10D71898E93547C7A09F8642AA3B4FAAE23E48BFA809C5989D3462AA50FD4E5C4095542C45E5600926C2DECB4D18BB43B7274239A8DFA3D9DE1BB9CA099DFE56DEDFC9E120867EFCDA10B48F7E630506AA606D76E4537036127FA05FFFB8B8703CDC8DE70A78D014872111A431F393345D74E8866D9A9A633923072E93DBF47C54C4B205C60E67D5155B76F51AB49ACC7435525605DD43A10C88A03E08E257C68937BF2984BE63D40F8A60589D909F8F09688A77DA15DC7B4853339F235B1BD60AA845B4DB6B699325885C49DF9C40781CC56FABEA6201E2F8A9352C28CE321B9441422807E9C81C8F1EC85D240C9F1C8ECC4FF06D6E3682DEA3E6CF92F2B74C2165AF247CE0F5AB84460693254B523498A57E7442977F51F1C2F649BDF756E7F43AE543F5D8E692820F8A06322667A7FA9C1A5B10199A69CCEA22C74E172FED43E550C68C337ECC5E6AAD9F7EB997A7E619D47DF73CB917A705C3CDE5FF344F6FBCFAECCE6B734E09A385FE54B224A880704D774581074C59EB0A3B42C59B8BA4518E764C5A532F6655DD839862AF716903A118433CE0809376A88E88FA847B4D1C63EE393267B15C1E42A91DC6107CDE990EC9ECC7C1066E9480E90A22907C51AF47DA837438A90CC07DE8121691BD73802D5D09D18A2D8B38A28948735110891D1B559A73445838F359A6FB90A3CAB887486CC9D95CBA35B55693C890830D2 -pk = 387DAACD7E0BC6BDC3CAF5EA420B9F075C69AD9D77E6D8B232E1F5EE74AA07383AFF1304EF38CECE90158F52065256007CC64AA054E899B89377F708A5AC98551969A4B82DABA0063F330CDF1A0BC1BD6A005F207A6586429C490AC70AC82B00 -sk = 387DAACD7E0BC6BDC3CAF5EA420B9F075C69AD9D77E6D8B232E1F5EE74AA07383AFF1304EF38CECE90158F52065256007CC64AA054E899B89377F708A5AC98551969A4B82DABA0063F330CDF1A0BC1BD6A005F207A6586429C490AC70AC82B0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002826F3AD9A5361F4416036009B156596A40602764280ACEDF1A0A4855BB9BBD3E203BE52C81B3150B7ACD5D4D200D90AA12FADDDE41E0818FAC3F6294C1A12F107F32B00000000000000CD088B4D99059FDB81D3905E70BA0FC4BD5535F1753D959BF53D11D6270AB2B3FCD296DED679E131A8EBE6FC41B4C7DF9F25622227530BBD37281D47E7F1EB5C89F30600000000000000331162691C286BE735E3C5109C4514FF6547A9A5A184FA978F47BFEDDBA0E3B769825EA1CEFAC5602CD4DD00000000000000000000000000000000000000000000000000000000000000987165E34049161713754A0D70D7B17C0E0D723D9F9C7B2353CEE479030CF7E519197DBB984F84A56E09D100000000000000000000000000000000000000000000000000000000000000AF53CA27DE116E0B91EAE5165BBC64146D4C72721FE23BB7B7AEF69CD03789D1C17D5CB64829CF6DF22F6586E17011003DCEBF65A48341E6F2BCE67E032297D6B68B3EF88B6C86C95B69AED66B364AB50BA6D488FA5F426FA8FF937BB0819101165919FC08B47123206689E832F44AEB528D79809E9020F5F54AFBEC223046BC0362AA8063986E7F3C7076709D18B401B86A414187F6928ACBF50B780A20952D086BD969C9553668750F3C4B0619D2714FA58F95AFBFBE093D682CC38CFBBD029926C29C6463AA6C5BE55716DD6502C3AE6F2EA6C1E91C177BC89035ED7AE3F915279C593FB7FF25800640865DED5500D6EAA12702149768B6676C5A399C411B04664E47968E9911EDCBB2331CD939739F8EF297C6EFEEB2E0536F254BF28D002EBC4B476A76FCCE6C4F661938A6465E6CF141F969CBDA7AAED36CC20B8C174E62C769FF447CABA292B0F206E44F68036506EB59739F455B4142E8A44185644A59F7A67DE2DF31632A962BF6CD91CCB7322A04EEB992C7F812E5F763834A5B0202FF3B9CAB62B198538AEDF6772A469F91574E9B571F699BFE48C5EFD1720309339A89329BE09B1BE4B7BD7A6F38A2003AC7ADE655E1D1C28F13DF289204DE443786C8E1DA0D91D66B09018AE6FFA8A2CBC4B2F703068454ED551B3A8E96EA02E8E3768F1C9944969B1964EE7E6E622123C4E7A05B4FFDA80483B3CB7ED35364F92B1D11193A6F9B33B131B5452EB60280DA27873A95E6D2D4C1D9C916F13A5212C7AF531B33D325623BBB364EECE5C961CC7802AD6683ECEBEFBB0BDE2831024EF2049177D9D53B581677CA8730C1DF54977741ED24B48EB2784116B99761EAE1F15978CF227C94D72DE4FCAC4A1C02BE864A2B9733D74BD3106E842765DA53DEA60946D034562D2EBC6CC1BAED8E7FFB2A6976E6E2FA21696DB9A5321C4800 -smlen = 2111 -sm = 62E67D00374813F952BEF43400AAE01E64695A7F659CBEBDDD00B08A39ED321E072D656A59650145F31BC4BC9DBC16338F122A0173155484CD0C41B12D5639B60002A905E63898CB6F8E35B7AE000A0AEAD196D3C384FFBC28A201A81997154AF21E8DE7FE1D7D00D507BB262914CD6D738A458401CCCD465942291C36F9CC9C4200B9865E350764BFD6D015AD2C0027805167ECBF318C3480A53D01D53002D7AF5995C77F53A48B017BD5640068F8581CB072665C00240FCC96ADA1ACAE1F43F0E8010EB9598D7369D9D89DD38714000173C3E0BF21C4C6A41CB8D82F8112D6A62C4322C5FE233F29D4120159D158779549537B0393316E0126D6C3D4A3A2DFBC45906D63E20ABAA4A41E4B68FE333FFA5EE97FD3DE18F0EECE8EB83E46A8E3505E2EF8AEA2C4040BA3809A764B681EC7449F41A2463651A8CC6DEF0E4A058EB843EF016E5CBA8D55F925E66524BE55CB98FC3169082E52E0D6CC3600C4E8A560B6D448A72CCC95620101323F98B43E28D6357414185ECB0263C7BB94E7F86146661FC897844CF52873114D39123260893DEF13516F982783B927864B61B56D3A8E5B4705DA3A95F6D12A6637C9CED02F07B4AA0B08B4924103036C2A93B31C91EBB6C5B77DE090EBF60A04191EB6CE9CC9B550F5B0C9104B74D15358854181C0C5640FC74CAEE14FED6577FD75EECA14070B6D02A9A421247A5BB262D6E62B04649E75BBD3ED8E72752289FA7C1A68096DD96A4BAC8A2DC27C44881DD2416387D74A005680A3D229D562D3DAAF8DC37B4C87CC86A8C991E9327CDD43BA930CDD8D1E44AEFB084B51111965C5DFB0EE2F09112B070CBFC545119ABA823EB3F65F26BCC025B39F79BE42C0396C5FC9FC924EF1B7EE9DDB71B6E69B579C0A64C5B020206CD3515B8D5F4FF29378B9580D282F7E5ECEEB5CE9C09A7B334E62151100CD658DFFFA66F4091231BEA6C9DE8129EC4F5FBE8BE0FF4BC93367DC69D9E38C177B23AFBA5C27FEE3E2B73C0037DD7C419C854DF7C2412349BAB43869469E80527C3AD3A7103152F9E0B03353A596002FF54ABA8B14AC393EE52EB5564D63BC2738D571FA3C255ABD20102BB299441B00EB988F3A5CFB238EF8C49963B4AE8877E6B317E208821510BF446CE6B06C33717C91C460924248382159198F09D0F5A25C1611B2D39CC6D2ED149FDF0E09A0B0B2BB77067182E386F5F6A55B68808DAD98E5CEB0FDFAE6A0315845ACC7B9C172B0E82190A5EB7C58DE4F86D883292A883045C62D6A1B3C886C345AA6158276EFA6B93AB2188E47ABDD25D332146E980E1B1E043CF63EE35A5AA01AB6CC62F77699DCA16FA30E3632DC5CCD3253D01E547746C78021AC307F0EF1A0119AD11504803EDAD933150981C4D9FD181835C507651DC92A86737E3AFD0EB4DDEF6182872FBD31BFC6D8427C2F4D3A39BCBE6B5120B8CF2AF5DC59949C92D10B1C6A96810564DD335E0755F9DE25EC26C102355688C38250DF8F96E105136855C8DE4BDCD86DF03F92977DA16908CAEEB4056F4A5F751A57BA057AC0309F1C107E594CF3C31544E4F1D93FB9AE7E1A2451E7082CF0C850990EE71ADE0498F6A3852DC4FC128BFDB8ABDDA3D759C8D4F83FED8509CDE5EED38410FB9F0A5F30EA45C9270BA2395DF645AAEE03F56158685A0BA65DE3D2C5209A7EF4BDD4BBE0CDC966DD1BDF1FE0BE06C7115F7CCD80F8012E5D17955AE0C9E4220076882F30DC5E391295994B9F809C09DBED8CCDFC89669F40492944FF20948080A4ED66AD8166B613AB2F4414762AE493EA6661950E8E56B3758A77CDBCFBF24FBBBF20EACD5CBF8815899A1C3FD20B1D04920025885388012D9C58EA842DB9530B7ADA901AB9CE46A12700687BDE07FB99BF66D0C775218B8454C936F03558B899B59361A0C664081CE8A7858DDBC5E7C5480280411C9ACF4D1EC45035D97524E9E44F963532CA5067609540C1BCB5627F99D5C61CB9A6D400F0BA0A74E45DDAB5A4E8A765DCF2F3684E3A2661A78AC069FA38163AD9F9713EB45C841C6617697CF8A72C54B550DBE9C22B04D579B09AAB0EF4EE8B70CA563F81EF9700C07761C944926F9A76A8C3EEE1CF7E7524D65908C47C35B0453DC10DB5B75123A5B26B9612C0AE18816A71F34638798DFCA21F5073CE771500034F9A71FEB8B621356C430B4D47CB1B59AD4677B5C679188D8861BEAF52558165F691F65A692E8CB8D24ABB74B8885EDEBBE52FB13DAC16E3A8EBC4EF192FD10D71898E93547C7A09F8642AA3B4FAAE23E48BFA809C5989D3462AA50FD4E5C4095542C45E5600926C2DECB4D18BB43B7274239A8DFA3D9DE1BB9CA099DFE56DEDFC9E120867EFCDA10B48F7E630506AA606D76E4537036127FA05FFFB8B8703CDC8DE70A78D014872111A431F393345D74E8866D9A9A633923072E93DBF47C54C4B205C60E67D5155B76F51AB49ACC7435525605DD43A10C88A03E08E257C68937BF2984BE63D40F8A60589D909F8F09688A77DA15DC7B4853339F235B1BD60AA845B4DB6B699325885C49DF9C40781CC56FABEA6201E2F8A9352C28CE321B9441422807E9C81C8F1EC85D240C9F1C8ECC4FF06D6E3682DEA3E6CF92F2B74C2165AF247CE0F5AB84460693254B523498A57E7442977F51F1C2F649BDF756E7F43AE543F5D8E692820F8A06322667A7FA9C1A5B10199A69CCEA22C74E172FED43E550C68C337ECC5E6AAD9F7EB997A7E619D47DF73CB917A705C3CDE5FF344F6FBCFAECCE6B734E09A385FE54B224A880704D774581074C59EB0A3B42C59B8BA4518E764C5A532F6655DD839862AF716903A118433CE0809376A88E88FA847B4D1C63EE393267B15C1E42A91DC6107CDE990EC9ECC7C1066E9480E90A22907C51AF47DA837438A90CC07DE8121691BD73802D5D09D18A2D8B38A28948735110891D1B559A73445838F359A6FB90A3CAB887486CC9D95CBA35B55693C890830D2 - -count = 56 -seed = 36AB8588F5233D15674677535A682382C29968FF824031AF646F58FCAF0E83C1C486B1E75479149FD6F4D9E8397CAF73 -mlen = 1881 -msg = 0707EA05515798829F42A4CBDDB4A95C5750879E0A584AB503F778015F83BEBF6D63C3B48A4F478EF01091403DDC5A9662E39707DBC8502ACF50F3E06ED0199CC647EA155FEEF503BE045BEA4035C07C4CCEDA306B8187185BD06C14220F2B7401229969C1CFF8C36D499D5A725FA1CE7B44D71E6C0E4E750766183883D838DAE4F00B140E0AFCCB0E72F935018A6314232DC632C5AD3C26919D1A7925BF0F665CA0223439518143486CE92650DD145FDB2E97E0D5BC9D6806F442FE90C9C1F52992E670DB2603AD885FA42B3D8BEA4E470B7F76A367AAA506E931890B6E4607F59E87A7A5FBF3991EEAEE47CFBBFE3CBE028E67BB645D37A7BE5E7CBA6D7955CD62D1D8DB0D9772EA0185C25BC1AD40A09D3E7E9CABA72BDC3A6EF3C40C7ED6208854157914A80B5C66A6DEC2317FB5A529421C03CCA6FC0A3B3D51556E8DEE7C1EBFBA924FE2EBCE8A46BE96E761AA6749C0A9A2B2FC49B42CA47663EA3395DF22DE20947DB14FC1FAD03805955D67F8473BAEFE2C1E22BDCC7BB988DB0DDE4E83E26A16F10B93BD9CFDBA77B9302EDBA0C9AFBA7369A023EF763C55484F7425F842111CAE27E07A511A725F25D422D933F2EC201BFFE3291411AC3CD6E91018C95074C18FC780A73945B148154987854CFA1CF1199BCD03519C8F34774453DF90B71FEA6734DEA7191EE2A5735F7A191F527642D53C844B087E9346B07EDD0B78C36F83445825E60A13C424F72530E05F75DA8D33957FAFF004DEB549985790956A0E7D9B256298D56BC6206F1E4E1E958FE298641A277A2C8B6B9B7660DBF689AD7E1A19CBD965CBEAA4A0D30741586290576996AE668ECBAB4F06F2A1D542E32C5D3F042E7E29A41BF86BAE29E7029D997876CFB23B10986A45CA029739B2446A29C55561AEE8FFB187961E6E7401D726AF6D8A5C816B2CEAA9A1C9B780DDCC4F0E4003542B193AE26EC687F8C51451D2D5387D9C3B9EB95981DF2DE069FE741CD5C15F6D1B12C5B9B94230ABA33BF46DCE8AC7E26896EDCB4F87272C32D19E72C313738855C02C6F46F1162BE0A3ED2E76704B16169689BF532EAD7AE7F2B26F4D9B22712662BEEA1F46748FA4C27D1D825D3FE493B5B3B513617C81D21A0912D329C5A4E3A90EF5A29A4E3137D1CE3EEE99C42D034E61593A4076EF124BD6BCF8FC911FC9F6077D82C2980C2ADB955939441BC9E81BDF9D6996CE578114C01F9BA096D6EA40F4E0FBB18B3E3D25E7F6D6CB670AD26F604368ACB6190667B7B7ED3C1A1DA04E42AE0087852834B91AA072AD51C0193E5299481221BC9083118F7B5503559F1E2D9E22A8D57932CD0B59509E7D7F459E20EBF4C1D0DF71472340E64992C0485D593714D6B469547616DFEAFC95089689931E79944204A6D0A47A565DC325F3BE19FD44BB6CD4BF2B1D4A78C883154D70705E121B833A4A7E7E80FCDCA03F52C1F831AB0D989AC5DBB5CD83BABCB3EE74B69681818DC05E33234775123F552CFC7C7BB0B98C937957A2C4E86E3D775468A7CB8D33756ED7489D04DBE52EAA2737EFBC4C4D0F55B5A841E1453763E611BAC358FAD0B5778C6015D97CC42CA9FECC66CF844DFE55587C200DA5250B3A419791F57D3A4F672551BE885DFE2AA8637D6C890EE8E1063E782FD7E2CB356BF47B6EB93A155D8D64C9F6CCA3971C5A7FACC3C052A2AA9FB286750F76933261AFF5CE408BDA8382AF8535145F432F78B3B25A768B5DA2A211D1D07AB557CABC7A139F66EDBB744AA76E0FBF22092E31C92CAFC624EE1DC6732F27E8E7632C6EEE2D1F5C85B52D712C884B36C91DA383F0DE9E06E5EF63D7B7A692E5E91BA1A1D9298E26694FAAD9EF262F117DF8115E2E877197A8069A96210CE65D45E6AA7011654ACFAFDA810CCCC20C1985D54483DAE12B29D7ECF66376968B52FBD727CBAE7C9E3DBFEE7391D985228ACA9EB8EF98FAE32BD24552A6B34BAA581DBB03676A3A4546E10EFCEF269B18E1172F560FA0F0344149543551E079C1745BC0425B5233B7D7DC32F751D321638EDB1CEE56DF0359EB6D9863CF3E341A56060C8EF8486014F956C39B751AE239A493A017B2FA5210D374BA83DF5D799B7CD92987FEBB0B2CDB3EE42A61381304C5EAE2ADD4777011C3279BBCD1EDD6F91FF72B3C353AC35DA8FA843DC5561D3CDB507730E8BEF20CF09B0DDC36D47F4C10D82652DC2937D889F83B1DDC30E52B244250D19EEA9CF7A3B5D931E2E25B64A0A81B2C4FE933A17BEAC2E10FD888D07F994E4F2583D204DA126533F5E36B62486A00CCC317C4381A8FE11D36C43E71BE108E22A98F53729F05A5E0AA38D512423DB4BC1D6BFAE9117383ACF94AE2A737F6B8070858BEAF08E365CA84925F8BEBAEEF5AF77EB73A9D3648AAA6493CEBDDB95149F0DAFACF129FC321E558084A44CCA4B429D664D90DD90F2A04818B48D135952746CECA76F99B947A33A3BF7C535B187C1971AF4FCB1EAC841BE7E96F429DD38127B52FACC2DD6512D8D019E0080CADBF7078FC67E9AF170A2A00F70F407B0A7FF469E2F6EA165F8B43EEF1779A115089DE9ABE6B78C93E4B8E3B018686D16CE8EBC88CBC1D571372A3996C9E5967C035F9DA6E200E7ECFD1CF7158563F36A3AAC3CD8ACF52A4EEE29DCEB03FA3272A671CFC9B -pk = 97C0698625F46BBA52F26098172DE7A1FCD20C7446B9EC5B8F3A936231B8D1DB1E07335B06C1E243D474A40D3E0ABC034F8C8F6751F474796FBDE25FA5D013701C5818EACC5CE6737C3E6B167EDDE45B43B1E917FB086A19B19121906E0FC803 -sk = 97C0698625F46BBA52F26098172DE7A1FCD20C7446B9EC5B8F3A936231B8D1DB1E07335B06C1E243D474A40D3E0ABC034F8C8F6751F474796FBDE25FA5D013701C5818EACC5CE6737C3E6B167EDDE45B43B1E917FB086A19B19121906E0FC80302000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008D7B0C5937444ACAFFEE8591095DDC4C85FBCC45E91B2D9D4AB0DAB63C5512E0DD8617EFE4035E6FF75F0929A4BB29BFA4C6B39DFC6E6F46EC3E8266CCE7B21E51540F00000000000000BC9441BE8715328EEBEB047A78A5BE1A3B77E4AD769FFB53795FB4EA97750DFAFF16626496D64C432373F860B58391173E0CB53311974A9F2359FD45825186B16759DDFFFFFFFFFFFFFF401207DDB21AC5A21C2DE1DA8F005A7CED63AD26832CE033BFF778A0EA29DABFDEF778765E012AF37707B2FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBF54B66A08BB669FF243C13B849ED1ACF1232B1B62BF5AE2588E8EA63361E7520755B8C67FBD8DA9F85CE000000000000000000000000000000000000000000000000000000000000000FBE51E7CF764C9141C5C07B3F512FDCF3EF11265C9C1983E72F6B3AE57E5F3F139B9856C4DF4621A0FBA90ED6192F0130F0172B91D3B023F46EC1D509B4E58B975E113369671EE9442FA81249F1072172F4AD010C0C7B29362B4BFB2B89D10194445B2B75B63FACF83EA9005EDED8346F09D5B4877DC7B8CB86B5D346D342BF06E4900C71F432D1B59617ADDCB2C50050AB05CF85228DE25DEC3AE01F3FC84F76B2E7A8BD6391E2BDDE0ED047ED6C435D23ADF69E61BC9DF663A00504C0980086C4ACBCA5F189877A69E47BCA9160A0ABE5E32CC04EB7BD78FBE9734693FE8589997742005F978420FE622C2C7BEA00D4B3F5F1A628F01798EDD0A48B91A057B94EDD79FFE4B5E89C03ADB5164F4EBFD902B58AF1A5B273659C004621C39C02CDE448746FB0016895A66B81FB16DA27B790074573EFBE98648327D051726768B4D8DA57AD05D89CCAD88AA9525BB602E57D50E8DD6E2970037C686F6F2673BFCA95349195A1C7A66534019575CBFDEAE022FE560590B43B598E349DBE695D01B63B868D34A719DB88E2687A88989829C8B554E1F49B12E08AF8D4A9DBC5733AD698716BD3B2BA1DED0CF7E4633175001804D59B719AA420CD4E26B607347D5D763E295228749466D01292F9627E0D25813F279FCBD4FA0C3801C4A3A4070D0271A4FF8EBC23C19E36D897BE07F61117D2E64132F012C25B80B647D611156B9DD7A628ECF3F79D5342C67D5A90F78C008216FEBC4AE7399DD4201347D8F0F8D90A6DA6942AE26B124ABC1FBBECC0041715D4A5C90BB4F63D6773D3DBA5A6D400405C64C808A868A5242F7A13F5CB214712D6A74DD86E643923C3B29113E2624EE8477A453ACE3739C5FBD4D25AE7CA01A3690238672DA7883EA09FCD75D75521DE50DC25768934F9438E6A55F663F71027C881BE3812B2DE90FD68509A34DE02 -smlen = 2144 -sm = 03DB9523FA93E62A96A74A8101211D029CB894B016A599C7930011AB8995523C28B9E051DD8901712189A56AB8177A7C291A37012C2EA12348C428E1F31826FD00ABFF892231B0B09D0384A2D401FD98C550FE696BC41C86D65B01DE588252295FF9F9A01A54C5002F4A5CE401273AB18820773F0129074A416B8324E2CBA7AD6000973B496DBEF51EEDBB3FEF360021AB500809E3BA886345B38600F73C87733A81ADAC7460A6F300CF3840E65EDCF83A1E8F7AA4013F4664F20C0F9EEC9537C56B016BE4D58026E6B62C2A33AFEA0001157EF9C7547873587DC6F320B1CCE1DF46FDABFC19677778740403E7C73DA7C69131007065A6D3002BF1501F0D1583ACCA97A72F89090707EA05515798829F42A4CBDDB4A95C5750879E0A584AB503F778015F83BEBF6D63C3B48A4F478EF01091403DDC5A9662E39707DBC8502ACF50F3E06ED0199CC647EA155FEEF503BE045BEA4035C07C4CCEDA306B8187185BD06C14220F2B7401229969C1CFF8C36D499D5A725FA1CE7B44D71E6C0E4E750766183883D838DAE4F00B140E0AFCCB0E72F935018A6314232DC632C5AD3C26919D1A7925BF0F665CA0223439518143486CE92650DD145FDB2E97E0D5BC9D6806F442FE90C9C1F52992E670DB2603AD885FA42B3D8BEA4E470B7F76A367AAA506E931890B6E4607F59E87A7A5FBF3991EEAEE47CFBBFE3CBE028E67BB645D37A7BE5E7CBA6D7955CD62D1D8DB0D9772EA0185C25BC1AD40A09D3E7E9CABA72BDC3A6EF3C40C7ED6208854157914A80B5C66A6DEC2317FB5A529421C03CCA6FC0A3B3D51556E8DEE7C1EBFBA924FE2EBCE8A46BE96E761AA6749C0A9A2B2FC49B42CA47663EA3395DF22DE20947DB14FC1FAD03805955D67F8473BAEFE2C1E22BDCC7BB988DB0DDE4E83E26A16F10B93BD9CFDBA77B9302EDBA0C9AFBA7369A023EF763C55484F7425F842111CAE27E07A511A725F25D422D933F2EC201BFFE3291411AC3CD6E91018C95074C18FC780A73945B148154987854CFA1CF1199BCD03519C8F34774453DF90B71FEA6734DEA7191EE2A5735F7A191F527642D53C844B087E9346B07EDD0B78C36F83445825E60A13C424F72530E05F75DA8D33957FAFF004DEB549985790956A0E7D9B256298D56BC6206F1E4E1E958FE298641A277A2C8B6B9B7660DBF689AD7E1A19CBD965CBEAA4A0D30741586290576996AE668ECBAB4F06F2A1D542E32C5D3F042E7E29A41BF86BAE29E7029D997876CFB23B10986A45CA029739B2446A29C55561AEE8FFB187961E6E7401D726AF6D8A5C816B2CEAA9A1C9B780DDCC4F0E4003542B193AE26EC687F8C51451D2D5387D9C3B9EB95981DF2DE069FE741CD5C15F6D1B12C5B9B94230ABA33BF46DCE8AC7E26896EDCB4F87272C32D19E72C313738855C02C6F46F1162BE0A3ED2E76704B16169689BF532EAD7AE7F2B26F4D9B22712662BEEA1F46748FA4C27D1D825D3FE493B5B3B513617C81D21A0912D329C5A4E3A90EF5A29A4E3137D1CE3EEE99C42D034E61593A4076EF124BD6BCF8FC911FC9F6077D82C2980C2ADB955939441BC9E81BDF9D6996CE578114C01F9BA096D6EA40F4E0FBB18B3E3D25E7F6D6CB670AD26F604368ACB6190667B7B7ED3C1A1DA04E42AE0087852834B91AA072AD51C0193E5299481221BC9083118F7B5503559F1E2D9E22A8D57932CD0B59509E7D7F459E20EBF4C1D0DF71472340E64992C0485D593714D6B469547616DFEAFC95089689931E79944204A6D0A47A565DC325F3BE19FD44BB6CD4BF2B1D4A78C883154D70705E121B833A4A7E7E80FCDCA03F52C1F831AB0D989AC5DBB5CD83BABCB3EE74B69681818DC05E33234775123F552CFC7C7BB0B98C937957A2C4E86E3D775468A7CB8D33756ED7489D04DBE52EAA2737EFBC4C4D0F55B5A841E1453763E611BAC358FAD0B5778C6015D97CC42CA9FECC66CF844DFE55587C200DA5250B3A419791F57D3A4F672551BE885DFE2AA8637D6C890EE8E1063E782FD7E2CB356BF47B6EB93A155D8D64C9F6CCA3971C5A7FACC3C052A2AA9FB286750F76933261AFF5CE408BDA8382AF8535145F432F78B3B25A768B5DA2A211D1D07AB557CABC7A139F66EDBB744AA76E0FBF22092E31C92CAFC624EE1DC6732F27E8E7632C6EEE2D1F5C85B52D712C884B36C91DA383F0DE9E06E5EF63D7B7A692E5E91BA1A1D9298E26694FAAD9EF262F117DF8115E2E877197A8069A96210CE65D45E6AA7011654ACFAFDA810CCCC20C1985D54483DAE12B29D7ECF66376968B52FBD727CBAE7C9E3DBFEE7391D985228ACA9EB8EF98FAE32BD24552A6B34BAA581DBB03676A3A4546E10EFCEF269B18E1172F560FA0F0344149543551E079C1745BC0425B5233B7D7DC32F751D321638EDB1CEE56DF0359EB6D9863CF3E341A56060C8EF8486014F956C39B751AE239A493A017B2FA5210D374BA83DF5D799B7CD92987FEBB0B2CDB3EE42A61381304C5EAE2ADD4777011C3279BBCD1EDD6F91FF72B3C353AC35DA8FA843DC5561D3CDB507730E8BEF20CF09B0DDC36D47F4C10D82652DC2937D889F83B1DDC30E52B244250D19EEA9CF7A3B5D931E2E25B64A0A81B2C4FE933A17BEAC2E10FD888D07F994E4F2583D204DA126533F5E36B62486A00CCC317C4381A8FE11D36C43E71BE108E22A98F53729F05A5E0AA38D512423DB4BC1D6BFAE9117383ACF94AE2A737F6B8070858BEAF08E365CA84925F8BEBAEEF5AF77EB73A9D3648AAA6493CEBDDB95149F0DAFACF129FC321E558084A44CCA4B429D664D90DD90F2A04818B48D135952746CECA76F99B947A33A3BF7C535B187C1971AF4FCB1EAC841BE7E96F429DD38127B52FACC2DD6512D8D019E0080CADBF7078FC67E9AF170A2A00F70F407B0A7FF469E2F6EA165F8B43EEF1779A115089DE9ABE6B78C93E4B8E3B018686D16CE8EBC88CBC1D571372A3996C9E5967C035F9DA6E200E7ECFD1CF7158563F36A3AAC3CD8ACF52A4EEE29DCEB03FA3272A671CFC9B - -count = 57 -seed = 4E94DD734A371A7C6AD4A567038CF93BAACE2B9D30F3862198DC55D2F21F8FDC9A7AE5DCA1541712179E3AB1FFA3F792 -mlen = 1914 -msg = F3EA695264936D537D86E545E132131442C2973D19B37F8C911E3ECEF4A13A8B1EDF5E5968A6198D26205FFE6B76CB14E353B5E2C9DE1BD44AB9BD55862BA1A479833335725EF52601810C778DA4A32C497CCFA43F91C72A1499E8D295AE7CDB43F1CA05F0D4A31B30D9A69CAB8288640F3F9E081E2C98CC8351C7EB9954D428DA4BB374B346A83EFF5AA3F455F2BB3FC922F901BBE5695E3AB9892A93BEEF90FC150B3BB47F6965C229F7DCC3100A4101840417A0E2547F9D42AB27216254A2898368BFC60E7D407271C213233B6913C8E48DF10967757BFAF5B5E2A284B8F67C70537C97583786B5185B45E2E36BD8B5443E98601F772829176C4D66F44A81AAE7C13F539490640BFC40B83E1C75305B06BE60E18A0AB568859435B715E15BA1EE4DE73E04E1B09DD15350AE423C131706F057255E9FA8FA3F9E3ADE7435A6451F7A2AAD0C0FE0F444C4A247DCBAA49E7C926DD52A33D3737B4439C1D40F861720E37BD25366EB5F34BF4B552160F3EB80CA8FB19304E1E4143090F8E965DAEFF17551A3931905B5CD991C6BC5AF5BE808073893A47FBFEEC0940EF5E7D2F2EE199847E1A4BEA447BEC40F86F6FDAEBECE6FF0F66E04193355C9576DD4AAB2D796CFEE5D432B1D32E13B8903A06FFD3AECB00C169A3AF8389848CEC724F647C6BA8DC3134CA18586DB3E4138601A16DF8873A490F23C4D27FD9C3D4FABF2BDCBA4AF3F0793E7B591198100EC97602D9BA572409EA49D7C8EDC646335FD4494577720EA7CDF3B4266FC201DE4BC204C0D35CFB55010BFAC68CA0DF3AC936C9FD2A9C532B8E3461D25362EFA37DA159B64670060CAB833ECA799FCF1342C7EE1B80BDE05ABAD08B9EE8908D50CD0D433DDA0B120D1980F690ACAD9C072502AB537EF71B691917A76D3098C27FDC6FAD1F1B29E307E17C87D9FA6A06CF8CEF6568D9E4E005FEEFCB5F41A46D91E31B41268367D636C4478921E690D5D57E99DA3448773D51B673109CFD3A58CC50C127F34F4963FCED6C216E60EA0952317FBFE88807BFF4223624F6126104CB46C8D39EE228BB4FC0002287E346E5ACE43E2CAEC07A22203FE3C4AA9008A94F7075F6E449FB89905BB955FA0023608C494F7B73D2AA4E2B0A8A7E3CAA889B6B6A6640F7222EF969D46FF6794BD97C5363921461BACDA17F2781E14419436E37610E52E3B7B7BF9C1A4B1D80876030F9A8981DAA4F06A432DBA739DB988BED5DE7F38378EC1F7D8A46B305896CA0CAA5D8AD74002863C6FF91EF25AE96450936509EFA93F94718E895A82B4616A965AF004038E0897A6563DBC91EB5A6172ADBA052250D06D210BCF5A250246FC3482E57FCD9901104C5AD58EEFFAC2860A4DA9D2C308552EFBDA2D4275F3F3651E9935A0E42869B9263FC7EA71079E604A4EC6DC61CEF6AC6CC06194DEF432C1F7CD9EDFB0C4B448DAE3C2A685BC818B2A90E17A4C1CAAA5FC2632F720E764E2B8DA314224498119A0D94CF5DCE24176421C2736575672B361119EC7C766265768CD9FF1957A17779C11244C1CC82D72D4E3C87107885F71C56DA2BC41008B0BC1375C12B3B2A80071EC03E377A93BFB227BD560EDD5E5D88F46F7FF9831F05BF262F01F62278D3DC13F4F0CECA0509091C25D20666D8D3527975CA3495F6843B46B5D5B6F5C650E981DEFB3943963E14F00A0F78CE785A21634C46B531B4F2AC5AD0F03D92372C334CE963E514A1891716EB5D5BB1B67834994EDA492719032E2A4F961DDD6D2002D8F52798C45A9DA8145BFD191E97D1FBA1B395858B0FC7D5F5A54E69FB3780635F70A763E44075075580778676E6B9705B40F40210E597B5AA1AA77BCC3BE5005159A4B68CBDC6AD8674495E0DF65A6DECABAFB993CC49C082D358DB1E5B3A8AF2FCB0049A15BF521986AD84148135CDB185FDDCA6802C2ADE9EA2E82047725D73F51E072CCD799D696D7530F61B16E9B4727C58CB0F552B188F9B451BE543BD809B63D66BCDBAEB7AA917BE6AEF05DF559B3AEAF65D5EA12E852D1370EFD6197F970F52292F27923A10D01AEB652A9A44573C137257B49D130F1DA48E532B3E33D4854B995534380B4549511B39A99145AF5ABE0CCD3A9DBAF673EFC115CB75A9A5A806679907BB525A2BD4507977329EB4C985B3575DE6533FC5D62358C21AF3DBDD20DEEFD7C417C77D37DC2A098A8FA48F7944B7EC6F929387BA11E3516C9EA681238650416FFB97EA343D5F227BADFDD509B94C1451C54F85E4539A8F70DBB5EFBB10B2D82A16FD0C997C603B8983CEB840A7C3B61918D8A97766BB8442C3B9EF2D324E28DC19748417D32F642874A8927688C74BF4F6F6724015C4DD50EB83B85F613FA20938F5C895F88830A40C9799C212B2DFB453BA0BC534F75CEDAF7A016F6744CB4F5269FBF0284EB90CF1023918078024C3B125CD9C7501224050B4D20B585472B42A0F494513ED131BCD8F75E223317F56B37CA48780750DE0BC81C74A3388C94D93A65719122E9D533274811B76965265D7B2F91EBE3C5924ED2D4DD5E327A6E7546AA2605E4C78D0208DB7A7F678CAADFB32E6BCF8C77FC7810F7D1D5D50E26D1A0DA03B8AFCF99904B2B3198670462451925381F0BC404C51F2F18FA7E2C1E8B0C6CF97A9A65E575373996C3E9DA15A18D15C93548377677DD713C9828DC4E4EE823A241377C65A2948BD29447BFBE -pk = AD5822D5BFA5BF6B2C416A8508CB38774726082BEB3503BCFB60288B7AA9733711AD8A1FD3DD5A0B86E01C485F9EE701267194F423129EBEE01A6AD37EF04862025D7CFAC368D7721F9A310618084A2CA3E67EE1903C2105846D386130600F02 -sk = AD5822D5BFA5BF6B2C416A8508CB38774726082BEB3503BCFB60288B7AA9733711AD8A1FD3DD5A0B86E01C485F9EE701267194F423129EBEE01A6AD37EF04862025D7CFAC368D7721F9A310618084A2CA3E67EE1903C2105846D386130600F0202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005C0E83E77C2930A88227155D73529C2023AFEA36AD6EED2E799B1A8E2EBD1B8775DAF2B285CCD774A7672C123B3B46681FEA90C0EA0EFA31A9A8D28CEF8EE1BE19BAE8FFFFFFFFFFFFFF79264F323F87DFE35E6B806714857CD5F95AA24947A2B65D5DD3A106E7C06AB461DEA59BFAA05072644FB0AD1821C8CEBC436AC6B3442F00F301F2099E589CC5E47AE3FFFFFFFFFFFFFF01866AAEE38052DA3E9A26662744E4DF943881733804AB36023FD0D6409EBC5525F61D5E0677D66D3409D8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF683A7AF3A70229F5AE676A26163A6FEF6856720BD006D0D455DC0A59BD9BA387E7128B294567E15A093AE70000000000000000000000000000000000000000000000000000000000000041EEB50620FA08267E14D5CB7B154FE7B6FA50CF89356B8966D2785A3A351C8139A0D1918855E07A7E5D2B0A0282AD0191CE2DC371C648EFEC150C6A1737D57891DE0038A2B426D7F4A780B7BE0DC952AF60F3B5B1D4B901CA48AA344CBD38014F56649114E27B9C5B2EB89C455CA4EBAC1168750C3AF37547C796027BD39E7AE5A6378FC271F3A81A30155D2816CD03F485739A812377F589D8184038C9FB7B8500F16E5C12892113FCCBDF185ADA154A1BA5929B196DF46E2469ECD7BF31011D181225349D3C2A8D5A33CB1D72D1FD932ACD54752E6A78559290A0D208FC42572196E520D34BF2411BA4D689E51601AE887FE5530641C1613620CF8FFDAAC7E2D3065579FF2399AD712617A756FAA7A3EECFF8D9202CB705CBF8147225FD0172FA72168F5D7D9ED92AD799A2D4F2D2F0F8EF31E72BDF42CEF4C18B6B8217F98706F079F8EE26015DB646C599C6E1018CDC1643F2C85CF814934B85229CC15E5ACEE23E1BC6855377A779D5996A6F7D21D7B997E0E4732FC3150FB4E76D9C000BD48B13C04C0DCB8A161EA14BEB74BDA66B39FA3424FE0B38DDA11D7D9A5F02740BC62C27B2E873D52E7621867A8301ADF0EDAA0AB0E55B480A6D3F90FF82D82C402ED514336FC4F65F53B36AE863644DFE2D12C9CE662AA1F6E4164D5C4E032F997CA102FFD08F14D5FAE01673A6B9A80321832F4290CAE3ABC3C82B2A805D2279EC6C44B6AB570FB7907BCF2E030298C7A631049F99F04127FD5784A1166C2E06B0C1257C56D88AAB108DE3DD7244358973616B7E18F255C35651191FBE00BCE5F36D4C1439B9FA727EF8C1B5C9A6BBEE2C7EAC0F45621D3CC5270B830AF157F29E68E46DDE2CD36AF1F2DE5C2601D428BAE85CDBA511C0D8C1CCFF27F56B08B02F8E260EFF715911DFF7995074042FFE610737039F203FA96D82F6C9EF00 -smlen = 2177 -sm = ACD4A1C2CDB46DABAD2BEDB300346FBD8E8986E55D9E10576000E306DD6B543A0AA56AB18E200124AEBA637D37C5A18CB96BBB0136BBFA7CF61E0548218ACFBB00C5F2C8A65FC0C3AAAF319F77004C0838B84265FAB37722048D0048EFD8E67E9066172A8EE465012FFC5BBD4DDF8930B8278ADE0112B512B3DDEE9BD5ADE79413007B090BC5BE0962CE7231DFD8016319CC313F0AA268F5FFD8CE01EC80532608A4A003425F403901C5C324595585BE2BA005885700617A9AC8D04946F53AACE86C006A057F7D67312B1FCC605E270000AD3AB4F7E9A8A3220D663FE040B29EEDAA5528FB341941B95816026E3DD3DA25AF2A549942999D00F1E310C723E2A6F41FFE88153105F3EA695264936D537D86E545E132131442C2973D19B37F8C911E3ECEF4A13A8B1EDF5E5968A6198D26205FFE6B76CB14E353B5E2C9DE1BD44AB9BD55862BA1A479833335725EF52601810C778DA4A32C497CCFA43F91C72A1499E8D295AE7CDB43F1CA05F0D4A31B30D9A69CAB8288640F3F9E081E2C98CC8351C7EB9954D428DA4BB374B346A83EFF5AA3F455F2BB3FC922F901BBE5695E3AB9892A93BEEF90FC150B3BB47F6965C229F7DCC3100A4101840417A0E2547F9D42AB27216254A2898368BFC60E7D407271C213233B6913C8E48DF10967757BFAF5B5E2A284B8F67C70537C97583786B5185B45E2E36BD8B5443E98601F772829176C4D66F44A81AAE7C13F539490640BFC40B83E1C75305B06BE60E18A0AB568859435B715E15BA1EE4DE73E04E1B09DD15350AE423C131706F057255E9FA8FA3F9E3ADE7435A6451F7A2AAD0C0FE0F444C4A247DCBAA49E7C926DD52A33D3737B4439C1D40F861720E37BD25366EB5F34BF4B552160F3EB80CA8FB19304E1E4143090F8E965DAEFF17551A3931905B5CD991C6BC5AF5BE808073893A47FBFEEC0940EF5E7D2F2EE199847E1A4BEA447BEC40F86F6FDAEBECE6FF0F66E04193355C9576DD4AAB2D796CFEE5D432B1D32E13B8903A06FFD3AECB00C169A3AF8389848CEC724F647C6BA8DC3134CA18586DB3E4138601A16DF8873A490F23C4D27FD9C3D4FABF2BDCBA4AF3F0793E7B591198100EC97602D9BA572409EA49D7C8EDC646335FD4494577720EA7CDF3B4266FC201DE4BC204C0D35CFB55010BFAC68CA0DF3AC936C9FD2A9C532B8E3461D25362EFA37DA159B64670060CAB833ECA799FCF1342C7EE1B80BDE05ABAD08B9EE8908D50CD0D433DDA0B120D1980F690ACAD9C072502AB537EF71B691917A76D3098C27FDC6FAD1F1B29E307E17C87D9FA6A06CF8CEF6568D9E4E005FEEFCB5F41A46D91E31B41268367D636C4478921E690D5D57E99DA3448773D51B673109CFD3A58CC50C127F34F4963FCED6C216E60EA0952317FBFE88807BFF4223624F6126104CB46C8D39EE228BB4FC0002287E346E5ACE43E2CAEC07A22203FE3C4AA9008A94F7075F6E449FB89905BB955FA0023608C494F7B73D2AA4E2B0A8A7E3CAA889B6B6A6640F7222EF969D46FF6794BD97C5363921461BACDA17F2781E14419436E37610E52E3B7B7BF9C1A4B1D80876030F9A8981DAA4F06A432DBA739DB988BED5DE7F38378EC1F7D8A46B305896CA0CAA5D8AD74002863C6FF91EF25AE96450936509EFA93F94718E895A82B4616A965AF004038E0897A6563DBC91EB5A6172ADBA052250D06D210BCF5A250246FC3482E57FCD9901104C5AD58EEFFAC2860A4DA9D2C308552EFBDA2D4275F3F3651E9935A0E42869B9263FC7EA71079E604A4EC6DC61CEF6AC6CC06194DEF432C1F7CD9EDFB0C4B448DAE3C2A685BC818B2A90E17A4C1CAAA5FC2632F720E764E2B8DA314224498119A0D94CF5DCE24176421C2736575672B361119EC7C766265768CD9FF1957A17779C11244C1CC82D72D4E3C87107885F71C56DA2BC41008B0BC1375C12B3B2A80071EC03E377A93BFB227BD560EDD5E5D88F46F7FF9831F05BF262F01F62278D3DC13F4F0CECA0509091C25D20666D8D3527975CA3495F6843B46B5D5B6F5C650E981DEFB3943963E14F00A0F78CE785A21634C46B531B4F2AC5AD0F03D92372C334CE963E514A1891716EB5D5BB1B67834994EDA492719032E2A4F961DDD6D2002D8F52798C45A9DA8145BFD191E97D1FBA1B395858B0FC7D5F5A54E69FB3780635F70A763E44075075580778676E6B9705B40F40210E597B5AA1AA77BCC3BE5005159A4B68CBDC6AD8674495E0DF65A6DECABAFB993CC49C082D358DB1E5B3A8AF2FCB0049A15BF521986AD84148135CDB185FDDCA6802C2ADE9EA2E82047725D73F51E072CCD799D696D7530F61B16E9B4727C58CB0F552B188F9B451BE543BD809B63D66BCDBAEB7AA917BE6AEF05DF559B3AEAF65D5EA12E852D1370EFD6197F970F52292F27923A10D01AEB652A9A44573C137257B49D130F1DA48E532B3E33D4854B995534380B4549511B39A99145AF5ABE0CCD3A9DBAF673EFC115CB75A9A5A806679907BB525A2BD4507977329EB4C985B3575DE6533FC5D62358C21AF3DBDD20DEEFD7C417C77D37DC2A098A8FA48F7944B7EC6F929387BA11E3516C9EA681238650416FFB97EA343D5F227BADFDD509B94C1451C54F85E4539A8F70DBB5EFBB10B2D82A16FD0C997C603B8983CEB840A7C3B61918D8A97766BB8442C3B9EF2D324E28DC19748417D32F642874A8927688C74BF4F6F6724015C4DD50EB83B85F613FA20938F5C895F88830A40C9799C212B2DFB453BA0BC534F75CEDAF7A016F6744CB4F5269FBF0284EB90CF1023918078024C3B125CD9C7501224050B4D20B585472B42A0F494513ED131BCD8F75E223317F56B37CA48780750DE0BC81C74A3388C94D93A65719122E9D533274811B76965265D7B2F91EBE3C5924ED2D4DD5E327A6E7546AA2605E4C78D0208DB7A7F678CAADFB32E6BCF8C77FC7810F7D1D5D50E26D1A0DA03B8AFCF99904B2B3198670462451925381F0BC404C51F2F18FA7E2C1E8B0C6CF97A9A65E575373996C3E9DA15A18D15C93548377677DD713C9828DC4E4EE823A241377C65A2948BD29447BFBE - -count = 58 -seed = D9281003AC5F7673E0E9A7BC29C4ED75E6B0F228DF49D11A2599BFF2DA9E887163BB26DBA4F071FBCE02891540EC6F1C -mlen = 1947 -msg = 437E0F77BD0E14D704BE86135119F39A0A65650C762852E2694AD9BF2EA45C7EE59DF915F5AAC128309847E944127294566FFB193D0361DD7111D32B06DBA60A12E053F424DDD70674E902E409BC6F5891CB9A76108322CDEC1491D3D89A74CEDD855BB0791DD6DA371A75AE979593B5159FBE9DDACF88506E6A184547E2A7395A46FBAAAF286EB7780B789FED86F257E5036A3555E777B909243695CE89957DF492C80050457AFD84AAD9F8918099AB00FD7AD3528A3D0AFE5B52300053575B839572D4D7CE43C255BBF5F16948D40BCC2E63714487AFD3638601ADF47A324482ECC99FB88574538809227F8C0A5FA7F20A0B2FEFDA38E6A665550E44B8D5630290A4815621A5DD74A2108CA946241C48661EB087240788808BF676B145442B2DE4C35E1A6B8CB1E97E54CB729202D8827A0D4994C6D7F3F406ED273B00B6590006AF069D69173B5EA8237B87705F362288AC3A50BBE7E70EB15DF6ED820D66290F57A87E51B2C5777C9C95C2A76ECF2E296A7C295BFE029BBE681B32A6D9F16D11C7CA2750E2F8877AF5DDB616D8A820DE998B0B2AF5B0C2C5641F498C99971932327EC2C73C0EF4058D9F33683F60553AD2962370AFC6725743C86E591D7D7C20944479DACA5E92D66A33CA0C862DC60DFEB5EC3C6E7DE356F6E43F06B1431358285398F8885176D60CBA218217DC7AFE4AD876D0890648052A56812BC3F8A9E6C49F9D70B0A032924B891A9410BBE2F214C842BBF0511EF9017744A0DBDBD500A4189B471930E25216D2588CF8BA39AAE7623966CC62D6C4ECC8B00B0613D912E60ADF613C8F55B778EFB93A513A776C64E8DC943E6272C0EAB4004B4B05CE9BCE9CE2F2B86FD8429E9A72CB16EC3DED285339EDFCD122150F4E7310F669B1DD4CD7E76D282D10314E8ABF61D53BF343F3EBF9968E1BE8F3785581F675BFC28C893729CF67345D0F7C11D6E7D6DA0BFF255BF706C986704A3B9C6FA0602C6DC108A59CCA70F624B08E4F5393E597459BEA4AAAA463A3B08DE147E10DE6B75A0D87BB79BA9A71E7F5999C8972BA992228B60912AA2D7A32703BA8BC02F774430A2B590911D48D3866396F1D71F19CA90EBD5277743A984E2156CB57DE88EBE91BCC09CCB5C687CBCD4E48E4EE110F4075A21F9A051700B0C2698FCD6A5A73372CA366A230A9ABD153E4DCAB7A33A8226F8458C5892098BC0A95619880156548F300C40BDEF81E8C1D8BD03031C690B7C3C000CE99675ADB4B94752EA22BC9E0278D0A53A2A19363A9388BB8D6C24A45B5DEDD8F7482E9C29603FF182F25856FBEEE2B41B88B352F99DB5F33D8EAB1A1A1FEDE60EA6CFB7478DB7540D3A286E88117503C4D0A2C13D32AFE3F1A31D1AF9EE60EAB8FE06248CFFFC7BB438B77D94B5644805CC276F19268DD1FFEFBAB3C796923288638DA1C15E014723A84F8C2DD9F55F7ADC2ADC13FA7CDC29BAF48CA438C882DA5F7CAA792B7CD984BB11EC4B681B332EDFD4AB4C132B08BFB688F81BAA3FEC5A079E2182C282A3EBE2AD5E4C59090BBB989E6A07D85D604F5FFDE0587ADD29A5175CE65D29FB9FDE3E8B49EDA1D88EE8DD64FA1498D33EBAF4A847EE9FEDD3376AF46C1552A150014C11DDFC5047929E2415D3F9D81186A685A1CAF2F004DE777760F0567E880866320A7B42E61CC994719DDC81E28525E50195FFE4E0467D9A9182B75EF57DFEE926D7744485A55E07D1BCD1C9B9B12A60460BFF016E9834848665F132E2FF87805E00154C7D9853DBCA43D005BB197EEDA3D2D9249A621EFC4177415BB103893C82EEB0AEEA056B40E98B5FE65527432FF33CE3E09FE1288A6E2641011721279253800ABC4B73F65B15B434BD34A573E77A94729A78C92F0E791570A416A0876DB39A8FDA8696FB12E7FA3BB11E7838054E4195164B9676DD03327810CCFF9586217AA3D50E7D3EBDB1AE1BF6889DF316047CBB278CE8C9741798452A38E48A7138E1FBA286B497FDB8B1E7BF6145C5F29ECF6D5430F8E550314DB3CF48F27897F312C6D9D6357A880B721E5148DA7F789238CE411F952695F4A878756BDE311BB4E62F10C2F9939B8530EF70D3FB431655AECA2AD36BB5DF0582A07F53F1DF8E0325E635D5A5E795C130106502A081F2FC52A9D97C5DAAF174F13D2DE1EA0F8860F08F4FD5B571E1AB1E84437F3C82BF19B96E46513C316BDCF994BC26FB8461F90594E08E6D4A032C1DA38481A1AD7BFB7D5270255BFF23CE035535CF478216E6D2E62E147AD93357D62636B1AE42C4E8433BB94CA91D0F8EC265F2793514543AA86B786D9760BE5C77AAD5A8449A7DBE92391EAAFC305C1267A68E6ACF0F044FC144D82C917992748B9232DEC4E33EC97534F2BF60B56EDBFF675F0343C9C78E8A8D0529A78E2EED9F998B360360352009F01905C1A4815A36B111CAD8E5B34688B99216171D4F57283CD669DC05995BB8D94ECBD3E7B662C4A603BD85251F2BA35FB6CA492C2B3E996FE66A1EB904CCD61B0900E7DEDCF136F50E4C3AD5FC312A2DE4B3E51F355D01763692C0722C700A544E681A316A1D261FAD727E557398E500F15DF33883ABE9D1BA645936891F5A91FF6C8A7B9B6FE5062718542DF4FC4BA50D7F513945482381ADC42D5A9D444CA211232615306D7241FC49F08912BACBAFBB056C018AD4D6021D99FD720ED6548A5A29DAEFDCE868D71A1BA72D9F998A3F89FCFE526493582C4C8AF5C1BE065EA29F6155428DBC955B745DF -pk = A630FED8FA16996D686749A9DD68033E79533B743C026A2BC2FF14398895DB72CFD9B248CD7826CCCB6C55F417BA08030E82B20EB4B47799D30B94C00818C5D78B81B27D077AC50FFB12357765E89E5282E23DE235832D8EAB308516FCA89501 -sk = A630FED8FA16996D686749A9DD68033E79533B743C026A2BC2FF14398895DB72CFD9B248CD7826CCCB6C55F417BA08030E82B20EB4B47799D30B94C00818C5D78B81B27D077AC50FFB12357765E89E5282E23DE235832D8EAB308516FCA895010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AC36C73259529EAA764B63C3A28EA53CA0E33C686AB400B5C4AE37972D91BAF1894BF9414A57A1C0EF765CBB10D95CA333676DA550AC83150D44E83CAB24B0BF6C36F3FFFFFFFFFFFFFFBB8BFA5B6B3B08EE7ED81C6DE5E7B14613A001C2A5BBFECB469353084468EB151200F4285C0928BD64F79A2C417643BFE928B2E3D1F50703289143D79F31D820113CF9FFFFFFFFFFFFFFB3B0730BBEC569BB6B99C4E9061C77FC95713D9BA1E86E86E263F56945D34E1B2FBC11C27FDE1693154CFBFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1068DC4608B8D435804350474A936EAC412A547A5DAB21773A1105D8249CE5F3700C05F8E9F4E00F966D13010000000000000000000000000000000000000000000000000000000000009F2CB9B6A8C607CD16CA94C7039BB6345913BB619F0F6AEE5317C34C04B0FF8F7DF4718750B3D19F45FDDAA0A1527200E1B0DAF211249ED1F32AF7B82D2F346ABE8D676D641DC76B8DB0E86F08B4FDC5B0ADC1E977D96843645E6C3BE9FD5E03648DD784D6F0C907272F713512CDBDA42EE6286C91BA5E7A3E698FBDF47E7E134DE882F70B0166777659ED101C8B7101B593C514ECB6EB5F4592CA6850FF1D3FB599AD0429F9CE691EF2B39C794D63A01572D15B16F5F4683650E3BB3BED3A0035BC718AE49662AD2FC52281DBF597DF7E8374B7C0874213760F1D73154061726BFE1A333279F37E5D89507A590E1202B853432BC4AFEC913E49B5DCA047CD0207067B5D5A044BFCB0E22465487471D518E02C58146B6351714F55C3F03826027DB527B6F0FE0B3D2BFB0E6A02CB05751DFF64AEF5D62507422DB7F41A70F94D500795832F9D9638E43C8F2F8119A6039E511C0B132C9A57732D34AA4CB81DF51B4F4F0E358ADC68A522AE60DBD14D28F9B06FABC39C39684F8EDC358DF13C03059F197A795CDD1451489577369C8C5333B4658CB024DC8E312EBD60D68687990F2E19FC7EEDCE77CDC45425EFA61600686F58954B7E22A9CD44112FECFE2287F68DCB61AE700CB826FE83884EEA08F7D1864F2359DDA9837C698A38ABBEF70267238D86D576586F3EDD7BE6C80397F73A88310FB37CC45A69CFCDDC2E04BBDAD131A1D16B74876B799A093075897601C5CE37C9256684330DAD76A1A36E077CEE56AE0A353217D32526CD14FA47D9197E43C7195982193212F922C7870AB8036C097F2197C8D89C4E32D9FD2A552C799D570CB7EA1C98C75ED9F0E9E4F969380D09A9D8F71C680096E069418570EB0220D4584E0EC50958285D70963F4A71B104F70A2EC56DBD2CA7E137304EB367A97CE97C99C5F99A70B33096185EB00101 -smlen = 2210 -sm = 64200E0738E87C11B78BCC1A0047FFAB21F6FDA6136836FA130174E1FF25F7A57C9E333FF1E300DDFB3702C75B2E419EA3C00800301A7EE527FFC66830BC27A200D0A86B11CE2B1BD3E327726301CFA9847C0EABCC0FB29EA8BC01DDD664307E646E5BC82CDAD2000FD22B5BDE11C9A72566C3EF009DFF2458E6F1007DA48779A701E9ADEF01267CA59F1E20FA7C00515196C1C61442ABD52280C901C8581951B0A9AF97E16D7D03010A2F132E52F39BA0DAB8EF1C01D6DD5570A1C2490A4B29BFC000EECB518A0450939024101FE001013F55A2DF7C4C7199BE80D64774342FB7F178B453A0F58EE6741603B89F26950F8A59975726BDC3014652593B0BEA919D8462ECC1C608437E0F77BD0E14D704BE86135119F39A0A65650C762852E2694AD9BF2EA45C7EE59DF915F5AAC128309847E944127294566FFB193D0361DD7111D32B06DBA60A12E053F424DDD70674E902E409BC6F5891CB9A76108322CDEC1491D3D89A74CEDD855BB0791DD6DA371A75AE979593B5159FBE9DDACF88506E6A184547E2A7395A46FBAAAF286EB7780B789FED86F257E5036A3555E777B909243695CE89957DF492C80050457AFD84AAD9F8918099AB00FD7AD3528A3D0AFE5B52300053575B839572D4D7CE43C255BBF5F16948D40BCC2E63714487AFD3638601ADF47A324482ECC99FB88574538809227F8C0A5FA7F20A0B2FEFDA38E6A665550E44B8D5630290A4815621A5DD74A2108CA946241C48661EB087240788808BF676B145442B2DE4C35E1A6B8CB1E97E54CB729202D8827A0D4994C6D7F3F406ED273B00B6590006AF069D69173B5EA8237B87705F362288AC3A50BBE7E70EB15DF6ED820D66290F57A87E51B2C5777C9C95C2A76ECF2E296A7C295BFE029BBE681B32A6D9F16D11C7CA2750E2F8877AF5DDB616D8A820DE998B0B2AF5B0C2C5641F498C99971932327EC2C73C0EF4058D9F33683F60553AD2962370AFC6725743C86E591D7D7C20944479DACA5E92D66A33CA0C862DC60DFEB5EC3C6E7DE356F6E43F06B1431358285398F8885176D60CBA218217DC7AFE4AD876D0890648052A56812BC3F8A9E6C49F9D70B0A032924B891A9410BBE2F214C842BBF0511EF9017744A0DBDBD500A4189B471930E25216D2588CF8BA39AAE7623966CC62D6C4ECC8B00B0613D912E60ADF613C8F55B778EFB93A513A776C64E8DC943E6272C0EAB4004B4B05CE9BCE9CE2F2B86FD8429E9A72CB16EC3DED285339EDFCD122150F4E7310F669B1DD4CD7E76D282D10314E8ABF61D53BF343F3EBF9968E1BE8F3785581F675BFC28C893729CF67345D0F7C11D6E7D6DA0BFF255BF706C986704A3B9C6FA0602C6DC108A59CCA70F624B08E4F5393E597459BEA4AAAA463A3B08DE147E10DE6B75A0D87BB79BA9A71E7F5999C8972BA992228B60912AA2D7A32703BA8BC02F774430A2B590911D48D3866396F1D71F19CA90EBD5277743A984E2156CB57DE88EBE91BCC09CCB5C687CBCD4E48E4EE110F4075A21F9A051700B0C2698FCD6A5A73372CA366A230A9ABD153E4DCAB7A33A8226F8458C5892098BC0A95619880156548F300C40BDEF81E8C1D8BD03031C690B7C3C000CE99675ADB4B94752EA22BC9E0278D0A53A2A19363A9388BB8D6C24A45B5DEDD8F7482E9C29603FF182F25856FBEEE2B41B88B352F99DB5F33D8EAB1A1A1FEDE60EA6CFB7478DB7540D3A286E88117503C4D0A2C13D32AFE3F1A31D1AF9EE60EAB8FE06248CFFFC7BB438B77D94B5644805CC276F19268DD1FFEFBAB3C796923288638DA1C15E014723A84F8C2DD9F55F7ADC2ADC13FA7CDC29BAF48CA438C882DA5F7CAA792B7CD984BB11EC4B681B332EDFD4AB4C132B08BFB688F81BAA3FEC5A079E2182C282A3EBE2AD5E4C59090BBB989E6A07D85D604F5FFDE0587ADD29A5175CE65D29FB9FDE3E8B49EDA1D88EE8DD64FA1498D33EBAF4A847EE9FEDD3376AF46C1552A150014C11DDFC5047929E2415D3F9D81186A685A1CAF2F004DE777760F0567E880866320A7B42E61CC994719DDC81E28525E50195FFE4E0467D9A9182B75EF57DFEE926D7744485A55E07D1BCD1C9B9B12A60460BFF016E9834848665F132E2FF87805E00154C7D9853DBCA43D005BB197EEDA3D2D9249A621EFC4177415BB103893C82EEB0AEEA056B40E98B5FE65527432FF33CE3E09FE1288A6E2641011721279253800ABC4B73F65B15B434BD34A573E77A94729A78C92F0E791570A416A0876DB39A8FDA8696FB12E7FA3BB11E7838054E4195164B9676DD03327810CCFF9586217AA3D50E7D3EBDB1AE1BF6889DF316047CBB278CE8C9741798452A38E48A7138E1FBA286B497FDB8B1E7BF6145C5F29ECF6D5430F8E550314DB3CF48F27897F312C6D9D6357A880B721E5148DA7F789238CE411F952695F4A878756BDE311BB4E62F10C2F9939B8530EF70D3FB431655AECA2AD36BB5DF0582A07F53F1DF8E0325E635D5A5E795C130106502A081F2FC52A9D97C5DAAF174F13D2DE1EA0F8860F08F4FD5B571E1AB1E84437F3C82BF19B96E46513C316BDCF994BC26FB8461F90594E08E6D4A032C1DA38481A1AD7BFB7D5270255BFF23CE035535CF478216E6D2E62E147AD93357D62636B1AE42C4E8433BB94CA91D0F8EC265F2793514543AA86B786D9760BE5C77AAD5A8449A7DBE92391EAAFC305C1267A68E6ACF0F044FC144D82C917992748B9232DEC4E33EC97534F2BF60B56EDBFF675F0343C9C78E8A8D0529A78E2EED9F998B360360352009F01905C1A4815A36B111CAD8E5B34688B99216171D4F57283CD669DC05995BB8D94ECBD3E7B662C4A603BD85251F2BA35FB6CA492C2B3E996FE66A1EB904CCD61B0900E7DEDCF136F50E4C3AD5FC312A2DE4B3E51F355D01763692C0722C700A544E681A316A1D261FAD727E557398E500F15DF33883ABE9D1BA645936891F5A91FF6C8A7B9B6FE5062718542DF4FC4BA50D7F513945482381ADC42D5A9D444CA211232615306D7241FC49F08912BACBAFBB056C018AD4D6021D99FD720ED6548A5A29DAEFDCE868D71A1BA72D9F998A3F89FCFE526493582C4C8AF5C1BE065EA29F6155428DBC955B745DF - -count = 59 -seed = 750A74866BE8DF4E60BC14BF36E6D83ABF6DCBB86792D125CF0980007C5435F40F87BA96498A88252D9C5C6710807652 -mlen = 1980 -msg = E4E3EDCD70C4BBED033F402CEEDC2C265DCA10B2DE0DB00D454C3AE1A0D00C97E1DC8C6804B1777ED21DDF5145B9F9348A931C128A8FB03827F653C37CD95859868DDE356ACE682F627FB69FCD97757BBE8BD5A260A293D2ACF0BFA2C0A3548FE25A2BA1A21F95123D592B40C20A927FDB615E69878E8D7C98D261DC01958A088599D3F9BB5E14002192FC7DE417B1074B3F7B52CD2A699091FD9DC3C5929E51CC0259D2255CAF0E444EC11257B759978BD4A7C8E2CE8473325B7498681102DE6FFE9764334D862E379D9F2EBF9B312FA75D7A50E08B94BD43EEF78722D423928FB8E26FDA85A345EEED0326A5D694E4729154A9997B269407B7D03818025EEB2BA96580626DFDB3BFBFCE100C508170D8150E4980D5D386761F4E8311339B47852ACC2A0A01DAD90D3978DE6536547D4F203CEFFAA652E4F2F28639BC3FF83C485C28EDC0BBE21D17B8ECAF3794D64C36FFE7F07E8A906CAB8E7FC9067CA4BF9B074C7FB01EF99A05D7C0F35D889A63AFE5FF18023BF77F8A3DA0C3CECEA0E538A6DAB5C54F3A0D83151595AD3EC4C45132EC2F22F652EA5DD930E692A7C0D7C23DE84314CAA7C017AD50D430FEF42DE557073DDBA6CAA4A787C92E6E28368943CAD0974EDAEB7ADDF991CCE20BF51C5A898CF0A2104ABB810BD4937D23E5D43490A3194B8A109B745E0A365EFA59199B43835682E996794F16C5CB874C88D9697B189AC54A1BA1F459623C1563CBA7689EBB32DC4FA0BF30E064D119D40C36301A653A4F959C97873003CFF7E8E030A137BAFE0A60AD08E4F692DC107E68AB40EDD0C384875B8525AA0A5EC3ACEAFE557EC76DB5283672F9751AFE1166D53542D216186A3DEF4DFA94E57BFFBEBD6F4AFEC3C0F3F40F651A1251A9AB39C262D42313E9F22879645589EA54FE894AC005115A43DD806B2C8BE6222DD9F02189D4221A9DDE99ECB8C3EF4171776268C12ADC37E4CA92EEF09D2D1803DB1FE917521662BA7EC0C07292C7E2130ECA4EEFFE53EE0CEAAAFF6F4CCFD42186611AFEE79BC651B1ADBAD08458592D69FBEEC708C7537925658BABBE7E9867915C6A728EAF41B0AF2EFFE55207C01652891C373F7A14409D05FE9E26C2E72D688047DE9A0954516B85ED6A3230B6B0EA9C5F086720C26EFBF8B7F5C5D14651D54C4EA181A707C562239CFC08B2E09A2941D04D587B90134D8F670F734578534138CD9CB7EC04437A768FE65FC5B3FBE818DB423A2208E485669082B422AB1257C2529CBF7BA4CB30FA27B7F702418C2EF9C3BF7CDE53661DF716449C6337C54542EADC5209A0E030AD6577DEEACC6BE1813DB24BEC035CEE6AEE93749D524222535A0277600F8E4F4BEB473093C5A00B6666CB319DFF131AE4F004EEB1BF71E5D274E3DFBFA246DADA9D6F548907091045FCCF79B363E695AD54C2F791861CE04874EE8C3375612DE820CEDE04E4472BC3DC19ABBB91C42A1C3D7B467837570E7D20A2CA6405DECCFF1AEC03E0558076E988619CB0CDA9CC87A12367BD486B676A4F71D40B88AB4E7FA750350DADD1A8F12B70864792D3CC1804BE8B7CB9DDA532182C32582015C1788B43054B7010229F46BD39000440E7F5D22E4D52EED85B204B344680426AEF51F0CE0551FEB9672DBF391A9AD363ED090837CAC1E721878E65AF9BA92A0EE7C7979925FBA9F4E452EB4FE3AF03B9EFF0526FF0A331AC0B8CD27A0C49E5019B7025C3C9870C900A7FB31FF834E04B87DB77C4D6DAE4C3FEE741E923704EE5F294D8F881833E9137158D1EE0FBFCB4637ACB814A2A5346607BBCD6BC916235F7875334F2B75A7EA7B8B8DDCDF46C0B8007C9B3A014EC6E634D4173CAFB1DD09CB9ED4A123151F4F2631D4BEE1520C10C15AFEB17198009C2B254C1FF0BECAFBF69BE8C7DBBFC7E8F3F1EF05FF6A7945FF79ED6C317609B9238670DEA26D56D481F87CA171CCFD726CC0728C965D9BC38D376D707E6979908B19FDF7E74ECD2D0671EC338FD54AD6CC5F789E96018521882588F888D7D715104D65954DBA8907C0B7CE3F2ACB802ED49DDF1416C29E8D685C5AD879464819E1D53FDAC741F71E31AC0C17B6C8932A4A00E7164CF8BBFEC36EBBD30392145B292D355FB304A88A638F991F6F89A398B09F1DE4F0B29866029BEE75A12D724A52736F2B9F49937F0E51B0F2E1BD2C1BC9325BBD1061E0F7685ACA02DA735D8FC39646E0B2453BB9690ED1C4853A757EA9DC2F4EB4B5ADBCFCBFB0CD2587F61A24B77CA0D6CFCFF47A98C7098B986D4FBD0E46EF0D1F9DF842F4473C43912AB49F4117C8214A42F3083936C7E8A38B294BA081296A393DCAADDCD0D340AC62511E47DA6591836553EEDB466DA6285359EE831A952E6C7AE3B943636124E43224D527B7D394511CF31C50EC1D3E7A20E49850905D504F1AAE477830E3BDA50430EBD47FDBB0BF537D8D479CB799B0429C3F6591328299A09F45CF9C6D30D5C1C9203B9521D807875D7FB2C2CFAA688414497122161B1B4F159B66C0834E111DA4F82D5252367FD2DBFDC079333FC51AB0D34ECEBBE786F984852A596BE620EC6CF84ED596425B90316A13B39E5EBFA19B319BF0FD1D6C812F29970FB1FFE948BC0D2E057B1DEA15445D71B5F728C72DD0C69E277C58F031F90932994AC5A177926DCC1C570AC1B4B099ED66ABF7DDE5A5D77D08EF1AD7C6FFE018F56EFB07C737F33038846247EEEE147E4A5995BDC3352B73F15FCE5140410AAE3F0AF1764E5AD996D01608C5E6C6C96A20274EA7781B41FC532B01B52134FEE28F501EFD9CF -pk = 47E0A69A9AEE06526C78599479593479BA5D38319F3EBBDEE0B1BFC220AE8766D189CED9988CB0055DE3109769794D0145FF2BAB6D1FBB40DE6ACAE3E1EE6EB42DEB885959DF217B5A39AB9F1FA8C9B77477854F466355C89D82D7238546A901 -sk = 47E0A69A9AEE06526C78599479593479BA5D38319F3EBBDEE0B1BFC220AE8766D189CED9988CB0055DE3109769794D0145FF2BAB6D1FBB40DE6ACAE3E1EE6EB42DEB885959DF217B5A39AB9F1FA8C9B77477854F466355C89D82D7238546A901020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046F40C38B757C1D0BFB6B11F5E6B367A89C2745C71E35FD6459B9B25FE441DBA64248F1333C14A529D010BAD34353C1E6D363F353B0D07645196AB451859B66ABFF4F6FFFFFFFFFFFFFF7F228EFA99E1F97D267AE9CE9FBDA9B6C10AE5166DB6E4AD8FE2D99F8702F6A8FBD70E1EC612E63F787F1C3550690A2DDF8658D1C7C79376D35C8A820C2BD076AB0816000000000000002F576FABA07A9E0A950EA8E626FC538F50DDE915DDB3E8D8A0A6DB897D09A563E7CD70056A040BDD768C51FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1EE03E44ED618748775BE2E4034FB3565E5B617D169A8D9B7A19AEB972051236E74E1B08C29E1C618AC215010000000000000000000000000000000000000000000000000000000000008CD8632ADE02E44C4BF24C3329458E07DE02BA9EB45B8960C1B78C148F5C12681CCD57A4D48B2B0D5952F4E4583F910201FBEC041CB2D80B8E6DCCF3D2823B975FE46F2435F8BDE90F97BC86F41657BF63B7CFFCD81E90CB021720DD5165BE0321A78667D86D07E64A7D6E310AF2494A6AF225917573290992EEA11C3238015381A44A657048FA239F5FB4EB14D0C8019BCE09E1E33DF361011DD8AA5306E471F2F98CE4791D2CA57764237E98BA24A9B46675952254414EEC1D8A88753567039593D8A25C58CF0935FDFA93A6139E2CEAE978DA78644A176CB935148E457C65CE25EACC3BD8B4C74BE53DE9A6F1B1005662C8C44DEC16261C17C2D6F26AB9839533CEE3F442B14B492990E5AE38E1491F1008703DC19C3EEE728D8E2D0C0303D21BC40E08D77CF9D6910B0F386FD6E12E8B951ED94F31C7E38DBEE87249A94D579968A3475733700B81C30A0D5B01021159AC37DC5D3C046BF77834AA482F30771A96D12B7DC1E59423CC2FF3D9BC2120D0A156FD91353E239D386D4B6B79029A61F405E5568F495D0204138AF8665E1726A64088F824FDD0A5B87776E30B6305912F9F79EFAAB6E06ED5CDCBBD500092DC6C075EEE0861682124B9D67379A03696770B0205D3279F0C9F887BC2B503ACAA5391E69157A0C62D84DB068F9401100AD7F44E4A6C7FACFEF9AB343CE52D18B0EAE3088832DD428D1968920E029C1ACF3D20FDF152340B9FDFEAEC9EC8021FC42E7604982CB85BA7C9110F3578EFBD5C334D940387A70FC9ACDD1A38EA502C1D7D16E00F62BE15020EBD6EB16A008DF947DEC2BDF7E4F22D148800993A69C906AE24AB4DA16AD7C6B9DE49FB4D662BFCB6C9ABF48769A7CEB37A70C254008BE057EC6E6AEBC53117698692A90CEEA8AE291CF1A453B342F88D211F64339FD062037DD2C8CB6C9C30C014C467A201 -smlen = 2243 -sm = 96302992C2D1A8EF2E8F7C99004991FF9D50E8A0A7ADDC690200E51CB2E423E8E7F886DB9F9E005227CB7FA6A870AA0DEC32590129A946C2D594DCC201A736700106520E94945E7A042DF3D023002401F500A9030C28557BD9CE0057A8C2716813177B87F5542700E7BBA88FD3425536433DDC9501BE69A57104BEBC29A3CAF352010D6802A30089274565AA665900FF41A8DD40C202E53B75A0C90085105F1D95A7BFE98BD7B6A300A50D247ED6ACEF583FB6801D00A822984AC34B357903DBAAEF01F0D42B339F1DAA7B25B185010101DBF251B31D61130C062E70749A621530612E885D59207D5E7C1403251341D539EEC46FD17DEC69005BAB6A6980C28EA9128E467FE809E4E3EDCD70C4BBED033F402CEEDC2C265DCA10B2DE0DB00D454C3AE1A0D00C97E1DC8C6804B1777ED21DDF5145B9F9348A931C128A8FB03827F653C37CD95859868DDE356ACE682F627FB69FCD97757BBE8BD5A260A293D2ACF0BFA2C0A3548FE25A2BA1A21F95123D592B40C20A927FDB615E69878E8D7C98D261DC01958A088599D3F9BB5E14002192FC7DE417B1074B3F7B52CD2A699091FD9DC3C5929E51CC0259D2255CAF0E444EC11257B759978BD4A7C8E2CE8473325B7498681102DE6FFE9764334D862E379D9F2EBF9B312FA75D7A50E08B94BD43EEF78722D423928FB8E26FDA85A345EEED0326A5D694E4729154A9997B269407B7D03818025EEB2BA96580626DFDB3BFBFCE100C508170D8150E4980D5D386761F4E8311339B47852ACC2A0A01DAD90D3978DE6536547D4F203CEFFAA652E4F2F28639BC3FF83C485C28EDC0BBE21D17B8ECAF3794D64C36FFE7F07E8A906CAB8E7FC9067CA4BF9B074C7FB01EF99A05D7C0F35D889A63AFE5FF18023BF77F8A3DA0C3CECEA0E538A6DAB5C54F3A0D83151595AD3EC4C45132EC2F22F652EA5DD930E692A7C0D7C23DE84314CAA7C017AD50D430FEF42DE557073DDBA6CAA4A787C92E6E28368943CAD0974EDAEB7ADDF991CCE20BF51C5A898CF0A2104ABB810BD4937D23E5D43490A3194B8A109B745E0A365EFA59199B43835682E996794F16C5CB874C88D9697B189AC54A1BA1F459623C1563CBA7689EBB32DC4FA0BF30E064D119D40C36301A653A4F959C97873003CFF7E8E030A137BAFE0A60AD08E4F692DC107E68AB40EDD0C384875B8525AA0A5EC3ACEAFE557EC76DB5283672F9751AFE1166D53542D216186A3DEF4DFA94E57BFFBEBD6F4AFEC3C0F3F40F651A1251A9AB39C262D42313E9F22879645589EA54FE894AC005115A43DD806B2C8BE6222DD9F02189D4221A9DDE99ECB8C3EF4171776268C12ADC37E4CA92EEF09D2D1803DB1FE917521662BA7EC0C07292C7E2130ECA4EEFFE53EE0CEAAAFF6F4CCFD42186611AFEE79BC651B1ADBAD08458592D69FBEEC708C7537925658BABBE7E9867915C6A728EAF41B0AF2EFFE55207C01652891C373F7A14409D05FE9E26C2E72D688047DE9A0954516B85ED6A3230B6B0EA9C5F086720C26EFBF8B7F5C5D14651D54C4EA181A707C562239CFC08B2E09A2941D04D587B90134D8F670F734578534138CD9CB7EC04437A768FE65FC5B3FBE818DB423A2208E485669082B422AB1257C2529CBF7BA4CB30FA27B7F702418C2EF9C3BF7CDE53661DF716449C6337C54542EADC5209A0E030AD6577DEEACC6BE1813DB24BEC035CEE6AEE93749D524222535A0277600F8E4F4BEB473093C5A00B6666CB319DFF131AE4F004EEB1BF71E5D274E3DFBFA246DADA9D6F548907091045FCCF79B363E695AD54C2F791861CE04874EE8C3375612DE820CEDE04E4472BC3DC19ABBB91C42A1C3D7B467837570E7D20A2CA6405DECCFF1AEC03E0558076E988619CB0CDA9CC87A12367BD486B676A4F71D40B88AB4E7FA750350DADD1A8F12B70864792D3CC1804BE8B7CB9DDA532182C32582015C1788B43054B7010229F46BD39000440E7F5D22E4D52EED85B204B344680426AEF51F0CE0551FEB9672DBF391A9AD363ED090837CAC1E721878E65AF9BA92A0EE7C7979925FBA9F4E452EB4FE3AF03B9EFF0526FF0A331AC0B8CD27A0C49E5019B7025C3C9870C900A7FB31FF834E04B87DB77C4D6DAE4C3FEE741E923704EE5F294D8F881833E9137158D1EE0FBFCB4637ACB814A2A5346607BBCD6BC916235F7875334F2B75A7EA7B8B8DDCDF46C0B8007C9B3A014EC6E634D4173CAFB1DD09CB9ED4A123151F4F2631D4BEE1520C10C15AFEB17198009C2B254C1FF0BECAFBF69BE8C7DBBFC7E8F3F1EF05FF6A7945FF79ED6C317609B9238670DEA26D56D481F87CA171CCFD726CC0728C965D9BC38D376D707E6979908B19FDF7E74ECD2D0671EC338FD54AD6CC5F789E96018521882588F888D7D715104D65954DBA8907C0B7CE3F2ACB802ED49DDF1416C29E8D685C5AD879464819E1D53FDAC741F71E31AC0C17B6C8932A4A00E7164CF8BBFEC36EBBD30392145B292D355FB304A88A638F991F6F89A398B09F1DE4F0B29866029BEE75A12D724A52736F2B9F49937F0E51B0F2E1BD2C1BC9325BBD1061E0F7685ACA02DA735D8FC39646E0B2453BB9690ED1C4853A757EA9DC2F4EB4B5ADBCFCBFB0CD2587F61A24B77CA0D6CFCFF47A98C7098B986D4FBD0E46EF0D1F9DF842F4473C43912AB49F4117C8214A42F3083936C7E8A38B294BA081296A393DCAADDCD0D340AC62511E47DA6591836553EEDB466DA6285359EE831A952E6C7AE3B943636124E43224D527B7D394511CF31C50EC1D3E7A20E49850905D504F1AAE477830E3BDA50430EBD47FDBB0BF537D8D479CB799B0429C3F6591328299A09F45CF9C6D30D5C1C9203B9521D807875D7FB2C2CFAA688414497122161B1B4F159B66C0834E111DA4F82D5252367FD2DBFDC079333FC51AB0D34ECEBBE786F984852A596BE620EC6CF84ED596425B90316A13B39E5EBFA19B319BF0FD1D6C812F29970FB1FFE948BC0D2E057B1DEA15445D71B5F728C72DD0C69E277C58F031F90932994AC5A177926DCC1C570AC1B4B099ED66ABF7DDE5A5D77D08EF1AD7C6FFE018F56EFB07C737F33038846247EEEE147E4A5995BDC3352B73F15FCE5140410AAE3F0AF1764E5AD996D01608C5E6C6C96A20274EA7781B41FC532B01B52134FEE28F501EFD9CF - -count = 60 -seed = A832D4AAE8076C4EFE8319A74CE315928AB765BB629075254CBC63EAAE691C220F4B5E1839E9A99D8747AACD7C2F1EE3 -mlen = 2013 -msg = 84C603D1B5549C46964FF2987A1F533B4CED94E67D576A3B0BF1C8BD87A74AC7DB640FC9F7ADE44FF79B820846EB83367153F5DDDDF9DFB7848A13D59436916EFABB82DD61291447491D2CA04166FA8680E8E0E0DC98E79344534CA1CBDDB531797A61C291606200107002091ADFA927A763CF98CBBD631CFE890B0ED257AFD34AC0C5280AA7C70BD0C945D78E6FDA284CBB7B3AB636BDF17342F2BA28D707147F14D15173D9BC0B6D65FD1663C86971BE1FA59DA8325E1F3773BACC5B8D4158EF525FDE6E96631C51AD142250252A8E5786CD621210DF3E24CC0B4B60AC2F013D76DB0C73DF40EFAA05A65383A8892276B3D69DD511937D55D914C3222A2386D1BEC0A268E683716AF4AB709D2D225B86229095E87FE70D69E6A34BB214529CA3F082C0F2709E77B86B00B4A04BCCD343C862333B7C9163857B77E30551710CCC3A803323F5CD4EB5317CD2E6A24BFB77727E1C64D0AC47BEEA1CB35E5F2FF6024C06F2F391FEE76F2E69537673FC0124E48E4E2242E84D8AFFEE6803CE6EDF3A954D2C54562B8B76A4EDD91E24A8640AFE67255605849053B60F558B43DDB9F8A04E987D15F6292962D10AD8F7B47188D12D1C9090C0FE8710DC3937C6939496884BDE0BEA979839837C61BE4DF5662C724610C7FCB4631A0A2083417BE6A20F4EED094E2145BC72A83A6E147A655C481DCC906E63ADC0244D95B6085FC096FBCCE81EEB0497F48BB5EF827C0893E331795E3B301DC9F3A91DBA9FBC838E044E2AD9859F1DC67E9BCC375442B4EB59714B5EBBA87AC9A79C99CE74F8BC75740DDCCE46C4B408B91DD7D4AD26B0FB1A4AB874F5504C40E7363838D22AEC45C10D3CC2E233124A5CD8344249EDF388E37BA43598F2C2CF56D444BCEE04A335B154DFA3CA694DB481CBAA59514098CE6E0E4138C0A543EFAFEDA4AECC022C824259A06C3D57A70EA15A5DFC822449A27F58F9EF842DCBB636CE293684E1B331CD821594A12634E5594410B6C5E2306DC8BBE62C8B0F49F2F699A59EFB14D3CAD399F74ED893E1EB43FD770FD61E0C58E5D8CBC9435F4AD0892681A30DF4885927130432186AD4BE41F6FB7CFE660E23C5E55F60789B3E97C3B622599938B36BD1C0BCF6FDB7E4EE44C92B6A86CA2470BCDB8BAB8DF6079382CA314BF3A8B3C4286518C356018FD6F6FCDD9BE9AD9C228F29135544E723A898F483E9D9EE843E75ACB3FEAC447973D12461FEE3D984F3B4F31645FAEA56852D356C96CD73A6F185E8CD56731E83FEA145A2BF0C15ADC634DD9E2FFC799B59A0712EB4D2618680C7493F50A9BBF3F7BDE1025CD44AFDAF4A8C42C9254B1B34AA8559E1CEE9BDE7B4DA0FB3CB2289418110620E505B793B91F422FCF53ADDA8F7C96D55E26244E075D9A70004642712EAC377CE18F88F2C8581694B8F621707DAB6D292179B2A95AEC5AD6E409D78253DCC05ECCDB45683DFFFB9C629AFCFB0654725D650E4A283FD98E47F37AA9309E2933CC0393625DD81D4A02F9D5082644DE02B6472D5D3AAE110747E4F756973FDFCE8EA5F997E30B11EBD50B45F6889D227D87D9184CBC6ED40E96DEF8B9236763C9999E21BFC1A74457FFE5E0DC2B16876FE04C2E0F0F47012A767A7AC18D71A7FD65F8647A7E1AE2D4D255492A18AA81D17D390E381B1722BC3C38BCCEA9D5E73231D0C6E1A96CCB47079E36C994E94AF9A318D67B6408BB602A91D8E9EC6499DEED0B51A9AE31D9774A1BEF4C1DE0E7A324545B2AF9870CD733C2195C5ECDE386D298C33D492937497EA5F0E05C377A4D755DEA9D96C61FE82CF6299EB34B857217A2C6733FED64F5DAC5F95A0EF2294ECA844B96CEB5163363A31C58C88428152663AB0A2B310B1A9E9027CA8CC0DB6DFF528F9A421FA826A86ACB4FD1D79C1AE6123C9E685BA66F5FF109FDFF2497B1A50C2E4E7B4662FA11FBAA305A960CA70FF98E5290A8C3A27B4A3CF1705C6DF4290FA64F3259FDEDE7A81CFDE4214230DFB9EFB20049E905833B5D48923C8CE2F8A104946FB3356154519D950998677C56C8B2C80471A6117B142E26C0345CDF0634E356D80C3BE12F4AB89EB41DDDCF98188EAD2FF420EED3FD9287322F24C62B21F430D5F9B8592CE1CDC946616111C91C667006E47992FE2D5A2AAD82F8DD1AF3C1B8BA5326220645885CC94E8B2B76CBFF7E161E994C0CB9E489B8A5662E9D420913AF34433F5BAB10AC72C5EEB9249F3C102E1762E862C13CC882D20BE16834E54DCC323EA89A133F451B70087A8DCDC5B518EEF087A571B570A7966F1C49BFCDC70AC05034D1DCC56EDC2C0F57D1AAF16718C67D162BA330AA61A2875F90E2935752BFF1EC28A79EAD1AC18E70A833946CA6A15D8765E1A62AEF46BED232EAE89DBEC278297B396CF611448C5FD4B36B95CDC54E3394C63B9B0969D6488FF1C700B390E7226F99A945306C6504958CD43CD3D63910A4324BB662A0E5DB1622D90CE00E50CE7112193872AAB5CEE0B8D6FD42F26C2FB87FDF99062169C0BE75C85109D4E209DC8A640FED3EC71EF3DE8878B3D1729FF118F50F8A33361C6F707F6011454C5D744989EC1BEB644FCF99CB2E7C3CD20E6F1656E07C3566C4DE68593BCBA0EE9F7BD2E272C3D47A3E03985456F18CAFBEBBC1DE74964BECABDF3E9BBB9A10B29BF3B458FD50F19D63A6231CB51CDE3DF46E4BB6318E81E10AD1674A053C8CFE1E72853FD60E6E642642CB825644D6734AFB00329839F22CED734FA1421C4334E20F2ECC8BBC2652004203B3B639FBDCF5FDA1423F08C3A1100655E4763B8D8356A151D702124D30FDD87B34EC4D34BBB3639464E44A693690E193329 -pk = CD5E25BEB137D08CD1DE5EB1161FF6C396DED42B91DFBC4CB150E96C84FEA80F376A067F272E27A4E30D6312A8CEEB00161DAC17DEAF6837D217C77F5576EB1B5934A3A679EC81943EBF5E3BC0EDAB2AC9CCA0870DF172BFF771D057F7CF7903 -sk = CD5E25BEB137D08CD1DE5EB1161FF6C396DED42B91DFBC4CB150E96C84FEA80F376A067F272E27A4E30D6312A8CEEB00161DAC17DEAF6837D217C77F5576EB1B5934A3A679EC81943EBF5E3BC0EDAB2AC9CCA0870DF172BFF771D057F7CF79030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CB5EB47FFCEB3D1C25B13820493AE1F321467E9A6325B1FFD7AAFB0A95CD37144D9AB59FC16A71EB08E6BB1ABD99393B8036D89342EE3EA9325823929999788FEC96140000000000000018920ABFA03A287B1C12FBA056C320927E92292B44516B0E6FBAC65F4145850A6A8F8C10F7621BA398DC44CFE4CC618F6584D462D1F460377CB8FC55466E74EE1AADFCFFFFFFFFFFFFFFC0A080ED3393B553DA0744C3249612FE1B835BE2FC3F6129ECFBC67725159615B88C1095234E07EF3F64CC010000000000000000000000000000000000000000000000000000000000002BC0F0D3690BD617DC8F15E052A020FA20E878640886FBA47D4DB0B495EEDF85D1EC35BE4B44383DC0EC4700000000000000000000000000000000000000000000000000000000000000285304E33DB164B0AD3B741BBBA6000F0CEED1E3B1200CE31F8B66558ADEC42F04416A1DBDFD6B91CD15397AD5BC4000DA30BEF168AD226EF451312C08966EC231CBBEFFA2E286024907F99E4939FDD2518DEE2F0461C1DD49DBC1645CD282036B8F5FC4A56375153B032D0E0E43A53936FE717EBF81F17DA73AA6352449C60003954EC086713B8820AF3C3A3EBCF8010512E6B8BA7445EA954D222D93782A4E79413BE84BCBA9DE1EAD1ABC859818863B8D14FFFE181B5A23A31F361C6125032750AC40BE24C6796C8E64DECFF114F81C38298C3618599A639CFAB17EC15F66DB93174CB8E894266E5A9F623435550261DB946912A0126A71A95520231124B200C18414D09AF6E48F9E7596206B7E9991BC709FB86DF2B155CB7F147A74FA0210345490472BCEEBE1F6ECC5F54D018A5BEAD49C0589E9243B5FC1A9B73E72B3884DA3BBA414C4C74FBABC0481368601AAF7260EFD57FB9EFDD482809447AC062A360F1EC2540274DA3479B4D108CABA0805869F6C331DF772A307296AB249021634A016C0CA29E55E64C83C84761C5DD4CD58154A551D00B871942C78DDD6C514DAC5B41EB7398789A365DDED05C603F148EBAE1AA3183904F7D8A91BB2A1903AC2D06E8D0FEDBBA3642D4ABB7E3638AFD14847ED4C20852D6C3C3990375302F827A1F293527E5983AB75F623E3631A7F3C02A0FCA893FCC480195AACFD201D9B2243C7B0D04A6273B493C23C36EF003AFE8B37988AC064FB6179D8DFD403B808BD64E608FB0E274F8776BD376AF34E0A33A227D678BE19339D38C4A71E760176B93AF2D4E9437E9A4EA14B7850D6770A7691329D6EEFA7B56F44E1F5C28EC746677E2171171C0242787F35452F08020C3BF86C3274241A188D8A60F1E39A0BD0D3BEE5DAF656E6F8C783947EE7A34B288F6553F933893B8A776C00F2AE6E01 -smlen = 2276 -sm = 624D522A9D1E7AC89BA060490064C412BEB25B372DA1322F0B01734957862695F942267E8C8C0075CE8530106D5029440FCC260023C171E891C897462EBBD6F400CCC171A0BDC6B7776308B50400C381FA84B8D2902B508B201700F20A82EBAD4FD5CF9B80CC7801B8FE47793954B2ABBF9EB5B4015EF48F04D6152F90D3246EF801C694B624DFE9980755F685E20162EDD4A5C23AA4535525DD3D011E8D4D7E201D923F5C3DE378004D1D2443A07692B0E73E765A00837A5D354D6B9DCEF5D7E8AC0106288A4BAF709CEA03F3757E0100E5AE212F4158E15BD92CB46F5C4407277F215847B37679A5220E02347115D3BCDC7CCBDAE2D3B901FD7038CACEE39001BC3F4271100784C603D1B5549C46964FF2987A1F533B4CED94E67D576A3B0BF1C8BD87A74AC7DB640FC9F7ADE44FF79B820846EB83367153F5DDDDF9DFB7848A13D59436916EFABB82DD61291447491D2CA04166FA8680E8E0E0DC98E79344534CA1CBDDB531797A61C291606200107002091ADFA927A763CF98CBBD631CFE890B0ED257AFD34AC0C5280AA7C70BD0C945D78E6FDA284CBB7B3AB636BDF17342F2BA28D707147F14D15173D9BC0B6D65FD1663C86971BE1FA59DA8325E1F3773BACC5B8D4158EF525FDE6E96631C51AD142250252A8E5786CD621210DF3E24CC0B4B60AC2F013D76DB0C73DF40EFAA05A65383A8892276B3D69DD511937D55D914C3222A2386D1BEC0A268E683716AF4AB709D2D225B86229095E87FE70D69E6A34BB214529CA3F082C0F2709E77B86B00B4A04BCCD343C862333B7C9163857B77E30551710CCC3A803323F5CD4EB5317CD2E6A24BFB77727E1C64D0AC47BEEA1CB35E5F2FF6024C06F2F391FEE76F2E69537673FC0124E48E4E2242E84D8AFFEE6803CE6EDF3A954D2C54562B8B76A4EDD91E24A8640AFE67255605849053B60F558B43DDB9F8A04E987D15F6292962D10AD8F7B47188D12D1C9090C0FE8710DC3937C6939496884BDE0BEA979839837C61BE4DF5662C724610C7FCB4631A0A2083417BE6A20F4EED094E2145BC72A83A6E147A655C481DCC906E63ADC0244D95B6085FC096FBCCE81EEB0497F48BB5EF827C0893E331795E3B301DC9F3A91DBA9FBC838E044E2AD9859F1DC67E9BCC375442B4EB59714B5EBBA87AC9A79C99CE74F8BC75740DDCCE46C4B408B91DD7D4AD26B0FB1A4AB874F5504C40E7363838D22AEC45C10D3CC2E233124A5CD8344249EDF388E37BA43598F2C2CF56D444BCEE04A335B154DFA3CA694DB481CBAA59514098CE6E0E4138C0A543EFAFEDA4AECC022C824259A06C3D57A70EA15A5DFC822449A27F58F9EF842DCBB636CE293684E1B331CD821594A12634E5594410B6C5E2306DC8BBE62C8B0F49F2F699A59EFB14D3CAD399F74ED893E1EB43FD770FD61E0C58E5D8CBC9435F4AD0892681A30DF4885927130432186AD4BE41F6FB7CFE660E23C5E55F60789B3E97C3B622599938B36BD1C0BCF6FDB7E4EE44C92B6A86CA2470BCDB8BAB8DF6079382CA314BF3A8B3C4286518C356018FD6F6FCDD9BE9AD9C228F29135544E723A898F483E9D9EE843E75ACB3FEAC447973D12461FEE3D984F3B4F31645FAEA56852D356C96CD73A6F185E8CD56731E83FEA145A2BF0C15ADC634DD9E2FFC799B59A0712EB4D2618680C7493F50A9BBF3F7BDE1025CD44AFDAF4A8C42C9254B1B34AA8559E1CEE9BDE7B4DA0FB3CB2289418110620E505B793B91F422FCF53ADDA8F7C96D55E26244E075D9A70004642712EAC377CE18F88F2C8581694B8F621707DAB6D292179B2A95AEC5AD6E409D78253DCC05ECCDB45683DFFFB9C629AFCFB0654725D650E4A283FD98E47F37AA9309E2933CC0393625DD81D4A02F9D5082644DE02B6472D5D3AAE110747E4F756973FDFCE8EA5F997E30B11EBD50B45F6889D227D87D9184CBC6ED40E96DEF8B9236763C9999E21BFC1A74457FFE5E0DC2B16876FE04C2E0F0F47012A767A7AC18D71A7FD65F8647A7E1AE2D4D255492A18AA81D17D390E381B1722BC3C38BCCEA9D5E73231D0C6E1A96CCB47079E36C994E94AF9A318D67B6408BB602A91D8E9EC6499DEED0B51A9AE31D9774A1BEF4C1DE0E7A324545B2AF9870CD733C2195C5ECDE386D298C33D492937497EA5F0E05C377A4D755DEA9D96C61FE82CF6299EB34B857217A2C6733FED64F5DAC5F95A0EF2294ECA844B96CEB5163363A31C58C88428152663AB0A2B310B1A9E9027CA8CC0DB6DFF528F9A421FA826A86ACB4FD1D79C1AE6123C9E685BA66F5FF109FDFF2497B1A50C2E4E7B4662FA11FBAA305A960CA70FF98E5290A8C3A27B4A3CF1705C6DF4290FA64F3259FDEDE7A81CFDE4214230DFB9EFB20049E905833B5D48923C8CE2F8A104946FB3356154519D950998677C56C8B2C80471A6117B142E26C0345CDF0634E356D80C3BE12F4AB89EB41DDDCF98188EAD2FF420EED3FD9287322F24C62B21F430D5F9B8592CE1CDC946616111C91C667006E47992FE2D5A2AAD82F8DD1AF3C1B8BA5326220645885CC94E8B2B76CBFF7E161E994C0CB9E489B8A5662E9D420913AF34433F5BAB10AC72C5EEB9249F3C102E1762E862C13CC882D20BE16834E54DCC323EA89A133F451B70087A8DCDC5B518EEF087A571B570A7966F1C49BFCDC70AC05034D1DCC56EDC2C0F57D1AAF16718C67D162BA330AA61A2875F90E2935752BFF1EC28A79EAD1AC18E70A833946CA6A15D8765E1A62AEF46BED232EAE89DBEC278297B396CF611448C5FD4B36B95CDC54E3394C63B9B0969D6488FF1C700B390E7226F99A945306C6504958CD43CD3D63910A4324BB662A0E5DB1622D90CE00E50CE7112193872AAB5CEE0B8D6FD42F26C2FB87FDF99062169C0BE75C85109D4E209DC8A640FED3EC71EF3DE8878B3D1729FF118F50F8A33361C6F707F6011454C5D744989EC1BEB644FCF99CB2E7C3CD20E6F1656E07C3566C4DE68593BCBA0EE9F7BD2E272C3D47A3E03985456F18CAFBEBBC1DE74964BECABDF3E9BBB9A10B29BF3B458FD50F19D63A6231CB51CDE3DF46E4BB6318E81E10AD1674A053C8CFE1E72853FD60E6E642642CB825644D6734AFB00329839F22CED734FA1421C4334E20F2ECC8BBC2652004203B3B639FBDCF5FDA1423F08C3A1100655E4763B8D8356A151D702124D30FDD87B34EC4D34BBB3639464E44A693690E193329 - -count = 61 -seed = 09B8441F47235EFC82D71933A0037FA4F69124C3BAD4EF6A3A7178B417A3FDA874081B7EEFD7EF1BF234C752458FBBAD -mlen = 2046 -msg = 92D5FEEF68737ECE61C6E0078D77FBAE97B0B9235F40B97099C114B1586E107B5ED1308A8A2D20BE41AF129DA2E0B38EAF02FAEF733C7A1D1A387BC55EF008530ABC22697D0465AA3EB71F41EE72ADD236CEA9A25995F3689C5A451E2F03915D96ABEA10D356D549D68048977587326523CCD71C05FD57BFB3C7A853F535BEDDEADFB84118F6548860F6BA536277DDD7AB42123E93381A385FA3E6CC023C1458A9F94822D93248F36C48FDDC972B5D6494B26658440FFBC23B57363F3D82CCE69FEE4747A889E85343288D55D30FC54D2D0744744DBA9977720E8EDD2C0ACA1FC51B0C6A3C68BB9BB8DA0385DB1CA4E9CE660CF7EB2382E5E95D2AE19DEF904A8651DFAE53A4D0DC4D057AB1A506C3BD7E1D1EA3FC4623E7D7B410DCB312F037B7A5FDE5E0E604FC33270FAF1FFB6ECB3125DDFA5C49F25BBC98238C8AB1B903537CD67238995E81B814280A4CED61513D69A2178086D505F8DD1DF7E11CE66AE33D4C982F94231957031A258E0EC745672A57A5CE76D1170111B8882A9EB5388094EBBD53EE9EA1FCE4A275F9D7060C8DA79018487B452817280C63B01B05EFBF897387592E2BB3BB486FAE0AB09F46D9F2E176DE96C59992C10A14EC16EAC36102B1D15541607075E67C842A888C87B268E9809148A323C423220DC31566B62F45CCE1E2BC1B3BF43B87C998F00023890BCE517271BEC16EFAA33F11611FDE87F197852BC2E7A2B44F8C72A6F79B22F73BE0611B81EFE09253931545D2453939C46B6797CC5DC5A8F1AA3BD8456EEEB84EE76DBF2EBF32598750ED10670DF422C7D7993ACC55F657E6E1B3DFA1BD6C1CD55FAE97E69D2F8F5AF368F7DA0A63B4065EB6D8F02B19A34600252FDFFDF4ED8DE2EA9CD2E74D63A6CEF29BF02F92D346ECB9A61081EE5AC811F33AA5792F6A1AF570A8B0846F3E6EF38452346DD637B19ECA37BD1A6C42B20A5BEDE9A5DE3C9F169D04D8C6CF5376D3404F0C21DEAD53DA6C169F390EED7B5B54DBE47CCE0B2AD1179EA8FC80FDDC7281BD4FE31B9A26A00444AF0B4D40A1B72BE37501308906149DC6FC5CF02B6F60AFF82B975FC8F146961EBCCB4D126ADD524A9B33BB16F6A83C6F3727A72EFA2BAC116E493E07B2CA718A63FCAC8E9D52A1B61479B4EE52A5ED30FABCEA4D01A792A92676721286814F3B0F4E15E23CE0C5D59A0C3EB8573C0A2F66C25F2EB2FCFF787324721004979BE5EAC505DFD39F5538E2C1B2CC12D20C1C5CD87299766361AEDDBFFF743693081842378744879E6E6371B3FFA9DDF34966FBF8DEE91B7EDF6EEC3E4E2F410CB5351F847646C22AB594046DED63347D04A008FBF6EE9696C638ECE73B39A269DB239DF36443868AD44D26A5C40FC92DFFB008E436E5C18907F5B18B5E6C5900B41A9801DB070D2DB651187A4DA7E2647ED3E9B6E9781627EB576BEE8334374468760DD3B32985D42945D953D434BFD80D7F7BA537265FFCF27DB0DA1ABDAE89BBE94D98BC9CA197E41C0839728F964FE4CE30B8CC43CBDCDD9CCBE06FE99DEBC6F4024F3F00D43FEBCD62A1822A6D507337EE79D4517AA486870602D4F1C5368B0EAA1FF6C011A9A953AAE58C75BBD3DC78D263A578C75CDB1AB324D71B9A065A9AF3DAB854189585C68D499AE8DB887745E20AD9738705B9D2F5D429F12D6462E5E2EF9FFBA53CE2F4E75449D2A7DBC3C818E61DC546175A6E0C10AE631DF6B1EAE6D134C08466EBF6EB5F8257AA10EF8C6F27F4295F7EBFD450629F3EB4E0F4BE247AD7F5E80703B1247A4FC277311D69E5D62E0B0201A805CC4F1F807DE99420D563A703493AD35A56B2B2DC237112F5EC21C70BF139A9EAD8F7E921F086E001B4C449E42A0E3AFCD5BC757040A2865D0E5ADAF98E37E6F8A501FF39CEF0BC364EECDFFD03069B81F5E1978C397862FD56362835C059FCBE4D8E2A957FADD7D05BB195E21AD67B429621E1D6872DE2D8BFDC91544F9E6AE8C164A23255AD0E00BCB21456F8FA6AE018F49605736C81A5AC0945E2D965F1493ED5BEFCE512AE93AD91DAF6F5A151D6C9856DFDDD1F877945D932261DED67AC8231DC3CCD0B04DC1B02079C897601E363FFB9A3BCBBBDB0B0A375E69EE4A7135C094ABDC237FAA2E5F82D2556290ADCF82ADBA8402C4FC9D0724F15BB87CD7A75A1A7BF826896D8EF63C7A2A3C371756AF638706270652C376100EC42FA55196DF332820D377760448D3E7ADC42E9F5D8A7074BD0FA97433B0E2C501252DE6939AB948552663A17DD7FF05430FA76E29F0519D650B86FBB19FBED097143FC242573E3E6FA4BD4A2EF6D9CE6932A066B4F9FF935BA9BC26FC2E5031C20AE30A52970A2DF3504576108D5F26517F8577BE61E6AA9D192ED62CF36AA641DA0D274B1ED5EE864B549154EB4115658E6C60219CC5B2E22C49CE3BA76A85EFB549117E1207F6DF081D0761421262E352182239F1E34EDBEA4BCD8FA0027543824DD58A20324FD4CFE943AAE5E361C367B22F587E2F9BEE841E11875B026F12B9571512F72985F98F6D0C212DF36A60975429173E317F6ACF72E621F30654A6DEAEF9E9E455524BF07FFDF44642A1826F734D69F3EEF4D52F26C06376C8F71DFB65A24A4C57D74B5976950AF3A57B4248909524BEC47D858C69041EED34E0ED3B111BBC117AB112BBF947D646AB3B7172F5FB726DBC53AE37956E29F5B6B1E3C90BAF4E4FA544FF63815FDF4AC9A2A80CA0E8722383437B9A02F3AC538FEDA7A6D6C1635D3624A385D846E79E956DCE483B89C346C1287A1A7293168D8A885FEB6569EBDF3F47F8BBB50AA43941EB20001959AF1B9B358ABA13FD9BBC596EA42A9774A120AF091D544E79C50686C26B4FEA396BF1E4C25B8EE4929D75569A5FAC521C77B -pk = 8F02808CB372947CEFA55D1A092D4D7E59DD4CE1A1397FE8BE0F86FAEAE3BD1A57F5594E940EBC5BF5C6D5B440547B0331E7AF1D93876991ED08B69395FD5429745B5C2EB9066964137668C187A57D19D689EF6476414D6F9CD71F414A32B103 -sk = 8F02808CB372947CEFA55D1A092D4D7E59DD4CE1A1397FE8BE0F86FAEAE3BD1A57F5594E940EBC5BF5C6D5B440547B0331E7AF1D93876991ED08B69395FD5429745B5C2EB9066964137668C187A57D19D689EF6476414D6F9CD71F414A32B103020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070150B199204C8491E74BC302C316A717AB2BE081092B827F6A93BDAEE97F0E6AB568AB8B9337A28A21DC26EB3AD8547A72F1BD15C2ADAB3FEF26B03D1959D49115B0D000000000000008B9DD2AB2ADA33C8E02135E23F074609196E4D21825672145AFD26D1314264A726C84615F0DA6970CC0BA4EE6592B31FF9DA9883465F800250D1A8629BB46713BB6A2000000000000000AB56A5C893A70F627E8F296F65EBF499D2DE08BC9E5668F0B7F66475F7BA0F7692EC1314F806815D1E34C7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB868CB004FD98F96B51DD381239D5414E5A4C8FCCBBB5CDC4A712825A40EC763AD185E62BC674FF200EE9A01000000000000000000000000000000000000000000000000000000000000EB666545D94829D5F7BB8D064211589B6DCEE5578A37D056D458FF8FB5C2016CB0109887BB84E778350D736C26CA6301DC4FEA60EA129EFE1CCC562BBF041BB933B773891AC9F5BB020447BF2323C8B6569CF4C7ED84BF5566860D15406E610038EEED942DFCAD84B4D84A4D1A21AFA45B4D1756B1700F8D0FF7B18B0F863ACB738CBC899CE8936A8FD87382E9EB390283785E25F4C39847ACC9A02EF100719AE387FE1DDDBCC7FBCC5F8EBC6813EC25FE19B9B1EA1DED80626ED52AB4A36B03FACF072B06CE4D11CC617F53561AF24C8EB460B49D95F05BF36AF5877B51A38D80FDE1CC63774C1609462D97A8346300153ADAD26AD2D3E0010A5652D437504ACD5A8E63D6F5F46F89D77FCDDF800FB37E2E321C79CC30AFF5F8B6D111AC4003454807B0A112A1EC19E4332ECA6471CAC9EA7E1F85130B200A07AAA0B9C0CE0B2B597EDAA94A59FB75C9B8D58EB40D00D8411B471ED816AE34C34D70FB1800D5F956692A343188AFCD01A5F468997F011665A4C94FD2393D2123EE667A80DD00AF5DA6C77260B80D0D7A8264AD896608B6B3F84F75F91D6F5611F47B8B81BEF03A1BF9D55DFB72B22602B6C49240DF0143DB4D348EF7305FBC31C3027A53B701D00A86F1B7D0A34FCA5B9C86B3A0C5AE41374CC2B3469723E553D6BFB7A3C00138FCA500E24252BB016EB3A2349181E0F898031B62C52B36153750D62F14287F31DFF28E11DBB46D19105BAF3BD39A032098DE8460498CC307F684845F4DC8755069E47BF29555022507C25A8755FA307834FBDA0B0A2A5EBBDB9E86DA95D4037FE28067EB3AAFFBA80ACC273963D6772056F5E1D48BB9D3C6219E20B6D6A18B8019ABFCB19EF37FCEFDA8ED171D5F0021D96467D857E1E7F265CA0CCCB09C5BF7935883AC3E264550FDB73ECFD3B0DF9C675195A10B1857C127C3C2A92F3702 -smlen = 2309 -sm = 622CD5E687CA1081BB34AA060063865A17CCC0408A5D28460501A9232127BED766B50C8BEB2901585E98F5CBC812188C580A2700FC8EBD6F8DACA619A55CE03400C48210728BFB46F09375B97F0189DE3A50A15215635D369E080194B6AB980DEE1BBE3584C5F0007E9204428D33B95094CF1CF50168C31101B46DE7D10CB313A3004BFE888DE409952A65D00C8D00951AA50B8D723D42CC1AC61501F4A284EDC84961C05BAF818C000FCCAF72E16301B1F4B01B9700D8BCCB0A27D5A7FBF1F3F5A500C75C28763043BA920687C2190100750D2E673896E26D813B1BE978850ED0655348E4BCD6D31930170250ACB89E6FBB1D1A1B9AF3D9012C2239AD3B1A8A6E4FB98161340C92D5FEEF68737ECE61C6E0078D77FBAE97B0B9235F40B97099C114B1586E107B5ED1308A8A2D20BE41AF129DA2E0B38EAF02FAEF733C7A1D1A387BC55EF008530ABC22697D0465AA3EB71F41EE72ADD236CEA9A25995F3689C5A451E2F03915D96ABEA10D356D549D68048977587326523CCD71C05FD57BFB3C7A853F535BEDDEADFB84118F6548860F6BA536277DDD7AB42123E93381A385FA3E6CC023C1458A9F94822D93248F36C48FDDC972B5D6494B26658440FFBC23B57363F3D82CCE69FEE4747A889E85343288D55D30FC54D2D0744744DBA9977720E8EDD2C0ACA1FC51B0C6A3C68BB9BB8DA0385DB1CA4E9CE660CF7EB2382E5E95D2AE19DEF904A8651DFAE53A4D0DC4D057AB1A506C3BD7E1D1EA3FC4623E7D7B410DCB312F037B7A5FDE5E0E604FC33270FAF1FFB6ECB3125DDFA5C49F25BBC98238C8AB1B903537CD67238995E81B814280A4CED61513D69A2178086D505F8DD1DF7E11CE66AE33D4C982F94231957031A258E0EC745672A57A5CE76D1170111B8882A9EB5388094EBBD53EE9EA1FCE4A275F9D7060C8DA79018487B452817280C63B01B05EFBF897387592E2BB3BB486FAE0AB09F46D9F2E176DE96C59992C10A14EC16EAC36102B1D15541607075E67C842A888C87B268E9809148A323C423220DC31566B62F45CCE1E2BC1B3BF43B87C998F00023890BCE517271BEC16EFAA33F11611FDE87F197852BC2E7A2B44F8C72A6F79B22F73BE0611B81EFE09253931545D2453939C46B6797CC5DC5A8F1AA3BD8456EEEB84EE76DBF2EBF32598750ED10670DF422C7D7993ACC55F657E6E1B3DFA1BD6C1CD55FAE97E69D2F8F5AF368F7DA0A63B4065EB6D8F02B19A34600252FDFFDF4ED8DE2EA9CD2E74D63A6CEF29BF02F92D346ECB9A61081EE5AC811F33AA5792F6A1AF570A8B0846F3E6EF38452346DD637B19ECA37BD1A6C42B20A5BEDE9A5DE3C9F169D04D8C6CF5376D3404F0C21DEAD53DA6C169F390EED7B5B54DBE47CCE0B2AD1179EA8FC80FDDC7281BD4FE31B9A26A00444AF0B4D40A1B72BE37501308906149DC6FC5CF02B6F60AFF82B975FC8F146961EBCCB4D126ADD524A9B33BB16F6A83C6F3727A72EFA2BAC116E493E07B2CA718A63FCAC8E9D52A1B61479B4EE52A5ED30FABCEA4D01A792A92676721286814F3B0F4E15E23CE0C5D59A0C3EB8573C0A2F66C25F2EB2FCFF787324721004979BE5EAC505DFD39F5538E2C1B2CC12D20C1C5CD87299766361AEDDBFFF743693081842378744879E6E6371B3FFA9DDF34966FBF8DEE91B7EDF6EEC3E4E2F410CB5351F847646C22AB594046DED63347D04A008FBF6EE9696C638ECE73B39A269DB239DF36443868AD44D26A5C40FC92DFFB008E436E5C18907F5B18B5E6C5900B41A9801DB070D2DB651187A4DA7E2647ED3E9B6E9781627EB576BEE8334374468760DD3B32985D42945D953D434BFD80D7F7BA537265FFCF27DB0DA1ABDAE89BBE94D98BC9CA197E41C0839728F964FE4CE30B8CC43CBDCDD9CCBE06FE99DEBC6F4024F3F00D43FEBCD62A1822A6D507337EE79D4517AA486870602D4F1C5368B0EAA1FF6C011A9A953AAE58C75BBD3DC78D263A578C75CDB1AB324D71B9A065A9AF3DAB854189585C68D499AE8DB887745E20AD9738705B9D2F5D429F12D6462E5E2EF9FFBA53CE2F4E75449D2A7DBC3C818E61DC546175A6E0C10AE631DF6B1EAE6D134C08466EBF6EB5F8257AA10EF8C6F27F4295F7EBFD450629F3EB4E0F4BE247AD7F5E80703B1247A4FC277311D69E5D62E0B0201A805CC4F1F807DE99420D563A703493AD35A56B2B2DC237112F5EC21C70BF139A9EAD8F7E921F086E001B4C449E42A0E3AFCD5BC757040A2865D0E5ADAF98E37E6F8A501FF39CEF0BC364EECDFFD03069B81F5E1978C397862FD56362835C059FCBE4D8E2A957FADD7D05BB195E21AD67B429621E1D6872DE2D8BFDC91544F9E6AE8C164A23255AD0E00BCB21456F8FA6AE018F49605736C81A5AC0945E2D965F1493ED5BEFCE512AE93AD91DAF6F5A151D6C9856DFDDD1F877945D932261DED67AC8231DC3CCD0B04DC1B02079C897601E363FFB9A3BCBBBDB0B0A375E69EE4A7135C094ABDC237FAA2E5F82D2556290ADCF82ADBA8402C4FC9D0724F15BB87CD7A75A1A7BF826896D8EF63C7A2A3C371756AF638706270652C376100EC42FA55196DF332820D377760448D3E7ADC42E9F5D8A7074BD0FA97433B0E2C501252DE6939AB948552663A17DD7FF05430FA76E29F0519D650B86FBB19FBED097143FC242573E3E6FA4BD4A2EF6D9CE6932A066B4F9FF935BA9BC26FC2E5031C20AE30A52970A2DF3504576108D5F26517F8577BE61E6AA9D192ED62CF36AA641DA0D274B1ED5EE864B549154EB4115658E6C60219CC5B2E22C49CE3BA76A85EFB549117E1207F6DF081D0761421262E352182239F1E34EDBEA4BCD8FA0027543824DD58A20324FD4CFE943AAE5E361C367B22F587E2F9BEE841E11875B026F12B9571512F72985F98F6D0C212DF36A60975429173E317F6ACF72E621F30654A6DEAEF9E9E455524BF07FFDF44642A1826F734D69F3EEF4D52F26C06376C8F71DFB65A24A4C57D74B5976950AF3A57B4248909524BEC47D858C69041EED34E0ED3B111BBC117AB112BBF947D646AB3B7172F5FB726DBC53AE37956E29F5B6B1E3C90BAF4E4FA544FF63815FDF4AC9A2A80CA0E8722383437B9A02F3AC538FEDA7A6D6C1635D3624A385D846E79E956DCE483B89C346C1287A1A7293168D8A885FEB6569EBDF3F47F8BBB50AA43941EB20001959AF1B9B358ABA13FD9BBC596EA42A9774A120AF091D544E79C50686C26B4FEA396BF1E4C25B8EE4929D75569A5FAC521C77B - -count = 62 -seed = D2629CEEAE5C95D3C34C1FFCC2338B4A97782BDFCD39111E18540B69DB035B352D012857111F816F03550BFE5F56ABEE -mlen = 2079 -msg = 7F704CEF1C510BC2CAE9B70FD248C656226BD5686D366528F0D0BEFC0A8761EC640CD2DA7979DE5EEBDF6127F29ABB8607F8A3D3BE05BE25AACE7FEF3063DF28E22A522FFF0B6FF6A0C61F79B02A408E8E1C775AB80BE6841E9F8A9D030AE5518E3EA8A4E31E416E087D47919593598FD58122A9E601A57EF02DE183D56921811AE2253628125C24F93C84361C5EC99E7B16962BD96CA190C68F3AA9DD60CE3AA7610589813B4FB77A4688308D9BC72CBE918583E298E03AB95FC500209C14ABEB3A43BAA92DCB11CB523C4D17EB9C6697B56C8B61EDA05BF5789166F839291CFE2997B7DD462EDA69B0615F2AD82AAC0A32F4B30FE8725849C144A9C07799D6CE9D293C25D8302161757B8C8C8D07032D914EA7DAC275919A1DFA0D3348EC07FDC70266975722763EF85EC4AF9E14288C9659907526566BB3F2DD5DAFC0D422568CA3AE52486D3F2C18B667E5622BA7E52C56BF00F82AF2108CB4949A09179544F30758B7FB98C49EA160720991B14E2858D648F0585AD1BB1D08294F029BFE936154E9D328DF2E054004FC5C29070DF9EE50DCD0981D2BFB3AA7D6F637C4CE457C0C66D27E2670107A2B85D1F026BD970EF3FB7E32C60218D5E43A06D9CD26289A937B4FBAD2A831425728F3D0D30C6C602AF4B14411E9B3C7CF0B4D630614A9E03AC30BA2B024D496DA984D08854F1366012C2400A5C8268C2B126DEA5AEBA0DE7C92BE0AF08CA22E02604A753702BDCD642BBFA0CC91BD8375657A957306A76B6F139621481B6F15CB57BEE128954D30F552661F906D8AB42CF260F30F88993BB40C9679385F5C4639888973361216DF3C60C57D9B250F64B7634C94DDA3FD122713FD2405A7B71F476C263A781DCE271E7D0665E45DCB27F7293DE57312396C58C40E268F57ED856F536C8FEB4B0060488DE3C25949D2B7E64207576641B34920D04B46766AA2978D9352C2769D49F8599F3D0439C928532E0EE428A3773FA4D68E6052335C6D93368E321D750D296799FAF87B82C640A6E995D18DDA002887F141DB8ECE2584DA2FDDF848D38357D585CD619B1625A70A5D333561D6DE856ED9908D1E377EF7BE03B326594808BE58F7FB3939E939B73F11DAB3E572DBA41D43A046B8D2BB521728222D5A77DC886AC6F328D9A531118156D791D64F5DF8FF8BE8DCA32EABC3CB259B0F72B021CEB4DB36A6CD2FD149437B251F81F7588AE921456BEF1A79FE83447D80CADDBF20895667CA0E493A4731EEC901E03F66DE284400A5558922AD53D4E0FF7BC6C61640ADE0274C63D94E96BF6C642B790823109F53C3C27130A1EE38D448239187F5009373BE328AF866A9B8DD1BB735E8002296043C6FF641A432709148C707B900ECF46555D77644565D5998C096756F79B6F0E20850B8BF0528E78BF5FB4859BD655227873D289CCE47FEDA8414D09ED7E8D380FC4D580C7F44B01521E829E7B0CB2D2F345C517B65E2D476687EC9A4C160A3AC0B01CBAA588644D799B125910812790F06C1ECB1F1E64D5CCF92AE5E8147C98B0CFAD5626BAB5115844198E8C2AC1DF9A208FCD2D2891F4A29009F5B36D8E31383811A9493CF8E143B5AC8A14D48119CC16D2C6BF6826FC47D4B782FFC76B64401B8249777E32C1298606553DACF386A22809B599924A635796A1AEC3CD8568064852E54C95AD887D7AFE837F6FF676F69EE6288879F6D96193AD94A0418BBBA2EED5355876F2C3497448A5F8F3F83B136703D9A38FBB62784CC233DF448A5E88EB5F81A0BE97A16FD4CABA1D87A4BFB08E002EBA548F662D496A1478BB7C26C69CA4C100AA6872A4945D703CA812BDBA53AC86010AA1D2C53F29E46AD095936FF50DB8805DF4B08C9580AEECE3A6DDD828E7B5D4DABCAF112A6E35AB3C28A6DDC4D98AD1063C2ED72CAA50086E6B72090CC1F2AFEBEC6751F27EF51DD8557E53D928535D82A220F62BA0645E3C2618F3424EA1A339A138C9B8E26B14BC32D1736A4193C0C72CC402C3EAB58817335C1424BD6F38CFE16338611118B4100E4038D07DCA041C72E485C5290F0DDE601565DAE9CDF657A4C7839D3ADE72986AF396E767430125786E219BC5736F16FEF66B4014E5961CFB4CFEC4CB2A32205A92DBF1399E2710395BA1240D48277C120526CD9E2352F7D04D89CC2754379CE80A2CD1AC765718B8BA61EBB8BC6D0D407022E7AC672065FC8503BF5BC4138520CAE233EA997463D7C9E00BBD852F12EC17C6F1DB1914446AA21E156D210094B699B4117B31EAE6386DC0DE1F55CCEC09AA1EB38CDE4602598D452732C5EF8B07C477E3E2DD470737EAA7357E2E8B74C31A117B519BDCEF79B6B044148A10468E38B5A6B7B10D74C6130A60A268ED73DC9A25ED68AF354758FA3F57ED3558DA654CACA7150A8E4449D0EF640184A7A33D00BA765B01C442E88D9B4257B93904ACE04375679BFD8271A03073E34C4A1C0437C4009A9590CB98D0B5581DC83407F04A22C9B0246DE38E1A13F9B1191493818783950548BE562F940240CDECD4A50C94E406B1BAE04B50A3A19E7923183E3FD356238C45AE6559193E0E846DF0FC6878BE6C963AA8C3508DC31F766A4B29C78D749C89985AB8F580DBDF7993A2261CC4BBE489C3BBB38C46739BD2516D3C64A93F10CF559DB6A0EA3BAFEE8B43F696A5288C66509A57C642BBEAFB40F4CD0649B4CE25B6FB2EF5529B73556051213BB39CC4F1DC8004B1588C8DE836699C66CED567998523AD3AC303D9E13617CE6C1D2FC4C35B22A24504C51F64155F24D91D0E8785B40912B3DCEDEDE71A6933B36BB514FDD1D3D843AAACF2C1E79A5216622C20036C9C999DAC3A5A2D43FAC3B23119927806F497B4048F561A2276FDA0302423147D35579DD4411416F0F59273429AC0464AC49B230E29DC124115D18A045663D228BFDAC9F57B0C5B4 -pk = 537162FECCFA8C01DA8CE49B7E89F9426849916AE83F6A9836ECBA7AB27C50B31444EE61649294841C7A8DE9F0881A00B30ED46B6CA7A6A1AC340DEA74820401D98546989662063D6799E91D9BBC755BD5F7B1EACFC342A7C017B65D760A5101 -sk = 537162FECCFA8C01DA8CE49B7E89F9426849916AE83F6A9836ECBA7AB27C50B31444EE61649294841C7A8DE9F0881A00B30ED46B6CA7A6A1AC340DEA74820401D98546989662063D6799E91D9BBC755BD5F7B1EACFC342A7C017B65D760A51010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0739F341ADD0CA3B7C845324E0DE50A4C8A4458DAA8CBEFDC942466636C643EBEAA2E3776D2A584D21F28162A66BE6204997E0CAD4410821395D1A1B226657FCF57F1FFFFFFFFFFFFFFCF90FDD7A5299FB0E5E9C8C5A63E527F5B3094D128D2F3F95816146257AB18CBA44D85F1ED74EC4A1EB57D2F57806FFDDDBE686524A7474141484582F6C2FD8FCA2918000000000000004999FD51A0A01E5A821389DAD1BCAB8B5FA69A029B72296ADB5A1208CBCEDB222167FFAE8D6BF4A57B58A90000000000000000000000000000000000000000000000000000000000000014DED39797ED6F1B37CB3E0FD7D01DE73A1C68F8C23C3454C9C1F1D948AE8254376DCB54EC869883742E1401000000000000000000000000000000000000000000000000000000000000EAE66BBF4DBC69257328F8F03B2A891CE07D2A1ADE5E9C7B851D30DB2F1C744AFF305866F35BF29030561FE7EB151E002E412DAE4D56B7ABFA61CCD6D8BCD17C3D297A67AF44413953CC2B47FB5339E4596734A304637AED78EA5E2B1DDB6F0347DED7458BC607CB98A2E03365A2CA7B59749F1A6F98C85C45F4DFA530B7EB6BED81E950E8AF4946A046B6DE1EF98503BAD6A353383F8CC6DCF7D525167717CA4982A6F90FA49826BAA2DBC8653CF203CCCEB443BE444E07609AED3D1183B7019AF078E84C8B67125147481B41CD6284C1BE055EDA6C569DDA154071D61AACA28C1566756CEBEAC523BD890C89001A01038DD8107351E491A49276F3C153225B1200550CE4F691CE32C62858681C199E02353D985B3D1FADBAE0D24249A649008FF1DC4108DC2A33AA9EDA9F1261E7970BEB6FAEAE657362AAF590D51DF4FA52A394818BF6923A6BF78CA9DED108D60212096EA887888504BE60CEF25187EA583261A15BFEEBD56E36366ABB53A7186C306470FC820C136EDAC54B0CD114CA00BB783CE80345294B9C8B493EAE4333C720FE49DC8AF2F380049C10F13FED08ACB579707809B613EA9C9F08057D99BB03276F1B09498A6AAB45AD3F0C2400C169D22F49567228217C224E27C6592CD799F3862F308A14313E1816EE3E32B57700D223DC71CA410BC783FED0D61F8604DF83E9CD7F7562E8CF3D1B74E1C8CEC475D2AD5AF0F1FF393C8F08D36EAF3ACA00CC77D1B1D4074499F38DEB92C0558331910E15ECE2828437D40D70E0B8855604AEB723D5A6C63B30F59AED0EFF5DEC029CF21F37F9CE4F6BEA8E01A7D73553DEB3AE2AF1D0A9A75617A1E7FBD692616AEACAB6C294A889DFADD588FCFBF2660195541D7AA6C715725D97D2E67957B8D9227FD2F22D9E04DA8857F290FE917A2EF5C3AB1CDAF37CBAFAEE94F2CA2F5B00 -smlen = 2342 -sm = 1B8B1190D71DC9923B59E7CC01D40D215E7737E5FD10EEB40000F7E8A62576B37757EA0A5EEF00FBBD027020A98C5889D9530F010DF2A25293F24946379C6E6A006A2032EA2C1FAFB39E35BD4F01DD9B0B0D45821D56D3917B870123F05B48ACCA69157D486E1C01224DA233CD6FD802B4108E2001F0EAA8E40594FD1E881CF917019263614AC537602ACD6E2A74010E23AE7F11836CB46CA045F601086DBA4DE317C033F26234620153BB5C17E2BFDD4BE60872C90065518FB03436719711DB6FB801B71CE17E34002C8C32E77706000111A6F89F944A3A38D067C27BF1AE732FFF05082CBA119697E619030CFA2E04B4D1B088A73C70BC0040D6ADCAB050DDF9B568C43D830C7F704CEF1C510BC2CAE9B70FD248C656226BD5686D366528F0D0BEFC0A8761EC640CD2DA7979DE5EEBDF6127F29ABB8607F8A3D3BE05BE25AACE7FEF3063DF28E22A522FFF0B6FF6A0C61F79B02A408E8E1C775AB80BE6841E9F8A9D030AE5518E3EA8A4E31E416E087D47919593598FD58122A9E601A57EF02DE183D56921811AE2253628125C24F93C84361C5EC99E7B16962BD96CA190C68F3AA9DD60CE3AA7610589813B4FB77A4688308D9BC72CBE918583E298E03AB95FC500209C14ABEB3A43BAA92DCB11CB523C4D17EB9C6697B56C8B61EDA05BF5789166F839291CFE2997B7DD462EDA69B0615F2AD82AAC0A32F4B30FE8725849C144A9C07799D6CE9D293C25D8302161757B8C8C8D07032D914EA7DAC275919A1DFA0D3348EC07FDC70266975722763EF85EC4AF9E14288C9659907526566BB3F2DD5DAFC0D422568CA3AE52486D3F2C18B667E5622BA7E52C56BF00F82AF2108CB4949A09179544F30758B7FB98C49EA160720991B14E2858D648F0585AD1BB1D08294F029BFE936154E9D328DF2E054004FC5C29070DF9EE50DCD0981D2BFB3AA7D6F637C4CE457C0C66D27E2670107A2B85D1F026BD970EF3FB7E32C60218D5E43A06D9CD26289A937B4FBAD2A831425728F3D0D30C6C602AF4B14411E9B3C7CF0B4D630614A9E03AC30BA2B024D496DA984D08854F1366012C2400A5C8268C2B126DEA5AEBA0DE7C92BE0AF08CA22E02604A753702BDCD642BBFA0CC91BD8375657A957306A76B6F139621481B6F15CB57BEE128954D30F552661F906D8AB42CF260F30F88993BB40C9679385F5C4639888973361216DF3C60C57D9B250F64B7634C94DDA3FD122713FD2405A7B71F476C263A781DCE271E7D0665E45DCB27F7293DE57312396C58C40E268F57ED856F536C8FEB4B0060488DE3C25949D2B7E64207576641B34920D04B46766AA2978D9352C2769D49F8599F3D0439C928532E0EE428A3773FA4D68E6052335C6D93368E321D750D296799FAF87B82C640A6E995D18DDA002887F141DB8ECE2584DA2FDDF848D38357D585CD619B1625A70A5D333561D6DE856ED9908D1E377EF7BE03B326594808BE58F7FB3939E939B73F11DAB3E572DBA41D43A046B8D2BB521728222D5A77DC886AC6F328D9A531118156D791D64F5DF8FF8BE8DCA32EABC3CB259B0F72B021CEB4DB36A6CD2FD149437B251F81F7588AE921456BEF1A79FE83447D80CADDBF20895667CA0E493A4731EEC901E03F66DE284400A5558922AD53D4E0FF7BC6C61640ADE0274C63D94E96BF6C642B790823109F53C3C27130A1EE38D448239187F5009373BE328AF866A9B8DD1BB735E8002296043C6FF641A432709148C707B900ECF46555D77644565D5998C096756F79B6F0E20850B8BF0528E78BF5FB4859BD655227873D289CCE47FEDA8414D09ED7E8D380FC4D580C7F44B01521E829E7B0CB2D2F345C517B65E2D476687EC9A4C160A3AC0B01CBAA588644D799B125910812790F06C1ECB1F1E64D5CCF92AE5E8147C98B0CFAD5626BAB5115844198E8C2AC1DF9A208FCD2D2891F4A29009F5B36D8E31383811A9493CF8E143B5AC8A14D48119CC16D2C6BF6826FC47D4B782FFC76B64401B8249777E32C1298606553DACF386A22809B599924A635796A1AEC3CD8568064852E54C95AD887D7AFE837F6FF676F69EE6288879F6D96193AD94A0418BBBA2EED5355876F2C3497448A5F8F3F83B136703D9A38FBB62784CC233DF448A5E88EB5F81A0BE97A16FD4CABA1D87A4BFB08E002EBA548F662D496A1478BB7C26C69CA4C100AA6872A4945D703CA812BDBA53AC86010AA1D2C53F29E46AD095936FF50DB8805DF4B08C9580AEECE3A6DDD828E7B5D4DABCAF112A6E35AB3C28A6DDC4D98AD1063C2ED72CAA50086E6B72090CC1F2AFEBEC6751F27EF51DD8557E53D928535D82A220F62BA0645E3C2618F3424EA1A339A138C9B8E26B14BC32D1736A4193C0C72CC402C3EAB58817335C1424BD6F38CFE16338611118B4100E4038D07DCA041C72E485C5290F0DDE601565DAE9CDF657A4C7839D3ADE72986AF396E767430125786E219BC5736F16FEF66B4014E5961CFB4CFEC4CB2A32205A92DBF1399E2710395BA1240D48277C120526CD9E2352F7D04D89CC2754379CE80A2CD1AC765718B8BA61EBB8BC6D0D407022E7AC672065FC8503BF5BC4138520CAE233EA997463D7C9E00BBD852F12EC17C6F1DB1914446AA21E156D210094B699B4117B31EAE6386DC0DE1F55CCEC09AA1EB38CDE4602598D452732C5EF8B07C477E3E2DD470737EAA7357E2E8B74C31A117B519BDCEF79B6B044148A10468E38B5A6B7B10D74C6130A60A268ED73DC9A25ED68AF354758FA3F57ED3558DA654CACA7150A8E4449D0EF640184A7A33D00BA765B01C442E88D9B4257B93904ACE04375679BFD8271A03073E34C4A1C0437C4009A9590CB98D0B5581DC83407F04A22C9B0246DE38E1A13F9B1191493818783950548BE562F940240CDECD4A50C94E406B1BAE04B50A3A19E7923183E3FD356238C45AE6559193E0E846DF0FC6878BE6C963AA8C3508DC31F766A4B29C78D749C89985AB8F580DBDF7993A2261CC4BBE489C3BBB38C46739BD2516D3C64A93F10CF559DB6A0EA3BAFEE8B43F696A5288C66509A57C642BBEAFB40F4CD0649B4CE25B6FB2EF5529B73556051213BB39CC4F1DC8004B1588C8DE836699C66CED567998523AD3AC303D9E13617CE6C1D2FC4C35B22A24504C51F64155F24D91D0E8785B40912B3DCEDEDE71A6933B36BB514FDD1D3D843AAACF2C1E79A5216622C20036C9C999DAC3A5A2D43FAC3B23119927806F497B4048F561A2276FDA0302423147D35579DD4411416F0F59273429AC0464AC49B230E29DC124115D18A045663D228BFDAC9F57B0C5B4 - -count = 63 -seed = EAA4FB8EF0290A499A1D92EE398A8D7E71CD3CBF01A36750DA4B7EFF175DA26D17AC4ECE49A84C88D1D2C2493563C26D -mlen = 2112 -msg = 2E086FA0C4582E0C6CCB020F86A6107475985160BED201760D6489CB05B8D21452C81BD5D317F8857703DABA24E968F3164C82A4A9751DD88742B72141734DC0B4A77CBE2AE1C287A396A2F5804519456CF1EAE273A5C6361F52C35EDCE5ED7388D61D01AC040676522C9FD7B02A7DEAFDCB4169867EFB69792210A7069287C5DC958D0953C36F84D9A26989DD3B726BE8B94B41DCBA1B5374123F55A6DBD6360698551C27D16BAAFBB0ECBE116B44F11425DA45D7FE8ABA91697D83B6896A06A7888C97A91406B81B3A5BC8B68A984750893114B4011B9C8BEBA6F5C2D7D9F2C7A27030555633A0F90E30753A04B1958141AF7C1B95BA208DA36F729673D20DA0A83F913BEC8049F8CD032D9F9DD94B2086C61643AB2CFFDDB2B9BE0AF996D642B7A0A31CE0EEC8C61B343ABA980FCDACE9CED7BE4C9048B356D41002EEE0433428846BA4220EFB7F493FF57B0C706282EEE448CF7DA9B17B32D0EB0016983175469AA5BBA53489EC56BA3A92A70FDA2390E3A5D8C038F496E7C3180C6971A39491EAC10D828D44B3DE2BE64569B907005783E62710B9AD8EB8C9AF4B04993D40D1EBF165EFDEC748FE9F6B334DA6A30C568BCBAD095998A47242CA16803FE1720FCAB85233AD76EBDE102A5D93AB98460494BC886BB04C05AE89E157967747F8C050B33CCA52ED5E59050965523EC5C4EAF94CF2F2EE80C35AEEDD14E65D937C92855D03FC76ABAAD57A21A42420819EBB9AEB65F031F9C4BA0AC2EA27289E941DB89669A0620797091AEA3EBFC2AC354E94D27894F444FF9E604C8BDF7D6C00DF0E7FE9827171010445E737D0A5867636E3488EAACCCFCBAC1030C0DFAB639AB45C5AC5435E2C5B8244E58C3A6BAC81EEA408020BFEC66EF55FDDC618083ED737F4DD3BB65474487CADDF3AA2720A6931FC69533B6491DFC7E6E5FABF8103D05F870BFEFDDEFA20822A68A710B517065BD2478CE080E5DEA09EFFBA3A136C1BC9D7D8088F736C363B30E2AF2A6F2395EA8161CB64079340FA642C7763E3BF0623C968A16263CDFDF1B8334E427955E20C1EBCE8C8CB136DA8D002D8A9E5DA3B1F56668C1C59E20DC3BE026A43F40910D3A2B601D9D3EA2BF6D2C2781F976BA840FC986C8AF0DF84B8B0FB291D1310039D6914F8F7CC6B26CC33AF94150253E8EB410344A64344A5A0C06E0F3AA23C68617C6F4659DF79285782C89BEA3091083A069EF8F048371CFA054DE45E32C19A44DB5D435BC8FEF5570B68D80D5BF5DC06DA13C36E3AEA341CA9FE20047AC30683AA9D862306534EC93E79EFF79FE22E3BA15E2BA3F59F7B8B9314DCE31095D3015710C2927B54BA6F46D3981975229EED16C9B17813801C7D3CB3604DE9B7A4F18C2F91B2B50C1F43E87198AFBAC718935DB9CB96D9FE048D969635CB9F4DCA659AB1612A698CE45336B8D9FF5468301BF05D04B3558D66E88DE88427FE87E65D36D3C29FA3FB126F1F294E9BB391EE427001C34126C6622905514CE153682754D7FB1C985AE4DA600AADA1593A0A214332B310620B1B4E95BCBFD6EB8A241CBE848BAB37462224994E0D2F3F4B521DCA4A9A5AB10BEE741C5919907AFD2552D4AA300ADDF67CEC2862420C8D1D8DFFF60FDBE2D4A8D03C92E23BDB3400F5390EE4B141C5843B1E2C07C9AFDBC70E3FC08E2840EBF3B0E5296E1EE44D12E68240FDF063C07BEBF01C08586E8153068C1ADC744A7B54F53B0FEC3C752DA9F6F989A1AFEA4ADF1AD6AE926CABE4E0CB2CD864412DAEE377DE559A38047F31E834A6CE56D4041BA709945F07E514F96D783F32B0EFCC8B889FAF2B6D217246BA7C07B687E028F23D2409BBC12D6EC0D94AD9697BAB6395B7070B6FEB2E907A119209C9B7D86AF953BA7D2EA63982BCD794A5BAC69407BB7CEC5E027833B17420F146AE08F4B753BEF6CA0922F3294CD2A670127F9D2A2CA78A30F62056A425CBB7074C9A55135BD06CE677ABDF33B420F66CFDBE9461BFDF385A97439B3431CD29DECD9B5E59EC3ADAAE879A4E8D5E28CA13E73FCDBA51C828DE271207A5DEAB373B1B6677A29ACB87CBB01F10CD2C090EE66D472E8DB61615A5ECB84A7FF0988DD0DF9831BF43D732A12EC8CD50A86ADD12A5A2EA765744B05F73725AB8704ECCB08BD74517F21054E58903481E7A724F7FF24C43D6CD23DE84CD69C9E464E67003903C3858A6724247EB929716E170E2D2739AAE10B88BC3FB8FFA849E385B4113E78C24DE1673FC7E7285E6E3744F3843AC7BE7EC16BF74215694CE467A2E859DD4FACAB86250FECE28E0A6A31DD529D08566A6389B85C310C28A8DABBCCA9CD6A631EF0473ABFD6846D8326561CC9CB8181C1593D0F15EFB8129AF9E838AF518477CE361640169D9731FC139881D452773F21A3E79E514DDAA513D7B9F3399C0C57D21EAA00D44A7F031B79CAC9FC304E936E75A0CF8D204A6CC3C0FA7D037DD8ACC3A33CF5718061FCD57EBD06A607FE0BB0204E687B2A17B1FF47DA357B51A753076CB89422098D4F880F831842957E648C54ADBFCC0E488A95581E709B5A5A129DA7EC5B00AC9B18B80533F2DD1BD0F475A61DB18FC0C4EA655F602B207B572234230C831B26CECB7BC3284797C4BED5A977C3BFBEAFEA3DBFC4257D4C2C5BB8689830EE157F3B5AA1EAC09CFCE0555880A074AEB86062A8ACE19ACDC1A25F8D0E454F50F119D12E707D103F3C1A502D4E358D563E53554395B5D386AD49363978AFBCA2F8B673A693ACEF70D1DB4CEAA8FA580160924D4F18119BE46C71E09FDEE45EFB14A74DB1C688E99E24CB6025E73A3E7F0F7EA9C485274D2B6CF9784CBE39E388F9CCF1E2E8DBFA6DB43355391A369DEF645F815424253ABD0B6DE9C0A0AF156D9A4EB7474A2E5937F008134DEBC9FC7E54812967FCF5BCE28FB5CD43F1AA240BA2E9CEDD6F350D556DB1658868091E6034D7E1EE5C6645D0A345D46C42E23C6821C360F5ACD13F589 -pk = 0104CD03949929068FF61AFE00ECBB6CF3D72A57047F71740F5AE3DB8126C7E3DB25BC88CD4762FD79647C08FD92240137CFC133C05CD7258964E8397F16302615FD76DA1FE7F6105E044BD76EDE8F611F3A506C1AFD7ED504AABF99C969C701 -sk = 0104CD03949929068FF61AFE00ECBB6CF3D72A57047F71740F5AE3DB8126C7E3DB25BC88CD4762FD79647C08FD92240137CFC133C05CD7258964E8397F16302615FD76DA1FE7F6105E044BD76EDE8F611F3A506C1AFD7ED504AABF99C969C70102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006CBBFB9DC0A54001BA194CF5C98B813FAC3717AFD32D1FDEB51883A519DB3CFAB5CCA939B1C51EEAB887854CF2F203DAA244F530BBA734DBC5A216EE6DD6E1B37A611C00000000000000759E35E9341B7096A967DE395A74ACC9F4284E6E35DFFFAC46E5C6838BD920B69C077E5BBAD878FF915DB1DE181CDB37B94F87155C43B61D1D09F8B40229C5B3B18EEEFFFFFFFFFFFFFFCB83D0A1D4DE5DCBD1EBBE6E36021AD4B8F8AE2BE8E756975870A9694F8267B722CA0B2514CA41471F6F48000000000000000000000000000000000000000000000000000000000000007CC10EC029F4947490B4743C08B02EE9F3BD7ECF5D381D328AC62AF625C1BD60A472B3BB1BDC8113E0F97D0100000000000000000000000000000000000000000000000000000000000083A2C094596FC42C06D794A3D26323BA80F36236FBB683182D52188B7B19A1B186DC437B104643034F454D1353ED40017E9B2F689A619A387CFAE81BB8D22812B2B012A4E993D7B5C9F34E5910BC6D8A3E53802A11C791B2A181DB14A90AFE01EA72FCA9C5C48EE584A63BF776986BF69FD45415EB1E4605EC57BBB29C0A5D0E6DF269E5899CC390A7724A1BEE7A72015FB7C05D9B5D4C4963211374C8F1D3CA42C4D33CA3F77CEB0490EAD24C3EA54BA2F5992B07413CD9621D7D7CF7730B03CFB5B4998A2FF9DD9BEC6D8E7697F6E2054BC4FAED46A0717AB00FD5C0309E1C1405FDEEEBE61DA7452FCDD9EB000D00784BF495756FC977CCDDFCB65CB80231D083DCDF0A5AEFF489F55C2AFD175B4FD719A551381061CD523C26CCF114E6002CED9AADF5357F82227CD1CCD50A405FFF11FD381F2CDED5E12B0E343822DFC0938434DC9163B48BE17D20AA13798801B59015FF077E3C8E4E598E3B21D871D79A89CF228E5DD57F63BD368BE6DBA52BA1BAAB83C4CCCE9F4B9DCAA8BFED1A004090A5B5903CD9B5C011F507F91D5CE4EE87C6BEF5AFAA77D24D29151E27FA0E662F74BD2729CA64726F5D3A0C0FFE02B9E35AEC17396788BBEBDAC73A3084DED19F131C92A6B9F893BF584D46D1C4BCB974E8AD479FC4521DF764DA3512850382FC41C28F7930CEEB6C429F8BA0D5C7825D6B89BDB8CDF74931CF9137BEEB65224818D102776B1EEBEDF072E2BABF03988E695E966B95BE8F287E22B9C4ECFD4D1DA8FDBC875B48A9355A178BBD6618C76C772124254E626B845510C919920198E1B1EA9CC1D3BEF5BEFB4A6E85068C264B2B875E66D5525515E4A66AD86587B6279FFEC7F494DF7F27EE678F01F500CE06DDC1F70337FEBE9C86399F36C972FEA80EFDD45DFD91639909AE32F04729F200224049EA377EE0B638E0E10A5303 -smlen = 2375 -sm = E6A0FC7525C07FC2D3A0D8590168692337C221019489DED31E00837A6466CE18058ADA22CA68002BEAC8E28FE084BD8D54C28500D0BB47FF4C7AC6B7026A2C9A01E5855CD8E6E6CC03AE5EF11901FD02A36552684C1DCD84F38100B8A5F73F0DD6AA78ED9A8DB601DDC5019842F2C182F0460558013622AF0B7982A95E8A722D180062DC895C53DE27EA90150FA2005CBFA098BAA9074891BDEC240093553011956C6E5AB88A86110058B99B613BB6AE19A038710B01B17F001CA6850CF17375EA0200B47AE6BB929970A9428213970100C58746AF50FF8F9D50815A28C192D452CE8BFBE520D50BFDF20100D42277FFC4BFF93576AA5110016F1BB3C6468F3A244F24017A45052E086FA0C4582E0C6CCB020F86A6107475985160BED201760D6489CB05B8D21452C81BD5D317F8857703DABA24E968F3164C82A4A9751DD88742B72141734DC0B4A77CBE2AE1C287A396A2F5804519456CF1EAE273A5C6361F52C35EDCE5ED7388D61D01AC040676522C9FD7B02A7DEAFDCB4169867EFB69792210A7069287C5DC958D0953C36F84D9A26989DD3B726BE8B94B41DCBA1B5374123F55A6DBD6360698551C27D16BAAFBB0ECBE116B44F11425DA45D7FE8ABA91697D83B6896A06A7888C97A91406B81B3A5BC8B68A984750893114B4011B9C8BEBA6F5C2D7D9F2C7A27030555633A0F90E30753A04B1958141AF7C1B95BA208DA36F729673D20DA0A83F913BEC8049F8CD032D9F9DD94B2086C61643AB2CFFDDB2B9BE0AF996D642B7A0A31CE0EEC8C61B343ABA980FCDACE9CED7BE4C9048B356D41002EEE0433428846BA4220EFB7F493FF57B0C706282EEE448CF7DA9B17B32D0EB0016983175469AA5BBA53489EC56BA3A92A70FDA2390E3A5D8C038F496E7C3180C6971A39491EAC10D828D44B3DE2BE64569B907005783E62710B9AD8EB8C9AF4B04993D40D1EBF165EFDEC748FE9F6B334DA6A30C568BCBAD095998A47242CA16803FE1720FCAB85233AD76EBDE102A5D93AB98460494BC886BB04C05AE89E157967747F8C050B33CCA52ED5E59050965523EC5C4EAF94CF2F2EE80C35AEEDD14E65D937C92855D03FC76ABAAD57A21A42420819EBB9AEB65F031F9C4BA0AC2EA27289E941DB89669A0620797091AEA3EBFC2AC354E94D27894F444FF9E604C8BDF7D6C00DF0E7FE9827171010445E737D0A5867636E3488EAACCCFCBAC1030C0DFAB639AB45C5AC5435E2C5B8244E58C3A6BAC81EEA408020BFEC66EF55FDDC618083ED737F4DD3BB65474487CADDF3AA2720A6931FC69533B6491DFC7E6E5FABF8103D05F870BFEFDDEFA20822A68A710B517065BD2478CE080E5DEA09EFFBA3A136C1BC9D7D8088F736C363B30E2AF2A6F2395EA8161CB64079340FA642C7763E3BF0623C968A16263CDFDF1B8334E427955E20C1EBCE8C8CB136DA8D002D8A9E5DA3B1F56668C1C59E20DC3BE026A43F40910D3A2B601D9D3EA2BF6D2C2781F976BA840FC986C8AF0DF84B8B0FB291D1310039D6914F8F7CC6B26CC33AF94150253E8EB410344A64344A5A0C06E0F3AA23C68617C6F4659DF79285782C89BEA3091083A069EF8F048371CFA054DE45E32C19A44DB5D435BC8FEF5570B68D80D5BF5DC06DA13C36E3AEA341CA9FE20047AC30683AA9D862306534EC93E79EFF79FE22E3BA15E2BA3F59F7B8B9314DCE31095D3015710C2927B54BA6F46D3981975229EED16C9B17813801C7D3CB3604DE9B7A4F18C2F91B2B50C1F43E87198AFBAC718935DB9CB96D9FE048D969635CB9F4DCA659AB1612A698CE45336B8D9FF5468301BF05D04B3558D66E88DE88427FE87E65D36D3C29FA3FB126F1F294E9BB391EE427001C34126C6622905514CE153682754D7FB1C985AE4DA600AADA1593A0A214332B310620B1B4E95BCBFD6EB8A241CBE848BAB37462224994E0D2F3F4B521DCA4A9A5AB10BEE741C5919907AFD2552D4AA300ADDF67CEC2862420C8D1D8DFFF60FDBE2D4A8D03C92E23BDB3400F5390EE4B141C5843B1E2C07C9AFDBC70E3FC08E2840EBF3B0E5296E1EE44D12E68240FDF063C07BEBF01C08586E8153068C1ADC744A7B54F53B0FEC3C752DA9F6F989A1AFEA4ADF1AD6AE926CABE4E0CB2CD864412DAEE377DE559A38047F31E834A6CE56D4041BA709945F07E514F96D783F32B0EFCC8B889FAF2B6D217246BA7C07B687E028F23D2409BBC12D6EC0D94AD9697BAB6395B7070B6FEB2E907A119209C9B7D86AF953BA7D2EA63982BCD794A5BAC69407BB7CEC5E027833B17420F146AE08F4B753BEF6CA0922F3294CD2A670127F9D2A2CA78A30F62056A425CBB7074C9A55135BD06CE677ABDF33B420F66CFDBE9461BFDF385A97439B3431CD29DECD9B5E59EC3ADAAE879A4E8D5E28CA13E73FCDBA51C828DE271207A5DEAB373B1B6677A29ACB87CBB01F10CD2C090EE66D472E8DB61615A5ECB84A7FF0988DD0DF9831BF43D732A12EC8CD50A86ADD12A5A2EA765744B05F73725AB8704ECCB08BD74517F21054E58903481E7A724F7FF24C43D6CD23DE84CD69C9E464E67003903C3858A6724247EB929716E170E2D2739AAE10B88BC3FB8FFA849E385B4113E78C24DE1673FC7E7285E6E3744F3843AC7BE7EC16BF74215694CE467A2E859DD4FACAB86250FECE28E0A6A31DD529D08566A6389B85C310C28A8DABBCCA9CD6A631EF0473ABFD6846D8326561CC9CB8181C1593D0F15EFB8129AF9E838AF518477CE361640169D9731FC139881D452773F21A3E79E514DDAA513D7B9F3399C0C57D21EAA00D44A7F031B79CAC9FC304E936E75A0CF8D204A6CC3C0FA7D037DD8ACC3A33CF5718061FCD57EBD06A607FE0BB0204E687B2A17B1FF47DA357B51A753076CB89422098D4F880F831842957E648C54ADBFCC0E488A95581E709B5A5A129DA7EC5B00AC9B18B80533F2DD1BD0F475A61DB18FC0C4EA655F602B207B572234230C831B26CECB7BC3284797C4BED5A977C3BFBEAFEA3DBFC4257D4C2C5BB8689830EE157F3B5AA1EAC09CFCE0555880A074AEB86062A8ACE19ACDC1A25F8D0E454F50F119D12E707D103F3C1A502D4E358D563E53554395B5D386AD49363978AFBCA2F8B673A693ACEF70D1DB4CEAA8FA580160924D4F18119BE46C71E09FDEE45EFB14A74DB1C688E99E24CB6025E73A3E7F0F7EA9C485274D2B6CF9784CBE39E388F9CCF1E2E8DBFA6DB43355391A369DEF645F815424253ABD0B6DE9C0A0AF156D9A4EB7474A2E5937F008134DEBC9FC7E54812967FCF5BCE28FB5CD43F1AA240BA2E9CEDD6F350D556DB1658868091E6034D7E1EE5C6645D0A345D46C42E23C6821C360F5ACD13F589 - -count = 64 -seed = 5909111F333F3E939105DFF8532548927EBF289F31A72F4C1B0C66816D8B68F64622F36A9BC85E63601BEE8EE7CB3DC5 -mlen = 2145 -msg = 5180B7DE9A84F651DA10D334009B3D65582F3912D329FBAD4AE39A9EEC78943338C29DB4F49EF41E3C50DABBB530E99113440383F20D5A3A8AE279A6201A0C84B003F6717C709C21AE893B6E412D87F8E0CEE5A89E60A14CE975A4D42E4F43F4710FC9FA29E9B2AFA93441EF5570123AA88AFF009E2507A3E60A79CDA25652E3AC3AC0C10A816BC04739B6FC758FF9AC467879BB67F270E4EAB43F10A633E5932B8D6DCF23814DE8643407B17B5E2A91B340F7BF6882DB694DE4DEE4C480CE037B9F9A220ACDCE84B03746F307A6026531D712C0630E7DE3ADD3A8516BA602D2463E3478008B3252B658FEA54DE41265B5C81E4E913EA0E2A63309497ABF961EC40AC374ADC0FF3C6FAE9BFAC5CC2DF475885B0BC636702828489183CDE1A2934F2D63828AD1F2B8CFAFFA53151B0FFAE6224DF54C2AC47CC8844B76222C2A3B6E132071150049B6E46AA75DEA28C13477980315FB64CE500BF0C6F633AE621D65B331BA96CFAC162DD7897B8505257E228CB621BBA9176A7AFB3A2CC20D7804DDB3AAE4B87FFAFD3C8DC541D05624DB02BD62491067EC1CDF73147014FEBCFA5B561756D5E7A13B88D1E7B2C0375E1D0DE71ED20CA9CC4E6DACDC579F1AB024AAE2A0BEC9004E5DD81C046F00A2A4CB767C4EB240D205278CB863D1A61DEF16635C6A84C2406288410FA4B73B21077D8F7A4075A1DDCA3D0D334725151E434BDA80D3E73593338B07958D27337E32CDE0010DFE5E58B99EB27A97DBD1C5E6F9A552A02726AAD5A4AA63EDC336D83E5870DBD514193367AF2274804628B4EEDFDA3B2A155694E89F5A6798C5D6E036159C1F00D8DFB03D41940E775974B11C3FE4456E07B127CCB44E6FD6B2918F57A6523D7F77F32478D9F1BB539846793D4284E2907830E5EA76054802A266C85B122A389EAF4700629036716E2869C0FC9440856D562711E903A1853BC68582A95344B612E5CBC7C5B2AEE23CCE4161A75829B2048742FBD65ABFE2397CC7D66023DE34DF4F2DF8540CCE9781ED6482D29CA4E906716C8CC9596B158EB51BAB8C2E00253D6589A99B3D20FB494834B42BBFFB80E7B0441E356B541F83877736985F6330EA459C007CE8BF18D84E78E36482D581DC7DF97528CE15F68E604B4DE62422B3AA76F3E7E5B33A49CBA9D89FCF50DEB65EE45173795393A50FD4C60CF6BECBA7E733513537D13F89FCF1C4D6437DE0EAE608FB11D68B9ADC0C3A19A3565F6D62BA81A326EC334B239B212B87320C03A75C58DC8F828C4195ED9D7ACDDCE493123E235D098E9DC60F5D3A625E1FF66F245E9977F9630A40D26E3AFB6676F5122A88CE5507BD825757D9CCD53FE574FD0E6E728DA355403AD664FFDEAAF636256FADC3283D6F15B297F79216833CF2C745C4C5E17D03260A69178F2216168BF8F00C9889E1E35540254F150C587A884CDFC9E5F7D379BE474356C06943E416EB0697A1AE989AB4872D0BDF436D9FFAAFEC1631C9939FCECB84DB2846F12CA395F506687B4A5638085BC6EF58FE8E2ABE9F8D51F272EE855E2DB84A89D348DD66950B8F43939DB897C519FA302594FD1FBD6B6E94CA8FF63A7949432DC2D35C60803A570B1DAC95EE0A60C62FD18B3319601AD29A156400D392DC9A14FF50AF6752C1F6EDC2ACB7ECCA71097B6E82227DE429F1A29C5E38ABEA1C74DE06E6788CB1790AE9F0E8AB35AFE60B001F45971D42949263AA62519B0D630281A4C5788D5591B1EF5A003C58987E8665701E5B1C6063F93533094E96820F918C354903775CEB6675C4CE9CF940C4BEB8845B4F5E1F642BF505821E5A23122E2D1ADB82A63AD18CD1E4775A96CA9EF9493D75FF784A2D4A99F54DC3F87828BDFF4B3A3D98FA5A29B62A85CAAFFBACE4592A81BFAA5B8BAE6606AD25A92A43140690A6003AA2D617FC707A53EC9D868E33596E098773942D798263F58FE5A1B23046CFA136EA35203B90BEA2C5F0AAEB5EA8C24B8B8CBA14CDEE28F45D0278F193228484BCC7E08A75D0064D605D674ACA9019A0A9AAECD6AC672CB8410FEE4192E6DCA7855FBB1C584CF288BACB40707D7E6F8BA2956F6D099F52BC7B0AD72B5A3FFC03C7B47086330244EA5D393C6B9F256FD82D5CB9436A469ACC3F8FC237146895BE148749F82D39B7BA4CE47715BB393A96AB471665529AB9E9958B12396C1BA7529DBF289184FF0F635C2BA9DF301036C869D52D993463222B70BA778E81C8DC668DE41C0356EEF5C39F1BD42398BFF30F959E115C6B386E73F0FE28A2665BD463C781DA1C46D6D4EA284B152C8C12426DC9CC467809BFDA6FBFBC0BB4793BABBF6AD564D57AE9F5E2B7F651D6ED980F8B1174A126CC58B23C32BA73F5031B3FCABFE7BC360AAE412D799CC14D8B252D9F9EC9005B7FCA04A88CC8AE9F7AEFCA94137003D5764FAA3C7C45670585C84F74C4EBD1F5AD1F97EA093595592FB90E3CAB01F98F06E114F13DE67CDC36F3FFB01C3D51EA643C25A3F6AA2C57690E42B98583D925AC7B06A349782A1D33C06BD05A82A7AA3DD679326D948D74A1861926B45DB78D36070D3087AA9C5F4F42CA57EE9CE7035BD88A85CE1107C8E07E5BA3A62ECF012BC75FBF97C4C72331B55AB9A6EFFD78869F1CD3F330526F262F7DFCFA2B084B61E90772D5FCE8F038C0F72554467192CC8A27F1F53C8714DA1864815974B00991F466648478C5F9BF036DC4083D72E8D144AB10FD32408DA7677729347FEBC79E48E7B87388D9B59AEFC84B5B3B589FD91863811A6436ED76B43E657F7EE03EB796285A4D93BE9AAAD1E1A1E81687E42EC83F3DD059B78BB7F8EC70E6C831DB5E90C6B3AA511F36507DBC8E7A77DF0F5B9EF03BFEFE9471DE7C7FBE67B9922260D3703D95A5BFCBCB62D830E20C23C6CFDDC210E47CB575957D8C3514A2ED4561C738928F210057896EAEB1499D4DDC70F44E30661E780AAF5C0A20C8553F40D7D3FF6D120511C1073510D04F2DE544121AB851E98F666906367C21302EEFB1AAA723F6A531C454EEA0BE7D50 -pk = 747661D9A263C158D9FD1D4965BB543EEE35E63511996F86F96553B0AD22A1A2A778C67248DCA4EF4F7650B61CCFE6017CBD08B0A435C1800FCF2010B23D2DE93CE71D936339CF1517FE7C441111AD58C21A3A8F513ED33C856ADCB657AA4E03 -sk = 747661D9A263C158D9FD1D4965BB543EEE35E63511996F86F96553B0AD22A1A2A778C67248DCA4EF4F7650B61CCFE6017CBD08B0A435C1800FCF2010B23D2DE93CE71D936339CF1517FE7C441111AD58C21A3A8F513ED33C856ADCB657AA4E030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ED6000947E1A1A8A911C90295667C905E5548401A5FC82766B8EF1E62E7BBC0B02ADF5EEC91E6F69121479ABEB502386606BB3B59BBC9E25A1755C7271735EFE0ADB0D000000000000005A096A4B930281C9FC5051BFA6639B4E873581D589B5530B23A869D150BDD54B205BCFD05B95DCE654E7E0D233740E7486F1E63970ABB68C0D07C620A7875C3CDF83D2FFFFFFFFFFFFFF36D50A1DD871B87AC1634DED9A36A359A0A9A5789934A40170B0510971A5F934D02D86AE408FB329FE3712FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8DE1631C9336EE9197DF4E1E03CEEA80411B2C0448D9B28F5BB59312ABFC2E6A70A305B96580247CA83A02000000000000000000000000000000000000000000000000000000000000009100ECAA343212FB94AB5F8DE98D8CE79270AE0F68BE9B41B9E9641A2297C8D3455C51A5C3AB310C4C31345124DFB302A73CF2589C93A1F0CD195C2B1890C617FF22B2E769089D5D436EF132533C6B9B663141F3C78E9DF09F50E15877142201AC69D1F9FEF2668697AE6477B5882BC973C30A970BDC2D5FEB548441EADD238B0360316C11219F303B1110C07E052803A8681F17C922E1E3663907A1E98EBC0057D0A79851F24EFA8FCB611BE004A1D85EF44451D40F631A60CA5DB11E52B802929BC21CC5CB557BEC13D24E28A9DCCD31D01719AA2E2B754472CAEFF97CA24FB3EB04F9C7FFED6D74326BC92233BF03DA29C6056FE24420D5AA10FFD5912F17AED51A21237ECBDF3DE51D28040DDCB751D92798FEE130C822F7334CDD35F5029A3A230C19398FA8D618FFDCBE68C62E2B4571D5D8492D6372E231513EE983FF0D1281000E8B76E658A2E593375D2301AB57A038C9844C2C9429160546DEF5541975E3889895844B9FE792F2E0565602E7F4201403438220D49DD8AEE2AF9502DFA0C9E577810B988FB535BC0B9AC1E8CDB3D180B675903787FF95A41C86103BFC3B4348C6AA10DCE3B72E4B84C3A702DE2801B065959E014DEE795BD64B5F67102335921DDCCB5553F4F72F2A59DAB8844EBB6201FDA6F417431C555DEEEA01C18390EAA0C5F577BEA107DF29A993190EE559BF6F034A4989ACB84DC9E3D6536547333AA7C11960A3B6B86C0A60E000DFD967D3C26FD538F56AE8F53BE25B12910C3C8D8AD8B18AEA5983177AC29D54223C822009108C7A6FB4F479FEC9A2023F4871206DEEFAB09DC43315873D1B38AF61E0954E6ADEF844B655C3550AFA6095B386C7E9ECF809878AAE203AA7F90103723663E496577000FF4375B32A98BFF178F97738D8ACB797F3C6F57CC9B1FD46D475DE249B23DA2DAD78A234110900 -smlen = 2408 -sm = EFEDB1172299D95735774CC001ED411AF0245846AA7756F7E5011C6AD0931887ACD212E9817F00139AB7D9B6DADF60DEDA265500EA244225A03A7E2784E84B3B008BC90B9F1DA77BAA8D726BAC00687E5649FEFA13ECF11E88DC01031CF0D3D0FEFBDE1D84EA3001D10C975283A98CCCB9023FA501B76EC9D6CC6E87FE4FC2A22C0021440D16CAF003924399FE6100EB770D4863D79B9685154D6B004EB2D776D5BA56D050F179AB00F61F24ED1E9410617432A45801D69398575F28A2F79A88D13B009CE5C004E32FDD0C69DCD9E60101F5AA1590E4D79E2B0529199009764DB2C589155EFD38070D6B1401F8851B891B8C4FDD49592DFA0019B448F8304622F86085773D01035180B7DE9A84F651DA10D334009B3D65582F3912D329FBAD4AE39A9EEC78943338C29DB4F49EF41E3C50DABBB530E99113440383F20D5A3A8AE279A6201A0C84B003F6717C709C21AE893B6E412D87F8E0CEE5A89E60A14CE975A4D42E4F43F4710FC9FA29E9B2AFA93441EF5570123AA88AFF009E2507A3E60A79CDA25652E3AC3AC0C10A816BC04739B6FC758FF9AC467879BB67F270E4EAB43F10A633E5932B8D6DCF23814DE8643407B17B5E2A91B340F7BF6882DB694DE4DEE4C480CE037B9F9A220ACDCE84B03746F307A6026531D712C0630E7DE3ADD3A8516BA602D2463E3478008B3252B658FEA54DE41265B5C81E4E913EA0E2A63309497ABF961EC40AC374ADC0FF3C6FAE9BFAC5CC2DF475885B0BC636702828489183CDE1A2934F2D63828AD1F2B8CFAFFA53151B0FFAE6224DF54C2AC47CC8844B76222C2A3B6E132071150049B6E46AA75DEA28C13477980315FB64CE500BF0C6F633AE621D65B331BA96CFAC162DD7897B8505257E228CB621BBA9176A7AFB3A2CC20D7804DDB3AAE4B87FFAFD3C8DC541D05624DB02BD62491067EC1CDF73147014FEBCFA5B561756D5E7A13B88D1E7B2C0375E1D0DE71ED20CA9CC4E6DACDC579F1AB024AAE2A0BEC9004E5DD81C046F00A2A4CB767C4EB240D205278CB863D1A61DEF16635C6A84C2406288410FA4B73B21077D8F7A4075A1DDCA3D0D334725151E434BDA80D3E73593338B07958D27337E32CDE0010DFE5E58B99EB27A97DBD1C5E6F9A552A02726AAD5A4AA63EDC336D83E5870DBD514193367AF2274804628B4EEDFDA3B2A155694E89F5A6798C5D6E036159C1F00D8DFB03D41940E775974B11C3FE4456E07B127CCB44E6FD6B2918F57A6523D7F77F32478D9F1BB539846793D4284E2907830E5EA76054802A266C85B122A389EAF4700629036716E2869C0FC9440856D562711E903A1853BC68582A95344B612E5CBC7C5B2AEE23CCE4161A75829B2048742FBD65ABFE2397CC7D66023DE34DF4F2DF8540CCE9781ED6482D29CA4E906716C8CC9596B158EB51BAB8C2E00253D6589A99B3D20FB494834B42BBFFB80E7B0441E356B541F83877736985F6330EA459C007CE8BF18D84E78E36482D581DC7DF97528CE15F68E604B4DE62422B3AA76F3E7E5B33A49CBA9D89FCF50DEB65EE45173795393A50FD4C60CF6BECBA7E733513537D13F89FCF1C4D6437DE0EAE608FB11D68B9ADC0C3A19A3565F6D62BA81A326EC334B239B212B87320C03A75C58DC8F828C4195ED9D7ACDDCE493123E235D098E9DC60F5D3A625E1FF66F245E9977F9630A40D26E3AFB6676F5122A88CE5507BD825757D9CCD53FE574FD0E6E728DA355403AD664FFDEAAF636256FADC3283D6F15B297F79216833CF2C745C4C5E17D03260A69178F2216168BF8F00C9889E1E35540254F150C587A884CDFC9E5F7D379BE474356C06943E416EB0697A1AE989AB4872D0BDF436D9FFAAFEC1631C9939FCECB84DB2846F12CA395F506687B4A5638085BC6EF58FE8E2ABE9F8D51F272EE855E2DB84A89D348DD66950B8F43939DB897C519FA302594FD1FBD6B6E94CA8FF63A7949432DC2D35C60803A570B1DAC95EE0A60C62FD18B3319601AD29A156400D392DC9A14FF50AF6752C1F6EDC2ACB7ECCA71097B6E82227DE429F1A29C5E38ABEA1C74DE06E6788CB1790AE9F0E8AB35AFE60B001F45971D42949263AA62519B0D630281A4C5788D5591B1EF5A003C58987E8665701E5B1C6063F93533094E96820F918C354903775CEB6675C4CE9CF940C4BEB8845B4F5E1F642BF505821E5A23122E2D1ADB82A63AD18CD1E4775A96CA9EF9493D75FF784A2D4A99F54DC3F87828BDFF4B3A3D98FA5A29B62A85CAAFFBACE4592A81BFAA5B8BAE6606AD25A92A43140690A6003AA2D617FC707A53EC9D868E33596E098773942D798263F58FE5A1B23046CFA136EA35203B90BEA2C5F0AAEB5EA8C24B8B8CBA14CDEE28F45D0278F193228484BCC7E08A75D0064D605D674ACA9019A0A9AAECD6AC672CB8410FEE4192E6DCA7855FBB1C584CF288BACB40707D7E6F8BA2956F6D099F52BC7B0AD72B5A3FFC03C7B47086330244EA5D393C6B9F256FD82D5CB9436A469ACC3F8FC237146895BE148749F82D39B7BA4CE47715BB393A96AB471665529AB9E9958B12396C1BA7529DBF289184FF0F635C2BA9DF301036C869D52D993463222B70BA778E81C8DC668DE41C0356EEF5C39F1BD42398BFF30F959E115C6B386E73F0FE28A2665BD463C781DA1C46D6D4EA284B152C8C12426DC9CC467809BFDA6FBFBC0BB4793BABBF6AD564D57AE9F5E2B7F651D6ED980F8B1174A126CC58B23C32BA73F5031B3FCABFE7BC360AAE412D799CC14D8B252D9F9EC9005B7FCA04A88CC8AE9F7AEFCA94137003D5764FAA3C7C45670585C84F74C4EBD1F5AD1F97EA093595592FB90E3CAB01F98F06E114F13DE67CDC36F3FFB01C3D51EA643C25A3F6AA2C57690E42B98583D925AC7B06A349782A1D33C06BD05A82A7AA3DD679326D948D74A1861926B45DB78D36070D3087AA9C5F4F42CA57EE9CE7035BD88A85CE1107C8E07E5BA3A62ECF012BC75FBF97C4C72331B55AB9A6EFFD78869F1CD3F330526F262F7DFCFA2B084B61E90772D5FCE8F038C0F72554467192CC8A27F1F53C8714DA1864815974B00991F466648478C5F9BF036DC4083D72E8D144AB10FD32408DA7677729347FEBC79E48E7B87388D9B59AEFC84B5B3B589FD91863811A6436ED76B43E657F7EE03EB796285A4D93BE9AAAD1E1A1E81687E42EC83F3DD059B78BB7F8EC70E6C831DB5E90C6B3AA511F36507DBC8E7A77DF0F5B9EF03BFEFE9471DE7C7FBE67B9922260D3703D95A5BFCBCB62D830E20C23C6CFDDC210E47CB575957D8C3514A2ED4561C738928F210057896EAEB1499D4DDC70F44E30661E780AAF5C0A20C8553F40D7D3FF6D120511C1073510D04F2DE544121AB851E98F666906367C21302EEFB1AAA723F6A531C454EEA0BE7D50 - -count = 65 -seed = 238461A224ABEECCF709AB6CACF4EDD372D45E5F4274095273A49AFE614F2BF713134ABF68B4DD058E6D7B612C3658C3 -mlen = 2178 -msg = 99B5B6FECDB52897A1958C5C3D1FC2F20B7D045F551856EA3CB441BAD9089C64CB9489DB6B63E0655AFC4C2FA73C7417FF1B80B9C7A1D659687D2C415B3A909CA30E96849D4BCEC6A9A6A4311204936BA972086B2394D86E840770D01550CAA6AD85ADC0EC851D2B3808E4A0E9830B99A70F6204ED4DBCB6759F6228126039607AD7ED8EAFEEA28D1C3E25A46BC18AF7E01F55FAD8244F15DE36F890416AA09548554338972C5F88FD9357792819E51A63D0B872B0A4D21EA3597405B52793D50C6CD70B52841D53484BCD3EAD004CEF0A6BC16CE74CB8AD0848000D8C5158DC16625112D1D85D17A3C1C8BBDAEA42C3A43E9930724655592116C4C6D0B8B223337EE4E754541A09D898F7FED71C3785B7F8721653986C525BC00F15590616437D11F9722824DFDE7E9615F1FB8488E5327E4D8BAF5F79D1FF5E808D154951AD87638910607B03FAAC3A61FE9916BA65FFD16986DEB4169BD24A72B1C8168FE569F3C81F93F3EBDD21D4E806F79FB28550912E9AFFFB52E97860C4DC0D042C56E1BB71C28B68E416874EC7043306A29BD1F4B9A3E612A6778315E2C2B850D6EAB9FF1905030FADA250CAF308735393C191134F3C493D00B5695775D82ADB9F2ABDAD17FC41FBD7A1DEFE337C2F8ADF69154CC0862FBD43035295B1A9C80B88FA8CF75B36CA08868F881966B41FB3E239EB1DB9CB51606A0A9EBCD552B2F4E819E2C30ABDECCDDE88D2D2F82F3585B5143943C929591D20CEF559CD2BAF2DC7FE03C9E4E084E8890FCE64A4AA9F13D5EB945AD7E3CC53E01FCDC192B97ADC1F98D9E773A0177E8D97405808EBF48BF17B689BFC15F4C515E38A855A9266230C9085ADC9A6DDAED93D80C3F38BC516695D202B4E89DA5B4EBC43788C848F8C4A72F79F37F857EDC105F13E4ECECFD09302711BC1993F5308B8F32AB96FB8EC3F5EA0531DAFD0AB3451F81F47E62C593C8D3E3BEEE79DB06909576BF876145856F5F716CAA436C98EAB28C5B85BC2E4D7E1653ECBB8BB6B5BD6981DC72D7F63BA06CAC8197ECCDC72C1481DB44724A3C21F7FC60661F11FDDE8122DA5D0B1D72A29952618B373423A892875E6AD24D0916109ED8E9A9A8D9A68ACEC4BB5EEB0D00EAEA72D8D5A76C2A42F18CBDB3D336B71C70AC73D39D7EB04533453779A1F210BB4FC056B4728AFDFCF46675C6AC76F750626D642E3AB117E5D6740154759A46C27D51306587650E1039054B876849882E7DFD807BD03E69021E337DD69D9B097722C6D2AEB517D773D2F7D84D69DABE1A1D6422EA1766C0FE7B8DD4D7283F2985D96D91A132B8BA03AD85F7D56095773222D0AFDC5A192D29F3BB0C2539A1C99DB4E711B6ACE3FEBD58E45E99C9F5A04CECBB309D50397F28C48BB9CC9F9CF75A52253B634EC47216A1FD6358AF26501821864569879BE1736B0AD242AB5B8ED16A7EA0989ED4CAE3567AFE1F8209A028DB46DB0270B3BC06668A9BF5E1BC1061BABBA00EC4EC37280379139D19BC6072CC6B7D260A816CB82F9BC90897BE3025475AF12191690F9F400A914789A860155EFD2D606A15895378C827F2A4FF700303962FD96DB2DCD2D213EEBB2460F0B753BC6902DA81D44C983DD027F1171D40A2039997241E09AE5B6165B4D55A8E4C79671A8B8BDEFEF2C21F81C541A5719DEB939F866B61BE250AF371CEA7B7525094C904698D412737F7781BD779365F122EE627D9CD4A68DA9D5BE1B0431998AACF824CDD864C7365C01CD5A5F480B6AC1E5FEAD8FFE40D87C1F9FCE81867157242285C5E76CF9667919C29A67CA0C0A61D7819D9EE6B792250A358F5691CCD80578F15288F3D5D6D7DD6DFA351FCF8DF0223F7D1DA1B76711FBE0E7FABD30377660ACE7B23ACF03ABC1D973248CDD0897773FB74E20481EBD3E52657C9296B980905AD29271EC128513284F1B78F38634BF84CB80791A0C5649177791CDAB87769D57B626F78A03435C758A207F52BD2A1F31E34B6A122B8701CD9FE478C57CF3535B6D51EB46CAF794BD69363D5A56ADDE6945E9788F1E1DFD045BFBD0A68834B13D6B9EC4EA9C860EEA0E9AC19C2DE14FFBD6B57E5992B08943EA0283813F3F15E4F928B8D0F13DE6863990F5C77F130C97D8BE12571EDCEC7DEEC4B6EF4835F136DA45DA70A11F9192478FD8B4846C507410FD11668365B05252E68CB2C972ACF50156E369B83BB85E62E4BD4D84C2E9FF41A5844D5D88AAAE7DED852DAA0AE5C14A5DCE64C7E236E9B7B60F5B5AD4D953A2D842A52929491BE3555AB8DF534CAD56DBBB86B28A8A86B7BD9AD1C58C87B8A089324E00FDE32F8186B2B74523A22904C18ADE02C3E965F94624F8DF57E750EA6335E3EBA705294B76CD6ADA33D90FEC1F48DE7BA9DC7D8D60A53D2563964188874810C45736C57EFBC3A3CEEE7238AEE5281882A554F2143BDF89ED4BD819C08239C187C12A8B6E763434B92C26FDD658B350F51775C60CBAB7A2CB120DB8CE8AE9AAF6AF559F8CADE84C4820209CBD27CC09230B22F013A0E4CF8041E4A789A5D20BE9914A624AB957318848ADDB39C9748C8922C54327048A2E46523BFB22487538363459035BA49858F85A469957DF1F4831BB7FFA0564C53233B99B596F5356089949306DEDD6B904433D25C4854A80590B964DF6B0703B4F9628D6B9A4D3F0A4096E9A0B46D6B32F66D563BAF688ADD18DE001DA62E33C503A4387CE0920BA5D1E8B69C38E3745B19F8D8B6CA5E1AC6DE90EDB25FC32DF04F0849D769FBED3F8169EA1D2252619A2304E055370B4443CD23E56D4934F9F3FC92F1C1EEC626657E6A89C1394E56061AF8ECE3E2A17FBAAA4D579A99A7998632A6AE2683DDFFFFD27A27C8815511855F09ADFF7BC627A7A5C95FE57FA3EF81F494FA7EA6E6CA2D14775A25BEAF1B5A3E35ECD4A306545D597E4E44301C3D1648F0A7D841F2F76FE59C6EAFA3F5B58907FC4E642ECD28D16A71EE3D295F1DE12DE1485B9CEBEB2CC6C9AC051D3D42B6A1A068533A7680A98D015B09C5B819FFC61688D441C1B7FD71180C4423E64EE940917C7DFAA19F3F51CB5B38D1B2B7C81D10E7C -pk = 6BE6ED176D4FD1653ADF2B637AD5F15FF7DA309326D7CFA1311F8DE51456642FCC389A8E3B22D62B4C70E9D8A0FB3002B9597B9AFED43348232B088873E77041D2F9309C86A24BA094AA003B6854D61DC140DC556B5DD6FDAB4EF2283718CA00 -sk = 6BE6ED176D4FD1653ADF2B637AD5F15FF7DA309326D7CFA1311F8DE51456642FCC389A8E3B22D62B4C70E9D8A0FB3002B9597B9AFED43348232B088873E77041D2F9309C86A24BA094AA003B6854D61DC140DC556B5DD6FDAB4EF2283718CA00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027ACD738E608DC27D8FDA48DD62E2D8765D34C5CC7E4BC4B50636526EC71A10A96EC0165EED4AB408D2BBBCCA069B0EB387F660DDE546363D5F2B44C7F2A8ACEFDDB24000000000000004019F59B7D6BE70C93BB1A9F640CFB86F21D10FE37B38B0AED6F282FEA123C75FDC740784FE089CE0EB3B4A7595DA4803BFF5C5CB286953F393EF0D3C283B2F1F89CE4FFFFFFFFFFFFFF042B095E8620B38E48624F8EC445E5AB97EA95D19E949FA46F0AB99834E4CCDF357C29418054F3194D1DC9000000000000000000000000000000000000000000000000000000000000008FA5A898CDB4E25CF21A405888776704C09FB550D3BBB6C460A8430D6642191057FA41A6A3FF334D982A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB18A30FD1CB678456DCE17CE3B69D5A5FD7D2010B4823985B854A7C35825625C1942AA3C2876C652AB777051055B51013A1B74519653D829627F0FE16CFA1FD7CF80300E28F9664BB82BB06E598D3BBE9E6DBBE215246475937668D1BE268C01271E1CD6CF6274BFB9C1B4A91C18DED38C109106FBD41612D49B61BD4707F31B442FDE9C41568DCF50041086FBFA940172F3666818270BE9C828CFB330657DBF799D1B0823ABD1EE693475BE203F6EA4F2C78A5409B64C934FC23AA0AD34C102582DE87241855FFAC5454A5B521442E663D1BC628E773D70864C87CE73E62B216100CC4A66DBB258ACE79600DAF7100295831C8ACE82E03FF3B711D291E78168BFE4B409BA1785F9BE1170322E23B168889963800C7261615C9067CEC70A7700CFDE6D1F861A58E192AEAB208180CDF9C82F0A91DF61C2F9FB14F8EA74828F8E401FCE2C5B0D65AF790A3BE0BE581B027756B2D52E3D6B92BCB82913AE371266362400C47EA9B912DB4F267E0E5486699F341009E88284A66BABB1989B570203C3A3E216D41A625095BDFA23DA1718C9570813705B84CD5D4C221AC71924A29DFF552FAB30B6D3232CC694A4E1116703F9540D62FF613C3A062E7F00D8857848BC33BC98483C1459DB793A50E893EB724A44F68A4DCFA567A613FC3AE613CB0086035DBBFC0E7C82E6ABB4788150A14FF97A708B70F1A0F0323FE4BBC2F78102E0E40296DCC849D317B345FEE58D6200DDCF0ECC642702F213C3F1849C18AABEB302D180C35EC08FAC0AEB3930DEBC1D5040C6A13CE0D5F43519A07E6063F402C316CAC072A09A75F5C0D1834545448E479807724FF44C7BC26B1B71C4627262A5294935F567C13B6E5E70D079C6DB036AAB480A00C5002651298ABE73EB41C57046EA72A8F881F330FC6B7E391FCA078F0AACE3AC2C6AED4702052A32971702 -smlen = 2441 -sm = 2ED0BAF86FBDCDB1439ADA26004ACA72C99916BFE2534F7AD001EDFF2C339DA8FA472DA460A800A99861E0569B6CBFB7AFE7E80140E0D1759E082F5BE16538EE000D5A706B99BEFE9926258E2D013277E330FAC639A83D077590019E0552A89BD6DD7DAF749EE801570F976BC642739E9A5D5B0B00586E7F617E8A7AEC7ABB2F050011AA8BA0D923239DECDCDDC800ECE939142C0CFA33D2FA89B101C5699C9E2BD28D9C8B5342E600DD9A6C8180B5AB4FA646498F00A534F0EA37EDA8ACEBCFD6C900A3319C8AC4D0CC50FEAF6F280101A1EB741B58EC5CCEBA8B7FCB0EDF8B8781EB5AFA68BB17D3271901FAFB1871E5DC9579FCD26E5A01A5C4EC2EDDE07B2397193ABF810699B5B6FECDB52897A1958C5C3D1FC2F20B7D045F551856EA3CB441BAD9089C64CB9489DB6B63E0655AFC4C2FA73C7417FF1B80B9C7A1D659687D2C415B3A909CA30E96849D4BCEC6A9A6A4311204936BA972086B2394D86E840770D01550CAA6AD85ADC0EC851D2B3808E4A0E9830B99A70F6204ED4DBCB6759F6228126039607AD7ED8EAFEEA28D1C3E25A46BC18AF7E01F55FAD8244F15DE36F890416AA09548554338972C5F88FD9357792819E51A63D0B872B0A4D21EA3597405B52793D50C6CD70B52841D53484BCD3EAD004CEF0A6BC16CE74CB8AD0848000D8C5158DC16625112D1D85D17A3C1C8BBDAEA42C3A43E9930724655592116C4C6D0B8B223337EE4E754541A09D898F7FED71C3785B7F8721653986C525BC00F15590616437D11F9722824DFDE7E9615F1FB8488E5327E4D8BAF5F79D1FF5E808D154951AD87638910607B03FAAC3A61FE9916BA65FFD16986DEB4169BD24A72B1C8168FE569F3C81F93F3EBDD21D4E806F79FB28550912E9AFFFB52E97860C4DC0D042C56E1BB71C28B68E416874EC7043306A29BD1F4B9A3E612A6778315E2C2B850D6EAB9FF1905030FADA250CAF308735393C191134F3C493D00B5695775D82ADB9F2ABDAD17FC41FBD7A1DEFE337C2F8ADF69154CC0862FBD43035295B1A9C80B88FA8CF75B36CA08868F881966B41FB3E239EB1DB9CB51606A0A9EBCD552B2F4E819E2C30ABDECCDDE88D2D2F82F3585B5143943C929591D20CEF559CD2BAF2DC7FE03C9E4E084E8890FCE64A4AA9F13D5EB945AD7E3CC53E01FCDC192B97ADC1F98D9E773A0177E8D97405808EBF48BF17B689BFC15F4C515E38A855A9266230C9085ADC9A6DDAED93D80C3F38BC516695D202B4E89DA5B4EBC43788C848F8C4A72F79F37F857EDC105F13E4ECECFD09302711BC1993F5308B8F32AB96FB8EC3F5EA0531DAFD0AB3451F81F47E62C593C8D3E3BEEE79DB06909576BF876145856F5F716CAA436C98EAB28C5B85BC2E4D7E1653ECBB8BB6B5BD6981DC72D7F63BA06CAC8197ECCDC72C1481DB44724A3C21F7FC60661F11FDDE8122DA5D0B1D72A29952618B373423A892875E6AD24D0916109ED8E9A9A8D9A68ACEC4BB5EEB0D00EAEA72D8D5A76C2A42F18CBDB3D336B71C70AC73D39D7EB04533453779A1F210BB4FC056B4728AFDFCF46675C6AC76F750626D642E3AB117E5D6740154759A46C27D51306587650E1039054B876849882E7DFD807BD03E69021E337DD69D9B097722C6D2AEB517D773D2F7D84D69DABE1A1D6422EA1766C0FE7B8DD4D7283F2985D96D91A132B8BA03AD85F7D56095773222D0AFDC5A192D29F3BB0C2539A1C99DB4E711B6ACE3FEBD58E45E99C9F5A04CECBB309D50397F28C48BB9CC9F9CF75A52253B634EC47216A1FD6358AF26501821864569879BE1736B0AD242AB5B8ED16A7EA0989ED4CAE3567AFE1F8209A028DB46DB0270B3BC06668A9BF5E1BC1061BABBA00EC4EC37280379139D19BC6072CC6B7D260A816CB82F9BC90897BE3025475AF12191690F9F400A914789A860155EFD2D606A15895378C827F2A4FF700303962FD96DB2DCD2D213EEBB2460F0B753BC6902DA81D44C983DD027F1171D40A2039997241E09AE5B6165B4D55A8E4C79671A8B8BDEFEF2C21F81C541A5719DEB939F866B61BE250AF371CEA7B7525094C904698D412737F7781BD779365F122EE627D9CD4A68DA9D5BE1B0431998AACF824CDD864C7365C01CD5A5F480B6AC1E5FEAD8FFE40D87C1F9FCE81867157242285C5E76CF9667919C29A67CA0C0A61D7819D9EE6B792250A358F5691CCD80578F15288F3D5D6D7DD6DFA351FCF8DF0223F7D1DA1B76711FBE0E7FABD30377660ACE7B23ACF03ABC1D973248CDD0897773FB74E20481EBD3E52657C9296B980905AD29271EC128513284F1B78F38634BF84CB80791A0C5649177791CDAB87769D57B626F78A03435C758A207F52BD2A1F31E34B6A122B8701CD9FE478C57CF3535B6D51EB46CAF794BD69363D5A56ADDE6945E9788F1E1DFD045BFBD0A68834B13D6B9EC4EA9C860EEA0E9AC19C2DE14FFBD6B57E5992B08943EA0283813F3F15E4F928B8D0F13DE6863990F5C77F130C97D8BE12571EDCEC7DEEC4B6EF4835F136DA45DA70A11F9192478FD8B4846C507410FD11668365B05252E68CB2C972ACF50156E369B83BB85E62E4BD4D84C2E9FF41A5844D5D88AAAE7DED852DAA0AE5C14A5DCE64C7E236E9B7B60F5B5AD4D953A2D842A52929491BE3555AB8DF534CAD56DBBB86B28A8A86B7BD9AD1C58C87B8A089324E00FDE32F8186B2B74523A22904C18ADE02C3E965F94624F8DF57E750EA6335E3EBA705294B76CD6ADA33D90FEC1F48DE7BA9DC7D8D60A53D2563964188874810C45736C57EFBC3A3CEEE7238AEE5281882A554F2143BDF89ED4BD819C08239C187C12A8B6E763434B92C26FDD658B350F51775C60CBAB7A2CB120DB8CE8AE9AAF6AF559F8CADE84C4820209CBD27CC09230B22F013A0E4CF8041E4A789A5D20BE9914A624AB957318848ADDB39C9748C8922C54327048A2E46523BFB22487538363459035BA49858F85A469957DF1F4831BB7FFA0564C53233B99B596F5356089949306DEDD6B904433D25C4854A80590B964DF6B0703B4F9628D6B9A4D3F0A4096E9A0B46D6B32F66D563BAF688ADD18DE001DA62E33C503A4387CE0920BA5D1E8B69C38E3745B19F8D8B6CA5E1AC6DE90EDB25FC32DF04F0849D769FBED3F8169EA1D2252619A2304E055370B4443CD23E56D4934F9F3FC92F1C1EEC626657E6A89C1394E56061AF8ECE3E2A17FBAAA4D579A99A7998632A6AE2683DDFFFFD27A27C8815511855F09ADFF7BC627A7A5C95FE57FA3EF81F494FA7EA6E6CA2D14775A25BEAF1B5A3E35ECD4A306545D597E4E44301C3D1648F0A7D841F2F76FE59C6EAFA3F5B58907FC4E642ECD28D16A71EE3D295F1DE12DE1485B9CEBEB2CC6C9AC051D3D42B6A1A068533A7680A98D015B09C5B819FFC61688D441C1B7FD71180C4423E64EE940917C7DFAA19F3F51CB5B38D1B2B7C81D10E7C - -count = 66 -seed = 83C653708FAF3E5F6FBC9DFBE6FB5E83E572A7688645D75D2C4835B28695DEA4BD7093740D0FF43237354EAD1C978BC2 -mlen = 2211 -msg = E3B57B208352A820F622A694B7C3F6F297239EF0A069615DC664C02F1822BBA48E11E37BD9749C98FACEFFFB0FE1792A386BE10CA7B98CC874C68C36F5096D3718DC93E0734D6D6F913E3B958DC1FD1424818C9437B0FD59728ED46A79FB52C737A1D1D26F04EBAC279A7FF6A971E2B69576B712D9224EA18FB9BF4E613A8935F3B36A073B01F37BDC0B77981C8F2804E93C395419352B85C8A32DD77D41DA9BF3ECB914173E80DD1FC06E8FF5BF0E4F7424849A15EB7FAF7DE77456EBB64D10DC10FEC6254070C7DF387397137372EA3A53DFDA7DA13414AF2DF16C1E38C5C70A5F5F44F725D622049256BB15DC04A8D846A1A0DAE7E765A7F00C498F1D0B2893B8405BE4A43FB7E97881069A49134A2A847184B82EB5A690D87BAF2F579619EE19A3D7A7C7EEA72D6E3FCCF0A8092BB8D3C6B551F27E63E762A30B4A4DF2DBC4D119139AE1B135D06FF827846901577700935E0011B65461C2EF9A7B71EEA33C8CA4519C7BCFB557C5E1D42D9243F2DC34057F5E0CCB9A457FC34DCB10D9B47F6EC3B9550D3AE4FD593DFA3E28C6CCA1FF1EBC9D98DA8DB869F8C80BDBF8AD4684ACB6A779CA9D0A106F26DA17043773862681C5DD2DEB1BCA2CA48D4FBB4BB7C1F765DCA3A1D991D890B9A8751CEAFF543997FAE5B128AB2EF22B3BE94499DFD9D8E78FB4C82CA8D296B0415E84CA8B5F2024455B5DECC8B4CCDC7BC4EE06B4F0C66E6748FBD07E3A3BC5B4B6889C40DC4A97AE3EB43C3914DEF976EFE3BFD84A093BD69102D7B37C89B458A55B98A1974A13A7685D26E9D816C79585BCFC1042C2AF88534A9FE8B0A6C8C44355A6D606F902DB40D5490264BF0F352C27355633CB095268D5B8BEC985A62D84B2323FE814053F05DEDC22029D2998BD0BCB255C162C4BC03F60E3580AC3AE86C37850110E9A1BCBD75F64A0DD60B941E2F57DA9D72498B3EA8324EEA53DA3895585ED2942B9140F260895DC6A1131A4C3AD2B64028BB8C0FD67E1BE4C07F808B47DAEF306FD9578025F9C639660075837B2C95473F7F860D6EA2C53F4BA677A2345CF212C7757BB94F1A4F76D4E96625F6FE051B8246D1B7611BF6FE325FFFF8514D2F9A3453F0E77AE8B958AB5B567E541F156C6F4D315B4C3C547D59BBD0D7403E2E6A49B9E7D3FDBA338ADA41875CEB03830A846A1FB266C0F1228AAD2B76A2E3404278DBE482907206FA66487AD2C999867F870C8CB7A70B83437E14B9E893BF6B391DAD75E84588E882246D161799ADEA63ADF1AD706C0A3B76BAE595D84B21AE9DA30BBC0856987F2C2C543D977747B8CBD5A613B92804ECC5284ED23650E9DAFB4B76D63F069710897334F18EA6B0CBF99CD590A78E3B050E1BB24C86D6323A17106F0CAE3F30B01E4EB3DB1B5F3A4771A880C8AC06BCD5A82D4103D0452FD7B54834C1CF8595DD77F82D4AD9EBC1CFD0C9A8CC787E10AA4D1688474208B69FF7AD4DA6986E5F62A34AC3093E0FB1EFE8AE3A96F6AAE09B0E8F6E7A2B65C7387999CECCA43CC33F026DC19BBFD867C48127CFF579D1D71AFF0C4A0E20F9FDFD599A6169DF1B85F6051E02290DF6F5EDE4F29BB6F0C8F806D6850C6534ECDDCCD75BB8E4A097C70445585740F822E5CEBB0E19EAC82BB78EBDE2CA60A810AC6C54119FD6427DA8A0155EF48653515A919B299A306FD3C62B505A6911DB2B56CA2F296E487BA02C546ECA2783ADE8E46A8C78EB1F3D7C04BB24548F92383E475CE6E572D8DE1BFA9B3E35D9BD6C79547B592C95693750010A3D22CBB31AA5A4ABE94897831B1ED9287631F006A735C36BC84A8C87497EEA4873801A733F35B328C7D2CCBE4A41C193D22F972571BA7630B33080793498CC85E6EEA1C412914459DA175A6DB8658D0BD7A823FAB286EDC20C785C40BFD539924A24AF4E3D37BD781353677C76D4672098F5BDD17017012571D9AFDA05A40AB56998E40F5E359C43DFE32CA10A45BF08F67D128C24B1ACC03CBAC46BA6CA5A532C105E91E0C77ED59FB534AEECD68735A4978177BB5A656B9F83B202BB604D61A24574C16656E512C0A4CC6F597B3268573E10539D1BA775ED83BB680BB9115011C6AD43FBB66FB37C467249060A1586DF27B2CEFA65265CCB9051E468000CCAE24F08BA941A8180A64BB624F146C8EC562363B32C369F62997C4B1375DD7DE64725A598529244273CAF8398913C6FC01522683CF1F9F965C491ABE7A554F0019514ED98D75EB8BB8565F77C195F629F98163494B4AA2674F92A41DCB67EDD1D818A5B98993D0B1198BB6BEDABBB486BC6FDE039433E842BAC568A5B4EACC028CC2544B57D8883848DDDEE2E967EA85A6102BD0ABDDA41C3D78447BEE1D4949449ABAA9B3377E8CEDCF04A500FD1A6916E26983E64B5E96FEF87B32A060444D374409262453CB1376C349A8B5D1767B1E2991A1A6044E0F58831BD11F12159675D215D7EAA74807C995FE22017E30482DB8A4B09CA7800822C75C92FF649FC0728F5A1D44EFE7D0FF147274152D5F2F60342C8F5F951D8C95F83C1D54613A182D9DCA68F54FD55047F1F90CFECC04D733DFA82CFF2618F29A4DB4F7E1E59DEAD58CA65D07CC90C25F804A895D6A82F9375451CC55506D276FBF783F7D4D53B9BFB83DBE4A8771AFE21AC543983D68034BADC980F9434527F9EDAA2E228646FDF75B44899E749CF4C9E5B345222385A4424382603AD6EFC24C56E769028F4394F2F6220A9B390D395E412498E57A08BAD927B8BD5D76E18E8FEB457FCBD3248D218236B07783E57FBFA03C292A9F5719E6AEF2EEA3FAB2CAEED5442E89BFFB236CB13DB2CF9C35A38C338C377C475DAF45F8EA822F9AAAC13425FBD43D3DD9229367F0B3687D7E82AC5EC2FC7CDB69C99A4EB1B8E45465C6A53F16AC0C4E0C970B8C732AF515C09EAF25596F64A04AE4621037B8841FD2B1BBCB310EA23E122B0B9AB96D8F7702952D0E96E4CF79C2A30DF0091ACDA91479EE2979B0054997C48F6A0E909BC52A943459AF25553969EB31CE7685369A7FB014561B4697B8BCE220983136E5EB2303CCA4EADD4C6CC74EA2FE69D448AE6ED953A80363DDED5591B27A1EA956DF081CE99AA59DFC789D9D8FAE952B0737099D467D -pk = DB7A37024D38DA0B7117D6773EF46F163C9566DA8EF6F8B37B8274746C76447096319BB5059124FF493DB450B547EF0029092ADF491E4A774F7126915E33F66D4097527C428B569D7CA734CE23AE338908E7267BF5D06B3A9FF10890761D2501 -sk = DB7A37024D38DA0B7117D6773EF46F163C9566DA8EF6F8B37B8274746C76447096319BB5059124FF493DB450B547EF0029092ADF491E4A774F7126915E33F66D4097527C428B569D7CA734CE23AE338908E7267BF5D06B3A9FF10890761D250102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003E91827CE1253758A3FF9273E7B62817903F45A4B7DE4B0AF83A1AD17BA6CAE3183885CBBE2841B7394C2458DDDB6C5E33990E1FD87A3220843814748D53BE27CE141F00000000000000F544F12DEA2EB7A1D73CA05DC12C08BB18FAFC8638CE27DDB55E47F5D47425CF863B3AC15917C36BF1F8D27FE746DA44AA806FA425CA48E7277DD0053B819563B6F1D6FFFFFFFFFFFFFF75EB81E762A1C7B8BDD6A99682BDF0CFE256EC11E517930DE3202F39B4B1F9C1990125C5AE03BB301E9B89000000000000000000000000000000000000000000000000000000000000007EF95932EEE2E21AD002B8AF13FAB95780FECA70234FFD671F2CFE5C8F685BC296CB2E7F5213CBC31C020EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6DB61738EE424BAB8BAEEDD66BADA9C2FB8A971B993D0010C86D77C2602E8709606244D838AB6D421B9FF071E90F30019596D6992459F39E4B9F48330EDDE5673A0561DF001B84A1AC4B0FAB51D0BF2AEF83A950FA64DDAE5883F4807A2EC0025EB602344DA35409519A1AF4F44564074B95E6F8C7441A548D949490BC6CE8AD7EDB748D69D230D8E1DAFF5D16548B011B4633C59289231D865FCEAA4EB40CAD2A1102D16A745A6F6904632263B472B969A311F6AA70391247715FFBD00072033132705CAA4D5D2738F6468FA6A526043355E9B52194637F456885C837EBF31D508EE4A472EEC46C018C52A66E123702F41E2762C75634513E4CC8870EDB25A2D0B7A172FE47EB4880703490FCD2D20057BCC7F3117E56855729F0F26B531D029D77101C1E8B1E3C7731463BFC5A8C1CEB49FC36B03014230E9ED551B721AE0DA675EA56802005049785B1232F07CF004D1348F1FA7479B78713F1557BC3B0B95761593E38DA21863D6EFB8DED561EED66BCAEE26BCDC15AB9EF63CDE2C6E80292BE409CA753D31327C3DF73612C537ABF778075F54D654513B537EC296E6C96E4F864975D87EAE5E24077B3E5DDC900785FD867CDAB9AB518A0B626903C2CF0288F2B1EED78B1662470CC8A3693AE8CCC8EF297E6DF8656FED64DD8BBC5E102456213237FE4FA974CBFD108C68A137BAA52206CDCF879A18B0A3AD1083F46F82EC92A1410F395008D4E33A02A86640254D8FDC225A4324E49CB0A65EE3B86ADBCDBAF9117A9E9C88B42D6901B6ACF3045C2CED896C7280D221779681026C102F8FC47AB42FFA220D0C837840291A8D84C7CC9328288C5CBCAB39F8B9E23D3A7046837C5AD490146B1EBF7994147130131EAEA3496DA7EBB306B70BEAE09E736AA18F7A53424954D126C5A64EFE11CF47CDB57C75620957EA5E34C2C2A995303 -smlen = 2474 -sm = 1E259A2F7ECA7ADC8D84365E00116E71026D7F81C5BF3A9C2B01471BBFDFBCE39E8211C2F8E40133CCFB21681F69646E5384BC01BBB071CB483BDEBD68F0E02D01E0C248C12269579D9AF507AD009F4C85A02373994D9824B26A0005080DBB9994021A20D7713B018EF404EC15A5A3051D4B7F3A010F88629521C31A94E645F1A600BE8B201BBB4177C6BB6D118300D6CCFC86FBF3879C518607A80085715B4241B5F2AC410227D800B483216F426663E7E9D648A30018F2E7A8CC8B61E68CF706550074AF40AE66089AAF8937654E00007380AB03948A99EA0385A44A00EB7114E6D837AAE298BB3E691202EAEB99B9B5C9C65EB79F678000DB348F84974B2452DE6D0F2B120DE3B57B208352A820F622A694B7C3F6F297239EF0A069615DC664C02F1822BBA48E11E37BD9749C98FACEFFFB0FE1792A386BE10CA7B98CC874C68C36F5096D3718DC93E0734D6D6F913E3B958DC1FD1424818C9437B0FD59728ED46A79FB52C737A1D1D26F04EBAC279A7FF6A971E2B69576B712D9224EA18FB9BF4E613A8935F3B36A073B01F37BDC0B77981C8F2804E93C395419352B85C8A32DD77D41DA9BF3ECB914173E80DD1FC06E8FF5BF0E4F7424849A15EB7FAF7DE77456EBB64D10DC10FEC6254070C7DF387397137372EA3A53DFDA7DA13414AF2DF16C1E38C5C70A5F5F44F725D622049256BB15DC04A8D846A1A0DAE7E765A7F00C498F1D0B2893B8405BE4A43FB7E97881069A49134A2A847184B82EB5A690D87BAF2F579619EE19A3D7A7C7EEA72D6E3FCCF0A8092BB8D3C6B551F27E63E762A30B4A4DF2DBC4D119139AE1B135D06FF827846901577700935E0011B65461C2EF9A7B71EEA33C8CA4519C7BCFB557C5E1D42D9243F2DC34057F5E0CCB9A457FC34DCB10D9B47F6EC3B9550D3AE4FD593DFA3E28C6CCA1FF1EBC9D98DA8DB869F8C80BDBF8AD4684ACB6A779CA9D0A106F26DA17043773862681C5DD2DEB1BCA2CA48D4FBB4BB7C1F765DCA3A1D991D890B9A8751CEAFF543997FAE5B128AB2EF22B3BE94499DFD9D8E78FB4C82CA8D296B0415E84CA8B5F2024455B5DECC8B4CCDC7BC4EE06B4F0C66E6748FBD07E3A3BC5B4B6889C40DC4A97AE3EB43C3914DEF976EFE3BFD84A093BD69102D7B37C89B458A55B98A1974A13A7685D26E9D816C79585BCFC1042C2AF88534A9FE8B0A6C8C44355A6D606F902DB40D5490264BF0F352C27355633CB095268D5B8BEC985A62D84B2323FE814053F05DEDC22029D2998BD0BCB255C162C4BC03F60E3580AC3AE86C37850110E9A1BCBD75F64A0DD60B941E2F57DA9D72498B3EA8324EEA53DA3895585ED2942B9140F260895DC6A1131A4C3AD2B64028BB8C0FD67E1BE4C07F808B47DAEF306FD9578025F9C639660075837B2C95473F7F860D6EA2C53F4BA677A2345CF212C7757BB94F1A4F76D4E96625F6FE051B8246D1B7611BF6FE325FFFF8514D2F9A3453F0E77AE8B958AB5B567E541F156C6F4D315B4C3C547D59BBD0D7403E2E6A49B9E7D3FDBA338ADA41875CEB03830A846A1FB266C0F1228AAD2B76A2E3404278DBE482907206FA66487AD2C999867F870C8CB7A70B83437E14B9E893BF6B391DAD75E84588E882246D161799ADEA63ADF1AD706C0A3B76BAE595D84B21AE9DA30BBC0856987F2C2C543D977747B8CBD5A613B92804ECC5284ED23650E9DAFB4B76D63F069710897334F18EA6B0CBF99CD590A78E3B050E1BB24C86D6323A17106F0CAE3F30B01E4EB3DB1B5F3A4771A880C8AC06BCD5A82D4103D0452FD7B54834C1CF8595DD77F82D4AD9EBC1CFD0C9A8CC787E10AA4D1688474208B69FF7AD4DA6986E5F62A34AC3093E0FB1EFE8AE3A96F6AAE09B0E8F6E7A2B65C7387999CECCA43CC33F026DC19BBFD867C48127CFF579D1D71AFF0C4A0E20F9FDFD599A6169DF1B85F6051E02290DF6F5EDE4F29BB6F0C8F806D6850C6534ECDDCCD75BB8E4A097C70445585740F822E5CEBB0E19EAC82BB78EBDE2CA60A810AC6C54119FD6427DA8A0155EF48653515A919B299A306FD3C62B505A6911DB2B56CA2F296E487BA02C546ECA2783ADE8E46A8C78EB1F3D7C04BB24548F92383E475CE6E572D8DE1BFA9B3E35D9BD6C79547B592C95693750010A3D22CBB31AA5A4ABE94897831B1ED9287631F006A735C36BC84A8C87497EEA4873801A733F35B328C7D2CCBE4A41C193D22F972571BA7630B33080793498CC85E6EEA1C412914459DA175A6DB8658D0BD7A823FAB286EDC20C785C40BFD539924A24AF4E3D37BD781353677C76D4672098F5BDD17017012571D9AFDA05A40AB56998E40F5E359C43DFE32CA10A45BF08F67D128C24B1ACC03CBAC46BA6CA5A532C105E91E0C77ED59FB534AEECD68735A4978177BB5A656B9F83B202BB604D61A24574C16656E512C0A4CC6F597B3268573E10539D1BA775ED83BB680BB9115011C6AD43FBB66FB37C467249060A1586DF27B2CEFA65265CCB9051E468000CCAE24F08BA941A8180A64BB624F146C8EC562363B32C369F62997C4B1375DD7DE64725A598529244273CAF8398913C6FC01522683CF1F9F965C491ABE7A554F0019514ED98D75EB8BB8565F77C195F629F98163494B4AA2674F92A41DCB67EDD1D818A5B98993D0B1198BB6BEDABBB486BC6FDE039433E842BAC568A5B4EACC028CC2544B57D8883848DDDEE2E967EA85A6102BD0ABDDA41C3D78447BEE1D4949449ABAA9B3377E8CEDCF04A500FD1A6916E26983E64B5E96FEF87B32A060444D374409262453CB1376C349A8B5D1767B1E2991A1A6044E0F58831BD11F12159675D215D7EAA74807C995FE22017E30482DB8A4B09CA7800822C75C92FF649FC0728F5A1D44EFE7D0FF147274152D5F2F60342C8F5F951D8C95F83C1D54613A182D9DCA68F54FD55047F1F90CFECC04D733DFA82CFF2618F29A4DB4F7E1E59DEAD58CA65D07CC90C25F804A895D6A82F9375451CC55506D276FBF783F7D4D53B9BFB83DBE4A8771AFE21AC543983D68034BADC980F9434527F9EDAA2E228646FDF75B44899E749CF4C9E5B345222385A4424382603AD6EFC24C56E769028F4394F2F6220A9B390D395E412498E57A08BAD927B8BD5D76E18E8FEB457FCBD3248D218236B07783E57FBFA03C292A9F5719E6AEF2EEA3FAB2CAEED5442E89BFFB236CB13DB2CF9C35A38C338C377C475DAF45F8EA822F9AAAC13425FBD43D3DD9229367F0B3687D7E82AC5EC2FC7CDB69C99A4EB1B8E45465C6A53F16AC0C4E0C970B8C732AF515C09EAF25596F64A04AE4621037B8841FD2B1BBCB310EA23E122B0B9AB96D8F7702952D0E96E4CF79C2A30DF0091ACDA91479EE2979B0054997C48F6A0E909BC52A943459AF25553969EB31CE7685369A7FB014561B4697B8BCE220983136E5EB2303CCA4EADD4C6CC74EA2FE69D448AE6ED953A80363DDED5591B27A1EA956DF081CE99AA59DFC789D9D8FAE952B0737099D467D - -count = 67 -seed = BC81485EE93AAD8B464B5199FFEF9FEFC06EA97645BDFE0B4E915B812E606A77F93917ED925E882161CBB909747AC4C8 -mlen = 2244 -msg = 89D960D04A3DF6984276A3D17D59AF9E72B25418C8797170FA701A672C5835CEAA22DC35470D038C6ACC5082D2AE329F36697C91CBB1F9E42DA59A654462BF19E04352192778CB050DB6F4A656F6AB0BD9641CA8CE6C1EF8B020A3D9FD9DFF772F38926458BDA6E6072456E506AE464785399AD7B498AFD4C211F09D0C722FBD9E20890CDDC8C6EB9EE75390E6D76D0672FA64D8B97C65CCA46DD1F542B6D6014F035D2817C4B9430AC8DC318CF8642AB34F4C8D71FC0E3B1FC961E94B6A84622876250FDC21987777360784D9A58F35E1C9B71F30561ED6854EE9B112E7B20CE064272213BD1A46D0D19E5EFAFAAC7ADDF4D7B7A519D689398EAF1E67E64ACE8E5E89756377E1FE458D04E3DF7F6680F8B69815680276ACDBEE6C8E1AA909EC56994F3EF3B65FBEFDBC29AEB0EA906274E838CAC36A0607716FBC2B8DA6150A4EF39E1CD9CCA72915007723C5D2442F7133258234D18A257DA2C13E53B47DC6ABC2D607B98E351FCECEE8BA8886821985BB3A7BD02429ECDC5A27EB04D01DADCE88A324AE44F567593FBF730C284414056FA33CE90A6D6F146DBB1635BD26B4F883D4948DA47216C70D2AA58CEB3979523C6A4F2F7EA455A97C7ADB6C43685D63BD4C51D7DDCB81A06B9BAC31A7B255B94052D686128D234BCB63CE713028451B18B981B83DA1246281FC3BD2B06C741CF71979DAEFDFA0FD06FBA3722FF7BCB2821FBA964FBE9F6467FE583C06D3889A40360A7AA03358175EE75EB8FD1D3368C30B5691776C163764DB924FBA2362CC9572F642CDD2B11B40FA2683A529EC2100DEDEDEAA70A1E639A71D6A96AD31F70A00FB63875D0FD5C21E56AE57B6E74EECD2EF34BB3E20BE5A1F9F1F54955A18B4E4E4B9119973DEB76A2A603FB6410A350667ECE5C1C147DD00B07A88A7D0E86AA2D747A867AD90BA6660C7A0432E20849EF642A20CF5A20AF7E34D139B39DD65C65B36750F17F0B9F1DB06CC6E16F10EB289F567B647454A581604F381D66371238AB785585A4DA2D00810EF6851A6009025FCADFB77FF7996BA6B091FE4130733466B29FED46554FEBC2AD291DD966BEF4D79A9E04014D3003C95696E8BC39892AD32DB6D6AD22D33E931BC87F78114BBBD97B334BCEA676F9E9DB23C0485EC06D8F37F070C143117B1BEA49F06E1A2423D98C12883D32D29103F7699646E7091D393B21A260703E17380A1BD85452702C3AF7DF73AE7856A1C066013014DE62C3C817DD74C44AA436A71490E7BDC6B8B74BF61711FDCC541AD7DC49CF4C3EC154879E048FF30DF25065B5641367CBD3BBA19606A9A27A64055D5D3B538FC88EDA66FF9F26E619DCBA696866DE54A8DC8580B5B28144F952FFC6DC543E98CC9FD7F4538135C0F4DEB4BF892266DCC48A4D1DDCF407BE4FDF2A5AFE4A0105A20CE2B3D9F48D608DE2315240875F1FED696C49CD8D4A78AD26F51B3C804949C536CE35C3963DC1D238516B3F2D297F5C9939A946A0170E185C75087F37ACF907F9E3F87A2B15CF81C7ECBF2165F0F3962D11E9C6A7845ECEF432CE9E1FBE74C77EA1057D79CB595D47A8DDC1D911C6B97AF76D91F3515081B95CED16275DECDEDCED9AC790D73739E35973834503133510DBE39201F9B5C618231184B9DBAFAA7ED6623E8BC492170812444DB62D4F01925DC4F821C0896A746B4453E93EE51844B311B0A0A51601477BFF651EB5EE331227A2E9E49F593EB2988E449E750E990A8A89906EFAB00E0955C81B6AEB160313007B481C40908130597626935389E47AFCB0A20146F0C7B29B567E95D59CED7FA8023A2D69C89443A11E7150A03D09EE6B0F74358141D48E9BCAA3EE081C7D8F8C223F4D48EFB3DF8A4E287FC5B90B4FD251CB616687ED09AB1A06C42EB9D6A578D72E99D499882D216DDB3F35B0A33D9F2D3D4A700161A5C3B5A6729F197479E78009794AA1BE3C25E0B9142613AD2EA508ACAEF5EEE33DACF60CB7A16AB38D9F3CAFD2150081B63A3A6CA0163A25FE81206A37A0874FD55FA3068B4C1B25E6325FA56646EE5F3431D33D0BC691C134AB306B0BD2D1087F4D898A529DAE08B97683FE2EB8ABC9095D67B79CFF0E77404C1F7FF316C3CECBAB77C710FBF961008047AF22805D77EFF79F815B21D142F517DA2199F6627AD9FD85AA24E9B7F40C7796207A82901C7B5A3A42369A9BCEBC24ECE13A3ED064E4E748BEE2890BB21B8E4845362BE9AEE46E25418F7CA38ED087E46E24F12012A1312BC623AABA6ED227CEF116A3C2130B4B837AC77D86F8CA3553BA0CF5AD45E9B4E4E55059F1D4675291581D7CC9E5839212AFCFA897E90CB601CB33A4D2241A5ED5925F6416BE5A43D4767FA04F701076AD5ED5ECE2D09B8DAF11B00FEDD2AA2E748CBCBE365031394EF823951EBC52B3E4C79D79234C16575910C29A35EB67C624F7504EECA3921F461D7F95EEE39638C402481DF7B59310C4554450789DFB28ED1E485C0018512EB05F14DC7A3DB5C0606F9E28420D76B8F8534D2AE31AA01E90A20E248A7FB3B72EA859031C67F7B2B043D38F7183165A42AB28C6308608C530A9CA98F82C133BBC313FDDD2109838E970DC9989EC14DF781A518F6CB56DBEDFC1E381250C64F95D0BE5F37515437673425374D44811F4406EE2B5130334BA555839E61AE623D283C77247D2EF8B22ED138A526F7E41DFD41FC69A2839B77B51C6FD96D97D3EF8359E8725BA1AFA80278FB3BA9C697F7E2BBCC5D3F0F2E61BFCF542D3160EDE02CD6295FCC55865E7890342572499347DF80EC073A91E00193BAF804B884E9CF5C43269824D4CAF7EEF49FABD8BDC5496D190263C96DBCD287681C19B90C34635FFBDFEAFE0601BBB7514FD84896A22895E9B21FAEEA372696E350F13959FC23533F3E8C34B17B595F3C935E37220AAF644F3A565114C34C7B85F1A3E465470166A62B13ADB00A2BCD5A9A3ECD59FB772F09DD6A6E2AD12FD54EC62CFACE0022F2FFE3EB62DB0F4D0F0F9D1FD6F3F11D76DA868D2C1C4124915DE19EACFFCDB31F7CA018B6976260CA1BB2C4FCD6B9958F096313B608E208D875EA5A1FA89916D0367EDC4F8890E93F1E660AFF16EA79D1E583007E693BF06C172105B3DC24117DD921FB60D3AC0D2E5C89FEF17087D885A0794E496E3CBEA333CF72A507788EFE -pk = 0CE381557946C538FF1C1489169AE1CC9250D02AF2F1F6EE3CEFCA0A2D24CDACB2AFF26BBD9E4E4D48A0AA62D4B44D00A62015B80DFDE6F700FAB47021C9EE7BD7865A01B36BDC5F7F083F81B2FA07D0114B1E62FD79EDE1E29B8DB5904BA401 -sk = 0CE381557946C538FF1C1489169AE1CC9250D02AF2F1F6EE3CEFCA0A2D24CDACB2AFF26BBD9E4E4D48A0AA62D4B44D00A62015B80DFDE6F700FAB47021C9EE7BD7865A01B36BDC5F7F083F81B2FA07D0114B1E62FD79EDE1E29B8DB5904BA40102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003E73D943D22372D8EA0FEDAAF6A7C41A044CA37C8D2912ACEC05A19B82AA4271F4EFCBA1B43B758049B491F148205C120BA589D635524A1EAB9F252B86443F90938F1C00000000000000518C3BB356E03569D1EE7433A36824FC42029698ED6756D2774D129F3774A6A858FAD69662809205121446F6B65D0343850D3C929376392158209F441A7311254BA606000000000000005F3F11D39D68B3B7C8D065EF329CA454226052E5AEAB21F07AA9784C79DD335A03071098C6C34D5D415185FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36731FB253C5BBF93090838DC85167A11F811E21C67F70F4126198F07ED870471835BE292F70E25ED1308E01000000000000000000000000000000000000000000000000000000000000C3EDAE36CF903E8C58866A3001F8D534FD84AF75D587F9C156558666CD3FCE9C315EC7D4C0DFA5BAA7C6C2FC58836E00B195FE27BE602C3B45143800C1DA459AD8291EC03A69CA06651A980CCB16841884B8C6D41337F9403BE77416EF0F5900430F63FDE48E3EC1953E1ABBDAF5EF30666388A38D4E3EB4406B3EF5A8BC90A887DB5E453D2FCCD85CABAC48773DA8035092F8837B69C5CCB90708449A3A35073B3B928562E2B7D127F0F69B8DCF145E3745E0EAE43BF549434DEB2F0D3959036E99A8848EA1C51622334C99346FFC81C15C37857B3A1F75203A8A65EBDCC42FAD6B90C49B3A359800C120D75545610008E0E85C25CEAFD78E32DF1553F207A4DA6116C3FD483FCC6C176112CA6ECE33EF7A51AEB8FFD6BA3C8FE0D04A53600245D3A9CC2D4B217C34AB7F93BE16CCC8E36696584890FACE8999954DB684EF3DEC4B592D831C8A1C852F584397B241019B877901F660ED6A7074BB41931613BF5ABB57B0AC5B45A710B57A51BCF1CF76360E5F1ECFD2D287D2947AFD71F56C03B871F0FF8EA9322EA8FEA74B6950181F7850AC768D8542ED23AE77B1925F38DCA2B0BFB40102573E023DF882F776CB03F2CB64A8AF8569A262B49EFFC9DC9BADA3972A22AE2DE4D7BCB1F3075779EBF514B2EA3899FBAA6E8B18D41B66C15001EA46C509D0CA55D04CC1E23947B21DBA3EFE7A4A66BBC5F776E833314F0EDF8059917B75974F2D7C53ADD2EDCAF4A4012918D17961D01D4DC797102BDE1003CE88FBE8E5188855E2BFD81078A6932A8126E0980BF2EA502CA5F91268DF898903616BC02397380857E54B89505989967B36A98090A5DB1AC2DBC107B07328FA30BA99695F1E339C6B664FFC904282B30186A19B81762D2CAF6D79063A07D52B3FEAB21C8DCDDFE661E0D29A521AA98D5B553F1BC5A165F7C94F27D15244C48B02 -smlen = 2507 -sm = 745A95825B4C81D4F6A5D9A201B1676E3D790D9993CB1D6EF6019E1ABAD03AF9B9EEE604FE93008C07E7475A9C8C6F6D708C2D00C2A4E9BA1D75388E9254C08E00A5F1DD188FA81CC453008C9D003A1F892C10C0A3D5AC3F0999006DEB6846D00C70E3D9E10E8800C5E775150A29AC184FC117A300A9078CAA11C3B6D3100820B401961EBFAEE7DFAB52A5161BF70101C93695359F732C29CBA3690007B793F3326E39788559C0CA0047C7A06EEC165C73A27EEFC80143265D6B91754395873777F3014192D6084AD47BFA9CFCC5E5010159A6D1DB8C46461354677E9154F664E0EC0B466DFBAA5C30F91001217C95FA381D3E04E2E9790800F91B67C58F3C1EEE867092819D0089D960D04A3DF6984276A3D17D59AF9E72B25418C8797170FA701A672C5835CEAA22DC35470D038C6ACC5082D2AE329F36697C91CBB1F9E42DA59A654462BF19E04352192778CB050DB6F4A656F6AB0BD9641CA8CE6C1EF8B020A3D9FD9DFF772F38926458BDA6E6072456E506AE464785399AD7B498AFD4C211F09D0C722FBD9E20890CDDC8C6EB9EE75390E6D76D0672FA64D8B97C65CCA46DD1F542B6D6014F035D2817C4B9430AC8DC318CF8642AB34F4C8D71FC0E3B1FC961E94B6A84622876250FDC21987777360784D9A58F35E1C9B71F30561ED6854EE9B112E7B20CE064272213BD1A46D0D19E5EFAFAAC7ADDF4D7B7A519D689398EAF1E67E64ACE8E5E89756377E1FE458D04E3DF7F6680F8B69815680276ACDBEE6C8E1AA909EC56994F3EF3B65FBEFDBC29AEB0EA906274E838CAC36A0607716FBC2B8DA6150A4EF39E1CD9CCA72915007723C5D2442F7133258234D18A257DA2C13E53B47DC6ABC2D607B98E351FCECEE8BA8886821985BB3A7BD02429ECDC5A27EB04D01DADCE88A324AE44F567593FBF730C284414056FA33CE90A6D6F146DBB1635BD26B4F883D4948DA47216C70D2AA58CEB3979523C6A4F2F7EA455A97C7ADB6C43685D63BD4C51D7DDCB81A06B9BAC31A7B255B94052D686128D234BCB63CE713028451B18B981B83DA1246281FC3BD2B06C741CF71979DAEFDFA0FD06FBA3722FF7BCB2821FBA964FBE9F6467FE583C06D3889A40360A7AA03358175EE75EB8FD1D3368C30B5691776C163764DB924FBA2362CC9572F642CDD2B11B40FA2683A529EC2100DEDEDEAA70A1E639A71D6A96AD31F70A00FB63875D0FD5C21E56AE57B6E74EECD2EF34BB3E20BE5A1F9F1F54955A18B4E4E4B9119973DEB76A2A603FB6410A350667ECE5C1C147DD00B07A88A7D0E86AA2D747A867AD90BA6660C7A0432E20849EF642A20CF5A20AF7E34D139B39DD65C65B36750F17F0B9F1DB06CC6E16F10EB289F567B647454A581604F381D66371238AB785585A4DA2D00810EF6851A6009025FCADFB77FF7996BA6B091FE4130733466B29FED46554FEBC2AD291DD966BEF4D79A9E04014D3003C95696E8BC39892AD32DB6D6AD22D33E931BC87F78114BBBD97B334BCEA676F9E9DB23C0485EC06D8F37F070C143117B1BEA49F06E1A2423D98C12883D32D29103F7699646E7091D393B21A260703E17380A1BD85452702C3AF7DF73AE7856A1C066013014DE62C3C817DD74C44AA436A71490E7BDC6B8B74BF61711FDCC541AD7DC49CF4C3EC154879E048FF30DF25065B5641367CBD3BBA19606A9A27A64055D5D3B538FC88EDA66FF9F26E619DCBA696866DE54A8DC8580B5B28144F952FFC6DC543E98CC9FD7F4538135C0F4DEB4BF892266DCC48A4D1DDCF407BE4FDF2A5AFE4A0105A20CE2B3D9F48D608DE2315240875F1FED696C49CD8D4A78AD26F51B3C804949C536CE35C3963DC1D238516B3F2D297F5C9939A946A0170E185C75087F37ACF907F9E3F87A2B15CF81C7ECBF2165F0F3962D11E9C6A7845ECEF432CE9E1FBE74C77EA1057D79CB595D47A8DDC1D911C6B97AF76D91F3515081B95CED16275DECDEDCED9AC790D73739E35973834503133510DBE39201F9B5C618231184B9DBAFAA7ED6623E8BC492170812444DB62D4F01925DC4F821C0896A746B4453E93EE51844B311B0A0A51601477BFF651EB5EE331227A2E9E49F593EB2988E449E750E990A8A89906EFAB00E0955C81B6AEB160313007B481C40908130597626935389E47AFCB0A20146F0C7B29B567E95D59CED7FA8023A2D69C89443A11E7150A03D09EE6B0F74358141D48E9BCAA3EE081C7D8F8C223F4D48EFB3DF8A4E287FC5B90B4FD251CB616687ED09AB1A06C42EB9D6A578D72E99D499882D216DDB3F35B0A33D9F2D3D4A700161A5C3B5A6729F197479E78009794AA1BE3C25E0B9142613AD2EA508ACAEF5EEE33DACF60CB7A16AB38D9F3CAFD2150081B63A3A6CA0163A25FE81206A37A0874FD55FA3068B4C1B25E6325FA56646EE5F3431D33D0BC691C134AB306B0BD2D1087F4D898A529DAE08B97683FE2EB8ABC9095D67B79CFF0E77404C1F7FF316C3CECBAB77C710FBF961008047AF22805D77EFF79F815B21D142F517DA2199F6627AD9FD85AA24E9B7F40C7796207A82901C7B5A3A42369A9BCEBC24ECE13A3ED064E4E748BEE2890BB21B8E4845362BE9AEE46E25418F7CA38ED087E46E24F12012A1312BC623AABA6ED227CEF116A3C2130B4B837AC77D86F8CA3553BA0CF5AD45E9B4E4E55059F1D4675291581D7CC9E5839212AFCFA897E90CB601CB33A4D2241A5ED5925F6416BE5A43D4767FA04F701076AD5ED5ECE2D09B8DAF11B00FEDD2AA2E748CBCBE365031394EF823951EBC52B3E4C79D79234C16575910C29A35EB67C624F7504EECA3921F461D7F95EEE39638C402481DF7B59310C4554450789DFB28ED1E485C0018512EB05F14DC7A3DB5C0606F9E28420D76B8F8534D2AE31AA01E90A20E248A7FB3B72EA859031C67F7B2B043D38F7183165A42AB28C6308608C530A9CA98F82C133BBC313FDDD2109838E970DC9989EC14DF781A518F6CB56DBEDFC1E381250C64F95D0BE5F37515437673425374D44811F4406EE2B5130334BA555839E61AE623D283C77247D2EF8B22ED138A526F7E41DFD41FC69A2839B77B51C6FD96D97D3EF8359E8725BA1AFA80278FB3BA9C697F7E2BBCC5D3F0F2E61BFCF542D3160EDE02CD6295FCC55865E7890342572499347DF80EC073A91E00193BAF804B884E9CF5C43269824D4CAF7EEF49FABD8BDC5496D190263C96DBCD287681C19B90C34635FFBDFEAFE0601BBB7514FD84896A22895E9B21FAEEA372696E350F13959FC23533F3E8C34B17B595F3C935E37220AAF644F3A565114C34C7B85F1A3E465470166A62B13ADB00A2BCD5A9A3ECD59FB772F09DD6A6E2AD12FD54EC62CFACE0022F2FFE3EB62DB0F4D0F0F9D1FD6F3F11D76DA868D2C1C4124915DE19EACFFCDB31F7CA018B6976260CA1BB2C4FCD6B9958F096313B608E208D875EA5A1FA89916D0367EDC4F8890E93F1E660AFF16EA79D1E583007E693BF06C172105B3DC24117DD921FB60D3AC0D2E5C89FEF17087D885A0794E496E3CBEA333CF72A507788EFE - -count = 68 -seed = DE9E2742591A5AF6A6153DA85A510C39FD31A2ACD8A8511F190A9A5E5753E63D9801A8019508E67DEB1E9219CC18BA3A -mlen = 2277 -msg = 8337940EE74590EB25E52E78E8563A09CD2D45F650F48775E3E61F9E3509CC8EB7E983310D0185359F66BD80E0DA1E45A6BEB53ACEBB9030E310E81A576D0F80C64FCE1D1FD77DCA27B7C6E02B0CC26EDBF496AD2E3CE8484E988E56BB28153587D7ECB02FD8882545E7BF79CC9966A7FEDE93F7E9451BC48FDBB481673D1C4135F95D68F40F4B4F847345A320FB4D736BF5F9FD347435462DD3A238E4C799E7CEE081107E11682C7B558B19177522427F1D269FAD81B565BE538E8FF2D7193579AEE51E50974BDC0B66331B59BF496C87E4F6E143754076DB516C9C538410FB38A930CB5BA1E6610441126D01C8EB5F34E2E58424B8B218D9E68C5D8B4F5258EEF07EE0AA5475A72CCF363D47D825FA524C16C7B7587C44864DA9E4B267F738B87F7E5701147F550CD38774B17DE48E6969A0DEDF334FA67470419059C4D1607880CB12FA9C0ED23032C7E0F325169EACE7DACCDD4C2E5097FBBA859970D7EAC4522C1FEA043C9278C1C89FCCE95203033B4CEA4F9F24B55BA6B79EF88F275310C6E48189EFC1EEEDAB66B56B6BB028726BC463D93D742492841E85D5C837948978D0FADD1C172F8859C802C6BE8394A05DADA7546EE1CC5BB909D3189088F4FA6D07C573ED7263C081720E701D5D4B027AE54BE175536F3BD5E91993CC040311A7D352AA26414CAE30D10408DDB44E8C9513F4619E99EDC894F963489876B24BB0B91BDC3EE5B78AC0D4046B2E864789C0C779E5AF97F8F84F09A26FF74B8BCDE66C007970830B70C2A1122DC9845905C3AA7810B40641E8BBB398A23BBEF52BEDABEC7BB54823E64177A73786992DD67D5C007D770938402EFBCB3A60281C5706920A9EEE4C26C0B251C32B9E1936FDEC2928110959E99255508250FD5BA84B4FB314187124072D30FBF2163D36F1480ECC08F7FB8093BFAA72F1914C63533EBB3A57420DC38DC93DD6AE4D197FAB790C1EFC1B7A2234522E0B408D0648C7AE782F2F08CB70B96CD76B5089AF1EF4BA3A4C2FAAC363A4DC1C6C421F6AE1E9B67461EB02F36C25E763F1A2B73CEED4DCEDDCE619CB313D124CE6F7AC986D6BC344E630F22CB654C1286FBC0EE01C968DADD1EDAD744C8BC828CF5F316336A5883166ED000FF98D6CE2CEAE7D3E40BBC5714F71BA9E25E1506D644FB2DE2FE190D327ACCCA79D9B6D9DB505CF1853E98F30E9BA5E568ED83E2567C936A64420C5D8F07AC4F65F38C28E88DD7B5209A600AEB81A6D2AFA4FAAEFDAFD9B7FD3AD7F49462CD577204184F9D44A45E2A909373CED24EC0EE56BF2E6675C506EDA67B1E6DAB75CBF1822E20E7A8A81A7729B42A6D67A1DD457FCD19B62F048AB97B3D694254E5C051FD2DAF3D12AD627EC37C22117BDEE9EAA290D11D56BAFF0DE1037EBA908FA03E2F869FA2B27936669306E8E70A0A4910A123F202797BF1C8FE47178BB1E8E8D7AB1C01F30F5E779B2BC99902DF15185FED4C865997AB72254162D00858E0908EA95A9ACD0FCE72E571C7A381CC33E06A27FE6A5922775EE82C973CC3CA8A05717608F8703946C9A89854D627744DA475DEFC1390DC44FCC3A23C47AA8AF17240EB1A1A00A062D258D471F31333D0356243DC1CECFC559378B4395F01A970EA4074D5666B44D49EF291ED15930DADA66765B165CB8331CFE549C38CD0672F534BE60F4D9B4C125FFE747670513B5744676899B256B992E15106B99B794DB3950582816612144649210751F3D0DFD5B25CD393E724F7FDEF00756D0C8540E8891E592507599B06EDFA6EBFE543084AC81858F5EB02D8F5EB8A72184851E8589A3AC6DFE1CDCF286723FC4C1202765FA4F783EE58C627ED494C7149BCA6A4DDB420827CDCA82DC42515BEAF46CE9D9ED524BD00EBD3094F770B1E1DD09FC431E4C244D2305619DAE208E65EF385EA92F5A79F12B99AFDAEA79C9D8D319944AC6CBBE3F1290EC6B87D97785E059E6871FDF239BC404021CB52064B88EB4CB3FB6A871B0F76C12D7B8C5E8FE0A65024AB5B25F4C67B6D15C22B0005B754CF7CBEC898B49F4326F1AE4034E5F5A446A96CE08083D48525A3661E10C996DD22DC34FE570A4C8817D10D750FC5C2ED0C24C7CBCBA5CD1B2680DBAA3315FBF2BA7457ABEEDC96B5D111110D4678EA5C7851D25F258926B0B028365799E940A6E17BB03CB332FBC6D713DEA7108FC6268C8D33E7A578C94FF75BE808C15FF7884F092C0E309F1AF99B1A7314FA0F32C8D8E32B3E9D92C9C8FF6B8FBB99111529C4BE3A2A4F62884373D0903180B4DEABE613DE5CF19415DFBA7F9A46297AE2F21D7EA420B41F628FD8DEBA55207606539D11791623CB325F1E18C98AAC27283BFAB2408F4FD6CC58EC9E306643BA1C0C77D84B3930263E5A76A1CE94F3D7721F0098D54E6C990C3AFF69B6A0D82C853EA2AF2D3D2B3E96DAD59FF873171B55D16CA9A7C68DAD2E918174D264919DDCB4B9D01CE622D56C599BF60711C74315C918A7BB97B9513937AFB6A652DA68B6B0B34E316D7BE9F5C282A5E8773C892782EFF220667A6A54069C37B88EB1CE676AAECF2015E59FB7AF4D30C4625DD8DE4805F505E83C877CD61D2A0BA65B32B0DBDFBACFC88CA43E4DDF7A1A4517DCE83B7B8ACF8DCAAD28284039747935865DAF8DCFCA29FB676CE2EBA2C509CD75588FA5E58CEFD0694626C9BB31C3AFC372ED313C9BB3ADC398E89DBDB108DDA63F9380EBF9DA17B378451634682F9823E209BF10E39F884ED270413152025CDBF4875C121B1E83E12C044453FFDA6D8CA2C240AD522577C6898AB6F2ABE1FE77F860939408CD193E605F87FF2248FA163AC2FC0F39BFC38503B23F5441E0E364CAAAB890073266B3B51217661F5DF41C0BA925BB425AB3DD7B6A3675B7D60D0290131EAD53A4EAB0C66BAA83F2FB77E74C3C123ABA7731A3F62FAB8EAB2A96E8BBC911E501CD23A088E7887A469284E0B5C27B5CBC1DE2B6938CF1AF58A47FE78141306CB76E8F2B73620BC4549DB6826D2D72873885F6C5311EB5B9462BB4631D314DFB9C836C6F4D9EEC6818940C04689CC4D8D11ED9869355617861340E722B2BE78197746E2759AAA8D68D1965888E89B6B0F5BF51F94E586B2CB8708F4CDB520BF31DDCCFB7CB69E29A7AE8AAB12C11F431DE40FB9E82EB5F2B6BA1F9757F1487B63255FA69A755601C2FE17CD1892D5A6799C35D05098DC133BDD71318667D47C4671 -pk = 91DB9D6DD1FD35BC3786584BC0767ED0BAD4B4A9B280968D7AD0665710273EAC33B0B25A22C8AAF50CEB053FE6A27601017E56ABBEA7B8635DA5A08098DBD9456728E26E86C7FB3F3875F4EF438A4DDDE76D0F512359EC3FB0DB45619677E102 -sk = 91DB9D6DD1FD35BC3786584BC0767ED0BAD4B4A9B280968D7AD0665710273EAC33B0B25A22C8AAF50CEB053FE6A27601017E56ABBEA7B8635DA5A08098DBD9456728E26E86C7FB3F3875F4EF438A4DDDE76D0F512359EC3FB0DB45619677E102020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018E80D254B49F164B2E27BC5FF544EEC311F40FD97B55D94489267913E6A4B8924ED4293BCC73BF8C92C59944CF827548A4EB068E594307557ADE845E1A23A98FDB12B00000000000000438F625D1B28600D2C21E8E5CD6FB8743EB7D6B8E97B0B156DA6C2D8FF273FA71418F77AE12520BA9DC00319FCCD3C28592A887610BC45C08BC77A84CC3AA50F4A9BF4FFFFFFFFFFFFFFDDCF4834835EEE4C8C5A23DC57D1F115C88576B3128127EE3D8B5C92734CDC1C93742343916F2055280C9F000000000000000000000000000000000000000000000000000000000000003096C35462A0473A1E53B9D6C8DFDADE91D728B6C98B0386F3A93D1E816F07EFFF2E9EAE0BE39FD5662E80FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6759CCBADE9E54476067086A65C80D7ECED365AD23B50A1D94E55E5F8D9F5AEDE0CD01C871C0353F2A29EF0D4F8886010ED616D025CC91E5E770B9E71F8221BC0331F3CEC9308905A4DC2BEF04EB713DDA5674DE23EC858E9B00532F14D42B03A95DACF7BBEDD20CC2736CFF699AAEF6715B83D58730BA3184D25DF984FA47D77B845EEC9EA30ACAC0E88D582F215700026FD143947DD712EDFC6085995594EDAC3C3AFF1D2D995531BA4B7B01774DCE45104EFA09757AD1DCC999A4EE13B1028467C4974EF47BF835D41AB5B211908650848685C2A1C356AA94C930ABD4169FE493FF2C32E22039E557CB748B427A0309109C2A6DD32E1C0B8A0C3A327AEC590170069B372FA6412B1DC42899BE822729F5FA909F01272AB9135C631446D101813E07EA38F70F2AD85DBD7E80B55EF142293D97D58BD517506214B7D62043F36A31CC1E2E02308A6DD3EB76EDF347033E380E22EDADDD82E7BE1E3D3FD152DCC299D84542C2EB4E7D591DF1AC0C6B36B13D27ADDECDE083421FE0E5B5206600C1BE53A5FE9767FC84F57EEA8641CFB19F0F85DE3ED09FE93EA3A2D649B1BB913838D55A14B51680E1F12DBA9F5A130036923D47C6802B15767585243F94A9656F96B221B086F76061DE7BFA496A0C2561DD2ED18AA6BBD20A74916FE33F5C0395F4B6A7D7FF790364C134206C01405DEFEF58FD07622636A018307269483548F69E8C52FA9BCE0B0D882E8998A5CD03B19A9AA51AC678303C17179B623A9A3D2155C0CA82A3F74F720D4FEC6459C8D9F3FC9569D058B3BC40366FD589AC6D00E627E5E2A8C2045D841EA5B780F5646C8F0FAB6C7FCFF190A0AD14EF53AB95E8FBF8D5AF9F5B88565E7B32B146EF67022D84DA0DDFF88661A8C800484D67AD4A75F52C45F6331457E0A0447916B4DC22A1E86C9EBD3A4A144672F54B8FC68203 -smlen = 2540 -sm = 4D0532D1AD2B6A6DA24798E40025F481A067967EB49F85695200F264B1B3EF5D838F3DCA76D500DA5F65C14BEEC616D959526D015D7B30C409D9EFBDF184FF9B009512513F0EF3CC6319718DCE00C9F99900F8D2E0082FF91580008C0FB2E6C3401AF5D6053E810023A059960C1989A33429001A003EA41F425A1B411B5BD7478100EFF959D20053E8715DED223300690160A8A363B96A2CAF075F002BB9909CB97AC8D83FDECC7B015F04B1EFCD3B53A71FBD856A001F5C2B2C7A59D85FC49B5A0400B9C975B33F61C7497594C87401017B8DDAED747A9BE6A0BDD8F3E2D6440A1CBF8963FA58E2732D1903FE40ECB0EB97F7163C6C65C3015F19762D66520F652521876EF5068337940EE74590EB25E52E78E8563A09CD2D45F650F48775E3E61F9E3509CC8EB7E983310D0185359F66BD80E0DA1E45A6BEB53ACEBB9030E310E81A576D0F80C64FCE1D1FD77DCA27B7C6E02B0CC26EDBF496AD2E3CE8484E988E56BB28153587D7ECB02FD8882545E7BF79CC9966A7FEDE93F7E9451BC48FDBB481673D1C4135F95D68F40F4B4F847345A320FB4D736BF5F9FD347435462DD3A238E4C799E7CEE081107E11682C7B558B19177522427F1D269FAD81B565BE538E8FF2D7193579AEE51E50974BDC0B66331B59BF496C87E4F6E143754076DB516C9C538410FB38A930CB5BA1E6610441126D01C8EB5F34E2E58424B8B218D9E68C5D8B4F5258EEF07EE0AA5475A72CCF363D47D825FA524C16C7B7587C44864DA9E4B267F738B87F7E5701147F550CD38774B17DE48E6969A0DEDF334FA67470419059C4D1607880CB12FA9C0ED23032C7E0F325169EACE7DACCDD4C2E5097FBBA859970D7EAC4522C1FEA043C9278C1C89FCCE95203033B4CEA4F9F24B55BA6B79EF88F275310C6E48189EFC1EEEDAB66B56B6BB028726BC463D93D742492841E85D5C837948978D0FADD1C172F8859C802C6BE8394A05DADA7546EE1CC5BB909D3189088F4FA6D07C573ED7263C081720E701D5D4B027AE54BE175536F3BD5E91993CC040311A7D352AA26414CAE30D10408DDB44E8C9513F4619E99EDC894F963489876B24BB0B91BDC3EE5B78AC0D4046B2E864789C0C779E5AF97F8F84F09A26FF74B8BCDE66C007970830B70C2A1122DC9845905C3AA7810B40641E8BBB398A23BBEF52BEDABEC7BB54823E64177A73786992DD67D5C007D770938402EFBCB3A60281C5706920A9EEE4C26C0B251C32B9E1936FDEC2928110959E99255508250FD5BA84B4FB314187124072D30FBF2163D36F1480ECC08F7FB8093BFAA72F1914C63533EBB3A57420DC38DC93DD6AE4D197FAB790C1EFC1B7A2234522E0B408D0648C7AE782F2F08CB70B96CD76B5089AF1EF4BA3A4C2FAAC363A4DC1C6C421F6AE1E9B67461EB02F36C25E763F1A2B73CEED4DCEDDCE619CB313D124CE6F7AC986D6BC344E630F22CB654C1286FBC0EE01C968DADD1EDAD744C8BC828CF5F316336A5883166ED000FF98D6CE2CEAE7D3E40BBC5714F71BA9E25E1506D644FB2DE2FE190D327ACCCA79D9B6D9DB505CF1853E98F30E9BA5E568ED83E2567C936A64420C5D8F07AC4F65F38C28E88DD7B5209A600AEB81A6D2AFA4FAAEFDAFD9B7FD3AD7F49462CD577204184F9D44A45E2A909373CED24EC0EE56BF2E6675C506EDA67B1E6DAB75CBF1822E20E7A8A81A7729B42A6D67A1DD457FCD19B62F048AB97B3D694254E5C051FD2DAF3D12AD627EC37C22117BDEE9EAA290D11D56BAFF0DE1037EBA908FA03E2F869FA2B27936669306E8E70A0A4910A123F202797BF1C8FE47178BB1E8E8D7AB1C01F30F5E779B2BC99902DF15185FED4C865997AB72254162D00858E0908EA95A9ACD0FCE72E571C7A381CC33E06A27FE6A5922775EE82C973CC3CA8A05717608F8703946C9A89854D627744DA475DEFC1390DC44FCC3A23C47AA8AF17240EB1A1A00A062D258D471F31333D0356243DC1CECFC559378B4395F01A970EA4074D5666B44D49EF291ED15930DADA66765B165CB8331CFE549C38CD0672F534BE60F4D9B4C125FFE747670513B5744676899B256B992E15106B99B794DB3950582816612144649210751F3D0DFD5B25CD393E724F7FDEF00756D0C8540E8891E592507599B06EDFA6EBFE543084AC81858F5EB02D8F5EB8A72184851E8589A3AC6DFE1CDCF286723FC4C1202765FA4F783EE58C627ED494C7149BCA6A4DDB420827CDCA82DC42515BEAF46CE9D9ED524BD00EBD3094F770B1E1DD09FC431E4C244D2305619DAE208E65EF385EA92F5A79F12B99AFDAEA79C9D8D319944AC6CBBE3F1290EC6B87D97785E059E6871FDF239BC404021CB52064B88EB4CB3FB6A871B0F76C12D7B8C5E8FE0A65024AB5B25F4C67B6D15C22B0005B754CF7CBEC898B49F4326F1AE4034E5F5A446A96CE08083D48525A3661E10C996DD22DC34FE570A4C8817D10D750FC5C2ED0C24C7CBCBA5CD1B2680DBAA3315FBF2BA7457ABEEDC96B5D111110D4678EA5C7851D25F258926B0B028365799E940A6E17BB03CB332FBC6D713DEA7108FC6268C8D33E7A578C94FF75BE808C15FF7884F092C0E309F1AF99B1A7314FA0F32C8D8E32B3E9D92C9C8FF6B8FBB99111529C4BE3A2A4F62884373D0903180B4DEABE613DE5CF19415DFBA7F9A46297AE2F21D7EA420B41F628FD8DEBA55207606539D11791623CB325F1E18C98AAC27283BFAB2408F4FD6CC58EC9E306643BA1C0C77D84B3930263E5A76A1CE94F3D7721F0098D54E6C990C3AFF69B6A0D82C853EA2AF2D3D2B3E96DAD59FF873171B55D16CA9A7C68DAD2E918174D264919DDCB4B9D01CE622D56C599BF60711C74315C918A7BB97B9513937AFB6A652DA68B6B0B34E316D7BE9F5C282A5E8773C892782EFF220667A6A54069C37B88EB1CE676AAECF2015E59FB7AF4D30C4625DD8DE4805F505E83C877CD61D2A0BA65B32B0DBDFBACFC88CA43E4DDF7A1A4517DCE83B7B8ACF8DCAAD28284039747935865DAF8DCFCA29FB676CE2EBA2C509CD75588FA5E58CEFD0694626C9BB31C3AFC372ED313C9BB3ADC398E89DBDB108DDA63F9380EBF9DA17B378451634682F9823E209BF10E39F884ED270413152025CDBF4875C121B1E83E12C044453FFDA6D8CA2C240AD522577C6898AB6F2ABE1FE77F860939408CD193E605F87FF2248FA163AC2FC0F39BFC38503B23F5441E0E364CAAAB890073266B3B51217661F5DF41C0BA925BB425AB3DD7B6A3675B7D60D0290131EAD53A4EAB0C66BAA83F2FB77E74C3C123ABA7731A3F62FAB8EAB2A96E8BBC911E501CD23A088E7887A469284E0B5C27B5CBC1DE2B6938CF1AF58A47FE78141306CB76E8F2B73620BC4549DB6826D2D72873885F6C5311EB5B9462BB4631D314DFB9C836C6F4D9EEC6818940C04689CC4D8D11ED9869355617861340E722B2BE78197746E2759AAA8D68D1965888E89B6B0F5BF51F94E586B2CB8708F4CDB520BF31DDCCFB7CB69E29A7AE8AAB12C11F431DE40FB9E82EB5F2B6BA1F9757F1487B63255FA69A755601C2FE17CD1892D5A6799C35D05098DC133BDD71318667D47C4671 - -count = 69 -seed = 272E459EAB6A0BDF720E4C5B79E641C95BAB66C3CEE261D0E3596BB04D232ACE0A1CE24BACCAAE9037665A962C711B08 -mlen = 2310 -msg = 62215248E1F3AFB19849F758D742F8AFAB595040C4DC520D603C9A80FA9CF2E97E4F4BD7350551FB667D606BDC31A45D88836CD376785C01F9007D47DF95C1F4D1E30A927A13525409D91C9F5145C0B86D3B44E933CA81E4ED9559AC17940C61EB85B2D26D2C47924AB80ACBAA3D9B1C8855C13EE45F5C8047C161AAA5321839A01783B21A5EE90CF91B8285C4779465B7A89DE3D74D482080F68EB2D8B47429D5475356C50A92B3ACBDEA5786F4D6C2A304AB500490F84FD1D0F21ACBEA325D62D2657F3889B6F591A7F63D8633C061CB14B8266A7FE17642DEDF1D08D9FFE369126CD780D9F99FC6262B5BEFCFEF35D33498CB2CFFE55F2F8D567EA8687DFC6E7D49A61FDBFE768C1D11BF5B3B18CA52225B096490C97CB9A0B3B2CA0762DCC36B60F7D26FCAA4E38B1F3A6279D889323010D9CB0A97FC488E09B06237E6EB0166465C2CBC2B9CD06F155759B6C93CA0CD3178845E0F3A2D20A68757AAF3C4E74545494462CCF28F6F51EC0FDFF4F1E6D98FC5B63BFF068FA7BE1764BCF14497E71E424C9389C5DCF8C5CE1DCD40B82F1D75C3C3970DA433A92A04DE958766AC5EB3645F4D21882F7071383AF8DFFD6CDD91B549F143DCF59FED6674441EEB03D5013E90ADCCBD7E3DA115535AC855DBAAB7F51D70630DC00009E726A16DEADB12047D85906CFF315C73EE7D4E24C9067E3B772F3DCC44C25C7CB8622FDD7B8ECF5E9C877838D71D500F864A662619B1478F8AB4DB2DD09A111ACC99ABE737DDBCA06E88926C4E73B5F5D21EAFC4B11938FEEEA5F8D5A4C616A342B54C9CE371817AA2409A55A3237BE85A50F05B33D35AA86A62E85A01CF34EE7DC840A26FA1B8C6B307817C062D9A2E7163A3B036874D2ABF6531A772D4031FDCD59CA79FBF442CB9155F90148DC3B723778E699C6985634185C3FFDB966ADB80A3D1308150B12964142498466506BC0742783C27BD3472A5CB45021DE066C28143FFBC82B5742BE51E93BCFDE1A61E661B730D8760E108B80C859E4B3A07D483A6A8967E5F01B03EC8B63A20C6A03755C75F419558878A5EB8BB0B2120F183E4BECD4A104EB4DB62CACF5F9964583815334A25BDB75724E549211699AC3BC9B2B5F58F1FB33429905DF81C9422F8B84E95A7C36DEC6AE9B48D4F502D8AB59B69E9D112693578D143A3F111EF00844303950F65DDEEA6E30F1286DE16546F90C4364A5C09755AF3FECB13983C418B2FE4AC17BDDA57E4D597E8BDCCBFBE4082C446FC920E5145BBAFC67FADD9799CD8C7714510DA579516ED39B3E22DE319977FC77A9CA61AE8252795D11724AAA866C1FFDBCBC1FF91AF1B8713248864A4E8B9C59DD12863245F5048110DEDE7FE31FF9836715886C37E9642DBD6C668BA7AB8C2B706CDD58586EB7227B5768C3509C1F66493468859E275700EA38BA69064179F6036D7B50BD232B61C9B9659492894C0057DBFB80329A76CDC57B2A89BBB910483301CA0BF6AEC7D5DDF86644FF52F48FF6C7CD00406CACBC09AA251708BAF3276A52BE2C7B42FB6A9036C318529CA98940769A67DCD532C0000AFB5FC63AD2303E94E09D2CB40CCBE47FAA1DD22ECF528179AD40FD4BFD43717864149243D61CA255344C52743200ED8385A7CA6CCA24CF967D23D07DC2A3F9AD5F3240F4F022A6C6CD281B6C492E8D144A2F4641957ECC65B32C9F74BB468524FF58F0F3DA2F5A56742896CC8F99088574264F857DC67CF04C4B63C6A08FC534229CA8BA616CD504F969EA6E3C98A517355F98A9E884062805B77623239074206E01AD2F3FC9FE9FF8254A5D3525C3B2F0A692803500C967A2E18511EF5B8845DC4B0DEE9338C38C4B1B8B84EE63923250EB6F9E9C272617C7895BD538A6F34D3557812BBBFAB2B8FA6EB5E95B9BCE33AD3185CD90DD536A68639022C079B5CA7748864D37D45FA6780A45AA991F28BC0D3BF371EE2FF0C913CEA6DB38E4A278A4840EA1F255F8E83B6B6C5E260A49D727AA42095A88CB8120B51DAFD764E690102F7FA07CEA2EB86AC613E7BE2F498F5767B622D04E8A6F272976FB058C3334CF8CAAD1D180E3456C210763C974E431CBC3E25EAD8B9FF9243628D5B08D92CBF1D5DF29A85B1A04D2999B3C669227B33610121D543CF4A978F8D9365C0FF8AFFA92B07FC8C8604A0F357F3C669445685B6A29898301A5AFBE10ACE8D64A47009C8741D7CE82E9900643900A3B92A26FE5F24886C06AE0918C3F2523C320699C799CBF72F0DDB08A0F1F63D6DC2F021C78A9D44503209190EE4BE654663679CFD292292D71FC4BA6233A196EF9E95CB965852773404B2622B565BD91FCA6747AAF7F4EADED7BD3BB53645381B687AE04B8D8A9BEF1095EEB39A0BEB4EA89BADB4655A1AFC7EECB7DA0D670C192297CCE0B31BBEFEBFE94C84603BA8C0B7CC73159FF59C01A037CF2C866DC40D88432CD6C2F1989351A4E41343CACF7BF2C2B395C863709D6EC1DBAB2AF514CC771DF14DF095DEA8284BE2B65097D8E6F72EF3936595384AFC0026956E819F1657C901B92644E9D6D32D0D95549729B2CB3D5EFAC9C42A5F284ABC3BF5CCA5B08161B09D9A48FFB2996C3D4383D65B8D1F7FC3248CBE84B9C05464F4A76EFA005FEC342EDD56959CD26CB0DAE1B61B0493A4B68EB3D6335BBC280508F09D84E0C5F4EF520D92CD34D69E5BAB76DF5D2B72CB41A298D370EBEEFCD6C1904B956458BDA581EFA6B3654BE402AC3A971603F23F2B543C5BEEDA5F018543B72C146CF04680BCEA31B4A238460329E2BC12F14C804FDA3494C15452223D2477C9C8A497D04EAAE7DE09D7D7A879D3A5DBA565AE1A38F15E69C18838C487C0FBAD44A068C42EFB7D3F5EF488F91C42F25AC564751F0EFE0ECE7D98BB1B3D0FC42C9756F4B8F9DAF1FD0D414391155285C8DAEAAF380BD07E43570F14E9A47A87BC733F1E676233F17BFB71AAE464AED68487392D339AE064AE27BD57F8695F493AE56CA96C0615BDA8DA37133DD13C2B21DA189A7329773FD8D51381BC118645440B28FA4F402EF84C4091D3A0BC4D206BDCF9007F5DE9AA1E6CF7F6058AC6B69FBC703E908C4221F9065147766E48F54BE4B076406E2F9ED19C1BE982E636FD02DC26267C3ED989E6AD1CCE62E7B988FA7C1831E5126111A4C3C29C38A1F96CCB3A04132175FA46F73C634AC6EC741B135645ABF1DCEA18571CF9A539F5CC935BC6D32BEB1C7B8B3B5A141146EBC12DBBCC17BB4900CF0B95EBFAA52190AFC6D8933CAFC9 -pk = BE8B21FA9B3886AF0FE48629AF70E574B3A4FF1BACCAD7CB0B58FC975520D8A42553380F4278A03B9298195BF9B1A2003D3F993D25FEBA60F04EB4C276ECDCCA0F78987C4DEB8C228D706EAAC4F482F419705AD08FC1B5D2A582E05369BB5C00 -sk = BE8B21FA9B3886AF0FE48629AF70E574B3A4FF1BACCAD7CB0B58FC975520D8A42553380F4278A03B9298195BF9B1A2003D3F993D25FEBA60F04EB4C276ECDCCA0F78987C4DEB8C228D706EAAC4F482F419705AD08FC1B5D2A582E05369BB5C0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001E4446F4B4F36EA3BD5268696050684DDD8518A2C07F7A258BE8E9FD90E40C6295A548D757574343C34F2953BFDD10E788E63B863A4AF57036C730A16D4D3EF91691FBFFFFFFFFFFFFFF076F7A81DD961C3EBDC540892B9C9982F9FF74E1516BF5FFD120E947C2BA4C49DD2888DFFD2D5F985E7177340CE65304E8D00A3783CB2D655ED7811DF83480AB168EDBFFFFFFFFFFFFFFC787FAC41F234DCD8A8F7E2DF3E8D48A6573F6A62AB480E8055C6FE47498873030F2850BA2589A3262EFABFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF421E06DD0C403AC6277F57D5F02C42AB528A43770C5F2FB847075D2A378430749388B947A9E1C24D53DA0B00000000000000000000000000000000000000000000000000000000000000C00F019B4B40429C6B371938B2D256D7DAE4DA8FB83B0D7903A6A1A737575174AB2B9FDBE0842237E2067234F78B2F01ECBC710B69C27725B54E127C5C8BF432B67A8D5D9A3AC6D390208EF8C53597F12E100BBA068B666915C92247DA994402F657425455F893A588D25CB79DB937AFECA3D928EA159D3CA7BD0EEF403A09713CD1D677908A41C8E583ECDBDF5B4E006C00A4CF5FA57CF2ADA9B5F549C55685745594068A1AEE1AA45E8D26E8992C1E95D811820D228FED6380BF392D2B640107484639F6291929DE7A4CBC5FC1F28B6AEFBFBA9BCD9DF06F81D9871D25FCCCF00AD8E06B188F21A035DDFB3CDFCB01E27636725227AD716558A61AE92C22C9AB901DA2851CAE17371BE292FB30CFB92C02A4518EE6AF3B5BA26ECBB4E65E01C14F7B07A3B1AFB526E776A8B4DA24F211307C9B9E39FCFFA95A6848B7FCCB1039FD703B4F6DC40330209E3048833800BCF997CAE0EFCF253747ABDDF7F897C76D323393398A440034DD306223D85E5CB38DA8B85D9ABDF018E53FFE0A803102AA83A0E29FE8F0DA873E46A8992EBCBEA7CBC7DA774DB2A4F77CB96AAB361362F500BF7096061927E01760D34AA25402EF65711CD19AEB075E3B42F70B185609C869C0669EBA6E0E6D7F70A7D016701DF64EEBD3AD6CBB7B9DCBA76A65A57C002A83AF35C7E650275E095B6CB9A15E376E7790892FC77F77F63EF3EFD57FE497A4809420F78694BBEC8759B6C7D4690063618FBEC84B6C37277360E74DC3DB5C480F21FF1F6A3E96BAE7B4CB8049F96ED8DD44E58EDD0FC80B34408F20B92B03ADA146F88E60B00BF015C90B235EE78AF47681B8401E07BE12FCE6C9D8061A5B36FDA9427D85D7243BF19FA1A0EF02007B5A4937790CFA1606E2694BEF710B2BBAAF673114CFD257DF27DD0B96A48E61F3E43A5349089880A2C94A2750901300 -smlen = 2573 -sm = 08DC78EAD31DDBA9CA21667D01B6727A5465109BFD9F54799B011914B464BF1058BB655AEBC400B03BEC4B1479A2408D5ACFF10012724E8111E0E1B29FDCAA8D0080231E8CBE34762E61C8E3900124BB6E33EB0D4506681A7D9701450447E7E3616AEC720C4CAB004146B7FA86B477960D7CAEAE01EB4786CA4119668DE2F5D3EE01C33733CE1405088ECCEC4CFF011B4F1A7193F07D6E39599373007FC215A40444C2898322D2080082079C63167668C4D640862D00278DEB75841215905B00707900C7BA7EAD878DC0A99C18AA84010115F2B17063BD44CD21972B1C696FCEA11828BBF868F79483641103BFB66C3E97B110A6A8A2F8D000105D8DEEAD1A85720B299366F70662215248E1F3AFB19849F758D742F8AFAB595040C4DC520D603C9A80FA9CF2E97E4F4BD7350551FB667D606BDC31A45D88836CD376785C01F9007D47DF95C1F4D1E30A927A13525409D91C9F5145C0B86D3B44E933CA81E4ED9559AC17940C61EB85B2D26D2C47924AB80ACBAA3D9B1C8855C13EE45F5C8047C161AAA5321839A01783B21A5EE90CF91B8285C4779465B7A89DE3D74D482080F68EB2D8B47429D5475356C50A92B3ACBDEA5786F4D6C2A304AB500490F84FD1D0F21ACBEA325D62D2657F3889B6F591A7F63D8633C061CB14B8266A7FE17642DEDF1D08D9FFE369126CD780D9F99FC6262B5BEFCFEF35D33498CB2CFFE55F2F8D567EA8687DFC6E7D49A61FDBFE768C1D11BF5B3B18CA52225B096490C97CB9A0B3B2CA0762DCC36B60F7D26FCAA4E38B1F3A6279D889323010D9CB0A97FC488E09B06237E6EB0166465C2CBC2B9CD06F155759B6C93CA0CD3178845E0F3A2D20A68757AAF3C4E74545494462CCF28F6F51EC0FDFF4F1E6D98FC5B63BFF068FA7BE1764BCF14497E71E424C9389C5DCF8C5CE1DCD40B82F1D75C3C3970DA433A92A04DE958766AC5EB3645F4D21882F7071383AF8DFFD6CDD91B549F143DCF59FED6674441EEB03D5013E90ADCCBD7E3DA115535AC855DBAAB7F51D70630DC00009E726A16DEADB12047D85906CFF315C73EE7D4E24C9067E3B772F3DCC44C25C7CB8622FDD7B8ECF5E9C877838D71D500F864A662619B1478F8AB4DB2DD09A111ACC99ABE737DDBCA06E88926C4E73B5F5D21EAFC4B11938FEEEA5F8D5A4C616A342B54C9CE371817AA2409A55A3237BE85A50F05B33D35AA86A62E85A01CF34EE7DC840A26FA1B8C6B307817C062D9A2E7163A3B036874D2ABF6531A772D4031FDCD59CA79FBF442CB9155F90148DC3B723778E699C6985634185C3FFDB966ADB80A3D1308150B12964142498466506BC0742783C27BD3472A5CB45021DE066C28143FFBC82B5742BE51E93BCFDE1A61E661B730D8760E108B80C859E4B3A07D483A6A8967E5F01B03EC8B63A20C6A03755C75F419558878A5EB8BB0B2120F183E4BECD4A104EB4DB62CACF5F9964583815334A25BDB75724E549211699AC3BC9B2B5F58F1FB33429905DF81C9422F8B84E95A7C36DEC6AE9B48D4F502D8AB59B69E9D112693578D143A3F111EF00844303950F65DDEEA6E30F1286DE16546F90C4364A5C09755AF3FECB13983C418B2FE4AC17BDDA57E4D597E8BDCCBFBE4082C446FC920E5145BBAFC67FADD9799CD8C7714510DA579516ED39B3E22DE319977FC77A9CA61AE8252795D11724AAA866C1FFDBCBC1FF91AF1B8713248864A4E8B9C59DD12863245F5048110DEDE7FE31FF9836715886C37E9642DBD6C668BA7AB8C2B706CDD58586EB7227B5768C3509C1F66493468859E275700EA38BA69064179F6036D7B50BD232B61C9B9659492894C0057DBFB80329A76CDC57B2A89BBB910483301CA0BF6AEC7D5DDF86644FF52F48FF6C7CD00406CACBC09AA251708BAF3276A52BE2C7B42FB6A9036C318529CA98940769A67DCD532C0000AFB5FC63AD2303E94E09D2CB40CCBE47FAA1DD22ECF528179AD40FD4BFD43717864149243D61CA255344C52743200ED8385A7CA6CCA24CF967D23D07DC2A3F9AD5F3240F4F022A6C6CD281B6C492E8D144A2F4641957ECC65B32C9F74BB468524FF58F0F3DA2F5A56742896CC8F99088574264F857DC67CF04C4B63C6A08FC534229CA8BA616CD504F969EA6E3C98A517355F98A9E884062805B77623239074206E01AD2F3FC9FE9FF8254A5D3525C3B2F0A692803500C967A2E18511EF5B8845DC4B0DEE9338C38C4B1B8B84EE63923250EB6F9E9C272617C7895BD538A6F34D3557812BBBFAB2B8FA6EB5E95B9BCE33AD3185CD90DD536A68639022C079B5CA7748864D37D45FA6780A45AA991F28BC0D3BF371EE2FF0C913CEA6DB38E4A278A4840EA1F255F8E83B6B6C5E260A49D727AA42095A88CB8120B51DAFD764E690102F7FA07CEA2EB86AC613E7BE2F498F5767B622D04E8A6F272976FB058C3334CF8CAAD1D180E3456C210763C974E431CBC3E25EAD8B9FF9243628D5B08D92CBF1D5DF29A85B1A04D2999B3C669227B33610121D543CF4A978F8D9365C0FF8AFFA92B07FC8C8604A0F357F3C669445685B6A29898301A5AFBE10ACE8D64A47009C8741D7CE82E9900643900A3B92A26FE5F24886C06AE0918C3F2523C320699C799CBF72F0DDB08A0F1F63D6DC2F021C78A9D44503209190EE4BE654663679CFD292292D71FC4BA6233A196EF9E95CB965852773404B2622B565BD91FCA6747AAF7F4EADED7BD3BB53645381B687AE04B8D8A9BEF1095EEB39A0BEB4EA89BADB4655A1AFC7EECB7DA0D670C192297CCE0B31BBEFEBFE94C84603BA8C0B7CC73159FF59C01A037CF2C866DC40D88432CD6C2F1989351A4E41343CACF7BF2C2B395C863709D6EC1DBAB2AF514CC771DF14DF095DEA8284BE2B65097D8E6F72EF3936595384AFC0026956E819F1657C901B92644E9D6D32D0D95549729B2CB3D5EFAC9C42A5F284ABC3BF5CCA5B08161B09D9A48FFB2996C3D4383D65B8D1F7FC3248CBE84B9C05464F4A76EFA005FEC342EDD56959CD26CB0DAE1B61B0493A4B68EB3D6335BBC280508F09D84E0C5F4EF520D92CD34D69E5BAB76DF5D2B72CB41A298D370EBEEFCD6C1904B956458BDA581EFA6B3654BE402AC3A971603F23F2B543C5BEEDA5F018543B72C146CF04680BCEA31B4A238460329E2BC12F14C804FDA3494C15452223D2477C9C8A497D04EAAE7DE09D7D7A879D3A5DBA565AE1A38F15E69C18838C487C0FBAD44A068C42EFB7D3F5EF488F91C42F25AC564751F0EFE0ECE7D98BB1B3D0FC42C9756F4B8F9DAF1FD0D414391155285C8DAEAAF380BD07E43570F14E9A47A87BC733F1E676233F17BFB71AAE464AED68487392D339AE064AE27BD57F8695F493AE56CA96C0615BDA8DA37133DD13C2B21DA189A7329773FD8D51381BC118645440B28FA4F402EF84C4091D3A0BC4D206BDCF9007F5DE9AA1E6CF7F6058AC6B69FBC703E908C4221F9065147766E48F54BE4B076406E2F9ED19C1BE982E636FD02DC26267C3ED989E6AD1CCE62E7B988FA7C1831E5126111A4C3C29C38A1F96CCB3A04132175FA46F73C634AC6EC741B135645ABF1DCEA18571CF9A539F5CC935BC6D32BEB1C7B8B3B5A141146EBC12DBBCC17BB4900CF0B95EBFAA52190AFC6D8933CAFC9 - -count = 70 -seed = DCC58DFC13B035323ED44BE50A7096F697C9C143518FED50A59181160960203831A9904847BA20B85E99FFA63E4AB0B2 -mlen = 2343 -msg = 954511394B9D10E1BA162861802A717E24EE42A346C9ED280C88E267A41EC09D6D73B6076E7E30257BF265B71A0B6E0CF408F02BA9078811BE94D0F38559E9985463FC9671D182286CC4F18CABCAEE1A3E5ABDBC384FB27911168B54A387171C0524489FDF512E4D8D2F65050CFE7405D8DF63A79C6E42A76F4538907EFF4DC5870095241523F56FE8E389EBF1A1CC47DDB9F0188513D5259BE257BDA5BE7381F22392CDC2406E0F2448A80F3824F2670F61920C667499DE899F0F6B397381A2DE66255E061AB92CD864DE75C9DB7CBAB9FE76AC38E0AB3389530B4004055268B289B40D79B32E5EBCC74353510BD1627E2D5DD0BE7D3DFD04138F6E3EE7526133DC70490612EAA5024BE6FBEFAB24E1E83D8941A113D8B871F3DBC3011869174888CB7A265D7DE9AB99B999C19AF9B442EBDC904FEDAB52CF40B787AAB35626417C5291F2EB892F43E698A8C65CBB6442A4832F33920FB2DBFC50B8E996FB227F2FF294C385A330957D2FADA9F86839235EA79ECDE6D9D94FBE7C79A38D40B9A8F241F53B921107FF1C72624C9600EC04DFA1160F1FA9E5D986A5A363E9CE8627276DA73F5DB47E4B90328884CFE93194CFFA6FA680F77886E4A7A0FDAF13A7DDFF6984B8855E1F58235BABFD5106338FE2B075D4F10A9FB3D3C5F829B7C61B02B34E9BDE6E62CBCC3AC9F467A6CA170EB43E632EBDBF6847F781E2469B4740FDB83DA34CE34A286E3B363A72CBB13EB66CE1DE35D8FD77DBEDBF45C44DCD16E6B58A1699694D9006947C8C20810E85E3EBF8FB2C68B967743642D86556AB6958E545AB83EC24B96F2B4BB99CC8890C3C1E0FECCE26CE09B6D99000694F870AF9F642374FF0BBF61EFC7CD5AAF5667FC3FE5745DFAF7F13FED70FE070EA4C09CB1A92D8B7F0DFD4B4A4B7DCF4CA6A97043BCEF6346F1570F37B0EB48DB8D15C8A82ED69B0C7833D6C830414C111C987471E84D2CEB5BD973DCA34ACD3A65D7B1A502368941935435B78B8F2B74C2BEF127D96651247BDBE68EB7E466B9EA2A64A13C375103D7C8F7D30A13CBE184BD1EBB19F3274E645F5C7B82EFDF09233D8AD146DC0715266963FD3CCE6F8CDEC20743BF1B7F57C101AC24C64D568923203E1A6AF03A700F5A401EC4572BBA528E284C151F1D108F7563858011FAB32B3776CF2B910D7B21180DBE75742032791018258F4D1407C9A213755C5C91205352DF919B6F14BE056243DF6AC2909E52C9A79F6917440667719185F1C5F1AAF40D873BA22956FA0BBAD9C35360853333A10A0841D9D2E758A0B1BC187F6BBD31C41B74F9EEEF1F7A28BDB7AC3D52FDC6FCB3EF0383A06A61188548963E552716D2BFBD6C2DCDE496D06615E86A5CDB76A03BCA2822ABA85EC6807EBB6918AD2948D193CCF74F4BDAF7090CD4294C1785DCEDB6B55886A848284A6A4A88A496800053E84A9F2DBF6B334AACE11A5A540626716302E259A64C6316ED543806B3BBFE37563897E83BBEFA570312DF908C1786DF0FCF55069EDC336501A5AE9D4BF212D56A9CEE811038656912238AE284575EF8DE1285B763AE54ADF44F91B6DD9E309B7A7A0AB71EC2E4611831B3CE1C9DC85CF907B52DF7406B06367E7A43DECE72DCCC57D268820EA021C27056E3C6B50E7BA7A59B53539A6B7B06B35051E3151C23F3BD3C889B25D0ECE1FD0DF1AEDF657FBB096CA1C861ACB0158501EA1AEFBF6DAD11BDC325AC1CED3739A40B7A83458EF4F3453C0F6EABC1A48037809A90480DF9DC4FF07DADDC58DF2733D49A4FA53C2A41E55A4A0167C6D33BA6E752AED3A125DFD6A0322CD235254505D7B3CED7A0DEE7EB662ACFD30F8B79D1A872998CBCF15CD86E26809E0D2DA0324DDC90FD12CAF9D8E4EDA437FE4E658D47D67C95927C4B5DEE965B940CE93E6743917296E10820A7101F8F633C93069E8B569F4625AFD4EC61BFE4549FDD06C2290A91AC0FB40CB1F55DC8BC1FE695C73AF603840AC0351F5256E00555C984E79A09E58C566D1A117B7E569BEB5850FB491FD9B982442B55BDF53832AA65180DCDDC2F768B1A1361994DE8C25F3608EC853D5982E0AFD1F9FA70170FC3589DDAF958DD840B4B502F8E2697D01AD7AC2233F6A16D540EF8D232887D2B4FA727AE2F038A69AF3DAE69EDA8EF6BF1E0B67D811160B75231543EC5A4D0778B7B42FC1DD6732385AA4400450B3CAEEFDFFCF147635CFA4AAA53DE4EE3035BC40CE8670016384BB877A86A15B59F3DF0C5D624D3D2B23EC46913618C745330A96C715C6F0BD096487E89B917384CC30B3D20A332F1B4056462227E98AF9874FF1D18DF2A6BF84AE822EE737F9E34EE8C69F23EEB9BF38ED056F499545F405759355C104284A6D08A9EFAD8FE28288B2084336A6479A6D42404F3E6FF3AD1DFC63C8AAE971AF11F2699F32F57AD29188492CE07BC1A271035B4D13A686EFDE5572353283A0F3138F6DC05CC35E5E5057C5C8B9E12B0164C0915ADEDF40A6E23848FA59ADC0E65BDD2120486942F232315FC94B4676751A35AAED2828889864C4CB7DD95A662A475733C2CA8F6997A9C822C6C8B9DC95A8B4C367E613E97D3EC6D6DDC2F81022EC21B3A93244E3BC8C2737A7724A3CBD480B26819EEB2676FD383601D79FA266ED3F9BAC2A98FF0109AD7E43E33E108D88C09BA82AFCCCFE98F50F789109D99DCD0A2C61947544F3666EDC621B5D5ECB7088B2430A611BEA52BE7F5EDFC6E2649F5E81F6DF72FA9A748BFF06AF766A60D2B751B23A8AA95CBF733359F7C0CD19B1482A6E6572D1570349C688D78CF8B8C7DD37576DC47A193A2C2797D0AF7504DEE303823A8B77204AE7B6E91D431979798A7EDF435056251D0E3F26B2CA16BFE3422CEA0398D30F0A0DC06DC8A93D27D13650E5BFB6BA04C93FAF0D7D06F99FE4F1F52A059FBE808179515FDA48ECA714F0947FE9A98F02D66FB0D80952411CDFCEAEF6ABA16D92B8F1B82DB151D7DCD7FB7781EC55F4A86C86011FBB9C5570EE76897E7803036E2FE3CDC2D5EA7A613897F3C69A6EA734E3811BFD15E90D7256A0C0C88CEB54EC6AAC151B435CD2A870E4A02087C2B847C75B00B44BB3CA6D4404C3052BD308B8D5F595277592D26F6D5A2193CD4D650BF931FEFB9DEEE61032B29EC0412F38E1CBE025B2891C59574C1450D9E3D8EF27940EF712143F06F38DDB86341A7FC781E0FA8971DAD13AA7E93F1858C70A71A40164211EA9F6A41AE90D19032C2EA52C23375CE3C4E59599ECD6855213AEA83F8DFC5CC70F58A62E4DCA17C09705C0C099B29056592986C03CF5D67074735F2BEA -pk = C9708A9945D339EF394C82025B54F802CC1BD07EF7B4FCA45AB1FA0DFE39E0F863B6EF6A72F600D7A5F16717674BD2002D44EA0CE612AB55660081FC3382E2E7161D276A7005E4B1476C14E3742096803BFB5942D52634784AD719E37B7F9303 -sk = C9708A9945D339EF394C82025B54F802CC1BD07EF7B4FCA45AB1FA0DFE39E0F863B6EF6A72F600D7A5F16717674BD2002D44EA0CE612AB55660081FC3382E2E7161D276A7005E4B1476C14E3742096803BFB5942D52634784AD719E37B7F930302000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003B39F9620C3FEDAC58C8479E29A012EDA752B4245B03312C5E6AFE6336D400A5E84E22C0E3C0319E4C275B2D18899338507C9905326951C65E73F3CCA3DAC094555C1C000000000000000EB07723DC990BCCFF33D5B352C1A324EDB4FA9C9568502F27A957680870389153DECD4A74BBE8D75C2A39750FF039682F52D5A395686606632CD0A13EA1772E8E89DDFFFFFFFFFFFFFF2681E61098621CBA991113F21F5E8E66F349EA95397F8A2B41AF73576206FAB3C0A30EEF07941C929A92A5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6BE11A19B46770AD7B644227C90552B895AA994110F05674E00C3E6E89414646DB2B65AE2A91C3FA08D4EBFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF989F3824DBF7A8A8AD2BA49AC4256EA448627E9A33FE06B602E264A825BD927DCE06321E7B9477E94E64AE679B4532022A7ED8A572166AFDDEA807C3388DBC9E3719630317F466E54C29140554EFF33A51B291AE473A7EB565DF73ECB468D9018E8236A341278BA5190C6090D587B58FA78BD4AFD201C4A46A0DF06CC6D654565D339E3D4BC8E911A283219C933CF30085493E80EAB7D03F743D52466F54D2DE3672184C4CF301972128C687FC4A7DEC59EA2385A2C94BC895E0DD2036A00301572E9755DCF928C105111A4870DF3C0F46773D562C1DB942A906B25701F47176C81A3A8BCD0609C174812E557E8A01008D26DB27475B25E1CC5911C97B712CF3A75489ADCF1932448CD36115F693D6E6E3CFA5716AD747FFFD763C89885A2A01945A0B094857628C3600792A50416676CC1A85C7698BA74E6528DD5315FE538ADEE10B46338779E0396DD15B25B58101A780FD17948D2A4D07819746A562B5337FDDD34546CA3B657C30153DE52E5A582B18661945A10B1C30467B8701783D021616FA4B4FB23CF9E1CF58C2558891BCAF7C32948413C0B911289B988367746D370E39582E0EAE3EE1B004748DC5190377E17BDAA1C0786961C9CBD0ECB5CAF3BAB1D2A2CD31BA5E0E0962DEAFA254F765A3294131E8A29B1D7EE81C266CD201401E09DD2A03BAE665EBA9F141A9D0E95BDE3EBBA7AF068BFEC36647240AEFE154CE7A6CE65FDEA804C6315D28827501EECCDC38A4DB443A9541FBD9F5415205D888C3B5CB620D607EC7C6232F3FA34112969433D4605EE322E4E830B36EB90377E6DEF75A881B4CA4DD4739BE8DDB59CBC49EBD260A8DD1C99F6200E04F1A8FD04CA6BB8D2971ADCC583CDABB0B96027C6AFC319A873212FD66B84E27AEA91FC8AC5997CFF1EE9FD9D52C7CEA23FA568D718C0AF048FFA893C37A126F7BB502 -smlen = 2606 -sm = D57B8EDD08554BF57E399AC9001AB94A94E80CEFE9E3D37A28008E4913489B790CA7CC8D470F0033DFD35AAC6C06CF1FA6CCD50173182EC9B44A7F300FCF3C9900F853F427BCB535DAAE087C0A01A07C37D3C004E4883B68B56400809DB8B9775297C6975598900080B0313F8E8DBAE91E6306F800C4126399F4095A89CF4A826D01EEF76DEBD1CBF8B14069987800B4FE3173873DD04F1C64886E00B3CFEA6A662EB2C3AABB2974008EA54F73A7E4D2C7B314751E0190B92AF3C9C99F885697E08A012A8A78866AA089C1DD6170840101FB6B541423B443BDE34074791F2E6B2498B14D501C7A87ADAF0A030BC795134BAB3EAAC28CF23C003BD4CBCB403811002709BE0F1308954511394B9D10E1BA162861802A717E24EE42A346C9ED280C88E267A41EC09D6D73B6076E7E30257BF265B71A0B6E0CF408F02BA9078811BE94D0F38559E9985463FC9671D182286CC4F18CABCAEE1A3E5ABDBC384FB27911168B54A387171C0524489FDF512E4D8D2F65050CFE7405D8DF63A79C6E42A76F4538907EFF4DC5870095241523F56FE8E389EBF1A1CC47DDB9F0188513D5259BE257BDA5BE7381F22392CDC2406E0F2448A80F3824F2670F61920C667499DE899F0F6B397381A2DE66255E061AB92CD864DE75C9DB7CBAB9FE76AC38E0AB3389530B4004055268B289B40D79B32E5EBCC74353510BD1627E2D5DD0BE7D3DFD04138F6E3EE7526133DC70490612EAA5024BE6FBEFAB24E1E83D8941A113D8B871F3DBC3011869174888CB7A265D7DE9AB99B999C19AF9B442EBDC904FEDAB52CF40B787AAB35626417C5291F2EB892F43E698A8C65CBB6442A4832F33920FB2DBFC50B8E996FB227F2FF294C385A330957D2FADA9F86839235EA79ECDE6D9D94FBE7C79A38D40B9A8F241F53B921107FF1C72624C9600EC04DFA1160F1FA9E5D986A5A363E9CE8627276DA73F5DB47E4B90328884CFE93194CFFA6FA680F77886E4A7A0FDAF13A7DDFF6984B8855E1F58235BABFD5106338FE2B075D4F10A9FB3D3C5F829B7C61B02B34E9BDE6E62CBCC3AC9F467A6CA170EB43E632EBDBF6847F781E2469B4740FDB83DA34CE34A286E3B363A72CBB13EB66CE1DE35D8FD77DBEDBF45C44DCD16E6B58A1699694D9006947C8C20810E85E3EBF8FB2C68B967743642D86556AB6958E545AB83EC24B96F2B4BB99CC8890C3C1E0FECCE26CE09B6D99000694F870AF9F642374FF0BBF61EFC7CD5AAF5667FC3FE5745DFAF7F13FED70FE070EA4C09CB1A92D8B7F0DFD4B4A4B7DCF4CA6A97043BCEF6346F1570F37B0EB48DB8D15C8A82ED69B0C7833D6C830414C111C987471E84D2CEB5BD973DCA34ACD3A65D7B1A502368941935435B78B8F2B74C2BEF127D96651247BDBE68EB7E466B9EA2A64A13C375103D7C8F7D30A13CBE184BD1EBB19F3274E645F5C7B82EFDF09233D8AD146DC0715266963FD3CCE6F8CDEC20743BF1B7F57C101AC24C64D568923203E1A6AF03A700F5A401EC4572BBA528E284C151F1D108F7563858011FAB32B3776CF2B910D7B21180DBE75742032791018258F4D1407C9A213755C5C91205352DF919B6F14BE056243DF6AC2909E52C9A79F6917440667719185F1C5F1AAF40D873BA22956FA0BBAD9C35360853333A10A0841D9D2E758A0B1BC187F6BBD31C41B74F9EEEF1F7A28BDB7AC3D52FDC6FCB3EF0383A06A61188548963E552716D2BFBD6C2DCDE496D06615E86A5CDB76A03BCA2822ABA85EC6807EBB6918AD2948D193CCF74F4BDAF7090CD4294C1785DCEDB6B55886A848284A6A4A88A496800053E84A9F2DBF6B334AACE11A5A540626716302E259A64C6316ED543806B3BBFE37563897E83BBEFA570312DF908C1786DF0FCF55069EDC336501A5AE9D4BF212D56A9CEE811038656912238AE284575EF8DE1285B763AE54ADF44F91B6DD9E309B7A7A0AB71EC2E4611831B3CE1C9DC85CF907B52DF7406B06367E7A43DECE72DCCC57D268820EA021C27056E3C6B50E7BA7A59B53539A6B7B06B35051E3151C23F3BD3C889B25D0ECE1FD0DF1AEDF657FBB096CA1C861ACB0158501EA1AEFBF6DAD11BDC325AC1CED3739A40B7A83458EF4F3453C0F6EABC1A48037809A90480DF9DC4FF07DADDC58DF2733D49A4FA53C2A41E55A4A0167C6D33BA6E752AED3A125DFD6A0322CD235254505D7B3CED7A0DEE7EB662ACFD30F8B79D1A872998CBCF15CD86E26809E0D2DA0324DDC90FD12CAF9D8E4EDA437FE4E658D47D67C95927C4B5DEE965B940CE93E6743917296E10820A7101F8F633C93069E8B569F4625AFD4EC61BFE4549FDD06C2290A91AC0FB40CB1F55DC8BC1FE695C73AF603840AC0351F5256E00555C984E79A09E58C566D1A117B7E569BEB5850FB491FD9B982442B55BDF53832AA65180DCDDC2F768B1A1361994DE8C25F3608EC853D5982E0AFD1F9FA70170FC3589DDAF958DD840B4B502F8E2697D01AD7AC2233F6A16D540EF8D232887D2B4FA727AE2F038A69AF3DAE69EDA8EF6BF1E0B67D811160B75231543EC5A4D0778B7B42FC1DD6732385AA4400450B3CAEEFDFFCF147635CFA4AAA53DE4EE3035BC40CE8670016384BB877A86A15B59F3DF0C5D624D3D2B23EC46913618C745330A96C715C6F0BD096487E89B917384CC30B3D20A332F1B4056462227E98AF9874FF1D18DF2A6BF84AE822EE737F9E34EE8C69F23EEB9BF38ED056F499545F405759355C104284A6D08A9EFAD8FE28288B2084336A6479A6D42404F3E6FF3AD1DFC63C8AAE971AF11F2699F32F57AD29188492CE07BC1A271035B4D13A686EFDE5572353283A0F3138F6DC05CC35E5E5057C5C8B9E12B0164C0915ADEDF40A6E23848FA59ADC0E65BDD2120486942F232315FC94B4676751A35AAED2828889864C4CB7DD95A662A475733C2CA8F6997A9C822C6C8B9DC95A8B4C367E613E97D3EC6D6DDC2F81022EC21B3A93244E3BC8C2737A7724A3CBD480B26819EEB2676FD383601D79FA266ED3F9BAC2A98FF0109AD7E43E33E108D88C09BA82AFCCCFE98F50F789109D99DCD0A2C61947544F3666EDC621B5D5ECB7088B2430A611BEA52BE7F5EDFC6E2649F5E81F6DF72FA9A748BFF06AF766A60D2B751B23A8AA95CBF733359F7C0CD19B1482A6E6572D1570349C688D78CF8B8C7DD37576DC47A193A2C2797D0AF7504DEE303823A8B77204AE7B6E91D431979798A7EDF435056251D0E3F26B2CA16BFE3422CEA0398D30F0A0DC06DC8A93D27D13650E5BFB6BA04C93FAF0D7D06F99FE4F1F52A059FBE808179515FDA48ECA714F0947FE9A98F02D66FB0D80952411CDFCEAEF6ABA16D92B8F1B82DB151D7DCD7FB7781EC55F4A86C86011FBB9C5570EE76897E7803036E2FE3CDC2D5EA7A613897F3C69A6EA734E3811BFD15E90D7256A0C0C88CEB54EC6AAC151B435CD2A870E4A02087C2B847C75B00B44BB3CA6D4404C3052BD308B8D5F595277592D26F6D5A2193CD4D650BF931FEFB9DEEE61032B29EC0412F38E1CBE025B2891C59574C1450D9E3D8EF27940EF712143F06F38DDB86341A7FC781E0FA8971DAD13AA7E93F1858C70A71A40164211EA9F6A41AE90D19032C2EA52C23375CE3C4E59599ECD6855213AEA83F8DFC5CC70F58A62E4DCA17C09705C0C099B29056592986C03CF5D67074735F2BEA - -count = 71 -seed = 270BEDAA7BCD43990FD8B4F44FFB63A3AE8E991BB2BF84DA7BC2CCD1A079C579AEBE2082ACBAB7FF286DE795F31973B4 -mlen = 2376 -msg = 326A4FE723BE9363ACFC000705A10B6CD8A7B25E99A34B4A354CBD6F50550BED30F6C4208490B4194AB79B24B093FBE132C299DF924F2FFCC2CDC6C2C9019EEDF4B72D7F0817825BD787135927102E1DA041E9A78B501B42DCE777A79ACE604E57DF11775D7B87E75E5B00ADAC90D1ADD78CC5AD348C7472EEC6E6E06F737E77115A9509A6AE6570F738DC2F21314A7CCB9D44ADD6E1434CDFE3614BC73A6B468F6691B60F4F2DB103289A90C4FB2BF5AAF87826D2BEB0880FA64E07E9BD30D4EDA00D6BDA01D1EB22BCF14EE797A859C9A0D9034E8C5316201AF91388C47E1DDF061C9F45E067A5F60B355C98F8734559B8F1B82F47BD9CEE0224A1D67D40706333523C34F3582B6C8CB47BF7D0E4FBC7D7CF3DBF21077E664FD59998338F4DD4A423C3A145EE1E994AACC1A48F81A7E9FE106008DB93A6626B8C8505043AB864D93AE3972675E69C3825304086AA3419216CCAE7F7D5117739E99D8F4A0B658148DE33FDAAEB9967EF56677D2028C3B584C5CC1C096F4DA16799408B2EE2FC3482AD2F49293CF4097A78492470099BDB90BCB4FE3B245AC8B3C53E05D7609E34770ADCC147033A8FADE81359FF63C3FB90C5A498C98B7A0E5EE9CF4D287759ACDA4BFA3965CA85E1D1C1019E7FE6D82E5E66A717F94890277E6DB1EAA6F3291FE1BCD7D437094749FF5574B8728E0DC21A143A14E382937EFB7EC1B0FB3F6F9C0F547F470E3B436DFC7986F923BEAA89583D8978C433E0CB0C4E98516AF1AC797C778662455A57FEF45BA2C7865C1DF5C502EDB01C8CC729468091BB96BE9DA9C298528187867EEE9A06141DAA15F60CF719DE2BD15010550B92A41F12D8F38B54692589AFF51A9D5E6047A0D9B707369992251DF31341A45B01B05FFED8ADEE5810824F903EA59F14FD500AEDAE797F8BAEB470C0B14C4EDA5C687E4848A85B30A8E8F59C45D4C9F0C65FCCB15F4D4209A55722C29B6CB09AECB4E53FA3AA602C56EE3BA6900CC12889E7B87D5EF283AF1586764519A30CF60833C82F0ED15E39A8BCAD5C6AEE9999E63D399C5CEA10AE1F53B04858EF7896AA29FA541451FDB685734C39470250545193CAF26C9891F7F965904AE10E8566BFF9B2F465BBE13D6EA4A79586E68844B9FA68B2F992565C8B0EF5FFDEB5878CC12A0571CA3AEA50ADD29DD06E13741A1AB215BF487BE7735D1634332F47E037253054A21E0AD8D8F011334CB5951F833D4D344D632BCAB7C373CB7DAFE8F3D79E7E13BDB1C6CFFA474A9FBB46F5736D55F3466534596EBD22B29107A8FA50C1D0E62F0533E343FEE038FC0C3040A6DF2D318BBC8420019B1B148D6D1DD2FE428C2FD617CA73F224EF9AF9BF6F83CF1006616235471B69DD4EAF9F32529EF3E1DFE6765E61E246B519C702351C9CD66C57065EC78993D793B082E3685EB06F2530B07862277D339A52813C99EBE16C06C4C8F547D9705850E770982E8FA0275A52F430FF2422A115ECE46A9202CAA0195789532B1444F1507AAB2E4303464E499989F21C7D881328F18DBC77D4B9B467CAE244A93053C0321DFBF815DA28B6EBF483EAFBE634E9947BB5383FEE3A31BC03A63FCDDA5E3E46D5D3184718C348A83975728714351DF43BAF91787CACA346DBB819602F18A4C4FE90C4CE307984BCDED89CD2E4AEB66318C10D95AFA5BE53393FEB981C21BB1411BB9C58818BCC141223D66ED5F35F90C05FD4848617220DD72F5E892292CE20AA9A0F9AD54022CBE94D2C86DAF3FC66949AC35D8E122B02E2D155E73F4CE24D7E85A5C301DCC173CA8EC090AF9DC7F443C983280DDA27ED4B9BC71F86E84F7AEE39E6A7E9BF5E43920AAC858F0F49A06216D9D3984CD2E3575C0FA6CE8A5E28B0F481CCBAAB450FABCE8A1084EF458DBE257CF09D8116136C2CF1EDFA6CCE31AED0F1F8278C1C8D9C79846886D48E3FD311C015BF2373F7CAA71AA26B011D0DF5A843AB53D7E7F0466CCF49C5D4DE872CA87B8895101EE0147A3DBD391BEED75FC16F65814D56CB29273A5F4E5400FCABF85040505C31D001DF0023726E9C1F7C29A37039FDDA73B9B99ACEC3A029F7C0DD61ADE7D5E835E1CD605AA8E583BF8DC99285E86CF91F4B4827A0E8956EFDE2B495A86F85E78B954341CF3AFEBE8DB71C26B9B1BA27B47284AA84E55B1C2AFEE733AC596A10186D9AB504F33E34A06CA931D7633462B04B9B2B0D4751B0343503BCB2A1893D944FBDB4BE63DE167348A1588E6551FD9CF2101B0B4CB61422655FBEB50D64CB9E87A23007A39821EC3ABA391485347624EFC3DFDA4A133C537D7CD8C3A549BB6BEF9A52D2EDF0A8892C6FC3EEC3EFC3C18741C85BF24CD3B36CA04EE77F654ED5595A0E4B9316CCFE4D2AA6B4A66B06F309337E363C9E39829C8838729F19811093DFBE962246473B7A19FAEDFDB0193F63EB85EF308CD3BE5831F35CED36D9448D0EA8306044F78946079210CF89FF78104BCB2964CE2AF9954D53885D7914E4FFA4AC7E9B3D103922FD1AD68C0A4592F885C5FEE51D52214E17035E8681086203B79B5EB176679EB3263B44EA7287262DD84BB98F6639B9657AC04E397D69C634A0C1181ECA485E467D62631AD2D9AFD5AC5B86ED4005FDBB7404B65BBB826F1A2334A481B9CD46E0CE9C414A162E84368089F24149D7D05EA6ADF40B25A708357AAA5A28801FF100F69252810188CFC6087507BB5BDE1CD43BF72B1B3207CE4F7E65A18E5276613D4BEDDAF21AF7B964FF69965C47CB03846F7CEDDD2C5133080FC632A4F0B3495B2D2751727CF7681F28675552DF2A0994E425A922BBFCF84189B8C9F43058D691DB3166C596F6BC480EFDE06BDAE7B9C2985A1F2F6441520620E193D7B94AB46DBA2A1ADE44E2B006734E6770F34B0E2122DD7F4EAF045164DEA8C2FECE7758630384C00A6B528A6ECF07045B2DC0281C936A540904733149BC65B0F57ACD9A5E41C2ADF83FD6A760B169BEEBF04644DB1314270ADF86D01CC2CD580C609E78BBCD9D2694A89F9CB6DD36B9AA2AA5581FF561B5417BE2B52F3EF2581E461CB0690782F33862C52590643BECE0A6141DC805D8F56C4F64C1BBC49A3ECF1E8827926796E5F9335DF47DA6D3E4C14795B547116FD1F3351FC55C28B543183FEAD8DF7DA4DFBCC38E224901FF7BD83B16631064CAC4A37FA632F53F004374AA19861FDCA515AF91E66186EF804366D5A1B3B4FAAA60A0C4B36B972A9579548B4CDACE7EB85F1F68A4E4255FD994C1786975E7F6F0BA87D0295DE72876BCE37146A09EDEBC0164B9C4911CE41EF4D48130A27651BD0DC315FD622CB6D03759D35756806332658B5B33E768860C1946569AA45130486AD49B -pk = 9280D04578737565AD4B095ABBC81053777AB58128029C90950B7CDFE26769C56C22E5730D81B70DC8290F91E08F2703681E4393A5DE56012DB776B7FF1D650CFC78EAEC09132550A9C695CB6CC357FDE45C2BDE28F36A3B4AF94F905EA1F202 -sk = 9280D04578737565AD4B095ABBC81053777AB58128029C90950B7CDFE26769C56C22E5730D81B70DC8290F91E08F2703681E4393A5DE56012DB776B7FF1D650CFC78EAEC09132550A9C695CB6CC357FDE45C2BDE28F36A3B4AF94F905EA1F20202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005F456FD710023AADB58E6553A3692FED81D21174DD49E7F6182BD86236FC997EC4D13131433C9F8454DA00BEE882C9D22A7E1A48FEEF15B4352313FBD7AB0C4A837914000000000000003060CBF2038F6C68ED031EE148FAFA93FF9611980F4B755A8FC7DF5A7FB26EEFB89EAED87593D77A395B76595308E009F9619F9CFE7588B82610ED8119947DE5C9A10800000000000000F4368FE3814375C6665229CA4C0FF8FD0E711A0480F84188B3DF4DC1C757C4447F6728DB57F08A2974DF8900000000000000000000000000000000000000000000000000000000000000B912984CB0A57BE50447288A00F98A65E55EE57362352E2695B6D85A1C266063DB83A0087E65FB60122C6401000000000000000000000000000000000000000000000000000000000000AD57BD72D269A1C2C589FC07A1DEBA8DC5848F68620817D732C92D1C2450D0A1FA396212EB0DB22DD7426A58F5276902D809B8627F722AC2A2C7F5874461957D588E51FAC6F21917216FF25D2934831AEAF501905245BCCF91D47572E484490323E87DB1128169BFBAF21DEA62F28A92A13A3BB9EFD33B488BA82AFA1EBD97322FAD65E8046340DDEDFEA6606E2F3C00C4D7DAA0D8A6A38BB38F2900991FEB1DA4EFF7B078AAFF9A26D6160EC8174E0FAA8BB671E6AB12A58635B17775D90C039A50D7CD7F9E3045F090F198AC055C080ED77B344A06167381E1ED8F93EDB3C35B2661D08E032D221E8B64822CB73000EB14D81BF104BB02E5048A5ECD5E009C14DEA900EE42F8E5F4E0E040DD653350623BA891B9F19297CE85758E7D91BE0352B4A9950DC72DE63794A1E69B8205910A635F4C15C811E99D0185CFA7291D075D43E9EB6C3E52A982ABFD5CA7194403BDEF553952C4878262B55E03F1BE5CED490A25A65AAFAF51EE3AA41EFF8F07CEF8A141D826FC61A185EC272738CF270288CD545F53235596F497921C090476719F657E58748B65A675F28A72B4C0A6BD6ACBE50A87C895A981AC4F262F393003022AEDFF3C9BC71BC4F8B3EF25E4877105611D1FB416D07AE0F96C2D69E67031608DDC1198AF81E8CD9524CFE10E4C013ACF8EEA6B2AE47BD1DE7236DFDC05FFC2BD3152ED95CF8343F1A1F757DEA04AE54FB6956F40B26842DA3BCFA8BC8700FC8E758BC8DB035EB282FFFEDE2D0E9167DAE27695570A11DF696C1FE367512592914D8558E108F9D884F8A6483E0D037B50CEF5A775C4F942FE91D140E511BAEDC38E9A53854C7A12C8AD971AEEA38320B9810C2C6572D88994C809E46F7C0240E6EDA9AC3F70BD1E496055261BD2E54256281A725B724F69AC0ACFC0DB3323605CA2ED36A772A16F4F7DBDD99A5602 -smlen = 2639 -sm = 66BA5EB8B1248AA837C7C4C600D6E230F9636035BEAFBFBECE01E812991EC29BCCD2ECFA06D701F776B05738C318C0E5946FCE008A74382D4D25D911DA2C9E5801BAF2121D8B6E4AA975D3738601BBCE97B70DDAC6F5D8C34664011BCEC944C06F18255C1B7D0401DCB38729A36FA081E4DFD0B400FA9FB13634AA469385DAC0790074A72CC59BB8F4286B5DA2D500B07994DB874632D9A382A2190060759BE06E77045D5A1AE49A012971FF5BEA097D3E080AE35300FEEB307162AD4CE29344382C01062AB74AC34C44C1E756B1830000E72280F6C4E84B392FA72C2D8249EFD254BEEEB00915B0484B080222E6FB7381702C62CE9C8CA200325EA1020640340BEE4EA1EDCA0A326A4FE723BE9363ACFC000705A10B6CD8A7B25E99A34B4A354CBD6F50550BED30F6C4208490B4194AB79B24B093FBE132C299DF924F2FFCC2CDC6C2C9019EEDF4B72D7F0817825BD787135927102E1DA041E9A78B501B42DCE777A79ACE604E57DF11775D7B87E75E5B00ADAC90D1ADD78CC5AD348C7472EEC6E6E06F737E77115A9509A6AE6570F738DC2F21314A7CCB9D44ADD6E1434CDFE3614BC73A6B468F6691B60F4F2DB103289A90C4FB2BF5AAF87826D2BEB0880FA64E07E9BD30D4EDA00D6BDA01D1EB22BCF14EE797A859C9A0D9034E8C5316201AF91388C47E1DDF061C9F45E067A5F60B355C98F8734559B8F1B82F47BD9CEE0224A1D67D40706333523C34F3582B6C8CB47BF7D0E4FBC7D7CF3DBF21077E664FD59998338F4DD4A423C3A145EE1E994AACC1A48F81A7E9FE106008DB93A6626B8C8505043AB864D93AE3972675E69C3825304086AA3419216CCAE7F7D5117739E99D8F4A0B658148DE33FDAAEB9967EF56677D2028C3B584C5CC1C096F4DA16799408B2EE2FC3482AD2F49293CF4097A78492470099BDB90BCB4FE3B245AC8B3C53E05D7609E34770ADCC147033A8FADE81359FF63C3FB90C5A498C98B7A0E5EE9CF4D287759ACDA4BFA3965CA85E1D1C1019E7FE6D82E5E66A717F94890277E6DB1EAA6F3291FE1BCD7D437094749FF5574B8728E0DC21A143A14E382937EFB7EC1B0FB3F6F9C0F547F470E3B436DFC7986F923BEAA89583D8978C433E0CB0C4E98516AF1AC797C778662455A57FEF45BA2C7865C1DF5C502EDB01C8CC729468091BB96BE9DA9C298528187867EEE9A06141DAA15F60CF719DE2BD15010550B92A41F12D8F38B54692589AFF51A9D5E6047A0D9B707369992251DF31341A45B01B05FFED8ADEE5810824F903EA59F14FD500AEDAE797F8BAEB470C0B14C4EDA5C687E4848A85B30A8E8F59C45D4C9F0C65FCCB15F4D4209A55722C29B6CB09AECB4E53FA3AA602C56EE3BA6900CC12889E7B87D5EF283AF1586764519A30CF60833C82F0ED15E39A8BCAD5C6AEE9999E63D399C5CEA10AE1F53B04858EF7896AA29FA541451FDB685734C39470250545193CAF26C9891F7F965904AE10E8566BFF9B2F465BBE13D6EA4A79586E68844B9FA68B2F992565C8B0EF5FFDEB5878CC12A0571CA3AEA50ADD29DD06E13741A1AB215BF487BE7735D1634332F47E037253054A21E0AD8D8F011334CB5951F833D4D344D632BCAB7C373CB7DAFE8F3D79E7E13BDB1C6CFFA474A9FBB46F5736D55F3466534596EBD22B29107A8FA50C1D0E62F0533E343FEE038FC0C3040A6DF2D318BBC8420019B1B148D6D1DD2FE428C2FD617CA73F224EF9AF9BF6F83CF1006616235471B69DD4EAF9F32529EF3E1DFE6765E61E246B519C702351C9CD66C57065EC78993D793B082E3685EB06F2530B07862277D339A52813C99EBE16C06C4C8F547D9705850E770982E8FA0275A52F430FF2422A115ECE46A9202CAA0195789532B1444F1507AAB2E4303464E499989F21C7D881328F18DBC77D4B9B467CAE244A93053C0321DFBF815DA28B6EBF483EAFBE634E9947BB5383FEE3A31BC03A63FCDDA5E3E46D5D3184718C348A83975728714351DF43BAF91787CACA346DBB819602F18A4C4FE90C4CE307984BCDED89CD2E4AEB66318C10D95AFA5BE53393FEB981C21BB1411BB9C58818BCC141223D66ED5F35F90C05FD4848617220DD72F5E892292CE20AA9A0F9AD54022CBE94D2C86DAF3FC66949AC35D8E122B02E2D155E73F4CE24D7E85A5C301DCC173CA8EC090AF9DC7F443C983280DDA27ED4B9BC71F86E84F7AEE39E6A7E9BF5E43920AAC858F0F49A06216D9D3984CD2E3575C0FA6CE8A5E28B0F481CCBAAB450FABCE8A1084EF458DBE257CF09D8116136C2CF1EDFA6CCE31AED0F1F8278C1C8D9C79846886D48E3FD311C015BF2373F7CAA71AA26B011D0DF5A843AB53D7E7F0466CCF49C5D4DE872CA87B8895101EE0147A3DBD391BEED75FC16F65814D56CB29273A5F4E5400FCABF85040505C31D001DF0023726E9C1F7C29A37039FDDA73B9B99ACEC3A029F7C0DD61ADE7D5E835E1CD605AA8E583BF8DC99285E86CF91F4B4827A0E8956EFDE2B495A86F85E78B954341CF3AFEBE8DB71C26B9B1BA27B47284AA84E55B1C2AFEE733AC596A10186D9AB504F33E34A06CA931D7633462B04B9B2B0D4751B0343503BCB2A1893D944FBDB4BE63DE167348A1588E6551FD9CF2101B0B4CB61422655FBEB50D64CB9E87A23007A39821EC3ABA391485347624EFC3DFDA4A133C537D7CD8C3A549BB6BEF9A52D2EDF0A8892C6FC3EEC3EFC3C18741C85BF24CD3B36CA04EE77F654ED5595A0E4B9316CCFE4D2AA6B4A66B06F309337E363C9E39829C8838729F19811093DFBE962246473B7A19FAEDFDB0193F63EB85EF308CD3BE5831F35CED36D9448D0EA8306044F78946079210CF89FF78104BCB2964CE2AF9954D53885D7914E4FFA4AC7E9B3D103922FD1AD68C0A4592F885C5FEE51D52214E17035E8681086203B79B5EB176679EB3263B44EA7287262DD84BB98F6639B9657AC04E397D69C634A0C1181ECA485E467D62631AD2D9AFD5AC5B86ED4005FDBB7404B65BBB826F1A2334A481B9CD46E0CE9C414A162E84368089F24149D7D05EA6ADF40B25A708357AAA5A28801FF100F69252810188CFC6087507BB5BDE1CD43BF72B1B3207CE4F7E65A18E5276613D4BEDDAF21AF7B964FF69965C47CB03846F7CEDDD2C5133080FC632A4F0B3495B2D2751727CF7681F28675552DF2A0994E425A922BBFCF84189B8C9F43058D691DB3166C596F6BC480EFDE06BDAE7B9C2985A1F2F6441520620E193D7B94AB46DBA2A1ADE44E2B006734E6770F34B0E2122DD7F4EAF045164DEA8C2FECE7758630384C00A6B528A6ECF07045B2DC0281C936A540904733149BC65B0F57ACD9A5E41C2ADF83FD6A760B169BEEBF04644DB1314270ADF86D01CC2CD580C609E78BBCD9D2694A89F9CB6DD36B9AA2AA5581FF561B5417BE2B52F3EF2581E461CB0690782F33862C52590643BECE0A6141DC805D8F56C4F64C1BBC49A3ECF1E8827926796E5F9335DF47DA6D3E4C14795B547116FD1F3351FC55C28B543183FEAD8DF7DA4DFBCC38E224901FF7BD83B16631064CAC4A37FA632F53F004374AA19861FDCA515AF91E66186EF804366D5A1B3B4FAAA60A0C4B36B972A9579548B4CDACE7EB85F1F68A4E4255FD994C1786975E7F6F0BA87D0295DE72876BCE37146A09EDEBC0164B9C4911CE41EF4D48130A27651BD0DC315FD622CB6D03759D35756806332658B5B33E768860C1946569AA45130486AD49B - -count = 72 -seed = F151196F55A9ED88F1663AF6BD24B2CB9DCAF3C9B313CD8F0A27639D3CDAE72EA90D60ED5C7C6AB697A06185E5A2E215 -mlen = 2409 -msg = EFC63DD588A7230CE08EFCFEEA534F5A0EB005480AD1D169C386E476715238526E936FEA7136E2D8AED60DE31CC91DAE4E764CE5F93624FA7F72B87562FB6AD8996B5E41FD478AF0AF8338A7FD9AA250EFD2F2D20364E8A88A8642E8E38F38583ABF8D3BE97F14C3EDE66EBF8EBC84385CAE646CDED8C5CE8F06910BA7FEC05D828446D558D6FED766FBA347DA2E84DA247C34266AA31C328804F4E3AAF6ACBB0AD50FEECCEC00D20B3610785B9F1BA06A0BADFB42A8F43DE3F7BAC36057EE0B4D2A15DB040A8903F767F7352995C8FC3E06ED1B1322587EEE5B31806192E04B09A7B433D08CB2A340942CB75C51E0F8409F907F69C5F8DC316A227942EDF7A458974FDA76C255FF4F1A85A352CD2CD2A21507E0F37451060D31D0847528B3ED5DA3E7168CBD0302F1B03842E63B3DEC6FB37357E37FC3CC26721F290726A47AB3D4DD8FD1778FE5133726C240E7B3E398F3D809C6C469680B9EFD25DBE890D6936B76A52F97AEF3F93872B76506A95685EECDCBCE203400D182252471B99B7F4C6CED4CAC8FACA7682D0DF07BC5904AAE042479855098CBC41534F0EF17F38F1BC8C272CF72C1AC4A5564DD132130EE676E7D7EC3CABB4E85AC81945C87DE08EC60CED3FA0AB3E83C18AE493A851434BFA2C4968B42ACCCF3609539C62A4E01F8BC159362E15EE91D8AA399D8BD8D67BA1E8FD646EEBB4583812293406B05BA5BE2B1DF9620E6FE3DAF8CEBD9652BB04494B899F407C7D9ED1C4E77FFADE24ABE56AD597BD438928E05B0363D6D2685D34D6B51D71012844415C46F13181B146A3AF25AE4E8853CC7C7EF6387306C45180A6EF9E97ABE1E7D5E10115752C3071B6A213367E8B1A3D1C3703CC1840735315623901D772C61D55EF8C47DB10F0EB7582D7A043018DC1363E93F315DD984B8002EA7BF5BED38D3F273276CA577CF99A635CB6ED9D6525520793405BE27C86E6EFFEABB1E5F84A0076BD151CAFC59853424DE4B3460C673B0820D76E15EE47B6505D2D5C179DB92A44042F3631C646D350EA9721B8984660A76018DCA5C6BB1223CD03CC844DC9371D32549D9D645F75D2683FDAD1DF6434BBE43200E506ED2A815FAB511172C70F99A85FA3970433E8955B2F9389F23C10141B5779A23B8671EAE8B91991B78F635FBE8E627D3E79D91FD1E6E90699640BA3AE8D7E4CF5145F1259CC76AE50B1FA150D8338A9450A5B6B90EEC9C94318BC78C9C7715A3EB215AEE6443540D211A0556813529023E5A581623CD6D19BEF0705A5F69AAD4833A57C308144E92899AC5683147CDBD279D5C3A55BBC5E8F8E26A158A3E42F8C5B858909B024B4BA4069E26DE66460FF4A7DC92BD54AC244007B6AC6CE07A31A2AF3323CB55F07B8F480D279308FE10F2DDB001DA6C4AA132B988AD03FB63E0EB06544571F5505CF377A81153D6FBD4FA2B7562074CFAF587CCF28DAC84AFA58809C0B296E0D2594D3582C28596F5AF7500E143BE7B49C63D04F49BBFBDF60B024DABA5533F945BA90659758E06984921EFEEF79604059EB808C9FE1BF9BC5351A406FBBA7F5D8FC9F891488E537DB14B216A0535C9FF7BF8D5C68A2453A8A48E58FA7BF6EB76448D6D0BD05BD4628C4B852A236A11BEC0F67118F1267CA42647F6F2303509094C9A7F3A07B2724ABD2D9B56B71FA7AC6CDDE456EC209BE76C419855A5151EC9EBF0E0CF1B86F4E8E81B8173960F8D1C8AFFED1AC7B818AF8E3BC092E2B209D693E80B11EC7DA39CA93223E1B47C6127E8AD40A78BDB0ECBFA1F39C84CB9ECDF960ABB39884627BC4105C53EE7BCA4802B92AF60241420CBB36C407F46CC2E953D7E3503CC82287A8D68D0E673E212173D80A12257ADD5256652188C00590DADCFB7DBB6B35507B853EA5FAD4F52E02230CB3D3BBDFC43EB74780583E8DBB851E0257117F4A39A6676586216220C1CA21DE16CDFE6E1CC99EA7C989916AD2FED4A8373CFCFF02207529BFFCB7B7601317450BF430BAC9CE111B0FBA8D7DE6627F863078D8E6286B2D34856426EA90FFD58705444D0DC12D4FEEAD0FFE543811E1EF306F40939922563832D06E6DEA7109087AC051A361EA9E755856FD4E51388BC7C40C63E0953C8413AB0CBFF70C466E15DE5B089D095E8EE8A64E929D26CA3B71EF0B2360AECDFA89284CCE08C666F4E0146362F0BB84B87A49FCF2324EBB96DD941F00E2586F7246436EB66B1E04AF84482D8ECD2BC8EF9955CBEC62AFDD754A7F235C7F3C41CD0B36A9024D426B7388D3C33A5A6E858846C0FB0D88BA5798C923F9B43D14A6661C65092D5C5EC0F97D84784FA336AE6EF57C7A5D04804B96D19849FF9074724A5FACA538E32C6EFAA5209317543159272CE50454FE1E7D068C8F5FF3797A66D5F87758627AB5D40EBE1FB7CE9D69287AE7A5F349A5DAABD8A8E7778BAA26DA0EB237034A3366448280237A165CBB303BE6B33C0F11C1E56C50A84384A0F6878F2A99B14CD3B6820ABD27D2011E0C37F8439BEDE65747038A5FF7F00DAEDA094331523CDB7E10F1063B64A584D3E9F0655268F89DBEF3EA3FA4C6E54FEEBF8F0046C6C811F0767CF6FCC9B3497DB05582774047A8DCFF6A0C1B5188076E64A9D5693195075F2A05E507A5A523EEE4537079F9E5E79210E4AF056D6624D45A0EBA553CA9BC92171451970102CAB57DCD89ACEBBD7025008325C61145264F42E4D14A76E5C2F1C129D4C054DA00501081617D1A27012A6E160750DBA73BECB5DC05105BFDE1F1D0CDC837355844B291B09015FD610628513C1C86EAD373730B99FCD4A552FBA07163CE9CF6A3D3AC0525593F0648256E8B33FBCF92AF58CE26D0F036E11230879DBB789507BCEEFD2960EA320236A224EA74DD2AAAC541664FA3EA9430D4FB09C878169A8AF1E7FD4BE5E7926CB0B6A352B25F452454474107286EDAA145C0A0573361522EACB618DD9C8B32BD1A8A5923F4C698CCA0139DC640C1D5D557CE889BB69CE32D85853DFBB0F34DA2CF18CC79472906B67F6BACBF287F31DE0B9E7A01A356EC9B64653CB922501EA1EDA940089BA0F293B667F482E92438805CD6851776CEA0920CDEFC4062C9B4E51F5AA1D7FF909CC2608B6F28CCF28D574BF67CE80D4DDCCE28F2ADE0162CB66894B5B2DA0EB975CD95EE7FE72FDA2736616C8B571FAC94BF8C64ACD1642D9431118F08A62328D99B2B9D90BBC915DB764C4935951A59C369C72060CD9F4273BDCA0C295294008C0AC3A149E8CA5E8BF21042F5F21C067147F3BB52B13975026A9DF7246AFB1D053670982AB316509F2850342913E1322758ED89DA02DD79126726B1C5566C1831CCB1D62B3E271875E62CDE0DF0715D404F95F580B63923F362D416F83FE5AD98EED584717FBC2CB7D1B00101200F4EB4CA5 -pk = FA43DFE524EE3E4BF3435CBA4F130034B61E4965E1DFA7A3AFF9939C10E805ADBDCFB3B00C6C302EFEC195246F8CB101FD38D25A02C534C8E5CBD1B169BFFCAA9C06F222FDD46AA2444924167D1AE3A4CCF193335AD83BBE90F78C748639FF00 -sk = FA43DFE524EE3E4BF3435CBA4F130034B61E4965E1DFA7A3AFF9939C10E805ADBDCFB3B00C6C302EFEC195246F8CB101FD38D25A02C534C8E5CBD1B169BFFCAA9C06F222FDD46AA2444924167D1AE3A4CCF193335AD83BBE90F78C748639FF00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061695A316ED5E289FF31CDEC82D083EB3544A4D3B14DAE57D998592E6D519868607E2430DBD6573D338BA1DF3EE7E9DA94FD3383F47E38EB7A8E75210DD05D9FC2D21E00000000000000DAFC6246463E8C34FC069CE9524F38308EE632A4D930CD380CC9E9525BA065AA05D0D0793F33418807C336FC951E7F72E81E1D25092ACF84FE443F36361CBD5364F5DCFFFFFFFFFFFFFF92D6CEC9EC21D1FD76A673F04591623BE8AD89C21D36F70C7043C0D1E26E4FEE1ECA38E2AF182EC28F7ACAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF851428ECFAD08984AC2B67A3BE2CCA2ED5E7BFB92584DAD4B8CA348E07C2D7DA22863F2C110B9D093C7600000000000000000000000000000000000000000000000000000000000000F1F43C33DABBD78FDAF1380ADE7E021CB7F2C14FC6E790C4F7AF904210274FD218DDA4E39908F7F3FABACCA0F758A202C9F2305D28F3581CD0F9C4B275C455B48D41BAED48ED10C0A978C51E43D28C5844C81DFCF76F5744843BBDE6A37A9500E8E26D5B7D096BF420E10B076AD8B0032587BF2BD9D76FDA2A0A4A3BE95A3756483908D036A18FB06695922BB7A42603176A06251272631283A5532899273BEC9A225C2358A41F6BDE1B2FE01EFBC4920584A114F23C36F3081CB78705766303C08599F1D19A58ACBEC13F068119AF4289773A35D4552CC89D3B03BA3F98592FAD24D6F4D0647C3AD1C7AA1627034A0054A2EE0608FDF5FEF606712AA7E106AC43667C25097A0AE1AC956256FF426EA16BF7F9A19466842F28289CCB613C0902F5C515041B2D9CC50C202A7C5E45A81188B3447BD8D68B0EEE9D4784D9A48DFCC30BFA29508D5B82E1824BFD8830F100025A854C7A1D1F9B94B8293A4AF1F2E657BE38DD22CA4870E98AF078599581F21570AB43921F55CB803B9D4E259A5803C29E921B396643C20CDFE639BAED4A3CC027DD3AE77FE87025A3FA2D5452CFA00391DD99562F310B026746795B4050005F0CF0F1BFC68AD57D79D565A148A716A7E705EEF2FB454B0C077D079A5A8D2F432B8391D06E474199C80011E9D00D0132DF123FA520C5BDFA70E3B3F7157CB088BACAFAE6BF82B28667AA24089DD5B775282A47669D3A1C022664F5F6E39101B649546F30502C7ED298A8E8F297D68D5CB69EC9E52E0162338A6186504AD038D3C541D8F6BA39FD4B5A5C3546469B03280AD0589990A028B52698CF3782AA68B16CE97C796DCBA9D8ECB2498A206E179F5CB967B52AC719EE7C27F28B280A007E47343B8779EEF6A5C39EB57C36428C338C33CE6F0741650B17FFC7636785929959097AF3587AC707CA4635929AD902 -smlen = 2672 -sm = 5C6C73D632609A0482ECDEC8010ED3498413B15E15C024544B00F7CF36615F2070C6B30214310011D2C2D3B3E2A184D03E9577002AABAA01056ED30CD86AB45001A8EB40B625CBCF4ED6C765D50106910EC8277ED6564E9D6C3400728BFDAB4893CB77582FB6C801E37A324C0E25AD637C6BA42900A98EB5CC62F61F081C8E9E3400C90ADAE435D7D14814C5357400AF11B472C10E4E28CCE09D6B0146304A0A69C6764352F726130040A32367FC75916E756B824300B9826A7CCB2D69EF5FD1EAAF0122570F33769E4742AE4C7B1D000115B7409C33295708811CF0F3E24D0C63BA6C0824905E5FDC85130224CCB7A6F36F20D395A2DBBB01259915D3A72DDB102B9BB16FA60BEFC63DD588A7230CE08EFCFEEA534F5A0EB005480AD1D169C386E476715238526E936FEA7136E2D8AED60DE31CC91DAE4E764CE5F93624FA7F72B87562FB6AD8996B5E41FD478AF0AF8338A7FD9AA250EFD2F2D20364E8A88A8642E8E38F38583ABF8D3BE97F14C3EDE66EBF8EBC84385CAE646CDED8C5CE8F06910BA7FEC05D828446D558D6FED766FBA347DA2E84DA247C34266AA31C328804F4E3AAF6ACBB0AD50FEECCEC00D20B3610785B9F1BA06A0BADFB42A8F43DE3F7BAC36057EE0B4D2A15DB040A8903F767F7352995C8FC3E06ED1B1322587EEE5B31806192E04B09A7B433D08CB2A340942CB75C51E0F8409F907F69C5F8DC316A227942EDF7A458974FDA76C255FF4F1A85A352CD2CD2A21507E0F37451060D31D0847528B3ED5DA3E7168CBD0302F1B03842E63B3DEC6FB37357E37FC3CC26721F290726A47AB3D4DD8FD1778FE5133726C240E7B3E398F3D809C6C469680B9EFD25DBE890D6936B76A52F97AEF3F93872B76506A95685EECDCBCE203400D182252471B99B7F4C6CED4CAC8FACA7682D0DF07BC5904AAE042479855098CBC41534F0EF17F38F1BC8C272CF72C1AC4A5564DD132130EE676E7D7EC3CABB4E85AC81945C87DE08EC60CED3FA0AB3E83C18AE493A851434BFA2C4968B42ACCCF3609539C62A4E01F8BC159362E15EE91D8AA399D8BD8D67BA1E8FD646EEBB4583812293406B05BA5BE2B1DF9620E6FE3DAF8CEBD9652BB04494B899F407C7D9ED1C4E77FFADE24ABE56AD597BD438928E05B0363D6D2685D34D6B51D71012844415C46F13181B146A3AF25AE4E8853CC7C7EF6387306C45180A6EF9E97ABE1E7D5E10115752C3071B6A213367E8B1A3D1C3703CC1840735315623901D772C61D55EF8C47DB10F0EB7582D7A043018DC1363E93F315DD984B8002EA7BF5BED38D3F273276CA577CF99A635CB6ED9D6525520793405BE27C86E6EFFEABB1E5F84A0076BD151CAFC59853424DE4B3460C673B0820D76E15EE47B6505D2D5C179DB92A44042F3631C646D350EA9721B8984660A76018DCA5C6BB1223CD03CC844DC9371D32549D9D645F75D2683FDAD1DF6434BBE43200E506ED2A815FAB511172C70F99A85FA3970433E8955B2F9389F23C10141B5779A23B8671EAE8B91991B78F635FBE8E627D3E79D91FD1E6E90699640BA3AE8D7E4CF5145F1259CC76AE50B1FA150D8338A9450A5B6B90EEC9C94318BC78C9C7715A3EB215AEE6443540D211A0556813529023E5A581623CD6D19BEF0705A5F69AAD4833A57C308144E92899AC5683147CDBD279D5C3A55BBC5E8F8E26A158A3E42F8C5B858909B024B4BA4069E26DE66460FF4A7DC92BD54AC244007B6AC6CE07A31A2AF3323CB55F07B8F480D279308FE10F2DDB001DA6C4AA132B988AD03FB63E0EB06544571F5505CF377A81153D6FBD4FA2B7562074CFAF587CCF28DAC84AFA58809C0B296E0D2594D3582C28596F5AF7500E143BE7B49C63D04F49BBFBDF60B024DABA5533F945BA90659758E06984921EFEEF79604059EB808C9FE1BF9BC5351A406FBBA7F5D8FC9F891488E537DB14B216A0535C9FF7BF8D5C68A2453A8A48E58FA7BF6EB76448D6D0BD05BD4628C4B852A236A11BEC0F67118F1267CA42647F6F2303509094C9A7F3A07B2724ABD2D9B56B71FA7AC6CDDE456EC209BE76C419855A5151EC9EBF0E0CF1B86F4E8E81B8173960F8D1C8AFFED1AC7B818AF8E3BC092E2B209D693E80B11EC7DA39CA93223E1B47C6127E8AD40A78BDB0ECBFA1F39C84CB9ECDF960ABB39884627BC4105C53EE7BCA4802B92AF60241420CBB36C407F46CC2E953D7E3503CC82287A8D68D0E673E212173D80A12257ADD5256652188C00590DADCFB7DBB6B35507B853EA5FAD4F52E02230CB3D3BBDFC43EB74780583E8DBB851E0257117F4A39A6676586216220C1CA21DE16CDFE6E1CC99EA7C989916AD2FED4A8373CFCFF02207529BFFCB7B7601317450BF430BAC9CE111B0FBA8D7DE6627F863078D8E6286B2D34856426EA90FFD58705444D0DC12D4FEEAD0FFE543811E1EF306F40939922563832D06E6DEA7109087AC051A361EA9E755856FD4E51388BC7C40C63E0953C8413AB0CBFF70C466E15DE5B089D095E8EE8A64E929D26CA3B71EF0B2360AECDFA89284CCE08C666F4E0146362F0BB84B87A49FCF2324EBB96DD941F00E2586F7246436EB66B1E04AF84482D8ECD2BC8EF9955CBEC62AFDD754A7F235C7F3C41CD0B36A9024D426B7388D3C33A5A6E858846C0FB0D88BA5798C923F9B43D14A6661C65092D5C5EC0F97D84784FA336AE6EF57C7A5D04804B96D19849FF9074724A5FACA538E32C6EFAA5209317543159272CE50454FE1E7D068C8F5FF3797A66D5F87758627AB5D40EBE1FB7CE9D69287AE7A5F349A5DAABD8A8E7778BAA26DA0EB237034A3366448280237A165CBB303BE6B33C0F11C1E56C50A84384A0F6878F2A99B14CD3B6820ABD27D2011E0C37F8439BEDE65747038A5FF7F00DAEDA094331523CDB7E10F1063B64A584D3E9F0655268F89DBEF3EA3FA4C6E54FEEBF8F0046C6C811F0767CF6FCC9B3497DB05582774047A8DCFF6A0C1B5188076E64A9D5693195075F2A05E507A5A523EEE4537079F9E5E79210E4AF056D6624D45A0EBA553CA9BC92171451970102CAB57DCD89ACEBBD7025008325C61145264F42E4D14A76E5C2F1C129D4C054DA00501081617D1A27012A6E160750DBA73BECB5DC05105BFDE1F1D0CDC837355844B291B09015FD610628513C1C86EAD373730B99FCD4A552FBA07163CE9CF6A3D3AC0525593F0648256E8B33FBCF92AF58CE26D0F036E11230879DBB789507BCEEFD2960EA320236A224EA74DD2AAAC541664FA3EA9430D4FB09C878169A8AF1E7FD4BE5E7926CB0B6A352B25F452454474107286EDAA145C0A0573361522EACB618DD9C8B32BD1A8A5923F4C698CCA0139DC640C1D5D557CE889BB69CE32D85853DFBB0F34DA2CF18CC79472906B67F6BACBF287F31DE0B9E7A01A356EC9B64653CB922501EA1EDA940089BA0F293B667F482E92438805CD6851776CEA0920CDEFC4062C9B4E51F5AA1D7FF909CC2608B6F28CCF28D574BF67CE80D4DDCCE28F2ADE0162CB66894B5B2DA0EB975CD95EE7FE72FDA2736616C8B571FAC94BF8C64ACD1642D9431118F08A62328D99B2B9D90BBC915DB764C4935951A59C369C72060CD9F4273BDCA0C295294008C0AC3A149E8CA5E8BF21042F5F21C067147F3BB52B13975026A9DF7246AFB1D053670982AB316509F2850342913E1322758ED89DA02DD79126726B1C5566C1831CCB1D62B3E271875E62CDE0DF0715D404F95F580B63923F362D416F83FE5AD98EED584717FBC2CB7D1B00101200F4EB4CA5 - -count = 73 -seed = C7ECD1EC1A3D83F5116C0AA4345FB3ADB4D9F81BD79896BC4932EE2F9D2D1F179BAF7A002D88F4F69071A7931E7F7FAE -mlen = 2442 -msg = ACB414EB55AE5E49107BD0AC5975544F83104F7264495AE0BF0A6D9594C422C16B99469ECCDFE8B8000875B469309891EA42586A615D146DE64FE59277A61631B2C7F7379CD52FAB3871BADE120EE9558D1479A91925634578CF14D35DF3B5672F8B5F9F956FA9F7489D6E37E207FE556017736F6B147A8CF664D0E0521D94737E18188A1B7C30296CCC9067E7B55D6E0F2FBD875F42FEFECAC49510E324968B07372DEB10A31C585457E0C48879CE44BC78898ECEFAC7BCEE90D0F8925DF2B52D5AC81692E0160F8FD5808645498428260F592E29BB90FCB07D0424EC79FB081840CB827CAA4A9D562183D10EE41D281E26CE3EC0069C83E1E446EF82E2E30DEBE3F409E0A9E6D1550E224DB15DBDDA44341E4ED6F8B8984716CA87233197528547D090058607CA141424A13145F1E896555288C5E2877AB3B51C7F9248D2D56A8521975BC4EAE3D009988CBD73C66931BADA0725FB8A3448D43E0C7364E9494FC4E295A700E79972E1FFD626D1CBE0199917851638B192EF9F5C03223F2BBD67EB59A5E8BAEC3DB40616938274201DEA1AE640F6EE7E047CC4C13F80DC65E3FCB5C62386015F4EF1BFEC561E121F9BFA9B2075BC1C4730503FDD5DEBCE8A535ECA01B9D5B021C290854B5F3D49EFFB263DDA34C4E96AEAE9E71A686C009B205994B46CFDF1F76727CA67D415B9D21D54312CDC6A8ED0AEAB96B580D0B419E2058E5D843C17C96D156549962F81C266233ED2B795FAC40B1992B626457F211F08106AD86F5702B9DEB9323A0970AD86125ECA836E0A3D6CCBC380D474049BD96EA246B8BD9542793A66E15B319AECE6BEE17ADBBA7DB337D25F8F642774030A2FF969CB5671F59901CB109E661E55FD5E75EB2A96DC37FEC76A82EB89D020B4916271CFB0CB3342494FDB62EA0D253FB8FF2E91357B33D96D41530B8B5E9550FE9B3F9F34FD5A2A1A6A8BEB93CCC322622F3B5E8487DE19AF57CBD1481ACE02779AD928B17A9B05CBEB722C783B088B5912C2D67CE5073F1801C23170DEB1EB6DDFFC4C33DD25F94F4FBE59D704E478FB49DD2142801C37ED8F539EC1782EBD2F3253BBE19C5A048B9EF41824A811119F3A6AD2A0D4B77338E001358C61A9794572B0C46EB1E0E575D4DA141A415829BA8712B791B625B1B0EA840EE745D9FFE1E99EFD782BA25859351F443654995102CBEFAD7E59D03C9A502ED7B77144D0566E4BFAC086A7DEA356CB9E5AC02DBF7E81D6CEED4A33DA8D801D61BAB5C01F259EE3A99FF7F6D7BF8F2160C4BC3F890736074B000C4C58FA4615880F93FAD43D5657C76045D7C414E6B85F63AAC91F04A616184E04FF9AAD513BA767215FB0331A369D36C0AE9B1EC1268F1D0B43C42B786DB23DD66465B3AF17FFC68C67964C2FC9E41EABC45DB68CD2C3D95B8BEC787D994BB8E9CF1DD7D4C563FCA5D80B3F1FE8E3C7BFB7D171F5B9023BFBCC0CF4371B63C856EDBDA154B4313C47983F4027F9E61E86DA1E8CD787E3E6B50E1DFC9201B9AB92059F8B6D1BF7856CD55C5B1D6C4E6EBF818D481C56F66C79444F5A6544A64A7D78EAD33EB805A6AC4310CD46A2331E707B9B0950CA12092402D68C1CC5C3F269DFDB13AB34B97EAB50B0745BE72BB0FD2D73BEA5DD37802393B635E42A0DEF8544A96E7F40A8D9D06B64E38DC406BD59AC5C4E218591D20B8DBA2125978096517EC5C03F9BC6F96CB255E216EF82D7C7C873029F9E1D98EBC0D8E1312B84B8D02E8D680AA56A506C8668B5B9C56D04CF68E37C7CB1B9377C867240CD42FC7FBDE0AC44E3DCCFD3F877C9923AE9CECE0CBDAB00CA530F434A33F1C939FB88ADEF4D12ACBD8B2B5A139A3FB776D8223A9846465C0372B8C3233FB5280E936BBE9FD49058961463A4419D939F4F1FEA705EB63114F0A3533638DC4D3EFD620147770AD877E2354299CEC6E5C18924E78DD661697ADF89A77C7365522D3E8FC0855187139F7E43E9A0629EE321B2CBD9F007B05C22EFF56FE48045686B36C5BAC2267F37A2E3D4E03E19B1E422ACEA31C2E9F3E7541976D4E2FA03119DF9C4CC2D5418F0FC7A467CD98E290695B9530B91D5DF8C626C7236A5C0FBA73578B9A47491CA0AD26A144B0F23EC23D2C5B2DAA03BF40130F14B9A427CDFF1F232C9CF02426228C570CF1FA7C00A773BC0D70858588542BBF8F581540870897BFAC8387CBBA3416A846CF9F4F5D3F9DCEDD080CC0DE9F71B93828B835430898E82896CD3F30FE2AF8349DB294FB2A8FFC0848692A0B9E8A66EBBFC0F896F8D03E3C6A0C27E0F2177B85A2F6FE31E8AAF14EA5C1FDC54E80CDE47AE27A161264680107023CFFA961E913C4E6AF96C0BE37AD859C334CDB8BBEECB5443662739D027EF1B9535A5A46E2169933E419454025623FD6779F54C622EF81AB9289B50758EA34F868EC85AEE589B08962B85CF537BC733F62AAFA95FD81A60D5C2E38D6EA0DF7D1390BC5050E2463E3E2E3A769DE2A94ABDEDFA0ED67CC0FFAFC5A05A3B0FD37BBE6967BED8DEBF02A42CDC80BDC62158E184FDB6672F7947505E2C0A6C7762B1145C4BAF30E3D32434D22707044DC99D2CF2D38F15C43ABC8632382BBBC9E0F106565906F7D4948D30FB19EDCC3748100397F71E1548E58A5A01876D0A12DCC80000224221C4ABD98A5022506D24BF4D9B9108991AD3421D4AB9CC393DCB8D744F97822F95CBB2640E73E401F044FE20253ACB8B32A75FEDA640E190454BAB695A23B14AE3EF60B00491AB22F622DAA89B6B2E6D18E735672FE0EB2DE269E4E386C926E23B865E1BA22DDA688293DE144102F7030FDE6DF653E4106C08C2467AD7C54D1DF0DC5981004876C6BAA8720F70942700A154A376C8D45DAE1BE74910148EE3F2733E591E1965FE763B58C8B28AF25E9B3C633ABD83F1C0A4F68DA2E0B85083BF97D4E919340C0437A604416C4F629B33039BBF2A1F561548321780411D2E8AC0EDAE76FC3A19F3C84C3BE902A1E84FDF69B11A12DC8B78EF257B5FBB5D923FFD548451A52C6A3AF31C70266AE8A957B2BD72A51A034A2921B8E19321108AC303B0D2E269D032C3DB13F21D558C82BA4158962F2210E1C5FDD96C98D6639AA844F34E40C1B9C909CC6AF1E97A8DC83B78C72B30B7AE400F44CA60AF37770B3D9147F7D6F5A327F34DF7CB8891E71D41D723CB18E0DD324E5CD22AE0D9F2B1D2BFCED0288B7AA73AF4FE0A8181BA1AA7EAE966D0A240E10FE5735D98326A106D16DC49F3FDB19D3A8449C56A74153655600E4C9E38D302C6D4080017D93C628388DF94860329BAA289EFA4587F079C6F03FA03C54540A0AB4B067EE46A5A346F2FBBFF6570ED0166A55C258EABD62AD90F060FADE84E8FAC799F7928285F58557A72E055B535D00BD9A4880D10C05C07CFE7A6FEADFCDED880521803E339F6EAE3FF28A0A471A003358F952320F41A0AEF9D28 -pk = A1E988E4673DE2133BFD383171B86A30FC1E6AB04A8237531EEB5407508FD0BBA87AD29421D089907D91660912FBC303DC91BD972ADE638FD68C728EDEA32CAA8AF5F62AE7E3B4D2284D0D9EE72BBB1F5189A6D2614D7C31DDD189261D7F5603 -sk = A1E988E4673DE2133BFD383171B86A30FC1E6AB04A8237531EEB5407508FD0BBA87AD29421D089907D91660912FBC303DC91BD972ADE638FD68C728EDEA32CAA8AF5F62AE7E3B4D2284D0D9EE72BBB1F5189A6D2614D7C31DDD189261D7F56030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B69D49C6DD30EF93D52B9289755252303EC87F5910391A614156C35FCC505857F8A16A2CDC2292F9AD9FBBADB84B2E3613303A337B21FE02C8A99CD780D418B1065FF8FFFFFFFFFFFFFFD528965AD4B614C414C05DA7EB7C5781B8C3537D6348A053205A9514FD817ED2B9572B066291EE911C879E536549C71DA0888519EDB65D8F8E9D9065427D6399FBF5D3FFFFFFFFFFFFFF1B4994B79623E8E0A81629726BBE66A1C68762ED77CA3CF35CA2D24A9FAF15B6CFB7BE5D39D3909376B4DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCEE4896AF87901939B5B08BCDAC4CD5ED73677244BC00F07AA93D67F14FFCE7AB1C3E1A6CB71D1FCD2C9C50000000000000000000000000000000000000000000000000000000000000090BE9598DD71358640D2633A11B25D0E95BB3998C0D8B005AC7171D552B9B7F7570DD7229C570BFD10A0869FE37E2A02DD618F843638BB9529A83E6920A09A837E244E31D946E334886C1B1DEE66916D7E3D090706F7CD907D44DCF87711AA03185A05AF63F06F2795291635CFD2FF0BC46C1CDF24E7D1E6A4B4ECE04844FF9D185CFA598599FAE5180E99A7B5EA9E00EA92C3CAD88B0B5C92FE4B1918BB2D9AC5C58FE54DD9025CA6874D14484E02EBB038BAD956FC5025911C5737E0848400B379578B468FDB4F34A10EC69431212E38B65A6E5411348B8FD724529633CB1FB3E945A172BB3B033FFC9F3CD1EAD202459DA7CDBC4BD71D6D2230F120B7583A7693652720EE5901F23BE660D7D5B0FD6B8FE44E7B53F71B3E3E9FDE840AD602466CB65F0DCEDB5CBC786334D9D2941FDE1BF410C75E6B627B22BF6066D15A956255559F0C79751FA1B3EB70D10E300230E20060AC715E7584A6B4C2B4A498291BF2136A0521587952904068B2B6EC169668C0F7810FABA857055F4AF4B44800978909E52AB8230D58845AC9B4383810FD9D5DFF0D235AE928278AC7C4B7C6C4F26A0807792ABEC7EE2245BC2CB09301E4C6540201902DDF52BEFBB6FE1F3221593124A844F4343D823C1F7C2464A17379C2316F342A9B57BC0D2111347C0B02E7E54FB67F65916FAFD36B420F20AA98DB7CBBA937B12EF50097604409FF00584CCB91ECD4CA0CEFC9E3E34BCEAAC201561714930DC7FE7B1780D023D4648CA08ACE15F82F4525E13ED3099D1B2AF418DF48DEE4E8A1F944DBFB6FDFA3EF8000BD26AFFEDC98E84A655D9CF3E0173218997646DAE44D592652F326D3F68990D52719F48F19BFD40EC480B65202A6BB000D7F2C2BD296477D343BF5779FC819E7A47D0757E7356B6FD6934F1D3E8030593F5FCBC8395A9E6F8910956878AE4802 -smlen = 2705 -sm = 6D7F44D08C074EC2275F8BA000B8EE974F2A3B1BFBB7BE75E50075EA04D0F03CFFB490236438003B40E0EB4D9257FF8A4F4F56011FAD35C3532E65CFB48D000C0088B0C3C6DB109D4A3EAAF3A900AB149CFCD7AE827E0893E96100FC4561FA03EBF782DE7BB2E600A644A5CAE864E593E88AF9AE0019D97A97AB94E304683043F90153B1D222657D2BFDEE64992C018311C7358C5C50DDB8CF34800026FB3BB7D4D856564199CF8C0018AE69BE9519829D223E56DC0047A882E3931627F4E7B44AB301BE6CF6463AC70D7EBFFF95840001392525828916594C94F7D5C9E9C13C1D740A43448AF4F062B6130392771A2BC021E799B79F097800BF611954E64B5E1AFBD2BAF58C0AACB414EB55AE5E49107BD0AC5975544F83104F7264495AE0BF0A6D9594C422C16B99469ECCDFE8B8000875B469309891EA42586A615D146DE64FE59277A61631B2C7F7379CD52FAB3871BADE120EE9558D1479A91925634578CF14D35DF3B5672F8B5F9F956FA9F7489D6E37E207FE556017736F6B147A8CF664D0E0521D94737E18188A1B7C30296CCC9067E7B55D6E0F2FBD875F42FEFECAC49510E324968B07372DEB10A31C585457E0C48879CE44BC78898ECEFAC7BCEE90D0F8925DF2B52D5AC81692E0160F8FD5808645498428260F592E29BB90FCB07D0424EC79FB081840CB827CAA4A9D562183D10EE41D281E26CE3EC0069C83E1E446EF82E2E30DEBE3F409E0A9E6D1550E224DB15DBDDA44341E4ED6F8B8984716CA87233197528547D090058607CA141424A13145F1E896555288C5E2877AB3B51C7F9248D2D56A8521975BC4EAE3D009988CBD73C66931BADA0725FB8A3448D43E0C7364E9494FC4E295A700E79972E1FFD626D1CBE0199917851638B192EF9F5C03223F2BBD67EB59A5E8BAEC3DB40616938274201DEA1AE640F6EE7E047CC4C13F80DC65E3FCB5C62386015F4EF1BFEC561E121F9BFA9B2075BC1C4730503FDD5DEBCE8A535ECA01B9D5B021C290854B5F3D49EFFB263DDA34C4E96AEAE9E71A686C009B205994B46CFDF1F76727CA67D415B9D21D54312CDC6A8ED0AEAB96B580D0B419E2058E5D843C17C96D156549962F81C266233ED2B795FAC40B1992B626457F211F08106AD86F5702B9DEB9323A0970AD86125ECA836E0A3D6CCBC380D474049BD96EA246B8BD9542793A66E15B319AECE6BEE17ADBBA7DB337D25F8F642774030A2FF969CB5671F59901CB109E661E55FD5E75EB2A96DC37FEC76A82EB89D020B4916271CFB0CB3342494FDB62EA0D253FB8FF2E91357B33D96D41530B8B5E9550FE9B3F9F34FD5A2A1A6A8BEB93CCC322622F3B5E8487DE19AF57CBD1481ACE02779AD928B17A9B05CBEB722C783B088B5912C2D67CE5073F1801C23170DEB1EB6DDFFC4C33DD25F94F4FBE59D704E478FB49DD2142801C37ED8F539EC1782EBD2F3253BBE19C5A048B9EF41824A811119F3A6AD2A0D4B77338E001358C61A9794572B0C46EB1E0E575D4DA141A415829BA8712B791B625B1B0EA840EE745D9FFE1E99EFD782BA25859351F443654995102CBEFAD7E59D03C9A502ED7B77144D0566E4BFAC086A7DEA356CB9E5AC02DBF7E81D6CEED4A33DA8D801D61BAB5C01F259EE3A99FF7F6D7BF8F2160C4BC3F890736074B000C4C58FA4615880F93FAD43D5657C76045D7C414E6B85F63AAC91F04A616184E04FF9AAD513BA767215FB0331A369D36C0AE9B1EC1268F1D0B43C42B786DB23DD66465B3AF17FFC68C67964C2FC9E41EABC45DB68CD2C3D95B8BEC787D994BB8E9CF1DD7D4C563FCA5D80B3F1FE8E3C7BFB7D171F5B9023BFBCC0CF4371B63C856EDBDA154B4313C47983F4027F9E61E86DA1E8CD787E3E6B50E1DFC9201B9AB92059F8B6D1BF7856CD55C5B1D6C4E6EBF818D481C56F66C79444F5A6544A64A7D78EAD33EB805A6AC4310CD46A2331E707B9B0950CA12092402D68C1CC5C3F269DFDB13AB34B97EAB50B0745BE72BB0FD2D73BEA5DD37802393B635E42A0DEF8544A96E7F40A8D9D06B64E38DC406BD59AC5C4E218591D20B8DBA2125978096517EC5C03F9BC6F96CB255E216EF82D7C7C873029F9E1D98EBC0D8E1312B84B8D02E8D680AA56A506C8668B5B9C56D04CF68E37C7CB1B9377C867240CD42FC7FBDE0AC44E3DCCFD3F877C9923AE9CECE0CBDAB00CA530F434A33F1C939FB88ADEF4D12ACBD8B2B5A139A3FB776D8223A9846465C0372B8C3233FB5280E936BBE9FD49058961463A4419D939F4F1FEA705EB63114F0A3533638DC4D3EFD620147770AD877E2354299CEC6E5C18924E78DD661697ADF89A77C7365522D3E8FC0855187139F7E43E9A0629EE321B2CBD9F007B05C22EFF56FE48045686B36C5BAC2267F37A2E3D4E03E19B1E422ACEA31C2E9F3E7541976D4E2FA03119DF9C4CC2D5418F0FC7A467CD98E290695B9530B91D5DF8C626C7236A5C0FBA73578B9A47491CA0AD26A144B0F23EC23D2C5B2DAA03BF40130F14B9A427CDFF1F232C9CF02426228C570CF1FA7C00A773BC0D70858588542BBF8F581540870897BFAC8387CBBA3416A846CF9F4F5D3F9DCEDD080CC0DE9F71B93828B835430898E82896CD3F30FE2AF8349DB294FB2A8FFC0848692A0B9E8A66EBBFC0F896F8D03E3C6A0C27E0F2177B85A2F6FE31E8AAF14EA5C1FDC54E80CDE47AE27A161264680107023CFFA961E913C4E6AF96C0BE37AD859C334CDB8BBEECB5443662739D027EF1B9535A5A46E2169933E419454025623FD6779F54C622EF81AB9289B50758EA34F868EC85AEE589B08962B85CF537BC733F62AAFA95FD81A60D5C2E38D6EA0DF7D1390BC5050E2463E3E2E3A769DE2A94ABDEDFA0ED67CC0FFAFC5A05A3B0FD37BBE6967BED8DEBF02A42CDC80BDC62158E184FDB6672F7947505E2C0A6C7762B1145C4BAF30E3D32434D22707044DC99D2CF2D38F15C43ABC8632382BBBC9E0F106565906F7D4948D30FB19EDCC3748100397F71E1548E58A5A01876D0A12DCC80000224221C4ABD98A5022506D24BF4D9B9108991AD3421D4AB9CC393DCB8D744F97822F95CBB2640E73E401F044FE20253ACB8B32A75FEDA640E190454BAB695A23B14AE3EF60B00491AB22F622DAA89B6B2E6D18E735672FE0EB2DE269E4E386C926E23B865E1BA22DDA688293DE144102F7030FDE6DF653E4106C08C2467AD7C54D1DF0DC5981004876C6BAA8720F70942700A154A376C8D45DAE1BE74910148EE3F2733E591E1965FE763B58C8B28AF25E9B3C633ABD83F1C0A4F68DA2E0B85083BF97D4E919340C0437A604416C4F629B33039BBF2A1F561548321780411D2E8AC0EDAE76FC3A19F3C84C3BE902A1E84FDF69B11A12DC8B78EF257B5FBB5D923FFD548451A52C6A3AF31C70266AE8A957B2BD72A51A034A2921B8E19321108AC303B0D2E269D032C3DB13F21D558C82BA4158962F2210E1C5FDD96C98D6639AA844F34E40C1B9C909CC6AF1E97A8DC83B78C72B30B7AE400F44CA60AF37770B3D9147F7D6F5A327F34DF7CB8891E71D41D723CB18E0DD324E5CD22AE0D9F2B1D2BFCED0288B7AA73AF4FE0A8181BA1AA7EAE966D0A240E10FE5735D98326A106D16DC49F3FDB19D3A8449C56A74153655600E4C9E38D302C6D4080017D93C628388DF94860329BAA289EFA4587F079C6F03FA03C54540A0AB4B067EE46A5A346F2FBBFF6570ED0166A55C258EABD62AD90F060FADE84E8FAC799F7928285F58557A72E055B535D00BD9A4880D10C05C07CFE7A6FEADFCDED880521803E339F6EAE3FF28A0A471A003358F952320F41A0AEF9D28 - -count = 74 -seed = 5DE03CAB3CBD81B8805A17E0FFC2105C3BCDC8D782EAAB161A15AAA543FED59353C1FBE03E7F36B955FC51C9B30F0C93 -mlen = 2475 -msg = 5F7522CE6BD0CE6321C27B9EAA6F572616201F283C5EC171D0BA47662C2320897805E1551ED438F3FCBDAF9DE6F3A19DC16FE9C167A65B6E52BCF512C919561B548496A4A80AF7CE25458A62EAE92EBF677872482D8647C30C12BB1F080C6B9A56560D64FAB73DB17487BBB007C66661EA9DDA14601AB27A100EF4CF4B7447E51418651C03211F8FB884BE91F3980FE13E00EA4ECFE6D54882059A436C90BCAD80E4101CC6C0754417545F2D167629F80A3C5FFE45C00AB2BAF0494D6C065872B03A987A5EE818B3EF11E47FE1747F49E2DB6A14410F0B1F9610A2D6114395EF6EBB231FDF71D595CC1171DB9C89D6CF202E42D4FB968AB8105FDDB2AACB15FAB8014B534CF468D77ECDE2072623B7002620B7AC3E78B62AD673FEEF9F8E97E91ACDAB171FD415B2D15605DDE00D074A770E36F2218F7130F13E91FA4C88DEEA7E854BCAA01B8458D40625A33E982F0955B83080A926EC240E31F0D9BF477EE3A016E146A3909683410D4D09ECDF32EAEF580402F0D416DFC082CF1362E8B79158BD57739AEE56DC41A549E534C7CCF3620C7D7D95B92994A747D5EFB8EC43CFA8189BAA9B75FD54694E512FCA388B71A5B9EA591AE9CFA34183DE59D284AB16B2EFFA4B26A24A0E615B38B83088A9827EEB5C29B419BC061B033E0E3FC809AFDD3DE948412677E0BB5136854532639F3CCB176D54EA1961B5C527EF66F4B3286A583E86208AEEB8ED07D9E6BF1BEB33995F76CA480039A6130775895F19E3CD4873ABE3BF2FA9DE81BF0CB04575DD6AE282720B152CF0EC6A4A04016DB0F3543D8272AE56B1152B02EAF22131420CB194021F97060D5CE52EB21B57CC93964DD21344786E3888617152D2ABD829799CE47D20158AA93F7DA85CA6146C5BB94B512DA053C35BFA8840CA43F6509A1477603FD50F5E4F9A7CF8D2369156989AD638D35D345BDC859C52688211BF7EF3F4AD4944657289406BF01DCBB49D560A11840EF35DBC0C7F9C96DBEA76300CF61997A87D70F5FF8C51AECA2CF0680B6FE8C4025E1E25B62103D248CDEE335F4FCD67597103362003206C507970EA6D78CFF4B68B44244019152DBF812675CF667E5E13C8596EB6FEA3903BFB25ED08F902722A37F8E460E37A03A2D6ADBDF79DA20052DE658390484B83BBAB28D039A303D7376BF555181680B7966C798A1C6CB215257E37739DE7B9706CD1CF3AB031F68C82D6ECFA507C104115040744D74A40C49245215639D0CF4A5A7A10098E9CE3564AC3C44F0683AE9D3094784D354DB1AF439BDDF63D5CCA668D8180264EFECEEAC0BE1B8E1C6418E45F9ED6C779ECF169143B034CD9F332989D445C83A8786398C507B9171B4D95728575539CBB29C5B804268D88F2B39AF1F9572B8DAA9FEEEF69C4A77DC64BF2DBB5E57F8B33AB151769B2D00010D67A2D6F188D6D5B35E5E1873FE2B327E42AFB8885A842D26C246F7C18E6BCDD6FA49B300C65A3822121E95004928104017CBCE2AB95ACADB9802BF4BB049B8E96468353D649654C6F69D774380A5A387D6414DC3000540BAB6ECCBAA088C1068CCEF20036E5C8342FD512F55E6794BF85FE15721D99A1BFEEDC218617A940C8C25D4DFAFEC677D2A719B2CDDCD302294B7FA41AEAB5606F859CC0D638AC94B99AC3EA48C687D278EEBEB396DC5BF2D2E89E880F76B533FA54EFD30D8EE38B34DC5F8AE62C637E9A7E85D99E011F62D261AB4D3DCEB98A8972D3482CF817EFF476B873AC56963BD60183B359713385BA82F6E24BE2D6CFEA6DBB4AD2E1B5B790EE54D23F64E740502E887629B346FC8FCCC3338D0F2921131B84590B32C7CB82CBA8BB3B81EF7BC5CB12F0AA0B3C6A5B2878DC4F868057C68460C71D40D4263AC5C8B8317D2D0B63403C7549439A9EF227268372EC3A54CF8EE97714BC4B55007F92B1A32238659EC1EE27D6F2987AB06FEE84C3AFDFA73240963F076A955BF3C19410E1DA6A19B3EA3AE2DD8766082D3295D35436597783DAFDADB905465D05FC21FA8AC2737A52FA8AAEFBD2ED83F12545C1FA3198FF225D37070694C9392738E89467EDB2DA3CD1734CE398E32BCB1FEA2E4FE1260A2D9F9EDC3607A8AC8A51D5DA36E99B31903025E0CB157FD2FF5B51C9191CC16A9CCB870B4060CFB0FD900AEF62738A58C5726F5164417F084EF14FC0953E3C6036B818C21CA3476B8CC5F8EBAACE257A0315031A03E64E7F749B9DF99BB56CEEBBAA4333BC7270EDEE90FA2715BDDC38D44898A41998B2374B6EE3B8524D3A385C03868EE9479355092C4D20EC32DEB51497F4FF34AE7E7EA4828C288F46E5148DE28A8C660EE132E5B5489833DC66205EC968B60DAB96C2A4452A7019BBA9FE3D19D5829129E2A9C75C39416AC8695145F2B62EB9468198CBD48D7670DDC6AF2F99F77E7ACD01A34EA8E0E974206FBC22656867D09807B980563E06A559B0C3A7E6F43CF8DB75B18C0F90C12FF3BD43ABCE7DF75D17E631C08C974322010648FE2E2BC940E6510FB8835DF8384EFF3FE6A264687256C6BC0A5F9D2DDF208171DB55C4446B03CF27796BC77E3C68D8F1252BE21877D7C53747404420302CA5AE1AB57E43B158BE8B707360A2F59D6A473F98B816FDE2CCEDD92385202C419278E8B840DBA4C05E9BB65F68AE2A635A29110329E8C0C02F6FB5EEE41ED225051EE975F92DA52F93EB1FD7C0A098F6D1421701537298651313514AD31CB333E9C5DA719BBA95E73878BA41F9E2512862A80602AA2DE1E1D086576531330CC7BB8F0CEC38050B3CFAE5C8B1D6CB849A579F2294F8CE80FDE5405BFA3E6ECB01D5117203A4523591AC4030397DE9FF81D5CC91AF3002590F5854E852B88667638B2D052F2A7852425C8EC026E48D9EF5E73D1993D7F3FD7F704760562C36D2278C9CE131EC6AA444D7B2EACA3EE888D9B2AE122688DCB35455E7DE31562BA618F1183308B30D07A5C34020546218101AD42AC5054D4703587FF60E860A60375FAB12734912058D5B0B06430FABBFE0C0B43C22814F56DAE9E2713325A31C682C13F008B9A3D4FFA8A454F0F64A9213FF2D557A4CBC64EC6E4ECA0A976CD9F27497BA544DBAA3E2ECA0F54C2634C719B9C3A2CE37BCC8158A880BAA72780F8B1D3494F589E2AF3044B4FDD86F4DB2DF0843EBD9F3518870F55488F41E234CE94E907A69D28BD83347702750DB1AE2EB1454CDCA37A8B5FC90091F548BABF489E57C8919646E977274FC972088A522FFF9F9306D2F0ED6C01FF92CAE8440D7F3526B8C186D5B96942CB08032886051DA2A9FE77E38BEB18F4FB25F1152EDF9D61347A00A844929976A327BE46FFD3E2EE0B6AB1014294EC5D40CF7071C36B11127FF90720596C1B3065E7DE8010AEA469BB4F4AC5A6EFD20591CEFB7B94B2006D85CA475FEE556F24CC41237C631B75EB594F8342DEB4F976D73AA46563C1AA6D0B605A16152315626BA08807DAA6025CF62B29176F3A85E4BCA483EFFEA7E5939 -pk = A4B3B5E3FEA20B590556C24CE33C32DC3BDC1742CC694B669F06CC291D1728914942230A62C8C933FE65B05FF735CD02BD38A378B1AC4C62FE62CDA9A5B1A524411BEFE0ADBE71651EBA9625258226FAFE4F37F47FC2E9BDC0E82364502BA501 -sk = A4B3B5E3FEA20B590556C24CE33C32DC3BDC1742CC694B669F06CC291D1728914942230A62C8C933FE65B05FF735CD02BD38A378B1AC4C62FE62CDA9A5B1A524411BEFE0ADBE71651EBA9625258226FAFE4F37F47FC2E9BDC0E82364502BA501020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ED6CE2FA42F41B2930CC1A47FF1843A15D0B40A0BE867D022EF22ED1E58A22AFE7DEDBE8F673354E8553A8A076272ED7298E986B4879DA0234A25B4320540AA5DBEBFFFFFFFFFFFFFF7CA54A172B8315672E6952A125B5B6C53507D4CC9946ACCFC3DA8C6B8247089B6D4DCA0792A1387A753E33D934550305C0A20BAF4ACCC71081F34047B6B6E83BC1C2FDFFFFFFFFFFFFFF2CFC05BDCAC7AC4466910F842FF278453CAC1A150144090FF13207A8DF854E98A42F86A5C449F81E0AD1FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3DAE194CC5874B15B23C5F43DB1CC7C4A9BD77A78C61E7DD6EE1A4D263A4121ED2EE9F806EBCC6299EAFD5010000000000000000000000000000000000000000000000000000000000004950C73E508D6C2AD19A4950C76A2D1FB0763ABB327647A94CB1E8AB90BDC8A8A8BFEEACF6128CF28C8B1E3F3EA5A603F0179BF211A2906FEA91A36FF866C0A46A2441E488B8F16F1BDD0E0A16E15903818083017726BD9BDCA1C6C0475DAE01716E7C9C00E33FCB08B9626CC19D83073C1F55DD95E19C5AC77B63BCE157D1C78C07610D219AC3A2A1D785CA6F99C1018D01257BFF2088F824C2DEE8FE19E6086252B1C090542CA1FAFBDDF044A4D94B0792E30699F8BBE7BB97F93989C34E0174BA768535CEA845E3C8E0C055D7F415613CCE5C62E8954D848485B9CDC84265F445DE1EF278A9A748E75FDB33A06403E54E13F29D045316AC2C2D5D79D4CCF399C06BCB380231814478120885EF99BD45F87B0CA82154001F81FC0C340AC303C0A405CAC9614696F95FF9DF2CA10D471FD4B4B04B5C71DB8A297063F60C5E3A71A9AA5B0DBA2D42E39478DAB0D0DD01CC167E27043D562E668FB92D2C462A5AAD691D02A6CA4E6E254ED25628F8F5F5FAD5B6FDBF344BDF117513AC74A5BF00A8332EA26B525BCA7DC53B9A03741B02352BCFD9BF7B701911FD75BC6A91C3ABC24E527922E4DD024FAF994A3FABDC026D09A2DF6AE8E0D05E980AF0888A178B637C30B4FF7C56901DAC42D1D9EA617A07AB8D6AA37CD6C1CDAD1DA97C20520216CBE1BD98567D96789219A7A46C13A2DC8268B77D843CECB689BE1545524DD38DEBDCB61CCC48740DA846919C921802DE10F105C0A9A981773B340654768E6FB241774C15CAE851014278BAC2EB49551C4051438439C493E0F1D0B53E06EE00DA4DF0970B9AFE5106FCBB260BE14C2C04C097A9A7B7C79420E2A51F714B5AC2A960D06111F52F6A94A215B7B496E10290E6BFBF7A20C7E294BE10EE2EAF507B2234EAF363384D2A945C9C8699A2F447613E452BDF4EB3081AA3BFD1E3579601 -smlen = 2738 -sm = 950B516F6EE4AE26B94C6F7601093F064CF76818C8F5FB31E20026893F9B6208D1CB9D04561B0072DC93A8BF6D6C97D71D8A0000F5E2E4B93D25DBFA46A1021E00F7F36AE7768D603FB44B157D01C8F73D7A3EC09927DE1B58020165FA387D5D11AE7E2116FB1B002DE6F012CF393734E4E19C8601836986F1B773AFABCAE3A61C01D48C654CAA0EB1AF5EBAB6C10029727168953628317805C4B10010CD37ED5C01C4CD3E0039260118EF5C5008C0CB3A90B733CE007D1AF51BCC47D8B36B66761C010BC2DA0EA2811DACD1B06AA80101258C1E8A2D1277E75E1CB356B35719A2BEF099FBA03BDD5577120327D523D0900063A3F691CE2601743C4DF50031CF81A86B7FDF9C075F7522CE6BD0CE6321C27B9EAA6F572616201F283C5EC171D0BA47662C2320897805E1551ED438F3FCBDAF9DE6F3A19DC16FE9C167A65B6E52BCF512C919561B548496A4A80AF7CE25458A62EAE92EBF677872482D8647C30C12BB1F080C6B9A56560D64FAB73DB17487BBB007C66661EA9DDA14601AB27A100EF4CF4B7447E51418651C03211F8FB884BE91F3980FE13E00EA4ECFE6D54882059A436C90BCAD80E4101CC6C0754417545F2D167629F80A3C5FFE45C00AB2BAF0494D6C065872B03A987A5EE818B3EF11E47FE1747F49E2DB6A14410F0B1F9610A2D6114395EF6EBB231FDF71D595CC1171DB9C89D6CF202E42D4FB968AB8105FDDB2AACB15FAB8014B534CF468D77ECDE2072623B7002620B7AC3E78B62AD673FEEF9F8E97E91ACDAB171FD415B2D15605DDE00D074A770E36F2218F7130F13E91FA4C88DEEA7E854BCAA01B8458D40625A33E982F0955B83080A926EC240E31F0D9BF477EE3A016E146A3909683410D4D09ECDF32EAEF580402F0D416DFC082CF1362E8B79158BD57739AEE56DC41A549E534C7CCF3620C7D7D95B92994A747D5EFB8EC43CFA8189BAA9B75FD54694E512FCA388B71A5B9EA591AE9CFA34183DE59D284AB16B2EFFA4B26A24A0E615B38B83088A9827EEB5C29B419BC061B033E0E3FC809AFDD3DE948412677E0BB5136854532639F3CCB176D54EA1961B5C527EF66F4B3286A583E86208AEEB8ED07D9E6BF1BEB33995F76CA480039A6130775895F19E3CD4873ABE3BF2FA9DE81BF0CB04575DD6AE282720B152CF0EC6A4A04016DB0F3543D8272AE56B1152B02EAF22131420CB194021F97060D5CE52EB21B57CC93964DD21344786E3888617152D2ABD829799CE47D20158AA93F7DA85CA6146C5BB94B512DA053C35BFA8840CA43F6509A1477603FD50F5E4F9A7CF8D2369156989AD638D35D345BDC859C52688211BF7EF3F4AD4944657289406BF01DCBB49D560A11840EF35DBC0C7F9C96DBEA76300CF61997A87D70F5FF8C51AECA2CF0680B6FE8C4025E1E25B62103D248CDEE335F4FCD67597103362003206C507970EA6D78CFF4B68B44244019152DBF812675CF667E5E13C8596EB6FEA3903BFB25ED08F902722A37F8E460E37A03A2D6ADBDF79DA20052DE658390484B83BBAB28D039A303D7376BF555181680B7966C798A1C6CB215257E37739DE7B9706CD1CF3AB031F68C82D6ECFA507C104115040744D74A40C49245215639D0CF4A5A7A10098E9CE3564AC3C44F0683AE9D3094784D354DB1AF439BDDF63D5CCA668D8180264EFECEEAC0BE1B8E1C6418E45F9ED6C779ECF169143B034CD9F332989D445C83A8786398C507B9171B4D95728575539CBB29C5B804268D88F2B39AF1F9572B8DAA9FEEEF69C4A77DC64BF2DBB5E57F8B33AB151769B2D00010D67A2D6F188D6D5B35E5E1873FE2B327E42AFB8885A842D26C246F7C18E6BCDD6FA49B300C65A3822121E95004928104017CBCE2AB95ACADB9802BF4BB049B8E96468353D649654C6F69D774380A5A387D6414DC3000540BAB6ECCBAA088C1068CCEF20036E5C8342FD512F55E6794BF85FE15721D99A1BFEEDC218617A940C8C25D4DFAFEC677D2A719B2CDDCD302294B7FA41AEAB5606F859CC0D638AC94B99AC3EA48C687D278EEBEB396DC5BF2D2E89E880F76B533FA54EFD30D8EE38B34DC5F8AE62C637E9A7E85D99E011F62D261AB4D3DCEB98A8972D3482CF817EFF476B873AC56963BD60183B359713385BA82F6E24BE2D6CFEA6DBB4AD2E1B5B790EE54D23F64E740502E887629B346FC8FCCC3338D0F2921131B84590B32C7CB82CBA8BB3B81EF7BC5CB12F0AA0B3C6A5B2878DC4F868057C68460C71D40D4263AC5C8B8317D2D0B63403C7549439A9EF227268372EC3A54CF8EE97714BC4B55007F92B1A32238659EC1EE27D6F2987AB06FEE84C3AFDFA73240963F076A955BF3C19410E1DA6A19B3EA3AE2DD8766082D3295D35436597783DAFDADB905465D05FC21FA8AC2737A52FA8AAEFBD2ED83F12545C1FA3198FF225D37070694C9392738E89467EDB2DA3CD1734CE398E32BCB1FEA2E4FE1260A2D9F9EDC3607A8AC8A51D5DA36E99B31903025E0CB157FD2FF5B51C9191CC16A9CCB870B4060CFB0FD900AEF62738A58C5726F5164417F084EF14FC0953E3C6036B818C21CA3476B8CC5F8EBAACE257A0315031A03E64E7F749B9DF99BB56CEEBBAA4333BC7270EDEE90FA2715BDDC38D44898A41998B2374B6EE3B8524D3A385C03868EE9479355092C4D20EC32DEB51497F4FF34AE7E7EA4828C288F46E5148DE28A8C660EE132E5B5489833DC66205EC968B60DAB96C2A4452A7019BBA9FE3D19D5829129E2A9C75C39416AC8695145F2B62EB9468198CBD48D7670DDC6AF2F99F77E7ACD01A34EA8E0E974206FBC22656867D09807B980563E06A559B0C3A7E6F43CF8DB75B18C0F90C12FF3BD43ABCE7DF75D17E631C08C974322010648FE2E2BC940E6510FB8835DF8384EFF3FE6A264687256C6BC0A5F9D2DDF208171DB55C4446B03CF27796BC77E3C68D8F1252BE21877D7C53747404420302CA5AE1AB57E43B158BE8B707360A2F59D6A473F98B816FDE2CCEDD92385202C419278E8B840DBA4C05E9BB65F68AE2A635A29110329E8C0C02F6FB5EEE41ED225051EE975F92DA52F93EB1FD7C0A098F6D1421701537298651313514AD31CB333E9C5DA719BBA95E73878BA41F9E2512862A80602AA2DE1E1D086576531330CC7BB8F0CEC38050B3CFAE5C8B1D6CB849A579F2294F8CE80FDE5405BFA3E6ECB01D5117203A4523591AC4030397DE9FF81D5CC91AF3002590F5854E852B88667638B2D052F2A7852425C8EC026E48D9EF5E73D1993D7F3FD7F704760562C36D2278C9CE131EC6AA444D7B2EACA3EE888D9B2AE122688DCB35455E7DE31562BA618F1183308B30D07A5C34020546218101AD42AC5054D4703587FF60E860A60375FAB12734912058D5B0B06430FABBFE0C0B43C22814F56DAE9E2713325A31C682C13F008B9A3D4FFA8A454F0F64A9213FF2D557A4CBC64EC6E4ECA0A976CD9F27497BA544DBAA3E2ECA0F54C2634C719B9C3A2CE37BCC8158A880BAA72780F8B1D3494F589E2AF3044B4FDD86F4DB2DF0843EBD9F3518870F55488F41E234CE94E907A69D28BD83347702750DB1AE2EB1454CDCA37A8B5FC90091F548BABF489E57C8919646E977274FC972088A522FFF9F9306D2F0ED6C01FF92CAE8440D7F3526B8C186D5B96942CB08032886051DA2A9FE77E38BEB18F4FB25F1152EDF9D61347A00A844929976A327BE46FFD3E2EE0B6AB1014294EC5D40CF7071C36B11127FF90720596C1B3065E7DE8010AEA469BB4F4AC5A6EFD20591CEFB7B94B2006D85CA475FEE556F24CC41237C631B75EB594F8342DEB4F976D73AA46563C1AA6D0B605A16152315626BA08807DAA6025CF62B29176F3A85E4BCA483EFFEA7E5939 - -count = 75 -seed = 63742CEFAE9868C3C0B31DDE0F9D378FD5D71BE7CC3F0B6ECD393DB55FB043CF00264852C45D1836CC12B9C872A20251 -mlen = 2508 -msg = 9FFA507328B2129C9F05A22B81A597FD1B8C27D554B36FD3EB150BC5FA0C6ED967EC5BE6F1E52D3BED1508DC3C841360020CFC2CA1B0713076251F2935EFA8500573CB4634C78A1D0F87D994E8E2B0BD265A877023B54D9A33282C12397DC74CAAB07AC2EFD140DF907651BCD1B37CAB2D03F77CC28872291F1CB28FD4BBB5331C2A18E02120BFD2D9EC0C8938A6D43681DC03527FC2BF59703B5160D8E25D08534EB5AA5CC9C10572257D9E4DB29235683BFE1776A2D9EDACFBA1ADAF66587BC451D32C524C7934556F94776F91CDDA96D2E5CAF91A39503D3A742DC5A0EFEF7C1A13666E200C5E3FD7652D200ADEF51FC5136281570B7832E0C6E7552972E43291F202E6F916C916DC3FA48858F3D92B1B7EFD42DE140D43648AEDD7C7379D7A4B71751A3348B6BBA3B0DB71B4C99C41E085E5536A3F0D2BDDAA88069249E21E2D9906191BBB5C8B45353DE72E00270431847AEB4FF6230CEBD1969A0FB68D6E302B78DA39ADF6C0E681117C8432E24820B9EBF38838545E95CF7AEFCF1E9436CF48E87B6C5181CB418132C7BC050B9498720D7D534792E0585F05DA2735B7E68FE35DEC358DA1BF1681F7F62329BEDFEA3D12BFB26AD9403F3AC1DB96D828050F39DCE4017B45C5DAE4D7DE9E9F687A9D7FAD1AE0E7197184142F6818A63D5617BE9D8D82334A12E68F2EEF88A0DA3A915DE63629550D8A64DF591EECDBD1B89EB40AE9F9D65815271693C85F2CA41BF45E4FA16EF8B17D945EC61E757C6C609D8AFAEE32B3CA628842DB255B619F6562E656F6125FB27195EC82FBEB9C14330DAB649CDB74F523F5A98244194581503356B5B7EC51E2B35AE889452D3457EAD713C0715AA7382DCC510B16E771B3A5A91949FAF5E29223C8F1F861BC3B4E77E095BB61ABA00EB29C065D6F9DA9B4413D61B2202547FB6E34671930EBCDCE4C541B3E2DC90073867A47197E08C96F74ED81DE5F10C37C062E8D82364D67EB185CD098CAC1BC3C522E4FABDF2FBEFB66B9EC6E848F732A737FA7B935EF2848C29B1FB94044996EEF006E251BCEB5BE356F286F0FC85E5CBA627B67398CBFD6C0F520C6F896353FE75BA323D8ECD9D3ED2997580E7E1E49EECD91982C5DA650D6B128068B8D3D72C1EC4BF1FBF121BA96E1CF5F247F9FDA7018CB609329B1C95E59E112C393C45EF7138905902227CD21A39CE30397FF017495BC98A968FB497E03DE5843E64923683F2E402DA63CC25AD0BA13B85E3E379B08DEB39542C06A268BBF44990447190A1F8ADF0D3ED9ED9917886210864CAD84E7C4D1282C4D3BFF9DC23E4FA68EF6B0480E76459D1B5E0A7CC0CFC17F59531C4C1CB1D416B7D009AB50173F706289DBB68201C305E39FEFAD87929EF933006598CE0F0242A2C60955AE487115B4C367A7E49488491A6F044FA8B7AFD81F6DA09D29D4BEFE1B3C9EAFDA4F17D22EAAE0B2D1646906D1CEE65614640B53479E23831C56EBE12B92997D5FEA725D78CA75F4509EEBD3DF4F741D6B2770521BE2AE63CA365FE1518CFDCD5088D58CDFB8D3DBA76731F74760A47C9D619A31B7E318E957194AC5ACC6867CF8C9C235043D5C09240F346FEA840AE0BB16094883FC801DA0BEFAC64A021F6F871413249E9C7F5CCA92F4EAB5713B0F2CD6C950F34BA6FB1CFAAD541BD5FAEA45EA5FB37258301A49D7BC4657E3E986D707213C0F836B030C21593F11518EAE3A8A95A2EFC8B9839E79CD8CB0E6DE59D5A43FF8F81FD35392F0C0659B7679542136782D559897FBCC0129C22F43A30CFB27E899A8CA52453F5459A281D0CC21F902403A596C7F69CBF9A64D97B935AB384FBEA5851D831E8420066826D7E11E34047D18CF08283BE8F29A8A79B0F477C27BC41B8EA4AA010ECF8ECE0D37389FF13E235A4526070F96F415D41AF2E053FD4440DDFFD69799456E7335CC6D9F4370008803F7BABB6C58B6996DC5A52649E25463B5267C188E2DC39B3258636ED8689E5C02E00574988B3AF881D30E9EB38AC51C1E00E1C0A411ECF37E314276221D7D8713F7A449E38371854EA26520ADDB58082287FAA1F77FC04095499A3C3A331A38852A287B24040C1CCC054086964FB1EE2B328F3DE21A986507CD20B4DE4898DFD15045324B93FDF85E5392DE0F32C3BADD04784012E97CB9BA19472B0C20EB0A71C89149EBB601ABAA4A853F2C75DD2622235AC30D97B9D7B1216089B9CC8E879660E40EBCD15203404A8DECADC42114715F4D8A6A10511BACC4DDC23520445A95FA3945BC95878BFF18728E64DE8B7767CFBBAA21F3EF2D92F3D7DFDA792BBE4E5B3381077658BFBEF8DB95B64F9F2A44917B38DF6F9391118978544369C882B218E7A7A31AFC3EB9A75A28095C4478DC81F9CFA127BB749CC53898409365170823D65A0B46BCFBA0E47CC0C5F6ECBEE09131F134EDD254F4F58B50C486DADA13195B1A35739420A45BE6558401F64C3B6AC94B73397925C20545621C7ECDC7DA9F71A755F84D27F2C6D8415D37F2BF1966A76845216E41764AB96DC2E14C12DF3684F7683FDAF5EC771DB7050F81A4B3E516C7D5C955201A18F436962476C1284531764A9397E0EDBFFA8C3699929DAEAF968B4524BD98EE62F9A0DB9CBF99FDA80CC6C57A5EE1099B1EB29799A5B5BF5593CDA26CE2C66DEA3D40545465C1D21F5B9373556B9ED0AE30E90B836003CA83F78E29BD8D49550286DC2DE6407860E9A9CC5EAF3E1B1C73FC2D248B81B1CC8F59DABFB5DAADE6F2A0B38E76D9E6D0125955D08DE7F334A56A8F362CC5D883D56BF7BABAE6D9E425376D34A05AB863A0D9ADF7C6FDA574FA8DC60965E021532C25ED4D568412D4143FBF2C4EC2F230D08337A4E546E01F7C1BFF4C97F2F27AF400CAA57BCF398AA5BFFE155B0F29A085D5053DFBEDC3423818DE8FC597EEAB2C1663D8C81C71CB876F73AC854286063A2E8BD8614D06B80F3BF56381179342143F4C89B8CEFE9168B6A96F416DC617B9F544F9DF65CA6F4F7A84A327909666B70CFFE889C86ACA706A0A1365E248D6B341A004A27D4EE344F03CE6E85D3573E272D48210DF7C3178EFB7BFBEF7765D24754673C9EEC14C7513FD8DE6386B0829EF0980B826EC9C77C81D1E3B8CAA65992DB9C2F8DD691C520FA6F233AFAAEDBF287A57A9A66D2330F4636F02EA3148C4BCD2C8B114D48A1027FB3BD5008D732C427ADEDEC9969AEAD451E166954FDC207C1A4EC409CAC60E42383385187AF44F136F91A8461E62EAFE6FCADD1E491162E46CFBBADDDB72E5B54B7C655CB9489E7F4F7E55C93D3AD50CF84E1F47A706FEDF818A5246BC755D6D18EF18702F5A90CE51812A67227C5E5A051133576E9EBC18AFA18C1B05C854D343727B25BB10E3B9A3645D789287858FA43734D66AD831E8646FE604286544238DC99ACFE3C8285230FC784BB73360F72ED34795B1C46EDBE32A346BFA7F534B500C6C9D3EC26AD7ED20D1500E3DEDF141DF3C2F92E981472F0010A48F25429329AE92CBBB918246F5A53212703C75DFA15D014801A830DEB75BAA36 -pk = 6D2AE9495216825DE7D5357CC3284A44A4C60D24DE77214A1419F07AF4B8C8A9738ECB6C2874EDAD5FD11767900A590095A38E1184542F3DE287306D62C07C544E75268D0A4EC4E52B491BBF27C8619169F3A85A6F1EA8195C0393D1C0FE8102 -sk = 6D2AE9495216825DE7D5357CC3284A44A4C60D24DE77214A1419F07AF4B8C8A9738ECB6C2874EDAD5FD11767900A590095A38E1184542F3DE287306D62C07C544E75268D0A4EC4E52B491BBF27C8619169F3A85A6F1EA8195C0393D1C0FE8102020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023F2F60E0995B3FF3FA59DDF01DCE94795845946FD2301CEFDEFDFA53FCF46DC94C193BEA64E9AD64EDB303A4B3291774903B7F65A1F795723E07A1CDFBDB843952DE2FFFFFFFFFFFFFF5E97E3E4D00D392E5F886E73E3092034515F3B1B78B4B5AF889FD92403B4F0108EA6E69558240912C5F94637F85DC8CED1430DAD1D3CC3EB3FA7F1609492F0E60883F8FFFFFFFFFFFFFF624C434C9F3B28E4989134567C833FEFD140DB4170BC35AD3B43FA0F5F195915DA2CED0D9F08068193522A000000000000000000000000000000000000000000000000000000000000005D6045B72A02BABBD25C97C9416F4B8E9172104FA12C9265E784186ABA8CF95AF03B95D8B35D31A5AF1B58010000000000000000000000000000000000000000000000000000000000008884A46686C5431C1598B13DFC6A4506FCDD99C4686514AB2C770B22959CBBE401B637CECE6132AC6D6CCA98388D130268ABF28D5C0154D42EC8F9C30E39232DCDA2ECB560E3CEF4269749D081025A6799B2883F7C5F77EFC464AC13363706025F8C9C246274B9D9E55A3D74400DF74342995A1FB97EAC7BA9D70AE1B6C53296F82932895236840162F3DF487ADD190040FEA8D052C7A9206D384CAC17FD00626380B096EEFA0C249ABEBC1BC956C969FC8A6BB89E902D21DFD2918C75E03F00FF394364EDE3302EEC707E67D8D36A5D9B5B677E29196E9D4E23C49E08742D514872C22CDE0FF058A976B65C9F5F2F020CDA3FE5FC54856F6BCAC5933DC7D2AB519CA7573C3F3181423B17657465D8CF0489469F510754CD0B7569304DB94F00AD593DA9686AB4F153EF2F543C537DD6FF6539E5AAD8B083A87474239BD365F01905934078E031B7CA15191BC03637035834418E016656212740D6A8731946776F2B71514A863839CBFB45B1700C1B1D5B80E1138DFFA027EBABDAEDD7A2DE02D83DD7C67C2C7E1A6C8CD935C8B66A7C5F99D2A0ED707B69D0982CCF3B74655E39FA32EC33DABD7A0B18C3C4480F180253679C0B16F3F45403916DD93874EB37342EB3B34FD7A99B73C10A45304405B62B1B0E81915CC4B150B7A9A37E182200C38655A76EF1D6999C763FB14813E29FD77ABB62F321ACEA620512A0A13A12EDDA18D84DED31BC19931DD9FD0D80E70288303A3D5CF596D01FE0F720435145A0BFAF075E5BB41C364864BB0B687E200AB5C711969ECBB7CD9F96F39AF9D015038C9EBBFF3883264B7AF6A92F41B53E3DACF7341EA3C60BC559FA6934160292F1F9938580B2E4E0E31C28C7FE7FDD120086247B835CD16BA5E4A23F45D15A47D4C882A6C5FFF2ED7CD0307945AFB420BD25B2101BF488749F5EF76122343B7002 -smlen = 2771 -sm = 9B3D3A2EF8C483E016F6A5D800268C29181932E5242B97C89F00CF4913D80B00ABFED15FA3360024975A0937ABE4BA9B5053900114CD22599E631EA36C340CEB0049106AAEFF49CCB6CFBE33FC013D05994D202D89606F9D37DE009E5277CF1AA7C2ECE716EFED0144DF761C79F09C5F2BD6863B01EE522CED980314DB3FC83ED301C93EF2BF0165F9AD237C188200ECC104E07D749E28F4AF704600301164CBD752B115E0AA423E00F9BD99CD3ED60D9A84B8DA4F0045B6B2C6D97DD1EB6C31FEA801BBE70B2F9BF9D402D25D37710101FDF5320E5062BF9465AA0C537A88E4EA2A460B132A29A5F26B1003C0EF008D849DD3E2BFF6AE970135D594E23107299698438E8217089FFA507328B2129C9F05A22B81A597FD1B8C27D554B36FD3EB150BC5FA0C6ED967EC5BE6F1E52D3BED1508DC3C841360020CFC2CA1B0713076251F2935EFA8500573CB4634C78A1D0F87D994E8E2B0BD265A877023B54D9A33282C12397DC74CAAB07AC2EFD140DF907651BCD1B37CAB2D03F77CC28872291F1CB28FD4BBB5331C2A18E02120BFD2D9EC0C8938A6D43681DC03527FC2BF59703B5160D8E25D08534EB5AA5CC9C10572257D9E4DB29235683BFE1776A2D9EDACFBA1ADAF66587BC451D32C524C7934556F94776F91CDDA96D2E5CAF91A39503D3A742DC5A0EFEF7C1A13666E200C5E3FD7652D200ADEF51FC5136281570B7832E0C6E7552972E43291F202E6F916C916DC3FA48858F3D92B1B7EFD42DE140D43648AEDD7C7379D7A4B71751A3348B6BBA3B0DB71B4C99C41E085E5536A3F0D2BDDAA88069249E21E2D9906191BBB5C8B45353DE72E00270431847AEB4FF6230CEBD1969A0FB68D6E302B78DA39ADF6C0E681117C8432E24820B9EBF38838545E95CF7AEFCF1E9436CF48E87B6C5181CB418132C7BC050B9498720D7D534792E0585F05DA2735B7E68FE35DEC358DA1BF1681F7F62329BEDFEA3D12BFB26AD9403F3AC1DB96D828050F39DCE4017B45C5DAE4D7DE9E9F687A9D7FAD1AE0E7197184142F6818A63D5617BE9D8D82334A12E68F2EEF88A0DA3A915DE63629550D8A64DF591EECDBD1B89EB40AE9F9D65815271693C85F2CA41BF45E4FA16EF8B17D945EC61E757C6C609D8AFAEE32B3CA628842DB255B619F6562E656F6125FB27195EC82FBEB9C14330DAB649CDB74F523F5A98244194581503356B5B7EC51E2B35AE889452D3457EAD713C0715AA7382DCC510B16E771B3A5A91949FAF5E29223C8F1F861BC3B4E77E095BB61ABA00EB29C065D6F9DA9B4413D61B2202547FB6E34671930EBCDCE4C541B3E2DC90073867A47197E08C96F74ED81DE5F10C37C062E8D82364D67EB185CD098CAC1BC3C522E4FABDF2FBEFB66B9EC6E848F732A737FA7B935EF2848C29B1FB94044996EEF006E251BCEB5BE356F286F0FC85E5CBA627B67398CBFD6C0F520C6F896353FE75BA323D8ECD9D3ED2997580E7E1E49EECD91982C5DA650D6B128068B8D3D72C1EC4BF1FBF121BA96E1CF5F247F9FDA7018CB609329B1C95E59E112C393C45EF7138905902227CD21A39CE30397FF017495BC98A968FB497E03DE5843E64923683F2E402DA63CC25AD0BA13B85E3E379B08DEB39542C06A268BBF44990447190A1F8ADF0D3ED9ED9917886210864CAD84E7C4D1282C4D3BFF9DC23E4FA68EF6B0480E76459D1B5E0A7CC0CFC17F59531C4C1CB1D416B7D009AB50173F706289DBB68201C305E39FEFAD87929EF933006598CE0F0242A2C60955AE487115B4C367A7E49488491A6F044FA8B7AFD81F6DA09D29D4BEFE1B3C9EAFDA4F17D22EAAE0B2D1646906D1CEE65614640B53479E23831C56EBE12B92997D5FEA725D78CA75F4509EEBD3DF4F741D6B2770521BE2AE63CA365FE1518CFDCD5088D58CDFB8D3DBA76731F74760A47C9D619A31B7E318E957194AC5ACC6867CF8C9C235043D5C09240F346FEA840AE0BB16094883FC801DA0BEFAC64A021F6F871413249E9C7F5CCA92F4EAB5713B0F2CD6C950F34BA6FB1CFAAD541BD5FAEA45EA5FB37258301A49D7BC4657E3E986D707213C0F836B030C21593F11518EAE3A8A95A2EFC8B9839E79CD8CB0E6DE59D5A43FF8F81FD35392F0C0659B7679542136782D559897FBCC0129C22F43A30CFB27E899A8CA52453F5459A281D0CC21F902403A596C7F69CBF9A64D97B935AB384FBEA5851D831E8420066826D7E11E34047D18CF08283BE8F29A8A79B0F477C27BC41B8EA4AA010ECF8ECE0D37389FF13E235A4526070F96F415D41AF2E053FD4440DDFFD69799456E7335CC6D9F4370008803F7BABB6C58B6996DC5A52649E25463B5267C188E2DC39B3258636ED8689E5C02E00574988B3AF881D30E9EB38AC51C1E00E1C0A411ECF37E314276221D7D8713F7A449E38371854EA26520ADDB58082287FAA1F77FC04095499A3C3A331A38852A287B24040C1CCC054086964FB1EE2B328F3DE21A986507CD20B4DE4898DFD15045324B93FDF85E5392DE0F32C3BADD04784012E97CB9BA19472B0C20EB0A71C89149EBB601ABAA4A853F2C75DD2622235AC30D97B9D7B1216089B9CC8E879660E40EBCD15203404A8DECADC42114715F4D8A6A10511BACC4DDC23520445A95FA3945BC95878BFF18728E64DE8B7767CFBBAA21F3EF2D92F3D7DFDA792BBE4E5B3381077658BFBEF8DB95B64F9F2A44917B38DF6F9391118978544369C882B218E7A7A31AFC3EB9A75A28095C4478DC81F9CFA127BB749CC53898409365170823D65A0B46BCFBA0E47CC0C5F6ECBEE09131F134EDD254F4F58B50C486DADA13195B1A35739420A45BE6558401F64C3B6AC94B73397925C20545621C7ECDC7DA9F71A755F84D27F2C6D8415D37F2BF1966A76845216E41764AB96DC2E14C12DF3684F7683FDAF5EC771DB7050F81A4B3E516C7D5C955201A18F436962476C1284531764A9397E0EDBFFA8C3699929DAEAF968B4524BD98EE62F9A0DB9CBF99FDA80CC6C57A5EE1099B1EB29799A5B5BF5593CDA26CE2C66DEA3D40545465C1D21F5B9373556B9ED0AE30E90B836003CA83F78E29BD8D49550286DC2DE6407860E9A9CC5EAF3E1B1C73FC2D248B81B1CC8F59DABFB5DAADE6F2A0B38E76D9E6D0125955D08DE7F334A56A8F362CC5D883D56BF7BABAE6D9E425376D34A05AB863A0D9ADF7C6FDA574FA8DC60965E021532C25ED4D568412D4143FBF2C4EC2F230D08337A4E546E01F7C1BFF4C97F2F27AF400CAA57BCF398AA5BFFE155B0F29A085D5053DFBEDC3423818DE8FC597EEAB2C1663D8C81C71CB876F73AC854286063A2E8BD8614D06B80F3BF56381179342143F4C89B8CEFE9168B6A96F416DC617B9F544F9DF65CA6F4F7A84A327909666B70CFFE889C86ACA706A0A1365E248D6B341A004A27D4EE344F03CE6E85D3573E272D48210DF7C3178EFB7BFBEF7765D24754673C9EEC14C7513FD8DE6386B0829EF0980B826EC9C77C81D1E3B8CAA65992DB9C2F8DD691C520FA6F233AFAAEDBF287A57A9A66D2330F4636F02EA3148C4BCD2C8B114D48A1027FB3BD5008D732C427ADEDEC9969AEAD451E166954FDC207C1A4EC409CAC60E42383385187AF44F136F91A8461E62EAFE6FCADD1E491162E46CFBBADDDB72E5B54B7C655CB9489E7F4F7E55C93D3AD50CF84E1F47A706FEDF818A5246BC755D6D18EF18702F5A90CE51812A67227C5E5A051133576E9EBC18AFA18C1B05C854D343727B25BB10E3B9A3645D789287858FA43734D66AD831E8646FE604286544238DC99ACFE3C8285230FC784BB73360F72ED34795B1C46EDBE32A346BFA7F534B500C6C9D3EC26AD7ED20D1500E3DEDF141DF3C2F92E981472F0010A48F25429329AE92CBBB918246F5A53212703C75DFA15D014801A830DEB75BAA36 - -count = 76 -seed = B887F07DB5358C3FDC2402947BBC87ABD064B02A859FE8DB37B5BCBB916020443DABA5534A0778FD0B1C05EF3ABE6269 -mlen = 2541 -msg = E7E845902E852B331EF9923416E492C1641236E4E72408D800FD70774BA32B6B4BE04B6E82237A247D26F9A33AFC4745C16CE0554774C68B33CFC6E67AE34E42038FC6C324972642338DAEA75982C71720F1EC9542DF94B38434DA34A2003FABD9DAEA1950B7751DA6C81AFF7D03390F5D63455D417F5D12A510337A16197EBAF921B6A7A9A9A58F9696418ECED6B27CB8EFC8ECBD9B68714F721561AF8553A0D84E30E009A8985D011CB994EEAAF88C76F7F3261B47FC174155C138DB2EADB09A06073B211FC0D27113E8FEA0DA56E181CF532BA8207F5D80D6A30D8BACBA540D49A81A0763A0467DBA7883766ED6358E809261AA3D8B757C839B532F272C5767671A3A8BF3391B14F5E97BF2668A4E98847F1ABFA21E2370870DDF24504F89B3DB71E210C46D66EA7296D65C926E2C955D899AC830CD9D06808A68E9B3722B86E878CF21A5E5D41D7F3CD95D23A6344C259859735AE1A953ADE13CA103692B33AF90ED0345C7B038D938F8F494D90CBD3933B2A80FEDC2BE57960DB23AD018BAC63017A04FCC510553226CD86C74AB90E13C72A1BE12E4D751DC670A98EC4F81E9F8954A693FC7175BA7E50D340FF7F15D568D0ABDED0BB1FC557B1E55971B4C4CE8CC1B4D9E239C73B1133C9E1672DEE36A2D9527F315C21764648643D866B0E2AB6D2DEE61D838BC5DAC183FC511C4501B6E535ECC54F3EDAD6E8EDBF0DE7CB70BEE861B2BFF0D41BB87FFC0EBCAEE9A6DFB98D31D35CFB6DC0442FC285AD0879E7B218B6E66453FE04207FE814C5F72E49406B48FCB1DB145753DC2A2D3E9793594F7EF1A1A6339619E1040CDE605648234A51B2F6774B31C7F9A77C2CE3B98819132BB725D288C65901F7001E05FE5326B6F701C337D41C8CF8748FF9C276ECD398C725C36C11857605F58C0B154DD9F3C1B4649AE677533EB0338B7475254E273B786C2FE7DB4C13468CAF0AA2AECD55DC1A5F868C8EDFFD8BE8DEEC20A9FAA621C4680F3EEF4DFE4A79794FCBC5F8C56EEDCC3E1963569A36525D4F6A5BDBBA5D12966FD8A0FCC70783FD9F61613842F80D000C9281CBDF28C01C6F6AEAC10DF1DDCD0322E00C4E3CC801EF091D9C1B01E84DCE725D57C800D38990251AA1D1206AD93A7DDA40F27726D6A03D973150F7A88703724E314C0953D56DA6EAC442A70C2A08BC66BFA2B0EE11E185131E352D10DD714DDE502097AF0AD155AEEEC2A6B93B149B75DBB898B2B3A7C5FEF2F48D9B12A580F54C4EEF3FF83A4F13F2F194AF551D4800AE86AAD6EFC82CE460D325CBCFEE3400AE939431AB4070D7A7CC005F270896051E32B1051E58941530E250F05AF19FF416E65CE40655FDA31D2E7A6158E07DA08FA61AFD5319B682DE44AFAE146129A8B769C1708A5D3479B6C910B2FF0FC872A4A41AA8BF3EE16F80011D163B599D18501335A2BE10CF117DDA094FE01596C404C14580A7075D04CEEF68BD8F813D7DE6599F478F3DE9CE60B294CB7CE5284A61E078939D08F3D4FD998ADD3B92532AA54E0C31087CF14BF4EC964EBAAD53BD15D04E37948E94917DDE181EE3BB2346335FFB403B000F5669019C5281D88A0E771176E49DD0BA22E719C0B731EC2AAE9C898E74B2967BCBDCE0D7D73057E004BD62269F4E7F3823DCC18CD6C551104B9B896B0AD138DDE7C3D761138641BD3EFF3DF1552659FD97BDADFC59A05CBC622A4492A1B22CFF72AC197D61A4C5A949AA9AC09D4C1112F4C1B1CAE353C70278A21663E11F27E9EC66ECD4AD56F2179A3FCEC37AC3A3F4B33C06BBBD4C8CE8E74825BBDA3E58A2E2D928C2C6E6D886274BC0E2175AB03D8721C664FBD6455DB2960E3AEF0BB25AFD3CB0BAFB71A2BD18A89ADAEE00AADBC7E4AE70ED4B534AEEAB88559194755F9656B43BC83E3952000D9E2295BF3391904218A015C786DE0144868EE4AED203B261FE743B7168788A0680F7484792A3F64782B2B1ED9217B09AE9845DD71ED363F18E8AAECD51A4F5913AAB33FEA3FC5F1E37E0CD6333D2A8347CF45EB7C4AD967FE6FCFFF3565743435EF09A646E75C7E968ECF4202A9B2C23AA8118A1683219B1155C2CABC95C696704F5B270C6D213332649363AE13EC811E9A1090D1603EFF745E2FA83379DFC6DA5EFECED556E46A8A5FF1F2A5C0D911B95C20EC2465AD0C96AE7E16FC36143762BBC0734CF4D6134DCB0D739F7822470E0ABF66A0AB15CE0D6096D3ABBA2CA4C81C1C68BDC252A8A4BA609B7C05CCD913EA56126F418FC0B06DE8F76EF651F8085604C16E5910F3B8651AB78296B56B78326E41AC15774E442017FE5B291E5227EF5A4B78CCFA96D6921C8542A8A984BC87E2678903869C52C2568FEE4E23EF3CC466CE270614E6472244A4294B31F9438F7E43437FC9C9C5F3EFB0F4F0AF2110A613661DC24A1C7F7A7F8CD14A943821F16F94BD874F1A32E305DB4776CDF6633446724CCBB2488B1B06F0177819D53885127E6EB717C0D6718366A8B8A089AA6AB17CB2581A75EC748123B7D0383F3900EFCFF77D2E022E90AA41491117758221A0B149C8EBC23CC01C17B9FD39118DAD413A391CFA0A5C614208060A61646C7CF1DFAD4ABC3A9CC5CD566DB2AC8FAF392C9D8E7DA0F84B941D792A8493FBEBAD30D0DAA0D683DCC1583F0C9019622EB6C92FBC475BABC8B626319BE2264ED873AC063F84B7F83688AC99D732A1E3FC12281BFB1E1E63D48BFBFCA619BF4B95F899C50AD0F5FE4673347DF2BBF2CA21BEF49C7F8440D95A83299960F1E42B457ADDCCCE236946DE80FD4862BAF36387E041DEAAC3C9751AE345512BB1F423A3B4CA8D3A5E3796D289641D3424FF22670A46552EC68D7D095E8636441D777DBE2E9DBF6B5FEDE5318516C3886B943F6ADF17D8B7CD40B20A48233C9FD981145B45A5CB8F6A88EAA36C270E93E1D876D7781BB92A1FD99727D8E0AE34C73398AB8781BB342F5AACF4081459EA5EC20C30CBB6122344C457F92B20448F78E1A2A291202003781EBDA1747061C6CE1F8BF882FEA4FB50BFE638685CD638EEC15BC24252567025FC5C16ED1F5D98DD90C76E720EF7B4E25A20D262E339C5E5BB5A9CF051BF5FD1F63E93452A179277B57956821CDD901F1C01E634AE18485708A6ED8F592AE2EF3A9D54C9734FFBADC6F0B86D0398AECE9374F9ACAFEF38D4B97BE9B932B9852F97AEEC435311A67AE344AC1985738C72F52B3D8B71F64A916240477FDDC5FAF02F8224EB35D310FEA03FD2C5933047355A438676D92EADF70DF662D97C2F5E00CB293053699D51D302B78145C77AB03F34EAF170EDA5215436FAF0238A4B0D41D29F36052A5278C7D8AF9A6FFC6E2B6FFC4C5D524F7640A7170957F3DE2451AC75589CE328B61EA7179FD990DA1698F5C73BB8639A4DA2AD67D364DB04771CA118C4055C25F1120A0643158C07CD22B375D5C1DFA26FFCDA44921F41D4A504B2279DFF03421CAD19960F87C6B6DD8C29981CB66C9731F931E43B0D97C6AC9862E2CF711DF0DED8E4D06F3957FFF9085A95D9FCC95610FDE22856B229A3121D8B81EE83DEE4A6A9FA3FE8C75351574CB000BF7F3746CA1CC5414AEB23A2 -pk = 079B7AF9264C7352ABE8F09C965FB85684A3EFF64963B093937A38AE5DE6B4B8389A2E7496BED9363D54954D159EDF0296D0D69ACB53D26DAE8BA33989A7A1CF3BFBD3198901B55F0E7B3EA985797D684EE87C54F354422821D7DC8BECCF0201 -sk = 079B7AF9264C7352ABE8F09C965FB85684A3EFF64963B093937A38AE5DE6B4B8389A2E7496BED9363D54954D159EDF0296D0D69ACB53D26DAE8BA33989A7A1CF3BFBD3198901B55F0E7B3EA985797D684EE87C54F354422821D7DC8BECCF020102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003B24F8E61142C7D58ECF12307EBB582069256A9765180339EE02C6800140A00E7EED224F96C3FDAA05026CFAE835CE5CB3836DF25E6A0295FA978F688E71267E355824000000000000004CFCAC0369A9C19BF967406208D774FB1A258151C41F026DB0A4C7E03790F507D113ED741FB0D06BE4659F00C91202AFF9D2FF4C15428150D49260B9C2760DAB952E0300000000000000441460EC469A6992B8951B0C4A603529292B0B1B721C0680E97042DD479FEA46780A94A1A9B5F274FFEC46FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0511D9F523AFF9B058C953F1BB8B3E7091F751B6762907700694A98BE86AA7C570F202C541F3726768CF6F010000000000000000000000000000000000000000000000000000000000000EBB5E99678923ECDF5D340AD231BB71F6FB128464BBDC2395016128DC2F71CC411E3F927F653A8ECC388B552C1F3B02A34FB7BAB94612C5E38280328B5F99C52D3CFB05F59541D3F713B012D9F10EFCDFEC222852522299B74FCB8AE6C75F02F20EEBE5DB53BF3333A6DA16DF7137F246FFF4A2C587CA984807FCD38A361A1103E9F9F3F4D86B451B7893ADA606F30147644978B4C8F3242D215A96E8FDE9059264EFEA8494A77246AE22AD09B70F04B36CCF59D66D3C556F488E866B0C1701DD82BCDC9695DBA6BF24815F2D68ED36F1C58B0D4794F51A7EF6C9AF34A68B679F64DC3D57AA4A5BA46D0212F4D64F0027B3A341D5AD9D924A8205FBA9A95D119F1E76AECE2F0AC1F1D92EA81C4AD69B34C6122EEF61C40BFD2986513B9A1701BE115A42C0A2AAF4FD671F12B218139299E711572B42EF57B2182659C5D01199211C524E5FCC90F43D8E81778A5E2900EFD2504F4222F610B6687BF32E6259F93CC85CF0044881DAEC17CEDC1B3EDE7C96FB6149D4E7A999937608887F6A80014C36A353D2A5A85B08FCE41C271C5356D571DB4637B5CC6813E7583CA43FA92B03CB130FC8A663292C9981A34B020F03BE11F97602324582FF963B3470A8FE419F7FFBCF13ADEC367A5AEA8D2022C5FBC94FC5050CEEB704643E1D3931A3C900CEA5E15B59751A99BE95110250169CF73FB6E0DC7228D34D4C5D26EE810DE6979FBB67C4F481521D1126E2FC5CEA100249FB2400A44BDC13709659DF4DDCB0B30C3293E3EBE5410E08D65BF45F3045B9B345354974B876A023313E6AC3765203198CBE539B87E3DDCAA47085FB01A35A7EB2CB963090454D5C4250637FAC41A0024BEC6D7D6122E4C60E69660F2D8B025161CF04160C85FB35F6BCDAE128B6A04C8C882047F3DE4BFFCC460EB6953EA4F6E39E95B21B3D3C849D6E8FF169F501 -smlen = 2804 -sm = 70EA2F4F81BA2E2ECD861F3601FE875430CDDEF5A93F7EF225014312E90D4221F49E6A015958012B868ADE82A31AF78740540300090F17D7B0A85C832EEAF9340007F8BBC7F3717A249755CB5C015E6C7C216F02310EDF0BCADE018C0C42D76821245F77C171C501A9243B7876CE684D21B7CC8700CD9354A4AEDC40E05D4334F700CB5D3088ABA559B5F5BE8886001253EE242A2C7CE07F41008A00CC4FB5552E6091378EBAA4C0014BF040FA75BC420244E8F53B017DE050E62C59F8BCC1CB612300110A57237F237EADD496F5A601003121AE248DF91088F302EE652F35ACDE8E0A0FC68E8C4F706B0701E08D9705AA204B94F55B5F16013D11F47F19ED0B5947530F7BD105E7E845902E852B331EF9923416E492C1641236E4E72408D800FD70774BA32B6B4BE04B6E82237A247D26F9A33AFC4745C16CE0554774C68B33CFC6E67AE34E42038FC6C324972642338DAEA75982C71720F1EC9542DF94B38434DA34A2003FABD9DAEA1950B7751DA6C81AFF7D03390F5D63455D417F5D12A510337A16197EBAF921B6A7A9A9A58F9696418ECED6B27CB8EFC8ECBD9B68714F721561AF8553A0D84E30E009A8985D011CB994EEAAF88C76F7F3261B47FC174155C138DB2EADB09A06073B211FC0D27113E8FEA0DA56E181CF532BA8207F5D80D6A30D8BACBA540D49A81A0763A0467DBA7883766ED6358E809261AA3D8B757C839B532F272C5767671A3A8BF3391B14F5E97BF2668A4E98847F1ABFA21E2370870DDF24504F89B3DB71E210C46D66EA7296D65C926E2C955D899AC830CD9D06808A68E9B3722B86E878CF21A5E5D41D7F3CD95D23A6344C259859735AE1A953ADE13CA103692B33AF90ED0345C7B038D938F8F494D90CBD3933B2A80FEDC2BE57960DB23AD018BAC63017A04FCC510553226CD86C74AB90E13C72A1BE12E4D751DC670A98EC4F81E9F8954A693FC7175BA7E50D340FF7F15D568D0ABDED0BB1FC557B1E55971B4C4CE8CC1B4D9E239C73B1133C9E1672DEE36A2D9527F315C21764648643D866B0E2AB6D2DEE61D838BC5DAC183FC511C4501B6E535ECC54F3EDAD6E8EDBF0DE7CB70BEE861B2BFF0D41BB87FFC0EBCAEE9A6DFB98D31D35CFB6DC0442FC285AD0879E7B218B6E66453FE04207FE814C5F72E49406B48FCB1DB145753DC2A2D3E9793594F7EF1A1A6339619E1040CDE605648234A51B2F6774B31C7F9A77C2CE3B98819132BB725D288C65901F7001E05FE5326B6F701C337D41C8CF8748FF9C276ECD398C725C36C11857605F58C0B154DD9F3C1B4649AE677533EB0338B7475254E273B786C2FE7DB4C13468CAF0AA2AECD55DC1A5F868C8EDFFD8BE8DEEC20A9FAA621C4680F3EEF4DFE4A79794FCBC5F8C56EEDCC3E1963569A36525D4F6A5BDBBA5D12966FD8A0FCC70783FD9F61613842F80D000C9281CBDF28C01C6F6AEAC10DF1DDCD0322E00C4E3CC801EF091D9C1B01E84DCE725D57C800D38990251AA1D1206AD93A7DDA40F27726D6A03D973150F7A88703724E314C0953D56DA6EAC442A70C2A08BC66BFA2B0EE11E185131E352D10DD714DDE502097AF0AD155AEEEC2A6B93B149B75DBB898B2B3A7C5FEF2F48D9B12A580F54C4EEF3FF83A4F13F2F194AF551D4800AE86AAD6EFC82CE460D325CBCFEE3400AE939431AB4070D7A7CC005F270896051E32B1051E58941530E250F05AF19FF416E65CE40655FDA31D2E7A6158E07DA08FA61AFD5319B682DE44AFAE146129A8B769C1708A5D3479B6C910B2FF0FC872A4A41AA8BF3EE16F80011D163B599D18501335A2BE10CF117DDA094FE01596C404C14580A7075D04CEEF68BD8F813D7DE6599F478F3DE9CE60B294CB7CE5284A61E078939D08F3D4FD998ADD3B92532AA54E0C31087CF14BF4EC964EBAAD53BD15D04E37948E94917DDE181EE3BB2346335FFB403B000F5669019C5281D88A0E771176E49DD0BA22E719C0B731EC2AAE9C898E74B2967BCBDCE0D7D73057E004BD62269F4E7F3823DCC18CD6C551104B9B896B0AD138DDE7C3D761138641BD3EFF3DF1552659FD97BDADFC59A05CBC622A4492A1B22CFF72AC197D61A4C5A949AA9AC09D4C1112F4C1B1CAE353C70278A21663E11F27E9EC66ECD4AD56F2179A3FCEC37AC3A3F4B33C06BBBD4C8CE8E74825BBDA3E58A2E2D928C2C6E6D886274BC0E2175AB03D8721C664FBD6455DB2960E3AEF0BB25AFD3CB0BAFB71A2BD18A89ADAEE00AADBC7E4AE70ED4B534AEEAB88559194755F9656B43BC83E3952000D9E2295BF3391904218A015C786DE0144868EE4AED203B261FE743B7168788A0680F7484792A3F64782B2B1ED9217B09AE9845DD71ED363F18E8AAECD51A4F5913AAB33FEA3FC5F1E37E0CD6333D2A8347CF45EB7C4AD967FE6FCFFF3565743435EF09A646E75C7E968ECF4202A9B2C23AA8118A1683219B1155C2CABC95C696704F5B270C6D213332649363AE13EC811E9A1090D1603EFF745E2FA83379DFC6DA5EFECED556E46A8A5FF1F2A5C0D911B95C20EC2465AD0C96AE7E16FC36143762BBC0734CF4D6134DCB0D739F7822470E0ABF66A0AB15CE0D6096D3ABBA2CA4C81C1C68BDC252A8A4BA609B7C05CCD913EA56126F418FC0B06DE8F76EF651F8085604C16E5910F3B8651AB78296B56B78326E41AC15774E442017FE5B291E5227EF5A4B78CCFA96D6921C8542A8A984BC87E2678903869C52C2568FEE4E23EF3CC466CE270614E6472244A4294B31F9438F7E43437FC9C9C5F3EFB0F4F0AF2110A613661DC24A1C7F7A7F8CD14A943821F16F94BD874F1A32E305DB4776CDF6633446724CCBB2488B1B06F0177819D53885127E6EB717C0D6718366A8B8A089AA6AB17CB2581A75EC748123B7D0383F3900EFCFF77D2E022E90AA41491117758221A0B149C8EBC23CC01C17B9FD39118DAD413A391CFA0A5C614208060A61646C7CF1DFAD4ABC3A9CC5CD566DB2AC8FAF392C9D8E7DA0F84B941D792A8493FBEBAD30D0DAA0D683DCC1583F0C9019622EB6C92FBC475BABC8B626319BE2264ED873AC063F84B7F83688AC99D732A1E3FC12281BFB1E1E63D48BFBFCA619BF4B95F899C50AD0F5FE4673347DF2BBF2CA21BEF49C7F8440D95A83299960F1E42B457ADDCCCE236946DE80FD4862BAF36387E041DEAAC3C9751AE345512BB1F423A3B4CA8D3A5E3796D289641D3424FF22670A46552EC68D7D095E8636441D777DBE2E9DBF6B5FEDE5318516C3886B943F6ADF17D8B7CD40B20A48233C9FD981145B45A5CB8F6A88EAA36C270E93E1D876D7781BB92A1FD99727D8E0AE34C73398AB8781BB342F5AACF4081459EA5EC20C30CBB6122344C457F92B20448F78E1A2A291202003781EBDA1747061C6CE1F8BF882FEA4FB50BFE638685CD638EEC15BC24252567025FC5C16ED1F5D98DD90C76E720EF7B4E25A20D262E339C5E5BB5A9CF051BF5FD1F63E93452A179277B57956821CDD901F1C01E634AE18485708A6ED8F592AE2EF3A9D54C9734FFBADC6F0B86D0398AECE9374F9ACAFEF38D4B97BE9B932B9852F97AEEC435311A67AE344AC1985738C72F52B3D8B71F64A916240477FDDC5FAF02F8224EB35D310FEA03FD2C5933047355A438676D92EADF70DF662D97C2F5E00CB293053699D51D302B78145C77AB03F34EAF170EDA5215436FAF0238A4B0D41D29F36052A5278C7D8AF9A6FFC6E2B6FFC4C5D524F7640A7170957F3DE2451AC75589CE328B61EA7179FD990DA1698F5C73BB8639A4DA2AD67D364DB04771CA118C4055C25F1120A0643158C07CD22B375D5C1DFA26FFCDA44921F41D4A504B2279DFF03421CAD19960F87C6B6DD8C29981CB66C9731F931E43B0D97C6AC9862E2CF711DF0DED8E4D06F3957FFF9085A95D9FCC95610FDE22856B229A3121D8B81EE83DEE4A6A9FA3FE8C75351574CB000BF7F3746CA1CC5414AEB23A2 - -count = 77 -seed = D08A139CC7147ECAF4B1D1E434EB2EFA2B2607B0033D8BA989133E496DC9F3654944C7AF91CBB79866443E8C4E8217ED -mlen = 2574 -msg = 34FCF4626248B979A7A8D306CB9ED69C4CCB5CC3729D2692E0BA679D5C2FEAAC54A4E06D4EFCEDF78E19357DAE263E1B5D107FB09618A9C34F54F19A738A66B95E6F88E20E01F879F53E8F4C371B571E1438FF70E0A8CD00D608976E24501B2DDD323EFE6C1302A318CAD821C6FFE641672BB80AC62286C69FCFFD93422911C46D43DC9A1F00A73E19EBE6CC09A9801F2A1DA708F0F1F98E7F1A18529010823230279F487911CEF1E784A229D9E311BCE5E2D368E6D613F791DDD617D0F37F604B786CA2BAB754E8BC4BD3DA37E66A54DF1D3B268A5A80379A30A52B1532E8CFABE24168D83CBFD61E2346F901C361F771E0BE3E03DAE8CC30614C10FB8DCCDCAA5B9A25DDD8D61E61F60F22308E12ADC137D3D8C53CF7B31984CB813758BAA19AC178F2F0CD2155ED674A7509A3CFA7FF66D2D9B1E60BE50FE7FB79591C500F66BB1D35EDB80263F4B696A3DDA0B9B2911D01E76E9070D99DB93D1D0C3874CFFA776BA24424A6B453526F7C44EAFABE13C0750F9DF33E82105930139E70B5CF1B09DC3913D6BF4A4859F67FE814FF038F0FDAB93522A35E7F81002A395989D68B8B7E4235A09837CC6402A5338DA08E7C73DC63C43BAC42054C694F4931B80140D6B104EDEC995CEBCC5629F85D09DED8257626F9FA4079ADEF81D044C18BF2277DAAA41931B62A6028F89F95F06D8A8FDEB95EB2EB1E90C0D8523E0B476B158E3040F212390AB2503021E8D6FC0733B963CC6188FB2532829925B59C8255D89F10B657053D0FA1D8E76C84826A4609284503D3A101EBFE7AF93EDC423EF5303CD946C8B570511E38EB04BEE0060E678D03E4134F84F279A570AAD0332417FB2099E3F1F279CE7D6DDB080C5D83064D107BB560B21183AE165CBB54CC75313DE72D40D1CF5173455AA55C5C356D7C40A2A7023DD95D3F89B515D7598F800DCB7BF68B707978ECAF55B794A17559BD1E913F4472B1830783BBBAB5F23A760C78C46157FD1B429C445494CDF92FEC8BF9FC217D3CE2697BB6C671BAA793CD0C1C84F579F0DAEC400BEADA799A9F417FE4744145F21C6F8559AFA7A514A0E951F03E5E68C17A8E5816F3FCF41774D26BE2EDC11FC3A42CFCF00F817C3D0FBF474FD7F30C9C3C6BE7F74FCC79FA6AB07CAB037EEA7D83866673A74C087B5F7542804071D53CE348D2E836749E35AF0FB884D5D53ABB195AE1EE6E9AE35DC91BE359BCD510A7801FC243C07DEE92373918AA4F8A89EDA3895A52456F7244D1FF007CC7B1A52CBEF4C1ADE1C2C0AC189AB24B3F260475E1D08E7C5BFA30A1CDD71DE5ACE80D5FBD1D0F17198B79C8EEA0365D139F2AE73CAB6FBC9A79786896DE0CE7FC747D68FA4ABAB662A09E0E409F7E652153352BB92F5DA1836B0E92B0B644C821B2DD2BD0AF193AC0F8CF5B8D88432F0248DAB09B46FBEF2EF1899B5981E9B33DE4E9927AE50890FEFC35F681E075D8B0169A2E16FEDA6392AB9858DB87ED18ACBA25575AFD1FEDA9FB3FD01ECAC13C245DF6972F65087513F505187C4E8EA54B6433FA092B6CD3AF13F4718693904435C55D273060FBB5FDA76074691269493E86F287922D074E54EFF04209B2FDD3417D8436D1395E638D57DB75D68F4F819141B6DAF4D13A9A18629CF5F84B0CD02E7A397715DDE5476BDC467218D11AACD6CE399D9D54645BB27CA43076B7E4E57FB4F7C4F4B8D0AA949719D731C3A927FDEF1533D773CF1BB562D5EA43817A5ACEFE9EB7E51029DEA143E8A1D5F76F9BFD74A26C6D38F54194319A1AAABC4DAF45EFBAE770B9E9D834C09FE45C15D4BBC0251D3DF2F2F23387DCABCE6CA7A59625E18FD997770D164C338D0692AF97C749FB746C0D3944CA4B2DA6D3AD7B8C3AA922FC029CF9AC5580CFEAFF50CB2E9044211EA522BB5769BEB7A7BBA0743F345FEEA9AA9DA6EC5F0579CF7A5AA4DEDC832FE3F65185A31FD49C0D259E3B7F8FA96E110D130F588CDEC30D0FD4860CA6673C46D961FC68A4020FB03AE24B1AE12967EC1ED19ABEC0808A7EF89521152033F70F406A7005819D28DFC556C79DE18584088F40BE40A555EAEFA78E3FA3D9360A7CEBD963555CF208DC408A07CCC1369F98BD840F5C940721064E6C7CB241ED0697AF0FACF36F05632A504870ABF90134A01AF00D340F7A5D548A8078C2049600EE454D15EB8CE58C26B3C8185CF9DFCDCA7D4B6DCDEB82230F993D51E701D8387B06BD45B4B61DC9DA6D3B4356F50C1D4AD2B467D36AC092442FA90D1DEB014475AC7CE90C974063459DC951DECFA30D2DE4C70FBA39A8B6931217D0924FFA783C8C3DAF048908E4AAEAAA3B7C98846278AFDD1753252F39CAED7D334D8575CE3ECFB2EDEC31AFEB2BBE67FA929A267376293C2B2F295CD8DBD66106E1D9518BE1798949F3315E0454D018C2B706FE836FB37AB908D9D698AF495BD285A74E4CFC7612D42121F43FDAA7DCF44DA82897B820514D66B92983A3EC819D2CE208D688B6F0AACADC0CDD619D815CD231AD8DD9B6DBAD9C47E16FAC098D0F4279AB52055D2FF765AF6E3618C4509FAE6AB00FA23980EFB19A26E0A6EA4C9A7DC699121388748449C429B28AD2779F5642F05FF58B68BA3E289F90EB27CE06392616C080D659338CAF274D46A90D58F2BFED25E8D4A8C62030A5E89F6B1A5F6112A38661E2F2B5A37BCBF050812DCDCE9C0A939ADF929C921E7DA0C30815DA318EB2F350F286441CC92060C970077623EEE68B8C6FEC9FFFE780A6FC85FD7AF90172951337AF57339E98049132A4CF58874A7418FB7ABA0628B6192BB2C43102EE6B1D7E824725D9C75D34A8B69DF4A6BCB1F96B57767046C99EC6352751E2FE1075BB4092672379B3518DDC884FEAD5BD062B0336EA88BCBE0D22E066566347FEB617A322BEC561E9AA9D2177EEF0DFEEAF6231AD56D0CD9E300709C9317B3D334D8D2AC97F96CF2F45B8582C4128D95DA8CA207AE34D3DAACCDB128C11694EEE6D3E8E6AB767B6886B1F7235D85A4D9C7C831C5DB8AD8323F63927A638E19497CFB308285A03CA2C1FE2AC4D919AD11511ECC6F28E7D0E0A614FE21B57BCCDF83535C7E2C40840BA0014247190C580378454751EB3F2361D7193E160B9516F7EE1D683B336B873C8BA22E97480A61F002A73844C78309C0A3B31BE30A192A62BDCC3D33A7A5BA1F6AE0404A8558740CAE46E5FD15971B41C0BC39665A9B92EEB3328C328B073ED5B3720D37A1C097AF8A6FDDC3B2B067680E6CAA760368B0E1C052E804E9F80F26B52596202FF2E0AF7215999EAF7D3EE3E8916744E40AA1154322DD068AA15960DC38671A4F5889FBE709CE1DECCFA80B9D33AD2FD963FE0581A2ED7718A27CA62819D05BAA3212EC7CC1C5472BCF579AD52D5E1B2BEE637D9827851C419A4CB91DB57B2A6CB4433C1BD209648F1FE170ABB964B272BCF0A263CE28CFA3A9D1449CFFDF643E37AD97182F0031CB334A1EEAD23D63A5C2D0A675D0ED000F37FD2153E1AFC4AC01692701014927601203ED2B8A477CCEC45C1F43190E4FBAF2295E32A9383FC7915AA76950A301ABE47BFFAA9C294292126934CCFC173115A6CA96F3945FD5F924A5017125AD5AAC705106EB852EF3190A24420196ECD37F7C67B57162CBEB97DFA -pk = 96B823E823C1C2B1198ABB2290ECCFBB0BA4622BFED6EB06E9E31779B29FB3BC0726184701ACBA276F6AA8A3F169FB013F7DFCF1C2364364DF21AA16E9FDB0FF5E2DC8648B6EC1EC2D2D47849602B43F27EEAA98802EBB33FA5F98F9C60C6700 -sk = 96B823E823C1C2B1198ABB2290ECCFBB0BA4622BFED6EB06E9E31779B29FB3BC0726184701ACBA276F6AA8A3F169FB013F7DFCF1C2364364DF21AA16E9FDB0FF5E2DC8648B6EC1EC2D2D47849602B43F27EEAA98802EBB33FA5F98F9C60C67000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000776BBF388CBE8A1F0321669E26137613571814A4D87ACFFFDE98AA9B4962659CE45B3A2C51302821DD4D819EB2FA1987DB1B04DBD66F3002FBD50EAF3B4257B24E45D5FFFFFFFFFFFFFF064743D5799F5978931D809D71CCA4773AE369A86D6965BB1AD693EC94BDA359BBBF38B1EDEDCF51B5C5EEFA7BE755C438658D58E3EF9FC1BAD28F5219BB0ADC5F5A0000000000000000968BB472BCB8F867A16F8054962D8299C9CF30D86B20674D2672CEA9B1B0F9C15080ADD335D02DB080222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9655EF3FAD216F025A4C95AC10DC8689ABED3F69F71123162E21009C06F9AD9F6CEFB38D307900417D22E000000000000000000000000000000000000000000000000000000000000000B0240115A98B213EC1E0400B8B93EFEDB9FF3C111E57BF95435E84A51C226E9860CA26492E498951796A943241E0B032AB49844586739AC73EADD8206E824532A8967488185344B0BE14151BE54820819BB4C0FCF182CAEDEBFE40A857D35004545EC3EE936E47566BD06DD421D21B4FD4660E3D901252C2300B6F9E9CBBE337C0F0AF8657B57BD9D35BE0CB323130234D027BC3CA4BE84472C203EE837FB8BB18540F191BE8A42F982C6A0904BABAA776F29FB5CF7B686F2FF7F2E2D39FC000EFB66E1C9638D98C06E891D939970A8E80F8DDDBBF011E91CF9EFAFDF0374C3B76B67743EFEAEF927F07AE10E6C040292116131E5EA47DF6EF00DF1D214455C18FC6E1D7DA8D70BD67627CE0E536084DA2CE28C8C6A3BC6ABFEC824F8BDEA0134B12F6DABE1BA41D28FE612990A1AF037BCF08CA57D2F3EB9ECBD15D7CBE0FAB0708CF9578C70B5F8AA39E2C1418203E2B2B12D707B1A6F2C4E87A78B53CBCD3FE7D0F8271FA54A5F148BD9C9E8240BD00360CB78A158D88025AB7420AF2200E95FF65932D155A391114DE34A38E9BD9B82CD89FCA1EEACA12DDEE14CE68BB80CCD675AD0A6D7ACE2FF4E1F5BA5C702B46E10978CC6F932EFC3B19A6D6587C22B53AC7F425C4FCF7BE03D83FD97DBF856164382BC64A3FB51B827C4D3629E00413033FE166F6DD2B5AC36F36DB7E5A1D3A0DF3A7853405FAE64BC8E077FD7F5ED6901B3D20D04888FA6B0F0DFBD9001AC4E67B8461942F0A0B7492868F99A5B385753BE8576E0BFD015A1AFBF0A014D393DFB134178948DA3B160EF47234102C0F0C3CF3CE26F64FFD5D039C2365A989048FB8D0C67ABCD2EB448357AF125446C11BF6A25FBAAD2560058E093F8B403A2B4CDB45812F297EA40888D5D388172AD9CBA38A1249A8963138F34FFD206E7CD572BBB3795CF360F20F1242D7D1403 -smlen = 2837 -sm = BB9AE60380F1D98DA0075A4D016C19FD49DFC7EDD56822BFE30120D03166428342FC211138B30071C07B2B658BE727B5BDDE9901CC0A788FDB065BD4EEDEA33B011389A86CBF2D83550872EADB01C4E3FAE01F32C73D4F9ACDDD009A086FFFF41A62994A0AC41C00D839C511C47C4D16516ECE510071370F935731FD1731BB5A81008E7C134C46CED4C863C55D5800766E84860D8DFAE087C2538A01C7277FDDFA3EB40794F811C601912FE1D2A869C623210271BD01E505D4526DAC0EB8B09E45FF0129A8086EEF736CFD999DDD9C010161C6C74343CE086949ADC970A3254B37E3F9F771A8F1F98ABD13037DE0B5D7559A8A09F7B4FF3200C304B72E42A9F3F52616AE99E70C34FCF4626248B979A7A8D306CB9ED69C4CCB5CC3729D2692E0BA679D5C2FEAAC54A4E06D4EFCEDF78E19357DAE263E1B5D107FB09618A9C34F54F19A738A66B95E6F88E20E01F879F53E8F4C371B571E1438FF70E0A8CD00D608976E24501B2DDD323EFE6C1302A318CAD821C6FFE641672BB80AC62286C69FCFFD93422911C46D43DC9A1F00A73E19EBE6CC09A9801F2A1DA708F0F1F98E7F1A18529010823230279F487911CEF1E784A229D9E311BCE5E2D368E6D613F791DDD617D0F37F604B786CA2BAB754E8BC4BD3DA37E66A54DF1D3B268A5A80379A30A52B1532E8CFABE24168D83CBFD61E2346F901C361F771E0BE3E03DAE8CC30614C10FB8DCCDCAA5B9A25DDD8D61E61F60F22308E12ADC137D3D8C53CF7B31984CB813758BAA19AC178F2F0CD2155ED674A7509A3CFA7FF66D2D9B1E60BE50FE7FB79591C500F66BB1D35EDB80263F4B696A3DDA0B9B2911D01E76E9070D99DB93D1D0C3874CFFA776BA24424A6B453526F7C44EAFABE13C0750F9DF33E82105930139E70B5CF1B09DC3913D6BF4A4859F67FE814FF038F0FDAB93522A35E7F81002A395989D68B8B7E4235A09837CC6402A5338DA08E7C73DC63C43BAC42054C694F4931B80140D6B104EDEC995CEBCC5629F85D09DED8257626F9FA4079ADEF81D044C18BF2277DAAA41931B62A6028F89F95F06D8A8FDEB95EB2EB1E90C0D8523E0B476B158E3040F212390AB2503021E8D6FC0733B963CC6188FB2532829925B59C8255D89F10B657053D0FA1D8E76C84826A4609284503D3A101EBFE7AF93EDC423EF5303CD946C8B570511E38EB04BEE0060E678D03E4134F84F279A570AAD0332417FB2099E3F1F279CE7D6DDB080C5D83064D107BB560B21183AE165CBB54CC75313DE72D40D1CF5173455AA55C5C356D7C40A2A7023DD95D3F89B515D7598F800DCB7BF68B707978ECAF55B794A17559BD1E913F4472B1830783BBBAB5F23A760C78C46157FD1B429C445494CDF92FEC8BF9FC217D3CE2697BB6C671BAA793CD0C1C84F579F0DAEC400BEADA799A9F417FE4744145F21C6F8559AFA7A514A0E951F03E5E68C17A8E5816F3FCF41774D26BE2EDC11FC3A42CFCF00F817C3D0FBF474FD7F30C9C3C6BE7F74FCC79FA6AB07CAB037EEA7D83866673A74C087B5F7542804071D53CE348D2E836749E35AF0FB884D5D53ABB195AE1EE6E9AE35DC91BE359BCD510A7801FC243C07DEE92373918AA4F8A89EDA3895A52456F7244D1FF007CC7B1A52CBEF4C1ADE1C2C0AC189AB24B3F260475E1D08E7C5BFA30A1CDD71DE5ACE80D5FBD1D0F17198B79C8EEA0365D139F2AE73CAB6FBC9A79786896DE0CE7FC747D68FA4ABAB662A09E0E409F7E652153352BB92F5DA1836B0E92B0B644C821B2DD2BD0AF193AC0F8CF5B8D88432F0248DAB09B46FBEF2EF1899B5981E9B33DE4E9927AE50890FEFC35F681E075D8B0169A2E16FEDA6392AB9858DB87ED18ACBA25575AFD1FEDA9FB3FD01ECAC13C245DF6972F65087513F505187C4E8EA54B6433FA092B6CD3AF13F4718693904435C55D273060FBB5FDA76074691269493E86F287922D074E54EFF04209B2FDD3417D8436D1395E638D57DB75D68F4F819141B6DAF4D13A9A18629CF5F84B0CD02E7A397715DDE5476BDC467218D11AACD6CE399D9D54645BB27CA43076B7E4E57FB4F7C4F4B8D0AA949719D731C3A927FDEF1533D773CF1BB562D5EA43817A5ACEFE9EB7E51029DEA143E8A1D5F76F9BFD74A26C6D38F54194319A1AAABC4DAF45EFBAE770B9E9D834C09FE45C15D4BBC0251D3DF2F2F23387DCABCE6CA7A59625E18FD997770D164C338D0692AF97C749FB746C0D3944CA4B2DA6D3AD7B8C3AA922FC029CF9AC5580CFEAFF50CB2E9044211EA522BB5769BEB7A7BBA0743F345FEEA9AA9DA6EC5F0579CF7A5AA4DEDC832FE3F65185A31FD49C0D259E3B7F8FA96E110D130F588CDEC30D0FD4860CA6673C46D961FC68A4020FB03AE24B1AE12967EC1ED19ABEC0808A7EF89521152033F70F406A7005819D28DFC556C79DE18584088F40BE40A555EAEFA78E3FA3D9360A7CEBD963555CF208DC408A07CCC1369F98BD840F5C940721064E6C7CB241ED0697AF0FACF36F05632A504870ABF90134A01AF00D340F7A5D548A8078C2049600EE454D15EB8CE58C26B3C8185CF9DFCDCA7D4B6DCDEB82230F993D51E701D8387B06BD45B4B61DC9DA6D3B4356F50C1D4AD2B467D36AC092442FA90D1DEB014475AC7CE90C974063459DC951DECFA30D2DE4C70FBA39A8B6931217D0924FFA783C8C3DAF048908E4AAEAAA3B7C98846278AFDD1753252F39CAED7D334D8575CE3ECFB2EDEC31AFEB2BBE67FA929A267376293C2B2F295CD8DBD66106E1D9518BE1798949F3315E0454D018C2B706FE836FB37AB908D9D698AF495BD285A74E4CFC7612D42121F43FDAA7DCF44DA82897B820514D66B92983A3EC819D2CE208D688B6F0AACADC0CDD619D815CD231AD8DD9B6DBAD9C47E16FAC098D0F4279AB52055D2FF765AF6E3618C4509FAE6AB00FA23980EFB19A26E0A6EA4C9A7DC699121388748449C429B28AD2779F5642F05FF58B68BA3E289F90EB27CE06392616C080D659338CAF274D46A90D58F2BFED25E8D4A8C62030A5E89F6B1A5F6112A38661E2F2B5A37BCBF050812DCDCE9C0A939ADF929C921E7DA0C30815DA318EB2F350F286441CC92060C970077623EEE68B8C6FEC9FFFE780A6FC85FD7AF90172951337AF57339E98049132A4CF58874A7418FB7ABA0628B6192BB2C43102EE6B1D7E824725D9C75D34A8B69DF4A6BCB1F96B57767046C99EC6352751E2FE1075BB4092672379B3518DDC884FEAD5BD062B0336EA88BCBE0D22E066566347FEB617A322BEC561E9AA9D2177EEF0DFEEAF6231AD56D0CD9E300709C9317B3D334D8D2AC97F96CF2F45B8582C4128D95DA8CA207AE34D3DAACCDB128C11694EEE6D3E8E6AB767B6886B1F7235D85A4D9C7C831C5DB8AD8323F63927A638E19497CFB308285A03CA2C1FE2AC4D919AD11511ECC6F28E7D0E0A614FE21B57BCCDF83535C7E2C40840BA0014247190C580378454751EB3F2361D7193E160B9516F7EE1D683B336B873C8BA22E97480A61F002A73844C78309C0A3B31BE30A192A62BDCC3D33A7A5BA1F6AE0404A8558740CAE46E5FD15971B41C0BC39665A9B92EEB3328C328B073ED5B3720D37A1C097AF8A6FDDC3B2B067680E6CAA760368B0E1C052E804E9F80F26B52596202FF2E0AF7215999EAF7D3EE3E8916744E40AA1154322DD068AA15960DC38671A4F5889FBE709CE1DECCFA80B9D33AD2FD963FE0581A2ED7718A27CA62819D05BAA3212EC7CC1C5472BCF579AD52D5E1B2BEE637D9827851C419A4CB91DB57B2A6CB4433C1BD209648F1FE170ABB964B272BCF0A263CE28CFA3A9D1449CFFDF643E37AD97182F0031CB334A1EEAD23D63A5C2D0A675D0ED000F37FD2153E1AFC4AC01692701014927601203ED2B8A477CCEC45C1F43190E4FBAF2295E32A9383FC7915AA76950A301ABE47BFFAA9C294292126934CCFC173115A6CA96F3945FD5F924A5017125AD5AAC705106EB852EF3190A24420196ECD37F7C67B57162CBEB97DFA - -count = 78 -seed = A315BCF0E6835892ADFA07C034BFCD39F80B62925A95490B20170BD29378E11559C7F1CD296377FF1E01284EC727FFCD -mlen = 2607 -msg = 96AD5FAEF409B8A4C21ACB1ACB596BADF387D26656BE3EB17987AF59737E324B7BF8412A306B0E706AEF73D79AF753D9B0064BA9CED8DCEA966543FE748E2611709ECD1CE6E4DD8FA812D485E91809A225936675369574B0D104A258E3353EE0E021683615CA5C7C531FB29A5025CC7F7323860443DC19C9858F741EB9D24A9F6F04FC839B67153214116E8B7FA982F338445830F915F7C85C88C23BA2A3CE8E2020A9D8DD7B18EFE95563E3924D2A341826AF51A8584CD026B1C433EF0221145BA8BDC8F73A467B33A9EB3E8CD2A4D671C17D7C28AAA539D1C5BF2F4138639AFB89CE791DAF0EF0281D52598F4C13D210974CFA1F099A0FC70B1DC120E5C00C33A2BD360BED57CCE069060D6380BE2204852D8BCFFF4918BA0B70B0BD1E1D55DC1D68DB1D20AE713B0093EAEFA1E33D40D9BD95CFF17568393E9BBF5CC1287325D2668F65DFCF44ACE2F6C6CEBB62F1433E69CD19E6C6532EA93682B22C4C4A62C6ABCFAED08EE64F32723E56205222E4AE0831AB8FCA8C265FEA0CFC66AAB1E367201752AEC11F752B963792C071E42A8A1AB80658A0C6960147ED740CD07F307CF6A644A98E1D2E56C625ACF458D0BDF6216A4F1B9C78EC3F14850C803A4207C894E61A8AA88840A27F2B439FA7CBAABBC789102A95323E06E2C324859DB92C6CEAEFDCA389F677082180FE3D6202FF60DAB9F87E3B84841C0A4EB5974D893333F7F1513E54EA4AE0731EC409F69B77089FAFB121300042880EA59B7927E9435EABFDCC1019A96E145D5D157998D620E7BC6945DBD6CD78E94C2D89589F8DC8A01CF1B295A26B091847F034937F764ADFD811F52B3AA187F3F49273EAE5949FF34B64BC86FF11EEFE378825D526509483E7191B33333E5465FFB025B269F898CE1F83EA549F1864B556C729F510118921B69594F67B8C229236AD3AEE55BD7082E027B5D342C976A549E01618288944DE0B2C77473A25201B61034B334968178AFAB7F8CD1FEB6A25CF8DCE3586FFAAA861471E2EE7F0C22538FB3C95D2145965C4673E6489764AE24B4F048DED77FE3487AE175F6D4898F69F9FFF276470A93DAF986A75F685919D98C9C609C795D4785AE941C782B551EF382F47209AADEA19066AE5D3EBA7BBD99E91943F1E62754A42FFC8048F7B87F128CCF6C96BD760B45F07F740E94491874B06CC3450AAF55BC664B407C57369CABD2708A9C478DFF64D292D96AB71EB997F8B71CDD6BA02F52C5035EC26E8111EBF8268CB00DF9ECD63BC0D557E2D2E77A6363B00DAF25237E77DAD03F929E5E9B39447A70D4E5F4B90958F312C80D594E1B1F3D0D23F2B0D9753BF3544061CF0C0F841C440319E74F9B9D15B91EBA1E680ED6AAB7D63A97B48C0A4AAF314E8E77E2EA6BE9DCFC7B5557FEC1B996A37C86CF6941325EC356EE75671726BCED7D2157BE8D4C62CF4BD0420BAF2C4223597C0EF75F7A7C9533D14BE0D21C37F06FAA53ED5EE0DDB025862417F98D2F188895395CF2FE72185ACBEA952F55CAD7EC2D684A5AB94B1257D7ABB565B8C07B88C6335FFB9D2FC6F6779CC24FC3CDF92BB3B12EC54360A7CF3579632A2A65C518E57015DF1C616C857F83F5F1AAFF693ACFF210DD1E95CE04CCA9A0BF385ED6EA2AED894E79D5133799393469B666209371E708D4D279E1AC5ACE28985D0DB2765D547C2902B715BAED5A4FA3E7AA42645F3BBE1E9F3CDB87B1DD8DBB5AAB08626591921CB49E552F8EBAFCBCF428470719AE40B9CA847F31848F39E4D42049C5D40B0BFF036E5409A6A12E7924148E60B64BB83386079B54486FFC8187302893B8BF826578D9CA03A1291983F21DE7F6E65458F8942DC1B135C6C8C1FEF4F3863A58DB17112419590AE57B9425592FF22E596191E5BA7C513EC315EC3476C95A149F6A5EC1CF24870400FDF46217A23F42E0B61157C3CEE23E7916B4475A94B96B917C171B1A34DB13AD98833E457343F94A76EE226FA5B9F3066C2FD69F14D3AAED1B31F5114780442EBBC88D0DE5F689CD910E7464D73423B9D4E03718C5C51871250D11E27E28DF1268166E3AF328A80D9D335F2D27D2E91DC61CDDC7F733E345D56C11B6130875D93D527F93542FB352407185E7AC07051AF7F642E34FA06B1376BA15A35D837C1BFE090BA67A89FC1E307DFF3F02A988ECD48FD229733F641F2609EC8DB14B1A5AC170B104F03C2509D2EE6844C716766D06A6A25D957530FD68A8DE6F1753F83EC19EA2DEB1A4F9C7986F20FF60A7508DED6547A85BABA70577062E8144BA0496777A5218595E021937FEBAD4BFDECAC29E3FFF2EFE7D598FCB86F93A734E4C573E1496A6282A3B40E817DD3C9D631939AAB350ADC703899EE3BCB1B5EAF6EA8420DD6EB2D4F64A1818AAFA97B73C75610B6005F1EDC1EC7D8F8DB1E5D3E9666C1292515105037D26F2C8D83FEE1F4EF5DEEB287CD7C1E11960218C1B8BB50453488BAB019435065AEDFECD8D218BD1E751FE736442E8D09CE7176A71C06415A30B070693A68BDAA5CDF62351AE665F37FEFDA9481E62EC181ED24F0D0649AD01C89AC422F1B7E27895E55DCC2FD817346D361FA559094B37894C0B478C68A1D7564D089D9D4417D5C7372A33BA475A81FC129F3259C5407BC7435825B415782CC84D85E69D9B44B32D78FA255A895CFD55319DAE677FF89D93A3884CE9401775563FF1788CF3AC11CF96DAA199E7F4579A0264378A323FDA64FAD2349C09465FB23BA09069C7FBC79E7288A82F9165268F6842E0AFF0E250C21BBAEEFB4347D4EF1CD51161DFD29BFAFFBEDF71DEC93F4157A5C18995379ADE8D15DB59EC4A8B308C2EADE1B7DDAB55CE2220F3B3AE8CBA7C8211CCCB3846A225B438F4B37DF54363A987C5C4E6B9D20EC3C0096317D11F982184B75D8EFFD168B7B41317D40F903A23A2649999DB36CAAE31BA5D91998A684D30AAADBD3B1EC154BB6C92513BFC0C47C673254F42B1FA36B995CB737668CBDC2A0D1BA838E74E0E50B22FC22DD048F48B6D1E89E1CCCE5A226F63AC7B8E6E9E8CE27050BF3DCD7D0F35F47BBEC1CAABD4D619CD77302AB4FF6F56DFBE9F5821AFF2D72EE6A628DAAAE4440EDCC070473BDAA54CCD775331AC2812FC5B9884915DA582EB36F85C7923F06D961594753802EFC5883CA484FC64FACE42DE6C3105E23CB90663A3B381D0C6A7265B740BFF0A1A017058F06E39A74BB07B63F883CF914FE675E7E5AD5AD44C9F90DDBE23A125D9BE02264EDC13972FF22BA48ECE8890A223EC13ADDBE055A8B4E03882677FC0D94C9053DA6CED34E132FD83810A793350446D60AE5DD0D174B534A3B6F5BC1B497F9406B5CDD414401B6DD881CEABAB12CC51425E88A81BD9E14BDA18273583CCE0849AA48DBA1CFC49CDF29242C73C99C87F063B8B739AA787570459C098405DCCEF78D6D97C21545F2959DF9CD62F9C38AD9A849507C23A51714565642DD76C9103154327985F7DCC701B795A7AF8625F06367ADC11A7FD7B6ABBDA5B2FF6A825DD43B64A48EDE4EFF8603A82159A6011F9E626171E4593C0E963595A6E068AD05FEB12378C71AE515A82C293EB7D2B01B333CBC7991B44685AA7513B3A58342BA5D094B773E6A27F8582F3DABF54DEF59974CB8A2499369B5B64C7AC08D32D75FE37371C578073DC83B82A828DFC325976FF282D3F6 -pk = 4DDEA965AB7E52B78B02E2EECDB24BBA9BA085FE9C6F902644DDB8D0157439E04099F5969A7A1F343EE8428631C7A001F070F270EAF9DE4AB2A7280611EC06C820AB2E1BDBEFD40B7C3B3AFA40EF88C5DF2E22EC2A7DAB9D927856CCD4514302 -sk = 4DDEA965AB7E52B78B02E2EECDB24BBA9BA085FE9C6F902644DDB8D0157439E04099F5969A7A1F343EE8428631C7A001F070F270EAF9DE4AB2A7280611EC06C820AB2E1BDBEFD40B7C3B3AFA40EF88C5DF2E22EC2A7DAB9D927856CCD451430202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004102DBF80474A0BB39D8914DB2ED3476594D2E6EB5DAE7516D5953DE0D20FD57B8863759A2D495B7678DFCFBB95B5410BB394C1E36234969D577F787FB3F370ACF9C1100000000000000803A5906A6AE1BA67F63927749C556AAC3AE04220E31A6F9E4823D390409FAF7037EEB56FEED5D4B0D5B63713CFE92F73741840DFBE1F40C105DF851CFF1BD57AA40FDFFFFFFFFFFFFFF0449840CCD993339F1E07A58EE4CA9133BD08181E1BC3CA6A8750D5FCF17E8B9D867020F2CB68B2271BB5F01000000000000000000000000000000000000000000000000000000000000194D4FEC445F2748D802B26F60AE48A2A34A189BA3A6CF631CDDD5A5BD441364CAD0AC670D96A827D5366C00000000000000000000000000000000000000000000000000000000000000725A843A1A53DA7EF961C6FDD0826DCDE47C6F4D27FC4EA6C1ADEFDB45C26B854F2ECDE68D03DB7221DD0208788409014F36FDE39141202ACFFD3A1E48B96CCD36CC34F556812D5C38CE9BF715290097303A4E7821B4D6D2C4F7A86E2E808B037D434741E0E8C531F61A384007430C04305E17FCD78E6D2A4CA8B535BC84E80F4042B0A493286F64FBE35E3514DDD902A8C2291CEE1C64F80C655C98CEB10F4E4CA52466228D2C140301C998BFA82AE8842A4150BB07361EE8227FC36733C803E49610263643CE18E9A581A4A75943B6AA5B2F2C1C95BD1C57FF0234D99DACC41D14A16CDA3A17437399F3815DEFE30134BFFB0021A52EBC0DCED3982DB773B4D4026BC9F9E1F8130460F7C316EEA3FCC6714C026D637B3BC8B5878BC240830172909B18936A6ADC1013D467553A0720E984C4C79DB8C395F454026AEC282C9E9D71014BC25DC5A23CD3B36F1CDFB5039EC0519EB623A3F9BC43EC42DEEB7ED90DB315BE08811662CB409701C3E50D7A549A7F4D7726057A647B86C0069F7A023B4258891583707425392ED0B8959555935A31F234BE45B174BB90C1A40A9AE66617F7040B92AF7D0E199030C8655F0387D2D7FCAC577AB9380B120BA3AD282B66A3CA052171369C27006C45CBBD0B4A5499229FAE004FF41A9F70C4BE56D603A1BD36C436035AF49178AB3795EA2A8BAAA103B394841F03ED3F95AFB6DED938A2A90A8DC70AE4F603A62EDA4C3FF9015E3A062A38950C6400E39680594F4299407FEB81E03B1F16B295DC4AC46D516FDCFEE7E0D26F0ED58372D034CD4ACB014B5FD6E9177B40B28E12EEE57767F489482389D8418D9C9F9B5004DD006610854548BD1774192A8573179A40CC697B01258516584DDC08274E49DD3F9D44F0A901D0CEB44392F700D0D241D5A1B87C177D537292084F46CDCEF2586F22E8BA00 -smlen = 2870 -sm = 1127687445FE63F42B70316F0053C80F1909BDADBEE03374B500FB2BCCAE6CED0197F7FD31BB01C9093E6CE5DF2E790FCA3A72015CCB9898B16321C805A3132201BDC906DA610BC128374BCB6A0194E56FE7CD19DCA2786571C10098E227E69F29F9A92647052E005D54CB7E407762577250CFFF01F452C67AD4B5E00A32E90FAF01AE5906194E436867AE051881014288D57DC9FD595D2CFB0673019EA93272F677EFE2D70EDEE501C53D53058BE4819F34AB323900D9233A2E9FB6439C494B558C005B1068852B8999CD5A41476800014BE8C520F938A97344EF6CC64B7A140C09D9B9D97D22C6D0C00300F0AA76864EBE742ACA7277730015E08893650369917B1197ED280596AD5FAEF409B8A4C21ACB1ACB596BADF387D26656BE3EB17987AF59737E324B7BF8412A306B0E706AEF73D79AF753D9B0064BA9CED8DCEA966543FE748E2611709ECD1CE6E4DD8FA812D485E91809A225936675369574B0D104A258E3353EE0E021683615CA5C7C531FB29A5025CC7F7323860443DC19C9858F741EB9D24A9F6F04FC839B67153214116E8B7FA982F338445830F915F7C85C88C23BA2A3CE8E2020A9D8DD7B18EFE95563E3924D2A341826AF51A8584CD026B1C433EF0221145BA8BDC8F73A467B33A9EB3E8CD2A4D671C17D7C28AAA539D1C5BF2F4138639AFB89CE791DAF0EF0281D52598F4C13D210974CFA1F099A0FC70B1DC120E5C00C33A2BD360BED57CCE069060D6380BE2204852D8BCFFF4918BA0B70B0BD1E1D55DC1D68DB1D20AE713B0093EAEFA1E33D40D9BD95CFF17568393E9BBF5CC1287325D2668F65DFCF44ACE2F6C6CEBB62F1433E69CD19E6C6532EA93682B22C4C4A62C6ABCFAED08EE64F32723E56205222E4AE0831AB8FCA8C265FEA0CFC66AAB1E367201752AEC11F752B963792C071E42A8A1AB80658A0C6960147ED740CD07F307CF6A644A98E1D2E56C625ACF458D0BDF6216A4F1B9C78EC3F14850C803A4207C894E61A8AA88840A27F2B439FA7CBAABBC789102A95323E06E2C324859DB92C6CEAEFDCA389F677082180FE3D6202FF60DAB9F87E3B84841C0A4EB5974D893333F7F1513E54EA4AE0731EC409F69B77089FAFB121300042880EA59B7927E9435EABFDCC1019A96E145D5D157998D620E7BC6945DBD6CD78E94C2D89589F8DC8A01CF1B295A26B091847F034937F764ADFD811F52B3AA187F3F49273EAE5949FF34B64BC86FF11EEFE378825D526509483E7191B33333E5465FFB025B269F898CE1F83EA549F1864B556C729F510118921B69594F67B8C229236AD3AEE55BD7082E027B5D342C976A549E01618288944DE0B2C77473A25201B61034B334968178AFAB7F8CD1FEB6A25CF8DCE3586FFAAA861471E2EE7F0C22538FB3C95D2145965C4673E6489764AE24B4F048DED77FE3487AE175F6D4898F69F9FFF276470A93DAF986A75F685919D98C9C609C795D4785AE941C782B551EF382F47209AADEA19066AE5D3EBA7BBD99E91943F1E62754A42FFC8048F7B87F128CCF6C96BD760B45F07F740E94491874B06CC3450AAF55BC664B407C57369CABD2708A9C478DFF64D292D96AB71EB997F8B71CDD6BA02F52C5035EC26E8111EBF8268CB00DF9ECD63BC0D557E2D2E77A6363B00DAF25237E77DAD03F929E5E9B39447A70D4E5F4B90958F312C80D594E1B1F3D0D23F2B0D9753BF3544061CF0C0F841C440319E74F9B9D15B91EBA1E680ED6AAB7D63A97B48C0A4AAF314E8E77E2EA6BE9DCFC7B5557FEC1B996A37C86CF6941325EC356EE75671726BCED7D2157BE8D4C62CF4BD0420BAF2C4223597C0EF75F7A7C9533D14BE0D21C37F06FAA53ED5EE0DDB025862417F98D2F188895395CF2FE72185ACBEA952F55CAD7EC2D684A5AB94B1257D7ABB565B8C07B88C6335FFB9D2FC6F6779CC24FC3CDF92BB3B12EC54360A7CF3579632A2A65C518E57015DF1C616C857F83F5F1AAFF693ACFF210DD1E95CE04CCA9A0BF385ED6EA2AED894E79D5133799393469B666209371E708D4D279E1AC5ACE28985D0DB2765D547C2902B715BAED5A4FA3E7AA42645F3BBE1E9F3CDB87B1DD8DBB5AAB08626591921CB49E552F8EBAFCBCF428470719AE40B9CA847F31848F39E4D42049C5D40B0BFF036E5409A6A12E7924148E60B64BB83386079B54486FFC8187302893B8BF826578D9CA03A1291983F21DE7F6E65458F8942DC1B135C6C8C1FEF4F3863A58DB17112419590AE57B9425592FF22E596191E5BA7C513EC315EC3476C95A149F6A5EC1CF24870400FDF46217A23F42E0B61157C3CEE23E7916B4475A94B96B917C171B1A34DB13AD98833E457343F94A76EE226FA5B9F3066C2FD69F14D3AAED1B31F5114780442EBBC88D0DE5F689CD910E7464D73423B9D4E03718C5C51871250D11E27E28DF1268166E3AF328A80D9D335F2D27D2E91DC61CDDC7F733E345D56C11B6130875D93D527F93542FB352407185E7AC07051AF7F642E34FA06B1376BA15A35D837C1BFE090BA67A89FC1E307DFF3F02A988ECD48FD229733F641F2609EC8DB14B1A5AC170B104F03C2509D2EE6844C716766D06A6A25D957530FD68A8DE6F1753F83EC19EA2DEB1A4F9C7986F20FF60A7508DED6547A85BABA70577062E8144BA0496777A5218595E021937FEBAD4BFDECAC29E3FFF2EFE7D598FCB86F93A734E4C573E1496A6282A3B40E817DD3C9D631939AAB350ADC703899EE3BCB1B5EAF6EA8420DD6EB2D4F64A1818AAFA97B73C75610B6005F1EDC1EC7D8F8DB1E5D3E9666C1292515105037D26F2C8D83FEE1F4EF5DEEB287CD7C1E11960218C1B8BB50453488BAB019435065AEDFECD8D218BD1E751FE736442E8D09CE7176A71C06415A30B070693A68BDAA5CDF62351AE665F37FEFDA9481E62EC181ED24F0D0649AD01C89AC422F1B7E27895E55DCC2FD817346D361FA559094B37894C0B478C68A1D7564D089D9D4417D5C7372A33BA475A81FC129F3259C5407BC7435825B415782CC84D85E69D9B44B32D78FA255A895CFD55319DAE677FF89D93A3884CE9401775563FF1788CF3AC11CF96DAA199E7F4579A0264378A323FDA64FAD2349C09465FB23BA09069C7FBC79E7288A82F9165268F6842E0AFF0E250C21BBAEEFB4347D4EF1CD51161DFD29BFAFFBEDF71DEC93F4157A5C18995379ADE8D15DB59EC4A8B308C2EADE1B7DDAB55CE2220F3B3AE8CBA7C8211CCCB3846A225B438F4B37DF54363A987C5C4E6B9D20EC3C0096317D11F982184B75D8EFFD168B7B41317D40F903A23A2649999DB36CAAE31BA5D91998A684D30AAADBD3B1EC154BB6C92513BFC0C47C673254F42B1FA36B995CB737668CBDC2A0D1BA838E74E0E50B22FC22DD048F48B6D1E89E1CCCE5A226F63AC7B8E6E9E8CE27050BF3DCD7D0F35F47BBEC1CAABD4D619CD77302AB4FF6F56DFBE9F5821AFF2D72EE6A628DAAAE4440EDCC070473BDAA54CCD775331AC2812FC5B9884915DA582EB36F85C7923F06D961594753802EFC5883CA484FC64FACE42DE6C3105E23CB90663A3B381D0C6A7265B740BFF0A1A017058F06E39A74BB07B63F883CF914FE675E7E5AD5AD44C9F90DDBE23A125D9BE02264EDC13972FF22BA48ECE8890A223EC13ADDBE055A8B4E03882677FC0D94C9053DA6CED34E132FD83810A793350446D60AE5DD0D174B534A3B6F5BC1B497F9406B5CDD414401B6DD881CEABAB12CC51425E88A81BD9E14BDA18273583CCE0849AA48DBA1CFC49CDF29242C73C99C87F063B8B739AA787570459C098405DCCEF78D6D97C21545F2959DF9CD62F9C38AD9A849507C23A51714565642DD76C9103154327985F7DCC701B795A7AF8625F06367ADC11A7FD7B6ABBDA5B2FF6A825DD43B64A48EDE4EFF8603A82159A6011F9E626171E4593C0E963595A6E068AD05FEB12378C71AE515A82C293EB7D2B01B333CBC7991B44685AA7513B3A58342BA5D094B773E6A27F8582F3DABF54DEF59974CB8A2499369B5B64C7AC08D32D75FE37371C578073DC83B82A828DFC325976FF282D3F6 - -count = 79 -seed = 8B47E0EBE786914C9A52D547106CEB4A3D3DE938B3244E02E5F9660954C4C95A23F2476FCCB487673AAD0513820905DF -mlen = 2640 -msg = 2447D338BF1A375B66B77FB96CBE7742508B57DFF4D33A368EBB8451C2C67B980D3576E6588D8678B285EF288A8B5C9C2726C4A550E764E47FFFA2A128533A7653E480288447509E10013AE1944FFFAFBD9E2BACA0B3C7069C07A4186C056FD3857CADDADD5F891512DAEEB26865F5C89FFA63A64C85A08E41EBE7BD8786A8ADD571A4267D5A9E426840A0B988E197A09F3770B5B0D80D65515CD4D8390AF40E6150062DC4B8661A8238F232692C152C97B8CD5BFE7B5AD863DC92D99744D769087B3EDD81D2E475F5CF0224B10CDE6FAE8DFC3519EFDBE66805AD4468D84D3DD93430363677360DA8F56CB58A6B775FF6417C1F324380B15C9BA668EB0F25FC2A690B483E856F3327B2D79FA6259E30D7F76199CFD21152B7C6FFC3FC113F70D3930C08B3C1EB1BF25C100C5A930EEC2C52664F092B89614943D9D85ED86A2EF666A94F9826C3D116A2BBE49443E2C11748C977716381D9463DA8D09612B80A6760E5A6FC5F59425EAAAD6C8342C1EA4BEEDD5D73151CE213C0B155286FF22CD28E3BB88E0CEE39CB859900D1E0FC19F6A7237BDA8E51476F4844A316752FB347492A928EEB07AA39ABDCC0164D1921B61352ED4AC94B82C410A56505633BAD53A3E649ACAF64C43C1ACFCD4715FC594AF6FB9E85B0B7DDD6E8621BD12A2BEE48223A97EC8502C16B550B03087B6E87C1A860D36322064F8FEBC52F2B7C31DAE7430870259BDAA5889852E3AE6F61013F5AD0D38727CF9D90C67BD7BB3B82D303C6C35383ED86FD5B7DDEC824EA198EF780BE830A1F2679D24EA6E2FEEFB979563F511D188F409F0CFD0050FD418414D01E46DB3D23B3A90B24F4E96EDD4F863BFB333D6A826D29EED167738BBE22C516C59FDF81B032BB55473A5EA2A1DEFE71C95A1EEB5C028435AD0379896CBBC76877501B054CF1FD2F6D7A9DECCD70D0C07111147EF568DCE514DE96EED61600029C8D103B31C8B344A700DE630276BA2C5633419C59E66577659538A6381E45584C7E1D6ED978AB0AF89067AC83BB70DEB6F2C58E339A5A66176A54D985DA6E02002948C62BE6F12314240FE18B09AACBCE82EA462586B8316C3E0AEA00F9998922F8D956120E53B4178223F4D2934A20976FD5A72027C8F4CB33E9BBCC0ABD15395151266B6CD5B4A9E2FC1725D8E9AB2CBDA47B507BB25AC995EDD51EBDA5FD19CAF68FAD8EAC57CB5EF0C6FC861A73E64648EE3255DB4C3394438F49377CC4AC2FCE1B6BC812E5D282F122678713C6C6D452A33C632C0AA47686588752D72B0586FE5EC2464A6DB40662FD2106A19F67DCCC45692FCA03685251D512642B0CEE436C78D94C6F5F25BBCB41FC7E5B1AECD52B846A0B70EAC93579603E9870F942AD4C1CFC9D49B1132777C6F1C184C1537178E5029067257A2DA2827A2EC44D323D13DC6E4E1B9EDF5949D4324228687FD54F02CCC3C4DDA635FA546A5A6783959B1C48AA9D9C9F6381EBCCD979253460857D3CB1C70893EE6F04709E35923883EE3C71C7F33B8CC28B9136B3EBE5F52B9A76817F2F74FDC2F12B459DFF32D5A295BE374B3FE507A0995BCACF1E7B24F4501B29F1E8B4F2A8CB394B3E459A4296F6439BA59EC88305AB045FF40B1DAB4F672F878DE1F9E46B9326CB3E2F3457B83EAD8DEC28DD079AF0E984A69ED882E1CF21036578485DFC2DEBC9CFE82FCE0383B4039D147C4C7E31E315FB57B9093DAA811F4EE4568E32E5625ABE76C5A1AE42A03441DBE766D0EF4DF607406F7D489275E8C5D4470866F9049A4AD5C428B843DEC3702E86E177E4B60181D2B5F099BEBCB25F04C93D087C72436E87A9B3AFCE78FA31E2B892400B5C1071F8AE0F78EF6F7D71859A97C17EC0912D5EA27AFEACE739FCF66F489EC6355A3318F79649881CD6C7E96A881ECC4FF6934C3D10D99F1DFD00592CB037749B025BD4BC2832E206C1407E600FC2170C0BB57E5C7AF0756830C2A6913E2B9C60575CD4A394F2A65C50E40A43CF5EBCA6A8A32335707DDF4633BAC7375DD53E24DF20AF30203B514D3793392E38FA8429B050F58B28CAD0146F385809CC7FAEFF8B71B2BC93D2C6F72E31AE2D07CBB3CB7F43540894E01654EDC71CCF4F361A847EC5B1D23C2D4680E29F0E1F992EDA3AC41ECFE614FC010A2EED1BAD87A7D17468D6FA5356EDB25E9008A9BB328225F85202246816E1A542E1DD746A5FD3E064FAA1248579D31CD3D65F8FFF36F782622402DB328C7850D82D8D8A52B897353A2F8B95624D2D958FC1C3AE6466EACCA2A6A5E6ADD4A582D27E07633CCF697FA02E243A4FBB3DC727B718B5AC0FA6AAB217E241627E69CA46F05ED6B496A739A29EDAEEF76992A507130715BE555C68A7EEAD6E8FF3A378D8F4B7BAFDEE3EDB9EC094440E31BBA717A9C82A117D05EDCA2370003DFABFB2EFB29510466F74E76CECCFC41709FAC4CD8EAA998357170A7A293209EB0BB83DFE5E2F6D73C28D5409C55E95068D647BEC42DB8098F0089EF8A5FC5976BAC421C37DDA6C4227BC1AE5AE229F067515CEA3D794C8D85564AF208AE0FCF836B6C0AF41477F99C8773D9DD1923C5C07E1FD508C7436EA93383797F372EF3103546A5278A4F59614A5D182344F0431D065C35620D63D4D001D7F626993241362E67D1BF41419858EECC2626537D44E2E23619381E96CFA91B3D8054681D298509D9B99E7AA99CF8742E37637B24136F8E1B487E9571E4C24AE5DF307E4C7C62E55C47132AE404B33E5367C6F24D6680BE32D20BC58370145486FD5EACBCF98EB7E7FB6293044067AF11879E91444025FE52E24617269BE192BB71BD9F95356EDBED9DF352AB56A854F9F531889A88689D3F161FE6155C6C1E8011D60A46F59C7D08C477FA652B559A80567076B4EAC29A85D54C66B35D6960DFF75A696CDB17EC9A7B74DC6C3652DAE866E8758170D055C4BF60FA1238448CC9E29160DF50160C4B0DFB36BCA40AF0BC5F7D490E7DBCA49535742EECB90098A0A0FBBBBC7AF25C0CA9BC039DFB555DD8431AF188F7C1D0FF786D627C058A0B9A15F26B58AA2A5992BC8FC5AA14025FF95F294203B45EA081E28F094D0D4AD671C885E67B2E9E800F10048158698D56648F67BFA8CC73DD5AFA15C1E48936B2596DEE34459B484336C20CD77E58BF682479F9AEF2FCDA86E4F3A2FED7046E5A3828A9B3C0DBFFC25FE699F25629A2045A51242E310CB369B730A5E81167758D7FE843261A598E4541B02D0DB4BF5616BA07A440665F7FEA6213114B6B1B38BC033D70E845445DCD18E23D34D3D6F4A52F5F904AC5D8FECA5AF1123658D09613209EE19954174A1AC7A8C7F9EA288BBE5A0705F3CE38F30ED5EE69CF5208D461EFAD51C456507C3729EB338CE15C4C253BE21E81F082B0847C6871CA0FC8B3E80115FE2BB8CD8AFAE69A3C1429D21F149B7446888BB4DCB639819EFEE665B6D6F69E61452B9328B4887A7C04E9949390980A2609A667267035B11BF862C1131533DDAFA518221627E0EE7E4009CD48E4AA9D0753A9AE82AA0257B69D569B4C53F05A75A521B327322C60398DB0947D205D2A33AE51CF2CEA8C9162DD604F8EDBE91F5199D19EFBF9896A46389E7BCBA54B4AA57CBA0D4F9DA117F288133AD01A9A9B2A824D54F74D4172BE2B1E5F0D3DE60C13AA5B668EE6A45397C2E39573EBFABAABA48D1DDB2AB6453FBBAC8DCC05349404889C7DE23A16EAFAC8D5E541457C32CDCE80CBC -pk = 64E35410F8A8CBF85FF64038471B752DFB58C05BFBA5BFD8A11EEFA97EE86223849C818ECAC36653FEDF3B2A53FB6D0233CEBF66C12C96F000D770DEF3EA761856B76647E4872208A37A35CB43705F0831AD1649DF2E662F010C23B4B45DC102 -sk = 64E35410F8A8CBF85FF64038471B752DFB58C05BFBA5BFD8A11EEFA97EE86223849C818ECAC36653FEDF3B2A53FB6D0233CEBF66C12C96F000D770DEF3EA761856B76647E4872208A37A35CB43705F0831AD1649DF2E662F010C23B4B45DC1020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ED5FCEDF09BB8E756E1EFADDFF4C73EF908E63738EC443652D16A4873BE62D496E27B43E517C75455C033F6DA9E6417920D88D4A7B1AE6ACB335620A5FC31899C6EEF7FFFFFFFFFFFFFF5E9BD07227F707852DFA84A025CAD31D6D42BA35F74BF564474DB39F5145C0FB580D2BD7662724A5A37C38DD0F55FC06C76836613416E1199388D36037036B2D34C1CEFFFFFFFFFFFFFF960E68E03AB05206E4309DAA7F28AC700A13A06337FBA595F5588B5D1AF9E8F825C19DEE4A8EFFD78F66E3FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03545B771D32038668C7AEADAE29A0F67D972ADAC752D00537E61DDF724135F083F636ACF4EF00AE2F0A3C000000000000000000000000000000000000000000000000000000000000004BFBC2EFD7E463D425F1A1E5E1797DC75645AC0AD404F564429AAD1662A40AA8FE2F6A65A57B5A8FCD37F77381C45C0184E1D232FE33160A13A68BA11D315A061C1BE19BE81E9FBB75DB62BB63B30CACCB544C55BF181EA8EE3DDC33AEE9E202F3364D739D0F44CEF99A9C9126D71DE76FDEF3B4E20C8769B4F11070C45090EAEADD65AA89F7E8BF79C5497FCB5E7F027C4044B61D9F3FA97482B4D53C638730EE5877751F0B3B5E3265DF2C5B6D4A799989FEFE8918896D0DD9FDDDC1627700BFA5E174203431A61803588210D0F0EB48477E22F3BB13DAA0254DA16BA27E373184814D183A3368FC7188B5CD9F8001E154D55376F7A25CB85F582008242F43D332FB46E67820B15F9447A73E1E639EFF365E2D615502439359F868F77F82033F665EF2CBEFBC7E9538723F1AA24C58FF89A14585E746318C425DEF524A51C00AD9918A53F4E2F682CDA02D6B36790199CBADB805889BDCD4665C9B700258C7F7D7DB315361587189C3485164BB53A53973439E8EDC43F47AFB4EE89C4A3101947405C58FFCD86CE325FDB1F217270E79299980AA6D27612F2E3792E1826842F7E69CC03E5C317BFFFE5ADDAF3D4B0045E21C2432190F0AEABF2A85F94919FEE66F7FDF87BEA0C4C9BA737B2C8A6C5552AA17956BCA1B0DEC4DBC49CEEA1E0336E47BC9E72B9BDBA229EF203902B1F79E9F31344D7BE485130BE429B1708CF2D066736573080CB6E6FE6C1D747BA10324FDD74EBA6D679386CBEA296966131A949B504BE361549CB6EEC81CDCF6945A2EA4CC5042EB12CD35D30B3F6F7B900192B5D115452E2DF273D4E13FC8FD60533DD78DD685047EFC9D49F098C73653EE290688E917C0C63AEFB57085ACEA75029FFC3627703110FFC3956AAE455E1CAFE104C0AD592070756271C65F2B7D830BCDA9B0EBF3400371F8FD1756D0DE5003 -smlen = 2903 -sm = BE40414D74E65FC36E2D1059018A62C802A2B64AD2A13A884000159240BE07F826D92DD6A0E400CF4EC882D22B380DEF5D5CB0008218CD21F1EFE3E3B3A5B951004307528712B4A5EC69629B2E01BF96FB89051033B38773D05600FA8D9218ED8E06C0B03D29AE01520CB8F860755D0A10BC822C0011E940421505FEE4242A191A00089A7EB85107ACFB0C56C59100D5DB466A1739F608B7005CC900E709C51E0D8B2D440858B96801A7FA37248CDA49108C3070ED00FF2A6250ACCAA475F77482E500C52EAF4FA115FA88CF5C665501010138023641C8A63E255859935C55B931F980BB62AD23349B4014036E532F8053AE943B85935200008B8535B898563AEE656E5C4C0D052447D338BF1A375B66B77FB96CBE7742508B57DFF4D33A368EBB8451C2C67B980D3576E6588D8678B285EF288A8B5C9C2726C4A550E764E47FFFA2A128533A7653E480288447509E10013AE1944FFFAFBD9E2BACA0B3C7069C07A4186C056FD3857CADDADD5F891512DAEEB26865F5C89FFA63A64C85A08E41EBE7BD8786A8ADD571A4267D5A9E426840A0B988E197A09F3770B5B0D80D65515CD4D8390AF40E6150062DC4B8661A8238F232692C152C97B8CD5BFE7B5AD863DC92D99744D769087B3EDD81D2E475F5CF0224B10CDE6FAE8DFC3519EFDBE66805AD4468D84D3DD93430363677360DA8F56CB58A6B775FF6417C1F324380B15C9BA668EB0F25FC2A690B483E856F3327B2D79FA6259E30D7F76199CFD21152B7C6FFC3FC113F70D3930C08B3C1EB1BF25C100C5A930EEC2C52664F092B89614943D9D85ED86A2EF666A94F9826C3D116A2BBE49443E2C11748C977716381D9463DA8D09612B80A6760E5A6FC5F59425EAAAD6C8342C1EA4BEEDD5D73151CE213C0B155286FF22CD28E3BB88E0CEE39CB859900D1E0FC19F6A7237BDA8E51476F4844A316752FB347492A928EEB07AA39ABDCC0164D1921B61352ED4AC94B82C410A56505633BAD53A3E649ACAF64C43C1ACFCD4715FC594AF6FB9E85B0B7DDD6E8621BD12A2BEE48223A97EC8502C16B550B03087B6E87C1A860D36322064F8FEBC52F2B7C31DAE7430870259BDAA5889852E3AE6F61013F5AD0D38727CF9D90C67BD7BB3B82D303C6C35383ED86FD5B7DDEC824EA198EF780BE830A1F2679D24EA6E2FEEFB979563F511D188F409F0CFD0050FD418414D01E46DB3D23B3A90B24F4E96EDD4F863BFB333D6A826D29EED167738BBE22C516C59FDF81B032BB55473A5EA2A1DEFE71C95A1EEB5C028435AD0379896CBBC76877501B054CF1FD2F6D7A9DECCD70D0C07111147EF568DCE514DE96EED61600029C8D103B31C8B344A700DE630276BA2C5633419C59E66577659538A6381E45584C7E1D6ED978AB0AF89067AC83BB70DEB6F2C58E339A5A66176A54D985DA6E02002948C62BE6F12314240FE18B09AACBCE82EA462586B8316C3E0AEA00F9998922F8D956120E53B4178223F4D2934A20976FD5A72027C8F4CB33E9BBCC0ABD15395151266B6CD5B4A9E2FC1725D8E9AB2CBDA47B507BB25AC995EDD51EBDA5FD19CAF68FAD8EAC57CB5EF0C6FC861A73E64648EE3255DB4C3394438F49377CC4AC2FCE1B6BC812E5D282F122678713C6C6D452A33C632C0AA47686588752D72B0586FE5EC2464A6DB40662FD2106A19F67DCCC45692FCA03685251D512642B0CEE436C78D94C6F5F25BBCB41FC7E5B1AECD52B846A0B70EAC93579603E9870F942AD4C1CFC9D49B1132777C6F1C184C1537178E5029067257A2DA2827A2EC44D323D13DC6E4E1B9EDF5949D4324228687FD54F02CCC3C4DDA635FA546A5A6783959B1C48AA9D9C9F6381EBCCD979253460857D3CB1C70893EE6F04709E35923883EE3C71C7F33B8CC28B9136B3EBE5F52B9A76817F2F74FDC2F12B459DFF32D5A295BE374B3FE507A0995BCACF1E7B24F4501B29F1E8B4F2A8CB394B3E459A4296F6439BA59EC88305AB045FF40B1DAB4F672F878DE1F9E46B9326CB3E2F3457B83EAD8DEC28DD079AF0E984A69ED882E1CF21036578485DFC2DEBC9CFE82FCE0383B4039D147C4C7E31E315FB57B9093DAA811F4EE4568E32E5625ABE76C5A1AE42A03441DBE766D0EF4DF607406F7D489275E8C5D4470866F9049A4AD5C428B843DEC3702E86E177E4B60181D2B5F099BEBCB25F04C93D087C72436E87A9B3AFCE78FA31E2B892400B5C1071F8AE0F78EF6F7D71859A97C17EC0912D5EA27AFEACE739FCF66F489EC6355A3318F79649881CD6C7E96A881ECC4FF6934C3D10D99F1DFD00592CB037749B025BD4BC2832E206C1407E600FC2170C0BB57E5C7AF0756830C2A6913E2B9C60575CD4A394F2A65C50E40A43CF5EBCA6A8A32335707DDF4633BAC7375DD53E24DF20AF30203B514D3793392E38FA8429B050F58B28CAD0146F385809CC7FAEFF8B71B2BC93D2C6F72E31AE2D07CBB3CB7F43540894E01654EDC71CCF4F361A847EC5B1D23C2D4680E29F0E1F992EDA3AC41ECFE614FC010A2EED1BAD87A7D17468D6FA5356EDB25E9008A9BB328225F85202246816E1A542E1DD746A5FD3E064FAA1248579D31CD3D65F8FFF36F782622402DB328C7850D82D8D8A52B897353A2F8B95624D2D958FC1C3AE6466EACCA2A6A5E6ADD4A582D27E07633CCF697FA02E243A4FBB3DC727B718B5AC0FA6AAB217E241627E69CA46F05ED6B496A739A29EDAEEF76992A507130715BE555C68A7EEAD6E8FF3A378D8F4B7BAFDEE3EDB9EC094440E31BBA717A9C82A117D05EDCA2370003DFABFB2EFB29510466F74E76CECCFC41709FAC4CD8EAA998357170A7A293209EB0BB83DFE5E2F6D73C28D5409C55E95068D647BEC42DB8098F0089EF8A5FC5976BAC421C37DDA6C4227BC1AE5AE229F067515CEA3D794C8D85564AF208AE0FCF836B6C0AF41477F99C8773D9DD1923C5C07E1FD508C7436EA93383797F372EF3103546A5278A4F59614A5D182344F0431D065C35620D63D4D001D7F626993241362E67D1BF41419858EECC2626537D44E2E23619381E96CFA91B3D8054681D298509D9B99E7AA99CF8742E37637B24136F8E1B487E9571E4C24AE5DF307E4C7C62E55C47132AE404B33E5367C6F24D6680BE32D20BC58370145486FD5EACBCF98EB7E7FB6293044067AF11879E91444025FE52E24617269BE192BB71BD9F95356EDBED9DF352AB56A854F9F531889A88689D3F161FE6155C6C1E8011D60A46F59C7D08C477FA652B559A80567076B4EAC29A85D54C66B35D6960DFF75A696CDB17EC9A7B74DC6C3652DAE866E8758170D055C4BF60FA1238448CC9E29160DF50160C4B0DFB36BCA40AF0BC5F7D490E7DBCA49535742EECB90098A0A0FBBBBC7AF25C0CA9BC039DFB555DD8431AF188F7C1D0FF786D627C058A0B9A15F26B58AA2A5992BC8FC5AA14025FF95F294203B45EA081E28F094D0D4AD671C885E67B2E9E800F10048158698D56648F67BFA8CC73DD5AFA15C1E48936B2596DEE34459B484336C20CD77E58BF682479F9AEF2FCDA86E4F3A2FED7046E5A3828A9B3C0DBFFC25FE699F25629A2045A51242E310CB369B730A5E81167758D7FE843261A598E4541B02D0DB4BF5616BA07A440665F7FEA6213114B6B1B38BC033D70E845445DCD18E23D34D3D6F4A52F5F904AC5D8FECA5AF1123658D09613209EE19954174A1AC7A8C7F9EA288BBE5A0705F3CE38F30ED5EE69CF5208D461EFAD51C456507C3729EB338CE15C4C253BE21E81F082B0847C6871CA0FC8B3E80115FE2BB8CD8AFAE69A3C1429D21F149B7446888BB4DCB639819EFEE665B6D6F69E61452B9328B4887A7C04E9949390980A2609A667267035B11BF862C1131533DDAFA518221627E0EE7E4009CD48E4AA9D0753A9AE82AA0257B69D569B4C53F05A75A521B327322C60398DB0947D205D2A33AE51CF2CEA8C9162DD604F8EDBE91F5199D19EFBF9896A46389E7BCBA54B4AA57CBA0D4F9DA117F288133AD01A9A9B2A824D54F74D4172BE2B1E5F0D3DE60C13AA5B668EE6A45397C2E39573EBFABAABA48D1DDB2AB6453FBBAC8DCC05349404889C7DE23A16EAFAC8D5E541457C32CDCE80CBC - -count = 80 -seed = 07CD8F8AB7CD12EA7CC94103B8623D6F0FEA2BAFD2325BF6089DF5351BDBB9A94525C3C6B72D3820F2E4D5F9E7C849F8 -mlen = 2673 -msg = AAFA792BFF719A3B794B2F8198EBD1556889C8C61EE6A51470AC9B274CB162AF44A26E2BA5EA7663C4C78B4B66B322ECACA8F2EBB6A610B51D7C4399F4A64A870C038797CAC80F709CA5C3C9FAFF7D797963E60983B584130C1B99328AADB2D261217CB95A535B8518A78A6D2F6CB8400C2AAA2DAF451391F7B8AB0277A3AF88E1CE6F1D3DBC386CBAFF15308F073D29838692E645F566D4B3DB4186C259BC84606855EA88938CEC4F7211BC9B461E39DFBB9E44CBC273E02D4314A037E0A26D60985EF5A35F069D8B51F86E9B6801CA067AB75565D73581EBBBBD98ECB5AF47509C8729D82EA0B35F0A376EBE6D90108CD61FBD0CEC966C17264F6A87864457F41162FF7210049E6CE2B5354F8F19161E0866D6BC3935815D9267C600DC529521FD092B126EC440D49B8E3A166587657B52AE9E2923644F72876EE94A61D2DB0EF4DAB33ABEC0C47A6A725D4CDABD06D4F6A30BD7C90DB3778C17B7D8CE82A5123B798D8B47C7F3E968C9E9F82A6EB3C2BDD8FC06D282F5CBF3050F6FF71E2EDF7A109F23AB47F427BD75163162C37722BF70A6BBEBEBE8FD9C39152AFEB78C37D718014F739F20BAAD1597B1F9C4E0B59FD82B834D83DAFFC935DE4A3272D7C2454508C07502943E90FDB56128D6E6009ED09CE80A9B60D51AA2E4E162F7F0C362F6886BBCABE29EF6C7F38B742000B9D152FF709082FAFE809C5DC9BCBC6F300B0A7840D0D36F39567D14D8227E7145F7CA670EFE917E0F18B0570DA3E05DDE56883FF12BC0C76C2A1E9FEFFBB728D991769B7D0B0D34853C76FC0655AE200501C28755F57934BB9F46A3C6AB1DD8E0161C698133F4F2D7CAF3392576B4BD2B6F8735D80BCF60656E132442BB7FCFDAE160A2DFE3F3FB8209B5C933201785A7E8206096B84A222A68E62501846273F6A9145820F87F450D12C64FF79A843E897C8394AD54AAF4F3B886FB00A6C37B2EFD0F6D4DD639C9989E7CA30E4F12EEF440946B61D7A28904E1D74009B6D1AEDF2FDA8B5991CB37795A8EE51BBDAAEA34A4C7040944761B9B4B4C12F455C536992A0852F7F07A9AEDA8E522591CB4831B0C79FA977AB6BC49C9730186855986035D2C6E5A6D93DA43E8825753721978AAEB433CE2F2A7D67C1FFEBFEA6F6059474D3022817A7329D9DD0E4A292302E4A57174B9C5346E4B6D75D65882CA7339A48C6E7AF776A8515014A20E4390F6B4F4A19990FA725F5A69B9C3BD4E8BBAEAE49979AC19600A3CEC6DE154985E236C3D0684269974BFC82301AC7196675F618182D7CF15EE5CE3B7ABEE0DEEA5C72F54CAFEF203D556B31327089A0C0DE94F74458CFECB481ADFE3CBB5DA422BD3626B00C4572B4C2BD7584ACD9129A76C616AAE51F944BECC4682AACAFB8E3BB1A42A6A8E5FE7BDEB43305A34A98308EF2D49EDE4F41361446A9AE4DFC1EE13D12821BE0B01E55B865B563633E5A19DFB6425CB60159C147B18A6419F5085C5D0882656ED533EEDF97674D0BABB6CF32F696DEC0F9921CB3DC9E6021FA198D554B1D83C42A0BF214FE4C0431547384F45AED9190CBCF98ED8278E8A03D551FA284C8A26218F0B0B58D99879DB98449CC99B6B399DDDAD9924E6A7EB20A0F1FDAD2F8138BDC7B445BC01503C509066B1603CDA76FE41727AB5E027DCB15032E8F66BFA84544D22C501AA6F62B02C0F8764387163CCADBF1ED7238E7F16C80E6C37AFEC2E10FFB95AB0A39784F9FCCD8AE263758ABE392727E9AD442A44738D77CB61A6B1540ADE751130489015AE5917C927232EED27BBF88481F3CA0C5ED2C31DFA943B2EAD4A8C80B4946E3C138A61BAF43A72C7A25E16874CBAE254D3F14C154F7C60CCF665B566799A01E0F769B60F73C17C840E0018C6FBC10EEDA3E35A77586B3A5936B363B2D5CB25C78A3E3AABBB84F1E64DF47F97AE1645650FE1751A724EA9BF80744D0F33DA6F313A3CC17D8F261585B62A75C167126D899219A26210DC55AB6DB2B94E6993849B4986F988EFB07478D6621CBF4B8ED772E61B0246A5582242FA20339B2D6CB89BA1B9210A318EB4697FD21EFCFD230DE9680514A442A13B29D8CB2627A6970BB97BF09C79C6ED7A27247662B25F39C8D675B0747F1A6D9EBBF7CFA7BC51A7EA3A7307EA4FA2A463BF53A645FE701FBF26628731CBC18636567AE633A49E59F6F049447803FA3D4F1F79F38026DE9B07D8610C9F01BEFB7054AA46E523E001C1EC3A4E7084DE0CCE596DC63D9C1F1DC03F35F9B1918E62ACB2640102E1D520E900969D53E83D2DBDDC80D1DC54BEE99531FAA5A8D2DBF8346C7ED123587353DD63823453DE350545C176446845BB3522A862F5D675419DA901CF7D2D1F7050ABFA3237D42753203BE251B0364379232D2D9D8642D52A60F6F4CB09EF29FA1E6069F97A1175F8447FE98A813CC182E33FFD8B8CAD93BF32A60F1A9E63A79A7F7FB9162783B89BB57F3E73155CED1D0084D5BA967F76C89C61C1A3E944F3B6F78D6CD3D1139A315C5276493481F3FFF9B6A6B40C920EEED9EFC74108C6BBA5A15DA736680A23DB5672C5A32ABDA24B49F2011F44FA8FF9C73609EC195025F0456D753C848DC6296920FC32DDE2174D37BFBCB86CF618AA0D486EE46C5E1EA14A3BAE4952AF5D4837F9B8122A19D1E59B909ACEBA6C849C8B452CD6CEF877A65FD83E6D0C6EE35886688F1D877612CB8E671D83216A1F76693D6A4D6A2EC13EB6CA2005328B3C91F51B352A707EF8180F320D6E1685C1EF4D87E3CB77FA549BC12727E59C11BDF8A9631CC272998253028CECEE8A2914182B90F586D80E7ECE370979BDE683F37123090012AB9243A4C145D6349C2791DC44E54956C5E9B59FAD017D3EA27D85B48A896671A0AC14A73B5AB9145D8BA6AEBF9EA25AC2E8E2C4D16C5009A83D0E84CEB80E95DF2CEC4CBEFC7F5B90A84D408E8C4855F9AA2987D9FC9D8A451F32B367BB1DE5271ED35EA153B5D400A6D8050EE82F519BD930245A96C9727FD24D8B94DC53D4B4F00D03172CD6B7F2BE163B6D16FD6247B01988A6EE6CE7BFEAFF78E983B8DDFBA4242730E52B57876E3719D1F9F6CBCC81620F848D23C31E3FFF7EBF2AFE5011E6466B1889E7EF6281FAF8B18A012CEB96796FCA9B28E78335DFCB85BBEAFAEBB0FA75EE2D0D391CA97E05F0FE43475135B13613206A0D88438F17EC8E604B007AFDCB9FA1378B7CB96675E0B19DC6FB02508E05A7FDAAF09297A3884AA051B6389A52F921F8FF31970FB082DF554226C2613B80CC1ADFF770024D6BF011C0F028A012597AE56F36EB6B3E864D79639810B8BA7258B18192B5CAA80DEA4B140D3C6F1D707ACD2256D676AE90980BA80E10B44109211ABA830EE96E1BBD248315C804D391A86AB7D4B3A4A37FED90D9867DA4B93FC32E79403E5D78AE99AF1CD2ACCE65D4F3384D9CEAB71B1E93B99704C64CAF17B999234361E378B9362D14BE3FD9E6C268013CB1FA2EA8361749D635C0429F796EB15A685E31DFE7A76AE870EBA120331AC830F8C486F6C0C4F07B658EBB9274A463E0EEA101481DD6B58835A303ACE802AE79EBEF51ADD98A67B7FF7968815ACF4504B9D360F7C0120A00ABA1FC558E6CBD8324EC35E0985294563A8D7ECCCCD9E3D1557A09885770836ECCC7AEE0F18B81E30F85D695440B5BCE29945CBF60FF402B281942D38EA33A4B03E9FCBBBEFAAC2C455E8A03FF3F35154132C538EA16F0605EFB788C3CA8435F6D595F776433585094ABC75BA581EC59AF701F66DD6091623E4676D167 -pk = 7595615F9A2078251C2067BEFCD3EB8B1A31AAF506B8FF763398193FFBC20851C140F3EB1757473AF65A7CA1E08A34003B51E8F0858640F50F72820E91BA6E853BF648E9AC77B1E467165C5CAA0B841DDBA9279E391EE99B87A5B858C2ACEC00 -sk = 7595615F9A2078251C2067BEFCD3EB8B1A31AAF506B8FF763398193FFBC20851C140F3EB1757473AF65A7CA1E08A34003B51E8F0858640F50F72820E91BA6E853BF648E9AC77B1E467165C5CAA0B841DDBA9279E391EE99B87A5B858C2ACEC0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007B27C536D343FD8670541B4B196573F04CABA1AA770800B6FC78056B8EE334C3C99BF363BD8BCE32D385B509BA045785CED8CDCF7CB8793A06E9EDFA5F30FFFE2894FEFFFFFFFFFFFFFF345A739F9B65F05CD1B569CA79D9FA8AC1C42604CF88C91550D24491D3B7E5EDC15A852CF8A9D0DACD250B991805554582B48767EA4BE142FAACFAF0433B729CC562E9FFFFFFFFFFFFFF584627CFA86E77FF00FE6F1091510C0FDBB514B2DAA07066D6957DC85432F5E9A60B16CDBE2750F0F29AFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13589E8C482B494086ECD755BA8BA3022771D8E5724DF11CC0FEC03E4AB6C1717A3CFA4992A94BFFAF623E01000000000000000000000000000000000000000000000000000000000000839919AFC39C4D236B08CFBBCDF3AC0B6F0B4ECFA4DDF0AE03A09BB83E790115BAF17378B216B480FF048485A6EAEC01449CAFF1D45B0F2F51EF6BE43A82C8E6279FE7714EA552C673EF234CCEC3022D8DB4F36A9CBA1196E95256F15A267F02E46102468E673A5A33510307D839340231CFF0D2BA8AAA81BBF521A45F54DA721B6C739E783F37721DB91EB210654F01641E783D86930A3A3CB19046EEB76173CFAE26F5F2EFA1CA6082E5300564B732A1A7586452510343317F612FC3EBAA00F3A7D29A498F710EDD7CA7BE737E28D63704BCE825D0B847AD6D8D00DAEA5A06BE38AA7FE4F4236DBC0FFA7F1E78620364CF1FAF77FE54C32D169418357EA504ED20308DF0CAB6EAFFCBC6F7B3852E4804E6BF65AEF56AAA458BCFB1B83C0000FEDE20A28BC496B3D7C218B8C7D087547C99194A73FF96577253DB2532308183B58227AC6589100BA2B9587BB435D1029CBE5D3DFA0156B678737A2CFADF82F18100FA7FDF359D01DDB9C9CE63AC8105E84BA1EBDD943C10B0935984FB3365019D06739A1C113E3AD1B575958E231DD9498642DCA4DFE99772FD4283B88DDFDBCC857B92B3764EDC5470C2A1E0FF8B026DAA1BA07473B1EF6EA18B9AD43D8ECEF80E472A6CC5BB97BABB8C5192B6325153418267E5A1129829BF12799C5DD1033F6718486E9C8487F29FBB022FFB2AA9C5D30A848A84ACA837FE22615F685F718ED20EA02F8165557B0E47EFBA5CD7013B055246ECAECE19D7DD483943C0419513CB9816451F7BBA6A58167E0E61435F21B3DDE76241BE77E38B0B94344FA2019DC15468BF0EDC5BF39F2D98018654B23B1EEC541E4D935396FC0D652C34242B4014F04312A653A8FD1D764EA975AD03442E63BD61F29387F0D04331DE5E5B3F479215D5230E13FFE1AC141E9699023BE5E7B1342D703EC670B0B28F35D30802 -smlen = 2936 -sm = 26F4EF1EFAF94C0B11CEA7F101D3A1F6A9EEAD656201188ED8008BA489F75FFB768D03359A34017604757DC45668154BFF61D50109AF5E93BBB92868E4CF1BD50111AC45A2F625636BA70DA79200F539B3ABC09637EDE272BA1201411740ABFBA569F0DAECF72200EC1D89F93676DEFFF753997001AA93F95AED1FA5B62ACED30000C2914399D9466057095065C901D73282A971DE6FFA96B11B8C001185D5C521698FB094CF179E01D58F44B2B506464AF25B57CD0032CDBAF28FE19F4AC62EBE5B0080B93143049145D958F838250101A3BA2377A8973B45ED6D708F2A29A5207C17D3D0D2665A8D470E03B171796FB1FE1AF99B82975E016A2200F726277CC35C8871AC070CAAFA792BFF719A3B794B2F8198EBD1556889C8C61EE6A51470AC9B274CB162AF44A26E2BA5EA7663C4C78B4B66B322ECACA8F2EBB6A610B51D7C4399F4A64A870C038797CAC80F709CA5C3C9FAFF7D797963E60983B584130C1B99328AADB2D261217CB95A535B8518A78A6D2F6CB8400C2AAA2DAF451391F7B8AB0277A3AF88E1CE6F1D3DBC386CBAFF15308F073D29838692E645F566D4B3DB4186C259BC84606855EA88938CEC4F7211BC9B461E39DFBB9E44CBC273E02D4314A037E0A26D60985EF5A35F069D8B51F86E9B6801CA067AB75565D73581EBBBBD98ECB5AF47509C8729D82EA0B35F0A376EBE6D90108CD61FBD0CEC966C17264F6A87864457F41162FF7210049E6CE2B5354F8F19161E0866D6BC3935815D9267C600DC529521FD092B126EC440D49B8E3A166587657B52AE9E2923644F72876EE94A61D2DB0EF4DAB33ABEC0C47A6A725D4CDABD06D4F6A30BD7C90DB3778C17B7D8CE82A5123B798D8B47C7F3E968C9E9F82A6EB3C2BDD8FC06D282F5CBF3050F6FF71E2EDF7A109F23AB47F427BD75163162C37722BF70A6BBEBEBE8FD9C39152AFEB78C37D718014F739F20BAAD1597B1F9C4E0B59FD82B834D83DAFFC935DE4A3272D7C2454508C07502943E90FDB56128D6E6009ED09CE80A9B60D51AA2E4E162F7F0C362F6886BBCABE29EF6C7F38B742000B9D152FF709082FAFE809C5DC9BCBC6F300B0A7840D0D36F39567D14D8227E7145F7CA670EFE917E0F18B0570DA3E05DDE56883FF12BC0C76C2A1E9FEFFBB728D991769B7D0B0D34853C76FC0655AE200501C28755F57934BB9F46A3C6AB1DD8E0161C698133F4F2D7CAF3392576B4BD2B6F8735D80BCF60656E132442BB7FCFDAE160A2DFE3F3FB8209B5C933201785A7E8206096B84A222A68E62501846273F6A9145820F87F450D12C64FF79A843E897C8394AD54AAF4F3B886FB00A6C37B2EFD0F6D4DD639C9989E7CA30E4F12EEF440946B61D7A28904E1D74009B6D1AEDF2FDA8B5991CB37795A8EE51BBDAAEA34A4C7040944761B9B4B4C12F455C536992A0852F7F07A9AEDA8E522591CB4831B0C79FA977AB6BC49C9730186855986035D2C6E5A6D93DA43E8825753721978AAEB433CE2F2A7D67C1FFEBFEA6F6059474D3022817A7329D9DD0E4A292302E4A57174B9C5346E4B6D75D65882CA7339A48C6E7AF776A8515014A20E4390F6B4F4A19990FA725F5A69B9C3BD4E8BBAEAE49979AC19600A3CEC6DE154985E236C3D0684269974BFC82301AC7196675F618182D7CF15EE5CE3B7ABEE0DEEA5C72F54CAFEF203D556B31327089A0C0DE94F74458CFECB481ADFE3CBB5DA422BD3626B00C4572B4C2BD7584ACD9129A76C616AAE51F944BECC4682AACAFB8E3BB1A42A6A8E5FE7BDEB43305A34A98308EF2D49EDE4F41361446A9AE4DFC1EE13D12821BE0B01E55B865B563633E5A19DFB6425CB60159C147B18A6419F5085C5D0882656ED533EEDF97674D0BABB6CF32F696DEC0F9921CB3DC9E6021FA198D554B1D83C42A0BF214FE4C0431547384F45AED9190CBCF98ED8278E8A03D551FA284C8A26218F0B0B58D99879DB98449CC99B6B399DDDAD9924E6A7EB20A0F1FDAD2F8138BDC7B445BC01503C509066B1603CDA76FE41727AB5E027DCB15032E8F66BFA84544D22C501AA6F62B02C0F8764387163CCADBF1ED7238E7F16C80E6C37AFEC2E10FFB95AB0A39784F9FCCD8AE263758ABE392727E9AD442A44738D77CB61A6B1540ADE751130489015AE5917C927232EED27BBF88481F3CA0C5ED2C31DFA943B2EAD4A8C80B4946E3C138A61BAF43A72C7A25E16874CBAE254D3F14C154F7C60CCF665B566799A01E0F769B60F73C17C840E0018C6FBC10EEDA3E35A77586B3A5936B363B2D5CB25C78A3E3AABBB84F1E64DF47F97AE1645650FE1751A724EA9BF80744D0F33DA6F313A3CC17D8F261585B62A75C167126D899219A26210DC55AB6DB2B94E6993849B4986F988EFB07478D6621CBF4B8ED772E61B0246A5582242FA20339B2D6CB89BA1B9210A318EB4697FD21EFCFD230DE9680514A442A13B29D8CB2627A6970BB97BF09C79C6ED7A27247662B25F39C8D675B0747F1A6D9EBBF7CFA7BC51A7EA3A7307EA4FA2A463BF53A645FE701FBF26628731CBC18636567AE633A49E59F6F049447803FA3D4F1F79F38026DE9B07D8610C9F01BEFB7054AA46E523E001C1EC3A4E7084DE0CCE596DC63D9C1F1DC03F35F9B1918E62ACB2640102E1D520E900969D53E83D2DBDDC80D1DC54BEE99531FAA5A8D2DBF8346C7ED123587353DD63823453DE350545C176446845BB3522A862F5D675419DA901CF7D2D1F7050ABFA3237D42753203BE251B0364379232D2D9D8642D52A60F6F4CB09EF29FA1E6069F97A1175F8447FE98A813CC182E33FFD8B8CAD93BF32A60F1A9E63A79A7F7FB9162783B89BB57F3E73155CED1D0084D5BA967F76C89C61C1A3E944F3B6F78D6CD3D1139A315C5276493481F3FFF9B6A6B40C920EEED9EFC74108C6BBA5A15DA736680A23DB5672C5A32ABDA24B49F2011F44FA8FF9C73609EC195025F0456D753C848DC6296920FC32DDE2174D37BFBCB86CF618AA0D486EE46C5E1EA14A3BAE4952AF5D4837F9B8122A19D1E59B909ACEBA6C849C8B452CD6CEF877A65FD83E6D0C6EE35886688F1D877612CB8E671D83216A1F76693D6A4D6A2EC13EB6CA2005328B3C91F51B352A707EF8180F320D6E1685C1EF4D87E3CB77FA549BC12727E59C11BDF8A9631CC272998253028CECEE8A2914182B90F586D80E7ECE370979BDE683F37123090012AB9243A4C145D6349C2791DC44E54956C5E9B59FAD017D3EA27D85B48A896671A0AC14A73B5AB9145D8BA6AEBF9EA25AC2E8E2C4D16C5009A83D0E84CEB80E95DF2CEC4CBEFC7F5B90A84D408E8C4855F9AA2987D9FC9D8A451F32B367BB1DE5271ED35EA153B5D400A6D8050EE82F519BD930245A96C9727FD24D8B94DC53D4B4F00D03172CD6B7F2BE163B6D16FD6247B01988A6EE6CE7BFEAFF78E983B8DDFBA4242730E52B57876E3719D1F9F6CBCC81620F848D23C31E3FFF7EBF2AFE5011E6466B1889E7EF6281FAF8B18A012CEB96796FCA9B28E78335DFCB85BBEAFAEBB0FA75EE2D0D391CA97E05F0FE43475135B13613206A0D88438F17EC8E604B007AFDCB9FA1378B7CB96675E0B19DC6FB02508E05A7FDAAF09297A3884AA051B6389A52F921F8FF31970FB082DF554226C2613B80CC1ADFF770024D6BF011C0F028A012597AE56F36EB6B3E864D79639810B8BA7258B18192B5CAA80DEA4B140D3C6F1D707ACD2256D676AE90980BA80E10B44109211ABA830EE96E1BBD248315C804D391A86AB7D4B3A4A37FED90D9867DA4B93FC32E79403E5D78AE99AF1CD2ACCE65D4F3384D9CEAB71B1E93B99704C64CAF17B999234361E378B9362D14BE3FD9E6C268013CB1FA2EA8361749D635C0429F796EB15A685E31DFE7A76AE870EBA120331AC830F8C486F6C0C4F07B658EBB9274A463E0EEA101481DD6B58835A303ACE802AE79EBEF51ADD98A67B7FF7968815ACF4504B9D360F7C0120A00ABA1FC558E6CBD8324EC35E0985294563A8D7ECCCCD9E3D1557A09885770836ECCC7AEE0F18B81E30F85D695440B5BCE29945CBF60FF402B281942D38EA33A4B03E9FCBBBEFAAC2C455E8A03FF3F35154132C538EA16F0605EFB788C3CA8435F6D595F776433585094ABC75BA581EC59AF701F66DD6091623E4676D167 - -count = 81 -seed = 3D598F7C498D8A1095C40945975380554BEF6142578638A7627E2C0A21C59C579F8E8CDA309348FC54C764C899FB93E9 -mlen = 2706 -msg = 63EC08B711DDF5C66036A13F574BB7BE76445A1D1F83C7732B9F4C25FB9E799D4AFA55817BCB39B974AF92F3730767CE7D863B6A3406450DCBC5E0145D10B7D532DA6E80196157C38D1B6D3C173F74D67AD8DF24ECAD4D9B59921418863A38270B982C4392225EDD1845AED2199E2C38B36C7E0E5D2F3CC7F6803926D977C59ECDAC67CA290658E72BAD633358FCDDE2A4B9C40169A0C7CCCFDD93E4DA3C3838E9308533BD468A9128C5A141C4842840E45BC8E4610A7C5E7535834C5EC73312A50197C76AE984B3521883F549BE04E27D97580E6D85D0EE84CD0B8C65BFB1AA005C607DE82DA70021F8F90B7912C67DC5657E1882CFA6DA3DE1BA4ED823789C052649DEBC9085C74528162243133A6AE5C1C6BCA3F730525B167D816485E40C208AFFA8706E3D74631EB4413032730A7647548B77579323EB03D36C2EC37D2389D4A17305F607C78F3073A2F4B4395BBC94AF163ACBE3C990306BA3F89AF9AFFE785C3F6D102FB2BD55F0C1044034D6A871293B31A1B38E383CB926BAF3AB4B5F79A47E9FA7B77BCD58AA35A7F16DDD11FF642069A8A327DFA800049BABAAB4AFBEEC9FA98ADB9796FBEE925BB70EE9E96540436E1473E3AE4C56D7099D8DBDDE755A7E101BCCEB596B9415F52374C8A3A73EC66B229DFD8CD7EE7D2CF1C5E7F490C7D9381D9321B15F84F640017851ECED1DC80D32DA3A0A57ADC3EF37E021031866E278C7D51FF5CA8E9ECEA1082423B41D772C5ADC61A8C71C3D4CAAAA3433928D7931EE715875BDE2BFACAA0A7F799B45241C21BD2ECE4A5944FB6890BF24908DE58DD3C76173373254A36B0B2AC7D67926948CC0136DD9A5079D776C297FB6A585C290D5DAE1C45E91153299EEDB731E527F0F62E83C1E93C75FC74F9C7E63311562B0A55459A0D41E034C3AF637EB29BC789E5920DAADF265F42F2707DD1AD490B5F8A8D24A9968BFF11A0C364A779EC385A9A33EDB9CFC7DBC672BA60CE5F421B40634270B982D619F8E7960D32E1B8A76CECD13A3B0214DD34214CB5BB7FD530058D5DE1FB9E4E88ADCA05926CE1F5597100F55DCBF64D47FC177FF87C4BD9F6ED7670FA7B7D339EDCCE6FC1EAE069E0C303138689DDFD23396C145B79AFCF68125989C8477BFC318CDBD69D1AA6D3EE41F4B1F9BE4BE9FA58A072412078CB9196556EE56FB7B2A2761DD04120FCD9AE9736F599C8B96BF8F964B305530A6DF1F94874F36F07962F87ACC0B285EDA64D2E4857E26BED40E9A5DC0327F1D91259292C608D6C6D59804DC23A34D1F9F1B69331D68771E41542FC5D669CBC3CD7F8310F87E8FE8F6201E57B475DE2318EA6EF9F7D32A728A44334CC9DF28DF77038C37CBA62EA8CC5EE80E571879AD111F35B6A154FDF8D40FC93360D547D02F0743A37EBC4AF178C6CE36C92CE6B80B6350202D2978621684A19AFE1474155BB962014587B1F5A477092F42BC446D7811C0EB439A6829E538077ABBBF03F515F1E6AC018EFB05AF79069C2569D2CD7140C4B1B47886064DAC695D59FDE2D8FDDB35318D33EDAD94AD4FD988095B1156FD59551F0658EE666186369BFA84E30672E4659BFBF7963C377F0039E08DE2C2D9803FC12D97B5E67CE9536AF12DAEB3B9903D8D95F336FF53286284BFE8D7AD13EC21C2A9BA93C9A97BD7F6148DE7C8CB41CA75A9ECC8F9CC68D888FAF6B3E75376B5B16F41E7E6B76A686EB365365E2074FB1D7EFB1B285A2357B020FD3E47B89943FBC1596F3FA8289AD844386A691F33DAED4B7A6A6729526160F2D32BA7F68AE6678564FCA05BD811F208A8FA62F6731F23D46027008246FD4BF3C454A39EE225245E74DA5910E7937B36661548A55A2270A9D27114DDC94DD9B9D4122289DF0A5700222A977F15FD8E36AFA1C4870BD3CE9B658E2D83882AAC5F3DB814346240FF8C8FBA3F36E52AC9B441C76B6F104A0931BC45E202ADDCACCFB93A486A7734A6D82B9F6CA911448F988626846D413D987C5AC860FCC0D5F734269AEF88D41A055794DCE832BABB7E306F622E5EAEFDBE1CF195E320A1ACEB4834B3E70061EC2D624C12EB35B16E5AAE73053A3290D4BB1F51FFDF48C1A7218D365DB7FEC15BF0F710954CDEC54917600014BDE3A901DAB1DEC0844D7FF148EDED9788CC85C0CFF26E5895D91C56BA6950C0BA8FC6C773AB4A6091A5DE3AC335DDC2110EB0144FD89B3D815EF4A26F718C1ACB5723AF1DA5515442A03CFB9D90623FB21D78DAF441000E285E9E7C235C0F31E258E6B3FEAC048DB652B83E07848D2E9357649372B1A55975B2EC7FCFED19D0B6613BFDBB4B5B01A9AA3128AE137BDC1D8FFC3A38B597578042CF183BA8383C289C3D92F6B70AA9B3364E9FC5D43F3CD3F310D229912E91D5806C2A11E0BDD208A2AF438BE77B43680E2DE67918FD414338A763910E1316965BF96BBF7DF639266D075E90EE9C073011F6783750764FBE4906ECDD94EE9FB7E4AEDB23EE88EBFB018C44FC8BAFC66E6B454A3D0E332C7A6B34C2E8D1D26416FF43D768CC36CA9D3168355F1A281A6B2EAAEAC7B64AABBAD2156A1D781A78A896248C56F3491A5DDA8C22C231AA7AE14BD558F66E6280FA65F20B246D815BFF1D3C6CEE6DF9B4AA7F750307A7BF73850E6BCD22CA0AD74B4AFC13CD4AA2FB7E7B588ADB3A46A23EC88A34F13214B261A283AE8FBCE8007C6EF6BE255C33218AEBECD3EC27EDAFD252994B70BD67407620D26E8567F4C7F6D636803B6A27EACC3B853706A8D57ADBF7F7E142FF149C35119A6172D5884EDE7C71E6C34D1B485A684DD56C9D670576B75CACB870A68EA7FF2BB461D9E2FDBF500B2F200110265A3CF24370A3F480DA66F98FB5327B4CD796EAF0E559A5519F3C643B59E3B89D05D2A9F9DA6732CDC2996408B7FAB5A734310FCD73FA3FA5CACAF31AB04EC0B9734407C6DC575350212239AC9092DA5812137BFC40F7735BFDF9827F768FC0363FC8C5739C7DF828075EA2BBE6321D5A8EA2EB7E397C3D58A953C7F0BAA69A96AC8110B125EE2E9701F43EEB87FDF58A6E6266BE1136437599E26E8E6E853DBB6ED9DF3931C5F402FD09B7E203AB36EAA6EEAE72E908BD2B9CFD379BC9B407F0C882807BBD2E91F920EB24137002A48F1AAA0CBDF89FDE5C51079F1D8CF7A014207F1B40773321AD952D77CE18EC7B48F2CA054E65420C1132AB67C832EE22FFD8672803CCE3DE7E9FD0690E55FA1AF5F11611E3E2C71CED55E3E347F4CBEB9C93BEC2B98E48495585392471AF0AE589257ED8D01792112C798BCA5107030F207CE567594B8433490D8FF1811F21B03A42AD0678927183321355E3D6908DC1125CDCE038CD0469D72458B6CC5E67EB0D78C20819C6F3C4518B15CC63754FF8679915E329DD46FEAEFDA5249ED7E754E7BD55C75CB764B6CC36BC06267B2479CAFBB3F0BAE32A93558190B65C85DCDC080CD56D51D4105C5B0717691D4DB1893EF8AD550F55855B4123A38D18FD67B588A3A4C2A6604E874D721359352B235C17AB1DA2758712AF8179FF433211B93078735F909F985F557D0DE52CB9203DDC67BF9DC8632ACD8D4F90196AF6BD2E79834371C5E9FDF5992ADB04AEA186AF36F56271F763ACFFBF94DF4B0512CA6B7CA8FF486504E565BDA367E044FCD0F25FBC2A6C720867F95BFD92109780D2E6DD60CE90A4CA8EEB8C4CAB289DCF99E687B017B37695C3B99B4FE97D7E5D52BB9813C04D03C9AD71770FE0986C7F3A3FFD3A261AC771DE88C7ACDEF253E5CE2B50BC5C576D132B68CCC694BA883770B80F5ED7D527CEE816527F69CA2C101747A0088879C3663037DB5B -pk = EFC3FBD30CEFDE08CFD4C66A8CE62D8A417601B5F0612AFAA356F04C1CE4AB862A845B247E86D287E0C7DF6374401000FFDD9C89C4C93068BA9620FB9230D6CC3C77CDF4822DBD33FAC617D7DCAC6DF6178A904D84F8E9F7FE2B11B6BDF7BC00 -sk = EFC3FBD30CEFDE08CFD4C66A8CE62D8A417601B5F0612AFAA356F04C1CE4AB862A845B247E86D287E0C7DF6374401000FFDD9C89C4C93068BA9620FB9230D6CC3C77CDF4822DBD33FAC617D7DCAC6DF6178A904D84F8E9F7FE2B11B6BDF7BC000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B3A161C03E2EE46D532955BF2276759EF05771A8A80158F75889DB04AA9012176068DF7D9AD640CAE664FBF486CBE97B2A652F1239A6CE552D9A6F9EACB891DB2AED0D000000000000009002307C1F078720185667BF39C0368B02A319097A800A81664FE98D17E521D2D7A3D5011F5ADBA5052FFA59725C7678E7AF0C58AC3D26B8FBCAAE4A6AB348D9706FDAFFFFFFFFFFFFFF40A114183D9D4C6B8873890350CB03343E34E4D29B9D355C225BF6B460064447442DF0E9A3FC6B51E91375FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD8098417D36E01971974A1E9539D0EC07D91B57F4F451D9C458111338BFCD22B836F775F536DCD0BCBBFE000000000000000000000000000000000000000000000000000000000000007E0AB3084DCB72B88153545368D4BFE19025C15F1C271D1EAF4B695FD3F919796661339970E1E87B716A8F40D9368002D7EB0D5569232A947B0261256F84E25E52E0E66FB330ADBDBD0F6243A47131A533DB55DB3E3542443B3DC3946F068500D42E8443FD8600A131D236EBFAE83AE149E0CBE408F181460FF2C65D94C885897713BA6F17574BD04D793F1D3BAA94010EE7B95E57B158C8DBA08057A5C6E3ADC2099513C581AD7C4419DCA9611958367479D83CEE8608B0F0C32D204A175C012047C2B5C469C83B681355A3E9BDA96F5EB69CED233A7B742F394256EDCBEF1404A8DC4FA8DCE89D99822528E3063103F9A4512AB4C8E11152C42FADB6943C8E1E8458C9559E5DB8D6E953EEF963A106AFA6774AB51382DE9DCB952B3667C1033B7322B7009088506308718FECC0A45D65A636713656D61A608AE996D340FB07189D412115B92CED2A5EB6244586040193103F3E6C3CC202B8BC8167E602B3B939FDAC93CFAA7E04860CBF81F94FEE7F61D2A8B9F3F25E960E023A667432AA03CE018F4222E5F4615C13207F1614E6036D350BD5C981795673BAB0297E94D251FBA5FB6369E87B919A02B57297CE1502A398B392EAE8B4482F307989FDDFF63B586F3E500AB33817DEDFEA13EF7625F6126B690696AB7F554FCBDECEE31C3D0268EC59B095CB9C9B9960387FE0560D705527A89B0187F3AAEC396A0D7D0FEC75FE1952E18C8FECCFCC1469ECFDD56701559FD38D7681B759CBEFD0F6E87C993B63D75CDD35BEE94A119B6D918A6DADBF995E3CC26CC2EF4E21B6E9F28B2C470342B0B04203C377F70EBB508E92FDF7F147BA4508AF2CB1FC1316F53A64F671ADE94DCB0395C993ACE7F8629C9DAFAC03658C74549F196E47B2915777217C0093A88114409FAA35965C3C0E34575AA2543A54BD83C70DAEE6A9235F35D2F4D001 -smlen = 2969 -sm = AA22D3FE0DC685162712FED201D5E0A3EBCB11721D7A49698600253CFCDC44FD732FB79F520C01690DB705829FF8C8C40518B2012823D089B2AFD3852AA9C40F00706A1D419F915D1C716521C101514DC47FC5D18C7BD46742F20198F5FA61D88D4E2129B2C5ED006BEF4503DADCB120C3BAA0F300664DB4AD011CD0FC6BF0E4DA01CFC05FCCD7239645313882A9015A4F9BF60D6E5AD4C44E8A8001CAA1F8467EE4AAA909F3DF1E01A8070CC2B91DABC5C6404A7B01A724AA4DA2440959673F02C00090F7C969C8F7FE09A790574301018787366731596084727EEB8012A90333B4418DDBFA33662B6E0E03B57D6A7CBCEED9D788E6BF050095E621488FF00F5E436038E82F0063EC08B711DDF5C66036A13F574BB7BE76445A1D1F83C7732B9F4C25FB9E799D4AFA55817BCB39B974AF92F3730767CE7D863B6A3406450DCBC5E0145D10B7D532DA6E80196157C38D1B6D3C173F74D67AD8DF24ECAD4D9B59921418863A38270B982C4392225EDD1845AED2199E2C38B36C7E0E5D2F3CC7F6803926D977C59ECDAC67CA290658E72BAD633358FCDDE2A4B9C40169A0C7CCCFDD93E4DA3C3838E9308533BD468A9128C5A141C4842840E45BC8E4610A7C5E7535834C5EC73312A50197C76AE984B3521883F549BE04E27D97580E6D85D0EE84CD0B8C65BFB1AA005C607DE82DA70021F8F90B7912C67DC5657E1882CFA6DA3DE1BA4ED823789C052649DEBC9085C74528162243133A6AE5C1C6BCA3F730525B167D816485E40C208AFFA8706E3D74631EB4413032730A7647548B77579323EB03D36C2EC37D2389D4A17305F607C78F3073A2F4B4395BBC94AF163ACBE3C990306BA3F89AF9AFFE785C3F6D102FB2BD55F0C1044034D6A871293B31A1B38E383CB926BAF3AB4B5F79A47E9FA7B77BCD58AA35A7F16DDD11FF642069A8A327DFA800049BABAAB4AFBEEC9FA98ADB9796FBEE925BB70EE9E96540436E1473E3AE4C56D7099D8DBDDE755A7E101BCCEB596B9415F52374C8A3A73EC66B229DFD8CD7EE7D2CF1C5E7F490C7D9381D9321B15F84F640017851ECED1DC80D32DA3A0A57ADC3EF37E021031866E278C7D51FF5CA8E9ECEA1082423B41D772C5ADC61A8C71C3D4CAAAA3433928D7931EE715875BDE2BFACAA0A7F799B45241C21BD2ECE4A5944FB6890BF24908DE58DD3C76173373254A36B0B2AC7D67926948CC0136DD9A5079D776C297FB6A585C290D5DAE1C45E91153299EEDB731E527F0F62E83C1E93C75FC74F9C7E63311562B0A55459A0D41E034C3AF637EB29BC789E5920DAADF265F42F2707DD1AD490B5F8A8D24A9968BFF11A0C364A779EC385A9A33EDB9CFC7DBC672BA60CE5F421B40634270B982D619F8E7960D32E1B8A76CECD13A3B0214DD34214CB5BB7FD530058D5DE1FB9E4E88ADCA05926CE1F5597100F55DCBF64D47FC177FF87C4BD9F6ED7670FA7B7D339EDCCE6FC1EAE069E0C303138689DDFD23396C145B79AFCF68125989C8477BFC318CDBD69D1AA6D3EE41F4B1F9BE4BE9FA58A072412078CB9196556EE56FB7B2A2761DD04120FCD9AE9736F599C8B96BF8F964B305530A6DF1F94874F36F07962F87ACC0B285EDA64D2E4857E26BED40E9A5DC0327F1D91259292C608D6C6D59804DC23A34D1F9F1B69331D68771E41542FC5D669CBC3CD7F8310F87E8FE8F6201E57B475DE2318EA6EF9F7D32A728A44334CC9DF28DF77038C37CBA62EA8CC5EE80E571879AD111F35B6A154FDF8D40FC93360D547D02F0743A37EBC4AF178C6CE36C92CE6B80B6350202D2978621684A19AFE1474155BB962014587B1F5A477092F42BC446D7811C0EB439A6829E538077ABBBF03F515F1E6AC018EFB05AF79069C2569D2CD7140C4B1B47886064DAC695D59FDE2D8FDDB35318D33EDAD94AD4FD988095B1156FD59551F0658EE666186369BFA84E30672E4659BFBF7963C377F0039E08DE2C2D9803FC12D97B5E67CE9536AF12DAEB3B9903D8D95F336FF53286284BFE8D7AD13EC21C2A9BA93C9A97BD7F6148DE7C8CB41CA75A9ECC8F9CC68D888FAF6B3E75376B5B16F41E7E6B76A686EB365365E2074FB1D7EFB1B285A2357B020FD3E47B89943FBC1596F3FA8289AD844386A691F33DAED4B7A6A6729526160F2D32BA7F68AE6678564FCA05BD811F208A8FA62F6731F23D46027008246FD4BF3C454A39EE225245E74DA5910E7937B36661548A55A2270A9D27114DDC94DD9B9D4122289DF0A5700222A977F15FD8E36AFA1C4870BD3CE9B658E2D83882AAC5F3DB814346240FF8C8FBA3F36E52AC9B441C76B6F104A0931BC45E202ADDCACCFB93A486A7734A6D82B9F6CA911448F988626846D413D987C5AC860FCC0D5F734269AEF88D41A055794DCE832BABB7E306F622E5EAEFDBE1CF195E320A1ACEB4834B3E70061EC2D624C12EB35B16E5AAE73053A3290D4BB1F51FFDF48C1A7218D365DB7FEC15BF0F710954CDEC54917600014BDE3A901DAB1DEC0844D7FF148EDED9788CC85C0CFF26E5895D91C56BA6950C0BA8FC6C773AB4A6091A5DE3AC335DDC2110EB0144FD89B3D815EF4A26F718C1ACB5723AF1DA5515442A03CFB9D90623FB21D78DAF441000E285E9E7C235C0F31E258E6B3FEAC048DB652B83E07848D2E9357649372B1A55975B2EC7FCFED19D0B6613BFDBB4B5B01A9AA3128AE137BDC1D8FFC3A38B597578042CF183BA8383C289C3D92F6B70AA9B3364E9FC5D43F3CD3F310D229912E91D5806C2A11E0BDD208A2AF438BE77B43680E2DE67918FD414338A763910E1316965BF96BBF7DF639266D075E90EE9C073011F6783750764FBE4906ECDD94EE9FB7E4AEDB23EE88EBFB018C44FC8BAFC66E6B454A3D0E332C7A6B34C2E8D1D26416FF43D768CC36CA9D3168355F1A281A6B2EAAEAC7B64AABBAD2156A1D781A78A896248C56F3491A5DDA8C22C231AA7AE14BD558F66E6280FA65F20B246D815BFF1D3C6CEE6DF9B4AA7F750307A7BF73850E6BCD22CA0AD74B4AFC13CD4AA2FB7E7B588ADB3A46A23EC88A34F13214B261A283AE8FBCE8007C6EF6BE255C33218AEBECD3EC27EDAFD252994B70BD67407620D26E8567F4C7F6D636803B6A27EACC3B853706A8D57ADBF7F7E142FF149C35119A6172D5884EDE7C71E6C34D1B485A684DD56C9D670576B75CACB870A68EA7FF2BB461D9E2FDBF500B2F200110265A3CF24370A3F480DA66F98FB5327B4CD796EAF0E559A5519F3C643B59E3B89D05D2A9F9DA6732CDC2996408B7FAB5A734310FCD73FA3FA5CACAF31AB04EC0B9734407C6DC575350212239AC9092DA5812137BFC40F7735BFDF9827F768FC0363FC8C5739C7DF828075EA2BBE6321D5A8EA2EB7E397C3D58A953C7F0BAA69A96AC8110B125EE2E9701F43EEB87FDF58A6E6266BE1136437599E26E8E6E853DBB6ED9DF3931C5F402FD09B7E203AB36EAA6EEAE72E908BD2B9CFD379BC9B407F0C882807BBD2E91F920EB24137002A48F1AAA0CBDF89FDE5C51079F1D8CF7A014207F1B40773321AD952D77CE18EC7B48F2CA054E65420C1132AB67C832EE22FFD8672803CCE3DE7E9FD0690E55FA1AF5F11611E3E2C71CED55E3E347F4CBEB9C93BEC2B98E48495585392471AF0AE589257ED8D01792112C798BCA5107030F207CE567594B8433490D8FF1811F21B03A42AD0678927183321355E3D6908DC1125CDCE038CD0469D72458B6CC5E67EB0D78C20819C6F3C4518B15CC63754FF8679915E329DD46FEAEFDA5249ED7E754E7BD55C75CB764B6CC36BC06267B2479CAFBB3F0BAE32A93558190B65C85DCDC080CD56D51D4105C5B0717691D4DB1893EF8AD550F55855B4123A38D18FD67B588A3A4C2A6604E874D721359352B235C17AB1DA2758712AF8179FF433211B93078735F909F985F557D0DE52CB9203DDC67BF9DC8632ACD8D4F90196AF6BD2E79834371C5E9FDF5992ADB04AEA186AF36F56271F763ACFFBF94DF4B0512CA6B7CA8FF486504E565BDA367E044FCD0F25FBC2A6C720867F95BFD92109780D2E6DD60CE90A4CA8EEB8C4CAB289DCF99E687B017B37695C3B99B4FE97D7E5D52BB9813C04D03C9AD71770FE0986C7F3A3FFD3A261AC771DE88C7ACDEF253E5CE2B50BC5C576D132B68CCC694BA883770B80F5ED7D527CEE816527F69CA2C101747A0088879C3663037DB5B - -count = 82 -seed = 6CDB757AD36DF99E52F535C2680431D5FF36C812D8EA19399F666F2FDD66D3A842A7A5AE1038359AB618FA58A0A6E840 -mlen = 2739 -msg = 7785A08A3892C97D5EBFE52475298BA444674086D63E17E1FAEC96F6B10723447FC1B8CC758D1724A33E26518798183A4B3C99A7DA54038B86473DFAB8E626EB3BF54DE5581E04450B2821F5020C466505990B173DB9F030CFCFA505AA04B37CF0A063876843A042F17AEB1728787187428F8D1010D532C94C7AB2E1193994BFF0CB56415FCD2A96BE7F7FC2C57C8313E795367A22B6A17CE3B803083A74FDBCF030D91C957128099D6199686F2BEA618CEE111AA9D55A6F9E8966C102D849ADE596A1B576924DE0E92DD91FBB01CD93E24AA71EEF219A78430D84965672FE6AF091D46DCFA9AB906F6240913C1286EE0A152666ECFE2C154CD3FB14DC0F9C173E30FC9958A75AA6DD74822AF7ACAD243FDFB743E47E48280990C2870904EF1C902261D0BD6BCFDA91412BDEE9A28C628F218E7648AA0027D918B48EF30A9B18390331805C6739BF6A2CB69A0DE8766A7B3A448910D181F6449565A363430BA1C0FA8B11E1A151F6CEFA3870C3B1D8CD800983EBD41B48C5624269EFB440DF23FF9BCB31A4B02F6505DC862B2103F76137FC6560F893577BC3FCE92ADA27F291305F2345AC82A846854F172131B042735D4B76C6AB2DCFD32BB6258B23AC790AF2AF7624451172FA7A29E0C5FDB3DC3B719B274B2838FF7A8B25F272AC8EA90FA3C8010AC7F65633EB43FF7A0A95CE99717F35D3C416B0E0DA30470B5AA20EB9E2B66315B9407A4753DF8BF505B8066C5D57EC4CCDD2236B9C58BD7337925191ED7B75B92C9CEE626F13EADDECB07173C8160540FB9F6A4D43A1E9AB263B300C08966C247514647DFAB3B420202529E963A51F8D23BD0F689BBC4D67D5A603B876E8CD3EC0770F0D9694DFC30083991CF3989DB1812B4AC5452358075534190F012F7C0E47734C3BA748E04910783C0B845484461DCEA67A1EC731354B902557486B484F67183FC711D10F906C68CD01F46481D040F084271DD784E5B958AE05B65BF5D207EFBB5FDEB25366D6FF4161CA3A1CB71B2B9F90F86A315D800935AC0086D85D907A036C4333EA347000A0755550B68FE3DD7686E416483781B563680146697D6FAE8333C24ADC8A2436852DDADF6061E2B16FD3829C0B55C2E9C2C89F64CB8DA02A6706498CF0330742083E9AC4593A1762D32DC4E6CC2D9F4310014FB15DEBBEA324EBC2EA1E1660782559B9B39FBCF34C85FDA9AD350D195AD7587AAB621EF7FFB63277CE35AB43B01977C9F8DD6C2AE7B34FA7B35D5FA37D8B3719E736F18734CB3A2468BE9CA0832DDE0B958925A377FE6751C4EB8FF1AD295355302F0A5ED4E8F8C33FD5162542B8ED7CD985DBE3C84401830F6A7EB9D955EC74C7F98B02388B4E1353317CDB5EADAAC9025038CC01F8655C7FB9AEE940FC4B282748B39D277A7FEF462038833A9A8EB50A8719F68B3E858825911F294A80FAEDE9D4C1815844C2632DD20387950003DAB80B1A58E541A5E6658AF7D4CDD91FD1C08735B584F5C69C5CA94F6B7F97A4761B127DB394AC72E902DB9EB4B3E0B884C448FF2763FF9ADD530753263688CF92BB746181C17294BFFC2A0B3969A7BBA429A481C425B24745CEAD66286F5DF04F1E4421C56ACAA668E87BA58E3B07A062D1DA60CC6B411667BDE6F466B72C9169965BC7781DA78A818F779A9B3D7A577F71A1DF49AAC865A0D6F2668CFD2C77CFA8D306A14DBBDE4D3A3818B07DC89D5F51E117F7BFD007D60F32BB1B6BB01E76862398371FB91E0A3D4B39FD9146C47F627A066618CF83C32E5C82592B418BD2F5DCD8D42234625974F988A6F729C60BA5EAF18C77B611DFB187A581E3A10268A965F650FE242CE2FE08AA71515B59A6EDFC9CBDAE22DF3AEB22E773CC2EB373619E9CDA23C236CA3F7845C2136E93849D9F6AA1477F4513358CD8CB4E21444C9E5709818801EADFCA23F2C23DDFD5B4EBB6089DAEDD14A21EBF3F7A8C1C80BBF7D37973BD156AC5C4462D29DCCB7EEFFA22A8B6CE433B600532F33999ADC39196F01230614767285089FB262D8469DC66D24AE0B77FD05C3EC02FBC5EE328319409B8E2D7B0AC6801C1C8BA86F793C2037C71E2A25F114E9EE0EDB3B83076EABFDAFEDEFA0548DAE91E62CB7C29C03413235B8C6EB9F46BE29DE8F5D30E8D97DB6F45687DC4719B1024E48B7DFFD0D2B474B2032B4E69B6382E603D4777F3450E2E467C6D9AB2782C0AE266C320D36BF67BD6B86EA9721B22741684D9C0CCC774335430071A5410C1E34B4BC1A823A93A38F5AB4781CC593B13A593867FB634C0C705107CD278C6CCEE6D842748BFBD2FFD205C6BDFB3AC87F693C25C832C86D96B00BBA0AF88DCFBC8CA4328765DE27FBF1389C4EDE28317BD0EE447F030990E957D223A5EC66CED9D16400AF6DA8663C4E4111B4584F8F0066CDF8258D90C5D7B439503E3AB3FCC55FDF933E06D704416187AAF86E6C39695DEA8B8189EC1299670BE03B6A636889CB7F10F04CCD67278E77886CF3F6E2A05BA8D25AB8664EA817642ACF5DB4D9B3EF80E169463EDB6BFDF67172E88D233609B091BBD085B970DB8AE0DAA5048CA42D6A54042F42445BAB03F9BF1ACCEF341B7349109BA0073D3715A9073AD9BED258268AEE9DD5202E0EDFA5720A317EA5CB41706C0D235465BECDC8E3FF0D628EE5EEA6AAF1BBD3E18FE9217516893DF115E979C4CFFEC494988B6F9B86026610898C44AB1547C5F8ED5CBF3C3A837DDB6A444BD3E803E1824E6AB931310FE86B36587F1B34B0B48D358F4B97E9774213DE7D92571380BE2199E703119C5B9836DADFC826B71D588250AC37DE0EC05C5823573C102BCE44C9F044507671C4E1723950A3C0E14968CBABBFEEB049EB723DB9B23CDF0273525C29CC5165530A1F1CF830D3551DD6BDED53954947D5C334DC9C71907CDBFA109EBC52D6305477C14159257AF8C51C6F09D76FC0085C3D969EC60FB09145E66A8A7489611DB3FDEFC35202B8AAE82D3CDF666034BEFF49FE49A45C5EC438F4118F338545532CED916DE78E3BF82B4E55907474386B9C172F393EFE895334F7323CBB2AA7CE7718BEF5E7A23AF734BD4963FBC7889AA5C50F3955B904B5E577D71B21A293D766865E3F8C212DE5EA084A9D22748A8009A7D1858328A1BDF7BA0F4E3B83BE9707629252B3339CEF796696855A574B4A4896CA68C3D6A6824E3F593069EC0A571E61282F8A29BEB8BD788F7B351A8939CDAD9E257587A77804F2704F49DB3305514B85B449AEE56EE40CB2A75D51690194284AACD0855B02893F8DCD3091629DC548705A1085E5CC33DE7726A0F521C149003DF380ABDAE96BCDA55C44BF9BFA1103150F049563E848A8750625DCFDD9BFE02E1E57489B5B3AA28BEAA80F4DAA562DEABB4BB6A27125369415885020D237A92CCC3A23593FE2183225BFA2FF39B0BEF9CB0425375E256BCD572175483F713BD38F937F2B3D4C1F686C5AF60061E0B05CC3EBAAB0AE8BA21E47A8318BEE4A01516046363D152936A1344E17A65E08030522EC667233145A56001B8D065DC2FED0D2A9F02C981A8962F984916314805DAB644A5112CAA1564895121D8B1FD046F547BE282CF979752883EC79AF70CF59A88D960F3336F0AE61357877AAAA34699A876144B65CA5B77A684D850D09B3D42CDBFC4539EA103F8377CFE5F9E5432403FAB416662C4C83226191EEB7F82B01E0819C081FC40E7B978669C7856067E8B582832DD0B92588103C2616BA2C7774C46840318CA2B1A3798FF7ED9FEC087F01798EA2445B92E67E2446126A7406E82FF8D3711311BE16E9171531A95C966E6BEFEA34938E6F5FA660F7C7CB533A119377F1D26AE6AE51D805AB96A64C8B80D6EE137F634B384C2E377 -pk = 53CE819DEF4FC1F3031C464F9A23B6C0AE96CCA366E640D71CCBD866E2FC7A3EA8AF91A779EE3EDEA0572085B13F9001C935EE7648B65F90C1F4FA5D1D0E266DECF12DB6FFB78FD54AA650BE5C6766B45C3B7E5FD19DCB3623FB9E0B6D3FFA01 -sk = 53CE819DEF4FC1F3031C464F9A23B6C0AE96CCA366E640D71CCBD866E2FC7A3EA8AF91A779EE3EDEA0572085B13F9001C935EE7648B65F90C1F4FA5D1D0E266DECF12DB6FFB78FD54AA650BE5C6766B45C3B7E5FD19DCB3623FB9E0B6D3FFA0102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007EA0C46B7E1E73AC5165FE5DC7F6F52B59D6F3AEF8AC92CDB25937D41F2B31F852BD9EEA063BDB732E084CC36EE50677136FBED340546B8438F3599D6AA79C1AB89023000000000000007F2E2E33DD5CE4B4570E2DD5B97D23D9FE16C982AE3E2CCC5C0D9B71AF2236D4FCD3632F442D3DBD415C21EE4304AA8FB5DF6491E57DB9CC7D65D82934631CE7B61501000000000000002F0AA0DA0C4EBD06285192DBEEFE83D5B7B1B472F5EBCC25BAEE878FEA706D7CE8BAF49A808218B883F425FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0ABF7F0CE532D04F26CDF2C82D8EC6E5F48AA5669BFF562C15E5179B9DB0BF175386E6BF5FA6D19C17433E010000000000000000000000000000000000000000000000000000000000007AC68A0043BC7AB2A1C886B2AC5069181504FCBF0C1B13358187D1F3C3A697FD215D433C1F018ACA2E2C9FC9B7DB4D01A5AFB65413BB990D5B55D324B2F04EFC9CBFDE7A1ECED9285E338FEC0625E06D419300A335514BF2BE4A95D52D742202ED01806EA498DB7BBA6D1E861948DDDD773E24A8D92310DE019DCA22F80E7397B2219F561667893D4E12A3FF7118A000888C39FFBFE6EF0F9380AE957F9B7AA44BF5BA6B47648635B2C3F90190B845487598BB4728FB655707ACE6025F9222030A9ACEF0AC47C83096B350F9AF44AF622A69CC8CE21AC5302DE96D330C4B47A0E7D4E2919BDE95DDAFF6D117431BB7020F7B170F2214EF06D84071F1DEAE118201D4BA0F072AD9955840D6622B8EA55B732B83AD1CB634A2BF11E156A5FEA900AAE06A1413D95754AC16A636529208AFC3972FFA6AB9AEB0D031CB6EF1CB86AE95AA6D6761AFF4097EFB0D3592375303C7AE4DAD4EE624B929A487FB912A6CD70B7C82AC6A757FCA02F7A8B34BEC2C544723F2E8D93A4518FEC34C343300B7005221F8F6C5596F113DEF33FA4588504E0072E77D174745B9CCB8E0FE1BCA0507E94CBEEE40C44551C6A3811AF7F61B028B92C3DEDE29D79C5F3D6FB0FF8B24319993A65DB03344F3257F15DB17D904B402B63B62493F639A5C06090F94B18A039506BC8948313F2F3D7B3C6645F1DD1339A439393D52A02B557DA807D5CDD857BB58F3CB70AB4B3A656C86A68318C900E9C65A684A908325EE33C3FF83645B6532335987B9C15A46ABB5B5E42AAAA0B89D928836B4FB8279CF8CE7F73C8F2E0177CC580E2CBC802F112B9E25B3F6BDF32521D9EBDAFFA7F89E92CCBEF50767EA1E8119BA50C1ADB81414AAA3AE1305002F266468BA99A9D372F6125A4FE99C2B282FE18E988CC076828C1AA64A4B85E472D6EBE6556EE67399A6450C46BC3803 -smlen = 3002 -sm = 73D5489F627F4AC9C1285EF6000134AA911BEE5A1680FFAB90005F6F4F5834A64591DE807EA700089FB483042E4D4D2DE4876A01B23D496CEDDB8F65B42AC02000DC2F9FEEA26A1E5C41EA94B5016ABFBF867087B2A0C58906AA0113E008EF56D1FD86E019CE0200D5FAD4B6E5FE0CBB7824679A006DF4BF3FC307D90C1175F3790062D4B0EDB3851B290C0ABE90009903BE0728A2206722ACB5E20173C49683D7BB32BF79E2FDA10009C34FAE9C60DF0425508DD701EDD2C22BCAE3F81860BC0C9F015FADACF996A20EB6864450890001F52DC7D6AE226D042EFB714D8C315CBF72D118BC0D4D86BAE80701011C6B3D77A7C2DBF2E6424500BC9D87AFEABEFCE6FD0079164B0B7785A08A3892C97D5EBFE52475298BA444674086D63E17E1FAEC96F6B10723447FC1B8CC758D1724A33E26518798183A4B3C99A7DA54038B86473DFAB8E626EB3BF54DE5581E04450B2821F5020C466505990B173DB9F030CFCFA505AA04B37CF0A063876843A042F17AEB1728787187428F8D1010D532C94C7AB2E1193994BFF0CB56415FCD2A96BE7F7FC2C57C8313E795367A22B6A17CE3B803083A74FDBCF030D91C957128099D6199686F2BEA618CEE111AA9D55A6F9E8966C102D849ADE596A1B576924DE0E92DD91FBB01CD93E24AA71EEF219A78430D84965672FE6AF091D46DCFA9AB906F6240913C1286EE0A152666ECFE2C154CD3FB14DC0F9C173E30FC9958A75AA6DD74822AF7ACAD243FDFB743E47E48280990C2870904EF1C902261D0BD6BCFDA91412BDEE9A28C628F218E7648AA0027D918B48EF30A9B18390331805C6739BF6A2CB69A0DE8766A7B3A448910D181F6449565A363430BA1C0FA8B11E1A151F6CEFA3870C3B1D8CD800983EBD41B48C5624269EFB440DF23FF9BCB31A4B02F6505DC862B2103F76137FC6560F893577BC3FCE92ADA27F291305F2345AC82A846854F172131B042735D4B76C6AB2DCFD32BB6258B23AC790AF2AF7624451172FA7A29E0C5FDB3DC3B719B274B2838FF7A8B25F272AC8EA90FA3C8010AC7F65633EB43FF7A0A95CE99717F35D3C416B0E0DA30470B5AA20EB9E2B66315B9407A4753DF8BF505B8066C5D57EC4CCDD2236B9C58BD7337925191ED7B75B92C9CEE626F13EADDECB07173C8160540FB9F6A4D43A1E9AB263B300C08966C247514647DFAB3B420202529E963A51F8D23BD0F689BBC4D67D5A603B876E8CD3EC0770F0D9694DFC30083991CF3989DB1812B4AC5452358075534190F012F7C0E47734C3BA748E04910783C0B845484461DCEA67A1EC731354B902557486B484F67183FC711D10F906C68CD01F46481D040F084271DD784E5B958AE05B65BF5D207EFBB5FDEB25366D6FF4161CA3A1CB71B2B9F90F86A315D800935AC0086D85D907A036C4333EA347000A0755550B68FE3DD7686E416483781B563680146697D6FAE8333C24ADC8A2436852DDADF6061E2B16FD3829C0B55C2E9C2C89F64CB8DA02A6706498CF0330742083E9AC4593A1762D32DC4E6CC2D9F4310014FB15DEBBEA324EBC2EA1E1660782559B9B39FBCF34C85FDA9AD350D195AD7587AAB621EF7FFB63277CE35AB43B01977C9F8DD6C2AE7B34FA7B35D5FA37D8B3719E736F18734CB3A2468BE9CA0832DDE0B958925A377FE6751C4EB8FF1AD295355302F0A5ED4E8F8C33FD5162542B8ED7CD985DBE3C84401830F6A7EB9D955EC74C7F98B02388B4E1353317CDB5EADAAC9025038CC01F8655C7FB9AEE940FC4B282748B39D277A7FEF462038833A9A8EB50A8719F68B3E858825911F294A80FAEDE9D4C1815844C2632DD20387950003DAB80B1A58E541A5E6658AF7D4CDD91FD1C08735B584F5C69C5CA94F6B7F97A4761B127DB394AC72E902DB9EB4B3E0B884C448FF2763FF9ADD530753263688CF92BB746181C17294BFFC2A0B3969A7BBA429A481C425B24745CEAD66286F5DF04F1E4421C56ACAA668E87BA58E3B07A062D1DA60CC6B411667BDE6F466B72C9169965BC7781DA78A818F779A9B3D7A577F71A1DF49AAC865A0D6F2668CFD2C77CFA8D306A14DBBDE4D3A3818B07DC89D5F51E117F7BFD007D60F32BB1B6BB01E76862398371FB91E0A3D4B39FD9146C47F627A066618CF83C32E5C82592B418BD2F5DCD8D42234625974F988A6F729C60BA5EAF18C77B611DFB187A581E3A10268A965F650FE242CE2FE08AA71515B59A6EDFC9CBDAE22DF3AEB22E773CC2EB373619E9CDA23C236CA3F7845C2136E93849D9F6AA1477F4513358CD8CB4E21444C9E5709818801EADFCA23F2C23DDFD5B4EBB6089DAEDD14A21EBF3F7A8C1C80BBF7D37973BD156AC5C4462D29DCCB7EEFFA22A8B6CE433B600532F33999ADC39196F01230614767285089FB262D8469DC66D24AE0B77FD05C3EC02FBC5EE328319409B8E2D7B0AC6801C1C8BA86F793C2037C71E2A25F114E9EE0EDB3B83076EABFDAFEDEFA0548DAE91E62CB7C29C03413235B8C6EB9F46BE29DE8F5D30E8D97DB6F45687DC4719B1024E48B7DFFD0D2B474B2032B4E69B6382E603D4777F3450E2E467C6D9AB2782C0AE266C320D36BF67BD6B86EA9721B22741684D9C0CCC774335430071A5410C1E34B4BC1A823A93A38F5AB4781CC593B13A593867FB634C0C705107CD278C6CCEE6D842748BFBD2FFD205C6BDFB3AC87F693C25C832C86D96B00BBA0AF88DCFBC8CA4328765DE27FBF1389C4EDE28317BD0EE447F030990E957D223A5EC66CED9D16400AF6DA8663C4E4111B4584F8F0066CDF8258D90C5D7B439503E3AB3FCC55FDF933E06D704416187AAF86E6C39695DEA8B8189EC1299670BE03B6A636889CB7F10F04CCD67278E77886CF3F6E2A05BA8D25AB8664EA817642ACF5DB4D9B3EF80E169463EDB6BFDF67172E88D233609B091BBD085B970DB8AE0DAA5048CA42D6A54042F42445BAB03F9BF1ACCEF341B7349109BA0073D3715A9073AD9BED258268AEE9DD5202E0EDFA5720A317EA5CB41706C0D235465BECDC8E3FF0D628EE5EEA6AAF1BBD3E18FE9217516893DF115E979C4CFFEC494988B6F9B86026610898C44AB1547C5F8ED5CBF3C3A837DDB6A444BD3E803E1824E6AB931310FE86B36587F1B34B0B48D358F4B97E9774213DE7D92571380BE2199E703119C5B9836DADFC826B71D588250AC37DE0EC05C5823573C102BCE44C9F044507671C4E1723950A3C0E14968CBABBFEEB049EB723DB9B23CDF0273525C29CC5165530A1F1CF830D3551DD6BDED53954947D5C334DC9C71907CDBFA109EBC52D6305477C14159257AF8C51C6F09D76FC0085C3D969EC60FB09145E66A8A7489611DB3FDEFC35202B8AAE82D3CDF666034BEFF49FE49A45C5EC438F4118F338545532CED916DE78E3BF82B4E55907474386B9C172F393EFE895334F7323CBB2AA7CE7718BEF5E7A23AF734BD4963FBC7889AA5C50F3955B904B5E577D71B21A293D766865E3F8C212DE5EA084A9D22748A8009A7D1858328A1BDF7BA0F4E3B83BE9707629252B3339CEF796696855A574B4A4896CA68C3D6A6824E3F593069EC0A571E61282F8A29BEB8BD788F7B351A8939CDAD9E257587A77804F2704F49DB3305514B85B449AEE56EE40CB2A75D51690194284AACD0855B02893F8DCD3091629DC548705A1085E5CC33DE7726A0F521C149003DF380ABDAE96BCDA55C44BF9BFA1103150F049563E848A8750625DCFDD9BFE02E1E57489B5B3AA28BEAA80F4DAA562DEABB4BB6A27125369415885020D237A92CCC3A23593FE2183225BFA2FF39B0BEF9CB0425375E256BCD572175483F713BD38F937F2B3D4C1F686C5AF60061E0B05CC3EBAAB0AE8BA21E47A8318BEE4A01516046363D152936A1344E17A65E08030522EC667233145A56001B8D065DC2FED0D2A9F02C981A8962F984916314805DAB644A5112CAA1564895121D8B1FD046F547BE282CF979752883EC79AF70CF59A88D960F3336F0AE61357877AAAA34699A876144B65CA5B77A684D850D09B3D42CDBFC4539EA103F8377CFE5F9E5432403FAB416662C4C83226191EEB7F82B01E0819C081FC40E7B978669C7856067E8B582832DD0B92588103C2616BA2C7774C46840318CA2B1A3798FF7ED9FEC087F01798EA2445B92E67E2446126A7406E82FF8D3711311BE16E9171531A95C966E6BEFEA34938E6F5FA660F7C7CB533A119377F1D26AE6AE51D805AB96A64C8B80D6EE137F634B384C2E377 - -count = 83 -seed = A97269579EB70D268C58D94FF744329B197F722A8A407B788510DDCACA34C8CD4C72FFC14B76300C86AEA1E4CFA66BA4 -mlen = 2772 -msg = AE3DDE9E33719040345DF8EA7E4C0B5E2CBC5CB80B34FDDB959E2DA1D67D74D2FBE5AAB07C6357A9F3E5F6EF5379B4C75008E9077A1EB025F9023FE32FCD9076C8D2B291D0BECF2DC624F9E752B1EEA2CF0755FC9D4B2E4320DFD042C68577D58E61DAD075BC1C3931ABA78B473C0726ED495150D6A11A81DBBD1C840F5F1FAACD54E3470E0D994DEACA7E6E324A9FB4E581AB447A4EA026DA3DC3C7E6AD55E88CB841E069ECA63404CACE0E3D4C8B9CEC33BFF6AA6341AA1EB69AD799C6CCE358CA94555287D01B0192B1B49EB6F705E54FBC86465C4BA70134AFC9A53C1C3A732E21B010002B49B7CC6F5237B794BC1D1F1E30A7F1EB95D195D5F26B46A704F77F80B092117EDE1C340622FF32302DCA7E7E43C2A4D8852CB508403B1AA8ACA27A86936350264811550DFEF05D72542C74D6243AB9D259202295A63F54C836CBF610E40EB85E9704041A51BF68578B10F7985C752DC35788E7B7754358082AFEC9E4B271D36974EB90A46F7D703B0CCE941C3CD072A88F931A4FFD098634BE0921D089E46637F88F9625B7DF900A276B4BB75FC75921C8A8B6668DF9946290E11FCE4565A76D39D8FA55F324253FFBBF81536581621DEE664A9E9E4F4FCD3A9765706B8EA833125A825B1CB30314B7C6C78B301638EAD4311932FD4611D78572180EE441648F8BFAB869874611C153FEEFF88A45F7A98206D0B2D97CB7EC2144F045225AF5A9925AE7FD3DB017E37259B7A2FF6C66820DDAAC5651B2EC2E5767DDBBE18256B1D0D0F96CF5EE04266B8ADB29B0AC5D55B73E1ECA8FE724EE174B76EA1C0A54896E2BB565075F1669D3CCA171657B66F343A634F4250287F853B52182B9BE50DF29021673DB1841ACA45E7263DCE653F0DD84338E49FF5C6E3BB42F1A3C7164704A2A000149114D36BB9231606EDA06C712A904C1E323C4AA3EEE0BCE6062A9CB956E004407014ADB58EEABF486B38570955C30F2B5C28179F86CD5FFD603CD441A1FB06519368886BFF9C2C127ABD079346D762E51C311F196D5F825B45EDDD4A48C7C2123E10A3D369D772750987EDB96968C59441FB2F47F8E33FA4CED3006766C06BB6B339ED94B8FE57B20D96F1A27A61966289D8FF5072FD11D7EE53DEFE0014A11667D0A6C988BD16629FB53F269130B22A13AABA2E9F70DCC93D3BF6E611EFB006BA585FB8E8720357E25DF69C6DF388FAC792F87CCE801FA49A8CBEAD1698C11B82C4F85FDB4D52A2A808483DCA7334295BB3B2658AAC18857878730831622124F5A254A464DE459F3528C5194220E5BB1779C8F5E3866B0D60931A1A47502D99E2B186785658DEF57ABA676626F9CCAAAF449609B07AF7B57C78FA5BD06B2AD2927AB491EE461A94AC37A079D9BFA02203B09F7EF180C1C1C430518FF2D3F2A3582EAEB6668060A2B544E973E8A2B88733A902A0A80F8E4F30AC5D0223C1076482EB2CA5AE67039597514A4866061D5FBDD99694A060D0D0EE43A1B7290FFD7D796A9F1A2142DB6E0F154ABA8720396B6DE939E668447C81CC828FF9D2A014FE001CA718C1D6ACF4C08BC7796D344A29FD8913E4CE71E986C46BB66C2610FA797C9E1639DF423C338D7192638F621D83A6802E72E38BEE3AAB064FB606962329997FE908597E7407CEF098D4591E5E6011CACA701994E4ACF572F7C91057D3DA06058A7DFFD3248EE3333208BFF27473E6F1EA3914C5B2056AECD7AEE07F8DD26B3C2B8B9656EA4260D38E8D5F23C925A4476754240D0702C5859AEC2329E1CC3E426BD7665B2A4EE2E75B41B561FCE79690F64D1068DD35A294A8E8CB43A6AAA901109F0E09D985B6E323C30A017E75BF01D0AAA739102C1A6667ED48E60DD4499EAB862851558DFD17229878F5BEF0CC29FD19F59835579F3CDD4F85684E0D46D9618A205DE3B29B0BFA5FBB36745B989211E2BA711527D32CBB5E35830DF4549FEA652377EBBAC6D52787F9EBC3CB687EBB641BF51D3E22E98FCA48F99584FB1F3BED3F97F33EBF656C5795055268F49985CEA00819A07B8F4B0ECD7BEDA95EAF11E3498FA7AA414C54C38A08A841B012AE91763BE911DAEF803E2CA385C9D4CDC642A0B343DB6534C10D9E1755B7B2DE543AFE1D3C90981A7BD907E9CB14367243D9FDCAA8776AEE5F65ED6DC02F633BCF9F57DAE39E8E8261DC10029DF7B7124BEB67DD753B36892481EA7CC54DDC3A60EF8D4DCEC4D5796DDE0E7453BBF0FD93FCACE97CE5048D75ED1F34B69A392E1734E262B2B2A1E246331A373B5CF1FEE7BB46096C76349B0F19BE63FE539DCD33A8450BE894C2DC21BEFF0DE6A841A533F4C9949289037D161BB97DCE31CDFF4C1E0AE36B4192594DEC3B021E8F3D5B500C244CB122974F8CADF125DE0CF832A920DEC3A6F7150585D0209651B0FAAE0F74A36FC8779115B96136805DDD4F6F3A69C06AF472F369F481359FF834A0FD2F9AE899EA36B9B061B63D07C1D4ED7A373ACC40EAD808564B05FB0C6E656A80FA3865AABE483848D14D1DFD66D7AB1F353642EE3417869DA21622F6AF551659D07E6C827C18EA36E2C5E806A9571A7B05BBC1BA283A8984BFABC555AACAEAB2453573F782A4087F0F903AF34596E83282A2E54773AC33543BD353A3F855BC46810930C3635A9B70BA7FFBEEA95A129CCF9E9538EB11E119A072F806130D831AF7E57D332AC889D7D9E6BBD1C65D64E089722F6954F126E64EA939D98084D434EE74B55C549BED21D11264F8B5E023277DB52B03D7B8A8E75B12B11D62052E474E435707272D72D00D92288CEDDCD1ABF8E63A8A9963A48B54F492487B309F69CD90C9FF54B9C5A55CD2BAD4A2E0A6B00B188FD6C527A8184BB63670BF626A995815810CC0F280131F5F652EC20609C7D3B910E4168FE273626BF0E2CBF05BC9CCD178AD91BC25CDF178B387DFF0B6B40A46FDB6C975349B6CD8AD103CDC5DAB8D09D9A5B55622E74564C1E789C5C185CAC04FA0ED6065B9CCADB1D5DC80E90AB244CE1AAC516B346ADAEBAF7A030D66FB90FD070ED062A41E0B70BEE3B07F1C03887DE5F79D70F9955B25B8C8201602784EF8A60147260D1BDE8E152E8D3F992CB8255ADACE9D5DD2E9C856C47537742094190AA867459D20989DB11841AE44824979C0A2093D7EDCAA13C9DE25E6EECBC5124055F17466467E123E39034502BA966CEA873997EE25E52DE2DBBA874DC9AC222B49967B7BEDB5C81BE09827CAB782F458795B2903D72AB16F4423964F82DC69C138EEFA3273BC10376939E544964150D9DF09E14BE08CFCA06C10BB2C315B1B676C40762F8209C0EF13CFE5FAD76CFC17FE462D8330F78BAB072C5465F7A26D047FEC4BD3B918C9C761B91B02D820ED7EF345E79A66FBA61AE13D3050A27488CBDBE693B800F1E76C188EBD8118C9432EB9E7124D35A1A038D237918F1DB83304D10AB5DEDF58C6951A92AAB1A1A40E180254E730EB43B566A83CC71FB6B9749BFCD3A90B964966CAE90FAD7406A8A89B1E48C885BFE2DB41C1996F20DC9A8DFCBA1A6F2F307EF8FBA5EEAE9631C2D6328D90F17679DD9E8E9660D6BD4C8A1D79C47A5FD46BD2ACCACA2D5C6407B0F7F31D093CEEF0342C67DDE3F1BA5067ED1500DC45161B8636255924BF007C4C870990C5DCE098C5A26386AD84D0F0CE4860349A147A4E7AB80151FA63882590B91C6AD3E70A68E6FEC1A2CF65881A6DC38048FC14DE71C702C934C5D3C4CF4C474F906C3400364BC400A7DA087F94F1ACCB68439A9A6FFA8C6439B2CC5C0B17A7D649033798429F211D9DE12B24D117583E1C425C2C0348C625CC44E9B976D319E72D4E09D5D6F36EE243F5FBCB190E84DE56EB680DEC8566F5A2C7D5F595116C628CA09401D561BD78356C634419225FB01CB637C46A627F6026D39EC1C62E9A3E85FAE -pk = D538EC7ECCE0781CDA6D6642FCF636E048CC56E638DA3A6FF00CF48B29E517F3DB7259FA5E3773F160DEA51C710F4C00E8695A9D017ED12F5DD0547256D25A0BFEEECA7C123FA2AD421D2FB8634E0EE2FEBA439AFE4C43C235C9AE3449615500 -sk = D538EC7ECCE0781CDA6D6642FCF636E048CC56E638DA3A6FF00CF48B29E517F3DB7259FA5E3773F160DEA51C710F4C00E8695A9D017ED12F5DD0547256D25A0BFEEECA7C123FA2AD421D2FB8634E0EE2FEBA439AFE4C43C235C9AE34496155000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A53621DC80E4EC816DD054AF0D9D9DF7C7E62FE3A12007AC81EE63DEA3182C16F401E50524FB6FDCEC5ED571C13D35989B03ECD3CBA9B16B10996F4DD80634B25D230B000000000000000EEF07EAAFABD7AC0A38E7777F940C39D23A62C6366D34D852088D4C88EB76A657A483D426E267FC70BCA2CDB7EB5442330A4E06D92E09B0BCEFC0181FDF01073DD01100000000000000DEDF55FF41CAB8DB742715C4AC7E367C4A2BFC8445B35F36ED470BDC7412017EFD3512D6E0952AD6C8258FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB3D309D056AB3A1DBB77E65924B72B1680A6DB7E0B911F9D45AD16B828F2473C3BCD8FE8AA45D59247239010000000000000000000000000000000000000000000000000000000000007683D6F8CD2AAE0DC812C3BD9246360CFA7E33B6F364A3D01BAC07E67D71DD2677AA610869BE07E0EDF7E47A02100E03ADF3E38AAD31025A5118391381423F5D9790D795D1842695F3DA5051591D42596D8608F7BC1783F1DF18550A5B4CB302247F732FB1BBC39A59FCE56D0352B644A4BC59DB3B02E15D45FBBD249810ACD2DA351853E5BC0E28D4E2156FC14004023562927E9A3DB64DA8ADAA8777AE3A3043E1E0E34A7315F29BB7B649B84910203749B2C492EA751915C7E72AF5DAAF00AA60B0115BF26B62A79C929F7E0ED34B16CCFA466E811CA7A704CF6BA6FDF0DA6FD147F5240D9BFFF2092D356FD6D50085E175C913EE7625E273F21379DCCAFDF4BA2602BEB6A2FD9CD21F0CC25744646E0F157909F9AA0B0FF299A483E0F00009C412E791B3F949367EB472153D38D71E5453A3EDE10A512D1741737AB7BF7E91CF0B910710D18E59491FC9C0595303FB3B46E94F4FE13FD2D3415643C50051735F21B25B865EE4A4F75D07A4DB83D73580DF0042C5E9A2862D2DF0190309014B826B827E9125D10798EE254EA79B0192A7CAD0D397B832383C7F8C50BE5FADFD26BAE7DC4A702EFFB1B3C6E34C49001D906E71D1C8BB6170906A421A4633A12C2C77E2E6C288BDB2694972D227F444903C79CAF155FCDEE453A74E028E1102447FFA1F1556FAF644093425060F30B0AF2499D2BA22C4D228B5DCFEF752324F52A9C4D1FC3471CB7328AB45386F9C01BB787D8662B5E9F2CF9EB881535BB6B7A0DFFB050B1EC549D3812D88BD48085BE2B10A006E12245A09CEE3B753FD6702294E543ADA841396DAE86C16D1C24211400043BA2C970952A8D8C176DA2B78328329A3660F346EE3CA52BE4631FD4B01F8E3C73ABCEC1C2F82CF11382F4F276BFF1AD2DA872A84B8DE8C69C3B571CCB20F7DC263185D3C8E6D84F6140EE91C00 -smlen = 3035 -sm = 4D30C9C108E99F47EA777D650124A0F129306D146017767B42010AB8A8157829666C696BB20200CDA26017A88FAD20592471D400C41BC386C996BB56789089350008AA6667FF06622B854669FE01CB03A4AB994CA3979AE11E8F00E6AC4F5FBD1BCC85F5AEBC86016A78DB46B3EB4EC0CE530A2E000F2906FC593C2603F70C40AC01D9762C510CCC7BEE2E57769F01738747F478C2065A4D2031760146A5F538BD12EB621242C6DB018B9439B7AB9E2E6BF6CD5BC001439D3A233596E88D26A4D806008233AD44566FE44D287DC91E0101F5F667AA94535B54871207C13F6442A81DCFFA5DE4074E70DA06004AAEBAAD56618B05393128D900ACE1890A0B98DDFDA4696449FF0CAE3DDE9E33719040345DF8EA7E4C0B5E2CBC5CB80B34FDDB959E2DA1D67D74D2FBE5AAB07C6357A9F3E5F6EF5379B4C75008E9077A1EB025F9023FE32FCD9076C8D2B291D0BECF2DC624F9E752B1EEA2CF0755FC9D4B2E4320DFD042C68577D58E61DAD075BC1C3931ABA78B473C0726ED495150D6A11A81DBBD1C840F5F1FAACD54E3470E0D994DEACA7E6E324A9FB4E581AB447A4EA026DA3DC3C7E6AD55E88CB841E069ECA63404CACE0E3D4C8B9CEC33BFF6AA6341AA1EB69AD799C6CCE358CA94555287D01B0192B1B49EB6F705E54FBC86465C4BA70134AFC9A53C1C3A732E21B010002B49B7CC6F5237B794BC1D1F1E30A7F1EB95D195D5F26B46A704F77F80B092117EDE1C340622FF32302DCA7E7E43C2A4D8852CB508403B1AA8ACA27A86936350264811550DFEF05D72542C74D6243AB9D259202295A63F54C836CBF610E40EB85E9704041A51BF68578B10F7985C752DC35788E7B7754358082AFEC9E4B271D36974EB90A46F7D703B0CCE941C3CD072A88F931A4FFD098634BE0921D089E46637F88F9625B7DF900A276B4BB75FC75921C8A8B6668DF9946290E11FCE4565A76D39D8FA55F324253FFBBF81536581621DEE664A9E9E4F4FCD3A9765706B8EA833125A825B1CB30314B7C6C78B301638EAD4311932FD4611D78572180EE441648F8BFAB869874611C153FEEFF88A45F7A98206D0B2D97CB7EC2144F045225AF5A9925AE7FD3DB017E37259B7A2FF6C66820DDAAC5651B2EC2E5767DDBBE18256B1D0D0F96CF5EE04266B8ADB29B0AC5D55B73E1ECA8FE724EE174B76EA1C0A54896E2BB565075F1669D3CCA171657B66F343A634F4250287F853B52182B9BE50DF29021673DB1841ACA45E7263DCE653F0DD84338E49FF5C6E3BB42F1A3C7164704A2A000149114D36BB9231606EDA06C712A904C1E323C4AA3EEE0BCE6062A9CB956E004407014ADB58EEABF486B38570955C30F2B5C28179F86CD5FFD603CD441A1FB06519368886BFF9C2C127ABD079346D762E51C311F196D5F825B45EDDD4A48C7C2123E10A3D369D772750987EDB96968C59441FB2F47F8E33FA4CED3006766C06BB6B339ED94B8FE57B20D96F1A27A61966289D8FF5072FD11D7EE53DEFE0014A11667D0A6C988BD16629FB53F269130B22A13AABA2E9F70DCC93D3BF6E611EFB006BA585FB8E8720357E25DF69C6DF388FAC792F87CCE801FA49A8CBEAD1698C11B82C4F85FDB4D52A2A808483DCA7334295BB3B2658AAC18857878730831622124F5A254A464DE459F3528C5194220E5BB1779C8F5E3866B0D60931A1A47502D99E2B186785658DEF57ABA676626F9CCAAAF449609B07AF7B57C78FA5BD06B2AD2927AB491EE461A94AC37A079D9BFA02203B09F7EF180C1C1C430518FF2D3F2A3582EAEB6668060A2B544E973E8A2B88733A902A0A80F8E4F30AC5D0223C1076482EB2CA5AE67039597514A4866061D5FBDD99694A060D0D0EE43A1B7290FFD7D796A9F1A2142DB6E0F154ABA8720396B6DE939E668447C81CC828FF9D2A014FE001CA718C1D6ACF4C08BC7796D344A29FD8913E4CE71E986C46BB66C2610FA797C9E1639DF423C338D7192638F621D83A6802E72E38BEE3AAB064FB606962329997FE908597E7407CEF098D4591E5E6011CACA701994E4ACF572F7C91057D3DA06058A7DFFD3248EE3333208BFF27473E6F1EA3914C5B2056AECD7AEE07F8DD26B3C2B8B9656EA4260D38E8D5F23C925A4476754240D0702C5859AEC2329E1CC3E426BD7665B2A4EE2E75B41B561FCE79690F64D1068DD35A294A8E8CB43A6AAA901109F0E09D985B6E323C30A017E75BF01D0AAA739102C1A6667ED48E60DD4499EAB862851558DFD17229878F5BEF0CC29FD19F59835579F3CDD4F85684E0D46D9618A205DE3B29B0BFA5FBB36745B989211E2BA711527D32CBB5E35830DF4549FEA652377EBBAC6D52787F9EBC3CB687EBB641BF51D3E22E98FCA48F99584FB1F3BED3F97F33EBF656C5795055268F49985CEA00819A07B8F4B0ECD7BEDA95EAF11E3498FA7AA414C54C38A08A841B012AE91763BE911DAEF803E2CA385C9D4CDC642A0B343DB6534C10D9E1755B7B2DE543AFE1D3C90981A7BD907E9CB14367243D9FDCAA8776AEE5F65ED6DC02F633BCF9F57DAE39E8E8261DC10029DF7B7124BEB67DD753B36892481EA7CC54DDC3A60EF8D4DCEC4D5796DDE0E7453BBF0FD93FCACE97CE5048D75ED1F34B69A392E1734E262B2B2A1E246331A373B5CF1FEE7BB46096C76349B0F19BE63FE539DCD33A8450BE894C2DC21BEFF0DE6A841A533F4C9949289037D161BB97DCE31CDFF4C1E0AE36B4192594DEC3B021E8F3D5B500C244CB122974F8CADF125DE0CF832A920DEC3A6F7150585D0209651B0FAAE0F74A36FC8779115B96136805DDD4F6F3A69C06AF472F369F481359FF834A0FD2F9AE899EA36B9B061B63D07C1D4ED7A373ACC40EAD808564B05FB0C6E656A80FA3865AABE483848D14D1DFD66D7AB1F353642EE3417869DA21622F6AF551659D07E6C827C18EA36E2C5E806A9571A7B05BBC1BA283A8984BFABC555AACAEAB2453573F782A4087F0F903AF34596E83282A2E54773AC33543BD353A3F855BC46810930C3635A9B70BA7FFBEEA95A129CCF9E9538EB11E119A072F806130D831AF7E57D332AC889D7D9E6BBD1C65D64E089722F6954F126E64EA939D98084D434EE74B55C549BED21D11264F8B5E023277DB52B03D7B8A8E75B12B11D62052E474E435707272D72D00D92288CEDDCD1ABF8E63A8A9963A48B54F492487B309F69CD90C9FF54B9C5A55CD2BAD4A2E0A6B00B188FD6C527A8184BB63670BF626A995815810CC0F280131F5F652EC20609C7D3B910E4168FE273626BF0E2CBF05BC9CCD178AD91BC25CDF178B387DFF0B6B40A46FDB6C975349B6CD8AD103CDC5DAB8D09D9A5B55622E74564C1E789C5C185CAC04FA0ED6065B9CCADB1D5DC80E90AB244CE1AAC516B346ADAEBAF7A030D66FB90FD070ED062A41E0B70BEE3B07F1C03887DE5F79D70F9955B25B8C8201602784EF8A60147260D1BDE8E152E8D3F992CB8255ADACE9D5DD2E9C856C47537742094190AA867459D20989DB11841AE44824979C0A2093D7EDCAA13C9DE25E6EECBC5124055F17466467E123E39034502BA966CEA873997EE25E52DE2DBBA874DC9AC222B49967B7BEDB5C81BE09827CAB782F458795B2903D72AB16F4423964F82DC69C138EEFA3273BC10376939E544964150D9DF09E14BE08CFCA06C10BB2C315B1B676C40762F8209C0EF13CFE5FAD76CFC17FE462D8330F78BAB072C5465F7A26D047FEC4BD3B918C9C761B91B02D820ED7EF345E79A66FBA61AE13D3050A27488CBDBE693B800F1E76C188EBD8118C9432EB9E7124D35A1A038D237918F1DB83304D10AB5DEDF58C6951A92AAB1A1A40E180254E730EB43B566A83CC71FB6B9749BFCD3A90B964966CAE90FAD7406A8A89B1E48C885BFE2DB41C1996F20DC9A8DFCBA1A6F2F307EF8FBA5EEAE9631C2D6328D90F17679DD9E8E9660D6BD4C8A1D79C47A5FD46BD2ACCACA2D5C6407B0F7F31D093CEEF0342C67DDE3F1BA5067ED1500DC45161B8636255924BF007C4C870990C5DCE098C5A26386AD84D0F0CE4860349A147A4E7AB80151FA63882590B91C6AD3E70A68E6FEC1A2CF65881A6DC38048FC14DE71C702C934C5D3C4CF4C474F906C3400364BC400A7DA087F94F1ACCB68439A9A6FFA8C6439B2CC5C0B17A7D649033798429F211D9DE12B24D117583E1C425C2C0348C625CC44E9B976D319E72D4E09D5D6F36EE243F5FBCB190E84DE56EB680DEC8566F5A2C7D5F595116C628CA09401D561BD78356C634419225FB01CB637C46A627F6026D39EC1C62E9A3E85FAE - -count = 84 -seed = 483A81716F91A43ACA6764C4BD2A57C9156B762E9174EA49730A6BEB9CB19A0B3755E37BA47EC524BBE2FA25B9FEF687 -mlen = 2805 -msg = A7E941D3C14E2DDB4F971C9955868ACA753A73E8EC6845ED6E9D3B444C826480F03AC771F92E94380BCA7E50303FB79CBA608E351A1A67BF217B9816E2AF9F89BE8A79F661470CA16BFB2C99EFDE97859AD1D217848289EAF543005F5C231599FF74299EC2A7C737FF94B7465DE11F80E17D4FDA264DE568D8767CE822B3AB9642D95BC89533CE05FB331B86E3C5A296E4EA4C637EA458BCED1F89355C0270D083D4920E72112CA1ED486191748B4F730ED52F9803D05A0F2F065BE03B2603D6CDB154DD7765847D656B919B08969E41B23F9D376135BD5D924529410392ACEB004849550E6CF2903181C9A395FD469B7DE2C5060ED22922AA4D7C782A33330714A0AF206B29B4FCBE0F12C18948F6634FFD7F2710138020E273CB0DFA735BDCDE9BD6CEC898C5E564EC71AA7880D97CC711412F28603DE293CD5E904E9156D4F6BFE2BE15347B9FF7848EB51CD0785D6A649EA3514E02695C7E3C4F021A9992D67BEA1D68E5B17DB2E0DC061CCB5ABABA49D110055467F9DEE61ABA8F3E5C713E94A8A96C3A8AFB698887C1FA4ABC5157CED33A834DBF0F5AF9EECBB5F2AD7B63B4C2CA94A117C2B92F3D51900926E26B101FBE6207AB0884CBFCB15F9F98F95B0D08E29390977F4D3DC710EEA3AE7433D5EA87A5F710F1FCEAB26D516FC19FD272F6B0F01EE167F06E6C33273481F280CA64FDA0549C8DB884FDD467B93998360766D4CAC4C8DE783752FB6C6D7B1E47DF23CEECA572F2AD3E2B628E31984B9054448ED1D90658BC658A9CAEC0485512CE084A535E7C8196B8BBCA5D26C105C41E083F8D56F1530A8C1B36A7F3E41FCCBAC7F342B2D026064B304444192D4873FC57978E44151896EA6C0F13D017F683B203BA1DE677ED00F2B737C4C69E53ECF16AB918939E120E9FE14B2243EFF0116B24C6654BE09C582F1E62E75EFD8593E62E45AC36F717815B854B47A4DDCFC91FC533FA85BCECB6E560CF11E46D2F334B396D68B275E7404A70F2A805A64CD458A8E5F114A89124BA1866F917749FF32E59EE71948BD97F2D4128BEAB8BB0B6B06D84C6D466BFA30FD8100E48D951D0B3E787EF9611A56FFD64D970DBACFB1B4DF064B1CB5DA9918F5C58A10F0903B64286B1C1AE5CBD00EB8B363BDD7A7AAF2111C0C6E86E15ABF6C1E761FBF027425968CDC19522B44FF3F56335C59760FAE6D9028E76B284330F7510F2B55B6F46ADF90311CC785D35C2BB49272BE514CFBBD7A2B7B2E8C0B6DC28CB683D3D581F547F83BBD3B8C7B76925E44E6DA89D5EEF17AB0BF4213EF9C05B7B473901D483C647F416B98478C7100919C28515B617A27321841BAA174C1A2D3494395294CEBD48EEA14BC3106CA9C69D9F6485D6ABF1C2B1111A8BC602454685CA61AB4EE4DB9F413CAF8F0F204F04D40CD36FA5DAB629CB53876DB3E16372E626B6BC892C63C6B6C503C9D22EFE113927395206BDAA4B83D4FEF4FEB42FA7A71F7CE2197FE282A02D0FE50F96B1F917A67E50EB79CD3FFEF064542F7BEB51AB05B56AFD7AEA5F4164CC9BA37D8FDB35A3DEACF0CFB555161E7E41EB798160798BE9D01E3DE0C4288E0BAB19AE398E94353ADBE9A43524ACE35830B82FCFD4B1DC2800CA4C38A56B7CD28BC3E2F69A0AC4655CD79B5789A2B72EAF93B018D4D6F4C983D08932B22C85AF6FB07DF0A786D98820E1B06BC17F62D6E39739790A13049252F1B9102DC692CEB20C270FFE9B902AB7EC5A4EAAF47F7E2D31B2195F5F48AD18D099C33384141DA14E151BA57F6B1BB97901457202CDB83B5C713BD8A13F6E3E276C7D6C130AE287CA8931D9EECE06AB7CCA124D6D02D497D55EA9151A95E8A4DCCDA72D3F51A7DB3F2879918753683B01BA1B154DA83E6D84DDC9492F2DD8C128A30C75174ED1A6B8D93D08645270BDE247782E882418EA158B2A2153B2D8F75C09932F324EC199D26E9F3C4C4CECD807367E3981E137858B98BD1268D2C894541EC99BBBAD19A6856EA16A1E56B7B193BAF79AB89D4E76327405658C4ECB5A8626302B3A4618AEAC7E11A1199C4BB08C60AD78FEA4827B59CC883B2CA7038D7845106DE9174B2B8C17267273D23418AF560265000543ED9886884912B4160FBD372FCDF706EF642CF1829493884B6CFE946ECF6140106DCBE11B3746E33FBD4B5852B732230B9047004F4FAFA0D4BD7043C7D6595ACCD1B2771AAA76FE05A0C80B7B221DBEF79950FC69147816CAD0E52C05E72CECCF55FB4DABD81ECDB476417DBFDAF3B555CC90573CBED9474266C89FC55FF0BCC55602A51A1B5F91E425A1A58DCD4ABD09BBC63933FB4279B9E21298F9FE0CF1A93C4A19695240E8978D604047ABC7239F5053EA650D781307C50DEC4D5E2360ADEB9AA02C0F6FEC5784784A271169CE456E1C32BF984C3323656CCC588C97E0ECE5A40FC7B4DDBDDDB764EDC512DE63270F07891BD160F78B8ECD3A4D11EC4C68EA0A0FBD0F23AF9AB261A110F431F926C4995B05462E0DABF29D9660ABBC660C9A675628270CEA7EC5AE9B6F298B17B2392263700B8EAD9C845AD29CCF109A2ED66ED5BAF9C935754AAA1B84BE2B5339F9BF3CF5E80AF16967863FA8DCA64F5FE873DA4A6D33E39A592749B721FEC203C0CAC527CA96DE7A96CE9A540F5DA1902C97F960A05EBF0C32934F9B81244C945A60FD3F176DD8C261690D8EC98D19607129A50EDD51135FFBAEBC04A0961ACC5A32FD058FFDF2C6866BF90A3E177787E7061BD2011EC08EC118EF0451CAD010B53C68D0BDDC701D10920D697EA3439B1A0F96E6256B7712F59C746D1C74C20B17D461C3DF635EEC83E3B8E098034F119B9D9A79ADA735158EAC3F434E805444D5EA2EC85CC8ED8F5BCCAB7DBB6ECFC2E385781579AF1263D9FD32BEE32E01DB94703B5C756B894DEF19783B12BCE2A1A8D29D96F329CB0791D697BE7E0F05DD5C9DADA52E1B8C1E5F75A0FC90ED8C05BDFF86644B1EE61989CAAA271061D4222818C894AE9ECA2DA7326E5C24CA1EEEBE3720D2127BA997B0C572AE30615F8BC4278057F4762D46A39B934DDB2A0903FE1568C1BCC6C37E1F7C145EB7CB20A6A4B3466A7ABA58B48BE94F7E14CD20C87B2768358D06E3F607FE5E9DD1AAA8477975660F1E379B9EA26CC00CEA8CFD6420F2FDC7EE6393AA17CEF88645B821F8F42FC7DD97B0E16C04631F86ECF1CB76A6502FD1C13917CEB26A83596B117D5336387DDBEA56162E8A5BF2FA35E697245BC7210CEC13BFA694AE884582924168BF8EE2F61A734E37876F363225E5AE19B7C65CA6AFC31C8B37BCCB308A9C27F3E9902DE365E288E6CC46E329E78BE914B85EB980C0BAD932C164671ED395D5D8317C133E2E000A10E0D20D0F408019B33D9A87ED7725EA4C5ABAD67E0CAFBFF31DD236E59DEFAB7FF2CB40F479B56B261A32656F016DECA5302A336CA15D10E0AFCD168A4B922B79C11CB21881220374492D64DF21453B41346A85174A0A4A3C1E973845C856CA70D6D25BB854D0C6BD3C75CD73998C7F64E35A58DCF593C85C2440A6ABA4E470F87E6F9B4ABE127B30F8992D8AAD0BE38F008D9D937582EB3AAFC68F516D5AAF2503ACC96E59A151D2D4B072AB6B38C54928D6656441C709F1C1B770CE6EFCECE11F8B3602EAB63E0C629BBD8A79A96BE4CDB072780F3D287B091FC94FF2C0D347FE280BBAC308644BDB15A3C653863EDD945AF0AE725507507B82C283DC9909CCACBCF357D7A19703401B6E4474B94A6CBAE575B942501A281B8166FDC70E6B4B60C2F57A4D66FE1197D301D0E0C7BEC12CEDF9496BCA2183D04632711A79C8374B6DE35C2EECB0239391C2019C720894BC7A635DF18FCEEB9AAE16B3CE92717E2C56903D20D0712EF80131B8C48635163E97EFB1FABD1500D061C93AD935BE9A65A45A92E4A4E885268E712EFBE5337214701BAAD4C73E81E73BFF19AF131F0ABA105BAABE849F -pk = 060C57D12637D02EBBEEB4F31D48CCC5CBB17BEE8A6EEB34C00E9F348B1AFD2D38A1A6FED5705BFEB7F52CAEB4A9240332C8316C861E33F699ADEE5691A8D551657E2BEA87D597062499145D3F59CE25C1601C740D8797DE0A0B4B57B2C36400 -sk = 060C57D12637D02EBBEEB4F31D48CCC5CBB17BEE8A6EEB34C00E9F348B1AFD2D38A1A6FED5705BFEB7F52CAEB4A9240332C8316C861E33F699ADEE5691A8D551657E2BEA87D597062499145D3F59CE25C1601C740D8797DE0A0B4B57B2C3640002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008694FF8FF51E56AC0C06294F50BC4B32BD2831BCCC8D3C0FC8E1C3FF070E10E97D8F848D40E2A5DCDEF872CA278F3328D4F6DAA12488DCE2F747D39BA8791E4259AC2D000000000000002D5667077246AF8B1E677433F64F3441FD0DB41D9FD9A2EE2EE37A653C204FE5F80B7745CC7986D5D2A6637A68FDD5B48C0DD1083CE0380595B94B032D4869F27370F3FFFFFFFFFFFFFFED233C514F1F7666583CE8FD84A1CB418CD0AD27197ABEB0F98F562C1C5B908F07C63A1BC5143AB9DAAE2A000000000000000000000000000000000000000000000000000000000000009AD13E84B8B41BBAB3B635C127DBD623B24BE2B9642C750B362BDA050FF5AB7885F08E08893BEE2BEAC0B9000000000000000000000000000000000000000000000000000000000000009D65C30D2B67BE7F06E06FC641B60C4AB849F6471097B06ED922465049B489EFCDE5136CE2EDE58F5365E487EBDB4A00A396C02AE2C39612D72EE403356880127EFB04D2926472AFD03FBB17E895DB8363944ADD29D00E798B5F56DD1991FB00DE443CC17EA78747FDA05213D1AE4F399B98DB7BF3925B5CCE55F6AAF2681725142B4BAC8EEC28D824A77C5AD0C22603ED09ACEE866895C5685F7185CBDE980A088FC8672DCFF7791D77CA9B48712DE9BFC7C6275EDBE4468C28AA70C67BC3020E16005776D7A1DD993D7250C85568ED76D53D2FDC8489697E733DF40B088550D2B6117A3A30F7AEACECE89AB58F93022928A8ABA8E035045CA8B488DA65258BB0CD77809CA48C37098B0A3F00959A424FA05C7E483A71849733F1CB11383603AEACD50DA53FC34377D0436F9467F076CEDB0486BF87023DB6FC9146DE7251C9B32C2560BE007A2123F5EB9F80B89E017E8EB6B368A1EC8C06A6EB81A7ECC064FBFE8D8A7C46D0CFA377F296C95D577EFCBD13188367593D06E04721CBEF8D0359402316AE1DA6BC87F41F2304E635B04BFCA21BFD5993DBFA17229E9EF475CF5F5CB190CE1AD567AC2939DF4489B802FBE0EB3C5BDC590418B5C2FCEE2767F5F081319E1FF40E34C5954DEBA075D96F425BE4CA08E8F792033C8A431587AA039D89FA3425351E96752876A41274CD6FD65CEE82BFC181ACFD1D375D62D09A9AD1C8EE4B099C8F2F8622E1675417F4011A5947E5D2374DD7712EA78588154BB19F06F39E756E65F56C8D4BF6AF22552417074FA3E42A8AA3726CD2C3241A0700B84DD7C2A9A2B13AFFD3DB2F6E8EBAB669DAC32BA18071DF4E06352E8D4A99E4293A61CE67DBBBBA687E0666D2F2E101D290488F9C066C56CF24B03340D1C3DD08F2A74568E9CFD40E29795C79145FBCE0A696AA5CB99EBE49C28628834E6903 -smlen = 3068 -sm = EAF0CECFBF46A16F6EB79B50007959DCE485A961DB275A6494013D1AF3B47AB141E80FD01D7C000BB37FC432F3D458EDDA82BA00A7AEEB8578EDE4C4E409AB590038B8D2DA31AF7561484D8CE4016E8C02B76D180B6F2393A1D601E22AFAD5984F62F5E40F8D7201529A4896F64258D1ABFB4249018D62816592F00CCF38F674920008C4665EAAAA945C93EF2C30016853A3BB91FFC12A18B1E5590052EF14234B82FCA363B37E460069F05B25724387A0BDB3B054010EFD2DDC70578B7C92E68FF101D1CC8C17D09923648A2CD5BB00012F87E6CE7E96C17E3A24EB63A1F9439895F05EFDEAE5AAC24E120226CBE3F982A77BAF0FD460F7014DC18284C5E4852F7FDBFD91DB0CA7E941D3C14E2DDB4F971C9955868ACA753A73E8EC6845ED6E9D3B444C826480F03AC771F92E94380BCA7E50303FB79CBA608E351A1A67BF217B9816E2AF9F89BE8A79F661470CA16BFB2C99EFDE97859AD1D217848289EAF543005F5C231599FF74299EC2A7C737FF94B7465DE11F80E17D4FDA264DE568D8767CE822B3AB9642D95BC89533CE05FB331B86E3C5A296E4EA4C637EA458BCED1F89355C0270D083D4920E72112CA1ED486191748B4F730ED52F9803D05A0F2F065BE03B2603D6CDB154DD7765847D656B919B08969E41B23F9D376135BD5D924529410392ACEB004849550E6CF2903181C9A395FD469B7DE2C5060ED22922AA4D7C782A33330714A0AF206B29B4FCBE0F12C18948F6634FFD7F2710138020E273CB0DFA735BDCDE9BD6CEC898C5E564EC71AA7880D97CC711412F28603DE293CD5E904E9156D4F6BFE2BE15347B9FF7848EB51CD0785D6A649EA3514E02695C7E3C4F021A9992D67BEA1D68E5B17DB2E0DC061CCB5ABABA49D110055467F9DEE61ABA8F3E5C713E94A8A96C3A8AFB698887C1FA4ABC5157CED33A834DBF0F5AF9EECBB5F2AD7B63B4C2CA94A117C2B92F3D51900926E26B101FBE6207AB0884CBFCB15F9F98F95B0D08E29390977F4D3DC710EEA3AE7433D5EA87A5F710F1FCEAB26D516FC19FD272F6B0F01EE167F06E6C33273481F280CA64FDA0549C8DB884FDD467B93998360766D4CAC4C8DE783752FB6C6D7B1E47DF23CEECA572F2AD3E2B628E31984B9054448ED1D90658BC658A9CAEC0485512CE084A535E7C8196B8BBCA5D26C105C41E083F8D56F1530A8C1B36A7F3E41FCCBAC7F342B2D026064B304444192D4873FC57978E44151896EA6C0F13D017F683B203BA1DE677ED00F2B737C4C69E53ECF16AB918939E120E9FE14B2243EFF0116B24C6654BE09C582F1E62E75EFD8593E62E45AC36F717815B854B47A4DDCFC91FC533FA85BCECB6E560CF11E46D2F334B396D68B275E7404A70F2A805A64CD458A8E5F114A89124BA1866F917749FF32E59EE71948BD97F2D4128BEAB8BB0B6B06D84C6D466BFA30FD8100E48D951D0B3E787EF9611A56FFD64D970DBACFB1B4DF064B1CB5DA9918F5C58A10F0903B64286B1C1AE5CBD00EB8B363BDD7A7AAF2111C0C6E86E15ABF6C1E761FBF027425968CDC19522B44FF3F56335C59760FAE6D9028E76B284330F7510F2B55B6F46ADF90311CC785D35C2BB49272BE514CFBBD7A2B7B2E8C0B6DC28CB683D3D581F547F83BBD3B8C7B76925E44E6DA89D5EEF17AB0BF4213EF9C05B7B473901D483C647F416B98478C7100919C28515B617A27321841BAA174C1A2D3494395294CEBD48EEA14BC3106CA9C69D9F6485D6ABF1C2B1111A8BC602454685CA61AB4EE4DB9F413CAF8F0F204F04D40CD36FA5DAB629CB53876DB3E16372E626B6BC892C63C6B6C503C9D22EFE113927395206BDAA4B83D4FEF4FEB42FA7A71F7CE2197FE282A02D0FE50F96B1F917A67E50EB79CD3FFEF064542F7BEB51AB05B56AFD7AEA5F4164CC9BA37D8FDB35A3DEACF0CFB555161E7E41EB798160798BE9D01E3DE0C4288E0BAB19AE398E94353ADBE9A43524ACE35830B82FCFD4B1DC2800CA4C38A56B7CD28BC3E2F69A0AC4655CD79B5789A2B72EAF93B018D4D6F4C983D08932B22C85AF6FB07DF0A786D98820E1B06BC17F62D6E39739790A13049252F1B9102DC692CEB20C270FFE9B902AB7EC5A4EAAF47F7E2D31B2195F5F48AD18D099C33384141DA14E151BA57F6B1BB97901457202CDB83B5C713BD8A13F6E3E276C7D6C130AE287CA8931D9EECE06AB7CCA124D6D02D497D55EA9151A95E8A4DCCDA72D3F51A7DB3F2879918753683B01BA1B154DA83E6D84DDC9492F2DD8C128A30C75174ED1A6B8D93D08645270BDE247782E882418EA158B2A2153B2D8F75C09932F324EC199D26E9F3C4C4CECD807367E3981E137858B98BD1268D2C894541EC99BBBAD19A6856EA16A1E56B7B193BAF79AB89D4E76327405658C4ECB5A8626302B3A4618AEAC7E11A1199C4BB08C60AD78FEA4827B59CC883B2CA7038D7845106DE9174B2B8C17267273D23418AF560265000543ED9886884912B4160FBD372FCDF706EF642CF1829493884B6CFE946ECF6140106DCBE11B3746E33FBD4B5852B732230B9047004F4FAFA0D4BD7043C7D6595ACCD1B2771AAA76FE05A0C80B7B221DBEF79950FC69147816CAD0E52C05E72CECCF55FB4DABD81ECDB476417DBFDAF3B555CC90573CBED9474266C89FC55FF0BCC55602A51A1B5F91E425A1A58DCD4ABD09BBC63933FB4279B9E21298F9FE0CF1A93C4A19695240E8978D604047ABC7239F5053EA650D781307C50DEC4D5E2360ADEB9AA02C0F6FEC5784784A271169CE456E1C32BF984C3323656CCC588C97E0ECE5A40FC7B4DDBDDDB764EDC512DE63270F07891BD160F78B8ECD3A4D11EC4C68EA0A0FBD0F23AF9AB261A110F431F926C4995B05462E0DABF29D9660ABBC660C9A675628270CEA7EC5AE9B6F298B17B2392263700B8EAD9C845AD29CCF109A2ED66ED5BAF9C935754AAA1B84BE2B5339F9BF3CF5E80AF16967863FA8DCA64F5FE873DA4A6D33E39A592749B721FEC203C0CAC527CA96DE7A96CE9A540F5DA1902C97F960A05EBF0C32934F9B81244C945A60FD3F176DD8C261690D8EC98D19607129A50EDD51135FFBAEBC04A0961ACC5A32FD058FFDF2C6866BF90A3E177787E7061BD2011EC08EC118EF0451CAD010B53C68D0BDDC701D10920D697EA3439B1A0F96E6256B7712F59C746D1C74C20B17D461C3DF635EEC83E3B8E098034F119B9D9A79ADA735158EAC3F434E805444D5EA2EC85CC8ED8F5BCCAB7DBB6ECFC2E385781579AF1263D9FD32BEE32E01DB94703B5C756B894DEF19783B12BCE2A1A8D29D96F329CB0791D697BE7E0F05DD5C9DADA52E1B8C1E5F75A0FC90ED8C05BDFF86644B1EE61989CAAA271061D4222818C894AE9ECA2DA7326E5C24CA1EEEBE3720D2127BA997B0C572AE30615F8BC4278057F4762D46A39B934DDB2A0903FE1568C1BCC6C37E1F7C145EB7CB20A6A4B3466A7ABA58B48BE94F7E14CD20C87B2768358D06E3F607FE5E9DD1AAA8477975660F1E379B9EA26CC00CEA8CFD6420F2FDC7EE6393AA17CEF88645B821F8F42FC7DD97B0E16C04631F86ECF1CB76A6502FD1C13917CEB26A83596B117D5336387DDBEA56162E8A5BF2FA35E697245BC7210CEC13BFA694AE884582924168BF8EE2F61A734E37876F363225E5AE19B7C65CA6AFC31C8B37BCCB308A9C27F3E9902DE365E288E6CC46E329E78BE914B85EB980C0BAD932C164671ED395D5D8317C133E2E000A10E0D20D0F408019B33D9A87ED7725EA4C5ABAD67E0CAFBFF31DD236E59DEFAB7FF2CB40F479B56B261A32656F016DECA5302A336CA15D10E0AFCD168A4B922B79C11CB21881220374492D64DF21453B41346A85174A0A4A3C1E973845C856CA70D6D25BB854D0C6BD3C75CD73998C7F64E35A58DCF593C85C2440A6ABA4E470F87E6F9B4ABE127B30F8992D8AAD0BE38F008D9D937582EB3AAFC68F516D5AAF2503ACC96E59A151D2D4B072AB6B38C54928D6656441C709F1C1B770CE6EFCECE11F8B3602EAB63E0C629BBD8A79A96BE4CDB072780F3D287B091FC94FF2C0D347FE280BBAC308644BDB15A3C653863EDD945AF0AE725507507B82C283DC9909CCACBCF357D7A19703401B6E4474B94A6CBAE575B942501A281B8166FDC70E6B4B60C2F57A4D66FE1197D301D0E0C7BEC12CEDF9496BCA2183D04632711A79C8374B6DE35C2EECB0239391C2019C720894BC7A635DF18FCEEB9AAE16B3CE92717E2C56903D20D0712EF80131B8C48635163E97EFB1FABD1500D061C93AD935BE9A65A45A92E4A4E885268E712EFBE5337214701BAAD4C73E81E73BFF19AF131F0ABA105BAABE849F - -count = 85 -seed = 30F0E117513AAF27AB2516BCEADD1188B4BBDE76E57DFAF43CBF2D70723D941E8F875C5EBF02BD7D67AE81ABCC54440A -mlen = 2838 -msg = E43EEBE157E43D9F54130C668A153907D65BB19856A1B7C2FD5E2C770FD6BACB13BAEF951EB758485C128ECE4F3E9377A58A45EBA1C3A9CA5C94B50714088700D6FDA933ECE3A6989EE77A824A9E99674748A90B7F227B589250C9E156A8E50B74A7F49DE036FCED86CA0D4C02E217EEFCAEF7234F651CE4380B86389D7331C7657AC283F58C781F904405ACBB68661310EC6921C1FB7483E74116378086D4A0C9A52AF9847BB3CE0FE97F5A7C2CF588DB3B6FD725CA83391656CB38FCB6D79531E56F5D42FC0CC20D04AD7BBF57001BF2F8E6B335CC57CA2DB23C247EF9B75BBBA3159030975D65B9AA7C10E0FA4F615F77126D5271129D8839A3F8DA30C79174373C4BA643E4C4F0CB26BD5B8B9F7EA56DE459EDA15037D8772478FD9F7F7E06F3B422DF0B425DBF1E91D3893CE20F78CDF1910C5D4674EFADF122F41D6C7D6290DF59FA029BD82E792E758AD4388F9D352E9D2FBE3E58810C380D1CC5768865D24BDD92145DBD1EE0D4724C769EF5CEE12DB2AE2708B4C8C7865E70CA31386388D991D46C4DC4DAFC5CE66CB24D455BEE01488A7C764A308C7054572FCA0CC74A01A2B1F191C54146FB1AAF55B834F998B50909F3D003271E6504985DC836B5C44655B938769639799F2575BCFA92F13D32B283A5BDA11177CE1F66D6B30788415BEF598773E87B4C8C41F0CE6633B6C945A3B4C46B74F30945EFD99CF3709FDAFAEB4BD4C6BF605F89C7A9B4EEA1A6599F0A32CE3F2C58587EA8BB3FE6495D92F2FEEC52BEA3DE2047F5EEA7EA1453C762201FF1291AFA87923107F7FF586E00D07824EE021649ABD2D6E9EF11A1D31726EA9277134341EC57D790949590A963D25D6FADFA9CA21E43ACB7E5ED4CB6E8BB36377C2618997943CD100A927D395376871ACB9619BDE9B1FFD5E48E271952613875FA3ACD3E1F2E872F1D672AAE6E2A575A4FDC4FAE2DC6A7196E7EBA94AE5B49BE41E7295433ADF49A6D2D945F43699D444A726423CD9164B9E28B0AA4485B0C767A9398DF5DC5F23D27889C14B1ABE98880E7BD5DF9AB3D1321D5493A0A8B91EA4827627A9B59308CB0104CD8DA7D9DEF2D47B27074BA007401415E900DF03F251C8AA425F0FA59D74C41BA7A9288C8E280141CAAF6C6932DDC4184F81F5C33F0FDA005BF3FB6A0A9169A709875AE475302D57CE96D3DB332188202597FF29D1F9EBAD2B0FFA27C14CE9CCA58C923283BA10E9FA1689D6C2B8804225D706E09FF97AE9CEDC27D256E8736DAA54382040648F2F6BFBECD6C3A9BFAF5D1ED23EAD00EAB351F1E0BB4C719AE6A1F5D12E7F09ECEA62A2F554B18397FE1400DA1EB6694635D7C9C626E0FC82CF8DF6AA4CA88B69F78CD065C53F929BAA58507FD3E3D8124C4BF287D452AF47AF9F4D926DFDB529A8ABB8BB57C5C7611A97053A0CB0B01C754CB479C6CD3A3E867BAC33E45EA0BB6BF77E0B2EC2F136DAC0E259FA309FB5F6D8E7005E1696CE203C5D054E5927A87A1B4E81E73F22FAFE61D7D64CBFBE519D39E716BDCBB37657E71B9390FF04B3C01C6F6842684115CD7F5AAC208EEA48906890248E58D1615634CC1263CD3ADC14B67F1A1A8ED2626E7237AF5488F5D269973F11458E3E4FC2EE35A4BF49C2F5F2361939FA243FA8F33B54EEEBA9B0453701E367A7BF4D698C62DA64732652C68C20A956522826F8E29A764BA93DBC98FCC87E59A1423886694057E131333C5DCDFF3BE7A1F0D344A2DEBB90051721E0226178DEED353A136F69481F83651BE3281C562D6127914CD24C38FFB327786086B08EBE89D03A33BF7B5DCCF90DE9C4D907D308E08A616C5343C116A098786383009DC70787AAFB4529CD27CF85F946B8B238AD2F00DF109FC84CDB48BB52B73E1DE066636176E8C6C76216105486C553511DF1F0664EC1E04EE0B0BD74A08070207486B7F326C3EE73188AB5BB7F8F5643093916491D62F0DB18675BA4CE90B2AB310BBA4705B65A581FBC5E76842A99D4926AE5BF7B8EABCE5FA30CB98C1BCF0E0708DA970096234D47BFE23A4F9ADE29BE5A8B6BBB748EA1C13D00388AC90B65EE10BE6A9AC422EBDDAF5482422AECE19E702F6D26ED954D4E489CC48B2E39A6F168E98E11C1DFCB4A843354F1AFD447962E5090CCF51DDF6643CE0AFAFCF3E4363187E69C31AB796132EEB04F2D4976A576B9BC8D9B1D491B74613C1AF32E3D2DEF408ABEBCC27E4A915C983E10B6090FB2DE6FF9E60C96CF4F940B09AEC048E7A174711798FD76DB15DCAE0E570BE3AC147E2F8777A522555B0898BCD7B04ABBF060FA72B04604C9A583FEFD02B2AF9FA035F97DE4DAA4EE777F9D6985149DB6C2F0A33EE1A1436B38DFDFF87F831E83399C6A884273E612433EE3958F37C99A748DF151E3EA011F4DF5F0050597685E0230DA1B1C7095E1203EA7099BA5C43E58AB0EDA60AF65291C3CC9A07257D71CA6C9EAB93CEF41294853A67A5B11F9192C96A36C701F142DC36B046218BEBAD9904FB765550598F8E2F49F5F0AD2608117196751E7E4C5CC4C3EF425A921C1EE15F37A1F80DF1E24163CA145EDB0FC4D988B8C7167ACF9CD94F919AC96E5469859FDAEC54E1970007EB9699342A9AA044A8EE478A3ECF8B59B0109EA7640C218ECC1E8CBC5E2FB61A1748B7C038EFDADC2D096BC29D95B1BE770D097AFD8B0FE02173A1B3D7110F80D6C849F1AFD1B01A60894B16140F9B34D96071A753545159C4FFA4DBAA938BDEC287C6B83751C5E699724AB355D1FA0E081DB286EC83343877C520E856C4ADC65322AEB39CD87B7D8E4FF9222E085ED84C58B7FF513AD77F8A9EFF2760A03F69AE5DD14DD92DD3F2D3D98E97B1987086B3EEF2F2E822C851B7ADD83903786C050F30C4A4F4BA9361E49ACAD503E2A07EA119752E12D4FA09DC83F7A48EE3DCC1F09475960B6839CA736E498A128F78E58279063D839ABA88AC9E5BC24BC07BBD2DE1CF2E1CCC5987E63F83780D0ECF07EAE21C8C752529735B37C980EB320DC949468C69B17DA8AD612825A84D0529EB97FF8C4CD225FDFD1563BB6C5360ABDCB3339434A298DDCF5F36188F3AB501E505828E8D2FD6DDA062AD415C56414FD7557170F0F57BC5A401FA648699F3C7F7FD8F1F058849B817FADDDC24726DF851D3644414F55CADE30A5764914675D574EAD4D4DB8725866A6C51BF0EB23B12FBA1E101A6F3BDB98A2884D0F2B8DEB3F279E9C38EBD0209DD05C0FCC6EA715257355D0D6BE2C8BC7835187CDAEA43A8EF9C59E88AF6AA667A697A3DF8BDE250EAF4341A835B5EF93CFF97656133B49E13213949A3F368D985E0D6C793319F4284DFADA383137DC5B000B7FDD85F27865DC633562949BBE4FBFF75417AB109F03015BD0F67728969435EFAE791AC72C6AEF99A385A3E8B4C35F58380149C653FD78391A7C3B26A3550D37F9639164979288BEEE99E36AC6F44D0FCBAF0D210839D563A6249059A30CE6F047F5D541FC8A90A18610A8BEFB9493C5AC804D34D40881CA82E673788870705BCD585044B11F1D9BBD6B17D8B82B7CCC0554D1E3AA7F2762FE01385571C9FA7A103D07C1A209504876189DE4B3C5910C26C5F33EA725A7D57CC30A6EC8F3EECF2409F1234A094556C0F7941CFB30FE86F208FEB73C8E8EA8623640AFBDB1CC589768A714CF945731DEBF4519B70870FB3A50F1FB368ADA3FB217704A5D46D879CEFF9BB72667ACC673CB196AFAA0DB1160CC2CD7B260DEB791A94D0988ED54B7E45F33E7CDBA0FA105F3AF3CB1521EA382B1266DF304C900BF53E195CED03871A22C50DA166BB9441CEC83607083195D6CFA17297B678ABB5E03950160130B47E25713B0829F64D2552EFCF404F65798A86D5899B72150A91BA00F7DFBFFE82531497B60C31C28992377A2DFD5FAC8A9C16C835CE4DC24D0389277E6355C655C8A33C89BD48F55C13EDE24B9BB348DEC89612F0905719743C95C0E8B5653855676CE171F812ECA405B6F96F2212D1A5369A11379282AC0C5AC41D -pk = 1DB16F301844F3A8C168520133D1482DB00987D9DA48759BE0D0BD4524DC8AE5FE4A040BD35FC3E8582DCEF01E754E0092BA08C0B951DDC8D841734027EE98BAC487F9FCA8D3F8EE02A5FDE1388838DA3AC9F034DDA7BB373762A5E375DC2A03 -sk = 1DB16F301844F3A8C168520133D1482DB00987D9DA48759BE0D0BD4524DC8AE5FE4A040BD35FC3E8582DCEF01E754E0092BA08C0B951DDC8D841734027EE98BAC487F9FCA8D3F8EE02A5FDE1388838DA3AC9F034DDA7BB373762A5E375DC2A030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000156B3C4BEA0C2F1443C69084B836D599DEE86B756B5B00B274B63C13D99B67926202129BAABB3019106D0E5EA9306F803410559A4A01129B4103AE4627E2F8FE87ECE7FFFFFFFFFFFFFF82FCE94F917715227BFA3AC864FBE68523F8A0BDB3F83AB43644ADC6AC1ECEC3DBD20E1F13631A0A845AA462CC7BEE7AEF339EF96BD3200860F2EFD3CEEBD1794B55ECFFFFFFFFFFFFFF767EC1A48B9C0E3ADA37B1D2B880D03B36988356FFFA2C6DB67935C189D640486171A22435B6F31E76CA69FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25430F39AA86985A8AFC2CAF9DFDE790A28BB9C2330D7617FC32DD834B5A565527AB680B4C57A2CE3E237A010000000000000000000000000000000000000000000000000000000000008F287C9B932502A13D4EC486B870E3D85E90F07E715B155CAA677B4D4C08292A6128C6BF9F1BA166D3DEDB3B4FD16D010B0ADDEADD687F002BAF0FE97435A8007B863B46F51FD06309B47C56AC988D155A4F4958AE75D111FE30F8371FCA2400F52E22AED276EDCCB3EEB4445D88C87FA6BAB188262C40967AFAF1D5B00B064AAC03BF9471A5467AE2F03B3138DFD9003A7315A2E00D6D391F5F2AA3FFE9309C82C3D25ADEAAE7E3266ED7ECAF1330ECFAD8AAE1B5CD50386D7983F33450760296F2319B3F0CEF38314689DAD4C5872B3D299DACA336D840F7290591246D7B7A8E39C98614E1E8C9B99C476D5A02CF022433EE54902830463711AE5917307D9FEBEF04B66C9CFE2386DF249F77D151EF773F5E0A5C2212504190D2DC4CB0C4029E94BA3491AA1512C6779796FD569DE6A131AB6A581DFE1D4478FB743BC0BE0A5D846BC71D4C300AF456EF7E1C70E102F6875D52669C96ABA24AB0E7AF58B5D4B498CAE030C57EF5D84A71C29E1BBE9BC30EED89977EA91B4AFD0F739C860902A29E4E3A443AD693ADA7499FC07F3C1BB49DD4BD8890229CF79C120ACE47057B864F293B3997E19CB161767392BBF202DD169E6CDA9A441FDAED92E70B51474444C2A230DB36816F9BD5740038A55C07BB29A6D36BB239D8605D2CFC2FF20302318C0BA10F3DEBD4EBFEA425127173215AC9D76A038B7C036F137291A88FF5A59D93549B4AA807C3F57C889064123F0090064AE505B26A2B067F29EF41B75CD84373834077A8401EEFEF83232BD7319C51A44182E5B3DF00E50D871C52CA4C02942BEFF0A50662A004707790E857FA727515ABD41A09E7F69BAB45CEE4D04618E38B637BFFEF87302D88FAE639AB7E02C5F73ABB7DAB8E37C475C9511DE676F38E72F562AB5F5E96C3F5552CED0C13F49FD22DFB9BAC088C00B570F24ADD3102 -smlen = 3101 -sm = 30E6B212880E9A75589766450087182339E4202E4AD27282DD01D664EBB8969F773B2802B6B6009EB8CB57E38FDD6E52DF85BA01CCCEBBF021CFF060F87CAD580145C50BDC7C6A7C90723DC53D00EC693F0CF57AFED7182D9F8000F2FBCDA92A044615F1BF286F013AFF92D667169912010AE35601A61662105120AD5D753AEAE800EF1E9D95E611DE7744BD1B6400C9B2B7BEBEFD53FB8A112DEC0180346B67DF343FCDF376CD7F016CA6ABC48C90D4C5D59F1FC600F90B848A18170B2B2E8A0968014FFB8F46BCA49E7C9AB3A1A20000E78276B13C0972F7B5818B72EAC62AE6AD50E1FBFA42164E6E18019C769D6881C9C70802867CA301546C4367DECFB3E8B722156FD70AE43EEBE157E43D9F54130C668A153907D65BB19856A1B7C2FD5E2C770FD6BACB13BAEF951EB758485C128ECE4F3E9377A58A45EBA1C3A9CA5C94B50714088700D6FDA933ECE3A6989EE77A824A9E99674748A90B7F227B589250C9E156A8E50B74A7F49DE036FCED86CA0D4C02E217EEFCAEF7234F651CE4380B86389D7331C7657AC283F58C781F904405ACBB68661310EC6921C1FB7483E74116378086D4A0C9A52AF9847BB3CE0FE97F5A7C2CF588DB3B6FD725CA83391656CB38FCB6D79531E56F5D42FC0CC20D04AD7BBF57001BF2F8E6B335CC57CA2DB23C247EF9B75BBBA3159030975D65B9AA7C10E0FA4F615F77126D5271129D8839A3F8DA30C79174373C4BA643E4C4F0CB26BD5B8B9F7EA56DE459EDA15037D8772478FD9F7F7E06F3B422DF0B425DBF1E91D3893CE20F78CDF1910C5D4674EFADF122F41D6C7D6290DF59FA029BD82E792E758AD4388F9D352E9D2FBE3E58810C380D1CC5768865D24BDD92145DBD1EE0D4724C769EF5CEE12DB2AE2708B4C8C7865E70CA31386388D991D46C4DC4DAFC5CE66CB24D455BEE01488A7C764A308C7054572FCA0CC74A01A2B1F191C54146FB1AAF55B834F998B50909F3D003271E6504985DC836B5C44655B938769639799F2575BCFA92F13D32B283A5BDA11177CE1F66D6B30788415BEF598773E87B4C8C41F0CE6633B6C945A3B4C46B74F30945EFD99CF3709FDAFAEB4BD4C6BF605F89C7A9B4EEA1A6599F0A32CE3F2C58587EA8BB3FE6495D92F2FEEC52BEA3DE2047F5EEA7EA1453C762201FF1291AFA87923107F7FF586E00D07824EE021649ABD2D6E9EF11A1D31726EA9277134341EC57D790949590A963D25D6FADFA9CA21E43ACB7E5ED4CB6E8BB36377C2618997943CD100A927D395376871ACB9619BDE9B1FFD5E48E271952613875FA3ACD3E1F2E872F1D672AAE6E2A575A4FDC4FAE2DC6A7196E7EBA94AE5B49BE41E7295433ADF49A6D2D945F43699D444A726423CD9164B9E28B0AA4485B0C767A9398DF5DC5F23D27889C14B1ABE98880E7BD5DF9AB3D1321D5493A0A8B91EA4827627A9B59308CB0104CD8DA7D9DEF2D47B27074BA007401415E900DF03F251C8AA425F0FA59D74C41BA7A9288C8E280141CAAF6C6932DDC4184F81F5C33F0FDA005BF3FB6A0A9169A709875AE475302D57CE96D3DB332188202597FF29D1F9EBAD2B0FFA27C14CE9CCA58C923283BA10E9FA1689D6C2B8804225D706E09FF97AE9CEDC27D256E8736DAA54382040648F2F6BFBECD6C3A9BFAF5D1ED23EAD00EAB351F1E0BB4C719AE6A1F5D12E7F09ECEA62A2F554B18397FE1400DA1EB6694635D7C9C626E0FC82CF8DF6AA4CA88B69F78CD065C53F929BAA58507FD3E3D8124C4BF287D452AF47AF9F4D926DFDB529A8ABB8BB57C5C7611A97053A0CB0B01C754CB479C6CD3A3E867BAC33E45EA0BB6BF77E0B2EC2F136DAC0E259FA309FB5F6D8E7005E1696CE203C5D054E5927A87A1B4E81E73F22FAFE61D7D64CBFBE519D39E716BDCBB37657E71B9390FF04B3C01C6F6842684115CD7F5AAC208EEA48906890248E58D1615634CC1263CD3ADC14B67F1A1A8ED2626E7237AF5488F5D269973F11458E3E4FC2EE35A4BF49C2F5F2361939FA243FA8F33B54EEEBA9B0453701E367A7BF4D698C62DA64732652C68C20A956522826F8E29A764BA93DBC98FCC87E59A1423886694057E131333C5DCDFF3BE7A1F0D344A2DEBB90051721E0226178DEED353A136F69481F83651BE3281C562D6127914CD24C38FFB327786086B08EBE89D03A33BF7B5DCCF90DE9C4D907D308E08A616C5343C116A098786383009DC70787AAFB4529CD27CF85F946B8B238AD2F00DF109FC84CDB48BB52B73E1DE066636176E8C6C76216105486C553511DF1F0664EC1E04EE0B0BD74A08070207486B7F326C3EE73188AB5BB7F8F5643093916491D62F0DB18675BA4CE90B2AB310BBA4705B65A581FBC5E76842A99D4926AE5BF7B8EABCE5FA30CB98C1BCF0E0708DA970096234D47BFE23A4F9ADE29BE5A8B6BBB748EA1C13D00388AC90B65EE10BE6A9AC422EBDDAF5482422AECE19E702F6D26ED954D4E489CC48B2E39A6F168E98E11C1DFCB4A843354F1AFD447962E5090CCF51DDF6643CE0AFAFCF3E4363187E69C31AB796132EEB04F2D4976A576B9BC8D9B1D491B74613C1AF32E3D2DEF408ABEBCC27E4A915C983E10B6090FB2DE6FF9E60C96CF4F940B09AEC048E7A174711798FD76DB15DCAE0E570BE3AC147E2F8777A522555B0898BCD7B04ABBF060FA72B04604C9A583FEFD02B2AF9FA035F97DE4DAA4EE777F9D6985149DB6C2F0A33EE1A1436B38DFDFF87F831E83399C6A884273E612433EE3958F37C99A748DF151E3EA011F4DF5F0050597685E0230DA1B1C7095E1203EA7099BA5C43E58AB0EDA60AF65291C3CC9A07257D71CA6C9EAB93CEF41294853A67A5B11F9192C96A36C701F142DC36B046218BEBAD9904FB765550598F8E2F49F5F0AD2608117196751E7E4C5CC4C3EF425A921C1EE15F37A1F80DF1E24163CA145EDB0FC4D988B8C7167ACF9CD94F919AC96E5469859FDAEC54E1970007EB9699342A9AA044A8EE478A3ECF8B59B0109EA7640C218ECC1E8CBC5E2FB61A1748B7C038EFDADC2D096BC29D95B1BE770D097AFD8B0FE02173A1B3D7110F80D6C849F1AFD1B01A60894B16140F9B34D96071A753545159C4FFA4DBAA938BDEC287C6B83751C5E699724AB355D1FA0E081DB286EC83343877C520E856C4ADC65322AEB39CD87B7D8E4FF9222E085ED84C58B7FF513AD77F8A9EFF2760A03F69AE5DD14DD92DD3F2D3D98E97B1987086B3EEF2F2E822C851B7ADD83903786C050F30C4A4F4BA9361E49ACAD503E2A07EA119752E12D4FA09DC83F7A48EE3DCC1F09475960B6839CA736E498A128F78E58279063D839ABA88AC9E5BC24BC07BBD2DE1CF2E1CCC5987E63F83780D0ECF07EAE21C8C752529735B37C980EB320DC949468C69B17DA8AD612825A84D0529EB97FF8C4CD225FDFD1563BB6C5360ABDCB3339434A298DDCF5F36188F3AB501E505828E8D2FD6DDA062AD415C56414FD7557170F0F57BC5A401FA648699F3C7F7FD8F1F058849B817FADDDC24726DF851D3644414F55CADE30A5764914675D574EAD4D4DB8725866A6C51BF0EB23B12FBA1E101A6F3BDB98A2884D0F2B8DEB3F279E9C38EBD0209DD05C0FCC6EA715257355D0D6BE2C8BC7835187CDAEA43A8EF9C59E88AF6AA667A697A3DF8BDE250EAF4341A835B5EF93CFF97656133B49E13213949A3F368D985E0D6C793319F4284DFADA383137DC5B000B7FDD85F27865DC633562949BBE4FBFF75417AB109F03015BD0F67728969435EFAE791AC72C6AEF99A385A3E8B4C35F58380149C653FD78391A7C3B26A3550D37F9639164979288BEEE99E36AC6F44D0FCBAF0D210839D563A6249059A30CE6F047F5D541FC8A90A18610A8BEFB9493C5AC804D34D40881CA82E673788870705BCD585044B11F1D9BBD6B17D8B82B7CCC0554D1E3AA7F2762FE01385571C9FA7A103D07C1A209504876189DE4B3C5910C26C5F33EA725A7D57CC30A6EC8F3EECF2409F1234A094556C0F7941CFB30FE86F208FEB73C8E8EA8623640AFBDB1CC589768A714CF945731DEBF4519B70870FB3A50F1FB368ADA3FB217704A5D46D879CEFF9BB72667ACC673CB196AFAA0DB1160CC2CD7B260DEB791A94D0988ED54B7E45F33E7CDBA0FA105F3AF3CB1521EA382B1266DF304C900BF53E195CED03871A22C50DA166BB9441CEC83607083195D6CFA17297B678ABB5E03950160130B47E25713B0829F64D2552EFCF404F65798A86D5899B72150A91BA00F7DFBFFE82531497B60C31C28992377A2DFD5FAC8A9C16C835CE4DC24D0389277E6355C655C8A33C89BD48F55C13EDE24B9BB348DEC89612F0905719743C95C0E8B5653855676CE171F812ECA405B6F96F2212D1A5369A11379282AC0C5AC41D - -count = 86 -seed = 070FFB907EE8AB7152A9D380DEA2C4C4796780FCFD80906C5E489B917A45D5E7EDFE6F37C4420E5480E8BB599FE36451 -mlen = 2871 -msg = C07185E0343DF2A4201649AD5DE4CFFA20BAF5DD43F5E4A6C81CD5143FE72865A7C036A2DFD617D96626995C12EFAD019FF44E0EDD7028F29E3657EE3C0D02E9CE83EF0A648FD7CF183A7BF7C15095E0F9278B14FDF6C983CDCF2987DD0CC085400906DCD0D14ABA60124F4B7494ADBBAE3A8D6052122575F99792F7240EB17864DC6D231721140E43F1110E73EB2E3C05049783B33AAC4E4CA0A248775BAF81FDB03D114508928BEC3169A810296B5A4DAC27E7C7F8D01CF5943CF4D8CF6EE6F9042BB300E50EEA3224D35C9628E38C368EC3B42393FC820371DB6557216A2C2D5A230FE3A7C6BCBDD89A2BE5CDBE7F783BA379B6A4237DB051E6256DCE14DCF641190A956E8E85EB2638736B899ED045636DDB7A351F5A4F4108D9D6E0413F92B9D392495299128A5F4ACCE8C7747C675EFE05ED7182DB51C515B345029440AB61A904D2A390122680C951ED4575515144C5CA80D6F14D1CFDBB5373B78E09D04D0544151CFA1240790CD31165048D1484DC4D11D05057071DB3433DF071B367E00FD38C386DAB689E4DFF6FB421B2A95FF54DC29375C9D1C18A76C79ACAE3D3F35D4CFC385199A4CCAF6C9F0421BCF58D296EC7E0D1B95A6C4BCBAC1271F94E438360A71A6440275591E41389B30CAF2626A865B9E59552CB198A1D4453EBA6D0F6FC491A8A7783B4A8BAEB81E54F9189CE493EFC1C5D830A4F637F2BF43CD86B91637611415C95685FE79966174312FDFBF33A646625F97521B5CB1F008135B824F1D6D8373006C7158E62B1F794AE34548A0C6DAC8B60C559D81580AC0D84034A501516EE36CB4082732918365A5AB787FACE591AB02BE6957AE4BB96B58E2B173DA019D3E0CABEBEBA0AF775779F14BFBA8F595697731522DF3C80CBDEC16F6ACC32659CF5DAF193178307887EF1BE1B48B5806D0FA9868A7FB853708B26873857786B974709C687D6597BCF6C7E476C1E47CAFDBF30B6311ED434C0F998C4065399C59073C1F2BAB1D46104E74EA6C976D416E58BDFD24CCD957CB431870DE5DA8763992EF68BB18075926B0E4E826095EB3B8CAE086FB1759C94B873A1F4DF477E0EE9EED8DFD7C77508B3F0C67F69BE04355ABA9344960639F6DD6B3A956DCD66370338617A365579C5993986B4F748CB7C990344B209785E22A40FDCF8F83061D37C9F1351B4473D6C74ABE6B3EB2A7D62CA0F0C88A0AA8A46973F781DF0126E8D55D3E9C41C2E3884F84FB0A06C484CFA0C9A0DFB8CFD573749C711C7C236B0F2F144E1BA4DB2525C093DEED29434FE43CB3040C5A374CFEF33214FDD2D660398E91BF070A4F5F9746C2F08C41256FD5E955891146FFD38B155987E6A0FC47AC2A5950509B9E2C86B9DD9929378F43EF3935F1562672498C5640A22315BE15B001D4B01418DF8EB41DFE5C570E850582D8916C2E7FC2B728048E24BB9D1E8283615E039C16A2FC61011631BBD8F2BEB24ADF9552CF5797CE05D9D1A7E7F3F5455017B127D9BACD32BAD0CDBD3991BBCAEA5FC988EE7AEC0B1003732F25489EDB0A1F9897247CBC40E60F1DD276259CE19DECCB90067F7293A68B683FB5232ACD2217B8929859109D6852A43892098630A67D72B1CF4BD5D58E20C5C18B85D69DF74EE8CC69BAAC7DA48EB71A160F03B68C6BE87A4919736F14363F004EA3F41DD37FD8E621BF433BCA71E17565E060F3C0F889515D0A8C17FE0D6D734FF756256B0A62058B95422257780DE000557DF289F47910CC272A14BEC737C0715F204C49F03150082DC904A5D170F7383F04F1E355F50F80D5461CBA53490BB2E9484806D369D61FD00ED1EE5BE518D04A24503B1C4C08C7CA084902A3942C04143807203287A985EB3FCAE3C5309410CD9B9A548F54DED44321CE8C2A04679841DAEF7FBB6AA11091D240AFBB467D9969C31C1CBF6B24F8CBFA20CB4CFA404B1310400271664763E9C1CD1B6FE5FF2A0FAE22AB14EFC016CCBB19C5DD5D047750DB4ADDEA3E7A193128A5F4D7BB6358F21B39A44259695904DE3440BB28CF9466B562065C387189EAC2F7522C9385DC2A607F6F9335FF8ADD47C7BA932659AFF69B1F26EC8655BEE4F97FBC846E48111CBE25524873D1DB2F2282D0472A2AAA3CF491C26DDC5E1BE77866A3B692E417E6717A4F4454C56F97F063B9E598865B6F71136D65DDB0F3CDEC57DECD5A57366BA96E4315A88B4EA3479321468FFFF508D23B0701A62CE0CBC0FA37C91CFF5C5A0433FD61AE11A922575F5BAA714DE46A58D6EFC79BDB10C9AF7E9950A61D44B3E17E3B5298501146485B562B1570FF5798B47641D67091CDF90902B2D762E3EFE94C540DE4A28269CC416EDBDDD4D43AC2FA82D638DD9BF11F3BF22FD81CC4BD4759D7D864EEA0E8E8AB71796254B278CF9B650D1FEF38B8437362B2D69ED84C54498331C6899E20C596FEE7CAD9ED8D83D86774AFA6E56A4ED34B0B0842B21CCB67035406DEDFF0CECB0CD089929ED5FFA0CE210822444808BAD99AF603082BFE5C98EE4653349F8A43DB64CF90190C96B0446CC9CD23E0D75B47F54A731E8BCB0A4C67401DEE87876011033D2A526067FB73786FBC1CE696130FCE5D5379CDAC6788875D27C04783B1E2EF41063D57E3D6560D1FF48882C39131C95BAE5A9C9392DAB6CD17EEFBCF61C464A4DBC08447443CBBF3FA80481F3BC1A5806042C07F7A7AD435875DDB1001565EB6B7B872CC6C853F771C1DD5D9C16BC27ACEB3C7690125C1907C7CE904852108CAFE76351269A3D3EA8812FAE4FAE35F0DAEC8E8B186F760005524998BB5DE475E4DF85209DA915BDC972218AE7DB7E2EFA05A7D752AE61CF2F3DC26CA2D282C8E32B4838524BE460971E077348290FA0043FB7616D821A71DDA3A5FB76BFCE0DC84AAEA432DF32B05133A26B46165297EBC45024777A868B8B1B0DD6F97658BE799BD366CFDF99861E916F7CF06C034E4F79594F1BB6ECD9B7347911488928E1E473C4B8C73297F7ED845B9EC59020373EDA57A436C1C9D1459C6114BB6258543D8F4F97B10AAEF5A2E082EA173EE69702D83711FEE6AEE8F6B260D03AB74C3B5D8FDDB81B208E16458511270DD1DA295F25CDE7E44A8349B60BF0C59D4B425C1FBA60D2BCBA47B906D2830D8D5C091DBA756E61620D78B2DFF28407FDC9DA9113CBE82219BB2CC05E11C70D040BDE821AA17B3E981558961CA571E5D5041F7DE047A1727D9C904DEEBE561DC6DBD8876BC77C27322F512D6171BC03871EB0FDECE70F119BACB41D1852220CFF26110EB0EB78E39AA1B2A4C2E78679F53683520C5A57FEA71A8E96E0AED33118DC4BDD035FD88F535B011D9C7DEB6F406A072AE6C091016ED10A5A4EE9827882EE27C535262D1D745AA5231736F2DEEC8A6017BF0DA36B416C98AB71C6824A6EEFF3564665007C9E850FD02A1F5E201B534627B92D21A493DF293DB9F24DE70C7B49A6E07ACF2DB6C90B448681666DCDA318C08AAD08D3E257AF7E774C75DEBE3B3C07AF683735E87F205B0FDE07351849C5AFD07D5722C6AA17B6AC2CC3551C305E6AC31E3601A236961F6618CD3A0F7DCF6F65B8EC82E27E44C8518CDC16ECF79374F796A3DAABE2D5005B25576B35B021497C5A8F9B98DA68D80E56A1CC1044C04DFB11D36CB147EABFDAAFBA0A93FCED8675D7D6A9F999785C0E7346F4C68EB17C0A2409E2F5BD4AC5551FF66A9857C66F642F2A385131377B6372884C417E01BFBBE1CA748AC8969BF2C0BD8944767746D1D57D862795E8ECF9E8A5CA122D0259FFBA822588C5ECCD14CC6FF4B7354CB572F5BD695ED9D85DE131FDD97DD5D6CE7844DDF9F3D112028B5125AE7A77A4AEB2EBB554682A26F457C43FE96D67C90BE7E49FF443478E82D3A48680D737D1260B8210BBE962EFAE6505E496B1B6D4F1042A7B971605E2DC50BE3BDFECC3010B9F5618D3A1B2C1F48888B859E4D6B63CA9D29990B6D502FC22B738B203A83D597B48D73C41860E4E99C57181F5B02F108CA193451025F3B368CF2741244F42B27CB9E57260D2E127CA166B32E0B9C927B247B31619B1D4 -pk = 0B5B56687B8784C46FCAC153EED52C24C2EB5E1BE45785154C158B7CDE8930A5DEEAF810BE9520988F7EF984817F39012FF7D3EEEB12CAC4AE875A84DF4C029B9D5FD7B2565D6340CE4C3EE6C55FF7ED3C33780863A8AB2485DBF64006D41103 -sk = 0B5B56687B8784C46FCAC153EED52C24C2EB5E1BE45785154C158B7CDE8930A5DEEAF810BE9520988F7EF984817F39012FF7D3EEEB12CAC4AE875A84DF4C029B9D5FD7B2565D6340CE4C3EE6C55FF7ED3C33780863A8AB2485DBF64006D41103020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093512DCD8FEFB7A22098DDED1B09131840EFAE0FB83E1D3A24867401C124E69E39D770045D075D7B0F9197CDE751680B658C84CA679C354727F4BD3A7B6A4C1D6698F1FFFFFFFFFFFFFF0AF02D92EE97AAF536FF235466082C8B1A354C7B8077346AC3B4226DE2B72D39A8B21CCF218540533E907ACD251FF4EF0A49494832B24EE20C8C8AD47B4E1528DD7DD4FFFFFFFFFFFFFF3A8ED11FF6C6EF9146F241C716353286B20484F963C576D5EF461BAF67BA9E83403FBE17734B10DC3B4D5CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73FB1808B2E2ED8BAA9BDDDBE30DE359E4C235511CB91E02D242ACA269885037A69F729A882D48C3AC3C2E01000000000000000000000000000000000000000000000000000000000000893ABD2C0677C1FEC1215316724FDBB9C21C3A7419F5BD5314D6AD2B9D977DF134692139C16EA0DF3E2A1219C39CA4009710CDB0BE5221264DEA76ABC23D206F4236A9810F4F486818EE66D0476DE93D8D815A3CCF41AEE6D5C40230C64F2E01E0B2A2463E9B16050F322E9F68CE322469B7D5161DB5F24D58C1223E07BA4E73262C667508E54F290E3476877CC5240201D1F9B5BD335F2F64FF942C886F2ED3A96C3F95FEF580ED9369320908797BCB646E613AFD2DEA810E0D95F7DC6E9701572244BEF6642E7E6D6154C0264D2B5E03BAC6E4E93F1D8F32568B91B3B406D4DE0F5A24F4817D3F8A65B8D85A47D4011E2CD775E38B60F25F956B6826950A48BE2FC056F779CB77B5F356932E2A659A4BFA86DAE83F7B3CF5B0D29AD3089500F7ED4BBD36BFEAE6BEC06EB35AAAA6DDC06977482C07787A9E8825A5B34A6CB857940370C2F58AEEA5045C7E7EEBA8013A20686E410BD8E7577FFAE23D84501CB513F4DDC3FC33FD72062F9162729764ED305AA5C6C8BCFE7C3AE2257A3A7300328C612045F0643C6E574CB15F57844416E6AC2569322BEF4820A443514D7E9DD81640E098BBB51C2073F58304B9D40159503986E281F5D887B47F03B94CBC5FF33F797E4D60C812EAA7071676A0F9FAA9F408B523DC0F81867417AD87A06E002A9A7B9EFB668FFEE3A2CF36ABD845DE5A457D72D18088F5CD41E504B99A902A530CF24A73FA0CDC356F89294F295600F8A99AA9CEF6F4FD985037A348F2A15819140630663D4148F0B5BE67F79F5324ACDB6C6EDAA02CA9A240F89B96AEB6012F50533453268D9FAE81970D1A81E54F1C3A5895C0190F3CFD6349D60BAFF92C5C207F1CC2D63AC33228D49C58041002D058113038C94C9174098ECF64B33D1D49E9555018900E2A98DB7B27AD82DAA492582E05D7FC232BBEC1D09914229F01 -smlen = 3134 -sm = BE9B1FA253CE7240CB48596B00619973FC75B79C76F91F91F700CCB7804FC311AFEC988B059301FAFD649C7B1E476FEFA7637F016BC5363A860FA7686890F74700B5F3B0D4286D05609B74804701EEC0758373E9038A28DABD780064308E3F7215A3D3E55E851F01C9F3326240867EE1AA088A1300EBFAB97E70FECA9F91B3563001C500F9E26AB5D264E922D55E011458881B359CB66483E1C003006E3B42677B243787842C98B900764774B5049B8187C815719801471B3C544DD631C476EB3124008B2DF03C894644238F16AB82010163E8749022619808941A24E6904AE31FF69A6F2A9019C8C25D1203E3628DA2959D0AC65B70E694011BA5AA4A960829BD6608B1DFF906C07185E0343DF2A4201649AD5DE4CFFA20BAF5DD43F5E4A6C81CD5143FE72865A7C036A2DFD617D96626995C12EFAD019FF44E0EDD7028F29E3657EE3C0D02E9CE83EF0A648FD7CF183A7BF7C15095E0F9278B14FDF6C983CDCF2987DD0CC085400906DCD0D14ABA60124F4B7494ADBBAE3A8D6052122575F99792F7240EB17864DC6D231721140E43F1110E73EB2E3C05049783B33AAC4E4CA0A248775BAF81FDB03D114508928BEC3169A810296B5A4DAC27E7C7F8D01CF5943CF4D8CF6EE6F9042BB300E50EEA3224D35C9628E38C368EC3B42393FC820371DB6557216A2C2D5A230FE3A7C6BCBDD89A2BE5CDBE7F783BA379B6A4237DB051E6256DCE14DCF641190A956E8E85EB2638736B899ED045636DDB7A351F5A4F4108D9D6E0413F92B9D392495299128A5F4ACCE8C7747C675EFE05ED7182DB51C515B345029440AB61A904D2A390122680C951ED4575515144C5CA80D6F14D1CFDBB5373B78E09D04D0544151CFA1240790CD31165048D1484DC4D11D05057071DB3433DF071B367E00FD38C386DAB689E4DFF6FB421B2A95FF54DC29375C9D1C18A76C79ACAE3D3F35D4CFC385199A4CCAF6C9F0421BCF58D296EC7E0D1B95A6C4BCBAC1271F94E438360A71A6440275591E41389B30CAF2626A865B9E59552CB198A1D4453EBA6D0F6FC491A8A7783B4A8BAEB81E54F9189CE493EFC1C5D830A4F637F2BF43CD86B91637611415C95685FE79966174312FDFBF33A646625F97521B5CB1F008135B824F1D6D8373006C7158E62B1F794AE34548A0C6DAC8B60C559D81580AC0D84034A501516EE36CB4082732918365A5AB787FACE591AB02BE6957AE4BB96B58E2B173DA019D3E0CABEBEBA0AF775779F14BFBA8F595697731522DF3C80CBDEC16F6ACC32659CF5DAF193178307887EF1BE1B48B5806D0FA9868A7FB853708B26873857786B974709C687D6597BCF6C7E476C1E47CAFDBF30B6311ED434C0F998C4065399C59073C1F2BAB1D46104E74EA6C976D416E58BDFD24CCD957CB431870DE5DA8763992EF68BB18075926B0E4E826095EB3B8CAE086FB1759C94B873A1F4DF477E0EE9EED8DFD7C77508B3F0C67F69BE04355ABA9344960639F6DD6B3A956DCD66370338617A365579C5993986B4F748CB7C990344B209785E22A40FDCF8F83061D37C9F1351B4473D6C74ABE6B3EB2A7D62CA0F0C88A0AA8A46973F781DF0126E8D55D3E9C41C2E3884F84FB0A06C484CFA0C9A0DFB8CFD573749C711C7C236B0F2F144E1BA4DB2525C093DEED29434FE43CB3040C5A374CFEF33214FDD2D660398E91BF070A4F5F9746C2F08C41256FD5E955891146FFD38B155987E6A0FC47AC2A5950509B9E2C86B9DD9929378F43EF3935F1562672498C5640A22315BE15B001D4B01418DF8EB41DFE5C570E850582D8916C2E7FC2B728048E24BB9D1E8283615E039C16A2FC61011631BBD8F2BEB24ADF9552CF5797CE05D9D1A7E7F3F5455017B127D9BACD32BAD0CDBD3991BBCAEA5FC988EE7AEC0B1003732F25489EDB0A1F9897247CBC40E60F1DD276259CE19DECCB90067F7293A68B683FB5232ACD2217B8929859109D6852A43892098630A67D72B1CF4BD5D58E20C5C18B85D69DF74EE8CC69BAAC7DA48EB71A160F03B68C6BE87A4919736F14363F004EA3F41DD37FD8E621BF433BCA71E17565E060F3C0F889515D0A8C17FE0D6D734FF756256B0A62058B95422257780DE000557DF289F47910CC272A14BEC737C0715F204C49F03150082DC904A5D170F7383F04F1E355F50F80D5461CBA53490BB2E9484806D369D61FD00ED1EE5BE518D04A24503B1C4C08C7CA084902A3942C04143807203287A985EB3FCAE3C5309410CD9B9A548F54DED44321CE8C2A04679841DAEF7FBB6AA11091D240AFBB467D9969C31C1CBF6B24F8CBFA20CB4CFA404B1310400271664763E9C1CD1B6FE5FF2A0FAE22AB14EFC016CCBB19C5DD5D047750DB4ADDEA3E7A193128A5F4D7BB6358F21B39A44259695904DE3440BB28CF9466B562065C387189EAC2F7522C9385DC2A607F6F9335FF8ADD47C7BA932659AFF69B1F26EC8655BEE4F97FBC846E48111CBE25524873D1DB2F2282D0472A2AAA3CF491C26DDC5E1BE77866A3B692E417E6717A4F4454C56F97F063B9E598865B6F71136D65DDB0F3CDEC57DECD5A57366BA96E4315A88B4EA3479321468FFFF508D23B0701A62CE0CBC0FA37C91CFF5C5A0433FD61AE11A922575F5BAA714DE46A58D6EFC79BDB10C9AF7E9950A61D44B3E17E3B5298501146485B562B1570FF5798B47641D67091CDF90902B2D762E3EFE94C540DE4A28269CC416EDBDDD4D43AC2FA82D638DD9BF11F3BF22FD81CC4BD4759D7D864EEA0E8E8AB71796254B278CF9B650D1FEF38B8437362B2D69ED84C54498331C6899E20C596FEE7CAD9ED8D83D86774AFA6E56A4ED34B0B0842B21CCB67035406DEDFF0CECB0CD089929ED5FFA0CE210822444808BAD99AF603082BFE5C98EE4653349F8A43DB64CF90190C96B0446CC9CD23E0D75B47F54A731E8BCB0A4C67401DEE87876011033D2A526067FB73786FBC1CE696130FCE5D5379CDAC6788875D27C04783B1E2EF41063D57E3D6560D1FF48882C39131C95BAE5A9C9392DAB6CD17EEFBCF61C464A4DBC08447443CBBF3FA80481F3BC1A5806042C07F7A7AD435875DDB1001565EB6B7B872CC6C853F771C1DD5D9C16BC27ACEB3C7690125C1907C7CE904852108CAFE76351269A3D3EA8812FAE4FAE35F0DAEC8E8B186F760005524998BB5DE475E4DF85209DA915BDC972218AE7DB7E2EFA05A7D752AE61CF2F3DC26CA2D282C8E32B4838524BE460971E077348290FA0043FB7616D821A71DDA3A5FB76BFCE0DC84AAEA432DF32B05133A26B46165297EBC45024777A868B8B1B0DD6F97658BE799BD366CFDF99861E916F7CF06C034E4F79594F1BB6ECD9B7347911488928E1E473C4B8C73297F7ED845B9EC59020373EDA57A436C1C9D1459C6114BB6258543D8F4F97B10AAEF5A2E082EA173EE69702D83711FEE6AEE8F6B260D03AB74C3B5D8FDDB81B208E16458511270DD1DA295F25CDE7E44A8349B60BF0C59D4B425C1FBA60D2BCBA47B906D2830D8D5C091DBA756E61620D78B2DFF28407FDC9DA9113CBE82219BB2CC05E11C70D040BDE821AA17B3E981558961CA571E5D5041F7DE047A1727D9C904DEEBE561DC6DBD8876BC77C27322F512D6171BC03871EB0FDECE70F119BACB41D1852220CFF26110EB0EB78E39AA1B2A4C2E78679F53683520C5A57FEA71A8E96E0AED33118DC4BDD035FD88F535B011D9C7DEB6F406A072AE6C091016ED10A5A4EE9827882EE27C535262D1D745AA5231736F2DEEC8A6017BF0DA36B416C98AB71C6824A6EEFF3564665007C9E850FD02A1F5E201B534627B92D21A493DF293DB9F24DE70C7B49A6E07ACF2DB6C90B448681666DCDA318C08AAD08D3E257AF7E774C75DEBE3B3C07AF683735E87F205B0FDE07351849C5AFD07D5722C6AA17B6AC2CC3551C305E6AC31E3601A236961F6618CD3A0F7DCF6F65B8EC82E27E44C8518CDC16ECF79374F796A3DAABE2D5005B25576B35B021497C5A8F9B98DA68D80E56A1CC1044C04DFB11D36CB147EABFDAAFBA0A93FCED8675D7D6A9F999785C0E7346F4C68EB17C0A2409E2F5BD4AC5551FF66A9857C66F642F2A385131377B6372884C417E01BFBBE1CA748AC8969BF2C0BD8944767746D1D57D862795E8ECF9E8A5CA122D0259FFBA822588C5ECCD14CC6FF4B7354CB572F5BD695ED9D85DE131FDD97DD5D6CE7844DDF9F3D112028B5125AE7A77A4AEB2EBB554682A26F457C43FE96D67C90BE7E49FF443478E82D3A48680D737D1260B8210BBE962EFAE6505E496B1B6D4F1042A7B971605E2DC50BE3BDFECC3010B9F5618D3A1B2C1F48888B859E4D6B63CA9D29990B6D502FC22B738B203A83D597B48D73C41860E4E99C57181F5B02F108CA193451025F3B368CF2741244F42B27CB9E57260D2E127CA166B32E0B9C927B247B31619B1D4 - -count = 87 -seed = EDBCC4F6AD0F30066947D678A368B960CCD164889D77730516B444ED2DF10B49C101902F5FA227377C3163A0045B34E4 -mlen = 2904 -msg = 836254422C7D13F1120012FB9CC7CDAA1D8B72F6FA3943AA7DE75263D3DF814BBF2E80C3A204BC0F9AE33E4FA82CE893D35C57E41C7147602BE12455B00B7949A3195264A3281CECC3FDE34802B28C6E1F2B505AB6087D453BD6AA067B2370124840BCAC4605EE4F14EDFC4B4FF19A4D7A828E60156B49B4027AC18DCCD20294F89CCF03D0CF47BB2F22D3749EEE69EE17AB5D8E4DFCCF36824D23E3F95E959D0494FFBC712CE3975E3A661B3F9E149A0234F691C2D820000DE97CC016C43EFE958DA469F740610FD22B64D4BD2E30075E22BCFD4AB41D952D2394FC629F016EE1CD61AAB4581F62A7B8648F8F8CF02462C81023CBE2755C91195A5917FE5A8B5058ECB8DAFF91DD3F73FE38665666DBF79CF6F203FAF94A5CA3F3AFFAA2C2BD5F5DBC011DAF46FD7CEB74B5875E4B5D80B6EDB9817106B91865267E78731662218C8EDE73E588256FB1AD57232AA5533D25BFC54452612F0C2AECAE6DE19355E1D508B888D18FF9F6D7D68199755CF5C210172F65342269ED96C77D80AF8A244B43A99DEB49B97A6F358AADFCFF6AFF72AB39540D375165185F31E0F1A6F97722EE365620BC5D642F8CDC59F7E84FD8615F4A336ED340BE6ED8451997D87B7904C1B9A3A0BD1F8A01AFD6A2D9F5B995E3FD0D44DF8FBC8389B6CBB5537816C91F0EFC3D2349F15EEE747B254C5BBF9418BB979294423DD6DE4D13484408362582A86D082350CC79EBCDCC05B70110A038736034CE4F3DC1D17E5D11C9C7620D40730B61437906933193D1272F7C89C701D495ED682F1335B7E1C42C994E090A67D932A8E825F4B9EDA8F2A94B9A1F11F10E91396908A9D436DD01BAE1D1DE2C6ACF458C0880E3F81ADC2240A99E6083C9C188982713DB243028AB07DF407218CA6B3C4C93989AC96D92375834B915B724F2A105D6240E52B9D7003C67FF76F7A325D84ABBC229266BB40D1DC8784CE1A4A6BD17972CDB26C274B06337D525F61B5BF952D23FA13757460B7B8A3B99EB023831F4FBEF72D62931348622041FFD12634947579BC6E16BD1EAA8E8B2DFD54D74EFCED79EF4FF31AD42036DEBD0FDA3B7F3F8E7A3F45955F82936A67122CD42E38AF646CF565E294F422FAC1E7D274185896F58E9D0FA1FCD3F4D379ECF5B566586246216556939BDF86D6A417C3BF77C64F95D7DE8197EE25B44EEF00209D33159710DF001372C3E3D09F24B9B08B8938C522690674A7588933E1CA37D2C14DF50777806EF6FD2285771A44F6DE90475C6CC314DF140C3962DD9D70C54E58CC5FA3302D69C80C6511D9D42A51B7CB7FD7FEA8D8BD65A66FDB2AC80D945FB7EC72E138F5566CEB570968D84B60068DF20C6CDA2AD48372DC97424793FEA8D2136923070C25F47C3D10839D1747B613B93530968D5E97A3FC0F563BFFCDE7B42C839EFE66C3A8655D0CEB5AF7A37D23DBBB52D05CF6FCBFFA7C7491703349819AD94CE218912557D6C87937B2E7B0473856EC78713C29A02CF7B2B38E0DFE16804AF6C2BA8607026892138011E06B4AF179D63DBD97CB917B6507B798E58D74F485D3F063C044211E428FBFFD5AF2D7941900299602D3B15D5D600B435D9A21948B8D87A35205A3AF9AA9BA491D56573A93C35AF6683655E04A7A17F1B9709ED83E70D82A3DF59A2FB7C051ABE508601F322FFEC089C49DC666BA04366C038AD59D397022F0F6344255F4D98BBB17120441CC75107005A74DB35459C63770547A4AFE59F2703894DEB67612448BA7C4F6FEADC1717F6ACE410C6BE62AC319CD33AF285D17D55F500E364A0ABE71D357AE0802AF464B6D2732F3FB94BDB3BAA497F2E44727BDCCA5A4B65AE9DF189FF1AC640940FF4D479A8072D34ECC523DC8FC7C87FC89A540485AE7BB3F29B041446CA427C0B48CA7515A1E31788E8B53E1122D372B6557F8D2A97CDE893B20E60283954E2934AF340A358A4376DD0CFCBFE305A2CE7B72DCFE2DE105CF44833F548D1BCE88D34B60BD29B69309DD87F4B91DE10EBDD7D7F87D6231307D0AC784E0496DB725AB97656C34E60B34B230F37E30FE326296C4E1BB88C0BAC261DF0E5F45E6E126103EED6B1CA146D58140A8893D847E92D9F3A0A883E8BF830147CEDBDC7DD42C1A58A826A8A827F9AB26ECCF64F68E9CA6B68261260B659B47E0DEDBF5B077982B24ED9B36E8466DCB21EE69B5E2BCCC49A163B4860EC2CCBD65032776DAE601E18ECDAB8E35C2760D5758592F6CC074298A97FC5E82E7DA84036FD10E0725A0E4E58CC4DB30499ABEC0C7D95D88BAC2C58EB093312779BC1B8619FF2762FD1FF009273456D829394664C31FF6D7848B27174B36E59FB65D6BEF6D974D5038A28F49AD465B28857CC12BAAFFABF3652C2E22B46B040E579FB040A0FB4B1DAF0C157D35407C0B78E305CEEB232E7B7426C95639B1CF7B079E80521FAA538E51E69255576650C3A16E143D0F815D2CC89EB00AA13AF20394AA23CC6AA99A9F297D886AB9AF2655D53816E066A02CF21C277DADDEF3D7D0825D094FD8FBD5386139757EFD0B7F8501829725A4B70FF1DABF2958E07ED21DB76266A88483EE7C51A7D215E1B41D2464911ABBB1DC71F9613ED5446E4B0C97BDD47F22B372FB7662956FDCF3B108E0107F74301A054FB004925B041AF354C04C20FD370CE1A014EBEBD8311F3265A2F78B48124521A4AAE240D3BA9F94FD33CA4A92D24A029E0754831869B58F670435A44DCDD7BF75ED9FF06DBA52980DCE49C1C26BA0965DE3623F459E36127AC6AFAD4D5598FC45A95173D039CBBE2CDC7DAB2865FB6BC0FA8DFD33C4A826CFC77BB7F45CB5AA73377A27271AE41630DD3D4E2722581537FCFB233E5AF8F04CA824012B5C429EA498F4AD44AFC249DE2229FD7266FE84173A5CE44632B3650D6E1F278625D564B374C10C1AFA3F17432CBE4B65327C6B6E0CD2F99B68AB043C5C6C99D7FE7FCF940F4887D309D7BC0FFAA5DC4B90C79266514F46CA2D5477F2B84B04E30DCAFD0224170FA6D4BA9AD2A6DFA8ED73DFF9D5D40D43F02610032719A7C5646CCD453CEF409B4325F3FB6D9B9201FB115E4DFAA0B4D29959A44518774E94B2D4D6D06C7F065973BECD203F5CF6CB59F869340EC6BAF0121049DB3E1146234CEE4657C1B821AF817DA27BD4C9B1103C81F5B5161E6A9329D83D6E4DAE1F3299858CD201222D34A85E2991BDCF32E9771F3E701897F647D62729C9805CBF118C9FA727B056A7271A23181B92F033DE1EF113A856A884AD527B8DEB92085AF3DB509FDB0265FBA3376B31BF753DFA477DD5E247D939109F31CD430A692BCEC4D9FC7C5B4630CAB90C64B75496BC7CA54D5621FE3315AD03EBF1AFD6D436BD2DBCBE707B35F916CFC147BBB5B8AD2E80ABD692834E42E0724C8B901F5924212C4129F7451B9DD860A85855D1AC59F0B6B87A66B6A395DD81990AA3DEBF64C91CEA6862B5793BAFFF81677FA2928E950D94A6333B0E77A15AE461E710BE70AFCB9FE6E0C21C5AD188E439A6E5138A2C5AD17126E759D48491E3F3F93F81EEB77B7B3A6ADD96917CF0BEEA202EEA5ADB3D5593A3DC9FF1F8F05DBF5A2707EDBB6640EFF5B65A0003CCED2EB480942A13C1F1CCDF9994F1D11DBEF0D3BA7C3801AA508C17BCF287A928B635F475195D88ADF9F4C1CA7D3D1462DFD0F6939B89E5ED95F177BBB12253391876492BC01AFF1C1DAAF0A1C7821C2A4E33F52BADF51987E010B391FC984328E020206EE98E9C8E6763120055F99725E48356FD800E11CE973D00C800C353A5DF8B028E1E42F817C7433084C440E47532FC639172533DF35F0FF43257841C3E4EC7DD7F601EAA81E9886FA3253844C195A62F89FA5D292536BE8CACD80C94BBCD1A83C985936353C9233E512431A8863D7D8340E89307547BD10B16BF2C7E0BB01AB8093C70E4F4C8FD30608FA14FF072D81048391C07DDD82475A280D4EDF81F739AD1A13BC6483C3C37BF52ED52CE8D568AA81864ACABE225BC6467C79FBF43781F29B0C508E6825D4E56D25E45A8C0C6298765069FDCC66B2C5492FDDFFF69D6F5975FCD81041F30FFD7813BA3219B3139583EB588DDC57851E581FBD5E20127EBD -pk = 94DAA4DFA341BFBD62687428EC2741AE0899291D72A06927796E61EDB6DF9316D23F99F27723B8CF7D341617635B1A0160A4663FAF3F8D5B829E4984AC577907F2B5C180BC2F49C09FEF50BDD6F30A9B3D6819FF1611B4006EEFF115B72CCD02 -sk = 94DAA4DFA341BFBD62687428EC2741AE0899291D72A06927796E61EDB6DF9316D23F99F27723B8CF7D341617635B1A0160A4663FAF3F8D5B829E4984AC577907F2B5C180BC2F49C09FEF50BDD6F30A9B3D6819FF1611B4006EEFF115B72CCD0202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009D825B4C3AD2DC82C4B76990B1CBD962709683BC46261F16A67F9E5C76573317C7EBA264DB5A6410A273D49951124DF53634666422F8803846E14751AFB0DFBA771500000000000000008A7ECF0E797088185E22B3D0DFD8E75981AFC5AACE8D5CCD7CD3D22EE1BCE96201DA252794CB21FE2F5971745D6BF6CDB7693C83BF2E8CC8A4C46D3070525B9F907B14000000000000005A9139405E144B7396169A8583380B52F72466F61B5B980C0B88C55011E5634F324A7A13C5AAFA9BCF8793000000000000000000000000000000000000000000000000000000000000007D8FADAAAE74D0967DFDEE5096B85C5C4D1AC4094D5BBF1C89534A9AC57783AAF0961AEDB9C9A33CC2BEC1010000000000000000000000000000000000000000000000000000000000000464037CDD91C9CBABF777FA39D2773B3EB725E058CDC7E036D641DFC5B3641A4361512BD71B72EC63D97B67BF6D7903501B4894B3AB1361D3EDF5099D43336ED376139C96B9597036239A8D14C0269332CE5E3396149D1E85AB6D497140D50358BC6E21D26482D0392A10EC7468E66AFB0CDA3047E835B09C9626991DD72FBDDFD38ACE2F857477E49D10BD7C371F02359732D0EBB95E0F4E23932418D0451B73A2F2BB6D826041CA776211B5F72055B8A1226AB69FF83F6D2972C664E5EE00D7B947627327BEACBD11A9FB766A759EB8376758D3B81F4E189B12F486AC06267B9FCB4351520E57DEBAEFDF0CBAA5037C7A9A468A580D5581DEC9C23B02ABE57A28C80976881647BB101F7D8DDC2EC14C8EDE4CDBBD04E4E5E2A1323E0E4A01771DB50E9E57C7B850E712A56AA9DDF84339030FD6A79754C59B4CCB102409DA21790CEF49B1C49B5F02F0CCD742ED00F16FA1BF708EDAE18FBB31EEB3402731B14D3FF13F174109008F8537487F7CB6AC612249B946C03BDD72791B7E6C5601209033B1A9109C9A85C16FAE462F51A8676D08501EEFDA52C6A41C40416F502F83F26A3DD9265AC073B8E5F10EA29A0318D91B34D9DB298B9EA8986E05D4DC79BC497AAE04C43CCBBC585AE6ADB05127CD7E46180DAE1D09CE5C99A0BEC8AC0166819DBA1D9307BBC9805618757528B64BD1F21058A2F1EAF15A986205B8D1E4049B00737CCECF2758EB04185C4AB2036ED04B722142D18C10FF1B9B91EEBFFC63A5DDFB3DE7D7134F09C37DD31438197A1635FE49FCDFF02D77FD15830A2103172F0DFC06D4E9F4D61046F7B3C734115B1CB6F8EC457A1B8BA9B8FDEEA6864023465BCB33F1BFB3E4D1396BC3D5040137E9433FB2D4C6016EF1E749EBC9022F3E58D1973057429519703E6C6F9010B81503D5558D8E63395722B36992CEE101 -smlen = 3167 -sm = F69E599931054836A0C9857C01C3603DBCAC968C9F348180E101D5F8D3BBEDB3468E097167E2004F8C818E6820D3654CDBCABF014F9FFE4C65EF1A831FC4FFD6014F5036FDD19F799FFCAD70FD00BCBF49A178362C7037C4564C011817CCD62906B68614503DF7007D08573062750C8DE69EBCCE00F1396E0B70E1E2D3B29D114601D64A6122E63F7101B75C1D1000E610631FFEC59A3E32EDF62700980D70B42500A2D2977C39A5000F1E537E7AF46633AC1388E000F22C21DF78E98FF55C45871900048E2F8B152D7478D12FBD8E0100B36CC70E2D3AFB4CA5A54C2B5EC6053E4C80160BC869C509860A033CB9E3C07CF5E34D27398BAB00FF0F2304E4EC69D21035A9DC2C0C836254422C7D13F1120012FB9CC7CDAA1D8B72F6FA3943AA7DE75263D3DF814BBF2E80C3A204BC0F9AE33E4FA82CE893D35C57E41C7147602BE12455B00B7949A3195264A3281CECC3FDE34802B28C6E1F2B505AB6087D453BD6AA067B2370124840BCAC4605EE4F14EDFC4B4FF19A4D7A828E60156B49B4027AC18DCCD20294F89CCF03D0CF47BB2F22D3749EEE69EE17AB5D8E4DFCCF36824D23E3F95E959D0494FFBC712CE3975E3A661B3F9E149A0234F691C2D820000DE97CC016C43EFE958DA469F740610FD22B64D4BD2E30075E22BCFD4AB41D952D2394FC629F016EE1CD61AAB4581F62A7B8648F8F8CF02462C81023CBE2755C91195A5917FE5A8B5058ECB8DAFF91DD3F73FE38665666DBF79CF6F203FAF94A5CA3F3AFFAA2C2BD5F5DBC011DAF46FD7CEB74B5875E4B5D80B6EDB9817106B91865267E78731662218C8EDE73E588256FB1AD57232AA5533D25BFC54452612F0C2AECAE6DE19355E1D508B888D18FF9F6D7D68199755CF5C210172F65342269ED96C77D80AF8A244B43A99DEB49B97A6F358AADFCFF6AFF72AB39540D375165185F31E0F1A6F97722EE365620BC5D642F8CDC59F7E84FD8615F4A336ED340BE6ED8451997D87B7904C1B9A3A0BD1F8A01AFD6A2D9F5B995E3FD0D44DF8FBC8389B6CBB5537816C91F0EFC3D2349F15EEE747B254C5BBF9418BB979294423DD6DE4D13484408362582A86D082350CC79EBCDCC05B70110A038736034CE4F3DC1D17E5D11C9C7620D40730B61437906933193D1272F7C89C701D495ED682F1335B7E1C42C994E090A67D932A8E825F4B9EDA8F2A94B9A1F11F10E91396908A9D436DD01BAE1D1DE2C6ACF458C0880E3F81ADC2240A99E6083C9C188982713DB243028AB07DF407218CA6B3C4C93989AC96D92375834B915B724F2A105D6240E52B9D7003C67FF76F7A325D84ABBC229266BB40D1DC8784CE1A4A6BD17972CDB26C274B06337D525F61B5BF952D23FA13757460B7B8A3B99EB023831F4FBEF72D62931348622041FFD12634947579BC6E16BD1EAA8E8B2DFD54D74EFCED79EF4FF31AD42036DEBD0FDA3B7F3F8E7A3F45955F82936A67122CD42E38AF646CF565E294F422FAC1E7D274185896F58E9D0FA1FCD3F4D379ECF5B566586246216556939BDF86D6A417C3BF77C64F95D7DE8197EE25B44EEF00209D33159710DF001372C3E3D09F24B9B08B8938C522690674A7588933E1CA37D2C14DF50777806EF6FD2285771A44F6DE90475C6CC314DF140C3962DD9D70C54E58CC5FA3302D69C80C6511D9D42A51B7CB7FD7FEA8D8BD65A66FDB2AC80D945FB7EC72E138F5566CEB570968D84B60068DF20C6CDA2AD48372DC97424793FEA8D2136923070C25F47C3D10839D1747B613B93530968D5E97A3FC0F563BFFCDE7B42C839EFE66C3A8655D0CEB5AF7A37D23DBBB52D05CF6FCBFFA7C7491703349819AD94CE218912557D6C87937B2E7B0473856EC78713C29A02CF7B2B38E0DFE16804AF6C2BA8607026892138011E06B4AF179D63DBD97CB917B6507B798E58D74F485D3F063C044211E428FBFFD5AF2D7941900299602D3B15D5D600B435D9A21948B8D87A35205A3AF9AA9BA491D56573A93C35AF6683655E04A7A17F1B9709ED83E70D82A3DF59A2FB7C051ABE508601F322FFEC089C49DC666BA04366C038AD59D397022F0F6344255F4D98BBB17120441CC75107005A74DB35459C63770547A4AFE59F2703894DEB67612448BA7C4F6FEADC1717F6ACE410C6BE62AC319CD33AF285D17D55F500E364A0ABE71D357AE0802AF464B6D2732F3FB94BDB3BAA497F2E44727BDCCA5A4B65AE9DF189FF1AC640940FF4D479A8072D34ECC523DC8FC7C87FC89A540485AE7BB3F29B041446CA427C0B48CA7515A1E31788E8B53E1122D372B6557F8D2A97CDE893B20E60283954E2934AF340A358A4376DD0CFCBFE305A2CE7B72DCFE2DE105CF44833F548D1BCE88D34B60BD29B69309DD87F4B91DE10EBDD7D7F87D6231307D0AC784E0496DB725AB97656C34E60B34B230F37E30FE326296C4E1BB88C0BAC261DF0E5F45E6E126103EED6B1CA146D58140A8893D847E92D9F3A0A883E8BF830147CEDBDC7DD42C1A58A826A8A827F9AB26ECCF64F68E9CA6B68261260B659B47E0DEDBF5B077982B24ED9B36E8466DCB21EE69B5E2BCCC49A163B4860EC2CCBD65032776DAE601E18ECDAB8E35C2760D5758592F6CC074298A97FC5E82E7DA84036FD10E0725A0E4E58CC4DB30499ABEC0C7D95D88BAC2C58EB093312779BC1B8619FF2762FD1FF009273456D829394664C31FF6D7848B27174B36E59FB65D6BEF6D974D5038A28F49AD465B28857CC12BAAFFABF3652C2E22B46B040E579FB040A0FB4B1DAF0C157D35407C0B78E305CEEB232E7B7426C95639B1CF7B079E80521FAA538E51E69255576650C3A16E143D0F815D2CC89EB00AA13AF20394AA23CC6AA99A9F297D886AB9AF2655D53816E066A02CF21C277DADDEF3D7D0825D094FD8FBD5386139757EFD0B7F8501829725A4B70FF1DABF2958E07ED21DB76266A88483EE7C51A7D215E1B41D2464911ABBB1DC71F9613ED5446E4B0C97BDD47F22B372FB7662956FDCF3B108E0107F74301A054FB004925B041AF354C04C20FD370CE1A014EBEBD8311F3265A2F78B48124521A4AAE240D3BA9F94FD33CA4A92D24A029E0754831869B58F670435A44DCDD7BF75ED9FF06DBA52980DCE49C1C26BA0965DE3623F459E36127AC6AFAD4D5598FC45A95173D039CBBE2CDC7DAB2865FB6BC0FA8DFD33C4A826CFC77BB7F45CB5AA73377A27271AE41630DD3D4E2722581537FCFB233E5AF8F04CA824012B5C429EA498F4AD44AFC249DE2229FD7266FE84173A5CE44632B3650D6E1F278625D564B374C10C1AFA3F17432CBE4B65327C6B6E0CD2F99B68AB043C5C6C99D7FE7FCF940F4887D309D7BC0FFAA5DC4B90C79266514F46CA2D5477F2B84B04E30DCAFD0224170FA6D4BA9AD2A6DFA8ED73DFF9D5D40D43F02610032719A7C5646CCD453CEF409B4325F3FB6D9B9201FB115E4DFAA0B4D29959A44518774E94B2D4D6D06C7F065973BECD203F5CF6CB59F869340EC6BAF0121049DB3E1146234CEE4657C1B821AF817DA27BD4C9B1103C81F5B5161E6A9329D83D6E4DAE1F3299858CD201222D34A85E2991BDCF32E9771F3E701897F647D62729C9805CBF118C9FA727B056A7271A23181B92F033DE1EF113A856A884AD527B8DEB92085AF3DB509FDB0265FBA3376B31BF753DFA477DD5E247D939109F31CD430A692BCEC4D9FC7C5B4630CAB90C64B75496BC7CA54D5621FE3315AD03EBF1AFD6D436BD2DBCBE707B35F916CFC147BBB5B8AD2E80ABD692834E42E0724C8B901F5924212C4129F7451B9DD860A85855D1AC59F0B6B87A66B6A395DD81990AA3DEBF64C91CEA6862B5793BAFFF81677FA2928E950D94A6333B0E77A15AE461E710BE70AFCB9FE6E0C21C5AD188E439A6E5138A2C5AD17126E759D48491E3F3F93F81EEB77B7B3A6ADD96917CF0BEEA202EEA5ADB3D5593A3DC9FF1F8F05DBF5A2707EDBB6640EFF5B65A0003CCED2EB480942A13C1F1CCDF9994F1D11DBEF0D3BA7C3801AA508C17BCF287A928B635F475195D88ADF9F4C1CA7D3D1462DFD0F6939B89E5ED95F177BBB12253391876492BC01AFF1C1DAAF0A1C7821C2A4E33F52BADF51987E010B391FC984328E020206EE98E9C8E6763120055F99725E48356FD800E11CE973D00C800C353A5DF8B028E1E42F817C7433084C440E47532FC639172533DF35F0FF43257841C3E4EC7DD7F601EAA81E9886FA3253844C195A62F89FA5D292536BE8CACD80C94BBCD1A83C985936353C9233E512431A8863D7D8340E89307547BD10B16BF2C7E0BB01AB8093C70E4F4C8FD30608FA14FF072D81048391C07DDD82475A280D4EDF81F739AD1A13BC6483C3C37BF52ED52CE8D568AA81864ACABE225BC6467C79FBF43781F29B0C508E6825D4E56D25E45A8C0C6298765069FDCC66B2C5492FDDFFF69D6F5975FCD81041F30FFD7813BA3219B3139583EB588DDC57851E581FBD5E20127EBD - -count = 88 -seed = DEEE61A2FAC04E4D6B7A250124DFD91518D9B90A71FA02665E3088760BF69CB3CD7B6977F860A7026819D178623C9676 -mlen = 2937 -msg = BD2B4058218A15C008A4BBBA29592079583F684FEAD3E6B3F09ABFF0DBCA23670AE4496077D47945E5F1AC3CD4ADD5763581285D80DFB43BBA9C0730858293FF6A15915AB203FBE65C118B87EA37DFA1E06CBC0F24EBA3F43A8BE17FF1DAF4277CDA2CAE8AA924E852C9D60524B98306927746C4EB26DC9475E8A0D0F920F33E1AFF9D07EA5561E70865B2D8161B86FDD7638E7A72345DD72EE95BAE1EBD2C24D2A5510ABE3FC2CED397A067D215F6088D63FA63F2247427917E5C4FBA14F0A22A04FD0AC1D948507751F3523BE2B0A0CF2F96DC61F8187ADF646D6914667759D49A6DF9A327830EFFC9470CEC6C82EA127A8B0C6510203879FAAC4323145931E146D962846BB1A6E84CB2C31BC686E388C853413EA7D3EBF7C752C6AEC774637EE01F2817A5AF133928AF35F23FC3541FE7FA749A863A048EFED2F8CC2BA86520B97FDE0324C68D1DDDE1E430C30DED0B25664EA676AAC6B1F22925A40B319CAA37DD5DEDB99DE4D963630A6FB0E8B00AD8F2A2B9BCC497A00099A70A9DC190A2AB2A058930E63FD6DF342A625E9A095EE79137CAEB8885117C7A9FB8DF7A35D5A300D6F7EEE40578A7507EDC38A0D6522474E672F156FEDE7E1690C3BBDFF40342F1F3AD3C34325BCDBFF0A68249858C777551683A9F3AF225163C9323A4AD5E666E0A9F44C6496269038AAC5DC2767966C1560C5A09207406F3C47157D2FE5909346D8ACBFDDF3E3D19FE48B7C60E1C8CFB2EAAB19E736B2595D33A0AA034726CB6146A01EBF5CC72EB1182B9A4BCEF90A1AAF74079862CD775F8F773BCC490F6015B4D5469EE0BD95C1A32A1FBF283FCE1FBF6F8CDCFC1884F4D2A899F3E7A95414DE419D56462F502EE703CDBA007C3BB78F20243C35B882C90CB7DE3CAE3F0468079C546645977347BC183FB0A6CD24481391CBDF9372E2D6765B6CAF8EB0145BB269A47A1B4E2CDF9901D6AA284D919BA57163AB9929E715341BACD81F35BDBFF36D59A1EDABFF3CAD2C122386A6335348A3170337B94E4336B2B74E791981656CB5234A6F84DB4142D3F323000FA98BE61527F7548DAB6E83928E9DD2E461F08A5BB52F241BB42254E5746FCCE0F3620ABC69A6E275B5E06A333360F9B809562ED116AA6CC2334694AAA4169310ED6AF695678DE22D3E551DAF61C0A6C5F6C0F36FD3469A3B977F6D295E75ABB804A43E1E7AC4708208A94E8368DCA40856F1D43C9865D98F69F1C0BA9C8B33AC9CCD18D400D2559B1CDD82A0C875B5E136B97C02126C81A81EB5D1E421221564100450531DBD97BDA77C1B0186527ECF526CE6BCD0ADD5668382D984AF9277A21D40C06EB4BBBB0CCD6F64E90272FD632D47A388D301377EE745FBC9CB4C02E1F096DDF303BCA4E1FB4B6DF867676080CDFA6A29CEDD15003EE636DB8C74E7E293A087B1A5F62334585369D12D9876ED0F334C6711146643FD598F0D69BB3475D219D1F89066644897A9CC5630BC84C0CB5844087216038C8FB6750D0968D3D3E2D29D93639486C76DC045900AE1A13529E74BECEB3338684402BBC3EB36870E0B37584E9F309BFB0DD9B966F0BE1298DFE55D1A94A6767CAE5EB3120133B7D7B71C9F2A538A97F8548FB176B0E8923B14AF28AE26306214F1D392AE63C3736B9F9374CA10EBE93370C11BEBEB45D066477F374866C8A7208CE6DCEC404194BB1F833DE0AA4700CA29681FA0F72D98679DC3E1E142852347B01DAA08E5CBBFD242F7223600804E066FB5C98C8358370F5D390898FA44023A30F824F1C6A95B8E23308B4BE474D03E34CF72BE65F90D698DFE0D2828A797BBF8397EC87AB9EE00C76A1C7B3CED0100D3A1030136CAB9A69F05CBE58A4A56A9C700BC591B87783DE59369F2E62D5B885DA09F25835A6DC06F954C19B347724244FDA69E3356A4EF60F6A41CFF3BB7CB22ECB128415CD1B89A9AEC12B66F1EC23B14E7D7FD601EF7B000A0C96F386216F75710EB2C12817DABA1D1295E7535331CB90A9B0D8F7542E73DE2D93FE554063F57274DF27BFB39BC4B78B72A88473408086D8DF531E53B5BE018E076032D1F8EF86D7AFB8E8867B9D7728A25ACFB6856D83592CADA4494977678A9F4D134F49A8598A8E0F23D3B7A09B5308243410CA6F47E0BF8C43871600817460BDEB74E7D32C2FF7C40EA4BF924E795516FF7C7BC8E5FD5D64CC489F1894C6BCF0E9C312B1EE7E2BC68739372E7402E6AA2ECDCA39C18D7441F0FF373946559C475E37D4ADA64B98283E5A64BE7BC2D1A1C148D2CDB4EDA35F591D3A7E7CE15162F50FF1B025F87CBB82289FBE7F9C32DB8F23012CCCB87ACA7D758D42019B9A8C15F508CAC9284928F46F0DC1C1B6C6B4DA030DB9286FF8D3762EA4A83D096AE04F98E9416D3DAC59E04F9E4E4359AD76926BBD9570A3D5811F69A1C4345B646BD946D0168ED62A7A431D920D707D8CC7E840BB9CF13D8ABAE8196D9177E8C28CE0DD9EF647EAAF0D3C97E52CB31B560EA7067B45AEFB5EC2B7C7BDFA3996D1C7E467636BFA1BBE11D1CCF86B64ADE9FAF9287A23502E9FF711CA97D6CC09DE814A67BA6123A8E4E67CF6E8CB6F7B36621BC6192ECEE94D61860703AC8411B16E19644A6AB01813402629AF52301C9D76A94CEE22B1DCA49F13B130028991C8AB383C8461433383DA92AB34F1EBB4124B24C6C391EA44EE6E736BBC7A2D4660A878A600AE39B7DCCAA51ADBE90BD705EA51AD13C05E611749D43DE336D396352CB0673ABCE7473DECB0FC708EF28DCBE18C85EE0068FEF64685ACC3A7D0DA9A21DD0AFB10B95D81F6AE437022218B6094CE35D01248EA85A9EC6FB56A7A2A8453EB03E6CCBEA0F2EADB015D8BE3D09739EAC07AD9E3F17D13E5F71CADFA220ECAE90EA50BEA87B19CA6FC5DF31874D51723BECC80C8845C9EA718454D2817EF8AFD99B63090CBA6C8089AFA78770222FADEE3B3B829CF36A8153EFAF2CF28DC4651FF37A8921E402EF81A0F457FC1802AB06A759BF4071F082BFDC100AB612A4584B5AE19354854101AB0173D7D6A5A0637CCB58AE58978A8BEFD5A2C51D3D53150C336C0C0C2A27B442E2BCE120C4CCF8D97EA4584434A6F48C0245B63B2255BC52ADAD4EDA9279412D70BE457F7DCAC492FE53C06EDEED766B46EBC3419E6DA2A2847251F75C62A5FE7AE74F0DD5AF50A447DA6356DCC828C5F1A2C0C873E57041EB1158296C038B91F2E13D3D4B2887B284384A9ECB8BB378BB311F4ABB19E1B90EB3A399C03BFB4CCB29AAD80C55C1636559FC79A6C894B5BAD8D529BF680631541A45EB0E57BA5B458A05F456C60FBB593DAE90AE549416AF96642A486F10843482AFC3989BBD1E8E4DDF0791204F4B720ABD2D8995C87C8A388ECB14860CF83B7A4406FB6C8C9393475082D24E516C5F1AF91CEBA444D8E460D0695746BE057EA8D76F8C0C80358F3DB2AE5B996272737516EF5E4EF5A1FE5967304CB6D00090C9623D29F0D4BCE8CA3CBD54A30F9597E01E5845C1CDD8777E18C5D5D86492FDD0606F623D11A28DD9F02032E3A378C71B757B52021DCE6CEEC63792CEA24D6DD7150AC8FCFCA6554F7B08A5529D59628D0F35122504DD1542F6291BEDBEE09F81AA744A0F6C6DFCA6207FBFAB6B9E17E8A4040741F6508471E72D227D0FDC50C13F444310245AD17BF819FFBBC4E0485FA68CF1F0A4423F251538F25DA989ABCD008C803D368F626438432569F12D1612370E4C6C971079371081B37D8DF7EE709198AAA2FCBD443B96732AAA4E6924A461B60CA4F4CB13E88D539AAD709A3DB84D2D6D26671A9F3877125B7A358389BBEEA846A32E949DB9A7853DBC7D5ADD92729CE1B5C00680974F3DDC6A8235C7319B6CD1CE5E0B66FE7C2F1115206C42B4C02990D79EFA8BE94927543C19EE93D0EC8811F9330693696C878CFADAA2D56E877D42A3680AB2F6A576FDA7BF7957F781655CC664A0A4A0D16CE34D04D7C98A9E0C93D2E6D42870FE66864660B564ED4F881693D466BD68B6470AF03A5A6E703DBB40515AF5DCA7142C4C8D79F5BE4BB01A1B56BE9D0936396A7EED9A84DA86A4F00DCF676B4942D5DF6E1378EA26D9118A54E17FC623B83AADB417EC82F9AFCACEABBDCFE2F0B6AD4BC1601B4E24F547D61D1C1737ADBCB46D98287372C -pk = 06FDFD6A581CC61B0127DEB7DE51305056B8C6BDBC4B5E04B02F1E9EED271EDDA8D3A0A471F163691D3CCA33B9EB1302FF0D8B74F2ACC7C49F6FCDD4E74BE64FBF2B2A8FA921B3010BC1D8F37E83FB0D2E7D2456451AFB19FBFC99047E8BA401 -sk = 06FDFD6A581CC61B0127DEB7DE51305056B8C6BDBC4B5E04B02F1E9EED271EDDA8D3A0A471F163691D3CCA33B9EB1302FF0D8B74F2ACC7C49F6FCDD4E74BE64FBF2B2A8FA921B3010BC1D8F37E83FB0D2E7D2456451AFB19FBFC99047E8BA4010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DCF14A6DF49D3A2FBE2C7BD2B807EAF1DF608D3283DE20CA6A2D9EC703847DE77B7B25DA0FB529763AAABB10579817544FFBD5932E478F3A4C33B82B7A8578545F72F2FFFFFFFFFFFFFF01E9E83FE547670EFA77C26DD02F44A930E0BE8B0D0C73ED4FCA97E214226EC7AAA46A4F88D6734A2D1D6DC0DCB81EC84BE195F4E042C4DA75E68761DCADA4515FAAD2FFFFFFFFFFFFFF490A3D676E03794A592292B343ECF6378ECC53446D8CE7E00F65128217129E18DF39B5423152540FBC62CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58CA555386D28FDE1D7118E6AF43745FD148685FB263577B5413CAC4D9FFC9EDD7045A626A312F8C71C91B000000000000000000000000000000000000000000000000000000000000000D61B29802E69F3E8816B6CC41901EF0D567A554F2A8BBD6848C92B9B1FF3B1735126FEBF712C4B15C330B411D419A0196CCE8CE6655D4E00321F6F707AE79DD8B350BD2D355430CB615CF6C63086A9006C0487A5E00C6F6C3369A211911DD0256107C4373FB86FF4DCCAA5698B4BF97359AB73147DE20CE4F28F96AB567A8085AE05D0E9BF3CF41D3F25314EFD672003A3FC83C7A20454916B31D5BA67FC7540015D4A6DC14E7035201E1EB94BD6AFDB63494F6C076C130451AA93A85320202525CAE27AA9CDEA32C5181E90ABF980F932D5E4327ABA4365F6F6D45DEB53E98FC6748CCA851AD2E7DCB493B23868500DA71056AA1AEFE8D99655AB7AFD64BAC14691127C76E872C93FD17A4E88EFD6315CBC62E23E9B2FD67279AD70C8647007C9BA6E4CDBC69B6F24E2ED211F8F4F94BB6CC8B9087073B2C014F1949EF86EE1EECD621DBA48F89F91832119FE456032EFBC1ACC91CA98B2B2ED8EE10170C3B71C391B0B183EACA6B40F952202D540B33D02C2EECA548A944768E421AB6F501E4C9D5A76A5646FA712B304083D6284822BE38B84320286778D5E7A1A6AC1B6EC7813DA9455EA747101760DF29B1C4033E1EA0D7EDAD11960CBAAD483A48842D66AF6389CE7C2A23CF13CDC7713157DC09235D18B25D4333D3D6609E4C975C00FE0A5FB474231D3527576B2770ADCAECEEA5DD8258FFCFDD53764129BECB81ED9B2E59A1750C26BD7E1176C65B627D0176931C4D283EA8553BBE8D15A2828AED1919854A1A2F81E27F0BA4B1E037AE9AAD08871FA75EFC688BC624B60A6B7301DA7D8E8CD8E2C1DBAE8EECE7F610E622E2BBA944A31583A31ABB15072708D4865A808D1B99DB99E495E9506D15028F033C101C0C72F5E6730C34E9962A18C86728EC1AE28B368E82042BB0AF0B7AAA5AD908E11995893E5AF5400080D6C29501 -smlen = 3200 -sm = 548556A7CD9E61B80E4A89C8011C2D22B85ECCD0B6D8ECBEF4019C710CDEA96F5F434BDF32F9013CAA4327474DE2BCA116B0CA0123ACAE10F548E23E8820570500B60DD1661BFA209AE7D4F71F012527BBA0C788A17D196BD059014851D9E355C84A0AA3E03622014CBAC652375B84E707909CC5019340B0348258807ADFFBDC50016FECE26233588E73BB78C2DF008A117E30DB6B1A1F008F9D8900231772EC8B29E1A1B955B59B00554E14BA8B38CEAA83CCEB5000CBC329502D45F2FE7790816701DE906FCAD03B9EE58621B1A301011108CD452B8CCE8715C8A04AA76559B496F28E40B61260D3FB0103E4B9C331235193CBC5040F05013473137D3C422C1601B2CE82CE07BD2B4058218A15C008A4BBBA29592079583F684FEAD3E6B3F09ABFF0DBCA23670AE4496077D47945E5F1AC3CD4ADD5763581285D80DFB43BBA9C0730858293FF6A15915AB203FBE65C118B87EA37DFA1E06CBC0F24EBA3F43A8BE17FF1DAF4277CDA2CAE8AA924E852C9D60524B98306927746C4EB26DC9475E8A0D0F920F33E1AFF9D07EA5561E70865B2D8161B86FDD7638E7A72345DD72EE95BAE1EBD2C24D2A5510ABE3FC2CED397A067D215F6088D63FA63F2247427917E5C4FBA14F0A22A04FD0AC1D948507751F3523BE2B0A0CF2F96DC61F8187ADF646D6914667759D49A6DF9A327830EFFC9470CEC6C82EA127A8B0C6510203879FAAC4323145931E146D962846BB1A6E84CB2C31BC686E388C853413EA7D3EBF7C752C6AEC774637EE01F2817A5AF133928AF35F23FC3541FE7FA749A863A048EFED2F8CC2BA86520B97FDE0324C68D1DDDE1E430C30DED0B25664EA676AAC6B1F22925A40B319CAA37DD5DEDB99DE4D963630A6FB0E8B00AD8F2A2B9BCC497A00099A70A9DC190A2AB2A058930E63FD6DF342A625E9A095EE79137CAEB8885117C7A9FB8DF7A35D5A300D6F7EEE40578A7507EDC38A0D6522474E672F156FEDE7E1690C3BBDFF40342F1F3AD3C34325BCDBFF0A68249858C777551683A9F3AF225163C9323A4AD5E666E0A9F44C6496269038AAC5DC2767966C1560C5A09207406F3C47157D2FE5909346D8ACBFDDF3E3D19FE48B7C60E1C8CFB2EAAB19E736B2595D33A0AA034726CB6146A01EBF5CC72EB1182B9A4BCEF90A1AAF74079862CD775F8F773BCC490F6015B4D5469EE0BD95C1A32A1FBF283FCE1FBF6F8CDCFC1884F4D2A899F3E7A95414DE419D56462F502EE703CDBA007C3BB78F20243C35B882C90CB7DE3CAE3F0468079C546645977347BC183FB0A6CD24481391CBDF9372E2D6765B6CAF8EB0145BB269A47A1B4E2CDF9901D6AA284D919BA57163AB9929E715341BACD81F35BDBFF36D59A1EDABFF3CAD2C122386A6335348A3170337B94E4336B2B74E791981656CB5234A6F84DB4142D3F323000FA98BE61527F7548DAB6E83928E9DD2E461F08A5BB52F241BB42254E5746FCCE0F3620ABC69A6E275B5E06A333360F9B809562ED116AA6CC2334694AAA4169310ED6AF695678DE22D3E551DAF61C0A6C5F6C0F36FD3469A3B977F6D295E75ABB804A43E1E7AC4708208A94E8368DCA40856F1D43C9865D98F69F1C0BA9C8B33AC9CCD18D400D2559B1CDD82A0C875B5E136B97C02126C81A81EB5D1E421221564100450531DBD97BDA77C1B0186527ECF526CE6BCD0ADD5668382D984AF9277A21D40C06EB4BBBB0CCD6F64E90272FD632D47A388D301377EE745FBC9CB4C02E1F096DDF303BCA4E1FB4B6DF867676080CDFA6A29CEDD15003EE636DB8C74E7E293A087B1A5F62334585369D12D9876ED0F334C6711146643FD598F0D69BB3475D219D1F89066644897A9CC5630BC84C0CB5844087216038C8FB6750D0968D3D3E2D29D93639486C76DC045900AE1A13529E74BECEB3338684402BBC3EB36870E0B37584E9F309BFB0DD9B966F0BE1298DFE55D1A94A6767CAE5EB3120133B7D7B71C9F2A538A97F8548FB176B0E8923B14AF28AE26306214F1D392AE63C3736B9F9374CA10EBE93370C11BEBEB45D066477F374866C8A7208CE6DCEC404194BB1F833DE0AA4700CA29681FA0F72D98679DC3E1E142852347B01DAA08E5CBBFD242F7223600804E066FB5C98C8358370F5D390898FA44023A30F824F1C6A95B8E23308B4BE474D03E34CF72BE65F90D698DFE0D2828A797BBF8397EC87AB9EE00C76A1C7B3CED0100D3A1030136CAB9A69F05CBE58A4A56A9C700BC591B87783DE59369F2E62D5B885DA09F25835A6DC06F954C19B347724244FDA69E3356A4EF60F6A41CFF3BB7CB22ECB128415CD1B89A9AEC12B66F1EC23B14E7D7FD601EF7B000A0C96F386216F75710EB2C12817DABA1D1295E7535331CB90A9B0D8F7542E73DE2D93FE554063F57274DF27BFB39BC4B78B72A88473408086D8DF531E53B5BE018E076032D1F8EF86D7AFB8E8867B9D7728A25ACFB6856D83592CADA4494977678A9F4D134F49A8598A8E0F23D3B7A09B5308243410CA6F47E0BF8C43871600817460BDEB74E7D32C2FF7C40EA4BF924E795516FF7C7BC8E5FD5D64CC489F1894C6BCF0E9C312B1EE7E2BC68739372E7402E6AA2ECDCA39C18D7441F0FF373946559C475E37D4ADA64B98283E5A64BE7BC2D1A1C148D2CDB4EDA35F591D3A7E7CE15162F50FF1B025F87CBB82289FBE7F9C32DB8F23012CCCB87ACA7D758D42019B9A8C15F508CAC9284928F46F0DC1C1B6C6B4DA030DB9286FF8D3762EA4A83D096AE04F98E9416D3DAC59E04F9E4E4359AD76926BBD9570A3D5811F69A1C4345B646BD946D0168ED62A7A431D920D707D8CC7E840BB9CF13D8ABAE8196D9177E8C28CE0DD9EF647EAAF0D3C97E52CB31B560EA7067B45AEFB5EC2B7C7BDFA3996D1C7E467636BFA1BBE11D1CCF86B64ADE9FAF9287A23502E9FF711CA97D6CC09DE814A67BA6123A8E4E67CF6E8CB6F7B36621BC6192ECEE94D61860703AC8411B16E19644A6AB01813402629AF52301C9D76A94CEE22B1DCA49F13B130028991C8AB383C8461433383DA92AB34F1EBB4124B24C6C391EA44EE6E736BBC7A2D4660A878A600AE39B7DCCAA51ADBE90BD705EA51AD13C05E611749D43DE336D396352CB0673ABCE7473DECB0FC708EF28DCBE18C85EE0068FEF64685ACC3A7D0DA9A21DD0AFB10B95D81F6AE437022218B6094CE35D01248EA85A9EC6FB56A7A2A8453EB03E6CCBEA0F2EADB015D8BE3D09739EAC07AD9E3F17D13E5F71CADFA220ECAE90EA50BEA87B19CA6FC5DF31874D51723BECC80C8845C9EA718454D2817EF8AFD99B63090CBA6C8089AFA78770222FADEE3B3B829CF36A8153EFAF2CF28DC4651FF37A8921E402EF81A0F457FC1802AB06A759BF4071F082BFDC100AB612A4584B5AE19354854101AB0173D7D6A5A0637CCB58AE58978A8BEFD5A2C51D3D53150C336C0C0C2A27B442E2BCE120C4CCF8D97EA4584434A6F48C0245B63B2255BC52ADAD4EDA9279412D70BE457F7DCAC492FE53C06EDEED766B46EBC3419E6DA2A2847251F75C62A5FE7AE74F0DD5AF50A447DA6356DCC828C5F1A2C0C873E57041EB1158296C038B91F2E13D3D4B2887B284384A9ECB8BB378BB311F4ABB19E1B90EB3A399C03BFB4CCB29AAD80C55C1636559FC79A6C894B5BAD8D529BF680631541A45EB0E57BA5B458A05F456C60FBB593DAE90AE549416AF96642A486F10843482AFC3989BBD1E8E4DDF0791204F4B720ABD2D8995C87C8A388ECB14860CF83B7A4406FB6C8C9393475082D24E516C5F1AF91CEBA444D8E460D0695746BE057EA8D76F8C0C80358F3DB2AE5B996272737516EF5E4EF5A1FE5967304CB6D00090C9623D29F0D4BCE8CA3CBD54A30F9597E01E5845C1CDD8777E18C5D5D86492FDD0606F623D11A28DD9F02032E3A378C71B757B52021DCE6CEEC63792CEA24D6DD7150AC8FCFCA6554F7B08A5529D59628D0F35122504DD1542F6291BEDBEE09F81AA744A0F6C6DFCA6207FBFAB6B9E17E8A4040741F6508471E72D227D0FDC50C13F444310245AD17BF819FFBBC4E0485FA68CF1F0A4423F251538F25DA989ABCD008C803D368F626438432569F12D1612370E4C6C971079371081B37D8DF7EE709198AAA2FCBD443B96732AAA4E6924A461B60CA4F4CB13E88D539AAD709A3DB84D2D6D26671A9F3877125B7A358389BBEEA846A32E949DB9A7853DBC7D5ADD92729CE1B5C00680974F3DDC6A8235C7319B6CD1CE5E0B66FE7C2F1115206C42B4C02990D79EFA8BE94927543C19EE93D0EC8811F9330693696C878CFADAA2D56E877D42A3680AB2F6A576FDA7BF7957F781655CC664A0A4A0D16CE34D04D7C98A9E0C93D2E6D42870FE66864660B564ED4F881693D466BD68B6470AF03A5A6E703DBB40515AF5DCA7142C4C8D79F5BE4BB01A1B56BE9D0936396A7EED9A84DA86A4F00DCF676B4942D5DF6E1378EA26D9118A54E17FC623B83AADB417EC82F9AFCACEABBDCFE2F0B6AD4BC1601B4E24F547D61D1C1737ADBCB46D98287372C - -count = 89 -seed = DAB6C05E29342106CC34769BF419ADCC88010C05B57E673A503E63AE7A4EE55B72AB2CA86C4EF57FC8C02D2E0C8694A1 -mlen = 2970 -msg = 4D83349DD620DC2CC0E9ADA524B9BE9B195973A839A042F4342D69E6B38918507A9747FCDD8B751D7C75ABCE2B482B3313D4C74EA4E7A4A91F2E08A059536B651508307B7F4C3AFF5CF1579F90F32BA1E847778673E3956713C14661AFA2D11CCF61FD8F9BC914D4B6E6D09C52AFF7FEFAE325C180147153C9AE1924C9A2B8DE4900BFBBC6797558B000C5ADB9A8DC4CAFB458AD328F19A2C55D5434BBFA7BE5057E56511529709992BD6527E913B46ABE38DBFF90D4AB3C024A66FC0F8FB34AFB96E22535A0EA8F313A087AA65355D7D5989C486E103FD526A7A6D812C0E4D8C081BCCE4DCFBC64B68436739451BE0C4B67BFCA71BE955BA9F9A23C223C7D0FFB1B2196C9C9845B6AF341A363951E2008BDC4F3296DD0E1E3F480F2E4B0EC77A002ECCFDABCC58D24CB0BAA26EACE96DECAA0F6BF1CDE0175AFA65AD5C23C5E71B50DF778208EDBE426AA6E876C12440D7C4FCCB42D039A14509092784BAAD37D9B8EDF186CD4FCB3D9F8B0397E951777D602B8AF613060FDAB6B358302B3FD28437A06694F36CE12A035F09D677E48D077CEFD1676D8FE51541BC19E3A6D6A5D879C4F9EB4713B7C0F3A652F3A05D74DABFF79A302FDAF147531FDD57924F49E52B298219B03D6DF166B481F232FC85C7CF52838969CED2DCFC18DD8C95891C498FB49289D1A982922A0FC02C849AC3BB7FA92CF43A64464D5BD919F75ADA287FE657BF61DC07B3808C0FD0D71EA24DE5353268B2C17C989C29465BA49111CC479F51A8CC623CFB6FF68149E52C77A7D85B5ECCE66C05900AB9957BC7ED39E03649A103B5B6BFEEB168B7C1F30DCA84AEA509FEC2B215DD95558A2708839396552F517A8FDA28C3ED61F84E1B2E0DCDFA708DE50D44BFC65BD4E70260C437C8B5B7158EC7E2301D9C7AAA68E0ADEF89FDB601711AD2998379145B29CE3681B513DC3BA9B2EB668C1B53697833670466E21E767361C0A4362E5B8DDC38EE6A9C4DC5205EB808B93C72FFAFB635B4254E4F4496BACC753C8ED0BCAA88DB683CE77C8165E8DDDE665392CCCD57BC07573D83CB3AA10648281EFB08F92AACD8AB6F9B5D7FC66D29526BD57E421220FFE375B26C61A0DDBD9807022EB3B4B681A43E7719F5EC255C1E19AE6C542D6DEEF3B94B6960C18D0D7C8110B88F995826073B874042FAF97F1FF034B8257418CA269F5CA588223393B0179F9817E08E7212D0D410EA259EA66BC4A00E7FB1190A732BFDBF7ADEA0E4550BE90C3E37BF33BAF436955742A2632AEDE259235702EA2E079D99A22C9755ED34C1E3CCBE746E728A932B1852F692B103112B303033AD3CE1172AA066860DF570D21EBBA51FAB72D5AFC4AE8995F532AE384CCCC3C4A295AF76A803FE076CCC920A80D82A9B614760EC43208579EF5DEE164356D62EA33953E55195EEE9B2E2018E6FD9D19A9F49258702DBAF6EDBFD093919917B1B6734F012E2BEB4F758DD481FB8A8D7796E755C6647501E28862B9F5B16FFA1C5D80DCB07141806FC348881A5A8891BB632A4AE4292A102D71504D0FC12C79D15BCD0799D30C7B9E72625A7DF7DBC7ECF9EACC627CA9AE5D71E264F2F2A9D5DB8593F3A90F3915CE480ADF800C99FC2C8692F2B57B492BF9D84171F8C29AF8D5549F82D3730927096CA18FF0B0C0C0B8B800508C44D5749B92D7D48F7FBD5C86E408ECE0EAE639AF475073DF5CA2CD5083BC4FF8852DDF5C399946A6B21B0841D137F583E0DDA3A6046F082872B783ECA3E14B21A2AF61BB150847026F2371812B1A2BE72024226F4613DA860AC2FFC578DCB171DC27B896EEFE49F885F9BE4CC8766F37038E01CF20DBB661F507B2ECF2B023203A6259B0A018FC00B2CA9B3107B605F04388D5493AE7CC4BDD093CE761A92847C2A167739E0750B427B2ACEB3ABC5FF751A5F32D36B589787D4DA509C85EAD751353AB2C68A9C14B8B2C8166AEB6F27C7F101221C306AAC74AAB6B4E795525FE12038725D7AF3D2A6D60E1EA85F2B94EA24F1B72FED9DDAD4C8E5DA484E80A2150DE22E6ADEF41153D7B4331E8F011A3CD48DAB02876B067312D0DC736E465F99AC3C9C56321507E79ACCF652E3857C749AD92DAD15350A6B4B67229A3905DB18AB2053E2D4F92F156A1D76D0AA891364002C991E632B53FA217AAC1709F37F3402F43B0753361EB2F595F9FAE3D7D96FF050DCA0B9657F4C3AB49EBDBFE8816051C4E0AFF32C5137749D53B062CB61F7201171B5DD716E9CCB38D00E50955596845DFF602200B30D375A854CA4E9A7276CA1A1D9EE92A04BCD78854BE251F7080ABA6D8325D40B37054596AD80211A50AFCC1DBC177600A70E648D8BEB4FCB8919214894CDDAA6D63B6F6C445469A6866721D4BF1117F25DFF9D65FC8FBE5B0ACC8B9039C7F94B2A5CC6068A0489E2E13A731DBE1094FA8558A601ADDB9E4DAB04FA744CD5B95A9D57C52C8124AD950A5944DEE2C55E5C8540DBEE5823DAA624F57FD5BE994BAB3AD4E74EA9443F8B6024BD6B49ADF3972442D88E61E04FE8478FF28916584CCB65FB15686991D5781CB7EDA067745258EA671E0A2665F94FEA1B5490669D1EE8711518BB911094957586C8075E3BBEDC47BE059053A7658ADFA0ACEABDD46E0DD9647B34EBA32E56B6305653ED386C50E79E15084F00F003B1D12504FDD8E47D03D9F7572276047BD22B82B8E81F87C86E6F20D2A756B16F291179A97B010F993C0F839C9A1238CFC9BDE8074405CF1B35DF423C7566CE965681F21C969E4F3F8FDCA72A18D5DAA80287F53B5F8429FEA81612CF63CCF1B7A13512DB4D1DD2678FE1189398032EAEB4368332972C728AD726B7290302C3C5ACAB6E73432E825B9046F846ADCA9D93780A36095AA5C51E354CC6E9A910CABBE59130E98F4ACB3CB6D4EFDA9E2F78748ED58465937FC81C548AD038FDC32AEC46B078CC5A7207658A9706F1C9653359DE6C4457DBFA71D300F98F9BC5DAA14DBDD5EF20DCEDE7E9D3F7DA5C932AC3338BA40E46B17D89FE38F725129991983D4A81321B394F2D7B20D66E3DEAAEB6FEFC8CFF0B68A766E27CCFBA66DEDDB1F541DEB3C1892ED2AD5D073162F0DD06B82E8878477BC96E03101C9B5D9D0ADA10EC060B45E144B31E6B4DE283FD43538B47178398FDD15B01ED421EE2C65847F7A4E9AECE2F1D13971FFC0157040782AD4B591DEA0906370820DDE1000490AB1C27C03D02A0F4B4BFAB0E56D7257288441CEA63175CD6BD11382E6C873154332E627CE82E37C63889EFBD8537AC35C21AD7A09C986CFEBF13B19D5677C1104B373F3B55198D075AAC608145FF9D0C4C12C83BB41036AB32227629EEB4922F172281A66C23C35B8A3E92DE0A10D5E8C18B9A54D6C30230F3A8263986AC535B6BF63EDDAF6A02C9100B712EC4BD49851A22AF0E647F259C2E19B9ACAEB6147C476C90745A353F6252ADE8212A9F7C215C0B3053BF2B4E0AD225E8B344EC14C1B839877349C3743E8337D9C1EB128B06939C5A08F60A46FA700723EB6652FC26440D9BDA3C99C10AD0742C2F039BE6B66749B77E14F8223509365053E87ED870FE3906A16DA6C62945DD2112C96A23942B1E14431AECA7DFCE3FD4D6633E0B661FB34B0BF05C4D21E689CAC9B6ABD9F507F08E4AAB94BBEF1C629C0E1CF344E66D3A3E100B615BF762DFF0CEFC5E4CCE0DD908F46C94E7411A151E713FE0C18ED33C4C03E55E12C0AC366DA5C757C7090E0F94E2C34D93EA3B226ADB2979D23E071F18C2EFF33BCF41BAAF52F4B44E38675DDDEC89C7BFE858BFD1AE70D96D0487972D70F8D8681982656FF734BB6323AA91EA14C6330C71783D235D9F094CB111ABC4990319BBF163891535AA5F870164DA65FFF395DB68B390084D4F2448B98CD56103E49CAAEB6CD040C3ABA8290284E9B2BC423117F4104D89B1B1607C6D34AC30AA9E79D8753B97CAE90ECADA6CAFC6100D3D6D91E20393E0DC95B981FE0EDBCF88E046F74184A96705AC226FD26089468E432D525643293BDA781B64BACBDFD6C7301AC42AED7DBBCE7ABB9D67AF315BCC3509CF03523FC887E27EDCBD7C74DADFD0F126CDB49E28ECAD38080F18A775E6D824C18359935D921744EA72FE293F299B530D9DC9285EF174EE60E2DDFFCCFFE89960BABA90D955CD2C96672513C758142D29A1AD79CA9291BC6782B64717F11A71E6D65A1A71D -pk = 298EB6B3A76080CA040E723912BF691D65A8D5C22DD6268B62BA7670117E8B0C8C1A636904AA11B6183357B5AEF034004C44756F9FCCB76D9DC8ED0B833A48E5F5B5F14E0B35DE061B0BBFB22C72F9FB4DFADD422380CC9AC991E1AAEF968000 -sk = 298EB6B3A76080CA040E723912BF691D65A8D5C22DD6268B62BA7670117E8B0C8C1A636904AA11B6183357B5AEF034004C44756F9FCCB76D9DC8ED0B833A48E5F5B5F14E0B35DE061B0BBFB22C72F9FB4DFADD422380CC9AC991E1AAEF968000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023F43E01E6B443F188E309485C81F4D54BDBB6DEF0CBDA64E911BE7ED39BC63F9881BE65B92BBD7CA1D905C4DDD66B3C6F51F86BC3964C617D04D35CE3A3BF391886E9FFFFFFFFFFFFFFFEBA23B6AE25F0C17BA42E906704F59F45C485453EC42124428B78E931FBCCF73C84571FC7FA9A339F289BAC11D41D3140B20F3395F3BA8CF60EC742DD789C49297214000000000000001A8ADB57D5DE2142C03968844567DC9EBB717050993C0E83324F01F42B5875C5123F0CF4F08E9960B3CFFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCDD5AF05BFA9D6BEE024982DDF239DD3FDEEEB159257B3D1DCFE1FB48F3E39E7550E0933B0FCE15F09C396000000000000000000000000000000000000000000000000000000000000000F95B38D02D4C80D2265A8E2E58B5127A5DF45D44F8A2073F160DCA8D017C1D4F8D7FC5087CDEB6D8A02593F55B2C600E23ECDF8292B9777FEBEC48C9672EAE6C554390FFAB52E9793B783871E1A69711174A8CD64DB7BCA9BA4D09A176BC502302DC612718436B13C0BB653E976679D92478EE3774A537CA70147EC670A938CCED71D975D50041EA946E8E1A964FB025094B25C18F477E2D683399547091D420AB62B77D6BA7074270D2DDB595371D4E8A197FFD95B07747D463F1006787C03D5E9A7CFFE878595AE548FAB14070D78BB00AC252C5122A65D44EDF3FDCFF4F2446782F6C27C4A308CA05BD3B1DCFC0241D8ED890F1CAD6DB49A526422DB95104EA9ECFD7D32C5C90C577E013D363A4C9802294AF97EBDFA3840E29FE87CA8036E904B8011F2F481F194B1680C02CBCB20F40E3C3C48F2E1AFA805E35A3315012362F9B8C48CDE495FDDFBDC5DBE1801A59892AC585ED72E97FD1E076202D83F8F0670C884EB38E2BC62DD0657EB13547FC24E4EEBE47864AAADC284EF879C011F8122CBAECAD0E6D445A72B7857CAD2BCA2A9BA715F0C1DE685B14F72A8B541F7EA7062D7B7106F82CE0EB0F849410387DB6DFCC8A839E18DFEF4642772E5F5C825334A56C2DB88B3D37E0239EDF8F651E5FB3C28676A00E30D56469377420348A00081681E8CA4D0C09C87016014CD82667E13CF1D23D32D4BD9BA7C08868B4DBD7FAD8ECD1AD9EABDE82FF039D200FD7CECE4540FD609BC1884427ED13C52B3C27F08B50795350EEC054DFC89750CCD3AF9204DBE2001099D156ECF5F170247FDEA65F69D2F3580CA6EC3EE9F294BDCB288EE41ED7116122C00CDACD7FAC52940F462BB5823CD8DA3A2AC711B4801CE7B5AC1F07032ACA6E00534015DB3B94B123FBC915652FC0E14B4B2189658849A24C9FF068ABF6FEB2067CA9A032F02 -smlen = 3233 -sm = D821BB2570D729ABD5685BAB00B2BCBD426BB5748674522FC800C318C2458D16EF59E8AF410601762204A13AF0A350C2C59240004CC12656A2BD3C69DFBE45CB016039B13A38E2B4BD01039D0000DD01EC00175E48CA634E86CB00E8B9377C9FC547F0281E2C6A010C60F9B67D38E4E79B0E7452000DB2D283AAEE122B1ABDB6CD0111292B182A1122162B8C74B500AFF2D6685D0E9FE4F524D4130198DF37BE55B59BD0CBCF6C12019146CBD4ED7D3183CAAF5DB201ABE6C5EE9AE83F5CCC5221AF0173E436B2823534C1E916832F01013D2A15F3B17043F206921CD9891C51E437094073DD279F98FD1102F87C1678238774C438F785C101017A08F3A6E991D45C14F850920D4D83349DD620DC2CC0E9ADA524B9BE9B195973A839A042F4342D69E6B38918507A9747FCDD8B751D7C75ABCE2B482B3313D4C74EA4E7A4A91F2E08A059536B651508307B7F4C3AFF5CF1579F90F32BA1E847778673E3956713C14661AFA2D11CCF61FD8F9BC914D4B6E6D09C52AFF7FEFAE325C180147153C9AE1924C9A2B8DE4900BFBBC6797558B000C5ADB9A8DC4CAFB458AD328F19A2C55D5434BBFA7BE5057E56511529709992BD6527E913B46ABE38DBFF90D4AB3C024A66FC0F8FB34AFB96E22535A0EA8F313A087AA65355D7D5989C486E103FD526A7A6D812C0E4D8C081BCCE4DCFBC64B68436739451BE0C4B67BFCA71BE955BA9F9A23C223C7D0FFB1B2196C9C9845B6AF341A363951E2008BDC4F3296DD0E1E3F480F2E4B0EC77A002ECCFDABCC58D24CB0BAA26EACE96DECAA0F6BF1CDE0175AFA65AD5C23C5E71B50DF778208EDBE426AA6E876C12440D7C4FCCB42D039A14509092784BAAD37D9B8EDF186CD4FCB3D9F8B0397E951777D602B8AF613060FDAB6B358302B3FD28437A06694F36CE12A035F09D677E48D077CEFD1676D8FE51541BC19E3A6D6A5D879C4F9EB4713B7C0F3A652F3A05D74DABFF79A302FDAF147531FDD57924F49E52B298219B03D6DF166B481F232FC85C7CF52838969CED2DCFC18DD8C95891C498FB49289D1A982922A0FC02C849AC3BB7FA92CF43A64464D5BD919F75ADA287FE657BF61DC07B3808C0FD0D71EA24DE5353268B2C17C989C29465BA49111CC479F51A8CC623CFB6FF68149E52C77A7D85B5ECCE66C05900AB9957BC7ED39E03649A103B5B6BFEEB168B7C1F30DCA84AEA509FEC2B215DD95558A2708839396552F517A8FDA28C3ED61F84E1B2E0DCDFA708DE50D44BFC65BD4E70260C437C8B5B7158EC7E2301D9C7AAA68E0ADEF89FDB601711AD2998379145B29CE3681B513DC3BA9B2EB668C1B53697833670466E21E767361C0A4362E5B8DDC38EE6A9C4DC5205EB808B93C72FFAFB635B4254E4F4496BACC753C8ED0BCAA88DB683CE77C8165E8DDDE665392CCCD57BC07573D83CB3AA10648281EFB08F92AACD8AB6F9B5D7FC66D29526BD57E421220FFE375B26C61A0DDBD9807022EB3B4B681A43E7719F5EC255C1E19AE6C542D6DEEF3B94B6960C18D0D7C8110B88F995826073B874042FAF97F1FF034B8257418CA269F5CA588223393B0179F9817E08E7212D0D410EA259EA66BC4A00E7FB1190A732BFDBF7ADEA0E4550BE90C3E37BF33BAF436955742A2632AEDE259235702EA2E079D99A22C9755ED34C1E3CCBE746E728A932B1852F692B103112B303033AD3CE1172AA066860DF570D21EBBA51FAB72D5AFC4AE8995F532AE384CCCC3C4A295AF76A803FE076CCC920A80D82A9B614760EC43208579EF5DEE164356D62EA33953E55195EEE9B2E2018E6FD9D19A9F49258702DBAF6EDBFD093919917B1B6734F012E2BEB4F758DD481FB8A8D7796E755C6647501E28862B9F5B16FFA1C5D80DCB07141806FC348881A5A8891BB632A4AE4292A102D71504D0FC12C79D15BCD0799D30C7B9E72625A7DF7DBC7ECF9EACC627CA9AE5D71E264F2F2A9D5DB8593F3A90F3915CE480ADF800C99FC2C8692F2B57B492BF9D84171F8C29AF8D5549F82D3730927096CA18FF0B0C0C0B8B800508C44D5749B92D7D48F7FBD5C86E408ECE0EAE639AF475073DF5CA2CD5083BC4FF8852DDF5C399946A6B21B0841D137F583E0DDA3A6046F082872B783ECA3E14B21A2AF61BB150847026F2371812B1A2BE72024226F4613DA860AC2FFC578DCB171DC27B896EEFE49F885F9BE4CC8766F37038E01CF20DBB661F507B2ECF2B023203A6259B0A018FC00B2CA9B3107B605F04388D5493AE7CC4BDD093CE761A92847C2A167739E0750B427B2ACEB3ABC5FF751A5F32D36B589787D4DA509C85EAD751353AB2C68A9C14B8B2C8166AEB6F27C7F101221C306AAC74AAB6B4E795525FE12038725D7AF3D2A6D60E1EA85F2B94EA24F1B72FED9DDAD4C8E5DA484E80A2150DE22E6ADEF41153D7B4331E8F011A3CD48DAB02876B067312D0DC736E465F99AC3C9C56321507E79ACCF652E3857C749AD92DAD15350A6B4B67229A3905DB18AB2053E2D4F92F156A1D76D0AA891364002C991E632B53FA217AAC1709F37F3402F43B0753361EB2F595F9FAE3D7D96FF050DCA0B9657F4C3AB49EBDBFE8816051C4E0AFF32C5137749D53B062CB61F7201171B5DD716E9CCB38D00E50955596845DFF602200B30D375A854CA4E9A7276CA1A1D9EE92A04BCD78854BE251F7080ABA6D8325D40B37054596AD80211A50AFCC1DBC177600A70E648D8BEB4FCB8919214894CDDAA6D63B6F6C445469A6866721D4BF1117F25DFF9D65FC8FBE5B0ACC8B9039C7F94B2A5CC6068A0489E2E13A731DBE1094FA8558A601ADDB9E4DAB04FA744CD5B95A9D57C52C8124AD950A5944DEE2C55E5C8540DBEE5823DAA624F57FD5BE994BAB3AD4E74EA9443F8B6024BD6B49ADF3972442D88E61E04FE8478FF28916584CCB65FB15686991D5781CB7EDA067745258EA671E0A2665F94FEA1B5490669D1EE8711518BB911094957586C8075E3BBEDC47BE059053A7658ADFA0ACEABDD46E0DD9647B34EBA32E56B6305653ED386C50E79E15084F00F003B1D12504FDD8E47D03D9F7572276047BD22B82B8E81F87C86E6F20D2A756B16F291179A97B010F993C0F839C9A1238CFC9BDE8074405CF1B35DF423C7566CE965681F21C969E4F3F8FDCA72A18D5DAA80287F53B5F8429FEA81612CF63CCF1B7A13512DB4D1DD2678FE1189398032EAEB4368332972C728AD726B7290302C3C5ACAB6E73432E825B9046F846ADCA9D93780A36095AA5C51E354CC6E9A910CABBE59130E98F4ACB3CB6D4EFDA9E2F78748ED58465937FC81C548AD038FDC32AEC46B078CC5A7207658A9706F1C9653359DE6C4457DBFA71D300F98F9BC5DAA14DBDD5EF20DCEDE7E9D3F7DA5C932AC3338BA40E46B17D89FE38F725129991983D4A81321B394F2D7B20D66E3DEAAEB6FEFC8CFF0B68A766E27CCFBA66DEDDB1F541DEB3C1892ED2AD5D073162F0DD06B82E8878477BC96E03101C9B5D9D0ADA10EC060B45E144B31E6B4DE283FD43538B47178398FDD15B01ED421EE2C65847F7A4E9AECE2F1D13971FFC0157040782AD4B591DEA0906370820DDE1000490AB1C27C03D02A0F4B4BFAB0E56D7257288441CEA63175CD6BD11382E6C873154332E627CE82E37C63889EFBD8537AC35C21AD7A09C986CFEBF13B19D5677C1104B373F3B55198D075AAC608145FF9D0C4C12C83BB41036AB32227629EEB4922F172281A66C23C35B8A3E92DE0A10D5E8C18B9A54D6C30230F3A8263986AC535B6BF63EDDAF6A02C9100B712EC4BD49851A22AF0E647F259C2E19B9ACAEB6147C476C90745A353F6252ADE8212A9F7C215C0B3053BF2B4E0AD225E8B344EC14C1B839877349C3743E8337D9C1EB128B06939C5A08F60A46FA700723EB6652FC26440D9BDA3C99C10AD0742C2F039BE6B66749B77E14F8223509365053E87ED870FE3906A16DA6C62945DD2112C96A23942B1E14431AECA7DFCE3FD4D6633E0B661FB34B0BF05C4D21E689CAC9B6ABD9F507F08E4AAB94BBEF1C629C0E1CF344E66D3A3E100B615BF762DFF0CEFC5E4CCE0DD908F46C94E7411A151E713FE0C18ED33C4C03E55E12C0AC366DA5C757C7090E0F94E2C34D93EA3B226ADB2979D23E071F18C2EFF33BCF41BAAF52F4B44E38675DDDEC89C7BFE858BFD1AE70D96D0487972D70F8D8681982656FF734BB6323AA91EA14C6330C71783D235D9F094CB111ABC4990319BBF163891535AA5F870164DA65FFF395DB68B390084D4F2448B98CD56103E49CAAEB6CD040C3ABA8290284E9B2BC423117F4104D89B1B1607C6D34AC30AA9E79D8753B97CAE90ECADA6CAFC6100D3D6D91E20393E0DC95B981FE0EDBCF88E046F74184A96705AC226FD26089468E432D525643293BDA781B64BACBDFD6C7301AC42AED7DBBCE7ABB9D67AF315BCC3509CF03523FC887E27EDCBD7C74DADFD0F126CDB49E28ECAD38080F18A775E6D824C18359935D921744EA72FE293F299B530D9DC9285EF174EE60E2DDFFCCFFE89960BABA90D955CD2C96672513C758142D29A1AD79CA9291BC6782B64717F11A71E6D65A1A71D - -count = 90 -seed = 0CAF47BD9AABD7D09FFAD404449BBAB2E1D48E80AC78550831A365BED8765420DBBE9A566EFDF20D4E5233D7848582E4 -mlen = 3003 -msg = E0F434DFA04EC225FF6B6DB802A047E221BC064E5BE89A5FC13937AE9D3F22B4439BB1C1BBA01547A64AB3E810BBB09706D01959E2E906A69FFDDF0C56726BDB58FB039D66AC5D77C7F0E9A8617B0C69176770DA328D38171F39B5220279186250139922C0DD0F7C3F96D48615FC66DB7568810931D257B230258FFE9CB35F87859E08139EBF7432E948EE3F962BB9015CACB8499BC69597ABAE4B841B606657E2E3C51FF5A8961AD42177A9E73950E3FA150439E2063B6555624A6D8E3AF4FD5710FBE722B8C6267BA5DF56846A085C56444573D692D5412CB70E443761751E58C41953BB9FAA3CE1F4564C825A02F0E1339CD659AB1480804DD2E90E3086AAA292DB39C6E2AAF1B001B47A21CC721C0C502C46EF0479BB7D8CBDF8E9C136397FEBC2D83C0FDBB3ED4FA6868068477206A26D2B7E0D20507AECB2756B888FCF5B446217DE14EE6A20CF7E7B732FAB22CA3ABBE81B2BE18463ACAA3132773ACD7476460536111CDCAC98B1CC9B2C36AEB3FB318340F7397B4B4AD6AA87EAC94AB7D98CC12EA5606162877465FA2CAD276CBB5D36C40A0B014C53D2D3A96825E237342DFEFAA6B9456B5FF1DCA859C5976F77C3D3CBC9DF355237EE9B4B4C90A9DD941294431DB76DBB539DC48669E7AAD21808332C8A4FE98B8F043FB756B526890452FA3C3527FCD584CD33E38FF9FF783538D39A184B7B3EB649E1C04C289FB65998F6CF5D5BBB0609FC3403D85C6DF269017032CD24AC540E1B294BDD3C3A0C7117CAB02B1A0063A174FF26FCDA687433A667322320C0DEC1EA3963F3B14375882B3478AED43C2C74DEBFE3A734F8B1A5CF92007F8FB627CC3AAD5C6AE4C31846B72E7573041270FF40E762C0F8DBCEB7512D44DC260A97D5CA7D60699981ED8476D8651C35C8ED498FC2961D1E38AF46F3653630773209A63838A9222B813C23DB0CF4196D6654126BA2B1840A7180E653B3D6E10C4C7AC3CEE93B0399D918A52E59F0215B09A119E634E6E8A9886C877F157BF7B7DD827ADEDBAF03C718AE037C0B262588171839E952721DE72180F8EED00B01F53E098B82165199C53129576036FC753A3D33AEC92060DD19AA078A496A2B214B1BFBB747A1EC64071B0A078D74D0212E6203C9698C7449326A42BCBBE8D9501DB916C64307D5F1083BCC36C0FFA18C0E4410B0B17D443481C3673D17BBD7A366A5FD1C3C5B3391A02EDA7596B4F869A91A32B5A02A05611371231BE035EDC716F534724B5225E1A72A2B2CD357F4C326F1DEE963FAB680721D40DD70B750A019E70885515F43946A0DD3DD042969139F61ECA0E9EE3107D3D28AC606AD53F236303E1FE986C38825318B7C4597B14E1A83B81295FEF49FD0F2C1E14A0B146540D853DB9706CD224B376343317BF7330B0C2721A409B856304FFFE60C24C441D5E2797D4696C0FE046D305AEE93CC6A2D89A81EB19643636A8B424B310034612105DF16516CE9607CC0A2BAC5835642C6FF9572191BC45E44D9B40DA36B607F570AE8C39D490342786F31CE6764F3F7A764665B6CB93E54922C6D89DB566F494E0EE069811AC82E8132F2F388D68490CB1C2172D2979FCE3659D7076B4F457232EB839172963F8C342E2CD18969F086F451D33BB774F3D00E6FA2BE02292F2E5CAD3ADF5DEC28932BD784801E69364962BF39E25455303E1F289052D2F0CD4964E0FFCDE29E7C074E5D57E43739DFA42AAD636C352D363E3A23BDD134BAABC7CD1621CA638DED7DB7051F0456641CA872ECDB4D3C2603DDBBCE16637010E782C4BD5230992E2EE7DD904F8A83EBAA7B4C3CEE15B10794ACE894118304BCDA9E9B1376331D2248B802557AABCF913E95F783715BB5E90A4436E4BDE7D651397A70A24257C39E0516BB1F548DA36C1F1F92A416DC1114107CD863F3BFCB360286E774B21296259756EA6040CB61738EEFE29A67895AC69797C640E03F0E9E731647C2DA93373920341FDFBD50EB6B737BB0D9FDA8EC8784920407D4F41486D8FC616430768D6431CCD789DEFF332B239FFD1900800CEDD9661A55D6D96089007E9089A117F03D7858EB4C3FE2D07E91D8CAB88D2BA5421846069FA6D4E5C9161A140CC3A288100BFBE61C3B0F0E820AB12D8FC54B054A0F4C777052495B45A7D1A883E67663DCF50C2230CA5319AB31CD76435DAE41CE1EE25ECD3FA0C7E83B0168852B2CAB674127CD7BC9DDF9DD4B57EB40128988C7C8994DC6A5FC939FF957F06C70A4056E63331F9AAD254EBF2B8FCCD580285BEA486D91A0C2DBD5823AC8F6846DDABCDE25A2252F8DA1AEB32E6969276BD2A7F94CD7DD3143F3181489272B1589FD385BA844F90E35982B53141DAEAED413054CDB935F3412E31D99C1147079CB487FEEE85E3906DAED18106B8C407BBCB7716EF9D4D34E2FF04709C7457997AD6FADC55A8FA70BC907815805578A11A012C521A1325754CAE2E3F7C9E1FFFDBD4BE31DC534961C318D1A894838E0C33806735DD11E408E500995B86B6ECD20D325347F792A3381D2A45587D9B6AE0AA27533732A6C421CA621AAC42335848D9C0DD89F14EADF2F92EC532756CD5697AD752B6260C598EC9F0E9976A950B22DAEA8B74FCC87F28B5E9ED83C0339E566259ECF06E5CE209065DE87FEEE5D1E9C466004B34583D6AE89B590EAD6A96CD2951705AC764F329E28C996AD6DB05F6C69AD2A39D3EE230F6501F1760AA41FFD936C9DBF20DE3996917322D32B946062A3C27D8BF35ECDA22403AB684CDC680DD166562D018D943369CAEFB9133A4BC4515CD5F9C08E7C22D153F0A7733EB4EB2CD8A74A4C85E40DADEF6858C5927B6EEB2B01E9B7AB02F7048C8869991068B00FC19B9545AB42181DD5CB5488222A402E827F60A8D87B09ECC88350032F998E3C10A88D4733227334812EC97C5E5FA85FAEE1A1E28A58641531B139AA58BEF49780DCEAA408986CF3C40E226C60531945A20F91E5DC31EC86C9F9A0545E5FCB79A13B9AFE9B133867BA7A38152ABC6D9F8EE10090BB71E6ADC6A6C2513B066F2565138BADA60B0BD339F9BE1AADDFC90DD272B4146D0F5830C6A53E295C849C15D001176E7774FCD7619D6EF1A30BA93CFE278AB4806BBF25CE4A4E94163F614E81DFF7EFCB015997F5138E22B80B2B00AD7579CD84DB5D1C7FB16E9E8C5D9A5BA0AD0E0A7DE79C18839D673632F3D2C7DA2062EAE844FACCAF23590B2FBF1861405AC347EB9D723ECBDE54CC96BC4D8EE2178F353310E5D69230C5DB2841D2A06A3A4E03E054D99DEFC6004A6E405FA89B198A901EA1AE9F3112A29F3AEC5698A42794E04D74D761E4AA5AD23DE271969BAF124450F4796DA1EB1C01480436AB0F5D0B1B2E6717DD87EEBF137420961F978896077E40B2D2EBB5664FD8AD89BB9333FDF46C33EF3BED21BCB5B4697451BDACF364F85462F5CB9F546657B4744EDF757DAAA4D3A9A2A6F281184C3576B1DB0B540F3B36310020BC6AC0C6454A7CC8EC1182422B17BDA202729C270194CD6044210D2B98731565812339EDFE5A0DAD79BA826D8C566C7D25DEA9BFF0BADF1E4E5DA2B884966E03FADC51C6D9BCFE877511157201DAB48AED1AB038999E5CC3FE58CCD37D40050DEE92E0BD5332413A7F0118724084EE5545FB51942DF1EF399F734FB9592555B5F32290C53D7E5017EFA2B61E29FDCE90CC3E7C1B0E545425B1D3E1ACB9089DAA786CB0122DB3FF27EA0367751A5462230F0F248147EBCCBA2E16D214E9A0BAEBE989BBA020F95B623CB14ACAF2BE6F157DFDB1E32627133F0D26C7B65A189F39955EE31D9B507B43126B06B9E4524732C8621D2274438DB7ECAF736AB7257CED950EB68BB868581649232793EC83379A16F40781E76F5CC57C48C3F5C2989BEA803E1B63768436D39AD19BB77DB46AAE6E8473ED5DFEC983F49E4B8E7CA6BF476AB2F0272C0C2DBEF1BCB064D7400BFE1B9ECCE13578A20B1D5B48133A74C5C59CAE0115BC3B50574580BFA99D58BCAD336EE2CCA5B7994C784BB90CC8F1B9A0E21B39D5EBA464DE34D46AC0BBE436C2F419D60D8AB13786F9A841B52710D1B49BEC290DE317B66B6855ABE156C07619A4B998CC582E3F54A7F457F1D2839BC3EBAC937AD3EBC6A9E6E845379CF1D66D7C59000E3F6CF6823B005728A95BFB0ACD044EB35D5ADBE8933A3637887CF91EE74BB910FDCBE797B0C6B1B056500542BD39781BDF13EBFBFE949D7BA0B7F31102E63BFC6E22693F97 -pk = CEF93868E9AD725E6467EEED9110B43B00A0759CF63928F155CB7B2E7AF72970434E41A47B5A6355DCBA1B097F228B02D3F37FEF517DD94B8E95E48091DE24786E39F8208E7949E6EAADAF54344CF25C59213E01C7875BD9959FB25CA8991C03 -sk = CEF93868E9AD725E6467EEED9110B43B00A0759CF63928F155CB7B2E7AF72970434E41A47B5A6355DCBA1B097F228B02D3F37FEF517DD94B8E95E48091DE24786E39F8208E7949E6EAADAF54344CF25C59213E01C7875BD9959FB25CA8991C030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DB504F28BDD2E0F87EACF3086CA67A5E7F8D88B770C0F9A5A75FCBB07CEA342D9D1BE553471B2941B3CD368F7D360A76086BD7D5B085E9A273A632F2204EA37B2AC222000000000000000864CDB4C13F986E9E33A5F8BACEF866335E2ED4F5EA24F87471050777B28FE2ACC25E334379682B79F8937AEF9923C1B032C76670987946460787677BCEE476F916F3FFFFFFFFFFFFFF2C981F7A517F827B9E9C821375CC16B57D7F979B3EB8CD961AF956D761F565DAAF104435E75FDAA2036AB200000000000000000000000000000000000000000000000000000000000000FD11A19FF55DE439AD2258CF4CD2CE8E5B4CB9DE06E453B9D23D148EB3BC6224C31E51F547D075023BF89700000000000000000000000000000000000000000000000000000000000000BB4282E9AAD1AEEAC30F862FE7591F36393A4D9A6DC55311A670E81D72CCE94CB75EC274CC56D8FE2A84EB65C8F1A7015CE38915EC1EDC636129746AB74B9BBEFFF40B558E9249B7E2F1508262A106AC26058F34CE018D8B26C7D317F69630002A91EB87107861E839681A9D2A3EDD7FFF52963DE317484B6C16E71FF63DB798EFE5DBF4D2F75BEF537B35A9FAC68D00A2474EED830F5D6BC9355BA73CA4D2A44CCA86D78563EA0AF97FC6F0100F184188D1473C9A8E8F89D67580A73B2C8403914BB58BABB4B5D0E95B4C0FCED97ECDE6415D03464AE303E8C5F8D8771EC3D571B94811D7CD8324DFF1FB6566362C03F6248DC175E3945825F7473FC7E4D2E37599C0B7AF846BA30D6DFF2DDF32A981AE78AB3E4581E54F75F5B83AD50ED500D501F304A5CD4F1B987229B4D0BCEA73E16BFC2C1015904D25B35D902476CB468301FD6281DA25D43368A76B197E330345C3C482FE050E021CE4214244047881E6D66AF9CE2AAF7E28C404C38D5284A191CE30B8AD3D1999EB19519E6590AC03ED55A27963B8234FB659084FE382C0B2C250F40EF6247B6AFCD1A0380CF709C042A6EB650AF06CB4C48A7528D4D76702E5A9B0D7F62214E63EB6EEBE7F776D196E6623F95A0FBC5C995FB77957248AA3307863FB23CD6EB7C8E251648698F502E7ABFF941EF5B90BD2D717B75FD06B3A92CD5037B216C21EC9575D8C07618767A563615A59C8109EB7C837891FD889008CED5E7F48E34C495E893B86B000A348B650C76514FE4C30935C01D89729BC4350BAD002712E14819078E29869865203154FA9F47623FAFEC6C99665FCC31E9A42A86733B82AD0D43367D064219CE14E6BC30D81D494EA1456644FC47941A600926A4B1F097D2675AB375FB14963931B23E698F2811F3DCD3F73BFA5EEBFFA3746C56ADD8E43C9B23AE8E405D553AD00 -smlen = 3266 -sm = 7E957E1209FDF6D15033562E00B7FD3C3CE0AF59B3D1554D3601A7338E2A0FB22046E980647900818C42C98A874D1D2A86FC3B00DB0AFA0915A52DC1D8604CAD00D253EE4C252A7F4523C1B58301DFE040A3CD101C509546217601DC5E706112411A11C2BF2CF800BF084C1BA0E974D813B4203C000DFD25E830A6099DE8E39BD6005250FED5127514931BAB8D9200606670C212B4C2EF5DC9A644002D7FB6E4F10AD5FFA78A3FBC01B4F2F5F1B212140CFCF03586009926ECE1A6172310BAB17B0201B4493A217B3CE1FF0BE4BFCD0100BD7B5B46FC3C18309E2D62544096E1661A2448E1F9CAD5F5680C036D6D4C66149B5D0FEEA4EFAA011E24B6B9834A70760B5AC29D3F09E0F434DFA04EC225FF6B6DB802A047E221BC064E5BE89A5FC13937AE9D3F22B4439BB1C1BBA01547A64AB3E810BBB09706D01959E2E906A69FFDDF0C56726BDB58FB039D66AC5D77C7F0E9A8617B0C69176770DA328D38171F39B5220279186250139922C0DD0F7C3F96D48615FC66DB7568810931D257B230258FFE9CB35F87859E08139EBF7432E948EE3F962BB9015CACB8499BC69597ABAE4B841B606657E2E3C51FF5A8961AD42177A9E73950E3FA150439E2063B6555624A6D8E3AF4FD5710FBE722B8C6267BA5DF56846A085C56444573D692D5412CB70E443761751E58C41953BB9FAA3CE1F4564C825A02F0E1339CD659AB1480804DD2E90E3086AAA292DB39C6E2AAF1B001B47A21CC721C0C502C46EF0479BB7D8CBDF8E9C136397FEBC2D83C0FDBB3ED4FA6868068477206A26D2B7E0D20507AECB2756B888FCF5B446217DE14EE6A20CF7E7B732FAB22CA3ABBE81B2BE18463ACAA3132773ACD7476460536111CDCAC98B1CC9B2C36AEB3FB318340F7397B4B4AD6AA87EAC94AB7D98CC12EA5606162877465FA2CAD276CBB5D36C40A0B014C53D2D3A96825E237342DFEFAA6B9456B5FF1DCA859C5976F77C3D3CBC9DF355237EE9B4B4C90A9DD941294431DB76DBB539DC48669E7AAD21808332C8A4FE98B8F043FB756B526890452FA3C3527FCD584CD33E38FF9FF783538D39A184B7B3EB649E1C04C289FB65998F6CF5D5BBB0609FC3403D85C6DF269017032CD24AC540E1B294BDD3C3A0C7117CAB02B1A0063A174FF26FCDA687433A667322320C0DEC1EA3963F3B14375882B3478AED43C2C74DEBFE3A734F8B1A5CF92007F8FB627CC3AAD5C6AE4C31846B72E7573041270FF40E762C0F8DBCEB7512D44DC260A97D5CA7D60699981ED8476D8651C35C8ED498FC2961D1E38AF46F3653630773209A63838A9222B813C23DB0CF4196D6654126BA2B1840A7180E653B3D6E10C4C7AC3CEE93B0399D918A52E59F0215B09A119E634E6E8A9886C877F157BF7B7DD827ADEDBAF03C718AE037C0B262588171839E952721DE72180F8EED00B01F53E098B82165199C53129576036FC753A3D33AEC92060DD19AA078A496A2B214B1BFBB747A1EC64071B0A078D74D0212E6203C9698C7449326A42BCBBE8D9501DB916C64307D5F1083BCC36C0FFA18C0E4410B0B17D443481C3673D17BBD7A366A5FD1C3C5B3391A02EDA7596B4F869A91A32B5A02A05611371231BE035EDC716F534724B5225E1A72A2B2CD357F4C326F1DEE963FAB680721D40DD70B750A019E70885515F43946A0DD3DD042969139F61ECA0E9EE3107D3D28AC606AD53F236303E1FE986C38825318B7C4597B14E1A83B81295FEF49FD0F2C1E14A0B146540D853DB9706CD224B376343317BF7330B0C2721A409B856304FFFE60C24C441D5E2797D4696C0FE046D305AEE93CC6A2D89A81EB19643636A8B424B310034612105DF16516CE9607CC0A2BAC5835642C6FF9572191BC45E44D9B40DA36B607F570AE8C39D490342786F31CE6764F3F7A764665B6CB93E54922C6D89DB566F494E0EE069811AC82E8132F2F388D68490CB1C2172D2979FCE3659D7076B4F457232EB839172963F8C342E2CD18969F086F451D33BB774F3D00E6FA2BE02292F2E5CAD3ADF5DEC28932BD784801E69364962BF39E25455303E1F289052D2F0CD4964E0FFCDE29E7C074E5D57E43739DFA42AAD636C352D363E3A23BDD134BAABC7CD1621CA638DED7DB7051F0456641CA872ECDB4D3C2603DDBBCE16637010E782C4BD5230992E2EE7DD904F8A83EBAA7B4C3CEE15B10794ACE894118304BCDA9E9B1376331D2248B802557AABCF913E95F783715BB5E90A4436E4BDE7D651397A70A24257C39E0516BB1F548DA36C1F1F92A416DC1114107CD863F3BFCB360286E774B21296259756EA6040CB61738EEFE29A67895AC69797C640E03F0E9E731647C2DA93373920341FDFBD50EB6B737BB0D9FDA8EC8784920407D4F41486D8FC616430768D6431CCD789DEFF332B239FFD1900800CEDD9661A55D6D96089007E9089A117F03D7858EB4C3FE2D07E91D8CAB88D2BA5421846069FA6D4E5C9161A140CC3A288100BFBE61C3B0F0E820AB12D8FC54B054A0F4C777052495B45A7D1A883E67663DCF50C2230CA5319AB31CD76435DAE41CE1EE25ECD3FA0C7E83B0168852B2CAB674127CD7BC9DDF9DD4B57EB40128988C7C8994DC6A5FC939FF957F06C70A4056E63331F9AAD254EBF2B8FCCD580285BEA486D91A0C2DBD5823AC8F6846DDABCDE25A2252F8DA1AEB32E6969276BD2A7F94CD7DD3143F3181489272B1589FD385BA844F90E35982B53141DAEAED413054CDB935F3412E31D99C1147079CB487FEEE85E3906DAED18106B8C407BBCB7716EF9D4D34E2FF04709C7457997AD6FADC55A8FA70BC907815805578A11A012C521A1325754CAE2E3F7C9E1FFFDBD4BE31DC534961C318D1A894838E0C33806735DD11E408E500995B86B6ECD20D325347F792A3381D2A45587D9B6AE0AA27533732A6C421CA621AAC42335848D9C0DD89F14EADF2F92EC532756CD5697AD752B6260C598EC9F0E9976A950B22DAEA8B74FCC87F28B5E9ED83C0339E566259ECF06E5CE209065DE87FEEE5D1E9C466004B34583D6AE89B590EAD6A96CD2951705AC764F329E28C996AD6DB05F6C69AD2A39D3EE230F6501F1760AA41FFD936C9DBF20DE3996917322D32B946062A3C27D8BF35ECDA22403AB684CDC680DD166562D018D943369CAEFB9133A4BC4515CD5F9C08E7C22D153F0A7733EB4EB2CD8A74A4C85E40DADEF6858C5927B6EEB2B01E9B7AB02F7048C8869991068B00FC19B9545AB42181DD5CB5488222A402E827F60A8D87B09ECC88350032F998E3C10A88D4733227334812EC97C5E5FA85FAEE1A1E28A58641531B139AA58BEF49780DCEAA408986CF3C40E226C60531945A20F91E5DC31EC86C9F9A0545E5FCB79A13B9AFE9B133867BA7A38152ABC6D9F8EE10090BB71E6ADC6A6C2513B066F2565138BADA60B0BD339F9BE1AADDFC90DD272B4146D0F5830C6A53E295C849C15D001176E7774FCD7619D6EF1A30BA93CFE278AB4806BBF25CE4A4E94163F614E81DFF7EFCB015997F5138E22B80B2B00AD7579CD84DB5D1C7FB16E9E8C5D9A5BA0AD0E0A7DE79C18839D673632F3D2C7DA2062EAE844FACCAF23590B2FBF1861405AC347EB9D723ECBDE54CC96BC4D8EE2178F353310E5D69230C5DB2841D2A06A3A4E03E054D99DEFC6004A6E405FA89B198A901EA1AE9F3112A29F3AEC5698A42794E04D74D761E4AA5AD23DE271969BAF124450F4796DA1EB1C01480436AB0F5D0B1B2E6717DD87EEBF137420961F978896077E40B2D2EBB5664FD8AD89BB9333FDF46C33EF3BED21BCB5B4697451BDACF364F85462F5CB9F546657B4744EDF757DAAA4D3A9A2A6F281184C3576B1DB0B540F3B36310020BC6AC0C6454A7CC8EC1182422B17BDA202729C270194CD6044210D2B98731565812339EDFE5A0DAD79BA826D8C566C7D25DEA9BFF0BADF1E4E5DA2B884966E03FADC51C6D9BCFE877511157201DAB48AED1AB038999E5CC3FE58CCD37D40050DEE92E0BD5332413A7F0118724084EE5545FB51942DF1EF399F734FB9592555B5F32290C53D7E5017EFA2B61E29FDCE90CC3E7C1B0E545425B1D3E1ACB9089DAA786CB0122DB3FF27EA0367751A5462230F0F248147EBCCBA2E16D214E9A0BAEBE989BBA020F95B623CB14ACAF2BE6F157DFDB1E32627133F0D26C7B65A189F39955EE31D9B507B43126B06B9E4524732C8621D2274438DB7ECAF736AB7257CED950EB68BB868581649232793EC83379A16F40781E76F5CC57C48C3F5C2989BEA803E1B63768436D39AD19BB77DB46AAE6E8473ED5DFEC983F49E4B8E7CA6BF476AB2F0272C0C2DBEF1BCB064D7400BFE1B9ECCE13578A20B1D5B48133A74C5C59CAE0115BC3B50574580BFA99D58BCAD336EE2CCA5B7994C784BB90CC8F1B9A0E21B39D5EBA464DE34D46AC0BBE436C2F419D60D8AB13786F9A841B52710D1B49BEC290DE317B66B6855ABE156C07619A4B998CC582E3F54A7F457F1D2839BC3EBAC937AD3EBC6A9E6E845379CF1D66D7C59000E3F6CF6823B005728A95BFB0ACD044EB35D5ADBE8933A3637887CF91EE74BB910FDCBE797B0C6B1B056500542BD39781BDF13EBFBFE949D7BA0B7F31102E63BFC6E22693F97 - -count = 91 -seed = 9564E88F336C091EAD50C893F3EAA8351FA388682F433F7A72A34731020B9C96DFCF75EF5EAE47E12684AFA51EFB49B7 -mlen = 3036 -msg = 2601A39B6D7D91DE539EF11C3B67AE3EB1607716F587BAD5F60D311A9F4FE7F04350CA085EDA6D41C4BB6C6E13E376BF8A314DDF791AE18BE2EC0544AFD3CC27BDF270C4550E9E78D497B92349AC07755BF9167B2958BDE919123439D6F49C3408E8D88021E668A0A5FB6799330188E35EC5939B77097E3737C4F664D01D85FAAD0F583B3E95EDE125587E2A79991750D5CF804325C72DC8DDF3471EE8FDE02519D2D0CA7EDD651EEE30B3BE335CCF7FB02059BC3A47EE3C056D4929EAD4FCD82C8CF49625D5DA460DAA299718556BF0F77CC5CBADB99B64C8EAD4474601FD5C79309D4E63AAC392853072619EFD7B958F0EBDE5CBD40ACD57DF269A8810776D6DFF2E637EA57ADBFAA08DF8D2581C38CB262DBB4D1F3C65A4FA068539D2056E08DCF03BAFF006EDC688023A20728B227A99FED3B8F2BCBED2E3E6ECD8B8665A2E4D233B78D7C33F6E3BD9D0A24D13C8EACCCB53A21DDA9E7A34F9A0F031091E65F749C9EBCCF3DDC4097A121D8C68EB7883405EE34F6A8B0208EA8D5A3FAB53FE2CAD1110BFA6E094F78D5314880BB67BFDFBC2DF8AA250F1D7200FF9A3247C4976DBD1BBE99DF02A3F246E5D466F85ED2F68E0B2DE06B0F2448A7B98FBCBF5872BCAE71BF0DB4E70105B020FF130141E8DE86DBE05B7D2A234CE2EA83A38E23A262E46FFBC837E8A71F657E443052E9A49DEA4E344D497DD2DE2AFB4009D681F232BFF4FEEB173546CBCC4C80C9F85B1CE125BE678E5EC62EF04433D55D4B8829B01AC165A440FCD6594F2C0CB456C8A47444AB05A0F0717B8185930D9738E885D24DAB98E11ECFF7D7A48A4527F94FC4C9D1B9D71F5E6BB39CF92B1A6D0509FFFD42E77AC9AD6F50F8FC649B96B8AC08673F78AE8D0BA2B7243452B33AAC44B06A2B9BE1AD6A12583D3590A3F9AF0E0DC35DA88A257170D315F32F3A889601D6729433B7ADE0F719386723EB2A008634749F5253CB7D9B2FC99A1AE1BBBE7F00A536CD38F8A7237D3992C3897DF412F5B1D45E1EF5B5DC974D49CF8DBF785160BC527543458FD9378B3D4D3124214AE5676185794209AD0EE73B063CBD5B7830D00F817CA0D5CBB597C44D28E4885D935B7BF426C1339C500DAF4F2033FA6A27A4196F233256650472F205D2C5E00E7087FB73027B0C6C9AC5C1D928CCD190B8A6BB33F512CA8E2369DAE6111156DE47A24469683F4721A25652FF87474DFD92A028B3EC5BCFC244CE442752A7DA1DA6C33FC22573BF0B13E371CA9FCC86C76FCF7A1654EEF4442E47399835A06336E62952770C6E61C573CFD07B3AB631B8831FE3F5DD2C6DF68EBF2F8E02EC9F6B90A371ED5E62C8463780AC453AB6F72D38C8F5212C8B650F63B98E3C0886B6A85AE8E7256C1EFB30969532CDBF72184AECBDE2A17B9811DD4222D080049C5D36C532CC0E910779D64AF93D750EE96BDA87562EBD3830FEAD07A3960CD6DE7146603199563693392D3CCE1332DF35C2C8A2C251911D38E95815CE5A4CE5596E2D77711D87CDD54D22E8F0AB431BF8B24CE9C7BD6D077E436543C70B02F338841AF0FB86B5EA4B6A47E27C1D83E1AB06801044F546ADADA437F3CE7D788A1C92A74BA540664658E70D4F2711979153FF1589792859C3BF122628479C7C35EEE951DAB8CDB0D4D150C2DA338346988D34F8C5E589B231B5E00849611BA09711BD3A0516FD515E6C4AE1E8A3657C282C8120C97AA7A2E3BAA22B6EABB8D8212A9A48E7759A9DAAA51B538F662A05FB897067B7CF9D2CEB47A1897214CCFC225CE47CD60E86F7DEA49E220F7DDD6894B30B66460DECBBCB2E42B31F4ADF0AACDDE544B9124EA5ECB04B03C448B17E8094D489F516D23164D2317D3A1332E0500F1423136C8535D69065E880AF34CF7E36DB5FF2C18122E41880585B4D188411E86B370A024BD6E28143EA2EAE52EB46BE334A21A02E21C6755C0182B9A055A7D4C7B056E4930CE63EDC79C9FB4E2FBFFC58F776086F3487F02F8D1E7C8519C7F452E75CE5686A037B3642B95D7526ACD4A81A47112CF96A8DA7548016A22E9359198E871DBCC5852FBE14EECF3CCC5EB2FB5EC31D10474DF7D63482A03E11F4AAA2EAEDB714786E21D03AF1CD644D06BB05FF7B3959601580BF50E5F7F82FF42E9CF2FFCA0C67FFC52CEDC53C7A5C9EFB6C21092DDA374D1CCCBC78BBD9F5EE0FDF6DA6AC60C95F7C2E96F17E3C379A52D5DBD1A92DD76D1F5DFA19EA0408E0E7F7867445445CFA60BCEFC016E68872FBAC9098FD6A8E84731C285570B1BEACCA6F4728958E7924F7A7B7730B9BDC9AAEBD9E045F464071843C650D06C96D487CF8397286F81D93D0CC2008A62EE32421E5231998140909474F6D98541D899EA53714AEFE652A3D792E4C72533332C3133707A49293E3B2E06AE18F2F81D601AADDAF2FD09EC59350E0979A5AE2B721771682A1BFB5748D000F9736031CA971288F34993DF10FC06A16A6DBEED8CDAAA8127F3B71432E723558F0281459820A0F4A75A3B2716F976BDEB88BE9C73F31623050D7C1A96C84988B01D847309E1B6D7B815883F83C9BDB7FCDAEFA8BA69E25B824812B7D54530A3ECC96611897661158DAE1B4AAC112E9AC13D07FDC03DC7D5AF23C08C5E4BBFF737238FD3F1C06F94215BF2351DCE9CAE14B4DD4745AC0CD626054469C6A5286FF821BA192706D47CCEBC443DD67FDDB76797A8B78DD0DAF850CB5D181C82298616E1D3A92F7FC82FD256857915773C7AD97CBB9710373299AE8516B8A1D647A13C7BE848E0269ED6C8A91DC50D0CAD21430A3BC9E718A13D1966A0182D9A24FFF7ECBC7876C868AF2BAF2D8B782172C6719CF140E8CB877FE6D78779E1BB31C70C6C9A6A77529C51CF78A5E4FBD7FF6153B5195817F80603E5C5810C38CF43CA812ECA52F73F045E33DF4E3D04EC8C5F8B4A7399F6CBBF0D39DC951C476B9BCC002720CE89F09C3885673BBA9C90D20DCCCA4A82CE5BEB38BCD60AFE2BA65FCFB01C8793B7ECC0F0B17A9DA74F2E0FEF4C90B5132FD6BAF8C010FCB5E8E7FAEAD7F2E0DB29BFDD1811072623CEE274EF2EFB0F7D4191F332AAF20CF36FF89A2EDF15F7B284CABBBEF46901271D8C1B180F736125C8A44FE164AC7E687E9A58C3B1775238BF1A11F99BCB583D0E3C44BF4F76DCF9496A06F80CA52E24D55B54AB849D3040B4798BF5292B0574672E9F844016A52A4D4E4DAD2053207BC97215BCC1BB93271C03C9AD2DFC7485EE2ED399236AA06CF9A12972E21AFDC587A6334CD1D71A7539362D714BA26214664E3B4BC39CDB1DB847583DB8E002A2AAB451B4E5BD6FE200730BFB2745D03C82B640F4CCF58701708F724EFFDF98CB04C78DF36B7A866CFD596BF5EA18445EEA0E34ED514D0DC2625039049A0CC82711DBBEDCE339C77F9FA1DC60EDDD8D58C8F144B0F3D00227AFD8710BDC66D29809728D7FBE85F08AA38AEBE5605DA29A09CC0526FEE84691EAA54DC3744BF5A95275037FA2F600B1F91E502D5D81AF48F8EC4C1834FE625FCDF2364067048727559047E07062B4D8A7D3851853BF28BE9D2C511451E5FDD9459270328A2612DBFF42E1DD34005A3DA1226A023162F454923C0337E6C74B44BB27A3B1AC82DFD68B0A6DAF93473D97A9E4591EC01A51CB6B47E2C7A85C1FFA73C35E5CE3003BC4534A2D9B16EBF9FED6464CB1E0CC665A451616A62B6A8481E4506A73883198C144A06331224D358196C815C811B103959EDCA35B26BCF86F41D9C7638547496787885EE62B14AF431CAB2AD4E0224D33476C58B8B0833BF13B50BE2B1D682CA7DD194B793AD2C6E4EE25AAF95459302F0B4DAED907A317BCC6A5F8D76CA9AA0D799F8EA39F330D6244BFB9F35E6223A0F665A65F55EAB9BCBAB446D7FCD424DCE87F234864D2C27EE84600ED9193AFEFB6E7681BC94F514FE0748EB32D32262CAB880D79CD4FE5CC963A4F688D448F2DB2DCC5B0CA87AC26DD8506512C100273B8D4D902FC054D48D8BF9EE818AD9619F68A8904B613256DB78C881CEA3373F0CBBAC336A78CD91AD9D60126E05CB8C16E9AA8482CF1B806B2F9C57BC8D63BF008AB2E49EDE8E788BF96B9F1DB2918DC5063F3F1D5B9B1C0327141ACC0B4B248FFDCB8BCC127050D27C805E154A4825DEE6BE9C8D4E42B1F5EFC1EECC6A45DBC119AFB15CCAD19789EAAFA8B1715111AE32E2ACED2278803B60E2FD63A43317498244A7CF7342342B60462510E19D83240DFF5D58E762C093DF326EA503FD347D2A92A5A4680D5E13B305671C729179FA21BE83B0D83144E63 -pk = 1F1CE030FB4616A7EF48EB9C2E6180B7354C3EBFFEC0E46D4A4CE381BF4C510E164679D017BF819E2589382C0AEE9F0298D4423DBABBFAE756E16D39B66BC734C4191780B44D8896BE908F984C9CD1AF14BC71BEC42E5C9FA0453100BE3CBB03 -sk = 1F1CE030FB4616A7EF48EB9C2E6180B7354C3EBFFEC0E46D4A4CE381BF4C510E164679D017BF819E2589382C0AEE9F0298D4423DBABBFAE756E16D39B66BC734C4191780B44D8896BE908F984C9CD1AF14BC71BEC42E5C9FA0453100BE3CBB030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C64B98B44E7A523F63B13DDE6054692D54E0124A31F60CCCEDD9B506AD404A73F5FC2CFA97F4B651826EDE0104B93A324C1E5880AA05C144E8C8250D889E8AADF956E3FFFFFFFFFFFFFF77EB4F1F38F559659F14E3FC2E950F7F975D99185F347C886F120C2073748C7E151B8D35202B6348EB78FA46C5AC3BF40ABC6F03AF8277417313A49F99C156C32F02DEFFFFFFFFFFFFFF47C5A140ED0EACE634D4ACB4C5915B26DBD7C3FDCE745539FAAE4D85B9E29745DC9AE81937D83B770E16B1FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A4EEDA912380AED9EB8A8DBA530D8A04087923B6953A35ED4B67694BD1C7A0509236418E1376032C0B5DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24026A7BBE004AE469E330E431EE44D32E38F3E0BF61EAF121A11D6EBBF6AE9028E9589DE4FDE187D19889FFB8094600F58E9F9E734B089FC8DDAA84F121E0C8B9775FC626C9D1AFCF56606636E897B6BE7271CA3537991C90E269725332E500501FDEFCC2F28E52120EC9D43E35F6FB5DAB268D224ED9EA70EF8980F05CE1F0D86495FA342AC82A7D081AE5A4CA2503D89B8706E530371956BE23BEE0A3FAF3641CB1B2ABEE00AFAE245575AD8FBCBF77BCEE31685FA6E1147666D4201F3A020A04250EA0F89C87361B6EB07C26E4F013867F7CC8FFEE87C268E3E0DE806F8C9B77FAFD0E29276E0E75A453476A5F013A92E70F368FEA1F9050B3A5D6DA5D8004A42EB2D3EA470726448570CB11B3610B1E4F833B3875B96C6D4C8C3F9B0A039AEC7F3D51116B29104FC988387C92E7F37D85C400E9C772A2BD7D91FE6677E6D159E7C8E7F35442690329835F6D4D0033C426A37882D0ADE1DB77CC0F787D79DDA5C0ED85D77CFF41BA236A2A1FF63FC0C2C1EA3C55A61868F35382A37CAA00F326315166D92827D8CA2032D321F2E3398591B7807E8F08B30CEA8299C20978C41CBA1497F8D6E0935066213C997401D48D25F4E04131BFA0AEB92EC33AD240CE6BBA33CE6CF4A11C84FE7D52A35C3B0B04490988EC8D418D3055D2940222001C5D8FE16CA4D86A51E4289CBE7874D2C7B09F558FB859C6ABF93630FABF91A837738EE099935B32F5C8019D90BC520026E980879C3EA11DBFFA3D9C60D5194E72D7033235AE6FAB3EA0AC7BAA6F2FE88311D698DB0343245C3D41560DD2FA019DBE372C09D8769D0F4FD7F41B42AACCAC64539B6AE296097BBCE0E7301289914CFD0E2773EC3872D39A049CCA0B0800D0F82B637D2BC03C4A74C5E7974B304C475FB33FDA8B80FF0C14BF986DE60FF4CEC91E32D19A9594BA1543A9DC024C01 -smlen = 3299 -sm = C6D69895500E51BC0B9640F20120E9F51C98EFA7818219F9ED00CC66F7EC9D0F3FEAE6EC795B01D8BBE4E43F15A7AE4A435F9C0072187257ECC040E2CB446CE501F6A061E2EF19725B52EC209E017D6CA98CA3C0353E57E1539B01C541BD62F42D425A3C636932002028BC3E9735DD6E6001D44A0008D638A374AD41DC3ADDD0EE0150EAC5FC292EDD1BD661BD98007CE8CA4DF4C27FFF9284E57C014B1C0497357711431FF0F01400AFC287AFCD5C6715DD87CBE301694B208A0ABB04DC6A8F31AB006E952A10880EE099E166AE50000079D23C1BF40748B30D101ECF08E0C9812ABB19EC577490AF2E0D02AEAAA042998C8710A7DB6A40018F546416F1226B85ED723D4F41052601A39B6D7D91DE539EF11C3B67AE3EB1607716F587BAD5F60D311A9F4FE7F04350CA085EDA6D41C4BB6C6E13E376BF8A314DDF791AE18BE2EC0544AFD3CC27BDF270C4550E9E78D497B92349AC07755BF9167B2958BDE919123439D6F49C3408E8D88021E668A0A5FB6799330188E35EC5939B77097E3737C4F664D01D85FAAD0F583B3E95EDE125587E2A79991750D5CF804325C72DC8DDF3471EE8FDE02519D2D0CA7EDD651EEE30B3BE335CCF7FB02059BC3A47EE3C056D4929EAD4FCD82C8CF49625D5DA460DAA299718556BF0F77CC5CBADB99B64C8EAD4474601FD5C79309D4E63AAC392853072619EFD7B958F0EBDE5CBD40ACD57DF269A8810776D6DFF2E637EA57ADBFAA08DF8D2581C38CB262DBB4D1F3C65A4FA068539D2056E08DCF03BAFF006EDC688023A20728B227A99FED3B8F2BCBED2E3E6ECD8B8665A2E4D233B78D7C33F6E3BD9D0A24D13C8EACCCB53A21DDA9E7A34F9A0F031091E65F749C9EBCCF3DDC4097A121D8C68EB7883405EE34F6A8B0208EA8D5A3FAB53FE2CAD1110BFA6E094F78D5314880BB67BFDFBC2DF8AA250F1D7200FF9A3247C4976DBD1BBE99DF02A3F246E5D466F85ED2F68E0B2DE06B0F2448A7B98FBCBF5872BCAE71BF0DB4E70105B020FF130141E8DE86DBE05B7D2A234CE2EA83A38E23A262E46FFBC837E8A71F657E443052E9A49DEA4E344D497DD2DE2AFB4009D681F232BFF4FEEB173546CBCC4C80C9F85B1CE125BE678E5EC62EF04433D55D4B8829B01AC165A440FCD6594F2C0CB456C8A47444AB05A0F0717B8185930D9738E885D24DAB98E11ECFF7D7A48A4527F94FC4C9D1B9D71F5E6BB39CF92B1A6D0509FFFD42E77AC9AD6F50F8FC649B96B8AC08673F78AE8D0BA2B7243452B33AAC44B06A2B9BE1AD6A12583D3590A3F9AF0E0DC35DA88A257170D315F32F3A889601D6729433B7ADE0F719386723EB2A008634749F5253CB7D9B2FC99A1AE1BBBE7F00A536CD38F8A7237D3992C3897DF412F5B1D45E1EF5B5DC974D49CF8DBF785160BC527543458FD9378B3D4D3124214AE5676185794209AD0EE73B063CBD5B7830D00F817CA0D5CBB597C44D28E4885D935B7BF426C1339C500DAF4F2033FA6A27A4196F233256650472F205D2C5E00E7087FB73027B0C6C9AC5C1D928CCD190B8A6BB33F512CA8E2369DAE6111156DE47A24469683F4721A25652FF87474DFD92A028B3EC5BCFC244CE442752A7DA1DA6C33FC22573BF0B13E371CA9FCC86C76FCF7A1654EEF4442E47399835A06336E62952770C6E61C573CFD07B3AB631B8831FE3F5DD2C6DF68EBF2F8E02EC9F6B90A371ED5E62C8463780AC453AB6F72D38C8F5212C8B650F63B98E3C0886B6A85AE8E7256C1EFB30969532CDBF72184AECBDE2A17B9811DD4222D080049C5D36C532CC0E910779D64AF93D750EE96BDA87562EBD3830FEAD07A3960CD6DE7146603199563693392D3CCE1332DF35C2C8A2C251911D38E95815CE5A4CE5596E2D77711D87CDD54D22E8F0AB431BF8B24CE9C7BD6D077E436543C70B02F338841AF0FB86B5EA4B6A47E27C1D83E1AB06801044F546ADADA437F3CE7D788A1C92A74BA540664658E70D4F2711979153FF1589792859C3BF122628479C7C35EEE951DAB8CDB0D4D150C2DA338346988D34F8C5E589B231B5E00849611BA09711BD3A0516FD515E6C4AE1E8A3657C282C8120C97AA7A2E3BAA22B6EABB8D8212A9A48E7759A9DAAA51B538F662A05FB897067B7CF9D2CEB47A1897214CCFC225CE47CD60E86F7DEA49E220F7DDD6894B30B66460DECBBCB2E42B31F4ADF0AACDDE544B9124EA5ECB04B03C448B17E8094D489F516D23164D2317D3A1332E0500F1423136C8535D69065E880AF34CF7E36DB5FF2C18122E41880585B4D188411E86B370A024BD6E28143EA2EAE52EB46BE334A21A02E21C6755C0182B9A055A7D4C7B056E4930CE63EDC79C9FB4E2FBFFC58F776086F3487F02F8D1E7C8519C7F452E75CE5686A037B3642B95D7526ACD4A81A47112CF96A8DA7548016A22E9359198E871DBCC5852FBE14EECF3CCC5EB2FB5EC31D10474DF7D63482A03E11F4AAA2EAEDB714786E21D03AF1CD644D06BB05FF7B3959601580BF50E5F7F82FF42E9CF2FFCA0C67FFC52CEDC53C7A5C9EFB6C21092DDA374D1CCCBC78BBD9F5EE0FDF6DA6AC60C95F7C2E96F17E3C379A52D5DBD1A92DD76D1F5DFA19EA0408E0E7F7867445445CFA60BCEFC016E68872FBAC9098FD6A8E84731C285570B1BEACCA6F4728958E7924F7A7B7730B9BDC9AAEBD9E045F464071843C650D06C96D487CF8397286F81D93D0CC2008A62EE32421E5231998140909474F6D98541D899EA53714AEFE652A3D792E4C72533332C3133707A49293E3B2E06AE18F2F81D601AADDAF2FD09EC59350E0979A5AE2B721771682A1BFB5748D000F9736031CA971288F34993DF10FC06A16A6DBEED8CDAAA8127F3B71432E723558F0281459820A0F4A75A3B2716F976BDEB88BE9C73F31623050D7C1A96C84988B01D847309E1B6D7B815883F83C9BDB7FCDAEFA8BA69E25B824812B7D54530A3ECC96611897661158DAE1B4AAC112E9AC13D07FDC03DC7D5AF23C08C5E4BBFF737238FD3F1C06F94215BF2351DCE9CAE14B4DD4745AC0CD626054469C6A5286FF821BA192706D47CCEBC443DD67FDDB76797A8B78DD0DAF850CB5D181C82298616E1D3A92F7FC82FD256857915773C7AD97CBB9710373299AE8516B8A1D647A13C7BE848E0269ED6C8A91DC50D0CAD21430A3BC9E718A13D1966A0182D9A24FFF7ECBC7876C868AF2BAF2D8B782172C6719CF140E8CB877FE6D78779E1BB31C70C6C9A6A77529C51CF78A5E4FBD7FF6153B5195817F80603E5C5810C38CF43CA812ECA52F73F045E33DF4E3D04EC8C5F8B4A7399F6CBBF0D39DC951C476B9BCC002720CE89F09C3885673BBA9C90D20DCCCA4A82CE5BEB38BCD60AFE2BA65FCFB01C8793B7ECC0F0B17A9DA74F2E0FEF4C90B5132FD6BAF8C010FCB5E8E7FAEAD7F2E0DB29BFDD1811072623CEE274EF2EFB0F7D4191F332AAF20CF36FF89A2EDF15F7B284CABBBEF46901271D8C1B180F736125C8A44FE164AC7E687E9A58C3B1775238BF1A11F99BCB583D0E3C44BF4F76DCF9496A06F80CA52E24D55B54AB849D3040B4798BF5292B0574672E9F844016A52A4D4E4DAD2053207BC97215BCC1BB93271C03C9AD2DFC7485EE2ED399236AA06CF9A12972E21AFDC587A6334CD1D71A7539362D714BA26214664E3B4BC39CDB1DB847583DB8E002A2AAB451B4E5BD6FE200730BFB2745D03C82B640F4CCF58701708F724EFFDF98CB04C78DF36B7A866CFD596BF5EA18445EEA0E34ED514D0DC2625039049A0CC82711DBBEDCE339C77F9FA1DC60EDDD8D58C8F144B0F3D00227AFD8710BDC66D29809728D7FBE85F08AA38AEBE5605DA29A09CC0526FEE84691EAA54DC3744BF5A95275037FA2F600B1F91E502D5D81AF48F8EC4C1834FE625FCDF2364067048727559047E07062B4D8A7D3851853BF28BE9D2C511451E5FDD9459270328A2612DBFF42E1DD34005A3DA1226A023162F454923C0337E6C74B44BB27A3B1AC82DFD68B0A6DAF93473D97A9E4591EC01A51CB6B47E2C7A85C1FFA73C35E5CE3003BC4534A2D9B16EBF9FED6464CB1E0CC665A451616A62B6A8481E4506A73883198C144A06331224D358196C815C811B103959EDCA35B26BCF86F41D9C7638547496787885EE62B14AF431CAB2AD4E0224D33476C58B8B0833BF13B50BE2B1D682CA7DD194B793AD2C6E4EE25AAF95459302F0B4DAED907A317BCC6A5F8D76CA9AA0D799F8EA39F330D6244BFB9F35E6223A0F665A65F55EAB9BCBAB446D7FCD424DCE87F234864D2C27EE84600ED9193AFEFB6E7681BC94F514FE0748EB32D32262CAB880D79CD4FE5CC963A4F688D448F2DB2DCC5B0CA87AC26DD8506512C100273B8D4D902FC054D48D8BF9EE818AD9619F68A8904B613256DB78C881CEA3373F0CBBAC336A78CD91AD9D60126E05CB8C16E9AA8482CF1B806B2F9C57BC8D63BF008AB2E49EDE8E788BF96B9F1DB2918DC5063F3F1D5B9B1C0327141ACC0B4B248FFDCB8BCC127050D27C805E154A4825DEE6BE9C8D4E42B1F5EFC1EECC6A45DBC119AFB15CCAD19789EAAFA8B1715111AE32E2ACED2278803B60E2FD63A43317498244A7CF7342342B60462510E19D83240DFF5D58E762C093DF326EA503FD347D2A92A5A4680D5E13B305671C729179FA21BE83B0D83144E63 - -count = 92 -seed = 4D0788DE958A707899D5DCC02F756A10DEA2EFE0214F5E01B3281DF4E013CA75523ECEC64723D6C8BEC0B92C4F821D8F -mlen = 3069 -msg = 9163116C86E64D90D35CB216FED71BDBE6A0797A48CB915F5A40FC8D31AD340767058B28CFF0C240720327E12E653C1F98B5755D8000BC01324DB2820781B94C4434FDA76223845E0613E2526A95F28FB4A768B1487AA34DADB28CBE8DF4FDB510DFFE672FF004F37C7AC32072A24C0F12A050BB396AD56346F4E0BA75C0EFAC162288A7EE8A63255DBA5CF451A0932FD56B05E40EDD491293E045A6081F6586BDCA10B41A6970D8F9A7B3B6B58AA772EEFA9ED22C9A24A384D6947770862BE4FE45C5E0E56FA4D116B79699ACE41E5D9F2E4C245059CD798DD986A3763F527E0C9D5A88A09C4D76D447348509FA7D9BFBF3DEA59EA57711A3B1A9352123D4A74DF273FA24A89BCAB42A6D455B5FE3C503F1FF638280F87C740B9E4C5FF20133CBDFB8D08CAEB7DE9F26811D437E6EC8C3143C0419C2F5135D25C7F40C7908C03F295FD26F1A03FBC7285196BE40ADC6FBDDDC912B3BC94B0BCE08DBC2185EE3CB766325068DB55C31FFEBE4B1F6848AD4FC201A5FD056916A397ABE6A66FF9BB03B037B50AC509E46CA441ED45812E3334FD7036D190A7991E55CB817EC2A63CD800F293277E7D15F086618B55AD395C614D168FCEDFB274FDF4FCD50CB976F68A266C5365E02A1ED0221BA4E13E70304824F94251249CA23C089B4D54E02EA03FB7C9841DD30404428AAB2519D68CF564D75D18530C7D062496C120A8F5305AAB23AE52255EC919EB0CD875422B144BF47F7472349558E746B0EB5493F1FC40ABDADD2ED84A8B31221A485052369FD0B552972C9FAEB1A78E826BA4DFB9E91E301DB589E9D7C256E7051692C48534C6A5E2BF0F45B78ACA66D5F53E549827E15D64E2F294F93D43B9F36BEDCE6CEBC05E56CED3F846635AE3C384C3FD55B969CA31E8C625103C2B24E7EE45E92984CA23A331C5B14281B20116069C619D82D6080C6FE35C3A3FB2E73B695CAD9C5D3300814FD65738DCC3EAFCEFCD24361AAD13A25B3570D2D509FA449612BDB5B49E0605D7EB78449D1DB40660AF0F3D8BCD4869B6F175CD28AD72FE2668C3DFC1D4963D0EAB309DD50B74B9D2947F86FBE9864AE5D0DC69B55B182AC1D914B11F631193F5F1F897CE52CEE97D7AE95631FC2F2A1AE9B672165432EB2E5633B55185AFA5E883268D8503AEC10774D25D39C800B74405414FB06C55B8C48835577884D6B4F2F128246563066F8F34D76213E0720E899FC1F11A3B0A591885D82C688E40D6B44B54D6C7C6973156E2DD50C40A28D2EBBA60F5117D64646CAEF72974F4B8362E4820EC04F2F373DA8D883AF27518567688146F16BF4E10969E70BE8ACE5D2FF6A135DB1DD738907EA355FB6D243904F6427D11592672060DA14443B55A9089167FC9D5EFB2C64B0069795C341F90DAFF684E566611EA87BC40A4C45F22C23AB6888A754B89E4C95BB54629CE74EC999889C82714B5AEC703DE7BC080B0D2E622ED53B645688CE164ECDFF4ED66C86049B2F9077F2A94CD685294F8EA9CBC1DE29A48D39F6B308288DFDB47731E39644B576A298646752F5C53D7943A5D0F7DBBC9604902B61B8EDEFEB5AB7E5BFDBC1E6723E6047894547E440E918038CC13B47424CCFE1A207E08A40524B553C750683F5F6C960F05836FB9B28C59E1B471FD5331F1811DDF3EAFF73798B7FFD6C9714978988C440CA906B4782A410372D70EE65A0A803061708003688F576E2D3A22580B706149A24B93A162BE9F1B546680A1DB2A8E54A576C28B4772C50A55161B2994514369C2192B2C90017CC8282F41D28099F38B2F1F0D2C0E46B444417A2078755591F00F01DF0CE72B1D1BD255A14D2BF67AB3E630F95A5DA9BD9E10F08EFBF6FE722CF000C32460FA3271F18B39EAA4487C1DDF828B6BEDF4523837BB3425BA1C1606E8D5D1E6182AA6A74F068F3E90B42641347CA755779216AFBC99603391FCEF4E8E5AA202BDCA24B83FF42F4F01232D3F2831CDA2DB76FB93A4CF6E9EFB71B5438A4B74C3190A8901D73566C50727559BA9BF6317D116E8F5536BACF064D3F86282E0F88DD40B63E75519C6A8E5664AF8E1029FAE87930F523E4DC7C2DD6DC3296A42A59F178D438866D929A70951BED05533EB1D818B7C7C595971C26B1D436D26897D6A6EB036A13511AC4A3BD724F2CA57FEF07D2C0730800D35683D745125F4237ADD64B538B7DAB0D0F258DAF7DE1A74F74A2FD010CDEE810F514FCF6045F0CC84E2054B5F4EC2772718FFB4CCA9C9BE77F8F007333860180D60EE4DD8CE976E63FF49AA11DD42FE6946515E59DA3E602B1861BD3F63C89362BCFE8438BC71959A617D8D63331A3D903BC5734B777FB14F7A2B063D79EA8637AC52C758EF88DF217B95FA8FDF1009AB28D8A4F318F78772568CC7AA9E3B3E001C0111B1751B698EF1B66383D6B3CA942FE4F66FC97613CFBBC03EEC9D0B7E08F80939D9A2EA1F72BDA7B0D655AC3A94B4C699D3EB1BBD6076E63EF5C1FE9CE258B55D21164CA7EE03BB53D8BA4306F695E648093542D769DA95A35FF3A2C071DD8ABD5A82E217D82317065D50A87B689AE3A2EC7887957BB243373CF986490961220EA61EBE12AC0287B185070E124FC518C300620B4B6D4F29402B18C2462A7985C00E2A87691053B1FDECB7AA264F33E27C6B201CA6065EF79E5266513AEA92E8D3E646453C089B5EBA66D14BC45844D0240D2E7737C16668FD53E38A93D6003146019777C03644C300D06927EF6994AC794914EFC5BE0CA81680CA8C9752908FBD2D56D7FD1FC1C76EED755408F1D7802F0D3D0F347D82B162EE6F0A2A890E083C20B822FA6C4AD627F4AB5D1526D83D897C244D6ED4A427B23B4A0C19F4E8889257C1373764AB7063B5DB8ED9C2443CB012381A2B3365EB568649D7CCD52271F25FD22FDC397E4C9C536EBB452CD2CD10DC5010BF433F88CB58D2B9EDF2BCBFA83B782FFD4388F1BCE3F8F9AF5AE6BE590BDCECB1BFEA846D2F0199ECCDB0C7E4D419F69B6A428EAEB462B67AA40340417BDFEBB6039AAB8242E39F6C11EC136D73FB315CF71414A2A1203AF08FDEE34ED0072C27462395815F7779012A41EC526BE53DA954E1F7A7EBBB68FEB15CBAEA8ADD6CD0F2FE3D3615991AB54F4C7884E8A80A9535F13BE2ED944B3BB315DE8AF2A70439294CD53F041F41D3562BE840C78EFCB08661B1731FEEC46A9091ECEDE3A9FBC2DAE42C72EBDD84308E95644373595DB62157DBA7DBF124BB45DE6C2837B0066673BFD215FF915A8D41637EEB029C345E444251ECBBCDF79E246A80AA4591976A00DA06C759C6160ED1986F8E15A562417DA55109174628E7B11D49586882851205755B4F99A875AB3599FDCC094E4A2164E1764D24DE805FD7B20EFEF2A8E23FEA4E206DFA1FD9C31D90C1FECF745D3EB886190827D952703AA6A99B5000D8EE9D51DE94A82DD053B6AA89CD7E94E92D4AA93A9224D3F688B5C834A53F2993638166A3DE78ABA7CB930CC5845F9915E6523683715A187E940FA2A978B5CA4C3B80DB62E96A600F1864BF0B1AAC23B1330B13EADD3A2F07CE7181D0A9497C455D228278E5CC3E4C00A2EA3EB8E5B9CE2799256302B0F8F1F829D3A3AE8AA7CC4EA229C5AF476C01B8D48A9F6987DF57C3469B6EF6DFCB488A3D5B91FE17B5798FE154AB8399A2E75F0D15B2A6AA91302056266B22A38A604EDC374E2D2155ABCA119C11DC6827A47E3CEE7032F6E0F59708DFACE221E47041CFFC59CE0334D9B7C5E91C2C320A70EC2F32906624128363C893909F47BD970DF652D5E6C2324033F32B1653A039F8C051D9DC8F839C50F5696E9E08F7F1CDAC4750B429AF03176FF6E643ECA1D8FC710C6CDB0D26074D85316F4C9084D5F453F6D36C1CEA0E389F3462E1478E2503C1DB99FC46F3F0627F173672C21F3CC3B483998192E81EFA689819D0007762ADBD141A058587E030A3568E412D25662C40ACDAFC3C6EE30C10CC23E3DDEDB6C73085C90C89B1218D67A328F06C3637A786D4715CB9F9D8B0B22D920B68B0557CC80A56FCE0B6E2D6627DE576E308757A8F37821898E96785AE323E413D3572205B0A5710143A2621C258C76C7C3FF7100A2FCAE99C84D1AB1CECF7FC5B1E4698BFA3BA2A0856A65F2D4F291A4A164C0381D70D1213F7E40FC4BA42C43EA8E70043E27C5AB0827559B7CF7F2587D0D2F93C6382CF54E92764D815280D68C554E5B6FBB351BD18635786299DDE39FCAF3EFA708A3F18701EDA1579BFB0BEE4FA1F1ED6E09D450D427E4B91F4552F87F31F06F109E74AF4BF301481452AAFA2146F6375DA467EA008BAFC3C8408AADD61B07C28C55249EC0C8BFDB00EA -pk = 588BA34D7409A807E33E1107B9F2FEF6B5E8D093FD54FF3094F7222052EC66E230EB1D5E96EF7076EDE92752C0B94103BB4DDF4A69F7F8627AF44FDD0B37F7839D0AACA199C05E7F2AA950B8C0E3FDF33061D63872BFFE53DCEFF4A88A528400 -sk = 588BA34D7409A807E33E1107B9F2FEF6B5E8D093FD54FF3094F7222052EC66E230EB1D5E96EF7076EDE92752C0B94103BB4DDF4A69F7F8627AF44FDD0B37F7839D0AACA199C05E7F2AA950B8C0E3FDF33061D63872BFFE53DCEFF4A88A5284000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DD00BB5F3355AD5852352B2E4AEC71134F40103860A21BAD5232F23BE32CC1C013384F839E3177B3B984F935949DF4D4B7D3EC7D41283DC6522064E232EFE8734E2B2700000000000000B018C8319ED43741523440DD484C562F0D778305962CA6EB1B971DA8A8EC25E5738858CBB74DD5E19A14935F59B335CD3BE932CE17D680CB744AC99D0EF77272314AE9FFFFFFFFFFFFFF7C7892B93A2D64047A1F14F1170CEC3115748F7DB979040DDFEF05F4141DF1991984A336E4D11E65F4C93E0100000000000000000000000000000000000000000000000000000000000015293A66C5973CC91C2B7EFBF12DA7541E59F1AB9A16074EE322D2656F0939BC773A103246F031953C22C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD20E368D41E3F6CC9B9119C37B5D7F7C18AF8F61AAD82870E5F849A8946ED035EA9F3BDD2433F78A60C124DA34F70903D717A353B133C7070575F9BE901F26914762EEB42C5354AF139F2AAE976DC4452D568FC4EA6F2AE84260813B176B6E039C84A60CA2DAA8266DF46F8C3B260290CDC3659060628261BF25E91411E84AD91259E0774A2E44E01908B4FC13C99E0109AACED3AF8B525F98C12DBC33FFC729D861418E7023AF0121431B9DF1CBF6754508D5F4AA3B6642688AC95CCD9B6B0309F01F42BB612DD7ABED66C811FE0FD181A0B206839115324E5DA88443DFF5EDF74F839A701917D5C4615D94E57EF60184C885D2716D4542AD241B87BDDBFAF5C7E8D053BF18F26F58140FDECDB66DEE8BC19BF21B10CBFD9EE8D3261970D30229DFA414C688FAECE6CDEAAF3433CBAE865D8CB2FAA6F4305FE42101ACCA92DAC8E27B9AFD5183D8AE7859C1CE6BB5033B59E2360CA6194EB9AB3696BFFBC208E33CAF7871AA16A055439E59823B12E95C509AA61E9B8AA6D00F400E8307EF022DA910578F5FDF942E256FA1CF18DF3330C603C75461973DF4656CD95A02C01C1A2C63F5141BC6649B2CDD589E73780345DE2A060A59BF748EA3B40BB53D3987E1E694E217F6413F01C71809C6951AB251003ABF604ABDAF3D1FFC579EB69701A0EBAAEA7B6002E207CE6CF1C8E577BE186DB07568123A36E2AFA5FD30B1C3C66B605C14DF83B79F87B4609C3B4CD900CCAEC4B08BF45EB58A1B11E4BDE76442A86224B574D79F81A82A41830082C591C2EDFDFE2561A4CF2C0A05E85FDF550326A1E7574A6CB90761C93B243425988F1F2B3C5A2F84249A609180128B8FB885308362D6040B72EE594BEA5DEF54E802EE915E28E4F33A72A4B165FD32486A9F8FD68954AFC8A0025890720B0BD6C4D0476E9CA15B6CAB2E4AD02F09B71EE001 -smlen = 3332 -sm = 8E05405F7065DFC19D9C8B7D010EEFF04865AB941DF8C6F2F901AB196F5ADCECD8F1B65A7C1F00FBDE983BCDA3939D334C464200807ACB8444DFC8C1D7140CC6002D1279A0850DF777BEC6B11E00DA7F497C3B283F8047FB3C1C00BD15C8C487B4BA927BD3AEA5003732205FE8BCEE5C8C8172D900B05B80EC14134AABE191DE8F018EC491B62896B8A97251094F00FA0FB23C81655E070A42BBE101FCBAF0B825807F20D1BD0BD000650E6899A5D6B66773A17CAB01329D5B8A3965EDF182CD4700018F76D8F89A641284CFDD5FBC00003DF3EDCE87E951E15DD20B9667FD95A9E2CB6A34AE8C2201AF0403F242EE16D2AF5E434B18646D00FDCBFF6F604F63EFF5C8EE0DD9099163116C86E64D90D35CB216FED71BDBE6A0797A48CB915F5A40FC8D31AD340767058B28CFF0C240720327E12E653C1F98B5755D8000BC01324DB2820781B94C4434FDA76223845E0613E2526A95F28FB4A768B1487AA34DADB28CBE8DF4FDB510DFFE672FF004F37C7AC32072A24C0F12A050BB396AD56346F4E0BA75C0EFAC162288A7EE8A63255DBA5CF451A0932FD56B05E40EDD491293E045A6081F6586BDCA10B41A6970D8F9A7B3B6B58AA772EEFA9ED22C9A24A384D6947770862BE4FE45C5E0E56FA4D116B79699ACE41E5D9F2E4C245059CD798DD986A3763F527E0C9D5A88A09C4D76D447348509FA7D9BFBF3DEA59EA57711A3B1A9352123D4A74DF273FA24A89BCAB42A6D455B5FE3C503F1FF638280F87C740B9E4C5FF20133CBDFB8D08CAEB7DE9F26811D437E6EC8C3143C0419C2F5135D25C7F40C7908C03F295FD26F1A03FBC7285196BE40ADC6FBDDDC912B3BC94B0BCE08DBC2185EE3CB766325068DB55C31FFEBE4B1F6848AD4FC201A5FD056916A397ABE6A66FF9BB03B037B50AC509E46CA441ED45812E3334FD7036D190A7991E55CB817EC2A63CD800F293277E7D15F086618B55AD395C614D168FCEDFB274FDF4FCD50CB976F68A266C5365E02A1ED0221BA4E13E70304824F94251249CA23C089B4D54E02EA03FB7C9841DD30404428AAB2519D68CF564D75D18530C7D062496C120A8F5305AAB23AE52255EC919EB0CD875422B144BF47F7472349558E746B0EB5493F1FC40ABDADD2ED84A8B31221A485052369FD0B552972C9FAEB1A78E826BA4DFB9E91E301DB589E9D7C256E7051692C48534C6A5E2BF0F45B78ACA66D5F53E549827E15D64E2F294F93D43B9F36BEDCE6CEBC05E56CED3F846635AE3C384C3FD55B969CA31E8C625103C2B24E7EE45E92984CA23A331C5B14281B20116069C619D82D6080C6FE35C3A3FB2E73B695CAD9C5D3300814FD65738DCC3EAFCEFCD24361AAD13A25B3570D2D509FA449612BDB5B49E0605D7EB78449D1DB40660AF0F3D8BCD4869B6F175CD28AD72FE2668C3DFC1D4963D0EAB309DD50B74B9D2947F86FBE9864AE5D0DC69B55B182AC1D914B11F631193F5F1F897CE52CEE97D7AE95631FC2F2A1AE9B672165432EB2E5633B55185AFA5E883268D8503AEC10774D25D39C800B74405414FB06C55B8C48835577884D6B4F2F128246563066F8F34D76213E0720E899FC1F11A3B0A591885D82C688E40D6B44B54D6C7C6973156E2DD50C40A28D2EBBA60F5117D64646CAEF72974F4B8362E4820EC04F2F373DA8D883AF27518567688146F16BF4E10969E70BE8ACE5D2FF6A135DB1DD738907EA355FB6D243904F6427D11592672060DA14443B55A9089167FC9D5EFB2C64B0069795C341F90DAFF684E566611EA87BC40A4C45F22C23AB6888A754B89E4C95BB54629CE74EC999889C82714B5AEC703DE7BC080B0D2E622ED53B645688CE164ECDFF4ED66C86049B2F9077F2A94CD685294F8EA9CBC1DE29A48D39F6B308288DFDB47731E39644B576A298646752F5C53D7943A5D0F7DBBC9604902B61B8EDEFEB5AB7E5BFDBC1E6723E6047894547E440E918038CC13B47424CCFE1A207E08A40524B553C750683F5F6C960F05836FB9B28C59E1B471FD5331F1811DDF3EAFF73798B7FFD6C9714978988C440CA906B4782A410372D70EE65A0A803061708003688F576E2D3A22580B706149A24B93A162BE9F1B546680A1DB2A8E54A576C28B4772C50A55161B2994514369C2192B2C90017CC8282F41D28099F38B2F1F0D2C0E46B444417A2078755591F00F01DF0CE72B1D1BD255A14D2BF67AB3E630F95A5DA9BD9E10F08EFBF6FE722CF000C32460FA3271F18B39EAA4487C1DDF828B6BEDF4523837BB3425BA1C1606E8D5D1E6182AA6A74F068F3E90B42641347CA755779216AFBC99603391FCEF4E8E5AA202BDCA24B83FF42F4F01232D3F2831CDA2DB76FB93A4CF6E9EFB71B5438A4B74C3190A8901D73566C50727559BA9BF6317D116E8F5536BACF064D3F86282E0F88DD40B63E75519C6A8E5664AF8E1029FAE87930F523E4DC7C2DD6DC3296A42A59F178D438866D929A70951BED05533EB1D818B7C7C595971C26B1D436D26897D6A6EB036A13511AC4A3BD724F2CA57FEF07D2C0730800D35683D745125F4237ADD64B538B7DAB0D0F258DAF7DE1A74F74A2FD010CDEE810F514FCF6045F0CC84E2054B5F4EC2772718FFB4CCA9C9BE77F8F007333860180D60EE4DD8CE976E63FF49AA11DD42FE6946515E59DA3E602B1861BD3F63C89362BCFE8438BC71959A617D8D63331A3D903BC5734B777FB14F7A2B063D79EA8637AC52C758EF88DF217B95FA8FDF1009AB28D8A4F318F78772568CC7AA9E3B3E001C0111B1751B698EF1B66383D6B3CA942FE4F66FC97613CFBBC03EEC9D0B7E08F80939D9A2EA1F72BDA7B0D655AC3A94B4C699D3EB1BBD6076E63EF5C1FE9CE258B55D21164CA7EE03BB53D8BA4306F695E648093542D769DA95A35FF3A2C071DD8ABD5A82E217D82317065D50A87B689AE3A2EC7887957BB243373CF986490961220EA61EBE12AC0287B185070E124FC518C300620B4B6D4F29402B18C2462A7985C00E2A87691053B1FDECB7AA264F33E27C6B201CA6065EF79E5266513AEA92E8D3E646453C089B5EBA66D14BC45844D0240D2E7737C16668FD53E38A93D6003146019777C03644C300D06927EF6994AC794914EFC5BE0CA81680CA8C9752908FBD2D56D7FD1FC1C76EED755408F1D7802F0D3D0F347D82B162EE6F0A2A890E083C20B822FA6C4AD627F4AB5D1526D83D897C244D6ED4A427B23B4A0C19F4E8889257C1373764AB7063B5DB8ED9C2443CB012381A2B3365EB568649D7CCD52271F25FD22FDC397E4C9C536EBB452CD2CD10DC5010BF433F88CB58D2B9EDF2BCBFA83B782FFD4388F1BCE3F8F9AF5AE6BE590BDCECB1BFEA846D2F0199ECCDB0C7E4D419F69B6A428EAEB462B67AA40340417BDFEBB6039AAB8242E39F6C11EC136D73FB315CF71414A2A1203AF08FDEE34ED0072C27462395815F7779012A41EC526BE53DA954E1F7A7EBBB68FEB15CBAEA8ADD6CD0F2FE3D3615991AB54F4C7884E8A80A9535F13BE2ED944B3BB315DE8AF2A70439294CD53F041F41D3562BE840C78EFCB08661B1731FEEC46A9091ECEDE3A9FBC2DAE42C72EBDD84308E95644373595DB62157DBA7DBF124BB45DE6C2837B0066673BFD215FF915A8D41637EEB029C345E444251ECBBCDF79E246A80AA4591976A00DA06C759C6160ED1986F8E15A562417DA55109174628E7B11D49586882851205755B4F99A875AB3599FDCC094E4A2164E1764D24DE805FD7B20EFEF2A8E23FEA4E206DFA1FD9C31D90C1FECF745D3EB886190827D952703AA6A99B5000D8EE9D51DE94A82DD053B6AA89CD7E94E92D4AA93A9224D3F688B5C834A53F2993638166A3DE78ABA7CB930CC5845F9915E6523683715A187E940FA2A978B5CA4C3B80DB62E96A600F1864BF0B1AAC23B1330B13EADD3A2F07CE7181D0A9497C455D228278E5CC3E4C00A2EA3EB8E5B9CE2799256302B0F8F1F829D3A3AE8AA7CC4EA229C5AF476C01B8D48A9F6987DF57C3469B6EF6DFCB488A3D5B91FE17B5798FE154AB8399A2E75F0D15B2A6AA91302056266B22A38A604EDC374E2D2155ABCA119C11DC6827A47E3CEE7032F6E0F59708DFACE221E47041CFFC59CE0334D9B7C5E91C2C320A70EC2F32906624128363C893909F47BD970DF652D5E6C2324033F32B1653A039F8C051D9DC8F839C50F5696E9E08F7F1CDAC4750B429AF03176FF6E643ECA1D8FC710C6CDB0D26074D85316F4C9084D5F453F6D36C1CEA0E389F3462E1478E2503C1DB99FC46F3F0627F173672C21F3CC3B483998192E81EFA689819D0007762ADBD141A058587E030A3568E412D25662C40ACDAFC3C6EE30C10CC23E3DDEDB6C73085C90C89B1218D67A328F06C3637A786D4715CB9F9D8B0B22D920B68B0557CC80A56FCE0B6E2D6627DE576E308757A8F37821898E96785AE323E413D3572205B0A5710143A2621C258C76C7C3FF7100A2FCAE99C84D1AB1CECF7FC5B1E4698BFA3BA2A0856A65F2D4F291A4A164C0381D70D1213F7E40FC4BA42C43EA8E70043E27C5AB0827559B7CF7F2587D0D2F93C6382CF54E92764D815280D68C554E5B6FBB351BD18635786299DDE39FCAF3EFA708A3F18701EDA1579BFB0BEE4FA1F1ED6E09D450D427E4B91F4552F87F31F06F109E74AF4BF301481452AAFA2146F6375DA467EA008BAFC3C8408AADD61B07C28C55249EC0C8BFDB00EA - -count = 93 -seed = 55A9C7A0B49706090BC0702ECFC070AB060427FFC820C3FE05B499B59AEB125F2DB4787A5910B88C6F8FAF0A69BE0AE5 -mlen = 3102 -msg = 02C7C4451DA90503C43FDED1CCB3DEE468A6A8D9E56670CD8F6A58E7941F1BC5EFA6E2AFDC0141A2F7E8F781D79E70B4813263A9DBC8D8A67F89371CFBD90977EC96461B28BEE4C644F2C91E96257B1909B84ECB25CF438A3FD6B835E20D5CDA56A1FB7995FCAA0EE1B5327FB1288E3C57CBEF0554CA5AD6FCD1F1865C6AEC6CBDB24495700AB5AAF078D8516CA4FA3A231A97C77BD150B127CDBFB42C03702C9027B2A5F6594B022EF55B63BF3EEC27EB0E9529ECCDC82BC6AD1F011F167D602EF1F175DA5DB4028BF08A053AF2C728ADE93B37EDC2A75B7B6C6CF38CD1C07F359C73B131B13DF76139DEE6795F1D85B47F29AE97D0E40CF5DBB67360044F78940A1E80D9D99FD5AB0185210D8769911BC471650DF0FCB9C3AF038F7882F677790E146E612FCDD6FB89F90B7E5E46CD648F4BF8F736D69F8A91E4806346B4366FD48D1481C0B47ADD82003310B0A99B779D63EDE1771F50221651B2D8AF40F48B92EE1327C85A1D2EF2D86378076BEB58556FCAEC6029649A0EA5FDE517A85D87704210E071FCB6F63317AEAC3EB3E9746018E1028C50C790A45B1BEDA6EEA2D646DCE401AD5D7850A5F69CD85301920DE77AB0D01B1361EFA3E70AC05881BC02190720ACC75A691D6064F9D24C79DC72476309E58CDDF5FB2A253D857A79C8E898AB6ADC300EAAF208820CB02F5F2CD317F4052D40DE28E52C55A0349DD855D64E8DA8296D4F572281E221A3D27EF76FEE67FBE5484E6460C99950763B801FCE828E93D2A633A1CA5D7EC582D7C463DA5A9AA8056BB2173306F3820BD0A3273742789B61AF89CCC42B81CC68745800D2A59231D5D28E832F443A871DE5B6B10B58A8AA7CC9816014D7F3545DDF1F481B7F0C9DD41B4D96E5DB767B74776C2253FA230DF65F3E0B944B95ECD4138E2847418B084D9F9E0798CB5247238EC12B88C10A5C0C645E1D09D09059C72E33C28A472FDD8B88EAA93C63BE7D980A12195C2EC3105DF2BB81CC9C3009F7771B6B813CD12303E3A9961D6731AF55ECFE5127BAC68D06F835DD5F2D584FC0E648C3A4256E2A3D4B81966010964657F33D1FE0400724C488D5AACF9F2C0B802CD812C8452E5B8E2B17FF4A1289D33FC405F5DB4ECAB4A73FCA3634756DFBF9012C413B6F64788FD0F68F8AB7620477ACD3C14009377F3DD54B9EAF2784433D63341323F54D113FD63D7456AFEF885F13C13172A37A5DC82336B9515F8F7F4903EF6DBE9CB34930743B6ED11265CF94AAF406DEA9802D17BCB369AD0D9964792F74D338DAFE47EE88B3B74EBA8E70774EDC1F16FA876FD62B0BFF880CE252EE4435B1DEBF36F0A06A4FB406F01D618C135E6103E2A39F4C9CF41EC93702BA76BA753AB49B5836C20F67D05943EDDDF47AB8C5B81F4BC22D773305076F7E5B697A7B25B016190072F756F19F397884E0521595326CA591672684A3BE17C9F5CC8E8F4848F7136762178FBDCC7BC6A6C6A31345FEE687B0505F72BF1AB7EB87BFE5F896CFD42DD67A239C70648B39BC0C84DA33CA17838FB4213C38B68F22914FEC3DC50194E883720719E9B5F8D037DEBB726DBD899ABD97853C54B0BC347A322BFAF961C6CD6209C98AA81B8E2595FC151B1375BF4FCA2DFF49DF40A3D1C694EDFF6E9687E73EF62DD42AD7A05195A7F206F097196AA0E4D68F8132D4A00CEDED940C4F6AE02E6D3763073462C7A4BB11778290E744471EC554A05917E52C5263FF02C07BEE055234EEE10B79175DC164AB2051B03598DF1D4311E87ACF4AEC45C55B1A58B0F05EBDABE248A27C0187643CB8F9529D31FE0AC4A28D780196DA00DACFF5F2DD64FB04E7C159DBBCDD3343BCB7AE188DE15D923D2AC0AF232C5389DC9C949FCE554F7A0425D4F9B28DF2EE4B81740C2B5A5B93F0F7AB75EBD360CBC78B11C28608B5BAFC970CF3D4455A20A198392D876EDCF89E2639B50CD84AE21BD50FB077050EBFFB210BE711D8EA807CA66493650E909911FD3CAD99AB94B2AB2EDFF192D9D75257818272E147A9C54E06C53210FC091BF4175F2F44423669716FD9A6C4F96A0C4BE17839769A806453E55D7357FBFB3D7A458E70957D524C0E896398E135BFA68A0CC136FB93EE7D30AD463E32E152FC32CB8E7F0B05A30EB13C0DF98BC187EC0A54856D2EFCDA10A82B89DC8CD21C67D9B6DF3D7005EF3B2BC9DCD5D55B64DB40B74FD322CDF9D9911A00B5A02E1AD5CA9BF65D90DB709FC1E5FC84BE97574B09C83B49963A51228A667BBD84BFD8E0D90EC161FE5CA73BCB8D95FD7AFD982AB7EBAB51BD2B24CD6D356EB850D2C65593313D8EBB97E7DFA450AE982918582F86A356F538EB05AFD460566D79F040D36C93D3C645B636560007D51B121DE3FAFB3ED70B475AFF9617DA4B52937C628678B109C3B76BC15BD02B766A394893D8EC966DFD8033D12A8D98AC5BE201134325E32CB6786F4FAECD7DCD05AEF5F3739122B817824A672E71DEB312CB7DD6A77116B30715076384297B1962EFDFEE6D6D2B2ED2EA4DD802F4784872D825DB828557D4D927B7232682AD91CEC3E508854F529853A8797B7BF7BFF8E3C180980DDF4081E96A12A495ACDE0C73282AC78617C68A55A94573E5A37B859858D1E19ADC82821B316B9D346ECFC6DBFFB3779F692A62D20D1BC4E730FDE2AEE826E76638ADE3DFAA11057B0BC8A80E8905B15E41D9A4105109F18E7E1362149AE9C568D1D642D65B94253BE2B13E7230F8BCF34DC87241D1DE72A65BBA111C111CBF5BD618CD02E0A06E37F60B3736631073A6BE004C1AD5F0091A82C87B276F7C5AAF6938C886A6039DF23482E2064F6AF05636B4C6BA6B24A29AAF2174AF4BD959177203AE9B160F81CA6764948AFCDACF6BEC0B987C6DBE178DCF47C137C64809483019C5F2072D0301C19C500C60B5CA913C24A8F28F50E1578D806FF9F9B810CA14BF5F2268FA18DEC67D973EB1D975AAF871ABC980D06222493D900CEBD8811FA20D5DB8F8036430F8BD7F9554F7CB47F9EBF389F66C3CCF9F42DB57AFFEE074FFEE4EB3E11612FD8A8FE02CC4E9D2F8BB36C505CECE9DC87512AEB5D8EBE33328C5217CCAF2E1AF1E38BFA84C0035DECD8D8C250FB4D964E8F0AE448AAB740D9EE9D794390686FE9A95183F0D5166D479C51014F1F29D8FEC616E1A4E7A9C86E2AF790BC7BD7BB6F746A2266332E04AFFBE6B9512E6620681C3317DC846E4FD7974E8AE87E370ECF9DFED574E339CD7E8A663ECD1A7BF5842391913D98686F7F2145BBC420F2F58B89131D5F3BE41C85752E13504BCC549A8F690CD2B0E1E29E4DFA3CC76BD398BBF28F33A00C3915DD719F7CB985E9A0A7CC8190BFFC8BF47310C71418D7A6C629C491EB8E455148BD4438BA6B7014608B0CE6A1BC5B035BC174C9BFFD966D8305FE9E5619BCA3FE4B39E6732DC652531819AC828F86EA11360678E786EAA741382D713AE26A608D582A3E4583D45744ACEDD32670B5AD4A1310301B28A174DC9858A55F0C1B7486CD66CB0635083B0C63016E40DFC533AB80C9CFAF1378D00769DCBAD56B09DA3A4E6CDBFD8F3FCB951680020DCA58647665462E42F42DC14E7B20F262D3CEB0B1A2BA807B98D66232AD7D3839C298564BC36A134CC2447B1B9FE69271960459C0A6F897C1878140690DA7D41FD8AAA05A679FDC3037EB2885AD3C82374F4BB991745351292DFD8E54F565E0093776B7EA65DDCD500BEB4D15AF6029F2630A0062F2D4FB331B47B6A5E139D385016E1FA490EAA209636B1383B7D7DC1148F07ED2CC2C03FA7FEE09305F34C57B3CE899C18462B4F1EF88C1AC5259440AAB48C5849652AAD9D3CF3D31F36C7F64F918868182D36345BA5BB7A4EE088D8B081EB78FE977F5A5295177AA427215BB26D1DE33AD4B2D610A47F8C672EEDA703A04D0FAE4C5961F13AD6FCA81863D8A394135565D8B27904A511FD0621A532F84A47CCF4FCC2114D4C369B7A76822959F8CAA25A6495081CA9EC3AC3348A981618592C090B6439CDA2FBC932C8697B3709323E3388AF8EFA1B9CDBD65A65C8F0C302330DDBD10E0235F8030562452EDE447EE5A5A9A636AF6F615B1210AA7CBE69572B3467B643BC5F5EC3F9AD15B3AD918993355E209ACBD0F1393076DA3B0950803295B6571E476ACAA04D48A4627367CB7FAA83796C4178CA9071DCCB8D3EA70381B61F0C56D515E0A765E266DACB13056317AD8737A1AD541AACCEA1641946E331229F19BB54C20BD51E63D63BFFA13110A552FD0A95AB984EF53BD639EFA0568C6875B2798E3A0578C940C0C4197D3587BCB1CC45A99F5D37B1612DC1A4178A3E288FBD79DDACD049159D6A5416F9EF3F38C74449BFB2E6A894566C5C17B4555E154F29A93241463690 -pk = 92BCD6D82BE9FA4E61086EAED913780135F1A52E51AF1796F5D3FD030F8815B454703566AE7AF4EEAF04866B73601D0081B3557E15569F9E0F27E113435CA1FC1E5371C592E98566443A3A3B558EBB19F1327A9EFD092B7FBAFC91A97599BB01 -sk = 92BCD6D82BE9FA4E61086EAED913780135F1A52E51AF1796F5D3FD030F8815B454703566AE7AF4EEAF04866B73601D0081B3557E15569F9E0F27E113435CA1FC1E5371C592E98566443A3A3B558EBB19F1327A9EFD092B7FBAFC91A97599BB01020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085976E0535BAE30A28CE6BDE626FB548941E6FEC8AC22DD4C4229207746D0FB27EDC3F5573D117F6504E8F642C4199ADC4BC2FED36E4296427DCF76A39F0659C11DDE8FFFFFFFFFFFFFFF6894B61FBF7C5690B85A27331B91819AE7079CE90F079AADCC9598B9575B0E891BC602E64DA46AA713BAB40BC1E3A7907A7442E8D56D984B4A367E5230D3120A78DEDFFFFFFFFFFFFFFC670223CFAE1D07669707BF0C040FA5C07EE4BD4C84C116EDEF4A0BF821C9CFC9F753ED48FAE41ACA3AC61FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA550C197F1D7233FDFC99AC18134C97813ED0D7721523B4A0E0E9F7AD5BD33ED3B63F07B36D25676834DE900000000000000000000000000000000000000000000000000000000000000E6E6ED6730CC3A38119094E172CBD4009BC7BBE32CAAD49AE64BDCC826467C62FBE87634CDFECFB85853BE9CD1DC7E029444F9F9C8EF89AB76102E432B136C6F6DE58461A46214623B8E6D04BF7A2A520490A6FEFFA8BEF3436DBC5905C93701B9CA4717F76ACF234212C77C9D68E3EFCBD6913A2034D534CE9941540462561ABA02B14B42DC652CE19D04F78313EA00F6EF43A6A51CE19B6D68C4440F095783C1B90ED2E0F29EB2E54BC4C657B341BA9315A7A61802BE7F9F4FD6B6DFDD3000799764E3C3A1DDA7C2CC4D058D832561673A6848B30BBE29061914B45830FF8310AAC878BAE54031EE56D42C65737D004921C1CFDB326279FA9273375A958B998D78B56D10E0AEC8CC4103494592B2F25C53BFCD39D2D78732F7A1F6536FB0011FB2FD90EB6BCEBE10AAA59213E78E8BD670D3428A66889A2E90F01911DA1D2B655D982025E288D86D59A0B7099C5A005A4DF5E4FDF8BED149D8AF804C7AC4EE6BC2FE932D4656FE4EA1BC8B46A1177A6157B116248B6F5E1C1B3FE6944887026F9CAA7D7CE7002D4FDC2D2EB39AB6E9B85535BEBB2E077F0EEF38F677E61DA83FC62639DA88484FBE098D7DFD9D6B00344BD9248B2D44698CB8CFAA3CE2217F1B9B1FF43CB61E9393016100F7B03AD867C774BD18F86EFDF8F6C7384BE8F800D3560CCD71017E7FF019B90025FE8C3F7C0B9D2BB14EA667B1F2929585DD7D93A12D7F4DC48069D2738D8F8ECB00AF03A5F1616721EE82C6FE68C1EEB043440037EAF6F47AA440F60A6FA6ADE1795F51DC1A8CC963E8A2637F31D5935135F701B91A4223E67E93699DAF18D8D00DB5FC77D13593E69117E072128DF1F51D2A55AE3AF6103CBAAD599362A6070BA5F601118CCF01956A8443C841BE8882FDFE63C7D8512254B9A8EDD47DC51EDB142E0F23D10C9F86AA9820DDBFEC23C7990E03 -smlen = 3365 -sm = 2C51F78473FAC6FE93F6DD14017D2E6740427B1CC83D87601F015314C1A1795EBE150D018D6700D3061020E0902460124234720171197371C1A31CC85CA6434A00C349253AF6F5F7D2C6DA870000F01D90CD050AC89C70592AD1018262CA5BBF7FF8A6AFA6947F01939DD7ECF224A11817490A8400911433376968EB184C99F6B901073FCD22B364FAB053E4CC8301742A3FB18951D0DB5737BE9C0173F6C92606F2E26ACDD2DF3F0050271286306A5680DA38B699000583BE633553425F476ACD78019F6E2465A4739F8A7BCEFA090101871BBAEB596AEE7DA4DD13F53C7822A887A0C64D89A10CBE0E1601E24D3D3E7BF7E69B4CDE216201D53A2D65BD6E05000E545649F30002C7C4451DA90503C43FDED1CCB3DEE468A6A8D9E56670CD8F6A58E7941F1BC5EFA6E2AFDC0141A2F7E8F781D79E70B4813263A9DBC8D8A67F89371CFBD90977EC96461B28BEE4C644F2C91E96257B1909B84ECB25CF438A3FD6B835E20D5CDA56A1FB7995FCAA0EE1B5327FB1288E3C57CBEF0554CA5AD6FCD1F1865C6AEC6CBDB24495700AB5AAF078D8516CA4FA3A231A97C77BD150B127CDBFB42C03702C9027B2A5F6594B022EF55B63BF3EEC27EB0E9529ECCDC82BC6AD1F011F167D602EF1F175DA5DB4028BF08A053AF2C728ADE93B37EDC2A75B7B6C6CF38CD1C07F359C73B131B13DF76139DEE6795F1D85B47F29AE97D0E40CF5DBB67360044F78940A1E80D9D99FD5AB0185210D8769911BC471650DF0FCB9C3AF038F7882F677790E146E612FCDD6FB89F90B7E5E46CD648F4BF8F736D69F8A91E4806346B4366FD48D1481C0B47ADD82003310B0A99B779D63EDE1771F50221651B2D8AF40F48B92EE1327C85A1D2EF2D86378076BEB58556FCAEC6029649A0EA5FDE517A85D87704210E071FCB6F63317AEAC3EB3E9746018E1028C50C790A45B1BEDA6EEA2D646DCE401AD5D7850A5F69CD85301920DE77AB0D01B1361EFA3E70AC05881BC02190720ACC75A691D6064F9D24C79DC72476309E58CDDF5FB2A253D857A79C8E898AB6ADC300EAAF208820CB02F5F2CD317F4052D40DE28E52C55A0349DD855D64E8DA8296D4F572281E221A3D27EF76FEE67FBE5484E6460C99950763B801FCE828E93D2A633A1CA5D7EC582D7C463DA5A9AA8056BB2173306F3820BD0A3273742789B61AF89CCC42B81CC68745800D2A59231D5D28E832F443A871DE5B6B10B58A8AA7CC9816014D7F3545DDF1F481B7F0C9DD41B4D96E5DB767B74776C2253FA230DF65F3E0B944B95ECD4138E2847418B084D9F9E0798CB5247238EC12B88C10A5C0C645E1D09D09059C72E33C28A472FDD8B88EAA93C63BE7D980A12195C2EC3105DF2BB81CC9C3009F7771B6B813CD12303E3A9961D6731AF55ECFE5127BAC68D06F835DD5F2D584FC0E648C3A4256E2A3D4B81966010964657F33D1FE0400724C488D5AACF9F2C0B802CD812C8452E5B8E2B17FF4A1289D33FC405F5DB4ECAB4A73FCA3634756DFBF9012C413B6F64788FD0F68F8AB7620477ACD3C14009377F3DD54B9EAF2784433D63341323F54D113FD63D7456AFEF885F13C13172A37A5DC82336B9515F8F7F4903EF6DBE9CB34930743B6ED11265CF94AAF406DEA9802D17BCB369AD0D9964792F74D338DAFE47EE88B3B74EBA8E70774EDC1F16FA876FD62B0BFF880CE252EE4435B1DEBF36F0A06A4FB406F01D618C135E6103E2A39F4C9CF41EC93702BA76BA753AB49B5836C20F67D05943EDDDF47AB8C5B81F4BC22D773305076F7E5B697A7B25B016190072F756F19F397884E0521595326CA591672684A3BE17C9F5CC8E8F4848F7136762178FBDCC7BC6A6C6A31345FEE687B0505F72BF1AB7EB87BFE5F896CFD42DD67A239C70648B39BC0C84DA33CA17838FB4213C38B68F22914FEC3DC50194E883720719E9B5F8D037DEBB726DBD899ABD97853C54B0BC347A322BFAF961C6CD6209C98AA81B8E2595FC151B1375BF4FCA2DFF49DF40A3D1C694EDFF6E9687E73EF62DD42AD7A05195A7F206F097196AA0E4D68F8132D4A00CEDED940C4F6AE02E6D3763073462C7A4BB11778290E744471EC554A05917E52C5263FF02C07BEE055234EEE10B79175DC164AB2051B03598DF1D4311E87ACF4AEC45C55B1A58B0F05EBDABE248A27C0187643CB8F9529D31FE0AC4A28D780196DA00DACFF5F2DD64FB04E7C159DBBCDD3343BCB7AE188DE15D923D2AC0AF232C5389DC9C949FCE554F7A0425D4F9B28DF2EE4B81740C2B5A5B93F0F7AB75EBD360CBC78B11C28608B5BAFC970CF3D4455A20A198392D876EDCF89E2639B50CD84AE21BD50FB077050EBFFB210BE711D8EA807CA66493650E909911FD3CAD99AB94B2AB2EDFF192D9D75257818272E147A9C54E06C53210FC091BF4175F2F44423669716FD9A6C4F96A0C4BE17839769A806453E55D7357FBFB3D7A458E70957D524C0E896398E135BFA68A0CC136FB93EE7D30AD463E32E152FC32CB8E7F0B05A30EB13C0DF98BC187EC0A54856D2EFCDA10A82B89DC8CD21C67D9B6DF3D7005EF3B2BC9DCD5D55B64DB40B74FD322CDF9D9911A00B5A02E1AD5CA9BF65D90DB709FC1E5FC84BE97574B09C83B49963A51228A667BBD84BFD8E0D90EC161FE5CA73BCB8D95FD7AFD982AB7EBAB51BD2B24CD6D356EB850D2C65593313D8EBB97E7DFA450AE982918582F86A356F538EB05AFD460566D79F040D36C93D3C645B636560007D51B121DE3FAFB3ED70B475AFF9617DA4B52937C628678B109C3B76BC15BD02B766A394893D8EC966DFD8033D12A8D98AC5BE201134325E32CB6786F4FAECD7DCD05AEF5F3739122B817824A672E71DEB312CB7DD6A77116B30715076384297B1962EFDFEE6D6D2B2ED2EA4DD802F4784872D825DB828557D4D927B7232682AD91CEC3E508854F529853A8797B7BF7BFF8E3C180980DDF4081E96A12A495ACDE0C73282AC78617C68A55A94573E5A37B859858D1E19ADC82821B316B9D346ECFC6DBFFB3779F692A62D20D1BC4E730FDE2AEE826E76638ADE3DFAA11057B0BC8A80E8905B15E41D9A4105109F18E7E1362149AE9C568D1D642D65B94253BE2B13E7230F8BCF34DC87241D1DE72A65BBA111C111CBF5BD618CD02E0A06E37F60B3736631073A6BE004C1AD5F0091A82C87B276F7C5AAF6938C886A6039DF23482E2064F6AF05636B4C6BA6B24A29AAF2174AF4BD959177203AE9B160F81CA6764948AFCDACF6BEC0B987C6DBE178DCF47C137C64809483019C5F2072D0301C19C500C60B5CA913C24A8F28F50E1578D806FF9F9B810CA14BF5F2268FA18DEC67D973EB1D975AAF871ABC980D06222493D900CEBD8811FA20D5DB8F8036430F8BD7F9554F7CB47F9EBF389F66C3CCF9F42DB57AFFEE074FFEE4EB3E11612FD8A8FE02CC4E9D2F8BB36C505CECE9DC87512AEB5D8EBE33328C5217CCAF2E1AF1E38BFA84C0035DECD8D8C250FB4D964E8F0AE448AAB740D9EE9D794390686FE9A95183F0D5166D479C51014F1F29D8FEC616E1A4E7A9C86E2AF790BC7BD7BB6F746A2266332E04AFFBE6B9512E6620681C3317DC846E4FD7974E8AE87E370ECF9DFED574E339CD7E8A663ECD1A7BF5842391913D98686F7F2145BBC420F2F58B89131D5F3BE41C85752E13504BCC549A8F690CD2B0E1E29E4DFA3CC76BD398BBF28F33A00C3915DD719F7CB985E9A0A7CC8190BFFC8BF47310C71418D7A6C629C491EB8E455148BD4438BA6B7014608B0CE6A1BC5B035BC174C9BFFD966D8305FE9E5619BCA3FE4B39E6732DC652531819AC828F86EA11360678E786EAA741382D713AE26A608D582A3E4583D45744ACEDD32670B5AD4A1310301B28A174DC9858A55F0C1B7486CD66CB0635083B0C63016E40DFC533AB80C9CFAF1378D00769DCBAD56B09DA3A4E6CDBFD8F3FCB951680020DCA58647665462E42F42DC14E7B20F262D3CEB0B1A2BA807B98D66232AD7D3839C298564BC36A134CC2447B1B9FE69271960459C0A6F897C1878140690DA7D41FD8AAA05A679FDC3037EB2885AD3C82374F4BB991745351292DFD8E54F565E0093776B7EA65DDCD500BEB4D15AF6029F2630A0062F2D4FB331B47B6A5E139D385016E1FA490EAA209636B1383B7D7DC1148F07ED2CC2C03FA7FEE09305F34C57B3CE899C18462B4F1EF88C1AC5259440AAB48C5849652AAD9D3CF3D31F36C7F64F918868182D36345BA5BB7A4EE088D8B081EB78FE977F5A5295177AA427215BB26D1DE33AD4B2D610A47F8C672EEDA703A04D0FAE4C5961F13AD6FCA81863D8A394135565D8B27904A511FD0621A532F84A47CCF4FCC2114D4C369B7A76822959F8CAA25A6495081CA9EC3AC3348A981618592C090B6439CDA2FBC932C8697B3709323E3388AF8EFA1B9CDBD65A65C8F0C302330DDBD10E0235F8030562452EDE447EE5A5A9A636AF6F615B1210AA7CBE69572B3467B643BC5F5EC3F9AD15B3AD918993355E209ACBD0F1393076DA3B0950803295B6571E476ACAA04D48A4627367CB7FAA83796C4178CA9071DCCB8D3EA70381B61F0C56D515E0A765E266DACB13056317AD8737A1AD541AACCEA1641946E331229F19BB54C20BD51E63D63BFFA13110A552FD0A95AB984EF53BD639EFA0568C6875B2798E3A0578C940C0C4197D3587BCB1CC45A99F5D37B1612DC1A4178A3E288FBD79DDACD049159D6A5416F9EF3F38C74449BFB2E6A894566C5C17B4555E154F29A93241463690 - -count = 94 -seed = CEECCCD3F7BB922650E3F6E8F20C47AF17C1C1053EA8FE08226F167D67C3B0781BD774C4C7AAD23C6AB0B9F3E3F96F97 -mlen = 3135 -msg = E13692E3CC06EBE8FF9A292D890F0A34DFE9A4F968F196B475AC4DF553A30E2FD5DF008DF4D7508302AAF6389B6A5A9135E9BC8A5ACCD2BD2DF98FF662B763101D31E24E8F182FA50840BE27F76BA5ED645BB4D3F7F2F6CE25179A47FD7B6441A9B3A28783CEEDB425B2912734A75D7D03811172188253BD8F0F52EAEE84A9FB025F95EA1B566C53297A6A090F7FD8B21639523E073ADAA750D63DA61631F933FEDFFB2819E0EB3074E9E11E10B102AC88E2C8D6CF408FD241AD301F9B8E18A88B74CB4B0DAC76347635DFBB3EECFDF84229BABCC003C6E4EFB7394E25667DD7FA47D36E027559F53E98789E6E732E6AA23A71607677FB975C2852367C5BA5E3D10B3017AD26F9A38CE803929D08A43646FFBC3980B359D8BC2E9615636D4E5DE8DE6FB2465A983EB1696E98DD33FAEB7AF8C2D30506B22390D7F9FC21C7A016FDF22D21ED2EA4175FE9F5F44598EC26452700DC9A495675431E1236865F2F4AA5BC9C9A10EEE9E29B1FC4FEFCF8F24BF94342FC7E19AA6534C3B771D910AA419EA2BF70E2C1915891CC630A3397551E4F34BD2192B70EB210EA67CF152A35A3F5D0878E153579B42AFAFE5068B2BE2B48127FFB54553B7A9B6F845E7D72C43938AE42BC03E33B836AB212909510AAE7DBE8EE6D0EB8AD84D60832F3151273A1E09C514C3AA4CACD15564643F4255F36059022B91BA4137ECD97B34BE3308D40EF06BCF4F45EC625B54C7347F52A21815508199C8B7A6212779CD171894DA9FC3DE2A6EF5D76BFE03B8199ED1DC92B2A403E4DA009CBC0FB597C5952BE32579EB8E781EB12D935848C051029C528CBB68CBC1DE0102B42561E21F48E72E028C2CD8816A9027914571B49D2F94C9189E1A7F18D7D3D0A09B3A36EDB8A084ACE5FCCC77E3E42EDA0FBAB8C81EAF170103CA757981839C9448362BCAAAA3F20C8DC653AEF36953559F3597E1915F02A8D33D0E46201FC794EE055E6D9955B91FC7ABA1F136C280367404725CB355FC2F129413581401F98236D2A6F8BED7FDD7EA99060DABE3F0E8CE20B0E98EA80994D1673E8CCC6A0BA4A9D544F3D31BD95C9D3847527A978C1F155EFD84B6A7BECFB749628CE82E80285FC7272EA05F953404E437AD557F38FD9BBF77A69B81E4441605B23F2AAEDB00C7519D8E9CB4CAE5F8C3FA74FAABF6C12595BA045F647ABA7168C65C8A6006733D1341435495C7088C3361B50C43787EC24C24F57323466B5C088E8097B44666453010DA38AD65B426E72140AF78A5448B2F93DF3820F013FB9DCAC49604C86F2B2E4EA565463917285F148E8BFA9E11943AD3B86B14ED59A190CAE097DB26DAF8FD2A642676A37DD90C23B52C82CE028B80A805D9BA05457F7B6CBAECBA4094822E16C14D6E2291B731D581B12FB16802653360AAA6A7989D61C80DEBFCCE81A36D9ECC84039C4F086A5579D36FF5D0CBE61292E4FC3D14277AF380A9C1DBF36C2D61F59CFC0D62524E042710BFF5BA719E56BA367FFE849D660B9F7F3B638E113BF2E1A4DB1B8F65A0FD680BB2A168A4FD5B4E0EDF3208AD47F1FF4AFBAA726E38763CB5C84C03DA3D1E32CBA873B9A0C750922CD3D0A10A4877EAFEF602F5C875FBF0EE2F4F0AF7F308EF934F7E8E74FDA62A860BB594FD061D1B2BB32BA613339042FD90E749ACEF450D204072ACF58B18C365E4F4B815F1E837453C4255D53BB68D50F3677E7173FCC23D2B592149A9F3DD615868AF91F705387547862D34553FD45B8DF643F596DFDB7ABA47BD5D91445826C86FD4D30365A2F9A3CC0913DE19707D072F27A09EAB906304008875B5BE3526210D6B8BC8663975A1F78EAB9CD7F7305CDD4C00D6277622E50606E1CADD639730101D088BC2BAB295AD86BA8E26F5EBCB3E9C7C543E533A7B3C20F0F89001775F714825DC8547BAB06F5B99C5305EF18372A184569323FE269D45B669B9A222C9DEFBB0B2C84F42A57EF343A5C12F5712EEC33985DF8F0C566D471A9403FC103A3EEED42829D8E3E5C517BDE29447841CE96C8AC587DF3E4B6227FAB386140DB0112ED0D2846355C4A45E94F3A0718CEEC13FD3CAAEEFDF0B7F89F502AACF8C9D96D01B5549157B7DF2BE65BC30C889E69971700286C561DF91C8CB923001E5F0E21D2C7A3DFE8D1AF07FECE1EDA20C031B29A4389F265D2C7BE64EC37B2884849EF30FC8A82D2F766ACE68C72F0A4B72F3B50884749814387893DB2370A3410F794C64CD24BF0D13E44AD500BA9816F9BAED72F7593F758592C2E974D1207A664B869130BAA1FA71DBC55875134E7CFA276E36568F79483886099A1070C14C6E4EB87523E04C0154A2250624261211723453CFAD185298DE06D08CC25FA18BC58B34ECDF5D9DBB02541BAB4A2AF110AE09130E12439F1CECC34F9AB5D7BE36C827A6F2F6708B543D4AD2E424805E2A74895742B0A5DA30CABE4AB45F40CBFCCBEEBDAB9B8EB8F78781168B5BC79E04EFFE1757AB0547B9BD0D2625673CE528D2B4874D46DF0E09C24FC413EF9AB4C3D2E803C1E316D77FF5DE3368BB925B2B1F6FFC340525663931F5595C8AAAF9FB0DCCDFA4793519A66D4FDE38BD2044C60FD1DE15D60BA878FDA570E7AEF6DB69D2527A1F1481A9D05FF2F6F621238939ACF5D2C37B2BC3A194A9E65E7441764A5EE37B1FEF3B8C9C425BE1B5FF0D05BCB6A3B91876EC04ED89A31749FD443C2B85F8F388E7070D77DEE37E2B666628CC9A961236DD24AF2769C1F613B4E77F8E82D1F410ED59F63F1DF19BC53A448106DE4F8EFB8CC37E40144B0F658A4135E25A3CF36D8692DEF2677E4BEA3A9770F19E44D55080625421D5BADEBEF3B39BE71C08650B5718A9B2FCEFC4BECB26C4B63C43F6557DD66517D103907F82F9C2B965B7C5E36059D2159183F5ACB8B5FF5E6B92E94D53AB25AE955424E80EDEC4650BE293E836DA6148392C500FF4B7672932E90E068569B81AE335B2E5013CCC95F571948D58127EB1269A08D6E897D2D9B60F3E49847C05D0B3AC230A67EB6D38FFDBD4B8D82D7B9EC803429C701F080BE86FAA165C0111131712DB4957FD84A8936AB55558C69D33D5890CADD08D7F0D4962CF9E2F69C7517E79DB14B76E6E188F5ED95169A2A7E4C0EBC2175EC2DD44ABCF239CEB3E22F955ED25DA41768CA5FD9A9AE15FAAAFEB431958A679249AB8BF879185E8FBF9986B96A92972153B4CD0D1BE001E5AFAE3AD1F0B1191F1483738E728D4AD240538E5EF7BC9BA4D5903929D74CB64241306FDBAAAE17B1C3134AED2CC394D3EF9653CC62A29C4B0B9BE04E95E072EC98F7A80A7B575DED4A1993AA884C1EDFFE056EC475D934B4EB0EBF418975728C6E9CB3919B2B67D2C71228A4DF1FE2C8388E3A2BDD75549417FE795F1947F857B1C0C9CA021515FD4D79E691493B988080943C394BF29E4190082A94F224AFDE5853323EA51C06B41547EEC0DA5CC202A048D77C7B91E794C51E72B02EA7C14578C11D9DF48E099465783E496029EBB6D42D9CAA52902A4694355DB01DD7F5D7C113AE06E3F712FA577E937CD4FB817659F93964E194FE7D509A81C258C69C3415A8F11D35B414339FD1CC1D4F50665D9111592D1C3A3D69FCF6A971C285A94F5FFBFE8D2FD2746DCEB3B218D970D670D10135126E479D92000D41EABDEEA4C04D1748A4908DD39C60A52AA5FE29C8ACED50DC1295B5C2C4A98E3C62EE4F370F4D3E500FE27B66F65BAE604FD558D66B7F09CE36C36C8B5B4FED193EF56D1D8DF0FE6FE0031466A1C633203966FE83D6BFF843657DC0AF176AA8D5CB7312CB4E072BCFF24D5F3828E29B2037E8D1FB63537C70C27011E9A97E3F04895F4E84AC69C55D450B46D5792A5D790557BE64F765FA243AFA98527B976783E7ACDF76A7E1DCBDA72431FC30D7B05197478D8D74077626FF7409F95B24A1F1BB6B803B9F1B9AD5B06883FAE6C4B587C309A63F3B2FC9619032157B98C1DA9608107E87F4FEE0DAE995AB86AC9869446CDE92441F0B9F8240E6F7F7AA9189D92B7FAA3280FA749BA8C7729F8974049C5CBCB8C6650CF1C16B8194C7AE1A82B40B8B04488FCC69E674362FE4821D4C1846CD9BC49234BCC464013F5F9A082FB83D63098C331D4B1C9129F52259CCAF4A9237F8EC5BCCF06F230C08DDAF1D0C21C5930F55D3D5F60CBFC447E7FCBC75CD199733F8D17BD043B67B0C138CB0C9C8F2E477728F27DEE573796F71B013689B537AEAD4991E67F2F5EB94BFAD9509D7C235C9E55F68F26B9CE8AA90834D170F8B700A40AE9A817D5D17B1644D25BCF1172A5CF0C755A6EC04FAFC39DB06AAA05F5988E187B9E110EEDEA9C84B99AD29A4B31950F2C870A1F91DAA6A5817FAEAE516FA42660FCF56000F7365D8C6CC11D4784C6FC02E4D0C727806E9D43B957BBA124C980C31F81FACC6D46F6C38D227EEF8F0 -pk = 11A3A94CF121C765F3AB61BDAF9E53C73F68E613C8A3358103B29195072AB613FA267E430BF89E8F79CBE007B62EC30328DEED5A458E2154E608C45B37E58650C2A340A13764EEAEBA0AE39FC0B1A536FEA28959ED0F6B40A938ECA5693C3201 -sk = 11A3A94CF121C765F3AB61BDAF9E53C73F68E613C8A3358103B29195072AB613FA267E430BF89E8F79CBE007B62EC30328DEED5A458E2154E608C45B37E58650C2A340A13764EEAEBA0AE39FC0B1A536FEA28959ED0F6B40A938ECA5693C3201020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088F6CBDABB4A0B8B6AE25C302CCFC9B0ACD0491DD8CDF53FF862E6BE22AED96A7CB1BD7D6ACC33D342CA31EA7474D7D49BB35AEA71E1C8DCDF67E39E3E7E93C46A653500000000000000A1D84EC43B89004EB639478B138DC1381659C48D92AFD924B835412B1F6BBB76B4FEF45238F852F62122597596F3A6905336F522502757D8D5156C3C45EB1A4120E0DEFFFFFFFFFFFFFF99879BA863BF51E2F80FA0F5BDFF47583BD29863B0F367B7FB9B161F03A8B22CC82C00F68EF31B5325EE1F000000000000000000000000000000000000000000000000000000000000007C67AD516FDA68AF8B3DBCF5FD66B499DDC4FA42698F345B0FFE8FB111ECDE2B143CB9CA4DEA9ECE72130A00000000000000000000000000000000000000000000000000000000000000CFEDD5903300EBF0DC349651F961A4422327D9997D9388B2B0650D76362730E1C8339CA9AA530BD7A1144C13887C34024BC85092AC8A832831B0B6DCB0C5BADB11FDC7DA4F72C7B733110D5FF3D7D9577569980387A1A027B1DF980A1307CE0054143A628A2E0F6253074B0196C32D7973EFA1B3E6F047B327B7477CA5AAA70A1643DF3DDC0147F0C13A666ABD1C000187C8B72EBC8092CFA7D85E0775B1BFDBE2B74FA6572580A611FE005760663C8E9DCEC1714A4B6F95A46A8E17589123017DB8532C7FD99EE4EBC5C93492AAD1BB931909FC3EC436CAC977A9BA3FEDF38809BDE2AFDA140D8A292135D11C149003F357492C1A457BCD75318BEF36C8ECA1A56C8862067A5E5ECDE71DD13FE8A6CE437C708B8F5B25CB4D9205F43CB1D202F571316EA31063D09B0C5DEF55A3B46988313E11318593626136ED430BED4DA04817CB2488FAAA61C51AB557C8933E00F5AE69C3720F3D4EAD8D1D9965D186E95BC2817B1439A7D4EB7DFFC9A9106A4702B14774897A1E01665EBEA9BE0FEF0298B397E6DD32F444043226BFB61E58ACD968AD0DFB9FC885459E43BD0C67205768D82DB9C56BC289A7EFE71C76337302C2D8CA14AE1F6CF53BBDBA502F71C4253082A1B2845DB4DA8C3D8D75CBF3540183FAAB2E31131FB08AC30E2EA9A01602E1661C2887FF59E30C81C83224092B40137BDA11676A686E08ADA66161A77AABF56A9B69A680BAA3BF56437784ECB801C2C02424B08880F0FC89C378C278A835551058C8CDE4A17C8254938AC04C0401815E514FC010CB89654797611531E501EF7E27048D2262A8F0BC164DD69E5A437F8B006A019AFC8A76A244EF354FCE9D0E7DC5509DF53CA8D1C9BEBF4AB542003A089E096623C7F69FFA08C20F012B7E0D380A609B8F556A7536F261075BE4F37287BDFB917D3BE39FF5C3CE2D810E00 -smlen = 3398 -sm = 790561E5D9218032A6B565FB00F0877BC7AA6F45F09DDA4279019610C9A0AA69D3DE6C22537B0032B87D788BE3F16A9880ABF50083F9AF8ADB727273F1C11682018D2B39CDD04B4D3A6E1CB8F10189A7E06D91C8092EFFD54589008F4B0BE599956559ED81461B00784F45905A0D11485ABBF5DA01828A75F2F0915DA03193841A00805CB70CEF3B6E0828688D7D000E7CEB528D413A819EAF1EA9010DD5BEB338CC214E8E9996D700E2916DC38D73B4C3E857380A002B5D17E53DBACC4FF721F83E000ECA7A632E4A5EB4678946A600019599AC91D357DD96880E5C3513074D28E70BE551D0A4DA3C951503B4AC5F12CF164FE0661C64A0003EF66E6C8A59199233F930918901E13692E3CC06EBE8FF9A292D890F0A34DFE9A4F968F196B475AC4DF553A30E2FD5DF008DF4D7508302AAF6389B6A5A9135E9BC8A5ACCD2BD2DF98FF662B763101D31E24E8F182FA50840BE27F76BA5ED645BB4D3F7F2F6CE25179A47FD7B6441A9B3A28783CEEDB425B2912734A75D7D03811172188253BD8F0F52EAEE84A9FB025F95EA1B566C53297A6A090F7FD8B21639523E073ADAA750D63DA61631F933FEDFFB2819E0EB3074E9E11E10B102AC88E2C8D6CF408FD241AD301F9B8E18A88B74CB4B0DAC76347635DFBB3EECFDF84229BABCC003C6E4EFB7394E25667DD7FA47D36E027559F53E98789E6E732E6AA23A71607677FB975C2852367C5BA5E3D10B3017AD26F9A38CE803929D08A43646FFBC3980B359D8BC2E9615636D4E5DE8DE6FB2465A983EB1696E98DD33FAEB7AF8C2D30506B22390D7F9FC21C7A016FDF22D21ED2EA4175FE9F5F44598EC26452700DC9A495675431E1236865F2F4AA5BC9C9A10EEE9E29B1FC4FEFCF8F24BF94342FC7E19AA6534C3B771D910AA419EA2BF70E2C1915891CC630A3397551E4F34BD2192B70EB210EA67CF152A35A3F5D0878E153579B42AFAFE5068B2BE2B48127FFB54553B7A9B6F845E7D72C43938AE42BC03E33B836AB212909510AAE7DBE8EE6D0EB8AD84D60832F3151273A1E09C514C3AA4CACD15564643F4255F36059022B91BA4137ECD97B34BE3308D40EF06BCF4F45EC625B54C7347F52A21815508199C8B7A6212779CD171894DA9FC3DE2A6EF5D76BFE03B8199ED1DC92B2A403E4DA009CBC0FB597C5952BE32579EB8E781EB12D935848C051029C528CBB68CBC1DE0102B42561E21F48E72E028C2CD8816A9027914571B49D2F94C9189E1A7F18D7D3D0A09B3A36EDB8A084ACE5FCCC77E3E42EDA0FBAB8C81EAF170103CA757981839C9448362BCAAAA3F20C8DC653AEF36953559F3597E1915F02A8D33D0E46201FC794EE055E6D9955B91FC7ABA1F136C280367404725CB355FC2F129413581401F98236D2A6F8BED7FDD7EA99060DABE3F0E8CE20B0E98EA80994D1673E8CCC6A0BA4A9D544F3D31BD95C9D3847527A978C1F155EFD84B6A7BECFB749628CE82E80285FC7272EA05F953404E437AD557F38FD9BBF77A69B81E4441605B23F2AAEDB00C7519D8E9CB4CAE5F8C3FA74FAABF6C12595BA045F647ABA7168C65C8A6006733D1341435495C7088C3361B50C43787EC24C24F57323466B5C088E8097B44666453010DA38AD65B426E72140AF78A5448B2F93DF3820F013FB9DCAC49604C86F2B2E4EA565463917285F148E8BFA9E11943AD3B86B14ED59A190CAE097DB26DAF8FD2A642676A37DD90C23B52C82CE028B80A805D9BA05457F7B6CBAECBA4094822E16C14D6E2291B731D581B12FB16802653360AAA6A7989D61C80DEBFCCE81A36D9ECC84039C4F086A5579D36FF5D0CBE61292E4FC3D14277AF380A9C1DBF36C2D61F59CFC0D62524E042710BFF5BA719E56BA367FFE849D660B9F7F3B638E113BF2E1A4DB1B8F65A0FD680BB2A168A4FD5B4E0EDF3208AD47F1FF4AFBAA726E38763CB5C84C03DA3D1E32CBA873B9A0C750922CD3D0A10A4877EAFEF602F5C875FBF0EE2F4F0AF7F308EF934F7E8E74FDA62A860BB594FD061D1B2BB32BA613339042FD90E749ACEF450D204072ACF58B18C365E4F4B815F1E837453C4255D53BB68D50F3677E7173FCC23D2B592149A9F3DD615868AF91F705387547862D34553FD45B8DF643F596DFDB7ABA47BD5D91445826C86FD4D30365A2F9A3CC0913DE19707D072F27A09EAB906304008875B5BE3526210D6B8BC8663975A1F78EAB9CD7F7305CDD4C00D6277622E50606E1CADD639730101D088BC2BAB295AD86BA8E26F5EBCB3E9C7C543E533A7B3C20F0F89001775F714825DC8547BAB06F5B99C5305EF18372A184569323FE269D45B669B9A222C9DEFBB0B2C84F42A57EF343A5C12F5712EEC33985DF8F0C566D471A9403FC103A3EEED42829D8E3E5C517BDE29447841CE96C8AC587DF3E4B6227FAB386140DB0112ED0D2846355C4A45E94F3A0718CEEC13FD3CAAEEFDF0B7F89F502AACF8C9D96D01B5549157B7DF2BE65BC30C889E69971700286C561DF91C8CB923001E5F0E21D2C7A3DFE8D1AF07FECE1EDA20C031B29A4389F265D2C7BE64EC37B2884849EF30FC8A82D2F766ACE68C72F0A4B72F3B50884749814387893DB2370A3410F794C64CD24BF0D13E44AD500BA9816F9BAED72F7593F758592C2E974D1207A664B869130BAA1FA71DBC55875134E7CFA276E36568F79483886099A1070C14C6E4EB87523E04C0154A2250624261211723453CFAD185298DE06D08CC25FA18BC58B34ECDF5D9DBB02541BAB4A2AF110AE09130E12439F1CECC34F9AB5D7BE36C827A6F2F6708B543D4AD2E424805E2A74895742B0A5DA30CABE4AB45F40CBFCCBEEBDAB9B8EB8F78781168B5BC79E04EFFE1757AB0547B9BD0D2625673CE528D2B4874D46DF0E09C24FC413EF9AB4C3D2E803C1E316D77FF5DE3368BB925B2B1F6FFC340525663931F5595C8AAAF9FB0DCCDFA4793519A66D4FDE38BD2044C60FD1DE15D60BA878FDA570E7AEF6DB69D2527A1F1481A9D05FF2F6F621238939ACF5D2C37B2BC3A194A9E65E7441764A5EE37B1FEF3B8C9C425BE1B5FF0D05BCB6A3B91876EC04ED89A31749FD443C2B85F8F388E7070D77DEE37E2B666628CC9A961236DD24AF2769C1F613B4E77F8E82D1F410ED59F63F1DF19BC53A448106DE4F8EFB8CC37E40144B0F658A4135E25A3CF36D8692DEF2677E4BEA3A9770F19E44D55080625421D5BADEBEF3B39BE71C08650B5718A9B2FCEFC4BECB26C4B63C43F6557DD66517D103907F82F9C2B965B7C5E36059D2159183F5ACB8B5FF5E6B92E94D53AB25AE955424E80EDEC4650BE293E836DA6148392C500FF4B7672932E90E068569B81AE335B2E5013CCC95F571948D58127EB1269A08D6E897D2D9B60F3E49847C05D0B3AC230A67EB6D38FFDBD4B8D82D7B9EC803429C701F080BE86FAA165C0111131712DB4957FD84A8936AB55558C69D33D5890CADD08D7F0D4962CF9E2F69C7517E79DB14B76E6E188F5ED95169A2A7E4C0EBC2175EC2DD44ABCF239CEB3E22F955ED25DA41768CA5FD9A9AE15FAAAFEB431958A679249AB8BF879185E8FBF9986B96A92972153B4CD0D1BE001E5AFAE3AD1F0B1191F1483738E728D4AD240538E5EF7BC9BA4D5903929D74CB64241306FDBAAAE17B1C3134AED2CC394D3EF9653CC62A29C4B0B9BE04E95E072EC98F7A80A7B575DED4A1993AA884C1EDFFE056EC475D934B4EB0EBF418975728C6E9CB3919B2B67D2C71228A4DF1FE2C8388E3A2BDD75549417FE795F1947F857B1C0C9CA021515FD4D79E691493B988080943C394BF29E4190082A94F224AFDE5853323EA51C06B41547EEC0DA5CC202A048D77C7B91E794C51E72B02EA7C14578C11D9DF48E099465783E496029EBB6D42D9CAA52902A4694355DB01DD7F5D7C113AE06E3F712FA577E937CD4FB817659F93964E194FE7D509A81C258C69C3415A8F11D35B414339FD1CC1D4F50665D9111592D1C3A3D69FCF6A971C285A94F5FFBFE8D2FD2746DCEB3B218D970D670D10135126E479D92000D41EABDEEA4C04D1748A4908DD39C60A52AA5FE29C8ACED50DC1295B5C2C4A98E3C62EE4F370F4D3E500FE27B66F65BAE604FD558D66B7F09CE36C36C8B5B4FED193EF56D1D8DF0FE6FE0031466A1C633203966FE83D6BFF843657DC0AF176AA8D5CB7312CB4E072BCFF24D5F3828E29B2037E8D1FB63537C70C27011E9A97E3F04895F4E84AC69C55D450B46D5792A5D790557BE64F765FA243AFA98527B976783E7ACDF76A7E1DCBDA72431FC30D7B05197478D8D74077626FF7409F95B24A1F1BB6B803B9F1B9AD5B06883FAE6C4B587C309A63F3B2FC9619032157B98C1DA9608107E87F4FEE0DAE995AB86AC9869446CDE92441F0B9F8240E6F7F7AA9189D92B7FAA3280FA749BA8C7729F8974049C5CBCB8C6650CF1C16B8194C7AE1A82B40B8B04488FCC69E674362FE4821D4C1846CD9BC49234BCC464013F5F9A082FB83D63098C331D4B1C9129F52259CCAF4A9237F8EC5BCCF06F230C08DDAF1D0C21C5930F55D3D5F60CBFC447E7FCBC75CD199733F8D17BD043B67B0C138CB0C9C8F2E477728F27DEE573796F71B013689B537AEAD4991E67F2F5EB94BFAD9509D7C235C9E55F68F26B9CE8AA90834D170F8B700A40AE9A817D5D17B1644D25BCF1172A5CF0C755A6EC04FAFC39DB06AAA05F5988E187B9E110EEDEA9C84B99AD29A4B31950F2C870A1F91DAA6A5817FAEAE516FA42660FCF56000F7365D8C6CC11D4784C6FC02E4D0C727806E9D43B957BBA124C980C31F81FACC6D46F6C38D227EEF8F0 - -count = 95 -seed = 2489C04BA57D149A60F446670C13C29998B52F3BAD548A751D7134B694DB25ABFA034FB4BA45E105AE27D575CBD02B99 -mlen = 3168 -msg = 1F7AB96E8C14D1A5094672D7034FA8F81703A2CC18983C972CC66736CD98B031AC8A479CED21A1F634938DF85F3E83161646DB81B9AC3EA22F80980B8E2EBA4E9975714E5A98985817F426C41F3968349686B69AF917564A2648401B8FA127FC3200DC16A9E663D1D345EA83131E21229DD39E70D7270DE7577A7E9635602FD2C30EFAF204A9234F0A73D21375658B0B0B04927E67F3F5534614EDF5137BADFED914A49AA301000092DA93B3FA4A0FF592CC3A53F4A75B54FEE775EFA421EEFCD6E0D32FB5CDC096886076DA940B26C6E07F12F6E08FA7B3E2DC42055308E5607A2732717AE592A6909C6E084252A5B08685FE8C6C1DA387B0AA9800B67CDB3EE2FB21B9BE5E6B79AB545563068441C0C9C1E68CEF6028A5CEDF27D3CA47D95094C9E1E68B8449758BE3FF8FDE148ABC420295DC76E3EBA8E11433217FDC3136551A5A41C1C7E7D6EF43601946897FDA54842D8F73FAA7EB7ED0DE544FEF2A95C6FECB13C8C0F14B5B22493F54374184B73D5BD47383BBC5DD7BC1BEAC0CB8E66D2F413A9DCEB7E1D0EE2D63B9EB28DB232C33A95B792AE67D2591F5AF59DDC45771A0E7195C4D25E7F4079359597678B0C0A87DF3D66A686A9215DD566D4722C212AD05A23E1377E37E18A6AB3AB8BF5CD47BF1BAF06EB05E4C150CA67D7E52BD297A08CFC97B575752E686B83575F425F3A450BB0F596A60E41F7183F463007FD019EE255BDEF1D98B7A0A12EC33B3E2BC9BF0CC8F4860DEBCFBBD5E40B2ADC2CD10EC35A341BE7A49F8D204FDAE86921B7DE5BA700A61E2B041A8EA7040ACEE844892E5CF025FFEC5322FF6D765BFF1107C967A12ECCB0489F64F8C13BD7057DF76485446641AA7A560C7E73008C46572628E1A225A8D3F6D68DDC9759A952FC07CD43DE4434BD3391089E900275E9EBC92563AC1403BB7DFDD182092130E3E6AEB7B666F4BA66C38BBE1F726F40A07DF6C42079A6054399519E26D765CA065F4DDFD27A29CBA292699CD826FA9D3E7EE31B0D76813879DB5EC5C7F454095DC3BD27323DABD2DFF949AC760D6137334507816330FA67D886021661ADC69AEBD882A07E01B4B6E5492399ECDEA99222EE785C810B30409DFAF2A3CE5A05D699C2368249C9588D86FEAA778B4860D6DD442088A21D2D9D0B49B15EC579776812AF8AD582F1C44BB6432D7472300B5440A382ED87AB64B20373A0ABDBCE391D0BFFC9C543EC686449FCA9D04B7141836A416720BDFF250A06D7651A1F98EABE4B340B2303591D0847AED6FFE423B6DD8C0C03459C381DB506F531343F82C116323899DF1E5D8DB8997BEC12EB70103F0BF2B3D53C4D4694052606EE32BE4F5B35450358D7D85062DCF7F0BDB51364700BAF92CD6ACE4E2C10E6CD9A332716F5F4BF7598466A99238357798A499C9B8BE77690635C57E7D87A904B3F2278C0B1B23E5860B0532F152E1626C86FD855F656B5D070BC81CE4634A87C8EA6D6A433C02DD2E6D6561B25968B149A6F3BBA40B749F188B84314B5778A000CAE91A53D59860EE6F7DF38CA0935CD64C08A34BF19981C17951B9C39A847D0637441452E38CE5E1D9B99BED51B86705CEBB8D3244C40BB8D70F846936A2BE29C21604A7E6BD3E655022B929954F6C9A5743F5FC2127B49956D80128DD582CEAA06FC174813E5F5E6A0A4D7D26756FB28A6588E9410722591CCE2A6C6ED0976B98E1FB0C642D5DF8F08E96BAE1FE10375FA1D7C70806101570FEF1EBC8F58664281E2B61DF2081B655013AEF54616308504F5F4A1E8F156680163489D3FE7BB0A514F1D2D57EE6302853D7D03C767C7BDFB79E2B8C80403F26F6EDBDD6A890A0A0B9B76D334E0F729FF9C47BFE960A1C3FAF77E81B9AC156367423DBB4D766A1F3B1E67595EFFD76287F22BC37DA4F0204633E804002EB7C1AD0836FA4D01E2FCDEAB8457DFC3D8B7F1151BEF3574F8F4653AA3780003787B8891901ABC8250A974C15F2DDDF9E1BE6798647EED710D06CC3FB4C276BFFA585680FC632D8EFD1614745BC3C72B82C53FEAE935EA5014E2B321F69BADF570FAD878C9590FD20FB7BF1B31E373DA93D1A8C63EA45E698CE060FE70ABA0FA84F37E836F2AD2998F07101D3FC7CA2B08B1398E1687ED5A8CE860EF9B4889FF436B74D13281D1F6A7EDF1DBE8989BFAEEFE6A475E65217643E757006871E664099F5B3846553603CD9EEF8FC195807361FBFDEB8DEE6A0B79F009C10DF397FFB865F4EBD0473D458D553358029C6B5A95D6FFEE9B645311D10A8F479B7E5249AA87E3DED08311B4DDF3A458FE61AE294A22643861826ACBBC9B0EA8B73157CE15D1FF35098AE67159B07CA7499398C26776DD9884B5D3786C87D48E864D8BBE2B73E2890F217E135BFDFC4DC5E805D9CEFEF5268E33DB611ABA6A5D57EC82B7246A63DCF3EAF3A51CF503D65C206D2362421DE774158AEAFFEE45A6B5AD5CC0B1DE0E2EA74E97913729A69E9C00A309DDCEB7738BAF4757EA9CC96E055BBDF692B12D8B01B92CE5ECF3D52187402CB7FD961A2672DC1875B6EA22AD7F5F42B1B52BA2D780F2E6C5B25FC7E30B1B663E3A09C8FF0B5C302E0E7F984DDCC62DDA65FD996E17DA72F02A16C354BBDAD44C5B5044759BD53789B98BC58CC25FCDF10A9CBBF0FD6ABD58A4CEDD92C5D85EF22B3C5EE5D9440CE42995517D2F7352CE997F51A36B9FA5703B4C6491AD01F406FD1B5BF85321026D28B51354DADEDF057B37743499A986469F908A01F3C1B74DEF5D8E2F57ED25A80720B540333109A0A65E7984B557F65429F3D3BD7EC3732A10D7AF36DD5D2414A09949A0F57F37BD9021D2C482E61437CC15E9DFDD92D4C212C4FC6C22C54591E5AFD48210FDC88040135E433F50E45874E0D5EE2BBC857F2C80E2FA4FC7ACFEC8EEC0CAB351F677C790787C715945C21BF923EDC0A58878AE09ACF5FB5A003C9C0B6E30A450CE6DAD4B626108B88E89F1E6A7BB3843E1EC8AEE35AF69E81773CFF71190F819CCF24142D60AC51B80B61019EC7ED2EFB6C5F18B499FC9727BED2E3324F8B94A522092E0A98241E29F8F14C6561DF3FEA0824F9CB0FE10BB497E427EE62085E7AABB2900FA47BF27C1638BD116C5555C076DEEFE9754E8ED333D72CE9423E27EF640FD5199C0CAFBCF2DA1C5C34121A69E7E0DEB3C268FE60C6797056383DA43E6F472D225116F63124498271D3D43AADCC5871F2349CE040BE068D72EB57B7827A7D9AA01405BA0AB07E684B91EF05418948F6713AEF1F4948399E0E6130740CAE3E481A6366295422BE3EE2E892AA9FEE86A6E23E2EBCBE654989FD93D1C4E7D62910E1223BD66B7C54F8DD7D373986E5D4141BF0BDE98DD13AAB7D598D698660F11FA4BFB0AD09D5C27B65386C8673E6C4AE9E8E30F8DD1A5A3FE557A3C29DCF99A7C376200AB595C49445E740E3DAEC07BC047FD6EA4FC6CFDC23D7449F9D1170FE635CA36D3DE5B57F1CFB182DE240CD4C1E480600C449D1A8596D8315906A53954201929E7665DD2E27D590D481DD394CF2E8AE19217F1FF0CB511DEF7460DC9E49C21607247857BA744B1384344B4C2D8CE987512376F66F1A279509281242A7A2A58ED500395418138ABDB9C5572A258D157F4D3E88ED216BBE9CEE3BD054FE61F94C59A4AD19AA62E456B86CADE61622A6FEA877575EEAEA20C76AE8A89E7B44396BAE0EEEAB1C23F221A3DF2B2CC683256A4E5C8207EDA0B235562AD3B510F9D3FBE0B51CD8F238A0ABD2EC182681606C8FD111D8CE1EC1CDA6DB4572303DDEB925AC1FFFD75E321468266790DEE6BC0E85070CEE749D9E46795936324DD1388E1B11AA617500534B8DAF2DE12B035F73111B770F5F56F5C6A4152C45CE0E112E650FAA9F3C7E59E3410745C29FA59CAE5CC37FE4C6594990E50DF1576B69B2B292AFC58A804743F49DD7C98C1768FD19AB4213AE4FB197492AF5BF7FBC6C8B507673539D8515DD527FAFDD8CA3EFF629CAA720AA11E65922678447AD4DDF5FF943873DF5203AFEA4130CA5F633E104AB083EC690CF092D208A98006E91BC7E33731D18E592869E564E6D3FF8BBBBB9837FFC1F1B92DE0F5DD4A029C51E3F64592CAC3DE1B4CA5414F894B7B0B7D73D6BF1DA4B908ACEAB47771DA56A8B0536301FC5FD270CAA55CE171332F7DB2EB4619C4B2C1971EBC0AB8B0B11FD54C24285DA8428AB9E0150D8897216B133ED554DE8CEE532024DF8B8D9314D7C9A3EC60464F9C7BCA8C3D4FBA23A7B543AC111ABA8C8F1BD54A243D565DC062F84CCCEDB0A03375FDFBCEF8AD8CAFC440D3E6F988DC607ECB947673DEC4AD48724C91A6BE22A0027E42AF6D94D26D188D0B7B3A5AF012880FC0105DD2F11171742321DD41A0401415C58AD4DC445642A2CBB466788F54D270BD8DF25602B298B62B6D0FA3ADA97008A99B73A807092F8957F17EEAD9D53B1128FBEF1DEFCBC607EA92AFBD353E95F52D33AB7C1EBE2 -pk = 7D2B9922C7E1C05D88B3DCDF9DCD04992AD30EA67DED8BA1F865C17BB6033AF4681E1D81A5B0A7D56B4C74EF8410E90006EBAA2567859AAA535BBE7398C2A1F62CA4C880682307E070437B3138068560EAB720A391A1F0D1425605DECB95B701 -sk = 7D2B9922C7E1C05D88B3DCDF9DCD04992AD30EA67DED8BA1F865C17BB6033AF4681E1D81A5B0A7D56B4C74EF8410E90006EBAA2567859AAA535BBE7398C2A1F62CA4C880682307E070437B3138068560EAB720A391A1F0D1425605DECB95B7010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B4BDD512517C7695FF634CAE250C308E4DBF39B3DEC9A07BEF6F5D8389FC536F5367E9651E31DD26A6AA77BDED05D69D26F3F444A9A8FFFDD24265B46448C8EB833EF4FFFFFFFFFFFFFF85BA3CEBDD74A4F1A00C0E506CC8C05824D3DD49150C74D48F014B704887A116A49C6AF86C12B4A156D789AF31BBC67FB1ACC2FA3A49FC9FFB228195A7238657002C1500000000000000FB72D341214E20EF087ADEE23E934C96D70B79AACDC05843B2E5A204D9A6F6DD9A450EB6C894869823FB220000000000000000000000000000000000000000000000000000000000000094F36E280AF80ACF4ED01FC5184BB4F58F45DEC85FEF33D649D781A7F9BA391A652C14AB256184FBF4888601000000000000000000000000000000000000000000000000000000000000F2BCC8904AE91B65ADF88955B53A01027D273D4BE042CCB6B7C3FDA468F28A64516E2E3C2966B85947A6F26FD424BC02711FE5CE542307950C210B0A207B8B09C5C484A959AB2158087E02FCF3FFA99CCE73F4CF1C9C0B33395699A0B6073502C0062E4DEA7E8D14BBCD16405825DC6C7C8110DFB6EA111BC2EED630BD7D126407C111E8A34DC5CB7552C8C4E21A720311043E041D79B08D308D2A5FB73455C037913E11B64C83E3C01444445D4C823FA75D5081DACBCDA4008F1BF55D1219033CDA89F50AE8B48CE5B8EE006D00EAE8B09B81BD3D964CA8E005AF931006D05BC0A6CDCDD3832662FADA986585B41E00200F63D95E0C74A24058F26793A4351ED399EEBC4D2989C2411EDDCCC4BF40611DD7404D5DEC14F24478CC0F76DED402F33440A786C460C0D92963D521AB03864384B58001349B20B5AD6814E074EF1190EC88C5236174B8E36480B2192C50000A37D93CB43EF3ADD7C0E3100AFA4467BE0C3122454C1C4B0645AFDCABEAEB0C836279E332F393CAE027051E6798DE007A53F502E6C54715555B27FA06B115938DCF2B589582CA61C1512FC3BE504321DD992D6CA83680E14C8F5A4DC8794A03B3E73203E765E972CE3333DF06B74111DEFC9B7F16D5C0F46BDCF047B22B487F7CC4566845690E27BC40E9C06F92CA035375E4CDD6DDDFE20042440966E8B6274CDD8439542D1730A35F29A6B2EF9EF1D48D5CEF2635C9EBD3AE350AAF672F03EBECA7319ED388F4EC205494855CBE047D9DBADA97DC571260F38FD974E1CE72A4A4F6479016C7DA046817635CE2A40150D16171D09BBA28883286F8AE16F1A7A24C56A86B5A20F2825960466E8D96ECBBDBBBE813FD3E5ADE1A5A70EF4F9D028B171FDD46D2FE10F81EC206A95D4E4A3DDE9B072E16368831A6CD7C1C226A3CC652F86930B90026CCBE0C2786062502 -smlen = 3431 -sm = 1E77C78F840AEB7D5C10D72201AF6ED97EAB2B12F64FABEC2801DD181FBF75230ADCAE3B2F4D01D5AB6AABD2CB6D519389C5E2011179C50C55EAC64A4E846DE900479E1F246C7C34802BE48AEE0151E3A829E828E5FE1159EC7E009DE0B7B14F91805F1C71A33100F7B75D0B554C11BD9F19861C00B572B4981ECBE54EB2C9408F01AB13CB0EB060F7E74329057301791862AC803884B77883D4D3008CDDFBF2CC2091E1F122EA39007AE7B905E7CD33C3329F910A008DC50B49E17E13FA83CD209401B460B4A8DE03EE47D04872840001DBD52F9BFCE76AB9FBC59ABDA3F663C19025D3650E4863DCD9070365F72BC7D4D8FEA3D52D726E01F3D41ECABE4A44BE0BBF3A6372061F7AB96E8C14D1A5094672D7034FA8F81703A2CC18983C972CC66736CD98B031AC8A479CED21A1F634938DF85F3E83161646DB81B9AC3EA22F80980B8E2EBA4E9975714E5A98985817F426C41F3968349686B69AF917564A2648401B8FA127FC3200DC16A9E663D1D345EA83131E21229DD39E70D7270DE7577A7E9635602FD2C30EFAF204A9234F0A73D21375658B0B0B04927E67F3F5534614EDF5137BADFED914A49AA301000092DA93B3FA4A0FF592CC3A53F4A75B54FEE775EFA421EEFCD6E0D32FB5CDC096886076DA940B26C6E07F12F6E08FA7B3E2DC42055308E5607A2732717AE592A6909C6E084252A5B08685FE8C6C1DA387B0AA9800B67CDB3EE2FB21B9BE5E6B79AB545563068441C0C9C1E68CEF6028A5CEDF27D3CA47D95094C9E1E68B8449758BE3FF8FDE148ABC420295DC76E3EBA8E11433217FDC3136551A5A41C1C7E7D6EF43601946897FDA54842D8F73FAA7EB7ED0DE544FEF2A95C6FECB13C8C0F14B5B22493F54374184B73D5BD47383BBC5DD7BC1BEAC0CB8E66D2F413A9DCEB7E1D0EE2D63B9EB28DB232C33A95B792AE67D2591F5AF59DDC45771A0E7195C4D25E7F4079359597678B0C0A87DF3D66A686A9215DD566D4722C212AD05A23E1377E37E18A6AB3AB8BF5CD47BF1BAF06EB05E4C150CA67D7E52BD297A08CFC97B575752E686B83575F425F3A450BB0F596A60E41F7183F463007FD019EE255BDEF1D98B7A0A12EC33B3E2BC9BF0CC8F4860DEBCFBBD5E40B2ADC2CD10EC35A341BE7A49F8D204FDAE86921B7DE5BA700A61E2B041A8EA7040ACEE844892E5CF025FFEC5322FF6D765BFF1107C967A12ECCB0489F64F8C13BD7057DF76485446641AA7A560C7E73008C46572628E1A225A8D3F6D68DDC9759A952FC07CD43DE4434BD3391089E900275E9EBC92563AC1403BB7DFDD182092130E3E6AEB7B666F4BA66C38BBE1F726F40A07DF6C42079A6054399519E26D765CA065F4DDFD27A29CBA292699CD826FA9D3E7EE31B0D76813879DB5EC5C7F454095DC3BD27323DABD2DFF949AC760D6137334507816330FA67D886021661ADC69AEBD882A07E01B4B6E5492399ECDEA99222EE785C810B30409DFAF2A3CE5A05D699C2368249C9588D86FEAA778B4860D6DD442088A21D2D9D0B49B15EC579776812AF8AD582F1C44BB6432D7472300B5440A382ED87AB64B20373A0ABDBCE391D0BFFC9C543EC686449FCA9D04B7141836A416720BDFF250A06D7651A1F98EABE4B340B2303591D0847AED6FFE423B6DD8C0C03459C381DB506F531343F82C116323899DF1E5D8DB8997BEC12EB70103F0BF2B3D53C4D4694052606EE32BE4F5B35450358D7D85062DCF7F0BDB51364700BAF92CD6ACE4E2C10E6CD9A332716F5F4BF7598466A99238357798A499C9B8BE77690635C57E7D87A904B3F2278C0B1B23E5860B0532F152E1626C86FD855F656B5D070BC81CE4634A87C8EA6D6A433C02DD2E6D6561B25968B149A6F3BBA40B749F188B84314B5778A000CAE91A53D59860EE6F7DF38CA0935CD64C08A34BF19981C17951B9C39A847D0637441452E38CE5E1D9B99BED51B86705CEBB8D3244C40BB8D70F846936A2BE29C21604A7E6BD3E655022B929954F6C9A5743F5FC2127B49956D80128DD582CEAA06FC174813E5F5E6A0A4D7D26756FB28A6588E9410722591CCE2A6C6ED0976B98E1FB0C642D5DF8F08E96BAE1FE10375FA1D7C70806101570FEF1EBC8F58664281E2B61DF2081B655013AEF54616308504F5F4A1E8F156680163489D3FE7BB0A514F1D2D57EE6302853D7D03C767C7BDFB79E2B8C80403F26F6EDBDD6A890A0A0B9B76D334E0F729FF9C47BFE960A1C3FAF77E81B9AC156367423DBB4D766A1F3B1E67595EFFD76287F22BC37DA4F0204633E804002EB7C1AD0836FA4D01E2FCDEAB8457DFC3D8B7F1151BEF3574F8F4653AA3780003787B8891901ABC8250A974C15F2DDDF9E1BE6798647EED710D06CC3FB4C276BFFA585680FC632D8EFD1614745BC3C72B82C53FEAE935EA5014E2B321F69BADF570FAD878C9590FD20FB7BF1B31E373DA93D1A8C63EA45E698CE060FE70ABA0FA84F37E836F2AD2998F07101D3FC7CA2B08B1398E1687ED5A8CE860EF9B4889FF436B74D13281D1F6A7EDF1DBE8989BFAEEFE6A475E65217643E757006871E664099F5B3846553603CD9EEF8FC195807361FBFDEB8DEE6A0B79F009C10DF397FFB865F4EBD0473D458D553358029C6B5A95D6FFEE9B645311D10A8F479B7E5249AA87E3DED08311B4DDF3A458FE61AE294A22643861826ACBBC9B0EA8B73157CE15D1FF35098AE67159B07CA7499398C26776DD9884B5D3786C87D48E864D8BBE2B73E2890F217E135BFDFC4DC5E805D9CEFEF5268E33DB611ABA6A5D57EC82B7246A63DCF3EAF3A51CF503D65C206D2362421DE774158AEAFFEE45A6B5AD5CC0B1DE0E2EA74E97913729A69E9C00A309DDCEB7738BAF4757EA9CC96E055BBDF692B12D8B01B92CE5ECF3D52187402CB7FD961A2672DC1875B6EA22AD7F5F42B1B52BA2D780F2E6C5B25FC7E30B1B663E3A09C8FF0B5C302E0E7F984DDCC62DDA65FD996E17DA72F02A16C354BBDAD44C5B5044759BD53789B98BC58CC25FCDF10A9CBBF0FD6ABD58A4CEDD92C5D85EF22B3C5EE5D9440CE42995517D2F7352CE997F51A36B9FA5703B4C6491AD01F406FD1B5BF85321026D28B51354DADEDF057B37743499A986469F908A01F3C1B74DEF5D8E2F57ED25A80720B540333109A0A65E7984B557F65429F3D3BD7EC3732A10D7AF36DD5D2414A09949A0F57F37BD9021D2C482E61437CC15E9DFDD92D4C212C4FC6C22C54591E5AFD48210FDC88040135E433F50E45874E0D5EE2BBC857F2C80E2FA4FC7ACFEC8EEC0CAB351F677C790787C715945C21BF923EDC0A58878AE09ACF5FB5A003C9C0B6E30A450CE6DAD4B626108B88E89F1E6A7BB3843E1EC8AEE35AF69E81773CFF71190F819CCF24142D60AC51B80B61019EC7ED2EFB6C5F18B499FC9727BED2E3324F8B94A522092E0A98241E29F8F14C6561DF3FEA0824F9CB0FE10BB497E427EE62085E7AABB2900FA47BF27C1638BD116C5555C076DEEFE9754E8ED333D72CE9423E27EF640FD5199C0CAFBCF2DA1C5C34121A69E7E0DEB3C268FE60C6797056383DA43E6F472D225116F63124498271D3D43AADCC5871F2349CE040BE068D72EB57B7827A7D9AA01405BA0AB07E684B91EF05418948F6713AEF1F4948399E0E6130740CAE3E481A6366295422BE3EE2E892AA9FEE86A6E23E2EBCBE654989FD93D1C4E7D62910E1223BD66B7C54F8DD7D373986E5D4141BF0BDE98DD13AAB7D598D698660F11FA4BFB0AD09D5C27B65386C8673E6C4AE9E8E30F8DD1A5A3FE557A3C29DCF99A7C376200AB595C49445E740E3DAEC07BC047FD6EA4FC6CFDC23D7449F9D1170FE635CA36D3DE5B57F1CFB182DE240CD4C1E480600C449D1A8596D8315906A53954201929E7665DD2E27D590D481DD394CF2E8AE19217F1FF0CB511DEF7460DC9E49C21607247857BA744B1384344B4C2D8CE987512376F66F1A279509281242A7A2A58ED500395418138ABDB9C5572A258D157F4D3E88ED216BBE9CEE3BD054FE61F94C59A4AD19AA62E456B86CADE61622A6FEA877575EEAEA20C76AE8A89E7B44396BAE0EEEAB1C23F221A3DF2B2CC683256A4E5C8207EDA0B235562AD3B510F9D3FBE0B51CD8F238A0ABD2EC182681606C8FD111D8CE1EC1CDA6DB4572303DDEB925AC1FFFD75E321468266790DEE6BC0E85070CEE749D9E46795936324DD1388E1B11AA617500534B8DAF2DE12B035F73111B770F5F56F5C6A4152C45CE0E112E650FAA9F3C7E59E3410745C29FA59CAE5CC37FE4C6594990E50DF1576B69B2B292AFC58A804743F49DD7C98C1768FD19AB4213AE4FB197492AF5BF7FBC6C8B507673539D8515DD527FAFDD8CA3EFF629CAA720AA11E65922678447AD4DDF5FF943873DF5203AFEA4130CA5F633E104AB083EC690CF092D208A98006E91BC7E33731D18E592869E564E6D3FF8BBBBB9837FFC1F1B92DE0F5DD4A029C51E3F64592CAC3DE1B4CA5414F894B7B0B7D73D6BF1DA4B908ACEAB47771DA56A8B0536301FC5FD270CAA55CE171332F7DB2EB4619C4B2C1971EBC0AB8B0B11FD54C24285DA8428AB9E0150D8897216B133ED554DE8CEE532024DF8B8D9314D7C9A3EC60464F9C7BCA8C3D4FBA23A7B543AC111ABA8C8F1BD54A243D565DC062F84CCCEDB0A03375FDFBCEF8AD8CAFC440D3E6F988DC607ECB947673DEC4AD48724C91A6BE22A0027E42AF6D94D26D188D0B7B3A5AF012880FC0105DD2F11171742321DD41A0401415C58AD4DC445642A2CBB466788F54D270BD8DF25602B298B62B6D0FA3ADA97008A99B73A807092F8957F17EEAD9D53B1128FBEF1DEFCBC607EA92AFBD353E95F52D33AB7C1EBE2 - -count = 96 -seed = 26CF860726D4DFA38AE07399838BB336F1BEE59E9F23AE4C81E73D49964997EF21CB5F5412F9A70A1EC39FC6228C36CA -mlen = 3201 -msg = DE897F02AE7292ABAFA6A0CAD52929113410F2BA972B4184E894C4D31081420751560956F49CE2B772635625AFC3CA6698FBFDE4D0A05EF243DF190BA1CE780EB572590E01E6E283E1963F2B0722B0CEB365552F65BD405F1A284DDBED07BA61C4453D30CC28C83E41590E09D7BB6932D231285205D61332FA9263B8A2D3D7F7FA20F521CA4B49F249896780E08C2DC41669BF0777278F87BB1F72CDDF4B998062B1642791F81AD474D6D8F963DCB4458CE11108544C41CDF19145B77038C7E8ADCD6501508C53B25BE6E787313018620D1BA647CCA4A5A8399E11815EAECEC6AE66DBC576699BB0AB44DE111AB6F252256389EFDC0546E641DE87FD6A3A724716257A9174F39542539A593864441EB79D499FCDF2F1D053CEBB3A1FCC09419D2C553C2265B3DC3943E0341BB49130E9981EC59945FA0B23E9DBDBF352ABA0D925C4333F2EE1F2C83C847EFA78BB13263B893D7CAE029BF08CEA2A5D1B5B997E403A489C6D9A124FB8386FE58C2476894E7754B8E5A162102A119482B5E59F8D89C8B1DEA70B6C80641C77BFD12D45C5B3CE0021EE500A1665ABCF740794E0D3E7E8CB5804A1E0D0C81A107DEE80BF63BFF8CE2EE2DD602DF279DE39C579B417A758356D2B48B41E83495DEE9ADFE4506E03F19DD096E81405264D408B2FBCDBF41DB5CED6FBDC2645DBEFE5BD038382993970C7686DBA3FEDC24E1F91BA4B6CF70B2E832B97BE24B6393273A519DB0B4446E98D77E86CCACFBECCB18939013C66F7A29B10DE2E88FCFAEF656B858B7DFACC4F21EF5F328C0EF604FEDD993510BA40530B79525FE8D336DEF0E5C303539E664A9360EDAD7268F70DF4DE199AB3F70EB2BA65E2752BF5FDB1E853E6F4EFCAFBB31D8CC23155413BE31082DA958B01682894A9057CAB66D4D64A6F3B1D81C5B75815A3E0CAF6486B17339174276A84E11C117B060302DC2EE06A03C0E15395C0DD32661638F059A385578C1B792349A41C511D12AC7185B060A831EE296E6626459C2750FAF3AFB579F6F6836D566C00C979B5130E8E50431E914834CBB3D26F6E5BA50BCF05D50F699FAF10767AA2831C3557A53AF14BFD9F23C00F76C2680C7DBF4A9B2A425E34C943228C3EBE55A0960ACC757D7878F7943E2E8A1CBC8C0D2139A6A6459D3492A1A7757F71E90A58A78E0FF9B04D059C5D131F6E3C30742FDE5506AE7860045A4C903DE96DC43AC6A69273BF8EDAB7E7FAFBAAD9EFA8FA609961502EFACCDE63A6D98D8D017075487C608FF701A7E3381D7A2ACB134B198950ECC6970A75AF5625FAA4EAF968CCE48FFB673F4F365802A984C609C33BA312140A60A6F0924E945D11BAACFCD643C874D352A90367EA4C59B63665364832B1A9A9A01EDA92C64F393C357158973FA7C6047B8B5E27EEDB28E26359402B63032F8B230F5AA968272819CA486A8BAFD3D66799AE951CABF04EA81E1E7E4632B915D4E8387C7D1F4FAFE1C1FC8666FE0318403EA0027487E947D844A7FA28C0523A64EBD95D2A8ABF6A71FEFB5BC059B2CBEECD4375F3A3F109DEAD98539244DDCFEE9E42DB3ABDAF943C445712EBF19508A1FFA6133C5078C1DA69A32CBE729A8876C4C73CB232024A87D87FD5F9456D3D4A936CB4CE2E00EF415406D66D344000A4A95CC9651425A16021336C4BEFF310210324C754BBE13CD0066C507413671C80CF492B4655D898A18A2F4DB5A393400C6AD821580B0712D6C919C62E87FE212260EAEF6876C409FCA1047A67B223E0766144F3F676F051FBE912C4CE4A9F7B85459DA031EC47C621F6EF06CD1621421FA52B047B51C944DFA94807083B4ED40D533B19813477193D1E4E96C8D76A5AF3100FA44A985A6513060B08A7F3848159B3CC551D43370B223037753B824A099A7C7DF59305BE09E2E79618C83818BD542F39380126A927190EA5536DFA63B664AA7601C6D82CDDF4CE4006E1AF2601EC453971828CD09C29D2F3EA6392B58D38BCF40BF6B6497F6B848CB853B187610CD23880CB09787C76087356C66565C0399BE746A81753442E4AAA54E84F1D8C2CCB2D00A551E960203D61E71A72E131ED1967DD06E72C99264EF2EE5BD156FC869B5031BA23A6D354D7CEC58F339F6BC2DD1C547F07AA733994860197DCE5BCE6024A74668ED89A2C9CAFE1F78B31638C3225D96009C260FBD28C1F0423E75C9C01A0F9E62B7F265FA3817F441F56AE79BA54A0C107FD7946A2DDDA60D0EAE428715FE2B4FF93BEF83CD10E5E17760FE028F1AAC8084A43EDCC12BFD3265D13FA94D9704809A50881D48F0080A976C5BF31B353B9043C0F0B69AE6F2B8BADD056752F2FC9E90C4B35850C2D45B9F354B41ED7826B976528875547A0C389B83725E26C006CC8240E380E3EB554DBF2133A131743539B1D174CCA6B135C59F81D499631BDA4CF90DED836E8C24C074A0BCD83271309FFEF320791C9030FC2B1F53FD2DE870E54EBA20CE9930C279B48B39CB481737F012F65933650374BA39E2222191B0E3C7DB9632CE9CB077322CEF97ED832DDD8AAEE53C52C03D2AAF8EB5597D8D6467A406BF428E2F16462E0C0D486A1C1C7348CBBF92633EC4FFA75945025A3C92095317E32290D4CBAA6CA40F3F201975F3FC8B733D1467C094E075E8415352E3AE51A6C5169A4AA430BCD66FF39B184F5B7174042DFCC6840EEF60CCDCAC12D012AE4F24F7184A038D8D9964AB405366740600B98CFE2E4737C8D846FD4E9B22B5047110D85B37BDB9E7E3BAF5298BBDC1050AA20F14E34DEC283830F5FA9C570C22CA659C1276BE8FFBC0AC3551DB8488855AE7EC21E239E88A0F68227D17DD87FFA3B3D0535F9E57807755DE56A65C0DE9F4A79F8746B20908BF9416A86F62EE2C2545BCA2D55CD4D45DCDF06DC879E1B6270A80778D0274AA658395D800EAEF367DF4F4D838EEE0A66093E0F419B9EDC5F003E31CF0EB7E1CEE9ACCDA7A2DFC920A4B5222389DBF12AD17392850C434A9B3C260159B0F52E78E7A66D28DD5B3C77662CFED2CB3DD5BC3CC26A34293EBF1FB3A9BC59BB0C104C5A9387F3893A65D145D424CE741A375F9C65E733A024E78FE274B29FF4B0EB6F21FAFC31453EAF7E48FABEC5711D3898B876F59952C73123281A8E85148CEF5A166BF45DF36053D57AE6F29D3E334BB2395FA236D4DAA8A4FDF99D80A9BCDBED36154BF4FA3D463D51974032D7B88B2504317E14165B1C3FE3D8FE366FC8284321D80F9CF512F418C63F73B7C29C07870332387BBD1A870AC39485F64086006CFD68C8299347615A423736C01FAEF2DA56CFB6FC966948649324E22D4551B9F50654EE505547F7D0B8481ADF6AAC3977F49D7E6AE5C4248DF7B43BDA7F082AACFCDCF1C1BC04F2D45F5E028498ECBCA47EC4D1DDEB03A2AB27BE9E4B80585145676F8AE7A5017BC5EFA317A576ED6E423D5A0495B8DC619712A2C3E6162B04B9BBC7DE4BE6532F6C1C019E702C014C60189A2612594BCB18317804C630264D07B7396DB562777BC305B885E00706FF6D0208737BD229BC7AEEFF5FB770A4C057B347601F1F6C16F60D4A53A0B32631AD2D41FA307F6630228E1807D22475D5E331A50A680896DC606F3941AC08F8BA46DE5A49F5ED6A94965334FDFD69C4A6C7973D9615B3FE576B15AACB9B98D9E498D2A3A89B4F8EEE715ED5F29F13DDE7629BB386F7CC800F16F3B5BA8BD0E14CD8D9BB0F0AA615BE9D7557F6EFD00F7BBEF9989E7F463279408E6AD77E100AE4457D57424F2B1CAEF43052C5B25C896BAA1C2FE67D1D6F669311F17D39460F0B176A7727F53257A36FAACBF3DFE623D8F882F8EE41BA1CE387E1D1860F4BABE26ED678395B9979D84DEA5C7B38905D4C7FD867ED7722D066BFF3A833D3282BB40D1CD310DC8DAC9270A49B65B5181EB30F166CAF0832A8DC56B9D135550B506D98D036BE7876836AAE669507990DE6D03E78A38139CF64F65FB410F192E30B045C93FE259C10E0C5B56A2B5F0605DA0851104C4BEEB4E3B30135CAE5A6C68403C63121B0993832834A3B5EBDD345C41B26DD219560B624024B8B945A10D385B3CE4E0BD54E10A64ACA59D283302028A9592120D142CCEB1CC30E1F96AD041F1E17BCDC3C68C2EA2E0D65D6BA3696166CB365CC461ABC4D67D504E8290EB452ECB77F6D5FAA5053D01317646242384C5C510BD43C5780BBD01EBC3AF33D29D8A09EF39AC85E70398D2A64DFFA72B3EFD8D6D57AA2F9DAC0CC6EEAB27B69FDF2403A5FEDE0BFAF441619BE03FDE44C49FF0A34E9C37D2B9AEB726D56EB646A67BF349323F397DB056D71DE72A2597D780942554C8F8273E307DBA6BD02E944E0559509E1F28B511BD709D03EA2451EF234DF6F077E06AA01E2806D5BDF89DF29F1B3D8C6D8014496AD83857F7465F1072E88709D0194733E1FC8C9F092DF5B9802FD2DDDA8B142217B9532D8604E2F32D06F6400025930DA2BE9B25529788E6BF4EB7F84C272DF455CE2ADA291CFDB5FE815129E4AED59625C879E99B3E3C1B6C5D7 -pk = FD540FE437AE8C993BFDF90708C10196D98E2DAE97E3F6038811E958166C56103DC86A27DEF6FC7CC1B87F4391CCBA033D25BB00064D3B908C1695C04DF83928BF575A24DB8952970625E06A6428953020636E385CDFC19A16F5BA7FFB8F7D01 -sk = FD540FE437AE8C993BFDF90708C10196D98E2DAE97E3F6038811E958166C56103DC86A27DEF6FC7CC1B87F4391CCBA033D25BB00064D3B908C1695C04DF83928BF575A24DB8952970625E06A6428953020636E385CDFC19A16F5BA7FFB8F7D0102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002DF300967FDB4762BD34863315B53D2AB1B518F423761B52818328D5AE0B4064CD9C2BDDBE6CC999A28C5A32DE6BF4ADB2330E80BF3DA48C41B847950AC95CC1A02122000000000000009E739ED3FFAA9B9F0F48842AC5F1646FA09572D68C7068BCCAAB4CAA9F4D0A5C256E038A157EF5B1EDE8FD0E9D99ABB97BFD5D09F4665B6074244FFD871F691D351809000000000000001A9B9F3177EF9E2E4E93705B2CE8E608294D21BFA7259B34BA38F1CBBDAF8BA5A901787FB6B2A52664EE5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF230C3190B3F453787AC0DF952F4DC29E0668A20C9EC102A9EF6D63C2197055366433A778755E23F27F496401000000000000000000000000000000000000000000000000000000000000DDF3799A70C09B15E67A7FE4BD405BCF5E12E1AD9B20AF97279A1EF0AA1D2CF54DDAC2A61F787E5A3A15B044C78310002850441F92992D3C52D595EDF4B48918ABE07A3E34B9280ED5854F2DE932B2BF109424BEDFB405D49D5939CDC4DA2501FE428D90BC079434DA8C81862AEF7DC5427B78AD0ABBFA0D9D65BE7172658105ACD1827D987F1083F7D4FCBF04573B01ED46E22441F56202AE17AEAD0F2B79287485F24C8FF61C2F1FF76CDB29DD0DD1F0191598B8190F49379B4B0E20B83C026CC194245E7D1DDEFF0D261252E1A534A4BABB6F949FEDCDDA530ABCACC164C3E1B64DF9F0C40AE1C2B338E064180701441E6D92DE8F9EBF5AE22C524F5317B00F6B1BAB969A909F6AD7F915010B02AC9B0B02DF07F20574949EDA307FEC4C026721F87CC724824113073E0079963306B4C0F933278D82A146A14FC9919F300E5AD9BC93CE0BD3345FCA44895E5F110193BB5694AA588F35C892184EFBB608A1E0BFE8A5D3C62682223757B88D14A7CE98D253E64EFA786179A75188C6E21A00812B859FE02B6B7A2651C838136386F551305027CCA5E048F9C197FDB5B13237FB06343D1E1A732285D1D9CA107E3E014DAF4F7C2CD22710FCDC4264974B75EAEFC5931F04AE58C0AC9C579A6D843A78703436C06518B61283252DC5CF54AF01425D01A1B19C7A5525D608CCFEFD3DD539F548F6140EC42CFBEF4FAF9EF6D2C137DF80FADC9AA4228A83FF4818947402CAF7F6FE28CFC80CEF27E2EDEA512F6DB68280A454AFD22E5D6EDC43572E30DBC8B59445413818A15F995C1DCC15990305906A6CF370335977EECF48BEB631FB305A1ECA2CD9F9597D7B9D21D50B6DA4A779BD26029EF7136DB548A8F0FE180396808F7A885A2F55D110BDF51C38912F0600BCC9251D69BFD1226F06F6FE2AEA81745FA93C7BFD9FA3151B58B6FC4903 -smlen = 3464 -sm = 86F113FF242E05E99BB2FC8C01951653326414A9527360837401A2017919C629DFF8D53E414801A5819C463337D84BABD7F753000CF0EE8C1446964FD177DF8001D226B58ACDF4FCD21033F9D7011B0557FDBBFC760CB1B305B401E2D2DE48C729B85CB762541800EE92C9BA9D65AA900B57DBAD0068DF881572EF9AE5C31CFCF300361E0F0B7BEF32F3A0E7442E006BE64F1EB84392FC2DEA582301790286EABD489B93546F901001E475909AAB741A4F34ABA9FB011FEDE26290469EF3E738EDB100A5D161F902AA4944247A4CA400004F374481DAF87FF1A30FDFCD91375EBD30B7D55B0E1A41E3020502AED4AD90569DAB536600E19E011136C5B3D16405B99D17B23CE60CDE897F02AE7292ABAFA6A0CAD52929113410F2BA972B4184E894C4D31081420751560956F49CE2B772635625AFC3CA6698FBFDE4D0A05EF243DF190BA1CE780EB572590E01E6E283E1963F2B0722B0CEB365552F65BD405F1A284DDBED07BA61C4453D30CC28C83E41590E09D7BB6932D231285205D61332FA9263B8A2D3D7F7FA20F521CA4B49F249896780E08C2DC41669BF0777278F87BB1F72CDDF4B998062B1642791F81AD474D6D8F963DCB4458CE11108544C41CDF19145B77038C7E8ADCD6501508C53B25BE6E787313018620D1BA647CCA4A5A8399E11815EAECEC6AE66DBC576699BB0AB44DE111AB6F252256389EFDC0546E641DE87FD6A3A724716257A9174F39542539A593864441EB79D499FCDF2F1D053CEBB3A1FCC09419D2C553C2265B3DC3943E0341BB49130E9981EC59945FA0B23E9DBDBF352ABA0D925C4333F2EE1F2C83C847EFA78BB13263B893D7CAE029BF08CEA2A5D1B5B997E403A489C6D9A124FB8386FE58C2476894E7754B8E5A162102A119482B5E59F8D89C8B1DEA70B6C80641C77BFD12D45C5B3CE0021EE500A1665ABCF740794E0D3E7E8CB5804A1E0D0C81A107DEE80BF63BFF8CE2EE2DD602DF279DE39C579B417A758356D2B48B41E83495DEE9ADFE4506E03F19DD096E81405264D408B2FBCDBF41DB5CED6FBDC2645DBEFE5BD038382993970C7686DBA3FEDC24E1F91BA4B6CF70B2E832B97BE24B6393273A519DB0B4446E98D77E86CCACFBECCB18939013C66F7A29B10DE2E88FCFAEF656B858B7DFACC4F21EF5F328C0EF604FEDD993510BA40530B79525FE8D336DEF0E5C303539E664A9360EDAD7268F70DF4DE199AB3F70EB2BA65E2752BF5FDB1E853E6F4EFCAFBB31D8CC23155413BE31082DA958B01682894A9057CAB66D4D64A6F3B1D81C5B75815A3E0CAF6486B17339174276A84E11C117B060302DC2EE06A03C0E15395C0DD32661638F059A385578C1B792349A41C511D12AC7185B060A831EE296E6626459C2750FAF3AFB579F6F6836D566C00C979B5130E8E50431E914834CBB3D26F6E5BA50BCF05D50F699FAF10767AA2831C3557A53AF14BFD9F23C00F76C2680C7DBF4A9B2A425E34C943228C3EBE55A0960ACC757D7878F7943E2E8A1CBC8C0D2139A6A6459D3492A1A7757F71E90A58A78E0FF9B04D059C5D131F6E3C30742FDE5506AE7860045A4C903DE96DC43AC6A69273BF8EDAB7E7FAFBAAD9EFA8FA609961502EFACCDE63A6D98D8D017075487C608FF701A7E3381D7A2ACB134B198950ECC6970A75AF5625FAA4EAF968CCE48FFB673F4F365802A984C609C33BA312140A60A6F0924E945D11BAACFCD643C874D352A90367EA4C59B63665364832B1A9A9A01EDA92C64F393C357158973FA7C6047B8B5E27EEDB28E26359402B63032F8B230F5AA968272819CA486A8BAFD3D66799AE951CABF04EA81E1E7E4632B915D4E8387C7D1F4FAFE1C1FC8666FE0318403EA0027487E947D844A7FA28C0523A64EBD95D2A8ABF6A71FEFB5BC059B2CBEECD4375F3A3F109DEAD98539244DDCFEE9E42DB3ABDAF943C445712EBF19508A1FFA6133C5078C1DA69A32CBE729A8876C4C73CB232024A87D87FD5F9456D3D4A936CB4CE2E00EF415406D66D344000A4A95CC9651425A16021336C4BEFF310210324C754BBE13CD0066C507413671C80CF492B4655D898A18A2F4DB5A393400C6AD821580B0712D6C919C62E87FE212260EAEF6876C409FCA1047A67B223E0766144F3F676F051FBE912C4CE4A9F7B85459DA031EC47C621F6EF06CD1621421FA52B047B51C944DFA94807083B4ED40D533B19813477193D1E4E96C8D76A5AF3100FA44A985A6513060B08A7F3848159B3CC551D43370B223037753B824A099A7C7DF59305BE09E2E79618C83818BD542F39380126A927190EA5536DFA63B664AA7601C6D82CDDF4CE4006E1AF2601EC453971828CD09C29D2F3EA6392B58D38BCF40BF6B6497F6B848CB853B187610CD23880CB09787C76087356C66565C0399BE746A81753442E4AAA54E84F1D8C2CCB2D00A551E960203D61E71A72E131ED1967DD06E72C99264EF2EE5BD156FC869B5031BA23A6D354D7CEC58F339F6BC2DD1C547F07AA733994860197DCE5BCE6024A74668ED89A2C9CAFE1F78B31638C3225D96009C260FBD28C1F0423E75C9C01A0F9E62B7F265FA3817F441F56AE79BA54A0C107FD7946A2DDDA60D0EAE428715FE2B4FF93BEF83CD10E5E17760FE028F1AAC8084A43EDCC12BFD3265D13FA94D9704809A50881D48F0080A976C5BF31B353B9043C0F0B69AE6F2B8BADD056752F2FC9E90C4B35850C2D45B9F354B41ED7826B976528875547A0C389B83725E26C006CC8240E380E3EB554DBF2133A131743539B1D174CCA6B135C59F81D499631BDA4CF90DED836E8C24C074A0BCD83271309FFEF320791C9030FC2B1F53FD2DE870E54EBA20CE9930C279B48B39CB481737F012F65933650374BA39E2222191B0E3C7DB9632CE9CB077322CEF97ED832DDD8AAEE53C52C03D2AAF8EB5597D8D6467A406BF428E2F16462E0C0D486A1C1C7348CBBF92633EC4FFA75945025A3C92095317E32290D4CBAA6CA40F3F201975F3FC8B733D1467C094E075E8415352E3AE51A6C5169A4AA430BCD66FF39B184F5B7174042DFCC6840EEF60CCDCAC12D012AE4F24F7184A038D8D9964AB405366740600B98CFE2E4737C8D846FD4E9B22B5047110D85B37BDB9E7E3BAF5298BBDC1050AA20F14E34DEC283830F5FA9C570C22CA659C1276BE8FFBC0AC3551DB8488855AE7EC21E239E88A0F68227D17DD87FFA3B3D0535F9E57807755DE56A65C0DE9F4A79F8746B20908BF9416A86F62EE2C2545BCA2D55CD4D45DCDF06DC879E1B6270A80778D0274AA658395D800EAEF367DF4F4D838EEE0A66093E0F419B9EDC5F003E31CF0EB7E1CEE9ACCDA7A2DFC920A4B5222389DBF12AD17392850C434A9B3C260159B0F52E78E7A66D28DD5B3C77662CFED2CB3DD5BC3CC26A34293EBF1FB3A9BC59BB0C104C5A9387F3893A65D145D424CE741A375F9C65E733A024E78FE274B29FF4B0EB6F21FAFC31453EAF7E48FABEC5711D3898B876F59952C73123281A8E85148CEF5A166BF45DF36053D57AE6F29D3E334BB2395FA236D4DAA8A4FDF99D80A9BCDBED36154BF4FA3D463D51974032D7B88B2504317E14165B1C3FE3D8FE366FC8284321D80F9CF512F418C63F73B7C29C07870332387BBD1A870AC39485F64086006CFD68C8299347615A423736C01FAEF2DA56CFB6FC966948649324E22D4551B9F50654EE505547F7D0B8481ADF6AAC3977F49D7E6AE5C4248DF7B43BDA7F082AACFCDCF1C1BC04F2D45F5E028498ECBCA47EC4D1DDEB03A2AB27BE9E4B80585145676F8AE7A5017BC5EFA317A576ED6E423D5A0495B8DC619712A2C3E6162B04B9BBC7DE4BE6532F6C1C019E702C014C60189A2612594BCB18317804C630264D07B7396DB562777BC305B885E00706FF6D0208737BD229BC7AEEFF5FB770A4C057B347601F1F6C16F60D4A53A0B32631AD2D41FA307F6630228E1807D22475D5E331A50A680896DC606F3941AC08F8BA46DE5A49F5ED6A94965334FDFD69C4A6C7973D9615B3FE576B15AACB9B98D9E498D2A3A89B4F8EEE715ED5F29F13DDE7629BB386F7CC800F16F3B5BA8BD0E14CD8D9BB0F0AA615BE9D7557F6EFD00F7BBEF9989E7F463279408E6AD77E100AE4457D57424F2B1CAEF43052C5B25C896BAA1C2FE67D1D6F669311F17D39460F0B176A7727F53257A36FAACBF3DFE623D8F882F8EE41BA1CE387E1D1860F4BABE26ED678395B9979D84DEA5C7B38905D4C7FD867ED7722D066BFF3A833D3282BB40D1CD310DC8DAC9270A49B65B5181EB30F166CAF0832A8DC56B9D135550B506D98D036BE7876836AAE669507990DE6D03E78A38139CF64F65FB410F192E30B045C93FE259C10E0C5B56A2B5F0605DA0851104C4BEEB4E3B30135CAE5A6C68403C63121B0993832834A3B5EBDD345C41B26DD219560B624024B8B945A10D385B3CE4E0BD54E10A64ACA59D283302028A9592120D142CCEB1CC30E1F96AD041F1E17BCDC3C68C2EA2E0D65D6BA3696166CB365CC461ABC4D67D504E8290EB452ECB77F6D5FAA5053D01317646242384C5C510BD43C5780BBD01EBC3AF33D29D8A09EF39AC85E70398D2A64DFFA72B3EFD8D6D57AA2F9DAC0CC6EEAB27B69FDF2403A5FEDE0BFAF441619BE03FDE44C49FF0A34E9C37D2B9AEB726D56EB646A67BF349323F397DB056D71DE72A2597D780942554C8F8273E307DBA6BD02E944E0559509E1F28B511BD709D03EA2451EF234DF6F077E06AA01E2806D5BDF89DF29F1B3D8C6D8014496AD83857F7465F1072E88709D0194733E1FC8C9F092DF5B9802FD2DDDA8B142217B9532D8604E2F32D06F6400025930DA2BE9B25529788E6BF4EB7F84C272DF455CE2ADA291CFDB5FE815129E4AED59625C879E99B3E3C1B6C5D7 - -count = 97 -seed = 13F1F446D9AA5AC853278BF74C9E6447A6CE4294C037867F43DF554370EE261D05C7260EEBF46D6694D0850B8343FBE5 -mlen = 3234 -msg = 525E8B98C55864849FFC71EBC953F7A0ECA6298F6AA15A83BF6923BD5921B1C86DBBFC544A39C364EF6D9281481E946C994F96829D6639727A5345560D8641E9A510F913F7FE5592C2A40CB278F5AFD8D4504B5387C20945654F08168247A98F56A43A5020955F882D2D93781F4A83676B08F50341E953A5D1B67DE7F6D1BE3D78D5D060AA85B5EE4271763C437CCD595890DBC8FCFAF2754AE9349BA2FDF89847A15188716C0EC672887A4B9A15176AE0C5138819CA232D012BE1DCFFD29F677442083087C127CBD80B0D9CC0962BC8318E734910D1E2653BBF700C84BB0919E12DF331CCDC7128B41F0666F6419AFBADAF673BE16C9177D3CF113C6488504DE088149BFB83EACBBC400309B7AD753F7B2F5AA89F070C9D14C084C32DF91C5F7CB6A7D869D64F4A05AF80A98BE7517ED784C17B0D7DF96B9987B7EA7A398CE018AE6E13E1C0F7AA040AC3FFD273BB9687AD6FEFDB211061A6228967E9DFEF69BCC1C5D02EE56D49A93C8AAD46D08322A2CA246AE8C3EDC071D063AD605A97B8AE94D58E897A4A6310BCBF55B0CAE1AA81769D30B46F883EAF29D4B5FEA32F2DBDE49360CB6235754BDC305ABB5E5395360097378656E2BACE675448889B0149D6086C51E9C3AF07A76563164864F131CF9C0CD475CD4A58726AD237CFB76ACA68032351FB24711DA635871386B4BFC94B0DB6D35F07D0196F75CEDB92EFBE7D653E0FF9326A596F9166FF6CAB73125DAD27F361D6122CA531D86910187E75F849EDB52DB26C96FDF05925DCCA232480D3F979EAB07CCA68FC9069965D12BB666A180989AD1FBEE3FE65E746C5A8F64DAB2E370F0487D001121EDD0D0D760531AF46DA65C75DE11688EBF31DD2AC95C188BCFA07EA798609F3EA8E6364A43742A2825144FAFC05ABD17476480812EB2483734B13D075B3EE3AD510B67CF7057014351B2CE5357E3F12F43BA74CED614BE3A9AC0E26763E9AC596F87AE98F72ABE0DE213A81A9A03E2B82F2312C1A186DFCFC3DB346FEB132931C793ECF837F57D8E326101F59705B77A3083E712CE347C2C29C23468B0C5857EFA410197833987C61ECBC2A855EF78B3D7B1B697AB9844AAD07C4B8EF666BD80DABA5FCAC900C5D358A11676FFC89DFF4F36F29F14D9F9B854DCED41FFC4B36381449D22801C19BF8E8BA1F07A1B38FFB527A34D009C4064A1E606FF2AB90AB2E05C156150EC14D7DC792578A16F46650D0ABB61175D1817E2C38F109EBC01A3ABB358673561691185DA32EEEF566C1BA1C72C1F08CD1B427B552425501B8783116F2EB0CFF73C5D2DEF18D291C106980135821A77428FAB20A935AC8B6DD8EDD1A936225344EB103DE0D5879CCA09359B5B882291C0FB1FCCF167C30DBECFC324AC315713CD10F35B72F0D4871A7CBAA2B4CC2BC2598F23DA607C94A063C9E2013B0EDA5F3BD5AADB2C429177A4BFD7B6181ED5F9A55C1F043DA8155C9E7BEBDA7EA07DEA49938FE07743DF2295C220EB53348310842B1000B7A02AC025C3A94FA82D46ED7E2712DE71B149742731EBE62E225D21A7F29D5F3A8A62B71FE16258570DA412C07CECF82B2064AB5D98761C69FC5E899A8E174875B3179DEAA0BF4A0261DA9BF39148440DCBEB0C887E41FDF751505DE79AA1F8593F45482B659F5B5F4CC3E7BFEE59DEF49458DB195A1A692B8AF4AA44CCFB00B753AC761181B8AAB39DB82385AE776CFC585F7873613B62DE55BB10A6B2F27E631CE41436C3FE390163E6F4EBD6B501519C96C06FADCAC8F75920FE1435542FDF535EAD6C0E3F41345996063B95A208DEFB6F110CC861580979BF4422ED395CA218CFC3B22C0BA8B31CB9EEEB51C3DF35FECE92795CAFB8440F522B44E21B3A18D5CDBC296B887A4B927F36715E4AC2CAB043D8B69A8704D6BE24C725B0C2E814BCA7B040C27FE8F4C14911051039AF13F44E0485EB767F5404CFB6FD19DA24D82FE24B53033C83DD8634E2E28AA330A81F14BAC1C57DEAD7FFE39994D9D094383E14322E146A3DF27A776E2F09A11EC9014C809F8E543594D6B4814918A129B36FD25015A044E04D3F081D4D201DF86A0FCAFBBFC695088170B8246776B6A28E59449C646D1E706CEA96B12683CD3A7C60459D42989CA46694B0089CF88E9AEC5E110F69FE0E3FE20D18309D1BA72A83A34813B771484505B08548FE5D376AAA0C414260EA4BCE5EB81F6545CD5203026264938905BE1E252574F4B4E71C6E12F99F6EFD35EFFD64183CD0665FE89D6A357B1908E083511DCE2CDF792A608044C31418C433F86719E156AF3FF98D0F54EBEB9F9FBF24588A5557D310EF9D7CF5DD8A68512D8CB15114773C69D7B40C927858AFC049F7C6A89841020E1C313C5C38B988EF505EBE6C15FC1D6CCD8B472F90ED64DA895D06AC01BB99F455A195A670D22DBD5E3F03AC84A08831E9842A566E9785A0FD4C460C5CAC154D705DCE1E7FD1C45BAEB23976AF881CF5628F3CD92AB19BAE8D45A03A859518E4A1E558FAC2B48A432E46CF274E6496B63874CA4E4571132568AA43EEC3D2A3948F40D327976A6D28CD816CFBEAF8FE126913384061D219F51179F679081503371EA0B6BD7E9524B0ECE2573304ECB4A16EB471CA0817C0C6EDE751F283ACEEC5A60C2796C6261FFC6226E4813241619F465DCE67B38E1D5A647B079503144907307C7D6EB6E6EC1936B5C94FCC08A882B4555B19B33A9BF22384DB38473A313966D157DAF8AAD41EF67D3A5FE723559096AB1768FF69773EB9D5C88D6F35F00DFA4473DF71C7E9E35393638DED05D05C105CBF37711D38E3EEE35E8CC0029B3761241FD1E56969E09E949690D4FE25735D774E777A2CA17FE058E14AE6806F611FB1E9FCD516E20499A704B67990716703A4287B50AB45D155D40EDC0AAF97F5B87551C236CEBE9CADD562B27957EAD251F79CAAC6433F228B50167FB1A753306FFF08B53A8A3CECC226857A321700EBE23AB4D6C35415CA79B682D6CFEF6B1341E7CE00CB9870F432B63A2D9A9A43C87D28A95C514582812DA37738BDA6CC76142E08F69EBAA5ACD0403100C2343E2FA088441E9A55C720BB509BC3600C27C1D39157E049650D1749751EFE55A72349E2A5B714556CE2188CE972287BE2152C7E58D3FCAD43A214A4095DE55CAE9F627D8B9018DAA01547842FA1AD14D67327CD47EB9B90CD94AFDF5244DE57E527F17894A410FB4210E06632E88A398400B0AA48CB3FEB9A90ACC668615D193D5A98158092FBB59AD2D6D4FFEE433A2A6A971A228685AE5BBAFB3AB28242C630AF4656C5071C545618A0A765FCE41B19970C2152D44C349D0CDFB29673D1A42FFEC139D1C9958B0962F7B57F80CB8FE6331553B0DF93DA9BFC722B1C001F48FF9C0FEF032610A1118AC9EBAF9202DFFEA605272A50A90768F031C72D570C0AA5B0D4FEE4AD568895274388104C0BF88D03FADC3159D6CF28AC6A7E3E5CF6FE5C6658128CBF81456DB8C29A76F9C75230F3837F1A94CB83C3AAABDF4B29C9045B45AB9552BBB6C0844BF2926267C0D74D3337249D5C9610E0F6FFD0278F12F39C48650C048D61A3FDB8E1A2E08CCCA68803A55B39BD39160B0420CBEAC7D8A55F571F490F694A7AA8B725BA84238EE1E711864AA1F74AFF252C088E36B79B09C80278DD442EAEA8C7D5833CD1BAA18BDD866689E663EADD0EAA6E0C78A3E09DFFE5F6F1F4003DE24336586B25DC5EE45D56F31D8BB2DE31B24E87172F3F1B26D400B08D50FF624E456183F269CBF06B3707260383174FDA152E4D0C528A90C54114C4F278D0FB35B74DD3ECDA14EE89D38E3227A7E18B068F134B22154348867A61719C926EA3320D1BE0B9ED78466B2DED728CA04C15AC144185FB2F5084511A38CFD765659351AC1AC3E5F327D9F3DE9B2B003758DA78DFD08FAEF3625CEDD87C8A55A3CD0257AA71B3788FD2449EFD1F48948CB304468E3CA07EA7044FA185A2B91F9761C6532B9273DB74C66B2DE95AB19E5102CB90C719EC85671E2829B182BB6D09323248D6584F0CA67D422BCDA65A0146D8DF27AB4AE651706D5FA33B5BB88ADC2A1A95105D55CCA8439A5060D110760DEE8B855D0839053BE595278EAE66542736D25C93D8544C6E55ED51AD6E7029C2E6D32CFA8844BC14972809E31754AF84BB479C504EE77CB65CEDDB6BDA613FEAA2AE6598D1F4975D0FCF9D9DC787EEB5C03F8B0BF438E83C38E2195EF1D35D40F5A14E194BC1BCC64D02CA722E7DA28334E91FB6654D708C5B07946CDF58747086EB3CA59D095EB27F1B7E6806D3A35335B2265031A1120F28EED8B4C5D9AF268502727C5D23152149C98E6970D4DCC4B9D0FECFA6A79FEF82CB233E71FC8AA999DF66EBF5A1DB2ED1583C65803FA8958F49890D13BC05C6A991F26C31766BDEF9BAC601A47C8C3C5E395FD8F47E56F04439E9BC8E9B1901A529395F2D57495D70D0712881D298A60E3E013326CD56BF9F1319EA8D6A6511EEFF373F081478A51E14F0AA4A33C6C5EA7816380C8984F7A5DA45B0C4B6B550644E65A5B2DF059ED050936FE6F073B4E8056ACCD3EB65A0B -pk = D0CB95D90BFC82DDCBF726833F893DE1EE1BCFBEBE8335B80CDE0A0EA01489028C99088CA993F63F9B8928AED1A52801E48598551702D76016831B80052D52F040537D1C8BA86CAB0843D2E77E461C151286AF800409505692384A132952BE02 -sk = D0CB95D90BFC82DDCBF726833F893DE1EE1BCFBEBE8335B80CDE0A0EA01489028C99088CA993F63F9B8928AED1A52801E48598551702D76016831B80052D52F040537D1C8BA86CAB0843D2E77E461C151286AF800409505692384A132952BE020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D3D84D1C18B6C302653F9B595B3B105F699154FBC0C80C60D01E49687B4C611E2EBD6AD65206240B724202499A10EDBA9B1443DA92F9B89EEA64D4F20445FB23FC3F1700000000000000144C976F2B27DB4F1D08909DCBD2116728E09432B62F69D58263284CA073E6C87F44CCA17472B1FE07E6C422807964CF39854F3B05A2C96F0CD96860E27FBC89604D0400000000000000B8105F6412C1DED5E225727CC3BDBB329A38D948AAB66468056725B05CC1F7E2C8BAEE2CAADFC3A3C7F340010000000000000000000000000000000000000000000000000000000000002B9E99D3703826ADAFFCF02EC6F1C8349B46F9CD16E62A82E93DDA1FAB77651205E2C53EE5215BA6E577CA00000000000000000000000000000000000000000000000000000000000000A9EB86809CAF934B403895C8AEC933EED84F38F6528AFFD369DDFF99B5419B4C29E22E7D3BA22896035ADBC5809A4103EECC4107553075383A459225F81F6D5C278AF0414F6BF1E87BFA37CCBD57DAF0369EFF1BBBC412B80258D62D6A4B5803F9DD0EFA57841D05EB176BD0F8EDEA383A47DBCFF5B383AB77855E6703A6BBF2525FB3E9DD806E6F023CFB9208CED10052A9B590BC99D163382C7C8FFF75CE53271F593D42E4A8EC8EEB0DB494B2E2445137D0306BBF1E143D89B75C0BD2450313C0F4835A6B27CA7F86059FC16066C4B8C14CE68AC5B0451AC99F5E29DD486F5E8602ECF3D7D0EB1FBD46BFE22260017293F0B5967EADB40E309D2E5004A73D4FE0FA0C23E0F1C80B9B5FF6094C99E9F398F39BCF95AFC8B545CAA4FB837503FE58E0BC9E6F84E1FFFCFA5383AFD3D63D702CAFCA5BC37B15B83699097854EA56BCCC42012C933D177F60768A8239008FFA124987ADB7DBA40621C7E4560C4AE12923796005AF487A8291932276656F6A57951B63D46414BA596743E671BE035565757D52FF7263F240BF09BAB62FE3F2E8059E8F117AABF20D2753E8829E2ED2873E0CCB374DAAF61FF2BDD2B0E40221BE9E2E411F889C7E4DD7B3EAB27838F01E1AEC6FE2C30C92937B91929DA9DE76D11D20D2570C7F79EE1EB509079E02E25C52F0772D86441EBD9EAE22A84274CE893A682E1BB01E015F7AC8C527FD5724250BD6A438AAC20F554D0F3B0899035B8717F87FEE848BC4DD77C5C63CF280DDBEC17963C9965B3CD32E2CE7B2C4CB6D845A5B3DF40B1A67A0D9AA2A6A1F002950F57698FD5A0694BA43EC0BC656E70153C1661BB8AE5EFC9E5B28FD5FE437EFF13B18D02AE7576B6D150F0E900300E489D10A90675EFC4E1D5D72C39A2A553E74CE81B445D4A36DAFACE9CF080FDB65985EBC4B919B9A6906AC8D89EC7F03 -smlen = 3497 -sm = DC524CEB8022C804D9BE8E9F00621DB24A48AF34B10FF763C300808CD7133D52A3B9C4D1B7230162D5FC7E49A61D09ED9F5B4B0189764C902B30D4CB8D4CA3CD01A9CD1D534DD55EC81D5A3AFB0067FCD692C31FF7B397E9EF0100A3D3C373785C4D8D9FC413BA01B35C750D3547C50918E249E9018B15EBCE279CF588335DDE3E0178736AA2F6952EED0B610ECF00929D66D20E4E37AE514118030194A700CACCC06A88B902674D015A1B73918C436D363438FC31007D67D1CF8EEF74BA3CB74E1C0159FF86F72E3FAE861CC4A1E60100FD9CF4611B265B1C2F409FD79212623D8AF13452E51CAF7AD80A01358525D7F9E7007FD4F42F9001B29C831014021914EBB0348D760B525E8B98C55864849FFC71EBC953F7A0ECA6298F6AA15A83BF6923BD5921B1C86DBBFC544A39C364EF6D9281481E946C994F96829D6639727A5345560D8641E9A510F913F7FE5592C2A40CB278F5AFD8D4504B5387C20945654F08168247A98F56A43A5020955F882D2D93781F4A83676B08F50341E953A5D1B67DE7F6D1BE3D78D5D060AA85B5EE4271763C437CCD595890DBC8FCFAF2754AE9349BA2FDF89847A15188716C0EC672887A4B9A15176AE0C5138819CA232D012BE1DCFFD29F677442083087C127CBD80B0D9CC0962BC8318E734910D1E2653BBF700C84BB0919E12DF331CCDC7128B41F0666F6419AFBADAF673BE16C9177D3CF113C6488504DE088149BFB83EACBBC400309B7AD753F7B2F5AA89F070C9D14C084C32DF91C5F7CB6A7D869D64F4A05AF80A98BE7517ED784C17B0D7DF96B9987B7EA7A398CE018AE6E13E1C0F7AA040AC3FFD273BB9687AD6FEFDB211061A6228967E9DFEF69BCC1C5D02EE56D49A93C8AAD46D08322A2CA246AE8C3EDC071D063AD605A97B8AE94D58E897A4A6310BCBF55B0CAE1AA81769D30B46F883EAF29D4B5FEA32F2DBDE49360CB6235754BDC305ABB5E5395360097378656E2BACE675448889B0149D6086C51E9C3AF07A76563164864F131CF9C0CD475CD4A58726AD237CFB76ACA68032351FB24711DA635871386B4BFC94B0DB6D35F07D0196F75CEDB92EFBE7D653E0FF9326A596F9166FF6CAB73125DAD27F361D6122CA531D86910187E75F849EDB52DB26C96FDF05925DCCA232480D3F979EAB07CCA68FC9069965D12BB666A180989AD1FBEE3FE65E746C5A8F64DAB2E370F0487D001121EDD0D0D760531AF46DA65C75DE11688EBF31DD2AC95C188BCFA07EA798609F3EA8E6364A43742A2825144FAFC05ABD17476480812EB2483734B13D075B3EE3AD510B67CF7057014351B2CE5357E3F12F43BA74CED614BE3A9AC0E26763E9AC596F87AE98F72ABE0DE213A81A9A03E2B82F2312C1A186DFCFC3DB346FEB132931C793ECF837F57D8E326101F59705B77A3083E712CE347C2C29C23468B0C5857EFA410197833987C61ECBC2A855EF78B3D7B1B697AB9844AAD07C4B8EF666BD80DABA5FCAC900C5D358A11676FFC89DFF4F36F29F14D9F9B854DCED41FFC4B36381449D22801C19BF8E8BA1F07A1B38FFB527A34D009C4064A1E606FF2AB90AB2E05C156150EC14D7DC792578A16F46650D0ABB61175D1817E2C38F109EBC01A3ABB358673561691185DA32EEEF566C1BA1C72C1F08CD1B427B552425501B8783116F2EB0CFF73C5D2DEF18D291C106980135821A77428FAB20A935AC8B6DD8EDD1A936225344EB103DE0D5879CCA09359B5B882291C0FB1FCCF167C30DBECFC324AC315713CD10F35B72F0D4871A7CBAA2B4CC2BC2598F23DA607C94A063C9E2013B0EDA5F3BD5AADB2C429177A4BFD7B6181ED5F9A55C1F043DA8155C9E7BEBDA7EA07DEA49938FE07743DF2295C220EB53348310842B1000B7A02AC025C3A94FA82D46ED7E2712DE71B149742731EBE62E225D21A7F29D5F3A8A62B71FE16258570DA412C07CECF82B2064AB5D98761C69FC5E899A8E174875B3179DEAA0BF4A0261DA9BF39148440DCBEB0C887E41FDF751505DE79AA1F8593F45482B659F5B5F4CC3E7BFEE59DEF49458DB195A1A692B8AF4AA44CCFB00B753AC761181B8AAB39DB82385AE776CFC585F7873613B62DE55BB10A6B2F27E631CE41436C3FE390163E6F4EBD6B501519C96C06FADCAC8F75920FE1435542FDF535EAD6C0E3F41345996063B95A208DEFB6F110CC861580979BF4422ED395CA218CFC3B22C0BA8B31CB9EEEB51C3DF35FECE92795CAFB8440F522B44E21B3A18D5CDBC296B887A4B927F36715E4AC2CAB043D8B69A8704D6BE24C725B0C2E814BCA7B040C27FE8F4C14911051039AF13F44E0485EB767F5404CFB6FD19DA24D82FE24B53033C83DD8634E2E28AA330A81F14BAC1C57DEAD7FFE39994D9D094383E14322E146A3DF27A776E2F09A11EC9014C809F8E543594D6B4814918A129B36FD25015A044E04D3F081D4D201DF86A0FCAFBBFC695088170B8246776B6A28E59449C646D1E706CEA96B12683CD3A7C60459D42989CA46694B0089CF88E9AEC5E110F69FE0E3FE20D18309D1BA72A83A34813B771484505B08548FE5D376AAA0C414260EA4BCE5EB81F6545CD5203026264938905BE1E252574F4B4E71C6E12F99F6EFD35EFFD64183CD0665FE89D6A357B1908E083511DCE2CDF792A608044C31418C433F86719E156AF3FF98D0F54EBEB9F9FBF24588A5557D310EF9D7CF5DD8A68512D8CB15114773C69D7B40C927858AFC049F7C6A89841020E1C313C5C38B988EF505EBE6C15FC1D6CCD8B472F90ED64DA895D06AC01BB99F455A195A670D22DBD5E3F03AC84A08831E9842A566E9785A0FD4C460C5CAC154D705DCE1E7FD1C45BAEB23976AF881CF5628F3CD92AB19BAE8D45A03A859518E4A1E558FAC2B48A432E46CF274E6496B63874CA4E4571132568AA43EEC3D2A3948F40D327976A6D28CD816CFBEAF8FE126913384061D219F51179F679081503371EA0B6BD7E9524B0ECE2573304ECB4A16EB471CA0817C0C6EDE751F283ACEEC5A60C2796C6261FFC6226E4813241619F465DCE67B38E1D5A647B079503144907307C7D6EB6E6EC1936B5C94FCC08A882B4555B19B33A9BF22384DB38473A313966D157DAF8AAD41EF67D3A5FE723559096AB1768FF69773EB9D5C88D6F35F00DFA4473DF71C7E9E35393638DED05D05C105CBF37711D38E3EEE35E8CC0029B3761241FD1E56969E09E949690D4FE25735D774E777A2CA17FE058E14AE6806F611FB1E9FCD516E20499A704B67990716703A4287B50AB45D155D40EDC0AAF97F5B87551C236CEBE9CADD562B27957EAD251F79CAAC6433F228B50167FB1A753306FFF08B53A8A3CECC226857A321700EBE23AB4D6C35415CA79B682D6CFEF6B1341E7CE00CB9870F432B63A2D9A9A43C87D28A95C514582812DA37738BDA6CC76142E08F69EBAA5ACD0403100C2343E2FA088441E9A55C720BB509BC3600C27C1D39157E049650D1749751EFE55A72349E2A5B714556CE2188CE972287BE2152C7E58D3FCAD43A214A4095DE55CAE9F627D8B9018DAA01547842FA1AD14D67327CD47EB9B90CD94AFDF5244DE57E527F17894A410FB4210E06632E88A398400B0AA48CB3FEB9A90ACC668615D193D5A98158092FBB59AD2D6D4FFEE433A2A6A971A228685AE5BBAFB3AB28242C630AF4656C5071C545618A0A765FCE41B19970C2152D44C349D0CDFB29673D1A42FFEC139D1C9958B0962F7B57F80CB8FE6331553B0DF93DA9BFC722B1C001F48FF9C0FEF032610A1118AC9EBAF9202DFFEA605272A50A90768F031C72D570C0AA5B0D4FEE4AD568895274388104C0BF88D03FADC3159D6CF28AC6A7E3E5CF6FE5C6658128CBF81456DB8C29A76F9C75230F3837F1A94CB83C3AAABDF4B29C9045B45AB9552BBB6C0844BF2926267C0D74D3337249D5C9610E0F6FFD0278F12F39C48650C048D61A3FDB8E1A2E08CCCA68803A55B39BD39160B0420CBEAC7D8A55F571F490F694A7AA8B725BA84238EE1E711864AA1F74AFF252C088E36B79B09C80278DD442EAEA8C7D5833CD1BAA18BDD866689E663EADD0EAA6E0C78A3E09DFFE5F6F1F4003DE24336586B25DC5EE45D56F31D8BB2DE31B24E87172F3F1B26D400B08D50FF624E456183F269CBF06B3707260383174FDA152E4D0C528A90C54114C4F278D0FB35B74DD3ECDA14EE89D38E3227A7E18B068F134B22154348867A61719C926EA3320D1BE0B9ED78466B2DED728CA04C15AC144185FB2F5084511A38CFD765659351AC1AC3E5F327D9F3DE9B2B003758DA78DFD08FAEF3625CEDD87C8A55A3CD0257AA71B3788FD2449EFD1F48948CB304468E3CA07EA7044FA185A2B91F9761C6532B9273DB74C66B2DE95AB19E5102CB90C719EC85671E2829B182BB6D09323248D6584F0CA67D422BCDA65A0146D8DF27AB4AE651706D5FA33B5BB88ADC2A1A95105D55CCA8439A5060D110760DEE8B855D0839053BE595278EAE66542736D25C93D8544C6E55ED51AD6E7029C2E6D32CFA8844BC14972809E31754AF84BB479C504EE77CB65CEDDB6BDA613FEAA2AE6598D1F4975D0FCF9D9DC787EEB5C03F8B0BF438E83C38E2195EF1D35D40F5A14E194BC1BCC64D02CA722E7DA28334E91FB6654D708C5B07946CDF58747086EB3CA59D095EB27F1B7E6806D3A35335B2265031A1120F28EED8B4C5D9AF268502727C5D23152149C98E6970D4DCC4B9D0FECFA6A79FEF82CB233E71FC8AA999DF66EBF5A1DB2ED1583C65803FA8958F49890D13BC05C6A991F26C31766BDEF9BAC601A47C8C3C5E395FD8F47E56F04439E9BC8E9B1901A529395F2D57495D70D0712881D298A60E3E013326CD56BF9F1319EA8D6A6511EEFF373F081478A51E14F0AA4A33C6C5EA7816380C8984F7A5DA45B0C4B6B550644E65A5B2DF059ED050936FE6F073B4E8056ACCD3EB65A0B - -count = 98 -seed = 6F6E47E8336ADEE99B2C52CF2DC8D461E0A54C3DF2F08199A9F0816AF8455381054CE47A7766726D3AFC2E2F2BEAF8E8 -mlen = 3267 -msg = 00769683FE7BFD74B3ACD21AF3898B74CA73DD126C8315538937CAC4EF0AD4588765A26DCCE1C90C559CE691E7EB3E0A497D357E1AB583C761439C0A66D1164518F01B6894067925753CC2866A91552FCD0EF029C2284C620CAF364DE6C56EB41EE0E4431D9BE22B76451D132A3F9AD91A53449BE820A7ACF56F6ADBC7107C7C729EC8A64FFF6A24B4CF83FF4E945DEF336DBFEA6067FCCBD1CD6B5698ADB1AD6DF03FD0A553457B8E9FEB4A1243FEEFC2DF7F66AE3ECA5BF169F7891ADAEA8D5C59012C7AA00A5A86B0A33D0006F8AD5A01C60ABBDA6D249D3FAC7EBFB85103A3A747A45D0ADB7DEF52ED3A5F1A620EE383A9C0CCE1900E413FC74A7A97646111D54783928B15BCA783D01EFC67F49CE6F781E82D25D3F30561F507E3831CB4EA5B4A08D5489830017270B63D8298BEEBF48EB56BDA5685D5E1E06404EB9A6C3790E9B29C99168B10BADF8FDB03F3C568672773EEC96428149CA272EA5A8083F8208BDCE361E7D40BC4DA75029D4A18B0B6AD615DBF849935D4755CFFD270A52FA290811CD55BDCA38ED89F0066ADB9BA7F58366379FFE1CAF3A9127E147C3AF3DC27279391E0C09537E81E20E7B9FE4FE3DA970FE50BFC96555233CC9E61D3C356AAA8EED5A8AEA2327D7036EE03E7EE40AA35E9DA4544B121514C261EC1CB0B2D75B1D5CE129E47F89825F69BA8254163179FC1331A917AE9C5A18556A10C5F983871B1258CB6FC8AD207F97A220C5598860B6C56F1EFF09DE6000241E901A89E107FEEC15833D34D6EB12DB6B188FAA0B858A5B9E32F84F783B43B6F8A3B2E4B044CFF8902E1EB0C527BB4E29C92ACC9DC7E0D9AC6B3A021415768B21DD9695983EE89C871C0EADE0BCE4FB72E682DFB5A2BB7498BF4D2C01240F67D1B62BAA4E587069C16E3032114B14A1C4288FEBAEBB4C75C3C05924A358C4BB7DF95ECF81D67147FAE3F605EDE61B7BA164EBA1AB36ECE97DB0ECB32A673E899B24557D8987AF3ADC57A9DA609914C9B2D6D8AC58E5954E0DB5AA9E75B444700B8F704E15A6A7BBA81809FA8801C6CEB5747A44CEB8F99CFE6D8A2A03C03451E5F3D392725207F3DD28B2C00004425B7AE05FA3769183AB60857B27AB08BCC4321D293C93D1D850D4E7A81B14564D7B15AC0E3BC1BFE0561622C6AA06923EEFE163629EDE8BA1732DBFCAD52D3BAA6E11E569EA790B36A8472B2CA37BD5C0EDD37D8F164B874952D00D592FB705C6B3110A12B03829C157191D33C579593E7828CDA5C24A284BA2F5A42F0BFA601A8F6D3DB1CA6D703ECBD261629C9F96EBC0458737B9951219E5B1F86192E2A85B47D80610A0ACC8B1A70DB2916F89CDB2C7F8943471DDBABD2A3536C5DC8A73CDEDDEAAEDC86FA148D2EE479F8465558852FCBEA0DD8017F1B976281A5014319C2C3CACCBF571D9550215B24134F6DAEF32716802E7945CB3F97AFC1AB1DA17D0C41B545A750EF345A6F88AD5FF52D512AFA6558335B5EB8979D8E6DC1DA562BB997E7D152D9FA3EAA09119C3474E11218230D8A56C19AD87FDE483FBD6DDDE9ACBA813BEBC8505A323C601E5B5251650DAE9334562E3DCC38A28BD7DED6942D0CC2014235C1B66CF4A57BA3010B83CC7050309F57A27207512D195D070DB3D10FFCBACDB47E4231142BAE588F92C5B0A71ABD67CA9390C2E05FD2CF7A1FABB14C5A7AE3773C66DB1F055214479E388B5E6ABF0DF8FD1B0E4F90828ACC397643CBC274143FB4331262A20634877BE4C7489C1AE9EAF90BB2A177A6B5AC15CBDA27DA0616E5F87461554F5686A7BD6D047AD0B98C8CDEA3DB78DD2970C78FB861F2A92DDC277876791C4A30F525659557831F4377065D19ACB384CC68340152A6DE6D84CDB58F433923D1FB8CC6B10BACD95B9AB1B45563998620D192032269FA8301C09A29C4B5B20CA0A3D63A4F5984B7DB0F5B17417DC7B939B9B177BF423E2F3D57DFF296E6E4FF0FB1744B13731206EAD54EF0AA1DA09BEA8B0AC0EF71B73D009D30531DE9FDE90D86BF5F20D8E5A9E324E657A98F8C0031ADAC4385157BA4E28B48AED957A5B36C3B49057F8ECA7F56808F794014DAD170601070607010E004F42D01CC63B2A1761126BA045F1165E25FDD05901FAC6B76E777FAAAEE6F5ED94302E2DA28046B4BC60228E1B9E194F364E377F84681B3011583554B76FBF8D7456DBDEA665ADAD6AA0556C8CC714F217A518A98615C4C1CFC8ADBBD4D12C5BC23AD7A0F849E32FE2005334B55D7BCB43D1C95D4793E7C3882740CDE8DD24B367294496A3E2F3251A66CDAECE9E0A73D853F8D4E3A4637836DED68CB28BA4FCAB02D61FB5CFA581792E636217F3238D78912EA0863816FFB2F388823174B19433C2B14BAB69E12C3B791FE683744D4519455A52555AF0D7E12749F6094AFDBA00FC6A609C7578C531FC4C3C3065EBF78414F112014726EC2230F9BCD9C15E36283144CCBE0D1785B65CF49BA8FEFE92EB6907C0330BC98AC172EA9E8DD4DF8974DD6B6772BBC6CA8E8562C5EC0B6592DE7440AC915C35E0AC8087F22EBA110CA3037B469B1D5BC92636D81881E38D8BBED01A29B3EBCF0C19EB95BF999EB848022592AEAAB649CE19824ED9D3A32D75FBA556EE07606A306D1FCEC2E24B38274C361B7BC96CE37B7F4FE434EBA17AC2A097051A92E4EC32E4C678F7762E8B96EBFD2600C0F224B04B2CD7E9F4AD327D53603828015E9CF45969800F02FA5E0BA26B8C844BA1FDFFDE44303AD0389C1B31D582877CA6BFAD4973BA35FBB90ECDD95F430078BC39AA89434130A5FB8321E51F9624090D0277A9F112EE8FF65D3DBA999C7C08727D0F08DCF00CE22F62C955D6A822F247C8065AB94AC442E1CB5F31254816794CC2556891A523B8AEF09D3B9E07AA8B67B3B87567ADEBDBDFB93BA9A082F72052572C97E73AF16CFC42D2A51A3683F84748A338AAB56264753BA4083D356A27C71F47221ED8340C50AFD46CD207C4F9634AB5A44888A4234770C46232C35EFF83FA950B0A6879137DCE209D5A1F26809B411F046F51FF084F15BFE03292EE845D3044235ADBC299925235462E67F803DAA1426F0E116B93F4532DD2784F7F87AE360281CE21F70D230C242E1A98DE8FE1D6147AD71EDEC89E24A5980C45FD91E23516758AF71DF8E0DD96929D4DA61A3BAEABB96C9378986DEB4C9101175E3AF1E102B52A8DA27D916EE4A28263CA485CFE87EE5436249C1A2F933669F6E3274E9BD93092F4A798AE85D6592EBB54DC65C28BA08582E275972B0A12C22A7792CCFD4A398E504C6FB2CF5EF1F9C268540B4FD7D07D59C49A559D86A56A009C4C18A3FCECA109FC7A45C6E842ABC22053E84878C4805D96AC96BA00FA40FC3B50407141105845055447CA94BD27F234183C2B8BF37F5CD249ED0705AFAEAE59C8BE8F6B38069D67FB23F74284E8185C176B58B482900A3E09774383C7ECACF4FE5E580DF99DB102AD4018DB73C73A635D3FCDC833B000C948D846AACC92ED54FFB3ACAE1BFE205D6B2312658F15DECFA085D13BC3757C754C5704D8089563E0CCF52B04A49DF293CAFBBC2FED5D9551B5A3897EC7BEAA56A4034BEDCEB4840A9BDFBB8BF47D66DD3A4E3EB1666372C6B2C39A48D52761BD36403CB130A087685E2EABB8711C11005EA09F90AC49665415C56CAB6FD2719C45B6800DF914F8FF327EED29D9B9A5BBD6B80B8BB31AD1522803B2C8D89166D5C6B2ED47BC5BBBC4ABE6709D46B856AB81DDF15F098A9AB76A8257E7E5C2E7DAE53FBD691736F0D6BAFE0BB939172614E99C7D7E37754AF6C3C637D076A43DBD70E5EAE910C8170CECFF1621E382D2977635B67F4FAC555419F8A0BB76CCAEAEF4C7385D293C9595AE10E5201C4A31B4C3ECB9F3B304EFB1886F9C58A4EF04E73341B95D9BDB85D706B2A8D3FDD153743A8BB7B3289D0FE79F6A3B9E0FE160DD6700FD64FC87D9AC96858A6D395FEF6F3D2193EBAE7C3A92E18746A7F12B244FBC5B1DF0086CC7045036519D9D7BF8E92B850EA0D3D1E775DEA362362462DEA2D3501D39203E2879070D1F7AC92FA1576F6D12886D5B979E3C788C09A769EF4EE45E14CD8E7553EBEEFCD31FF3D43D4988DB08F6630BA8AE8C7250AC42A3D78EDB967D59310A4A224567D8797C42370CBD2302A3F49ABEAF85FAD9455F98B61EF2B5E34A5C552583872145E191BBFFCAA526F5E38E497A1A1E1220A0F283A935ECD366A9069D5A2A80BABA3A22FA85A2557DB72D7E29EB4E33E8ED8BB4EC2EC7C2E9CEDEF46EA955834ACF8C9AB23B78052446FD73C9D61683D7FA0088DB97D07CC350AF0B6B2AD7E66A493AF814C11F8C0F2FDF0DF40AAFD0D218C00319C367E98D7F10C74EA06D31276F3F216E1CB2F12033915008CC83B00AC60FC9C2FB7F97D6E8CD79650D0F9D82BFD9CAFEF668021D3D165F3FE84221998BC8C29AEA0B5B7E0F1F25A0D7447E806CC3FC39E6038BE3DF9AC01F46222D3A609F8A026744AB4F58A734E3782BEC301EA91F2D8E2242D04A11E82474002143223F29656B1A7675AA5AD181004C4F1381DF6A0F95A0186E82C04B4DE881209E9CCCA3EE5B1DEF0B02353738D92A07314403A1A2721C256121FBA8B8CE9B460 -pk = 570B02C7931242B5754862B71EC1DE5648958C0F83FA2858A233FD3F1E0AAB815BA192E5BF332EB7248F5BF5F5197800E93939EEB2061AA0926F17CFC7D79567E6E96FC4982433B3E69A582700DEBD089C2E7C6A0B1BF3DBB11911116F7FE001 -sk = 570B02C7931242B5754862B71EC1DE5648958C0F83FA2858A233FD3F1E0AAB815BA192E5BF332EB7248F5BF5F5197800E93939EEB2061AA0926F17CFC7D79567E6E96FC4982433B3E69A582700DEBD089C2E7C6A0B1BF3DBB11911116F7FE00102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003652D8BC767C871F6C5EB3A89DB0AFCF5978C27EB5CE5AEDECB4021DF42AEB316AB4A3726993972B03B12D2EAE92FCF9E9A4F920D58D4AEA827B89E651B6D9E421E318000000000000005518BD5451A5B5E2E58177C164E71157E4883C88BACA906996B2E562A18BCBA33337AD65722406BA1A21D7A5FE69D1A77884E399B0ED298ECDCD1694CD7670C9E1DED7FFFFFFFFFFFFFF4BFC4007383CDA23F7240358C4A6A9CC5E87319BBD63944EAA70B3C2D17549E9972F133C45296AE8892E3100000000000000000000000000000000000000000000000000000000000000DA86D7F33CA200CD9B639F73A432853C76E25B5516BD6BE006EE58C1D0E6397D538372692C824C02346CA700000000000000000000000000000000000000000000000000000000000000A8501D2283BF92407175E9A4F4E82FE76F19C3B9CA5D9433B14C3EDD8BFE57D4D361E2D5741795A6329BE8A47AD34B0008FCA6E5BB3C567A8CCA81528E66FF57BC36C198B0C8E7E1C4972F3FAEE4580EDF3F45459E76F4859788963D1BCC8200D9C7377B59DFBBEE710DEAA530EB6981113C92A69DDC8A4909AE8C0F73B26E9D5548C398F13B3169EB336CEA30B06901FAEA8306746E66755909B4AC4CFF82904E236258F7569D8D86D0D7626F50C7015BD3BF9D3A933365FF000965D1846E030C3CA5AB04E9D69BAC38969A12CE6E91D10AF9B9D939D7E1E21D01601B897CBC58EE286CD3EB1BD7AF91662DC3EF0801E18C42881BB2262953DF8CBABB11876367DB5628D75FBA5D3F6DE05334E06595A596FAC71ACB7FF8AB956799A2B79702C4ABF395C6B092C2657F408A21DA013BFAEFF5D4E96E145388CEEA7C90D5F19FEF4769187986D5D35066C74025F652034DE57E9A509D70FD36F24D1CF7A4CEA3C18BD7DDF6772B312B713FC3EBF53740AE5E10B1A4BBE25665872BDA4D14EC025D155C2A79F82FEE1B4CBDCAA2FF349CBBAE85A695AF7180D9FD80D3067CB654A0F329CE96073A79F507D0CA8CDB1A0058FAAB92890EC5E4283F30137AE8E65F1953535807C654004DBEBF157EE9BA232171101DF2F70B88BE85C3A298C41002E329EBEA9D4D3EFB17DA8166B9B3D9B9B0E0E877AFE1FEDE76338357D064AD4A6ED3929C14A9E84D8583B9DD5B6E5E00FA6A8EEBD89BAE23D017C762233FF5C7D84107085E7877859BE16E9C6CBB25B22825269AF9B3B3AACD03DC1097866302A5E1E6307FD63AB30B36C83306647B3EC7A1383CA205B180DCC0310D6A62EAB5B313634EA1CCB4E5CF05F25509B83E0036CB05E25D58C59E99C0623315E800C922231964428EBF21F7F9296A395AFB4069371C908B0CCD3305E290F2B2D9FC01 -smlen = 3530 -sm = 86A4621E13DC4B34D539F12E0075FA6624C14A8D98642F040600A15AE5B57DCB1357C822612A01C64D7AAEA931EDCDB7A4F5F00053468A28A4DBF3EE3333393601FDDE829624EA10E98971C7BC01DB91813BDF6018A9C5CB13200024CAD9FA2B6C0BFA7987431001F207823712B27051B5182FC501585750AE36F418005DFBF85F009D0B604BBFA5FC6E78C247D7013B3464BC7EAEFC8E5998BCE900F18D2B0D07ADF32C243CF839003E3B2B80D13E0ADA21415B6300317C84E97BD36A08CD99CE8800337F530853007ACE84687E6B0101C57D803C04F4CB65914624929C844113A5E021AEA677A114610E024C9A2C4E0113E9165D657E820014B403AB13612B036794FE571C0700769683FE7BFD74B3ACD21AF3898B74CA73DD126C8315538937CAC4EF0AD4588765A26DCCE1C90C559CE691E7EB3E0A497D357E1AB583C761439C0A66D1164518F01B6894067925753CC2866A91552FCD0EF029C2284C620CAF364DE6C56EB41EE0E4431D9BE22B76451D132A3F9AD91A53449BE820A7ACF56F6ADBC7107C7C729EC8A64FFF6A24B4CF83FF4E945DEF336DBFEA6067FCCBD1CD6B5698ADB1AD6DF03FD0A553457B8E9FEB4A1243FEEFC2DF7F66AE3ECA5BF169F7891ADAEA8D5C59012C7AA00A5A86B0A33D0006F8AD5A01C60ABBDA6D249D3FAC7EBFB85103A3A747A45D0ADB7DEF52ED3A5F1A620EE383A9C0CCE1900E413FC74A7A97646111D54783928B15BCA783D01EFC67F49CE6F781E82D25D3F30561F507E3831CB4EA5B4A08D5489830017270B63D8298BEEBF48EB56BDA5685D5E1E06404EB9A6C3790E9B29C99168B10BADF8FDB03F3C568672773EEC96428149CA272EA5A8083F8208BDCE361E7D40BC4DA75029D4A18B0B6AD615DBF849935D4755CFFD270A52FA290811CD55BDCA38ED89F0066ADB9BA7F58366379FFE1CAF3A9127E147C3AF3DC27279391E0C09537E81E20E7B9FE4FE3DA970FE50BFC96555233CC9E61D3C356AAA8EED5A8AEA2327D7036EE03E7EE40AA35E9DA4544B121514C261EC1CB0B2D75B1D5CE129E47F89825F69BA8254163179FC1331A917AE9C5A18556A10C5F983871B1258CB6FC8AD207F97A220C5598860B6C56F1EFF09DE6000241E901A89E107FEEC15833D34D6EB12DB6B188FAA0B858A5B9E32F84F783B43B6F8A3B2E4B044CFF8902E1EB0C527BB4E29C92ACC9DC7E0D9AC6B3A021415768B21DD9695983EE89C871C0EADE0BCE4FB72E682DFB5A2BB7498BF4D2C01240F67D1B62BAA4E587069C16E3032114B14A1C4288FEBAEBB4C75C3C05924A358C4BB7DF95ECF81D67147FAE3F605EDE61B7BA164EBA1AB36ECE97DB0ECB32A673E899B24557D8987AF3ADC57A9DA609914C9B2D6D8AC58E5954E0DB5AA9E75B444700B8F704E15A6A7BBA81809FA8801C6CEB5747A44CEB8F99CFE6D8A2A03C03451E5F3D392725207F3DD28B2C00004425B7AE05FA3769183AB60857B27AB08BCC4321D293C93D1D850D4E7A81B14564D7B15AC0E3BC1BFE0561622C6AA06923EEFE163629EDE8BA1732DBFCAD52D3BAA6E11E569EA790B36A8472B2CA37BD5C0EDD37D8F164B874952D00D592FB705C6B3110A12B03829C157191D33C579593E7828CDA5C24A284BA2F5A42F0BFA601A8F6D3DB1CA6D703ECBD261629C9F96EBC0458737B9951219E5B1F86192E2A85B47D80610A0ACC8B1A70DB2916F89CDB2C7F8943471DDBABD2A3536C5DC8A73CDEDDEAAEDC86FA148D2EE479F8465558852FCBEA0DD8017F1B976281A5014319C2C3CACCBF571D9550215B24134F6DAEF32716802E7945CB3F97AFC1AB1DA17D0C41B545A750EF345A6F88AD5FF52D512AFA6558335B5EB8979D8E6DC1DA562BB997E7D152D9FA3EAA09119C3474E11218230D8A56C19AD87FDE483FBD6DDDE9ACBA813BEBC8505A323C601E5B5251650DAE9334562E3DCC38A28BD7DED6942D0CC2014235C1B66CF4A57BA3010B83CC7050309F57A27207512D195D070DB3D10FFCBACDB47E4231142BAE588F92C5B0A71ABD67CA9390C2E05FD2CF7A1FABB14C5A7AE3773C66DB1F055214479E388B5E6ABF0DF8FD1B0E4F90828ACC397643CBC274143FB4331262A20634877BE4C7489C1AE9EAF90BB2A177A6B5AC15CBDA27DA0616E5F87461554F5686A7BD6D047AD0B98C8CDEA3DB78DD2970C78FB861F2A92DDC277876791C4A30F525659557831F4377065D19ACB384CC68340152A6DE6D84CDB58F433923D1FB8CC6B10BACD95B9AB1B45563998620D192032269FA8301C09A29C4B5B20CA0A3D63A4F5984B7DB0F5B17417DC7B939B9B177BF423E2F3D57DFF296E6E4FF0FB1744B13731206EAD54EF0AA1DA09BEA8B0AC0EF71B73D009D30531DE9FDE90D86BF5F20D8E5A9E324E657A98F8C0031ADAC4385157BA4E28B48AED957A5B36C3B49057F8ECA7F56808F794014DAD170601070607010E004F42D01CC63B2A1761126BA045F1165E25FDD05901FAC6B76E777FAAAEE6F5ED94302E2DA28046B4BC60228E1B9E194F364E377F84681B3011583554B76FBF8D7456DBDEA665ADAD6AA0556C8CC714F217A518A98615C4C1CFC8ADBBD4D12C5BC23AD7A0F849E32FE2005334B55D7BCB43D1C95D4793E7C3882740CDE8DD24B367294496A3E2F3251A66CDAECE9E0A73D853F8D4E3A4637836DED68CB28BA4FCAB02D61FB5CFA581792E636217F3238D78912EA0863816FFB2F388823174B19433C2B14BAB69E12C3B791FE683744D4519455A52555AF0D7E12749F6094AFDBA00FC6A609C7578C531FC4C3C3065EBF78414F112014726EC2230F9BCD9C15E36283144CCBE0D1785B65CF49BA8FEFE92EB6907C0330BC98AC172EA9E8DD4DF8974DD6B6772BBC6CA8E8562C5EC0B6592DE7440AC915C35E0AC8087F22EBA110CA3037B469B1D5BC92636D81881E38D8BBED01A29B3EBCF0C19EB95BF999EB848022592AEAAB649CE19824ED9D3A32D75FBA556EE07606A306D1FCEC2E24B38274C361B7BC96CE37B7F4FE434EBA17AC2A097051A92E4EC32E4C678F7762E8B96EBFD2600C0F224B04B2CD7E9F4AD327D53603828015E9CF45969800F02FA5E0BA26B8C844BA1FDFFDE44303AD0389C1B31D582877CA6BFAD4973BA35FBB90ECDD95F430078BC39AA89434130A5FB8321E51F9624090D0277A9F112EE8FF65D3DBA999C7C08727D0F08DCF00CE22F62C955D6A822F247C8065AB94AC442E1CB5F31254816794CC2556891A523B8AEF09D3B9E07AA8B67B3B87567ADEBDBDFB93BA9A082F72052572C97E73AF16CFC42D2A51A3683F84748A338AAB56264753BA4083D356A27C71F47221ED8340C50AFD46CD207C4F9634AB5A44888A4234770C46232C35EFF83FA950B0A6879137DCE209D5A1F26809B411F046F51FF084F15BFE03292EE845D3044235ADBC299925235462E67F803DAA1426F0E116B93F4532DD2784F7F87AE360281CE21F70D230C242E1A98DE8FE1D6147AD71EDEC89E24A5980C45FD91E23516758AF71DF8E0DD96929D4DA61A3BAEABB96C9378986DEB4C9101175E3AF1E102B52A8DA27D916EE4A28263CA485CFE87EE5436249C1A2F933669F6E3274E9BD93092F4A798AE85D6592EBB54DC65C28BA08582E275972B0A12C22A7792CCFD4A398E504C6FB2CF5EF1F9C268540B4FD7D07D59C49A559D86A56A009C4C18A3FCECA109FC7A45C6E842ABC22053E84878C4805D96AC96BA00FA40FC3B50407141105845055447CA94BD27F234183C2B8BF37F5CD249ED0705AFAEAE59C8BE8F6B38069D67FB23F74284E8185C176B58B482900A3E09774383C7ECACF4FE5E580DF99DB102AD4018DB73C73A635D3FCDC833B000C948D846AACC92ED54FFB3ACAE1BFE205D6B2312658F15DECFA085D13BC3757C754C5704D8089563E0CCF52B04A49DF293CAFBBC2FED5D9551B5A3897EC7BEAA56A4034BEDCEB4840A9BDFBB8BF47D66DD3A4E3EB1666372C6B2C39A48D52761BD36403CB130A087685E2EABB8711C11005EA09F90AC49665415C56CAB6FD2719C45B6800DF914F8FF327EED29D9B9A5BBD6B80B8BB31AD1522803B2C8D89166D5C6B2ED47BC5BBBC4ABE6709D46B856AB81DDF15F098A9AB76A8257E7E5C2E7DAE53FBD691736F0D6BAFE0BB939172614E99C7D7E37754AF6C3C637D076A43DBD70E5EAE910C8170CECFF1621E382D2977635B67F4FAC555419F8A0BB76CCAEAEF4C7385D293C9595AE10E5201C4A31B4C3ECB9F3B304EFB1886F9C58A4EF04E73341B95D9BDB85D706B2A8D3FDD153743A8BB7B3289D0FE79F6A3B9E0FE160DD6700FD64FC87D9AC96858A6D395FEF6F3D2193EBAE7C3A92E18746A7F12B244FBC5B1DF0086CC7045036519D9D7BF8E92B850EA0D3D1E775DEA362362462DEA2D3501D39203E2879070D1F7AC92FA1576F6D12886D5B979E3C788C09A769EF4EE45E14CD8E7553EBEEFCD31FF3D43D4988DB08F6630BA8AE8C7250AC42A3D78EDB967D59310A4A224567D8797C42370CBD2302A3F49ABEAF85FAD9455F98B61EF2B5E34A5C552583872145E191BBFFCAA526F5E38E497A1A1E1220A0F283A935ECD366A9069D5A2A80BABA3A22FA85A2557DB72D7E29EB4E33E8ED8BB4EC2EC7C2E9CEDEF46EA955834ACF8C9AB23B78052446FD73C9D61683D7FA0088DB97D07CC350AF0B6B2AD7E66A493AF814C11F8C0F2FDF0DF40AAFD0D218C00319C367E98D7F10C74EA06D31276F3F216E1CB2F12033915008CC83B00AC60FC9C2FB7F97D6E8CD79650D0F9D82BFD9CAFEF668021D3D165F3FE84221998BC8C29AEA0B5B7E0F1F25A0D7447E806CC3FC39E6038BE3DF9AC01F46222D3A609F8A026744AB4F58A734E3782BEC301EA91F2D8E2242D04A11E82474002143223F29656B1A7675AA5AD181004C4F1381DF6A0F95A0186E82C04B4DE881209E9CCCA3EE5B1DEF0B02353738D92A07314403A1A2721C256121FBA8B8CE9B460 - -count = 99 -seed = CB2E6226615393FC3BD4AB3A412AAA030AAD40E8648EE6B56D2C1591D8B97915D88F2D22F7221377B4B04CF2AE9ECC4E -mlen = 3300 -msg = D21A6BB3A2356805E678673C45FB055FC5266E3F692AF9935AEA307F14A5C41B979966A5DFE42EBFED1487E4822B74AB5AF28995E085EC8007ECA4977C63EE5299FEC63DCCBC42EEACAB488E574249E9D856146750AD97C8A443485EC1C5820BEB0964640010F6407140791E74684DBB91052E2D8BEF7BDCD78B2EC03C97A53295D683BDBE32A70DC19A2F75B8613AEA9616AE0E280179492820F73FB7FA4121E673FB5C328F41B67FF8FFA7AEE6564ADABA046D6E1D6AA13FB24965390F829246DFA8763851405075F76CF94C66FFC3308214DF0960C649AAEDC22926CE9357D3875F8B71D68D75999AA3663C30A9EDF07228BF7DFF49EC1E6C7A33D2053597003B82392E826EBD701B4C981AAAC9951C79E08F592C2C0637C8E5A7F9DCDA599E859C317D4888B4098992E0E2D979E41C703686D577E5BA6001EC4F587140711293D664963632F87EA0461E0E0C5E9D8D292FB409F9F9AB172EE17FC8AFABAD06E42B437CE22924EB5DBD3A80A06962F3B37946259F9C75A233CB2B4ABDC5CD1B648FAEB1BE8630DB40D151B8FBA693DF2C5BDCAA14DC4783F450B6BC407515CEEBC5C9A47BD1A141384F0B596CAB1135C075651CBA989C190F3171DC1D72330EDAA01656813C4B7811715060B023FC426745C301B2A91E0D08ED3BDED438C4CE6799C35F3981C882A0BDE4A2FEEB1A52CAFA47B0C48558FC43F98FE08F03A71128362BB6FB9DA6A22249F4D4352AE7D3DAE85DE497E2411EADCFE5BF1A3C075C45811E0097ECEA255FE15BD8321FE8B546A8CACFB899EECF5419DB363C7567C2FE7360B36DE14674F500A31D3EEC71451A7C0D5576A8939C0F6D4D9F2F03F3C516CE25CE73ABB35C73AA94F6AEFAE6AD87052D6B195FA43586817F5BB974AAE7F1B8608922411AA5B0D7D574016CBD3DED13395623470A108FA0E1D3F9FAA7E1E5031843F2A23DBCE8B196315290DEA5795E4115D53DC570A444064CFA3C9457DBF3EE323B1966ECD2270C32910F8F430522471258A1F1955A6E1DD8C84ED9A566499BF85628615351ABE84B401421DA2CFAF575E2644C9304C075ECFC374066CEC713FA4C0D89043689FBC59FF54B8F97EE0A3B0989BC5E4EF83CC9833E75BC8B67BB5EE3C06EA156611CDA95A6702416807530EA206ED89835D20805EA988B1958569CDF7F809996214DADAB4E20BD44917E3410EC6BEAC98FEA07F764E85B66AED5E17CF675D2ED8E63DB728FE75158CB31779E31379648B43D68CCFF3780854CF03535C57122019456E73CF06769BF1FBF558542241CE665BD10F921828553585E0CF664CDC6160F9C47FA5330591B74194F4716056CA83993EFEC4A52DB9A1FBD3B2F504AC19667325167407375B6D7DE739F07947B511C8D475744E5C29D6E286A37F1FF8317BD0178F0E306A38FA6E75F4A80427FEB2C91235D3E7F20D8101CFC03BB73F44EF59AF3526E9AFC580027A1DADE37654238B8EC7AF0105248FE30784A88B72E11FC1BD807E47A349BD29075BEFBB29730EF8E85E3ABD5105559BACEE74AA27D90D360A8D629DBEC95EB34C7F7CA20096FF7B521E40D3944A975436896F372EEAB6B8615EB91697965BBF955779DD3047F7E3BF029E3509A5780247445D6223D085AFB4291D976EFADC41E42DC2C0728D18F6155654A332FEC72EB6AEF8B92C1D177E3DC28C31971BCAFF76DDEBFD9588BC244B116D409E58DC5ADA1648663D603C47FAEB814AAA7EB9B6264356F926C18B9357BF426B89DDC8EB9177ECEB5C6CDC64DD8FEB7B326BC1BA89BD9035235DA0E644EF959C58DD97B88D5C749B36931AC2694C67151DB0894652E99254222D37CEFE9E27B3DD663A152DBE29A3639AFE42F4578937076180563AAD6AD739255EA012A17D2A56627D84C44FBAB261D392A966CFE19278799CF1634D42384323C496190D4B9FB662694E3887EA66AB9E8B195488C8DCA47C8BC0424247759137CFBF86DEDC3641904CB6FACBB30A9FA84ACF69A67B4AFDF4C2AA420FC0D90CEFA0DFBBCD3072D9F772FD6058E2BF0E251BE93B00DC43765B53DB51B22F12D3ED0CC5655E4AEBD9D923F99A43E4461DCF5992030E66A1CDC3A65558D9BB3A39788D92328387D144850DD3706FD7A079E3D2398F542F91A8AAABF0C5068DBAF1FCC5160398ABECF74884BEB04F3A3EA38BBB80D798F5981B3F2DB6C7B33F867B7DC06A4417E30F94CDB4F523AEEA0BE12BD75AAED57520DB0D4B4F013BE3A1DC7AE5C58FD1DE9637F7D82F697B7E92DA427A78FEEC6A5C0255EB57A43DEA6CEBC8805BC04E04FE789E222B1E2642D26EDC14FB36ECC6092B3060E45EED6C5B35DE8741F72933930ECBD7338CF39474122357365700CB50C5EB176FB92814FA7F4032570CCEE6B859236AD5DA5F1730129EDC7BE218BA9874620F6F0EBC45E0BD622F8FD1AE6974994AF95C6519EC1C46650C073D194FA6EBC62F405F63A3416782A47872C7D77D648D0A1C802FFDFDE5FDC112C94CFC68F401889EFC522FE488FDB5384C0D93147AB6587659D936F98ECFBCDCFBF8B352D605F18C855E2559743ED97991C5D50DF44A7B929303835654A3955ABC5BEE6327400A7CCCE460B318D8B5ECE5B12F606ADB3D7B5ED59563B8E675E78029AABC234442C2463256FE02B04F556DA35C4615D14A9F4EFF17DB0DB81DE4BDD894F6628A120BE2D4CF3E1F46D53817899657035A76137E23C0B0E8DDD29465D7F15628FD435E6CAACA4194FDBF85FDCC31D5DAFCB52568B7C0CFBE713BC85FA424BA3ABE149E4035FC86807A8B876D2163B447CAD5EC0E6EF38A1D591AFB46267F9DBF142CAB1CAC1F73BEBA212992FC6D4647EC17848D1ADBB1901277A5078DD72D9C9184E893C0806E9B4AFF0A824670D438620F2A7E8D2965B619D291E5824C014FC888A36FBBE17356431F0039038F9B497902AED969F9C488390B7087763638E976801127BAF1F53803C4DC9649F0EE85D67B239E2BDAFB2BD75F1D1DA22A56FB3AF10A9DDE7AD306C4AF8681029316C0E1949228E6BF5ADF942F1C0EF92B2BCBC0C70D49E5808851444240A78B14D21B54F66271482F49B85F5180B268050327368496CFA8B54ECB97EE6D28EB74A3742F68583DA046809002C22F7B31FBC0566969F9A15CDCA892C4BEB101A2AC3526C76E9D30982C9B4893450FDEC4001D2431828D24D8B1A67DF80E2E10ED2EA8D723227055C48006665F7DA8E032EFDC70BC7EEB2B369B551FAC542AD6DF1A23107E2B3C0E3CCACC25F26404C085CBF56E52D35D7948DB9FDA6DFC24709994719D8CED41A2CC9B3C4B2BEF0967CB71861CF0E6AEA9BEC9395726AA0E2F1A7247ED0F6038E3DF4BF566786073590DCF97F8F0A99658D8F630A2D130C46CF4D26C669360D0F70B75F904C9F923AB285D5DB129F6C25AD21F9E26AC844D07A8EED86C4E224EBFC5B3F720D6F94B0A01B1433C46B40CF84E80F7A6AFA7BB8F9ACF818AD3CAB2DDD6904C067BEA4F1FE79B83CB0AA8FC75B6B096BAD6FE94ABFD48F8EFC0F2B9A02EBDA8FDBDBE1C77F1854EDBA18AAE7F31CED9CD34C1B355108DF18A8953932F7554AF05B203A96A9BB93E0EFF51D7F93B56E351562CF85A2D35EAE2C2427B89A8662A1C723D4F14E6EAFDBD636C2BB7ADE29C1A6BC8A463734C808BEC68B1E9A31AF6E29B412F1CB8C90A9911AC5C3EA71E46113D2D7B1AE2D8802B06A770FD0E9E4652895E42181AD09BB541E9493F258711BB7BEDD3E7CA8B8CE875669CF80A6880ECA3F13800DE7011EA67F443E505C4FB455608AE586F922B3C83FD33B306BDEDB86223C33E3AA65EDC93CBCF3A03ADAF9F328997951D59A9200C0BA2618E3596AF176B43122CEDC52B1E006EA6D12DC236A6FCD7CC46825F2EF7ED71683A731D746FFF2FE54E0B392A8CBFA38873196BB2B835DCA7CB7C3ED9A004C7A329B9734A111744BDACDB669E69E9DF1E52F07C513E3752A0CCD81D7DDC4A64868B7BB2BBBD2095373480522BE10615248A179DCB61DAC90F7FA5FA9B84F190A9C62B5FF9CD473A940F03E7107157D7EB60AF1E3E384FFE8A67DCB2389B3B0FAB7C789CF100CA95CD6A85442CB9A2C243FB9D454B20BAE5762D72B8FE79B4DF81163D61DE4578CF976992D8B9989FC68089F811F53DB1E1092B60220552876B818BEA981571898CD6AB7B5F13C46B0A076526E3241D65014F855EFD7BDE08AD91F259DCB64E94EC3DAD97811EB024EE1D341521DC92AE5E93C73422088976F2D27D64E1D193B955E6736AD2BCCF3C1A53D590576434ACBC0B687F27F255FEF354E68ACA47160EFA7126F908E08E4548C11546D9C412D685FA84D2EB4DCB2BDFC48E2FA8023548198EBB072A48044F4391143E3BEF4FF9066A4B0D03ADC826819D67588BA84F99DA27424103652ACC039DDD3B567851CD78E4117A8B93AFE01FC8EEBDAA1ACB8BA9D095789E76B9D5AB9EE177A15D666EF171FE1D4BDCCFE2E58CE669B561F63028C6CE26DB5C8182FE048680B175C7AB407215FF3A7801C950D509867AB1B0BEF89B3E38A387915225EDE76F91AAD15A85D8C46EFD588BB3BAACBC52C036211512473420F3F061F5F53E9353DE0780425745A76439B3811511C86CA503251F24113384E1A24A9367536E796CE08B896F572489A2339E82A856C -pk = D6CC4AE84109C01AC07E756CB0CE40F7A26A9788F0350B2B2AC1F1B8F7CE1F05EACCD892C8CDF5CB57C64CBD6816AF03BD084EF6B470746172E119244B7AEB08CA9077E182C66777478ED464B2194C769A5EC19D8C53C216BA540AFFFC4DEB02 -sk = D6CC4AE84109C01AC07E756CB0CE40F7A26A9788F0350B2B2AC1F1B8F7CE1F05EACCD892C8CDF5CB57C64CBD6816AF03BD084EF6B470746172E119244B7AEB08CA9077E182C66777478ED464B2194C769A5EC19D8C53C216BA540AFFFC4DEB020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B053C735464ECE9BD2D81C84493F100FDC28D0E80E4E432587D618076E141B8B4D52620AB5203B27E0F9ABE2FBEA952624EEB0092152CDB486D30447BC42D017F0780F00000000000000B52F964C9C3C64E758CB6E7D128A05E47153B5148E344E62124E6E8CF7CA70F20F6791D8418ECB2C6CC4DECD6A5FB034F8D7F3CD3ED9F6D3142CEF49B388189855C3C3FFFFFFFFFFFFFF6BBDFE03BB5488281BB4AA5473719302EB2EF5FD3A09C855225FCBF103ED3F8E5C60A3CB7C70BB89545A2400000000000000000000000000000000000000000000000000000000000000480DC502D058531BF7F4CEBB9AD6DD4C4E7D47609B404F9C658E56F0A42548552C7C746C54839918E121EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E15DD28031CDBBC50DC7CE92C33D4F7F27AB8900E9F813488DF79DBD0B130800FF839F087A717265E9A60412CECB0029FD638CD381F0B62C47C627CA3320620868907061C37ED54232455030C250B622C61E9E387E9DB5B9E561D7CB6E28203D12ECDC5ADDD37909A50DFEE31423DEC726BFA03D49AE6618F202DC3E0598CC09FBF34AA21B6F517D0FF81144E077502AD752BBD433070DFC66A275737100DD5DE0CE5F63DB6CBF684FCFEA592524FE785017F5F5C5546E539EBB6E998602303E3CB28FD8B61A55383C4E3A43BBB5E9575AEBFB6EA14DDDABFAC61D332F221F7195FB608418F98EAB4CC216576533E02182194E4DBF21EF5D4A3F8E23D387DEFCE0CF6F65D0749641030B0E52070286DE91D92F3BD5233ABABAC217F780077039ABC0204E2EE881D3C55055343B45764C6E1790A989184DE4041E279F9D65DBEDDAB3353374C771D4180C8F8123AC00354E84D0DBBC5E23762EF6ADB50121A405A89B463FDBA203F014DB997621D93AD1A599B160AD92624A5B8EE799AA772003A2EB3D53A65C27CCB6DF875C0A66B19E63C923BA74A255D0ED24A19254482DFBC29117119926F4AAC8098766F5A7A010B262094E89288C3F06C72199A6497D0CEBE834D1985C1120C19FED9B5A8DBD2425B0F93D28FBC2C8E65F2213F3064029AA76990C6BE6AE2C77270F62C8DDFBA46254F293598B98349D3028167314BDDD69FBFD71D187C21058A5D74AFA1E9017845D004A711E763E7436E4E5C6EC1171F118C990F9524DB10DFC84DBBEB72D3842802C7340773CF8335A84DCC1BB903B97E09C53578FFCD88AFC7990C7EE3620C36707CCCA75E94BB79BA399F92E7844547D81818389F33AD0590AEE347A30271BFE09A44E1B9898A1ECF2245E8FF2D95B2842AC5BB688B1C07CD0F0497E98A4F660954453B69324DCDBA3FD04E9301 -smlen = 3563 -sm = E1607DBA0704212475339C4E01BDC42070F2213C5EEBBAC17900B546BC45E3098F859F76F80300B3760953D3CFE4F26E6C2BF0015F09DDE083021A63959319DD00593783F2F0EE9A5085FDB50301511FF9870C20ED143DE2E0000171F31C8E2E0D9F2ECA0057AE01A18C45114260DC30EF195A6B01920D75F80CC0281F63A040C101229985D905F7AD03AE3030E20015E7D5F3745F22B8C0A522BB00FA1B868F1C7F9CEB6A5B20CE01D5CFDCE7D8F5E1378B9D3BE401B8BDE4EA6EEFDC8D1A64F46700CD0DD2E44FD6897FF57C0ED2000177072C543790E11E66DCA9E0678E3F47702C6EB67B8C0A2B3C18029AB77EFB8B24B171D4346DD101D1B9E539DCE8C79E34861761B006D21A6BB3A2356805E678673C45FB055FC5266E3F692AF9935AEA307F14A5C41B979966A5DFE42EBFED1487E4822B74AB5AF28995E085EC8007ECA4977C63EE5299FEC63DCCBC42EEACAB488E574249E9D856146750AD97C8A443485EC1C5820BEB0964640010F6407140791E74684DBB91052E2D8BEF7BDCD78B2EC03C97A53295D683BDBE32A70DC19A2F75B8613AEA9616AE0E280179492820F73FB7FA4121E673FB5C328F41B67FF8FFA7AEE6564ADABA046D6E1D6AA13FB24965390F829246DFA8763851405075F76CF94C66FFC3308214DF0960C649AAEDC22926CE9357D3875F8B71D68D75999AA3663C30A9EDF07228BF7DFF49EC1E6C7A33D2053597003B82392E826EBD701B4C981AAAC9951C79E08F592C2C0637C8E5A7F9DCDA599E859C317D4888B4098992E0E2D979E41C703686D577E5BA6001EC4F587140711293D664963632F87EA0461E0E0C5E9D8D292FB409F9F9AB172EE17FC8AFABAD06E42B437CE22924EB5DBD3A80A06962F3B37946259F9C75A233CB2B4ABDC5CD1B648FAEB1BE8630DB40D151B8FBA693DF2C5BDCAA14DC4783F450B6BC407515CEEBC5C9A47BD1A141384F0B596CAB1135C075651CBA989C190F3171DC1D72330EDAA01656813C4B7811715060B023FC426745C301B2A91E0D08ED3BDED438C4CE6799C35F3981C882A0BDE4A2FEEB1A52CAFA47B0C48558FC43F98FE08F03A71128362BB6FB9DA6A22249F4D4352AE7D3DAE85DE497E2411EADCFE5BF1A3C075C45811E0097ECEA255FE15BD8321FE8B546A8CACFB899EECF5419DB363C7567C2FE7360B36DE14674F500A31D3EEC71451A7C0D5576A8939C0F6D4D9F2F03F3C516CE25CE73ABB35C73AA94F6AEFAE6AD87052D6B195FA43586817F5BB974AAE7F1B8608922411AA5B0D7D574016CBD3DED13395623470A108FA0E1D3F9FAA7E1E5031843F2A23DBCE8B196315290DEA5795E4115D53DC570A444064CFA3C9457DBF3EE323B1966ECD2270C32910F8F430522471258A1F1955A6E1DD8C84ED9A566499BF85628615351ABE84B401421DA2CFAF575E2644C9304C075ECFC374066CEC713FA4C0D89043689FBC59FF54B8F97EE0A3B0989BC5E4EF83CC9833E75BC8B67BB5EE3C06EA156611CDA95A6702416807530EA206ED89835D20805EA988B1958569CDF7F809996214DADAB4E20BD44917E3410EC6BEAC98FEA07F764E85B66AED5E17CF675D2ED8E63DB728FE75158CB31779E31379648B43D68CCFF3780854CF03535C57122019456E73CF06769BF1FBF558542241CE665BD10F921828553585E0CF664CDC6160F9C47FA5330591B74194F4716056CA83993EFEC4A52DB9A1FBD3B2F504AC19667325167407375B6D7DE739F07947B511C8D475744E5C29D6E286A37F1FF8317BD0178F0E306A38FA6E75F4A80427FEB2C91235D3E7F20D8101CFC03BB73F44EF59AF3526E9AFC580027A1DADE37654238B8EC7AF0105248FE30784A88B72E11FC1BD807E47A349BD29075BEFBB29730EF8E85E3ABD5105559BACEE74AA27D90D360A8D629DBEC95EB34C7F7CA20096FF7B521E40D3944A975436896F372EEAB6B8615EB91697965BBF955779DD3047F7E3BF029E3509A5780247445D6223D085AFB4291D976EFADC41E42DC2C0728D18F6155654A332FEC72EB6AEF8B92C1D177E3DC28C31971BCAFF76DDEBFD9588BC244B116D409E58DC5ADA1648663D603C47FAEB814AAA7EB9B6264356F926C18B9357BF426B89DDC8EB9177ECEB5C6CDC64DD8FEB7B326BC1BA89BD9035235DA0E644EF959C58DD97B88D5C749B36931AC2694C67151DB0894652E99254222D37CEFE9E27B3DD663A152DBE29A3639AFE42F4578937076180563AAD6AD739255EA012A17D2A56627D84C44FBAB261D392A966CFE19278799CF1634D42384323C496190D4B9FB662694E3887EA66AB9E8B195488C8DCA47C8BC0424247759137CFBF86DEDC3641904CB6FACBB30A9FA84ACF69A67B4AFDF4C2AA420FC0D90CEFA0DFBBCD3072D9F772FD6058E2BF0E251BE93B00DC43765B53DB51B22F12D3ED0CC5655E4AEBD9D923F99A43E4461DCF5992030E66A1CDC3A65558D9BB3A39788D92328387D144850DD3706FD7A079E3D2398F542F91A8AAABF0C5068DBAF1FCC5160398ABECF74884BEB04F3A3EA38BBB80D798F5981B3F2DB6C7B33F867B7DC06A4417E30F94CDB4F523AEEA0BE12BD75AAED57520DB0D4B4F013BE3A1DC7AE5C58FD1DE9637F7D82F697B7E92DA427A78FEEC6A5C0255EB57A43DEA6CEBC8805BC04E04FE789E222B1E2642D26EDC14FB36ECC6092B3060E45EED6C5B35DE8741F72933930ECBD7338CF39474122357365700CB50C5EB176FB92814FA7F4032570CCEE6B859236AD5DA5F1730129EDC7BE218BA9874620F6F0EBC45E0BD622F8FD1AE6974994AF95C6519EC1C46650C073D194FA6EBC62F405F63A3416782A47872C7D77D648D0A1C802FFDFDE5FDC112C94CFC68F401889EFC522FE488FDB5384C0D93147AB6587659D936F98ECFBCDCFBF8B352D605F18C855E2559743ED97991C5D50DF44A7B929303835654A3955ABC5BEE6327400A7CCCE460B318D8B5ECE5B12F606ADB3D7B5ED59563B8E675E78029AABC234442C2463256FE02B04F556DA35C4615D14A9F4EFF17DB0DB81DE4BDD894F6628A120BE2D4CF3E1F46D53817899657035A76137E23C0B0E8DDD29465D7F15628FD435E6CAACA4194FDBF85FDCC31D5DAFCB52568B7C0CFBE713BC85FA424BA3ABE149E4035FC86807A8B876D2163B447CAD5EC0E6EF38A1D591AFB46267F9DBF142CAB1CAC1F73BEBA212992FC6D4647EC17848D1ADBB1901277A5078DD72D9C9184E893C0806E9B4AFF0A824670D438620F2A7E8D2965B619D291E5824C014FC888A36FBBE17356431F0039038F9B497902AED969F9C488390B7087763638E976801127BAF1F53803C4DC9649F0EE85D67B239E2BDAFB2BD75F1D1DA22A56FB3AF10A9DDE7AD306C4AF8681029316C0E1949228E6BF5ADF942F1C0EF92B2BCBC0C70D49E5808851444240A78B14D21B54F66271482F49B85F5180B268050327368496CFA8B54ECB97EE6D28EB74A3742F68583DA046809002C22F7B31FBC0566969F9A15CDCA892C4BEB101A2AC3526C76E9D30982C9B4893450FDEC4001D2431828D24D8B1A67DF80E2E10ED2EA8D723227055C48006665F7DA8E032EFDC70BC7EEB2B369B551FAC542AD6DF1A23107E2B3C0E3CCACC25F26404C085CBF56E52D35D7948DB9FDA6DFC24709994719D8CED41A2CC9B3C4B2BEF0967CB71861CF0E6AEA9BEC9395726AA0E2F1A7247ED0F6038E3DF4BF566786073590DCF97F8F0A99658D8F630A2D130C46CF4D26C669360D0F70B75F904C9F923AB285D5DB129F6C25AD21F9E26AC844D07A8EED86C4E224EBFC5B3F720D6F94B0A01B1433C46B40CF84E80F7A6AFA7BB8F9ACF818AD3CAB2DDD6904C067BEA4F1FE79B83CB0AA8FC75B6B096BAD6FE94ABFD48F8EFC0F2B9A02EBDA8FDBDBE1C77F1854EDBA18AAE7F31CED9CD34C1B355108DF18A8953932F7554AF05B203A96A9BB93E0EFF51D7F93B56E351562CF85A2D35EAE2C2427B89A8662A1C723D4F14E6EAFDBD636C2BB7ADE29C1A6BC8A463734C808BEC68B1E9A31AF6E29B412F1CB8C90A9911AC5C3EA71E46113D2D7B1AE2D8802B06A770FD0E9E4652895E42181AD09BB541E9493F258711BB7BEDD3E7CA8B8CE875669CF80A6880ECA3F13800DE7011EA67F443E505C4FB455608AE586F922B3C83FD33B306BDEDB86223C33E3AA65EDC93CBCF3A03ADAF9F328997951D59A9200C0BA2618E3596AF176B43122CEDC52B1E006EA6D12DC236A6FCD7CC46825F2EF7ED71683A731D746FFF2FE54E0B392A8CBFA38873196BB2B835DCA7CB7C3ED9A004C7A329B9734A111744BDACDB669E69E9DF1E52F07C513E3752A0CCD81D7DDC4A64868B7BB2BBBD2095373480522BE10615248A179DCB61DAC90F7FA5FA9B84F190A9C62B5FF9CD473A940F03E7107157D7EB60AF1E3E384FFE8A67DCB2389B3B0FAB7C789CF100CA95CD6A85442CB9A2C243FB9D454B20BAE5762D72B8FE79B4DF81163D61DE4578CF976992D8B9989FC68089F811F53DB1E1092B60220552876B818BEA981571898CD6AB7B5F13C46B0A076526E3241D65014F855EFD7BDE08AD91F259DCB64E94EC3DAD97811EB024EE1D341521DC92AE5E93C73422088976F2D27D64E1D193B955E6736AD2BCCF3C1A53D590576434ACBC0B687F27F255FEF354E68ACA47160EFA7126F908E08E4548C11546D9C412D685FA84D2EB4DCB2BDFC48E2FA8023548198EBB072A48044F4391143E3BEF4FF9066A4B0D03ADC826819D67588BA84F99DA27424103652ACC039DDD3B567851CD78E4117A8B93AFE01FC8EEBDAA1ACB8BA9D095789E76B9D5AB9EE177A15D666EF171FE1D4BDCCFE2E58CE669B561F63028C6CE26DB5C8182FE048680B175C7AB407215FF3A7801C950D509867AB1B0BEF89B3E38A387915225EDE76F91AAD15A85D8C46EFD588BB3BAACBC52C036211512473420F3F061F5F53E9353DE0780425745A76439B3811511C86CA503251F24113384E1A24A9367536E796CE08B896F572489A2339E82A856C - diff --git a/KAT/PQCsignKAT_1509_lvl5.rsp b/KAT/PQCsignKAT_1509_lvl5.rsp deleted file mode 100644 index 1285f7f..0000000 --- a/KAT/PQCsignKAT_1509_lvl5.rsp +++ /dev/null @@ -1,902 +0,0 @@ -# lvl5 - -count = 0 -seed = 061550234D158C5EC95595FE04EF7A25767F2E24CC2BC479D09D86DC9ABCFDE7056A8C266F9EF97ED08541DBD2E1FFA1 -mlen = 33 -msg = D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8 -pk = 6A9302B51F65AC67C574A05E9598604D95AA6E3C61B93CBA98EEFE808905652D43933DC0ECEF7BE267373EB1AC61D4A91138D235F7BA19DD12E55F48D6FE1E000AACB90AB4FFC3D90D793F2A1291DC638F8028E31F7DA9FE497671DB2DBAC789486A61C94BCBE9A8DDD78670955CFC3A104D21411889125A9668591B16D40400 -sk = 6A9302B51F65AC67C574A05E9598604D95AA6E3C61B93CBA98EEFE808905652D43933DC0ECEF7BE267373EB1AC61D4A91138D235F7BA19DD12E55F48D6FE1E000AACB90AB4FFC3D90D793F2A1291DC638F8028E31F7DA9FE497671DB2DBAC789486A61C94BCBE9A8DDD78670955CFC3A104D21411889125A9668591B16D40400020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001CCB52B5612556F92A5E3D5DBF4DF33EA4B3785A6AA6F7DAF79F5C5FC863275D2FBCFE4A88323B0F24F8480C938FA7DD403FDA74F7864F3A3EE6F787051278B5FD7E2EF1A9C4D64C8B5F8A9A99096A1EF168326CE8E11221440500000000000000C339A9C83EB96D9CC2D77AE833B301267C3E8E592C1965923584F95004952E69D634305E4F50CE7FBD89E49318986B0F1FA1DBBAE17C59222987008A1F679427DA645BFCE9006C6815E19038E6103B8113C2587DD421153291E8FFFFFFFFFFFFFFDBE8B47EF04B4E0C6064914B858DAC4756AA2C89D628FD56AA84DDBBDD33B7A8485EAA436B201AFC1B9F8AEBDE42D3D89620B03DC4308191ED41000000000000000000000000000000000000000000000000000000000000000000000000000000989FA7FACEC98AC6FB9E4E6A3B49C44EB82929615CBA18D3EF3351E0DA720ECB376EE14A5E8688B5765E241DD1C08AC7608DCA19FBB26B589C42020000000000000000000000000000000000000000000000000000000000000000000000000000A78B0BD3AE6DBE9479687E496A2F8152791DFD834EE259EA6AE946FE372AD282A4CACF7B2213BC3D861D578E89E415FDF072420229472945F2036D0723E42300667E8AA1D76A14205AAA1D6218CC6CD6775092FB1366804284C115571EAD088EABC53FA7A805901F979D717F0DD8F3145BCBD1712DF5039EB4ED56CDBD53040045FC83049C31B1346A7FA54B2D8200E095AA80892FB9A397A6E21BCD3C6621331B7E560BA46F25B0B355697FF19902F1B6A19C3CC30E583A2115FB5B1CBC05009AB6215926F090695A9D14B0CC49538249CEF98A79471BA41DA045CAD27C88C8FD132516375FAFAD9113761175F50FA25E1A1C473CD33AC843268C515E25200011701B050A201A78629D4343BE8574326758072CBADA1714A21794502AE7846AF73F1C6BD7618189F68EBE5C602E4467DD19A77513019938103A9630BC0A17001EBA7417CC5E4FAC4A5DBD52AC5A2263BB5FF55FE2DA2F4E6DC4B3E924469F334563B24C5FF0C5207A57A6F26988469B09D4BD7583A3B13695B79ACC75DE0900C616AAC1532A88D961A17029E8D51EB66A6431411BA3836FF7752775F4CEB141AA990EDDA2CC8430165D27216A406248AA946A17DF8506DE49C4F61556D221007952C24E3FAC50CD5904366B4B6BA57E17C5F1CA5E313750CE091DF16BEE1C3CA5998BE1BD26E2687938312BCCD301FBA2716EB931715365199AA0E073B0040085F5A351DE09C6E474F31A90BB35E82AD3CB802C8630D874E0709DD663229CC66ECA497E332B56ABAA96B1D70264FFF1EC0AF6691E600BB61F756E78E0760D000E0E3604047C33898FC392EF550330F64C40085796EB6E8C942FDFBEC1EB867E4BCB3D65F792C4E50223BB3F55CE819AEDA97DC483B014A22EE5C76DA4B8130084AB87D6FFC59AA07A388EA4D0F8619DD1218AF2C3DDA9BF2F0C7047318B648EF0801C425D476CF3B57FE7D65D945DA1B44FC1E314C9FF1C429D643E2F23100057F112B3F5EC140F7D2E15086E81D08A1BD9956CCEEC69A4365DAF0A63A68077B4ECD911C0056510B4B2BC92459E77CF7DDD6322C0A91282AF309A1BE0E70E00A8D42294173634D069841408EE4C5C3B35BEE512BC56CF7C418CFF8617C84639B03D57D029C3E8D617CF198246E0F513DC5E667D9BCC90F20F9FB72141CC0C0090F24BD2A900D25D9013A370191FA88D18A13A90D1344688D3ABE45DE6A6C0647F92DE0EF04346000264A5463454F659CC41D8427823363726959A96D5911500 -smlen = 368 -sm = D33BF0F083FF80C0021EBB85F0AA034D1A5F00FDE6B7502C9B500015AD7D752B3E47D24A4501D4AC850BB43CA4A985766D48569DD2681C510009F573E2D46A8589E6069509799D16C2A4F101EE260B7BE55D111F7EA70875A91D05C48B130075E46177991D746C20C2FB27F899A9D4045A0164C7682B465F4A7B53ADF1F1F4BC919EF03E006254CCF41B5F6D678E17652CD63EA6C183F301BC58FC44C24A70799F3AFFF2F62970BA7E6F01D05A2A8583685B7CD7556E46C38993361EA20191787E26078105C0BD3B5409FFDA684240140197228958A0750009D5482159A45358594FFF01E92C17D5F647B3E270A3CD06CB0ECD2B53180086AEFA2B4541DADF7650D11745554B5EA22800011B9EFDCEAB9143F9F6279E01FF5417A47666857B9859D7316404C024BF268A880803415B4797E969088ED5B3465309BDA6DCBC5F007ED0A32BA43AFAB051472F3FF07903D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8 - -count = 1 -seed = 64335BF29E5DE62842C941766BA129B0643B5E7121CA26CFC190EC7DC3543830557FDD5C03CF123A456D48EFEA43C868 -mlen = 66 -msg = 225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1AB2568209E46DBA961869C6F83983B17DCD49 -pk = E10EC5470B88AB5C5D7778F980915BD43B877F30E021D8B2EB1EF82AC6E21A3270754D38680390AC7E1B2DE032C6697A4D704A1D5190BBBBA1DDCB0D82B822001CFED0BA7E97F163E52E95F49EC5BEDCAC5EC50CB27246753C86CA7B2C04D5A1A6E02ED57E61D48F7AF6937E2A131571D966217854EDCDC078C5E80ACCC00E00 -sk = E10EC5470B88AB5C5D7778F980915BD43B877F30E021D8B2EB1EF82AC6E21A3270754D38680390AC7E1B2DE032C6697A4D704A1D5190BBBBA1DDCB0D82B822001CFED0BA7E97F163E52E95F49EC5BEDCAC5EC50CB27246753C86CA7B2C04D5A1A6E02ED57E61D48F7AF6937E2A131571D966217854EDCDC078C5E80ACCC00E0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D0B13ECE8A8C4497F6062FDA312A8B6AD75F8F6506410F7F5E57E35895EE3387869F8F61A87B0E35A78420E56ECA1AA0F26A2FB251BC9638F39BE9320084D436EECA312C54A4ACFED7E96945A7507AFE2A5071DB48D0F277560B00000000000000357FDD497442CC58B3ED20B039CD160D257C8AC66B5B2171E8CF622C05E6A8D76C8B23C4909C3695CC9655C89002677F93B3F5DA8969D0099F9AFB2A78BCF9087B1A1B53138272A0A1B25E4F4EE2F591986705E6F862688300F4FFFFFFFFFFFFFFD38B40300380072289761FD52303C8079C9F45BC2F269704E1460AEE330669908DCF8121B3CD7586BF498EB51FE08CD63592411724E1634BE532FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCEE6165F0786718C084BFF2E8206A92634E6699BDBB48531736986268A42B006C55C7893F5AAFCA9E00055C4A9D5DC28BD1900FCE3B5F15ABFB0200000000000000000000000000000000000000000000000000000000000000000000000000006723BFBB9165B5A59578CD0692BCA9DAE7686D9AA8D6C21056FABAAF8B8CE008B6BE017DFDE21D1327ED7E54D0C9085634E0467F29268FC1203D5E8BFDA11E007D4702B7A95995E263DB86D87A1E9A4AEF73AB80AB5FCF17CB584CEFAFEEE1B03DBD6F850116142AE5520EE868E5DA10D445B92658AFBB4761801489A45D1E00CD6C8C16998696B6D634D1F60925F1B50CF4AC8E02B853900E24EA718181CB6416B6F2D6EA7A5EBD103F9FF126EF6725E328591A9A299286B9960CE36A8D0500215D5981732A57572C899F66AE7CC4BA062720D2029C85DB7F0E769BD92FA4FE1AE5C961E0E2BDF8FD7B9EE8E0F158EC76E54E208CB4C1CE571B7AC1505F15001F72908241E810256712CE2278613498B960E8FF2B06B729B7BCD5B26374CD1C87C725573F03EDC122F83ACBA5B8D6E90C495AA0B596EBF26CA747E24EAA1B00F0715697C5169C8AB76F006FF63FF4A001E608D92181CF053B5E4435BF63B4A4698D372732C249DC55A588621D07BB8C5D66D68667667070CBE11B07F3540A00176EAAA1A93D061AE2783784D41C1F948479F3CB727BDF228E5601F6DAADE8671DC99132DCE50453978E9D569D3F6ECA04A0DF9C71D4DD5022B8FA368DB21F007A583BEC30A64F33384208073B0E55E083370A1E0D3FE77B71CAB77877122E1FF7F5D2BD3DA3D5C2D162F3B144E889A9CA4C17681FABB98F061EB8028F7618007E985821935B820292A87B5780D39D553CC0B68BF7A9AFF97C0BFE05B10078E8A606B29EBD04570A49D6EB81A89E86C672D6A1C0AEF6F124E8D5F49AFB900600BFF667E56CE075EE49D2F305E9C20370A492BDCDD1C81043056E844BB465909EEC5EC401685B59A8042702E5258A9889701CE40C8088BC0CBE38921302B917008F496EA62B3814CB5C244E0ED800A4D09BC8B46027F6D84952C6C40DDEFF1059ECAF96F8F8EBE61CDB47FD5B7C231207C25A9F8EAD423650B518C7EB99EB160039686AF93E926F01873F2A9C76B812C19F16DBE0D2D8672B3965FDFCBFCC0F72F36F018BA570E6C070F64492B2A377386A408C16CC0E22BBCF1D524F902319006D6D8D976B3B275FD796BACAF8547EA9BC717D4B50BD266DBD3B5E511200D53A18F0A72922215E89AC4A4583961518F7E6B357823E2717F71101018795711000B714FC84A2247549390F907755679F9ED0287F8DF212140360775D1CC6138118D7BE1A13F5885627B511122A16B0F4EBE9DFD31374431DA6C14514631CE70B00 -smlen = 401 -sm = C951CA56DF48D7FECFC91E3288A06B3103D30186F90A03E742BD614050E2F5F0640E7449E0002EB79A404488B6FB7CCF54682E9039D1280901F3C18E916BC9A0C68331F9B0D05293E2A8EA00A50CBFAE4F7197F76BDB34464837B3F5630300A49CC35A7E9C95EFC915A484833350EEB25F01945CA6844DD042228E9A44B75FCFBD90F3FA0070F68875E3C866F92AD172DE9794EFB3B13C01A6C079C99D218C22E432947FAA57140631E101CAC72B9A3703BDFD06CAC77BFFD19D6AA46A01561B7AC0212689CB5656A9D7FDE69449DF0300B7FE9F9DD39480417511AE98318193C39D6D01407FC84C917EF55731D1517931666C43ACA100E86895C8F89AD09763C590530A6A5D8927850001B1F1BD9840EAA0D31BE940CF85F4C9F9C90127E2968EE21E877535997C4856310102342BF64838E5508C08A903BA7C71BEFC80900148B5E9FAECD8AC356596B0A735CE03225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1AB2568209E46DBA961869C6F83983B17DCD49 - -count = 2 -seed = BFF58FDA9DB4C2D8BD02E4647868D4A2FA12500A65CA4C9F918B505707FA775951018D9149C97D443EA16B07DD68435B -mlen = 99 -msg = 2B8C4B0F29363EAEE469A7E33524538AA066AE98980EAA19D1F10593203DA2143B9E9E1973F7FF0E6C6AAA3C0B900E50D003412EFE96DEECE3046D8C46BC7709228789775ABDF56AED6416C90033780CB7A4984815DA1B14660DCF34AA34BF82CEBBCF -pk = CFD509E83CF73F4EC30A272B62CF642740ED6241CEB6DA97179045905E82620BBBA9850BE884E6E4EF0840FDEA53A4FB11EA501D7CFD7F477A9847D613C81500BE80776C13A26B00FBC5ADDE619D938E8DA2CCF4B1D38B36BEF23373CFAC89E78CFCC7511CC61909A5AEC6B9C06B8B81130B3BE136802B0F11B1501A687D0200 -sk = CFD509E83CF73F4EC30A272B62CF642740ED6241CEB6DA97179045905E82620BBBA9850BE884E6E4EF0840FDEA53A4FB11EA501D7CFD7F477A9847D613C81500BE80776C13A26B00FBC5ADDE619D938E8DA2CCF4B1D38B36BEF23373CFAC89E78CFCC7511CC61909A5AEC6B9C06B8B81130B3BE136802B0F11B1501A687D020002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E313CFEE409891172FFD103080D6746B05E4F71C29AB74C373F42DF70E342853D46B76517C44A1A1EBF908880A017C7D81E694CC9A98EA096F9BCB9811904006591965A534808EAEF8B7A3EA8C34F13395BB969FD0AF7FE5C00300000000000000AAC2D2B9A5043941D21EE4681C6ABBA7DD644E9368B00CB8EA48D697B43B6C8BF1E0506A00A41898A055F64F0CAD07A4F4A84A5E275D4E9C9E510ACF1DF08FB73B3359862FA44D63F6F00D33C2112709C4D899154B05EA581BF8FFFFFFFFFFFFFF26A586B68A8080F7AF9CE03CBD53DFF34A830A7BDEF5FA539963320D82AA8B0FCCE9155A26BDEDEE816E7C353A18626007057ABE9B092BFF2A6AFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3DEAC330E69556CFA645615C40246B4CF463B08FA3BC5970B7F277CCA39AE2C92B66A4A2D3BDC7B3F2EE3FDB02C6E77B8B1A8F1BF9436D998DA4030000000000000000000000000000000000000000000000000000000000000000000000000000B3B550AFB5EBF33529402A39ADA5DB9308A23B695DFF514AD9FB70219389AFEA7A67A1C5B34D3584BDCB698118B18121DE1B61B43C921B62A084DE3AC78C0700FB256F38BECB4EFE4F9CBA22608B3AA877867281B2CF8FB5E75599ABF935811C2AECFC641969CDFAA1D37560F0D798081451AEA5CD58103D5B170E21C63A22006B612DABDDF202C0D539CA8F7DEEB2B7044448DEB8B9878D841710B495ED74B1CD1F2DE2AA028568F58F3F39C55DA096CB2A7B2B0DA3C0E87FB354E8C7C21B002B43131845112C340EE6BE83EFBB210DBBD9989AA2D34C4CFC6636BB462F28BF6DC4FBE5B25099F8E7CBDE569BBE8263E9BB592DACE0C2DDCFD1D54F4DA1040088CD142DA51C2D643898B315961889B8F44365363210C7663964F5FA0E706A3151A0EE8318BC54796CA3C4940F6DC58E04D47A9F20E71F8A9F18687362070D00DF3A0E4973189C8D6DD5BAB37D177CD889E3C16A754EFB63A64176CE2877296C72E2E71756074BA2D1057A366596A0A571A2313B06B2370E56FD5F248BCE13002D585D9F34447AFE4DBF58FF58BAD96D3637ADBF1297A256ACF16DFD062B222E8D5D9A1A280BE8F20D0005EE46AAA0B6B818ECA355E6F17AFD714294EF60030090F7DCC25A7687F046552C1ABD83AE6D139BA76324AAE48F2811A8F840AD969AA6D227DC7C44DE2AF0897A7DDCB40957C53429826905211B26C76C2996F805006E78C32FD80BCF60B16EFC1B816E9DE589BD4CBAE1F737A899C642117F5498D722081F3C61C02CE4E43F846617CCE5A308F045F31854770BF73450C4DBE30D00FF4696738E49594E9B6E7C0D6BD618B8859C5DA8CF3693CFBA1358304E205B4D135215B8C03EB4C54E2E7EA05ED950B57D1F8E25905A367521C8E8CE5FD01500D08FF9C6BA64160E879774355813124A7734DE82252D88372B0DD37E34FA36EB3BE7E9B4ADF2A2E980623ECFD704697820C610A40B371A32024F75D756EF1F008B9B4F7C1B7CA90CD45CD6704FDED57B3EF6E75402F934049FCD1D04C4F83B1274D754FAD2C6E93BDB6BDBE1D69D5F032B5DE4A43C759BD8A586F06CE7A91900479E2BDD1E6CA51618558548F12F7DC769CFB1009C58A3B3E6C909667C9741F0963B9E93952241C162D78ECE523BFC9C8B6EFEBB30159FEF4CAEEE6C413D2500A741151EF93FFE94A3868D82A423F9E500B91AD5C56F8AAEF5B799621DB81A675BA4527BEFA59056D19A7052B6A710C14ACE36597C67F4D1B5F6691B324A0A00 -smlen = 434 -sm = 2286C8BCF776051E9EED2F25D612F4C03DB90156AB04704FAD27111E588718F1BE330D9018008316CC3A3EB5E205FF8EF4B58035E7E684C9003A0C54EC53D751553B2E39820541021F4DA801BF490E058C4FCFFED0A898AE0E7AD9302EBE00797924D453A6348CF9540813976DF5DFBBFB01509A33D9087A0B262A7C424A02493DD2024600735BF0E0D9CF5AC43507F8A65EFEBF922B5700E0ED5B33236999349C581814C8F6B734AD4D0187A0389F6D790F55CEE0EC6C1B2311696A3700937CDBD8D76318E13C7D5F8004563D61E3FD00E453EDB1DCF84DD95FFA5347077F73C9D3C90146A02304D8DF4B37F9CD03676C4CA819A791005E10D46D906DC4C190ABE08F319EB490FD6B0100C56F6BFD2D9BD2337E976C725FBEE07954CBE15D218FF6C653448B20F166BCCC0403CD0DA972CF8628139702917CABEC6AD49C910026E29B582B56DF8BA7D38FFB78CA002B8C4B0F29363EAEE469A7E33524538AA066AE98980EAA19D1F10593203DA2143B9E9E1973F7FF0E6C6AAA3C0B900E50D003412EFE96DEECE3046D8C46BC7709228789775ABDF56AED6416C90033780CB7A4984815DA1B14660DCF34AA34BF82CEBBCF - -count = 3 -seed = 58C094D217BC13EDFDBEA57EDBF3A536F8F69FED1D54648CE3D0CCB4847A5C9917C2E2BC4D5F620E937F0D329FCF8A16 -mlen = 132 -msg = 2F7AF5B52A046471EFCD720C9384919BE05A61CDE8E8B01251C5AB885E820FD36ED9FF6FDF45783EC81A86728CBB74B426ADFF96123C08FAC2BC6C58A9C0DD71761292262C65F20DF47751F0831770A6BB7B3760BB7F5EFFFB6E11AC35F353A6F24400B80B287834E92C9CF0D3C949D6DCA31B0B94E0E3312E8BD02174B170C2CA9355FE -pk = EABB48CEB9E94B18273D8286C54190CA47659A1ACFAD1C376A0576ED26A1DE406E610B4D43618C7FEC65B3ECEBA569678BC8F12842EC1F415902653E87BF0B00687EEE933B44C43DD4459736C7AA1A518CDAB95A01DB2EA7E3801C98C149F6382F7BE8A56FD75DDC132766C2507D0AF2648DA32859E29FBE66C4448ED2B61100 -sk = EABB48CEB9E94B18273D8286C54190CA47659A1ACFAD1C376A0576ED26A1DE406E610B4D43618C7FEC65B3ECEBA569678BC8F12842EC1F415902653E87BF0B00687EEE933B44C43DD4459736C7AA1A518CDAB95A01DB2EA7E3801C98C149F6382F7BE8A56FD75DDC132766C2507D0AF2648DA32859E29FBE66C4448ED2B6110002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B6E0248353018CACB913547611AC1835C8F5B2E1D45D9CA5A13DF2264E8BE137DC26881EF663A0DAE38145AF433DA15062DA07071D1D8CC838A071CF75EACF366E5C21BB5B75C98C12A85108836D83D1CD6250EB8C304FDE770D00000000000000D50BB58F25733F443BD7DB226C92452F8774BA3764059BDD42434B685D2466EB10DC108E8DA6D7535DDA7E4713659000DDD7B13BE777923DE453242A3E6BBB17BB686FE1E6E438A2C68AC262787503774C0731B67C9A438E3EFAFFFFFFFFFFFFFF4BA6EE96738F1608E594C94217E20FA80C87F1262ABFC069ACD7E6FC49CCFB14D8DB60EABF7FFF4D79B6FCC7630D3C0E6D01AD612A09DABCDEB0FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6F2F502DC6A7E1AB90E16C52AC157567DBA6913CEEF405A14AA9FB3A998408EADFF518729CB0848E24DF3E24280A4FACAAC490F693851C252B30200000000000000000000000000000000000000000000000000000000000000000000000000005894417EDFDC007C3E5A0900F111CA91D7A5F9E231C9AA7B9D70F448ED4B47DC8A426B3BF0F69B9B3A17E3FC38F168A299AFDE86D85B5840B6D7065438250B00B77FDFB9250A3B12EE52BAA55737B45FD808845A19E30ECAB0976AEF2646C491798010FD47489392E41D9ECFFD286F73BEDF04C520F68DEB07C40A0B9F611100A6C0C88A0580B90C63AEEAEE2A6AFAE7FE6B215F9ABC2BB4E222D0F871D513D32F32F9E37B9592635E93079F73DDB91CF57DD0F4775ABAF875786ACD29DA0A00E1A10852430B11433C67E85C594DC5DE139836564F038ED1F95898BE83E89FEED0DDA8F4071E4A829D12E7044841F9995072BB99E076A79887859B8FC6920800DEF2BB1FB180C195EF8E4A81FB1BB8AEDE77FB3BEE151183818C924E09E448C9841E9B6B2B249BE368570105A0CA77B491B53C26AEF7B8BDE5EDE06009FD00006AAB63DBC90773EE284A3CEF577D409F273FA52798235D1EAF2A8AD044273636E29ED70B32207E6DF09C678FE69229E73AD212EF44EF2449B150235994A30F007A0C11481EB59DA00EB57898A8730F9B82764170268BF570F76F94EB53E42330934B1D7394D4D9DB2F1EA501BCD9528E7804D7BEDD41144F0FCC7A08EBAA13000A390F156CDE8740BCA882F15934613FD1CA4CC2C58742F058E9715C94A9EA57EF1B0DCE81569878C366408AA305336934594E42110A409B84259E851FC2140053426587EC01726EC91F30AD2792936C83B1D557D5B1C41024081BF40A9A908A2CA06A4412D91D1D0205D9654095123047F306B6155CD1617C7B96B1777B040056D08F84140A0E2D944EF3DC295433C0C70A8DA7308BD928537BCC4AB8B13CDA8265033D428C72C1502D312D1435E981DF3AC0FAA3535D31B208FB9BB76D0600DBA1A51FF07288D234E8B457193A56B7D7C13ECFEA1D61F1D38204C2C6AE8D7524579E2C12888C35D74012F3BF0518C49664AAF63BF8AD540C7EE07A24B10B007FD12E132D655EBDF8B514030215E6512F2FB6FA1104D8681E49A1D10F8F68FEF6635294E7E3AE0DAD8E8C2DC934750B1FBC95DBF2EC52920CCA9F6A32181C0094373797B69139926FAFD6682A8929E99A1D32053D31BC3CD178B0D2275CC6048BAE153CFD6DD67CC257BC4518B9D92F44949DC40EB213A5FE70125A80CF1D008881BD211C5F51586BFC3F5107DF7A568A2ECBF081137A93D15534D9D440FBCD207BF34232C7F1A3E91CDFF2EE549BC9A9A1CEF9322C06B5E4D561CD0D2A0600 -smlen = 467 -sm = EF0FDA9F8B290DA20564A981FD67C778BAB400FDAD3C5409581BB3108AE8A20CB6AD3CE44400C47F735E43AB9A9A75BAEFB133261CCB864001FF8D05F4D49B7CF74470B80639E50A9A1AFC00C9035AFE88F5CC1F60149D3A3D50EC4EA808014B7C21B81B0B0AE1E41D1B8809BD5296328E0089B5A54F8AB3500AF8AA640DB01DDDBFA9BA014E56DC3FC7D2B1FEC28E74412AD2E9D71A6F004C6F596290D59E02C69473B042C5A097A04B000196D485D8214A17A4D94FF7398EBCD27F8D0146FD81BFFEADB6428FABDDBB7E15DA7BD82101BD4CFFE8AE55999C6B29A47EC4E3C4B0165800102479113FC9E97D3791C5ECB94C63E7F79501D84C45D5CC9C69D15C5E28FF6CD8FC48564800015FBC2896F54F0DC598166D605CE19D6C87B53BB910F0E47FAB4420ACAAA2BD690203A14EF891578B1098C54CFF6978233BCD05AA0194B932C260B7332453771996931A012F7AF5B52A046471EFCD720C9384919BE05A61CDE8E8B01251C5AB885E820FD36ED9FF6FDF45783EC81A86728CBB74B426ADFF96123C08FAC2BC6C58A9C0DD71761292262C65F20DF47751F0831770A6BB7B3760BB7F5EFFFB6E11AC35F353A6F24400B80B287834E92C9CF0D3C949D6DCA31B0B94E0E3312E8BD02174B170C2CA9355FE - -count = 4 -seed = F1902A7815F37BC7F5802D8CBCE5B48D82EB85691718062BFB84D8C06AA41D6E9039B0A107245DAFA4EC109A57332914 -mlen = 165 -msg = 1CDF0AE1124780A8FF00318F779A3B86B3504D059CA7AB3FE4D6EAE9FD46428D1DABB704C0735A8FE8708F409741017B723D9A304E54FDC5789A7B0748C2464B7308AC9665115644C569AE253D5205751342574C03346DDDC1950A6273546616B96D0C5ECE0A044AF0EDEFBE445F9AE37DA5AFB8D22A56D9FD1801425A0A276F48431D7AF039521E549551481391FE5F4EBFB7644D9F9782D83A95137E84EA3AEB3C2F8099 -pk = B8988E7E23C2D2D7CA34B0EE0A12C3CAA2CEB92A7CAF04C44F2B5AA9F9B1C13C5E4E72B6AA635C59D34478616AFE23196A7AF617BF0B1B34D1319335AC7C1300AF52AA89E58A2EAA19DB49376781CA274D6B5096E6DA68B4752E01FE794C213A064EB83352A54F6931C848A4E64DD1C7AEC3C569E11512B27421C570E2E01100 -sk = B8988E7E23C2D2D7CA34B0EE0A12C3CAA2CEB92A7CAF04C44F2B5AA9F9B1C13C5E4E72B6AA635C59D34478616AFE23196A7AF617BF0B1B34D1319335AC7C1300AF52AA89E58A2EAA19DB49376781CA274D6B5096E6DA68B4752E01FE794C213A064EB83352A54F6931C848A4E64DD1C7AEC3C569E11512B27421C570E2E011000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066FB227ABB412C57B23696AD6E5811F2C2BDCD8F6C0F97AEF03D86A48E769D8348EF9180F55C1C11CA04663D937CD3FF7941C883D240A01AB861CDC41C9C4815F81252FE5286FE2A5287B9101CD5C8DFFF2E7CC5C0AA4FF9B2FBFFFFFFFFFFFFFFCB07467C849B38BC69799C53C726B73B4998168B23BC11B9F2C1010B119520CC92CF2973B1B49048CB165B1D4CE6AA6D5FE1582D466F570642C7901759399D095A6C6BB27BBB90EAFB272314202CA426FBF110B2C78AE4CBB0EFFFFFFFFFFFFFFF954D4B1C94FAF76B683F4C16CA0138ABB109073333F76C567900AB45546DAA0BA1375691E106ED0B10D4A2C15F5183AD43506776EE11C8E9E287FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2AD218829920419F47CB325DFA9712C51AEE15F5FFA1E7BE5E33518F4E50ED064094D4DA68A2247EFDBA76A2219897DBFC4B088F0943FC2231AF0300000000000000000000000000000000000000000000000000000000000000000000000000009F084D46CCEEC5AE68F427B92E2DA0206D599C8A04D62F0C3F451313C15E013684EE09A667E36BF2CCA70ACC2F6EA46C619BAD217C2C0B2525A517326FCE1B00A2C230AAF15C4FDECC195924DB7A0EAF6E57D62A6FEB23A4F47B5FD505D95B97F5E5EAF09732743347FD16FB459A9F44143F32428444016874A47276F98A12004A1E13CA6181199E316F0BAB18395958260B98FC7B5E3F44C1D7747C8D3C4562CB9D2292F5CF4CD624DF992BC9C6A753F21366E16D9572A16751F0199F2012008A60BB8148DD4E3755B220B9C6BA4D89294C72119227848A4CBACBDA46F65ED3D5803D20DCD1753F7EB32A1ECC86ED3785CACD23209BB3039D4E305CDECF1600B4FA380E25BADB2ACC2BB2D8B546CA84F3A4385DD5A4749435D84E19D18B2DDEDD8FA942776E755183BBEAE81867FFFCE0B9DF8FD5C95CDB224201B8BBFC0900DF7BD231AB6DCBAF70C45A8B3B588F72A2B3FA6E044AF6FC7E417EDD29F7A753F2E3ED7980FC07F80956172D4BFDF14AE9A385501D73F0693E0414AABA020800E801FEADAAFE75300282EA5B9A771568267AC55C503B67D36DE43DAE36469410FFEDC775FC9945A605549A3A54092422A188EC0465C08E0F5D3BFADF562B2100B8A2F598E49114E1F52439BEBC78605A8326FFC898E74CFBA24D5E9EE61940C9878E5C70990FE1A8A9E4EC2DAF8993AF39FF8FE0E6C68A68D539D9263442070023A2739642E22962A9F692D8B1D002AEA6683EE4FC03ADED11BEE630798050DFF626F0F2909993505F8612845838EA07DD576A1994E202C31110FCF3795A2200EB6381856E41A2DDF06D85076E0C856454D9829B2825B49638715C4AF61C0281BAC6957F3EFC4D8946C54EA45CC501F3B207330F83BF7AC13FF070CE49C80900E21FDD5EDA1A92BAB67DBE96A954B722947A921BF1347914896B8819ACE4FDEFC5B9BF173018B6876B8CDF653287DB100C408A1F6EEA3766F9C40DC64A652100E3F74F83019C84169B678467202F581E152704F0ACE681D40A000A2819B75C419F9C5768F7C216EE8BFB6B7849295C76C337070FBFAB902FFD21A43FBFB91400AD462762701248CD94C100CE10D87BC8D906EE05A2D9BB6779F06AF6817CFD9C4BF49D64873BF93BAAA621CB30D29C22ADE4E9DA63FF6612D0AA552686FB1900ABA37FA82271035295EAE1D12C6A10E2918B44F4222857D6EF85A0919A14CE60B42B9B1B81EFD487C86FC502045C87B78875664A08C2352528D7E54022BC1F00 -smlen = 500 -sm = CCE876AAC043A2F2EEFA2DA44CFBA7C3E3B9018319432D29B27DC061E22E5A96874AE6CCAF01428FA44B6583C35C575531BFD9A9FDC8AD4D01E5D220A7BCA06BD41F97C842D73F9C9CCBF101A2AFA117BC0D02F6EFE53DCF463D8FF522B0019BD65928761A9C52D44DE3A29927EA700C7900D99462C01531AAD5D745E5A4E7218D098B9A011E6860BBF278D0EEF073AF583DBD47006C4B0098F0D3D30A02869FA04E31D9B15199C2BEBF0038EB4365F93E23A689C8611C32E925402A0C011637EC0715722153894C989A7460D2885B600026DD36BDEE21EB3E617302F08ECD5B340A5B015DD3555B37313E55242B2C28E999D82C83BD0197045D9BC9516E38889588D232271B6A3B2B00019D30F71787CA8EEC7549C82612F5C58FA8EDC21CD2E1117FC60D6C598C0D58E801035C4EB7A037D117211AFF5F0110C852AD085600016C4D33AE940A2F5EFDFFB091A0001CDF0AE1124780A8FF00318F779A3B86B3504D059CA7AB3FE4D6EAE9FD46428D1DABB704C0735A8FE8708F409741017B723D9A304E54FDC5789A7B0748C2464B7308AC9665115644C569AE253D5205751342574C03346DDDC1950A6273546616B96D0C5ECE0A044AF0EDEFBE445F9AE37DA5AFB8D22A56D9FD1801425A0A276F48431D7AF039521E549551481391FE5F4EBFB7644D9F9782D83A95137E84EA3AEB3C2F8099 - -count = 5 -seed = 75224ECC026C18159FF92256844D0ADF953F0A4DD8D74D4EBF1DC5EE8F5630B011A447FD4DC34A2404D620CA0E1F273E -mlen = 198 -msg = DBE5B6C299B44F8D60FA972A336DF789EF4534EC9BA90DF92AD401D1907951EB6285EDA8F134277AB0A1145001C34E392187122506AA2DBB8617D7943A129EB5C07DF133D7CCDE94A7CB7F1795C62493ED375353D1F044257DA799F7D112C174FBC35687E2F87FEFBE2D83D29D7314B30A749FE41B1B81095638F112BC4563420AF235280E466FFBE7050C4937C60FC18D1A6025BCBD489F0C538E088E906ABE8597E2C8EBB64F01D225C847AAE4B77BAE6EBA9269962C4B94A9732CEAA2CB4093D442FFBCDD -pk = 5AA59FC8BA10FCC87BA423DC70E262B528E1E556796D693BE5296360AC5FB9B7F10E83C29BCDE1ACFF40362FC5ED7AEF1589CDC903D932F6E1984474DF9C0600518369C9704D689F90C41AB8370DC2A3F35B1BFA25D6A366898AA367ED78EA199167E478C14947C82233745FEC93F5FAE19BF4074295918015D860CD0AAA0200 -sk = 5AA59FC8BA10FCC87BA423DC70E262B528E1E556796D693BE5296360AC5FB9B7F10E83C29BCDE1ACFF40362FC5ED7AEF1589CDC903D932F6E1984474DF9C0600518369C9704D689F90C41AB8370DC2A3F35B1BFA25D6A366898AA367ED78EA199167E478C14947C82233745FEC93F5FAE19BF4074295918015D860CD0AAA0200020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ED3D502EDD874EEAC1447A164DC6F4F443A6009C1ACF2827AC7B24E8DA3DE537F6ECF3938606056B189B376E473BA16070E121A4A1A332048869EEB7692BF5976753528E3BAFD0808831FD09A52FF0B5AF167C848C360294B0B00000000000000FB64738BA11BD00E2FF78B6E308FC21F112DE205BAF64CC394236892A1A2E21709CA4DA24CFE6F5CF8D498EBB59B9ACE597D94B38EC6BD99E0D17EA634C7BE312ABAF4FD824ABEC85AFE02975D61F9E9CF3CBFE8BF99003EBDF3FFFFFFFFFFFFFFDBB43B23587B212F79C11CF6ABABBBD2D36F28FB2C2A51A65E8FABE0D82E4CD01593F1CCCB7EBFBA0AFB49083D1E0294D5328F2D4FEFEBDC912B0000000000000000000000000000000000000000000000000000000000000000000000000000000E9539B3308A1F5397911DBF99ABBB82B71C482A7AA591888223D522AEE16C314F77216F3286CFA609FB4E1AE62C4541BA4A76CC86D9B3A3D8E702000000000000000000000000000000000000000000000000000000000000000000000000000013562C8A44D34ED726E1AC9B26D287A241BC23975744340A073917C7D9BF8DF4913986DC7773239EB7B875A22C3DC5E11A66BC64622A303B1D892D7163B11500C599113E25540882FF12B1272568C679264AC81B37C57C865E293EB96ECF7843EC5F6FE4DFA7AB67221D1489C1C7881BE6593CCB0667145C0EB2C84806362300D5F1917E633F0A6FD353B606E514D2A5C524D6CA2D83BEE76E2C42E9FB515C87B7FC14FD7DE6F69F8D17E159C29AE4CA1082F5FE53741AFB5901847D1733080043B5E7565601363733D4D4B73CF144F90878F8BB97FB010997A0DF3CD4A9F9CDED246F0F697389B8BCB015756CAC2023CE658B0B72280151BAE8BB66867C00003A1373C199E6F3E4BB7A01EEEA1E0C35CE5E42A7BE24A5DA78D2FCC4D286A179C44D3B50E8F5B126BDF00E15F15D41C2FB8C72C5AE633AF9D7E8713E3CB41500146CA33504F61932B3D5870E73E28F074D369EFD215FBBFCDAB53EC8569715D1F63873233FA2547162841307365F8FC022DC62B4135A1C659DFA6AF4A8820400DC63FE61B42D15E66A830CA45E189949876FE009AD1BE36F8AC56F3B365494A3FAA395C8F94066FC08A622CD7401D675F9FFCBBE71D6B0CB81A0B7EB20102500FBF5A464C0B2AD3CD4EA3B9A81A3B1C079CE8550E7983EA5E47F2671682E6D1D7F32D834A95DAF0AA6BA2C8A04E2340BEB54356834E3BFF438AC35FE57C6230059B6E8B456BF40F495774AE5733CD989C4D457AB4AB8259DDF6E0A5F6F08E04D7ADDB41163050BA975831B53A1F75C1FE49161BC9B623787568EA73D068B1A0038295EE28697F8974C555B59652B902502B903582473A845065202B799A53DB22001E7152093A1F7E247AF4E8CBFDE943A6DA6A867258C21E20DCA758B350500D6952B7CFBC41AC98489B18D8BD765644A72493F96E10CE9BAD462E6B16207CDADEA3E25B4387EDA24E60BD0B244874EEDBA88D37DD78352336EF9A892380C005F5F460DA468F676BA0E208EB5A2FDE74CDD9B3806BB625DB45EC67C341FDE28D98101AE2F52CA05D92D74658213262D44AB4D63FD17AB8B4EB0930D07EC0900D67CF8EF337C0BFC98BD067A116DE15F8DE193DF151131426B0FFA91F5D7BA94A0BEE05C60BD8EE7844074A125CD7E7303A5361BBE2A315D502FC6E6D37B1400CD057E522B3D39888EB3559BB955ECB90CE030600A4D59FA7AE1EFDA2DF565BB406F5EBD3ADDDA44B26E560B776086AD473C3AEE4682ED128DB2168D698F1A00 -smlen = 533 -sm = D2A4563BC4993CD3AEF877F2799C3FEA3D2300EE1AF401030E7FD6B6230809E527D035EC8200F903AF184DF5DAAB8D06B449F4588B9E2F1201EB69633D40E10798A82B2DE30915DDFA772D01B24096C22989D6FC573C30A42264E4D15308004570D19790D517329613C1DE261822C067BE00EF9C2FC57EFB7539858AEF6ED4D29D1B03AE019EE80259C1F38182FF09B65B2B8A7A12CC84001D530B47B1E6658EF3A971A231BFCA952162018F7DFB0C824BA11D1BE696A12C976B75952E012C5B671763B3ADB943CD8F4CAFC7C4FD070F01FB408507D150ADD6FFEEECF7205E2B0901C9003B059CB3BA450BF65F24F6D9AB5351F761B90120BA47A19DFB39009F126617766C5FE48B610100DB8984A08E2D54E219D481FF9655FAD228C83D26FFE7BBA774FB77852E8D7AC00503BF9C77B77E5E63034DC4B1B20E3DCDC43E9201438B64FDC96A45638B9838A88C0501DBE5B6C299B44F8D60FA972A336DF789EF4534EC9BA90DF92AD401D1907951EB6285EDA8F134277AB0A1145001C34E392187122506AA2DBB8617D7943A129EB5C07DF133D7CCDE94A7CB7F1795C62493ED375353D1F044257DA799F7D112C174FBC35687E2F87FEFBE2D83D29D7314B30A749FE41B1B81095638F112BC4563420AF235280E466FFBE7050C4937C60FC18D1A6025BCBD489F0C538E088E906ABE8597E2C8EBB64F01D225C847AAE4B77BAE6EBA9269962C4B94A9732CEAA2CB4093D442FFBCDD - -count = 6 -seed = 447F03C8CD27EDAA1FA0436DA492812F57AC946479A9F1F90EC4F5E913A05F8AB0DD7645026A96510F6D40AF05D85B07 -mlen = 231 -msg = 0073BEE97FC97C0FBC750D474AEB93189F061E1A5CF6600C04FB0464338EC7E85252F94FCBC7B2BD00E438480D9AF3ADD92A92E3E2E8ACB55077C3278FC7503988A76E9B6062996B20889AA55B343D5A003C8A8852D738F955799FA3426BE5CCD3AA6B6EDA04D4884941FFC0B69C5ACF12B347A74D0580CC3335BA816200F87674A4C1D98097C70F2F27C74E94A661850610ECF4847AB5B58344F958C5719E06BA396225BBE21ACB0FDC512B885D391E11B0C0ED5CE6B5DD8FAFF91F50025C69D43072F7706D80D9FD786E1104125D79A5F4B5FD838815D44FC8B1AB678078CC174DDE970D448B -pk = DAE00C39B081E24C7F7E052E15683AFF4818601B161D3429B1650F4F23896A78309A4AD646FD3C5B3E052C0276F8F808F1CE4EE9817BF4104DC38AB2AD610F003EA4CE13814E648FD11DFB1B245FFBBF7826D1DA98E027649FCF708EF54AE3AEE57930E0EBBDC4668DB68BE9ACCBEB002270DE10F7B679EBDA873C377CAB0B00 -sk = DAE00C39B081E24C7F7E052E15683AFF4818601B161D3429B1650F4F23896A78309A4AD646FD3C5B3E052C0276F8F808F1CE4EE9817BF4104DC38AB2AD610F003EA4CE13814E648FD11DFB1B245FFBBF7826D1DA98E027649FCF708EF54AE3AEE57930E0EBBDC4668DB68BE9ACCBEB002270DE10F7B679EBDA873C377CAB0B0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EF7407258081C188FC55E8F27926BCE270FC14D4C41EF6CC6C8EC847CC68ED1680F69048C5FE4A58A60309C62D63F34F71119AA0006A9280D9BB98F4F5B8AB2F5AA20955627ED13D57D6C1144EBB78D4EE333484CC40BB846A09000000000000005646D233002C7E0963D501D638D972143747FF55CF24CC8EF26E7E190B5776B65690D0F0B961B67996CD9B0D48043DE68D5CFCCF7F71CD500A79EAC23F0CF6F33E3B75742B3C06C025D07B4BFD7766E0705482A495A1F7D068E8FFFFFFFFFFFFFFBAF1B39CCD1C2C3CFF18B018AA7E1690CCE7B542CD72AD32DF8F08C4ADD31390D646E1D2A83BB2E4C49FE0D33DC33F90FBCD2FE4A2B033DB5382FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16F8C07BFCA5EDBAFE48F83ACFBA9E7F2E6126C143328A791A3F1D693DEE926E26F33EAEC81AB6BBC57A07BC4B894575B7DD82353849AB1E8AF010000000000000000000000000000000000000000000000000000000000000000000000000000E4F24ABCD27FF8A72795828F8FE038910905AC0DBAF260044C560AAEBA541BCC3BB9D3F8A151C474933B4FBD6DDAB34F6288FD8FB65D2E5197114B6529F31F009EDC265F797BA062ED3A44EBB9FAB77C8CABF67F5EC234BD5DA315EC590E3F8F25B7CB7602D836CF5BB346E0673FCC5823799E7942149B927A25548C06010000E9FBF791E65D742B4BB319762DA93E69CF02BF2C532B3350D7857D6C8984AB165150A2C9AB3DAF15ACF468593ECB3467F9EDDEDDF085AB660D8E28823A891E00377B2BCE07534D6B94DE438A2242F9968F9CE725E4021828C3B66325AE99D8EB8198580D2608D64B18D60CDBE863A0E8E85440678C8792648AB3D05EC46E1F00EFE2BBFD42C7E90E4E4231C1F18E0C032D2DAC56C56019B1A450AAC1F67B55627A79C5AF2867B465C26C01BF09E6BF4EAF885BAAF3C742C234961F05B028150007555570999D4976E90F6A363420924C7005A579757FD7AD9BB171B12CB73C3D56EC75490B8FD9E8DF98C20AD0C2A96407849CA4629E767F4EF26A670586020028DFDBC210F86B4C38EC8575186AC2DD693E774133606E931281C290BE1155922346FC52C719E8901E17D9F3558FD31E746629033E25F54456EAF9FAEE111700ECAB61A69DCEB0F92E89096277C58334E1234AC38BF254C8E0C3FFC281A55D488BECBDC61C83DE3642CA18415B7B8BCD2503A83C2AF70F3FADC1E0D0D1811A00DC4D1C240FD8F804A9F06315FAA490C9F0849A393417A96D5C8069D54A542856D7EB6CE958EA90FE5FA61AAD2C7F456119D25574E3AF8FF238ABE70F44050400DA6329E82E3F951AC1E6110EC0277583105F77CE43920B2BE0C0262B34D4A578373E8B72D2D88EEA6FDE15610C3C8792FDE47590F7A4D166AB64D53878FF22007081A3E93D6CA6886FA73EA2CDCB179E65827C6AB41BE729B3FCF38B0076D8F47E087D7B472E24FEF7FD8EAB7084584AB78CE6D45C570C00002870735F340200AAAB00E0FE9C4A8698BE3E2F41BADC710AE8EF22607E80EE452FFC7716A92694416E1CF274BAF45B5579AA0144F2D50F5726CB9D69669DAF43E2D658D8842200CB9CA8676BA8DD7CBC1857B8C38C3B5E5ABE459375762FD1446DFD135B5F82232F9BE38BB0D99BA495367F88FF5A2DA6ACCA53A57DD4AE1EA82CA067AD0E0000165CC5DFD8CC2A83163744307DC579251699504CEBF4107E8B24E761A1080E567A5BD8339990351529B101AC45012FA1DE28FE768EBE3A24957C47DE45210500 -smlen = 566 -sm = D3C4683657D1068B2AEF462666A78E7431C7008C0D6013606A4E905ADEDF35721D730E95150125455E8FEF0EB0BD00F7986B06414BD9F1C901F2D6476252B274565E897CD9956BD66AF28600AB4B30836C107B7017BDA39A82AC8579036200E699425217B48FC0472A82702A08B180C4C700C917C54A5AC3370440FAD4551F755447BE0B00C31F88A4DBE2D5407594323F0A81469FC8850181764D034662ED791C73F1944A85CA5955B101B5E90E4D2B42169F98BD40A3724DF2CCC3110132C11B36F2A2DDA80516B58538E7E1133A88005A2562CEF8B58479C2B9EF4513D658A01906012961D68C946083B7FC1AA3DDC42C8CC5847E001DB522497F5B7DFFD949D995B29F6E85FAC80101276B2B6E95CDEBFB80B5E0F0DD95F6C30139DCC6E12D550724A3DD215C1207200503E8899C895A371BDFA7560FC5B7D093B8B87C009B21C660C20A4EA9E31ADB265876010073BEE97FC97C0FBC750D474AEB93189F061E1A5CF6600C04FB0464338EC7E85252F94FCBC7B2BD00E438480D9AF3ADD92A92E3E2E8ACB55077C3278FC7503988A76E9B6062996B20889AA55B343D5A003C8A8852D738F955799FA3426BE5CCD3AA6B6EDA04D4884941FFC0B69C5ACF12B347A74D0580CC3335BA816200F87674A4C1D98097C70F2F27C74E94A661850610ECF4847AB5B58344F958C5719E06BA396225BBE21ACB0FDC512B885D391E11B0C0ED5CE6B5DD8FAFF91F50025C69D43072F7706D80D9FD786E1104125D79A5F4B5FD838815D44FC8B1AB678078CC174DDE970D448B - -count = 7 -seed = 8C151C556DA912A82DEB32144C8A8C9090CFAF5C12AB822AC3C72618837A41C2453B715EEFF3724CAFE69B1ADCAE9DDA -mlen = 264 -msg = A1586245D81F96BD8EE81AA30F10C0ADB343D74CF72C4DFF71550C12873AF89FA1874D4731C996243C3749AF3F6188FFE9FA45430549045134EB29EF3CEC37E72904AA082B1C6161E6B52361E49AF4933A8D8C0734F21CAFD7467B0C02876F43211D6122E3E735FE36064DF7A0C91449237C2BC7C3A78AC7BB0F9567F2576F05802C872ADF183A87AA3B8217188F2F3535F877724F35B29E545DE4BCF258F13BBC7EDD8C6587F733C9691F74B4151CF8C060C3AE9E8D49FE7C77BF477DC9F23FD0F0B67320275529034B84F94176730923C03AA50F9584D9C2D60B8DCCF85A13F243F30A51ABEFBBF2CDA602BF3D75E849EB92422B808416C7E56B046CE38E4677AD24D23D7237A9 -pk = CC7F9862656F5D6E45754EA02FCCC2AAC57598F3379D8BA6D0E202E44940BAEB6720DBF0A147F0B9A7B9976F517E85156A2EA29A3695CD26DD4C9DC77D0C1B00D590F5F2CBB9E6682AEB5F04AE62D486F921C9144D0F5A9ABE737D0B6A26A070E591C7DA03196D01C3F5AADE5DFCBC3EC3E03070A9EA8FB84A11A7F830720900 -sk = CC7F9862656F5D6E45754EA02FCCC2AAC57598F3379D8BA6D0E202E44940BAEB6720DBF0A147F0B9A7B9976F517E85156A2EA29A3695CD26DD4C9DC77D0C1B00D590F5F2CBB9E6682AEB5F04AE62D486F921C9144D0F5A9ABE737D0B6A26A070E591C7DA03196D01C3F5AADE5DFCBC3EC3E03070A9EA8FB84A11A7F830720900020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002843B06613884FA8C6BB113E20E2347D291E6E0AE9CD79D851B8A996948D33EAD7B6BA7636585DFD020B87345B7464615F260C839CD939C388A21C5E9653626677D9E5D7B75397EAEEDFBBBA3E7460CA479081C4932BC1D0CF150000000000000079A1105166410C5D3679123EE805E8015BDF6C44EA22DE16A264B30AF13B959C9F421C9DB64C0CA85DFF0DE2370C8248D720D0C361E6E4BF8D50BA06E930DF01C466744200C5A74CD30469988271CE76C4E1E39A2F585E2569F9FFFFFFFFFFFFFFE754C5476A5F3717050F9DC81D0C52F25D0F44F837AE0F43B82742C0ED73061DB6DAEB8A0E5E5B0A546C041423890D48B0CAF8CD330494042066FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF503309DBE374397468FF2BB93E89940A0726D1EDED275A8849B896341A83A2CE38282A07B152840E1A140A270E8B5E86AE348813B1F84BE63A870200000000000000000000000000000000000000000000000000000000000000000000000000003F53D3FB37C439C4F5BAE825C9F13DA39C350BB885B216DCF2AAB93C42474FBEF91B48A46E94BEBF219FA57DC8AE593D26FF2A9DB718BF8B94A032FE8E3B0E0010854F8F70B45CEB4066CF49D8CE19A8B34F64DF5C051A8E529841CBE3B13DB82500A5DC9A4CD3F366815851C40F1A8A6D6CF7AE56659C0DA4B2F5DE37740000EB250950AA2D29F566238C3125CB53A52B8B82572883BF7296F8ECC267BFD6FC5AC2DAC3ACAED43D57F3F8F24A0F1F1819C7C062BC9394BC8C3837531DA10B008C080B1CB390522174B6A372A24AD1828AA345C62A31382C021193A29BE072F16FED56193EC0AC1D4DCB49F57F2D00CD7EFAC0E78BDD1247C7C29E6A00A816003D8483640E65FF26FBEA0A54AF3F6D159ADD0318D588FE373369F878B24C7D256DC40C1C575A5FA374BC395A0D099A2A4DB8B7157932EEC633D194F597C709006541FE1FDBFF349D7660BC2CCA27B7533D81AC318D1B2CE1D15DCD5C6AAE83546AFEB8567CD40F1095A8A6E9AAF046566A79FA65D7E1B389F039358F6E101800F4CDA7E1AB98541311AA20A99F8FC8E102071BC55E2A18672166C0EFF5FE0F67A1EEF9AEB3C1F7E21887B7EDF56EEBDB1181090FF8414B85E5C7BEB4491F1000335CEEEB67321FD30BB64E37172FCF8A88B1218A8300FE11116DD4557FA3ACA92F597F2E64273228E1E93F709E3D9EBF5431D3EA5F8ADDF2B6E2ECEEE8801B0035A5C3ECBEB1632CF7BA53A041E1A56277AC1F73DCD7C6510B9A440A4CED8C392E4051790FAB2658A2D2BAEDDF4C0D0D17A5395C5767E41A1CF4AAC04ADE08004C3B700CA6627627793306925574E9CF0ED44AC1961046FD1AA7B1C1A3792DE8BF8BC7E296013560275301C4B78F36B40B8C5179F9E3C57EA76B2CF3DA501000AFFDA99662075453389767F7857333B5C9641A78F298053AA6CCE54CD727CB8596AD93E83B12CE42B7701299AD268843F54FE8E88541D2FE0B5F9A78492B000030F426074B7866B2E16694EC5C6A8B8B7833FE98BB9A7452B01A1A9BD27D8B3E1EE35946D5E16A53DE9F3E280E37EECE254CA5095BA8782D1FE0F00EC85C0F0022F1CD5E855BAABB0090122C46CA2FE3510CE4FE2FE0B8AB74BFEE2CF24CB5D4A4EC3537C8C1B1E0D794FF9DE841C166F8EB17B6E0D2D089623CA07B88661A005469F0DBED5C4B8B4A624858DD347DF68D92C5E8F8A67600151E953E9FB072128F4C7332ACF07EBE4D1824FFCD2206C6AD03E90BA10C4ED20FF699D7BB1E1600 -smlen = 599 -sm = 2673F12DC4FFBFD66832E0A002A72C53017300C419A137AD6964773936046D8776132F03C70113160EF5C5036AEA777BE0DE3792078997BB0163F8A54E2EC2650C8CCF7A4B78C09E13EAF801B596F83F416551ADEDA407DCBC53CC8DB5C501AD3DF80356E087D7C194EF6B157142DE1CA200EDC291669A62304EF65BE694C4DEDDE5C3070140F1B364428E06D0A9FDB7B2704D37C63DD901BA4450619F7D01FE9DE7D4DFDB2E22814295006622CB593C63B7CD5354A49D1C8C027D9DCD01EA150F0C694B01AB5EB7D336A6CCBD2D41CE00CA340ABFD248B637CBAB91968F88391B516100319B9F125F72C8DF384BA332DBC7E732E899019BC0CFC7ED6FDBCD82943FEDC70007E712B400010D87275681938676E05419590CBA57D26E155E9A30BE62C79B3811F300620C5D0803F3A41D6973C0A5EACD488D01EC92B0AF778D01A38EAB7208805E2258CAEB7C94E803A1586245D81F96BD8EE81AA30F10C0ADB343D74CF72C4DFF71550C12873AF89FA1874D4731C996243C3749AF3F6188FFE9FA45430549045134EB29EF3CEC37E72904AA082B1C6161E6B52361E49AF4933A8D8C0734F21CAFD7467B0C02876F43211D6122E3E735FE36064DF7A0C91449237C2BC7C3A78AC7BB0F9567F2576F05802C872ADF183A87AA3B8217188F2F3535F877724F35B29E545DE4BCF258F13BBC7EDD8C6587F733C9691F74B4151CF8C060C3AE9E8D49FE7C77BF477DC9F23FD0F0B67320275529034B84F94176730923C03AA50F9584D9C2D60B8DCCF85A13F243F30A51ABEFBBF2CDA602BF3D75E849EB92422B808416C7E56B046CE38E4677AD24D23D7237A9 - -count = 8 -seed = 9B42F41492530EAC81992F17613EFDF155F407D7E67F18AE193EDCE714D65D1031E7AD10839AAB46D0850EAF5997AB4D -mlen = 297 -msg = 9366ED7B3B623C411448B634446F1A3FAABDD163A6CC1E2BCAE4A98703CD8CEE441405892FBA051BE2A586A6950A5EF73A255E5F86B0D7212E0C51C3BC79BE4B88E76ED6F043FEF3204FAF044BFB1ED722D61EB5D0B74C66A257E8AC3A2206273C80D2EC2123A4DBB715D60118D99ED7322E38F1562F82379138DA3DDB8BAA7CE61AB729AFC3748C0134633CF45A9973C05C75D04E82F631845427626B5799DC07DDF830BA01E8BC6236BB6D03B37D949DBB29EEC7DFE60FBC17EA590956D251539792016E2A8B01E70476961BC9ADA43CDA682D0CAA4FCC58810BBA1A673EF8F6BC90BAEE701E8E4F7C04A346CA56C7B2862FF57756CE6CD1EE22D677BCDAA896EAE96F87870E032C18B6C6A0C1A191FAE2ED487CE55296CC4B6339EAC9E8A742BD0A44C3525CC750 -pk = F83A20AF1AB09481FA54FED078B34A2E3017071BF6CF7BE425BD2F1035CC55E09DA8855B2D27C87AF0DAA175367297B083116B4F329DFFFF03A1330D76D40400E7468C7F2FB12450F8F31B6E827B2DDCCD5DE7272DAFE7AA6006FD50DE7A0325039C0C80939D4B5B0663A95FCB6018A40E7CCEC1008AE79C86B2BFE51C671D00 -sk = F83A20AF1AB09481FA54FED078B34A2E3017071BF6CF7BE425BD2F1035CC55E09DA8855B2D27C87AF0DAA175367297B083116B4F329DFFFF03A1330D76D40400E7468C7F2FB12450F8F31B6E827B2DDCCD5DE7272DAFE7AA6006FD50DE7A0325039C0C80939D4B5B0663A95FCB6018A40E7CCEC1008AE79C86B2BFE51C671D0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F25680BEDB989EC1192C4702A0DED41C9A56A7E93A97E832FAFC2951E192CA0A964F76D7652E9CDF4192F54B46A4D2DB246E9885F45777509FEAFF542743030CCB55F7F03BF64918727150A5131DA7AD8E17F520C42715EBE807000000000000001F3A6718F80C489D9FA73D26B1481AA26D33E2557B75AB24167A0DC7340DF1253C53A5C34686DD38DB4B1FC92EBFF34C5223E909489F9C23331BD6098BA517D76F17797484B2BC3ABBEF18C5896190C3129EA5F1B38C3D5C3AFFFFFFFFFFFFFFFF91466FEE5D42CB2C028863252AF92557052946DC39C840A11328F410C2F9EBE3E88F32206001F77BCDCA5B60EE0454D50C376C3F527B63F437F5FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A95A89F91C7B6611678E8E528BBCAEFAE6C619F71672103AE08D935C5AB4B201DC1215B5B2BBD0323CE22A17BDD5CA710213ACF353255626C2000000000000000000000000000000000000000000000000000000000000000000000000000000028342D0E78B594B844E27DF50189BEE713CD3F512EFAA4F75FF1AEC8077F23C5887CE7DC008636567C5DDA5434DE227E9C6898D698D50B0BE1D9CB0C62061400C8458B6356BC687BFD80DC698563977DB74AE2F6BF65B3D32625A2D397B68579CF88CE37CC76A62E029F1E6CB65CD258A7561D6475C52EEC44CAC319C4591F00ADA9A709B7A011F5403B3B2C83F65E74C94335BDC34792D19B7D0B7ECEFCCEE94B80CDC65FD075572647A2B2E28F4375ED45779CA9BD382792D29B18DDB110003CEF6CEE9EA870577F28B1B1D6F8F8ECB2C1A2615824E9E09EE48B65456461C8142972CD512651A3DBAEA3D1C832EE10DE44B165A6D32EE8176A50749E4714007F45F68C05151DA29410DBA3F7E62C568119C8AEB686E0A5838FE0EFD806A19BCCF2500FD3552B61C65D6B95432BF295C0D77EA13BAC7DD630CB3A59C7680100B04FBE4F589AEC5327B78772C6A36459E0B3484FA2F4BC00657B49C7677037A1D6E2F4017789079B6D898FAE0DECB5D3897EF97E0B6914236415D8E932212100564DE494A4FBE1B384E3F1337D4970D9B8CBE30788CA83EC60988008FCCDF3DE65FD2C502A79AD3645E78564D181C188B1CFE6009E3152F53F2B47065C6F23000954C0207B479CFC08C723AC5B558DD0D4727B769DF9EFAEA8D0E5BA1FDCA6F6C46BB18CAABD1EA4B27F4DEE479BF8E3656C8ECD899122FA3E2CDD11C85D1100980AF3ED6879E16A3B3246C9AF8F8E973A8DE0A8B7A1EFE688296A0180E5A251BBB3E41F8903D2B4BE9A2D6AF66D979C228D99B820E82596F5AC19A6A8B705008D56BFC2BE0C3CA8CCE62FAD8AB27F3703127C9738AE590572DFD5A2FB338FE06C516FD4D9DC4DF6A5F8D51CCEB976F52D49527CB7120D6321FD8B24DDEB05003560F1FB10A201B9D06E849904F3C92BDEE94FF0BDA1C3DBEDAF89275513CF8B0F96CA652643479D1876E63EA9557719A9DB3E39F353E20E5A9F772B78A72400B6D554967FE794EA66E6D339FF42D953EA4248ED2A2B8E956AF1299954217B72CB3E35D2BA97C9F6F652832D57EF9182C19538F757BBF0AEB5E12BBE3E930D00E2E08B354975E2BD597FB7CB4C284B9E6A1AD6C9F1BD408E368645B5A248237C4DBF1AD96E6335FD778B77D6E961CD83AB3DD08477B84DAFFA5AA1E4EE990F00BEC844149196ECF42CA9A5BBE4CD9D21D71BEBF96DFD1D0382D76D76DB7DBDBBD2603FD32D884D540410C645EDDDFDCD057380181ABA2EBF0E4295BEBA020300 -smlen = 632 -sm = 700566F705BD3BCDF0AC83922A728E4FFECB01BCE6A3FA2339BF8629669267612123E70EB5005A8A55D44F761017B4F0ED97DE2E8AEF5841017BCEA65E74CDCC25B7B6CFCF61E8CCDE2D5601134944A2909ADF1CDF40932A6C06C71B65F000A71A4C41DDF2DA229A953D123512B9D248ED0198E456FE79A31BCBE18F29D5AE613EF08E1501E299FC3CB1275F83B88C93E6690EDEF33E7D00D6D863AC47C6A6DB2E45D202B5E17FACF9A300A7622070DFB20EB230572D8D53BA077D364E0071A4C9ABBDBCE65ED919FB0E703A9442A186018492184F18095A29C7E8A236A4D2C35ED849009BA03BEC04B8771EB123C5AB695B4D0D83DE016C11105C04FB2ED2471A9482E854A86A586C0001A99F1524C340165F574ADEDE4FE033BBDAEB34A9B8801E5EA7841A4586E5F9F4010346E0C17A4D249843723CFAC06E08465B354800008C9EA7381CB417DABE69B3A5B0019366ED7B3B623C411448B634446F1A3FAABDD163A6CC1E2BCAE4A98703CD8CEE441405892FBA051BE2A586A6950A5EF73A255E5F86B0D7212E0C51C3BC79BE4B88E76ED6F043FEF3204FAF044BFB1ED722D61EB5D0B74C66A257E8AC3A2206273C80D2EC2123A4DBB715D60118D99ED7322E38F1562F82379138DA3DDB8BAA7CE61AB729AFC3748C0134633CF45A9973C05C75D04E82F631845427626B5799DC07DDF830BA01E8BC6236BB6D03B37D949DBB29EEC7DFE60FBC17EA590956D251539792016E2A8B01E70476961BC9ADA43CDA682D0CAA4FCC58810BBA1A673EF8F6BC90BAEE701E8E4F7C04A346CA56C7B2862FF57756CE6CD1EE22D677BCDAA896EAE96F87870E032C18B6C6A0C1A191FAE2ED487CE55296CC4B6339EAC9E8A742BD0A44C3525CC750 - -count = 9 -seed = 11134936880F5A11ED3504CF7B273E55A351FCCB10943BBBD186623EE6C7A13A6565C3080D1F536BFDB018F99C4E46CD -mlen = 330 -msg = 0998114C84F84080E7EEBB47D248980FAC9D28F1ABB6DBAB3DD59A5CFD2C7CFF7F308372874DD5447C7B02E30165501C0C673128E4C543A414222BDF47E7F4E8DCA757B0F4A3281C0D10C4F02AB52AAF5B9A715E012607BA310947A60A5F62D6B8CFA96386D27CFA709189202421C078934AA2D955468E550AD4D0D4ACDD98B168A9568E232192E92789830317FBC959087FFFE353B6C168F3EFBE7164444F1D6CBA5246E31658C65440A841DBA78257E78502843EC1A6E9710229C8EEB85D6CDDC7D543285624AA1F756A5DD4F1A5D4FA52DB8C5C34880ED448FBB6D254509FBEEA0FA022F276B6A66BEF7ABFEA6049FF74291BABE781F718683397077B29FA9E2B46BC6B09251E587CC5B182195DD4060CC4A319BFBE251A5B660A739DFE5D0E5B93F3CB7E440194F1C8BDA922CB1A3EE3D27EDFD61C1D31A7F4534E84889EC83B51F1641892766434 -pk = 4BDDE3279CC7F7CE33A0F66CCBE897156E18028F13CE5FE7D5CB5679F20C13EA74E1578FFDF3F780816366B1DF6D9D95AD65935AF372A759EEAA7C085A150D0084664E66C9B378140C98C0DA787737379B522D498F393F1F3B26DF21C1B47C9ABC8B5784ED5AEC9F2F4727F11AF4C52CB2AA9E4B5BC480D3759609843CC80400 -sk = 4BDDE3279CC7F7CE33A0F66CCBE897156E18028F13CE5FE7D5CB5679F20C13EA74E1578FFDF3F780816366B1DF6D9D95AD65935AF372A759EEAA7C085A150D0084664E66C9B378140C98C0DA787737379B522D498F393F1F3B26DF21C1B47C9ABC8B5784ED5AEC9F2F4727F11AF4C52CB2AA9E4B5BC480D3759609843CC80400020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007784F25DC1C98756741962371A03B1D5A0EAF43C6567E4FF5480F9DC6B57FBF5BD2ECC6E50D6AE530FBCCA30FDF2E35711EDC33C1600BD0ED95D810215544F70788802B0212802FE375BC26D7427328185C49100619B9C21561200000000000000E00F6E58AB410F8F398E3B8DDAC26D2661F3C708DF014C81786413466F0EE4B658F3495831A28E7911F0DEFE07641AF453B9D61A6246400504E20C17B3221A7444AB67974340AFE0DC60543C65C1ED220AAFA6D1521D0EFB87F9FFFFFFFFFFFFFF78AA5684F11181FF4E8AD8B6E72CC2415F910248E49EE33778D23916956CEDEEA446A8BFE87F68075F8CA7E3FEED5FB20C407495D583CBE32E53FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69D85FB94D2BCFF234CB303D36BD21F7011FF5E16FF95C31ADA907A599AFA4F942C0A673BD358EEFA2D63B307C40671DA79CABF9E634B5A40A1F0200000000000000000000000000000000000000000000000000000000000000000000000000009CCFF8A5FA24E0D01F7DE4DE55B65A945FB4F3FD9F1607D69F3042E3B3B74292129DE081101784B844FABA0FA83DACBCD76269AF9F5C18C487C383211E2E11007BB6F4C57655E6A827F9CF1DDD669F3760DB59DE96E9B47316B87749EAD17D01B12A94EE6C1D8C4A46FCFB61C32F748B643A68ED76A2FB4149A505E4502B2000398723106F026FB92E29A40C2E7947E6C4C51F04C72B38A5A2096C7CBA3EA9C5712BC7D1D27520205B6162786AED62D0343B22EAC5AC931312DB93AFC09507001B8F6E2F8E82BF134601EFB4A1235364EAE8A937E5E5F84F80A18BC5A948CB7E4E07D385308009F880E7CAEE5596FBD403324A96259430F4C89268BB82D40F00EEFCD8DEC1B34265BC2A2B0FD6078191F46E2E40FD2FEF12111E585621933568A3BF27108A604B363AE540DD1DA73B17FA991DFB71A342F0E960E6582A3D1600130FFF1C3A945ABDC50B4D7642ABD2C07E1420E11E6B2BFAFC249BFD60CA340DA106CD5C56ADA843A378FA12DFC59598352B85308F047584382C5B4A035A0300676C425ED99A4812B81EAAFAB6D87170558D37A36F910EF80F7CF49417C5BB954D94035828512E243986580E9952CDF20777F847682B86F6DB7153137AB507005FFA3E75725E5ADCFA18B533D2B85FF18DD3B672DA8B482549A9B22317552CD9B1516AC1F6A9868A20A60A091418A5484C65F790F475DAFC6A4B447350801300292594DDA0F9E05C0D10282E93402A2C69C851D5A31BDB6CAF7675AA9B9025822936CBDEF5C77752ED04BE54521C8F302D88DCDDFF000A2975A7071F56590500BB4BE26FF06737D9EF8615A63DE3C568CB85DE2BED30E2C93437CB1528BACB504620E54326D74556CDB22EADD6EB19D998ACF674064F380AA4A7B59ACD6C07003715FD1C2AA0C9F8804738B32ADFC5B415ADB9F20C72B6F1662750D95B8F2F632F149CCA3E3E128CE5AA0A7CCC60235C6985AFAEF0AC4F3BF2C9262D3A6002004B9DEA3425BEA0EE43936EBB74EC57022D8E83E06C8723D1A105318F036902F1A91813F1D51D3D673D02B22F3908987D387C22BB72B1D6AA2AFB565FF1431F0047AF7044CBFD385C57D1ACDC336787D401D451B8B7CCA5644DBF0041F4B02BC47E1DB42DE33310BD7942E6DB9F14ACF40072AD9D86DDF554CDF2D8CFE2FB210003C81FFA6CF9AF7659C8C0F72F45A39EF30F854F52064B31E69DCB8978E343B2E7D9AF81C27DCF90B87EBD2AD691B938C67CAE18D002612BCFDF6107BD6C0700 -smlen = 665 -sm = 500A21F1A3B808B6D08826350D13F79F44AE002A124BC5579F445986EA90F46C9D019CE8C6002FB1B2C124F5D805C3BE8E75E120B3B9445C017BCD6059EDAFEA6322E77ED573950AB1A08E00FC984733C0C3101682C251983D619D71A5E2014451D6F59792A3D50BB37DF9E36C657A9D3B01C9DB102BAA5B715EAEF86D800B996E14AF7201AE59D6B2E022EAA7D2CA66DE67C86B016ECE00006D474C680B0DC41A9CC7E32D5B3480FC160057EBC39482D15A1D65DCC459187DD568E8DB002699EAA8F0CE5EA6546C80BC6ECA7B55DDEC015CCE6E1B45E378B746BA54ACAEEC6542F5C600DF386CE8EEC5076F5A2BFC17E62316DA64B201791959945D07D9CF63AA8EF9DB95ECED4767000181CBBD3D960B684CB78F47EF5057530555285C5923AA3637D0A7227FC3B3737C0303D2B7CF5EADAEC8AA50E852AD9761777EEA670131899F519321260016091AD12762030998114C84F84080E7EEBB47D248980FAC9D28F1ABB6DBAB3DD59A5CFD2C7CFF7F308372874DD5447C7B02E30165501C0C673128E4C543A414222BDF47E7F4E8DCA757B0F4A3281C0D10C4F02AB52AAF5B9A715E012607BA310947A60A5F62D6B8CFA96386D27CFA709189202421C078934AA2D955468E550AD4D0D4ACDD98B168A9568E232192E92789830317FBC959087FFFE353B6C168F3EFBE7164444F1D6CBA5246E31658C65440A841DBA78257E78502843EC1A6E9710229C8EEB85D6CDDC7D543285624AA1F756A5DD4F1A5D4FA52DB8C5C34880ED448FBB6D254509FBEEA0FA022F276B6A66BEF7ABFEA6049FF74291BABE781F718683397077B29FA9E2B46BC6B09251E587CC5B182195DD4060CC4A319BFBE251A5B660A739DFE5D0E5B93F3CB7E440194F1C8BDA922CB1A3EE3D27EDFD61C1D31A7F4534E84889EC83B51F1641892766434 - -count = 10 -seed = 98DDA6B97E89A479D5EE214E660DD6B5D8F6CC638A1CD4F462A0EC545F5B0B0A1A403AADF566F7B1C0C5FFCA29B36FCB -mlen = 363 -msg = 4CCA95CB9F254C2EAA7DCFFEF662EE03320D5FC626A6484304BF62FC20F341FBE26E1537D7BD20E95440F7CC95EE84E1297C807A0BC9006DFCD5C22A5C1FC0865F5D70E5D63AD677FFFDEA52BF85D1A4F159F7ED16A745B4D971B620048B5F518EB2DC672CA35022578059E1ADAD7C07FE910A5D566B8321D9A12F34C250BE35CE964DDDEA23C90EA77C9C1BBE3532FEEFDA3637157786EC7D37775AE5CB0BB92EAB45A0FB1E833E8A6F3D06B85946E31A79B64A02B31FA640ED514A85882C89F693A06354DFDDB0B5E23E7792134C69C1D3908882DF3A7694A05B241B87FB2DBD1A4D9F26943B69F3CDF730301663089D1EBFC23299DA21300F735CEDF7B109F3E0BBE273776E6AAFA7054A6CD9682B967EB7903DE549E9558E62DCF3AC444DD7042FEA362EFB555BB97FB464AD7FAEABA3197C14A6740477DB50CE3FB8B762F48F880381D510FCC836E5880B48F08BD6333202E838AB73F2E106CFBFB218AAB802DA8A00F13F78FFB70C -pk = 3A08B58A901AEEBB7AE011FADBD44AA73B9C6398C1F20336C261C42C420D2B4EB43B5FC8F09B64C82B0291EF462E0794C81C4612961E9A040748CC0FF33408000A8E163462D16786B1E2D1A3CE7A8BD7C70B260D51BD47B263EF3A8F9EBFC20C6AFD18619324DAE928F542B8834A7AC8E68B9EA6DA7600EEF4C8256D2FF20400 -sk = 3A08B58A901AEEBB7AE011FADBD44AA73B9C6398C1F20336C261C42C420D2B4EB43B5FC8F09B64C82B0291EF462E0794C81C4612961E9A040748CC0FF33408000A8E163462D16786B1E2D1A3CE7A8BD7C70B260D51BD47B263EF3A8F9EBFC20C6AFD18619324DAE928F542B8834A7AC8E68B9EA6DA7600EEF4C8256D2FF2040002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E172728529FBDFDAF8964ED1EF08E4BB150535FCC7537028BD51A1E345C01DD12BAAFA82B272FBC26A0FB72357C5FEDC7FDC8F41865C777FE41A0E19D263A9EEB8341BCB540CB24F08C6252CA86850E7D18070EFB556206B22000000000000000050BED70192D9FE333AB2657EE7DEDC8C06AE764C6AEE8F6BE7BF09A9DF7A3F8ED37114455CADC885B0360975333686DE2722461216BB24846DEEACC8EAFA258EC7C9E1EC5B1D1B07E4E3A359A7D332C626A2E561F435473ADEF8FFFFFFFFFFFFFF904847D27775973004CB3150A0B111F594AE6AE62D6ACDBF782C0A86F0A9C97520A5FC60A30E67F046F9FDD5D4BE0AFAABDCBF905E8C6A5F5AB70100000000000000000000000000000000000000000000000000000000000000000000000000001F4944EE85F46A36227FA677CB6CCA31080E2F7D7FB06E5FFB465F5B6EAB1062F4B64045794CF26030F3D9554B8BFF2EFF2D313E65614D904E32030000000000000000000000000000000000000000000000000000000000000000000000000000253A8F12DC2FEE2968C77244E5871585A7FCEF9A1F486762F1E2AEA80ACFFA31BC5D432CE2D27EBD849A747B5FD2E85BEFAFA4E39403DA30A1A683AD18BB18004B9381B8ABC13728D81F745598F0F76D4812576268B27D479A378597D172D7ABCF3F8A0687FA4DC1C0E9430057CF2E05CC16093140365A7A1E5FA02A79FC1C00089FACF149A5F336190704138FA44A4D4D4ADF8B59D9F886DBE249A89DE0A283A7F4DE827A79EA852CDAB5CC6ED577CDE2793FD542817F11C47C39FFA25E0500655B9BD32CD6A1FBBD21C0D8C03C553440C80025E57A48BA9F667CC33249DCCEC6ED545BB93603A251A35442CD0511915B949CBDEC6D9D0610FF2A216FB618004A84112CC978930336CD66B13AA4300D3BE66F74C3D3AAA2C152013E11DA0AD1D99F2FD6F144B69A5F924AFFB5570E66187E4D24D3DC3F6234C47DDEF38C1100C270CE3899BFF48314401226A5EFD336EE8F3820A2620FF9CC09D6F9A004C18118BF6C0AC07DE1687B794E956CAB2D7C629194F033D68ABEAF0B2FE107261800FE163847372873A634B97CD2B79D425BB9E09E5EBBFA53A8ECC7B52E8871F0CD6B07223B7F1C5A1E02A0BB3D580C71983AAC9BE67DD091FBC906D2DBA0D11A00960A0050026D5CA3B9CE0018C2F631EB3E3B6F1B78D9874722F0590637AF53F352E380DA78FBFF973DD6E54F4DDF99897D15D08126FC578555E5A02C73900F0058F91486F2110F37109EA10B38F13F47EB1B731DB16C9883A4B41F52F78A5C1794DE2BEFAA3F684408EC04E79289EDB66AB553BC95F70D370B29C1FC218618002E3BDA29FA16FEC13C757DD86224E76AD5482B4AAAF7FE67163F39D1181378D583F44E22CE07F99101323697F2549A9BE8FF5F7931DF70E866A4FDD82FB51100CB63A3D5A497CBC24B8B28FDAEBF165A6A19FD619E419558B0D51DF458ACA6E98C6DBC63F21C93F0AF443D98B802A16BE7EB98BC8EBC5D3EE7FA5F7DD2410600B98C3577BE808E3E695A07A754EEEA682BECE0EE378CD6863CB9FDB69C5CA0120EC8B781F595012D378145E93254678FCD14DFB88DFF1FDBB0A9097EDCDE0500DE7B4C75FFCB54135062F6F5EB6113B4069175A08795DF6DE1E20F7E1593F270F39FBCF38C422477997C169983A028A3CCA2FBCD86210F6E7828E86A4CEB1F00C408950B96A9E0DF76C2A6DC38646218469E1B767E3B2C3B14C312A4E5478D8CCEF71131B585FF79FCE927C4DA4549ACFAD443ABE59EB048C5B461B525A70000 -smlen = 698 -sm = 598E12478755F04053D91A32CDAA28A679DD017EDEBFA3C4782100E153851193AB41D5678C001E5F35383C332C66A8DEDC9FC02150A36C7A018B43038B752AD1CC711B7931A6FDC2E212DF0184F2F106A01426791AD03C8526046D5B409800ACEA34355C0BEF3C87F568852FB7B9BF3C4201AAEC5F0F94A522617D59FDE14E7828BC47E00067578924373BA48CFFC23EE9377AA94B1937008C9BFDDEBB48041519F33298D95377006EAB008862AFE515799AAA7DE0066D741C0651D1D8017FE3350F8D3FAFB842F378514AB59D43B44D01ACF4E1C2AA6051B7A15747D4B4DD29F7E633017EE6CD42122AC0FA41F6C302C96998B03F2C0045FB66EEC71BF8C7D2F41AAB6DEFBE4E9C3B0101D5A9ED7C0B86C2D874AD969517AFD3714B29E63F71FBF1A3D4A150136409249804036C546B1A90730D847AC57955F7EB1582A8AB01BD2733CD92A44E1ADC3546E110C6024CCA95CB9F254C2EAA7DCFFEF662EE03320D5FC626A6484304BF62FC20F341FBE26E1537D7BD20E95440F7CC95EE84E1297C807A0BC9006DFCD5C22A5C1FC0865F5D70E5D63AD677FFFDEA52BF85D1A4F159F7ED16A745B4D971B620048B5F518EB2DC672CA35022578059E1ADAD7C07FE910A5D566B8321D9A12F34C250BE35CE964DDDEA23C90EA77C9C1BBE3532FEEFDA3637157786EC7D37775AE5CB0BB92EAB45A0FB1E833E8A6F3D06B85946E31A79B64A02B31FA640ED514A85882C89F693A06354DFDDB0B5E23E7792134C69C1D3908882DF3A7694A05B241B87FB2DBD1A4D9F26943B69F3CDF730301663089D1EBFC23299DA21300F735CEDF7B109F3E0BBE273776E6AAFA7054A6CD9682B967EB7903DE549E9558E62DCF3AC444DD7042FEA362EFB555BB97FB464AD7FAEABA3197C14A6740477DB50CE3FB8B762F48F880381D510FCC836E5880B48F08BD6333202E838AB73F2E106CFBFB218AAB802DA8A00F13F78FFB70C - -count = 11 -seed = D34A0AAD27ECAD31A5E08E9A2D7901A9B85F864D9B1B46F40CDCA0B3615B2CBA04EF82AD7BD8CF627C3E861477030BE2 -mlen = 396 -msg = 5C4B2E1A344DA1418B0F4BE3FD99505FC30F2A1E5B696E943BEE2451D7B268F722E04F8E00FDD9E1A470F8C977A6D45A5F621B8815E352FA14F64977D1FA08082A48AF495719EA6AC1C0B3D898603B4CF7EC88E68DD7190884382896D953D612CC21ABECFB01A04A1BB1BBE8986D34625756396CCD84BD1A6B5454DDA98824CD4844D98F356AB485EEB19F9196ABB1C3088C0C3C5846C88760B696D91A232D6F4CFFC85BFF33DE1A3433A27A209A461FCF37F2289F98BEA7CCF183DB1FC42A7EDF958E7913F8711DC375E43F09BE7C7A2C2B1318AE2A9CF5988FBC2CE0735A2CD9FB6C8496C34406C538C01BD494193240BFF947FED47B7CCE99A1747973F1FAA5223AC564BBA0CA8973D1310B5BFA1452CACE9110BC22A8D4080A8BAAA8ADFA3CFB6685679B648484E3A43F9B1B2531949BBB8FAE1846F6D45D9272FC2CAA2913B5D9F8D322E9B18A685122D74634C60730C101578BEF2480711FEFFE02123E76D6C846559E2EA99A98923EF095630102A5573EF027E0AB6E52555A9EDE0D15A73C8B2FEF87CA6FD9F903F0 -pk = C23D4F837F2B3EC5205107362FF1319FE2322030148DDCDBB6397BD334D20FB83494B447D50FDB22EB9B8D0E276A3CD6AC762414AABEB637BE78F3C514691300511D48218C0F656248FBF72D026BF376B142720498181C81E70CF7AEFE99446A63FEFCC64AC194AE65FC4496280D0FC84AC9C34C41166742FADFDFCC45D91400 -sk = C23D4F837F2B3EC5205107362FF1319FE2322030148DDCDBB6397BD334D20FB83494B447D50FDB22EB9B8D0E276A3CD6AC762414AABEB637BE78F3C514691300511D48218C0F656248FBF72D026BF376B142720498181C81E70CF7AEFE99446A63FEFCC64AC194AE65FC4496280D0FC84AC9C34C41166742FADFDFCC45D9140002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ABDC46F358B172CB3721FCBCAEC3FA2414D559561EAE16994088C991CA76B64742B64CAF32F4235597F93CE4536B34259D683F62C7F94A4F6307BB5834753A7A8A7308E4635A484D0C7F756C81FBA1F7DC9555BB52F36A7AE60800000000000000A07E108E1D3EBA58A210F8FBCD5806D21727598C8D39BEB8B29128F5DC140BB3F198BFC0944585919508434C20E58B848658B559A16E894DAA6795A1266BD056714733D58B95FBCF764174A675DEFF946E71526417CCDD6747E3FFFFFFFFFFFFFFC8A12219704629B30DF267BCD3E176DA7ECA7B24F65C5D3F7C0EB4DF11CD7DE9DBB9EF0F101A6F4091062F00A88794A74D98D3AC0DDC0E50DEC10000000000000000000000000000000000000000000000000000000000000000000000000000004BBAC5CBA80A8282F9CDEB66B77F7535DB31E7EDD25C2D8F96F6329981E33A98C517F10DE78D4B60E5CFBE405E374D351E927C286DB68858666E010000000000000000000000000000000000000000000000000000000000000000000000000000BF719DE3C13368C49BBD1057611D595CADBBA47CAFE589B6ED5C84D80DFC10DAE52643F40DBCD086469947CD18A3BD4F9D6A28236E57C083AAB26D129FBA1F0089CCE4F3631B0C2FB16E5D28E66A88FB4A707C11C6F87EC39825A1EEFF655C0E835EAA4C71C7C5063853DE42EEE22D1F845F87C4D5FEDDC6E49187A5C75C230096826BF3B7FBE121F018300787BDA4BF2701959BEA6747822F8268E8EF1DC43C9D9963D8D7B0A4F2A84F50412AE332CDE21D9DD727E0801693D6D740FCE7180003DCB3A297FDFDAF92B55FE082A11898D6C568212E150100F48A2B9DBD75ADDAD4D897A1B735FC121BD4CAC8631BEFA66610E3CD43655D31464019EC33DB070023F4459C4ADE2361C7F309DD4B234A3C972E0BD89797E51AE1AAF920B4E9B2D6E8FF39E6BCAA45D67D31BEB0DF55CC7D48F85B7D42D1154F3718C9F9DBF11D0052B871B0DDDD236DA5104BD64DFAF4D6A1317BFB251431440AF7FF7B8A19995BAA4517E3B08F117AF29413859544C3B995469C6ED7FF091B70939386D89C05003A1C5398825CEA58F20DFB517D8EA008D18282EA05FD061D13F5130D2C88E233D5DD6AE90D110B765D4485B5B8636137376EF16F8DC4C24E4533010BDB521B00AB6659FD0E23C4EF9CCE876AC7DDE1C8B11117A75B89C343F75E56A3AAFF660C1BA06EE982C3FC23192DE677EC5C898A78E6E7C12BE3DAFA5072CBCF63432200A2DF1D1D8233F087B3307E9E57553546773C04CE692FE146E271C2A0D6B6B054F65E980DBA95617661129768B6997FD4495C339B7736A48C0DB754BD9F100200D5DC688E684FE8837CF60F8BD5CFBB5CE36A87CEC1D1B59E1BD30673FE4913B05DF62343CEF0A8F439B8F157476D88C918F515BA50F6515D0385E25408611C002D290F673EA79F1138DBAE33C2968A07262A5F813C18B232CF16EA5DF7CAB70EFCAD9D4F92E1D5B16A000346E4D231333E163270B5AE3450D8F0F78029051A00BDB9DE46A0EA2DA1B1F09E988542BBBE7A988941380FD29966369B24E61E98E3F1E67EF61CB718ED96025063692D90D9B0A7500D2F3CD83A86E5786399D2160058AF9CF14FDC6DC62EBE9D93CB9E431776F343902B7ED735B879C328B2C3E5493690927AE215C450733738980DA0CAAD1BAFA6A5D8C0F1B5E3934B937CD90E00C7469E7C4FBA23B1D753D51E5D11965C390CA61EF2B5376E491B891366B3F9F87B69601B782F660D331F8C1E47B4B0C16FD8951EEB20A24878D1817CA7B41A00 -smlen = 731 -sm = DE38EC0EBDAB6B6C1DACFD76568E57E1C81C00F1290CF78979D774E186F50D56673E001B3B00AD7D5D6971114CA5879823D1C5FEC76630F400AF3B97474D6B2E864578FEF4B3EA14B332C1017DA446C7AAE52B9A0144F05109D36A7D62F50183CDFF757685324823D3F538FEFACA9D7032014CB94C171EE91F77A303AE0B53929FE5AFDB01B648AF8C489A459F37A3519640D22E15ADF6018B3BF60FF7A9BFD358107999D25083F4C8F200BBFD2ACF86F61358A8C61D25A56AD51368BB0166D8C131D50C52A69E7F835321880B9421AE011F9C2236F610527FE0A1D444CB6678C52BCE003496C7E446200B403419DCAAEE18C1B5853800F56C39EB25EEA43400542BE193A2622F142F00005791D417BA81C227E168B5D9A2C75FB91EE02F0D055B79EA66582CDE69E440D30203CD0226C6A49ED87F4D3D0DD509503FA5EC1300C2AA90566AC486853E6CA293BF4B045C4B2E1A344DA1418B0F4BE3FD99505FC30F2A1E5B696E943BEE2451D7B268F722E04F8E00FDD9E1A470F8C977A6D45A5F621B8815E352FA14F64977D1FA08082A48AF495719EA6AC1C0B3D898603B4CF7EC88E68DD7190884382896D953D612CC21ABECFB01A04A1BB1BBE8986D34625756396CCD84BD1A6B5454DDA98824CD4844D98F356AB485EEB19F9196ABB1C3088C0C3C5846C88760B696D91A232D6F4CFFC85BFF33DE1A3433A27A209A461FCF37F2289F98BEA7CCF183DB1FC42A7EDF958E7913F8711DC375E43F09BE7C7A2C2B1318AE2A9CF5988FBC2CE0735A2CD9FB6C8496C34406C538C01BD494193240BFF947FED47B7CCE99A1747973F1FAA5223AC564BBA0CA8973D1310B5BFA1452CACE9110BC22A8D4080A8BAAA8ADFA3CFB6685679B648484E3A43F9B1B2531949BBB8FAE1846F6D45D9272FC2CAA2913B5D9F8D322E9B18A685122D74634C60730C101578BEF2480711FEFFE02123E76D6C846559E2EA99A98923EF095630102A5573EF027E0AB6E52555A9EDE0D15A73C8B2FEF87CA6FD9F903F0 - -count = 12 -seed = 4FDA9FB6929E3F391901D69FA0AA2F25A9657D249A620F1B9E305A5965676BA76794CAD3355EB632579C3958CA7D443D -mlen = 429 -msg = 49755A7B1A7CDC5C9BDF5149968061D3C95EE67BFBAF02750C45094303A9D9CD23A08F19B9C768ADC63FFD1527186D09CA4E0356BB882E263BF015CBE3716C05B31A69DDDB790BA82C341AC9B6BE68A81B8BEF8D882304BAF0020D761A0DB04412033DC369961A5213B04E81736A580F1162780599CC029E262D67F31B2773AFB457A1ADAAA292163144F17DE384234F3303111FCD89BCB30333C6C6486F775ED099043C34E6C86450B650F1A02D03781B1D20691B767D166DADF1DCC4D8604D976EFDC9168373A7316DDA9B9FB02A4A321218D9F54E287B7167A08BC0153843BD6355AEA1310824DD5D5EC458BE694AF176119D9E588A29C650FF5500293659EA478B39A62149F819CDB7E7CB32E1D7B1284F159E2AB1B1EA41AF4D0AC94FF3111FC1CCD818F9B2CC7A259701405FDF6A51D2D3EF62789297BD16A659F14968EF902C4A23DA409BF13A4913467B5C991854B2CA6CC006D3F4197A6AA58BD5DD95C36928DA9583332C3FB134FA3890FE7E299F1C17205366C4F4230724C43E4803912E72B816658BBB1B63780865A1F66A2A49B96E93711B1BE97B827D12173402828B1A065B94310D5BD6098D -pk = E3DD4AAC88D86BAAFAAF8E306BC242450543FC7BA4ED87B503BBE47EB6903A4232D3A78A8B469184F7D8C4F5A115C3AFA6189CF129F309E4BB3167FDFDC41500DC06F60DABC89016C7BEE867A2C700A2044E2A5861B2EE05FBBFC7FB9024E5149FE0B5D8EC1DFFBEE2CF693EF6DF63ECE14D8E3396416D146AB3AEE039130300 -sk = E3DD4AAC88D86BAAFAAF8E306BC242450543FC7BA4ED87B503BBE47EB6903A4232D3A78A8B469184F7D8C4F5A115C3AFA6189CF129F309E4BB3167FDFDC41500DC06F60DABC89016C7BEE867A2C700A2044E2A5861B2EE05FBBFC7FB9024E5149FE0B5D8EC1DFFBEE2CF693EF6DF63ECE14D8E3396416D146AB3AEE039130300020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002DDC963632518D1822E91B82552D067B805E77CDB39F3EE6D05AF601328A0C3A368013E59E61C886FC14497BAEF42463C68AA75DC50EC7CE203E6F042B7209C4DECD045B4638C2B6A7D1F3414EC12C2CB6329777758010C6E80D000000000000004050A725B384CEE8004896DB6329F6D62D7AB4C9EDEEF80D224EEE1CA22EC0841FA8357F8EC4F6FC80D4C4F0CE272C06661BB14BF43F3D1283A7E3ED8D892BF51F6C69AA32E0430B8E8455756A0D0B7837AA60481859DFD879E9FFFFFFFFFFFFFF201717C514D3FEB88FAE22163CBB65926AC3A22F7CE419B4A567BEFE4D0714B7C8CA2DE5AE653C36EE05B55E5421A9637F7E88026EF4C24DD714FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3256E1F88ACD80412BF2849DD4189B592BCCF9E16024584FA374B542A3B0BCFB598717BF3204EDEDD1D22D2BCE349010096FCE3FECECD3133A20200000000000000000000000000000000000000000000000000000000000000000000000000002C033FE6378330B42E1985AC7E187A1ED81B846DDC336366B685FADFD8DE458DEA0BC9610D8A37177666F5AB381B3F7B86DBA3A4C55B7E13199AA9ED13B52200D034DC485BC7B1D4345842766FE1B603A7F8B3E696590DF1F2DC32AC90011A6BC26EDB583348C0F4A71023E96886D31B4BA5526E3C895093D1BC22A8155B070006DDB9B15AF3FC6860B4679553D8A9072B0E3A7207D6200D9E1FFCABD1EEF128189749C6EEB13E829319B19B0FD58ADC5F4148A856613E49BA7F679B90B81200E776A9E340CA2B913CE2AAA3D21BB1FA4CD6D43470DFCEAF620B1D042238560899806045B61B66360D9E34A1AF6AD2B022F3B0836C0E7254D43630C91EDE1100CBA735550BBA70A021BE5AEAE72DB20CC14FE031A473329CED080B7603E50BA3CD1B60E37914E7A163F6D8BA0463A3B5C878F448D2042AD8DE6D37DA6E170B0019091EF1F1FB06186BD7751A64B4080C44D0B78230C172D1E992764C7505667ED0DE575A755DA607BBFB201F18E1816615D820DD7F53CCE205F68BDD11EE2300440925335EF38190BC5A603311716221BE2ABC2CFB3DA75223DEE53425937BB51EC84136C2BF983B1703F024666D98BF4018345B9E4F32EC131A6B7D92360400D24F40978B10CC0265E8FB858E3E2D82EC423425D04952F5FD80DBC92791128448C70735765408517E11008121B6A248DE0FF378C2E1883006308C086A8B0F0022B0F7FC407CA205A99DCF114578B97175848CADF02243443BA194797024107EF53AC21D3BD7F81C7A6887CCCCBEEE03F4EA9BE5B62EE02E1557BF43BA0A060000F70EDDCA719845F15FA3614F370F3684FE453CDE48BD535BA4ED88591CCA973EA4D56541CC91903C6420D16CAD1CD5DEB0884D1772E5828CF94E3B9A2B000010CDDE668E8B5B0FE713BAF570C8724EA511132F04C571731AAE3E5AE7BC274CAEF35253AF705717F16BCE41702A4DB44BE58C07AAEC3126C2A69A74980C14008B28CD23E6401FCEC8871EC2047C09170D8BB6D2E8781426FD4108518797FFC4BDC91CAF04947DF21442E81644D14AB9E7C7C93BC34F81BA410F04EC90A41B00119CAEE75727772AE928111031317A0FE268C53759C8D498E10B1727FE8B292B132AD5C4227C3A6696270BDA5B86040585D7D1E2CF0A5A28349266DA58F5060000FD42DA0DBE4734ECD0C9A3C2B8824CC80AD37E7C11890F8A0431579896D7E92FBCEAA52F6E57D3F7FAD3EE2727DB4910B06A013F8AEE9B159BDBF6C3282000 -smlen = 764 -sm = D2854AB237A1145D0608CB0CFD6494F2CFD601727658DF10085B913A5C73B6475B2292F0680111109E8480AEC26551FA0C27891268EC3152003218284AD308A66BADA8AC31BF8665D6A77E010A7B30F22E6E58EFBE4E551B4130BC701F4701C54BD502687B21CB38CE4E7DBCCEE9DDFC7F00745DAAFE6B5A2435BA9764FF3AEB1D6E0DB20050F3CA8B88367B22DFCCEE21A6B8AF0EDEF701DA4FE13A613907CE177973F2C4960E15660E0180AE4C5FFD407A4451A8B286D5E7863D7D9300630238A7CC499DDC299B0806A4DFE12FAB9E01B2A3678DF16F06AA3E9F638A4A1AE0EA3ED5016689E2D7EA0FBE833B1546A71EDD08D5452B0091E291ED480896EDFE50D55DF29AB87632F70001C56AB6B8B7508E23554A97DEEE58A2FC51CCFED9BD55F0D30024C5B716A34BF2030319AC4133945F06EFB844FFF6C3C30EBEC80B011207D14C52D276B8CFF81E88AD4A0449755A7B1A7CDC5C9BDF5149968061D3C95EE67BFBAF02750C45094303A9D9CD23A08F19B9C768ADC63FFD1527186D09CA4E0356BB882E263BF015CBE3716C05B31A69DDDB790BA82C341AC9B6BE68A81B8BEF8D882304BAF0020D761A0DB04412033DC369961A5213B04E81736A580F1162780599CC029E262D67F31B2773AFB457A1ADAAA292163144F17DE384234F3303111FCD89BCB30333C6C6486F775ED099043C34E6C86450B650F1A02D03781B1D20691B767D166DADF1DCC4D8604D976EFDC9168373A7316DDA9B9FB02A4A321218D9F54E287B7167A08BC0153843BD6355AEA1310824DD5D5EC458BE694AF176119D9E588A29C650FF5500293659EA478B39A62149F819CDB7E7CB32E1D7B1284F159E2AB1B1EA41AF4D0AC94FF3111FC1CCD818F9B2CC7A259701405FDF6A51D2D3EF62789297BD16A659F14968EF902C4A23DA409BF13A4913467B5C991854B2CA6CC006D3F4197A6AA58BD5DD95C36928DA9583332C3FB134FA3890FE7E299F1C17205366C4F4230724C43E4803912E72B816658BBB1B63780865A1F66A2A49B96E93711B1BE97B827D12173402828B1A065B94310D5BD6098D - -count = 13 -seed = B0E6A23FAB10A7A333E3720BE00D31507917F39C5EFE1C98CA18BEB5C3101FB4479B478A1558C4C00398C55C9822FC44 -mlen = 462 -msg = 439529DF1864297E33956AFEE00A60099B658A67830A6A6ABDDC329E87831D9F9B647917FEDF1AE182A40402143285516FCAB83F447354C72FAE81AC26E7005C2AA561763C152E66BD80F14565F47DEFA440DBB491E7994AB9FE35995D5FBB3800CA030B43DF611141637A5246AB9D9CAC02EFE14AF60736B6BDB2BABB97CF21E831E5D04D41C00F090B154977900EFADD3A9313389A3F84CB3AC38E8B57B70A43DD08A8243F8154013FD5CF29DE5A8DF0B197C12B17E0610FCFE3625CC94067E01E23D23A243AD1C1F805CC50E1447D1DF93C25B8D76396BB7199E64129522462C5FC8B30C132D4EE9E0BF6F52961FCE7ECF650647E7064AA5A6574649A323E144D7C5491DE4C0A1A76D08F93F87A2FC7F6955FEF86991E62E2CB42908E83B0C0A8BC180B7453CED293F1E20F300431EC1D395E8A537F0BC36A673D491F14381DEA90D8F176D06031B0A7AFB40EA8F76D37FA82E2572B9799A5FC7CF4C49BC20AD78EFA8CD989A84D72ED680AC3C0F64155C56ACBFD7C7D628B418A489F961357F77BD62204ADB079DD3106485A37FEE535C9CF82E832D8AADCBF686976B806B02AE733DB46DB0BF162E973931C3E338CC86DB38C66262D1B2EBC7691B8281E0B20BF36305FBA996D20ECFDC695 -pk = B6ADCE342D2017A36DAA6C1A6A38B19106C938B111B2F7F607C05FBB5557CDD59F25E9057AD64B0CC9A17AB398C9EEF77DFD966FBD05D058A88A5FDB10C30400B36C5568A1C5E6E71521C12A1794FE8C17E47C27C6FC9D69AF1150948B0A309C83347D6AFC0E0A0E01159B1C322539559EA0ED3222ED48259AB753728EC10B00 -sk = B6ADCE342D2017A36DAA6C1A6A38B19106C938B111B2F7F607C05FBB5557CDD59F25E9057AD64B0CC9A17AB398C9EEF77DFD966FBD05D058A88A5FDB10C30400B36C5568A1C5E6E71521C12A1794FE8C17E47C27C6FC9D69AF1150948B0A309C83347D6AFC0E0A0E01159B1C322539559EA0ED3222ED48259AB753728EC10B00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005A671D33969A1DD3F4CAACFF7B0DD98551721831BBCAEBB3EEB71B0A8C5B0467806A071BBC1C6C1DD5753DB9D85218E619A6C722EE59BAEEAF1DE6FC3C8689C62A0D6C16B79C3889CB66956163FF1F9BCEABBD37C6AF4364890600000000000000D38EBFE0FDDB0FDFB28FD39C356E280AB3757747DF188ADB1BB5442D2B5811FEDA7BF183CB9E4E76669E7F928E97C77D84A68F1C5956F45488DFA61A4E01E63AEABBD24AE4243E4470559DC71C8D21A536290EA8E7FE2B5325F1FFFFFFFFFFFFFF3D18129CD9E910A267999A6A7BBC3C83EBFA5B78A32C44E96735A3CA7B55E4B5FD4566AE00ACDF5DE5BC5A73C997637C22A94A6BD283A303A805FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2AFA705BB520AE82DCF533AF8A50BC1223D62E882D580CEE968432F09A1BCF336F82547B29F3F2DE2E91092839D697751E60D6C21EE6E82B6E102000000000000000000000000000000000000000000000000000000000000000000000000000069A1048724935BDE089B8ACA902AD8694969A009030D15AC3C210DA06B487E2B19C1922C5C3948B539A25967B97EB294262FAD0EB464228D2C8A99D257C00100BC21AFDEE6D73E1F443578F1189E8E05EC3A3A940D04EA10A307AD792E2C5A32E3F3119BB2F25B59C782B4F4ADF4FB2DA43119E229A6D209FD5963936E28070099540031A2279F3DBBC4B329FAB27D1E9BC2740D9EB0E5E8E4A98DEF6FA4CF657C552A3BF79ED0AFF763AD29A12CF4E2FDC401D83502E667A740F4BFA5E107007E516F4175D741DCFEAFA3F20000C60D5F6861965B7DBEBB41C3126A2157E8F7A7C589F06A2229A69983A75BCA2F8767A2F93F1699F35CD9F3A2BFC80E0316007935EBBAC2167A27C8B4765F5751B9E419C11C05490E36ECAA9F8D22EB74D2408801F0E0D9FD1CBFFA65FD2FCA314091357A902FE3446E13CE6A02CEBBF80C0069E34E48486502F3E30C80DF5E8119D977211631D1C01BEF91D83C5889FC11EAD310E9961071ED3F7557438E0CFB6A2D70E518B8D79F17C0C2919712292C2000AC37755E398E1168D081978643149A3DD198B4220D339A9BE8E98151AD979C6766C09AC55C19811242DA3DE812275F8D0111D10D6D240751EAC7F1ED8C2A0700C6E78DBD632232235DA9E011E42EA457C3C7B25CB46E70E2E5F820F40D053F150E0FD5C4CCB519804E839C938182383BB064CD9268065EBBAC107D81F5AE170036DF0F8C30646945DE25AC26F6639145C9D2B93E52DF07807ED311777045AD87D6DF1ED99EC299FA7E53D1DCB01705DA627353B30BFD1258F2FB26E921731900575BCF60A4A18FF2C5BC079092EF08DFA48A9631329AD9367FF2A0EDF0C75528129AE0246F1C9637E04E7C668110E1944C04E6744949A59FCF5F53DD338D120093E34F5B787CF86FBBFD26C64E495C2BADA6461CC41673C64AFEFE55E1DADB31686CC6B7A9CDD71AF2917A5858347438469A536FCCDA4C9F49FD6279FA6C0F0024894839DCCF80211AB7C47C8C18D35C85D344254DB17EA443AFEBE48AEE67C834722B2813BE15E825DFF70CF933090DBDBE7EFCA0B66DA7CD3CC98954DF17003C1017ADFAACD2D8DEAD19E7D6F6F82D46A61C92C84F5E1B193B6F5E7C2B0FDE1A8BD4CBDE7B30ACA416DB598BA1B67ED9BE03479E34AAB2ECFCA7CFA81F1C002265B320D2AF14A04577C634AE3154EFEE014B88673D2A153AF07C9670C1A3A108E623EC7F2EB35E17E2DC74A951DD0C227D14D26E7664959E469542B4C42200 -smlen = 797 -sm = A61A657A91D5065AD495A97832E4A31E618F00527997047FB60DA77578621CA12A5467348400926B590977266F98EC467116476F9F3C7E2E01ABD8978406A0A7328F7220EC8F58E207F4B0018BFCC2EAB1752A529F49AF3156C1C978C4100162072F4C0538E18D7CB94812651A5B92008F00987BA696D184C7839DB68BFCC631CDB9A26600CAA52866B51E55891273C2730C6E5794CC3F01EE9C3198A57C80D416810DFD70FE296FE61A012C1C618D2786F7FBFC659DC0E99CBA73D663000B01214E0B636897592B371F8F676642AA50014E9BB518F8740628363BCE7E45304FA7F82500F6BAD1FCB7F4498E4CAB8FCD1850DFF5D76B012D990FD80DEAC8BAE8D0376640F11E0A6BAC0101BF8585F27203F79486E4066CB9FFEF436682AC261A040BC9D8731F1306B7823103007EBE4093EDD79DD5FEB9F45D271041B25B4500E5E05BAF8E5D1A53DC6D0449672202439529DF1864297E33956AFEE00A60099B658A67830A6A6ABDDC329E87831D9F9B647917FEDF1AE182A40402143285516FCAB83F447354C72FAE81AC26E7005C2AA561763C152E66BD80F14565F47DEFA440DBB491E7994AB9FE35995D5FBB3800CA030B43DF611141637A5246AB9D9CAC02EFE14AF60736B6BDB2BABB97CF21E831E5D04D41C00F090B154977900EFADD3A9313389A3F84CB3AC38E8B57B70A43DD08A8243F8154013FD5CF29DE5A8DF0B197C12B17E0610FCFE3625CC94067E01E23D23A243AD1C1F805CC50E1447D1DF93C25B8D76396BB7199E64129522462C5FC8B30C132D4EE9E0BF6F52961FCE7ECF650647E7064AA5A6574649A323E144D7C5491DE4C0A1A76D08F93F87A2FC7F6955FEF86991E62E2CB42908E83B0C0A8BC180B7453CED293F1E20F300431EC1D395E8A537F0BC36A673D491F14381DEA90D8F176D06031B0A7AFB40EA8F76D37FA82E2572B9799A5FC7CF4C49BC20AD78EFA8CD989A84D72ED680AC3C0F64155C56ACBFD7C7D628B418A489F961357F77BD62204ADB079DD3106485A37FEE535C9CF82E832D8AADCBF686976B806B02AE733DB46DB0BF162E973931C3E338CC86DB38C66262D1B2EBC7691B8281E0B20BF36305FBA996D20ECFDC695 - -count = 14 -seed = 0A98A2BD2B9FF42CFC18D3396BAD052E1D0F3372854DA69A318B142F7A1AAC609C3861263BD8FB0549DA7266784DB8B4 -mlen = 495 -msg = 8CB18850E27D8416B88A9A71F4A66BDF447814DB6C82098C371B53F61600EF5DFD88E4FB34200207C3F6F55166AF4878D38FCA7E2DC18FE662E3EA491B58A86246CAE16090FB7ADA53B9A67B3D0E3787D3323EA921274C60CFFB19A889BCF0300FE10E242AAE025F374DD83FBE9D007C8B9D9D75574C74146331DDEC6F0E49C10DBAF15654897E33E2B4780DBA484224AA6FAC79015D5792FAA2D532BB7D239B11D91420B98690B1FBDE9632223927E0804BFB284368A426C414C3DB8EA82F0D246413861475ED2DCA9E80FB4F3C34FEF7528069AE1975AFC52AC5AD2CDBCA1459E140F655556093210D7905A1A1E6CEEAEF0194A0B2EAB2C1EE853484E715D2A1DB551FDC620D5331164C74CA4848B61D408D2F2A943FA09EFEB63D524691C99DCC0B22CC61B98E6FB8039E5E0B2D7DE2CAAA900A44184BD56C9F02141A3AE8AFC661E3E898ECD3004FDB0704272BA780CD5DE35153B6FE223843024273642DCF8E4B58BE2AB1F61668680084AA0B75A32E766C8AE5EB30D4E02A12E6798DEA40F80D8DDFAD2041A52922701C689F46F49F84CFC05ECA6D7D4C356D50B6A0BA61966245D45134D6A1F5197540A1C39C36BB0B78831AF3F5156E669FD9213B64E0CF1C5A31E88AE79AD61757EC67B551B9F0A760F646BF81F6B92403A62840CC29FA4F3949B3A9F0A9A4286EE7808A -pk = 16ACC114F7509229E491D320B9CE8097AB5797B34F632195DDB6CBBC9E0123317781BF638739BFD66D3A852E82B4D62350793C1CE46945F44364E0C887F7220043C6D31B6051ABBCE0BB23A6CEEA602A3879206C5CE2D615D21FA6F7D8E8DE7A091346C2C140BC552306179087B8270436664C5F7560B8480B20DB571BD01600 -sk = 16ACC114F7509229E491D320B9CE8097AB5797B34F632195DDB6CBBC9E0123317781BF638739BFD66D3A852E82B4D62350793C1CE46945F44364E0C887F7220043C6D31B6051ABBCE0BB23A6CEEA602A3879206C5CE2D615D21FA6F7D8E8DE7A091346C2C140BC552306179087B8270436664C5F7560B8480B20DB571BD0160002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C4B6AB16D60B9E85EF3BB7BD191DA4C322D0400F5645662760D9C4003E877E677BF7A96DDDAF9D656F6529F1A57091BB57B8710AB28FDACA2ABC333A9FCCC0BC419FC2A89D97B70A298588EF38650950E84523D5611D5421E202000000000000005FC180D91E1F6BFCA68EFD37AAA228DF5D7C100FC830AF06B88A50433652B629C3A6C7E28A4E7D5A277C9FE8CE5C63D48A4186346C2BEAF3FE840BBE4CAC51091CF688C89D67EA482AEB1EFEF769D1FB6BA8D4F6A7DF16458BEEFFFFFFFFFFFFFFF7F81D8F9CF312BF4A4DD924845FE5491A80A08DA9BB293BC9E404D44B75C807E7B2D872575BE13A77900CDAF65FB52CBC4EC59FC9023055ADB0FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30639D9E6EC417C264805BE49604C5B2AD8F1415067883E298DD07C15C4130E416490E05DDF8CADA8AF32FD44FE12AFDFE4C14E6B50F80375A2C030000000000000000000000000000000000000000000000000000000000000000000000000000BB0684403EB66859B4000F1D56A89112793C0833AB524C91909D5DF0EB19DA42BA6F50F5F5003FE5A36667727C7E6422821B5C183E1E53C9D0311AF8BD0A1F00FC00FCE8C5C119D88D01228D30B7C9F15088C2ADE5A84E235519039E839410F15D6E1C633E1CC6C4216B14685567A5E5329453798DD66DB4813BA68B729E1E000BB01E8A26B10A01AD36E19C533BBD98230C26AC513F3B55BE676A8E1A7F15105BD8750E7F594DE7E01E3D425E04C4D2106C23CBB327B344970FA7E5DEB81E00F038D35CC1A7921C38571C5841929F882E1203B0466E23256118FF7178C89921262020B460EAA947FFE29D043170DE4AD00059E4EEDFD3E7CB8B589867F60E00E081C5F5B7A9341019191AAC93F0C90D3AF922B2954A085635EEFA23519CEB2A72C5F71F9BCA6AA12D1EF1D242388B96C2E0696EB252048D57520F74E51403003C82A0A715420880F88F20595C52EBC2CFAD4DABF89CB962BA70D527CEBFE8FA747E12D314170F84D7F1398F3F4B972FD268C05F662EB848D4D56DC5A230240015243AE4C3C60426568D2D69250B4A4946BBADC6E3AE65B246A745DFB0BDBCBB79EDD382D4487C398D9CAE491161B27CB73C6BC130C3C801907FCF7BC8E219001BCE31900E0812C8E927A25FE1DE6CD012ED0E251C5BA76633C5F7526819F04327CDD08E1FF9141CEDA7EFB7AD6F6FE20A212FFAF0B53658CE36ACFD70F81D00DB60DC2DA1FD80266CBD7DFA90BF27E5BB4229350740803F60E149F96155D93D857938CFCB4AD3C5158FD2CC5F2FD2D69CD7E2DB2CC58AF443545E7BF9941A00F3F9E0B1D20A9FB588CEC7E8D170A62FA6A894A1CE8C1143DCEB4E6AD5A471716CBEE39B37A174E8EC5498A302A32261C077215ED8BF24C66AF9667B00AE0A000BC51E12195EDDE3F37FDCDE5B8066B98F60C4B09964267B18BD371201DAA948E65C3B8AD60B91249F399320D54ED6DA09D04763557964399B50CCC1D88E0F00D8D2A172FA702008EC1266474ECFA2ECC73C1957E4876B2A641431C3F0B2359BA2E658AB225102854BC4194F038CF47A64BBA9B27F40ABFFBAD8F8652C470200CCDBAE5936204705E47786F9693EA4E306BFFA51C9378A85B4D84CB814A292B635E1B7CC6D5041877E8E18FAFD0E275D6EDF00BCA6DA8E433A84D84BB30E1B00FB7907F0B7B600F2740C48D1402F2BDB3F80B22F4ABCFC17E843789BBBD668081B747AB2740B6BE5F1AFBDCF76FAC8609D95BC0AD91B1845FEFC97F58DF41B00 -smlen = 830 -sm = 30E8E6D9393BB4DD341CFA43D830E8FFBF990044C4D90CB50C4F69BF9361D66ACEF3E4FD61005A95AD107E9F2445F11C4DF3703B4ABF672900313069DA90B58DC017E4F0E55294A83BEEE4006FAE2E73E06B59E9CA998D74C30CB01C33CD015C015E3AB9BB64C9C3892BE78B5FCC23D6920186359F487AF62786C8A0DCFF06234DF5059E01D2A7E295E4A0C223136A7D975AACEE36F85C014C4F34BC51AB562E8B64E68145C7DAE23EF500DBF9DFD410442998306F7C4FCAFAAD349C2B01D872CB47A942F7334263BC9042468A99E7EB010F78C0DED13B2647AE66B4B32D608B52BE310015F57EA75CCB76351FBEB045C7CF5897D81701E539FA05A2594EECE55CF8548155DC11247901007B2A11F3A16AD63D70C57FD811C33FED547F88F9A495C4CEEC18FE8199B2E5AD0101C118DDD9EEE4FCB03172A011F5A061B1ABEA007059D595CF526E2330FF1AA7E725008CB18850E27D8416B88A9A71F4A66BDF447814DB6C82098C371B53F61600EF5DFD88E4FB34200207C3F6F55166AF4878D38FCA7E2DC18FE662E3EA491B58A86246CAE16090FB7ADA53B9A67B3D0E3787D3323EA921274C60CFFB19A889BCF0300FE10E242AAE025F374DD83FBE9D007C8B9D9D75574C74146331DDEC6F0E49C10DBAF15654897E33E2B4780DBA484224AA6FAC79015D5792FAA2D532BB7D239B11D91420B98690B1FBDE9632223927E0804BFB284368A426C414C3DB8EA82F0D246413861475ED2DCA9E80FB4F3C34FEF7528069AE1975AFC52AC5AD2CDBCA1459E140F655556093210D7905A1A1E6CEEAEF0194A0B2EAB2C1EE853484E715D2A1DB551FDC620D5331164C74CA4848B61D408D2F2A943FA09EFEB63D524691C99DCC0B22CC61B98E6FB8039E5E0B2D7DE2CAAA900A44184BD56C9F02141A3AE8AFC661E3E898ECD3004FDB0704272BA780CD5DE35153B6FE223843024273642DCF8E4B58BE2AB1F61668680084AA0B75A32E766C8AE5EB30D4E02A12E6798DEA40F80D8DDFAD2041A52922701C689F46F49F84CFC05ECA6D7D4C356D50B6A0BA61966245D45134D6A1F5197540A1C39C36BB0B78831AF3F5156E669FD9213B64E0CF1C5A31E88AE79AD61757EC67B551B9F0A760F646BF81F6B92403A62840CC29FA4F3949B3A9F0A9A4286EE7808A - -count = 15 -seed = 9887F1FD854241A301EE0120645CD8E119B43F7BEE11F77A835E9ADF518C3A51CB76D86653FBE73AA716264C146797EE -mlen = 528 -msg = 9B64813C058F07A09A796FD764604EAF58CE144363702896DF0AB5FF26D5DE000D14BB8FD358FF5532D3B909AB62C18AC30F1900F84EBD3F4F18BD532D16C7B3470F0F8BDF72938C916DB18BCF1429DC1635B1C152C5F89A9EDB17116C11815A6C06273A889132923DA908FF39F4940A840D3CB575DC4D637AAFD37968EC61FC4EA04B4C320491A73ECFBDD8E10F1DFE902FCCEF93DD287ED872F67146BB8CA5A6ADCF0350E8BBA7F2F9762C4AA748FCE19748EB17334146C152FD63FAE3DFBB1A2C2B3C78960369551FDAC5D54643BEEAA59C1FEB0C21DBBB19977D848CD82A7AE0005F45956E0FE4700F14FBAA0C12FB8C65A6AEC95C5A5C8E79A6DA9C4E446872575C06AE49A31B82245E1757C7CE84D6D5DF3F642D3434B7E1A15A8B8A9DB460826B6CDCA69022DBF87595B582DDBB90A81E09A13C2AB1C125E4435FF30ABC9C56A00EDFA979F79D9C895E800D2DD6372FAE5FAACD83ADF8A6D55279D52DF547E9BAB39D99076AD7D297371344D35BD584E0FB5932F92FD5183B9250CD180FC645BEF6028C405B0EF35DAF783428173F1F2482AA1363640F66AF0FE8ECACC0DAB84ABD2A1FB53AF44445698CF1DDF4C2EA214DD339BE004E75BF76E95CA5C16981ABA5540689C1C1F1DAF4D0F89D62CCB3496340D61E7D5F5156FD3EDD02EDFEC8FCDD0B231697B0E66F4A3AAF46117532F5EE2CB4D2B3B82B0BEAE0A45A482CE9A976CC99AA82BEB0FE08CB68C4 -pk = BD1C424B5DB5A5C593B8B8652CD7354BFECC87C6A791C267999CB062F29180D93CDD86E1F2424247195987EC4975F73250CAE5567DD9993EABD9F758624B0700F9DBEEE34444A7E5D5D6EEC65D9205DB34A121EFE6AD82D4C2A2D897127D4126FB886F61AAA37137D287EFE40BE0FB71A4DC379A041FAA232797648BAC891B00 -sk = BD1C424B5DB5A5C593B8B8652CD7354BFECC87C6A791C267999CB062F29180D93CDD86E1F2424247195987EC4975F73250CAE5567DD9993EABD9F758624B0700F9DBEEE34444A7E5D5D6EEC65D9205DB34A121EFE6AD82D4C2A2D897127D4126FB886F61AAA37137D287EFE40BE0FB71A4DC379A041FAA232797648BAC891B0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F89AB8DFC4EBC7F43CE0CF4CFD06CACDAD46C2014E248CCF38DBC3236BE5F549353447E10F966CF0E82469E496F80B7F5BC0311448E713D62AEBA5B17E197B25161D309905D3C6059BCB313FFB895E991FF920E5B5AF4726080D00000000000000C90E42E06868DCE88EE717F193012D0FCA792C2CF13330E100B33E7503247F2AC21B41531365C8CFEA1EF64B7F37C4DD0BC27DB05D0D00E408FE8266D912AA190379F42DD1827A9DF2BC3FB589E7106A64E7DF2B01396CC747F6FFFFFFFFFFFFFF7F18CA483332C87B6727227D79959BC584728EB44FCD49E5B027032676B5EB9ADBB5EE956906DD82E63DDD6AE034CE6137ABD746BB5BFE9AED4EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4B2E943369E9F02BD30EF4D28EA80E64F80178D0AE1EB999320283F94E8184A7C099DB34BD71303BA5D7D6890D1EC38B2AF3A8D12E56C959514030000000000000000000000000000000000000000000000000000000000000000000000000000DE912A599A5CB50541569FBCF26ACC7169ED0DDDED538D24739E15DAA900D279A811131C0B72E0F3A5C81BF6747F05A3E23FE1A161E03A40D6F7BB89B061200026E016CA71E5E861F704F5F2A51B884A0FDA4E4745AA50BD777EB8CBC5A5CB328BFCBA64A2EA66B2061F4EFBC5F9CA3FBC4565F21726B13D9D4993CC93322300E82986FB23ABB651C557C9B4427908562F27ED297CB22309FE5A30888BC3011BCB2A960159876E6C530F5E8322A62B582BC24C0218BC0DA84A378358781901006F78032B027770B1B52A5728D62BE0A6F3403953731C03621FB80C8C8D3C02FD2BCFA7F9C0BF7152610A98AA9DB8BC18CDA3D4834B28273F35DFFCA6E53314006C9E4288E8B7D3E488F3149E68CF9A9A07AA443A165176498B7BA1A0B41EA40FADB6D73F818E0AC28DB8B5367008855A3BAECF5D1F85E500D1ECD272F0902300E941A3C7825B93B1E5546E8E94F88ABD1BC9F080240625A64CC5419239DBF8E1048F1EE3377113A631E92A870C368782EFF589EA965687B94D3205E42B7C0D00A95F0392BDAA5A054833FE4FD4FF2E348AEE29A94461027422803B15378A6038B0673F2C7850A71A3553190A5DBDA07D668C56233CCBA44A158B743A59F6010037DE53FE687DE298C375656C722B23E83D2F51F51E0C1E2872A4BFE8619F14B8849F16786AEAB572F006017911CAF5D26961FC5917AB640C52C897962C7C1100D442248906E93994B09468B0FABF2BF5E2B2BFA293DE5818369D1B629E3EEAABB7AED0846407734D9FD9E21D9B3D6F613B99F6C70117F984BCA900E231652200295064E551F3902774138B3A7B94F01F74863EA3700F02E29376F568B7963BF462982CFA0A15150F2B786790C098A7FE9DDAAB33BD9B1CE15B6C79FB5FE5010000E4932618C498131EE7AE12BD2621D61A3F1600476EE0F1DC3AD47308A6B77CE5476BD8C2810926882EA36B5BBDF361940FEF41CFF4D2867E3DD269A4E801006B900EA2A89BC813BFF84A3DE35A3FC55A568DEB1F8B4C6798BDFFA76EA2A8B99085743E5FCCF7C2941688816ACE0CFAF621F41098613AF0C560F2290DFA1C009E246ABD0F24C2612F732B2E9958AE4D5410C5B553CA6423F85838CC39634D2D3367EB8E74C1126776CA75516D9719774FFFED74FF7C54643AF81DCC17282500EAC1240DDCF81B6A79689739B426C8DA804E4041C5E94FA82BCA53787F4341E890834C8469E24EFF3E0503F4B12AC26FE88E6252442BC1ECEF9194AA12E72300 -smlen = 863 -sm = 583EB8A22C9AD869FE7E7CD022D50451813F0001254CFF426FF8BCF7F586F1B36C954A52D8011D91CA4AB9E28EEDC2610D5A5C9E4D03EEDD000A6C78E2342F3F50497C0E878B4011C3E54B00C8C6EDDACD16AD129DEBBE9B0F6B546198BC00182D7565B7F97A0850872604957C3D5AE0CF0197E98A05CC1F24892EB326BBD635E23829B8012AC05D272C532F944304A2DDD12F01A2FDC0010AA4FB03C0EE40F510D9A06E5D7CE158704100A0F1A2CB9E23CB3A5F8216DEC12AC31834FA01601A2221ED2EFEBD47C3BD40CD28F2FD10A6009C69C6BB659F4279FBE87FB865B3C2E3F47E01B324C67ED776796A5B13F8813EA7C7C5596401E053685CF36C51982D8A42C692DEF0C0815C0101B143929F0FD3BF0CE8F45574A66271FBA390FDAD149EE283F9D87348B1DAD8D205014EF27C0094C7E7D26FBEC5DC3DD8205C602100519AB5EF882A2907A6A76252B2B5029B64813C058F07A09A796FD764604EAF58CE144363702896DF0AB5FF26D5DE000D14BB8FD358FF5532D3B909AB62C18AC30F1900F84EBD3F4F18BD532D16C7B3470F0F8BDF72938C916DB18BCF1429DC1635B1C152C5F89A9EDB17116C11815A6C06273A889132923DA908FF39F4940A840D3CB575DC4D637AAFD37968EC61FC4EA04B4C320491A73ECFBDD8E10F1DFE902FCCEF93DD287ED872F67146BB8CA5A6ADCF0350E8BBA7F2F9762C4AA748FCE19748EB17334146C152FD63FAE3DFBB1A2C2B3C78960369551FDAC5D54643BEEAA59C1FEB0C21DBBB19977D848CD82A7AE0005F45956E0FE4700F14FBAA0C12FB8C65A6AEC95C5A5C8E79A6DA9C4E446872575C06AE49A31B82245E1757C7CE84D6D5DF3F642D3434B7E1A15A8B8A9DB460826B6CDCA69022DBF87595B582DDBB90A81E09A13C2AB1C125E4435FF30ABC9C56A00EDFA979F79D9C895E800D2DD6372FAE5FAACD83ADF8A6D55279D52DF547E9BAB39D99076AD7D297371344D35BD584E0FB5932F92FD5183B9250CD180FC645BEF6028C405B0EF35DAF783428173F1F2482AA1363640F66AF0FE8ECACC0DAB84ABD2A1FB53AF44445698CF1DDF4C2EA214DD339BE004E75BF76E95CA5C16981ABA5540689C1C1F1DAF4D0F89D62CCB3496340D61E7D5F5156FD3EDD02EDFEC8FCDD0B231697B0E66F4A3AAF46117532F5EE2CB4D2B3B82B0BEAE0A45A482CE9A976CC99AA82BEB0FE08CB68C4 - -count = 16 -seed = 5B485527C3B9A5E5B7579950049CD357975D4BCFEF83FE33C087ACBFCC10A0BE4225E7F8A5F77203B5FC7C0B5FC0E78B -mlen = 561 -msg = 922320F7439E492F13C272A5738FF7122DD7A6B2832632E1F7A653FEF3B8639BCB9E84F482F22A948EA17DDE6958489593D2CB268BB52DF8ED612F2317BD6847D1622CF0532CB499ADC432233B93B6F7B1866B38975AC87859AC49F91E8D235846775F9E6E6D052339C741EF6178016EDB3D0B1E3F3536667B3EA2D489F88D254B8582421A31461374F465D7AD62E896BE0857134707A70477FABC09FE0A5CC3B3F32911F5FF3806B878205525AF69007F50535DF05C33AF3B0D00E297AC7EAA012E1D863DD5DD5FA47FB09467DBAD8BC42EDBAB42A9625BFDB9FE578343297506A3B71CDC8D5919955AF4605FCB0C7164D96A187AFF65D0F6210FEF2D11BA08D90C4458542BE72E084577BE9E451B8B6F4909884BCC5D25316ADCCD0925664D4D91C2E56433C1B68C632B0CA56D856DF1EDD5E113D1F026B30DAC4FD648A504F8F6809C701C97BCAC2B99286CEF5C1C923200B1BF6141EE1CFC51C5E14554BC02D7E058970254D2C02948360ABC4DFB439E66946A8AD615147BD8A6CB0886211E8B15DFF3C72B6F8908CE56BBC1B40E838103202E9F188D98E07555DB61778F895F76FBD838B6D14209D28EB393668924AC0E61072CBD9F93B864904FF4302DCEA131B2CA16BB04959ACEE096B1963CE07F59AB505FCC8D89FE08FC58751965F2F5CA753D76D58705652D3B1505E0F720EDE3142DE9776FFE4AA0C8A25E76C7A04843377C59F1002844E89189E22F621467B813A98BF07540A1649264F14A6844D65692617F7A4D93FA9A23829E256626 -pk = 451F33E8C64198D6941BF55E46CE0C01AE0439401ECDFB52946961EF9E3982AF5DDA3968AC44EB0DEB1C8431FB70DE51538EAC729C97A2E81A16FE4E83490700FE6A434725C4C844D25B342A14016E128BC16E24C34EDCB490B3C5DDBB2323ABE34B52C1872175D48B160E860064575E77DBB6D37E9DD3D544998E50ACDF0000 -sk = 451F33E8C64198D6941BF55E46CE0C01AE0439401ECDFB52946961EF9E3982AF5DDA3968AC44EB0DEB1C8431FB70DE51538EAC729C97A2E81A16FE4E83490700FE6A434725C4C844D25B342A14016E128BC16E24C34EDCB490B3C5DDBB2323ABE34B52C1872175D48B160E860064575E77DBB6D37E9DD3D544998E50ACDF0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008EAE54136690A9C4A0282DD8670764D9A5B41155719112E6D427E2B2596BB378E9BB0E1DC2C7B855FD2B9710B91597219E8E6034B9790E0E0F73550073240E113EF778BC2D6BC5F76B193E2385022290A2F779A079D14030AB1400000000000000C513DCACF6FFB919E9F18AC70842A4710FA36A00764B24A4DADDF62622247B8E57E00BA107C101C1AC655CE9AAB174B6D4B66B8CE9D693EC870253871B128C2F8172F4ADBC990C790EF40B14EFF16C88CBB80AA61B2E5B55E6F3FFFFFFFFFFFFFFF599857355666E05EB47968B564E6934B78DBFA56357312D914A39C2DDB6F8F399ECFAAE2264567C75A9E5C5FF79084572F7671ADCFEBFE667580000000000000000000000000000000000000000000000000000000000000000000000000000006A339E5E9C8959A9CD812857C390F1FB0098D8EC33740993E98700DC714F094FD977336F45F58B57501682B42667F06AC112BED3FBA45F623109010000000000000000000000000000000000000000000000000000000000000000000000000000E45241C74B7C341AC6C3D06ED5A38556B7A0F02731FA40A56C3D14BDBEFAF41261E486986390A12DFF9A6CC6337A01F49A26EFC1E0C42BBAFC519F27527F2300EBC0D73DEEEADA749A51E9D3724B4A79A9120D27C1752C9A6AE9EF2BFDFDFD7D92507F8DF8B44943C675471BBA436851A0DE080799DD2A708EA499788CA52400CD1DF4F96ADAB94CBE4321E55B541DE100A8E7147C9642A794109370693B5FBDD712E3BB81EC4DF2ADB7811A2861085AC54387DB1C55D0944CAFA417FD882100920B85F550D45785BAE8F2565589BF5226B2FECDF95F0E0A7D8FBCD35F861C082745AEACCBD5DF95D3AA884498114FF938D7A1570DD93D31D8E7801832AD13007E270BA423FB09886C1F549BD7680AAF5CE04026F42AE99ABEEF4065055979A2BD466F7DDB461C9EBDE070AB3325C4A5187D4484A08BDF6816D242C85C671C00656DCF3B1BA269A4986BC3E71BBB600009D01F3BAD35AABBC2A2321A48552D8A7D0B4A75F2FFB93A7875E45D60BF9F79229E8F417C367C3468F6FBF2AF572300C9278498E96C1C9283EB01FACA04C1D8570EA207477D06F7F1A0AB90DC46BAFA4559E468BFE5FFD7B7E61AF78E06144A0C3DD9917D2212D36E496E2B695D2400C87B79AF2BB0B9F2368C7069414668A5A166252BE5CB60F16819E9941DBE8669F791779E4D3B0B6C6A411642116F0BA64CDF51BF3B856F53F0094645DF4A08001ADF35DBFB0BEC0BFF1D35BBDDE4DFAEF4C67FCE5A5CB189F5CF18AF6B9F544291D33A057E41F7F4CC071B6E0F4B6C2090EAD18024726F8E43586A344D442300864045F894AE44BEBD4DC15B46F6230B9BCBA5E90DE543907C40A06A92B9C065EA1F3AA17294790A5C94433AC78C9385B5C6F2745675ECC4D2568E9DDB9703003F9F305684AE30E65B26D572BBEC3C27149BB3B87160003782DF16F74E8AA82E9611CE83DB723BEB5BFA30F2325107F3F6F176634BB143428D7FFEFE5E460D0070A15509E56E231186EC8CE6F28F4BAB93F51F085F3DFC7D242FCBEE749E73FC2A75A15F5B9EAA2A1DB64667476319C1AE61C2BBC3BA4128D4C86EF74F390500487F90DFBB7FA9BE270E06A188E91F98E0476BB5ED3FD901141E8CB64BFE01E089322B0BC4F7EB42AF02204FFF3219A2B6EC046B95260B3826AB839C860722004FDDE9AEF92D7FE249D125C73155FAC4C9637459C231C6B373D6D095BE1BF28945FBB24ED8254A4E2F3017C756EB4CD8985436E0EBF717F8463BC18F37271500 -smlen = 896 -sm = 2A793A92386A2E6CC54A7139711994D93B7101B2EDC6BDEDD806390D4AA3B14B5FD4AD60BF004F329BD26411DD13D4F013785E22EC2C649E00E1D908ED9FB97E91F62375166D64F1F5A8F800124A4A40EBC168EB3A4A557A4AFA55D30BB50071D5A65C7BE9F9B42A95806770A4ADF17D9601D9E85AA32B1A3E8E8CB4119B06480D471F4C01319CF3E51912EF75ECC7E3D2F2A6F55BF755010710D39B34D1EA5BEA2BB6161ACF1A383A420175937DC1D4386B6399CB745E79CD34FCD8A100D9D412AC9928A522349DB08E6FDD9564401A00483E0A77CDF7F21D92C0B00C6BECD2F34CAA0132EC8533F5DB3C78546984A956DDAB6C14C901C5DB9D9B6B9195ADFA056ADBA6C1C02695B801007DD17C38CE4F5A22C5C579AAE617027DB792420F0F58EBFF08C47C0B309DCB890503BBB16C1B71431AB2EB9C834B740BD0D243250054519D0C4FC45DB09498D79E9AD602922320F7439E492F13C272A5738FF7122DD7A6B2832632E1F7A653FEF3B8639BCB9E84F482F22A948EA17DDE6958489593D2CB268BB52DF8ED612F2317BD6847D1622CF0532CB499ADC432233B93B6F7B1866B38975AC87859AC49F91E8D235846775F9E6E6D052339C741EF6178016EDB3D0B1E3F3536667B3EA2D489F88D254B8582421A31461374F465D7AD62E896BE0857134707A70477FABC09FE0A5CC3B3F32911F5FF3806B878205525AF69007F50535DF05C33AF3B0D00E297AC7EAA012E1D863DD5DD5FA47FB09467DBAD8BC42EDBAB42A9625BFDB9FE578343297506A3B71CDC8D5919955AF4605FCB0C7164D96A187AFF65D0F6210FEF2D11BA08D90C4458542BE72E084577BE9E451B8B6F4909884BCC5D25316ADCCD0925664D4D91C2E56433C1B68C632B0CA56D856DF1EDD5E113D1F026B30DAC4FD648A504F8F6809C701C97BCAC2B99286CEF5C1C923200B1BF6141EE1CFC51C5E14554BC02D7E058970254D2C02948360ABC4DFB439E66946A8AD615147BD8A6CB0886211E8B15DFF3C72B6F8908CE56BBC1B40E838103202E9F188D98E07555DB61778F895F76FBD838B6D14209D28EB393668924AC0E61072CBD9F93B864904FF4302DCEA131B2CA16BB04959ACEE096B1963CE07F59AB505FCC8D89FE08FC58751965F2F5CA753D76D58705652D3B1505E0F720EDE3142DE9776FFE4AA0C8A25E76C7A04843377C59F1002844E89189E22F621467B813A98BF07540A1649264F14A6844D65692617F7A4D93FA9A23829E256626 - -count = 17 -seed = 327CE565CFF6CD9A25EDD84F482FA0758B78CBC246567DAE98B818314AE28CD438E339043EB3FF16E1C2B4B104A717B8 -mlen = 594 -msg = 576289D10AB03D5699EAC322D349F55C547101E4424BFA43BBBA3747B79F075AE1153A7A0AC8BB51D24FC46B7604E42EFE4343FA34AA4EB16D918F25E8A4D67C860CCA3F7480E1221ED3AE13A138F079FC252C6D7BEBC55CB81B86E74F339614BEBCF7E8F4440DF8678B01A4A41B3AFB1D112FE1C4C8D8C6BFE9D3EE2A335D477C60FBF43B2E5FFFE1546F5172EF51CFFB2A772E1575EAC79B24D49FD77F0BE351233E57EE6DCC7E2E29994873ABD434D34ACE83400C026E27E27888EA0BDD1BDE5A3E55AA8B5F2FEB57B8B0A96CD831906297C8169D04F15843A3249C50523CF56A4E19492EA16927DBA8759B88A99E0D20820E51FC9B6A6863115CF05C5BC3F4C869EB5A87124DF5DB102D737F3899CFAA5FEA4DD62DC4FEDB1AAFF67906ADAF8968020EFA5B10190F70E5F2C0F0457E4341BD449201D3A80AEB791254EC1C46DDCEBC3896C6DF702509BA62CD446D275806438EB4C03132B2E6BD01BD2F832D1D3C053C48C5A9DB1C4A22B130C4C9E96A2BF4C2A8F7DE0217A52D9AA5AEEE5E6A49708237EAB60B4019A51390C3EF10572A73D436875BB8D7D78543F96376E4BF3BCAABB92F89215E8D1093F3B287945708B5514BD7E62654D3BDF34B29009C64829A0CBF33C54D7AB0E81B81BDDA93028B341AB1DFF3D752DC4A1E5F9636A5C46E137EA35919D99E6571C5370C6E804BD2E2ABF566F035D65CF8F97E3E8F2ECAFA153BC6D8EC2831667A37FC96D1C2DA40BA84D0FB041DEF32AADAEF3F98CAFA957F6552F79D28A36B8BA20A9452671DE1BE8AF5D66714232507EDB9FF657F3D7E5FA7320FC0359A5F99280D446283BC -pk = E5A998CBB287669EC9F02BE65B99816F370017F1A22782A2F14A417393DB5752ECA233DE0D1F54F89F43F01350DC02A3DDE603B4084F216D4F74FBE5E1D51F00F944A4D27D6BEAA78090EE66A123C8A2713174FB279C4218A1F0EE0EE14C08313447F4562582AB8E1046D1F6282D0E5F0B44E991605A5A904546F7D4474E2200 -sk = E5A998CBB287669EC9F02BE65B99816F370017F1A22782A2F14A417393DB5752ECA233DE0D1F54F89F43F01350DC02A3DDE603B4084F216D4F74FBE5E1D51F00F944A4D27D6BEAA78090EE66A123C8A2713174FB279C4218A1F0EE0EE14C08313447F4562582AB8E1046D1F6282D0E5F0B44E991605A5A904546F7D4474E220002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B68DEF4B4AAE56FCC90345EC39C7C7A03C90656EEEA15FD3A04491C20360DC6DAE4F6D4DDF6068484DC231313F0FD6EE5F973FF4DA278571A85F5B382379C577628B03712446193CAB43B60EA86015DAADB54CC8A6BA560C2E0500000000000000E9784F53810EEF83011BD1A52B8A13FF08C81FA4F313C4D19CC2272890D68482EB072AAE6A6FD62D3A1D5F7456F892B775C3D63CB1C74251415F0B1444D70102A42B1DAB8A0B6343D3C75C23386C9B49507602080EAA31318AE9FFFFFFFFFFFFFF799D2B3A478CC4D17AA535D48A64EE8AD4F7DAB70AC6DB5B24B871C5F1F107BD2DA1B9C53B648B5F9D062A9BF5119FAD4119D5529E01E5A2849B000000000000000000000000000000000000000000000000000000000000000000000000000000AE46065991182D1DEC8BBEC699DBEA267EBF429A7DA0F03A3BC62819623A82031067CA62E010952A65F5D8A325083A1F12C5D4959D72BDD96DB5000000000000000000000000000000000000000000000000000000000000000000000000000000A77D42AD8288A8EE4902A1B3891B7D200C7132F9E55369214885C5E6B244738EBBDBC32DC42108637FFB1C4777240808F73B78C80BC920456062EE96AFE4000088346E081D7C67502747CE3E6725C66165BECCBCD1D537E14AFE63FEC45AB757C0789B0423304E409B885FE540B670777BDC9E704E1E15E023F68522AD3E11002A484A40013F464EA9ED8E582E7DDBC9481FC53FBC15FBE9E8B43118932AA36AE3F8D45346B378D860476B1F60FBA1301633EBD9BC5502379E5EE3C3B5DD1700D83B78B3E35F66B763247C915840C5A829726556A9EE55DE0E125E94AF0CC8B099F344940CEBEF7522FB030FC0E5CF27D7968ADB045D210BA845E032F6FD1B006F55F30245810EECDAE679E3908A8CDB4D02B679A4D1550B628108AE86B4F28C2F12D03EF7C83888B98BB719597088B9CB312098233EE6EEA1E1C716A6981A008AC499666DFDAC310C8766FBDF693EAA35CEE9D69B54A50AE99B697CFAF03C0EC89C9EDC8CF4DD1D76E1A3633DDC803B6B63BD894D9ADF82092F88359C3825008871027DF24D674D8C1D774BBE9DA0FE5FD3849990F51603228213F91B1E884B74BF85B18A7C862BA3100E727B61888A5B0D481C85B33CE06816C8188A530700245CA807FCAB67A60649479F309180F299407BF79BEC60E7B37768EBCD942A287CFDC3487297643E462AD4738D01B13F7BF2370F588E2A32D8483F3002590A003AD2A680D36A7D9C3519E17A6D8E21E6CCB1C7E1CB740B56FE37048FFE7C1CDA3D59EDC43F6E270A4A79F7FD8A35F0053BC34E2C80A5D123179C3231E1A10A00AD35763C1DB0675A2C75366D5C3C693A5E27B316F530447C921FC9E35C875C66EA3B032C5A36D1256D1109151B5FC29B66236D5D101876F09504E843D7FF0F008240A496E6EC5484C67D2ABA0774A5C4808FA23052808CEC55C3E452BE55A1F3DB7EBB2C56E2EC1C6CF323905BFA0E4D11970CF3EDB7DCBC0C6DFBC56D8D04005B729E1123014CAB6C4EBCBB73AB1C7ED4979D8C408F961E2D562F10A05EA2FF6FA48BF4E3D2C17C017B785B8F28FCEFF2EF42D1384BEAA1ADAE79BA88351A0091871366FA715E6CA47489EBB195723FD1BFF6841B567AF2503F7CC0030DA3A5D31DFDB364709AD9AF9E17B9BE7F3ED5FD0C4D42F5565837241E910437651F003284C0D78B33E937C9BB6790C8BFC0E603417BF7A0D58FC47C8AD1959D891A41F5FF212DDEC220233A59AD740C63211CC1315AD777417F464FAAD56BE5380C00 -smlen = 929 -sm = 6E25C1EE4DE83B5E3812E45394BCB959322C00005E867D065731D7111E5651C1E358AF960A01E127FF7E01C149778B2AA72AB76709A4410E0128115CAD244381CF7419B3B47D8CF5E5F485012159E4A4305268DD402D01AB49A87F63EA05004E85EB57B8D4048CD6A5C67EA8973CBDDB66008382B680C1497BB86B202BCBD458B6861A9301A41DC2C1A41E4163EEE1DAD7B0C1E7FCD73601E71EA0B7586B887398825198CFD9795A84A0018E5DEDC8AC371D515B0A9012AFA796BEA50101407615F6F96B7DC9CAA68D1F6CEE1232CFBF007C9F6A29254944DC729D2DB1AFFA5F53028C00F98C25F3A821F1C02FEFEFA12B49DC6A128701F28B51E9D7434DF0BE4F389DB2FFDAAC877701007F12BF79A632B084D4032173B5144D5BAC3EE3C36574DBFD97F875F1D49561B1070232F296C945AB85BE7B95C511864905C6251900C8070A8D90136BDCE4488363178D03576289D10AB03D5699EAC322D349F55C547101E4424BFA43BBBA3747B79F075AE1153A7A0AC8BB51D24FC46B7604E42EFE4343FA34AA4EB16D918F25E8A4D67C860CCA3F7480E1221ED3AE13A138F079FC252C6D7BEBC55CB81B86E74F339614BEBCF7E8F4440DF8678B01A4A41B3AFB1D112FE1C4C8D8C6BFE9D3EE2A335D477C60FBF43B2E5FFFE1546F5172EF51CFFB2A772E1575EAC79B24D49FD77F0BE351233E57EE6DCC7E2E29994873ABD434D34ACE83400C026E27E27888EA0BDD1BDE5A3E55AA8B5F2FEB57B8B0A96CD831906297C8169D04F15843A3249C50523CF56A4E19492EA16927DBA8759B88A99E0D20820E51FC9B6A6863115CF05C5BC3F4C869EB5A87124DF5DB102D737F3899CFAA5FEA4DD62DC4FEDB1AAFF67906ADAF8968020EFA5B10190F70E5F2C0F0457E4341BD449201D3A80AEB791254EC1C46DDCEBC3896C6DF702509BA62CD446D275806438EB4C03132B2E6BD01BD2F832D1D3C053C48C5A9DB1C4A22B130C4C9E96A2BF4C2A8F7DE0217A52D9AA5AEEE5E6A49708237EAB60B4019A51390C3EF10572A73D436875BB8D7D78543F96376E4BF3BCAABB92F89215E8D1093F3B287945708B5514BD7E62654D3BDF34B29009C64829A0CBF33C54D7AB0E81B81BDDA93028B341AB1DFF3D752DC4A1E5F9636A5C46E137EA35919D99E6571C5370C6E804BD2E2ABF566F035D65CF8F97E3E8F2ECAFA153BC6D8EC2831667A37FC96D1C2DA40BA84D0FB041DEF32AADAEF3F98CAFA957F6552F79D28A36B8BA20A9452671DE1BE8AF5D66714232507EDB9FF657F3D7E5FA7320FC0359A5F99280D446283BC - -count = 18 -seed = 790FC03F956D1301A735504075B67A05944A762E0A4BDA77BB8C036C5CF911E2B561EC1CA6AA355D5CEC919AED42A1D2 -mlen = 627 -msg = 021E9C06A2E4EF63D1A61958620C40016783879080D44311E04F2A446BCAEE5A486D17FF0F356BA70FF1C2B55BF957A59202903AE349878CB822E04275E0AFAABC0803BB6CDE3741E0BF9FCE0C5D5C814977474533DC63F9ED4F32AC3477A3EC9893EF55186728C85B03F4C2E61CA7733E1706766AEB8FEA80E233E8761B57FD5A3CEF700196674B34A3A55F68B3368B688FB1DDC976FF48BA6A98E2D66023F291A3C617A56CCBDB8732B8C34369ED11F4CCEA8FC8F673AD9FA0FD8990BEF70AF44C617FDFA096695D0C94EA8E17554F4461DC776DB2F416448B17680FE4D29B09E57603D8EBF55771AF84D8D4B9097302901C25CB6D73932E67C323D12C8ACB0E74CB89755F7EB3999D4EAB5E1B775E6B5C29D9733697030A26F3B93B3F286DB0F2DBDA71E1F103878063E77919D8892EB6A34F821B603ED4A898A9F30D00FEEF20985FEF1A7B7AF70DD29C269E88687F005D551EF05EB0603FD38745AED4F5BF4C2FC09F0604C98AE3A89E46BBFE907B87A1672DE547D651F035F392A8D4DB5E7260F43953028E312B95B9F25FFF2C0C579218390411D13D9A25F22DE4C7AA05FD11781DB08977160D48E02372C7D826F5CAC37D1A9B4230BE99A2D13CC2E9B2B17F0A1044EB9E0A2FBA376D35CDD2BC05F57DCE4BBC3BF07A09BCDE369929E6250EFDC61689466B040AEA376B09453A2C16813BBB685B54A225C49008BA6811E8BB5B3627F8C281244FDF5533216D126ED0E64FDABEC533424BFF77FE722CC438CA7587C19D965F0BF085D8692C27C5C84A9DEE53256D978948D89ABDF9842E0B765BE6A507D8630CBC5CA7FA0FBCA1CECC78D2E536AA7B2B902C4379777AC0920D69C57CC4E6032252BDE99E1A555E80D4 -pk = 040814457ACBEF3277E74DD676EBB3A80230A7B7E984987EE29BDBD88CB0B4AD9D791250744AC8428F3F0C3DF20E65769A22E754E40D29028EE72B58D02320003ED3F9C7A4CC459C4E735637F35FD8A3AF629C2ADF3AC6AA63BBBBF64860C7CA495D0ADE9E206055183C247ED4076408779B7391E7C588976E2213C377332300 -sk = 040814457ACBEF3277E74DD676EBB3A80230A7B7E984987EE29BDBD88CB0B4AD9D791250744AC8428F3F0C3DF20E65769A22E754E40D29028EE72B58D02320003ED3F9C7A4CC459C4E735637F35FD8A3AF629C2ADF3AC6AA63BBBBF64860C7CA495D0ADE9E206055183C247ED4076408779B7391E7C588976E2213C37733230002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FE9A7ED4709EEB7D16D99573F34C0FA50740DC4D6192F4B83147098BF0FC356D7A95383118587E907EBC8F15C01ED36A1558224E276A156724D8DB42C36CFE3FB7B15A61BE43A8B124D1D136688865EA9CA71FB7BE62940FB7FFFFFFFFFFFFFFFF6DCC28CFA1728A766B1EA47463EAA199A417D53DB1912CAABD26C644A958D08BE8359595E7911AFB0A8630D639FE1DD1E88EA3C099C5F088901F3326538EA62B2CDA795AFE8F57BC9E759C1B3D79E44EC41DF872769C1F2A70EFFFFFFFFFFFFFFF43B1536F3066552E588AF8A650693198811C68FB9117379EA0A5D932F7FAF50EB49312DAAAD3F0F259630D0A8ABDAB7E0C5A267DED22ED41CC55020000000000000000000000000000000000000000000000000000000000000000000000000000D60CC254C941E0FC0571AE9A31F88C94F2CA6EB004AF5E55D0557188B3D73D1A9A7EADB72E7F00860413A0C06163122D191127914A6BAF2BFAA201000000000000000000000000000000000000000000000000000000000000000000000000000098A7ECE0AAF716834D6C690FFFFD22484EF2880486DC7485AC172939831C3A2A9C742F2E54EFF23A98E5F5FBD73CD57DB99995588EC5A594E4D528DF9FFE24005A571D84DCACD86C460339191579B1A34C88044C357026EEB7317218459F3199A66CAA2220F81E25F513D7B6E7057AD369A3AA7F3D41E92207EFA04B06C517003D117A89DE6AC96FF1CC4801C42263B2EB184BB523CA185CBB89E9B886B40208A5901311D196CB92882DBFEA5A5FB95B77A5FC740E22C46DD90D73CF79DB1C0029393549BEB186B3EFB8DF3C45B4C2F1E9D3B04133F6151A7838591F94A53C587EE464C79EAF2DFA15B215A9EC08CFBB31DFC863E4BEAD828DE05CB734100000F0C5A62645C6B27B1EAF288C0DA6871CA2AA3BDFE92B21F87D00DF607C61ED3D36539C08390146E4B130606611F3EFA75352DBA194AE3E6D3AB2F4650BC40B007CAE64F67D3EA87983D789E99E821982B4301F3420B5B0308AAC3D8F7242F67A0D6C44977379AFA5C7F3C2B0D3A5B4EC0A4A219B794663EECDD350DCD7210A00E9B224058178D09D911138E05B996B39BB2E03FF23D827F03C024F01A4881E019CF267913EED5EDEE7E57038D1B7085D5893BDA464D571C45D3B38798E550200CCE08BFAD742B654C92AA010C3EE6196F7424F3CA31CE5083E9A3FAFE1E1B41B65B5C0A70F5431429CFB1C7B29112E1CBF229655778D8D6BF7BABECCA1671B00D3FF38937EDF5B52CCE518B6E2B70FED6AD7EC468CF9A781E05088F2304F4D976A76A4D7594F6BBB52048B2D88CB5DC3445C1D50D53231341F0F03402A1108003EC682BFE6AF74AC047D89300D079932E453D8B45F138DDD3D00E1771BCD3448C43DCD45FE7FC660854E8AB3EF1A07F2D08554CAF83C77EC10859168F51B21005708F71E264915848850B743B4184B642E37B1D5DC22CA92AC7029A2A917272ED89F93B4B2661304B695E1B48AAD65C53EA0A3A5804537C9ED94354D861210000D384074F6358C8730D769F66852715E40926C95A4423C9C68AE87D66B832608FCA380946EFE79627E75E3A689FF532ADD4C23CD3604B683915464952EAD100039C4432631228CC201D480688C6CC7301ACB79D42E25AF4DD97B72D8A04F02D7130DB9298C9B143CF9C6BA785EF1188D06C3AD6F13AB726CDE2F5BDB4C21050036D395BDD04979948EC4FE55B9528F0DEEE9E4967BBDD070B5082599F9E00A05E6FD9F6FBA7BEE1A19BAE4F287E100D1D4C5C163575460B4DF6BE1001D900E00 -smlen = 962 -sm = 5FC725F4C88F030711DF8C384DD04AD5745F002E5852D4ABF42271FB4281B2FF1B21F7132300C8DA7B54968D2DD369987E742FF5862F29F8015A22DE66F1FBEB0D79CF6B291A4F40FB0E8E00BD7B331A96EF2224CFA25BD3BF849855CF4D014983671BB3B755BA0B7BE421459FCAF0DC79011B330C6042D0675B38E1BE96BA7F2561825100952592D69D14C0FE7C6569E16603075604E000458896F9A2270A0392286BDE03D8A19E6FF300BC5E605D6CBB6B997CB229EDF85F5BB4C6DE01F9ABF795731E07ADD184C6D61B0411D9BD3101F18C598E467CA83EFB6905CFCB766896D47A004FD20B8BB1C3568224460FC5312C0C610A6B01971981E525BF11D1F829D6FCFA7D35D110D000010BB11897BDAAC21CF95AB9139D5E60C01D8FF641291CD0B584474C56401E0B0C0002B42EFF1F4E2F7CC893963D49A5683AA8DB9C012D347472D2FA6D2F8441DB28CCAB00021E9C06A2E4EF63D1A61958620C40016783879080D44311E04F2A446BCAEE5A486D17FF0F356BA70FF1C2B55BF957A59202903AE349878CB822E04275E0AFAABC0803BB6CDE3741E0BF9FCE0C5D5C814977474533DC63F9ED4F32AC3477A3EC9893EF55186728C85B03F4C2E61CA7733E1706766AEB8FEA80E233E8761B57FD5A3CEF700196674B34A3A55F68B3368B688FB1DDC976FF48BA6A98E2D66023F291A3C617A56CCBDB8732B8C34369ED11F4CCEA8FC8F673AD9FA0FD8990BEF70AF44C617FDFA096695D0C94EA8E17554F4461DC776DB2F416448B17680FE4D29B09E57603D8EBF55771AF84D8D4B9097302901C25CB6D73932E67C323D12C8ACB0E74CB89755F7EB3999D4EAB5E1B775E6B5C29D9733697030A26F3B93B3F286DB0F2DBDA71E1F103878063E77919D8892EB6A34F821B603ED4A898A9F30D00FEEF20985FEF1A7B7AF70DD29C269E88687F005D551EF05EB0603FD38745AED4F5BF4C2FC09F0604C98AE3A89E46BBFE907B87A1672DE547D651F035F392A8D4DB5E7260F43953028E312B95B9F25FFF2C0C579218390411D13D9A25F22DE4C7AA05FD11781DB08977160D48E02372C7D826F5CAC37D1A9B4230BE99A2D13CC2E9B2B17F0A1044EB9E0A2FBA376D35CDD2BC05F57DCE4BBC3BF07A09BCDE369929E6250EFDC61689466B040AEA376B09453A2C16813BBB685B54A225C49008BA6811E8BB5B3627F8C281244FDF5533216D126ED0E64FDABEC533424BFF77FE722CC438CA7587C19D965F0BF085D8692C27C5C84A9DEE53256D978948D89ABDF9842E0B765BE6A507D8630CBC5CA7FA0FBCA1CECC78D2E536AA7B2B902C4379777AC0920D69C57CC4E6032252BDE99E1A555E80D4 - -count = 19 -seed = 716354F7DEAE272CD26929C0932CA257AED1DD23D67260726B5213D82E61466FA99BB6A7D81DEE9D0EBE03DEEE4DBFC7 -mlen = 660 -msg = 7BEDAFEBABBBFB863CE496475F54E69A905AFA45899C3D7C16CFC73E31597D2404AE7014612E4CBFA238EFAF5B396B0B7435ADA5DE817E013188C280423C68924E1FA2A33CA56E6B85B7CCA7F00D3A6151F0629C1B92A13573320E0025863BBA7F3EEB987EE1B1A6230B10765DFC1FEEA498AE4B83521188E7503B506259103CEFB370E3651B06DD4F08013FF3AB9E2430626B0BD584232948462D85C0F82DA07B96FC65F62A43CD2F132D1A1D691C085980DAD8796CCE2FA0B268395EAC3DA2CC400F30F75BE87316216980CE213B48651DDB9E294F8CDB2CA05D3F2A507E4A03E2849AA8062918AFB5BCE9E4C3ABF2FFD4751DDDCF08AB09E36A29B830F3BAC6FEEBEA084575472E6F4B239AF89965A72954769A83E391DE467934237B07D8884A6B14CAD034FBF9BD7531D50D742E234E227E1A2DAF77A2FFACC579525134B15186D81AE6E5538871024BD2897475D6EE5B11BC51EDBB928D98475073785A75B331BF3D2297165AE6CF95C3A05F06DF747498462054F58A5AC736F96014B1A8CDB319D030D06DAD9CAB2B913F35FC392E1FC4B027CDBE775D64B04F1076A7C8F44C360745F98E87B84C18AB76F84F373F635AF4C8A87DF08DD4507899BAD892FF8CC1EE534D3277B5B82095628B84A7D5582149CF46C50AA963B56B4B91966B106B4B2EAA45D83A10993E8F933370AB29C6606B7CCFC41B21C6B99F2B9AC643E24300B350FA199EC10E64E4AF19181F78E8C43B2FA796241DC42CC8992BDFCDC39E7BC41BE68CDCE4FBC47C996DB42E8249EEDC146C216B514430C705FC939B9EEF677AD87F9CEE3398551FA0DAF774302324A410F4A4F4FC035CFBE960B38C390441E92D9E5624A8745976BC88FA538E398712361B77AD4CA5FF038D9F6CE157EB8A6137420D4E57018275DCEEBC4E480A5D -pk = 94A8683E4B8CD154A4D7523AA2369DF5D28650F98295AD6014DDCA0F417EAE139DEB2B436BCC67B6400A37E4387ECD6A75D266785FADD6BBAC8C81F761210B0064B338934D261DB8AE9136A4C5284CA1DF7DA6727794B1CC322087F628C899467BED467C07C5BB2C056659F74EE71D094E14BFB0B77AD350A6BE395F90650800 -sk = 94A8683E4B8CD154A4D7523AA2369DF5D28650F98295AD6014DDCA0F417EAE139DEB2B436BCC67B6400A37E4387ECD6A75D266785FADD6BBAC8C81F761210B0064B338934D261DB8AE9136A4C5284CA1DF7DA6727794B1CC322087F628C899467BED467C07C5BB2C056659F74EE71D094E14BFB0B77AD350A6BE395F90650800020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004D8513D905EC0605AD0B2891CE383CFCE0831DF66D37F2C7C482B43430F6393B64EF23EFD9581D27DB99ABFE47253716435ECA77A736FDBCFAF0C200BBC23DEB1EFFEFC4E53427294D7DE282DD30CA851E6B4A1D2EEDBF7A610D00000000000000547CEC9EB33BCB2ECBB052DA580460F56C758BF452C5C86D1525BAC7B19A500E8B2D57634336F85681EFE53C9BFAA247BADDFDAE7071F591407C3B1944C49D0D1B53CC3D55245070B9801CC6022BEB872CFC8F6D07FADEDA2DFAFFFFFFFFFFFFFFC8B3A19A2BD3029E69EC928FF5353B43EEA6DCDECF1A03788351E8FFBD7DD092A2FD2CD94070EBB389B4E885B6D489A517C056371ACD7B8E1F75FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B6C65BB775BF06E14E4B44D47BF63C42927AC5C002B34A428DB0AFBFEB1070E74D7D95C55131FF70EE8EDB2389BAC0CEC00FF21DE30C33458C601000000000000000000000000000000000000000000000000000000000000000000000000000053D29CE400AA7F89036B32D36C7FFCA1A822C7F45C218924869678ECD4DB9D852609454B3ACFC7E5356A3F552F7AFBB2B8E7996A87E4079B67616A4826412100BD07D241AE728FA1B6CC470D4DC38E691D1F70F760DE2D9B670FBE696074B21C24A131ABF512E92EEA6A48611A0C585F48D9AAA34F25A51D649B78F13D0A22009E184CBF99E918B1BE9F22E0D91A42D4F7F1EFBE0CF0640C9A76CDC763B60DA4F74B4C5A7125596096A5FA06CD9503CA2F1F68DA2B96AEFD2F093F375B8405006D8DAFF349973037571BD378429A8DD2427967D5C5E01ECD47408B93404D09716C979D42D7C4FB0061E8DEB06BF775369519EA7FFFF7297CC3329D026B3316004B0ABE05B58B928C5AF2E154167F89DA6E0425154552A996D815CFA9A61617426F149105114D190ED172A0674169723FE86701545D4A628286A145469131170017D119557E164C6043B032CC3C1193DC40D3FCED26344BD5B00D6AA58E87B92755937B0A684907D0F8F1B02007F5C93528789FF5C2747DE74530CA77B08800008061AE7C1627D0DD56A2DAB83F397FFC421045DEECBEF2F4A362E75BFD7CF759BA10C10D0EDE548E5E4C77EFC10210A4FC27F6AA5AA35681FA30B7042EBF180001861960E244538CA30D56A6E72C9FCA5DE7CE8CF4F5CC68A5C7232A0E09421D3ACD5E35E2189AEBB139F9C68ADAEBEB065CEC5EF048D291D0484148E4CC0C00738A54359FD59F5E3AB5F15236582A2A1807437C1E05F56E6900C4875323E476169A77CA210CC950C1B19C0E1059A3048954EF07CB8C5DDD5AF817555FC70F00937C4B9DE8333C9D05E93AB2541BF05EC58B4B2ED29637F672EE123A7DAA11A3969334EB490CB503BE0AC0738E897477BF64FAC19E755D8C63FF6DEBF1162000B48D18E1A1AD180128FAA3E38FEA3CE5D037C7D6886836112FD18A521DD2D6BAD2357650F470F2426A32BCD8A68AE0F65EBB8DFE81455E6BDA12E32849420800EF456E993C0755EB4784E97598C2C876B40D550542A405F461497616A3C4F9FDB9EC745FD215D02C6750D91B3C016F27CD934C771E06280E1CA59070B1AD1F005A0F39A2FC86C0A8A08E4409CB66D00405BDB9DCB66F394743A07E1131140E5F787533F124302A80859754ADF92CE0EE8970D5529499661B98DADBFD272C1B008B58D11A7CAF73FFB7066ADFA8BF621D5EFACF2A703F65ED63CDC8D574F683FB388D67FF04E48EEACDEAC517BB1A0BCD5F375292184D41E7DBED5A10BF570400 -smlen = 995 -sm = 50FFF3F223B5CE4A6E47F128DEF6B311B67C01899B244F1DB0BC9F563C0F4AA7715549FF9000217586AE1B9BCCFE372F50D7898DE8F08C3001459F4D66097E50E8637A7BC50F1F84BAF745004A413E7109CE8CC155E8A422FD431C745B7C01FE4055A308DC331F9771C6E1AC2DF77128B6001364D2BCD773CD0A463F4265B7A98AC19D6A004651F2B9EC3524F384457827D7ED365B5F18003CBFF5E83A7E52D75E3A4899A19B3A9740BF0143222E54125F5F39706F46A2740F4C93008200712D7875D4DE37433F4CA1DBDB7B225292B2017969DD5DBE8FD6125DBC299A472553BD1AB500827CEAA6EAE58A132725FA55D42BF2A2E917013ECDE9B19799BD10D156234F9623F3D459FE01004F64451828BEF9BBC1A4CDBD113D030762295DA7253B6572603868D72026744702039DCC24788609F00797F5490018757DFB9F7A002C3D047979105838BF97E0415A3D007BEDAFEBABBBFB863CE496475F54E69A905AFA45899C3D7C16CFC73E31597D2404AE7014612E4CBFA238EFAF5B396B0B7435ADA5DE817E013188C280423C68924E1FA2A33CA56E6B85B7CCA7F00D3A6151F0629C1B92A13573320E0025863BBA7F3EEB987EE1B1A6230B10765DFC1FEEA498AE4B83521188E7503B506259103CEFB370E3651B06DD4F08013FF3AB9E2430626B0BD584232948462D85C0F82DA07B96FC65F62A43CD2F132D1A1D691C085980DAD8796CCE2FA0B268395EAC3DA2CC400F30F75BE87316216980CE213B48651DDB9E294F8CDB2CA05D3F2A507E4A03E2849AA8062918AFB5BCE9E4C3ABF2FFD4751DDDCF08AB09E36A29B830F3BAC6FEEBEA084575472E6F4B239AF89965A72954769A83E391DE467934237B07D8884A6B14CAD034FBF9BD7531D50D742E234E227E1A2DAF77A2FFACC579525134B15186D81AE6E5538871024BD2897475D6EE5B11BC51EDBB928D98475073785A75B331BF3D2297165AE6CF95C3A05F06DF747498462054F58A5AC736F96014B1A8CDB319D030D06DAD9CAB2B913F35FC392E1FC4B027CDBE775D64B04F1076A7C8F44C360745F98E87B84C18AB76F84F373F635AF4C8A87DF08DD4507899BAD892FF8CC1EE534D3277B5B82095628B84A7D5582149CF46C50AA963B56B4B91966B106B4B2EAA45D83A10993E8F933370AB29C6606B7CCFC41B21C6B99F2B9AC643E24300B350FA199EC10E64E4AF19181F78E8C43B2FA796241DC42CC8992BDFCDC39E7BC41BE68CDCE4FBC47C996DB42E8249EEDC146C216B514430C705FC939B9EEF677AD87F9CEE3398551FA0DAF774302324A410F4A4F4FC035CFBE960B38C390441E92D9E5624A8745976BC88FA538E398712361B77AD4CA5FF038D9F6CE157EB8A6137420D4E57018275DCEEBC4E480A5D - -count = 20 -seed = A32E6FF879EC8866A5F5E4F6318DA8FE6743812ED2CF5FB94F5C3AA3EDF953CBC32665810B71B2CFEBF343A571CBC570 -mlen = 693 -msg = A86EE95388DF139F9C5A84108D1E63F7A7842909B818E9A0425C257649ABF125386FB5286031E7E6D0EEB85C452E254DA39BBDA51F0D2167EC0A51992753DDFA76874AA80804E705CF8BBADF3B82B6D7FBA3D1CAD130ABCC0B44D6D893356F3E94BF8E82AC532EF8C5E5F4200207BCF6B754F14E57A889FFB753F516EF8DE2A647FAD8E449264F0BBB4CF48BD01501736DA49509C3426A3D4108B98E6A4AA6C4430E8EE76540051FBD1DFBFC01750E26547F8718EF7D897A0342BB000FB99AA63B781C9A4B831DA798C014E58725E03D2F8B1A029C3337F4099239244AA320965B2CB5075052D901B6077A18C1ECFA5F272850A475B5F6BBC83F3C09A27072F80743B23EC6A9870913EE2805B4D296B2F81A9D733E5C8D5C0B477E51F9328AF3AF8ABED960408AFECD27FBDD08FEF50F4B07959646E0A02104A69674294A79DE0B25B65F4DBFA797E5FA56D66E8BC07D5E2E7C7D2E845699ACEA3BFAC60B2C0B988CBAB949A5B598D8E2F1AEC66196E115AD7F237A1C7FCFB95A1BBD6939A250E7BB0F4A02C23CB1BD81090CB770E3A70CB081D121BD0BD5ED1DC06D61282B98BF2DD7B13D2C6CF833891C67951D7D0F429EBDE3F1DA943ADB8AD285E6F13F798D6CD9A0A06BCD6125EBAA48F8F3BD5100A122F617817E3C42EBC3C3B154258FA26B9FD886EBFAD42DEDC6A2C4F9986BAD88A2A79D7EE603554E9CFC5FE33A3A171CF7BA94FD43228019B2F6FF96A8ABBC58D2098AD95A95442F6858EB69E131D7BCADAD81B9BB69D7682A978279B631E22927DECFFBEFBE8FB2E51D46A3FCA66225D30451CEF9953EF94F30B99F2B26EA75B84935EA4FB257DBE5734454B8087B3A4E115C6D31E72709303E9F0BB8C86FC6B11B93B53F9781BB92851A5CB5DC00D0B4E15683DBE4EDBE986966FE1F711F24DE9A0E1BEAEA8E835C70CDDC589773D31191B74AF780EB69867829ABED6D3FFA94D577 -pk = 40D2770253FA5B04249234638CC7F3B66B2FCE2CD2068BFCDDAB35E340498A5F031D25DC5CE0EF0D6845A89E2282C2F1D467471632573D0F3EB53BA7D4C90F00EACECBC85E276BB3E66310B654FA2CDF3F2C76179DDA38E13882DA1DDC622CB0B0E41387ECE0F741C27ECA070553078A48F4778382E65F06020F03FD70A50C00 -sk = 40D2770253FA5B04249234638CC7F3B66B2FCE2CD2068BFCDDAB35E340498A5F031D25DC5CE0EF0D6845A89E2282C2F1D467471632573D0F3EB53BA7D4C90F00EACECBC85E276BB3E66310B654FA2CDF3F2C76179DDA38E13882DA1DDC622CB0B0E41387ECE0F741C27ECA070553078A48F4778382E65F06020F03FD70A50C0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EF6CC4ACD79B20B33E2B91D1A034D219AD544CDDB0E735FB5C3451C173F22A1EEF9269AF55BB660426489B4CEECA24B61D8D84C60EF658D4C2F98574ABE7E19AB3763FCD171247B803A7933C2D2845ACC1425E1FE1257EE4EB0A0000000000000028D66B16C847F18537D84B4ED0E07A80DF8A45CFC1506564489E0768246D376FC9C79801E0D28EE46EF1EEC56A387320569E13BF9DEA11770DE607FC2E60908F820C36E2389E567227A01C3496F0065FD8A0356F6280720408FBFFFFFFFFFFFFFF205A8C996A7C011230206A47539164197C6F5D4AB1BA5A99FEED955A1BC18A575F29E5881CAAD27A9F305E5FBE276BAAB125220324691A5507F4FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF317022466ECD30EC1852F5C370271BE5E7F53EB51AE228F9F6BEEF4453EFC678B6E1F92F66C03443A7C6192D53FC70A4AC77BA5A6E19B0990E18040000000000000000000000000000000000000000000000000000000000000000000000000000C55EA3CC8EEB6D0A31A3C1A68027DD35480B999D469B6A2C48F7D10CEBF5BE77454521E7515A342B7B9485FD823DD34489D63F1ED6664F6210E6BB0FD15C2100697AD2830783E690796A3568964BD123BF0C831E1D59F7BB5EAACC597D6D1E7516F7633ECC81839495B50EC44AEF6E69E5FAAF07BDC03B57728A8BD3498F14001729AA834AB1EF34205E45F273448790829FAC160C039F6475C5B15221DA789B76BDC7B3BD8549A8D45E215ED6D4AEF17F31602968A545DEAC7E7B32460317006C4B0C8BC105C6EB747174A41433CC6E767BA7E27AA01ABCA789C094DFD82B2F16011376C74CA59EBF68C9D97B65754F4A1CBE2E40568F67A384B70451081000B42D950326FE7555C62326CC855391B04464DC025207DE535F786AAEA82BA010072D8DE165749C5FA69BDEB96C6C032D3FCB6653BF59B893F0E2A6BFAB1F1D00C968395A274368585142D4168001F84137A16E208B0C64E531C84319927D0735F32AC07E86F489ED40BB486FB3928F51FF92A9EC43B73D83A5C77097CFA60E0028292BC12B9373DFC463D1E03F378B2B1C050362D276608A130FC6BEBA3895100CCA8C8C401FDCEDE7350A8B6678169FE40AF7C6B46C9FC178BF608AEA4107003FF3118DC33043B1CB29E3F15CEF6EA05E847AE5195756BB842690DDF0694E8B6DD062313D3156CE224921FEB6D8A081404CB8852482605018202A94C9261C0063D27C1C1F941A5FDD7C8BECCA47807210021D450848AF38E9879BE4CD233790F9655375EA97F54338972EF237C05B8079B69185D73F0C6B4D2D532818AC2000513FAE7CCAADF0DDDD92496E09119C3EAB76067046EFA36EE0A960E2727D55BFE51662E07F02FB57B24952FF1339215756EB5CD5A36AD20D9564AE48646B130020068756B51D0FBFF069EE6528582BC717A1369E13F6B5D47A5E06157E1668B6E5B01488EC8B0F81A175C5CCAF2698B3FFB33DE4DA4DAD148ADE93451EE4060061452F62B306462148922285C01759D0A50163ADF9C1ED61B69EAAFBF5BC370E3F0FBF1647E5504DF535EA94857DEBA1EA32071FCCA3F89556066E719F4C18004DCDDFA8C69C5A46C77F733B5FA5F5DF6F19423CD1FEAD8657E5FB0889151B6B60506CA21908BA04F37BB69082DC253615DCBEF5B1FED9B7CE5E94A1AF192400FCF4C2CA6C94316E1FA63DC5563D73D0251711469FB01090CB8AAAA636B5DB2978D533FFF84A73E63FBA5A8A520312521A227EA06DBD45157589CF1940E31700 -smlen = 1028 -sm = 33508E5AA243705B35F49A8ADD7DECDF5CDB0032E4E40E5E408C1122AAFB5064FB09353F32014CEA58F1F41AB9A6C9582855DD000F751D1B018A2AD676C69A6B836B1BA85A2E108E92BEF4002D23819BDA454F6F38D91E45D2D157E080B901BB4F5592E9AB128CCBBE7E1FF9A5767D70FF00C6FF525E09BDAB07AF42EAEE0B7E12658E6B01B657BCF2D90BF7F9AE6F7196FC162AB3A57800DE7B9DAC23A4E60F76F2AB4BE51CFADCAC4501A37471458EAEC4ADADAB61AE793DFFB9F0B5019F82D40F83AF20C517F4955EE01B06F484FC00CAA52F3FDC8D6BA74929C6F14F1AE19B6EC601907963A0AE68220AEAF028D7EB5BB56DAA1300CFFA1B81B3D865517B6F1D518FDD97FA4B8200015B263888746B1E752A16CBEC814016F593EC09F1653325F6698C0479701A60FD0403A2E38489B017AD1F6BB5F24072B1FB69B73701B5D1E54A502A439F898A16FF900804A86EE95388DF139F9C5A84108D1E63F7A7842909B818E9A0425C257649ABF125386FB5286031E7E6D0EEB85C452E254DA39BBDA51F0D2167EC0A51992753DDFA76874AA80804E705CF8BBADF3B82B6D7FBA3D1CAD130ABCC0B44D6D893356F3E94BF8E82AC532EF8C5E5F4200207BCF6B754F14E57A889FFB753F516EF8DE2A647FAD8E449264F0BBB4CF48BD01501736DA49509C3426A3D4108B98E6A4AA6C4430E8EE76540051FBD1DFBFC01750E26547F8718EF7D897A0342BB000FB99AA63B781C9A4B831DA798C014E58725E03D2F8B1A029C3337F4099239244AA320965B2CB5075052D901B6077A18C1ECFA5F272850A475B5F6BBC83F3C09A27072F80743B23EC6A9870913EE2805B4D296B2F81A9D733E5C8D5C0B477E51F9328AF3AF8ABED960408AFECD27FBDD08FEF50F4B07959646E0A02104A69674294A79DE0B25B65F4DBFA797E5FA56D66E8BC07D5E2E7C7D2E845699ACEA3BFAC60B2C0B988CBAB949A5B598D8E2F1AEC66196E115AD7F237A1C7FCFB95A1BBD6939A250E7BB0F4A02C23CB1BD81090CB770E3A70CB081D121BD0BD5ED1DC06D61282B98BF2DD7B13D2C6CF833891C67951D7D0F429EBDE3F1DA943ADB8AD285E6F13F798D6CD9A0A06BCD6125EBAA48F8F3BD5100A122F617817E3C42EBC3C3B154258FA26B9FD886EBFAD42DEDC6A2C4F9986BAD88A2A79D7EE603554E9CFC5FE33A3A171CF7BA94FD43228019B2F6FF96A8ABBC58D2098AD95A95442F6858EB69E131D7BCADAD81B9BB69D7682A978279B631E22927DECFFBEFBE8FB2E51D46A3FCA66225D30451CEF9953EF94F30B99F2B26EA75B84935EA4FB257DBE5734454B8087B3A4E115C6D31E72709303E9F0BB8C86FC6B11B93B53F9781BB92851A5CB5DC00D0B4E15683DBE4EDBE986966FE1F711F24DE9A0E1BEAEA8E835C70CDDC589773D31191B74AF780EB69867829ABED6D3FFA94D577 - -count = 21 -seed = 5A64401EF8E63AEE18E8CC0162845DC7AF388230E86728ECB330007F2546F949764273EA05B397FE71F567E1527FA445 -mlen = 726 -msg = F5ABE373CE1F6FB14F2014F5BC0071B17AB2C84E8845FCBF4B15C79FBF2E5E06CFFE6CAD9A283014A975F81C9216B261CBC79EDCD58D0E20C586D7C641E0EE97221BEFE54DBCC56A594DF103EC24B52DDBB6052D1644972640F39DEB98997FEE7A252A65070798B7E46707FA440375B1BA705B3ECC7EAC56D9C45297E585299C7D747B430F0D01E82081C70B4A87846F90267D5163181DED63E089A00AFD33B0E2B3ACE91182D8CC899223CE65A5D84B86BB3E8B34B13949BC800F2145468BA5411EACD6A6C331C340D4442D28EFA0DA959A2797C7181BD4BBE6E6DFFD134CEF373ECB0EC08590F06BE0CE292D3718E2C0EFC7CB40F1DB26F5F38FDC82A72F81AFBBC16591EE02DC818D63CAE69FF0A28F942F7E07F6B0A741F3F0EBE3D0EA5859024AA408462D3D268C23F95D717C0A685A4CA73AD90EE923DB57CD6CDD828B7AB0D4AFA6A9AD7E32D407A44D7515C0A6AF52A66AD72119BA1DAEC6514DE3F8B462EC473072226AAD61135B0F5EC646BA9A127C9894E51FDD1B2D38011A2A6D7497A55283133695D0AF9B3FF7C5A8FD667231F9E511E3B8C4C3ADC44D02DE08C47B2382DE67B32826754C6BE5231CE0FC657341E20247CC6CE574F3D1A9376AC8237B49E5030E877A4E33CDE25D838EAD659EB1678706C759707FC66CE84CC968A8334C18F1632348824A6985A0331A93B59497B70C1A03A6848F18F5992972BC79F07F4222D2612797F495463836AE6CD3858D5B9BDF744A1CF361B5D454D41AC899A4FA61081B937CBABBF0FFEC1B31C162224EA36CA2CD7FCE54EC1A504932ACC5BD0B17A156DA7488F7017E4916A687FDE7FCEBB2901813B07964084AB0447A94DAC3A0D3FDA05B9F497CC1555A8C74838E29CB8CE89D304DEBE419D26BA7F3DC6E9526BD895495A5FF1D7EC83F70D045E306E7C2487A52CD7553F062D31888EF7FD27F667FCFFA984AFE0B9A4C4E85CA943812CDC157C5486B0B5EA6DA05E4BB8697113190321A976D1806DA129101E60A28B7 -pk = A697D28B65AC8C8E8678685BA7081EB9BFDA2CB2B1D95B0F39AD23DCCD838192328E5543E16DBD9CF4669CC0D63C4F0089FE74D99EED6CE8948904A466441E00A21F0F624B84F927340623B343ED348D8EA537D81C1D193CA336105A4A85D4428B96FB5BEDE7DF93E6C46F5610D3D5B6D4C6B633857FD59CA979D8539DD40E00 -sk = A697D28B65AC8C8E8678685BA7081EB9BFDA2CB2B1D95B0F39AD23DCCD838192328E5543E16DBD9CF4669CC0D63C4F0089FE74D99EED6CE8948904A466441E00A21F0F624B84F927340623B343ED348D8EA537D81C1D193CA336105A4A85D4428B96FB5BEDE7DF93E6C46F5610D3D5B6D4C6B633857FD59CA979D8539DD40E0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000232249EA9C1C5BB42E5830192DBBB8F02F1B9CD7340BBC8412E56F01272336C5A8E6B9F70D9EACB76DC9CBEC472C63FE271A7B2F8875989C95F1EDDEC327B85CD0E4F60E8191FA6CF55D9198ADEE370F38EDE3714D5070C8FE0E00000000000000BAED301CCD95F18A2C7564B4DB69F3688E0F8B9C0000D900986B55CB520400A645A1B324211315EB66E2E0374B35815FEFC12C14A795635D01D839F366AABF3F2707BC8E47EA352931A9AAA52954F2EBD80F5E1AFF2B9FB202F3FFFFFFFFFFFFFFEEEE8F765BCF11BC0C77D3C244CE6B7238EE8988F1E9FAEACFF752BC0862B0E6187E023460128E644D27EB4BF6770900D495A2FD3153899BA8BDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D57544C977A12AFC28ADEBFC42058A71818085AF537857CF336DCEB3E6A20FCEAD9685C5D351E1B670A03AD1019F4B78F035ABC3B7C561AC0CD030000000000000000000000000000000000000000000000000000000000000000000000000000D37A3AFF73943EA2448880DA88D784868D1A951A65835877BCFA463520A97C1FD3414931D2F1524FA1FE694BA556EDFE48B04CB74845CA6CB1E5AB4D763403002894D5C7A0FAA9C748BC0BF4E0983C242CDD9A75991352735511929C33023757BDA68318A78ECA6A33AD4C78DF99B4D3FB91DEFD7BB36194C227435E3CA51000AFABD76711A16DC5E2E4FE8F507F5F26ABA645505772021D553AE9B2B3A56A1156B8D1A757930C6CCBDFC18BC4942EF73253172B29095C30466553FB08E61200C72782A7E39FC0009011554DA67E2E55FD87992C63BC09DDB9F3CB4BA0B8CAF3DC068ADCCF3E5AA24B6618FF0B22A2ED23490B470F8C285FDFF92CC5B20C1800C3EFCC5E393CABA841638A54C67E77600D205777D0BBB05D15AC4A79A329A733B57608147B818F520A6C9F6FDF7217AE4D272712E67C703246EF7DEAD5302100BF6D01882DBDD1C72C7A3F2F470AC331F4A863E216BA2B5E4F3B95620B025F7D748F7FB44C33CE7E0A1601A6445229F3316658A4B6D1858585CDEE095CF6110042231FA12ED602DBB631B068AA2CB5DA613D15CBA1B444AC23F82FEE19FCE04998B862FC6FEDC5B81C5D370B48F9B8592FAF75115EF2E358A59E33D902BB1A0083571A91CC0E3C59C6AEF3AA7246C79A2403F2B933D1AAF11B9367FF48A1ADFF4B8C2C4D84989C6C7D672525B9C96DA3E314E1426E4E8A71FD18EB84D469140035EF6F884D299823F2AE9DBA3BE6681E507871B1DC7F3E5AEEA78747CC5ECD6BE916776A48DE405383019140DBED9ACE45C3818147356FBC5900D2EA89CA1300C9D0F4A415CCE8C71F8FB3220F62827F470C9AA68EADC37261B2EE0D84BAE1AEF1E65EC7B6E6358A6C438C2F2F75E49872F0D1ABDE95D6F19CBB03A6C69C0800CFF8FF7B3A4CC3D311AE7E3A360AA2B142CF15C78C715B3926AEF8B34CDE186AA90B8F94DEDCF968732DB9E7983FEC2339BAA02F2C04BDC5397DDF0969710200C268816CE9A6569222CEEB07C5820A8255038A4EFA3B9A92AA04CDE4D6E7940D062D51C550F0E58B807B90A134EAAD73122AF65C3D664B8E8489DF4AF0E217003C42D566C9B29EF95DD49757BFF24CF8D0E1FDB00EBB8555B65A2733E98C0DC78EDE85FACB49B2BCB4849E00F140CB6BC94250E238DFD645A60119B0EF74000063FD3E63D110FA45F254A859D58CF7AEA478E8EBF2070F4BE1CECAEABF14CBA519D74F4CF70269152822B1C59E4092B269EED920059432F937CEF2D22A651B00 -smlen = 1061 -sm = 6DED0B073F8C0BC2DE56AA255818736D5FBC01B81EA0F55C6CA606DDB9A94199EDDFAAB07800620DDD2A9B12E68E56E1746EA0AAEC89F6EE00AEE9049EF233A86D0915FD2E4FBE583BC31401FFBF81591F0788898584705A8143405F3BE10191763267606808C35C700AC26199BB07BB3401ED0B119CE7AF81925E4F1295C814FDEA6EF10082CEF86CC14185E5CE511E79AFD1FBC94FB70182F1C2F8D012EB50E880F691469D63595595008D16DCBBD69A4683EF7103D5A34F2D55D002017D05C49B1BEB65E59CBB413BC51DCF63AD6700E5BEE0E53409F8CA8F8CECC943B90082540400E6DD3FE435E1BA2E3EBBD28B50244AD1AC6900DF3DCD23383A3C299A6FEF08443E63EF9D280101FD13BF9739F20201D13738ADB7739AD2A537E7EBE8CAF930E27715793854E0690703F02013C700EDCECF20F37D5824B7E6F6235E0051ACEFE8DB22D04725B85F74A2B801F5ABE373CE1F6FB14F2014F5BC0071B17AB2C84E8845FCBF4B15C79FBF2E5E06CFFE6CAD9A283014A975F81C9216B261CBC79EDCD58D0E20C586D7C641E0EE97221BEFE54DBCC56A594DF103EC24B52DDBB6052D1644972640F39DEB98997FEE7A252A65070798B7E46707FA440375B1BA705B3ECC7EAC56D9C45297E585299C7D747B430F0D01E82081C70B4A87846F90267D5163181DED63E089A00AFD33B0E2B3ACE91182D8CC899223CE65A5D84B86BB3E8B34B13949BC800F2145468BA5411EACD6A6C331C340D4442D28EFA0DA959A2797C7181BD4BBE6E6DFFD134CEF373ECB0EC08590F06BE0CE292D3718E2C0EFC7CB40F1DB26F5F38FDC82A72F81AFBBC16591EE02DC818D63CAE69FF0A28F942F7E07F6B0A741F3F0EBE3D0EA5859024AA408462D3D268C23F95D717C0A685A4CA73AD90EE923DB57CD6CDD828B7AB0D4AFA6A9AD7E32D407A44D7515C0A6AF52A66AD72119BA1DAEC6514DE3F8B462EC473072226AAD61135B0F5EC646BA9A127C9894E51FDD1B2D38011A2A6D7497A55283133695D0AF9B3FF7C5A8FD667231F9E511E3B8C4C3ADC44D02DE08C47B2382DE67B32826754C6BE5231CE0FC657341E20247CC6CE574F3D1A9376AC8237B49E5030E877A4E33CDE25D838EAD659EB1678706C759707FC66CE84CC968A8334C18F1632348824A6985A0331A93B59497B70C1A03A6848F18F5992972BC79F07F4222D2612797F495463836AE6CD3858D5B9BDF744A1CF361B5D454D41AC899A4FA61081B937CBABBF0FFEC1B31C162224EA36CA2CD7FCE54EC1A504932ACC5BD0B17A156DA7488F7017E4916A687FDE7FCEBB2901813B07964084AB0447A94DAC3A0D3FDA05B9F497CC1555A8C74838E29CB8CE89D304DEBE419D26BA7F3DC6E9526BD895495A5FF1D7EC83F70D045E306E7C2487A52CD7553F062D31888EF7FD27F667FCFFA984AFE0B9A4C4E85CA943812CDC157C5486B0B5EA6DA05E4BB8697113190321A976D1806DA129101E60A28B7 - -count = 22 -seed = 3222E4B55D6767E300FDE03DB3D8227E19FB8B08EA9B923FEDE18D699DC3694EFFA7C4DAE2AF57E4A0162B7C564199BD -mlen = 759 -msg = 4C4697A7D8195BC7D4B8F2FCF3A7E9419E8FC9AC6BAFC5D658260511C697286BFE44E2CE98C21C98BE42E5AF0FCEEF8AA54C5770AF287A81C7481FE3391A6111AE6243D545B2A651599B45931D7640579F8659A8BD6F77260F235F71476ED64714FDDB70C549CBE089322130F7B0A21F530508970D55CBA55BAEACBEDF684C7979078102ECFFC2C3F182F710280CABC2DECD3D3B5D3CE908CB2307B00FCC0C5412A12AECD041B5F70CC0149390312B9C81592BB0E2ECE83D4495944E29AA798DE67FD69E2BD0695DC573F78D8BB48E6B8679E1C50D1E6E58E218B77EE51597EB43ECF7301D86F457353D60E98CEDC95B4A76844E889BF7E9D03503757569E40D55AB43D63293EDDBB579FE981FFD4DAB056F85006FFB5E759B9C16F5F6B235D7DD78458A73EF37118EDF599AA504E9DB9AB5DBC90B8E478F3DC1F35A7C4604A383BBBB410CFB2C5F746F83EF94BDB2F244D421818C26827D5B7D665B8A802181EB7A9CE95B6633E24D914FECA7E969F64038ACC3009B15168426EDB67AF2CCF4E859F5C616891D355F7910ACFA599C396BBB2D2782CBF1432E6259FAA77730B6B86FE0D67730152CD2AE0F9B0314048CCD25772C01FC9773EBF06618A8CE1E940F48663427775990CDC41C4DD3E9AC6EDA1EA50E04F1D329E64C8532A7AE32238C131753D60A25810A5FFBEAA9007A6984EF69EED92B777E079CE0FF48C2AEE9C18D1DB9F49B5419EC6C0E2212DDD2E2FDEAF0FE9F2B84D9C50DDE86A70FC28BBF8918A973CC67A36E97CE3027D73891E7AEB24BAF4B12A9DC8AAB5D6AFA380BFAC3703D2D32F1E40FBB532FD6D7D710DC0741DFC7EABFE55BA5C311A00E3BE55C2EE74155E3A06685071A962D7532AC76D59FC187EFF01F8D339F74323732168FA5D14F4B2A72C9164A04A6EF14BF5DEB1833E4BAA19A55AE590F542D4448E0EAFF0E0AFD2FB30FD671631B9325F4A0BAC9A43DCD2840185A2F601117A625B0DAD5503578537BE2A535D2F556F371536BCF68C0E01C96301F08E1567DBF9D8504096A8FD89C086DB695DA191099FD1E8EA94035276D1D -pk = F6C8385D095898D2ED4A5588A5B00C73E47D5D9741BC09879B4C38D57E26647ACE68E777490BDA78E65D10C2C1A68840C570C1F66567770B2F4DE95C04AF2100E5FCA2FB99615842A494F232100E71F194A957B07C72D42C0C0E9F32B4F108E6DCF922D33C17CDC64AA2D90C69DC2AF8FBD552325D1588D676EE5D6079132000 -sk = F6C8385D095898D2ED4A5588A5B00C73E47D5D9741BC09879B4C38D57E26647ACE68E777490BDA78E65D10C2C1A68840C570C1F66567770B2F4DE95C04AF2100E5FCA2FB99615842A494F232100E71F194A957B07C72D42C0C0E9F32B4F108E6DCF922D33C17CDC64AA2D90C69DC2AF8FBD552325D1588D676EE5D6079132000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001AACDDD6FD090A2B12AE175181E23874597B4DDF94DAD3027C697D235D9B3AA12C0C8D25C03DAD23B40F48A1DB1FB7F2B24B86406F5946CC1BAD5FC6E491DEEA1A3BA79255BBF9E0F2D8358A439DEC9E8C53C59D58D9D1748D0C00000000000000072B560959A7013B156D6F3DFC4EBE36865A7B8B55F666CF1E4D4D9A33F4EDC959CFF1103CFEB7FAC483EC7D10AD2A98B8E4EA289E824EA19573965D26577686928B209149003EA364FE2091932BA28837329765C352143E4BEEFFFFFFFFFFFFFFB9AEBC4346EB3C5DAE265A96C88DE9221F8A7BC608A38E379254EFD3D47F2FA4115E695015148032620A4979E940EE584184E2B0CC3DBE511DF1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF461A5D0AFD85FABB1BD91F7DD7DF3ADB0F2A9081EA32BE28B3DC6F3DB67B08E43C29420CFAC555E5D61A729EA15D5131EF26A793521F8B949299010000000000000000000000000000000000000000000000000000000000000000000000000000BF2079E87478FC5089EB9F386A6FF3553C613CAF4D245D69970BFEF874CCCC5DC9363BFE39F2DAC5B116D193BCA2F7EB9478CCB23239571DF0EB555B02E21500057A7E34D97211CA7E9E627E2DEB5F6C02061A13BBE2C544A9656388FC0C672FE1331D9B7DD019BA5E22A8897881C30C7936AA1C47DC4F435C0A44B598900300EE927C89A59BB85F2F24B94B8446E1F2E5734046FAF108BC2699E1075190BD2DA5577177C0850FA67794E9F790CA85F1410582C0E66BC17BF8923324ABB20500B4BBBB2BA4250F6F49E0E476C4C8363F3460AD2F063B4A86EEC48F0115A1E8CB4D2FAD78CD7BE5A60F6386F6C012963A87BF66829EDC206FC9B86247712E1600D4A72A9B12FF14509FD62D4E69DC9F518903167AA51A9817F8635338D6D56ED91798A2D828FFDF83376E840E578263B92DFE306A605ADFFB576020999C9A13007927DDB194AAB7A486DDE90EF82AF3647017460C950949500C9282ED7C4D13B7FE9BF8EC9C3D3973E631E9CAE5D2EECC5BAE5BFF78FE62D846DCF196FB140C0011F19389595D202184777B6D7E92EC203AA3E018B02BBA94016D69829D10ECFA3471E84B98ED65793C3D31423454EC91A5E6C8F333D79DFE523AD65D7736080050D311359C18CF536101D172544FF1BB348D485F4BA473193607702AF228C0CDEB68C510304A0A4629D7CEB81AAA9A1D00D183C86FCE3C72A6B14BDC725D1B009013DB4129CFE1CA1479A0CB0A5BB33E39DDA225293AE922751E86086C5FD275D723209EC5B619E0D770255A95413C062820D85F4CA0F2E135415CC572072000D066FF8EAE7F2593FDBFE050C13EDFC810FE25A44B5812E568AB58A19E88FB5FD8044DC743FBD94E196E986500EBF3917BAD6F661E61DDF4CABB14BD467020000575EFC5FFF4C20B21A12B79C06DB33B92EDB5E2967B0B1C53887B3C4A339BF9CC408D61BDF72F9D8C012623F06042AE3A8F1F5F03FFBD1C8ECDACE72A9D1E009FA74F4A9D116A90922E16BEBC81E7B4859F93FD91E3664AA741792DA91BB9A668A7413E0B7E5151C3E2B2CD73BC31EFDCA9FC16EE1D8FC9C057AF6D5C0E0500C566420D076B5D93EF070728A087155EF06998558B937BF80A2A2E54E81141A40299EF73C8F6BAC07885DF050DA101760E4DFA510CD7B383138AAA9BB14B1500E362B825AE881F91FB71DE412F6C5AE23E02E662681DC1A61CD7AA4C608661B30DA30EF2AB7656694F92C54D3DE38E5F1A49E98BEA697674BEC16E0DB2660500 -smlen = 1094 -sm = BAA3F3CD79293A433F8289116DC22543948201FFB94B4CD7F540C419226E93394A08EE10B200D71CBE5798959E391992A066368A0CA24CAA0081F8CE8B679E8D1DC8BB39A4F3329B22D5C5003FF55E4F24709C4226D28DFCFD155D5F8E4700BDBBCFA12027DDA88DBD873434BA4BC6E41401A869A0F68FAC716303EE4C47C3546223F11B01EFFEB76E242206C6457B607F19B0E006814F008A4014DE5A5966E04F0237F3E8ECC40E1D9001BFC36C6A40A56E2F59D151BC537BC7AC8DC10134BDFE49FCBBD258E17FD7BE672C12A312F6005DE44B3EEF290B50B2310BE2FD4E77D8DE940028B422B9A0AA20AC7B331364F36FFBEB045000FB9876EB7A065D11CC91CD2D676C52ABA151000189EE96FCFE73AA4E99B08FD871B6112F8CA79056182F99739D10286B10D9EC490703B95EF35A04D9907355B169B603BB06B70DA40020631507B1474E82ACBAFF11BB44024C4697A7D8195BC7D4B8F2FCF3A7E9419E8FC9AC6BAFC5D658260511C697286BFE44E2CE98C21C98BE42E5AF0FCEEF8AA54C5770AF287A81C7481FE3391A6111AE6243D545B2A651599B45931D7640579F8659A8BD6F77260F235F71476ED64714FDDB70C549CBE089322130F7B0A21F530508970D55CBA55BAEACBEDF684C7979078102ECFFC2C3F182F710280CABC2DECD3D3B5D3CE908CB2307B00FCC0C5412A12AECD041B5F70CC0149390312B9C81592BB0E2ECE83D4495944E29AA798DE67FD69E2BD0695DC573F78D8BB48E6B8679E1C50D1E6E58E218B77EE51597EB43ECF7301D86F457353D60E98CEDC95B4A76844E889BF7E9D03503757569E40D55AB43D63293EDDBB579FE981FFD4DAB056F85006FFB5E759B9C16F5F6B235D7DD78458A73EF37118EDF599AA504E9DB9AB5DBC90B8E478F3DC1F35A7C4604A383BBBB410CFB2C5F746F83EF94BDB2F244D421818C26827D5B7D665B8A802181EB7A9CE95B6633E24D914FECA7E969F64038ACC3009B15168426EDB67AF2CCF4E859F5C616891D355F7910ACFA599C396BBB2D2782CBF1432E6259FAA77730B6B86FE0D67730152CD2AE0F9B0314048CCD25772C01FC9773EBF06618A8CE1E940F48663427775990CDC41C4DD3E9AC6EDA1EA50E04F1D329E64C8532A7AE32238C131753D60A25810A5FFBEAA9007A6984EF69EED92B777E079CE0FF48C2AEE9C18D1DB9F49B5419EC6C0E2212DDD2E2FDEAF0FE9F2B84D9C50DDE86A70FC28BBF8918A973CC67A36E97CE3027D73891E7AEB24BAF4B12A9DC8AAB5D6AFA380BFAC3703D2D32F1E40FBB532FD6D7D710DC0741DFC7EABFE55BA5C311A00E3BE55C2EE74155E3A06685071A962D7532AC76D59FC187EFF01F8D339F74323732168FA5D14F4B2A72C9164A04A6EF14BF5DEB1833E4BAA19A55AE590F542D4448E0EAFF0E0AFD2FB30FD671631B9325F4A0BAC9A43DCD2840185A2F601117A625B0DAD5503578537BE2A535D2F556F371536BCF68C0E01C96301F08E1567DBF9D8504096A8FD89C086DB695DA191099FD1E8EA94035276D1D - -count = 23 -seed = F41B3C6225245C06455272A6A073F363E5F19F09A0B146AFCDFC2B3B0EA64BAA3F90359F32B2D1017608B03064E90AB2 -mlen = 792 -msg = 72713EA55F1E5CCD5787F172657C6F6C74081DE2D70816E8531497965DF02DAC04D91C4D09DCF8904CB152E2138F829386F4351015DA253A5B5EB92D96E537DAE3CE809443EA90332D9C754EB11F4DE586A83B5DEE7B1B9BD547EE7107530249B14279BAA04683D74B69D7BFC8BBCD447FE7706593C01188FE6AD8D0E2572D49F83E93986B380D4169BDD94E3311941DD2B041DFABC5AEA1297C65BB5C8352C99FF838D46B93B3E5F79E3CC5BE5408FE5E59A10D488DD65A997B086FDD96CEFB0247B2BAF7B490317E34330A879D04E374C92ADA33EE243D84DA015FDDEC243B00BD7488AEFE373E8AB1890273A7A2285988E9DAF9C4E7C5A17F54AD6195EDE2C79657E1BCCED0641E20F7EE26EAF53DD8C82827F2D2783D44FB030C95791F41653E628062267A5CF534DF00116C1ED1DE9F360B97555C65CDD80724104FB1BD4DA5785B5D9C24438557E48AEE58D57A03E06D553B05B67E1C8D10085C2F153647F174F7922FB8D2210454F7014BDDBC627756EB7CDEF99B6E3A2779F82088E3F2DA14C2DCB5B185AEB5D6ACBFAD43E286AAE8F84A58E8DF6ABC64E4A8EFD69FEA18DBFA6808F25FD418DE8BA923500B74E34DDA3CA6AD8DC208102DC4A876D8B8CD2926AEA4B3AE11A546F6235ABEA152DBDF43E0BCDFCDC83299207F294A707C8B4D1F56AA64A205C718ACA69B862AFE7489F11B324E7AF6BE68380D2CA6E0AF0E2E20F890F2CF98907A9D43135C03E85E86C9EE417140EFEE9054B46C110A84F1841AE3CFAFE5B4A95D6B2B606D8D0A70BAEA85C9412BC2D54146E9F866800E8E8615A0D64D1D595677E8C88699E3CA6097D47E9FE64050FB55033FAD4D5F226DA8EB5DDF99369ACC7552927ED3AC7368B9EFEA2443926DF26D1C172858FD8A5D4E1D7D39E7F7DF047385D39131184087CDC45B299BD1F7048E918223DA3F960608E853EE49EA667465DBBD889CBDA20FFBB540C9EBBA5C2CD16A22A57B561E01331D6EA6BDADBD6A5D2BD1441EF4E1D9DD11CC62A0FA5BBFFCBED0D27B6ACAF0889EAA5863DD9BB35920707B71A0805630D1769FEA320516E71CB2B125AC274F16F7A6876F4B922C7C006F38AE1F7183CA768715D2AF -pk = 915807DF84B64B55099B63FAE160B9ED1BFC32D8B1A193133394C910BA44EB8E266110B7A1827946D0430BD8C015C755895E013783B3A673697AF69F85371300BBB544A9EAE860C11344A439B53C50D5C22BEAB694D4A94D57B66144F86C56C1AD7AF7D65F636C46FA0CF68151B2057C5E8E835EE65FCF27293731EF7EC80400 -sk = 915807DF84B64B55099B63FAE160B9ED1BFC32D8B1A193133394C910BA44EB8E266110B7A1827946D0430BD8C015C755895E013783B3A673697AF69F85371300BBB544A9EAE860C11344A439B53C50D5C22BEAB694D4A94D57B66144F86C56C1AD7AF7D65F636C46FA0CF68151B2057C5E8E835EE65FCF27293731EF7EC8040002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C08F117FCF0B2D44765CE9691F89D94DB69829FB5447D901D0512E19ACFBB001508A9C02A607FC7E4FB52CBDD50839DEB67AD2866D23A15AAA7B464205431775EFDF754CC2188AA994BCEA0B48CB10BD0A67B16E2B9A990A60FCFFFFFFFFFFFFFFE5C48FB7ABD1F95A7ACE0457E3F394213C8226C39185FDFE34FB8CFDFE7B5B01D2CF161E44C3B59BF80D9FA32D630A10EF2340DC4A15A12897891BDD8E92C9EA2E2978DA77BCC7069FA1C9885B7B107D14BF6CFE17ECBCE1A4EDFFFFFFFFFFFFFFA3815B1ABC52CFD8BB5BE7F264750FEEFAC34CFB7DCEC96E1F9B6760759A52CBE092E9972FC289D7DFD11362F0D2D701523D1BE30B8F1BA5525FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C59B5D06909A08CAD7B1404B846A1697128C6DE144727240C4C901EDD752323C2C1F38E8D6F45ED9F9211A6328683163EBE10F2ED20F2229AE802000000000000000000000000000000000000000000000000000000000000000000000000000043FC75856E29FBFB6FF6FD11926F1FFCC7F4F7575C2AA5EEA58E34A38FDE233D24BEEF376C5E77DD4A9B60EC1224143454FD98FA2EB700715A1FA8B0240A1D00B44AE741C77412411F966188A8D1E3637ADFCEB16B5D3A60B3E42AE3853968FFF63E0DA05C13870D3352BE5A72DEA71B1A4256F1893F55EC9980249BBCDF090084463975DC41416353F4AAA8049CEE5C27F15DFB848F39FFA30460CD1A021FAF07A841C93C67115E513C9DEC41A5E64016414AA0A41C548527D591D0DDE20F00649C4A58E62DEA7C0D4DEAD7AF15D0E06BAF1C66B20BA50E1AFAC28F6371EB605A6A78D09BAEB8CEDCA5F5FD63BEC229EF64639705AC2F2C20853154DE890A0022E37971A452B2855555AD4518C9E115CE91B16021384E7F8DD1D81BEBFBD519767A1EF3071E765E5816BA04F8DCB865759C35770A69191F857F85CB5483170049474A9BA8CD14C6BD5BD405C8E9B33474D830F5D9E2FBE0545DE13C4AB9E59D8AE6BA137C0977A9F357E4822032CA24F3B952376F05AB0F3144AA81AD6903001FCF6FC0553D697258E8AB5BC4782262DDF4F085A36C48264EFEAEC3FEECAE01877A0D1CF55E47EC6FB11FF61F11694DCAB43B663A2F5D8A2279E05C74C91B005D6C2C3707EB9DE63C8AB094C1926E1E181385FCFF3EC5A3BFCD7B61CCA16E28161E1CF0F9A0CFD458E8FBBD0B6D72B1DE3408BEB4CBE69C335E71DD6B4F0C0053C5B62BF77D4FA0BE429E79D6BA7C873F0A29ABF7A4895114D8910103BA642758E1A4385614D1C932F81F8F150DF61E31A4BA3C9D27BB4DA0FBC2F99050160047011EDE609A540B19A9C473A8962C57721A32976DAF9D324D13AFC85D36514E0FE0D2508F5852C133329A2B9FBDE79186C5E1CA9E44133B9551980E74FD0F00240D4A589152C5284D1AD1AE2FB4807308E205A85AD7B0F285D78D0D49B3F3F860620F22652062B0AF9087D563F0D73AFCDD92025CC0C0C3083D28D87C32040028FA8E4AC27A8F470B43A8F43738550D4E797B81A18312C4D03E18045134BA622F530BC5D05BE94628D5F296473DBC497FE5802EA2F8FEF0040E49C4DB811400841D9852318B5666AE8521EB6D32B8C4D7923EB16A681911DEFB79BE7283A49EFF7552F31A1555D148BEB0D35325C640C55DD8C840354E38A9FE480437A80F005B53A25223E319B5A5E247CF03257123E36EB91171739E88CD8B5A9B67A18B905AFED19B38085BE89A6017BB412F085BC725E47D5B6303D3B5B12E0C75F00D00 -smlen = 1127 -sm = E3871E411536CAC52229A7047554E5246629009B0A2287BA8BBE6BC2F43AB056AA530A11CF0043637ECC6E9F64382D9FF214208ABEAEC20901269ADBEAF5AE4F936A5B099A4408D8F417070157D77AA1F01017EB18A93BFC52363EDAD80B014690071EB84C3049533592157485478D1C55003EE7A9AE7F8C1540C19998935BDA173B6D99002C00F4BE8EE3CAADA8BE71FEEDB2843BB566009123C3361E9D922641FB6406A86D4C071087013EC9918F0E1EFAF343A15EAC52C50B55AE6301FE5125CEC9C22A830C301C07571F83A70B8600A409F5158BBE00937EA591941A73E98FA6350051A65419FC272A348927D30475D687E82C2E00E6D612BC7EDACE8826886CCC2DC503AD38120001A5C0001C4547822C738B38A90EE8760F0B0E41C31B105DD0DA70ECB62BBF15BC02035F5C3DB7D54405B1E179746F23B6AAFCFABD00B925D4A1833AB445086FFB43DE2C0272713EA55F1E5CCD5787F172657C6F6C74081DE2D70816E8531497965DF02DAC04D91C4D09DCF8904CB152E2138F829386F4351015DA253A5B5EB92D96E537DAE3CE809443EA90332D9C754EB11F4DE586A83B5DEE7B1B9BD547EE7107530249B14279BAA04683D74B69D7BFC8BBCD447FE7706593C01188FE6AD8D0E2572D49F83E93986B380D4169BDD94E3311941DD2B041DFABC5AEA1297C65BB5C8352C99FF838D46B93B3E5F79E3CC5BE5408FE5E59A10D488DD65A997B086FDD96CEFB0247B2BAF7B490317E34330A879D04E374C92ADA33EE243D84DA015FDDEC243B00BD7488AEFE373E8AB1890273A7A2285988E9DAF9C4E7C5A17F54AD6195EDE2C79657E1BCCED0641E20F7EE26EAF53DD8C82827F2D2783D44FB030C95791F41653E628062267A5CF534DF00116C1ED1DE9F360B97555C65CDD80724104FB1BD4DA5785B5D9C24438557E48AEE58D57A03E06D553B05B67E1C8D10085C2F153647F174F7922FB8D2210454F7014BDDBC627756EB7CDEF99B6E3A2779F82088E3F2DA14C2DCB5B185AEB5D6ACBFAD43E286AAE8F84A58E8DF6ABC64E4A8EFD69FEA18DBFA6808F25FD418DE8BA923500B74E34DDA3CA6AD8DC208102DC4A876D8B8CD2926AEA4B3AE11A546F6235ABEA152DBDF43E0BCDFCDC83299207F294A707C8B4D1F56AA64A205C718ACA69B862AFE7489F11B324E7AF6BE68380D2CA6E0AF0E2E20F890F2CF98907A9D43135C03E85E86C9EE417140EFEE9054B46C110A84F1841AE3CFAFE5B4A95D6B2B606D8D0A70BAEA85C9412BC2D54146E9F866800E8E8615A0D64D1D595677E8C88699E3CA6097D47E9FE64050FB55033FAD4D5F226DA8EB5DDF99369ACC7552927ED3AC7368B9EFEA2443926DF26D1C172858FD8A5D4E1D7D39E7F7DF047385D39131184087CDC45B299BD1F7048E918223DA3F960608E853EE49EA667465DBBD889CBDA20FFBB540C9EBBA5C2CD16A22A57B561E01331D6EA6BDADBD6A5D2BD1441EF4E1D9DD11CC62A0FA5BBFFCBED0D27B6ACAF0889EAA5863DD9BB35920707B71A0805630D1769FEA320516E71CB2B125AC274F16F7A6876F4B922C7C006F38AE1F7183CA768715D2AF - -count = 24 -seed = A08AD391E0FC57A83B74CA8CF44DB67F8178262ED9B20AA0163CDD8274AC2BE05F558B112B094244370C1AAAB75077E6 -mlen = 825 -msg = 209658CD1D801079FFE8E950BAFD70A028CFCC35B9FB00D232C5603A1D51BA13E5DE59E0277962C4474E9F3F60FCD99C9B79665B3839D5C037B921A4DE8E144FA1D38182FBDEECDA6934E814D9186591F01C5E23349B34F4439B4D402C4072CB4D702966AB473D2C39443F41FBDD0C48E566D33E076422EE72FB47B2FFD661F367E9EFDDC988BCA02382EF93590D4FE3ECE8B1D9D8B3A653219C7D131B43E2FDE2851541F467C31129E6F9B9D124221CD52610B9F138EAC1D01F193148FA0415B29F5C86D15067EB1E26C9D51F05655E8545F734F8F244854AD76C6B04C230898BEA33EFDCEEF100D79F8E3B894BA583466749B82007067806E3A7B3BA954F6FC5ABFF0E099A24D14D865F6F4538736124ACC5EAD4169DDF2144AD558DA3C74CDABEC147D2AFA113EDFD1E2280766B18792310FB6B4FE5D0D9F65906B1CC43655BB3D6178EF9093AC9C8F1A91BF49008179394EEE79E1D8E3228F567770C1BA1E30BA4BCE2465AB68F53CE21C0D8AB2F6E535828F211D4DB957DC3AF8B7E00DABD8F1F74C959B2AFF45121C5B5ABD3136C6F55D5F5FFDBCEBC3CD7A430FF3813D23BCDC1254FE6949DA4E7694028B7FCB876099E91B92C65D85C39D4BE9325AFE81703E5B18CBD7BD9EB59A9BB9408ABD966ADE9A60303807AD1B2C14C04CDF8FAE6950A55B21C9EBB5E94713BF8C2890215C5DA94B59CB31EDC671093B15FF5014DB4CD3EA8060260DC1612E9FD6E5AB40F0656121F689C8E94212269A7B24305C83BF0583418755CE690913CB081F2893FB42BC4750F2C053C48C1552430793CDDE1A49AC9E21913210D727C4BEB5640AB9B7505EA4E59AF417A085394181784BF1BB0BC32BD71CC57CE77541581F14B8BA4B758500694796262B561A38C72893C77B548D779A3833EEB064CDDBA5471CBFFBC769E139946155BF376A56415AB743DE568CD21895ED6951B5BFE1B1629DD6510DCD4483F206954964E0517546DD96900A2540A51835818D1730B0C9123E7FD8B28E6843BFFB659945A273CEA944FF6E83C234B3E43DB4630614E0B67778EA760EE341FE68C525E90475A1560821AE6B2A85015292C36EAA2E041AC04FB55922C48204525187C7E0476A9FED04EFBBA96F369D8AE709506620127FD399613A9796C4FF96D7E -pk = C182CD2D327D8EFAA71678CC86CCF150DC5CE36F3D4C38C301BC3D560A653936848DA87B16A78BF3549F36D7696DD480D70826F1F4A4EBA690D778EF2B440800C29E6E841067C69400C229BB072BAD862C687CAB1BA94103CD829BF9940EB290291942636C9762455AF7C27962A202DFDED8EC19097C3C90248FD5332C6E2300 -sk = C182CD2D327D8EFAA71678CC86CCF150DC5CE36F3D4C38C301BC3D560A653936848DA87B16A78BF3549F36D7696DD480D70826F1F4A4EBA690D778EF2B440800C29E6E841067C69400C229BB072BAD862C687CAB1BA94103CD829BF9940EB290291942636C9762455AF7C27962A202DFDED8EC19097C3C90248FD5332C6E230002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B10111B233C0F6FB8BC3B414752427D8EBD9BA62D5FBE171ACFA512246AA5BE6EFF02DFD6421B51B5ABAF616F6087806F368738633396366A2C5CBC4FAC460CC2C7FF639119E8C6B8FD1A1D5AA2CF69D35F5E6162221B3BF931100000000000000B6B99534A3A842980DE11B154D616DD9805D66FC0A4866724DBFD7E23734118D677A57693659B6DAE456299D28979857C9CFECEB6A19A39317B9930D746FB66C83C41BFDD44889834CA09F04B6701BEF1900F67D6FF018CC0CF2FFFFFFFFFFFFFF6A8D2B8252F738E75CBAA2668B1E7B061EC2C082A2DAFA84D8625777FC5D854F50E47D2C1B7BC12065A0824F68BEA38EEF2C526DD398052E9FF2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71E4F308CB625529B5FE8CA438048E583C37F8055ECE41ECE6F0F0616A34E308C9E59E8EA7F446B80716CB371B0B5CE211FB86BDC6F8605EC255010000000000000000000000000000000000000000000000000000000000000000000000000000D31CD69F96FEE325BFDC2EBF782C076AF68F9E278D4098DD2BB12E103A0F243A385F33F9406BA9CFAC637BEC13BA4441F7B936956978A24B225E2641D3BE0700F6CB37AD38162335CC7D7371080678DE7824F92FE6D297CE363147B0B3CC8D1A8BEFBF6DB699885137D916DFAA20D6F002FE2F108A43F873C5908C4BCB1B1700A28A70F1934833A167FC42A6F17166F94808352EAAF17C9E9AD26F6BAA9BF69ED7E2A1E6839CEF21817187F0680A8E621879D22B417910F3763BE58FA1D901009742974C672A1AB9EA7B574FD347EF21420F7E42F01727FE2C43E539A729EE0BA8C29B681246E978FB4F1F53BECA0BC0C788A8FA400E37597A87059454B70A00915C3118997DAAC6AD38486AE67A6FF7D229B9A1B771F2B699DE4268ED43586F5D19BC0D7205B9E9D75713C05B5BB8285771045933B59CF699A4EDD4AC332500894E5C8C0964244EAF2534E153193CD3BD9A3951330780D9A0A923259891338B5734563C6DF3AB4F753DCB2904BFE36333DC6D10F08055238504934A23D2230090A928BD9FE7E62AE8B7226A99442E6EB005949D53587D70F72721552953BE60C03F97136A90DFD35DF73C1158CA3999E5673970D2AB6B2ED6103E8C43F30E0030B321C3912B36C8462C095BC099750CB297E9DD7AC9BE867EC71CC97CBAD66F367AC03F1116967F6D33B56AD5FE49CAF4017C7CC0CD4E7FFD63629AB7090D005AB9BF40A652287DBE9BF720AA933165F598B7C4952FBE9FBC4939DDB0158D8F9D50B3F673A4635A4657DD289AE3B34A2F5A5D3DF792267C1C534D51E4E01D00636939A4C96E99FEF9E1A647F2F3D3D5F3C6C2F3397C8607EEDF782CC04073233AFC3269C0A9C76C1C69AF6D9C21C6063D64881EC74D042A930C8D2783AD1C009DCDCE118428BB8D69CA63A2ABB428BD3A736F916688FAB5671111ED88486F2D5C861C7BDE4F037A923C6AACE0134B0132A402A1EE33BF9BEA45A5C7EC771C009DE6D9D456A3B722AF308B769AEE636EF836C4BAF5673FC1AD3DA7F311DF39677C9C9D425E211FE98536CC3ED447DA74174A3E6A885F09E67AA5FD0148DE1300A326E5F4EC285D474B8DF040CB8A090A3F95389AAB0E96DD4119F81771D8AA3AC791B7F3D584C2327DABD64BC2D35B95BA6E9FB4502EBCF6D941C1DBF82817004EF53A882842C2E23C58329B43CCC4624EB3F45886A80C4108ABDE26A2EFB65F0F5C9B0EA28EA8678CBC12B7C81B18D82E55A205E7F89173FD2757604DE80E00 -smlen = 1160 -sm = 7E3B61900E5CC0499F5FB60EFB397CA2CCE800613F07A32F90273714BDE5EA92F2FEF9CEC3007673ACF4E97AEEC7B3326EAA0555AD23566E0153DA4D8D060661EBCD191AC7E3BDAAB48EF400575E7DC749160A44815E29FBEBF477DE90C001980483BF2A5A48B42392030222B9365E30CC0089337157567D014843078D9762D7F9477126007498AD731773D271E2A84CD8F46B71EE653900E5CF3FE18C3EA2C17478CD2A424D9FE9A63B00708EE68179236CDE42FC7F8901329DC4956D00C7C63930B93268D7DB9E10D41251B2DD1DA70001125EEF2BFEEA6AC35A63811921CF64084A00C17BE147CFED70931968404C70408F60E0A901AEFD747DA08D94036D14F052F8872797C8BB0000D923AD54217FF6AAF605A3CA86B6969A73B70B9DB7F8C7F5E8D4B14BF73D2AB002021C7DB87B2E65AC810764BF9CFD5C3DA5E9F30121D6DD031EBA3AC6965E5D3C543700209658CD1D801079FFE8E950BAFD70A028CFCC35B9FB00D232C5603A1D51BA13E5DE59E0277962C4474E9F3F60FCD99C9B79665B3839D5C037B921A4DE8E144FA1D38182FBDEECDA6934E814D9186591F01C5E23349B34F4439B4D402C4072CB4D702966AB473D2C39443F41FBDD0C48E566D33E076422EE72FB47B2FFD661F367E9EFDDC988BCA02382EF93590D4FE3ECE8B1D9D8B3A653219C7D131B43E2FDE2851541F467C31129E6F9B9D124221CD52610B9F138EAC1D01F193148FA0415B29F5C86D15067EB1E26C9D51F05655E8545F734F8F244854AD76C6B04C230898BEA33EFDCEEF100D79F8E3B894BA583466749B82007067806E3A7B3BA954F6FC5ABFF0E099A24D14D865F6F4538736124ACC5EAD4169DDF2144AD558DA3C74CDABEC147D2AFA113EDFD1E2280766B18792310FB6B4FE5D0D9F65906B1CC43655BB3D6178EF9093AC9C8F1A91BF49008179394EEE79E1D8E3228F567770C1BA1E30BA4BCE2465AB68F53CE21C0D8AB2F6E535828F211D4DB957DC3AF8B7E00DABD8F1F74C959B2AFF45121C5B5ABD3136C6F55D5F5FFDBCEBC3CD7A430FF3813D23BCDC1254FE6949DA4E7694028B7FCB876099E91B92C65D85C39D4BE9325AFE81703E5B18CBD7BD9EB59A9BB9408ABD966ADE9A60303807AD1B2C14C04CDF8FAE6950A55B21C9EBB5E94713BF8C2890215C5DA94B59CB31EDC671093B15FF5014DB4CD3EA8060260DC1612E9FD6E5AB40F0656121F689C8E94212269A7B24305C83BF0583418755CE690913CB081F2893FB42BC4750F2C053C48C1552430793CDDE1A49AC9E21913210D727C4BEB5640AB9B7505EA4E59AF417A085394181784BF1BB0BC32BD71CC57CE77541581F14B8BA4B758500694796262B561A38C72893C77B548D779A3833EEB064CDDBA5471CBFFBC769E139946155BF376A56415AB743DE568CD21895ED6951B5BFE1B1629DD6510DCD4483F206954964E0517546DD96900A2540A51835818D1730B0C9123E7FD8B28E6843BFFB659945A273CEA944FF6E83C234B3E43DB4630614E0B67778EA760EE341FE68C525E90475A1560821AE6B2A85015292C36EAA2E041AC04FB55922C48204525187C7E0476A9FED04EFBBA96F369D8AE709506620127FD399613A9796C4FF96D7E - -count = 25 -seed = 6E0A8EF5156D693FD0140BC4A31084E79773A83F42C8D133AC8A9D62DE3CD74511F893DCB26041E6B35E2B175408FCE7 -mlen = 858 -msg = 8F37A065DD696AD437EC82909261B842EC0A3E66F8AC574105A3C82EC8B4926F2466FA550F8EA1B6A9A142C00AFA44BE6512A85350930DFFC99B95AA21012057051B68C48581AE439B9290A163AA4B6AFCF80FFB91A3321C7B9ABAD56D5DC1BE4E67E5576C9F3A7DB96071859B94EB22A73DD96C66AE67AB11D1AB62A86D826C682DFB8CCA3259DCB5B34BE635421CD4206E7D92147F14C36424EAA407B441F58E5C187E58A26B2AE144888A3CC1387AC7D0A681EEDDC3B7781AB282E8185CCF33FB27500CFD119E0415DB1E45237520A868C8457C88A1D3EE97EC9451DA35D7E74924F8902949E7EB14BA87C8AC672D7E4F3BEC1B2814DFA67A8DD2E2D4FF4661D64BC4C6D6A78D4E489689B6063CDFF5A3F1554501B424284A9F4B8FE777FE4E6AFB83A85E36200A9AB40B9C18678454B2A3F50A4862BA1E36F0C57AD004FF90192B5619614E37DBB38A1B8A65AC613F7796C70772128377065B84F122540106D1B4F9123C4E009B4C0A85D59B35F72DEBDDD154ABEC7F3FB25FD1FA04367386098DE610B26FA3ECB031A6072D14607E92FFBE195ABFF71E586A984131AF24E18AE94DBAB0544FD2AD217960F337111BFBD4046809EA03C7C47B7177757A4A43E1FD0134859BA735A8FC17597E593BB58322136602954D3A21096B0D1DEE5CF0AD17A5FCF561FFA21CAA70D33998840E4CFA18BA481704A8B82D2CC1C110FC9A6704751365AE9F338AFE4CF9C811697DDDFA8635A2F3CD02DD1845251014BF2F2D6C02A907BD783207C4773A937048A07C500D7C424B5F65A2C376523740DF9A0B60437CB8AE17D64DD51DD4E433AF83B20C4B6B890B97976DF09E3A86AC19006C229D59FC7A2923245B7B1F0ACF7C42E486D41CA1AC1D7051AEEF6003CE94182F97D099C74317F61EB47AE18C2BED6A3CB253C21EC835E435123E0A657ED926F880CE8E5DE3155272328A467278F52AC50A1121AE818A3EA3A2E1F7401CE23AAF66A4AC289748A7E98A5124C586D8957BB4EDD3F091492BB1A64D75EFCD45AD51CA420F15DA848B20DC6BB765E7B71359B3A9E95E121266AE4A40DC2E9A3D81EA1B1A643594B3D4E6ABB7D1202201DE92BDF0CC1ED977E2D5851822A01F48A6F23180822888CE345AC9BE0CC69BC448D41CA20B79C35B1DAD73E6C683E70C4439B404CBF07FCC39B0E5A1D33F3717A6BAD28A6DA4F091BC7A -pk = E1B10708F7CB0B566F7A2B73C514D89313F2A23BC3AC034BF53CD0237130B94C888B55200E32B37680A7E2B68BDC0EAB554DE0FA66D651D76F1016D4B0AB01006FD12DDCB304364C3ED3F571A93DD3AD7997075BE4ADB37134687D627CA0A04CC4D237FC5FCED327178A1C3C99F09BA9D0416D3ED54DF85CC50C8574DB7B0F00 -sk = E1B10708F7CB0B566F7A2B73C514D89313F2A23BC3AC034BF53CD0237130B94C888B55200E32B37680A7E2B68BDC0EAB554DE0FA66D651D76F1016D4B0AB01006FD12DDCB304364C3ED3F571A93DD3AD7997075BE4ADB37134687D627CA0A04CC4D237FC5FCED327178A1C3C99F09BA9D0416D3ED54DF85CC50C8574DB7B0F00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008A91A98CD3B9425C73B222E52BF08BC0F2A16F4C12AD1877A54277C820987EFACE9B45812385C6C8E390012450DD7BE2E25ED0C5F8883E8115EE209CFDCCCED413B58A3DFE6C8BF2F8A329C56E37A96A93B033E3E15D85D51C060000000000000089FE2F5C0B5AE9519856B0A873EC963EAD5AB27D213DC676913A816CEB1C4BC8FC2F8FED2E8C9A3ACC697DFF99AA74404DFA3C8655EE2D516C3332472497244D36FDC94B2C69083E9F125C2A2376F5AD6B780022C94F8A0977F0FFFFFFFFFFFFFF19B2104745E5EDDDDEE40765A347331A755200CDEDC5F3EF33C7396B57007930FC16F8D4039198FEE8E265CD3C48F969EA0521E5C97265F8CCE9FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12C7A00289B20AACF1C96FB1F61134FD3EF2C3DF9244BCA16373CD90F21C90599E49778F82E42CE2D372FB46B0DB8F06E5973DBC14AED14614D60300000000000000000000000000000000000000000000000000000000000000000000000000005FA71477CBF1795001FD571F559FD8EC2E247D46D9661A5699B1AD32BAF63E027E25E1A9547C63467C1425CD53EBFAE0B888401660251F51483536B928550100AFD6FA00A9737A1789A0A2F9669B996ECB81F18421375F0B0E375CFE7B09194D54052413030119B9D710ECADB81EC5C15CB8B0215D84D6896FBDBE2555A10F00B60ED309CA16FDBC564DF280B8EA4C5E1E7317A6270F10CE9C57D7B9A820E84EC0241F34E5DBE3F527CA70E668958CB49347E2170CBC44460DBE46419A510600A7E2139A46E250129E622F92A2605BD30B285913A9E6930F988FB6AA9534D31BF598A8CA4EF888B0425B2ACE89E0D7CC4BF94C4BDF788379E2BD6E0998511400FDE542D0BE8446249C1A97EACCFB8652FBB846D0F1E108E2CFDCA00ECB8BDD5BE9124B70E19D42C01E4F9AE7E6F3128379B49A09D03B5FC76BA480EF60070200C6959751BF2AAE856AE97388A6B5E0D5651C4FE0AA99C6EB0B8BB472F12317EDAE8BB50FD5420A67DD7E7BD16E5B0126947D7089BEA3A6E22E027BE0B3EA07009EDD44A42E7B99945D86CEF529BB1646E103164AD18E33BC302840581A6B8608DEDADC14A6886F7F5639E1BAEA6F071F1CDF5D208FC6C37B7583BBC402271B008E4DB1F9669B0122404DE912A1559E82D7433FDB8C5B454B2E732E5A3277FBB49F1BC7535FA1DBCCE419E048C0A9943222CF9C8CA1EAA8A475859608B6722400DFFE1BE045EF7FD41D676A62A18DA1EED42B74EEB44725C76CE5177109AD4DEB19CE85514241A8DCE04D012BBDCD41F376EBF1EFFAE6CFE82A6EFF11B4F80600A2C2653769F43B5BA08CE1CE84515AA43323DFEEB6638A56575416BE759295E99DC628E2F9469E305563EC1320C7553E580F0516C02137B78DE083E3EF1E0E0002C1AD135A82E8B1F681D1E156C5F371CEA98C5B7EC08DE1E1256B5747163A11D75B957D5A59AC3E43EABD99D0FF93A2F4CDFF9472C6626F9D3C9FB0632724002B01C50386993A52BD4B64EF2990CA663009CF0E461E384433F09FDBC6718AB592FB9E6F222CF5F03B2AB6D907C8A6672DC5FF1B9063DEC2D9E69A1B52FE050023761C506FD622D0BEA5B7A90633A9C630646A83C0B41DE345FE25317D1B17E4E7A4A8AAEE35C2008E9A17C0EEF50C5BA4CB66CEAB09F64AB1AF59701BEB19003BA36A447ADF678D1F0961897726F8EC0F2DEE7314CAF8209396986AD3FE9FAD33F4CB8DE954453BFA5180FA0DB143BA61F0BB9DF34022779E7414F166AB2000 -smlen = 1193 -sm = 0FB551F2B18342D5C3636BCAC3DBC6CDF4030150E44C554B5E492F24EEF19CAC1DFD0DAA7F00CD23BFA5370EF1F7892DF61D239BEF5FE1E600550647F682157737F56DB6623B03CDC9EADF019A1DA65DC79CB7AC3F7F672FF8D2FB40C08F00683ED19C7DF5BA27B19E2E1964466AE2939700A7815B92CE880E82EEA40290A83A7F33B82C00EFA3FD3B3A59DCBA6EDCB3BE9806B22B0D7F00903957C71F4A35045502A57B6EAE1F789912002DAEA468E0D68748A8C4EE19537E31FCD920004A9CE6BD43DBFC5431625C293F647CDF3B03003975DE145B2BFC729A2BCC839D2CA160B6A50034A5A90406E5C0E54BA39311FDE1CA9E47D2004B087732227563C7B2CC5AF72FCE1414D1620001C930B1F0BF1B93581594270992AFB755979B6C7984F17470968681511AD7F36403032442E84CD20D7482158612612F89156089B50117AEC3DC3CC1EF232C0A2705E15A038F37A065DD696AD437EC82909261B842EC0A3E66F8AC574105A3C82EC8B4926F2466FA550F8EA1B6A9A142C00AFA44BE6512A85350930DFFC99B95AA21012057051B68C48581AE439B9290A163AA4B6AFCF80FFB91A3321C7B9ABAD56D5DC1BE4E67E5576C9F3A7DB96071859B94EB22A73DD96C66AE67AB11D1AB62A86D826C682DFB8CCA3259DCB5B34BE635421CD4206E7D92147F14C36424EAA407B441F58E5C187E58A26B2AE144888A3CC1387AC7D0A681EEDDC3B7781AB282E8185CCF33FB27500CFD119E0415DB1E45237520A868C8457C88A1D3EE97EC9451DA35D7E74924F8902949E7EB14BA87C8AC672D7E4F3BEC1B2814DFA67A8DD2E2D4FF4661D64BC4C6D6A78D4E489689B6063CDFF5A3F1554501B424284A9F4B8FE777FE4E6AFB83A85E36200A9AB40B9C18678454B2A3F50A4862BA1E36F0C57AD004FF90192B5619614E37DBB38A1B8A65AC613F7796C70772128377065B84F122540106D1B4F9123C4E009B4C0A85D59B35F72DEBDDD154ABEC7F3FB25FD1FA04367386098DE610B26FA3ECB031A6072D14607E92FFBE195ABFF71E586A984131AF24E18AE94DBAB0544FD2AD217960F337111BFBD4046809EA03C7C47B7177757A4A43E1FD0134859BA735A8FC17597E593BB58322136602954D3A21096B0D1DEE5CF0AD17A5FCF561FFA21CAA70D33998840E4CFA18BA481704A8B82D2CC1C110FC9A6704751365AE9F338AFE4CF9C811697DDDFA8635A2F3CD02DD1845251014BF2F2D6C02A907BD783207C4773A937048A07C500D7C424B5F65A2C376523740DF9A0B60437CB8AE17D64DD51DD4E433AF83B20C4B6B890B97976DF09E3A86AC19006C229D59FC7A2923245B7B1F0ACF7C42E486D41CA1AC1D7051AEEF6003CE94182F97D099C74317F61EB47AE18C2BED6A3CB253C21EC835E435123E0A657ED926F880CE8E5DE3155272328A467278F52AC50A1121AE818A3EA3A2E1F7401CE23AAF66A4AC289748A7E98A5124C586D8957BB4EDD3F091492BB1A64D75EFCD45AD51CA420F15DA848B20DC6BB765E7B71359B3A9E95E121266AE4A40DC2E9A3D81EA1B1A643594B3D4E6ABB7D1202201DE92BDF0CC1ED977E2D5851822A01F48A6F23180822888CE345AC9BE0CC69BC448D41CA20B79C35B1DAD73E6C683E70C4439B404CBF07FCC39B0E5A1D33F3717A6BAD28A6DA4F091BC7A - -count = 26 -seed = 49CC05312D1DBE216FF03B60575017A6A1464C06D2C5A4A6F973AD9F275F7C66163A29A803BE759B117043862D277C27 -mlen = 891 -msg = 30D61C6FBD64113FCED8C5205026EBAC0D9F3522182617CB00B6E70C8DA62ECC1BBC8E1FDAF17CC61DD01CE85A9072CC1D9D34FDADBA5B93E0AAB4C9C4C9E26D3F7F145FCB23673B6E0B373C0FD1A58F52486B72624EF91A539519EE5305772A006E49521744912BCF3CDBAD424F00428AA96CCC21D000EFB09DA5CE652E361A6FB649A060835E3B9DC9CBEC660C7531620115EC905DCA6EE2A1CE36554C0FC1D6DD6863B8F3843508ED5C214B6923E7F5C0304E9B0D5E5E433BD029116A33A60CB980737AC950577D0594BFE0AD2225CB8D3FA42F192B0EC05A49391632A32FA931C0FBD83A7B6EA24301AD0906E7911F9D900D19AE1247ABABB1C0E9B9BD165185D9D7413EA068FE8824CCE5B3AD51FE8E2BB2C4022C61B002C1DF4852E4910F38613787CA12371038B6364D920E07B4B417401253451DDC25624B5D038B2DFE29B8494EC960F87803CAA256A95C9868AF819747E4BF26FAABA6DDBAED93A7815C795AD5EB7FB4592DF678AC1375388CC7ED3A6230CBE80ABBB113C80B70C789CF0C66B943E67CE814F12D3D83F3B90A4320FEB7FB81DC93B05D7FE2D36584399214D3D7C71AEF322A5D04B5470703B3660BF86B0B17BA9FF23E45F7BEFEC3758786D2111C81BA4D81B83FEEA35A0668E5EB3694963BB4DB3ACCE4FCBA6F3F6FED9627580DD2D2DC103EF7E52BB9745BD42A7FBDB459B5C8AAEBA67686EB899E3177FAF0897C61B008ACE3304C41B4C79E2EF9C865E9958D8716BDDB69154FB33187D927B5296C1589FB1AE3D553F116FF6CAE56910CE6717C446B9947AB2A981A8F5999C1C6E517EB3FE584F5D10059910E22F40FBDDB709C9F686F51ABF7D7206A8BAB4A346B51523C362D749238D7EF6671A89CD86A8540604F134D760267E91EB92FC0FC275CAB69C776EF81DBAD35027E5307F1D34EBF5D6E4DF424D709666A1E649C044C4930098B2E6E3782A93976B55073C504563C7E052B6816C07F0FD54A759D2BC189FAC3FF54549FC4DE192EFB58A9E301863A77380967735910F63D35EF5FDBD8751DE4BC6BF2E3095628DC7F67C1F5571D17AA342593B2C7F953C3F0F22DA1862122031BBEAF0D00A029C043304E3E2609C4FED8A7404FA10E2EC846A70EB0E37C5BE61E698CF2296EC1FBE6FED75F6FE3113C23B29AFB5A6D7E3A9E46E2D89D8C06450CEA11492C1A97F7D6BE8FF6C014930043022B264FD32593952BC606F779598631E48EED86EC2A013D8EB866F311A400 -pk = 8B1EB9AFD25FECFCABCC5CAC544B2DF5C780FBC0557037E02239EE781A6DD9A560119FAD18A5A3888284B170E618D0734EDAC1BCBB0E04480DFCD4C7C2120300BF9E72E9A80BB9C4A467562B028F1E6CB58B87C27F0FD63DC37555AF028CFD8828BE94F9827C3B47A998BEB8E92D62FF53CDF8FFDD4B1D1F533A9E83FEC81300 -sk = 8B1EB9AFD25FECFCABCC5CAC544B2DF5C780FBC0557037E02239EE781A6DD9A560119FAD18A5A3888284B170E618D0734EDAC1BCBB0E04480DFCD4C7C2120300BF9E72E9A80BB9C4A467562B028F1E6CB58B87C27F0FD63DC37555AF028CFD8828BE94F9827C3B47A998BEB8E92D62FF53CDF8FFDD4B1D1F533A9E83FEC8130002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E2203BC814603607D7D36D9C7597DA4CD4CA48B3A089B8D73BA6525D3BBAADA84F40FCFD48D73B54CBCF46452B3DF9ACC76F4B38F2C5AF99FD40109E1F15D6E1039A857C3AE7806638A6021A0A07FA7DAFF2CFE2C8CDA4266B04000000000000000F5CE6824EB9EBB6810EB7911786ACE51C8F8184AD95F06A66079E2426C739EBFD209E4A7B3F087F4DE989EC1F656157043E046F5E5C253C558E03E7B0A053A84078BD73B0AC59DA7A62A77772483E483CAEC86C2920442090FBFFFFFFFFFFFFFFFF8F296BA306E75C3FDB55A936033D8A723D18B73E38059B19B112D66D7D9AB0F48792FD1B1A5C9049AE34C142175A1FD522CCD3B0075652811FFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A3C316DD3DBFC24289CFA95BED8163946703445D209DDB955ED5E15CE43D54F81A2E0FE9CB26C8592D9D93B758260A1DFEE24EF459F21CC197010000000000000000000000000000000000000000000000000000000000000000000000000000C494C32C5056AB27F46E028AA62D5C30DD5F81CD93C9017CFC46A005FED869A3648328BFFE3F82037B260D1E258E36E2F793488098DE3AFCA996F4D0312924007723AF0B3CCB6843E8D1E28F7C9625B12CBF00EF888893E915B27DA9C42453203AAF23C1E3E6AFD4FAEB690B6D4285EE9CDA84C1AB4D1B5EA4F113AFD29A2000B262000314D9F7C9BC88CBA8922010CB60C2FC99224798F162B22DFF680626AB5464A894510214FABC3896B3252EBF04F59F44FCF14E9A562840F677BF201A004D22EFE99366D982066072529A778DD25E580BD32AEA36718D9AA791730397CE62275122188A47DB10EB74A335EF365F32173B84A92B29926EEEEA1F150B1000A32852F74AD63609C6925BBA528CBB7CD56877ACA3ED60871C9D708FDBDFC56BD892A4BFCC9635CA20C9D47178327AC471BFEF46E8177A6467ED52508CF82000DA29B273DBCDFFC42A231DE75AB5CAE19A926D4C90050350F0282CF17A3EC4DA318E8138A45951FCA7131EADF938CC08F2426F562FC45C850ABA56C1A4551300BECCB69CAA4A7AB5B2F0E261BF5D31F3B0E83762F9A534094111CCAF2618A2B546684F169A0B07D2B41F1EE1B05D57C1DDF3D8B9AB9EED5A475562A3E28C110022CB9D06A16BF217BF734CE0BB4411BDEFE5B40A1ADCC756DB78BBBF310FA0B77DA626B8D2B98AEE6C7F4D8E8E49C0E1BD905C9272DAA5E3FDDD3BDE089D11005ADC7DB91D63E1A7DDE849487EA5F39588D1B61B4A345644DAC932202F87F733F9F0ADC10BD50D154C5A0F78FEFEBDEF18ECD844981317F7C52C9F7E6AA40600AFDE3AFB92AC4860C6963B62A1032586478E9A0B56A003965B4D54CB245FD882AB757B7EDC21E97E6E4590983FAD78D6B32B486C0A109DD2187217770B9C0E008B76582C3B6B67E8B502E119390453CB50F711FA7F4C8EC8C1319EB09A31315E6834701A74AC16C7D3B6D323AD377392A3D0107AA0266E8C2D588DE8E48410007DBB0EE2D95B813216C1BED42A5C699533D744CA8A0A62AF146F24ED1D56E6894D5180B278ADF09D35036D318DA1DA2206397B26D3FB172B9731A3571A06180091814C1BAD9327F9E5F745903D470C32FCD7BB03E611B3373D0CB46CB4F49DB6EDE46CC6F835663B5C55A974CA4C0BEF4F6892B9444FB6A0D800C65843970900753F5AC23C7BBE2A80B5D742F92FDBA04FA7C1BCB35CBBDB7B08B5B02802ED689F7A92A7A84AD40F8E3C989171A358425D53C1AD08E4C11691F707F48E401900 -smlen = 1226 -sm = 027C4399995C2ED95200924183C66ABC973400350BF597B84D612797221558D610B57741E300D112F0705A5A9AE89EF16ECD695E6246F33A007052D04623C6E187AA96C7F3E7DB5D5600E901B439FADC40A1AD22372BE97D65FA8B8434B0009FF2940847736DE791CE5A248F037515600C0133EB447550D7FA6FD589DFC5ADC6ACE3D593006BB243477DA8DA4BB6EE198BE3AF9F72A71A0016C47B56CCB93047D5B4EA240916A783A52300AF744CEB712F2A67364EFA169CD449AF425200B0BE805CE97044A28BB30833727C4BD1EF0401ECB4111E15E6E5F7113228DD2C42D3986C7100F8AE872D8220219F8A1907B8CF2108B0CCC70116498DF01D006BF4589CD599FB6D9593E5D001015F30C46C04AA0CEC1C8644CD334A30205C12BB1F2D463DA6A2B5C1B57281B39D0403CF2809FD36661FEB0CAA28C4043E1C908E680189F1B154685E3EDD28FFC9B1025B0030D61C6FBD64113FCED8C5205026EBAC0D9F3522182617CB00B6E70C8DA62ECC1BBC8E1FDAF17CC61DD01CE85A9072CC1D9D34FDADBA5B93E0AAB4C9C4C9E26D3F7F145FCB23673B6E0B373C0FD1A58F52486B72624EF91A539519EE5305772A006E49521744912BCF3CDBAD424F00428AA96CCC21D000EFB09DA5CE652E361A6FB649A060835E3B9DC9CBEC660C7531620115EC905DCA6EE2A1CE36554C0FC1D6DD6863B8F3843508ED5C214B6923E7F5C0304E9B0D5E5E433BD029116A33A60CB980737AC950577D0594BFE0AD2225CB8D3FA42F192B0EC05A49391632A32FA931C0FBD83A7B6EA24301AD0906E7911F9D900D19AE1247ABABB1C0E9B9BD165185D9D7413EA068FE8824CCE5B3AD51FE8E2BB2C4022C61B002C1DF4852E4910F38613787CA12371038B6364D920E07B4B417401253451DDC25624B5D038B2DFE29B8494EC960F87803CAA256A95C9868AF819747E4BF26FAABA6DDBAED93A7815C795AD5EB7FB4592DF678AC1375388CC7ED3A6230CBE80ABBB113C80B70C789CF0C66B943E67CE814F12D3D83F3B90A4320FEB7FB81DC93B05D7FE2D36584399214D3D7C71AEF322A5D04B5470703B3660BF86B0B17BA9FF23E45F7BEFEC3758786D2111C81BA4D81B83FEEA35A0668E5EB3694963BB4DB3ACCE4FCBA6F3F6FED9627580DD2D2DC103EF7E52BB9745BD42A7FBDB459B5C8AAEBA67686EB899E3177FAF0897C61B008ACE3304C41B4C79E2EF9C865E9958D8716BDDB69154FB33187D927B5296C1589FB1AE3D553F116FF6CAE56910CE6717C446B9947AB2A981A8F5999C1C6E517EB3FE584F5D10059910E22F40FBDDB709C9F686F51ABF7D7206A8BAB4A346B51523C362D749238D7EF6671A89CD86A8540604F134D760267E91EB92FC0FC275CAB69C776EF81DBAD35027E5307F1D34EBF5D6E4DF424D709666A1E649C044C4930098B2E6E3782A93976B55073C504563C7E052B6816C07F0FD54A759D2BC189FAC3FF54549FC4DE192EFB58A9E301863A77380967735910F63D35EF5FDBD8751DE4BC6BF2E3095628DC7F67C1F5571D17AA342593B2C7F953C3F0F22DA1862122031BBEAF0D00A029C043304E3E2609C4FED8A7404FA10E2EC846A70EB0E37C5BE61E698CF2296EC1FBE6FED75F6FE3113C23B29AFB5A6D7E3A9E46E2D89D8C06450CEA11492C1A97F7D6BE8FF6C014930043022B264FD32593952BC606F779598631E48EED86EC2A013D8EB866F311A400 - -count = 27 -seed = C33EE43A9CBB4347BFAF71147B7FBDD88D212462CB06FBE695A35402C503CD15732B7D0E8BF829A555B9167BCFA2F2BF -mlen = 924 -msg = C83441B16B39BD7993766E7260D07751AF2F19A41E70689B0EEED0C118D9EF109866AAEF31B2D2962A25A3D1CA999214CDF0EB54598382EEAD64435B7122D275EA8879BD47B41EB64EA908867FD78ECFBE8E992A2636AA7477DE5058179565D3A2CEB8ACE5C0302018043C411D89975A64927B48CB622A13F1ED85CC1113897A68488161AFA1E636EC786A0AA37B928BA88A50164A9EC372523AA9EC8885AA9C95B29F7CA1BBF0652BAC195BA94E976D336B69A9F5346B4C7C81457F802DC9757C7A2435A617317340F764C1A2AE131A716318F00AF0EFA89D3B57D8F31E155598B3944D950D6A1D6485B509358EFB3745B95EDC30DCFF02574F54DFB2D31B259D132D18897DF868115679F06D41102CD4EED4EA290F711148B99B647B8555A4C0DCA1D2D0871C59AB1382A2D6417E6236D71E2BFA1A75CDA54F93E6C087D611878AC7670A04FD7D8CB0993F456E3BC1C3B5898076E22D2D9E0EEBC7D7BB8D142BD2B5F6FA42B40BF676FB69C532D7520A4A105EF0C1337F53D6E9B4BA17F1E76AF4CFDF08F794752D2BF71E8777E2A209F8891B1A53D7BF2A5786B00B9A0CD0FCE79408F26BEFA2535BE188A68201B1514074CD70660971F86E8D3E92790AE7AC591AA7A996149BCDF060C615209FFAB82E6000F41B2A5606FDAF4CD08CAB0C2F1103B2436B1FD7DEC477C6233FBCA3B07A0CA01BF3476BFE5334E32AAA2ED35D5747D673E7BB622E1AA7901C77F28A3AB2197C8B8253A1D28C969EEE73D17AD71C7919E7F217BA2BADBD1EBF986CFE981024FC347028C1109CD4204C7D53535A9B677E39A43193E054D0FD68104D88934DC7BA6CB3E942AEC744B935CDCFEEF4221784F96798E650FFB0FEBF2715D75339D0CB6C2E57C1E9D10F13E6786B7F041AB307B8CFA51A2F10B622995230FBA54B70D94AE278EC224D9D0950BA97BEBA7EEB0E2FBC4093E548D9EC09CA1A08E5F0483024D7C1927FF8DC270900D42D31B81B13A29839BD746CBB3591BC33817741A31DEA308F549A74F3A4E5478844183B8D7363AC1F4D4A5E907D9ED98AFD08FB8BAA84C324563495387A4F12C239FB63F0810447131311B2D2CA302C7DA2DA57C94C3B5E844F537886FB766EC0E977254DBCA8FC84AD77430428F0692E55D8E2CAB294B857AB51A2CE4A725433DF28D9CABA86C770743AD987BBA58C0565BD18590931E283292889294B607A5F19D9E905AA3940836E2A74A2E94FF3062E85A5C6C978B5EB2B254BBCDE128280E6CF02C11A0C2066F349E3C6C083965D5B8A9C000E15FF36C5BF3A6D42 -pk = F44A657B5F1C7D297F8C59D5BEC38AC2B738F6ECC07D521892D45CB3387A2AD628936BD3B81BB3B4162E756A54774F463960D585B19D644C3E8B8876DDC71800E1E1A6DE442D44DA6C92F06F78F5B3CF614B35E05BE7B02B28B96E1F9B224C5D02EBEAF21EFFA9C59B3035CA437C24C806D3B01CA4169BB5CF747B7B18C21700 -sk = F44A657B5F1C7D297F8C59D5BEC38AC2B738F6ECC07D521892D45CB3387A2AD628936BD3B81BB3B4162E756A54774F463960D585B19D644C3E8B8876DDC71800E1E1A6DE442D44DA6C92F06F78F5B3CF614B35E05BE7B02B28B96E1F9B224C5D02EBEAF21EFFA9C59B3035CA437C24C806D3B01CA4169BB5CF747B7B18C2170002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000194B83D94B0D4EEDFC4334768832459FCD0A0ACCAA25397D07A092EA85A173E5F4393969DB4E1EDEAAE58F649F0FBC27B486CD28739A421AB85D34E7D14EC417779EF79933E8EDD73FABC26014D979DC8CF086F13D28ABC51401000000000000001C4533A33E21C0CEAE524FE46036581ADA7AE0319B03E1C8EA55EA0E2B11C4EBAEE03FC8041DC5A69C4D36D59858FD9C26898F42924EAF2BD05FB9E6396F5EC7095FCB94938C5F3FAA2DB14D8A14931F9D80148113D301601CFFFFFFFFFFFFFFFFBCF646994A82F7969B0F3760BABDB45B3A4A4D623004B97573123395C2DACEDCD6664306F7C2798DE86D2C4071FFEE184E96E64DAC58228317CCFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99DF127F7EEC53DEA1BA13F087C04FC8B5026DC6797066E75A458DD88E9DF8E5D211B05CF639599E62CE6F33A5F14E8841D0B0BB2CD99CA4B7CA000000000000000000000000000000000000000000000000000000000000000000000000000000884F82ACCF0F5794CB10EC72681D34D45D6DDCD56762454B5E78A13E473621DE8146312D23DBD172B0DE9601EF34098FBF3A23A60018A499A4C913EA41790C00CA980662C06A466A458AB85F33EBD76D61BD223B5B0F0F7DEC274639C6B8BE9841DA61D122B2931C21B79334EB2BC07EE51084098F8D8BE5AD63BAF20FBE1D00CB97C065AABB110C8F267C6EF78F67791F6755A8C1328CEBA0F925F39FB2066B100881E5B5C2538499C23F15AF27CEAF94D084E3F5F30EB1B8DF116252B200004377C45EDFD31AF8AEC3B4EA67059FD2A7456C63A382278727C8E8A9A8A2E30F6C3B125B8E0B3FA6E47AC590FCE2E80ED9FB21A9492C7924ECC2F099D64A0D003C2045F45D3248737604302F2BFE8AA55DA3A0CE22C750FB167CF56B25F3019870FD40C2BBB81BF9D02F7F63DFDCB479FF32F783EECF370FA50A569C14CB0800F4FDC24453325B624B9E8BA423FE53E778C39F51A20C72A482A965975E64E64DEF60D95AF67024060688DC305A190AF388F1C6F7874C31EA3437324D1A3F140028086BC0448BE3CB31DF812796261EE8E411E5391DCCB5B93BC1B13F33718B50674967EB4A914CED27EA869A8B55514AAE55A8558BF64CE1BE2C6C0E3E9F11000A0ED9A23B89D0A80C0953D3F47143B7B271EA9B7850B4E7B94D8B23247D4D93280B148CE43AAC917782C54DC464825680F22D55CCCF1A5D59E3F54F74261F00C5E8D6B69FBE0B43FE6F99DCBA7E8E061ABB8143DD5C6A8C7C0D50280EE0D6439F6C026FAD6A07066D51AE5FA76B940CE86231BAD06FA070C4A5532195140A005E4EA3DA96B40F0B40C9BEA67C26F0F8B14C280E513C0EB011AE3FB73232402F0C1D0B4F0D9E26500AE61ABEFC2D87C97D28F0AA4D45B73A19C8EEE42C871B006B0A5D45DF19AF39141E384A824ED15EF93C63A9DAA9D0D1EF3AAF5D26E0F3224D0359388EE91CF42F725C2B2998339BEE8DE8FD6615007A5F93990C21601B0003751EF79E1F684878338A7268DAFF1C734F2653B972A4092F2FD35E3AE0EDA877F2D24EBB99375D181070F2C05545A76B5D32A577B4FA1475F73CA2619C1F0025E52C85A843C9F17612E5BFE4A1EF2D4F950D1B6BCE5578934DFA4995DDDCA368E1C27A76B539F3125CE05550E64ED02CAA8367C97129C1FEA36E497B8709000BEBA760AE98A3DC6C3FE584BBF90AF520BD857516DE19322488EB7BC37B528D814AF96B9670B9049018195102C210C21AD1E466903F945600A54C00AA220000 -smlen = 1259 -sm = 6C37F62EB8EE8B0396C20A7BD034B5C5C61801AE869C7B5A3105E2FC24F6AE0D6E3D1E27FE01DE266C3417E7FA9316B0C7DD67C8A635A5C001FBC5D577FE59F9B51D35DC9A4E1AA436A7E801DFE08782B319DFE7933E730DBC48904073DA018D4CBBA38A330154D1D6B3CC1795E0D4BC0801FE14AC58A47D62738B70589BAF0A32C88ABA00F0FFA466799A8BC03659632CD8C54B56063100134DA2E62C277869182E14123800C2F1073E00FCBFED6801721A54731F9835EB1BA44BB9380179FAD193C391B0634759E580CFC516D1F40800D8C13FFA12FAB2CB2516A217FAD50609036D0163C5E7F15D9212D6568E03193CA820481F14011D91A22D8A96E31ECF9E62D61B2A0D138E4B01010DDB2C37B0172DB5FB6B80CD60EC7AB0DD95B9BDC6976B2B60207E5F1DDDEF61070214D85309A255F6BC1FD924DD4C7E9DB1184901D492C47A8D9FDD21664732E1EB1201C83441B16B39BD7993766E7260D07751AF2F19A41E70689B0EEED0C118D9EF109866AAEF31B2D2962A25A3D1CA999214CDF0EB54598382EEAD64435B7122D275EA8879BD47B41EB64EA908867FD78ECFBE8E992A2636AA7477DE5058179565D3A2CEB8ACE5C0302018043C411D89975A64927B48CB622A13F1ED85CC1113897A68488161AFA1E636EC786A0AA37B928BA88A50164A9EC372523AA9EC8885AA9C95B29F7CA1BBF0652BAC195BA94E976D336B69A9F5346B4C7C81457F802DC9757C7A2435A617317340F764C1A2AE131A716318F00AF0EFA89D3B57D8F31E155598B3944D950D6A1D6485B509358EFB3745B95EDC30DCFF02574F54DFB2D31B259D132D18897DF868115679F06D41102CD4EED4EA290F711148B99B647B8555A4C0DCA1D2D0871C59AB1382A2D6417E6236D71E2BFA1A75CDA54F93E6C087D611878AC7670A04FD7D8CB0993F456E3BC1C3B5898076E22D2D9E0EEBC7D7BB8D142BD2B5F6FA42B40BF676FB69C532D7520A4A105EF0C1337F53D6E9B4BA17F1E76AF4CFDF08F794752D2BF71E8777E2A209F8891B1A53D7BF2A5786B00B9A0CD0FCE79408F26BEFA2535BE188A68201B1514074CD70660971F86E8D3E92790AE7AC591AA7A996149BCDF060C615209FFAB82E6000F41B2A5606FDAF4CD08CAB0C2F1103B2436B1FD7DEC477C6233FBCA3B07A0CA01BF3476BFE5334E32AAA2ED35D5747D673E7BB622E1AA7901C77F28A3AB2197C8B8253A1D28C969EEE73D17AD71C7919E7F217BA2BADBD1EBF986CFE981024FC347028C1109CD4204C7D53535A9B677E39A43193E054D0FD68104D88934DC7BA6CB3E942AEC744B935CDCFEEF4221784F96798E650FFB0FEBF2715D75339D0CB6C2E57C1E9D10F13E6786B7F041AB307B8CFA51A2F10B622995230FBA54B70D94AE278EC224D9D0950BA97BEBA7EEB0E2FBC4093E548D9EC09CA1A08E5F0483024D7C1927FF8DC270900D42D31B81B13A29839BD746CBB3591BC33817741A31DEA308F549A74F3A4E5478844183B8D7363AC1F4D4A5E907D9ED98AFD08FB8BAA84C324563495387A4F12C239FB63F0810447131311B2D2CA302C7DA2DA57C94C3B5E844F537886FB766EC0E977254DBCA8FC84AD77430428F0692E55D8E2CAB294B857AB51A2CE4A725433DF28D9CABA86C770743AD987BBA58C0565BD18590931E283292889294B607A5F19D9E905AA3940836E2A74A2E94FF3062E85A5C6C978B5EB2B254BBCDE128280E6CF02C11A0C2066F349E3C6C083965D5B8A9C000E15FF36C5BF3A6D42 - -count = 28 -seed = 19CB4BE2332F7FF0C078BC001FAB3C5FD8569A76EBCE373D1ED4FC8EB5D744C6464E2B5EECB9EE836CD5D87BEDA78BA7 -mlen = 957 -msg = 86D27C1FCDB8164F8909073F590D0A280E5EF193B0C42863BA518BC8A51E625658DBE2184C3353FAEB674C991EED3F1B0FE3BBE50A21EC70E9F57B97C38D6E436D3DD577D7056B07A401FF0EBBBEFAF8212B993A39281190E309ED0C50B269E4852DEA85432A5941269FDF63766B21D25D8816DE5E87FFA051009D232D6B258C5F43F45F2D48BE09B2CCD8FC963FAD81FB368502057AFA7C865D62D932F652802A299295B29411439DCF832E8367A749B4D7ADF7E8ABDE3EBFB844A9B1D32F77B2BF96B5D29FC15DAE83EA80A990AEF6590776CE1CB81587ADA80B9A7B45ACA3BBC54DBE67DF090104FA196701280B97607A333A9B56A728710CC1CBB7569B79FF034572495181A92D2380A7EE5E9CD1B0F758C2BFBCC4E11464F1CC7D91F117319C30CCBF4C11E60B5DEC724225B8D77B71AA58F5FBD498A3F49115687D58393BE648805BA1737BB921A08D738243920C3834F8782A8256B7DD22CCD5F4ECE86B8A0860BFF21C5C8F0BE987F2D510ED4DF9CF94BF698680B7CFA22A575A3D1B5B431734B59A4B31913019C1F42DCB76A9FF32BFBC6E16D2FADE26E3C17BAE49CC415E4B370D1FB43FF652BE62D18B0AFFDF286765F4F30FC8D6F2C4A58CD17B3BDFA013BB2DAA075BE5F522EF9BFC2E1506CC1C4D381B3342EDC19C955A5FE48A712AF5ACE66A028D03FC859711C9D33231E48D41E58A2C2AD81DA77529AD5E6B73E1AC96F0C8E53F153FAEA7903F917492A1D2B1203174A08551FF0F9F91E32BD0F31D606C80A505D5EB55265542DB3653C2621E7EB3FD677F49534F261205F834EEF1645AF419EF6BE5CFC16D54C7EEEA12D2EB9458831F77FA558E4D5C7FE446DDAAC3E1D502C941C95F572AD545ECC7CAD21F0DD50845CBDEDF589505FD34CD8C00D57243C3AA3615D84C39B0A72C28F40AC72DA25EBC6987DF5A7E390399463786E75D524FFB6C961BBC9301264BFE3C699101D18ADA4A72D193971D54089E6FFFA684CD3D77570CE0BB9179A156D3E2DCF266358499BFC158AC9A6913F622CA861C968EBBA0A59A12674BFE39389A2125A02563B082259483E80C89A3763C0A9C3DB485AEBF22C844539EDAA28A3FBC0053EEC475679B741D9AFC16B5FA109399FDD1FC3574DF8A1292B8D7401AAC1BE452D38F97D531813369EE4C50F36736B95AE9C3E4F91AE85E2D664337DAA40F75CCED2F4A4D210BB4EE25A56DC217DD176DB5ACA43C002AFD63ED8712D89E266674D9736FE4A9F202A81D177970411DCCD289B25798272D2647CE6451906A4F7D46E87A46CF6CD048B6BDB62488A24F48D1EBD61FFA474321B929E0A7B6F9D0F6D777ACC14815F343E1 -pk = 8D5C1AFCCD8858ADBBAA524CC68781E4DE053EEF19C7218EF2AEBECCA2BBD51EFA25C2199F8426F12BF4B5B7C77BA5C215772A04C8055663B6A526EAE024210084A65932B08096D0E54D8859D6D314AEA2C5539C3C602A5898602375B647F71B891FEBB8FE5C4957DBF14D7B83997BC083BCD1A37969767436411A019D541900 -sk = 8D5C1AFCCD8858ADBBAA524CC68781E4DE053EEF19C7218EF2AEBECCA2BBD51EFA25C2199F8426F12BF4B5B7C77BA5C215772A04C8055663B6A526EAE024210084A65932B08096D0E54D8859D6D314AEA2C5539C3C602A5898602375B647F71B891FEBB8FE5C4957DBF14D7B83997BC083BCD1A37969767436411A019D54190002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BA953F4F1720EC869D43F90242B45A11D639A926CE7911E27F4BB443D57DBF80768EEFBD087FFFC8CEC2091CFFC32746C85B6B3A02FCD04AE40688CEE7E56B6160C84CC514FC7D2CCA3BE3FE7AC5079ECAB37D389709B59DB11100000000000000BBEEA636EA319E164449E8ADF61B8D7CC3C1D78E71F67ED181F07AEC9A2E17E96551D02F8622F0E5D25A8559D590D8B130E20B6A563D0CCF8986218964F26DCB1D5A390EEB97856BB37A1DDF41845C6DE51FD7554E2FBEB542F1FFFFFFFFFFFFFF5BFF4760D8249F35F894F0F16A2E07EC50039A5505875926B8EF166AA4D2AEB3B152C7F047B04A0C225403D385774DC0F31F80F7D278BBA1C006000000000000000000000000000000000000000000000000000000000000000000000000000000B6F51D2A1212581598CD8C88B47AB3410CEEA8F7FEB171D7B681DBE72944F0CA0CD0BB9859F82AD4D0EF75896445761BF0D55EEF917A108BFE1E000000000000000000000000000000000000000000000000000000000000000000000000000000A33602BF0668787F551D4EADC3229F9BE4E9FE56DD91C4D252551E466B88329407355EA0A00EFC520215F175900ECAF51021A5B1C26CBC8C96456926506F2300FEF9F93E5F27A7CF3ACD77F2AFD581780400A79E4369BAFD36C038B01F0A4301B536F9B0A43A2F7DBD8BC72BFB41BF8B55847E03E6C27EA31BE78A44D89724000EF0566E1D52C9287518CBA4E2F166158A44AD75A4A6FDC4F9F92167F29D05A0D6701667824814C8295ECE544F3317C3CCB1964B92564824235F80146F7C1A006C8994F6D4B256EC697D896467483E8C8DE899C923F9C4B0B8D9EFEEAF7567E103BC8D8276772F68997E0AB114951E2FA61B2AB5DFBFAD9B625F9AD926370D00164E364868112B51FECF43E22539542AD9D19961134909285C0A4ECE0C555400C913AD68B9DABEB3D937ED51E886BD917372CADEB2CAD3F20023F6491B6E0A0001C03FC6937E854E6E38A31DD63CEDC93AB16D2E695AFB57B06916410C23675E264F2F2F6993D12A9C731CE8CF5F4DD04FBCCE8E6E7B053AAB5717398B840000628F5F0797EB0BF56814AB0D4E0E4BB5EF4FA46A268A934ED517EB5701823926866B81320CD9672517A810A485B56A8EC6779AD66F311E210FE0320A40F70B001283ABB8A5DFD72AB5288DC74835E3E1B7C0CF05AF01C218216996A017A1A177C95DF202EBBCB483A878C2C561C11EC8B67C60E8723D582D5B28F6295C9901002FBF4E0EC9CB80A6417C77302A6FAFE4CFE854E94975FDB5DE8E17CD3AAAF35E73E998FAA825A36E41CC2A295FD65146A5A264A09A8DD109790BB8DCBB05230045C4D7D874A931530A47D22220747A6BDEA368A89F169DD31BB3833629ED64FA5A91C935335DCCDB4B949A32102405464E833D5848FC24C5400771536D5C0600868FDACA6AE5A91436A9A7766D2BC432263F32EA2FBAC78E58E3D134392B9FF23357E265CEE5F82F0CE177250569884E91D2771C40AB8BE3264E04DD539B0500469B1E910F510E80ECE21290B05B22D03BAB4D843D761C4B6BBB9EA519C7FF17DDE6CF54881BC10A558FED0C278B85C85FE8374A257223664A70DCC87C090B007B554C545DAB645B0F88F0B251896D2567E8A3361937F56E97EFB10CF392E5568FA5B7D8006E91800A21D410B214892A599718961E7A527CFEC126EFF01F2000BC4523F44C77639F38910852E12111EC801C21307B26CC4420184AC6FDF70D068AB304452BECD0858F2DF0D65F6884B7E799495017019FA3587A5A4302862300 -smlen = 1292 -sm = 5BB44A3A1F40DC6A2A8FDEF37039581F371B0171E2EA3B45B4240E10A39B45404DC3E2AA1500352FC679F1D4E83EB8E30A30C866D275999700ACE7A3B94E7F62E186E187B842B8B743AD3300E0CEACC5E9B1227CFE234292E9B8F59A0793013C10F3FB1E87CB66CA3466310954C1DC2F4600FCDE1D4084D4ACD264E5422E0652DF645B9C012A32FEB712128D92CE5C141704C5CD6F64A30038C646C7378AEC99157CC6673BA77660AB5600398C550A6903848C3D3FE29239553BAACA6900330D311E751C86F6A345ABCDDF3DEEE5F0C501C3987CE3D810A26F9B1C96A5567309265D8E00A244B5E68CBF469A21B35ACA732840F95CED00E983CFB82E5C7073153ECBA0213AC08FF28E0101F54B4A7E254E90788B8079F0BA990F491A83BEC4600CD579E671ECC3DB57C4300203230570690A5237BC43444FFF3D063CC8704501340088C9C95DAD59E332817F24EE0286D27C1FCDB8164F8909073F590D0A280E5EF193B0C42863BA518BC8A51E625658DBE2184C3353FAEB674C991EED3F1B0FE3BBE50A21EC70E9F57B97C38D6E436D3DD577D7056B07A401FF0EBBBEFAF8212B993A39281190E309ED0C50B269E4852DEA85432A5941269FDF63766B21D25D8816DE5E87FFA051009D232D6B258C5F43F45F2D48BE09B2CCD8FC963FAD81FB368502057AFA7C865D62D932F652802A299295B29411439DCF832E8367A749B4D7ADF7E8ABDE3EBFB844A9B1D32F77B2BF96B5D29FC15DAE83EA80A990AEF6590776CE1CB81587ADA80B9A7B45ACA3BBC54DBE67DF090104FA196701280B97607A333A9B56A728710CC1CBB7569B79FF034572495181A92D2380A7EE5E9CD1B0F758C2BFBCC4E11464F1CC7D91F117319C30CCBF4C11E60B5DEC724225B8D77B71AA58F5FBD498A3F49115687D58393BE648805BA1737BB921A08D738243920C3834F8782A8256B7DD22CCD5F4ECE86B8A0860BFF21C5C8F0BE987F2D510ED4DF9CF94BF698680B7CFA22A575A3D1B5B431734B59A4B31913019C1F42DCB76A9FF32BFBC6E16D2FADE26E3C17BAE49CC415E4B370D1FB43FF652BE62D18B0AFFDF286765F4F30FC8D6F2C4A58CD17B3BDFA013BB2DAA075BE5F522EF9BFC2E1506CC1C4D381B3342EDC19C955A5FE48A712AF5ACE66A028D03FC859711C9D33231E48D41E58A2C2AD81DA77529AD5E6B73E1AC96F0C8E53F153FAEA7903F917492A1D2B1203174A08551FF0F9F91E32BD0F31D606C80A505D5EB55265542DB3653C2621E7EB3FD677F49534F261205F834EEF1645AF419EF6BE5CFC16D54C7EEEA12D2EB9458831F77FA558E4D5C7FE446DDAAC3E1D502C941C95F572AD545ECC7CAD21F0DD50845CBDEDF589505FD34CD8C00D57243C3AA3615D84C39B0A72C28F40AC72DA25EBC6987DF5A7E390399463786E75D524FFB6C961BBC9301264BFE3C699101D18ADA4A72D193971D54089E6FFFA684CD3D77570CE0BB9179A156D3E2DCF266358499BFC158AC9A6913F622CA861C968EBBA0A59A12674BFE39389A2125A02563B082259483E80C89A3763C0A9C3DB485AEBF22C844539EDAA28A3FBC0053EEC475679B741D9AFC16B5FA109399FDD1FC3574DF8A1292B8D7401AAC1BE452D38F97D531813369EE4C50F36736B95AE9C3E4F91AE85E2D664337DAA40F75CCED2F4A4D210BB4EE25A56DC217DD176DB5ACA43C002AFD63ED8712D89E266674D9736FE4A9F202A81D177970411DCCD289B25798272D2647CE6451906A4F7D46E87A46CF6CD048B6BDB62488A24F48D1EBD61FFA474321B929E0A7B6F9D0F6D777ACC14815F343E1 - -count = 29 -seed = 6BD93FD13C0299B3EC7403638673F3DBC449F3A617B691DDF73C072B62BF028913375D7460BED2CF9FDCA517690CBAC3 -mlen = 990 -msg = 56ED7708F98432FBC623424C2A3634780470A01784BECFF01BEA5BA192D02C33675084263C4315420A009579EF80DD15ECCBB812652421872A9577EF7D07896A727A64141BAE7173426DD5A3925159BFA927FF1039E70F729847B48365B4D3551476206AA049BA5AE8F605847AA03965F058FCFD478961EBEED06530ABE900042321059C297DACFE76CC12D52311B2FF8EE1231C77049E232D9FDB751FB27EB7EB6A373B4B1C06BD0FF46B1B208072C873E6F938E689839079E48C6D18F678769F5F28A903467F2FF2A8B02CB19DF675A8FC7560A7D38A918AB8BE083EC4E0EA148517AB90F38394833304F245BFFC47F9ECA771FB80B9C71CCD05FC3B0D66EB06D24B914B63D9F16AD2F2BC454B591D01ECFC527277AE71E3DC683161A53F129743F3428FB82A89DBD5D42F3EED237CD2F8D76DE2E56A2143AC6B2BA811F745CC72132028EECD4412B76FDD87A2E396ADCE72DC69B8FE053042E798B220974587AF96BA419DA6888B13FFE217C9D01434347F4162FD554B760883E8EB1AEE46C4C26B990C6BA10D2D939F513BF0EECADE8B5DEB8DE2BC8C8894ACA51E65AA696E390C11689F1C2CFBB70BC5F72C1872D99BABE8DE8FE2DBB446A8129AF0AB8D9613F0CBF3CFA6EA3CC409F4A97581D5012707756994B6C8D4FE7F64E0F0B85A85D0A5FE23224DFD7ABEBA8E3FB2E97AD87FA8DD477ADF48F64FAF486D0DF11AE9C3BD3A04ABC962C5B02CDA02D48F0B52D84D4920C116C22455DF291A96E6ADFF91E3CD35CB8B5B4E70E3DA8B87CDC969643A32B1F97131C5E0BAE7F6DFBFAC32218EAA596D444574EE85EF7C9998DC1088E5813D50A4377D29506817E4234F68B32AD68E00ADBF6462F8D4E215F15A19DFDE452F0A65360F7C1F20E11C42EEC55565CCB23CE248BD62E9DBE8A7D6639028A92B422AB444C5688B5D191A4BA8956F358D131E2FF6DFC607ACCC5D31AF9678F1A226530078FF9A73D681DEB697670DDC3E9096AB0FEDAB664473DCFFEDF9BE62A5C7C54FA2EB5059E9A1D38413B1A4FE6D531B799453BC7185ABAF78CABCF65F365B00827CEC5F29C4737047E3B2932A78757E9626A958486D1740ECF1EC17A01AAE6ADEC5104EB934F432207CE31D7096ACB3A0FE2F5DD7890C021892FE7D3F34596CF20B6B12FD55911ACB46D7386F99A9E9EE067A45C6A1FBB463E63D69CB582DA6EBD6330F4F80A1FA72F2ED24CE9BBCD967118CFC7E21F6BFB68A905F532BCF8B8BEFA03295D362B41D25CDCCFC9B41767858F651BC56AB2BB4A8675513C5D6F1C943A20A27DD29F941AD141DEBAAD219E056510BC984063FA0F389090D434157438BB1759690C453A2F55F72C033797A4B0C534EA2EA084B3B6F8966AC56B106FCC11EF08902F2ED -pk = 5F7CD48DFFFDF4C439C65EFF89B606CFF6DC78F96A0BE43E4FC89D9185F88908421173820CD475E69CCB40D167405FD15D0301403703A9C599A3D5C81B4C25001FDBB4EC873C98AA77C72DA8C1A1A38199017C90312A4E664BFFFB4143C00E6D8F8E4E88F3217E9DFB658F1E41E497813F2CC2E4BCA435DC2BA8B617F7C50A00 -sk = 5F7CD48DFFFDF4C439C65EFF89B606CFF6DC78F96A0BE43E4FC89D9185F88908421173820CD475E69CCB40D167405FD15D0301403703A9C599A3D5C81B4C25001FDBB4EC873C98AA77C72DA8C1A1A38199017C90312A4E664BFFFB4143C00E6D8F8E4E88F3217E9DFB658F1E41E497813F2CC2E4BCA435DC2BA8B617F7C50A000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092C87D546227B7BC54C068FEC23B6E790E2CBDFE15704C3BFC30122D564318F07F51C691043156114D3544F923E603C974FDCFC8B8DADA4545798F1B8A7E52301118E74DCBB6A9D849968089F75203D67372F37D5B3422C1EB0500000000000000FF091F63CB4D021E60052825868B044D346D05ECC0A66C04682AE16E9D8B74E3F4069C99631F4B28678312E25D57568078CE8C275123A2351620A2DDBA757890D8823B9C0B6EB252EDB486CBF9384A1CB0EF2DBD3854389006FFFFFFFFFFFFFFFF81AC7B1512C6E2315D4134C87FB46FEF611D768D4FF39B2A9A1C2528FEEB7F9907E2C2D79F9359D0A6C2A79FC6D3E51B0402F873DD8301CFFF97FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52733E6005D84F60462452C7D63A626CE469384D32E32F9161A8216C6362D5F35722E5D3419BF02165645AE3CF4F9744307E9A02A7D69AD4C46D03000000000000000000000000000000000000000000000000000000000000000000000000000086448F9BF45E928652477CF1E792455B53C5FE2BEF68F035CED46DF7F531FE373F2EFC49016BFD70C3DF64BF7A2122A3F802D9D8A92293642CC9AEC522131900658BA4E4FA1746A91B6797B09FAEA7EC8136CB7FC4D9DF8246CD777AB9D13674D93F34B3B348328D817870044E1882E7A81A26AD9EAB062E52C277037F5B0F008323F605C27675CEAF34A2E9A8B93183187B22B4F69355915109871C91162E3DF6C26ADDE38085029D8509142714BDA404FDBB79BFC730E48E95F3ABBB1D0A0090B5614005C12EEB2E3DA97F83640D6BF14EC36825BAC115C7638E336840097DDF553CE9A9EBD976608F1F4EF84D677BDCDA5EB8B1226E8B462718317DA11600C21FFB03A12B4C4090D232EFB3304617334008FAC4075293D0DEBCD3E360426419C50A92FB16F08F2A179A671115666AB8C783C8BCD39CED2E91787A8B48040041AB11B1D241364847E698BF6A6D41DF1882E18685B368F3B3961436ED250E8D77EC8808707E3BAA6D7ACE41858EDCD4327BBC8A3C7170B242DCA9A286931F000AA2BDBECFAF3962A2F93F70ECEE2E7450FC94D2323296BA03F857F0FBFE99563A897D53B3D3C20ADB1A71AA69384CDC25A394569D6E9CD04E8C563060191900DA28325CAE49F5CE1BA0BCE397EF75566D2DA7B52B29CCAD669B6195AE84FE3D1C949D659FA22C4D29585543EF4277197E04B035D9C9DA51E2DF90DE9A051E00E0A1CCE88F063F47E971C05C2E32315131D2A85FF26A6DD8ADD664D970DF074763C062BBE71E8374910036FE3AFE842190351F34A837383399333D4DD72409000FD0D757DC4292D950139270A8B0DA24884F087369771CDB045EB65876E1C60AD9CB35D1955953F732CFE5876B78F865331A57BD5469E1DF33773C7E69220F0031F1949396B8C34D6542BB2A60E89B034F3F2A5787043D405F3E30FDABC7BF153B24AF3FEF3847546B07819ED4828FD959A8863FC3D4248B37F34C9474A5070001B14CA2D9419F240D3D839CEE58EB66CCD95482B321E40FD942B3DFDDEBC71807810832B51F3DA4FF6045D1899A634A081717D51C1B2D38DC33696D742F00008712E5EA1364C9D295DB9819697D51718CF4E276C455ECC1626DC06F83E50622B1720B4889CEE2ED1240037B4ED8D21D534D78D93B22798A3481C0500ED611001FABF652956FC6C6EB3F38753919B3E9379D8289A1A6C6C90A4E169E15BA672960B67C24E38C3C3770473823BBC1379B3174B831E4AE5A6B510F1D8C15351400 -smlen = 1325 -sm = 11F2F8917D464539A64E4D73A84DB4BFC01800ED5D74E0D29A9E3551E709AD43D0E0AC98B50056F70194DE4AEFF0EEF9763F2A88EBBACC9801F3F3123FEAA4A581DF9A482C7E125BE105EF00BD2D0BF50D9F495C9E046D34B1ECCECE4BF70191C84F46247C4906FB73D60409616A2D5DC001E9D80F8A777146C895728798605BD9EB9BD000F6E2B4A9153A0FAFB0D2728210424AD753CB01F688B4CFD6D39F23BD5C1CBE3EE74F01A4BA01810836CE8AE1579A49D751E7BF4A4AD62839014645F4D4064886E1F9F4E81638B8B62AED0A013A7C13CD97859BF629C89C17D0AB95968AD60116972727C1F29A66F019317CBF4C2063DC350101DAE6626AA0981E13B2557930063714F28D0001F7DEF3D411981A7F021810924EB655156AFCC633955AFD69651ECE7B203766A30201B052EF93C757703B639F747997C9711E4A6E00CFC126B65C528EB364C8912BE5A00056ED7708F98432FBC623424C2A3634780470A01784BECFF01BEA5BA192D02C33675084263C4315420A009579EF80DD15ECCBB812652421872A9577EF7D07896A727A64141BAE7173426DD5A3925159BFA927FF1039E70F729847B48365B4D3551476206AA049BA5AE8F605847AA03965F058FCFD478961EBEED06530ABE900042321059C297DACFE76CC12D52311B2FF8EE1231C77049E232D9FDB751FB27EB7EB6A373B4B1C06BD0FF46B1B208072C873E6F938E689839079E48C6D18F678769F5F28A903467F2FF2A8B02CB19DF675A8FC7560A7D38A918AB8BE083EC4E0EA148517AB90F38394833304F245BFFC47F9ECA771FB80B9C71CCD05FC3B0D66EB06D24B914B63D9F16AD2F2BC454B591D01ECFC527277AE71E3DC683161A53F129743F3428FB82A89DBD5D42F3EED237CD2F8D76DE2E56A2143AC6B2BA811F745CC72132028EECD4412B76FDD87A2E396ADCE72DC69B8FE053042E798B220974587AF96BA419DA6888B13FFE217C9D01434347F4162FD554B760883E8EB1AEE46C4C26B990C6BA10D2D939F513BF0EECADE8B5DEB8DE2BC8C8894ACA51E65AA696E390C11689F1C2CFBB70BC5F72C1872D99BABE8DE8FE2DBB446A8129AF0AB8D9613F0CBF3CFA6EA3CC409F4A97581D5012707756994B6C8D4FE7F64E0F0B85A85D0A5FE23224DFD7ABEBA8E3FB2E97AD87FA8DD477ADF48F64FAF486D0DF11AE9C3BD3A04ABC962C5B02CDA02D48F0B52D84D4920C116C22455DF291A96E6ADFF91E3CD35CB8B5B4E70E3DA8B87CDC969643A32B1F97131C5E0BAE7F6DFBFAC32218EAA596D444574EE85EF7C9998DC1088E5813D50A4377D29506817E4234F68B32AD68E00ADBF6462F8D4E215F15A19DFDE452F0A65360F7C1F20E11C42EEC55565CCB23CE248BD62E9DBE8A7D6639028A92B422AB444C5688B5D191A4BA8956F358D131E2FF6DFC607ACCC5D31AF9678F1A226530078FF9A73D681DEB697670DDC3E9096AB0FEDAB664473DCFFEDF9BE62A5C7C54FA2EB5059E9A1D38413B1A4FE6D531B799453BC7185ABAF78CABCF65F365B00827CEC5F29C4737047E3B2932A78757E9626A958486D1740ECF1EC17A01AAE6ADEC5104EB934F432207CE31D7096ACB3A0FE2F5DD7890C021892FE7D3F34596CF20B6B12FD55911ACB46D7386F99A9E9EE067A45C6A1FBB463E63D69CB582DA6EBD6330F4F80A1FA72F2ED24CE9BBCD967118CFC7E21F6BFB68A905F532BCF8B8BEFA03295D362B41D25CDCCFC9B41767858F651BC56AB2BB4A8675513C5D6F1C943A20A27DD29F941AD141DEBAAD219E056510BC984063FA0F389090D434157438BB1759690C453A2F55F72C033797A4B0C534EA2EA084B3B6F8966AC56B106FCC11EF08902F2ED - -count = 30 -seed = 1787C82DA9F2E6CA9ACF7D6CCA70116A1724902C81EDC1439F332C74807AF2BCCCCDC7AC1788BA798520B2999F39DC3B -mlen = 1023 -msg = E42C006F144B0B4E188FEBC82D63D3D37096DEEC9D3DFC3B421635DDDB73C76F6260FF1C53222A50D30B26E2DE3D16E3AA64C78604E1191BBC0E2553117A441159B2A35FC8889499A2EFBDD2F30B8B4C6CEA38EB5B2575926E6F22AB96DDB4B0C5C6D78C3754A1B6DEBA49FFBCFA7477BE9A0F74EC379D1C9AA59247C091611573AF765AE698D78152187B291717A9F03FE767BCBB12F52311215579352E7CEAA8654B5403F18CE82E0A73BFD5FEC1063B506F44EB1C9C5A03697D03DCB2AE15C5095F292B4BCB130B55C19AB728B3232EF77D1594611573CC6BDAA254F05934A329DC27CFA6CD8C02CB51C3C295C964C40502FE2B1A81A51C866F7C7380BFBE339B39C8F51F73722A05B5D1E9CB6313557B3656863803C9DC99BB1905D7F729B2DB8DA23D88200032F36FFD04DA11FFDF6277ACC69C5407289D00FDC3C56B32D54877F4A8DC70ABD37EC532B8617D9F3C535B8E962FB389E976B4D1AA12DE5C1C2FFACD50ACFFF65201104648E0C04CF7C1F880E8BDA1D68404BA67C4BF64C9D2ACEEF81B35FABCE58645E0F2F61EB4CCFEFDE7239BE408710D349987D849D40B3AD294B9D815A91848F9ED53B69F78D9E955F6D1FD7E38EC291664D54C2BC359FBA241BA6ABCBF5FC2502D93760D9F6B1F7FB766040E98BDC23A6047134A35327FE128AE24B4C7D0CDCF1801947A1821DDD7424892DF50E2DD5C1E2E6C5BFB4467524FB45C7D977604E7E0F1F98EB8C03EEE1D9A5796C8A801F082678940F076BF44D3496730C9A640FEFCE385865899FC33B5DD34D036F2FD5D07FDC0A40FB725E84CE403B46DE712B4B44CA8801A1CCF58233C5DA06719769823B5945849DDABCA56B0B4EF9327C8B5E5A445E6853E5B66B8D590759D6B2DB722C22F8C741CF3C6325A76D93F4FDE5872D5732FB19AAADEB7C18094727ED43B305B87AE2DBAAD67F90FEB86498CF65CC57EA635340F27AE5C5CD60AD3C763223AF877E65A005C488AA4AF9309E1AA02002B01DF8865FD481EA254015796985969997A53B06DF0355A6AB3C8219B652B09E1F86A6CA12D27C4BCB9E8D35E6889198C8FED71AD5642F5F9F7CE1DF270D68AA05467EF9ACD9A51347AF1EE9CA7C4A5D78189042900C6D561F68D410A77E79726DC123B196C78829F02CAE7D0623BFE9E7B0D8BF84033086295992B77ACF027489D51BC7FF006A8D4AB8079D494413A565E7F687AF40DD18B86AA4274EDB8845DF114C0146DE3199CB55F773A87FFB126B3A4D00D38835CFD2D6652C07F572F39D0397FCD62ACF6ED9F3E8951348AE7E52A669FA4E2BFCDA548ABB1989A1D74A27B73103770290E6ECAC87029359354EE4C87A77BCB5CEB10162DD54499905AC8ED442C173CACDE068BC546720D1284015ACB90CA19147694B53899395DC663D6683908F3CBA29AD37F15CD3903C4C7F4BD73 -pk = D9D14C9A1418099536B1B02966F242B647CF7FD112470397C63EA945FA38F03EE49FA57F8842F303B8DA8E68910D6322DE6942372BC8A85A26E878141B761500CD88A672B79BF72338D5C5D471E5B449FFF4E701B07F809C48ED915621A786CB5DA6573FFA77854CC2A3BE57708ACCFC7BCA49795B4062BE96624E95319E1D00 -sk = D9D14C9A1418099536B1B02966F242B647CF7FD112470397C63EA945FA38F03EE49FA57F8842F303B8DA8E68910D6322DE6942372BC8A85A26E878141B761500CD88A672B79BF72338D5C5D471E5B449FFF4E701B07F809C48ED915621A786CB5DA6573FFA77854CC2A3BE57708ACCFC7BCA49795B4062BE96624E95319E1D00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008930A7F5A536A36DB37FCE4C3021D98F09B040B64FA7035F2AABBAC6BB8B17A9C208BF557D1D9AF135FBD766DD11DCEDE5F4178C9000C23DB5422CA93EA221F340CAC955939DC12FBBAD44F12274144E052A7CC1677639945C0A00000000000000BE40B8D906D1FF9A09CF9EC7933C8F120CB29B491E4E48766B1250D02AA0347B84BAE8C4A998E3AC37E9A00D4D8BE50972D8FC197CC52D20DBAC74092441A91227F71F3EB35444F971C079D94971DA2B345D9B87725B2E0917FBFFFFFFFFFFFFFFFE78AEBE535E5CAA8A9F07BFEBFDC39E2EFE09CB16F100CC31AD939A7CB5032443E2B91C8ADA882D69A99663156587F1108872592B0C8C0B0609FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF096565BCCAC7E286BF3B501DE1835EB66C43B9E7966990452430EF95F19DDC35FAEE48E8CA77DC2637D963938E9C3C6F49769C4CBF5C146F93060200000000000000000000000000000000000000000000000000000000000000000000000000005271CA8F4ABBAAD90343A2E50B6B87A12514F6042B462E548B1E69E4274D9798F20F16A7F45CAC53B959774D99F100C174C99BF44F8576D10D32735F50230500BE5ACD145411E46FECE87783E72DBF4ACC287E7464FEF0C6F19F7943501122E2F5ED26CE182E792C32BAD41F87F13EA4F020F9E0BF0B63EC172E89E56B6E0300ECB20EE1F807F64DFA367F1F8DBF4C73A0112A9E850E4BC566C2F4586DA3FB43EC165C30B6E9160C3107D681BEFEED13BE7904DF6F32D1DA8A68DA1001AC1A00E354EF943367F825488196CD1F6C279A3A66C738984725B7B25E3BF0DEECD515A6FDB90B605DAFBC6ECA57CDFE6555767C47CF8EC568C1BF2451D55D00CC0B009316C09AD2EDF1CE5E977D740315DC795888F39DBEB3842D178B51AEA139B3425B29E4C8D88A79C210B99E1BFCC3DBC2AE4F2D415CD6CF62A3CF9AA76BD300009E9E2E971E1AA621CDDB54CDBCC373E636CDBB6BB1EA67B07B3DE3EEFE1EF45AA6207C242E0D2A7B74E687FB1F9ECD8F8836185D3BE2D737A661285D12B800008372753F5644A0DC759F51C7F288089FC7EE33DE753D3148E5459010003066EBCC05C3015A668089127FB79D97D07DD261A68695441D8927CD52887717190500647A65FBB9AAC733EA313F1E5174740D8EE6BDD41E58C3C38C794B0153A6E8F67DE57EE56A34D5128E25813040F5FBFDD5DFA8FFE9CA502FBF20C40A3E610F0058506FBFD17B2518C026E4B96201C91BCF7DCAD7C871DFA4EC0C884B4D1C671656DEC8A5EA8EDD0D1563994230103D7B3417F17FB50B17EDE288A3E6D2EB1300E40CCECDA3F4B5D9FDD747BB2B77ED5165F16FA54E28D442813441EDCEBB7E50E150975F5658902C134B0CB308099329022AA7A2F354C361EDA1FBB0948100000C3317A7C1DBF81C790C4EAA20F826273F75D578669C8646F0E82A01B8B421CFB5B0D7C81B005F7FB63B91A3D3AF4A15DD94B33E5F14F4D6EEE8B93151491000E4B2D0900860B06E1C393FDDC40CDFC0766AB43FF72A03A9A2FC8CC12B1DE43F214242494193D01DE583819F184AF3E7499BAC9F95A2BD5C3BFD53CD73130D0073F656EE1494ACAB26C07F441060F305B34120BB4D4DE6CAA06CA085E07367097BF51520082790E979C75F684B5DF439DCCCE1E83324E4460302C9F7CE1304003274948576731887CEF929B1F804EF08AB33764B8328486D5ABE7E2BD139448174BF38BE26C6E181618AEF7CF8636E73EF66E8778CADEF4D0B24152E47B80E00 -smlen = 1358 -sm = 3AABBF5E1233CA9D39D625057F32956D92CC00F70C80F2C04CF8467512F87A8A32866F7F0E00A9CB5F9FF793C9DE540968D9C4E5B9EBA58801A91310BD1FC300FE1EC33D146B806280C24D00F001970F2FDF6942F17D0C7D0538C332208A018D1194F1570CD5DD291FAB008CCFFF488BA3002D1562F25E5CFCB744602F233FEB1E79EC20012ADA2F38D67E94120574D4894BB38F8F5EFD01EABBCAD19A10D8124FE86E55344CACC8FCEE005A4A1B0F9DFA1BDAD31B14AD8026738C3C5101340E7270BEDB6E0E34D966B077A096AED5ED01B55E368781EB9238245706637FD0F42D3C19016CAC7F5348FAE2B010C2165576AE1A1EEFA200935FD925E2A8875BB6AFE3132E25256F575A0000B59C9DA73B1E502D7FF1351AE8881B78B4B0CFCFF0C10C0A85344B7285209C5C0103533351832800786F35158FC9BBF695B12DEC01837CC7C5011E63003E7C0EB1463404E42C006F144B0B4E188FEBC82D63D3D37096DEEC9D3DFC3B421635DDDB73C76F6260FF1C53222A50D30B26E2DE3D16E3AA64C78604E1191BBC0E2553117A441159B2A35FC8889499A2EFBDD2F30B8B4C6CEA38EB5B2575926E6F22AB96DDB4B0C5C6D78C3754A1B6DEBA49FFBCFA7477BE9A0F74EC379D1C9AA59247C091611573AF765AE698D78152187B291717A9F03FE767BCBB12F52311215579352E7CEAA8654B5403F18CE82E0A73BFD5FEC1063B506F44EB1C9C5A03697D03DCB2AE15C5095F292B4BCB130B55C19AB728B3232EF77D1594611573CC6BDAA254F05934A329DC27CFA6CD8C02CB51C3C295C964C40502FE2B1A81A51C866F7C7380BFBE339B39C8F51F73722A05B5D1E9CB6313557B3656863803C9DC99BB1905D7F729B2DB8DA23D88200032F36FFD04DA11FFDF6277ACC69C5407289D00FDC3C56B32D54877F4A8DC70ABD37EC532B8617D9F3C535B8E962FB389E976B4D1AA12DE5C1C2FFACD50ACFFF65201104648E0C04CF7C1F880E8BDA1D68404BA67C4BF64C9D2ACEEF81B35FABCE58645E0F2F61EB4CCFEFDE7239BE408710D349987D849D40B3AD294B9D815A91848F9ED53B69F78D9E955F6D1FD7E38EC291664D54C2BC359FBA241BA6ABCBF5FC2502D93760D9F6B1F7FB766040E98BDC23A6047134A35327FE128AE24B4C7D0CDCF1801947A1821DDD7424892DF50E2DD5C1E2E6C5BFB4467524FB45C7D977604E7E0F1F98EB8C03EEE1D9A5796C8A801F082678940F076BF44D3496730C9A640FEFCE385865899FC33B5DD34D036F2FD5D07FDC0A40FB725E84CE403B46DE712B4B44CA8801A1CCF58233C5DA06719769823B5945849DDABCA56B0B4EF9327C8B5E5A445E6853E5B66B8D590759D6B2DB722C22F8C741CF3C6325A76D93F4FDE5872D5732FB19AAADEB7C18094727ED43B305B87AE2DBAAD67F90FEB86498CF65CC57EA635340F27AE5C5CD60AD3C763223AF877E65A005C488AA4AF9309E1AA02002B01DF8865FD481EA254015796985969997A53B06DF0355A6AB3C8219B652B09E1F86A6CA12D27C4BCB9E8D35E6889198C8FED71AD5642F5F9F7CE1DF270D68AA05467EF9ACD9A51347AF1EE9CA7C4A5D78189042900C6D561F68D410A77E79726DC123B196C78829F02CAE7D0623BFE9E7B0D8BF84033086295992B77ACF027489D51BC7FF006A8D4AB8079D494413A565E7F687AF40DD18B86AA4274EDB8845DF114C0146DE3199CB55F773A87FFB126B3A4D00D38835CFD2D6652C07F572F39D0397FCD62ACF6ED9F3E8951348AE7E52A669FA4E2BFCDA548ABB1989A1D74A27B73103770290E6ECAC87029359354EE4C87A77BCB5CEB10162DD54499905AC8ED442C173CACDE068BC546720D1284015ACB90CA19147694B53899395DC663D6683908F3CBA29AD37F15CD3903C4C7F4BD73 - -count = 31 -seed = 9E6E12F025B2A57B0F5A3A9FA70396FC332E1802608E5CA07CC4FBA922F1FE5DEA6721B96F1BA2BFB97825A19F08FF2F -mlen = 1056 -msg = 9C311FF20F574CD9B7BCE1DF705AE7DCE6E7A621C935A6E57A59EB31FC443AB1E014AD332FA784583260AA6153C464565C4568108D60CC126F6E8EC3BC9120E5659C86CDA8A31A7131936DE7B3DB39A4692808DC3D2BEE8A99880FF9D1D5EFF1E825A0F043D908D62A99779E013845AC0C21ABE8E4DF0EE901E4C6BEB8BB36B30228B7756D617A8F30C16351D8FF91786F7406F75D9FB648830F88EA4537F42EAD62E8790E9CF11F72C31D718221049C9AA35376AD8FB065F4809F4383A23C2B29425836C2DBCE4680450896EEADEE6B83539ADFDF59AA4FCE709D601640EB9A22DC3B41108A8EE1FCCDE9945EBB1D3F676EC8395255E125E62A32149C73451F597E1C32AD979E5BE914FFC7C548D6AE92ED08501831E9007770A0233E5778F22ADF7F1AAADF9C9A7C82D2F42989BF21627D3EF8BD0377A5BE5C9F5A585A246A73DE4340E6B43B36DB775B34033962646C16F26A2B7179C40A721FEA54805B9EC42177B42160B1A67341235B5AF9F30B2703BFF8CDEEE5BD7CE506B0707A69F84225B6E5A92E80EDFA235803DBE2CEC47CFEF0D9FAC95C3379816A39F4550BDBFB45609C76D0351DDF8D61724BD5E8BE94673B3013EEBE172CACE247D79925B12B5DBA2F6FB72E797B2DA849B79DEE3DB76775F5F1DD4595678671C7B18BB3749FBB0C6A7135D639F16B3864B5A251114DE7E9F8CB02B4CC69902EC8D7D544D98E24A05F8ACCB182E2EB44BDE868B077B1FAC4726E8B01CDD0D024405665F7ADB60A23FDBACF421246354E824CB74DFB35E57902794E459493905400D0A0BAD51D8EB94EFAD55C67CD0C7CEFE7A1B055F06371AEC7F490FA685C611D553D8430992EE7B1855A9CB305B5CE53154345D7DEF6110DDBDB5CB59559EB664C6439E057DC022F8686F2AA0CA81552428437B0CEB5FBB5DF254036BD2BAE7290D947C963046771A39D2656312236569E775E7D2A041B7EECCEC99C1B9D2757C7370E474012AE707AE00AC37B73ED9C8E1A2774E54BACEB42E8B31BEA734463CC15576BD4F7A33430B1987D62E47473391938312F2481838F286C4DFAF701ECBC6EAB1A9F074C1F8D8963457DFAAC9A9A8EEA70C50CE70D1BA1006760AD3887605EC38861DC1A777D21E46EA169537057CDFE256CC08699D73B1AC4FBC62F863353581CAD358B9C573D77585DF6544E5D55048D66A352828CD1ADF5F42310FFAC022A25824430F741371027B2DC14717DC87342A74F0038674187E478D8ECEFFC16474A4AA8BDA0C8D41962EF2A4B64A036C888CCF4EA628E1CB9EE0F9A918FB1B22B9367FEEEE0218C83CC7E27C5CB2AC64DC7E111E3C85CA0E6BD4F685E5DDD428E028D192142CCEE3F0C8337BDF43CE4B62704AA53C703EC334FB56FFDFB81D7D4419535D17E5FCC0E6F558AD82149C591FE0357DA15660F61544B4041128218B6DE2B75D3801510669A3977E2983BCAF957EE2942E504C29890A81542EA208E1CEC -pk = 1D49A0A7BC794AB647657D16C0A72053B98957E478FA2D445B03B7624C0A8B134DEB40D961B2880815C8310ED85B9253D6AC9E37BE7D55EA713546AAC3370E0064BB832AD3E3A914BD9C3634E8F3E754D790235D1613661DC82488CEB0C140D041EEE826E9005A5C8D2B9F902C184F378E8DE00CE718B34F503C83FA0B4C1300 -sk = 1D49A0A7BC794AB647657D16C0A72053B98957E478FA2D445B03B7624C0A8B134DEB40D961B2880815C8310ED85B9253D6AC9E37BE7D55EA713546AAC3370E0064BB832AD3E3A914BD9C3634E8F3E754D790235D1613661DC82488CEB0C140D041EEE826E9005A5C8D2B9F902C184F378E8DE00CE718B34F503C83FA0B4C13000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092D530A11722DD507496B5E0873C3220047D12381ED5C48F960DB7825AE8F03AAFB5F93A57150D36DAC27267EBAE8BBB0527B916C6D06AB3289EF73C04214701B291041385CB8B1DCF47188972DEA67134334D95D002FCF7910100000000000000C18C814F20B378FB27B69C6AB8376E84818719220F5B2CC018AE7A8D40906A9C1D60E150CEC46AA88624EF1FBE2DDF0C833FD3E7321B63B802885381123D24DBD359E0861A1C037B255131492A351D9A1910EAEBA0F50256A6E9FFFFFFFFFFFFFF6FD0AF1637E5AA8F11F960BE2EBCF2E6F0DE8DB4EA285F055E14F73B66AA4505BB4F3ED7F7272F8CFDBCDC8EBC845A4B0892BC3888CC6619ED400000000000000000000000000000000000000000000000000000000000000000000000000000009A058B6204B7B58E29CCBF5B217476DF90820BAE07D1BF5CF32331382C7349D50F7A217D6AE576B94DCE7C1D6EE3BF51483C2AE8F2237DE2F0820100000000000000000000000000000000000000000000000000000000000000000000000000002B08CFAE45024134230DAFDFEF306B257AD246AB8574574D1474CF398FA86B5A64F661177405EFEE198F95D120B3297B351FA7FC46F67066761789BB98921500FBD3D4F83B435F1357439FD1E29477CBE3984961A7B457FCFC46688D4B35E21FB2C9377B481AE00C971E4EC3092FC1577A068F3BDB683D5BDC2346702AE41100BEEE83E1F53EF02C1E1CBA0C397EDE27475D2323DB20B6B7EF89B8E8CAC1C12FE36C7DB38CD16AAFC793E7205ABE952B56A65E0337991E0D1E33DE102BDB0F0054332D34593242E581F1464DF6BA51AE4EECAB67E8334B7F128979E8E62F25183AD1B43F666DB5ADD2C1B9E771B42EDF9AB64F101D85256EA09DFC4FDA491000B5A2B006EF11605A60A4F3426E3B97A2B2FE5FD11DE97DB5F032175CBDEF6692BBC62927DAFE86C4DDBB66018CB591B87923370269563D6A78CAF60A3AAE0200E6A15B6FBAA3E6DBB43EF656F08B871A1F2304818047BF0C61D93DEAE1C39625635E1EDB076627F8045B6E5067D1F8D309E60876CC1A5CBEACE1E8FFA9D41C0020547F7AFA3D0B411981D55E0B3B37B86A877AC411D1B8CBE12DD33F52A7C5C0AA0AA44772E3BBBEAC5C908B43B631761B8E5B0219BEA50309BD5BEA770917002719FE9EE21383DEB20F626793C50FF9025CBB6086BF102B171D0830DA311976ECCB61C7E0DD079D27EBA7BA5A33291C3A914DD3A1B82D456FAE783F0B210400D08CBA43ED30B24954E467DC0160CFC540C14C088A3323D8AB3BF5E07F9F6D881E7EB56BCDEF30F5E4CBE34F0FD855BF3D8CE15B29343052E05BE0E9197716003E16E699501D2106DA4693B3FBE7B58467B31EF690677FEC4B1FA275518BE60F735050C1188DE4D19311C04A40DA64F4D2A3E312A0A11453714C99A762A4020007376CB58E5E129ED657FDB78A6AFC771B07709936B913F5ADC5A5148E17DC3BA32C14A4D54BAF61237111F9B94825CA069AB851C44BEF714FAC748C9A201B00B3E3967AC486D139D851B765963ED737482D600E8BB64271D35EB94396E5EFECE1FF1BCE00407C48C5BD40D8D63E403506039F75917222F44A954933D5750D00468FBE308E3BE3F0653B015F81404862727B028F6A15FE7E69D57C04CF36DF9E2863937F74ADBD92D60F2E81254D2BE3EFCCC373909B1851951F594498D11300C19AA3FFBD3393C1FA9DF4E6822DEA0E49BE82A6BA1E13B187D957FCA3FC0848A5011F678D402D70257777756996CE60071E13136CA9ED9CC4BCE4A418D41100 -smlen = 1391 -sm = 95CE29A8F31228EA9902D523E62FEB3ACE8B0034F48870DB5B3E83356BD645385DEDFA20A4004B8102714D4365FE0E442FC2F614828F335201D047376A0C21FB86AF1D741BBF17EF301DF9008E76263462EAA2BFC9D383AF0AE2C862391F009725650F6DFCA22D0884E11B8B0E53A82F5E010C946015D2972E49B5813B997DA352B450A6001C08D02ABF55E507BCF86BE9DD3EF4D513E4001824DD203F1E8C0C15A8BC9F41CDE6EAC209009A1EF8C8A998B95284DA59486B73CA05C9FF00ADFF016501F14ABBD26975530B9CA9481FD700FF6D957EC4B34F3DCAFC55A4BAEB6973094A013F50531E83B98F06555E887E64BC655C090B01D3B40846C9374CA0A96508E9B85218874D210001070163F6F79282A3148F3ACD74976A1371F18F44CE340191D88C18415B1D0D320103C1A534DD5944ABE0FE2E6B3E29551E44028101D70D405AA027670BE9ADF2F32DCF019C311FF20F574CD9B7BCE1DF705AE7DCE6E7A621C935A6E57A59EB31FC443AB1E014AD332FA784583260AA6153C464565C4568108D60CC126F6E8EC3BC9120E5659C86CDA8A31A7131936DE7B3DB39A4692808DC3D2BEE8A99880FF9D1D5EFF1E825A0F043D908D62A99779E013845AC0C21ABE8E4DF0EE901E4C6BEB8BB36B30228B7756D617A8F30C16351D8FF91786F7406F75D9FB648830F88EA4537F42EAD62E8790E9CF11F72C31D718221049C9AA35376AD8FB065F4809F4383A23C2B29425836C2DBCE4680450896EEADEE6B83539ADFDF59AA4FCE709D601640EB9A22DC3B41108A8EE1FCCDE9945EBB1D3F676EC8395255E125E62A32149C73451F597E1C32AD979E5BE914FFC7C548D6AE92ED08501831E9007770A0233E5778F22ADF7F1AAADF9C9A7C82D2F42989BF21627D3EF8BD0377A5BE5C9F5A585A246A73DE4340E6B43B36DB775B34033962646C16F26A2B7179C40A721FEA54805B9EC42177B42160B1A67341235B5AF9F30B2703BFF8CDEEE5BD7CE506B0707A69F84225B6E5A92E80EDFA235803DBE2CEC47CFEF0D9FAC95C3379816A39F4550BDBFB45609C76D0351DDF8D61724BD5E8BE94673B3013EEBE172CACE247D79925B12B5DBA2F6FB72E797B2DA849B79DEE3DB76775F5F1DD4595678671C7B18BB3749FBB0C6A7135D639F16B3864B5A251114DE7E9F8CB02B4CC69902EC8D7D544D98E24A05F8ACCB182E2EB44BDE868B077B1FAC4726E8B01CDD0D024405665F7ADB60A23FDBACF421246354E824CB74DFB35E57902794E459493905400D0A0BAD51D8EB94EFAD55C67CD0C7CEFE7A1B055F06371AEC7F490FA685C611D553D8430992EE7B1855A9CB305B5CE53154345D7DEF6110DDBDB5CB59559EB664C6439E057DC022F8686F2AA0CA81552428437B0CEB5FBB5DF254036BD2BAE7290D947C963046771A39D2656312236569E775E7D2A041B7EECCEC99C1B9D2757C7370E474012AE707AE00AC37B73ED9C8E1A2774E54BACEB42E8B31BEA734463CC15576BD4F7A33430B1987D62E47473391938312F2481838F286C4DFAF701ECBC6EAB1A9F074C1F8D8963457DFAAC9A9A8EEA70C50CE70D1BA1006760AD3887605EC38861DC1A777D21E46EA169537057CDFE256CC08699D73B1AC4FBC62F863353581CAD358B9C573D77585DF6544E5D55048D66A352828CD1ADF5F42310FFAC022A25824430F741371027B2DC14717DC87342A74F0038674187E478D8ECEFFC16474A4AA8BDA0C8D41962EF2A4B64A036C888CCF4EA628E1CB9EE0F9A918FB1B22B9367FEEEE0218C83CC7E27C5CB2AC64DC7E111E3C85CA0E6BD4F685E5DDD428E028D192142CCEE3F0C8337BDF43CE4B62704AA53C703EC334FB56FFDFB81D7D4419535D17E5FCC0E6F558AD82149C591FE0357DA15660F61544B4041128218B6DE2B75D3801510669A3977E2983BCAF957EE2942E504C29890A81542EA208E1CEC - -count = 32 -seed = 569B8B9BDB707B19CD6F9BEB29F304D603C1509B9CF25987C280C342E870B1E13EFC7DD7E41DC85BF4F42D0493B84B0F -mlen = 1089 -msg = 7FF38725F35312D75E58845FBC33E112DD95D5C1CF78119CB413AC839377C7051BF5F17ADD1484F5EE12F42B0587AB41DF487BA5E4D8836777B614A9931A5FEFDC4AC451662B342D675C940061C4FF01F747B69CFF585FC5317636E2A830140C0007F73C76FCAB96195C86DB98E5E65C733825DB0325407E5BB059490F2E9133F9B4AA328976256EAAED2FBC59D00288D4830D99731A3AEF36E5BF5239F2899C500F942B80B00C3B33307450FF0C105BEDB7DF84231C5D24C3C3475AE2F46336582DE93AADBFD385C824F21362C19B1C6A75F56B69297FB3084B6164204E2348CB1D7CD3AB494BFA7EC8FE346251C874085F803BD7F4DDE1995F0D3D17033C461D06B49ECCEEE0D5312C3A435AF5BEC9808ACC524599668AACD95ECEA7EF07C4CA3FAB1CF964FDBA987C345046E6507AC3D372BF07D72CAB816BA627C2BD452AB8DC3044A7F0A01D8C0EA47904A5DD66C6B7EF9130D628A4F2CEA5A0D05AEAB7DAF2729C1041FBDB3C2D17BD66AE293C03E77A0837419471C29691EDFB20CF69BC6260975089AA437628F140A44FA2E2967357AC1BF1345E4208C33CFFEDE6CD634B371E7745143FF848F77E5130D1E0F51868585509F9CD3B906EE0A5072CA2E908D6765C74D9B5C35B6BA784A3EA59D808ACBB1C24D6C088CA6C9E17BCEB18337A4DA0C1DAEB5D51EFB35712A475D6C5A2EA51E93FD79F7DEB127F3418F354DF06489E10B42BC1F20651660CAEA17F67F306F48E15DB7E67A1B56578BA7BE6C229FED9567E128D48551E6EEFA17AF5B95A716555571F44FBC41AB29208DB7C1846E130866D5C9BE6F73E601C55610DFD0F67D98933D252059DAA1DEC20AE0E5BED6568A6322322D8A40E6835FA66E317733E1B465434532EEA8FA76886B600E06EFC1DA41F8DCEC0A5E8BA8419F0B7879CC0A93BD14D99608B5BEA931D8971DA8D2D89053E1DE40209E257E741BEF48C17FA15467F1312A368D4A061BFC76C2B7BBD900B4A34DA51B7CB5BD6E2FB08806A53C0D60273167D822FB6982785F2C3B0EC7D893B615724D0193928D0EA8EA2A1DEC5ABDCAA904C754CB7747449E87221B3D86BD5DF26E11DA753E768A8B481C306E485EC91074377DFC68BE74A444906E420C2D8BCCD84BE13AA5CCD11115B669C89E9C0CE374BC4059C696E5F8344FEE467AC8C8ADE37DAF614992914C763D971327B60946943847FB6B82672CC376B780953B6F4433DF69AC61E110FBF1A35F6272561193D8652EBCE3291333FDD4D84B9CFBC60A57E1F8B817E84EA15D440D4A4B4F7E19C08DDFC5949FE8CBDDCD0296A62F12F53D48B1288B80E24C756FC38E2FAE9C7A3315D1C6DA42AE838AFBBF5569F633A68289EB7073BABCB210F4E08856FA65057BFABC70AD3B58C2C870DFB5E1B0D11B6FA6D5BBB68285D8F9C21BD89669781C9F4DC32EB1EF58B80B1D371334D36FA66A2B3DD4B3E4DEDBA7AA9FB7E0245F5FDBB66CDA653C5232A131EC1F0C21DB1C47B990A64A24DC8C4DA951F419F57C03FF506E0147C22E99461 -pk = 339212069C1024FFE8266EF734D3916A728201F574C4A0DA3734E9EDE1031FDEF6EDF7F263724332537A2D6DE8E613667159844011559CA521C24EE63C9F1D00501CB86E17B7CCD079CAB8820B2BE1BFBEEDEC93B8F134E934A2799C89FF641017AB8BFDA3EBED92FA78F300F32F6F08F3CCAD2DE47DA4FD853E9DCE02811200 -sk = 339212069C1024FFE8266EF734D3916A728201F574C4A0DA3734E9EDE1031FDEF6EDF7F263724332537A2D6DE8E613667159844011559CA521C24EE63C9F1D00501CB86E17B7CCD079CAB8820B2BE1BFBEEDEC93B8F134E934A2799C89FF641017AB8BFDA3EBED92FA78F300F32F6F08F3CCAD2DE47DA4FD853E9DCE02811200020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006F8DD8E54A3538180272A781452C0C97802F46D8A0A88B3679D6BBA88F4FE6200CB0691297BD1CD677CD5BA0E7CB83644708BD36A3B788010BCFEE920509B584414CCCE8826D8891B4F7CFC008CD0B3B05854C49541D19D43AF3FFFFFFFFFFFFFF16EF90C0F0574369AC1150B6733696ABD90F285731B6C76A1F0D82561642F091B32EC585B5A24C09FF1103675E8DF00568E16C137B9FAC1FFD8B26DE33EB3D6858C63480DF05CD398E47520134930B408FDBD50F231A7BB9C4F3FFFFFFFFFFFFFFBE5E29C6CC83A6425CE291BD2988529867E9713FD8F48DF67498A1161787557EAFCEE2CE86FD0CE557DF0DCC132D76089407BA7CD914BE57AE2E0200000000000000000000000000000000000000000000000000000000000000000000000000007F64716EA9FCCDB66892E5F5B9D9BD3282D8FFD82F7C7B5D645D5EC06F7FFF078B574CC71BEA905F51C62D12B22FFC86DB6A2A44789E98F77CCC0000000000000000000000000000000000000000000000000000000000000000000000000000007E4E074C00F83267A17F6D0637F7D4CA99ED77F6A1A28C6E2EC665ABE790E153DFFB49BC0F093D1328E91025522FF5F261CF55837B0F296FF032F4324BB020000777DFF64DC696AA19BBCB4C7CF8E99F4632289988D8CA0341A1B6AD9DF464DD470767A18BAD2A8369F79252FBA7ACFF35C07E7E29D43889F5F34CC31AD30800D23156CAACFF24DF988223B284171584BFA7D658CCE3A9CE247A8CA97E1031D9D8B97361340FE35883198828A3CD00253C0C1A09E2FF1C57A4DBED6280BC1A00B3E7A5BD72A7EA1221A5D3A2625DFE6476BED85CC00A66261575F06854E24B281902E19181F5C0F1AEF29EF1D8596870A745CC3A5391C9E6E96CED9CDFAD00006471DD7F33822154149CDAEED3180A19CB2547C1B49A477B32079E84C069D3A91AC933BB2765621B84B58863AE8C5A6B200AB58723D9C4A1A03D35B7EC5408006665C47A07AA977F6FD28209DD7BDDC74A35B344399471E52D6DDDBD9DE353D35F5111B9080FC5A58B3783872519B68781758911EC3018483EE76CDAE1000B00CD375FE06EF78DA91CE61C38A89AC417966C6DB8FCBAC9106A9269FD980B82B8CF21C072C69464862C1B0BCD8088DB2FF74FD583A14DF4723DDDF59176DB0900E282993ADFDB32A3E9B885291C1FDA3A6E624C6DF6968C02A4D853B899E8CFC64C097488A49022160987D7674925A7512FDB3FE5C90E4C2366E459EC2ED023009F0E067DE0C3CA1138D6B4A730EAF50CCFDCC7CB49C2F7ABFF3313CD8BE3A7D0B1544CD62C630B76CD16AC4FECF6BB275A6A418F4F06F3AACFD63E7408591D00D730340891FB6C5590027D5932DCF6D66FEF9CDBC83AF68DF607FA6B12999DA774075F1F040B9611DFD70EB33EEF6BC0344A58060728269E47209DE5F23C13008A0B007CADBD7C1CC39A5CF6DE3B1B5E56AEA6B32BD5EFB2931D0F93F41105F873BE2142A5C9F297844C85E73D1D2E1F73CD2F85C3370C532F5286485B092200980365E9E7628D3AA8CC9291EBB09F2E6FCCFCDA091B692B798795CB428808EE443A08AA88173D6B9DDA49159A5FC416432F69E377F6155EAFA694732FA91400B99CAEA056B15D0570F2668C2F9B8C50A77E1CCA315ADE1FB4735DF9EE690ED35979FC1E1F82D9205D404C5C4E2073E0D35DEAD355A55B4BFA90B99B735D1300550A032F36363FCDF29E07753A6371A4B7CF46C7F203FDC32028FF4BC7459537EF862A576159D7040CD92CDE43936A649FB8C10411209C1FA7CF60D91A682100 -smlen = 1424 -sm = 5C4E53D03F1FCBF5F1D2307C8D57D39227E6006658BA5BFBCD77D261936DF0D0E848F6E041004D0E5039109F5FFE1DE801A4E5FB0F5901B8013F82FA2A1A7389794D0E9D4B041390D2A8690174DED886614D6867E719C55D1C5F2147810200CD6B849F167D7337A142B3CBFE11625D5C8001908C48C1D954008216C6E999B4F5A68F5A030072311D88DB39A6556E4A1BE456AC85F4A30A0002E664CBBD8AE8A44DA572B73C9313CF05A3010085CDB61D41F609D660183D74CAE8F12BEE00C2067D7DC2188C3414D3510E523061DFE4DE01F81ED159606953F6C812D7D8FEE2B64D32DD00ED39A9274479BCDE20077B8FB327974EECA100E8B97141BF7B9A6C4DC4551F41B380395FBE00006F7B2B4ADDF14F082B8DF8676FF60C7476F2567076C61FBE490459A1BE3269F80503532B8C9EC48E3C0EDB4337C0D147664EEEDE00A5BC4F63A74A2F6D2FBD27C1274E027FF38725F35312D75E58845FBC33E112DD95D5C1CF78119CB413AC839377C7051BF5F17ADD1484F5EE12F42B0587AB41DF487BA5E4D8836777B614A9931A5FEFDC4AC451662B342D675C940061C4FF01F747B69CFF585FC5317636E2A830140C0007F73C76FCAB96195C86DB98E5E65C733825DB0325407E5BB059490F2E9133F9B4AA328976256EAAED2FBC59D00288D4830D99731A3AEF36E5BF5239F2899C500F942B80B00C3B33307450FF0C105BEDB7DF84231C5D24C3C3475AE2F46336582DE93AADBFD385C824F21362C19B1C6A75F56B69297FB3084B6164204E2348CB1D7CD3AB494BFA7EC8FE346251C874085F803BD7F4DDE1995F0D3D17033C461D06B49ECCEEE0D5312C3A435AF5BEC9808ACC524599668AACD95ECEA7EF07C4CA3FAB1CF964FDBA987C345046E6507AC3D372BF07D72CAB816BA627C2BD452AB8DC3044A7F0A01D8C0EA47904A5DD66C6B7EF9130D628A4F2CEA5A0D05AEAB7DAF2729C1041FBDB3C2D17BD66AE293C03E77A0837419471C29691EDFB20CF69BC6260975089AA437628F140A44FA2E2967357AC1BF1345E4208C33CFFEDE6CD634B371E7745143FF848F77E5130D1E0F51868585509F9CD3B906EE0A5072CA2E908D6765C74D9B5C35B6BA784A3EA59D808ACBB1C24D6C088CA6C9E17BCEB18337A4DA0C1DAEB5D51EFB35712A475D6C5A2EA51E93FD79F7DEB127F3418F354DF06489E10B42BC1F20651660CAEA17F67F306F48E15DB7E67A1B56578BA7BE6C229FED9567E128D48551E6EEFA17AF5B95A716555571F44FBC41AB29208DB7C1846E130866D5C9BE6F73E601C55610DFD0F67D98933D252059DAA1DEC20AE0E5BED6568A6322322D8A40E6835FA66E317733E1B465434532EEA8FA76886B600E06EFC1DA41F8DCEC0A5E8BA8419F0B7879CC0A93BD14D99608B5BEA931D8971DA8D2D89053E1DE40209E257E741BEF48C17FA15467F1312A368D4A061BFC76C2B7BBD900B4A34DA51B7CB5BD6E2FB08806A53C0D60273167D822FB6982785F2C3B0EC7D893B615724D0193928D0EA8EA2A1DEC5ABDCAA904C754CB7747449E87221B3D86BD5DF26E11DA753E768A8B481C306E485EC91074377DFC68BE74A444906E420C2D8BCCD84BE13AA5CCD11115B669C89E9C0CE374BC4059C696E5F8344FEE467AC8C8ADE37DAF614992914C763D971327B60946943847FB6B82672CC376B780953B6F4433DF69AC61E110FBF1A35F6272561193D8652EBCE3291333FDD4D84B9CFBC60A57E1F8B817E84EA15D440D4A4B4F7E19C08DDFC5949FE8CBDDCD0296A62F12F53D48B1288B80E24C756FC38E2FAE9C7A3315D1C6DA42AE838AFBBF5569F633A68289EB7073BABCB210F4E08856FA65057BFABC70AD3B58C2C870DFB5E1B0D11B6FA6D5BBB68285D8F9C21BD89669781C9F4DC32EB1EF58B80B1D371334D36FA66A2B3DD4B3E4DEDBA7AA9FB7E0245F5FDBB66CDA653C5232A131EC1F0C21DB1C47B990A64A24DC8C4DA951F419F57C03FF506E0147C22E99461 - -count = 33 -seed = F32C3715B0BA8C1D0BD59F0645E9697DFCF9AEAF761A71ECDF9672215B9F138C0502D7214F6B1BB4D6612432F9FBED5E -mlen = 1122 -msg = 789518EE21DC99CAC94DD5298B2F3EB8F6AB8D0705D24D9AA3012F217464E7F203E08E5CEA9E44F54A6F73E88D81592826E243B7F0B2A1B3A06E5AFDE23A2985183A0E430E01C3FA90E9F1DB7E69DD8E7DC6FB802933E04A18834C091ECD46F0DD423F532668CEE8A12A06BBC7E5FF3B9488B8F4A87A92BB8D6F313269AD95C574245E06563BB58BFF6169B8F4C333033BC128B91CB81DD41B831DF5103B295F744EDE95FC3A0C72F1134A9321836AFCFD563192C343040B943F69C0E98E8D740C06CCF840CBFC6BF777C9561065916F13D116D758A151E8FF4C355363AAE8E4F49D2A2E062A2BB213AFF25662D95549B4B025E70AA3363B50D25AF84A3E5B0FFA598CE074733AD191C86C351592299C26C0A4933573EF436B73DFD0C4EACF93D361AFE5F824B91BC178EE8381B9EFD52302AB8CAD6C08C7E090393B9B8ABC78AF374FAC6E60BD104BAABA524E68D75A759B94176105A9CFF2E5B9C3984FF61C5AFBF22B8E1B9E4F9BDFFEC0B19C2A5C8DB3B8B2C02115D101805C1BD6652F738F02600E38998CA41BA8955094FAD5BDC34133D4B523EDE66CF483F1CD5ACD9EFAA69703807410939974D6DC033BC696541357DA9881A4FD1385671B6E4BB889C68B544175C1E2EC1395DFF4CC87E037087C615CAF40804D5F44A2DE301961A59818173730A45CF4C2DF172614AFF7199A40C9FFB9957242A89FF86B36A4F4D60F15DB569C2FEFAF677B35FE5F12AD5A323397714286E338FF6B9080FCA50B657DB477A52A93B243BF28CE2743794C361F443AD81EBAAEAB2B237EBBC572D8586C3EAB1F42BAEC1C985D28BC58B296A11D96A04B0E1F7F6790B92E450248804F3F62B5865941BFD444A910F31E1D6B79D8906E7E9828618F960EC14124FBEED28E1F58A8BC9D31773442FEDC5A220F3912D0B41267D427C0C15BB76F9200C54B5F050307E13F1EB3DE92B864C994A3DF4CEBD1BCA634710FA342E23D7C8A5BAC1B58AA321E215E4418428206F05232E2BCD1B5EE1BB7E34E7D4C93088991EE9DD643FD08B0185A2F0AEFFB0EF0EEA3ACB4CE234BD5479A4F4296001305826F23083CC9DC99011864F250E77E42A0DE26AB09FF6E3F32552F6F913256729B357CBF5DFC825E91BB5D3FAC1F729803D431D339955960EAD69B1E54536CFD774341CDFDE1D1F527DA4E738B2E292BDC884687D1016DC193EDF34A37D284D026D33698295E864196E0BF16FA83A35F65FF2B38B7030E9E63EAAF594F272E07941313D538546BC84671739AF822391CA4DBE6A579A81F45FF51FA5B7EF49BEEE7BEBA4AE07452C13366668F02752923EA3653043B26C883799FE6352F95144283D946CA87143B74C8A009C024D073BAAB9BC4DA6C87D35FFFD753E1EEC7F01944639E566FE17A6F715F4197D1CBA58D3D153BDA37D7D2D5E19620FF0842527D109333FA2BA8BFC491689F4551BEE6C9D13BB9E69EE4F44B782BB05D1E48D293BC15B9FC706D52B021C7159FF7DF80E55627DD7555795F1FC616830A4BA2C02FE1A19DABE088E460BF3C5A88313C443179C593458467FAA468791CA74E9B1E759847B6939F -pk = 4F45C443BC27B51BA26F58F26290D64BF293DE271F9C823A10B8D998443BEEF556C92B8ACBA4F8EEC3D82982D69AF0C564DF728B6B647C40B1B3073BA4201A007D9B160929620DD072465943BF0EA2BA13421960037BD8A0870F3105E1F34A7F480D5E8891EEDF3EAF60E65696671026F3FE0B280A2D8FBCC035D800725E1800 -sk = 4F45C443BC27B51BA26F58F26290D64BF293DE271F9C823A10B8D998443BEEF556C92B8ACBA4F8EEC3D82982D69AF0C564DF728B6B647C40B1B3073BA4201A007D9B160929620DD072465943BF0EA2BA13421960037BD8A0870F3105E1F34A7F480D5E8891EEDF3EAF60E65696671026F3FE0B280A2D8FBCC035D800725E18000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069EA6A1FADE0B50B677DAC681489AC7DFB89BFEE8540BCDE1A7A87DBFEF72A149C46BB14180BB6989BB0127FF6AF79A28F99E02D1870F7C2F96FCEA745C18F530C69D71183C77548749880FF07B9E23CA300C1E0F1F5AE126CF9FFFFFFFFFFFFFFF6EDD4EE5EEFA55023ACC337C3A68B5EB2265C129CCD9A63E75CFB70C73F429DC254A962782AF6C153388E7E28599869136EC907F2EA9445399840085AD15F48FC29B13066346CFB86638174398C8C574723F87B50BB4711E9EFFFFFFFFFFFFFFFF6E07E8499ACCA013F4B4E3A1D5F383C92830539FC09962F9336FF3687DF7CABB580B5ED6E799C10A2FC9B2D3927A5BF6E0193216D8B81DA11FB01000000000000000000000000000000000000000000000000000000000000000000000000000097C71535BEF292F35E6F7092856A8649D5D724357B6224506EE304F84A4C87A507510C1F48DE1CE9F1C1ACC26673DF13835D033AEF64665CE10D0300000000000000000000000000000000000000000000000000000000000000000000000000001B68FAF48375C85C2BA545E81A17F53F75B970DFF82DED13FA868594925996E49E5A2A6CCEE6261EE3E65CC5ABBE191AA08FA0F8005DA9004786E34B8DCC18005DCAD8251B804F9761235F78171246B598757ED7FFFAE1DB9E028D877BB33038CE87DF2F5F51EE53AC3E0B9561C836D56A7AAE47967B3201ACB4D3C97BEB0300F5423E012567F99901EE9E73E96DD9F7DD30F63F403ABCAE9C1F84FA63CCC08BAC316B8E54E0EB0E73F3219E5551AE99AE1F81746BC5BDA1DE9B902A3A820E004FF422935987053E3DAC0E9950E21E27171E886E308E6644DE0D40C19A61DCCCF85AABCB09E0AD8F390288BC8D6C31EC4FA854F2A7E5E59D02AF12872EB321007F2F41767E5D43C3537DB6D43C5774FCD3EBEF81CD862738E905688FE1222A8B99FFAA1CA24451961206F0040F4121A0149210ACEC33F6F78AEF74560F3C0E00B74EB19DA29F6F0684DD1C2F7AC24B52E476DE342C8A86D7D91A4FB7EB582821702E3B0909B2C9E308D5F70BF57E6D0E7E6170853BC9694FAA2E5C2B7BF10400E8BD6CF855FE71FBDC2E45CCEED9A4F657387390C12B5DC9D949FDDC3C56D28EF78D7578070984C025FC6AE14930B68CAC94F3946CE607EF1494B39B44310B00FDD3C75710E118F986D7EB7FF3D5E74A4F81F5B8C00EED59676995FE9E7277FA3B16042429ED762A8309C23A7EE154431F0613E2A93EF32D186C8A5922D41200548D12142F5EF6776077E0C5EACB527D53E69F985DAB4EE3E7A410AE632AE4FC58A49C6B26643C6A111080A93F45BA64438F1605C89892574C1DD3B2BBAA22005F466F91E3B39CB3248AC03C0EB7D10EB784045D9AE2079DEDA876D6ABBB059FC2F748113E8671C0C174B796216820A3E496C3649905C06D6092FBF2BEFE14003A060CE6A2405218F6689A0C6310ECAA185C193A96E0A019028A744B2039A59C4EFFB9F1CF2D06C3BD1D6E45674C6308B1785AFAE1C87DF18E00C16D3F620F005EE2C5D4148B2D6DACF97F65393BA765DEC570C35CE79834ACFB42C0576AE15DDDA3841AF3083BAD8FB1D2886007BE0617F70CD081152F744A140F43B5341700E627C80CF6CAF69B912FA11FE71F448F0F676DF45E98B5B90EDC9A990D789D719F2DC28F50ECD7ACF82242AB2FA1DC46A7A2D73BB12C6F06DFE1B0187A8B02005B3C8D96CA93075B63104C4CEC0993AD3786B2B263F0B7DA948D1B21D816B89D52842C0B05F819B7C2D545356EB9B663E02A59DDD46523D6FD1AD1F33AF61500 -smlen = 1457 -sm = 84C2CD20B431DFB09DE4B00E17279CE0093E0128EA024DB6638AA1414941ACE71B8FE991C9013E90623D3D9FA4A0E18F35D875AB1A23004A010DF1C02858040C627BB0DD662F88D14D69F800008CCE1F62D3870535A82B2A96401DC8361401B1C855A9A8868B8B135D2BAB3D7A7E9E12EE0128CEA7776DFC1E81F0D6123ABAEC0B7BE0DD0086FB2FD4EF805A9A7EB1CCD63B2D05AD441C01480FBEDE1744A59F6DC2D4D1AB9D8D5B788D0057EE0D6B030004EE5F48E12B90257C65D82601AA07C5F0476CFBECE26098E03AE4B24C931501E3697891B8CF7FDD1A11F9FFEA8A0418EDF10060881A3226D670B57ECA125B9F722B05E647013471E85223B527187B96B75886BDA2F6AAB401017949A42E3E5258EEF1D67A597518FC690D94906BA32319FA0F9D5D1BC70AC103020082AA1B70B67D08EE46E98B9271C19BD4259801E9B3E31F7FD64E7F21F32F03C86700789518EE21DC99CAC94DD5298B2F3EB8F6AB8D0705D24D9AA3012F217464E7F203E08E5CEA9E44F54A6F73E88D81592826E243B7F0B2A1B3A06E5AFDE23A2985183A0E430E01C3FA90E9F1DB7E69DD8E7DC6FB802933E04A18834C091ECD46F0DD423F532668CEE8A12A06BBC7E5FF3B9488B8F4A87A92BB8D6F313269AD95C574245E06563BB58BFF6169B8F4C333033BC128B91CB81DD41B831DF5103B295F744EDE95FC3A0C72F1134A9321836AFCFD563192C343040B943F69C0E98E8D740C06CCF840CBFC6BF777C9561065916F13D116D758A151E8FF4C355363AAE8E4F49D2A2E062A2BB213AFF25662D95549B4B025E70AA3363B50D25AF84A3E5B0FFA598CE074733AD191C86C351592299C26C0A4933573EF436B73DFD0C4EACF93D361AFE5F824B91BC178EE8381B9EFD52302AB8CAD6C08C7E090393B9B8ABC78AF374FAC6E60BD104BAABA524E68D75A759B94176105A9CFF2E5B9C3984FF61C5AFBF22B8E1B9E4F9BDFFEC0B19C2A5C8DB3B8B2C02115D101805C1BD6652F738F02600E38998CA41BA8955094FAD5BDC34133D4B523EDE66CF483F1CD5ACD9EFAA69703807410939974D6DC033BC696541357DA9881A4FD1385671B6E4BB889C68B544175C1E2EC1395DFF4CC87E037087C615CAF40804D5F44A2DE301961A59818173730A45CF4C2DF172614AFF7199A40C9FFB9957242A89FF86B36A4F4D60F15DB569C2FEFAF677B35FE5F12AD5A323397714286E338FF6B9080FCA50B657DB477A52A93B243BF28CE2743794C361F443AD81EBAAEAB2B237EBBC572D8586C3EAB1F42BAEC1C985D28BC58B296A11D96A04B0E1F7F6790B92E450248804F3F62B5865941BFD444A910F31E1D6B79D8906E7E9828618F960EC14124FBEED28E1F58A8BC9D31773442FEDC5A220F3912D0B41267D427C0C15BB76F9200C54B5F050307E13F1EB3DE92B864C994A3DF4CEBD1BCA634710FA342E23D7C8A5BAC1B58AA321E215E4418428206F05232E2BCD1B5EE1BB7E34E7D4C93088991EE9DD643FD08B0185A2F0AEFFB0EF0EEA3ACB4CE234BD5479A4F4296001305826F23083CC9DC99011864F250E77E42A0DE26AB09FF6E3F32552F6F913256729B357CBF5DFC825E91BB5D3FAC1F729803D431D339955960EAD69B1E54536CFD774341CDFDE1D1F527DA4E738B2E292BDC884687D1016DC193EDF34A37D284D026D33698295E864196E0BF16FA83A35F65FF2B38B7030E9E63EAAF594F272E07941313D538546BC84671739AF822391CA4DBE6A579A81F45FF51FA5B7EF49BEEE7BEBA4AE07452C13366668F02752923EA3653043B26C883799FE6352F95144283D946CA87143B74C8A009C024D073BAAB9BC4DA6C87D35FFFD753E1EEC7F01944639E566FE17A6F715F4197D1CBA58D3D153BDA37D7D2D5E19620FF0842527D109333FA2BA8BFC491689F4551BEE6C9D13BB9E69EE4F44B782BB05D1E48D293BC15B9FC706D52B021C7159FF7DF80E55627DD7555795F1FC616830A4BA2C02FE1A19DABE088E460BF3C5A88313C443179C593458467FAA468791CA74E9B1E759847B6939F - -count = 34 -seed = B0C7530A52AC9F561C2C14548D3A5F5053396B738EA1C7A5190F5AB01C9C38719C4DBE856E42D37A114FA24FD5DF5081 -mlen = 1155 -msg = A4117808D9D05B702483924E99623E778E7A3B7623739AB7AC488ED93E711EBDDEC383BFB7E06086FD0C374F4668AB744AD99B8AF1C75309B60F55DC03FF7BE6F23187FFD5CB224068568CE2D06ABE441557B04A5A0C2858C416F6F7AA89A96ADFC2AFC54E0F31416CEED005B7B140B342652DAC7BF401FED4D94D475784936FCEB4B4F334BB14BA55B1EA9A36E2B0591287EAF4ACED997162691A96E7F59853E609ECA9A225F615A49A12763D80B5DFE6F8638923C39BD652936B19B944D5116F790E866A61947EB60CD1F3A1F319710D0F40E487EFBEF51FB4D00F5DBB94810128215F72B1AEDD74A1B1D237088DE3098417714EEB67D6A3E6BB647B6B0AC6D0BA3089D4CF6252B69C414E2BD6614429B6FCEABEBA50A4B53C7394652ACF7DD9403AE14436ED5FD4D1C9E238A8399A763806FEF5C3742C55B7159EBF5A13B271428F91229C191D617808A26AF9190F9D445BFD3B273702BC3E7F610854C8E86066BE7757960A880CB6727CEF19DC7B464C464A7DAC9AE85B799747B8488A4123B6BC7F0F7C2A8E53FD4F8687075B4E25660F5107ACF22CA688057DAE0496FF15A3EB9379A9F6E22FA43C932F137E389478C05DB86060686AFEAFBCB9ED79AE194C4146A48CE5E07EAF585279313851CB864A50075AE46C1AAB3B3CB920DEE2652F5AFA0138051C7C980946E8D5E18C16789CD184DC5598F65875EF43418DD56E11DEFB5A4A6AFBCE041BB292E0E2EC563296BA4EA6CBFDCCA32A18C8AA395515A83D0FB7819413E5AE056FF0EC2F63F1D52A8BE0B334A628D00995BEC7E46A34BCD2DCA0E9C5A88E0FC8C43843D6AE074C699276293FD8DB2BE48885155688428C2F5A6C6C91BD4A03CDE2126205F9EBAFE319D1B4F80277FE99211A09628AD840046EB9AA568EC71252CE9F69827B677D9C0D99546DF5A48A8D253AC0036DDAF4D045A70F94EC54BF5F06296B2C2617F2B0EC0B8374DD28DE269FAF739B1E55AE1846F548FB6C0403C5ECEE3CF9D1927E317F0D07E11AEBA01C240FE17C6660F7CB32305AF1EB6DE4312FDEA6990DA4E9135DBC0B88AD0AE0847E1576F3C2711B785B846C7A4B823688E4218596CAED583A90DC46BB9B27E00E4C1110B65F77E602F043A8441563667691C07162E52A53CD76E2D74DCAAA2983BF2E8F02CC30B05BD4F9AC731931C59F9EBC038FAFB09FBC886F4C4191352206BB49ADAEF9D74BD08A5B780FF0FA301343F5EA81D36912ECCB0FF24BBF0BE6A8283EBDECA79CFB22639DA38C9C639C4BD66FE5A75F0414FCC1455702856E6FC58344BF02998E17E967183AE920B7E04F58AA09145D6DA79B65EFCD18EC55BB9CFD53914F80D73C2B08BB754AC63E4C82D44B72376A544D97394B7C99678758B15CB94E71F9FCCF674B29ED5AFDCE452959BE5AF510D57F9E5395A576EAA1FA7BA9AA4122A779727071FA485C005B447760410DEE20B7C2299B4A0D5D9E5E4E038A19C87806C3FB875EA5BD7F47D034D7D5FEC4BF132B04E47574172D392EA7B371516190AB81C67B45FEF6332848A51B6C7DBA90C410A44E9A88AC082FE296A7435E7D2DDFC645D5AEBBC29620525757DAD1B0222159D658C7225D02374EE6AF479FCF1AA28CD91B -pk = 91AA9FF551B7DD26FD1C90DC1705F2B6FE581511237F12FA5B0945AAD69438FE3A4600A2D620573CAC1BFB7F19D4B81EE763AD26007909B70FA68D4BBB772200BB98EA483AD7721CAF8645D022E2C9F95DE6CD60457B1A2514F5E8DE21F263E467D4F156162F85DED0A90735E4EBEB5991C537CEC8181CC53F4FA33B2D5E1100 -sk = 91AA9FF551B7DD26FD1C90DC1705F2B6FE581511237F12FA5B0945AAD69438FE3A4600A2D620573CAC1BFB7F19D4B81EE763AD26007909B70FA68D4BBB772200BB98EA483AD7721CAF8645D022E2C9F95DE6CD60457B1A2514F5E8DE21F263E467D4F156162F85DED0A90735E4EBEB5991C537CEC8181CC53F4FA33B2D5E11000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083FCB9A16A1D66A5DDDDFE943DDF65D2C517C2AE38BB51CF9D0447A1FC244FE76DBBC332CD72802CEB0023B81D5FAD8960F5877076106D1667885BB6DDB340B7016911C91F227AAE8720C8EB3FE0C2EE7FE0462B00219E89D70F000000000000009CE1CB95B99193B93CAD39F0F0DEC4FC710A97529930D03426F127B2C82F66E194F50E1580425B264F71BBDEBF017031DACB356EB72D2452D40017F1B43A814C8B4C5C5F563AF2444E503F03C8145C2B1DAD5CA883A54956F8F3FFFFFFFFFFFFFF3C380B8A7EEC347F3DE97527F10C6C7A5D66F1449D785133736E82A85892A6D93C0AF7DB175F9FD3D90B7C770B96C674E7A023F5729849403753000000000000000000000000000000000000000000000000000000000000000000000000000000FDC1A58E2C2D3A79FBACF3618DA1ADA513E84332EA2C5DA788D0C0CB0CE0DF0075E5370294D5EBC8C5CB36EB99B24C42CA8ED8D2E61C32372157020000000000000000000000000000000000000000000000000000000000000000000000000000A42F2035D5C93B8BA2D310F45390128843952CC235ADD06ABB742970B7BDFC3EA91B0890F204ED7D42F1F35ADC7B054437294046046ADC1C223FB3A585F20F00228E464520267E2002C3D86B160825D3C68B063A50ADA20C894279A5F8E7B5ED3CCA9488C47B9B574FBC9E890C840AA38C801D3E9BE262CAE682B51CCD441F00BCE14482CC29E9773ED629465CFE56C67B3B9E31C61988FF7D060F6E8EADAAA0E76B7C0D74B0CCAAF067EF263C4D4A0CFC7A4144791149DA06DEE707BC9F1400340D435DE49D88AFDFE1FD929BCFE279E00B8BCC01E11C0FE52E09132904C742E35BDAE78783CF8E2646F2D3995499292D7B5E60122738E4B6236F402C390100920DA80B9A84F93445C94D0E7A4125FDD34C802B6B236FDEB70C9D62AF4B9CC2AEEBC91E4B7C4A92336EE18F488621E3F0107D1A0F6899BBE54A0F4E19C31400E643E8269E058D991425D30A14981CCEE9969399798AFE09E610F119831489DD6EBB15EFF52F184FA4DD465FFC6E5FA60FA78A4B06DFFF211E6CBFFE07EA0D00A4D988A3E8017D47FF65B83B7193502AE9EE692413D784BC2863DC90BCE87715CE71A4614A3367C0F860F03F144DF4E6CD562BA3411CE457AF7B7356E3D510004BB85D5F348DA25BA39E26D777C9191647B91E6B7973BD315F9AF84732B6DC5686459A961C0C2075E5AC8632E0EDB51AACB23CBAB978D997AEB4DE4DF863030055AFB3FB8368C2941AA85C8D6D965151B0BF1AA1C99659BBD89F77590BAF7FA683C3B13F2762ED13461F66D482A4D04EF7431397EDF4D15EE70CCE6D288D2400FC851F4145124E89C55A419B220E213EAB6C3ED265553BD563596E043F61D1618A8BB077B8056748A7A4BFA57A0C08A6C5661E059A31696CE00DCF956DDD190010CC1A2EB72EDE10A173DE8E7406F1B7953AE0AE6BC1DEB8706963EF669FCFFA7644F4032133692A12234FFC83554725279763AEAE5371C05334531A58B303000EC727B6B0325C09F81CCB2C0F499F045C83C62DEFD45F74C8BEF5E4FFC0C433C8B8004AF2A6FF980D2668519F010E16066801EE7354FA20DD920C07B2D11D00C72F414916D029305969BACCDDA353149ABF04AC5FF5ABBB7ADAB8EE0D9803AC48EAE131CBA2302EDED36378D68A384DCD520D2011811E22FC90888CC2F319009B9175328AAE42962A269AA95E86C15E71166B6B036547A94D29FA86AAC51B24DA5CA84A2342E6A64A21867E45B8683BB4F49FA3ADA2084EC122385C941F1600 -smlen = 1490 -sm = 4268D15938C0FDDEBADAE556BF64843EB9A5009076446076D2422CEAD0813EFA60CCC639E701D35D8508ECCE02B19483F771396B2D79709C006B9BFE163B7C05F2269F106294E6E52EFAF00044CC93CF18F51E844D6B665DF8F90AE90EDB007C7283637F89DDCC77D05553E7274194366801444FB241E398901581FDEB60E74661EF4ED901E6DEFC4D6A73D562348C4573D9FEA4FC750300D0471B670C5FFF9785309633DEB0409A6B7101513C5BC369B934BDC001ACF8F3ED91FB834500F359AA41238B1723824CEACB990999373690019F51202FCBAA526C994F3D9808A8A836F9A3015F23D18EC55925867407F1E7A18535F1E294012AD4C12B2F1A69FD8143D6A83787500F77430001C30E11CE4CD7B5AAF98F71F8EEFB752335273D09782B8A4300EDE9E4488682C80603DE64A3A48222D8F15C06A2BCC7DAE195835100B6DEF1BC2ADD358C5A21298C6D0F00A4117808D9D05B702483924E99623E778E7A3B7623739AB7AC488ED93E711EBDDEC383BFB7E06086FD0C374F4668AB744AD99B8AF1C75309B60F55DC03FF7BE6F23187FFD5CB224068568CE2D06ABE441557B04A5A0C2858C416F6F7AA89A96ADFC2AFC54E0F31416CEED005B7B140B342652DAC7BF401FED4D94D475784936FCEB4B4F334BB14BA55B1EA9A36E2B0591287EAF4ACED997162691A96E7F59853E609ECA9A225F615A49A12763D80B5DFE6F8638923C39BD652936B19B944D5116F790E866A61947EB60CD1F3A1F319710D0F40E487EFBEF51FB4D00F5DBB94810128215F72B1AEDD74A1B1D237088DE3098417714EEB67D6A3E6BB647B6B0AC6D0BA3089D4CF6252B69C414E2BD6614429B6FCEABEBA50A4B53C7394652ACF7DD9403AE14436ED5FD4D1C9E238A8399A763806FEF5C3742C55B7159EBF5A13B271428F91229C191D617808A26AF9190F9D445BFD3B273702BC3E7F610854C8E86066BE7757960A880CB6727CEF19DC7B464C464A7DAC9AE85B799747B8488A4123B6BC7F0F7C2A8E53FD4F8687075B4E25660F5107ACF22CA688057DAE0496FF15A3EB9379A9F6E22FA43C932F137E389478C05DB86060686AFEAFBCB9ED79AE194C4146A48CE5E07EAF585279313851CB864A50075AE46C1AAB3B3CB920DEE2652F5AFA0138051C7C980946E8D5E18C16789CD184DC5598F65875EF43418DD56E11DEFB5A4A6AFBCE041BB292E0E2EC563296BA4EA6CBFDCCA32A18C8AA395515A83D0FB7819413E5AE056FF0EC2F63F1D52A8BE0B334A628D00995BEC7E46A34BCD2DCA0E9C5A88E0FC8C43843D6AE074C699276293FD8DB2BE48885155688428C2F5A6C6C91BD4A03CDE2126205F9EBAFE319D1B4F80277FE99211A09628AD840046EB9AA568EC71252CE9F69827B677D9C0D99546DF5A48A8D253AC0036DDAF4D045A70F94EC54BF5F06296B2C2617F2B0EC0B8374DD28DE269FAF739B1E55AE1846F548FB6C0403C5ECEE3CF9D1927E317F0D07E11AEBA01C240FE17C6660F7CB32305AF1EB6DE4312FDEA6990DA4E9135DBC0B88AD0AE0847E1576F3C2711B785B846C7A4B823688E4218596CAED583A90DC46BB9B27E00E4C1110B65F77E602F043A8441563667691C07162E52A53CD76E2D74DCAAA2983BF2E8F02CC30B05BD4F9AC731931C59F9EBC038FAFB09FBC886F4C4191352206BB49ADAEF9D74BD08A5B780FF0FA301343F5EA81D36912ECCB0FF24BBF0BE6A8283EBDECA79CFB22639DA38C9C639C4BD66FE5A75F0414FCC1455702856E6FC58344BF02998E17E967183AE920B7E04F58AA09145D6DA79B65EFCD18EC55BB9CFD53914F80D73C2B08BB754AC63E4C82D44B72376A544D97394B7C99678758B15CB94E71F9FCCF674B29ED5AFDCE452959BE5AF510D57F9E5395A576EAA1FA7BA9AA4122A779727071FA485C005B447760410DEE20B7C2299B4A0D5D9E5E4E038A19C87806C3FB875EA5BD7F47D034D7D5FEC4BF132B04E47574172D392EA7B371516190AB81C67B45FEF6332848A51B6C7DBA90C410A44E9A88AC082FE296A7435E7D2DDFC645D5AEBBC29620525757DAD1B0222159D658C7225D02374EE6AF479FCF1AA28CD91B - -count = 35 -seed = B2FD7BFAAFB667C9DABE5915C3BC271EF41F18588666A6F4990C09D098E62DB590110DF6A56F08C5E0DE65B00F91D60F -mlen = 1188 -msg = E82F5ACC7C1A326D430475357629D568EA3D0DBE131114781D5BF8DAA32FDE9F3CECD288ACD14445678C5EA6D3AFAFCE48EA3957A6AF8D8F23F78D84130FB6419F706EADD430CC85AFF48283F15602265059ABB075E011E3941834EBE70787CDD55F1E604C6B86F761D94C4F5E525791333DF6D43869D6F36B212A8F35583D38A21D0947CBE26FBE6A36E189C73137F2F2D89F48566D04D2DD9125D2EA4E0B2A7E5C1E9D2EA036CFADCF7BB28F6DF3B7D6395230C9D39D1E7558EA25340252708BE23EC6C0C9A0946C5C5AF0FE037C254D1A5B2B70B8F916CF37945BEF76BDFDFB19A0DAAC5A83A6357E986B3155CFF31024121634C3700CA99E5ECEF1F2E411C6621FED6092C1AB59860271AC7F431E568075D59F71AA18096195F30BBEB1A6BAC20E034F83C72BE0536315879F1D1B7F31D38C12DD8E97819B4803D02BECD436B61D1296CEB78EBF857E34087EC8AE8395269B5B0770B3423B39638910D2A3DDFEC8502389FD8B5B09FFD10CAAD1A5C86E7E39629AB09A4ABCDD00FBB9821F92E7DD24DDA83D1D9762F52A89BED6C20648EA04FBAD4233E5920AE83FFEC28FDB5E432929A41DB782B2CEA8FEB40CAD0B27903050B650477E5D9443A536ECDFDAC673952810596F1985427359D9E4797CABCCD2FA0C0A2394D853B4E6F8E150B3E3AB5136CF476605FF5FFA9067C0FE58A143B50B18B09256657CF091132D449A6E7EE79AA870E9DBE46BF840EDCB983F585EC2856C059808E72B8C901A25D6AFD5372F168D533052A6D26418E035D87D0BF818ADEA19915047C8D824A425A8C7915756673E0F5FCCB1B4FE7C1FDFCE505F7E18F023FDD32A605906EC48E0FA755B6D87E47711E158D672C5FB4CD3B8D1D13FE9EECE58453987CFCDD87B621B870F3AA27E73B6FB7FC0A6757893B978C63B7723C49D1005A1E5B1A4D60C4A2FEF392DF7EF97F149B499164455633FA485BDF92F804A47C8703D124522D73887A2B032F10F45343993FFB009D69E80FB54B6999A5BDB2760F8BCCA648F3C52BFA1D887AE49862DB4CBCCC7213ACBFDC48A57C3DA1F1EBBEA828182432AA1C593C3E5591C825E5706A5F9503311E91EC3D8F4A9554C3DF915B5FBE0516A7A5597ECF8862A8DF286ADA96C90C9F2783F7F947A18EBBC64C1BAF24B29F77521A9EBE09BECFFDB902EFCD024046FD3E6182BF0C84BD3A0A5410EEDBABFC60114E5DB28B0943D79F58F766E2EDB16759850D4CC3A9A57AE073CF6F3B24D36A4365E2BC64674259170B6D11DFF63D0DEED085B6321C45F218E09351AA0D4155189CC98DE5627A03396A067AB3FEA2C133062E3823FB1CAFA5D592070C8E82ABE812979DBDCB6D2E595F33830AD0E8E2F9E6CDC4D9C74B8026EAD1815DE36772769C4E00806F79950A40C979C14A4BDBFDB79DF1DE01FDFCAAEBC93DDBAD62BA166843A121D2B144559064E9DE9E310DFC93D624C1061BAD3195D6C9F46DB64C65A31E90371F9B644E2A15E01C262395269A9AE83F50776F852903F86E5518BD008CF1B35E78F910D48C0B7BBAAAD5DFF2375C55D56B8F65B922229D5F494EDCCD2D676361619FEDFE6BF0BFD7E4C77FC459F181120C4430C409BA89D2E5A8C36CC6200497611D9D705DA6AE1ACA4E16B389D632A982E017E1DAD95DFFBC7A7D7191E7B8FA1C0ED -pk = A108B59E7561437F7ADCD284AFCB9FBC7EA28E78773FBE22F329670F23DE30158EDC25160E50614DE652E2C2807C0912509622C1F241ECD782A0BDB68A210E0065EC73AB310BEE3B0871D9EBDDEF24583C91DBBE9563AFA585EEBCD4A6EF50F69A9872719A37DCF30697B10C12F1073420A58BE9E361F2497C07B9814CBE0000 -sk = A108B59E7561437F7ADCD284AFCB9FBC7EA28E78773FBE22F329670F23DE30158EDC25160E50614DE652E2C2807C0912509622C1F241ECD782A0BDB68A210E0065EC73AB310BEE3B0871D9EBDDEF24583C91DBBE9563AFA585EEBCD4A6EF50F69A9872719A37DCF30697B10C12F1073420A58BE9E361F2497C07B9814CBE0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002A458D653F60B90F9596D7D3EB45BE737D0BC15B04815BD546E2B0A643EE0782E60116E3DA4FC2DFD7D0BDC957CED197858D62DCD5655D907E0704D17904AEF116CCA6C57DF5286B788BD687D07791F4452C65C237ABC980CF110000000000000075FC553E7D3CFD74DB0BA2872F9317896FD9CF32E2237AFDD740BCAD834F7C2650BC67038CE6FBEA6521B782CE0AF380E34397A6B3F3706D81F34637C671443AEEBA372373349465C2217B469815DDEEE6DBA864D032119C39E8FFFFFFFFFFFFFF65683375B1D62198EA817653FA420805441B6922579DE08B2E28494F9D1C4E4E0CEBBAA634DD08515523328BA2DDE677930C08729E8E690A6A37FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE30028C902AD021B5D047210210D3CE25F4E9773F96644E173F898FE6470B382C07C883E935180522C271413AC94BBFEF9DABC5711FCF314B600100000000000000000000000000000000000000000000000000000000000000000000000000002C89FD2C776522C9FC100864873793E033E0F52874E6D88EB2CBEB252B5EF1E246BF64065D8C5844590848ED6ACA77144EABA9165049BDA98C658D7E4C841B00F68424F4E178DB4A5617D8EF0ADA11FAE0915FA16B513B08B415CF35076A712E021F2EDCDE5DE65D608823EFE1ED99C51BDE55FAC2493AE943A68CD028391D0075B05249C45940894D305EA91023168A4E684AA4CAD3B4237993444BD008289257BEE589B9BB16D9E5B008D9E77F24E0B83BA3BC445F73FBAA2F69DCB7981600BC920E115B4D8DF4FCA09869C36C0338D1EA9A1B1EADF274649BE754DB711D87838F2742F949FD9769DDF95750C838624AA9BF193F584778DD7E26CCF9AC21002BE073538FFE27F9A229173869E6F1F313AD16F0597A7B530A601160C05740C368B6BBB7059548DD05B2082335523197D09863001A5D7B412CF0B40BC40816008DCDC27E8DBE53734E16B60BF05BC8896056672BF10865EEA91FCB6CBB73035FA630A1167F26EFC4EA48C07434E6C5F83E66EBE7C17060D7DAE37D1CE0E50700CFC2C568AAE92314524FA9439BA0ABF246DF8CED98936F708C5D7E71FF8263BFA341FAB4186361D8FDEA51B4777245F01DA8ED1322012DA2B471F6B7ED2D2500509288DCCB7389F04D8F886BD921C9D55FA3E648294C653204ACC5AF12E5048FB2F5A42F799805FFD87A870895260DFC545135496FC3478A126D759A1ECB1A00F7C7F4FC215986F5977722C4B6657D7B3F391A61C88C494BF52C37002DEB7E9B60D9D2B7B23277AEB3CC295D12312D95C9A0A34A37176FCA94271DC85B07230051BEDC281EDAA1BF35FE59556B43D8742A29DCF49AB95D70321648BF24A856F93C35972A1D0D616D6C90A7207189CB4B5622C6C31CBEAF8068B5652495311D00DDBB611BE5068A7BAF40859CAAD0FBB7B1AFA8742AF1049AC63F773C97E0ACFC8F4C0AD83506B6D6B68DFB815FA880D8F425402914394C8F3572A851095C0E00DC040716B403B33BFD2C5BC7E862F86C00F7C22F10D21C86B7CB50BA9346875C5E4799AFECD67A71B843809778C796B827EA7471545D715AAFD2A5D4F3B00F001E5CE4C80BAA8118AC584A16B97FE8100319DC2E92FE6387D319FF4576D89225DEDC8BC883D9226C7AF3A5AD3878997BE0A3EDDB445443BDD56AB3B4F5AC1A003CA2F706978D91990696659EC899BF9F9E8220E17FE5EE3E6D29A02E5763A8DC8E96AEB5B9EDE0DCC0B668BD5A88A687FAA64CF91FF04DFDB8AF1A1315211100 -smlen = 1523 -sm = 4F5228F009D11395B23FD453715EC6A12B6401136C9BD309358831ADD830316CBE147120B700696579C481E892DD7620D9E6ABF202B3ADD200A6279CFB44306EA86718A11CFD0AF64FD44301141B4E8686AFDD93CD08336A55E282B775CE01A1FEEA159F6EA37D034BDDC272F36BA5D72300FA8A9EEADFB0152CDBE4B62A332CA0511801002D76D992AF95F1B4DA5D38180B2750FC203900248FF739AE94DE403D7F4631541DC0329DC70089FF78A88922E6415D3A53C83C3AFE4783B301336F64AAFD3BF6403B7704B105EDADD5EF5E01B1C30607AAC51BDA6982EE444019DFB88D0000A506C09580CC70020D3D5C4EF3CC5229C11F00F3F4E3BD4D0877C64B4B6F9D4314009E5DAA000107D538457778F730F417A6300AD42D8E3A28911401E45D30AC7E240F237B140F03018B52B6E3F938A712E138B0C050B2A3CB6F8A0087FDA55670F8CE91AEC9B1D0D11500E82F5ACC7C1A326D430475357629D568EA3D0DBE131114781D5BF8DAA32FDE9F3CECD288ACD14445678C5EA6D3AFAFCE48EA3957A6AF8D8F23F78D84130FB6419F706EADD430CC85AFF48283F15602265059ABB075E011E3941834EBE70787CDD55F1E604C6B86F761D94C4F5E525791333DF6D43869D6F36B212A8F35583D38A21D0947CBE26FBE6A36E189C73137F2F2D89F48566D04D2DD9125D2EA4E0B2A7E5C1E9D2EA036CFADCF7BB28F6DF3B7D6395230C9D39D1E7558EA25340252708BE23EC6C0C9A0946C5C5AF0FE037C254D1A5B2B70B8F916CF37945BEF76BDFDFB19A0DAAC5A83A6357E986B3155CFF31024121634C3700CA99E5ECEF1F2E411C6621FED6092C1AB59860271AC7F431E568075D59F71AA18096195F30BBEB1A6BAC20E034F83C72BE0536315879F1D1B7F31D38C12DD8E97819B4803D02BECD436B61D1296CEB78EBF857E34087EC8AE8395269B5B0770B3423B39638910D2A3DDFEC8502389FD8B5B09FFD10CAAD1A5C86E7E39629AB09A4ABCDD00FBB9821F92E7DD24DDA83D1D9762F52A89BED6C20648EA04FBAD4233E5920AE83FFEC28FDB5E432929A41DB782B2CEA8FEB40CAD0B27903050B650477E5D9443A536ECDFDAC673952810596F1985427359D9E4797CABCCD2FA0C0A2394D853B4E6F8E150B3E3AB5136CF476605FF5FFA9067C0FE58A143B50B18B09256657CF091132D449A6E7EE79AA870E9DBE46BF840EDCB983F585EC2856C059808E72B8C901A25D6AFD5372F168D533052A6D26418E035D87D0BF818ADEA19915047C8D824A425A8C7915756673E0F5FCCB1B4FE7C1FDFCE505F7E18F023FDD32A605906EC48E0FA755B6D87E47711E158D672C5FB4CD3B8D1D13FE9EECE58453987CFCDD87B621B870F3AA27E73B6FB7FC0A6757893B978C63B7723C49D1005A1E5B1A4D60C4A2FEF392DF7EF97F149B499164455633FA485BDF92F804A47C8703D124522D73887A2B032F10F45343993FFB009D69E80FB54B6999A5BDB2760F8BCCA648F3C52BFA1D887AE49862DB4CBCCC7213ACBFDC48A57C3DA1F1EBBEA828182432AA1C593C3E5591C825E5706A5F9503311E91EC3D8F4A9554C3DF915B5FBE0516A7A5597ECF8862A8DF286ADA96C90C9F2783F7F947A18EBBC64C1BAF24B29F77521A9EBE09BECFFDB902EFCD024046FD3E6182BF0C84BD3A0A5410EEDBABFC60114E5DB28B0943D79F58F766E2EDB16759850D4CC3A9A57AE073CF6F3B24D36A4365E2BC64674259170B6D11DFF63D0DEED085B6321C45F218E09351AA0D4155189CC98DE5627A03396A067AB3FEA2C133062E3823FB1CAFA5D592070C8E82ABE812979DBDCB6D2E595F33830AD0E8E2F9E6CDC4D9C74B8026EAD1815DE36772769C4E00806F79950A40C979C14A4BDBFDB79DF1DE01FDFCAAEBC93DDBAD62BA166843A121D2B144559064E9DE9E310DFC93D624C1061BAD3195D6C9F46DB64C65A31E90371F9B644E2A15E01C262395269A9AE83F50776F852903F86E5518BD008CF1B35E78F910D48C0B7BBAAAD5DFF2375C55D56B8F65B922229D5F494EDCCD2D676361619FEDFE6BF0BFD7E4C77FC459F181120C4430C409BA89D2E5A8C36CC6200497611D9D705DA6AE1ACA4E16B389D632A982E017E1DAD95DFFBC7A7D7191E7B8FA1C0ED - -count = 36 -seed = C08E846A8E039C8655651919A8433D475F494899FB617DC3B4715DEF0C992C195CE38158B7FF40E0684B30FD7E623265 -mlen = 1221 -msg = 743E5D96B9B4C1469E7AD2B3703F711FAF60CA335358FF3EFC8FCFF02CD020A443243B4169F9123351B6C36762B85BE5E5EDDF8D4B43D82CAA615788406A31CDF4F7087D42DB21AE48A069AA23A8F6D20A1C0762F973E526F011DEC737E986CC324724BC5336D0362525757410E21046A12AC54F2237E68DA036A5C1389E46A53ED8C21774906948D4C9E14F40519C54DBD02B7A4ACAABD24FFD7F6CA4D6D582EF48940296D2893415E811FE7EF0801B35F1C594E6FEA2C293869BBD45618B6F04FC26B55D55A0AE99445AEA12F851B7E58A49CC6A0044F28E3EB838CFA6BAC5DF53B0DB78BE2CA2BEA1BF2DEFFEBD673A783C91A6C9EE710B12042EC2863A9B52EADA5B0D32101BBA8338F7C75CDAE7B7FD6797B25F96ABD53A24A7647A1C91610306FFC72A8DA4D46B1778146A98BD59CEA3173D41D5A53F9A7F9E282B5FDA1AFB062D8AFB63CB19B0E76DF782FEB9F7FD50902133529CFDD7C51AF297895EF6E1871AFD4C3DE93DEFA8FCF1FE67BD27B7EEB0CF37A6A8E09AF1203922BD9B62672D4756519CD09DD9271ECD0285F92030A9FC81C09BF2FAE86F5F50596C628E0BE673571CBC2FD76C563E113004529B234FB50E9E3D6D1F814CB8E5B5CC3EA365D0BC7602B146CC0361397D9BEE9246FBA3A724C462E177D27836093EC009741ABFA28379AEBCF5EF09BBCE00CE449FEC3A3302FB9AD0F010CA338363539DA545F159FBCD3D6A0482454023587A324F5132FB6F4CA602FAB2CF6CD59104427264CC9EDE8D10CD9DD7FA6133E65693DBF744443AE920994226E21D98634BC7F0710DBC37C18203EFA5ADB467B523322E21E4E686B6B85B00CB501ED84153BAECD4D6CAC9D1183E38B510F7B1DBBE5995BCB717529B83FBBE969DFD8DE21183762FCDED692B16502834FE8E7A7C46F84ACDCD2C9975098CF0CDE8AC0EFAFA449DC26840180DCD9353A2F1B06962677C808B07345E8ABE95B8D24F21D751A4EDCFA0E02FF077DE64E6B992E8C8822682DCC7F03CA7582FE7C74E0A9822A02D888FDDE1FC9E73C2EDEDDF32001E918771E5F511EF8F88AC19B76FAC0C812F56938F814D712D99269D7802E47634E541B54E00F9EAF78A421506A88B4BF7332DFC7D79E8C41835031FB449507D19D5A8A512A5C527C95B6F21EE3E41FA43591DD9BD2E4293701BDAFB624E0EA290DA4B7A173003867C4CC3FD814E117B4EEE283C58F5FB33D653E410F68C8962155B8C4FBC13BB750A0343737D1FAB36EBC618A6A7C8E6F93855CB24937B01C438FA713D334DF335D0745582F680627D8B94CBC25F0D12E3B1C27A3ED72E2558B800C19DC6B719B961E0FEE43BFC34E999027CA1969ABA4C45FDAB9AF01B955E948DE951F5A1088BEDA43AC930FE99D8CBB3473475C444F43E928E1A44966265B38FADF9B1183700A95A81F85EA43E5C61DD9B2D67701C95583E8E3F15083717E1722D764B6E624505347C30E5E70163ED9A046C504FF534956E911294D2B9097BBEEF8740377EF0D6C4CC8086422902BF63556CE6DA8E33E68FCFB42707C00693A995D17680B76293194DB217EB5A928303DCF1814E4A881B057BAF2553AC4FAAC8E4BF23FD4074154CD4AE189FF7E204EEDB8EDD594CDC21B5B7D73A712B511D068F4D217C0F91F9D84C524D973D67AA741EB13FE922AFABF79CD2396181143783030FD2D0CFEFC877934D8037A4C32AE8E15B50A6FA4269 -pk = 2535ACE85C6A60B4C002EA148EC67C3448037A9DE6C5973933E10BD29614F8C840A6512654DC0E58C71EE51A72685A55C66B71955C58CEDD139D7086199100003A33C65A1E7508F7DF473E15F95C8867BEC2FAE0F54AF53A51A051A0A816F5AF5B24B5A2F7744884D3EC6D00D061CCE71F9D5CC0A7AFE769930FA16EEBA00300 -sk = 2535ACE85C6A60B4C002EA148EC67C3448037A9DE6C5973933E10BD29614F8C840A6512654DC0E58C71EE51A72685A55C66B71955C58CEDD139D7086199100003A33C65A1E7508F7DF473E15F95C8867BEC2FAE0F54AF53A51A051A0A816F5AF5B24B5A2F7744884D3EC6D00D061CCE71F9D5CC0A7AFE769930FA16EEBA0030002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DF0EF0C0F6F9CFE1235F8AAD8B06499FA9FB7A17893FA8077BFAF02D9197A20F0D01CCC6890ECCC128C5175162C98AC7A97232DA7917126D8FED05AC04FE22249041C97BC9535367B5B532779A60DE259FD5DA3225918428DA060000000000000052BBF6117F8C7236D57BF62934A90658FF2CE6D8E31238A9070C587E02144DCEF0ACA80C3749B29179B6453A3162ADACC73240211C73D6392374F17647875B8448D1F3B9FF2B96A3D8ED7C01F0B7369088E66A16B63E402A00F1FFFFFFFFFFFFFF3A2E6BDEEA41FF1D72FA2F0204EC6EA908719C385D6777A6366E5A1D8C271E9A5A4748DF4FA4CB14B53862E6FBB77081243AC1BE929AA2E33174FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF313F5C5953F9F604E109D831E9CF9521F8A1BD6B498D7C1FFF3CC9FD341F630D3BBE8AF99765E5459936EB9525A7E8E4A14AF44EECBEAA64690E02000000000000000000000000000000000000000000000000000000000000000000000000000065FFBE6B24AEB98ED2CA38A97B7220B37E6F1FF4A48E840538C60935C1B8DE7EAC696BCC69B0B999E288CB40DA6B54E61EC6E5175D2CBEDC9C279C0B9BD11400CE4912862BC28394E4174C88AE88299655B30CCB42C47B42BB0719C3EF8DB78FD97C6E0F6960D532E9957013AB809BABCE120331E132EE6E5CEE68FE68E51F00BCB2063008B0FB07AF0E6E9752150F4DAF702A7978D1E69F433F4F7A02A4F98FED923EEBD9F1D4E09D1E11A16288909190DADEFFBA69410CAAF8C48C61EE1A00AA0DAD570B8B8A7952FD2164DCF8147E80F7F73D9B35E9A2C0A2909F4A75F352D33D33F32C4A9793011079C745E55866E6CA2C11AFB0DD0200A4F482FE8921004FA120F6EB49F0DAE4B61F869AAFAFC68AF5AC98482AD7D2D86507231DFD28B95F6316193DA698F64573218FC6385E4BA075413C09F3DEE1A8BCC31B96BB0300695A11D799BA5B27821407A0426EA7AD368F26E449878D524BC5D0EC22464840FD2658BA374E3FD8D4B40E9987680A8BD01922D22F09994CF1CB14D0F9200F000B055B198F2B480E18449795F96631744031491F8EB6D8DA961F70B6FCCC077E1AD84A7E987E87E0753E5FC9DECE7550E421E97F6A54123B06C067C254921B0069047CE70FB0D5F01FC18C9D42C209CE790E7F5F62B88E17E30413D4F28D8E6015FED857C0065EBC854E113704CF5E62C09D6E1A91D4A67AB37E6CC267180600D1194A5AA1E258085EE291B62E31383607122036736F41EE5016E3133B0BA9929DA40ED3E1981E9EBB2976BC07A78CE1BB0139ED61C913853C5BC94B7FE30900269AFCA09375BB4E79C0BC24B217238263043F697B664A40C021DEE28561704402E633BABE515840B3B57888B9BD4F287B1A87FCCDFB37E7E3C35FB32E231F007479014E0BF0B24BAD1B45AC6CC34ABEDC81F325514E9408151FA96C50E5A76B406881E085874BB2EF91970265D1EC5ACB3CBF6BAD25D441D1E2F6F871F21C00A8392357D3F6E9D76851047AA74F6FCF62434F59EF05FF5B791A382C638298E221AEA48592229E506ED9B8FC58BD446AE4CD1A085A1C1C87BA12AE1B3F2D1E00E2C3D9770E2B0717CCC71B3157ADEF7CE4CE0B8547BB002668408F78C93214FA84D6AB341D2CE8F76EF7515A42B8328392512D6B674D80A73652A2E6B91C0F00952D6F3ABDF5FCBACDBF3F5BFC6D30C855E2F447575740389CB0FC7C1CF3E0E4DD4F033A69B0BE0D9071F20E7E1748534F0EC2268B1ED61006FC1239AA591C00 -smlen = 1556 -sm = CB91BAE2C9E7A46FB8DCA30A6F800001E29C00DBFEC2239B3784E4C3D17A326C926CF1CACA01A9C12B3EEE31EA2529DF79B06E0258C1F0FF0050B144BFC5C4D8921144F6A6121433BC509800542A1D420D8F3053E88B846CD3C8BD7A6C5401518FBE2070F49412769C5BDD872FFAEFF4DC0068F5B52A5222EDB2A006F83EFC8B033A1E7801587FA308048135201F533E0A74F5BC1E63ED01BF80FE093718E41770004F17B68ACE2554D400416F75904F503ACE2185A320416213565E06016FEDE4DF4C3518A08F09B754BFF14C9F7591002B79AFA106573633762B29184D304A17DFD4003B297EB2F1C6FA95A798F42E6B1B900A654E00D27C56DBF922F7B4629157570BFDD731F57B000193D77795D208AD49E39EFC92F2D92BD38D93314157DE6E27140CFCA774740D960503442B8265B4138107B3ADDA69FA0D69A88CF201B1768E50107F749AD6B6D75C299103743E5D96B9B4C1469E7AD2B3703F711FAF60CA335358FF3EFC8FCFF02CD020A443243B4169F9123351B6C36762B85BE5E5EDDF8D4B43D82CAA615788406A31CDF4F7087D42DB21AE48A069AA23A8F6D20A1C0762F973E526F011DEC737E986CC324724BC5336D0362525757410E21046A12AC54F2237E68DA036A5C1389E46A53ED8C21774906948D4C9E14F40519C54DBD02B7A4ACAABD24FFD7F6CA4D6D582EF48940296D2893415E811FE7EF0801B35F1C594E6FEA2C293869BBD45618B6F04FC26B55D55A0AE99445AEA12F851B7E58A49CC6A0044F28E3EB838CFA6BAC5DF53B0DB78BE2CA2BEA1BF2DEFFEBD673A783C91A6C9EE710B12042EC2863A9B52EADA5B0D32101BBA8338F7C75CDAE7B7FD6797B25F96ABD53A24A7647A1C91610306FFC72A8DA4D46B1778146A98BD59CEA3173D41D5A53F9A7F9E282B5FDA1AFB062D8AFB63CB19B0E76DF782FEB9F7FD50902133529CFDD7C51AF297895EF6E1871AFD4C3DE93DEFA8FCF1FE67BD27B7EEB0CF37A6A8E09AF1203922BD9B62672D4756519CD09DD9271ECD0285F92030A9FC81C09BF2FAE86F5F50596C628E0BE673571CBC2FD76C563E113004529B234FB50E9E3D6D1F814CB8E5B5CC3EA365D0BC7602B146CC0361397D9BEE9246FBA3A724C462E177D27836093EC009741ABFA28379AEBCF5EF09BBCE00CE449FEC3A3302FB9AD0F010CA338363539DA545F159FBCD3D6A0482454023587A324F5132FB6F4CA602FAB2CF6CD59104427264CC9EDE8D10CD9DD7FA6133E65693DBF744443AE920994226E21D98634BC7F0710DBC37C18203EFA5ADB467B523322E21E4E686B6B85B00CB501ED84153BAECD4D6CAC9D1183E38B510F7B1DBBE5995BCB717529B83FBBE969DFD8DE21183762FCDED692B16502834FE8E7A7C46F84ACDCD2C9975098CF0CDE8AC0EFAFA449DC26840180DCD9353A2F1B06962677C808B07345E8ABE95B8D24F21D751A4EDCFA0E02FF077DE64E6B992E8C8822682DCC7F03CA7582FE7C74E0A9822A02D888FDDE1FC9E73C2EDEDDF32001E918771E5F511EF8F88AC19B76FAC0C812F56938F814D712D99269D7802E47634E541B54E00F9EAF78A421506A88B4BF7332DFC7D79E8C41835031FB449507D19D5A8A512A5C527C95B6F21EE3E41FA43591DD9BD2E4293701BDAFB624E0EA290DA4B7A173003867C4CC3FD814E117B4EEE283C58F5FB33D653E410F68C8962155B8C4FBC13BB750A0343737D1FAB36EBC618A6A7C8E6F93855CB24937B01C438FA713D334DF335D0745582F680627D8B94CBC25F0D12E3B1C27A3ED72E2558B800C19DC6B719B961E0FEE43BFC34E999027CA1969ABA4C45FDAB9AF01B955E948DE951F5A1088BEDA43AC930FE99D8CBB3473475C444F43E928E1A44966265B38FADF9B1183700A95A81F85EA43E5C61DD9B2D67701C95583E8E3F15083717E1722D764B6E624505347C30E5E70163ED9A046C504FF534956E911294D2B9097BBEEF8740377EF0D6C4CC8086422902BF63556CE6DA8E33E68FCFB42707C00693A995D17680B76293194DB217EB5A928303DCF1814E4A881B057BAF2553AC4FAAC8E4BF23FD4074154CD4AE189FF7E204EEDB8EDD594CDC21B5B7D73A712B511D068F4D217C0F91F9D84C524D973D67AA741EB13FE922AFABF79CD2396181143783030FD2D0CFEFC877934D8037A4C32AE8E15B50A6FA4269 - -count = 37 -seed = 1D9C060EA0408A068BD982D9694D39D02BA5A473378F6F9F09349F686566F331E767263FAFF5DC0E823BB6F648843876 -mlen = 1254 -msg = 3382E87BA70EA986A044B0CBA2EAFC3316C1AC95A5F16F6368C210DBEADFAE6CF2382DDF5078AD594CDE3BD1A837C517B1A20A2099D938DF6AA02B6C0E62FE6147C904BCF3EDE51DDDA60DE7887DFEB2866DB402D23E5934A74C9CE4852D4B2F53CC9BCDDA312964A548F6F7C8320AF1D1BDBA7FD32EC6C86BC3FCB4205ED3DB092FDCAD9AC4D2B8575883E13F69D8C16CB18D1B9284B31823ECE917C905C5C8B9D180C1BD87975871014F773FB57D402B8FE16EE312692665824CF0BCE4509326A31957319364CD421E9B21BBC1DFF663ED850858A2450C2FFE64B65E009A3999CE4504BA5313BA0EE4A8843349C30FA6E59FD3ACECA130A37C04F9B64722608768973996112684B64D0C87BF95E5DD60661935831A6A1A9575EBCB2F64A15296BE788C775D80523D6BB4267D91B0C71BA5F90DDF1933DE898E79FC7E39D0A3D146F185214468DA50AEB47402AB542E52CEB768A70CB1F749E4164CF20E549B674CE965FFBB98D874D34B5B7851E575E6C1E4DE9C170A10DAB84940AF055A951260B0119F5ACBA320B55CDCE4F16346905A2073CD9FEFBA95734E4F4DFDB7A33F292D45698831F1D3E9FBF56D9692C14A8F9887265CBB4441AB331D977E3A68A1BC9F406AE0FB1C6E91205670641B9868E2A987BACEEE2364FDB089A63B53976D600BD7A8AE88A02872E46927269D281CEFA385C98CCDFA6609394943FAC32237368C6203AAFABDE072054AB5A14A91391D5A943F4ED4A4407F275CCFD15FD28F1AE0EB6EDCC6612E3436572919E4DFB57C049BD77B344D8E04152863EFD4FAE8FE3A7230AEAAAF82870820085F4B3EB5215111B6B8952CF2FF468B3D10F3AF849F16E190E9560F40B05E6E2204591B58A850E2710F7043AEE2A44A6D4A108CEEDEB2D216E51102DD08751925DE6A7F67BCA1980F0789B34E2F86729621F2285C5D3A036CD87C76102E9D607C37CCDAC8062CEB961053F3195B5ABD88BC64FC65F8BE34166841683F1EED291938F75DFDB3AF4FD2AA98CE95382ACFB5D5DFE6EF243C8A0B19B80584FC0CD533E38BD485D1C52E0EB5BFF90C0A947D9B9095AC1C0CE9754EABFC860990206B981235C7B612DB61C9FDEFC0F14DBF68A8A0EA4986CDC4AABAD6C218559E11CCEECD804EB98446FB33EAE47C0388BD8972DDAC02CE807B707D6D188CB31A1D76D44323E93DAC4F8ECF77E7896C052EF16009CE4D1147DF84FD5785D95D77310783F9AEFF1DDA693F4BED26457ED82A1CEA19D9C4919257E3050B25A7D1CE7561740DDAC3FD93A607C79875E050E40498BFBCCA95BDB3D0FE639DC7CEA80E3DAB3AD73A4265F012451C1BCC2FDA1E1AEBB7FB18407F31E7496E2A18D2C686B47120688240A2FB134A3C314D4CB422811E850524684EC485E061F7365494A6403AF170DA461A3BC32FFAF9143D5E9B17B2285C56977AECAF880CDD34F26120DAC4C950198233A50654EFACA6EA97333D2BBC024A5E668821D20333DF0B712510100AECAB6B484CCB7814178F851A3E6BA0B76F16C4685D5AC8BA48558D382ABECBDCF0B919C1ACAE46EBEB5011DD0B3C22B539810720CFBE4CBADB111E100C09C811E724A67C66A1B89EED1E7218861F55A4DC55E236C6E3521DCB374437A14E8000DBEBF0F7F9BF409AF952888675C11326D9E3E8A8828BF50CAECFF96075CF29446CADA373529D310660CBD60C042C143E1736FE7AFAF6FBE42791A8DB01EC0475145257FE2DF766D4EA972B14AE5110B8F8F42D659383E9BD76 -pk = 28031C0C23372536F4699B6CFEB1D56C63FCE3E876A2205DACF8185F66B00B8F2B740AC6FD469ABAF405638F0F6D56BE67444EF92DAEFEF782FAEE06FD682400A6B42FE94379CD86EE46DEF2CC04D6A90134663C4E9AB715A47EEC82745430FDDE4107493DA9BDA315B8CAE1C5E02B669CD9D7A6A659BBCD07365C190E542400 -sk = 28031C0C23372536F4699B6CFEB1D56C63FCE3E876A2205DACF8185F66B00B8F2B740AC6FD469ABAF405638F0F6D56BE67444EF92DAEFEF782FAEE06FD682400A6B42FE94379CD86EE46DEF2CC04D6A90134663C4E9AB715A47EEC82745430FDDE4107493DA9BDA315B8CAE1C5E02B669CD9D7A6A659BBCD07365C190E5424000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ADF5C08A76B7B2BEACB09DC3D79ECB9A1B800650B5847B27DAA931A2A1AE0893836C7A02E94D321EADE5963F57957578570B3D68C6B45E7E4578EDBC9C91778421ED8B750020567BEFE7AD88D9AB320CD060117E80643112FFFFFFFFFFFFFFFFE8795EE6B38FA9E901519A8A302C864E8DB28B8ECB06F2D83E725B2C21A075F4B90273E303DDF27C2296EEDE65F783BB83578F526C698E63980FAF5E6121C4F79B198F88B4E943F45130DDC5E31C01D8CF54694414076F662DFEFFFFFFFFFFFFFF84D81B24AF9916C577F3FD2AD5D5F7335C4130309DA114F10D51569185158DBFB61E6D25356FE47507F068D09072568D5996904D65C98D9FC140010000000000000000000000000000000000000000000000000000000000000000000000000000556896CEB244E5B9EDB109674B9B02FAB95273057B0C758E9170F13E2C90BFA3122C97EDC9A07B44E5850A7D625D2AB9EED4420AEAE17EEAFF910400000000000000000000000000000000000000000000000000000000000000000000000000008DA430C5F633724E8122DA2C914E33003ED1AB9E58D31D5655F1E072C36A00D130524803ECEC8DE390CCD412C22CBCA3B08E2A3A178AEEAFE7A6CEF9255B0800898FAFA882EE426FDC490222317160AFFBB7956B72E7B8DD5B2B858CF0047CB991DA066044F41326F57E59FFDD1980A14FF5E4B8E780701AE24D2D94CA4115005D8F9B16F7C18AE2213208FAD896D46A2BB0184C34BB9CB09482D6DAC13B6F26B525AE8E754D2C6CEDFFE98167318D47E5CB6FA520EC230D83CF7BD92DF10F009B5048C61071AF4EC9E4347C5BCC4B0C1357D2B5F6265E2E500C0EB13916CDEBA586BAC51E090103615FED3ACFB9BD90FD20E4CAF74B7B87AB8CB9F9C3100100E01A1595BCEDC7773891E79B16CC2DE132C765572396BD27B998AA9FE65B70FB707EAD8E63A8E4C36F2E8277E122ED375EA7A80DCBCB14342C237016B5DB0500F6B616C08E310C3778B662E4A6112B8567E4C41BE8250B306D8E33912FD379059E459674F42E18C58E3ED0AFE70835E59B37A6EDF0B85CCABE1119F264A221009C66DD15C42E5226119B1B8F6A71EC4CDB5419B9190E171F1850F59B2E5C1CD4821EB226DC5F92AD1A4C6F77BA7C992AF03E9372AF9A3A1AA6F2E1DAB6550A00CEA195D575E585CCCA038D6D0F6350EDAA815AE4719D64F4A41920C23C62961AB8906C35942A8D6710A0237B521972CB06FF1ACFA73AEB8BFC29347F814604007CC6D66CB6CDE173755B45CADE2EDBE594AD64B8C772C6184789219D791BC767E094BDDE2D6AC7C851C39193EF620BA5BB1FE0FB48090E9E0C3662640C7E1C005936C310D155FA3CC18C1EF81006D01B8672121813BBE1700DBBC4D837D92B270F9547F16ACD42DB130D1255D561C8653FF37D69FA9871010685D92E680E17000F40CA59692C6DF69453F9ACCC3740B06761706B9769CE0B42AEBA0A85A8E6F0D922874333D55B04675700474F4B86FCB7195A9D3B8489A07C77542C64B40E00F6483005F332130C473F02CFBBB6EEA8F740BE9D0BCA64F7242EAB7EDD8152B7DB3F55B59FF429E50E1A4D6016CFC3721E55D34F30A4523F92C3FAE2F0E922006C99230102B3B9687B0D7AF1866190C64A63D959DD24D70169913EFC85DB6D98C4938D3A885246FCFD27030AED628EE24B68A447E6C7EC67F4031D057A842300F874498BA2FB425B673A827926398E2E5999D8534A5569A4515D3B448ED58215AAFF9A12E262207C3A93C7C0EC47753933D8F0A0236E24BF0A3025F780580000 -smlen = 1589 -sm = 8652F16E9B95850A07F3DDC478C0A676BA1F00A17ADD8501F60B240F69C9E904D88BE0BD3C01D3DEADF45720D0241A4ADF7423E6818CDE6C011CE8E0AAFF1BE1E3874B6023A285DB37B49C0107A5D8B8B40CE5B754CB19BE604CE3E200D6017F831F40C889F489FECDCEF34588CBA6754701271AA0B215E5E28A7F31B733599F3228275301E53F4D53D37DC37A3B41EF70E7597DCED52E00AD0CD7673FEDFC2D4D39609D58FC2A5E1B5100692DC801AF162F7832F03385D8988377640D0198C35DC62DDEE6F467A9EBBFA49789244E7E015FFAD7084816B1CB20B653E5A4ED3C90EDE3004C1AC7182D7F37B752B9A9131C95508A99DF0084FA106446C58D8225AA121DD538DFA4215A0101EBB1874E20DB04E2A2A70E638B577A550AADA67712FD1D4BB844DB061C1ABE7505038F4DBE5CE7EBE44284368BEC1A59C064E3CB0186D8DE11432DD5D2A922409FFD95003382E87BA70EA986A044B0CBA2EAFC3316C1AC95A5F16F6368C210DBEADFAE6CF2382DDF5078AD594CDE3BD1A837C517B1A20A2099D938DF6AA02B6C0E62FE6147C904BCF3EDE51DDDA60DE7887DFEB2866DB402D23E5934A74C9CE4852D4B2F53CC9BCDDA312964A548F6F7C8320AF1D1BDBA7FD32EC6C86BC3FCB4205ED3DB092FDCAD9AC4D2B8575883E13F69D8C16CB18D1B9284B31823ECE917C905C5C8B9D180C1BD87975871014F773FB57D402B8FE16EE312692665824CF0BCE4509326A31957319364CD421E9B21BBC1DFF663ED850858A2450C2FFE64B65E009A3999CE4504BA5313BA0EE4A8843349C30FA6E59FD3ACECA130A37C04F9B64722608768973996112684B64D0C87BF95E5DD60661935831A6A1A9575EBCB2F64A15296BE788C775D80523D6BB4267D91B0C71BA5F90DDF1933DE898E79FC7E39D0A3D146F185214468DA50AEB47402AB542E52CEB768A70CB1F749E4164CF20E549B674CE965FFBB98D874D34B5B7851E575E6C1E4DE9C170A10DAB84940AF055A951260B0119F5ACBA320B55CDCE4F16346905A2073CD9FEFBA95734E4F4DFDB7A33F292D45698831F1D3E9FBF56D9692C14A8F9887265CBB4441AB331D977E3A68A1BC9F406AE0FB1C6E91205670641B9868E2A987BACEEE2364FDB089A63B53976D600BD7A8AE88A02872E46927269D281CEFA385C98CCDFA6609394943FAC32237368C6203AAFABDE072054AB5A14A91391D5A943F4ED4A4407F275CCFD15FD28F1AE0EB6EDCC6612E3436572919E4DFB57C049BD77B344D8E04152863EFD4FAE8FE3A7230AEAAAF82870820085F4B3EB5215111B6B8952CF2FF468B3D10F3AF849F16E190E9560F40B05E6E2204591B58A850E2710F7043AEE2A44A6D4A108CEEDEB2D216E51102DD08751925DE6A7F67BCA1980F0789B34E2F86729621F2285C5D3A036CD87C76102E9D607C37CCDAC8062CEB961053F3195B5ABD88BC64FC65F8BE34166841683F1EED291938F75DFDB3AF4FD2AA98CE95382ACFB5D5DFE6EF243C8A0B19B80584FC0CD533E38BD485D1C52E0EB5BFF90C0A947D9B9095AC1C0CE9754EABFC860990206B981235C7B612DB61C9FDEFC0F14DBF68A8A0EA4986CDC4AABAD6C218559E11CCEECD804EB98446FB33EAE47C0388BD8972DDAC02CE807B707D6D188CB31A1D76D44323E93DAC4F8ECF77E7896C052EF16009CE4D1147DF84FD5785D95D77310783F9AEFF1DDA693F4BED26457ED82A1CEA19D9C4919257E3050B25A7D1CE7561740DDAC3FD93A607C79875E050E40498BFBCCA95BDB3D0FE639DC7CEA80E3DAB3AD73A4265F012451C1BCC2FDA1E1AEBB7FB18407F31E7496E2A18D2C686B47120688240A2FB134A3C314D4CB422811E850524684EC485E061F7365494A6403AF170DA461A3BC32FFAF9143D5E9B17B2285C56977AECAF880CDD34F26120DAC4C950198233A50654EFACA6EA97333D2BBC024A5E668821D20333DF0B712510100AECAB6B484CCB7814178F851A3E6BA0B76F16C4685D5AC8BA48558D382ABECBDCF0B919C1ACAE46EBEB5011DD0B3C22B539810720CFBE4CBADB111E100C09C811E724A67C66A1B89EED1E7218861F55A4DC55E236C6E3521DCB374437A14E8000DBEBF0F7F9BF409AF952888675C11326D9E3E8A8828BF50CAECFF96075CF29446CADA373529D310660CBD60C042C143E1736FE7AFAF6FBE42791A8DB01EC0475145257FE2DF766D4EA972B14AE5110B8F8F42D659383E9BD76 - -count = 38 -seed = A4563D09AD21D3916BF4636301F2E64183A8F003DA186753D7F2DC3BE0089BA09C62B8A52B72C2C8451213606801FB29 -mlen = 1287 -msg = 67109894C579974373CA0054ED5F7C373B7AEB810721C3D9CEFA02EB244EF6B17507300370ADB24AE0173C6D114C51E05F822A770318033C082B6502F70012283EDA2A9DC0A1381F145470E5D3729D201773D2AA63C18885A92C962BCD3628835391D70DC36273DFAA4966F65AD40EB51FB4B416A8D0B1DDF39CB932EC4503BEA23E3D9D3B4501DB426C6AD99C28D415FB565F62EB5C22BB043C8CAFC42EBD1C7190DD32A5B14B571644471453740C081F3E3305F9AE70A5BD505874382EC0F6E2188563E763BB8D1BB8B16587AE25A6252F51E4AD02D0483C4A6E8AA2849C44629CF4B7C6DD6A5FECDAB0F9B2F0B35E306C7532B64BD5A3CE67A0247D97024AAFE5CBC13E375AA69B8287BBA9DDC9AAAC2BCF41A71E373EE36B13DF9F829BBEE8F48802DD9E03BE42A5E290251BB130E0E2ABCC4E096DD0F264E5D29F8C2388A0C3010E78F2A03F5BA1BE13AA5E50F2BA67A031CE3F787754B8276EA1AF62BC5FB4DD9A9B9BB84217A37EB9FC7AAFB517337B30454200D6AAE491E50D5007EAC2150F60F640A5C4624CE6D8112119413731322BAD9762BCF72349EE38E2A41102BC5461D72033072A90E82D105E6FCDAED9C223A4142CD55920196D7B1B9278C84B67A2E35BDE3C9CEEBB8E9007BA8758BD35C875DD5FA0A8FDAAAA9A09629B9DF69AFAAB456E105DABF2AC5834B8D223B0A406E0D1295C876C447E8E09C93FB09ED1B3EF6E1F3B7FCB029F576A45A12620567E05F218BC3753109DD29AE0ADE1370C0F871AB5AD8A9DBAA277FB869EE552E8733E73886D6DFEACE6B35E481F37A516EBE191DAA6F83E4FF453CF9CC9DDEA8EE507AF0E62EF3CB8C22949CB828E21C6AAF3FA9AC301E2257B0A054FF0A237F527D53EB757820AF637FFC9F983A2B5AFF0B4CC493E610314432C9C2F0FF73C4240D520D1D73721B429CE41807B7424B14F5EB1CD23D5562263FE1D58CB1D52E5175414800CB090242E240C3A7ACAD4C84DBD8ABC2731FA2B1D9820DA60FDB6BAA7EA849B6A146E07AF7FC201B3A98E5194BB5826945FACA3690209E5726F070A71EE07AE76ADB7E6199FCCC81C8AF7A463633A58873B4F7E65F522FDA409979DE41CF54F659E66CD5950A3A3E01570526C46417A00EC2E8821DC380ABFA21384D141D259CBB9722F267E46272ADC5CC4BCE382B554226996F4A6A1605287276C18A48C8FF1A92ECD2815CA5452FD6157FC27532680022993535549BF9AB064052E6DB4E9F83B5D0D885B94A90F59E67B9DF0C321EB0F95AC07007E4EE33BA89AABEEEEA01FD1172ECA4E31FB02C507FFE43CD0D6C8570769A180E68A70BD344B4C992E7D3A6BFB96AC4D69C2D4F5EFACA1D348DC1988DE44B30DA76BABC307A88124F96F26737A85FE6047E7E485C7E4B6B99B575FAEDC9BACA3E080E2B074CFFCE1F716C6A1D08234C45706D2883C6E5A001D02596CFE5B260DE6134C75DF3AC8BCF1919759E15576CA147CEBE041D04E369BDE70CC64157AEDA311C8DA520EAE907C33E30DD89013E24B7B02E66C9F285BF7D5C3FD65BAE24AB20D40ADDB451AB4BC4B9772D0B9039461BCA8D3D2A4D71A2E6BFBE7F02325FD571FCAE1FB47F855612F382188A5FA3D61C3E8E59EF016DB0149C52E1C7DC84030E6C93C4F32DA6CE5F3B8196AFFDE834D2ADC26CFA05940055401891519386BCD33D85584D74B2F16D8E19556C272AEE8397A1741EFFC283DBAD317740C1B67F8F4B7D2D1EDD68D6615EAC3F8E3CD26AC4F8058667FB388B19C654711B5B2EDA75A9AB55174157CBE08C186A3D0963BB3011A9567BD499AD2A8 -pk = 5175D4A1943E2365719DC6B897602DE01D33CAE4EEB54F956036AE07EE9BC1A04A1BDA68723BCE67C2505A31DBE7BD39D495F65381F6B579448FC2502D0614005FA0081ED1620DF40A060D07D75BC57BFF0B57D13B565D7EDABDD80070CCA46C84E9E17977987E5A953B4C45D1EBEFC3597D11B157CEA8B8A4AB2A6A94892300 -sk = 5175D4A1943E2365719DC6B897602DE01D33CAE4EEB54F956036AE07EE9BC1A04A1BDA68723BCE67C2505A31DBE7BD39D495F65381F6B579448FC2502D0614005FA0081ED1620DF40A060D07D75BC57BFF0B57D13B565D7EDABDD80070CCA46C84E9E17977987E5A953B4C45D1EBEFC3597D11B157CEA8B8A4AB2A6A94892300020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007C893ACE9A42C756608C533D8809844A71539F069C4BAE5FC49262B651DD55581872F9FBEDB2E86068CA1100575DB6D0DCFDF9BC0C3B27AFF73236D6313EFB803504B5CE508BF0A37EBF6784953AEF33E9E0118D19D510FDBC0B00000000000000533A421C3E31C143380CBE137264D9EC61599393CA824CD41F20261D4F0CCD9801E0F061D8201B98FB23122E3D922E2F459DA4B598860386264EDBF5126FEC92CC93CC48AB2202FB1D1C80C520D4F26608BD15F666960C2564EEFFFFFFFFFFFFFFAD1676E59C0714B8875500A6B0DA7E559E7CB8CCD6B44D605D7C46F7D846221B75C1A9C1B847977F16518113CA1F6AA170E21BF901C351348427FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44BDF647A8DD665E970458344F4BD784E00D13C20EE0A0683DEC94FD68A69A9BF5A0453046233C1621A86C6FD9AC9042F8DAE227FA4F407FC91303000000000000000000000000000000000000000000000000000000000000000000000000000036521FD9AB0B150DB7EA3F30B48C28442DF73B3513B318B073CB044F9EB3909D9D571A36196402C4BF53254AF2E10F60BC08F47EEF758B10879FD0049FB51E0013716A9E1BDB6BB10F2ED8A7C2FE35868302B840D6E5DD37AAE02E4D364C077394B821B4ABE955FC37F24E17FABD53E964A3D2F7E42C2C66DAE47BF63A510300E054CF5436D3C3AFBEFB0B43A50BC4E9CB1C416938F6445544B24017E30B28BFB638F3A27543DDA8DC124F97E1322EEE66B87FE574092569C3CC3E9B5B0A2400DC7C6F690FBCBBE36D33DBDCA016E7539E7DA4A0F31A33650D13A09AFF953B7422BE0274D87BB40D87F276E2716C32DE88FA7604238501E6B90D04DE5E8D0700BC0EB21493F5A10C106C2AFA6566582E9292FDCEDD46B965BDEA41D2B1E67BBE2659CF8819431D7A8F08CE6B62E7C147FD15F71DD22A10DAFC0FD127EC6C1A006FFCD005B3309925842BEE7206F84AE4D838179801D994045B9518A2C7D8DFC262755749F681C6C8F7FEB405346D7ED4B02AD419F43A1E460AA25E23C11B150042D1F247B5613BFBDF47009FC918336E4EBA174D563DE9AC46F642383689768405EC422E533177E591252AA436F594D3B7C4D66760832DB1CF371FEA15DA200065FA3326C73D2C2190827E7C8B55DA716ABDD65221C51AE5BAEF8356D6EB384E8C4A4CD0F13D5B7411BD7866F0D78513B0DC97F883F6238C1DDAD688C1810C006F963746E8514EC6A7F2375DCE7C0A387468F453D547625B2472EADC117359B4F3379CAB702160DA8C136B05D9A20A6D5F4FA9CC21FB97A2CFFCB7F9A6660700DA638564BC519F7F2597B6AE5AFFF3B0111A3374825FC1274FDA9F068A4D06C6AAEF8F8671FE252A58A4219ECDA21D939858835A30C1D2449AABD5E8E98217008A0077E6CD1B6150229FD0EE43FE48D0E520E42BDA477736BB61E7DB5D072D3E1C7C690BF5ED70D7CDEA1E74825A4DA7096B8D56D1B7F894CF179194DEE70F003F06D470712E4E0ACE9ADDBC42B3F5B91208571B4B9360A20DED83068076A53EA935B2BCD813C5726C49B9A932A842A34721E29077BAE64F653BF349063A020003C39E9B469AFAD01A708CD2BB2D559CB91642E8AEE90C41664882139498F6F4222F2D8712BF9B2821CCE2F512790CDAC32AC50FE83B8AA82011488182EA150011A96687324C39C6B6550A72CCD05BD967FCF19E4928D903FD4AD16397EA723736A8D06D5E002CBB1E9A413A966E63BA46CC84F36ECB7FCADFAB1BA7F9F40400 -smlen = 1622 -sm = 8E883401C839C477A7863AF81D3F2924D996001971F77D0234E6C66030C3D33D2A3BC03F5500A86B84162648FFCF12F785E2B66840CCEE4C005DD536160BEBDB63D07681FEF28E5F80FEFB001550E92D907F2DCF9B80103EDA6FF02949DB0030604305618CCB31C18CBF999B284EB46CF7013911310396B7BA622AA6460BBD4D86874AFC008397A2312448CC1269B61BE06D1C0401B912018FA69283246DCF97754FF791E3B515D535FE0072E2A92ABA9E21F0DE19EB71213814BD3AFA000B4F72D602F104B5E3A9EC8E8B0E71364AEC00AD8809ABF64CD517D7EB303903A465CFCCE400BD1AAB5549210088B9C85A4AB85DD534974500F188553CA9F29C347B5CD216C8523FBE9D2200006DBE10096312CCD2C4F4C457703605DC0A5007D55C54499853AD38360F37D68302016B0D44FD6558589E0249A978C95D814C3F4601D8ADA0EEA702A6F632447F79188A0367109894C579974373CA0054ED5F7C373B7AEB810721C3D9CEFA02EB244EF6B17507300370ADB24AE0173C6D114C51E05F822A770318033C082B6502F70012283EDA2A9DC0A1381F145470E5D3729D201773D2AA63C18885A92C962BCD3628835391D70DC36273DFAA4966F65AD40EB51FB4B416A8D0B1DDF39CB932EC4503BEA23E3D9D3B4501DB426C6AD99C28D415FB565F62EB5C22BB043C8CAFC42EBD1C7190DD32A5B14B571644471453740C081F3E3305F9AE70A5BD505874382EC0F6E2188563E763BB8D1BB8B16587AE25A6252F51E4AD02D0483C4A6E8AA2849C44629CF4B7C6DD6A5FECDAB0F9B2F0B35E306C7532B64BD5A3CE67A0247D97024AAFE5CBC13E375AA69B8287BBA9DDC9AAAC2BCF41A71E373EE36B13DF9F829BBEE8F48802DD9E03BE42A5E290251BB130E0E2ABCC4E096DD0F264E5D29F8C2388A0C3010E78F2A03F5BA1BE13AA5E50F2BA67A031CE3F787754B8276EA1AF62BC5FB4DD9A9B9BB84217A37EB9FC7AAFB517337B30454200D6AAE491E50D5007EAC2150F60F640A5C4624CE6D8112119413731322BAD9762BCF72349EE38E2A41102BC5461D72033072A90E82D105E6FCDAED9C223A4142CD55920196D7B1B9278C84B67A2E35BDE3C9CEEBB8E9007BA8758BD35C875DD5FA0A8FDAAAA9A09629B9DF69AFAAB456E105DABF2AC5834B8D223B0A406E0D1295C876C447E8E09C93FB09ED1B3EF6E1F3B7FCB029F576A45A12620567E05F218BC3753109DD29AE0ADE1370C0F871AB5AD8A9DBAA277FB869EE552E8733E73886D6DFEACE6B35E481F37A516EBE191DAA6F83E4FF453CF9CC9DDEA8EE507AF0E62EF3CB8C22949CB828E21C6AAF3FA9AC301E2257B0A054FF0A237F527D53EB757820AF637FFC9F983A2B5AFF0B4CC493E610314432C9C2F0FF73C4240D520D1D73721B429CE41807B7424B14F5EB1CD23D5562263FE1D58CB1D52E5175414800CB090242E240C3A7ACAD4C84DBD8ABC2731FA2B1D9820DA60FDB6BAA7EA849B6A146E07AF7FC201B3A98E5194BB5826945FACA3690209E5726F070A71EE07AE76ADB7E6199FCCC81C8AF7A463633A58873B4F7E65F522FDA409979DE41CF54F659E66CD5950A3A3E01570526C46417A00EC2E8821DC380ABFA21384D141D259CBB9722F267E46272ADC5CC4BCE382B554226996F4A6A1605287276C18A48C8FF1A92ECD2815CA5452FD6157FC27532680022993535549BF9AB064052E6DB4E9F83B5D0D885B94A90F59E67B9DF0C321EB0F95AC07007E4EE33BA89AABEEEEA01FD1172ECA4E31FB02C507FFE43CD0D6C8570769A180E68A70BD344B4C992E7D3A6BFB96AC4D69C2D4F5EFACA1D348DC1988DE44B30DA76BABC307A88124F96F26737A85FE6047E7E485C7E4B6B99B575FAEDC9BACA3E080E2B074CFFCE1F716C6A1D08234C45706D2883C6E5A001D02596CFE5B260DE6134C75DF3AC8BCF1919759E15576CA147CEBE041D04E369BDE70CC64157AEDA311C8DA520EAE907C33E30DD89013E24B7B02E66C9F285BF7D5C3FD65BAE24AB20D40ADDB451AB4BC4B9772D0B9039461BCA8D3D2A4D71A2E6BFBE7F02325FD571FCAE1FB47F855612F382188A5FA3D61C3E8E59EF016DB0149C52E1C7DC84030E6C93C4F32DA6CE5F3B8196AFFDE834D2ADC26CFA05940055401891519386BCD33D85584D74B2F16D8E19556C272AEE8397A1741EFFC283DBAD317740C1B67F8F4B7D2D1EDD68D6615EAC3F8E3CD26AC4F8058667FB388B19C654711B5B2EDA75A9AB55174157CBE08C186A3D0963BB3011A9567BD499AD2A8 - -count = 39 -seed = 811A8A2ED2917CC616FAF246C5F9BB902E5FBF5430AB078AD6CE871CF8C160512A748216EFAB3A4CE1271AAFEA12C11B -mlen = 1320 -msg = 061934748C6758ECDEDDF3A2DF78574A470621496CE3F12E5E4555FEBCCC1A46A772FCBADEBA8B2EB5231B5B15DEDA5A38076C737E5D091A8CA8482F84EC4A20A51DDDA391088F2C3926F8E1D8B77DD0ABD606E9AC25A17A86A5C75ADC215C5030355C4A1B307C1CC80A3BC4A7D4B4044FD35D173A2C7C081318F707828A3438DABE0836C2D6C14E1643F05EF8405531D5594411AE4DAC6F3992279CAE379D7C1762B122037301D3FFE8EFD1BEB4E027E055527D485D0871F2013E7B25CC26531C2CA6DDB98B31F0AC2C3BDF400A0BAE942C9D4C4003F9952B67AF67E85F572EDC3345A84B6DC3CEBBAADB7E3C876AB2DA16ED0EACF4858033BF5A4F739F9E083A345C2BB5D8611DAE90D25AC45D8B3D39B4DE584CBEACCC6F5B6E61524349B50E818BB6B03C7E5B86795D49324CE6B1603791F20B3500A1B8ADE82359263470D777B35DBA38276096445842BA5D5E960FB2AB58730F970A15AA42D9737C33BE700127A7CE7CADE024D3ABCA59CA49F9A7EDF44DB62CCC07A595016868AA97A140178DC92530EFF864C24954464BA886DB7D74BE7B540BAAF807F1AEBD014680FF4A51E16E1391E32069EE823F3D23DB72244D657233578CB7D29A33E6EC31DF1FDD43B51742CC30EFC54BE83149177E7BCDE4450DCD142EB2CB745F8865DFD99DC84AB92750F1CFB0F3944E4E4EAA41261A1E8C58D9B230ADD792DCE20D2612823C0FF9F82E04B61E48DBB83F1A6DD5CC7F92BCD0A37AB3053803D1188029AA1FED9BA04F4C961588C9AD2BA7EF1CFBC50FA69B799898EB0DFE9668260CA5680F91A10D2BEF8F108AB28FCAB693ECDB942070D2B9B8BBB22609C8395C23D7482C31B69B0F555B7C079D3DEFAA5FB302ED92619C058ADF334E845EB1C6EDD903C0DE2AEDD3D9830943F8BCC5954B65DF37C901A17EF13FA75B0F2C8C1D2E38681874AEBFE90B463F2CC7831958FDC0DE0446991EB3C3612CC00188DFC1078FE458D2E5B80EFA7BFCE800C6B4CA0E570FA5858859633551DA28F36F1FF418A9B7AD18AA89B4612F9D676D5FD98BCE6F144CD7458CA9F2BC732A36A4D186EA290A009A870DA3C1F60617D56EA7554062367121F3E5E569503AA573B172C6278DDE5AA4CCDA79D9D8FAF41C6C9040C1D1D3CB78B41FFA8A0180395439F0D1B72E42471A9100973AB3BC7AEC559D94D2D6402374BA5A584DE168395A156324E1E4149ABD35C72AE0F79863CB59EE6BA22145E36E0D85D3CAF8A427D38C96CE489CD0AEA20D7960608C074CE3CD0494B6D6D5EC8895F0F03CE78982AD8FD6784BCF16825286C51325662F34726BA66D3A91EEB598124D6755DA090EF863FA31CCD5B08909A3279A35CFDCE24D2BA16F42AD280B029A0E27137A671C862B0E6F73FF4A1DE320C4DAFFB5CD4AC3522EF1C10E8A918005535F355CE6366B43A757938594366831DBF7EE72F311BE4953EDD1EA1C598960745D3DBB7F1E2D882CC063BC0791D18C6376A8497F2F91389A13AA96DAB78FECA081D761479848A5B4CC2E3D015F343B9000583E95E785A45A06842D7C6C0FE9AC4D70F085503D7AC954516953C497635AC8B7698BB784F73FE6E7F9D0AB9473E828168DF4EC142CC1FE18FA067525915ADF0764E44292A0316EF3C0A443683C92C4661409589EABD7B4DBD43F54317AE0E3D1C69C35A7868991FA0BC2F83430D89821B91A08DDC2D314A717F5BC6F3D89DAF163AF73E10C61630139E3FEDA723FEB2EDFFE6C7F364FBA22E6AAB75E267065B5E7575946C56265743816B2CF12A106AE21921E3E92BFB7FF80E105468F8409D6698E8660B5B05F3F4BB19A0BD4BE3569D24F51795752BE74C429AECA5BE737DE8C01 -pk = 407CF02AA07BD0A196B4B2D50C981261D7A567765AF61F28687611BC009F571538069DFE80E24BDF7C9052B50C2DCA45B3D093CC2026D45A457CC0490AAB0B00EEEBB555BC94443BC2BF005B0FF8BFE14112D6EF2E0BFC0DE00F160E7E53D6CC6250AED8ABDB9A1C4B5237CE995BE0DCFD0F69E40BD7D0A577CE051DD7170C00 -sk = 407CF02AA07BD0A196B4B2D50C981261D7A567765AF61F28687611BC009F571538069DFE80E24BDF7C9052B50C2DCA45B3D093CC2026D45A457CC0490AAB0B00EEEBB555BC94443BC2BF005B0FF8BFE14112D6EF2E0BFC0DE00F160E7E53D6CC6250AED8ABDB9A1C4B5237CE995BE0DCFD0F69E40BD7D0A577CE051DD7170C0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FBCCBF872BD02FCEE76AF722AEA378B4879FCE3F9E1C2C4211F645A9BCACE973F37A866D8A996BEE45E44623E329948C373952E115BBF0F721AD2767BDF061843CE57D55BEB475ED1405514B617889EB0C7339F97FFA0D94240700000000000000483906EC748FD7ADB16E0E8802F6E86870D5345B635C773FCCECE5EF86EA70C9EA0AD563A9B1263EFD89019C645239B424D1FD2903B7F041673AD8AECB5862F526E395EE2F46C1C8AAEC3836B429524C24354F8416D5F7D839F8FFFFFFFFFFFFFFBC7C7F81A5238FAD8550E4454345D8ECF91A631481DC5D7F4861DE48986807C07BF5E049EE8BEF72E193FC986CCAE0565465564563519A3C63CEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DFC74513BD3A6F91AC1D88242DA9EF77F96343960C1604BC82AF64972D24F11EB9A1074F08C9D27FA972644CA405D993B5347EE3F2EF71379D9030000000000000000000000000000000000000000000000000000000000000000000000000000EA29EDDC243D6AF6E996FF4013B541B87454B8637CAB9C7C44D71C59624046CBCA2BB54B9DDF90965E043DADD67D3E0393F86100BAC214D3A1D2C28FFBB11C009AAFEAD31CFE041B8B35F024B88F25CCD640C579BAF4F678E826DC72F5FDFB2C4C029119437B33083B4978F41A06C7ACDBFBCBA458ECABB0F4500675A38E18004FDE359C1C2B764A466D1F71B8D0C0A34CAADBABD13A0E0213DD9210E74D570B5ABA1A3C0636DDF0FB29BFF6B133E3004393813A64DD43A36BF69AA2E73F23007015B3B2F477DB2F321EF459776C00B9212317C1DF5BB4190425DAAC60DCFF902096ED4FFB9C3804FBE45BECDC10CABA424A5A9EE67F66C48762C06F80D20600BCA7ED81F9EA888185B1822270A2A66C428AABCAD4703D599EA94215D0AA1D7D4649D45BC1693B2F953F9F7734F3759C2030BE7FD2D2D9181E5F84301CFA2100459DBC2106B87514F199D43017E4BAC9C999524AF5FBFE8FA0987DBAD3EE12BDEC7A8662A5FE51F2A672FFA657D340DF078E390440CE6E8A117AF85DA8901E000A45BA05E5F26FDEEDDECCB6B5DD948A2BC9B73EA841F0DFF55AE95389761909AB24CC1B2C6308E427DAD0704DA5D62279C3B2D117468680686147448F6B1B00FA50EDB4678E93977ED43CEABACDFBBEB5E25F4F3DF0CB2EB0A705124470294591D49D6DF2F59E198C0C8537531BF6E24291B995977BE62F1BF297BEF27A07004A2DA673C20C6EAAAFAB5269D2E215EF3132D1811A2565A80D5736D54C2019D9877F9C36F106780E955F048BFCD8A7EB9F44133A232F8B9B2B2C4EF33BD41B00E37C1EBB88735A7A68AC1F705F53986D4146C9D26BD858B065B91B79616AFD57403BE1E7E5958974A77001661A8465CBAC386EF024192C5E713E4C77E229050063A3FD37588A970D2FAFA21EDE82D357A7EEA5CEBE8EF2F48AE9D5FFAAECCC842A7A7FABDB52E324BB5E7BF6B96C7C9408CBD956EFCB94EDC220142DF9650100B6AC0FB48DC492F1C5A527FF35F272C0CC6A71C118E0BD6009E8E306C524AA0D9BFC5A353DA1968F810338AB21FEEAAF1971A6E91FA57CA6301B07A4AC8123005B1F71DDE5AF6C2B152E201F136570FB039A5F56F616D9555C3CB92C9B854DC7A19A8603771341B6E41D25B7DEA10871E849302A377182BA8035780D83F80100F3F2AC8DC48CC36F591FD15C590F93319CAE97BF1A93925C955951F3A1FFFE48C38DBCB42A86ED1588ED0D4023E66C84D814B61B253011ED8FE4297B51DE0C00 -smlen = 1655 -sm = EC122EF098F5A1219BD149A59AF853BE31B9005BE1568872BC4FB7EB361E81B1B94E1E2B7F0137523167BD007CCAE53298B8888187D6A8A70099DDEFE8880F674062C20EDD8990A2D3EFC3009BE9CC96FD26C97A4B9C9B847E6B532B676E016F9CAC81667FDBE06A0D1F9DD224D806BE10001561285B1ECD78E7E4914CC1E473DD280E08001C0F430501BFA116852A43214EDDEEE7B787019BD01275B53A5A64CE8A0E4D23BBB3171D6401FA3390E0E71B6028519650F1FA79AACDFD9500E0C156239EAFDB064B71243511326C82637C0166A89E60563D9A317DFC8C1CBD53761ECC12012B57F756FB8002F2D330CC40164D0D0D7F0701591D8F6A9BA7C677831D1164FE8A2B5994640100F7C6EA5D8860973B38F9D422679F1B5345BE07E265FEEFE69A870808EDF81EC907030198213F1B0CAE528053DAB1CBD1401A31C60035516976A788E7F21F836321C12104061934748C6758ECDEDDF3A2DF78574A470621496CE3F12E5E4555FEBCCC1A46A772FCBADEBA8B2EB5231B5B15DEDA5A38076C737E5D091A8CA8482F84EC4A20A51DDDA391088F2C3926F8E1D8B77DD0ABD606E9AC25A17A86A5C75ADC215C5030355C4A1B307C1CC80A3BC4A7D4B4044FD35D173A2C7C081318F707828A3438DABE0836C2D6C14E1643F05EF8405531D5594411AE4DAC6F3992279CAE379D7C1762B122037301D3FFE8EFD1BEB4E027E055527D485D0871F2013E7B25CC26531C2CA6DDB98B31F0AC2C3BDF400A0BAE942C9D4C4003F9952B67AF67E85F572EDC3345A84B6DC3CEBBAADB7E3C876AB2DA16ED0EACF4858033BF5A4F739F9E083A345C2BB5D8611DAE90D25AC45D8B3D39B4DE584CBEACCC6F5B6E61524349B50E818BB6B03C7E5B86795D49324CE6B1603791F20B3500A1B8ADE82359263470D777B35DBA38276096445842BA5D5E960FB2AB58730F970A15AA42D9737C33BE700127A7CE7CADE024D3ABCA59CA49F9A7EDF44DB62CCC07A595016868AA97A140178DC92530EFF864C24954464BA886DB7D74BE7B540BAAF807F1AEBD014680FF4A51E16E1391E32069EE823F3D23DB72244D657233578CB7D29A33E6EC31DF1FDD43B51742CC30EFC54BE83149177E7BCDE4450DCD142EB2CB745F8865DFD99DC84AB92750F1CFB0F3944E4E4EAA41261A1E8C58D9B230ADD792DCE20D2612823C0FF9F82E04B61E48DBB83F1A6DD5CC7F92BCD0A37AB3053803D1188029AA1FED9BA04F4C961588C9AD2BA7EF1CFBC50FA69B799898EB0DFE9668260CA5680F91A10D2BEF8F108AB28FCAB693ECDB942070D2B9B8BBB22609C8395C23D7482C31B69B0F555B7C079D3DEFAA5FB302ED92619C058ADF334E845EB1C6EDD903C0DE2AEDD3D9830943F8BCC5954B65DF37C901A17EF13FA75B0F2C8C1D2E38681874AEBFE90B463F2CC7831958FDC0DE0446991EB3C3612CC00188DFC1078FE458D2E5B80EFA7BFCE800C6B4CA0E570FA5858859633551DA28F36F1FF418A9B7AD18AA89B4612F9D676D5FD98BCE6F144CD7458CA9F2BC732A36A4D186EA290A009A870DA3C1F60617D56EA7554062367121F3E5E569503AA573B172C6278DDE5AA4CCDA79D9D8FAF41C6C9040C1D1D3CB78B41FFA8A0180395439F0D1B72E42471A9100973AB3BC7AEC559D94D2D6402374BA5A584DE168395A156324E1E4149ABD35C72AE0F79863CB59EE6BA22145E36E0D85D3CAF8A427D38C96CE489CD0AEA20D7960608C074CE3CD0494B6D6D5EC8895F0F03CE78982AD8FD6784BCF16825286C51325662F34726BA66D3A91EEB598124D6755DA090EF863FA31CCD5B08909A3279A35CFDCE24D2BA16F42AD280B029A0E27137A671C862B0E6F73FF4A1DE320C4DAFFB5CD4AC3522EF1C10E8A918005535F355CE6366B43A757938594366831DBF7EE72F311BE4953EDD1EA1C598960745D3DBB7F1E2D882CC063BC0791D18C6376A8497F2F91389A13AA96DAB78FECA081D761479848A5B4CC2E3D015F343B9000583E95E785A45A06842D7C6C0FE9AC4D70F085503D7AC954516953C497635AC8B7698BB784F73FE6E7F9D0AB9473E828168DF4EC142CC1FE18FA067525915ADF0764E44292A0316EF3C0A443683C92C4661409589EABD7B4DBD43F54317AE0E3D1C69C35A7868991FA0BC2F83430D89821B91A08DDC2D314A717F5BC6F3D89DAF163AF73E10C61630139E3FEDA723FEB2EDFFE6C7F364FBA22E6AAB75E267065B5E7575946C56265743816B2CF12A106AE21921E3E92BFB7FF80E105468F8409D6698E8660B5B05F3F4BB19A0BD4BE3569D24F51795752BE74C429AECA5BE737DE8C01 - -count = 40 -seed = 41CC9DB2E90239AB5158A2628E7478D0B3512FDF84CD27A4CA5FE3119A455C22045F198C3C5C39F491FB975BD1CFF7F8 -mlen = 1353 -msg = AE2638D944822298959F47B2173DE7D1E58AAA622296AD4A4CB67EC7EAD8220AC2F171605BA2D08AF3D6FF5849566EAF96209E9E00CC28EB9A517CF5061545AAD24CCE143A2EE1AB7CFA259AD9C01860B33B0036F2CB3A5086861212F408C5F055D226CCC77CC884452B2670D89548EC1C6E98FB311DF03979CABF725E78956AF185447287BCA2517F554E9F25E19D93790318EFC5D2602FABF262E5C7FC307E5A991E0122E332A803AC4A91B318B30D79394248521190D2BE326037A89FE918D139F763DC8DAA2C3BBCE53F04809F0D97303F2F1B88B572B3086ACAF38EEF36B4C0791B4918204B0E1E923BCE9E3BB1E7BAA07135B176E266AF174D5DF26C44842CEAC4AE4C1CFF05557DA3DB8651261BE78D766699B1891CB825FA9A418C45BB9F7F2D347F3F92F9529CA6DB94E2FFCC69337FB3690F556C5A44CBBD9D79F60AFF063DE68B14BD2F4B7E8CDF94F6C2F40219D27F71E8AB3D4D6872A5D4B82EAF8E3943A6D425ED04FBC5C7596AE929AD680B245E3D6A7C5CCD7FDFA1D14EF0F72B9BAAEF05B7B84ADC02913DDBC76D5FE80DE30527FFAD1825CCBA34F8587C5B0291471D6957AD99C5FBCF3669B4AE5930C8AF68305C2D3E84E714CB9049A9560A3C94AEB95A252F69B68F755DC0E0AAB52DD054B670A275BD2BAD7FF8EC0CDE6224E9A0EB537E95DAB992C382D6B03FA045DA402CE7C5B55138FB400D9E86AFE30923AFEE82C4528D1B38CE16D33BEB47A96C18428D919BA98C9782806D6F4A40B52F7F0989337C724BE24E9A5430CFEA470D02EA36CA479FAEAD94A74049898D1F1BE53D5AB8CC0CDD5438A7C55827131DE264AECD18E5F5F2F9FD60E8D2D6F55BEB27EB77AEEAC2A15432A5F1467483BE6073243D0165A6C242FE1BD7B7AA701A0827F286ECB51E4C2626DCBE95466BC94A7E2A09AB334FEE3959CA31974B6286E2A2051653341623CF3ACA65637DF657280B6025DB0C0377EC09E6E32010F0F59711A30496695D23728319DFD0AB5F3AA69025276E68808130659D912A53693584188E310B1CACC41AF4B19FAD8DA95D4B35E2569053F553A9DFCBB8FDEE1455DFA0E4F5E94324C86A24288AE27F3576AE15FBC8BED49BFD8521D77A61FB523BADF0E3CEE53799016C6EE4E1E5DEFC19C7717A5C41ED8FA6BF0E5811BAEA76676DE03767A607735C2A48BEDE511012EAF1F79E4D2C3566042FF2C63BB82FBB399CE20E1F268D3844BB473AD7366EF86D064C5BA080FC0C01BDD2AD343C5367D80D2A058CF40725268CD34123C219D9109780335611B008EE3F8848EA9D174D7B96BD2FD9A04FA2B550DCF0B301D64C0764299D317DCD0CA05718A1AC008D86FEA330095E81567E83BDE31A0D635098D7B86176CE6CC4025E8628C73B394D9A45B09B64BFD3A424162B16E1ADAA1AB60006847C6D5CA5733237A330147CFE6B9170D7B88834BB79F1FDDEFCC0EBB1D4FEF326E28C41C919607BF12AD112807BF8582933DDB096F1F3E2BCD6BCBD844DA317CEA2A7688A5FBBA14D84C537814EC2B171ADE28ACF83EA481631B968C26F8D2BF2C5AF7D61A93378E1E23FC756E2F0EE79199475AB4BA1FBC55D9ADC2B05888B2910049BCA98DEFEFE96CDCB67CA9D4AA5BBFC6CA0ECBB78BF29035D158DE2A1708D98BEB85C70AD1C64B39B387516073E2FE85BD9EFA25CB048C224E0EF76547DCA67FD66485A97EB5E56C06C78FFA08EC1C9C6F2380912A2585CBCBA2CD702CD2B51022F63EC920412989BD743A8A8BEB07241E3E8EB38CA14CD400C83DBFA6FC8E04F58529007A1477E9613291AF877692E4CA9AE118A1902AE7B4AE7DC2E992A6495CD19DF32CE64131A8D8C41969A8BAE1D870DD5F1360BA9278D5B76E746FAF99D526199E87A4B1D3A5C48A33989F103CFB2 -pk = 1B6C5D65999073EFD8D2DB2922255D81934CAE1C9325ED4C68D8D80FFB2BBD3CE3767A764A7BDA6D7B9459222345906394D40D82DDBC4E7911716F049B671C00060A66F4CD43621D2F881351F54C4F4A1FF3F1BC52E9E1ADA7347D8803F521BE94AA8B9774016D0FD7C2173666A7FC269F5AF1D23D5B1336D11218EACE671C00 -sk = 1B6C5D65999073EFD8D2DB2922255D81934CAE1C9325ED4C68D8D80FFB2BBD3CE3767A764A7BDA6D7B9459222345906394D40D82DDBC4E7911716F049B671C00060A66F4CD43621D2F881351F54C4F4A1FF3F1BC52E9E1ADA7347D8803F521BE94AA8B9774016D0FD7C2173666A7FC269F5AF1D23D5B1336D11218EACE671C000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042A3A59F66C74B80776E4C081BD0181E80141599CA71FD581306BAA214A5C6A0C85DFC611EE9DC2262DBC5536F69ABF985191DCCBE44F53993641660BECFD7CABC5876DE2A36FC3EE157F8CF7C6F435FF6F10FB8B704D03600020000000000000099411D6782D6C9CE3491322B073375C2C175F578E4DBFD3E598EB2C6047A5E565BB21081D48C0857763B514AC57137D46F18949D2436E354286CC691489E7CB08DE56D7F078FAFCE79846BB3E124E8373115FE710686BC168FE8FFFFFFFFFFFFFFA9FDEC35D4923E7A181678D6883149586376DA05BD03CC83AC7132A4C9857B5DA644B0C89FC15ABFD769B0208BC2F109472070F9391933188E79FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA50C488E045F7AEFC15E8C5A62CECD267BA5AF7B20559BF204D3BF1C83830FCF5B030CC76F40EC1483EC928FCB7C8E877F594EAFFA3A6822FED020000000000000000000000000000000000000000000000000000000000000000000000000000C8BAFF25443AA95BFD8E5C0A21EBB247A73615ABF634BA17A29A7CDA2673739CD3C5F01AB1CCEB218A96F72FD8D56509D7F6C60F0AA5C539E14C4BD882A817004F7F9A7652EC4D4D56D726795AC4158DAE98505BB0C924A24AECA6BD6544932D055362F66B760C844919BEA802E8CF4A7A2849DCA1411932FDB2FEB513330F005C87AE535936D3E64E0D3A7B594DE846B1ABF9F38F5F767AB7C535DF3AD160CDB0A89EFE266D668ADD7D82032E19908D4AF67195C6C1EF637230BC18CA2807004FF00B5DA03858E1D83F70416CDDDE767522B151288C6FAA5818BFA939C832BF13E166FE8ACDDBD4C9DB8E74E5DC2F67B2F6FE50C8D6A985D9D111AC2AC82400FFA4F8CBEB9A312BF9F18669DA4D85770DDF74D447466F5C8314A6BCA12B981FFA52BDFC5FB73A529DA185B560ABB82842CED721E59D6B2CCE4F403463840C0023039F04C72B7AEEB1457C90E16A2980C1EAC3EDB2CE8B1A159BACBA85D7608E5A682C7D0EFDFF886B423C7E3C735D602459D2A8DA59CDDC3F41F719E27206003B5B5913E06BE2D33925AB1DCD5A5546BF0D3A394B90D5C7A4D72F30EC2DBB8A65E6B691199790A4087891CA7DFA2E0077E813C8B79DA6985D0E665527220E00F9F99BA3AB261ACCDBDAE619C1B9AA85A91E090C4EDFF004B6D4BD9F9DCDBCD8F69D772E204A9029E3DF05F5306C0B32A7146ED15D491F00A022BC6B22370B00EAF7DF587856BD63CBC8F1BAFCEF58EF572B2CD70FBA00BFB1F488DC6A4031FCDEDD0E1F0F6AF276BC3BD59FCF0989A1FB3C467CF30DC2B0FC9E1952E84C2500D2F96F85F99D275EAB330BDAD370FD4E3597A7C1B3C3F123E10E87C28B4DDE979C566C79486E84D66E952C5771842C8DEE00A7DE0698DBD1C7DE7D4D69A1200035930EFF0FEA16B3A0AC3B706EE08C45BC6B52CE68A54AB7AFFCB424894F07E4EE28B7EDD7F4B95C76500CCC7841D3F47C43852C8EAEA2C7AE4E37EE1C6C1F00816FAB84804CB1E53AD6F9B5E9C6024651C17C3AE921C2A89975E7064ABFAAABA6A73B372946F50DFF49635DED47C135E50BB168B2D10547AB0E37E4172F0B0025417888D0CC229C4B9CF2868F44B1EF9675564E4A037C39C1EE4543B43CB61817D59C12EF371F98C85559C5A83B0F8D9492E4EDEC0F1BF6F09FD862C969220011DC4EB8AEBE0A8722D8319753A63C636B02519973A70C64398C7F4669BF23CCB3F85D899C11417C196822449F25CBE3148F6323E656EFF222051F0438861800 -smlen = 1688 -sm = 3CA50A27CA025D25E3081D25A769E763AA1D0026CAA3815153155A5AC9425115818A65611000EDC2F166DA24DF48F0C026C47E408A46B3BF00C57E35ED7958781B985001A0698B248E030600C99534BD58D0280B08262DBDE603D061381A0050A1E453FA82B96902F6040E2AE0BF80892E0143C04F9C537B0FAF590395C4DF782C30E2400040942EC8D7A3F2556A84B46638D66038DE320089510B770188F7811DCE9DFCD901CC309B2901D3C50B451B501202420F3A5AD9438907820300FD595B358C69E1B25D94B8B033D8B8167D55010E0D2229AD5197F35F047D9CA13567B69C7E019627F3195048965B4E235E0E030FDD9D4C51015657C1FF4B65138EBC8422E3422A36D5C1050001FDE4AF43C5698BB689CD5E5FD31C067356953ADE6A35678CB164ACD75E90447A0701771DF4ACEB97E29360458EE892D57A0AD04000551B5F791A89E3453AF42131287801AE2638D944822298959F47B2173DE7D1E58AAA622296AD4A4CB67EC7EAD8220AC2F171605BA2D08AF3D6FF5849566EAF96209E9E00CC28EB9A517CF5061545AAD24CCE143A2EE1AB7CFA259AD9C01860B33B0036F2CB3A5086861212F408C5F055D226CCC77CC884452B2670D89548EC1C6E98FB311DF03979CABF725E78956AF185447287BCA2517F554E9F25E19D93790318EFC5D2602FABF262E5C7FC307E5A991E0122E332A803AC4A91B318B30D79394248521190D2BE326037A89FE918D139F763DC8DAA2C3BBCE53F04809F0D97303F2F1B88B572B3086ACAF38EEF36B4C0791B4918204B0E1E923BCE9E3BB1E7BAA07135B176E266AF174D5DF26C44842CEAC4AE4C1CFF05557DA3DB8651261BE78D766699B1891CB825FA9A418C45BB9F7F2D347F3F92F9529CA6DB94E2FFCC69337FB3690F556C5A44CBBD9D79F60AFF063DE68B14BD2F4B7E8CDF94F6C2F40219D27F71E8AB3D4D6872A5D4B82EAF8E3943A6D425ED04FBC5C7596AE929AD680B245E3D6A7C5CCD7FDFA1D14EF0F72B9BAAEF05B7B84ADC02913DDBC76D5FE80DE30527FFAD1825CCBA34F8587C5B0291471D6957AD99C5FBCF3669B4AE5930C8AF68305C2D3E84E714CB9049A9560A3C94AEB95A252F69B68F755DC0E0AAB52DD054B670A275BD2BAD7FF8EC0CDE6224E9A0EB537E95DAB992C382D6B03FA045DA402CE7C5B55138FB400D9E86AFE30923AFEE82C4528D1B38CE16D33BEB47A96C18428D919BA98C9782806D6F4A40B52F7F0989337C724BE24E9A5430CFEA470D02EA36CA479FAEAD94A74049898D1F1BE53D5AB8CC0CDD5438A7C55827131DE264AECD18E5F5F2F9FD60E8D2D6F55BEB27EB77AEEAC2A15432A5F1467483BE6073243D0165A6C242FE1BD7B7AA701A0827F286ECB51E4C2626DCBE95466BC94A7E2A09AB334FEE3959CA31974B6286E2A2051653341623CF3ACA65637DF657280B6025DB0C0377EC09E6E32010F0F59711A30496695D23728319DFD0AB5F3AA69025276E68808130659D912A53693584188E310B1CACC41AF4B19FAD8DA95D4B35E2569053F553A9DFCBB8FDEE1455DFA0E4F5E94324C86A24288AE27F3576AE15FBC8BED49BFD8521D77A61FB523BADF0E3CEE53799016C6EE4E1E5DEFC19C7717A5C41ED8FA6BF0E5811BAEA76676DE03767A607735C2A48BEDE511012EAF1F79E4D2C3566042FF2C63BB82FBB399CE20E1F268D3844BB473AD7366EF86D064C5BA080FC0C01BDD2AD343C5367D80D2A058CF40725268CD34123C219D9109780335611B008EE3F8848EA9D174D7B96BD2FD9A04FA2B550DCF0B301D64C0764299D317DCD0CA05718A1AC008D86FEA330095E81567E83BDE31A0D635098D7B86176CE6CC4025E8628C73B394D9A45B09B64BFD3A424162B16E1ADAA1AB60006847C6D5CA5733237A330147CFE6B9170D7B88834BB79F1FDDEFCC0EBB1D4FEF326E28C41C919607BF12AD112807BF8582933DDB096F1F3E2BCD6BCBD844DA317CEA2A7688A5FBBA14D84C537814EC2B171ADE28ACF83EA481631B968C26F8D2BF2C5AF7D61A93378E1E23FC756E2F0EE79199475AB4BA1FBC55D9ADC2B05888B2910049BCA98DEFEFE96CDCB67CA9D4AA5BBFC6CA0ECBB78BF29035D158DE2A1708D98BEB85C70AD1C64B39B387516073E2FE85BD9EFA25CB048C224E0EF76547DCA67FD66485A97EB5E56C06C78FFA08EC1C9C6F2380912A2585CBCBA2CD702CD2B51022F63EC920412989BD743A8A8BEB07241E3E8EB38CA14CD400C83DBFA6FC8E04F58529007A1477E9613291AF877692E4CA9AE118A1902AE7B4AE7DC2E992A6495CD19DF32CE64131A8D8C41969A8BAE1D870DD5F1360BA9278D5B76E746FAF99D526199E87A4B1D3A5C48A33989F103CFB2 - -count = 41 -seed = 1C13369824A3FDD41B1065E17297574715D9BD9CE5BB733D36D22C31B62BB1033989A604D78BFB1A0746BD4A2271FC0C -mlen = 1386 -msg = 9D84E1DD28C513987D5587A4427853762B7D7AF668FF9EC2E90211D6CF5C0DE6C7E54B298C1A6C67EA9A693CEDC4FCA1A6ADC2C6DD0E5BBCEE7266B9C6AC8FA8AF5E50078A6151F938161F1FEACDE4D8079B5A9D563423258CF3AE9E47D8E75740314F2FFA63865A8B30743F773A53E1AEDEAC45CAAE01993B75C8116FB0B431631AC001AA8BD02E5B83DE627AF0CCB3A3D86F66A7E5FB658F9226DF31095780A6E8262A247D70F4E7C971D108567FFBD7FED0E16B7FFDDD93F5764C3E02A61998C32146564D46589538B2E071AF86A26321A3523354F4F0C396B863FC8E9E2E3A173901D0D178A9D2828D0E0974B72CEDFB17937D6054F185A81D4F853787E6C3681A74FE25FAA6C256A9F9E9A9253F98B9AE4B8FA0068DC28BC7E8D5785CFAD20F7DDD643DAE6A2DDB02713C9CAFC2EB2FD18EFDECED05CC24913061BDC38E932DB5E8181FC0D3DE26A94E2138800B3C01E07E83B3B0BE187EDC75DA576AF1CC7B7122367EFFD6EBF05F4C2EEB0AB6E9F91201A4237910A87DE9FEF777981D48FBA28AB8D64D76380911F2A6621335DFA96B331AE8B3242EA1F2A260260244196B0B9596C411218A17D0A58D3B5735B9AD7B6259655CF6E2D0FE5B37D0A0B02E67951F5D3FB277B6E1EC87528B08229AB0EBD895CBA2D075A47CC8100E9DD17DE7D951BF0A68D710AAC21C8226D8CA95AC49FCBE9D493A8D3C7F93FA61685BE57FF422FAD036304F317A3DBCFEE7A4610C8C1DDAA79E37C19D6414F47230E01EF1CD5C7C2FFC319A29AE6A9C95B06C603F2CFC1D1FC914B036CDA6CF9A876946983B06123C2E5C7D09BC190647CDC0512F35DB9E214C77D3D7D0234C3F2590941236A367700F9C04D3AFB949DCA2067571BF28E78ED35FC026BD801C4AFEE9BF31C97580953950D2E81EE6426E78D6F8134ED19707473F0874367C86C9BE170BE63405A9BF7C46A420724B6CCFF9C21B015E21BB02C5A7AEABCA873B46571530DE56E47288C3424DA398517ABB6502A9A6A65D4983D97E479941C44CF0136D225991226F70837E2A7D1E9CB1226F40BF59D52C66549BF8E360096954F5875C466160A0C75A252E5FE6B8F1841FE210BF08520CE74D77B69692086EF50BB64732F19D1A49E5800F077700553290635D418168A6B9E3AE980112AFB9D58A18B94F972845C309E86FEC7E456191D8760A1C2106036E44C5C9A5F2CFBC67D741E8E937E99ED7820AB0787E39C385356EF0F05CD3E31C44115A8892224197B1D1F554D5098B72058FAD49C665F716A266CB4DB6204666E1DC07B6CFDE0EA00345661E0F94A5025D2EC98483CF482058D2EDDB018CEC11D91EB46B63971AB29367DB46137CD7690D5782E3A3DDC8CABD545FC1AAD8A9A0A39542AEC55CC3D58A5BB5E4A559DB1FCD2932EFF6E81C8B8E5AD5B4E0424A444BC55D96DF63C8971A5890310FE19DFF8ACBA72D96FD3F32D67D41A2F3D0B343489C7FDEE7556012C2D88E2BA9D512B71E7D04F92E6BE3A9386565271D755BED752C853E4539F95C3287A275004F76B9A93837C6EFC6760BE4A39B8AA92C7605AC369472FB29E11ACAD98FC91B1B9BB3505638D4D46A3AE3C10C8DC115C35725F06649BFB00BA1EF214B9F2FE98BE2DA99AB23E7B9F014F5C5D0248A9E0E088AC175C8048C6BEB5108DA59DC234E9EDFBE603BA912BEA22505C2A9EAAE766FF55AAC8392AEA5C722DF25BC6C9FCF9B0275DF71206A4E5290FC5E71D79928E357400DCB04EFD7CC9BD0B86E04BFED9BDBCE5787E40FCD6041ADDA615B5ECF03C30AB9B2809E3514E9AC87226C55F259C5F157945B0073431715E1740DCB319EDDDD1B5F2763F0439CC0D6ED5867D9D98C227CA3008F30D1B2AEA40DC73FF8289E4A21586EFF519520F888E7E2F6D29A269C12607D13D398F437CD7F0A07C94EE1E1E3D8518D0C97BE1E250D79C5AE1709AD8A638F55 -pk = F0704B19D91C4EE75C530998CE886D73A3379D865DA4B068D2FD0325D240E31640B11718338EC84ECAC8613A8AC4F0ED4060560167BC8D07C75070A1EEEE030084B31DB091CC684A3DD29B25BA67C93DBFDADC676F954236B595641C9F13C29DD3C0AF08AF8F04835D096C6AC2B7FE60B373ECC74E94025D3B2BE675C9700200 -sk = F0704B19D91C4EE75C530998CE886D73A3379D865DA4B068D2FD0325D240E31640B11718338EC84ECAC8613A8AC4F0ED4060560167BC8D07C75070A1EEEE030084B31DB091CC684A3DD29B25BA67C93DBFDADC676F954236B595641C9F13C29DD3C0AF08AF8F04835D096C6AC2B7FE60B373ECC74E94025D3B2BE675C97002000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000051AE6AFC6C534C9EA0086F212AAA91BACD4436A3127B0024E6DAADDCDF204438CBD065DCAD187E2113802BF1183820024C9E632AA4B9315C64D1D842E4275ABFB48F8E734FD30CE9E39B0020A42C14FDE158B7CA90A0F237730A00000000000000B464D2DF7C6704BCF4133E6AD877E3A9AA9D109866970F637D00E6662B0343F12C947770FDCBF2BDFF54C57E311A32596704B1CFA00AB9E1E298A6E0135BB735A638CEC874A03CDD80B7A55760B457D5B2F4ED54398198F251EFFFFFFFFFFFFFFF5CD7D890CD9847E0F4888A6CAF344D2E4E2FEE19E8B7E59BC5D98D4F651245EE4A892A425E61191CD8156EEBD27ADF92CB836928F0ECF8845389FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1105A7E2B1730031675F5DA9E27BFD1F98988DEF14A596E4B4295F349CCC8AB1FBA3C1E0A1A4934C82B4A55C2DC75E5D8B789B2415B7E7E0F470020000000000000000000000000000000000000000000000000000000000000000000000000000E96F1B27310B17E4581B5F0D789F95337F1D1871E46E89DC5B0EE5D0DF0192D502C9C8C8AF90051BF1C65451BD1BA232FC9840A74E59817DA2D40189AA5E0600AE30453606E9D176C589D624555AEC637EB3B55579357BA791D1D9B76DC4191EBB7DA750F2543F5495AEA10430127432754E3BE3A4EED05188DF283229FC0E008658BB56254C35A4DF22376A92634CE9C4C1772C804C808967CAD2BE8412C0685330B1F616087EDF45627D70DA6AB47F7DEE681E94648F2507AD56E369E40C00EAFD2B38DD6BD78364D097B8ABBE45F1726595D0EA4A836D79A29F82F5C965D531E5BD20D31A381E9D00DAEE1DA157240B43E01E53E9A83D7B8D6DBD06570900BEA2E15087B3946735F8CA452E228EF25712CDD60C3C0ED50AF03D79AFF1E10B4A720FEC8AAF7B0B4B76C42D6FDC8757CBBBDDF905A07069C74967870B6512000247FE99D4F16FB32FC5BC988AAF753AED03A182C356FFB1E6C0FD07E22C472E958108D3B38860191EE532BC993E3A1FFBB3788FC43C204F025FCDEDE10420004BBD4BF7BB1A5D8ED9A221EEC972A9B62686845DA6763FE3D036FE7E4E2EEF66F8E0E0CE1A72F89132BD0F713CCE46A6497DC54AB5F06D692DE91BA3A2DE0E0074694A98CAC5AD35FC8E1925C67934FE800BB69431D731860E516E540587AF3803C9AB354C54D3B36A5362EB77C156ED623D2A71203E37AF33FFAEB1CD612400F43DBC1525D69FD170A2AF5DC491386CC8FD12F5B289E1403017674D31CE6430BF2379AB712B72CD9BF752C26755350DA30421F99228C63691239966A8530E005362EE327CFAA9BB0DDE5E5BED934667DAA1BD3001D6FAE4393EA539D9E19434ED2E5E52ECCEBB26EBA7383D9E522D66DA8D94523258FD134A36FFFFEDEC1500C824AD10EEB954D88F5E432540262FD7274A71C1D21B56941F22C39BEBCB2144817EC7B3FEEE5FE39EE8031220913766551F7973CC6C4DC20215FE6B3DC61000CA111E5B0DE531FB40ED55D6EE97089E892BFEA4B5507DAB88CB671F0EAD42606258C2B4E88474D9C867E9902EB98ECFA62113F01D8BE977ADCC1E11B020250030C4A540F2157B42A1A611C3F18D7E064DEF31682C9E52B6B1C35CDF6E2A08359618E89BA42A8002705A21EA44665D6EC671B7FAA9C86576B4CB9A69A6A201004E58E802862F7522D9608E078D9A00DD2D5C99845CF333A2A42BBA6E3019F71C47F02D299927FC5288CFEFE0CEEC1AAD094B3F60024C0D6AEF5DB3D0C8092200 -smlen = 1721 -sm = 2BBF95DA19B72C87C310F63B6C2D31E6966300286F092CFD5AC98ABFEB03EAB6540CAD868C0136BF91E7A0664CA5F4762E86A8D534F2760301F24F31AAC2DA66BA4663A748BCF804570018017931881C2CA62417392872B1C0AD0DA46B9100391FE69DA1A3BE3692EBED707A8DEE2E3DAB004833283A1FB99DDBD83C26EC4F7978FC39840155BF1086BEE3DD4AA2A98EB15AFD8F0646FE0080AD7800A69D6E785F748F42E9F2EE6615990124996290421E1A03709808E927647F9DF418016FBD3F7EA3852745E3A4869096491BB1897100BE09EEAC0922A28821631753ED7D9F8ACF620127408E741B42BE8DC543BBEAE9BF082E9D0B0083F10EC29ECC7D3EC9E9A19527C06B30428401018B1CF41E2762174F3443E4EB21E74BA85E14F89D9AEA71448A63722540274C640002F29299B021BC993A33277225417FF43274A7004D4CB57D9A97F2EBE7EC311D2EB8039D84E1DD28C513987D5587A4427853762B7D7AF668FF9EC2E90211D6CF5C0DE6C7E54B298C1A6C67EA9A693CEDC4FCA1A6ADC2C6DD0E5BBCEE7266B9C6AC8FA8AF5E50078A6151F938161F1FEACDE4D8079B5A9D563423258CF3AE9E47D8E75740314F2FFA63865A8B30743F773A53E1AEDEAC45CAAE01993B75C8116FB0B431631AC001AA8BD02E5B83DE627AF0CCB3A3D86F66A7E5FB658F9226DF31095780A6E8262A247D70F4E7C971D108567FFBD7FED0E16B7FFDDD93F5764C3E02A61998C32146564D46589538B2E071AF86A26321A3523354F4F0C396B863FC8E9E2E3A173901D0D178A9D2828D0E0974B72CEDFB17937D6054F185A81D4F853787E6C3681A74FE25FAA6C256A9F9E9A9253F98B9AE4B8FA0068DC28BC7E8D5785CFAD20F7DDD643DAE6A2DDB02713C9CAFC2EB2FD18EFDECED05CC24913061BDC38E932DB5E8181FC0D3DE26A94E2138800B3C01E07E83B3B0BE187EDC75DA576AF1CC7B7122367EFFD6EBF05F4C2EEB0AB6E9F91201A4237910A87DE9FEF777981D48FBA28AB8D64D76380911F2A6621335DFA96B331AE8B3242EA1F2A260260244196B0B9596C411218A17D0A58D3B5735B9AD7B6259655CF6E2D0FE5B37D0A0B02E67951F5D3FB277B6E1EC87528B08229AB0EBD895CBA2D075A47CC8100E9DD17DE7D951BF0A68D710AAC21C8226D8CA95AC49FCBE9D493A8D3C7F93FA61685BE57FF422FAD036304F317A3DBCFEE7A4610C8C1DDAA79E37C19D6414F47230E01EF1CD5C7C2FFC319A29AE6A9C95B06C603F2CFC1D1FC914B036CDA6CF9A876946983B06123C2E5C7D09BC190647CDC0512F35DB9E214C77D3D7D0234C3F2590941236A367700F9C04D3AFB949DCA2067571BF28E78ED35FC026BD801C4AFEE9BF31C97580953950D2E81EE6426E78D6F8134ED19707473F0874367C86C9BE170BE63405A9BF7C46A420724B6CCFF9C21B015E21BB02C5A7AEABCA873B46571530DE56E47288C3424DA398517ABB6502A9A6A65D4983D97E479941C44CF0136D225991226F70837E2A7D1E9CB1226F40BF59D52C66549BF8E360096954F5875C466160A0C75A252E5FE6B8F1841FE210BF08520CE74D77B69692086EF50BB64732F19D1A49E5800F077700553290635D418168A6B9E3AE980112AFB9D58A18B94F972845C309E86FEC7E456191D8760A1C2106036E44C5C9A5F2CFBC67D741E8E937E99ED7820AB0787E39C385356EF0F05CD3E31C44115A8892224197B1D1F554D5098B72058FAD49C665F716A266CB4DB6204666E1DC07B6CFDE0EA00345661E0F94A5025D2EC98483CF482058D2EDDB018CEC11D91EB46B63971AB29367DB46137CD7690D5782E3A3DDC8CABD545FC1AAD8A9A0A39542AEC55CC3D58A5BB5E4A559DB1FCD2932EFF6E81C8B8E5AD5B4E0424A444BC55D96DF63C8971A5890310FE19DFF8ACBA72D96FD3F32D67D41A2F3D0B343489C7FDEE7556012C2D88E2BA9D512B71E7D04F92E6BE3A9386565271D755BED752C853E4539F95C3287A275004F76B9A93837C6EFC6760BE4A39B8AA92C7605AC369472FB29E11ACAD98FC91B1B9BB3505638D4D46A3AE3C10C8DC115C35725F06649BFB00BA1EF214B9F2FE98BE2DA99AB23E7B9F014F5C5D0248A9E0E088AC175C8048C6BEB5108DA59DC234E9EDFBE603BA912BEA22505C2A9EAAE766FF55AAC8392AEA5C722DF25BC6C9FCF9B0275DF71206A4E5290FC5E71D79928E357400DCB04EFD7CC9BD0B86E04BFED9BDBCE5787E40FCD6041ADDA615B5ECF03C30AB9B2809E3514E9AC87226C55F259C5F157945B0073431715E1740DCB319EDDDD1B5F2763F0439CC0D6ED5867D9D98C227CA3008F30D1B2AEA40DC73FF8289E4A21586EFF519520F888E7E2F6D29A269C12607D13D398F437CD7F0A07C94EE1E1E3D8518D0C97BE1E250D79C5AE1709AD8A638F55 - -count = 42 -seed = 7AD6C7DF00C9E52A75290D28DA946305D83CCF6DE2515C19A8E26850C34C8C2E545E2E32108F13B9C97F87AB68D10131 -mlen = 1419 -msg = AF2860129C08A1A9C7A7BB3120B3E40AFA1A4A09050C8483E7511FABF3285544D4CE3F41401DAB8C17DA547F6777A72519F6EEAAC83016FA0E0FB0B33329DD02AB8EB1F291758074EBB5B7C4C102B75BA422821E6755B37B914D689D84808A89CF88F69A446F489A260BA03CA52A4AA14E8BCF4BFE5134DD2918A88D67329B9BADC6ADA4A3071FD21CFC45235FA0A1B82D91C5877F10AE087464251C8899732AA7FC8F6C0A5BEAF4FA41E64CA97932925A06E218272500249577705804C6DD9F0F61DEE6AAE096BE0AE5E67923137933FE4D61E9A88DFD5B3BD75AEEAF5018A5153985E2837AD1AAD5EED91620D935EB9982DD2364B5413F490BF251FC783503FA146300E6ADAE0682E0597C3839C645DBE855919BB1CB80C3DC6E233909017BB31F5ADAEE05CE442EEF594FC15FEC3A2B4B81ECAAD1340B0677F27009290AB3AB8788556389047F63C2CE9390658E151CA85BAAE45ED2FE12B6667967F6B772EE683AC2E7347C7B0EFA332B3354B5043CB86200F8E4249F68030844D00A86FAA7B79A4129AD676D1E9D58828A1AF4C6BD68C29CC23002E0A0313500BA717B8756D4A18E41E381DF8D7A999A153876DB876CA4A508486A4F331CAC9CB3E7C416C6329713CAB76E1C8B63A8CAD46F8EB1E65116F89A3B4EB8FAA14A73097CA71AEA3220BE7FB7FE64919893930445D962C309E23332E4B3ED8CA768EF0ED46EAAB199827AD628A1BC20CCD9F61BEF67F7FCB017300EBC7493A7CCDAEDBFCA5F91E80B80DECBFD9EAD9BF22FE16B563512C7383D34801C504202D7A0E19821EC8495016362EDAC165904D2BBAC484DE1D4112C3A3E6EA56A78785B7CAF2A44B5BC8BECBC50BF4B521C1D086086FEB009C06ACB8FA0F53E7654FB02AD7898E35E5F3A7DCFC50124BA1F30178C707F4D36E4E7758C4CF82747753CC30A836311794A6A9017F53ABD17A1C9647AB38BA56AAC83C1812DEE8A5A75C5CC958780A3E9C3C1F39729BD365948F7FCD8104CF09660060FBAD2BE9B8D8E5BDD22286EB0BFD4010681AE7928D0FC008E21C8F877D97B5B9C7A06C02530FBC6A9D6FCEDFEDF68A9682177757CDDDFFA6CB9086B8330E61851E2761D84DA37635EA8441E3B23FD165CCEA562B0A3616B30EE5FAE00F76D6801B22F2215D80829E01DB2C0743E3074CF26C96B0EDDF97D79FB9C7FFE9B5CDB891F9E61FEFE7E1CBD28FE25B7858921C8C99C45A84B50A8233037DACC20BEEEBB9B22089DDAF2EBF0698498DA694F75ED2463D09BA2C757A986B8CA556CDF46CBCDF288C078041D497242F66411F47F35A21918855F105F24686076FA21BC1283F17245A7122A848B4BC10D996B2C5161FCE0336B2EC747A4A07FA9851AC5423D1EFC4B524E795B2E4BFFD1C5CD21F5FEC954824DCC53BC3883A7F571A9323DFDD2682C4A4C54E8862F347C9A8897779170B257AD26D90121DDE722A3F214A44CF6C5A5DDB2452A2471EBE7FC8D0EF7F1EDC7920CB42A71E4DB49A0168D51843F47D17BADE50DCB340E5F7B7E5B6A6C3AFE0FB26B5EA172A4011EEE838E5634E521483C6EDBE9994B0658406ED8F4998C7B4E869845CD16CC4368DA3BC1B025A6FFAFBF540133C372D452DD831DCAD39D61CCED0A0AD193FA9886EAC749001E3BEAD5A7962275FC62298A1BD054F4BD97ACAB2BBFDC355C73509D98B6DE5B4CD774BDCAF1398532BB3DB56524CC047ABDE6880C3B282FCE0FB2AD7E4C5F7BC138B48D194E8C8036DF4B9F3949E912AFE5D2734662F27583193D0FBA2B73C1A0D012DB853BBBE4383F6C391F3220E1B5761C337A054FC9FDF09C01864B87324A90C776EFBF5D34A68DEE38EBAACCBB61B4C79A58CC848184F605D43CF9D40BE90C1FBCF6735270132B59A636B16ED28111246270AF32EA2CB7A42A084005AEBB6161002E65B37217361BC269F5ED12F7D50613C82934A6D1D98D1308AC82827B7504F3FD351E0ACA1C62843C9219023FD092692BA4B83BE198EA -pk = 6BFA73968FCEC52FF93BC22BAB4E0D7FB90B6881436D2A964E2DD304448ED4D318099B45698ED83BA33E3806A2DF9E83C5C64B8A136BFB789F1E5797D667160001078528623F395824352AB39BA3EF251DF3B341BAFCBD4486D2911BC157E4E8F77C684B8DE2E723DB7CC3B51B71DC22C1CF8970B16DD957586F9948C6032400 -sk = 6BFA73968FCEC52FF93BC22BAB4E0D7FB90B6881436D2A964E2DD304448ED4D318099B45698ED83BA33E3806A2DF9E83C5C64B8A136BFB789F1E5797D667160001078528623F395824352AB39BA3EF251DF3B341BAFCBD4486D2911BC157E4E8F77C684B8DE2E723DB7CC3B51B71DC22C1CF8970B16DD957586F9948C603240002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A64C762B82C604ED61239C23942B6DBF62441C36324E9A89A0F499E65C013E82A17A64482EBA3575EA84828FEA26AC46091251ABB5F674333F2ACD3353FFE30047F7EC3F5619E25553B636B350C218835447B552D2E8B6AB840900000000000000AB4B87EAB23ECC75ACA17376379190709205124FC33284AD2DA07EC09D2DAB9A444ED2ED7F0C8E9D6E7FB207FFBE71D0CD965C7C455CE76C32BAE300C893B1EF4968843FC2425EE1F740A5A0B44BF2984494F0306D3919C844EAFFFFFFFFFFFFFFABD43191E280D05895021159B06C7367825697A6AB723F8F8BA9433FFD1488C8427C2BB2276AE7CDFC3248F455B6435F98BFCC475719DBD92268FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26541EC87681E386192C85F2929C2D1500C080476FE0CDC56C17D79CCB3A8190D83B42A660276028E87FF20A7EC15B30C3A41F5D5AFDB49B64BF020000000000000000000000000000000000000000000000000000000000000000000000000000F018FFC7A3E570E53A26B01924A5303D31EF20422142895954FA382EFC90FFC521F4AB1A54430C6E9544B3F7DD63D6556A113AD8467BB82C6C7CDD5D05A00E00F0BC00978073CAE4C5350C21FAA64EF8C05EB7A46A65D719086CBB7092CA170D281F3A73D749E63D4383BE3F16FA0905816B150F91EE98E047A6A54825331C0096D7C0BA5027C7DC30BC14D0115FA09CC3585D7918CDF3737B5871A0DEE4887DA830937AD0515F6CF6921F5441CC5F3607DA43F26582F59CE3008479133B0E000DC07BBD9EFBFF9EA4C67059AF9D4DDCFA972C959F2F1326E0672E6F1372275AEAD55F7B58C28CA775328D8D4D51567D0ADD3BCAA5A84310EEFD5AFB7EB408005F3DEFE195A8FFD9B8167305988C32F2A11BA6C19796CA982A2376D8A286BAAE9BEA7263FF2226B8FD95E77CEACD67F815551FD6D68FCC40F4A9387ECD9F2100112AC493509A9D5592A1BC24DC7C5F23BFD3E478404E1D5E85B59AC6CCD30D3DB6A776DCB0860F8C6F350E5F359E7683766DDB7D728A3492718119BA053C1200D752DF7EFD570224731BA948E40DF02FE29F03985EF0C1771C525749AD5DBD38692220B3688F85A2EF940CA7DD26245DAB41BD18DF00CEFF13A04A0C4A120700980B3A997107648CDA7742F3DF97AD0DA6B051E0A723425F22A28217F5AD24D04C503BDDB007EB94B1061062BB222DECA7BC49C2E7D1A7BD29607B9B5F000300A2CF29D0A5A6036CA2C0CFF1A6350D7D814E9010CA62346B3B67697C62FBBFB65BA7F36011E7A319AF4FBAB98AA19D446940D045BC90E6AA472161BD2F2A01008C095ADE90AD2C812A7C836E6873313B67140CA6A09660D0BDF31F8233B48B5082D19CF83E7CD582D158B3E100E1ACFB7FCA289DBF2219A2BF737BD372022000F9C5FC7ABC59993D3AE21F01C7B689DECDB1C10B0F8A7C317E4B558D2DB31EB9CE5B8477A5C35AED3A877E65D6B7A63CAF60981E2791F0EE7407617FDA282300B7E3C20F0E6E3AC5EFACD677D85F296E64177243D59612BEE6A40743454E33614DCF446E52D4620DD186C9B169E722C9159FC7B719CE55AEED5F27A1B5460E004DB5D22FECD0B8A69EE3349F11FAC4EBC8E750427C597F5E058A41D0C4AF233AC343D8EFB3BAEB50D01485C0B01B488FB90AB02EEEDEFC9C8154FB3885F30D007D57988C9FB869CFEC1109EC1FF6958E0B73555D07195973AA4F6B9940EDC4C21AD596C49E2737A643A8666C53C4E675A1BF9EFFAF7F1F78A64FD46D5AA70900 -smlen = 1754 -sm = BC0CFA84196B1CDFAE21B4FC3D575FE9C9A80027746048224CC2FE6C94256828138E101B520077F5649FE7FE8761F2F6B2D003728676A72301D00E55A93A998CAB12A0C4FE1FDB484F30750148DA0E4C92B07CB4A98CF94961CD2798BA2F01F2F86B0FE6FB0383328056FCDB1172F47731003C33841D8D35D3A9EFE81119D755B506A66A012851C91EEF88AAFCF7BC171AAEBFFF524BF10088FED8CA2853F0332CF0A72C9408ED5C6F09010067F2446E77904EA9DCDF403541E4C98A24007141740612BC302C2AA180C841778E9BD19401968D4082457CE19557035D24F0AB9FD29DD10071D62E4E50BDDC92EB4207F31CB05B431F8D01B7113A74284E740B454517FD0F4F7C590B38000091353911F87EAA35F984E3BF71F9EF09915174366068EE1640531E0FC7B2A1300202A475053782891BE2EC1DB0BBF9DFA446E01D00E77C488960EA06668092AAA586F801AF2860129C08A1A9C7A7BB3120B3E40AFA1A4A09050C8483E7511FABF3285544D4CE3F41401DAB8C17DA547F6777A72519F6EEAAC83016FA0E0FB0B33329DD02AB8EB1F291758074EBB5B7C4C102B75BA422821E6755B37B914D689D84808A89CF88F69A446F489A260BA03CA52A4AA14E8BCF4BFE5134DD2918A88D67329B9BADC6ADA4A3071FD21CFC45235FA0A1B82D91C5877F10AE087464251C8899732AA7FC8F6C0A5BEAF4FA41E64CA97932925A06E218272500249577705804C6DD9F0F61DEE6AAE096BE0AE5E67923137933FE4D61E9A88DFD5B3BD75AEEAF5018A5153985E2837AD1AAD5EED91620D935EB9982DD2364B5413F490BF251FC783503FA146300E6ADAE0682E0597C3839C645DBE855919BB1CB80C3DC6E233909017BB31F5ADAEE05CE442EEF594FC15FEC3A2B4B81ECAAD1340B0677F27009290AB3AB8788556389047F63C2CE9390658E151CA85BAAE45ED2FE12B6667967F6B772EE683AC2E7347C7B0EFA332B3354B5043CB86200F8E4249F68030844D00A86FAA7B79A4129AD676D1E9D58828A1AF4C6BD68C29CC23002E0A0313500BA717B8756D4A18E41E381DF8D7A999A153876DB876CA4A508486A4F331CAC9CB3E7C416C6329713CAB76E1C8B63A8CAD46F8EB1E65116F89A3B4EB8FAA14A73097CA71AEA3220BE7FB7FE64919893930445D962C309E23332E4B3ED8CA768EF0ED46EAAB199827AD628A1BC20CCD9F61BEF67F7FCB017300EBC7493A7CCDAEDBFCA5F91E80B80DECBFD9EAD9BF22FE16B563512C7383D34801C504202D7A0E19821EC8495016362EDAC165904D2BBAC484DE1D4112C3A3E6EA56A78785B7CAF2A44B5BC8BECBC50BF4B521C1D086086FEB009C06ACB8FA0F53E7654FB02AD7898E35E5F3A7DCFC50124BA1F30178C707F4D36E4E7758C4CF82747753CC30A836311794A6A9017F53ABD17A1C9647AB38BA56AAC83C1812DEE8A5A75C5CC958780A3E9C3C1F39729BD365948F7FCD8104CF09660060FBAD2BE9B8D8E5BDD22286EB0BFD4010681AE7928D0FC008E21C8F877D97B5B9C7A06C02530FBC6A9D6FCEDFEDF68A9682177757CDDDFFA6CB9086B8330E61851E2761D84DA37635EA8441E3B23FD165CCEA562B0A3616B30EE5FAE00F76D6801B22F2215D80829E01DB2C0743E3074CF26C96B0EDDF97D79FB9C7FFE9B5CDB891F9E61FEFE7E1CBD28FE25B7858921C8C99C45A84B50A8233037DACC20BEEEBB9B22089DDAF2EBF0698498DA694F75ED2463D09BA2C757A986B8CA556CDF46CBCDF288C078041D497242F66411F47F35A21918855F105F24686076FA21BC1283F17245A7122A848B4BC10D996B2C5161FCE0336B2EC747A4A07FA9851AC5423D1EFC4B524E795B2E4BFFD1C5CD21F5FEC954824DCC53BC3883A7F571A9323DFDD2682C4A4C54E8862F347C9A8897779170B257AD26D90121DDE722A3F214A44CF6C5A5DDB2452A2471EBE7FC8D0EF7F1EDC7920CB42A71E4DB49A0168D51843F47D17BADE50DCB340E5F7B7E5B6A6C3AFE0FB26B5EA172A4011EEE838E5634E521483C6EDBE9994B0658406ED8F4998C7B4E869845CD16CC4368DA3BC1B025A6FFAFBF540133C372D452DD831DCAD39D61CCED0A0AD193FA9886EAC749001E3BEAD5A7962275FC62298A1BD054F4BD97ACAB2BBFDC355C73509D98B6DE5B4CD774BDCAF1398532BB3DB56524CC047ABDE6880C3B282FCE0FB2AD7E4C5F7BC138B48D194E8C8036DF4B9F3949E912AFE5D2734662F27583193D0FBA2B73C1A0D012DB853BBBE4383F6C391F3220E1B5761C337A054FC9FDF09C01864B87324A90C776EFBF5D34A68DEE38EBAACCBB61B4C79A58CC848184F605D43CF9D40BE90C1FBCF6735270132B59A636B16ED28111246270AF32EA2CB7A42A084005AEBB6161002E65B37217361BC269F5ED12F7D50613C82934A6D1D98D1308AC82827B7504F3FD351E0ACA1C62843C9219023FD092692BA4B83BE198EA - -count = 43 -seed = 38FFDE9B60DEDB5BBFAD6C52AA02EF6D49369BF276C99E588D796A4F260E0FF0A65C96C35863BAACFFD9B212EC305E7F -mlen = 1452 -msg = ECA4505D43235F274D902464F4E763312BD11060F908621A063409EB42FAA6BB5E20FACD87B8FF41767C20F69B1F7E05D5F3A957F48DEA57DCC91824FA48DA6DDBDE7E3327A0A8D46A47606EDA01E67CEA1F29BDC5FBA446DE60541DBED6F73D1FC5F49BD77D45285D3D8CA93F6DF25AEEF9324BEDB40E800ACB49794AB05E6D0AEB11A5994FBA36DABB9559CD93CF522174061C116CF31874A18C46689FB8C075079DFAF73EA0EA7FAADD47AD8EF68C06AF9738B41BE771020FEDB79CA3D0165427B58E547105FCF82A12B67579D1D3AAB29968817068732CDBC5A2E9E8D55D17468D03F38D564F5AC6EFE1538E4A680E9E15E35AB54D07B6B58EC9EA7815CCF29F4F880CBF1946F39556BDC2BBC78A5134FA7A086DDC146AD9D503A4CA837E0823BF0728453F6B053788C69EFF8D11ACDF5F07282A75CBD17F2AED58E39D862FF056DF17178625234CA7E03D22AAAFC4C07E3FB08F4297B511B10579934D2761FBB600C9454AC05FFF80CFB93DE3B9E0DDD0AB1E494DE477DA2B5635E48D5BED5CE359E66A3AC845826BE2B4BBFA6D825373BB2A4E93AA417648D1CEA755AA4978784D6D9489F6738B4DA03FAEDC659408D9395C934AF774749A498B1406522351F86838865F53CB0157247484FD37EA59BA72FF3226AFF1EEE353ABD34DDD63FCC89387B947027E04A6F4ECCA1EE5F6BD1CA758AA4F796FE839338164B58D8E5D71E6D5CDEEF6B279EF15A7BAD873B12F7C5B3E2817C37BF00802D2534D425D52D0BD5935BF8658E5BD39B5268CC45D0F27CEE5A57300F497E77AF5268970782030E6928281379CB14BB56D2ACD963D189C078C7A60E98A782F9483ECE7B4871A061277186A01E878087381704BD72C63C32CBF2470A561C22A5DD3A1988B7ED0D274182E1B075AF277920B362D612DC7ED82057EBFE51A3CA5A9A9A45DE015C460BE6A48CF67C820813048A1CEA0FC3D7307F802B4FB7E523E7C8555FA56DCF66237F176D3D973C47F55AF93FC4BC92B98B7DE89829B1471DFF53B649CB03B719DB58DAF824DAA2DE570DF6314DCAF5B705557F9D783559277A754F3CD5B783D5A577EBE4A065D320284B01F71540F1986BCD443CF4FD480DBE06EF7710387CB5185DEACB5C2A612BCA275950B8988F247C4B773D8983D87F47D60F5BF80E6E7BAEDEB14B5FFBC46893A81C63F99F511D3E24FA8F7B1BA66A7DB0C1D9ACC6B5010AD725BDC2282D8A24018C975C8B12ED3326F48194D4FF93EBF051204CD224EA39F27D63FE07CFD0162358B412DBFD4715AD049EE5A31638D3111AF2DB7952F3A973646612712A607EA35826249D14CBDE4380D8BC986067B1CC27503449FB128767986A406585C3D40DACA75C27BD36117D2487BAE82CF639ED1FA016ADD279D109B8CDAE59EB31E1F006CB7AF000A267E8582E55375CF6F06D1A47BE9BFA21C8428045B9DF96808AD74D054820A4D0873257EB318A3DC9B6D9585D973E26D435345B4D699A952C3092EEDDD975FB59474212080D03EC489C695F19CBA4D1CAB1AE8D2E2C730B06E657D33722D24222FF7B613B6E8608E8A6003E11C80239FF431B5D8FA52B84B867A581798833590524C7B84EAF6CDA9CA94C5AB8EF55A1262EEC5C37467807C89FF7D075606A3902E7247E9C6646839C18493584D33DB65D6DFC0F23E68C9D13FD57FAF4836C28926693DC3EE372DE27A9D3E4AB4229425EF48CC410F1792A51C9F6FA5316A1D9A7C99979884EF350B4882F6045921CA88D4E44B435C69C1AAC11660971C2A3F6480C79E6E146C0B5CD2371BF5E7486AD7D0BE88D62A2AE8F0D73C17CBAC86FF6BDA55A880B182A5237498E9CB343A9CD82D7784B72473D222E688D13CB81B2908BBA854B9624A11DBE8CEE9C3825C1BFBA476B4D23D0B0C325F1C498A65A3589EA8E8DF8DD9030B279EDE30443CF80367CEEA4A122DC8329E5AD42491CF57EF47AE2B15F9C54120966B95ACD727A4A2B686B00626BC808F43D82D20DEEBCA79B074A7BFF38D2531AB2F726AC7087236EB3FB4BEC8A2D4207DC84C -pk = 00DEDB0011FF6A090E27C88AA863BAD2BB5C805C21CC8C7F162CD5E81FA9DD6346D37B11464DE1AC425360C9989A64B5999E865F29762ACEF17AE1860F2E0B00E5A78A1418E64B228843AA16521156D7D8095AD6DFCEC1C03F75D6F62938901EB36A4F79A916A93FBFD80B25235C6FD3A71996589310B906595F3FE74B451000 -sk = 00DEDB0011FF6A090E27C88AA863BAD2BB5C805C21CC8C7F162CD5E81FA9DD6346D37B11464DE1AC425360C9989A64B5999E865F29762ACEF17AE1860F2E0B00E5A78A1418E64B228843AA16521156D7D8095AD6DFCEC1C03F75D6F62938901EB36A4F79A916A93FBFD80B25235C6FD3A71996589310B906595F3FE74B45100002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F3DAE8EE3DF5E216BFFD9F26F63D83DE179C04FD74FB72ADDFAF55AAFBBCA4B7C3A491226CB933A6F17D0354FB2B487F74D0FDEEEC212889321E0275406F575C6E6F39D6701F49DCA9A5D8B18F62C73F35569C48538BD00B8103000000000000004E37384BD05975301B1AB8795398C3EFB6B6660299E479C08E0393F90FDD7D9C7E1898557FCADEBF86EE4E96086E78247D16739C48DFE61D099CDDF616F084325725BA99E8E1820886496D927791E697CC4F5D831E1F674927F9FFFFFFFFFFFFFF72DD5DA735087984AB99507FD0A18F5FEDAAB736889060C920A244102F4A35FEC4C14FF091D97A334280A68966AFFE4ECF6C5C1B5CA42E759318FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73A6D7941897A70D48D8CC00B3DA6ACEB29E24107C9D028C5E49A97CA1FB981A188F9ED6B39D6E50003F7AF103BF142CA761F9DD9C46209DB678040000000000000000000000000000000000000000000000000000000000000000000000000000D05AEA48033BED0A7DCAA83185E4E43A582E9D7A49528BF374CAD0D4BC018C494FAF3B413EB75B3CA183B6ADBBFB21CEA71C0D5F3C97F757AC3812453B561C00DAD746A0EA3E3785DFE4645307835FE3B302F080BDBC9CEDBF59EAC5F44BE48058329C098EBC0E08859ADC171473A26B23931C2462AE99BCEB86B136EF4201003BBFE5CC21124F31C63CD7D94B0C35C8228D297B7F73DFF5B0C6DDF801BDBAB7B1F0E1CEE44465A9F31F4C68C0163C36FF86ABECF0C5ED67A5AA4BB89DC021001DA8672F1D7A53481FBA4600FBFA104BC6A386E798A369608E45A14656EF71902A8AEE096FB2E954D127991E7745AD3EF56451A9DB9BF571F520E625FEC306004265061FF196308BD404C34D56BB4EA94716630D9C0B3F1772EACE0E1DEAD578067268546DE3673200D3E11097BF14192BAAA0FA282570A4C4F3D03B9D5F1E00971432176DB53F145F55D68671F4771E81ADFEF61E1B9A88CE880EA8C29C60FC3B2260DC54B6010AC524A3D4CA04FB464F537351B95EF6CE35C21D9550530F006474052DD831FE649CE144138BC66EA9BDAB285570627969ACC519720DFC0C97D7294AF52F2B515BBC31195EEFB18A3987E22BA0FDE9602674A9A118CDDB0900C8565DF1DCA8BCFDFEB323D0BAA9525A504E655634DE53109E5729FCD893BC2643625B78D643BA145342CC360F2ED343E4C4DC252BD542B9EFF485F71C0D1100FB3C740055BA85BD29FDBC3A2662C534764E7A5DEA920AF57C54722D6F136A4C8EF0BA2ADE41033988AE943E18F6323C5A1D529B2DCF453F0A575916E2391D0021A23D2313139338415B86FC9FB50BC0451838B4FD39C067C622C39304C74A9D7D736DF4802702D98E9D6F2E57625E4812735EF6BE1CE3BC46730910C8FD1D000D4C8DC132E78FFFBDB00CA85C520E44455BEA01757AE309BD9274354C08AFB1C024504FF1BA247AF1B18714FB177861E7C13ABBF3B66C7FE9581DF46F2C240090169EB448F35F764415EFC60D27705B6D44C56BA03077209531C5231F53068806BBABC1D369079F6555989E25273CEB85D532857B8C9807EDBF7A2C71660300F752A095C77A07E6000652C6CC89E2C59691B868D338D80C777AC633699B738F7AADEBC60C2921FE3FBFFDD046A4D6AF3DB75E24145BB3ACF0F435EF944E0D00EF5158705EFE8E1DE220F77B3FB2479C0F0ABF48904AF7E0586CAAC134CE70A13F2649C630798DBDADEF4C12FF612B076E17F6E71EBD8F9087ED60746B2E2400 -smlen = 1787 -sm = 5E1A7BE10E33C9ABF3500D6FF4F9229A744D018BE937A67929E5715E55309DBEEFDDB2A76000E87DFFE8C091F0FA91A9FC35D7DEA0192C7601BE0F543FF456E9ECA19625AC643130504E7D00087F43DBB607C72900B252A141FFA3ABB73E00BC01DF187D7791B49D78F6A8BBB12A33308300C648034AC6D913216DD17AA5D81C3C058630000D60251D236A37437A8E541B43E93AAB5D32019B3A5879F82E5A0162C0EB9C2238E6D1617101CA778C4098B2BFEA5C6B3B79CE039A844822003FB2662E35B97120683C769CE3FCE2AB2F720168B2C609EDD126F2CA6BFFD5ABB4E7DA029B00E0253838B16A8F7630DA7C9B834002E94B4001A19DC94B867849B1115470C9B4D4C87AD94600012F16083DC7665474F67B82E2675B31804C7D3758D4FD8C51D5FAA2CCAD7945FA060062947C506DCA3C049EE53701349462D4C760000E2DF6DEC7DFAEBA05F45909ED3F03ECA4505D43235F274D902464F4E763312BD11060F908621A063409EB42FAA6BB5E20FACD87B8FF41767C20F69B1F7E05D5F3A957F48DEA57DCC91824FA48DA6DDBDE7E3327A0A8D46A47606EDA01E67CEA1F29BDC5FBA446DE60541DBED6F73D1FC5F49BD77D45285D3D8CA93F6DF25AEEF9324BEDB40E800ACB49794AB05E6D0AEB11A5994FBA36DABB9559CD93CF522174061C116CF31874A18C46689FB8C075079DFAF73EA0EA7FAADD47AD8EF68C06AF9738B41BE771020FEDB79CA3D0165427B58E547105FCF82A12B67579D1D3AAB29968817068732CDBC5A2E9E8D55D17468D03F38D564F5AC6EFE1538E4A680E9E15E35AB54D07B6B58EC9EA7815CCF29F4F880CBF1946F39556BDC2BBC78A5134FA7A086DDC146AD9D503A4CA837E0823BF0728453F6B053788C69EFF8D11ACDF5F07282A75CBD17F2AED58E39D862FF056DF17178625234CA7E03D22AAAFC4C07E3FB08F4297B511B10579934D2761FBB600C9454AC05FFF80CFB93DE3B9E0DDD0AB1E494DE477DA2B5635E48D5BED5CE359E66A3AC845826BE2B4BBFA6D825373BB2A4E93AA417648D1CEA755AA4978784D6D9489F6738B4DA03FAEDC659408D9395C934AF774749A498B1406522351F86838865F53CB0157247484FD37EA59BA72FF3226AFF1EEE353ABD34DDD63FCC89387B947027E04A6F4ECCA1EE5F6BD1CA758AA4F796FE839338164B58D8E5D71E6D5CDEEF6B279EF15A7BAD873B12F7C5B3E2817C37BF00802D2534D425D52D0BD5935BF8658E5BD39B5268CC45D0F27CEE5A57300F497E77AF5268970782030E6928281379CB14BB56D2ACD963D189C078C7A60E98A782F9483ECE7B4871A061277186A01E878087381704BD72C63C32CBF2470A561C22A5DD3A1988B7ED0D274182E1B075AF277920B362D612DC7ED82057EBFE51A3CA5A9A9A45DE015C460BE6A48CF67C820813048A1CEA0FC3D7307F802B4FB7E523E7C8555FA56DCF66237F176D3D973C47F55AF93FC4BC92B98B7DE89829B1471DFF53B649CB03B719DB58DAF824DAA2DE570DF6314DCAF5B705557F9D783559277A754F3CD5B783D5A577EBE4A065D320284B01F71540F1986BCD443CF4FD480DBE06EF7710387CB5185DEACB5C2A612BCA275950B8988F247C4B773D8983D87F47D60F5BF80E6E7BAEDEB14B5FFBC46893A81C63F99F511D3E24FA8F7B1BA66A7DB0C1D9ACC6B5010AD725BDC2282D8A24018C975C8B12ED3326F48194D4FF93EBF051204CD224EA39F27D63FE07CFD0162358B412DBFD4715AD049EE5A31638D3111AF2DB7952F3A973646612712A607EA35826249D14CBDE4380D8BC986067B1CC27503449FB128767986A406585C3D40DACA75C27BD36117D2487BAE82CF639ED1FA016ADD279D109B8CDAE59EB31E1F006CB7AF000A267E8582E55375CF6F06D1A47BE9BFA21C8428045B9DF96808AD74D054820A4D0873257EB318A3DC9B6D9585D973E26D435345B4D699A952C3092EEDDD975FB59474212080D03EC489C695F19CBA4D1CAB1AE8D2E2C730B06E657D33722D24222FF7B613B6E8608E8A6003E11C80239FF431B5D8FA52B84B867A581798833590524C7B84EAF6CDA9CA94C5AB8EF55A1262EEC5C37467807C89FF7D075606A3902E7247E9C6646839C18493584D33DB65D6DFC0F23E68C9D13FD57FAF4836C28926693DC3EE372DE27A9D3E4AB4229425EF48CC410F1792A51C9F6FA5316A1D9A7C99979884EF350B4882F6045921CA88D4E44B435C69C1AAC11660971C2A3F6480C79E6E146C0B5CD2371BF5E7486AD7D0BE88D62A2AE8F0D73C17CBAC86FF6BDA55A880B182A5237498E9CB343A9CD82D7784B72473D222E688D13CB81B2908BBA854B9624A11DBE8CEE9C3825C1BFBA476B4D23D0B0C325F1C498A65A3589EA8E8DF8DD9030B279EDE30443CF80367CEEA4A122DC8329E5AD42491CF57EF47AE2B15F9C54120966B95ACD727A4A2B686B00626BC808F43D82D20DEEBCA79B074A7BFF38D2531AB2F726AC7087236EB3FB4BEC8A2D4207DC84C - -count = 44 -seed = ACC98B16DCC9A50EF57F332D66255CA56C2BB679CAE705B4297F1418DA845861448DA6CC5CC458DE6C6E96128EEB2898 -mlen = 1485 -msg = 96E2865A0E602EA4E3C5657A7F761A6F771007989FF885261F5638C14C1BF80AADE34CB956D2B5FA1CE38FDE831423201D3692E8E6F40E68A68C085DBE3C4CD8E35394F74072F44DE98A74E42C9176A86AC06BED8C0CA937DB4C3BF92371106B7A68EA8FDE1D1E082CCF522A397401AD0F8DA6C82BF76EAB8AFE101C7FF023A0FCF015B40ADA0073363E7CB25260C18662D651222A4CCF1B290EE6F7B111B9A963211D67D7674B499449F760352FEEB9FB7265A5F2F7F20C0174802C7F48226D92620D3E009E85B104230C21BA2FB0012DAC4BDF9FD184E09CB3E593EB1F3EEB418A8BF3173E6CB91FD8080C7E80DBE6730833A4A9F22C52716731C7CEA4F70CDE0F81D2D9AAFB6B60820598A7F6AA1B963B7686528E6E7885AE085C3D26C4ACBF9FC15080D972CA841175B343E59FED79AE3CB4DBB4F0D7D463BD3E0C4B2090139145B8D7DB5DB10ABFA51DC909C5CF7809030D72A5090CDC765EECADE2B365F719127548CA601AE0D21E402E18050ACAED30EE13CDDADACC9373A87A218787B585319A7E66FBB13851F7AD0D2BBC1EFE6EFE4F7ED248D844F58B6A5A21FA9295E0044982AF6286DE296550F72B5E416373F1DAC006687DED1E7D40961E5177C207579F25E77BE808A6BA33DCE8A2A6F88E97AE98ECFBEE5296D4A170E3574D9BA592A384CB0545BCFC32B3831C0B736AB77440722299F192DCAD519523995F71F2983BA87AAD2261E6E01C19DCCAE00F8D6914501D1AC3D4AFF0C12FA125ECDCA34DCDD8407F0045F8E8BE0763E19EB007ED4DAE36E30AFB07F8DAA7431B72F4A0A8017B3FDE27123AC3E8EE575F8BE310F68F81B696DB1FE63CCB8D32B899B209B2205956D209BD6E48166BBB4372A607E83C47698DB5AC8F9B40D05F38EFC4A4A1309D999D5CE1E1A5828D56EDA4666995897C8E6362D0B5054F04BCCF79D03852D1003C80CCD55E9F4578D8BB2C8E220A4D7A4E2190024C85C718654CCF174AC96C1BC50EA49F961EE7697C88E6BB718679F1D1F1118376B31A4B8C0471F6D7AEFC5AB426515D1B2CF0EAE66246B3C4132A63C63D7E33EB9DF8D8807215D58F46EE832AD3EC893D74E00C73510B9625F62D4EB5B500EECDBC7D088D3D318077A4A0F7D64ADB13220232C08DA75D23CA7B20CB109C972B7C159863991C32508339558B9383DDFE7E7DDA740E5BED0EBD14ED300C634DB01F359F81A7133669183EB187C17A2C8AB855BFCE73E34A1F59ADB0EC39EC0C7573AD3620A819333EE79D5E09CB8449F91923EF4C5E21549EB7F56075C014E1C3AD2805E682F07BA8AA265745CB600A460069678745FB9638F6709D62D2DAD8DEFDD5A4D0C2AE7401292BD1DA5F40D4CF5D59A403932FFB677237AD74691CAE29FA31B955172EFC5E83C225F2DC0430AB0C909A97BFB468AE182ECF91E9026DE819F3440FBE69B9DE26F812FF3F3CE8037F124AB368B1153C1CC127D140F754C525D4799E1A19D93B90460E6518F0B6936DC6310B7E9E6534B595E00225978214EE5AEB12A6F45B5C73FE86771818843FF7A6B88379C37165D9DAD48AFFD6FBABD11B1FB90AA5A78918B317C5F9B2CED6B9647F130DA9F91E1B1CEB84F6E1618248F06D654E159F71033072F1517064BD96A5C138402771ABE7F39F53A798C2423B748EB7F310485D6376722E204FA33B9740E7FA68364289A677C5C78A19A7707D2549BF9329334478C64351FEA1634388ACD4BE57E4ABE9374A0E999B770CD81B1BF4A8FF300C297B116CEDA1A4A1C1BD5A2275581A0589A46142139FC596A1406D16293076527CDF9AEA2D0919F9678423B7D95B153DD1D9D62B72A12F6491A36604D19E7BB83C476D232769425557D3480623D40B7AC27C0F67D4ED5CA4D487BE915A68352DCB03A3929A4BB795248EBE2FBE0612833D9305A0A31D195718BAC193FC59B880042A7F61358104A919C7E7C210F02A856B8B1057DD8527FD4AE1EA81F9E1BF7C614ED8A312C95154873F86632CBD60C65176F13CAC695BB4C23675331058397D6E96E4F9DEEB859E3937553D94BEDE3C2B9A5EBF00964A49AB294BCCEE09E5A97381D2375941AA775A47F726E9 -pk = 1F63D654B926E4EA1889E2FFFC19A3150D460039C321A22FDFE970678101F6027BCACAAF6DEE6FBAB4DB80C2EB340EB7B7B42FAF69C3000FC1D026267C3007005457C677F025B9FF6B86EFD7C79085915C7A04AB660BCC758D9A396EB11963CC644CBB82AA7925DE0675CC76FA5A848DC535F7D9F215C1A204403E709ABA1E00 -sk = 1F63D654B926E4EA1889E2FFFC19A3150D460039C321A22FDFE970678101F6027BCACAAF6DEE6FBAB4DB80C2EB340EB7B7B42FAF69C3000FC1D026267C3007005457C677F025B9FF6B86EFD7C79085915C7A04AB660BCC758D9A396EB11963CC644CBB82AA7925DE0675CC76FA5A848DC535F7D9F215C1A204403E709ABA1E0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D5034CE3092C5283B1D5859B84CC9B26115B2F01E20DCEC48BC66EC713536357CC8C8A378BFC0E737CFE58D4842884696AABF16764C3DD1DBCD451D28625E646A5D5269AC4C1191EC3DEC201DDA0ADF40AD487AFC80CE819360200000000000000ACFC0C45FFF776ABD02D34BBEC2DDE5B77DFA52F4E885B45FBB6F53580D161C5F65ACECC8140D1D32B7C775415120C4672C51386D895F9A4EEF6541F7E609B4D37F8010E4A669A29A889AD6899DE18BAD27670130C1BC4D8F2FBFFFFFFFFFFFFFFA020786D2AC667AC12C2C326C7B91BFA63CFF370543CE0778179773191503B4B73182AEDBE05BF7CEA2F49DA276E1902E769BFAB660E1925CF80FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD9084E7451C3C331FA44F03D4796904E88670ADD1A7B0A572EC68BE0B52DA1A6614CED73742184F48ECCCB5E1301C3424F720DD616294A2320C02000000000000000000000000000000000000000000000000000000000000000000000000000088DA364B80D714ADD1B82DA6F07946DB1CC507CCD2E7BFFA7889D9687696C58B6CC2D8390E837CCB6EBAE2E277D8F08332A2F2E3EEEC4E13C1089BFF02990200E43BB1F1199C682F5ABF05D0525DCDC745827D3D97EFA7E157A1689E27720F9929A7165B64AF58F5E57D4F02ECE09498B2311F5F6035DD5C00B12BD03B070A002D29F1AE1E534128BABF928CF52AF06163B851FB180516F9E79424A6598E67C98F198282406DA86A21C7C3BD7E75751953CF35A7DCFDDF2EF8CB2D07E230100029836E48C07F313B54F6E045BC9DD284BBFC6AA4E25E6313E693719CF00F0E61B85525BB136EC70753F6A48BE1D7C485A292F6A3624DA0BA22734E1BFD7E1B00D3582A0254EDA3E73EE13B96A078CD9BBFDDA9A66BD3D81C2365EF2D3854AFDA7961F927D97375C7812E87FBCE4FEBEF3E3F18250D68A0FE3B7819DD86C61600E87C8D0525053317F00DC66CD3BDCF37ADE98362DD010E98F22C4DEDC6BA00D1ADD305329480D6FAB1277BAE8CA838D3D4D7AF27A174A4535079DEFF38DE1600651AFC2F9BB91A34C370A4DC8893A694B60882DB9912E277FDF96DB54483C20358594656E02E55890A646B4D2013192C90169652D0D8589C5014BADD54471D00A0A4DA2B77CB2876F5B6F97761FBCB558892FD4F0592BF9C378E132D84E452E8922BB4C5A637EE200C0D2BBC2176C0ACB35699190BC86E7D0BC46910E468070054FBA5E96B8D22262FF419B5779F20E85D878696ED37278EA7BAA2967601F723422697F47B3528466158C23509076C536EA47F34FE7477F6A4E0C037D7FB0F007657976DBC3F6CA0B4381CD1084472603729BFACCA065C4C5602CA2B09F3C0A47EE1FF441D4AFB1BA5267A85DA0DE62DD412F6E41D52AC700F054A0B7E3B0200CF9DECDD846F8B9D6C87EADA1CDDE248AE59C2CF6A3F106385C94446CE573FC1853C9D54671DCBDA85E53A3B5792F887EF99BC46948579AB6EAD9C7E12E30200F8F5A7BC03519DEAFA6D79A6F980239C32CDE968913D46A99FFA4853FDB945B5223354A347425EF532C7DA09A49CF1AAE573A0FF0B109DB2006665C175341D00E988BCA82C3B63987C61B6BE65534C941F0B0F2EE7BD85B806B756439862665F835DA80BB997BC6FBE4380E34B60A4A4F12EAE1D5D0C3FA110CAD68637862000A1CBB9B815E6F432199D93A2E0422817D5BB3D19E02BB9CA5EA9C4315ACB5A2FE2456521B5F3B78C1B8098ECBECF959CCF789F031B93F0DD92682A8516971700 -smlen = 1820 -sm = 05045297EEDD9F03B860EAD91AA18F1AB5A00107F4D61C8D9CBFF396CB28647ED7E6F8F0D3001CA16D445F4194CDED4919E23D232990080D007678D79C95A4B1D635D300DF74A9A4BCCD79008D22DA30F3AC582DB31EEBA50B938841064201E05245BBE0E9CB3BBB2112E39766C073B1AF002842DC4E1AC6EAE2C61B3721DE92C7EBEA7F01B488B9F43F36FA698ECA889B7005490EC39D0110F5A6F29C87DF88013393340081C71146E50159DF305905213EE6FB5EC3C1CD0EDFBE24ED01505BA4C3C28C28F673C67353BEB5E30CE94700DA1AEBA8874912E125270E12EAD1D93D647701FA0EF134053E431E4C75137F0CF67FBC9A000188B3E738716EDF5FC964A2C1F20B7398282E01019395C8B39B69BA2E5D3652235DC55C6489D01F2A946D6D098C72765CF44B57A307038E8D74982B276A32442A6FF3C24BDC8B8852010525BAA5DA7C8569F63053FE24A50396E2865A0E602EA4E3C5657A7F761A6F771007989FF885261F5638C14C1BF80AADE34CB956D2B5FA1CE38FDE831423201D3692E8E6F40E68A68C085DBE3C4CD8E35394F74072F44DE98A74E42C9176A86AC06BED8C0CA937DB4C3BF92371106B7A68EA8FDE1D1E082CCF522A397401AD0F8DA6C82BF76EAB8AFE101C7FF023A0FCF015B40ADA0073363E7CB25260C18662D651222A4CCF1B290EE6F7B111B9A963211D67D7674B499449F760352FEEB9FB7265A5F2F7F20C0174802C7F48226D92620D3E009E85B104230C21BA2FB0012DAC4BDF9FD184E09CB3E593EB1F3EEB418A8BF3173E6CB91FD8080C7E80DBE6730833A4A9F22C52716731C7CEA4F70CDE0F81D2D9AAFB6B60820598A7F6AA1B963B7686528E6E7885AE085C3D26C4ACBF9FC15080D972CA841175B343E59FED79AE3CB4DBB4F0D7D463BD3E0C4B2090139145B8D7DB5DB10ABFA51DC909C5CF7809030D72A5090CDC765EECADE2B365F719127548CA601AE0D21E402E18050ACAED30EE13CDDADACC9373A87A218787B585319A7E66FBB13851F7AD0D2BBC1EFE6EFE4F7ED248D844F58B6A5A21FA9295E0044982AF6286DE296550F72B5E416373F1DAC006687DED1E7D40961E5177C207579F25E77BE808A6BA33DCE8A2A6F88E97AE98ECFBEE5296D4A170E3574D9BA592A384CB0545BCFC32B3831C0B736AB77440722299F192DCAD519523995F71F2983BA87AAD2261E6E01C19DCCAE00F8D6914501D1AC3D4AFF0C12FA125ECDCA34DCDD8407F0045F8E8BE0763E19EB007ED4DAE36E30AFB07F8DAA7431B72F4A0A8017B3FDE27123AC3E8EE575F8BE310F68F81B696DB1FE63CCB8D32B899B209B2205956D209BD6E48166BBB4372A607E83C47698DB5AC8F9B40D05F38EFC4A4A1309D999D5CE1E1A5828D56EDA4666995897C8E6362D0B5054F04BCCF79D03852D1003C80CCD55E9F4578D8BB2C8E220A4D7A4E2190024C85C718654CCF174AC96C1BC50EA49F961EE7697C88E6BB718679F1D1F1118376B31A4B8C0471F6D7AEFC5AB426515D1B2CF0EAE66246B3C4132A63C63D7E33EB9DF8D8807215D58F46EE832AD3EC893D74E00C73510B9625F62D4EB5B500EECDBC7D088D3D318077A4A0F7D64ADB13220232C08DA75D23CA7B20CB109C972B7C159863991C32508339558B9383DDFE7E7DDA740E5BED0EBD14ED300C634DB01F359F81A7133669183EB187C17A2C8AB855BFCE73E34A1F59ADB0EC39EC0C7573AD3620A819333EE79D5E09CB8449F91923EF4C5E21549EB7F56075C014E1C3AD2805E682F07BA8AA265745CB600A460069678745FB9638F6709D62D2DAD8DEFDD5A4D0C2AE7401292BD1DA5F40D4CF5D59A403932FFB677237AD74691CAE29FA31B955172EFC5E83C225F2DC0430AB0C909A97BFB468AE182ECF91E9026DE819F3440FBE69B9DE26F812FF3F3CE8037F124AB368B1153C1CC127D140F754C525D4799E1A19D93B90460E6518F0B6936DC6310B7E9E6534B595E00225978214EE5AEB12A6F45B5C73FE86771818843FF7A6B88379C37165D9DAD48AFFD6FBABD11B1FB90AA5A78918B317C5F9B2CED6B9647F130DA9F91E1B1CEB84F6E1618248F06D654E159F71033072F1517064BD96A5C138402771ABE7F39F53A798C2423B748EB7F310485D6376722E204FA33B9740E7FA68364289A677C5C78A19A7707D2549BF9329334478C64351FEA1634388ACD4BE57E4ABE9374A0E999B770CD81B1BF4A8FF300C297B116CEDA1A4A1C1BD5A2275581A0589A46142139FC596A1406D16293076527CDF9AEA2D0919F9678423B7D95B153DD1D9D62B72A12F6491A36604D19E7BB83C476D232769425557D3480623D40B7AC27C0F67D4ED5CA4D487BE915A68352DCB03A3929A4BB795248EBE2FBE0612833D9305A0A31D195718BAC193FC59B880042A7F61358104A919C7E7C210F02A856B8B1057DD8527FD4AE1EA81F9E1BF7C614ED8A312C95154873F86632CBD60C65176F13CAC695BB4C23675331058397D6E96E4F9DEEB859E3937553D94BEDE3C2B9A5EBF00964A49AB294BCCEE09E5A97381D2375941AA775A47F726E9 - -count = 45 -seed = 8BEA4E384E73C7E0B47381B3063334291A0F06D28DB61B5BF65B01D0A747722E0AA62B81AD46C00C8A5C31494E513836 -mlen = 1518 -msg = 047E2D484D798B3829CA6037D6C1588A2349DE09C5DDFBEC987652CFDA01454ED791DBFFA3D9DA13A35230ADBE1B39B042E3C70589658A03F75447C1CF3970DC10FE5A4A9E980F2A33B642B42E5E66E9AC4E7A56888FCD72913A79489B5B163BD37B8C3C8D242FFEB37D0C1ECE21034BE9E3685798C2EBC6B809DEFC02C6F0C2A3AD70EC0BAD12D57ADD63EC3584CA98E680267FA514B34DE4147C9D901B59914D49CE9E0F885855ED0CE7973F3307B675408F90B51C6A4D38A414D970EEC989CC7900D7723E19ACC4EF743F6D39EB1B563B8C13D42C0056B6C49732854925B606467F7BC662D17B924FC65E9C3CDC2AE73FF73040011A152B05ED7F96B2FF4CC39A22484AF72812EF02B08EF4DCB64C8936E74549AFDD5D876027FE2B431E61E52E8793888473F4C1E5C1BED2C4AEF8E5E300A735B302474FC6F54869984F1A62DAE29C7C9A0CCDECAA55FE137BA14B5C5C121E0C5EB33B035E01F3415529E0826B27498D7A71B0C086BACD140C02A5948AA54799D0DD0FFD384C7E68578247FA28D205B18ADAC94F7D3C8ACB7DAF71AEE347B577D97EE8E7E865CF4FC1C16640AD1E9D0192AA13AE81A71118408E145B6121ABB75B4BFFD1D403057D4AD5CC730452475A7F067690BB81E81E17BA8DBC31059969B20D387BA59CA8CE499E59A65C8583F29CD539F4F75DDCC68C7BBBC43C849802D8347143E2FE78C1AB6D7AB6BA9917301C88386B294AAC995C24AD680A8C3BDD7AEBEF21E84F5A1909A2D83A8DFE46A75F4B2B47614CD39BF3CA3460DE9BB5C37EB7349A17AB32214D031CE927806FA394470F407673B0CDC3D9A7E3749F09CA895D464A4269682CE6DDCB8FA0EC2F05372C73DC3D06FA6F58090EFBBC6D619A7A565D4EFE441AD7E018A7F5E1384B88EB4506FC54E0AB0A8B9EE3641760FFC08F6BDA78C12396473D1243BAAF6AE10316213115441C0B65C7E475B4E1578D066A47D9C6E92FA32D0F2C365FD15F5A2E88A81691F039DC642ECEDB6652D08ACBE64625B46083CE758FA96C142EB34477E065AEA04A45FF4FCC3E3D146ACD7041F5F7E4C6B26C8205BE7B66DB46DA55556CE02B48AF55A4710BB28B8CE102CB15C1A4AF59D9A17A2DDA6E2D1E96987F6AA9F4216D8D5E5CBFF7E2CB775E83A776063A4AAF937BF0EC84149EC1A7EE21F735D21625E85831B80DC11EBF04F30B13E3A7E4D4784C5F8C61C679E0B6863958F42ED31DEAFFB4C272A3731C1407445CA7673D225EB6509469DC6C1F0AF43EB00F18B3A210AA57D51169F2A9FC251BB338ED4E9DDB19282DCE871211D26482E13A8D533DEE00D36FF5CEA98DEA72D9F0B32DC398A3D5537A3373058FAAA3926C127A1EC739FAF3D57CC1A05D578074A3A72C3F2B1692C2BA1F1FFED943E7BFCBF1E664C4F52F7BF8D86174CA8910C290C06804A7748DB21008AC43E653D7FD7E0C982EDA9356F68DDEC26473956DFF281F7B767010C57F4AD09A05063A6B3CE078DD32F3DE1F40526C06A2D60E36E2C70502D5BEBFD2F3BFCACF8720CDE1657B9892406BAA3DF01E59313EB655B6A545331EBA01BCDB9C99E4AD7FEF7438AE8715FBE589A2F99CB9CA34B9610B3CE5BE38FCF979240698174348417420AAB069B8AD5F646F82958A136DC9F2F81E601056BB4AB5E10F4EBC4A00E18924C51D0FD104078471C6805C49D92C78C832EC3F10D8966E19ADD3D3B4516E12DAF4F63FE6BBD228062DB743D1F867800854F7BB7FFC2CAA0D01A0BB683E368673A8E664BBAA17A8C0C04BCFF05246F9C4F3020510A992EF26FD0933BBFDE9D042862DFFD33A6465F590A2287D8154777A89724FC3DF9F2F1B1ED8765E7C7B761CA4781006822065703ADE07A6E874E70928E1ABA29EE490690D24F6E73D96B85FB53ABFD1C1FDE439279E08FA232043B2344B267CFE5901C60E7CA14B0C85EDCFA2AB90F341821D2B4E25FE23129F2432DB932F23B5957706A433B308FB918D1C8D81EEB399BABE95E7229AD41F30460CF28671A4508B0BD1C61F48CDC23587BB9BDC6F565E76C86547CB71396661BEC8C7FC2223751F765C91C45C674C36B49AEDEF3DF2537F888904B507EDCD89155D40CB81DDA74376BC9CDCAFF8A368F1086C99EDE25526BC53F95F4017 -pk = 7EC78915374C5B370160465CB20A0EA936BD8DF6B6F26DBE5C24498CD0E196B2EFA9F9F524B7CF4B76FC4F59A07CBD1B1A829B991A45BA08EC16246B9F602100254FBD968AF90CB78F29327A938F7C780080098CCB5CD5F2FDA79D8D05C4ECC26B341FF20B47CB29AF45080719A60D1C7908F505046946015636A32B536F1C00 -sk = 7EC78915374C5B370160465CB20A0EA936BD8DF6B6F26DBE5C24498CD0E196B2EFA9F9F524B7CF4B76FC4F59A07CBD1B1A829B991A45BA08EC16246B9F602100254FBD968AF90CB78F29327A938F7C780080098CCB5CD5F2FDA79D8D05C4ECC26B341FF20B47CB29AF45080719A60D1C7908F505046946015636A32B536F1C00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007F75515816F19AD676CA0F2D81E096BD1FE75E2920618C310E01195A0CBA3FB320F4F9CF27B9FD3DF9280B336AA9413ECC7D16CFD27FB76BE7EE8F38D9E88266154DC85A223B12ED35BF571A2B4CB5E533E9B443B30FA854630000000000000000365E3CAD44A68F821A1D0D361CADF8CD7E51ACB48F88C87A603C8CB11CD24CF3B28B875DDCB5E9DF3E7239E1D7698865A24643A382F4E3E07137ABF4CB0B0710AAE3FED9D08951DAF60A29E4270F0C081EA6824B4DEFE0E402FFFFFFFFFFFFFFFF9685A8E52AD8B756707E98669ADB1C1DA817EDC0FFB56026D00E86725EFCC1F25868F2028F1F39E74D093DCAF69861679AA415B293F8F6949C2FFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41627E2A80E5F0C929788EE23C6849E1BFFDC97139055268BDE1A6144F94BD523D2D3D0A5AB84CAC6EEE2E85C805966247BB63B2FC1738ACC125040000000000000000000000000000000000000000000000000000000000000000000000000000D9BF064094D67F13999836953D43FFDE9371AAA0D7FD27B76B02FCE32BA7CC890FC60BE0C9BDBEA381EDF9B4AB90FED057949EAC7E455B4ED5E269AE02CC1200D57D6274DEC4B1BAA85478924BDB8DBBD8EE542EC52327E598700EC67472929FBB62F9AD1C0D1A3F16644DAA6674D69A526913383B5B58C9634C7867CF831D009BB675F1328AAF1BB79A4C24A179508EF80E7BAFEB06EFCF175003A1CD7214290EC3C7CBB7A6C86266C9451A213BCF69D6649B84CC2C4E360F6CFC6DA1E41E00AECBE4D095C0E016F87AD916143686669C669F2FD5424A4EDE21F5A1D3A5E649D88BE83E1BF5623C3A3C6BC0A64512359A9C76C48FE00D54223DD7E188C32100FE70BBF8E9C3E04F510D9E16844649DFE31E7CE3E5F71DD4221039B239F0E29D2774098964DAEF942CC3FB76840FCACB7789692866A9C7216BA8A15AB982120043B54215A968BA83F87AEF86AC667F6A12B79C85FCD74B380CE293E582E1B47F712A282E07A56BFA36098AC55FCA4EAA8D285DE9C02CE3D60E850C1BEA6B11009EFEEEBA9DE7EF1FDC438F3C60DBECC0910B182A1B8473D63C4421AC4E40707BB7E5BAF14B260DF3A8164B11F27B4B520C006079645B019259B187E36462020051607DD9944DBDF95DFD3FFE96141FDDDBAC07D502927E924944F3C041FD99646B30A87054E83A941DCC234753F2DF17CB2FD69C08E5644E4C08802DD2771A0033815EF769414D488762CE04C14AA46E65BDC1B12F14E80D638DF54E8F70F08340759DC6019069113C5BF6013919B634F8E07380E1AB71524CC56AAEEEDC070079237191876D3991EF8D20F21B7F57C640A34959B046361279E2D1F566BFC290CE79E09DA6E1CCAE57FD090D505544288780A99DBBBA013A44590DE5EE1B240073268BB443D8BB86970829E200CF6E7FBB888DA677323505BA9E8885F03D780D948C366A8E4C841D541028E85361EAB624848AC378E62ABFCB40E16AC4F81F00C198625E939773E1B9DD442FBBDC9027743533C9EC8A383D21A190DB2F0A6DD092BF6EB4CB337147564AE8EEDC952D06D99D0B91AF66DAA4371994888A731A00DEB78E107A63D62037A1C579B00FEFE3A60CE7CDE0D5D3349BCE9179C01E8283A5074D9474465291B8F1732B09194E22C8276DB62621E63480899F67EE9223002D8C7B4BE1E5EADFC73EE36F6940D05445ACCCCBFEA5BF52428C5980C36AAF3939BA0FB230572A7FCF02C83CDB7844E6AA686AB2AE18BBBB29B9F4BF3C6F0200 -smlen = 1853 -sm = DDDD4D46ABE7F476F4D9C0CAA068C86052EF017C958300DF0D92C4906BDCBBCCEC8A0E772F00B5FE4CE1F9C967A1F76D67179653F2B39A320161DD3BAB993CBC4A5D51D5ED7D3E7DF0C95701D6867B23799AE4EA2C66EF4428E082D617B401B74753428C61117831E5D1DD73EED986A59801E377D121A86D5426ACF0FA8EA49440BC8FED01028E256F5C01540320E6A6920679DCCF7EEA0123279FA2D13D7857A7052DA91D7EF44EBA8F01D8A20631D0A30397FEF2BC8A1564AD30D5470046FBF9BAFE2D0A01E7BC3938CE5DE3352FBF014C4E62DD60D9FE99AF8A51501CEA7022D15800DAD2DDEE358A3253D3E465F7872D7DDF29CB004A741FB576F62A062B89C03E19D498F11F9A01011FC5685FFFF9F650BBF579A5507F765796A603DBA9F51C15AF25D6EF44AD52CE03016BD70D72971FAE46EEB8A87857C886BD78F100D9D39FDE6E2E0B64B39EF24A99EC03047E2D484D798B3829CA6037D6C1588A2349DE09C5DDFBEC987652CFDA01454ED791DBFFA3D9DA13A35230ADBE1B39B042E3C70589658A03F75447C1CF3970DC10FE5A4A9E980F2A33B642B42E5E66E9AC4E7A56888FCD72913A79489B5B163BD37B8C3C8D242FFEB37D0C1ECE21034BE9E3685798C2EBC6B809DEFC02C6F0C2A3AD70EC0BAD12D57ADD63EC3584CA98E680267FA514B34DE4147C9D901B59914D49CE9E0F885855ED0CE7973F3307B675408F90B51C6A4D38A414D970EEC989CC7900D7723E19ACC4EF743F6D39EB1B563B8C13D42C0056B6C49732854925B606467F7BC662D17B924FC65E9C3CDC2AE73FF73040011A152B05ED7F96B2FF4CC39A22484AF72812EF02B08EF4DCB64C8936E74549AFDD5D876027FE2B431E61E52E8793888473F4C1E5C1BED2C4AEF8E5E300A735B302474FC6F54869984F1A62DAE29C7C9A0CCDECAA55FE137BA14B5C5C121E0C5EB33B035E01F3415529E0826B27498D7A71B0C086BACD140C02A5948AA54799D0DD0FFD384C7E68578247FA28D205B18ADAC94F7D3C8ACB7DAF71AEE347B577D97EE8E7E865CF4FC1C16640AD1E9D0192AA13AE81A71118408E145B6121ABB75B4BFFD1D403057D4AD5CC730452475A7F067690BB81E81E17BA8DBC31059969B20D387BA59CA8CE499E59A65C8583F29CD539F4F75DDCC68C7BBBC43C849802D8347143E2FE78C1AB6D7AB6BA9917301C88386B294AAC995C24AD680A8C3BDD7AEBEF21E84F5A1909A2D83A8DFE46A75F4B2B47614CD39BF3CA3460DE9BB5C37EB7349A17AB32214D031CE927806FA394470F407673B0CDC3D9A7E3749F09CA895D464A4269682CE6DDCB8FA0EC2F05372C73DC3D06FA6F58090EFBBC6D619A7A565D4EFE441AD7E018A7F5E1384B88EB4506FC54E0AB0A8B9EE3641760FFC08F6BDA78C12396473D1243BAAF6AE10316213115441C0B65C7E475B4E1578D066A47D9C6E92FA32D0F2C365FD15F5A2E88A81691F039DC642ECEDB6652D08ACBE64625B46083CE758FA96C142EB34477E065AEA04A45FF4FCC3E3D146ACD7041F5F7E4C6B26C8205BE7B66DB46DA55556CE02B48AF55A4710BB28B8CE102CB15C1A4AF59D9A17A2DDA6E2D1E96987F6AA9F4216D8D5E5CBFF7E2CB775E83A776063A4AAF937BF0EC84149EC1A7EE21F735D21625E85831B80DC11EBF04F30B13E3A7E4D4784C5F8C61C679E0B6863958F42ED31DEAFFB4C272A3731C1407445CA7673D225EB6509469DC6C1F0AF43EB00F18B3A210AA57D51169F2A9FC251BB338ED4E9DDB19282DCE871211D26482E13A8D533DEE00D36FF5CEA98DEA72D9F0B32DC398A3D5537A3373058FAAA3926C127A1EC739FAF3D57CC1A05D578074A3A72C3F2B1692C2BA1F1FFED943E7BFCBF1E664C4F52F7BF8D86174CA8910C290C06804A7748DB21008AC43E653D7FD7E0C982EDA9356F68DDEC26473956DFF281F7B767010C57F4AD09A05063A6B3CE078DD32F3DE1F40526C06A2D60E36E2C70502D5BEBFD2F3BFCACF8720CDE1657B9892406BAA3DF01E59313EB655B6A545331EBA01BCDB9C99E4AD7FEF7438AE8715FBE589A2F99CB9CA34B9610B3CE5BE38FCF979240698174348417420AAB069B8AD5F646F82958A136DC9F2F81E601056BB4AB5E10F4EBC4A00E18924C51D0FD104078471C6805C49D92C78C832EC3F10D8966E19ADD3D3B4516E12DAF4F63FE6BBD228062DB743D1F867800854F7BB7FFC2CAA0D01A0BB683E368673A8E664BBAA17A8C0C04BCFF05246F9C4F3020510A992EF26FD0933BBFDE9D042862DFFD33A6465F590A2287D8154777A89724FC3DF9F2F1B1ED8765E7C7B761CA4781006822065703ADE07A6E874E70928E1ABA29EE490690D24F6E73D96B85FB53ABFD1C1FDE439279E08FA232043B2344B267CFE5901C60E7CA14B0C85EDCFA2AB90F341821D2B4E25FE23129F2432DB932F23B5957706A433B308FB918D1C8D81EEB399BABE95E7229AD41F30460CF28671A4508B0BD1C61F48CDC23587BB9BDC6F565E76C86547CB71396661BEC8C7FC2223751F765C91C45C674C36B49AEDEF3DF2537F888904B507EDCD89155D40CB81DDA74376BC9CDCAFF8A368F1086C99EDE25526BC53F95F4017 - -count = 46 -seed = CFA713E4A63A6FFBA43BFB898956DC400507F68AD164C3D24A67B5F8D7548C9DB44DAA43E5E4A0990325A4233089318A -mlen = 1551 -msg = 6A58AA820275A2F43D0F05DD0EE484AF42B665FFB8F21DB322ABD256A5C753BC8FF6A2C71467922E09726655F1A7218E736752065C871221C0B9DEE6A9D56B78A1C3B7357774396F6980226DCA1F91BA828E06BBF324D5CCE8D584D9D298261C7149899FC9F74D501E920F22AA34706A79213E35914DBF57B9642A42EF0D8226E31ADF89D18C5F3163ADECC79172C95650D764E3729EDAA08C207D930C26DF8EE1291C1CF889283B70AF00C0489175F799273C837B281A5D1284E4447ED72598EFAE23B523274644DA19BC0359BA59E5BE9E5828FF587C335E136C1D789257864D2648EF9C03D1C4B9809DD07CEABD865254D3D8D597587D71E374FC2DDE89C22C2330E8904F6B53F637348434A21ACEAB9892D5DF8FF84CC58229782BED739BFB13448896F7B1064B499087F7547CFC0A49272C2A670A9431B1B5A07284B6749EF834510A3EC0C61A43D5D0EB48C8F487947C4FCCEFCC49DECCB6111D617407C76A1B4A849C9A190310711B102F142F9E9CBB29F46447265E2C8DDB9174B780EB4A51003FB68483A265F2475D5BF6ECE18AF0CF31BF24CDD56583E777C4340086917B78068DFD380466F43D020E285CEED97A467DB96BFAEC22D80B4A6EC0DBB98CFC44436A41CADC85A90B214F00990D7B7010BBE4AC94809A0450C9ABEE5AA4037A44B0B4DEBD264120E762086B8D6F17AFD37086C93A8A368BE97E0F7546AF16D731C21878063E38DF3DCF3ADE6DD2DAA43C198F49B5D9FF5362333F29EC2F13CBB90DBE4E703EDAE9A4F7334A1C5AC60D5972C4AF2BA61B63C93BF719854E615D16BA4F704C55260A8838679815FA59BE08C4243CACC1A584CC1B4E777FCDC6E5A167C4CC9093749ACE4836AE058BE89CCA3221A3F63F07089006E4C44E40653BF262945A640D8C2A24E7CC3529E4BE76286C86CA2089CB8D4684508D1FAB81EAE7D8C731B65A22700BF9009A3190F5ED837EC22F9112383422027AED838F16A7740CF79EC101865D320E380D4ABA745ACC8EED376DC5B3AABE58DEBC35F8E983C92906AA2E3D8FBBE237325302E2A23CB1312EA7F532D64E79B9815996D28E0183EB728A37E19CB219987576C142F4B2F66AC6C7C77028ED59A8DF27F78ACD3910DDFCEB88888B4A604E5D07AE1B53EA6DF6EC2163DDC4BAB422D2438FFA543B22441E50E4087FDE4BEE6D79D90A2F72548DDC41C5AE07DCC87666EA3C4B89A0B14AFE03B585E7CA507E5F29997F2368B0C68C6AB6E344C082BD06AE922CD8089634918D9132DF9CBD665A4149C59BF76B0E94F66481766FD79054AA80C02E0AE04A6E2BE090582171B2A9AF455CD9FC302CA9D1EC837EE26E0E4D0AC8F0692CB9ABAC979B58CA92E5194EBE46B520125BD0B3ED1AC2BD817D3510E33CFD17058F865DBC64E9B99352B6CAF10F0A5A47449BF927A8EBA06D34C80D77A0B00B88B25A4C8747AADBB11BA15ADF9C959B05C4371CD8439FE5028E004A2E1D2F21190466FC7FD56E9BA0599A0EEDD98246AEB4B85994787B7604CB52F5515B42C2FBD4B5E9E372A36CC4E66483DD884DFE42AAA5EE7FAB200D8EC6E3556DDE0F9E9C7346F9967F8F3CEBE1E4D1CD8E6046E5E94BBC74AD3D51DB0DC704F4A4025383F0391B9DA37BCA8EC59E807593A4F040FBB186607280967E5048CAB92215DC783D9045F7A0922008628C771778661E97E9F88EA84BDAA8BA61126F71D193A2A564E3ACDE7ADF2C0B3D5B022EB6E0C629782B0025C9079D4545D88AA2BA27D10C5DCBCFB7CF648939155066518878CC54A4F611AAC21BD3A1EC628D3352F049915FCA55234B9146ECE5F78FBE7CFFB35695363202EDB9EC3501A93B4B6FC81B3DFDB5245FEEC8AA54195262C2467E15506B7D42A7FF61D75998722D0208BBFEA05CE7D2E66900A9B34F44C2A21257C220C03F9D6D7F0312A36F5C12DA20FB5290D5CFBC1DEC7D05C44820885C479063CA88783C5AA128829417EC4DD41CF83A1D991DF2EFDFEFE375E93F0371695E353EF737F4A75106211A5F70C82B4F360ABCD078C9E829C82A6B7A36D22B8D1F6E3101BA009C759FC83999D52E29B387A8DC1658A43EC4C4D9330A4ED2138E035EBEAE6343A76A82849E37141FCE34E9A41EB5EF88BBB9257017AD8696C3847FD77AE103A082ED1A05DE9420984C147AFF927E1950244912079BDBE5CC07 -pk = B05D2D5C96290FFD0B06D213D2479945354C2564BB1EA5AF3E763570A922BD678F924248F5C13517B89E81B90743F9F0E62CAE3DB6E5C82E474E1767167A0E007826C0F7921124AC835C4FF4D41A9829B4C9D28A7AB4398B5DB263B86C6989947E17EE8FEE8D80395621E94EE2BE3C058FE6A6A9782A7BD1E00FE5724C570100 -sk = B05D2D5C96290FFD0B06D213D2479945354C2564BB1EA5AF3E763570A922BD678F924248F5C13517B89E81B90743F9F0E62CAE3DB6E5C82E474E1767167A0E007826C0F7921124AC835C4FF4D41A9829B4C9D28A7AB4398B5DB263B86C6989947E17EE8FEE8D80395621E94EE2BE3C058FE6A6A9782A7BD1E00FE5724C570100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009CE48047E93010843D5C8F9EDF5DC001EC5B6C306AA16DA195F9ED71552962C0AC145106297583A908977F3632D21293505D8393E5392AAB89C0B3B200D980C626F5AE804727B5CB99AA366F651105EE9B20506986EC6391CD0F00000000000000E1CC927420BF6AA45691F422BB4AC09817745F9EDDDCE169F08C116C4868120B3E89DFEA9369E37529636BE80A3D8035B9120E1DC278A24F2CA77106A28FB2CEBF3D7C5D1D91A64DD742F61ABFC3898714D1F7C93C4977A95EF0FFFFFFFFFFFFFF296103F7D13891189D85D906E43558CA891972BC8726EC9EE9F5C92C11FFDBB51D2221FE827F9B208D976CD2CBC4CF809BF1996C5186346FC7DEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8D054E01923C6EC8320A07E8FEC5B5D5A6DCB79FEE8C4229BB32A9D955ACA95F7D9DECB6E06CC35CB4AB3D97C0D062B3AD537DF6AE69DF37F570200000000000000000000000000000000000000000000000000000000000000000000000000001BE75A88A83EC8CF20AF3293B2FE6AF0B2D7E7679CCB48DFA058F94922D7098355555503B564D40F39915D37E7C677772FD0BDDEBE2F7DC7E9556012B7570900DECA2C321785F15A825DF46CF959CDE8D1CB9DB1A3B333C89AFFA4017D65CE536F2828EF6C464DB7F702193D7B36C5A218BEF521796A2E8DA0E1307498200800E841348095FAB5EEF58A175F5B03B8C84FAB8A2775CE7B75CF0EAC6DD2DBAC7893690283809E0D54216C7874F61A52277C43B956B0E34A6B347D1D3FD61E1F00CC9FC6496707916919549267FC8A960ACDA8157E64D7DEC5AE94891E8516D8A9373CBF8D745C47A174FABC58CC0730F27D940A1F7B1D1857DABBCF71CDDB1200A5A93285A7409713AC7626121FC5785EEBA9994C88500B7FF01F574B0FF4BAD8B26C135992AF5B3A3C0C93EDDBA189E0D529EF43FA651D325B8631B3DF6A0300927150E830750DF643DC237A251014E59B4B8E08AAFD2C90A2D71126312375205738A8C3788632F7AB6F4C3D9F2E50F96B9A2A15D97F790D5A5F3435CC112100B35A66141194CF8C54BD8D0D4B92584DACCF2A7FD364516FDC848B18B6EBE9F5186AA2799136F31832B4CF6E3ADF1B36DD7E429688126D1611BC52FEFDBE090059E0DDC0CCE8B08A27DB71F66F276D741D55802E8CA675118B851B5737212D30503DBA4F87F0DDE6FBA6698951799301CC9F0CA7AC22F6FE45A11619957602006D5F654622FD3DDB61BA5BD403909D5EB46CADA2CA3297F619DA9CA1FA9BAEAC966C75766118BB52D52680CFF7720CE516C249D70E1CE86F271C1AE32C47130047F0530B81E78D6AE24740E39521BFE114D686B348CF0FEA54BBFD0009628DCC3ECF7E8222630602A2698969B0C739DCD0FB4B227D076E803CEC74AC533F2500DD26FE522F53D2EC4A9FFD6E3AB84860409169342F4450BF3E587F5C5BD78147F15ED833E8F4302A5A924E0D81F2A5523A7635B898C8929D5A9458EEC30D20005DD12E9025408F5C769AA826D307EEF56E6C3703C34F421DEF73C9EF9EA55FCAD95CA5B6D008E935FDCA48A0142DA75ABA762A6FE83578A25A7BD1BC4C1E1B00C4EB610AE822212559FCCFEFE6F28DD9CA95AC12A10AAA697C6E430135E7A83D3C77BC334971A9872F3C7AD2F167EDDE01E833545D3FF680054C5043E8E20F0004BAE7D10FA3457CD1433C6410BBF3FCA77A54CB4F0A6CBFAB9A84C157363C6DAD63E68666301A00117C404E6034398C3CCA55225B38F32B4C87DE9ECB541E00 -smlen = 1886 -sm = 1A94CAFEC95B679AE38504E5E3764CCFB81701D78B4893E71D905C5F44617501F0F4EB9E9800870F896606586B92DCE024E46D4FBCAB899901E1FA0C87635EA932F219A3E54AC84857FB8D00804D9F63FA12193664322F7307192BF5E19100F89CC26B626FD06B467BF8E10C669A02B5F301C75BD3109518C541C65D3C27DF88435C364A0031D9567C5F762FC8359C08E3F8DADCD8030F01FC551799FD7FAB734FD7BE75D9893A4F9275012940F9096968AA3FE0D62611BEA0281F7AAB01868A1AA2CDD2732DD557C394D51352521E16014C1DCF3C1F7D577065095BD5E2F80DA8EA2A01C6174B44706C3E847B9FA66D371F0AB21A5701FC8BE696590A9C5054FB8820C335A936E6F80101B9299F9013E49F6AC6332FC48BE5C12F05D33B366B5101EF70D72D9EB2BCA01E0401B81E21EC1FDBAA28F1277926AE619921234D005078552E2BB3E44F1098EE9E5C93026A58AA820275A2F43D0F05DD0EE484AF42B665FFB8F21DB322ABD256A5C753BC8FF6A2C71467922E09726655F1A7218E736752065C871221C0B9DEE6A9D56B78A1C3B7357774396F6980226DCA1F91BA828E06BBF324D5CCE8D584D9D298261C7149899FC9F74D501E920F22AA34706A79213E35914DBF57B9642A42EF0D8226E31ADF89D18C5F3163ADECC79172C95650D764E3729EDAA08C207D930C26DF8EE1291C1CF889283B70AF00C0489175F799273C837B281A5D1284E4447ED72598EFAE23B523274644DA19BC0359BA59E5BE9E5828FF587C335E136C1D789257864D2648EF9C03D1C4B9809DD07CEABD865254D3D8D597587D71E374FC2DDE89C22C2330E8904F6B53F637348434A21ACEAB9892D5DF8FF84CC58229782BED739BFB13448896F7B1064B499087F7547CFC0A49272C2A670A9431B1B5A07284B6749EF834510A3EC0C61A43D5D0EB48C8F487947C4FCCEFCC49DECCB6111D617407C76A1B4A849C9A190310711B102F142F9E9CBB29F46447265E2C8DDB9174B780EB4A51003FB68483A265F2475D5BF6ECE18AF0CF31BF24CDD56583E777C4340086917B78068DFD380466F43D020E285CEED97A467DB96BFAEC22D80B4A6EC0DBB98CFC44436A41CADC85A90B214F00990D7B7010BBE4AC94809A0450C9ABEE5AA4037A44B0B4DEBD264120E762086B8D6F17AFD37086C93A8A368BE97E0F7546AF16D731C21878063E38DF3DCF3ADE6DD2DAA43C198F49B5D9FF5362333F29EC2F13CBB90DBE4E703EDAE9A4F7334A1C5AC60D5972C4AF2BA61B63C93BF719854E615D16BA4F704C55260A8838679815FA59BE08C4243CACC1A584CC1B4E777FCDC6E5A167C4CC9093749ACE4836AE058BE89CCA3221A3F63F07089006E4C44E40653BF262945A640D8C2A24E7CC3529E4BE76286C86CA2089CB8D4684508D1FAB81EAE7D8C731B65A22700BF9009A3190F5ED837EC22F9112383422027AED838F16A7740CF79EC101865D320E380D4ABA745ACC8EED376DC5B3AABE58DEBC35F8E983C92906AA2E3D8FBBE237325302E2A23CB1312EA7F532D64E79B9815996D28E0183EB728A37E19CB219987576C142F4B2F66AC6C7C77028ED59A8DF27F78ACD3910DDFCEB88888B4A604E5D07AE1B53EA6DF6EC2163DDC4BAB422D2438FFA543B22441E50E4087FDE4BEE6D79D90A2F72548DDC41C5AE07DCC87666EA3C4B89A0B14AFE03B585E7CA507E5F29997F2368B0C68C6AB6E344C082BD06AE922CD8089634918D9132DF9CBD665A4149C59BF76B0E94F66481766FD79054AA80C02E0AE04A6E2BE090582171B2A9AF455CD9FC302CA9D1EC837EE26E0E4D0AC8F0692CB9ABAC979B58CA92E5194EBE46B520125BD0B3ED1AC2BD817D3510E33CFD17058F865DBC64E9B99352B6CAF10F0A5A47449BF927A8EBA06D34C80D77A0B00B88B25A4C8747AADBB11BA15ADF9C959B05C4371CD8439FE5028E004A2E1D2F21190466FC7FD56E9BA0599A0EEDD98246AEB4B85994787B7604CB52F5515B42C2FBD4B5E9E372A36CC4E66483DD884DFE42AAA5EE7FAB200D8EC6E3556DDE0F9E9C7346F9967F8F3CEBE1E4D1CD8E6046E5E94BBC74AD3D51DB0DC704F4A4025383F0391B9DA37BCA8EC59E807593A4F040FBB186607280967E5048CAB92215DC783D9045F7A0922008628C771778661E97E9F88EA84BDAA8BA61126F71D193A2A564E3ACDE7ADF2C0B3D5B022EB6E0C629782B0025C9079D4545D88AA2BA27D10C5DCBCFB7CF648939155066518878CC54A4F611AAC21BD3A1EC628D3352F049915FCA55234B9146ECE5F78FBE7CFFB35695363202EDB9EC3501A93B4B6FC81B3DFDB5245FEEC8AA54195262C2467E15506B7D42A7FF61D75998722D0208BBFEA05CE7D2E66900A9B34F44C2A21257C220C03F9D6D7F0312A36F5C12DA20FB5290D5CFBC1DEC7D05C44820885C479063CA88783C5AA128829417EC4DD41CF83A1D991DF2EFDFEFE375E93F0371695E353EF737F4A75106211A5F70C82B4F360ABCD078C9E829C82A6B7A36D22B8D1F6E3101BA009C759FC83999D52E29B387A8DC1658A43EC4C4D9330A4ED2138E035EBEAE6343A76A82849E37141FCE34E9A41EB5EF88BBB9257017AD8696C3847FD77AE103A082ED1A05DE9420984C147AFF927E1950244912079BDBE5CC07 - -count = 47 -seed = 1F3193EBC58EF65E9E396D69220ADB8ADC729BB388A72CEC9028A094F1CBDED21CFB0C41356AF31E0CF66A3B0D843666 -mlen = 1584 -msg = 139BA17ED7B476DBB1CDFE3C42B3A57AF5BBCB3BE19ED04D6C3072FDFE917ECB9272D59EE89EF83522531D83AFF8B9934A8423315C350D1481A4B02980DC29E1CB83B76623869649AC40EF297B153B679C327BB251C6E6BC169C48ABA2A439F9EA24EF94656A415C3E86D7BCB43CB3717D54D773F1937DC8B0E02D4E6ABBB1C83FE73F1B221C9A359E454C19DE5E71EA4CB8C560EABF1DA133FF20D81785D2ECD935B99F24840761446C324DF81484C5C05045C0949DF8D0F10F942E1B5B79074B358C25B6EC2B0B42DF65D998B666CF1BC568E7D737F22FF541807BE95ED85A9980E940E24D2C506BB0F9BEE32EFFD85A2017DE694F61BCC2B292595C97FF4C2145E48AF8F0F3D71763B4DB433ED7BDB8DBF8643475FB2B9155F0CC6A0048C5546900792BC01EBA4B06C83A0C447EA0CF05410DE55ACB8E5521829C89BFBC084CD86E7CA3D701283B70F78E1CE9C3888AD2689E0EF5593D656285066F319E155F86C0A71256484F42A0C40E7CF13AF0CF77C6D1CC7231A48538E9060A7863B774C9CC65E321E45AACC002C0170EDDD18CC1424159D46BF99D08A28D2DEA8917D28D91A1D6C409D945A5EEA19413A1ADCA40DE9458FA6BDF1E5308EF9E67E1E90E9D92BF19B5351FC49DFF0A31E035038AAEC651C0F20F276E4EF0EE35C14BB625EB34205516D95ABEAA06A7A3BB3AF2F12236406689BFAB11E65FC63EBC5B944818DD1D53C0E7B88CE7AEBAE581D995AE7D8423778DFE20D6CEA7AC0B1B4EFE2B9D571DE77BD8F71E89D9F6A2DC89103B73625887AB376BD12CE89A65E6280515A44A80D6C32799669260167DA0A214AD0FB803930AB1952D93360B54433CE8220B29339DCF2702581E88952A5A1549DBA11F4CCDB6FEFD6D24522F3207796C8D5BA9D1582F888F2500964F2B975AED5D5AF83409FF9720EDCF5CE3FE9B6B586B08DE21956E7970D8DC28F6208A80F5378ECBC506333A1D98C58EB0E2EB0CDECE0F5D16A069FFD742D1E589F546C4F2EA3DA0A56F984CFD93F5F2912FB1D068F2BD7C1B5E979ABCC62E3A0164445398F5C0208E82B99AED1200D36289B1FDBBF03E43995341AED3AD712CC7C7530C751B40B765073EE4E4CDD411AE543AD5E2793F294320E9791AB35AE1697F23EBFA0280B8041859909B0089C101D7CC429408FABD2E073FCA7F2C2886031E9F6A32F2B596A799967BA8A47E87DCC8854D45DDB6DE39160600EB4235F4E3424D75DDC8CCF041AA05B25B5A3811540EA5B77CD8D7D611A63BEF5C26D57475B28E961645AEE0B9C8D47954FAF634017787A21A671493E7C5F1A4C553E0A68DDD726DB1DED4321DC735332FEFDF2A84C22097AB3552F878E304598EC40EB349E1C1AE416F94112A2CF8E8702A4C3BDE2F58245166550FC238E153D10F90652518B1D84CCD3ED836F150F1FF103976E743137DA5A97A61276DFB0C11D071B240069582265A9CAE4987B6C6B017DCD1594024D7B1336FF141E59936EC4CE5410E1B73BA6FB42D35F8999225CB1A135260967F4F6EF2172D53FA6AB6D1A2E3174B46C24BC103BAF69C2128F093AECEEBE8753EB352E2804EE64AE5140DF1ACDACD8F225B3C9A61264245B8E5CF759CDDD75E25E2D790FFAE8421515E0CD6F279D0080A3F80BB2E0729C0D2626B6ACE31CE20BCDA490C7660D04D1D82E6403000578926C52D8F9A4BE7103D64E0F03E8F148BB2236781EC30F6D8BC827C107FCC40F26DDAD485E6135BDC3BB331BE139A07891717B692E23312D0E5B1C41F30C3B4B4700EFFB481A835AB54340269FFF365FF87F58245621ACFD83B7FCC6FF108132D8966F9836544354F7E216FBBB851F390DCE8A72362F0454730B90D35AB3859763AEE35668310FD501C7501F4599563006AAEE9B636B676F3DBB6787317885B0F4A64171BF19CBF2EA7A625E1563032C196E1292D82C7484817DBF78D8E9E478FDC4C92CBEF48D4CB4F0E6DCDCA6682DC0A56C3E45EA0350D9FF88073748305FD7DF3A3BE8C055CB1C55167560D5C99345BA80C21CE791C4A511E384A02833B78E8AA02B1B877A9B8D806978519D716C611DF54AE8EA2691540E87C6E79EB006569E02745021BDC7852E1FA4177E2C3EC89257618B38719CB07B0BA68F600236167F019694959C2AB6FB39D5890CB176F6ACC3B9656E495C07027E3D4DE781F48C1F1A8AA1B41449689E191E495FF3F263DDAAA8DE0DF6F1A4AA3EF1F5EDFE437BB74BA -pk = D1FBCC00E54D2DF926CBC94499FA57744B3A052EE5E212255E6C051889C83C8F321CE6A05A2952D46BA8C99662E4BFA622648DAF8E86D33B15383F2D52F523009FAA03188BC28878F72571696B3EC6E507705757B851CF35470DF90E7B29A4EBD67E3B31EB79CF23549B8E4E4C557AAE0B58D0FDA42CE73F29BE0DEFA3550A00 -sk = D1FBCC00E54D2DF926CBC94499FA57744B3A052EE5E212255E6C051889C83C8F321CE6A05A2952D46BA8C99662E4BFA622648DAF8E86D33B15383F2D52F523009FAA03188BC28878F72571696B3EC6E507705757B851CF35470DF90E7B29A4EBD67E3B31EB79CF23549B8E4E4C557AAE0B58D0FDA42CE73F29BE0DEFA3550A00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005BD52AB210ACB538D07DE80FCC29BD48F4127726AA2C6084FD6C2878A75DE563ECC06E391AF41F1A89000FC2D0A17EB55E7F0F5B2A9C25FB397B0EB026FD284A27F4C6A96D7ED415346E284F8C3D995C84B2D27593B1E50B0E07000000000000007851C59F12E93A1E8A63CBF7021965B106DB9C6E19E32FE5A88180B281150888B01A39BA5B30B076ACF4B0171FB1F6AD9370628B2DA96CB0F1FB0D8F07FE93A46C0E7114889B7D42831E9C5B0CBC2F9D13B03F29990BE58D5AFAFFFFFFFFFFFFFFB4ED27CDF48FA2FB69DE068BA39288973101ACE2AB612D34D0819BE781697E9EC256E3D74EA2F92B38D725555ACC36E8170C9759A77D5C970832FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0328BF401A488BC32F3AA8B53C9ECB9E6472C9FCBC2D5BE3E523D347DFC555311B251ECBB86CAE41AB101A00B4918EA9FB18523F1184394A7E4A0200000000000000000000000000000000000000000000000000000000000000000000000000003452563FF9116B15AB4E0C751388F270C9AC2211FB936DF89C7CFF2D52DC00773344CDF2066F093465063CBD1D46D227F5C9B470062955E244AC586B44831D00468942794D502A267779B4DCB7A801416B8C722A94B62C9A687116B4FA3B4545058C2378ACE35E1B6B76548C35669B55E074540D246BB1DC6B6C4E946BCF1E009D8CBFAF56A3C64A5CA24F6A1ED52B7794D4B146F8B273B1CB9F39D4E7165636B5F106279A8AC998127725B7C254387E2375E70501E0655EC8818F146A3F0800D5E154748396E98B667B2A4E8A5A4BD12B4E1D54DEB23241BC4EF9EAFA055D5D66F93250B31F27DC3BA03C57F4B64E4462C5E32921ED4D5B53FB073673941700E8485D6B45C72568B1BFB8D8EAA34952104B1850440C252B3395BDA5620B3D79659D87E42652051B2FF14789DFF175A5AB98AD69A7F5A3CF8D5721BD61360F002E553CA41C646E7E070AB3ED4388751427FFC5AAA0BD5882A90050F2EDB6DA8CAE503FABEFFF1A922905056E9171FAF5518CD9253AFCC4A6B6B75B9355820E009569F13299818FC53CE57A03DD9EC78813AE064220CA7916BEB1AEBD80F118801B61CFE095C24E3168B2293990106D037E3376444227C8D7812D6789DC2910007F8BA9BD820CA2114AC1DDA7B082A586F3F678FE056AFE8407F75B85BD96C915E19D7C6DE6EE0A010BE8BFAD59611732A7C5365C49F7EB3AC11BE38C92051E00FF09BCC48E4D20B9847FC217D3F3D696F3048A059EA255D05DE15F3AE84C6957CBD41F1B465B0CCF59BA7392443EDF9B7DCA7F3D383C470CFA716BDFECC70A004C0A024D4A787234F20736C6C345BF99846014F2E4F5514F29C5E190F08E9ED21E8A99BDE970DFFB62D94D153F5262636F061646D554EBE831349A7EBE9E18003A423A7CB91279359B497783ED896069A4E6982895541A053CAF264DB87BD220CFCB6376440F54B77D509F54F1142D0DD3B549416872C3B0F6D2CCD2D9DA04003F739ADDC42015B0F47C0E194841396D89827FC85FC335215D97CB09BB92F0977EA3DDA666B38C74144995CEA206E48F9FFE3D27792ABC2E6DA9C2832429000028ABA67C9E209501354D1B6D0FE85BB56102EF2DD9FF479F6E32614F3D153DBDCDBEFFA98DD928FDFDC7E64E4A56960E5002FA84E1BCF9BA61C90A46072B0F00E17C472BC225AE4A53958BADD60A8D5A541986CC275B55FAEB17497FDB45D8DA3607B160CA8EF7940ED100514A85DD560AC1F63C219D4EB82D4DCE5C1A821400 -smlen = 1919 -sm = 011683724D73A04B56FF0F4F06C3BDC3146900A1114058A26322696B7C0F02369BF4707C72009AE37C88D178633664B4D6D9348E991CFD1E006EA86B99C497E091F13FBFDCA72FA736367E0110F3BD932751DA24F365F9306D9A89B165BB0185F0C53D9EDD0F521BBBD1FABBB5903E716300A0447BD5960F83426BF4394EFDBE8D069C4B01E5BD68D163D8FD04C74A925492E8DE0FD5F9009D97591A344EE65744422DF33EED303F10D401BDF367028330A6B4312F2159724B379943BC0051D98F8F8A58EEC754304021348484B377DE01039D0B6CBDCFBCB0B12BAB867C4326DBB5AA00757CF7446C0FB74A74887A663A2AE3DF909D01E9829D4B086FE1F2767F4A8203DC474E1AEF010123A59B23D2F3CA6AAD957FD799C108268CF0F9E59318443E7B34A8FE5E246B8405025CC49EF89E58C13203F3330B4E9F469A8CAB018205268DE1B868C13A76101D161704139BA17ED7B476DBB1CDFE3C42B3A57AF5BBCB3BE19ED04D6C3072FDFE917ECB9272D59EE89EF83522531D83AFF8B9934A8423315C350D1481A4B02980DC29E1CB83B76623869649AC40EF297B153B679C327BB251C6E6BC169C48ABA2A439F9EA24EF94656A415C3E86D7BCB43CB3717D54D773F1937DC8B0E02D4E6ABBB1C83FE73F1B221C9A359E454C19DE5E71EA4CB8C560EABF1DA133FF20D81785D2ECD935B99F24840761446C324DF81484C5C05045C0949DF8D0F10F942E1B5B79074B358C25B6EC2B0B42DF65D998B666CF1BC568E7D737F22FF541807BE95ED85A9980E940E24D2C506BB0F9BEE32EFFD85A2017DE694F61BCC2B292595C97FF4C2145E48AF8F0F3D71763B4DB433ED7BDB8DBF8643475FB2B9155F0CC6A0048C5546900792BC01EBA4B06C83A0C447EA0CF05410DE55ACB8E5521829C89BFBC084CD86E7CA3D701283B70F78E1CE9C3888AD2689E0EF5593D656285066F319E155F86C0A71256484F42A0C40E7CF13AF0CF77C6D1CC7231A48538E9060A7863B774C9CC65E321E45AACC002C0170EDDD18CC1424159D46BF99D08A28D2DEA8917D28D91A1D6C409D945A5EEA19413A1ADCA40DE9458FA6BDF1E5308EF9E67E1E90E9D92BF19B5351FC49DFF0A31E035038AAEC651C0F20F276E4EF0EE35C14BB625EB34205516D95ABEAA06A7A3BB3AF2F12236406689BFAB11E65FC63EBC5B944818DD1D53C0E7B88CE7AEBAE581D995AE7D8423778DFE20D6CEA7AC0B1B4EFE2B9D571DE77BD8F71E89D9F6A2DC89103B73625887AB376BD12CE89A65E6280515A44A80D6C32799669260167DA0A214AD0FB803930AB1952D93360B54433CE8220B29339DCF2702581E88952A5A1549DBA11F4CCDB6FEFD6D24522F3207796C8D5BA9D1582F888F2500964F2B975AED5D5AF83409FF9720EDCF5CE3FE9B6B586B08DE21956E7970D8DC28F6208A80F5378ECBC506333A1D98C58EB0E2EB0CDECE0F5D16A069FFD742D1E589F546C4F2EA3DA0A56F984CFD93F5F2912FB1D068F2BD7C1B5E979ABCC62E3A0164445398F5C0208E82B99AED1200D36289B1FDBBF03E43995341AED3AD712CC7C7530C751B40B765073EE4E4CDD411AE543AD5E2793F294320E9791AB35AE1697F23EBFA0280B8041859909B0089C101D7CC429408FABD2E073FCA7F2C2886031E9F6A32F2B596A799967BA8A47E87DCC8854D45DDB6DE39160600EB4235F4E3424D75DDC8CCF041AA05B25B5A3811540EA5B77CD8D7D611A63BEF5C26D57475B28E961645AEE0B9C8D47954FAF634017787A21A671493E7C5F1A4C553E0A68DDD726DB1DED4321DC735332FEFDF2A84C22097AB3552F878E304598EC40EB349E1C1AE416F94112A2CF8E8702A4C3BDE2F58245166550FC238E153D10F90652518B1D84CCD3ED836F150F1FF103976E743137DA5A97A61276DFB0C11D071B240069582265A9CAE4987B6C6B017DCD1594024D7B1336FF141E59936EC4CE5410E1B73BA6FB42D35F8999225CB1A135260967F4F6EF2172D53FA6AB6D1A2E3174B46C24BC103BAF69C2128F093AECEEBE8753EB352E2804EE64AE5140DF1ACDACD8F225B3C9A61264245B8E5CF759CDDD75E25E2D790FFAE8421515E0CD6F279D0080A3F80BB2E0729C0D2626B6ACE31CE20BCDA490C7660D04D1D82E6403000578926C52D8F9A4BE7103D64E0F03E8F148BB2236781EC30F6D8BC827C107FCC40F26DDAD485E6135BDC3BB331BE139A07891717B692E23312D0E5B1C41F30C3B4B4700EFFB481A835AB54340269FFF365FF87F58245621ACFD83B7FCC6FF108132D8966F9836544354F7E216FBBB851F390DCE8A72362F0454730B90D35AB3859763AEE35668310FD501C7501F4599563006AAEE9B636B676F3DBB6787317885B0F4A64171BF19CBF2EA7A625E1563032C196E1292D82C7484817DBF78D8E9E478FDC4C92CBEF48D4CB4F0E6DCDCA6682DC0A56C3E45EA0350D9FF88073748305FD7DF3A3BE8C055CB1C55167560D5C99345BA80C21CE791C4A511E384A02833B78E8AA02B1B877A9B8D806978519D716C611DF54AE8EA2691540E87C6E79EB006569E02745021BDC7852E1FA4177E2C3EC89257618B38719CB07B0BA68F600236167F019694959C2AB6FB39D5890CB176F6ACC3B9656E495C07027E3D4DE781F48C1F1A8AA1B41449689E191E495FF3F263DDAAA8DE0DF6F1A4AA3EF1F5EDFE437BB74BA - -count = 48 -seed = CF5A04DDB5EBC45328F703D486D24443A7692D65AA55F054E3078DB76A7939590A3F35CF1A21E82A845445DD1B64A85A -mlen = 1617 -msg = EDD4DA833528B0511534F77857FFD16EAFB1A2AC87E6844612DBB104B9F32025B7F54E993D65CE85A061B6AC6D70A15BB42BBBBB6E2E21AEA55BB8A556120EB15EF35FD9774FC7B5C2894B747D3E4965B77DD8D5B26F38D413662783DCD332765B4DE534D08D6514CA9DC6ED7F2BDB4B5C437178710B04491708836CF2CCA08F28582107D27AC305EDE6030B1F8AADC4A1D29AD16CB4D739D8F813D47DA715CAD6B5CDE24EA95DFF4415B527DD900442D9ED1CA712C58B206D6E79F8AEFB882013358BC578638225BE79B58FB677277F072AEBCF8CCD6AB61A9D98A3B260E60AA625D78058FAE6028E4C5562A0F3473C3AD530BC4471228F27502A8F8FE2D1F72022103C3A2DEA363E68248ED8693B3B066B495561CF4468E8EBF32B454E54DF1766468AD3831D56EF7EB9C231E999C4CC3A6B0EBBF2C4F22820E256F67497427F53AD22D42C9293DC8682D0BE3517B63C6E871910ADBB3406B6B3B1CAD980AAE47BF9686E80B6E5DF2DACCCEAF9506B4667271779D00B4C1065951E21F2ACF6CF3CCCB8A633D1114CE9D531D94420E4AE496086638F031C0BAAB5722A41A66788D3885EFC7FE1C3DB54BC69E35B7489A0237A37AFE5194B5F424F792CC1D696098BCF327D87EBC50429A95ED82105C4328D0095A9775589FDB6C262FA51FFEE4D99C6D1A68FA661D1B6A0A2E0693D73B39218A6895BD83FC1D54831B7DF146FE7BD2A91B979018787B9904285A35922E22A7F1761BEA541EAF21D74E3A2F3C6F2247B042379CA4C553FD9256DD0C63E4C9DEA60912D02FBE4CE7762069A86CDE02A4E1E311B2AFDE435DA0816ACA659BD8C0650C1F118C0EA3622D72A5E96132F8B0FF8458C757648BD46E58195FAA0FC4FF8FA44238E35A25C9807B6229000EE560D8E085F27375C2F659BAA5FDE302B9529BF4699505C28DE33AB5DC2B8C02967947CD24C6A599ACB5C2D1E7D6BF3BCCEA0253FBE11D8043FED532AAFC9EE1151243BB80B92BE239BC4FD1D1CAFF502951205F2E6393B704E67141E1218963F664FE0759C15E6C0A1B40602A73990F040502867A9EDDBD4DB0E554AEA4BB9597949D5FB32C2E3AF92CF7816BEDAD5EDE1B769C823CABDEFCA1D1B85213C79EB03E065146B58E3BFBE80B4D4683B65AD1E0611372729B99A0B93934D52DDE40C19FED5A2B3DC3030E0B5F26B66474A5CCA6D741AB294BBBA6BE516105C08BDBABC97BDEC2141D035BF6C3A71553D6F6350229CA2626B8B0B56A24F2D6EECE436ECB77A70D747B6A6F830578B4792DE533879B174353424E7D0EADF6BD5A74B36A4E6EA7E39A4215559557BCE7A00FAAF0D1F81016F913A10F3C9F406C7CB53282CA8FD5FE4F5FABB96F891583E0507912BA02709764694296A5248C340A1B9EC3DB0F926F438CA96FECD40C4AD8DAED9B8A29691601835FE14283762236EF2135443307E5F0082D1C2180AE96ED0DD99A6E9172088E8B94AA2952BA5E128B202B2CBC1966E69B6E6384820D9AB624BC71788EA84B4ADFCFAA2EFA1DDAA8855D1DB3F58EEF2D54FE11A8A5D78ED46B58460E6F2FBA6CB70640700A4520AA1A2A9B336AEFB17CDE8AC78D67F194662642A0107CE38B74D731380A72AD4A0A068F09E0878E521F15CE8134780C3FD0CAB2DC2473448654F88BF1FE2020901B90C0ED670866B1BC337881292FBA885FE2BFEF6FE74765CA12372C8CBD698AC41A4C337374587DB15AFFB511D8C224F1743498D7173897FF5B8D070B89592BEBE053D5C10DCE67CA8542781AE749F3A42FAD7E4A2004A565F81D5FAECF11115C270155FB8AF6AEDA138B9C71458D6D2FF63441130EE9107C39260469521E020D2B42CB5A51098027F23890DAE8B28BF722AF9ABA6224E02FEB47E40112CCB164E8CF174BC9AC4C11AF9B482DF9C9F7F5F1B826428C21BE395EB1F07DE511E8258C84F5F035F4787ACE18C190808EFE99FCB455A54D366DDE2E230B575ED5A4A75D57C9A38DDE3D91D0D1A1C4DE7F277CAF23E0C5DD8E3B693DBC66B6BF1679B0AF74A2B9065B64CF0978115CC456AF685B22D85135727A8AAD96338611DC109B36C85A92E4A0180AADD1D25C5B3D4C681A44BACB953E50F994FCF5281366CDEC0CC50976074D91840B5079180CF643184ADCF9E4CCB44328E7BB9EB2BD06DBB7A757C35EC3DCF795A5E05ED250159EC453A1692426F624CC0737F691E475804F155E44293151E42D3C0F115ECEE53C6EEEF69788F7E8E5C422BB102237499F2638244C0C080B3639A49FFC1730EBB0CFD8A46 -pk = 78CDBE37228CAC078CE12F74EE6EF1A1C569D31624B580BEEEF71953AAC5B3DFCA5F63B922FD6522B5E3281059D90FD38EAA742BF4E896CF20B2A57DE6DD08007E6E3B57F3E2459557336D937D2BD4543923E76370762951CBDC257BBC39FB98F045BE4FF024D9F2B1C4CB072061BBE2EAA3A6535DC95EEE9033841160F30100 -sk = 78CDBE37228CAC078CE12F74EE6EF1A1C569D31624B580BEEEF71953AAC5B3DFCA5F63B922FD6522B5E3281059D90FD38EAA742BF4E896CF20B2A57DE6DD08007E6E3B57F3E2459557336D937D2BD4543923E76370762951CBDC257BBC39FB98F045BE4FF024D9F2B1C4CB072061BBE2EAA3A6535DC95EEE9033841160F30100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005CE5A1997D6CACFA8785444B3A622DF2D3841A6983A51B56513B4D8E7AC5A4298832629720C7F8937E3D083DCD1068ED1417AA9DDB8513163269809341DC4D51170015B4E5DF8A5A98614442FE0EB4E01707A2B8A1F53673D313000000000000006794B99405B54AFE2C988D57953C0C24DDD2E69424105148B55863DAA1A98C3B00B2086ED8B02C2908BF54EFAD54A6A8F98E9CCDB418B1358C37BFD1EAAE8D18FC13D0DE5CFDD66D4D9F522E723A7C6BA7B1D71137B3CF7572F1FFFFFFFFFFFFFFDF9475190637ABF6920FB92AE628CF7A087D598E2FE0AB341E50F2EA0376A26BB67CB080E4FCB322DD33DF53D84F3157ACF89311549EEC58F1DAFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08E670C2E941C92610927929016ADFF2E464AA35DF016798A702826A42D85E86F9A27C2DB508E466CA6999BE7BAE170D8DD0739816216BB9D889020000000000000000000000000000000000000000000000000000000000000000000000000000BC19FB04A810C094E22F9066F53B543882E9FB73DECE76C5E8EF1C80E347AE025AE6630DD39964845388DA875D97EF904CE60153EB92A435F192394F7DD81C00DB5996793AC5EA7E4002B8943A980E8F7B823879F360ED45EB739997F11CBFD1C5CB616026BD6C9A1ADAFF1DB2FEF5E6D7804C60672FC797A9BABA366FF305001A0BA394FE0EDED60A3DEC9D7F4F5B7D095F70DE3B4369EDBABE9FDEBC4E44505F78437D0989C85119DD9DEE782426367A494826E80B198B76C9BC470BA009002B657628D2DA7A15716892E10A1FC50859F8D25D4B7304E22F3C901671EAAF4A23ACC5E06DF330D5DADC9AAA9BDC93EB47CD2C0FE6D547F1701B379D253E2000E9B13741B46A1AE07942A2AC7F9FF57ECDC79629AF0009A06CFAC36B46F9AF010CDEC52B5454D1CD3FE549B9447336E143807C3217D6D05ECFFA5ACF04AF0100FCBAD408BE9591E86152B0B4EE647016CB1B1E4F892A04697DDDA11F901F80C22BED51620090149D135C4223202A29F8D7F86BD3BD002B1A1F8674ADED0108001E62ECF464C6B8E73501A5DE6EDCDBCD5D238E9E202697EB412AC0DD4D34C3CA9251A693D481FC6B0E197C3E857E19FDF2B6AE3653EBED3E4E1FF185F57A1A000E16998A2AD43D1B49C487751B3878C49FF3D536AD7B3CC31B5E4FC3CEA60EAACA979252DDE95E751EB91C147740998FD70893BD03BED10A71A06D043B091600C2FE0F225EB09531E3CC6F6844829432C81CCA7B58B21958A71E2F6C6DB9CFEF3323780AC4843A4A1EC4BB5744F0EAAE40B60333E610131E987209F3DF9E1C00C204C76721B72029FBED9B1BEB5A37ACB95F358922FC2F8687F0DE2243A0454259C0FD7221D1F34F125C3154A1E343E9E11762BC0E4AAA7FF5F02706DC030A000924FF08CC6E5D426B34FE38A95999F05AC7C45093E8AF985EBA63ACFB085B82F51C3FEB363987648283CBA8689D76524B8AB04D3A24D409BF0FC830D2430D00E08DB87244810921ED67E18D5E06164E2C97E4F1D5E1AA9F188685A74AC357F6418D5FD5CD1685A5CF2FB0A161B5B086FE9BFEF560FD403259A407CACC43230097CC43C2A13053FF14DA7B16B6428889B73339BAB3F78884E4A7E294AA87C1DA48DEC64EAC51AD4C3134165D645C095A1A495F18EE1F65E70732FD0A988C12009706955E69EA9A6626F5E91BECAF9E4F4B5398FFBEF155075F1C210305794342F995DDAE9B747B132D4B90FDF7F9EF3B0FA91050CA1974BDCEF1354E6CBC1500 -smlen = 1952 -sm = 11E5D764283162B1612C57657050FDA0C23D012AF4ABB0965718AC2D8E5F06622FBD9ECB3C00F7FBB9DAE69D5A7CFE3C7B1450AC391684A900BD36F9DE95BD9AF649A080397CC9163F919B00F5F6C2683C53E9DD03A0F7CF8BC3A0075DB300D8FE5631DF0C593C92E04EC60420680DB57100D86588C58FEDB7F198EEC0751D7E0D0C9665016ACC87478726792855B7BB088D406B47867B015078222997D46CA7C966944586F9B14590F300831C47BC17618BB902D2C67272EC83E21CF001015B46B0BED705916648BA42FCFA4CE0809101E7824F4604C4100F680DE63689150C870BF8005EA42E140FF79F60FF7D6C031551CAB76EEB018C76AFDC7E7357BF039068E306EC8A462BAF0101A9BD03AFEFEC7CD1E0908FFE1CD5DFA6F8D0E369A36904D82D0A3F63A17EC5AA0302E04809F08B05C4EB27A49990027C7499286F01D01A66003E9F22088CE5B27B3D7C03EDD4DA833528B0511534F77857FFD16EAFB1A2AC87E6844612DBB104B9F32025B7F54E993D65CE85A061B6AC6D70A15BB42BBBBB6E2E21AEA55BB8A556120EB15EF35FD9774FC7B5C2894B747D3E4965B77DD8D5B26F38D413662783DCD332765B4DE534D08D6514CA9DC6ED7F2BDB4B5C437178710B04491708836CF2CCA08F28582107D27AC305EDE6030B1F8AADC4A1D29AD16CB4D739D8F813D47DA715CAD6B5CDE24EA95DFF4415B527DD900442D9ED1CA712C58B206D6E79F8AEFB882013358BC578638225BE79B58FB677277F072AEBCF8CCD6AB61A9D98A3B260E60AA625D78058FAE6028E4C5562A0F3473C3AD530BC4471228F27502A8F8FE2D1F72022103C3A2DEA363E68248ED8693B3B066B495561CF4468E8EBF32B454E54DF1766468AD3831D56EF7EB9C231E999C4CC3A6B0EBBF2C4F22820E256F67497427F53AD22D42C9293DC8682D0BE3517B63C6E871910ADBB3406B6B3B1CAD980AAE47BF9686E80B6E5DF2DACCCEAF9506B4667271779D00B4C1065951E21F2ACF6CF3CCCB8A633D1114CE9D531D94420E4AE496086638F031C0BAAB5722A41A66788D3885EFC7FE1C3DB54BC69E35B7489A0237A37AFE5194B5F424F792CC1D696098BCF327D87EBC50429A95ED82105C4328D0095A9775589FDB6C262FA51FFEE4D99C6D1A68FA661D1B6A0A2E0693D73B39218A6895BD83FC1D54831B7DF146FE7BD2A91B979018787B9904285A35922E22A7F1761BEA541EAF21D74E3A2F3C6F2247B042379CA4C553FD9256DD0C63E4C9DEA60912D02FBE4CE7762069A86CDE02A4E1E311B2AFDE435DA0816ACA659BD8C0650C1F118C0EA3622D72A5E96132F8B0FF8458C757648BD46E58195FAA0FC4FF8FA44238E35A25C9807B6229000EE560D8E085F27375C2F659BAA5FDE302B9529BF4699505C28DE33AB5DC2B8C02967947CD24C6A599ACB5C2D1E7D6BF3BCCEA0253FBE11D8043FED532AAFC9EE1151243BB80B92BE239BC4FD1D1CAFF502951205F2E6393B704E67141E1218963F664FE0759C15E6C0A1B40602A73990F040502867A9EDDBD4DB0E554AEA4BB9597949D5FB32C2E3AF92CF7816BEDAD5EDE1B769C823CABDEFCA1D1B85213C79EB03E065146B58E3BFBE80B4D4683B65AD1E0611372729B99A0B93934D52DDE40C19FED5A2B3DC3030E0B5F26B66474A5CCA6D741AB294BBBA6BE516105C08BDBABC97BDEC2141D035BF6C3A71553D6F6350229CA2626B8B0B56A24F2D6EECE436ECB77A70D747B6A6F830578B4792DE533879B174353424E7D0EADF6BD5A74B36A4E6EA7E39A4215559557BCE7A00FAAF0D1F81016F913A10F3C9F406C7CB53282CA8FD5FE4F5FABB96F891583E0507912BA02709764694296A5248C340A1B9EC3DB0F926F438CA96FECD40C4AD8DAED9B8A29691601835FE14283762236EF2135443307E5F0082D1C2180AE96ED0DD99A6E9172088E8B94AA2952BA5E128B202B2CBC1966E69B6E6384820D9AB624BC71788EA84B4ADFCFAA2EFA1DDAA8855D1DB3F58EEF2D54FE11A8A5D78ED46B58460E6F2FBA6CB70640700A4520AA1A2A9B336AEFB17CDE8AC78D67F194662642A0107CE38B74D731380A72AD4A0A068F09E0878E521F15CE8134780C3FD0CAB2DC2473448654F88BF1FE2020901B90C0ED670866B1BC337881292FBA885FE2BFEF6FE74765CA12372C8CBD698AC41A4C337374587DB15AFFB511D8C224F1743498D7173897FF5B8D070B89592BEBE053D5C10DCE67CA8542781AE749F3A42FAD7E4A2004A565F81D5FAECF11115C270155FB8AF6AEDA138B9C71458D6D2FF63441130EE9107C39260469521E020D2B42CB5A51098027F23890DAE8B28BF722AF9ABA6224E02FEB47E40112CCB164E8CF174BC9AC4C11AF9B482DF9C9F7F5F1B826428C21BE395EB1F07DE511E8258C84F5F035F4787ACE18C190808EFE99FCB455A54D366DDE2E230B575ED5A4A75D57C9A38DDE3D91D0D1A1C4DE7F277CAF23E0C5DD8E3B693DBC66B6BF1679B0AF74A2B9065B64CF0978115CC456AF685B22D85135727A8AAD96338611DC109B36C85A92E4A0180AADD1D25C5B3D4C681A44BACB953E50F994FCF5281366CDEC0CC50976074D91840B5079180CF643184ADCF9E4CCB44328E7BB9EB2BD06DBB7A757C35EC3DCF795A5E05ED250159EC453A1692426F624CC0737F691E475804F155E44293151E42D3C0F115ECEE53C6EEEF69788F7E8E5C422BB102237499F2638244C0C080B3639A49FFC1730EBB0CFD8A46 - -count = 49 -seed = 8C3D2FBBE0D39E293AF2D2CC5A9BEDEAAE3752DFD19CDC1E186D41E717A0412AA429CBDF005445AFDE684656B5D17690 -mlen = 1650 -msg = D868EC985F946F3C31B6CFE4811BA530EACD0ED061EC383C203B2481AC697B8B88BC0F72B635027E443AB1F54478440DE16E596D30A0F1252E0AF54C0F382BBF5655BEA8C6B9A2F6382D003CC7E4D4F223F8E35EC87CC543EAD52E0E1ED956CFB32E8075715C07CA4817C4B8DACE68C8B0DA459271746BE41D6102B3FA5E49AEE8D443E78AD3246D0B9BCCF6AB7CB7CF72B8A847CA16B435F0618594400037179441F3BF524231F747D920E86506E84C61D4D038D42E82D52D97ABFF896C1DB1C646807156324F7B68DB620EE435C7B8C9AC8B193B7C892565C3631E297495BD3B59293F9A9CEA5E29E23A242B81DD05C8DC9DD669424573298C85870B109C7B593BF864B56895D81386466CA5CB6071005781FB214F1EAE9672D0D16351A627A3FAAC49BE4E13D552340328323CDCB4703BBE07C2A39D75D7737D5C1BD04355B8694432DFB7CB4F1901550C7D6F41080C0F6A2CC49D63A69243D137A78260C06E7A53AAF4F4B086E0220EBC5361A6A78C9B2EC09C2EA4EC45A41065B4B2DAA866D9BABD71C8E6CB378595F068EDB258B2AD1F420B304E5924EBE273AD6D00684F75B6A31DC5290A37D0F9A848B1FC4A67DD9A4FB1F9B4C6CD45E87FAB4A09129C9AB95C44703B75B54C9EF9E825928ACA56527D79B338C5AC639D0265010F3C085D2B09AEF0E4F55D080FB5FF79F13E8E4E8DB020F4C095140D46A93F2E4811BFBC1393EC24F6B7EF31F13623DF0360B1E335FC42098CA1EFCD0306C5FECCE942F6E299AC9ED81054FE452D3F63991DA42D5680EEF749C02FCBA78DB5F4F7C734C6B4D99AF79711A0BAB723C24364AC85700242878CCA93465F286D5F7ADAD7F68F1D38CD6C6E0575A36F1E5521E420D348D947E745C2355FB5FB0F12DC6FB5E9435CF8E552C174A617151AF8D5E7D469AD5CD741E16EB88EA6D7C5806B08571697D22A525C2E30DFF608C921B955D2A990D9466829385DE0A81875BE564942AE740D15AC0AF46A876426EBBE481738BE19BE06F174D975AE8DFB52A94AF9A77E56267C0BB62169165ACE155041406CAF507146A02FB760629CC4C0E7D29108CB7C779455A3EF359BB6198AC75E16148998C16C9410DFF2DAE5F3C79DA61D371992D4A151BA91DAE8814C81EEA4F78D23871326BAFAA349C8EB57231B590F1AC13F599DF5B39DF36455F05E53CDC4D025410E8F8F8BB74854FEFE0C4F790F58434309D36C1E7F3935D4F896368C91AF95EC2DF292AE3166B83976ABD95089B05B461D4E9171CBB4747F3CD9BAB04E5A3B98095754021229B4B820EBDE63E463F2EE479FBFD83CACC61878773B129CD4B3E9AFBAEDB27C7FEDEC2F2D405B99933FE2C203D9949C567A7752AEF8A7788D2375900E70315823DACCD4F2A674196835C35EF813826B310346ABB16B0145CD70FD0A04611ED5AD0B8DDFCA6EBA6B93445038C3DD23D3D15E8899F9C889AF417E5662D538E466447E514A8897C21FE0BE2EF18948B66EB04051C0BC961FA485422A66D649DFA86D4B3DD504A89919A9928EF96FD467713DCCC1F19EE69CE3935F0416D9C5752B7DCF9272D2DB86C3EB6F4897D94DDBEF7C483FCC66232E535A8B0A5AA4BD443493FE539A32D433D9E89F7758DB5B0606A96455B39F92AA788FBBE43CEC8F1D36FEA3ADFD0353EA5532B49A7286381D985E018E6534005F605BF67AB4AAAFDCC499AC0882FCD9D90BD88053CFDADAF466E536F2FFA7F18B3DC254E42FFFC777E0339181473E2B7FC844B687ECCC0EB543A54211084B1EC06B0D9EB0A0C96B88D6585F414873C13EF7002AF2D47D5859A23D12A7D401FFD4BCF642DB96C70FDAD0CB03A6098437795BC9C7C6C804A26225EAA53F52747F01DB4E62471A21DBC1DED9C4DE2508812AB11F61F6364FCFEED445FFBA549E45E641A80FB4B58EE20677C7D6CF0526DBF4E26D9E5AFAC5429B4474DFFE709D09D766542D65E668D59C836BDFD0F78B846BC412F29DA00291871D94BB5E6557D833C8DB3D9BEB37888C3A70684ADC6B063FEC3D847C42E0CE20E05482DB165FFAC5D1F2C661B9DB6D19FB3E8909587351B25F2C225CB26BB137BC52D04AD8157F7D634F29A3623B4EB53B4EF9A78945280BCA8C5E1882FAE373EAC69EA366E2F13A9FEA75A6B7EB5CD4D9EB14F68A231BAC780F84200146CE7795282952382E2393F0C2A99DE830D3AA517DAC4AC97F2AAD3F7F8E3B49B22B078E3708C9CDD1B2A2A129656066C0030D747EDD646384611D4ECCC5B0B9DF4852AF7BFA94F6DD7584F6285CA2EA7ED3F8DECB534E6D31D7165C609FD9AD235F5AF8E4E8E58FD3D248D822C202 -pk = 35F4809BE314F83D3A9AE22AAF7AAF8FA2F886D7AD7129FA324A6697179B0D380EAEEA89D90F4557B7E4A36A18EF50A52D2F81730A7111C7CA6DF9DF1B98010020DDC6BFE16DCBDBDB8A095930ABF46F2F04BF7605A20C26EA2D93D7FFC6B4DAA5E470F52F5BF8B4133D63ED7015940547967903F08EC4897DAEB9F7F1952200 -sk = 35F4809BE314F83D3A9AE22AAF7AAF8FA2F886D7AD7129FA324A6697179B0D380EAEEA89D90F4557B7E4A36A18EF50A52D2F81730A7111C7CA6DF9DF1B98010020DDC6BFE16DCBDBDB8A095930ABF46F2F04BF7605A20C26EA2D93D7FFC6B4DAA5E470F52F5BF8B4133D63ED7015940547967903F08EC4897DAEB9F7F19522000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012197129727D08CB9AC68B2FE715618CC008E05DCF0E25D25F109B07DC1E73A27C1724E499471F8FCE75CACD5960A2E175FFC68D927AA0E2461AE1F59E89C3F9406C1C8C8455F4F3D0E28E95FC982E4720C37FE18C91250EE600000000000000005F995BD8C0C758321D2BD2A6C06682CB3FD70C779EB5D4A6B2E7E975D2D340B78EFDB3C8144CF380CC3C8C03E3833341A4108AF4D5D3B67668FA3FCE408922B99ABA4BE13E504447F6ECFA91676D2C29B847D3D06AFA9AEC53E5FFFFFFFFFFFFFF713A965CB51A0D656CE2F4FC441DF10D7BFF07F5F59E82313E5A1AE82CD8A3D84F2D0B5C7B546F3BD631C7AB4904BDCEE994146D8D9EF57D7DB0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66EE80C21E17CF8902A197B7764E782FCACD25F8DEC741C52AFDB055A16DCA0FE771E259DE14FAAF4278A793D7D67A4AD1B2B8CE389E9A857418020000000000000000000000000000000000000000000000000000000000000000000000000000A8F6C7DFEC181DDBAEEF9982068D3175195DEB723956D9CA0B10424D9F910DD6B37834D68726B890946973C445B743742F0F62578A6137ED1997B78110940300D602B47D7D477268DAC24DE457E2B6A142580DE460FE2F1A49916DE3A16B7E2FA3BAAF4C180E0F84F80A2D618B03A5F2BA991F04F92BB9EC96EC0134B56122003D4BFA0FFB7E93B1EC1DAAD3AC083714FCCC381E5DAAE3E3B5CEC7561CF575FC3CAADF1FA0DC2392E26D0D9820A5C02460E0B857D760F868F7D19C23B26A0F0007B5A9FB02C8572127F499F43B38959B94E552205E34081EA43A02E1E403C1362FE2586784F827594E43D636CF6C239995EA7B9907E2187B1ADF8A459FC9190052443F2C3E358B9D283B9CF185EB9983F666861A9ED74E444F73CBF2AE5A2A41F18EB5F816F0F857F68A49277CF3C231D5641873E156BAB1FE140BD41EF40E006716CC10FBB90BE8EE08704A890E8E62C46CE76B16079AEA7123019AD6B7903B28964159BBA3DA72B656C5819C0337D089750BCC81ECAEF6628DF497C5300200F6DAB32C90CF622C7FBA8546B879DA32E0B4524682DBC4563119CBB416903C298FA412F2BB93793E248826D671B039E17EE8608C3BD5DAA951B5069196D01C0094B35B5141FDE6403470F5B651CC3BB1E341295AEE8AEC2D08BEEB89A77AC8DAFFB6F21B76EA874D97BC128FA23A679E488ACE94E32770DCA0E761D81F602300AE3BA322F4908367013D119603A6D7FF48EC7B7EBD291EC588E25A063CB6C66669FD1A579188DBB138C003012ED3CD470619FE92F3EB83FF9B7CC0FA861F1000407F8B2B2870902893054A62EB42FCC33465A231B3F6188604F495BBF93CE0BA7A861E9D6935AEFEEBDACF9259BD3BACE3179C85A7E59C358C57C223A60A1E00C2563F9D81132E16573060A3F1770E9AA0B91DE2655A6A3073FB624F1B66A5A03070BA44F6FBA98CA54665F123111B484B5F076908F27D1BF2804F915D7A2000678E40AAED74B218E55164D6125C34C0046125A8412B7823AC7827B9ED4B95976A33C16FCF65EF0C27123649E0D1AE19746187BCC14CFCF37EB5B0B2A5672400A22586588D532FFD14A8B34DAB1BB11A70C69A0814C87A825F3AD3E8206A3001A1FE03D745EE3B5CDFDCB6349EA9967C49B2621B4CEF84C7895F43ED20871B0035FABE9757D728C37739D00FAC7844666908378684A1E1A502BD55A286F12A6E4D56F9F1A06AEED699A775B8632304C97BDD5ACEEF5B5B9C71F0F5D914240800 -smlen = 1985 -sm = D5A2FC17F2F7721B8A0AC060C545D530FE3D015083BBF258AFA455DA924F70DDA93B663C740169AFD3D3BCA5FBBE86D3A64C748D0FA59CD300AA4195FAA74D8DD5CFA5F6E2E64DC6A4B83A009FE80FE9B752B60AFD0624772A82EC123ADF0148601AD6B995FF6F11B08B71AF2DDF14240101313BCAA47F044AF47532B792D5F137F467E100570C3B0AF92E5426BAA8D2943FF5AD0BDF8D0008DBBC472735506658AD97395B0175148A6C005DCFDE1AA3488CB21975BBB2EA19588E946D01D3D23224117356A2207606A6608499B3B0100185E3821E50BA188E53BF81CCA5D1DF767B8000A0728BB087AC6D13EC1786F744A1E7BF5C5C00D45F700F2F4168309D82EB829681D0DF1CAB01013D1CDD1E92B92691A2FC67EFEFC4B8530BA240765D3CAA0D89A67976D11197CF0403E49B220C77BAF73832651EDDD4E3FAF25C51001E163C7A9650518B5216C30D092B00D868EC985F946F3C31B6CFE4811BA530EACD0ED061EC383C203B2481AC697B8B88BC0F72B635027E443AB1F54478440DE16E596D30A0F1252E0AF54C0F382BBF5655BEA8C6B9A2F6382D003CC7E4D4F223F8E35EC87CC543EAD52E0E1ED956CFB32E8075715C07CA4817C4B8DACE68C8B0DA459271746BE41D6102B3FA5E49AEE8D443E78AD3246D0B9BCCF6AB7CB7CF72B8A847CA16B435F0618594400037179441F3BF524231F747D920E86506E84C61D4D038D42E82D52D97ABFF896C1DB1C646807156324F7B68DB620EE435C7B8C9AC8B193B7C892565C3631E297495BD3B59293F9A9CEA5E29E23A242B81DD05C8DC9DD669424573298C85870B109C7B593BF864B56895D81386466CA5CB6071005781FB214F1EAE9672D0D16351A627A3FAAC49BE4E13D552340328323CDCB4703BBE07C2A39D75D7737D5C1BD04355B8694432DFB7CB4F1901550C7D6F41080C0F6A2CC49D63A69243D137A78260C06E7A53AAF4F4B086E0220EBC5361A6A78C9B2EC09C2EA4EC45A41065B4B2DAA866D9BABD71C8E6CB378595F068EDB258B2AD1F420B304E5924EBE273AD6D00684F75B6A31DC5290A37D0F9A848B1FC4A67DD9A4FB1F9B4C6CD45E87FAB4A09129C9AB95C44703B75B54C9EF9E825928ACA56527D79B338C5AC639D0265010F3C085D2B09AEF0E4F55D080FB5FF79F13E8E4E8DB020F4C095140D46A93F2E4811BFBC1393EC24F6B7EF31F13623DF0360B1E335FC42098CA1EFCD0306C5FECCE942F6E299AC9ED81054FE452D3F63991DA42D5680EEF749C02FCBA78DB5F4F7C734C6B4D99AF79711A0BAB723C24364AC85700242878CCA93465F286D5F7ADAD7F68F1D38CD6C6E0575A36F1E5521E420D348D947E745C2355FB5FB0F12DC6FB5E9435CF8E552C174A617151AF8D5E7D469AD5CD741E16EB88EA6D7C5806B08571697D22A525C2E30DFF608C921B955D2A990D9466829385DE0A81875BE564942AE740D15AC0AF46A876426EBBE481738BE19BE06F174D975AE8DFB52A94AF9A77E56267C0BB62169165ACE155041406CAF507146A02FB760629CC4C0E7D29108CB7C779455A3EF359BB6198AC75E16148998C16C9410DFF2DAE5F3C79DA61D371992D4A151BA91DAE8814C81EEA4F78D23871326BAFAA349C8EB57231B590F1AC13F599DF5B39DF36455F05E53CDC4D025410E8F8F8BB74854FEFE0C4F790F58434309D36C1E7F3935D4F896368C91AF95EC2DF292AE3166B83976ABD95089B05B461D4E9171CBB4747F3CD9BAB04E5A3B98095754021229B4B820EBDE63E463F2EE479FBFD83CACC61878773B129CD4B3E9AFBAEDB27C7FEDEC2F2D405B99933FE2C203D9949C567A7752AEF8A7788D2375900E70315823DACCD4F2A674196835C35EF813826B310346ABB16B0145CD70FD0A04611ED5AD0B8DDFCA6EBA6B93445038C3DD23D3D15E8899F9C889AF417E5662D538E466447E514A8897C21FE0BE2EF18948B66EB04051C0BC961FA485422A66D649DFA86D4B3DD504A89919A9928EF96FD467713DCCC1F19EE69CE3935F0416D9C5752B7DCF9272D2DB86C3EB6F4897D94DDBEF7C483FCC66232E535A8B0A5AA4BD443493FE539A32D433D9E89F7758DB5B0606A96455B39F92AA788FBBE43CEC8F1D36FEA3ADFD0353EA5532B49A7286381D985E018E6534005F605BF67AB4AAAFDCC499AC0882FCD9D90BD88053CFDADAF466E536F2FFA7F18B3DC254E42FFFC777E0339181473E2B7FC844B687ECCC0EB543A54211084B1EC06B0D9EB0A0C96B88D6585F414873C13EF7002AF2D47D5859A23D12A7D401FFD4BCF642DB96C70FDAD0CB03A6098437795BC9C7C6C804A26225EAA53F52747F01DB4E62471A21DBC1DED9C4DE2508812AB11F61F6364FCFEED445FFBA549E45E641A80FB4B58EE20677C7D6CF0526DBF4E26D9E5AFAC5429B4474DFFE709D09D766542D65E668D59C836BDFD0F78B846BC412F29DA00291871D94BB5E6557D833C8DB3D9BEB37888C3A70684ADC6B063FEC3D847C42E0CE20E05482DB165FFAC5D1F2C661B9DB6D19FB3E8909587351B25F2C225CB26BB137BC52D04AD8157F7D634F29A3623B4EB53B4EF9A78945280BCA8C5E1882FAE373EAC69EA366E2F13A9FEA75A6B7EB5CD4D9EB14F68A231BAC780F84200146CE7795282952382E2393F0C2A99DE830D3AA517DAC4AC97F2AAD3F7F8E3B49B22B078E3708C9CDD1B2A2A129656066C0030D747EDD646384611D4ECCC5B0B9DF4852AF7BFA94F6DD7584F6285CA2EA7ED3F8DECB534E6D31D7165C609FD9AD235F5AF8E4E8E58FD3D248D822C202 - -count = 50 -seed = C10427EF0B26328163F85D45E22EC5215415326F013FF31EDD58BD3E97B1A72FF07D275D4C1B517F4661B0638F75640C -mlen = 1683 -msg = 4BEAF8CC3A7C393932CD37A2CD8ED790F05E4038ADF1287E2ACDCC0BED9BDBF92CE44AAE95CAF4EB142B858E1421610EAFC47DE566182835BDACD4C836F19BD686D53C3834EFD928487A2AB3402C2E3AB3AF97AA802B05223CA6927722C3BD1FE3F8C20F93C3951F907314896CD21CB99306FD7E5B6176945C2898B10C1DF62FBB2680752CABC8980B5A0430BE39D34BB7DE9544BCCCBFABAB709C11BFFF5C958C8763D8D5830235B49EAD26C834E63C3F3F2D6BA944FD2688F6350EC99DAF4CCCC42C6BE1CB19DD46514D71CB6E887DBA80EDB580B27F1142A20EA0D497E0336D55F1FFD4BB3D4B3521F0A01C7BB09258971D1ED4A98EC052B24776623D7B9A83C818795E3989EAEBA8C9142A97AFCE855CC6AC0ABA15F0546684AB5C2F48B23BB72A88B6AF2BA9C73881103CB6FA99E3B03119EAB03BC3B9BC365EFCD7B9F49A8BAB6A34A00AA8F2C88D7BEBBA808BD97111EBB192D82AD244E18BCA732FE6F72FDE5BD533E4BCCD3F50332DAD3A4169EA85C324D165413F10888AC3B21B91DE09FCBB9B636ED00FAAA669ABF6429B78C3C04F239722F31FB0B1A20CB1A6B553908070AC13521DF66772A6036E6695CF66B9A90E2111E499BCBF5DCD19744F43DEB943445248A5E84F168E7BFEA2DC4E1D0A87FB4140EB7C72D2DFCC27923206054CEC870888A79938DACBAACF1F122B22AB5C9701D777BCF9809CEBC9B7AAC52468134FC4A92C2BAA9B8C0F6249130A50337F460A42CB5364A5E7408CAEF8D12BA6934AB645DE9832818F9DB71F5EB0B158DE6A76619E75245B56020E1664D8FAF1C1782DE4A688D4055E07D842410600E9454E28676D44357853FFA7740200C91EAFA16BCA21D0006F47FE8159A733E0E91549DF434EF316E1DF9BB97DA6A2C2E2F20A65B3C00041A903270CBB55AE2432AEE25C71CE73BC2322CCB8E5BD0E24820616A890B0851D825D79411C14948DCDF48776D72565422056FE75765E50736C82F71270BBCF229A7B7A45DC88AADF4F84238C896DAB889E16C17DB7BE551AB24873FDA82F102D0FCFC139C9FEBE9FA99819CEF0E2684DFC5C843A6D496D8A595D33C51E1FDE9A84059C7BC596D32D53E2FE046F23FEFA51D13F9C28E227F5E24429B851ADDBF578922AEB0C5A61BBB666D11D127BA45C9E6378C70D75643DE776483582E034E81FAE0A3F029C47FB192CFA018CE1F68261D77CFC9E05EF19438E47F3DE9A68C8DC09D07B1BDC6CED69592623750F72EC2FB8C5CA981DFB84B4BF0734377EE9DD8EF5DDCD96F438D30AB78F402EBFF2163D43345EE8CA119F3208E21AA3A2185DE967B475B9ABFBC86465275F9A634FC22015E94A298E9C204E9786CB1FF14A5E99F942D42AB5DF51AD09654083DF0259AA1C26A760CCFDF4A276600C5FD3A54F210B20731941EB48A79435F1F86C45F8181D9758A1835721B87D36C725878375FEBCB8D48ED2CE8892DB50965753A98F4E7110281DB40ED64DD8EB51AB9CE41042589152D8CD5876FF30536F8955172A7A8F5C3F5FFD22C9954903136F781F0574F45F909BDF1657FC1CDCB9C4689F41E462C8D39108B10D78B6892C8775FDEB139258F8130BD1D2A1C72B5026506409F9862AA8729B35C652074494FEB84A553CEFBEED19D6EE94758E800F5FCBCAEC19B6A00F33EB237AAA6FC0B3A08C1D8829C180BF95E7D05F919A929933B7A032CD20ACE82AA5A45E5B2FB09812F36974B5EDA1B387FEB13BD49AC374F821341282C8FE2FB0CC5C075356833FF8CC6B648729A4298ECD73BD0EC73957077AC65722D0BE23C1536B8DB7B0506DAE47C0070564E7D7F9444F47B22C679EB8ACA4826F974A42043863E498E5301EA162C4E96684ACC5CA26CCD083541BC4C1D2FD690E51F07FB08337450A204B0F4F2C17785E037424FD6E78746764584D5F19255496DF1E524BFF0AAC31BDE9254429565278A39ECE4627C023EDF18BC21BB523D44EFC259742DEE9FF7159D5F700D957CCBB505A88C2037629402C2A322D17647E430777B184FF7B4E8D6B94724ABC36A5CCFAC08E2479E8310BCB7A617A25FAC6EFD10D0A07248F7D4597F14309B8064FE3BC4A4479F905E832210D49363D1E5D58176DEC9ABCC0C5132FD6ECCEAD2B05B56C96ECBBEB0B803E43DB2F982AD9EFE1E2A49649ED8E42707970C93615D54A3E673559B996E48A3B73143BA0884E918888156CA78F793DFF990FD721DE0C0B7916A5CED736E31292C5AF062D7CCD83FE653294FAC8C50CF6BA37B37D5A9BFD1E3B92D1825C1BE0795F9B257CDAB91CE99C0C51BDFCD6C0AB5A3BC6E30F884ECB4F1F61A3259CD279205B2C21CDDB196360061758E67B1C3724F5CB6311EB4FB92E6C0D71E6D1EA45 -pk = 0F35D50B6D7E29FE3CEB22FEC8957136CBC6B7FF37EA74B4A03E9941E5C2AAEED1DEA36AB555E10822F46EB51EA08E5B98208DCE5EBA05F78FE20D539DE91D0059EB7176840C698C355A7C6D52592A7A3971945313CF1EB666F53C79881D0D9DBD6071428912D8AE9FC347F47AB03A948B96FD97A31D7093AFFADEFD40401B00 -sk = 0F35D50B6D7E29FE3CEB22FEC8957136CBC6B7FF37EA74B4A03E9941E5C2AAEED1DEA36AB555E10822F46EB51EA08E5B98208DCE5EBA05F78FE20D539DE91D0059EB7176840C698C355A7C6D52592A7A3971945313CF1EB666F53C79881D0D9DBD6071428912D8AE9FC347F47AB03A948B96FD97A31D7093AFFADEFD40401B00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008BB817AE6474DFE96682D688655DDA79B8550816A3264A4F4E72BDFAF8A9DAC47A7DFB2355109AC7B9748A35B9A9CC820715F20B32F8EB4EAED51E4A1064DC099671AAB6661CF3F333EB17A11354205C91F0E5C169AAC30D4E0E0000000000000040F582F4E54C005FB7DDF9894CE287C93D3EBAD1AC8C04B81EA63739626D9B7050948FF7029CC21A592D4C4883425B4394E933D743DE8280B6309F2DA3DD6956086B3CCE97FECD44F03101E66A9067CC356151FED3B0DE795DEBFFFFFFFFFFFFFF189CEEFB00D5495735B7090B0710E0A7E02B9683A8A1DD2CA855E3B0F6239AC9C43594198473DA5FD0BA0BFD1776916CB38E6073DFC1DC16DC14FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD56C2A659D7393E4EB06BC5FCEABA3609A8CD98F3AEE796766605473D907126BE53E41BF1FF1774D5F72207DE99DC9DAFDD496DC00C4FB64730B0200000000000000000000000000000000000000000000000000000000000000000000000000002B66189B37756F193C33CA686A19F757831A8B1ACE94AEDC7FEAD9CBA78A2EE2DA830EF5A312482360CF18C4F17B40D024B58BB039A66EA147BFE0D3798F2100D346F545C5A196F46D48304D2CB5477E3D0E27B44F75B9978D05FF15765F1B3D839A618059F79A8560548A7200CA144817BF83139EA4115F0DD623A16926220040EFB29CE09F5667BC9F362BDBBE8EA0C8B43E25E75807F25A2FA08883BC25110F46AE12959144D126C02E6A0D02FFFBBA6E11D8C806DAB0C69DDFA93689220047887655DCBE435AB45008EF1940DD679C90C0DB166D8E81CD887F8D5D64AF9F5D3AF5C12AB887671D4F7538D79B9BBAA3692A2EB4DB9AE76446622F90520B00C23324CCFB4D7F2000A2B3A5E0E94700E78CEBAC0C198C810CF7681C9973795BE2195F80E8A9E03C64D9552FC063230B3422EA5463FC600246B75B1CD8B30E0010D8A5FAF3C942FD87D3564210137501A1DC075D90CBA073CF3906BC043E6F2B658A52E15F5DF54A6BBB3126DADC11550FA9127219922A7A393B794DA34108007D93338F02AFFD1269DB1481E4302E882379E13FB864314D1A90024341E6CA611DD094A454C43FDC950480143F587B078E94D172F41E7F87822419B24470110071F2E80EAEF343567E5FB67B53A5DC42697D7F1F6EEFEC9CC0B17D3A3C1D1B8DCE7D2092CFD4230553A65A1D687E0A2AF2118315A3910F6D6A34421954860A00E9E401704771E80E6541FE4E0BE8D59EFB5186913FFC0A63B548E4D72012F4D30A16523489FEF10838D03CA9D5DD788305EC866AB24F0B8C82EAA64DF9E32000AA0C43D26FF6A9A6037D3F86702B69AFF4CD5D9C3BEBF5EE881E52E20D065B7F35FE23A1BFEE95689830173D33FEEF2D5700E6D5D85C752491409625B2A00B00FE10AF5FB2CA0D31163A4DFB4C23DE394C8CF1A578C4F6A6C9F1C1866C29BA1FE4847F0C320617C19ADF82082B6BB42F1766849521AC82621F8F7D880F261900A5EF1B2144B744EF5B33C5396446DA496415831132A6ACA449F1D2DD83E1D5B6EE368F2A66D5C9E6F9F34DAF2D3DB23410C68CA8FAF27FE005C949C4CEDF0D000F74586F4B7F5EDD0EBB72BF6DEB00DA39E0F58A00BAD93B461D4613BB89BD3EE97893B1AB97B727B268C423C369FA569CDDE33731B5C48DC3F5EBC5CBD60A00CE9A05A071FD51AC39583B30206AD116B2FA36CA65838FAAE1A07826961711CFC4AD8705D12A7E929AB9B45D7B6C4AE2C4A580CA0AB497BCD4BC482253131800 -smlen = 2018 -sm = 6B4CE29DDFAFA246132712E7965F4E8066FD00D3E4CB36B115BA06C354A0F3091C5246CF9B000C635D3B72BE1A8BBBA947FDD985D8E0C49C007768FF801044DE8F23D39757DD50EE4B44AC0138A544A7D824A74FA2B8A24F65992F22341501DD51F0C4918C1A86710074DEFE23F227726A004F9F3FCB3B4CC3513B418E93946F0FCC685D0063138C599A73B0AA48350E68AA0D611BDFC6005C4E0CBC90E4371ABF9DD59BBC1EA2F5B2930001B2E2BADAC2EF71E5EFA65DE44195679395015777A63676BD4D1763FB1504DAA09AE565A1018BF01B34D026F97D7523BBC36CA4981A6A5100D509DC97E1BC31B7E51F64415E8CB74AA84C01EA36086ED2A33145167CB73C8D3D178B1A6D000149EBB3382986B2B52DEDBEA0A236674C341F97B35D8CFBA8B5F0E03216FA3AA108016884A3307F33520AC695017AAFF528B7FFF60186E14FF636031E040082ED46DB9C004BEAF8CC3A7C393932CD37A2CD8ED790F05E4038ADF1287E2ACDCC0BED9BDBF92CE44AAE95CAF4EB142B858E1421610EAFC47DE566182835BDACD4C836F19BD686D53C3834EFD928487A2AB3402C2E3AB3AF97AA802B05223CA6927722C3BD1FE3F8C20F93C3951F907314896CD21CB99306FD7E5B6176945C2898B10C1DF62FBB2680752CABC8980B5A0430BE39D34BB7DE9544BCCCBFABAB709C11BFFF5C958C8763D8D5830235B49EAD26C834E63C3F3F2D6BA944FD2688F6350EC99DAF4CCCC42C6BE1CB19DD46514D71CB6E887DBA80EDB580B27F1142A20EA0D497E0336D55F1FFD4BB3D4B3521F0A01C7BB09258971D1ED4A98EC052B24776623D7B9A83C818795E3989EAEBA8C9142A97AFCE855CC6AC0ABA15F0546684AB5C2F48B23BB72A88B6AF2BA9C73881103CB6FA99E3B03119EAB03BC3B9BC365EFCD7B9F49A8BAB6A34A00AA8F2C88D7BEBBA808BD97111EBB192D82AD244E18BCA732FE6F72FDE5BD533E4BCCD3F50332DAD3A4169EA85C324D165413F10888AC3B21B91DE09FCBB9B636ED00FAAA669ABF6429B78C3C04F239722F31FB0B1A20CB1A6B553908070AC13521DF66772A6036E6695CF66B9A90E2111E499BCBF5DCD19744F43DEB943445248A5E84F168E7BFEA2DC4E1D0A87FB4140EB7C72D2DFCC27923206054CEC870888A79938DACBAACF1F122B22AB5C9701D777BCF9809CEBC9B7AAC52468134FC4A92C2BAA9B8C0F6249130A50337F460A42CB5364A5E7408CAEF8D12BA6934AB645DE9832818F9DB71F5EB0B158DE6A76619E75245B56020E1664D8FAF1C1782DE4A688D4055E07D842410600E9454E28676D44357853FFA7740200C91EAFA16BCA21D0006F47FE8159A733E0E91549DF434EF316E1DF9BB97DA6A2C2E2F20A65B3C00041A903270CBB55AE2432AEE25C71CE73BC2322CCB8E5BD0E24820616A890B0851D825D79411C14948DCDF48776D72565422056FE75765E50736C82F71270BBCF229A7B7A45DC88AADF4F84238C896DAB889E16C17DB7BE551AB24873FDA82F102D0FCFC139C9FEBE9FA99819CEF0E2684DFC5C843A6D496D8A595D33C51E1FDE9A84059C7BC596D32D53E2FE046F23FEFA51D13F9C28E227F5E24429B851ADDBF578922AEB0C5A61BBB666D11D127BA45C9E6378C70D75643DE776483582E034E81FAE0A3F029C47FB192CFA018CE1F68261D77CFC9E05EF19438E47F3DE9A68C8DC09D07B1BDC6CED69592623750F72EC2FB8C5CA981DFB84B4BF0734377EE9DD8EF5DDCD96F438D30AB78F402EBFF2163D43345EE8CA119F3208E21AA3A2185DE967B475B9ABFBC86465275F9A634FC22015E94A298E9C204E9786CB1FF14A5E99F942D42AB5DF51AD09654083DF0259AA1C26A760CCFDF4A276600C5FD3A54F210B20731941EB48A79435F1F86C45F8181D9758A1835721B87D36C725878375FEBCB8D48ED2CE8892DB50965753A98F4E7110281DB40ED64DD8EB51AB9CE41042589152D8CD5876FF30536F8955172A7A8F5C3F5FFD22C9954903136F781F0574F45F909BDF1657FC1CDCB9C4689F41E462C8D39108B10D78B6892C8775FDEB139258F8130BD1D2A1C72B5026506409F9862AA8729B35C652074494FEB84A553CEFBEED19D6EE94758E800F5FCBCAEC19B6A00F33EB237AAA6FC0B3A08C1D8829C180BF95E7D05F919A929933B7A032CD20ACE82AA5A45E5B2FB09812F36974B5EDA1B387FEB13BD49AC374F821341282C8FE2FB0CC5C075356833FF8CC6B648729A4298ECD73BD0EC73957077AC65722D0BE23C1536B8DB7B0506DAE47C0070564E7D7F9444F47B22C679EB8ACA4826F974A42043863E498E5301EA162C4E96684ACC5CA26CCD083541BC4C1D2FD690E51F07FB08337450A204B0F4F2C17785E037424FD6E78746764584D5F19255496DF1E524BFF0AAC31BDE9254429565278A39ECE4627C023EDF18BC21BB523D44EFC259742DEE9FF7159D5F700D957CCBB505A88C2037629402C2A322D17647E430777B184FF7B4E8D6B94724ABC36A5CCFAC08E2479E8310BCB7A617A25FAC6EFD10D0A07248F7D4597F14309B8064FE3BC4A4479F905E832210D49363D1E5D58176DEC9ABCC0C5132FD6ECCEAD2B05B56C96ECBBEB0B803E43DB2F982AD9EFE1E2A49649ED8E42707970C93615D54A3E673559B996E48A3B73143BA0884E918888156CA78F793DFF990FD721DE0C0B7916A5CED736E31292C5AF062D7CCD83FE653294FAC8C50CF6BA37B37D5A9BFD1E3B92D1825C1BE0795F9B257CDAB91CE99C0C51BDFCD6C0AB5A3BC6E30F884ECB4F1F61A3259CD279205B2C21CDDB196360061758E67B1C3724F5CB6311EB4FB92E6C0D71E6D1EA45 - -count = 51 -seed = 4B6B73E042CE76DBE39535E45D3BB2F3B9F8B2BDA170E76CC88666844703E32B2367460A0F6A0A2E3F4E7A6CD32BE998 -mlen = 1716 -msg = 0BF9A7C0F63CDCF3F850ED7C5DB6191EEEFE29E498A19F9D89BE4698821ABD72EDC34317B4F8EC2736DC83C24AC195BD55AFF00E797A83DFFADC7970FE53304F16F5DD92E6EC362B9E283E41EBF121FB2FA2A3F60124EF3EBF836AE51FDD55CA9F59B085DDD660724C072B86041B50A3A446CDB20A45BA65380ADF007E005DF2D9AA16A9D22B11DCF6F0B1964F04F45441A923691A15D80DC85003B9AE281F2B5983DD1A04D80A4D9C4372D9820BBFAE3AF7735E7C71E9F085C0A6E4BC107D9E4BA222B38FB236B2CC3A19DD6067BEAC460383FF2BCC771A7F1AAF092FC72C292FC1D5C6FC6B9715F1E1272EB22F8E0B33A2830E31BD6C531677902F6A95CABC3E9C1AE36F77037A785FEA355137A581FC14E6BD5F1F7AD1A5DD19DEDD448B47B558C22DD0FCBF296A812A726E7D1B57F4688D3F577104CFB15FC63C27F7B6051C7AED7D645186FCA63AD9C2D68BFF442466EFF76BCF0E398D2BF54C2CA4CC614839E9BCA48AB2CC53865803710A98D313AFF1DDD06A65680EB83C640052DB807EB2F38ED0CC211128044D331FEC3E6B0B2F3B675C631FDADE62C16D1719278413EA3F8E54BA34EDE7E73F3D94802D2F9CB9794D257C46679A3F00015945903190B97071F8FB55F8696253AA3F39B3FAD344FB88224F5313B43889B768171895F7AABEFF25E21E525EA01A996C764A3ACF12BFFED08F3F751F5CC094B50B325F8B62C7A5B3256964D48543690538E634E5730354358534B65EDDD44A526BB4B15E2042B6210F503EEE06D00D615CCAD10D73CDCBF5264B526674D85C0ED31BA5EE584F21FE6D13F883ACE4B094768865E43099E54671240E8E2AF8A7D7D22335B3974CE860E7238A7C1CA8A009EB51C8636F0659189AC8EF01C871E9008957CECE0A367B63BD2852BDE8690BD74C6D956435D0AB82F94A90CD00FC840DFC7036B84D51F1FF5076CA0974DB6CF25AF42EF7DC8C30C2B04CEB2510E86FFC510BF4C931639478FD1520AD571FA17958CCF8E37F5F6360030300EDE3A33871E9582808BDA2233996C5005FD0C23D99261F570AD9027767F6FC96D18BA98E8DDFC2B79AC12CDA5F2367B4BB6B99A3E07B59882E49A92AECE85339BBB18AB9644D20A3B2A795240492CE4EAF09D9EF728FB82B1DE7B64B5D391251FFB0699335CED8C7CE642FF1A79F04C3EA0DC37EA101188361AFAD236EB218CFBD1D0EBD784CE27DCBA0266DDEB87B59B66A4F75BB44665643FA358DD3D0B69B49F45A752B5C410E2299A62BE4B57B32B0924A069A8E8C15D754CC34DEBB0D967E70693A6FFA58CF7099C2C2458B437C7B205CC7E815F6CB494080F9EAF3017E5FF918558DDE415FF72E954EBC2ED4C20C8ECE38CC916060D22E582D54F74C6C181C2601400110A683F4A365E45FF1387BCE4E152A740136BB762B03A99FB68F6AB42620B2E3C00FA8D150944230A6330409B27E4AAD1693E2C3DD12216C4E2DDBC5E9CBA68B8B5417A7B2EDAE7EB67D25F4EDECBB087F93DC9C927C33076B1C71A2B83B33870D602562ED378805A690DD2A427D86C2C46BA4741F3DEFEB91A05EACE975C836E52868CFFE52CA92F97DE94768161A3E953BAB6A28016782909EC53C02F35184AA9CCBD5B793B525204B72DEB63E104376893B9452C3F2C492F423CBEF1EC87C85788CF3073FFBBCD67FF79BD038672943AE4BC68DA131DBA8D7B41C83B4E9CFB6931987B270C74919BBD40612F823114E4BB148671F1AA62BD2BDFCC8B0B24010EC112E883AEC9746D0F5DE467ADDAF51F8C070A359108B1F91643071438F098233AD9A94D0FAA665A39291A98D14A861905ECDE4755D00E690429C57580DCB6D51BB6186CE72EBB1FA8413892CAFB8713E89775013E546FDA30AEB8AF9F7155C08B25810C80CCAA5E700C124CFF59FA32E0293ADADBCC7B1A99F67E66B28DA614C5A4CCD706AFD05388C65EBCE07A543D3DC1E5A5D1F307F675728D4C629A04E9E455B4DA35236C677F26EDC622C1FBF29568D509EA0690AF4CB5DBB4E418B6162888E43B458774A31324BFD5EE8D2152E4AD43A3007D7D4AF5FDA172C2779837AD3A09E135DE953CE966727A7183BF77ADFC76430666B526692991D3C9DB5BB377552A7801C548AA63F6931D3EE91B875CDBCBB7441A4FF81F86762332D7192FBC2F7B69A58DB6CCD3558047F1940A1CACD6FA28A000B9795A2860394BF05F0120E6D85F96B1FE9DE14E3ED66A31D747924B6FF2620778E0714AEB34B79A5D935A0306E55C36506A292C5DC568403551907E49A43A6263D2915108916F1E27CF3529D1B7BD1544AF83A7CBE58547F192A93CE5C5BC6D652405FFCB95345F522B2D34E8EE0960BB85537A46121BD9A408D283A125EAA745BBAB04E2231C19AE95E13901C69E5C9C4D70B104478F4A70D64F81269A8 -pk = DADB2B8DAA791E9AA845311FBF05C8FA95A0A916A76992165B101C9D92F10BACDCC6F829864EAB95841FF3618FC2B9CD5E31C6F981E2E3AD58A89FC1BCF50700716E96AD2F8D681D27576AC2F895910F1BE9B63CD15DEF616EEFA3F464B77FF34BE2D49044E1B97E96947F4E693932C915F11D86AA80AB55E636D9D3069B2200 -sk = DADB2B8DAA791E9AA845311FBF05C8FA95A0A916A76992165B101C9D92F10BACDCC6F829864EAB95841FF3618FC2B9CD5E31C6F981E2E3AD58A89FC1BCF50700716E96AD2F8D681D27576AC2F895910F1BE9B63CD15DEF616EEFA3F464B77FF34BE2D49044E1B97E96947F4E693932C915F11D86AA80AB55E636D9D3069B220002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D1A0954603A4ECA90FC7E3B7436677A599B98BB7DEAA34954A0DCBED85B423B7D8C3F09055EBF2511B9E24535EC077062AF46BF16BB16B7C239C2184E3C06793A0761A02541BDCE700DD67BCDEE16A06DE00186A6BFB85B5ACFEFFFFFFFFFFFFFFA2BB54B8F73418BE872529CB0F012DCA356296D83419EBF01EE4D9C7D7364EEDC00D25C7601C30FA683935A24C73049AC145F8043D56539EEB5D5D742AAE3B972BA5D0CA9A1D158147AED3AAFCB23E03C2B3AC6049CEE69FCEE8FFFFFFFFFFFFFFBEF2ED7738063C059CA7A71AD0B73B06D7057120D6DECDA3314BCFCEF254725F06FB75DF2C808D07B51C83A240C2EDF71CBD4DCEBC32F25386460100000000000000000000000000000000000000000000000000000000000000000000000000006F3CDBF1CA575BE5E1EEC9E7C62794FA9F025A3DB1617A44FDF136D2BD852C628C64B95146E19201DF1FF6AE6CE6F6552BB6372AF8A2B93990CD010000000000000000000000000000000000000000000000000000000000000000000000000000B0EF5F552DAE107C033D778D973268B5C421759D2A7321EABFD7A7DB878C666547E4F2707DD73AC485A26577BC8451D6F0412D312E2D1E000E8FEA6783CF0800C92252C47E97DCE56C3BCA017778C4874A493463B321CD834D4311FDEB5B7A5E983045B0545706B0B3D47BCAFAB2CE3F08D6FE0BAB6E58983B8E20D77CE21E006888B8C505088613B6BD72CAB1AB676F940CAF493C699382FE0DDFDCE4416972C2C8783D4900FFBB817025DA891C7988D2BF5C5592B10E0C6D5EE6AA16250900C630CCB841FB18522290AA00E187CB9A97BB7C6E225BF7427A8443907363C98EFAC68069BFE2506739BE733F91AA114676FBA55327F138F91A3CD44AC80C1200B6D01556AA187FA05F1C2336984C31E12BDC7F91DF564FDD03D4B37CAD4536BF67EFBFB22F403A2C323BCD35612CB4996F0CBE3CCD5763CA708219A968D809004013AA919FE9765C51821E1D3537197F960CAC035DBAFF3DC910C0C3A42D162A39609EC0D4F8C6643E60898474258D2186DD4EC5BAC932EC546DD04FA37506001C6E18A73B99DF53D743D553A9E327CCC8E3A322F4F84614C924B0C006871D70FB5D5C58C920E60D57E6494A5FA583188A1B0BDDBF72FFAB6EAF5FF4AEC019004C175811828A00667A64BC8A45ACA4BED143216F5F7A7FFB3AD3C2D38C6E71CA958D021E86B4E02A21665FC4C58C722695B33599FD0E6B3AC814D31C96360400876C120CA50851BD74CB9CFAD844519228E013EBB5B29F655D3B94CE1D9FD7104CA428895C05E8E8E930F4790E7F9853395FEFEBBFC1DE70EB3F9353849719009D9B8F55C624A8620E978F5D5CCE0F2FAE45ABDACCB393F8C93627BA7B67903628658098DE155BAF317F72AC2AB2CCC61C5D59E13A7B16DA4A0719D2FC481E00BFE02CD51C0CA76CA3D6BB8F87B178002D65A02639C88D9A7F8441117EE80022684F36D62FD30A541B6AD145C2469A0639A437486C774D3F2A7FCD8EA77C0100B013B77013D600901E4ECB7BA2CEEE008FB476CEF8BFA3D6FD9089B758D1257C02E73DCCA8F046498E3D704C397B121FD7148D09339EE06B2CDB99E02BC21C008F991C0D75CDFC74E5EA105A9E4890BE28C4B9A1CDF6A3205F70532573B4ADE0A3C10E572238E0D035428F699848B7AFB34C33AE50254A486A77D31F27BA040059C55D74967817885866551D4F4680E2ED34608804524CBC2C6E117A8B20BD8859E29E35C7FA70894F45061F3F51E0F8C97B0EB7472B83BEEA0ACCB567DC1100 -smlen = 2051 -sm = E676E9DFAA9A9F9A4BA58B09208B42F85F9C0103994DE0A4116EE0CAA7708AF3FE0C15671C01A81A619F2381329A4F3DCFEEABC2153BC83B00DAC5922CD2562BFD1ED0940DE51B2E40541801E9F94E60F8583726F88506EF49521C38E8D001287144CCA813FFB9AEDA9850DC767A90CC760181B0FF30DDA0D107B6E37F55649C8BD71B610021352E64990AC03BFE779E481945A2ECC2B3016C8CF47B1AC05E134D6100ADEA9300B91F3F015B93BC9FA73BA829C9D15ABB78A67E175216016410A1B9BE775A8541C1B2B170BA29EF7B7E005A5AA24CE2CE8F6A063F4A8225F46872B16C015D8E5C97C924A7C363B40407B2D2F653D66701CEA22F32926FDDDD3D55F27D49F009AD74070101EF757BF2833E4A447134BCE91B1DFA47BB7BEB077CFB4932F266E6B9A2139CD407017181233CFC9FF3DF5108D9569D6152E2B9F30074F2134DE0B12B886E7531131152000BF9A7C0F63CDCF3F850ED7C5DB6191EEEFE29E498A19F9D89BE4698821ABD72EDC34317B4F8EC2736DC83C24AC195BD55AFF00E797A83DFFADC7970FE53304F16F5DD92E6EC362B9E283E41EBF121FB2FA2A3F60124EF3EBF836AE51FDD55CA9F59B085DDD660724C072B86041B50A3A446CDB20A45BA65380ADF007E005DF2D9AA16A9D22B11DCF6F0B1964F04F45441A923691A15D80DC85003B9AE281F2B5983DD1A04D80A4D9C4372D9820BBFAE3AF7735E7C71E9F085C0A6E4BC107D9E4BA222B38FB236B2CC3A19DD6067BEAC460383FF2BCC771A7F1AAF092FC72C292FC1D5C6FC6B9715F1E1272EB22F8E0B33A2830E31BD6C531677902F6A95CABC3E9C1AE36F77037A785FEA355137A581FC14E6BD5F1F7AD1A5DD19DEDD448B47B558C22DD0FCBF296A812A726E7D1B57F4688D3F577104CFB15FC63C27F7B6051C7AED7D645186FCA63AD9C2D68BFF442466EFF76BCF0E398D2BF54C2CA4CC614839E9BCA48AB2CC53865803710A98D313AFF1DDD06A65680EB83C640052DB807EB2F38ED0CC211128044D331FEC3E6B0B2F3B675C631FDADE62C16D1719278413EA3F8E54BA34EDE7E73F3D94802D2F9CB9794D257C46679A3F00015945903190B97071F8FB55F8696253AA3F39B3FAD344FB88224F5313B43889B768171895F7AABEFF25E21E525EA01A996C764A3ACF12BFFED08F3F751F5CC094B50B325F8B62C7A5B3256964D48543690538E634E5730354358534B65EDDD44A526BB4B15E2042B6210F503EEE06D00D615CCAD10D73CDCBF5264B526674D85C0ED31BA5EE584F21FE6D13F883ACE4B094768865E43099E54671240E8E2AF8A7D7D22335B3974CE860E7238A7C1CA8A009EB51C8636F0659189AC8EF01C871E9008957CECE0A367B63BD2852BDE8690BD74C6D956435D0AB82F94A90CD00FC840DFC7036B84D51F1FF5076CA0974DB6CF25AF42EF7DC8C30C2B04CEB2510E86FFC510BF4C931639478FD1520AD571FA17958CCF8E37F5F6360030300EDE3A33871E9582808BDA2233996C5005FD0C23D99261F570AD9027767F6FC96D18BA98E8DDFC2B79AC12CDA5F2367B4BB6B99A3E07B59882E49A92AECE85339BBB18AB9644D20A3B2A795240492CE4EAF09D9EF728FB82B1DE7B64B5D391251FFB0699335CED8C7CE642FF1A79F04C3EA0DC37EA101188361AFAD236EB218CFBD1D0EBD784CE27DCBA0266DDEB87B59B66A4F75BB44665643FA358DD3D0B69B49F45A752B5C410E2299A62BE4B57B32B0924A069A8E8C15D754CC34DEBB0D967E70693A6FFA58CF7099C2C2458B437C7B205CC7E815F6CB494080F9EAF3017E5FF918558DDE415FF72E954EBC2ED4C20C8ECE38CC916060D22E582D54F74C6C181C2601400110A683F4A365E45FF1387BCE4E152A740136BB762B03A99FB68F6AB42620B2E3C00FA8D150944230A6330409B27E4AAD1693E2C3DD12216C4E2DDBC5E9CBA68B8B5417A7B2EDAE7EB67D25F4EDECBB087F93DC9C927C33076B1C71A2B83B33870D602562ED378805A690DD2A427D86C2C46BA4741F3DEFEB91A05EACE975C836E52868CFFE52CA92F97DE94768161A3E953BAB6A28016782909EC53C02F35184AA9CCBD5B793B525204B72DEB63E104376893B9452C3F2C492F423CBEF1EC87C85788CF3073FFBBCD67FF79BD038672943AE4BC68DA131DBA8D7B41C83B4E9CFB6931987B270C74919BBD40612F823114E4BB148671F1AA62BD2BDFCC8B0B24010EC112E883AEC9746D0F5DE467ADDAF51F8C070A359108B1F91643071438F098233AD9A94D0FAA665A39291A98D14A861905ECDE4755D00E690429C57580DCB6D51BB6186CE72EBB1FA8413892CAFB8713E89775013E546FDA30AEB8AF9F7155C08B25810C80CCAA5E700C124CFF59FA32E0293ADADBCC7B1A99F67E66B28DA614C5A4CCD706AFD05388C65EBCE07A543D3DC1E5A5D1F307F675728D4C629A04E9E455B4DA35236C677F26EDC622C1FBF29568D509EA0690AF4CB5DBB4E418B6162888E43B458774A31324BFD5EE8D2152E4AD43A3007D7D4AF5FDA172C2779837AD3A09E135DE953CE966727A7183BF77ADFC76430666B526692991D3C9DB5BB377552A7801C548AA63F6931D3EE91B875CDBCBB7441A4FF81F86762332D7192FBC2F7B69A58DB6CCD3558047F1940A1CACD6FA28A000B9795A2860394BF05F0120E6D85F96B1FE9DE14E3ED66A31D747924B6FF2620778E0714AEB34B79A5D935A0306E55C36506A292C5DC568403551907E49A43A6263D2915108916F1E27CF3529D1B7BD1544AF83A7CBE58547F192A93CE5C5BC6D652405FFCB95345F522B2D34E8EE0960BB85537A46121BD9A408D283A125EAA745BBAB04E2231C19AE95E13901C69E5C9C4D70B104478F4A70D64F81269A8 - -count = 52 -seed = 3D4607399F6FCBE074FD2BEAB1A7571239D6BE6308617866B65B892EE65399E14DC7FA612CDBC5F7E23116FA86C3133D -mlen = 1749 -msg = DBFC582AE98D8FD326FAE96A1849EFE729A1173339D90C48C3A2B867135F1DFF5B497D05FD55130694B5F9C62D136647D767AE682A0F05C670CEECC03475FFD39E0BD4E45B720D9D7E8DD04E69C969627682AD83F48609F6E66D0BE99064988E4654E3913B7CAF1475622E211BC247B98E5BABA1B804E2BF651713197D8A610CC111BA5FD98A053408AD155DCB756D28A283BF3B20E6F3785DD5F105F8D7D9F2956064860B097C675630EDEE1F17E2EB0B26B6C20E260F9A5915D63F1BE2C74FB0B37013244481A2D0C581C4EE12516E0FD4701E9835C8526A490CB39E99FAE07C40236808F9605A63A5106C19517C3711CA4B9E8EDDC77B242575D904DBE64223CF14A8E39FEEDA9D6C5F9CD0D0719A7EB5EFA71453636F78CAB8262636FF1E136C787E38A43FAF02699C1F260EC45B068EDBEEBBB8A0E08CE282BF47D27A33216856F0C59E743DEB13397656FF17FC4B3C694B189C35E516BE719CDA6542260D1301DF93A5D93EE118F7CB0AC94D0364C9EA66718A4BC7F3D7ACFFA60AFB7100F7D97E98DFFE167D1D8E46C912D41EA057362C13B078CB1D9C443C1A57AC18C4566F5F5388F47A40CA49CDAAF34BD4C9A597FFBF7AB20D7CE88DD76A639E09ADA323C588B08140E9350268C1FF76079093A05CCF5E1613A70E6E37CD257875049A767332E5F7420F319F9AC78F97C0C4FA40B1EEF8C8B48045C78F73584590FE41F9F274DEA838DE75DADE66D04E9D9308CB0A9948320D28D9CA8F1F51E39FF3DE20FD5A2A267D127C317ACD51FB779E597A8DC7359D920548B8BCAD761C6B8012304E12628A2652D12A8161E538C20D582BF567E9C2B46B4CFE2D2DA31120C6DF50DF45C80513AA9EEE9F2613A221AA1D23F861C7F26AAC7813B7ED7278EB420A5C44F2A5879A2F1F9F11E14602762E3389B152C014EA9DDC9DDDE9ED1D6F74E7526F690EF37E71D448342C012E032C00E480A699ADE617434C12DA0E69139D0D9036743B9E2B9134B5086FCB96B193330ACE8E4F77148AD0F532E72E1792795080B54D7172FB9AF1972D00AE24D0B3D86528675B3BC8C7B80598D855B95A77667AD0F671F00039C08CC99F5644BB006BA9356B9C02BC935212C43490C741B0845CD7B4247592374AEAA1B589E670AC62777293870963B5132DCC27088F5DA5B831FA570766FA81C2A07B88BBD45B81992EDFD2A7FE934219B1F648DD8A414FA03EAFCD39E72BDF7D4F6B9C1F31A0A67DF03F6709F2BE0E7D1B1690C92CE7B8C6B1054270D796B16D6E445D24CB11229CB0F92DD81190A37838951AD28BE2AEEE6C5F63DA60A911AE0A24B1D05EF2F814FB30AAE8CA3BD9F01D4FABE5B279142AF948B0E6BBCCF7560107C161C816A0D8E61DD908445079BAAFB78C14F68B8B2BB241FB03C237A4CB250911142D0B460ACC75E6B0F58BF28546A4779EA7342238826F636A510CC9CFFEE8BB0292A58A07694C05672B560B26158A8566D01D0EEA0773E81F3F84376B29CE375FC56A0689A7CA5CE94B91814B62CBB61EA2EFCA0CE6712A941D612B0F700C56B46D464C2AAAB3F64A89CAA8561A1DAB2869D79DA1720274D031946C4C7715FB9C243DC95CCA7AECFF55EBA4044467EB922E93F57E3E39B93876A03936DFFDD2AF48D055C6C188F2F229812EC94F3FBDF7D7DB62E4274DC91718710EEC2CE034AEF266207C5CCBA21552D6FB8DDBEE8E931067010594A9E0CB37250F67281C0A369965367424D454CDD05D3C8F35A15F76B4C8C3FEE42F4C9CAD68849837DED3BE58730B94AE3A5F9146F90E03B4C0836381B3F9CCB5DE6BD2455D241BE9132EB6D4937FF27663F4CADAA9CDA193919F4CB0D0F727F6C7B26E831C3AC8DECC234D79D1B3BD28305E3012A3733AD718FDAB7DD1A6400BC47F47D20F627D2449DBFF10E37A62299E22E408A28A806D403CBEE19AFF6FA9B1814B35B9573ADC86F829A08893CFAE4A0212293447D3086E21BBA28049F3ED383519917B169E8A1B7DD64CEFE0DA643A97950A205CBFF6BD9334180556E84199F0B60738715CD69AAD7C882430578F6FBA4579D908F863CA54D0B9862EEA6ABED31301D183CF465B1A256CBD597A629307A8A890F11C23DBFF895B932E9CD2F5F06A4183D6F2D61117126FCD2CE2B86BB44A9A5B402E3EEDBE4ED1DF11716E91A2302CB72D8F0DAE132E16311C80DCA041694AF1EF63F659959FCAA133D9E5668F94D0489311AF3BAD379DE17793BB3EE8A284529A72CDEC474B3A82D92C6CB21C63017F262E0D7DD47AA5C58F5E23F8A37F00D5438717F05BB974F18A5D3E1CA054EA053C30B34FBFAEE88BC0195F061AC32F5B71B2A8A3ED4B8BC4EDAB40A6396C052DCE72E10768526C00610E96DF38AA70938CF844CF445D8E2BF73C4F32A742812D8C1DB53AFC6B6C0A4BC67C3CF7579702312D6C89BF14E9585D2C624D07FEB4B5B57F8E4C5CFDA69A5E922CC1E9 -pk = 60AF9A07BAF1F9783C5EB51EF97609E76F5D7A8D56D971E190B1FE4D8DEA3C7EF429A336231518F59B7B264676271DE9803EDFD7CD3111233B3633C3139C1E00C9EC6962027A0F2C34B9C4F4B26439519B7CF8C424C264BE40214714072AD0A22147E8EDBFF5A382909235FFEFE40420B4CE0035B3A5B349CBBA308E78151300 -sk = 60AF9A07BAF1F9783C5EB51EF97609E76F5D7A8D56D971E190B1FE4D8DEA3C7EF429A336231518F59B7B264676271DE9803EDFD7CD3111233B3633C3139C1E00C9EC6962027A0F2C34B9C4F4B26439519B7CF8C424C264BE40214714072AD0A22147E8EDBFF5A382909235FFEFE40420B4CE0035B3A5B349CBBA308E78151300020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006DD39B399FE1083BBA5D7DF491E995DE71D4E3A5C4540C6E88C65E09A251D524A3A1F1149F610D3BBECD33FDD84BDB4F80F6971F36D2BF0ED3DAFE3CC8BB41F0423B8C69840FAF6B98F33E052A69A7955BE476DEFAD92429C5FEFFFFFFFFFFFFFF24CF42445AB093BC6555E024E5E01E1EE0C6B6888D021384D492E72A13A7B108C2BA99DE5410880AB29895A85904E08E80B2E216111119EC452D777F0947D653FFF38E5B0BD04E6D1CFFEC4CE631BE839ABC04E1FBB9318206EAFFFFFFFFFFFFFFC0B12EFABDC18E14A13F2486266B0C214B78F44AAD568A1312B7008CB1F8BEBF21386292F7326DD01B6267A4D4C4E1CA37A7BDA2584C52E5B704000000000000000000000000000000000000000000000000000000000000000000000000000000758230F13868414A0C20EA0E5F77D9DAA5B90C1AD749E226F0EBB2E6F33CE27AC7D7838E941BF884404B5B538748747BB5BF8C20B3D2FA604EFF020000000000000000000000000000000000000000000000000000000000000000000000000000B5E0B566CBA3C7794C2BA7099BEE4D8D97C8530326CC68385EFD5D13EA74635E86EE3CCF380CB05EAECDF8F981CD4A8F01FECCD57D0CF3D3B1058107471722000027C1D212751D97747C68E6330A3ED57515338A16CC6279667A33481827E69BC744C75B94D078A9490A6DEAFC09AD8941E200B3AB76CA52AEEA5F91C38E010019F2BD10A258E7F8FE4C853A022CF4854F354CC8767054F372D4B3AF246ABBBF17023E2C02019D47DF2C03EDCD4B80A848D38267D943193A8A24665FF0052000518FAE1C6BD73F2A417C4DFB7F4B87D3E40287535D6CFEF7BAA0B9DCA3C2803305BDF27C7E4CEC46A27B81B0BB63ACF684BCD810C0236202AC72ECBC9BFC140079659F50462E127ED114B867D36FD3042E43F81868C8B2AD810BEF4578D601FAEE78EAB0457BEFFAC3597A06F5804EEFAEE60A54CEADC0B2907EFD3470A91E0037B6B866A3F1546D1920D774047B15D8FB59524EC037BEEDB6A3669D67CA0446BF95FD60FE3884759943425539564B8BF4D183A27B2A4E270675A0E6000C2300F4C486919AF43F3760FA1D42B48E2B9705537898724EE995873A17B7BA6B04236AF883CA65345A8CDB5B379327903955D8AA0E2E5DA94630552941E4EBE8110026855BF3E51D8DB6FC706D24687DD1755F4CD93EA7AFDF406C0F155C9747C81BCC3C7FEBB1E9E7A9016E1C3A2DC3CFBB6CC83C5AC1EF09003B0D85255B830F00D61EBD0379DC2DEF8F51433D1CF32FF19BC03A61FDD049B7D6E1F91D430A7E2CDCF66A6058E2C0118DB2E81D2A919E054811871876D052FEDF4D77A03E8614008BB560B7F9C444B06EB84841FAE64F2CD8197603980964F9A09A0448E1DE3EF945A262CEB084AE9F2DEB33760C8A120704DCEAA0CFC92A7FF5B0B1314E890D0067634DE93C7955C713137AA4ECCF6934C30BE984B3B5399A596695D186F596297734FDAE73543B5A155AB8C2A26FDA1E2718B7F76FDAF152D7A16A59AD6F170032856B1FC77205C61DEE361FBF59CC9855DFEC830CDA7F325E511AAA6904536E3226E5A0620EC21F3BA7FE74FB00789D99573B8CD2F1DA05D37BE20450560000412BE05468BE696A2A1DABDF1E072F484B7F0241301F567EE2664850D880745DED101D0B29BF1FC65E6B1A09497DF5D97A4EF732174375328832C25C6C65060090D55A6AA59EE6E466BAECFD9A426938E9881F4144B601F16C513788794505672D288A57740A4BABA3CCD84AB553B5B97F639D9103D27D80367ACE6B520D1D00 -smlen = 2084 -sm = 276100EEE218AFC5D0495EA850C41A6DA8840160CB528F598BEC36F9C5A39DEF99E1CEC4EF00D23192E02D13988063D8A78309DE22BFE70A0061EBEBE12773465F57EA1E84B82A2765429200B34078899A338EBD6A6A82D5F68D37BA5A6001470F63D3AD078E1B3ECAA0939DC2424CB78301F003F6D532CDB9A069B95984F30A1B1A5FF70094162F4BC688667335D555F91CD416BD043701F34BDAB8111E915664B4518C169617A8DA6B01ABCE3EE2C5B51D8851A6FF4FFAA745EF248300F871E74DD1F959DFF416123344F6D00EAE64006067F11E03D98B05191747EF4919B53983360140CEB5D2311202BBC9ED70BE09761529A37500DAEFC909EF83C4BC4C172C2BA799369597B2010155613E79563953D7A0E7F9AB1B0497BDA90889C0CF8CA27BFFD0C7C1719666AE06030D948FF505EB26F122E55C8224692A221DA301E9C1ACB9192ECA16780AAF7AEB5C03DBFC582AE98D8FD326FAE96A1849EFE729A1173339D90C48C3A2B867135F1DFF5B497D05FD55130694B5F9C62D136647D767AE682A0F05C670CEECC03475FFD39E0BD4E45B720D9D7E8DD04E69C969627682AD83F48609F6E66D0BE99064988E4654E3913B7CAF1475622E211BC247B98E5BABA1B804E2BF651713197D8A610CC111BA5FD98A053408AD155DCB756D28A283BF3B20E6F3785DD5F105F8D7D9F2956064860B097C675630EDEE1F17E2EB0B26B6C20E260F9A5915D63F1BE2C74FB0B37013244481A2D0C581C4EE12516E0FD4701E9835C8526A490CB39E99FAE07C40236808F9605A63A5106C19517C3711CA4B9E8EDDC77B242575D904DBE64223CF14A8E39FEEDA9D6C5F9CD0D0719A7EB5EFA71453636F78CAB8262636FF1E136C787E38A43FAF02699C1F260EC45B068EDBEEBBB8A0E08CE282BF47D27A33216856F0C59E743DEB13397656FF17FC4B3C694B189C35E516BE719CDA6542260D1301DF93A5D93EE118F7CB0AC94D0364C9EA66718A4BC7F3D7ACFFA60AFB7100F7D97E98DFFE167D1D8E46C912D41EA057362C13B078CB1D9C443C1A57AC18C4566F5F5388F47A40CA49CDAAF34BD4C9A597FFBF7AB20D7CE88DD76A639E09ADA323C588B08140E9350268C1FF76079093A05CCF5E1613A70E6E37CD257875049A767332E5F7420F319F9AC78F97C0C4FA40B1EEF8C8B48045C78F73584590FE41F9F274DEA838DE75DADE66D04E9D9308CB0A9948320D28D9CA8F1F51E39FF3DE20FD5A2A267D127C317ACD51FB779E597A8DC7359D920548B8BCAD761C6B8012304E12628A2652D12A8161E538C20D582BF567E9C2B46B4CFE2D2DA31120C6DF50DF45C80513AA9EEE9F2613A221AA1D23F861C7F26AAC7813B7ED7278EB420A5C44F2A5879A2F1F9F11E14602762E3389B152C014EA9DDC9DDDE9ED1D6F74E7526F690EF37E71D448342C012E032C00E480A699ADE617434C12DA0E69139D0D9036743B9E2B9134B5086FCB96B193330ACE8E4F77148AD0F532E72E1792795080B54D7172FB9AF1972D00AE24D0B3D86528675B3BC8C7B80598D855B95A77667AD0F671F00039C08CC99F5644BB006BA9356B9C02BC935212C43490C741B0845CD7B4247592374AEAA1B589E670AC62777293870963B5132DCC27088F5DA5B831FA570766FA81C2A07B88BBD45B81992EDFD2A7FE934219B1F648DD8A414FA03EAFCD39E72BDF7D4F6B9C1F31A0A67DF03F6709F2BE0E7D1B1690C92CE7B8C6B1054270D796B16D6E445D24CB11229CB0F92DD81190A37838951AD28BE2AEEE6C5F63DA60A911AE0A24B1D05EF2F814FB30AAE8CA3BD9F01D4FABE5B279142AF948B0E6BBCCF7560107C161C816A0D8E61DD908445079BAAFB78C14F68B8B2BB241FB03C237A4CB250911142D0B460ACC75E6B0F58BF28546A4779EA7342238826F636A510CC9CFFEE8BB0292A58A07694C05672B560B26158A8566D01D0EEA0773E81F3F84376B29CE375FC56A0689A7CA5CE94B91814B62CBB61EA2EFCA0CE6712A941D612B0F700C56B46D464C2AAAB3F64A89CAA8561A1DAB2869D79DA1720274D031946C4C7715FB9C243DC95CCA7AECFF55EBA4044467EB922E93F57E3E39B93876A03936DFFDD2AF48D055C6C188F2F229812EC94F3FBDF7D7DB62E4274DC91718710EEC2CE034AEF266207C5CCBA21552D6FB8DDBEE8E931067010594A9E0CB37250F67281C0A369965367424D454CDD05D3C8F35A15F76B4C8C3FEE42F4C9CAD68849837DED3BE58730B94AE3A5F9146F90E03B4C0836381B3F9CCB5DE6BD2455D241BE9132EB6D4937FF27663F4CADAA9CDA193919F4CB0D0F727F6C7B26E831C3AC8DECC234D79D1B3BD28305E3012A3733AD718FDAB7DD1A6400BC47F47D20F627D2449DBFF10E37A62299E22E408A28A806D403CBEE19AFF6FA9B1814B35B9573ADC86F829A08893CFAE4A0212293447D3086E21BBA28049F3ED383519917B169E8A1B7DD64CEFE0DA643A97950A205CBFF6BD9334180556E84199F0B60738715CD69AAD7C882430578F6FBA4579D908F863CA54D0B9862EEA6ABED31301D183CF465B1A256CBD597A629307A8A890F11C23DBFF895B932E9CD2F5F06A4183D6F2D61117126FCD2CE2B86BB44A9A5B402E3EEDBE4ED1DF11716E91A2302CB72D8F0DAE132E16311C80DCA041694AF1EF63F659959FCAA133D9E5668F94D0489311AF3BAD379DE17793BB3EE8A284529A72CDEC474B3A82D92C6CB21C63017F262E0D7DD47AA5C58F5E23F8A37F00D5438717F05BB974F18A5D3E1CA054EA053C30B34FBFAEE88BC0195F061AC32F5B71B2A8A3ED4B8BC4EDAB40A6396C052DCE72E10768526C00610E96DF38AA70938CF844CF445D8E2BF73C4F32A742812D8C1DB53AFC6B6C0A4BC67C3CF7579702312D6C89BF14E9585D2C624D07FEB4B5B57F8E4C5CFDA69A5E922CC1E9 - -count = 53 -seed = 7031BA806F4D8BC28529163B239E0EE836871C51D2D62B601B71D6F2B69B203C81440F8FFC09C3AAD94DB1D880160671 -mlen = 1782 -msg = 6103E5B22F934203B5CA87337095C9A19267AFB9695D309BEB8A557BB7CC90332C4A03E1D416D397B945B607268F545928104CFFD71B02864E010B666CFCB68B762FA5EC839B5AEFD0407419441B38E6D881BD5218DF73C675DF101BF2C53D90FF86D4A3C7DB19EC9CAC044E0467A36337AAEEC32217FAF86CBD7BC2B663421754CFF1200A8A66E18F812868BC8D1C8CA495E6462DA4B8B96D4167F040F04927A7C27AD35CF174D42684ED55AC80D14CBE4CC2570642DDEC4F44880D967E9AF77EE27D0D3DBAEC9067FB6FC957AC4A136C1D564E17F59AC4938D43FB9050D810989907125C47FCEA6C162C723E79F68339CD1B3BF596988BD6E215271385CD50616868C6BF40FDC34BD30E5A00773E2C039723F2AC3A3FA45F4CE870841762D7435BD6CCC5FD3D58FE059EE455A806FDE89155C84797FBB73691A1FC6921859E99066A3239E31F28D1A46100DB1917621D9E61473CF1E71F9850B584B459D5690941E676A7DD56796313ED9ABDBE03DC75AFC1430DBA27FE0F8DF48EF7C339F462AF1A6D30A5F8B480DFBBE860C4C0BC136393C8FA0875AF454273C3CFDBA7EEA44EEF1A4060136948CD98B9D2C19AEA4934F3455F31DD15BE6545134F17A195B6BC409159C0975E592A15E86CA4943CCACF4B46719A072DB8C629B67768F1956F8158F179A0B645320489DEE404C8D0C4E786CFF39B324053F102C118E7D51173CEC0FDD017F213B2B07AC6B2C7DEC04172DD5396A020EDFB74ED86FC31952D241A7C3D139DEF543D90976AA70599792E73CF73AD0BD4A359BF60DFB2CE96A784D8DE5E23A95E831CA6FFBA6B187BC5F29A7757185EC06AC882572EC6283A1875B54FE4F295E1970BF311DBABAF9F894D3364D68F529C4EF9030AB934BCB09459D5AAC61919946FD28DF1AC85876F979E8B8528E9BBE69F03DEEF136EEA6A8FC86F31BD64285C8C9F49ADF53A8BAA7867CE52E72DC4A63929DF3BA2662DC77D71F88D8AF42B8D67AD54884EE11F5A6B3B794F7D5610909B0B740937587CF475DA903159994A262B6F32A3D1723FDAAE65E636B71CB0EF0A744F359BF08AC8231ED2970CE8C451266F703DA3B57F85ACEED4C1C174C50D9C226F028E972AC124FAA6F60518699CB4C499220EA51A538F9EDE67D0E98E1BF8FB4B24B1D8EF50A28A93E20076F8FB812CDAB04871D331FF434BA66DD4577B18DC3F471B3E96A174B58A7AC2470EB8463A71FFCBA2D064470FD2D4E15F9491DB09DF3E3BA376A3DDCC437312BE5848DB3B9079F2AE046798473BB970D725E1D7C6FDF405AE387DD7CC1735A7FC27D1A476592A514B87C9017E1E5D37E338F37916F3C72C5F2AF75185B88694D4E8E0A93FBF20CE81A7A0C10D55737B6473FBD92BBB39FEBC6167336BEB9C235997796B9C0DC18C353E80305175BB412ACC29E647813D0003F727ED0577A7C14BCF67173DA569320E887BDC8F5AD27FD8864261E802A6753C6F9BAC844B5900ED0D4274C0E6EDE42367079188B10BED5999501164FA4C5A818ED6EE229C3E0E0F7804B19EAF5D1132BE1D7FC18BE834C842B21F8DDB11F8CFAAC10D2E124981ED698EE7CACA211C5624F09C62E1D451429048B55ED0F8A714BB77A0D4B40F0A446EDDFB27602B7BF894805C4AAD9252658F6B21A05DC0CF6A3ACDC227FA867A4E5B1DB63A14DE26A79AACF1900A7B7D867C15CFD1DAA712F2A1E2A6C7B31B121465539CD0164E3CCF79A978B543AE9602996448C6F68069D044FC958911EF40B0B9AFC78ED014D94571F6771EA5E2306A7CAC32C135FEC0BBF1DCA3CB0B57DAA239C01671718017C907048E0D19515CBF430D4B3B4FF4FC9A391D15A38B39C4E528FAC04EBD3DC69144C98AFA75102D21FF961BAD2E1F25562AF92554814405C4EC08DAE4A0CD28BE592C9C9BF997CC0FE31502DD541000D4640D59654D26CA2A17BA4CAB0518EE097C05B2984FFC56E8182368E216768E0D07E17FB64003E95194D04C6E00E08386084FEBB6CBC841E8F3FE2A069C45554BC502C27591CA3C1DC9E6B1694BA2C1BC0713C1CF738DB22FFEEB7443D72D5BDB975D192976A58AB33DB58F5DAE497A0B24011E15E3256FF124DD99AF6FC300D1FECDCEE18DD4FBF25E901125D4E80EFA8E2A211701B74FD992E63376996994E054CC00E7E1DE7DB8E7D2898A735EC4920DBEFAAEA66B456CF6A12324C5D56762313A627B3523AB1E2C1C82E4FBAB136AE4395FCF2672A58011D96BBDCF2A7478305756D66B30A4AC44E48B18A5964AA89F14187EA114084D52B4BA77755BA04C34777409BDB782B7B645E93B4DB284525E2F9C9C38D73B475DDE2251277A2E6C3183D5DEA78414E22CC8FB4B2C7EFA797CD4A87AC81D3242EC8D2C2EFD6BCFD69C39F14B0B365F3151A96F75454A3A1400C76A4390FE9F2E7A22A0CFA687A5BEF1C905D3A893B0DFD35BDA184F25E62FDDC2A52B6A67E76F550ABE4CC8D1D63CC8631E4CC315E46D3015C3B8636B92B8D07075D401C654FB4A -pk = 23F1399E1CE83A2B8BE9BD31CF322358745E04F1C0BF79F6191C7BF178A7F3E85782C452FAC683CAF7D336C10C366D7016CE7ABF6626E785C94036F9563D10003065643548ABDD4D0B3CB378D4C0352FA4DC4C4B2170E1C9198E37A3CE3D80FEA697D6454465021088E11CAF8A635AF7677E8BA8901EEA506217993BAFA10400 -sk = 23F1399E1CE83A2B8BE9BD31CF322358745E04F1C0BF79F6191C7BF178A7F3E85782C452FAC683CAF7D336C10C366D7016CE7ABF6626E785C94036F9563D10003065643548ABDD4D0B3CB378D4C0352FA4DC4C4B2170E1C9198E37A3CE3D80FEA697D6454465021088E11CAF8A635AF7677E8BA8901EEA506217993BAFA1040002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C8CB9A4751E4499BB1AD1F3D89F5E6D2EB41582BC09DEDA736E1466AF36BF855081ECBE8857E989BE862F1C15F4548C98C37AA44AEBCE5F6BF8946A39AD40609E589083E570A3A2EFEC1DA4933987825D5720FB56F9112D932FEFFFFFFFFFFFFFF8BA9D0181D87638D75C9379297B837D2359FCDEAE74E4171D9FC7974624ED0DB5B8AC658812AEDE714E69AF1AC028D81372E96ED4236420D9E5FB9850B080C30A27EC8C57A90BA007D770B9ED7407BE6358FACEB3E9B10612AF3FFFFFFFFFFFFFF8D28DA25D3037699E5B7D737B8A9706874393740F1962CF6451360ACA0F8C21AC162BD91E97FE1B7C764C0B49001BF8E75BFD2382C16EFE5738FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04E8C50070D63A4B9B04F57F9190E20CD3855183D6F11AEAFD5BC1AB972B025263500EEA686E161B0040BB6A6C9BB2EB5A382D0923204AE71C8C0400000000000000000000000000000000000000000000000000000000000000000000000000009C0A214BC905058D852E2B0A3A1EA3670CBF13902DF5DA0E0DEBD97CD934ED35A55859DE5BFB5C523DA58917396D65D27F6497ABA6986E28700DF36AB9120800C9E88CEB90221FBB92A0A1D52AF658D4B9630B3B0619395B516DC5C900F901AEA9513A7C16B7DE5FEC1EE70AB0E3B68448FE7356EB08BA75D5AE6400FB281400F751B4139814009B7D0B851C0CD5A7C269BB7EE3C89311194B411C6986E5291FD5C2C9B4287E15FDDBEF7E0BBCC774038C5AD1884A4A6BD3F6D16D9D6C101F00A1D4B924DCCFB42BD695D1338F47EC41AFD48684B98F9B268A57AF0A8E947D4DC70FACAE55DD7D5C6253686477E092376820EB9C2EB49D47DBDD14A4D2B50E004FC224CBF5AA4F9EB87A63BE4F0A7D371B04E8D7539A2ACE994197719EF49A05CC695DF72111FE71F628F17E7334D08C7FB03D8B5E71DFA3F043CE80EB221900ACA2B4F2E2735B341AA5D0A4C5F1469C63A3E3C8FB978681319D82E3BA496A517491604871893B3DF511DAB343536A4EDBE8111F1EBD772CDC5EC2C5498817003461ED39557D4E009B197F11DD549BFCC7EA9818D0BE3201682F60810A50BEFE8FAAAF4F92CCBF247C6CF10A78FD7E23FE066F0A1AE1415A8AD068604557210057622A9C7D8AA708034113F0801EFE1CD24814B6086CBDBF5D5BF814B36A07E53EE2BC73320FC097A3B790ED7878B6465AE6D3D07D1A4DB2AAFF5B545299020047C45F6DFB4243C4600EA7179235010FBF8DA18880EEE41FB34B064C3695AE016382639ECA996D8A62EBAAFB7B1F219AE2B19CE8DBD9994F6FAEAA29EC452000C5A1B7EE7D24ABB0D23B3E18B4208C72D681C5E323B87F37DBDC98C8A5143732134C107D072B152DB41889B2776BB7BB0147F7F5AF6270324322E31E853B0C00C01B1F5F1B68926436CE55BE607074319D94251C9864CE49FC4ACDED7EC3E449E999A162FEBFDA063A0D55FD572404F8769E8A35B14B96582E6E1F2106551F000481A1CA66F490B827EDD969D2A73C322BA514DAFA637AC988C9770729ED8C1B21F11F1118397E2507975D89C4542287E50AB0ED2629A0AD65257B69B8F31A009110BA8A7E507597EC99962A7536ECE56A04473645B112F9CE8567346D4E25DF55BCB9E9431AAB6C7146E3EF807DAE724A179E5EF3135DC451D0ECD63D570F000FB2BFD1054AB65E137B9E06B3CDBBAF9260CEC445C0A230E45293E5958CB536969AE9D107876D83075E99F4975FDB617884962F46CCFEC1C66D7A37316D1000 -smlen = 2117 -sm = 90C34E45CB138356085D6E7EE197CBA0A8C7000697A6CA16153939645A6CD85CC8B778882300C577B82996C444C74A2AE3A0ECA5B4CD55DF00101857676673A6C39C6125A9AC88354459E50104E7C25B93D387DAC26E5154799E1FDA96A5019D4D377F086F5E4A96FB7168EDB1516303E900640F7FA5981796ECA0E4B98DF8AD80503EC001E011D334673D41765B4A252CAA15A23D155101999B4868D7F3E9C8452F9EF928E54900B7CC01E2DCCCC30B16B6239634E2408667D9ED9E1B00C07583AFB995C63CCE536B71F6F5FC1A390D01FE17FB21E41DDA3598997E472072F874AB7501C1625E45B2F2499D870FF6951E6FAEB8663800034D6D735B3AB9A65F713398B29826642F110001A9F25D2DC8EAEB4FA1AE3A658A52D52E0DC6410A49383732A50A0515EEC809AB080200FED3FFABE5A5E9990AC553AD5B7C10BB9F004AC25F9D2B11CC01B60FE880D849026103E5B22F934203B5CA87337095C9A19267AFB9695D309BEB8A557BB7CC90332C4A03E1D416D397B945B607268F545928104CFFD71B02864E010B666CFCB68B762FA5EC839B5AEFD0407419441B38E6D881BD5218DF73C675DF101BF2C53D90FF86D4A3C7DB19EC9CAC044E0467A36337AAEEC32217FAF86CBD7BC2B663421754CFF1200A8A66E18F812868BC8D1C8CA495E6462DA4B8B96D4167F040F04927A7C27AD35CF174D42684ED55AC80D14CBE4CC2570642DDEC4F44880D967E9AF77EE27D0D3DBAEC9067FB6FC957AC4A136C1D564E17F59AC4938D43FB9050D810989907125C47FCEA6C162C723E79F68339CD1B3BF596988BD6E215271385CD50616868C6BF40FDC34BD30E5A00773E2C039723F2AC3A3FA45F4CE870841762D7435BD6CCC5FD3D58FE059EE455A806FDE89155C84797FBB73691A1FC6921859E99066A3239E31F28D1A46100DB1917621D9E61473CF1E71F9850B584B459D5690941E676A7DD56796313ED9ABDBE03DC75AFC1430DBA27FE0F8DF48EF7C339F462AF1A6D30A5F8B480DFBBE860C4C0BC136393C8FA0875AF454273C3CFDBA7EEA44EEF1A4060136948CD98B9D2C19AEA4934F3455F31DD15BE6545134F17A195B6BC409159C0975E592A15E86CA4943CCACF4B46719A072DB8C629B67768F1956F8158F179A0B645320489DEE404C8D0C4E786CFF39B324053F102C118E7D51173CEC0FDD017F213B2B07AC6B2C7DEC04172DD5396A020EDFB74ED86FC31952D241A7C3D139DEF543D90976AA70599792E73CF73AD0BD4A359BF60DFB2CE96A784D8DE5E23A95E831CA6FFBA6B187BC5F29A7757185EC06AC882572EC6283A1875B54FE4F295E1970BF311DBABAF9F894D3364D68F529C4EF9030AB934BCB09459D5AAC61919946FD28DF1AC85876F979E8B8528E9BBE69F03DEEF136EEA6A8FC86F31BD64285C8C9F49ADF53A8BAA7867CE52E72DC4A63929DF3BA2662DC77D71F88D8AF42B8D67AD54884EE11F5A6B3B794F7D5610909B0B740937587CF475DA903159994A262B6F32A3D1723FDAAE65E636B71CB0EF0A744F359BF08AC8231ED2970CE8C451266F703DA3B57F85ACEED4C1C174C50D9C226F028E972AC124FAA6F60518699CB4C499220EA51A538F9EDE67D0E98E1BF8FB4B24B1D8EF50A28A93E20076F8FB812CDAB04871D331FF434BA66DD4577B18DC3F471B3E96A174B58A7AC2470EB8463A71FFCBA2D064470FD2D4E15F9491DB09DF3E3BA376A3DDCC437312BE5848DB3B9079F2AE046798473BB970D725E1D7C6FDF405AE387DD7CC1735A7FC27D1A476592A514B87C9017E1E5D37E338F37916F3C72C5F2AF75185B88694D4E8E0A93FBF20CE81A7A0C10D55737B6473FBD92BBB39FEBC6167336BEB9C235997796B9C0DC18C353E80305175BB412ACC29E647813D0003F727ED0577A7C14BCF67173DA569320E887BDC8F5AD27FD8864261E802A6753C6F9BAC844B5900ED0D4274C0E6EDE42367079188B10BED5999501164FA4C5A818ED6EE229C3E0E0F7804B19EAF5D1132BE1D7FC18BE834C842B21F8DDB11F8CFAAC10D2E124981ED698EE7CACA211C5624F09C62E1D451429048B55ED0F8A714BB77A0D4B40F0A446EDDFB27602B7BF894805C4AAD9252658F6B21A05DC0CF6A3ACDC227FA867A4E5B1DB63A14DE26A79AACF1900A7B7D867C15CFD1DAA712F2A1E2A6C7B31B121465539CD0164E3CCF79A978B543AE9602996448C6F68069D044FC958911EF40B0B9AFC78ED014D94571F6771EA5E2306A7CAC32C135FEC0BBF1DCA3CB0B57DAA239C01671718017C907048E0D19515CBF430D4B3B4FF4FC9A391D15A38B39C4E528FAC04EBD3DC69144C98AFA75102D21FF961BAD2E1F25562AF92554814405C4EC08DAE4A0CD28BE592C9C9BF997CC0FE31502DD541000D4640D59654D26CA2A17BA4CAB0518EE097C05B2984FFC56E8182368E216768E0D07E17FB64003E95194D04C6E00E08386084FEBB6CBC841E8F3FE2A069C45554BC502C27591CA3C1DC9E6B1694BA2C1BC0713C1CF738DB22FFEEB7443D72D5BDB975D192976A58AB33DB58F5DAE497A0B24011E15E3256FF124DD99AF6FC300D1FECDCEE18DD4FBF25E901125D4E80EFA8E2A211701B74FD992E63376996994E054CC00E7E1DE7DB8E7D2898A735EC4920DBEFAAEA66B456CF6A12324C5D56762313A627B3523AB1E2C1C82E4FBAB136AE4395FCF2672A58011D96BBDCF2A7478305756D66B30A4AC44E48B18A5964AA89F14187EA114084D52B4BA77755BA04C34777409BDB782B7B645E93B4DB284525E2F9C9C38D73B475DDE2251277A2E6C3183D5DEA78414E22CC8FB4B2C7EFA797CD4A87AC81D3242EC8D2C2EFD6BCFD69C39F14B0B365F3151A96F75454A3A1400C76A4390FE9F2E7A22A0CFA687A5BEF1C905D3A893B0DFD35BDA184F25E62FDDC2A52B6A67E76F550ABE4CC8D1D63CC8631E4CC315E46D3015C3B8636B92B8D07075D401C654FB4A - -count = 54 -seed = C8671A5D752CC6DDF075C899797603A625C142485EAC3D57CAF14F2244D7F84D116B28F959912A758E519D588A6A07EB -mlen = 1815 -msg = 3EAC87B3D642CEAA3DC904AC3C4245CB2A260E4B74D0394D33D4B71024144180A727F80B092305F31B2526998EDF6F98E46933FDAF0E8709E98D54F13C2701C58BBE35292FD3334C5E03D345A9A2EA1E01B2C4573567FF1FF3BA7406A16F5A5805EDD760AC78A3AB8602E415F67C7CEA5B36421C79F83CBB14FA775448A832A4B28851CE215C11DCBAEE652CDD7342B6B1204727479E6208FB556CF08BF7EE230F32659E829CE4FBCE0955D01D36624BBAC18C1D25A3E187722F8F74C88B56E518CF0E78B3B0EAC56D8F13C4AFC4DA3613A41CCC2B0B0E2EBBFE5799E479F81335360D483596E9AE926751EC9B956555F271C2CCD85F0F6C1BBB2C326C29B5DDF6B5C4C11F8EED15C0143993FEB626543E92CE4D66C0BD28C79ED1ECB793A3091D6B9AB510B0D41AA42D70C2D8F26EA0B826C8C375E1DD89B3E2A48FE5D88A462DEAC33BAC35AA32EBC010AF7E47B77AD23653D747760914E0CA12864CD401787EFD96F30D82D8907DC68578067703DD19B2377DF319EB540E8AE78B2BE86BEE1C915FF3B2F4B25C0AC22CCF89BD85371961944D8A4E6D20E2D3E9DF3A07D3BF6986898786F0667545275FAC3EB0F069B457D8EBBE5F60125F94756DB04EA203451A0DE160CBCE2A34650D92F200448B097691A61361AC487FBC3C82B2BD7C1ACCA02031311971C3CF69BA459A0B640A702DB4467973713A6F2466560FFAC0592D64FF1D4A935220826EB559CFE0144EA4B8E54EAF67DDF91988DD4B3749C865008C0C1CF98BBF76D929B85C8C426C15FA56706984E0F2E90658FA3CC33EC9FC700976870C94035ECF9A0534B18D07F55923663835416E40235CC2550BD9822F0912CF101F86039830AD9102AA4A3B6777EDEC5EBE621082FCF81A1C6A528F0324EC9D39FA80B6E87D6366E7EDAA0E14337D6708F7C3D2FB1978F4F5CD594FD35B267F9CD09370D3366DCE286CCB9647A1944F8D8BE63E5EF8F6108CC5E9AFE9127DA84E1913439EC35A4E17F7782DF042DC2F7C5CAD8A659DB282E61763539B56C2AFA0F2B507D549EC8C9E76C7DB306380CD7B46C9699B6DB8BE06CCA15E8E83763137B06BFF02DE2738A46C61B70EDF4F394D54D0453DABF689FB6BA41616BC589CB9847224E74F919B6E03672EC6A52584FE81456D6E648DD6F0F9B068EB72241F067BF6B891A498A9A59356C735E10EFB37B3ECF47CC5620A35442DD81E25D2C6DB0E9E871301ADD193D628B30E3B4345751BC17E0B5B05AF758A653DE7BED3763303FFE1AF05E407F296C736CA6F4C348B25718C7A814BD0730AFFC057842AF3D9B9ADB12FCCD740ADD16218AA57E43835821A2BCD70F1027F3042D4A92F10D0A1FB8323E87869BFA8DA24DA75F8743FA3038C24FEDC0C987065421BF4B300BE3ED3F6D6D590968D3EE32A8F5E20EA6168756AA18BB78B6AA48C299C36D0E78B6F84CACAB5946C69179E461F4C2DD201D8032A29EC6C52942AC37D9C76AB4A401C9AFF96284E1E9E39BFF6D912CA33B6118067605EA65D7F611DD963F4F75F97346FFFD1DF84C79CCBA06804B3017775D8C0BF614FCF4D824709557937B22E1805A0A961ECF226F26E3706362BF6D8D1DD30BE7EEDA481A64961641DC57B9F0211F8EE43578E4C2B6507114DFFF3C3F884586BFD1278D117F7C6014FD5980CDF1E2FD1F34CCAD170842B9E819C22FAB9890AE265C3BB6946FCCFE218544D00A6BA5BEF5224EAE24002B6E83E0B35E98C2322BE2EB3D8234BE8B048C54E40782C9A24D7A8B461EC05F38A94AAEF3DA3B46D0D85B0D949CF1089408189FF97C56C7DEE50A004AEAD82C15C7C0D0965F3C65A9A715A65D29CD3614954EBD91EEB4E74F862FBC944C56F2EDEC4D344F92E8154708AD0F5575880503EF0F107A9A9DB99BAE82357C16578F3E6CBDF9B427DA88DC322D11C6AB2A6AE6F5179C94454E09DF5CAA6A519A4C1903C8F2925639E12AF793695F256BF0E55E0D45B73880358F09719ED89A4A1A07868BFBF16095A20035D5D4F99FDA19DDAE3E21CB98308F4508B5CEE706C27898F03A2BF14F29ACBF055E4AB0713A7B6FC1A7853EFD36E1290E69587FEC15D492A66B9A4FEA6E2BCDE61E02FE18E06F59A2F4E06F177B14CE4C1CF1A8D1F49C554A8A4C68B9937B4C230320C80753D4B071BAB2DEDA89C9181820336F1E766E447EA1C44E15CBB7C002C1813D2C1726DB0E4DE289466077DA9610E5F3AA313B1B01DD79A4056A8BBE9D843CE5B0439325FFDFE91FDADDEC6CB86D5CEBB68D8F9C0ED237A4648C412780ACFF48FD9CE817EA70D950DCB989EA6B11FD87EA4F30347A27488C5C15BE7FD6D1280FEA3A7C022F8D9881FAC93176DB2025B4C7914A51099893A791BF5BE851F325347484CA6ED51B2BA71548A6046EA7EC85B31A9967E7D119D2CA3A51C1E14D5A3EEF0D41BDD615DA01D45979007A1997DE281BC340C3203D5BC0075B1AA38873A9DBB9D18E6E26971E70B54E41E2C8C91D2E60FBF85435C1EBC4893C45A201B1D2391549F52A1CA3E0440ADFB746FBBF0D9933F9FA0220B3E04EBEBB29D2A9AC1 -pk = 0C83C22FE9AA7EAF2CFF9938D79768E64E9CCDAC21467B677532218A08AE5BE9EDF42162768BCF1D0868A05727B43FF4AA5327E9316EA59C93A8C704A7E41E00958CE49E351D24224279E50FE1FF996A8A6D5CA8896438BDCA4021B9572B69D27FFAF4BE7286C50651C22DC154DD9A177950FE7DE0ACFF757FE637DC00BD1C00 -sk = 0C83C22FE9AA7EAF2CFF9938D79768E64E9CCDAC21467B677532218A08AE5BE9EDF42162768BCF1D0868A05727B43FF4AA5327E9316EA59C93A8C704A7E41E00958CE49E351D24224279E50FE1FF996A8A6D5CA8896438BDCA4021B9572B69D27FFAF4BE7286C50651C22DC154DD9A177950FE7DE0ACFF757FE637DC00BD1C00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004291022CC47B83545C7AF5C1FCFD09A05986A374AFB1D87DAA9E26FDE1DBE63C20346412AF4A8CC46F07FAF0B20B388E4E005E1739C09B53BF691EDD60AE1E8549835D79D738CCEE3254DC4879D9BA0239A1A67BC3F17A331F010000000000000061B0F5BE9CB4B6E2B544707148B08E99FC9DDEE059BCB4E56F5A63C71C7251F29A4580D1F18A8A70AD07451381B6E4B3B3C96D8D71A9CD096E822D03703502C82DD026A56165A72A75818440B7ADA9C3EA90120B161FA19DBCF2FFFFFFFFFFFFFFF1D30ACB46037B8B6F54C20CDE3C9EF8FD3980BCF96BBCE3B750AE44D85BAB4A216C2AFA823DC2021B441403A597D10AC82345665DB54B431E19FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56CFD1048647271C54724945B9A3E6519E345762F41A2C2649D8BEEA84CFA54C3892C53FD238943BB9166B7BF466E2E569606FDE028761813B5A0300000000000000000000000000000000000000000000000000000000000000000000000000001D3A6B5ACEEC7186786CC7CDBA4814ED752EDF61A0DCB14E6A411F239BD7CDE17939208D4DDCDB8D36D0252F9B9AD64A2A24F5FFCB6E62B728C24E776EC917006DD0C1DB696596C59443F8011BB3728F189BD86A5511F7E7E3072689E0511EF9C66C7DF9DF8678586A59E042CC4C4DE7536425EF10375CD7B12D2E4CE1E60500FD72894252ED436B29E608A58329E078F1D4F2B65E004ECD648134EFE044762053028927F5E096D3E5D1D204478C4C5EA3B56C9C73006C2B6BA521538FEA14004F91128DC5C5C0BBF139394A3DBBA2CA4BB0352E65857C4B013FEA9BA0B93712753180B86839AF0A92E054B58D3C08F88210C155F666D2952F6E9CC26A8304006CA4A96DBCE7A37EAAFBB6F9DCA29616CDDA3F4D8676BEAE9D1C4515CDD30C28A3C158EF27EB8755F0784F91F3682EA8F7DA4B37C7C59FDFB33761B62F8C1B006CD629D42C8B829B3C8049E1F858EEC62247294BE35F47085C30D0FD0265E402F83D56ECD72AAAEDF5BC8E3FFEEA7331EA5B19B2C5EFE789A8E2B5187FC31F000832C1F8E99D8931FBB194127A196A25F6E5DE6AFDD4C07CE8D54295DFEF2EEA4DE8E6C049A5747541EA2D2D9B82465E382303AB9E18FEE29D293B08A6AE24003E744F886EF2C972D8F8ABD0CC4FF0187B9AFD0FCED4EC4227C973E0CF90A345D2F96EE0411494506669217FD8BD07D2450640F1E702B310780D6F66615E20000B4E482819ADB76D58CA414C93B0A958C64E4CA77506366538D491C51AA329BBA9DD4763C20B16A7A3A49BAC790C82AC3EEFBF2FFC78A31E97B18CFF859E1D00A4E51654F171D674A0BC5A962697C2CD7F8417A0D251954FCDC6522F87CE3ED1B550406C3AE67D6AD1424685F69CB7B5C7FD5D5DCDD2A57727463350DCBD0000DBC06EF5913ABD1DE13E50262FD9CF48868C00AF1911F7653DE640CB91D3C388A6C6293246F62CE6B866CF48E90F5B50CF49E7EB1869EF37EC9234FC6A901000094A5EA482368A37F6E54BD3AD3CF7988D2BBFC599E19B291CCEE311C55353EC76989E25B25FDE47F8D93EB14B9A643231B960573E8978576276D387E8EB1F0076DC0D1407FB5D0000B538869402594596AEAD524019FC0ACDE85837D1529105ACA8980E649E218ACD01A5C296635A938EC532C12A646F4854CDD620B133070047B0D07DF8B80154BE5DAAEE34375712F55852F71602BC4444D142068F0301CA95597706F95648136CD0933AB8C0691EBA6B076E4DDBC5C6E9B5E40DDFC51800 -smlen = 2150 -sm = 9C224E1FE094568A647FA27366135948EB5D01EB45E2902820950B6FE0D2D07779C3835268004A037EF54B4259C52FF0ED3193117F59678201B512DBFC846F9738942E1D33EAD391D9063C01C8DE2F9B63C8EB4795BBAF1A15BEC27D7D55010DE2B87C3BAD998E1E85E513A2CAE32F3678003EE8026CD4E1F4E35AA41039CC73C1CD7ED9013A41D265A3E383371B5B4879E67E935213790116035C1FAF4EB74E13C219314853DE11F8FB012FCB64CEE02107C68B1E4625B87D030B57C200C59B7379868BC3A949CD8BE8FC1CABC3196701805BFAB5017E59CF9D8471F3F172B4066E10017BBA302E59F11471B71AD8477F12AAA94E4300AF8949E41818689223DED6FFF6DE3553E86700007584A99F6FEE6595210232A8B60E50A48F6529D5607A00EEF39F7DBC0AF47D9A0703188A2CADADD3DF2B725148B6D1DDBE4D2F9C006CA7774283F0FB7BA9D7C65B22BD023EAC87B3D642CEAA3DC904AC3C4245CB2A260E4B74D0394D33D4B71024144180A727F80B092305F31B2526998EDF6F98E46933FDAF0E8709E98D54F13C2701C58BBE35292FD3334C5E03D345A9A2EA1E01B2C4573567FF1FF3BA7406A16F5A5805EDD760AC78A3AB8602E415F67C7CEA5B36421C79F83CBB14FA775448A832A4B28851CE215C11DCBAEE652CDD7342B6B1204727479E6208FB556CF08BF7EE230F32659E829CE4FBCE0955D01D36624BBAC18C1D25A3E187722F8F74C88B56E518CF0E78B3B0EAC56D8F13C4AFC4DA3613A41CCC2B0B0E2EBBFE5799E479F81335360D483596E9AE926751EC9B956555F271C2CCD85F0F6C1BBB2C326C29B5DDF6B5C4C11F8EED15C0143993FEB626543E92CE4D66C0BD28C79ED1ECB793A3091D6B9AB510B0D41AA42D70C2D8F26EA0B826C8C375E1DD89B3E2A48FE5D88A462DEAC33BAC35AA32EBC010AF7E47B77AD23653D747760914E0CA12864CD401787EFD96F30D82D8907DC68578067703DD19B2377DF319EB540E8AE78B2BE86BEE1C915FF3B2F4B25C0AC22CCF89BD85371961944D8A4E6D20E2D3E9DF3A07D3BF6986898786F0667545275FAC3EB0F069B457D8EBBE5F60125F94756DB04EA203451A0DE160CBCE2A34650D92F200448B097691A61361AC487FBC3C82B2BD7C1ACCA02031311971C3CF69BA459A0B640A702DB4467973713A6F2466560FFAC0592D64FF1D4A935220826EB559CFE0144EA4B8E54EAF67DDF91988DD4B3749C865008C0C1CF98BBF76D929B85C8C426C15FA56706984E0F2E90658FA3CC33EC9FC700976870C94035ECF9A0534B18D07F55923663835416E40235CC2550BD9822F0912CF101F86039830AD9102AA4A3B6777EDEC5EBE621082FCF81A1C6A528F0324EC9D39FA80B6E87D6366E7EDAA0E14337D6708F7C3D2FB1978F4F5CD594FD35B267F9CD09370D3366DCE286CCB9647A1944F8D8BE63E5EF8F6108CC5E9AFE9127DA84E1913439EC35A4E17F7782DF042DC2F7C5CAD8A659DB282E61763539B56C2AFA0F2B507D549EC8C9E76C7DB306380CD7B46C9699B6DB8BE06CCA15E8E83763137B06BFF02DE2738A46C61B70EDF4F394D54D0453DABF689FB6BA41616BC589CB9847224E74F919B6E03672EC6A52584FE81456D6E648DD6F0F9B068EB72241F067BF6B891A498A9A59356C735E10EFB37B3ECF47CC5620A35442DD81E25D2C6DB0E9E871301ADD193D628B30E3B4345751BC17E0B5B05AF758A653DE7BED3763303FFE1AF05E407F296C736CA6F4C348B25718C7A814BD0730AFFC057842AF3D9B9ADB12FCCD740ADD16218AA57E43835821A2BCD70F1027F3042D4A92F10D0A1FB8323E87869BFA8DA24DA75F8743FA3038C24FEDC0C987065421BF4B300BE3ED3F6D6D590968D3EE32A8F5E20EA6168756AA18BB78B6AA48C299C36D0E78B6F84CACAB5946C69179E461F4C2DD201D8032A29EC6C52942AC37D9C76AB4A401C9AFF96284E1E9E39BFF6D912CA33B6118067605EA65D7F611DD963F4F75F97346FFFD1DF84C79CCBA06804B3017775D8C0BF614FCF4D824709557937B22E1805A0A961ECF226F26E3706362BF6D8D1DD30BE7EEDA481A64961641DC57B9F0211F8EE43578E4C2B6507114DFFF3C3F884586BFD1278D117F7C6014FD5980CDF1E2FD1F34CCAD170842B9E819C22FAB9890AE265C3BB6946FCCFE218544D00A6BA5BEF5224EAE24002B6E83E0B35E98C2322BE2EB3D8234BE8B048C54E40782C9A24D7A8B461EC05F38A94AAEF3DA3B46D0D85B0D949CF1089408189FF97C56C7DEE50A004AEAD82C15C7C0D0965F3C65A9A715A65D29CD3614954EBD91EEB4E74F862FBC944C56F2EDEC4D344F92E8154708AD0F5575880503EF0F107A9A9DB99BAE82357C16578F3E6CBDF9B427DA88DC322D11C6AB2A6AE6F5179C94454E09DF5CAA6A519A4C1903C8F2925639E12AF793695F256BF0E55E0D45B73880358F09719ED89A4A1A07868BFBF16095A20035D5D4F99FDA19DDAE3E21CB98308F4508B5CEE706C27898F03A2BF14F29ACBF055E4AB0713A7B6FC1A7853EFD36E1290E69587FEC15D492A66B9A4FEA6E2BCDE61E02FE18E06F59A2F4E06F177B14CE4C1CF1A8D1F49C554A8A4C68B9937B4C230320C80753D4B071BAB2DEDA89C9181820336F1E766E447EA1C44E15CBB7C002C1813D2C1726DB0E4DE289466077DA9610E5F3AA313B1B01DD79A4056A8BBE9D843CE5B0439325FFDFE91FDADDEC6CB86D5CEBB68D8F9C0ED237A4648C412780ACFF48FD9CE817EA70D950DCB989EA6B11FD87EA4F30347A27488C5C15BE7FD6D1280FEA3A7C022F8D9881FAC93176DB2025B4C7914A51099893A791BF5BE851F325347484CA6ED51B2BA71548A6046EA7EC85B31A9967E7D119D2CA3A51C1E14D5A3EEF0D41BDD615DA01D45979007A1997DE281BC340C3203D5BC0075B1AA38873A9DBB9D18E6E26971E70B54E41E2C8C91D2E60FBF85435C1EBC4893C45A201B1D2391549F52A1CA3E0440ADFB746FBBF0D9933F9FA0220B3E04EBEBB29D2A9AC1 - -count = 55 -seed = D780D7688AF364949A196657A066BD48FFA8DC45B4885279B6DEF362E5957F398CDCE1D20FC3F8F63A275C325FCCE654 -mlen = 1848 -msg = BAA4A41E4B68FE333FFA5EE97FD3DE18F0EECE8EB83E46A8E3505E2EF8AEA2C4040BA3809A764B681EC7449F41A2463651A8CC6DEF0E4A058EB843EF016E5CBA8D55F925E66524BE55CB98FC3169082E52E0D6CC3600C4E8A560B6D448A72CCC95620101323F98B43E28D6357414185ECB0263C7BB94E7F86146661FC897844CF52873114D39123260893DEF13516F982783B927864B61B56D3A8E5B4705DA3A95F6D12A6637C9CED02F07B4AA0B08B4924103036C2A93B31C91EBB6C5B77DE090EBF60A04191EB6CE9CC9B550F5B0C9104B74D15358854181C0C5640FC74CAEE14FED6577FD75EECA14070B6D02A9A421247A5BB262D6E62B04649E75BBD3ED8E72752289FA7C1A68096DD96A4BAC8A2DC27C44881DD2416387D74A005680A3D229D562D3DAAF8DC37B4C87CC86A8C991E9327CDD43BA930CDD8D1E44AEFB084B51111965C5DFB0EE2F09112B070CBFC545119ABA823EB3F65F26BCC025B39F79BE42C0396C5FC9FC924EF1B7EE9DDB71B6E69B579C0A64C5B020206CD3515B8D5F4FF29378B9580D282F7E5ECEEB5CE9C09A7B334E62151100CD658DFFFA66F4091231BEA6C9DE8129EC4F5FBE8BE0FF4BC93367DC69D9E38C177B23AFBA5C27FEE3E2B73C0037DD7C419C854DF7C2412349BAB43869469E80527C3AD3A7103152F9E0B03353A596002FF54ABA8B14AC393EE52EB5564D63BC2738D571FA3C255ABD20102BB299441B00EB988F3A5CFB238EF8C49963B4AE8877E6B317E208821510BF446CE6B06C33717C91C460924248382159198F09D0F5A25C1611B2D39CC6D2ED149FDF0E09A0B0B2BB77067182E386F5F6A55B68808DAD98E5CEB0FDFAE6A0315845ACC7B9C172B0E82190A5EB7C58DE4F86D883292A883045C62D6A1B3C886C345AA6158276EFA6B93AB2188E47ABDD25D332146E980E1B1E043CF63EE35A5AA01AB6CC62F77699DCA16FA30E3632DC5CCD3253D01E547746C78021AC307F0EF1A0119AD11504803EDAD933150981C4D9FD181835C507651DC92A86737E3AFD0EB4DDEF6182872FBD31BFC6D8427C2F4D3A39BCBE6B5120B8CF2AF5DC59949C92D10B1C6A96810564DD335E0755F9DE25EC26C102355688C38250DF8F96E105136855C8DE4BDCD86DF03F92977DA16908CAEEB4056F4A5F751A57BA057AC0309F1C107E594CF3C31544E4F1D93FB9AE7E1A2451E7082CF0C850990EE71ADE0498F6A3852DC4FC128BFDB8ABDDA3D759C8D4F83FED8509CDE5EED38410FB9F0A5F30EA45C9270BA2395DF645AAEE03F56158685A0BA65DE3D2C5209A7EF4BDD4BBE0CDC966DD1BDF1FE0BE06C7115F7CCD80F8012E5D17955AE0C9E4220076882F30DC5E391295994B9F809C09DBED8CCDFC89669F40492944FF20948080A4ED66AD8166B613AB2F4414762AE493EA6661950E8E56B3758A77CDBCFBF24FBBBF20EACD5CBF8815899A1C3FD20B1D04920025885388012D9C58EA842DB9530B7ADA901AB9CE46A12700687BDE07FB99BF66D0C775218B8454C936F03558B899B59361A0C664081CE8A7858DDBC5E7C5480280411C9ACF4D1EC45035D97524E9E44F963532CA5067609540C1BCB5627F99D5C61CB9A6D400F0BA0A74E45DDAB5A4E8A765DCF2F3684E3A2661A78AC069FA38163AD9F9713EB45C841C6617697CF8A72C54B550DBE9C22B04D579B09AAB0EF4EE8B70CA563F81EF9700C07761C944926F9A76A8C3EEE1CF7E7524D65908C47C35B0453DC10DB5B75123A5B26B9612C0AE18816A71F34638798DFCA21F5073CE771500034F9A71FEB8B621356C430B4D47CB1B59AD4677B5C679188D8861BEAF52558165F691F65A692E8CB8D24ABB74B8885EDEBBE52FB13DAC16E3A8EBC4EF192FD10D71898E93547C7A09F8642AA3B4FAAE23E48BFA809C5989D3462AA50FD4E5C4095542C45E5600926C2DECB4D18BB43B7274239A8DFA3D9DE1BB9CA099DFE56DEDFC9E120867EFCDA10B48F7E630506AA606D76E4537036127FA05FFFB8B8703CDC8DE70A78D014872111A431F393345D74E8866D9A9A633923072E93DBF47C54C4B205C60E67D5155B76F51AB49ACC7435525605DD43A10C88A03E08E257C68937BF2984BE63D40F8A60589D909F8F09688A77DA15DC7B4853339F235B1BD60AA845B4DB6B699325885C49DF9C40781CC56FABEA6201E2F8A9352C28CE321B9441422807E9C81C8F1EC85D240C9F1C8ECC4FF06D6E3682DEA3E6CF92F2B74C2165AF247CE0F5AB84460693254B523498A57E7442977F51F1C2F649BDF756E7F43AE543F5D8E692820F8A06322667A7FA9C1A5B10199A69CCEA22C74E172FED43E550C68C337ECC5E6AAD9F7EB997A7E619D47DF73CB917A705C3CDE5FF344F6FBCFAECCE6B734E09A385FE54B224A880704D774581074C59EB0A3B42C59B8BA4518E764C5A532F6655DD839862AF716903A118433CE0809376A88E88FA847B4D1C63EE393267B15C1E42A91DC6107CDE990EC9ECC7C1066E9480E90A22907C51AF47DA837438A90CC07DE8121691BD73802D5D09D18A2D8B38A28948735110891D1B559A73445838F359A6FB90A3CAB887486CC9D95CBA35B55693C890830D2 -pk = 9979BDB30D80FBECFA167FB94C7DA613B369D1758C3486F6779351FEF0F3DCB5D13278F4E0506DD4447D99E9A619E561A804E4D3D22AA5018ED16B25518A0800096DA3270C08C5E9CC249EA3C09A967189DD6BCFDC227768048F67D24C9491F441EA621FC59F705E501F4B2DCC1D8BE57AED1A8ED990563F39DFD090342A0900 -sk = 9979BDB30D80FBECFA167FB94C7DA613B369D1758C3486F6779351FEF0F3DCB5D13278F4E0506DD4447D99E9A619E561A804E4D3D22AA5018ED16B25518A0800096DA3270C08C5E9CC249EA3C09A967189DD6BCFDC227768048F67D24C9491F441EA621FC59F705E501F4B2DCC1D8BE57AED1A8ED990563F39DFD090342A0900020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004F9941B207D006A8284785C598E01C6DFA47B572FDECA422A0E595DCA51E1B8FC45BA77FD2074D992E3BDD3E23380E65107E303CB9234CCE1FC2C02D90D947ED983D46F19DB1527DA104144F175699F8DBDD7CBBDACB7FB020150000000000000086E87424ABFBD4378A890F9291711429AC05687966491AAE4D36E8E6769687D4057F1A193B0965020F45E8B1F629081203A9E6EFDA08A13502E3243620234BBA04563E2B3DA1746600D6620E2D8C885447643D6789C8BBF51EECFFFFFFFFFFFFFF1E9F6ADF08B749364BBEFE73E625A6AE12CC5B56345BABBA66E80E35BA2A10FF63E05CDFA8DF1A5C3696DFB084B6ABA9280F7A4A54FCB5DDB18BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FED414A53B4D96249B73A2F53E1C22196FB02E356E9389A729F4CC1B570090A5EEE71EE68601833F88ED3A5D713A3FD6920F1A41C533EF2D73E010000000000000000000000000000000000000000000000000000000000000000000000000000F78885F1DA67C9D6226287A6D45696E976180A8833CB57A99DA3CB881EBBDC6A828E073375AF7AABE07E3970B07187A8B8749C1E719DD1E3EEB3BD7056191A001E3767F79634BC9D024A94E936B3EC6373FA9BA8B9DB375775FC6942198955D573B172DAEDE07204AA120503F9BF602746DE39943FEC3FA6E6B1C0CFB5661100E488FE0BBECE06B336F905F4C66A44DC428AB6FA7752F752B7890CFBC42D6EB1AC94F8B8838413E8D50902B2C8C357B4EC17139F2C8A2C268FBE483B295D0900E8E0056BB4F2C389190F409D51B31F4BE2B1FB04E519CF99DE3B500D81173293A7B3BA8E4F8B5D14A9D9DD1EAFD628D6A8A5F3CDFBF78F9B8F350EE5BD43020099069615CE7A3C58778AB1EA07D94B166935CEA7D301F2776C86B331C9340E58DCDAA4E3C28FC1BD1DBD02E7B8728B02EFB5B9AECF799BEDC9635D97F0C11D00D950665DB3FEB6B2E0E204CEF8356250335E655E4602D1375709B140B99B212017D144E05B37561F9AF3EB9623A26AA3B6ADB255BF87DA1D42D4A522B99401002608B5BCD79D1F12354FE188F88594E3777AB9E5F5AE8BF38F2D05A3046FDB740B3213F90FB0A2BDCF2D21668F90190EFFD6C8B4D58A75EECED1E8D8C7A420001DFA85777E454ADE509C864C49B99ACF6233BB0485204412EBF98E627B3D6B10CB5D701A8A34B21505C2F6E32438EFD951AEB91431F559F0D97D53042CC008005F50CF8D2CC335514262A37DD4DBF11D38C14AF3EA665B9440B55F5C9E6AAE6623DF2495FE400C395BD1DC8448C6C7E30D7652F795F606675799D1DB45F6190025904FE994F884679976BC10102A90A52D247B508AEA9A46D0AD1E0C16311F8B1CCCD19AC9C02C0DF1B3D36FAEF6F93A75D5335840D775D7CEA4049A43170C00707C75767EEF100C2011DDE7A783D0AC65A44C6AE0379F42C2687D9D200B606D649C03E1F0B1B7B5F0240EDD24FD394494FC51E3A08CB03594E0CD4CE3E01A002FED7301BE546B8C907E8203E9919E744705AF3E057A6C32A7874DCC9629BCFE1E278AD431044A1A8B1D55DD6AEDDAB2901C852A7E6D38D9019446D8197706008B58949B8543FD628AC0283442C54CFE9C2255B153CA67EF6B00E7175FADD23E85FEE8F00AEFBA976DD4871A0B1ED5CB0C94AA9394BBA9E8F479F3E65DB10B002970CBF99902DFB8705BAFDFFCEBF4F32183245FA7225EF5AEEA515F73E13AE5AD24AD016B30AE53E1CEA73F7CDB9565A5A674F3C780E480A7AB18F0FC681900 -smlen = 2183 -sm = F1FE784A96F7BFE26EADECDD7639F1B5D4A9005DCB1D5BE5C1AF8417BB2CD8356733B8EF6200C20F18CE5B64B78B3EB0F1738958348C4F75003F2054DF2AA49397C6DA7EF974FA73A5128801F81DB2312020A3BB5AE0DAC6B0430354033601DD4534CEE1F3596089236477D54680F5FB5900041DF6124F06B73BFBFF159BE26358E535F8009924A90B0ADCD05404042AAD3AF651A379770050844BB82C6DD6FC82792DFB67CFCF715E7D01F6874008639A294431C9AE90AFA30F5E8A1A00790AA7E2DE6BB2DC4C997E11711EA1244CDE0141EDE4C24A0A59F57A63B2CAC95FF6F8477D016A4A3ABF9E100F8191309C7C0F81CA2C2886008109FEEBFEF5A26EE5FCA28A9840FCBC4434000171DF8AD61EF370C9F12B3CC14DB32D8B756C533C6E8BC8E1CBB021F03346A85B0603CB5F4BBE19FD21F59041E64FEE812D44CF9400E7EA374913AFD2E221B9AFC67F0C00BAA4A41E4B68FE333FFA5EE97FD3DE18F0EECE8EB83E46A8E3505E2EF8AEA2C4040BA3809A764B681EC7449F41A2463651A8CC6DEF0E4A058EB843EF016E5CBA8D55F925E66524BE55CB98FC3169082E52E0D6CC3600C4E8A560B6D448A72CCC95620101323F98B43E28D6357414185ECB0263C7BB94E7F86146661FC897844CF52873114D39123260893DEF13516F982783B927864B61B56D3A8E5B4705DA3A95F6D12A6637C9CED02F07B4AA0B08B4924103036C2A93B31C91EBB6C5B77DE090EBF60A04191EB6CE9CC9B550F5B0C9104B74D15358854181C0C5640FC74CAEE14FED6577FD75EECA14070B6D02A9A421247A5BB262D6E62B04649E75BBD3ED8E72752289FA7C1A68096DD96A4BAC8A2DC27C44881DD2416387D74A005680A3D229D562D3DAAF8DC37B4C87CC86A8C991E9327CDD43BA930CDD8D1E44AEFB084B51111965C5DFB0EE2F09112B070CBFC545119ABA823EB3F65F26BCC025B39F79BE42C0396C5FC9FC924EF1B7EE9DDB71B6E69B579C0A64C5B020206CD3515B8D5F4FF29378B9580D282F7E5ECEEB5CE9C09A7B334E62151100CD658DFFFA66F4091231BEA6C9DE8129EC4F5FBE8BE0FF4BC93367DC69D9E38C177B23AFBA5C27FEE3E2B73C0037DD7C419C854DF7C2412349BAB43869469E80527C3AD3A7103152F9E0B03353A596002FF54ABA8B14AC393EE52EB5564D63BC2738D571FA3C255ABD20102BB299441B00EB988F3A5CFB238EF8C49963B4AE8877E6B317E208821510BF446CE6B06C33717C91C460924248382159198F09D0F5A25C1611B2D39CC6D2ED149FDF0E09A0B0B2BB77067182E386F5F6A55B68808DAD98E5CEB0FDFAE6A0315845ACC7B9C172B0E82190A5EB7C58DE4F86D883292A883045C62D6A1B3C886C345AA6158276EFA6B93AB2188E47ABDD25D332146E980E1B1E043CF63EE35A5AA01AB6CC62F77699DCA16FA30E3632DC5CCD3253D01E547746C78021AC307F0EF1A0119AD11504803EDAD933150981C4D9FD181835C507651DC92A86737E3AFD0EB4DDEF6182872FBD31BFC6D8427C2F4D3A39BCBE6B5120B8CF2AF5DC59949C92D10B1C6A96810564DD335E0755F9DE25EC26C102355688C38250DF8F96E105136855C8DE4BDCD86DF03F92977DA16908CAEEB4056F4A5F751A57BA057AC0309F1C107E594CF3C31544E4F1D93FB9AE7E1A2451E7082CF0C850990EE71ADE0498F6A3852DC4FC128BFDB8ABDDA3D759C8D4F83FED8509CDE5EED38410FB9F0A5F30EA45C9270BA2395DF645AAEE03F56158685A0BA65DE3D2C5209A7EF4BDD4BBE0CDC966DD1BDF1FE0BE06C7115F7CCD80F8012E5D17955AE0C9E4220076882F30DC5E391295994B9F809C09DBED8CCDFC89669F40492944FF20948080A4ED66AD8166B613AB2F4414762AE493EA6661950E8E56B3758A77CDBCFBF24FBBBF20EACD5CBF8815899A1C3FD20B1D04920025885388012D9C58EA842DB9530B7ADA901AB9CE46A12700687BDE07FB99BF66D0C775218B8454C936F03558B899B59361A0C664081CE8A7858DDBC5E7C5480280411C9ACF4D1EC45035D97524E9E44F963532CA5067609540C1BCB5627F99D5C61CB9A6D400F0BA0A74E45DDAB5A4E8A765DCF2F3684E3A2661A78AC069FA38163AD9F9713EB45C841C6617697CF8A72C54B550DBE9C22B04D579B09AAB0EF4EE8B70CA563F81EF9700C07761C944926F9A76A8C3EEE1CF7E7524D65908C47C35B0453DC10DB5B75123A5B26B9612C0AE18816A71F34638798DFCA21F5073CE771500034F9A71FEB8B621356C430B4D47CB1B59AD4677B5C679188D8861BEAF52558165F691F65A692E8CB8D24ABB74B8885EDEBBE52FB13DAC16E3A8EBC4EF192FD10D71898E93547C7A09F8642AA3B4FAAE23E48BFA809C5989D3462AA50FD4E5C4095542C45E5600926C2DECB4D18BB43B7274239A8DFA3D9DE1BB9CA099DFE56DEDFC9E120867EFCDA10B48F7E630506AA606D76E4537036127FA05FFFB8B8703CDC8DE70A78D014872111A431F393345D74E8866D9A9A633923072E93DBF47C54C4B205C60E67D5155B76F51AB49ACC7435525605DD43A10C88A03E08E257C68937BF2984BE63D40F8A60589D909F8F09688A77DA15DC7B4853339F235B1BD60AA845B4DB6B699325885C49DF9C40781CC56FABEA6201E2F8A9352C28CE321B9441422807E9C81C8F1EC85D240C9F1C8ECC4FF06D6E3682DEA3E6CF92F2B74C2165AF247CE0F5AB84460693254B523498A57E7442977F51F1C2F649BDF756E7F43AE543F5D8E692820F8A06322667A7FA9C1A5B10199A69CCEA22C74E172FED43E550C68C337ECC5E6AAD9F7EB997A7E619D47DF73CB917A705C3CDE5FF344F6FBCFAECCE6B734E09A385FE54B224A880704D774581074C59EB0A3B42C59B8BA4518E764C5A532F6655DD839862AF716903A118433CE0809376A88E88FA847B4D1C63EE393267B15C1E42A91DC6107CDE990EC9ECC7C1066E9480E90A22907C51AF47DA837438A90CC07DE8121691BD73802D5D09D18A2D8B38A28948735110891D1B559A73445838F359A6FB90A3CAB887486CC9D95CBA35B55693C890830D2 - -count = 56 -seed = 36AB8588F5233D15674677535A682382C29968FF824031AF646F58FCAF0E83C1C486B1E75479149FD6F4D9E8397CAF73 -mlen = 1881 -msg = 0707EA05515798829F42A4CBDDB4A95C5750879E0A584AB503F778015F83BEBF6D63C3B48A4F478EF01091403DDC5A9662E39707DBC8502ACF50F3E06ED0199CC647EA155FEEF503BE045BEA4035C07C4CCEDA306B8187185BD06C14220F2B7401229969C1CFF8C36D499D5A725FA1CE7B44D71E6C0E4E750766183883D838DAE4F00B140E0AFCCB0E72F935018A6314232DC632C5AD3C26919D1A7925BF0F665CA0223439518143486CE92650DD145FDB2E97E0D5BC9D6806F442FE90C9C1F52992E670DB2603AD885FA42B3D8BEA4E470B7F76A367AAA506E931890B6E4607F59E87A7A5FBF3991EEAEE47CFBBFE3CBE028E67BB645D37A7BE5E7CBA6D7955CD62D1D8DB0D9772EA0185C25BC1AD40A09D3E7E9CABA72BDC3A6EF3C40C7ED6208854157914A80B5C66A6DEC2317FB5A529421C03CCA6FC0A3B3D51556E8DEE7C1EBFBA924FE2EBCE8A46BE96E761AA6749C0A9A2B2FC49B42CA47663EA3395DF22DE20947DB14FC1FAD03805955D67F8473BAEFE2C1E22BDCC7BB988DB0DDE4E83E26A16F10B93BD9CFDBA77B9302EDBA0C9AFBA7369A023EF763C55484F7425F842111CAE27E07A511A725F25D422D933F2EC201BFFE3291411AC3CD6E91018C95074C18FC780A73945B148154987854CFA1CF1199BCD03519C8F34774453DF90B71FEA6734DEA7191EE2A5735F7A191F527642D53C844B087E9346B07EDD0B78C36F83445825E60A13C424F72530E05F75DA8D33957FAFF004DEB549985790956A0E7D9B256298D56BC6206F1E4E1E958FE298641A277A2C8B6B9B7660DBF689AD7E1A19CBD965CBEAA4A0D30741586290576996AE668ECBAB4F06F2A1D542E32C5D3F042E7E29A41BF86BAE29E7029D997876CFB23B10986A45CA029739B2446A29C55561AEE8FFB187961E6E7401D726AF6D8A5C816B2CEAA9A1C9B780DDCC4F0E4003542B193AE26EC687F8C51451D2D5387D9C3B9EB95981DF2DE069FE741CD5C15F6D1B12C5B9B94230ABA33BF46DCE8AC7E26896EDCB4F87272C32D19E72C313738855C02C6F46F1162BE0A3ED2E76704B16169689BF532EAD7AE7F2B26F4D9B22712662BEEA1F46748FA4C27D1D825D3FE493B5B3B513617C81D21A0912D329C5A4E3A90EF5A29A4E3137D1CE3EEE99C42D034E61593A4076EF124BD6BCF8FC911FC9F6077D82C2980C2ADB955939441BC9E81BDF9D6996CE578114C01F9BA096D6EA40F4E0FBB18B3E3D25E7F6D6CB670AD26F604368ACB6190667B7B7ED3C1A1DA04E42AE0087852834B91AA072AD51C0193E5299481221BC9083118F7B5503559F1E2D9E22A8D57932CD0B59509E7D7F459E20EBF4C1D0DF71472340E64992C0485D593714D6B469547616DFEAFC95089689931E79944204A6D0A47A565DC325F3BE19FD44BB6CD4BF2B1D4A78C883154D70705E121B833A4A7E7E80FCDCA03F52C1F831AB0D989AC5DBB5CD83BABCB3EE74B69681818DC05E33234775123F552CFC7C7BB0B98C937957A2C4E86E3D775468A7CB8D33756ED7489D04DBE52EAA2737EFBC4C4D0F55B5A841E1453763E611BAC358FAD0B5778C6015D97CC42CA9FECC66CF844DFE55587C200DA5250B3A419791F57D3A4F672551BE885DFE2AA8637D6C890EE8E1063E782FD7E2CB356BF47B6EB93A155D8D64C9F6CCA3971C5A7FACC3C052A2AA9FB286750F76933261AFF5CE408BDA8382AF8535145F432F78B3B25A768B5DA2A211D1D07AB557CABC7A139F66EDBB744AA76E0FBF22092E31C92CAFC624EE1DC6732F27E8E7632C6EEE2D1F5C85B52D712C884B36C91DA383F0DE9E06E5EF63D7B7A692E5E91BA1A1D9298E26694FAAD9EF262F117DF8115E2E877197A8069A96210CE65D45E6AA7011654ACFAFDA810CCCC20C1985D54483DAE12B29D7ECF66376968B52FBD727CBAE7C9E3DBFEE7391D985228ACA9EB8EF98FAE32BD24552A6B34BAA581DBB03676A3A4546E10EFCEF269B18E1172F560FA0F0344149543551E079C1745BC0425B5233B7D7DC32F751D321638EDB1CEE56DF0359EB6D9863CF3E341A56060C8EF8486014F956C39B751AE239A493A017B2FA5210D374BA83DF5D799B7CD92987FEBB0B2CDB3EE42A61381304C5EAE2ADD4777011C3279BBCD1EDD6F91FF72B3C353AC35DA8FA843DC5561D3CDB507730E8BEF20CF09B0DDC36D47F4C10D82652DC2937D889F83B1DDC30E52B244250D19EEA9CF7A3B5D931E2E25B64A0A81B2C4FE933A17BEAC2E10FD888D07F994E4F2583D204DA126533F5E36B62486A00CCC317C4381A8FE11D36C43E71BE108E22A98F53729F05A5E0AA38D512423DB4BC1D6BFAE9117383ACF94AE2A737F6B8070858BEAF08E365CA84925F8BEBAEEF5AF77EB73A9D3648AAA6493CEBDDB95149F0DAFACF129FC321E558084A44CCA4B429D664D90DD90F2A04818B48D135952746CECA76F99B947A33A3BF7C535B187C1971AF4FCB1EAC841BE7E96F429DD38127B52FACC2DD6512D8D019E0080CADBF7078FC67E9AF170A2A00F70F407B0A7FF469E2F6EA165F8B43EEF1779A115089DE9ABE6B78C93E4B8E3B018686D16CE8EBC88CBC1D571372A3996C9E5967C035F9DA6E200E7ECFD1CF7158563F36A3AAC3CD8ACF52A4EEE29DCEB03FA3272A671CFC9B -pk = 5591015C4B5769501D5124D6F6CF7A52241818CF407C2565CDB832289682D192E5B200E12AD810818CF52C3479511A1C55EA5EE8D99A94CF03112DE844D410005D6AFC440FB68EB4F75024524D067C98B23B70E3221F37AC3526B301355982DC7D6563F4240956C9060FE34FD173210D9AB3095BB59242BAC0C345CC5BBC1300 -sk = 5591015C4B5769501D5124D6F6CF7A52241818CF407C2565CDB832289682D192E5B200E12AD810818CF52C3479511A1C55EA5EE8D99A94CF03112DE844D410005D6AFC440FB68EB4F75024524D067C98B23B70E3221F37AC3526B301355982DC7D6563F4240956C9060FE34FD173210D9AB3095BB59242BAC0C345CC5BBC13000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066F7881031111C312C799DBD94BBE5F2F047FF9EE7F6837BB7351D40620E3AB48D5708588546E61FF0E45D31BCA59B5C6FFCA098E2EDCDF03992D9538A58F4D3531A2604E1F568000A9BEF12933CAFDF13EF4C124CF5EFB65306000000000000008B7482AEF4F51DE0969932862FE082CD0DF773EF1D15379B19BC4ABF257B5E6A314507BB7EC858E3272D33FBE2ED1BD4DBA0799411C88A18B2B5276B2802E46236BCD9CEDA1C9108EBD17AFF0AB79A3FCA84D429C59B5EFFD9F5FFFFFFFFFFFFFFD57EA7DE7BA0F34C366F845C79AE8836E366BBDA22B930DEC593B64D4609BC7BEC526272B2E7A6190DD055CFFEA5CF486C75415BF400D268EC73FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD664AD1DF246775B557C34729B21639CAEEE285D0066666486A277688504FD5B53958BB0FA15C8E00D0DA235F67F3B7F10109F6FB63E83A9074104000000000000000000000000000000000000000000000000000000000000000000000000000000ECE70E21B3EE6BAF14AB39D1E97CC2F25867ACBE4D5167207F7B8D4157891B1E4C2CF93085AFB52966C4E0FC18559F007A16BBB6CADAB84467AC4487500900166B67435A50FA3AF13D06E7D44E910AE885C31C999BE48B191451570304FE621B3C8FE8AE8FB16E8DDD3C896D05FFF9368F6F1F8E40BD2DC443CC7B98041D009D61107722B3B0E936785B381CA9D679D2804396AE3247DA38C28BE1F619F509F884C6C5D1BEB0C70BAB4F23A98DE07D7B1D27AB3598440B30259AFAEE4608004B371F471470083D84BCB2B07E3450E4C6C1AC7D30902CA093A97105E8780ABCC89DB7AF12D288CA547522DFA6CDB58C6709369F25288037C9F99D4E3AAC1C00F280477B720CE689EF3E9F0F030A1EAE1B6D802BCF68E4A0E75635A8D8B075326C386C9F3BFDE41965E06C220C5C4D0E4D55218B5226FCC3466A12489358030089A6F26AA30E6994F8848488F98E7D331DF5CFB68BF841C4B8AC942FB3E8D720C02F9402C2C184574E7A6D14643FF183C63F1C1D0C65DB6B340E83C2121002009C1E940607CBA468D350F4F65F520EA3E743EEFA789862C7E4A91F0A7E658045F5ECE08F5421134A54A01D553BB55CBD4BCD69D08E64A868588F2ED3D56E0A0056816248EF91DE24928879B453DC1B5BF2E840E905AF72E660DAE87AA1D33CA356B59C3DA322C1CCFB62E3574CF6A0F2B06B86C7B49624BD6252BC28D3150B00C37752285494760EF55C7C27232434F85DC6316BD669D38CD0E4B36CCAC7251E9553C68CDB4E9C9C031EA90BA533C1E1F50D1EBC31F9B7992C8F29CA586E1300DA21EBB2BC935C4BDFA3C416B66303C59BEBDCC3CC75D6D917D406E67A34CCB44E8FE714845D702BE0897233D30D6AEA9EAE03B4D9F5BFBE8CAA89B3E03A170038F4831545F0AD12A10D0F0BEADCD2D71C91385E30B26E30EA58EC09C891E1FA443CC2719844236922BC5E2E7F5C490924041A9CC8D506D867BFFF6687790F002D8057C557C3DBAD58BBFEFE98CC96DBACF7C054260EA172BFB13D25CFB11ABD07851173A00D29D81884AD552FFC02FF8819958645E2A25846EA348745902300819CC8033305D57C6D408327EAB4D23E23235E55F16A6FE53973E52C67DDEAF1E4630F8EBE1047EF373A78AB30079FEA3A48C07AB9BDF55A4CB935913B5D2000B3A480E6BCA4F8ADB2D91ABDA922C19DAECEEBD47512BB28E02398A7DFA049615F8253473DC058586E427FFF3C8627071808258AB0D4FBFD4F9EBD9EB4FD2100 -smlen = 2216 -sm = D356C219D12993C612B28BB7EB752F9506940099072169EC8B9B60BC863C624537006BA08F0006EB5620732C907A079378924988C0972C120040B45ACDDE46C3B6314AC32620F72E01812E01C3E2ADB82CC7761FC89E7C04527CFF7E292B014833DEA5B4CDC0D4C9D1FF63A8E1B060E2F201EAC44EFD8AC4D511ECBC524B37F18F076644009C5EBA5623BF48810F4025F0345A7F6335B4008FF0D314B0295A5DF5F83224913251BDE5A40017DA628DCCD3BD53D9547AAD0FEE06E80D68000D762956B85012BF9F7BD5B6E2D417D4289A005356EEBA7FEB699682E3A490996E96C4B9E101F6FEF2BB8BF1A5F887B3A3C9EFE63801558701D30D48FC413DD42CC528370042F3A476268A0101936EA6422CB82D477FD5A6181D860760FDC054127C223C1FB40A740191594BEF0702D0E454CBD16072B9BAA9598E60DDADDBE36700DE27C649DB6FADEE5C3B98606809020707EA05515798829F42A4CBDDB4A95C5750879E0A584AB503F778015F83BEBF6D63C3B48A4F478EF01091403DDC5A9662E39707DBC8502ACF50F3E06ED0199CC647EA155FEEF503BE045BEA4035C07C4CCEDA306B8187185BD06C14220F2B7401229969C1CFF8C36D499D5A725FA1CE7B44D71E6C0E4E750766183883D838DAE4F00B140E0AFCCB0E72F935018A6314232DC632C5AD3C26919D1A7925BF0F665CA0223439518143486CE92650DD145FDB2E97E0D5BC9D6806F442FE90C9C1F52992E670DB2603AD885FA42B3D8BEA4E470B7F76A367AAA506E931890B6E4607F59E87A7A5FBF3991EEAEE47CFBBFE3CBE028E67BB645D37A7BE5E7CBA6D7955CD62D1D8DB0D9772EA0185C25BC1AD40A09D3E7E9CABA72BDC3A6EF3C40C7ED6208854157914A80B5C66A6DEC2317FB5A529421C03CCA6FC0A3B3D51556E8DEE7C1EBFBA924FE2EBCE8A46BE96E761AA6749C0A9A2B2FC49B42CA47663EA3395DF22DE20947DB14FC1FAD03805955D67F8473BAEFE2C1E22BDCC7BB988DB0DDE4E83E26A16F10B93BD9CFDBA77B9302EDBA0C9AFBA7369A023EF763C55484F7425F842111CAE27E07A511A725F25D422D933F2EC201BFFE3291411AC3CD6E91018C95074C18FC780A73945B148154987854CFA1CF1199BCD03519C8F34774453DF90B71FEA6734DEA7191EE2A5735F7A191F527642D53C844B087E9346B07EDD0B78C36F83445825E60A13C424F72530E05F75DA8D33957FAFF004DEB549985790956A0E7D9B256298D56BC6206F1E4E1E958FE298641A277A2C8B6B9B7660DBF689AD7E1A19CBD965CBEAA4A0D30741586290576996AE668ECBAB4F06F2A1D542E32C5D3F042E7E29A41BF86BAE29E7029D997876CFB23B10986A45CA029739B2446A29C55561AEE8FFB187961E6E7401D726AF6D8A5C816B2CEAA9A1C9B780DDCC4F0E4003542B193AE26EC687F8C51451D2D5387D9C3B9EB95981DF2DE069FE741CD5C15F6D1B12C5B9B94230ABA33BF46DCE8AC7E26896EDCB4F87272C32D19E72C313738855C02C6F46F1162BE0A3ED2E76704B16169689BF532EAD7AE7F2B26F4D9B22712662BEEA1F46748FA4C27D1D825D3FE493B5B3B513617C81D21A0912D329C5A4E3A90EF5A29A4E3137D1CE3EEE99C42D034E61593A4076EF124BD6BCF8FC911FC9F6077D82C2980C2ADB955939441BC9E81BDF9D6996CE578114C01F9BA096D6EA40F4E0FBB18B3E3D25E7F6D6CB670AD26F604368ACB6190667B7B7ED3C1A1DA04E42AE0087852834B91AA072AD51C0193E5299481221BC9083118F7B5503559F1E2D9E22A8D57932CD0B59509E7D7F459E20EBF4C1D0DF71472340E64992C0485D593714D6B469547616DFEAFC95089689931E79944204A6D0A47A565DC325F3BE19FD44BB6CD4BF2B1D4A78C883154D70705E121B833A4A7E7E80FCDCA03F52C1F831AB0D989AC5DBB5CD83BABCB3EE74B69681818DC05E33234775123F552CFC7C7BB0B98C937957A2C4E86E3D775468A7CB8D33756ED7489D04DBE52EAA2737EFBC4C4D0F55B5A841E1453763E611BAC358FAD0B5778C6015D97CC42CA9FECC66CF844DFE55587C200DA5250B3A419791F57D3A4F672551BE885DFE2AA8637D6C890EE8E1063E782FD7E2CB356BF47B6EB93A155D8D64C9F6CCA3971C5A7FACC3C052A2AA9FB286750F76933261AFF5CE408BDA8382AF8535145F432F78B3B25A768B5DA2A211D1D07AB557CABC7A139F66EDBB744AA76E0FBF22092E31C92CAFC624EE1DC6732F27E8E7632C6EEE2D1F5C85B52D712C884B36C91DA383F0DE9E06E5EF63D7B7A692E5E91BA1A1D9298E26694FAAD9EF262F117DF8115E2E877197A8069A96210CE65D45E6AA7011654ACFAFDA810CCCC20C1985D54483DAE12B29D7ECF66376968B52FBD727CBAE7C9E3DBFEE7391D985228ACA9EB8EF98FAE32BD24552A6B34BAA581DBB03676A3A4546E10EFCEF269B18E1172F560FA0F0344149543551E079C1745BC0425B5233B7D7DC32F751D321638EDB1CEE56DF0359EB6D9863CF3E341A56060C8EF8486014F956C39B751AE239A493A017B2FA5210D374BA83DF5D799B7CD92987FEBB0B2CDB3EE42A61381304C5EAE2ADD4777011C3279BBCD1EDD6F91FF72B3C353AC35DA8FA843DC5561D3CDB507730E8BEF20CF09B0DDC36D47F4C10D82652DC2937D889F83B1DDC30E52B244250D19EEA9CF7A3B5D931E2E25B64A0A81B2C4FE933A17BEAC2E10FD888D07F994E4F2583D204DA126533F5E36B62486A00CCC317C4381A8FE11D36C43E71BE108E22A98F53729F05A5E0AA38D512423DB4BC1D6BFAE9117383ACF94AE2A737F6B8070858BEAF08E365CA84925F8BEBAEEF5AF77EB73A9D3648AAA6493CEBDDB95149F0DAFACF129FC321E558084A44CCA4B429D664D90DD90F2A04818B48D135952746CECA76F99B947A33A3BF7C535B187C1971AF4FCB1EAC841BE7E96F429DD38127B52FACC2DD6512D8D019E0080CADBF7078FC67E9AF170A2A00F70F407B0A7FF469E2F6EA165F8B43EEF1779A115089DE9ABE6B78C93E4B8E3B018686D16CE8EBC88CBC1D571372A3996C9E5967C035F9DA6E200E7ECFD1CF7158563F36A3AAC3CD8ACF52A4EEE29DCEB03FA3272A671CFC9B - -count = 57 -seed = 4E94DD734A371A7C6AD4A567038CF93BAACE2B9D30F3862198DC55D2F21F8FDC9A7AE5DCA1541712179E3AB1FFA3F792 -mlen = 1914 -msg = F3EA695264936D537D86E545E132131442C2973D19B37F8C911E3ECEF4A13A8B1EDF5E5968A6198D26205FFE6B76CB14E353B5E2C9DE1BD44AB9BD55862BA1A479833335725EF52601810C778DA4A32C497CCFA43F91C72A1499E8D295AE7CDB43F1CA05F0D4A31B30D9A69CAB8288640F3F9E081E2C98CC8351C7EB9954D428DA4BB374B346A83EFF5AA3F455F2BB3FC922F901BBE5695E3AB9892A93BEEF90FC150B3BB47F6965C229F7DCC3100A4101840417A0E2547F9D42AB27216254A2898368BFC60E7D407271C213233B6913C8E48DF10967757BFAF5B5E2A284B8F67C70537C97583786B5185B45E2E36BD8B5443E98601F772829176C4D66F44A81AAE7C13F539490640BFC40B83E1C75305B06BE60E18A0AB568859435B715E15BA1EE4DE73E04E1B09DD15350AE423C131706F057255E9FA8FA3F9E3ADE7435A6451F7A2AAD0C0FE0F444C4A247DCBAA49E7C926DD52A33D3737B4439C1D40F861720E37BD25366EB5F34BF4B552160F3EB80CA8FB19304E1E4143090F8E965DAEFF17551A3931905B5CD991C6BC5AF5BE808073893A47FBFEEC0940EF5E7D2F2EE199847E1A4BEA447BEC40F86F6FDAEBECE6FF0F66E04193355C9576DD4AAB2D796CFEE5D432B1D32E13B8903A06FFD3AECB00C169A3AF8389848CEC724F647C6BA8DC3134CA18586DB3E4138601A16DF8873A490F23C4D27FD9C3D4FABF2BDCBA4AF3F0793E7B591198100EC97602D9BA572409EA49D7C8EDC646335FD4494577720EA7CDF3B4266FC201DE4BC204C0D35CFB55010BFAC68CA0DF3AC936C9FD2A9C532B8E3461D25362EFA37DA159B64670060CAB833ECA799FCF1342C7EE1B80BDE05ABAD08B9EE8908D50CD0D433DDA0B120D1980F690ACAD9C072502AB537EF71B691917A76D3098C27FDC6FAD1F1B29E307E17C87D9FA6A06CF8CEF6568D9E4E005FEEFCB5F41A46D91E31B41268367D636C4478921E690D5D57E99DA3448773D51B673109CFD3A58CC50C127F34F4963FCED6C216E60EA0952317FBFE88807BFF4223624F6126104CB46C8D39EE228BB4FC0002287E346E5ACE43E2CAEC07A22203FE3C4AA9008A94F7075F6E449FB89905BB955FA0023608C494F7B73D2AA4E2B0A8A7E3CAA889B6B6A6640F7222EF969D46FF6794BD97C5363921461BACDA17F2781E14419436E37610E52E3B7B7BF9C1A4B1D80876030F9A8981DAA4F06A432DBA739DB988BED5DE7F38378EC1F7D8A46B305896CA0CAA5D8AD74002863C6FF91EF25AE96450936509EFA93F94718E895A82B4616A965AF004038E0897A6563DBC91EB5A6172ADBA052250D06D210BCF5A250246FC3482E57FCD9901104C5AD58EEFFAC2860A4DA9D2C308552EFBDA2D4275F3F3651E9935A0E42869B9263FC7EA71079E604A4EC6DC61CEF6AC6CC06194DEF432C1F7CD9EDFB0C4B448DAE3C2A685BC818B2A90E17A4C1CAAA5FC2632F720E764E2B8DA314224498119A0D94CF5DCE24176421C2736575672B361119EC7C766265768CD9FF1957A17779C11244C1CC82D72D4E3C87107885F71C56DA2BC41008B0BC1375C12B3B2A80071EC03E377A93BFB227BD560EDD5E5D88F46F7FF9831F05BF262F01F62278D3DC13F4F0CECA0509091C25D20666D8D3527975CA3495F6843B46B5D5B6F5C650E981DEFB3943963E14F00A0F78CE785A21634C46B531B4F2AC5AD0F03D92372C334CE963E514A1891716EB5D5BB1B67834994EDA492719032E2A4F961DDD6D2002D8F52798C45A9DA8145BFD191E97D1FBA1B395858B0FC7D5F5A54E69FB3780635F70A763E44075075580778676E6B9705B40F40210E597B5AA1AA77BCC3BE5005159A4B68CBDC6AD8674495E0DF65A6DECABAFB993CC49C082D358DB1E5B3A8AF2FCB0049A15BF521986AD84148135CDB185FDDCA6802C2ADE9EA2E82047725D73F51E072CCD799D696D7530F61B16E9B4727C58CB0F552B188F9B451BE543BD809B63D66BCDBAEB7AA917BE6AEF05DF559B3AEAF65D5EA12E852D1370EFD6197F970F52292F27923A10D01AEB652A9A44573C137257B49D130F1DA48E532B3E33D4854B995534380B4549511B39A99145AF5ABE0CCD3A9DBAF673EFC115CB75A9A5A806679907BB525A2BD4507977329EB4C985B3575DE6533FC5D62358C21AF3DBDD20DEEFD7C417C77D37DC2A098A8FA48F7944B7EC6F929387BA11E3516C9EA681238650416FFB97EA343D5F227BADFDD509B94C1451C54F85E4539A8F70DBB5EFBB10B2D82A16FD0C997C603B8983CEB840A7C3B61918D8A97766BB8442C3B9EF2D324E28DC19748417D32F642874A8927688C74BF4F6F6724015C4DD50EB83B85F613FA20938F5C895F88830A40C9799C212B2DFB453BA0BC534F75CEDAF7A016F6744CB4F5269FBF0284EB90CF1023918078024C3B125CD9C7501224050B4D20B585472B42A0F494513ED131BCD8F75E223317F56B37CA48780750DE0BC81C74A3388C94D93A65719122E9D533274811B76965265D7B2F91EBE3C5924ED2D4DD5E327A6E7546AA2605E4C78D0208DB7A7F678CAADFB32E6BCF8C77FC7810F7D1D5D50E26D1A0DA03B8AFCF99904B2B3198670462451925381F0BC404C51F2F18FA7E2C1E8B0C6CF97A9A65E575373996C3E9DA15A18D15C93548377677DD713C9828DC4E4EE823A241377C65A2948BD29447BFBE -pk = 188B48710643B87D27BA4AE9567957A03B0AB418D6A3AD1B62148574574F984A8393242E3FA4BC1CB4AFAD81F9F56BF61DA4A90D1ACB175987D550DC2FE41B0026E1689AEF55B7F175DE0ACE0902DCA07476FC7E030ADB4ACFC212257FCF169D666C52C6762744AD9C3DEA71398AD136015746C7FB80AD28B88623E31E411F00 -sk = 188B48710643B87D27BA4AE9567957A03B0AB418D6A3AD1B62148574574F984A8393242E3FA4BC1CB4AFAD81F9F56BF61DA4A90D1ACB175987D550DC2FE41B0026E1689AEF55B7F175DE0ACE0902DCA07476FC7E030ADB4ACFC212257FCF169D666C52C6762744AD9C3DEA71398AD136015746C7FB80AD28B88623E31E411F000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057BD4DDADE23115C8B743A8C5CDADFE7EF412DEE26BC7B04395C7D3C03478CA8F0350581C246F3FF51E838BCFA8B76F4C4561EC86EF0C3B43520A99ED4159C69039BBADB8C38492DC6D4B0CA25F4A08EBD0728DB8AF92DDE14FFFFFFFFFFFFFFFF14ADEAA650D19FCE2B752385B787768AF0507D9CF9C5BEAEFCEACB3F5BB1CF284D438FE4055086D89B402F774BA852971014629ED7697D30832FAB502A68382D73F29F659B9279CCCF6A80A406C52FBCB3DD48877BB6C74CEEFDFFFFFFFFFFFFFFC0065A486058E054DD14088760DE2FBA9A64970F57F4B40BB65AA6A6C30A1336076A98DA53E63D2C1B49B55480F8CF555D166EC915EB7A5F463C000000000000000000000000000000000000000000000000000000000000000000000000000000EF59D9A57FF336093292E36A20E4FC618F4E4B3312E0517D2A0D7FEBB3B175BDC780C029DA4C92563A8B6E8F4174F5FA2677F502E966C5EBD691040000000000000000000000000000000000000000000000000000000000000000000000000000E8D43A6FD76D8E3FC989B8180F49C2A1DB63743F89869B5BDE965D70F5686B419C8957AF03E0E24AECEA6E3E2A600D0D5D2767A09A7F0C6D5B66B4AB7D261600996BD533E09E1ADD1F8042DBE145B59BCB5C634CABCC8345A5B3E1AC4CEEACE8B88582CA1865571A0880D86928B03E4676AA8198964A25B08400FCB89EAD10004CFFCB7C318D797BB0CF803AE74EFB6E4ABDAFFFC508C95926E4387665A75F138A64AAA1EBC03FE52EF5BAA2D591FF9549D714625CB71B293AC7DFC14B250F00BFE4B9FAFDDE724ABBFA09F7B810B9FA40A0EF4F5A4E07C3B7C7DAC0F2439C2CE7BA44A366A8ED4AE5A5E73BF6704CDBCC36D863848950B57D97F526E0800C00E600BBD71CCE5A4B153A2AB7BC2AA493C86A272DB130E5A673F081C462114E955F278B2DC81BF40B1C95A39B41D82346DD7D9FB001599BFB411E76E99AFB1600AA810C2484ECDF06A81CD1F54921907B494974A7100058D94E46AAE15A9DF221A2A8A2EB61993C69AF168F63BFE674E99B614BDF5CFC13660EE4C510ED6B1C001B2AB87FE60C1B8D76F0451CA00C0E83D7D8248D9D98A190412F889199D0A625EEBE78D8CB5E1DFFFAA4705631249743C1AA8B8163E905062AF943DB7AE61D00429235F3B24F1017B6CBFA05926F172950E58A237F4EDE70E1D29113FD65F17315E5350804E44AC923073595156B769E8BA16695F950530D857495EB387E0700974B73A682DF8464BCDD3037A21F8403911695ADEB3B874BFC8683C56FE8209155DBF04C1D3A0E3C75B4E5C9621F70BCC579407D62DDE0D7E502DF38A31E15009AF349A1B9F6B7A596F177B71B6A1E50C042F2502AB3157D67C8D7040E3296C1F43C8651140452F0649064E0D5F03464780E599FE6361B61572771757E020600688E6E5174BD9A5EB8C07B975A10D5F33904A8842F57417FD4183300788D7961BED56B83C486126C04DA255E0D65E05D1FBFE08DF3B8E049947B2576E7841B00B331A2F73AD5B16B5D8B5D37EF19475DB77F80A296386BCFB7906EB0D817BC3AD6A4A5EFE1AF8D5BF6EB69AD96FED1D7954CA54F300B4CA238DDA87B001F03004CCA81BC1106696E5D7F274F7B306CF3123A5544377D9D3BCAA1017B96A99D9C8D8073FACE14BB6293220AA58C2120FCB28F0FE9CFF639E44EC79245D3621A005240DFB4A1C45CDC51F40FE01A5A89E66E72E359D493DF4C982774AD9C2B0966F259364720BD6B0885D5A1CC108B64C00E1A259F525247E1F68D5684AFE10E00 -smlen = 2249 -sm = C3BC8DD5596A1796B989B741662741F682350098FC094610EB08E0D3A853D786AF4D995F690185B5372EC2B5E86DD6159870CBE73DF54EFD0176E5484FD95342B19DE36FD472730AF063CB019621D68B1D3FF813A4B7B6A135275A0C1A2D0091CA650956C665D32EEB92C896D3A8D765BA00A1B38F07E37E49F05ED6C0E67AA7313EA4790181B62954FBFA94B4A84F6154EE6610BCBC0301B0DB67460E3A4A663A4C4D61C46D9902FB0800C54EB71A3B3430234553B5F1E828A840374900EEB6ACFF51B770971CDDD07A5E1FD4282B0401044E982FCD12B98BFDCDF237EFB64D63C5B200C2362DF67565441F5C70F4D2D7DB8742748D0058E02273FCD263103E7AD7F70F065037271B000119AD4A404214BF2E99FFE470D1CB4B61D05A792C6DA58628AD3EE3E1BB02869E03021821F128611B3DA641DAEBCB6C98DC9AE12701F90732785DD35B2D7E235E3C208801F3EA695264936D537D86E545E132131442C2973D19B37F8C911E3ECEF4A13A8B1EDF5E5968A6198D26205FFE6B76CB14E353B5E2C9DE1BD44AB9BD55862BA1A479833335725EF52601810C778DA4A32C497CCFA43F91C72A1499E8D295AE7CDB43F1CA05F0D4A31B30D9A69CAB8288640F3F9E081E2C98CC8351C7EB9954D428DA4BB374B346A83EFF5AA3F455F2BB3FC922F901BBE5695E3AB9892A93BEEF90FC150B3BB47F6965C229F7DCC3100A4101840417A0E2547F9D42AB27216254A2898368BFC60E7D407271C213233B6913C8E48DF10967757BFAF5B5E2A284B8F67C70537C97583786B5185B45E2E36BD8B5443E98601F772829176C4D66F44A81AAE7C13F539490640BFC40B83E1C75305B06BE60E18A0AB568859435B715E15BA1EE4DE73E04E1B09DD15350AE423C131706F057255E9FA8FA3F9E3ADE7435A6451F7A2AAD0C0FE0F444C4A247DCBAA49E7C926DD52A33D3737B4439C1D40F861720E37BD25366EB5F34BF4B552160F3EB80CA8FB19304E1E4143090F8E965DAEFF17551A3931905B5CD991C6BC5AF5BE808073893A47FBFEEC0940EF5E7D2F2EE199847E1A4BEA447BEC40F86F6FDAEBECE6FF0F66E04193355C9576DD4AAB2D796CFEE5D432B1D32E13B8903A06FFD3AECB00C169A3AF8389848CEC724F647C6BA8DC3134CA18586DB3E4138601A16DF8873A490F23C4D27FD9C3D4FABF2BDCBA4AF3F0793E7B591198100EC97602D9BA572409EA49D7C8EDC646335FD4494577720EA7CDF3B4266FC201DE4BC204C0D35CFB55010BFAC68CA0DF3AC936C9FD2A9C532B8E3461D25362EFA37DA159B64670060CAB833ECA799FCF1342C7EE1B80BDE05ABAD08B9EE8908D50CD0D433DDA0B120D1980F690ACAD9C072502AB537EF71B691917A76D3098C27FDC6FAD1F1B29E307E17C87D9FA6A06CF8CEF6568D9E4E005FEEFCB5F41A46D91E31B41268367D636C4478921E690D5D57E99DA3448773D51B673109CFD3A58CC50C127F34F4963FCED6C216E60EA0952317FBFE88807BFF4223624F6126104CB46C8D39EE228BB4FC0002287E346E5ACE43E2CAEC07A22203FE3C4AA9008A94F7075F6E449FB89905BB955FA0023608C494F7B73D2AA4E2B0A8A7E3CAA889B6B6A6640F7222EF969D46FF6794BD97C5363921461BACDA17F2781E14419436E37610E52E3B7B7BF9C1A4B1D80876030F9A8981DAA4F06A432DBA739DB988BED5DE7F38378EC1F7D8A46B305896CA0CAA5D8AD74002863C6FF91EF25AE96450936509EFA93F94718E895A82B4616A965AF004038E0897A6563DBC91EB5A6172ADBA052250D06D210BCF5A250246FC3482E57FCD9901104C5AD58EEFFAC2860A4DA9D2C308552EFBDA2D4275F3F3651E9935A0E42869B9263FC7EA71079E604A4EC6DC61CEF6AC6CC06194DEF432C1F7CD9EDFB0C4B448DAE3C2A685BC818B2A90E17A4C1CAAA5FC2632F720E764E2B8DA314224498119A0D94CF5DCE24176421C2736575672B361119EC7C766265768CD9FF1957A17779C11244C1CC82D72D4E3C87107885F71C56DA2BC41008B0BC1375C12B3B2A80071EC03E377A93BFB227BD560EDD5E5D88F46F7FF9831F05BF262F01F62278D3DC13F4F0CECA0509091C25D20666D8D3527975CA3495F6843B46B5D5B6F5C650E981DEFB3943963E14F00A0F78CE785A21634C46B531B4F2AC5AD0F03D92372C334CE963E514A1891716EB5D5BB1B67834994EDA492719032E2A4F961DDD6D2002D8F52798C45A9DA8145BFD191E97D1FBA1B395858B0FC7D5F5A54E69FB3780635F70A763E44075075580778676E6B9705B40F40210E597B5AA1AA77BCC3BE5005159A4B68CBDC6AD8674495E0DF65A6DECABAFB993CC49C082D358DB1E5B3A8AF2FCB0049A15BF521986AD84148135CDB185FDDCA6802C2ADE9EA2E82047725D73F51E072CCD799D696D7530F61B16E9B4727C58CB0F552B188F9B451BE543BD809B63D66BCDBAEB7AA917BE6AEF05DF559B3AEAF65D5EA12E852D1370EFD6197F970F52292F27923A10D01AEB652A9A44573C137257B49D130F1DA48E532B3E33D4854B995534380B4549511B39A99145AF5ABE0CCD3A9DBAF673EFC115CB75A9A5A806679907BB525A2BD4507977329EB4C985B3575DE6533FC5D62358C21AF3DBDD20DEEFD7C417C77D37DC2A098A8FA48F7944B7EC6F929387BA11E3516C9EA681238650416FFB97EA343D5F227BADFDD509B94C1451C54F85E4539A8F70DBB5EFBB10B2D82A16FD0C997C603B8983CEB840A7C3B61918D8A97766BB8442C3B9EF2D324E28DC19748417D32F642874A8927688C74BF4F6F6724015C4DD50EB83B85F613FA20938F5C895F88830A40C9799C212B2DFB453BA0BC534F75CEDAF7A016F6744CB4F5269FBF0284EB90CF1023918078024C3B125CD9C7501224050B4D20B585472B42A0F494513ED131BCD8F75E223317F56B37CA48780750DE0BC81C74A3388C94D93A65719122E9D533274811B76965265D7B2F91EBE3C5924ED2D4DD5E327A6E7546AA2605E4C78D0208DB7A7F678CAADFB32E6BCF8C77FC7810F7D1D5D50E26D1A0DA03B8AFCF99904B2B3198670462451925381F0BC404C51F2F18FA7E2C1E8B0C6CF97A9A65E575373996C3E9DA15A18D15C93548377677DD713C9828DC4E4EE823A241377C65A2948BD29447BFBE - -count = 58 -seed = D9281003AC5F7673E0E9A7BC29C4ED75E6B0F228DF49D11A2599BFF2DA9E887163BB26DBA4F071FBCE02891540EC6F1C -mlen = 1947 -msg = 437E0F77BD0E14D704BE86135119F39A0A65650C762852E2694AD9BF2EA45C7EE59DF915F5AAC128309847E944127294566FFB193D0361DD7111D32B06DBA60A12E053F424DDD70674E902E409BC6F5891CB9A76108322CDEC1491D3D89A74CEDD855BB0791DD6DA371A75AE979593B5159FBE9DDACF88506E6A184547E2A7395A46FBAAAF286EB7780B789FED86F257E5036A3555E777B909243695CE89957DF492C80050457AFD84AAD9F8918099AB00FD7AD3528A3D0AFE5B52300053575B839572D4D7CE43C255BBF5F16948D40BCC2E63714487AFD3638601ADF47A324482ECC99FB88574538809227F8C0A5FA7F20A0B2FEFDA38E6A665550E44B8D5630290A4815621A5DD74A2108CA946241C48661EB087240788808BF676B145442B2DE4C35E1A6B8CB1E97E54CB729202D8827A0D4994C6D7F3F406ED273B00B6590006AF069D69173B5EA8237B87705F362288AC3A50BBE7E70EB15DF6ED820D66290F57A87E51B2C5777C9C95C2A76ECF2E296A7C295BFE029BBE681B32A6D9F16D11C7CA2750E2F8877AF5DDB616D8A820DE998B0B2AF5B0C2C5641F498C99971932327EC2C73C0EF4058D9F33683F60553AD2962370AFC6725743C86E591D7D7C20944479DACA5E92D66A33CA0C862DC60DFEB5EC3C6E7DE356F6E43F06B1431358285398F8885176D60CBA218217DC7AFE4AD876D0890648052A56812BC3F8A9E6C49F9D70B0A032924B891A9410BBE2F214C842BBF0511EF9017744A0DBDBD500A4189B471930E25216D2588CF8BA39AAE7623966CC62D6C4ECC8B00B0613D912E60ADF613C8F55B778EFB93A513A776C64E8DC943E6272C0EAB4004B4B05CE9BCE9CE2F2B86FD8429E9A72CB16EC3DED285339EDFCD122150F4E7310F669B1DD4CD7E76D282D10314E8ABF61D53BF343F3EBF9968E1BE8F3785581F675BFC28C893729CF67345D0F7C11D6E7D6DA0BFF255BF706C986704A3B9C6FA0602C6DC108A59CCA70F624B08E4F5393E597459BEA4AAAA463A3B08DE147E10DE6B75A0D87BB79BA9A71E7F5999C8972BA992228B60912AA2D7A32703BA8BC02F774430A2B590911D48D3866396F1D71F19CA90EBD5277743A984E2156CB57DE88EBE91BCC09CCB5C687CBCD4E48E4EE110F4075A21F9A051700B0C2698FCD6A5A73372CA366A230A9ABD153E4DCAB7A33A8226F8458C5892098BC0A95619880156548F300C40BDEF81E8C1D8BD03031C690B7C3C000CE99675ADB4B94752EA22BC9E0278D0A53A2A19363A9388BB8D6C24A45B5DEDD8F7482E9C29603FF182F25856FBEEE2B41B88B352F99DB5F33D8EAB1A1A1FEDE60EA6CFB7478DB7540D3A286E88117503C4D0A2C13D32AFE3F1A31D1AF9EE60EAB8FE06248CFFFC7BB438B77D94B5644805CC276F19268DD1FFEFBAB3C796923288638DA1C15E014723A84F8C2DD9F55F7ADC2ADC13FA7CDC29BAF48CA438C882DA5F7CAA792B7CD984BB11EC4B681B332EDFD4AB4C132B08BFB688F81BAA3FEC5A079E2182C282A3EBE2AD5E4C59090BBB989E6A07D85D604F5FFDE0587ADD29A5175CE65D29FB9FDE3E8B49EDA1D88EE8DD64FA1498D33EBAF4A847EE9FEDD3376AF46C1552A150014C11DDFC5047929E2415D3F9D81186A685A1CAF2F004DE777760F0567E880866320A7B42E61CC994719DDC81E28525E50195FFE4E0467D9A9182B75EF57DFEE926D7744485A55E07D1BCD1C9B9B12A60460BFF016E9834848665F132E2FF87805E00154C7D9853DBCA43D005BB197EEDA3D2D9249A621EFC4177415BB103893C82EEB0AEEA056B40E98B5FE65527432FF33CE3E09FE1288A6E2641011721279253800ABC4B73F65B15B434BD34A573E77A94729A78C92F0E791570A416A0876DB39A8FDA8696FB12E7FA3BB11E7838054E4195164B9676DD03327810CCFF9586217AA3D50E7D3EBDB1AE1BF6889DF316047CBB278CE8C9741798452A38E48A7138E1FBA286B497FDB8B1E7BF6145C5F29ECF6D5430F8E550314DB3CF48F27897F312C6D9D6357A880B721E5148DA7F789238CE411F952695F4A878756BDE311BB4E62F10C2F9939B8530EF70D3FB431655AECA2AD36BB5DF0582A07F53F1DF8E0325E635D5A5E795C130106502A081F2FC52A9D97C5DAAF174F13D2DE1EA0F8860F08F4FD5B571E1AB1E84437F3C82BF19B96E46513C316BDCF994BC26FB8461F90594E08E6D4A032C1DA38481A1AD7BFB7D5270255BFF23CE035535CF478216E6D2E62E147AD93357D62636B1AE42C4E8433BB94CA91D0F8EC265F2793514543AA86B786D9760BE5C77AAD5A8449A7DBE92391EAAFC305C1267A68E6ACF0F044FC144D82C917992748B9232DEC4E33EC97534F2BF60B56EDBFF675F0343C9C78E8A8D0529A78E2EED9F998B360360352009F01905C1A4815A36B111CAD8E5B34688B99216171D4F57283CD669DC05995BB8D94ECBD3E7B662C4A603BD85251F2BA35FB6CA492C2B3E996FE66A1EB904CCD61B0900E7DEDCF136F50E4C3AD5FC312A2DE4B3E51F355D01763692C0722C700A544E681A316A1D261FAD727E557398E500F15DF33883ABE9D1BA645936891F5A91FF6C8A7B9B6FE5062718542DF4FC4BA50D7F513945482381ADC42D5A9D444CA211232615306D7241FC49F08912BACBAFBB056C018AD4D6021D99FD720ED6548A5A29DAEFDCE868D71A1BA72D9F998A3F89FCFE526493582C4C8AF5C1BE065EA29F6155428DBC955B745DF -pk = F054FA9E146BEDC60CE3D70DA25016EE59D985F76C9487D7C166E12B3014E4DB385DD882FB38168A6F0AEB977DDAAE12497A07F40B4CFA422591C9B7C8422000D362EA742C9F641ED634530C2B51BD03B013E448BB2AC5D84038FA442E3B22D6082341D07B65EF0AA013A6049F600295E570D32AC038C69A8F456CAA69460E00 -sk = F054FA9E146BEDC60CE3D70DA25016EE59D985F76C9487D7C166E12B3014E4DB385DD882FB38168A6F0AEB977DDAAE12497A07F40B4CFA422591C9B7C8422000D362EA742C9F641ED634530C2B51BD03B013E448BB2AC5D84038FA442E3B22D6082341D07B65EF0AA013A6049F600295E570D32AC038C69A8F456CAA69460E0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BCD6595B81F53D1C10D80E7B45B47846941FB130E9206AF988135E7258E663C337AFB8053B2A6EF75154DF47FF400B481498A5E1880929EC4DEF731C7F8E355D24FE03ACE43F8183E1809508D2007DD9A210CCA73495478CBF010000000000000011540EC44AA211F617A3540CA7B30DA4317DED2576C06B0D0674BF24A017FB4F3BF7219492D10E984F8877AFAE064E31C7D381AC546389B2D7E4D55C470A6A7C1AFCA2221ADDE1DD801D38E01728F947A9C11B38486E22FDBEFDFFFFFFFFFFFFFF2F07E12EF6694352A3A819B9D39D71E0CD9AF13B4562DEEA6A704A465E952BCA2067D6C9C9FD3C6820991C71958BF15A63FA87A225041AD6DD4FFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0CCF6B485A1F0958B82A5EBDBA64A863EB8802EE267ED934F6D97E1428BCA6C46B8EF1469BCF04826867A2FB5DD09FAA5E78EB90C6507EC2CA6A0300000000000000000000000000000000000000000000000000000000000000000000000000008C53A49E49A256F7D1E84B50CEF805D919156A9E7FB51881501EEAA5049F1F9ED3975944762352202CA9D9B8F25BF89B924ABA597F0824D4B22A1E2E45881A00957E197C5437B7D7355D7A78DA02444C05FFE130EA856858EB67B59B6C3DADF2C4AA6D8E5E8CD9C94DB09F26AF3F3E40061C18E510BF364EFD3321BE24701100B61B1F5F171340E592B398306E4600648B70F17445BEDD1FEFF44869BB1AD1BD67A2C5D0DB6F49AFD3E5944196ED511F09F8ED3A102968A93BDDF64C4EE810005456B9D89B49BDEBFA8930DD9D9B8BFA7CE5423CAEFBDFED216A26C6BAAA56CBC929A30FD7C60BBBC05CB21E38C1B87A871324835096DB12F69A97E973C513000BC2BFE1444D3DDFFE84E916E04A3FEE7AF8654E581E8FC0743CE0241379BEFF30A7A26943B081A19C4D114515619E8DACDBD4B327BA11C61D99D2D6334B070098021A2404675FE529A9C980A377693CF4824C46C56EF3BC2BB7C4E71E0F126F2E1D1D84045DFC265086EAF93E753DFFF113DA33D9D2122683D033D7FB9C0300E594BAF8311656B7527177680B3F3E0D1E6E4245825A9559D79292918AAC6F70E1CD0129D52B134C745FD691793F2886B0AB996A91790E5FCE7873486AB50B00E2D6FEEA19CBD848095FD7289439A8C6455455EE3670F815FB5C5D3663422C9393548F91786976CA1C4A1F16B8480290510525594D91AB5CC1C11A1B92851000DC61D2B9A43FC6186402916C53F6985231A394A4CCAAA4A76AA3B86FA59667CC4C75B9253633BF1346B14423FE0E2EBAE65FD63DDA00301BF949D42AB6A2180026E5E0BCF3171E6DF87C037405505DEB64F2A5D3B14B3F753D0880EA409993132A5A008D2CEDC3B296D434BC96CEFC6FB87EEA73421AEA2FCA2F4B074AF40D00DD6D1A754F96E69E1E70723EECEE2F387E1CE8AE99F6948E3E4E0385507E09A39D8E83F353A208681E5AE4CA8FB048A2D984F3DE5BE48719F2A075AB26DC1D00DE8C8F26A7A0F646C715505F935536DC2BD057196D1FB72ABC229769D33CE4572BBEA720FA0479EF78EA84FA59F070862B8A504CD28DF82FB6D07C539C5D0600A0EE57F452FCDCE51CE5FAA31AF297940F846D7C544D7C6E403B4143C92D6F095CF574A64FAF8C306074F8EF9BB3F5C60E3A62B4185D38BB42DCCFBB4DBB2000480AA014B0FA5CD040D7A13E759B36810CBA38AB791D1F63FFF3A2E79579D0219F6AC91B7BB7BF397347BA2E1A30FBC6B41867943C01476A27C3C77C33B91000 -smlen = 2282 -sm = E2192C5700B47534B9F50050FFB5B2B6955500D89A6D62B68B7D99B86A059A616119F1DFA9006B9ADDABDE30A3C4E40E095B1A7340331D8800BB2A5C40858059EC43A97419B0C1A0B01606003A32DDA5585FCA3B45AB65310A6F1435678101ADC40C1C237C4CFD98B4D2F865A6F41AA7F8018F970BC2320CE5C4A3AAE5935C09D8A15DB901C7702CB17EE719581112A1BD1491B04E650F01209A50968B477DE538761608F1169DF04877005B8228741FC895055E3E9B9AE25895F200350157ED0B7DDE4867A28D8FF8EA1C124A79460D0194E2CE6A2C015681435584C84C79CC3CA8C8008890475E46E41D7BFD7AEB51EB2286CFD8860029939E0C39C9187CA8B1CE0FE691E6C2A71301000520CD3AACA7463150D5EF5DA7717A97808498329EEA6597AD8E15C23537B9FD030327CBF085208E01F6F13EF1AB50FE72660EAA0002A2F0E793EA10F62D3B7B115DCE00437E0F77BD0E14D704BE86135119F39A0A65650C762852E2694AD9BF2EA45C7EE59DF915F5AAC128309847E944127294566FFB193D0361DD7111D32B06DBA60A12E053F424DDD70674E902E409BC6F5891CB9A76108322CDEC1491D3D89A74CEDD855BB0791DD6DA371A75AE979593B5159FBE9DDACF88506E6A184547E2A7395A46FBAAAF286EB7780B789FED86F257E5036A3555E777B909243695CE89957DF492C80050457AFD84AAD9F8918099AB00FD7AD3528A3D0AFE5B52300053575B839572D4D7CE43C255BBF5F16948D40BCC2E63714487AFD3638601ADF47A324482ECC99FB88574538809227F8C0A5FA7F20A0B2FEFDA38E6A665550E44B8D5630290A4815621A5DD74A2108CA946241C48661EB087240788808BF676B145442B2DE4C35E1A6B8CB1E97E54CB729202D8827A0D4994C6D7F3F406ED273B00B6590006AF069D69173B5EA8237B87705F362288AC3A50BBE7E70EB15DF6ED820D66290F57A87E51B2C5777C9C95C2A76ECF2E296A7C295BFE029BBE681B32A6D9F16D11C7CA2750E2F8877AF5DDB616D8A820DE998B0B2AF5B0C2C5641F498C99971932327EC2C73C0EF4058D9F33683F60553AD2962370AFC6725743C86E591D7D7C20944479DACA5E92D66A33CA0C862DC60DFEB5EC3C6E7DE356F6E43F06B1431358285398F8885176D60CBA218217DC7AFE4AD876D0890648052A56812BC3F8A9E6C49F9D70B0A032924B891A9410BBE2F214C842BBF0511EF9017744A0DBDBD500A4189B471930E25216D2588CF8BA39AAE7623966CC62D6C4ECC8B00B0613D912E60ADF613C8F55B778EFB93A513A776C64E8DC943E6272C0EAB4004B4B05CE9BCE9CE2F2B86FD8429E9A72CB16EC3DED285339EDFCD122150F4E7310F669B1DD4CD7E76D282D10314E8ABF61D53BF343F3EBF9968E1BE8F3785581F675BFC28C893729CF67345D0F7C11D6E7D6DA0BFF255BF706C986704A3B9C6FA0602C6DC108A59CCA70F624B08E4F5393E597459BEA4AAAA463A3B08DE147E10DE6B75A0D87BB79BA9A71E7F5999C8972BA992228B60912AA2D7A32703BA8BC02F774430A2B590911D48D3866396F1D71F19CA90EBD5277743A984E2156CB57DE88EBE91BCC09CCB5C687CBCD4E48E4EE110F4075A21F9A051700B0C2698FCD6A5A73372CA366A230A9ABD153E4DCAB7A33A8226F8458C5892098BC0A95619880156548F300C40BDEF81E8C1D8BD03031C690B7C3C000CE99675ADB4B94752EA22BC9E0278D0A53A2A19363A9388BB8D6C24A45B5DEDD8F7482E9C29603FF182F25856FBEEE2B41B88B352F99DB5F33D8EAB1A1A1FEDE60EA6CFB7478DB7540D3A286E88117503C4D0A2C13D32AFE3F1A31D1AF9EE60EAB8FE06248CFFFC7BB438B77D94B5644805CC276F19268DD1FFEFBAB3C796923288638DA1C15E014723A84F8C2DD9F55F7ADC2ADC13FA7CDC29BAF48CA438C882DA5F7CAA792B7CD984BB11EC4B681B332EDFD4AB4C132B08BFB688F81BAA3FEC5A079E2182C282A3EBE2AD5E4C59090BBB989E6A07D85D604F5FFDE0587ADD29A5175CE65D29FB9FDE3E8B49EDA1D88EE8DD64FA1498D33EBAF4A847EE9FEDD3376AF46C1552A150014C11DDFC5047929E2415D3F9D81186A685A1CAF2F004DE777760F0567E880866320A7B42E61CC994719DDC81E28525E50195FFE4E0467D9A9182B75EF57DFEE926D7744485A55E07D1BCD1C9B9B12A60460BFF016E9834848665F132E2FF87805E00154C7D9853DBCA43D005BB197EEDA3D2D9249A621EFC4177415BB103893C82EEB0AEEA056B40E98B5FE65527432FF33CE3E09FE1288A6E2641011721279253800ABC4B73F65B15B434BD34A573E77A94729A78C92F0E791570A416A0876DB39A8FDA8696FB12E7FA3BB11E7838054E4195164B9676DD03327810CCFF9586217AA3D50E7D3EBDB1AE1BF6889DF316047CBB278CE8C9741798452A38E48A7138E1FBA286B497FDB8B1E7BF6145C5F29ECF6D5430F8E550314DB3CF48F27897F312C6D9D6357A880B721E5148DA7F789238CE411F952695F4A878756BDE311BB4E62F10C2F9939B8530EF70D3FB431655AECA2AD36BB5DF0582A07F53F1DF8E0325E635D5A5E795C130106502A081F2FC52A9D97C5DAAF174F13D2DE1EA0F8860F08F4FD5B571E1AB1E84437F3C82BF19B96E46513C316BDCF994BC26FB8461F90594E08E6D4A032C1DA38481A1AD7BFB7D5270255BFF23CE035535CF478216E6D2E62E147AD93357D62636B1AE42C4E8433BB94CA91D0F8EC265F2793514543AA86B786D9760BE5C77AAD5A8449A7DBE92391EAAFC305C1267A68E6ACF0F044FC144D82C917992748B9232DEC4E33EC97534F2BF60B56EDBFF675F0343C9C78E8A8D0529A78E2EED9F998B360360352009F01905C1A4815A36B111CAD8E5B34688B99216171D4F57283CD669DC05995BB8D94ECBD3E7B662C4A603BD85251F2BA35FB6CA492C2B3E996FE66A1EB904CCD61B0900E7DEDCF136F50E4C3AD5FC312A2DE4B3E51F355D01763692C0722C700A544E681A316A1D261FAD727E557398E500F15DF33883ABE9D1BA645936891F5A91FF6C8A7B9B6FE5062718542DF4FC4BA50D7F513945482381ADC42D5A9D444CA211232615306D7241FC49F08912BACBAFBB056C018AD4D6021D99FD720ED6548A5A29DAEFDCE868D71A1BA72D9F998A3F89FCFE526493582C4C8AF5C1BE065EA29F6155428DBC955B745DF - -count = 59 -seed = 750A74866BE8DF4E60BC14BF36E6D83ABF6DCBB86792D125CF0980007C5435F40F87BA96498A88252D9C5C6710807652 -mlen = 1980 -msg = E4E3EDCD70C4BBED033F402CEEDC2C265DCA10B2DE0DB00D454C3AE1A0D00C97E1DC8C6804B1777ED21DDF5145B9F9348A931C128A8FB03827F653C37CD95859868DDE356ACE682F627FB69FCD97757BBE8BD5A260A293D2ACF0BFA2C0A3548FE25A2BA1A21F95123D592B40C20A927FDB615E69878E8D7C98D261DC01958A088599D3F9BB5E14002192FC7DE417B1074B3F7B52CD2A699091FD9DC3C5929E51CC0259D2255CAF0E444EC11257B759978BD4A7C8E2CE8473325B7498681102DE6FFE9764334D862E379D9F2EBF9B312FA75D7A50E08B94BD43EEF78722D423928FB8E26FDA85A345EEED0326A5D694E4729154A9997B269407B7D03818025EEB2BA96580626DFDB3BFBFCE100C508170D8150E4980D5D386761F4E8311339B47852ACC2A0A01DAD90D3978DE6536547D4F203CEFFAA652E4F2F28639BC3FF83C485C28EDC0BBE21D17B8ECAF3794D64C36FFE7F07E8A906CAB8E7FC9067CA4BF9B074C7FB01EF99A05D7C0F35D889A63AFE5FF18023BF77F8A3DA0C3CECEA0E538A6DAB5C54F3A0D83151595AD3EC4C45132EC2F22F652EA5DD930E692A7C0D7C23DE84314CAA7C017AD50D430FEF42DE557073DDBA6CAA4A787C92E6E28368943CAD0974EDAEB7ADDF991CCE20BF51C5A898CF0A2104ABB810BD4937D23E5D43490A3194B8A109B745E0A365EFA59199B43835682E996794F16C5CB874C88D9697B189AC54A1BA1F459623C1563CBA7689EBB32DC4FA0BF30E064D119D40C36301A653A4F959C97873003CFF7E8E030A137BAFE0A60AD08E4F692DC107E68AB40EDD0C384875B8525AA0A5EC3ACEAFE557EC76DB5283672F9751AFE1166D53542D216186A3DEF4DFA94E57BFFBEBD6F4AFEC3C0F3F40F651A1251A9AB39C262D42313E9F22879645589EA54FE894AC005115A43DD806B2C8BE6222DD9F02189D4221A9DDE99ECB8C3EF4171776268C12ADC37E4CA92EEF09D2D1803DB1FE917521662BA7EC0C07292C7E2130ECA4EEFFE53EE0CEAAAFF6F4CCFD42186611AFEE79BC651B1ADBAD08458592D69FBEEC708C7537925658BABBE7E9867915C6A728EAF41B0AF2EFFE55207C01652891C373F7A14409D05FE9E26C2E72D688047DE9A0954516B85ED6A3230B6B0EA9C5F086720C26EFBF8B7F5C5D14651D54C4EA181A707C562239CFC08B2E09A2941D04D587B90134D8F670F734578534138CD9CB7EC04437A768FE65FC5B3FBE818DB423A2208E485669082B422AB1257C2529CBF7BA4CB30FA27B7F702418C2EF9C3BF7CDE53661DF716449C6337C54542EADC5209A0E030AD6577DEEACC6BE1813DB24BEC035CEE6AEE93749D524222535A0277600F8E4F4BEB473093C5A00B6666CB319DFF131AE4F004EEB1BF71E5D274E3DFBFA246DADA9D6F548907091045FCCF79B363E695AD54C2F791861CE04874EE8C3375612DE820CEDE04E4472BC3DC19ABBB91C42A1C3D7B467837570E7D20A2CA6405DECCFF1AEC03E0558076E988619CB0CDA9CC87A12367BD486B676A4F71D40B88AB4E7FA750350DADD1A8F12B70864792D3CC1804BE8B7CB9DDA532182C32582015C1788B43054B7010229F46BD39000440E7F5D22E4D52EED85B204B344680426AEF51F0CE0551FEB9672DBF391A9AD363ED090837CAC1E721878E65AF9BA92A0EE7C7979925FBA9F4E452EB4FE3AF03B9EFF0526FF0A331AC0B8CD27A0C49E5019B7025C3C9870C900A7FB31FF834E04B87DB77C4D6DAE4C3FEE741E923704EE5F294D8F881833E9137158D1EE0FBFCB4637ACB814A2A5346607BBCD6BC916235F7875334F2B75A7EA7B8B8DDCDF46C0B8007C9B3A014EC6E634D4173CAFB1DD09CB9ED4A123151F4F2631D4BEE1520C10C15AFEB17198009C2B254C1FF0BECAFBF69BE8C7DBBFC7E8F3F1EF05FF6A7945FF79ED6C317609B9238670DEA26D56D481F87CA171CCFD726CC0728C965D9BC38D376D707E6979908B19FDF7E74ECD2D0671EC338FD54AD6CC5F789E96018521882588F888D7D715104D65954DBA8907C0B7CE3F2ACB802ED49DDF1416C29E8D685C5AD879464819E1D53FDAC741F71E31AC0C17B6C8932A4A00E7164CF8BBFEC36EBBD30392145B292D355FB304A88A638F991F6F89A398B09F1DE4F0B29866029BEE75A12D724A52736F2B9F49937F0E51B0F2E1BD2C1BC9325BBD1061E0F7685ACA02DA735D8FC39646E0B2453BB9690ED1C4853A757EA9DC2F4EB4B5ADBCFCBFB0CD2587F61A24B77CA0D6CFCFF47A98C7098B986D4FBD0E46EF0D1F9DF842F4473C43912AB49F4117C8214A42F3083936C7E8A38B294BA081296A393DCAADDCD0D340AC62511E47DA6591836553EEDB466DA6285359EE831A952E6C7AE3B943636124E43224D527B7D394511CF31C50EC1D3E7A20E49850905D504F1AAE477830E3BDA50430EBD47FDBB0BF537D8D479CB799B0429C3F6591328299A09F45CF9C6D30D5C1C9203B9521D807875D7FB2C2CFAA688414497122161B1B4F159B66C0834E111DA4F82D5252367FD2DBFDC079333FC51AB0D34ECEBBE786F984852A596BE620EC6CF84ED596425B90316A13B39E5EBFA19B319BF0FD1D6C812F29970FB1FFE948BC0D2E057B1DEA15445D71B5F728C72DD0C69E277C58F031F90932994AC5A177926DCC1C570AC1B4B099ED66ABF7DDE5A5D77D08EF1AD7C6FFE018F56EFB07C737F33038846247EEEE147E4A5995BDC3352B73F15FCE5140410AAE3F0AF1764E5AD996D01608C5E6C6C96A20274EA7781B41FC532B01B52134FEE28F501EFD9CF -pk = 6DD692D98F6CF7528765591AB1E486C95D9A932CA23561538BBAF8CA2A36C552D602B564CD98B8E08A9B110FA9FC90A2C12BB1ED8CF5D1798BC88F9E203802001292889586EBE9F094D1623F5BD889BE174CE2F68B69746F2EBB2321F9F7B4A946710B75989D0121A6DE898ACEB88D6B6AC0967C8A2DC94268DF26BDBA350600 -sk = 6DD692D98F6CF7528765591AB1E486C95D9A932CA23561538BBAF8CA2A36C552D602B564CD98B8E08A9B110FA9FC90A2C12BB1ED8CF5D1798BC88F9E203802001292889586EBE9F094D1623F5BD889BE174CE2F68B69746F2EBB2321F9F7B4A946710B75989D0121A6DE898ACEB88D6B6AC0967C8A2DC94268DF26BDBA35060002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000951508536230B599CD8439AA187629ED75B6EDBDEE482C8A5682A01E99B4370D62E2711A393D75F90E83C90859E842EFBD0E892A0DCA27C141EE3D508091F8233DC06BCD2C43D5D375D5BF1206E303E15969C237A125968BDB1300000000000000D44F4DF59F1C30D085C37330CB5917C9B59B456D4B0E7AED6406A676236A113AE59EF68CD00F5AEDB604F1ACC18564F847065899F3051A4EEB629B115BE67D7B7C7DA4163CC9717B743D081518D8B3A08686C695CABEC2CD7AF2FFFFFFFFFFFFFF5C7A81737013FCD62D1A514A95B143A5BC537B841535D6081E7DF593F2382344D1221D37628F392195E1B3F96FBB65980FBFE3E49A8A70ED5B040100000000000000000000000000000000000000000000000000000000000000000000000000002BB4D50DCEE1530AC5F1F684BF34DDE1BB54B23A0E7C270497C0B7F550A9647F14FEE36F45F14BBD316CA74213656B439B69AF3D92E3673DDA19030000000000000000000000000000000000000000000000000000000000000000000000000000F8FE83F629CAF9938532A3C433452F91663D92034AFB15951D4106A9049D7EC7A4FEA188E1368C1EBCB7F2A014C0155B17283AD1C9035B701657DD83AEC40E00C1DCDFF4F19700DBA701BB5755756BBAD76CA648077B78198764E24796B3EC194FBB7058A66F263F3C6A0EC229085D0A13BB102401467AECB6F195B7BBC11800B121590D090CAA343E33A60EAB19F2A423E3A232E2A3D27E757F4BD18C9DE86D8AFE1922D6DA144F690DB7F8549A74539DB6744534C7BE5F249B3AED85260D00CDB5C70C4B07C329BD9B3BB79187B0140C33DC2A2539CFD8FE826CA91A05DCA64E86895DD791796F0FD0AC49C72F7DDBBD3D0EFD0225D24B1D49CC89AACB1C00B6E642920FE501CE8CB1DBB9BCDB7932DE2605B3225D8091A78CDDB20B233586A71BB622F2E24A560ABDE627949C5D7E9D352EB8EAA30E20F2A24F3AD4A01300405A96B230754F43B338FEC5B395665A8C6B49DD5494AE4DA015A67755FA3EDC1E51359ACB65CA1F2259E67F6D3C1D4FAD569BE5B4C1B1F876B588518B3D010026099FD2330EF392F49C28A431DB08A5A04AC20550724500D29C678BFCC180E2D077B2F378F4A56581694A2A2C44629AAF73E94853DC0C45EA69D65A3A8424007B5228031F756848B2E3BD30B967F0A65A83C728DB94DFAFA8DD24DB84EC584BCEAA3954D3EC56B274C363F1D442ADD022A35D58C1FDB9570EE2216FDB410600F5915C584BED71E0EF93D6FF5D294F894F6EDFAEE1A32C293395169EA819385EB4A377F0D72FF97D404C097818E9876087F3B43B62D44382B25105DF8B1711001C68B8D25FFB3E007EC0D755A29DFC0A2FFE9F2EE5910C9789F5BB6FE713DD56712ED1E200726C018FC5DDE27A7F50B63743F737F093020970E874D390B1110041336B0CB085E4E36E2B206C80A1A5254A04C77D98B4A00ED8C2C799A211E909D5859FC2FB0F66C2D9DD5B9FBBDB278F3A2CB0BCD195CC42AF3F946ABC8112006CDC8B83C8A4187B74C5ABC90BB749352F6CB1B142C8322EE020CA823156F3A413774B611FF838FBED14F8DA099CFCC8073000256DDF9E60672CE7F7BD250500142CE4204558AE1930F29058EC38B737B7ADFD08BB47DC66557F564B2F93924B2144A15233885BF80FC78B98F0DE533A9E5ED2AE0DB06B9B6D539D2B74DF2000A171F90C3DEBD6142C47563068F0EB43343D952F8951A7BE3E0FBF59CDAF1C778726FF7F3F32CE88E762779968574C3585501A14E2C0426E3741415BE7391D00 -smlen = 2315 -sm = EE5482E4C409BCD582BF5240F74E7B9777FA013ECAF0DBCDC657C1E4EB6B2D388BD4B4A104015AC95C6A52C66A69FF96B827D1EE7F98A6390101165CA45D992EE583DAD5C57EBB2B18497000C5BB5D9EE826F4551300E0A0CE2FE4C7DF7701C0B115A3AED53B847E383AC86895F99F6412000D407805C2FD7F6F1144C72F74CDE53DA7B001E99E5874618486E1E3BFD3BD567B7AB7136D0014BE36DE20449C02D25439C9801B670379F50018B9F0193AE8BF41E3795D3E523318DC935C014BFFD14473DF34AB3936797C23E615C4E78700749D0880B92B6FB6C7A481EC1A5BE15834A80136C326577EB770CFE0FCC4960C55985741D3009522BFE010865E511A7FA4F330FAA3829DE701012BF95C603F13C0391AA4B4BA20120D0AE89D20FC4DEE1D6A5F16FDE07F5D4B810802F2EA30807C00C8F6CB8A9E96FBAAA5811F8401101153F41BF23969E1993BF1295702E4E3EDCD70C4BBED033F402CEEDC2C265DCA10B2DE0DB00D454C3AE1A0D00C97E1DC8C6804B1777ED21DDF5145B9F9348A931C128A8FB03827F653C37CD95859868DDE356ACE682F627FB69FCD97757BBE8BD5A260A293D2ACF0BFA2C0A3548FE25A2BA1A21F95123D592B40C20A927FDB615E69878E8D7C98D261DC01958A088599D3F9BB5E14002192FC7DE417B1074B3F7B52CD2A699091FD9DC3C5929E51CC0259D2255CAF0E444EC11257B759978BD4A7C8E2CE8473325B7498681102DE6FFE9764334D862E379D9F2EBF9B312FA75D7A50E08B94BD43EEF78722D423928FB8E26FDA85A345EEED0326A5D694E4729154A9997B269407B7D03818025EEB2BA96580626DFDB3BFBFCE100C508170D8150E4980D5D386761F4E8311339B47852ACC2A0A01DAD90D3978DE6536547D4F203CEFFAA652E4F2F28639BC3FF83C485C28EDC0BBE21D17B8ECAF3794D64C36FFE7F07E8A906CAB8E7FC9067CA4BF9B074C7FB01EF99A05D7C0F35D889A63AFE5FF18023BF77F8A3DA0C3CECEA0E538A6DAB5C54F3A0D83151595AD3EC4C45132EC2F22F652EA5DD930E692A7C0D7C23DE84314CAA7C017AD50D430FEF42DE557073DDBA6CAA4A787C92E6E28368943CAD0974EDAEB7ADDF991CCE20BF51C5A898CF0A2104ABB810BD4937D23E5D43490A3194B8A109B745E0A365EFA59199B43835682E996794F16C5CB874C88D9697B189AC54A1BA1F459623C1563CBA7689EBB32DC4FA0BF30E064D119D40C36301A653A4F959C97873003CFF7E8E030A137BAFE0A60AD08E4F692DC107E68AB40EDD0C384875B8525AA0A5EC3ACEAFE557EC76DB5283672F9751AFE1166D53542D216186A3DEF4DFA94E57BFFBEBD6F4AFEC3C0F3F40F651A1251A9AB39C262D42313E9F22879645589EA54FE894AC005115A43DD806B2C8BE6222DD9F02189D4221A9DDE99ECB8C3EF4171776268C12ADC37E4CA92EEF09D2D1803DB1FE917521662BA7EC0C07292C7E2130ECA4EEFFE53EE0CEAAAFF6F4CCFD42186611AFEE79BC651B1ADBAD08458592D69FBEEC708C7537925658BABBE7E9867915C6A728EAF41B0AF2EFFE55207C01652891C373F7A14409D05FE9E26C2E72D688047DE9A0954516B85ED6A3230B6B0EA9C5F086720C26EFBF8B7F5C5D14651D54C4EA181A707C562239CFC08B2E09A2941D04D587B90134D8F670F734578534138CD9CB7EC04437A768FE65FC5B3FBE818DB423A2208E485669082B422AB1257C2529CBF7BA4CB30FA27B7F702418C2EF9C3BF7CDE53661DF716449C6337C54542EADC5209A0E030AD6577DEEACC6BE1813DB24BEC035CEE6AEE93749D524222535A0277600F8E4F4BEB473093C5A00B6666CB319DFF131AE4F004EEB1BF71E5D274E3DFBFA246DADA9D6F548907091045FCCF79B363E695AD54C2F791861CE04874EE8C3375612DE820CEDE04E4472BC3DC19ABBB91C42A1C3D7B467837570E7D20A2CA6405DECCFF1AEC03E0558076E988619CB0CDA9CC87A12367BD486B676A4F71D40B88AB4E7FA750350DADD1A8F12B70864792D3CC1804BE8B7CB9DDA532182C32582015C1788B43054B7010229F46BD39000440E7F5D22E4D52EED85B204B344680426AEF51F0CE0551FEB9672DBF391A9AD363ED090837CAC1E721878E65AF9BA92A0EE7C7979925FBA9F4E452EB4FE3AF03B9EFF0526FF0A331AC0B8CD27A0C49E5019B7025C3C9870C900A7FB31FF834E04B87DB77C4D6DAE4C3FEE741E923704EE5F294D8F881833E9137158D1EE0FBFCB4637ACB814A2A5346607BBCD6BC916235F7875334F2B75A7EA7B8B8DDCDF46C0B8007C9B3A014EC6E634D4173CAFB1DD09CB9ED4A123151F4F2631D4BEE1520C10C15AFEB17198009C2B254C1FF0BECAFBF69BE8C7DBBFC7E8F3F1EF05FF6A7945FF79ED6C317609B9238670DEA26D56D481F87CA171CCFD726CC0728C965D9BC38D376D707E6979908B19FDF7E74ECD2D0671EC338FD54AD6CC5F789E96018521882588F888D7D715104D65954DBA8907C0B7CE3F2ACB802ED49DDF1416C29E8D685C5AD879464819E1D53FDAC741F71E31AC0C17B6C8932A4A00E7164CF8BBFEC36EBBD30392145B292D355FB304A88A638F991F6F89A398B09F1DE4F0B29866029BEE75A12D724A52736F2B9F49937F0E51B0F2E1BD2C1BC9325BBD1061E0F7685ACA02DA735D8FC39646E0B2453BB9690ED1C4853A757EA9DC2F4EB4B5ADBCFCBFB0CD2587F61A24B77CA0D6CFCFF47A98C7098B986D4FBD0E46EF0D1F9DF842F4473C43912AB49F4117C8214A42F3083936C7E8A38B294BA081296A393DCAADDCD0D340AC62511E47DA6591836553EEDB466DA6285359EE831A952E6C7AE3B943636124E43224D527B7D394511CF31C50EC1D3E7A20E49850905D504F1AAE477830E3BDA50430EBD47FDBB0BF537D8D479CB799B0429C3F6591328299A09F45CF9C6D30D5C1C9203B9521D807875D7FB2C2CFAA688414497122161B1B4F159B66C0834E111DA4F82D5252367FD2DBFDC079333FC51AB0D34ECEBBE786F984852A596BE620EC6CF84ED596425B90316A13B39E5EBFA19B319BF0FD1D6C812F29970FB1FFE948BC0D2E057B1DEA15445D71B5F728C72DD0C69E277C58F031F90932994AC5A177926DCC1C570AC1B4B099ED66ABF7DDE5A5D77D08EF1AD7C6FFE018F56EFB07C737F33038846247EEEE147E4A5995BDC3352B73F15FCE5140410AAE3F0AF1764E5AD996D01608C5E6C6C96A20274EA7781B41FC532B01B52134FEE28F501EFD9CF - -count = 60 -seed = A832D4AAE8076C4EFE8319A74CE315928AB765BB629075254CBC63EAAE691C220F4B5E1839E9A99D8747AACD7C2F1EE3 -mlen = 2013 -msg = 84C603D1B5549C46964FF2987A1F533B4CED94E67D576A3B0BF1C8BD87A74AC7DB640FC9F7ADE44FF79B820846EB83367153F5DDDDF9DFB7848A13D59436916EFABB82DD61291447491D2CA04166FA8680E8E0E0DC98E79344534CA1CBDDB531797A61C291606200107002091ADFA927A763CF98CBBD631CFE890B0ED257AFD34AC0C5280AA7C70BD0C945D78E6FDA284CBB7B3AB636BDF17342F2BA28D707147F14D15173D9BC0B6D65FD1663C86971BE1FA59DA8325E1F3773BACC5B8D4158EF525FDE6E96631C51AD142250252A8E5786CD621210DF3E24CC0B4B60AC2F013D76DB0C73DF40EFAA05A65383A8892276B3D69DD511937D55D914C3222A2386D1BEC0A268E683716AF4AB709D2D225B86229095E87FE70D69E6A34BB214529CA3F082C0F2709E77B86B00B4A04BCCD343C862333B7C9163857B77E30551710CCC3A803323F5CD4EB5317CD2E6A24BFB77727E1C64D0AC47BEEA1CB35E5F2FF6024C06F2F391FEE76F2E69537673FC0124E48E4E2242E84D8AFFEE6803CE6EDF3A954D2C54562B8B76A4EDD91E24A8640AFE67255605849053B60F558B43DDB9F8A04E987D15F6292962D10AD8F7B47188D12D1C9090C0FE8710DC3937C6939496884BDE0BEA979839837C61BE4DF5662C724610C7FCB4631A0A2083417BE6A20F4EED094E2145BC72A83A6E147A655C481DCC906E63ADC0244D95B6085FC096FBCCE81EEB0497F48BB5EF827C0893E331795E3B301DC9F3A91DBA9FBC838E044E2AD9859F1DC67E9BCC375442B4EB59714B5EBBA87AC9A79C99CE74F8BC75740DDCCE46C4B408B91DD7D4AD26B0FB1A4AB874F5504C40E7363838D22AEC45C10D3CC2E233124A5CD8344249EDF388E37BA43598F2C2CF56D444BCEE04A335B154DFA3CA694DB481CBAA59514098CE6E0E4138C0A543EFAFEDA4AECC022C824259A06C3D57A70EA15A5DFC822449A27F58F9EF842DCBB636CE293684E1B331CD821594A12634E5594410B6C5E2306DC8BBE62C8B0F49F2F699A59EFB14D3CAD399F74ED893E1EB43FD770FD61E0C58E5D8CBC9435F4AD0892681A30DF4885927130432186AD4BE41F6FB7CFE660E23C5E55F60789B3E97C3B622599938B36BD1C0BCF6FDB7E4EE44C92B6A86CA2470BCDB8BAB8DF6079382CA314BF3A8B3C4286518C356018FD6F6FCDD9BE9AD9C228F29135544E723A898F483E9D9EE843E75ACB3FEAC447973D12461FEE3D984F3B4F31645FAEA56852D356C96CD73A6F185E8CD56731E83FEA145A2BF0C15ADC634DD9E2FFC799B59A0712EB4D2618680C7493F50A9BBF3F7BDE1025CD44AFDAF4A8C42C9254B1B34AA8559E1CEE9BDE7B4DA0FB3CB2289418110620E505B793B91F422FCF53ADDA8F7C96D55E26244E075D9A70004642712EAC377CE18F88F2C8581694B8F621707DAB6D292179B2A95AEC5AD6E409D78253DCC05ECCDB45683DFFFB9C629AFCFB0654725D650E4A283FD98E47F37AA9309E2933CC0393625DD81D4A02F9D5082644DE02B6472D5D3AAE110747E4F756973FDFCE8EA5F997E30B11EBD50B45F6889D227D87D9184CBC6ED40E96DEF8B9236763C9999E21BFC1A74457FFE5E0DC2B16876FE04C2E0F0F47012A767A7AC18D71A7FD65F8647A7E1AE2D4D255492A18AA81D17D390E381B1722BC3C38BCCEA9D5E73231D0C6E1A96CCB47079E36C994E94AF9A318D67B6408BB602A91D8E9EC6499DEED0B51A9AE31D9774A1BEF4C1DE0E7A324545B2AF9870CD733C2195C5ECDE386D298C33D492937497EA5F0E05C377A4D755DEA9D96C61FE82CF6299EB34B857217A2C6733FED64F5DAC5F95A0EF2294ECA844B96CEB5163363A31C58C88428152663AB0A2B310B1A9E9027CA8CC0DB6DFF528F9A421FA826A86ACB4FD1D79C1AE6123C9E685BA66F5FF109FDFF2497B1A50C2E4E7B4662FA11FBAA305A960CA70FF98E5290A8C3A27B4A3CF1705C6DF4290FA64F3259FDEDE7A81CFDE4214230DFB9EFB20049E905833B5D48923C8CE2F8A104946FB3356154519D950998677C56C8B2C80471A6117B142E26C0345CDF0634E356D80C3BE12F4AB89EB41DDDCF98188EAD2FF420EED3FD9287322F24C62B21F430D5F9B8592CE1CDC946616111C91C667006E47992FE2D5A2AAD82F8DD1AF3C1B8BA5326220645885CC94E8B2B76CBFF7E161E994C0CB9E489B8A5662E9D420913AF34433F5BAB10AC72C5EEB9249F3C102E1762E862C13CC882D20BE16834E54DCC323EA89A133F451B70087A8DCDC5B518EEF087A571B570A7966F1C49BFCDC70AC05034D1DCC56EDC2C0F57D1AAF16718C67D162BA330AA61A2875F90E2935752BFF1EC28A79EAD1AC18E70A833946CA6A15D8765E1A62AEF46BED232EAE89DBEC278297B396CF611448C5FD4B36B95CDC54E3394C63B9B0969D6488FF1C700B390E7226F99A945306C6504958CD43CD3D63910A4324BB662A0E5DB1622D90CE00E50CE7112193872AAB5CEE0B8D6FD42F26C2FB87FDF99062169C0BE75C85109D4E209DC8A640FED3EC71EF3DE8878B3D1729FF118F50F8A33361C6F707F6011454C5D744989EC1BEB644FCF99CB2E7C3CD20E6F1656E07C3566C4DE68593BCBA0EE9F7BD2E272C3D47A3E03985456F18CAFBEBBC1DE74964BECABDF3E9BBB9A10B29BF3B458FD50F19D63A6231CB51CDE3DF46E4BB6318E81E10AD1674A053C8CFE1E72853FD60E6E642642CB825644D6734AFB00329839F22CED734FA1421C4334E20F2ECC8BBC2652004203B3B639FBDCF5FDA1423F08C3A1100655E4763B8D8356A151D702124D30FDD87B34EC4D34BBB3639464E44A693690E193329 -pk = 1DC3B0AF072A2B7537F0050AF9A4353DABA82DF1A370545242DBBF5919250750CC6709402109FAD5BD9D008F8DFE382468605941C39630A59E71ED7BB2281000DDDBDEBC1D2DEC7B65C7D33E8ED6348E7806E06778992E9E869DE34C96884EA906FF5A1C611464B0653CF43FD7B847F2A50B143F875501881922C263D9881700 -sk = 1DC3B0AF072A2B7537F0050AF9A4353DABA82DF1A370545242DBBF5919250750CC6709402109FAD5BD9D008F8DFE382468605941C39630A59E71ED7BB2281000DDDBDEBC1D2DEC7B65C7D33E8ED6348E7806E06778992E9E869DE34C96884EA906FF5A1C611464B0653CF43FD7B847F2A50B143F875501881922C263D98817000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019F6E848B421548882A9C919C34BD0783E101FFA42F59320746923EB6CB5236D37383540F4CFDFE30F22431D15BC99C0233E3C9D162C302076693502BDB9FA45DC46726BC1A16807402EA8C02F89EEB4E5BFDEEDF6B6EF477EF6FFFFFFFFFFFFFFC2282D90FDC7EA63DADC6E73D5DA6BBDA009B43EDED8D18ECD4A185D5250475DC1FD7FBDF4D6A0DC3F8090A7BEAAA00CA8D97536DCA103D02EF99B64C82B2D9072B870A06FEEEE9A51EBEDD090045E2650E5DB06C425AA3569E7FFFFFFFFFFFFFF364E57F30F137CC51344FB8197BE2CD110A8A1EFC89EC8A8DA9ED4704711923CA36DBB55F46CF9A8BE6E049A5787E4C488B50251D00586038D5801000000000000000000000000000000000000000000000000000000000000000000000000000017CAD67701F7993449CB3AA689353F91411D4F5EFC15F940EC15B44A6029B85AE688068B99D26A4AA8A5DA5941276C53F8928EBF82D7D542845100000000000000000000000000000000000000000000000000000000000000000000000000000040C6FD27A194D97C725AB1B2099DD02E98C60DC71486B46B3492193D6920F5397625ADC1CB38C95525BEB48B02BCFC4676D73F117A60725834B9C587B89E0E00D6A4D963111C8B7D8F8695746A71009EF882360EE0B547FB445C1D00BD13F25317F99FB999D08D3D53BFB23D71FFC66D37A37703FECF1F5AD5D2BB1DC7600D0067D8DFD7F8693B43FE079B080AC4F9122279336E3E09F3067F5FB900578C8689F2B9E7A25F1318AAEB0B95E3CD08A625D9206910CC2514732110A6B0271C17003FC6AEC8FA1C8E6931DC041B0AEA1C7FF620E99B968D7F34966020C6847785DCCA8C91B0CF33737822E38008E2B26F5B0358BBCF35FF1E194F7FFDCDA8E109001065CF4149EDD0C4EC4D323B5101D89951D94C8FF86D792FF07D8D636511BF17532509CD9FB48C724C06BD8FEA00B7BA3DFA37BDBF9AE72E46BA91FC4ECF19001BF4AAEB4CAA019F4B4CECE3B3279FF6B9AB83A8A8668A1DFEB9F244E51E3498E4B660BD4FFF0A5339F4E7E136DD6F930EF381511EAA28F99D1D6171C7721B00639BD57E1EBFAF8BAEEC3BBA730042B388EC5EED0C58E3583005C4AA061E41D23C4EAED9CAFF0D540B92FE8022BB841FECACAE093DEAA56FE00FA7811C692300D062565DC506ED0D1F775E04A899DC34D0397DD1707692F06BBCF2248EFC0B70530A588BD34637D8B339378EDF943403DD86D3D70DCED5317A3E70A7534E01006D9812FBE28CA9F01D4616C641978D3B2085C01D177D5CAED31CD6204263FDB44661CD414EC3A8331703367372325FFB3B87F2A58C6E8EEAE47E600D0D301100E76E106FDF3E7489B5C02BB6D314A42B7B5792018AFA10AEC0F57C4429B94A57109E3486AFF9C7E4ACEF9A86B738C7DB43CED0ADB27E5452FED52A8BA2A92000AA3B18A891D90FB53E0350F7A02805A8B747812A2B85484E9138967486D47FC3259F3E67B0171A2FEA655CEC59CADC887135060D41113FE79B19B44423AF22006F58C94A92E6CF147FE0A47BD6545B341243BA9598B415A273C1C954F7EA0EE745BFE5814F90D9EBF416C338A0C6B50DF2BDFD26D6625A88D69A3E2263AC0700BFBD3538B005F01CBF5BB698D6411BB8D8787ED36B8982F0769F90128DF76966C536307EE88D509B0D0AE0211DDC6BC8013ECC9DC0F47B1BD0E54390DAD21500D7E5516570B451DBD2290E53D905B511EE0ADF0F9D2D108C594D89B38AB84317F7A10648D6CE4C1046EFD1252BBCC4C67BC4282E3F81AC9E0E552AC6E7372500 -smlen = 2348 -sm = 1271FFA06A33B31C1A2142DC91A3992E506900BF979C5F73D6E7877489F14128BF086CDFC801C80CC76CD2B16412DAD1CE0EDAD1F5E572B7013DAA7E06DD0CB6C4436C941939915136DC7C00345C293709FFBA4BDFCE122A71F0874E9E51014002DC08B5A766AD3C96E1852563D405F64101FC8C9FBF84C7F77DD2F8105DC4EAA16395880155929D5E4AA56669022B5BE7F9F57A255BCB0178F018CC17223C9EF8F49C703FBEC34721D101E18A125DE49CB2A8EF618A0236F88DECCC2D00EB8E752A1A4E8D8105D29981215129796A4500D76BB6D43312059FFE576F1ECD1F868A4B27012CE473AA7E3C07F2CFE51C191D4E45E899FA002BCB319752734E59DC4346F2DE6E1D082C96010059A7B4B21B2E83B07A7F489494E39C7D6E06F7CC9708CC67ADE0A1CF830D48BB01008C80ABD57C967A53B5C99917D1385BC7A0E8012C70D1C487AE4248B71B9CB18F610384C603D1B5549C46964FF2987A1F533B4CED94E67D576A3B0BF1C8BD87A74AC7DB640FC9F7ADE44FF79B820846EB83367153F5DDDDF9DFB7848A13D59436916EFABB82DD61291447491D2CA04166FA8680E8E0E0DC98E79344534CA1CBDDB531797A61C291606200107002091ADFA927A763CF98CBBD631CFE890B0ED257AFD34AC0C5280AA7C70BD0C945D78E6FDA284CBB7B3AB636BDF17342F2BA28D707147F14D15173D9BC0B6D65FD1663C86971BE1FA59DA8325E1F3773BACC5B8D4158EF525FDE6E96631C51AD142250252A8E5786CD621210DF3E24CC0B4B60AC2F013D76DB0C73DF40EFAA05A65383A8892276B3D69DD511937D55D914C3222A2386D1BEC0A268E683716AF4AB709D2D225B86229095E87FE70D69E6A34BB214529CA3F082C0F2709E77B86B00B4A04BCCD343C862333B7C9163857B77E30551710CCC3A803323F5CD4EB5317CD2E6A24BFB77727E1C64D0AC47BEEA1CB35E5F2FF6024C06F2F391FEE76F2E69537673FC0124E48E4E2242E84D8AFFEE6803CE6EDF3A954D2C54562B8B76A4EDD91E24A8640AFE67255605849053B60F558B43DDB9F8A04E987D15F6292962D10AD8F7B47188D12D1C9090C0FE8710DC3937C6939496884BDE0BEA979839837C61BE4DF5662C724610C7FCB4631A0A2083417BE6A20F4EED094E2145BC72A83A6E147A655C481DCC906E63ADC0244D95B6085FC096FBCCE81EEB0497F48BB5EF827C0893E331795E3B301DC9F3A91DBA9FBC838E044E2AD9859F1DC67E9BCC375442B4EB59714B5EBBA87AC9A79C99CE74F8BC75740DDCCE46C4B408B91DD7D4AD26B0FB1A4AB874F5504C40E7363838D22AEC45C10D3CC2E233124A5CD8344249EDF388E37BA43598F2C2CF56D444BCEE04A335B154DFA3CA694DB481CBAA59514098CE6E0E4138C0A543EFAFEDA4AECC022C824259A06C3D57A70EA15A5DFC822449A27F58F9EF842DCBB636CE293684E1B331CD821594A12634E5594410B6C5E2306DC8BBE62C8B0F49F2F699A59EFB14D3CAD399F74ED893E1EB43FD770FD61E0C58E5D8CBC9435F4AD0892681A30DF4885927130432186AD4BE41F6FB7CFE660E23C5E55F60789B3E97C3B622599938B36BD1C0BCF6FDB7E4EE44C92B6A86CA2470BCDB8BAB8DF6079382CA314BF3A8B3C4286518C356018FD6F6FCDD9BE9AD9C228F29135544E723A898F483E9D9EE843E75ACB3FEAC447973D12461FEE3D984F3B4F31645FAEA56852D356C96CD73A6F185E8CD56731E83FEA145A2BF0C15ADC634DD9E2FFC799B59A0712EB4D2618680C7493F50A9BBF3F7BDE1025CD44AFDAF4A8C42C9254B1B34AA8559E1CEE9BDE7B4DA0FB3CB2289418110620E505B793B91F422FCF53ADDA8F7C96D55E26244E075D9A70004642712EAC377CE18F88F2C8581694B8F621707DAB6D292179B2A95AEC5AD6E409D78253DCC05ECCDB45683DFFFB9C629AFCFB0654725D650E4A283FD98E47F37AA9309E2933CC0393625DD81D4A02F9D5082644DE02B6472D5D3AAE110747E4F756973FDFCE8EA5F997E30B11EBD50B45F6889D227D87D9184CBC6ED40E96DEF8B9236763C9999E21BFC1A74457FFE5E0DC2B16876FE04C2E0F0F47012A767A7AC18D71A7FD65F8647A7E1AE2D4D255492A18AA81D17D390E381B1722BC3C38BCCEA9D5E73231D0C6E1A96CCB47079E36C994E94AF9A318D67B6408BB602A91D8E9EC6499DEED0B51A9AE31D9774A1BEF4C1DE0E7A324545B2AF9870CD733C2195C5ECDE386D298C33D492937497EA5F0E05C377A4D755DEA9D96C61FE82CF6299EB34B857217A2C6733FED64F5DAC5F95A0EF2294ECA844B96CEB5163363A31C58C88428152663AB0A2B310B1A9E9027CA8CC0DB6DFF528F9A421FA826A86ACB4FD1D79C1AE6123C9E685BA66F5FF109FDFF2497B1A50C2E4E7B4662FA11FBAA305A960CA70FF98E5290A8C3A27B4A3CF1705C6DF4290FA64F3259FDEDE7A81CFDE4214230DFB9EFB20049E905833B5D48923C8CE2F8A104946FB3356154519D950998677C56C8B2C80471A6117B142E26C0345CDF0634E356D80C3BE12F4AB89EB41DDDCF98188EAD2FF420EED3FD9287322F24C62B21F430D5F9B8592CE1CDC946616111C91C667006E47992FE2D5A2AAD82F8DD1AF3C1B8BA5326220645885CC94E8B2B76CBFF7E161E994C0CB9E489B8A5662E9D420913AF34433F5BAB10AC72C5EEB9249F3C102E1762E862C13CC882D20BE16834E54DCC323EA89A133F451B70087A8DCDC5B518EEF087A571B570A7966F1C49BFCDC70AC05034D1DCC56EDC2C0F57D1AAF16718C67D162BA330AA61A2875F90E2935752BFF1EC28A79EAD1AC18E70A833946CA6A15D8765E1A62AEF46BED232EAE89DBEC278297B396CF611448C5FD4B36B95CDC54E3394C63B9B0969D6488FF1C700B390E7226F99A945306C6504958CD43CD3D63910A4324BB662A0E5DB1622D90CE00E50CE7112193872AAB5CEE0B8D6FD42F26C2FB87FDF99062169C0BE75C85109D4E209DC8A640FED3EC71EF3DE8878B3D1729FF118F50F8A33361C6F707F6011454C5D744989EC1BEB644FCF99CB2E7C3CD20E6F1656E07C3566C4DE68593BCBA0EE9F7BD2E272C3D47A3E03985456F18CAFBEBBC1DE74964BECABDF3E9BBB9A10B29BF3B458FD50F19D63A6231CB51CDE3DF46E4BB6318E81E10AD1674A053C8CFE1E72853FD60E6E642642CB825644D6734AFB00329839F22CED734FA1421C4334E20F2ECC8BBC2652004203B3B639FBDCF5FDA1423F08C3A1100655E4763B8D8356A151D702124D30FDD87B34EC4D34BBB3639464E44A693690E193329 - -count = 61 -seed = 09B8441F47235EFC82D71933A0037FA4F69124C3BAD4EF6A3A7178B417A3FDA874081B7EEFD7EF1BF234C752458FBBAD -mlen = 2046 -msg = 92D5FEEF68737ECE61C6E0078D77FBAE97B0B9235F40B97099C114B1586E107B5ED1308A8A2D20BE41AF129DA2E0B38EAF02FAEF733C7A1D1A387BC55EF008530ABC22697D0465AA3EB71F41EE72ADD236CEA9A25995F3689C5A451E2F03915D96ABEA10D356D549D68048977587326523CCD71C05FD57BFB3C7A853F535BEDDEADFB84118F6548860F6BA536277DDD7AB42123E93381A385FA3E6CC023C1458A9F94822D93248F36C48FDDC972B5D6494B26658440FFBC23B57363F3D82CCE69FEE4747A889E85343288D55D30FC54D2D0744744DBA9977720E8EDD2C0ACA1FC51B0C6A3C68BB9BB8DA0385DB1CA4E9CE660CF7EB2382E5E95D2AE19DEF904A8651DFAE53A4D0DC4D057AB1A506C3BD7E1D1EA3FC4623E7D7B410DCB312F037B7A5FDE5E0E604FC33270FAF1FFB6ECB3125DDFA5C49F25BBC98238C8AB1B903537CD67238995E81B814280A4CED61513D69A2178086D505F8DD1DF7E11CE66AE33D4C982F94231957031A258E0EC745672A57A5CE76D1170111B8882A9EB5388094EBBD53EE9EA1FCE4A275F9D7060C8DA79018487B452817280C63B01B05EFBF897387592E2BB3BB486FAE0AB09F46D9F2E176DE96C59992C10A14EC16EAC36102B1D15541607075E67C842A888C87B268E9809148A323C423220DC31566B62F45CCE1E2BC1B3BF43B87C998F00023890BCE517271BEC16EFAA33F11611FDE87F197852BC2E7A2B44F8C72A6F79B22F73BE0611B81EFE09253931545D2453939C46B6797CC5DC5A8F1AA3BD8456EEEB84EE76DBF2EBF32598750ED10670DF422C7D7993ACC55F657E6E1B3DFA1BD6C1CD55FAE97E69D2F8F5AF368F7DA0A63B4065EB6D8F02B19A34600252FDFFDF4ED8DE2EA9CD2E74D63A6CEF29BF02F92D346ECB9A61081EE5AC811F33AA5792F6A1AF570A8B0846F3E6EF38452346DD637B19ECA37BD1A6C42B20A5BEDE9A5DE3C9F169D04D8C6CF5376D3404F0C21DEAD53DA6C169F390EED7B5B54DBE47CCE0B2AD1179EA8FC80FDDC7281BD4FE31B9A26A00444AF0B4D40A1B72BE37501308906149DC6FC5CF02B6F60AFF82B975FC8F146961EBCCB4D126ADD524A9B33BB16F6A83C6F3727A72EFA2BAC116E493E07B2CA718A63FCAC8E9D52A1B61479B4EE52A5ED30FABCEA4D01A792A92676721286814F3B0F4E15E23CE0C5D59A0C3EB8573C0A2F66C25F2EB2FCFF787324721004979BE5EAC505DFD39F5538E2C1B2CC12D20C1C5CD87299766361AEDDBFFF743693081842378744879E6E6371B3FFA9DDF34966FBF8DEE91B7EDF6EEC3E4E2F410CB5351F847646C22AB594046DED63347D04A008FBF6EE9696C638ECE73B39A269DB239DF36443868AD44D26A5C40FC92DFFB008E436E5C18907F5B18B5E6C5900B41A9801DB070D2DB651187A4DA7E2647ED3E9B6E9781627EB576BEE8334374468760DD3B32985D42945D953D434BFD80D7F7BA537265FFCF27DB0DA1ABDAE89BBE94D98BC9CA197E41C0839728F964FE4CE30B8CC43CBDCDD9CCBE06FE99DEBC6F4024F3F00D43FEBCD62A1822A6D507337EE79D4517AA486870602D4F1C5368B0EAA1FF6C011A9A953AAE58C75BBD3DC78D263A578C75CDB1AB324D71B9A065A9AF3DAB854189585C68D499AE8DB887745E20AD9738705B9D2F5D429F12D6462E5E2EF9FFBA53CE2F4E75449D2A7DBC3C818E61DC546175A6E0C10AE631DF6B1EAE6D134C08466EBF6EB5F8257AA10EF8C6F27F4295F7EBFD450629F3EB4E0F4BE247AD7F5E80703B1247A4FC277311D69E5D62E0B0201A805CC4F1F807DE99420D563A703493AD35A56B2B2DC237112F5EC21C70BF139A9EAD8F7E921F086E001B4C449E42A0E3AFCD5BC757040A2865D0E5ADAF98E37E6F8A501FF39CEF0BC364EECDFFD03069B81F5E1978C397862FD56362835C059FCBE4D8E2A957FADD7D05BB195E21AD67B429621E1D6872DE2D8BFDC91544F9E6AE8C164A23255AD0E00BCB21456F8FA6AE018F49605736C81A5AC0945E2D965F1493ED5BEFCE512AE93AD91DAF6F5A151D6C9856DFDDD1F877945D932261DED67AC8231DC3CCD0B04DC1B02079C897601E363FFB9A3BCBBBDB0B0A375E69EE4A7135C094ABDC237FAA2E5F82D2556290ADCF82ADBA8402C4FC9D0724F15BB87CD7A75A1A7BF826896D8EF63C7A2A3C371756AF638706270652C376100EC42FA55196DF332820D377760448D3E7ADC42E9F5D8A7074BD0FA97433B0E2C501252DE6939AB948552663A17DD7FF05430FA76E29F0519D650B86FBB19FBED097143FC242573E3E6FA4BD4A2EF6D9CE6932A066B4F9FF935BA9BC26FC2E5031C20AE30A52970A2DF3504576108D5F26517F8577BE61E6AA9D192ED62CF36AA641DA0D274B1ED5EE864B549154EB4115658E6C60219CC5B2E22C49CE3BA76A85EFB549117E1207F6DF081D0761421262E352182239F1E34EDBEA4BCD8FA0027543824DD58A20324FD4CFE943AAE5E361C367B22F587E2F9BEE841E11875B026F12B9571512F72985F98F6D0C212DF36A60975429173E317F6ACF72E621F30654A6DEAEF9E9E455524BF07FFDF44642A1826F734D69F3EEF4D52F26C06376C8F71DFB65A24A4C57D74B5976950AF3A57B4248909524BEC47D858C69041EED34E0ED3B111BBC117AB112BBF947D646AB3B7172F5FB726DBC53AE37956E29F5B6B1E3C90BAF4E4FA544FF63815FDF4AC9A2A80CA0E8722383437B9A02F3AC538FEDA7A6D6C1635D3624A385D846E79E956DCE483B89C346C1287A1A7293168D8A885FEB6569EBDF3F47F8BBB50AA43941EB20001959AF1B9B358ABA13FD9BBC596EA42A9774A120AF091D544E79C50686C26B4FEA396BF1E4C25B8EE4929D75569A5FAC521C77B -pk = E34370A65C54BBB75DB1809EB8FDA4D074C2EC831B71C5E60C3E0CDB6B1627250ED7CCC951F1048BF0F93B0670844DB6AC20760058670D962A6ECD5C4FDD0300244EDA86F2429C887963C6B8B3445114C53F48CA5EFFED8E812640328830280A1D663AFDCCB785E516B4BD05F77ED6230C674C7C6E04159BD850F87EC3571300 -sk = E34370A65C54BBB75DB1809EB8FDA4D074C2EC831B71C5E60C3E0CDB6B1627250ED7CCC951F1048BF0F93B0670844DB6AC20760058670D962A6ECD5C4FDD0300244EDA86F2429C887963C6B8B3445114C53F48CA5EFFED8E812640328830280A1D663AFDCCB785E516B4BD05F77ED6230C674C7C6E04159BD850F87EC357130002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CD60D34E82F394237B886888776418A4CC347BFC8E622C381C6142402C55731B30D67F3AFDA1F1AF58ACF5D87C5727EE0869A57F639FEE33771B11827CD7479946287E73C99E6282C5EE3C0265A192B62DE97D3ACFA4977CAF04000000000000008C21498FD4C91A5A02562C42249DD21BEDCDA979C202DCB4FD1ABE7958B9F13A0470CA475D38E5296360C2B36D813F506BF07907E563025A05B6A6ACA8E62090F7DE48B178022A79B527C0FAE6EC9320154A6B54E2A450DA84ECFFFFFFFFFFFFFFC8E4AFB146B19E77DFEAC482E4A9960CDFFB81600BDAC768F216BE48DF382F329A84BC1FB5F8EA0906536E9FF9C0BD9364F4715FEA8A421E50B6FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B22A72A242E81294EDB7B88366D77A84C0773929578F3BC458BCAD53F5E874B3839069D9BB169F145C35D3AEB3CACF535C064086D6AB1F8FEBF010000000000000000000000000000000000000000000000000000000000000000000000000000991EC14CB81DDB0BCECB58AE04BAE9AEF02B327BDF1D3D4EB17E7A0BBCA742B11C007290853C99F736A43B814A95681AB3D96E8B5837725F582325A92DE80A00F64C6E4F984A467E5A72B4E853B13E44843A13D6C7783C825F97E70137B71958CAA35E7812B73EE3F0F9C50155000290A23DB2928F7A46D360B06F5148D824004DA49E0FC654B65B545CDD028EA777D2D02E9C3B7FB76E54C9C8A41EB855A521D6EEBE97B8E6329505E3B196B166D24DB457469F0501DB9CB94E3A62525016006965BEBF89C834CAE67A13A55091877177A0678F9843C78DF58AF7F54CCFAAFA4BBFFCA47842295574513576B1B5DD7C041CC52FF071E817158458378D0514004B96958C1EE92EE50C870FBB9342F8BFC4A424149F0644E39D5BE69EEE2EFBBB646A5AC7561F46A968E856D53734CF5FB437C8EE11D05747DBC1E4103A451A006BB4D8B1D23836E79CAAFD9199BB79C5BDFF3C0A22C3DE798CEA4AF606E132C4B7B027D9F2B7999D1EF10C76D95FCBAF087F39432694ED84A5D2D80008170800086571FC96CE74866FCAF991DD061F06F8B2D9500447E5B3B00C719DA6245007D6BE03D6A759885233DADB2AE83CD028A1C3D42A316C4166461C4F8B38610C0022A6FEBFE97808DCF16CAB9D2D477157DF3C25E885E4F17A9F58E771308F3C7C2B15064221B0BBE2E003852E68722B1936D7CDCD4BF16A3728CD6354BC8E1F0091D1BD47D8D574673B9B4F3192D84FB5D64507AC4F0CDA3EC841E95AD08926968C89036C5D64487B384179806EED6CD07444EDB95CDE3DCF74B36267EF2A1F00146188BF3C9458B9F0A449108D3024D259CBD2AE35243664EB3593E3DC9283E1121969AF7CE885AF015045604DF448736909BB9628FAE1F22CE33712CCAC1900E50E15E2B37B464ACC213293B390D41CB18E80FBFA6438510F3BF87550DB4AB4292303CE48A1EEF8BB3812AE07AE48FFE8714BAD9FE9E4ABA7C7EB47663D18005336C3DE52F994487CF90745AA65C8BBC34A0E9FAEA854477A2370F1963242465D50B2166044027CDF973C482635DA5229457F876CDA45128B82A14636E817003E442EDAD9138F353ADC29889B59D7711A88F0B9E0B02B54FEA3072B29BA0EB3511159F82B17F0B642DBA80D5E220D2E0602C53BBA8376EC830F2F24C23C1600EB53FE9296B5B22B39C59EF75B7A771E84523071751D5806C13B67841DCFB91D39C024CD5028E21D8FA017C5C82A462561DF11FAF32C4F534EB3259001521D00 -smlen = 2381 -sm = 449EBF0841847F017A3380F5CC1B25FAFAA20014EDD5842896E823C14B8DEA39A6416B2AA701D02798AD890168508464F960B95C48CF29EB01F56D1A9D97A26F6900637F2E71EC640D6E5F01A48D2B0405AEDF89D5DA73A9FE8B8DADC69600828D3FDB63DD51C39393CF6606B87C65824701C5D5B6DA89E6F248D5DC1CCF6D5618BB47C400FD6611F6AB2C768C290CDEEF4B4917AF51D701118D71EB7D3D7524B3E0EB9C380F3B6A3D2F0173A9A3723C5563D5256C5ADFAE407046915201DF58A7180ACC189F33FD0E7ABB602C60AFA301B7A01BB6470AC8A37C9C304B647623DAB85A010C054E94605C116FE35988522DA8F934EBD701047B7858973EBE1C2F95A0662F4A77A18665000103D06AFE1BDE80F1B1D43870C7025F97624759B6D883B307F7191B467D3FC42A03025205EF2FD29AA2C983521B9F3AE7401899BC012E1CE93413769780E98569B22FD90092D5FEEF68737ECE61C6E0078D77FBAE97B0B9235F40B97099C114B1586E107B5ED1308A8A2D20BE41AF129DA2E0B38EAF02FAEF733C7A1D1A387BC55EF008530ABC22697D0465AA3EB71F41EE72ADD236CEA9A25995F3689C5A451E2F03915D96ABEA10D356D549D68048977587326523CCD71C05FD57BFB3C7A853F535BEDDEADFB84118F6548860F6BA536277DDD7AB42123E93381A385FA3E6CC023C1458A9F94822D93248F36C48FDDC972B5D6494B26658440FFBC23B57363F3D82CCE69FEE4747A889E85343288D55D30FC54D2D0744744DBA9977720E8EDD2C0ACA1FC51B0C6A3C68BB9BB8DA0385DB1CA4E9CE660CF7EB2382E5E95D2AE19DEF904A8651DFAE53A4D0DC4D057AB1A506C3BD7E1D1EA3FC4623E7D7B410DCB312F037B7A5FDE5E0E604FC33270FAF1FFB6ECB3125DDFA5C49F25BBC98238C8AB1B903537CD67238995E81B814280A4CED61513D69A2178086D505F8DD1DF7E11CE66AE33D4C982F94231957031A258E0EC745672A57A5CE76D1170111B8882A9EB5388094EBBD53EE9EA1FCE4A275F9D7060C8DA79018487B452817280C63B01B05EFBF897387592E2BB3BB486FAE0AB09F46D9F2E176DE96C59992C10A14EC16EAC36102B1D15541607075E67C842A888C87B268E9809148A323C423220DC31566B62F45CCE1E2BC1B3BF43B87C998F00023890BCE517271BEC16EFAA33F11611FDE87F197852BC2E7A2B44F8C72A6F79B22F73BE0611B81EFE09253931545D2453939C46B6797CC5DC5A8F1AA3BD8456EEEB84EE76DBF2EBF32598750ED10670DF422C7D7993ACC55F657E6E1B3DFA1BD6C1CD55FAE97E69D2F8F5AF368F7DA0A63B4065EB6D8F02B19A34600252FDFFDF4ED8DE2EA9CD2E74D63A6CEF29BF02F92D346ECB9A61081EE5AC811F33AA5792F6A1AF570A8B0846F3E6EF38452346DD637B19ECA37BD1A6C42B20A5BEDE9A5DE3C9F169D04D8C6CF5376D3404F0C21DEAD53DA6C169F390EED7B5B54DBE47CCE0B2AD1179EA8FC80FDDC7281BD4FE31B9A26A00444AF0B4D40A1B72BE37501308906149DC6FC5CF02B6F60AFF82B975FC8F146961EBCCB4D126ADD524A9B33BB16F6A83C6F3727A72EFA2BAC116E493E07B2CA718A63FCAC8E9D52A1B61479B4EE52A5ED30FABCEA4D01A792A92676721286814F3B0F4E15E23CE0C5D59A0C3EB8573C0A2F66C25F2EB2FCFF787324721004979BE5EAC505DFD39F5538E2C1B2CC12D20C1C5CD87299766361AEDDBFFF743693081842378744879E6E6371B3FFA9DDF34966FBF8DEE91B7EDF6EEC3E4E2F410CB5351F847646C22AB594046DED63347D04A008FBF6EE9696C638ECE73B39A269DB239DF36443868AD44D26A5C40FC92DFFB008E436E5C18907F5B18B5E6C5900B41A9801DB070D2DB651187A4DA7E2647ED3E9B6E9781627EB576BEE8334374468760DD3B32985D42945D953D434BFD80D7F7BA537265FFCF27DB0DA1ABDAE89BBE94D98BC9CA197E41C0839728F964FE4CE30B8CC43CBDCDD9CCBE06FE99DEBC6F4024F3F00D43FEBCD62A1822A6D507337EE79D4517AA486870602D4F1C5368B0EAA1FF6C011A9A953AAE58C75BBD3DC78D263A578C75CDB1AB324D71B9A065A9AF3DAB854189585C68D499AE8DB887745E20AD9738705B9D2F5D429F12D6462E5E2EF9FFBA53CE2F4E75449D2A7DBC3C818E61DC546175A6E0C10AE631DF6B1EAE6D134C08466EBF6EB5F8257AA10EF8C6F27F4295F7EBFD450629F3EB4E0F4BE247AD7F5E80703B1247A4FC277311D69E5D62E0B0201A805CC4F1F807DE99420D563A703493AD35A56B2B2DC237112F5EC21C70BF139A9EAD8F7E921F086E001B4C449E42A0E3AFCD5BC757040A2865D0E5ADAF98E37E6F8A501FF39CEF0BC364EECDFFD03069B81F5E1978C397862FD56362835C059FCBE4D8E2A957FADD7D05BB195E21AD67B429621E1D6872DE2D8BFDC91544F9E6AE8C164A23255AD0E00BCB21456F8FA6AE018F49605736C81A5AC0945E2D965F1493ED5BEFCE512AE93AD91DAF6F5A151D6C9856DFDDD1F877945D932261DED67AC8231DC3CCD0B04DC1B02079C897601E363FFB9A3BCBBBDB0B0A375E69EE4A7135C094ABDC237FAA2E5F82D2556290ADCF82ADBA8402C4FC9D0724F15BB87CD7A75A1A7BF826896D8EF63C7A2A3C371756AF638706270652C376100EC42FA55196DF332820D377760448D3E7ADC42E9F5D8A7074BD0FA97433B0E2C501252DE6939AB948552663A17DD7FF05430FA76E29F0519D650B86FBB19FBED097143FC242573E3E6FA4BD4A2EF6D9CE6932A066B4F9FF935BA9BC26FC2E5031C20AE30A52970A2DF3504576108D5F26517F8577BE61E6AA9D192ED62CF36AA641DA0D274B1ED5EE864B549154EB4115658E6C60219CC5B2E22C49CE3BA76A85EFB549117E1207F6DF081D0761421262E352182239F1E34EDBEA4BCD8FA0027543824DD58A20324FD4CFE943AAE5E361C367B22F587E2F9BEE841E11875B026F12B9571512F72985F98F6D0C212DF36A60975429173E317F6ACF72E621F30654A6DEAEF9E9E455524BF07FFDF44642A1826F734D69F3EEF4D52F26C06376C8F71DFB65A24A4C57D74B5976950AF3A57B4248909524BEC47D858C69041EED34E0ED3B111BBC117AB112BBF947D646AB3B7172F5FB726DBC53AE37956E29F5B6B1E3C90BAF4E4FA544FF63815FDF4AC9A2A80CA0E8722383437B9A02F3AC538FEDA7A6D6C1635D3624A385D846E79E956DCE483B89C346C1287A1A7293168D8A885FEB6569EBDF3F47F8BBB50AA43941EB20001959AF1B9B358ABA13FD9BBC596EA42A9774A120AF091D544E79C50686C26B4FEA396BF1E4C25B8EE4929D75569A5FAC521C77B - -count = 62 -seed = D2629CEEAE5C95D3C34C1FFCC2338B4A97782BDFCD39111E18540B69DB035B352D012857111F816F03550BFE5F56ABEE -mlen = 2079 -msg = 7F704CEF1C510BC2CAE9B70FD248C656226BD5686D366528F0D0BEFC0A8761EC640CD2DA7979DE5EEBDF6127F29ABB8607F8A3D3BE05BE25AACE7FEF3063DF28E22A522FFF0B6FF6A0C61F79B02A408E8E1C775AB80BE6841E9F8A9D030AE5518E3EA8A4E31E416E087D47919593598FD58122A9E601A57EF02DE183D56921811AE2253628125C24F93C84361C5EC99E7B16962BD96CA190C68F3AA9DD60CE3AA7610589813B4FB77A4688308D9BC72CBE918583E298E03AB95FC500209C14ABEB3A43BAA92DCB11CB523C4D17EB9C6697B56C8B61EDA05BF5789166F839291CFE2997B7DD462EDA69B0615F2AD82AAC0A32F4B30FE8725849C144A9C07799D6CE9D293C25D8302161757B8C8C8D07032D914EA7DAC275919A1DFA0D3348EC07FDC70266975722763EF85EC4AF9E14288C9659907526566BB3F2DD5DAFC0D422568CA3AE52486D3F2C18B667E5622BA7E52C56BF00F82AF2108CB4949A09179544F30758B7FB98C49EA160720991B14E2858D648F0585AD1BB1D08294F029BFE936154E9D328DF2E054004FC5C29070DF9EE50DCD0981D2BFB3AA7D6F637C4CE457C0C66D27E2670107A2B85D1F026BD970EF3FB7E32C60218D5E43A06D9CD26289A937B4FBAD2A831425728F3D0D30C6C602AF4B14411E9B3C7CF0B4D630614A9E03AC30BA2B024D496DA984D08854F1366012C2400A5C8268C2B126DEA5AEBA0DE7C92BE0AF08CA22E02604A753702BDCD642BBFA0CC91BD8375657A957306A76B6F139621481B6F15CB57BEE128954D30F552661F906D8AB42CF260F30F88993BB40C9679385F5C4639888973361216DF3C60C57D9B250F64B7634C94DDA3FD122713FD2405A7B71F476C263A781DCE271E7D0665E45DCB27F7293DE57312396C58C40E268F57ED856F536C8FEB4B0060488DE3C25949D2B7E64207576641B34920D04B46766AA2978D9352C2769D49F8599F3D0439C928532E0EE428A3773FA4D68E6052335C6D93368E321D750D296799FAF87B82C640A6E995D18DDA002887F141DB8ECE2584DA2FDDF848D38357D585CD619B1625A70A5D333561D6DE856ED9908D1E377EF7BE03B326594808BE58F7FB3939E939B73F11DAB3E572DBA41D43A046B8D2BB521728222D5A77DC886AC6F328D9A531118156D791D64F5DF8FF8BE8DCA32EABC3CB259B0F72B021CEB4DB36A6CD2FD149437B251F81F7588AE921456BEF1A79FE83447D80CADDBF20895667CA0E493A4731EEC901E03F66DE284400A5558922AD53D4E0FF7BC6C61640ADE0274C63D94E96BF6C642B790823109F53C3C27130A1EE38D448239187F5009373BE328AF866A9B8DD1BB735E8002296043C6FF641A432709148C707B900ECF46555D77644565D5998C096756F79B6F0E20850B8BF0528E78BF5FB4859BD655227873D289CCE47FEDA8414D09ED7E8D380FC4D580C7F44B01521E829E7B0CB2D2F345C517B65E2D476687EC9A4C160A3AC0B01CBAA588644D799B125910812790F06C1ECB1F1E64D5CCF92AE5E8147C98B0CFAD5626BAB5115844198E8C2AC1DF9A208FCD2D2891F4A29009F5B36D8E31383811A9493CF8E143B5AC8A14D48119CC16D2C6BF6826FC47D4B782FFC76B64401B8249777E32C1298606553DACF386A22809B599924A635796A1AEC3CD8568064852E54C95AD887D7AFE837F6FF676F69EE6288879F6D96193AD94A0418BBBA2EED5355876F2C3497448A5F8F3F83B136703D9A38FBB62784CC233DF448A5E88EB5F81A0BE97A16FD4CABA1D87A4BFB08E002EBA548F662D496A1478BB7C26C69CA4C100AA6872A4945D703CA812BDBA53AC86010AA1D2C53F29E46AD095936FF50DB8805DF4B08C9580AEECE3A6DDD828E7B5D4DABCAF112A6E35AB3C28A6DDC4D98AD1063C2ED72CAA50086E6B72090CC1F2AFEBEC6751F27EF51DD8557E53D928535D82A220F62BA0645E3C2618F3424EA1A339A138C9B8E26B14BC32D1736A4193C0C72CC402C3EAB58817335C1424BD6F38CFE16338611118B4100E4038D07DCA041C72E485C5290F0DDE601565DAE9CDF657A4C7839D3ADE72986AF396E767430125786E219BC5736F16FEF66B4014E5961CFB4CFEC4CB2A32205A92DBF1399E2710395BA1240D48277C120526CD9E2352F7D04D89CC2754379CE80A2CD1AC765718B8BA61EBB8BC6D0D407022E7AC672065FC8503BF5BC4138520CAE233EA997463D7C9E00BBD852F12EC17C6F1DB1914446AA21E156D210094B699B4117B31EAE6386DC0DE1F55CCEC09AA1EB38CDE4602598D452732C5EF8B07C477E3E2DD470737EAA7357E2E8B74C31A117B519BDCEF79B6B044148A10468E38B5A6B7B10D74C6130A60A268ED73DC9A25ED68AF354758FA3F57ED3558DA654CACA7150A8E4449D0EF640184A7A33D00BA765B01C442E88D9B4257B93904ACE04375679BFD8271A03073E34C4A1C0437C4009A9590CB98D0B5581DC83407F04A22C9B0246DE38E1A13F9B1191493818783950548BE562F940240CDECD4A50C94E406B1BAE04B50A3A19E7923183E3FD356238C45AE6559193E0E846DF0FC6878BE6C963AA8C3508DC31F766A4B29C78D749C89985AB8F580DBDF7993A2261CC4BBE489C3BBB38C46739BD2516D3C64A93F10CF559DB6A0EA3BAFEE8B43F696A5288C66509A57C642BBEAFB40F4CD0649B4CE25B6FB2EF5529B73556051213BB39CC4F1DC8004B1588C8DE836699C66CED567998523AD3AC303D9E13617CE6C1D2FC4C35B22A24504C51F64155F24D91D0E8785B40912B3DCEDEDE71A6933B36BB514FDD1D3D843AAACF2C1E79A5216622C20036C9C999DAC3A5A2D43FAC3B23119927806F497B4048F561A2276FDA0302423147D35579DD4411416F0F59273429AC0464AC49B230E29DC124115D18A045663D228BFDAC9F57B0C5B4 -pk = DFA1BDA5513F4156D00EE88F569BBA05125779A3625ED6E0BE3BA7A17973903981BCC4577D905EBBC55B7A90DC2F650EEACF5A74606DD49E06A6FF08EEC21300834B7160380A07B0571B65AA5859FD70FB7B2F727CFB3B9B0397E0E7AAA07648436B6A4A281ED5ED221D633DF4623092D535481269239AF0975F117FC4E52200 -sk = DFA1BDA5513F4156D00EE88F569BBA05125779A3625ED6E0BE3BA7A17973903981BCC4577D905EBBC55B7A90DC2F650EEACF5A74606DD49E06A6FF08EEC21300834B7160380A07B0571B65AA5859FD70FB7B2F727CFB3B9B0397E0E7AAA07648436B6A4A281ED5ED221D633DF4623092D535481269239AF0975F117FC4E522000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006B099B0A5E7F428D37EEDA26F49D49DFCABC130AA62DAC94A9D68D113D521D45EF418A5A21020BD04B0CE113BCD42D9130FEF46D91B5710F680CC5FFEF49150B82CBF94A097372A060B85D2CD37ADF8DAF542B0ECCA6DEDF90C00000000000000017E9CB99ABD7CC7E644F9A6A0A7FF1A100E9BEA08FC91AA69F50FC730A516AD06FD9AF9DC8465841E83FF3A5E580124652E229285E282804042907F17AEB4825E2046EAD810A15F712CF2819E2467D22FC77DF933C59244DFEAFFFFFFFFFFFFFFC17C4F06FD22FEFEE9E3C89B0D3F906B40E4105C80F0CD6A1803703A1682672F434EEC2FCB58A91431D3437001031932EFB44C82D488D998A2D6FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A9C6E39E1EA0EC5C9DE9B19CA16B2F09FFDBF0FB8D925665F3CFDC7523A3BA3A19165A36A13F61A935FFDCDBBF7E7BFCF1D80CF23712779147500000000000000000000000000000000000000000000000000000000000000000000000000000058D60BDB6BC1C29AD20CEEF0DA48E1EC0D964AD745A79AB5ED8210FF62EFF1744F682B104467482F54BC8F9D159D8C440F9450551617D50B97E2404598F81A00ACD6B5F3CBAE008A8E76F9657AA7793B02C784529FE8A1CB3241EC8EDAC41A9E758C44CC9784B8183B275CDAFDF04722192449B9C8B3913B8CE85288CEE7150056045D3FD7652FB0813976E2801DFDB5FC437D76BD2FCA9D3E1F6BC138D3B0072E7F14B17B8DB808EE1FD9BEC22744E28527361FEA6D3DDB70342D8D751C080086926448C02A37167D0A7F2466D024DFD766BFAA97877F04AA2523AB2EC159F16A657E1CCC99B10E8335C45E9C6915CB7828E0A52EF53A9C25D0324D9E820E00CEAAB96A4C65F98306343794A84FF142F2B39CB3154F3C164D5361CAE1C766B5973B99BB125774ED88726DE112D2AE8E36588E787CAFBEF43DA9228A569B04001C49D700F51CA53A4A401A0230BBA72CF17E7EF87C8A74CF2C42066F9FA0E14E2549BEB655224056E158843E41DFC94E6F412EE0CDDAA5E35EA6F5F19CD321008BA3A5EBEDA0B6824929474A0C3843EA12DF20A932C7F126F24DE06E6095F3BA4448F2521004A06D16FEBD0DFA96586B45A65CE0FDD730F02C5A862C62E513003A7D7E40E502E3475BB58BD644A4E5F3D477C1338DC16EB4637161F14F5B35C608A1E6DC66F489FEB0C1AFF0CEC4404A1AE0571395178E1E9A8ED20C8EB50500B00EE56FE69C899133EE1A5943354712DEBFE67911A5EE6A26631ADCA3565E2F6C7110AACA9E8DFD311AA0FAD413FB104F4262586C18413BC0EC8FEC5D270600CB3CAC1339570605F41A91DBC76FF6BB87026F1BEFE87D4AF1FA83878B3157C9D0DB6EA56AF6C6324E6D0BC1121E2C7D2B9B9F354F31CCC039912A00D68820003C2508C3C27BC9E5BB2C57A6042E2AB94B2DF8F7896A882697DF285EA059FE5C50791187D195B4D9507324F6AEB105E7E5C3A5D254E8FED2E92468D886EF08001020F43C1FE165713B9DBECFD3BB8D9767B79AE9A9D969212BDEF9CCB97E8BD7505B5C1BC08353133683F2EBEA73EA25F107474DF394D5CBA492B8011EC606009CE72A84A33A87E4C4EF1F437B36E52AF1F6F2009B9836E614E0CAC72028000B48C2ADDFA564A86137ACDDB89AD855AC8073BACD1B700ACDD5D73D6C739E01005BB0F9D17E0DDF458C8D3E18D9A13FB94570E9ADD74EC282439892E9F70FC050E39E37E5CB0D93B04919EC2F688474747B74CA96C8C97D9EEDE04E996BA71D00 -smlen = 2414 -sm = 8E5BC83A768BB3B79730F74B3AF79FEC7420017625CBA8824F7F9F9428D1B22701D6AA6132009258C747D068A1942B79BDFE25972073EE0A01A2EE31CD7293F729C1C7CDBBFD080E7F43DC002A66B27320434D3E75691F9AE8349A02622600591E377503C00E13BA075E96AC5A5CA3CE4A00D3017EB845F266EFB859E683374D6E39B4A101C8232FDA6E640230F07F648F6755F61A61AD013B4B4CF4C88B3E3E8EAD2553F0EAED761C9F007A79D511760DFE526ECA33D21A72E2D01F2F00489291CF44B271A5FAF76BE26A11549E5E7C011599C4D5952CF3B2266AAB3C54E49428F2B201242A707E0059496791C9248FD5B624C182E60040393DFB426623BF1215435470A4ADA4BB680000A3344CE904403401A56CC6F23818A6E75C2E323A9CADDBF1A3A09F96E891DB9E0603455EA1ECFCB743516CB172FB09708DA5801E00F398C50C7FE2A7FCF2BDE9F5AD79007F704CEF1C510BC2CAE9B70FD248C656226BD5686D366528F0D0BEFC0A8761EC640CD2DA7979DE5EEBDF6127F29ABB8607F8A3D3BE05BE25AACE7FEF3063DF28E22A522FFF0B6FF6A0C61F79B02A408E8E1C775AB80BE6841E9F8A9D030AE5518E3EA8A4E31E416E087D47919593598FD58122A9E601A57EF02DE183D56921811AE2253628125C24F93C84361C5EC99E7B16962BD96CA190C68F3AA9DD60CE3AA7610589813B4FB77A4688308D9BC72CBE918583E298E03AB95FC500209C14ABEB3A43BAA92DCB11CB523C4D17EB9C6697B56C8B61EDA05BF5789166F839291CFE2997B7DD462EDA69B0615F2AD82AAC0A32F4B30FE8725849C144A9C07799D6CE9D293C25D8302161757B8C8C8D07032D914EA7DAC275919A1DFA0D3348EC07FDC70266975722763EF85EC4AF9E14288C9659907526566BB3F2DD5DAFC0D422568CA3AE52486D3F2C18B667E5622BA7E52C56BF00F82AF2108CB4949A09179544F30758B7FB98C49EA160720991B14E2858D648F0585AD1BB1D08294F029BFE936154E9D328DF2E054004FC5C29070DF9EE50DCD0981D2BFB3AA7D6F637C4CE457C0C66D27E2670107A2B85D1F026BD970EF3FB7E32C60218D5E43A06D9CD26289A937B4FBAD2A831425728F3D0D30C6C602AF4B14411E9B3C7CF0B4D630614A9E03AC30BA2B024D496DA984D08854F1366012C2400A5C8268C2B126DEA5AEBA0DE7C92BE0AF08CA22E02604A753702BDCD642BBFA0CC91BD8375657A957306A76B6F139621481B6F15CB57BEE128954D30F552661F906D8AB42CF260F30F88993BB40C9679385F5C4639888973361216DF3C60C57D9B250F64B7634C94DDA3FD122713FD2405A7B71F476C263A781DCE271E7D0665E45DCB27F7293DE57312396C58C40E268F57ED856F536C8FEB4B0060488DE3C25949D2B7E64207576641B34920D04B46766AA2978D9352C2769D49F8599F3D0439C928532E0EE428A3773FA4D68E6052335C6D93368E321D750D296799FAF87B82C640A6E995D18DDA002887F141DB8ECE2584DA2FDDF848D38357D585CD619B1625A70A5D333561D6DE856ED9908D1E377EF7BE03B326594808BE58F7FB3939E939B73F11DAB3E572DBA41D43A046B8D2BB521728222D5A77DC886AC6F328D9A531118156D791D64F5DF8FF8BE8DCA32EABC3CB259B0F72B021CEB4DB36A6CD2FD149437B251F81F7588AE921456BEF1A79FE83447D80CADDBF20895667CA0E493A4731EEC901E03F66DE284400A5558922AD53D4E0FF7BC6C61640ADE0274C63D94E96BF6C642B790823109F53C3C27130A1EE38D448239187F5009373BE328AF866A9B8DD1BB735E8002296043C6FF641A432709148C707B900ECF46555D77644565D5998C096756F79B6F0E20850B8BF0528E78BF5FB4859BD655227873D289CCE47FEDA8414D09ED7E8D380FC4D580C7F44B01521E829E7B0CB2D2F345C517B65E2D476687EC9A4C160A3AC0B01CBAA588644D799B125910812790F06C1ECB1F1E64D5CCF92AE5E8147C98B0CFAD5626BAB5115844198E8C2AC1DF9A208FCD2D2891F4A29009F5B36D8E31383811A9493CF8E143B5AC8A14D48119CC16D2C6BF6826FC47D4B782FFC76B64401B8249777E32C1298606553DACF386A22809B599924A635796A1AEC3CD8568064852E54C95AD887D7AFE837F6FF676F69EE6288879F6D96193AD94A0418BBBA2EED5355876F2C3497448A5F8F3F83B136703D9A38FBB62784CC233DF448A5E88EB5F81A0BE97A16FD4CABA1D87A4BFB08E002EBA548F662D496A1478BB7C26C69CA4C100AA6872A4945D703CA812BDBA53AC86010AA1D2C53F29E46AD095936FF50DB8805DF4B08C9580AEECE3A6DDD828E7B5D4DABCAF112A6E35AB3C28A6DDC4D98AD1063C2ED72CAA50086E6B72090CC1F2AFEBEC6751F27EF51DD8557E53D928535D82A220F62BA0645E3C2618F3424EA1A339A138C9B8E26B14BC32D1736A4193C0C72CC402C3EAB58817335C1424BD6F38CFE16338611118B4100E4038D07DCA041C72E485C5290F0DDE601565DAE9CDF657A4C7839D3ADE72986AF396E767430125786E219BC5736F16FEF66B4014E5961CFB4CFEC4CB2A32205A92DBF1399E2710395BA1240D48277C120526CD9E2352F7D04D89CC2754379CE80A2CD1AC765718B8BA61EBB8BC6D0D407022E7AC672065FC8503BF5BC4138520CAE233EA997463D7C9E00BBD852F12EC17C6F1DB1914446AA21E156D210094B699B4117B31EAE6386DC0DE1F55CCEC09AA1EB38CDE4602598D452732C5EF8B07C477E3E2DD470737EAA7357E2E8B74C31A117B519BDCEF79B6B044148A10468E38B5A6B7B10D74C6130A60A268ED73DC9A25ED68AF354758FA3F57ED3558DA654CACA7150A8E4449D0EF640184A7A33D00BA765B01C442E88D9B4257B93904ACE04375679BFD8271A03073E34C4A1C0437C4009A9590CB98D0B5581DC83407F04A22C9B0246DE38E1A13F9B1191493818783950548BE562F940240CDECD4A50C94E406B1BAE04B50A3A19E7923183E3FD356238C45AE6559193E0E846DF0FC6878BE6C963AA8C3508DC31F766A4B29C78D749C89985AB8F580DBDF7993A2261CC4BBE489C3BBB38C46739BD2516D3C64A93F10CF559DB6A0EA3BAFEE8B43F696A5288C66509A57C642BBEAFB40F4CD0649B4CE25B6FB2EF5529B73556051213BB39CC4F1DC8004B1588C8DE836699C66CED567998523AD3AC303D9E13617CE6C1D2FC4C35B22A24504C51F64155F24D91D0E8785B40912B3DCEDEDE71A6933B36BB514FDD1D3D843AAACF2C1E79A5216622C20036C9C999DAC3A5A2D43FAC3B23119927806F497B4048F561A2276FDA0302423147D35579DD4411416F0F59273429AC0464AC49B230E29DC124115D18A045663D228BFDAC9F57B0C5B4 - -count = 63 -seed = EAA4FB8EF0290A499A1D92EE398A8D7E71CD3CBF01A36750DA4B7EFF175DA26D17AC4ECE49A84C88D1D2C2493563C26D -mlen = 2112 -msg = 2E086FA0C4582E0C6CCB020F86A6107475985160BED201760D6489CB05B8D21452C81BD5D317F8857703DABA24E968F3164C82A4A9751DD88742B72141734DC0B4A77CBE2AE1C287A396A2F5804519456CF1EAE273A5C6361F52C35EDCE5ED7388D61D01AC040676522C9FD7B02A7DEAFDCB4169867EFB69792210A7069287C5DC958D0953C36F84D9A26989DD3B726BE8B94B41DCBA1B5374123F55A6DBD6360698551C27D16BAAFBB0ECBE116B44F11425DA45D7FE8ABA91697D83B6896A06A7888C97A91406B81B3A5BC8B68A984750893114B4011B9C8BEBA6F5C2D7D9F2C7A27030555633A0F90E30753A04B1958141AF7C1B95BA208DA36F729673D20DA0A83F913BEC8049F8CD032D9F9DD94B2086C61643AB2CFFDDB2B9BE0AF996D642B7A0A31CE0EEC8C61B343ABA980FCDACE9CED7BE4C9048B356D41002EEE0433428846BA4220EFB7F493FF57B0C706282EEE448CF7DA9B17B32D0EB0016983175469AA5BBA53489EC56BA3A92A70FDA2390E3A5D8C038F496E7C3180C6971A39491EAC10D828D44B3DE2BE64569B907005783E62710B9AD8EB8C9AF4B04993D40D1EBF165EFDEC748FE9F6B334DA6A30C568BCBAD095998A47242CA16803FE1720FCAB85233AD76EBDE102A5D93AB98460494BC886BB04C05AE89E157967747F8C050B33CCA52ED5E59050965523EC5C4EAF94CF2F2EE80C35AEEDD14E65D937C92855D03FC76ABAAD57A21A42420819EBB9AEB65F031F9C4BA0AC2EA27289E941DB89669A0620797091AEA3EBFC2AC354E94D27894F444FF9E604C8BDF7D6C00DF0E7FE9827171010445E737D0A5867636E3488EAACCCFCBAC1030C0DFAB639AB45C5AC5435E2C5B8244E58C3A6BAC81EEA408020BFEC66EF55FDDC618083ED737F4DD3BB65474487CADDF3AA2720A6931FC69533B6491DFC7E6E5FABF8103D05F870BFEFDDEFA20822A68A710B517065BD2478CE080E5DEA09EFFBA3A136C1BC9D7D8088F736C363B30E2AF2A6F2395EA8161CB64079340FA642C7763E3BF0623C968A16263CDFDF1B8334E427955E20C1EBCE8C8CB136DA8D002D8A9E5DA3B1F56668C1C59E20DC3BE026A43F40910D3A2B601D9D3EA2BF6D2C2781F976BA840FC986C8AF0DF84B8B0FB291D1310039D6914F8F7CC6B26CC33AF94150253E8EB410344A64344A5A0C06E0F3AA23C68617C6F4659DF79285782C89BEA3091083A069EF8F048371CFA054DE45E32C19A44DB5D435BC8FEF5570B68D80D5BF5DC06DA13C36E3AEA341CA9FE20047AC30683AA9D862306534EC93E79EFF79FE22E3BA15E2BA3F59F7B8B9314DCE31095D3015710C2927B54BA6F46D3981975229EED16C9B17813801C7D3CB3604DE9B7A4F18C2F91B2B50C1F43E87198AFBAC718935DB9CB96D9FE048D969635CB9F4DCA659AB1612A698CE45336B8D9FF5468301BF05D04B3558D66E88DE88427FE87E65D36D3C29FA3FB126F1F294E9BB391EE427001C34126C6622905514CE153682754D7FB1C985AE4DA600AADA1593A0A214332B310620B1B4E95BCBFD6EB8A241CBE848BAB37462224994E0D2F3F4B521DCA4A9A5AB10BEE741C5919907AFD2552D4AA300ADDF67CEC2862420C8D1D8DFFF60FDBE2D4A8D03C92E23BDB3400F5390EE4B141C5843B1E2C07C9AFDBC70E3FC08E2840EBF3B0E5296E1EE44D12E68240FDF063C07BEBF01C08586E8153068C1ADC744A7B54F53B0FEC3C752DA9F6F989A1AFEA4ADF1AD6AE926CABE4E0CB2CD864412DAEE377DE559A38047F31E834A6CE56D4041BA709945F07E514F96D783F32B0EFCC8B889FAF2B6D217246BA7C07B687E028F23D2409BBC12D6EC0D94AD9697BAB6395B7070B6FEB2E907A119209C9B7D86AF953BA7D2EA63982BCD794A5BAC69407BB7CEC5E027833B17420F146AE08F4B753BEF6CA0922F3294CD2A670127F9D2A2CA78A30F62056A425CBB7074C9A55135BD06CE677ABDF33B420F66CFDBE9461BFDF385A97439B3431CD29DECD9B5E59EC3ADAAE879A4E8D5E28CA13E73FCDBA51C828DE271207A5DEAB373B1B6677A29ACB87CBB01F10CD2C090EE66D472E8DB61615A5ECB84A7FF0988DD0DF9831BF43D732A12EC8CD50A86ADD12A5A2EA765744B05F73725AB8704ECCB08BD74517F21054E58903481E7A724F7FF24C43D6CD23DE84CD69C9E464E67003903C3858A6724247EB929716E170E2D2739AAE10B88BC3FB8FFA849E385B4113E78C24DE1673FC7E7285E6E3744F3843AC7BE7EC16BF74215694CE467A2E859DD4FACAB86250FECE28E0A6A31DD529D08566A6389B85C310C28A8DABBCCA9CD6A631EF0473ABFD6846D8326561CC9CB8181C1593D0F15EFB8129AF9E838AF518477CE361640169D9731FC139881D452773F21A3E79E514DDAA513D7B9F3399C0C57D21EAA00D44A7F031B79CAC9FC304E936E75A0CF8D204A6CC3C0FA7D037DD8ACC3A33CF5718061FCD57EBD06A607FE0BB0204E687B2A17B1FF47DA357B51A753076CB89422098D4F880F831842957E648C54ADBFCC0E488A95581E709B5A5A129DA7EC5B00AC9B18B80533F2DD1BD0F475A61DB18FC0C4EA655F602B207B572234230C831B26CECB7BC3284797C4BED5A977C3BFBEAFEA3DBFC4257D4C2C5BB8689830EE157F3B5AA1EAC09CFCE0555880A074AEB86062A8ACE19ACDC1A25F8D0E454F50F119D12E707D103F3C1A502D4E358D563E53554395B5D386AD49363978AFBCA2F8B673A693ACEF70D1DB4CEAA8FA580160924D4F18119BE46C71E09FDEE45EFB14A74DB1C688E99E24CB6025E73A3E7F0F7EA9C485274D2B6CF9784CBE39E388F9CCF1E2E8DBFA6DB43355391A369DEF645F815424253ABD0B6DE9C0A0AF156D9A4EB7474A2E5937F008134DEBC9FC7E54812967FCF5BCE28FB5CD43F1AA240BA2E9CEDD6F350D556DB1658868091E6034D7E1EE5C6645D0A345D46C42E23C6821C360F5ACD13F589 -pk = 3E9DB72094094B0307C38E733621BFA7D8DF20644ECEC2EB86C89385239DDE53C8B3E274AC9D3170B8288B47F313A4F0C28002027DB26B6487CBE8E9BADD1E00E276E59CA9E38C609E337F83A3994731190D0650B5E459E7A5F98439A48E68275CE6B2C377514983B339F4C02294122DFFCDE469404ED9A1270DC1D328791000 -sk = 3E9DB72094094B0307C38E733621BFA7D8DF20644ECEC2EB86C89385239DDE53C8B3E274AC9D3170B8288B47F313A4F0C28002027DB26B6487CBE8E9BADD1E00E276E59CA9E38C609E337F83A3994731190D0650B5E459E7A5F98439A48E68275CE6B2C377514983B339F4C02294122DFFCDE469404ED9A1270DC1D3287910000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072B6A0ADFAC74FE36D82AD406D89159CCAD3EF3CA9E342776BFF471670E5AF591BC73B9A356DF819AEFD63D52D0C0A7DA3B42872E9E0AE64F8DAD746983601BDBF9F47CF635AA175079029096A8EA2682F4E85C559F05EDCF107000000000000000938AB314178242B12EF17543BA45FE2B9B30EC80879A3EA4A0CE54B8E34718F12877BE6AB918DBA931BB918002513B7AA2E238563AC13C0161BB1C2550B4A0FB2E6D9241C29CCD2C36EB61CF1F8E0EDD284D3158092C2A813FBFFFFFFFFFFFFFF47C5153A2E0A5511CE780852795A352607D412F7C0D2E1F4CB963D6D07B264364D9DBC4E6F3A3813BBCC29C55EC92E3D9FD559C4C12D5ED809A1FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AF77D6C6A6C77A0513F0AAA4651049F67FC8D771B38D8D474CD09397FE01A360C0C589043CB2597F65DDD28DA978FE70C9311ED7FFD25DF411002000000000000000000000000000000000000000000000000000000000000000000000000000057A11344528E44F1413C08F565CE60AA52384EFE00E3B074F94FAB7DDF2098AB8E7F5DC2A2E9B825410BF19F8CE19A252CAF663AF0B74A0406A048B53D8F0E006EDD789340115468F48310025155902DC402D7E2E207F72209A5B575D699CAC8530D52174183AF4EB26252DAE8F5018A8673921898FB8CE5B63A7F5B6EE50900DD31553C177E507A48A3DF2DAF2A54FA6F07D762D7832DF040BD46C9081B0E643FEFFEF0B005289862B551E2A2D34AE6D39E192FD38648C759D0BAFA436F1D004A8459ECE5EB71C78B00C1ADA5FDA56D21EB9FD0EF833D6A801CAD9535DB7E7696FAA26CBFE4B257E726DC22E1379DDDF81CF1EE42ADAB77A43ABEE6914E0100C0183EAB8D9AB49034AEEE7C7B12E11EB248BA5CB129512E2A8E2A2F2BF13903CC3E4121BB0C2AEB9345D46BF1A973516AB9EE6F3F00827A89ED84641598170062925519DF2D629A1CD0C9BDBA7E937C76F8EA37233A0D28A9231CFB5CFEC482FA71C7D00B49127E4A4153DC13BB85E65324E8BDA036E3064968B1C34C660000AAACD79FA270F9C25A2C44E49CCED6E86156659FF570F4EE6B0FA50B97A5B60950B77FB57538494C9742D278F4FCDA681E3FAF94285C04E1F71B72929AEA1100A31E394BC458D337C8B379B44F47A009D1D6D4E65D08673AA1C4C43D0122B79A46C4E4637F24DDEB0E9857B39CB454B1302AF660A6861AA3C3285D079324210077B8F49CF217751B58A768468C8DAF109E28461055469D923DDDF7596E7AE671C1F3CF0826008AC6629D1D1D1188BDA09AF42D098E65007BB32E1ECD31381600AEA38820AD10385B1EA3B76E938F71C2D7CD469FEC9C3BA6AAA5A9B3A47E81E0081686D227A829CF9CF24BB411CD37366C29622E567A39B45D90E00FEF1F0E00EB9606F58FFD8E88C77A8DA91C3B07E1A89000E674ACC10D688CB870306C2E8EE010A0A5537224EF6CAA96E74FB60411D9E9853D4A48EB753CCB1A4031ED0D00E4F01796E71C3AACE861660E144EE6BE6A8B410710AFDDC5661A68B8BC8AB22A8F4CA9DAED742D86BB86A8363E85ED542A2589110301EEA6F7DD8328CD11180083D468F86AF90E56A909D73A5532913108A7D5552DE9B55328301738910281D0C1EBD65FE579E83C6C1AA06E4C79274CC21955855FAAD9B6FBFF98ACB8621C00DE80FD743653DA928D426F439641862F000376F81E1E31C2DBB0C1D5E0ED410B72B4C20CA83D379F73819E6D19DA594C600E1A0E0CB206D54B326169C5EC0C00 -smlen = 2447 -sm = DB59FEB80FAAE0F0971EB39B0976C725DF1200C15B9B0E94D789913B397F7828A9EB46509601C1733334A3F9497409251EC7584A419E47C1011285AEEA622752F756ECF1D5A8724B1CA3A501893C4EDFC66E7A9307EA74DA11DB786C04EC0067E24D3858CC3AA376F1FF24B77BC207A46C00C1C1DE0FE3E6858C223CDCAD554241424D4C008F6985907CA8A5B73C07CA6B39D6CDDE2F770081FD04AFAE260A98D19090A9D566423A54F4015173FEB786660C615BEB3809A31CA492377F01BEE6ECDA019649B5E05AFC18A724CA567B3800E4A8B527D244C1893453B4F01E10266609A10072CAB8C0DFA3FDC47209C808E3146D5624D300F8606106ADF2E89BBAA3A2797C91531BB18700017D85B80D1D88A53C5AAD14ECD830AC6C85D4742E8D8CEB9971C72EEE3A8888340202143AC1F4176A7D88C47DE2B8CD74F4A8501B0182BC710BC382D71DCDA71DA459CD002E086FA0C4582E0C6CCB020F86A6107475985160BED201760D6489CB05B8D21452C81BD5D317F8857703DABA24E968F3164C82A4A9751DD88742B72141734DC0B4A77CBE2AE1C287A396A2F5804519456CF1EAE273A5C6361F52C35EDCE5ED7388D61D01AC040676522C9FD7B02A7DEAFDCB4169867EFB69792210A7069287C5DC958D0953C36F84D9A26989DD3B726BE8B94B41DCBA1B5374123F55A6DBD6360698551C27D16BAAFBB0ECBE116B44F11425DA45D7FE8ABA91697D83B6896A06A7888C97A91406B81B3A5BC8B68A984750893114B4011B9C8BEBA6F5C2D7D9F2C7A27030555633A0F90E30753A04B1958141AF7C1B95BA208DA36F729673D20DA0A83F913BEC8049F8CD032D9F9DD94B2086C61643AB2CFFDDB2B9BE0AF996D642B7A0A31CE0EEC8C61B343ABA980FCDACE9CED7BE4C9048B356D41002EEE0433428846BA4220EFB7F493FF57B0C706282EEE448CF7DA9B17B32D0EB0016983175469AA5BBA53489EC56BA3A92A70FDA2390E3A5D8C038F496E7C3180C6971A39491EAC10D828D44B3DE2BE64569B907005783E62710B9AD8EB8C9AF4B04993D40D1EBF165EFDEC748FE9F6B334DA6A30C568BCBAD095998A47242CA16803FE1720FCAB85233AD76EBDE102A5D93AB98460494BC886BB04C05AE89E157967747F8C050B33CCA52ED5E59050965523EC5C4EAF94CF2F2EE80C35AEEDD14E65D937C92855D03FC76ABAAD57A21A42420819EBB9AEB65F031F9C4BA0AC2EA27289E941DB89669A0620797091AEA3EBFC2AC354E94D27894F444FF9E604C8BDF7D6C00DF0E7FE9827171010445E737D0A5867636E3488EAACCCFCBAC1030C0DFAB639AB45C5AC5435E2C5B8244E58C3A6BAC81EEA408020BFEC66EF55FDDC618083ED737F4DD3BB65474487CADDF3AA2720A6931FC69533B6491DFC7E6E5FABF8103D05F870BFEFDDEFA20822A68A710B517065BD2478CE080E5DEA09EFFBA3A136C1BC9D7D8088F736C363B30E2AF2A6F2395EA8161CB64079340FA642C7763E3BF0623C968A16263CDFDF1B8334E427955E20C1EBCE8C8CB136DA8D002D8A9E5DA3B1F56668C1C59E20DC3BE026A43F40910D3A2B601D9D3EA2BF6D2C2781F976BA840FC986C8AF0DF84B8B0FB291D1310039D6914F8F7CC6B26CC33AF94150253E8EB410344A64344A5A0C06E0F3AA23C68617C6F4659DF79285782C89BEA3091083A069EF8F048371CFA054DE45E32C19A44DB5D435BC8FEF5570B68D80D5BF5DC06DA13C36E3AEA341CA9FE20047AC30683AA9D862306534EC93E79EFF79FE22E3BA15E2BA3F59F7B8B9314DCE31095D3015710C2927B54BA6F46D3981975229EED16C9B17813801C7D3CB3604DE9B7A4F18C2F91B2B50C1F43E87198AFBAC718935DB9CB96D9FE048D969635CB9F4DCA659AB1612A698CE45336B8D9FF5468301BF05D04B3558D66E88DE88427FE87E65D36D3C29FA3FB126F1F294E9BB391EE427001C34126C6622905514CE153682754D7FB1C985AE4DA600AADA1593A0A214332B310620B1B4E95BCBFD6EB8A241CBE848BAB37462224994E0D2F3F4B521DCA4A9A5AB10BEE741C5919907AFD2552D4AA300ADDF67CEC2862420C8D1D8DFFF60FDBE2D4A8D03C92E23BDB3400F5390EE4B141C5843B1E2C07C9AFDBC70E3FC08E2840EBF3B0E5296E1EE44D12E68240FDF063C07BEBF01C08586E8153068C1ADC744A7B54F53B0FEC3C752DA9F6F989A1AFEA4ADF1AD6AE926CABE4E0CB2CD864412DAEE377DE559A38047F31E834A6CE56D4041BA709945F07E514F96D783F32B0EFCC8B889FAF2B6D217246BA7C07B687E028F23D2409BBC12D6EC0D94AD9697BAB6395B7070B6FEB2E907A119209C9B7D86AF953BA7D2EA63982BCD794A5BAC69407BB7CEC5E027833B17420F146AE08F4B753BEF6CA0922F3294CD2A670127F9D2A2CA78A30F62056A425CBB7074C9A55135BD06CE677ABDF33B420F66CFDBE9461BFDF385A97439B3431CD29DECD9B5E59EC3ADAAE879A4E8D5E28CA13E73FCDBA51C828DE271207A5DEAB373B1B6677A29ACB87CBB01F10CD2C090EE66D472E8DB61615A5ECB84A7FF0988DD0DF9831BF43D732A12EC8CD50A86ADD12A5A2EA765744B05F73725AB8704ECCB08BD74517F21054E58903481E7A724F7FF24C43D6CD23DE84CD69C9E464E67003903C3858A6724247EB929716E170E2D2739AAE10B88BC3FB8FFA849E385B4113E78C24DE1673FC7E7285E6E3744F3843AC7BE7EC16BF74215694CE467A2E859DD4FACAB86250FECE28E0A6A31DD529D08566A6389B85C310C28A8DABBCCA9CD6A631EF0473ABFD6846D8326561CC9CB8181C1593D0F15EFB8129AF9E838AF518477CE361640169D9731FC139881D452773F21A3E79E514DDAA513D7B9F3399C0C57D21EAA00D44A7F031B79CAC9FC304E936E75A0CF8D204A6CC3C0FA7D037DD8ACC3A33CF5718061FCD57EBD06A607FE0BB0204E687B2A17B1FF47DA357B51A753076CB89422098D4F880F831842957E648C54ADBFCC0E488A95581E709B5A5A129DA7EC5B00AC9B18B80533F2DD1BD0F475A61DB18FC0C4EA655F602B207B572234230C831B26CECB7BC3284797C4BED5A977C3BFBEAFEA3DBFC4257D4C2C5BB8689830EE157F3B5AA1EAC09CFCE0555880A074AEB86062A8ACE19ACDC1A25F8D0E454F50F119D12E707D103F3C1A502D4E358D563E53554395B5D386AD49363978AFBCA2F8B673A693ACEF70D1DB4CEAA8FA580160924D4F18119BE46C71E09FDEE45EFB14A74DB1C688E99E24CB6025E73A3E7F0F7EA9C485274D2B6CF9784CBE39E388F9CCF1E2E8DBFA6DB43355391A369DEF645F815424253ABD0B6DE9C0A0AF156D9A4EB7474A2E5937F008134DEBC9FC7E54812967FCF5BCE28FB5CD43F1AA240BA2E9CEDD6F350D556DB1658868091E6034D7E1EE5C6645D0A345D46C42E23C6821C360F5ACD13F589 - -count = 64 -seed = 5909111F333F3E939105DFF8532548927EBF289F31A72F4C1B0C66816D8B68F64622F36A9BC85E63601BEE8EE7CB3DC5 -mlen = 2145 -msg = 5180B7DE9A84F651DA10D334009B3D65582F3912D329FBAD4AE39A9EEC78943338C29DB4F49EF41E3C50DABBB530E99113440383F20D5A3A8AE279A6201A0C84B003F6717C709C21AE893B6E412D87F8E0CEE5A89E60A14CE975A4D42E4F43F4710FC9FA29E9B2AFA93441EF5570123AA88AFF009E2507A3E60A79CDA25652E3AC3AC0C10A816BC04739B6FC758FF9AC467879BB67F270E4EAB43F10A633E5932B8D6DCF23814DE8643407B17B5E2A91B340F7BF6882DB694DE4DEE4C480CE037B9F9A220ACDCE84B03746F307A6026531D712C0630E7DE3ADD3A8516BA602D2463E3478008B3252B658FEA54DE41265B5C81E4E913EA0E2A63309497ABF961EC40AC374ADC0FF3C6FAE9BFAC5CC2DF475885B0BC636702828489183CDE1A2934F2D63828AD1F2B8CFAFFA53151B0FFAE6224DF54C2AC47CC8844B76222C2A3B6E132071150049B6E46AA75DEA28C13477980315FB64CE500BF0C6F633AE621D65B331BA96CFAC162DD7897B8505257E228CB621BBA9176A7AFB3A2CC20D7804DDB3AAE4B87FFAFD3C8DC541D05624DB02BD62491067EC1CDF73147014FEBCFA5B561756D5E7A13B88D1E7B2C0375E1D0DE71ED20CA9CC4E6DACDC579F1AB024AAE2A0BEC9004E5DD81C046F00A2A4CB767C4EB240D205278CB863D1A61DEF16635C6A84C2406288410FA4B73B21077D8F7A4075A1DDCA3D0D334725151E434BDA80D3E73593338B07958D27337E32CDE0010DFE5E58B99EB27A97DBD1C5E6F9A552A02726AAD5A4AA63EDC336D83E5870DBD514193367AF2274804628B4EEDFDA3B2A155694E89F5A6798C5D6E036159C1F00D8DFB03D41940E775974B11C3FE4456E07B127CCB44E6FD6B2918F57A6523D7F77F32478D9F1BB539846793D4284E2907830E5EA76054802A266C85B122A389EAF4700629036716E2869C0FC9440856D562711E903A1853BC68582A95344B612E5CBC7C5B2AEE23CCE4161A75829B2048742FBD65ABFE2397CC7D66023DE34DF4F2DF8540CCE9781ED6482D29CA4E906716C8CC9596B158EB51BAB8C2E00253D6589A99B3D20FB494834B42BBFFB80E7B0441E356B541F83877736985F6330EA459C007CE8BF18D84E78E36482D581DC7DF97528CE15F68E604B4DE62422B3AA76F3E7E5B33A49CBA9D89FCF50DEB65EE45173795393A50FD4C60CF6BECBA7E733513537D13F89FCF1C4D6437DE0EAE608FB11D68B9ADC0C3A19A3565F6D62BA81A326EC334B239B212B87320C03A75C58DC8F828C4195ED9D7ACDDCE493123E235D098E9DC60F5D3A625E1FF66F245E9977F9630A40D26E3AFB6676F5122A88CE5507BD825757D9CCD53FE574FD0E6E728DA355403AD664FFDEAAF636256FADC3283D6F15B297F79216833CF2C745C4C5E17D03260A69178F2216168BF8F00C9889E1E35540254F150C587A884CDFC9E5F7D379BE474356C06943E416EB0697A1AE989AB4872D0BDF436D9FFAAFEC1631C9939FCECB84DB2846F12CA395F506687B4A5638085BC6EF58FE8E2ABE9F8D51F272EE855E2DB84A89D348DD66950B8F43939DB897C519FA302594FD1FBD6B6E94CA8FF63A7949432DC2D35C60803A570B1DAC95EE0A60C62FD18B3319601AD29A156400D392DC9A14FF50AF6752C1F6EDC2ACB7ECCA71097B6E82227DE429F1A29C5E38ABEA1C74DE06E6788CB1790AE9F0E8AB35AFE60B001F45971D42949263AA62519B0D630281A4C5788D5591B1EF5A003C58987E8665701E5B1C6063F93533094E96820F918C354903775CEB6675C4CE9CF940C4BEB8845B4F5E1F642BF505821E5A23122E2D1ADB82A63AD18CD1E4775A96CA9EF9493D75FF784A2D4A99F54DC3F87828BDFF4B3A3D98FA5A29B62A85CAAFFBACE4592A81BFAA5B8BAE6606AD25A92A43140690A6003AA2D617FC707A53EC9D868E33596E098773942D798263F58FE5A1B23046CFA136EA35203B90BEA2C5F0AAEB5EA8C24B8B8CBA14CDEE28F45D0278F193228484BCC7E08A75D0064D605D674ACA9019A0A9AAECD6AC672CB8410FEE4192E6DCA7855FBB1C584CF288BACB40707D7E6F8BA2956F6D099F52BC7B0AD72B5A3FFC03C7B47086330244EA5D393C6B9F256FD82D5CB9436A469ACC3F8FC237146895BE148749F82D39B7BA4CE47715BB393A96AB471665529AB9E9958B12396C1BA7529DBF289184FF0F635C2BA9DF301036C869D52D993463222B70BA778E81C8DC668DE41C0356EEF5C39F1BD42398BFF30F959E115C6B386E73F0FE28A2665BD463C781DA1C46D6D4EA284B152C8C12426DC9CC467809BFDA6FBFBC0BB4793BABBF6AD564D57AE9F5E2B7F651D6ED980F8B1174A126CC58B23C32BA73F5031B3FCABFE7BC360AAE412D799CC14D8B252D9F9EC9005B7FCA04A88CC8AE9F7AEFCA94137003D5764FAA3C7C45670585C84F74C4EBD1F5AD1F97EA093595592FB90E3CAB01F98F06E114F13DE67CDC36F3FFB01C3D51EA643C25A3F6AA2C57690E42B98583D925AC7B06A349782A1D33C06BD05A82A7AA3DD679326D948D74A1861926B45DB78D36070D3087AA9C5F4F42CA57EE9CE7035BD88A85CE1107C8E07E5BA3A62ECF012BC75FBF97C4C72331B55AB9A6EFFD78869F1CD3F330526F262F7DFCFA2B084B61E90772D5FCE8F038C0F72554467192CC8A27F1F53C8714DA1864815974B00991F466648478C5F9BF036DC4083D72E8D144AB10FD32408DA7677729347FEBC79E48E7B87388D9B59AEFC84B5B3B589FD91863811A6436ED76B43E657F7EE03EB796285A4D93BE9AAAD1E1A1E81687E42EC83F3DD059B78BB7F8EC70E6C831DB5E90C6B3AA511F36507DBC8E7A77DF0F5B9EF03BFEFE9471DE7C7FBE67B9922260D3703D95A5BFCBCB62D830E20C23C6CFDDC210E47CB575957D8C3514A2ED4561C738928F210057896EAEB1499D4DDC70F44E30661E780AAF5C0A20C8553F40D7D3FF6D120511C1073510D04F2DE544121AB851E98F666906367C21302EEFB1AAA723F6A531C454EEA0BE7D50 -pk = 7742A9641E22F7A1361F5C7BA840DF31B741ECFED23A5FED2F184AA8F6EA73FD2CCC5D2D6A9E420F5814C4F6E5685927D28564ECF2A99B36706BD0E9122215000D1734C426C484017D354A1FC7AF26BCE7240E8E99E32368217CF2C625688D246F18C548DD50413575BE930DD40549AADEC3DFC0DE6280664038A1B5427B1300 -sk = 7742A9641E22F7A1361F5C7BA840DF31B741ECFED23A5FED2F184AA8F6EA73FD2CCC5D2D6A9E420F5814C4F6E5685927D28564ECF2A99B36706BD0E9122215000D1734C426C484017D354A1FC7AF26BCE7240E8E99E32368217CF2C625688D246F18C548DD50413575BE930DD40549AADEC3DFC0DE6280664038A1B5427B13000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001505311D5ADB5ADC4F39949A2C8B8E5934DDCBEEA7F30F5332E19D2C097682637726FD2E3B65F76435C50F65BC40465596064BD9029AEFAF5653B968799F73FE8FE3B32910DF10DAD0FEC5573CC219E2643A3EEFB63DE1F731500000000000000040BE5EDC075FABFD1D37C99F2E747798D04AC946D5592E2DF573DB17AB11725DCF830A1B6BD7AD3DB370AA7103432B3F6653E8441B1FC14794991D4B875F22E1A7FC1BF33E7187F653E2799A53E1A46B4C7DE5766B65D5D94F7FFFFFFFFFFFFFF98FE03A0BD52CA1FDC6B90B555D33ED6D27558704CE37195D44A69199B2EABD3F5555A481995F653A6511F6FE36E012CFDD485A57ED7D00F06A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37CFCA1B1B1826D256A99A5D0AB31AE22FCD7B1BE38FBA31DA3E5C6A413FB7DD444F1966F5DDF4D80CA12F6BC8E298C153821448BEF4F219210D0100000000000000000000000000000000000000000000000000000000000000000000000000000A67F34F7B9261CA5C61DA1EA8E7E6642C2CC71112EDD75393478A4ED4B1551B532192FA0738B6D03E6B446EFC3B9EF6086AD0A988950D929CAD265AF92804009395A5A7BDDFF10C34C955FDBAFC03F6675975C726ECF625E97F03960B398A76A4C0882EE7490FC3CED567A43A25EC7E7A4A60CDA7CE3E3F9744F4880D501C0034089248F20C45DB831267682BD7CFA59A920DF1BAEF7DD61BA4A675B8AB83A64EDA36D09EB9701D53960A3E72AFA3B4C161C697B4340DDD6F25EA694A37180066E812843E28769B156407024A5C09A84280CC2B0636A51E8BBC21F52D6F43425135CDFB69256F7F6587A97A33CFDF82839FB458186BE06A57A4FA9426CC0D00815DE5737F06E6A9EC0D7825C1811292345F25C83C7E0DBF84915D285788D51211D302806CC0E99819B02CA364B00E3A910D42AC4F3AFA4D6E8C91AEFB8F23003A0627AB92FEFAA4E4A96EC5426EDA05F2E6B738BD7AC7E3D35CBB80F941512B74519FBEE3E79FB16EEDD6B3F5A8FE52E6C18B2DD8745C6E95075C2534180B0056246599E97E04F0C0985A9F95C440BCB45077A19D9C63729C4E716D44FD755EB2CBC4130F9758A0785908E3E1118BFA05F05B9C9687DBFA769ABEA85A980200DD9D273EA458788C1A57F57B23EC91ECAD229A2202C1B928F6047A11ADF31E0C75503DFD08EEA6CF5D7FCCF70FB6265B1C059034F1C6EE896F181020D8220D00D0DF1EFEED7BBED24A243DB05BA6957CBA83664935DD3A4539CF348941324CA938178D71E8103609EBF640B0F891B4E4B2133BAC1E1AD60D5D4928E9D2A81100A82CB0676FF3437B03B485BA0EFE82F4E4A7BDC4F98A59BAA18B9019F1F51F7FBEFC0C67642D8D32911360B8B3CC7208BCBDECACB69F12D8A0273F98AAD71F008B5D3111BD94F57781AB852EC8294EFD1D62D151B1329F007AFB1E3943B057D7449195C5054B431DEEE20589CF9BC3F18043B345FA8D8FA8A994561426B122009F898A2383A7A6DF0AEBCB379BE3EDE71F70C8F2A6620B5D455E16EBE82E2FC11DD41D42065ECD6811DF5A6D9EB1CEFC65772E0952C8F2EE594ACA24BF5D0C002BC9724114D2AD634BB93C3E2A4B5E456BE1269C561CCEE944A78C7295CAAC841A0B7A4CE0E55D123A4A18B678929C89EC739D06A0A52E238A214103C54805007B2229ACD7D9ACD5661D3747538F524257916A515C0B19415EFDFB2670A61889ECD47C6337FAA954A5FF237FE57BC9F4340B74E56B262E8EB1B8C400F29D0400 -smlen = 2480 -sm = EB757C3B5C9714E670C0E499C8E3483A58BA00695BF829E179EA326870721C291290418A14019D9955A6434A6B65720E524753FBFC39468700649EBE523F0FEDDE31CA1BFDAD61610199E600A7785CC79F03D1E2D08BD109A82D0DEB16FD002B37E3E016D03C68FFEA6C88BFA630AB2EE300946A9BB23610C0BE6F739A04B72DE45CEFCC01F7D74C18B7F693CD039D2E48C869F44AA2950114890C804135ECB2348533A6A8ABEE34D9CD01D85D04CF9807B5322FAD1C88B8283C2DFFFD0114E19C75D5516330145ED72D32E86A7B7881005B3EBC4A8C83E086A073F10D6528DCB5F34A014CC0ABF6FADD0BC897EF3331AC7683E071EE01D8CECEE88F732E99A23F90C273DE2E0F400800011779C08BAA609379BB4B6DEABAA008B887A3570EF8904C554EF24CF9355F696C0103E566ABE17FBA677D01C77913614CB685E5E00143AC279E883E4F126ECD28E7DE0A045180B7DE9A84F651DA10D334009B3D65582F3912D329FBAD4AE39A9EEC78943338C29DB4F49EF41E3C50DABBB530E99113440383F20D5A3A8AE279A6201A0C84B003F6717C709C21AE893B6E412D87F8E0CEE5A89E60A14CE975A4D42E4F43F4710FC9FA29E9B2AFA93441EF5570123AA88AFF009E2507A3E60A79CDA25652E3AC3AC0C10A816BC04739B6FC758FF9AC467879BB67F270E4EAB43F10A633E5932B8D6DCF23814DE8643407B17B5E2A91B340F7BF6882DB694DE4DEE4C480CE037B9F9A220ACDCE84B03746F307A6026531D712C0630E7DE3ADD3A8516BA602D2463E3478008B3252B658FEA54DE41265B5C81E4E913EA0E2A63309497ABF961EC40AC374ADC0FF3C6FAE9BFAC5CC2DF475885B0BC636702828489183CDE1A2934F2D63828AD1F2B8CFAFFA53151B0FFAE6224DF54C2AC47CC8844B76222C2A3B6E132071150049B6E46AA75DEA28C13477980315FB64CE500BF0C6F633AE621D65B331BA96CFAC162DD7897B8505257E228CB621BBA9176A7AFB3A2CC20D7804DDB3AAE4B87FFAFD3C8DC541D05624DB02BD62491067EC1CDF73147014FEBCFA5B561756D5E7A13B88D1E7B2C0375E1D0DE71ED20CA9CC4E6DACDC579F1AB024AAE2A0BEC9004E5DD81C046F00A2A4CB767C4EB240D205278CB863D1A61DEF16635C6A84C2406288410FA4B73B21077D8F7A4075A1DDCA3D0D334725151E434BDA80D3E73593338B07958D27337E32CDE0010DFE5E58B99EB27A97DBD1C5E6F9A552A02726AAD5A4AA63EDC336D83E5870DBD514193367AF2274804628B4EEDFDA3B2A155694E89F5A6798C5D6E036159C1F00D8DFB03D41940E775974B11C3FE4456E07B127CCB44E6FD6B2918F57A6523D7F77F32478D9F1BB539846793D4284E2907830E5EA76054802A266C85B122A389EAF4700629036716E2869C0FC9440856D562711E903A1853BC68582A95344B612E5CBC7C5B2AEE23CCE4161A75829B2048742FBD65ABFE2397CC7D66023DE34DF4F2DF8540CCE9781ED6482D29CA4E906716C8CC9596B158EB51BAB8C2E00253D6589A99B3D20FB494834B42BBFFB80E7B0441E356B541F83877736985F6330EA459C007CE8BF18D84E78E36482D581DC7DF97528CE15F68E604B4DE62422B3AA76F3E7E5B33A49CBA9D89FCF50DEB65EE45173795393A50FD4C60CF6BECBA7E733513537D13F89FCF1C4D6437DE0EAE608FB11D68B9ADC0C3A19A3565F6D62BA81A326EC334B239B212B87320C03A75C58DC8F828C4195ED9D7ACDDCE493123E235D098E9DC60F5D3A625E1FF66F245E9977F9630A40D26E3AFB6676F5122A88CE5507BD825757D9CCD53FE574FD0E6E728DA355403AD664FFDEAAF636256FADC3283D6F15B297F79216833CF2C745C4C5E17D03260A69178F2216168BF8F00C9889E1E35540254F150C587A884CDFC9E5F7D379BE474356C06943E416EB0697A1AE989AB4872D0BDF436D9FFAAFEC1631C9939FCECB84DB2846F12CA395F506687B4A5638085BC6EF58FE8E2ABE9F8D51F272EE855E2DB84A89D348DD66950B8F43939DB897C519FA302594FD1FBD6B6E94CA8FF63A7949432DC2D35C60803A570B1DAC95EE0A60C62FD18B3319601AD29A156400D392DC9A14FF50AF6752C1F6EDC2ACB7ECCA71097B6E82227DE429F1A29C5E38ABEA1C74DE06E6788CB1790AE9F0E8AB35AFE60B001F45971D42949263AA62519B0D630281A4C5788D5591B1EF5A003C58987E8665701E5B1C6063F93533094E96820F918C354903775CEB6675C4CE9CF940C4BEB8845B4F5E1F642BF505821E5A23122E2D1ADB82A63AD18CD1E4775A96CA9EF9493D75FF784A2D4A99F54DC3F87828BDFF4B3A3D98FA5A29B62A85CAAFFBACE4592A81BFAA5B8BAE6606AD25A92A43140690A6003AA2D617FC707A53EC9D868E33596E098773942D798263F58FE5A1B23046CFA136EA35203B90BEA2C5F0AAEB5EA8C24B8B8CBA14CDEE28F45D0278F193228484BCC7E08A75D0064D605D674ACA9019A0A9AAECD6AC672CB8410FEE4192E6DCA7855FBB1C584CF288BACB40707D7E6F8BA2956F6D099F52BC7B0AD72B5A3FFC03C7B47086330244EA5D393C6B9F256FD82D5CB9436A469ACC3F8FC237146895BE148749F82D39B7BA4CE47715BB393A96AB471665529AB9E9958B12396C1BA7529DBF289184FF0F635C2BA9DF301036C869D52D993463222B70BA778E81C8DC668DE41C0356EEF5C39F1BD42398BFF30F959E115C6B386E73F0FE28A2665BD463C781DA1C46D6D4EA284B152C8C12426DC9CC467809BFDA6FBFBC0BB4793BABBF6AD564D57AE9F5E2B7F651D6ED980F8B1174A126CC58B23C32BA73F5031B3FCABFE7BC360AAE412D799CC14D8B252D9F9EC9005B7FCA04A88CC8AE9F7AEFCA94137003D5764FAA3C7C45670585C84F74C4EBD1F5AD1F97EA093595592FB90E3CAB01F98F06E114F13DE67CDC36F3FFB01C3D51EA643C25A3F6AA2C57690E42B98583D925AC7B06A349782A1D33C06BD05A82A7AA3DD679326D948D74A1861926B45DB78D36070D3087AA9C5F4F42CA57EE9CE7035BD88A85CE1107C8E07E5BA3A62ECF012BC75FBF97C4C72331B55AB9A6EFFD78869F1CD3F330526F262F7DFCFA2B084B61E90772D5FCE8F038C0F72554467192CC8A27F1F53C8714DA1864815974B00991F466648478C5F9BF036DC4083D72E8D144AB10FD32408DA7677729347FEBC79E48E7B87388D9B59AEFC84B5B3B589FD91863811A6436ED76B43E657F7EE03EB796285A4D93BE9AAAD1E1A1E81687E42EC83F3DD059B78BB7F8EC70E6C831DB5E90C6B3AA511F36507DBC8E7A77DF0F5B9EF03BFEFE9471DE7C7FBE67B9922260D3703D95A5BFCBCB62D830E20C23C6CFDDC210E47CB575957D8C3514A2ED4561C738928F210057896EAEB1499D4DDC70F44E30661E780AAF5C0A20C8553F40D7D3FF6D120511C1073510D04F2DE544121AB851E98F666906367C21302EEFB1AAA723F6A531C454EEA0BE7D50 - -count = 65 -seed = 238461A224ABEECCF709AB6CACF4EDD372D45E5F4274095273A49AFE614F2BF713134ABF68B4DD058E6D7B612C3658C3 -mlen = 2178 -msg = 99B5B6FECDB52897A1958C5C3D1FC2F20B7D045F551856EA3CB441BAD9089C64CB9489DB6B63E0655AFC4C2FA73C7417FF1B80B9C7A1D659687D2C415B3A909CA30E96849D4BCEC6A9A6A4311204936BA972086B2394D86E840770D01550CAA6AD85ADC0EC851D2B3808E4A0E9830B99A70F6204ED4DBCB6759F6228126039607AD7ED8EAFEEA28D1C3E25A46BC18AF7E01F55FAD8244F15DE36F890416AA09548554338972C5F88FD9357792819E51A63D0B872B0A4D21EA3597405B52793D50C6CD70B52841D53484BCD3EAD004CEF0A6BC16CE74CB8AD0848000D8C5158DC16625112D1D85D17A3C1C8BBDAEA42C3A43E9930724655592116C4C6D0B8B223337EE4E754541A09D898F7FED71C3785B7F8721653986C525BC00F15590616437D11F9722824DFDE7E9615F1FB8488E5327E4D8BAF5F79D1FF5E808D154951AD87638910607B03FAAC3A61FE9916BA65FFD16986DEB4169BD24A72B1C8168FE569F3C81F93F3EBDD21D4E806F79FB28550912E9AFFFB52E97860C4DC0D042C56E1BB71C28B68E416874EC7043306A29BD1F4B9A3E612A6778315E2C2B850D6EAB9FF1905030FADA250CAF308735393C191134F3C493D00B5695775D82ADB9F2ABDAD17FC41FBD7A1DEFE337C2F8ADF69154CC0862FBD43035295B1A9C80B88FA8CF75B36CA08868F881966B41FB3E239EB1DB9CB51606A0A9EBCD552B2F4E819E2C30ABDECCDDE88D2D2F82F3585B5143943C929591D20CEF559CD2BAF2DC7FE03C9E4E084E8890FCE64A4AA9F13D5EB945AD7E3CC53E01FCDC192B97ADC1F98D9E773A0177E8D97405808EBF48BF17B689BFC15F4C515E38A855A9266230C9085ADC9A6DDAED93D80C3F38BC516695D202B4E89DA5B4EBC43788C848F8C4A72F79F37F857EDC105F13E4ECECFD09302711BC1993F5308B8F32AB96FB8EC3F5EA0531DAFD0AB3451F81F47E62C593C8D3E3BEEE79DB06909576BF876145856F5F716CAA436C98EAB28C5B85BC2E4D7E1653ECBB8BB6B5BD6981DC72D7F63BA06CAC8197ECCDC72C1481DB44724A3C21F7FC60661F11FDDE8122DA5D0B1D72A29952618B373423A892875E6AD24D0916109ED8E9A9A8D9A68ACEC4BB5EEB0D00EAEA72D8D5A76C2A42F18CBDB3D336B71C70AC73D39D7EB04533453779A1F210BB4FC056B4728AFDFCF46675C6AC76F750626D642E3AB117E5D6740154759A46C27D51306587650E1039054B876849882E7DFD807BD03E69021E337DD69D9B097722C6D2AEB517D773D2F7D84D69DABE1A1D6422EA1766C0FE7B8DD4D7283F2985D96D91A132B8BA03AD85F7D56095773222D0AFDC5A192D29F3BB0C2539A1C99DB4E711B6ACE3FEBD58E45E99C9F5A04CECBB309D50397F28C48BB9CC9F9CF75A52253B634EC47216A1FD6358AF26501821864569879BE1736B0AD242AB5B8ED16A7EA0989ED4CAE3567AFE1F8209A028DB46DB0270B3BC06668A9BF5E1BC1061BABBA00EC4EC37280379139D19BC6072CC6B7D260A816CB82F9BC90897BE3025475AF12191690F9F400A914789A860155EFD2D606A15895378C827F2A4FF700303962FD96DB2DCD2D213EEBB2460F0B753BC6902DA81D44C983DD027F1171D40A2039997241E09AE5B6165B4D55A8E4C79671A8B8BDEFEF2C21F81C541A5719DEB939F866B61BE250AF371CEA7B7525094C904698D412737F7781BD779365F122EE627D9CD4A68DA9D5BE1B0431998AACF824CDD864C7365C01CD5A5F480B6AC1E5FEAD8FFE40D87C1F9FCE81867157242285C5E76CF9667919C29A67CA0C0A61D7819D9EE6B792250A358F5691CCD80578F15288F3D5D6D7DD6DFA351FCF8DF0223F7D1DA1B76711FBE0E7FABD30377660ACE7B23ACF03ABC1D973248CDD0897773FB74E20481EBD3E52657C9296B980905AD29271EC128513284F1B78F38634BF84CB80791A0C5649177791CDAB87769D57B626F78A03435C758A207F52BD2A1F31E34B6A122B8701CD9FE478C57CF3535B6D51EB46CAF794BD69363D5A56ADDE6945E9788F1E1DFD045BFBD0A68834B13D6B9EC4EA9C860EEA0E9AC19C2DE14FFBD6B57E5992B08943EA0283813F3F15E4F928B8D0F13DE6863990F5C77F130C97D8BE12571EDCEC7DEEC4B6EF4835F136DA45DA70A11F9192478FD8B4846C507410FD11668365B05252E68CB2C972ACF50156E369B83BB85E62E4BD4D84C2E9FF41A5844D5D88AAAE7DED852DAA0AE5C14A5DCE64C7E236E9B7B60F5B5AD4D953A2D842A52929491BE3555AB8DF534CAD56DBBB86B28A8A86B7BD9AD1C58C87B8A089324E00FDE32F8186B2B74523A22904C18ADE02C3E965F94624F8DF57E750EA6335E3EBA705294B76CD6ADA33D90FEC1F48DE7BA9DC7D8D60A53D2563964188874810C45736C57EFBC3A3CEEE7238AEE5281882A554F2143BDF89ED4BD819C08239C187C12A8B6E763434B92C26FDD658B350F51775C60CBAB7A2CB120DB8CE8AE9AAF6AF559F8CADE84C4820209CBD27CC09230B22F013A0E4CF8041E4A789A5D20BE9914A624AB957318848ADDB39C9748C8922C54327048A2E46523BFB22487538363459035BA49858F85A469957DF1F4831BB7FFA0564C53233B99B596F5356089949306DEDD6B904433D25C4854A80590B964DF6B0703B4F9628D6B9A4D3F0A4096E9A0B46D6B32F66D563BAF688ADD18DE001DA62E33C503A4387CE0920BA5D1E8B69C38E3745B19F8D8B6CA5E1AC6DE90EDB25FC32DF04F0849D769FBED3F8169EA1D2252619A2304E055370B4443CD23E56D4934F9F3FC92F1C1EEC626657E6A89C1394E56061AF8ECE3E2A17FBAAA4D579A99A7998632A6AE2683DDFFFFD27A27C8815511855F09ADFF7BC627A7A5C95FE57FA3EF81F494FA7EA6E6CA2D14775A25BEAF1B5A3E35ECD4A306545D597E4E44301C3D1648F0A7D841F2F76FE59C6EAFA3F5B58907FC4E642ECD28D16A71EE3D295F1DE12DE1485B9CEBEB2CC6C9AC051D3D42B6A1A068533A7680A98D015B09C5B819FFC61688D441C1B7FD71180C4423E64EE940917C7DFAA19F3F51CB5B38D1B2B7C81D10E7C -pk = B5B0B37334064C65FBBD052EBA2A12ECE07E396154F1FB7405D9CC13E463152DB2B58D51BC992D7829AAB97A48EAC4E45660463E16625822119996A600460D006A190E7CA063AAF1B4172300A88E16A18FAAB587BDC1C51A12DE3690CAC846A6C4ED863533BDA2F1C943AD47F7E20C8D3E33FEB0697F30CE30A124B192612200 -sk = B5B0B37334064C65FBBD052EBA2A12ECE07E396154F1FB7405D9CC13E463152DB2B58D51BC992D7829AAB97A48EAC4E45660463E16625822119996A600460D006A190E7CA063AAF1B4172300A88E16A18FAAB587BDC1C51A12DE3690CAC846A6C4ED863533BDA2F1C943AD47F7E20C8D3E33FEB0697F30CE30A124B192612200020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002AEDFE37D72BB9133C277ECA4BFE80A5CFC4DFBF9419E813E7990C90B6D315BE414E22DEDD399506516541581BC8289F588D2D3974B8A3E2F2E6C1ACC92673D0528E7EC78C23083E3C15634C0BA1C57BB0D240BB63D38D6AA204000000000000007516A4FCA4D6C8427D069F16EBBCC5AC2F1ED405EE1799B80C94908848BA67111A2D94A43C041415ABD0699719D737A73B824F2A862D2DD287115FDB2B64AB3864A883F07839F4CE622D392DEEDE96B21A6E58A84E4A831349F1FFFFFFFFFFFFFFF580FB19CD49A750620DFF6A716D4529FC8A3C39D6809369BD0C714664B469C3550FEB4B3B07A843CB0DCF40B63FCEF5D6EA55AB680688C75B79FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1BA08D746C4B657FB526D8A1E79A91144168E6AF2BC7AC5861C9234001E82276CF430CA68A417CDFB9D36C08941DC3A6EC9DA761BD043CB43F030000000000000000000000000000000000000000000000000000000000000000000000000000989010D674A616C2FD92CDB646F70BA065891DC57A83D1E1516D533E90A12495BC6E1ABE2F8AB6222E68406E5ED0477BB8169DC8AF3A00C2E43EFD169F9F0900B3EA6FF9DA35B614DA9AECEF21C55671BA7BB0749FC90B37BEB836A70958B5254F722E58017C5132597361CF5EBD65399E4C125B5B450094CBC7475A22A10300EAADF57F845BD285B9A02B0DA7879E79861742CBEBE393169C9FCAD3113F4F7394D40C0073FB26E875B7E572197A137BB6B51B0FEDDE972BD90F21A9EEC307009AED30BCB84DC2AAAB0BA8BCE878A210AD9A7BD82A3DFBCD4548B1AA2D5C9F5256033D3AEE24FA1B522238D4D3B44B61DF56B87A75D30A19EB407BB6B7D60200251864BAFF945D3CC46914D84CEF81AF725B34A358CFBB79D5025C208704AE0DB6FF4F70B43C9B4D4E576CBBF042C9F18571A52247091F88B868EB2876D10800844FEDA7A661803190A24887ACF0D88E2B4E6D3B855E5A7F1064F5763C05CFA6F612FE1CA792AFF90C3F7D1030A69CEA0F991187757F0E10B7B1B64ED6771A001F22EEB88595C2C2DD2CC438C4D4A12775E978CB66AEF4DAD9AE6F6CE455F47BDE9DA8F93A5AB2FA03F03F79D3D245E8E11CB12436D3F2E88AAFC4113A091B00C05CF3CA3CD57D9C1AE8B2861660A2EE802B41F4A30AB2554D386D1B7DCAB407464439F6A41A4BDA1AAE7E313DA070E115AA8EA4ADEB1F30108658631CB70400942CFCA844E72E1DEB51C508EFCB5126532E92ECF2D67A2058F04AABBC33AAA9FA3E34D3BABBA2B7A1181BC7DFEB1BC5C742A1C7A9A2EFD46DE50AC4BBA709009D02666A4A2929239529AC9F2F24A3D9F0043E899E26E524030A19C6067D3718B579739E343625A8CF88492B308D291F3ECDA56BB5AAECC2C5B7DF703D741E0092B3C6D20C201151FFB69A6E72437EAE6B4B8DB63FFB28EC71D8C9D965B59F8B6486167D6D2F15BD32847B8930592C448670163B4456C4B8E0C1CB657EEB11002DC0046705DE15092C0AA92FF8BD2418AEC61946272F374E0FC5F511A79D7E60CA1062CE2E63AD9F1E6F401C46CD89EE642DB20B0FD68B906419979CB08B0D00CC74078C10380CB60B364F2B6E6E287CE42DF1CF04FD7FA689A2D9F225122251EA1AB56351AAA8948204B8549E6BC98E0D03A7E97298E46CBA73C7B268D71100ABAFB8EB07F90D9D10B244A065697C5D6058C7CD07793B0CAA9FCE8EAD529525452D79117A2234E0796B92338D0260912E7448C6D6BE26B320C804E779BE0200 -smlen = 2513 -sm = CC63E139B8F993726EEAF2CE7789EDEC7D53001F47C7E098BAEB8B15BCC353D2042F391CE80005C50F1A5A8F1F8B56C3F124001EEAA82722013E04A117AB188C5191195722EEA8B0301CC401D1308EE4CB1FFDD8A91C2E15AC5FDA31898800A9E2D6278DDE627EC07EDCC9D5D5B6A58BCE017BDFE48D89FF383B3EB662AAB14106CB0A2A01AB906C1011E21DC24D3F4CD6672D0B4AD013001AC9898D28234CA8144CA37D61FE00C757E900297050934DEC685CABE59A62E1BDDC7D88E201D366CA4608B18690C0C6DD1930FFB9FF139A0091888FE756BF2F83C86811A8BC5B80BA2C27003D2410A0934D97597D3353151374E6F203150121ADD298AD078021176ED918FA8191FB2D9C0101579F63054E2CC813D9AFC4E6257D5DE7E4D408817017B0AC8045D92A4ADE51360103469BED5FC5E31E7A4F2C0B7C17E70D6925F001CF097119BD976C59686BA24FE1290099B5B6FECDB52897A1958C5C3D1FC2F20B7D045F551856EA3CB441BAD9089C64CB9489DB6B63E0655AFC4C2FA73C7417FF1B80B9C7A1D659687D2C415B3A909CA30E96849D4BCEC6A9A6A4311204936BA972086B2394D86E840770D01550CAA6AD85ADC0EC851D2B3808E4A0E9830B99A70F6204ED4DBCB6759F6228126039607AD7ED8EAFEEA28D1C3E25A46BC18AF7E01F55FAD8244F15DE36F890416AA09548554338972C5F88FD9357792819E51A63D0B872B0A4D21EA3597405B52793D50C6CD70B52841D53484BCD3EAD004CEF0A6BC16CE74CB8AD0848000D8C5158DC16625112D1D85D17A3C1C8BBDAEA42C3A43E9930724655592116C4C6D0B8B223337EE4E754541A09D898F7FED71C3785B7F8721653986C525BC00F15590616437D11F9722824DFDE7E9615F1FB8488E5327E4D8BAF5F79D1FF5E808D154951AD87638910607B03FAAC3A61FE9916BA65FFD16986DEB4169BD24A72B1C8168FE569F3C81F93F3EBDD21D4E806F79FB28550912E9AFFFB52E97860C4DC0D042C56E1BB71C28B68E416874EC7043306A29BD1F4B9A3E612A6778315E2C2B850D6EAB9FF1905030FADA250CAF308735393C191134F3C493D00B5695775D82ADB9F2ABDAD17FC41FBD7A1DEFE337C2F8ADF69154CC0862FBD43035295B1A9C80B88FA8CF75B36CA08868F881966B41FB3E239EB1DB9CB51606A0A9EBCD552B2F4E819E2C30ABDECCDDE88D2D2F82F3585B5143943C929591D20CEF559CD2BAF2DC7FE03C9E4E084E8890FCE64A4AA9F13D5EB945AD7E3CC53E01FCDC192B97ADC1F98D9E773A0177E8D97405808EBF48BF17B689BFC15F4C515E38A855A9266230C9085ADC9A6DDAED93D80C3F38BC516695D202B4E89DA5B4EBC43788C848F8C4A72F79F37F857EDC105F13E4ECECFD09302711BC1993F5308B8F32AB96FB8EC3F5EA0531DAFD0AB3451F81F47E62C593C8D3E3BEEE79DB06909576BF876145856F5F716CAA436C98EAB28C5B85BC2E4D7E1653ECBB8BB6B5BD6981DC72D7F63BA06CAC8197ECCDC72C1481DB44724A3C21F7FC60661F11FDDE8122DA5D0B1D72A29952618B373423A892875E6AD24D0916109ED8E9A9A8D9A68ACEC4BB5EEB0D00EAEA72D8D5A76C2A42F18CBDB3D336B71C70AC73D39D7EB04533453779A1F210BB4FC056B4728AFDFCF46675C6AC76F750626D642E3AB117E5D6740154759A46C27D51306587650E1039054B876849882E7DFD807BD03E69021E337DD69D9B097722C6D2AEB517D773D2F7D84D69DABE1A1D6422EA1766C0FE7B8DD4D7283F2985D96D91A132B8BA03AD85F7D56095773222D0AFDC5A192D29F3BB0C2539A1C99DB4E711B6ACE3FEBD58E45E99C9F5A04CECBB309D50397F28C48BB9CC9F9CF75A52253B634EC47216A1FD6358AF26501821864569879BE1736B0AD242AB5B8ED16A7EA0989ED4CAE3567AFE1F8209A028DB46DB0270B3BC06668A9BF5E1BC1061BABBA00EC4EC37280379139D19BC6072CC6B7D260A816CB82F9BC90897BE3025475AF12191690F9F400A914789A860155EFD2D606A15895378C827F2A4FF700303962FD96DB2DCD2D213EEBB2460F0B753BC6902DA81D44C983DD027F1171D40A2039997241E09AE5B6165B4D55A8E4C79671A8B8BDEFEF2C21F81C541A5719DEB939F866B61BE250AF371CEA7B7525094C904698D412737F7781BD779365F122EE627D9CD4A68DA9D5BE1B0431998AACF824CDD864C7365C01CD5A5F480B6AC1E5FEAD8FFE40D87C1F9FCE81867157242285C5E76CF9667919C29A67CA0C0A61D7819D9EE6B792250A358F5691CCD80578F15288F3D5D6D7DD6DFA351FCF8DF0223F7D1DA1B76711FBE0E7FABD30377660ACE7B23ACF03ABC1D973248CDD0897773FB74E20481EBD3E52657C9296B980905AD29271EC128513284F1B78F38634BF84CB80791A0C5649177791CDAB87769D57B626F78A03435C758A207F52BD2A1F31E34B6A122B8701CD9FE478C57CF3535B6D51EB46CAF794BD69363D5A56ADDE6945E9788F1E1DFD045BFBD0A68834B13D6B9EC4EA9C860EEA0E9AC19C2DE14FFBD6B57E5992B08943EA0283813F3F15E4F928B8D0F13DE6863990F5C77F130C97D8BE12571EDCEC7DEEC4B6EF4835F136DA45DA70A11F9192478FD8B4846C507410FD11668365B05252E68CB2C972ACF50156E369B83BB85E62E4BD4D84C2E9FF41A5844D5D88AAAE7DED852DAA0AE5C14A5DCE64C7E236E9B7B60F5B5AD4D953A2D842A52929491BE3555AB8DF534CAD56DBBB86B28A8A86B7BD9AD1C58C87B8A089324E00FDE32F8186B2B74523A22904C18ADE02C3E965F94624F8DF57E750EA6335E3EBA705294B76CD6ADA33D90FEC1F48DE7BA9DC7D8D60A53D2563964188874810C45736C57EFBC3A3CEEE7238AEE5281882A554F2143BDF89ED4BD819C08239C187C12A8B6E763434B92C26FDD658B350F51775C60CBAB7A2CB120DB8CE8AE9AAF6AF559F8CADE84C4820209CBD27CC09230B22F013A0E4CF8041E4A789A5D20BE9914A624AB957318848ADDB39C9748C8922C54327048A2E46523BFB22487538363459035BA49858F85A469957DF1F4831BB7FFA0564C53233B99B596F5356089949306DEDD6B904433D25C4854A80590B964DF6B0703B4F9628D6B9A4D3F0A4096E9A0B46D6B32F66D563BAF688ADD18DE001DA62E33C503A4387CE0920BA5D1E8B69C38E3745B19F8D8B6CA5E1AC6DE90EDB25FC32DF04F0849D769FBED3F8169EA1D2252619A2304E055370B4443CD23E56D4934F9F3FC92F1C1EEC626657E6A89C1394E56061AF8ECE3E2A17FBAAA4D579A99A7998632A6AE2683DDFFFFD27A27C8815511855F09ADFF7BC627A7A5C95FE57FA3EF81F494FA7EA6E6CA2D14775A25BEAF1B5A3E35ECD4A306545D597E4E44301C3D1648F0A7D841F2F76FE59C6EAFA3F5B58907FC4E642ECD28D16A71EE3D295F1DE12DE1485B9CEBEB2CC6C9AC051D3D42B6A1A068533A7680A98D015B09C5B819FFC61688D441C1B7FD71180C4423E64EE940917C7DFAA19F3F51CB5B38D1B2B7C81D10E7C - -count = 66 -seed = 83C653708FAF3E5F6FBC9DFBE6FB5E83E572A7688645D75D2C4835B28695DEA4BD7093740D0FF43237354EAD1C978BC2 -mlen = 2211 -msg = E3B57B208352A820F622A694B7C3F6F297239EF0A069615DC664C02F1822BBA48E11E37BD9749C98FACEFFFB0FE1792A386BE10CA7B98CC874C68C36F5096D3718DC93E0734D6D6F913E3B958DC1FD1424818C9437B0FD59728ED46A79FB52C737A1D1D26F04EBAC279A7FF6A971E2B69576B712D9224EA18FB9BF4E613A8935F3B36A073B01F37BDC0B77981C8F2804E93C395419352B85C8A32DD77D41DA9BF3ECB914173E80DD1FC06E8FF5BF0E4F7424849A15EB7FAF7DE77456EBB64D10DC10FEC6254070C7DF387397137372EA3A53DFDA7DA13414AF2DF16C1E38C5C70A5F5F44F725D622049256BB15DC04A8D846A1A0DAE7E765A7F00C498F1D0B2893B8405BE4A43FB7E97881069A49134A2A847184B82EB5A690D87BAF2F579619EE19A3D7A7C7EEA72D6E3FCCF0A8092BB8D3C6B551F27E63E762A30B4A4DF2DBC4D119139AE1B135D06FF827846901577700935E0011B65461C2EF9A7B71EEA33C8CA4519C7BCFB557C5E1D42D9243F2DC34057F5E0CCB9A457FC34DCB10D9B47F6EC3B9550D3AE4FD593DFA3E28C6CCA1FF1EBC9D98DA8DB869F8C80BDBF8AD4684ACB6A779CA9D0A106F26DA17043773862681C5DD2DEB1BCA2CA48D4FBB4BB7C1F765DCA3A1D991D890B9A8751CEAFF543997FAE5B128AB2EF22B3BE94499DFD9D8E78FB4C82CA8D296B0415E84CA8B5F2024455B5DECC8B4CCDC7BC4EE06B4F0C66E6748FBD07E3A3BC5B4B6889C40DC4A97AE3EB43C3914DEF976EFE3BFD84A093BD69102D7B37C89B458A55B98A1974A13A7685D26E9D816C79585BCFC1042C2AF88534A9FE8B0A6C8C44355A6D606F902DB40D5490264BF0F352C27355633CB095268D5B8BEC985A62D84B2323FE814053F05DEDC22029D2998BD0BCB255C162C4BC03F60E3580AC3AE86C37850110E9A1BCBD75F64A0DD60B941E2F57DA9D72498B3EA8324EEA53DA3895585ED2942B9140F260895DC6A1131A4C3AD2B64028BB8C0FD67E1BE4C07F808B47DAEF306FD9578025F9C639660075837B2C95473F7F860D6EA2C53F4BA677A2345CF212C7757BB94F1A4F76D4E96625F6FE051B8246D1B7611BF6FE325FFFF8514D2F9A3453F0E77AE8B958AB5B567E541F156C6F4D315B4C3C547D59BBD0D7403E2E6A49B9E7D3FDBA338ADA41875CEB03830A846A1FB266C0F1228AAD2B76A2E3404278DBE482907206FA66487AD2C999867F870C8CB7A70B83437E14B9E893BF6B391DAD75E84588E882246D161799ADEA63ADF1AD706C0A3B76BAE595D84B21AE9DA30BBC0856987F2C2C543D977747B8CBD5A613B92804ECC5284ED23650E9DAFB4B76D63F069710897334F18EA6B0CBF99CD590A78E3B050E1BB24C86D6323A17106F0CAE3F30B01E4EB3DB1B5F3A4771A880C8AC06BCD5A82D4103D0452FD7B54834C1CF8595DD77F82D4AD9EBC1CFD0C9A8CC787E10AA4D1688474208B69FF7AD4DA6986E5F62A34AC3093E0FB1EFE8AE3A96F6AAE09B0E8F6E7A2B65C7387999CECCA43CC33F026DC19BBFD867C48127CFF579D1D71AFF0C4A0E20F9FDFD599A6169DF1B85F6051E02290DF6F5EDE4F29BB6F0C8F806D6850C6534ECDDCCD75BB8E4A097C70445585740F822E5CEBB0E19EAC82BB78EBDE2CA60A810AC6C54119FD6427DA8A0155EF48653515A919B299A306FD3C62B505A6911DB2B56CA2F296E487BA02C546ECA2783ADE8E46A8C78EB1F3D7C04BB24548F92383E475CE6E572D8DE1BFA9B3E35D9BD6C79547B592C95693750010A3D22CBB31AA5A4ABE94897831B1ED9287631F006A735C36BC84A8C87497EEA4873801A733F35B328C7D2CCBE4A41C193D22F972571BA7630B33080793498CC85E6EEA1C412914459DA175A6DB8658D0BD7A823FAB286EDC20C785C40BFD539924A24AF4E3D37BD781353677C76D4672098F5BDD17017012571D9AFDA05A40AB56998E40F5E359C43DFE32CA10A45BF08F67D128C24B1ACC03CBAC46BA6CA5A532C105E91E0C77ED59FB534AEECD68735A4978177BB5A656B9F83B202BB604D61A24574C16656E512C0A4CC6F597B3268573E10539D1BA775ED83BB680BB9115011C6AD43FBB66FB37C467249060A1586DF27B2CEFA65265CCB9051E468000CCAE24F08BA941A8180A64BB624F146C8EC562363B32C369F62997C4B1375DD7DE64725A598529244273CAF8398913C6FC01522683CF1F9F965C491ABE7A554F0019514ED98D75EB8BB8565F77C195F629F98163494B4AA2674F92A41DCB67EDD1D818A5B98993D0B1198BB6BEDABBB486BC6FDE039433E842BAC568A5B4EACC028CC2544B57D8883848DDDEE2E967EA85A6102BD0ABDDA41C3D78447BEE1D4949449ABAA9B3377E8CEDCF04A500FD1A6916E26983E64B5E96FEF87B32A060444D374409262453CB1376C349A8B5D1767B1E2991A1A6044E0F58831BD11F12159675D215D7EAA74807C995FE22017E30482DB8A4B09CA7800822C75C92FF649FC0728F5A1D44EFE7D0FF147274152D5F2F60342C8F5F951D8C95F83C1D54613A182D9DCA68F54FD55047F1F90CFECC04D733DFA82CFF2618F29A4DB4F7E1E59DEAD58CA65D07CC90C25F804A895D6A82F9375451CC55506D276FBF783F7D4D53B9BFB83DBE4A8771AFE21AC543983D68034BADC980F9434527F9EDAA2E228646FDF75B44899E749CF4C9E5B345222385A4424382603AD6EFC24C56E769028F4394F2F6220A9B390D395E412498E57A08BAD927B8BD5D76E18E8FEB457FCBD3248D218236B07783E57FBFA03C292A9F5719E6AEF2EEA3FAB2CAEED5442E89BFFB236CB13DB2CF9C35A38C338C377C475DAF45F8EA822F9AAAC13425FBD43D3DD9229367F0B3687D7E82AC5EC2FC7CDB69C99A4EB1B8E45465C6A53F16AC0C4E0C970B8C732AF515C09EAF25596F64A04AE4621037B8841FD2B1BBCB310EA23E122B0B9AB96D8F7702952D0E96E4CF79C2A30DF0091ACDA91479EE2979B0054997C48F6A0E909BC52A943459AF25553969EB31CE7685369A7FB014561B4697B8BCE220983136E5EB2303CCA4EADD4C6CC74EA2FE69D448AE6ED953A80363DDED5591B27A1EA956DF081CE99AA59DFC789D9D8FAE952B0737099D467D -pk = EB6B6BE1CC87DB911C39D3228F174E79A90EB90FAA01E07F4834018333996CAFD947ACBF55296A7756E906C86E3CC50ECEAD262EF93F4E76EC002A2DF627180032E3E6F81A2B8F54A49533D3D0011BC2369E358A8911B97222C9C426BCC53F47DB576A3D9574FC9E4330DE1D98DC654C76506DA4024C02B7F9A59B96F4590000 -sk = EB6B6BE1CC87DB911C39D3228F174E79A90EB90FAA01E07F4834018333996CAFD947ACBF55296A7756E906C86E3CC50ECEAD262EF93F4E76EC002A2DF627180032E3E6F81A2B8F54A49533D3D0011BC2369E358A8911B97222C9C426BCC53F47DB576A3D9574FC9E4330DE1D98DC654C76506DA4024C02B7F9A59B96F459000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BDC6F3705EE5597FC779C014C7CD7BBADF0C96E9780D40A1AA558A77BEB8259D38E925062EA1FFED5F424B45743F87010FB9496AB2C01C9314C24536A4425F82C613D5A6A3D6C3E70A559522A4CF5AE1AE0FCC5ED3A86E36AE0300000000000000D8CE7D34E94A21A36B325ADD14DAE869DE5725E257B8FAEC758E236480B709F051DEDE2FD47E3B93E68F0A880801EE3FA859D6DC0567F9AA106D3FA4093D3DD502FA70F7A48F3AD0D12680C229947243A49BE923CD5484497EEEFFFFFFFFFFFFFFE88F1E179D9A3407272FE00F97113491329A974C3A8D89DEA2690932EF6E953AD5E7DA21BD9A3B305220E91636A95877C4ECBCCD66E564BE43DCFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDB87D95AA822AE117D940D4AB333E1F29B515FB8CB0A90C9C4D5329E7D6F7075A1E72A0D2DDBCFB6B4DDAA367EC543A9D5E45C42D00D24B021F030000000000000000000000000000000000000000000000000000000000000000000000000000578E738AFFE481CF95FD0EF7A5EB34E3AA825CFA804BDE3D69370AC3245D567281FACFA4CACC06378253BEED857EE0D4F5C6746503A88AEA267567827BAE190040088A14B3C157BBDCBAE0285D5E3DAF351EAE31AD5794BD635D0C18F7EFEA5C091237E0286FB34800133507E894F09E94D1A7C2BCA6F67EBF2C9255418C240075EC27F0C8092F98B0150EBB25CAC1A4B0E660C0DBB47CF1071D4E2880CCFE4F765012654851FD3D1FF93EACD5BBD3FE38F1D13769491631BB48B3BE25560D002393A2FDAFC6C7CDAC0D0D8CDE95F72176DC5EC11EC2CACC0CD0C744BA33111E92EF23F942F4DDA7DC9DB298D6457CE4F5D6DFE3568407D0DFF0AC94DE0F1A008D7954DE04068311CEAA95E3E95214F4AA22190B595787647118BA63262CD93E0AE04A35476E962B4EDCA15A86FA43BDB312D911FEAA546D1936BB5A3A0C2200B3A9F140695511B04E25D69DD2520B1E79AF8021EEA7CA82FCA147ABCBE1474E170F89A5322B0B85F6366C3E663144BA639331C58C29379549E330D2975B23001DBA842BC6A611826BCA1E0F45C8CB1A2DDE9C02B9202EDE46FCDEBC9FD3FBAC19DC1200B24E9A5423A1F1AEAEA502B868EF117EAC47F08066C9C2ED2B562200C55B0506E4762970F3EAE7ED01E7A17AB05C17CAFEC62D2E6C75DCF695E443837DD1A23400D462664A299D1294CBB3890735B45D2DE915ADF6B64714064D110056947CAD29A508351962B49CEC00A6B37BA51AAF6997C3B43A1C85EDC7790691ED936FA6FB673B7B17B139109D594A3ED2A06A68D0FD0D22A11235D387E4120083A1ADF53EFD85A160032B86C3BDFB4100FEC9F90877B75B9FBB2C290A8486DF2730824D9EF6E2E3098A6E6CCB7ACE91FB2B482FEB9E839B489C6349E5BC0600A8D124360F29BF390D3443A797C6DC533AD97D32E7B3EA978D699B43AA7F7A1D6553053F81672E55427BD391254F3F4FE2D63F1A2288093AF4B193B4BEE60D0055402B73F85998EFEE99AAAE8C70013C864DE343B464D5844D9973B12BC18A9044F31B118FCD7FD6C26CE67B2E964CDA22571A3DC2FE30C9A27DD292F8F00B00FD0C7B78DB15E13E334BEF521AB8B4D59241C06FE93591015B99FF5660B30FDD0336F89626A2BCD5FE610590E4798D013A0F2C38024561AF8F3231CD043A14007E5436D6F2C2589BFBBF73B6943F6928D7C2ACF392A4747A3E30E873F76C973935EE2B14DE594DD92BB71A9D96329770C45D565368A9369FCC04E7C2D4C81E00 -smlen = 2546 -sm = 5A00C501E0C97A173036F63CEEC76B439CDA00366DC67BECBF49F8AFB026305590CCB8B28900FD8C004C68031C338402119D558A8B241DE301B54B265E04892E9B8C23C50DD9DB44CB5FE601BF2814F4FAE35A7D61C6E15D3E45FA06A3A4013A191934C53670F982198582B7A7437EF54200CD98E94DC287CE55EA6A459FF3F2AF3771620063E2EC415CECE89A2EA0E5ACD939369D95EC0019CE602252223C986EF11419CAA45B192CEB0116A43A7DEAC7350AE8BF58F6F246A312108C01D7142A202B8AECB9FFBE55D0038B4D988B0701D120E361D677EA892B33C587063841F07ECE00C24899AAA9155EF3D1A1A35B8412A7E94C9201915E8C16852A51311D2D1F1D51F5B76F32C60100CD49441F41D14961DA9DE1CF187A628F83F354C6B90BC07ADBD9ABC0EC60D8ED0400E277EE224FFDF6C7D9FA4F843AF17709148C0182019E5B10B8EAC011792E89A66103E3B57B208352A820F622A694B7C3F6F297239EF0A069615DC664C02F1822BBA48E11E37BD9749C98FACEFFFB0FE1792A386BE10CA7B98CC874C68C36F5096D3718DC93E0734D6D6F913E3B958DC1FD1424818C9437B0FD59728ED46A79FB52C737A1D1D26F04EBAC279A7FF6A971E2B69576B712D9224EA18FB9BF4E613A8935F3B36A073B01F37BDC0B77981C8F2804E93C395419352B85C8A32DD77D41DA9BF3ECB914173E80DD1FC06E8FF5BF0E4F7424849A15EB7FAF7DE77456EBB64D10DC10FEC6254070C7DF387397137372EA3A53DFDA7DA13414AF2DF16C1E38C5C70A5F5F44F725D622049256BB15DC04A8D846A1A0DAE7E765A7F00C498F1D0B2893B8405BE4A43FB7E97881069A49134A2A847184B82EB5A690D87BAF2F579619EE19A3D7A7C7EEA72D6E3FCCF0A8092BB8D3C6B551F27E63E762A30B4A4DF2DBC4D119139AE1B135D06FF827846901577700935E0011B65461C2EF9A7B71EEA33C8CA4519C7BCFB557C5E1D42D9243F2DC34057F5E0CCB9A457FC34DCB10D9B47F6EC3B9550D3AE4FD593DFA3E28C6CCA1FF1EBC9D98DA8DB869F8C80BDBF8AD4684ACB6A779CA9D0A106F26DA17043773862681C5DD2DEB1BCA2CA48D4FBB4BB7C1F765DCA3A1D991D890B9A8751CEAFF543997FAE5B128AB2EF22B3BE94499DFD9D8E78FB4C82CA8D296B0415E84CA8B5F2024455B5DECC8B4CCDC7BC4EE06B4F0C66E6748FBD07E3A3BC5B4B6889C40DC4A97AE3EB43C3914DEF976EFE3BFD84A093BD69102D7B37C89B458A55B98A1974A13A7685D26E9D816C79585BCFC1042C2AF88534A9FE8B0A6C8C44355A6D606F902DB40D5490264BF0F352C27355633CB095268D5B8BEC985A62D84B2323FE814053F05DEDC22029D2998BD0BCB255C162C4BC03F60E3580AC3AE86C37850110E9A1BCBD75F64A0DD60B941E2F57DA9D72498B3EA8324EEA53DA3895585ED2942B9140F260895DC6A1131A4C3AD2B64028BB8C0FD67E1BE4C07F808B47DAEF306FD9578025F9C639660075837B2C95473F7F860D6EA2C53F4BA677A2345CF212C7757BB94F1A4F76D4E96625F6FE051B8246D1B7611BF6FE325FFFF8514D2F9A3453F0E77AE8B958AB5B567E541F156C6F4D315B4C3C547D59BBD0D7403E2E6A49B9E7D3FDBA338ADA41875CEB03830A846A1FB266C0F1228AAD2B76A2E3404278DBE482907206FA66487AD2C999867F870C8CB7A70B83437E14B9E893BF6B391DAD75E84588E882246D161799ADEA63ADF1AD706C0A3B76BAE595D84B21AE9DA30BBC0856987F2C2C543D977747B8CBD5A613B92804ECC5284ED23650E9DAFB4B76D63F069710897334F18EA6B0CBF99CD590A78E3B050E1BB24C86D6323A17106F0CAE3F30B01E4EB3DB1B5F3A4771A880C8AC06BCD5A82D4103D0452FD7B54834C1CF8595DD77F82D4AD9EBC1CFD0C9A8CC787E10AA4D1688474208B69FF7AD4DA6986E5F62A34AC3093E0FB1EFE8AE3A96F6AAE09B0E8F6E7A2B65C7387999CECCA43CC33F026DC19BBFD867C48127CFF579D1D71AFF0C4A0E20F9FDFD599A6169DF1B85F6051E02290DF6F5EDE4F29BB6F0C8F806D6850C6534ECDDCCD75BB8E4A097C70445585740F822E5CEBB0E19EAC82BB78EBDE2CA60A810AC6C54119FD6427DA8A0155EF48653515A919B299A306FD3C62B505A6911DB2B56CA2F296E487BA02C546ECA2783ADE8E46A8C78EB1F3D7C04BB24548F92383E475CE6E572D8DE1BFA9B3E35D9BD6C79547B592C95693750010A3D22CBB31AA5A4ABE94897831B1ED9287631F006A735C36BC84A8C87497EEA4873801A733F35B328C7D2CCBE4A41C193D22F972571BA7630B33080793498CC85E6EEA1C412914459DA175A6DB8658D0BD7A823FAB286EDC20C785C40BFD539924A24AF4E3D37BD781353677C76D4672098F5BDD17017012571D9AFDA05A40AB56998E40F5E359C43DFE32CA10A45BF08F67D128C24B1ACC03CBAC46BA6CA5A532C105E91E0C77ED59FB534AEECD68735A4978177BB5A656B9F83B202BB604D61A24574C16656E512C0A4CC6F597B3268573E10539D1BA775ED83BB680BB9115011C6AD43FBB66FB37C467249060A1586DF27B2CEFA65265CCB9051E468000CCAE24F08BA941A8180A64BB624F146C8EC562363B32C369F62997C4B1375DD7DE64725A598529244273CAF8398913C6FC01522683CF1F9F965C491ABE7A554F0019514ED98D75EB8BB8565F77C195F629F98163494B4AA2674F92A41DCB67EDD1D818A5B98993D0B1198BB6BEDABBB486BC6FDE039433E842BAC568A5B4EACC028CC2544B57D8883848DDDEE2E967EA85A6102BD0ABDDA41C3D78447BEE1D4949449ABAA9B3377E8CEDCF04A500FD1A6916E26983E64B5E96FEF87B32A060444D374409262453CB1376C349A8B5D1767B1E2991A1A6044E0F58831BD11F12159675D215D7EAA74807C995FE22017E30482DB8A4B09CA7800822C75C92FF649FC0728F5A1D44EFE7D0FF147274152D5F2F60342C8F5F951D8C95F83C1D54613A182D9DCA68F54FD55047F1F90CFECC04D733DFA82CFF2618F29A4DB4F7E1E59DEAD58CA65D07CC90C25F804A895D6A82F9375451CC55506D276FBF783F7D4D53B9BFB83DBE4A8771AFE21AC543983D68034BADC980F9434527F9EDAA2E228646FDF75B44899E749CF4C9E5B345222385A4424382603AD6EFC24C56E769028F4394F2F6220A9B390D395E412498E57A08BAD927B8BD5D76E18E8FEB457FCBD3248D218236B07783E57FBFA03C292A9F5719E6AEF2EEA3FAB2CAEED5442E89BFFB236CB13DB2CF9C35A38C338C377C475DAF45F8EA822F9AAAC13425FBD43D3DD9229367F0B3687D7E82AC5EC2FC7CDB69C99A4EB1B8E45465C6A53F16AC0C4E0C970B8C732AF515C09EAF25596F64A04AE4621037B8841FD2B1BBCB310EA23E122B0B9AB96D8F7702952D0E96E4CF79C2A30DF0091ACDA91479EE2979B0054997C48F6A0E909BC52A943459AF25553969EB31CE7685369A7FB014561B4697B8BCE220983136E5EB2303CCA4EADD4C6CC74EA2FE69D448AE6ED953A80363DDED5591B27A1EA956DF081CE99AA59DFC789D9D8FAE952B0737099D467D - -count = 67 -seed = BC81485EE93AAD8B464B5199FFEF9FEFC06EA97645BDFE0B4E915B812E606A77F93917ED925E882161CBB909747AC4C8 -mlen = 2244 -msg = 89D960D04A3DF6984276A3D17D59AF9E72B25418C8797170FA701A672C5835CEAA22DC35470D038C6ACC5082D2AE329F36697C91CBB1F9E42DA59A654462BF19E04352192778CB050DB6F4A656F6AB0BD9641CA8CE6C1EF8B020A3D9FD9DFF772F38926458BDA6E6072456E506AE464785399AD7B498AFD4C211F09D0C722FBD9E20890CDDC8C6EB9EE75390E6D76D0672FA64D8B97C65CCA46DD1F542B6D6014F035D2817C4B9430AC8DC318CF8642AB34F4C8D71FC0E3B1FC961E94B6A84622876250FDC21987777360784D9A58F35E1C9B71F30561ED6854EE9B112E7B20CE064272213BD1A46D0D19E5EFAFAAC7ADDF4D7B7A519D689398EAF1E67E64ACE8E5E89756377E1FE458D04E3DF7F6680F8B69815680276ACDBEE6C8E1AA909EC56994F3EF3B65FBEFDBC29AEB0EA906274E838CAC36A0607716FBC2B8DA6150A4EF39E1CD9CCA72915007723C5D2442F7133258234D18A257DA2C13E53B47DC6ABC2D607B98E351FCECEE8BA8886821985BB3A7BD02429ECDC5A27EB04D01DADCE88A324AE44F567593FBF730C284414056FA33CE90A6D6F146DBB1635BD26B4F883D4948DA47216C70D2AA58CEB3979523C6A4F2F7EA455A97C7ADB6C43685D63BD4C51D7DDCB81A06B9BAC31A7B255B94052D686128D234BCB63CE713028451B18B981B83DA1246281FC3BD2B06C741CF71979DAEFDFA0FD06FBA3722FF7BCB2821FBA964FBE9F6467FE583C06D3889A40360A7AA03358175EE75EB8FD1D3368C30B5691776C163764DB924FBA2362CC9572F642CDD2B11B40FA2683A529EC2100DEDEDEAA70A1E639A71D6A96AD31F70A00FB63875D0FD5C21E56AE57B6E74EECD2EF34BB3E20BE5A1F9F1F54955A18B4E4E4B9119973DEB76A2A603FB6410A350667ECE5C1C147DD00B07A88A7D0E86AA2D747A867AD90BA6660C7A0432E20849EF642A20CF5A20AF7E34D139B39DD65C65B36750F17F0B9F1DB06CC6E16F10EB289F567B647454A581604F381D66371238AB785585A4DA2D00810EF6851A6009025FCADFB77FF7996BA6B091FE4130733466B29FED46554FEBC2AD291DD966BEF4D79A9E04014D3003C95696E8BC39892AD32DB6D6AD22D33E931BC87F78114BBBD97B334BCEA676F9E9DB23C0485EC06D8F37F070C143117B1BEA49F06E1A2423D98C12883D32D29103F7699646E7091D393B21A260703E17380A1BD85452702C3AF7DF73AE7856A1C066013014DE62C3C817DD74C44AA436A71490E7BDC6B8B74BF61711FDCC541AD7DC49CF4C3EC154879E048FF30DF25065B5641367CBD3BBA19606A9A27A64055D5D3B538FC88EDA66FF9F26E619DCBA696866DE54A8DC8580B5B28144F952FFC6DC543E98CC9FD7F4538135C0F4DEB4BF892266DCC48A4D1DDCF407BE4FDF2A5AFE4A0105A20CE2B3D9F48D608DE2315240875F1FED696C49CD8D4A78AD26F51B3C804949C536CE35C3963DC1D238516B3F2D297F5C9939A946A0170E185C75087F37ACF907F9E3F87A2B15CF81C7ECBF2165F0F3962D11E9C6A7845ECEF432CE9E1FBE74C77EA1057D79CB595D47A8DDC1D911C6B97AF76D91F3515081B95CED16275DECDEDCED9AC790D73739E35973834503133510DBE39201F9B5C618231184B9DBAFAA7ED6623E8BC492170812444DB62D4F01925DC4F821C0896A746B4453E93EE51844B311B0A0A51601477BFF651EB5EE331227A2E9E49F593EB2988E449E750E990A8A89906EFAB00E0955C81B6AEB160313007B481C40908130597626935389E47AFCB0A20146F0C7B29B567E95D59CED7FA8023A2D69C89443A11E7150A03D09EE6B0F74358141D48E9BCAA3EE081C7D8F8C223F4D48EFB3DF8A4E287FC5B90B4FD251CB616687ED09AB1A06C42EB9D6A578D72E99D499882D216DDB3F35B0A33D9F2D3D4A700161A5C3B5A6729F197479E78009794AA1BE3C25E0B9142613AD2EA508ACAEF5EEE33DACF60CB7A16AB38D9F3CAFD2150081B63A3A6CA0163A25FE81206A37A0874FD55FA3068B4C1B25E6325FA56646EE5F3431D33D0BC691C134AB306B0BD2D1087F4D898A529DAE08B97683FE2EB8ABC9095D67B79CFF0E77404C1F7FF316C3CECBAB77C710FBF961008047AF22805D77EFF79F815B21D142F517DA2199F6627AD9FD85AA24E9B7F40C7796207A82901C7B5A3A42369A9BCEBC24ECE13A3ED064E4E748BEE2890BB21B8E4845362BE9AEE46E25418F7CA38ED087E46E24F12012A1312BC623AABA6ED227CEF116A3C2130B4B837AC77D86F8CA3553BA0CF5AD45E9B4E4E55059F1D4675291581D7CC9E5839212AFCFA897E90CB601CB33A4D2241A5ED5925F6416BE5A43D4767FA04F701076AD5ED5ECE2D09B8DAF11B00FEDD2AA2E748CBCBE365031394EF823951EBC52B3E4C79D79234C16575910C29A35EB67C624F7504EECA3921F461D7F95EEE39638C402481DF7B59310C4554450789DFB28ED1E485C0018512EB05F14DC7A3DB5C0606F9E28420D76B8F8534D2AE31AA01E90A20E248A7FB3B72EA859031C67F7B2B043D38F7183165A42AB28C6308608C530A9CA98F82C133BBC313FDDD2109838E970DC9989EC14DF781A518F6CB56DBEDFC1E381250C64F95D0BE5F37515437673425374D44811F4406EE2B5130334BA555839E61AE623D283C77247D2EF8B22ED138A526F7E41DFD41FC69A2839B77B51C6FD96D97D3EF8359E8725BA1AFA80278FB3BA9C697F7E2BBCC5D3F0F2E61BFCF542D3160EDE02CD6295FCC55865E7890342572499347DF80EC073A91E00193BAF804B884E9CF5C43269824D4CAF7EEF49FABD8BDC5496D190263C96DBCD287681C19B90C34635FFBDFEAFE0601BBB7514FD84896A22895E9B21FAEEA372696E350F13959FC23533F3E8C34B17B595F3C935E37220AAF644F3A565114C34C7B85F1A3E465470166A62B13ADB00A2BCD5A9A3ECD59FB772F09DD6A6E2AD12FD54EC62CFACE0022F2FFE3EB62DB0F4D0F0F9D1FD6F3F11D76DA868D2C1C4124915DE19EACFFCDB31F7CA018B6976260CA1BB2C4FCD6B9958F096313B608E208D875EA5A1FA89916D0367EDC4F8890E93F1E660AFF16EA79D1E583007E693BF06C172105B3DC24117DD921FB60D3AC0D2E5C89FEF17087D885A0794E496E3CBEA333CF72A507788EFE -pk = 894A7F8FD52824472365038B4ACC5964A06BDB9D4ECD4613A00F35D3A7AC68506124F4319C822AD756EB7F0D7C46980F71A47A2BA35EDB37F95821AC4A691C00C9F92FE6C15B94D0A4EE70986B0EDF81ED6304D241F7C48E44CA521858ECA56EE9E18F10C25389B33621B47F5D18D0762A3B97983CCC139D7977FEF830E51700 -sk = 894A7F8FD52824472365038B4ACC5964A06BDB9D4ECD4613A00F35D3A7AC68506124F4319C822AD756EB7F0D7C46980F71A47A2BA35EDB37F95821AC4A691C00C9F92FE6C15B94D0A4EE70986B0EDF81ED6304D241F7C48E44CA521858ECA56EE9E18F10C25389B33621B47F5D18D0762A3B97983CCC139D7977FEF830E51700020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003F4F42AB018A43A8818F8E053C2319C89B13EBEF64D42F8469D6C9D716A7734C3CD558FA0B19FC70492B06CD5AD1F222486E0B0D1E8882C57FB6C9475A50A5971F7B7EE0527F89EA1244725C62430160786B8868AD385C81F20F00000000000000908D429BD8604F3FE08560D4EA40D291A80FA7AA963F42B694DDC0E8C4DEB120DD14D4262A40C71B00ECC01F72EBE3EF1A98B30C3BD3655F1FC295676EEB7A7EC6F95E5E1757C50507FD869944BA779691C1AEE4F2F88E4B58FEFFFFFFFFFFFFFF8CEF0FDE0EF77D1AAE8C55D6FDE12B842399C21A38318F4690513535A3E7519B73B7A0C4F78924A71151C9453CE3CF7C026AA6F1D4EF97143C0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF274C5D1999225A4C986B66871F5A67C06E5202EC00B434229B6D5F3DE914E47B72B632EB431D5B836ED9E6C32E9D4FF22031D7B3C7850BE108F5020000000000000000000000000000000000000000000000000000000000000000000000000000FF8509B570D35BC3C6565725847B6C2BB9CC998CE680F75B0AAA3293392103AC16850ECE035831C866802E26877793F76851C7C1DF00FA58EB42D88DD4831F00945856D8E43DC68813AC37AE74BB308F0121F1862468E65C0DB02E59A974266B63FE14516B7DF5388E93A8646B9FBE5B5F4C399A3BFE40F5C77D328AE78F07004EF8B7590CD1EAB14D28B68BE33EDEDD832F1075C8F1008100F32A0D17F58C24D7E03BEE595F2F84DA5A96DA30671DFB95A78B80F4C159E8AFD383A602041C0030144F5489099A45CB6F19A192B702A5863A10813AB1F2940307BA20302FC5D233FE4A8D6E604398A4B73B91A7A7A22154A17B65FE3E2AA5F4702F3FCAF70700A9D4F4F7EDFB851860FAEA8BFDD9B84E270E0037EC7A933A111DC071E5C2D8A2503A31343E0B9861130E82E6F6018F937078AAC85D28A871963A7E91A003050065F28A6E188B97A74FDC5D73F97464075278F1C9050D961FB780B05DCB91814BD126CF38BB986203A3053F8D1039D65458136E6C261E169B47A20E3386201600F3A8209FEF1CD7FC8DEDBF9A785ADDB3ACA21593B70C611441984C7B8D95A7FCA9FAE22D8D3C5212877BA789C6785433B6317C1DDFB09686C9358E14464C0800C15D0E18D7A090A933D0B512DA92EF52714339566D36127DFCA628C591B7DE06C7522C942683E0EC1463E57B8FA5B16FD5DC20E4630D4385D4036549FCC51E00FE56247275591EE0095561BD545EE6F04234E2BF2EA39C24F7EC0656CDE95A804C566AB6E15ADF0BB7F40943097DC073505E3ED7A37FADA7DE63D24308FF18006B615E735BE0DF2C5535AB73EF6BA6FDC76E39FFEF7866EF7CA969077D8AB2BB928EA6EA2D8436F6B40C8FA7ECFFF2123E235567F89431820BD8766F74CC0100B41D3EC06F85D40BCA23FD6E3728766DC831729BC3E66CC85E8E701B3D39163FDA003555A3E913EBF216F438515220D0BC8CC80275C05B215773F2EDA1030F004011898AAF941C1B0F7DD43B6CEE350218C59BEA45DD0CF09169F975056B6A3FE34D9125F6A253658849AFC9BEB51496883E4D7EA30EE4082C4456186FA603002783E8B13495938E5AED47910D142197E2C4167461F511F46B7D2FAB01868639374D7355E70031087797CCB72BFB2935B64A26E492B057B418E0E4498C2E150012550903CB6833534EAA1723CF088D2FB128C84D776F5B67736C6539952A6C9D7673A4AC21C8E05E9E043E920BC2014F2583969AF093818080EAF0F85D781100 -smlen = 2579 -sm = 9EBFD924F911C60831B01D8DAD380F603E640131F576A743D90CB55311653AD4E348297C1201F6C84831CD0387B96BAF5F4A996781491D070035D7ABCD8495AF5C87630B20DD7E09663050003C559207B5B196FC752E689A0BC10A821D88017DAA03D897743953812CE08EC52477BEDA7300F9B13A8553DC8565B804D97DC8E9696873F901412A1B033397AF8EC365736BC53553E2DF1E006A5A4AE54392B98F3BA1BE89433B88DE0B6801672E544603E1982BFB11B33FB4B68E38887600646EB990374E44D818B4594CDC5C406071940089ACBBB28EFE084809CFCFA0B19FBFB55F1F013327EF33905290198182E8EC9AA765C7DA0A01BE3D0A3FCC7199B4BF65B62AB31E6031B39C0000CB992E150725061602E3CC7C729358FBA57FCE751EE52C502B463B705ECD77CD0203341E319DA08B4CAC24762B8C50B3712E501901F1357F34E3969EF0737AE0F96F0C0489D960D04A3DF6984276A3D17D59AF9E72B25418C8797170FA701A672C5835CEAA22DC35470D038C6ACC5082D2AE329F36697C91CBB1F9E42DA59A654462BF19E04352192778CB050DB6F4A656F6AB0BD9641CA8CE6C1EF8B020A3D9FD9DFF772F38926458BDA6E6072456E506AE464785399AD7B498AFD4C211F09D0C722FBD9E20890CDDC8C6EB9EE75390E6D76D0672FA64D8B97C65CCA46DD1F542B6D6014F035D2817C4B9430AC8DC318CF8642AB34F4C8D71FC0E3B1FC961E94B6A84622876250FDC21987777360784D9A58F35E1C9B71F30561ED6854EE9B112E7B20CE064272213BD1A46D0D19E5EFAFAAC7ADDF4D7B7A519D689398EAF1E67E64ACE8E5E89756377E1FE458D04E3DF7F6680F8B69815680276ACDBEE6C8E1AA909EC56994F3EF3B65FBEFDBC29AEB0EA906274E838CAC36A0607716FBC2B8DA6150A4EF39E1CD9CCA72915007723C5D2442F7133258234D18A257DA2C13E53B47DC6ABC2D607B98E351FCECEE8BA8886821985BB3A7BD02429ECDC5A27EB04D01DADCE88A324AE44F567593FBF730C284414056FA33CE90A6D6F146DBB1635BD26B4F883D4948DA47216C70D2AA58CEB3979523C6A4F2F7EA455A97C7ADB6C43685D63BD4C51D7DDCB81A06B9BAC31A7B255B94052D686128D234BCB63CE713028451B18B981B83DA1246281FC3BD2B06C741CF71979DAEFDFA0FD06FBA3722FF7BCB2821FBA964FBE9F6467FE583C06D3889A40360A7AA03358175EE75EB8FD1D3368C30B5691776C163764DB924FBA2362CC9572F642CDD2B11B40FA2683A529EC2100DEDEDEAA70A1E639A71D6A96AD31F70A00FB63875D0FD5C21E56AE57B6E74EECD2EF34BB3E20BE5A1F9F1F54955A18B4E4E4B9119973DEB76A2A603FB6410A350667ECE5C1C147DD00B07A88A7D0E86AA2D747A867AD90BA6660C7A0432E20849EF642A20CF5A20AF7E34D139B39DD65C65B36750F17F0B9F1DB06CC6E16F10EB289F567B647454A581604F381D66371238AB785585A4DA2D00810EF6851A6009025FCADFB77FF7996BA6B091FE4130733466B29FED46554FEBC2AD291DD966BEF4D79A9E04014D3003C95696E8BC39892AD32DB6D6AD22D33E931BC87F78114BBBD97B334BCEA676F9E9DB23C0485EC06D8F37F070C143117B1BEA49F06E1A2423D98C12883D32D29103F7699646E7091D393B21A260703E17380A1BD85452702C3AF7DF73AE7856A1C066013014DE62C3C817DD74C44AA436A71490E7BDC6B8B74BF61711FDCC541AD7DC49CF4C3EC154879E048FF30DF25065B5641367CBD3BBA19606A9A27A64055D5D3B538FC88EDA66FF9F26E619DCBA696866DE54A8DC8580B5B28144F952FFC6DC543E98CC9FD7F4538135C0F4DEB4BF892266DCC48A4D1DDCF407BE4FDF2A5AFE4A0105A20CE2B3D9F48D608DE2315240875F1FED696C49CD8D4A78AD26F51B3C804949C536CE35C3963DC1D238516B3F2D297F5C9939A946A0170E185C75087F37ACF907F9E3F87A2B15CF81C7ECBF2165F0F3962D11E9C6A7845ECEF432CE9E1FBE74C77EA1057D79CB595D47A8DDC1D911C6B97AF76D91F3515081B95CED16275DECDEDCED9AC790D73739E35973834503133510DBE39201F9B5C618231184B9DBAFAA7ED6623E8BC492170812444DB62D4F01925DC4F821C0896A746B4453E93EE51844B311B0A0A51601477BFF651EB5EE331227A2E9E49F593EB2988E449E750E990A8A89906EFAB00E0955C81B6AEB160313007B481C40908130597626935389E47AFCB0A20146F0C7B29B567E95D59CED7FA8023A2D69C89443A11E7150A03D09EE6B0F74358141D48E9BCAA3EE081C7D8F8C223F4D48EFB3DF8A4E287FC5B90B4FD251CB616687ED09AB1A06C42EB9D6A578D72E99D499882D216DDB3F35B0A33D9F2D3D4A700161A5C3B5A6729F197479E78009794AA1BE3C25E0B9142613AD2EA508ACAEF5EEE33DACF60CB7A16AB38D9F3CAFD2150081B63A3A6CA0163A25FE81206A37A0874FD55FA3068B4C1B25E6325FA56646EE5F3431D33D0BC691C134AB306B0BD2D1087F4D898A529DAE08B97683FE2EB8ABC9095D67B79CFF0E77404C1F7FF316C3CECBAB77C710FBF961008047AF22805D77EFF79F815B21D142F517DA2199F6627AD9FD85AA24E9B7F40C7796207A82901C7B5A3A42369A9BCEBC24ECE13A3ED064E4E748BEE2890BB21B8E4845362BE9AEE46E25418F7CA38ED087E46E24F12012A1312BC623AABA6ED227CEF116A3C2130B4B837AC77D86F8CA3553BA0CF5AD45E9B4E4E55059F1D4675291581D7CC9E5839212AFCFA897E90CB601CB33A4D2241A5ED5925F6416BE5A43D4767FA04F701076AD5ED5ECE2D09B8DAF11B00FEDD2AA2E748CBCBE365031394EF823951EBC52B3E4C79D79234C16575910C29A35EB67C624F7504EECA3921F461D7F95EEE39638C402481DF7B59310C4554450789DFB28ED1E485C0018512EB05F14DC7A3DB5C0606F9E28420D76B8F8534D2AE31AA01E90A20E248A7FB3B72EA859031C67F7B2B043D38F7183165A42AB28C6308608C530A9CA98F82C133BBC313FDDD2109838E970DC9989EC14DF781A518F6CB56DBEDFC1E381250C64F95D0BE5F37515437673425374D44811F4406EE2B5130334BA555839E61AE623D283C77247D2EF8B22ED138A526F7E41DFD41FC69A2839B77B51C6FD96D97D3EF8359E8725BA1AFA80278FB3BA9C697F7E2BBCC5D3F0F2E61BFCF542D3160EDE02CD6295FCC55865E7890342572499347DF80EC073A91E00193BAF804B884E9CF5C43269824D4CAF7EEF49FABD8BDC5496D190263C96DBCD287681C19B90C34635FFBDFEAFE0601BBB7514FD84896A22895E9B21FAEEA372696E350F13959FC23533F3E8C34B17B595F3C935E37220AAF644F3A565114C34C7B85F1A3E465470166A62B13ADB00A2BCD5A9A3ECD59FB772F09DD6A6E2AD12FD54EC62CFACE0022F2FFE3EB62DB0F4D0F0F9D1FD6F3F11D76DA868D2C1C4124915DE19EACFFCDB31F7CA018B6976260CA1BB2C4FCD6B9958F096313B608E208D875EA5A1FA89916D0367EDC4F8890E93F1E660AFF16EA79D1E583007E693BF06C172105B3DC24117DD921FB60D3AC0D2E5C89FEF17087D885A0794E496E3CBEA333CF72A507788EFE - -count = 68 -seed = DE9E2742591A5AF6A6153DA85A510C39FD31A2ACD8A8511F190A9A5E5753E63D9801A8019508E67DEB1E9219CC18BA3A -mlen = 2277 -msg = 8337940EE74590EB25E52E78E8563A09CD2D45F650F48775E3E61F9E3509CC8EB7E983310D0185359F66BD80E0DA1E45A6BEB53ACEBB9030E310E81A576D0F80C64FCE1D1FD77DCA27B7C6E02B0CC26EDBF496AD2E3CE8484E988E56BB28153587D7ECB02FD8882545E7BF79CC9966A7FEDE93F7E9451BC48FDBB481673D1C4135F95D68F40F4B4F847345A320FB4D736BF5F9FD347435462DD3A238E4C799E7CEE081107E11682C7B558B19177522427F1D269FAD81B565BE538E8FF2D7193579AEE51E50974BDC0B66331B59BF496C87E4F6E143754076DB516C9C538410FB38A930CB5BA1E6610441126D01C8EB5F34E2E58424B8B218D9E68C5D8B4F5258EEF07EE0AA5475A72CCF363D47D825FA524C16C7B7587C44864DA9E4B267F738B87F7E5701147F550CD38774B17DE48E6969A0DEDF334FA67470419059C4D1607880CB12FA9C0ED23032C7E0F325169EACE7DACCDD4C2E5097FBBA859970D7EAC4522C1FEA043C9278C1C89FCCE95203033B4CEA4F9F24B55BA6B79EF88F275310C6E48189EFC1EEEDAB66B56B6BB028726BC463D93D742492841E85D5C837948978D0FADD1C172F8859C802C6BE8394A05DADA7546EE1CC5BB909D3189088F4FA6D07C573ED7263C081720E701D5D4B027AE54BE175536F3BD5E91993CC040311A7D352AA26414CAE30D10408DDB44E8C9513F4619E99EDC894F963489876B24BB0B91BDC3EE5B78AC0D4046B2E864789C0C779E5AF97F8F84F09A26FF74B8BCDE66C007970830B70C2A1122DC9845905C3AA7810B40641E8BBB398A23BBEF52BEDABEC7BB54823E64177A73786992DD67D5C007D770938402EFBCB3A60281C5706920A9EEE4C26C0B251C32B9E1936FDEC2928110959E99255508250FD5BA84B4FB314187124072D30FBF2163D36F1480ECC08F7FB8093BFAA72F1914C63533EBB3A57420DC38DC93DD6AE4D197FAB790C1EFC1B7A2234522E0B408D0648C7AE782F2F08CB70B96CD76B5089AF1EF4BA3A4C2FAAC363A4DC1C6C421F6AE1E9B67461EB02F36C25E763F1A2B73CEED4DCEDDCE619CB313D124CE6F7AC986D6BC344E630F22CB654C1286FBC0EE01C968DADD1EDAD744C8BC828CF5F316336A5883166ED000FF98D6CE2CEAE7D3E40BBC5714F71BA9E25E1506D644FB2DE2FE190D327ACCCA79D9B6D9DB505CF1853E98F30E9BA5E568ED83E2567C936A64420C5D8F07AC4F65F38C28E88DD7B5209A600AEB81A6D2AFA4FAAEFDAFD9B7FD3AD7F49462CD577204184F9D44A45E2A909373CED24EC0EE56BF2E6675C506EDA67B1E6DAB75CBF1822E20E7A8A81A7729B42A6D67A1DD457FCD19B62F048AB97B3D694254E5C051FD2DAF3D12AD627EC37C22117BDEE9EAA290D11D56BAFF0DE1037EBA908FA03E2F869FA2B27936669306E8E70A0A4910A123F202797BF1C8FE47178BB1E8E8D7AB1C01F30F5E779B2BC99902DF15185FED4C865997AB72254162D00858E0908EA95A9ACD0FCE72E571C7A381CC33E06A27FE6A5922775EE82C973CC3CA8A05717608F8703946C9A89854D627744DA475DEFC1390DC44FCC3A23C47AA8AF17240EB1A1A00A062D258D471F31333D0356243DC1CECFC559378B4395F01A970EA4074D5666B44D49EF291ED15930DADA66765B165CB8331CFE549C38CD0672F534BE60F4D9B4C125FFE747670513B5744676899B256B992E15106B99B794DB3950582816612144649210751F3D0DFD5B25CD393E724F7FDEF00756D0C8540E8891E592507599B06EDFA6EBFE543084AC81858F5EB02D8F5EB8A72184851E8589A3AC6DFE1CDCF286723FC4C1202765FA4F783EE58C627ED494C7149BCA6A4DDB420827CDCA82DC42515BEAF46CE9D9ED524BD00EBD3094F770B1E1DD09FC431E4C244D2305619DAE208E65EF385EA92F5A79F12B99AFDAEA79C9D8D319944AC6CBBE3F1290EC6B87D97785E059E6871FDF239BC404021CB52064B88EB4CB3FB6A871B0F76C12D7B8C5E8FE0A65024AB5B25F4C67B6D15C22B0005B754CF7CBEC898B49F4326F1AE4034E5F5A446A96CE08083D48525A3661E10C996DD22DC34FE570A4C8817D10D750FC5C2ED0C24C7CBCBA5CD1B2680DBAA3315FBF2BA7457ABEEDC96B5D111110D4678EA5C7851D25F258926B0B028365799E940A6E17BB03CB332FBC6D713DEA7108FC6268C8D33E7A578C94FF75BE808C15FF7884F092C0E309F1AF99B1A7314FA0F32C8D8E32B3E9D92C9C8FF6B8FBB99111529C4BE3A2A4F62884373D0903180B4DEABE613DE5CF19415DFBA7F9A46297AE2F21D7EA420B41F628FD8DEBA55207606539D11791623CB325F1E18C98AAC27283BFAB2408F4FD6CC58EC9E306643BA1C0C77D84B3930263E5A76A1CE94F3D7721F0098D54E6C990C3AFF69B6A0D82C853EA2AF2D3D2B3E96DAD59FF873171B55D16CA9A7C68DAD2E918174D264919DDCB4B9D01CE622D56C599BF60711C74315C918A7BB97B9513937AFB6A652DA68B6B0B34E316D7BE9F5C282A5E8773C892782EFF220667A6A54069C37B88EB1CE676AAECF2015E59FB7AF4D30C4625DD8DE4805F505E83C877CD61D2A0BA65B32B0DBDFBACFC88CA43E4DDF7A1A4517DCE83B7B8ACF8DCAAD28284039747935865DAF8DCFCA29FB676CE2EBA2C509CD75588FA5E58CEFD0694626C9BB31C3AFC372ED313C9BB3ADC398E89DBDB108DDA63F9380EBF9DA17B378451634682F9823E209BF10E39F884ED270413152025CDBF4875C121B1E83E12C044453FFDA6D8CA2C240AD522577C6898AB6F2ABE1FE77F860939408CD193E605F87FF2248FA163AC2FC0F39BFC38503B23F5441E0E364CAAAB890073266B3B51217661F5DF41C0BA925BB425AB3DD7B6A3675B7D60D0290131EAD53A4EAB0C66BAA83F2FB77E74C3C123ABA7731A3F62FAB8EAB2A96E8BBC911E501CD23A088E7887A469284E0B5C27B5CBC1DE2B6938CF1AF58A47FE78141306CB76E8F2B73620BC4549DB6826D2D72873885F6C5311EB5B9462BB4631D314DFB9C836C6F4D9EEC6818940C04689CC4D8D11ED9869355617861340E722B2BE78197746E2759AAA8D68D1965888E89B6B0F5BF51F94E586B2CB8708F4CDB520BF31DDCCFB7CB69E29A7AE8AAB12C11F431DE40FB9E82EB5F2B6BA1F9757F1487B63255FA69A755601C2FE17CD1892D5A6799C35D05098DC133BDD71318667D47C4671 -pk = 51E39013E965C64520412297DBAFE0B37F094D1AFF09AC98CEC2F483EE4906F244E604E7DFE9082B860D9908FF1FBFBA87C609139CA24906B7B7C211A027220054392EBEE1C0788F3C0D8A85E0D9FA5F6C283099480B3FD3617E5E85FB39852AA68E96639378E73F47E2EDE8E34A0129C2A55C88401E0AC82415FF45E79E0E00 -sk = 51E39013E965C64520412297DBAFE0B37F094D1AFF09AC98CEC2F483EE4906F244E604E7DFE9082B860D9908FF1FBFBA87C609139CA24906B7B7C211A027220054392EBEE1C0788F3C0D8A85E0D9FA5F6C283099480B3FD3617E5E85FB39852AA68E96639378E73F47E2EDE8E34A0129C2A55C88401E0AC82415FF45E79E0E00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006A9A87DF6D66BCF8A512AF601A1551F44DA92527361D14F693A5909CBD185318586CA095F203183841519BD770B1252AB2129B2C60CED4824DCECAD3015F8B69F17E76B36576D6BB1C9C0EE5F0873B70F3C8D1BA5289BA85CC08000000000000007383FC07E21762A1A24E79EE8AF5F2934BBC30CAFD6B3539C153DF641C3777B44E9D5612204088EFFF88B7EC65A37E51A5DBB64C9999E403A59E507E18BD57D7CD0CA1A086587FFC669DE041E653CF6A1D1FD823D648E9D55FEDFFFFFFFFFFFFFF93AA6F64ECB9174C76A9F318F81F4684D7DCCB1E143A7BACE663A41AE326AF73E56F548F667D6DC18906A3F4604666D992567FEE2710888AE385FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3ACB78987EF7AA4024D501E3541B343E17CCFB7BFCF9AD1354AF8A9099473D082CC5BBB02B00FF98F17294535996649F07AC2811ECF05A043B7D020000000000000000000000000000000000000000000000000000000000000000000000000000B1536BBD802AFBF9BBAAAFF06FD261FD667FA7CFBF7C9C14BBB439F249113F74E3E2981C5ACCE78895827069CE9A29EC3574AEA26E59F84A30F9D33ED65703000C5680DA5282962FD762845DBFF599D2296EE4A8D0A9E8E17CB18E55AF0AB2EB30C70204639F3F651C04BFA4AE8B9B4E4450298DBF7956CC8970A9A5F9120D00B381E7CD3008EB04DB218818B7625F37198D4816FB545F03B2E7F5BE1B89F6D2A53D2F2170ADC1341E7935A766CC7AB84112A75138A5EF38619F35C629A4060003BD5328AD389DA36A618794AD5EE86826DFFEFDDEDBD872E48B868C16FAEEE57F97FFE742A1DBE4846F41680BAB6117DB4EA300ACE445EE747BEF2FA8CD0E00FFA757BAF66442BD3101EDCEAA4BAF9C1C1408D4199819BF60325BE028EE5E625158263BFFADEB41F96B50D6DAF12BFDB97F4F936A736785FCE47566F7501900B043C72D8764B2069C96C3DCE9471C2F13D685EB52588C5E7782FAEA3EEE1702E936DF2C0C4686C654576F5A4D2A29014D1B2C01D747E371A3AA18DF63A71F002BE5B8B1C585AB4403AD6E7F18AAAD3660256361D57BC2AD8919C898C6591FCE55B8B8C03B44A03F07F00977D1A54E9A3AAB710F90761F6C082251E3BB540500EFD095347A5776222E7987A76CFA2CBEF105BACF338C7ED34DB1833D1EE5DE764F836D9D68695BD72C1A16FB134312A2FFD4739426AD255A0AA9607290B71300B7D9A585544AC7B390BED4DD4DD4A4A6084145A717F3CE156AEBE359BCB8671E1CC64FCEE2489AEADA5D83D2E36E37B17A821849E16C961E6393C08B7067000032563C99F56AEA0B64888FA724422515AD61DADB71EC86FCE0166CEBD4E9AFD4F5E79994903CEF1BB32762750F8874EC9D5255B79307846A2A11440C6FD60D0036C90AFB202A6BFFCE9D715FE7C4E7725E6898D8AE4DCC19430067E95031B09FBFDCD82A66E6C61581693C2F15D0AD4D3391AA1A68E4ADAC714017087BA80A003BF81D8B5ED1E90B9CAE56AB1C08F6CE378EF9A10BACD6930FE198DD09CC81F1B56823C68ED5A9E95848283EAB9446BE5682BB40A0A83EA69A8953A964301E0097A030EF43CD19E0280F9E20B89AC01791C33F244459B5547ADDBCA8A71A71A22F8A8EA284B7E30048170FDB136917989C048ECB83C89BDAAC90F30251991A002A2C50F6B861D39257BE55EDB53D4106854582DF28A217E0659EE023F45582AD489C0A8BB68C9BED377F64ED9AC6BF7CC2187A1FEE3C86E709A4270803D30900 -smlen = 2612 -sm = 9D4A3CE2566D1BE19633C4EC666F9C1D8C0A00EF951DDD8E877EE376336B0452ACCAD3F74C01536C5028BF056E5266EB2EEBF01456DC218E0134AE467BED17CE0108B9595597CA18CEA0B101E2C0DFB78A573E126BB3A8A648E93B80FD1E0055DA04F62F57D471B800303569707E80EDF900FD16C169A6271B3141898993340D0B05EDC901BEF40F7ED7013EF616897B2826D420AE588900D447FA25382EB934FD0B4AE0C585B812CE9201E64BD37BA70EBEEBE172E3CAB1B659065C590053833FA732A50E09985AE3C768D01631C07101773740D9BC7C2185AC1F5ADF4A98D8E2F726013A5605BC2D1E729BCBB9FCEBE10C5CC145D7015DBB99C9C6705FDBFBD5E649E40FD28008F901018B3194F63BF62A8703D6691A217D66F7063F7084554D40D0EDE2172EA1581D7C050334981FD2FFBC5780DAC44DD44ECC3F5EB4B1003856D1FE45BB95AFA4FF511C14B8038337940EE74590EB25E52E78E8563A09CD2D45F650F48775E3E61F9E3509CC8EB7E983310D0185359F66BD80E0DA1E45A6BEB53ACEBB9030E310E81A576D0F80C64FCE1D1FD77DCA27B7C6E02B0CC26EDBF496AD2E3CE8484E988E56BB28153587D7ECB02FD8882545E7BF79CC9966A7FEDE93F7E9451BC48FDBB481673D1C4135F95D68F40F4B4F847345A320FB4D736BF5F9FD347435462DD3A238E4C799E7CEE081107E11682C7B558B19177522427F1D269FAD81B565BE538E8FF2D7193579AEE51E50974BDC0B66331B59BF496C87E4F6E143754076DB516C9C538410FB38A930CB5BA1E6610441126D01C8EB5F34E2E58424B8B218D9E68C5D8B4F5258EEF07EE0AA5475A72CCF363D47D825FA524C16C7B7587C44864DA9E4B267F738B87F7E5701147F550CD38774B17DE48E6969A0DEDF334FA67470419059C4D1607880CB12FA9C0ED23032C7E0F325169EACE7DACCDD4C2E5097FBBA859970D7EAC4522C1FEA043C9278C1C89FCCE95203033B4CEA4F9F24B55BA6B79EF88F275310C6E48189EFC1EEEDAB66B56B6BB028726BC463D93D742492841E85D5C837948978D0FADD1C172F8859C802C6BE8394A05DADA7546EE1CC5BB909D3189088F4FA6D07C573ED7263C081720E701D5D4B027AE54BE175536F3BD5E91993CC040311A7D352AA26414CAE30D10408DDB44E8C9513F4619E99EDC894F963489876B24BB0B91BDC3EE5B78AC0D4046B2E864789C0C779E5AF97F8F84F09A26FF74B8BCDE66C007970830B70C2A1122DC9845905C3AA7810B40641E8BBB398A23BBEF52BEDABEC7BB54823E64177A73786992DD67D5C007D770938402EFBCB3A60281C5706920A9EEE4C26C0B251C32B9E1936FDEC2928110959E99255508250FD5BA84B4FB314187124072D30FBF2163D36F1480ECC08F7FB8093BFAA72F1914C63533EBB3A57420DC38DC93DD6AE4D197FAB790C1EFC1B7A2234522E0B408D0648C7AE782F2F08CB70B96CD76B5089AF1EF4BA3A4C2FAAC363A4DC1C6C421F6AE1E9B67461EB02F36C25E763F1A2B73CEED4DCEDDCE619CB313D124CE6F7AC986D6BC344E630F22CB654C1286FBC0EE01C968DADD1EDAD744C8BC828CF5F316336A5883166ED000FF98D6CE2CEAE7D3E40BBC5714F71BA9E25E1506D644FB2DE2FE190D327ACCCA79D9B6D9DB505CF1853E98F30E9BA5E568ED83E2567C936A64420C5D8F07AC4F65F38C28E88DD7B5209A600AEB81A6D2AFA4FAAEFDAFD9B7FD3AD7F49462CD577204184F9D44A45E2A909373CED24EC0EE56BF2E6675C506EDA67B1E6DAB75CBF1822E20E7A8A81A7729B42A6D67A1DD457FCD19B62F048AB97B3D694254E5C051FD2DAF3D12AD627EC37C22117BDEE9EAA290D11D56BAFF0DE1037EBA908FA03E2F869FA2B27936669306E8E70A0A4910A123F202797BF1C8FE47178BB1E8E8D7AB1C01F30F5E779B2BC99902DF15185FED4C865997AB72254162D00858E0908EA95A9ACD0FCE72E571C7A381CC33E06A27FE6A5922775EE82C973CC3CA8A05717608F8703946C9A89854D627744DA475DEFC1390DC44FCC3A23C47AA8AF17240EB1A1A00A062D258D471F31333D0356243DC1CECFC559378B4395F01A970EA4074D5666B44D49EF291ED15930DADA66765B165CB8331CFE549C38CD0672F534BE60F4D9B4C125FFE747670513B5744676899B256B992E15106B99B794DB3950582816612144649210751F3D0DFD5B25CD393E724F7FDEF00756D0C8540E8891E592507599B06EDFA6EBFE543084AC81858F5EB02D8F5EB8A72184851E8589A3AC6DFE1CDCF286723FC4C1202765FA4F783EE58C627ED494C7149BCA6A4DDB420827CDCA82DC42515BEAF46CE9D9ED524BD00EBD3094F770B1E1DD09FC431E4C244D2305619DAE208E65EF385EA92F5A79F12B99AFDAEA79C9D8D319944AC6CBBE3F1290EC6B87D97785E059E6871FDF239BC404021CB52064B88EB4CB3FB6A871B0F76C12D7B8C5E8FE0A65024AB5B25F4C67B6D15C22B0005B754CF7CBEC898B49F4326F1AE4034E5F5A446A96CE08083D48525A3661E10C996DD22DC34FE570A4C8817D10D750FC5C2ED0C24C7CBCBA5CD1B2680DBAA3315FBF2BA7457ABEEDC96B5D111110D4678EA5C7851D25F258926B0B028365799E940A6E17BB03CB332FBC6D713DEA7108FC6268C8D33E7A578C94FF75BE808C15FF7884F092C0E309F1AF99B1A7314FA0F32C8D8E32B3E9D92C9C8FF6B8FBB99111529C4BE3A2A4F62884373D0903180B4DEABE613DE5CF19415DFBA7F9A46297AE2F21D7EA420B41F628FD8DEBA55207606539D11791623CB325F1E18C98AAC27283BFAB2408F4FD6CC58EC9E306643BA1C0C77D84B3930263E5A76A1CE94F3D7721F0098D54E6C990C3AFF69B6A0D82C853EA2AF2D3D2B3E96DAD59FF873171B55D16CA9A7C68DAD2E918174D264919DDCB4B9D01CE622D56C599BF60711C74315C918A7BB97B9513937AFB6A652DA68B6B0B34E316D7BE9F5C282A5E8773C892782EFF220667A6A54069C37B88EB1CE676AAECF2015E59FB7AF4D30C4625DD8DE4805F505E83C877CD61D2A0BA65B32B0DBDFBACFC88CA43E4DDF7A1A4517DCE83B7B8ACF8DCAAD28284039747935865DAF8DCFCA29FB676CE2EBA2C509CD75588FA5E58CEFD0694626C9BB31C3AFC372ED313C9BB3ADC398E89DBDB108DDA63F9380EBF9DA17B378451634682F9823E209BF10E39F884ED270413152025CDBF4875C121B1E83E12C044453FFDA6D8CA2C240AD522577C6898AB6F2ABE1FE77F860939408CD193E605F87FF2248FA163AC2FC0F39BFC38503B23F5441E0E364CAAAB890073266B3B51217661F5DF41C0BA925BB425AB3DD7B6A3675B7D60D0290131EAD53A4EAB0C66BAA83F2FB77E74C3C123ABA7731A3F62FAB8EAB2A96E8BBC911E501CD23A088E7887A469284E0B5C27B5CBC1DE2B6938CF1AF58A47FE78141306CB76E8F2B73620BC4549DB6826D2D72873885F6C5311EB5B9462BB4631D314DFB9C836C6F4D9EEC6818940C04689CC4D8D11ED9869355617861340E722B2BE78197746E2759AAA8D68D1965888E89B6B0F5BF51F94E586B2CB8708F4CDB520BF31DDCCFB7CB69E29A7AE8AAB12C11F431DE40FB9E82EB5F2B6BA1F9757F1487B63255FA69A755601C2FE17CD1892D5A6799C35D05098DC133BDD71318667D47C4671 - -count = 69 -seed = 272E459EAB6A0BDF720E4C5B79E641C95BAB66C3CEE261D0E3596BB04D232ACE0A1CE24BACCAAE9037665A962C711B08 -mlen = 2310 -msg = 62215248E1F3AFB19849F758D742F8AFAB595040C4DC520D603C9A80FA9CF2E97E4F4BD7350551FB667D606BDC31A45D88836CD376785C01F9007D47DF95C1F4D1E30A927A13525409D91C9F5145C0B86D3B44E933CA81E4ED9559AC17940C61EB85B2D26D2C47924AB80ACBAA3D9B1C8855C13EE45F5C8047C161AAA5321839A01783B21A5EE90CF91B8285C4779465B7A89DE3D74D482080F68EB2D8B47429D5475356C50A92B3ACBDEA5786F4D6C2A304AB500490F84FD1D0F21ACBEA325D62D2657F3889B6F591A7F63D8633C061CB14B8266A7FE17642DEDF1D08D9FFE369126CD780D9F99FC6262B5BEFCFEF35D33498CB2CFFE55F2F8D567EA8687DFC6E7D49A61FDBFE768C1D11BF5B3B18CA52225B096490C97CB9A0B3B2CA0762DCC36B60F7D26FCAA4E38B1F3A6279D889323010D9CB0A97FC488E09B06237E6EB0166465C2CBC2B9CD06F155759B6C93CA0CD3178845E0F3A2D20A68757AAF3C4E74545494462CCF28F6F51EC0FDFF4F1E6D98FC5B63BFF068FA7BE1764BCF14497E71E424C9389C5DCF8C5CE1DCD40B82F1D75C3C3970DA433A92A04DE958766AC5EB3645F4D21882F7071383AF8DFFD6CDD91B549F143DCF59FED6674441EEB03D5013E90ADCCBD7E3DA115535AC855DBAAB7F51D70630DC00009E726A16DEADB12047D85906CFF315C73EE7D4E24C9067E3B772F3DCC44C25C7CB8622FDD7B8ECF5E9C877838D71D500F864A662619B1478F8AB4DB2DD09A111ACC99ABE737DDBCA06E88926C4E73B5F5D21EAFC4B11938FEEEA5F8D5A4C616A342B54C9CE371817AA2409A55A3237BE85A50F05B33D35AA86A62E85A01CF34EE7DC840A26FA1B8C6B307817C062D9A2E7163A3B036874D2ABF6531A772D4031FDCD59CA79FBF442CB9155F90148DC3B723778E699C6985634185C3FFDB966ADB80A3D1308150B12964142498466506BC0742783C27BD3472A5CB45021DE066C28143FFBC82B5742BE51E93BCFDE1A61E661B730D8760E108B80C859E4B3A07D483A6A8967E5F01B03EC8B63A20C6A03755C75F419558878A5EB8BB0B2120F183E4BECD4A104EB4DB62CACF5F9964583815334A25BDB75724E549211699AC3BC9B2B5F58F1FB33429905DF81C9422F8B84E95A7C36DEC6AE9B48D4F502D8AB59B69E9D112693578D143A3F111EF00844303950F65DDEEA6E30F1286DE16546F90C4364A5C09755AF3FECB13983C418B2FE4AC17BDDA57E4D597E8BDCCBFBE4082C446FC920E5145BBAFC67FADD9799CD8C7714510DA579516ED39B3E22DE319977FC77A9CA61AE8252795D11724AAA866C1FFDBCBC1FF91AF1B8713248864A4E8B9C59DD12863245F5048110DEDE7FE31FF9836715886C37E9642DBD6C668BA7AB8C2B706CDD58586EB7227B5768C3509C1F66493468859E275700EA38BA69064179F6036D7B50BD232B61C9B9659492894C0057DBFB80329A76CDC57B2A89BBB910483301CA0BF6AEC7D5DDF86644FF52F48FF6C7CD00406CACBC09AA251708BAF3276A52BE2C7B42FB6A9036C318529CA98940769A67DCD532C0000AFB5FC63AD2303E94E09D2CB40CCBE47FAA1DD22ECF528179AD40FD4BFD43717864149243D61CA255344C52743200ED8385A7CA6CCA24CF967D23D07DC2A3F9AD5F3240F4F022A6C6CD281B6C492E8D144A2F4641957ECC65B32C9F74BB468524FF58F0F3DA2F5A56742896CC8F99088574264F857DC67CF04C4B63C6A08FC534229CA8BA616CD504F969EA6E3C98A517355F98A9E884062805B77623239074206E01AD2F3FC9FE9FF8254A5D3525C3B2F0A692803500C967A2E18511EF5B8845DC4B0DEE9338C38C4B1B8B84EE63923250EB6F9E9C272617C7895BD538A6F34D3557812BBBFAB2B8FA6EB5E95B9BCE33AD3185CD90DD536A68639022C079B5CA7748864D37D45FA6780A45AA991F28BC0D3BF371EE2FF0C913CEA6DB38E4A278A4840EA1F255F8E83B6B6C5E260A49D727AA42095A88CB8120B51DAFD764E690102F7FA07CEA2EB86AC613E7BE2F498F5767B622D04E8A6F272976FB058C3334CF8CAAD1D180E3456C210763C974E431CBC3E25EAD8B9FF9243628D5B08D92CBF1D5DF29A85B1A04D2999B3C669227B33610121D543CF4A978F8D9365C0FF8AFFA92B07FC8C8604A0F357F3C669445685B6A29898301A5AFBE10ACE8D64A47009C8741D7CE82E9900643900A3B92A26FE5F24886C06AE0918C3F2523C320699C799CBF72F0DDB08A0F1F63D6DC2F021C78A9D44503209190EE4BE654663679CFD292292D71FC4BA6233A196EF9E95CB965852773404B2622B565BD91FCA6747AAF7F4EADED7BD3BB53645381B687AE04B8D8A9BEF1095EEB39A0BEB4EA89BADB4655A1AFC7EECB7DA0D670C192297CCE0B31BBEFEBFE94C84603BA8C0B7CC73159FF59C01A037CF2C866DC40D88432CD6C2F1989351A4E41343CACF7BF2C2B395C863709D6EC1DBAB2AF514CC771DF14DF095DEA8284BE2B65097D8E6F72EF3936595384AFC0026956E819F1657C901B92644E9D6D32D0D95549729B2CB3D5EFAC9C42A5F284ABC3BF5CCA5B08161B09D9A48FFB2996C3D4383D65B8D1F7FC3248CBE84B9C05464F4A76EFA005FEC342EDD56959CD26CB0DAE1B61B0493A4B68EB3D6335BBC280508F09D84E0C5F4EF520D92CD34D69E5BAB76DF5D2B72CB41A298D370EBEEFCD6C1904B956458BDA581EFA6B3654BE402AC3A971603F23F2B543C5BEEDA5F018543B72C146CF04680BCEA31B4A238460329E2BC12F14C804FDA3494C15452223D2477C9C8A497D04EAAE7DE09D7D7A879D3A5DBA565AE1A38F15E69C18838C487C0FBAD44A068C42EFB7D3F5EF488F91C42F25AC564751F0EFE0ECE7D98BB1B3D0FC42C9756F4B8F9DAF1FD0D414391155285C8DAEAAF380BD07E43570F14E9A47A87BC733F1E676233F17BFB71AAE464AED68487392D339AE064AE27BD57F8695F493AE56CA96C0615BDA8DA37133DD13C2B21DA189A7329773FD8D51381BC118645440B28FA4F402EF84C4091D3A0BC4D206BDCF9007F5DE9AA1E6CF7F6058AC6B69FBC703E908C4221F9065147766E48F54BE4B076406E2F9ED19C1BE982E636FD02DC26267C3ED989E6AD1CCE62E7B988FA7C1831E5126111A4C3C29C38A1F96CCB3A04132175FA46F73C634AC6EC741B135645ABF1DCEA18571CF9A539F5CC935BC6D32BEB1C7B8B3B5A141146EBC12DBBCC17BB4900CF0B95EBFAA52190AFC6D8933CAFC9 -pk = BD163E842724B156F6BAFB3BB7A83F107D84ADB4CC528E1B6E50F7A2F74013835D67697EBEDAC4E34243A322A90F0B377758EA146CA0FE69DA192B13745B1A000B1A8971AD3A96D0F6632491356570F543C0BE265C7F5892BDCBDA9F0899F2BA9373DEBCC45913F6257442E2B26D93097CDF38E93989067B51F79FCB35872300 -sk = BD163E842724B156F6BAFB3BB7A83F107D84ADB4CC528E1B6E50F7A2F74013835D67697EBEDAC4E34243A322A90F0B377758EA146CA0FE69DA192B13745B1A000B1A8971AD3A96D0F6632491356570F543C0BE265C7F5892BDCBDA9F0899F2BA9373DEBCC45913F6257442E2B26D93097CDF38E93989067B51F79FCB358723000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090B19F671FD91BA6934C41D906112B196A9AFF3BC187D29945F32CE67FB0E3812769DB00DF5B5DFB7F87C98E0E01D523C3AA6C1D08C176377F1B23C0B923494C6DD80AAEB8908273D562C12DB9408F244C45BA8C1903BF061D0C00000000000000C568C1AD60F5AE5F20EBC5F46DE764C9B188DFBCB5C658A408FEE44768A3A2F67DAA3156D920641BE5356A57E96F427EC349AAECD3F87EC07833873888D891C5183B2FFD8F56EB3D8069068333952A4E4FED6CA062D51EE66CEFFFFFFFFFFFFFFFBDE090563096301E880A6AE032D9346EF50F0442D0D29E81B7DD0565CAB1F899F2E81AA7293A87D6FB41F63879D35DD00BD97D011E08DCE8A2DAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2451FA1DE38DE6DD8B8DB3FB008AB850005175217536DB696C4209E488DDF2DD302A7EBCECC7A9EB52AD04955DAA691BFA324FD4CAA03E2DC1F3010000000000000000000000000000000000000000000000000000000000000000000000000000A60CDB9E923AFD979592ED754FFA278116F89E631E190AA531E69C3036F46EB0E982A65FE14D081D88DE8847F86288C932EC01685825A9814675DC89AA822100F3BBEF6D9F7F6D6BFB6057BF2AB9CCB274019612C0F5FBB798D5675B5914C35DE762F3CB9687D6731CA772A93F7C5B11905B3FE6D20C904135FF3F06671D1500C63F8340F5B0C6DD9951C51FC37F50675A19A2A7BE4B3C7C16B7D93DC1D5E125E3F8C395004B9D3DEF509D7A6D982AC967FCCD0CFA7739C9DE12BE81864E0E001638CD89AA68E7AB01751A9F4EAFCDB9B55AF121C21780D0A8F9F1BA759C8781E04C08CFD8EB666DECFE818430D9038C9AFF4631D2A361A721A353CA3A6E2100DFDF581CA7503B2F6400AB94C755ED5E5795BB4189B0D5131B1626A06C1B27503AFDF44BE05FAA7BDF2EF3FD9AB9C8908655B6720DAF57EA52433B7CA17922007AA971E2EBD7D18A5E69A6BE8AA1A3468A24DAED817D94593A4BACD94CFF95F006A30BACA947C9D69F187BD9BBDD64CF7A48F042CC020977C5D0F610868822000B1752745A83E25E4F614D53F087F516AEC5D1606F3C7BD8369BD6FFEA6421FC249CDB18FAB5CEC01F43C636F5EF8C856D058E2056FBC9C2A51ACA46077F06008DB8D8327B7BF856FBDA94445CC77FE911D09BFD5AE007AB328DEE801F12A01F5083993CB25AB1FA828E11F2DE7182E6A41E87DF2AE1F39903D00A51777910001A3181AD414AF4480DDAFC88B437632624564738CBFC785024F1D076C9B02E3CDFA0A43C9B537FF785C751975AECC68AA9A8358833BA1FCAEA2207ECEF111E0004CC91606A4E188A114B32D64AB62FCF138E4EA57DA6EE13762D98C4E55478F4AEDDDA73E833AFBFAF321D0BC33FC497562309329E9433877154C3FB5EDE0500E0671F70933ABC0F6DB6EECAF8CE8A2E5803A5F698A1B372E83F535A9F8AA53A619E27004FF7F79E2B238057327937C9AB557DB7CD4EA1C0F23B7C0EAB1E08002C79CB92BE85AC9AECA58774AC1A0E1DAA518BCB373F0A38508C2AB888D39DEBCC73D1E5EBABAF7A446B40E4EE66B949A1B7CB4A2A5DD04B99BCAB748E440900414FD55A288B3216316D410B2600F9BD065DA29541C34364186142573E022377B70AC142012E02C2843AD36F2545FE673F78ED07852221B134599A2944990E006D949261F7E12D18F98D18B74A0761E99C91139A7E45A07862B9C98F5ABB7D37303F30BDE123CA67086A80AD919BF2D85E5E73C2990305ACD83E535911FF0800 -smlen = 2645 -sm = 762DC626A92C49057B3A2B9120C38907FC9A0017FAD2EE8AA26C648215D434430B4A9C00640017C3391D8290C1D7331E1A357731DAA77C5A012E6ACF05075C7149FB93F0602CB775DA201C012FE936276C4D1DC91AF9AF753049D7364D0E0114968AD980E63B22B79EB854DEE9AB1B195B0018C7454BF74E661E50FA0F0FC360E428C7B0008E31383EE368CA264045082C34E126D790BF00D2882BDD86C523CB8550A55359815C4BE70B013035A1DB8AC5F42263E4DF675579E8A03FE10090A3A832154C0D73A19D932D261E83A93BBA00182E991E5213ED59D1FA17808B181A26382101BF96705494B92751D9F1945E4D331AB0B82A01ED9A5004C18F26C6629B7D3A8532ECB6339B00015D74F8039E34E125EAEFF26ED215BE33CCD28E5117C6F331C336039CDE3490B70501462A742E18A230BB371EA908CCDB39239F5F0068B670D9783342698AE77459892D0362215248E1F3AFB19849F758D742F8AFAB595040C4DC520D603C9A80FA9CF2E97E4F4BD7350551FB667D606BDC31A45D88836CD376785C01F9007D47DF95C1F4D1E30A927A13525409D91C9F5145C0B86D3B44E933CA81E4ED9559AC17940C61EB85B2D26D2C47924AB80ACBAA3D9B1C8855C13EE45F5C8047C161AAA5321839A01783B21A5EE90CF91B8285C4779465B7A89DE3D74D482080F68EB2D8B47429D5475356C50A92B3ACBDEA5786F4D6C2A304AB500490F84FD1D0F21ACBEA325D62D2657F3889B6F591A7F63D8633C061CB14B8266A7FE17642DEDF1D08D9FFE369126CD780D9F99FC6262B5BEFCFEF35D33498CB2CFFE55F2F8D567EA8687DFC6E7D49A61FDBFE768C1D11BF5B3B18CA52225B096490C97CB9A0B3B2CA0762DCC36B60F7D26FCAA4E38B1F3A6279D889323010D9CB0A97FC488E09B06237E6EB0166465C2CBC2B9CD06F155759B6C93CA0CD3178845E0F3A2D20A68757AAF3C4E74545494462CCF28F6F51EC0FDFF4F1E6D98FC5B63BFF068FA7BE1764BCF14497E71E424C9389C5DCF8C5CE1DCD40B82F1D75C3C3970DA433A92A04DE958766AC5EB3645F4D21882F7071383AF8DFFD6CDD91B549F143DCF59FED6674441EEB03D5013E90ADCCBD7E3DA115535AC855DBAAB7F51D70630DC00009E726A16DEADB12047D85906CFF315C73EE7D4E24C9067E3B772F3DCC44C25C7CB8622FDD7B8ECF5E9C877838D71D500F864A662619B1478F8AB4DB2DD09A111ACC99ABE737DDBCA06E88926C4E73B5F5D21EAFC4B11938FEEEA5F8D5A4C616A342B54C9CE371817AA2409A55A3237BE85A50F05B33D35AA86A62E85A01CF34EE7DC840A26FA1B8C6B307817C062D9A2E7163A3B036874D2ABF6531A772D4031FDCD59CA79FBF442CB9155F90148DC3B723778E699C6985634185C3FFDB966ADB80A3D1308150B12964142498466506BC0742783C27BD3472A5CB45021DE066C28143FFBC82B5742BE51E93BCFDE1A61E661B730D8760E108B80C859E4B3A07D483A6A8967E5F01B03EC8B63A20C6A03755C75F419558878A5EB8BB0B2120F183E4BECD4A104EB4DB62CACF5F9964583815334A25BDB75724E549211699AC3BC9B2B5F58F1FB33429905DF81C9422F8B84E95A7C36DEC6AE9B48D4F502D8AB59B69E9D112693578D143A3F111EF00844303950F65DDEEA6E30F1286DE16546F90C4364A5C09755AF3FECB13983C418B2FE4AC17BDDA57E4D597E8BDCCBFBE4082C446FC920E5145BBAFC67FADD9799CD8C7714510DA579516ED39B3E22DE319977FC77A9CA61AE8252795D11724AAA866C1FFDBCBC1FF91AF1B8713248864A4E8B9C59DD12863245F5048110DEDE7FE31FF9836715886C37E9642DBD6C668BA7AB8C2B706CDD58586EB7227B5768C3509C1F66493468859E275700EA38BA69064179F6036D7B50BD232B61C9B9659492894C0057DBFB80329A76CDC57B2A89BBB910483301CA0BF6AEC7D5DDF86644FF52F48FF6C7CD00406CACBC09AA251708BAF3276A52BE2C7B42FB6A9036C318529CA98940769A67DCD532C0000AFB5FC63AD2303E94E09D2CB40CCBE47FAA1DD22ECF528179AD40FD4BFD43717864149243D61CA255344C52743200ED8385A7CA6CCA24CF967D23D07DC2A3F9AD5F3240F4F022A6C6CD281B6C492E8D144A2F4641957ECC65B32C9F74BB468524FF58F0F3DA2F5A56742896CC8F99088574264F857DC67CF04C4B63C6A08FC534229CA8BA616CD504F969EA6E3C98A517355F98A9E884062805B77623239074206E01AD2F3FC9FE9FF8254A5D3525C3B2F0A692803500C967A2E18511EF5B8845DC4B0DEE9338C38C4B1B8B84EE63923250EB6F9E9C272617C7895BD538A6F34D3557812BBBFAB2B8FA6EB5E95B9BCE33AD3185CD90DD536A68639022C079B5CA7748864D37D45FA6780A45AA991F28BC0D3BF371EE2FF0C913CEA6DB38E4A278A4840EA1F255F8E83B6B6C5E260A49D727AA42095A88CB8120B51DAFD764E690102F7FA07CEA2EB86AC613E7BE2F498F5767B622D04E8A6F272976FB058C3334CF8CAAD1D180E3456C210763C974E431CBC3E25EAD8B9FF9243628D5B08D92CBF1D5DF29A85B1A04D2999B3C669227B33610121D543CF4A978F8D9365C0FF8AFFA92B07FC8C8604A0F357F3C669445685B6A29898301A5AFBE10ACE8D64A47009C8741D7CE82E9900643900A3B92A26FE5F24886C06AE0918C3F2523C320699C799CBF72F0DDB08A0F1F63D6DC2F021C78A9D44503209190EE4BE654663679CFD292292D71FC4BA6233A196EF9E95CB965852773404B2622B565BD91FCA6747AAF7F4EADED7BD3BB53645381B687AE04B8D8A9BEF1095EEB39A0BEB4EA89BADB4655A1AFC7EECB7DA0D670C192297CCE0B31BBEFEBFE94C84603BA8C0B7CC73159FF59C01A037CF2C866DC40D88432CD6C2F1989351A4E41343CACF7BF2C2B395C863709D6EC1DBAB2AF514CC771DF14DF095DEA8284BE2B65097D8E6F72EF3936595384AFC0026956E819F1657C901B92644E9D6D32D0D95549729B2CB3D5EFAC9C42A5F284ABC3BF5CCA5B08161B09D9A48FFB2996C3D4383D65B8D1F7FC3248CBE84B9C05464F4A76EFA005FEC342EDD56959CD26CB0DAE1B61B0493A4B68EB3D6335BBC280508F09D84E0C5F4EF520D92CD34D69E5BAB76DF5D2B72CB41A298D370EBEEFCD6C1904B956458BDA581EFA6B3654BE402AC3A971603F23F2B543C5BEEDA5F018543B72C146CF04680BCEA31B4A238460329E2BC12F14C804FDA3494C15452223D2477C9C8A497D04EAAE7DE09D7D7A879D3A5DBA565AE1A38F15E69C18838C487C0FBAD44A068C42EFB7D3F5EF488F91C42F25AC564751F0EFE0ECE7D98BB1B3D0FC42C9756F4B8F9DAF1FD0D414391155285C8DAEAAF380BD07E43570F14E9A47A87BC733F1E676233F17BFB71AAE464AED68487392D339AE064AE27BD57F8695F493AE56CA96C0615BDA8DA37133DD13C2B21DA189A7329773FD8D51381BC118645440B28FA4F402EF84C4091D3A0BC4D206BDCF9007F5DE9AA1E6CF7F6058AC6B69FBC703E908C4221F9065147766E48F54BE4B076406E2F9ED19C1BE982E636FD02DC26267C3ED989E6AD1CCE62E7B988FA7C1831E5126111A4C3C29C38A1F96CCB3A04132175FA46F73C634AC6EC741B135645ABF1DCEA18571CF9A539F5CC935BC6D32BEB1C7B8B3B5A141146EBC12DBBCC17BB4900CF0B95EBFAA52190AFC6D8933CAFC9 - -count = 70 -seed = DCC58DFC13B035323ED44BE50A7096F697C9C143518FED50A59181160960203831A9904847BA20B85E99FFA63E4AB0B2 -mlen = 2343 -msg = 954511394B9D10E1BA162861802A717E24EE42A346C9ED280C88E267A41EC09D6D73B6076E7E30257BF265B71A0B6E0CF408F02BA9078811BE94D0F38559E9985463FC9671D182286CC4F18CABCAEE1A3E5ABDBC384FB27911168B54A387171C0524489FDF512E4D8D2F65050CFE7405D8DF63A79C6E42A76F4538907EFF4DC5870095241523F56FE8E389EBF1A1CC47DDB9F0188513D5259BE257BDA5BE7381F22392CDC2406E0F2448A80F3824F2670F61920C667499DE899F0F6B397381A2DE66255E061AB92CD864DE75C9DB7CBAB9FE76AC38E0AB3389530B4004055268B289B40D79B32E5EBCC74353510BD1627E2D5DD0BE7D3DFD04138F6E3EE7526133DC70490612EAA5024BE6FBEFAB24E1E83D8941A113D8B871F3DBC3011869174888CB7A265D7DE9AB99B999C19AF9B442EBDC904FEDAB52CF40B787AAB35626417C5291F2EB892F43E698A8C65CBB6442A4832F33920FB2DBFC50B8E996FB227F2FF294C385A330957D2FADA9F86839235EA79ECDE6D9D94FBE7C79A38D40B9A8F241F53B921107FF1C72624C9600EC04DFA1160F1FA9E5D986A5A363E9CE8627276DA73F5DB47E4B90328884CFE93194CFFA6FA680F77886E4A7A0FDAF13A7DDFF6984B8855E1F58235BABFD5106338FE2B075D4F10A9FB3D3C5F829B7C61B02B34E9BDE6E62CBCC3AC9F467A6CA170EB43E632EBDBF6847F781E2469B4740FDB83DA34CE34A286E3B363A72CBB13EB66CE1DE35D8FD77DBEDBF45C44DCD16E6B58A1699694D9006947C8C20810E85E3EBF8FB2C68B967743642D86556AB6958E545AB83EC24B96F2B4BB99CC8890C3C1E0FECCE26CE09B6D99000694F870AF9F642374FF0BBF61EFC7CD5AAF5667FC3FE5745DFAF7F13FED70FE070EA4C09CB1A92D8B7F0DFD4B4A4B7DCF4CA6A97043BCEF6346F1570F37B0EB48DB8D15C8A82ED69B0C7833D6C830414C111C987471E84D2CEB5BD973DCA34ACD3A65D7B1A502368941935435B78B8F2B74C2BEF127D96651247BDBE68EB7E466B9EA2A64A13C375103D7C8F7D30A13CBE184BD1EBB19F3274E645F5C7B82EFDF09233D8AD146DC0715266963FD3CCE6F8CDEC20743BF1B7F57C101AC24C64D568923203E1A6AF03A700F5A401EC4572BBA528E284C151F1D108F7563858011FAB32B3776CF2B910D7B21180DBE75742032791018258F4D1407C9A213755C5C91205352DF919B6F14BE056243DF6AC2909E52C9A79F6917440667719185F1C5F1AAF40D873BA22956FA0BBAD9C35360853333A10A0841D9D2E758A0B1BC187F6BBD31C41B74F9EEEF1F7A28BDB7AC3D52FDC6FCB3EF0383A06A61188548963E552716D2BFBD6C2DCDE496D06615E86A5CDB76A03BCA2822ABA85EC6807EBB6918AD2948D193CCF74F4BDAF7090CD4294C1785DCEDB6B55886A848284A6A4A88A496800053E84A9F2DBF6B334AACE11A5A540626716302E259A64C6316ED543806B3BBFE37563897E83BBEFA570312DF908C1786DF0FCF55069EDC336501A5AE9D4BF212D56A9CEE811038656912238AE284575EF8DE1285B763AE54ADF44F91B6DD9E309B7A7A0AB71EC2E4611831B3CE1C9DC85CF907B52DF7406B06367E7A43DECE72DCCC57D268820EA021C27056E3C6B50E7BA7A59B53539A6B7B06B35051E3151C23F3BD3C889B25D0ECE1FD0DF1AEDF657FBB096CA1C861ACB0158501EA1AEFBF6DAD11BDC325AC1CED3739A40B7A83458EF4F3453C0F6EABC1A48037809A90480DF9DC4FF07DADDC58DF2733D49A4FA53C2A41E55A4A0167C6D33BA6E752AED3A125DFD6A0322CD235254505D7B3CED7A0DEE7EB662ACFD30F8B79D1A872998CBCF15CD86E26809E0D2DA0324DDC90FD12CAF9D8E4EDA437FE4E658D47D67C95927C4B5DEE965B940CE93E6743917296E10820A7101F8F633C93069E8B569F4625AFD4EC61BFE4549FDD06C2290A91AC0FB40CB1F55DC8BC1FE695C73AF603840AC0351F5256E00555C984E79A09E58C566D1A117B7E569BEB5850FB491FD9B982442B55BDF53832AA65180DCDDC2F768B1A1361994DE8C25F3608EC853D5982E0AFD1F9FA70170FC3589DDAF958DD840B4B502F8E2697D01AD7AC2233F6A16D540EF8D232887D2B4FA727AE2F038A69AF3DAE69EDA8EF6BF1E0B67D811160B75231543EC5A4D0778B7B42FC1DD6732385AA4400450B3CAEEFDFFCF147635CFA4AAA53DE4EE3035BC40CE8670016384BB877A86A15B59F3DF0C5D624D3D2B23EC46913618C745330A96C715C6F0BD096487E89B917384CC30B3D20A332F1B4056462227E98AF9874FF1D18DF2A6BF84AE822EE737F9E34EE8C69F23EEB9BF38ED056F499545F405759355C104284A6D08A9EFAD8FE28288B2084336A6479A6D42404F3E6FF3AD1DFC63C8AAE971AF11F2699F32F57AD29188492CE07BC1A271035B4D13A686EFDE5572353283A0F3138F6DC05CC35E5E5057C5C8B9E12B0164C0915ADEDF40A6E23848FA59ADC0E65BDD2120486942F232315FC94B4676751A35AAED2828889864C4CB7DD95A662A475733C2CA8F6997A9C822C6C8B9DC95A8B4C367E613E97D3EC6D6DDC2F81022EC21B3A93244E3BC8C2737A7724A3CBD480B26819EEB2676FD383601D79FA266ED3F9BAC2A98FF0109AD7E43E33E108D88C09BA82AFCCCFE98F50F789109D99DCD0A2C61947544F3666EDC621B5D5ECB7088B2430A611BEA52BE7F5EDFC6E2649F5E81F6DF72FA9A748BFF06AF766A60D2B751B23A8AA95CBF733359F7C0CD19B1482A6E6572D1570349C688D78CF8B8C7DD37576DC47A193A2C2797D0AF7504DEE303823A8B77204AE7B6E91D431979798A7EDF435056251D0E3F26B2CA16BFE3422CEA0398D30F0A0DC06DC8A93D27D13650E5BFB6BA04C93FAF0D7D06F99FE4F1F52A059FBE808179515FDA48ECA714F0947FE9A98F02D66FB0D80952411CDFCEAEF6ABA16D92B8F1B82DB151D7DCD7FB7781EC55F4A86C86011FBB9C5570EE76897E7803036E2FE3CDC2D5EA7A613897F3C69A6EA734E3811BFD15E90D7256A0C0C88CEB54EC6AAC151B435CD2A870E4A02087C2B847C75B00B44BB3CA6D4404C3052BD308B8D5F595277592D26F6D5A2193CD4D650BF931FEFB9DEEE61032B29EC0412F38E1CBE025B2891C59574C1450D9E3D8EF27940EF712143F06F38DDB86341A7FC781E0FA8971DAD13AA7E93F1858C70A71A40164211EA9F6A41AE90D19032C2EA52C23375CE3C4E59599ECD6855213AEA83F8DFC5CC70F58A62E4DCA17C09705C0C099B29056592986C03CF5D67074735F2BEA -pk = 9400934FEE279129315336ABB36F0010EFCE7346B7C558D3B09158D2E17D15C5B4C0F2B0F5515E099CCE27817F5D6F995C7F4050493EC534A5B484343CE10200994D7683425A1150927BB525B17F0D2ACDB701A01432D8CC2D137016C4FF3407D422D991063F373C7CB493E47D2FD5C45405134EF1E9EAC2643526CCAB5C1700 -sk = 9400934FEE279129315336ABB36F0010EFCE7346B7C558D3B09158D2E17D15C5B4C0F2B0F5515E099CCE27817F5D6F995C7F4050493EC534A5B484343CE10200994D7683425A1150927BB525B17F0D2ACDB701A01432D8CC2D137016C4FF3407D422D991063F373C7CB493E47D2FD5C45405134EF1E9EAC2643526CCAB5C170002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A2676689E280D3758C37DD93EB2C374A57351B4A07DC1919610E9C567D9403FA22DF3F215204ACFC7782AAAAB136922905B5C7D968F613F928AAA4D16037B6CFD66D99B54673545881BAE7E3635D41C2619533864F68A9C187FCFFFFFFFFFFFFFF9902D1C6EE6F3D73AC8ECBC4A4B6D84DE8A4ED54C5E924E276355D4411AB55515153775910BE9CA20C3B1E76564349659F7710E7B7555909A3F4ECC4E97BEF8CFE28E74852813D0D6F285DF73E4FF852463B3937CFC64E025EFCFFFFFFFFFFFFFFB7CCC68B71A7BEA10DCC1D083E94493EDC48F6EA8EAA0C2EBFAB96C278E072DE826CB05C4A3D108BBA1E6FD3719410D0B887095FA8FCC438380D040000000000000000000000000000000000000000000000000000000000000000000000000000BA84EF77599729C82BF9429EE05F4A91519E2BD7B0BF8E4E90659359C12E65DC7AD0BBC8BEE81D219F725546B3B0EA88A8824A3567ADBFDC5E3F02000000000000000000000000000000000000000000000000000000000000000000000000000056E85F238D338F0CB5148248789C23D7E298B10BC1AA3C2DF7398A3AA657FD7ABA410E1CBAB3F499BA8770D5847EBC5E84D623503BB0D71D948D70C9A9B71D00D455882CCA95AA760DE3130CF8D3E4A919C6870040AB5F362F9A7858ABBD0841F0C7DE4C37BED9A14D2AACC232FADDAAB3B703CD72CE14270CD5D4843A6924001C89FE927ABE32A5D863C6F1B46C5AF31166A1F85328F0834A47B3CBA69F4F17BF72E5913541F6DD3BC2F9A4CB5AA1309CA5010C16EB44C7ABE73EA68338050074554E26E737C6405073A25614B1688B42F5F576830562ECDE35BB3DA2ECB31B420A4B27D438DA3ED1DEEBDFA79543C1FD6D1E5A8C3EDC41583F844B366C1C0054FD30BB8E71EB511E1A43920551C623A3F7CBCB5DCC80709027F9E610F3750FC11CB7496C4C4FDEE26D7570504E6435DB22812D68D3C993A512AB310A1B1500C890FF480713C642ED602D4C33F6B406C39B6DC4F8E90361F4FA492EBABB103D1DC50B8E9811A907A5C6DE546A854F6462C5FBE6C923D08399060FB527430C00D23BCE7CF4C2447406FDD4388E07544CB18E78427342B4CF1B319DBFACA3FA2CE357720D21D2A73E115ECD0C7CA711D1A1C2D0F7AA1ECE61A2B3E817F0850600B5510AFF56ACABB608FBE3986E579B5D9CD2021C75CD6DBE046E4E229A48906104D7D7EA32B5A14D2DABE090E15EC417429B360453A784EA82C452E6BE200B005943594DE4C1E8C3942A7B029DECDC4D38D2618123F25E6D27C97C86A929C9B194AA4A841EA19025631DD849ED672DC902C965817894C0677CF1992FD90411003BB61BAFAD73C5E60E9090E627C1AFC225377E532B29D8871D1E965E07587FEF565482F982118A413F7D8719596A93F4221CE9A180A7A362205CB06005672000FD71F795ADB0E010E815A8158785CE3483F21B41DAD3BA773D16891CEB3CE098480B7A261FE136FD9BBBEF7C8960664A53D8B3710C9146D86D7DC21B34FF0E00F8308116B3BFD06754B0AD89C18215015E72AEB0876ADBB46D39241D9449A2F1071BB2819B4E59844F394A0D8253F6B598344430A10113FECEC497A5B8A10D00575713BA2BFE59113B14DE00BDA012445A2C84C90DE4C154292B84113271C410AC5D1B00DAE54CB534D88AC49DC96EB7C79A387ED163F94DFF7AE3F6B09D1D007CC17626729CDDAAF9371E31AE0EB9D3BB6F192217688A24DA09AB21EA7262623D131824BEDB8184D6813CDBF5110E65569BCC2D3A63BD5ABBD54F026E631A00 -smlen = 2678 -sm = D01B47F3A4C304536DD5F6236EECCAD248B701667391B887D2F77C60C9863985CB3C044B23002BC179F762732D1F0D163ED7FB88C629FE4900A1D91CE9B257EFCFD9A99CB89B4A30E633E301FB463C494D09FA1D155AC6F0885374185E5E01AA3C1D497333FE72461309C4B6DA91A3067C017F655E160063517BE622059337A27DB2EF2E0020223E0FE1C99DEAAE9F0441E081BB3041C400B042E0CDDE7DB42D264A04900430DAF436BE01E39B79A84BD3CA55AAC31B5787761C18815000AB899FBE2F57B22506B041B02CBA73243E2F007086CD8C8A2B68FF5DCE2E74FA10267B6D5200337E8D62FD2B7E246DDA614BC3526336BD1401CB76A8AD7A7D5DA5DFF260017FD6111A16C701014FC6666F64C3E861CD41F48C320D0F626D2F5825EF8D66D5F752FEC251FDCD7103034D069AAFAA6A0F8219358E05C3382667FC2A019E5A5E998AC71CC3A278CF9D2F1C00954511394B9D10E1BA162861802A717E24EE42A346C9ED280C88E267A41EC09D6D73B6076E7E30257BF265B71A0B6E0CF408F02BA9078811BE94D0F38559E9985463FC9671D182286CC4F18CABCAEE1A3E5ABDBC384FB27911168B54A387171C0524489FDF512E4D8D2F65050CFE7405D8DF63A79C6E42A76F4538907EFF4DC5870095241523F56FE8E389EBF1A1CC47DDB9F0188513D5259BE257BDA5BE7381F22392CDC2406E0F2448A80F3824F2670F61920C667499DE899F0F6B397381A2DE66255E061AB92CD864DE75C9DB7CBAB9FE76AC38E0AB3389530B4004055268B289B40D79B32E5EBCC74353510BD1627E2D5DD0BE7D3DFD04138F6E3EE7526133DC70490612EAA5024BE6FBEFAB24E1E83D8941A113D8B871F3DBC3011869174888CB7A265D7DE9AB99B999C19AF9B442EBDC904FEDAB52CF40B787AAB35626417C5291F2EB892F43E698A8C65CBB6442A4832F33920FB2DBFC50B8E996FB227F2FF294C385A330957D2FADA9F86839235EA79ECDE6D9D94FBE7C79A38D40B9A8F241F53B921107FF1C72624C9600EC04DFA1160F1FA9E5D986A5A363E9CE8627276DA73F5DB47E4B90328884CFE93194CFFA6FA680F77886E4A7A0FDAF13A7DDFF6984B8855E1F58235BABFD5106338FE2B075D4F10A9FB3D3C5F829B7C61B02B34E9BDE6E62CBCC3AC9F467A6CA170EB43E632EBDBF6847F781E2469B4740FDB83DA34CE34A286E3B363A72CBB13EB66CE1DE35D8FD77DBEDBF45C44DCD16E6B58A1699694D9006947C8C20810E85E3EBF8FB2C68B967743642D86556AB6958E545AB83EC24B96F2B4BB99CC8890C3C1E0FECCE26CE09B6D99000694F870AF9F642374FF0BBF61EFC7CD5AAF5667FC3FE5745DFAF7F13FED70FE070EA4C09CB1A92D8B7F0DFD4B4A4B7DCF4CA6A97043BCEF6346F1570F37B0EB48DB8D15C8A82ED69B0C7833D6C830414C111C987471E84D2CEB5BD973DCA34ACD3A65D7B1A502368941935435B78B8F2B74C2BEF127D96651247BDBE68EB7E466B9EA2A64A13C375103D7C8F7D30A13CBE184BD1EBB19F3274E645F5C7B82EFDF09233D8AD146DC0715266963FD3CCE6F8CDEC20743BF1B7F57C101AC24C64D568923203E1A6AF03A700F5A401EC4572BBA528E284C151F1D108F7563858011FAB32B3776CF2B910D7B21180DBE75742032791018258F4D1407C9A213755C5C91205352DF919B6F14BE056243DF6AC2909E52C9A79F6917440667719185F1C5F1AAF40D873BA22956FA0BBAD9C35360853333A10A0841D9D2E758A0B1BC187F6BBD31C41B74F9EEEF1F7A28BDB7AC3D52FDC6FCB3EF0383A06A61188548963E552716D2BFBD6C2DCDE496D06615E86A5CDB76A03BCA2822ABA85EC6807EBB6918AD2948D193CCF74F4BDAF7090CD4294C1785DCEDB6B55886A848284A6A4A88A496800053E84A9F2DBF6B334AACE11A5A540626716302E259A64C6316ED543806B3BBFE37563897E83BBEFA570312DF908C1786DF0FCF55069EDC336501A5AE9D4BF212D56A9CEE811038656912238AE284575EF8DE1285B763AE54ADF44F91B6DD9E309B7A7A0AB71EC2E4611831B3CE1C9DC85CF907B52DF7406B06367E7A43DECE72DCCC57D268820EA021C27056E3C6B50E7BA7A59B53539A6B7B06B35051E3151C23F3BD3C889B25D0ECE1FD0DF1AEDF657FBB096CA1C861ACB0158501EA1AEFBF6DAD11BDC325AC1CED3739A40B7A83458EF4F3453C0F6EABC1A48037809A90480DF9DC4FF07DADDC58DF2733D49A4FA53C2A41E55A4A0167C6D33BA6E752AED3A125DFD6A0322CD235254505D7B3CED7A0DEE7EB662ACFD30F8B79D1A872998CBCF15CD86E26809E0D2DA0324DDC90FD12CAF9D8E4EDA437FE4E658D47D67C95927C4B5DEE965B940CE93E6743917296E10820A7101F8F633C93069E8B569F4625AFD4EC61BFE4549FDD06C2290A91AC0FB40CB1F55DC8BC1FE695C73AF603840AC0351F5256E00555C984E79A09E58C566D1A117B7E569BEB5850FB491FD9B982442B55BDF53832AA65180DCDDC2F768B1A1361994DE8C25F3608EC853D5982E0AFD1F9FA70170FC3589DDAF958DD840B4B502F8E2697D01AD7AC2233F6A16D540EF8D232887D2B4FA727AE2F038A69AF3DAE69EDA8EF6BF1E0B67D811160B75231543EC5A4D0778B7B42FC1DD6732385AA4400450B3CAEEFDFFCF147635CFA4AAA53DE4EE3035BC40CE8670016384BB877A86A15B59F3DF0C5D624D3D2B23EC46913618C745330A96C715C6F0BD096487E89B917384CC30B3D20A332F1B4056462227E98AF9874FF1D18DF2A6BF84AE822EE737F9E34EE8C69F23EEB9BF38ED056F499545F405759355C104284A6D08A9EFAD8FE28288B2084336A6479A6D42404F3E6FF3AD1DFC63C8AAE971AF11F2699F32F57AD29188492CE07BC1A271035B4D13A686EFDE5572353283A0F3138F6DC05CC35E5E5057C5C8B9E12B0164C0915ADEDF40A6E23848FA59ADC0E65BDD2120486942F232315FC94B4676751A35AAED2828889864C4CB7DD95A662A475733C2CA8F6997A9C822C6C8B9DC95A8B4C367E613E97D3EC6D6DDC2F81022EC21B3A93244E3BC8C2737A7724A3CBD480B26819EEB2676FD383601D79FA266ED3F9BAC2A98FF0109AD7E43E33E108D88C09BA82AFCCCFE98F50F789109D99DCD0A2C61947544F3666EDC621B5D5ECB7088B2430A611BEA52BE7F5EDFC6E2649F5E81F6DF72FA9A748BFF06AF766A60D2B751B23A8AA95CBF733359F7C0CD19B1482A6E6572D1570349C688D78CF8B8C7DD37576DC47A193A2C2797D0AF7504DEE303823A8B77204AE7B6E91D431979798A7EDF435056251D0E3F26B2CA16BFE3422CEA0398D30F0A0DC06DC8A93D27D13650E5BFB6BA04C93FAF0D7D06F99FE4F1F52A059FBE808179515FDA48ECA714F0947FE9A98F02D66FB0D80952411CDFCEAEF6ABA16D92B8F1B82DB151D7DCD7FB7781EC55F4A86C86011FBB9C5570EE76897E7803036E2FE3CDC2D5EA7A613897F3C69A6EA734E3811BFD15E90D7256A0C0C88CEB54EC6AAC151B435CD2A870E4A02087C2B847C75B00B44BB3CA6D4404C3052BD308B8D5F595277592D26F6D5A2193CD4D650BF931FEFB9DEEE61032B29EC0412F38E1CBE025B2891C59574C1450D9E3D8EF27940EF712143F06F38DDB86341A7FC781E0FA8971DAD13AA7E93F1858C70A71A40164211EA9F6A41AE90D19032C2EA52C23375CE3C4E59599ECD6855213AEA83F8DFC5CC70F58A62E4DCA17C09705C0C099B29056592986C03CF5D67074735F2BEA - -count = 71 -seed = 270BEDAA7BCD43990FD8B4F44FFB63A3AE8E991BB2BF84DA7BC2CCD1A079C579AEBE2082ACBAB7FF286DE795F31973B4 -mlen = 2376 -msg = 326A4FE723BE9363ACFC000705A10B6CD8A7B25E99A34B4A354CBD6F50550BED30F6C4208490B4194AB79B24B093FBE132C299DF924F2FFCC2CDC6C2C9019EEDF4B72D7F0817825BD787135927102E1DA041E9A78B501B42DCE777A79ACE604E57DF11775D7B87E75E5B00ADAC90D1ADD78CC5AD348C7472EEC6E6E06F737E77115A9509A6AE6570F738DC2F21314A7CCB9D44ADD6E1434CDFE3614BC73A6B468F6691B60F4F2DB103289A90C4FB2BF5AAF87826D2BEB0880FA64E07E9BD30D4EDA00D6BDA01D1EB22BCF14EE797A859C9A0D9034E8C5316201AF91388C47E1DDF061C9F45E067A5F60B355C98F8734559B8F1B82F47BD9CEE0224A1D67D40706333523C34F3582B6C8CB47BF7D0E4FBC7D7CF3DBF21077E664FD59998338F4DD4A423C3A145EE1E994AACC1A48F81A7E9FE106008DB93A6626B8C8505043AB864D93AE3972675E69C3825304086AA3419216CCAE7F7D5117739E99D8F4A0B658148DE33FDAAEB9967EF56677D2028C3B584C5CC1C096F4DA16799408B2EE2FC3482AD2F49293CF4097A78492470099BDB90BCB4FE3B245AC8B3C53E05D7609E34770ADCC147033A8FADE81359FF63C3FB90C5A498C98B7A0E5EE9CF4D287759ACDA4BFA3965CA85E1D1C1019E7FE6D82E5E66A717F94890277E6DB1EAA6F3291FE1BCD7D437094749FF5574B8728E0DC21A143A14E382937EFB7EC1B0FB3F6F9C0F547F470E3B436DFC7986F923BEAA89583D8978C433E0CB0C4E98516AF1AC797C778662455A57FEF45BA2C7865C1DF5C502EDB01C8CC729468091BB96BE9DA9C298528187867EEE9A06141DAA15F60CF719DE2BD15010550B92A41F12D8F38B54692589AFF51A9D5E6047A0D9B707369992251DF31341A45B01B05FFED8ADEE5810824F903EA59F14FD500AEDAE797F8BAEB470C0B14C4EDA5C687E4848A85B30A8E8F59C45D4C9F0C65FCCB15F4D4209A55722C29B6CB09AECB4E53FA3AA602C56EE3BA6900CC12889E7B87D5EF283AF1586764519A30CF60833C82F0ED15E39A8BCAD5C6AEE9999E63D399C5CEA10AE1F53B04858EF7896AA29FA541451FDB685734C39470250545193CAF26C9891F7F965904AE10E8566BFF9B2F465BBE13D6EA4A79586E68844B9FA68B2F992565C8B0EF5FFDEB5878CC12A0571CA3AEA50ADD29DD06E13741A1AB215BF487BE7735D1634332F47E037253054A21E0AD8D8F011334CB5951F833D4D344D632BCAB7C373CB7DAFE8F3D79E7E13BDB1C6CFFA474A9FBB46F5736D55F3466534596EBD22B29107A8FA50C1D0E62F0533E343FEE038FC0C3040A6DF2D318BBC8420019B1B148D6D1DD2FE428C2FD617CA73F224EF9AF9BF6F83CF1006616235471B69DD4EAF9F32529EF3E1DFE6765E61E246B519C702351C9CD66C57065EC78993D793B082E3685EB06F2530B07862277D339A52813C99EBE16C06C4C8F547D9705850E770982E8FA0275A52F430FF2422A115ECE46A9202CAA0195789532B1444F1507AAB2E4303464E499989F21C7D881328F18DBC77D4B9B467CAE244A93053C0321DFBF815DA28B6EBF483EAFBE634E9947BB5383FEE3A31BC03A63FCDDA5E3E46D5D3184718C348A83975728714351DF43BAF91787CACA346DBB819602F18A4C4FE90C4CE307984BCDED89CD2E4AEB66318C10D95AFA5BE53393FEB981C21BB1411BB9C58818BCC141223D66ED5F35F90C05FD4848617220DD72F5E892292CE20AA9A0F9AD54022CBE94D2C86DAF3FC66949AC35D8E122B02E2D155E73F4CE24D7E85A5C301DCC173CA8EC090AF9DC7F443C983280DDA27ED4B9BC71F86E84F7AEE39E6A7E9BF5E43920AAC858F0F49A06216D9D3984CD2E3575C0FA6CE8A5E28B0F481CCBAAB450FABCE8A1084EF458DBE257CF09D8116136C2CF1EDFA6CCE31AED0F1F8278C1C8D9C79846886D48E3FD311C015BF2373F7CAA71AA26B011D0DF5A843AB53D7E7F0466CCF49C5D4DE872CA87B8895101EE0147A3DBD391BEED75FC16F65814D56CB29273A5F4E5400FCABF85040505C31D001DF0023726E9C1F7C29A37039FDDA73B9B99ACEC3A029F7C0DD61ADE7D5E835E1CD605AA8E583BF8DC99285E86CF91F4B4827A0E8956EFDE2B495A86F85E78B954341CF3AFEBE8DB71C26B9B1BA27B47284AA84E55B1C2AFEE733AC596A10186D9AB504F33E34A06CA931D7633462B04B9B2B0D4751B0343503BCB2A1893D944FBDB4BE63DE167348A1588E6551FD9CF2101B0B4CB61422655FBEB50D64CB9E87A23007A39821EC3ABA391485347624EFC3DFDA4A133C537D7CD8C3A549BB6BEF9A52D2EDF0A8892C6FC3EEC3EFC3C18741C85BF24CD3B36CA04EE77F654ED5595A0E4B9316CCFE4D2AA6B4A66B06F309337E363C9E39829C8838729F19811093DFBE962246473B7A19FAEDFDB0193F63EB85EF308CD3BE5831F35CED36D9448D0EA8306044F78946079210CF89FF78104BCB2964CE2AF9954D53885D7914E4FFA4AC7E9B3D103922FD1AD68C0A4592F885C5FEE51D52214E17035E8681086203B79B5EB176679EB3263B44EA7287262DD84BB98F6639B9657AC04E397D69C634A0C1181ECA485E467D62631AD2D9AFD5AC5B86ED4005FDBB7404B65BBB826F1A2334A481B9CD46E0CE9C414A162E84368089F24149D7D05EA6ADF40B25A708357AAA5A28801FF100F69252810188CFC6087507BB5BDE1CD43BF72B1B3207CE4F7E65A18E5276613D4BEDDAF21AF7B964FF69965C47CB03846F7CEDDD2C5133080FC632A4F0B3495B2D2751727CF7681F28675552DF2A0994E425A922BBFCF84189B8C9F43058D691DB3166C596F6BC480EFDE06BDAE7B9C2985A1F2F6441520620E193D7B94AB46DBA2A1ADE44E2B006734E6770F34B0E2122DD7F4EAF045164DEA8C2FECE7758630384C00A6B528A6ECF07045B2DC0281C936A540904733149BC65B0F57ACD9A5E41C2ADF83FD6A760B169BEEBF04644DB1314270ADF86D01CC2CD580C609E78BBCD9D2694A89F9CB6DD36B9AA2AA5581FF561B5417BE2B52F3EF2581E461CB0690782F33862C52590643BECE0A6141DC805D8F56C4F64C1BBC49A3ECF1E8827926796E5F9335DF47DA6D3E4C14795B547116FD1F3351FC55C28B543183FEAD8DF7DA4DFBCC38E224901FF7BD83B16631064CAC4A37FA632F53F004374AA19861FDCA515AF91E66186EF804366D5A1B3B4FAAA60A0C4B36B972A9579548B4CDACE7EB85F1F68A4E4255FD994C1786975E7F6F0BA87D0295DE72876BCE37146A09EDEBC0164B9C4911CE41EF4D48130A27651BD0DC315FD622CB6D03759D35756806332658B5B33E768860C1946569AA45130486AD49B -pk = 5C5FCE5184FD9D42E4FB89516861EBB05714379C6BB818507B158BE409DD32CFE42743C0183BFB3D3436A884AFDE62FEA56402BD97867CEDE7162775050725008555CF0ACBF80A3FF9AA4DE16B64EC034484669694976D7625E6C5E91CCB9F6BE40DE797C29E442710FFA860D535903AEE26F64C44EE2816BB2A29FC7F510C00 -sk = 5C5FCE5184FD9D42E4FB89516861EBB05714379C6BB818507B158BE409DD32CFE42743C0183BFB3D3436A884AFDE62FEA56402BD97867CEDE7162775050725008555CF0ACBF80A3FF9AA4DE16B64EC034484669694976D7625E6C5E91CCB9F6BE40DE797C29E442710FFA860D535903AEE26F64C44EE2816BB2A29FC7F510C00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001FED926CD614BD528E8BE9BBA1E6A8D58465FE32050922B160077B87B88666868E91BA5138877E5E444F930AEC7738A4E2C717C461D39FC8E04F11AD1D7B00E9E038EE4F991404580ACC7731E381D5EDF74D10AD913ECF38390F00000000000000A20943D1DFF617153E78EFCB75CBDAE64BFB42194D3D1C14388C6ED1F8ABD21596F867800DDC300BB67AD946B1B4FD0D3A79C6878C1D356212BA3F5C0D3B6E6D7C3CD44D5A98FF26867E7D3082E252E65414158DD183C1BADAF8FFFFFFFFFFFFFF622EAF3F52EA9ED60977AACAA41756889FBA6A4B358A2230D88AF0C9B450240FD5F9524C2023462EF7CA77AD17F0C3C8415496F9C20A0E1C104F0000000000000000000000000000000000000000000000000000000000000000000000000000009F06B43A2C166A4B1B84F625E3E65E3303AAE94A88BD2723DA925574BD36813F1D89AA23D57BFBCB552AC2DA3C1AE3A88056C50F76C756EF00D70300000000000000000000000000000000000000000000000000000000000000000000000000009E37D2D478DCFF0D573A6E5A898FE3ED89A5F93D055BC0621E5C40960B25D238097F9E479A1709279D1759F10D500F8B8AB4C1CF45DC61650BEB22612CA11400584EC01C8A956BFA0992EF1DD1E21EC051CB57BED771167A8EF0728D22509251BE7E114E9BFE3F867A8904681D5903AE738D106A8CE1AA6D8005DB87BE6B0A001D250616B33686E25E283F4C02BFAB5F69BA90A9F98F851F8B7A2D1697A32857AA466EC9256DA2777D7B3EE16CE908780327E99DAD0BB8D4519529F6CD991F006D8F0B2CF1AE68BE0883B3E90A9FDC7F2473EC78AA228AE79129D9877EB74799ABBC93ED4903C425A36A8EA7733F011EC2FBE894952BF17F022BDDBB76CA11008FAADCC422EF2DA2DFC8E8D40A873193AC4FF9F1AE70A26AB98C66901BF78B26DE77087321B936D7E7611D69259969FFA8237026A70C4044CAF265CF7547170039C974D2D3319C3697D044C16BFF02C8DCF0219CFEAB44BF5513CE5F33DA9061C7BD2069A79F8AC44BC2C3F93862D2A2791FA4305A7EB8A0F28FDE8FB8551E009CC594FAF66D429C1CE1728C11516E6CBCF2FA32931C6A3B0DF4E0E1E1A805F974F34636B1EBD0C5DACBFD9E7D89300EB95C2C607D549D2063B8A9BFE82F170068B6B74F5C0F929EB055CEA49B5FF24F9DDD39A1950CD953980AF4AFEE29FABB816606FB47395C3B6548B3D6B8CB64D71E70463BC903CCE84D056696F3981800793B990ED6D34099F6D7DCE14382228F426F658B8F8FED5B9DC093415E0EACE8F13B440A71AC2BD886F91F74D6708A8DC2EC222E15E6DEA8902D220168B51F00F2576C3ED97F2411BA3A4630012E59B4695D67076DFD08E786166A4834D6D759D2C630DAC7B2055C36C51A849A908ACE057C83A39E493A6BF251D4A4AAB00D00D07CDB9B27E229D0875322382BEDA084BEAEEC60BE2BC2633C362AE39DAF634C9ED90AC2268561D804AADC239BF63E773EAC3A9702E4BE31E9AC06EBC16A060091D0265E210C676A8F426D7F7781ACED6DCC98062D12EBA7A6E379940331BD20EEF0BFFC246ECCCE3529C061AE4EB37319820BD4F41580CFC448F769AE7602008A2EB4D3DDA27A22FC314254B06748AB4E2AF608FCF7EAA4CC8E9AB8E0356979C2F1641084B6DB8A7294AB854E584DD14FA78F00D384EE7292C1B171D2F720000032DFF7738FE9F11A43F6742EB6D90A5CFD82EC5D6004AC9F7F2150AD511BBEFCA541FCDE2BCF0149757BE056CBA336DD81236722D174E498F5AA297CC80400 -smlen = 2711 -sm = 2ADC90E5AC32AF84A88D25E823A5AC6082B700CE5E7C2A86F68D08F53AA462842AE001E4B10160BFDF787490A4311FFF364FBB65B27C76E101012975B165753B530E2287110584B45EBC6F00AD650598082D3A1CD52EE66414C3817B58DE0025FB49E553610B248718445E89431D1D171601A9B24BC3A8AAE397859FFDF8B3C7CEB0534E01F82117DE34A4FBB791703D4F38942732E39B01FA4BD15C11F353F1151F11F9B68C81001498007F461D2BD2DE9C3A44CD83B350E362D20BA40101DD6E2E632C79B9D5331F45162D00EA3AD801D1E5B896B5EAB448D098A04A904DDD1C2A7D012A52D8CA33FEDC856B91D865E84BF991DCC4013FCF43808AA5951EAE440B6FD40DDB0E57F001000D77F86210AA66FCCBCF58C0E3B049EC9D9E7592EF66CA3959A6F33C01CE23FF0503CB6688BDF1D631854846AC14CC299B66103E0031510979AE233537A9EB7EC70F7301326A4FE723BE9363ACFC000705A10B6CD8A7B25E99A34B4A354CBD6F50550BED30F6C4208490B4194AB79B24B093FBE132C299DF924F2FFCC2CDC6C2C9019EEDF4B72D7F0817825BD787135927102E1DA041E9A78B501B42DCE777A79ACE604E57DF11775D7B87E75E5B00ADAC90D1ADD78CC5AD348C7472EEC6E6E06F737E77115A9509A6AE6570F738DC2F21314A7CCB9D44ADD6E1434CDFE3614BC73A6B468F6691B60F4F2DB103289A90C4FB2BF5AAF87826D2BEB0880FA64E07E9BD30D4EDA00D6BDA01D1EB22BCF14EE797A859C9A0D9034E8C5316201AF91388C47E1DDF061C9F45E067A5F60B355C98F8734559B8F1B82F47BD9CEE0224A1D67D40706333523C34F3582B6C8CB47BF7D0E4FBC7D7CF3DBF21077E664FD59998338F4DD4A423C3A145EE1E994AACC1A48F81A7E9FE106008DB93A6626B8C8505043AB864D93AE3972675E69C3825304086AA3419216CCAE7F7D5117739E99D8F4A0B658148DE33FDAAEB9967EF56677D2028C3B584C5CC1C096F4DA16799408B2EE2FC3482AD2F49293CF4097A78492470099BDB90BCB4FE3B245AC8B3C53E05D7609E34770ADCC147033A8FADE81359FF63C3FB90C5A498C98B7A0E5EE9CF4D287759ACDA4BFA3965CA85E1D1C1019E7FE6D82E5E66A717F94890277E6DB1EAA6F3291FE1BCD7D437094749FF5574B8728E0DC21A143A14E382937EFB7EC1B0FB3F6F9C0F547F470E3B436DFC7986F923BEAA89583D8978C433E0CB0C4E98516AF1AC797C778662455A57FEF45BA2C7865C1DF5C502EDB01C8CC729468091BB96BE9DA9C298528187867EEE9A06141DAA15F60CF719DE2BD15010550B92A41F12D8F38B54692589AFF51A9D5E6047A0D9B707369992251DF31341A45B01B05FFED8ADEE5810824F903EA59F14FD500AEDAE797F8BAEB470C0B14C4EDA5C687E4848A85B30A8E8F59C45D4C9F0C65FCCB15F4D4209A55722C29B6CB09AECB4E53FA3AA602C56EE3BA6900CC12889E7B87D5EF283AF1586764519A30CF60833C82F0ED15E39A8BCAD5C6AEE9999E63D399C5CEA10AE1F53B04858EF7896AA29FA541451FDB685734C39470250545193CAF26C9891F7F965904AE10E8566BFF9B2F465BBE13D6EA4A79586E68844B9FA68B2F992565C8B0EF5FFDEB5878CC12A0571CA3AEA50ADD29DD06E13741A1AB215BF487BE7735D1634332F47E037253054A21E0AD8D8F011334CB5951F833D4D344D632BCAB7C373CB7DAFE8F3D79E7E13BDB1C6CFFA474A9FBB46F5736D55F3466534596EBD22B29107A8FA50C1D0E62F0533E343FEE038FC0C3040A6DF2D318BBC8420019B1B148D6D1DD2FE428C2FD617CA73F224EF9AF9BF6F83CF1006616235471B69DD4EAF9F32529EF3E1DFE6765E61E246B519C702351C9CD66C57065EC78993D793B082E3685EB06F2530B07862277D339A52813C99EBE16C06C4C8F547D9705850E770982E8FA0275A52F430FF2422A115ECE46A9202CAA0195789532B1444F1507AAB2E4303464E499989F21C7D881328F18DBC77D4B9B467CAE244A93053C0321DFBF815DA28B6EBF483EAFBE634E9947BB5383FEE3A31BC03A63FCDDA5E3E46D5D3184718C348A83975728714351DF43BAF91787CACA346DBB819602F18A4C4FE90C4CE307984BCDED89CD2E4AEB66318C10D95AFA5BE53393FEB981C21BB1411BB9C58818BCC141223D66ED5F35F90C05FD4848617220DD72F5E892292CE20AA9A0F9AD54022CBE94D2C86DAF3FC66949AC35D8E122B02E2D155E73F4CE24D7E85A5C301DCC173CA8EC090AF9DC7F443C983280DDA27ED4B9BC71F86E84F7AEE39E6A7E9BF5E43920AAC858F0F49A06216D9D3984CD2E3575C0FA6CE8A5E28B0F481CCBAAB450FABCE8A1084EF458DBE257CF09D8116136C2CF1EDFA6CCE31AED0F1F8278C1C8D9C79846886D48E3FD311C015BF2373F7CAA71AA26B011D0DF5A843AB53D7E7F0466CCF49C5D4DE872CA87B8895101EE0147A3DBD391BEED75FC16F65814D56CB29273A5F4E5400FCABF85040505C31D001DF0023726E9C1F7C29A37039FDDA73B9B99ACEC3A029F7C0DD61ADE7D5E835E1CD605AA8E583BF8DC99285E86CF91F4B4827A0E8956EFDE2B495A86F85E78B954341CF3AFEBE8DB71C26B9B1BA27B47284AA84E55B1C2AFEE733AC596A10186D9AB504F33E34A06CA931D7633462B04B9B2B0D4751B0343503BCB2A1893D944FBDB4BE63DE167348A1588E6551FD9CF2101B0B4CB61422655FBEB50D64CB9E87A23007A39821EC3ABA391485347624EFC3DFDA4A133C537D7CD8C3A549BB6BEF9A52D2EDF0A8892C6FC3EEC3EFC3C18741C85BF24CD3B36CA04EE77F654ED5595A0E4B9316CCFE4D2AA6B4A66B06F309337E363C9E39829C8838729F19811093DFBE962246473B7A19FAEDFDB0193F63EB85EF308CD3BE5831F35CED36D9448D0EA8306044F78946079210CF89FF78104BCB2964CE2AF9954D53885D7914E4FFA4AC7E9B3D103922FD1AD68C0A4592F885C5FEE51D52214E17035E8681086203B79B5EB176679EB3263B44EA7287262DD84BB98F6639B9657AC04E397D69C634A0C1181ECA485E467D62631AD2D9AFD5AC5B86ED4005FDBB7404B65BBB826F1A2334A481B9CD46E0CE9C414A162E84368089F24149D7D05EA6ADF40B25A708357AAA5A28801FF100F69252810188CFC6087507BB5BDE1CD43BF72B1B3207CE4F7E65A18E5276613D4BEDDAF21AF7B964FF69965C47CB03846F7CEDDD2C5133080FC632A4F0B3495B2D2751727CF7681F28675552DF2A0994E425A922BBFCF84189B8C9F43058D691DB3166C596F6BC480EFDE06BDAE7B9C2985A1F2F6441520620E193D7B94AB46DBA2A1ADE44E2B006734E6770F34B0E2122DD7F4EAF045164DEA8C2FECE7758630384C00A6B528A6ECF07045B2DC0281C936A540904733149BC65B0F57ACD9A5E41C2ADF83FD6A760B169BEEBF04644DB1314270ADF86D01CC2CD580C609E78BBCD9D2694A89F9CB6DD36B9AA2AA5581FF561B5417BE2B52F3EF2581E461CB0690782F33862C52590643BECE0A6141DC805D8F56C4F64C1BBC49A3ECF1E8827926796E5F9335DF47DA6D3E4C14795B547116FD1F3351FC55C28B543183FEAD8DF7DA4DFBCC38E224901FF7BD83B16631064CAC4A37FA632F53F004374AA19861FDCA515AF91E66186EF804366D5A1B3B4FAAA60A0C4B36B972A9579548B4CDACE7EB85F1F68A4E4255FD994C1786975E7F6F0BA87D0295DE72876BCE37146A09EDEBC0164B9C4911CE41EF4D48130A27651BD0DC315FD622CB6D03759D35756806332658B5B33E768860C1946569AA45130486AD49B - -count = 72 -seed = F151196F55A9ED88F1663AF6BD24B2CB9DCAF3C9B313CD8F0A27639D3CDAE72EA90D60ED5C7C6AB697A06185E5A2E215 -mlen = 2409 -msg = EFC63DD588A7230CE08EFCFEEA534F5A0EB005480AD1D169C386E476715238526E936FEA7136E2D8AED60DE31CC91DAE4E764CE5F93624FA7F72B87562FB6AD8996B5E41FD478AF0AF8338A7FD9AA250EFD2F2D20364E8A88A8642E8E38F38583ABF8D3BE97F14C3EDE66EBF8EBC84385CAE646CDED8C5CE8F06910BA7FEC05D828446D558D6FED766FBA347DA2E84DA247C34266AA31C328804F4E3AAF6ACBB0AD50FEECCEC00D20B3610785B9F1BA06A0BADFB42A8F43DE3F7BAC36057EE0B4D2A15DB040A8903F767F7352995C8FC3E06ED1B1322587EEE5B31806192E04B09A7B433D08CB2A340942CB75C51E0F8409F907F69C5F8DC316A227942EDF7A458974FDA76C255FF4F1A85A352CD2CD2A21507E0F37451060D31D0847528B3ED5DA3E7168CBD0302F1B03842E63B3DEC6FB37357E37FC3CC26721F290726A47AB3D4DD8FD1778FE5133726C240E7B3E398F3D809C6C469680B9EFD25DBE890D6936B76A52F97AEF3F93872B76506A95685EECDCBCE203400D182252471B99B7F4C6CED4CAC8FACA7682D0DF07BC5904AAE042479855098CBC41534F0EF17F38F1BC8C272CF72C1AC4A5564DD132130EE676E7D7EC3CABB4E85AC81945C87DE08EC60CED3FA0AB3E83C18AE493A851434BFA2C4968B42ACCCF3609539C62A4E01F8BC159362E15EE91D8AA399D8BD8D67BA1E8FD646EEBB4583812293406B05BA5BE2B1DF9620E6FE3DAF8CEBD9652BB04494B899F407C7D9ED1C4E77FFADE24ABE56AD597BD438928E05B0363D6D2685D34D6B51D71012844415C46F13181B146A3AF25AE4E8853CC7C7EF6387306C45180A6EF9E97ABE1E7D5E10115752C3071B6A213367E8B1A3D1C3703CC1840735315623901D772C61D55EF8C47DB10F0EB7582D7A043018DC1363E93F315DD984B8002EA7BF5BED38D3F273276CA577CF99A635CB6ED9D6525520793405BE27C86E6EFFEABB1E5F84A0076BD151CAFC59853424DE4B3460C673B0820D76E15EE47B6505D2D5C179DB92A44042F3631C646D350EA9721B8984660A76018DCA5C6BB1223CD03CC844DC9371D32549D9D645F75D2683FDAD1DF6434BBE43200E506ED2A815FAB511172C70F99A85FA3970433E8955B2F9389F23C10141B5779A23B8671EAE8B91991B78F635FBE8E627D3E79D91FD1E6E90699640BA3AE8D7E4CF5145F1259CC76AE50B1FA150D8338A9450A5B6B90EEC9C94318BC78C9C7715A3EB215AEE6443540D211A0556813529023E5A581623CD6D19BEF0705A5F69AAD4833A57C308144E92899AC5683147CDBD279D5C3A55BBC5E8F8E26A158A3E42F8C5B858909B024B4BA4069E26DE66460FF4A7DC92BD54AC244007B6AC6CE07A31A2AF3323CB55F07B8F480D279308FE10F2DDB001DA6C4AA132B988AD03FB63E0EB06544571F5505CF377A81153D6FBD4FA2B7562074CFAF587CCF28DAC84AFA58809C0B296E0D2594D3582C28596F5AF7500E143BE7B49C63D04F49BBFBDF60B024DABA5533F945BA90659758E06984921EFEEF79604059EB808C9FE1BF9BC5351A406FBBA7F5D8FC9F891488E537DB14B216A0535C9FF7BF8D5C68A2453A8A48E58FA7BF6EB76448D6D0BD05BD4628C4B852A236A11BEC0F67118F1267CA42647F6F2303509094C9A7F3A07B2724ABD2D9B56B71FA7AC6CDDE456EC209BE76C419855A5151EC9EBF0E0CF1B86F4E8E81B8173960F8D1C8AFFED1AC7B818AF8E3BC092E2B209D693E80B11EC7DA39CA93223E1B47C6127E8AD40A78BDB0ECBFA1F39C84CB9ECDF960ABB39884627BC4105C53EE7BCA4802B92AF60241420CBB36C407F46CC2E953D7E3503CC82287A8D68D0E673E212173D80A12257ADD5256652188C00590DADCFB7DBB6B35507B853EA5FAD4F52E02230CB3D3BBDFC43EB74780583E8DBB851E0257117F4A39A6676586216220C1CA21DE16CDFE6E1CC99EA7C989916AD2FED4A8373CFCFF02207529BFFCB7B7601317450BF430BAC9CE111B0FBA8D7DE6627F863078D8E6286B2D34856426EA90FFD58705444D0DC12D4FEEAD0FFE543811E1EF306F40939922563832D06E6DEA7109087AC051A361EA9E755856FD4E51388BC7C40C63E0953C8413AB0CBFF70C466E15DE5B089D095E8EE8A64E929D26CA3B71EF0B2360AECDFA89284CCE08C666F4E0146362F0BB84B87A49FCF2324EBB96DD941F00E2586F7246436EB66B1E04AF84482D8ECD2BC8EF9955CBEC62AFDD754A7F235C7F3C41CD0B36A9024D426B7388D3C33A5A6E858846C0FB0D88BA5798C923F9B43D14A6661C65092D5C5EC0F97D84784FA336AE6EF57C7A5D04804B96D19849FF9074724A5FACA538E32C6EFAA5209317543159272CE50454FE1E7D068C8F5FF3797A66D5F87758627AB5D40EBE1FB7CE9D69287AE7A5F349A5DAABD8A8E7778BAA26DA0EB237034A3366448280237A165CBB303BE6B33C0F11C1E56C50A84384A0F6878F2A99B14CD3B6820ABD27D2011E0C37F8439BEDE65747038A5FF7F00DAEDA094331523CDB7E10F1063B64A584D3E9F0655268F89DBEF3EA3FA4C6E54FEEBF8F0046C6C811F0767CF6FCC9B3497DB05582774047A8DCFF6A0C1B5188076E64A9D5693195075F2A05E507A5A523EEE4537079F9E5E79210E4AF056D6624D45A0EBA553CA9BC92171451970102CAB57DCD89ACEBBD7025008325C61145264F42E4D14A76E5C2F1C129D4C054DA00501081617D1A27012A6E160750DBA73BECB5DC05105BFDE1F1D0CDC837355844B291B09015FD610628513C1C86EAD373730B99FCD4A552FBA07163CE9CF6A3D3AC0525593F0648256E8B33FBCF92AF58CE26D0F036E11230879DBB789507BCEEFD2960EA320236A224EA74DD2AAAC541664FA3EA9430D4FB09C878169A8AF1E7FD4BE5E7926CB0B6A352B25F452454474107286EDAA145C0A0573361522EACB618DD9C8B32BD1A8A5923F4C698CCA0139DC640C1D5D557CE889BB69CE32D85853DFBB0F34DA2CF18CC79472906B67F6BACBF287F31DE0B9E7A01A356EC9B64653CB922501EA1EDA940089BA0F293B667F482E92438805CD6851776CEA0920CDEFC4062C9B4E51F5AA1D7FF909CC2608B6F28CCF28D574BF67CE80D4DDCCE28F2ADE0162CB66894B5B2DA0EB975CD95EE7FE72FDA2736616C8B571FAC94BF8C64ACD1642D9431118F08A62328D99B2B9D90BBC915DB764C4935951A59C369C72060CD9F4273BDCA0C295294008C0AC3A149E8CA5E8BF21042F5F21C067147F3BB52B13975026A9DF7246AFB1D053670982AB316509F2850342913E1322758ED89DA02DD79126726B1C5566C1831CCB1D62B3E271875E62CDE0DF0715D404F95F580B63923F362D416F83FE5AD98EED584717FBC2CB7D1B00101200F4EB4CA5 -pk = 4738716D72674A529356CB8311FB7D8F8D44958A95BF99DE435253F1882038981F6541F2DAD1D5526632C775B05206DDFF580DBD9DB8721BE490620C432A0C00AA81A58478ADA1230B66196409B1F3BA00E149E07C426BAF73471925CC85A8894F6C6A17DBFB9AABB083AD437BAC19D2FC6F344886F68AE17C7AA6C65FCD1000 -sk = 4738716D72674A529356CB8311FB7D8F8D44958A95BF99DE435253F1882038981F6541F2DAD1D5526632C775B05206DDFF580DBD9DB8721BE490620C432A0C00AA81A58478ADA1230B66196409B1F3BA00E149E07C426BAF73471925CC85A8894F6C6A17DBFB9AABB083AD437BAC19D2FC6F344886F68AE17C7AA6C65FCD100002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000864C120E7DEEDA0A6B8233E0840220ADA38445113C913A336C9FCA3D269C711733B4CB7F014527840799955AED49677AA0E395982499C6FF5D89D16F0A1BC50A213472C8044CC0B8B1A81ABA0AE5FBAF990739250AD160D8980400000000000000A9D747270F96714C3CBD29D4FBC1352B086036F6513EF44AE3380873AE964F389B45682E28FA2C133C78733B319E14AD84D21269F8336C454F888668C6CEF883029807A91AFE14581BE9FE9CCDC07BCAFE3CF83D036F10A4E7F2FFFFFFFFFFFFFFC9BF98FCA06CB724B717779F43B22B3F06D19998BE4E3F3985A1045969528FE3D64841050E4F4649561B4BE22DE40DBEED935E357E1D2AB15EBDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96F0A1DCD981C091F30B8566EE1EA5E75B3CCA61612D744D52AE3FAD662A7BA81C0C0D0CC5AACAAC2E35B34A177FB45BD255A8BE043125D3FEF70300000000000000000000000000000000000000000000000000000000000000000000000000001A995566FF57535E1ADF2CD184F951AEEE84A220C355995CCF41E0B26E26BA9C33A2BC7A9505FE945F8BED20C190A2B4EBD53846B0F89DD6455E6A8D40E10700BDA94D807028FBE40681481629AC7E9F5B7B3B7FDC13A92E0D06870A770EB3DD3AB9C828964A9010703AA78FE9A46BF29DA93E96DF886612C9A935785185180028C5A1E26C0E882A04EB646BE75915BD4FCF2691658B7B7ACF9DD3915FBD1858A5EFC734825C74BF71DCA37AFAAE65C4896F2B1868E3ECC6BE90C80A62601E0077C502FC82878300B54A127D06A7058BE01630F6CF5A7C79F89B8DFC4B589FCAC2C77EF0B029835CBDCA3EB36CFA6A9478BCAACAF4BE7C83472F3C46162A2300D6F37AF2E1701A8371AD8877608981CC55CD317CB260362BC84000A4D297BCDBB9B755ABB26087B3817B3198949B58547D461A1E04A51146F92664BBEEAB0F00CE1B25AC1C80DBDC426BE9431A327092A8EF3B82778CCF1B02AEDCF36BDE6FBACDC6397AB239672EDED09811659948A26E18B7008CF86AC45FD4335EF9E71F00A4AC315DBCF4AF1CA3AB3A0BFC76EC8F1F686C58903997CB712044205953EA00DFCF56B735766A5BE27FB50654EF217A792E8E6F9090CC953DE09F559C2D1600B199202C994EC4E6ABFF955E12ACEA13F1749EE21DB1A5B6B3ED8FC6064DF30C359D673C1542653AD4078B708BD0D9073636E622EE0ABD2B5163696FDD251D00E3A3FA04875DF6A634ABC60D078A18452EA49C21962F239F3C5BCE1122A67037DAB5ABB3907BB979B8DCEC486A937EEDF4A68B91FADD1090DD907844BFC70500F590C8F34715FD0E5D9E7D2FAC128A67161B953CA0D15833E769DBE3074158DC693919AB208899CB7A48A005255E2CAEEDE4DE8BC568BA29AEEB14217A2F010079BCA69BBE0A0407BCCD23E59ADFFD48EB94A92876E8BB65EA3005CE2DCADDFFE82FDD7A1084B00A031EA9CEE0B9FEE7D2E1089C6AA37B32D10701CBB7AD0D000EFF8F48D8219B44EA03B666BFB52C545C8FF73054B144FF8264D24F975E7C997A1CF68C77DB41DC1BF58346D21B6FDDB9DD89567660F1E309805D8B218D1D00D907623D3DB62E0CB20D7FE75481C081EDCF5A83CDD70C6D84C2DCAF2F23DD7FD8D6D2D1B06B322B54FFA671E51641DCCE5053C7AC8FC5FA84A8BEC7C1A7110066F2F41C663A52374AF0AF3A6E3F922F9A4E78A78150452742EAFD2F9DF62DFFDF02B178811D88A4533CFC434BDD55CEB98939D4C8EA9EEFD04AD860A7E80800 -smlen = 2744 -sm = 674A35D11598308E2ABAA605BF264287A16D019D72DD49D8E4A5462E5D450C88EA28A744DE00B9C0E50ABD9B9D00B31DE9332EF7B3E631E800490E845D0F54A70FF865D2546948822B7AE201269A1EB393F0DD80C088141AC83515DB37D201F40941C3E5E8FAE7845078BA3FB3257E6FB401A38AEC63BF27B35682C0DFF82C09F560128B00C2EEA1C122FC1E6F9AE277A8C4983BC078ED010D65629AFF371E0E82C44C65687FC335B7C10075A1B3C370C40DB868C63A0D5E380C5C068400C2D6578BDBA5E9CD4133E1A1411D2E9AB2840100086BEEF95AEFA46625EF29DCEFEB003577010FECE3DA0E39B91ACEF22D50B9D0CE14B4C0000E3F0341DA0078EBDA1D8292732872FE4C3101012753B376E40A12DC67B96B84C1362326E103C9491E5A14E8315A0786DAD27A2604035F09B0DE3330B5500798A1674B03229E55B10192756BF90AA0291A29282D0884FE01EFC63DD588A7230CE08EFCFEEA534F5A0EB005480AD1D169C386E476715238526E936FEA7136E2D8AED60DE31CC91DAE4E764CE5F93624FA7F72B87562FB6AD8996B5E41FD478AF0AF8338A7FD9AA250EFD2F2D20364E8A88A8642E8E38F38583ABF8D3BE97F14C3EDE66EBF8EBC84385CAE646CDED8C5CE8F06910BA7FEC05D828446D558D6FED766FBA347DA2E84DA247C34266AA31C328804F4E3AAF6ACBB0AD50FEECCEC00D20B3610785B9F1BA06A0BADFB42A8F43DE3F7BAC36057EE0B4D2A15DB040A8903F767F7352995C8FC3E06ED1B1322587EEE5B31806192E04B09A7B433D08CB2A340942CB75C51E0F8409F907F69C5F8DC316A227942EDF7A458974FDA76C255FF4F1A85A352CD2CD2A21507E0F37451060D31D0847528B3ED5DA3E7168CBD0302F1B03842E63B3DEC6FB37357E37FC3CC26721F290726A47AB3D4DD8FD1778FE5133726C240E7B3E398F3D809C6C469680B9EFD25DBE890D6936B76A52F97AEF3F93872B76506A95685EECDCBCE203400D182252471B99B7F4C6CED4CAC8FACA7682D0DF07BC5904AAE042479855098CBC41534F0EF17F38F1BC8C272CF72C1AC4A5564DD132130EE676E7D7EC3CABB4E85AC81945C87DE08EC60CED3FA0AB3E83C18AE493A851434BFA2C4968B42ACCCF3609539C62A4E01F8BC159362E15EE91D8AA399D8BD8D67BA1E8FD646EEBB4583812293406B05BA5BE2B1DF9620E6FE3DAF8CEBD9652BB04494B899F407C7D9ED1C4E77FFADE24ABE56AD597BD438928E05B0363D6D2685D34D6B51D71012844415C46F13181B146A3AF25AE4E8853CC7C7EF6387306C45180A6EF9E97ABE1E7D5E10115752C3071B6A213367E8B1A3D1C3703CC1840735315623901D772C61D55EF8C47DB10F0EB7582D7A043018DC1363E93F315DD984B8002EA7BF5BED38D3F273276CA577CF99A635CB6ED9D6525520793405BE27C86E6EFFEABB1E5F84A0076BD151CAFC59853424DE4B3460C673B0820D76E15EE47B6505D2D5C179DB92A44042F3631C646D350EA9721B8984660A76018DCA5C6BB1223CD03CC844DC9371D32549D9D645F75D2683FDAD1DF6434BBE43200E506ED2A815FAB511172C70F99A85FA3970433E8955B2F9389F23C10141B5779A23B8671EAE8B91991B78F635FBE8E627D3E79D91FD1E6E90699640BA3AE8D7E4CF5145F1259CC76AE50B1FA150D8338A9450A5B6B90EEC9C94318BC78C9C7715A3EB215AEE6443540D211A0556813529023E5A581623CD6D19BEF0705A5F69AAD4833A57C308144E92899AC5683147CDBD279D5C3A55BBC5E8F8E26A158A3E42F8C5B858909B024B4BA4069E26DE66460FF4A7DC92BD54AC244007B6AC6CE07A31A2AF3323CB55F07B8F480D279308FE10F2DDB001DA6C4AA132B988AD03FB63E0EB06544571F5505CF377A81153D6FBD4FA2B7562074CFAF587CCF28DAC84AFA58809C0B296E0D2594D3582C28596F5AF7500E143BE7B49C63D04F49BBFBDF60B024DABA5533F945BA90659758E06984921EFEEF79604059EB808C9FE1BF9BC5351A406FBBA7F5D8FC9F891488E537DB14B216A0535C9FF7BF8D5C68A2453A8A48E58FA7BF6EB76448D6D0BD05BD4628C4B852A236A11BEC0F67118F1267CA42647F6F2303509094C9A7F3A07B2724ABD2D9B56B71FA7AC6CDDE456EC209BE76C419855A5151EC9EBF0E0CF1B86F4E8E81B8173960F8D1C8AFFED1AC7B818AF8E3BC092E2B209D693E80B11EC7DA39CA93223E1B47C6127E8AD40A78BDB0ECBFA1F39C84CB9ECDF960ABB39884627BC4105C53EE7BCA4802B92AF60241420CBB36C407F46CC2E953D7E3503CC82287A8D68D0E673E212173D80A12257ADD5256652188C00590DADCFB7DBB6B35507B853EA5FAD4F52E02230CB3D3BBDFC43EB74780583E8DBB851E0257117F4A39A6676586216220C1CA21DE16CDFE6E1CC99EA7C989916AD2FED4A8373CFCFF02207529BFFCB7B7601317450BF430BAC9CE111B0FBA8D7DE6627F863078D8E6286B2D34856426EA90FFD58705444D0DC12D4FEEAD0FFE543811E1EF306F40939922563832D06E6DEA7109087AC051A361EA9E755856FD4E51388BC7C40C63E0953C8413AB0CBFF70C466E15DE5B089D095E8EE8A64E929D26CA3B71EF0B2360AECDFA89284CCE08C666F4E0146362F0BB84B87A49FCF2324EBB96DD941F00E2586F7246436EB66B1E04AF84482D8ECD2BC8EF9955CBEC62AFDD754A7F235C7F3C41CD0B36A9024D426B7388D3C33A5A6E858846C0FB0D88BA5798C923F9B43D14A6661C65092D5C5EC0F97D84784FA336AE6EF57C7A5D04804B96D19849FF9074724A5FACA538E32C6EFAA5209317543159272CE50454FE1E7D068C8F5FF3797A66D5F87758627AB5D40EBE1FB7CE9D69287AE7A5F349A5DAABD8A8E7778BAA26DA0EB237034A3366448280237A165CBB303BE6B33C0F11C1E56C50A84384A0F6878F2A99B14CD3B6820ABD27D2011E0C37F8439BEDE65747038A5FF7F00DAEDA094331523CDB7E10F1063B64A584D3E9F0655268F89DBEF3EA3FA4C6E54FEEBF8F0046C6C811F0767CF6FCC9B3497DB05582774047A8DCFF6A0C1B5188076E64A9D5693195075F2A05E507A5A523EEE4537079F9E5E79210E4AF056D6624D45A0EBA553CA9BC92171451970102CAB57DCD89ACEBBD7025008325C61145264F42E4D14A76E5C2F1C129D4C054DA00501081617D1A27012A6E160750DBA73BECB5DC05105BFDE1F1D0CDC837355844B291B09015FD610628513C1C86EAD373730B99FCD4A552FBA07163CE9CF6A3D3AC0525593F0648256E8B33FBCF92AF58CE26D0F036E11230879DBB789507BCEEFD2960EA320236A224EA74DD2AAAC541664FA3EA9430D4FB09C878169A8AF1E7FD4BE5E7926CB0B6A352B25F452454474107286EDAA145C0A0573361522EACB618DD9C8B32BD1A8A5923F4C698CCA0139DC640C1D5D557CE889BB69CE32D85853DFBB0F34DA2CF18CC79472906B67F6BACBF287F31DE0B9E7A01A356EC9B64653CB922501EA1EDA940089BA0F293B667F482E92438805CD6851776CEA0920CDEFC4062C9B4E51F5AA1D7FF909CC2608B6F28CCF28D574BF67CE80D4DDCCE28F2ADE0162CB66894B5B2DA0EB975CD95EE7FE72FDA2736616C8B571FAC94BF8C64ACD1642D9431118F08A62328D99B2B9D90BBC915DB764C4935951A59C369C72060CD9F4273BDCA0C295294008C0AC3A149E8CA5E8BF21042F5F21C067147F3BB52B13975026A9DF7246AFB1D053670982AB316509F2850342913E1322758ED89DA02DD79126726B1C5566C1831CCB1D62B3E271875E62CDE0DF0715D404F95F580B63923F362D416F83FE5AD98EED584717FBC2CB7D1B00101200F4EB4CA5 - -count = 73 -seed = C7ECD1EC1A3D83F5116C0AA4345FB3ADB4D9F81BD79896BC4932EE2F9D2D1F179BAF7A002D88F4F69071A7931E7F7FAE -mlen = 2442 -msg = ACB414EB55AE5E49107BD0AC5975544F83104F7264495AE0BF0A6D9594C422C16B99469ECCDFE8B8000875B469309891EA42586A615D146DE64FE59277A61631B2C7F7379CD52FAB3871BADE120EE9558D1479A91925634578CF14D35DF3B5672F8B5F9F956FA9F7489D6E37E207FE556017736F6B147A8CF664D0E0521D94737E18188A1B7C30296CCC9067E7B55D6E0F2FBD875F42FEFECAC49510E324968B07372DEB10A31C585457E0C48879CE44BC78898ECEFAC7BCEE90D0F8925DF2B52D5AC81692E0160F8FD5808645498428260F592E29BB90FCB07D0424EC79FB081840CB827CAA4A9D562183D10EE41D281E26CE3EC0069C83E1E446EF82E2E30DEBE3F409E0A9E6D1550E224DB15DBDDA44341E4ED6F8B8984716CA87233197528547D090058607CA141424A13145F1E896555288C5E2877AB3B51C7F9248D2D56A8521975BC4EAE3D009988CBD73C66931BADA0725FB8A3448D43E0C7364E9494FC4E295A700E79972E1FFD626D1CBE0199917851638B192EF9F5C03223F2BBD67EB59A5E8BAEC3DB40616938274201DEA1AE640F6EE7E047CC4C13F80DC65E3FCB5C62386015F4EF1BFEC561E121F9BFA9B2075BC1C4730503FDD5DEBCE8A535ECA01B9D5B021C290854B5F3D49EFFB263DDA34C4E96AEAE9E71A686C009B205994B46CFDF1F76727CA67D415B9D21D54312CDC6A8ED0AEAB96B580D0B419E2058E5D843C17C96D156549962F81C266233ED2B795FAC40B1992B626457F211F08106AD86F5702B9DEB9323A0970AD86125ECA836E0A3D6CCBC380D474049BD96EA246B8BD9542793A66E15B319AECE6BEE17ADBBA7DB337D25F8F642774030A2FF969CB5671F59901CB109E661E55FD5E75EB2A96DC37FEC76A82EB89D020B4916271CFB0CB3342494FDB62EA0D253FB8FF2E91357B33D96D41530B8B5E9550FE9B3F9F34FD5A2A1A6A8BEB93CCC322622F3B5E8487DE19AF57CBD1481ACE02779AD928B17A9B05CBEB722C783B088B5912C2D67CE5073F1801C23170DEB1EB6DDFFC4C33DD25F94F4FBE59D704E478FB49DD2142801C37ED8F539EC1782EBD2F3253BBE19C5A048B9EF41824A811119F3A6AD2A0D4B77338E001358C61A9794572B0C46EB1E0E575D4DA141A415829BA8712B791B625B1B0EA840EE745D9FFE1E99EFD782BA25859351F443654995102CBEFAD7E59D03C9A502ED7B77144D0566E4BFAC086A7DEA356CB9E5AC02DBF7E81D6CEED4A33DA8D801D61BAB5C01F259EE3A99FF7F6D7BF8F2160C4BC3F890736074B000C4C58FA4615880F93FAD43D5657C76045D7C414E6B85F63AAC91F04A616184E04FF9AAD513BA767215FB0331A369D36C0AE9B1EC1268F1D0B43C42B786DB23DD66465B3AF17FFC68C67964C2FC9E41EABC45DB68CD2C3D95B8BEC787D994BB8E9CF1DD7D4C563FCA5D80B3F1FE8E3C7BFB7D171F5B9023BFBCC0CF4371B63C856EDBDA154B4313C47983F4027F9E61E86DA1E8CD787E3E6B50E1DFC9201B9AB92059F8B6D1BF7856CD55C5B1D6C4E6EBF818D481C56F66C79444F5A6544A64A7D78EAD33EB805A6AC4310CD46A2331E707B9B0950CA12092402D68C1CC5C3F269DFDB13AB34B97EAB50B0745BE72BB0FD2D73BEA5DD37802393B635E42A0DEF8544A96E7F40A8D9D06B64E38DC406BD59AC5C4E218591D20B8DBA2125978096517EC5C03F9BC6F96CB255E216EF82D7C7C873029F9E1D98EBC0D8E1312B84B8D02E8D680AA56A506C8668B5B9C56D04CF68E37C7CB1B9377C867240CD42FC7FBDE0AC44E3DCCFD3F877C9923AE9CECE0CBDAB00CA530F434A33F1C939FB88ADEF4D12ACBD8B2B5A139A3FB776D8223A9846465C0372B8C3233FB5280E936BBE9FD49058961463A4419D939F4F1FEA705EB63114F0A3533638DC4D3EFD620147770AD877E2354299CEC6E5C18924E78DD661697ADF89A77C7365522D3E8FC0855187139F7E43E9A0629EE321B2CBD9F007B05C22EFF56FE48045686B36C5BAC2267F37A2E3D4E03E19B1E422ACEA31C2E9F3E7541976D4E2FA03119DF9C4CC2D5418F0FC7A467CD98E290695B9530B91D5DF8C626C7236A5C0FBA73578B9A47491CA0AD26A144B0F23EC23D2C5B2DAA03BF40130F14B9A427CDFF1F232C9CF02426228C570CF1FA7C00A773BC0D70858588542BBF8F581540870897BFAC8387CBBA3416A846CF9F4F5D3F9DCEDD080CC0DE9F71B93828B835430898E82896CD3F30FE2AF8349DB294FB2A8FFC0848692A0B9E8A66EBBFC0F896F8D03E3C6A0C27E0F2177B85A2F6FE31E8AAF14EA5C1FDC54E80CDE47AE27A161264680107023CFFA961E913C4E6AF96C0BE37AD859C334CDB8BBEECB5443662739D027EF1B9535A5A46E2169933E419454025623FD6779F54C622EF81AB9289B50758EA34F868EC85AEE589B08962B85CF537BC733F62AAFA95FD81A60D5C2E38D6EA0DF7D1390BC5050E2463E3E2E3A769DE2A94ABDEDFA0ED67CC0FFAFC5A05A3B0FD37BBE6967BED8DEBF02A42CDC80BDC62158E184FDB6672F7947505E2C0A6C7762B1145C4BAF30E3D32434D22707044DC99D2CF2D38F15C43ABC8632382BBBC9E0F106565906F7D4948D30FB19EDCC3748100397F71E1548E58A5A01876D0A12DCC80000224221C4ABD98A5022506D24BF4D9B9108991AD3421D4AB9CC393DCB8D744F97822F95CBB2640E73E401F044FE20253ACB8B32A75FEDA640E190454BAB695A23B14AE3EF60B00491AB22F622DAA89B6B2E6D18E735672FE0EB2DE269E4E386C926E23B865E1BA22DDA688293DE144102F7030FDE6DF653E4106C08C2467AD7C54D1DF0DC5981004876C6BAA8720F70942700A154A376C8D45DAE1BE74910148EE3F2733E591E1965FE763B58C8B28AF25E9B3C633ABD83F1C0A4F68DA2E0B85083BF97D4E919340C0437A604416C4F629B33039BBF2A1F561548321780411D2E8AC0EDAE76FC3A19F3C84C3BE902A1E84FDF69B11A12DC8B78EF257B5FBB5D923FFD548451A52C6A3AF31C70266AE8A957B2BD72A51A034A2921B8E19321108AC303B0D2E269D032C3DB13F21D558C82BA4158962F2210E1C5FDD96C98D6639AA844F34E40C1B9C909CC6AF1E97A8DC83B78C72B30B7AE400F44CA60AF37770B3D9147F7D6F5A327F34DF7CB8891E71D41D723CB18E0DD324E5CD22AE0D9F2B1D2BFCED0288B7AA73AF4FE0A8181BA1AA7EAE966D0A240E10FE5735D98326A106D16DC49F3FDB19D3A8449C56A74153655600E4C9E38D302C6D4080017D93C628388DF94860329BAA289EFA4587F079C6F03FA03C54540A0AB4B067EE46A5A346F2FBBFF6570ED0166A55C258EABD62AD90F060FADE84E8FAC799F7928285F58557A72E055B535D00BD9A4880D10C05C07CFE7A6FEADFCDED880521803E339F6EAE3FF28A0A471A003358F952320F41A0AEF9D28 -pk = 55AAF0E8B1AD76BB35F8B5AD40EBF47A800A51B708DE7F1FD4D3210A20037DFB341385E4EECAF7881C3A0B2D1BDBAF1F4C0F4D5E1D1FA0B02CB96D7F4E0E1000C8187A22D9DD509D9B50D6E72C89EAE48F414C731F94F090C56147C0C0AA6EEF3F7C09BA767C7F55C8D9735C55953ED9EF9568D78ED8954F105823ED057E2000 -sk = 55AAF0E8B1AD76BB35F8B5AD40EBF47A800A51B708DE7F1FD4D3210A20037DFB341385E4EECAF7881C3A0B2D1BDBAF1F4C0F4D5E1D1FA0B02CB96D7F4E0E1000C8187A22D9DD509D9B50D6E72C89EAE48F414C731F94F090C56147C0C0AA6EEF3F7C09BA767C7F55C8D9735C55953ED9EF9568D78ED8954F105823ED057E20000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044C54F9D2699E57F8A9C8146B1FFA3653EF02AFDFD24532962E7985C5665B3FDFFFDEBAAB2A178457FD65639F784B77BEE77C0AF2822691E655D76E55644AC88D5EFA47D66EEB4A9215A6FD78DB727B563D9DA56AF98DB2DCD0300000000000000212F5544850AB8AA19DC44333D842398731EC1CC41626715CAF9BCADD7826FB4495E6CC61C0D78D552079AABECDCA960F017451044285FBA6B99B5A7BCE03D326915882C678A6A77E25C70BD91CDD25A0D9C0B46169B18F958FCFFFFFFFFFFFFFF1FEE4D58AA6206DC48F04E67B553418FE011539481045670A10310C0364C838E5C2AD01351421165F9C416234CF82658F856EE33107769EC83E3FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8CDF6D563D50F240E30128B2E94DC54FCAF60C9BC033A5A035B883D2302A69790E83A3BA66FBF279924A2BAFC8DDE179A4CAF9BE660330FACFEC010000000000000000000000000000000000000000000000000000000000000000000000000000D1B87424D6395BE1E8FC60F94ACDF1C94F1917D950DE9960E6E21CC70711232C9467202B2F6D600862CA13F607F262909BEF45568177C90EA6CC4BD4A087030075E8465A77BCF02D5A6060CBC05F30727C56EDD1000C07D1D08340A1AA1648569F861C98C6FAC0369A3C5A98DC60D13A16C05E300D4E83FE9B2E11BF28971A0053C5951994112A2A3E447752A4507DE7F22A81AE84662E9B67B32FC074BBB593A49C69FC0FF7279477F524C3C3939B15D2BFAE0AACAC474F89C2BDBB22B11400C39432079A2B12A10B87EA14B2568BF5356E5CBF30EAE498A3D08E4DB0AF34E342C3AC10A4861323EF8D2CBEA70F617DC4564638896258CDFEAB122F2AFB1E00B21FBFEA4C6FD5B080093604C3F47D4160A474DD11905038B7AF70AD6363C52DBEF1E77701CEAC9EA56201E10A1C5FBE4B7C7EC24C4915930FD96C0603590400E54CD19D18DEBB07AB19D175C2A80F0BEC5DF37A521FACF5101B937651FE7D391328E1EE45BF821428DBDF837911B54CFA46046F7DA98364B825135FCA951E00415E26FFB02C2F1776059005E8DFC376B296B0D77E3255FBAC029D6A0144F3E09E8D6A286B58DF012E6C0886C32E792254C0FDB90F128F5380E09187E9292500881ED025310BF594F9B7B51E18C73C138D055E3225907C98BDD0EA413074788F13BD06D1D0F0F4B706DF39BA63F4982BE6EF1E57FC8AA097AF443048E8F71E004B5F6A541367C5B7430FF1D37E5C291083EB139F6428E1400FF07C5CFB6CE202E9927BC9817479814A6D415BA13A8751108182B6588D32DE01EEF56700910C0085347F2F786F544F6A81FEBA01DBF05423882DCEA19A9A2ED146D498ABFFEE7600F34E7A6C6099794D408E4BBFACEAD54010234920F4ADD336DC3A2142D5080070D4AB7A8B2B78141F713B971CC76530F4C05B11B5228A9CD0DA91BE138DD2339B1C390F92DE1D66D5680C0ADB644620318DB58DB1397F80DFFE72BE15720500FAB37312F8E6B38EA8956E6415A1E67170AC986011DFB2D154C34C8EC6FBE79F79322CD9D53846CED56A22CEAABCAE07F1561FBA27FB7A490949E13F8F431200FA5BC38B7655AFB3EE793CE1073A85D1A93FADF93BB75EA4A734861ABF8AC188A925AF1EC902C71DD13BBAE3EB5C337889D65D95DF5FFFCC5C3FF146282515005FD1A513689BAC2CA5703FB05D1F9B97364F1F8A55BAE86A002DE9338875BEA41249BF07C902D3ABDD0688EEDD9A72DC28E6DEC9869E4B91FC2D41EE30390900 -smlen = 2777 -sm = 2AFF218718A060DD28D94BBF805129C5342D01A374B41BCADC377B0DD0D1560BBF50ED1A1401D3B0B31776F1BB6D6E0987A9D461BA918F59010734C85BEE8C6F6D64F305BDECF08BF6D71200BA781E27949DA59A14F93682149254DF8671017526EED080457801FFFFE1F15A1151EA0FEC01BB8B453CC1E98ACF8F6E44D5849930105F4B00D00F19590B4E3BBCFF9DA6CFF2457C238F5201C1963C4D8DE2313785C85441F4E65BDE675800361267B800EA43CC6418E431CC406AA5DB34006A2C1344B85B5D3E41454D382A77E498694101EFD55604A727DBF92534E07F6A31B002ECD401FBD62610D7000102FFC6C8EDE83EB1A1ECE800ED72C72A8C65A8FF766873090CB7E3B7F4ED01004DE61F07614F2337DC51A0C46C1A61030AB58B7DCF193D177452725B2A9220550200B64DB4300E510CF6478A94CC6A6D93F048BA0176609D9ABD61712E532DA739344401ACB414EB55AE5E49107BD0AC5975544F83104F7264495AE0BF0A6D9594C422C16B99469ECCDFE8B8000875B469309891EA42586A615D146DE64FE59277A61631B2C7F7379CD52FAB3871BADE120EE9558D1479A91925634578CF14D35DF3B5672F8B5F9F956FA9F7489D6E37E207FE556017736F6B147A8CF664D0E0521D94737E18188A1B7C30296CCC9067E7B55D6E0F2FBD875F42FEFECAC49510E324968B07372DEB10A31C585457E0C48879CE44BC78898ECEFAC7BCEE90D0F8925DF2B52D5AC81692E0160F8FD5808645498428260F592E29BB90FCB07D0424EC79FB081840CB827CAA4A9D562183D10EE41D281E26CE3EC0069C83E1E446EF82E2E30DEBE3F409E0A9E6D1550E224DB15DBDDA44341E4ED6F8B8984716CA87233197528547D090058607CA141424A13145F1E896555288C5E2877AB3B51C7F9248D2D56A8521975BC4EAE3D009988CBD73C66931BADA0725FB8A3448D43E0C7364E9494FC4E295A700E79972E1FFD626D1CBE0199917851638B192EF9F5C03223F2BBD67EB59A5E8BAEC3DB40616938274201DEA1AE640F6EE7E047CC4C13F80DC65E3FCB5C62386015F4EF1BFEC561E121F9BFA9B2075BC1C4730503FDD5DEBCE8A535ECA01B9D5B021C290854B5F3D49EFFB263DDA34C4E96AEAE9E71A686C009B205994B46CFDF1F76727CA67D415B9D21D54312CDC6A8ED0AEAB96B580D0B419E2058E5D843C17C96D156549962F81C266233ED2B795FAC40B1992B626457F211F08106AD86F5702B9DEB9323A0970AD86125ECA836E0A3D6CCBC380D474049BD96EA246B8BD9542793A66E15B319AECE6BEE17ADBBA7DB337D25F8F642774030A2FF969CB5671F59901CB109E661E55FD5E75EB2A96DC37FEC76A82EB89D020B4916271CFB0CB3342494FDB62EA0D253FB8FF2E91357B33D96D41530B8B5E9550FE9B3F9F34FD5A2A1A6A8BEB93CCC322622F3B5E8487DE19AF57CBD1481ACE02779AD928B17A9B05CBEB722C783B088B5912C2D67CE5073F1801C23170DEB1EB6DDFFC4C33DD25F94F4FBE59D704E478FB49DD2142801C37ED8F539EC1782EBD2F3253BBE19C5A048B9EF41824A811119F3A6AD2A0D4B77338E001358C61A9794572B0C46EB1E0E575D4DA141A415829BA8712B791B625B1B0EA840EE745D9FFE1E99EFD782BA25859351F443654995102CBEFAD7E59D03C9A502ED7B77144D0566E4BFAC086A7DEA356CB9E5AC02DBF7E81D6CEED4A33DA8D801D61BAB5C01F259EE3A99FF7F6D7BF8F2160C4BC3F890736074B000C4C58FA4615880F93FAD43D5657C76045D7C414E6B85F63AAC91F04A616184E04FF9AAD513BA767215FB0331A369D36C0AE9B1EC1268F1D0B43C42B786DB23DD66465B3AF17FFC68C67964C2FC9E41EABC45DB68CD2C3D95B8BEC787D994BB8E9CF1DD7D4C563FCA5D80B3F1FE8E3C7BFB7D171F5B9023BFBCC0CF4371B63C856EDBDA154B4313C47983F4027F9E61E86DA1E8CD787E3E6B50E1DFC9201B9AB92059F8B6D1BF7856CD55C5B1D6C4E6EBF818D481C56F66C79444F5A6544A64A7D78EAD33EB805A6AC4310CD46A2331E707B9B0950CA12092402D68C1CC5C3F269DFDB13AB34B97EAB50B0745BE72BB0FD2D73BEA5DD37802393B635E42A0DEF8544A96E7F40A8D9D06B64E38DC406BD59AC5C4E218591D20B8DBA2125978096517EC5C03F9BC6F96CB255E216EF82D7C7C873029F9E1D98EBC0D8E1312B84B8D02E8D680AA56A506C8668B5B9C56D04CF68E37C7CB1B9377C867240CD42FC7FBDE0AC44E3DCCFD3F877C9923AE9CECE0CBDAB00CA530F434A33F1C939FB88ADEF4D12ACBD8B2B5A139A3FB776D8223A9846465C0372B8C3233FB5280E936BBE9FD49058961463A4419D939F4F1FEA705EB63114F0A3533638DC4D3EFD620147770AD877E2354299CEC6E5C18924E78DD661697ADF89A77C7365522D3E8FC0855187139F7E43E9A0629EE321B2CBD9F007B05C22EFF56FE48045686B36C5BAC2267F37A2E3D4E03E19B1E422ACEA31C2E9F3E7541976D4E2FA03119DF9C4CC2D5418F0FC7A467CD98E290695B9530B91D5DF8C626C7236A5C0FBA73578B9A47491CA0AD26A144B0F23EC23D2C5B2DAA03BF40130F14B9A427CDFF1F232C9CF02426228C570CF1FA7C00A773BC0D70858588542BBF8F581540870897BFAC8387CBBA3416A846CF9F4F5D3F9DCEDD080CC0DE9F71B93828B835430898E82896CD3F30FE2AF8349DB294FB2A8FFC0848692A0B9E8A66EBBFC0F896F8D03E3C6A0C27E0F2177B85A2F6FE31E8AAF14EA5C1FDC54E80CDE47AE27A161264680107023CFFA961E913C4E6AF96C0BE37AD859C334CDB8BBEECB5443662739D027EF1B9535A5A46E2169933E419454025623FD6779F54C622EF81AB9289B50758EA34F868EC85AEE589B08962B85CF537BC733F62AAFA95FD81A60D5C2E38D6EA0DF7D1390BC5050E2463E3E2E3A769DE2A94ABDEDFA0ED67CC0FFAFC5A05A3B0FD37BBE6967BED8DEBF02A42CDC80BDC62158E184FDB6672F7947505E2C0A6C7762B1145C4BAF30E3D32434D22707044DC99D2CF2D38F15C43ABC8632382BBBC9E0F106565906F7D4948D30FB19EDCC3748100397F71E1548E58A5A01876D0A12DCC80000224221C4ABD98A5022506D24BF4D9B9108991AD3421D4AB9CC393DCB8D744F97822F95CBB2640E73E401F044FE20253ACB8B32A75FEDA640E190454BAB695A23B14AE3EF60B00491AB22F622DAA89B6B2E6D18E735672FE0EB2DE269E4E386C926E23B865E1BA22DDA688293DE144102F7030FDE6DF653E4106C08C2467AD7C54D1DF0DC5981004876C6BAA8720F70942700A154A376C8D45DAE1BE74910148EE3F2733E591E1965FE763B58C8B28AF25E9B3C633ABD83F1C0A4F68DA2E0B85083BF97D4E919340C0437A604416C4F629B33039BBF2A1F561548321780411D2E8AC0EDAE76FC3A19F3C84C3BE902A1E84FDF69B11A12DC8B78EF257B5FBB5D923FFD548451A52C6A3AF31C70266AE8A957B2BD72A51A034A2921B8E19321108AC303B0D2E269D032C3DB13F21D558C82BA4158962F2210E1C5FDD96C98D6639AA844F34E40C1B9C909CC6AF1E97A8DC83B78C72B30B7AE400F44CA60AF37770B3D9147F7D6F5A327F34DF7CB8891E71D41D723CB18E0DD324E5CD22AE0D9F2B1D2BFCED0288B7AA73AF4FE0A8181BA1AA7EAE966D0A240E10FE5735D98326A106D16DC49F3FDB19D3A8449C56A74153655600E4C9E38D302C6D4080017D93C628388DF94860329BAA289EFA4587F079C6F03FA03C54540A0AB4B067EE46A5A346F2FBBFF6570ED0166A55C258EABD62AD90F060FADE84E8FAC799F7928285F58557A72E055B535D00BD9A4880D10C05C07CFE7A6FEADFCDED880521803E339F6EAE3FF28A0A471A003358F952320F41A0AEF9D28 - -count = 74 -seed = 5DE03CAB3CBD81B8805A17E0FFC2105C3BCDC8D782EAAB161A15AAA543FED59353C1FBE03E7F36B955FC51C9B30F0C93 -mlen = 2475 -msg = 5F7522CE6BD0CE6321C27B9EAA6F572616201F283C5EC171D0BA47662C2320897805E1551ED438F3FCBDAF9DE6F3A19DC16FE9C167A65B6E52BCF512C919561B548496A4A80AF7CE25458A62EAE92EBF677872482D8647C30C12BB1F080C6B9A56560D64FAB73DB17487BBB007C66661EA9DDA14601AB27A100EF4CF4B7447E51418651C03211F8FB884BE91F3980FE13E00EA4ECFE6D54882059A436C90BCAD80E4101CC6C0754417545F2D167629F80A3C5FFE45C00AB2BAF0494D6C065872B03A987A5EE818B3EF11E47FE1747F49E2DB6A14410F0B1F9610A2D6114395EF6EBB231FDF71D595CC1171DB9C89D6CF202E42D4FB968AB8105FDDB2AACB15FAB8014B534CF468D77ECDE2072623B7002620B7AC3E78B62AD673FEEF9F8E97E91ACDAB171FD415B2D15605DDE00D074A770E36F2218F7130F13E91FA4C88DEEA7E854BCAA01B8458D40625A33E982F0955B83080A926EC240E31F0D9BF477EE3A016E146A3909683410D4D09ECDF32EAEF580402F0D416DFC082CF1362E8B79158BD57739AEE56DC41A549E534C7CCF3620C7D7D95B92994A747D5EFB8EC43CFA8189BAA9B75FD54694E512FCA388B71A5B9EA591AE9CFA34183DE59D284AB16B2EFFA4B26A24A0E615B38B83088A9827EEB5C29B419BC061B033E0E3FC809AFDD3DE948412677E0BB5136854532639F3CCB176D54EA1961B5C527EF66F4B3286A583E86208AEEB8ED07D9E6BF1BEB33995F76CA480039A6130775895F19E3CD4873ABE3BF2FA9DE81BF0CB04575DD6AE282720B152CF0EC6A4A04016DB0F3543D8272AE56B1152B02EAF22131420CB194021F97060D5CE52EB21B57CC93964DD21344786E3888617152D2ABD829799CE47D20158AA93F7DA85CA6146C5BB94B512DA053C35BFA8840CA43F6509A1477603FD50F5E4F9A7CF8D2369156989AD638D35D345BDC859C52688211BF7EF3F4AD4944657289406BF01DCBB49D560A11840EF35DBC0C7F9C96DBEA76300CF61997A87D70F5FF8C51AECA2CF0680B6FE8C4025E1E25B62103D248CDEE335F4FCD67597103362003206C507970EA6D78CFF4B68B44244019152DBF812675CF667E5E13C8596EB6FEA3903BFB25ED08F902722A37F8E460E37A03A2D6ADBDF79DA20052DE658390484B83BBAB28D039A303D7376BF555181680B7966C798A1C6CB215257E37739DE7B9706CD1CF3AB031F68C82D6ECFA507C104115040744D74A40C49245215639D0CF4A5A7A10098E9CE3564AC3C44F0683AE9D3094784D354DB1AF439BDDF63D5CCA668D8180264EFECEEAC0BE1B8E1C6418E45F9ED6C779ECF169143B034CD9F332989D445C83A8786398C507B9171B4D95728575539CBB29C5B804268D88F2B39AF1F9572B8DAA9FEEEF69C4A77DC64BF2DBB5E57F8B33AB151769B2D00010D67A2D6F188D6D5B35E5E1873FE2B327E42AFB8885A842D26C246F7C18E6BCDD6FA49B300C65A3822121E95004928104017CBCE2AB95ACADB9802BF4BB049B8E96468353D649654C6F69D774380A5A387D6414DC3000540BAB6ECCBAA088C1068CCEF20036E5C8342FD512F55E6794BF85FE15721D99A1BFEEDC218617A940C8C25D4DFAFEC677D2A719B2CDDCD302294B7FA41AEAB5606F859CC0D638AC94B99AC3EA48C687D278EEBEB396DC5BF2D2E89E880F76B533FA54EFD30D8EE38B34DC5F8AE62C637E9A7E85D99E011F62D261AB4D3DCEB98A8972D3482CF817EFF476B873AC56963BD60183B359713385BA82F6E24BE2D6CFEA6DBB4AD2E1B5B790EE54D23F64E740502E887629B346FC8FCCC3338D0F2921131B84590B32C7CB82CBA8BB3B81EF7BC5CB12F0AA0B3C6A5B2878DC4F868057C68460C71D40D4263AC5C8B8317D2D0B63403C7549439A9EF227268372EC3A54CF8EE97714BC4B55007F92B1A32238659EC1EE27D6F2987AB06FEE84C3AFDFA73240963F076A955BF3C19410E1DA6A19B3EA3AE2DD8766082D3295D35436597783DAFDADB905465D05FC21FA8AC2737A52FA8AAEFBD2ED83F12545C1FA3198FF225D37070694C9392738E89467EDB2DA3CD1734CE398E32BCB1FEA2E4FE1260A2D9F9EDC3607A8AC8A51D5DA36E99B31903025E0CB157FD2FF5B51C9191CC16A9CCB870B4060CFB0FD900AEF62738A58C5726F5164417F084EF14FC0953E3C6036B818C21CA3476B8CC5F8EBAACE257A0315031A03E64E7F749B9DF99BB56CEEBBAA4333BC7270EDEE90FA2715BDDC38D44898A41998B2374B6EE3B8524D3A385C03868EE9479355092C4D20EC32DEB51497F4FF34AE7E7EA4828C288F46E5148DE28A8C660EE132E5B5489833DC66205EC968B60DAB96C2A4452A7019BBA9FE3D19D5829129E2A9C75C39416AC8695145F2B62EB9468198CBD48D7670DDC6AF2F99F77E7ACD01A34EA8E0E974206FBC22656867D09807B980563E06A559B0C3A7E6F43CF8DB75B18C0F90C12FF3BD43ABCE7DF75D17E631C08C974322010648FE2E2BC940E6510FB8835DF8384EFF3FE6A264687256C6BC0A5F9D2DDF208171DB55C4446B03CF27796BC77E3C68D8F1252BE21877D7C53747404420302CA5AE1AB57E43B158BE8B707360A2F59D6A473F98B816FDE2CCEDD92385202C419278E8B840DBA4C05E9BB65F68AE2A635A29110329E8C0C02F6FB5EEE41ED225051EE975F92DA52F93EB1FD7C0A098F6D1421701537298651313514AD31CB333E9C5DA719BBA95E73878BA41F9E2512862A80602AA2DE1E1D086576531330CC7BB8F0CEC38050B3CFAE5C8B1D6CB849A579F2294F8CE80FDE5405BFA3E6ECB01D5117203A4523591AC4030397DE9FF81D5CC91AF3002590F5854E852B88667638B2D052F2A7852425C8EC026E48D9EF5E73D1993D7F3FD7F704760562C36D2278C9CE131EC6AA444D7B2EACA3EE888D9B2AE122688DCB35455E7DE31562BA618F1183308B30D07A5C34020546218101AD42AC5054D4703587FF60E860A60375FAB12734912058D5B0B06430FABBFE0C0B43C22814F56DAE9E2713325A31C682C13F008B9A3D4FFA8A454F0F64A9213FF2D557A4CBC64EC6E4ECA0A976CD9F27497BA544DBAA3E2ECA0F54C2634C719B9C3A2CE37BCC8158A880BAA72780F8B1D3494F589E2AF3044B4FDD86F4DB2DF0843EBD9F3518870F55488F41E234CE94E907A69D28BD83347702750DB1AE2EB1454CDCA37A8B5FC90091F548BABF489E57C8919646E977274FC972088A522FFF9F9306D2F0ED6C01FF92CAE8440D7F3526B8C186D5B96942CB08032886051DA2A9FE77E38BEB18F4FB25F1152EDF9D61347A00A844929976A327BE46FFD3E2EE0B6AB1014294EC5D40CF7071C36B11127FF90720596C1B3065E7DE8010AEA469BB4F4AC5A6EFD20591CEFB7B94B2006D85CA475FEE556F24CC41237C631B75EB594F8342DEB4F976D73AA46563C1AA6D0B605A16152315626BA08807DAA6025CF62B29176F3A85E4BCA483EFFEA7E5939 -pk = F5E4D845B336F77B25987EA4301AE66D6C9F643740630520DCD5423A794560777D2F4A32E20B6E29FD1618B58CD9012121F90A61286047B507DBB65D10D601009B92E77DEAD2B15C2907743299CDA3DB44EBD03EABF9DAD031CECF12A65316C4BE5D248F44D5CD9D3907D7486EC2073146918B43C9FC17F96AB5C3B40A250A00 -sk = F5E4D845B336F77B25987EA4301AE66D6C9F643740630520DCD5423A794560777D2F4A32E20B6E29FD1618B58CD9012121F90A61286047B507DBB65D10D601009B92E77DEAD2B15C2907743299CDA3DB44EBD03EABF9DAD031CECF12A65316C4BE5D248F44D5CD9D3907D7486EC2073146918B43C9FC17F96AB5C3B40A250A0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EB7E379E0B14373D30D8CD5898EC4E44942A06E6BC3FD66BF2EB5A2167C3A10841438EF93C2F01A1CA4B1F4556308875A9E68C8D2F9E1A03E616F2A5AA4462F038720FDA1B64F9044D05E1FC39CF0C01839DF8F2F1C2ED6A5E0E00000000000000BAD6D2B608CA88CAB3C4D53291D0625C3C5610E1477CA683AC547D5DE1ECC550534C2380C70505331B8C9F58C9DD220119A308964375919073C977E8CEB5477D556C576B02C6A4BDDA5EDDCE3C1D8FE4ED231915FA9A1979EBE5FFFFFFFFFFFFFFB2075937332B8CEE5D6E0386D795FBF84D0D88E6762840EE009CB87B5CD41E88EBBDCCEFFB129418BF788C66B8F1C654C11B0D1CD611ACAF1350FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF856B4D100B3C613263A4F41CF424D0D4112704CFFBC1CFB239AA709F8032C900003549B1FB23A91C20E959BBE07FB26731E526FA8BB83BAC75080100000000000000000000000000000000000000000000000000000000000000000000000000001B4A96B462E41B99354AA692CB4C3F5F890FAF14EE87FAD31732A1B069001C4F7D327F9D6B080436DE9E0C2B534AA3EE9E4EE8D58A6BEF965C43382689601600D8509076D0AF4BCD4EBB64DABE483408CD6A3C0B3D6C3CF0CECA73090EEDDD0EA8825B0FB60067E28DD963FEE242078AEB7472BE49D6E42F98B821C04E1D1A006F8DDF1730A14F8B0B92022854D7206C7CEE3D5003EEF39D02CBAD48405666FEADD7AF51C416A32FC909799A41A61EECAE449FF3174FA59D34CF8B55997008007F3A1ECD229F5649D1F6A2EC865A51930B9B74D801378B3CCEA573DAEC6704FFDE3D4A71AF44925AF159EF1216E1873588D586310924365EA9F69D0FF53D21001740B83207DD536672FC25036A740BE014DD46529FD15D7035DF7DC759D4CF7D46813819398132077D60FA7DBB802A4469B78506CA46B494FC93828808001E00A8A290876EA548FA806787708A1E49D9108FCAFB0810849E9181E2AE0DBBDA3A359B8F6E572E5756006F554F533C213A1BB3EB2F3C900859B345C32C278D0A000EE544A715D7F5CA4B49AEF2D1AFE97338830461B5B6842B472DB7B6112887606EAD0C49FEF8270768428DC97EEF3B4727C27AC4D042F57C5286F0B89A0800007577F3EF62EE555B761DCA2AB73A3CB57993A70AECE278505235BF23037BD6E35540D7E6962233EE7300E41E8F091C632BB583C521CD9BB3306DFACA277905008B2D80A794402709C050C5CAF1F8E9281140D3FB6C901D0B1B4136080881C663F996BF77D3AD40FA43773AF82479BC09F002BAACA36D94658688378A1C400B000B248EFC2A45447ED04BE1118C1A1413C755DC6942305CEAA1BD3783BAB0F41255D5EE83A690C28DDEEF76865760F1FD8CDE37515DE13E5CECA2A58F6E02210091480476C01E0A516062872B941FA81C5D97E8E4315B38A1DD683DBE8F7974FF84AEFD575C3B72D824EFD3333E3754E7CD4BB5EE08FABEEC9AD2234B59AF0D004D9FD5B3BF2D70F128AE61FC3AA0091471484B3D81A00FA6823954C825938196D5D70537CD4E92F6309E1326D23E3BB8D88E7775C43E10B986121550B94808008454F68F552CAEB31625E027AA0F29EAAB352DF7448D9545DCAEC3BC0BFB4ECCD3C06E3321D6214F18AE570CE4E52A656E7521F0AB49E43D9BFBB7040E0C0500A1556AFE9B9A9A6C3B8030A29C0072139A17205E706F42E74E1F8FD5217AC3EC606FD6D365324A915B13BCFA7B07AC6D00036B55242DEE1CC5FCF162AC602100 -smlen = 2810 -sm = 440AD712BDF1BBD3E5B6F54A7E2B93574D8D019A49976CD42D056A57F9171B722031A5880500287451211BD679F6540D93EDA55F788D03E7008B076F1A9660811AFA533A77221D92E3E3EF01114BAA3EB312F73DE5697381990982C700420130DDC98D7AB6314EDC29A55382940E13415301EF0C73FD1C84C391D8F6686531A6D823E067007753BA91A25AC35D6A7DC6E26D3A881AD0DC0134722F2E89643B95EF20143394E0B16F5FB2009E07231E90292B1CC1DB58219AD227679A9101A400EDF29354DFCB212A2BAC12011F12B3BD0014FB71E4F1D385E1226BDD36172BCCE2ACA801715560BE3DA252E5A460A2395EBABC794C75015075436B6C629B570930479CCA6C25CCBAF20000C15EBE089C5E9ABC0FA82ABD587CBF14A60B104B06BE362DFD93FDB3002D39390703CE65C8A8C2948A379AC84E71A48AB756E9DD01F3B96C59BB03AD73DFC369EF1F7F005F7522CE6BD0CE6321C27B9EAA6F572616201F283C5EC171D0BA47662C2320897805E1551ED438F3FCBDAF9DE6F3A19DC16FE9C167A65B6E52BCF512C919561B548496A4A80AF7CE25458A62EAE92EBF677872482D8647C30C12BB1F080C6B9A56560D64FAB73DB17487BBB007C66661EA9DDA14601AB27A100EF4CF4B7447E51418651C03211F8FB884BE91F3980FE13E00EA4ECFE6D54882059A436C90BCAD80E4101CC6C0754417545F2D167629F80A3C5FFE45C00AB2BAF0494D6C065872B03A987A5EE818B3EF11E47FE1747F49E2DB6A14410F0B1F9610A2D6114395EF6EBB231FDF71D595CC1171DB9C89D6CF202E42D4FB968AB8105FDDB2AACB15FAB8014B534CF468D77ECDE2072623B7002620B7AC3E78B62AD673FEEF9F8E97E91ACDAB171FD415B2D15605DDE00D074A770E36F2218F7130F13E91FA4C88DEEA7E854BCAA01B8458D40625A33E982F0955B83080A926EC240E31F0D9BF477EE3A016E146A3909683410D4D09ECDF32EAEF580402F0D416DFC082CF1362E8B79158BD57739AEE56DC41A549E534C7CCF3620C7D7D95B92994A747D5EFB8EC43CFA8189BAA9B75FD54694E512FCA388B71A5B9EA591AE9CFA34183DE59D284AB16B2EFFA4B26A24A0E615B38B83088A9827EEB5C29B419BC061B033E0E3FC809AFDD3DE948412677E0BB5136854532639F3CCB176D54EA1961B5C527EF66F4B3286A583E86208AEEB8ED07D9E6BF1BEB33995F76CA480039A6130775895F19E3CD4873ABE3BF2FA9DE81BF0CB04575DD6AE282720B152CF0EC6A4A04016DB0F3543D8272AE56B1152B02EAF22131420CB194021F97060D5CE52EB21B57CC93964DD21344786E3888617152D2ABD829799CE47D20158AA93F7DA85CA6146C5BB94B512DA053C35BFA8840CA43F6509A1477603FD50F5E4F9A7CF8D2369156989AD638D35D345BDC859C52688211BF7EF3F4AD4944657289406BF01DCBB49D560A11840EF35DBC0C7F9C96DBEA76300CF61997A87D70F5FF8C51AECA2CF0680B6FE8C4025E1E25B62103D248CDEE335F4FCD67597103362003206C507970EA6D78CFF4B68B44244019152DBF812675CF667E5E13C8596EB6FEA3903BFB25ED08F902722A37F8E460E37A03A2D6ADBDF79DA20052DE658390484B83BBAB28D039A303D7376BF555181680B7966C798A1C6CB215257E37739DE7B9706CD1CF3AB031F68C82D6ECFA507C104115040744D74A40C49245215639D0CF4A5A7A10098E9CE3564AC3C44F0683AE9D3094784D354DB1AF439BDDF63D5CCA668D8180264EFECEEAC0BE1B8E1C6418E45F9ED6C779ECF169143B034CD9F332989D445C83A8786398C507B9171B4D95728575539CBB29C5B804268D88F2B39AF1F9572B8DAA9FEEEF69C4A77DC64BF2DBB5E57F8B33AB151769B2D00010D67A2D6F188D6D5B35E5E1873FE2B327E42AFB8885A842D26C246F7C18E6BCDD6FA49B300C65A3822121E95004928104017CBCE2AB95ACADB9802BF4BB049B8E96468353D649654C6F69D774380A5A387D6414DC3000540BAB6ECCBAA088C1068CCEF20036E5C8342FD512F55E6794BF85FE15721D99A1BFEEDC218617A940C8C25D4DFAFEC677D2A719B2CDDCD302294B7FA41AEAB5606F859CC0D638AC94B99AC3EA48C687D278EEBEB396DC5BF2D2E89E880F76B533FA54EFD30D8EE38B34DC5F8AE62C637E9A7E85D99E011F62D261AB4D3DCEB98A8972D3482CF817EFF476B873AC56963BD60183B359713385BA82F6E24BE2D6CFEA6DBB4AD2E1B5B790EE54D23F64E740502E887629B346FC8FCCC3338D0F2921131B84590B32C7CB82CBA8BB3B81EF7BC5CB12F0AA0B3C6A5B2878DC4F868057C68460C71D40D4263AC5C8B8317D2D0B63403C7549439A9EF227268372EC3A54CF8EE97714BC4B55007F92B1A32238659EC1EE27D6F2987AB06FEE84C3AFDFA73240963F076A955BF3C19410E1DA6A19B3EA3AE2DD8766082D3295D35436597783DAFDADB905465D05FC21FA8AC2737A52FA8AAEFBD2ED83F12545C1FA3198FF225D37070694C9392738E89467EDB2DA3CD1734CE398E32BCB1FEA2E4FE1260A2D9F9EDC3607A8AC8A51D5DA36E99B31903025E0CB157FD2FF5B51C9191CC16A9CCB870B4060CFB0FD900AEF62738A58C5726F5164417F084EF14FC0953E3C6036B818C21CA3476B8CC5F8EBAACE257A0315031A03E64E7F749B9DF99BB56CEEBBAA4333BC7270EDEE90FA2715BDDC38D44898A41998B2374B6EE3B8524D3A385C03868EE9479355092C4D20EC32DEB51497F4FF34AE7E7EA4828C288F46E5148DE28A8C660EE132E5B5489833DC66205EC968B60DAB96C2A4452A7019BBA9FE3D19D5829129E2A9C75C39416AC8695145F2B62EB9468198CBD48D7670DDC6AF2F99F77E7ACD01A34EA8E0E974206FBC22656867D09807B980563E06A559B0C3A7E6F43CF8DB75B18C0F90C12FF3BD43ABCE7DF75D17E631C08C974322010648FE2E2BC940E6510FB8835DF8384EFF3FE6A264687256C6BC0A5F9D2DDF208171DB55C4446B03CF27796BC77E3C68D8F1252BE21877D7C53747404420302CA5AE1AB57E43B158BE8B707360A2F59D6A473F98B816FDE2CCEDD92385202C419278E8B840DBA4C05E9BB65F68AE2A635A29110329E8C0C02F6FB5EEE41ED225051EE975F92DA52F93EB1FD7C0A098F6D1421701537298651313514AD31CB333E9C5DA719BBA95E73878BA41F9E2512862A80602AA2DE1E1D086576531330CC7BB8F0CEC38050B3CFAE5C8B1D6CB849A579F2294F8CE80FDE5405BFA3E6ECB01D5117203A4523591AC4030397DE9FF81D5CC91AF3002590F5854E852B88667638B2D052F2A7852425C8EC026E48D9EF5E73D1993D7F3FD7F704760562C36D2278C9CE131EC6AA444D7B2EACA3EE888D9B2AE122688DCB35455E7DE31562BA618F1183308B30D07A5C34020546218101AD42AC5054D4703587FF60E860A60375FAB12734912058D5B0B06430FABBFE0C0B43C22814F56DAE9E2713325A31C682C13F008B9A3D4FFA8A454F0F64A9213FF2D557A4CBC64EC6E4ECA0A976CD9F27497BA544DBAA3E2ECA0F54C2634C719B9C3A2CE37BCC8158A880BAA72780F8B1D3494F589E2AF3044B4FDD86F4DB2DF0843EBD9F3518870F55488F41E234CE94E907A69D28BD83347702750DB1AE2EB1454CDCA37A8B5FC90091F548BABF489E57C8919646E977274FC972088A522FFF9F9306D2F0ED6C01FF92CAE8440D7F3526B8C186D5B96942CB08032886051DA2A9FE77E38BEB18F4FB25F1152EDF9D61347A00A844929976A327BE46FFD3E2EE0B6AB1014294EC5D40CF7071C36B11127FF90720596C1B3065E7DE8010AEA469BB4F4AC5A6EFD20591CEFB7B94B2006D85CA475FEE556F24CC41237C631B75EB594F8342DEB4F976D73AA46563C1AA6D0B605A16152315626BA08807DAA6025CF62B29176F3A85E4BCA483EFFEA7E5939 - -count = 75 -seed = 63742CEFAE9868C3C0B31DDE0F9D378FD5D71BE7CC3F0B6ECD393DB55FB043CF00264852C45D1836CC12B9C872A20251 -mlen = 2508 -msg = 9FFA507328B2129C9F05A22B81A597FD1B8C27D554B36FD3EB150BC5FA0C6ED967EC5BE6F1E52D3BED1508DC3C841360020CFC2CA1B0713076251F2935EFA8500573CB4634C78A1D0F87D994E8E2B0BD265A877023B54D9A33282C12397DC74CAAB07AC2EFD140DF907651BCD1B37CAB2D03F77CC28872291F1CB28FD4BBB5331C2A18E02120BFD2D9EC0C8938A6D43681DC03527FC2BF59703B5160D8E25D08534EB5AA5CC9C10572257D9E4DB29235683BFE1776A2D9EDACFBA1ADAF66587BC451D32C524C7934556F94776F91CDDA96D2E5CAF91A39503D3A742DC5A0EFEF7C1A13666E200C5E3FD7652D200ADEF51FC5136281570B7832E0C6E7552972E43291F202E6F916C916DC3FA48858F3D92B1B7EFD42DE140D43648AEDD7C7379D7A4B71751A3348B6BBA3B0DB71B4C99C41E085E5536A3F0D2BDDAA88069249E21E2D9906191BBB5C8B45353DE72E00270431847AEB4FF6230CEBD1969A0FB68D6E302B78DA39ADF6C0E681117C8432E24820B9EBF38838545E95CF7AEFCF1E9436CF48E87B6C5181CB418132C7BC050B9498720D7D534792E0585F05DA2735B7E68FE35DEC358DA1BF1681F7F62329BEDFEA3D12BFB26AD9403F3AC1DB96D828050F39DCE4017B45C5DAE4D7DE9E9F687A9D7FAD1AE0E7197184142F6818A63D5617BE9D8D82334A12E68F2EEF88A0DA3A915DE63629550D8A64DF591EECDBD1B89EB40AE9F9D65815271693C85F2CA41BF45E4FA16EF8B17D945EC61E757C6C609D8AFAEE32B3CA628842DB255B619F6562E656F6125FB27195EC82FBEB9C14330DAB649CDB74F523F5A98244194581503356B5B7EC51E2B35AE889452D3457EAD713C0715AA7382DCC510B16E771B3A5A91949FAF5E29223C8F1F861BC3B4E77E095BB61ABA00EB29C065D6F9DA9B4413D61B2202547FB6E34671930EBCDCE4C541B3E2DC90073867A47197E08C96F74ED81DE5F10C37C062E8D82364D67EB185CD098CAC1BC3C522E4FABDF2FBEFB66B9EC6E848F732A737FA7B935EF2848C29B1FB94044996EEF006E251BCEB5BE356F286F0FC85E5CBA627B67398CBFD6C0F520C6F896353FE75BA323D8ECD9D3ED2997580E7E1E49EECD91982C5DA650D6B128068B8D3D72C1EC4BF1FBF121BA96E1CF5F247F9FDA7018CB609329B1C95E59E112C393C45EF7138905902227CD21A39CE30397FF017495BC98A968FB497E03DE5843E64923683F2E402DA63CC25AD0BA13B85E3E379B08DEB39542C06A268BBF44990447190A1F8ADF0D3ED9ED9917886210864CAD84E7C4D1282C4D3BFF9DC23E4FA68EF6B0480E76459D1B5E0A7CC0CFC17F59531C4C1CB1D416B7D009AB50173F706289DBB68201C305E39FEFAD87929EF933006598CE0F0242A2C60955AE487115B4C367A7E49488491A6F044FA8B7AFD81F6DA09D29D4BEFE1B3C9EAFDA4F17D22EAAE0B2D1646906D1CEE65614640B53479E23831C56EBE12B92997D5FEA725D78CA75F4509EEBD3DF4F741D6B2770521BE2AE63CA365FE1518CFDCD5088D58CDFB8D3DBA76731F74760A47C9D619A31B7E318E957194AC5ACC6867CF8C9C235043D5C09240F346FEA840AE0BB16094883FC801DA0BEFAC64A021F6F871413249E9C7F5CCA92F4EAB5713B0F2CD6C950F34BA6FB1CFAAD541BD5FAEA45EA5FB37258301A49D7BC4657E3E986D707213C0F836B030C21593F11518EAE3A8A95A2EFC8B9839E79CD8CB0E6DE59D5A43FF8F81FD35392F0C0659B7679542136782D559897FBCC0129C22F43A30CFB27E899A8CA52453F5459A281D0CC21F902403A596C7F69CBF9A64D97B935AB384FBEA5851D831E8420066826D7E11E34047D18CF08283BE8F29A8A79B0F477C27BC41B8EA4AA010ECF8ECE0D37389FF13E235A4526070F96F415D41AF2E053FD4440DDFFD69799456E7335CC6D9F4370008803F7BABB6C58B6996DC5A52649E25463B5267C188E2DC39B3258636ED8689E5C02E00574988B3AF881D30E9EB38AC51C1E00E1C0A411ECF37E314276221D7D8713F7A449E38371854EA26520ADDB58082287FAA1F77FC04095499A3C3A331A38852A287B24040C1CCC054086964FB1EE2B328F3DE21A986507CD20B4DE4898DFD15045324B93FDF85E5392DE0F32C3BADD04784012E97CB9BA19472B0C20EB0A71C89149EBB601ABAA4A853F2C75DD2622235AC30D97B9D7B1216089B9CC8E879660E40EBCD15203404A8DECADC42114715F4D8A6A10511BACC4DDC23520445A95FA3945BC95878BFF18728E64DE8B7767CFBBAA21F3EF2D92F3D7DFDA792BBE4E5B3381077658BFBEF8DB95B64F9F2A44917B38DF6F9391118978544369C882B218E7A7A31AFC3EB9A75A28095C4478DC81F9CFA127BB749CC53898409365170823D65A0B46BCFBA0E47CC0C5F6ECBEE09131F134EDD254F4F58B50C486DADA13195B1A35739420A45BE6558401F64C3B6AC94B73397925C20545621C7ECDC7DA9F71A755F84D27F2C6D8415D37F2BF1966A76845216E41764AB96DC2E14C12DF3684F7683FDAF5EC771DB7050F81A4B3E516C7D5C955201A18F436962476C1284531764A9397E0EDBFFA8C3699929DAEAF968B4524BD98EE62F9A0DB9CBF99FDA80CC6C57A5EE1099B1EB29799A5B5BF5593CDA26CE2C66DEA3D40545465C1D21F5B9373556B9ED0AE30E90B836003CA83F78E29BD8D49550286DC2DE6407860E9A9CC5EAF3E1B1C73FC2D248B81B1CC8F59DABFB5DAADE6F2A0B38E76D9E6D0125955D08DE7F334A56A8F362CC5D883D56BF7BABAE6D9E425376D34A05AB863A0D9ADF7C6FDA574FA8DC60965E021532C25ED4D568412D4143FBF2C4EC2F230D08337A4E546E01F7C1BFF4C97F2F27AF400CAA57BCF398AA5BFFE155B0F29A085D5053DFBEDC3423818DE8FC597EEAB2C1663D8C81C71CB876F73AC854286063A2E8BD8614D06B80F3BF56381179342143F4C89B8CEFE9168B6A96F416DC617B9F544F9DF65CA6F4F7A84A327909666B70CFFE889C86ACA706A0A1365E248D6B341A004A27D4EE344F03CE6E85D3573E272D48210DF7C3178EFB7BFBEF7765D24754673C9EEC14C7513FD8DE6386B0829EF0980B826EC9C77C81D1E3B8CAA65992DB9C2F8DD691C520FA6F233AFAAEDBF287A57A9A66D2330F4636F02EA3148C4BCD2C8B114D48A1027FB3BD5008D732C427ADEDEC9969AEAD451E166954FDC207C1A4EC409CAC60E42383385187AF44F136F91A8461E62EAFE6FCADD1E491162E46CFBBADDDB72E5B54B7C655CB9489E7F4F7E55C93D3AD50CF84E1F47A706FEDF818A5246BC755D6D18EF18702F5A90CE51812A67227C5E5A051133576E9EBC18AFA18C1B05C854D343727B25BB10E3B9A3645D789287858FA43734D66AD831E8646FE604286544238DC99ACFE3C8285230FC784BB73360F72ED34795B1C46EDBE32A346BFA7F534B500C6C9D3EC26AD7ED20D1500E3DEDF141DF3C2F92E981472F0010A48F25429329AE92CBBB918246F5A53212703C75DFA15D014801A830DEB75BAA36 -pk = 864407156D0092C68EDE2BFF4A065BE853898E85FA86904594472AEB943A2FFFFB574B6C556A23EBDFF07CE16CE0CF48F5637BBC636A3F9800A6C59B8F571A00F9B7949B186734C6A1A96A705C13A76247F37025BCC9BB8AD8A6F7AEA673D43918FE5BD530D59C89F8A68D32FA3234F3A0CE9A27C9A056F8EEE69B5C4D9C0800 -sk = 864407156D0092C68EDE2BFF4A065BE853898E85FA86904594472AEB943A2FFFFB574B6C556A23EBDFF07CE16CE0CF48F5637BBC636A3F9800A6C59B8F571A00F9B7949B186734C6A1A96A705C13A76247F37025BCC9BB8AD8A6F7AEA673D43918FE5BD530D59C89F8A68D32FA3234F3A0CE9A27C9A056F8EEE69B5C4D9C080002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C948E5DC6269AFCC84524288999519A8F3D8CF639C7C39A38DDE232FF745EA868AEC0D2EDEB59CB175603798C92FFC947E26B1ED819E78F6116E5B70CF5854DC60A0F5CF3363968AB0D26D31F4478279FFB31BC94CC0AD5BBBFBFFFFFFFFFFFFFF060AD033FDFFC36702A12BB17CD0BED8A61AA86D2536A8544430C495FE52D479E8B7DC2D38D0F6E11EABA95C4D9D9B5F54335F000AD81DF268ABD78AC75CD2D76D8F21A43DFA06A146537E3BA2EA831330F4F21B8CEF54B7DDFAFFFFFFFFFFFFFFE20F744A8AA8E9EE32428A13C1410EF16C55A864C75134F40433C222684E8136F63C022A3BE7BD4706E14A0D25128850F89B542CD5FFF9F953550100000000000000000000000000000000000000000000000000000000000000000000000000001970DF141B7892A05CA95E3E3BC0081785CD8DAD4DAF218355EFBE9151AE455685520B9363AF82DEA9708BE532414DBC7A58A936891CEE9BEE65030000000000000000000000000000000000000000000000000000000000000000000000000000483FA2EF78061174949950401593791EF5E0BBF62F2D7A9934E69CC8853F27BC8F441B4F1B0E84E3CF3CE87C8A65E7BC2CD0CEDBFBCC94AB41A19A348DDD21003F0EFA0F4A8C2FA8AEC5A54BEFC5BFBFC6BE6E74A571D616A20983D9AD907C0B7DD4783A67DF6A6809DA1ED15AE7C544711E513EF40F3215A34DF5B132981B00D09BBA0306E9C3E09A15A4D6DC8D6EBCAE43AA16253B63D0E0AF07CDAD5C05981A173E1EEB81B2236F3C34A621A9854C38038F3082E56BFCD19686B447A416006BE6F8EA41F0D97CB037F5B0B781D80A8C78BDE05D9F6ADDFC23B3E7C6061D9EBAEF5575899D3F762FCC41357A2064E9EBA89F5B37224E243BEB3B8E4FB1050072B51756854D2369D3E83AF78E11DA75EFABD25F28A386444F3490AC610046A4ED37163C9E9E41C509987CA6F4718C9391F89A6571B77C3F305A520036BE1600444CA0977013837B9AAF38DE66F4DA29A77A73028096D3B186DB7E594B8D64CFC47306DEB4D7995A727CCA317ED410AB41E3FA1320DA22E1425A7EBC7C470400BC22A880D58A3A95C7263F33FF1B77989AC71EF2F71299DAB287764BC15D44CBA16998C1ADAC57F2FADBBC85682B88337C7F4C30BE3134BAB51DED207FFB1F001DEE7DA9BE377A0A805AEBCBF183FAE263DB24EBF1B38421A71F321DBBF88F308D44C960CCB6F16CBFBAA6AAFCAE915D619AB8701BF25361FC8C9EA9947213005B949784D35850DCD1D5659D4B408B12BA6DCA0B8D5807484F069889449711ADE261409FC08E287030649522AE96FBC6E15549CADD3AC8A1CF4B33E630592500A959CDA64814AE3C1427D00DEEB778CC2322AB6FE69AA9BF3044CF62AE4D8C840C65A03166FF9845C2B611F9D32AFAFA205E2A8DD715E85EC4D1A9BD6EF60300C4C0238D6800D6F81C4F8281FE5E1B8829F73065D5E4CC053B3722657ADFD915CC5670ED540803872B6D8D5E7F2FF953953E46566F7BF4980EA9CF2534C003002FAA64BD09FBFBE2BFADC85B128E1A08C79195AA7CF28F92CA4CBB0613BCFD15DA17C899D5BFAE98E2AD2329CBD8894D2C97BED60C55C8ECCCED51FFC8D109002DDF8F9489EC9323E96F20C89C2F12126E5D3D9D9F4C1824C6C7A39D74E28E77D9291C13D687296F96E31F4655A88A587AF944514EF2683C26347C9D37D80C00D8F3E7DA399BD96A95C531D35031782A8935727D8EBAFFFE08D36757FFE8DCC7D2B422F795778036B38C5250912B8AD25F91C04D5D2344E5FEB09829598C1000 -smlen = 2843 -sm = D6263FF65176384A6827337F80E15022B4C70149AB477CB2321584F42CEEB1BE00197C2BDD00894A702A41F5EBF882392F243F9DC21CE70101FA79D663CF4DF3A9161A6169C52E84F2FBE50114A8E6CE89E94C7B617C793F0EBBE75DB9D400EE54F0EB8257BA80CB8E1788636DFEAB9208016F9E9651B29DBFC2EC7526C61931B291569B014845142DB81E52BE291253145DB0959644EA00752D972D02979A17D99986FD736C2357261301846D753461C4DA89455797E972C6F76090F4013CF3B76658AF95A3C5D61BA2524E08FD065C00C9C31E2FD1A9C186B01CBB29F27D7589249300B3EE71421E03FD60E22CAE8013CB0B04C8D400E025BD08FF13B92AFCC791A18BB5B879CD7B000177C689B103AEEB04AD500413DEE8D0301FE1C9676419F9BCB3BF3E40062E4EE30403CE320179F8894136B6EC86A98C759387925A003D28B85038DD3099F0803B066DBB009FFA507328B2129C9F05A22B81A597FD1B8C27D554B36FD3EB150BC5FA0C6ED967EC5BE6F1E52D3BED1508DC3C841360020CFC2CA1B0713076251F2935EFA8500573CB4634C78A1D0F87D994E8E2B0BD265A877023B54D9A33282C12397DC74CAAB07AC2EFD140DF907651BCD1B37CAB2D03F77CC28872291F1CB28FD4BBB5331C2A18E02120BFD2D9EC0C8938A6D43681DC03527FC2BF59703B5160D8E25D08534EB5AA5CC9C10572257D9E4DB29235683BFE1776A2D9EDACFBA1ADAF66587BC451D32C524C7934556F94776F91CDDA96D2E5CAF91A39503D3A742DC5A0EFEF7C1A13666E200C5E3FD7652D200ADEF51FC5136281570B7832E0C6E7552972E43291F202E6F916C916DC3FA48858F3D92B1B7EFD42DE140D43648AEDD7C7379D7A4B71751A3348B6BBA3B0DB71B4C99C41E085E5536A3F0D2BDDAA88069249E21E2D9906191BBB5C8B45353DE72E00270431847AEB4FF6230CEBD1969A0FB68D6E302B78DA39ADF6C0E681117C8432E24820B9EBF38838545E95CF7AEFCF1E9436CF48E87B6C5181CB418132C7BC050B9498720D7D534792E0585F05DA2735B7E68FE35DEC358DA1BF1681F7F62329BEDFEA3D12BFB26AD9403F3AC1DB96D828050F39DCE4017B45C5DAE4D7DE9E9F687A9D7FAD1AE0E7197184142F6818A63D5617BE9D8D82334A12E68F2EEF88A0DA3A915DE63629550D8A64DF591EECDBD1B89EB40AE9F9D65815271693C85F2CA41BF45E4FA16EF8B17D945EC61E757C6C609D8AFAEE32B3CA628842DB255B619F6562E656F6125FB27195EC82FBEB9C14330DAB649CDB74F523F5A98244194581503356B5B7EC51E2B35AE889452D3457EAD713C0715AA7382DCC510B16E771B3A5A91949FAF5E29223C8F1F861BC3B4E77E095BB61ABA00EB29C065D6F9DA9B4413D61B2202547FB6E34671930EBCDCE4C541B3E2DC90073867A47197E08C96F74ED81DE5F10C37C062E8D82364D67EB185CD098CAC1BC3C522E4FABDF2FBEFB66B9EC6E848F732A737FA7B935EF2848C29B1FB94044996EEF006E251BCEB5BE356F286F0FC85E5CBA627B67398CBFD6C0F520C6F896353FE75BA323D8ECD9D3ED2997580E7E1E49EECD91982C5DA650D6B128068B8D3D72C1EC4BF1FBF121BA96E1CF5F247F9FDA7018CB609329B1C95E59E112C393C45EF7138905902227CD21A39CE30397FF017495BC98A968FB497E03DE5843E64923683F2E402DA63CC25AD0BA13B85E3E379B08DEB39542C06A268BBF44990447190A1F8ADF0D3ED9ED9917886210864CAD84E7C4D1282C4D3BFF9DC23E4FA68EF6B0480E76459D1B5E0A7CC0CFC17F59531C4C1CB1D416B7D009AB50173F706289DBB68201C305E39FEFAD87929EF933006598CE0F0242A2C60955AE487115B4C367A7E49488491A6F044FA8B7AFD81F6DA09D29D4BEFE1B3C9EAFDA4F17D22EAAE0B2D1646906D1CEE65614640B53479E23831C56EBE12B92997D5FEA725D78CA75F4509EEBD3DF4F741D6B2770521BE2AE63CA365FE1518CFDCD5088D58CDFB8D3DBA76731F74760A47C9D619A31B7E318E957194AC5ACC6867CF8C9C235043D5C09240F346FEA840AE0BB16094883FC801DA0BEFAC64A021F6F871413249E9C7F5CCA92F4EAB5713B0F2CD6C950F34BA6FB1CFAAD541BD5FAEA45EA5FB37258301A49D7BC4657E3E986D707213C0F836B030C21593F11518EAE3A8A95A2EFC8B9839E79CD8CB0E6DE59D5A43FF8F81FD35392F0C0659B7679542136782D559897FBCC0129C22F43A30CFB27E899A8CA52453F5459A281D0CC21F902403A596C7F69CBF9A64D97B935AB384FBEA5851D831E8420066826D7E11E34047D18CF08283BE8F29A8A79B0F477C27BC41B8EA4AA010ECF8ECE0D37389FF13E235A4526070F96F415D41AF2E053FD4440DDFFD69799456E7335CC6D9F4370008803F7BABB6C58B6996DC5A52649E25463B5267C188E2DC39B3258636ED8689E5C02E00574988B3AF881D30E9EB38AC51C1E00E1C0A411ECF37E314276221D7D8713F7A449E38371854EA26520ADDB58082287FAA1F77FC04095499A3C3A331A38852A287B24040C1CCC054086964FB1EE2B328F3DE21A986507CD20B4DE4898DFD15045324B93FDF85E5392DE0F32C3BADD04784012E97CB9BA19472B0C20EB0A71C89149EBB601ABAA4A853F2C75DD2622235AC30D97B9D7B1216089B9CC8E879660E40EBCD15203404A8DECADC42114715F4D8A6A10511BACC4DDC23520445A95FA3945BC95878BFF18728E64DE8B7767CFBBAA21F3EF2D92F3D7DFDA792BBE4E5B3381077658BFBEF8DB95B64F9F2A44917B38DF6F9391118978544369C882B218E7A7A31AFC3EB9A75A28095C4478DC81F9CFA127BB749CC53898409365170823D65A0B46BCFBA0E47CC0C5F6ECBEE09131F134EDD254F4F58B50C486DADA13195B1A35739420A45BE6558401F64C3B6AC94B73397925C20545621C7ECDC7DA9F71A755F84D27F2C6D8415D37F2BF1966A76845216E41764AB96DC2E14C12DF3684F7683FDAF5EC771DB7050F81A4B3E516C7D5C955201A18F436962476C1284531764A9397E0EDBFFA8C3699929DAEAF968B4524BD98EE62F9A0DB9CBF99FDA80CC6C57A5EE1099B1EB29799A5B5BF5593CDA26CE2C66DEA3D40545465C1D21F5B9373556B9ED0AE30E90B836003CA83F78E29BD8D49550286DC2DE6407860E9A9CC5EAF3E1B1C73FC2D248B81B1CC8F59DABFB5DAADE6F2A0B38E76D9E6D0125955D08DE7F334A56A8F362CC5D883D56BF7BABAE6D9E425376D34A05AB863A0D9ADF7C6FDA574FA8DC60965E021532C25ED4D568412D4143FBF2C4EC2F230D08337A4E546E01F7C1BFF4C97F2F27AF400CAA57BCF398AA5BFFE155B0F29A085D5053DFBEDC3423818DE8FC597EEAB2C1663D8C81C71CB876F73AC854286063A2E8BD8614D06B80F3BF56381179342143F4C89B8CEFE9168B6A96F416DC617B9F544F9DF65CA6F4F7A84A327909666B70CFFE889C86ACA706A0A1365E248D6B341A004A27D4EE344F03CE6E85D3573E272D48210DF7C3178EFB7BFBEF7765D24754673C9EEC14C7513FD8DE6386B0829EF0980B826EC9C77C81D1E3B8CAA65992DB9C2F8DD691C520FA6F233AFAAEDBF287A57A9A66D2330F4636F02EA3148C4BCD2C8B114D48A1027FB3BD5008D732C427ADEDEC9969AEAD451E166954FDC207C1A4EC409CAC60E42383385187AF44F136F91A8461E62EAFE6FCADD1E491162E46CFBBADDDB72E5B54B7C655CB9489E7F4F7E55C93D3AD50CF84E1F47A706FEDF818A5246BC755D6D18EF18702F5A90CE51812A67227C5E5A051133576E9EBC18AFA18C1B05C854D343727B25BB10E3B9A3645D789287858FA43734D66AD831E8646FE604286544238DC99ACFE3C8285230FC784BB73360F72ED34795B1C46EDBE32A346BFA7F534B500C6C9D3EC26AD7ED20D1500E3DEDF141DF3C2F92E981472F0010A48F25429329AE92CBBB918246F5A53212703C75DFA15D014801A830DEB75BAA36 - -count = 76 -seed = B887F07DB5358C3FDC2402947BBC87ABD064B02A859FE8DB37B5BCBB916020443DABA5534A0778FD0B1C05EF3ABE6269 -mlen = 2541 -msg = E7E845902E852B331EF9923416E492C1641236E4E72408D800FD70774BA32B6B4BE04B6E82237A247D26F9A33AFC4745C16CE0554774C68B33CFC6E67AE34E42038FC6C324972642338DAEA75982C71720F1EC9542DF94B38434DA34A2003FABD9DAEA1950B7751DA6C81AFF7D03390F5D63455D417F5D12A510337A16197EBAF921B6A7A9A9A58F9696418ECED6B27CB8EFC8ECBD9B68714F721561AF8553A0D84E30E009A8985D011CB994EEAAF88C76F7F3261B47FC174155C138DB2EADB09A06073B211FC0D27113E8FEA0DA56E181CF532BA8207F5D80D6A30D8BACBA540D49A81A0763A0467DBA7883766ED6358E809261AA3D8B757C839B532F272C5767671A3A8BF3391B14F5E97BF2668A4E98847F1ABFA21E2370870DDF24504F89B3DB71E210C46D66EA7296D65C926E2C955D899AC830CD9D06808A68E9B3722B86E878CF21A5E5D41D7F3CD95D23A6344C259859735AE1A953ADE13CA103692B33AF90ED0345C7B038D938F8F494D90CBD3933B2A80FEDC2BE57960DB23AD018BAC63017A04FCC510553226CD86C74AB90E13C72A1BE12E4D751DC670A98EC4F81E9F8954A693FC7175BA7E50D340FF7F15D568D0ABDED0BB1FC557B1E55971B4C4CE8CC1B4D9E239C73B1133C9E1672DEE36A2D9527F315C21764648643D866B0E2AB6D2DEE61D838BC5DAC183FC511C4501B6E535ECC54F3EDAD6E8EDBF0DE7CB70BEE861B2BFF0D41BB87FFC0EBCAEE9A6DFB98D31D35CFB6DC0442FC285AD0879E7B218B6E66453FE04207FE814C5F72E49406B48FCB1DB145753DC2A2D3E9793594F7EF1A1A6339619E1040CDE605648234A51B2F6774B31C7F9A77C2CE3B98819132BB725D288C65901F7001E05FE5326B6F701C337D41C8CF8748FF9C276ECD398C725C36C11857605F58C0B154DD9F3C1B4649AE677533EB0338B7475254E273B786C2FE7DB4C13468CAF0AA2AECD55DC1A5F868C8EDFFD8BE8DEEC20A9FAA621C4680F3EEF4DFE4A79794FCBC5F8C56EEDCC3E1963569A36525D4F6A5BDBBA5D12966FD8A0FCC70783FD9F61613842F80D000C9281CBDF28C01C6F6AEAC10DF1DDCD0322E00C4E3CC801EF091D9C1B01E84DCE725D57C800D38990251AA1D1206AD93A7DDA40F27726D6A03D973150F7A88703724E314C0953D56DA6EAC442A70C2A08BC66BFA2B0EE11E185131E352D10DD714DDE502097AF0AD155AEEEC2A6B93B149B75DBB898B2B3A7C5FEF2F48D9B12A580F54C4EEF3FF83A4F13F2F194AF551D4800AE86AAD6EFC82CE460D325CBCFEE3400AE939431AB4070D7A7CC005F270896051E32B1051E58941530E250F05AF19FF416E65CE40655FDA31D2E7A6158E07DA08FA61AFD5319B682DE44AFAE146129A8B769C1708A5D3479B6C910B2FF0FC872A4A41AA8BF3EE16F80011D163B599D18501335A2BE10CF117DDA094FE01596C404C14580A7075D04CEEF68BD8F813D7DE6599F478F3DE9CE60B294CB7CE5284A61E078939D08F3D4FD998ADD3B92532AA54E0C31087CF14BF4EC964EBAAD53BD15D04E37948E94917DDE181EE3BB2346335FFB403B000F5669019C5281D88A0E771176E49DD0BA22E719C0B731EC2AAE9C898E74B2967BCBDCE0D7D73057E004BD62269F4E7F3823DCC18CD6C551104B9B896B0AD138DDE7C3D761138641BD3EFF3DF1552659FD97BDADFC59A05CBC622A4492A1B22CFF72AC197D61A4C5A949AA9AC09D4C1112F4C1B1CAE353C70278A21663E11F27E9EC66ECD4AD56F2179A3FCEC37AC3A3F4B33C06BBBD4C8CE8E74825BBDA3E58A2E2D928C2C6E6D886274BC0E2175AB03D8721C664FBD6455DB2960E3AEF0BB25AFD3CB0BAFB71A2BD18A89ADAEE00AADBC7E4AE70ED4B534AEEAB88559194755F9656B43BC83E3952000D9E2295BF3391904218A015C786DE0144868EE4AED203B261FE743B7168788A0680F7484792A3F64782B2B1ED9217B09AE9845DD71ED363F18E8AAECD51A4F5913AAB33FEA3FC5F1E37E0CD6333D2A8347CF45EB7C4AD967FE6FCFFF3565743435EF09A646E75C7E968ECF4202A9B2C23AA8118A1683219B1155C2CABC95C696704F5B270C6D213332649363AE13EC811E9A1090D1603EFF745E2FA83379DFC6DA5EFECED556E46A8A5FF1F2A5C0D911B95C20EC2465AD0C96AE7E16FC36143762BBC0734CF4D6134DCB0D739F7822470E0ABF66A0AB15CE0D6096D3ABBA2CA4C81C1C68BDC252A8A4BA609B7C05CCD913EA56126F418FC0B06DE8F76EF651F8085604C16E5910F3B8651AB78296B56B78326E41AC15774E442017FE5B291E5227EF5A4B78CCFA96D6921C8542A8A984BC87E2678903869C52C2568FEE4E23EF3CC466CE270614E6472244A4294B31F9438F7E43437FC9C9C5F3EFB0F4F0AF2110A613661DC24A1C7F7A7F8CD14A943821F16F94BD874F1A32E305DB4776CDF6633446724CCBB2488B1B06F0177819D53885127E6EB717C0D6718366A8B8A089AA6AB17CB2581A75EC748123B7D0383F3900EFCFF77D2E022E90AA41491117758221A0B149C8EBC23CC01C17B9FD39118DAD413A391CFA0A5C614208060A61646C7CF1DFAD4ABC3A9CC5CD566DB2AC8FAF392C9D8E7DA0F84B941D792A8493FBEBAD30D0DAA0D683DCC1583F0C9019622EB6C92FBC475BABC8B626319BE2264ED873AC063F84B7F83688AC99D732A1E3FC12281BFB1E1E63D48BFBFCA619BF4B95F899C50AD0F5FE4673347DF2BBF2CA21BEF49C7F8440D95A83299960F1E42B457ADDCCCE236946DE80FD4862BAF36387E041DEAAC3C9751AE345512BB1F423A3B4CA8D3A5E3796D289641D3424FF22670A46552EC68D7D095E8636441D777DBE2E9DBF6B5FEDE5318516C3886B943F6ADF17D8B7CD40B20A48233C9FD981145B45A5CB8F6A88EAA36C270E93E1D876D7781BB92A1FD99727D8E0AE34C73398AB8781BB342F5AACF4081459EA5EC20C30CBB6122344C457F92B20448F78E1A2A291202003781EBDA1747061C6CE1F8BF882FEA4FB50BFE638685CD638EEC15BC24252567025FC5C16ED1F5D98DD90C76E720EF7B4E25A20D262E339C5E5BB5A9CF051BF5FD1F63E93452A179277B57956821CDD901F1C01E634AE18485708A6ED8F592AE2EF3A9D54C9734FFBADC6F0B86D0398AECE9374F9ACAFEF38D4B97BE9B932B9852F97AEEC435311A67AE344AC1985738C72F52B3D8B71F64A916240477FDDC5FAF02F8224EB35D310FEA03FD2C5933047355A438676D92EADF70DF662D97C2F5E00CB293053699D51D302B78145C77AB03F34EAF170EDA5215436FAF0238A4B0D41D29F36052A5278C7D8AF9A6FFC6E2B6FFC4C5D524F7640A7170957F3DE2451AC75589CE328B61EA7179FD990DA1698F5C73BB8639A4DA2AD67D364DB04771CA118C4055C25F1120A0643158C07CD22B375D5C1DFA26FFCDA44921F41D4A504B2279DFF03421CAD19960F87C6B6DD8C29981CB66C9731F931E43B0D97C6AC9862E2CF711DF0DED8E4D06F3957FFF9085A95D9FCC95610FDE22856B229A3121D8B81EE83DEE4A6A9FA3FE8C75351574CB000BF7F3746CA1CC5414AEB23A2 -pk = 16E7B06A3D992713CEF14F558C78B913452E11256093C40EE13C821D324079737CC7B3ED024EE0DF154062162907F40087786C2B0CFDC67A26C56CB23FA622005C6192D5234F9462B6BEE76762A94A757B954D5539B1B7891F2AD8243E2507B6D849F1AFCE2C44D77AB819A84E61E5CDB2E3CBFF48FAB58A46108F229C500200 -sk = 16E7B06A3D992713CEF14F558C78B913452E11256093C40EE13C821D324079737CC7B3ED024EE0DF154062162907F40087786C2B0CFDC67A26C56CB23FA622005C6192D5234F9462B6BEE76762A94A757B954D5539B1B7891F2AD8243E2507B6D849F1AFCE2C44D77AB819A84E61E5CDB2E3CBFF48FAB58A46108F229C500200020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009086F4910D52133D0232B76655D2853059D76E61793732603EA4CECA179D27FE27A4C5A7B7EBE442C787ACF33E53A91CC6696D12D17070ABD88A8769D42ACEC8D7B148A91256C292503EBBA12BCBC90F06656B3D2DA8E2EA5F0800000000000000819F39763E8EA7299A51DDFA69109CDDF2A03B465385FD50999113F9C4D06FF2B085FC45DBDE282D4C723FB023D18D3848F254B4EF9976FF2CB9B3A1A66C2CF2BA50D285729C7AEC219F30BDC470F4926E121AE42D849B6693FDFFFFFFFFFFFFFF27A845DDFD5A1A8A600CFC41AF7432EE649F590F4514559657E855D30EDF01767EDC17EF3FB025A5C6AE5651E457B2E33FB6C15013F34680F374FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44F9BC895FAE33D7BC24BD0215B2AE0D6685B781C47053B8C7D3A4B89F5E9E19CE61D2F1594EEAE9DAB39BA84C103625B45F813D306909E89CB902000000000000000000000000000000000000000000000000000000000000000000000000000008A6B5DB1615E92E307C4132C7ECA6977544F364843C1D6B5B6DBB7D3759A3A4D286EFBCCBE420276648830FDB7A5167F3F8AE94FE387490F4F6F9317DAA12002A102A0D5F028082DEEE0D7CCCF97D30980D6D1655D19550E1F928535810EE9D2BC6D14FEE09624F3C08B74C6E4B14E88535E06ACB1C18EB66777018AE9C080005AD682D89E10A3E89AF9C46F79EEA92FEFE98F8322108320176566CD6457499402C48B3A527B896384A161BB7D343541945A633E451B0BA7B136AA834461400813AA20106940B511DB6DE5F8E2A71DCA339BB32CE12E5330DB1E3A8358FE0BF0B788AA0C5C27A3AF365BC2692C053EF043EBC897AD2CC37CFEF28D0386E1D001EDC8CA34FF5D9BBB98614500C6300D974F93992FC4FE4E7C34FFD1C1EFCAAD5E9C8583DF1B697E4C4396F75EA115C8AD1ECB3C1B1F93D0C90DABF5D88B301001DABD780C8D3609390F565F644A9ABEE474ED106DC59FA1FC51CF7172399BC0EDDC428DD4B6C79040CDF43EB462DB213C457D58F54865CB60B1E8FA0C3EE1600501691F6357D896A44CD3B1CE413FA31AA770BD8C918353063B7189BF9298C659EA6B07F9E37D37362A4E5B81CF89C80C89126A6F324EFBB24CBE514F3CF1D0066CE214ACCE5DB0E81F376221C66FBE748DB0114B9DAD7F103B238218906C35FC258E74F7604B462214B8C083123937DA0B3E23A1B8DF20AC52429F9B74F07001FD451256A8DC9C2B05929D5B14141637B1CCF95EEEE468C9BFA0CF54E3714B1C13DB8FA1629CCFB71D65265B888454AFBB9DFD386137F1BF7F618486010030081692EA72D4B4C9102024E3105266DCBC8C8459B2955DC9CB5F95D7F5489C92DD45CDBD25F3DD4F2C7DBF5915CB277548F0DA0E78A0B1C017989EC04917C1500324697A173DAAB263117EA06263040DC331C72A4AB33CCAF90469096C04ACD99D7B30252B08D18D91A102E06B169567D1F9CFE1376F8F8862DC8F1B30CDB00005BBD12136A74F489C643CFA8C7335215E6335EAF16274D9B6A82B7A54A4FDD7963084B7677B32A530CA88498E1C0C2816E13DA43C7C586F24136FE60A81B2400DAFC12A48FB83A00ECE1CE17692EF37442B9B9FB7B7700910B2A3666090500B4320685B14192FDEDB6EB32F20D374392CEB74A56207A39C83110F3521FC603008F27CD5632645EE2981797CC4C3303E3D20A8BC482A53BA26B47F15A589EF64D376C10B46156E0DDA2FBA9561F151C9473C1303494359D5C4A02B99DBDC70C00 -smlen = 2876 -sm = 14D383126D1C5ECD96CE469A916E7E0042C90143F43025FD87524283DCE877DFD22EC0533D017766405E1BE8CFDBDA5A80949F3FD5915E270066443A12BE14DFF149174410D40F205646F3006A6C446F1952CC713765E81CD0B882B04AAC008A3E0DC3916AA0D1AACB86A1D39836B2A4DB0018BD0533646324AF289716CE8A6C77716F140149013DAEB803C052AF170913893E79E7E8CD0191F8273130533B92C2F43F4930599585C1FA01916F89C3E1D182353F60754F593875AA0653014B06943763A47635B342B12C81DD07EDD6000013BE84AFE740AA563CA3462CB6C0D89A7D3C00444BD9FE08FFB1C9660399D5B627102472AB00B0B5A030201B8055F54D5968C4C98C19714E010031F92E13CFB7A4C85C5C099B9B789E8F0770E1C70A12A49905A158BF002F4EC40500E46FC982A199177595AC7B386350453116BA00965DA8A443DC5F9F6723C77A5C8A01E7E845902E852B331EF9923416E492C1641236E4E72408D800FD70774BA32B6B4BE04B6E82237A247D26F9A33AFC4745C16CE0554774C68B33CFC6E67AE34E42038FC6C324972642338DAEA75982C71720F1EC9542DF94B38434DA34A2003FABD9DAEA1950B7751DA6C81AFF7D03390F5D63455D417F5D12A510337A16197EBAF921B6A7A9A9A58F9696418ECED6B27CB8EFC8ECBD9B68714F721561AF8553A0D84E30E009A8985D011CB994EEAAF88C76F7F3261B47FC174155C138DB2EADB09A06073B211FC0D27113E8FEA0DA56E181CF532BA8207F5D80D6A30D8BACBA540D49A81A0763A0467DBA7883766ED6358E809261AA3D8B757C839B532F272C5767671A3A8BF3391B14F5E97BF2668A4E98847F1ABFA21E2370870DDF24504F89B3DB71E210C46D66EA7296D65C926E2C955D899AC830CD9D06808A68E9B3722B86E878CF21A5E5D41D7F3CD95D23A6344C259859735AE1A953ADE13CA103692B33AF90ED0345C7B038D938F8F494D90CBD3933B2A80FEDC2BE57960DB23AD018BAC63017A04FCC510553226CD86C74AB90E13C72A1BE12E4D751DC670A98EC4F81E9F8954A693FC7175BA7E50D340FF7F15D568D0ABDED0BB1FC557B1E55971B4C4CE8CC1B4D9E239C73B1133C9E1672DEE36A2D9527F315C21764648643D866B0E2AB6D2DEE61D838BC5DAC183FC511C4501B6E535ECC54F3EDAD6E8EDBF0DE7CB70BEE861B2BFF0D41BB87FFC0EBCAEE9A6DFB98D31D35CFB6DC0442FC285AD0879E7B218B6E66453FE04207FE814C5F72E49406B48FCB1DB145753DC2A2D3E9793594F7EF1A1A6339619E1040CDE605648234A51B2F6774B31C7F9A77C2CE3B98819132BB725D288C65901F7001E05FE5326B6F701C337D41C8CF8748FF9C276ECD398C725C36C11857605F58C0B154DD9F3C1B4649AE677533EB0338B7475254E273B786C2FE7DB4C13468CAF0AA2AECD55DC1A5F868C8EDFFD8BE8DEEC20A9FAA621C4680F3EEF4DFE4A79794FCBC5F8C56EEDCC3E1963569A36525D4F6A5BDBBA5D12966FD8A0FCC70783FD9F61613842F80D000C9281CBDF28C01C6F6AEAC10DF1DDCD0322E00C4E3CC801EF091D9C1B01E84DCE725D57C800D38990251AA1D1206AD93A7DDA40F27726D6A03D973150F7A88703724E314C0953D56DA6EAC442A70C2A08BC66BFA2B0EE11E185131E352D10DD714DDE502097AF0AD155AEEEC2A6B93B149B75DBB898B2B3A7C5FEF2F48D9B12A580F54C4EEF3FF83A4F13F2F194AF551D4800AE86AAD6EFC82CE460D325CBCFEE3400AE939431AB4070D7A7CC005F270896051E32B1051E58941530E250F05AF19FF416E65CE40655FDA31D2E7A6158E07DA08FA61AFD5319B682DE44AFAE146129A8B769C1708A5D3479B6C910B2FF0FC872A4A41AA8BF3EE16F80011D163B599D18501335A2BE10CF117DDA094FE01596C404C14580A7075D04CEEF68BD8F813D7DE6599F478F3DE9CE60B294CB7CE5284A61E078939D08F3D4FD998ADD3B92532AA54E0C31087CF14BF4EC964EBAAD53BD15D04E37948E94917DDE181EE3BB2346335FFB403B000F5669019C5281D88A0E771176E49DD0BA22E719C0B731EC2AAE9C898E74B2967BCBDCE0D7D73057E004BD62269F4E7F3823DCC18CD6C551104B9B896B0AD138DDE7C3D761138641BD3EFF3DF1552659FD97BDADFC59A05CBC622A4492A1B22CFF72AC197D61A4C5A949AA9AC09D4C1112F4C1B1CAE353C70278A21663E11F27E9EC66ECD4AD56F2179A3FCEC37AC3A3F4B33C06BBBD4C8CE8E74825BBDA3E58A2E2D928C2C6E6D886274BC0E2175AB03D8721C664FBD6455DB2960E3AEF0BB25AFD3CB0BAFB71A2BD18A89ADAEE00AADBC7E4AE70ED4B534AEEAB88559194755F9656B43BC83E3952000D9E2295BF3391904218A015C786DE0144868EE4AED203B261FE743B7168788A0680F7484792A3F64782B2B1ED9217B09AE9845DD71ED363F18E8AAECD51A4F5913AAB33FEA3FC5F1E37E0CD6333D2A8347CF45EB7C4AD967FE6FCFFF3565743435EF09A646E75C7E968ECF4202A9B2C23AA8118A1683219B1155C2CABC95C696704F5B270C6D213332649363AE13EC811E9A1090D1603EFF745E2FA83379DFC6DA5EFECED556E46A8A5FF1F2A5C0D911B95C20EC2465AD0C96AE7E16FC36143762BBC0734CF4D6134DCB0D739F7822470E0ABF66A0AB15CE0D6096D3ABBA2CA4C81C1C68BDC252A8A4BA609B7C05CCD913EA56126F418FC0B06DE8F76EF651F8085604C16E5910F3B8651AB78296B56B78326E41AC15774E442017FE5B291E5227EF5A4B78CCFA96D6921C8542A8A984BC87E2678903869C52C2568FEE4E23EF3CC466CE270614E6472244A4294B31F9438F7E43437FC9C9C5F3EFB0F4F0AF2110A613661DC24A1C7F7A7F8CD14A943821F16F94BD874F1A32E305DB4776CDF6633446724CCBB2488B1B06F0177819D53885127E6EB717C0D6718366A8B8A089AA6AB17CB2581A75EC748123B7D0383F3900EFCFF77D2E022E90AA41491117758221A0B149C8EBC23CC01C17B9FD39118DAD413A391CFA0A5C614208060A61646C7CF1DFAD4ABC3A9CC5CD566DB2AC8FAF392C9D8E7DA0F84B941D792A8493FBEBAD30D0DAA0D683DCC1583F0C9019622EB6C92FBC475BABC8B626319BE2264ED873AC063F84B7F83688AC99D732A1E3FC12281BFB1E1E63D48BFBFCA619BF4B95F899C50AD0F5FE4673347DF2BBF2CA21BEF49C7F8440D95A83299960F1E42B457ADDCCCE236946DE80FD4862BAF36387E041DEAAC3C9751AE345512BB1F423A3B4CA8D3A5E3796D289641D3424FF22670A46552EC68D7D095E8636441D777DBE2E9DBF6B5FEDE5318516C3886B943F6ADF17D8B7CD40B20A48233C9FD981145B45A5CB8F6A88EAA36C270E93E1D876D7781BB92A1FD99727D8E0AE34C73398AB8781BB342F5AACF4081459EA5EC20C30CBB6122344C457F92B20448F78E1A2A291202003781EBDA1747061C6CE1F8BF882FEA4FB50BFE638685CD638EEC15BC24252567025FC5C16ED1F5D98DD90C76E720EF7B4E25A20D262E339C5E5BB5A9CF051BF5FD1F63E93452A179277B57956821CDD901F1C01E634AE18485708A6ED8F592AE2EF3A9D54C9734FFBADC6F0B86D0398AECE9374F9ACAFEF38D4B97BE9B932B9852F97AEEC435311A67AE344AC1985738C72F52B3D8B71F64A916240477FDDC5FAF02F8224EB35D310FEA03FD2C5933047355A438676D92EADF70DF662D97C2F5E00CB293053699D51D302B78145C77AB03F34EAF170EDA5215436FAF0238A4B0D41D29F36052A5278C7D8AF9A6FFC6E2B6FFC4C5D524F7640A7170957F3DE2451AC75589CE328B61EA7179FD990DA1698F5C73BB8639A4DA2AD67D364DB04771CA118C4055C25F1120A0643158C07CD22B375D5C1DFA26FFCDA44921F41D4A504B2279DFF03421CAD19960F87C6B6DD8C29981CB66C9731F931E43B0D97C6AC9862E2CF711DF0DED8E4D06F3957FFF9085A95D9FCC95610FDE22856B229A3121D8B81EE83DEE4A6A9FA3FE8C75351574CB000BF7F3746CA1CC5414AEB23A2 - -count = 77 -seed = D08A139CC7147ECAF4B1D1E434EB2EFA2B2607B0033D8BA989133E496DC9F3654944C7AF91CBB79866443E8C4E8217ED -mlen = 2574 -msg = 34FCF4626248B979A7A8D306CB9ED69C4CCB5CC3729D2692E0BA679D5C2FEAAC54A4E06D4EFCEDF78E19357DAE263E1B5D107FB09618A9C34F54F19A738A66B95E6F88E20E01F879F53E8F4C371B571E1438FF70E0A8CD00D608976E24501B2DDD323EFE6C1302A318CAD821C6FFE641672BB80AC62286C69FCFFD93422911C46D43DC9A1F00A73E19EBE6CC09A9801F2A1DA708F0F1F98E7F1A18529010823230279F487911CEF1E784A229D9E311BCE5E2D368E6D613F791DDD617D0F37F604B786CA2BAB754E8BC4BD3DA37E66A54DF1D3B268A5A80379A30A52B1532E8CFABE24168D83CBFD61E2346F901C361F771E0BE3E03DAE8CC30614C10FB8DCCDCAA5B9A25DDD8D61E61F60F22308E12ADC137D3D8C53CF7B31984CB813758BAA19AC178F2F0CD2155ED674A7509A3CFA7FF66D2D9B1E60BE50FE7FB79591C500F66BB1D35EDB80263F4B696A3DDA0B9B2911D01E76E9070D99DB93D1D0C3874CFFA776BA24424A6B453526F7C44EAFABE13C0750F9DF33E82105930139E70B5CF1B09DC3913D6BF4A4859F67FE814FF038F0FDAB93522A35E7F81002A395989D68B8B7E4235A09837CC6402A5338DA08E7C73DC63C43BAC42054C694F4931B80140D6B104EDEC995CEBCC5629F85D09DED8257626F9FA4079ADEF81D044C18BF2277DAAA41931B62A6028F89F95F06D8A8FDEB95EB2EB1E90C0D8523E0B476B158E3040F212390AB2503021E8D6FC0733B963CC6188FB2532829925B59C8255D89F10B657053D0FA1D8E76C84826A4609284503D3A101EBFE7AF93EDC423EF5303CD946C8B570511E38EB04BEE0060E678D03E4134F84F279A570AAD0332417FB2099E3F1F279CE7D6DDB080C5D83064D107BB560B21183AE165CBB54CC75313DE72D40D1CF5173455AA55C5C356D7C40A2A7023DD95D3F89B515D7598F800DCB7BF68B707978ECAF55B794A17559BD1E913F4472B1830783BBBAB5F23A760C78C46157FD1B429C445494CDF92FEC8BF9FC217D3CE2697BB6C671BAA793CD0C1C84F579F0DAEC400BEADA799A9F417FE4744145F21C6F8559AFA7A514A0E951F03E5E68C17A8E5816F3FCF41774D26BE2EDC11FC3A42CFCF00F817C3D0FBF474FD7F30C9C3C6BE7F74FCC79FA6AB07CAB037EEA7D83866673A74C087B5F7542804071D53CE348D2E836749E35AF0FB884D5D53ABB195AE1EE6E9AE35DC91BE359BCD510A7801FC243C07DEE92373918AA4F8A89EDA3895A52456F7244D1FF007CC7B1A52CBEF4C1ADE1C2C0AC189AB24B3F260475E1D08E7C5BFA30A1CDD71DE5ACE80D5FBD1D0F17198B79C8EEA0365D139F2AE73CAB6FBC9A79786896DE0CE7FC747D68FA4ABAB662A09E0E409F7E652153352BB92F5DA1836B0E92B0B644C821B2DD2BD0AF193AC0F8CF5B8D88432F0248DAB09B46FBEF2EF1899B5981E9B33DE4E9927AE50890FEFC35F681E075D8B0169A2E16FEDA6392AB9858DB87ED18ACBA25575AFD1FEDA9FB3FD01ECAC13C245DF6972F65087513F505187C4E8EA54B6433FA092B6CD3AF13F4718693904435C55D273060FBB5FDA76074691269493E86F287922D074E54EFF04209B2FDD3417D8436D1395E638D57DB75D68F4F819141B6DAF4D13A9A18629CF5F84B0CD02E7A397715DDE5476BDC467218D11AACD6CE399D9D54645BB27CA43076B7E4E57FB4F7C4F4B8D0AA949719D731C3A927FDEF1533D773CF1BB562D5EA43817A5ACEFE9EB7E51029DEA143E8A1D5F76F9BFD74A26C6D38F54194319A1AAABC4DAF45EFBAE770B9E9D834C09FE45C15D4BBC0251D3DF2F2F23387DCABCE6CA7A59625E18FD997770D164C338D0692AF97C749FB746C0D3944CA4B2DA6D3AD7B8C3AA922FC029CF9AC5580CFEAFF50CB2E9044211EA522BB5769BEB7A7BBA0743F345FEEA9AA9DA6EC5F0579CF7A5AA4DEDC832FE3F65185A31FD49C0D259E3B7F8FA96E110D130F588CDEC30D0FD4860CA6673C46D961FC68A4020FB03AE24B1AE12967EC1ED19ABEC0808A7EF89521152033F70F406A7005819D28DFC556C79DE18584088F40BE40A555EAEFA78E3FA3D9360A7CEBD963555CF208DC408A07CCC1369F98BD840F5C940721064E6C7CB241ED0697AF0FACF36F05632A504870ABF90134A01AF00D340F7A5D548A8078C2049600EE454D15EB8CE58C26B3C8185CF9DFCDCA7D4B6DCDEB82230F993D51E701D8387B06BD45B4B61DC9DA6D3B4356F50C1D4AD2B467D36AC092442FA90D1DEB014475AC7CE90C974063459DC951DECFA30D2DE4C70FBA39A8B6931217D0924FFA783C8C3DAF048908E4AAEAAA3B7C98846278AFDD1753252F39CAED7D334D8575CE3ECFB2EDEC31AFEB2BBE67FA929A267376293C2B2F295CD8DBD66106E1D9518BE1798949F3315E0454D018C2B706FE836FB37AB908D9D698AF495BD285A74E4CFC7612D42121F43FDAA7DCF44DA82897B820514D66B92983A3EC819D2CE208D688B6F0AACADC0CDD619D815CD231AD8DD9B6DBAD9C47E16FAC098D0F4279AB52055D2FF765AF6E3618C4509FAE6AB00FA23980EFB19A26E0A6EA4C9A7DC699121388748449C429B28AD2779F5642F05FF58B68BA3E289F90EB27CE06392616C080D659338CAF274D46A90D58F2BFED25E8D4A8C62030A5E89F6B1A5F6112A38661E2F2B5A37BCBF050812DCDCE9C0A939ADF929C921E7DA0C30815DA318EB2F350F286441CC92060C970077623EEE68B8C6FEC9FFFE780A6FC85FD7AF90172951337AF57339E98049132A4CF58874A7418FB7ABA0628B6192BB2C43102EE6B1D7E824725D9C75D34A8B69DF4A6BCB1F96B57767046C99EC6352751E2FE1075BB4092672379B3518DDC884FEAD5BD062B0336EA88BCBE0D22E066566347FEB617A322BEC561E9AA9D2177EEF0DFEEAF6231AD56D0CD9E300709C9317B3D334D8D2AC97F96CF2F45B8582C4128D95DA8CA207AE34D3DAACCDB128C11694EEE6D3E8E6AB767B6886B1F7235D85A4D9C7C831C5DB8AD8323F63927A638E19497CFB308285A03CA2C1FE2AC4D919AD11511ECC6F28E7D0E0A614FE21B57BCCDF83535C7E2C40840BA0014247190C580378454751EB3F2361D7193E160B9516F7EE1D683B336B873C8BA22E97480A61F002A73844C78309C0A3B31BE30A192A62BDCC3D33A7A5BA1F6AE0404A8558740CAE46E5FD15971B41C0BC39665A9B92EEB3328C328B073ED5B3720D37A1C097AF8A6FDDC3B2B067680E6CAA760368B0E1C052E804E9F80F26B52596202FF2E0AF7215999EAF7D3EE3E8916744E40AA1154322DD068AA15960DC38671A4F5889FBE709CE1DECCFA80B9D33AD2FD963FE0581A2ED7718A27CA62819D05BAA3212EC7CC1C5472BCF579AD52D5E1B2BEE637D9827851C419A4CB91DB57B2A6CB4433C1BD209648F1FE170ABB964B272BCF0A263CE28CFA3A9D1449CFFDF643E37AD97182F0031CB334A1EEAD23D63A5C2D0A675D0ED000F37FD2153E1AFC4AC01692701014927601203ED2B8A477CCEC45C1F43190E4FBAF2295E32A9383FC7915AA76950A301ABE47BFFAA9C294292126934CCFC173115A6CA96F3945FD5F924A5017125AD5AAC705106EB852EF3190A24420196ECD37F7C67B57162CBEB97DFA -pk = 73E482DE3EC9DFD49A6131CC3FE5BD41BE43C4750BAC057B16C9269AACAA35647608A90643D7139F7512832D609A77B4DE91E031724D06467FBDF6B3724A0D006AD25D86A8722E7B84AB167F91C42E5F8D9C51D0396911E0016141E32C1361D0DFA4D100927B17FB6D1EA40BCEA9C08D7111682012B5D9AE460CBA5B927B1C00 -sk = 73E482DE3EC9DFD49A6131CC3FE5BD41BE43C4750BAC057B16C9269AACAA35647608A90643D7139F7512832D609A77B4DE91E031724D06467FBDF6B3724A0D006AD25D86A8722E7B84AB167F91C42E5F8D9C51D0396911E0016141E32C1361D0DFA4D100927B17FB6D1EA40BCEA9C08D7111682012B5D9AE460CBA5B927B1C00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005BE6F0B034DC3EBCF1765F6EB08A2CE8A6C8D7FF65BA9A2CB62B654063E15585C7E2464A8F3A048E3F98AFDB0EEC750D6B9BA6F037F396EB93C1656575BAA026C92592F88705D350F77AF7428041C844BE255FE981C042A897000000000000000096459FA9D608808C64A12A33516176CC87EB13372989FA972A711A1F4CE93181381CED374B9FBA5C892A3515FA6A7D6F98F04D0788055D9FCC2EE7AC149B52DD67FD2AC3D084669F1D7F49C3FACBFD0D02942D54433022ACEBF1FFFFFFFFFFFFFFAA0A59FE6817E25091566F91F6D76ACD7EF8FACE1D95F939AB25AE87E6469FA0477509ECFB125B6E6907D68B2D661E3F97597187C7AC7F5CD111000000000000000000000000000000000000000000000000000000000000000000000000000000DBB676AB05B952B52ECC8A6D414DF2EEF9E3A0F25977C3461F342C8C389B41D765DD01DD3E1973EFDF0537C61DD004ACE3C3654485D833339F220300000000000000000000000000000000000000000000000000000000000000000000000000001F50BE5F935A4082551476B621C67D0C8421F8515A295511A0F9E7BF6C67AF0CE37C922150D8CB4716DA148F8E24BF782D4E289BF45CB6177463810DD649230031A0DB0E82EEC36F45A9E8014197BE3D8168E739B3EC7DDF8C4F91343AA235C72001DE025A89D4C07C83A7462AD368BC6C3E5CDFA6539FD0D38EF3E6A1990A00CC0589A8C9A4032F74B4970C89BF3FBA3DB6EA92BFF9CF21AA6723128409398CE491784BA385E63C36352347D87C1C0242797652D76EDE8EDC5B7EF7BD2D22000D5EF14B07AA447827FCABF4C8BB45246419F7ACA683EB8E64B76113A48F1A2E6AEEFB2C86F6EC41FB25BA4C1F70B8FFE0BC9F5A18CA4B0A50E621E4F6FC0A008ADDC70EA589491BBCA303DAD102F03EC05B22FDB062A3966F11FD337F907F194583081F0B510147EB0143D5FF36287EEEF217C467A077C866A1F7E05CEA1B00958C9ECA7325BA3339C878F4F91003647E9B5C21950A866A6B7882F4FE496444ACDF07863F528ABABB6008D82F61D1810DEBEDF9F9461A5F4E7018E6495922006C42C4A839A136C257800A48A269B88AF7563931A3E92604EA7FD32E3539079E08682F1D91694A4F8142D8CEC2B0E314AAB6DF936277306CA8B8DC7EA0E21A00562DA39CD2F2F38EE22CD72403BB96D4B84D97C25370364B0468AEE36F9E04E2966C4DD4D899AC5FBF2C60E7FBB101B2CFCB2A6723A9ACE724682FAB4F7E13007BE10B70C4EFB4A9E83E9AC778BF56C864D2B0F3F746A685CC2AA4868908115AB08A90945DCC43919ADCBBD4AE843501D1A0F09B09D63DDD8E4D90DF4B270300EFB3987978268D626C803562EC4E512CBC53AA33FF3CF578610F1A2975D7711CB47A1EFDD545AB7300622D6353E51B63B3E706AFE869D355B2CBB441C10B1A00A3E6CE70A88F9211B92D5E439009D93D975B141019ABE0C0A3A29DE0639D20828FA47BB9BB87EFE0822F51C5249BCA81517A780AC684DA980EDEE98C92180700A1FB82DED9104EB9AF1F346D821D09BEBED4EC7CD531FD1C08C788783F9BD089C241EA446564B06CBE958096AD2EFECD0C5603A5630CFCBD1415049047091F002A7F6A3F286393F0A26E6EF4C9E21C36C97B3292927C1B03BB6DD06222940EB975222316F5085141E254A70A3FD145D97A50551A92DC7BE99E8289EAD3E401006B65E0E4CAB1332A465F57B227D44B36310DFC36E4893B04928DA9724CF867F2E0188088DC9F3812B00960F5188190CD91AAE24BDAD146F40BAF0FF675B61F00 -smlen = 2909 -sm = C652A08632D74CAFF5700A672D8A6B830FE401CD0BA2DDA94FE4156F811E4F5F5D6716734D0057373B7859A6A1771C89DC68284E1F60325F0131EB51800D27882C1A77E27B5FA26A18244E015B7B80E598CE6DED7B187680BB3AE728478D0151896CD9A27D330B8544E9C17D86495EC6C501E2F0D660EE0F197A3DC398D9AAA01518798001FBABB2CBC140E3A0882EE98E24704D77019801ECEF037FB31C1E47CCF0C48B5C8FF17C7488016EF41EFF552BCAE6A4A3161DF1C1F53CCF6701AE011EAE26DB436AC958E3CA1DF9A3E0384F005F201F172BD2C13012A72382DCD6C12374670145FBA74134B200D2C40EFF44AEAC09F1D24501209ACD24D8B99D2D88881124321F45E36356000109B6A2E84645957C7ADD5E3BC15E0E90E559EE2C01E1E40886DC51DB38C13757030214ABB0FFFBA795D3F5246696981229297B42016132912D98B0CF955F73DF1F13C30134FCF4626248B979A7A8D306CB9ED69C4CCB5CC3729D2692E0BA679D5C2FEAAC54A4E06D4EFCEDF78E19357DAE263E1B5D107FB09618A9C34F54F19A738A66B95E6F88E20E01F879F53E8F4C371B571E1438FF70E0A8CD00D608976E24501B2DDD323EFE6C1302A318CAD821C6FFE641672BB80AC62286C69FCFFD93422911C46D43DC9A1F00A73E19EBE6CC09A9801F2A1DA708F0F1F98E7F1A18529010823230279F487911CEF1E784A229D9E311BCE5E2D368E6D613F791DDD617D0F37F604B786CA2BAB754E8BC4BD3DA37E66A54DF1D3B268A5A80379A30A52B1532E8CFABE24168D83CBFD61E2346F901C361F771E0BE3E03DAE8CC30614C10FB8DCCDCAA5B9A25DDD8D61E61F60F22308E12ADC137D3D8C53CF7B31984CB813758BAA19AC178F2F0CD2155ED674A7509A3CFA7FF66D2D9B1E60BE50FE7FB79591C500F66BB1D35EDB80263F4B696A3DDA0B9B2911D01E76E9070D99DB93D1D0C3874CFFA776BA24424A6B453526F7C44EAFABE13C0750F9DF33E82105930139E70B5CF1B09DC3913D6BF4A4859F67FE814FF038F0FDAB93522A35E7F81002A395989D68B8B7E4235A09837CC6402A5338DA08E7C73DC63C43BAC42054C694F4931B80140D6B104EDEC995CEBCC5629F85D09DED8257626F9FA4079ADEF81D044C18BF2277DAAA41931B62A6028F89F95F06D8A8FDEB95EB2EB1E90C0D8523E0B476B158E3040F212390AB2503021E8D6FC0733B963CC6188FB2532829925B59C8255D89F10B657053D0FA1D8E76C84826A4609284503D3A101EBFE7AF93EDC423EF5303CD946C8B570511E38EB04BEE0060E678D03E4134F84F279A570AAD0332417FB2099E3F1F279CE7D6DDB080C5D83064D107BB560B21183AE165CBB54CC75313DE72D40D1CF5173455AA55C5C356D7C40A2A7023DD95D3F89B515D7598F800DCB7BF68B707978ECAF55B794A17559BD1E913F4472B1830783BBBAB5F23A760C78C46157FD1B429C445494CDF92FEC8BF9FC217D3CE2697BB6C671BAA793CD0C1C84F579F0DAEC400BEADA799A9F417FE4744145F21C6F8559AFA7A514A0E951F03E5E68C17A8E5816F3FCF41774D26BE2EDC11FC3A42CFCF00F817C3D0FBF474FD7F30C9C3C6BE7F74FCC79FA6AB07CAB037EEA7D83866673A74C087B5F7542804071D53CE348D2E836749E35AF0FB884D5D53ABB195AE1EE6E9AE35DC91BE359BCD510A7801FC243C07DEE92373918AA4F8A89EDA3895A52456F7244D1FF007CC7B1A52CBEF4C1ADE1C2C0AC189AB24B3F260475E1D08E7C5BFA30A1CDD71DE5ACE80D5FBD1D0F17198B79C8EEA0365D139F2AE73CAB6FBC9A79786896DE0CE7FC747D68FA4ABAB662A09E0E409F7E652153352BB92F5DA1836B0E92B0B644C821B2DD2BD0AF193AC0F8CF5B8D88432F0248DAB09B46FBEF2EF1899B5981E9B33DE4E9927AE50890FEFC35F681E075D8B0169A2E16FEDA6392AB9858DB87ED18ACBA25575AFD1FEDA9FB3FD01ECAC13C245DF6972F65087513F505187C4E8EA54B6433FA092B6CD3AF13F4718693904435C55D273060FBB5FDA76074691269493E86F287922D074E54EFF04209B2FDD3417D8436D1395E638D57DB75D68F4F819141B6DAF4D13A9A18629CF5F84B0CD02E7A397715DDE5476BDC467218D11AACD6CE399D9D54645BB27CA43076B7E4E57FB4F7C4F4B8D0AA949719D731C3A927FDEF1533D773CF1BB562D5EA43817A5ACEFE9EB7E51029DEA143E8A1D5F76F9BFD74A26C6D38F54194319A1AAABC4DAF45EFBAE770B9E9D834C09FE45C15D4BBC0251D3DF2F2F23387DCABCE6CA7A59625E18FD997770D164C338D0692AF97C749FB746C0D3944CA4B2DA6D3AD7B8C3AA922FC029CF9AC5580CFEAFF50CB2E9044211EA522BB5769BEB7A7BBA0743F345FEEA9AA9DA6EC5F0579CF7A5AA4DEDC832FE3F65185A31FD49C0D259E3B7F8FA96E110D130F588CDEC30D0FD4860CA6673C46D961FC68A4020FB03AE24B1AE12967EC1ED19ABEC0808A7EF89521152033F70F406A7005819D28DFC556C79DE18584088F40BE40A555EAEFA78E3FA3D9360A7CEBD963555CF208DC408A07CCC1369F98BD840F5C940721064E6C7CB241ED0697AF0FACF36F05632A504870ABF90134A01AF00D340F7A5D548A8078C2049600EE454D15EB8CE58C26B3C8185CF9DFCDCA7D4B6DCDEB82230F993D51E701D8387B06BD45B4B61DC9DA6D3B4356F50C1D4AD2B467D36AC092442FA90D1DEB014475AC7CE90C974063459DC951DECFA30D2DE4C70FBA39A8B6931217D0924FFA783C8C3DAF048908E4AAEAAA3B7C98846278AFDD1753252F39CAED7D334D8575CE3ECFB2EDEC31AFEB2BBE67FA929A267376293C2B2F295CD8DBD66106E1D9518BE1798949F3315E0454D018C2B706FE836FB37AB908D9D698AF495BD285A74E4CFC7612D42121F43FDAA7DCF44DA82897B820514D66B92983A3EC819D2CE208D688B6F0AACADC0CDD619D815CD231AD8DD9B6DBAD9C47E16FAC098D0F4279AB52055D2FF765AF6E3618C4509FAE6AB00FA23980EFB19A26E0A6EA4C9A7DC699121388748449C429B28AD2779F5642F05FF58B68BA3E289F90EB27CE06392616C080D659338CAF274D46A90D58F2BFED25E8D4A8C62030A5E89F6B1A5F6112A38661E2F2B5A37BCBF050812DCDCE9C0A939ADF929C921E7DA0C30815DA318EB2F350F286441CC92060C970077623EEE68B8C6FEC9FFFE780A6FC85FD7AF90172951337AF57339E98049132A4CF58874A7418FB7ABA0628B6192BB2C43102EE6B1D7E824725D9C75D34A8B69DF4A6BCB1F96B57767046C99EC6352751E2FE1075BB4092672379B3518DDC884FEAD5BD062B0336EA88BCBE0D22E066566347FEB617A322BEC561E9AA9D2177EEF0DFEEAF6231AD56D0CD9E300709C9317B3D334D8D2AC97F96CF2F45B8582C4128D95DA8CA207AE34D3DAACCDB128C11694EEE6D3E8E6AB767B6886B1F7235D85A4D9C7C831C5DB8AD8323F63927A638E19497CFB308285A03CA2C1FE2AC4D919AD11511ECC6F28E7D0E0A614FE21B57BCCDF83535C7E2C40840BA0014247190C580378454751EB3F2361D7193E160B9516F7EE1D683B336B873C8BA22E97480A61F002A73844C78309C0A3B31BE30A192A62BDCC3D33A7A5BA1F6AE0404A8558740CAE46E5FD15971B41C0BC39665A9B92EEB3328C328B073ED5B3720D37A1C097AF8A6FDDC3B2B067680E6CAA760368B0E1C052E804E9F80F26B52596202FF2E0AF7215999EAF7D3EE3E8916744E40AA1154322DD068AA15960DC38671A4F5889FBE709CE1DECCFA80B9D33AD2FD963FE0581A2ED7718A27CA62819D05BAA3212EC7CC1C5472BCF579AD52D5E1B2BEE637D9827851C419A4CB91DB57B2A6CB4433C1BD209648F1FE170ABB964B272BCF0A263CE28CFA3A9D1449CFFDF643E37AD97182F0031CB334A1EEAD23D63A5C2D0A675D0ED000F37FD2153E1AFC4AC01692701014927601203ED2B8A477CCEC45C1F43190E4FBAF2295E32A9383FC7915AA76950A301ABE47BFFAA9C294292126934CCFC173115A6CA96F3945FD5F924A5017125AD5AAC705106EB852EF3190A24420196ECD37F7C67B57162CBEB97DFA - -count = 78 -seed = A315BCF0E6835892ADFA07C034BFCD39F80B62925A95490B20170BD29378E11559C7F1CD296377FF1E01284EC727FFCD -mlen = 2607 -msg = 96AD5FAEF409B8A4C21ACB1ACB596BADF387D26656BE3EB17987AF59737E324B7BF8412A306B0E706AEF73D79AF753D9B0064BA9CED8DCEA966543FE748E2611709ECD1CE6E4DD8FA812D485E91809A225936675369574B0D104A258E3353EE0E021683615CA5C7C531FB29A5025CC7F7323860443DC19C9858F741EB9D24A9F6F04FC839B67153214116E8B7FA982F338445830F915F7C85C88C23BA2A3CE8E2020A9D8DD7B18EFE95563E3924D2A341826AF51A8584CD026B1C433EF0221145BA8BDC8F73A467B33A9EB3E8CD2A4D671C17D7C28AAA539D1C5BF2F4138639AFB89CE791DAF0EF0281D52598F4C13D210974CFA1F099A0FC70B1DC120E5C00C33A2BD360BED57CCE069060D6380BE2204852D8BCFFF4918BA0B70B0BD1E1D55DC1D68DB1D20AE713B0093EAEFA1E33D40D9BD95CFF17568393E9BBF5CC1287325D2668F65DFCF44ACE2F6C6CEBB62F1433E69CD19E6C6532EA93682B22C4C4A62C6ABCFAED08EE64F32723E56205222E4AE0831AB8FCA8C265FEA0CFC66AAB1E367201752AEC11F752B963792C071E42A8A1AB80658A0C6960147ED740CD07F307CF6A644A98E1D2E56C625ACF458D0BDF6216A4F1B9C78EC3F14850C803A4207C894E61A8AA88840A27F2B439FA7CBAABBC789102A95323E06E2C324859DB92C6CEAEFDCA389F677082180FE3D6202FF60DAB9F87E3B84841C0A4EB5974D893333F7F1513E54EA4AE0731EC409F69B77089FAFB121300042880EA59B7927E9435EABFDCC1019A96E145D5D157998D620E7BC6945DBD6CD78E94C2D89589F8DC8A01CF1B295A26B091847F034937F764ADFD811F52B3AA187F3F49273EAE5949FF34B64BC86FF11EEFE378825D526509483E7191B33333E5465FFB025B269F898CE1F83EA549F1864B556C729F510118921B69594F67B8C229236AD3AEE55BD7082E027B5D342C976A549E01618288944DE0B2C77473A25201B61034B334968178AFAB7F8CD1FEB6A25CF8DCE3586FFAAA861471E2EE7F0C22538FB3C95D2145965C4673E6489764AE24B4F048DED77FE3487AE175F6D4898F69F9FFF276470A93DAF986A75F685919D98C9C609C795D4785AE941C782B551EF382F47209AADEA19066AE5D3EBA7BBD99E91943F1E62754A42FFC8048F7B87F128CCF6C96BD760B45F07F740E94491874B06CC3450AAF55BC664B407C57369CABD2708A9C478DFF64D292D96AB71EB997F8B71CDD6BA02F52C5035EC26E8111EBF8268CB00DF9ECD63BC0D557E2D2E77A6363B00DAF25237E77DAD03F929E5E9B39447A70D4E5F4B90958F312C80D594E1B1F3D0D23F2B0D9753BF3544061CF0C0F841C440319E74F9B9D15B91EBA1E680ED6AAB7D63A97B48C0A4AAF314E8E77E2EA6BE9DCFC7B5557FEC1B996A37C86CF6941325EC356EE75671726BCED7D2157BE8D4C62CF4BD0420BAF2C4223597C0EF75F7A7C9533D14BE0D21C37F06FAA53ED5EE0DDB025862417F98D2F188895395CF2FE72185ACBEA952F55CAD7EC2D684A5AB94B1257D7ABB565B8C07B88C6335FFB9D2FC6F6779CC24FC3CDF92BB3B12EC54360A7CF3579632A2A65C518E57015DF1C616C857F83F5F1AAFF693ACFF210DD1E95CE04CCA9A0BF385ED6EA2AED894E79D5133799393469B666209371E708D4D279E1AC5ACE28985D0DB2765D547C2902B715BAED5A4FA3E7AA42645F3BBE1E9F3CDB87B1DD8DBB5AAB08626591921CB49E552F8EBAFCBCF428470719AE40B9CA847F31848F39E4D42049C5D40B0BFF036E5409A6A12E7924148E60B64BB83386079B54486FFC8187302893B8BF826578D9CA03A1291983F21DE7F6E65458F8942DC1B135C6C8C1FEF4F3863A58DB17112419590AE57B9425592FF22E596191E5BA7C513EC315EC3476C95A149F6A5EC1CF24870400FDF46217A23F42E0B61157C3CEE23E7916B4475A94B96B917C171B1A34DB13AD98833E457343F94A76EE226FA5B9F3066C2FD69F14D3AAED1B31F5114780442EBBC88D0DE5F689CD910E7464D73423B9D4E03718C5C51871250D11E27E28DF1268166E3AF328A80D9D335F2D27D2E91DC61CDDC7F733E345D56C11B6130875D93D527F93542FB352407185E7AC07051AF7F642E34FA06B1376BA15A35D837C1BFE090BA67A89FC1E307DFF3F02A988ECD48FD229733F641F2609EC8DB14B1A5AC170B104F03C2509D2EE6844C716766D06A6A25D957530FD68A8DE6F1753F83EC19EA2DEB1A4F9C7986F20FF60A7508DED6547A85BABA70577062E8144BA0496777A5218595E021937FEBAD4BFDECAC29E3FFF2EFE7D598FCB86F93A734E4C573E1496A6282A3B40E817DD3C9D631939AAB350ADC703899EE3BCB1B5EAF6EA8420DD6EB2D4F64A1818AAFA97B73C75610B6005F1EDC1EC7D8F8DB1E5D3E9666C1292515105037D26F2C8D83FEE1F4EF5DEEB287CD7C1E11960218C1B8BB50453488BAB019435065AEDFECD8D218BD1E751FE736442E8D09CE7176A71C06415A30B070693A68BDAA5CDF62351AE665F37FEFDA9481E62EC181ED24F0D0649AD01C89AC422F1B7E27895E55DCC2FD817346D361FA559094B37894C0B478C68A1D7564D089D9D4417D5C7372A33BA475A81FC129F3259C5407BC7435825B415782CC84D85E69D9B44B32D78FA255A895CFD55319DAE677FF89D93A3884CE9401775563FF1788CF3AC11CF96DAA199E7F4579A0264378A323FDA64FAD2349C09465FB23BA09069C7FBC79E7288A82F9165268F6842E0AFF0E250C21BBAEEFB4347D4EF1CD51161DFD29BFAFFBEDF71DEC93F4157A5C18995379ADE8D15DB59EC4A8B308C2EADE1B7DDAB55CE2220F3B3AE8CBA7C8211CCCB3846A225B438F4B37DF54363A987C5C4E6B9D20EC3C0096317D11F982184B75D8EFFD168B7B41317D40F903A23A2649999DB36CAAE31BA5D91998A684D30AAADBD3B1EC154BB6C92513BFC0C47C673254F42B1FA36B995CB737668CBDC2A0D1BA838E74E0E50B22FC22DD048F48B6D1E89E1CCCE5A226F63AC7B8E6E9E8CE27050BF3DCD7D0F35F47BBEC1CAABD4D619CD77302AB4FF6F56DFBE9F5821AFF2D72EE6A628DAAAE4440EDCC070473BDAA54CCD775331AC2812FC5B9884915DA582EB36F85C7923F06D961594753802EFC5883CA484FC64FACE42DE6C3105E23CB90663A3B381D0C6A7265B740BFF0A1A017058F06E39A74BB07B63F883CF914FE675E7E5AD5AD44C9F90DDBE23A125D9BE02264EDC13972FF22BA48ECE8890A223EC13ADDBE055A8B4E03882677FC0D94C9053DA6CED34E132FD83810A793350446D60AE5DD0D174B534A3B6F5BC1B497F9406B5CDD414401B6DD881CEABAB12CC51425E88A81BD9E14BDA18273583CCE0849AA48DBA1CFC49CDF29242C73C99C87F063B8B739AA787570459C098405DCCEF78D6D97C21545F2959DF9CD62F9C38AD9A849507C23A51714565642DD76C9103154327985F7DCC701B795A7AF8625F06367ADC11A7FD7B6ABBDA5B2FF6A825DD43B64A48EDE4EFF8603A82159A6011F9E626171E4593C0E963595A6E068AD05FEB12378C71AE515A82C293EB7D2B01B333CBC7991B44685AA7513B3A58342BA5D094B773E6A27F8582F3DABF54DEF59974CB8A2499369B5B64C7AC08D32D75FE37371C578073DC83B82A828DFC325976FF282D3F6 -pk = 104ECCA7FE32B5DF736A7283790A34BF41B62EF014521431D112ACE2394DF09EBAE4C04ADEA29C88A7FEF6D7A2FC3E24F60950E5A49EB1A0F676766EAD73020003C344D2C559AE276AEF878542842778F09D3E57FCED8FDFBA808BEB843FA527445854BD46ECBFF06379782214D34F41F391C9840F2C435CD4C8EA2E47840C00 -sk = 104ECCA7FE32B5DF736A7283790A34BF41B62EF014521431D112ACE2394DF09EBAE4C04ADEA29C88A7FEF6D7A2FC3E24F60950E5A49EB1A0F676766EAD73020003C344D2C559AE276AEF878542842778F09D3E57FCED8FDFBA808BEB843FA527445854BD46ECBFF06379782214D34F41F391C9840F2C435CD4C8EA2E47840C00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002F7CC2B5463BFE9D584C138298D26547E925CFF4F2B76E22CB988494D68F7C8A5B37B51D301CA5BF72CF83E0CF070C1963CFB38F7F69675F7415896DAB0E38779060B2D86D3E583E23D1610956E3B5161943D5ED80EFF954B30000000000000000E2AA6DD8C44D15A8B950114990ED5ECED1179F14AB09232734FC961AF43D9EB9B0233C1E076232A2484410CF239834073A3D3A3882C09F208CDC684E55A6779BCB158CD2D965098D7A1836F1C5DA252BD2D15F9226104474F9E3FFFFFFFFFFFFFF222D1ABF5CDDF43D5E1BEFAF0BCAF4C2B79730CC223957615E4B2BD5E3BD77009B3DC34614E4C28E4D43DEAC96A0C55189D4D602FFC17487A5F3000000000000000000000000000000000000000000000000000000000000000000000000000000510796AFEA9E60D2B1F5CF5CCCB97D03700B1196794F831066DEE6DA20EA7B03358C2E60074C077B9574D39614277FEB450FF248777CF1D45F0E010000000000000000000000000000000000000000000000000000000000000000000000000000B3A9B64389445CC69D1250685B8BFA40BD53B816B573BDB02AE1ED70D2D39A9CC52D5DDAF3FBA37EAB4E11BE577A57026B02C96E0EB343C1F658AB8BAF6622003C97AEDAFCBB09B5DE4BD689863F17B343E44993DA82995DC7BF78FB3FC473EFBDAE24D1EAA0C1C6E968A46E82C2DED2C47C15328A3FAC3D6A535DB5FC551500CD7EF765502201DD005C37759BB3E18A7E807D662BBBBAE2B76A6B66F02F546CFB7F713AFB801B4C8F0226E5D2A9805A2BC99E61535C1B0ACB7F5A2BD52418007C6DECF892075740AE25BA997FE085DEC738C4573CCED99D7DA63EB3F391F83319AC52C27CC5CFBFC98C0AFD116A771BCFDDBB2FEA00AF363D3FF72097F114003B573C7E615EAB42F80AED693D9491DBE1003907A5C782EA6F7B589D372CDA27F579FF9B3FAC829CA69BFD4DB330E19C7BFB432C62345C15E5666543AF56070099E131C44176A26186C2E0D6333EEF3156A6B9616798405360761A7784F12486E99876EA6B948C30C62110D6F288160801EED392BDC67904B6B20F4A54D81A00972C2E407E4D62E0E9D6522CD1C03FAA5C1E3F7A6F01F651677E6D41ECEA5B61AAE36FE9CEDD1243D0828C4295E74AB72E7285781482EBB96F7161B228A10B00F127C3254509E81D5F90415CDC50D1D6C6325C38E86F5B80D125AAD6D6CA775CB9EC8674C350C01B3FFFF017BEF3D683D00D73261C9431661F3731C1B8622000A181101A6D15244583580E52D77A69AE17C5D644C994D52694DF7C381B221005485B273E0F188F7AC2D6B50E211A97DD356FFE1261E3B69A605C33D91BF223002689AE082DC0ADF8F1B3BAE02B8C4BF472F100F6C13A03B2EDE43C087B905DD45924FC7F71EAB7AA38CA32CD9AB429E107C50C824D4446D74AC5E16B9AE30200DF8AE3EFBA4112E8D865746F0ABCC642C1944CB7008DCFCFB8B80AA901AEAA5E5D82FDA42A2B6F13E2C2F9462AFB0D3153E3D4569F7C1D65653D31E80589020023B65C2E80A4C180E145BE09B5FBD6EDE50665F2485B7914DC3D81C29E279E09583A9682334B8DD41D9A7089FB3B6D2CEADE59C51710799FEF141DA7AF5A02009D8E1149FF1DC0CC3DE5B464EC1A243EECF00BE049EEF84B54F4F2FB34441238CEDFAA352AC912DA0B93B8FB658E47983344E3F0EB66DF202C6D089340191E0017AA7A9AB6FDE114E9D7A4B707EFDA30B2847B410092F7D4937D2B468BD44E36B9ACB24CF87DA214078424CA44F8BB66ABC6E7EC36A627595740442D70092100 -smlen = 2942 -sm = 1516C1CF5582CFABAC0977EE5CCFC861D50200BDCF27760DA7E6AD4D97B857C554FCD2FFB200BD9FBD7F2125A762A20F08E0D74D6C55AB6001B1617333087488139F5324234F7F3DD799B301EBC544A53FC1F883A0D43DB959DBEE04641701AC2A68F1075F7883F76C3703BB573362D2FB01C350D62EEC0EBB09F6B4FA78E73EEC69744F008FD545298EBCB04DC3B8D6E805BCCD613C37009CA482A9F248B1BBDDA48FC51AEA0538344C008CEF27F3E7429E900C79A59397B6A607C95F019B93226F1B3F8D9B473B93E6BB7D8E2C26A70063C568EED57BA7960975A0ED7A5184096CCD01CBE47F09375FB2F831D0D5D96AEFA961775400C482EF55636D42527194A7BA5A9387B8FF9900016BD4D04256637AD80467D67B0CE3DFBDB0557F9D31A34B769438993395CA00AD0403FA959D73EB4D5AF4BDD6958F6270EB91131901A47E49732C5457BB6B00888F75A60196AD5FAEF409B8A4C21ACB1ACB596BADF387D26656BE3EB17987AF59737E324B7BF8412A306B0E706AEF73D79AF753D9B0064BA9CED8DCEA966543FE748E2611709ECD1CE6E4DD8FA812D485E91809A225936675369574B0D104A258E3353EE0E021683615CA5C7C531FB29A5025CC7F7323860443DC19C9858F741EB9D24A9F6F04FC839B67153214116E8B7FA982F338445830F915F7C85C88C23BA2A3CE8E2020A9D8DD7B18EFE95563E3924D2A341826AF51A8584CD026B1C433EF0221145BA8BDC8F73A467B33A9EB3E8CD2A4D671C17D7C28AAA539D1C5BF2F4138639AFB89CE791DAF0EF0281D52598F4C13D210974CFA1F099A0FC70B1DC120E5C00C33A2BD360BED57CCE069060D6380BE2204852D8BCFFF4918BA0B70B0BD1E1D55DC1D68DB1D20AE713B0093EAEFA1E33D40D9BD95CFF17568393E9BBF5CC1287325D2668F65DFCF44ACE2F6C6CEBB62F1433E69CD19E6C6532EA93682B22C4C4A62C6ABCFAED08EE64F32723E56205222E4AE0831AB8FCA8C265FEA0CFC66AAB1E367201752AEC11F752B963792C071E42A8A1AB80658A0C6960147ED740CD07F307CF6A644A98E1D2E56C625ACF458D0BDF6216A4F1B9C78EC3F14850C803A4207C894E61A8AA88840A27F2B439FA7CBAABBC789102A95323E06E2C324859DB92C6CEAEFDCA389F677082180FE3D6202FF60DAB9F87E3B84841C0A4EB5974D893333F7F1513E54EA4AE0731EC409F69B77089FAFB121300042880EA59B7927E9435EABFDCC1019A96E145D5D157998D620E7BC6945DBD6CD78E94C2D89589F8DC8A01CF1B295A26B091847F034937F764ADFD811F52B3AA187F3F49273EAE5949FF34B64BC86FF11EEFE378825D526509483E7191B33333E5465FFB025B269F898CE1F83EA549F1864B556C729F510118921B69594F67B8C229236AD3AEE55BD7082E027B5D342C976A549E01618288944DE0B2C77473A25201B61034B334968178AFAB7F8CD1FEB6A25CF8DCE3586FFAAA861471E2EE7F0C22538FB3C95D2145965C4673E6489764AE24B4F048DED77FE3487AE175F6D4898F69F9FFF276470A93DAF986A75F685919D98C9C609C795D4785AE941C782B551EF382F47209AADEA19066AE5D3EBA7BBD99E91943F1E62754A42FFC8048F7B87F128CCF6C96BD760B45F07F740E94491874B06CC3450AAF55BC664B407C57369CABD2708A9C478DFF64D292D96AB71EB997F8B71CDD6BA02F52C5035EC26E8111EBF8268CB00DF9ECD63BC0D557E2D2E77A6363B00DAF25237E77DAD03F929E5E9B39447A70D4E5F4B90958F312C80D594E1B1F3D0D23F2B0D9753BF3544061CF0C0F841C440319E74F9B9D15B91EBA1E680ED6AAB7D63A97B48C0A4AAF314E8E77E2EA6BE9DCFC7B5557FEC1B996A37C86CF6941325EC356EE75671726BCED7D2157BE8D4C62CF4BD0420BAF2C4223597C0EF75F7A7C9533D14BE0D21C37F06FAA53ED5EE0DDB025862417F98D2F188895395CF2FE72185ACBEA952F55CAD7EC2D684A5AB94B1257D7ABB565B8C07B88C6335FFB9D2FC6F6779CC24FC3CDF92BB3B12EC54360A7CF3579632A2A65C518E57015DF1C616C857F83F5F1AAFF693ACFF210DD1E95CE04CCA9A0BF385ED6EA2AED894E79D5133799393469B666209371E708D4D279E1AC5ACE28985D0DB2765D547C2902B715BAED5A4FA3E7AA42645F3BBE1E9F3CDB87B1DD8DBB5AAB08626591921CB49E552F8EBAFCBCF428470719AE40B9CA847F31848F39E4D42049C5D40B0BFF036E5409A6A12E7924148E60B64BB83386079B54486FFC8187302893B8BF826578D9CA03A1291983F21DE7F6E65458F8942DC1B135C6C8C1FEF4F3863A58DB17112419590AE57B9425592FF22E596191E5BA7C513EC315EC3476C95A149F6A5EC1CF24870400FDF46217A23F42E0B61157C3CEE23E7916B4475A94B96B917C171B1A34DB13AD98833E457343F94A76EE226FA5B9F3066C2FD69F14D3AAED1B31F5114780442EBBC88D0DE5F689CD910E7464D73423B9D4E03718C5C51871250D11E27E28DF1268166E3AF328A80D9D335F2D27D2E91DC61CDDC7F733E345D56C11B6130875D93D527F93542FB352407185E7AC07051AF7F642E34FA06B1376BA15A35D837C1BFE090BA67A89FC1E307DFF3F02A988ECD48FD229733F641F2609EC8DB14B1A5AC170B104F03C2509D2EE6844C716766D06A6A25D957530FD68A8DE6F1753F83EC19EA2DEB1A4F9C7986F20FF60A7508DED6547A85BABA70577062E8144BA0496777A5218595E021937FEBAD4BFDECAC29E3FFF2EFE7D598FCB86F93A734E4C573E1496A6282A3B40E817DD3C9D631939AAB350ADC703899EE3BCB1B5EAF6EA8420DD6EB2D4F64A1818AAFA97B73C75610B6005F1EDC1EC7D8F8DB1E5D3E9666C1292515105037D26F2C8D83FEE1F4EF5DEEB287CD7C1E11960218C1B8BB50453488BAB019435065AEDFECD8D218BD1E751FE736442E8D09CE7176A71C06415A30B070693A68BDAA5CDF62351AE665F37FEFDA9481E62EC181ED24F0D0649AD01C89AC422F1B7E27895E55DCC2FD817346D361FA559094B37894C0B478C68A1D7564D089D9D4417D5C7372A33BA475A81FC129F3259C5407BC7435825B415782CC84D85E69D9B44B32D78FA255A895CFD55319DAE677FF89D93A3884CE9401775563FF1788CF3AC11CF96DAA199E7F4579A0264378A323FDA64FAD2349C09465FB23BA09069C7FBC79E7288A82F9165268F6842E0AFF0E250C21BBAEEFB4347D4EF1CD51161DFD29BFAFFBEDF71DEC93F4157A5C18995379ADE8D15DB59EC4A8B308C2EADE1B7DDAB55CE2220F3B3AE8CBA7C8211CCCB3846A225B438F4B37DF54363A987C5C4E6B9D20EC3C0096317D11F982184B75D8EFFD168B7B41317D40F903A23A2649999DB36CAAE31BA5D91998A684D30AAADBD3B1EC154BB6C92513BFC0C47C673254F42B1FA36B995CB737668CBDC2A0D1BA838E74E0E50B22FC22DD048F48B6D1E89E1CCCE5A226F63AC7B8E6E9E8CE27050BF3DCD7D0F35F47BBEC1CAABD4D619CD77302AB4FF6F56DFBE9F5821AFF2D72EE6A628DAAAE4440EDCC070473BDAA54CCD775331AC2812FC5B9884915DA582EB36F85C7923F06D961594753802EFC5883CA484FC64FACE42DE6C3105E23CB90663A3B381D0C6A7265B740BFF0A1A017058F06E39A74BB07B63F883CF914FE675E7E5AD5AD44C9F90DDBE23A125D9BE02264EDC13972FF22BA48ECE8890A223EC13ADDBE055A8B4E03882677FC0D94C9053DA6CED34E132FD83810A793350446D60AE5DD0D174B534A3B6F5BC1B497F9406B5CDD414401B6DD881CEABAB12CC51425E88A81BD9E14BDA18273583CCE0849AA48DBA1CFC49CDF29242C73C99C87F063B8B739AA787570459C098405DCCEF78D6D97C21545F2959DF9CD62F9C38AD9A849507C23A51714565642DD76C9103154327985F7DCC701B795A7AF8625F06367ADC11A7FD7B6ABBDA5B2FF6A825DD43B64A48EDE4EFF8603A82159A6011F9E626171E4593C0E963595A6E068AD05FEB12378C71AE515A82C293EB7D2B01B333CBC7991B44685AA7513B3A58342BA5D094B773E6A27F8582F3DABF54DEF59974CB8A2499369B5B64C7AC08D32D75FE37371C578073DC83B82A828DFC325976FF282D3F6 - -count = 79 -seed = 8B47E0EBE786914C9A52D547106CEB4A3D3DE938B3244E02E5F9660954C4C95A23F2476FCCB487673AAD0513820905DF -mlen = 2640 -msg = 2447D338BF1A375B66B77FB96CBE7742508B57DFF4D33A368EBB8451C2C67B980D3576E6588D8678B285EF288A8B5C9C2726C4A550E764E47FFFA2A128533A7653E480288447509E10013AE1944FFFAFBD9E2BACA0B3C7069C07A4186C056FD3857CADDADD5F891512DAEEB26865F5C89FFA63A64C85A08E41EBE7BD8786A8ADD571A4267D5A9E426840A0B988E197A09F3770B5B0D80D65515CD4D8390AF40E6150062DC4B8661A8238F232692C152C97B8CD5BFE7B5AD863DC92D99744D769087B3EDD81D2E475F5CF0224B10CDE6FAE8DFC3519EFDBE66805AD4468D84D3DD93430363677360DA8F56CB58A6B775FF6417C1F324380B15C9BA668EB0F25FC2A690B483E856F3327B2D79FA6259E30D7F76199CFD21152B7C6FFC3FC113F70D3930C08B3C1EB1BF25C100C5A930EEC2C52664F092B89614943D9D85ED86A2EF666A94F9826C3D116A2BBE49443E2C11748C977716381D9463DA8D09612B80A6760E5A6FC5F59425EAAAD6C8342C1EA4BEEDD5D73151CE213C0B155286FF22CD28E3BB88E0CEE39CB859900D1E0FC19F6A7237BDA8E51476F4844A316752FB347492A928EEB07AA39ABDCC0164D1921B61352ED4AC94B82C410A56505633BAD53A3E649ACAF64C43C1ACFCD4715FC594AF6FB9E85B0B7DDD6E8621BD12A2BEE48223A97EC8502C16B550B03087B6E87C1A860D36322064F8FEBC52F2B7C31DAE7430870259BDAA5889852E3AE6F61013F5AD0D38727CF9D90C67BD7BB3B82D303C6C35383ED86FD5B7DDEC824EA198EF780BE830A1F2679D24EA6E2FEEFB979563F511D188F409F0CFD0050FD418414D01E46DB3D23B3A90B24F4E96EDD4F863BFB333D6A826D29EED167738BBE22C516C59FDF81B032BB55473A5EA2A1DEFE71C95A1EEB5C028435AD0379896CBBC76877501B054CF1FD2F6D7A9DECCD70D0C07111147EF568DCE514DE96EED61600029C8D103B31C8B344A700DE630276BA2C5633419C59E66577659538A6381E45584C7E1D6ED978AB0AF89067AC83BB70DEB6F2C58E339A5A66176A54D985DA6E02002948C62BE6F12314240FE18B09AACBCE82EA462586B8316C3E0AEA00F9998922F8D956120E53B4178223F4D2934A20976FD5A72027C8F4CB33E9BBCC0ABD15395151266B6CD5B4A9E2FC1725D8E9AB2CBDA47B507BB25AC995EDD51EBDA5FD19CAF68FAD8EAC57CB5EF0C6FC861A73E64648EE3255DB4C3394438F49377CC4AC2FCE1B6BC812E5D282F122678713C6C6D452A33C632C0AA47686588752D72B0586FE5EC2464A6DB40662FD2106A19F67DCCC45692FCA03685251D512642B0CEE436C78D94C6F5F25BBCB41FC7E5B1AECD52B846A0B70EAC93579603E9870F942AD4C1CFC9D49B1132777C6F1C184C1537178E5029067257A2DA2827A2EC44D323D13DC6E4E1B9EDF5949D4324228687FD54F02CCC3C4DDA635FA546A5A6783959B1C48AA9D9C9F6381EBCCD979253460857D3CB1C70893EE6F04709E35923883EE3C71C7F33B8CC28B9136B3EBE5F52B9A76817F2F74FDC2F12B459DFF32D5A295BE374B3FE507A0995BCACF1E7B24F4501B29F1E8B4F2A8CB394B3E459A4296F6439BA59EC88305AB045FF40B1DAB4F672F878DE1F9E46B9326CB3E2F3457B83EAD8DEC28DD079AF0E984A69ED882E1CF21036578485DFC2DEBC9CFE82FCE0383B4039D147C4C7E31E315FB57B9093DAA811F4EE4568E32E5625ABE76C5A1AE42A03441DBE766D0EF4DF607406F7D489275E8C5D4470866F9049A4AD5C428B843DEC3702E86E177E4B60181D2B5F099BEBCB25F04C93D087C72436E87A9B3AFCE78FA31E2B892400B5C1071F8AE0F78EF6F7D71859A97C17EC0912D5EA27AFEACE739FCF66F489EC6355A3318F79649881CD6C7E96A881ECC4FF6934C3D10D99F1DFD00592CB037749B025BD4BC2832E206C1407E600FC2170C0BB57E5C7AF0756830C2A6913E2B9C60575CD4A394F2A65C50E40A43CF5EBCA6A8A32335707DDF4633BAC7375DD53E24DF20AF30203B514D3793392E38FA8429B050F58B28CAD0146F385809CC7FAEFF8B71B2BC93D2C6F72E31AE2D07CBB3CB7F43540894E01654EDC71CCF4F361A847EC5B1D23C2D4680E29F0E1F992EDA3AC41ECFE614FC010A2EED1BAD87A7D17468D6FA5356EDB25E9008A9BB328225F85202246816E1A542E1DD746A5FD3E064FAA1248579D31CD3D65F8FFF36F782622402DB328C7850D82D8D8A52B897353A2F8B95624D2D958FC1C3AE6466EACCA2A6A5E6ADD4A582D27E07633CCF697FA02E243A4FBB3DC727B718B5AC0FA6AAB217E241627E69CA46F05ED6B496A739A29EDAEEF76992A507130715BE555C68A7EEAD6E8FF3A378D8F4B7BAFDEE3EDB9EC094440E31BBA717A9C82A117D05EDCA2370003DFABFB2EFB29510466F74E76CECCFC41709FAC4CD8EAA998357170A7A293209EB0BB83DFE5E2F6D73C28D5409C55E95068D647BEC42DB8098F0089EF8A5FC5976BAC421C37DDA6C4227BC1AE5AE229F067515CEA3D794C8D85564AF208AE0FCF836B6C0AF41477F99C8773D9DD1923C5C07E1FD508C7436EA93383797F372EF3103546A5278A4F59614A5D182344F0431D065C35620D63D4D001D7F626993241362E67D1BF41419858EECC2626537D44E2E23619381E96CFA91B3D8054681D298509D9B99E7AA99CF8742E37637B24136F8E1B487E9571E4C24AE5DF307E4C7C62E55C47132AE404B33E5367C6F24D6680BE32D20BC58370145486FD5EACBCF98EB7E7FB6293044067AF11879E91444025FE52E24617269BE192BB71BD9F95356EDBED9DF352AB56A854F9F531889A88689D3F161FE6155C6C1E8011D60A46F59C7D08C477FA652B559A80567076B4EAC29A85D54C66B35D6960DFF75A696CDB17EC9A7B74DC6C3652DAE866E8758170D055C4BF60FA1238448CC9E29160DF50160C4B0DFB36BCA40AF0BC5F7D490E7DBCA49535742EECB90098A0A0FBBBBC7AF25C0CA9BC039DFB555DD8431AF188F7C1D0FF786D627C058A0B9A15F26B58AA2A5992BC8FC5AA14025FF95F294203B45EA081E28F094D0D4AD671C885E67B2E9E800F10048158698D56648F67BFA8CC73DD5AFA15C1E48936B2596DEE34459B484336C20CD77E58BF682479F9AEF2FCDA86E4F3A2FED7046E5A3828A9B3C0DBFFC25FE699F25629A2045A51242E310CB369B730A5E81167758D7FE843261A598E4541B02D0DB4BF5616BA07A440665F7FEA6213114B6B1B38BC033D70E845445DCD18E23D34D3D6F4A52F5F904AC5D8FECA5AF1123658D09613209EE19954174A1AC7A8C7F9EA288BBE5A0705F3CE38F30ED5EE69CF5208D461EFAD51C456507C3729EB338CE15C4C253BE21E81F082B0847C6871CA0FC8B3E80115FE2BB8CD8AFAE69A3C1429D21F149B7446888BB4DCB639819EFEE665B6D6F69E61452B9328B4887A7C04E9949390980A2609A667267035B11BF862C1131533DDAFA518221627E0EE7E4009CD48E4AA9D0753A9AE82AA0257B69D569B4C53F05A75A521B327322C60398DB0947D205D2A33AE51CF2CEA8C9162DD604F8EDBE91F5199D19EFBF9896A46389E7BCBA54B4AA57CBA0D4F9DA117F288133AD01A9A9B2A824D54F74D4172BE2B1E5F0D3DE60C13AA5B668EE6A45397C2E39573EBFABAABA48D1DDB2AB6453FBBAC8DCC05349404889C7DE23A16EAFAC8D5E541457C32CDCE80CBC -pk = D6A15A60ADCF505919B41E3FAE64146734E72F34F1259C32AFBABF88F934A2028F9AACB146A353A778AAD3F5EB607B03B295A1B4231A0C358A12D2350C2F1F0054ACADEF94D808498AF8C827685BE99FBF4849736BA5EC36261142C06E2B1BA98CF37D5FC5B422765F48702728CB0C4F2573939DCDAE70E365C8581630420A00 -sk = D6A15A60ADCF505919B41E3FAE64146734E72F34F1259C32AFBABF88F934A2028F9AACB146A353A778AAD3F5EB607B03B295A1B4231A0C358A12D2350C2F1F0054ACADEF94D808498AF8C827685BE99FBF4849736BA5EC36261142C06E2B1BA98CF37D5FC5B422765F48702728CB0C4F2573939DCDAE70E365C8581630420A0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CE4D508EF05DA176101556455FEA873CACE726B9AC3394065FA74718B55C824D342FA0ED868F0CB9D4C9CEE13BDB53F0460CA70E963D890F9C90C53A21D48FBE64793E29E33D5F924BA3ABD9A665611C11F7298E37ACC4EBF00600000000000000AB9179C0A555049642796D6F210D90CC8D2A23D3FCEDFD730799B3974F996D615BAF9DD9349F136A88C7AFEDC4449B5213FD2B43510F46E01A4F71262DB98FFD3A4E0604A106828FB779B4660EB609012EE580000D2716D363FBFFFFFFFFFFFFFFCBC2BB36C7472F95151C5A3AC1C452F64CC879689FAFF1E6D138321E32B2D7181C0446FA153F5B6F4493F4393B9CD7C160A32E895BE88BF89441FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42F7B51AF75709B8FDB004F33EC856FE2DE9999BFD8D8DBD38C24A6B9A12063493404B320FA7D62600AB2A86FD6DAF90B233B7FF5E4D1ADF64F1020000000000000000000000000000000000000000000000000000000000000000000000000000C6D9BB60D703C833F7C9A538EA3EF7365A767F316DC948EE36ADFD6EFA40BE4E8790FBC44AA50BE9D87AA3EC1EA675F86BBC6A91B403B53B5275976316C91D00AF2434BE22B49408DDB9B69B7F4C2367EA086B2387F728110D37F9FD03E9A7005A7D76FE51EEF3AF6781721F445CB450C461C93AB8F1F6B3A46D33C75F230200AA24903774E0C9A6F456BA4AA0998F5416351C9EF44E52A5B4DBE82C7091E5ACC4A3CDB255675D2A080C41D78E35BD371111C432C114F9845308E6499DA62200ACBBF1D3221342CF2B93E529D7A9039819C6BE811FB903F5F1827EA1F04AAEAD4AA9A92702060C457D255079A9F4883A5034A89978A506194E4D50A9E111180079840256E0BA397FD6E6134F574BDF4A11B1DBCEEEBE2D5EBC5786F7FEFC499011D94F03A127767A0E75FEA7562EF14674620DDB70CB2987F7CE3A0D93850C0051965FDE24656AC460DBA0F84900DAD98F1043AAA5EDC3CE12D6CFC15CE392E9CD2E7E1C20BF852CB13A294494AFEB8BFB3F2820B2EFC8FAE4D086B335D102004DA326BB02C6367854D7D89E33633B3D9C82CCD0CD0578F956D47DC390E7D4B3343971391D13A5D92FCEF257BD8158146D9F6F086790B32FC171BB95219000001EA1ABB24ACEA26DCC0A004F744D3C64D89BAF3B08C88A9693E3A828537A80EFD2C2B843B94DE8E93073DC4F708F17D5F8F81D238A4441BEF598967A1FBB160049D4947EE1CE66EC1C86E5B3A819A0ADB57F457383C5D99D7BE6AFD29BBB3AD01764AB2529E7EC4F6A074C743E249654B4687F6817F2C98086E8335563AE2400A055786E68036B060A7B5F0DA9B3D05584388A742A92C9269E5CE16B0A25E91D0E2B36E1C5F463D53B57A4590CA2407FBD71A5B04E9F305E382CE80CEB4B0C00A352FEBAD25F0A384660C1775F76091E463772FF6C526B61029537C84E56A2BBA145296699661A4F5E472188E5114C496B875167193ED5057850A559DF8E190058200F016D486D04A3B35DB8205FD73C0F4112D64FD69B3D62C2EEB8878B73077D21C2A03DD3C259EC992644C84FCD10D31FD7B3C8EB488CFFA2DEE160871200086F5B0C053DC1C875B0032508FC7F5B87EA730ED316CD615671D56ADBE64F15F21FADD2CCA7A0426E72EBACFD0E08413015A34EF473EBDF50693F56517A1F0058566C2A6691E79C66D2E3A7DC59E9D0711A879811299EF4CBA1E1B7CD0173DCD80C4E5B30EFCD394BFE96276A27FB0A4093D859583716919F93D96B60641000 -smlen = 2975 -sm = E7303D48E34D48E351A6E1E307A224A86B2401AA41A0ACFE453F53080E9F2D2026B0527F9300003EA17249781C9030F63947D39E33D586A00084B11B4EFEE3CC25AC5F60D6128A1919BA2200518601E1C55DF50DE9660F6BA8FE1175A99000D65F45391D4AA056AA24A7CFB68285BBB34701B6E0895C99D821105CF80CDB22EEC4F51175000C512E66669529D84E048A5A4C12364658DA0162A2D14EDA0617A753F3FE37800B3B0E9D6E00878F6A09B2174906FD217B9D5580FDB9B03500CE18A168F8960580466FF37014D865146BE101359043946B6859767C9CA45EFC178353EC0B01219A316DA8326C63059EBE8759E01D9333E000976FDE047D367BD295BB952C2B2FADF162A601011F8066698F3CF75E18844126459D11A241538E2FC3EACF2888E49CB44F04453808030176477311A5549D8949E4D0E6D787583D4201D68C96B31F29AEF65B9069F5CEE9022447D338BF1A375B66B77FB96CBE7742508B57DFF4D33A368EBB8451C2C67B980D3576E6588D8678B285EF288A8B5C9C2726C4A550E764E47FFFA2A128533A7653E480288447509E10013AE1944FFFAFBD9E2BACA0B3C7069C07A4186C056FD3857CADDADD5F891512DAEEB26865F5C89FFA63A64C85A08E41EBE7BD8786A8ADD571A4267D5A9E426840A0B988E197A09F3770B5B0D80D65515CD4D8390AF40E6150062DC4B8661A8238F232692C152C97B8CD5BFE7B5AD863DC92D99744D769087B3EDD81D2E475F5CF0224B10CDE6FAE8DFC3519EFDBE66805AD4468D84D3DD93430363677360DA8F56CB58A6B775FF6417C1F324380B15C9BA668EB0F25FC2A690B483E856F3327B2D79FA6259E30D7F76199CFD21152B7C6FFC3FC113F70D3930C08B3C1EB1BF25C100C5A930EEC2C52664F092B89614943D9D85ED86A2EF666A94F9826C3D116A2BBE49443E2C11748C977716381D9463DA8D09612B80A6760E5A6FC5F59425EAAAD6C8342C1EA4BEEDD5D73151CE213C0B155286FF22CD28E3BB88E0CEE39CB859900D1E0FC19F6A7237BDA8E51476F4844A316752FB347492A928EEB07AA39ABDCC0164D1921B61352ED4AC94B82C410A56505633BAD53A3E649ACAF64C43C1ACFCD4715FC594AF6FB9E85B0B7DDD6E8621BD12A2BEE48223A97EC8502C16B550B03087B6E87C1A860D36322064F8FEBC52F2B7C31DAE7430870259BDAA5889852E3AE6F61013F5AD0D38727CF9D90C67BD7BB3B82D303C6C35383ED86FD5B7DDEC824EA198EF780BE830A1F2679D24EA6E2FEEFB979563F511D188F409F0CFD0050FD418414D01E46DB3D23B3A90B24F4E96EDD4F863BFB333D6A826D29EED167738BBE22C516C59FDF81B032BB55473A5EA2A1DEFE71C95A1EEB5C028435AD0379896CBBC76877501B054CF1FD2F6D7A9DECCD70D0C07111147EF568DCE514DE96EED61600029C8D103B31C8B344A700DE630276BA2C5633419C59E66577659538A6381E45584C7E1D6ED978AB0AF89067AC83BB70DEB6F2C58E339A5A66176A54D985DA6E02002948C62BE6F12314240FE18B09AACBCE82EA462586B8316C3E0AEA00F9998922F8D956120E53B4178223F4D2934A20976FD5A72027C8F4CB33E9BBCC0ABD15395151266B6CD5B4A9E2FC1725D8E9AB2CBDA47B507BB25AC995EDD51EBDA5FD19CAF68FAD8EAC57CB5EF0C6FC861A73E64648EE3255DB4C3394438F49377CC4AC2FCE1B6BC812E5D282F122678713C6C6D452A33C632C0AA47686588752D72B0586FE5EC2464A6DB40662FD2106A19F67DCCC45692FCA03685251D512642B0CEE436C78D94C6F5F25BBCB41FC7E5B1AECD52B846A0B70EAC93579603E9870F942AD4C1CFC9D49B1132777C6F1C184C1537178E5029067257A2DA2827A2EC44D323D13DC6E4E1B9EDF5949D4324228687FD54F02CCC3C4DDA635FA546A5A6783959B1C48AA9D9C9F6381EBCCD979253460857D3CB1C70893EE6F04709E35923883EE3C71C7F33B8CC28B9136B3EBE5F52B9A76817F2F74FDC2F12B459DFF32D5A295BE374B3FE507A0995BCACF1E7B24F4501B29F1E8B4F2A8CB394B3E459A4296F6439BA59EC88305AB045FF40B1DAB4F672F878DE1F9E46B9326CB3E2F3457B83EAD8DEC28DD079AF0E984A69ED882E1CF21036578485DFC2DEBC9CFE82FCE0383B4039D147C4C7E31E315FB57B9093DAA811F4EE4568E32E5625ABE76C5A1AE42A03441DBE766D0EF4DF607406F7D489275E8C5D4470866F9049A4AD5C428B843DEC3702E86E177E4B60181D2B5F099BEBCB25F04C93D087C72436E87A9B3AFCE78FA31E2B892400B5C1071F8AE0F78EF6F7D71859A97C17EC0912D5EA27AFEACE739FCF66F489EC6355A3318F79649881CD6C7E96A881ECC4FF6934C3D10D99F1DFD00592CB037749B025BD4BC2832E206C1407E600FC2170C0BB57E5C7AF0756830C2A6913E2B9C60575CD4A394F2A65C50E40A43CF5EBCA6A8A32335707DDF4633BAC7375DD53E24DF20AF30203B514D3793392E38FA8429B050F58B28CAD0146F385809CC7FAEFF8B71B2BC93D2C6F72E31AE2D07CBB3CB7F43540894E01654EDC71CCF4F361A847EC5B1D23C2D4680E29F0E1F992EDA3AC41ECFE614FC010A2EED1BAD87A7D17468D6FA5356EDB25E9008A9BB328225F85202246816E1A542E1DD746A5FD3E064FAA1248579D31CD3D65F8FFF36F782622402DB328C7850D82D8D8A52B897353A2F8B95624D2D958FC1C3AE6466EACCA2A6A5E6ADD4A582D27E07633CCF697FA02E243A4FBB3DC727B718B5AC0FA6AAB217E241627E69CA46F05ED6B496A739A29EDAEEF76992A507130715BE555C68A7EEAD6E8FF3A378D8F4B7BAFDEE3EDB9EC094440E31BBA717A9C82A117D05EDCA2370003DFABFB2EFB29510466F74E76CECCFC41709FAC4CD8EAA998357170A7A293209EB0BB83DFE5E2F6D73C28D5409C55E95068D647BEC42DB8098F0089EF8A5FC5976BAC421C37DDA6C4227BC1AE5AE229F067515CEA3D794C8D85564AF208AE0FCF836B6C0AF41477F99C8773D9DD1923C5C07E1FD508C7436EA93383797F372EF3103546A5278A4F59614A5D182344F0431D065C35620D63D4D001D7F626993241362E67D1BF41419858EECC2626537D44E2E23619381E96CFA91B3D8054681D298509D9B99E7AA99CF8742E37637B24136F8E1B487E9571E4C24AE5DF307E4C7C62E55C47132AE404B33E5367C6F24D6680BE32D20BC58370145486FD5EACBCF98EB7E7FB6293044067AF11879E91444025FE52E24617269BE192BB71BD9F95356EDBED9DF352AB56A854F9F531889A88689D3F161FE6155C6C1E8011D60A46F59C7D08C477FA652B559A80567076B4EAC29A85D54C66B35D6960DFF75A696CDB17EC9A7B74DC6C3652DAE866E8758170D055C4BF60FA1238448CC9E29160DF50160C4B0DFB36BCA40AF0BC5F7D490E7DBCA49535742EECB90098A0A0FBBBBC7AF25C0CA9BC039DFB555DD8431AF188F7C1D0FF786D627C058A0B9A15F26B58AA2A5992BC8FC5AA14025FF95F294203B45EA081E28F094D0D4AD671C885E67B2E9E800F10048158698D56648F67BFA8CC73DD5AFA15C1E48936B2596DEE34459B484336C20CD77E58BF682479F9AEF2FCDA86E4F3A2FED7046E5A3828A9B3C0DBFFC25FE699F25629A2045A51242E310CB369B730A5E81167758D7FE843261A598E4541B02D0DB4BF5616BA07A440665F7FEA6213114B6B1B38BC033D70E845445DCD18E23D34D3D6F4A52F5F904AC5D8FECA5AF1123658D09613209EE19954174A1AC7A8C7F9EA288BBE5A0705F3CE38F30ED5EE69CF5208D461EFAD51C456507C3729EB338CE15C4C253BE21E81F082B0847C6871CA0FC8B3E80115FE2BB8CD8AFAE69A3C1429D21F149B7446888BB4DCB639819EFEE665B6D6F69E61452B9328B4887A7C04E9949390980A2609A667267035B11BF862C1131533DDAFA518221627E0EE7E4009CD48E4AA9D0753A9AE82AA0257B69D569B4C53F05A75A521B327322C60398DB0947D205D2A33AE51CF2CEA8C9162DD604F8EDBE91F5199D19EFBF9896A46389E7BCBA54B4AA57CBA0D4F9DA117F288133AD01A9A9B2A824D54F74D4172BE2B1E5F0D3DE60C13AA5B668EE6A45397C2E39573EBFABAABA48D1DDB2AB6453FBBAC8DCC05349404889C7DE23A16EAFAC8D5E541457C32CDCE80CBC - -count = 80 -seed = 07CD8F8AB7CD12EA7CC94103B8623D6F0FEA2BAFD2325BF6089DF5351BDBB9A94525C3C6B72D3820F2E4D5F9E7C849F8 -mlen = 2673 -msg = AAFA792BFF719A3B794B2F8198EBD1556889C8C61EE6A51470AC9B274CB162AF44A26E2BA5EA7663C4C78B4B66B322ECACA8F2EBB6A610B51D7C4399F4A64A870C038797CAC80F709CA5C3C9FAFF7D797963E60983B584130C1B99328AADB2D261217CB95A535B8518A78A6D2F6CB8400C2AAA2DAF451391F7B8AB0277A3AF88E1CE6F1D3DBC386CBAFF15308F073D29838692E645F566D4B3DB4186C259BC84606855EA88938CEC4F7211BC9B461E39DFBB9E44CBC273E02D4314A037E0A26D60985EF5A35F069D8B51F86E9B6801CA067AB75565D73581EBBBBD98ECB5AF47509C8729D82EA0B35F0A376EBE6D90108CD61FBD0CEC966C17264F6A87864457F41162FF7210049E6CE2B5354F8F19161E0866D6BC3935815D9267C600DC529521FD092B126EC440D49B8E3A166587657B52AE9E2923644F72876EE94A61D2DB0EF4DAB33ABEC0C47A6A725D4CDABD06D4F6A30BD7C90DB3778C17B7D8CE82A5123B798D8B47C7F3E968C9E9F82A6EB3C2BDD8FC06D282F5CBF3050F6FF71E2EDF7A109F23AB47F427BD75163162C37722BF70A6BBEBEBE8FD9C39152AFEB78C37D718014F739F20BAAD1597B1F9C4E0B59FD82B834D83DAFFC935DE4A3272D7C2454508C07502943E90FDB56128D6E6009ED09CE80A9B60D51AA2E4E162F7F0C362F6886BBCABE29EF6C7F38B742000B9D152FF709082FAFE809C5DC9BCBC6F300B0A7840D0D36F39567D14D8227E7145F7CA670EFE917E0F18B0570DA3E05DDE56883FF12BC0C76C2A1E9FEFFBB728D991769B7D0B0D34853C76FC0655AE200501C28755F57934BB9F46A3C6AB1DD8E0161C698133F4F2D7CAF3392576B4BD2B6F8735D80BCF60656E132442BB7FCFDAE160A2DFE3F3FB8209B5C933201785A7E8206096B84A222A68E62501846273F6A9145820F87F450D12C64FF79A843E897C8394AD54AAF4F3B886FB00A6C37B2EFD0F6D4DD639C9989E7CA30E4F12EEF440946B61D7A28904E1D74009B6D1AEDF2FDA8B5991CB37795A8EE51BBDAAEA34A4C7040944761B9B4B4C12F455C536992A0852F7F07A9AEDA8E522591CB4831B0C79FA977AB6BC49C9730186855986035D2C6E5A6D93DA43E8825753721978AAEB433CE2F2A7D67C1FFEBFEA6F6059474D3022817A7329D9DD0E4A292302E4A57174B9C5346E4B6D75D65882CA7339A48C6E7AF776A8515014A20E4390F6B4F4A19990FA725F5A69B9C3BD4E8BBAEAE49979AC19600A3CEC6DE154985E236C3D0684269974BFC82301AC7196675F618182D7CF15EE5CE3B7ABEE0DEEA5C72F54CAFEF203D556B31327089A0C0DE94F74458CFECB481ADFE3CBB5DA422BD3626B00C4572B4C2BD7584ACD9129A76C616AAE51F944BECC4682AACAFB8E3BB1A42A6A8E5FE7BDEB43305A34A98308EF2D49EDE4F41361446A9AE4DFC1EE13D12821BE0B01E55B865B563633E5A19DFB6425CB60159C147B18A6419F5085C5D0882656ED533EEDF97674D0BABB6CF32F696DEC0F9921CB3DC9E6021FA198D554B1D83C42A0BF214FE4C0431547384F45AED9190CBCF98ED8278E8A03D551FA284C8A26218F0B0B58D99879DB98449CC99B6B399DDDAD9924E6A7EB20A0F1FDAD2F8138BDC7B445BC01503C509066B1603CDA76FE41727AB5E027DCB15032E8F66BFA84544D22C501AA6F62B02C0F8764387163CCADBF1ED7238E7F16C80E6C37AFEC2E10FFB95AB0A39784F9FCCD8AE263758ABE392727E9AD442A44738D77CB61A6B1540ADE751130489015AE5917C927232EED27BBF88481F3CA0C5ED2C31DFA943B2EAD4A8C80B4946E3C138A61BAF43A72C7A25E16874CBAE254D3F14C154F7C60CCF665B566799A01E0F769B60F73C17C840E0018C6FBC10EEDA3E35A77586B3A5936B363B2D5CB25C78A3E3AABBB84F1E64DF47F97AE1645650FE1751A724EA9BF80744D0F33DA6F313A3CC17D8F261585B62A75C167126D899219A26210DC55AB6DB2B94E6993849B4986F988EFB07478D6621CBF4B8ED772E61B0246A5582242FA20339B2D6CB89BA1B9210A318EB4697FD21EFCFD230DE9680514A442A13B29D8CB2627A6970BB97BF09C79C6ED7A27247662B25F39C8D675B0747F1A6D9EBBF7CFA7BC51A7EA3A7307EA4FA2A463BF53A645FE701FBF26628731CBC18636567AE633A49E59F6F049447803FA3D4F1F79F38026DE9B07D8610C9F01BEFB7054AA46E523E001C1EC3A4E7084DE0CCE596DC63D9C1F1DC03F35F9B1918E62ACB2640102E1D520E900969D53E83D2DBDDC80D1DC54BEE99531FAA5A8D2DBF8346C7ED123587353DD63823453DE350545C176446845BB3522A862F5D675419DA901CF7D2D1F7050ABFA3237D42753203BE251B0364379232D2D9D8642D52A60F6F4CB09EF29FA1E6069F97A1175F8447FE98A813CC182E33FFD8B8CAD93BF32A60F1A9E63A79A7F7FB9162783B89BB57F3E73155CED1D0084D5BA967F76C89C61C1A3E944F3B6F78D6CD3D1139A315C5276493481F3FFF9B6A6B40C920EEED9EFC74108C6BBA5A15DA736680A23DB5672C5A32ABDA24B49F2011F44FA8FF9C73609EC195025F0456D753C848DC6296920FC32DDE2174D37BFBCB86CF618AA0D486EE46C5E1EA14A3BAE4952AF5D4837F9B8122A19D1E59B909ACEBA6C849C8B452CD6CEF877A65FD83E6D0C6EE35886688F1D877612CB8E671D83216A1F76693D6A4D6A2EC13EB6CA2005328B3C91F51B352A707EF8180F320D6E1685C1EF4D87E3CB77FA549BC12727E59C11BDF8A9631CC272998253028CECEE8A2914182B90F586D80E7ECE370979BDE683F37123090012AB9243A4C145D6349C2791DC44E54956C5E9B59FAD017D3EA27D85B48A896671A0AC14A73B5AB9145D8BA6AEBF9EA25AC2E8E2C4D16C5009A83D0E84CEB80E95DF2CEC4CBEFC7F5B90A84D408E8C4855F9AA2987D9FC9D8A451F32B367BB1DE5271ED35EA153B5D400A6D8050EE82F519BD930245A96C9727FD24D8B94DC53D4B4F00D03172CD6B7F2BE163B6D16FD6247B01988A6EE6CE7BFEAFF78E983B8DDFBA4242730E52B57876E3719D1F9F6CBCC81620F848D23C31E3FFF7EBF2AFE5011E6466B1889E7EF6281FAF8B18A012CEB96796FCA9B28E78335DFCB85BBEAFAEBB0FA75EE2D0D391CA97E05F0FE43475135B13613206A0D88438F17EC8E604B007AFDCB9FA1378B7CB96675E0B19DC6FB02508E05A7FDAAF09297A3884AA051B6389A52F921F8FF31970FB082DF554226C2613B80CC1ADFF770024D6BF011C0F028A012597AE56F36EB6B3E864D79639810B8BA7258B18192B5CAA80DEA4B140D3C6F1D707ACD2256D676AE90980BA80E10B44109211ABA830EE96E1BBD248315C804D391A86AB7D4B3A4A37FED90D9867DA4B93FC32E79403E5D78AE99AF1CD2ACCE65D4F3384D9CEAB71B1E93B99704C64CAF17B999234361E378B9362D14BE3FD9E6C268013CB1FA2EA8361749D635C0429F796EB15A685E31DFE7A76AE870EBA120331AC830F8C486F6C0C4F07B658EBB9274A463E0EEA101481DD6B58835A303ACE802AE79EBEF51ADD98A67B7FF7968815ACF4504B9D360F7C0120A00ABA1FC558E6CBD8324EC35E0985294563A8D7ECCCCD9E3D1557A09885770836ECCC7AEE0F18B81E30F85D695440B5BCE29945CBF60FF402B281942D38EA33A4B03E9FCBBBEFAAC2C455E8A03FF3F35154132C538EA16F0605EFB788C3CA8435F6D595F776433585094ABC75BA581EC59AF701F66DD6091623E4676D167 -pk = 73CF795D3A6651C299BD434F3665AF6DFD31A7F68BEE70FD8E7692F04C73A1161D1440AAE16A265800909D19C64CF410566910D3A1659F1C6DF3BF11B0B60B0064886F70E63080B25D5067320EE2D526CB1A918C6CD865212ABBA41CE5CF56FA2032B0D4229B4EBF63C62F8F612A4B87FD3F65423A75E825F1C470E9AD3C1300 -sk = 73CF795D3A6651C299BD434F3665AF6DFD31A7F68BEE70FD8E7692F04C73A1161D1440AAE16A265800909D19C64CF410566910D3A1659F1C6DF3BF11B0B60B0064886F70E63080B25D5067320EE2D526CB1A918C6CD865212ABBA41CE5CF56FA2032B0D4229B4EBF63C62F8F612A4B87FD3F65423A75E825F1C470E9AD3C130002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C86CDEB4E0A9D228017948740CC35F486A47CA94A9AA25A7B00B9BA2F0179ECAF3396117EB19D96BEBA63221435D4196B8F8BC44228F5B69F0B5B80A0C917C81B914F01E255E522EE2CB93300F4B0A5F05DC07F344132E4DD20D00000000000000EDF1CD6BB81C89237172DABDCA905D35363FE8CE2A543B38AAC3C647251646C761E2A1E0505E18C526159ABFDEDE9DBA6DE2CFAA6C7AC5528E909AA87685DD5E3E71AE687ED88BF73D58F5D2F5B5A7221E3D8C539EB785B36BFEFFFFFFFFFFFFFFC5C1A1E9682B46D5026250A16F1350A23EA8C77FC3CFF9F258C650921AB4EF42F91C3DAE533958D8C4A6E4B88CB231ABC632B90778B929AB9B3C000000000000000000000000000000000000000000000000000000000000000000000000000000FCA599C5BB8D106FA8F2CAE5AC1AE8459C4366B93BCB12376639B978EEFB02BFEC0A276C953A264A0CBF2507B415198D823AD32B5B81888D40670400000000000000000000000000000000000000000000000000000000000000000000000000003D2E6B470BFFC87246F7A563B1AACB4B228B311824D4D3956D4D03A8786F0F6F1A35AADEC81F3D01B74639BC8A04EAEE41440BE22BEC2248A7EB195331380B004A4D1D0FDCE8B93B95E3216F0722C3BD315E170F6B0F768DCF1B2C12659C9AAF9E792147DF0125D1B0436B5105A999AF217E5A20F4C8B426330AD897BD0D180069D52F8EDE28BA794CB767C646223B682AA85AD0091E995835D6B44E9AC658F9F6B99B19CCCCB419FB8C513C89D9DF1C50466CDD82DFF27F2BD4FE95F2750000C9A4045EA4CAEEAFA2B475069FE8FA9CD066C084CBA8EC182E7A4A5C3F401ECA916C93279BC392A672F0625037D20AE63FD718FF95A3E3B1A35ACBF772A41200E90869994A1B8FC4D8093EC85E07A83C7A7DEC8A4686B57570FBA162BF15F721F014B54B5FC5B45782CC661AC4ABC4CD214E6AE3AE375589A95961060FA002000A167281A3592A71052ACA83292F2904DD5C2268CFC199592E968B504E6F286A165A09F971935987DB5E2D1B60F1AA5744A22A6DC8EEF30F8526ABEEEF06070098244E1BD01CA848C1A264A6DCDB2704969609C2EEDD6153C60850E3269E8197E865D7304CD9792E97A995C74F3DF89CFD07B7F272FB08E0301AD28904991100AA6834462730E7D0AD150D12CDBD443030E7E441CD20C4DB78DA147DF802A072F44550A620E83B8E79F6B47371E462EF786791954C5527572D52AF3BEDED1300011EE4FC855172AC22CFF90A8C82C0B125BA06A93AF364EC7D9FAEC34BE39702668A89FBADEAF0D38E2982EA4A6E2E5A0B24BFAC3C301E26D54C689B5A322500F6F395258A7F3B9908566A1C7DBA5CF7F5A220789E55B9C184F9FE0AE4CC21E20EC1BD749D7082438299B894452B5D409D18FEB417AAD43802009F288BD620002336BDBEE799EF49CAD6D4310B53F2D9C2B2AEAACC7F95925CAA56F50EB0208F2B0279B2738BCAD6C2426217BA84EF0C556DFE7071790EB550C1779C1F7208001B4011F4862D04E2E68D7B252AF42D61B08DD01611C93FE0B8E7F56E14E1E9EA95C3C03AD138AC0684967FA6DFD79B256203DAEE52302B6B3B1C9169C48B1B00A8806E582D9920198C21CA8A9B4F7D008977017D7A3164D8D954390289D5D023ED543088A8DAD6328C49DD96C5D2608101B0E15BB4C5B8C4766CBEB36F8E2400E875A84E0672D920E5C3C1A33420568BB68A68D8F3491B24843315007A29EC54399E3C82DDD0E1812C9ACB300C66EE8DCF1767C5997A90595A5BBA9EC5EE0B00 -smlen = 3008 -sm = 53372BC60B620DC158AD8BF4EF8FF6E885910127B321DC21408CF69EE5A0F8802689BF5BEF013AFA61EF4EE73731D2E8C9C102701D439D1B001C6C39D6D194983D009A5627F550A0C1F61E00081E49E8605A69BF292A82383C5D2EE3297D00EC5EC1539B59728983AB764C2CED11014D0C008024A858E2D9D0312A79CA87FBA1259E82C201701C0C64B73228D1A345EFEC91E8FCD85DE701A782D88AD19024B1A871A057E935744DEF79013563F752C1E89D7F3B58790BA3568A52D61C018572BB280C648106A94C373F449FFD32CE650166DB26E802E9E0912816BCCFE3A5E05352FC01DD5A77722DB24E350213A3CC02E91CD737C5001B58CD76802B5AEE3617564E19EC9A443A6A0101A1FA986C17BF52B5E5ED14FCE4A3AC0783A0B77AB14F5012CB750765E54DE9780302F250E3517E3F6F0CD04B27D4B2D71AD6C3DB0108D97B113186FD99F88D377609D703AAFA792BFF719A3B794B2F8198EBD1556889C8C61EE6A51470AC9B274CB162AF44A26E2BA5EA7663C4C78B4B66B322ECACA8F2EBB6A610B51D7C4399F4A64A870C038797CAC80F709CA5C3C9FAFF7D797963E60983B584130C1B99328AADB2D261217CB95A535B8518A78A6D2F6CB8400C2AAA2DAF451391F7B8AB0277A3AF88E1CE6F1D3DBC386CBAFF15308F073D29838692E645F566D4B3DB4186C259BC84606855EA88938CEC4F7211BC9B461E39DFBB9E44CBC273E02D4314A037E0A26D60985EF5A35F069D8B51F86E9B6801CA067AB75565D73581EBBBBD98ECB5AF47509C8729D82EA0B35F0A376EBE6D90108CD61FBD0CEC966C17264F6A87864457F41162FF7210049E6CE2B5354F8F19161E0866D6BC3935815D9267C600DC529521FD092B126EC440D49B8E3A166587657B52AE9E2923644F72876EE94A61D2DB0EF4DAB33ABEC0C47A6A725D4CDABD06D4F6A30BD7C90DB3778C17B7D8CE82A5123B798D8B47C7F3E968C9E9F82A6EB3C2BDD8FC06D282F5CBF3050F6FF71E2EDF7A109F23AB47F427BD75163162C37722BF70A6BBEBEBE8FD9C39152AFEB78C37D718014F739F20BAAD1597B1F9C4E0B59FD82B834D83DAFFC935DE4A3272D7C2454508C07502943E90FDB56128D6E6009ED09CE80A9B60D51AA2E4E162F7F0C362F6886BBCABE29EF6C7F38B742000B9D152FF709082FAFE809C5DC9BCBC6F300B0A7840D0D36F39567D14D8227E7145F7CA670EFE917E0F18B0570DA3E05DDE56883FF12BC0C76C2A1E9FEFFBB728D991769B7D0B0D34853C76FC0655AE200501C28755F57934BB9F46A3C6AB1DD8E0161C698133F4F2D7CAF3392576B4BD2B6F8735D80BCF60656E132442BB7FCFDAE160A2DFE3F3FB8209B5C933201785A7E8206096B84A222A68E62501846273F6A9145820F87F450D12C64FF79A843E897C8394AD54AAF4F3B886FB00A6C37B2EFD0F6D4DD639C9989E7CA30E4F12EEF440946B61D7A28904E1D74009B6D1AEDF2FDA8B5991CB37795A8EE51BBDAAEA34A4C7040944761B9B4B4C12F455C536992A0852F7F07A9AEDA8E522591CB4831B0C79FA977AB6BC49C9730186855986035D2C6E5A6D93DA43E8825753721978AAEB433CE2F2A7D67C1FFEBFEA6F6059474D3022817A7329D9DD0E4A292302E4A57174B9C5346E4B6D75D65882CA7339A48C6E7AF776A8515014A20E4390F6B4F4A19990FA725F5A69B9C3BD4E8BBAEAE49979AC19600A3CEC6DE154985E236C3D0684269974BFC82301AC7196675F618182D7CF15EE5CE3B7ABEE0DEEA5C72F54CAFEF203D556B31327089A0C0DE94F74458CFECB481ADFE3CBB5DA422BD3626B00C4572B4C2BD7584ACD9129A76C616AAE51F944BECC4682AACAFB8E3BB1A42A6A8E5FE7BDEB43305A34A98308EF2D49EDE4F41361446A9AE4DFC1EE13D12821BE0B01E55B865B563633E5A19DFB6425CB60159C147B18A6419F5085C5D0882656ED533EEDF97674D0BABB6CF32F696DEC0F9921CB3DC9E6021FA198D554B1D83C42A0BF214FE4C0431547384F45AED9190CBCF98ED8278E8A03D551FA284C8A26218F0B0B58D99879DB98449CC99B6B399DDDAD9924E6A7EB20A0F1FDAD2F8138BDC7B445BC01503C509066B1603CDA76FE41727AB5E027DCB15032E8F66BFA84544D22C501AA6F62B02C0F8764387163CCADBF1ED7238E7F16C80E6C37AFEC2E10FFB95AB0A39784F9FCCD8AE263758ABE392727E9AD442A44738D77CB61A6B1540ADE751130489015AE5917C927232EED27BBF88481F3CA0C5ED2C31DFA943B2EAD4A8C80B4946E3C138A61BAF43A72C7A25E16874CBAE254D3F14C154F7C60CCF665B566799A01E0F769B60F73C17C840E0018C6FBC10EEDA3E35A77586B3A5936B363B2D5CB25C78A3E3AABBB84F1E64DF47F97AE1645650FE1751A724EA9BF80744D0F33DA6F313A3CC17D8F261585B62A75C167126D899219A26210DC55AB6DB2B94E6993849B4986F988EFB07478D6621CBF4B8ED772E61B0246A5582242FA20339B2D6CB89BA1B9210A318EB4697FD21EFCFD230DE9680514A442A13B29D8CB2627A6970BB97BF09C79C6ED7A27247662B25F39C8D675B0747F1A6D9EBBF7CFA7BC51A7EA3A7307EA4FA2A463BF53A645FE701FBF26628731CBC18636567AE633A49E59F6F049447803FA3D4F1F79F38026DE9B07D8610C9F01BEFB7054AA46E523E001C1EC3A4E7084DE0CCE596DC63D9C1F1DC03F35F9B1918E62ACB2640102E1D520E900969D53E83D2DBDDC80D1DC54BEE99531FAA5A8D2DBF8346C7ED123587353DD63823453DE350545C176446845BB3522A862F5D675419DA901CF7D2D1F7050ABFA3237D42753203BE251B0364379232D2D9D8642D52A60F6F4CB09EF29FA1E6069F97A1175F8447FE98A813CC182E33FFD8B8CAD93BF32A60F1A9E63A79A7F7FB9162783B89BB57F3E73155CED1D0084D5BA967F76C89C61C1A3E944F3B6F78D6CD3D1139A315C5276493481F3FFF9B6A6B40C920EEED9EFC74108C6BBA5A15DA736680A23DB5672C5A32ABDA24B49F2011F44FA8FF9C73609EC195025F0456D753C848DC6296920FC32DDE2174D37BFBCB86CF618AA0D486EE46C5E1EA14A3BAE4952AF5D4837F9B8122A19D1E59B909ACEBA6C849C8B452CD6CEF877A65FD83E6D0C6EE35886688F1D877612CB8E671D83216A1F76693D6A4D6A2EC13EB6CA2005328B3C91F51B352A707EF8180F320D6E1685C1EF4D87E3CB77FA549BC12727E59C11BDF8A9631CC272998253028CECEE8A2914182B90F586D80E7ECE370979BDE683F37123090012AB9243A4C145D6349C2791DC44E54956C5E9B59FAD017D3EA27D85B48A896671A0AC14A73B5AB9145D8BA6AEBF9EA25AC2E8E2C4D16C5009A83D0E84CEB80E95DF2CEC4CBEFC7F5B90A84D408E8C4855F9AA2987D9FC9D8A451F32B367BB1DE5271ED35EA153B5D400A6D8050EE82F519BD930245A96C9727FD24D8B94DC53D4B4F00D03172CD6B7F2BE163B6D16FD6247B01988A6EE6CE7BFEAFF78E983B8DDFBA4242730E52B57876E3719D1F9F6CBCC81620F848D23C31E3FFF7EBF2AFE5011E6466B1889E7EF6281FAF8B18A012CEB96796FCA9B28E78335DFCB85BBEAFAEBB0FA75EE2D0D391CA97E05F0FE43475135B13613206A0D88438F17EC8E604B007AFDCB9FA1378B7CB96675E0B19DC6FB02508E05A7FDAAF09297A3884AA051B6389A52F921F8FF31970FB082DF554226C2613B80CC1ADFF770024D6BF011C0F028A012597AE56F36EB6B3E864D79639810B8BA7258B18192B5CAA80DEA4B140D3C6F1D707ACD2256D676AE90980BA80E10B44109211ABA830EE96E1BBD248315C804D391A86AB7D4B3A4A37FED90D9867DA4B93FC32E79403E5D78AE99AF1CD2ACCE65D4F3384D9CEAB71B1E93B99704C64CAF17B999234361E378B9362D14BE3FD9E6C268013CB1FA2EA8361749D635C0429F796EB15A685E31DFE7A76AE870EBA120331AC830F8C486F6C0C4F07B658EBB9274A463E0EEA101481DD6B58835A303ACE802AE79EBEF51ADD98A67B7FF7968815ACF4504B9D360F7C0120A00ABA1FC558E6CBD8324EC35E0985294563A8D7ECCCCD9E3D1557A09885770836ECCC7AEE0F18B81E30F85D695440B5BCE29945CBF60FF402B281942D38EA33A4B03E9FCBBBEFAAC2C455E8A03FF3F35154132C538EA16F0605EFB788C3CA8435F6D595F776433585094ABC75BA581EC59AF701F66DD6091623E4676D167 - -count = 81 -seed = 3D598F7C498D8A1095C40945975380554BEF6142578638A7627E2C0A21C59C579F8E8CDA309348FC54C764C899FB93E9 -mlen = 2706 -msg = 63EC08B711DDF5C66036A13F574BB7BE76445A1D1F83C7732B9F4C25FB9E799D4AFA55817BCB39B974AF92F3730767CE7D863B6A3406450DCBC5E0145D10B7D532DA6E80196157C38D1B6D3C173F74D67AD8DF24ECAD4D9B59921418863A38270B982C4392225EDD1845AED2199E2C38B36C7E0E5D2F3CC7F6803926D977C59ECDAC67CA290658E72BAD633358FCDDE2A4B9C40169A0C7CCCFDD93E4DA3C3838E9308533BD468A9128C5A141C4842840E45BC8E4610A7C5E7535834C5EC73312A50197C76AE984B3521883F549BE04E27D97580E6D85D0EE84CD0B8C65BFB1AA005C607DE82DA70021F8F90B7912C67DC5657E1882CFA6DA3DE1BA4ED823789C052649DEBC9085C74528162243133A6AE5C1C6BCA3F730525B167D816485E40C208AFFA8706E3D74631EB4413032730A7647548B77579323EB03D36C2EC37D2389D4A17305F607C78F3073A2F4B4395BBC94AF163ACBE3C990306BA3F89AF9AFFE785C3F6D102FB2BD55F0C1044034D6A871293B31A1B38E383CB926BAF3AB4B5F79A47E9FA7B77BCD58AA35A7F16DDD11FF642069A8A327DFA800049BABAAB4AFBEEC9FA98ADB9796FBEE925BB70EE9E96540436E1473E3AE4C56D7099D8DBDDE755A7E101BCCEB596B9415F52374C8A3A73EC66B229DFD8CD7EE7D2CF1C5E7F490C7D9381D9321B15F84F640017851ECED1DC80D32DA3A0A57ADC3EF37E021031866E278C7D51FF5CA8E9ECEA1082423B41D772C5ADC61A8C71C3D4CAAAA3433928D7931EE715875BDE2BFACAA0A7F799B45241C21BD2ECE4A5944FB6890BF24908DE58DD3C76173373254A36B0B2AC7D67926948CC0136DD9A5079D776C297FB6A585C290D5DAE1C45E91153299EEDB731E527F0F62E83C1E93C75FC74F9C7E63311562B0A55459A0D41E034C3AF637EB29BC789E5920DAADF265F42F2707DD1AD490B5F8A8D24A9968BFF11A0C364A779EC385A9A33EDB9CFC7DBC672BA60CE5F421B40634270B982D619F8E7960D32E1B8A76CECD13A3B0214DD34214CB5BB7FD530058D5DE1FB9E4E88ADCA05926CE1F5597100F55DCBF64D47FC177FF87C4BD9F6ED7670FA7B7D339EDCCE6FC1EAE069E0C303138689DDFD23396C145B79AFCF68125989C8477BFC318CDBD69D1AA6D3EE41F4B1F9BE4BE9FA58A072412078CB9196556EE56FB7B2A2761DD04120FCD9AE9736F599C8B96BF8F964B305530A6DF1F94874F36F07962F87ACC0B285EDA64D2E4857E26BED40E9A5DC0327F1D91259292C608D6C6D59804DC23A34D1F9F1B69331D68771E41542FC5D669CBC3CD7F8310F87E8FE8F6201E57B475DE2318EA6EF9F7D32A728A44334CC9DF28DF77038C37CBA62EA8CC5EE80E571879AD111F35B6A154FDF8D40FC93360D547D02F0743A37EBC4AF178C6CE36C92CE6B80B6350202D2978621684A19AFE1474155BB962014587B1F5A477092F42BC446D7811C0EB439A6829E538077ABBBF03F515F1E6AC018EFB05AF79069C2569D2CD7140C4B1B47886064DAC695D59FDE2D8FDDB35318D33EDAD94AD4FD988095B1156FD59551F0658EE666186369BFA84E30672E4659BFBF7963C377F0039E08DE2C2D9803FC12D97B5E67CE9536AF12DAEB3B9903D8D95F336FF53286284BFE8D7AD13EC21C2A9BA93C9A97BD7F6148DE7C8CB41CA75A9ECC8F9CC68D888FAF6B3E75376B5B16F41E7E6B76A686EB365365E2074FB1D7EFB1B285A2357B020FD3E47B89943FBC1596F3FA8289AD844386A691F33DAED4B7A6A6729526160F2D32BA7F68AE6678564FCA05BD811F208A8FA62F6731F23D46027008246FD4BF3C454A39EE225245E74DA5910E7937B36661548A55A2270A9D27114DDC94DD9B9D4122289DF0A5700222A977F15FD8E36AFA1C4870BD3CE9B658E2D83882AAC5F3DB814346240FF8C8FBA3F36E52AC9B441C76B6F104A0931BC45E202ADDCACCFB93A486A7734A6D82B9F6CA911448F988626846D413D987C5AC860FCC0D5F734269AEF88D41A055794DCE832BABB7E306F622E5EAEFDBE1CF195E320A1ACEB4834B3E70061EC2D624C12EB35B16E5AAE73053A3290D4BB1F51FFDF48C1A7218D365DB7FEC15BF0F710954CDEC54917600014BDE3A901DAB1DEC0844D7FF148EDED9788CC85C0CFF26E5895D91C56BA6950C0BA8FC6C773AB4A6091A5DE3AC335DDC2110EB0144FD89B3D815EF4A26F718C1ACB5723AF1DA5515442A03CFB9D90623FB21D78DAF441000E285E9E7C235C0F31E258E6B3FEAC048DB652B83E07848D2E9357649372B1A55975B2EC7FCFED19D0B6613BFDBB4B5B01A9AA3128AE137BDC1D8FFC3A38B597578042CF183BA8383C289C3D92F6B70AA9B3364E9FC5D43F3CD3F310D229912E91D5806C2A11E0BDD208A2AF438BE77B43680E2DE67918FD414338A763910E1316965BF96BBF7DF639266D075E90EE9C073011F6783750764FBE4906ECDD94EE9FB7E4AEDB23EE88EBFB018C44FC8BAFC66E6B454A3D0E332C7A6B34C2E8D1D26416FF43D768CC36CA9D3168355F1A281A6B2EAAEAC7B64AABBAD2156A1D781A78A896248C56F3491A5DDA8C22C231AA7AE14BD558F66E6280FA65F20B246D815BFF1D3C6CEE6DF9B4AA7F750307A7BF73850E6BCD22CA0AD74B4AFC13CD4AA2FB7E7B588ADB3A46A23EC88A34F13214B261A283AE8FBCE8007C6EF6BE255C33218AEBECD3EC27EDAFD252994B70BD67407620D26E8567F4C7F6D636803B6A27EACC3B853706A8D57ADBF7F7E142FF149C35119A6172D5884EDE7C71E6C34D1B485A684DD56C9D670576B75CACB870A68EA7FF2BB461D9E2FDBF500B2F200110265A3CF24370A3F480DA66F98FB5327B4CD796EAF0E559A5519F3C643B59E3B89D05D2A9F9DA6732CDC2996408B7FAB5A734310FCD73FA3FA5CACAF31AB04EC0B9734407C6DC575350212239AC9092DA5812137BFC40F7735BFDF9827F768FC0363FC8C5739C7DF828075EA2BBE6321D5A8EA2EB7E397C3D58A953C7F0BAA69A96AC8110B125EE2E9701F43EEB87FDF58A6E6266BE1136437599E26E8E6E853DBB6ED9DF3931C5F402FD09B7E203AB36EAA6EEAE72E908BD2B9CFD379BC9B407F0C882807BBD2E91F920EB24137002A48F1AAA0CBDF89FDE5C51079F1D8CF7A014207F1B40773321AD952D77CE18EC7B48F2CA054E65420C1132AB67C832EE22FFD8672803CCE3DE7E9FD0690E55FA1AF5F11611E3E2C71CED55E3E347F4CBEB9C93BEC2B98E48495585392471AF0AE589257ED8D01792112C798BCA5107030F207CE567594B8433490D8FF1811F21B03A42AD0678927183321355E3D6908DC1125CDCE038CD0469D72458B6CC5E67EB0D78C20819C6F3C4518B15CC63754FF8679915E329DD46FEAEFDA5249ED7E754E7BD55C75CB764B6CC36BC06267B2479CAFBB3F0BAE32A93558190B65C85DCDC080CD56D51D4105C5B0717691D4DB1893EF8AD550F55855B4123A38D18FD67B588A3A4C2A6604E874D721359352B235C17AB1DA2758712AF8179FF433211B93078735F909F985F557D0DE52CB9203DDC67BF9DC8632ACD8D4F90196AF6BD2E79834371C5E9FDF5992ADB04AEA186AF36F56271F763ACFFBF94DF4B0512CA6B7CA8FF486504E565BDA367E044FCD0F25FBC2A6C720867F95BFD92109780D2E6DD60CE90A4CA8EEB8C4CAB289DCF99E687B017B37695C3B99B4FE97D7E5D52BB9813C04D03C9AD71770FE0986C7F3A3FFD3A261AC771DE88C7ACDEF253E5CE2B50BC5C576D132B68CCC694BA883770B80F5ED7D527CEE816527F69CA2C101747A0088879C3663037DB5B -pk = B7B5B82CB9BBC97346FF6A22F50C9F8AEB366F067626E57E8D60C09B703F0C3782D1192AF0BB0BFA8CA36BB2C254AEA654BFC35E34145EC575C7A1A15C7D17007849B9A532964B6A8296AF206E6F056E5BF093D9814F5A91AB0F85E87EB7A22367BC232D4B5E2E2FE85CA03E8BAC905830AB4AA70F2321000564FE2E95930600 -sk = B7B5B82CB9BBC97346FF6A22F50C9F8AEB366F067626E57E8D60C09B703F0C3782D1192AF0BB0BFA8CA36BB2C254AEA654BFC35E34145EC575C7A1A15C7D17007849B9A532964B6A8296AF206E6F056E5BF093D9814F5A91AB0F85E87EB7A22367BC232D4B5E2E2FE85CA03E8BAC905830AB4AA70F2321000564FE2E959306000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000071BC22CFD3403D59412B0B14C65721710E600596C463D2E0998A837EE79908578AEA4847101AF45065FC27956FF3757BD2D41299A98B6F2CA1D6EC6162E310B104F840901A1A5805BE8E1B5837A41A2BCEA8051B7F2F39F120010000000000000054A886BA90DB528900C38FAF85B01F675705DD1D4F83DCAA62D3C0AABA20128FFA9ACE6B611DE7A35DFA96707FE2C1C98C08D8913DC57C61C7AF6EFD772EA82C0BE8DABA38C875A46F2CE053FF8A1579EC405070C79CC25C05F7FFFFFFFFFFFFFFC8BC6B1ECE945178B413B3588B4825145DEADA884D81E761A5472E0B1C686EDA4497CE11B6EFB819FC83E961B709A0F796DD0045B0122A8B68A8FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87476D7DD6073BEDA9BB9608BD5026B0C6A68F87879A218505EB28C3054D4249FD1064838EC5406A036ABD450D887327F17AC301CCE85658F8AE0200000000000000000000000000000000000000000000000000000000000000000000000000008B1C93B05E6829A2882E47280CBE8AF276FEBDF641322126C8DA90AB5D3B2C564D7FFC771F81C1CBAF441C5B4F51202CD7F751A46947AE8B74C4F59F79B302004D543244E7CE3232765C088D93D09487640554028895DC3C55143109883898561B84569DBF831626107CBF8E28921852C96E33EC707A5711564F0B063D7514009BA72E6D4A9664C0B3DAF6B0506F6F2FC94E3249FE90A185B1293DDDB4A822257B7E6D86C7672AA2383EF6BF1F9FD3B887D40778B5311344809D0294C85D1000383E1FA25FA154660C2C162C72A333BB7E1D5D1F0E7CAFE2CC7D2FF8C4BFB640353678E541D0D0FF5852AB9E88F7DE7002D11DF01E1EB009DED3F0A4467F0D007C52C4FB1D82CBA9780379728A136466287792F8A226A7FF633CBCD0F2987AAE1ADF89F31A2EF5F7C241FED319F45DA9EA9CCBC65A1ED93B3FB5C92D65DD0600943BAA503116A3E64E23AA255A620CFD6A1143F6D1A8E46F64454D9E8E255707B5C4ACB301D2CDC2D641771466670AA79AE83C672E28E3123B8829465142100021D8093C9EC93D642DFC59DE7F9F6A63C38C102B559CD6F916B7A294BB925B930002830DF56C6A4D4FA3EF125637A145AB2EF6159ECDC0F3FFFA2853771509008FBD6EA011F5D64A7FEE0C92D897334E14BE99BE724E6661BF05A8921D825165EAE1476BFB6B94905CE655A88F7FC0DFFE14DE2466AB6E99B34B662ED17106003F73A010772E8ACC29054330A7D5EFFE07E2996D2E2EA702CB2120C3875750085FA50F03459F4BA4B60A7F399580F21C7782674667A1ED6E20A3CC6877830900988CA6DDFA45F2A586AC7E3A6C2AA44AE3054237FA0852778F6EAE0812A4910557F4A50C07990CF54BD5CF609C99A71EDF0B5AE8C69ADA76CF16A5F429FA1A00FAF69BC72958A3D2406C86985893E3984E1E4396AEDE088F5D90A8D601B7D1D9135D876F41C280619E2DEE553F5679D6203F5725B686EB8830047B358236010097DDAB79FF9F5427595EF70AF0060A0BA2C625ECB1FDCE59F5C6FE1FDE0333D4ABDF7D68C17B72F7B773444C83A5B4684B0BAF9FA048312BFD4AE73744D708009712D107A337DA810CDC7B877451A30BFF6FF80C2D54B6D3DEA5DC84394DCC4F6026B949E7B78ED97870257DDB2D491E95A9E4D6AC0C9B956410D47007D52100636E6E68552F371E6A23AB877E9CF4BDD55784F7C0AF6462D6E011AB818E3F1C1450D6C3052CB34AFC9CA4B6E7E7955A2FEE36913A577B8086DAF77487CD1000 -smlen = 3041 -sm = F5AF168F1A7C3E8686EB4A6630A7107C077B0071CD740111D86CCBB97652A148BE80FFA861015281449086BAD5B45C928CA61B1BCF688D990117AF48CC9B575955FC7E2F1A6090DFCD119E00C7A2FDDE7D5196DAEABF63CCB3114320438B00EE4DC798BA65443CEB4135E1198D0FEB9E690096DC014E9F560415ED175AC8E21C27D2A86100A04B65337BA0DEFB8D1B0C17BF8D86879A7901762B2E1D1E76A2ADC75FA2D328CC7FE23E6601E3822CE99896BD88A0766CE4EE8627827E4701489A219DB7A287D6255960C714C30E86960C00ED14927BC2C4A31864658C08AD05A49AB6C2006035EA4D0865E73A26F64900FE841DF85228001C70C34A3458930BAA66EFDCB2C9F18482CC0001239D12D54431876E1209E6C77C26892E359838F45589D2D23C930B32835395CB02030698616D2134C6637A7EFF410AAC4B1087E4004BC28F28CE2AAFD44398806D0C560063EC08B711DDF5C66036A13F574BB7BE76445A1D1F83C7732B9F4C25FB9E799D4AFA55817BCB39B974AF92F3730767CE7D863B6A3406450DCBC5E0145D10B7D532DA6E80196157C38D1B6D3C173F74D67AD8DF24ECAD4D9B59921418863A38270B982C4392225EDD1845AED2199E2C38B36C7E0E5D2F3CC7F6803926D977C59ECDAC67CA290658E72BAD633358FCDDE2A4B9C40169A0C7CCCFDD93E4DA3C3838E9308533BD468A9128C5A141C4842840E45BC8E4610A7C5E7535834C5EC73312A50197C76AE984B3521883F549BE04E27D97580E6D85D0EE84CD0B8C65BFB1AA005C607DE82DA70021F8F90B7912C67DC5657E1882CFA6DA3DE1BA4ED823789C052649DEBC9085C74528162243133A6AE5C1C6BCA3F730525B167D816485E40C208AFFA8706E3D74631EB4413032730A7647548B77579323EB03D36C2EC37D2389D4A17305F607C78F3073A2F4B4395BBC94AF163ACBE3C990306BA3F89AF9AFFE785C3F6D102FB2BD55F0C1044034D6A871293B31A1B38E383CB926BAF3AB4B5F79A47E9FA7B77BCD58AA35A7F16DDD11FF642069A8A327DFA800049BABAAB4AFBEEC9FA98ADB9796FBEE925BB70EE9E96540436E1473E3AE4C56D7099D8DBDDE755A7E101BCCEB596B9415F52374C8A3A73EC66B229DFD8CD7EE7D2CF1C5E7F490C7D9381D9321B15F84F640017851ECED1DC80D32DA3A0A57ADC3EF37E021031866E278C7D51FF5CA8E9ECEA1082423B41D772C5ADC61A8C71C3D4CAAAA3433928D7931EE715875BDE2BFACAA0A7F799B45241C21BD2ECE4A5944FB6890BF24908DE58DD3C76173373254A36B0B2AC7D67926948CC0136DD9A5079D776C297FB6A585C290D5DAE1C45E91153299EEDB731E527F0F62E83C1E93C75FC74F9C7E63311562B0A55459A0D41E034C3AF637EB29BC789E5920DAADF265F42F2707DD1AD490B5F8A8D24A9968BFF11A0C364A779EC385A9A33EDB9CFC7DBC672BA60CE5F421B40634270B982D619F8E7960D32E1B8A76CECD13A3B0214DD34214CB5BB7FD530058D5DE1FB9E4E88ADCA05926CE1F5597100F55DCBF64D47FC177FF87C4BD9F6ED7670FA7B7D339EDCCE6FC1EAE069E0C303138689DDFD23396C145B79AFCF68125989C8477BFC318CDBD69D1AA6D3EE41F4B1F9BE4BE9FA58A072412078CB9196556EE56FB7B2A2761DD04120FCD9AE9736F599C8B96BF8F964B305530A6DF1F94874F36F07962F87ACC0B285EDA64D2E4857E26BED40E9A5DC0327F1D91259292C608D6C6D59804DC23A34D1F9F1B69331D68771E41542FC5D669CBC3CD7F8310F87E8FE8F6201E57B475DE2318EA6EF9F7D32A728A44334CC9DF28DF77038C37CBA62EA8CC5EE80E571879AD111F35B6A154FDF8D40FC93360D547D02F0743A37EBC4AF178C6CE36C92CE6B80B6350202D2978621684A19AFE1474155BB962014587B1F5A477092F42BC446D7811C0EB439A6829E538077ABBBF03F515F1E6AC018EFB05AF79069C2569D2CD7140C4B1B47886064DAC695D59FDE2D8FDDB35318D33EDAD94AD4FD988095B1156FD59551F0658EE666186369BFA84E30672E4659BFBF7963C377F0039E08DE2C2D9803FC12D97B5E67CE9536AF12DAEB3B9903D8D95F336FF53286284BFE8D7AD13EC21C2A9BA93C9A97BD7F6148DE7C8CB41CA75A9ECC8F9CC68D888FAF6B3E75376B5B16F41E7E6B76A686EB365365E2074FB1D7EFB1B285A2357B020FD3E47B89943FBC1596F3FA8289AD844386A691F33DAED4B7A6A6729526160F2D32BA7F68AE6678564FCA05BD811F208A8FA62F6731F23D46027008246FD4BF3C454A39EE225245E74DA5910E7937B36661548A55A2270A9D27114DDC94DD9B9D4122289DF0A5700222A977F15FD8E36AFA1C4870BD3CE9B658E2D83882AAC5F3DB814346240FF8C8FBA3F36E52AC9B441C76B6F104A0931BC45E202ADDCACCFB93A486A7734A6D82B9F6CA911448F988626846D413D987C5AC860FCC0D5F734269AEF88D41A055794DCE832BABB7E306F622E5EAEFDBE1CF195E320A1ACEB4834B3E70061EC2D624C12EB35B16E5AAE73053A3290D4BB1F51FFDF48C1A7218D365DB7FEC15BF0F710954CDEC54917600014BDE3A901DAB1DEC0844D7FF148EDED9788CC85C0CFF26E5895D91C56BA6950C0BA8FC6C773AB4A6091A5DE3AC335DDC2110EB0144FD89B3D815EF4A26F718C1ACB5723AF1DA5515442A03CFB9D90623FB21D78DAF441000E285E9E7C235C0F31E258E6B3FEAC048DB652B83E07848D2E9357649372B1A55975B2EC7FCFED19D0B6613BFDBB4B5B01A9AA3128AE137BDC1D8FFC3A38B597578042CF183BA8383C289C3D92F6B70AA9B3364E9FC5D43F3CD3F310D229912E91D5806C2A11E0BDD208A2AF438BE77B43680E2DE67918FD414338A763910E1316965BF96BBF7DF639266D075E90EE9C073011F6783750764FBE4906ECDD94EE9FB7E4AEDB23EE88EBFB018C44FC8BAFC66E6B454A3D0E332C7A6B34C2E8D1D26416FF43D768CC36CA9D3168355F1A281A6B2EAAEAC7B64AABBAD2156A1D781A78A896248C56F3491A5DDA8C22C231AA7AE14BD558F66E6280FA65F20B246D815BFF1D3C6CEE6DF9B4AA7F750307A7BF73850E6BCD22CA0AD74B4AFC13CD4AA2FB7E7B588ADB3A46A23EC88A34F13214B261A283AE8FBCE8007C6EF6BE255C33218AEBECD3EC27EDAFD252994B70BD67407620D26E8567F4C7F6D636803B6A27EACC3B853706A8D57ADBF7F7E142FF149C35119A6172D5884EDE7C71E6C34D1B485A684DD56C9D670576B75CACB870A68EA7FF2BB461D9E2FDBF500B2F200110265A3CF24370A3F480DA66F98FB5327B4CD796EAF0E559A5519F3C643B59E3B89D05D2A9F9DA6732CDC2996408B7FAB5A734310FCD73FA3FA5CACAF31AB04EC0B9734407C6DC575350212239AC9092DA5812137BFC40F7735BFDF9827F768FC0363FC8C5739C7DF828075EA2BBE6321D5A8EA2EB7E397C3D58A953C7F0BAA69A96AC8110B125EE2E9701F43EEB87FDF58A6E6266BE1136437599E26E8E6E853DBB6ED9DF3931C5F402FD09B7E203AB36EAA6EEAE72E908BD2B9CFD379BC9B407F0C882807BBD2E91F920EB24137002A48F1AAA0CBDF89FDE5C51079F1D8CF7A014207F1B40773321AD952D77CE18EC7B48F2CA054E65420C1132AB67C832EE22FFD8672803CCE3DE7E9FD0690E55FA1AF5F11611E3E2C71CED55E3E347F4CBEB9C93BEC2B98E48495585392471AF0AE589257ED8D01792112C798BCA5107030F207CE567594B8433490D8FF1811F21B03A42AD0678927183321355E3D6908DC1125CDCE038CD0469D72458B6CC5E67EB0D78C20819C6F3C4518B15CC63754FF8679915E329DD46FEAEFDA5249ED7E754E7BD55C75CB764B6CC36BC06267B2479CAFBB3F0BAE32A93558190B65C85DCDC080CD56D51D4105C5B0717691D4DB1893EF8AD550F55855B4123A38D18FD67B588A3A4C2A6604E874D721359352B235C17AB1DA2758712AF8179FF433211B93078735F909F985F557D0DE52CB9203DDC67BF9DC8632ACD8D4F90196AF6BD2E79834371C5E9FDF5992ADB04AEA186AF36F56271F763ACFFBF94DF4B0512CA6B7CA8FF486504E565BDA367E044FCD0F25FBC2A6C720867F95BFD92109780D2E6DD60CE90A4CA8EEB8C4CAB289DCF99E687B017B37695C3B99B4FE97D7E5D52BB9813C04D03C9AD71770FE0986C7F3A3FFD3A261AC771DE88C7ACDEF253E5CE2B50BC5C576D132B68CCC694BA883770B80F5ED7D527CEE816527F69CA2C101747A0088879C3663037DB5B - -count = 82 -seed = 6CDB757AD36DF99E52F535C2680431D5FF36C812D8EA19399F666F2FDD66D3A842A7A5AE1038359AB618FA58A0A6E840 -mlen = 2739 -msg = 7785A08A3892C97D5EBFE52475298BA444674086D63E17E1FAEC96F6B10723447FC1B8CC758D1724A33E26518798183A4B3C99A7DA54038B86473DFAB8E626EB3BF54DE5581E04450B2821F5020C466505990B173DB9F030CFCFA505AA04B37CF0A063876843A042F17AEB1728787187428F8D1010D532C94C7AB2E1193994BFF0CB56415FCD2A96BE7F7FC2C57C8313E795367A22B6A17CE3B803083A74FDBCF030D91C957128099D6199686F2BEA618CEE111AA9D55A6F9E8966C102D849ADE596A1B576924DE0E92DD91FBB01CD93E24AA71EEF219A78430D84965672FE6AF091D46DCFA9AB906F6240913C1286EE0A152666ECFE2C154CD3FB14DC0F9C173E30FC9958A75AA6DD74822AF7ACAD243FDFB743E47E48280990C2870904EF1C902261D0BD6BCFDA91412BDEE9A28C628F218E7648AA0027D918B48EF30A9B18390331805C6739BF6A2CB69A0DE8766A7B3A448910D181F6449565A363430BA1C0FA8B11E1A151F6CEFA3870C3B1D8CD800983EBD41B48C5624269EFB440DF23FF9BCB31A4B02F6505DC862B2103F76137FC6560F893577BC3FCE92ADA27F291305F2345AC82A846854F172131B042735D4B76C6AB2DCFD32BB6258B23AC790AF2AF7624451172FA7A29E0C5FDB3DC3B719B274B2838FF7A8B25F272AC8EA90FA3C8010AC7F65633EB43FF7A0A95CE99717F35D3C416B0E0DA30470B5AA20EB9E2B66315B9407A4753DF8BF505B8066C5D57EC4CCDD2236B9C58BD7337925191ED7B75B92C9CEE626F13EADDECB07173C8160540FB9F6A4D43A1E9AB263B300C08966C247514647DFAB3B420202529E963A51F8D23BD0F689BBC4D67D5A603B876E8CD3EC0770F0D9694DFC30083991CF3989DB1812B4AC5452358075534190F012F7C0E47734C3BA748E04910783C0B845484461DCEA67A1EC731354B902557486B484F67183FC711D10F906C68CD01F46481D040F084271DD784E5B958AE05B65BF5D207EFBB5FDEB25366D6FF4161CA3A1CB71B2B9F90F86A315D800935AC0086D85D907A036C4333EA347000A0755550B68FE3DD7686E416483781B563680146697D6FAE8333C24ADC8A2436852DDADF6061E2B16FD3829C0B55C2E9C2C89F64CB8DA02A6706498CF0330742083E9AC4593A1762D32DC4E6CC2D9F4310014FB15DEBBEA324EBC2EA1E1660782559B9B39FBCF34C85FDA9AD350D195AD7587AAB621EF7FFB63277CE35AB43B01977C9F8DD6C2AE7B34FA7B35D5FA37D8B3719E736F18734CB3A2468BE9CA0832DDE0B958925A377FE6751C4EB8FF1AD295355302F0A5ED4E8F8C33FD5162542B8ED7CD985DBE3C84401830F6A7EB9D955EC74C7F98B02388B4E1353317CDB5EADAAC9025038CC01F8655C7FB9AEE940FC4B282748B39D277A7FEF462038833A9A8EB50A8719F68B3E858825911F294A80FAEDE9D4C1815844C2632DD20387950003DAB80B1A58E541A5E6658AF7D4CDD91FD1C08735B584F5C69C5CA94F6B7F97A4761B127DB394AC72E902DB9EB4B3E0B884C448FF2763FF9ADD530753263688CF92BB746181C17294BFFC2A0B3969A7BBA429A481C425B24745CEAD66286F5DF04F1E4421C56ACAA668E87BA58E3B07A062D1DA60CC6B411667BDE6F466B72C9169965BC7781DA78A818F779A9B3D7A577F71A1DF49AAC865A0D6F2668CFD2C77CFA8D306A14DBBDE4D3A3818B07DC89D5F51E117F7BFD007D60F32BB1B6BB01E76862398371FB91E0A3D4B39FD9146C47F627A066618CF83C32E5C82592B418BD2F5DCD8D42234625974F988A6F729C60BA5EAF18C77B611DFB187A581E3A10268A965F650FE242CE2FE08AA71515B59A6EDFC9CBDAE22DF3AEB22E773CC2EB373619E9CDA23C236CA3F7845C2136E93849D9F6AA1477F4513358CD8CB4E21444C9E5709818801EADFCA23F2C23DDFD5B4EBB6089DAEDD14A21EBF3F7A8C1C80BBF7D37973BD156AC5C4462D29DCCB7EEFFA22A8B6CE433B600532F33999ADC39196F01230614767285089FB262D8469DC66D24AE0B77FD05C3EC02FBC5EE328319409B8E2D7B0AC6801C1C8BA86F793C2037C71E2A25F114E9EE0EDB3B83076EABFDAFEDEFA0548DAE91E62CB7C29C03413235B8C6EB9F46BE29DE8F5D30E8D97DB6F45687DC4719B1024E48B7DFFD0D2B474B2032B4E69B6382E603D4777F3450E2E467C6D9AB2782C0AE266C320D36BF67BD6B86EA9721B22741684D9C0CCC774335430071A5410C1E34B4BC1A823A93A38F5AB4781CC593B13A593867FB634C0C705107CD278C6CCEE6D842748BFBD2FFD205C6BDFB3AC87F693C25C832C86D96B00BBA0AF88DCFBC8CA4328765DE27FBF1389C4EDE28317BD0EE447F030990E957D223A5EC66CED9D16400AF6DA8663C4E4111B4584F8F0066CDF8258D90C5D7B439503E3AB3FCC55FDF933E06D704416187AAF86E6C39695DEA8B8189EC1299670BE03B6A636889CB7F10F04CCD67278E77886CF3F6E2A05BA8D25AB8664EA817642ACF5DB4D9B3EF80E169463EDB6BFDF67172E88D233609B091BBD085B970DB8AE0DAA5048CA42D6A54042F42445BAB03F9BF1ACCEF341B7349109BA0073D3715A9073AD9BED258268AEE9DD5202E0EDFA5720A317EA5CB41706C0D235465BECDC8E3FF0D628EE5EEA6AAF1BBD3E18FE9217516893DF115E979C4CFFEC494988B6F9B86026610898C44AB1547C5F8ED5CBF3C3A837DDB6A444BD3E803E1824E6AB931310FE86B36587F1B34B0B48D358F4B97E9774213DE7D92571380BE2199E703119C5B9836DADFC826B71D588250AC37DE0EC05C5823573C102BCE44C9F044507671C4E1723950A3C0E14968CBABBFEEB049EB723DB9B23CDF0273525C29CC5165530A1F1CF830D3551DD6BDED53954947D5C334DC9C71907CDBFA109EBC52D6305477C14159257AF8C51C6F09D76FC0085C3D969EC60FB09145E66A8A7489611DB3FDEFC35202B8AAE82D3CDF666034BEFF49FE49A45C5EC438F4118F338545532CED916DE78E3BF82B4E55907474386B9C172F393EFE895334F7323CBB2AA7CE7718BEF5E7A23AF734BD4963FBC7889AA5C50F3955B904B5E577D71B21A293D766865E3F8C212DE5EA084A9D22748A8009A7D1858328A1BDF7BA0F4E3B83BE9707629252B3339CEF796696855A574B4A4896CA68C3D6A6824E3F593069EC0A571E61282F8A29BEB8BD788F7B351A8939CDAD9E257587A77804F2704F49DB3305514B85B449AEE56EE40CB2A75D51690194284AACD0855B02893F8DCD3091629DC548705A1085E5CC33DE7726A0F521C149003DF380ABDAE96BCDA55C44BF9BFA1103150F049563E848A8750625DCFDD9BFE02E1E57489B5B3AA28BEAA80F4DAA562DEABB4BB6A27125369415885020D237A92CCC3A23593FE2183225BFA2FF39B0BEF9CB0425375E256BCD572175483F713BD38F937F2B3D4C1F686C5AF60061E0B05CC3EBAAB0AE8BA21E47A8318BEE4A01516046363D152936A1344E17A65E08030522EC667233145A56001B8D065DC2FED0D2A9F02C981A8962F984916314805DAB644A5112CAA1564895121D8B1FD046F547BE282CF979752883EC79AF70CF59A88D960F3336F0AE61357877AAAA34699A876144B65CA5B77A684D850D09B3D42CDBFC4539EA103F8377CFE5F9E5432403FAB416662C4C83226191EEB7F82B01E0819C081FC40E7B978669C7856067E8B582832DD0B92588103C2616BA2C7774C46840318CA2B1A3798FF7ED9FEC087F01798EA2445B92E67E2446126A7406E82FF8D3711311BE16E9171531A95C966E6BEFEA34938E6F5FA660F7C7CB533A119377F1D26AE6AE51D805AB96A64C8B80D6EE137F634B384C2E377 -pk = 3FB1CA61164F8D7615B64536975D5B0FDEA8702BB68DF9FDFC42FD545579D52D46619F10A2C095128129C42F4F5DD61EC0C9BF039EC4B9B19C69D47A80C80E00EF06997575AC4906A993081CE246564FCEB590FA1F8F0A61A12D2BD3DFB33251ABCF8472C358B852CA4A037A71EDF42E2EEAD527AD372B35E566749023F01C00 -sk = 3FB1CA61164F8D7615B64536975D5B0FDEA8702BB68DF9FDFC42FD545579D52D46619F10A2C095128129C42F4F5DD61EC0C9BF039EC4B9B19C69D47A80C80E00EF06997575AC4906A993081CE246564FCEB590FA1F8F0A61A12D2BD3DFB33251ABCF8472C358B852CA4A037A71EDF42E2EEAD527AD372B35E566749023F01C0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E8EFB4E236129FC4D8B1F8DB1C93CA708C2173A1E3B81380D7EB50999DB101A92E2058A2EBBFB6948BE6D3CF7AEF020D2997825D5A65D9F960194AA4324B082235F7A942169C111D6BE9215D3F243CFDA41DA3B1834F70F9260B00000000000000A10056B570506C6AB7F96321E3805DE2295182BB861C2DD0F9BC318EE22E49011875241B75A57C44306018434AFA611DE6DC0530A854117154D087D4FDFEF62B0D8B1F610050AEC3F090E9EE91486D0925864B840871A724B8FDFFFFFFFFFFFFFF5F5921357069B061E7B5ED5F56CFAF8FF0A7C765356962CEB4CAA26206194B37EB83D58E24FF47DB7BB39C19234C159E37851963827B42CCFAB6FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8083CBF8CC5F132081AFF8BE7E1CE4933476BDF49E4D34C7339BEF79E27BF967EC07BB73428E06E0C35FA401F052E797895746F3D834D4804BF010000000000000000000000000000000000000000000000000000000000000000000000000000D1F854666A8BEFDE403BA67DB3E28CEEAFF0936B6B7A88EC14F50365161F692AEBB73D023D508C9D59D5376BBE261925197BC73FAE0DB5F213EDE798553E2300C3B2DAA57E68D05AC991295DE83027FDCA11B3F1D3A09C3B02393E5E21D1187C180755B13757E8C9161A6A178A941DC82495F948E575F1668037CF29F23A0D00A40CC57D5750653FD2CC967A5E1606D95A12DC62389081EB63BF0D5DCE6DCE4C0C56FABA8A7FFA79E173EAAB306EF4E4F04061CD8CCEDD77365264CD4CB31E00CBA8E4A4D8D4B051AAF552825A9CEB1A85EFEDD1D3A062D287C57B3E3A58E143B8869CBFE7250FF900293540DE0495731980CA5B7F01F7277D8A66C733481900E50388143565DE47D948335DE66D6960F3FDE17700124AF4BE3BD8D1EA4C82A6EA93C8A70665307A3634F3AEFD23E92A48634F2CBDAD9FF74CC1B47558E904008E1B7C3F7D45DBA6CDB2D950D125A718F876BEC884C2B4373519AB25364FF8ACA416017513DD6E31B0C9550F5F129A6FD67F38D7BB6C9CFAFCE78E3D9015170075D60EF14F1380EE87919FE3BEB62657BC0E738547C44F2F95BEB59A2145242386500070567FB4F4E18E6BB117022AD91D11E7CF2127199BB180001EBD4A0100FCCA3DE311C7035755AE7F16FFCD75DBDBB8E9E8EAB327C4B7F11DAA1CF44F65485B36F3222E3B0C6953AC370D63704009101A871347AF27F7C690E88B3D1E00116914E2999DAB528DA69837A5A6F08CC90BFC0A7562BFBB4335E5574D0785F5B9472DE8884E3063A1A203D674A9D2F8DFFAB7E0EFFFC44F86139E8F84BD2100F59A842558681B6FB41CCD49F0871A292FB2D7F4063B928D736BDB2A6F9D90956E100BC5D1FCC2ECCFD153C46D76B552115204DD0C8AC25F18500620084C0800A5A8CE0DFA67E0B6D1879A0523BD6E8C9A891CE563DEFA12C405FC0CF0744AE442C9FB7DCF268891A748F1EC974BFF488EB770DBAC5002EC78B4FF1C87011B00097238897E9A0783A7E0AB319B0CF6D7BA9C3EE4EF54E8299919C674B398AA61A7705B32551FBDC56771BD5FCDCE2E91EE5FC06C4EC2B10735EA8817D3ED1E00D1DBCADAD90BD08DE06AC09F1385C2A31529822D840371823D218203BD333E67B8AFD3771FA420B195D635ACA448BA89A8D29013616102CCE100F126F00013001A706A000225FE0626FC6446EF591EBDA79E9D6ECF08FF28CA21DA4AEADECD6C3EDA3FB7156B62F66DF219C028FFFD8F79F1DABC65BAE54BF2AC89C387E02100 -smlen = 3074 -sm = 0B1D50AC8BA2C49B4E0D2EFFD8A20ACD1ACB009D7AC42A2CF0304381EE528354C1AFB26FD000436EB478D9B4913C7C5711E03D510454ADE4017A4F23C363573AB1F72AA44B85A23224F8A501AF287CF2A597F4B7763AE957132E5BEF186F007EB9158C9BE201E349346AACF0E7DC0C3E0200DE92169194587DACB375D575634CE1FCA52D010E1ED1400B48CFE32F75A5FD9229663A013C01E91D31190447C7A03C3D82F0A8FE5CE3EA490100B5060D4913A45A07F96E3BAC655EA056A101E3F5348B97814D85AADF764F5EE9BB7101AB013539AC36100880D6F14685FA162225EC8FA800ADD35AA9018AC7642BDCD9F7E32DBE7DE6DB0164565F96E5F7ABD6903BE40AE273C5BD3D830101F949EB9259FCE73EF9F1276B2AE0A71DEAE1041E76FBC833949DF8928E198A29040206A9A91857CBD5E3F0777AF6F01D79AA553001071535FA2EA765EA9331554F912A047785A08A3892C97D5EBFE52475298BA444674086D63E17E1FAEC96F6B10723447FC1B8CC758D1724A33E26518798183A4B3C99A7DA54038B86473DFAB8E626EB3BF54DE5581E04450B2821F5020C466505990B173DB9F030CFCFA505AA04B37CF0A063876843A042F17AEB1728787187428F8D1010D532C94C7AB2E1193994BFF0CB56415FCD2A96BE7F7FC2C57C8313E795367A22B6A17CE3B803083A74FDBCF030D91C957128099D6199686F2BEA618CEE111AA9D55A6F9E8966C102D849ADE596A1B576924DE0E92DD91FBB01CD93E24AA71EEF219A78430D84965672FE6AF091D46DCFA9AB906F6240913C1286EE0A152666ECFE2C154CD3FB14DC0F9C173E30FC9958A75AA6DD74822AF7ACAD243FDFB743E47E48280990C2870904EF1C902261D0BD6BCFDA91412BDEE9A28C628F218E7648AA0027D918B48EF30A9B18390331805C6739BF6A2CB69A0DE8766A7B3A448910D181F6449565A363430BA1C0FA8B11E1A151F6CEFA3870C3B1D8CD800983EBD41B48C5624269EFB440DF23FF9BCB31A4B02F6505DC862B2103F76137FC6560F893577BC3FCE92ADA27F291305F2345AC82A846854F172131B042735D4B76C6AB2DCFD32BB6258B23AC790AF2AF7624451172FA7A29E0C5FDB3DC3B719B274B2838FF7A8B25F272AC8EA90FA3C8010AC7F65633EB43FF7A0A95CE99717F35D3C416B0E0DA30470B5AA20EB9E2B66315B9407A4753DF8BF505B8066C5D57EC4CCDD2236B9C58BD7337925191ED7B75B92C9CEE626F13EADDECB07173C8160540FB9F6A4D43A1E9AB263B300C08966C247514647DFAB3B420202529E963A51F8D23BD0F689BBC4D67D5A603B876E8CD3EC0770F0D9694DFC30083991CF3989DB1812B4AC5452358075534190F012F7C0E47734C3BA748E04910783C0B845484461DCEA67A1EC731354B902557486B484F67183FC711D10F906C68CD01F46481D040F084271DD784E5B958AE05B65BF5D207EFBB5FDEB25366D6FF4161CA3A1CB71B2B9F90F86A315D800935AC0086D85D907A036C4333EA347000A0755550B68FE3DD7686E416483781B563680146697D6FAE8333C24ADC8A2436852DDADF6061E2B16FD3829C0B55C2E9C2C89F64CB8DA02A6706498CF0330742083E9AC4593A1762D32DC4E6CC2D9F4310014FB15DEBBEA324EBC2EA1E1660782559B9B39FBCF34C85FDA9AD350D195AD7587AAB621EF7FFB63277CE35AB43B01977C9F8DD6C2AE7B34FA7B35D5FA37D8B3719E736F18734CB3A2468BE9CA0832DDE0B958925A377FE6751C4EB8FF1AD295355302F0A5ED4E8F8C33FD5162542B8ED7CD985DBE3C84401830F6A7EB9D955EC74C7F98B02388B4E1353317CDB5EADAAC9025038CC01F8655C7FB9AEE940FC4B282748B39D277A7FEF462038833A9A8EB50A8719F68B3E858825911F294A80FAEDE9D4C1815844C2632DD20387950003DAB80B1A58E541A5E6658AF7D4CDD91FD1C08735B584F5C69C5CA94F6B7F97A4761B127DB394AC72E902DB9EB4B3E0B884C448FF2763FF9ADD530753263688CF92BB746181C17294BFFC2A0B3969A7BBA429A481C425B24745CEAD66286F5DF04F1E4421C56ACAA668E87BA58E3B07A062D1DA60CC6B411667BDE6F466B72C9169965BC7781DA78A818F779A9B3D7A577F71A1DF49AAC865A0D6F2668CFD2C77CFA8D306A14DBBDE4D3A3818B07DC89D5F51E117F7BFD007D60F32BB1B6BB01E76862398371FB91E0A3D4B39FD9146C47F627A066618CF83C32E5C82592B418BD2F5DCD8D42234625974F988A6F729C60BA5EAF18C77B611DFB187A581E3A10268A965F650FE242CE2FE08AA71515B59A6EDFC9CBDAE22DF3AEB22E773CC2EB373619E9CDA23C236CA3F7845C2136E93849D9F6AA1477F4513358CD8CB4E21444C9E5709818801EADFCA23F2C23DDFD5B4EBB6089DAEDD14A21EBF3F7A8C1C80BBF7D37973BD156AC5C4462D29DCCB7EEFFA22A8B6CE433B600532F33999ADC39196F01230614767285089FB262D8469DC66D24AE0B77FD05C3EC02FBC5EE328319409B8E2D7B0AC6801C1C8BA86F793C2037C71E2A25F114E9EE0EDB3B83076EABFDAFEDEFA0548DAE91E62CB7C29C03413235B8C6EB9F46BE29DE8F5D30E8D97DB6F45687DC4719B1024E48B7DFFD0D2B474B2032B4E69B6382E603D4777F3450E2E467C6D9AB2782C0AE266C320D36BF67BD6B86EA9721B22741684D9C0CCC774335430071A5410C1E34B4BC1A823A93A38F5AB4781CC593B13A593867FB634C0C705107CD278C6CCEE6D842748BFBD2FFD205C6BDFB3AC87F693C25C832C86D96B00BBA0AF88DCFBC8CA4328765DE27FBF1389C4EDE28317BD0EE447F030990E957D223A5EC66CED9D16400AF6DA8663C4E4111B4584F8F0066CDF8258D90C5D7B439503E3AB3FCC55FDF933E06D704416187AAF86E6C39695DEA8B8189EC1299670BE03B6A636889CB7F10F04CCD67278E77886CF3F6E2A05BA8D25AB8664EA817642ACF5DB4D9B3EF80E169463EDB6BFDF67172E88D233609B091BBD085B970DB8AE0DAA5048CA42D6A54042F42445BAB03F9BF1ACCEF341B7349109BA0073D3715A9073AD9BED258268AEE9DD5202E0EDFA5720A317EA5CB41706C0D235465BECDC8E3FF0D628EE5EEA6AAF1BBD3E18FE9217516893DF115E979C4CFFEC494988B6F9B86026610898C44AB1547C5F8ED5CBF3C3A837DDB6A444BD3E803E1824E6AB931310FE86B36587F1B34B0B48D358F4B97E9774213DE7D92571380BE2199E703119C5B9836DADFC826B71D588250AC37DE0EC05C5823573C102BCE44C9F044507671C4E1723950A3C0E14968CBABBFEEB049EB723DB9B23CDF0273525C29CC5165530A1F1CF830D3551DD6BDED53954947D5C334DC9C71907CDBFA109EBC52D6305477C14159257AF8C51C6F09D76FC0085C3D969EC60FB09145E66A8A7489611DB3FDEFC35202B8AAE82D3CDF666034BEFF49FE49A45C5EC438F4118F338545532CED916DE78E3BF82B4E55907474386B9C172F393EFE895334F7323CBB2AA7CE7718BEF5E7A23AF734BD4963FBC7889AA5C50F3955B904B5E577D71B21A293D766865E3F8C212DE5EA084A9D22748A8009A7D1858328A1BDF7BA0F4E3B83BE9707629252B3339CEF796696855A574B4A4896CA68C3D6A6824E3F593069EC0A571E61282F8A29BEB8BD788F7B351A8939CDAD9E257587A77804F2704F49DB3305514B85B449AEE56EE40CB2A75D51690194284AACD0855B02893F8DCD3091629DC548705A1085E5CC33DE7726A0F521C149003DF380ABDAE96BCDA55C44BF9BFA1103150F049563E848A8750625DCFDD9BFE02E1E57489B5B3AA28BEAA80F4DAA562DEABB4BB6A27125369415885020D237A92CCC3A23593FE2183225BFA2FF39B0BEF9CB0425375E256BCD572175483F713BD38F937F2B3D4C1F686C5AF60061E0B05CC3EBAAB0AE8BA21E47A8318BEE4A01516046363D152936A1344E17A65E08030522EC667233145A56001B8D065DC2FED0D2A9F02C981A8962F984916314805DAB644A5112CAA1564895121D8B1FD046F547BE282CF979752883EC79AF70CF59A88D960F3336F0AE61357877AAAA34699A876144B65CA5B77A684D850D09B3D42CDBFC4539EA103F8377CFE5F9E5432403FAB416662C4C83226191EEB7F82B01E0819C081FC40E7B978669C7856067E8B582832DD0B92588103C2616BA2C7774C46840318CA2B1A3798FF7ED9FEC087F01798EA2445B92E67E2446126A7406E82FF8D3711311BE16E9171531A95C966E6BEFEA34938E6F5FA660F7C7CB533A119377F1D26AE6AE51D805AB96A64C8B80D6EE137F634B384C2E377 - -count = 83 -seed = A97269579EB70D268C58D94FF744329B197F722A8A407B788510DDCACA34C8CD4C72FFC14B76300C86AEA1E4CFA66BA4 -mlen = 2772 -msg = AE3DDE9E33719040345DF8EA7E4C0B5E2CBC5CB80B34FDDB959E2DA1D67D74D2FBE5AAB07C6357A9F3E5F6EF5379B4C75008E9077A1EB025F9023FE32FCD9076C8D2B291D0BECF2DC624F9E752B1EEA2CF0755FC9D4B2E4320DFD042C68577D58E61DAD075BC1C3931ABA78B473C0726ED495150D6A11A81DBBD1C840F5F1FAACD54E3470E0D994DEACA7E6E324A9FB4E581AB447A4EA026DA3DC3C7E6AD55E88CB841E069ECA63404CACE0E3D4C8B9CEC33BFF6AA6341AA1EB69AD799C6CCE358CA94555287D01B0192B1B49EB6F705E54FBC86465C4BA70134AFC9A53C1C3A732E21B010002B49B7CC6F5237B794BC1D1F1E30A7F1EB95D195D5F26B46A704F77F80B092117EDE1C340622FF32302DCA7E7E43C2A4D8852CB508403B1AA8ACA27A86936350264811550DFEF05D72542C74D6243AB9D259202295A63F54C836CBF610E40EB85E9704041A51BF68578B10F7985C752DC35788E7B7754358082AFEC9E4B271D36974EB90A46F7D703B0CCE941C3CD072A88F931A4FFD098634BE0921D089E46637F88F9625B7DF900A276B4BB75FC75921C8A8B6668DF9946290E11FCE4565A76D39D8FA55F324253FFBBF81536581621DEE664A9E9E4F4FCD3A9765706B8EA833125A825B1CB30314B7C6C78B301638EAD4311932FD4611D78572180EE441648F8BFAB869874611C153FEEFF88A45F7A98206D0B2D97CB7EC2144F045225AF5A9925AE7FD3DB017E37259B7A2FF6C66820DDAAC5651B2EC2E5767DDBBE18256B1D0D0F96CF5EE04266B8ADB29B0AC5D55B73E1ECA8FE724EE174B76EA1C0A54896E2BB565075F1669D3CCA171657B66F343A634F4250287F853B52182B9BE50DF29021673DB1841ACA45E7263DCE653F0DD84338E49FF5C6E3BB42F1A3C7164704A2A000149114D36BB9231606EDA06C712A904C1E323C4AA3EEE0BCE6062A9CB956E004407014ADB58EEABF486B38570955C30F2B5C28179F86CD5FFD603CD441A1FB06519368886BFF9C2C127ABD079346D762E51C311F196D5F825B45EDDD4A48C7C2123E10A3D369D772750987EDB96968C59441FB2F47F8E33FA4CED3006766C06BB6B339ED94B8FE57B20D96F1A27A61966289D8FF5072FD11D7EE53DEFE0014A11667D0A6C988BD16629FB53F269130B22A13AABA2E9F70DCC93D3BF6E611EFB006BA585FB8E8720357E25DF69C6DF388FAC792F87CCE801FA49A8CBEAD1698C11B82C4F85FDB4D52A2A808483DCA7334295BB3B2658AAC18857878730831622124F5A254A464DE459F3528C5194220E5BB1779C8F5E3866B0D60931A1A47502D99E2B186785658DEF57ABA676626F9CCAAAF449609B07AF7B57C78FA5BD06B2AD2927AB491EE461A94AC37A079D9BFA02203B09F7EF180C1C1C430518FF2D3F2A3582EAEB6668060A2B544E973E8A2B88733A902A0A80F8E4F30AC5D0223C1076482EB2CA5AE67039597514A4866061D5FBDD99694A060D0D0EE43A1B7290FFD7D796A9F1A2142DB6E0F154ABA8720396B6DE939E668447C81CC828FF9D2A014FE001CA718C1D6ACF4C08BC7796D344A29FD8913E4CE71E986C46BB66C2610FA797C9E1639DF423C338D7192638F621D83A6802E72E38BEE3AAB064FB606962329997FE908597E7407CEF098D4591E5E6011CACA701994E4ACF572F7C91057D3DA06058A7DFFD3248EE3333208BFF27473E6F1EA3914C5B2056AECD7AEE07F8DD26B3C2B8B9656EA4260D38E8D5F23C925A4476754240D0702C5859AEC2329E1CC3E426BD7665B2A4EE2E75B41B561FCE79690F64D1068DD35A294A8E8CB43A6AAA901109F0E09D985B6E323C30A017E75BF01D0AAA739102C1A6667ED48E60DD4499EAB862851558DFD17229878F5BEF0CC29FD19F59835579F3CDD4F85684E0D46D9618A205DE3B29B0BFA5FBB36745B989211E2BA711527D32CBB5E35830DF4549FEA652377EBBAC6D52787F9EBC3CB687EBB641BF51D3E22E98FCA48F99584FB1F3BED3F97F33EBF656C5795055268F49985CEA00819A07B8F4B0ECD7BEDA95EAF11E3498FA7AA414C54C38A08A841B012AE91763BE911DAEF803E2CA385C9D4CDC642A0B343DB6534C10D9E1755B7B2DE543AFE1D3C90981A7BD907E9CB14367243D9FDCAA8776AEE5F65ED6DC02F633BCF9F57DAE39E8E8261DC10029DF7B7124BEB67DD753B36892481EA7CC54DDC3A60EF8D4DCEC4D5796DDE0E7453BBF0FD93FCACE97CE5048D75ED1F34B69A392E1734E262B2B2A1E246331A373B5CF1FEE7BB46096C76349B0F19BE63FE539DCD33A8450BE894C2DC21BEFF0DE6A841A533F4C9949289037D161BB97DCE31CDFF4C1E0AE36B4192594DEC3B021E8F3D5B500C244CB122974F8CADF125DE0CF832A920DEC3A6F7150585D0209651B0FAAE0F74A36FC8779115B96136805DDD4F6F3A69C06AF472F369F481359FF834A0FD2F9AE899EA36B9B061B63D07C1D4ED7A373ACC40EAD808564B05FB0C6E656A80FA3865AABE483848D14D1DFD66D7AB1F353642EE3417869DA21622F6AF551659D07E6C827C18EA36E2C5E806A9571A7B05BBC1BA283A8984BFABC555AACAEAB2453573F782A4087F0F903AF34596E83282A2E54773AC33543BD353A3F855BC46810930C3635A9B70BA7FFBEEA95A129CCF9E9538EB11E119A072F806130D831AF7E57D332AC889D7D9E6BBD1C65D64E089722F6954F126E64EA939D98084D434EE74B55C549BED21D11264F8B5E023277DB52B03D7B8A8E75B12B11D62052E474E435707272D72D00D92288CEDDCD1ABF8E63A8A9963A48B54F492487B309F69CD90C9FF54B9C5A55CD2BAD4A2E0A6B00B188FD6C527A8184BB63670BF626A995815810CC0F280131F5F652EC20609C7D3B910E4168FE273626BF0E2CBF05BC9CCD178AD91BC25CDF178B387DFF0B6B40A46FDB6C975349B6CD8AD103CDC5DAB8D09D9A5B55622E74564C1E789C5C185CAC04FA0ED6065B9CCADB1D5DC80E90AB244CE1AAC516B346ADAEBAF7A030D66FB90FD070ED062A41E0B70BEE3B07F1C03887DE5F79D70F9955B25B8C8201602784EF8A60147260D1BDE8E152E8D3F992CB8255ADACE9D5DD2E9C856C47537742094190AA867459D20989DB11841AE44824979C0A2093D7EDCAA13C9DE25E6EECBC5124055F17466467E123E39034502BA966CEA873997EE25E52DE2DBBA874DC9AC222B49967B7BEDB5C81BE09827CAB782F458795B2903D72AB16F4423964F82DC69C138EEFA3273BC10376939E544964150D9DF09E14BE08CFCA06C10BB2C315B1B676C40762F8209C0EF13CFE5FAD76CFC17FE462D8330F78BAB072C5465F7A26D047FEC4BD3B918C9C761B91B02D820ED7EF345E79A66FBA61AE13D3050A27488CBDBE693B800F1E76C188EBD8118C9432EB9E7124D35A1A038D237918F1DB83304D10AB5DEDF58C6951A92AAB1A1A40E180254E730EB43B566A83CC71FB6B9749BFCD3A90B964966CAE90FAD7406A8A89B1E48C885BFE2DB41C1996F20DC9A8DFCBA1A6F2F307EF8FBA5EEAE9631C2D6328D90F17679DD9E8E9660D6BD4C8A1D79C47A5FD46BD2ACCACA2D5C6407B0F7F31D093CEEF0342C67DDE3F1BA5067ED1500DC45161B8636255924BF007C4C870990C5DCE098C5A26386AD84D0F0CE4860349A147A4E7AB80151FA63882590B91C6AD3E70A68E6FEC1A2CF65881A6DC38048FC14DE71C702C934C5D3C4CF4C474F906C3400364BC400A7DA087F94F1ACCB68439A9A6FFA8C6439B2CC5C0B17A7D649033798429F211D9DE12B24D117583E1C425C2C0348C625CC44E9B976D319E72D4E09D5D6F36EE243F5FBCB190E84DE56EB680DEC8566F5A2C7D5F595116C628CA09401D561BD78356C634419225FB01CB637C46A627F6026D39EC1C62E9A3E85FAE -pk = 5F33C770A74A92C811B6586D77DAE889483D1011ECEDC70D1454C73BF6E21ED15E77DBE7D337E180BB094442EF2901A11CFE36124435D490D58BCC3A9EB707003B930C6D23C11369D5D06F4756D839D3BFDA72BAAD5756A3C814DB240123C960A3F4748CB05B00784D77FE64A0F31C6A45F79F40DC164C630FEA086DAC951500 -sk = 5F33C770A74A92C811B6586D77DAE889483D1011ECEDC70D1454C73BF6E21ED15E77DBE7D337E180BB094442EF2901A11CFE36124435D490D58BCC3A9EB707003B930C6D23C11369D5D06F4756D839D3BFDA72BAAD5756A3C814DB240123C960A3F4748CB05B00784D77FE64A0F31C6A45F79F40DC164C630FEA086DAC9515000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061A110E587BCB41D67B933E38D668EB3D4B58A1DE1A1386AC2EAAE49D58E7D1C8FCF66D8BE368B6A73B3C313BA62B7EDD141AB9A366F3CBE7666DD98E986E562C1AEFDB69577AB3BB1198A0FE6BA31846ADD1D606581AFCDE8020000000000000002D6A6DF9D5D840AD3672AD954AD945FC8B77128E603B09D3BFF06BC0A3F4B2DC7FF468E4A660D8C01006E7BEE7904249B77020842B0E297FFD1DC253569896AD7120CAC2231F4981DBC02B19EB2AF7302308E43765810B384F6FFFFFFFFFFFFFFC26F5EB6BAC58F2ADCFD86DA256E1B2BCF8B57B77E33D1F912E323E6C2FFE61D7A294882A92D3AA1CB5FEBA7637E81BD1E138233320127AC40990000000000000000000000000000000000000000000000000000000000000000000000000000001FEA422A4BB1E67E56C9DF3EC50D2B2B0D4A7DE03843108A4B6C2F481965680781E33644C4CE95EE93B49D13DEE38CC78AB4A819814DAB81166A0300000000000000000000000000000000000000000000000000000000000000000000000000007EDBCC8A388329CCC2A402AB396BBE6FD54A954A72B6020AE2777655DE71A05FB3B38FBA0DCDED70C86D644C852933FB09EFAFAFDE64EBEC615D51CF501D0C00674746819EB5EA8BE118CF4EA01A8C691AAAB2AD990D758D832239B9DEA2AD6D8D12006F8E464BAE270A1BA9E8315BC5A0AEFE8D342E05B9644FCA87EFE904000F9A0C2FEF8B46EFAB98AD1B13D031CEBE5E4246F329EF5BEC59259F9B8649276B612ADAB6E38516E9BC0D3C5CE3D638F8BA6FE82231EA89D3C59A1CCC951C008FE0B64AC5F535C92D35404D7A25829F66B0A4FEC8DD62E38A6330308C1FF217A0A08141ABAB3DB21DDFBFA26E7E01DCD3F6EDE0CD2DC305FB92973BA96404005FBAA2D1FAFEC8268632E010DA8EB01A91D2E2C79436FBA39D3A32FD1DDA531F37798CBA3D970F195DD516B01748B906ECECDCA222858331C8DDE9AF5FE322002D786453DF1E1235B925D7A5D6791AA44D41DAA46007A60CDC14337982ED80F084619AD4561EED3D734AE2375F6267928B710BE393FB32CA1BD2270C5D381600E9030C2FB71A3A1AC65A1674A976427B5D29CC6250600518E3FE93E9BB55E3379B437039ACC90D6775A942A1BC5F8C371A749642BDFCC5EE07FED72C029A2300156B6563DBDBA4C8D1BFFDCBB4B00FDA2C764BCBD3F555B916E4A612DBEB00B2A9492C02C7745F60D7446AAA437BCBA37412A71ED6F8DE1BED70B7CAF1110200F650E0E1EB3046FC2B9C30929B03F7DF1E7BC5673CC4F1DE96F6967CE98951D755725E07511A053EC2BE492B522FD4B1D7FB3047353159A2BD46B851DC7E0C00EB41D20373FD3D78B396D9E4658D6E7381D3A7AF57F2AF44BE11B2A4F8E5D08547113E2903C2D599A60B4D9A9B2E8F14A93510ADB011DE34448B227940381F004984190BC537F65DD82B65F48725BC3A1D357EF7D90ACAF959D8584526EBD7FA8A6AC437AE0455BA78BEBABDFF9B9EF11C62A1F2FC16F6BB2BC98C95FE420A00B5C08A09CCDC7C4B9E262EED41445930B8D96E65A21814E794B874BF7F8E53F732FF1C5A207BF78671D72BBC6910D19125EBF2E737306A89EF1D09E23D77110078B849564F87B5014FEF9C8FDF2BFCA54C817819A9B2DEB2232B5C31847F2B0876648E46A8924A1EAAEF39C744E0AD84DAC0BB57B4C7526118522D5E34D119002C95302E3C395574FF7A00F1496BACE4E64EC00E899ED8DB0A5EFABCABA2306236FFE463B15458AF39F3ECAEFB648C08C16AEE419A4718BB070BCE5CA6781F00 -smlen = 3107 -sm = DADBDA7727763291D8A8BF8050687A308CB8004E9AF3BD76D317E57B135A9F2390BA2BC87A00D29BAD392EDB033D319CD525C96CE56D37F6018CAD07C08AD3D6EABB6E092974ACD06BFE9400B7F1D80C1A62413C63040B14EA7158B935BB00D1E6A495F5BA29772C6BE4B108EEE6C8A8AF00FAE8D37D2E7C7728DBD0327899422BE2D63D0134993C615F4868C247779588BE977718A10D018C35258EDADF99C0551D54FA94A27E2C7D3D00031BBAAAE23F5176CD118F8DF77BC63700F50168C1725909B7B5FCB5FE36B20CD683E740B601B94D832EB031017B6658B1D5801E6C1841E2003268D5FC7345010240CB6C4B0871AF7CB6A60083CB38C8AE2B2E6A75C65C7BBE7B1B3AE88801016B66912110B0681C0A43BC25BE50B6E1139735290B4DFF7D894EF0C00C16149904030C73114AD15BA0DAAADA532F386008E69BA3015C98892BD1417AFA3EE14D29BCE603AE3DDE9E33719040345DF8EA7E4C0B5E2CBC5CB80B34FDDB959E2DA1D67D74D2FBE5AAB07C6357A9F3E5F6EF5379B4C75008E9077A1EB025F9023FE32FCD9076C8D2B291D0BECF2DC624F9E752B1EEA2CF0755FC9D4B2E4320DFD042C68577D58E61DAD075BC1C3931ABA78B473C0726ED495150D6A11A81DBBD1C840F5F1FAACD54E3470E0D994DEACA7E6E324A9FB4E581AB447A4EA026DA3DC3C7E6AD55E88CB841E069ECA63404CACE0E3D4C8B9CEC33BFF6AA6341AA1EB69AD799C6CCE358CA94555287D01B0192B1B49EB6F705E54FBC86465C4BA70134AFC9A53C1C3A732E21B010002B49B7CC6F5237B794BC1D1F1E30A7F1EB95D195D5F26B46A704F77F80B092117EDE1C340622FF32302DCA7E7E43C2A4D8852CB508403B1AA8ACA27A86936350264811550DFEF05D72542C74D6243AB9D259202295A63F54C836CBF610E40EB85E9704041A51BF68578B10F7985C752DC35788E7B7754358082AFEC9E4B271D36974EB90A46F7D703B0CCE941C3CD072A88F931A4FFD098634BE0921D089E46637F88F9625B7DF900A276B4BB75FC75921C8A8B6668DF9946290E11FCE4565A76D39D8FA55F324253FFBBF81536581621DEE664A9E9E4F4FCD3A9765706B8EA833125A825B1CB30314B7C6C78B301638EAD4311932FD4611D78572180EE441648F8BFAB869874611C153FEEFF88A45F7A98206D0B2D97CB7EC2144F045225AF5A9925AE7FD3DB017E37259B7A2FF6C66820DDAAC5651B2EC2E5767DDBBE18256B1D0D0F96CF5EE04266B8ADB29B0AC5D55B73E1ECA8FE724EE174B76EA1C0A54896E2BB565075F1669D3CCA171657B66F343A634F4250287F853B52182B9BE50DF29021673DB1841ACA45E7263DCE653F0DD84338E49FF5C6E3BB42F1A3C7164704A2A000149114D36BB9231606EDA06C712A904C1E323C4AA3EEE0BCE6062A9CB956E004407014ADB58EEABF486B38570955C30F2B5C28179F86CD5FFD603CD441A1FB06519368886BFF9C2C127ABD079346D762E51C311F196D5F825B45EDDD4A48C7C2123E10A3D369D772750987EDB96968C59441FB2F47F8E33FA4CED3006766C06BB6B339ED94B8FE57B20D96F1A27A61966289D8FF5072FD11D7EE53DEFE0014A11667D0A6C988BD16629FB53F269130B22A13AABA2E9F70DCC93D3BF6E611EFB006BA585FB8E8720357E25DF69C6DF388FAC792F87CCE801FA49A8CBEAD1698C11B82C4F85FDB4D52A2A808483DCA7334295BB3B2658AAC18857878730831622124F5A254A464DE459F3528C5194220E5BB1779C8F5E3866B0D60931A1A47502D99E2B186785658DEF57ABA676626F9CCAAAF449609B07AF7B57C78FA5BD06B2AD2927AB491EE461A94AC37A079D9BFA02203B09F7EF180C1C1C430518FF2D3F2A3582EAEB6668060A2B544E973E8A2B88733A902A0A80F8E4F30AC5D0223C1076482EB2CA5AE67039597514A4866061D5FBDD99694A060D0D0EE43A1B7290FFD7D796A9F1A2142DB6E0F154ABA8720396B6DE939E668447C81CC828FF9D2A014FE001CA718C1D6ACF4C08BC7796D344A29FD8913E4CE71E986C46BB66C2610FA797C9E1639DF423C338D7192638F621D83A6802E72E38BEE3AAB064FB606962329997FE908597E7407CEF098D4591E5E6011CACA701994E4ACF572F7C91057D3DA06058A7DFFD3248EE3333208BFF27473E6F1EA3914C5B2056AECD7AEE07F8DD26B3C2B8B9656EA4260D38E8D5F23C925A4476754240D0702C5859AEC2329E1CC3E426BD7665B2A4EE2E75B41B561FCE79690F64D1068DD35A294A8E8CB43A6AAA901109F0E09D985B6E323C30A017E75BF01D0AAA739102C1A6667ED48E60DD4499EAB862851558DFD17229878F5BEF0CC29FD19F59835579F3CDD4F85684E0D46D9618A205DE3B29B0BFA5FBB36745B989211E2BA711527D32CBB5E35830DF4549FEA652377EBBAC6D52787F9EBC3CB687EBB641BF51D3E22E98FCA48F99584FB1F3BED3F97F33EBF656C5795055268F49985CEA00819A07B8F4B0ECD7BEDA95EAF11E3498FA7AA414C54C38A08A841B012AE91763BE911DAEF803E2CA385C9D4CDC642A0B343DB6534C10D9E1755B7B2DE543AFE1D3C90981A7BD907E9CB14367243D9FDCAA8776AEE5F65ED6DC02F633BCF9F57DAE39E8E8261DC10029DF7B7124BEB67DD753B36892481EA7CC54DDC3A60EF8D4DCEC4D5796DDE0E7453BBF0FD93FCACE97CE5048D75ED1F34B69A392E1734E262B2B2A1E246331A373B5CF1FEE7BB46096C76349B0F19BE63FE539DCD33A8450BE894C2DC21BEFF0DE6A841A533F4C9949289037D161BB97DCE31CDFF4C1E0AE36B4192594DEC3B021E8F3D5B500C244CB122974F8CADF125DE0CF832A920DEC3A6F7150585D0209651B0FAAE0F74A36FC8779115B96136805DDD4F6F3A69C06AF472F369F481359FF834A0FD2F9AE899EA36B9B061B63D07C1D4ED7A373ACC40EAD808564B05FB0C6E656A80FA3865AABE483848D14D1DFD66D7AB1F353642EE3417869DA21622F6AF551659D07E6C827C18EA36E2C5E806A9571A7B05BBC1BA283A8984BFABC555AACAEAB2453573F782A4087F0F903AF34596E83282A2E54773AC33543BD353A3F855BC46810930C3635A9B70BA7FFBEEA95A129CCF9E9538EB11E119A072F806130D831AF7E57D332AC889D7D9E6BBD1C65D64E089722F6954F126E64EA939D98084D434EE74B55C549BED21D11264F8B5E023277DB52B03D7B8A8E75B12B11D62052E474E435707272D72D00D92288CEDDCD1ABF8E63A8A9963A48B54F492487B309F69CD90C9FF54B9C5A55CD2BAD4A2E0A6B00B188FD6C527A8184BB63670BF626A995815810CC0F280131F5F652EC20609C7D3B910E4168FE273626BF0E2CBF05BC9CCD178AD91BC25CDF178B387DFF0B6B40A46FDB6C975349B6CD8AD103CDC5DAB8D09D9A5B55622E74564C1E789C5C185CAC04FA0ED6065B9CCADB1D5DC80E90AB244CE1AAC516B346ADAEBAF7A030D66FB90FD070ED062A41E0B70BEE3B07F1C03887DE5F79D70F9955B25B8C8201602784EF8A60147260D1BDE8E152E8D3F992CB8255ADACE9D5DD2E9C856C47537742094190AA867459D20989DB11841AE44824979C0A2093D7EDCAA13C9DE25E6EECBC5124055F17466467E123E39034502BA966CEA873997EE25E52DE2DBBA874DC9AC222B49967B7BEDB5C81BE09827CAB782F458795B2903D72AB16F4423964F82DC69C138EEFA3273BC10376939E544964150D9DF09E14BE08CFCA06C10BB2C315B1B676C40762F8209C0EF13CFE5FAD76CFC17FE462D8330F78BAB072C5465F7A26D047FEC4BD3B918C9C761B91B02D820ED7EF345E79A66FBA61AE13D3050A27488CBDBE693B800F1E76C188EBD8118C9432EB9E7124D35A1A038D237918F1DB83304D10AB5DEDF58C6951A92AAB1A1A40E180254E730EB43B566A83CC71FB6B9749BFCD3A90B964966CAE90FAD7406A8A89B1E48C885BFE2DB41C1996F20DC9A8DFCBA1A6F2F307EF8FBA5EEAE9631C2D6328D90F17679DD9E8E9660D6BD4C8A1D79C47A5FD46BD2ACCACA2D5C6407B0F7F31D093CEEF0342C67DDE3F1BA5067ED1500DC45161B8636255924BF007C4C870990C5DCE098C5A26386AD84D0F0CE4860349A147A4E7AB80151FA63882590B91C6AD3E70A68E6FEC1A2CF65881A6DC38048FC14DE71C702C934C5D3C4CF4C474F906C3400364BC400A7DA087F94F1ACCB68439A9A6FFA8C6439B2CC5C0B17A7D649033798429F211D9DE12B24D117583E1C425C2C0348C625CC44E9B976D319E72D4E09D5D6F36EE243F5FBCB190E84DE56EB680DEC8566F5A2C7D5F595116C628CA09401D561BD78356C634419225FB01CB637C46A627F6026D39EC1C62E9A3E85FAE - -count = 84 -seed = 483A81716F91A43ACA6764C4BD2A57C9156B762E9174EA49730A6BEB9CB19A0B3755E37BA47EC524BBE2FA25B9FEF687 -mlen = 2805 -msg = A7E941D3C14E2DDB4F971C9955868ACA753A73E8EC6845ED6E9D3B444C826480F03AC771F92E94380BCA7E50303FB79CBA608E351A1A67BF217B9816E2AF9F89BE8A79F661470CA16BFB2C99EFDE97859AD1D217848289EAF543005F5C231599FF74299EC2A7C737FF94B7465DE11F80E17D4FDA264DE568D8767CE822B3AB9642D95BC89533CE05FB331B86E3C5A296E4EA4C637EA458BCED1F89355C0270D083D4920E72112CA1ED486191748B4F730ED52F9803D05A0F2F065BE03B2603D6CDB154DD7765847D656B919B08969E41B23F9D376135BD5D924529410392ACEB004849550E6CF2903181C9A395FD469B7DE2C5060ED22922AA4D7C782A33330714A0AF206B29B4FCBE0F12C18948F6634FFD7F2710138020E273CB0DFA735BDCDE9BD6CEC898C5E564EC71AA7880D97CC711412F28603DE293CD5E904E9156D4F6BFE2BE15347B9FF7848EB51CD0785D6A649EA3514E02695C7E3C4F021A9992D67BEA1D68E5B17DB2E0DC061CCB5ABABA49D110055467F9DEE61ABA8F3E5C713E94A8A96C3A8AFB698887C1FA4ABC5157CED33A834DBF0F5AF9EECBB5F2AD7B63B4C2CA94A117C2B92F3D51900926E26B101FBE6207AB0884CBFCB15F9F98F95B0D08E29390977F4D3DC710EEA3AE7433D5EA87A5F710F1FCEAB26D516FC19FD272F6B0F01EE167F06E6C33273481F280CA64FDA0549C8DB884FDD467B93998360766D4CAC4C8DE783752FB6C6D7B1E47DF23CEECA572F2AD3E2B628E31984B9054448ED1D90658BC658A9CAEC0485512CE084A535E7C8196B8BBCA5D26C105C41E083F8D56F1530A8C1B36A7F3E41FCCBAC7F342B2D026064B304444192D4873FC57978E44151896EA6C0F13D017F683B203BA1DE677ED00F2B737C4C69E53ECF16AB918939E120E9FE14B2243EFF0116B24C6654BE09C582F1E62E75EFD8593E62E45AC36F717815B854B47A4DDCFC91FC533FA85BCECB6E560CF11E46D2F334B396D68B275E7404A70F2A805A64CD458A8E5F114A89124BA1866F917749FF32E59EE71948BD97F2D4128BEAB8BB0B6B06D84C6D466BFA30FD8100E48D951D0B3E787EF9611A56FFD64D970DBACFB1B4DF064B1CB5DA9918F5C58A10F0903B64286B1C1AE5CBD00EB8B363BDD7A7AAF2111C0C6E86E15ABF6C1E761FBF027425968CDC19522B44FF3F56335C59760FAE6D9028E76B284330F7510F2B55B6F46ADF90311CC785D35C2BB49272BE514CFBBD7A2B7B2E8C0B6DC28CB683D3D581F547F83BBD3B8C7B76925E44E6DA89D5EEF17AB0BF4213EF9C05B7B473901D483C647F416B98478C7100919C28515B617A27321841BAA174C1A2D3494395294CEBD48EEA14BC3106CA9C69D9F6485D6ABF1C2B1111A8BC602454685CA61AB4EE4DB9F413CAF8F0F204F04D40CD36FA5DAB629CB53876DB3E16372E626B6BC892C63C6B6C503C9D22EFE113927395206BDAA4B83D4FEF4FEB42FA7A71F7CE2197FE282A02D0FE50F96B1F917A67E50EB79CD3FFEF064542F7BEB51AB05B56AFD7AEA5F4164CC9BA37D8FDB35A3DEACF0CFB555161E7E41EB798160798BE9D01E3DE0C4288E0BAB19AE398E94353ADBE9A43524ACE35830B82FCFD4B1DC2800CA4C38A56B7CD28BC3E2F69A0AC4655CD79B5789A2B72EAF93B018D4D6F4C983D08932B22C85AF6FB07DF0A786D98820E1B06BC17F62D6E39739790A13049252F1B9102DC692CEB20C270FFE9B902AB7EC5A4EAAF47F7E2D31B2195F5F48AD18D099C33384141DA14E151BA57F6B1BB97901457202CDB83B5C713BD8A13F6E3E276C7D6C130AE287CA8931D9EECE06AB7CCA124D6D02D497D55EA9151A95E8A4DCCDA72D3F51A7DB3F2879918753683B01BA1B154DA83E6D84DDC9492F2DD8C128A30C75174ED1A6B8D93D08645270BDE247782E882418EA158B2A2153B2D8F75C09932F324EC199D26E9F3C4C4CECD807367E3981E137858B98BD1268D2C894541EC99BBBAD19A6856EA16A1E56B7B193BAF79AB89D4E76327405658C4ECB5A8626302B3A4618AEAC7E11A1199C4BB08C60AD78FEA4827B59CC883B2CA7038D7845106DE9174B2B8C17267273D23418AF560265000543ED9886884912B4160FBD372FCDF706EF642CF1829493884B6CFE946ECF6140106DCBE11B3746E33FBD4B5852B732230B9047004F4FAFA0D4BD7043C7D6595ACCD1B2771AAA76FE05A0C80B7B221DBEF79950FC69147816CAD0E52C05E72CECCF55FB4DABD81ECDB476417DBFDAF3B555CC90573CBED9474266C89FC55FF0BCC55602A51A1B5F91E425A1A58DCD4ABD09BBC63933FB4279B9E21298F9FE0CF1A93C4A19695240E8978D604047ABC7239F5053EA650D781307C50DEC4D5E2360ADEB9AA02C0F6FEC5784784A271169CE456E1C32BF984C3323656CCC588C97E0ECE5A40FC7B4DDBDDDB764EDC512DE63270F07891BD160F78B8ECD3A4D11EC4C68EA0A0FBD0F23AF9AB261A110F431F926C4995B05462E0DABF29D9660ABBC660C9A675628270CEA7EC5AE9B6F298B17B2392263700B8EAD9C845AD29CCF109A2ED66ED5BAF9C935754AAA1B84BE2B5339F9BF3CF5E80AF16967863FA8DCA64F5FE873DA4A6D33E39A592749B721FEC203C0CAC527CA96DE7A96CE9A540F5DA1902C97F960A05EBF0C32934F9B81244C945A60FD3F176DD8C261690D8EC98D19607129A50EDD51135FFBAEBC04A0961ACC5A32FD058FFDF2C6866BF90A3E177787E7061BD2011EC08EC118EF0451CAD010B53C68D0BDDC701D10920D697EA3439B1A0F96E6256B7712F59C746D1C74C20B17D461C3DF635EEC83E3B8E098034F119B9D9A79ADA735158EAC3F434E805444D5EA2EC85CC8ED8F5BCCAB7DBB6ECFC2E385781579AF1263D9FD32BEE32E01DB94703B5C756B894DEF19783B12BCE2A1A8D29D96F329CB0791D697BE7E0F05DD5C9DADA52E1B8C1E5F75A0FC90ED8C05BDFF86644B1EE61989CAAA271061D4222818C894AE9ECA2DA7326E5C24CA1EEEBE3720D2127BA997B0C572AE30615F8BC4278057F4762D46A39B934DDB2A0903FE1568C1BCC6C37E1F7C145EB7CB20A6A4B3466A7ABA58B48BE94F7E14CD20C87B2768358D06E3F607FE5E9DD1AAA8477975660F1E379B9EA26CC00CEA8CFD6420F2FDC7EE6393AA17CEF88645B821F8F42FC7DD97B0E16C04631F86ECF1CB76A6502FD1C13917CEB26A83596B117D5336387DDBEA56162E8A5BF2FA35E697245BC7210CEC13BFA694AE884582924168BF8EE2F61A734E37876F363225E5AE19B7C65CA6AFC31C8B37BCCB308A9C27F3E9902DE365E288E6CC46E329E78BE914B85EB980C0BAD932C164671ED395D5D8317C133E2E000A10E0D20D0F408019B33D9A87ED7725EA4C5ABAD67E0CAFBFF31DD236E59DEFAB7FF2CB40F479B56B261A32656F016DECA5302A336CA15D10E0AFCD168A4B922B79C11CB21881220374492D64DF21453B41346A85174A0A4A3C1E973845C856CA70D6D25BB854D0C6BD3C75CD73998C7F64E35A58DCF593C85C2440A6ABA4E470F87E6F9B4ABE127B30F8992D8AAD0BE38F008D9D937582EB3AAFC68F516D5AAF2503ACC96E59A151D2D4B072AB6B38C54928D6656441C709F1C1B770CE6EFCECE11F8B3602EAB63E0C629BBD8A79A96BE4CDB072780F3D287B091FC94FF2C0D347FE280BBAC308644BDB15A3C653863EDD945AF0AE725507507B82C283DC9909CCACBCF357D7A19703401B6E4474B94A6CBAE575B942501A281B8166FDC70E6B4B60C2F57A4D66FE1197D301D0E0C7BEC12CEDF9496BCA2183D04632711A79C8374B6DE35C2EECB0239391C2019C720894BC7A635DF18FCEEB9AAE16B3CE92717E2C56903D20D0712EF80131B8C48635163E97EFB1FABD1500D061C93AD935BE9A65A45A92E4A4E885268E712EFBE5337214701BAAD4C73E81E73BFF19AF131F0ABA105BAABE849F -pk = 9AE0691595EA64C576C9CE0B508D670E359F4C3FF84D3265513F60DF6F148377BB7890275252E30F21438CEC2C7A3EB1830CC1EB7AA0DB627F8B63DE692620009B6CB304FFBAD6991C87041A4F0F66D23C097571712E127CFB7A1FFF39A3AF130AB36DB0D0436F3D8C8D90A2F24A8A99859EBD3475AEF547DD525FEFCDEA1600 -sk = 9AE0691595EA64C576C9CE0B508D670E359F4C3FF84D3265513F60DF6F148377BB7890275252E30F21438CEC2C7A3EB1830CC1EB7AA0DB627F8B63DE692620009B6CB304FFBAD6991C87041A4F0F66D23C097571712E127CFB7A1FFF39A3AF130AB36DB0D0436F3D8C8D90A2F24A8A99859EBD3475AEF547DD525FEFCDEA1600020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FA288B7456F999984F3A6637072EBA5B85B391607098C859DDD30D6FC2254EA4732879817E92AE1E3DAB081FFF81B0C233DE1D53CFA42E1459735DE994CBC0EDE64C50495D07348008F85BCF31FDD7D38CC2DFE5FC38ACF1B0400000000000000F6A7D9886AC8FB300272194F64A7703801FF9CC6F3010148DC966D21F8E7DF7BC9158DBEB0A8704515B6B495CDFCBF81F393B59B466FD34BFD77EDD292C4C35AEAE20A08013EFC1C3478CFF3E6F2711F89A45610A1C1BE3D5AF2FFFFFFFFFFFFFFFEF02C37B102806049868760306239F89D9A76D2FC3F6B59EFE9E35297F6666DAE2E9423DCC7A43E72942FB03EE9EEE2FA45A3BEBA802167CEE1010000000000000000000000000000000000000000000000000000000000000000000000000000A15EEF321DE921F33ACA63FC4727CB3D4E88BFBA0183C2C06498C4CCEF114133634FA2DCC81E3A4A02F018CD7E38B964F5ED121112386DB7853D0400000000000000000000000000000000000000000000000000000000000000000000000000009616E6A4CF40222D523582F0B957C59CC3D91F885AC898FECAD4D8685E11758E6B5586E1047A8273E596C5499AB6A7C043FD489B2318A7D860C69A06C1D307002D7EE555325EA7E29AFF6A73D96A93F196EA91AADF13EF6B91485EAFBAFB21201D6311C1CDF0F10E1ED73FA2CBFB96F2A2B2E8556BDC27800D8CF2B2A0BC1C003B82042E4B97CD517F0D430C19B1215EC8A211EF9237B1411E3CA0C57ACA04860809FAAA41EC960C28BCC5129D3BA125511B9CF748B19B3692A8B2D37F740C00098D3E20A574C7D684ED99280D9B1BCC9657C5D480151DE2FF053262381DAB9843B8A7B8CD5E2EB676A1FEC1FB431CBF80EADCD3978405BB82D4207E26881000B7141509CF2B3F718EE3D7ACDF74F8B40B2F24874627E1EDDD0B28E7240E9BD3040E92CADAD2E9216D486AB883BFFAD458E600959FFF96F27C3F0C75DC2112007CB506C2767AA50C8409EE0D6375367685F2135644A64D5CC76C3BB8C95CCB09265B7B83C6E6F453118169C84F08F2833D5F5C240E59FF77469443E0F0240C00A7557D657EBD9002195338EA78D181A288157F3F9E096E8A7EF8E1132078C9F7EE7A4254711F24FA3047ED3E5BF619329FD7278ED8B4BE88FC40205C21A31F007D6FD5EBB7A732D9C125BCCB06BF5A696633BA486C7945FC15346F7480AD6803BD18E0250C08F33256867FDE5A37D4A451E82A2AF495694A575C41AB28A51800465FB24D823846CE945115DCA61556F0601C4084C970C7C183A99857B327DA502C76DB19A5CECED3FAE492E9EB02AA21C8B69FE92E4208B047BF49A80BB41D00F50C25766E1D862546B09B67A5602E3276330A64BCCFD120126F43C4155B2D463DD0E8586B53527F1FC66F14B7D09FB93C948A56BEB94FAA43C3410FA2E8120083413FAC634CD9BE85B976273D1381F138CD690A83ABC74652CEFA3B06C2A60302DFFE3733859AD74BD4913BB18691D573071C8672697FD0717D56AC3ADC09004C4D470B2248EE1CF4DDC3FF9A5CB74E8F5AE82471B55F17CE50D13573EEE8949D173983E9D3CE4AFF10F8D4D0B267A5398E90E2219702F2AB55E906FC3A08002B76BAF7F1D6A1FB956868D5890E94C83BF269DD8E5DCB059B6E0B08C9B35B44D75C7BE9A14535E6FE14E8FBC1BAB331B890CAC708C19E2A5351380EEE250800AD8A8136AA3403173B8D26B0FAB934AF0848256473F7963AD3ED2D4FF668B4B4CA764BE2BA7855483DD6F67B0B88D9503B9AC6A47853F9C3C5068F7EEC1C1C00 -smlen = 3140 -sm = 6059221548F001ABF3D78EC4088AD1DCF7C9018F832C36B1AD854A9D52288CEECB0813F96600427A15599FD10E3586735D0DA7349710CA0500B4E9A064FA4251467D1F79F403712166933101375AD0FD5D784D6E9B1FF2F474E915CBA71A000B8EA27B9C30D20F041E7DA1FD86FA10AF2A01AF404AC952F0F05AFE3027836D685C110E3000C787B49A44323567915A8A02A3DA5F63F213016EF4958AFC863B22F5B2F91718402947655101F4241930EEA5BC59C352129E4DD1A98EFEB3011A8880DE7AA32A701C7640778925C1EDAF2000FA17D693F71C04E47A78C89D8FF6456301640137058169FFDFD66A10556B9ADBFF715B99A4008372FA4B215B2BAAC25F84E2D7289859D8330101ABD27C3BAC1BD18CF974793E4835C6A9FD3CC8B7A8455FD48A2E81C5B6C895670803455F6B7010DA8A4B06C587C7AF43E1A4831A00B91A9462EE153E3D98ACE8E5C04400A7E941D3C14E2DDB4F971C9955868ACA753A73E8EC6845ED6E9D3B444C826480F03AC771F92E94380BCA7E50303FB79CBA608E351A1A67BF217B9816E2AF9F89BE8A79F661470CA16BFB2C99EFDE97859AD1D217848289EAF543005F5C231599FF74299EC2A7C737FF94B7465DE11F80E17D4FDA264DE568D8767CE822B3AB9642D95BC89533CE05FB331B86E3C5A296E4EA4C637EA458BCED1F89355C0270D083D4920E72112CA1ED486191748B4F730ED52F9803D05A0F2F065BE03B2603D6CDB154DD7765847D656B919B08969E41B23F9D376135BD5D924529410392ACEB004849550E6CF2903181C9A395FD469B7DE2C5060ED22922AA4D7C782A33330714A0AF206B29B4FCBE0F12C18948F6634FFD7F2710138020E273CB0DFA735BDCDE9BD6CEC898C5E564EC71AA7880D97CC711412F28603DE293CD5E904E9156D4F6BFE2BE15347B9FF7848EB51CD0785D6A649EA3514E02695C7E3C4F021A9992D67BEA1D68E5B17DB2E0DC061CCB5ABABA49D110055467F9DEE61ABA8F3E5C713E94A8A96C3A8AFB698887C1FA4ABC5157CED33A834DBF0F5AF9EECBB5F2AD7B63B4C2CA94A117C2B92F3D51900926E26B101FBE6207AB0884CBFCB15F9F98F95B0D08E29390977F4D3DC710EEA3AE7433D5EA87A5F710F1FCEAB26D516FC19FD272F6B0F01EE167F06E6C33273481F280CA64FDA0549C8DB884FDD467B93998360766D4CAC4C8DE783752FB6C6D7B1E47DF23CEECA572F2AD3E2B628E31984B9054448ED1D90658BC658A9CAEC0485512CE084A535E7C8196B8BBCA5D26C105C41E083F8D56F1530A8C1B36A7F3E41FCCBAC7F342B2D026064B304444192D4873FC57978E44151896EA6C0F13D017F683B203BA1DE677ED00F2B737C4C69E53ECF16AB918939E120E9FE14B2243EFF0116B24C6654BE09C582F1E62E75EFD8593E62E45AC36F717815B854B47A4DDCFC91FC533FA85BCECB6E560CF11E46D2F334B396D68B275E7404A70F2A805A64CD458A8E5F114A89124BA1866F917749FF32E59EE71948BD97F2D4128BEAB8BB0B6B06D84C6D466BFA30FD8100E48D951D0B3E787EF9611A56FFD64D970DBACFB1B4DF064B1CB5DA9918F5C58A10F0903B64286B1C1AE5CBD00EB8B363BDD7A7AAF2111C0C6E86E15ABF6C1E761FBF027425968CDC19522B44FF3F56335C59760FAE6D9028E76B284330F7510F2B55B6F46ADF90311CC785D35C2BB49272BE514CFBBD7A2B7B2E8C0B6DC28CB683D3D581F547F83BBD3B8C7B76925E44E6DA89D5EEF17AB0BF4213EF9C05B7B473901D483C647F416B98478C7100919C28515B617A27321841BAA174C1A2D3494395294CEBD48EEA14BC3106CA9C69D9F6485D6ABF1C2B1111A8BC602454685CA61AB4EE4DB9F413CAF8F0F204F04D40CD36FA5DAB629CB53876DB3E16372E626B6BC892C63C6B6C503C9D22EFE113927395206BDAA4B83D4FEF4FEB42FA7A71F7CE2197FE282A02D0FE50F96B1F917A67E50EB79CD3FFEF064542F7BEB51AB05B56AFD7AEA5F4164CC9BA37D8FDB35A3DEACF0CFB555161E7E41EB798160798BE9D01E3DE0C4288E0BAB19AE398E94353ADBE9A43524ACE35830B82FCFD4B1DC2800CA4C38A56B7CD28BC3E2F69A0AC4655CD79B5789A2B72EAF93B018D4D6F4C983D08932B22C85AF6FB07DF0A786D98820E1B06BC17F62D6E39739790A13049252F1B9102DC692CEB20C270FFE9B902AB7EC5A4EAAF47F7E2D31B2195F5F48AD18D099C33384141DA14E151BA57F6B1BB97901457202CDB83B5C713BD8A13F6E3E276C7D6C130AE287CA8931D9EECE06AB7CCA124D6D02D497D55EA9151A95E8A4DCCDA72D3F51A7DB3F2879918753683B01BA1B154DA83E6D84DDC9492F2DD8C128A30C75174ED1A6B8D93D08645270BDE247782E882418EA158B2A2153B2D8F75C09932F324EC199D26E9F3C4C4CECD807367E3981E137858B98BD1268D2C894541EC99BBBAD19A6856EA16A1E56B7B193BAF79AB89D4E76327405658C4ECB5A8626302B3A4618AEAC7E11A1199C4BB08C60AD78FEA4827B59CC883B2CA7038D7845106DE9174B2B8C17267273D23418AF560265000543ED9886884912B4160FBD372FCDF706EF642CF1829493884B6CFE946ECF6140106DCBE11B3746E33FBD4B5852B732230B9047004F4FAFA0D4BD7043C7D6595ACCD1B2771AAA76FE05A0C80B7B221DBEF79950FC69147816CAD0E52C05E72CECCF55FB4DABD81ECDB476417DBFDAF3B555CC90573CBED9474266C89FC55FF0BCC55602A51A1B5F91E425A1A58DCD4ABD09BBC63933FB4279B9E21298F9FE0CF1A93C4A19695240E8978D604047ABC7239F5053EA650D781307C50DEC4D5E2360ADEB9AA02C0F6FEC5784784A271169CE456E1C32BF984C3323656CCC588C97E0ECE5A40FC7B4DDBDDDB764EDC512DE63270F07891BD160F78B8ECD3A4D11EC4C68EA0A0FBD0F23AF9AB261A110F431F926C4995B05462E0DABF29D9660ABBC660C9A675628270CEA7EC5AE9B6F298B17B2392263700B8EAD9C845AD29CCF109A2ED66ED5BAF9C935754AAA1B84BE2B5339F9BF3CF5E80AF16967863FA8DCA64F5FE873DA4A6D33E39A592749B721FEC203C0CAC527CA96DE7A96CE9A540F5DA1902C97F960A05EBF0C32934F9B81244C945A60FD3F176DD8C261690D8EC98D19607129A50EDD51135FFBAEBC04A0961ACC5A32FD058FFDF2C6866BF90A3E177787E7061BD2011EC08EC118EF0451CAD010B53C68D0BDDC701D10920D697EA3439B1A0F96E6256B7712F59C746D1C74C20B17D461C3DF635EEC83E3B8E098034F119B9D9A79ADA735158EAC3F434E805444D5EA2EC85CC8ED8F5BCCAB7DBB6ECFC2E385781579AF1263D9FD32BEE32E01DB94703B5C756B894DEF19783B12BCE2A1A8D29D96F329CB0791D697BE7E0F05DD5C9DADA52E1B8C1E5F75A0FC90ED8C05BDFF86644B1EE61989CAAA271061D4222818C894AE9ECA2DA7326E5C24CA1EEEBE3720D2127BA997B0C572AE30615F8BC4278057F4762D46A39B934DDB2A0903FE1568C1BCC6C37E1F7C145EB7CB20A6A4B3466A7ABA58B48BE94F7E14CD20C87B2768358D06E3F607FE5E9DD1AAA8477975660F1E379B9EA26CC00CEA8CFD6420F2FDC7EE6393AA17CEF88645B821F8F42FC7DD97B0E16C04631F86ECF1CB76A6502FD1C13917CEB26A83596B117D5336387DDBEA56162E8A5BF2FA35E697245BC7210CEC13BFA694AE884582924168BF8EE2F61A734E37876F363225E5AE19B7C65CA6AFC31C8B37BCCB308A9C27F3E9902DE365E288E6CC46E329E78BE914B85EB980C0BAD932C164671ED395D5D8317C133E2E000A10E0D20D0F408019B33D9A87ED7725EA4C5ABAD67E0CAFBFF31DD236E59DEFAB7FF2CB40F479B56B261A32656F016DECA5302A336CA15D10E0AFCD168A4B922B79C11CB21881220374492D64DF21453B41346A85174A0A4A3C1E973845C856CA70D6D25BB854D0C6BD3C75CD73998C7F64E35A58DCF593C85C2440A6ABA4E470F87E6F9B4ABE127B30F8992D8AAD0BE38F008D9D937582EB3AAFC68F516D5AAF2503ACC96E59A151D2D4B072AB6B38C54928D6656441C709F1C1B770CE6EFCECE11F8B3602EAB63E0C629BBD8A79A96BE4CDB072780F3D287B091FC94FF2C0D347FE280BBAC308644BDB15A3C653863EDD945AF0AE725507507B82C283DC9909CCACBCF357D7A19703401B6E4474B94A6CBAE575B942501A281B8166FDC70E6B4B60C2F57A4D66FE1197D301D0E0C7BEC12CEDF9496BCA2183D04632711A79C8374B6DE35C2EECB0239391C2019C720894BC7A635DF18FCEEB9AAE16B3CE92717E2C56903D20D0712EF80131B8C48635163E97EFB1FABD1500D061C93AD935BE9A65A45A92E4A4E885268E712EFBE5337214701BAAD4C73E81E73BFF19AF131F0ABA105BAABE849F - -count = 85 -seed = 30F0E117513AAF27AB2516BCEADD1188B4BBDE76E57DFAF43CBF2D70723D941E8F875C5EBF02BD7D67AE81ABCC54440A -mlen = 2838 -msg = E43EEBE157E43D9F54130C668A153907D65BB19856A1B7C2FD5E2C770FD6BACB13BAEF951EB758485C128ECE4F3E9377A58A45EBA1C3A9CA5C94B50714088700D6FDA933ECE3A6989EE77A824A9E99674748A90B7F227B589250C9E156A8E50B74A7F49DE036FCED86CA0D4C02E217EEFCAEF7234F651CE4380B86389D7331C7657AC283F58C781F904405ACBB68661310EC6921C1FB7483E74116378086D4A0C9A52AF9847BB3CE0FE97F5A7C2CF588DB3B6FD725CA83391656CB38FCB6D79531E56F5D42FC0CC20D04AD7BBF57001BF2F8E6B335CC57CA2DB23C247EF9B75BBBA3159030975D65B9AA7C10E0FA4F615F77126D5271129D8839A3F8DA30C79174373C4BA643E4C4F0CB26BD5B8B9F7EA56DE459EDA15037D8772478FD9F7F7E06F3B422DF0B425DBF1E91D3893CE20F78CDF1910C5D4674EFADF122F41D6C7D6290DF59FA029BD82E792E758AD4388F9D352E9D2FBE3E58810C380D1CC5768865D24BDD92145DBD1EE0D4724C769EF5CEE12DB2AE2708B4C8C7865E70CA31386388D991D46C4DC4DAFC5CE66CB24D455BEE01488A7C764A308C7054572FCA0CC74A01A2B1F191C54146FB1AAF55B834F998B50909F3D003271E6504985DC836B5C44655B938769639799F2575BCFA92F13D32B283A5BDA11177CE1F66D6B30788415BEF598773E87B4C8C41F0CE6633B6C945A3B4C46B74F30945EFD99CF3709FDAFAEB4BD4C6BF605F89C7A9B4EEA1A6599F0A32CE3F2C58587EA8BB3FE6495D92F2FEEC52BEA3DE2047F5EEA7EA1453C762201FF1291AFA87923107F7FF586E00D07824EE021649ABD2D6E9EF11A1D31726EA9277134341EC57D790949590A963D25D6FADFA9CA21E43ACB7E5ED4CB6E8BB36377C2618997943CD100A927D395376871ACB9619BDE9B1FFD5E48E271952613875FA3ACD3E1F2E872F1D672AAE6E2A575A4FDC4FAE2DC6A7196E7EBA94AE5B49BE41E7295433ADF49A6D2D945F43699D444A726423CD9164B9E28B0AA4485B0C767A9398DF5DC5F23D27889C14B1ABE98880E7BD5DF9AB3D1321D5493A0A8B91EA4827627A9B59308CB0104CD8DA7D9DEF2D47B27074BA007401415E900DF03F251C8AA425F0FA59D74C41BA7A9288C8E280141CAAF6C6932DDC4184F81F5C33F0FDA005BF3FB6A0A9169A709875AE475302D57CE96D3DB332188202597FF29D1F9EBAD2B0FFA27C14CE9CCA58C923283BA10E9FA1689D6C2B8804225D706E09FF97AE9CEDC27D256E8736DAA54382040648F2F6BFBECD6C3A9BFAF5D1ED23EAD00EAB351F1E0BB4C719AE6A1F5D12E7F09ECEA62A2F554B18397FE1400DA1EB6694635D7C9C626E0FC82CF8DF6AA4CA88B69F78CD065C53F929BAA58507FD3E3D8124C4BF287D452AF47AF9F4D926DFDB529A8ABB8BB57C5C7611A97053A0CB0B01C754CB479C6CD3A3E867BAC33E45EA0BB6BF77E0B2EC2F136DAC0E259FA309FB5F6D8E7005E1696CE203C5D054E5927A87A1B4E81E73F22FAFE61D7D64CBFBE519D39E716BDCBB37657E71B9390FF04B3C01C6F6842684115CD7F5AAC208EEA48906890248E58D1615634CC1263CD3ADC14B67F1A1A8ED2626E7237AF5488F5D269973F11458E3E4FC2EE35A4BF49C2F5F2361939FA243FA8F33B54EEEBA9B0453701E367A7BF4D698C62DA64732652C68C20A956522826F8E29A764BA93DBC98FCC87E59A1423886694057E131333C5DCDFF3BE7A1F0D344A2DEBB90051721E0226178DEED353A136F69481F83651BE3281C562D6127914CD24C38FFB327786086B08EBE89D03A33BF7B5DCCF90DE9C4D907D308E08A616C5343C116A098786383009DC70787AAFB4529CD27CF85F946B8B238AD2F00DF109FC84CDB48BB52B73E1DE066636176E8C6C76216105486C553511DF1F0664EC1E04EE0B0BD74A08070207486B7F326C3EE73188AB5BB7F8F5643093916491D62F0DB18675BA4CE90B2AB310BBA4705B65A581FBC5E76842A99D4926AE5BF7B8EABCE5FA30CB98C1BCF0E0708DA970096234D47BFE23A4F9ADE29BE5A8B6BBB748EA1C13D00388AC90B65EE10BE6A9AC422EBDDAF5482422AECE19E702F6D26ED954D4E489CC48B2E39A6F168E98E11C1DFCB4A843354F1AFD447962E5090CCF51DDF6643CE0AFAFCF3E4363187E69C31AB796132EEB04F2D4976A576B9BC8D9B1D491B74613C1AF32E3D2DEF408ABEBCC27E4A915C983E10B6090FB2DE6FF9E60C96CF4F940B09AEC048E7A174711798FD76DB15DCAE0E570BE3AC147E2F8777A522555B0898BCD7B04ABBF060FA72B04604C9A583FEFD02B2AF9FA035F97DE4DAA4EE777F9D6985149DB6C2F0A33EE1A1436B38DFDFF87F831E83399C6A884273E612433EE3958F37C99A748DF151E3EA011F4DF5F0050597685E0230DA1B1C7095E1203EA7099BA5C43E58AB0EDA60AF65291C3CC9A07257D71CA6C9EAB93CEF41294853A67A5B11F9192C96A36C701F142DC36B046218BEBAD9904FB765550598F8E2F49F5F0AD2608117196751E7E4C5CC4C3EF425A921C1EE15F37A1F80DF1E24163CA145EDB0FC4D988B8C7167ACF9CD94F919AC96E5469859FDAEC54E1970007EB9699342A9AA044A8EE478A3ECF8B59B0109EA7640C218ECC1E8CBC5E2FB61A1748B7C038EFDADC2D096BC29D95B1BE770D097AFD8B0FE02173A1B3D7110F80D6C849F1AFD1B01A60894B16140F9B34D96071A753545159C4FFA4DBAA938BDEC287C6B83751C5E699724AB355D1FA0E081DB286EC83343877C520E856C4ADC65322AEB39CD87B7D8E4FF9222E085ED84C58B7FF513AD77F8A9EFF2760A03F69AE5DD14DD92DD3F2D3D98E97B1987086B3EEF2F2E822C851B7ADD83903786C050F30C4A4F4BA9361E49ACAD503E2A07EA119752E12D4FA09DC83F7A48EE3DCC1F09475960B6839CA736E498A128F78E58279063D839ABA88AC9E5BC24BC07BBD2DE1CF2E1CCC5987E63F83780D0ECF07EAE21C8C752529735B37C980EB320DC949468C69B17DA8AD612825A84D0529EB97FF8C4CD225FDFD1563BB6C5360ABDCB3339434A298DDCF5F36188F3AB501E505828E8D2FD6DDA062AD415C56414FD7557170F0F57BC5A401FA648699F3C7F7FD8F1F058849B817FADDDC24726DF851D3644414F55CADE30A5764914675D574EAD4D4DB8725866A6C51BF0EB23B12FBA1E101A6F3BDB98A2884D0F2B8DEB3F279E9C38EBD0209DD05C0FCC6EA715257355D0D6BE2C8BC7835187CDAEA43A8EF9C59E88AF6AA667A697A3DF8BDE250EAF4341A835B5EF93CFF97656133B49E13213949A3F368D985E0D6C793319F4284DFADA383137DC5B000B7FDD85F27865DC633562949BBE4FBFF75417AB109F03015BD0F67728969435EFAE791AC72C6AEF99A385A3E8B4C35F58380149C653FD78391A7C3B26A3550D37F9639164979288BEEE99E36AC6F44D0FCBAF0D210839D563A6249059A30CE6F047F5D541FC8A90A18610A8BEFB9493C5AC804D34D40881CA82E673788870705BCD585044B11F1D9BBD6B17D8B82B7CCC0554D1E3AA7F2762FE01385571C9FA7A103D07C1A209504876189DE4B3C5910C26C5F33EA725A7D57CC30A6EC8F3EECF2409F1234A094556C0F7941CFB30FE86F208FEB73C8E8EA8623640AFBDB1CC589768A714CF945731DEBF4519B70870FB3A50F1FB368ADA3FB217704A5D46D879CEFF9BB72667ACC673CB196AFAA0DB1160CC2CD7B260DEB791A94D0988ED54B7E45F33E7CDBA0FA105F3AF3CB1521EA382B1266DF304C900BF53E195CED03871A22C50DA166BB9441CEC83607083195D6CFA17297B678ABB5E03950160130B47E25713B0829F64D2552EFCF404F65798A86D5899B72150A91BA00F7DFBFFE82531497B60C31C28992377A2DFD5FAC8A9C16C835CE4DC24D0389277E6355C655C8A33C89BD48F55C13EDE24B9BB348DEC89612F0905719743C95C0E8B5653855676CE171F812ECA405B6F96F2212D1A5369A11379282AC0C5AC41D -pk = 5674CF815AA2B5F434D759DFDA004F69D7D140D7583B9816DF783B45C039AC7E03BD1BE5B8CB3C06DFFEAA49EA463B78110AA6E453BA19E9A9F8A14F725221002661872066FAD4B22B21F3DA46486110C1D0D476FB6A9F6197FB5C2440A0910363BF63438FC005C971470EBF02564B75F629C771E4235BC79F82C3D9140C1800 -sk = 5674CF815AA2B5F434D759DFDA004F69D7D140D7583B9816DF783B45C039AC7E03BD1BE5B8CB3C06DFFEAA49EA463B78110AA6E453BA19E9A9F8A14F725221002661872066FAD4B22B21F3DA46486110C1D0D476FB6A9F6197FB5C2440A0910363BF63438FC005C971470EBF02564B75F629C771E4235BC79F82C3D9140C180002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F82C78E2B95D0E44188882E09387129264AF3657E6928546FF4B097DA763755ABF10992763D9084F790C61018C99F75246504803B05F460CFA94D657D827C385EA623E3F0CE9A94F133727B9708AD5BAB8F86E9C35D3F0688BFEFFFFFFFFFFFFFF6F18DD2994A7614A19D541129A8EC6C50A87EC808E0A00095BD9DC6A6D2A359D6FED2E101D488FEF3F419795A7C386793519E59695E460402F76C33B94FFCD5D7C212AE90CB70539E67CBE35F95801149860B57BC1CD4D699CECFFFFFFFFFFFFFFB1C9A119869249C066FF6B4E8A520D2430ABEAE8435D13C992A07FAA3156BC09E6C2A2CF6075C880822CB44D877408CAA2528DCEEEC2DE269147FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0044D14EEC013B563D3DCD8B31259F5CD4B061A7FEC3E059BF60765D4FBFF831D823C3747900B5C9B21033620BB800F02FF12B51FF38FAB72A6020000000000000000000000000000000000000000000000000000000000000000000000000000D190AB715F22781190D753A173C01BDFC0083C09FBA1F102C259408B21688454B44FA3060490BCC6CF1BEBD1E9DA6E2760D7222916729FD143226EA02CB01100E4D33D3CC96CBB781B55329251EE14865CF6A959D968CA64704A1DF48DF7630240F398E8C5C5064DD2A3DA4B737D6884CAB132BF498232AA8B1E50F66BB80E00E27973A7CD4739B8FDB9AA66FC65045E65EC791019BF540124118F928F98E5D16148650521031357B65205CA7D2D650034FF08965041204AA6BAB7ADA8AF0100F287A3E1AC1FD9D72E9E2C005CCC1C3E96A5434A85A4C4E1E49A81C0A7EBFD78AF65A745235111BE1DC902A19937F66AD656A6CFFCD7803B17501D567F2C120010E5A02B00B1FDE81B8BF611AE8760CE884102433B7BA22E9326123D4E636405837893FE988FB22BD25251F6C45015879AC4D77954E5B8D1CD0A9834815B0D00D0796AB66934546B5B6AD42772E6B924DD22475E117C6BC6D737DB5A793A2025CAADDE39339861A74583A06615CCF928BE507B76DE442F4FF659B765E9E1070026C4B351F2939E73E314A20B4597A772141B0C133082E35E8B9A7F33951C8459BFB5046115E4E80ED65DCBEDF3A9909886DB33D1A42FC28AD96039B72D2E1D009A2073F7BF7FEF3EB64280B74A07A1D19E169A7569CDEC015AC51B475D858A17AD772048A1DFD33C5C87964A5C2BD8C8E5764AC16E05AEC061BA1998FEC21E000573E9D2EA4F7AC52E9EA1E7999A1FD00672EBDB08E4ADD912268E284C3C39FBB29D6564F971809DEE3DA2C9BA4D8AA38438085D85300AB529F5FD7EA96A1800EBC0C9200524FB15664AEF2E7100720D6CC39B08CD80DE91F0352010868A9D682127BA87047544798E1F55B927DDEA718EB35B63C991B3CF9824C40C90EA0100A498D9ACD2DB74EEFE969A1AD97DF93E596328E4FAF4234A5F32B5B95139AE01DD8994001C7C412A9E40F5A346EA5C7FCB6FBA5D20FBCD60A05D2DAA558B220076854B3137B1B4A9FCBC2BE8CC536C4985FFE844ACB9091B7980A4AB4F939B1C25066F6F1C42BBBE761133A0B5B9AAD65B7E89C9FE1DDCB6DE695AFE1C781C002AA54C52A2A7E3C34A8AFE10C7CFB542DCC0FFB55A6EB82C222168CA6A56176463E928D1935D312AA015494E9D9481EB093111A8CAD79616CA680EF71EF80A0093597AF795F436C2EABF692E91E41BF7D856366B586D11FD9E7C6D3759B36C8F5D4DD995F1D4F6E439FD9E71C563910FF7131D7478745024780D74E780860900 -smlen = 3173 -sm = 68B0F1BDC79928E7BF68885826AE51737DB500C08A68C93B5E1CD6BF306D5311A48E6CC4A90079038D7072F2CE0C8D1316E2CA726DF67EC50150E7F1FF8E46757C9F7715E4E7988D9FCAF10146713273DF9B1F898C9A7F63238F0D99028201754C53F46CCBBCAB849B883FD512E2EBB4B401DB1B71EA718610DECE157A34424BC69F60520140A3923216F504CA3D0EE8A813F87446FF9701AAEFAECE4D5348DCABCA61E208058C5EFC3C0031F7886D9886E36B424CC386C7DBCE51CFFA009F270DC00C7CD74EDE1E41123C9CA28FAD3A004913246659070CD38A948C4E8C9B72D6BACB00B0F0429E660D39DCD92D8D8E0A6C628FF9DE0103036F284FB550C2DE75BD781DC8757C68F80100B7175C52F30C94CEBD7B2CFFD54CD14311AC0200381A574CBBACC475ABBF248E0503E2902151132B464BB04BD2E4C750E1E0A83601E69A932C76B551F49E097D94AE7701E43EEBE157E43D9F54130C668A153907D65BB19856A1B7C2FD5E2C770FD6BACB13BAEF951EB758485C128ECE4F3E9377A58A45EBA1C3A9CA5C94B50714088700D6FDA933ECE3A6989EE77A824A9E99674748A90B7F227B589250C9E156A8E50B74A7F49DE036FCED86CA0D4C02E217EEFCAEF7234F651CE4380B86389D7331C7657AC283F58C781F904405ACBB68661310EC6921C1FB7483E74116378086D4A0C9A52AF9847BB3CE0FE97F5A7C2CF588DB3B6FD725CA83391656CB38FCB6D79531E56F5D42FC0CC20D04AD7BBF57001BF2F8E6B335CC57CA2DB23C247EF9B75BBBA3159030975D65B9AA7C10E0FA4F615F77126D5271129D8839A3F8DA30C79174373C4BA643E4C4F0CB26BD5B8B9F7EA56DE459EDA15037D8772478FD9F7F7E06F3B422DF0B425DBF1E91D3893CE20F78CDF1910C5D4674EFADF122F41D6C7D6290DF59FA029BD82E792E758AD4388F9D352E9D2FBE3E58810C380D1CC5768865D24BDD92145DBD1EE0D4724C769EF5CEE12DB2AE2708B4C8C7865E70CA31386388D991D46C4DC4DAFC5CE66CB24D455BEE01488A7C764A308C7054572FCA0CC74A01A2B1F191C54146FB1AAF55B834F998B50909F3D003271E6504985DC836B5C44655B938769639799F2575BCFA92F13D32B283A5BDA11177CE1F66D6B30788415BEF598773E87B4C8C41F0CE6633B6C945A3B4C46B74F30945EFD99CF3709FDAFAEB4BD4C6BF605F89C7A9B4EEA1A6599F0A32CE3F2C58587EA8BB3FE6495D92F2FEEC52BEA3DE2047F5EEA7EA1453C762201FF1291AFA87923107F7FF586E00D07824EE021649ABD2D6E9EF11A1D31726EA9277134341EC57D790949590A963D25D6FADFA9CA21E43ACB7E5ED4CB6E8BB36377C2618997943CD100A927D395376871ACB9619BDE9B1FFD5E48E271952613875FA3ACD3E1F2E872F1D672AAE6E2A575A4FDC4FAE2DC6A7196E7EBA94AE5B49BE41E7295433ADF49A6D2D945F43699D444A726423CD9164B9E28B0AA4485B0C767A9398DF5DC5F23D27889C14B1ABE98880E7BD5DF9AB3D1321D5493A0A8B91EA4827627A9B59308CB0104CD8DA7D9DEF2D47B27074BA007401415E900DF03F251C8AA425F0FA59D74C41BA7A9288C8E280141CAAF6C6932DDC4184F81F5C33F0FDA005BF3FB6A0A9169A709875AE475302D57CE96D3DB332188202597FF29D1F9EBAD2B0FFA27C14CE9CCA58C923283BA10E9FA1689D6C2B8804225D706E09FF97AE9CEDC27D256E8736DAA54382040648F2F6BFBECD6C3A9BFAF5D1ED23EAD00EAB351F1E0BB4C719AE6A1F5D12E7F09ECEA62A2F554B18397FE1400DA1EB6694635D7C9C626E0FC82CF8DF6AA4CA88B69F78CD065C53F929BAA58507FD3E3D8124C4BF287D452AF47AF9F4D926DFDB529A8ABB8BB57C5C7611A97053A0CB0B01C754CB479C6CD3A3E867BAC33E45EA0BB6BF77E0B2EC2F136DAC0E259FA309FB5F6D8E7005E1696CE203C5D054E5927A87A1B4E81E73F22FAFE61D7D64CBFBE519D39E716BDCBB37657E71B9390FF04B3C01C6F6842684115CD7F5AAC208EEA48906890248E58D1615634CC1263CD3ADC14B67F1A1A8ED2626E7237AF5488F5D269973F11458E3E4FC2EE35A4BF49C2F5F2361939FA243FA8F33B54EEEBA9B0453701E367A7BF4D698C62DA64732652C68C20A956522826F8E29A764BA93DBC98FCC87E59A1423886694057E131333C5DCDFF3BE7A1F0D344A2DEBB90051721E0226178DEED353A136F69481F83651BE3281C562D6127914CD24C38FFB327786086B08EBE89D03A33BF7B5DCCF90DE9C4D907D308E08A616C5343C116A098786383009DC70787AAFB4529CD27CF85F946B8B238AD2F00DF109FC84CDB48BB52B73E1DE066636176E8C6C76216105486C553511DF1F0664EC1E04EE0B0BD74A08070207486B7F326C3EE73188AB5BB7F8F5643093916491D62F0DB18675BA4CE90B2AB310BBA4705B65A581FBC5E76842A99D4926AE5BF7B8EABCE5FA30CB98C1BCF0E0708DA970096234D47BFE23A4F9ADE29BE5A8B6BBB748EA1C13D00388AC90B65EE10BE6A9AC422EBDDAF5482422AECE19E702F6D26ED954D4E489CC48B2E39A6F168E98E11C1DFCB4A843354F1AFD447962E5090CCF51DDF6643CE0AFAFCF3E4363187E69C31AB796132EEB04F2D4976A576B9BC8D9B1D491B74613C1AF32E3D2DEF408ABEBCC27E4A915C983E10B6090FB2DE6FF9E60C96CF4F940B09AEC048E7A174711798FD76DB15DCAE0E570BE3AC147E2F8777A522555B0898BCD7B04ABBF060FA72B04604C9A583FEFD02B2AF9FA035F97DE4DAA4EE777F9D6985149DB6C2F0A33EE1A1436B38DFDFF87F831E83399C6A884273E612433EE3958F37C99A748DF151E3EA011F4DF5F0050597685E0230DA1B1C7095E1203EA7099BA5C43E58AB0EDA60AF65291C3CC9A07257D71CA6C9EAB93CEF41294853A67A5B11F9192C96A36C701F142DC36B046218BEBAD9904FB765550598F8E2F49F5F0AD2608117196751E7E4C5CC4C3EF425A921C1EE15F37A1F80DF1E24163CA145EDB0FC4D988B8C7167ACF9CD94F919AC96E5469859FDAEC54E1970007EB9699342A9AA044A8EE478A3ECF8B59B0109EA7640C218ECC1E8CBC5E2FB61A1748B7C038EFDADC2D096BC29D95B1BE770D097AFD8B0FE02173A1B3D7110F80D6C849F1AFD1B01A60894B16140F9B34D96071A753545159C4FFA4DBAA938BDEC287C6B83751C5E699724AB355D1FA0E081DB286EC83343877C520E856C4ADC65322AEB39CD87B7D8E4FF9222E085ED84C58B7FF513AD77F8A9EFF2760A03F69AE5DD14DD92DD3F2D3D98E97B1987086B3EEF2F2E822C851B7ADD83903786C050F30C4A4F4BA9361E49ACAD503E2A07EA119752E12D4FA09DC83F7A48EE3DCC1F09475960B6839CA736E498A128F78E58279063D839ABA88AC9E5BC24BC07BBD2DE1CF2E1CCC5987E63F83780D0ECF07EAE21C8C752529735B37C980EB320DC949468C69B17DA8AD612825A84D0529EB97FF8C4CD225FDFD1563BB6C5360ABDCB3339434A298DDCF5F36188F3AB501E505828E8D2FD6DDA062AD415C56414FD7557170F0F57BC5A401FA648699F3C7F7FD8F1F058849B817FADDDC24726DF851D3644414F55CADE30A5764914675D574EAD4D4DB8725866A6C51BF0EB23B12FBA1E101A6F3BDB98A2884D0F2B8DEB3F279E9C38EBD0209DD05C0FCC6EA715257355D0D6BE2C8BC7835187CDAEA43A8EF9C59E88AF6AA667A697A3DF8BDE250EAF4341A835B5EF93CFF97656133B49E13213949A3F368D985E0D6C793319F4284DFADA383137DC5B000B7FDD85F27865DC633562949BBE4FBFF75417AB109F03015BD0F67728969435EFAE791AC72C6AEF99A385A3E8B4C35F58380149C653FD78391A7C3B26A3550D37F9639164979288BEEE99E36AC6F44D0FCBAF0D210839D563A6249059A30CE6F047F5D541FC8A90A18610A8BEFB9493C5AC804D34D40881CA82E673788870705BCD585044B11F1D9BBD6B17D8B82B7CCC0554D1E3AA7F2762FE01385571C9FA7A103D07C1A209504876189DE4B3C5910C26C5F33EA725A7D57CC30A6EC8F3EECF2409F1234A094556C0F7941CFB30FE86F208FEB73C8E8EA8623640AFBDB1CC589768A714CF945731DEBF4519B70870FB3A50F1FB368ADA3FB217704A5D46D879CEFF9BB72667ACC673CB196AFAA0DB1160CC2CD7B260DEB791A94D0988ED54B7E45F33E7CDBA0FA105F3AF3CB1521EA382B1266DF304C900BF53E195CED03871A22C50DA166BB9441CEC83607083195D6CFA17297B678ABB5E03950160130B47E25713B0829F64D2552EFCF404F65798A86D5899B72150A91BA00F7DFBFFE82531497B60C31C28992377A2DFD5FAC8A9C16C835CE4DC24D0389277E6355C655C8A33C89BD48F55C13EDE24B9BB348DEC89612F0905719743C95C0E8B5653855676CE171F812ECA405B6F96F2212D1A5369A11379282AC0C5AC41D - -count = 86 -seed = 070FFB907EE8AB7152A9D380DEA2C4C4796780FCFD80906C5E489B917A45D5E7EDFE6F37C4420E5480E8BB599FE36451 -mlen = 2871 -msg = C07185E0343DF2A4201649AD5DE4CFFA20BAF5DD43F5E4A6C81CD5143FE72865A7C036A2DFD617D96626995C12EFAD019FF44E0EDD7028F29E3657EE3C0D02E9CE83EF0A648FD7CF183A7BF7C15095E0F9278B14FDF6C983CDCF2987DD0CC085400906DCD0D14ABA60124F4B7494ADBBAE3A8D6052122575F99792F7240EB17864DC6D231721140E43F1110E73EB2E3C05049783B33AAC4E4CA0A248775BAF81FDB03D114508928BEC3169A810296B5A4DAC27E7C7F8D01CF5943CF4D8CF6EE6F9042BB300E50EEA3224D35C9628E38C368EC3B42393FC820371DB6557216A2C2D5A230FE3A7C6BCBDD89A2BE5CDBE7F783BA379B6A4237DB051E6256DCE14DCF641190A956E8E85EB2638736B899ED045636DDB7A351F5A4F4108D9D6E0413F92B9D392495299128A5F4ACCE8C7747C675EFE05ED7182DB51C515B345029440AB61A904D2A390122680C951ED4575515144C5CA80D6F14D1CFDBB5373B78E09D04D0544151CFA1240790CD31165048D1484DC4D11D05057071DB3433DF071B367E00FD38C386DAB689E4DFF6FB421B2A95FF54DC29375C9D1C18A76C79ACAE3D3F35D4CFC385199A4CCAF6C9F0421BCF58D296EC7E0D1B95A6C4BCBAC1271F94E438360A71A6440275591E41389B30CAF2626A865B9E59552CB198A1D4453EBA6D0F6FC491A8A7783B4A8BAEB81E54F9189CE493EFC1C5D830A4F637F2BF43CD86B91637611415C95685FE79966174312FDFBF33A646625F97521B5CB1F008135B824F1D6D8373006C7158E62B1F794AE34548A0C6DAC8B60C559D81580AC0D84034A501516EE36CB4082732918365A5AB787FACE591AB02BE6957AE4BB96B58E2B173DA019D3E0CABEBEBA0AF775779F14BFBA8F595697731522DF3C80CBDEC16F6ACC32659CF5DAF193178307887EF1BE1B48B5806D0FA9868A7FB853708B26873857786B974709C687D6597BCF6C7E476C1E47CAFDBF30B6311ED434C0F998C4065399C59073C1F2BAB1D46104E74EA6C976D416E58BDFD24CCD957CB431870DE5DA8763992EF68BB18075926B0E4E826095EB3B8CAE086FB1759C94B873A1F4DF477E0EE9EED8DFD7C77508B3F0C67F69BE04355ABA9344960639F6DD6B3A956DCD66370338617A365579C5993986B4F748CB7C990344B209785E22A40FDCF8F83061D37C9F1351B4473D6C74ABE6B3EB2A7D62CA0F0C88A0AA8A46973F781DF0126E8D55D3E9C41C2E3884F84FB0A06C484CFA0C9A0DFB8CFD573749C711C7C236B0F2F144E1BA4DB2525C093DEED29434FE43CB3040C5A374CFEF33214FDD2D660398E91BF070A4F5F9746C2F08C41256FD5E955891146FFD38B155987E6A0FC47AC2A5950509B9E2C86B9DD9929378F43EF3935F1562672498C5640A22315BE15B001D4B01418DF8EB41DFE5C570E850582D8916C2E7FC2B728048E24BB9D1E8283615E039C16A2FC61011631BBD8F2BEB24ADF9552CF5797CE05D9D1A7E7F3F5455017B127D9BACD32BAD0CDBD3991BBCAEA5FC988EE7AEC0B1003732F25489EDB0A1F9897247CBC40E60F1DD276259CE19DECCB90067F7293A68B683FB5232ACD2217B8929859109D6852A43892098630A67D72B1CF4BD5D58E20C5C18B85D69DF74EE8CC69BAAC7DA48EB71A160F03B68C6BE87A4919736F14363F004EA3F41DD37FD8E621BF433BCA71E17565E060F3C0F889515D0A8C17FE0D6D734FF756256B0A62058B95422257780DE000557DF289F47910CC272A14BEC737C0715F204C49F03150082DC904A5D170F7383F04F1E355F50F80D5461CBA53490BB2E9484806D369D61FD00ED1EE5BE518D04A24503B1C4C08C7CA084902A3942C04143807203287A985EB3FCAE3C5309410CD9B9A548F54DED44321CE8C2A04679841DAEF7FBB6AA11091D240AFBB467D9969C31C1CBF6B24F8CBFA20CB4CFA404B1310400271664763E9C1CD1B6FE5FF2A0FAE22AB14EFC016CCBB19C5DD5D047750DB4ADDEA3E7A193128A5F4D7BB6358F21B39A44259695904DE3440BB28CF9466B562065C387189EAC2F7522C9385DC2A607F6F9335FF8ADD47C7BA932659AFF69B1F26EC8655BEE4F97FBC846E48111CBE25524873D1DB2F2282D0472A2AAA3CF491C26DDC5E1BE77866A3B692E417E6717A4F4454C56F97F063B9E598865B6F71136D65DDB0F3CDEC57DECD5A57366BA96E4315A88B4EA3479321468FFFF508D23B0701A62CE0CBC0FA37C91CFF5C5A0433FD61AE11A922575F5BAA714DE46A58D6EFC79BDB10C9AF7E9950A61D44B3E17E3B5298501146485B562B1570FF5798B47641D67091CDF90902B2D762E3EFE94C540DE4A28269CC416EDBDDD4D43AC2FA82D638DD9BF11F3BF22FD81CC4BD4759D7D864EEA0E8E8AB71796254B278CF9B650D1FEF38B8437362B2D69ED84C54498331C6899E20C596FEE7CAD9ED8D83D86774AFA6E56A4ED34B0B0842B21CCB67035406DEDFF0CECB0CD089929ED5FFA0CE210822444808BAD99AF603082BFE5C98EE4653349F8A43DB64CF90190C96B0446CC9CD23E0D75B47F54A731E8BCB0A4C67401DEE87876011033D2A526067FB73786FBC1CE696130FCE5D5379CDAC6788875D27C04783B1E2EF41063D57E3D6560D1FF48882C39131C95BAE5A9C9392DAB6CD17EEFBCF61C464A4DBC08447443CBBF3FA80481F3BC1A5806042C07F7A7AD435875DDB1001565EB6B7B872CC6C853F771C1DD5D9C16BC27ACEB3C7690125C1907C7CE904852108CAFE76351269A3D3EA8812FAE4FAE35F0DAEC8E8B186F760005524998BB5DE475E4DF85209DA915BDC972218AE7DB7E2EFA05A7D752AE61CF2F3DC26CA2D282C8E32B4838524BE460971E077348290FA0043FB7616D821A71DDA3A5FB76BFCE0DC84AAEA432DF32B05133A26B46165297EBC45024777A868B8B1B0DD6F97658BE799BD366CFDF99861E916F7CF06C034E4F79594F1BB6ECD9B7347911488928E1E473C4B8C73297F7ED845B9EC59020373EDA57A436C1C9D1459C6114BB6258543D8F4F97B10AAEF5A2E082EA173EE69702D83711FEE6AEE8F6B260D03AB74C3B5D8FDDB81B208E16458511270DD1DA295F25CDE7E44A8349B60BF0C59D4B425C1FBA60D2BCBA47B906D2830D8D5C091DBA756E61620D78B2DFF28407FDC9DA9113CBE82219BB2CC05E11C70D040BDE821AA17B3E981558961CA571E5D5041F7DE047A1727D9C904DEEBE561DC6DBD8876BC77C27322F512D6171BC03871EB0FDECE70F119BACB41D1852220CFF26110EB0EB78E39AA1B2A4C2E78679F53683520C5A57FEA71A8E96E0AED33118DC4BDD035FD88F535B011D9C7DEB6F406A072AE6C091016ED10A5A4EE9827882EE27C535262D1D745AA5231736F2DEEC8A6017BF0DA36B416C98AB71C6824A6EEFF3564665007C9E850FD02A1F5E201B534627B92D21A493DF293DB9F24DE70C7B49A6E07ACF2DB6C90B448681666DCDA318C08AAD08D3E257AF7E774C75DEBE3B3C07AF683735E87F205B0FDE07351849C5AFD07D5722C6AA17B6AC2CC3551C305E6AC31E3601A236961F6618CD3A0F7DCF6F65B8EC82E27E44C8518CDC16ECF79374F796A3DAABE2D5005B25576B35B021497C5A8F9B98DA68D80E56A1CC1044C04DFB11D36CB147EABFDAAFBA0A93FCED8675D7D6A9F999785C0E7346F4C68EB17C0A2409E2F5BD4AC5551FF66A9857C66F642F2A385131377B6372884C417E01BFBBE1CA748AC8969BF2C0BD8944767746D1D57D862795E8ECF9E8A5CA122D0259FFBA822588C5ECCD14CC6FF4B7354CB572F5BD695ED9D85DE131FDD97DD5D6CE7844DDF9F3D112028B5125AE7A77A4AEB2EBB554682A26F457C43FE96D67C90BE7E49FF443478E82D3A48680D737D1260B8210BBE962EFAE6505E496B1B6D4F1042A7B971605E2DC50BE3BDFECC3010B9F5618D3A1B2C1F48888B859E4D6B63CA9D29990B6D502FC22B738B203A83D597B48D73C41860E4E99C57181F5B02F108CA193451025F3B368CF2741244F42B27CB9E57260D2E127CA166B32E0B9C927B247B31619B1D4 -pk = 161A45152D8C06BFAA0464F03EB69CF3F9C5A4B728EE5DB0E716E8AC99814301E4AB367426A69686C34209D0C30BF41A02B6B881760FC7E850B6B63C73E00B006CBE4B6BCBD126FBFDE362F07BEF35E450926547A0B10797481EA16132ADF3C33E9B9EE884E40C916DBF25D9818AB3341B3C5942B3F1AFF1C5C0DD0DA8632300 -sk = 161A45152D8C06BFAA0464F03EB69CF3F9C5A4B728EE5DB0E716E8AC99814301E4AB367426A69686C34209D0C30BF41A02B6B881760FC7E850B6B63C73E00B006CBE4B6BCBD126FBFDE362F07BEF35E450926547A0B10797481EA16132ADF3C33E9B9EE884E40C916DBF25D9818AB3341B3C5942B3F1AFF1C5C0DD0DA863230002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AFE1D7E9F093F0649B248C9BC10D5CA82E876B620D2C6E34723E876305F82C3AAF89F8FA03838B8F9AEC92637B104406A3D90240025F115E3C18DBF56725737BE05483A43842F9CBFB49B918EBE3A7127C6F91A138CF247621F1FFFFFFFFFFFFFFD4F1F4959B7FC2F86C43F730D36CDF65C9CF96F9F3CAB8ED411E2A75CAA536333B2D41D256F3EDD06B4949FDF841925A7FB58E063C00BC53D4EC2F819640B973FAAB8D559A65FB415A0825FFAFDD9C904502D2FAD3AA86D817ECFFFFFFFFFFFFFFD467E3EA72B6AA616EEEB6F9DB7E47D4DF07762E62A08FD972B89326143140BFC5F81654309FA6402993072768E4891726BDB270D037178F0731000000000000000000000000000000000000000000000000000000000000000000000000000000AF19181F350EA5EFD018B0479B0C32A5D8CE7BA130CF2868F4EDE8A3E53AB570AA5D1E0DF4350C7EC9C1D53451C2BA89B6C4B41273CAC38F3E8A0100000000000000000000000000000000000000000000000000000000000000000000000000007399891BCA209F84DD2C6328D6061140557AE86541B4388B9ACBF9AF82B75E5B560A8CFC53953A791A8176A25C4D2A9FDC5EB080BE4DB1C6A42A6AC838800700866D31B329C78DDFA5EEF50EFE63AA8323DC040BCD911F97C0650F6E4FD74F13247E938640AC81A86E515E7483D7665757A57285834023CA10490315D9BC0300E76B4C3BBF5741789170F83FEEA32D754DBBA12DDF1BB1BF548020D1C5C3106697C499699D37709B040CB36EBF097C772A0F4B1C1A26D0301F9A4D1716F709003C36437AD5910F70FEED6E19851137078A4FAE14EF79525D829E7FED8C164A8697C37757E3F18BE6E6D92F45276767D84343637CB5DAD80973BACB86656D0B00F759E6655817463541B475802FCC828EA3E2D1D04960BB71AB1DC6C1606A4CE5D6F60E460EF4DDAD69956425B0BF7A184281147A985822BA150ED056050B1200DD916ACF36C1C389BDA3810D5A815A7922BF391D1C0A0FCFB01203DD612325224DA7B6850A0A29DCEA8768AD7A9C206A5D9621B99568BC84F78C6219D1770C0006F1C41F4E667B5E94AFEFFA7DA9C34EFDE02EE88BD6FE9F9768D2319C83BC934D8F0E80D4856EB71A3C9CE6ACD20C34DC2444AA011471DD95D5987A1FC01300A569B452A22E1AB0C8C38EC5443513DB327768178126DA85F4B4508D57F3E9786646B743399A88B79D3343F7BC0D43066D19C369441C3D749BA4E276476B0E00EF6D88C0786A3C939A5605EE4B4A2FF99388AE25EAD8350E1467944E372293562981ACE8C9B9328B99BC68A3478CAE789C83C2BA2290617286639D0DEBDA1B0036272BBFB0166DD2739D21D76649D30EB024908CDF174DD97513E0026B9451786139D8EE766ED3D7D333C3CC501EC9D9529F0BD4174AAA1F28C72624CA831800171BFF0FEDEA84C62124269344406E014545A4CD6FB9C8D967CCDAF4E98C133B651227E15290C35B70092689AC08EAF0FB049F9287E328B06ABE34E119A7140022D2A63F95583A67042BE3F28B9B9C1B9CD30950A4E44866F15847D1730FAD36BADE3E15B83E6DEFA1173248C4F2C685E8AE8E3AC8E26736299BD40AA0041400E9821D9E7BC4ED8D590217A6EEE6676585B4CA662775D23DDD61F9D7E0EC570B26D8300221F85B4869563EA389371297078FCC60AC00EBE23FA6540B451709007F699736624EBA905A240A54807A01829F1055187F32F789FB600DC915C3AB5DCF665A84F1DE8C713CAE79527C913CC02D0088C6D806865E3295AB0E33D10200 -smlen = 3206 -sm = 26C2A4EFBAD72B8B46B0588E512113431FE80076338A990F2181E4C16EE75FDF33E34ED9D400D4A764F00966BD15B7E8D506DAFEDAB45CAE014E06F984232E90003FE2498EF2EEE4D76E0A01E56F5049E683444A979B9DF8679A110DF8FB00ABA9E36693210F8CFE33B91AD16BCE68FDD70101D3E4A025203DFE6AD8849DAEE7B3D77EDE01C66DE60F310586ACF9C327F7F9A9845E5304019EC9FC7DBBCD032379B6A5CBA748ABC8B83C011F1E6266E9BBEF08CC3CFC669BDE5407C64C011B91DEAD4AF8A2F8E6DD1B64E8D61C12D02E0115B421A793CF71FA25D3BD5DC1F41EC5E6AC006EA6516AAF4FE81CD5B919C78DD6E66C3832017CC404CCFF99503427A813A0FDFA428D06A20100C1D43A59A6303C5E5C23CAF8D46B31986FED374969ABC42F47C01104F972F1D801035A200372BDD56FB93F4947C45BF9DAE47D4B0093CA51899CEB4F79B2536D40098903C07185E0343DF2A4201649AD5DE4CFFA20BAF5DD43F5E4A6C81CD5143FE72865A7C036A2DFD617D96626995C12EFAD019FF44E0EDD7028F29E3657EE3C0D02E9CE83EF0A648FD7CF183A7BF7C15095E0F9278B14FDF6C983CDCF2987DD0CC085400906DCD0D14ABA60124F4B7494ADBBAE3A8D6052122575F99792F7240EB17864DC6D231721140E43F1110E73EB2E3C05049783B33AAC4E4CA0A248775BAF81FDB03D114508928BEC3169A810296B5A4DAC27E7C7F8D01CF5943CF4D8CF6EE6F9042BB300E50EEA3224D35C9628E38C368EC3B42393FC820371DB6557216A2C2D5A230FE3A7C6BCBDD89A2BE5CDBE7F783BA379B6A4237DB051E6256DCE14DCF641190A956E8E85EB2638736B899ED045636DDB7A351F5A4F4108D9D6E0413F92B9D392495299128A5F4ACCE8C7747C675EFE05ED7182DB51C515B345029440AB61A904D2A390122680C951ED4575515144C5CA80D6F14D1CFDBB5373B78E09D04D0544151CFA1240790CD31165048D1484DC4D11D05057071DB3433DF071B367E00FD38C386DAB689E4DFF6FB421B2A95FF54DC29375C9D1C18A76C79ACAE3D3F35D4CFC385199A4CCAF6C9F0421BCF58D296EC7E0D1B95A6C4BCBAC1271F94E438360A71A6440275591E41389B30CAF2626A865B9E59552CB198A1D4453EBA6D0F6FC491A8A7783B4A8BAEB81E54F9189CE493EFC1C5D830A4F637F2BF43CD86B91637611415C95685FE79966174312FDFBF33A646625F97521B5CB1F008135B824F1D6D8373006C7158E62B1F794AE34548A0C6DAC8B60C559D81580AC0D84034A501516EE36CB4082732918365A5AB787FACE591AB02BE6957AE4BB96B58E2B173DA019D3E0CABEBEBA0AF775779F14BFBA8F595697731522DF3C80CBDEC16F6ACC32659CF5DAF193178307887EF1BE1B48B5806D0FA9868A7FB853708B26873857786B974709C687D6597BCF6C7E476C1E47CAFDBF30B6311ED434C0F998C4065399C59073C1F2BAB1D46104E74EA6C976D416E58BDFD24CCD957CB431870DE5DA8763992EF68BB18075926B0E4E826095EB3B8CAE086FB1759C94B873A1F4DF477E0EE9EED8DFD7C77508B3F0C67F69BE04355ABA9344960639F6DD6B3A956DCD66370338617A365579C5993986B4F748CB7C990344B209785E22A40FDCF8F83061D37C9F1351B4473D6C74ABE6B3EB2A7D62CA0F0C88A0AA8A46973F781DF0126E8D55D3E9C41C2E3884F84FB0A06C484CFA0C9A0DFB8CFD573749C711C7C236B0F2F144E1BA4DB2525C093DEED29434FE43CB3040C5A374CFEF33214FDD2D660398E91BF070A4F5F9746C2F08C41256FD5E955891146FFD38B155987E6A0FC47AC2A5950509B9E2C86B9DD9929378F43EF3935F1562672498C5640A22315BE15B001D4B01418DF8EB41DFE5C570E850582D8916C2E7FC2B728048E24BB9D1E8283615E039C16A2FC61011631BBD8F2BEB24ADF9552CF5797CE05D9D1A7E7F3F5455017B127D9BACD32BAD0CDBD3991BBCAEA5FC988EE7AEC0B1003732F25489EDB0A1F9897247CBC40E60F1DD276259CE19DECCB90067F7293A68B683FB5232ACD2217B8929859109D6852A43892098630A67D72B1CF4BD5D58E20C5C18B85D69DF74EE8CC69BAAC7DA48EB71A160F03B68C6BE87A4919736F14363F004EA3F41DD37FD8E621BF433BCA71E17565E060F3C0F889515D0A8C17FE0D6D734FF756256B0A62058B95422257780DE000557DF289F47910CC272A14BEC737C0715F204C49F03150082DC904A5D170F7383F04F1E355F50F80D5461CBA53490BB2E9484806D369D61FD00ED1EE5BE518D04A24503B1C4C08C7CA084902A3942C04143807203287A985EB3FCAE3C5309410CD9B9A548F54DED44321CE8C2A04679841DAEF7FBB6AA11091D240AFBB467D9969C31C1CBF6B24F8CBFA20CB4CFA404B1310400271664763E9C1CD1B6FE5FF2A0FAE22AB14EFC016CCBB19C5DD5D047750DB4ADDEA3E7A193128A5F4D7BB6358F21B39A44259695904DE3440BB28CF9466B562065C387189EAC2F7522C9385DC2A607F6F9335FF8ADD47C7BA932659AFF69B1F26EC8655BEE4F97FBC846E48111CBE25524873D1DB2F2282D0472A2AAA3CF491C26DDC5E1BE77866A3B692E417E6717A4F4454C56F97F063B9E598865B6F71136D65DDB0F3CDEC57DECD5A57366BA96E4315A88B4EA3479321468FFFF508D23B0701A62CE0CBC0FA37C91CFF5C5A0433FD61AE11A922575F5BAA714DE46A58D6EFC79BDB10C9AF7E9950A61D44B3E17E3B5298501146485B562B1570FF5798B47641D67091CDF90902B2D762E3EFE94C540DE4A28269CC416EDBDDD4D43AC2FA82D638DD9BF11F3BF22FD81CC4BD4759D7D864EEA0E8E8AB71796254B278CF9B650D1FEF38B8437362B2D69ED84C54498331C6899E20C596FEE7CAD9ED8D83D86774AFA6E56A4ED34B0B0842B21CCB67035406DEDFF0CECB0CD089929ED5FFA0CE210822444808BAD99AF603082BFE5C98EE4653349F8A43DB64CF90190C96B0446CC9CD23E0D75B47F54A731E8BCB0A4C67401DEE87876011033D2A526067FB73786FBC1CE696130FCE5D5379CDAC6788875D27C04783B1E2EF41063D57E3D6560D1FF48882C39131C95BAE5A9C9392DAB6CD17EEFBCF61C464A4DBC08447443CBBF3FA80481F3BC1A5806042C07F7A7AD435875DDB1001565EB6B7B872CC6C853F771C1DD5D9C16BC27ACEB3C7690125C1907C7CE904852108CAFE76351269A3D3EA8812FAE4FAE35F0DAEC8E8B186F760005524998BB5DE475E4DF85209DA915BDC972218AE7DB7E2EFA05A7D752AE61CF2F3DC26CA2D282C8E32B4838524BE460971E077348290FA0043FB7616D821A71DDA3A5FB76BFCE0DC84AAEA432DF32B05133A26B46165297EBC45024777A868B8B1B0DD6F97658BE799BD366CFDF99861E916F7CF06C034E4F79594F1BB6ECD9B7347911488928E1E473C4B8C73297F7ED845B9EC59020373EDA57A436C1C9D1459C6114BB6258543D8F4F97B10AAEF5A2E082EA173EE69702D83711FEE6AEE8F6B260D03AB74C3B5D8FDDB81B208E16458511270DD1DA295F25CDE7E44A8349B60BF0C59D4B425C1FBA60D2BCBA47B906D2830D8D5C091DBA756E61620D78B2DFF28407FDC9DA9113CBE82219BB2CC05E11C70D040BDE821AA17B3E981558961CA571E5D5041F7DE047A1727D9C904DEEBE561DC6DBD8876BC77C27322F512D6171BC03871EB0FDECE70F119BACB41D1852220CFF26110EB0EB78E39AA1B2A4C2E78679F53683520C5A57FEA71A8E96E0AED33118DC4BDD035FD88F535B011D9C7DEB6F406A072AE6C091016ED10A5A4EE9827882EE27C535262D1D745AA5231736F2DEEC8A6017BF0DA36B416C98AB71C6824A6EEFF3564665007C9E850FD02A1F5E201B534627B92D21A493DF293DB9F24DE70C7B49A6E07ACF2DB6C90B448681666DCDA318C08AAD08D3E257AF7E774C75DEBE3B3C07AF683735E87F205B0FDE07351849C5AFD07D5722C6AA17B6AC2CC3551C305E6AC31E3601A236961F6618CD3A0F7DCF6F65B8EC82E27E44C8518CDC16ECF79374F796A3DAABE2D5005B25576B35B021497C5A8F9B98DA68D80E56A1CC1044C04DFB11D36CB147EABFDAAFBA0A93FCED8675D7D6A9F999785C0E7346F4C68EB17C0A2409E2F5BD4AC5551FF66A9857C66F642F2A385131377B6372884C417E01BFBBE1CA748AC8969BF2C0BD8944767746D1D57D862795E8ECF9E8A5CA122D0259FFBA822588C5ECCD14CC6FF4B7354CB572F5BD695ED9D85DE131FDD97DD5D6CE7844DDF9F3D112028B5125AE7A77A4AEB2EBB554682A26F457C43FE96D67C90BE7E49FF443478E82D3A48680D737D1260B8210BBE962EFAE6505E496B1B6D4F1042A7B971605E2DC50BE3BDFECC3010B9F5618D3A1B2C1F48888B859E4D6B63CA9D29990B6D502FC22B738B203A83D597B48D73C41860E4E99C57181F5B02F108CA193451025F3B368CF2741244F42B27CB9E57260D2E127CA166B32E0B9C927B247B31619B1D4 - -count = 87 -seed = EDBCC4F6AD0F30066947D678A368B960CCD164889D77730516B444ED2DF10B49C101902F5FA227377C3163A0045B34E4 -mlen = 2904 -msg = 836254422C7D13F1120012FB9CC7CDAA1D8B72F6FA3943AA7DE75263D3DF814BBF2E80C3A204BC0F9AE33E4FA82CE893D35C57E41C7147602BE12455B00B7949A3195264A3281CECC3FDE34802B28C6E1F2B505AB6087D453BD6AA067B2370124840BCAC4605EE4F14EDFC4B4FF19A4D7A828E60156B49B4027AC18DCCD20294F89CCF03D0CF47BB2F22D3749EEE69EE17AB5D8E4DFCCF36824D23E3F95E959D0494FFBC712CE3975E3A661B3F9E149A0234F691C2D820000DE97CC016C43EFE958DA469F740610FD22B64D4BD2E30075E22BCFD4AB41D952D2394FC629F016EE1CD61AAB4581F62A7B8648F8F8CF02462C81023CBE2755C91195A5917FE5A8B5058ECB8DAFF91DD3F73FE38665666DBF79CF6F203FAF94A5CA3F3AFFAA2C2BD5F5DBC011DAF46FD7CEB74B5875E4B5D80B6EDB9817106B91865267E78731662218C8EDE73E588256FB1AD57232AA5533D25BFC54452612F0C2AECAE6DE19355E1D508B888D18FF9F6D7D68199755CF5C210172F65342269ED96C77D80AF8A244B43A99DEB49B97A6F358AADFCFF6AFF72AB39540D375165185F31E0F1A6F97722EE365620BC5D642F8CDC59F7E84FD8615F4A336ED340BE6ED8451997D87B7904C1B9A3A0BD1F8A01AFD6A2D9F5B995E3FD0D44DF8FBC8389B6CBB5537816C91F0EFC3D2349F15EEE747B254C5BBF9418BB979294423DD6DE4D13484408362582A86D082350CC79EBCDCC05B70110A038736034CE4F3DC1D17E5D11C9C7620D40730B61437906933193D1272F7C89C701D495ED682F1335B7E1C42C994E090A67D932A8E825F4B9EDA8F2A94B9A1F11F10E91396908A9D436DD01BAE1D1DE2C6ACF458C0880E3F81ADC2240A99E6083C9C188982713DB243028AB07DF407218CA6B3C4C93989AC96D92375834B915B724F2A105D6240E52B9D7003C67FF76F7A325D84ABBC229266BB40D1DC8784CE1A4A6BD17972CDB26C274B06337D525F61B5BF952D23FA13757460B7B8A3B99EB023831F4FBEF72D62931348622041FFD12634947579BC6E16BD1EAA8E8B2DFD54D74EFCED79EF4FF31AD42036DEBD0FDA3B7F3F8E7A3F45955F82936A67122CD42E38AF646CF565E294F422FAC1E7D274185896F58E9D0FA1FCD3F4D379ECF5B566586246216556939BDF86D6A417C3BF77C64F95D7DE8197EE25B44EEF00209D33159710DF001372C3E3D09F24B9B08B8938C522690674A7588933E1CA37D2C14DF50777806EF6FD2285771A44F6DE90475C6CC314DF140C3962DD9D70C54E58CC5FA3302D69C80C6511D9D42A51B7CB7FD7FEA8D8BD65A66FDB2AC80D945FB7EC72E138F5566CEB570968D84B60068DF20C6CDA2AD48372DC97424793FEA8D2136923070C25F47C3D10839D1747B613B93530968D5E97A3FC0F563BFFCDE7B42C839EFE66C3A8655D0CEB5AF7A37D23DBBB52D05CF6FCBFFA7C7491703349819AD94CE218912557D6C87937B2E7B0473856EC78713C29A02CF7B2B38E0DFE16804AF6C2BA8607026892138011E06B4AF179D63DBD97CB917B6507B798E58D74F485D3F063C044211E428FBFFD5AF2D7941900299602D3B15D5D600B435D9A21948B8D87A35205A3AF9AA9BA491D56573A93C35AF6683655E04A7A17F1B9709ED83E70D82A3DF59A2FB7C051ABE508601F322FFEC089C49DC666BA04366C038AD59D397022F0F6344255F4D98BBB17120441CC75107005A74DB35459C63770547A4AFE59F2703894DEB67612448BA7C4F6FEADC1717F6ACE410C6BE62AC319CD33AF285D17D55F500E364A0ABE71D357AE0802AF464B6D2732F3FB94BDB3BAA497F2E44727BDCCA5A4B65AE9DF189FF1AC640940FF4D479A8072D34ECC523DC8FC7C87FC89A540485AE7BB3F29B041446CA427C0B48CA7515A1E31788E8B53E1122D372B6557F8D2A97CDE893B20E60283954E2934AF340A358A4376DD0CFCBFE305A2CE7B72DCFE2DE105CF44833F548D1BCE88D34B60BD29B69309DD87F4B91DE10EBDD7D7F87D6231307D0AC784E0496DB725AB97656C34E60B34B230F37E30FE326296C4E1BB88C0BAC261DF0E5F45E6E126103EED6B1CA146D58140A8893D847E92D9F3A0A883E8BF830147CEDBDC7DD42C1A58A826A8A827F9AB26ECCF64F68E9CA6B68261260B659B47E0DEDBF5B077982B24ED9B36E8466DCB21EE69B5E2BCCC49A163B4860EC2CCBD65032776DAE601E18ECDAB8E35C2760D5758592F6CC074298A97FC5E82E7DA84036FD10E0725A0E4E58CC4DB30499ABEC0C7D95D88BAC2C58EB093312779BC1B8619FF2762FD1FF009273456D829394664C31FF6D7848B27174B36E59FB65D6BEF6D974D5038A28F49AD465B28857CC12BAAFFABF3652C2E22B46B040E579FB040A0FB4B1DAF0C157D35407C0B78E305CEEB232E7B7426C95639B1CF7B079E80521FAA538E51E69255576650C3A16E143D0F815D2CC89EB00AA13AF20394AA23CC6AA99A9F297D886AB9AF2655D53816E066A02CF21C277DADDEF3D7D0825D094FD8FBD5386139757EFD0B7F8501829725A4B70FF1DABF2958E07ED21DB76266A88483EE7C51A7D215E1B41D2464911ABBB1DC71F9613ED5446E4B0C97BDD47F22B372FB7662956FDCF3B108E0107F74301A054FB004925B041AF354C04C20FD370CE1A014EBEBD8311F3265A2F78B48124521A4AAE240D3BA9F94FD33CA4A92D24A029E0754831869B58F670435A44DCDD7BF75ED9FF06DBA52980DCE49C1C26BA0965DE3623F459E36127AC6AFAD4D5598FC45A95173D039CBBE2CDC7DAB2865FB6BC0FA8DFD33C4A826CFC77BB7F45CB5AA73377A27271AE41630DD3D4E2722581537FCFB233E5AF8F04CA824012B5C429EA498F4AD44AFC249DE2229FD7266FE84173A5CE44632B3650D6E1F278625D564B374C10C1AFA3F17432CBE4B65327C6B6E0CD2F99B68AB043C5C6C99D7FE7FCF940F4887D309D7BC0FFAA5DC4B90C79266514F46CA2D5477F2B84B04E30DCAFD0224170FA6D4BA9AD2A6DFA8ED73DFF9D5D40D43F02610032719A7C5646CCD453CEF409B4325F3FB6D9B9201FB115E4DFAA0B4D29959A44518774E94B2D4D6D06C7F065973BECD203F5CF6CB59F869340EC6BAF0121049DB3E1146234CEE4657C1B821AF817DA27BD4C9B1103C81F5B5161E6A9329D83D6E4DAE1F3299858CD201222D34A85E2991BDCF32E9771F3E701897F647D62729C9805CBF118C9FA727B056A7271A23181B92F033DE1EF113A856A884AD527B8DEB92085AF3DB509FDB0265FBA3376B31BF753DFA477DD5E247D939109F31CD430A692BCEC4D9FC7C5B4630CAB90C64B75496BC7CA54D5621FE3315AD03EBF1AFD6D436BD2DBCBE707B35F916CFC147BBB5B8AD2E80ABD692834E42E0724C8B901F5924212C4129F7451B9DD860A85855D1AC59F0B6B87A66B6A395DD81990AA3DEBF64C91CEA6862B5793BAFFF81677FA2928E950D94A6333B0E77A15AE461E710BE70AFCB9FE6E0C21C5AD188E439A6E5138A2C5AD17126E759D48491E3F3F93F81EEB77B7B3A6ADD96917CF0BEEA202EEA5ADB3D5593A3DC9FF1F8F05DBF5A2707EDBB6640EFF5B65A0003CCED2EB480942A13C1F1CCDF9994F1D11DBEF0D3BA7C3801AA508C17BCF287A928B635F475195D88ADF9F4C1CA7D3D1462DFD0F6939B89E5ED95F177BBB12253391876492BC01AFF1C1DAAF0A1C7821C2A4E33F52BADF51987E010B391FC984328E020206EE98E9C8E6763120055F99725E48356FD800E11CE973D00C800C353A5DF8B028E1E42F817C7433084C440E47532FC639172533DF35F0FF43257841C3E4EC7DD7F601EAA81E9886FA3253844C195A62F89FA5D292536BE8CACD80C94BBCD1A83C985936353C9233E512431A8863D7D8340E89307547BD10B16BF2C7E0BB01AB8093C70E4F4C8FD30608FA14FF072D81048391C07DDD82475A280D4EDF81F739AD1A13BC6483C3C37BF52ED52CE8D568AA81864ACABE225BC6467C79FBF43781F29B0C508E6825D4E56D25E45A8C0C6298765069FDCC66B2C5492FDDFFF69D6F5975FCD81041F30FFD7813BA3219B3139583EB588DDC57851E581FBD5E20127EBD -pk = DD1308F4F73F0FAB6967730B548EEBE01E0162033FAF5B852B824129E609AA6994AACDD3C10A276CD6D933556E685D7366A359A7FC7CE83B2969B7DEF8292500EF3028BFA339A5A0A0DDB533C21EF9B7102DF2680E97A34F2BCC33E5BFE8DF93F03FC18E13849B924EEE68120BDD21C06F8725F95B8118F47CC5FF1C4DC92100 -sk = DD1308F4F73F0FAB6967730B548EEBE01E0162033FAF5B852B824129E609AA6994AACDD3C10A276CD6D933556E685D7366A359A7FC7CE83B2969B7DEF8292500EF3028BFA339A5A0A0DDB533C21EF9B7102DF2680E97A34F2BCC33E5BFE8DF93F03FC18E13849B924EEE68120BDD21C06F8725F95B8118F47CC5FF1C4DC92100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A016FB516E7C05869B4F8F0C19539669879588D91E5755A111DBD2F7FEE5D53C617E2C941D0906928E47FC5ED39F67CEE8A22886DA81F23C066F4DE5E6FAA4E85EADFD2DC42CEF873E33A1307D89B0F4C38C15AE1E834A3CB0C000000000000009F77FAD86F05557FCDA08BB76CC47AE5D55F0C8A129B9D1EFBBC09BECA262897AD388693727C41C4855B154602EE32DC006E5AC50202EA899F24BDE7DB88AFA2018140B6FC2DE6E31FE4230E9AC2ED53D67DC31309509081D3EEFFFFFFFFFFFFFF3F482D8B6E03AE0D6DBA20F262A76DD7001C43B31494D3059A71288F4F90F1B83C2772F1E349EA7925903E37B09788D8F638275FA337EF972AD5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA944A47C6167C93A483F779F2016AC2B6BEDE82C3D73D3F45AC704C02B70AC33B213694C37D984EB3BF62D04625EC1F3247E75C9739E5DE42BE03000000000000000000000000000000000000000000000000000000000000000000000000000003FE3A022F3262BCBE3C90DAE587FBBC3AAD16D3894BC95899C43213895E3CA7042B08A2DBB8877946D25F5B415C9426274762C32BFFAE2CBAB2756D3D421000B79CBB82E2B12ED66E7CA8BCDFF1A4EC80EA04A6608C4110CE8458DC612F5AE87AC5BEFB63CEB54BB6D72BD9441568D1D21F021A25F04DEE1C0E804A0CB41C009231B5A868A222E2A8E552E577A6C7346B9BA28644550A08902328E1684604723B7D81D8C6DB0345088FA0E8784F7D49C788E4B22290D53A5A6F21BBCADB1400C82F880117A4205777A861E3B0028B40175062FA655DA91095FAC7E2945FEDC11BED8FA14A193797BB33EE6D60C23C7531C88841D3F2A96B4AAD4F04F4A20B00190712958D964DD68AA3149E1E705942901141FF702DF1DB7DEF0340553721B214217C1C2116A58017C0233C1825DB465BD005F1BDF8E621F6C87044CF0D1D00E857B6C6EEB734FB093891911AB5E7966E0B7B4621045108249AE3B91139D0E988DC15893CB278A2185DA300E39589C17D461118681E01E9B20D80C9C4A20A00126F80BD195D1E00534130BFAAF4EFAF688F3F417ABC97BDE12259A60AA9F81216F6F58ABAF9A0DE84B7D4B8D043B647E07AB9113E98883C9C91F40EEB070A003E31A98E8932CC3F7A1C600C4EEAF25B6461F55CA45EE6A18537441271D4E64B0E9F8028B6CCBE8973F9D77BB9ABCB1C7C61F43CAAFB5C243A8F1E70626810004F98D6B4E09655C01FCE5F79921D1AEF12943156BB55DF0CC706208B11713082DFC614A7BDC88D9F6245CEC0E301E6F686D02637E928AD33B3232097559B0700581C73C19995C4E917DC191ECF3E4DE829EB677FA75C2A8B01891980A557CFBF1DB942902CF0AB12E6F766E1D061BC2F00ACAE4A6572D141D66516BDB0A71F008161D2967BB015DF013302206FDA3BB7D39AE5F4D6D06EA18E93790CFA23BDDC262337B616A4989534D6A9FA7834DB8E8EF7BC4E90CBCEA665AB14C390A5060087F85931A0A8A5517F225911D94ADB6CABE5896E3C903F82F58A34540A5D5B3199416C9252494B96C45C0442587431391E3561154429577C9A6C6FF9664506004127CBBBE436730E36DF4414697D9A6A3B1480B448F8D4E09D5236BF9722C8CA3D2F3407AFDB703A2D5505B22D67DB2235C7F5888BF721CBBB7A63E248B92300EF57D4965DBBB507F6181341683399C80E511679512BB6B17B2A82E83DB1DD2A15195F8BB794EE13ADE05C3D68E68A6CD94A66434EFB6ECA0B52A612E9CA1600 -smlen = 3239 -sm = 7499BCA04B0601846A0391F81DFFE631A10500CE60E59942DB3645C9C2619901BA442C8C2C00FD860C78AE5604E5F5057BB4B3181E2A23E200E2630CAC020B3D88AD19FD99FBC3C76BCC450063765088FD476522E6BE7306C42E6C7A4AB701E0C7A649D12CB4C3B48E3367C5526ECC103400DA2EFE2603E06BD609703035BF080DCA30FA01CFA7B2085BAEDF09FEE1435E961FE66A0B92017D9292EFFA8197D87853B78A301F8339C33B013053C90BF16138316C2D02BEB28D0C533CEB007DF6EB40A1F7E3611AD85E40F357EEE6B551004F5B2313BCA38AE33E28FAA57A43E2D6C78700DAF1CC82378B334B134DAAE05D489F079063016C246C7CF0EFD034317A305F3C38B76103CF0101FD3123FD4F458A0CAD3BA56CF22395B51155CE35EF4BDDEF244D8E9F6329C64D070381E9C922457CDDC3DA1262ADF480F0441C640162EF01D5D1757EE6757CB31A08AF01836254422C7D13F1120012FB9CC7CDAA1D8B72F6FA3943AA7DE75263D3DF814BBF2E80C3A204BC0F9AE33E4FA82CE893D35C57E41C7147602BE12455B00B7949A3195264A3281CECC3FDE34802B28C6E1F2B505AB6087D453BD6AA067B2370124840BCAC4605EE4F14EDFC4B4FF19A4D7A828E60156B49B4027AC18DCCD20294F89CCF03D0CF47BB2F22D3749EEE69EE17AB5D8E4DFCCF36824D23E3F95E959D0494FFBC712CE3975E3A661B3F9E149A0234F691C2D820000DE97CC016C43EFE958DA469F740610FD22B64D4BD2E30075E22BCFD4AB41D952D2394FC629F016EE1CD61AAB4581F62A7B8648F8F8CF02462C81023CBE2755C91195A5917FE5A8B5058ECB8DAFF91DD3F73FE38665666DBF79CF6F203FAF94A5CA3F3AFFAA2C2BD5F5DBC011DAF46FD7CEB74B5875E4B5D80B6EDB9817106B91865267E78731662218C8EDE73E588256FB1AD57232AA5533D25BFC54452612F0C2AECAE6DE19355E1D508B888D18FF9F6D7D68199755CF5C210172F65342269ED96C77D80AF8A244B43A99DEB49B97A6F358AADFCFF6AFF72AB39540D375165185F31E0F1A6F97722EE365620BC5D642F8CDC59F7E84FD8615F4A336ED340BE6ED8451997D87B7904C1B9A3A0BD1F8A01AFD6A2D9F5B995E3FD0D44DF8FBC8389B6CBB5537816C91F0EFC3D2349F15EEE747B254C5BBF9418BB979294423DD6DE4D13484408362582A86D082350CC79EBCDCC05B70110A038736034CE4F3DC1D17E5D11C9C7620D40730B61437906933193D1272F7C89C701D495ED682F1335B7E1C42C994E090A67D932A8E825F4B9EDA8F2A94B9A1F11F10E91396908A9D436DD01BAE1D1DE2C6ACF458C0880E3F81ADC2240A99E6083C9C188982713DB243028AB07DF407218CA6B3C4C93989AC96D92375834B915B724F2A105D6240E52B9D7003C67FF76F7A325D84ABBC229266BB40D1DC8784CE1A4A6BD17972CDB26C274B06337D525F61B5BF952D23FA13757460B7B8A3B99EB023831F4FBEF72D62931348622041FFD12634947579BC6E16BD1EAA8E8B2DFD54D74EFCED79EF4FF31AD42036DEBD0FDA3B7F3F8E7A3F45955F82936A67122CD42E38AF646CF565E294F422FAC1E7D274185896F58E9D0FA1FCD3F4D379ECF5B566586246216556939BDF86D6A417C3BF77C64F95D7DE8197EE25B44EEF00209D33159710DF001372C3E3D09F24B9B08B8938C522690674A7588933E1CA37D2C14DF50777806EF6FD2285771A44F6DE90475C6CC314DF140C3962DD9D70C54E58CC5FA3302D69C80C6511D9D42A51B7CB7FD7FEA8D8BD65A66FDB2AC80D945FB7EC72E138F5566CEB570968D84B60068DF20C6CDA2AD48372DC97424793FEA8D2136923070C25F47C3D10839D1747B613B93530968D5E97A3FC0F563BFFCDE7B42C839EFE66C3A8655D0CEB5AF7A37D23DBBB52D05CF6FCBFFA7C7491703349819AD94CE218912557D6C87937B2E7B0473856EC78713C29A02CF7B2B38E0DFE16804AF6C2BA8607026892138011E06B4AF179D63DBD97CB917B6507B798E58D74F485D3F063C044211E428FBFFD5AF2D7941900299602D3B15D5D600B435D9A21948B8D87A35205A3AF9AA9BA491D56573A93C35AF6683655E04A7A17F1B9709ED83E70D82A3DF59A2FB7C051ABE508601F322FFEC089C49DC666BA04366C038AD59D397022F0F6344255F4D98BBB17120441CC75107005A74DB35459C63770547A4AFE59F2703894DEB67612448BA7C4F6FEADC1717F6ACE410C6BE62AC319CD33AF285D17D55F500E364A0ABE71D357AE0802AF464B6D2732F3FB94BDB3BAA497F2E44727BDCCA5A4B65AE9DF189FF1AC640940FF4D479A8072D34ECC523DC8FC7C87FC89A540485AE7BB3F29B041446CA427C0B48CA7515A1E31788E8B53E1122D372B6557F8D2A97CDE893B20E60283954E2934AF340A358A4376DD0CFCBFE305A2CE7B72DCFE2DE105CF44833F548D1BCE88D34B60BD29B69309DD87F4B91DE10EBDD7D7F87D6231307D0AC784E0496DB725AB97656C34E60B34B230F37E30FE326296C4E1BB88C0BAC261DF0E5F45E6E126103EED6B1CA146D58140A8893D847E92D9F3A0A883E8BF830147CEDBDC7DD42C1A58A826A8A827F9AB26ECCF64F68E9CA6B68261260B659B47E0DEDBF5B077982B24ED9B36E8466DCB21EE69B5E2BCCC49A163B4860EC2CCBD65032776DAE601E18ECDAB8E35C2760D5758592F6CC074298A97FC5E82E7DA84036FD10E0725A0E4E58CC4DB30499ABEC0C7D95D88BAC2C58EB093312779BC1B8619FF2762FD1FF009273456D829394664C31FF6D7848B27174B36E59FB65D6BEF6D974D5038A28F49AD465B28857CC12BAAFFABF3652C2E22B46B040E579FB040A0FB4B1DAF0C157D35407C0B78E305CEEB232E7B7426C95639B1CF7B079E80521FAA538E51E69255576650C3A16E143D0F815D2CC89EB00AA13AF20394AA23CC6AA99A9F297D886AB9AF2655D53816E066A02CF21C277DADDEF3D7D0825D094FD8FBD5386139757EFD0B7F8501829725A4B70FF1DABF2958E07ED21DB76266A88483EE7C51A7D215E1B41D2464911ABBB1DC71F9613ED5446E4B0C97BDD47F22B372FB7662956FDCF3B108E0107F74301A054FB004925B041AF354C04C20FD370CE1A014EBEBD8311F3265A2F78B48124521A4AAE240D3BA9F94FD33CA4A92D24A029E0754831869B58F670435A44DCDD7BF75ED9FF06DBA52980DCE49C1C26BA0965DE3623F459E36127AC6AFAD4D5598FC45A95173D039CBBE2CDC7DAB2865FB6BC0FA8DFD33C4A826CFC77BB7F45CB5AA73377A27271AE41630DD3D4E2722581537FCFB233E5AF8F04CA824012B5C429EA498F4AD44AFC249DE2229FD7266FE84173A5CE44632B3650D6E1F278625D564B374C10C1AFA3F17432CBE4B65327C6B6E0CD2F99B68AB043C5C6C99D7FE7FCF940F4887D309D7BC0FFAA5DC4B90C79266514F46CA2D5477F2B84B04E30DCAFD0224170FA6D4BA9AD2A6DFA8ED73DFF9D5D40D43F02610032719A7C5646CCD453CEF409B4325F3FB6D9B9201FB115E4DFAA0B4D29959A44518774E94B2D4D6D06C7F065973BECD203F5CF6CB59F869340EC6BAF0121049DB3E1146234CEE4657C1B821AF817DA27BD4C9B1103C81F5B5161E6A9329D83D6E4DAE1F3299858CD201222D34A85E2991BDCF32E9771F3E701897F647D62729C9805CBF118C9FA727B056A7271A23181B92F033DE1EF113A856A884AD527B8DEB92085AF3DB509FDB0265FBA3376B31BF753DFA477DD5E247D939109F31CD430A692BCEC4D9FC7C5B4630CAB90C64B75496BC7CA54D5621FE3315AD03EBF1AFD6D436BD2DBCBE707B35F916CFC147BBB5B8AD2E80ABD692834E42E0724C8B901F5924212C4129F7451B9DD860A85855D1AC59F0B6B87A66B6A395DD81990AA3DEBF64C91CEA6862B5793BAFFF81677FA2928E950D94A6333B0E77A15AE461E710BE70AFCB9FE6E0C21C5AD188E439A6E5138A2C5AD17126E759D48491E3F3F93F81EEB77B7B3A6ADD96917CF0BEEA202EEA5ADB3D5593A3DC9FF1F8F05DBF5A2707EDBB6640EFF5B65A0003CCED2EB480942A13C1F1CCDF9994F1D11DBEF0D3BA7C3801AA508C17BCF287A928B635F475195D88ADF9F4C1CA7D3D1462DFD0F6939B89E5ED95F177BBB12253391876492BC01AFF1C1DAAF0A1C7821C2A4E33F52BADF51987E010B391FC984328E020206EE98E9C8E6763120055F99725E48356FD800E11CE973D00C800C353A5DF8B028E1E42F817C7433084C440E47532FC639172533DF35F0FF43257841C3E4EC7DD7F601EAA81E9886FA3253844C195A62F89FA5D292536BE8CACD80C94BBCD1A83C985936353C9233E512431A8863D7D8340E89307547BD10B16BF2C7E0BB01AB8093C70E4F4C8FD30608FA14FF072D81048391C07DDD82475A280D4EDF81F739AD1A13BC6483C3C37BF52ED52CE8D568AA81864ACABE225BC6467C79FBF43781F29B0C508E6825D4E56D25E45A8C0C6298765069FDCC66B2C5492FDDFFF69D6F5975FCD81041F30FFD7813BA3219B3139583EB588DDC57851E581FBD5E20127EBD - -count = 88 -seed = DEEE61A2FAC04E4D6B7A250124DFD91518D9B90A71FA02665E3088760BF69CB3CD7B6977F860A7026819D178623C9676 -mlen = 2937 -msg = BD2B4058218A15C008A4BBBA29592079583F684FEAD3E6B3F09ABFF0DBCA23670AE4496077D47945E5F1AC3CD4ADD5763581285D80DFB43BBA9C0730858293FF6A15915AB203FBE65C118B87EA37DFA1E06CBC0F24EBA3F43A8BE17FF1DAF4277CDA2CAE8AA924E852C9D60524B98306927746C4EB26DC9475E8A0D0F920F33E1AFF9D07EA5561E70865B2D8161B86FDD7638E7A72345DD72EE95BAE1EBD2C24D2A5510ABE3FC2CED397A067D215F6088D63FA63F2247427917E5C4FBA14F0A22A04FD0AC1D948507751F3523BE2B0A0CF2F96DC61F8187ADF646D6914667759D49A6DF9A327830EFFC9470CEC6C82EA127A8B0C6510203879FAAC4323145931E146D962846BB1A6E84CB2C31BC686E388C853413EA7D3EBF7C752C6AEC774637EE01F2817A5AF133928AF35F23FC3541FE7FA749A863A048EFED2F8CC2BA86520B97FDE0324C68D1DDDE1E430C30DED0B25664EA676AAC6B1F22925A40B319CAA37DD5DEDB99DE4D963630A6FB0E8B00AD8F2A2B9BCC497A00099A70A9DC190A2AB2A058930E63FD6DF342A625E9A095EE79137CAEB8885117C7A9FB8DF7A35D5A300D6F7EEE40578A7507EDC38A0D6522474E672F156FEDE7E1690C3BBDFF40342F1F3AD3C34325BCDBFF0A68249858C777551683A9F3AF225163C9323A4AD5E666E0A9F44C6496269038AAC5DC2767966C1560C5A09207406F3C47157D2FE5909346D8ACBFDDF3E3D19FE48B7C60E1C8CFB2EAAB19E736B2595D33A0AA034726CB6146A01EBF5CC72EB1182B9A4BCEF90A1AAF74079862CD775F8F773BCC490F6015B4D5469EE0BD95C1A32A1FBF283FCE1FBF6F8CDCFC1884F4D2A899F3E7A95414DE419D56462F502EE703CDBA007C3BB78F20243C35B882C90CB7DE3CAE3F0468079C546645977347BC183FB0A6CD24481391CBDF9372E2D6765B6CAF8EB0145BB269A47A1B4E2CDF9901D6AA284D919BA57163AB9929E715341BACD81F35BDBFF36D59A1EDABFF3CAD2C122386A6335348A3170337B94E4336B2B74E791981656CB5234A6F84DB4142D3F323000FA98BE61527F7548DAB6E83928E9DD2E461F08A5BB52F241BB42254E5746FCCE0F3620ABC69A6E275B5E06A333360F9B809562ED116AA6CC2334694AAA4169310ED6AF695678DE22D3E551DAF61C0A6C5F6C0F36FD3469A3B977F6D295E75ABB804A43E1E7AC4708208A94E8368DCA40856F1D43C9865D98F69F1C0BA9C8B33AC9CCD18D400D2559B1CDD82A0C875B5E136B97C02126C81A81EB5D1E421221564100450531DBD97BDA77C1B0186527ECF526CE6BCD0ADD5668382D984AF9277A21D40C06EB4BBBB0CCD6F64E90272FD632D47A388D301377EE745FBC9CB4C02E1F096DDF303BCA4E1FB4B6DF867676080CDFA6A29CEDD15003EE636DB8C74E7E293A087B1A5F62334585369D12D9876ED0F334C6711146643FD598F0D69BB3475D219D1F89066644897A9CC5630BC84C0CB5844087216038C8FB6750D0968D3D3E2D29D93639486C76DC045900AE1A13529E74BECEB3338684402BBC3EB36870E0B37584E9F309BFB0DD9B966F0BE1298DFE55D1A94A6767CAE5EB3120133B7D7B71C9F2A538A97F8548FB176B0E8923B14AF28AE26306214F1D392AE63C3736B9F9374CA10EBE93370C11BEBEB45D066477F374866C8A7208CE6DCEC404194BB1F833DE0AA4700CA29681FA0F72D98679DC3E1E142852347B01DAA08E5CBBFD242F7223600804E066FB5C98C8358370F5D390898FA44023A30F824F1C6A95B8E23308B4BE474D03E34CF72BE65F90D698DFE0D2828A797BBF8397EC87AB9EE00C76A1C7B3CED0100D3A1030136CAB9A69F05CBE58A4A56A9C700BC591B87783DE59369F2E62D5B885DA09F25835A6DC06F954C19B347724244FDA69E3356A4EF60F6A41CFF3BB7CB22ECB128415CD1B89A9AEC12B66F1EC23B14E7D7FD601EF7B000A0C96F386216F75710EB2C12817DABA1D1295E7535331CB90A9B0D8F7542E73DE2D93FE554063F57274DF27BFB39BC4B78B72A88473408086D8DF531E53B5BE018E076032D1F8EF86D7AFB8E8867B9D7728A25ACFB6856D83592CADA4494977678A9F4D134F49A8598A8E0F23D3B7A09B5308243410CA6F47E0BF8C43871600817460BDEB74E7D32C2FF7C40EA4BF924E795516FF7C7BC8E5FD5D64CC489F1894C6BCF0E9C312B1EE7E2BC68739372E7402E6AA2ECDCA39C18D7441F0FF373946559C475E37D4ADA64B98283E5A64BE7BC2D1A1C148D2CDB4EDA35F591D3A7E7CE15162F50FF1B025F87CBB82289FBE7F9C32DB8F23012CCCB87ACA7D758D42019B9A8C15F508CAC9284928F46F0DC1C1B6C6B4DA030DB9286FF8D3762EA4A83D096AE04F98E9416D3DAC59E04F9E4E4359AD76926BBD9570A3D5811F69A1C4345B646BD946D0168ED62A7A431D920D707D8CC7E840BB9CF13D8ABAE8196D9177E8C28CE0DD9EF647EAAF0D3C97E52CB31B560EA7067B45AEFB5EC2B7C7BDFA3996D1C7E467636BFA1BBE11D1CCF86B64ADE9FAF9287A23502E9FF711CA97D6CC09DE814A67BA6123A8E4E67CF6E8CB6F7B36621BC6192ECEE94D61860703AC8411B16E19644A6AB01813402629AF52301C9D76A94CEE22B1DCA49F13B130028991C8AB383C8461433383DA92AB34F1EBB4124B24C6C391EA44EE6E736BBC7A2D4660A878A600AE39B7DCCAA51ADBE90BD705EA51AD13C05E611749D43DE336D396352CB0673ABCE7473DECB0FC708EF28DCBE18C85EE0068FEF64685ACC3A7D0DA9A21DD0AFB10B95D81F6AE437022218B6094CE35D01248EA85A9EC6FB56A7A2A8453EB03E6CCBEA0F2EADB015D8BE3D09739EAC07AD9E3F17D13E5F71CADFA220ECAE90EA50BEA87B19CA6FC5DF31874D51723BECC80C8845C9EA718454D2817EF8AFD99B63090CBA6C8089AFA78770222FADEE3B3B829CF36A8153EFAF2CF28DC4651FF37A8921E402EF81A0F457FC1802AB06A759BF4071F082BFDC100AB612A4584B5AE19354854101AB0173D7D6A5A0637CCB58AE58978A8BEFD5A2C51D3D53150C336C0C0C2A27B442E2BCE120C4CCF8D97EA4584434A6F48C0245B63B2255BC52ADAD4EDA9279412D70BE457F7DCAC492FE53C06EDEED766B46EBC3419E6DA2A2847251F75C62A5FE7AE74F0DD5AF50A447DA6356DCC828C5F1A2C0C873E57041EB1158296C038B91F2E13D3D4B2887B284384A9ECB8BB378BB311F4ABB19E1B90EB3A399C03BFB4CCB29AAD80C55C1636559FC79A6C894B5BAD8D529BF680631541A45EB0E57BA5B458A05F456C60FBB593DAE90AE549416AF96642A486F10843482AFC3989BBD1E8E4DDF0791204F4B720ABD2D8995C87C8A388ECB14860CF83B7A4406FB6C8C9393475082D24E516C5F1AF91CEBA444D8E460D0695746BE057EA8D76F8C0C80358F3DB2AE5B996272737516EF5E4EF5A1FE5967304CB6D00090C9623D29F0D4BCE8CA3CBD54A30F9597E01E5845C1CDD8777E18C5D5D86492FDD0606F623D11A28DD9F02032E3A378C71B757B52021DCE6CEEC63792CEA24D6DD7150AC8FCFCA6554F7B08A5529D59628D0F35122504DD1542F6291BEDBEE09F81AA744A0F6C6DFCA6207FBFAB6B9E17E8A4040741F6508471E72D227D0FDC50C13F444310245AD17BF819FFBBC4E0485FA68CF1F0A4423F251538F25DA989ABCD008C803D368F626438432569F12D1612370E4C6C971079371081B37D8DF7EE709198AAA2FCBD443B96732AAA4E6924A461B60CA4F4CB13E88D539AAD709A3DB84D2D6D26671A9F3877125B7A358389BBEEA846A32E949DB9A7853DBC7D5ADD92729CE1B5C00680974F3DDC6A8235C7319B6CD1CE5E0B66FE7C2F1115206C42B4C02990D79EFA8BE94927543C19EE93D0EC8811F9330693696C878CFADAA2D56E877D42A3680AB2F6A576FDA7BF7957F781655CC664A0A4A0D16CE34D04D7C98A9E0C93D2E6D42870FE66864660B564ED4F881693D466BD68B6470AF03A5A6E703DBB40515AF5DCA7142C4C8D79F5BE4BB01A1B56BE9D0936396A7EED9A84DA86A4F00DCF676B4942D5DF6E1378EA26D9118A54E17FC623B83AADB417EC82F9AFCACEABBDCFE2F0B6AD4BC1601B4E24F547D61D1C1737ADBCB46D98287372C -pk = 71EE0B1A80C1F9B9C4FDCCBF4EA1D52F4B0DE870CE3EE9CBCFCEE317FB61FBE45AB6EAF3F3548482FC61F11F8BF13DFC768B47DED0042A4224B5E3A1934A1500D8A2629CD8A1611D5E2DAE919D38378EF0074016A93AFB22ACF00F3CAB91C4463212B3A800F3E04FF978A9B8300DF55666B40159F52C9B9AD162F6BABF0C2400 -sk = 71EE0B1A80C1F9B9C4FDCCBF4EA1D52F4B0DE870CE3EE9CBCFCEE317FB61FBE45AB6EAF3F3548482FC61F11F8BF13DFC768B47DED0042A4224B5E3A1934A1500D8A2629CD8A1611D5E2DAE919D38378EF0074016A93AFB22ACF00F3CAB91C4463212B3A800F3E04FF978A9B8300DF55666B40159F52C9B9AD162F6BABF0C2400020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001932D82ACDCC719FFF4A3E316B9DE259B426FA746B2CCFDC9AC6B36CBDFACCAE3A1B54D2484216BA0CA1B1A0108ACED2115A0266E461DCDF26AE6058F36F5AA9108B49D7E1D73E17C358BD2AF22E0A7878A5692C164264062DFCFFFFFFFFFFFFFFA446C2F6E757216C050A0909D9B7912FF50BED1BB12E86CE6823087EB17C917082028B1BB7A7BF2FC9A8AE809871C47B3B486E073FCF33F661ACC3C26C2DCEF1B830712EB884B6C7306E8623EFDC6F6116DD540CCE11A1E5E2EDFFFFFFFFFFFFFFF061999CDB8B0BAE7869E0581BB6B04340E29A22D5FCB0DCF79021675EE4BC2C72AD10D747F84D8F1DFF19B33BC731B32F44EC80372EFED8D142FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF3870E7225201A5DB7A878EC973BF265839A654C45DC321A3C095CCFA7B4FDA1C971F52F5DBAC2E468AEAF2DD9B95318C5FE740199B63912D36020000000000000000000000000000000000000000000000000000000000000000000000000000E395249C1EBECE5D89C8AE951DC253B38A4B7828767E2C323D322E028EEB5CE61CCCC58EBC03D4DF61DFCF2211CE603DBE89B507093169313348B8B6F5130600CC676A24454B427D1CF2BEB486DF7DBD541BC6FA13F3B78587D77A5F5214C3026A4953B1FDA0FA355C308CC0F3AA28E22F8E6C636C1D4E6F7234B3B599091600B4C8737697AE87C80532D2234B7D4ABEAD962423FE9E452FD758817E76B10CA76A9F0CABD4A880A6DBC761C5F56A5AF816E0D204B95A3A1CAB7EBFF3D1050A0001714B66B2DE327C154B11CF1F16BAF248B66C41FECD25D94038559994FE47C055926DE79D20CCC22DC126BAEDA858D1AB94E10AF30160E34A6445C1C04A040085939A1F576F1EC5F422DD15870E09CE8E46A239E637BAA1CAA2494D30DFE55F203C3F654D6A3600E66CEDAA0C23F4F30596E0195376E0214E7558D28082020051CD789C1231A300EA00E37394A71B11AC9A8378AE5CF266972584162ABCED559CF2C8644A2EE44F4D1043E8256CB60131251ABAFB5ABCD6B46DEC4703B12300F0B81DA3B8658C5AA79E15758B725873D25E4E80955E3A042CF4E81E37B9BBA0EAE77B343B104041EAB8089A402B35095C1EF86D3E8E600B36A7C519D67A070093ECFE5C64343DEC705D6C4B33242D0B1A3C65BE5B3A72CB3189F93114CAF4451451223B01783E28BE8F3037339D7EDF83CEF0D21FADC98B29285CDBBB2203002FCA77A8D8872FB94F24C52D294C92C8FC0CE301D3B2655A1F67DC32CC13F978D96E7E299ECEE88387110C1A7A99C592B77C09D07196C888022817C7AFAB0C003011C8CD7323937E37586E9BE719191EECB525045B185CED58BA3E39D1D70DFB2B6EF1C5FCAA5A6FC439960C5499357E06C99D0D251C6DAC7D31F87FDFC70000A619E727F021C3D0E9846A6D3E5E93275FDE8137F6F16B572A40C0614A2403D2977C6F2886FFD5B519E3F6BEECE9EAF26AE562D4CCC5B86B97A6115CDC6B140054B4536670A55C23597C812500ABD420DB16D3422D76DBB7B57AB4DEF7EA413E8AD77D0FCA3420F0A5902C9048D8BF1A4BB3855638E993CF88D13492903123006B612602B4486E7EED94C78F3320BEAF3B7C99AC0E280E04F046E1CC09D7E76B1538A7706E9B040236F9522EF2AA452813D09A691704FDC3F30A31A2A0051E003B9BB38BACA8310C8A47C791E0D669E69275A65F49923ABF061E5DDDB8A1E5DBBAAD5A1F6E808A82CEC3BDD91A9D2C5E640395880F51613613504707E0CA1600 -smlen = 3272 -sm = 100020120EAAF1835A219C0AD279A5290E26002E598F92791421171090D90175BB3D02A04001B30018C982CC435EE4A96C7DE798D1B8D6680190ACE5365557F4F9393BD3756CEF33FA377401822BA45F178B6EE936A87C1A1EC90AE221360026D0D9E699DA72DFB5CAFE4B430B73ED6CA800A30F6F36A4C734E8439DABF94D648C39ADEE00DE8906A853237FEABFF47649B6EA84B549A9006E392599D1319BF24695D5495AC66B37AC80017932BDFEC22C5CEAA2236A2D877BD6F1E22301BE529EEFDABE94C1BB7DCEF680F66E480C3F01E56D3F00E7D2188A25B5B3D3F9A06A77B43A010C4753B4C329A27ABD9A5EE2A5647B20EF4A0061CDDAD3DE216929C23431FF531F1AC558FC0100A9A667355BBA64FA4F884FA6147DABE926D6332827B93DE9BDDBCDAA654988C40203B900AA496D4100F3B9532F8782B7BFCD7DED01F92E503673C88E51BB37BEBA74E900BD2B4058218A15C008A4BBBA29592079583F684FEAD3E6B3F09ABFF0DBCA23670AE4496077D47945E5F1AC3CD4ADD5763581285D80DFB43BBA9C0730858293FF6A15915AB203FBE65C118B87EA37DFA1E06CBC0F24EBA3F43A8BE17FF1DAF4277CDA2CAE8AA924E852C9D60524B98306927746C4EB26DC9475E8A0D0F920F33E1AFF9D07EA5561E70865B2D8161B86FDD7638E7A72345DD72EE95BAE1EBD2C24D2A5510ABE3FC2CED397A067D215F6088D63FA63F2247427917E5C4FBA14F0A22A04FD0AC1D948507751F3523BE2B0A0CF2F96DC61F8187ADF646D6914667759D49A6DF9A327830EFFC9470CEC6C82EA127A8B0C6510203879FAAC4323145931E146D962846BB1A6E84CB2C31BC686E388C853413EA7D3EBF7C752C6AEC774637EE01F2817A5AF133928AF35F23FC3541FE7FA749A863A048EFED2F8CC2BA86520B97FDE0324C68D1DDDE1E430C30DED0B25664EA676AAC6B1F22925A40B319CAA37DD5DEDB99DE4D963630A6FB0E8B00AD8F2A2B9BCC497A00099A70A9DC190A2AB2A058930E63FD6DF342A625E9A095EE79137CAEB8885117C7A9FB8DF7A35D5A300D6F7EEE40578A7507EDC38A0D6522474E672F156FEDE7E1690C3BBDFF40342F1F3AD3C34325BCDBFF0A68249858C777551683A9F3AF225163C9323A4AD5E666E0A9F44C6496269038AAC5DC2767966C1560C5A09207406F3C47157D2FE5909346D8ACBFDDF3E3D19FE48B7C60E1C8CFB2EAAB19E736B2595D33A0AA034726CB6146A01EBF5CC72EB1182B9A4BCEF90A1AAF74079862CD775F8F773BCC490F6015B4D5469EE0BD95C1A32A1FBF283FCE1FBF6F8CDCFC1884F4D2A899F3E7A95414DE419D56462F502EE703CDBA007C3BB78F20243C35B882C90CB7DE3CAE3F0468079C546645977347BC183FB0A6CD24481391CBDF9372E2D6765B6CAF8EB0145BB269A47A1B4E2CDF9901D6AA284D919BA57163AB9929E715341BACD81F35BDBFF36D59A1EDABFF3CAD2C122386A6335348A3170337B94E4336B2B74E791981656CB5234A6F84DB4142D3F323000FA98BE61527F7548DAB6E83928E9DD2E461F08A5BB52F241BB42254E5746FCCE0F3620ABC69A6E275B5E06A333360F9B809562ED116AA6CC2334694AAA4169310ED6AF695678DE22D3E551DAF61C0A6C5F6C0F36FD3469A3B977F6D295E75ABB804A43E1E7AC4708208A94E8368DCA40856F1D43C9865D98F69F1C0BA9C8B33AC9CCD18D400D2559B1CDD82A0C875B5E136B97C02126C81A81EB5D1E421221564100450531DBD97BDA77C1B0186527ECF526CE6BCD0ADD5668382D984AF9277A21D40C06EB4BBBB0CCD6F64E90272FD632D47A388D301377EE745FBC9CB4C02E1F096DDF303BCA4E1FB4B6DF867676080CDFA6A29CEDD15003EE636DB8C74E7E293A087B1A5F62334585369D12D9876ED0F334C6711146643FD598F0D69BB3475D219D1F89066644897A9CC5630BC84C0CB5844087216038C8FB6750D0968D3D3E2D29D93639486C76DC045900AE1A13529E74BECEB3338684402BBC3EB36870E0B37584E9F309BFB0DD9B966F0BE1298DFE55D1A94A6767CAE5EB3120133B7D7B71C9F2A538A97F8548FB176B0E8923B14AF28AE26306214F1D392AE63C3736B9F9374CA10EBE93370C11BEBEB45D066477F374866C8A7208CE6DCEC404194BB1F833DE0AA4700CA29681FA0F72D98679DC3E1E142852347B01DAA08E5CBBFD242F7223600804E066FB5C98C8358370F5D390898FA44023A30F824F1C6A95B8E23308B4BE474D03E34CF72BE65F90D698DFE0D2828A797BBF8397EC87AB9EE00C76A1C7B3CED0100D3A1030136CAB9A69F05CBE58A4A56A9C700BC591B87783DE59369F2E62D5B885DA09F25835A6DC06F954C19B347724244FDA69E3356A4EF60F6A41CFF3BB7CB22ECB128415CD1B89A9AEC12B66F1EC23B14E7D7FD601EF7B000A0C96F386216F75710EB2C12817DABA1D1295E7535331CB90A9B0D8F7542E73DE2D93FE554063F57274DF27BFB39BC4B78B72A88473408086D8DF531E53B5BE018E076032D1F8EF86D7AFB8E8867B9D7728A25ACFB6856D83592CADA4494977678A9F4D134F49A8598A8E0F23D3B7A09B5308243410CA6F47E0BF8C43871600817460BDEB74E7D32C2FF7C40EA4BF924E795516FF7C7BC8E5FD5D64CC489F1894C6BCF0E9C312B1EE7E2BC68739372E7402E6AA2ECDCA39C18D7441F0FF373946559C475E37D4ADA64B98283E5A64BE7BC2D1A1C148D2CDB4EDA35F591D3A7E7CE15162F50FF1B025F87CBB82289FBE7F9C32DB8F23012CCCB87ACA7D758D42019B9A8C15F508CAC9284928F46F0DC1C1B6C6B4DA030DB9286FF8D3762EA4A83D096AE04F98E9416D3DAC59E04F9E4E4359AD76926BBD9570A3D5811F69A1C4345B646BD946D0168ED62A7A431D920D707D8CC7E840BB9CF13D8ABAE8196D9177E8C28CE0DD9EF647EAAF0D3C97E52CB31B560EA7067B45AEFB5EC2B7C7BDFA3996D1C7E467636BFA1BBE11D1CCF86B64ADE9FAF9287A23502E9FF711CA97D6CC09DE814A67BA6123A8E4E67CF6E8CB6F7B36621BC6192ECEE94D61860703AC8411B16E19644A6AB01813402629AF52301C9D76A94CEE22B1DCA49F13B130028991C8AB383C8461433383DA92AB34F1EBB4124B24C6C391EA44EE6E736BBC7A2D4660A878A600AE39B7DCCAA51ADBE90BD705EA51AD13C05E611749D43DE336D396352CB0673ABCE7473DECB0FC708EF28DCBE18C85EE0068FEF64685ACC3A7D0DA9A21DD0AFB10B95D81F6AE437022218B6094CE35D01248EA85A9EC6FB56A7A2A8453EB03E6CCBEA0F2EADB015D8BE3D09739EAC07AD9E3F17D13E5F71CADFA220ECAE90EA50BEA87B19CA6FC5DF31874D51723BECC80C8845C9EA718454D2817EF8AFD99B63090CBA6C8089AFA78770222FADEE3B3B829CF36A8153EFAF2CF28DC4651FF37A8921E402EF81A0F457FC1802AB06A759BF4071F082BFDC100AB612A4584B5AE19354854101AB0173D7D6A5A0637CCB58AE58978A8BEFD5A2C51D3D53150C336C0C0C2A27B442E2BCE120C4CCF8D97EA4584434A6F48C0245B63B2255BC52ADAD4EDA9279412D70BE457F7DCAC492FE53C06EDEED766B46EBC3419E6DA2A2847251F75C62A5FE7AE74F0DD5AF50A447DA6356DCC828C5F1A2C0C873E57041EB1158296C038B91F2E13D3D4B2887B284384A9ECB8BB378BB311F4ABB19E1B90EB3A399C03BFB4CCB29AAD80C55C1636559FC79A6C894B5BAD8D529BF680631541A45EB0E57BA5B458A05F456C60FBB593DAE90AE549416AF96642A486F10843482AFC3989BBD1E8E4DDF0791204F4B720ABD2D8995C87C8A388ECB14860CF83B7A4406FB6C8C9393475082D24E516C5F1AF91CEBA444D8E460D0695746BE057EA8D76F8C0C80358F3DB2AE5B996272737516EF5E4EF5A1FE5967304CB6D00090C9623D29F0D4BCE8CA3CBD54A30F9597E01E5845C1CDD8777E18C5D5D86492FDD0606F623D11A28DD9F02032E3A378C71B757B52021DCE6CEEC63792CEA24D6DD7150AC8FCFCA6554F7B08A5529D59628D0F35122504DD1542F6291BEDBEE09F81AA744A0F6C6DFCA6207FBFAB6B9E17E8A4040741F6508471E72D227D0FDC50C13F444310245AD17BF819FFBBC4E0485FA68CF1F0A4423F251538F25DA989ABCD008C803D368F626438432569F12D1612370E4C6C971079371081B37D8DF7EE709198AAA2FCBD443B96732AAA4E6924A461B60CA4F4CB13E88D539AAD709A3DB84D2D6D26671A9F3877125B7A358389BBEEA846A32E949DB9A7853DBC7D5ADD92729CE1B5C00680974F3DDC6A8235C7319B6CD1CE5E0B66FE7C2F1115206C42B4C02990D79EFA8BE94927543C19EE93D0EC8811F9330693696C878CFADAA2D56E877D42A3680AB2F6A576FDA7BF7957F781655CC664A0A4A0D16CE34D04D7C98A9E0C93D2E6D42870FE66864660B564ED4F881693D466BD68B6470AF03A5A6E703DBB40515AF5DCA7142C4C8D79F5BE4BB01A1B56BE9D0936396A7EED9A84DA86A4F00DCF676B4942D5DF6E1378EA26D9118A54E17FC623B83AADB417EC82F9AFCACEABBDCFE2F0B6AD4BC1601B4E24F547D61D1C1737ADBCB46D98287372C - -count = 89 -seed = DAB6C05E29342106CC34769BF419ADCC88010C05B57E673A503E63AE7A4EE55B72AB2CA86C4EF57FC8C02D2E0C8694A1 -mlen = 2970 -msg = 4D83349DD620DC2CC0E9ADA524B9BE9B195973A839A042F4342D69E6B38918507A9747FCDD8B751D7C75ABCE2B482B3313D4C74EA4E7A4A91F2E08A059536B651508307B7F4C3AFF5CF1579F90F32BA1E847778673E3956713C14661AFA2D11CCF61FD8F9BC914D4B6E6D09C52AFF7FEFAE325C180147153C9AE1924C9A2B8DE4900BFBBC6797558B000C5ADB9A8DC4CAFB458AD328F19A2C55D5434BBFA7BE5057E56511529709992BD6527E913B46ABE38DBFF90D4AB3C024A66FC0F8FB34AFB96E22535A0EA8F313A087AA65355D7D5989C486E103FD526A7A6D812C0E4D8C081BCCE4DCFBC64B68436739451BE0C4B67BFCA71BE955BA9F9A23C223C7D0FFB1B2196C9C9845B6AF341A363951E2008BDC4F3296DD0E1E3F480F2E4B0EC77A002ECCFDABCC58D24CB0BAA26EACE96DECAA0F6BF1CDE0175AFA65AD5C23C5E71B50DF778208EDBE426AA6E876C12440D7C4FCCB42D039A14509092784BAAD37D9B8EDF186CD4FCB3D9F8B0397E951777D602B8AF613060FDAB6B358302B3FD28437A06694F36CE12A035F09D677E48D077CEFD1676D8FE51541BC19E3A6D6A5D879C4F9EB4713B7C0F3A652F3A05D74DABFF79A302FDAF147531FDD57924F49E52B298219B03D6DF166B481F232FC85C7CF52838969CED2DCFC18DD8C95891C498FB49289D1A982922A0FC02C849AC3BB7FA92CF43A64464D5BD919F75ADA287FE657BF61DC07B3808C0FD0D71EA24DE5353268B2C17C989C29465BA49111CC479F51A8CC623CFB6FF68149E52C77A7D85B5ECCE66C05900AB9957BC7ED39E03649A103B5B6BFEEB168B7C1F30DCA84AEA509FEC2B215DD95558A2708839396552F517A8FDA28C3ED61F84E1B2E0DCDFA708DE50D44BFC65BD4E70260C437C8B5B7158EC7E2301D9C7AAA68E0ADEF89FDB601711AD2998379145B29CE3681B513DC3BA9B2EB668C1B53697833670466E21E767361C0A4362E5B8DDC38EE6A9C4DC5205EB808B93C72FFAFB635B4254E4F4496BACC753C8ED0BCAA88DB683CE77C8165E8DDDE665392CCCD57BC07573D83CB3AA10648281EFB08F92AACD8AB6F9B5D7FC66D29526BD57E421220FFE375B26C61A0DDBD9807022EB3B4B681A43E7719F5EC255C1E19AE6C542D6DEEF3B94B6960C18D0D7C8110B88F995826073B874042FAF97F1FF034B8257418CA269F5CA588223393B0179F9817E08E7212D0D410EA259EA66BC4A00E7FB1190A732BFDBF7ADEA0E4550BE90C3E37BF33BAF436955742A2632AEDE259235702EA2E079D99A22C9755ED34C1E3CCBE746E728A932B1852F692B103112B303033AD3CE1172AA066860DF570D21EBBA51FAB72D5AFC4AE8995F532AE384CCCC3C4A295AF76A803FE076CCC920A80D82A9B614760EC43208579EF5DEE164356D62EA33953E55195EEE9B2E2018E6FD9D19A9F49258702DBAF6EDBFD093919917B1B6734F012E2BEB4F758DD481FB8A8D7796E755C6647501E28862B9F5B16FFA1C5D80DCB07141806FC348881A5A8891BB632A4AE4292A102D71504D0FC12C79D15BCD0799D30C7B9E72625A7DF7DBC7ECF9EACC627CA9AE5D71E264F2F2A9D5DB8593F3A90F3915CE480ADF800C99FC2C8692F2B57B492BF9D84171F8C29AF8D5549F82D3730927096CA18FF0B0C0C0B8B800508C44D5749B92D7D48F7FBD5C86E408ECE0EAE639AF475073DF5CA2CD5083BC4FF8852DDF5C399946A6B21B0841D137F583E0DDA3A6046F082872B783ECA3E14B21A2AF61BB150847026F2371812B1A2BE72024226F4613DA860AC2FFC578DCB171DC27B896EEFE49F885F9BE4CC8766F37038E01CF20DBB661F507B2ECF2B023203A6259B0A018FC00B2CA9B3107B605F04388D5493AE7CC4BDD093CE761A92847C2A167739E0750B427B2ACEB3ABC5FF751A5F32D36B589787D4DA509C85EAD751353AB2C68A9C14B8B2C8166AEB6F27C7F101221C306AAC74AAB6B4E795525FE12038725D7AF3D2A6D60E1EA85F2B94EA24F1B72FED9DDAD4C8E5DA484E80A2150DE22E6ADEF41153D7B4331E8F011A3CD48DAB02876B067312D0DC736E465F99AC3C9C56321507E79ACCF652E3857C749AD92DAD15350A6B4B67229A3905DB18AB2053E2D4F92F156A1D76D0AA891364002C991E632B53FA217AAC1709F37F3402F43B0753361EB2F595F9FAE3D7D96FF050DCA0B9657F4C3AB49EBDBFE8816051C4E0AFF32C5137749D53B062CB61F7201171B5DD716E9CCB38D00E50955596845DFF602200B30D375A854CA4E9A7276CA1A1D9EE92A04BCD78854BE251F7080ABA6D8325D40B37054596AD80211A50AFCC1DBC177600A70E648D8BEB4FCB8919214894CDDAA6D63B6F6C445469A6866721D4BF1117F25DFF9D65FC8FBE5B0ACC8B9039C7F94B2A5CC6068A0489E2E13A731DBE1094FA8558A601ADDB9E4DAB04FA744CD5B95A9D57C52C8124AD950A5944DEE2C55E5C8540DBEE5823DAA624F57FD5BE994BAB3AD4E74EA9443F8B6024BD6B49ADF3972442D88E61E04FE8478FF28916584CCB65FB15686991D5781CB7EDA067745258EA671E0A2665F94FEA1B5490669D1EE8711518BB911094957586C8075E3BBEDC47BE059053A7658ADFA0ACEABDD46E0DD9647B34EBA32E56B6305653ED386C50E79E15084F00F003B1D12504FDD8E47D03D9F7572276047BD22B82B8E81F87C86E6F20D2A756B16F291179A97B010F993C0F839C9A1238CFC9BDE8074405CF1B35DF423C7566CE965681F21C969E4F3F8FDCA72A18D5DAA80287F53B5F8429FEA81612CF63CCF1B7A13512DB4D1DD2678FE1189398032EAEB4368332972C728AD726B7290302C3C5ACAB6E73432E825B9046F846ADCA9D93780A36095AA5C51E354CC6E9A910CABBE59130E98F4ACB3CB6D4EFDA9E2F78748ED58465937FC81C548AD038FDC32AEC46B078CC5A7207658A9706F1C9653359DE6C4457DBFA71D300F98F9BC5DAA14DBDD5EF20DCEDE7E9D3F7DA5C932AC3338BA40E46B17D89FE38F725129991983D4A81321B394F2D7B20D66E3DEAAEB6FEFC8CFF0B68A766E27CCFBA66DEDDB1F541DEB3C1892ED2AD5D073162F0DD06B82E8878477BC96E03101C9B5D9D0ADA10EC060B45E144B31E6B4DE283FD43538B47178398FDD15B01ED421EE2C65847F7A4E9AECE2F1D13971FFC0157040782AD4B591DEA0906370820DDE1000490AB1C27C03D02A0F4B4BFAB0E56D7257288441CEA63175CD6BD11382E6C873154332E627CE82E37C63889EFBD8537AC35C21AD7A09C986CFEBF13B19D5677C1104B373F3B55198D075AAC608145FF9D0C4C12C83BB41036AB32227629EEB4922F172281A66C23C35B8A3E92DE0A10D5E8C18B9A54D6C30230F3A8263986AC535B6BF63EDDAF6A02C9100B712EC4BD49851A22AF0E647F259C2E19B9ACAEB6147C476C90745A353F6252ADE8212A9F7C215C0B3053BF2B4E0AD225E8B344EC14C1B839877349C3743E8337D9C1EB128B06939C5A08F60A46FA700723EB6652FC26440D9BDA3C99C10AD0742C2F039BE6B66749B77E14F8223509365053E87ED870FE3906A16DA6C62945DD2112C96A23942B1E14431AECA7DFCE3FD4D6633E0B661FB34B0BF05C4D21E689CAC9B6ABD9F507F08E4AAB94BBEF1C629C0E1CF344E66D3A3E100B615BF762DFF0CEFC5E4CCE0DD908F46C94E7411A151E713FE0C18ED33C4C03E55E12C0AC366DA5C757C7090E0F94E2C34D93EA3B226ADB2979D23E071F18C2EFF33BCF41BAAF52F4B44E38675DDDEC89C7BFE858BFD1AE70D96D0487972D70F8D8681982656FF734BB6323AA91EA14C6330C71783D235D9F094CB111ABC4990319BBF163891535AA5F870164DA65FFF395DB68B390084D4F2448B98CD56103E49CAAEB6CD040C3ABA8290284E9B2BC423117F4104D89B1B1607C6D34AC30AA9E79D8753B97CAE90ECADA6CAFC6100D3D6D91E20393E0DC95B981FE0EDBCF88E046F74184A96705AC226FD26089468E432D525643293BDA781B64BACBDFD6C7301AC42AED7DBBCE7ABB9D67AF315BCC3509CF03523FC887E27EDCBD7C74DADFD0F126CDB49E28ECAD38080F18A775E6D824C18359935D921744EA72FE293F299B530D9DC9285EF174EE60E2DDFFCCFFE89960BABA90D955CD2C96672513C758142D29A1AD79CA9291BC6782B64717F11A71E6D65A1A71D -pk = E3314280D1E9D0FBBE474A3AB093C1B450BF93FE5DF9E8BED7501F1173DCEBFE4715D205AE752A4A9CAFC07A005B55D65F81F95A24BB402093A8E3BFEE352100CFEECD44A655F83C69DFAFE96B6E18B23BA598A13E75014DCEADB964F4DB611F75425FD74B4362D8B186247E4AB1A14DD690E67D18ACC69DE0F90D6970A50000 -sk = E3314280D1E9D0FBBE474A3AB093C1B450BF93FE5DF9E8BED7501F1173DCEBFE4715D205AE752A4A9CAFC07A005B55D65F81F95A24BB402093A8E3BFEE352100CFEECD44A655F83C69DFAFE96B6E18B23BA598A13E75014DCEADB964F4DB611F75425FD74B4362D8B186247E4AB1A14DD690E67D18ACC69DE0F90D6970A5000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D85743F5F28313DF7C533109D4E4E28BD1049012B21F154CFB2139D60608B3130F522C7A272A10FBADC73989B10FD71AE4B22D61875AD8C8F115501ABE57CC43D12CC27DDEB4B27EE01B93D12D6CC10BB409973ECF83335E471600000000000000235EE331C6A4D54B1568932684FCC1931E7952D36FC711F1C2166D8FFBFB70837B30453FF536B0407A05F908A655BAFE85C10531D254DECD4AE9E6AB0BB1FADC9C1065928996A9C023C369B569F9BBA4AA39F64D2156A0B507F8FFFFFFFFFFFFFF356431A3410B48CCAE3BB2314C0CE4D74FFC651238176F97D9A6BA6D6168100F7845B051EF16F5F4A043B457B50F01BFA8BF27E6E9C8006D1803FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84D1FDC7FD0AB75E65D9C571305D07DFA6DF1C4EA35D2DB00B57317DFC683E8C5FB8823D382569F61C02B2A128FBE58BCFB59DB27DBD58E6A245020000000000000000000000000000000000000000000000000000000000000000000000000000FA0D90F8B822434A27FACC42B500D18288B5CFF1580FB0BF247A8BFBD11735549ECD087D32EBC6CF73810FBF3FB9B545476E748C78A29CBF7E3C5B89B5FB0600AFE08615BA8B435BCBC5DBF4C01F73574CBBD3AFD62D2371049B707260A9FF1EADC3D304299C7492BDCABF07A7C1E1E16815EB3196F9975F23C328DA793C0C0089459F356FF40BC603E01045DCF9510FA0C2766F599C431EE8E607FA91F35048E981A4E170AC0FBA1051037EEEDE9B9343DE6F93B6B3B673B8C22D8C96690700E4200B3865EA5DE3CF81996090C24180C599932ADB52FA7C18D15E85F8809FE2787DB7F347E78ABA22471898794D46F97EEAB3FFF9888E8BE57DC54F83F41E00A447558AA01B5FF25FED62A4C350523E2607284EE45C664964BDAE9D6CD8D7BBA25B6E99E15C145A7D062C5025A00EE6446BEFAA6F20B5288A7F8710DD8C01005E58018B6245A10C6C169988DF93BD180832C50695391A0368B3E497FAEF9E6FDE736C925DD67579E32C9B55E09C37E067AE2E1236D5282E1A63BC4DB4D619003D24370182160DEE732644370C0A98A0FBC861BA8AE7F68BA99C00AE437BD047B4898B40C9FEC3144B753707D8DDB0ECDB8120ED123082FC1383D85AB6420800AACD6320E8E4F4610312162691E3A9A77A2FA83CEF5D81D6ED4EE50A5F22EA978109AD7FAE3633E8085961B4C8E26D1BAC547DE14DCAFED2044FF8B2DB7808008AE873DC5A0A2F677F12AFBB9A58CA25237932F041FA67D0E4F3F7F1BD665B529590DC1ABE61771776FD667089B2B5F15884DB3CA25743FAFD70C641204E19005C3FC0FB29227A19DD0ED2904B285F702215AC2CF8E74B90B82E35D688B38694F2C0F3A1939F99B5DC07C3801AF2C9AE2AEE8AC60082B489DC7B571C83A40B00F5FBA914D1FB21F801D2BD5B816B56044699CC21D4EA2226F35D9C32EE8EA66AE6135F937BDAFB085DBDA13C225095974C403D5FEC03E393690B5948D8761300FCF6607809AB5FF37BAC6B5ACD26A8139F13A96474C75110F773A78EAC87CB427F580EED05B7E053BC2694A21153F0C5D3373AFCA3211AD45669016E61F907001F37622D89B7D2B6621F0278D3FDFC33CF4315697B1000CA4812DBF30311121412A93C5D436F5D8ECAD6C6ED2ED2BEC2A92D5716022CBC2190A320B841C61500C114B1E77D53B072FAD7346F55E9FFCD9C74D5EE0313237A3B0BA6A67D08370FC6ED919120E66EE9B495E3ACBEE8D31708813879846501CABB188135308B0E00 -smlen = 3305 -sm = 1E211B865C53FDB58A7B6F087349CE58B61301D3C1B288F93B0F2C4617103C5BAD6950C9F400B051444118D1BB3FEEFAE783C07BD12DB1B200E908DCEAD96A6BBD72B0C07BBF508A77A99400570E29CE629313EA84893F7EC884DD0FDE080127B828C40C7275822269229C1FA59021B01400277CDA785969D88A61EEBC77A752808A3AD5018EEDE99A60705050716AC636ABC2318C5A2001C485A19AF1FB01A275EAAC3F5EEAD399435E0075780D65C8399ED3A79B9D2E821A02A6BBB4019EE8B41CE456FFF996F318ED098149AF836401FAC9B07C22E5CAC774D2457F7B1D44D6C31801E456E4D3A329C6735923AC6F48CF1BFE74D200E10E4D98B0430735D04C7EE31873BD8AD93E0001276F78AD4BACCAA1DD3EC0AA22B4522DEE46EE2D4B2ECBCB4B3BB4FF9C8D52C60103670BC57DEF97EF58E283B8788F78F41B28DA0153CAE1A60624FE131DA53895994C004D83349DD620DC2CC0E9ADA524B9BE9B195973A839A042F4342D69E6B38918507A9747FCDD8B751D7C75ABCE2B482B3313D4C74EA4E7A4A91F2E08A059536B651508307B7F4C3AFF5CF1579F90F32BA1E847778673E3956713C14661AFA2D11CCF61FD8F9BC914D4B6E6D09C52AFF7FEFAE325C180147153C9AE1924C9A2B8DE4900BFBBC6797558B000C5ADB9A8DC4CAFB458AD328F19A2C55D5434BBFA7BE5057E56511529709992BD6527E913B46ABE38DBFF90D4AB3C024A66FC0F8FB34AFB96E22535A0EA8F313A087AA65355D7D5989C486E103FD526A7A6D812C0E4D8C081BCCE4DCFBC64B68436739451BE0C4B67BFCA71BE955BA9F9A23C223C7D0FFB1B2196C9C9845B6AF341A363951E2008BDC4F3296DD0E1E3F480F2E4B0EC77A002ECCFDABCC58D24CB0BAA26EACE96DECAA0F6BF1CDE0175AFA65AD5C23C5E71B50DF778208EDBE426AA6E876C12440D7C4FCCB42D039A14509092784BAAD37D9B8EDF186CD4FCB3D9F8B0397E951777D602B8AF613060FDAB6B358302B3FD28437A06694F36CE12A035F09D677E48D077CEFD1676D8FE51541BC19E3A6D6A5D879C4F9EB4713B7C0F3A652F3A05D74DABFF79A302FDAF147531FDD57924F49E52B298219B03D6DF166B481F232FC85C7CF52838969CED2DCFC18DD8C95891C498FB49289D1A982922A0FC02C849AC3BB7FA92CF43A64464D5BD919F75ADA287FE657BF61DC07B3808C0FD0D71EA24DE5353268B2C17C989C29465BA49111CC479F51A8CC623CFB6FF68149E52C77A7D85B5ECCE66C05900AB9957BC7ED39E03649A103B5B6BFEEB168B7C1F30DCA84AEA509FEC2B215DD95558A2708839396552F517A8FDA28C3ED61F84E1B2E0DCDFA708DE50D44BFC65BD4E70260C437C8B5B7158EC7E2301D9C7AAA68E0ADEF89FDB601711AD2998379145B29CE3681B513DC3BA9B2EB668C1B53697833670466E21E767361C0A4362E5B8DDC38EE6A9C4DC5205EB808B93C72FFAFB635B4254E4F4496BACC753C8ED0BCAA88DB683CE77C8165E8DDDE665392CCCD57BC07573D83CB3AA10648281EFB08F92AACD8AB6F9B5D7FC66D29526BD57E421220FFE375B26C61A0DDBD9807022EB3B4B681A43E7719F5EC255C1E19AE6C542D6DEEF3B94B6960C18D0D7C8110B88F995826073B874042FAF97F1FF034B8257418CA269F5CA588223393B0179F9817E08E7212D0D410EA259EA66BC4A00E7FB1190A732BFDBF7ADEA0E4550BE90C3E37BF33BAF436955742A2632AEDE259235702EA2E079D99A22C9755ED34C1E3CCBE746E728A932B1852F692B103112B303033AD3CE1172AA066860DF570D21EBBA51FAB72D5AFC4AE8995F532AE384CCCC3C4A295AF76A803FE076CCC920A80D82A9B614760EC43208579EF5DEE164356D62EA33953E55195EEE9B2E2018E6FD9D19A9F49258702DBAF6EDBFD093919917B1B6734F012E2BEB4F758DD481FB8A8D7796E755C6647501E28862B9F5B16FFA1C5D80DCB07141806FC348881A5A8891BB632A4AE4292A102D71504D0FC12C79D15BCD0799D30C7B9E72625A7DF7DBC7ECF9EACC627CA9AE5D71E264F2F2A9D5DB8593F3A90F3915CE480ADF800C99FC2C8692F2B57B492BF9D84171F8C29AF8D5549F82D3730927096CA18FF0B0C0C0B8B800508C44D5749B92D7D48F7FBD5C86E408ECE0EAE639AF475073DF5CA2CD5083BC4FF8852DDF5C399946A6B21B0841D137F583E0DDA3A6046F082872B783ECA3E14B21A2AF61BB150847026F2371812B1A2BE72024226F4613DA860AC2FFC578DCB171DC27B896EEFE49F885F9BE4CC8766F37038E01CF20DBB661F507B2ECF2B023203A6259B0A018FC00B2CA9B3107B605F04388D5493AE7CC4BDD093CE761A92847C2A167739E0750B427B2ACEB3ABC5FF751A5F32D36B589787D4DA509C85EAD751353AB2C68A9C14B8B2C8166AEB6F27C7F101221C306AAC74AAB6B4E795525FE12038725D7AF3D2A6D60E1EA85F2B94EA24F1B72FED9DDAD4C8E5DA484E80A2150DE22E6ADEF41153D7B4331E8F011A3CD48DAB02876B067312D0DC736E465F99AC3C9C56321507E79ACCF652E3857C749AD92DAD15350A6B4B67229A3905DB18AB2053E2D4F92F156A1D76D0AA891364002C991E632B53FA217AAC1709F37F3402F43B0753361EB2F595F9FAE3D7D96FF050DCA0B9657F4C3AB49EBDBFE8816051C4E0AFF32C5137749D53B062CB61F7201171B5DD716E9CCB38D00E50955596845DFF602200B30D375A854CA4E9A7276CA1A1D9EE92A04BCD78854BE251F7080ABA6D8325D40B37054596AD80211A50AFCC1DBC177600A70E648D8BEB4FCB8919214894CDDAA6D63B6F6C445469A6866721D4BF1117F25DFF9D65FC8FBE5B0ACC8B9039C7F94B2A5CC6068A0489E2E13A731DBE1094FA8558A601ADDB9E4DAB04FA744CD5B95A9D57C52C8124AD950A5944DEE2C55E5C8540DBEE5823DAA624F57FD5BE994BAB3AD4E74EA9443F8B6024BD6B49ADF3972442D88E61E04FE8478FF28916584CCB65FB15686991D5781CB7EDA067745258EA671E0A2665F94FEA1B5490669D1EE8711518BB911094957586C8075E3BBEDC47BE059053A7658ADFA0ACEABDD46E0DD9647B34EBA32E56B6305653ED386C50E79E15084F00F003B1D12504FDD8E47D03D9F7572276047BD22B82B8E81F87C86E6F20D2A756B16F291179A97B010F993C0F839C9A1238CFC9BDE8074405CF1B35DF423C7566CE965681F21C969E4F3F8FDCA72A18D5DAA80287F53B5F8429FEA81612CF63CCF1B7A13512DB4D1DD2678FE1189398032EAEB4368332972C728AD726B7290302C3C5ACAB6E73432E825B9046F846ADCA9D93780A36095AA5C51E354CC6E9A910CABBE59130E98F4ACB3CB6D4EFDA9E2F78748ED58465937FC81C548AD038FDC32AEC46B078CC5A7207658A9706F1C9653359DE6C4457DBFA71D300F98F9BC5DAA14DBDD5EF20DCEDE7E9D3F7DA5C932AC3338BA40E46B17D89FE38F725129991983D4A81321B394F2D7B20D66E3DEAAEB6FEFC8CFF0B68A766E27CCFBA66DEDDB1F541DEB3C1892ED2AD5D073162F0DD06B82E8878477BC96E03101C9B5D9D0ADA10EC060B45E144B31E6B4DE283FD43538B47178398FDD15B01ED421EE2C65847F7A4E9AECE2F1D13971FFC0157040782AD4B591DEA0906370820DDE1000490AB1C27C03D02A0F4B4BFAB0E56D7257288441CEA63175CD6BD11382E6C873154332E627CE82E37C63889EFBD8537AC35C21AD7A09C986CFEBF13B19D5677C1104B373F3B55198D075AAC608145FF9D0C4C12C83BB41036AB32227629EEB4922F172281A66C23C35B8A3E92DE0A10D5E8C18B9A54D6C30230F3A8263986AC535B6BF63EDDAF6A02C9100B712EC4BD49851A22AF0E647F259C2E19B9ACAEB6147C476C90745A353F6252ADE8212A9F7C215C0B3053BF2B4E0AD225E8B344EC14C1B839877349C3743E8337D9C1EB128B06939C5A08F60A46FA700723EB6652FC26440D9BDA3C99C10AD0742C2F039BE6B66749B77E14F8223509365053E87ED870FE3906A16DA6C62945DD2112C96A23942B1E14431AECA7DFCE3FD4D6633E0B661FB34B0BF05C4D21E689CAC9B6ABD9F507F08E4AAB94BBEF1C629C0E1CF344E66D3A3E100B615BF762DFF0CEFC5E4CCE0DD908F46C94E7411A151E713FE0C18ED33C4C03E55E12C0AC366DA5C757C7090E0F94E2C34D93EA3B226ADB2979D23E071F18C2EFF33BCF41BAAF52F4B44E38675DDDEC89C7BFE858BFD1AE70D96D0487972D70F8D8681982656FF734BB6323AA91EA14C6330C71783D235D9F094CB111ABC4990319BBF163891535AA5F870164DA65FFF395DB68B390084D4F2448B98CD56103E49CAAEB6CD040C3ABA8290284E9B2BC423117F4104D89B1B1607C6D34AC30AA9E79D8753B97CAE90ECADA6CAFC6100D3D6D91E20393E0DC95B981FE0EDBCF88E046F74184A96705AC226FD26089468E432D525643293BDA781B64BACBDFD6C7301AC42AED7DBBCE7ABB9D67AF315BCC3509CF03523FC887E27EDCBD7C74DADFD0F126CDB49E28ECAD38080F18A775E6D824C18359935D921744EA72FE293F299B530D9DC9285EF174EE60E2DDFFCCFFE89960BABA90D955CD2C96672513C758142D29A1AD79CA9291BC6782B64717F11A71E6D65A1A71D - -count = 90 -seed = 0CAF47BD9AABD7D09FFAD404449BBAB2E1D48E80AC78550831A365BED8765420DBBE9A566EFDF20D4E5233D7848582E4 -mlen = 3003 -msg = E0F434DFA04EC225FF6B6DB802A047E221BC064E5BE89A5FC13937AE9D3F22B4439BB1C1BBA01547A64AB3E810BBB09706D01959E2E906A69FFDDF0C56726BDB58FB039D66AC5D77C7F0E9A8617B0C69176770DA328D38171F39B5220279186250139922C0DD0F7C3F96D48615FC66DB7568810931D257B230258FFE9CB35F87859E08139EBF7432E948EE3F962BB9015CACB8499BC69597ABAE4B841B606657E2E3C51FF5A8961AD42177A9E73950E3FA150439E2063B6555624A6D8E3AF4FD5710FBE722B8C6267BA5DF56846A085C56444573D692D5412CB70E443761751E58C41953BB9FAA3CE1F4564C825A02F0E1339CD659AB1480804DD2E90E3086AAA292DB39C6E2AAF1B001B47A21CC721C0C502C46EF0479BB7D8CBDF8E9C136397FEBC2D83C0FDBB3ED4FA6868068477206A26D2B7E0D20507AECB2756B888FCF5B446217DE14EE6A20CF7E7B732FAB22CA3ABBE81B2BE18463ACAA3132773ACD7476460536111CDCAC98B1CC9B2C36AEB3FB318340F7397B4B4AD6AA87EAC94AB7D98CC12EA5606162877465FA2CAD276CBB5D36C40A0B014C53D2D3A96825E237342DFEFAA6B9456B5FF1DCA859C5976F77C3D3CBC9DF355237EE9B4B4C90A9DD941294431DB76DBB539DC48669E7AAD21808332C8A4FE98B8F043FB756B526890452FA3C3527FCD584CD33E38FF9FF783538D39A184B7B3EB649E1C04C289FB65998F6CF5D5BBB0609FC3403D85C6DF269017032CD24AC540E1B294BDD3C3A0C7117CAB02B1A0063A174FF26FCDA687433A667322320C0DEC1EA3963F3B14375882B3478AED43C2C74DEBFE3A734F8B1A5CF92007F8FB627CC3AAD5C6AE4C31846B72E7573041270FF40E762C0F8DBCEB7512D44DC260A97D5CA7D60699981ED8476D8651C35C8ED498FC2961D1E38AF46F3653630773209A63838A9222B813C23DB0CF4196D6654126BA2B1840A7180E653B3D6E10C4C7AC3CEE93B0399D918A52E59F0215B09A119E634E6E8A9886C877F157BF7B7DD827ADEDBAF03C718AE037C0B262588171839E952721DE72180F8EED00B01F53E098B82165199C53129576036FC753A3D33AEC92060DD19AA078A496A2B214B1BFBB747A1EC64071B0A078D74D0212E6203C9698C7449326A42BCBBE8D9501DB916C64307D5F1083BCC36C0FFA18C0E4410B0B17D443481C3673D17BBD7A366A5FD1C3C5B3391A02EDA7596B4F869A91A32B5A02A05611371231BE035EDC716F534724B5225E1A72A2B2CD357F4C326F1DEE963FAB680721D40DD70B750A019E70885515F43946A0DD3DD042969139F61ECA0E9EE3107D3D28AC606AD53F236303E1FE986C38825318B7C4597B14E1A83B81295FEF49FD0F2C1E14A0B146540D853DB9706CD224B376343317BF7330B0C2721A409B856304FFFE60C24C441D5E2797D4696C0FE046D305AEE93CC6A2D89A81EB19643636A8B424B310034612105DF16516CE9607CC0A2BAC5835642C6FF9572191BC45E44D9B40DA36B607F570AE8C39D490342786F31CE6764F3F7A764665B6CB93E54922C6D89DB566F494E0EE069811AC82E8132F2F388D68490CB1C2172D2979FCE3659D7076B4F457232EB839172963F8C342E2CD18969F086F451D33BB774F3D00E6FA2BE02292F2E5CAD3ADF5DEC28932BD784801E69364962BF39E25455303E1F289052D2F0CD4964E0FFCDE29E7C074E5D57E43739DFA42AAD636C352D363E3A23BDD134BAABC7CD1621CA638DED7DB7051F0456641CA872ECDB4D3C2603DDBBCE16637010E782C4BD5230992E2EE7DD904F8A83EBAA7B4C3CEE15B10794ACE894118304BCDA9E9B1376331D2248B802557AABCF913E95F783715BB5E90A4436E4BDE7D651397A70A24257C39E0516BB1F548DA36C1F1F92A416DC1114107CD863F3BFCB360286E774B21296259756EA6040CB61738EEFE29A67895AC69797C640E03F0E9E731647C2DA93373920341FDFBD50EB6B737BB0D9FDA8EC8784920407D4F41486D8FC616430768D6431CCD789DEFF332B239FFD1900800CEDD9661A55D6D96089007E9089A117F03D7858EB4C3FE2D07E91D8CAB88D2BA5421846069FA6D4E5C9161A140CC3A288100BFBE61C3B0F0E820AB12D8FC54B054A0F4C777052495B45A7D1A883E67663DCF50C2230CA5319AB31CD76435DAE41CE1EE25ECD3FA0C7E83B0168852B2CAB674127CD7BC9DDF9DD4B57EB40128988C7C8994DC6A5FC939FF957F06C70A4056E63331F9AAD254EBF2B8FCCD580285BEA486D91A0C2DBD5823AC8F6846DDABCDE25A2252F8DA1AEB32E6969276BD2A7F94CD7DD3143F3181489272B1589FD385BA844F90E35982B53141DAEAED413054CDB935F3412E31D99C1147079CB487FEEE85E3906DAED18106B8C407BBCB7716EF9D4D34E2FF04709C7457997AD6FADC55A8FA70BC907815805578A11A012C521A1325754CAE2E3F7C9E1FFFDBD4BE31DC534961C318D1A894838E0C33806735DD11E408E500995B86B6ECD20D325347F792A3381D2A45587D9B6AE0AA27533732A6C421CA621AAC42335848D9C0DD89F14EADF2F92EC532756CD5697AD752B6260C598EC9F0E9976A950B22DAEA8B74FCC87F28B5E9ED83C0339E566259ECF06E5CE209065DE87FEEE5D1E9C466004B34583D6AE89B590EAD6A96CD2951705AC764F329E28C996AD6DB05F6C69AD2A39D3EE230F6501F1760AA41FFD936C9DBF20DE3996917322D32B946062A3C27D8BF35ECDA22403AB684CDC680DD166562D018D943369CAEFB9133A4BC4515CD5F9C08E7C22D153F0A7733EB4EB2CD8A74A4C85E40DADEF6858C5927B6EEB2B01E9B7AB02F7048C8869991068B00FC19B9545AB42181DD5CB5488222A402E827F60A8D87B09ECC88350032F998E3C10A88D4733227334812EC97C5E5FA85FAEE1A1E28A58641531B139AA58BEF49780DCEAA408986CF3C40E226C60531945A20F91E5DC31EC86C9F9A0545E5FCB79A13B9AFE9B133867BA7A38152ABC6D9F8EE10090BB71E6ADC6A6C2513B066F2565138BADA60B0BD339F9BE1AADDFC90DD272B4146D0F5830C6A53E295C849C15D001176E7774FCD7619D6EF1A30BA93CFE278AB4806BBF25CE4A4E94163F614E81DFF7EFCB015997F5138E22B80B2B00AD7579CD84DB5D1C7FB16E9E8C5D9A5BA0AD0E0A7DE79C18839D673632F3D2C7DA2062EAE844FACCAF23590B2FBF1861405AC347EB9D723ECBDE54CC96BC4D8EE2178F353310E5D69230C5DB2841D2A06A3A4E03E054D99DEFC6004A6E405FA89B198A901EA1AE9F3112A29F3AEC5698A42794E04D74D761E4AA5AD23DE271969BAF124450F4796DA1EB1C01480436AB0F5D0B1B2E6717DD87EEBF137420961F978896077E40B2D2EBB5664FD8AD89BB9333FDF46C33EF3BED21BCB5B4697451BDACF364F85462F5CB9F546657B4744EDF757DAAA4D3A9A2A6F281184C3576B1DB0B540F3B36310020BC6AC0C6454A7CC8EC1182422B17BDA202729C270194CD6044210D2B98731565812339EDFE5A0DAD79BA826D8C566C7D25DEA9BFF0BADF1E4E5DA2B884966E03FADC51C6D9BCFE877511157201DAB48AED1AB038999E5CC3FE58CCD37D40050DEE92E0BD5332413A7F0118724084EE5545FB51942DF1EF399F734FB9592555B5F32290C53D7E5017EFA2B61E29FDCE90CC3E7C1B0E545425B1D3E1ACB9089DAA786CB0122DB3FF27EA0367751A5462230F0F248147EBCCBA2E16D214E9A0BAEBE989BBA020F95B623CB14ACAF2BE6F157DFDB1E32627133F0D26C7B65A189F39955EE31D9B507B43126B06B9E4524732C8621D2274438DB7ECAF736AB7257CED950EB68BB868581649232793EC83379A16F40781E76F5CC57C48C3F5C2989BEA803E1B63768436D39AD19BB77DB46AAE6E8473ED5DFEC983F49E4B8E7CA6BF476AB2F0272C0C2DBEF1BCB064D7400BFE1B9ECCE13578A20B1D5B48133A74C5C59CAE0115BC3B50574580BFA99D58BCAD336EE2CCA5B7994C784BB90CC8F1B9A0E21B39D5EBA464DE34D46AC0BBE436C2F419D60D8AB13786F9A841B52710D1B49BEC290DE317B66B6855ABE156C07619A4B998CC582E3F54A7F457F1D2839BC3EBAC937AD3EBC6A9E6E845379CF1D66D7C59000E3F6CF6823B005728A95BFB0ACD044EB35D5ADBE8933A3637887CF91EE74BB910FDCBE797B0C6B1B056500542BD39781BDF13EBFBFE949D7BA0B7F31102E63BFC6E22693F97 -pk = FD247AD72EBF598FC4E4AB510F57579FC774A527C564D65C2432D95B7EFC8CA4753DE98E71400335D63DF573D828C4B4019FB5880CB9F1B41CCEDD2BAD0A2100AFA0477B44BE512EF304255EB5E53BDE317D7F7F39C8D74C6C5182B4F4BB5486E5E58DABEBB0F489F0328E4ED4A5D6442D85B1439933BAAEC6C97829FFFF1700 -sk = FD247AD72EBF598FC4E4AB510F57579FC774A527C564D65C2432D95B7EFC8CA4753DE98E71400335D63DF573D828C4B4019FB5880CB9F1B41CCEDD2BAD0A2100AFA0477B44BE512EF304255EB5E53BDE317D7F7F39C8D74C6C5182B4F4BB5486E5E58DABEBB0F489F0328E4ED4A5D6442D85B1439933BAAEC6C97829FFFF1700020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ADFF70B5B3D7AAEC6E1713010FB8BD8C73B115786C6BBFDA27EB22D1304648264C027CEEA2A8F2846B0CB64957925D2F0BABEE609474C1B8F8F49FFC3BFB532FFE20969009DDA620A1BD1AE05EBF85FB658D985A1D0866F4CFCFFFFFFFFFFFFFFB55B04C1005657E06F2C637D0301F05F5908797B46EFE4E15E84EC026FC3E4FC8EB8FA56C8FF662AF672BDD90230EB190623FD837A8AAFCB3262171D477DBB97A5C2490102613787C1CD60B986F7E268DAA3BE9653296CD3E2F8FFFFFFFFFFFFFF156EACDCF9DDC7E42860A411C90A59DF2A6F4551304C0560B8AAFB55AACF1F66B412CBCF7246ACF5BBAF069F017333048C7C74C90DE8388B5FA30000000000000000000000000000000000000000000000000000000000000000000000000000006A987083C1A5D119FEDE48FFB2CAFBAE61EF087D7FA68CCF892275A833CBB33229A0F73DF4D34CD9429B9623FF208AF7509A808D99B9D3DB6FD00400000000000000000000000000000000000000000000000000000000000000000000000000007602A94CF315589F1752FB301A23B043316ED8F1E9635FD430AE5779B90A1CD9DE21E0159DFDE571B83C47FDC494A84F53537AA99DA1E8F1C9979F1BB877190094772D8612B63D0F0C54A5CF1CF0F1A5DCBC2D2618F141B633D2C8A18AEDE3F494DA9524007FE7C6A4F1AB1A4F1597290F7985793994EDF30275AF6C1ADB18004FB5ED9F18A84675CAD32B4D0FC06BE8BC3F3BCF225AA130E67BFB15EAFAFC9B8B452F5DFBAF3C0B5182BA77FE49E2B3B5A602F46865B709A6FED71ABC051300CC3AFA119A48DFE4EF1EE21F29A90183E000ADB17D7403EBF4256F0C66E898AF9B2B739E6A22AF3480B3A31B58C4DC41DC3D179303A50C1245E8175DAEC91F00EE32180238B695781B3DF1C3DEBB76F55051577B8376B20CCEF492F93FEA04F45B7A337DC47815EA0106BBE39033420FBDA46BE23B6E845D7EFCC27B9EDC2400AF13298F9A144D89671001E806CE20F5C731DAC8CBEE3978EEC816CFF2B3366BB8E677ECD212087BD99C460FFDF0A8779CDD85CA3AAC197345A52E44718E0D00A6183187E672FB16AE699B4F3F973A48312B824781BF2B1697A260B387E2BC92AE539AC77571490D67AC9AF81D6DB71816DD7212588C03E4732610B4455B1D007474F286E3E311CB24AE7B2A4B5CF689252DB7BADC1BEA7859D33C035728EF324CA0CDBEACB6AE2B55EDD733443E06A8C934CD7F2E05357ED5E3F3CE21D800004E1C6E8893666055D925711BF9A4AB0DD70A0494651831581163DAFFF9AC2489822698BB12D5FE105D130843FEF011D4D80AAC76DCB9B79B7F2AD83FC2760F000684845BBAA4CD591BE2A2E13B41A616061A9B25BBB1E24BCAB67BA338C4560355B9625DEB19A28FDAF2605F96AB6B35720BC83ED9C3531758D40A52122E19001796585A4723783913A69E8AAAF96DE1679F18DA80FA1CD11E3C32EE72EF8EA19D0D57D47F9BE2440CCC8C2B9D3466AB5B06FD29BA1AD0C8A7C832DE561207006780B54D2E55E689A7298AD366918938EF173FD145AC57F53003F835B0A1C4EE297EC38FC28B8CDC1B81B0696EABE7F65B7195DBF26AB992F8C60E7022331900A7C58A3A0E73AF86F7FE6F112BCF5B4E42C203889C39C64A105F4F664BBC7A24074DAC20274ECD789FF3EAA138E184D97C2125A8803065268D34961ABD4B1B00D89CD99F5D99E9468AE40BB0B50A28EFC882D432090059D187734BBD10BA0E633066DD2945B94EE1D8255AF75897AEEADF5E3E977C73337E8769EDB9C8270600 -smlen = 3338 -sm = 855E502E763EEF29049F074A78A3353D6AFD01403959EFCEF6AB5A323A45F1B4220BB4F02A01D9DEB7932C787D49CC2F9E1877B1E122EB380047E4FF2E066A7CC7252BE2E9361D649B7E2C00EEB9EB38788363A4002EF9C2E81BAB759C49003D62A9574BC97F490E51E4C5F18EB02AB2F001920880A44587D5E80D866000C432534916CB016C621BF9868081F826A9CCA771106BC4798201AEE40D9FDD45D515A8D62063033EC4DC0362005A923E4B299CD681484C2957A9FE1F2934C000424268F831752DB705E5197C607AAEB4141C0136BAD14D552EE92D29C93A99C910EC15C3E600870FD10093159851D8D4200343730750FBDF01F3ED45D83282E9AC6C774C1C73FFB9A5F8450001170A36D775D452AD6A90160B1716A0F25D75C6B1DD54AD713C2886D9B5DD3EA80003396BDC8FB8A501BBD0E83F390059726F1A080150FDE292485DCE1982F6EA7B8C8202E0F434DFA04EC225FF6B6DB802A047E221BC064E5BE89A5FC13937AE9D3F22B4439BB1C1BBA01547A64AB3E810BBB09706D01959E2E906A69FFDDF0C56726BDB58FB039D66AC5D77C7F0E9A8617B0C69176770DA328D38171F39B5220279186250139922C0DD0F7C3F96D48615FC66DB7568810931D257B230258FFE9CB35F87859E08139EBF7432E948EE3F962BB9015CACB8499BC69597ABAE4B841B606657E2E3C51FF5A8961AD42177A9E73950E3FA150439E2063B6555624A6D8E3AF4FD5710FBE722B8C6267BA5DF56846A085C56444573D692D5412CB70E443761751E58C41953BB9FAA3CE1F4564C825A02F0E1339CD659AB1480804DD2E90E3086AAA292DB39C6E2AAF1B001B47A21CC721C0C502C46EF0479BB7D8CBDF8E9C136397FEBC2D83C0FDBB3ED4FA6868068477206A26D2B7E0D20507AECB2756B888FCF5B446217DE14EE6A20CF7E7B732FAB22CA3ABBE81B2BE18463ACAA3132773ACD7476460536111CDCAC98B1CC9B2C36AEB3FB318340F7397B4B4AD6AA87EAC94AB7D98CC12EA5606162877465FA2CAD276CBB5D36C40A0B014C53D2D3A96825E237342DFEFAA6B9456B5FF1DCA859C5976F77C3D3CBC9DF355237EE9B4B4C90A9DD941294431DB76DBB539DC48669E7AAD21808332C8A4FE98B8F043FB756B526890452FA3C3527FCD584CD33E38FF9FF783538D39A184B7B3EB649E1C04C289FB65998F6CF5D5BBB0609FC3403D85C6DF269017032CD24AC540E1B294BDD3C3A0C7117CAB02B1A0063A174FF26FCDA687433A667322320C0DEC1EA3963F3B14375882B3478AED43C2C74DEBFE3A734F8B1A5CF92007F8FB627CC3AAD5C6AE4C31846B72E7573041270FF40E762C0F8DBCEB7512D44DC260A97D5CA7D60699981ED8476D8651C35C8ED498FC2961D1E38AF46F3653630773209A63838A9222B813C23DB0CF4196D6654126BA2B1840A7180E653B3D6E10C4C7AC3CEE93B0399D918A52E59F0215B09A119E634E6E8A9886C877F157BF7B7DD827ADEDBAF03C718AE037C0B262588171839E952721DE72180F8EED00B01F53E098B82165199C53129576036FC753A3D33AEC92060DD19AA078A496A2B214B1BFBB747A1EC64071B0A078D74D0212E6203C9698C7449326A42BCBBE8D9501DB916C64307D5F1083BCC36C0FFA18C0E4410B0B17D443481C3673D17BBD7A366A5FD1C3C5B3391A02EDA7596B4F869A91A32B5A02A05611371231BE035EDC716F534724B5225E1A72A2B2CD357F4C326F1DEE963FAB680721D40DD70B750A019E70885515F43946A0DD3DD042969139F61ECA0E9EE3107D3D28AC606AD53F236303E1FE986C38825318B7C4597B14E1A83B81295FEF49FD0F2C1E14A0B146540D853DB9706CD224B376343317BF7330B0C2721A409B856304FFFE60C24C441D5E2797D4696C0FE046D305AEE93CC6A2D89A81EB19643636A8B424B310034612105DF16516CE9607CC0A2BAC5835642C6FF9572191BC45E44D9B40DA36B607F570AE8C39D490342786F31CE6764F3F7A764665B6CB93E54922C6D89DB566F494E0EE069811AC82E8132F2F388D68490CB1C2172D2979FCE3659D7076B4F457232EB839172963F8C342E2CD18969F086F451D33BB774F3D00E6FA2BE02292F2E5CAD3ADF5DEC28932BD784801E69364962BF39E25455303E1F289052D2F0CD4964E0FFCDE29E7C074E5D57E43739DFA42AAD636C352D363E3A23BDD134BAABC7CD1621CA638DED7DB7051F0456641CA872ECDB4D3C2603DDBBCE16637010E782C4BD5230992E2EE7DD904F8A83EBAA7B4C3CEE15B10794ACE894118304BCDA9E9B1376331D2248B802557AABCF913E95F783715BB5E90A4436E4BDE7D651397A70A24257C39E0516BB1F548DA36C1F1F92A416DC1114107CD863F3BFCB360286E774B21296259756EA6040CB61738EEFE29A67895AC69797C640E03F0E9E731647C2DA93373920341FDFBD50EB6B737BB0D9FDA8EC8784920407D4F41486D8FC616430768D6431CCD789DEFF332B239FFD1900800CEDD9661A55D6D96089007E9089A117F03D7858EB4C3FE2D07E91D8CAB88D2BA5421846069FA6D4E5C9161A140CC3A288100BFBE61C3B0F0E820AB12D8FC54B054A0F4C777052495B45A7D1A883E67663DCF50C2230CA5319AB31CD76435DAE41CE1EE25ECD3FA0C7E83B0168852B2CAB674127CD7BC9DDF9DD4B57EB40128988C7C8994DC6A5FC939FF957F06C70A4056E63331F9AAD254EBF2B8FCCD580285BEA486D91A0C2DBD5823AC8F6846DDABCDE25A2252F8DA1AEB32E6969276BD2A7F94CD7DD3143F3181489272B1589FD385BA844F90E35982B53141DAEAED413054CDB935F3412E31D99C1147079CB487FEEE85E3906DAED18106B8C407BBCB7716EF9D4D34E2FF04709C7457997AD6FADC55A8FA70BC907815805578A11A012C521A1325754CAE2E3F7C9E1FFFDBD4BE31DC534961C318D1A894838E0C33806735DD11E408E500995B86B6ECD20D325347F792A3381D2A45587D9B6AE0AA27533732A6C421CA621AAC42335848D9C0DD89F14EADF2F92EC532756CD5697AD752B6260C598EC9F0E9976A950B22DAEA8B74FCC87F28B5E9ED83C0339E566259ECF06E5CE209065DE87FEEE5D1E9C466004B34583D6AE89B590EAD6A96CD2951705AC764F329E28C996AD6DB05F6C69AD2A39D3EE230F6501F1760AA41FFD936C9DBF20DE3996917322D32B946062A3C27D8BF35ECDA22403AB684CDC680DD166562D018D943369CAEFB9133A4BC4515CD5F9C08E7C22D153F0A7733EB4EB2CD8A74A4C85E40DADEF6858C5927B6EEB2B01E9B7AB02F7048C8869991068B00FC19B9545AB42181DD5CB5488222A402E827F60A8D87B09ECC88350032F998E3C10A88D4733227334812EC97C5E5FA85FAEE1A1E28A58641531B139AA58BEF49780DCEAA408986CF3C40E226C60531945A20F91E5DC31EC86C9F9A0545E5FCB79A13B9AFE9B133867BA7A38152ABC6D9F8EE10090BB71E6ADC6A6C2513B066F2565138BADA60B0BD339F9BE1AADDFC90DD272B4146D0F5830C6A53E295C849C15D001176E7774FCD7619D6EF1A30BA93CFE278AB4806BBF25CE4A4E94163F614E81DFF7EFCB015997F5138E22B80B2B00AD7579CD84DB5D1C7FB16E9E8C5D9A5BA0AD0E0A7DE79C18839D673632F3D2C7DA2062EAE844FACCAF23590B2FBF1861405AC347EB9D723ECBDE54CC96BC4D8EE2178F353310E5D69230C5DB2841D2A06A3A4E03E054D99DEFC6004A6E405FA89B198A901EA1AE9F3112A29F3AEC5698A42794E04D74D761E4AA5AD23DE271969BAF124450F4796DA1EB1C01480436AB0F5D0B1B2E6717DD87EEBF137420961F978896077E40B2D2EBB5664FD8AD89BB9333FDF46C33EF3BED21BCB5B4697451BDACF364F85462F5CB9F546657B4744EDF757DAAA4D3A9A2A6F281184C3576B1DB0B540F3B36310020BC6AC0C6454A7CC8EC1182422B17BDA202729C270194CD6044210D2B98731565812339EDFE5A0DAD79BA826D8C566C7D25DEA9BFF0BADF1E4E5DA2B884966E03FADC51C6D9BCFE877511157201DAB48AED1AB038999E5CC3FE58CCD37D40050DEE92E0BD5332413A7F0118724084EE5545FB51942DF1EF399F734FB9592555B5F32290C53D7E5017EFA2B61E29FDCE90CC3E7C1B0E545425B1D3E1ACB9089DAA786CB0122DB3FF27EA0367751A5462230F0F248147EBCCBA2E16D214E9A0BAEBE989BBA020F95B623CB14ACAF2BE6F157DFDB1E32627133F0D26C7B65A189F39955EE31D9B507B43126B06B9E4524732C8621D2274438DB7ECAF736AB7257CED950EB68BB868581649232793EC83379A16F40781E76F5CC57C48C3F5C2989BEA803E1B63768436D39AD19BB77DB46AAE6E8473ED5DFEC983F49E4B8E7CA6BF476AB2F0272C0C2DBEF1BCB064D7400BFE1B9ECCE13578A20B1D5B48133A74C5C59CAE0115BC3B50574580BFA99D58BCAD336EE2CCA5B7994C784BB90CC8F1B9A0E21B39D5EBA464DE34D46AC0BBE436C2F419D60D8AB13786F9A841B52710D1B49BEC290DE317B66B6855ABE156C07619A4B998CC582E3F54A7F457F1D2839BC3EBAC937AD3EBC6A9E6E845379CF1D66D7C59000E3F6CF6823B005728A95BFB0ACD044EB35D5ADBE8933A3637887CF91EE74BB910FDCBE797B0C6B1B056500542BD39781BDF13EBFBFE949D7BA0B7F31102E63BFC6E22693F97 - -count = 91 -seed = 9564E88F336C091EAD50C893F3EAA8351FA388682F433F7A72A34731020B9C96DFCF75EF5EAE47E12684AFA51EFB49B7 -mlen = 3036 -msg = 2601A39B6D7D91DE539EF11C3B67AE3EB1607716F587BAD5F60D311A9F4FE7F04350CA085EDA6D41C4BB6C6E13E376BF8A314DDF791AE18BE2EC0544AFD3CC27BDF270C4550E9E78D497B92349AC07755BF9167B2958BDE919123439D6F49C3408E8D88021E668A0A5FB6799330188E35EC5939B77097E3737C4F664D01D85FAAD0F583B3E95EDE125587E2A79991750D5CF804325C72DC8DDF3471EE8FDE02519D2D0CA7EDD651EEE30B3BE335CCF7FB02059BC3A47EE3C056D4929EAD4FCD82C8CF49625D5DA460DAA299718556BF0F77CC5CBADB99B64C8EAD4474601FD5C79309D4E63AAC392853072619EFD7B958F0EBDE5CBD40ACD57DF269A8810776D6DFF2E637EA57ADBFAA08DF8D2581C38CB262DBB4D1F3C65A4FA068539D2056E08DCF03BAFF006EDC688023A20728B227A99FED3B8F2BCBED2E3E6ECD8B8665A2E4D233B78D7C33F6E3BD9D0A24D13C8EACCCB53A21DDA9E7A34F9A0F031091E65F749C9EBCCF3DDC4097A121D8C68EB7883405EE34F6A8B0208EA8D5A3FAB53FE2CAD1110BFA6E094F78D5314880BB67BFDFBC2DF8AA250F1D7200FF9A3247C4976DBD1BBE99DF02A3F246E5D466F85ED2F68E0B2DE06B0F2448A7B98FBCBF5872BCAE71BF0DB4E70105B020FF130141E8DE86DBE05B7D2A234CE2EA83A38E23A262E46FFBC837E8A71F657E443052E9A49DEA4E344D497DD2DE2AFB4009D681F232BFF4FEEB173546CBCC4C80C9F85B1CE125BE678E5EC62EF04433D55D4B8829B01AC165A440FCD6594F2C0CB456C8A47444AB05A0F0717B8185930D9738E885D24DAB98E11ECFF7D7A48A4527F94FC4C9D1B9D71F5E6BB39CF92B1A6D0509FFFD42E77AC9AD6F50F8FC649B96B8AC08673F78AE8D0BA2B7243452B33AAC44B06A2B9BE1AD6A12583D3590A3F9AF0E0DC35DA88A257170D315F32F3A889601D6729433B7ADE0F719386723EB2A008634749F5253CB7D9B2FC99A1AE1BBBE7F00A536CD38F8A7237D3992C3897DF412F5B1D45E1EF5B5DC974D49CF8DBF785160BC527543458FD9378B3D4D3124214AE5676185794209AD0EE73B063CBD5B7830D00F817CA0D5CBB597C44D28E4885D935B7BF426C1339C500DAF4F2033FA6A27A4196F233256650472F205D2C5E00E7087FB73027B0C6C9AC5C1D928CCD190B8A6BB33F512CA8E2369DAE6111156DE47A24469683F4721A25652FF87474DFD92A028B3EC5BCFC244CE442752A7DA1DA6C33FC22573BF0B13E371CA9FCC86C76FCF7A1654EEF4442E47399835A06336E62952770C6E61C573CFD07B3AB631B8831FE3F5DD2C6DF68EBF2F8E02EC9F6B90A371ED5E62C8463780AC453AB6F72D38C8F5212C8B650F63B98E3C0886B6A85AE8E7256C1EFB30969532CDBF72184AECBDE2A17B9811DD4222D080049C5D36C532CC0E910779D64AF93D750EE96BDA87562EBD3830FEAD07A3960CD6DE7146603199563693392D3CCE1332DF35C2C8A2C251911D38E95815CE5A4CE5596E2D77711D87CDD54D22E8F0AB431BF8B24CE9C7BD6D077E436543C70B02F338841AF0FB86B5EA4B6A47E27C1D83E1AB06801044F546ADADA437F3CE7D788A1C92A74BA540664658E70D4F2711979153FF1589792859C3BF122628479C7C35EEE951DAB8CDB0D4D150C2DA338346988D34F8C5E589B231B5E00849611BA09711BD3A0516FD515E6C4AE1E8A3657C282C8120C97AA7A2E3BAA22B6EABB8D8212A9A48E7759A9DAAA51B538F662A05FB897067B7CF9D2CEB47A1897214CCFC225CE47CD60E86F7DEA49E220F7DDD6894B30B66460DECBBCB2E42B31F4ADF0AACDDE544B9124EA5ECB04B03C448B17E8094D489F516D23164D2317D3A1332E0500F1423136C8535D69065E880AF34CF7E36DB5FF2C18122E41880585B4D188411E86B370A024BD6E28143EA2EAE52EB46BE334A21A02E21C6755C0182B9A055A7D4C7B056E4930CE63EDC79C9FB4E2FBFFC58F776086F3487F02F8D1E7C8519C7F452E75CE5686A037B3642B95D7526ACD4A81A47112CF96A8DA7548016A22E9359198E871DBCC5852FBE14EECF3CCC5EB2FB5EC31D10474DF7D63482A03E11F4AAA2EAEDB714786E21D03AF1CD644D06BB05FF7B3959601580BF50E5F7F82FF42E9CF2FFCA0C67FFC52CEDC53C7A5C9EFB6C21092DDA374D1CCCBC78BBD9F5EE0FDF6DA6AC60C95F7C2E96F17E3C379A52D5DBD1A92DD76D1F5DFA19EA0408E0E7F7867445445CFA60BCEFC016E68872FBAC9098FD6A8E84731C285570B1BEACCA6F4728958E7924F7A7B7730B9BDC9AAEBD9E045F464071843C650D06C96D487CF8397286F81D93D0CC2008A62EE32421E5231998140909474F6D98541D899EA53714AEFE652A3D792E4C72533332C3133707A49293E3B2E06AE18F2F81D601AADDAF2FD09EC59350E0979A5AE2B721771682A1BFB5748D000F9736031CA971288F34993DF10FC06A16A6DBEED8CDAAA8127F3B71432E723558F0281459820A0F4A75A3B2716F976BDEB88BE9C73F31623050D7C1A96C84988B01D847309E1B6D7B815883F83C9BDB7FCDAEFA8BA69E25B824812B7D54530A3ECC96611897661158DAE1B4AAC112E9AC13D07FDC03DC7D5AF23C08C5E4BBFF737238FD3F1C06F94215BF2351DCE9CAE14B4DD4745AC0CD626054469C6A5286FF821BA192706D47CCEBC443DD67FDDB76797A8B78DD0DAF850CB5D181C82298616E1D3A92F7FC82FD256857915773C7AD97CBB9710373299AE8516B8A1D647A13C7BE848E0269ED6C8A91DC50D0CAD21430A3BC9E718A13D1966A0182D9A24FFF7ECBC7876C868AF2BAF2D8B782172C6719CF140E8CB877FE6D78779E1BB31C70C6C9A6A77529C51CF78A5E4FBD7FF6153B5195817F80603E5C5810C38CF43CA812ECA52F73F045E33DF4E3D04EC8C5F8B4A7399F6CBBF0D39DC951C476B9BCC002720CE89F09C3885673BBA9C90D20DCCCA4A82CE5BEB38BCD60AFE2BA65FCFB01C8793B7ECC0F0B17A9DA74F2E0FEF4C90B5132FD6BAF8C010FCB5E8E7FAEAD7F2E0DB29BFDD1811072623CEE274EF2EFB0F7D4191F332AAF20CF36FF89A2EDF15F7B284CABBBEF46901271D8C1B180F736125C8A44FE164AC7E687E9A58C3B1775238BF1A11F99BCB583D0E3C44BF4F76DCF9496A06F80CA52E24D55B54AB849D3040B4798BF5292B0574672E9F844016A52A4D4E4DAD2053207BC97215BCC1BB93271C03C9AD2DFC7485EE2ED399236AA06CF9A12972E21AFDC587A6334CD1D71A7539362D714BA26214664E3B4BC39CDB1DB847583DB8E002A2AAB451B4E5BD6FE200730BFB2745D03C82B640F4CCF58701708F724EFFDF98CB04C78DF36B7A866CFD596BF5EA18445EEA0E34ED514D0DC2625039049A0CC82711DBBEDCE339C77F9FA1DC60EDDD8D58C8F144B0F3D00227AFD8710BDC66D29809728D7FBE85F08AA38AEBE5605DA29A09CC0526FEE84691EAA54DC3744BF5A95275037FA2F600B1F91E502D5D81AF48F8EC4C1834FE625FCDF2364067048727559047E07062B4D8A7D3851853BF28BE9D2C511451E5FDD9459270328A2612DBFF42E1DD34005A3DA1226A023162F454923C0337E6C74B44BB27A3B1AC82DFD68B0A6DAF93473D97A9E4591EC01A51CB6B47E2C7A85C1FFA73C35E5CE3003BC4534A2D9B16EBF9FED6464CB1E0CC665A451616A62B6A8481E4506A73883198C144A06331224D358196C815C811B103959EDCA35B26BCF86F41D9C7638547496787885EE62B14AF431CAB2AD4E0224D33476C58B8B0833BF13B50BE2B1D682CA7DD194B793AD2C6E4EE25AAF95459302F0B4DAED907A317BCC6A5F8D76CA9AA0D799F8EA39F330D6244BFB9F35E6223A0F665A65F55EAB9BCBAB446D7FCD424DCE87F234864D2C27EE84600ED9193AFEFB6E7681BC94F514FE0748EB32D32262CAB880D79CD4FE5CC963A4F688D448F2DB2DCC5B0CA87AC26DD8506512C100273B8D4D902FC054D48D8BF9EE818AD9619F68A8904B613256DB78C881CEA3373F0CBBAC336A78CD91AD9D60126E05CB8C16E9AA8482CF1B806B2F9C57BC8D63BF008AB2E49EDE8E788BF96B9F1DB2918DC5063F3F1D5B9B1C0327141ACC0B4B248FFDCB8BCC127050D27C805E154A4825DEE6BE9C8D4E42B1F5EFC1EECC6A45DBC119AFB15CCAD19789EAAFA8B1715111AE32E2ACED2278803B60E2FD63A43317498244A7CF7342342B60462510E19D83240DFF5D58E762C093DF326EA503FD347D2A92A5A4680D5E13B305671C729179FA21BE83B0D83144E63 -pk = 1B56A12DA8BA6BA256F2F3336B25C12B216F7D20BB851524A25922AD61F2981C2846FC8832BF6C1D47BF3D7A49A0B6F7CD59265585BCC5BB0C8345760E770500A9D0F86EE5BF182918D26CDBE49A1123E3F844358C6BAFFE3451826309BB60DFAF239DD34B04413B7A5A87AE4F2BFA2C8613CE6B9B86EAAD19CCF15BE5B62200 -sk = 1B56A12DA8BA6BA256F2F3336B25C12B216F7D20BB851524A25922AD61F2981C2846FC8832BF6C1D47BF3D7A49A0B6F7CD59265585BCC5BB0C8345760E770500A9D0F86EE5BF182918D26CDBE49A1123E3F844358C6BAFFE3451826309BB60DFAF239DD34B04413B7A5A87AE4F2BFA2C8613CE6B9B86EAAD19CCF15BE5B62200020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CFFF9C387015D9383B63BD379498BDBA7D49375C9345813649EF53F8B522963A8A82E84DBF8B82D8C0D5B35D8E3CC522B9C311F7E9A9FE288FB6D7E69B0A1A35B4387B40BF2FC9F4BF66B4E255D2E056384900CA522037D6A110000000000000075B85BA3E08374392A1253E2B929B37541C42A516925BF46562DF8E86DC934F328967E3FF69B75E3B19F37F02275EA73EA15AA4C2FEAF7B7BCB105F662C627131D680F9D21D8338917F89FB259CEFD2C70EE1B1608D24A1F84F9FFFFFFFFFFFFFFB586EFE80308FA6BA0B032BA7F38D19602626005F766B1597C29D18BADA456663EF55474D83447D89B96676F0DB2145D9B6C20CF41E6771269DD0000000000000000000000000000000000000000000000000000000000000000000000000000004468D7CDB38CD6452889352AEAB9E80D160F3F5D85F4BF8D4F5CE02F9B88CB98C2CE2134D079F0AA2CB49AFB13C1CFC48C1B5F3069E9DD533EE2030000000000000000000000000000000000000000000000000000000000000000000000000000E627103EA1621806A8E195AB7525C85836B853D81243837C2ED6716851BBC83A01E2CDC070B1DD3DD05E164711A3FD9D4B5768451F31ABB122AADAC83CDA16006595F5C870F6B98C40350F815D4931AFF6EEFD53DD8FEA8A5720EBA982FACC7385FBFD7EF3C4F1895D69026897AB6AB91DE1F19CA0260B273BD222F6587220007694A37B10478F307ADC9CB6455D7290A0D0C85D35CD4FAC03E3E0E4A44B2531BE28B16D1FF6B3F85DE726FE5243F9ED3C7476035431F235BF2DFB1B97F31E00CB4B5153C02FEBA2A9FD58ACE78643FB6FA44BA1C73893A08943059BF24F3DBE2E10C2B87A6A1680080ABC07D97BAEBA9892BE0C25EE52082F3E189E122C1D00D3A7E3305379FB12E5F1AD07BD10D02579ADDE2405D829B44591B0905331C4216DCDC19C5AFB3C2206849F9558C45DC130018050FF8E43C0BB6B42C992E1110087742A6AEAF93E9609476FE37E16A9CF32678A44C4FCF6319EDA7DC8AB7844D9C64B5179025699E11430A69A628E46ACE486488E3609BF1AC0CA91502B9805005BEEA475A5A5A034C793F3110B72E0BF8A539AF0B89754A6836474D6D4261EB92A17E1F48661C51303BC0BF2C51101E4E85C0A786B4418BB2578B831F8541A002959041ECA410C2A5600022E9B1D5B87342A0ADDCF3824DB8776D11FEDE281C6AA360DC2E85FD6154D404E16AA6731807CA2622BFC2269F766C2E41F380102001DA2A2DECB15720BD17A9947B52326CA9721E813AC8BBAC5F5192A6EBD356D7E7E920F3F7F79DCF9F235EA097AE0DA8142F152E25EDB0DB75DDD6E7F14F60E00341E7F8299229CB409ECE7A5ECD62084B7BBB5A3D7379486916A3F4622D5D3EFAD353444D7ED522AB9460C1819B89C849D6F2C8C724932194C8128A6674204001B198BFA443246401B38E2652E9C0A51DF98C72CC3EEE3D6DFC2E10802E9564CD066314BCA0DBBCA09CE03BCA12C111659CCDDE6028EE99798BB71A6C9831B003C71E7AB6C9227DCF94F74214197849793E70E92784C16755B992F43CB5E554D44805BE30D9A7DF3F5FA6F971A81AAD51243940FA83EA8E53FE1F2B708081100AD35778A62707A97048814CE76EE1E66F699BA8BA02B66593A4479936831B93EAA3DF75E628382DF369C3023EEA518C5D37643CF28CD696A245E3BBFB03F10004C58278A8FDB2D7764F2BB20F297BFD49CF3051A3AC749EBF0CAC2BB320C2FFD3BFD25C2E6A62C89CDC60F9889940B39C6C876C52C55A1C3D029FF01314A2300 -smlen = 3371 -sm = EFF4B0780C09A5375D6ABBEB25D24073761C01CC1232B9C17CB8DC71755E962963551FDC07018680FAE2F2204437D2D05213BB359550151C017DA39CB1C726D1723A19AEF0E78B3F81F1E2000605AB08C28E74BB09E80F5B594A564F35C701B743817403E9357A9114D0D647E9CBB998460168740E07EC422B77002FB054C27E63DEADDF01AA4DCDEFF404CF0C3554ECA95CC475C18781012B428B6844125A6F86645008DB6F0E368E0301A4B256501CE882025C05AA7D898CE3C815F900FBB4A576B3E3241CA5801CB61D69FC63939F008C5544A8D4A08F304E4279B072DD2A3E62B7005D361913AA485CDBAC236D57FF2AFDB1B1F5019F77DCD72F1CDBA896CC04E0D9FBA16C7AC00001E55C19E327C2DA95B16382116E4EB551C7EF87196D5A96457FFAA9E92670487C0503345DB895359BAFF25C0CF43F64BD436F888E00D6897D349318525329DA99771141002601A39B6D7D91DE539EF11C3B67AE3EB1607716F587BAD5F60D311A9F4FE7F04350CA085EDA6D41C4BB6C6E13E376BF8A314DDF791AE18BE2EC0544AFD3CC27BDF270C4550E9E78D497B92349AC07755BF9167B2958BDE919123439D6F49C3408E8D88021E668A0A5FB6799330188E35EC5939B77097E3737C4F664D01D85FAAD0F583B3E95EDE125587E2A79991750D5CF804325C72DC8DDF3471EE8FDE02519D2D0CA7EDD651EEE30B3BE335CCF7FB02059BC3A47EE3C056D4929EAD4FCD82C8CF49625D5DA460DAA299718556BF0F77CC5CBADB99B64C8EAD4474601FD5C79309D4E63AAC392853072619EFD7B958F0EBDE5CBD40ACD57DF269A8810776D6DFF2E637EA57ADBFAA08DF8D2581C38CB262DBB4D1F3C65A4FA068539D2056E08DCF03BAFF006EDC688023A20728B227A99FED3B8F2BCBED2E3E6ECD8B8665A2E4D233B78D7C33F6E3BD9D0A24D13C8EACCCB53A21DDA9E7A34F9A0F031091E65F749C9EBCCF3DDC4097A121D8C68EB7883405EE34F6A8B0208EA8D5A3FAB53FE2CAD1110BFA6E094F78D5314880BB67BFDFBC2DF8AA250F1D7200FF9A3247C4976DBD1BBE99DF02A3F246E5D466F85ED2F68E0B2DE06B0F2448A7B98FBCBF5872BCAE71BF0DB4E70105B020FF130141E8DE86DBE05B7D2A234CE2EA83A38E23A262E46FFBC837E8A71F657E443052E9A49DEA4E344D497DD2DE2AFB4009D681F232BFF4FEEB173546CBCC4C80C9F85B1CE125BE678E5EC62EF04433D55D4B8829B01AC165A440FCD6594F2C0CB456C8A47444AB05A0F0717B8185930D9738E885D24DAB98E11ECFF7D7A48A4527F94FC4C9D1B9D71F5E6BB39CF92B1A6D0509FFFD42E77AC9AD6F50F8FC649B96B8AC08673F78AE8D0BA2B7243452B33AAC44B06A2B9BE1AD6A12583D3590A3F9AF0E0DC35DA88A257170D315F32F3A889601D6729433B7ADE0F719386723EB2A008634749F5253CB7D9B2FC99A1AE1BBBE7F00A536CD38F8A7237D3992C3897DF412F5B1D45E1EF5B5DC974D49CF8DBF785160BC527543458FD9378B3D4D3124214AE5676185794209AD0EE73B063CBD5B7830D00F817CA0D5CBB597C44D28E4885D935B7BF426C1339C500DAF4F2033FA6A27A4196F233256650472F205D2C5E00E7087FB73027B0C6C9AC5C1D928CCD190B8A6BB33F512CA8E2369DAE6111156DE47A24469683F4721A25652FF87474DFD92A028B3EC5BCFC244CE442752A7DA1DA6C33FC22573BF0B13E371CA9FCC86C76FCF7A1654EEF4442E47399835A06336E62952770C6E61C573CFD07B3AB631B8831FE3F5DD2C6DF68EBF2F8E02EC9F6B90A371ED5E62C8463780AC453AB6F72D38C8F5212C8B650F63B98E3C0886B6A85AE8E7256C1EFB30969532CDBF72184AECBDE2A17B9811DD4222D080049C5D36C532CC0E910779D64AF93D750EE96BDA87562EBD3830FEAD07A3960CD6DE7146603199563693392D3CCE1332DF35C2C8A2C251911D38E95815CE5A4CE5596E2D77711D87CDD54D22E8F0AB431BF8B24CE9C7BD6D077E436543C70B02F338841AF0FB86B5EA4B6A47E27C1D83E1AB06801044F546ADADA437F3CE7D788A1C92A74BA540664658E70D4F2711979153FF1589792859C3BF122628479C7C35EEE951DAB8CDB0D4D150C2DA338346988D34F8C5E589B231B5E00849611BA09711BD3A0516FD515E6C4AE1E8A3657C282C8120C97AA7A2E3BAA22B6EABB8D8212A9A48E7759A9DAAA51B538F662A05FB897067B7CF9D2CEB47A1897214CCFC225CE47CD60E86F7DEA49E220F7DDD6894B30B66460DECBBCB2E42B31F4ADF0AACDDE544B9124EA5ECB04B03C448B17E8094D489F516D23164D2317D3A1332E0500F1423136C8535D69065E880AF34CF7E36DB5FF2C18122E41880585B4D188411E86B370A024BD6E28143EA2EAE52EB46BE334A21A02E21C6755C0182B9A055A7D4C7B056E4930CE63EDC79C9FB4E2FBFFC58F776086F3487F02F8D1E7C8519C7F452E75CE5686A037B3642B95D7526ACD4A81A47112CF96A8DA7548016A22E9359198E871DBCC5852FBE14EECF3CCC5EB2FB5EC31D10474DF7D63482A03E11F4AAA2EAEDB714786E21D03AF1CD644D06BB05FF7B3959601580BF50E5F7F82FF42E9CF2FFCA0C67FFC52CEDC53C7A5C9EFB6C21092DDA374D1CCCBC78BBD9F5EE0FDF6DA6AC60C95F7C2E96F17E3C379A52D5DBD1A92DD76D1F5DFA19EA0408E0E7F7867445445CFA60BCEFC016E68872FBAC9098FD6A8E84731C285570B1BEACCA6F4728958E7924F7A7B7730B9BDC9AAEBD9E045F464071843C650D06C96D487CF8397286F81D93D0CC2008A62EE32421E5231998140909474F6D98541D899EA53714AEFE652A3D792E4C72533332C3133707A49293E3B2E06AE18F2F81D601AADDAF2FD09EC59350E0979A5AE2B721771682A1BFB5748D000F9736031CA971288F34993DF10FC06A16A6DBEED8CDAAA8127F3B71432E723558F0281459820A0F4A75A3B2716F976BDEB88BE9C73F31623050D7C1A96C84988B01D847309E1B6D7B815883F83C9BDB7FCDAEFA8BA69E25B824812B7D54530A3ECC96611897661158DAE1B4AAC112E9AC13D07FDC03DC7D5AF23C08C5E4BBFF737238FD3F1C06F94215BF2351DCE9CAE14B4DD4745AC0CD626054469C6A5286FF821BA192706D47CCEBC443DD67FDDB76797A8B78DD0DAF850CB5D181C82298616E1D3A92F7FC82FD256857915773C7AD97CBB9710373299AE8516B8A1D647A13C7BE848E0269ED6C8A91DC50D0CAD21430A3BC9E718A13D1966A0182D9A24FFF7ECBC7876C868AF2BAF2D8B782172C6719CF140E8CB877FE6D78779E1BB31C70C6C9A6A77529C51CF78A5E4FBD7FF6153B5195817F80603E5C5810C38CF43CA812ECA52F73F045E33DF4E3D04EC8C5F8B4A7399F6CBBF0D39DC951C476B9BCC002720CE89F09C3885673BBA9C90D20DCCCA4A82CE5BEB38BCD60AFE2BA65FCFB01C8793B7ECC0F0B17A9DA74F2E0FEF4C90B5132FD6BAF8C010FCB5E8E7FAEAD7F2E0DB29BFDD1811072623CEE274EF2EFB0F7D4191F332AAF20CF36FF89A2EDF15F7B284CABBBEF46901271D8C1B180F736125C8A44FE164AC7E687E9A58C3B1775238BF1A11F99BCB583D0E3C44BF4F76DCF9496A06F80CA52E24D55B54AB849D3040B4798BF5292B0574672E9F844016A52A4D4E4DAD2053207BC97215BCC1BB93271C03C9AD2DFC7485EE2ED399236AA06CF9A12972E21AFDC587A6334CD1D71A7539362D714BA26214664E3B4BC39CDB1DB847583DB8E002A2AAB451B4E5BD6FE200730BFB2745D03C82B640F4CCF58701708F724EFFDF98CB04C78DF36B7A866CFD596BF5EA18445EEA0E34ED514D0DC2625039049A0CC82711DBBEDCE339C77F9FA1DC60EDDD8D58C8F144B0F3D00227AFD8710BDC66D29809728D7FBE85F08AA38AEBE5605DA29A09CC0526FEE84691EAA54DC3744BF5A95275037FA2F600B1F91E502D5D81AF48F8EC4C1834FE625FCDF2364067048727559047E07062B4D8A7D3851853BF28BE9D2C511451E5FDD9459270328A2612DBFF42E1DD34005A3DA1226A023162F454923C0337E6C74B44BB27A3B1AC82DFD68B0A6DAF93473D97A9E4591EC01A51CB6B47E2C7A85C1FFA73C35E5CE3003BC4534A2D9B16EBF9FED6464CB1E0CC665A451616A62B6A8481E4506A73883198C144A06331224D358196C815C811B103959EDCA35B26BCF86F41D9C7638547496787885EE62B14AF431CAB2AD4E0224D33476C58B8B0833BF13B50BE2B1D682CA7DD194B793AD2C6E4EE25AAF95459302F0B4DAED907A317BCC6A5F8D76CA9AA0D799F8EA39F330D6244BFB9F35E6223A0F665A65F55EAB9BCBAB446D7FCD424DCE87F234864D2C27EE84600ED9193AFEFB6E7681BC94F514FE0748EB32D32262CAB880D79CD4FE5CC963A4F688D448F2DB2DCC5B0CA87AC26DD8506512C100273B8D4D902FC054D48D8BF9EE818AD9619F68A8904B613256DB78C881CEA3373F0CBBAC336A78CD91AD9D60126E05CB8C16E9AA8482CF1B806B2F9C57BC8D63BF008AB2E49EDE8E788BF96B9F1DB2918DC5063F3F1D5B9B1C0327141ACC0B4B248FFDCB8BCC127050D27C805E154A4825DEE6BE9C8D4E42B1F5EFC1EECC6A45DBC119AFB15CCAD19789EAAFA8B1715111AE32E2ACED2278803B60E2FD63A43317498244A7CF7342342B60462510E19D83240DFF5D58E762C093DF326EA503FD347D2A92A5A4680D5E13B305671C729179FA21BE83B0D83144E63 - -count = 92 -seed = 4D0788DE958A707899D5DCC02F756A10DEA2EFE0214F5E01B3281DF4E013CA75523ECEC64723D6C8BEC0B92C4F821D8F -mlen = 3069 -msg = 9163116C86E64D90D35CB216FED71BDBE6A0797A48CB915F5A40FC8D31AD340767058B28CFF0C240720327E12E653C1F98B5755D8000BC01324DB2820781B94C4434FDA76223845E0613E2526A95F28FB4A768B1487AA34DADB28CBE8DF4FDB510DFFE672FF004F37C7AC32072A24C0F12A050BB396AD56346F4E0BA75C0EFAC162288A7EE8A63255DBA5CF451A0932FD56B05E40EDD491293E045A6081F6586BDCA10B41A6970D8F9A7B3B6B58AA772EEFA9ED22C9A24A384D6947770862BE4FE45C5E0E56FA4D116B79699ACE41E5D9F2E4C245059CD798DD986A3763F527E0C9D5A88A09C4D76D447348509FA7D9BFBF3DEA59EA57711A3B1A9352123D4A74DF273FA24A89BCAB42A6D455B5FE3C503F1FF638280F87C740B9E4C5FF20133CBDFB8D08CAEB7DE9F26811D437E6EC8C3143C0419C2F5135D25C7F40C7908C03F295FD26F1A03FBC7285196BE40ADC6FBDDDC912B3BC94B0BCE08DBC2185EE3CB766325068DB55C31FFEBE4B1F6848AD4FC201A5FD056916A397ABE6A66FF9BB03B037B50AC509E46CA441ED45812E3334FD7036D190A7991E55CB817EC2A63CD800F293277E7D15F086618B55AD395C614D168FCEDFB274FDF4FCD50CB976F68A266C5365E02A1ED0221BA4E13E70304824F94251249CA23C089B4D54E02EA03FB7C9841DD30404428AAB2519D68CF564D75D18530C7D062496C120A8F5305AAB23AE52255EC919EB0CD875422B144BF47F7472349558E746B0EB5493F1FC40ABDADD2ED84A8B31221A485052369FD0B552972C9FAEB1A78E826BA4DFB9E91E301DB589E9D7C256E7051692C48534C6A5E2BF0F45B78ACA66D5F53E549827E15D64E2F294F93D43B9F36BEDCE6CEBC05E56CED3F846635AE3C384C3FD55B969CA31E8C625103C2B24E7EE45E92984CA23A331C5B14281B20116069C619D82D6080C6FE35C3A3FB2E73B695CAD9C5D3300814FD65738DCC3EAFCEFCD24361AAD13A25B3570D2D509FA449612BDB5B49E0605D7EB78449D1DB40660AF0F3D8BCD4869B6F175CD28AD72FE2668C3DFC1D4963D0EAB309DD50B74B9D2947F86FBE9864AE5D0DC69B55B182AC1D914B11F631193F5F1F897CE52CEE97D7AE95631FC2F2A1AE9B672165432EB2E5633B55185AFA5E883268D8503AEC10774D25D39C800B74405414FB06C55B8C48835577884D6B4F2F128246563066F8F34D76213E0720E899FC1F11A3B0A591885D82C688E40D6B44B54D6C7C6973156E2DD50C40A28D2EBBA60F5117D64646CAEF72974F4B8362E4820EC04F2F373DA8D883AF27518567688146F16BF4E10969E70BE8ACE5D2FF6A135DB1DD738907EA355FB6D243904F6427D11592672060DA14443B55A9089167FC9D5EFB2C64B0069795C341F90DAFF684E566611EA87BC40A4C45F22C23AB6888A754B89E4C95BB54629CE74EC999889C82714B5AEC703DE7BC080B0D2E622ED53B645688CE164ECDFF4ED66C86049B2F9077F2A94CD685294F8EA9CBC1DE29A48D39F6B308288DFDB47731E39644B576A298646752F5C53D7943A5D0F7DBBC9604902B61B8EDEFEB5AB7E5BFDBC1E6723E6047894547E440E918038CC13B47424CCFE1A207E08A40524B553C750683F5F6C960F05836FB9B28C59E1B471FD5331F1811DDF3EAFF73798B7FFD6C9714978988C440CA906B4782A410372D70EE65A0A803061708003688F576E2D3A22580B706149A24B93A162BE9F1B546680A1DB2A8E54A576C28B4772C50A55161B2994514369C2192B2C90017CC8282F41D28099F38B2F1F0D2C0E46B444417A2078755591F00F01DF0CE72B1D1BD255A14D2BF67AB3E630F95A5DA9BD9E10F08EFBF6FE722CF000C32460FA3271F18B39EAA4487C1DDF828B6BEDF4523837BB3425BA1C1606E8D5D1E6182AA6A74F068F3E90B42641347CA755779216AFBC99603391FCEF4E8E5AA202BDCA24B83FF42F4F01232D3F2831CDA2DB76FB93A4CF6E9EFB71B5438A4B74C3190A8901D73566C50727559BA9BF6317D116E8F5536BACF064D3F86282E0F88DD40B63E75519C6A8E5664AF8E1029FAE87930F523E4DC7C2DD6DC3296A42A59F178D438866D929A70951BED05533EB1D818B7C7C595971C26B1D436D26897D6A6EB036A13511AC4A3BD724F2CA57FEF07D2C0730800D35683D745125F4237ADD64B538B7DAB0D0F258DAF7DE1A74F74A2FD010CDEE810F514FCF6045F0CC84E2054B5F4EC2772718FFB4CCA9C9BE77F8F007333860180D60EE4DD8CE976E63FF49AA11DD42FE6946515E59DA3E602B1861BD3F63C89362BCFE8438BC71959A617D8D63331A3D903BC5734B777FB14F7A2B063D79EA8637AC52C758EF88DF217B95FA8FDF1009AB28D8A4F318F78772568CC7AA9E3B3E001C0111B1751B698EF1B66383D6B3CA942FE4F66FC97613CFBBC03EEC9D0B7E08F80939D9A2EA1F72BDA7B0D655AC3A94B4C699D3EB1BBD6076E63EF5C1FE9CE258B55D21164CA7EE03BB53D8BA4306F695E648093542D769DA95A35FF3A2C071DD8ABD5A82E217D82317065D50A87B689AE3A2EC7887957BB243373CF986490961220EA61EBE12AC0287B185070E124FC518C300620B4B6D4F29402B18C2462A7985C00E2A87691053B1FDECB7AA264F33E27C6B201CA6065EF79E5266513AEA92E8D3E646453C089B5EBA66D14BC45844D0240D2E7737C16668FD53E38A93D6003146019777C03644C300D06927EF6994AC794914EFC5BE0CA81680CA8C9752908FBD2D56D7FD1FC1C76EED755408F1D7802F0D3D0F347D82B162EE6F0A2A890E083C20B822FA6C4AD627F4AB5D1526D83D897C244D6ED4A427B23B4A0C19F4E8889257C1373764AB7063B5DB8ED9C2443CB012381A2B3365EB568649D7CCD52271F25FD22FDC397E4C9C536EBB452CD2CD10DC5010BF433F88CB58D2B9EDF2BCBFA83B782FFD4388F1BCE3F8F9AF5AE6BE590BDCECB1BFEA846D2F0199ECCDB0C7E4D419F69B6A428EAEB462B67AA40340417BDFEBB6039AAB8242E39F6C11EC136D73FB315CF71414A2A1203AF08FDEE34ED0072C27462395815F7779012A41EC526BE53DA954E1F7A7EBBB68FEB15CBAEA8ADD6CD0F2FE3D3615991AB54F4C7884E8A80A9535F13BE2ED944B3BB315DE8AF2A70439294CD53F041F41D3562BE840C78EFCB08661B1731FEEC46A9091ECEDE3A9FBC2DAE42C72EBDD84308E95644373595DB62157DBA7DBF124BB45DE6C2837B0066673BFD215FF915A8D41637EEB029C345E444251ECBBCDF79E246A80AA4591976A00DA06C759C6160ED1986F8E15A562417DA55109174628E7B11D49586882851205755B4F99A875AB3599FDCC094E4A2164E1764D24DE805FD7B20EFEF2A8E23FEA4E206DFA1FD9C31D90C1FECF745D3EB886190827D952703AA6A99B5000D8EE9D51DE94A82DD053B6AA89CD7E94E92D4AA93A9224D3F688B5C834A53F2993638166A3DE78ABA7CB930CC5845F9915E6523683715A187E940FA2A978B5CA4C3B80DB62E96A600F1864BF0B1AAC23B1330B13EADD3A2F07CE7181D0A9497C455D228278E5CC3E4C00A2EA3EB8E5B9CE2799256302B0F8F1F829D3A3AE8AA7CC4EA229C5AF476C01B8D48A9F6987DF57C3469B6EF6DFCB488A3D5B91FE17B5798FE154AB8399A2E75F0D15B2A6AA91302056266B22A38A604EDC374E2D2155ABCA119C11DC6827A47E3CEE7032F6E0F59708DFACE221E47041CFFC59CE0334D9B7C5E91C2C320A70EC2F32906624128363C893909F47BD970DF652D5E6C2324033F32B1653A039F8C051D9DC8F839C50F5696E9E08F7F1CDAC4750B429AF03176FF6E643ECA1D8FC710C6CDB0D26074D85316F4C9084D5F453F6D36C1CEA0E389F3462E1478E2503C1DB99FC46F3F0627F173672C21F3CC3B483998192E81EFA689819D0007762ADBD141A058587E030A3568E412D25662C40ACDAFC3C6EE30C10CC23E3DDEDB6C73085C90C89B1218D67A328F06C3637A786D4715CB9F9D8B0B22D920B68B0557CC80A56FCE0B6E2D6627DE576E308757A8F37821898E96785AE323E413D3572205B0A5710143A2621C258C76C7C3FF7100A2FCAE99C84D1AB1CECF7FC5B1E4698BFA3BA2A0856A65F2D4F291A4A164C0381D70D1213F7E40FC4BA42C43EA8E70043E27C5AB0827559B7CF7F2587D0D2F93C6382CF54E92764D815280D68C554E5B6FBB351BD18635786299DDE39FCAF3EFA708A3F18701EDA1579BFB0BEE4FA1F1ED6E09D450D427E4B91F4552F87F31F06F109E74AF4BF301481452AAFA2146F6375DA467EA008BAFC3C8408AADD61B07C28C55249EC0C8BFDB00EA -pk = 7888E48680398164BEC3B590A362CDECD33FE7C392DCF067613D885639D6D3EDCE7483B68C14D279025C5FB10C5A6B8FF904EF648CEA2300B95106F23F050900E397521205EC9D0A992CF99EFBB01D056AF7432445B43C2B626FE2B1A050F8191834DC71DA91D4323E68B2146B78079A816C5E1842079E0D0F2B8782FCC00200 -sk = 7888E48680398164BEC3B590A362CDECD33FE7C392DCF067613D885639D6D3EDCE7483B68C14D279025C5FB10C5A6B8FF904EF648CEA2300B95106F23F050900E397521205EC9D0A992CF99EFBB01D056AF7432445B43C2B626FE2B1A050F8191834DC71DA91D4323E68B2146B78079A816C5E1842079E0D0F2B8782FCC0020002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FD93DA8572A03F7E09BBD76BFA8FD9B918FA9D2023998C8AB561CE68B3E76337CF6E11E2288E9CBA84C56B9C39398CEE0D19F70F5EBDDC508E273AB77E5C3D89B22518B6FBE54808C9DF08C39BFA056600B3215B25976757BB12000000000000003AFC9A071E2DF107F805D13F269D1BF7D8AF54FC5F9256AAD493AC1DD64AD3189A9453D3646F481F4498746CA536262A4F25CE5CF34A9FD3FAB42BBFC828D8AC7E68869D27D2AB687890AA0F61416EE1A3ABAA175DC7BA66C7F5FFFFFFFFFFFFFFB6814302050384F51C7BE497D866D3C18CFC2A29B929F64AED44C291C073DBED6C4FC22A0C4E1E39FF02E5DC97DC30FDA9449C20DE56D949E721FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3E8D9916A1837294DD55741BD664DE8332BBF506A46ECE87B1DA0B3F8C6A2439CEE656AED06D5020D6D19567600626CAB2DF9987D0C6B04129301000000000000000000000000000000000000000000000000000000000000000000000000000053AB6ADCD85C2DC05246C243C2A48CD2465F7A73A94055EBCCE754662405497763B4AB2CA579CC861E49FF6C9BD2880A84F98EEC446F0C0CDF7303BB72100000F432FF46840FA1F04BAEF2C18F4712EA7A42990DC7DCC7CEA98DCD071C0A0D63277F378B76353920616E4BE12B9F0C075971F620B5631252A44D7645BE071B0029FCCA6B53857151E594E6E300D054AE9A5FDB565249D46BE4F6077529F985533E4A435066F5C7629CFC98C916AB5695F5908181ECFD3961C55F42B54056180041D90F5D9E50B5813B55AB8E95248D11C30B074631005A975F87F30B0454B33989757C79297DD4A55A7AE94E7148AE3B469232138545441FC07C13B5D62C19005C9C94F6955B8944CE7AAC0E00FED09744118203737E2DA3947196B04A0CF9D4ACC1F5F98A7057E4CD7E62D927B96423AB236B93DF01E4A73C6D22003BAD1600512FED2B7A7D1BCFC1398BDFBF2F4E51176FD752A3F6DBE4DC2EB015CC984BF3DE787D68EAC3F7D9FEF734364EA27E6A806B80DCBCE9C93F503C1754523723002FD394270321063C5DC99EBDF8DC67DD4E6432FE6992EA16EF4D931A3FB73E8554EDE4A41076A007628CC6D393E186A661B43443E95C67489ED961AD399A1D0028BE2852F3513D414F5CBFD494B7103E51E37A313280BA8411BAE9BFC9774E99F5A8D2E8B2ADDADDF48E57C454A68D30453CC9F93CC195C6AA3EE36FB11D240004D7530742FD0AC1992DCF9DCCB9763C7DC8AF5FA493C1B94002D64B71EF1F892938E1F4774682521AB6131D528A36243287B9FF7BF4517111EC096213AA14004D61AAD47E95572E3AA86C7CD7E675AA6EA30E0BE347033B69D99A47747450BE7EF99F59715E6ED2B617BE6C37B5858B525043BF3864EA26F6369AF6C7DA1E0038ACE8885C845F1693D7B3A90D63E8ECAA39186F75762578B39B4F980F5704830D7816A85E2EC38543A7A0DC95069D3A8E6104D25F19D1CD68C02F7556F8030015CC4627EB0686449A71785664F1969D08506084209CCD0DF44F4CFA0643F71687B6553E65476C3C533ACEAF3B5986AAD31B61D9084BEBF23839189181671D00FA6924939C1C555F8DDEAA2AAB40A987F8E3BEB8356795D2B478563A4E4E66E3943F421C61FA2B4EC9D08B99441241D0836547BCE3AC5E60A61DE4EF34F20200E9BFDC6135D22A352FE5E3BCD67FCD4493CB43147B7E32FF47288545C94F12E0B14695C50DE28A8A4F03B7FD19C0615D46D787DAA80DDED64CA8B0E5B7480000 -smlen = 3404 -sm = D4541A47F2821BD3FC53D225CF7999283C3101E2EA118FECA5FFA17D646F2C68932BFB172C002A713180687815330F0137374419BDCC4E4801E3FE4D05DE32D6DF83792A72888FF506909C006B1EAF75B113EA8622A9000600798864FDA001A20E8E7CD40A37EF148D761719501ACEB6C10080E9A5DB3349CB8ED48FAE43DF3111C3717F00FF8477171B676693CD3CC920EC18F82E9E84010227BD83FF6B0C5CAAD807887AF75026355900F13FECAC367A880FC4B681D42CB46089673B009B2A6B9A8B1FE04BF34DCB665308F25218C100888120A41B949585B5853E5B568335C664A101194A5AD44248A1753821E11243AD43A9FE10015C0C517D435A8F19F369879EADD375F40E0600017747066DE25593908FB2E236FC582FD5BD13D3E8E555E05ED14B1F1046FD319D0703DD15B2070166964157D2F21C76A1BFB42E2F00CB8E9133E34D320B308C1ECE87E1019163116C86E64D90D35CB216FED71BDBE6A0797A48CB915F5A40FC8D31AD340767058B28CFF0C240720327E12E653C1F98B5755D8000BC01324DB2820781B94C4434FDA76223845E0613E2526A95F28FB4A768B1487AA34DADB28CBE8DF4FDB510DFFE672FF004F37C7AC32072A24C0F12A050BB396AD56346F4E0BA75C0EFAC162288A7EE8A63255DBA5CF451A0932FD56B05E40EDD491293E045A6081F6586BDCA10B41A6970D8F9A7B3B6B58AA772EEFA9ED22C9A24A384D6947770862BE4FE45C5E0E56FA4D116B79699ACE41E5D9F2E4C245059CD798DD986A3763F527E0C9D5A88A09C4D76D447348509FA7D9BFBF3DEA59EA57711A3B1A9352123D4A74DF273FA24A89BCAB42A6D455B5FE3C503F1FF638280F87C740B9E4C5FF20133CBDFB8D08CAEB7DE9F26811D437E6EC8C3143C0419C2F5135D25C7F40C7908C03F295FD26F1A03FBC7285196BE40ADC6FBDDDC912B3BC94B0BCE08DBC2185EE3CB766325068DB55C31FFEBE4B1F6848AD4FC201A5FD056916A397ABE6A66FF9BB03B037B50AC509E46CA441ED45812E3334FD7036D190A7991E55CB817EC2A63CD800F293277E7D15F086618B55AD395C614D168FCEDFB274FDF4FCD50CB976F68A266C5365E02A1ED0221BA4E13E70304824F94251249CA23C089B4D54E02EA03FB7C9841DD30404428AAB2519D68CF564D75D18530C7D062496C120A8F5305AAB23AE52255EC919EB0CD875422B144BF47F7472349558E746B0EB5493F1FC40ABDADD2ED84A8B31221A485052369FD0B552972C9FAEB1A78E826BA4DFB9E91E301DB589E9D7C256E7051692C48534C6A5E2BF0F45B78ACA66D5F53E549827E15D64E2F294F93D43B9F36BEDCE6CEBC05E56CED3F846635AE3C384C3FD55B969CA31E8C625103C2B24E7EE45E92984CA23A331C5B14281B20116069C619D82D6080C6FE35C3A3FB2E73B695CAD9C5D3300814FD65738DCC3EAFCEFCD24361AAD13A25B3570D2D509FA449612BDB5B49E0605D7EB78449D1DB40660AF0F3D8BCD4869B6F175CD28AD72FE2668C3DFC1D4963D0EAB309DD50B74B9D2947F86FBE9864AE5D0DC69B55B182AC1D914B11F631193F5F1F897CE52CEE97D7AE95631FC2F2A1AE9B672165432EB2E5633B55185AFA5E883268D8503AEC10774D25D39C800B74405414FB06C55B8C48835577884D6B4F2F128246563066F8F34D76213E0720E899FC1F11A3B0A591885D82C688E40D6B44B54D6C7C6973156E2DD50C40A28D2EBBA60F5117D64646CAEF72974F4B8362E4820EC04F2F373DA8D883AF27518567688146F16BF4E10969E70BE8ACE5D2FF6A135DB1DD738907EA355FB6D243904F6427D11592672060DA14443B55A9089167FC9D5EFB2C64B0069795C341F90DAFF684E566611EA87BC40A4C45F22C23AB6888A754B89E4C95BB54629CE74EC999889C82714B5AEC703DE7BC080B0D2E622ED53B645688CE164ECDFF4ED66C86049B2F9077F2A94CD685294F8EA9CBC1DE29A48D39F6B308288DFDB47731E39644B576A298646752F5C53D7943A5D0F7DBBC9604902B61B8EDEFEB5AB7E5BFDBC1E6723E6047894547E440E918038CC13B47424CCFE1A207E08A40524B553C750683F5F6C960F05836FB9B28C59E1B471FD5331F1811DDF3EAFF73798B7FFD6C9714978988C440CA906B4782A410372D70EE65A0A803061708003688F576E2D3A22580B706149A24B93A162BE9F1B546680A1DB2A8E54A576C28B4772C50A55161B2994514369C2192B2C90017CC8282F41D28099F38B2F1F0D2C0E46B444417A2078755591F00F01DF0CE72B1D1BD255A14D2BF67AB3E630F95A5DA9BD9E10F08EFBF6FE722CF000C32460FA3271F18B39EAA4487C1DDF828B6BEDF4523837BB3425BA1C1606E8D5D1E6182AA6A74F068F3E90B42641347CA755779216AFBC99603391FCEF4E8E5AA202BDCA24B83FF42F4F01232D3F2831CDA2DB76FB93A4CF6E9EFB71B5438A4B74C3190A8901D73566C50727559BA9BF6317D116E8F5536BACF064D3F86282E0F88DD40B63E75519C6A8E5664AF8E1029FAE87930F523E4DC7C2DD6DC3296A42A59F178D438866D929A70951BED05533EB1D818B7C7C595971C26B1D436D26897D6A6EB036A13511AC4A3BD724F2CA57FEF07D2C0730800D35683D745125F4237ADD64B538B7DAB0D0F258DAF7DE1A74F74A2FD010CDEE810F514FCF6045F0CC84E2054B5F4EC2772718FFB4CCA9C9BE77F8F007333860180D60EE4DD8CE976E63FF49AA11DD42FE6946515E59DA3E602B1861BD3F63C89362BCFE8438BC71959A617D8D63331A3D903BC5734B777FB14F7A2B063D79EA8637AC52C758EF88DF217B95FA8FDF1009AB28D8A4F318F78772568CC7AA9E3B3E001C0111B1751B698EF1B66383D6B3CA942FE4F66FC97613CFBBC03EEC9D0B7E08F80939D9A2EA1F72BDA7B0D655AC3A94B4C699D3EB1BBD6076E63EF5C1FE9CE258B55D21164CA7EE03BB53D8BA4306F695E648093542D769DA95A35FF3A2C071DD8ABD5A82E217D82317065D50A87B689AE3A2EC7887957BB243373CF986490961220EA61EBE12AC0287B185070E124FC518C300620B4B6D4F29402B18C2462A7985C00E2A87691053B1FDECB7AA264F33E27C6B201CA6065EF79E5266513AEA92E8D3E646453C089B5EBA66D14BC45844D0240D2E7737C16668FD53E38A93D6003146019777C03644C300D06927EF6994AC794914EFC5BE0CA81680CA8C9752908FBD2D56D7FD1FC1C76EED755408F1D7802F0D3D0F347D82B162EE6F0A2A890E083C20B822FA6C4AD627F4AB5D1526D83D897C244D6ED4A427B23B4A0C19F4E8889257C1373764AB7063B5DB8ED9C2443CB012381A2B3365EB568649D7CCD52271F25FD22FDC397E4C9C536EBB452CD2CD10DC5010BF433F88CB58D2B9EDF2BCBFA83B782FFD4388F1BCE3F8F9AF5AE6BE590BDCECB1BFEA846D2F0199ECCDB0C7E4D419F69B6A428EAEB462B67AA40340417BDFEBB6039AAB8242E39F6C11EC136D73FB315CF71414A2A1203AF08FDEE34ED0072C27462395815F7779012A41EC526BE53DA954E1F7A7EBBB68FEB15CBAEA8ADD6CD0F2FE3D3615991AB54F4C7884E8A80A9535F13BE2ED944B3BB315DE8AF2A70439294CD53F041F41D3562BE840C78EFCB08661B1731FEEC46A9091ECEDE3A9FBC2DAE42C72EBDD84308E95644373595DB62157DBA7DBF124BB45DE6C2837B0066673BFD215FF915A8D41637EEB029C345E444251ECBBCDF79E246A80AA4591976A00DA06C759C6160ED1986F8E15A562417DA55109174628E7B11D49586882851205755B4F99A875AB3599FDCC094E4A2164E1764D24DE805FD7B20EFEF2A8E23FEA4E206DFA1FD9C31D90C1FECF745D3EB886190827D952703AA6A99B5000D8EE9D51DE94A82DD053B6AA89CD7E94E92D4AA93A9224D3F688B5C834A53F2993638166A3DE78ABA7CB930CC5845F9915E6523683715A187E940FA2A978B5CA4C3B80DB62E96A600F1864BF0B1AAC23B1330B13EADD3A2F07CE7181D0A9497C455D228278E5CC3E4C00A2EA3EB8E5B9CE2799256302B0F8F1F829D3A3AE8AA7CC4EA229C5AF476C01B8D48A9F6987DF57C3469B6EF6DFCB488A3D5B91FE17B5798FE154AB8399A2E75F0D15B2A6AA91302056266B22A38A604EDC374E2D2155ABCA119C11DC6827A47E3CEE7032F6E0F59708DFACE221E47041CFFC59CE0334D9B7C5E91C2C320A70EC2F32906624128363C893909F47BD970DF652D5E6C2324033F32B1653A039F8C051D9DC8F839C50F5696E9E08F7F1CDAC4750B429AF03176FF6E643ECA1D8FC710C6CDB0D26074D85316F4C9084D5F453F6D36C1CEA0E389F3462E1478E2503C1DB99FC46F3F0627F173672C21F3CC3B483998192E81EFA689819D0007762ADBD141A058587E030A3568E412D25662C40ACDAFC3C6EE30C10CC23E3DDEDB6C73085C90C89B1218D67A328F06C3637A786D4715CB9F9D8B0B22D920B68B0557CC80A56FCE0B6E2D6627DE576E308757A8F37821898E96785AE323E413D3572205B0A5710143A2621C258C76C7C3FF7100A2FCAE99C84D1AB1CECF7FC5B1E4698BFA3BA2A0856A65F2D4F291A4A164C0381D70D1213F7E40FC4BA42C43EA8E70043E27C5AB0827559B7CF7F2587D0D2F93C6382CF54E92764D815280D68C554E5B6FBB351BD18635786299DDE39FCAF3EFA708A3F18701EDA1579BFB0BEE4FA1F1ED6E09D450D427E4B91F4552F87F31F06F109E74AF4BF301481452AAFA2146F6375DA467EA008BAFC3C8408AADD61B07C28C55249EC0C8BFDB00EA - -count = 93 -seed = 55A9C7A0B49706090BC0702ECFC070AB060427FFC820C3FE05B499B59AEB125F2DB4787A5910B88C6F8FAF0A69BE0AE5 -mlen = 3102 -msg = 02C7C4451DA90503C43FDED1CCB3DEE468A6A8D9E56670CD8F6A58E7941F1BC5EFA6E2AFDC0141A2F7E8F781D79E70B4813263A9DBC8D8A67F89371CFBD90977EC96461B28BEE4C644F2C91E96257B1909B84ECB25CF438A3FD6B835E20D5CDA56A1FB7995FCAA0EE1B5327FB1288E3C57CBEF0554CA5AD6FCD1F1865C6AEC6CBDB24495700AB5AAF078D8516CA4FA3A231A97C77BD150B127CDBFB42C03702C9027B2A5F6594B022EF55B63BF3EEC27EB0E9529ECCDC82BC6AD1F011F167D602EF1F175DA5DB4028BF08A053AF2C728ADE93B37EDC2A75B7B6C6CF38CD1C07F359C73B131B13DF76139DEE6795F1D85B47F29AE97D0E40CF5DBB67360044F78940A1E80D9D99FD5AB0185210D8769911BC471650DF0FCB9C3AF038F7882F677790E146E612FCDD6FB89F90B7E5E46CD648F4BF8F736D69F8A91E4806346B4366FD48D1481C0B47ADD82003310B0A99B779D63EDE1771F50221651B2D8AF40F48B92EE1327C85A1D2EF2D86378076BEB58556FCAEC6029649A0EA5FDE517A85D87704210E071FCB6F63317AEAC3EB3E9746018E1028C50C790A45B1BEDA6EEA2D646DCE401AD5D7850A5F69CD85301920DE77AB0D01B1361EFA3E70AC05881BC02190720ACC75A691D6064F9D24C79DC72476309E58CDDF5FB2A253D857A79C8E898AB6ADC300EAAF208820CB02F5F2CD317F4052D40DE28E52C55A0349DD855D64E8DA8296D4F572281E221A3D27EF76FEE67FBE5484E6460C99950763B801FCE828E93D2A633A1CA5D7EC582D7C463DA5A9AA8056BB2173306F3820BD0A3273742789B61AF89CCC42B81CC68745800D2A59231D5D28E832F443A871DE5B6B10B58A8AA7CC9816014D7F3545DDF1F481B7F0C9DD41B4D96E5DB767B74776C2253FA230DF65F3E0B944B95ECD4138E2847418B084D9F9E0798CB5247238EC12B88C10A5C0C645E1D09D09059C72E33C28A472FDD8B88EAA93C63BE7D980A12195C2EC3105DF2BB81CC9C3009F7771B6B813CD12303E3A9961D6731AF55ECFE5127BAC68D06F835DD5F2D584FC0E648C3A4256E2A3D4B81966010964657F33D1FE0400724C488D5AACF9F2C0B802CD812C8452E5B8E2B17FF4A1289D33FC405F5DB4ECAB4A73FCA3634756DFBF9012C413B6F64788FD0F68F8AB7620477ACD3C14009377F3DD54B9EAF2784433D63341323F54D113FD63D7456AFEF885F13C13172A37A5DC82336B9515F8F7F4903EF6DBE9CB34930743B6ED11265CF94AAF406DEA9802D17BCB369AD0D9964792F74D338DAFE47EE88B3B74EBA8E70774EDC1F16FA876FD62B0BFF880CE252EE4435B1DEBF36F0A06A4FB406F01D618C135E6103E2A39F4C9CF41EC93702BA76BA753AB49B5836C20F67D05943EDDDF47AB8C5B81F4BC22D773305076F7E5B697A7B25B016190072F756F19F397884E0521595326CA591672684A3BE17C9F5CC8E8F4848F7136762178FBDCC7BC6A6C6A31345FEE687B0505F72BF1AB7EB87BFE5F896CFD42DD67A239C70648B39BC0C84DA33CA17838FB4213C38B68F22914FEC3DC50194E883720719E9B5F8D037DEBB726DBD899ABD97853C54B0BC347A322BFAF961C6CD6209C98AA81B8E2595FC151B1375BF4FCA2DFF49DF40A3D1C694EDFF6E9687E73EF62DD42AD7A05195A7F206F097196AA0E4D68F8132D4A00CEDED940C4F6AE02E6D3763073462C7A4BB11778290E744471EC554A05917E52C5263FF02C07BEE055234EEE10B79175DC164AB2051B03598DF1D4311E87ACF4AEC45C55B1A58B0F05EBDABE248A27C0187643CB8F9529D31FE0AC4A28D780196DA00DACFF5F2DD64FB04E7C159DBBCDD3343BCB7AE188DE15D923D2AC0AF232C5389DC9C949FCE554F7A0425D4F9B28DF2EE4B81740C2B5A5B93F0F7AB75EBD360CBC78B11C28608B5BAFC970CF3D4455A20A198392D876EDCF89E2639B50CD84AE21BD50FB077050EBFFB210BE711D8EA807CA66493650E909911FD3CAD99AB94B2AB2EDFF192D9D75257818272E147A9C54E06C53210FC091BF4175F2F44423669716FD9A6C4F96A0C4BE17839769A806453E55D7357FBFB3D7A458E70957D524C0E896398E135BFA68A0CC136FB93EE7D30AD463E32E152FC32CB8E7F0B05A30EB13C0DF98BC187EC0A54856D2EFCDA10A82B89DC8CD21C67D9B6DF3D7005EF3B2BC9DCD5D55B64DB40B74FD322CDF9D9911A00B5A02E1AD5CA9BF65D90DB709FC1E5FC84BE97574B09C83B49963A51228A667BBD84BFD8E0D90EC161FE5CA73BCB8D95FD7AFD982AB7EBAB51BD2B24CD6D356EB850D2C65593313D8EBB97E7DFA450AE982918582F86A356F538EB05AFD460566D79F040D36C93D3C645B636560007D51B121DE3FAFB3ED70B475AFF9617DA4B52937C628678B109C3B76BC15BD02B766A394893D8EC966DFD8033D12A8D98AC5BE201134325E32CB6786F4FAECD7DCD05AEF5F3739122B817824A672E71DEB312CB7DD6A77116B30715076384297B1962EFDFEE6D6D2B2ED2EA4DD802F4784872D825DB828557D4D927B7232682AD91CEC3E508854F529853A8797B7BF7BFF8E3C180980DDF4081E96A12A495ACDE0C73282AC78617C68A55A94573E5A37B859858D1E19ADC82821B316B9D346ECFC6DBFFB3779F692A62D20D1BC4E730FDE2AEE826E76638ADE3DFAA11057B0BC8A80E8905B15E41D9A4105109F18E7E1362149AE9C568D1D642D65B94253BE2B13E7230F8BCF34DC87241D1DE72A65BBA111C111CBF5BD618CD02E0A06E37F60B3736631073A6BE004C1AD5F0091A82C87B276F7C5AAF6938C886A6039DF23482E2064F6AF05636B4C6BA6B24A29AAF2174AF4BD959177203AE9B160F81CA6764948AFCDACF6BEC0B987C6DBE178DCF47C137C64809483019C5F2072D0301C19C500C60B5CA913C24A8F28F50E1578D806FF9F9B810CA14BF5F2268FA18DEC67D973EB1D975AAF871ABC980D06222493D900CEBD8811FA20D5DB8F8036430F8BD7F9554F7CB47F9EBF389F66C3CCF9F42DB57AFFEE074FFEE4EB3E11612FD8A8FE02CC4E9D2F8BB36C505CECE9DC87512AEB5D8EBE33328C5217CCAF2E1AF1E38BFA84C0035DECD8D8C250FB4D964E8F0AE448AAB740D9EE9D794390686FE9A95183F0D5166D479C51014F1F29D8FEC616E1A4E7A9C86E2AF790BC7BD7BB6F746A2266332E04AFFBE6B9512E6620681C3317DC846E4FD7974E8AE87E370ECF9DFED574E339CD7E8A663ECD1A7BF5842391913D98686F7F2145BBC420F2F58B89131D5F3BE41C85752E13504BCC549A8F690CD2B0E1E29E4DFA3CC76BD398BBF28F33A00C3915DD719F7CB985E9A0A7CC8190BFFC8BF47310C71418D7A6C629C491EB8E455148BD4438BA6B7014608B0CE6A1BC5B035BC174C9BFFD966D8305FE9E5619BCA3FE4B39E6732DC652531819AC828F86EA11360678E786EAA741382D713AE26A608D582A3E4583D45744ACEDD32670B5AD4A1310301B28A174DC9858A55F0C1B7486CD66CB0635083B0C63016E40DFC533AB80C9CFAF1378D00769DCBAD56B09DA3A4E6CDBFD8F3FCB951680020DCA58647665462E42F42DC14E7B20F262D3CEB0B1A2BA807B98D66232AD7D3839C298564BC36A134CC2447B1B9FE69271960459C0A6F897C1878140690DA7D41FD8AAA05A679FDC3037EB2885AD3C82374F4BB991745351292DFD8E54F565E0093776B7EA65DDCD500BEB4D15AF6029F2630A0062F2D4FB331B47B6A5E139D385016E1FA490EAA209636B1383B7D7DC1148F07ED2CC2C03FA7FEE09305F34C57B3CE899C18462B4F1EF88C1AC5259440AAB48C5849652AAD9D3CF3D31F36C7F64F918868182D36345BA5BB7A4EE088D8B081EB78FE977F5A5295177AA427215BB26D1DE33AD4B2D610A47F8C672EEDA703A04D0FAE4C5961F13AD6FCA81863D8A394135565D8B27904A511FD0621A532F84A47CCF4FCC2114D4C369B7A76822959F8CAA25A6495081CA9EC3AC3348A981618592C090B6439CDA2FBC932C8697B3709323E3388AF8EFA1B9CDBD65A65C8F0C302330DDBD10E0235F8030562452EDE447EE5A5A9A636AF6F615B1210AA7CBE69572B3467B643BC5F5EC3F9AD15B3AD918993355E209ACBD0F1393076DA3B0950803295B6571E476ACAA04D48A4627367CB7FAA83796C4178CA9071DCCB8D3EA70381B61F0C56D515E0A765E266DACB13056317AD8737A1AD541AACCEA1641946E331229F19BB54C20BD51E63D63BFFA13110A552FD0A95AB984EF53BD639EFA0568C6875B2798E3A0578C940C0C4197D3587BCB1CC45A99F5D37B1612DC1A4178A3E288FBD79DDACD049159D6A5416F9EF3F38C74449BFB2E6A894566C5C17B4555E154F29A93241463690 -pk = 5C4E46C6A4EE6F44CA683B985640BEB93A618FC1CF19395145C0DDDC44F5AC7FB0DA9CF6055EA3F4AF049302BDE1A28E1B467CBA3F2440E56FD66CC0385A2000D20C712F9B366F341EC76E1606A6C51514A6FD8BC8BF0BCE479522A71F28F9CCB5B4474B2D27BB02644D796F63FFBAE0ED34452C53EC428DECE6B8E0465A1A00 -sk = 5C4E46C6A4EE6F44CA683B985640BEB93A618FC1CF19395145C0DDDC44F5AC7FB0DA9CF6055EA3F4AF049302BDE1A28E1B467CBA3F2440E56FD66CC0385A2000D20C712F9B366F341EC76E1606A6C51514A6FD8BC8BF0BCE479522A71F28F9CCB5B4474B2D27BB02644D796F63FFBAE0ED34452C53EC428DECE6B8E0465A1A0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EA1D5A0AE3AC456BF68E4DDFB6391BA783209A05D23033F1ADFDEB56EB28C14D3D369CDD36A529A25CBF76DEA712C3B36F206152A81A237C24FE3CDDCC66ACC0E2214D0A8055100537D89386F75351FF3CA4081045ACBD447A0F00000000000000CFCDFA94B8B262779CC08BFD26061B5E62AA1C337B1720235A957F334526E1CE80E719BC65E0A1FE1BA4FB9AB4B6FB170F003DFD1EAB420144C3E7CDBDECC8077C15DE04326FAF1A1E157F377D70142CEA8F692997166D64C6FBFFFFFFFFFFFFFFA10B1F8FF4DFFF2C77AADE09DA15E503F9A370A014E4FB46EE69F7F7F11714E8CCEAEA3FD832DC8CAA2991B19CD7773CF959B988E2CE4F4CCA57FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8C596FBEC7912B6785ADE1D800FEFE79D93A5388A9CE4174A9A0FB0E1096C6A5C6D7EC61811B21DD003D9815D4ECA3360289C677BE3AA84273010000000000000000000000000000000000000000000000000000000000000000000000000000454B48B21A6DEE991B12692CA4DF88EA09D594C3E086DD065F47E24AF098F1AE079EB534EFB6CA3C4891F7DA61A964428F84B71D27F7B59359B9578AD79F1E00405987A7E3203A2B82E1BF02818E8EC62FE798F5DBA60B66631926647FA49F9D6DEA0F3F98DCDE816BABACA20FCE18C0419CB31652A3DF2C504524CBAC17030002EBD76C95D78E0E8887093202AE329A8BAC594DD5425F91C5D20D724A315B03319A0EE001DF30F26E2DBD1BBF77878DE2A2AECCC4A26A12E0D14467CDAC1400DBBB05D6EC3A94362FA10307A3140521FC1BAA5F7BDF0277ADCF95529C87EA761A417E21A50DC0D8A60BFEE89E400D5ECD8FAA1CA994BAE425A9DBE2BDC40900D9C7D8D847D189076F35F5C370804149A5E0FE9140CD6F58DCC5BFD93958A31DBF7C3572CB1DC56379A1040B42FC1D5FA04E399AFDD670A79C548DC58F3A050043F04E9806C3C5A8EC21F471FED8C1E0E24D244C2F7D8EA26D122B41FDBE68319E9BE925DEB482FA119EB281C86BCB0CF745D038E3803792A052F8C5560A220087814B9D9616702605EA416FFA45C61BA28B552A8E56AE65172FEB0BBBA6A5D19F20F9B12538BEE07F362A458E2CF09318F22032A98FCB9BFDEF44E5339F02003505E07D077E44E5D7CFABE42893519B8A679E13381DC978BD42E63B31A716410E8513EE6BBFB0023C10A2ED20A69097942D5B34FC38046CA2B2A93997930D003848E31ED5779E3020892DA44F4D04DB104B0E8BC7736DEC4C2863A89602941C104022B56BCDE6D091511EEA137D2A2B8CD91EDA3B69BE96926C226536290C0089A3BC4C287AE869741187C7BA7F56E7F570947479412EF0364F8DB73F362B41DDABC3581FCA40C0F0B3190B82616C084318109128F99BCF9BC2D4AA5A192300B768E1E10DBDEABF7CE436CC6B2C61F4863B0442BA090EDDA94EB601E56AB93CCDE33C5985A812B049AB8EAE6EADF91D973C6839A4E41C43D32DB089A57F0E0052B7EA761D45FDFB33E5154EBCD15514671488E8979A0257FA68076061F283A218439C4724CB41AE31B0307AA11ACEA084C9D14DCCDC8913A3560D2D757C0B0029634BAE0A4297E05CA56DA82ED64E4944A554B9A1BC0B99D9BD1063856474951C7CAA492F4C2103AE2351532E4CE78D52FAECD51445E28EFF8D4E1325350700CDD4E582D8BF9F05771C5F6F0E4B20D995F5B82BEF587EB0D99D963198A5E1A4EAB5FE81FBF276880622C825AD58EB9086A0019AAF84ECE43A329F3FA22B1200 -smlen = 3437 -sm = 0EF63B4007FD9C832DC72FB7A3628C1E1FC301F7F5219ECD6964D579B1DED82F7CF6E3245A019DA9FD9EF167B029E0518AF53F538B82683B0063E7D83D4C37C8B45920781A3C319E28AF160119BB6F5D9048175D52F31B17B5753010171E012E2DCA6362E20188E1C82B6AABF3271E08D3015F924AA4051DD251C289F31A6D0EB9F3B922000802B88C81A50AC4F9660C22FA4C68520EE301DC2B2E73BD1E6EB723A1C432FBABEE03D68D0190E4643ACEDFE202D50D8A718EF147F09C0D014294827FF70D924E66E369A23927C2F5B13D0097484E502ED88927841E990C8F0EC9C3F6B101A6D6C9D54FB1CB7F39A3453810AD5213A3760186A2E6E326C453E4D1247248A6265E97F3AA0100FB00471DA24DC286A2D154869336A41DF14788F6E1B9EA6F69C9FB8A1932A6250801AC8119E41DC7EF1D3BE53E81B6F1CEF275FC00C9F4778EC15C6B482575F3CA1FEB0202C7C4451DA90503C43FDED1CCB3DEE468A6A8D9E56670CD8F6A58E7941F1BC5EFA6E2AFDC0141A2F7E8F781D79E70B4813263A9DBC8D8A67F89371CFBD90977EC96461B28BEE4C644F2C91E96257B1909B84ECB25CF438A3FD6B835E20D5CDA56A1FB7995FCAA0EE1B5327FB1288E3C57CBEF0554CA5AD6FCD1F1865C6AEC6CBDB24495700AB5AAF078D8516CA4FA3A231A97C77BD150B127CDBFB42C03702C9027B2A5F6594B022EF55B63BF3EEC27EB0E9529ECCDC82BC6AD1F011F167D602EF1F175DA5DB4028BF08A053AF2C728ADE93B37EDC2A75B7B6C6CF38CD1C07F359C73B131B13DF76139DEE6795F1D85B47F29AE97D0E40CF5DBB67360044F78940A1E80D9D99FD5AB0185210D8769911BC471650DF0FCB9C3AF038F7882F677790E146E612FCDD6FB89F90B7E5E46CD648F4BF8F736D69F8A91E4806346B4366FD48D1481C0B47ADD82003310B0A99B779D63EDE1771F50221651B2D8AF40F48B92EE1327C85A1D2EF2D86378076BEB58556FCAEC6029649A0EA5FDE517A85D87704210E071FCB6F63317AEAC3EB3E9746018E1028C50C790A45B1BEDA6EEA2D646DCE401AD5D7850A5F69CD85301920DE77AB0D01B1361EFA3E70AC05881BC02190720ACC75A691D6064F9D24C79DC72476309E58CDDF5FB2A253D857A79C8E898AB6ADC300EAAF208820CB02F5F2CD317F4052D40DE28E52C55A0349DD855D64E8DA8296D4F572281E221A3D27EF76FEE67FBE5484E6460C99950763B801FCE828E93D2A633A1CA5D7EC582D7C463DA5A9AA8056BB2173306F3820BD0A3273742789B61AF89CCC42B81CC68745800D2A59231D5D28E832F443A871DE5B6B10B58A8AA7CC9816014D7F3545DDF1F481B7F0C9DD41B4D96E5DB767B74776C2253FA230DF65F3E0B944B95ECD4138E2847418B084D9F9E0798CB5247238EC12B88C10A5C0C645E1D09D09059C72E33C28A472FDD8B88EAA93C63BE7D980A12195C2EC3105DF2BB81CC9C3009F7771B6B813CD12303E3A9961D6731AF55ECFE5127BAC68D06F835DD5F2D584FC0E648C3A4256E2A3D4B81966010964657F33D1FE0400724C488D5AACF9F2C0B802CD812C8452E5B8E2B17FF4A1289D33FC405F5DB4ECAB4A73FCA3634756DFBF9012C413B6F64788FD0F68F8AB7620477ACD3C14009377F3DD54B9EAF2784433D63341323F54D113FD63D7456AFEF885F13C13172A37A5DC82336B9515F8F7F4903EF6DBE9CB34930743B6ED11265CF94AAF406DEA9802D17BCB369AD0D9964792F74D338DAFE47EE88B3B74EBA8E70774EDC1F16FA876FD62B0BFF880CE252EE4435B1DEBF36F0A06A4FB406F01D618C135E6103E2A39F4C9CF41EC93702BA76BA753AB49B5836C20F67D05943EDDDF47AB8C5B81F4BC22D773305076F7E5B697A7B25B016190072F756F19F397884E0521595326CA591672684A3BE17C9F5CC8E8F4848F7136762178FBDCC7BC6A6C6A31345FEE687B0505F72BF1AB7EB87BFE5F896CFD42DD67A239C70648B39BC0C84DA33CA17838FB4213C38B68F22914FEC3DC50194E883720719E9B5F8D037DEBB726DBD899ABD97853C54B0BC347A322BFAF961C6CD6209C98AA81B8E2595FC151B1375BF4FCA2DFF49DF40A3D1C694EDFF6E9687E73EF62DD42AD7A05195A7F206F097196AA0E4D68F8132D4A00CEDED940C4F6AE02E6D3763073462C7A4BB11778290E744471EC554A05917E52C5263FF02C07BEE055234EEE10B79175DC164AB2051B03598DF1D4311E87ACF4AEC45C55B1A58B0F05EBDABE248A27C0187643CB8F9529D31FE0AC4A28D780196DA00DACFF5F2DD64FB04E7C159DBBCDD3343BCB7AE188DE15D923D2AC0AF232C5389DC9C949FCE554F7A0425D4F9B28DF2EE4B81740C2B5A5B93F0F7AB75EBD360CBC78B11C28608B5BAFC970CF3D4455A20A198392D876EDCF89E2639B50CD84AE21BD50FB077050EBFFB210BE711D8EA807CA66493650E909911FD3CAD99AB94B2AB2EDFF192D9D75257818272E147A9C54E06C53210FC091BF4175F2F44423669716FD9A6C4F96A0C4BE17839769A806453E55D7357FBFB3D7A458E70957D524C0E896398E135BFA68A0CC136FB93EE7D30AD463E32E152FC32CB8E7F0B05A30EB13C0DF98BC187EC0A54856D2EFCDA10A82B89DC8CD21C67D9B6DF3D7005EF3B2BC9DCD5D55B64DB40B74FD322CDF9D9911A00B5A02E1AD5CA9BF65D90DB709FC1E5FC84BE97574B09C83B49963A51228A667BBD84BFD8E0D90EC161FE5CA73BCB8D95FD7AFD982AB7EBAB51BD2B24CD6D356EB850D2C65593313D8EBB97E7DFA450AE982918582F86A356F538EB05AFD460566D79F040D36C93D3C645B636560007D51B121DE3FAFB3ED70B475AFF9617DA4B52937C628678B109C3B76BC15BD02B766A394893D8EC966DFD8033D12A8D98AC5BE201134325E32CB6786F4FAECD7DCD05AEF5F3739122B817824A672E71DEB312CB7DD6A77116B30715076384297B1962EFDFEE6D6D2B2ED2EA4DD802F4784872D825DB828557D4D927B7232682AD91CEC3E508854F529853A8797B7BF7BFF8E3C180980DDF4081E96A12A495ACDE0C73282AC78617C68A55A94573E5A37B859858D1E19ADC82821B316B9D346ECFC6DBFFB3779F692A62D20D1BC4E730FDE2AEE826E76638ADE3DFAA11057B0BC8A80E8905B15E41D9A4105109F18E7E1362149AE9C568D1D642D65B94253BE2B13E7230F8BCF34DC87241D1DE72A65BBA111C111CBF5BD618CD02E0A06E37F60B3736631073A6BE004C1AD5F0091A82C87B276F7C5AAF6938C886A6039DF23482E2064F6AF05636B4C6BA6B24A29AAF2174AF4BD959177203AE9B160F81CA6764948AFCDACF6BEC0B987C6DBE178DCF47C137C64809483019C5F2072D0301C19C500C60B5CA913C24A8F28F50E1578D806FF9F9B810CA14BF5F2268FA18DEC67D973EB1D975AAF871ABC980D06222493D900CEBD8811FA20D5DB8F8036430F8BD7F9554F7CB47F9EBF389F66C3CCF9F42DB57AFFEE074FFEE4EB3E11612FD8A8FE02CC4E9D2F8BB36C505CECE9DC87512AEB5D8EBE33328C5217CCAF2E1AF1E38BFA84C0035DECD8D8C250FB4D964E8F0AE448AAB740D9EE9D794390686FE9A95183F0D5166D479C51014F1F29D8FEC616E1A4E7A9C86E2AF790BC7BD7BB6F746A2266332E04AFFBE6B9512E6620681C3317DC846E4FD7974E8AE87E370ECF9DFED574E339CD7E8A663ECD1A7BF5842391913D98686F7F2145BBC420F2F58B89131D5F3BE41C85752E13504BCC549A8F690CD2B0E1E29E4DFA3CC76BD398BBF28F33A00C3915DD719F7CB985E9A0A7CC8190BFFC8BF47310C71418D7A6C629C491EB8E455148BD4438BA6B7014608B0CE6A1BC5B035BC174C9BFFD966D8305FE9E5619BCA3FE4B39E6732DC652531819AC828F86EA11360678E786EAA741382D713AE26A608D582A3E4583D45744ACEDD32670B5AD4A1310301B28A174DC9858A55F0C1B7486CD66CB0635083B0C63016E40DFC533AB80C9CFAF1378D00769DCBAD56B09DA3A4E6CDBFD8F3FCB951680020DCA58647665462E42F42DC14E7B20F262D3CEB0B1A2BA807B98D66232AD7D3839C298564BC36A134CC2447B1B9FE69271960459C0A6F897C1878140690DA7D41FD8AAA05A679FDC3037EB2885AD3C82374F4BB991745351292DFD8E54F565E0093776B7EA65DDCD500BEB4D15AF6029F2630A0062F2D4FB331B47B6A5E139D385016E1FA490EAA209636B1383B7D7DC1148F07ED2CC2C03FA7FEE09305F34C57B3CE899C18462B4F1EF88C1AC5259440AAB48C5849652AAD9D3CF3D31F36C7F64F918868182D36345BA5BB7A4EE088D8B081EB78FE977F5A5295177AA427215BB26D1DE33AD4B2D610A47F8C672EEDA703A04D0FAE4C5961F13AD6FCA81863D8A394135565D8B27904A511FD0621A532F84A47CCF4FCC2114D4C369B7A76822959F8CAA25A6495081CA9EC3AC3348A981618592C090B6439CDA2FBC932C8697B3709323E3388AF8EFA1B9CDBD65A65C8F0C302330DDBD10E0235F8030562452EDE447EE5A5A9A636AF6F615B1210AA7CBE69572B3467B643BC5F5EC3F9AD15B3AD918993355E209ACBD0F1393076DA3B0950803295B6571E476ACAA04D48A4627367CB7FAA83796C4178CA9071DCCB8D3EA70381B61F0C56D515E0A765E266DACB13056317AD8737A1AD541AACCEA1641946E331229F19BB54C20BD51E63D63BFFA13110A552FD0A95AB984EF53BD639EFA0568C6875B2798E3A0578C940C0C4197D3587BCB1CC45A99F5D37B1612DC1A4178A3E288FBD79DDACD049159D6A5416F9EF3F38C74449BFB2E6A894566C5C17B4555E154F29A93241463690 - -count = 94 -seed = CEECCCD3F7BB922650E3F6E8F20C47AF17C1C1053EA8FE08226F167D67C3B0781BD774C4C7AAD23C6AB0B9F3E3F96F97 -mlen = 3135 -msg = E13692E3CC06EBE8FF9A292D890F0A34DFE9A4F968F196B475AC4DF553A30E2FD5DF008DF4D7508302AAF6389B6A5A9135E9BC8A5ACCD2BD2DF98FF662B763101D31E24E8F182FA50840BE27F76BA5ED645BB4D3F7F2F6CE25179A47FD7B6441A9B3A28783CEEDB425B2912734A75D7D03811172188253BD8F0F52EAEE84A9FB025F95EA1B566C53297A6A090F7FD8B21639523E073ADAA750D63DA61631F933FEDFFB2819E0EB3074E9E11E10B102AC88E2C8D6CF408FD241AD301F9B8E18A88B74CB4B0DAC76347635DFBB3EECFDF84229BABCC003C6E4EFB7394E25667DD7FA47D36E027559F53E98789E6E732E6AA23A71607677FB975C2852367C5BA5E3D10B3017AD26F9A38CE803929D08A43646FFBC3980B359D8BC2E9615636D4E5DE8DE6FB2465A983EB1696E98DD33FAEB7AF8C2D30506B22390D7F9FC21C7A016FDF22D21ED2EA4175FE9F5F44598EC26452700DC9A495675431E1236865F2F4AA5BC9C9A10EEE9E29B1FC4FEFCF8F24BF94342FC7E19AA6534C3B771D910AA419EA2BF70E2C1915891CC630A3397551E4F34BD2192B70EB210EA67CF152A35A3F5D0878E153579B42AFAFE5068B2BE2B48127FFB54553B7A9B6F845E7D72C43938AE42BC03E33B836AB212909510AAE7DBE8EE6D0EB8AD84D60832F3151273A1E09C514C3AA4CACD15564643F4255F36059022B91BA4137ECD97B34BE3308D40EF06BCF4F45EC625B54C7347F52A21815508199C8B7A6212779CD171894DA9FC3DE2A6EF5D76BFE03B8199ED1DC92B2A403E4DA009CBC0FB597C5952BE32579EB8E781EB12D935848C051029C528CBB68CBC1DE0102B42561E21F48E72E028C2CD8816A9027914571B49D2F94C9189E1A7F18D7D3D0A09B3A36EDB8A084ACE5FCCC77E3E42EDA0FBAB8C81EAF170103CA757981839C9448362BCAAAA3F20C8DC653AEF36953559F3597E1915F02A8D33D0E46201FC794EE055E6D9955B91FC7ABA1F136C280367404725CB355FC2F129413581401F98236D2A6F8BED7FDD7EA99060DABE3F0E8CE20B0E98EA80994D1673E8CCC6A0BA4A9D544F3D31BD95C9D3847527A978C1F155EFD84B6A7BECFB749628CE82E80285FC7272EA05F953404E437AD557F38FD9BBF77A69B81E4441605B23F2AAEDB00C7519D8E9CB4CAE5F8C3FA74FAABF6C12595BA045F647ABA7168C65C8A6006733D1341435495C7088C3361B50C43787EC24C24F57323466B5C088E8097B44666453010DA38AD65B426E72140AF78A5448B2F93DF3820F013FB9DCAC49604C86F2B2E4EA565463917285F148E8BFA9E11943AD3B86B14ED59A190CAE097DB26DAF8FD2A642676A37DD90C23B52C82CE028B80A805D9BA05457F7B6CBAECBA4094822E16C14D6E2291B731D581B12FB16802653360AAA6A7989D61C80DEBFCCE81A36D9ECC84039C4F086A5579D36FF5D0CBE61292E4FC3D14277AF380A9C1DBF36C2D61F59CFC0D62524E042710BFF5BA719E56BA367FFE849D660B9F7F3B638E113BF2E1A4DB1B8F65A0FD680BB2A168A4FD5B4E0EDF3208AD47F1FF4AFBAA726E38763CB5C84C03DA3D1E32CBA873B9A0C750922CD3D0A10A4877EAFEF602F5C875FBF0EE2F4F0AF7F308EF934F7E8E74FDA62A860BB594FD061D1B2BB32BA613339042FD90E749ACEF450D204072ACF58B18C365E4F4B815F1E837453C4255D53BB68D50F3677E7173FCC23D2B592149A9F3DD615868AF91F705387547862D34553FD45B8DF643F596DFDB7ABA47BD5D91445826C86FD4D30365A2F9A3CC0913DE19707D072F27A09EAB906304008875B5BE3526210D6B8BC8663975A1F78EAB9CD7F7305CDD4C00D6277622E50606E1CADD639730101D088BC2BAB295AD86BA8E26F5EBCB3E9C7C543E533A7B3C20F0F89001775F714825DC8547BAB06F5B99C5305EF18372A184569323FE269D45B669B9A222C9DEFBB0B2C84F42A57EF343A5C12F5712EEC33985DF8F0C566D471A9403FC103A3EEED42829D8E3E5C517BDE29447841CE96C8AC587DF3E4B6227FAB386140DB0112ED0D2846355C4A45E94F3A0718CEEC13FD3CAAEEFDF0B7F89F502AACF8C9D96D01B5549157B7DF2BE65BC30C889E69971700286C561DF91C8CB923001E5F0E21D2C7A3DFE8D1AF07FECE1EDA20C031B29A4389F265D2C7BE64EC37B2884849EF30FC8A82D2F766ACE68C72F0A4B72F3B50884749814387893DB2370A3410F794C64CD24BF0D13E44AD500BA9816F9BAED72F7593F758592C2E974D1207A664B869130BAA1FA71DBC55875134E7CFA276E36568F79483886099A1070C14C6E4EB87523E04C0154A2250624261211723453CFAD185298DE06D08CC25FA18BC58B34ECDF5D9DBB02541BAB4A2AF110AE09130E12439F1CECC34F9AB5D7BE36C827A6F2F6708B543D4AD2E424805E2A74895742B0A5DA30CABE4AB45F40CBFCCBEEBDAB9B8EB8F78781168B5BC79E04EFFE1757AB0547B9BD0D2625673CE528D2B4874D46DF0E09C24FC413EF9AB4C3D2E803C1E316D77FF5DE3368BB925B2B1F6FFC340525663931F5595C8AAAF9FB0DCCDFA4793519A66D4FDE38BD2044C60FD1DE15D60BA878FDA570E7AEF6DB69D2527A1F1481A9D05FF2F6F621238939ACF5D2C37B2BC3A194A9E65E7441764A5EE37B1FEF3B8C9C425BE1B5FF0D05BCB6A3B91876EC04ED89A31749FD443C2B85F8F388E7070D77DEE37E2B666628CC9A961236DD24AF2769C1F613B4E77F8E82D1F410ED59F63F1DF19BC53A448106DE4F8EFB8CC37E40144B0F658A4135E25A3CF36D8692DEF2677E4BEA3A9770F19E44D55080625421D5BADEBEF3B39BE71C08650B5718A9B2FCEFC4BECB26C4B63C43F6557DD66517D103907F82F9C2B965B7C5E36059D2159183F5ACB8B5FF5E6B92E94D53AB25AE955424E80EDEC4650BE293E836DA6148392C500FF4B7672932E90E068569B81AE335B2E5013CCC95F571948D58127EB1269A08D6E897D2D9B60F3E49847C05D0B3AC230A67EB6D38FFDBD4B8D82D7B9EC803429C701F080BE86FAA165C0111131712DB4957FD84A8936AB55558C69D33D5890CADD08D7F0D4962CF9E2F69C7517E79DB14B76E6E188F5ED95169A2A7E4C0EBC2175EC2DD44ABCF239CEB3E22F955ED25DA41768CA5FD9A9AE15FAAAFEB431958A679249AB8BF879185E8FBF9986B96A92972153B4CD0D1BE001E5AFAE3AD1F0B1191F1483738E728D4AD240538E5EF7BC9BA4D5903929D74CB64241306FDBAAAE17B1C3134AED2CC394D3EF9653CC62A29C4B0B9BE04E95E072EC98F7A80A7B575DED4A1993AA884C1EDFFE056EC475D934B4EB0EBF418975728C6E9CB3919B2B67D2C71228A4DF1FE2C8388E3A2BDD75549417FE795F1947F857B1C0C9CA021515FD4D79E691493B988080943C394BF29E4190082A94F224AFDE5853323EA51C06B41547EEC0DA5CC202A048D77C7B91E794C51E72B02EA7C14578C11D9DF48E099465783E496029EBB6D42D9CAA52902A4694355DB01DD7F5D7C113AE06E3F712FA577E937CD4FB817659F93964E194FE7D509A81C258C69C3415A8F11D35B414339FD1CC1D4F50665D9111592D1C3A3D69FCF6A971C285A94F5FFBFE8D2FD2746DCEB3B218D970D670D10135126E479D92000D41EABDEEA4C04D1748A4908DD39C60A52AA5FE29C8ACED50DC1295B5C2C4A98E3C62EE4F370F4D3E500FE27B66F65BAE604FD558D66B7F09CE36C36C8B5B4FED193EF56D1D8DF0FE6FE0031466A1C633203966FE83D6BFF843657DC0AF176AA8D5CB7312CB4E072BCFF24D5F3828E29B2037E8D1FB63537C70C27011E9A97E3F04895F4E84AC69C55D450B46D5792A5D790557BE64F765FA243AFA98527B976783E7ACDF76A7E1DCBDA72431FC30D7B05197478D8D74077626FF7409F95B24A1F1BB6B803B9F1B9AD5B06883FAE6C4B587C309A63F3B2FC9619032157B98C1DA9608107E87F4FEE0DAE995AB86AC9869446CDE92441F0B9F8240E6F7F7AA9189D92B7FAA3280FA749BA8C7729F8974049C5CBCB8C6650CF1C16B8194C7AE1A82B40B8B04488FCC69E674362FE4821D4C1846CD9BC49234BCC464013F5F9A082FB83D63098C331D4B1C9129F52259CCAF4A9237F8EC5BCCF06F230C08DDAF1D0C21C5930F55D3D5F60CBFC447E7FCBC75CD199733F8D17BD043B67B0C138CB0C9C8F2E477728F27DEE573796F71B013689B537AEAD4991E67F2F5EB94BFAD9509D7C235C9E55F68F26B9CE8AA90834D170F8B700A40AE9A817D5D17B1644D25BCF1172A5CF0C755A6EC04FAFC39DB06AAA05F5988E187B9E110EEDEA9C84B99AD29A4B31950F2C870A1F91DAA6A5817FAEAE516FA42660FCF56000F7365D8C6CC11D4784C6FC02E4D0C727806E9D43B957BBA124C980C31F81FACC6D46F6C38D227EEF8F0 -pk = 4283FA9A24A1F6B0457CF86AB3C72144660538BFAA0B0EB4F317AFC13C4B49C83E774A3C5BB5C20C36BCE906B65BCA6BF3E22B2F7FC548CD92A62654D9961E0036F02E568FF9A342F4129E747A957C68905B3FC0586FFFB50553B5BFF51AF616B9AD9677AEEFD903CE55B296B65468962672FBE8349615D6F9090CC184831800 -sk = 4283FA9A24A1F6B0457CF86AB3C72144660538BFAA0B0EB4F317AFC13C4B49C83E774A3C5BB5C20C36BCE906B65BCA6BF3E22B2F7FC548CD92A62654D9961E0036F02E568FF9A342F4129E747A957C68905B3FC0586FFFB50553B5BFF51AF616B9AD9677AEEFD903CE55B296B65468962672FBE8349615D6F9090CC18483180002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000363AE04953F5A6A834F68A1DCB34112841C359D5B7DA6C8BC610AA87624F0AFBB8B1B74A089C2641786F84BB6A69D86080D0FF4D244EF525D1D8600A6D5BEC52C1A1102F3C5BC3B27835D6DDD458D20CA59394B982F7EB347A0300000000000000C71AD0A29DF7F146D01B6F647A73613EA50260A4729DFF3761E4056557CC51813D897E77F6CB9D9A62E59AACDD9F13B032958492AE44198E064206AFC0A80DCB5FAC25E2D678F0F791E7D9C249386F3AB9BECC6271F5031025EBFFFFFFFFFFFFFF69287599F9AF80FE03FAEF06DAA7491321E109EDBCBBD908C674D95D8AFDA4D555CEB29A7439293FA091F2D62EBEB28FE4BE714AA2C3792028B90000000000000000000000000000000000000000000000000000000000000000000000000000003E60A8155DB075E66E38882B8DAEB2763B93338A20999E2CE6C012D415F98074C01126862CE7F4F8C8EB61CEF98FC4AD51FA8AB076EEF5CC3B6C030000000000000000000000000000000000000000000000000000000000000000000000000000E74BBBACAE163C88991FE90EB145099937554BBDB77B055B93696EA970D50751E0C65ABA4572E626AD0538238F35F299484BBA97F75CEDFBF254E13FE5450C00AE4665E118835FA6C7B653B9F609E8B278D9F1A889A2AA492AB98ECF1556639B3D64123C47B9E7906E3B6C6551A66D7509D3AFF5FECA84127DFC1C0EC5B500000ADC0442BC446CADDA7AC7558958898071DAC29FC671889FBF6B7B68E20C53CD30C3C7E0168AD5F1160D2FCCBFD93704E1F602882AECA3B74DD78652F0302200F9DA94A65D1AD68D077DF6B8D6495032DCE71C07B64944592418500FF7B3E16322D94A03248A6C3A181CC9E51E63753EF32845592CBD3F4C579F56CF942E04000138699675E6CA8D17F78BD8C2268F07C49DDB8050DE8F65B902CC02466DBC693F7411C5455168DC2F9712EB6EBC59F2FAA9181B9B2039FCB7EC93B933A10600E31C2B6769E8F0910A932B1538E7BB1B39CCD19D9D6095A975D2165A0C4810097979C8F35018C5B5377D05A7EFFC8E8D135357BF9E911623AD84F3F2D71B2200031F13EAF2D7CD4B20D823A9CEB6024A525A455DC0274F5FEB3F343FFBC1C7462AE5B4A79D6080698C7EB5DF0708E21B96CDACDF52BF197D2B09E7C28A990A00FD968197ED413C0EBF4DBBD716D85C54FAB45EE43AD4906F402F65E044DFDBAAB391A6FE878D20DF891434B341D97B1DDD0BD455BB7B071BB436E0A6510F210066AEF404510B7EB1819CEF027E0A1840243DDE33E0F1FF113E2AFEAA123B34F7E099F29365006124762B39036A9FA633118D51AF7F0FCE5769750A74D5F90C007CA6EDA377DC1D785408AFD8B5A6DD823AAC5028D0079C7B7AEFC477E98AC297A11E7C4F6F30E02D7F60621AD051D0203659486E8D6DDD91A84F6932B1ED11000C1054ADA803B7A084D3641C3D2EFDAF723B84749A9FA214AC0FC6B1816C17CE424565FEC98E04C675ACF32FBF7444AB56EA43B07775BBA2EF2C9EC8846612007EDAD55F6EC52C40B2B26750032D35AAF6F5D1E5161493001866D6944A893B8BE7CBE3F80AF7E2332475FBF9F1E7D921D36F5DB3815A32DD838335A3FC20220091EF533126B227405D8C91E76E0CEE21E44259BBF86AF5108082BA55772F3A8879596832F702E0E55BD66CA3DFBEBE946CBC7111B902AB5918F4758F5A5B0A0094040F6352140D1EC3805E87AEAA29D6CD99E6D06ACC14A2ED3D14CBA352BC5A42A7296D63CEBD70822DBB993F0745C378710562920F93C86F4E2F9F92050900 -smlen = 3470 -sm = AC9DCB5306357DCC1E3CC4B2D3501E9722BC01EF4163EE2D2190137F36802A95F31CEFE440005E5DD502E4712538976AAAE0722A11F052BA012E1E4736C54E36733F23C55689C2FA1D212800C0886F09FA4758E1BB30FD828F6174D14E60011E9CC0D35683F5CC8113BD40AFD59CBC47DC0047664DBA4FE01B43C5DDD123D9D72045BE1500B8C076252DC452979D5B48BCB4D979D5C81D010CA76E4107093B0A296DC6C0EB23E9264C8D006FC11AA74B82E96C8B1137F243DE5441EBDF00215DFAF2FD58CEF305415CFCC9AAF8CC78FB01D38BD3191C7E494C109C53B0CD2632DAA3E201B1ACA5FC0B580AF185A755B72A02D2C061710024ECC0ACC2A246D7B1F12F104E1CCAFF470500004562F1A50DEA0B1E5BE1DAF6B83388BEF36B6924E32E17B93C6A3152830406860602C6C8A8F29168ABF1AC1F13BC4C4F7A2723B600F8C912D2512CCC55B936D4CDF09C01E13692E3CC06EBE8FF9A292D890F0A34DFE9A4F968F196B475AC4DF553A30E2FD5DF008DF4D7508302AAF6389B6A5A9135E9BC8A5ACCD2BD2DF98FF662B763101D31E24E8F182FA50840BE27F76BA5ED645BB4D3F7F2F6CE25179A47FD7B6441A9B3A28783CEEDB425B2912734A75D7D03811172188253BD8F0F52EAEE84A9FB025F95EA1B566C53297A6A090F7FD8B21639523E073ADAA750D63DA61631F933FEDFFB2819E0EB3074E9E11E10B102AC88E2C8D6CF408FD241AD301F9B8E18A88B74CB4B0DAC76347635DFBB3EECFDF84229BABCC003C6E4EFB7394E25667DD7FA47D36E027559F53E98789E6E732E6AA23A71607677FB975C2852367C5BA5E3D10B3017AD26F9A38CE803929D08A43646FFBC3980B359D8BC2E9615636D4E5DE8DE6FB2465A983EB1696E98DD33FAEB7AF8C2D30506B22390D7F9FC21C7A016FDF22D21ED2EA4175FE9F5F44598EC26452700DC9A495675431E1236865F2F4AA5BC9C9A10EEE9E29B1FC4FEFCF8F24BF94342FC7E19AA6534C3B771D910AA419EA2BF70E2C1915891CC630A3397551E4F34BD2192B70EB210EA67CF152A35A3F5D0878E153579B42AFAFE5068B2BE2B48127FFB54553B7A9B6F845E7D72C43938AE42BC03E33B836AB212909510AAE7DBE8EE6D0EB8AD84D60832F3151273A1E09C514C3AA4CACD15564643F4255F36059022B91BA4137ECD97B34BE3308D40EF06BCF4F45EC625B54C7347F52A21815508199C8B7A6212779CD171894DA9FC3DE2A6EF5D76BFE03B8199ED1DC92B2A403E4DA009CBC0FB597C5952BE32579EB8E781EB12D935848C051029C528CBB68CBC1DE0102B42561E21F48E72E028C2CD8816A9027914571B49D2F94C9189E1A7F18D7D3D0A09B3A36EDB8A084ACE5FCCC77E3E42EDA0FBAB8C81EAF170103CA757981839C9448362BCAAAA3F20C8DC653AEF36953559F3597E1915F02A8D33D0E46201FC794EE055E6D9955B91FC7ABA1F136C280367404725CB355FC2F129413581401F98236D2A6F8BED7FDD7EA99060DABE3F0E8CE20B0E98EA80994D1673E8CCC6A0BA4A9D544F3D31BD95C9D3847527A978C1F155EFD84B6A7BECFB749628CE82E80285FC7272EA05F953404E437AD557F38FD9BBF77A69B81E4441605B23F2AAEDB00C7519D8E9CB4CAE5F8C3FA74FAABF6C12595BA045F647ABA7168C65C8A6006733D1341435495C7088C3361B50C43787EC24C24F57323466B5C088E8097B44666453010DA38AD65B426E72140AF78A5448B2F93DF3820F013FB9DCAC49604C86F2B2E4EA565463917285F148E8BFA9E11943AD3B86B14ED59A190CAE097DB26DAF8FD2A642676A37DD90C23B52C82CE028B80A805D9BA05457F7B6CBAECBA4094822E16C14D6E2291B731D581B12FB16802653360AAA6A7989D61C80DEBFCCE81A36D9ECC84039C4F086A5579D36FF5D0CBE61292E4FC3D14277AF380A9C1DBF36C2D61F59CFC0D62524E042710BFF5BA719E56BA367FFE849D660B9F7F3B638E113BF2E1A4DB1B8F65A0FD680BB2A168A4FD5B4E0EDF3208AD47F1FF4AFBAA726E38763CB5C84C03DA3D1E32CBA873B9A0C750922CD3D0A10A4877EAFEF602F5C875FBF0EE2F4F0AF7F308EF934F7E8E74FDA62A860BB594FD061D1B2BB32BA613339042FD90E749ACEF450D204072ACF58B18C365E4F4B815F1E837453C4255D53BB68D50F3677E7173FCC23D2B592149A9F3DD615868AF91F705387547862D34553FD45B8DF643F596DFDB7ABA47BD5D91445826C86FD4D30365A2F9A3CC0913DE19707D072F27A09EAB906304008875B5BE3526210D6B8BC8663975A1F78EAB9CD7F7305CDD4C00D6277622E50606E1CADD639730101D088BC2BAB295AD86BA8E26F5EBCB3E9C7C543E533A7B3C20F0F89001775F714825DC8547BAB06F5B99C5305EF18372A184569323FE269D45B669B9A222C9DEFBB0B2C84F42A57EF343A5C12F5712EEC33985DF8F0C566D471A9403FC103A3EEED42829D8E3E5C517BDE29447841CE96C8AC587DF3E4B6227FAB386140DB0112ED0D2846355C4A45E94F3A0718CEEC13FD3CAAEEFDF0B7F89F502AACF8C9D96D01B5549157B7DF2BE65BC30C889E69971700286C561DF91C8CB923001E5F0E21D2C7A3DFE8D1AF07FECE1EDA20C031B29A4389F265D2C7BE64EC37B2884849EF30FC8A82D2F766ACE68C72F0A4B72F3B50884749814387893DB2370A3410F794C64CD24BF0D13E44AD500BA9816F9BAED72F7593F758592C2E974D1207A664B869130BAA1FA71DBC55875134E7CFA276E36568F79483886099A1070C14C6E4EB87523E04C0154A2250624261211723453CFAD185298DE06D08CC25FA18BC58B34ECDF5D9DBB02541BAB4A2AF110AE09130E12439F1CECC34F9AB5D7BE36C827A6F2F6708B543D4AD2E424805E2A74895742B0A5DA30CABE4AB45F40CBFCCBEEBDAB9B8EB8F78781168B5BC79E04EFFE1757AB0547B9BD0D2625673CE528D2B4874D46DF0E09C24FC413EF9AB4C3D2E803C1E316D77FF5DE3368BB925B2B1F6FFC340525663931F5595C8AAAF9FB0DCCDFA4793519A66D4FDE38BD2044C60FD1DE15D60BA878FDA570E7AEF6DB69D2527A1F1481A9D05FF2F6F621238939ACF5D2C37B2BC3A194A9E65E7441764A5EE37B1FEF3B8C9C425BE1B5FF0D05BCB6A3B91876EC04ED89A31749FD443C2B85F8F388E7070D77DEE37E2B666628CC9A961236DD24AF2769C1F613B4E77F8E82D1F410ED59F63F1DF19BC53A448106DE4F8EFB8CC37E40144B0F658A4135E25A3CF36D8692DEF2677E4BEA3A9770F19E44D55080625421D5BADEBEF3B39BE71C08650B5718A9B2FCEFC4BECB26C4B63C43F6557DD66517D103907F82F9C2B965B7C5E36059D2159183F5ACB8B5FF5E6B92E94D53AB25AE955424E80EDEC4650BE293E836DA6148392C500FF4B7672932E90E068569B81AE335B2E5013CCC95F571948D58127EB1269A08D6E897D2D9B60F3E49847C05D0B3AC230A67EB6D38FFDBD4B8D82D7B9EC803429C701F080BE86FAA165C0111131712DB4957FD84A8936AB55558C69D33D5890CADD08D7F0D4962CF9E2F69C7517E79DB14B76E6E188F5ED95169A2A7E4C0EBC2175EC2DD44ABCF239CEB3E22F955ED25DA41768CA5FD9A9AE15FAAAFEB431958A679249AB8BF879185E8FBF9986B96A92972153B4CD0D1BE001E5AFAE3AD1F0B1191F1483738E728D4AD240538E5EF7BC9BA4D5903929D74CB64241306FDBAAAE17B1C3134AED2CC394D3EF9653CC62A29C4B0B9BE04E95E072EC98F7A80A7B575DED4A1993AA884C1EDFFE056EC475D934B4EB0EBF418975728C6E9CB3919B2B67D2C71228A4DF1FE2C8388E3A2BDD75549417FE795F1947F857B1C0C9CA021515FD4D79E691493B988080943C394BF29E4190082A94F224AFDE5853323EA51C06B41547EEC0DA5CC202A048D77C7B91E794C51E72B02EA7C14578C11D9DF48E099465783E496029EBB6D42D9CAA52902A4694355DB01DD7F5D7C113AE06E3F712FA577E937CD4FB817659F93964E194FE7D509A81C258C69C3415A8F11D35B414339FD1CC1D4F50665D9111592D1C3A3D69FCF6A971C285A94F5FFBFE8D2FD2746DCEB3B218D970D670D10135126E479D92000D41EABDEEA4C04D1748A4908DD39C60A52AA5FE29C8ACED50DC1295B5C2C4A98E3C62EE4F370F4D3E500FE27B66F65BAE604FD558D66B7F09CE36C36C8B5B4FED193EF56D1D8DF0FE6FE0031466A1C633203966FE83D6BFF843657DC0AF176AA8D5CB7312CB4E072BCFF24D5F3828E29B2037E8D1FB63537C70C27011E9A97E3F04895F4E84AC69C55D450B46D5792A5D790557BE64F765FA243AFA98527B976783E7ACDF76A7E1DCBDA72431FC30D7B05197478D8D74077626FF7409F95B24A1F1BB6B803B9F1B9AD5B06883FAE6C4B587C309A63F3B2FC9619032157B98C1DA9608107E87F4FEE0DAE995AB86AC9869446CDE92441F0B9F8240E6F7F7AA9189D92B7FAA3280FA749BA8C7729F8974049C5CBCB8C6650CF1C16B8194C7AE1A82B40B8B04488FCC69E674362FE4821D4C1846CD9BC49234BCC464013F5F9A082FB83D63098C331D4B1C9129F52259CCAF4A9237F8EC5BCCF06F230C08DDAF1D0C21C5930F55D3D5F60CBFC447E7FCBC75CD199733F8D17BD043B67B0C138CB0C9C8F2E477728F27DEE573796F71B013689B537AEAD4991E67F2F5EB94BFAD9509D7C235C9E55F68F26B9CE8AA90834D170F8B700A40AE9A817D5D17B1644D25BCF1172A5CF0C755A6EC04FAFC39DB06AAA05F5988E187B9E110EEDEA9C84B99AD29A4B31950F2C870A1F91DAA6A5817FAEAE516FA42660FCF56000F7365D8C6CC11D4784C6FC02E4D0C727806E9D43B957BBA124C980C31F81FACC6D46F6C38D227EEF8F0 - -count = 95 -seed = 2489C04BA57D149A60F446670C13C29998B52F3BAD548A751D7134B694DB25ABFA034FB4BA45E105AE27D575CBD02B99 -mlen = 3168 -msg = 1F7AB96E8C14D1A5094672D7034FA8F81703A2CC18983C972CC66736CD98B031AC8A479CED21A1F634938DF85F3E83161646DB81B9AC3EA22F80980B8E2EBA4E9975714E5A98985817F426C41F3968349686B69AF917564A2648401B8FA127FC3200DC16A9E663D1D345EA83131E21229DD39E70D7270DE7577A7E9635602FD2C30EFAF204A9234F0A73D21375658B0B0B04927E67F3F5534614EDF5137BADFED914A49AA301000092DA93B3FA4A0FF592CC3A53F4A75B54FEE775EFA421EEFCD6E0D32FB5CDC096886076DA940B26C6E07F12F6E08FA7B3E2DC42055308E5607A2732717AE592A6909C6E084252A5B08685FE8C6C1DA387B0AA9800B67CDB3EE2FB21B9BE5E6B79AB545563068441C0C9C1E68CEF6028A5CEDF27D3CA47D95094C9E1E68B8449758BE3FF8FDE148ABC420295DC76E3EBA8E11433217FDC3136551A5A41C1C7E7D6EF43601946897FDA54842D8F73FAA7EB7ED0DE544FEF2A95C6FECB13C8C0F14B5B22493F54374184B73D5BD47383BBC5DD7BC1BEAC0CB8E66D2F413A9DCEB7E1D0EE2D63B9EB28DB232C33A95B792AE67D2591F5AF59DDC45771A0E7195C4D25E7F4079359597678B0C0A87DF3D66A686A9215DD566D4722C212AD05A23E1377E37E18A6AB3AB8BF5CD47BF1BAF06EB05E4C150CA67D7E52BD297A08CFC97B575752E686B83575F425F3A450BB0F596A60E41F7183F463007FD019EE255BDEF1D98B7A0A12EC33B3E2BC9BF0CC8F4860DEBCFBBD5E40B2ADC2CD10EC35A341BE7A49F8D204FDAE86921B7DE5BA700A61E2B041A8EA7040ACEE844892E5CF025FFEC5322FF6D765BFF1107C967A12ECCB0489F64F8C13BD7057DF76485446641AA7A560C7E73008C46572628E1A225A8D3F6D68DDC9759A952FC07CD43DE4434BD3391089E900275E9EBC92563AC1403BB7DFDD182092130E3E6AEB7B666F4BA66C38BBE1F726F40A07DF6C42079A6054399519E26D765CA065F4DDFD27A29CBA292699CD826FA9D3E7EE31B0D76813879DB5EC5C7F454095DC3BD27323DABD2DFF949AC760D6137334507816330FA67D886021661ADC69AEBD882A07E01B4B6E5492399ECDEA99222EE785C810B30409DFAF2A3CE5A05D699C2368249C9588D86FEAA778B4860D6DD442088A21D2D9D0B49B15EC579776812AF8AD582F1C44BB6432D7472300B5440A382ED87AB64B20373A0ABDBCE391D0BFFC9C543EC686449FCA9D04B7141836A416720BDFF250A06D7651A1F98EABE4B340B2303591D0847AED6FFE423B6DD8C0C03459C381DB506F531343F82C116323899DF1E5D8DB8997BEC12EB70103F0BF2B3D53C4D4694052606EE32BE4F5B35450358D7D85062DCF7F0BDB51364700BAF92CD6ACE4E2C10E6CD9A332716F5F4BF7598466A99238357798A499C9B8BE77690635C57E7D87A904B3F2278C0B1B23E5860B0532F152E1626C86FD855F656B5D070BC81CE4634A87C8EA6D6A433C02DD2E6D6561B25968B149A6F3BBA40B749F188B84314B5778A000CAE91A53D59860EE6F7DF38CA0935CD64C08A34BF19981C17951B9C39A847D0637441452E38CE5E1D9B99BED51B86705CEBB8D3244C40BB8D70F846936A2BE29C21604A7E6BD3E655022B929954F6C9A5743F5FC2127B49956D80128DD582CEAA06FC174813E5F5E6A0A4D7D26756FB28A6588E9410722591CCE2A6C6ED0976B98E1FB0C642D5DF8F08E96BAE1FE10375FA1D7C70806101570FEF1EBC8F58664281E2B61DF2081B655013AEF54616308504F5F4A1E8F156680163489D3FE7BB0A514F1D2D57EE6302853D7D03C767C7BDFB79E2B8C80403F26F6EDBDD6A890A0A0B9B76D334E0F729FF9C47BFE960A1C3FAF77E81B9AC156367423DBB4D766A1F3B1E67595EFFD76287F22BC37DA4F0204633E804002EB7C1AD0836FA4D01E2FCDEAB8457DFC3D8B7F1151BEF3574F8F4653AA3780003787B8891901ABC8250A974C15F2DDDF9E1BE6798647EED710D06CC3FB4C276BFFA585680FC632D8EFD1614745BC3C72B82C53FEAE935EA5014E2B321F69BADF570FAD878C9590FD20FB7BF1B31E373DA93D1A8C63EA45E698CE060FE70ABA0FA84F37E836F2AD2998F07101D3FC7CA2B08B1398E1687ED5A8CE860EF9B4889FF436B74D13281D1F6A7EDF1DBE8989BFAEEFE6A475E65217643E757006871E664099F5B3846553603CD9EEF8FC195807361FBFDEB8DEE6A0B79F009C10DF397FFB865F4EBD0473D458D553358029C6B5A95D6FFEE9B645311D10A8F479B7E5249AA87E3DED08311B4DDF3A458FE61AE294A22643861826ACBBC9B0EA8B73157CE15D1FF35098AE67159B07CA7499398C26776DD9884B5D3786C87D48E864D8BBE2B73E2890F217E135BFDFC4DC5E805D9CEFEF5268E33DB611ABA6A5D57EC82B7246A63DCF3EAF3A51CF503D65C206D2362421DE774158AEAFFEE45A6B5AD5CC0B1DE0E2EA74E97913729A69E9C00A309DDCEB7738BAF4757EA9CC96E055BBDF692B12D8B01B92CE5ECF3D52187402CB7FD961A2672DC1875B6EA22AD7F5F42B1B52BA2D780F2E6C5B25FC7E30B1B663E3A09C8FF0B5C302E0E7F984DDCC62DDA65FD996E17DA72F02A16C354BBDAD44C5B5044759BD53789B98BC58CC25FCDF10A9CBBF0FD6ABD58A4CEDD92C5D85EF22B3C5EE5D9440CE42995517D2F7352CE997F51A36B9FA5703B4C6491AD01F406FD1B5BF85321026D28B51354DADEDF057B37743499A986469F908A01F3C1B74DEF5D8E2F57ED25A80720B540333109A0A65E7984B557F65429F3D3BD7EC3732A10D7AF36DD5D2414A09949A0F57F37BD9021D2C482E61437CC15E9DFDD92D4C212C4FC6C22C54591E5AFD48210FDC88040135E433F50E45874E0D5EE2BBC857F2C80E2FA4FC7ACFEC8EEC0CAB351F677C790787C715945C21BF923EDC0A58878AE09ACF5FB5A003C9C0B6E30A450CE6DAD4B626108B88E89F1E6A7BB3843E1EC8AEE35AF69E81773CFF71190F819CCF24142D60AC51B80B61019EC7ED2EFB6C5F18B499FC9727BED2E3324F8B94A522092E0A98241E29F8F14C6561DF3FEA0824F9CB0FE10BB497E427EE62085E7AABB2900FA47BF27C1638BD116C5555C076DEEFE9754E8ED333D72CE9423E27EF640FD5199C0CAFBCF2DA1C5C34121A69E7E0DEB3C268FE60C6797056383DA43E6F472D225116F63124498271D3D43AADCC5871F2349CE040BE068D72EB57B7827A7D9AA01405BA0AB07E684B91EF05418948F6713AEF1F4948399E0E6130740CAE3E481A6366295422BE3EE2E892AA9FEE86A6E23E2EBCBE654989FD93D1C4E7D62910E1223BD66B7C54F8DD7D373986E5D4141BF0BDE98DD13AAB7D598D698660F11FA4BFB0AD09D5C27B65386C8673E6C4AE9E8E30F8DD1A5A3FE557A3C29DCF99A7C376200AB595C49445E740E3DAEC07BC047FD6EA4FC6CFDC23D7449F9D1170FE635CA36D3DE5B57F1CFB182DE240CD4C1E480600C449D1A8596D8315906A53954201929E7665DD2E27D590D481DD394CF2E8AE19217F1FF0CB511DEF7460DC9E49C21607247857BA744B1384344B4C2D8CE987512376F66F1A279509281242A7A2A58ED500395418138ABDB9C5572A258D157F4D3E88ED216BBE9CEE3BD054FE61F94C59A4AD19AA62E456B86CADE61622A6FEA877575EEAEA20C76AE8A89E7B44396BAE0EEEAB1C23F221A3DF2B2CC683256A4E5C8207EDA0B235562AD3B510F9D3FBE0B51CD8F238A0ABD2EC182681606C8FD111D8CE1EC1CDA6DB4572303DDEB925AC1FFFD75E321468266790DEE6BC0E85070CEE749D9E46795936324DD1388E1B11AA617500534B8DAF2DE12B035F73111B770F5F56F5C6A4152C45CE0E112E650FAA9F3C7E59E3410745C29FA59CAE5CC37FE4C6594990E50DF1576B69B2B292AFC58A804743F49DD7C98C1768FD19AB4213AE4FB197492AF5BF7FBC6C8B507673539D8515DD527FAFDD8CA3EFF629CAA720AA11E65922678447AD4DDF5FF943873DF5203AFEA4130CA5F633E104AB083EC690CF092D208A98006E91BC7E33731D18E592869E564E6D3FF8BBBBB9837FFC1F1B92DE0F5DD4A029C51E3F64592CAC3DE1B4CA5414F894B7B0B7D73D6BF1DA4B908ACEAB47771DA56A8B0536301FC5FD270CAA55CE171332F7DB2EB4619C4B2C1971EBC0AB8B0B11FD54C24285DA8428AB9E0150D8897216B133ED554DE8CEE532024DF8B8D9314D7C9A3EC60464F9C7BCA8C3D4FBA23A7B543AC111ABA8C8F1BD54A243D565DC062F84CCCEDB0A03375FDFBCEF8AD8CAFC440D3E6F988DC607ECB947673DEC4AD48724C91A6BE22A0027E42AF6D94D26D188D0B7B3A5AF012880FC0105DD2F11171742321DD41A0401415C58AD4DC445642A2CBB466788F54D270BD8DF25602B298B62B6D0FA3ADA97008A99B73A807092F8957F17EEAD9D53B1128FBEF1DEFCBC607EA92AFBD353E95F52D33AB7C1EBE2 -pk = A39C63854CA350742B31B8BEC1A965276236DE3AA51C313486B641252FD2AD28B32509C4CF02505B57AD83E0BD1F8F2A3D826CE274061A31BDBBC3D8828C1C00605F7D9FCA7CC3FEEBA7BBEE09711A82EF221C0714BB5E25CF5850B37D66BDE629CB3E309E700DBC0D4FC04C8E3817D4FB7DD3B8D13596ECCFAC74E99F3C1700 -sk = A39C63854CA350742B31B8BEC1A965276236DE3AA51C313486B641252FD2AD28B32509C4CF02505B57AD83E0BD1F8F2A3D826CE274061A31BDBBC3D8828C1C00605F7D9FCA7CC3FEEBA7BBEE09711A82EF221C0714BB5E25CF5850B37D66BDE629CB3E309E700DBC0D4FC04C8E3817D4FB7DD3B8D13596ECCFAC74E99F3C170002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AE2BD4328C49E5FDE2EA9985A66F3A0FF7089F952EA3478BB1FAB6C3605111713ECF8D70F7480EEA8B01CBBA61D1685BFEFB2FCCF00B82A37B46056F65DD57F7B73897089C62E05D57EF76B736BF5A9C87DB392E964BDE072D0B0000000000000079B479A49B332CA267734029E4F4FDF87057F60E3EE839660E0F2B5FA3334860053B42F8FC8F6B02FCE9421AB2B2154BA3FB4087E14BA7137EC3FE9287ADB0113817D92EF8B68D76E92148F6AD205A06CFAB447AC85C8BB7CCEDFFFFFFFFFFFFFF47B71C0B8DCD2FBA992755A2B2FBC564C6123023927B8DC0AF49D80B285D88F2970C06D42B53664D2D866261B8E1CBE4E4A7AFB30C9B17C71667FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32E378979BE55EEFA1204650648CC7225EEBC31B3F77B0DBAE2EADBB6D60086F975E83F4CA8E83B7690B7F60A4D92DDAE5F4795E57060614790B010000000000000000000000000000000000000000000000000000000000000000000000000000BB4AADB262E1580740036318E9C99766DA20784A4E7D1C650651FC5273548EDD583FEE766400CC9962F14C6E65C9F9118311168F5725C5A9BB24B93F3F80200014C6F404C40F44ADC2E18BADBD2007027FF5D639379E71D0F49D48F377658E1ED0A33C6BA5A81DEEAE96D0C79353F639BC1F901F8C6A6C6C43DBEFDB513F1000078723AF3C25AAA19B7028FC319267AC580D70D0EF95F110007906BEF8403E80CBB23A3DDEAB62A03049BF8DBC05377ECA0F8BD4A7C03B8A374F18D8C45F07001BEAFAF04BFEE081B2FEA4E87069F1CC236587207D580288A45C4BB18AC4E1229D910229A304E7301FCB1DE49E7966331DBB0A1AEFD094E1171D209FF1200600887768CA1573DE6A58A5B2AB74CBBF96A0B3BF40F2B2FE82BFE75848121C3728C9915DDC9334D5D9CA42807F4F3748087F77824021DAF79D1A5F6BC5548624007DBEC818A91C9E53D143351C29D43762E8374306DBADB2E3BD5D0F02A1F529B3D0F1C6960DBE0EF94D034D965CAF291BC8FDA8E59F05F463AB69B360CBF81A007474A66B1D6E9B48AB4F1CE9C01E8EB0BF93C4B097FD9B64C88895B7E5E6936C017C2F2ACDCE680B9DA7DD880CD8C669FFD8B9C0D1F270EE6335F5E803CF0C00991D06086813000C06EFE581D45058B6CEA755879A1F38D6B3C8EBC9AFC49672B3E9BB4DABE329DB0695292721735E6BCD3AB93B6A5205E5D8D8ED12F4C41900146F7DAD5F3F9B4C0117894781EC1DF651F5442944CDFD43F2EA7BA40B621247B6550B302A8F108C43AC877529160FF81C6FA6E21571F6598D097AB882451B00C1EF0479B1B70B963F2C1F1085866F257D36047C9C545E3ED0C4879F3419CF489054F0FE5430F1BA195121C53FB34A568972BDEBD82D496AE6507DDBCD390000C9F1DE47F4433CF640935EC7EA38619014658D65D08886DBF521CF639D70FDB962F59A4445D8F7DDA50EE18725E063B29EE82682DFBBF33834E22B72DE3D1F0023EC2739E494C7AE78A6CB8F224B801350035A6D965E0FD0650F9E26F20EA93EEE962F42E11A0FF9B0659B14DF68C563654F6C1A025A9F59CD66E8CA5A71050026F6E86B44DD31D749E3BC22AFB7EA77542DC6A7B89E3D6B7364EF775FEAF393E8DB6C0FEEC39DD1AC0B7BE3B408429B0D80A5F4C9E1B1C38FE8B7B09A5806001F589EB509324F36E8353D61B2633AE82490A51FFAF3F1A4E812B965980BF81832E8239F9DD769D31FD871BEB5E1223D4E781C1E224B2B5CDEFC47ADEB980B00 -smlen = 3503 -sm = 7E884C305B7DE3D806CDE43D7E0EA75773460179BEE313476663673E3A57A9F94A0DF9337F014E533C90140091B9D991A5286E9C7144E5DB005A87663AAEE44FF7A83248529138D8BC47A001C2FDA2193C3C4E0B34A8DAD67D06E87A86D201994FDC6D67D3C45FD22BF633639F5B4DFDAE00BB6934F6AD3D02B589EA72781AD469C81C400073D28F4D1DBCD2B2E14B3D13C0651C8D66D6010E2DE6A294E0B50EC44854239B6FE739EDF300355F26F1F175F052BF94EE5FD66539967F4701C9AD04B952583A2295B8639990D675F8401100C3564ED40F95013C9B388A51FB49A297204900DF3296079052A97885D504239D70A8902DB2015F44D747F1601015EB0EDD4FB80ADDD1B7870001DD6E70926F0A1B96CE400733371507895E13A5EA010AEF700CF292EA0A5F161F0203C58B9E38D26E07E4C2A213767EB19895A0D30008E38F692A195D026AC9D059A92A001F7AB96E8C14D1A5094672D7034FA8F81703A2CC18983C972CC66736CD98B031AC8A479CED21A1F634938DF85F3E83161646DB81B9AC3EA22F80980B8E2EBA4E9975714E5A98985817F426C41F3968349686B69AF917564A2648401B8FA127FC3200DC16A9E663D1D345EA83131E21229DD39E70D7270DE7577A7E9635602FD2C30EFAF204A9234F0A73D21375658B0B0B04927E67F3F5534614EDF5137BADFED914A49AA301000092DA93B3FA4A0FF592CC3A53F4A75B54FEE775EFA421EEFCD6E0D32FB5CDC096886076DA940B26C6E07F12F6E08FA7B3E2DC42055308E5607A2732717AE592A6909C6E084252A5B08685FE8C6C1DA387B0AA9800B67CDB3EE2FB21B9BE5E6B79AB545563068441C0C9C1E68CEF6028A5CEDF27D3CA47D95094C9E1E68B8449758BE3FF8FDE148ABC420295DC76E3EBA8E11433217FDC3136551A5A41C1C7E7D6EF43601946897FDA54842D8F73FAA7EB7ED0DE544FEF2A95C6FECB13C8C0F14B5B22493F54374184B73D5BD47383BBC5DD7BC1BEAC0CB8E66D2F413A9DCEB7E1D0EE2D63B9EB28DB232C33A95B792AE67D2591F5AF59DDC45771A0E7195C4D25E7F4079359597678B0C0A87DF3D66A686A9215DD566D4722C212AD05A23E1377E37E18A6AB3AB8BF5CD47BF1BAF06EB05E4C150CA67D7E52BD297A08CFC97B575752E686B83575F425F3A450BB0F596A60E41F7183F463007FD019EE255BDEF1D98B7A0A12EC33B3E2BC9BF0CC8F4860DEBCFBBD5E40B2ADC2CD10EC35A341BE7A49F8D204FDAE86921B7DE5BA700A61E2B041A8EA7040ACEE844892E5CF025FFEC5322FF6D765BFF1107C967A12ECCB0489F64F8C13BD7057DF76485446641AA7A560C7E73008C46572628E1A225A8D3F6D68DDC9759A952FC07CD43DE4434BD3391089E900275E9EBC92563AC1403BB7DFDD182092130E3E6AEB7B666F4BA66C38BBE1F726F40A07DF6C42079A6054399519E26D765CA065F4DDFD27A29CBA292699CD826FA9D3E7EE31B0D76813879DB5EC5C7F454095DC3BD27323DABD2DFF949AC760D6137334507816330FA67D886021661ADC69AEBD882A07E01B4B6E5492399ECDEA99222EE785C810B30409DFAF2A3CE5A05D699C2368249C9588D86FEAA778B4860D6DD442088A21D2D9D0B49B15EC579776812AF8AD582F1C44BB6432D7472300B5440A382ED87AB64B20373A0ABDBCE391D0BFFC9C543EC686449FCA9D04B7141836A416720BDFF250A06D7651A1F98EABE4B340B2303591D0847AED6FFE423B6DD8C0C03459C381DB506F531343F82C116323899DF1E5D8DB8997BEC12EB70103F0BF2B3D53C4D4694052606EE32BE4F5B35450358D7D85062DCF7F0BDB51364700BAF92CD6ACE4E2C10E6CD9A332716F5F4BF7598466A99238357798A499C9B8BE77690635C57E7D87A904B3F2278C0B1B23E5860B0532F152E1626C86FD855F656B5D070BC81CE4634A87C8EA6D6A433C02DD2E6D6561B25968B149A6F3BBA40B749F188B84314B5778A000CAE91A53D59860EE6F7DF38CA0935CD64C08A34BF19981C17951B9C39A847D0637441452E38CE5E1D9B99BED51B86705CEBB8D3244C40BB8D70F846936A2BE29C21604A7E6BD3E655022B929954F6C9A5743F5FC2127B49956D80128DD582CEAA06FC174813E5F5E6A0A4D7D26756FB28A6588E9410722591CCE2A6C6ED0976B98E1FB0C642D5DF8F08E96BAE1FE10375FA1D7C70806101570FEF1EBC8F58664281E2B61DF2081B655013AEF54616308504F5F4A1E8F156680163489D3FE7BB0A514F1D2D57EE6302853D7D03C767C7BDFB79E2B8C80403F26F6EDBDD6A890A0A0B9B76D334E0F729FF9C47BFE960A1C3FAF77E81B9AC156367423DBB4D766A1F3B1E67595EFFD76287F22BC37DA4F0204633E804002EB7C1AD0836FA4D01E2FCDEAB8457DFC3D8B7F1151BEF3574F8F4653AA3780003787B8891901ABC8250A974C15F2DDDF9E1BE6798647EED710D06CC3FB4C276BFFA585680FC632D8EFD1614745BC3C72B82C53FEAE935EA5014E2B321F69BADF570FAD878C9590FD20FB7BF1B31E373DA93D1A8C63EA45E698CE060FE70ABA0FA84F37E836F2AD2998F07101D3FC7CA2B08B1398E1687ED5A8CE860EF9B4889FF436B74D13281D1F6A7EDF1DBE8989BFAEEFE6A475E65217643E757006871E664099F5B3846553603CD9EEF8FC195807361FBFDEB8DEE6A0B79F009C10DF397FFB865F4EBD0473D458D553358029C6B5A95D6FFEE9B645311D10A8F479B7E5249AA87E3DED08311B4DDF3A458FE61AE294A22643861826ACBBC9B0EA8B73157CE15D1FF35098AE67159B07CA7499398C26776DD9884B5D3786C87D48E864D8BBE2B73E2890F217E135BFDFC4DC5E805D9CEFEF5268E33DB611ABA6A5D57EC82B7246A63DCF3EAF3A51CF503D65C206D2362421DE774158AEAFFEE45A6B5AD5CC0B1DE0E2EA74E97913729A69E9C00A309DDCEB7738BAF4757EA9CC96E055BBDF692B12D8B01B92CE5ECF3D52187402CB7FD961A2672DC1875B6EA22AD7F5F42B1B52BA2D780F2E6C5B25FC7E30B1B663E3A09C8FF0B5C302E0E7F984DDCC62DDA65FD996E17DA72F02A16C354BBDAD44C5B5044759BD53789B98BC58CC25FCDF10A9CBBF0FD6ABD58A4CEDD92C5D85EF22B3C5EE5D9440CE42995517D2F7352CE997F51A36B9FA5703B4C6491AD01F406FD1B5BF85321026D28B51354DADEDF057B37743499A986469F908A01F3C1B74DEF5D8E2F57ED25A80720B540333109A0A65E7984B557F65429F3D3BD7EC3732A10D7AF36DD5D2414A09949A0F57F37BD9021D2C482E61437CC15E9DFDD92D4C212C4FC6C22C54591E5AFD48210FDC88040135E433F50E45874E0D5EE2BBC857F2C80E2FA4FC7ACFEC8EEC0CAB351F677C790787C715945C21BF923EDC0A58878AE09ACF5FB5A003C9C0B6E30A450CE6DAD4B626108B88E89F1E6A7BB3843E1EC8AEE35AF69E81773CFF71190F819CCF24142D60AC51B80B61019EC7ED2EFB6C5F18B499FC9727BED2E3324F8B94A522092E0A98241E29F8F14C6561DF3FEA0824F9CB0FE10BB497E427EE62085E7AABB2900FA47BF27C1638BD116C5555C076DEEFE9754E8ED333D72CE9423E27EF640FD5199C0CAFBCF2DA1C5C34121A69E7E0DEB3C268FE60C6797056383DA43E6F472D225116F63124498271D3D43AADCC5871F2349CE040BE068D72EB57B7827A7D9AA01405BA0AB07E684B91EF05418948F6713AEF1F4948399E0E6130740CAE3E481A6366295422BE3EE2E892AA9FEE86A6E23E2EBCBE654989FD93D1C4E7D62910E1223BD66B7C54F8DD7D373986E5D4141BF0BDE98DD13AAB7D598D698660F11FA4BFB0AD09D5C27B65386C8673E6C4AE9E8E30F8DD1A5A3FE557A3C29DCF99A7C376200AB595C49445E740E3DAEC07BC047FD6EA4FC6CFDC23D7449F9D1170FE635CA36D3DE5B57F1CFB182DE240CD4C1E480600C449D1A8596D8315906A53954201929E7665DD2E27D590D481DD394CF2E8AE19217F1FF0CB511DEF7460DC9E49C21607247857BA744B1384344B4C2D8CE987512376F66F1A279509281242A7A2A58ED500395418138ABDB9C5572A258D157F4D3E88ED216BBE9CEE3BD054FE61F94C59A4AD19AA62E456B86CADE61622A6FEA877575EEAEA20C76AE8A89E7B44396BAE0EEEAB1C23F221A3DF2B2CC683256A4E5C8207EDA0B235562AD3B510F9D3FBE0B51CD8F238A0ABD2EC182681606C8FD111D8CE1EC1CDA6DB4572303DDEB925AC1FFFD75E321468266790DEE6BC0E85070CEE749D9E46795936324DD1388E1B11AA617500534B8DAF2DE12B035F73111B770F5F56F5C6A4152C45CE0E112E650FAA9F3C7E59E3410745C29FA59CAE5CC37FE4C6594990E50DF1576B69B2B292AFC58A804743F49DD7C98C1768FD19AB4213AE4FB197492AF5BF7FBC6C8B507673539D8515DD527FAFDD8CA3EFF629CAA720AA11E65922678447AD4DDF5FF943873DF5203AFEA4130CA5F633E104AB083EC690CF092D208A98006E91BC7E33731D18E592869E564E6D3FF8BBBBB9837FFC1F1B92DE0F5DD4A029C51E3F64592CAC3DE1B4CA5414F894B7B0B7D73D6BF1DA4B908ACEAB47771DA56A8B0536301FC5FD270CAA55CE171332F7DB2EB4619C4B2C1971EBC0AB8B0B11FD54C24285DA8428AB9E0150D8897216B133ED554DE8CEE532024DF8B8D9314D7C9A3EC60464F9C7BCA8C3D4FBA23A7B543AC111ABA8C8F1BD54A243D565DC062F84CCCEDB0A03375FDFBCEF8AD8CAFC440D3E6F988DC607ECB947673DEC4AD48724C91A6BE22A0027E42AF6D94D26D188D0B7B3A5AF012880FC0105DD2F11171742321DD41A0401415C58AD4DC445642A2CBB466788F54D270BD8DF25602B298B62B6D0FA3ADA97008A99B73A807092F8957F17EEAD9D53B1128FBEF1DEFCBC607EA92AFBD353E95F52D33AB7C1EBE2 - -count = 96 -seed = 26CF860726D4DFA38AE07399838BB336F1BEE59E9F23AE4C81E73D49964997EF21CB5F5412F9A70A1EC39FC6228C36CA -mlen = 3201 -msg = DE897F02AE7292ABAFA6A0CAD52929113410F2BA972B4184E894C4D31081420751560956F49CE2B772635625AFC3CA6698FBFDE4D0A05EF243DF190BA1CE780EB572590E01E6E283E1963F2B0722B0CEB365552F65BD405F1A284DDBED07BA61C4453D30CC28C83E41590E09D7BB6932D231285205D61332FA9263B8A2D3D7F7FA20F521CA4B49F249896780E08C2DC41669BF0777278F87BB1F72CDDF4B998062B1642791F81AD474D6D8F963DCB4458CE11108544C41CDF19145B77038C7E8ADCD6501508C53B25BE6E787313018620D1BA647CCA4A5A8399E11815EAECEC6AE66DBC576699BB0AB44DE111AB6F252256389EFDC0546E641DE87FD6A3A724716257A9174F39542539A593864441EB79D499FCDF2F1D053CEBB3A1FCC09419D2C553C2265B3DC3943E0341BB49130E9981EC59945FA0B23E9DBDBF352ABA0D925C4333F2EE1F2C83C847EFA78BB13263B893D7CAE029BF08CEA2A5D1B5B997E403A489C6D9A124FB8386FE58C2476894E7754B8E5A162102A119482B5E59F8D89C8B1DEA70B6C80641C77BFD12D45C5B3CE0021EE500A1665ABCF740794E0D3E7E8CB5804A1E0D0C81A107DEE80BF63BFF8CE2EE2DD602DF279DE39C579B417A758356D2B48B41E83495DEE9ADFE4506E03F19DD096E81405264D408B2FBCDBF41DB5CED6FBDC2645DBEFE5BD038382993970C7686DBA3FEDC24E1F91BA4B6CF70B2E832B97BE24B6393273A519DB0B4446E98D77E86CCACFBECCB18939013C66F7A29B10DE2E88FCFAEF656B858B7DFACC4F21EF5F328C0EF604FEDD993510BA40530B79525FE8D336DEF0E5C303539E664A9360EDAD7268F70DF4DE199AB3F70EB2BA65E2752BF5FDB1E853E6F4EFCAFBB31D8CC23155413BE31082DA958B01682894A9057CAB66D4D64A6F3B1D81C5B75815A3E0CAF6486B17339174276A84E11C117B060302DC2EE06A03C0E15395C0DD32661638F059A385578C1B792349A41C511D12AC7185B060A831EE296E6626459C2750FAF3AFB579F6F6836D566C00C979B5130E8E50431E914834CBB3D26F6E5BA50BCF05D50F699FAF10767AA2831C3557A53AF14BFD9F23C00F76C2680C7DBF4A9B2A425E34C943228C3EBE55A0960ACC757D7878F7943E2E8A1CBC8C0D2139A6A6459D3492A1A7757F71E90A58A78E0FF9B04D059C5D131F6E3C30742FDE5506AE7860045A4C903DE96DC43AC6A69273BF8EDAB7E7FAFBAAD9EFA8FA609961502EFACCDE63A6D98D8D017075487C608FF701A7E3381D7A2ACB134B198950ECC6970A75AF5625FAA4EAF968CCE48FFB673F4F365802A984C609C33BA312140A60A6F0924E945D11BAACFCD643C874D352A90367EA4C59B63665364832B1A9A9A01EDA92C64F393C357158973FA7C6047B8B5E27EEDB28E26359402B63032F8B230F5AA968272819CA486A8BAFD3D66799AE951CABF04EA81E1E7E4632B915D4E8387C7D1F4FAFE1C1FC8666FE0318403EA0027487E947D844A7FA28C0523A64EBD95D2A8ABF6A71FEFB5BC059B2CBEECD4375F3A3F109DEAD98539244DDCFEE9E42DB3ABDAF943C445712EBF19508A1FFA6133C5078C1DA69A32CBE729A8876C4C73CB232024A87D87FD5F9456D3D4A936CB4CE2E00EF415406D66D344000A4A95CC9651425A16021336C4BEFF310210324C754BBE13CD0066C507413671C80CF492B4655D898A18A2F4DB5A393400C6AD821580B0712D6C919C62E87FE212260EAEF6876C409FCA1047A67B223E0766144F3F676F051FBE912C4CE4A9F7B85459DA031EC47C621F6EF06CD1621421FA52B047B51C944DFA94807083B4ED40D533B19813477193D1E4E96C8D76A5AF3100FA44A985A6513060B08A7F3848159B3CC551D43370B223037753B824A099A7C7DF59305BE09E2E79618C83818BD542F39380126A927190EA5536DFA63B664AA7601C6D82CDDF4CE4006E1AF2601EC453971828CD09C29D2F3EA6392B58D38BCF40BF6B6497F6B848CB853B187610CD23880CB09787C76087356C66565C0399BE746A81753442E4AAA54E84F1D8C2CCB2D00A551E960203D61E71A72E131ED1967DD06E72C99264EF2EE5BD156FC869B5031BA23A6D354D7CEC58F339F6BC2DD1C547F07AA733994860197DCE5BCE6024A74668ED89A2C9CAFE1F78B31638C3225D96009C260FBD28C1F0423E75C9C01A0F9E62B7F265FA3817F441F56AE79BA54A0C107FD7946A2DDDA60D0EAE428715FE2B4FF93BEF83CD10E5E17760FE028F1AAC8084A43EDCC12BFD3265D13FA94D9704809A50881D48F0080A976C5BF31B353B9043C0F0B69AE6F2B8BADD056752F2FC9E90C4B35850C2D45B9F354B41ED7826B976528875547A0C389B83725E26C006CC8240E380E3EB554DBF2133A131743539B1D174CCA6B135C59F81D499631BDA4CF90DED836E8C24C074A0BCD83271309FFEF320791C9030FC2B1F53FD2DE870E54EBA20CE9930C279B48B39CB481737F012F65933650374BA39E2222191B0E3C7DB9632CE9CB077322CEF97ED832DDD8AAEE53C52C03D2AAF8EB5597D8D6467A406BF428E2F16462E0C0D486A1C1C7348CBBF92633EC4FFA75945025A3C92095317E32290D4CBAA6CA40F3F201975F3FC8B733D1467C094E075E8415352E3AE51A6C5169A4AA430BCD66FF39B184F5B7174042DFCC6840EEF60CCDCAC12D012AE4F24F7184A038D8D9964AB405366740600B98CFE2E4737C8D846FD4E9B22B5047110D85B37BDB9E7E3BAF5298BBDC1050AA20F14E34DEC283830F5FA9C570C22CA659C1276BE8FFBC0AC3551DB8488855AE7EC21E239E88A0F68227D17DD87FFA3B3D0535F9E57807755DE56A65C0DE9F4A79F8746B20908BF9416A86F62EE2C2545BCA2D55CD4D45DCDF06DC879E1B6270A80778D0274AA658395D800EAEF367DF4F4D838EEE0A66093E0F419B9EDC5F003E31CF0EB7E1CEE9ACCDA7A2DFC920A4B5222389DBF12AD17392850C434A9B3C260159B0F52E78E7A66D28DD5B3C77662CFED2CB3DD5BC3CC26A34293EBF1FB3A9BC59BB0C104C5A9387F3893A65D145D424CE741A375F9C65E733A024E78FE274B29FF4B0EB6F21FAFC31453EAF7E48FABEC5711D3898B876F59952C73123281A8E85148CEF5A166BF45DF36053D57AE6F29D3E334BB2395FA236D4DAA8A4FDF99D80A9BCDBED36154BF4FA3D463D51974032D7B88B2504317E14165B1C3FE3D8FE366FC8284321D80F9CF512F418C63F73B7C29C07870332387BBD1A870AC39485F64086006CFD68C8299347615A423736C01FAEF2DA56CFB6FC966948649324E22D4551B9F50654EE505547F7D0B8481ADF6AAC3977F49D7E6AE5C4248DF7B43BDA7F082AACFCDCF1C1BC04F2D45F5E028498ECBCA47EC4D1DDEB03A2AB27BE9E4B80585145676F8AE7A5017BC5EFA317A576ED6E423D5A0495B8DC619712A2C3E6162B04B9BBC7DE4BE6532F6C1C019E702C014C60189A2612594BCB18317804C630264D07B7396DB562777BC305B885E00706FF6D0208737BD229BC7AEEFF5FB770A4C057B347601F1F6C16F60D4A53A0B32631AD2D41FA307F6630228E1807D22475D5E331A50A680896DC606F3941AC08F8BA46DE5A49F5ED6A94965334FDFD69C4A6C7973D9615B3FE576B15AACB9B98D9E498D2A3A89B4F8EEE715ED5F29F13DDE7629BB386F7CC800F16F3B5BA8BD0E14CD8D9BB0F0AA615BE9D7557F6EFD00F7BBEF9989E7F463279408E6AD77E100AE4457D57424F2B1CAEF43052C5B25C896BAA1C2FE67D1D6F669311F17D39460F0B176A7727F53257A36FAACBF3DFE623D8F882F8EE41BA1CE387E1D1860F4BABE26ED678395B9979D84DEA5C7B38905D4C7FD867ED7722D066BFF3A833D3282BB40D1CD310DC8DAC9270A49B65B5181EB30F166CAF0832A8DC56B9D135550B506D98D036BE7876836AAE669507990DE6D03E78A38139CF64F65FB410F192E30B045C93FE259C10E0C5B56A2B5F0605DA0851104C4BEEB4E3B30135CAE5A6C68403C63121B0993832834A3B5EBDD345C41B26DD219560B624024B8B945A10D385B3CE4E0BD54E10A64ACA59D283302028A9592120D142CCEB1CC30E1F96AD041F1E17BCDC3C68C2EA2E0D65D6BA3696166CB365CC461ABC4D67D504E8290EB452ECB77F6D5FAA5053D01317646242384C5C510BD43C5780BBD01EBC3AF33D29D8A09EF39AC85E70398D2A64DFFA72B3EFD8D6D57AA2F9DAC0CC6EEAB27B69FDF2403A5FEDE0BFAF441619BE03FDE44C49FF0A34E9C37D2B9AEB726D56EB646A67BF349323F397DB056D71DE72A2597D780942554C8F8273E307DBA6BD02E944E0559509E1F28B511BD709D03EA2451EF234DF6F077E06AA01E2806D5BDF89DF29F1B3D8C6D8014496AD83857F7465F1072E88709D0194733E1FC8C9F092DF5B9802FD2DDDA8B142217B9532D8604E2F32D06F6400025930DA2BE9B25529788E6BF4EB7F84C272DF455CE2ADA291CFDB5FE815129E4AED59625C879E99B3E3C1B6C5D7 -pk = 966AFB086EDFAE3BBDF105697940BABD555B471BE9522463EDC205DA3F13E389908CBFB2CA25E4D05453C17698F8BA14015CDC7E92A10373EFE6B498174C0500C8A308694E1E10D12A73F755D80CAB435602379C821397F23896DDDA4FE4BA4424AA5E7D96320A6E03B1783E375DA27BEE92D8692815A26AC2348C4C3BF01600 -sk = 966AFB086EDFAE3BBDF105697940BABD555B471BE9522463EDC205DA3F13E389908CBFB2CA25E4D05453C17698F8BA14015CDC7E92A10373EFE6B498174C0500C8A308694E1E10D12A73F755D80CAB435602379C821397F23896DDDA4FE4BA4424AA5E7D96320A6E03B1783E375DA27BEE92D8692815A26AC2348C4C3BF0160002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BFEA62193EE14E765F773DF48411D615C10D9A00F76542187DC1531951FB47D6DA43523BB5A533BD236612C304FA4B559F157103CB0C3F11C18856C559DE7836C4101E4D7FE51CA39F294FDD2F14AF116A6E7D2EA78FF42E740800000000000000E877AFD9005E08AC525A67A605B85AC1C0CEA8F4629964D37BE79730002FF346E0EBFA250ECBC14B1F1842A401A1268FEFDD23949BD51DDB90B452E8F99E24A3EB6B27F495CB3C1FE06672C9BDE6C4D24C004993BB83A5FDE2F6FFFFFFFFFFFFFFB8EE4344ED0EDC43F7F65BD34231DEDC87C8A74F056BA3FE02AFA7BB69439DD8BBEF9C0714E99C9B22135E05D589722153BF3FF895D373361A4701000000000000000000000000000000000000000000000000000000000000000000000000000041449D3DFB649E91F5879FDD022914EEF6E8D4629304A1195419B3547D6131E5522DBE97824B3DDCE331E02C7FED28150D7702AC5BAC35AB10300300000000000000000000000000000000000000000000000000000000000000000000000000002BBE29AB0519A4DE29F61365B88B40460700AC2E7A27C68D1AD954611A08DE1692885FF741679AF328667B293FC450C5408275D8130E95CDE85E0943C1210300C097ABD88569E0D7668C3D970AC51D8FFFAEC0A5D8711DD520FCA3D2B385D619BD8CB4C3E7AEB2662111B982A36EC6DF8B47506B5AE4E2D29FEAF9A2E9CA12005B99B5A32EDE25F5DB5BDCA4A9F7A75689A63287625C0DEBE42F6DD25E2260ABBFE28AC03CABD3CE26607A48B3A41A46D94DE8BDF79A0926AABAD460E1CD14007A2F72CA13600559EFCBA83975AB8DD7F0FB68AEE2B9063B65B92FB86201B08C21B53E5F03FBC40F36A23EC9A17696BCF743E6BF832B4EDB5E198024E1E616005E6B092C4BC5AE081EACAD732269C51D42473015F8C1A1C12D0CA1387A91738AAE50DBDCD7685B64E7777CEC7BC54C68A4AAB221486E31FA3996A2DDE4D52400BBF54C7271E0762D7D14F7BB30A2E3029867AE6E0EE39971ED8553C0841486DAA9AF88D0BAC29B20B01D5A947F7DFF1EE6466E6B0BF43EAC0743CCD451130A0074D61E505627F14581921B616A8817087E5BFEE6587FFE69183F4C9EF8E985EBF4FF5601FD9C629678DA199F2EF9F8677C513812F1B8739390D6616F788207004CDED6404E2DADDCE10844EC6057066E684E22D3CA249C098A88065655E5782495D55F55A92C490980B738438EE04FC572A3E733F47EDAECD4CE5A6C0DFA1100F157939AAFF448F47701EAF029E2C6743B6D159EB328F3DEE1E398B0A0FC693696DAEC13C4B8D3CAFF15B239134D70E0824D9090898CC6D374695E3FC74417005413F824395E726383605775BA9995FBAF611F6ECF94BFB7F0B87624147BFF15F70E88FBE3E559D73AE140915B404EBAA80665E19AB074945087B4A9367B02007F422BB6F2AD1BBD6383F4F48B6FE7CA23D7B1791F6E9E7747F89B120CC2B5DD00FBE2745ED623FA5E4F90485720DF9E26558D0E6F5B8D19F079D11201002300F1D3A873868C1312FD7B009F1F12D5FDB1898CE04451903223D6D77ECACCAF8A7C89E5DD29ED191BCC84B7EFB005C3200B5627501F36C070EFD6D614DD531F003898ACD92B67F127FD859ACCA1FF29DA3D175CB626D63938E58F5FF6AA3F9794CF930DF60275318646814CE8CDD0B5CB0928E09982AD7D176D49D42D82F6130035D7E259F6E649F422A49B32F985CA7B2EEA0A703B5813072B64D1A10F3AABB46998DFA0161CE30872C45C030036FE61DA437F471F4910C32AD6D5216E591300 -smlen = 3536 -sm = AAA7081496D3AFD8B64413F71E4D25F3704201D280E37A7D52281666986D65A32721AF8AF5019540173C065CBDC2D5E9B1898B6626C117BF01F13E561D57E828C93861810BD278B75F88AA006066B7AE1D0CBC2548263BDE39170F018CA90005BF1248EF8ABB961C604A1CE9B5F5CA011A01990C1B34B613C5FC731EB3CABBBD06628205005FAC7946130B1277FB39C4CC0DC1DE8E09EA0077F03849028354B85254A198D7C46FC58DC201B7F25247BB83BFC86C03391FE288CFE5A2F500B09023B7B3A14762A86F6A79553C25123ECB0037C40CB902B41D0482123CC7B95B0F443725011D164EF57D6A4C964AA2F5CEED8A8E8CA21101EC37676ED65C9173507D8367AF789322AAE70001BF1B78439423785945E901BC162D0231FE5AF8E0D45BA14DCC2A97E57DEA04CE06037F9116EBAEE925FFA303F46644C51755A5BE006E6DA66D8619F3140BE83FF58F8301DE897F02AE7292ABAFA6A0CAD52929113410F2BA972B4184E894C4D31081420751560956F49CE2B772635625AFC3CA6698FBFDE4D0A05EF243DF190BA1CE780EB572590E01E6E283E1963F2B0722B0CEB365552F65BD405F1A284DDBED07BA61C4453D30CC28C83E41590E09D7BB6932D231285205D61332FA9263B8A2D3D7F7FA20F521CA4B49F249896780E08C2DC41669BF0777278F87BB1F72CDDF4B998062B1642791F81AD474D6D8F963DCB4458CE11108544C41CDF19145B77038C7E8ADCD6501508C53B25BE6E787313018620D1BA647CCA4A5A8399E11815EAECEC6AE66DBC576699BB0AB44DE111AB6F252256389EFDC0546E641DE87FD6A3A724716257A9174F39542539A593864441EB79D499FCDF2F1D053CEBB3A1FCC09419D2C553C2265B3DC3943E0341BB49130E9981EC59945FA0B23E9DBDBF352ABA0D925C4333F2EE1F2C83C847EFA78BB13263B893D7CAE029BF08CEA2A5D1B5B997E403A489C6D9A124FB8386FE58C2476894E7754B8E5A162102A119482B5E59F8D89C8B1DEA70B6C80641C77BFD12D45C5B3CE0021EE500A1665ABCF740794E0D3E7E8CB5804A1E0D0C81A107DEE80BF63BFF8CE2EE2DD602DF279DE39C579B417A758356D2B48B41E83495DEE9ADFE4506E03F19DD096E81405264D408B2FBCDBF41DB5CED6FBDC2645DBEFE5BD038382993970C7686DBA3FEDC24E1F91BA4B6CF70B2E832B97BE24B6393273A519DB0B4446E98D77E86CCACFBECCB18939013C66F7A29B10DE2E88FCFAEF656B858B7DFACC4F21EF5F328C0EF604FEDD993510BA40530B79525FE8D336DEF0E5C303539E664A9360EDAD7268F70DF4DE199AB3F70EB2BA65E2752BF5FDB1E853E6F4EFCAFBB31D8CC23155413BE31082DA958B01682894A9057CAB66D4D64A6F3B1D81C5B75815A3E0CAF6486B17339174276A84E11C117B060302DC2EE06A03C0E15395C0DD32661638F059A385578C1B792349A41C511D12AC7185B060A831EE296E6626459C2750FAF3AFB579F6F6836D566C00C979B5130E8E50431E914834CBB3D26F6E5BA50BCF05D50F699FAF10767AA2831C3557A53AF14BFD9F23C00F76C2680C7DBF4A9B2A425E34C943228C3EBE55A0960ACC757D7878F7943E2E8A1CBC8C0D2139A6A6459D3492A1A7757F71E90A58A78E0FF9B04D059C5D131F6E3C30742FDE5506AE7860045A4C903DE96DC43AC6A69273BF8EDAB7E7FAFBAAD9EFA8FA609961502EFACCDE63A6D98D8D017075487C608FF701A7E3381D7A2ACB134B198950ECC6970A75AF5625FAA4EAF968CCE48FFB673F4F365802A984C609C33BA312140A60A6F0924E945D11BAACFCD643C874D352A90367EA4C59B63665364832B1A9A9A01EDA92C64F393C357158973FA7C6047B8B5E27EEDB28E26359402B63032F8B230F5AA968272819CA486A8BAFD3D66799AE951CABF04EA81E1E7E4632B915D4E8387C7D1F4FAFE1C1FC8666FE0318403EA0027487E947D844A7FA28C0523A64EBD95D2A8ABF6A71FEFB5BC059B2CBEECD4375F3A3F109DEAD98539244DDCFEE9E42DB3ABDAF943C445712EBF19508A1FFA6133C5078C1DA69A32CBE729A8876C4C73CB232024A87D87FD5F9456D3D4A936CB4CE2E00EF415406D66D344000A4A95CC9651425A16021336C4BEFF310210324C754BBE13CD0066C507413671C80CF492B4655D898A18A2F4DB5A393400C6AD821580B0712D6C919C62E87FE212260EAEF6876C409FCA1047A67B223E0766144F3F676F051FBE912C4CE4A9F7B85459DA031EC47C621F6EF06CD1621421FA52B047B51C944DFA94807083B4ED40D533B19813477193D1E4E96C8D76A5AF3100FA44A985A6513060B08A7F3848159B3CC551D43370B223037753B824A099A7C7DF59305BE09E2E79618C83818BD542F39380126A927190EA5536DFA63B664AA7601C6D82CDDF4CE4006E1AF2601EC453971828CD09C29D2F3EA6392B58D38BCF40BF6B6497F6B848CB853B187610CD23880CB09787C76087356C66565C0399BE746A81753442E4AAA54E84F1D8C2CCB2D00A551E960203D61E71A72E131ED1967DD06E72C99264EF2EE5BD156FC869B5031BA23A6D354D7CEC58F339F6BC2DD1C547F07AA733994860197DCE5BCE6024A74668ED89A2C9CAFE1F78B31638C3225D96009C260FBD28C1F0423E75C9C01A0F9E62B7F265FA3817F441F56AE79BA54A0C107FD7946A2DDDA60D0EAE428715FE2B4FF93BEF83CD10E5E17760FE028F1AAC8084A43EDCC12BFD3265D13FA94D9704809A50881D48F0080A976C5BF31B353B9043C0F0B69AE6F2B8BADD056752F2FC9E90C4B35850C2D45B9F354B41ED7826B976528875547A0C389B83725E26C006CC8240E380E3EB554DBF2133A131743539B1D174CCA6B135C59F81D499631BDA4CF90DED836E8C24C074A0BCD83271309FFEF320791C9030FC2B1F53FD2DE870E54EBA20CE9930C279B48B39CB481737F012F65933650374BA39E2222191B0E3C7DB9632CE9CB077322CEF97ED832DDD8AAEE53C52C03D2AAF8EB5597D8D6467A406BF428E2F16462E0C0D486A1C1C7348CBBF92633EC4FFA75945025A3C92095317E32290D4CBAA6CA40F3F201975F3FC8B733D1467C094E075E8415352E3AE51A6C5169A4AA430BCD66FF39B184F5B7174042DFCC6840EEF60CCDCAC12D012AE4F24F7184A038D8D9964AB405366740600B98CFE2E4737C8D846FD4E9B22B5047110D85B37BDB9E7E3BAF5298BBDC1050AA20F14E34DEC283830F5FA9C570C22CA659C1276BE8FFBC0AC3551DB8488855AE7EC21E239E88A0F68227D17DD87FFA3B3D0535F9E57807755DE56A65C0DE9F4A79F8746B20908BF9416A86F62EE2C2545BCA2D55CD4D45DCDF06DC879E1B6270A80778D0274AA658395D800EAEF367DF4F4D838EEE0A66093E0F419B9EDC5F003E31CF0EB7E1CEE9ACCDA7A2DFC920A4B5222389DBF12AD17392850C434A9B3C260159B0F52E78E7A66D28DD5B3C77662CFED2CB3DD5BC3CC26A34293EBF1FB3A9BC59BB0C104C5A9387F3893A65D145D424CE741A375F9C65E733A024E78FE274B29FF4B0EB6F21FAFC31453EAF7E48FABEC5711D3898B876F59952C73123281A8E85148CEF5A166BF45DF36053D57AE6F29D3E334BB2395FA236D4DAA8A4FDF99D80A9BCDBED36154BF4FA3D463D51974032D7B88B2504317E14165B1C3FE3D8FE366FC8284321D80F9CF512F418C63F73B7C29C07870332387BBD1A870AC39485F64086006CFD68C8299347615A423736C01FAEF2DA56CFB6FC966948649324E22D4551B9F50654EE505547F7D0B8481ADF6AAC3977F49D7E6AE5C4248DF7B43BDA7F082AACFCDCF1C1BC04F2D45F5E028498ECBCA47EC4D1DDEB03A2AB27BE9E4B80585145676F8AE7A5017BC5EFA317A576ED6E423D5A0495B8DC619712A2C3E6162B04B9BBC7DE4BE6532F6C1C019E702C014C60189A2612594BCB18317804C630264D07B7396DB562777BC305B885E00706FF6D0208737BD229BC7AEEFF5FB770A4C057B347601F1F6C16F60D4A53A0B32631AD2D41FA307F6630228E1807D22475D5E331A50A680896DC606F3941AC08F8BA46DE5A49F5ED6A94965334FDFD69C4A6C7973D9615B3FE576B15AACB9B98D9E498D2A3A89B4F8EEE715ED5F29F13DDE7629BB386F7CC800F16F3B5BA8BD0E14CD8D9BB0F0AA615BE9D7557F6EFD00F7BBEF9989E7F463279408E6AD77E100AE4457D57424F2B1CAEF43052C5B25C896BAA1C2FE67D1D6F669311F17D39460F0B176A7727F53257A36FAACBF3DFE623D8F882F8EE41BA1CE387E1D1860F4BABE26ED678395B9979D84DEA5C7B38905D4C7FD867ED7722D066BFF3A833D3282BB40D1CD310DC8DAC9270A49B65B5181EB30F166CAF0832A8DC56B9D135550B506D98D036BE7876836AAE669507990DE6D03E78A38139CF64F65FB410F192E30B045C93FE259C10E0C5B56A2B5F0605DA0851104C4BEEB4E3B30135CAE5A6C68403C63121B0993832834A3B5EBDD345C41B26DD219560B624024B8B945A10D385B3CE4E0BD54E10A64ACA59D283302028A9592120D142CCEB1CC30E1F96AD041F1E17BCDC3C68C2EA2E0D65D6BA3696166CB365CC461ABC4D67D504E8290EB452ECB77F6D5FAA5053D01317646242384C5C510BD43C5780BBD01EBC3AF33D29D8A09EF39AC85E70398D2A64DFFA72B3EFD8D6D57AA2F9DAC0CC6EEAB27B69FDF2403A5FEDE0BFAF441619BE03FDE44C49FF0A34E9C37D2B9AEB726D56EB646A67BF349323F397DB056D71DE72A2597D780942554C8F8273E307DBA6BD02E944E0559509E1F28B511BD709D03EA2451EF234DF6F077E06AA01E2806D5BDF89DF29F1B3D8C6D8014496AD83857F7465F1072E88709D0194733E1FC8C9F092DF5B9802FD2DDDA8B142217B9532D8604E2F32D06F6400025930DA2BE9B25529788E6BF4EB7F84C272DF455CE2ADA291CFDB5FE815129E4AED59625C879E99B3E3C1B6C5D7 - -count = 97 -seed = 13F1F446D9AA5AC853278BF74C9E6447A6CE4294C037867F43DF554370EE261D05C7260EEBF46D6694D0850B8343FBE5 -mlen = 3234 -msg = 525E8B98C55864849FFC71EBC953F7A0ECA6298F6AA15A83BF6923BD5921B1C86DBBFC544A39C364EF6D9281481E946C994F96829D6639727A5345560D8641E9A510F913F7FE5592C2A40CB278F5AFD8D4504B5387C20945654F08168247A98F56A43A5020955F882D2D93781F4A83676B08F50341E953A5D1B67DE7F6D1BE3D78D5D060AA85B5EE4271763C437CCD595890DBC8FCFAF2754AE9349BA2FDF89847A15188716C0EC672887A4B9A15176AE0C5138819CA232D012BE1DCFFD29F677442083087C127CBD80B0D9CC0962BC8318E734910D1E2653BBF700C84BB0919E12DF331CCDC7128B41F0666F6419AFBADAF673BE16C9177D3CF113C6488504DE088149BFB83EACBBC400309B7AD753F7B2F5AA89F070C9D14C084C32DF91C5F7CB6A7D869D64F4A05AF80A98BE7517ED784C17B0D7DF96B9987B7EA7A398CE018AE6E13E1C0F7AA040AC3FFD273BB9687AD6FEFDB211061A6228967E9DFEF69BCC1C5D02EE56D49A93C8AAD46D08322A2CA246AE8C3EDC071D063AD605A97B8AE94D58E897A4A6310BCBF55B0CAE1AA81769D30B46F883EAF29D4B5FEA32F2DBDE49360CB6235754BDC305ABB5E5395360097378656E2BACE675448889B0149D6086C51E9C3AF07A76563164864F131CF9C0CD475CD4A58726AD237CFB76ACA68032351FB24711DA635871386B4BFC94B0DB6D35F07D0196F75CEDB92EFBE7D653E0FF9326A596F9166FF6CAB73125DAD27F361D6122CA531D86910187E75F849EDB52DB26C96FDF05925DCCA232480D3F979EAB07CCA68FC9069965D12BB666A180989AD1FBEE3FE65E746C5A8F64DAB2E370F0487D001121EDD0D0D760531AF46DA65C75DE11688EBF31DD2AC95C188BCFA07EA798609F3EA8E6364A43742A2825144FAFC05ABD17476480812EB2483734B13D075B3EE3AD510B67CF7057014351B2CE5357E3F12F43BA74CED614BE3A9AC0E26763E9AC596F87AE98F72ABE0DE213A81A9A03E2B82F2312C1A186DFCFC3DB346FEB132931C793ECF837F57D8E326101F59705B77A3083E712CE347C2C29C23468B0C5857EFA410197833987C61ECBC2A855EF78B3D7B1B697AB9844AAD07C4B8EF666BD80DABA5FCAC900C5D358A11676FFC89DFF4F36F29F14D9F9B854DCED41FFC4B36381449D22801C19BF8E8BA1F07A1B38FFB527A34D009C4064A1E606FF2AB90AB2E05C156150EC14D7DC792578A16F46650D0ABB61175D1817E2C38F109EBC01A3ABB358673561691185DA32EEEF566C1BA1C72C1F08CD1B427B552425501B8783116F2EB0CFF73C5D2DEF18D291C106980135821A77428FAB20A935AC8B6DD8EDD1A936225344EB103DE0D5879CCA09359B5B882291C0FB1FCCF167C30DBECFC324AC315713CD10F35B72F0D4871A7CBAA2B4CC2BC2598F23DA607C94A063C9E2013B0EDA5F3BD5AADB2C429177A4BFD7B6181ED5F9A55C1F043DA8155C9E7BEBDA7EA07DEA49938FE07743DF2295C220EB53348310842B1000B7A02AC025C3A94FA82D46ED7E2712DE71B149742731EBE62E225D21A7F29D5F3A8A62B71FE16258570DA412C07CECF82B2064AB5D98761C69FC5E899A8E174875B3179DEAA0BF4A0261DA9BF39148440DCBEB0C887E41FDF751505DE79AA1F8593F45482B659F5B5F4CC3E7BFEE59DEF49458DB195A1A692B8AF4AA44CCFB00B753AC761181B8AAB39DB82385AE776CFC585F7873613B62DE55BB10A6B2F27E631CE41436C3FE390163E6F4EBD6B501519C96C06FADCAC8F75920FE1435542FDF535EAD6C0E3F41345996063B95A208DEFB6F110CC861580979BF4422ED395CA218CFC3B22C0BA8B31CB9EEEB51C3DF35FECE92795CAFB8440F522B44E21B3A18D5CDBC296B887A4B927F36715E4AC2CAB043D8B69A8704D6BE24C725B0C2E814BCA7B040C27FE8F4C14911051039AF13F44E0485EB767F5404CFB6FD19DA24D82FE24B53033C83DD8634E2E28AA330A81F14BAC1C57DEAD7FFE39994D9D094383E14322E146A3DF27A776E2F09A11EC9014C809F8E543594D6B4814918A129B36FD25015A044E04D3F081D4D201DF86A0FCAFBBFC695088170B8246776B6A28E59449C646D1E706CEA96B12683CD3A7C60459D42989CA46694B0089CF88E9AEC5E110F69FE0E3FE20D18309D1BA72A83A34813B771484505B08548FE5D376AAA0C414260EA4BCE5EB81F6545CD5203026264938905BE1E252574F4B4E71C6E12F99F6EFD35EFFD64183CD0665FE89D6A357B1908E083511DCE2CDF792A608044C31418C433F86719E156AF3FF98D0F54EBEB9F9FBF24588A5557D310EF9D7CF5DD8A68512D8CB15114773C69D7B40C927858AFC049F7C6A89841020E1C313C5C38B988EF505EBE6C15FC1D6CCD8B472F90ED64DA895D06AC01BB99F455A195A670D22DBD5E3F03AC84A08831E9842A566E9785A0FD4C460C5CAC154D705DCE1E7FD1C45BAEB23976AF881CF5628F3CD92AB19BAE8D45A03A859518E4A1E558FAC2B48A432E46CF274E6496B63874CA4E4571132568AA43EEC3D2A3948F40D327976A6D28CD816CFBEAF8FE126913384061D219F51179F679081503371EA0B6BD7E9524B0ECE2573304ECB4A16EB471CA0817C0C6EDE751F283ACEEC5A60C2796C6261FFC6226E4813241619F465DCE67B38E1D5A647B079503144907307C7D6EB6E6EC1936B5C94FCC08A882B4555B19B33A9BF22384DB38473A313966D157DAF8AAD41EF67D3A5FE723559096AB1768FF69773EB9D5C88D6F35F00DFA4473DF71C7E9E35393638DED05D05C105CBF37711D38E3EEE35E8CC0029B3761241FD1E56969E09E949690D4FE25735D774E777A2CA17FE058E14AE6806F611FB1E9FCD516E20499A704B67990716703A4287B50AB45D155D40EDC0AAF97F5B87551C236CEBE9CADD562B27957EAD251F79CAAC6433F228B50167FB1A753306FFF08B53A8A3CECC226857A321700EBE23AB4D6C35415CA79B682D6CFEF6B1341E7CE00CB9870F432B63A2D9A9A43C87D28A95C514582812DA37738BDA6CC76142E08F69EBAA5ACD0403100C2343E2FA088441E9A55C720BB509BC3600C27C1D39157E049650D1749751EFE55A72349E2A5B714556CE2188CE972287BE2152C7E58D3FCAD43A214A4095DE55CAE9F627D8B9018DAA01547842FA1AD14D67327CD47EB9B90CD94AFDF5244DE57E527F17894A410FB4210E06632E88A398400B0AA48CB3FEB9A90ACC668615D193D5A98158092FBB59AD2D6D4FFEE433A2A6A971A228685AE5BBAFB3AB28242C630AF4656C5071C545618A0A765FCE41B19970C2152D44C349D0CDFB29673D1A42FFEC139D1C9958B0962F7B57F80CB8FE6331553B0DF93DA9BFC722B1C001F48FF9C0FEF032610A1118AC9EBAF9202DFFEA605272A50A90768F031C72D570C0AA5B0D4FEE4AD568895274388104C0BF88D03FADC3159D6CF28AC6A7E3E5CF6FE5C6658128CBF81456DB8C29A76F9C75230F3837F1A94CB83C3AAABDF4B29C9045B45AB9552BBB6C0844BF2926267C0D74D3337249D5C9610E0F6FFD0278F12F39C48650C048D61A3FDB8E1A2E08CCCA68803A55B39BD39160B0420CBEAC7D8A55F571F490F694A7AA8B725BA84238EE1E711864AA1F74AFF252C088E36B79B09C80278DD442EAEA8C7D5833CD1BAA18BDD866689E663EADD0EAA6E0C78A3E09DFFE5F6F1F4003DE24336586B25DC5EE45D56F31D8BB2DE31B24E87172F3F1B26D400B08D50FF624E456183F269CBF06B3707260383174FDA152E4D0C528A90C54114C4F278D0FB35B74DD3ECDA14EE89D38E3227A7E18B068F134B22154348867A61719C926EA3320D1BE0B9ED78466B2DED728CA04C15AC144185FB2F5084511A38CFD765659351AC1AC3E5F327D9F3DE9B2B003758DA78DFD08FAEF3625CEDD87C8A55A3CD0257AA71B3788FD2449EFD1F48948CB304468E3CA07EA7044FA185A2B91F9761C6532B9273DB74C66B2DE95AB19E5102CB90C719EC85671E2829B182BB6D09323248D6584F0CA67D422BCDA65A0146D8DF27AB4AE651706D5FA33B5BB88ADC2A1A95105D55CCA8439A5060D110760DEE8B855D0839053BE595278EAE66542736D25C93D8544C6E55ED51AD6E7029C2E6D32CFA8844BC14972809E31754AF84BB479C504EE77CB65CEDDB6BDA613FEAA2AE6598D1F4975D0FCF9D9DC787EEB5C03F8B0BF438E83C38E2195EF1D35D40F5A14E194BC1BCC64D02CA722E7DA28334E91FB6654D708C5B07946CDF58747086EB3CA59D095EB27F1B7E6806D3A35335B2265031A1120F28EED8B4C5D9AF268502727C5D23152149C98E6970D4DCC4B9D0FECFA6A79FEF82CB233E71FC8AA999DF66EBF5A1DB2ED1583C65803FA8958F49890D13BC05C6A991F26C31766BDEF9BAC601A47C8C3C5E395FD8F47E56F04439E9BC8E9B1901A529395F2D57495D70D0712881D298A60E3E013326CD56BF9F1319EA8D6A6511EEFF373F081478A51E14F0AA4A33C6C5EA7816380C8984F7A5DA45B0C4B6B550644E65A5B2DF059ED050936FE6F073B4E8056ACCD3EB65A0B -pk = 39C75485265428F37D9F624C94B73CE2309A05D97026239A37D746D4ECD460709812CE30D8D101CB7A124C626A60884B285A3B25F2779FE9AC91505297C61600D78F0D08EBD4AAA23112CCBC222C6C39D57B3143BD4E64797D5D988BD3853AA1E612DC72AED26F575A96116874F49B67654A35B2DCA3B6676CBAE2AFA0C60D00 -sk = 39C75485265428F37D9F624C94B73CE2309A05D97026239A37D746D4ECD460709812CE30D8D101CB7A124C626A60884B285A3B25F2779FE9AC91505297C61600D78F0D08EBD4AAA23112CCBC222C6C39D57B3143BD4E64797D5D988BD3853AA1E612DC72AED26F575A96116874F49B67654A35B2DCA3B6676CBAE2AFA0C60D0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C17B80C3AD1D04C37AC902ADEB2F40523C094C58C063F078F0BF4BB6215CED0CAD35D0D2824D01B57900278F3D16D74195A45A556228359418871EA8EC3B94338DC4465580787150E2B909486359945FF77FE0F8CE3F6576650100000000000000680B2234A95C9C57B627F6BFEE9268B97F1E409B81714970D288A4E4F2BA7AA7CD98F70D5A5D9E4EA1F5E3816C5EC31513667165FE4FA49F2A8D35715DD2EF4D1925FCE28F3C7743097ADF688B420A96E9B9C0253FAF00BA11FFFFFFFFFFFFFFFFB0CC2A677AAFD091115A500BF781CF8BE8E98881FFA5DC58CA03CE595CDE19176239CF3F39007864C95CE8C6479BE361AA99409F035E7E792F7AFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61420B0CA1D356B8922A3BB71C1A48C748C8EB1919612426F5EBE73D9ECDF91B503333142AC5D2D92A3D5F8B8DD9E16E7391DF1C36E47CE3782C0100000000000000000000000000000000000000000000000000000000000000000000000000007ABD924FD71E0EE7EBAC1CA5641CAC3CBE6C94B33D4C0B7987EAC8926B1E23C455C134992D1783B8CCCB77215F55B6449B4C3E6F612CA749CC021613BB7C1E006F0C06102328380FEED536E85BB7C2E936A4EFE6BB0C9593532B1D2B1D3935419FFDA83A09A6236A3EACF8A54E422019AB4FC41C755106580F411E9EAA6F0E00652F84534322FD4C5325118371DE1E6E475A6974E7C9557D7C7A1FB4DC0AC60D9F2C231301EC902201F60FCE9935EB7A4B0102251CA3A19A8791EFC3638C0500E58F21BC9FC2FAF639601EC3FC76507BEABD706D33612EEFD6EB03581B5AA1729E503B2EC2A564B9C1F473B310B8FD2E794DAF931FF9E818FD7C3BEE5E65160020A19E6E07FF883B3FF9D1A884EEE1EA2097409128DD685D180A5431A615EE17D5881D03420D293251C89A2AE5397E85DD4EBA20B7F4E138808CB44ACE271800AE50D0A7F693B3301CCEBF31FFC3CC8D07FF4AA2FC37E7853C3EFD94CB0E8413D46D25570708CE1D693058C19684C968D2189854E9A3744C1185CFEB01A6080030E46EA4B16EF89A7811F60F09E4D08F5AEFFE1A046E42EDCB91C1A134012875EBBB865629DAEAA101AA9119CB2ACDAB76503BDAAADA98ABB49DC2AB40BD120051EE72178902242B41FDAF78086A794951C9E009AC5DC7CAB511ECFA15687FC0281BFBD8D917322B9B8A9A52F0649A2838D8A9840B5510FA95BEA7FA455100009243DED29B416003AB8A851ACCD23102064D6683B01E46BC2E1D23DC6ADC8090D075DB6FE3FF5C69C94E0D145FFEAF2C3C9F2B8AB61D47125DFC51097A041D00DCF0A489417C5DD4F004DBA9E5F03F79B70BCC550E39220BA1912C85E0BD48A30CC19BF32484EF9C5472C43B007D2FF8B215763D7007A6055C355F942C2C19006C11D8B7191F3A9F048928B317ED653458B933FC4211C23CB6AFE0F2329C170C18393A561A4C6EA0E1BFFC08F94CA887AB4A47E3A00086BE205C3648FD6A2100E6932C979A0E66CB64E646B3A0F02E2A0CF19A6FF019054CF0F62906796CB59FAE7E0DA87F98931084E09F79ABB8C4FCF2E090ED4E80643CDC0A9B2C64182400F608BE7AA5FBFB1F3DA2530881EDB0AC2055801B926B2F4C7FCEB6A0E9F72DED3CAC35C1F6D37A15B401E6AF1A0E7B6B0826A61B7B694C25855E1B17ADA91400CD04CA1F6B8BF7B23C88064A6C787B6E0194C4E15F31A281DB47E725DB8A6D7048DCDBC4C463E7FB240D3B66252065C121FD2A8467E1C41A6B6E908704BE1A00 -smlen = 3569 -sm = 10CB3B70BC90CDC4753B2081F88BE0673D0B01551D2BADB6DCBC05A21489A254A777FFB8F4013335DC429E00DF387DAC48FEFEC3621F706B00F78CCDE16CF70A9A7AEE2B17DC5400B3B8C4017859503785937CE5A45FAD893957DA973C6A00C2231B900682F21605F68AE97FD2142FF4F00039B24687BE2D8471B011D15666F7A46EDBA900780A06F9BE61DB131EF77244AA4BE447284600AC738CC024A5107AF9C202C8595B73C59AB900D18F1C6FFB82D57F7625E80D7788B29F229700C1872EB63B04B0B8DE03691021B3FB8B7F6D0110E3C8839D993B07DE32979B992CE863FC31014661E4E58CFB33AB5B1DBCAC35D1645894F5014C2D7576B8FA16A31BC5CFE470A5221B58050001DF37CAD0EE6B766DFEFC4D6C81A504D74C60181F4C22A438D144D36355030D0E0403DA45E2F13100654E4A878EFD9A047BFBBAD701926DD15337BD763A1B81BA95780603525E8B98C55864849FFC71EBC953F7A0ECA6298F6AA15A83BF6923BD5921B1C86DBBFC544A39C364EF6D9281481E946C994F96829D6639727A5345560D8641E9A510F913F7FE5592C2A40CB278F5AFD8D4504B5387C20945654F08168247A98F56A43A5020955F882D2D93781F4A83676B08F50341E953A5D1B67DE7F6D1BE3D78D5D060AA85B5EE4271763C437CCD595890DBC8FCFAF2754AE9349BA2FDF89847A15188716C0EC672887A4B9A15176AE0C5138819CA232D012BE1DCFFD29F677442083087C127CBD80B0D9CC0962BC8318E734910D1E2653BBF700C84BB0919E12DF331CCDC7128B41F0666F6419AFBADAF673BE16C9177D3CF113C6488504DE088149BFB83EACBBC400309B7AD753F7B2F5AA89F070C9D14C084C32DF91C5F7CB6A7D869D64F4A05AF80A98BE7517ED784C17B0D7DF96B9987B7EA7A398CE018AE6E13E1C0F7AA040AC3FFD273BB9687AD6FEFDB211061A6228967E9DFEF69BCC1C5D02EE56D49A93C8AAD46D08322A2CA246AE8C3EDC071D063AD605A97B8AE94D58E897A4A6310BCBF55B0CAE1AA81769D30B46F883EAF29D4B5FEA32F2DBDE49360CB6235754BDC305ABB5E5395360097378656E2BACE675448889B0149D6086C51E9C3AF07A76563164864F131CF9C0CD475CD4A58726AD237CFB76ACA68032351FB24711DA635871386B4BFC94B0DB6D35F07D0196F75CEDB92EFBE7D653E0FF9326A596F9166FF6CAB73125DAD27F361D6122CA531D86910187E75F849EDB52DB26C96FDF05925DCCA232480D3F979EAB07CCA68FC9069965D12BB666A180989AD1FBEE3FE65E746C5A8F64DAB2E370F0487D001121EDD0D0D760531AF46DA65C75DE11688EBF31DD2AC95C188BCFA07EA798609F3EA8E6364A43742A2825144FAFC05ABD17476480812EB2483734B13D075B3EE3AD510B67CF7057014351B2CE5357E3F12F43BA74CED614BE3A9AC0E26763E9AC596F87AE98F72ABE0DE213A81A9A03E2B82F2312C1A186DFCFC3DB346FEB132931C793ECF837F57D8E326101F59705B77A3083E712CE347C2C29C23468B0C5857EFA410197833987C61ECBC2A855EF78B3D7B1B697AB9844AAD07C4B8EF666BD80DABA5FCAC900C5D358A11676FFC89DFF4F36F29F14D9F9B854DCED41FFC4B36381449D22801C19BF8E8BA1F07A1B38FFB527A34D009C4064A1E606FF2AB90AB2E05C156150EC14D7DC792578A16F46650D0ABB61175D1817E2C38F109EBC01A3ABB358673561691185DA32EEEF566C1BA1C72C1F08CD1B427B552425501B8783116F2EB0CFF73C5D2DEF18D291C106980135821A77428FAB20A935AC8B6DD8EDD1A936225344EB103DE0D5879CCA09359B5B882291C0FB1FCCF167C30DBECFC324AC315713CD10F35B72F0D4871A7CBAA2B4CC2BC2598F23DA607C94A063C9E2013B0EDA5F3BD5AADB2C429177A4BFD7B6181ED5F9A55C1F043DA8155C9E7BEBDA7EA07DEA49938FE07743DF2295C220EB53348310842B1000B7A02AC025C3A94FA82D46ED7E2712DE71B149742731EBE62E225D21A7F29D5F3A8A62B71FE16258570DA412C07CECF82B2064AB5D98761C69FC5E899A8E174875B3179DEAA0BF4A0261DA9BF39148440DCBEB0C887E41FDF751505DE79AA1F8593F45482B659F5B5F4CC3E7BFEE59DEF49458DB195A1A692B8AF4AA44CCFB00B753AC761181B8AAB39DB82385AE776CFC585F7873613B62DE55BB10A6B2F27E631CE41436C3FE390163E6F4EBD6B501519C96C06FADCAC8F75920FE1435542FDF535EAD6C0E3F41345996063B95A208DEFB6F110CC861580979BF4422ED395CA218CFC3B22C0BA8B31CB9EEEB51C3DF35FECE92795CAFB8440F522B44E21B3A18D5CDBC296B887A4B927F36715E4AC2CAB043D8B69A8704D6BE24C725B0C2E814BCA7B040C27FE8F4C14911051039AF13F44E0485EB767F5404CFB6FD19DA24D82FE24B53033C83DD8634E2E28AA330A81F14BAC1C57DEAD7FFE39994D9D094383E14322E146A3DF27A776E2F09A11EC9014C809F8E543594D6B4814918A129B36FD25015A044E04D3F081D4D201DF86A0FCAFBBFC695088170B8246776B6A28E59449C646D1E706CEA96B12683CD3A7C60459D42989CA46694B0089CF88E9AEC5E110F69FE0E3FE20D18309D1BA72A83A34813B771484505B08548FE5D376AAA0C414260EA4BCE5EB81F6545CD5203026264938905BE1E252574F4B4E71C6E12F99F6EFD35EFFD64183CD0665FE89D6A357B1908E083511DCE2CDF792A608044C31418C433F86719E156AF3FF98D0F54EBEB9F9FBF24588A5557D310EF9D7CF5DD8A68512D8CB15114773C69D7B40C927858AFC049F7C6A89841020E1C313C5C38B988EF505EBE6C15FC1D6CCD8B472F90ED64DA895D06AC01BB99F455A195A670D22DBD5E3F03AC84A08831E9842A566E9785A0FD4C460C5CAC154D705DCE1E7FD1C45BAEB23976AF881CF5628F3CD92AB19BAE8D45A03A859518E4A1E558FAC2B48A432E46CF274E6496B63874CA4E4571132568AA43EEC3D2A3948F40D327976A6D28CD816CFBEAF8FE126913384061D219F51179F679081503371EA0B6BD7E9524B0ECE2573304ECB4A16EB471CA0817C0C6EDE751F283ACEEC5A60C2796C6261FFC6226E4813241619F465DCE67B38E1D5A647B079503144907307C7D6EB6E6EC1936B5C94FCC08A882B4555B19B33A9BF22384DB38473A313966D157DAF8AAD41EF67D3A5FE723559096AB1768FF69773EB9D5C88D6F35F00DFA4473DF71C7E9E35393638DED05D05C105CBF37711D38E3EEE35E8CC0029B3761241FD1E56969E09E949690D4FE25735D774E777A2CA17FE058E14AE6806F611FB1E9FCD516E20499A704B67990716703A4287B50AB45D155D40EDC0AAF97F5B87551C236CEBE9CADD562B27957EAD251F79CAAC6433F228B50167FB1A753306FFF08B53A8A3CECC226857A321700EBE23AB4D6C35415CA79B682D6CFEF6B1341E7CE00CB9870F432B63A2D9A9A43C87D28A95C514582812DA37738BDA6CC76142E08F69EBAA5ACD0403100C2343E2FA088441E9A55C720BB509BC3600C27C1D39157E049650D1749751EFE55A72349E2A5B714556CE2188CE972287BE2152C7E58D3FCAD43A214A4095DE55CAE9F627D8B9018DAA01547842FA1AD14D67327CD47EB9B90CD94AFDF5244DE57E527F17894A410FB4210E06632E88A398400B0AA48CB3FEB9A90ACC668615D193D5A98158092FBB59AD2D6D4FFEE433A2A6A971A228685AE5BBAFB3AB28242C630AF4656C5071C545618A0A765FCE41B19970C2152D44C349D0CDFB29673D1A42FFEC139D1C9958B0962F7B57F80CB8FE6331553B0DF93DA9BFC722B1C001F48FF9C0FEF032610A1118AC9EBAF9202DFFEA605272A50A90768F031C72D570C0AA5B0D4FEE4AD568895274388104C0BF88D03FADC3159D6CF28AC6A7E3E5CF6FE5C6658128CBF81456DB8C29A76F9C75230F3837F1A94CB83C3AAABDF4B29C9045B45AB9552BBB6C0844BF2926267C0D74D3337249D5C9610E0F6FFD0278F12F39C48650C048D61A3FDB8E1A2E08CCCA68803A55B39BD39160B0420CBEAC7D8A55F571F490F694A7AA8B725BA84238EE1E711864AA1F74AFF252C088E36B79B09C80278DD442EAEA8C7D5833CD1BAA18BDD866689E663EADD0EAA6E0C78A3E09DFFE5F6F1F4003DE24336586B25DC5EE45D56F31D8BB2DE31B24E87172F3F1B26D400B08D50FF624E456183F269CBF06B3707260383174FDA152E4D0C528A90C54114C4F278D0FB35B74DD3ECDA14EE89D38E3227A7E18B068F134B22154348867A61719C926EA3320D1BE0B9ED78466B2DED728CA04C15AC144185FB2F5084511A38CFD765659351AC1AC3E5F327D9F3DE9B2B003758DA78DFD08FAEF3625CEDD87C8A55A3CD0257AA71B3788FD2449EFD1F48948CB304468E3CA07EA7044FA185A2B91F9761C6532B9273DB74C66B2DE95AB19E5102CB90C719EC85671E2829B182BB6D09323248D6584F0CA67D422BCDA65A0146D8DF27AB4AE651706D5FA33B5BB88ADC2A1A95105D55CCA8439A5060D110760DEE8B855D0839053BE595278EAE66542736D25C93D8544C6E55ED51AD6E7029C2E6D32CFA8844BC14972809E31754AF84BB479C504EE77CB65CEDDB6BDA613FEAA2AE6598D1F4975D0FCF9D9DC787EEB5C03F8B0BF438E83C38E2195EF1D35D40F5A14E194BC1BCC64D02CA722E7DA28334E91FB6654D708C5B07946CDF58747086EB3CA59D095EB27F1B7E6806D3A35335B2265031A1120F28EED8B4C5D9AF268502727C5D23152149C98E6970D4DCC4B9D0FECFA6A79FEF82CB233E71FC8AA999DF66EBF5A1DB2ED1583C65803FA8958F49890D13BC05C6A991F26C31766BDEF9BAC601A47C8C3C5E395FD8F47E56F04439E9BC8E9B1901A529395F2D57495D70D0712881D298A60E3E013326CD56BF9F1319EA8D6A6511EEFF373F081478A51E14F0AA4A33C6C5EA7816380C8984F7A5DA45B0C4B6B550644E65A5B2DF059ED050936FE6F073B4E8056ACCD3EB65A0B - -count = 98 -seed = 6F6E47E8336ADEE99B2C52CF2DC8D461E0A54C3DF2F08199A9F0816AF8455381054CE47A7766726D3AFC2E2F2BEAF8E8 -mlen = 3267 -msg = 00769683FE7BFD74B3ACD21AF3898B74CA73DD126C8315538937CAC4EF0AD4588765A26DCCE1C90C559CE691E7EB3E0A497D357E1AB583C761439C0A66D1164518F01B6894067925753CC2866A91552FCD0EF029C2284C620CAF364DE6C56EB41EE0E4431D9BE22B76451D132A3F9AD91A53449BE820A7ACF56F6ADBC7107C7C729EC8A64FFF6A24B4CF83FF4E945DEF336DBFEA6067FCCBD1CD6B5698ADB1AD6DF03FD0A553457B8E9FEB4A1243FEEFC2DF7F66AE3ECA5BF169F7891ADAEA8D5C59012C7AA00A5A86B0A33D0006F8AD5A01C60ABBDA6D249D3FAC7EBFB85103A3A747A45D0ADB7DEF52ED3A5F1A620EE383A9C0CCE1900E413FC74A7A97646111D54783928B15BCA783D01EFC67F49CE6F781E82D25D3F30561F507E3831CB4EA5B4A08D5489830017270B63D8298BEEBF48EB56BDA5685D5E1E06404EB9A6C3790E9B29C99168B10BADF8FDB03F3C568672773EEC96428149CA272EA5A8083F8208BDCE361E7D40BC4DA75029D4A18B0B6AD615DBF849935D4755CFFD270A52FA290811CD55BDCA38ED89F0066ADB9BA7F58366379FFE1CAF3A9127E147C3AF3DC27279391E0C09537E81E20E7B9FE4FE3DA970FE50BFC96555233CC9E61D3C356AAA8EED5A8AEA2327D7036EE03E7EE40AA35E9DA4544B121514C261EC1CB0B2D75B1D5CE129E47F89825F69BA8254163179FC1331A917AE9C5A18556A10C5F983871B1258CB6FC8AD207F97A220C5598860B6C56F1EFF09DE6000241E901A89E107FEEC15833D34D6EB12DB6B188FAA0B858A5B9E32F84F783B43B6F8A3B2E4B044CFF8902E1EB0C527BB4E29C92ACC9DC7E0D9AC6B3A021415768B21DD9695983EE89C871C0EADE0BCE4FB72E682DFB5A2BB7498BF4D2C01240F67D1B62BAA4E587069C16E3032114B14A1C4288FEBAEBB4C75C3C05924A358C4BB7DF95ECF81D67147FAE3F605EDE61B7BA164EBA1AB36ECE97DB0ECB32A673E899B24557D8987AF3ADC57A9DA609914C9B2D6D8AC58E5954E0DB5AA9E75B444700B8F704E15A6A7BBA81809FA8801C6CEB5747A44CEB8F99CFE6D8A2A03C03451E5F3D392725207F3DD28B2C00004425B7AE05FA3769183AB60857B27AB08BCC4321D293C93D1D850D4E7A81B14564D7B15AC0E3BC1BFE0561622C6AA06923EEFE163629EDE8BA1732DBFCAD52D3BAA6E11E569EA790B36A8472B2CA37BD5C0EDD37D8F164B874952D00D592FB705C6B3110A12B03829C157191D33C579593E7828CDA5C24A284BA2F5A42F0BFA601A8F6D3DB1CA6D703ECBD261629C9F96EBC0458737B9951219E5B1F86192E2A85B47D80610A0ACC8B1A70DB2916F89CDB2C7F8943471DDBABD2A3536C5DC8A73CDEDDEAAEDC86FA148D2EE479F8465558852FCBEA0DD8017F1B976281A5014319C2C3CACCBF571D9550215B24134F6DAEF32716802E7945CB3F97AFC1AB1DA17D0C41B545A750EF345A6F88AD5FF52D512AFA6558335B5EB8979D8E6DC1DA562BB997E7D152D9FA3EAA09119C3474E11218230D8A56C19AD87FDE483FBD6DDDE9ACBA813BEBC8505A323C601E5B5251650DAE9334562E3DCC38A28BD7DED6942D0CC2014235C1B66CF4A57BA3010B83CC7050309F57A27207512D195D070DB3D10FFCBACDB47E4231142BAE588F92C5B0A71ABD67CA9390C2E05FD2CF7A1FABB14C5A7AE3773C66DB1F055214479E388B5E6ABF0DF8FD1B0E4F90828ACC397643CBC274143FB4331262A20634877BE4C7489C1AE9EAF90BB2A177A6B5AC15CBDA27DA0616E5F87461554F5686A7BD6D047AD0B98C8CDEA3DB78DD2970C78FB861F2A92DDC277876791C4A30F525659557831F4377065D19ACB384CC68340152A6DE6D84CDB58F433923D1FB8CC6B10BACD95B9AB1B45563998620D192032269FA8301C09A29C4B5B20CA0A3D63A4F5984B7DB0F5B17417DC7B939B9B177BF423E2F3D57DFF296E6E4FF0FB1744B13731206EAD54EF0AA1DA09BEA8B0AC0EF71B73D009D30531DE9FDE90D86BF5F20D8E5A9E324E657A98F8C0031ADAC4385157BA4E28B48AED957A5B36C3B49057F8ECA7F56808F794014DAD170601070607010E004F42D01CC63B2A1761126BA045F1165E25FDD05901FAC6B76E777FAAAEE6F5ED94302E2DA28046B4BC60228E1B9E194F364E377F84681B3011583554B76FBF8D7456DBDEA665ADAD6AA0556C8CC714F217A518A98615C4C1CFC8ADBBD4D12C5BC23AD7A0F849E32FE2005334B55D7BCB43D1C95D4793E7C3882740CDE8DD24B367294496A3E2F3251A66CDAECE9E0A73D853F8D4E3A4637836DED68CB28BA4FCAB02D61FB5CFA581792E636217F3238D78912EA0863816FFB2F388823174B19433C2B14BAB69E12C3B791FE683744D4519455A52555AF0D7E12749F6094AFDBA00FC6A609C7578C531FC4C3C3065EBF78414F112014726EC2230F9BCD9C15E36283144CCBE0D1785B65CF49BA8FEFE92EB6907C0330BC98AC172EA9E8DD4DF8974DD6B6772BBC6CA8E8562C5EC0B6592DE7440AC915C35E0AC8087F22EBA110CA3037B469B1D5BC92636D81881E38D8BBED01A29B3EBCF0C19EB95BF999EB848022592AEAAB649CE19824ED9D3A32D75FBA556EE07606A306D1FCEC2E24B38274C361B7BC96CE37B7F4FE434EBA17AC2A097051A92E4EC32E4C678F7762E8B96EBFD2600C0F224B04B2CD7E9F4AD327D53603828015E9CF45969800F02FA5E0BA26B8C844BA1FDFFDE44303AD0389C1B31D582877CA6BFAD4973BA35FBB90ECDD95F430078BC39AA89434130A5FB8321E51F9624090D0277A9F112EE8FF65D3DBA999C7C08727D0F08DCF00CE22F62C955D6A822F247C8065AB94AC442E1CB5F31254816794CC2556891A523B8AEF09D3B9E07AA8B67B3B87567ADEBDBDFB93BA9A082F72052572C97E73AF16CFC42D2A51A3683F84748A338AAB56264753BA4083D356A27C71F47221ED8340C50AFD46CD207C4F9634AB5A44888A4234770C46232C35EFF83FA950B0A6879137DCE209D5A1F26809B411F046F51FF084F15BFE03292EE845D3044235ADBC299925235462E67F803DAA1426F0E116B93F4532DD2784F7F87AE360281CE21F70D230C242E1A98DE8FE1D6147AD71EDEC89E24A5980C45FD91E23516758AF71DF8E0DD96929D4DA61A3BAEABB96C9378986DEB4C9101175E3AF1E102B52A8DA27D916EE4A28263CA485CFE87EE5436249C1A2F933669F6E3274E9BD93092F4A798AE85D6592EBB54DC65C28BA08582E275972B0A12C22A7792CCFD4A398E504C6FB2CF5EF1F9C268540B4FD7D07D59C49A559D86A56A009C4C18A3FCECA109FC7A45C6E842ABC22053E84878C4805D96AC96BA00FA40FC3B50407141105845055447CA94BD27F234183C2B8BF37F5CD249ED0705AFAEAE59C8BE8F6B38069D67FB23F74284E8185C176B58B482900A3E09774383C7ECACF4FE5E580DF99DB102AD4018DB73C73A635D3FCDC833B000C948D846AACC92ED54FFB3ACAE1BFE205D6B2312658F15DECFA085D13BC3757C754C5704D8089563E0CCF52B04A49DF293CAFBBC2FED5D9551B5A3897EC7BEAA56A4034BEDCEB4840A9BDFBB8BF47D66DD3A4E3EB1666372C6B2C39A48D52761BD36403CB130A087685E2EABB8711C11005EA09F90AC49665415C56CAB6FD2719C45B6800DF914F8FF327EED29D9B9A5BBD6B80B8BB31AD1522803B2C8D89166D5C6B2ED47BC5BBBC4ABE6709D46B856AB81DDF15F098A9AB76A8257E7E5C2E7DAE53FBD691736F0D6BAFE0BB939172614E99C7D7E37754AF6C3C637D076A43DBD70E5EAE910C8170CECFF1621E382D2977635B67F4FAC555419F8A0BB76CCAEAEF4C7385D293C9595AE10E5201C4A31B4C3ECB9F3B304EFB1886F9C58A4EF04E73341B95D9BDB85D706B2A8D3FDD153743A8BB7B3289D0FE79F6A3B9E0FE160DD6700FD64FC87D9AC96858A6D395FEF6F3D2193EBAE7C3A92E18746A7F12B244FBC5B1DF0086CC7045036519D9D7BF8E92B850EA0D3D1E775DEA362362462DEA2D3501D39203E2879070D1F7AC92FA1576F6D12886D5B979E3C788C09A769EF4EE45E14CD8E7553EBEEFCD31FF3D43D4988DB08F6630BA8AE8C7250AC42A3D78EDB967D59310A4A224567D8797C42370CBD2302A3F49ABEAF85FAD9455F98B61EF2B5E34A5C552583872145E191BBFFCAA526F5E38E497A1A1E1220A0F283A935ECD366A9069D5A2A80BABA3A22FA85A2557DB72D7E29EB4E33E8ED8BB4EC2EC7C2E9CEDEF46EA955834ACF8C9AB23B78052446FD73C9D61683D7FA0088DB97D07CC350AF0B6B2AD7E66A493AF814C11F8C0F2FDF0DF40AAFD0D218C00319C367E98D7F10C74EA06D31276F3F216E1CB2F12033915008CC83B00AC60FC9C2FB7F97D6E8CD79650D0F9D82BFD9CAFEF668021D3D165F3FE84221998BC8C29AEA0B5B7E0F1F25A0D7447E806CC3FC39E6038BE3DF9AC01F46222D3A609F8A026744AB4F58A734E3782BEC301EA91F2D8E2242D04A11E82474002143223F29656B1A7675AA5AD181004C4F1381DF6A0F95A0186E82C04B4DE881209E9CCCA3EE5B1DEF0B02353738D92A07314403A1A2721C256121FBA8B8CE9B460 -pk = B721D737B1C48095B3F8C6660A8B41E08000CA3CC91A5EDC816DEDA7590F939B7D5C1A2A36A0D768E4602C0782F304004A0AC2702B1F2E5523B98A386EF21C00BF4B1905BB968374A6D650E8800D50CC01B36A372F5CB3034A86D1C66F259A903ABDC52593B68F44CA96ADAE17E4A82127C07A8DCB9FA714934232A15E970300 -sk = B721D737B1C48095B3F8C6660A8B41E08000CA3CC91A5EDC816DEDA7590F939B7D5C1A2A36A0D768E4602C0782F304004A0AC2702B1F2E5523B98A386EF21C00BF4B1905BB968374A6D650E8800D50CC01B36A372F5CB3034A86D1C66F259A903ABDC52593B68F44CA96ADAE17E4A82127C07A8DCB9FA714934232A15E970300020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008EE464187A0F22D556CE360E498B98EC95F051B08B61BB55F17A325293F1BB3355A26EBA15FAAE165D26C54C40A43507671281EC66C401419FD6121771F5E01FF35C0089DC0C1ECC109B8B7D77CCA7B348A42BDF75271D6E291B000000000000005D80B6805BDC7BACC664AAC5A18145D2CFE8F1DE47880B546559AB7A9F14D38750CD3905ABEA71E74592470226DB58B00A53C6C0CA3D1D4892F5FD55A43C6A388995332C9E2E1DC135DDB8BEB12BB42D1C648BA68D02B02635FAFFFFFFFFFFFFFF4303A0DE7B4F23FCC60D25A5A73AAFBB654AC91A0E5A5D0C0F6CD6A14A079951AA93DEB37CBA1CFEB0F7F079B189BA7E526F1D0F475BCC44198FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF424B8B6A9890B5B2D9759340207C9F0870296A7DF3E6C2BE3772B0BA3894EEBF1DD1FF1A1CFA45BF8B49F231A1C4ABBACA07D454E4C6CEDC9B51020000000000000000000000000000000000000000000000000000000000000000000000000000B3BD1B71792DA40022BB89DD8805374C399C26414007AAA4D03A73191CF50AE8990BA7029D3A084B49ED818B61518BB04B743B8D189BF759DB2068E40C6D06005D291E815B5D25ECB60F7277A5B806AB369445CBA05EACD2705D3B6DE5C98C2E83E8E9EED534E790AC82D885BB9440048CD23B690E74493D8E1CA6E1CE1D0800FD8D75FCC3CEA9EBFCD088882562EB6062575734D18B34744A20D46B31E7695C5E4851188AD69A52B435A60F07017EFADD0FD021EB9BFD25D634149C7DAC11003B23266AE963C89567F82EE2737717D617B4453D72003A25A3CEF0B05A23F442FADEED5621CCB39ABCF9EEB828951CE9E506CB127FA2524ECE6A4C228B21170052A015F5E743673DDDCF6373B3B109AC2C87766E29CF56098D4A1C5C1725845186FD75FC35EB71B740C77753754BA31F21B22BA38EE595F215239A9A165F1400E41DBC7DF839AA0EC24FF7501B511C8618C739F815A880E667BFCAB6F8467C348C328966E680CC3AF7C18AE4AD0EF0AA344F2530BABD5F88C881DA4CA4791700111E10003F8D91265A50CEB314C2FAE30C520A69E7BD5FA71A1EDC44A7892A98847F9C4D78405631269DC35C4EAB32DE820B8728C6806826DD969497FFB91E008031EAF2B919B4CE21C293B4233F2370ABE1E046AE6995C1C09955B445483CCC4FD53E1DD25EBC7928769157392130A00DE0EA8F68AB8123A471430712D72000BFF4B28D05189A385602FA746556A924C7F7602FD0CC5C5BDBAE480D9277733EA5F083A2A1066E6F3552B5F2ECCACCF15FE94660360EC10B320D41E968B61600FA9F0E4EBC02CD348831D177685691F47C24504175C3B60A040C1642AD12B3E482751F0A27796B8C32BA224AF0FA1F65139A8DF9731F766C50810D8EB50625003979CA61BF25CC87424D29BA53ADBF5754E5F6C62A283D834B9A9C3DC68F22467B62B06BBC64535B8ED4A52F907C86EEBC40D53311B4F196F8C6BDC603B61E002BC03C1CBD2F2341AF3D1693BEFADAD8DE2DD047F9F8BF232928B814310FACF55E77BB8ABFB6FCEFB14BDF30B339E0698D83AE79F6D592F3B8DBE3C9D96E0A00859E36B4EAA99D23F03371A8C24C91ED0A6FD769319897F8EA2131D2EBE2B8EC5AFA75CDC87BC8D6E98199418E323FC67FFA8F7EBAB9865878F68C2D150D04002EB0892A4BCF069CA5F90182ABF97773496871252B28C810CBB0469055BCE8CC1FDA34B8C154123E3A2F70425A0CC87DFD508D6B327A81A7A9AC225E0B471A00 -smlen = 3602 -sm = 1E88477206532D422211B7C593D3A0A48EF60097A3AEA6E6DBC8FC0FD2E35A5BB7DCC9C255000D52EDCB244CF018B5326982CB3562B253070017914431CE622B4A0295AABE8AE964091566017E0DC597BA70ECB5DCCF427FF9BB494CFEAA0066847C938E5BDECB26734178FC0A567B017700AD54120343D2049FD162D0948147B60C9524012698CA65264248036B09E786863E08DBA43501F570517EAA524F2D4A6AFAB1225A7500A07A01D5EF6E3F744D5529289DB758083725E816A50026946DD59E549E17B26FFD7059C36CD511D00054F52BCE0C5D2A61E1AE3047EB034BD1A4B001F22967DDBF18F543FF3827261A4850D4779901836D6F9C3D83C51648F3AC12C1842F7B18BF010141C7FE867E37937897D26C3B83318201CCA04E287604FBD27ABE4AD85C2CF0CB050248D814FE9B1978C1CA48CE97712A9A1B78A800E009E92D4E594C731BC642220CEC0200769683FE7BFD74B3ACD21AF3898B74CA73DD126C8315538937CAC4EF0AD4588765A26DCCE1C90C559CE691E7EB3E0A497D357E1AB583C761439C0A66D1164518F01B6894067925753CC2866A91552FCD0EF029C2284C620CAF364DE6C56EB41EE0E4431D9BE22B76451D132A3F9AD91A53449BE820A7ACF56F6ADBC7107C7C729EC8A64FFF6A24B4CF83FF4E945DEF336DBFEA6067FCCBD1CD6B5698ADB1AD6DF03FD0A553457B8E9FEB4A1243FEEFC2DF7F66AE3ECA5BF169F7891ADAEA8D5C59012C7AA00A5A86B0A33D0006F8AD5A01C60ABBDA6D249D3FAC7EBFB85103A3A747A45D0ADB7DEF52ED3A5F1A620EE383A9C0CCE1900E413FC74A7A97646111D54783928B15BCA783D01EFC67F49CE6F781E82D25D3F30561F507E3831CB4EA5B4A08D5489830017270B63D8298BEEBF48EB56BDA5685D5E1E06404EB9A6C3790E9B29C99168B10BADF8FDB03F3C568672773EEC96428149CA272EA5A8083F8208BDCE361E7D40BC4DA75029D4A18B0B6AD615DBF849935D4755CFFD270A52FA290811CD55BDCA38ED89F0066ADB9BA7F58366379FFE1CAF3A9127E147C3AF3DC27279391E0C09537E81E20E7B9FE4FE3DA970FE50BFC96555233CC9E61D3C356AAA8EED5A8AEA2327D7036EE03E7EE40AA35E9DA4544B121514C261EC1CB0B2D75B1D5CE129E47F89825F69BA8254163179FC1331A917AE9C5A18556A10C5F983871B1258CB6FC8AD207F97A220C5598860B6C56F1EFF09DE6000241E901A89E107FEEC15833D34D6EB12DB6B188FAA0B858A5B9E32F84F783B43B6F8A3B2E4B044CFF8902E1EB0C527BB4E29C92ACC9DC7E0D9AC6B3A021415768B21DD9695983EE89C871C0EADE0BCE4FB72E682DFB5A2BB7498BF4D2C01240F67D1B62BAA4E587069C16E3032114B14A1C4288FEBAEBB4C75C3C05924A358C4BB7DF95ECF81D67147FAE3F605EDE61B7BA164EBA1AB36ECE97DB0ECB32A673E899B24557D8987AF3ADC57A9DA609914C9B2D6D8AC58E5954E0DB5AA9E75B444700B8F704E15A6A7BBA81809FA8801C6CEB5747A44CEB8F99CFE6D8A2A03C03451E5F3D392725207F3DD28B2C00004425B7AE05FA3769183AB60857B27AB08BCC4321D293C93D1D850D4E7A81B14564D7B15AC0E3BC1BFE0561622C6AA06923EEFE163629EDE8BA1732DBFCAD52D3BAA6E11E569EA790B36A8472B2CA37BD5C0EDD37D8F164B874952D00D592FB705C6B3110A12B03829C157191D33C579593E7828CDA5C24A284BA2F5A42F0BFA601A8F6D3DB1CA6D703ECBD261629C9F96EBC0458737B9951219E5B1F86192E2A85B47D80610A0ACC8B1A70DB2916F89CDB2C7F8943471DDBABD2A3536C5DC8A73CDEDDEAAEDC86FA148D2EE479F8465558852FCBEA0DD8017F1B976281A5014319C2C3CACCBF571D9550215B24134F6DAEF32716802E7945CB3F97AFC1AB1DA17D0C41B545A750EF345A6F88AD5FF52D512AFA6558335B5EB8979D8E6DC1DA562BB997E7D152D9FA3EAA09119C3474E11218230D8A56C19AD87FDE483FBD6DDDE9ACBA813BEBC8505A323C601E5B5251650DAE9334562E3DCC38A28BD7DED6942D0CC2014235C1B66CF4A57BA3010B83CC7050309F57A27207512D195D070DB3D10FFCBACDB47E4231142BAE588F92C5B0A71ABD67CA9390C2E05FD2CF7A1FABB14C5A7AE3773C66DB1F055214479E388B5E6ABF0DF8FD1B0E4F90828ACC397643CBC274143FB4331262A20634877BE4C7489C1AE9EAF90BB2A177A6B5AC15CBDA27DA0616E5F87461554F5686A7BD6D047AD0B98C8CDEA3DB78DD2970C78FB861F2A92DDC277876791C4A30F525659557831F4377065D19ACB384CC68340152A6DE6D84CDB58F433923D1FB8CC6B10BACD95B9AB1B45563998620D192032269FA8301C09A29C4B5B20CA0A3D63A4F5984B7DB0F5B17417DC7B939B9B177BF423E2F3D57DFF296E6E4FF0FB1744B13731206EAD54EF0AA1DA09BEA8B0AC0EF71B73D009D30531DE9FDE90D86BF5F20D8E5A9E324E657A98F8C0031ADAC4385157BA4E28B48AED957A5B36C3B49057F8ECA7F56808F794014DAD170601070607010E004F42D01CC63B2A1761126BA045F1165E25FDD05901FAC6B76E777FAAAEE6F5ED94302E2DA28046B4BC60228E1B9E194F364E377F84681B3011583554B76FBF8D7456DBDEA665ADAD6AA0556C8CC714F217A518A98615C4C1CFC8ADBBD4D12C5BC23AD7A0F849E32FE2005334B55D7BCB43D1C95D4793E7C3882740CDE8DD24B367294496A3E2F3251A66CDAECE9E0A73D853F8D4E3A4637836DED68CB28BA4FCAB02D61FB5CFA581792E636217F3238D78912EA0863816FFB2F388823174B19433C2B14BAB69E12C3B791FE683744D4519455A52555AF0D7E12749F6094AFDBA00FC6A609C7578C531FC4C3C3065EBF78414F112014726EC2230F9BCD9C15E36283144CCBE0D1785B65CF49BA8FEFE92EB6907C0330BC98AC172EA9E8DD4DF8974DD6B6772BBC6CA8E8562C5EC0B6592DE7440AC915C35E0AC8087F22EBA110CA3037B469B1D5BC92636D81881E38D8BBED01A29B3EBCF0C19EB95BF999EB848022592AEAAB649CE19824ED9D3A32D75FBA556EE07606A306D1FCEC2E24B38274C361B7BC96CE37B7F4FE434EBA17AC2A097051A92E4EC32E4C678F7762E8B96EBFD2600C0F224B04B2CD7E9F4AD327D53603828015E9CF45969800F02FA5E0BA26B8C844BA1FDFFDE44303AD0389C1B31D582877CA6BFAD4973BA35FBB90ECDD95F430078BC39AA89434130A5FB8321E51F9624090D0277A9F112EE8FF65D3DBA999C7C08727D0F08DCF00CE22F62C955D6A822F247C8065AB94AC442E1CB5F31254816794CC2556891A523B8AEF09D3B9E07AA8B67B3B87567ADEBDBDFB93BA9A082F72052572C97E73AF16CFC42D2A51A3683F84748A338AAB56264753BA4083D356A27C71F47221ED8340C50AFD46CD207C4F9634AB5A44888A4234770C46232C35EFF83FA950B0A6879137DCE209D5A1F26809B411F046F51FF084F15BFE03292EE845D3044235ADBC299925235462E67F803DAA1426F0E116B93F4532DD2784F7F87AE360281CE21F70D230C242E1A98DE8FE1D6147AD71EDEC89E24A5980C45FD91E23516758AF71DF8E0DD96929D4DA61A3BAEABB96C9378986DEB4C9101175E3AF1E102B52A8DA27D916EE4A28263CA485CFE87EE5436249C1A2F933669F6E3274E9BD93092F4A798AE85D6592EBB54DC65C28BA08582E275972B0A12C22A7792CCFD4A398E504C6FB2CF5EF1F9C268540B4FD7D07D59C49A559D86A56A009C4C18A3FCECA109FC7A45C6E842ABC22053E84878C4805D96AC96BA00FA40FC3B50407141105845055447CA94BD27F234183C2B8BF37F5CD249ED0705AFAEAE59C8BE8F6B38069D67FB23F74284E8185C176B58B482900A3E09774383C7ECACF4FE5E580DF99DB102AD4018DB73C73A635D3FCDC833B000C948D846AACC92ED54FFB3ACAE1BFE205D6B2312658F15DECFA085D13BC3757C754C5704D8089563E0CCF52B04A49DF293CAFBBC2FED5D9551B5A3897EC7BEAA56A4034BEDCEB4840A9BDFBB8BF47D66DD3A4E3EB1666372C6B2C39A48D52761BD36403CB130A087685E2EABB8711C11005EA09F90AC49665415C56CAB6FD2719C45B6800DF914F8FF327EED29D9B9A5BBD6B80B8BB31AD1522803B2C8D89166D5C6B2ED47BC5BBBC4ABE6709D46B856AB81DDF15F098A9AB76A8257E7E5C2E7DAE53FBD691736F0D6BAFE0BB939172614E99C7D7E37754AF6C3C637D076A43DBD70E5EAE910C8170CECFF1621E382D2977635B67F4FAC555419F8A0BB76CCAEAEF4C7385D293C9595AE10E5201C4A31B4C3ECB9F3B304EFB1886F9C58A4EF04E73341B95D9BDB85D706B2A8D3FDD153743A8BB7B3289D0FE79F6A3B9E0FE160DD6700FD64FC87D9AC96858A6D395FEF6F3D2193EBAE7C3A92E18746A7F12B244FBC5B1DF0086CC7045036519D9D7BF8E92B850EA0D3D1E775DEA362362462DEA2D3501D39203E2879070D1F7AC92FA1576F6D12886D5B979E3C788C09A769EF4EE45E14CD8E7553EBEEFCD31FF3D43D4988DB08F6630BA8AE8C7250AC42A3D78EDB967D59310A4A224567D8797C42370CBD2302A3F49ABEAF85FAD9455F98B61EF2B5E34A5C552583872145E191BBFFCAA526F5E38E497A1A1E1220A0F283A935ECD366A9069D5A2A80BABA3A22FA85A2557DB72D7E29EB4E33E8ED8BB4EC2EC7C2E9CEDEF46EA955834ACF8C9AB23B78052446FD73C9D61683D7FA0088DB97D07CC350AF0B6B2AD7E66A493AF814C11F8C0F2FDF0DF40AAFD0D218C00319C367E98D7F10C74EA06D31276F3F216E1CB2F12033915008CC83B00AC60FC9C2FB7F97D6E8CD79650D0F9D82BFD9CAFEF668021D3D165F3FE84221998BC8C29AEA0B5B7E0F1F25A0D7447E806CC3FC39E6038BE3DF9AC01F46222D3A609F8A026744AB4F58A734E3782BEC301EA91F2D8E2242D04A11E82474002143223F29656B1A7675AA5AD181004C4F1381DF6A0F95A0186E82C04B4DE881209E9CCCA3EE5B1DEF0B02353738D92A07314403A1A2721C256121FBA8B8CE9B460 - -count = 99 -seed = CB2E6226615393FC3BD4AB3A412AAA030AAD40E8648EE6B56D2C1591D8B97915D88F2D22F7221377B4B04CF2AE9ECC4E -mlen = 3300 -msg = D21A6BB3A2356805E678673C45FB055FC5266E3F692AF9935AEA307F14A5C41B979966A5DFE42EBFED1487E4822B74AB5AF28995E085EC8007ECA4977C63EE5299FEC63DCCBC42EEACAB488E574249E9D856146750AD97C8A443485EC1C5820BEB0964640010F6407140791E74684DBB91052E2D8BEF7BDCD78B2EC03C97A53295D683BDBE32A70DC19A2F75B8613AEA9616AE0E280179492820F73FB7FA4121E673FB5C328F41B67FF8FFA7AEE6564ADABA046D6E1D6AA13FB24965390F829246DFA8763851405075F76CF94C66FFC3308214DF0960C649AAEDC22926CE9357D3875F8B71D68D75999AA3663C30A9EDF07228BF7DFF49EC1E6C7A33D2053597003B82392E826EBD701B4C981AAAC9951C79E08F592C2C0637C8E5A7F9DCDA599E859C317D4888B4098992E0E2D979E41C703686D577E5BA6001EC4F587140711293D664963632F87EA0461E0E0C5E9D8D292FB409F9F9AB172EE17FC8AFABAD06E42B437CE22924EB5DBD3A80A06962F3B37946259F9C75A233CB2B4ABDC5CD1B648FAEB1BE8630DB40D151B8FBA693DF2C5BDCAA14DC4783F450B6BC407515CEEBC5C9A47BD1A141384F0B596CAB1135C075651CBA989C190F3171DC1D72330EDAA01656813C4B7811715060B023FC426745C301B2A91E0D08ED3BDED438C4CE6799C35F3981C882A0BDE4A2FEEB1A52CAFA47B0C48558FC43F98FE08F03A71128362BB6FB9DA6A22249F4D4352AE7D3DAE85DE497E2411EADCFE5BF1A3C075C45811E0097ECEA255FE15BD8321FE8B546A8CACFB899EECF5419DB363C7567C2FE7360B36DE14674F500A31D3EEC71451A7C0D5576A8939C0F6D4D9F2F03F3C516CE25CE73ABB35C73AA94F6AEFAE6AD87052D6B195FA43586817F5BB974AAE7F1B8608922411AA5B0D7D574016CBD3DED13395623470A108FA0E1D3F9FAA7E1E5031843F2A23DBCE8B196315290DEA5795E4115D53DC570A444064CFA3C9457DBF3EE323B1966ECD2270C32910F8F430522471258A1F1955A6E1DD8C84ED9A566499BF85628615351ABE84B401421DA2CFAF575E2644C9304C075ECFC374066CEC713FA4C0D89043689FBC59FF54B8F97EE0A3B0989BC5E4EF83CC9833E75BC8B67BB5EE3C06EA156611CDA95A6702416807530EA206ED89835D20805EA988B1958569CDF7F809996214DADAB4E20BD44917E3410EC6BEAC98FEA07F764E85B66AED5E17CF675D2ED8E63DB728FE75158CB31779E31379648B43D68CCFF3780854CF03535C57122019456E73CF06769BF1FBF558542241CE665BD10F921828553585E0CF664CDC6160F9C47FA5330591B74194F4716056CA83993EFEC4A52DB9A1FBD3B2F504AC19667325167407375B6D7DE739F07947B511C8D475744E5C29D6E286A37F1FF8317BD0178F0E306A38FA6E75F4A80427FEB2C91235D3E7F20D8101CFC03BB73F44EF59AF3526E9AFC580027A1DADE37654238B8EC7AF0105248FE30784A88B72E11FC1BD807E47A349BD29075BEFBB29730EF8E85E3ABD5105559BACEE74AA27D90D360A8D629DBEC95EB34C7F7CA20096FF7B521E40D3944A975436896F372EEAB6B8615EB91697965BBF955779DD3047F7E3BF029E3509A5780247445D6223D085AFB4291D976EFADC41E42DC2C0728D18F6155654A332FEC72EB6AEF8B92C1D177E3DC28C31971BCAFF76DDEBFD9588BC244B116D409E58DC5ADA1648663D603C47FAEB814AAA7EB9B6264356F926C18B9357BF426B89DDC8EB9177ECEB5C6CDC64DD8FEB7B326BC1BA89BD9035235DA0E644EF959C58DD97B88D5C749B36931AC2694C67151DB0894652E99254222D37CEFE9E27B3DD663A152DBE29A3639AFE42F4578937076180563AAD6AD739255EA012A17D2A56627D84C44FBAB261D392A966CFE19278799CF1634D42384323C496190D4B9FB662694E3887EA66AB9E8B195488C8DCA47C8BC0424247759137CFBF86DEDC3641904CB6FACBB30A9FA84ACF69A67B4AFDF4C2AA420FC0D90CEFA0DFBBCD3072D9F772FD6058E2BF0E251BE93B00DC43765B53DB51B22F12D3ED0CC5655E4AEBD9D923F99A43E4461DCF5992030E66A1CDC3A65558D9BB3A39788D92328387D144850DD3706FD7A079E3D2398F542F91A8AAABF0C5068DBAF1FCC5160398ABECF74884BEB04F3A3EA38BBB80D798F5981B3F2DB6C7B33F867B7DC06A4417E30F94CDB4F523AEEA0BE12BD75AAED57520DB0D4B4F013BE3A1DC7AE5C58FD1DE9637F7D82F697B7E92DA427A78FEEC6A5C0255EB57A43DEA6CEBC8805BC04E04FE789E222B1E2642D26EDC14FB36ECC6092B3060E45EED6C5B35DE8741F72933930ECBD7338CF39474122357365700CB50C5EB176FB92814FA7F4032570CCEE6B859236AD5DA5F1730129EDC7BE218BA9874620F6F0EBC45E0BD622F8FD1AE6974994AF95C6519EC1C46650C073D194FA6EBC62F405F63A3416782A47872C7D77D648D0A1C802FFDFDE5FDC112C94CFC68F401889EFC522FE488FDB5384C0D93147AB6587659D936F98ECFBCDCFBF8B352D605F18C855E2559743ED97991C5D50DF44A7B929303835654A3955ABC5BEE6327400A7CCCE460B318D8B5ECE5B12F606ADB3D7B5ED59563B8E675E78029AABC234442C2463256FE02B04F556DA35C4615D14A9F4EFF17DB0DB81DE4BDD894F6628A120BE2D4CF3E1F46D53817899657035A76137E23C0B0E8DDD29465D7F15628FD435E6CAACA4194FDBF85FDCC31D5DAFCB52568B7C0CFBE713BC85FA424BA3ABE149E4035FC86807A8B876D2163B447CAD5EC0E6EF38A1D591AFB46267F9DBF142CAB1CAC1F73BEBA212992FC6D4647EC17848D1ADBB1901277A5078DD72D9C9184E893C0806E9B4AFF0A824670D438620F2A7E8D2965B619D291E5824C014FC888A36FBBE17356431F0039038F9B497902AED969F9C488390B7087763638E976801127BAF1F53803C4DC9649F0EE85D67B239E2BDAFB2BD75F1D1DA22A56FB3AF10A9DDE7AD306C4AF8681029316C0E1949228E6BF5ADF942F1C0EF92B2BCBC0C70D49E5808851444240A78B14D21B54F66271482F49B85F5180B268050327368496CFA8B54ECB97EE6D28EB74A3742F68583DA046809002C22F7B31FBC0566969F9A15CDCA892C4BEB101A2AC3526C76E9D30982C9B4893450FDEC4001D2431828D24D8B1A67DF80E2E10ED2EA8D723227055C48006665F7DA8E032EFDC70BC7EEB2B369B551FAC542AD6DF1A23107E2B3C0E3CCACC25F26404C085CBF56E52D35D7948DB9FDA6DFC24709994719D8CED41A2CC9B3C4B2BEF0967CB71861CF0E6AEA9BEC9395726AA0E2F1A7247ED0F6038E3DF4BF566786073590DCF97F8F0A99658D8F630A2D130C46CF4D26C669360D0F70B75F904C9F923AB285D5DB129F6C25AD21F9E26AC844D07A8EED86C4E224EBFC5B3F720D6F94B0A01B1433C46B40CF84E80F7A6AFA7BB8F9ACF818AD3CAB2DDD6904C067BEA4F1FE79B83CB0AA8FC75B6B096BAD6FE94ABFD48F8EFC0F2B9A02EBDA8FDBDBE1C77F1854EDBA18AAE7F31CED9CD34C1B355108DF18A8953932F7554AF05B203A96A9BB93E0EFF51D7F93B56E351562CF85A2D35EAE2C2427B89A8662A1C723D4F14E6EAFDBD636C2BB7ADE29C1A6BC8A463734C808BEC68B1E9A31AF6E29B412F1CB8C90A9911AC5C3EA71E46113D2D7B1AE2D8802B06A770FD0E9E4652895E42181AD09BB541E9493F258711BB7BEDD3E7CA8B8CE875669CF80A6880ECA3F13800DE7011EA67F443E505C4FB455608AE586F922B3C83FD33B306BDEDB86223C33E3AA65EDC93CBCF3A03ADAF9F328997951D59A9200C0BA2618E3596AF176B43122CEDC52B1E006EA6D12DC236A6FCD7CC46825F2EF7ED71683A731D746FFF2FE54E0B392A8CBFA38873196BB2B835DCA7CB7C3ED9A004C7A329B9734A111744BDACDB669E69E9DF1E52F07C513E3752A0CCD81D7DDC4A64868B7BB2BBBD2095373480522BE10615248A179DCB61DAC90F7FA5FA9B84F190A9C62B5FF9CD473A940F03E7107157D7EB60AF1E3E384FFE8A67DCB2389B3B0FAB7C789CF100CA95CD6A85442CB9A2C243FB9D454B20BAE5762D72B8FE79B4DF81163D61DE4578CF976992D8B9989FC68089F811F53DB1E1092B60220552876B818BEA981571898CD6AB7B5F13C46B0A076526E3241D65014F855EFD7BDE08AD91F259DCB64E94EC3DAD97811EB024EE1D341521DC92AE5E93C73422088976F2D27D64E1D193B955E6736AD2BCCF3C1A53D590576434ACBC0B687F27F255FEF354E68ACA47160EFA7126F908E08E4548C11546D9C412D685FA84D2EB4DCB2BDFC48E2FA8023548198EBB072A48044F4391143E3BEF4FF9066A4B0D03ADC826819D67588BA84F99DA27424103652ACC039DDD3B567851CD78E4117A8B93AFE01FC8EEBDAA1ACB8BA9D095789E76B9D5AB9EE177A15D666EF171FE1D4BDCCFE2E58CE669B561F63028C6CE26DB5C8182FE048680B175C7AB407215FF3A7801C950D509867AB1B0BEF89B3E38A387915225EDE76F91AAD15A85D8C46EFD588BB3BAACBC52C036211512473420F3F061F5F53E9353DE0780425745A76439B3811511C86CA503251F24113384E1A24A9367536E796CE08B896F572489A2339E82A856C -pk = FCA268539F249F769BDB0E95EE3FEDA564B5EE88725A9B6D4E7DE533DF81B91CB00ADCDBC8F4838DBBCD20BD2109D5B585E9FFECFD06A8121C335757ABA71100FE2EF5CFC439C71C10F0749AF0377ABF051DB0E2300B94CB6E92156D1B4BFE5FEE11BE1CCB9D3874B61FCBF7BDD55809C59A4DF4E461F6B2D96D17FF35970100 -sk = FCA268539F249F769BDB0E95EE3FEDA564B5EE88725A9B6D4E7DE533DF81B91CB00ADCDBC8F4838DBBCD20BD2109D5B585E9FFECFD06A8121C335757ABA71100FE2EF5CFC439C71C10F0749AF0377ABF051DB0E2300B94CB6E92156D1B4BFE5FEE11BE1CCB9D3874B61FCBF7BDD55809C59A4DF4E461F6B2D96D17FF359701000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000053F959951406B4FEA998B6B6386C4E3570CD5DA21286C9FD72516F624E5B7301B69432922B50157D0311B866B20113D330599B30033322BD06C912214F21D920AC3D605C036E6CA17BFD41BA61DAF55BC732B0DEAA118BAF9D0500000000000000CE67687F5CEDBD0F3598C9379F5989569CF9AD728F42118226118AEE7AFE3E05CBE76CC90967FA8278C0E0B5B69AA44DA73256427B66691B8191B85866BBE3B9FE3FF887EE990D4BFF6C57CE268289AF8A26A12D25032122BCEEFFFFFFFFFFFFFF463AAB47A87A8714AFED8F28057DC9FA043452F87A70C033D4FC4BB244C669A264FBFD1C7EE062129ED7A3D135A1A4FEE7294E0DCD5ED3101C9BFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43C5343A94CE6C6219A1AB37EBB98A93055A0D3288E5ED59DC2C215E491724985C6E1D6B9312FE7BEC65A0CB3404F56EC544B8D460075AC2BE85030000000000000000000000000000000000000000000000000000000000000000000000000000B04B688774EF73289B4AAFD9DC3E71680A395DB6B6E6FA015FAB6994D67E54EB1CD747779BD1C149A25A492FBDEAD4CFE535DF4644F7AE0983BA8BC094422400D6D28E2585EDDED041C1C85ED9C37E632884B3FFFE472219E6F4D3F10D14D7B5A107A5951BA795D779FA2332997CBF6B3773D172146A872A07D09E75ED080E006AE2152803206F1F2C94F36D1FC3A64423C28FF2A0A65426A38465DEDC44592B4FAB77C295BFEF9AFA5554D113C50531A5A18618DC189EB0BC55C357B60C0400EA4C0A8C3C1C0C71E76D3231DCC0B9EB56DD287229B4E7400AADC83694F34831DC9425884F0156F8E21289E4ACF67E6FB372F6BC01F20F6BA60024C3FF090500BBC0F6ECDDC33A3CEE64DF90331AE73CCDB9599192BA29A67B36772C12A0BAE3BB7001010E6B03008386EA6B8B9E35EE47F671638EF23313D9703903A127220012C1908EAA3507B63F2F72E801994B654BEEC6BE78B5B0697EC0C7B37CD3EAE776F733F7E446B9359E5E0A57C75608CDA54136ED0E1072AB639AA66874980600DBD49CAC09CF1D246FAE3FCF431F1CC8CDCD8AF758E4AA0607CF914A4E5C6E60B492A25CE7A3CDFFB05368EC003026234A438C038C1DDFB3403BF17AA4570A0045D22749EE34170BD17558D41318B2D4BD07D28CF892E87FBEEE36CAB2278C28FDDBA3398B2459649EF42441B57CC625BCCBD4420EA1AAEB5C20250610201A009F1AC8E80190A745E1A3C570E2BC3296E213E38E5CF30CFFC4A1E85B30D461503116195F32534AA60FB5D3702D42AE98CC13C60D6EE411E0D1F792244A07250031F41C077C1C44E15375835BC71D377036170B6070C59BB3B14C39813D55D08DB3211FC5B1981399EB0E45FF791B1FE3E148F8690A79E0F3EB41FB0AF0EC1E00A4E82ED0B7C8D4664E700BAE87E488C0377AAA68474BC89B89056E01B9EC0C733C68FF78C4092931D519C20C280BB3BE38971934E6B84A0D4935C2DF0EDB1300F98DB78DBC739FF2CFA9A48E469C80B7D3736E684DE09005933AC8445E90E3E240E0FE406714E9FA3A1C0FFCB557C1CF99FBABC9271A72730E4340B80CEC0100A118A60E71889A2CD2E75402D37C4D664498277068364DB5B4C811A335001750D8D5575DCA9E3690255F84B8FDFD507575A860BC1D6C3A88E47B9E5590A81C006F44269D7EF217BDFCD3491B5D435EE5534A007E62440909F9B64CAB3ED25472111D3F91CF80B528FFA54C759FB95847641AEAA656FC1E458E2AD0BF66170300 -smlen = 3635 -sm = 192142CDB062BEEEED496201493566231B7F00839973A4DBE60BC5073A65A2598B97F029B6007A8A2BB331786B55E704F000E8941F1B5B570187FBE8BCEC15E06D47B7338262A25BBC0FBB009CBD005FEFD919B83F04D17DFFF36F6EAEE8016550EF2B9561133A971316CD679535CE3F060193649DBDF18C004B4AD09D5F93B137FC7466001BE57D22663993954584359F3BC7E6E4E710003BD4E1FC7A7A29F0E9FD941A9670DAD5F0C901C0B14B3B507789F7959A641997A655C25A5C013E35DB7D26CCB6C6C7C55327DB3378B9C5E2012FD6D14A6C8131E2071636E73957A81B2F37013D4A41F12177168EC65D22F1D385C84C7B54016497C9CB64D8D7C353A5378CE071B4BAEDD60001D56442133328542CCC80261C28401280CE4C402C253DBB863B1F323A0B3F7E5B0703F822675CB2E218F66794546412F1801416350000F5F7329DECDBE50ACA9F4EF22A04D21A6BB3A2356805E678673C45FB055FC5266E3F692AF9935AEA307F14A5C41B979966A5DFE42EBFED1487E4822B74AB5AF28995E085EC8007ECA4977C63EE5299FEC63DCCBC42EEACAB488E574249E9D856146750AD97C8A443485EC1C5820BEB0964640010F6407140791E74684DBB91052E2D8BEF7BDCD78B2EC03C97A53295D683BDBE32A70DC19A2F75B8613AEA9616AE0E280179492820F73FB7FA4121E673FB5C328F41B67FF8FFA7AEE6564ADABA046D6E1D6AA13FB24965390F829246DFA8763851405075F76CF94C66FFC3308214DF0960C649AAEDC22926CE9357D3875F8B71D68D75999AA3663C30A9EDF07228BF7DFF49EC1E6C7A33D2053597003B82392E826EBD701B4C981AAAC9951C79E08F592C2C0637C8E5A7F9DCDA599E859C317D4888B4098992E0E2D979E41C703686D577E5BA6001EC4F587140711293D664963632F87EA0461E0E0C5E9D8D292FB409F9F9AB172EE17FC8AFABAD06E42B437CE22924EB5DBD3A80A06962F3B37946259F9C75A233CB2B4ABDC5CD1B648FAEB1BE8630DB40D151B8FBA693DF2C5BDCAA14DC4783F450B6BC407515CEEBC5C9A47BD1A141384F0B596CAB1135C075651CBA989C190F3171DC1D72330EDAA01656813C4B7811715060B023FC426745C301B2A91E0D08ED3BDED438C4CE6799C35F3981C882A0BDE4A2FEEB1A52CAFA47B0C48558FC43F98FE08F03A71128362BB6FB9DA6A22249F4D4352AE7D3DAE85DE497E2411EADCFE5BF1A3C075C45811E0097ECEA255FE15BD8321FE8B546A8CACFB899EECF5419DB363C7567C2FE7360B36DE14674F500A31D3EEC71451A7C0D5576A8939C0F6D4D9F2F03F3C516CE25CE73ABB35C73AA94F6AEFAE6AD87052D6B195FA43586817F5BB974AAE7F1B8608922411AA5B0D7D574016CBD3DED13395623470A108FA0E1D3F9FAA7E1E5031843F2A23DBCE8B196315290DEA5795E4115D53DC570A444064CFA3C9457DBF3EE323B1966ECD2270C32910F8F430522471258A1F1955A6E1DD8C84ED9A566499BF85628615351ABE84B401421DA2CFAF575E2644C9304C075ECFC374066CEC713FA4C0D89043689FBC59FF54B8F97EE0A3B0989BC5E4EF83CC9833E75BC8B67BB5EE3C06EA156611CDA95A6702416807530EA206ED89835D20805EA988B1958569CDF7F809996214DADAB4E20BD44917E3410EC6BEAC98FEA07F764E85B66AED5E17CF675D2ED8E63DB728FE75158CB31779E31379648B43D68CCFF3780854CF03535C57122019456E73CF06769BF1FBF558542241CE665BD10F921828553585E0CF664CDC6160F9C47FA5330591B74194F4716056CA83993EFEC4A52DB9A1FBD3B2F504AC19667325167407375B6D7DE739F07947B511C8D475744E5C29D6E286A37F1FF8317BD0178F0E306A38FA6E75F4A80427FEB2C91235D3E7F20D8101CFC03BB73F44EF59AF3526E9AFC580027A1DADE37654238B8EC7AF0105248FE30784A88B72E11FC1BD807E47A349BD29075BEFBB29730EF8E85E3ABD5105559BACEE74AA27D90D360A8D629DBEC95EB34C7F7CA20096FF7B521E40D3944A975436896F372EEAB6B8615EB91697965BBF955779DD3047F7E3BF029E3509A5780247445D6223D085AFB4291D976EFADC41E42DC2C0728D18F6155654A332FEC72EB6AEF8B92C1D177E3DC28C31971BCAFF76DDEBFD9588BC244B116D409E58DC5ADA1648663D603C47FAEB814AAA7EB9B6264356F926C18B9357BF426B89DDC8EB9177ECEB5C6CDC64DD8FEB7B326BC1BA89BD9035235DA0E644EF959C58DD97B88D5C749B36931AC2694C67151DB0894652E99254222D37CEFE9E27B3DD663A152DBE29A3639AFE42F4578937076180563AAD6AD739255EA012A17D2A56627D84C44FBAB261D392A966CFE19278799CF1634D42384323C496190D4B9FB662694E3887EA66AB9E8B195488C8DCA47C8BC0424247759137CFBF86DEDC3641904CB6FACBB30A9FA84ACF69A67B4AFDF4C2AA420FC0D90CEFA0DFBBCD3072D9F772FD6058E2BF0E251BE93B00DC43765B53DB51B22F12D3ED0CC5655E4AEBD9D923F99A43E4461DCF5992030E66A1CDC3A65558D9BB3A39788D92328387D144850DD3706FD7A079E3D2398F542F91A8AAABF0C5068DBAF1FCC5160398ABECF74884BEB04F3A3EA38BBB80D798F5981B3F2DB6C7B33F867B7DC06A4417E30F94CDB4F523AEEA0BE12BD75AAED57520DB0D4B4F013BE3A1DC7AE5C58FD1DE9637F7D82F697B7E92DA427A78FEEC6A5C0255EB57A43DEA6CEBC8805BC04E04FE789E222B1E2642D26EDC14FB36ECC6092B3060E45EED6C5B35DE8741F72933930ECBD7338CF39474122357365700CB50C5EB176FB92814FA7F4032570CCEE6B859236AD5DA5F1730129EDC7BE218BA9874620F6F0EBC45E0BD622F8FD1AE6974994AF95C6519EC1C46650C073D194FA6EBC62F405F63A3416782A47872C7D77D648D0A1C802FFDFDE5FDC112C94CFC68F401889EFC522FE488FDB5384C0D93147AB6587659D936F98ECFBCDCFBF8B352D605F18C855E2559743ED97991C5D50DF44A7B929303835654A3955ABC5BEE6327400A7CCCE460B318D8B5ECE5B12F606ADB3D7B5ED59563B8E675E78029AABC234442C2463256FE02B04F556DA35C4615D14A9F4EFF17DB0DB81DE4BDD894F6628A120BE2D4CF3E1F46D53817899657035A76137E23C0B0E8DDD29465D7F15628FD435E6CAACA4194FDBF85FDCC31D5DAFCB52568B7C0CFBE713BC85FA424BA3ABE149E4035FC86807A8B876D2163B447CAD5EC0E6EF38A1D591AFB46267F9DBF142CAB1CAC1F73BEBA212992FC6D4647EC17848D1ADBB1901277A5078DD72D9C9184E893C0806E9B4AFF0A824670D438620F2A7E8D2965B619D291E5824C014FC888A36FBBE17356431F0039038F9B497902AED969F9C488390B7087763638E976801127BAF1F53803C4DC9649F0EE85D67B239E2BDAFB2BD75F1D1DA22A56FB3AF10A9DDE7AD306C4AF8681029316C0E1949228E6BF5ADF942F1C0EF92B2BCBC0C70D49E5808851444240A78B14D21B54F66271482F49B85F5180B268050327368496CFA8B54ECB97EE6D28EB74A3742F68583DA046809002C22F7B31FBC0566969F9A15CDCA892C4BEB101A2AC3526C76E9D30982C9B4893450FDEC4001D2431828D24D8B1A67DF80E2E10ED2EA8D723227055C48006665F7DA8E032EFDC70BC7EEB2B369B551FAC542AD6DF1A23107E2B3C0E3CCACC25F26404C085CBF56E52D35D7948DB9FDA6DFC24709994719D8CED41A2CC9B3C4B2BEF0967CB71861CF0E6AEA9BEC9395726AA0E2F1A7247ED0F6038E3DF4BF566786073590DCF97F8F0A99658D8F630A2D130C46CF4D26C669360D0F70B75F904C9F923AB285D5DB129F6C25AD21F9E26AC844D07A8EED86C4E224EBFC5B3F720D6F94B0A01B1433C46B40CF84E80F7A6AFA7BB8F9ACF818AD3CAB2DDD6904C067BEA4F1FE79B83CB0AA8FC75B6B096BAD6FE94ABFD48F8EFC0F2B9A02EBDA8FDBDBE1C77F1854EDBA18AAE7F31CED9CD34C1B355108DF18A8953932F7554AF05B203A96A9BB93E0EFF51D7F93B56E351562CF85A2D35EAE2C2427B89A8662A1C723D4F14E6EAFDBD636C2BB7ADE29C1A6BC8A463734C808BEC68B1E9A31AF6E29B412F1CB8C90A9911AC5C3EA71E46113D2D7B1AE2D8802B06A770FD0E9E4652895E42181AD09BB541E9493F258711BB7BEDD3E7CA8B8CE875669CF80A6880ECA3F13800DE7011EA67F443E505C4FB455608AE586F922B3C83FD33B306BDEDB86223C33E3AA65EDC93CBCF3A03ADAF9F328997951D59A9200C0BA2618E3596AF176B43122CEDC52B1E006EA6D12DC236A6FCD7CC46825F2EF7ED71683A731D746FFF2FE54E0B392A8CBFA38873196BB2B835DCA7CB7C3ED9A004C7A329B9734A111744BDACDB669E69E9DF1E52F07C513E3752A0CCD81D7DDC4A64868B7BB2BBBD2095373480522BE10615248A179DCB61DAC90F7FA5FA9B84F190A9C62B5FF9CD473A940F03E7107157D7EB60AF1E3E384FFE8A67DCB2389B3B0FAB7C789CF100CA95CD6A85442CB9A2C243FB9D454B20BAE5762D72B8FE79B4DF81163D61DE4578CF976992D8B9989FC68089F811F53DB1E1092B60220552876B818BEA981571898CD6AB7B5F13C46B0A076526E3241D65014F855EFD7BDE08AD91F259DCB64E94EC3DAD97811EB024EE1D341521DC92AE5E93C73422088976F2D27D64E1D193B955E6736AD2BCCF3C1A53D590576434ACBC0B687F27F255FEF354E68ACA47160EFA7126F908E08E4548C11546D9C412D685FA84D2EB4DCB2BDFC48E2FA8023548198EBB072A48044F4391143E3BEF4FF9066A4B0D03ADC826819D67588BA84F99DA27424103652ACC039DDD3B567851CD78E4117A8B93AFE01FC8EEBDAA1ACB8BA9D095789E76B9D5AB9EE177A15D666EF171FE1D4BDCCFE2E58CE669B561F63028C6CE26DB5C8182FE048680B175C7AB407215FF3A7801C950D509867AB1B0BEF89B3E38A387915225EDE76F91AAD15A85D8C46EFD588BB3BAACBC52C036211512473420F3F061F5F53E9353DE0780425745A76439B3811511C86CA503251F24113384E1A24A9367536E796CE08B896F572489A2339E82A856C - diff --git a/KAT/PQCsignKAT_1138_lvl3.req b/KAT/PQCsignKAT_353_SQIsign_lvl1.req similarity index 100% rename from KAT/PQCsignKAT_1138_lvl3.req rename to KAT/PQCsignKAT_353_SQIsign_lvl1.req diff --git a/KAT/PQCsignKAT_353_SQIsign_lvl1.rsp b/KAT/PQCsignKAT_353_SQIsign_lvl1.rsp new file mode 100644 index 0000000..3305dfd --- /dev/null +++ b/KAT/PQCsignKAT_353_SQIsign_lvl1.rsp @@ -0,0 +1,902 @@ +# SQIsign_lvl1 + +count = 0 +seed = 061550234D158C5EC95595FE04EF7A25767F2E24CC2BC479D09D86DC9ABCFDE7056A8C266F9EF97ED08541DBD2E1FFA1 +mlen = 33 +msg = D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8 +pk = 07CCD21425136F6E865E497D2D4D208F0054AD81372066E817480787AAF7B2029550C89E892D618CE3230F23510BFBE68FCCDDAEA51DB1436B462ADFAF008A010B +sk = 07CCD21425136F6E865E497D2D4D208F0054AD81372066E817480787AAF7B2029550C89E892D618CE3230F23510BFBE68FCCDDAEA51DB1436B462ADFAF008A010B19943116DB5B4552B05B174969C61C9C8701000000000000000000000000000094F28A5533DF8872E3C7EFE3D45A175A0CFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1959E3D67EADD79948DB766D9FFAF4D3FFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000358A8756E1CA2E31C2F3C879414AC08DF7EA0C1D732F9AE3D1AC4644E524340095A4F53D286FDE8A7226CE960C152C344888C963A457B02CAECA41C2672D76000365B548FB9C9E6C0E149BABA3EC7BC33B8F052B6B9D4F840A2AD67221C8F600464B9862D34ADF4D562F3836EBEFC4D8F874351B3E63A4DF9D33C0BBF9EB1800 +smlen = 181 +sm = 84228651F271B0F39F2F19F2E8718F31ED3365AC9E5CB303AFE663D0CFC11F0455D891B0CA6C7E653F9BA2667730BB77BEFE1B1A31828404284AF8FD7BAACC010001D974B5CA671FF65708D8B462A5A84A1443EE9B5FED7218767C9D85CEED04DB0A69A2F6EC3BE835B3B2624B9A0DF68837AD00BCACC27D1EC806A44840267471D86EFF3447018ADB0A6551EE8322AB30010202D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8 + +count = 1 +seed = 64335BF29E5DE62842C941766BA129B0643B5E7121CA26CFC190EC7DC3543830557FDD5C03CF123A456D48EFEA43C868 +mlen = 66 +msg = 225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1AB2568209E46DBA961869C6F83983B17DCD49 +pk = 8FE148717389E48C123C9AA09FB17C5C6F0CEF7E3471EF400296E3EC18E59901E7BFBD3AAAB48CB49E7198D5543AE786727D904425F343A64BC03513B09472010B +sk = 8FE148717389E48C123C9AA09FB17C5C6F0CEF7E3471EF400296E3EC18E59901E7BFBD3AAAB48CB49E7198D5543AE786727D904425F343A64BC03513B09472010BA11181252D9D0802618742879F3A63DE88060000000000000000000000000000A08AA9609F098A395348F267EBAEF4DDFAF7FFFFFFFFFFFFFFFFFFFFFFFFFFFF2B47CAFB3D485D1A4F57B50D87D1E4DA12FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000001B7BD41098AA5A7D32060BB16BEEFAD5831D1012E0DE6848601925EF238AE600277B6BE2B3A67E51D6E0699E627C3DEB12B1DCB3E182028AACEF08257E8ABC009F4FC464DD478FD5718EE30EB0AF68C14026676C95849BB91AA2DFF2E2AA5D0040A0C68DDDB3EFF91CE84E7BCA98D9F3565A380351B9AD6694C2390C43BDBF00 +smlen = 214 +sm = 410E68D74D44A5CE60EC0C05232C9E08A12AFBC5C4584F3CF9DBF3E235774D01D420A17EBA5C5B2BA8B853F5BC66670DB2E3BBF8B11944E1D82B22896E76CA040102E9356A08D41768E8B250B54C33DE5A3F07F5A5F1667BBFB84E8B68E10B07077FDDC9268B4267E5CE42C8C04F17412E200F7B59038D18600D95C2A7C84E54312FA59ABF9342169F4A4D7FACEAB4866B030204225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1AB2568209E46DBA961869C6F83983B17DCD49 + +count = 2 +seed = BFF58FDA9DB4C2D8BD02E4647868D4A2FA12500A65CA4C9F918B505707FA775951018D9149C97D443EA16B07DD68435B +mlen = 99 +msg = 2B8C4B0F29363EAEE469A7E33524538AA066AE98980EAA19D1F10593203DA2143B9E9E1973F7FF0E6C6AAA3C0B900E50D003412EFE96DEECE3046D8C46BC7709228789775ABDF56AED6416C90033780CB7A4984815DA1B14660DCF34AA34BF82CEBBCF +pk = 160425888B22C9793C4F9D8228590EDC3B11ADBD2F17F59FD29CEB3BE1B8C003514B7D201BDB3A9251F704E33E7C0B6D0CBBAD96A5EDC702CD442C4FEB96A80402 +sk = 160425888B22C9793C4F9D8228590EDC3B11ADBD2F17F59FD29CEB3BE1B8C003514B7D201BDB3A9251F704E33E7C0B6D0CBBAD96A5EDC702CD442C4FEB96A80402E3844C89E1596871B97C796605D53D623B010000000000000000000000000000766EC68D19567BD8A5EE6FB1B531ACA011FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F52867CCACB8612A4E59E912F7A8AC300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000FBB62E3E179D26420CA695D6501168770A9DCACC07ADE6B9228CBB3038698F00FDF8F55B18160B23BD15D5D700BD56D60F69C782FFF4F824198E87F4ADF9BB008DCF8F2A82FD20389DB4909687327781EEDD33F01044844CE4FE3198A318F4009C8FD51F853703768F5C23CFE1CB99CA16DAA16ED3C79C4EA8DFE41839637F00 +smlen = 247 +sm = 58DA3D100C32B8C6DC81AD0AD5C072836A84464E6E1367698CD5160F7F643E0175F0B64F92CA0C144B4542CBA07B4B1FAC3300A5C474A65B3EE104C167370A000006D93E378906BDCA812BBA0978C61418BF63037D989E938386D87330480006580941F9F017A013082513BBCD9AC40AFC809B2BA02DB602E971010D122CF44D853560F50B191F64F3F68F7ADA0D57A09E0114022B8C4B0F29363EAEE469A7E33524538AA066AE98980EAA19D1F10593203DA2143B9E9E1973F7FF0E6C6AAA3C0B900E50D003412EFE96DEECE3046D8C46BC7709228789775ABDF56AED6416C90033780CB7A4984815DA1B14660DCF34AA34BF82CEBBCF + +count = 3 +seed = 58C094D217BC13EDFDBEA57EDBF3A536F8F69FED1D54648CE3D0CCB4847A5C9917C2E2BC4D5F620E937F0D329FCF8A16 +mlen = 132 +msg = 2F7AF5B52A046471EFCD720C9384919BE05A61CDE8E8B01251C5AB885E820FD36ED9FF6FDF45783EC81A86728CBB74B426ADFF96123C08FAC2BC6C58A9C0DD71761292262C65F20DF47751F0831770A6BB7B3760BB7F5EFFFB6E11AC35F353A6F24400B80B287834E92C9CF0D3C949D6DCA31B0B94E0E3312E8BD02174B170C2CA9355FE +pk = 1584B4356B7B4E181EDCF26987F87BE2AC278594EFE19F4A19B2B64E35D9300093FB5A2203F31BA91E3D544B3D84451DC05C95006D6D5643E461CC68F749B60102 +sk = 1584B4356B7B4E181EDCF26987F87BE2AC278594EFE19F4A19B2B64E35D9300093FB5A2203F31BA91E3D544B3D84451DC05C95006D6D5643E461CC68F749B6010285488839FDF37A59EA81E89415C0EBDB36000000000000000000000000000000800AD7010806B5DC2B29797BF2C5D92793FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC16AC0EECD16EC83D80571FDEEB7651DC5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000006B898C550906EB18EFDB76BEDFFC61B133689140923133BA81C606972D7DBC00CEE80FD5DC8307929AA199D39BBC1764D94BB07C5BC20146A3E5A388475B06005C4CEFF1DC0B01FA0E39F09E54B2B2AE47CEC813FAE39E2ED1648375188374000F96AB88873A63E011D61319C62CB32D5833D9AEE89B0993F7FB4FD2C3B61000 +smlen = 280 +sm = E0B82F57B5E76BCCE7CD8EC810AF242BE46BF0289726C9E962E1D1B21CDCEE0269019AD486AE5C386201EFEB356409EDC6D83B94DB5443BD7A2BD83415623701000195A78C9D44CC525F56CF7938C0B25B332C3F1BB1E7C68971B0AE4326D73E4315B2517E0EF1E56B5B3DFA05A5885F25E0D26E57E315332ADA8EDDB914D0A7A3470D1EC18F38E6DF5EBE2D0FE37E1D6B030B0B2F7AF5B52A046471EFCD720C9384919BE05A61CDE8E8B01251C5AB885E820FD36ED9FF6FDF45783EC81A86728CBB74B426ADFF96123C08FAC2BC6C58A9C0DD71761292262C65F20DF47751F0831770A6BB7B3760BB7F5EFFFB6E11AC35F353A6F24400B80B287834E92C9CF0D3C949D6DCA31B0B94E0E3312E8BD02174B170C2CA9355FE + +count = 4 +seed = F1902A7815F37BC7F5802D8CBCE5B48D82EB85691718062BFB84D8C06AA41D6E9039B0A107245DAFA4EC109A57332914 +mlen = 165 +msg = 1CDF0AE1124780A8FF00318F779A3B86B3504D059CA7AB3FE4D6EAE9FD46428D1DABB704C0735A8FE8708F409741017B723D9A304E54FDC5789A7B0748C2464B7308AC9665115644C569AE253D5205751342574C03346DDDC1950A6273546616B96D0C5ECE0A044AF0EDEFBE445F9AE37DA5AFB8D22A56D9FD1801425A0A276F48431D7AF039521E549551481391FE5F4EBFB7644D9F9782D83A95137E84EA3AEB3C2F8099 +pk = E964EC7779D36D490F0FDC3B7B273C6204549ACAFB30383B964FD89968AC2A017FBCFC346BB8D41A294B595B6D108BF17AD8866ECEB74994681F1FCA792CBE0308 +sk = E964EC7779D36D490F0FDC3B7B273C6204549ACAFB30383B964FD89968AC2A017FBCFC346BB8D41A294B595B6D108BF17AD8866ECEB74994681F1FCA792CBE03081D8BFDD41162104E4092489FED630AE4E6020000000000000000000000000000CEFE929082D4CFE9583A3734E022BBCB3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF4F93D85F08F8C6E99B428B8ADACA48CCFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000C9B91BA8EE272890D18A88A3D5B217B413D53AF2C3DD769D4EFA5AE435852D004CAD3A932F62B9CE1A714BD37DA9D51D1014E7B062C2115F94D59828F8005E00C7C8654BCCDA11C8DE6602D9C433A5B63A391CF883A68D0EC6080A015AC05C00836553A145A0E80D8525AD9B2F85D04B46E20697BF8CA88E1A1432A2ADD94F00 +smlen = 313 +sm = 2E14ADFF2D85FC5A0CC7323508D73FA2D5F86A531952348B4630EAD0FC4D7101F7690115791F320C05A970CA22291E0BFA410BB2F9D475E1C9B16005813B94030002C16D7B1832BE0EB851996299FAD5816D74DA19280C2F4F5EA6EE34C82DAFF3CE04B74331AA7142BF94B3729E12805DE56470D2261F5E7ACAB01A7234543D2AAD1AB999189A34549B3653667487EE80030B021CDF0AE1124780A8FF00318F779A3B86B3504D059CA7AB3FE4D6EAE9FD46428D1DABB704C0735A8FE8708F409741017B723D9A304E54FDC5789A7B0748C2464B7308AC9665115644C569AE253D5205751342574C03346DDDC1950A6273546616B96D0C5ECE0A044AF0EDEFBE445F9AE37DA5AFB8D22A56D9FD1801425A0A276F48431D7AF039521E549551481391FE5F4EBFB7644D9F9782D83A95137E84EA3AEB3C2F8099 + +count = 5 +seed = 75224ECC026C18159FF92256844D0ADF953F0A4DD8D74D4EBF1DC5EE8F5630B011A447FD4DC34A2404D620CA0E1F273E +mlen = 198 +msg = DBE5B6C299B44F8D60FA972A336DF789EF4534EC9BA90DF92AD401D1907951EB6285EDA8F134277AB0A1145001C34E392187122506AA2DBB8617D7943A129EB5C07DF133D7CCDE94A7CB7F1795C62493ED375353D1F044257DA799F7D112C174FBC35687E2F87FEFBE2D83D29D7314B30A749FE41B1B81095638F112BC4563420AF235280E466FFBE7050C4937C60FC18D1A6025BCBD489F0C538E088E906ABE8597E2C8EBB64F01D225C847AAE4B77BAE6EBA9269962C4B94A9732CEAA2CB4093D442FFBCDD +pk = 054AF2DBA4F1BB5D0E19649DBBCA126AAEF0E2A4EB967EBAA3AAAE520C7718001A1EF8FB9979E6EA6D0C5A15D6FC08741297D4912D0629EA999BF66B8A9F660002 +sk = 054AF2DBA4F1BB5D0E19649DBBCA126AAEF0E2A4EB967EBAA3AAAE520C7718001A1EF8FB9979E6EA6D0C5A15D6FC08741297D4912D0629EA999BF66B8A9F660002914F905A9DEB9C4169D08338CCDE0666BB0100000000000000000000000000000023D943E9A63825E5EFE99A65A4C557A1FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF0398E56B763AC0855C89D84308DA8864CFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000099A27B997693A8684621269BD76154A2C4EC58568F248B61896ABBD8B37F4000BC58FBB0D08547F8A58C4656D76C596BFC0E9BBF5A3D9BF6B2AFAE0C8B26FF002E6611DAE830A52982EBF55DB22A819C97825DD338B4789BE77A0704B9C3E6002988437856A33A9716EF8854EB0930A0E7BA80012FA9C5BF4EF2787279F1F100 +smlen = 346 +sm = 72B4FCB3D2EB972FAEDC5102C7370620C0702A00E18C96F040B9FB44B16DBB03D884C0FC81079BD080B5349AC55562DCFD79F4EB54FE174D3A85B731C04B0902000282C88F22BE774B00E5B98C2BD1D7B71027A48F3EFCA3D384341AEE771BE3B18C54067FBE0D5D0BAE2291DEF149AFB6AD20BD009CF53B7CA41A1BAA35354488BE394E4DB96496F437B49C2C2D934433010406DBE5B6C299B44F8D60FA972A336DF789EF4534EC9BA90DF92AD401D1907951EB6285EDA8F134277AB0A1145001C34E392187122506AA2DBB8617D7943A129EB5C07DF133D7CCDE94A7CB7F1795C62493ED375353D1F044257DA799F7D112C174FBC35687E2F87FEFBE2D83D29D7314B30A749FE41B1B81095638F112BC4563420AF235280E466FFBE7050C4937C60FC18D1A6025BCBD489F0C538E088E906ABE8597E2C8EBB64F01D225C847AAE4B77BAE6EBA9269962C4B94A9732CEAA2CB4093D442FFBCDD + +count = 6 +seed = 447F03C8CD27EDAA1FA0436DA492812F57AC946479A9F1F90EC4F5E913A05F8AB0DD7645026A96510F6D40AF05D85B07 +mlen = 231 +msg = 0073BEE97FC97C0FBC750D474AEB93189F061E1A5CF6600C04FB0464338EC7E85252F94FCBC7B2BD00E438480D9AF3ADD92A92E3E2E8ACB55077C3278FC7503988A76E9B6062996B20889AA55B343D5A003C8A8852D738F955799FA3426BE5CCD3AA6B6EDA04D4884941FFC0B69C5ACF12B347A74D0580CC3335BA816200F87674A4C1D98097C70F2F27C74E94A661850610ECF4847AB5B58344F958C5719E06BA396225BBE21ACB0FDC512B885D391E11B0C0ED5CE6B5DD8FAFF91F50025C69D43072F7706D80D9FD786E1104125D79A5F4B5FD838815D44FC8B1AB678078CC174DDE970D448B +pk = 9619582993339BE6106DB75C6A670F10AB48D35C9E4098A4A903C007B12E72041745631AA2540728AD98095DE56B0687BA6682727AEC06E57CC766ABC2E2640002 +sk = 9619582993339BE6106DB75C6A670F10AB48D35C9E4098A4A903C007B12E72041745631AA2540728AD98095DE56B0687BA6682727AEC06E57CC766ABC2E26400021DF66A63EDF240911F86FF24F06553B0F700000000000000000000000000000002CE09FA60A5198BA49B4E61F32E6FC44AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF756D462E49D55763D710072444828F9420FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000795288DCCDC78590B12E6874333342D136CBAAEC62A266184ABF7B2E5ED02E004CFD69507059F38F941081AA0F3B563FE3EC4CAE08CC4A1A381950F86C081C002D303431F70F539DCA98D48B953C5F7F9B737B9B899BBF721477009641C14E0071DDF3DDDD14ACCBBEC4D04EC56E4FAC105FD5390B236239803707CC886E2D00 +smlen = 379 +sm = 0C0ECFE995AB3220147D0B6A9A31A4CB6BD3F6A518389AA14F8C37216ACAC50220833C28E1E6845EFD66D5ACED3A5439C50DD65380D575D0B5050617B895600100020BBCECBBC263113EB6C602F1D0633420B6A9DD64B58174315E30943FAD8DBBDE7CCF28866E9FEDCF897B79F4A116760FF4B02C27CA4653D1715FD4A40FF0E161EF6DB31AD42CF8E9DFABE12DB195700119040073BEE97FC97C0FBC750D474AEB93189F061E1A5CF6600C04FB0464338EC7E85252F94FCBC7B2BD00E438480D9AF3ADD92A92E3E2E8ACB55077C3278FC7503988A76E9B6062996B20889AA55B343D5A003C8A8852D738F955799FA3426BE5CCD3AA6B6EDA04D4884941FFC0B69C5ACF12B347A74D0580CC3335BA816200F87674A4C1D98097C70F2F27C74E94A661850610ECF4847AB5B58344F958C5719E06BA396225BBE21ACB0FDC512B885D391E11B0C0ED5CE6B5DD8FAFF91F50025C69D43072F7706D80D9FD786E1104125D79A5F4B5FD838815D44FC8B1AB678078CC174DDE970D448B + +count = 7 +seed = 8C151C556DA912A82DEB32144C8A8C9090CFAF5C12AB822AC3C72618837A41C2453B715EEFF3724CAFE69B1ADCAE9DDA +mlen = 264 +msg = A1586245D81F96BD8EE81AA30F10C0ADB343D74CF72C4DFF71550C12873AF89FA1874D4731C996243C3749AF3F6188FFE9FA45430549045134EB29EF3CEC37E72904AA082B1C6161E6B52361E49AF4933A8D8C0734F21CAFD7467B0C02876F43211D6122E3E735FE36064DF7A0C91449237C2BC7C3A78AC7BB0F9567F2576F05802C872ADF183A87AA3B8217188F2F3535F877724F35B29E545DE4BCF258F13BBC7EDD8C6587F733C9691F74B4151CF8C060C3AE9E8D49FE7C77BF477DC9F23FD0F0B67320275529034B84F94176730923C03AA50F9584D9C2D60B8DCCF85A13F243F30A51ABEFBBF2CDA602BF3D75E849EB92422B808416C7E56B046CE38E4677AD24D23D7237A9 +pk = BB1ED0183D5192FD52FCF31315CC92632E443ACD6A4377010310498419B9F4012D924DB8D9847862CBD0A6F920DA91AC258D2B11F09C08B699E16CFADBC1F60402 +sk = BB1ED0183D5192FD52FCF31315CC92632E443ACD6A4377010310498419B9F4012D924DB8D9847862CBD0A6F920DA91AC258D2B11F09C08B699E16CFADBC1F604022701712952580F4C90393543DB33F066B70200000000000000000000000000009C61275DE3CE58383FC9C2BC08DE55543EFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFB994085DEB576C5CCF354C4B58836AEA8AFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000079FC54110C24EF354367B27FC6733C346FD01678EEDB44BDAA36CF7BCF57A400871E2DE7A955EFA70F496612E6F12EFBDE6E96FC31FA1449131383D6813C4D00DC05D5D2EE4C1BF49477FD6E31102FBFEB00263A2802C13FAA47E04809C7E50083152212BC4F79A085D5C835FA8D31281EFE77E60E8D6C4A3ECAE712C38FAC00 +smlen = 412 +sm = 25750D798E050ED506B37FD67A1D5CC74B3B84239ACC1FAC04C4165156D8E50103BE1240850CADE72F97BC9CA9A56987B19AD960E65C4989FA4AE77DEC52EB0100006147A2FFE1448119857BE09619D50FE0E0A04A8118FEF32B35C97FD6BDA84CA9F5344DC3D7C73770DB27A3669979670B5F2FDF0A02779A7EEDB51ADF94DC278F788ADFFBD3E7311034742A22D5DF8202020BA1586245D81F96BD8EE81AA30F10C0ADB343D74CF72C4DFF71550C12873AF89FA1874D4731C996243C3749AF3F6188FFE9FA45430549045134EB29EF3CEC37E72904AA082B1C6161E6B52361E49AF4933A8D8C0734F21CAFD7467B0C02876F43211D6122E3E735FE36064DF7A0C91449237C2BC7C3A78AC7BB0F9567F2576F05802C872ADF183A87AA3B8217188F2F3535F877724F35B29E545DE4BCF258F13BBC7EDD8C6587F733C9691F74B4151CF8C060C3AE9E8D49FE7C77BF477DC9F23FD0F0B67320275529034B84F94176730923C03AA50F9584D9C2D60B8DCCF85A13F243F30A51ABEFBBF2CDA602BF3D75E849EB92422B808416C7E56B046CE38E4677AD24D23D7237A9 + +count = 8 +seed = 9B42F41492530EAC81992F17613EFDF155F407D7E67F18AE193EDCE714D65D1031E7AD10839AAB46D0850EAF5997AB4D +mlen = 297 +msg = 9366ED7B3B623C411448B634446F1A3FAABDD163A6CC1E2BCAE4A98703CD8CEE441405892FBA051BE2A586A6950A5EF73A255E5F86B0D7212E0C51C3BC79BE4B88E76ED6F043FEF3204FAF044BFB1ED722D61EB5D0B74C66A257E8AC3A2206273C80D2EC2123A4DBB715D60118D99ED7322E38F1562F82379138DA3DDB8BAA7CE61AB729AFC3748C0134633CF45A9973C05C75D04E82F631845427626B5799DC07DDF830BA01E8BC6236BB6D03B37D949DBB29EEC7DFE60FBC17EA590956D251539792016E2A8B01E70476961BC9ADA43CDA682D0CAA4FCC58810BBA1A673EF8F6BC90BAEE701E8E4F7C04A346CA56C7B2862FF57756CE6CD1EE22D677BCDAA896EAE96F87870E032C18B6C6A0C1A191FAE2ED487CE55296CC4B6339EAC9E8A742BD0A44C3525CC750 +pk = B020D488F77878F3DC267BBC070DE2EB7E731E928406A3796D0B581783DCCC04F38B43C46C55098D4BFAB487E1337FBC7F77263F2F1E1960D463C0694C6EC10104 +sk = B020D488F77878F3DC267BBC070DE2EB7E731E928406A3796D0B581783DCCC04F38B43C46C55098D4BFAB487E1337FBC7F77263F2F1E1960D463C0694C6EC1010409F463023D090D72FB8DAF592256C07004010000000000000000000000000000AEF42C39E1E6F3BC079B53EC6CE05FD8B0FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D330CC80B924C4458070D1A5F85867FFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000EDD8FF32AB8356C5E312D9D2302E86B7C6A71548CAF55E03D5C9D47A61603400167B55D784EEA1276C8BC16C96C6044E72F69CE413C67924146BB8FF0461A20053C6E6D70E95EB6A3B45CB1A41B5FA11636C43598DB9FFEFA0427E446CFF4200CB41E94944296E83DFA7F05051E2FB800CA0A39698BDD234BAC502C23992D600 +smlen = 445 +sm = 2D3D1A1EC4999E8C422239239719227F6E70BF73A688BFC79082B4C69F026203C156CBFA6375330F6EEBE063F891D4B9EB64A61B6269BAF1AA0C554B8872F00001007C473B905B61ED02C00A0C668E37DD0BC77ACD5335644C7F66562FE53A9E803B937E37B550A9E9CFE3A296DDF4A2C846250B778ACFF1CE349136C958FBB64D2B8F2982C26313A10EE0346A5CC539450211049366ED7B3B623C411448B634446F1A3FAABDD163A6CC1E2BCAE4A98703CD8CEE441405892FBA051BE2A586A6950A5EF73A255E5F86B0D7212E0C51C3BC79BE4B88E76ED6F043FEF3204FAF044BFB1ED722D61EB5D0B74C66A257E8AC3A2206273C80D2EC2123A4DBB715D60118D99ED7322E38F1562F82379138DA3DDB8BAA7CE61AB729AFC3748C0134633CF45A9973C05C75D04E82F631845427626B5799DC07DDF830BA01E8BC6236BB6D03B37D949DBB29EEC7DFE60FBC17EA590956D251539792016E2A8B01E70476961BC9ADA43CDA682D0CAA4FCC58810BBA1A673EF8F6BC90BAEE701E8E4F7C04A346CA56C7B2862FF57756CE6CD1EE22D677BCDAA896EAE96F87870E032C18B6C6A0C1A191FAE2ED487CE55296CC4B6339EAC9E8A742BD0A44C3525CC750 + +count = 9 +seed = 11134936880F5A11ED3504CF7B273E55A351FCCB10943BBBD186623EE6C7A13A6565C3080D1F536BFDB018F99C4E46CD +mlen = 330 +msg = 0998114C84F84080E7EEBB47D248980FAC9D28F1ABB6DBAB3DD59A5CFD2C7CFF7F308372874DD5447C7B02E30165501C0C673128E4C543A414222BDF47E7F4E8DCA757B0F4A3281C0D10C4F02AB52AAF5B9A715E012607BA310947A60A5F62D6B8CFA96386D27CFA709189202421C078934AA2D955468E550AD4D0D4ACDD98B168A9568E232192E92789830317FBC959087FFFE353B6C168F3EFBE7164444F1D6CBA5246E31658C65440A841DBA78257E78502843EC1A6E9710229C8EEB85D6CDDC7D543285624AA1F756A5DD4F1A5D4FA52DB8C5C34880ED448FBB6D254509FBEEA0FA022F276B6A66BEF7ABFEA6049FF74291BABE781F718683397077B29FA9E2B46BC6B09251E587CC5B182195DD4060CC4A319BFBE251A5B660A739DFE5D0E5B93F3CB7E440194F1C8BDA922CB1A3EE3D27EDFD61C1D31A7F4534E84889EC83B51F1641892766434 +pk = 447339802BB9FF8B81F5208671439BFDA1533CB3311B4F9762107B6250515801708385F7113C24ECC3AAF1EAF65390DE9E9003BDACA9057D82311B76625C3B030B +sk = 447339802BB9FF8B81F5208671439BFDA1533CB3311B4F9762107B6250515801708385F7113C24ECC3AAF1EAF65390DE9E9003BDACA9057D82311B76625C3B030B0B73650687C6D3B1B13CA2069B688AA210020000000000000000000000000000267F461692FE57B6FFD01D45A0A0537577FDFFFFFFFFFFFFFFFFFFFFFFFFFFFF9361DBB163F48C6FB85153BECADE5DED45FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000639A3BAC64BEA7B018AC4C0C7FDB16C8233785B741310F1601259594211C0A005A1FD392158A7091A6B52E305204EF75E5C53A2C1F447F97641B6CA1AC0C41006072E6308B1A44652C22AADBDFEC05E2E8148B936151473A44A172AEC38899005B87F797ECC007DF578E1A35F70DBE5131D2EB89B53A1C3CE029D45F4685ED00 +smlen = 478 +sm = D13145D9FF255ADB74604AEDA05DECCE5B78ADB8DEBAD255443173A725844002A3A53BED0CA716749C6BF95F5883839517382F8E67A548017DDCA691DAFD440302016D065753ACD792CDFB50D97988BE063B68CB85C3A49B68B9C06474060624830E8FA25EB621A290873EABCE887D66D2171E0DA2E88C91C05C991F44098055462E92C0FA6AEDADD6C6EB712BD5F450CD0311110998114C84F84080E7EEBB47D248980FAC9D28F1ABB6DBAB3DD59A5CFD2C7CFF7F308372874DD5447C7B02E30165501C0C673128E4C543A414222BDF47E7F4E8DCA757B0F4A3281C0D10C4F02AB52AAF5B9A715E012607BA310947A60A5F62D6B8CFA96386D27CFA709189202421C078934AA2D955468E550AD4D0D4ACDD98B168A9568E232192E92789830317FBC959087FFFE353B6C168F3EFBE7164444F1D6CBA5246E31658C65440A841DBA78257E78502843EC1A6E9710229C8EEB85D6CDDC7D543285624AA1F756A5DD4F1A5D4FA52DB8C5C34880ED448FBB6D254509FBEEA0FA022F276B6A66BEF7ABFEA6049FF74291BABE781F718683397077B29FA9E2B46BC6B09251E587CC5B182195DD4060CC4A319BFBE251A5B660A739DFE5D0E5B93F3CB7E440194F1C8BDA922CB1A3EE3D27EDFD61C1D31A7F4534E84889EC83B51F1641892766434 + +count = 10 +seed = 98DDA6B97E89A479D5EE214E660DD6B5D8F6CC638A1CD4F462A0EC545F5B0B0A1A403AADF566F7B1C0C5FFCA29B36FCB +mlen = 363 +msg = 4CCA95CB9F254C2EAA7DCFFEF662EE03320D5FC626A6484304BF62FC20F341FBE26E1537D7BD20E95440F7CC95EE84E1297C807A0BC9006DFCD5C22A5C1FC0865F5D70E5D63AD677FFFDEA52BF85D1A4F159F7ED16A745B4D971B620048B5F518EB2DC672CA35022578059E1ADAD7C07FE910A5D566B8321D9A12F34C250BE35CE964DDDEA23C90EA77C9C1BBE3532FEEFDA3637157786EC7D37775AE5CB0BB92EAB45A0FB1E833E8A6F3D06B85946E31A79B64A02B31FA640ED514A85882C89F693A06354DFDDB0B5E23E7792134C69C1D3908882DF3A7694A05B241B87FB2DBD1A4D9F26943B69F3CDF730301663089D1EBFC23299DA21300F735CEDF7B109F3E0BBE273776E6AAFA7054A6CD9682B967EB7903DE549E9558E62DCF3AC444DD7042FEA362EFB555BB97FB464AD7FAEABA3197C14A6740477DB50CE3FB8B762F48F880381D510FCC836E5880B48F08BD6333202E838AB73F2E106CFBFB218AAB802DA8A00F13F78FFB70C +pk = 973D16E95C8FA8CF3FC36256CB6FCB93817E96BC32154517962CDFCF4483AE028E725EA16BBAE24E14C7DE3985DEF119751528319FF3F6E12679F4AEEECD710311 +sk = 973D16E95C8FA8CF3FC36256CB6FCB93817E96BC32154517962CDFCF4483AE028E725EA16BBAE24E14C7DE3985DEF119751528319FF3F6E12679F4AEEECD71031191262940DC1802DE43027E6E64D003288B02000000000000000000000000000038E11B27CBD0325EED58EBF7DE8A2AEF5CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF990FEF6FBEB6B472033C9221F099451F86FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000ED7E5B24E8DF10E88751E66885FD68D2EFEC6F6AE08A221A8AB498AEC52FA300766E2A05D7A4F2784A46FD3D102ACC1881F4E3DAC61006568929D29AACBD68001AA5F19B62E3177B310E1FCE7DD0F52A1D508567C632B811E14FC2AD73DE0800D16E8BCEEA40AAEE0A0EF0E0820FAEE867CC344D90821CEF5D1DDD34F5E4E200 +smlen = 511 +sm = 971201BEE6F39267392B27B28F962292F6511B11A9C08708BD5425560D358A047DA3DF5C0E093A0438FD82566EF83A28D543205B9E5110FF56C748DA405AF40400004927B3D0168910FE51A5E70D1F395C023C84833538992EF43ADD3EAC5684EE8427C2EE7F2CC9A9D848428866007E6761B97493D722662AA9AA4C17E0ABA1FBEDE846B9922E27362C896818E47BDF0E000B174CCA95CB9F254C2EAA7DCFFEF662EE03320D5FC626A6484304BF62FC20F341FBE26E1537D7BD20E95440F7CC95EE84E1297C807A0BC9006DFCD5C22A5C1FC0865F5D70E5D63AD677FFFDEA52BF85D1A4F159F7ED16A745B4D971B620048B5F518EB2DC672CA35022578059E1ADAD7C07FE910A5D566B8321D9A12F34C250BE35CE964DDDEA23C90EA77C9C1BBE3532FEEFDA3637157786EC7D37775AE5CB0BB92EAB45A0FB1E833E8A6F3D06B85946E31A79B64A02B31FA640ED514A85882C89F693A06354DFDDB0B5E23E7792134C69C1D3908882DF3A7694A05B241B87FB2DBD1A4D9F26943B69F3CDF730301663089D1EBFC23299DA21300F735CEDF7B109F3E0BBE273776E6AAFA7054A6CD9682B967EB7903DE549E9558E62DCF3AC444DD7042FEA362EFB555BB97FB464AD7FAEABA3197C14A6740477DB50CE3FB8B762F48F880381D510FCC836E5880B48F08BD6333202E838AB73F2E106CFBFB218AAB802DA8A00F13F78FFB70C + +count = 11 +seed = D34A0AAD27ECAD31A5E08E9A2D7901A9B85F864D9B1B46F40CDCA0B3615B2CBA04EF82AD7BD8CF627C3E861477030BE2 +mlen = 396 +msg = 5C4B2E1A344DA1418B0F4BE3FD99505FC30F2A1E5B696E943BEE2451D7B268F722E04F8E00FDD9E1A470F8C977A6D45A5F621B8815E352FA14F64977D1FA08082A48AF495719EA6AC1C0B3D898603B4CF7EC88E68DD7190884382896D953D612CC21ABECFB01A04A1BB1BBE8986D34625756396CCD84BD1A6B5454DDA98824CD4844D98F356AB485EEB19F9196ABB1C3088C0C3C5846C88760B696D91A232D6F4CFFC85BFF33DE1A3433A27A209A461FCF37F2289F98BEA7CCF183DB1FC42A7EDF958E7913F8711DC375E43F09BE7C7A2C2B1318AE2A9CF5988FBC2CE0735A2CD9FB6C8496C34406C538C01BD494193240BFF947FED47B7CCE99A1747973F1FAA5223AC564BBA0CA8973D1310B5BFA1452CACE9110BC22A8D4080A8BAAA8ADFA3CFB6685679B648484E3A43F9B1B2531949BBB8FAE1846F6D45D9272FC2CAA2913B5D9F8D322E9B18A685122D74634C60730C101578BEF2480711FEFFE02123E76D6C846559E2EA99A98923EF095630102A5573EF027E0AB6E52555A9EDE0D15A73C8B2FEF87CA6FD9F903F0 +pk = 21945A302345D472A941DD5B915837971E8E5A2D03A77F11416341CBCC87F603AC583EA160B8D827AAF030FB0A745A6646A265FC37FB2F48B244346E2230080002 +sk = 21945A302345D472A941DD5B915837971E8E5A2D03A77F11416341CBCC87F603AC583EA160B8D827AAF030FB0A745A6646A265FC37FB2F48B244346E2230080002EBAC4D8DB77863E10309D0EEA10065360C01000000000000000000000000000046B88244469AE19D1E89D72C2F6DBDE462FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1AB1DC6FC4756A6F0C815714556A6C40BFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000FC836575739685A6B5FCAFA23EDBED57099EEF0BD6404CBF8F935F25BD45D00C4267B13667F8798A4CB5A1C0596965A4D3B2F376496F9AB86284B4502855E009F7F4E167287189A946C4E962B5A5DFE7192B399586D79BF181236F045913C001BB5C3DC780089506FBA9BB048ABBD027243FE3B7C1CFA43060067BB3681D000 +smlen = 544 +sm = 3029D1AC3439BD39E0B433DBF1DE149EA272C7B98F0A9A81659555D1089298016D8B6508A27352EEB3E290F5F35366B09490F17F24412D25F12D7EFF9BB37004000063DA13A10EF13A8FEDDB081FD1E2ADA5CDC1954C50093796475A5F447C2B47562E3A5208F7FE4D88E07B01D3707E3BF2ABC6EE29F04942CE2526D1EC4F531EF9FD1DB5AC16300E7D46379AA7876C8E00020B5C4B2E1A344DA1418B0F4BE3FD99505FC30F2A1E5B696E943BEE2451D7B268F722E04F8E00FDD9E1A470F8C977A6D45A5F621B8815E352FA14F64977D1FA08082A48AF495719EA6AC1C0B3D898603B4CF7EC88E68DD7190884382896D953D612CC21ABECFB01A04A1BB1BBE8986D34625756396CCD84BD1A6B5454DDA98824CD4844D98F356AB485EEB19F9196ABB1C3088C0C3C5846C88760B696D91A232D6F4CFFC85BFF33DE1A3433A27A209A461FCF37F2289F98BEA7CCF183DB1FC42A7EDF958E7913F8711DC375E43F09BE7C7A2C2B1318AE2A9CF5988FBC2CE0735A2CD9FB6C8496C34406C538C01BD494193240BFF947FED47B7CCE99A1747973F1FAA5223AC564BBA0CA8973D1310B5BFA1452CACE9110BC22A8D4080A8BAAA8ADFA3CFB6685679B648484E3A43F9B1B2531949BBB8FAE1846F6D45D9272FC2CAA2913B5D9F8D322E9B18A685122D74634C60730C101578BEF2480711FEFFE02123E76D6C846559E2EA99A98923EF095630102A5573EF027E0AB6E52555A9EDE0D15A73C8B2FEF87CA6FD9F903F0 + +count = 12 +seed = 4FDA9FB6929E3F391901D69FA0AA2F25A9657D249A620F1B9E305A5965676BA76794CAD3355EB632579C3958CA7D443D +mlen = 429 +msg = 49755A7B1A7CDC5C9BDF5149968061D3C95EE67BFBAF02750C45094303A9D9CD23A08F19B9C768ADC63FFD1527186D09CA4E0356BB882E263BF015CBE3716C05B31A69DDDB790BA82C341AC9B6BE68A81B8BEF8D882304BAF0020D761A0DB04412033DC369961A5213B04E81736A580F1162780599CC029E262D67F31B2773AFB457A1ADAAA292163144F17DE384234F3303111FCD89BCB30333C6C6486F775ED099043C34E6C86450B650F1A02D03781B1D20691B767D166DADF1DCC4D8604D976EFDC9168373A7316DDA9B9FB02A4A321218D9F54E287B7167A08BC0153843BD6355AEA1310824DD5D5EC458BE694AF176119D9E588A29C650FF5500293659EA478B39A62149F819CDB7E7CB32E1D7B1284F159E2AB1B1EA41AF4D0AC94FF3111FC1CCD818F9B2CC7A259701405FDF6A51D2D3EF62789297BD16A659F14968EF902C4A23DA409BF13A4913467B5C991854B2CA6CC006D3F4197A6AA58BD5DD95C36928DA9583332C3FB134FA3890FE7E299F1C17205366C4F4230724C43E4803912E72B816658BBB1B63780865A1F66A2A49B96E93711B1BE97B827D12173402828B1A065B94310D5BD6098D +pk = 60D60BDB8C80D3A34E62284CCD7D577006545A7A13FFE873182199D1D7242E0079739ECED41088CDE138314C4F592A90F06E8C07597BDB55A685D7EF5B454C0317 +sk = 60D60BDB8C80D3A34E62284CCD7D577006545A7A13FFE873182199D1D7242E0079739ECED41088CDE138314C4F592A90F06E8C07597BDB55A685D7EF5B454C03171972EF8DE4C3879DA6F516B11D1C849E0501000000000000000000000000000016BCD9E26B0B9ACC36D4F6D7A20FC090D2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFA40095246412FEE59F547467CBCA32FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000D59F4FCAC59BCEE538F7811615D01AE40A6E93203E834A19BA1D44C94A4F3E007EA8CF054B52EAE9F5AA65F38D17F28A7A161B4FEA81E549FBEB06C575EA1900B034A00E43A9734B11F261F01FB91A7248F2758C94C8B730E2A51F04F8E7E0008BBAFAB22A22CBC51BF8FCBC1F024527689CA04D164181007D2D8A45FE352600 +smlen = 577 +sm = E4E4F49FBA52A92DC85315F659B5CB2317BCB6C204C7101E3B6B61FA4729C7013EC3BDA7A2CDF32E5D3CCE741E3C4163C97FF6BC1E98F5E0236151017397570100013F8950166A0D0308421757DE15C7319F6A6F50F04F7FE6966E297A5BC6DE43B1FFEA3B6CDD612EBC39928F38A78EAA37C8798C19E4CD31E8A008A242F1034572EAD50C0E2F79B3F68C3F2155946B5A00040B49755A7B1A7CDC5C9BDF5149968061D3C95EE67BFBAF02750C45094303A9D9CD23A08F19B9C768ADC63FFD1527186D09CA4E0356BB882E263BF015CBE3716C05B31A69DDDB790BA82C341AC9B6BE68A81B8BEF8D882304BAF0020D761A0DB04412033DC369961A5213B04E81736A580F1162780599CC029E262D67F31B2773AFB457A1ADAAA292163144F17DE384234F3303111FCD89BCB30333C6C6486F775ED099043C34E6C86450B650F1A02D03781B1D20691B767D166DADF1DCC4D8604D976EFDC9168373A7316DDA9B9FB02A4A321218D9F54E287B7167A08BC0153843BD6355AEA1310824DD5D5EC458BE694AF176119D9E588A29C650FF5500293659EA478B39A62149F819CDB7E7CB32E1D7B1284F159E2AB1B1EA41AF4D0AC94FF3111FC1CCD818F9B2CC7A259701405FDF6A51D2D3EF62789297BD16A659F14968EF902C4A23DA409BF13A4913467B5C991854B2CA6CC006D3F4197A6AA58BD5DD95C36928DA9583332C3FB134FA3890FE7E299F1C17205366C4F4230724C43E4803912E72B816658BBB1B63780865A1F66A2A49B96E93711B1BE97B827D12173402828B1A065B94310D5BD6098D + +count = 13 +seed = B0E6A23FAB10A7A333E3720BE00D31507917F39C5EFE1C98CA18BEB5C3101FB4479B478A1558C4C00398C55C9822FC44 +mlen = 462 +msg = 439529DF1864297E33956AFEE00A60099B658A67830A6A6ABDDC329E87831D9F9B647917FEDF1AE182A40402143285516FCAB83F447354C72FAE81AC26E7005C2AA561763C152E66BD80F14565F47DEFA440DBB491E7994AB9FE35995D5FBB3800CA030B43DF611141637A5246AB9D9CAC02EFE14AF60736B6BDB2BABB97CF21E831E5D04D41C00F090B154977900EFADD3A9313389A3F84CB3AC38E8B57B70A43DD08A8243F8154013FD5CF29DE5A8DF0B197C12B17E0610FCFE3625CC94067E01E23D23A243AD1C1F805CC50E1447D1DF93C25B8D76396BB7199E64129522462C5FC8B30C132D4EE9E0BF6F52961FCE7ECF650647E7064AA5A6574649A323E144D7C5491DE4C0A1A76D08F93F87A2FC7F6955FEF86991E62E2CB42908E83B0C0A8BC180B7453CED293F1E20F300431EC1D395E8A537F0BC36A673D491F14381DEA90D8F176D06031B0A7AFB40EA8F76D37FA82E2572B9799A5FC7CF4C49BC20AD78EFA8CD989A84D72ED680AC3C0F64155C56ACBFD7C7D628B418A489F961357F77BD62204ADB079DD3106485A37FEE535C9CF82E832D8AADCBF686976B806B02AE733DB46DB0BF162E973931C3E338CC86DB38C66262D1B2EBC7691B8281E0B20BF36305FBA996D20ECFDC695 +pk = 61B6EFC812DC18F6ADA63EB8C588AECA0D80AC0B53032A3BACC6C3C8E35BBC002FFF022D1898370C28C37149696990D0181A1F7EE1CFE4F64CAC7F98F9DB2A020B +sk = 61B6EFC812DC18F6ADA63EB8C588AECA0D80AC0B53032A3BACC6C3C8E35BBC002FFF022D1898370C28C37149696990D0181A1F7EE1CFE4F64CAC7F98F9DB2A020B35D8C269F1043909FB79F47D010876D7C2000000000000000000000000000000BA677DD7D9ED03CE04FBFE095281FAB15BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC56341D8556A4EBEABE0E6547D7D61987EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000006E1CFE992960B1FA3911F3F2E995FC614E180262C8D8CD1ADC89674D99B38400298D1F3EF7150A1BC6053FEAF49CEAD4F41F9B8CFD79415D10175AD5DC402D0055BD62BB30252DED7D5FAF4BD4DC3A172ED6DB80DE4C5BF81BCA91AB90FCFD0084E51C391489028050C7C133B2A9F05E6A5AEA64A13092D6DAC664308C380000 +smlen = 610 +sm = 0435A302EC207A8859D14B66B5E2184F438A845CC2263F3AE5D1A480B2ED8604C23CC0C7937511F14F8674C81769180E401C2FACBEE247941E9EBA3E299577010003FFE41EC3D47954BD6CD2A9193F968F1C3C32535AB351AA7FAA2BA2052FF7C31822B2D7438E117C2B8B9D97F3C211934CF04FF10D61B834EF12BB8F113E0D4EF34C4B33E74539731095AC76DE822B50010402439529DF1864297E33956AFEE00A60099B658A67830A6A6ABDDC329E87831D9F9B647917FEDF1AE182A40402143285516FCAB83F447354C72FAE81AC26E7005C2AA561763C152E66BD80F14565F47DEFA440DBB491E7994AB9FE35995D5FBB3800CA030B43DF611141637A5246AB9D9CAC02EFE14AF60736B6BDB2BABB97CF21E831E5D04D41C00F090B154977900EFADD3A9313389A3F84CB3AC38E8B57B70A43DD08A8243F8154013FD5CF29DE5A8DF0B197C12B17E0610FCFE3625CC94067E01E23D23A243AD1C1F805CC50E1447D1DF93C25B8D76396BB7199E64129522462C5FC8B30C132D4EE9E0BF6F52961FCE7ECF650647E7064AA5A6574649A323E144D7C5491DE4C0A1A76D08F93F87A2FC7F6955FEF86991E62E2CB42908E83B0C0A8BC180B7453CED293F1E20F300431EC1D395E8A537F0BC36A673D491F14381DEA90D8F176D06031B0A7AFB40EA8F76D37FA82E2572B9799A5FC7CF4C49BC20AD78EFA8CD989A84D72ED680AC3C0F64155C56ACBFD7C7D628B418A489F961357F77BD62204ADB079DD3106485A37FEE535C9CF82E832D8AADCBF686976B806B02AE733DB46DB0BF162E973931C3E338CC86DB38C66262D1B2EBC7691B8281E0B20BF36305FBA996D20ECFDC695 + +count = 14 +seed = 0A98A2BD2B9FF42CFC18D3396BAD052E1D0F3372854DA69A318B142F7A1AAC609C3861263BD8FB0549DA7266784DB8B4 +mlen = 495 +msg = 8CB18850E27D8416B88A9A71F4A66BDF447814DB6C82098C371B53F61600EF5DFD88E4FB34200207C3F6F55166AF4878D38FCA7E2DC18FE662E3EA491B58A86246CAE16090FB7ADA53B9A67B3D0E3787D3323EA921274C60CFFB19A889BCF0300FE10E242AAE025F374DD83FBE9D007C8B9D9D75574C74146331DDEC6F0E49C10DBAF15654897E33E2B4780DBA484224AA6FAC79015D5792FAA2D532BB7D239B11D91420B98690B1FBDE9632223927E0804BFB284368A426C414C3DB8EA82F0D246413861475ED2DCA9E80FB4F3C34FEF7528069AE1975AFC52AC5AD2CDBCA1459E140F655556093210D7905A1A1E6CEEAEF0194A0B2EAB2C1EE853484E715D2A1DB551FDC620D5331164C74CA4848B61D408D2F2A943FA09EFEB63D524691C99DCC0B22CC61B98E6FB8039E5E0B2D7DE2CAAA900A44184BD56C9F02141A3AE8AFC661E3E898ECD3004FDB0704272BA780CD5DE35153B6FE223843024273642DCF8E4B58BE2AB1F61668680084AA0B75A32E766C8AE5EB30D4E02A12E6798DEA40F80D8DDFAD2041A52922701C689F46F49F84CFC05ECA6D7D4C356D50B6A0BA61966245D45134D6A1F5197540A1C39C36BB0B78831AF3F5156E669FD9213B64E0CF1C5A31E88AE79AD61757EC67B551B9F0A760F646BF81F6B92403A62840CC29FA4F3949B3A9F0A9A4286EE7808A +pk = 2FFC0E8FED091AE82C2FB18A662772DE22FDDFA4BAE6E6AD4B17CEC22C69D80254E447611A108A126DE83ACF74DEDEABAEA4D4B84073915AE7E9570A1EBDD1010B +sk = 2FFC0E8FED091AE82C2FB18A662772DE22FDDFA4BAE6E6AD4B17CEC22C69D80254E447611A108A126DE83ACF74DEDEABAEA4D4B84073915AE7E9570A1EBDD1010B75EB8A15C7EC864BC7672A49349BAA5C67000000000000000000000000000000E872B22AE8209620624CA2D13B71840AECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF897F3940C365CD68D7650E286E0D945131FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000007DEDE3A3D64DECBD3E6F53F9061269AAAC77BA4EA04A3AE194C5D1779422C7004163D29261CD0BED03884B15958ADB24174974165517E4997DA6F586B35CB40078A33430D410E41BB46F7CE5AF9DCED44BA9BAF147C04CF11E5BDB22A1761400D919350F1BDBEC9F4F5D4660292ACB4D47E05976D3F4CD76FE2E06E00CF4A700 +smlen = 643 +sm = 1ACBE3FBB26B8C020DD11DAB10262F631EF20863480A8582B2F3ADFFA01C4B02A86D4E6AC0F239FB42D59FDFC5DD867A5E477657E9BEC19CECF987E97E9AED00010226560DA2EB9A3C6AED4755F1D93C1805995E863BA186BC564D6CD303C3D25433AEF7EFB81490DC21593195B3010FDE51872D9DD8814F1D3C3935770D36F7D006501678C3F441B9D0E598D99730221D02190B8CB18850E27D8416B88A9A71F4A66BDF447814DB6C82098C371B53F61600EF5DFD88E4FB34200207C3F6F55166AF4878D38FCA7E2DC18FE662E3EA491B58A86246CAE16090FB7ADA53B9A67B3D0E3787D3323EA921274C60CFFB19A889BCF0300FE10E242AAE025F374DD83FBE9D007C8B9D9D75574C74146331DDEC6F0E49C10DBAF15654897E33E2B4780DBA484224AA6FAC79015D5792FAA2D532BB7D239B11D91420B98690B1FBDE9632223927E0804BFB284368A426C414C3DB8EA82F0D246413861475ED2DCA9E80FB4F3C34FEF7528069AE1975AFC52AC5AD2CDBCA1459E140F655556093210D7905A1A1E6CEEAEF0194A0B2EAB2C1EE853484E715D2A1DB551FDC620D5331164C74CA4848B61D408D2F2A943FA09EFEB63D524691C99DCC0B22CC61B98E6FB8039E5E0B2D7DE2CAAA900A44184BD56C9F02141A3AE8AFC661E3E898ECD3004FDB0704272BA780CD5DE35153B6FE223843024273642DCF8E4B58BE2AB1F61668680084AA0B75A32E766C8AE5EB30D4E02A12E6798DEA40F80D8DDFAD2041A52922701C689F46F49F84CFC05ECA6D7D4C356D50B6A0BA61966245D45134D6A1F5197540A1C39C36BB0B78831AF3F5156E669FD9213B64E0CF1C5A31E88AE79AD61757EC67B551B9F0A760F646BF81F6B92403A62840CC29FA4F3949B3A9F0A9A4286EE7808A + +count = 15 +seed = 9887F1FD854241A301EE0120645CD8E119B43F7BEE11F77A835E9ADF518C3A51CB76D86653FBE73AA716264C146797EE +mlen = 528 +msg = 9B64813C058F07A09A796FD764604EAF58CE144363702896DF0AB5FF26D5DE000D14BB8FD358FF5532D3B909AB62C18AC30F1900F84EBD3F4F18BD532D16C7B3470F0F8BDF72938C916DB18BCF1429DC1635B1C152C5F89A9EDB17116C11815A6C06273A889132923DA908FF39F4940A840D3CB575DC4D637AAFD37968EC61FC4EA04B4C320491A73ECFBDD8E10F1DFE902FCCEF93DD287ED872F67146BB8CA5A6ADCF0350E8BBA7F2F9762C4AA748FCE19748EB17334146C152FD63FAE3DFBB1A2C2B3C78960369551FDAC5D54643BEEAA59C1FEB0C21DBBB19977D848CD82A7AE0005F45956E0FE4700F14FBAA0C12FB8C65A6AEC95C5A5C8E79A6DA9C4E446872575C06AE49A31B82245E1757C7CE84D6D5DF3F642D3434B7E1A15A8B8A9DB460826B6CDCA69022DBF87595B582DDBB90A81E09A13C2AB1C125E4435FF30ABC9C56A00EDFA979F79D9C895E800D2DD6372FAE5FAACD83ADF8A6D55279D52DF547E9BAB39D99076AD7D297371344D35BD584E0FB5932F92FD5183B9250CD180FC645BEF6028C405B0EF35DAF783428173F1F2482AA1363640F66AF0FE8ECACC0DAB84ABD2A1FB53AF44445698CF1DDF4C2EA214DD339BE004E75BF76E95CA5C16981ABA5540689C1C1F1DAF4D0F89D62CCB3496340D61E7D5F5156FD3EDD02EDFEC8FCDD0B231697B0E66F4A3AAF46117532F5EE2CB4D2B3B82B0BEAE0A45A482CE9A976CC99AA82BEB0FE08CB68C4 +pk = 7790AB85CF173FBB7C1F1A3FA0616AC1C182F888985ECC93DD622A97D0D8B304A7319A93825E46AE9A80DEEFE0D7056F52C3590C6F600D641AF0CCF8A007E10202 +sk = 7790AB85CF173FBB7C1F1A3FA0616AC1C182F888985ECC93DD622A97D0D8B304A7319A93825E46AE9A80DEEFE0D7056F52C3590C6F600D641AF0CCF8A007E1020289C5EE9A96E759B52035B8179AA4C7D2E40000000000000000000000000000005CEDCE18E0965FDDAB3EBFA3E526892577FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C723CA0DEF3100064F4BF1E6904D4920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000006FB192983A5E8FBF0F7D1A19CC1347059E2E817954DFC89F06BC46AE9FC1B002DB7B47B4DCDAC1609295D3E353B33DE6D28D77F100C70F2A309004921628A002F89B6DC98054499525D20DD688FC7365B4255C656843BDE8185688AE8F1F3007527FB3DB9A44C8F689AC3EA376218246F9E3C46178BDCF403977231998DB600 +smlen = 676 +sm = C0B3DCE37EAF46DE0D8BA19F9B44944AFAA04CB0DC294D71069FBFB3A53C5002CF7A734EA1B08AF64306EAC3E611480D3E1BBE2EEC7F75133ECA531BE8CA2D010004B23D404D79AE3DFEC7089CA4592407BD99AB0C29DE8EAD5DA0ECA24BB730DCE07CEA4CB3081404164D46DFBF60CC55154687D2D6AD311D3F2F9AA16533E525343AB42973CA6A9A21FA9F703BD02D5F020B029B64813C058F07A09A796FD764604EAF58CE144363702896DF0AB5FF26D5DE000D14BB8FD358FF5532D3B909AB62C18AC30F1900F84EBD3F4F18BD532D16C7B3470F0F8BDF72938C916DB18BCF1429DC1635B1C152C5F89A9EDB17116C11815A6C06273A889132923DA908FF39F4940A840D3CB575DC4D637AAFD37968EC61FC4EA04B4C320491A73ECFBDD8E10F1DFE902FCCEF93DD287ED872F67146BB8CA5A6ADCF0350E8BBA7F2F9762C4AA748FCE19748EB17334146C152FD63FAE3DFBB1A2C2B3C78960369551FDAC5D54643BEEAA59C1FEB0C21DBBB19977D848CD82A7AE0005F45956E0FE4700F14FBAA0C12FB8C65A6AEC95C5A5C8E79A6DA9C4E446872575C06AE49A31B82245E1757C7CE84D6D5DF3F642D3434B7E1A15A8B8A9DB460826B6CDCA69022DBF87595B582DDBB90A81E09A13C2AB1C125E4435FF30ABC9C56A00EDFA979F79D9C895E800D2DD6372FAE5FAACD83ADF8A6D55279D52DF547E9BAB39D99076AD7D297371344D35BD584E0FB5932F92FD5183B9250CD180FC645BEF6028C405B0EF35DAF783428173F1F2482AA1363640F66AF0FE8ECACC0DAB84ABD2A1FB53AF44445698CF1DDF4C2EA214DD339BE004E75BF76E95CA5C16981ABA5540689C1C1F1DAF4D0F89D62CCB3496340D61E7D5F5156FD3EDD02EDFEC8FCDD0B231697B0E66F4A3AAF46117532F5EE2CB4D2B3B82B0BEAE0A45A482CE9A976CC99AA82BEB0FE08CB68C4 + +count = 16 +seed = 5B485527C3B9A5E5B7579950049CD357975D4BCFEF83FE33C087ACBFCC10A0BE4225E7F8A5F77203B5FC7C0B5FC0E78B +mlen = 561 +msg = 922320F7439E492F13C272A5738FF7122DD7A6B2832632E1F7A653FEF3B8639BCB9E84F482F22A948EA17DDE6958489593D2CB268BB52DF8ED612F2317BD6847D1622CF0532CB499ADC432233B93B6F7B1866B38975AC87859AC49F91E8D235846775F9E6E6D052339C741EF6178016EDB3D0B1E3F3536667B3EA2D489F88D254B8582421A31461374F465D7AD62E896BE0857134707A70477FABC09FE0A5CC3B3F32911F5FF3806B878205525AF69007F50535DF05C33AF3B0D00E297AC7EAA012E1D863DD5DD5FA47FB09467DBAD8BC42EDBAB42A9625BFDB9FE578343297506A3B71CDC8D5919955AF4605FCB0C7164D96A187AFF65D0F6210FEF2D11BA08D90C4458542BE72E084577BE9E451B8B6F4909884BCC5D25316ADCCD0925664D4D91C2E56433C1B68C632B0CA56D856DF1EDD5E113D1F026B30DAC4FD648A504F8F6809C701C97BCAC2B99286CEF5C1C923200B1BF6141EE1CFC51C5E14554BC02D7E058970254D2C02948360ABC4DFB439E66946A8AD615147BD8A6CB0886211E8B15DFF3C72B6F8908CE56BBC1B40E838103202E9F188D98E07555DB61778F895F76FBD838B6D14209D28EB393668924AC0E61072CBD9F93B864904FF4302DCEA131B2CA16BB04959ACEE096B1963CE07F59AB505FCC8D89FE08FC58751965F2F5CA753D76D58705652D3B1505E0F720EDE3142DE9776FFE4AA0C8A25E76C7A04843377C59F1002844E89189E22F621467B813A98BF07540A1649264F14A6844D65692617F7A4D93FA9A23829E256626 +pk = B0B75D7B56849A2A1B4215A1EDDE5E9A34029EFA56DFA5862686A4C79B719D01707AA4B41F1149D074494111843FAB524A354E80C7289E965800ADBC0C11490002 +sk = B0B75D7B56849A2A1B4215A1EDDE5E9A34029EFA56DFA5862686A4C79B719D01707AA4B41F1149D074494111843FAB524A354E80C7289E965800ADBC0C11490002DDC0EBBC5CAC0F2DEA12583A7A5C30F377010000000000000000000000000000F43EE5D8B708E918A47D74E2D3CBF9229DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FDFCCF71C165EECD15B174D38EC663C5BFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000E92B201218F1C05BE6248CD2A7D526B890B7E0B1DC4701E8B4D06BB3C03D8400C16983E9DF1C621AF68886D703BF37AF437D00730F45E8A38B96D98CC7387C0022134767157893763C02E1D87B570645EB2C18A260A2A9B7837130FE8F47F300A9A5F39E847173AA89D667AC5C42F472AAA017B9DD908103A0D8389279C7DC00 +smlen = 709 +sm = 7CF26512E963553EEBC1E3D78D3184C98B5D321BD1303C5E7A5BBC5624F27802B2EB66C75F14B135656751BDA8E526D62D9884C004718AE7A31DEDA08BFA570200016237B77B0A5F74ECC119D405E39467A2573DCBF64183BE7EA161A72587050C1602726ECE4062380074249D14E465584E92B247B3F7EDFE2AE891EC417E42D4E79D738CBBDF6C23FD2C4B66A7BDDF24000402922320F7439E492F13C272A5738FF7122DD7A6B2832632E1F7A653FEF3B8639BCB9E84F482F22A948EA17DDE6958489593D2CB268BB52DF8ED612F2317BD6847D1622CF0532CB499ADC432233B93B6F7B1866B38975AC87859AC49F91E8D235846775F9E6E6D052339C741EF6178016EDB3D0B1E3F3536667B3EA2D489F88D254B8582421A31461374F465D7AD62E896BE0857134707A70477FABC09FE0A5CC3B3F32911F5FF3806B878205525AF69007F50535DF05C33AF3B0D00E297AC7EAA012E1D863DD5DD5FA47FB09467DBAD8BC42EDBAB42A9625BFDB9FE578343297506A3B71CDC8D5919955AF4605FCB0C7164D96A187AFF65D0F6210FEF2D11BA08D90C4458542BE72E084577BE9E451B8B6F4909884BCC5D25316ADCCD0925664D4D91C2E56433C1B68C632B0CA56D856DF1EDD5E113D1F026B30DAC4FD648A504F8F6809C701C97BCAC2B99286CEF5C1C923200B1BF6141EE1CFC51C5E14554BC02D7E058970254D2C02948360ABC4DFB439E66946A8AD615147BD8A6CB0886211E8B15DFF3C72B6F8908CE56BBC1B40E838103202E9F188D98E07555DB61778F895F76FBD838B6D14209D28EB393668924AC0E61072CBD9F93B864904FF4302DCEA131B2CA16BB04959ACEE096B1963CE07F59AB505FCC8D89FE08FC58751965F2F5CA753D76D58705652D3B1505E0F720EDE3142DE9776FFE4AA0C8A25E76C7A04843377C59F1002844E89189E22F621467B813A98BF07540A1649264F14A6844D65692617F7A4D93FA9A23829E256626 + +count = 17 +seed = 327CE565CFF6CD9A25EDD84F482FA0758B78CBC246567DAE98B818314AE28CD438E339043EB3FF16E1C2B4B104A717B8 +mlen = 594 +msg = 576289D10AB03D5699EAC322D349F55C547101E4424BFA43BBBA3747B79F075AE1153A7A0AC8BB51D24FC46B7604E42EFE4343FA34AA4EB16D918F25E8A4D67C860CCA3F7480E1221ED3AE13A138F079FC252C6D7BEBC55CB81B86E74F339614BEBCF7E8F4440DF8678B01A4A41B3AFB1D112FE1C4C8D8C6BFE9D3EE2A335D477C60FBF43B2E5FFFE1546F5172EF51CFFB2A772E1575EAC79B24D49FD77F0BE351233E57EE6DCC7E2E29994873ABD434D34ACE83400C026E27E27888EA0BDD1BDE5A3E55AA8B5F2FEB57B8B0A96CD831906297C8169D04F15843A3249C50523CF56A4E19492EA16927DBA8759B88A99E0D20820E51FC9B6A6863115CF05C5BC3F4C869EB5A87124DF5DB102D737F3899CFAA5FEA4DD62DC4FEDB1AAFF67906ADAF8968020EFA5B10190F70E5F2C0F0457E4341BD449201D3A80AEB791254EC1C46DDCEBC3896C6DF702509BA62CD446D275806438EB4C03132B2E6BD01BD2F832D1D3C053C48C5A9DB1C4A22B130C4C9E96A2BF4C2A8F7DE0217A52D9AA5AEEE5E6A49708237EAB60B4019A51390C3EF10572A73D436875BB8D7D78543F96376E4BF3BCAABB92F89215E8D1093F3B287945708B5514BD7E62654D3BDF34B29009C64829A0CBF33C54D7AB0E81B81BDDA93028B341AB1DFF3D752DC4A1E5F9636A5C46E137EA35919D99E6571C5370C6E804BD2E2ABF566F035D65CF8F97E3E8F2ECAFA153BC6D8EC2831667A37FC96D1C2DA40BA84D0FB041DEF32AADAEF3F98CAFA957F6552F79D28A36B8BA20A9452671DE1BE8AF5D66714232507EDB9FF657F3D7E5FA7320FC0359A5F99280D446283BC +pk = C082B96BB794A392E699E06D5F731D28B5BF6CA360F285BBCA1B146084A13B01B98D3847005B0330ACABF27ABC781EC0E10C928CEE3635039F340206CA05830402 +sk = C082B96BB794A392E699E06D5F731D28B5BF6CA360F285BBCA1B146084A13B01B98D3847005B0330ACABF27ABC781EC0E10C928CEE3635039F340206CA05830402390E25F7B7E14B426B1FE3E0038AE95A65010000000000000000000000000000CABC1EB44B45E2C3AAC98109978A466724FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9AA9DDCFB2889DCA69846EFCBD82C7EBDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000004D56DAD58482B1F1A6B1D66D2E02F8232984CFD6CA585C8F2F57FCC5DA630C009C9938D7B4082A8909B3FB90D8CE292C20E2648CFAA6DB3E6831A63BD77AC500215E98C9E207673424A95D69F289A689279A1EE2449F51D3309ACBB6E32A6E0057C3CCCE8550DC72F269A2B1F14496AAD6238D4E5E20FD0FCE93565A00422200 +smlen = 742 +sm = 2507DE852449847C226DBB7CD44599D334BB8E31B7007BE238E2BE23BB358F016BF140FEB6ED7F83BD670A894C04CCD6B65E2D046932455B7FBDB21CF1662B04000033B3BFF2D6596472279F0C845B79EFA10B8C8C039F4D23DDAA9E475CC0C5FCF5E85BE6BD7E77CA35B478198DAF78F19985C66F14E11852B7E843F1503C486E38C1B51405BC84ABD1CC96F6214E65E2000B0B576289D10AB03D5699EAC322D349F55C547101E4424BFA43BBBA3747B79F075AE1153A7A0AC8BB51D24FC46B7604E42EFE4343FA34AA4EB16D918F25E8A4D67C860CCA3F7480E1221ED3AE13A138F079FC252C6D7BEBC55CB81B86E74F339614BEBCF7E8F4440DF8678B01A4A41B3AFB1D112FE1C4C8D8C6BFE9D3EE2A335D477C60FBF43B2E5FFFE1546F5172EF51CFFB2A772E1575EAC79B24D49FD77F0BE351233E57EE6DCC7E2E29994873ABD434D34ACE83400C026E27E27888EA0BDD1BDE5A3E55AA8B5F2FEB57B8B0A96CD831906297C8169D04F15843A3249C50523CF56A4E19492EA16927DBA8759B88A99E0D20820E51FC9B6A6863115CF05C5BC3F4C869EB5A87124DF5DB102D737F3899CFAA5FEA4DD62DC4FEDB1AAFF67906ADAF8968020EFA5B10190F70E5F2C0F0457E4341BD449201D3A80AEB791254EC1C46DDCEBC3896C6DF702509BA62CD446D275806438EB4C03132B2E6BD01BD2F832D1D3C053C48C5A9DB1C4A22B130C4C9E96A2BF4C2A8F7DE0217A52D9AA5AEEE5E6A49708237EAB60B4019A51390C3EF10572A73D436875BB8D7D78543F96376E4BF3BCAABB92F89215E8D1093F3B287945708B5514BD7E62654D3BDF34B29009C64829A0CBF33C54D7AB0E81B81BDDA93028B341AB1DFF3D752DC4A1E5F9636A5C46E137EA35919D99E6571C5370C6E804BD2E2ABF566F035D65CF8F97E3E8F2ECAFA153BC6D8EC2831667A37FC96D1C2DA40BA84D0FB041DEF32AADAEF3F98CAFA957F6552F79D28A36B8BA20A9452671DE1BE8AF5D66714232507EDB9FF657F3D7E5FA7320FC0359A5F99280D446283BC + +count = 18 +seed = 790FC03F956D1301A735504075B67A05944A762E0A4BDA77BB8C036C5CF911E2B561EC1CA6AA355D5CEC919AED42A1D2 +mlen = 627 +msg = 021E9C06A2E4EF63D1A61958620C40016783879080D44311E04F2A446BCAEE5A486D17FF0F356BA70FF1C2B55BF957A59202903AE349878CB822E04275E0AFAABC0803BB6CDE3741E0BF9FCE0C5D5C814977474533DC63F9ED4F32AC3477A3EC9893EF55186728C85B03F4C2E61CA7733E1706766AEB8FEA80E233E8761B57FD5A3CEF700196674B34A3A55F68B3368B688FB1DDC976FF48BA6A98E2D66023F291A3C617A56CCBDB8732B8C34369ED11F4CCEA8FC8F673AD9FA0FD8990BEF70AF44C617FDFA096695D0C94EA8E17554F4461DC776DB2F416448B17680FE4D29B09E57603D8EBF55771AF84D8D4B9097302901C25CB6D73932E67C323D12C8ACB0E74CB89755F7EB3999D4EAB5E1B775E6B5C29D9733697030A26F3B93B3F286DB0F2DBDA71E1F103878063E77919D8892EB6A34F821B603ED4A898A9F30D00FEEF20985FEF1A7B7AF70DD29C269E88687F005D551EF05EB0603FD38745AED4F5BF4C2FC09F0604C98AE3A89E46BBFE907B87A1672DE547D651F035F392A8D4DB5E7260F43953028E312B95B9F25FFF2C0C579218390411D13D9A25F22DE4C7AA05FD11781DB08977160D48E02372C7D826F5CAC37D1A9B4230BE99A2D13CC2E9B2B17F0A1044EB9E0A2FBA376D35CDD2BC05F57DCE4BBC3BF07A09BCDE369929E6250EFDC61689466B040AEA376B09453A2C16813BBB685B54A225C49008BA6811E8BB5B3627F8C281244FDF5533216D126ED0E64FDABEC533424BFF77FE722CC438CA7587C19D965F0BF085D8692C27C5C84A9DEE53256D978948D89ABDF9842E0B765BE6A507D8630CBC5CA7FA0FBCA1CECC78D2E536AA7B2B902C4379777AC0920D69C57CC4E6032252BDE99E1A555E80D4 +pk = 268966FF7D45C58CCC19C66859FCE50BBA2BF5850A88CEA988AD12F85F2F74004DDDECD5410DB5479621B08EB8C4C5B2479C28083B1223A2CF04BEABF44473020B +sk = 268966FF7D45C58CCC19C66859FCE50BBA2BF5850A88CEA988AD12F85F2F74004DDDECD5410DB5479621B08EB8C4C5B2479C28083B1223A2CF04BEABF44473020B61492A70197C05A3C4FA055AD0F19FFECC010000000000000000000000000000B8EB8EF2FC27E76C2C62DCE15BD20B3DACFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE44A3539585B355344482B00969860E2FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000A85B93764B1733AED0FD2D05BC76DA23900E926789A4B000996BC47D53163E0035074EADAF0C41A523E35D49587A038DFA656F139BBF2FF6BB03112AE575BD009B04DA06A80F0C88315A7337540DBC5148EDB13A8FF4D2FAA22616EFCC0CBF000147FB40BAFCA4547B17689ABA331CDD6B4405DCE3C259670AE13CFC0B18E800 +smlen = 775 +sm = 8D60389E4E56FD204D25140DA576BAFFBDCDB1D3B3B5C43742967A1C2F19C00034B844D9FE31CC146CD50E667930AD1B3757C1024223280847EA058F6291930200019EB5B88BAB2742625C02DEB29C33C47AB592865FCC9DF81504E407B37ECECF52C66AC1644DD79A8564216026961D1C8208664D341C15E7373777B7E5C9DF1162866772626AF1882CFF7A9AD23E0559010B17021E9C06A2E4EF63D1A61958620C40016783879080D44311E04F2A446BCAEE5A486D17FF0F356BA70FF1C2B55BF957A59202903AE349878CB822E04275E0AFAABC0803BB6CDE3741E0BF9FCE0C5D5C814977474533DC63F9ED4F32AC3477A3EC9893EF55186728C85B03F4C2E61CA7733E1706766AEB8FEA80E233E8761B57FD5A3CEF700196674B34A3A55F68B3368B688FB1DDC976FF48BA6A98E2D66023F291A3C617A56CCBDB8732B8C34369ED11F4CCEA8FC8F673AD9FA0FD8990BEF70AF44C617FDFA096695D0C94EA8E17554F4461DC776DB2F416448B17680FE4D29B09E57603D8EBF55771AF84D8D4B9097302901C25CB6D73932E67C323D12C8ACB0E74CB89755F7EB3999D4EAB5E1B775E6B5C29D9733697030A26F3B93B3F286DB0F2DBDA71E1F103878063E77919D8892EB6A34F821B603ED4A898A9F30D00FEEF20985FEF1A7B7AF70DD29C269E88687F005D551EF05EB0603FD38745AED4F5BF4C2FC09F0604C98AE3A89E46BBFE907B87A1672DE547D651F035F392A8D4DB5E7260F43953028E312B95B9F25FFF2C0C579218390411D13D9A25F22DE4C7AA05FD11781DB08977160D48E02372C7D826F5CAC37D1A9B4230BE99A2D13CC2E9B2B17F0A1044EB9E0A2FBA376D35CDD2BC05F57DCE4BBC3BF07A09BCDE369929E6250EFDC61689466B040AEA376B09453A2C16813BBB685B54A225C49008BA6811E8BB5B3627F8C281244FDF5533216D126ED0E64FDABEC533424BFF77FE722CC438CA7587C19D965F0BF085D8692C27C5C84A9DEE53256D978948D89ABDF9842E0B765BE6A507D8630CBC5CA7FA0FBCA1CECC78D2E536AA7B2B902C4379777AC0920D69C57CC4E6032252BDE99E1A555E80D4 + +count = 19 +seed = 716354F7DEAE272CD26929C0932CA257AED1DD23D67260726B5213D82E61466FA99BB6A7D81DEE9D0EBE03DEEE4DBFC7 +mlen = 660 +msg = 7BEDAFEBABBBFB863CE496475F54E69A905AFA45899C3D7C16CFC73E31597D2404AE7014612E4CBFA238EFAF5B396B0B7435ADA5DE817E013188C280423C68924E1FA2A33CA56E6B85B7CCA7F00D3A6151F0629C1B92A13573320E0025863BBA7F3EEB987EE1B1A6230B10765DFC1FEEA498AE4B83521188E7503B506259103CEFB370E3651B06DD4F08013FF3AB9E2430626B0BD584232948462D85C0F82DA07B96FC65F62A43CD2F132D1A1D691C085980DAD8796CCE2FA0B268395EAC3DA2CC400F30F75BE87316216980CE213B48651DDB9E294F8CDB2CA05D3F2A507E4A03E2849AA8062918AFB5BCE9E4C3ABF2FFD4751DDDCF08AB09E36A29B830F3BAC6FEEBEA084575472E6F4B239AF89965A72954769A83E391DE467934237B07D8884A6B14CAD034FBF9BD7531D50D742E234E227E1A2DAF77A2FFACC579525134B15186D81AE6E5538871024BD2897475D6EE5B11BC51EDBB928D98475073785A75B331BF3D2297165AE6CF95C3A05F06DF747498462054F58A5AC736F96014B1A8CDB319D030D06DAD9CAB2B913F35FC392E1FC4B027CDBE775D64B04F1076A7C8F44C360745F98E87B84C18AB76F84F373F635AF4C8A87DF08DD4507899BAD892FF8CC1EE534D3277B5B82095628B84A7D5582149CF46C50AA963B56B4B91966B106B4B2EAA45D83A10993E8F933370AB29C6606B7CCFC41B21C6B99F2B9AC643E24300B350FA199EC10E64E4AF19181F78E8C43B2FA796241DC42CC8992BDFCDC39E7BC41BE68CDCE4FBC47C996DB42E8249EEDC146C216B514430C705FC939B9EEF677AD87F9CEE3398551FA0DAF774302324A410F4A4F4FC035CFBE960B38C390441E92D9E5624A8745976BC88FA538E398712361B77AD4CA5FF038D9F6CE157EB8A6137420D4E57018275DCEEBC4E480A5D +pk = 2B3356902E3F747E37FB0086D556CAE82E0C5D1F82539DF34997499D679A6A00E74F06CEB783BA42CEBCDFACCAD7BE268A84CECFC24595645FFFD8C66141020104 +sk = 2B3356902E3F747E37FB0086D556CAE82E0C5D1F82539DF34997499D679A6A00E74F06CEB783BA42CEBCDFACCAD7BE268A84CECFC24595645FFFD8C66141020104D33FCB8410DE03D5E56EF6785759ECA7B4010000000000000000000000000000AE0A33EDE2986C375A647FBFDD5BCD3D99FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12975399A57784E4E829528875ED6E7D0FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000007E9597975D4D69659D4CBFA66623C85AF9F126CE63DBE013F432FE5EB79BDF00B91FEDD875565EA93C1B56A3C9F42FCF9B6D4EDFA0B83BBCE20BFC3DEDF032001D7417C5083C6F900D6B794E122D0114EF64DDE8F9290BB511C66178957CD40014E31EFE69F9559A74B6687B0788DC6CB576371EB2FD93075878821AA0674100 +smlen = 808 +sm = 8F4D73F09ECF74F8A000E111B8AE356899D65A1A85EE750A6040A7808DC8FF027AB20A171DCBEAD08727CD30605A25702F1A69BCB098FDBB479AFAA00049E200010004ED6C00F15B6B79BBCDD91816A547746B9987DAA7AB23CF354DA879C4F5F9503FCF0FD636AED7515D3B463B1623350A6E8109D0973FBE132CDA7EAE6D66D866461D3646D092E3DD352FE3915BC60701110B7BEDAFEBABBBFB863CE496475F54E69A905AFA45899C3D7C16CFC73E31597D2404AE7014612E4CBFA238EFAF5B396B0B7435ADA5DE817E013188C280423C68924E1FA2A33CA56E6B85B7CCA7F00D3A6151F0629C1B92A13573320E0025863BBA7F3EEB987EE1B1A6230B10765DFC1FEEA498AE4B83521188E7503B506259103CEFB370E3651B06DD4F08013FF3AB9E2430626B0BD584232948462D85C0F82DA07B96FC65F62A43CD2F132D1A1D691C085980DAD8796CCE2FA0B268395EAC3DA2CC400F30F75BE87316216980CE213B48651DDB9E294F8CDB2CA05D3F2A507E4A03E2849AA8062918AFB5BCE9E4C3ABF2FFD4751DDDCF08AB09E36A29B830F3BAC6FEEBEA084575472E6F4B239AF89965A72954769A83E391DE467934237B07D8884A6B14CAD034FBF9BD7531D50D742E234E227E1A2DAF77A2FFACC579525134B15186D81AE6E5538871024BD2897475D6EE5B11BC51EDBB928D98475073785A75B331BF3D2297165AE6CF95C3A05F06DF747498462054F58A5AC736F96014B1A8CDB319D030D06DAD9CAB2B913F35FC392E1FC4B027CDBE775D64B04F1076A7C8F44C360745F98E87B84C18AB76F84F373F635AF4C8A87DF08DD4507899BAD892FF8CC1EE534D3277B5B82095628B84A7D5582149CF46C50AA963B56B4B91966B106B4B2EAA45D83A10993E8F933370AB29C6606B7CCFC41B21C6B99F2B9AC643E24300B350FA199EC10E64E4AF19181F78E8C43B2FA796241DC42CC8992BDFCDC39E7BC41BE68CDCE4FBC47C996DB42E8249EEDC146C216B514430C705FC939B9EEF677AD87F9CEE3398551FA0DAF774302324A410F4A4F4FC035CFBE960B38C390441E92D9E5624A8745976BC88FA538E398712361B77AD4CA5FF038D9F6CE157EB8A6137420D4E57018275DCEEBC4E480A5D + +count = 20 +seed = A32E6FF879EC8866A5F5E4F6318DA8FE6743812ED2CF5FB94F5C3AA3EDF953CBC32665810B71B2CFEBF343A571CBC570 +mlen = 693 +msg = A86EE95388DF139F9C5A84108D1E63F7A7842909B818E9A0425C257649ABF125386FB5286031E7E6D0EEB85C452E254DA39BBDA51F0D2167EC0A51992753DDFA76874AA80804E705CF8BBADF3B82B6D7FBA3D1CAD130ABCC0B44D6D893356F3E94BF8E82AC532EF8C5E5F4200207BCF6B754F14E57A889FFB753F516EF8DE2A647FAD8E449264F0BBB4CF48BD01501736DA49509C3426A3D4108B98E6A4AA6C4430E8EE76540051FBD1DFBFC01750E26547F8718EF7D897A0342BB000FB99AA63B781C9A4B831DA798C014E58725E03D2F8B1A029C3337F4099239244AA320965B2CB5075052D901B6077A18C1ECFA5F272850A475B5F6BBC83F3C09A27072F80743B23EC6A9870913EE2805B4D296B2F81A9D733E5C8D5C0B477E51F9328AF3AF8ABED960408AFECD27FBDD08FEF50F4B07959646E0A02104A69674294A79DE0B25B65F4DBFA797E5FA56D66E8BC07D5E2E7C7D2E845699ACEA3BFAC60B2C0B988CBAB949A5B598D8E2F1AEC66196E115AD7F237A1C7FCFB95A1BBD6939A250E7BB0F4A02C23CB1BD81090CB770E3A70CB081D121BD0BD5ED1DC06D61282B98BF2DD7B13D2C6CF833891C67951D7D0F429EBDE3F1DA943ADB8AD285E6F13F798D6CD9A0A06BCD6125EBAA48F8F3BD5100A122F617817E3C42EBC3C3B154258FA26B9FD886EBFAD42DEDC6A2C4F9986BAD88A2A79D7EE603554E9CFC5FE33A3A171CF7BA94FD43228019B2F6FF96A8ABBC58D2098AD95A95442F6858EB69E131D7BCADAD81B9BB69D7682A978279B631E22927DECFFBEFBE8FB2E51D46A3FCA66225D30451CEF9953EF94F30B99F2B26EA75B84935EA4FB257DBE5734454B8087B3A4E115C6D31E72709303E9F0BB8C86FC6B11B93B53F9781BB92851A5CB5DC00D0B4E15683DBE4EDBE986966FE1F711F24DE9A0E1BEAEA8E835C70CDDC589773D31191B74AF780EB69867829ABED6D3FFA94D577 +pk = 61DD57686D6A276C4B4E0C0C1CD6D7A86AAC16351D7D7679AA0257042F381F030FC2308DF3B7935AE1E5D4B79E886D46FC2940A5FA86843EEB9595A6204BCE0202 +sk = 61DD57686D6A276C4B4E0C0C1CD6D7A86AAC16351D7D7679AA0257042F381F030FC2308DF3B7935AE1E5D4B79E886D46FC2940A5FA86843EEB9595A6204BCE020273DF5F09B0E52572A01E7074203B24AC17010000000000000000000000000000B2439C03CD89BBE18F49BDD2D412670F75FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF2BDB02BAD81A4B9D38807349A35A895DF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000D78814A356B4DB08DC5A76D457E64134A9B6509D4EDD543924D202E9C04780000B2CBA2C8DBEC75EC7328F17AD4C0A1E3810B418BA988CF1335DC026FB8CD200BF3F1937EE5686ECB10409F6548DF9DC36ACCD67546C197D65804A04BC38B80086FC9779BBC154F896ACCC08FBDDA75C373A4EB89936241C023B3169FB6A5600 +smlen = 841 +sm = 713DCB84BBBBF5ED0EBD2C77C9982CCEF05F763D4058469FA930EB4718E85F027924280D54DBD2FC7197A098BB87EDE0E74AC3FDEB726C0984CC27CA54EF6B04000067AE461820B536C36181B12DA76D31B8B490B449BEBB8EDFA1F089F6703ADCD86301C475C173A08753449AF719CB1015E9FB1C1D6730E9573C64AB603FD8E7BC0210B7E9AD2FA53A42F5E004B272D9031719A86EE95388DF139F9C5A84108D1E63F7A7842909B818E9A0425C257649ABF125386FB5286031E7E6D0EEB85C452E254DA39BBDA51F0D2167EC0A51992753DDFA76874AA80804E705CF8BBADF3B82B6D7FBA3D1CAD130ABCC0B44D6D893356F3E94BF8E82AC532EF8C5E5F4200207BCF6B754F14E57A889FFB753F516EF8DE2A647FAD8E449264F0BBB4CF48BD01501736DA49509C3426A3D4108B98E6A4AA6C4430E8EE76540051FBD1DFBFC01750E26547F8718EF7D897A0342BB000FB99AA63B781C9A4B831DA798C014E58725E03D2F8B1A029C3337F4099239244AA320965B2CB5075052D901B6077A18C1ECFA5F272850A475B5F6BBC83F3C09A27072F80743B23EC6A9870913EE2805B4D296B2F81A9D733E5C8D5C0B477E51F9328AF3AF8ABED960408AFECD27FBDD08FEF50F4B07959646E0A02104A69674294A79DE0B25B65F4DBFA797E5FA56D66E8BC07D5E2E7C7D2E845699ACEA3BFAC60B2C0B988CBAB949A5B598D8E2F1AEC66196E115AD7F237A1C7FCFB95A1BBD6939A250E7BB0F4A02C23CB1BD81090CB770E3A70CB081D121BD0BD5ED1DC06D61282B98BF2DD7B13D2C6CF833891C67951D7D0F429EBDE3F1DA943ADB8AD285E6F13F798D6CD9A0A06BCD6125EBAA48F8F3BD5100A122F617817E3C42EBC3C3B154258FA26B9FD886EBFAD42DEDC6A2C4F9986BAD88A2A79D7EE603554E9CFC5FE33A3A171CF7BA94FD43228019B2F6FF96A8ABBC58D2098AD95A95442F6858EB69E131D7BCADAD81B9BB69D7682A978279B631E22927DECFFBEFBE8FB2E51D46A3FCA66225D30451CEF9953EF94F30B99F2B26EA75B84935EA4FB257DBE5734454B8087B3A4E115C6D31E72709303E9F0BB8C86FC6B11B93B53F9781BB92851A5CB5DC00D0B4E15683DBE4EDBE986966FE1F711F24DE9A0E1BEAEA8E835C70CDDC589773D31191B74AF780EB69867829ABED6D3FFA94D577 + +count = 21 +seed = 5A64401EF8E63AEE18E8CC0162845DC7AF388230E86728ECB330007F2546F949764273EA05B397FE71F567E1527FA445 +mlen = 726 +msg = F5ABE373CE1F6FB14F2014F5BC0071B17AB2C84E8845FCBF4B15C79FBF2E5E06CFFE6CAD9A283014A975F81C9216B261CBC79EDCD58D0E20C586D7C641E0EE97221BEFE54DBCC56A594DF103EC24B52DDBB6052D1644972640F39DEB98997FEE7A252A65070798B7E46707FA440375B1BA705B3ECC7EAC56D9C45297E585299C7D747B430F0D01E82081C70B4A87846F90267D5163181DED63E089A00AFD33B0E2B3ACE91182D8CC899223CE65A5D84B86BB3E8B34B13949BC800F2145468BA5411EACD6A6C331C340D4442D28EFA0DA959A2797C7181BD4BBE6E6DFFD134CEF373ECB0EC08590F06BE0CE292D3718E2C0EFC7CB40F1DB26F5F38FDC82A72F81AFBBC16591EE02DC818D63CAE69FF0A28F942F7E07F6B0A741F3F0EBE3D0EA5859024AA408462D3D268C23F95D717C0A685A4CA73AD90EE923DB57CD6CDD828B7AB0D4AFA6A9AD7E32D407A44D7515C0A6AF52A66AD72119BA1DAEC6514DE3F8B462EC473072226AAD61135B0F5EC646BA9A127C9894E51FDD1B2D38011A2A6D7497A55283133695D0AF9B3FF7C5A8FD667231F9E511E3B8C4C3ADC44D02DE08C47B2382DE67B32826754C6BE5231CE0FC657341E20247CC6CE574F3D1A9376AC8237B49E5030E877A4E33CDE25D838EAD659EB1678706C759707FC66CE84CC968A8334C18F1632348824A6985A0331A93B59497B70C1A03A6848F18F5992972BC79F07F4222D2612797F495463836AE6CD3858D5B9BDF744A1CF361B5D454D41AC899A4FA61081B937CBABBF0FFEC1B31C162224EA36CA2CD7FCE54EC1A504932ACC5BD0B17A156DA7488F7017E4916A687FDE7FCEBB2901813B07964084AB0447A94DAC3A0D3FDA05B9F497CC1555A8C74838E29CB8CE89D304DEBE419D26BA7F3DC6E9526BD895495A5FF1D7EC83F70D045E306E7C2487A52CD7553F062D31888EF7FD27F667FCFFA984AFE0B9A4C4E85CA943812CDC157C5486B0B5EA6DA05E4BB8697113190321A976D1806DA129101E60A28B7 +pk = 1273720A793E41C28395620D5B12952D74FB7167811915108461F7BC385E2303DDBED4DAF208CF73B3C56EDCF50E28CCFC8B302961236C91433EAAE9C42F310104 +sk = 1273720A793E41C28395620D5B12952D74FB7167811915108461F7BC385E2303DDBED4DAF208CF73B3C56EDCF50E28CCFC8B302961236C91433EAAE9C42F3101045FC7FA52F4CCFCE9195C0F94D43F8BFC3A0100000000000000000000000000002C8697E44AA8834B602BD3217151274607FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5F32C419BCAD4E68AD00D40F2946A823AFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000027DCDFDAA7E8DDD8CAC175EB06CAE8ABD95FFC7930913F28DEE152CF0D8475002DA2D73C100B7349228464B2072DED7705B5DEB5096499C18F25547801C49C003BE1DFD65A9C17BC8E1D5C0574197AB60B1E1FAD211BF06AC8D0C08460A0F8005CB4C9D010FC557E7BFE21AC8B6D4A262474A6D2ABC0821CDA3A40A996BEAC00 +smlen = 874 +sm = 240ABACC54BE7C4935AEB19035D93FFC912DE8C988AA52A446579923C0B98D0251A01DAC99AF2D5EBCEF7B8DAD1B16D0BF8100153F2A823CB99100A9035B1E02000277D8C0A0F680D0B2BD81D46193C92EFB0E883B46BA2A6E9C4E212E86458E3AE1CA6220B44B405D9244E8010E0BF3173F08FD4150DBFC65398FE321A2868158FBC3CEEF982A75BC7BE6ACF69D54276502250BF5ABE373CE1F6FB14F2014F5BC0071B17AB2C84E8845FCBF4B15C79FBF2E5E06CFFE6CAD9A283014A975F81C9216B261CBC79EDCD58D0E20C586D7C641E0EE97221BEFE54DBCC56A594DF103EC24B52DDBB6052D1644972640F39DEB98997FEE7A252A65070798B7E46707FA440375B1BA705B3ECC7EAC56D9C45297E585299C7D747B430F0D01E82081C70B4A87846F90267D5163181DED63E089A00AFD33B0E2B3ACE91182D8CC899223CE65A5D84B86BB3E8B34B13949BC800F2145468BA5411EACD6A6C331C340D4442D28EFA0DA959A2797C7181BD4BBE6E6DFFD134CEF373ECB0EC08590F06BE0CE292D3718E2C0EFC7CB40F1DB26F5F38FDC82A72F81AFBBC16591EE02DC818D63CAE69FF0A28F942F7E07F6B0A741F3F0EBE3D0EA5859024AA408462D3D268C23F95D717C0A685A4CA73AD90EE923DB57CD6CDD828B7AB0D4AFA6A9AD7E32D407A44D7515C0A6AF52A66AD72119BA1DAEC6514DE3F8B462EC473072226AAD61135B0F5EC646BA9A127C9894E51FDD1B2D38011A2A6D7497A55283133695D0AF9B3FF7C5A8FD667231F9E511E3B8C4C3ADC44D02DE08C47B2382DE67B32826754C6BE5231CE0FC657341E20247CC6CE574F3D1A9376AC8237B49E5030E877A4E33CDE25D838EAD659EB1678706C759707FC66CE84CC968A8334C18F1632348824A6985A0331A93B59497B70C1A03A6848F18F5992972BC79F07F4222D2612797F495463836AE6CD3858D5B9BDF744A1CF361B5D454D41AC899A4FA61081B937CBABBF0FFEC1B31C162224EA36CA2CD7FCE54EC1A504932ACC5BD0B17A156DA7488F7017E4916A687FDE7FCEBB2901813B07964084AB0447A94DAC3A0D3FDA05B9F497CC1555A8C74838E29CB8CE89D304DEBE419D26BA7F3DC6E9526BD895495A5FF1D7EC83F70D045E306E7C2487A52CD7553F062D31888EF7FD27F667FCFFA984AFE0B9A4C4E85CA943812CDC157C5486B0B5EA6DA05E4BB8697113190321A976D1806DA129101E60A28B7 + +count = 22 +seed = 3222E4B55D6767E300FDE03DB3D8227E19FB8B08EA9B923FEDE18D699DC3694EFFA7C4DAE2AF57E4A0162B7C564199BD +mlen = 759 +msg = 4C4697A7D8195BC7D4B8F2FCF3A7E9419E8FC9AC6BAFC5D658260511C697286BFE44E2CE98C21C98BE42E5AF0FCEEF8AA54C5770AF287A81C7481FE3391A6111AE6243D545B2A651599B45931D7640579F8659A8BD6F77260F235F71476ED64714FDDB70C549CBE089322130F7B0A21F530508970D55CBA55BAEACBEDF684C7979078102ECFFC2C3F182F710280CABC2DECD3D3B5D3CE908CB2307B00FCC0C5412A12AECD041B5F70CC0149390312B9C81592BB0E2ECE83D4495944E29AA798DE67FD69E2BD0695DC573F78D8BB48E6B8679E1C50D1E6E58E218B77EE51597EB43ECF7301D86F457353D60E98CEDC95B4A76844E889BF7E9D03503757569E40D55AB43D63293EDDBB579FE981FFD4DAB056F85006FFB5E759B9C16F5F6B235D7DD78458A73EF37118EDF599AA504E9DB9AB5DBC90B8E478F3DC1F35A7C4604A383BBBB410CFB2C5F746F83EF94BDB2F244D421818C26827D5B7D665B8A802181EB7A9CE95B6633E24D914FECA7E969F64038ACC3009B15168426EDB67AF2CCF4E859F5C616891D355F7910ACFA599C396BBB2D2782CBF1432E6259FAA77730B6B86FE0D67730152CD2AE0F9B0314048CCD25772C01FC9773EBF06618A8CE1E940F48663427775990CDC41C4DD3E9AC6EDA1EA50E04F1D329E64C8532A7AE32238C131753D60A25810A5FFBEAA9007A6984EF69EED92B777E079CE0FF48C2AEE9C18D1DB9F49B5419EC6C0E2212DDD2E2FDEAF0FE9F2B84D9C50DDE86A70FC28BBF8918A973CC67A36E97CE3027D73891E7AEB24BAF4B12A9DC8AAB5D6AFA380BFAC3703D2D32F1E40FBB532FD6D7D710DC0741DFC7EABFE55BA5C311A00E3BE55C2EE74155E3A06685071A962D7532AC76D59FC187EFF01F8D339F74323732168FA5D14F4B2A72C9164A04A6EF14BF5DEB1833E4BAA19A55AE590F542D4448E0EAFF0E0AFD2FB30FD671631B9325F4A0BAC9A43DCD2840185A2F601117A625B0DAD5503578537BE2A535D2F556F371536BCF68C0E01C96301F08E1567DBF9D8504096A8FD89C086DB695DA191099FD1E8EA94035276D1D +pk = 58525BC4FD6D1F4BC7AEB8F2343779E42F718D076BC0BCF05AA26399A3446201FB37C7D7B94585F09917F50F9A2A78280A4DDDD7B713B0B8584649C9839C230302 +sk = 58525BC4FD6D1F4BC7AEB8F2343779E42F718D076BC0BCF05AA26399A3446201FB37C7D7B94585F09917F50F9A2A78280A4DDDD7B713B0B8584649C9839C2303024BAA847468BDB1D066230C0157F5DD4267010000000000000000000000000000C6EB3F613B9B0725BA86CD4FA95E632BF2FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF81F97868D18E4525E35048A8B09B16BF18FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000D720608A068FD5FDC38410BF2DEC338D05379FF029A88478502B30C21F21610070C9C56187D080A9D9840CC30D4000B1F899EFD9994D461E9F6581BB14E077003F4CCF6B1A829DFBDFB4CBD811194386C74E750F241BB0FA68C862EF23973000F1EBF1924FD71E996AA24511B59F82D917799BE73DA176BB78A7E94108342800 +smlen = 907 +sm = 2E04C0D9993AB76842554AC6CEF517B09AB13820AE09581D0BE0DCE34D3F7902FE319473B5D4A253A4552F5149E6CC4D8B34958DCA9FE74BCBD38952FC73F2040100ABDC254987B1E90D9401D28B06B478341F2334C86853CD4809C80BA5B6E71D117F7AD1F0287A7EEC26591849531EF02B20178A9D66B07D7638733A47EBB0010B5C237D23100A5D5E2D4577195B056602040B4C4697A7D8195BC7D4B8F2FCF3A7E9419E8FC9AC6BAFC5D658260511C697286BFE44E2CE98C21C98BE42E5AF0FCEEF8AA54C5770AF287A81C7481FE3391A6111AE6243D545B2A651599B45931D7640579F8659A8BD6F77260F235F71476ED64714FDDB70C549CBE089322130F7B0A21F530508970D55CBA55BAEACBEDF684C7979078102ECFFC2C3F182F710280CABC2DECD3D3B5D3CE908CB2307B00FCC0C5412A12AECD041B5F70CC0149390312B9C81592BB0E2ECE83D4495944E29AA798DE67FD69E2BD0695DC573F78D8BB48E6B8679E1C50D1E6E58E218B77EE51597EB43ECF7301D86F457353D60E98CEDC95B4A76844E889BF7E9D03503757569E40D55AB43D63293EDDBB579FE981FFD4DAB056F85006FFB5E759B9C16F5F6B235D7DD78458A73EF37118EDF599AA504E9DB9AB5DBC90B8E478F3DC1F35A7C4604A383BBBB410CFB2C5F746F83EF94BDB2F244D421818C26827D5B7D665B8A802181EB7A9CE95B6633E24D914FECA7E969F64038ACC3009B15168426EDB67AF2CCF4E859F5C616891D355F7910ACFA599C396BBB2D2782CBF1432E6259FAA77730B6B86FE0D67730152CD2AE0F9B0314048CCD25772C01FC9773EBF06618A8CE1E940F48663427775990CDC41C4DD3E9AC6EDA1EA50E04F1D329E64C8532A7AE32238C131753D60A25810A5FFBEAA9007A6984EF69EED92B777E079CE0FF48C2AEE9C18D1DB9F49B5419EC6C0E2212DDD2E2FDEAF0FE9F2B84D9C50DDE86A70FC28BBF8918A973CC67A36E97CE3027D73891E7AEB24BAF4B12A9DC8AAB5D6AFA380BFAC3703D2D32F1E40FBB532FD6D7D710DC0741DFC7EABFE55BA5C311A00E3BE55C2EE74155E3A06685071A962D7532AC76D59FC187EFF01F8D339F74323732168FA5D14F4B2A72C9164A04A6EF14BF5DEB1833E4BAA19A55AE590F542D4448E0EAFF0E0AFD2FB30FD671631B9325F4A0BAC9A43DCD2840185A2F601117A625B0DAD5503578537BE2A535D2F556F371536BCF68C0E01C96301F08E1567DBF9D8504096A8FD89C086DB695DA191099FD1E8EA94035276D1D + +count = 23 +seed = F41B3C6225245C06455272A6A073F363E5F19F09A0B146AFCDFC2B3B0EA64BAA3F90359F32B2D1017608B03064E90AB2 +mlen = 792 +msg = 72713EA55F1E5CCD5787F172657C6F6C74081DE2D70816E8531497965DF02DAC04D91C4D09DCF8904CB152E2138F829386F4351015DA253A5B5EB92D96E537DAE3CE809443EA90332D9C754EB11F4DE586A83B5DEE7B1B9BD547EE7107530249B14279BAA04683D74B69D7BFC8BBCD447FE7706593C01188FE6AD8D0E2572D49F83E93986B380D4169BDD94E3311941DD2B041DFABC5AEA1297C65BB5C8352C99FF838D46B93B3E5F79E3CC5BE5408FE5E59A10D488DD65A997B086FDD96CEFB0247B2BAF7B490317E34330A879D04E374C92ADA33EE243D84DA015FDDEC243B00BD7488AEFE373E8AB1890273A7A2285988E9DAF9C4E7C5A17F54AD6195EDE2C79657E1BCCED0641E20F7EE26EAF53DD8C82827F2D2783D44FB030C95791F41653E628062267A5CF534DF00116C1ED1DE9F360B97555C65CDD80724104FB1BD4DA5785B5D9C24438557E48AEE58D57A03E06D553B05B67E1C8D10085C2F153647F174F7922FB8D2210454F7014BDDBC627756EB7CDEF99B6E3A2779F82088E3F2DA14C2DCB5B185AEB5D6ACBFAD43E286AAE8F84A58E8DF6ABC64E4A8EFD69FEA18DBFA6808F25FD418DE8BA923500B74E34DDA3CA6AD8DC208102DC4A876D8B8CD2926AEA4B3AE11A546F6235ABEA152DBDF43E0BCDFCDC83299207F294A707C8B4D1F56AA64A205C718ACA69B862AFE7489F11B324E7AF6BE68380D2CA6E0AF0E2E20F890F2CF98907A9D43135C03E85E86C9EE417140EFEE9054B46C110A84F1841AE3CFAFE5B4A95D6B2B606D8D0A70BAEA85C9412BC2D54146E9F866800E8E8615A0D64D1D595677E8C88699E3CA6097D47E9FE64050FB55033FAD4D5F226DA8EB5DDF99369ACC7552927ED3AC7368B9EFEA2443926DF26D1C172858FD8A5D4E1D7D39E7F7DF047385D39131184087CDC45B299BD1F7048E918223DA3F960608E853EE49EA667465DBBD889CBDA20FFBB540C9EBBA5C2CD16A22A57B561E01331D6EA6BDADBD6A5D2BD1441EF4E1D9DD11CC62A0FA5BBFFCBED0D27B6ACAF0889EAA5863DD9BB35920707B71A0805630D1769FEA320516E71CB2B125AC274F16F7A6876F4B922C7C006F38AE1F7183CA768715D2AF +pk = 35D7C402FEA01371E5ABB0FCF458D9163373FF86DE4B61F00B3878D2C7DED5021E58DDFAAB13DCB9BD99854EC607317286D2AB412389F62B9F279C7F83C25A0304 +sk = 35D7C402FEA01371E5ABB0FCF458D9163373FF86DE4B61F00B3878D2C7DED5021E58DDFAAB13DCB9BD99854EC607317286D2AB412389F62B9F279C7F83C25A03048B075976A3006766D9DCC252D131EA9D68010000000000000000000000000000C4DCFB6A3217AA381A535DCDD4A844285FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E68CA38172F4E94A3BAD2FE42BDDA7F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000005F62A04830CBEC7EC30568A8ED0C3FEF7331DDF5FFB2FB0DD27FA89C0DF5D00047D816C18403088074C4F0F55ECA4FFBDF7A0DADBA6D673709999032C09A470088E995BA090E804A3A014A92E6B3A79C28610437CBD9D70FC14C331F39561B00ED06A513CB4A3F79E6E522E01A6E29708E1685903E82E0E570AE5DCA0DBE6F00 +smlen = 940 +sm = 6D82B9CD0B3B921F52F3EEF7C9985741393062A8C6E7263F80D812C1DBD3C003AE948EAF54F735ABA74488A60CF3D723A9A1AEF56DBB30A7EB11E21013F158030000CA034890876DF80CFB4E68BC9179821C61A73AFB04767E75E5519FE1F3C3B2DEDB210F95CB73DC88ECD9FB51F22EA34A588202C70B21CCAFF6F8E646929D880DB6762386B202D7C119255552DA38BF030C0B72713EA55F1E5CCD5787F172657C6F6C74081DE2D70816E8531497965DF02DAC04D91C4D09DCF8904CB152E2138F829386F4351015DA253A5B5EB92D96E537DAE3CE809443EA90332D9C754EB11F4DE586A83B5DEE7B1B9BD547EE7107530249B14279BAA04683D74B69D7BFC8BBCD447FE7706593C01188FE6AD8D0E2572D49F83E93986B380D4169BDD94E3311941DD2B041DFABC5AEA1297C65BB5C8352C99FF838D46B93B3E5F79E3CC5BE5408FE5E59A10D488DD65A997B086FDD96CEFB0247B2BAF7B490317E34330A879D04E374C92ADA33EE243D84DA015FDDEC243B00BD7488AEFE373E8AB1890273A7A2285988E9DAF9C4E7C5A17F54AD6195EDE2C79657E1BCCED0641E20F7EE26EAF53DD8C82827F2D2783D44FB030C95791F41653E628062267A5CF534DF00116C1ED1DE9F360B97555C65CDD80724104FB1BD4DA5785B5D9C24438557E48AEE58D57A03E06D553B05B67E1C8D10085C2F153647F174F7922FB8D2210454F7014BDDBC627756EB7CDEF99B6E3A2779F82088E3F2DA14C2DCB5B185AEB5D6ACBFAD43E286AAE8F84A58E8DF6ABC64E4A8EFD69FEA18DBFA6808F25FD418DE8BA923500B74E34DDA3CA6AD8DC208102DC4A876D8B8CD2926AEA4B3AE11A546F6235ABEA152DBDF43E0BCDFCDC83299207F294A707C8B4D1F56AA64A205C718ACA69B862AFE7489F11B324E7AF6BE68380D2CA6E0AF0E2E20F890F2CF98907A9D43135C03E85E86C9EE417140EFEE9054B46C110A84F1841AE3CFAFE5B4A95D6B2B606D8D0A70BAEA85C9412BC2D54146E9F866800E8E8615A0D64D1D595677E8C88699E3CA6097D47E9FE64050FB55033FAD4D5F226DA8EB5DDF99369ACC7552927ED3AC7368B9EFEA2443926DF26D1C172858FD8A5D4E1D7D39E7F7DF047385D39131184087CDC45B299BD1F7048E918223DA3F960608E853EE49EA667465DBBD889CBDA20FFBB540C9EBBA5C2CD16A22A57B561E01331D6EA6BDADBD6A5D2BD1441EF4E1D9DD11CC62A0FA5BBFFCBED0D27B6ACAF0889EAA5863DD9BB35920707B71A0805630D1769FEA320516E71CB2B125AC274F16F7A6876F4B922C7C006F38AE1F7183CA768715D2AF + +count = 24 +seed = A08AD391E0FC57A83B74CA8CF44DB67F8178262ED9B20AA0163CDD8274AC2BE05F558B112B094244370C1AAAB75077E6 +mlen = 825 +msg = 209658CD1D801079FFE8E950BAFD70A028CFCC35B9FB00D232C5603A1D51BA13E5DE59E0277962C4474E9F3F60FCD99C9B79665B3839D5C037B921A4DE8E144FA1D38182FBDEECDA6934E814D9186591F01C5E23349B34F4439B4D402C4072CB4D702966AB473D2C39443F41FBDD0C48E566D33E076422EE72FB47B2FFD661F367E9EFDDC988BCA02382EF93590D4FE3ECE8B1D9D8B3A653219C7D131B43E2FDE2851541F467C31129E6F9B9D124221CD52610B9F138EAC1D01F193148FA0415B29F5C86D15067EB1E26C9D51F05655E8545F734F8F244854AD76C6B04C230898BEA33EFDCEEF100D79F8E3B894BA583466749B82007067806E3A7B3BA954F6FC5ABFF0E099A24D14D865F6F4538736124ACC5EAD4169DDF2144AD558DA3C74CDABEC147D2AFA113EDFD1E2280766B18792310FB6B4FE5D0D9F65906B1CC43655BB3D6178EF9093AC9C8F1A91BF49008179394EEE79E1D8E3228F567770C1BA1E30BA4BCE2465AB68F53CE21C0D8AB2F6E535828F211D4DB957DC3AF8B7E00DABD8F1F74C959B2AFF45121C5B5ABD3136C6F55D5F5FFDBCEBC3CD7A430FF3813D23BCDC1254FE6949DA4E7694028B7FCB876099E91B92C65D85C39D4BE9325AFE81703E5B18CBD7BD9EB59A9BB9408ABD966ADE9A60303807AD1B2C14C04CDF8FAE6950A55B21C9EBB5E94713BF8C2890215C5DA94B59CB31EDC671093B15FF5014DB4CD3EA8060260DC1612E9FD6E5AB40F0656121F689C8E94212269A7B24305C83BF0583418755CE690913CB081F2893FB42BC4750F2C053C48C1552430793CDDE1A49AC9E21913210D727C4BEB5640AB9B7505EA4E59AF417A085394181784BF1BB0BC32BD71CC57CE77541581F14B8BA4B758500694796262B561A38C72893C77B548D779A3833EEB064CDDBA5471CBFFBC769E139946155BF376A56415AB743DE568CD21895ED6951B5BFE1B1629DD6510DCD4483F206954964E0517546DD96900A2540A51835818D1730B0C9123E7FD8B28E6843BFFB659945A273CEA944FF6E83C234B3E43DB4630614E0B67778EA760EE341FE68C525E90475A1560821AE6B2A85015292C36EAA2E041AC04FB55922C48204525187C7E0476A9FED04EFBBA96F369D8AE709506620127FD399613A9796C4FF96D7E +pk = 167F262DF8BA760F6E83406D6D374370E6D60232FF0C57FEF5AB2B6A52DFD2042BE7E721C0A17FEAB38F16DA125C4D8E3197DB7D3F928F8BE689F10DC64ACB030B +sk = 167F262DF8BA760F6E83406D6D374370E6D60232FF0C57FEF5AB2B6A52DFD2042BE7E721C0A17FEAB38F16DA125C4D8E3197DB7D3F928F8BE689F10DC64ACB030B61D37A509D3B53DD5BED766F95DCA665D5020000000000000000000000000000EEBC4FA8553092D68A93A89D2CA5A19DF3FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBFB59C77A55CA21F1CDA69D36E2CD5E19FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000DBFA19B8F4087B50DE102C96ADE85B9861DB5CFD56373C77A700D914957C3100C9D87328DC2C5BCB1FA2A7416F36A30F14A00F264B979CFACA7EBE200BE4E700C0669A5AD1135389D9C23588E683D94343A45354D5C36DBA22D748F3B386E400A595A695976B5CA19078F383DC3FA47E6D84B5AC3B16F34C80BE31387340CB00 +smlen = 973 +sm = C0CDFE7626C395F592E746391904A1501C065DA48F2344C71A23D1CBF6BF8A046C748BC5B63A53D47E8E5D8976487DAC38E1E4D27F196157CEBED0188DD07C0000003760CBB193E6751953F1244DD4EEBB35FC0377DCAC6110B78E8F5A723765C9BA7CDE80FBEEA316AD9CF06884B9435200BD88B79089B67DEA524D2849F00CF01B5B96FAC1E9811BED691EFB6D146E3A00110B209658CD1D801079FFE8E950BAFD70A028CFCC35B9FB00D232C5603A1D51BA13E5DE59E0277962C4474E9F3F60FCD99C9B79665B3839D5C037B921A4DE8E144FA1D38182FBDEECDA6934E814D9186591F01C5E23349B34F4439B4D402C4072CB4D702966AB473D2C39443F41FBDD0C48E566D33E076422EE72FB47B2FFD661F367E9EFDDC988BCA02382EF93590D4FE3ECE8B1D9D8B3A653219C7D131B43E2FDE2851541F467C31129E6F9B9D124221CD52610B9F138EAC1D01F193148FA0415B29F5C86D15067EB1E26C9D51F05655E8545F734F8F244854AD76C6B04C230898BEA33EFDCEEF100D79F8E3B894BA583466749B82007067806E3A7B3BA954F6FC5ABFF0E099A24D14D865F6F4538736124ACC5EAD4169DDF2144AD558DA3C74CDABEC147D2AFA113EDFD1E2280766B18792310FB6B4FE5D0D9F65906B1CC43655BB3D6178EF9093AC9C8F1A91BF49008179394EEE79E1D8E3228F567770C1BA1E30BA4BCE2465AB68F53CE21C0D8AB2F6E535828F211D4DB957DC3AF8B7E00DABD8F1F74C959B2AFF45121C5B5ABD3136C6F55D5F5FFDBCEBC3CD7A430FF3813D23BCDC1254FE6949DA4E7694028B7FCB876099E91B92C65D85C39D4BE9325AFE81703E5B18CBD7BD9EB59A9BB9408ABD966ADE9A60303807AD1B2C14C04CDF8FAE6950A55B21C9EBB5E94713BF8C2890215C5DA94B59CB31EDC671093B15FF5014DB4CD3EA8060260DC1612E9FD6E5AB40F0656121F689C8E94212269A7B24305C83BF0583418755CE690913CB081F2893FB42BC4750F2C053C48C1552430793CDDE1A49AC9E21913210D727C4BEB5640AB9B7505EA4E59AF417A085394181784BF1BB0BC32BD71CC57CE77541581F14B8BA4B758500694796262B561A38C72893C77B548D779A3833EEB064CDDBA5471CBFFBC769E139946155BF376A56415AB743DE568CD21895ED6951B5BFE1B1629DD6510DCD4483F206954964E0517546DD96900A2540A51835818D1730B0C9123E7FD8B28E6843BFFB659945A273CEA944FF6E83C234B3E43DB4630614E0B67778EA760EE341FE68C525E90475A1560821AE6B2A85015292C36EAA2E041AC04FB55922C48204525187C7E0476A9FED04EFBBA96F369D8AE709506620127FD399613A9796C4FF96D7E + +count = 25 +seed = 6E0A8EF5156D693FD0140BC4A31084E79773A83F42C8D133AC8A9D62DE3CD74511F893DCB26041E6B35E2B175408FCE7 +mlen = 858 +msg = 8F37A065DD696AD437EC82909261B842EC0A3E66F8AC574105A3C82EC8B4926F2466FA550F8EA1B6A9A142C00AFA44BE6512A85350930DFFC99B95AA21012057051B68C48581AE439B9290A163AA4B6AFCF80FFB91A3321C7B9ABAD56D5DC1BE4E67E5576C9F3A7DB96071859B94EB22A73DD96C66AE67AB11D1AB62A86D826C682DFB8CCA3259DCB5B34BE635421CD4206E7D92147F14C36424EAA407B441F58E5C187E58A26B2AE144888A3CC1387AC7D0A681EEDDC3B7781AB282E8185CCF33FB27500CFD119E0415DB1E45237520A868C8457C88A1D3EE97EC9451DA35D7E74924F8902949E7EB14BA87C8AC672D7E4F3BEC1B2814DFA67A8DD2E2D4FF4661D64BC4C6D6A78D4E489689B6063CDFF5A3F1554501B424284A9F4B8FE777FE4E6AFB83A85E36200A9AB40B9C18678454B2A3F50A4862BA1E36F0C57AD004FF90192B5619614E37DBB38A1B8A65AC613F7796C70772128377065B84F122540106D1B4F9123C4E009B4C0A85D59B35F72DEBDDD154ABEC7F3FB25FD1FA04367386098DE610B26FA3ECB031A6072D14607E92FFBE195ABFF71E586A984131AF24E18AE94DBAB0544FD2AD217960F337111BFBD4046809EA03C7C47B7177757A4A43E1FD0134859BA735A8FC17597E593BB58322136602954D3A21096B0D1DEE5CF0AD17A5FCF561FFA21CAA70D33998840E4CFA18BA481704A8B82D2CC1C110FC9A6704751365AE9F338AFE4CF9C811697DDDFA8635A2F3CD02DD1845251014BF2F2D6C02A907BD783207C4773A937048A07C500D7C424B5F65A2C376523740DF9A0B60437CB8AE17D64DD51DD4E433AF83B20C4B6B890B97976DF09E3A86AC19006C229D59FC7A2923245B7B1F0ACF7C42E486D41CA1AC1D7051AEEF6003CE94182F97D099C74317F61EB47AE18C2BED6A3CB253C21EC835E435123E0A657ED926F880CE8E5DE3155272328A467278F52AC50A1121AE818A3EA3A2E1F7401CE23AAF66A4AC289748A7E98A5124C586D8957BB4EDD3F091492BB1A64D75EFCD45AD51CA420F15DA848B20DC6BB765E7B71359B3A9E95E121266AE4A40DC2E9A3D81EA1B1A643594B3D4E6ABB7D1202201DE92BDF0CC1ED977E2D5851822A01F48A6F23180822888CE345AC9BE0CC69BC448D41CA20B79C35B1DAD73E6C683E70C4439B404CBF07FCC39B0E5A1D33F3717A6BAD28A6DA4F091BC7A +pk = 9DA8A98A7E5B8E9E29C3A131AB753A1E69809B4E7CB65FF71CD0D85EB5EAC40201193BC961CF4F1729A6AD69E5895BD5ACBDDAE5B1B8E1394152228851764E0202 +sk = 9DA8A98A7E5B8E9E29C3A131AB753A1E69809B4E7CB65FF71CD0D85EB5EAC40201193BC961CF4F1729A6AD69E5895BD5ACBDDAE5B1B8E1394152228851764E0202C7CF1ADD63B1427805AA72D6D3C36790F4030000000000000000000000000000D60CE22BF8B9A69316DE4D1F37F1C002C8FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2CEBF4F3C4AF45330AF36D28347AD78FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000E0D33AFEACC873298A14131C4876012057AD77E77A97CA042C8549764A53B1006F1C0658D4AB443DC7AA716972F9139E46BBA5886B1748EE3D1515547FD6C900815E3FF6E2BA3AB73DC47827474E4BC63BA8CC132DAF04692197D39039A262004756F576EDC880B165998D2C8329E307E127391234433F48C80C889D051C4E00 +smlen = 1006 +sm = A31454A5BAF35E08D55266CE3F57556998C7338B4BDFB1F36274DDE1B9D1C301E355042ABA9A36A9CFD37F78BD0FD9D4300A3398AE431D65F32ACCCFECE87500000007A570809EC9A9EB38378A363287C292312037361976D21E74DC8F14FB24EFB8C75244EA0A78AD88E6EF219F33E4B9E570C46B1D837A4A35420324353D0A21AB9B58B1386899CD561D6D10F29E01A10102178F37A065DD696AD437EC82909261B842EC0A3E66F8AC574105A3C82EC8B4926F2466FA550F8EA1B6A9A142C00AFA44BE6512A85350930DFFC99B95AA21012057051B68C48581AE439B9290A163AA4B6AFCF80FFB91A3321C7B9ABAD56D5DC1BE4E67E5576C9F3A7DB96071859B94EB22A73DD96C66AE67AB11D1AB62A86D826C682DFB8CCA3259DCB5B34BE635421CD4206E7D92147F14C36424EAA407B441F58E5C187E58A26B2AE144888A3CC1387AC7D0A681EEDDC3B7781AB282E8185CCF33FB27500CFD119E0415DB1E45237520A868C8457C88A1D3EE97EC9451DA35D7E74924F8902949E7EB14BA87C8AC672D7E4F3BEC1B2814DFA67A8DD2E2D4FF4661D64BC4C6D6A78D4E489689B6063CDFF5A3F1554501B424284A9F4B8FE777FE4E6AFB83A85E36200A9AB40B9C18678454B2A3F50A4862BA1E36F0C57AD004FF90192B5619614E37DBB38A1B8A65AC613F7796C70772128377065B84F122540106D1B4F9123C4E009B4C0A85D59B35F72DEBDDD154ABEC7F3FB25FD1FA04367386098DE610B26FA3ECB031A6072D14607E92FFBE195ABFF71E586A984131AF24E18AE94DBAB0544FD2AD217960F337111BFBD4046809EA03C7C47B7177757A4A43E1FD0134859BA735A8FC17597E593BB58322136602954D3A21096B0D1DEE5CF0AD17A5FCF561FFA21CAA70D33998840E4CFA18BA481704A8B82D2CC1C110FC9A6704751365AE9F338AFE4CF9C811697DDDFA8635A2F3CD02DD1845251014BF2F2D6C02A907BD783207C4773A937048A07C500D7C424B5F65A2C376523740DF9A0B60437CB8AE17D64DD51DD4E433AF83B20C4B6B890B97976DF09E3A86AC19006C229D59FC7A2923245B7B1F0ACF7C42E486D41CA1AC1D7051AEEF6003CE94182F97D099C74317F61EB47AE18C2BED6A3CB253C21EC835E435123E0A657ED926F880CE8E5DE3155272328A467278F52AC50A1121AE818A3EA3A2E1F7401CE23AAF66A4AC289748A7E98A5124C586D8957BB4EDD3F091492BB1A64D75EFCD45AD51CA420F15DA848B20DC6BB765E7B71359B3A9E95E121266AE4A40DC2E9A3D81EA1B1A643594B3D4E6ABB7D1202201DE92BDF0CC1ED977E2D5851822A01F48A6F23180822888CE345AC9BE0CC69BC448D41CA20B79C35B1DAD73E6C683E70C4439B404CBF07FCC39B0E5A1D33F3717A6BAD28A6DA4F091BC7A + +count = 26 +seed = 49CC05312D1DBE216FF03B60575017A6A1464C06D2C5A4A6F973AD9F275F7C66163A29A803BE759B117043862D277C27 +mlen = 891 +msg = 30D61C6FBD64113FCED8C5205026EBAC0D9F3522182617CB00B6E70C8DA62ECC1BBC8E1FDAF17CC61DD01CE85A9072CC1D9D34FDADBA5B93E0AAB4C9C4C9E26D3F7F145FCB23673B6E0B373C0FD1A58F52486B72624EF91A539519EE5305772A006E49521744912BCF3CDBAD424F00428AA96CCC21D000EFB09DA5CE652E361A6FB649A060835E3B9DC9CBEC660C7531620115EC905DCA6EE2A1CE36554C0FC1D6DD6863B8F3843508ED5C214B6923E7F5C0304E9B0D5E5E433BD029116A33A60CB980737AC950577D0594BFE0AD2225CB8D3FA42F192B0EC05A49391632A32FA931C0FBD83A7B6EA24301AD0906E7911F9D900D19AE1247ABABB1C0E9B9BD165185D9D7413EA068FE8824CCE5B3AD51FE8E2BB2C4022C61B002C1DF4852E4910F38613787CA12371038B6364D920E07B4B417401253451DDC25624B5D038B2DFE29B8494EC960F87803CAA256A95C9868AF819747E4BF26FAABA6DDBAED93A7815C795AD5EB7FB4592DF678AC1375388CC7ED3A6230CBE80ABBB113C80B70C789CF0C66B943E67CE814F12D3D83F3B90A4320FEB7FB81DC93B05D7FE2D36584399214D3D7C71AEF322A5D04B5470703B3660BF86B0B17BA9FF23E45F7BEFEC3758786D2111C81BA4D81B83FEEA35A0668E5EB3694963BB4DB3ACCE4FCBA6F3F6FED9627580DD2D2DC103EF7E52BB9745BD42A7FBDB459B5C8AAEBA67686EB899E3177FAF0897C61B008ACE3304C41B4C79E2EF9C865E9958D8716BDDB69154FB33187D927B5296C1589FB1AE3D553F116FF6CAE56910CE6717C446B9947AB2A981A8F5999C1C6E517EB3FE584F5D10059910E22F40FBDDB709C9F686F51ABF7D7206A8BAB4A346B51523C362D749238D7EF6671A89CD86A8540604F134D760267E91EB92FC0FC275CAB69C776EF81DBAD35027E5307F1D34EBF5D6E4DF424D709666A1E649C044C4930098B2E6E3782A93976B55073C504563C7E052B6816C07F0FD54A759D2BC189FAC3FF54549FC4DE192EFB58A9E301863A77380967735910F63D35EF5FDBD8751DE4BC6BF2E3095628DC7F67C1F5571D17AA342593B2C7F953C3F0F22DA1862122031BBEAF0D00A029C043304E3E2609C4FED8A7404FA10E2EC846A70EB0E37C5BE61E698CF2296EC1FBE6FED75F6FE3113C23B29AFB5A6D7E3A9E46E2D89D8C06450CEA11492C1A97F7D6BE8FF6C014930043022B264FD32593952BC606F779598631E48EED86EC2A013D8EB866F311A400 +pk = 8FEDEA278AAB98F359E0F7AF04C381161BD65EBE187A62CBAF1E56A12D6B75018FBEBDD6E0B9EFDD4487FC2E461B0E0BD04A15EB164D3BFBB2BBC1220364B00102 +sk = 8FEDEA278AAB98F359E0F7AF04C381161BD65EBE187A62CBAF1E56A12D6B75018FBEBDD6E0B9EFDD4487FC2E461B0E0BD04A15EB164D3BFBB2BBC1220364B0010249881B94BD66304E46A15DF268F3F4FB67020000000000000000000000000000048853903B9B93090CB4849C2239791F7EFDFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B3A4963A039897BB459D78A5326A8B7CBFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000843B5E9C6136B205333F1DC29C3579AA19CFC42BCC093E8431DB6FD214D20D0005EF42CE7CD7D1550A33A5CE6106B8218C1734EC76652081B8FA884DEABB1C0011BC41811ECB205E1B749CF701CECB39895CB416E5D3752DDB20ACF9AD2D09006125534B030C371DD336DF56B3DA50B12876970D48DE07CEF44BB0F91484F400 +smlen = 1039 +sm = 3755757858ECE7CA7F3AD133C21D3C10AFD089AE278D60150AB8EB0FC4F04604F3E1AA6DC9A8233661A01297331BCC2339E916AD70237818DAF6E63879532D0000001328AC8616F4DD33C1B1F260DCDD755ED82516D58522BB4ED24E8ABD1115D4E7D85BA77A9C48A3B0601DF598E4E5CAFF8F825CF95D4D6338C238A0040509A090FF497EE35F620DD755FFED479753D7020B1730D61C6FBD64113FCED8C5205026EBAC0D9F3522182617CB00B6E70C8DA62ECC1BBC8E1FDAF17CC61DD01CE85A9072CC1D9D34FDADBA5B93E0AAB4C9C4C9E26D3F7F145FCB23673B6E0B373C0FD1A58F52486B72624EF91A539519EE5305772A006E49521744912BCF3CDBAD424F00428AA96CCC21D000EFB09DA5CE652E361A6FB649A060835E3B9DC9CBEC660C7531620115EC905DCA6EE2A1CE36554C0FC1D6DD6863B8F3843508ED5C214B6923E7F5C0304E9B0D5E5E433BD029116A33A60CB980737AC950577D0594BFE0AD2225CB8D3FA42F192B0EC05A49391632A32FA931C0FBD83A7B6EA24301AD0906E7911F9D900D19AE1247ABABB1C0E9B9BD165185D9D7413EA068FE8824CCE5B3AD51FE8E2BB2C4022C61B002C1DF4852E4910F38613787CA12371038B6364D920E07B4B417401253451DDC25624B5D038B2DFE29B8494EC960F87803CAA256A95C9868AF819747E4BF26FAABA6DDBAED93A7815C795AD5EB7FB4592DF678AC1375388CC7ED3A6230CBE80ABBB113C80B70C789CF0C66B943E67CE814F12D3D83F3B90A4320FEB7FB81DC93B05D7FE2D36584399214D3D7C71AEF322A5D04B5470703B3660BF86B0B17BA9FF23E45F7BEFEC3758786D2111C81BA4D81B83FEEA35A0668E5EB3694963BB4DB3ACCE4FCBA6F3F6FED9627580DD2D2DC103EF7E52BB9745BD42A7FBDB459B5C8AAEBA67686EB899E3177FAF0897C61B008ACE3304C41B4C79E2EF9C865E9958D8716BDDB69154FB33187D927B5296C1589FB1AE3D553F116FF6CAE56910CE6717C446B9947AB2A981A8F5999C1C6E517EB3FE584F5D10059910E22F40FBDDB709C9F686F51ABF7D7206A8BAB4A346B51523C362D749238D7EF6671A89CD86A8540604F134D760267E91EB92FC0FC275CAB69C776EF81DBAD35027E5307F1D34EBF5D6E4DF424D709666A1E649C044C4930098B2E6E3782A93976B55073C504563C7E052B6816C07F0FD54A759D2BC189FAC3FF54549FC4DE192EFB58A9E301863A77380967735910F63D35EF5FDBD8751DE4BC6BF2E3095628DC7F67C1F5571D17AA342593B2C7F953C3F0F22DA1862122031BBEAF0D00A029C043304E3E2609C4FED8A7404FA10E2EC846A70EB0E37C5BE61E698CF2296EC1FBE6FED75F6FE3113C23B29AFB5A6D7E3A9E46E2D89D8C06450CEA11492C1A97F7D6BE8FF6C014930043022B264FD32593952BC606F779598631E48EED86EC2A013D8EB866F311A400 + +count = 27 +seed = C33EE43A9CBB4347BFAF71147B7FBDD88D212462CB06FBE695A35402C503CD15732B7D0E8BF829A555B9167BCFA2F2BF +mlen = 924 +msg = C83441B16B39BD7993766E7260D07751AF2F19A41E70689B0EEED0C118D9EF109866AAEF31B2D2962A25A3D1CA999214CDF0EB54598382EEAD64435B7122D275EA8879BD47B41EB64EA908867FD78ECFBE8E992A2636AA7477DE5058179565D3A2CEB8ACE5C0302018043C411D89975A64927B48CB622A13F1ED85CC1113897A68488161AFA1E636EC786A0AA37B928BA88A50164A9EC372523AA9EC8885AA9C95B29F7CA1BBF0652BAC195BA94E976D336B69A9F5346B4C7C81457F802DC9757C7A2435A617317340F764C1A2AE131A716318F00AF0EFA89D3B57D8F31E155598B3944D950D6A1D6485B509358EFB3745B95EDC30DCFF02574F54DFB2D31B259D132D18897DF868115679F06D41102CD4EED4EA290F711148B99B647B8555A4C0DCA1D2D0871C59AB1382A2D6417E6236D71E2BFA1A75CDA54F93E6C087D611878AC7670A04FD7D8CB0993F456E3BC1C3B5898076E22D2D9E0EEBC7D7BB8D142BD2B5F6FA42B40BF676FB69C532D7520A4A105EF0C1337F53D6E9B4BA17F1E76AF4CFDF08F794752D2BF71E8777E2A209F8891B1A53D7BF2A5786B00B9A0CD0FCE79408F26BEFA2535BE188A68201B1514074CD70660971F86E8D3E92790AE7AC591AA7A996149BCDF060C615209FFAB82E6000F41B2A5606FDAF4CD08CAB0C2F1103B2436B1FD7DEC477C6233FBCA3B07A0CA01BF3476BFE5334E32AAA2ED35D5747D673E7BB622E1AA7901C77F28A3AB2197C8B8253A1D28C969EEE73D17AD71C7919E7F217BA2BADBD1EBF986CFE981024FC347028C1109CD4204C7D53535A9B677E39A43193E054D0FD68104D88934DC7BA6CB3E942AEC744B935CDCFEEF4221784F96798E650FFB0FEBF2715D75339D0CB6C2E57C1E9D10F13E6786B7F041AB307B8CFA51A2F10B622995230FBA54B70D94AE278EC224D9D0950BA97BEBA7EEB0E2FBC4093E548D9EC09CA1A08E5F0483024D7C1927FF8DC270900D42D31B81B13A29839BD746CBB3591BC33817741A31DEA308F549A74F3A4E5478844183B8D7363AC1F4D4A5E907D9ED98AFD08FB8BAA84C324563495387A4F12C239FB63F0810447131311B2D2CA302C7DA2DA57C94C3B5E844F537886FB766EC0E977254DBCA8FC84AD77430428F0692E55D8E2CAB294B857AB51A2CE4A725433DF28D9CABA86C770743AD987BBA58C0565BD18590931E283292889294B607A5F19D9E905AA3940836E2A74A2E94FF3062E85A5C6C978B5EB2B254BBCDE128280E6CF02C11A0C2066F349E3C6C083965D5B8A9C000E15FF36C5BF3A6D42 +pk = 3C80B03FD5D977EAF55D8CDBE1D4DEBF313B86243D4DE1F6461C6029CCD52B000D978B565605D723292BDBD103042F0284FC6A2C44D2CA1E65B2BD02C2EF620406 +sk = 3C80B03FD5D977EAF55D8CDBE1D4DEBF313B86243D4DE1F6461C6029CCD52B000D978B565605D723292BDBD103042F0284FC6A2C44D2CA1E65B2BD02C2EF6204065F5889820876B8D7BD8937E8B78CF8808C0100000000000000000000000000002E071BB461FE6189518B88D1878C70C706FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF09C24ADD7D414239455B624CC4549B502DFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000005A499A2FB0ADFDE635121CD6B6D55739072E2244B0F996D72CA8DB672DB39E00F971E6090993620B742A7BB46B29929357DB6A8B874FA176429CF0BBA198F800814106100E176A1C59BA5979A307B8C45F386330394BE69B6E4811DA83906600D4800849BC2C7B4B6DF78A7D7D553DDFC17CF4D6F53420EAB1CF461AAD284100 +smlen = 1072 +sm = D95BFFF16BBD05FDDA6BCFB8454446A5922A88B65FBDD2731F746F3F9CA2B10272FDA96100D6D6DD334E81ACAE5850F26A503BFFD118F54CC2BA88ECC2F88F040000F3E3DB349945E6DB1B53E9F20BC758C8811187F51CC161CB290FCACC5A4739C0114D1984E8E21904A72172C87594872E3A65CB0AF1201460A9A70855E7251BFFDF5CA95DF45ADBDF038202EC6EEDF2010611C83441B16B39BD7993766E7260D07751AF2F19A41E70689B0EEED0C118D9EF109866AAEF31B2D2962A25A3D1CA999214CDF0EB54598382EEAD64435B7122D275EA8879BD47B41EB64EA908867FD78ECFBE8E992A2636AA7477DE5058179565D3A2CEB8ACE5C0302018043C411D89975A64927B48CB622A13F1ED85CC1113897A68488161AFA1E636EC786A0AA37B928BA88A50164A9EC372523AA9EC8885AA9C95B29F7CA1BBF0652BAC195BA94E976D336B69A9F5346B4C7C81457F802DC9757C7A2435A617317340F764C1A2AE131A716318F00AF0EFA89D3B57D8F31E155598B3944D950D6A1D6485B509358EFB3745B95EDC30DCFF02574F54DFB2D31B259D132D18897DF868115679F06D41102CD4EED4EA290F711148B99B647B8555A4C0DCA1D2D0871C59AB1382A2D6417E6236D71E2BFA1A75CDA54F93E6C087D611878AC7670A04FD7D8CB0993F456E3BC1C3B5898076E22D2D9E0EEBC7D7BB8D142BD2B5F6FA42B40BF676FB69C532D7520A4A105EF0C1337F53D6E9B4BA17F1E76AF4CFDF08F794752D2BF71E8777E2A209F8891B1A53D7BF2A5786B00B9A0CD0FCE79408F26BEFA2535BE188A68201B1514074CD70660971F86E8D3E92790AE7AC591AA7A996149BCDF060C615209FFAB82E6000F41B2A5606FDAF4CD08CAB0C2F1103B2436B1FD7DEC477C6233FBCA3B07A0CA01BF3476BFE5334E32AAA2ED35D5747D673E7BB622E1AA7901C77F28A3AB2197C8B8253A1D28C969EEE73D17AD71C7919E7F217BA2BADBD1EBF986CFE981024FC347028C1109CD4204C7D53535A9B677E39A43193E054D0FD68104D88934DC7BA6CB3E942AEC744B935CDCFEEF4221784F96798E650FFB0FEBF2715D75339D0CB6C2E57C1E9D10F13E6786B7F041AB307B8CFA51A2F10B622995230FBA54B70D94AE278EC224D9D0950BA97BEBA7EEB0E2FBC4093E548D9EC09CA1A08E5F0483024D7C1927FF8DC270900D42D31B81B13A29839BD746CBB3591BC33817741A31DEA308F549A74F3A4E5478844183B8D7363AC1F4D4A5E907D9ED98AFD08FB8BAA84C324563495387A4F12C239FB63F0810447131311B2D2CA302C7DA2DA57C94C3B5E844F537886FB766EC0E977254DBCA8FC84AD77430428F0692E55D8E2CAB294B857AB51A2CE4A725433DF28D9CABA86C770743AD987BBA58C0565BD18590931E283292889294B607A5F19D9E905AA3940836E2A74A2E94FF3062E85A5C6C978B5EB2B254BBCDE128280E6CF02C11A0C2066F349E3C6C083965D5B8A9C000E15FF36C5BF3A6D42 + +count = 28 +seed = 19CB4BE2332F7FF0C078BC001FAB3C5FD8569A76EBCE373D1ED4FC8EB5D744C6464E2B5EECB9EE836CD5D87BEDA78BA7 +mlen = 957 +msg = 86D27C1FCDB8164F8909073F590D0A280E5EF193B0C42863BA518BC8A51E625658DBE2184C3353FAEB674C991EED3F1B0FE3BBE50A21EC70E9F57B97C38D6E436D3DD577D7056B07A401FF0EBBBEFAF8212B993A39281190E309ED0C50B269E4852DEA85432A5941269FDF63766B21D25D8816DE5E87FFA051009D232D6B258C5F43F45F2D48BE09B2CCD8FC963FAD81FB368502057AFA7C865D62D932F652802A299295B29411439DCF832E8367A749B4D7ADF7E8ABDE3EBFB844A9B1D32F77B2BF96B5D29FC15DAE83EA80A990AEF6590776CE1CB81587ADA80B9A7B45ACA3BBC54DBE67DF090104FA196701280B97607A333A9B56A728710CC1CBB7569B79FF034572495181A92D2380A7EE5E9CD1B0F758C2BFBCC4E11464F1CC7D91F117319C30CCBF4C11E60B5DEC724225B8D77B71AA58F5FBD498A3F49115687D58393BE648805BA1737BB921A08D738243920C3834F8782A8256B7DD22CCD5F4ECE86B8A0860BFF21C5C8F0BE987F2D510ED4DF9CF94BF698680B7CFA22A575A3D1B5B431734B59A4B31913019C1F42DCB76A9FF32BFBC6E16D2FADE26E3C17BAE49CC415E4B370D1FB43FF652BE62D18B0AFFDF286765F4F30FC8D6F2C4A58CD17B3BDFA013BB2DAA075BE5F522EF9BFC2E1506CC1C4D381B3342EDC19C955A5FE48A712AF5ACE66A028D03FC859711C9D33231E48D41E58A2C2AD81DA77529AD5E6B73E1AC96F0C8E53F153FAEA7903F917492A1D2B1203174A08551FF0F9F91E32BD0F31D606C80A505D5EB55265542DB3653C2621E7EB3FD677F49534F261205F834EEF1645AF419EF6BE5CFC16D54C7EEEA12D2EB9458831F77FA558E4D5C7FE446DDAAC3E1D502C941C95F572AD545ECC7CAD21F0DD50845CBDEDF589505FD34CD8C00D57243C3AA3615D84C39B0A72C28F40AC72DA25EBC6987DF5A7E390399463786E75D524FFB6C961BBC9301264BFE3C699101D18ADA4A72D193971D54089E6FFFA684CD3D77570CE0BB9179A156D3E2DCF266358499BFC158AC9A6913F622CA861C968EBBA0A59A12674BFE39389A2125A02563B082259483E80C89A3763C0A9C3DB485AEBF22C844539EDAA28A3FBC0053EEC475679B741D9AFC16B5FA109399FDD1FC3574DF8A1292B8D7401AAC1BE452D38F97D531813369EE4C50F36736B95AE9C3E4F91AE85E2D664337DAA40F75CCED2F4A4D210BB4EE25A56DC217DD176DB5ACA43C002AFD63ED8712D89E266674D9736FE4A9F202A81D177970411DCCD289B25798272D2647CE6451906A4F7D46E87A46CF6CD048B6BDB62488A24F48D1EBD61FFA474321B929E0A7B6F9D0F6D777ACC14815F343E1 +pk = 417156E2F094B83AD08B9B151A9A076BCFF4DBFEC28B1636EE128B0BEA0CBC02F021D8CBE84B286A36F1EDE285F928620FB0C2C37A6EDB37D0760DC771485A0202 +sk = 417156E2F094B83AD08B9B151A9A076BCFF4DBFEC28B1636EE128B0BEA0CBC02F021D8CBE84B286A36F1EDE285F928620FB0C2C37A6EDB37D0760DC771485A0202B176603691C422C4762F4FDFF83CB239DC0000000000000000000000000000006060FB4932248A3A19A11790A99176B767FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD0864BCCE46F2941F9DBBF3F2E2F0E12CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000A7F6096DAAF02F4B300DFEF396EE2B2AAE5330860B9F36AB7A179151F42F950019B74D05A487ADE4C1B594C182483CC241A42894831EBCD14FE0D3FBF3B6500080FB006FEDD6E5FAC68602810DD9F58B7A4DB5E1BA9C65B98680CB295BC31B009F1E5ED3C3D225C0ABE42B3C870D1799FFFC7A00BD6955F21AF6FC4B2C84D300 +smlen = 1105 +sm = EE6EBE9C262EE7D18E90A26FF90074B025E26529DF9239868C80409DB94034040DD05AA62EF463D67063AD79E876C176E44AD99AD7F2596CB416C4C865C381020000BB456CD39FF827EA348231A87B3E259AC50ABE4C58E000862CF073949ACAB3A79E18596EB540AAAE0B0EB2CCC90B99824B58E267263B0080900389B183B783323035CC132D510EC99362D72150951400020B86D27C1FCDB8164F8909073F590D0A280E5EF193B0C42863BA518BC8A51E625658DBE2184C3353FAEB674C991EED3F1B0FE3BBE50A21EC70E9F57B97C38D6E436D3DD577D7056B07A401FF0EBBBEFAF8212B993A39281190E309ED0C50B269E4852DEA85432A5941269FDF63766B21D25D8816DE5E87FFA051009D232D6B258C5F43F45F2D48BE09B2CCD8FC963FAD81FB368502057AFA7C865D62D932F652802A299295B29411439DCF832E8367A749B4D7ADF7E8ABDE3EBFB844A9B1D32F77B2BF96B5D29FC15DAE83EA80A990AEF6590776CE1CB81587ADA80B9A7B45ACA3BBC54DBE67DF090104FA196701280B97607A333A9B56A728710CC1CBB7569B79FF034572495181A92D2380A7EE5E9CD1B0F758C2BFBCC4E11464F1CC7D91F117319C30CCBF4C11E60B5DEC724225B8D77B71AA58F5FBD498A3F49115687D58393BE648805BA1737BB921A08D738243920C3834F8782A8256B7DD22CCD5F4ECE86B8A0860BFF21C5C8F0BE987F2D510ED4DF9CF94BF698680B7CFA22A575A3D1B5B431734B59A4B31913019C1F42DCB76A9FF32BFBC6E16D2FADE26E3C17BAE49CC415E4B370D1FB43FF652BE62D18B0AFFDF286765F4F30FC8D6F2C4A58CD17B3BDFA013BB2DAA075BE5F522EF9BFC2E1506CC1C4D381B3342EDC19C955A5FE48A712AF5ACE66A028D03FC859711C9D33231E48D41E58A2C2AD81DA77529AD5E6B73E1AC96F0C8E53F153FAEA7903F917492A1D2B1203174A08551FF0F9F91E32BD0F31D606C80A505D5EB55265542DB3653C2621E7EB3FD677F49534F261205F834EEF1645AF419EF6BE5CFC16D54C7EEEA12D2EB9458831F77FA558E4D5C7FE446DDAAC3E1D502C941C95F572AD545ECC7CAD21F0DD50845CBDEDF589505FD34CD8C00D57243C3AA3615D84C39B0A72C28F40AC72DA25EBC6987DF5A7E390399463786E75D524FFB6C961BBC9301264BFE3C699101D18ADA4A72D193971D54089E6FFFA684CD3D77570CE0BB9179A156D3E2DCF266358499BFC158AC9A6913F622CA861C968EBBA0A59A12674BFE39389A2125A02563B082259483E80C89A3763C0A9C3DB485AEBF22C844539EDAA28A3FBC0053EEC475679B741D9AFC16B5FA109399FDD1FC3574DF8A1292B8D7401AAC1BE452D38F97D531813369EE4C50F36736B95AE9C3E4F91AE85E2D664337DAA40F75CCED2F4A4D210BB4EE25A56DC217DD176DB5ACA43C002AFD63ED8712D89E266674D9736FE4A9F202A81D177970411DCCD289B25798272D2647CE6451906A4F7D46E87A46CF6CD048B6BDB62488A24F48D1EBD61FFA474321B929E0A7B6F9D0F6D777ACC14815F343E1 + +count = 29 +seed = 6BD93FD13C0299B3EC7403638673F3DBC449F3A617B691DDF73C072B62BF028913375D7460BED2CF9FDCA517690CBAC3 +mlen = 990 +msg = 56ED7708F98432FBC623424C2A3634780470A01784BECFF01BEA5BA192D02C33675084263C4315420A009579EF80DD15ECCBB812652421872A9577EF7D07896A727A64141BAE7173426DD5A3925159BFA927FF1039E70F729847B48365B4D3551476206AA049BA5AE8F605847AA03965F058FCFD478961EBEED06530ABE900042321059C297DACFE76CC12D52311B2FF8EE1231C77049E232D9FDB751FB27EB7EB6A373B4B1C06BD0FF46B1B208072C873E6F938E689839079E48C6D18F678769F5F28A903467F2FF2A8B02CB19DF675A8FC7560A7D38A918AB8BE083EC4E0EA148517AB90F38394833304F245BFFC47F9ECA771FB80B9C71CCD05FC3B0D66EB06D24B914B63D9F16AD2F2BC454B591D01ECFC527277AE71E3DC683161A53F129743F3428FB82A89DBD5D42F3EED237CD2F8D76DE2E56A2143AC6B2BA811F745CC72132028EECD4412B76FDD87A2E396ADCE72DC69B8FE053042E798B220974587AF96BA419DA6888B13FFE217C9D01434347F4162FD554B760883E8EB1AEE46C4C26B990C6BA10D2D939F513BF0EECADE8B5DEB8DE2BC8C8894ACA51E65AA696E390C11689F1C2CFBB70BC5F72C1872D99BABE8DE8FE2DBB446A8129AF0AB8D9613F0CBF3CFA6EA3CC409F4A97581D5012707756994B6C8D4FE7F64E0F0B85A85D0A5FE23224DFD7ABEBA8E3FB2E97AD87FA8DD477ADF48F64FAF486D0DF11AE9C3BD3A04ABC962C5B02CDA02D48F0B52D84D4920C116C22455DF291A96E6ADFF91E3CD35CB8B5B4E70E3DA8B87CDC969643A32B1F97131C5E0BAE7F6DFBFAC32218EAA596D444574EE85EF7C9998DC1088E5813D50A4377D29506817E4234F68B32AD68E00ADBF6462F8D4E215F15A19DFDE452F0A65360F7C1F20E11C42EEC55565CCB23CE248BD62E9DBE8A7D6639028A92B422AB444C5688B5D191A4BA8956F358D131E2FF6DFC607ACCC5D31AF9678F1A226530078FF9A73D681DEB697670DDC3E9096AB0FEDAB664473DCFFEDF9BE62A5C7C54FA2EB5059E9A1D38413B1A4FE6D531B799453BC7185ABAF78CABCF65F365B00827CEC5F29C4737047E3B2932A78757E9626A958486D1740ECF1EC17A01AAE6ADEC5104EB934F432207CE31D7096ACB3A0FE2F5DD7890C021892FE7D3F34596CF20B6B12FD55911ACB46D7386F99A9E9EE067A45C6A1FBB463E63D69CB582DA6EBD6330F4F80A1FA72F2ED24CE9BBCD967118CFC7E21F6BFB68A905F532BCF8B8BEFA03295D362B41D25CDCCFC9B41767858F651BC56AB2BB4A8675513C5D6F1C943A20A27DD29F941AD141DEBAAD219E056510BC984063FA0F389090D434157438BB1759690C453A2F55F72C033797A4B0C534EA2EA084B3B6F8966AC56B106FCC11EF08902F2ED +pk = A8445D64805E10125F5718990ADFA55CEB498BA3E213A3B42D474CE7B6916E029C630DD6B8791557EF4479003FDA6174A048E002722F99E6371A70072730180002 +sk = A8445D64805E10125F5718990ADFA55CEB498BA3E213A3B42D474CE7B6916E029C630DD6B8791557EF4479003FDA6174A048E002722F99E6371A7007273018000275195FFCEFD6A61CA0DC060F0D00507BCC0900000000000000000000000000000CC5095C50E80B708DE33B06E45B62E1CFF9FFFFFFFFFFFFFFFFFFFFFFFFFFFF9147A434A056E79980B5A7E97F15EFDA6AFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000004107BCC8AC86B41115B2E0979C49EDF57EB2D7DD1B6F71295B7A0EBD859B1A008BAE29DFDC55EDEB258673893F449FD69D5518E5136CA327F43628BB001EF60084E46B0EF86E9C4B0D5C528D133FB931188D00A99F5C2BF84B5462DBB08AA4005D190AF3930143EC0F2020F42ACE287746672E29971FDE1FFBB4A8F348EE2F00 +smlen = 1138 +sm = EEE155964A3FDD52B14B504549E1DA87182762C7BA511680E5EB60592FEF6C04203527F56E636BFBE076B3A6F8E89A73372878F8381D4F61644AF49CC32B37010100BF8B9F33E96FDBAAC666ACCB8C2BB7244F90CCF921B434B629825524B20A442357ACCFFB736FF5826B9E50886DE5DF6E1AD9D6B63A69D0518EFFB4FDB6F55747ED34D3D24F5D17D99776F30EFFA8AF00020256ED7708F98432FBC623424C2A3634780470A01784BECFF01BEA5BA192D02C33675084263C4315420A009579EF80DD15ECCBB812652421872A9577EF7D07896A727A64141BAE7173426DD5A3925159BFA927FF1039E70F729847B48365B4D3551476206AA049BA5AE8F605847AA03965F058FCFD478961EBEED06530ABE900042321059C297DACFE76CC12D52311B2FF8EE1231C77049E232D9FDB751FB27EB7EB6A373B4B1C06BD0FF46B1B208072C873E6F938E689839079E48C6D18F678769F5F28A903467F2FF2A8B02CB19DF675A8FC7560A7D38A918AB8BE083EC4E0EA148517AB90F38394833304F245BFFC47F9ECA771FB80B9C71CCD05FC3B0D66EB06D24B914B63D9F16AD2F2BC454B591D01ECFC527277AE71E3DC683161A53F129743F3428FB82A89DBD5D42F3EED237CD2F8D76DE2E56A2143AC6B2BA811F745CC72132028EECD4412B76FDD87A2E396ADCE72DC69B8FE053042E798B220974587AF96BA419DA6888B13FFE217C9D01434347F4162FD554B760883E8EB1AEE46C4C26B990C6BA10D2D939F513BF0EECADE8B5DEB8DE2BC8C8894ACA51E65AA696E390C11689F1C2CFBB70BC5F72C1872D99BABE8DE8FE2DBB446A8129AF0AB8D9613F0CBF3CFA6EA3CC409F4A97581D5012707756994B6C8D4FE7F64E0F0B85A85D0A5FE23224DFD7ABEBA8E3FB2E97AD87FA8DD477ADF48F64FAF486D0DF11AE9C3BD3A04ABC962C5B02CDA02D48F0B52D84D4920C116C22455DF291A96E6ADFF91E3CD35CB8B5B4E70E3DA8B87CDC969643A32B1F97131C5E0BAE7F6DFBFAC32218EAA596D444574EE85EF7C9998DC1088E5813D50A4377D29506817E4234F68B32AD68E00ADBF6462F8D4E215F15A19DFDE452F0A65360F7C1F20E11C42EEC55565CCB23CE248BD62E9DBE8A7D6639028A92B422AB444C5688B5D191A4BA8956F358D131E2FF6DFC607ACCC5D31AF9678F1A226530078FF9A73D681DEB697670DDC3E9096AB0FEDAB664473DCFFEDF9BE62A5C7C54FA2EB5059E9A1D38413B1A4FE6D531B799453BC7185ABAF78CABCF65F365B00827CEC5F29C4737047E3B2932A78757E9626A958486D1740ECF1EC17A01AAE6ADEC5104EB934F432207CE31D7096ACB3A0FE2F5DD7890C021892FE7D3F34596CF20B6B12FD55911ACB46D7386F99A9E9EE067A45C6A1FBB463E63D69CB582DA6EBD6330F4F80A1FA72F2ED24CE9BBCD967118CFC7E21F6BFB68A905F532BCF8B8BEFA03295D362B41D25CDCCFC9B41767858F651BC56AB2BB4A8675513C5D6F1C943A20A27DD29F941AD141DEBAAD219E056510BC984063FA0F389090D434157438BB1759690C453A2F55F72C033797A4B0C534EA2EA084B3B6F8966AC56B106FCC11EF08902F2ED + +count = 30 +seed = 1787C82DA9F2E6CA9ACF7D6CCA70116A1724902C81EDC1439F332C74807AF2BCCCCDC7AC1788BA798520B2999F39DC3B +mlen = 1023 +msg = E42C006F144B0B4E188FEBC82D63D3D37096DEEC9D3DFC3B421635DDDB73C76F6260FF1C53222A50D30B26E2DE3D16E3AA64C78604E1191BBC0E2553117A441159B2A35FC8889499A2EFBDD2F30B8B4C6CEA38EB5B2575926E6F22AB96DDB4B0C5C6D78C3754A1B6DEBA49FFBCFA7477BE9A0F74EC379D1C9AA59247C091611573AF765AE698D78152187B291717A9F03FE767BCBB12F52311215579352E7CEAA8654B5403F18CE82E0A73BFD5FEC1063B506F44EB1C9C5A03697D03DCB2AE15C5095F292B4BCB130B55C19AB728B3232EF77D1594611573CC6BDAA254F05934A329DC27CFA6CD8C02CB51C3C295C964C40502FE2B1A81A51C866F7C7380BFBE339B39C8F51F73722A05B5D1E9CB6313557B3656863803C9DC99BB1905D7F729B2DB8DA23D88200032F36FFD04DA11FFDF6277ACC69C5407289D00FDC3C56B32D54877F4A8DC70ABD37EC532B8617D9F3C535B8E962FB389E976B4D1AA12DE5C1C2FFACD50ACFFF65201104648E0C04CF7C1F880E8BDA1D68404BA67C4BF64C9D2ACEEF81B35FABCE58645E0F2F61EB4CCFEFDE7239BE408710D349987D849D40B3AD294B9D815A91848F9ED53B69F78D9E955F6D1FD7E38EC291664D54C2BC359FBA241BA6ABCBF5FC2502D93760D9F6B1F7FB766040E98BDC23A6047134A35327FE128AE24B4C7D0CDCF1801947A1821DDD7424892DF50E2DD5C1E2E6C5BFB4467524FB45C7D977604E7E0F1F98EB8C03EEE1D9A5796C8A801F082678940F076BF44D3496730C9A640FEFCE385865899FC33B5DD34D036F2FD5D07FDC0A40FB725E84CE403B46DE712B4B44CA8801A1CCF58233C5DA06719769823B5945849DDABCA56B0B4EF9327C8B5E5A445E6853E5B66B8D590759D6B2DB722C22F8C741CF3C6325A76D93F4FDE5872D5732FB19AAADEB7C18094727ED43B305B87AE2DBAAD67F90FEB86498CF65CC57EA635340F27AE5C5CD60AD3C763223AF877E65A005C488AA4AF9309E1AA02002B01DF8865FD481EA254015796985969997A53B06DF0355A6AB3C8219B652B09E1F86A6CA12D27C4BCB9E8D35E6889198C8FED71AD5642F5F9F7CE1DF270D68AA05467EF9ACD9A51347AF1EE9CA7C4A5D78189042900C6D561F68D410A77E79726DC123B196C78829F02CAE7D0623BFE9E7B0D8BF84033086295992B77ACF027489D51BC7FF006A8D4AB8079D494413A565E7F687AF40DD18B86AA4274EDB8845DF114C0146DE3199CB55F773A87FFB126B3A4D00D38835CFD2D6652C07F572F39D0397FCD62ACF6ED9F3E8951348AE7E52A669FA4E2BFCDA548ABB1989A1D74A27B73103770290E6ECAC87029359354EE4C87A77BCB5CEB10162DD54499905AC8ED442C173CACDE068BC546720D1284015ACB90CA19147694B53899395DC663D6683908F3CBA29AD37F15CD3903C4C7F4BD73 +pk = EEC40CD062FB2D154FD369681296EAAD01C60A878FA19D737BDCD1F28EB40A03E509D6774B73997E1F03664DA624612A3FE0B941B0235EC75640C90D149BD0030B +sk = EEC40CD062FB2D154FD369681296EAAD01C60A878FA19D737BDCD1F28EB40A03E509D6774B73997E1F03664DA624612A3FE0B941B0235EC75640C90D149BD0030BC78F06BCB6BF0F95E4D7A1287796B74449010000000000000000000000000000B0FABACDF0AE3340C12D6EEF36A81DD48FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFD73D07F343B07FAAAA0F356C87D056CE1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000E481BFE6C10AE9DC02AD80123AF452BAC0ECDB2F501E390B3CD08824CBAFD800C101692FF8AE7179F15FE5775F33677ADDB3042E4B689FB09B857D6E2847420089AD5FD2885386B8473B439DC9EF6FD8B284678C51F281AB47BD1872A5765C00A942C7F69CBF928A70F6059CFBAFB264845B85C185B10C64531BAE067DDE1400 +smlen = 1171 +sm = 5B142A44594AFB1E28A84F475E6D5411428440DCFDFE49165585E23C6F1DF7037D39C38F50527D2345D6E8E451297DC0F99B2670079D7AC8A74E6EEFDEC8870200032754C12C5A395FB64F0989DF609FE22ADD0A3336185EF3DAFA09DDE80027F20C007AC3021CFA1C3AD65331E89BDFA7DE58EBFCF6C2856F2461CAA6E0718F1E6546958CFF23B1E05AFC75B27B492D17020406E42C006F144B0B4E188FEBC82D63D3D37096DEEC9D3DFC3B421635DDDB73C76F6260FF1C53222A50D30B26E2DE3D16E3AA64C78604E1191BBC0E2553117A441159B2A35FC8889499A2EFBDD2F30B8B4C6CEA38EB5B2575926E6F22AB96DDB4B0C5C6D78C3754A1B6DEBA49FFBCFA7477BE9A0F74EC379D1C9AA59247C091611573AF765AE698D78152187B291717A9F03FE767BCBB12F52311215579352E7CEAA8654B5403F18CE82E0A73BFD5FEC1063B506F44EB1C9C5A03697D03DCB2AE15C5095F292B4BCB130B55C19AB728B3232EF77D1594611573CC6BDAA254F05934A329DC27CFA6CD8C02CB51C3C295C964C40502FE2B1A81A51C866F7C7380BFBE339B39C8F51F73722A05B5D1E9CB6313557B3656863803C9DC99BB1905D7F729B2DB8DA23D88200032F36FFD04DA11FFDF6277ACC69C5407289D00FDC3C56B32D54877F4A8DC70ABD37EC532B8617D9F3C535B8E962FB389E976B4D1AA12DE5C1C2FFACD50ACFFF65201104648E0C04CF7C1F880E8BDA1D68404BA67C4BF64C9D2ACEEF81B35FABCE58645E0F2F61EB4CCFEFDE7239BE408710D349987D849D40B3AD294B9D815A91848F9ED53B69F78D9E955F6D1FD7E38EC291664D54C2BC359FBA241BA6ABCBF5FC2502D93760D9F6B1F7FB766040E98BDC23A6047134A35327FE128AE24B4C7D0CDCF1801947A1821DDD7424892DF50E2DD5C1E2E6C5BFB4467524FB45C7D977604E7E0F1F98EB8C03EEE1D9A5796C8A801F082678940F076BF44D3496730C9A640FEFCE385865899FC33B5DD34D036F2FD5D07FDC0A40FB725E84CE403B46DE712B4B44CA8801A1CCF58233C5DA06719769823B5945849DDABCA56B0B4EF9327C8B5E5A445E6853E5B66B8D590759D6B2DB722C22F8C741CF3C6325A76D93F4FDE5872D5732FB19AAADEB7C18094727ED43B305B87AE2DBAAD67F90FEB86498CF65CC57EA635340F27AE5C5CD60AD3C763223AF877E65A005C488AA4AF9309E1AA02002B01DF8865FD481EA254015796985969997A53B06DF0355A6AB3C8219B652B09E1F86A6CA12D27C4BCB9E8D35E6889198C8FED71AD5642F5F9F7CE1DF270D68AA05467EF9ACD9A51347AF1EE9CA7C4A5D78189042900C6D561F68D410A77E79726DC123B196C78829F02CAE7D0623BFE9E7B0D8BF84033086295992B77ACF027489D51BC7FF006A8D4AB8079D494413A565E7F687AF40DD18B86AA4274EDB8845DF114C0146DE3199CB55F773A87FFB126B3A4D00D38835CFD2D6652C07F572F39D0397FCD62ACF6ED9F3E8951348AE7E52A669FA4E2BFCDA548ABB1989A1D74A27B73103770290E6ECAC87029359354EE4C87A77BCB5CEB10162DD54499905AC8ED442C173CACDE068BC546720D1284015ACB90CA19147694B53899395DC663D6683908F3CBA29AD37F15CD3903C4C7F4BD73 + +count = 31 +seed = 9E6E12F025B2A57B0F5A3A9FA70396FC332E1802608E5CA07CC4FBA922F1FE5DEA6721B96F1BA2BFB97825A19F08FF2F +mlen = 1056 +msg = 9C311FF20F574CD9B7BCE1DF705AE7DCE6E7A621C935A6E57A59EB31FC443AB1E014AD332FA784583260AA6153C464565C4568108D60CC126F6E8EC3BC9120E5659C86CDA8A31A7131936DE7B3DB39A4692808DC3D2BEE8A99880FF9D1D5EFF1E825A0F043D908D62A99779E013845AC0C21ABE8E4DF0EE901E4C6BEB8BB36B30228B7756D617A8F30C16351D8FF91786F7406F75D9FB648830F88EA4537F42EAD62E8790E9CF11F72C31D718221049C9AA35376AD8FB065F4809F4383A23C2B29425836C2DBCE4680450896EEADEE6B83539ADFDF59AA4FCE709D601640EB9A22DC3B41108A8EE1FCCDE9945EBB1D3F676EC8395255E125E62A32149C73451F597E1C32AD979E5BE914FFC7C548D6AE92ED08501831E9007770A0233E5778F22ADF7F1AAADF9C9A7C82D2F42989BF21627D3EF8BD0377A5BE5C9F5A585A246A73DE4340E6B43B36DB775B34033962646C16F26A2B7179C40A721FEA54805B9EC42177B42160B1A67341235B5AF9F30B2703BFF8CDEEE5BD7CE506B0707A69F84225B6E5A92E80EDFA235803DBE2CEC47CFEF0D9FAC95C3379816A39F4550BDBFB45609C76D0351DDF8D61724BD5E8BE94673B3013EEBE172CACE247D79925B12B5DBA2F6FB72E797B2DA849B79DEE3DB76775F5F1DD4595678671C7B18BB3749FBB0C6A7135D639F16B3864B5A251114DE7E9F8CB02B4CC69902EC8D7D544D98E24A05F8ACCB182E2EB44BDE868B077B1FAC4726E8B01CDD0D024405665F7ADB60A23FDBACF421246354E824CB74DFB35E57902794E459493905400D0A0BAD51D8EB94EFAD55C67CD0C7CEFE7A1B055F06371AEC7F490FA685C611D553D8430992EE7B1855A9CB305B5CE53154345D7DEF6110DDBDB5CB59559EB664C6439E057DC022F8686F2AA0CA81552428437B0CEB5FBB5DF254036BD2BAE7290D947C963046771A39D2656312236569E775E7D2A041B7EECCEC99C1B9D2757C7370E474012AE707AE00AC37B73ED9C8E1A2774E54BACEB42E8B31BEA734463CC15576BD4F7A33430B1987D62E47473391938312F2481838F286C4DFAF701ECBC6EAB1A9F074C1F8D8963457DFAAC9A9A8EEA70C50CE70D1BA1006760AD3887605EC38861DC1A777D21E46EA169537057CDFE256CC08699D73B1AC4FBC62F863353581CAD358B9C573D77585DF6544E5D55048D66A352828CD1ADF5F42310FFAC022A25824430F741371027B2DC14717DC87342A74F0038674187E478D8ECEFFC16474A4AA8BDA0C8D41962EF2A4B64A036C888CCF4EA628E1CB9EE0F9A918FB1B22B9367FEEEE0218C83CC7E27C5CB2AC64DC7E111E3C85CA0E6BD4F685E5DDD428E028D192142CCEE3F0C8337BDF43CE4B62704AA53C703EC334FB56FFDFB81D7D4419535D17E5FCC0E6F558AD82149C591FE0357DA15660F61544B4041128218B6DE2B75D3801510669A3977E2983BCAF957EE2942E504C29890A81542EA208E1CEC +pk = 4F77FC1F90EED21DBA4592770DBFDB0E126221084F646872D8EDE4F1D6673E00D896F9BA5F2B8A63298AC5376A7ECF71D6A67918A38CAE8D2FB5193D08F7660311 +sk = 4F77FC1F90EED21DBA4592770DBFDB0E126221084F646872D8EDE4F1D6673E00D896F9BA5F2B8A63298AC5376A7ECF71D6A67918A38CAE8D2FB5193D08F7660311C928705BF2C11692B322A78EB69D3BC6D8050000000000000000000000000000DCE9289FCDD2357063B13C8502B6A0D79BF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFF9562E31134C3132347EB3651E4DA5F5E6F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000004AD22B365407978C6D48410FC1FAA2D373266E7FD85F5406552C813BCAA89300A3B7DDCF296106118A2E9A8BB60463A461E8FBDCCA73C831B4C7E3FE8B25F5005BDF4BD1217003D54C3C48D36FD9CEBEDE6E27E2E68E35DCD72685284621750093565962ED682CDB4C3441B2FF0160DCA5FB7C4FB973FDFCDAF9C5D7ABBAAB00 +smlen = 1204 +sm = 4E0BD3FC1B984444D5F4D55A586BB26A9DF230DAA2CC7A74842296F13E353904E64FD56F8B9BCD42FBEF93689442C1BAC53BADDB49B2EE7E35998D2D66142C0100028FDCC0E68EA71BC7ECFACC51F15B9775D1D458817F079CC34892D8F49475EA9A70928BA7D45B1A70B9015676CEAD201E2489462AD3AC0801E159F0B4030A5F7568EC323EBC43DB75A428E0D49B8A340302119C311FF20F574CD9B7BCE1DF705AE7DCE6E7A621C935A6E57A59EB31FC443AB1E014AD332FA784583260AA6153C464565C4568108D60CC126F6E8EC3BC9120E5659C86CDA8A31A7131936DE7B3DB39A4692808DC3D2BEE8A99880FF9D1D5EFF1E825A0F043D908D62A99779E013845AC0C21ABE8E4DF0EE901E4C6BEB8BB36B30228B7756D617A8F30C16351D8FF91786F7406F75D9FB648830F88EA4537F42EAD62E8790E9CF11F72C31D718221049C9AA35376AD8FB065F4809F4383A23C2B29425836C2DBCE4680450896EEADEE6B83539ADFDF59AA4FCE709D601640EB9A22DC3B41108A8EE1FCCDE9945EBB1D3F676EC8395255E125E62A32149C73451F597E1C32AD979E5BE914FFC7C548D6AE92ED08501831E9007770A0233E5778F22ADF7F1AAADF9C9A7C82D2F42989BF21627D3EF8BD0377A5BE5C9F5A585A246A73DE4340E6B43B36DB775B34033962646C16F26A2B7179C40A721FEA54805B9EC42177B42160B1A67341235B5AF9F30B2703BFF8CDEEE5BD7CE506B0707A69F84225B6E5A92E80EDFA235803DBE2CEC47CFEF0D9FAC95C3379816A39F4550BDBFB45609C76D0351DDF8D61724BD5E8BE94673B3013EEBE172CACE247D79925B12B5DBA2F6FB72E797B2DA849B79DEE3DB76775F5F1DD4595678671C7B18BB3749FBB0C6A7135D639F16B3864B5A251114DE7E9F8CB02B4CC69902EC8D7D544D98E24A05F8ACCB182E2EB44BDE868B077B1FAC4726E8B01CDD0D024405665F7ADB60A23FDBACF421246354E824CB74DFB35E57902794E459493905400D0A0BAD51D8EB94EFAD55C67CD0C7CEFE7A1B055F06371AEC7F490FA685C611D553D8430992EE7B1855A9CB305B5CE53154345D7DEF6110DDBDB5CB59559EB664C6439E057DC022F8686F2AA0CA81552428437B0CEB5FBB5DF254036BD2BAE7290D947C963046771A39D2656312236569E775E7D2A041B7EECCEC99C1B9D2757C7370E474012AE707AE00AC37B73ED9C8E1A2774E54BACEB42E8B31BEA734463CC15576BD4F7A33430B1987D62E47473391938312F2481838F286C4DFAF701ECBC6EAB1A9F074C1F8D8963457DFAAC9A9A8EEA70C50CE70D1BA1006760AD3887605EC38861DC1A777D21E46EA169537057CDFE256CC08699D73B1AC4FBC62F863353581CAD358B9C573D77585DF6544E5D55048D66A352828CD1ADF5F42310FFAC022A25824430F741371027B2DC14717DC87342A74F0038674187E478D8ECEFFC16474A4AA8BDA0C8D41962EF2A4B64A036C888CCF4EA628E1CB9EE0F9A918FB1B22B9367FEEEE0218C83CC7E27C5CB2AC64DC7E111E3C85CA0E6BD4F685E5DDD428E028D192142CCEE3F0C8337BDF43CE4B62704AA53C703EC334FB56FFDFB81D7D4419535D17E5FCC0E6F558AD82149C591FE0357DA15660F61544B4041128218B6DE2B75D3801510669A3977E2983BCAF957EE2942E504C29890A81542EA208E1CEC + +count = 32 +seed = 569B8B9BDB707B19CD6F9BEB29F304D603C1509B9CF25987C280C342E870B1E13EFC7DD7E41DC85BF4F42D0493B84B0F +mlen = 1089 +msg = 7FF38725F35312D75E58845FBC33E112DD95D5C1CF78119CB413AC839377C7051BF5F17ADD1484F5EE12F42B0587AB41DF487BA5E4D8836777B614A9931A5FEFDC4AC451662B342D675C940061C4FF01F747B69CFF585FC5317636E2A830140C0007F73C76FCAB96195C86DB98E5E65C733825DB0325407E5BB059490F2E9133F9B4AA328976256EAAED2FBC59D00288D4830D99731A3AEF36E5BF5239F2899C500F942B80B00C3B33307450FF0C105BEDB7DF84231C5D24C3C3475AE2F46336582DE93AADBFD385C824F21362C19B1C6A75F56B69297FB3084B6164204E2348CB1D7CD3AB494BFA7EC8FE346251C874085F803BD7F4DDE1995F0D3D17033C461D06B49ECCEEE0D5312C3A435AF5BEC9808ACC524599668AACD95ECEA7EF07C4CA3FAB1CF964FDBA987C345046E6507AC3D372BF07D72CAB816BA627C2BD452AB8DC3044A7F0A01D8C0EA47904A5DD66C6B7EF9130D628A4F2CEA5A0D05AEAB7DAF2729C1041FBDB3C2D17BD66AE293C03E77A0837419471C29691EDFB20CF69BC6260975089AA437628F140A44FA2E2967357AC1BF1345E4208C33CFFEDE6CD634B371E7745143FF848F77E5130D1E0F51868585509F9CD3B906EE0A5072CA2E908D6765C74D9B5C35B6BA784A3EA59D808ACBB1C24D6C088CA6C9E17BCEB18337A4DA0C1DAEB5D51EFB35712A475D6C5A2EA51E93FD79F7DEB127F3418F354DF06489E10B42BC1F20651660CAEA17F67F306F48E15DB7E67A1B56578BA7BE6C229FED9567E128D48551E6EEFA17AF5B95A716555571F44FBC41AB29208DB7C1846E130866D5C9BE6F73E601C55610DFD0F67D98933D252059DAA1DEC20AE0E5BED6568A6322322D8A40E6835FA66E317733E1B465434532EEA8FA76886B600E06EFC1DA41F8DCEC0A5E8BA8419F0B7879CC0A93BD14D99608B5BEA931D8971DA8D2D89053E1DE40209E257E741BEF48C17FA15467F1312A368D4A061BFC76C2B7BBD900B4A34DA51B7CB5BD6E2FB08806A53C0D60273167D822FB6982785F2C3B0EC7D893B615724D0193928D0EA8EA2A1DEC5ABDCAA904C754CB7747449E87221B3D86BD5DF26E11DA753E768A8B481C306E485EC91074377DFC68BE74A444906E420C2D8BCCD84BE13AA5CCD11115B669C89E9C0CE374BC4059C696E5F8344FEE467AC8C8ADE37DAF614992914C763D971327B60946943847FB6B82672CC376B780953B6F4433DF69AC61E110FBF1A35F6272561193D8652EBCE3291333FDD4D84B9CFBC60A57E1F8B817E84EA15D440D4A4B4F7E19C08DDFC5949FE8CBDDCD0296A62F12F53D48B1288B80E24C756FC38E2FAE9C7A3315D1C6DA42AE838AFBBF5569F633A68289EB7073BABCB210F4E08856FA65057BFABC70AD3B58C2C870DFB5E1B0D11B6FA6D5BBB68285D8F9C21BD89669781C9F4DC32EB1EF58B80B1D371334D36FA66A2B3DD4B3E4DEDBA7AA9FB7E0245F5FDBB66CDA653C5232A131EC1F0C21DB1C47B990A64A24DC8C4DA951F419F57C03FF506E0147C22E99461 +pk = 8EF626758D69A8CF76AE0493ACB1AF6C17BE63C351DAE88132EC3BB3F880FE00269B7CD82FDF2B3191B8EBA352DB9BFE4BAAD9BBCBF1441459E33230D8F20F020B +sk = 8EF626758D69A8CF76AE0493ACB1AF6C17BE63C351DAE88132EC3BB3F880FE00269B7CD82FDF2B3191B8EBA352DB9BFE4BAAD9BBCBF1441459E33230D8F20F020B3BDFD304814145330D32D5C34306647984010000000000000000000000000000AE972967F71ED4CCE32687BF7A9D869C83FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB8BC90564402565B86591C73314BF8C25FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000C9D89CBA14E33EDA867814D3951A3A9304EB69D01448175D35A267E11B8EFC00B39563CE66955B6DB42BD8E109A73428A94AFE23258BE786BF7B8DFB405E8D001E3F613D49E6B0200FE291D63C9788180C96F535CEC490042D395173A3277B00857D96594865DA85E32951C0F327B388A9787EED6AFEEAF0815234C307C1CB00 +smlen = 1237 +sm = 226BA078855ABC4411832007A27CFD9DFD7F122F8DC722104AED53F02E39F5047DE8028E0F78B7C42842AA07CED6E3E28CAA5360B06ADC62F5F22259BCF6E10200023DEF454D6314D3B6022974E5D530174C2D8E4C9CA2C51648ACBAEAA97240CB596052A8B361F3E10E72AA836B4F40F8DF54C3F056360D17F416D9B27328BBB93B24BF418217B01FCF547AAC74385DB300110B7FF38725F35312D75E58845FBC33E112DD95D5C1CF78119CB413AC839377C7051BF5F17ADD1484F5EE12F42B0587AB41DF487BA5E4D8836777B614A9931A5FEFDC4AC451662B342D675C940061C4FF01F747B69CFF585FC5317636E2A830140C0007F73C76FCAB96195C86DB98E5E65C733825DB0325407E5BB059490F2E9133F9B4AA328976256EAAED2FBC59D00288D4830D99731A3AEF36E5BF5239F2899C500F942B80B00C3B33307450FF0C105BEDB7DF84231C5D24C3C3475AE2F46336582DE93AADBFD385C824F21362C19B1C6A75F56B69297FB3084B6164204E2348CB1D7CD3AB494BFA7EC8FE346251C874085F803BD7F4DDE1995F0D3D17033C461D06B49ECCEEE0D5312C3A435AF5BEC9808ACC524599668AACD95ECEA7EF07C4CA3FAB1CF964FDBA987C345046E6507AC3D372BF07D72CAB816BA627C2BD452AB8DC3044A7F0A01D8C0EA47904A5DD66C6B7EF9130D628A4F2CEA5A0D05AEAB7DAF2729C1041FBDB3C2D17BD66AE293C03E77A0837419471C29691EDFB20CF69BC6260975089AA437628F140A44FA2E2967357AC1BF1345E4208C33CFFEDE6CD634B371E7745143FF848F77E5130D1E0F51868585509F9CD3B906EE0A5072CA2E908D6765C74D9B5C35B6BA784A3EA59D808ACBB1C24D6C088CA6C9E17BCEB18337A4DA0C1DAEB5D51EFB35712A475D6C5A2EA51E93FD79F7DEB127F3418F354DF06489E10B42BC1F20651660CAEA17F67F306F48E15DB7E67A1B56578BA7BE6C229FED9567E128D48551E6EEFA17AF5B95A716555571F44FBC41AB29208DB7C1846E130866D5C9BE6F73E601C55610DFD0F67D98933D252059DAA1DEC20AE0E5BED6568A6322322D8A40E6835FA66E317733E1B465434532EEA8FA76886B600E06EFC1DA41F8DCEC0A5E8BA8419F0B7879CC0A93BD14D99608B5BEA931D8971DA8D2D89053E1DE40209E257E741BEF48C17FA15467F1312A368D4A061BFC76C2B7BBD900B4A34DA51B7CB5BD6E2FB08806A53C0D60273167D822FB6982785F2C3B0EC7D893B615724D0193928D0EA8EA2A1DEC5ABDCAA904C754CB7747449E87221B3D86BD5DF26E11DA753E768A8B481C306E485EC91074377DFC68BE74A444906E420C2D8BCCD84BE13AA5CCD11115B669C89E9C0CE374BC4059C696E5F8344FEE467AC8C8ADE37DAF614992914C763D971327B60946943847FB6B82672CC376B780953B6F4433DF69AC61E110FBF1A35F6272561193D8652EBCE3291333FDD4D84B9CFBC60A57E1F8B817E84EA15D440D4A4B4F7E19C08DDFC5949FE8CBDDCD0296A62F12F53D48B1288B80E24C756FC38E2FAE9C7A3315D1C6DA42AE838AFBBF5569F633A68289EB7073BABCB210F4E08856FA65057BFABC70AD3B58C2C870DFB5E1B0D11B6FA6D5BBB68285D8F9C21BD89669781C9F4DC32EB1EF58B80B1D371334D36FA66A2B3DD4B3E4DEDBA7AA9FB7E0245F5FDBB66CDA653C5232A131EC1F0C21DB1C47B990A64A24DC8C4DA951F419F57C03FF506E0147C22E99461 + +count = 33 +seed = F32C3715B0BA8C1D0BD59F0645E9697DFCF9AEAF761A71ECDF9672215B9F138C0502D7214F6B1BB4D6612432F9FBED5E +mlen = 1122 +msg = 789518EE21DC99CAC94DD5298B2F3EB8F6AB8D0705D24D9AA3012F217464E7F203E08E5CEA9E44F54A6F73E88D81592826E243B7F0B2A1B3A06E5AFDE23A2985183A0E430E01C3FA90E9F1DB7E69DD8E7DC6FB802933E04A18834C091ECD46F0DD423F532668CEE8A12A06BBC7E5FF3B9488B8F4A87A92BB8D6F313269AD95C574245E06563BB58BFF6169B8F4C333033BC128B91CB81DD41B831DF5103B295F744EDE95FC3A0C72F1134A9321836AFCFD563192C343040B943F69C0E98E8D740C06CCF840CBFC6BF777C9561065916F13D116D758A151E8FF4C355363AAE8E4F49D2A2E062A2BB213AFF25662D95549B4B025E70AA3363B50D25AF84A3E5B0FFA598CE074733AD191C86C351592299C26C0A4933573EF436B73DFD0C4EACF93D361AFE5F824B91BC178EE8381B9EFD52302AB8CAD6C08C7E090393B9B8ABC78AF374FAC6E60BD104BAABA524E68D75A759B94176105A9CFF2E5B9C3984FF61C5AFBF22B8E1B9E4F9BDFFEC0B19C2A5C8DB3B8B2C02115D101805C1BD6652F738F02600E38998CA41BA8955094FAD5BDC34133D4B523EDE66CF483F1CD5ACD9EFAA69703807410939974D6DC033BC696541357DA9881A4FD1385671B6E4BB889C68B544175C1E2EC1395DFF4CC87E037087C615CAF40804D5F44A2DE301961A59818173730A45CF4C2DF172614AFF7199A40C9FFB9957242A89FF86B36A4F4D60F15DB569C2FEFAF677B35FE5F12AD5A323397714286E338FF6B9080FCA50B657DB477A52A93B243BF28CE2743794C361F443AD81EBAAEAB2B237EBBC572D8586C3EAB1F42BAEC1C985D28BC58B296A11D96A04B0E1F7F6790B92E450248804F3F62B5865941BFD444A910F31E1D6B79D8906E7E9828618F960EC14124FBEED28E1F58A8BC9D31773442FEDC5A220F3912D0B41267D427C0C15BB76F9200C54B5F050307E13F1EB3DE92B864C994A3DF4CEBD1BCA634710FA342E23D7C8A5BAC1B58AA321E215E4418428206F05232E2BCD1B5EE1BB7E34E7D4C93088991EE9DD643FD08B0185A2F0AEFFB0EF0EEA3ACB4CE234BD5479A4F4296001305826F23083CC9DC99011864F250E77E42A0DE26AB09FF6E3F32552F6F913256729B357CBF5DFC825E91BB5D3FAC1F729803D431D339955960EAD69B1E54536CFD774341CDFDE1D1F527DA4E738B2E292BDC884687D1016DC193EDF34A37D284D026D33698295E864196E0BF16FA83A35F65FF2B38B7030E9E63EAAF594F272E07941313D538546BC84671739AF822391CA4DBE6A579A81F45FF51FA5B7EF49BEEE7BEBA4AE07452C13366668F02752923EA3653043B26C883799FE6352F95144283D946CA87143B74C8A009C024D073BAAB9BC4DA6C87D35FFFD753E1EEC7F01944639E566FE17A6F715F4197D1CBA58D3D153BDA37D7D2D5E19620FF0842527D109333FA2BA8BFC491689F4551BEE6C9D13BB9E69EE4F44B782BB05D1E48D293BC15B9FC706D52B021C7159FF7DF80E55627DD7555795F1FC616830A4BA2C02FE1A19DABE088E460BF3C5A88313C443179C593458467FAA468791CA74E9B1E759847B6939F +pk = D712BBD4AE5336CBFEDEA234396FDF13ADA9D28E9C61FE1736DEA3014743C502BEBFFB096AC6CD1DBF16A0F6A35A00F7190FCD7D00B32D9986B0E21F0FB0F70306 +sk = D712BBD4AE5336CBFEDEA234396FDF13ADA9D28E9C61FE1736DEA3014743C502BEBFFB096AC6CD1DBF16A0F6A35A00F7190FCD7D00B32D9986B0E21F0FB0F703063FBA3B57771B22E40EFACD0DF0959A2436010000000000000000000000000000382043A7221C21E823FE41B0EBDCEAB551FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF3519FE6996C2D54BE359706831C6F698A9FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000008B0BC86CA755B29C7E0305FA1FD0A33321E33CF9CC1E4E9B8061167EB5506A00EC95DC725E4991379EAE434FDB94294AE553B3B1581AD9FDFD8CD7219191010066D7058525BD480B17BC1F10AAF680430133150E4E37C9BDE9571D45EEB7AC00611C4DE7B09E5AF71247272A6E1BA26B6FE056B47CDB3E4016FDAA2541E79F00 +smlen = 1270 +sm = 7E868A6DB87CB901A91C9132418ABD2C96464A1221DAC2B961BF24282DDBF2000008FF6AE0B55D5B1444F2956F32A2836783F01AF3906B8940D26D8E3A271C030001127B4293C1EE4EED682963C23CAD6B42173CCF567B4FF2E07D814BD66ADE43FBFA7408FD70FEAAE0377ED22F571C31371807CCB831BC01D9F33410FA1E1227C4D21A004B821F958B6F741CEB23A06A000211789518EE21DC99CAC94DD5298B2F3EB8F6AB8D0705D24D9AA3012F217464E7F203E08E5CEA9E44F54A6F73E88D81592826E243B7F0B2A1B3A06E5AFDE23A2985183A0E430E01C3FA90E9F1DB7E69DD8E7DC6FB802933E04A18834C091ECD46F0DD423F532668CEE8A12A06BBC7E5FF3B9488B8F4A87A92BB8D6F313269AD95C574245E06563BB58BFF6169B8F4C333033BC128B91CB81DD41B831DF5103B295F744EDE95FC3A0C72F1134A9321836AFCFD563192C343040B943F69C0E98E8D740C06CCF840CBFC6BF777C9561065916F13D116D758A151E8FF4C355363AAE8E4F49D2A2E062A2BB213AFF25662D95549B4B025E70AA3363B50D25AF84A3E5B0FFA598CE074733AD191C86C351592299C26C0A4933573EF436B73DFD0C4EACF93D361AFE5F824B91BC178EE8381B9EFD52302AB8CAD6C08C7E090393B9B8ABC78AF374FAC6E60BD104BAABA524E68D75A759B94176105A9CFF2E5B9C3984FF61C5AFBF22B8E1B9E4F9BDFFEC0B19C2A5C8DB3B8B2C02115D101805C1BD6652F738F02600E38998CA41BA8955094FAD5BDC34133D4B523EDE66CF483F1CD5ACD9EFAA69703807410939974D6DC033BC696541357DA9881A4FD1385671B6E4BB889C68B544175C1E2EC1395DFF4CC87E037087C615CAF40804D5F44A2DE301961A59818173730A45CF4C2DF172614AFF7199A40C9FFB9957242A89FF86B36A4F4D60F15DB569C2FEFAF677B35FE5F12AD5A323397714286E338FF6B9080FCA50B657DB477A52A93B243BF28CE2743794C361F443AD81EBAAEAB2B237EBBC572D8586C3EAB1F42BAEC1C985D28BC58B296A11D96A04B0E1F7F6790B92E450248804F3F62B5865941BFD444A910F31E1D6B79D8906E7E9828618F960EC14124FBEED28E1F58A8BC9D31773442FEDC5A220F3912D0B41267D427C0C15BB76F9200C54B5F050307E13F1EB3DE92B864C994A3DF4CEBD1BCA634710FA342E23D7C8A5BAC1B58AA321E215E4418428206F05232E2BCD1B5EE1BB7E34E7D4C93088991EE9DD643FD08B0185A2F0AEFFB0EF0EEA3ACB4CE234BD5479A4F4296001305826F23083CC9DC99011864F250E77E42A0DE26AB09FF6E3F32552F6F913256729B357CBF5DFC825E91BB5D3FAC1F729803D431D339955960EAD69B1E54536CFD774341CDFDE1D1F527DA4E738B2E292BDC884687D1016DC193EDF34A37D284D026D33698295E864196E0BF16FA83A35F65FF2B38B7030E9E63EAAF594F272E07941313D538546BC84671739AF822391CA4DBE6A579A81F45FF51FA5B7EF49BEEE7BEBA4AE07452C13366668F02752923EA3653043B26C883799FE6352F95144283D946CA87143B74C8A009C024D073BAAB9BC4DA6C87D35FFFD753E1EEC7F01944639E566FE17A6F715F4197D1CBA58D3D153BDA37D7D2D5E19620FF0842527D109333FA2BA8BFC491689F4551BEE6C9D13BB9E69EE4F44B782BB05D1E48D293BC15B9FC706D52B021C7159FF7DF80E55627DD7555795F1FC616830A4BA2C02FE1A19DABE088E460BF3C5A88313C443179C593458467FAA468791CA74E9B1E759847B6939F + +count = 34 +seed = B0C7530A52AC9F561C2C14548D3A5F5053396B738EA1C7A5190F5AB01C9C38719C4DBE856E42D37A114FA24FD5DF5081 +mlen = 1155 +msg = A4117808D9D05B702483924E99623E778E7A3B7623739AB7AC488ED93E711EBDDEC383BFB7E06086FD0C374F4668AB744AD99B8AF1C75309B60F55DC03FF7BE6F23187FFD5CB224068568CE2D06ABE441557B04A5A0C2858C416F6F7AA89A96ADFC2AFC54E0F31416CEED005B7B140B342652DAC7BF401FED4D94D475784936FCEB4B4F334BB14BA55B1EA9A36E2B0591287EAF4ACED997162691A96E7F59853E609ECA9A225F615A49A12763D80B5DFE6F8638923C39BD652936B19B944D5116F790E866A61947EB60CD1F3A1F319710D0F40E487EFBEF51FB4D00F5DBB94810128215F72B1AEDD74A1B1D237088DE3098417714EEB67D6A3E6BB647B6B0AC6D0BA3089D4CF6252B69C414E2BD6614429B6FCEABEBA50A4B53C7394652ACF7DD9403AE14436ED5FD4D1C9E238A8399A763806FEF5C3742C55B7159EBF5A13B271428F91229C191D617808A26AF9190F9D445BFD3B273702BC3E7F610854C8E86066BE7757960A880CB6727CEF19DC7B464C464A7DAC9AE85B799747B8488A4123B6BC7F0F7C2A8E53FD4F8687075B4E25660F5107ACF22CA688057DAE0496FF15A3EB9379A9F6E22FA43C932F137E389478C05DB86060686AFEAFBCB9ED79AE194C4146A48CE5E07EAF585279313851CB864A50075AE46C1AAB3B3CB920DEE2652F5AFA0138051C7C980946E8D5E18C16789CD184DC5598F65875EF43418DD56E11DEFB5A4A6AFBCE041BB292E0E2EC563296BA4EA6CBFDCCA32A18C8AA395515A83D0FB7819413E5AE056FF0EC2F63F1D52A8BE0B334A628D00995BEC7E46A34BCD2DCA0E9C5A88E0FC8C43843D6AE074C699276293FD8DB2BE48885155688428C2F5A6C6C91BD4A03CDE2126205F9EBAFE319D1B4F80277FE99211A09628AD840046EB9AA568EC71252CE9F69827B677D9C0D99546DF5A48A8D253AC0036DDAF4D045A70F94EC54BF5F06296B2C2617F2B0EC0B8374DD28DE269FAF739B1E55AE1846F548FB6C0403C5ECEE3CF9D1927E317F0D07E11AEBA01C240FE17C6660F7CB32305AF1EB6DE4312FDEA6990DA4E9135DBC0B88AD0AE0847E1576F3C2711B785B846C7A4B823688E4218596CAED583A90DC46BB9B27E00E4C1110B65F77E602F043A8441563667691C07162E52A53CD76E2D74DCAAA2983BF2E8F02CC30B05BD4F9AC731931C59F9EBC038FAFB09FBC886F4C4191352206BB49ADAEF9D74BD08A5B780FF0FA301343F5EA81D36912ECCB0FF24BBF0BE6A8283EBDECA79CFB22639DA38C9C639C4BD66FE5A75F0414FCC1455702856E6FC58344BF02998E17E967183AE920B7E04F58AA09145D6DA79B65EFCD18EC55BB9CFD53914F80D73C2B08BB754AC63E4C82D44B72376A544D97394B7C99678758B15CB94E71F9FCCF674B29ED5AFDCE452959BE5AF510D57F9E5395A576EAA1FA7BA9AA4122A779727071FA485C005B447760410DEE20B7C2299B4A0D5D9E5E4E038A19C87806C3FB875EA5BD7F47D034D7D5FEC4BF132B04E47574172D392EA7B371516190AB81C67B45FEF6332848A51B6C7DBA90C410A44E9A88AC082FE296A7435E7D2DDFC645D5AEBBC29620525757DAD1B0222159D658C7225D02374EE6AF479FCF1AA28CD91B +pk = 1C7A0470455CC492AA0CCDDA3C626068B72ACD52FDF6C5C1B669213C6482730032B23F7B2EAF659A49A6240DC70BF63C514E6A1F9ABE19D90F1657185E6C7B0304 +sk = 1C7A0470455CC492AA0CCDDA3C626068B72ACD52FDF6C5C1B669213C6482730032B23F7B2EAF659A49A6240DC70BF63C514E6A1F9ABE19D90F1657185E6C7B0304E9CB4B41E85BE3AE005F234D8BD4C1ADD903000000000000000000000000000026183DE41F9C6E47C1B369C9464A9628FCFBFFFFFFFFFFFFFFFFFFFFFFFFFFFF375656507B05A8EA2DEE976E09AFD6F582F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000F3A953DC50852C5AC0A19176BC8FDBD9A1607CADD4AD1E1720ED22BD25643C00AE844290A645181678779777BE20603A723FCD56F962BF8DD022414C60085D00BCB58299E6C246B3B730824014678621E4DA93BA592045757E646A2AFE371400B14D652B1514CFF637E47D4D4723A523A71624872083E552CE3BBB61D1CC2F00 +smlen = 1303 +sm = CF1B756F0C6360A52AA5E4E7DAAE23EFBC554444D2691B73EB340F0259210C0181025FAB7B9DDE7FA9D806438275DA3AFF2B21633B9308E9594045318145160100013DFBA0816DFEE5805FD4AEE64E9EF82F7375889AF06211DACEA27E4E29544A0032BD13E4B669952963D97C73440FA419007485FBD41ECF247BA6ABB245DA0CC1E2E5A7B6C1BAF3FF48EACEB7F0A267001102A4117808D9D05B702483924E99623E778E7A3B7623739AB7AC488ED93E711EBDDEC383BFB7E06086FD0C374F4668AB744AD99B8AF1C75309B60F55DC03FF7BE6F23187FFD5CB224068568CE2D06ABE441557B04A5A0C2858C416F6F7AA89A96ADFC2AFC54E0F31416CEED005B7B140B342652DAC7BF401FED4D94D475784936FCEB4B4F334BB14BA55B1EA9A36E2B0591287EAF4ACED997162691A96E7F59853E609ECA9A225F615A49A12763D80B5DFE6F8638923C39BD652936B19B944D5116F790E866A61947EB60CD1F3A1F319710D0F40E487EFBEF51FB4D00F5DBB94810128215F72B1AEDD74A1B1D237088DE3098417714EEB67D6A3E6BB647B6B0AC6D0BA3089D4CF6252B69C414E2BD6614429B6FCEABEBA50A4B53C7394652ACF7DD9403AE14436ED5FD4D1C9E238A8399A763806FEF5C3742C55B7159EBF5A13B271428F91229C191D617808A26AF9190F9D445BFD3B273702BC3E7F610854C8E86066BE7757960A880CB6727CEF19DC7B464C464A7DAC9AE85B799747B8488A4123B6BC7F0F7C2A8E53FD4F8687075B4E25660F5107ACF22CA688057DAE0496FF15A3EB9379A9F6E22FA43C932F137E389478C05DB86060686AFEAFBCB9ED79AE194C4146A48CE5E07EAF585279313851CB864A50075AE46C1AAB3B3CB920DEE2652F5AFA0138051C7C980946E8D5E18C16789CD184DC5598F65875EF43418DD56E11DEFB5A4A6AFBCE041BB292E0E2EC563296BA4EA6CBFDCCA32A18C8AA395515A83D0FB7819413E5AE056FF0EC2F63F1D52A8BE0B334A628D00995BEC7E46A34BCD2DCA0E9C5A88E0FC8C43843D6AE074C699276293FD8DB2BE48885155688428C2F5A6C6C91BD4A03CDE2126205F9EBAFE319D1B4F80277FE99211A09628AD840046EB9AA568EC71252CE9F69827B677D9C0D99546DF5A48A8D253AC0036DDAF4D045A70F94EC54BF5F06296B2C2617F2B0EC0B8374DD28DE269FAF739B1E55AE1846F548FB6C0403C5ECEE3CF9D1927E317F0D07E11AEBA01C240FE17C6660F7CB32305AF1EB6DE4312FDEA6990DA4E9135DBC0B88AD0AE0847E1576F3C2711B785B846C7A4B823688E4218596CAED583A90DC46BB9B27E00E4C1110B65F77E602F043A8441563667691C07162E52A53CD76E2D74DCAAA2983BF2E8F02CC30B05BD4F9AC731931C59F9EBC038FAFB09FBC886F4C4191352206BB49ADAEF9D74BD08A5B780FF0FA301343F5EA81D36912ECCB0FF24BBF0BE6A8283EBDECA79CFB22639DA38C9C639C4BD66FE5A75F0414FCC1455702856E6FC58344BF02998E17E967183AE920B7E04F58AA09145D6DA79B65EFCD18EC55BB9CFD53914F80D73C2B08BB754AC63E4C82D44B72376A544D97394B7C99678758B15CB94E71F9FCCF674B29ED5AFDCE452959BE5AF510D57F9E5395A576EAA1FA7BA9AA4122A779727071FA485C005B447760410DEE20B7C2299B4A0D5D9E5E4E038A19C87806C3FB875EA5BD7F47D034D7D5FEC4BF132B04E47574172D392EA7B371516190AB81C67B45FEF6332848A51B6C7DBA90C410A44E9A88AC082FE296A7435E7D2DDFC645D5AEBBC29620525757DAD1B0222159D658C7225D02374EE6AF479FCF1AA28CD91B + +count = 35 +seed = B2FD7BFAAFB667C9DABE5915C3BC271EF41F18588666A6F4990C09D098E62DB590110DF6A56F08C5E0DE65B00F91D60F +mlen = 1188 +msg = E82F5ACC7C1A326D430475357629D568EA3D0DBE131114781D5BF8DAA32FDE9F3CECD288ACD14445678C5EA6D3AFAFCE48EA3957A6AF8D8F23F78D84130FB6419F706EADD430CC85AFF48283F15602265059ABB075E011E3941834EBE70787CDD55F1E604C6B86F761D94C4F5E525791333DF6D43869D6F36B212A8F35583D38A21D0947CBE26FBE6A36E189C73137F2F2D89F48566D04D2DD9125D2EA4E0B2A7E5C1E9D2EA036CFADCF7BB28F6DF3B7D6395230C9D39D1E7558EA25340252708BE23EC6C0C9A0946C5C5AF0FE037C254D1A5B2B70B8F916CF37945BEF76BDFDFB19A0DAAC5A83A6357E986B3155CFF31024121634C3700CA99E5ECEF1F2E411C6621FED6092C1AB59860271AC7F431E568075D59F71AA18096195F30BBEB1A6BAC20E034F83C72BE0536315879F1D1B7F31D38C12DD8E97819B4803D02BECD436B61D1296CEB78EBF857E34087EC8AE8395269B5B0770B3423B39638910D2A3DDFEC8502389FD8B5B09FFD10CAAD1A5C86E7E39629AB09A4ABCDD00FBB9821F92E7DD24DDA83D1D9762F52A89BED6C20648EA04FBAD4233E5920AE83FFEC28FDB5E432929A41DB782B2CEA8FEB40CAD0B27903050B650477E5D9443A536ECDFDAC673952810596F1985427359D9E4797CABCCD2FA0C0A2394D853B4E6F8E150B3E3AB5136CF476605FF5FFA9067C0FE58A143B50B18B09256657CF091132D449A6E7EE79AA870E9DBE46BF840EDCB983F585EC2856C059808E72B8C901A25D6AFD5372F168D533052A6D26418E035D87D0BF818ADEA19915047C8D824A425A8C7915756673E0F5FCCB1B4FE7C1FDFCE505F7E18F023FDD32A605906EC48E0FA755B6D87E47711E158D672C5FB4CD3B8D1D13FE9EECE58453987CFCDD87B621B870F3AA27E73B6FB7FC0A6757893B978C63B7723C49D1005A1E5B1A4D60C4A2FEF392DF7EF97F149B499164455633FA485BDF92F804A47C8703D124522D73887A2B032F10F45343993FFB009D69E80FB54B6999A5BDB2760F8BCCA648F3C52BFA1D887AE49862DB4CBCCC7213ACBFDC48A57C3DA1F1EBBEA828182432AA1C593C3E5591C825E5706A5F9503311E91EC3D8F4A9554C3DF915B5FBE0516A7A5597ECF8862A8DF286ADA96C90C9F2783F7F947A18EBBC64C1BAF24B29F77521A9EBE09BECFFDB902EFCD024046FD3E6182BF0C84BD3A0A5410EEDBABFC60114E5DB28B0943D79F58F766E2EDB16759850D4CC3A9A57AE073CF6F3B24D36A4365E2BC64674259170B6D11DFF63D0DEED085B6321C45F218E09351AA0D4155189CC98DE5627A03396A067AB3FEA2C133062E3823FB1CAFA5D592070C8E82ABE812979DBDCB6D2E595F33830AD0E8E2F9E6CDC4D9C74B8026EAD1815DE36772769C4E00806F79950A40C979C14A4BDBFDB79DF1DE01FDFCAAEBC93DDBAD62BA166843A121D2B144559064E9DE9E310DFC93D624C1061BAD3195D6C9F46DB64C65A31E90371F9B644E2A15E01C262395269A9AE83F50776F852903F86E5518BD008CF1B35E78F910D48C0B7BBAAAD5DFF2375C55D56B8F65B922229D5F494EDCCD2D676361619FEDFE6BF0BFD7E4C77FC459F181120C4430C409BA89D2E5A8C36CC6200497611D9D705DA6AE1ACA4E16B389D632A982E017E1DAD95DFFBC7A7D7191E7B8FA1C0ED +pk = 178CC5467BA0A2C39829F69A994396F05BF021370DC3CCF9AAB84A21F9181B00EF4BE58D6AC1E19B11817B916391B97C582EED3FA5DD2069CB8AF00E12BA48030B +sk = 178CC5467BA0A2C39829F69A994396F05BF021370DC3CCF9AAB84A21F9181B00EF4BE58D6AC1E19B11817B916391B97C582EED3FA5DD2069CB8AF00E12BA48030B33DC78529516B8A5AD7EB36A4B88DF8E400200000000000000000000000000000CD078EE9357BBAE92B892780743F161A7FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFD8ED2930BDB01F24A6924EF834FE091FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000025AF511EC28F8B66DAEC418735908FCA9C0A5FEC1B0DC8312FC38E885F3D4300BAD889091B6B51DA54AF762FCD2D51C45CC98C978EC661978009A7A4EF82DB00E783AD4F36C260274AEAC82219E2FDEC2332CF4434D12B43B5FA6832468D3A00C3C498606FAED77C5B0C1B49E316C685151555735C16CDD699B5CA58E2F9AB00 +smlen = 1336 +sm = 1EEB1004A37A22D64FC4FC394CDE0D531CAB1942689D49D65FD6E6DA25316E01343DCCB852D3EDD6710C8574431131BFB4DBB436581D38731B50424FF3ECE6030001BF1AE0161A78AAF1BEC090C93CA49C9285A7D0D6FDB278BAF326F73B91ED92E579D8744F70D2A5E80628F587B0AAA661AD6FBC86E1F7845A88354CBAF32934384BC8475F8B89E849449E868E752DB7030202E82F5ACC7C1A326D430475357629D568EA3D0DBE131114781D5BF8DAA32FDE9F3CECD288ACD14445678C5EA6D3AFAFCE48EA3957A6AF8D8F23F78D84130FB6419F706EADD430CC85AFF48283F15602265059ABB075E011E3941834EBE70787CDD55F1E604C6B86F761D94C4F5E525791333DF6D43869D6F36B212A8F35583D38A21D0947CBE26FBE6A36E189C73137F2F2D89F48566D04D2DD9125D2EA4E0B2A7E5C1E9D2EA036CFADCF7BB28F6DF3B7D6395230C9D39D1E7558EA25340252708BE23EC6C0C9A0946C5C5AF0FE037C254D1A5B2B70B8F916CF37945BEF76BDFDFB19A0DAAC5A83A6357E986B3155CFF31024121634C3700CA99E5ECEF1F2E411C6621FED6092C1AB59860271AC7F431E568075D59F71AA18096195F30BBEB1A6BAC20E034F83C72BE0536315879F1D1B7F31D38C12DD8E97819B4803D02BECD436B61D1296CEB78EBF857E34087EC8AE8395269B5B0770B3423B39638910D2A3DDFEC8502389FD8B5B09FFD10CAAD1A5C86E7E39629AB09A4ABCDD00FBB9821F92E7DD24DDA83D1D9762F52A89BED6C20648EA04FBAD4233E5920AE83FFEC28FDB5E432929A41DB782B2CEA8FEB40CAD0B27903050B650477E5D9443A536ECDFDAC673952810596F1985427359D9E4797CABCCD2FA0C0A2394D853B4E6F8E150B3E3AB5136CF476605FF5FFA9067C0FE58A143B50B18B09256657CF091132D449A6E7EE79AA870E9DBE46BF840EDCB983F585EC2856C059808E72B8C901A25D6AFD5372F168D533052A6D26418E035D87D0BF818ADEA19915047C8D824A425A8C7915756673E0F5FCCB1B4FE7C1FDFCE505F7E18F023FDD32A605906EC48E0FA755B6D87E47711E158D672C5FB4CD3B8D1D13FE9EECE58453987CFCDD87B621B870F3AA27E73B6FB7FC0A6757893B978C63B7723C49D1005A1E5B1A4D60C4A2FEF392DF7EF97F149B499164455633FA485BDF92F804A47C8703D124522D73887A2B032F10F45343993FFB009D69E80FB54B6999A5BDB2760F8BCCA648F3C52BFA1D887AE49862DB4CBCCC7213ACBFDC48A57C3DA1F1EBBEA828182432AA1C593C3E5591C825E5706A5F9503311E91EC3D8F4A9554C3DF915B5FBE0516A7A5597ECF8862A8DF286ADA96C90C9F2783F7F947A18EBBC64C1BAF24B29F77521A9EBE09BECFFDB902EFCD024046FD3E6182BF0C84BD3A0A5410EEDBABFC60114E5DB28B0943D79F58F766E2EDB16759850D4CC3A9A57AE073CF6F3B24D36A4365E2BC64674259170B6D11DFF63D0DEED085B6321C45F218E09351AA0D4155189CC98DE5627A03396A067AB3FEA2C133062E3823FB1CAFA5D592070C8E82ABE812979DBDCB6D2E595F33830AD0E8E2F9E6CDC4D9C74B8026EAD1815DE36772769C4E00806F79950A40C979C14A4BDBFDB79DF1DE01FDFCAAEBC93DDBAD62BA166843A121D2B144559064E9DE9E310DFC93D624C1061BAD3195D6C9F46DB64C65A31E90371F9B644E2A15E01C262395269A9AE83F50776F852903F86E5518BD008CF1B35E78F910D48C0B7BBAAAD5DFF2375C55D56B8F65B922229D5F494EDCCD2D676361619FEDFE6BF0BFD7E4C77FC459F181120C4430C409BA89D2E5A8C36CC6200497611D9D705DA6AE1ACA4E16B389D632A982E017E1DAD95DFFBC7A7D7191E7B8FA1C0ED + +count = 36 +seed = C08E846A8E039C8655651919A8433D475F494899FB617DC3B4715DEF0C992C195CE38158B7FF40E0684B30FD7E623265 +mlen = 1221 +msg = 743E5D96B9B4C1469E7AD2B3703F711FAF60CA335358FF3EFC8FCFF02CD020A443243B4169F9123351B6C36762B85BE5E5EDDF8D4B43D82CAA615788406A31CDF4F7087D42DB21AE48A069AA23A8F6D20A1C0762F973E526F011DEC737E986CC324724BC5336D0362525757410E21046A12AC54F2237E68DA036A5C1389E46A53ED8C21774906948D4C9E14F40519C54DBD02B7A4ACAABD24FFD7F6CA4D6D582EF48940296D2893415E811FE7EF0801B35F1C594E6FEA2C293869BBD45618B6F04FC26B55D55A0AE99445AEA12F851B7E58A49CC6A0044F28E3EB838CFA6BAC5DF53B0DB78BE2CA2BEA1BF2DEFFEBD673A783C91A6C9EE710B12042EC2863A9B52EADA5B0D32101BBA8338F7C75CDAE7B7FD6797B25F96ABD53A24A7647A1C91610306FFC72A8DA4D46B1778146A98BD59CEA3173D41D5A53F9A7F9E282B5FDA1AFB062D8AFB63CB19B0E76DF782FEB9F7FD50902133529CFDD7C51AF297895EF6E1871AFD4C3DE93DEFA8FCF1FE67BD27B7EEB0CF37A6A8E09AF1203922BD9B62672D4756519CD09DD9271ECD0285F92030A9FC81C09BF2FAE86F5F50596C628E0BE673571CBC2FD76C563E113004529B234FB50E9E3D6D1F814CB8E5B5CC3EA365D0BC7602B146CC0361397D9BEE9246FBA3A724C462E177D27836093EC009741ABFA28379AEBCF5EF09BBCE00CE449FEC3A3302FB9AD0F010CA338363539DA545F159FBCD3D6A0482454023587A324F5132FB6F4CA602FAB2CF6CD59104427264CC9EDE8D10CD9DD7FA6133E65693DBF744443AE920994226E21D98634BC7F0710DBC37C18203EFA5ADB467B523322E21E4E686B6B85B00CB501ED84153BAECD4D6CAC9D1183E38B510F7B1DBBE5995BCB717529B83FBBE969DFD8DE21183762FCDED692B16502834FE8E7A7C46F84ACDCD2C9975098CF0CDE8AC0EFAFA449DC26840180DCD9353A2F1B06962677C808B07345E8ABE95B8D24F21D751A4EDCFA0E02FF077DE64E6B992E8C8822682DCC7F03CA7582FE7C74E0A9822A02D888FDDE1FC9E73C2EDEDDF32001E918771E5F511EF8F88AC19B76FAC0C812F56938F814D712D99269D7802E47634E541B54E00F9EAF78A421506A88B4BF7332DFC7D79E8C41835031FB449507D19D5A8A512A5C527C95B6F21EE3E41FA43591DD9BD2E4293701BDAFB624E0EA290DA4B7A173003867C4CC3FD814E117B4EEE283C58F5FB33D653E410F68C8962155B8C4FBC13BB750A0343737D1FAB36EBC618A6A7C8E6F93855CB24937B01C438FA713D334DF335D0745582F680627D8B94CBC25F0D12E3B1C27A3ED72E2558B800C19DC6B719B961E0FEE43BFC34E999027CA1969ABA4C45FDAB9AF01B955E948DE951F5A1088BEDA43AC930FE99D8CBB3473475C444F43E928E1A44966265B38FADF9B1183700A95A81F85EA43E5C61DD9B2D67701C95583E8E3F15083717E1722D764B6E624505347C30E5E70163ED9A046C504FF534956E911294D2B9097BBEEF8740377EF0D6C4CC8086422902BF63556CE6DA8E33E68FCFB42707C00693A995D17680B76293194DB217EB5A928303DCF1814E4A881B057BAF2553AC4FAAC8E4BF23FD4074154CD4AE189FF7E204EEDB8EDD594CDC21B5B7D73A712B511D068F4D217C0F91F9D84C524D973D67AA741EB13FE922AFABF79CD2396181143783030FD2D0CFEFC877934D8037A4C32AE8E15B50A6FA4269 +pk = F8461870A4F8F32849DEBC3395DDF5E23B46486E28B657D40475E9443127CF0431B13E69F79122B4A979A470BA9B83DD9A2D7FCC21A73E10AE0C53052293860117 +sk = F8461870A4F8F32849DEBC3395DDF5E23B46486E28B657D40475E9443127CF0431B13E69F79122B4A979A470BA9B83DD9A2D7FCC21A73E10AE0C530522938601177B6AA3D2CD8F7A75AEB6509545BC1C3117000000000000000000000000000000521121659BE56E14B08CFC6929AAAF11D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5046A93E84858438C50344D353DE799D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000A72B09AC5842927260453AF6CF4096A37F376EF2D9D517D1C83BEBF402C69A006C9C3F2A06AC2D12FF1CFAB36DD01B4C46D639D82E0817E487BCCFE12966FD00148F9BF9865767FE2EEDABF6244A6DC48C4EBC4F6515BF1CFB4F1368DDA89E002FAAD70A456C4F07EFC5156619F8B0CB68F74B798496C84478FD294268F55C00 +smlen = 1369 +sm = C984CFFF4F1B9AD87CEB302AFDEA8C6E8F669E6ED136789E1708B4A063824C02545C9A2A41189C5501F8327E531C0FF139C306FBBDC0EDB06703064479C5ED03000003FE41B20EC26217445B50892C06A79F835C4B09011702FAA75D7B8A251B6E619B227E3CF7402300025B171073FF790C50528E36AB7BA0D74DEA9464649E4CCD2AEC0C6A95D3CF60820AAA9557730A020B02743E5D96B9B4C1469E7AD2B3703F711FAF60CA335358FF3EFC8FCFF02CD020A443243B4169F9123351B6C36762B85BE5E5EDDF8D4B43D82CAA615788406A31CDF4F7087D42DB21AE48A069AA23A8F6D20A1C0762F973E526F011DEC737E986CC324724BC5336D0362525757410E21046A12AC54F2237E68DA036A5C1389E46A53ED8C21774906948D4C9E14F40519C54DBD02B7A4ACAABD24FFD7F6CA4D6D582EF48940296D2893415E811FE7EF0801B35F1C594E6FEA2C293869BBD45618B6F04FC26B55D55A0AE99445AEA12F851B7E58A49CC6A0044F28E3EB838CFA6BAC5DF53B0DB78BE2CA2BEA1BF2DEFFEBD673A783C91A6C9EE710B12042EC2863A9B52EADA5B0D32101BBA8338F7C75CDAE7B7FD6797B25F96ABD53A24A7647A1C91610306FFC72A8DA4D46B1778146A98BD59CEA3173D41D5A53F9A7F9E282B5FDA1AFB062D8AFB63CB19B0E76DF782FEB9F7FD50902133529CFDD7C51AF297895EF6E1871AFD4C3DE93DEFA8FCF1FE67BD27B7EEB0CF37A6A8E09AF1203922BD9B62672D4756519CD09DD9271ECD0285F92030A9FC81C09BF2FAE86F5F50596C628E0BE673571CBC2FD76C563E113004529B234FB50E9E3D6D1F814CB8E5B5CC3EA365D0BC7602B146CC0361397D9BEE9246FBA3A724C462E177D27836093EC009741ABFA28379AEBCF5EF09BBCE00CE449FEC3A3302FB9AD0F010CA338363539DA545F159FBCD3D6A0482454023587A324F5132FB6F4CA602FAB2CF6CD59104427264CC9EDE8D10CD9DD7FA6133E65693DBF744443AE920994226E21D98634BC7F0710DBC37C18203EFA5ADB467B523322E21E4E686B6B85B00CB501ED84153BAECD4D6CAC9D1183E38B510F7B1DBBE5995BCB717529B83FBBE969DFD8DE21183762FCDED692B16502834FE8E7A7C46F84ACDCD2C9975098CF0CDE8AC0EFAFA449DC26840180DCD9353A2F1B06962677C808B07345E8ABE95B8D24F21D751A4EDCFA0E02FF077DE64E6B992E8C8822682DCC7F03CA7582FE7C74E0A9822A02D888FDDE1FC9E73C2EDEDDF32001E918771E5F511EF8F88AC19B76FAC0C812F56938F814D712D99269D7802E47634E541B54E00F9EAF78A421506A88B4BF7332DFC7D79E8C41835031FB449507D19D5A8A512A5C527C95B6F21EE3E41FA43591DD9BD2E4293701BDAFB624E0EA290DA4B7A173003867C4CC3FD814E117B4EEE283C58F5FB33D653E410F68C8962155B8C4FBC13BB750A0343737D1FAB36EBC618A6A7C8E6F93855CB24937B01C438FA713D334DF335D0745582F680627D8B94CBC25F0D12E3B1C27A3ED72E2558B800C19DC6B719B961E0FEE43BFC34E999027CA1969ABA4C45FDAB9AF01B955E948DE951F5A1088BEDA43AC930FE99D8CBB3473475C444F43E928E1A44966265B38FADF9B1183700A95A81F85EA43E5C61DD9B2D67701C95583E8E3F15083717E1722D764B6E624505347C30E5E70163ED9A046C504FF534956E911294D2B9097BBEEF8740377EF0D6C4CC8086422902BF63556CE6DA8E33E68FCFB42707C00693A995D17680B76293194DB217EB5A928303DCF1814E4A881B057BAF2553AC4FAAC8E4BF23FD4074154CD4AE189FF7E204EEDB8EDD594CDC21B5B7D73A712B511D068F4D217C0F91F9D84C524D973D67AA741EB13FE922AFABF79CD2396181143783030FD2D0CFEFC877934D8037A4C32AE8E15B50A6FA4269 + +count = 37 +seed = 1D9C060EA0408A068BD982D9694D39D02BA5A473378F6F9F09349F686566F331E767263FAFF5DC0E823BB6F648843876 +mlen = 1254 +msg = 3382E87BA70EA986A044B0CBA2EAFC3316C1AC95A5F16F6368C210DBEADFAE6CF2382DDF5078AD594CDE3BD1A837C517B1A20A2099D938DF6AA02B6C0E62FE6147C904BCF3EDE51DDDA60DE7887DFEB2866DB402D23E5934A74C9CE4852D4B2F53CC9BCDDA312964A548F6F7C8320AF1D1BDBA7FD32EC6C86BC3FCB4205ED3DB092FDCAD9AC4D2B8575883E13F69D8C16CB18D1B9284B31823ECE917C905C5C8B9D180C1BD87975871014F773FB57D402B8FE16EE312692665824CF0BCE4509326A31957319364CD421E9B21BBC1DFF663ED850858A2450C2FFE64B65E009A3999CE4504BA5313BA0EE4A8843349C30FA6E59FD3ACECA130A37C04F9B64722608768973996112684B64D0C87BF95E5DD60661935831A6A1A9575EBCB2F64A15296BE788C775D80523D6BB4267D91B0C71BA5F90DDF1933DE898E79FC7E39D0A3D146F185214468DA50AEB47402AB542E52CEB768A70CB1F749E4164CF20E549B674CE965FFBB98D874D34B5B7851E575E6C1E4DE9C170A10DAB84940AF055A951260B0119F5ACBA320B55CDCE4F16346905A2073CD9FEFBA95734E4F4DFDB7A33F292D45698831F1D3E9FBF56D9692C14A8F9887265CBB4441AB331D977E3A68A1BC9F406AE0FB1C6E91205670641B9868E2A987BACEEE2364FDB089A63B53976D600BD7A8AE88A02872E46927269D281CEFA385C98CCDFA6609394943FAC32237368C6203AAFABDE072054AB5A14A91391D5A943F4ED4A4407F275CCFD15FD28F1AE0EB6EDCC6612E3436572919E4DFB57C049BD77B344D8E04152863EFD4FAE8FE3A7230AEAAAF82870820085F4B3EB5215111B6B8952CF2FF468B3D10F3AF849F16E190E9560F40B05E6E2204591B58A850E2710F7043AEE2A44A6D4A108CEEDEB2D216E51102DD08751925DE6A7F67BCA1980F0789B34E2F86729621F2285C5D3A036CD87C76102E9D607C37CCDAC8062CEB961053F3195B5ABD88BC64FC65F8BE34166841683F1EED291938F75DFDB3AF4FD2AA98CE95382ACFB5D5DFE6EF243C8A0B19B80584FC0CD533E38BD485D1C52E0EB5BFF90C0A947D9B9095AC1C0CE9754EABFC860990206B981235C7B612DB61C9FDEFC0F14DBF68A8A0EA4986CDC4AABAD6C218559E11CCEECD804EB98446FB33EAE47C0388BD8972DDAC02CE807B707D6D188CB31A1D76D44323E93DAC4F8ECF77E7896C052EF16009CE4D1147DF84FD5785D95D77310783F9AEFF1DDA693F4BED26457ED82A1CEA19D9C4919257E3050B25A7D1CE7561740DDAC3FD93A607C79875E050E40498BFBCCA95BDB3D0FE639DC7CEA80E3DAB3AD73A4265F012451C1BCC2FDA1E1AEBB7FB18407F31E7496E2A18D2C686B47120688240A2FB134A3C314D4CB422811E850524684EC485E061F7365494A6403AF170DA461A3BC32FFAF9143D5E9B17B2285C56977AECAF880CDD34F26120DAC4C950198233A50654EFACA6EA97333D2BBC024A5E668821D20333DF0B712510100AECAB6B484CCB7814178F851A3E6BA0B76F16C4685D5AC8BA48558D382ABECBDCF0B919C1ACAE46EBEB5011DD0B3C22B539810720CFBE4CBADB111E100C09C811E724A67C66A1B89EED1E7218861F55A4DC55E236C6E3521DCB374437A14E8000DBEBF0F7F9BF409AF952888675C11326D9E3E8A8828BF50CAECFF96075CF29446CADA373529D310660CBD60C042C143E1736FE7AFAF6FBE42791A8DB01EC0475145257FE2DF766D4EA972B14AE5110B8F8F42D659383E9BD76 +pk = 453A1E36DF3404F66F20688FCCEB7C31A503246F98B7BDCAEF62B8979FCEA904B2CA3C83E96BA5CA4B9439742DBB7D2F15DE2FD321B09BD4ADE4481B6C68100406 +sk = 453A1E36DF3404F66F20688FCCEB7C31A503246F98B7BDCAEF62B8979FCEA904B2CA3C83E96BA5CA4B9439742DBB7D2F15DE2FD321B09BD4ADE4481B6C68100406F7C495E167858D62E4115EB3BE86B6B2CF060000000000000000000000000000320F9A68F84B574024DF6B9DB14EE1D66EF9FFFFFFFFFFFFFFFFFFFFFFFFFFFF211F7546C82E4F5C6399ADF92D48F1F4F5F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000BF2A015F47AA86DD27A6A98B49EAD2A54737CEF9E9D260727479A3200AA2530061A8E6BF3F04322537C902AE5C47DE354B4B01FA594B3336466F7C717F7DFC0057C49A59E3E34042AD964AE4C0384DF33CCE9CA777D6776403CF888927C21300800603B31EFD27E8D240AB35B76117A8EEDE8E0F0FEFE72459F51E98AC6C9200 +smlen = 1402 +sm = 0637B50D6D24D5108FE8632AAA6C50C1789FE5F0E775F9DC1B5AFE512D17BC01EEA8ED7BADE7EA1DDFF512E5B461A4ECC2A347E4BF7B7E2FE82AAF1F249242000000839107FB333F5480C4522C841165B93C38D4BDD3E63D31585204910C3993BC3FAB21D1A3ABEA37FD9BDCD7F00F587D32C982481954B1B94401873451EBDD704B87B7F5D3F6C7EF35E891EC9D668C8D000B023382E87BA70EA986A044B0CBA2EAFC3316C1AC95A5F16F6368C210DBEADFAE6CF2382DDF5078AD594CDE3BD1A837C517B1A20A2099D938DF6AA02B6C0E62FE6147C904BCF3EDE51DDDA60DE7887DFEB2866DB402D23E5934A74C9CE4852D4B2F53CC9BCDDA312964A548F6F7C8320AF1D1BDBA7FD32EC6C86BC3FCB4205ED3DB092FDCAD9AC4D2B8575883E13F69D8C16CB18D1B9284B31823ECE917C905C5C8B9D180C1BD87975871014F773FB57D402B8FE16EE312692665824CF0BCE4509326A31957319364CD421E9B21BBC1DFF663ED850858A2450C2FFE64B65E009A3999CE4504BA5313BA0EE4A8843349C30FA6E59FD3ACECA130A37C04F9B64722608768973996112684B64D0C87BF95E5DD60661935831A6A1A9575EBCB2F64A15296BE788C775D80523D6BB4267D91B0C71BA5F90DDF1933DE898E79FC7E39D0A3D146F185214468DA50AEB47402AB542E52CEB768A70CB1F749E4164CF20E549B674CE965FFBB98D874D34B5B7851E575E6C1E4DE9C170A10DAB84940AF055A951260B0119F5ACBA320B55CDCE4F16346905A2073CD9FEFBA95734E4F4DFDB7A33F292D45698831F1D3E9FBF56D9692C14A8F9887265CBB4441AB331D977E3A68A1BC9F406AE0FB1C6E91205670641B9868E2A987BACEEE2364FDB089A63B53976D600BD7A8AE88A02872E46927269D281CEFA385C98CCDFA6609394943FAC32237368C6203AAFABDE072054AB5A14A91391D5A943F4ED4A4407F275CCFD15FD28F1AE0EB6EDCC6612E3436572919E4DFB57C049BD77B344D8E04152863EFD4FAE8FE3A7230AEAAAF82870820085F4B3EB5215111B6B8952CF2FF468B3D10F3AF849F16E190E9560F40B05E6E2204591B58A850E2710F7043AEE2A44A6D4A108CEEDEB2D216E51102DD08751925DE6A7F67BCA1980F0789B34E2F86729621F2285C5D3A036CD87C76102E9D607C37CCDAC8062CEB961053F3195B5ABD88BC64FC65F8BE34166841683F1EED291938F75DFDB3AF4FD2AA98CE95382ACFB5D5DFE6EF243C8A0B19B80584FC0CD533E38BD485D1C52E0EB5BFF90C0A947D9B9095AC1C0CE9754EABFC860990206B981235C7B612DB61C9FDEFC0F14DBF68A8A0EA4986CDC4AABAD6C218559E11CCEECD804EB98446FB33EAE47C0388BD8972DDAC02CE807B707D6D188CB31A1D76D44323E93DAC4F8ECF77E7896C052EF16009CE4D1147DF84FD5785D95D77310783F9AEFF1DDA693F4BED26457ED82A1CEA19D9C4919257E3050B25A7D1CE7561740DDAC3FD93A607C79875E050E40498BFBCCA95BDB3D0FE639DC7CEA80E3DAB3AD73A4265F012451C1BCC2FDA1E1AEBB7FB18407F31E7496E2A18D2C686B47120688240A2FB134A3C314D4CB422811E850524684EC485E061F7365494A6403AF170DA461A3BC32FFAF9143D5E9B17B2285C56977AECAF880CDD34F26120DAC4C950198233A50654EFACA6EA97333D2BBC024A5E668821D20333DF0B712510100AECAB6B484CCB7814178F851A3E6BA0B76F16C4685D5AC8BA48558D382ABECBDCF0B919C1ACAE46EBEB5011DD0B3C22B539810720CFBE4CBADB111E100C09C811E724A67C66A1B89EED1E7218861F55A4DC55E236C6E3521DCB374437A14E8000DBEBF0F7F9BF409AF952888675C11326D9E3E8A8828BF50CAECFF96075CF29446CADA373529D310660CBD60C042C143E1736FE7AFAF6FBE42791A8DB01EC0475145257FE2DF766D4EA972B14AE5110B8F8F42D659383E9BD76 + +count = 38 +seed = A4563D09AD21D3916BF4636301F2E64183A8F003DA186753D7F2DC3BE0089BA09C62B8A52B72C2C8451213606801FB29 +mlen = 1287 +msg = 67109894C579974373CA0054ED5F7C373B7AEB810721C3D9CEFA02EB244EF6B17507300370ADB24AE0173C6D114C51E05F822A770318033C082B6502F70012283EDA2A9DC0A1381F145470E5D3729D201773D2AA63C18885A92C962BCD3628835391D70DC36273DFAA4966F65AD40EB51FB4B416A8D0B1DDF39CB932EC4503BEA23E3D9D3B4501DB426C6AD99C28D415FB565F62EB5C22BB043C8CAFC42EBD1C7190DD32A5B14B571644471453740C081F3E3305F9AE70A5BD505874382EC0F6E2188563E763BB8D1BB8B16587AE25A6252F51E4AD02D0483C4A6E8AA2849C44629CF4B7C6DD6A5FECDAB0F9B2F0B35E306C7532B64BD5A3CE67A0247D97024AAFE5CBC13E375AA69B8287BBA9DDC9AAAC2BCF41A71E373EE36B13DF9F829BBEE8F48802DD9E03BE42A5E290251BB130E0E2ABCC4E096DD0F264E5D29F8C2388A0C3010E78F2A03F5BA1BE13AA5E50F2BA67A031CE3F787754B8276EA1AF62BC5FB4DD9A9B9BB84217A37EB9FC7AAFB517337B30454200D6AAE491E50D5007EAC2150F60F640A5C4624CE6D8112119413731322BAD9762BCF72349EE38E2A41102BC5461D72033072A90E82D105E6FCDAED9C223A4142CD55920196D7B1B9278C84B67A2E35BDE3C9CEEBB8E9007BA8758BD35C875DD5FA0A8FDAAAA9A09629B9DF69AFAAB456E105DABF2AC5834B8D223B0A406E0D1295C876C447E8E09C93FB09ED1B3EF6E1F3B7FCB029F576A45A12620567E05F218BC3753109DD29AE0ADE1370C0F871AB5AD8A9DBAA277FB869EE552E8733E73886D6DFEACE6B35E481F37A516EBE191DAA6F83E4FF453CF9CC9DDEA8EE507AF0E62EF3CB8C22949CB828E21C6AAF3FA9AC301E2257B0A054FF0A237F527D53EB757820AF637FFC9F983A2B5AFF0B4CC493E610314432C9C2F0FF73C4240D520D1D73721B429CE41807B7424B14F5EB1CD23D5562263FE1D58CB1D52E5175414800CB090242E240C3A7ACAD4C84DBD8ABC2731FA2B1D9820DA60FDB6BAA7EA849B6A146E07AF7FC201B3A98E5194BB5826945FACA3690209E5726F070A71EE07AE76ADB7E6199FCCC81C8AF7A463633A58873B4F7E65F522FDA409979DE41CF54F659E66CD5950A3A3E01570526C46417A00EC2E8821DC380ABFA21384D141D259CBB9722F267E46272ADC5CC4BCE382B554226996F4A6A1605287276C18A48C8FF1A92ECD2815CA5452FD6157FC27532680022993535549BF9AB064052E6DB4E9F83B5D0D885B94A90F59E67B9DF0C321EB0F95AC07007E4EE33BA89AABEEEEA01FD1172ECA4E31FB02C507FFE43CD0D6C8570769A180E68A70BD344B4C992E7D3A6BFB96AC4D69C2D4F5EFACA1D348DC1988DE44B30DA76BABC307A88124F96F26737A85FE6047E7E485C7E4B6B99B575FAEDC9BACA3E080E2B074CFFCE1F716C6A1D08234C45706D2883C6E5A001D02596CFE5B260DE6134C75DF3AC8BCF1919759E15576CA147CEBE041D04E369BDE70CC64157AEDA311C8DA520EAE907C33E30DD89013E24B7B02E66C9F285BF7D5C3FD65BAE24AB20D40ADDB451AB4BC4B9772D0B9039461BCA8D3D2A4D71A2E6BFBE7F02325FD571FCAE1FB47F855612F382188A5FA3D61C3E8E59EF016DB0149C52E1C7DC84030E6C93C4F32DA6CE5F3B8196AFFDE834D2ADC26CFA05940055401891519386BCD33D85584D74B2F16D8E19556C272AEE8397A1741EFFC283DBAD317740C1B67F8F4B7D2D1EDD68D6615EAC3F8E3CD26AC4F8058667FB388B19C654711B5B2EDA75A9AB55174157CBE08C186A3D0963BB3011A9567BD499AD2A8 +pk = C2FAD33A17CFE70AD1E2A2DA9E461A3B5F580D10F36E34E808069E31B73F1704D6D9C68367D1E2FFFD484D57479B58585C6BCA62063F4661F7650A4E60AEAD0404 +sk = C2FAD33A17CFE70AD1E2A2DA9E461A3B5F580D10F36E34E808069E31B73F1704D6D9C68367D1E2FFFD484D57479B58585C6BCA62063F4661F7650A4E60AEAD0404D3F5C8AAD24044B30D2F11B99EAC24435A05000000000000000000000000000094F7BC288022E7F971CBA90D2BDB6743CBF6FFFFFFFFFFFFFFFFFFFFFFFFFFFFCF5D9D4A82650AE77FCBF1504BF4FAE234F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000027E99D7D10F29B1A252E2454847665A2C2BCA627C9F5E790D9A854615069B6005A7B728CA76210F220C669273AE2941A3021737BF618399C4206EF8D9E6784007E93DC7D9E51A87680A4E45E50655B92EF8F1CE574AAFB22D201D0DD294D690061A63D6C3180B902626072AA6D946626270D1AD8BAC5B22FCACEBED4E0044400 +smlen = 1435 +sm = AA68E42038EF1429B509534009ABD7097E6B92BF4767FB68A2D91E5031EF09032CA4C87600D8EA34A57E5E657759894BCB5E015869B4434A2286231DE3AA190400007765153B6EB5F4FFB4408C48F8C4E926C6DE13F1CCD22457EFBC91290C7529A73B19C45F0094E849B53CD3F0EEAD0D34EF6C4FFFA43ED294A2E8E6B2C4A02559838345E380EF0C05F43B7A157C1D1402170B67109894C579974373CA0054ED5F7C373B7AEB810721C3D9CEFA02EB244EF6B17507300370ADB24AE0173C6D114C51E05F822A770318033C082B6502F70012283EDA2A9DC0A1381F145470E5D3729D201773D2AA63C18885A92C962BCD3628835391D70DC36273DFAA4966F65AD40EB51FB4B416A8D0B1DDF39CB932EC4503BEA23E3D9D3B4501DB426C6AD99C28D415FB565F62EB5C22BB043C8CAFC42EBD1C7190DD32A5B14B571644471453740C081F3E3305F9AE70A5BD505874382EC0F6E2188563E763BB8D1BB8B16587AE25A6252F51E4AD02D0483C4A6E8AA2849C44629CF4B7C6DD6A5FECDAB0F9B2F0B35E306C7532B64BD5A3CE67A0247D97024AAFE5CBC13E375AA69B8287BBA9DDC9AAAC2BCF41A71E373EE36B13DF9F829BBEE8F48802DD9E03BE42A5E290251BB130E0E2ABCC4E096DD0F264E5D29F8C2388A0C3010E78F2A03F5BA1BE13AA5E50F2BA67A031CE3F787754B8276EA1AF62BC5FB4DD9A9B9BB84217A37EB9FC7AAFB517337B30454200D6AAE491E50D5007EAC2150F60F640A5C4624CE6D8112119413731322BAD9762BCF72349EE38E2A41102BC5461D72033072A90E82D105E6FCDAED9C223A4142CD55920196D7B1B9278C84B67A2E35BDE3C9CEEBB8E9007BA8758BD35C875DD5FA0A8FDAAAA9A09629B9DF69AFAAB456E105DABF2AC5834B8D223B0A406E0D1295C876C447E8E09C93FB09ED1B3EF6E1F3B7FCB029F576A45A12620567E05F218BC3753109DD29AE0ADE1370C0F871AB5AD8A9DBAA277FB869EE552E8733E73886D6DFEACE6B35E481F37A516EBE191DAA6F83E4FF453CF9CC9DDEA8EE507AF0E62EF3CB8C22949CB828E21C6AAF3FA9AC301E2257B0A054FF0A237F527D53EB757820AF637FFC9F983A2B5AFF0B4CC493E610314432C9C2F0FF73C4240D520D1D73721B429CE41807B7424B14F5EB1CD23D5562263FE1D58CB1D52E5175414800CB090242E240C3A7ACAD4C84DBD8ABC2731FA2B1D9820DA60FDB6BAA7EA849B6A146E07AF7FC201B3A98E5194BB5826945FACA3690209E5726F070A71EE07AE76ADB7E6199FCCC81C8AF7A463633A58873B4F7E65F522FDA409979DE41CF54F659E66CD5950A3A3E01570526C46417A00EC2E8821DC380ABFA21384D141D259CBB9722F267E46272ADC5CC4BCE382B554226996F4A6A1605287276C18A48C8FF1A92ECD2815CA5452FD6157FC27532680022993535549BF9AB064052E6DB4E9F83B5D0D885B94A90F59E67B9DF0C321EB0F95AC07007E4EE33BA89AABEEEEA01FD1172ECA4E31FB02C507FFE43CD0D6C8570769A180E68A70BD344B4C992E7D3A6BFB96AC4D69C2D4F5EFACA1D348DC1988DE44B30DA76BABC307A88124F96F26737A85FE6047E7E485C7E4B6B99B575FAEDC9BACA3E080E2B074CFFCE1F716C6A1D08234C45706D2883C6E5A001D02596CFE5B260DE6134C75DF3AC8BCF1919759E15576CA147CEBE041D04E369BDE70CC64157AEDA311C8DA520EAE907C33E30DD89013E24B7B02E66C9F285BF7D5C3FD65BAE24AB20D40ADDB451AB4BC4B9772D0B9039461BCA8D3D2A4D71A2E6BFBE7F02325FD571FCAE1FB47F855612F382188A5FA3D61C3E8E59EF016DB0149C52E1C7DC84030E6C93C4F32DA6CE5F3B8196AFFDE834D2ADC26CFA05940055401891519386BCD33D85584D74B2F16D8E19556C272AEE8397A1741EFFC283DBAD317740C1B67F8F4B7D2D1EDD68D6615EAC3F8E3CD26AC4F8058667FB388B19C654711B5B2EDA75A9AB55174157CBE08C186A3D0963BB3011A9567BD499AD2A8 + +count = 39 +seed = 811A8A2ED2917CC616FAF246C5F9BB902E5FBF5430AB078AD6CE871CF8C160512A748216EFAB3A4CE1271AAFEA12C11B +mlen = 1320 +msg = 061934748C6758ECDEDDF3A2DF78574A470621496CE3F12E5E4555FEBCCC1A46A772FCBADEBA8B2EB5231B5B15DEDA5A38076C737E5D091A8CA8482F84EC4A20A51DDDA391088F2C3926F8E1D8B77DD0ABD606E9AC25A17A86A5C75ADC215C5030355C4A1B307C1CC80A3BC4A7D4B4044FD35D173A2C7C081318F707828A3438DABE0836C2D6C14E1643F05EF8405531D5594411AE4DAC6F3992279CAE379D7C1762B122037301D3FFE8EFD1BEB4E027E055527D485D0871F2013E7B25CC26531C2CA6DDB98B31F0AC2C3BDF400A0BAE942C9D4C4003F9952B67AF67E85F572EDC3345A84B6DC3CEBBAADB7E3C876AB2DA16ED0EACF4858033BF5A4F739F9E083A345C2BB5D8611DAE90D25AC45D8B3D39B4DE584CBEACCC6F5B6E61524349B50E818BB6B03C7E5B86795D49324CE6B1603791F20B3500A1B8ADE82359263470D777B35DBA38276096445842BA5D5E960FB2AB58730F970A15AA42D9737C33BE700127A7CE7CADE024D3ABCA59CA49F9A7EDF44DB62CCC07A595016868AA97A140178DC92530EFF864C24954464BA886DB7D74BE7B540BAAF807F1AEBD014680FF4A51E16E1391E32069EE823F3D23DB72244D657233578CB7D29A33E6EC31DF1FDD43B51742CC30EFC54BE83149177E7BCDE4450DCD142EB2CB745F8865DFD99DC84AB92750F1CFB0F3944E4E4EAA41261A1E8C58D9B230ADD792DCE20D2612823C0FF9F82E04B61E48DBB83F1A6DD5CC7F92BCD0A37AB3053803D1188029AA1FED9BA04F4C961588C9AD2BA7EF1CFBC50FA69B799898EB0DFE9668260CA5680F91A10D2BEF8F108AB28FCAB693ECDB942070D2B9B8BBB22609C8395C23D7482C31B69B0F555B7C079D3DEFAA5FB302ED92619C058ADF334E845EB1C6EDD903C0DE2AEDD3D9830943F8BCC5954B65DF37C901A17EF13FA75B0F2C8C1D2E38681874AEBFE90B463F2CC7831958FDC0DE0446991EB3C3612CC00188DFC1078FE458D2E5B80EFA7BFCE800C6B4CA0E570FA5858859633551DA28F36F1FF418A9B7AD18AA89B4612F9D676D5FD98BCE6F144CD7458CA9F2BC732A36A4D186EA290A009A870DA3C1F60617D56EA7554062367121F3E5E569503AA573B172C6278DDE5AA4CCDA79D9D8FAF41C6C9040C1D1D3CB78B41FFA8A0180395439F0D1B72E42471A9100973AB3BC7AEC559D94D2D6402374BA5A584DE168395A156324E1E4149ABD35C72AE0F79863CB59EE6BA22145E36E0D85D3CAF8A427D38C96CE489CD0AEA20D7960608C074CE3CD0494B6D6D5EC8895F0F03CE78982AD8FD6784BCF16825286C51325662F34726BA66D3A91EEB598124D6755DA090EF863FA31CCD5B08909A3279A35CFDCE24D2BA16F42AD280B029A0E27137A671C862B0E6F73FF4A1DE320C4DAFFB5CD4AC3522EF1C10E8A918005535F355CE6366B43A757938594366831DBF7EE72F311BE4953EDD1EA1C598960745D3DBB7F1E2D882CC063BC0791D18C6376A8497F2F91389A13AA96DAB78FECA081D761479848A5B4CC2E3D015F343B9000583E95E785A45A06842D7C6C0FE9AC4D70F085503D7AC954516953C497635AC8B7698BB784F73FE6E7F9D0AB9473E828168DF4EC142CC1FE18FA067525915ADF0764E44292A0316EF3C0A443683C92C4661409589EABD7B4DBD43F54317AE0E3D1C69C35A7868991FA0BC2F83430D89821B91A08DDC2D314A717F5BC6F3D89DAF163AF73E10C61630139E3FEDA723FEB2EDFFE6C7F364FBA22E6AAB75E267065B5E7575946C56265743816B2CF12A106AE21921E3E92BFB7FF80E105468F8409D6698E8660B5B05F3F4BB19A0BD4BE3569D24F51795752BE74C429AECA5BE737DE8C01 +pk = 50B5C99480E802C39A7B9033B0EFD0CEBDD1E3FE0F992AF154DE0BA236BFFC04725B06740B33BE6D6EB4C266BF9F5A9AA2AE002E0C86C5611ABF7E2E1918D00419 +sk = 50B5C99480E802C39A7B9033B0EFD0CEBDD1E3FE0F992AF154DE0BA236BFFC04725B06740B33BE6D6EB4C266BF9F5A9AA2AE002E0C86C5611ABF7E2E1918D00419B5B2381E1F28E0DADFAEDA58574968F10F0200000000000000000000000000006840404768CB0F3BB544101A64C3158A12FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9BD4F67D88935E80A91F5B2FB803AEBEBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000006296BDA099C774F93792AE74D32D9DB7638F7749AF0BB39A964E10EA7C160095C3C3B8654AC992760099FECF5E2ABCBACCDAF9D4BF0068EDF321EB4CD2A3009F16D1338F17F60230535F50FCACE1BEFEC4A455EAFE09B1F29F31DD50BE1C005C166199555E3F6490AA676E24EDBD828AB99464DC54ECDB6FE45D491E17B000 +smlen = 1468 +sm = E52B8584B805A42E658AD941876330E172E266DF3B197134C16DF6CCBAD6E40300C074D3E08771A566EC454E61061FA1F4D16F451C5A9F950B6DD09DD358FC0200017F2ECAF7849CC7418A2BE1C76A69F07910DE99AE98F778D2737550E90AC3089AD566CAA966D40BE76DBDD9EF35075CAFAA2207979A88C0E9C8F8632643B9D0805506869F8C4585EBB3787CB0460AC903040A061934748C6758ECDEDDF3A2DF78574A470621496CE3F12E5E4555FEBCCC1A46A772FCBADEBA8B2EB5231B5B15DEDA5A38076C737E5D091A8CA8482F84EC4A20A51DDDA391088F2C3926F8E1D8B77DD0ABD606E9AC25A17A86A5C75ADC215C5030355C4A1B307C1CC80A3BC4A7D4B4044FD35D173A2C7C081318F707828A3438DABE0836C2D6C14E1643F05EF8405531D5594411AE4DAC6F3992279CAE379D7C1762B122037301D3FFE8EFD1BEB4E027E055527D485D0871F2013E7B25CC26531C2CA6DDB98B31F0AC2C3BDF400A0BAE942C9D4C4003F9952B67AF67E85F572EDC3345A84B6DC3CEBBAADB7E3C876AB2DA16ED0EACF4858033BF5A4F739F9E083A345C2BB5D8611DAE90D25AC45D8B3D39B4DE584CBEACCC6F5B6E61524349B50E818BB6B03C7E5B86795D49324CE6B1603791F20B3500A1B8ADE82359263470D777B35DBA38276096445842BA5D5E960FB2AB58730F970A15AA42D9737C33BE700127A7CE7CADE024D3ABCA59CA49F9A7EDF44DB62CCC07A595016868AA97A140178DC92530EFF864C24954464BA886DB7D74BE7B540BAAF807F1AEBD014680FF4A51E16E1391E32069EE823F3D23DB72244D657233578CB7D29A33E6EC31DF1FDD43B51742CC30EFC54BE83149177E7BCDE4450DCD142EB2CB745F8865DFD99DC84AB92750F1CFB0F3944E4E4EAA41261A1E8C58D9B230ADD792DCE20D2612823C0FF9F82E04B61E48DBB83F1A6DD5CC7F92BCD0A37AB3053803D1188029AA1FED9BA04F4C961588C9AD2BA7EF1CFBC50FA69B799898EB0DFE9668260CA5680F91A10D2BEF8F108AB28FCAB693ECDB942070D2B9B8BBB22609C8395C23D7482C31B69B0F555B7C079D3DEFAA5FB302ED92619C058ADF334E845EB1C6EDD903C0DE2AEDD3D9830943F8BCC5954B65DF37C901A17EF13FA75B0F2C8C1D2E38681874AEBFE90B463F2CC7831958FDC0DE0446991EB3C3612CC00188DFC1078FE458D2E5B80EFA7BFCE800C6B4CA0E570FA5858859633551DA28F36F1FF418A9B7AD18AA89B4612F9D676D5FD98BCE6F144CD7458CA9F2BC732A36A4D186EA290A009A870DA3C1F60617D56EA7554062367121F3E5E569503AA573B172C6278DDE5AA4CCDA79D9D8FAF41C6C9040C1D1D3CB78B41FFA8A0180395439F0D1B72E42471A9100973AB3BC7AEC559D94D2D6402374BA5A584DE168395A156324E1E4149ABD35C72AE0F79863CB59EE6BA22145E36E0D85D3CAF8A427D38C96CE489CD0AEA20D7960608C074CE3CD0494B6D6D5EC8895F0F03CE78982AD8FD6784BCF16825286C51325662F34726BA66D3A91EEB598124D6755DA090EF863FA31CCD5B08909A3279A35CFDCE24D2BA16F42AD280B029A0E27137A671C862B0E6F73FF4A1DE320C4DAFFB5CD4AC3522EF1C10E8A918005535F355CE6366B43A757938594366831DBF7EE72F311BE4953EDD1EA1C598960745D3DBB7F1E2D882CC063BC0791D18C6376A8497F2F91389A13AA96DAB78FECA081D761479848A5B4CC2E3D015F343B9000583E95E785A45A06842D7C6C0FE9AC4D70F085503D7AC954516953C497635AC8B7698BB784F73FE6E7F9D0AB9473E828168DF4EC142CC1FE18FA067525915ADF0764E44292A0316EF3C0A443683C92C4661409589EABD7B4DBD43F54317AE0E3D1C69C35A7868991FA0BC2F83430D89821B91A08DDC2D314A717F5BC6F3D89DAF163AF73E10C61630139E3FEDA723FEB2EDFFE6C7F364FBA22E6AAB75E267065B5E7575946C56265743816B2CF12A106AE21921E3E92BFB7FF80E105468F8409D6698E8660B5B05F3F4BB19A0BD4BE3569D24F51795752BE74C429AECA5BE737DE8C01 + +count = 40 +seed = 41CC9DB2E90239AB5158A2628E7478D0B3512FDF84CD27A4CA5FE3119A455C22045F198C3C5C39F491FB975BD1CFF7F8 +mlen = 1353 +msg = AE2638D944822298959F47B2173DE7D1E58AAA622296AD4A4CB67EC7EAD8220AC2F171605BA2D08AF3D6FF5849566EAF96209E9E00CC28EB9A517CF5061545AAD24CCE143A2EE1AB7CFA259AD9C01860B33B0036F2CB3A5086861212F408C5F055D226CCC77CC884452B2670D89548EC1C6E98FB311DF03979CABF725E78956AF185447287BCA2517F554E9F25E19D93790318EFC5D2602FABF262E5C7FC307E5A991E0122E332A803AC4A91B318B30D79394248521190D2BE326037A89FE918D139F763DC8DAA2C3BBCE53F04809F0D97303F2F1B88B572B3086ACAF38EEF36B4C0791B4918204B0E1E923BCE9E3BB1E7BAA07135B176E266AF174D5DF26C44842CEAC4AE4C1CFF05557DA3DB8651261BE78D766699B1891CB825FA9A418C45BB9F7F2D347F3F92F9529CA6DB94E2FFCC69337FB3690F556C5A44CBBD9D79F60AFF063DE68B14BD2F4B7E8CDF94F6C2F40219D27F71E8AB3D4D6872A5D4B82EAF8E3943A6D425ED04FBC5C7596AE929AD680B245E3D6A7C5CCD7FDFA1D14EF0F72B9BAAEF05B7B84ADC02913DDBC76D5FE80DE30527FFAD1825CCBA34F8587C5B0291471D6957AD99C5FBCF3669B4AE5930C8AF68305C2D3E84E714CB9049A9560A3C94AEB95A252F69B68F755DC0E0AAB52DD054B670A275BD2BAD7FF8EC0CDE6224E9A0EB537E95DAB992C382D6B03FA045DA402CE7C5B55138FB400D9E86AFE30923AFEE82C4528D1B38CE16D33BEB47A96C18428D919BA98C9782806D6F4A40B52F7F0989337C724BE24E9A5430CFEA470D02EA36CA479FAEAD94A74049898D1F1BE53D5AB8CC0CDD5438A7C55827131DE264AECD18E5F5F2F9FD60E8D2D6F55BEB27EB77AEEAC2A15432A5F1467483BE6073243D0165A6C242FE1BD7B7AA701A0827F286ECB51E4C2626DCBE95466BC94A7E2A09AB334FEE3959CA31974B6286E2A2051653341623CF3ACA65637DF657280B6025DB0C0377EC09E6E32010F0F59711A30496695D23728319DFD0AB5F3AA69025276E68808130659D912A53693584188E310B1CACC41AF4B19FAD8DA95D4B35E2569053F553A9DFCBB8FDEE1455DFA0E4F5E94324C86A24288AE27F3576AE15FBC8BED49BFD8521D77A61FB523BADF0E3CEE53799016C6EE4E1E5DEFC19C7717A5C41ED8FA6BF0E5811BAEA76676DE03767A607735C2A48BEDE511012EAF1F79E4D2C3566042FF2C63BB82FBB399CE20E1F268D3844BB473AD7366EF86D064C5BA080FC0C01BDD2AD343C5367D80D2A058CF40725268CD34123C219D9109780335611B008EE3F8848EA9D174D7B96BD2FD9A04FA2B550DCF0B301D64C0764299D317DCD0CA05718A1AC008D86FEA330095E81567E83BDE31A0D635098D7B86176CE6CC4025E8628C73B394D9A45B09B64BFD3A424162B16E1ADAA1AB60006847C6D5CA5733237A330147CFE6B9170D7B88834BB79F1FDDEFCC0EBB1D4FEF326E28C41C919607BF12AD112807BF8582933DDB096F1F3E2BCD6BCBD844DA317CEA2A7688A5FBBA14D84C537814EC2B171ADE28ACF83EA481631B968C26F8D2BF2C5AF7D61A93378E1E23FC756E2F0EE79199475AB4BA1FBC55D9ADC2B05888B2910049BCA98DEFEFE96CDCB67CA9D4AA5BBFC6CA0ECBB78BF29035D158DE2A1708D98BEB85C70AD1C64B39B387516073E2FE85BD9EFA25CB048C224E0EF76547DCA67FD66485A97EB5E56C06C78FFA08EC1C9C6F2380912A2585CBCBA2CD702CD2B51022F63EC920412989BD743A8A8BEB07241E3E8EB38CA14CD400C83DBFA6FC8E04F58529007A1477E9613291AF877692E4CA9AE118A1902AE7B4AE7DC2E992A6495CD19DF32CE64131A8D8C41969A8BAE1D870DD5F1360BA9278D5B76E746FAF99D526199E87A4B1D3A5C48A33989F103CFB2 +pk = 09368E4C0931C14658A1739FE05C4A253C994DD7D34A1A2BE7119A437C40D90161BF1BC48AE7EC840A93843585A7E1880E57F02B1FEE64F2A4B4A5ED9EA6410306 +sk = 09368E4C0931C14658A1739FE05C4A253C994DD7D34A1A2BE7119A437C40D90161BF1BC48AE7EC840A93843585A7E1880E57F02B1FEE64F2A4B4A5ED9EA6410306A53FDD1E2ADF73A9754361E6E22541AD2A02000000000000000000000000000014CCC0C0255D77D30FE991B9FC30EC0FECFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBB782BB2B5CA488A6B06D5BE12FC74AFAFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000005B702AED5BB879CF61F57B3C439DDE0C692B4202A5E96D7474E4241636EFF6008439B01FECBA694A9B5A97E86F5DCB763A777D8C3CCDA8E14400D320565BE0005F638164AC66DCCD4D9026C4159BB307F14BBED193D7996CB9525AD41D22C700BF566B99CFE5C8CE44873480EABBB5FDEB305AE37DBE1CEF56FC15B8944F1300 +smlen = 1501 +sm = D95F373834A1E990795F1A32216E336BEF1BC0CB344237089A7DCEC904B22301765D1E288ABFFFD719F9280FE212A3B6BA440596A6A583401F89460E93ED30000000C6E0C59036F36D0197DA44D744EB60AC91EA6E9A6D371F23B6ED03BD915F84E26D5CECCCE7230D0925BE4D90269E88ED41DEDE35202B976382930880F2F8CCB0553A678CB1FA12B2A607B3806A12DE010B02AE2638D944822298959F47B2173DE7D1E58AAA622296AD4A4CB67EC7EAD8220AC2F171605BA2D08AF3D6FF5849566EAF96209E9E00CC28EB9A517CF5061545AAD24CCE143A2EE1AB7CFA259AD9C01860B33B0036F2CB3A5086861212F408C5F055D226CCC77CC884452B2670D89548EC1C6E98FB311DF03979CABF725E78956AF185447287BCA2517F554E9F25E19D93790318EFC5D2602FABF262E5C7FC307E5A991E0122E332A803AC4A91B318B30D79394248521190D2BE326037A89FE918D139F763DC8DAA2C3BBCE53F04809F0D97303F2F1B88B572B3086ACAF38EEF36B4C0791B4918204B0E1E923BCE9E3BB1E7BAA07135B176E266AF174D5DF26C44842CEAC4AE4C1CFF05557DA3DB8651261BE78D766699B1891CB825FA9A418C45BB9F7F2D347F3F92F9529CA6DB94E2FFCC69337FB3690F556C5A44CBBD9D79F60AFF063DE68B14BD2F4B7E8CDF94F6C2F40219D27F71E8AB3D4D6872A5D4B82EAF8E3943A6D425ED04FBC5C7596AE929AD680B245E3D6A7C5CCD7FDFA1D14EF0F72B9BAAEF05B7B84ADC02913DDBC76D5FE80DE30527FFAD1825CCBA34F8587C5B0291471D6957AD99C5FBCF3669B4AE5930C8AF68305C2D3E84E714CB9049A9560A3C94AEB95A252F69B68F755DC0E0AAB52DD054B670A275BD2BAD7FF8EC0CDE6224E9A0EB537E95DAB992C382D6B03FA045DA402CE7C5B55138FB400D9E86AFE30923AFEE82C4528D1B38CE16D33BEB47A96C18428D919BA98C9782806D6F4A40B52F7F0989337C724BE24E9A5430CFEA470D02EA36CA479FAEAD94A74049898D1F1BE53D5AB8CC0CDD5438A7C55827131DE264AECD18E5F5F2F9FD60E8D2D6F55BEB27EB77AEEAC2A15432A5F1467483BE6073243D0165A6C242FE1BD7B7AA701A0827F286ECB51E4C2626DCBE95466BC94A7E2A09AB334FEE3959CA31974B6286E2A2051653341623CF3ACA65637DF657280B6025DB0C0377EC09E6E32010F0F59711A30496695D23728319DFD0AB5F3AA69025276E68808130659D912A53693584188E310B1CACC41AF4B19FAD8DA95D4B35E2569053F553A9DFCBB8FDEE1455DFA0E4F5E94324C86A24288AE27F3576AE15FBC8BED49BFD8521D77A61FB523BADF0E3CEE53799016C6EE4E1E5DEFC19C7717A5C41ED8FA6BF0E5811BAEA76676DE03767A607735C2A48BEDE511012EAF1F79E4D2C3566042FF2C63BB82FBB399CE20E1F268D3844BB473AD7366EF86D064C5BA080FC0C01BDD2AD343C5367D80D2A058CF40725268CD34123C219D9109780335611B008EE3F8848EA9D174D7B96BD2FD9A04FA2B550DCF0B301D64C0764299D317DCD0CA05718A1AC008D86FEA330095E81567E83BDE31A0D635098D7B86176CE6CC4025E8628C73B394D9A45B09B64BFD3A424162B16E1ADAA1AB60006847C6D5CA5733237A330147CFE6B9170D7B88834BB79F1FDDEFCC0EBB1D4FEF326E28C41C919607BF12AD112807BF8582933DDB096F1F3E2BCD6BCBD844DA317CEA2A7688A5FBBA14D84C537814EC2B171ADE28ACF83EA481631B968C26F8D2BF2C5AF7D61A93378E1E23FC756E2F0EE79199475AB4BA1FBC55D9ADC2B05888B2910049BCA98DEFEFE96CDCB67CA9D4AA5BBFC6CA0ECBB78BF29035D158DE2A1708D98BEB85C70AD1C64B39B387516073E2FE85BD9EFA25CB048C224E0EF76547DCA67FD66485A97EB5E56C06C78FFA08EC1C9C6F2380912A2585CBCBA2CD702CD2B51022F63EC920412989BD743A8A8BEB07241E3E8EB38CA14CD400C83DBFA6FC8E04F58529007A1477E9613291AF877692E4CA9AE118A1902AE7B4AE7DC2E992A6495CD19DF32CE64131A8D8C41969A8BAE1D870DD5F1360BA9278D5B76E746FAF99D526199E87A4B1D3A5C48A33989F103CFB2 + +count = 41 +seed = 1C13369824A3FDD41B1065E17297574715D9BD9CE5BB733D36D22C31B62BB1033989A604D78BFB1A0746BD4A2271FC0C +mlen = 1386 +msg = 9D84E1DD28C513987D5587A4427853762B7D7AF668FF9EC2E90211D6CF5C0DE6C7E54B298C1A6C67EA9A693CEDC4FCA1A6ADC2C6DD0E5BBCEE7266B9C6AC8FA8AF5E50078A6151F938161F1FEACDE4D8079B5A9D563423258CF3AE9E47D8E75740314F2FFA63865A8B30743F773A53E1AEDEAC45CAAE01993B75C8116FB0B431631AC001AA8BD02E5B83DE627AF0CCB3A3D86F66A7E5FB658F9226DF31095780A6E8262A247D70F4E7C971D108567FFBD7FED0E16B7FFDDD93F5764C3E02A61998C32146564D46589538B2E071AF86A26321A3523354F4F0C396B863FC8E9E2E3A173901D0D178A9D2828D0E0974B72CEDFB17937D6054F185A81D4F853787E6C3681A74FE25FAA6C256A9F9E9A9253F98B9AE4B8FA0068DC28BC7E8D5785CFAD20F7DDD643DAE6A2DDB02713C9CAFC2EB2FD18EFDECED05CC24913061BDC38E932DB5E8181FC0D3DE26A94E2138800B3C01E07E83B3B0BE187EDC75DA576AF1CC7B7122367EFFD6EBF05F4C2EEB0AB6E9F91201A4237910A87DE9FEF777981D48FBA28AB8D64D76380911F2A6621335DFA96B331AE8B3242EA1F2A260260244196B0B9596C411218A17D0A58D3B5735B9AD7B6259655CF6E2D0FE5B37D0A0B02E67951F5D3FB277B6E1EC87528B08229AB0EBD895CBA2D075A47CC8100E9DD17DE7D951BF0A68D710AAC21C8226D8CA95AC49FCBE9D493A8D3C7F93FA61685BE57FF422FAD036304F317A3DBCFEE7A4610C8C1DDAA79E37C19D6414F47230E01EF1CD5C7C2FFC319A29AE6A9C95B06C603F2CFC1D1FC914B036CDA6CF9A876946983B06123C2E5C7D09BC190647CDC0512F35DB9E214C77D3D7D0234C3F2590941236A367700F9C04D3AFB949DCA2067571BF28E78ED35FC026BD801C4AFEE9BF31C97580953950D2E81EE6426E78D6F8134ED19707473F0874367C86C9BE170BE63405A9BF7C46A420724B6CCFF9C21B015E21BB02C5A7AEABCA873B46571530DE56E47288C3424DA398517ABB6502A9A6A65D4983D97E479941C44CF0136D225991226F70837E2A7D1E9CB1226F40BF59D52C66549BF8E360096954F5875C466160A0C75A252E5FE6B8F1841FE210BF08520CE74D77B69692086EF50BB64732F19D1A49E5800F077700553290635D418168A6B9E3AE980112AFB9D58A18B94F972845C309E86FEC7E456191D8760A1C2106036E44C5C9A5F2CFBC67D741E8E937E99ED7820AB0787E39C385356EF0F05CD3E31C44115A8892224197B1D1F554D5098B72058FAD49C665F716A266CB4DB6204666E1DC07B6CFDE0EA00345661E0F94A5025D2EC98483CF482058D2EDDB018CEC11D91EB46B63971AB29367DB46137CD7690D5782E3A3DDC8CABD545FC1AAD8A9A0A39542AEC55CC3D58A5BB5E4A559DB1FCD2932EFF6E81C8B8E5AD5B4E0424A444BC55D96DF63C8971A5890310FE19DFF8ACBA72D96FD3F32D67D41A2F3D0B343489C7FDEE7556012C2D88E2BA9D512B71E7D04F92E6BE3A9386565271D755BED752C853E4539F95C3287A275004F76B9A93837C6EFC6760BE4A39B8AA92C7605AC369472FB29E11ACAD98FC91B1B9BB3505638D4D46A3AE3C10C8DC115C35725F06649BFB00BA1EF214B9F2FE98BE2DA99AB23E7B9F014F5C5D0248A9E0E088AC175C8048C6BEB5108DA59DC234E9EDFBE603BA912BEA22505C2A9EAAE766FF55AAC8392AEA5C722DF25BC6C9FCF9B0275DF71206A4E5290FC5E71D79928E357400DCB04EFD7CC9BD0B86E04BFED9BDBCE5787E40FCD6041ADDA615B5ECF03C30AB9B2809E3514E9AC87226C55F259C5F157945B0073431715E1740DCB319EDDDD1B5F2763F0439CC0D6ED5867D9D98C227CA3008F30D1B2AEA40DC73FF8289E4A21586EFF519520F888E7E2F6D29A269C12607D13D398F437CD7F0A07C94EE1E1E3D8518D0C97BE1E250D79C5AE1709AD8A638F55 +pk = DB834FB959CDF627212EBF61A0558C6C48E3757D375C08B1BC4C09027F3C6E01634C57E2CBCB2A9AD41349FF9BD317E43718C45525C81B5265E201C72D76C20006 +sk = DB834FB959CDF627212EBF61A0558C6C48E3757D375C08B1BC4C09027F3C6E01634C57E2CBCB2A9AD41349FF9BD317E43718C45525C81B5265E201C72D76C2000681666980A41A43B039D390D93CED4EFAF00200000000000000000000000000002A1FE2C623EDCA451F354240E73B00A365FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB13BEEAEB7E3BD14D116391319335B9EEFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000093CE5FD3BA4FAA137AF42CD7C18B88DC08BE88F6D9EA0D0BDB94072F5E53C0007BE355F358CCF8198E24E68D8A6D930BBDCFC89BDDAC50C15D456A505B192F0042CD94A434E75BE5B37FBF24BC8936B53A47D20A58D327803428F2C4E44CF7003D5A7B389EA0282B7A18F915CF6FB06DC487701E82D6EC1E77D1F16C34613C00 +smlen = 1534 +sm = 37A799AB2D24E9E1D09B2E13DFAC897F7A044C294A7115F633DA793CEABD9000294B0BA0EF2493D9C60A9976CC29F33E865F811A7E0566080C566EAF9CA2FE0300000C3179FADF8AECFCFA8458C9DA0BF10D4765E19B37742D7E5665A3A46D4DA73FA78615EC6B5F0477E0B43B4DB8D16E26936A5C8D738391202B13E19631AF40D81D3BE1FBC705BEB004FBE0113F777E0111089D84E1DD28C513987D5587A4427853762B7D7AF668FF9EC2E90211D6CF5C0DE6C7E54B298C1A6C67EA9A693CEDC4FCA1A6ADC2C6DD0E5BBCEE7266B9C6AC8FA8AF5E50078A6151F938161F1FEACDE4D8079B5A9D563423258CF3AE9E47D8E75740314F2FFA63865A8B30743F773A53E1AEDEAC45CAAE01993B75C8116FB0B431631AC001AA8BD02E5B83DE627AF0CCB3A3D86F66A7E5FB658F9226DF31095780A6E8262A247D70F4E7C971D108567FFBD7FED0E16B7FFDDD93F5764C3E02A61998C32146564D46589538B2E071AF86A26321A3523354F4F0C396B863FC8E9E2E3A173901D0D178A9D2828D0E0974B72CEDFB17937D6054F185A81D4F853787E6C3681A74FE25FAA6C256A9F9E9A9253F98B9AE4B8FA0068DC28BC7E8D5785CFAD20F7DDD643DAE6A2DDB02713C9CAFC2EB2FD18EFDECED05CC24913061BDC38E932DB5E8181FC0D3DE26A94E2138800B3C01E07E83B3B0BE187EDC75DA576AF1CC7B7122367EFFD6EBF05F4C2EEB0AB6E9F91201A4237910A87DE9FEF777981D48FBA28AB8D64D76380911F2A6621335DFA96B331AE8B3242EA1F2A260260244196B0B9596C411218A17D0A58D3B5735B9AD7B6259655CF6E2D0FE5B37D0A0B02E67951F5D3FB277B6E1EC87528B08229AB0EBD895CBA2D075A47CC8100E9DD17DE7D951BF0A68D710AAC21C8226D8CA95AC49FCBE9D493A8D3C7F93FA61685BE57FF422FAD036304F317A3DBCFEE7A4610C8C1DDAA79E37C19D6414F47230E01EF1CD5C7C2FFC319A29AE6A9C95B06C603F2CFC1D1FC914B036CDA6CF9A876946983B06123C2E5C7D09BC190647CDC0512F35DB9E214C77D3D7D0234C3F2590941236A367700F9C04D3AFB949DCA2067571BF28E78ED35FC026BD801C4AFEE9BF31C97580953950D2E81EE6426E78D6F8134ED19707473F0874367C86C9BE170BE63405A9BF7C46A420724B6CCFF9C21B015E21BB02C5A7AEABCA873B46571530DE56E47288C3424DA398517ABB6502A9A6A65D4983D97E479941C44CF0136D225991226F70837E2A7D1E9CB1226F40BF59D52C66549BF8E360096954F5875C466160A0C75A252E5FE6B8F1841FE210BF08520CE74D77B69692086EF50BB64732F19D1A49E5800F077700553290635D418168A6B9E3AE980112AFB9D58A18B94F972845C309E86FEC7E456191D8760A1C2106036E44C5C9A5F2CFBC67D741E8E937E99ED7820AB0787E39C385356EF0F05CD3E31C44115A8892224197B1D1F554D5098B72058FAD49C665F716A266CB4DB6204666E1DC07B6CFDE0EA00345661E0F94A5025D2EC98483CF482058D2EDDB018CEC11D91EB46B63971AB29367DB46137CD7690D5782E3A3DDC8CABD545FC1AAD8A9A0A39542AEC55CC3D58A5BB5E4A559DB1FCD2932EFF6E81C8B8E5AD5B4E0424A444BC55D96DF63C8971A5890310FE19DFF8ACBA72D96FD3F32D67D41A2F3D0B343489C7FDEE7556012C2D88E2BA9D512B71E7D04F92E6BE3A9386565271D755BED752C853E4539F95C3287A275004F76B9A93837C6EFC6760BE4A39B8AA92C7605AC369472FB29E11ACAD98FC91B1B9BB3505638D4D46A3AE3C10C8DC115C35725F06649BFB00BA1EF214B9F2FE98BE2DA99AB23E7B9F014F5C5D0248A9E0E088AC175C8048C6BEB5108DA59DC234E9EDFBE603BA912BEA22505C2A9EAAE766FF55AAC8392AEA5C722DF25BC6C9FCF9B0275DF71206A4E5290FC5E71D79928E357400DCB04EFD7CC9BD0B86E04BFED9BDBCE5787E40FCD6041ADDA615B5ECF03C30AB9B2809E3514E9AC87226C55F259C5F157945B0073431715E1740DCB319EDDDD1B5F2763F0439CC0D6ED5867D9D98C227CA3008F30D1B2AEA40DC73FF8289E4A21586EFF519520F888E7E2F6D29A269C12607D13D398F437CD7F0A07C94EE1E1E3D8518D0C97BE1E250D79C5AE1709AD8A638F55 + +count = 42 +seed = 7AD6C7DF00C9E52A75290D28DA946305D83CCF6DE2515C19A8E26850C34C8C2E545E2E32108F13B9C97F87AB68D10131 +mlen = 1419 +msg = AF2860129C08A1A9C7A7BB3120B3E40AFA1A4A09050C8483E7511FABF3285544D4CE3F41401DAB8C17DA547F6777A72519F6EEAAC83016FA0E0FB0B33329DD02AB8EB1F291758074EBB5B7C4C102B75BA422821E6755B37B914D689D84808A89CF88F69A446F489A260BA03CA52A4AA14E8BCF4BFE5134DD2918A88D67329B9BADC6ADA4A3071FD21CFC45235FA0A1B82D91C5877F10AE087464251C8899732AA7FC8F6C0A5BEAF4FA41E64CA97932925A06E218272500249577705804C6DD9F0F61DEE6AAE096BE0AE5E67923137933FE4D61E9A88DFD5B3BD75AEEAF5018A5153985E2837AD1AAD5EED91620D935EB9982DD2364B5413F490BF251FC783503FA146300E6ADAE0682E0597C3839C645DBE855919BB1CB80C3DC6E233909017BB31F5ADAEE05CE442EEF594FC15FEC3A2B4B81ECAAD1340B0677F27009290AB3AB8788556389047F63C2CE9390658E151CA85BAAE45ED2FE12B6667967F6B772EE683AC2E7347C7B0EFA332B3354B5043CB86200F8E4249F68030844D00A86FAA7B79A4129AD676D1E9D58828A1AF4C6BD68C29CC23002E0A0313500BA717B8756D4A18E41E381DF8D7A999A153876DB876CA4A508486A4F331CAC9CB3E7C416C6329713CAB76E1C8B63A8CAD46F8EB1E65116F89A3B4EB8FAA14A73097CA71AEA3220BE7FB7FE64919893930445D962C309E23332E4B3ED8CA768EF0ED46EAAB199827AD628A1BC20CCD9F61BEF67F7FCB017300EBC7493A7CCDAEDBFCA5F91E80B80DECBFD9EAD9BF22FE16B563512C7383D34801C504202D7A0E19821EC8495016362EDAC165904D2BBAC484DE1D4112C3A3E6EA56A78785B7CAF2A44B5BC8BECBC50BF4B521C1D086086FEB009C06ACB8FA0F53E7654FB02AD7898E35E5F3A7DCFC50124BA1F30178C707F4D36E4E7758C4CF82747753CC30A836311794A6A9017F53ABD17A1C9647AB38BA56AAC83C1812DEE8A5A75C5CC958780A3E9C3C1F39729BD365948F7FCD8104CF09660060FBAD2BE9B8D8E5BDD22286EB0BFD4010681AE7928D0FC008E21C8F877D97B5B9C7A06C02530FBC6A9D6FCEDFEDF68A9682177757CDDDFFA6CB9086B8330E61851E2761D84DA37635EA8441E3B23FD165CCEA562B0A3616B30EE5FAE00F76D6801B22F2215D80829E01DB2C0743E3074CF26C96B0EDDF97D79FB9C7FFE9B5CDB891F9E61FEFE7E1CBD28FE25B7858921C8C99C45A84B50A8233037DACC20BEEEBB9B22089DDAF2EBF0698498DA694F75ED2463D09BA2C757A986B8CA556CDF46CBCDF288C078041D497242F66411F47F35A21918855F105F24686076FA21BC1283F17245A7122A848B4BC10D996B2C5161FCE0336B2EC747A4A07FA9851AC5423D1EFC4B524E795B2E4BFFD1C5CD21F5FEC954824DCC53BC3883A7F571A9323DFDD2682C4A4C54E8862F347C9A8897779170B257AD26D90121DDE722A3F214A44CF6C5A5DDB2452A2471EBE7FC8D0EF7F1EDC7920CB42A71E4DB49A0168D51843F47D17BADE50DCB340E5F7B7E5B6A6C3AFE0FB26B5EA172A4011EEE838E5634E521483C6EDBE9994B0658406ED8F4998C7B4E869845CD16CC4368DA3BC1B025A6FFAFBF540133C372D452DD831DCAD39D61CCED0A0AD193FA9886EAC749001E3BEAD5A7962275FC62298A1BD054F4BD97ACAB2BBFDC355C73509D98B6DE5B4CD774BDCAF1398532BB3DB56524CC047ABDE6880C3B282FCE0FB2AD7E4C5F7BC138B48D194E8C8036DF4B9F3949E912AFE5D2734662F27583193D0FBA2B73C1A0D012DB853BBBE4383F6C391F3220E1B5761C337A054FC9FDF09C01864B87324A90C776EFBF5D34A68DEE38EBAACCBB61B4C79A58CC848184F605D43CF9D40BE90C1FBCF6735270132B59A636B16ED28111246270AF32EA2CB7A42A084005AEBB6161002E65B37217361BC269F5ED12F7D50613C82934A6D1D98D1308AC82827B7504F3FD351E0ACA1C62843C9219023FD092692BA4B83BE198EA +pk = CFD17A4AB0C76EDC939AD18C72505018CBD445D3B609BFB0EB356049B7DD3701C184D6B3EE93861C9ABF2D5FBEF602EAC3F49F00E7FE307B20D222CA2DDB690202 +sk = CFD17A4AB0C76EDC939AD18C72505018CBD445D3B609BFB0EB356049B7DD3701C184D6B3EE93861C9ABF2D5FBEF602EAC3F49F00E7FE307B20D222CA2DDB6902028F56F00C0AB647A393F271CA27E3041878040000000000000000000000000000BE5EEACA3A76F8AEDF048CE0FBB144BB3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D266AA390F8D5C48437CF34362DF24366F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000F341C7B4A4969212852A564E210CECAC487D9B2D3380BA5A72B27607A0EB4100EBEABDD61065CDF207BC2190C43276FA3B060F74F5477444A2C03EFEF543A600FEBA2178719AACE407A3BD4BDCB211966539CF9B333C2FEADB69FBA3CE015A00F322AC4391D1763457E9747EDABCFC86C7BEE3678BDEB0A0DB42F1F10D1DC300 +smlen = 1567 +sm = 785578D35111968B8ED7F7579147D9B3DC1AEDEEA23F371FB8419621C4F20C00440633B07043C8F45CDF59DBEF50DB56D0DEC4BC02F3760615C4A98CEBD6720200003B9C7B51AE7722ECD58DFBFCF08ACB4CC1C212664B7EAF82AC56CB5DB4BC264A65EA3FE7E59C962CFC9660AC11980B20B846F623FC1301C55C862074F52BEA3B10C3A379205B55A6B0D899D8F2A899010B02AF2860129C08A1A9C7A7BB3120B3E40AFA1A4A09050C8483E7511FABF3285544D4CE3F41401DAB8C17DA547F6777A72519F6EEAAC83016FA0E0FB0B33329DD02AB8EB1F291758074EBB5B7C4C102B75BA422821E6755B37B914D689D84808A89CF88F69A446F489A260BA03CA52A4AA14E8BCF4BFE5134DD2918A88D67329B9BADC6ADA4A3071FD21CFC45235FA0A1B82D91C5877F10AE087464251C8899732AA7FC8F6C0A5BEAF4FA41E64CA97932925A06E218272500249577705804C6DD9F0F61DEE6AAE096BE0AE5E67923137933FE4D61E9A88DFD5B3BD75AEEAF5018A5153985E2837AD1AAD5EED91620D935EB9982DD2364B5413F490BF251FC783503FA146300E6ADAE0682E0597C3839C645DBE855919BB1CB80C3DC6E233909017BB31F5ADAEE05CE442EEF594FC15FEC3A2B4B81ECAAD1340B0677F27009290AB3AB8788556389047F63C2CE9390658E151CA85BAAE45ED2FE12B6667967F6B772EE683AC2E7347C7B0EFA332B3354B5043CB86200F8E4249F68030844D00A86FAA7B79A4129AD676D1E9D58828A1AF4C6BD68C29CC23002E0A0313500BA717B8756D4A18E41E381DF8D7A999A153876DB876CA4A508486A4F331CAC9CB3E7C416C6329713CAB76E1C8B63A8CAD46F8EB1E65116F89A3B4EB8FAA14A73097CA71AEA3220BE7FB7FE64919893930445D962C309E23332E4B3ED8CA768EF0ED46EAAB199827AD628A1BC20CCD9F61BEF67F7FCB017300EBC7493A7CCDAEDBFCA5F91E80B80DECBFD9EAD9BF22FE16B563512C7383D34801C504202D7A0E19821EC8495016362EDAC165904D2BBAC484DE1D4112C3A3E6EA56A78785B7CAF2A44B5BC8BECBC50BF4B521C1D086086FEB009C06ACB8FA0F53E7654FB02AD7898E35E5F3A7DCFC50124BA1F30178C707F4D36E4E7758C4CF82747753CC30A836311794A6A9017F53ABD17A1C9647AB38BA56AAC83C1812DEE8A5A75C5CC958780A3E9C3C1F39729BD365948F7FCD8104CF09660060FBAD2BE9B8D8E5BDD22286EB0BFD4010681AE7928D0FC008E21C8F877D97B5B9C7A06C02530FBC6A9D6FCEDFEDF68A9682177757CDDDFFA6CB9086B8330E61851E2761D84DA37635EA8441E3B23FD165CCEA562B0A3616B30EE5FAE00F76D6801B22F2215D80829E01DB2C0743E3074CF26C96B0EDDF97D79FB9C7FFE9B5CDB891F9E61FEFE7E1CBD28FE25B7858921C8C99C45A84B50A8233037DACC20BEEEBB9B22089DDAF2EBF0698498DA694F75ED2463D09BA2C757A986B8CA556CDF46CBCDF288C078041D497242F66411F47F35A21918855F105F24686076FA21BC1283F17245A7122A848B4BC10D996B2C5161FCE0336B2EC747A4A07FA9851AC5423D1EFC4B524E795B2E4BFFD1C5CD21F5FEC954824DCC53BC3883A7F571A9323DFDD2682C4A4C54E8862F347C9A8897779170B257AD26D90121DDE722A3F214A44CF6C5A5DDB2452A2471EBE7FC8D0EF7F1EDC7920CB42A71E4DB49A0168D51843F47D17BADE50DCB340E5F7B7E5B6A6C3AFE0FB26B5EA172A4011EEE838E5634E521483C6EDBE9994B0658406ED8F4998C7B4E869845CD16CC4368DA3BC1B025A6FFAFBF540133C372D452DD831DCAD39D61CCED0A0AD193FA9886EAC749001E3BEAD5A7962275FC62298A1BD054F4BD97ACAB2BBFDC355C73509D98B6DE5B4CD774BDCAF1398532BB3DB56524CC047ABDE6880C3B282FCE0FB2AD7E4C5F7BC138B48D194E8C8036DF4B9F3949E912AFE5D2734662F27583193D0FBA2B73C1A0D012DB853BBBE4383F6C391F3220E1B5761C337A054FC9FDF09C01864B87324A90C776EFBF5D34A68DEE38EBAACCBB61B4C79A58CC848184F605D43CF9D40BE90C1FBCF6735270132B59A636B16ED28111246270AF32EA2CB7A42A084005AEBB6161002E65B37217361BC269F5ED12F7D50613C82934A6D1D98D1308AC82827B7504F3FD351E0ACA1C62843C9219023FD092692BA4B83BE198EA + +count = 43 +seed = 38FFDE9B60DEDB5BBFAD6C52AA02EF6D49369BF276C99E588D796A4F260E0FF0A65C96C35863BAACFFD9B212EC305E7F +mlen = 1452 +msg = ECA4505D43235F274D902464F4E763312BD11060F908621A063409EB42FAA6BB5E20FACD87B8FF41767C20F69B1F7E05D5F3A957F48DEA57DCC91824FA48DA6DDBDE7E3327A0A8D46A47606EDA01E67CEA1F29BDC5FBA446DE60541DBED6F73D1FC5F49BD77D45285D3D8CA93F6DF25AEEF9324BEDB40E800ACB49794AB05E6D0AEB11A5994FBA36DABB9559CD93CF522174061C116CF31874A18C46689FB8C075079DFAF73EA0EA7FAADD47AD8EF68C06AF9738B41BE771020FEDB79CA3D0165427B58E547105FCF82A12B67579D1D3AAB29968817068732CDBC5A2E9E8D55D17468D03F38D564F5AC6EFE1538E4A680E9E15E35AB54D07B6B58EC9EA7815CCF29F4F880CBF1946F39556BDC2BBC78A5134FA7A086DDC146AD9D503A4CA837E0823BF0728453F6B053788C69EFF8D11ACDF5F07282A75CBD17F2AED58E39D862FF056DF17178625234CA7E03D22AAAFC4C07E3FB08F4297B511B10579934D2761FBB600C9454AC05FFF80CFB93DE3B9E0DDD0AB1E494DE477DA2B5635E48D5BED5CE359E66A3AC845826BE2B4BBFA6D825373BB2A4E93AA417648D1CEA755AA4978784D6D9489F6738B4DA03FAEDC659408D9395C934AF774749A498B1406522351F86838865F53CB0157247484FD37EA59BA72FF3226AFF1EEE353ABD34DDD63FCC89387B947027E04A6F4ECCA1EE5F6BD1CA758AA4F796FE839338164B58D8E5D71E6D5CDEEF6B279EF15A7BAD873B12F7C5B3E2817C37BF00802D2534D425D52D0BD5935BF8658E5BD39B5268CC45D0F27CEE5A57300F497E77AF5268970782030E6928281379CB14BB56D2ACD963D189C078C7A60E98A782F9483ECE7B4871A061277186A01E878087381704BD72C63C32CBF2470A561C22A5DD3A1988B7ED0D274182E1B075AF277920B362D612DC7ED82057EBFE51A3CA5A9A9A45DE015C460BE6A48CF67C820813048A1CEA0FC3D7307F802B4FB7E523E7C8555FA56DCF66237F176D3D973C47F55AF93FC4BC92B98B7DE89829B1471DFF53B649CB03B719DB58DAF824DAA2DE570DF6314DCAF5B705557F9D783559277A754F3CD5B783D5A577EBE4A065D320284B01F71540F1986BCD443CF4FD480DBE06EF7710387CB5185DEACB5C2A612BCA275950B8988F247C4B773D8983D87F47D60F5BF80E6E7BAEDEB14B5FFBC46893A81C63F99F511D3E24FA8F7B1BA66A7DB0C1D9ACC6B5010AD725BDC2282D8A24018C975C8B12ED3326F48194D4FF93EBF051204CD224EA39F27D63FE07CFD0162358B412DBFD4715AD049EE5A31638D3111AF2DB7952F3A973646612712A607EA35826249D14CBDE4380D8BC986067B1CC27503449FB128767986A406585C3D40DACA75C27BD36117D2487BAE82CF639ED1FA016ADD279D109B8CDAE59EB31E1F006CB7AF000A267E8582E55375CF6F06D1A47BE9BFA21C8428045B9DF96808AD74D054820A4D0873257EB318A3DC9B6D9585D973E26D435345B4D699A952C3092EEDDD975FB59474212080D03EC489C695F19CBA4D1CAB1AE8D2E2C730B06E657D33722D24222FF7B613B6E8608E8A6003E11C80239FF431B5D8FA52B84B867A581798833590524C7B84EAF6CDA9CA94C5AB8EF55A1262EEC5C37467807C89FF7D075606A3902E7247E9C6646839C18493584D33DB65D6DFC0F23E68C9D13FD57FAF4836C28926693DC3EE372DE27A9D3E4AB4229425EF48CC410F1792A51C9F6FA5316A1D9A7C99979884EF350B4882F6045921CA88D4E44B435C69C1AAC11660971C2A3F6480C79E6E146C0B5CD2371BF5E7486AD7D0BE88D62A2AE8F0D73C17CBAC86FF6BDA55A880B182A5237498E9CB343A9CD82D7784B72473D222E688D13CB81B2908BBA854B9624A11DBE8CEE9C3825C1BFBA476B4D23D0B0C325F1C498A65A3589EA8E8DF8DD9030B279EDE30443CF80367CEEA4A122DC8329E5AD42491CF57EF47AE2B15F9C54120966B95ACD727A4A2B686B00626BC808F43D82D20DEEBCA79B074A7BFF38D2531AB2F726AC7087236EB3FB4BEC8A2D4207DC84C +pk = A26A0B5957CE4790B5FBFBF796D463B2437121F48BA07ABC4C08765682D0C60417FEA88122E0F771547F0C860C755F6BA91B280671D1D2D2FFE0002AFB2CD9020B +sk = A26A0B5957CE4790B5FBFBF796D463B2437121F48BA07ABC4C08765682D0C60417FEA88122E0F771547F0C860C755F6BA91B280671D1D2D2FFE0002AFB2CD9020BA118E15590EEA27D695D6D072ACF423AFA000000000000000000000000000000C6FF3AE0D7ED6B0D10074B38E5878069B0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBAB823FFADD5EE5683C7571F56B08AFCDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000093BCC1D09BCAA2E085DEAF38F38424F96267830C4E3443178C5818C6AD123000F98701B12F7DF3301C6DD70478153AF59AA0CB9A00FDE6C412BB17062A506C00094A89AF2053672B7C9D77B4AFB1F9AFCC0313370001AABCF3E6ED3989BE31008609E40CBC12FE658617E91DA95159CB366375E6D4DAF19BABD10709CAC67800 +smlen = 1600 +sm = 404E563A474D161673AEA7B0D981A2E38FA3177D7DFC2D627B7A1F253429B7001DFE4E346A1EC77585C61D44F19126337A1900C9400F6D64682A9D396B459E0001016351B97850E85C99A882B10B2AC59240D02E5C053A0FBD40CE863725E6BB5F3C65F6A582C0AC44A1F417F20A82D851121EA927AAC0256FBB0D7DE7757FFCED550DC182A21811F41CA20654B05AF46D000206ECA4505D43235F274D902464F4E763312BD11060F908621A063409EB42FAA6BB5E20FACD87B8FF41767C20F69B1F7E05D5F3A957F48DEA57DCC91824FA48DA6DDBDE7E3327A0A8D46A47606EDA01E67CEA1F29BDC5FBA446DE60541DBED6F73D1FC5F49BD77D45285D3D8CA93F6DF25AEEF9324BEDB40E800ACB49794AB05E6D0AEB11A5994FBA36DABB9559CD93CF522174061C116CF31874A18C46689FB8C075079DFAF73EA0EA7FAADD47AD8EF68C06AF9738B41BE771020FEDB79CA3D0165427B58E547105FCF82A12B67579D1D3AAB29968817068732CDBC5A2E9E8D55D17468D03F38D564F5AC6EFE1538E4A680E9E15E35AB54D07B6B58EC9EA7815CCF29F4F880CBF1946F39556BDC2BBC78A5134FA7A086DDC146AD9D503A4CA837E0823BF0728453F6B053788C69EFF8D11ACDF5F07282A75CBD17F2AED58E39D862FF056DF17178625234CA7E03D22AAAFC4C07E3FB08F4297B511B10579934D2761FBB600C9454AC05FFF80CFB93DE3B9E0DDD0AB1E494DE477DA2B5635E48D5BED5CE359E66A3AC845826BE2B4BBFA6D825373BB2A4E93AA417648D1CEA755AA4978784D6D9489F6738B4DA03FAEDC659408D9395C934AF774749A498B1406522351F86838865F53CB0157247484FD37EA59BA72FF3226AFF1EEE353ABD34DDD63FCC89387B947027E04A6F4ECCA1EE5F6BD1CA758AA4F796FE839338164B58D8E5D71E6D5CDEEF6B279EF15A7BAD873B12F7C5B3E2817C37BF00802D2534D425D52D0BD5935BF8658E5BD39B5268CC45D0F27CEE5A57300F497E77AF5268970782030E6928281379CB14BB56D2ACD963D189C078C7A60E98A782F9483ECE7B4871A061277186A01E878087381704BD72C63C32CBF2470A561C22A5DD3A1988B7ED0D274182E1B075AF277920B362D612DC7ED82057EBFE51A3CA5A9A9A45DE015C460BE6A48CF67C820813048A1CEA0FC3D7307F802B4FB7E523E7C8555FA56DCF66237F176D3D973C47F55AF93FC4BC92B98B7DE89829B1471DFF53B649CB03B719DB58DAF824DAA2DE570DF6314DCAF5B705557F9D783559277A754F3CD5B783D5A577EBE4A065D320284B01F71540F1986BCD443CF4FD480DBE06EF7710387CB5185DEACB5C2A612BCA275950B8988F247C4B773D8983D87F47D60F5BF80E6E7BAEDEB14B5FFBC46893A81C63F99F511D3E24FA8F7B1BA66A7DB0C1D9ACC6B5010AD725BDC2282D8A24018C975C8B12ED3326F48194D4FF93EBF051204CD224EA39F27D63FE07CFD0162358B412DBFD4715AD049EE5A31638D3111AF2DB7952F3A973646612712A607EA35826249D14CBDE4380D8BC986067B1CC27503449FB128767986A406585C3D40DACA75C27BD36117D2487BAE82CF639ED1FA016ADD279D109B8CDAE59EB31E1F006CB7AF000A267E8582E55375CF6F06D1A47BE9BFA21C8428045B9DF96808AD74D054820A4D0873257EB318A3DC9B6D9585D973E26D435345B4D699A952C3092EEDDD975FB59474212080D03EC489C695F19CBA4D1CAB1AE8D2E2C730B06E657D33722D24222FF7B613B6E8608E8A6003E11C80239FF431B5D8FA52B84B867A581798833590524C7B84EAF6CDA9CA94C5AB8EF55A1262EEC5C37467807C89FF7D075606A3902E7247E9C6646839C18493584D33DB65D6DFC0F23E68C9D13FD57FAF4836C28926693DC3EE372DE27A9D3E4AB4229425EF48CC410F1792A51C9F6FA5316A1D9A7C99979884EF350B4882F6045921CA88D4E44B435C69C1AAC11660971C2A3F6480C79E6E146C0B5CD2371BF5E7486AD7D0BE88D62A2AE8F0D73C17CBAC86FF6BDA55A880B182A5237498E9CB343A9CD82D7784B72473D222E688D13CB81B2908BBA854B9624A11DBE8CEE9C3825C1BFBA476B4D23D0B0C325F1C498A65A3589EA8E8DF8DD9030B279EDE30443CF80367CEEA4A122DC8329E5AD42491CF57EF47AE2B15F9C54120966B95ACD727A4A2B686B00626BC808F43D82D20DEEBCA79B074A7BFF38D2531AB2F726AC7087236EB3FB4BEC8A2D4207DC84C + +count = 44 +seed = ACC98B16DCC9A50EF57F332D66255CA56C2BB679CAE705B4297F1418DA845861448DA6CC5CC458DE6C6E96128EEB2898 +mlen = 1485 +msg = 96E2865A0E602EA4E3C5657A7F761A6F771007989FF885261F5638C14C1BF80AADE34CB956D2B5FA1CE38FDE831423201D3692E8E6F40E68A68C085DBE3C4CD8E35394F74072F44DE98A74E42C9176A86AC06BED8C0CA937DB4C3BF92371106B7A68EA8FDE1D1E082CCF522A397401AD0F8DA6C82BF76EAB8AFE101C7FF023A0FCF015B40ADA0073363E7CB25260C18662D651222A4CCF1B290EE6F7B111B9A963211D67D7674B499449F760352FEEB9FB7265A5F2F7F20C0174802C7F48226D92620D3E009E85B104230C21BA2FB0012DAC4BDF9FD184E09CB3E593EB1F3EEB418A8BF3173E6CB91FD8080C7E80DBE6730833A4A9F22C52716731C7CEA4F70CDE0F81D2D9AAFB6B60820598A7F6AA1B963B7686528E6E7885AE085C3D26C4ACBF9FC15080D972CA841175B343E59FED79AE3CB4DBB4F0D7D463BD3E0C4B2090139145B8D7DB5DB10ABFA51DC909C5CF7809030D72A5090CDC765EECADE2B365F719127548CA601AE0D21E402E18050ACAED30EE13CDDADACC9373A87A218787B585319A7E66FBB13851F7AD0D2BBC1EFE6EFE4F7ED248D844F58B6A5A21FA9295E0044982AF6286DE296550F72B5E416373F1DAC006687DED1E7D40961E5177C207579F25E77BE808A6BA33DCE8A2A6F88E97AE98ECFBEE5296D4A170E3574D9BA592A384CB0545BCFC32B3831C0B736AB77440722299F192DCAD519523995F71F2983BA87AAD2261E6E01C19DCCAE00F8D6914501D1AC3D4AFF0C12FA125ECDCA34DCDD8407F0045F8E8BE0763E19EB007ED4DAE36E30AFB07F8DAA7431B72F4A0A8017B3FDE27123AC3E8EE575F8BE310F68F81B696DB1FE63CCB8D32B899B209B2205956D209BD6E48166BBB4372A607E83C47698DB5AC8F9B40D05F38EFC4A4A1309D999D5CE1E1A5828D56EDA4666995897C8E6362D0B5054F04BCCF79D03852D1003C80CCD55E9F4578D8BB2C8E220A4D7A4E2190024C85C718654CCF174AC96C1BC50EA49F961EE7697C88E6BB718679F1D1F1118376B31A4B8C0471F6D7AEFC5AB426515D1B2CF0EAE66246B3C4132A63C63D7E33EB9DF8D8807215D58F46EE832AD3EC893D74E00C73510B9625F62D4EB5B500EECDBC7D088D3D318077A4A0F7D64ADB13220232C08DA75D23CA7B20CB109C972B7C159863991C32508339558B9383DDFE7E7DDA740E5BED0EBD14ED300C634DB01F359F81A7133669183EB187C17A2C8AB855BFCE73E34A1F59ADB0EC39EC0C7573AD3620A819333EE79D5E09CB8449F91923EF4C5E21549EB7F56075C014E1C3AD2805E682F07BA8AA265745CB600A460069678745FB9638F6709D62D2DAD8DEFDD5A4D0C2AE7401292BD1DA5F40D4CF5D59A403932FFB677237AD74691CAE29FA31B955172EFC5E83C225F2DC0430AB0C909A97BFB468AE182ECF91E9026DE819F3440FBE69B9DE26F812FF3F3CE8037F124AB368B1153C1CC127D140F754C525D4799E1A19D93B90460E6518F0B6936DC6310B7E9E6534B595E00225978214EE5AEB12A6F45B5C73FE86771818843FF7A6B88379C37165D9DAD48AFFD6FBABD11B1FB90AA5A78918B317C5F9B2CED6B9647F130DA9F91E1B1CEB84F6E1618248F06D654E159F71033072F1517064BD96A5C138402771ABE7F39F53A798C2423B748EB7F310485D6376722E204FA33B9740E7FA68364289A677C5C78A19A7707D2549BF9329334478C64351FEA1634388ACD4BE57E4ABE9374A0E999B770CD81B1BF4A8FF300C297B116CEDA1A4A1C1BD5A2275581A0589A46142139FC596A1406D16293076527CDF9AEA2D0919F9678423B7D95B153DD1D9D62B72A12F6491A36604D19E7BB83C476D232769425557D3480623D40B7AC27C0F67D4ED5CA4D487BE915A68352DCB03A3929A4BB795248EBE2FBE0612833D9305A0A31D195718BAC193FC59B880042A7F61358104A919C7E7C210F02A856B8B1057DD8527FD4AE1EA81F9E1BF7C614ED8A312C95154873F86632CBD60C65176F13CAC695BB4C23675331058397D6E96E4F9DEEB859E3937553D94BEDE3C2B9A5EBF00964A49AB294BCCEE09E5A97381D2375941AA775A47F726E9 +pk = 788EBAEEE2BA2D4FA00E958EADD83B77D70FF4A3474779C445C7C764C62E2800869AE74AA935D9EF7E213CEF3AFCE34020132A3B02D36BF72C49D8F0554A070306 +sk = 788EBAEEE2BA2D4FA00E958EADD83B77D70FF4A3474779C445C7C764C62E2800869AE74AA935D9EF7E213CEF3AFCE34020132A3B02D36BF72C49D8F0554A070306879AAB70B4CC6103590DB97409185DAC77010000000000000000000000000000B47FB21CF237F52431A1623F37496D00B3FDFFFFFFFFFFFFFFFFFFFFFFFFFFFF33CB396FB01B3315B9F8EC899C62BD13B3FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000008C3E047921ABE6992DC313A65FC037B99B9F134BFFC4A6802CE07D43F03D3E00DF928CC49486DC3605B4269FC277B374A055598E4F5AB6A959A5697809AC9F0087446C232AFBAAFA2E93B0E20C5D3BEE342C9DAFEAD961D2E7BDFE6BEC965C0071100FBE6048831F68FB6AB9AA8DBDDC9247D06EE9975F1DC92EA6C152D7C700 +smlen = 1633 +sm = 6FAED9E43E46039D6F5C1FFD83F887451BAF87605B81E9A8963E54A234138302160A207BF23499C2BB9599C6C814771880BA894D9CA4882E0C0417DCE8A17604000041A33A4E6F6CBA0953A9C8CC58794863755F8DF4FFD67F6A643A149D38CF4B232D9AC8545BB1E95B1DAC51D5B07F847D7E0810A36E2062E7AFCCFA0C4DE45B746E05A1FD7741D545493587FE8E199A020B0696E2865A0E602EA4E3C5657A7F761A6F771007989FF885261F5638C14C1BF80AADE34CB956D2B5FA1CE38FDE831423201D3692E8E6F40E68A68C085DBE3C4CD8E35394F74072F44DE98A74E42C9176A86AC06BED8C0CA937DB4C3BF92371106B7A68EA8FDE1D1E082CCF522A397401AD0F8DA6C82BF76EAB8AFE101C7FF023A0FCF015B40ADA0073363E7CB25260C18662D651222A4CCF1B290EE6F7B111B9A963211D67D7674B499449F760352FEEB9FB7265A5F2F7F20C0174802C7F48226D92620D3E009E85B104230C21BA2FB0012DAC4BDF9FD184E09CB3E593EB1F3EEB418A8BF3173E6CB91FD8080C7E80DBE6730833A4A9F22C52716731C7CEA4F70CDE0F81D2D9AAFB6B60820598A7F6AA1B963B7686528E6E7885AE085C3D26C4ACBF9FC15080D972CA841175B343E59FED79AE3CB4DBB4F0D7D463BD3E0C4B2090139145B8D7DB5DB10ABFA51DC909C5CF7809030D72A5090CDC765EECADE2B365F719127548CA601AE0D21E402E18050ACAED30EE13CDDADACC9373A87A218787B585319A7E66FBB13851F7AD0D2BBC1EFE6EFE4F7ED248D844F58B6A5A21FA9295E0044982AF6286DE296550F72B5E416373F1DAC006687DED1E7D40961E5177C207579F25E77BE808A6BA33DCE8A2A6F88E97AE98ECFBEE5296D4A170E3574D9BA592A384CB0545BCFC32B3831C0B736AB77440722299F192DCAD519523995F71F2983BA87AAD2261E6E01C19DCCAE00F8D6914501D1AC3D4AFF0C12FA125ECDCA34DCDD8407F0045F8E8BE0763E19EB007ED4DAE36E30AFB07F8DAA7431B72F4A0A8017B3FDE27123AC3E8EE575F8BE310F68F81B696DB1FE63CCB8D32B899B209B2205956D209BD6E48166BBB4372A607E83C47698DB5AC8F9B40D05F38EFC4A4A1309D999D5CE1E1A5828D56EDA4666995897C8E6362D0B5054F04BCCF79D03852D1003C80CCD55E9F4578D8BB2C8E220A4D7A4E2190024C85C718654CCF174AC96C1BC50EA49F961EE7697C88E6BB718679F1D1F1118376B31A4B8C0471F6D7AEFC5AB426515D1B2CF0EAE66246B3C4132A63C63D7E33EB9DF8D8807215D58F46EE832AD3EC893D74E00C73510B9625F62D4EB5B500EECDBC7D088D3D318077A4A0F7D64ADB13220232C08DA75D23CA7B20CB109C972B7C159863991C32508339558B9383DDFE7E7DDA740E5BED0EBD14ED300C634DB01F359F81A7133669183EB187C17A2C8AB855BFCE73E34A1F59ADB0EC39EC0C7573AD3620A819333EE79D5E09CB8449F91923EF4C5E21549EB7F56075C014E1C3AD2805E682F07BA8AA265745CB600A460069678745FB9638F6709D62D2DAD8DEFDD5A4D0C2AE7401292BD1DA5F40D4CF5D59A403932FFB677237AD74691CAE29FA31B955172EFC5E83C225F2DC0430AB0C909A97BFB468AE182ECF91E9026DE819F3440FBE69B9DE26F812FF3F3CE8037F124AB368B1153C1CC127D140F754C525D4799E1A19D93B90460E6518F0B6936DC6310B7E9E6534B595E00225978214EE5AEB12A6F45B5C73FE86771818843FF7A6B88379C37165D9DAD48AFFD6FBABD11B1FB90AA5A78918B317C5F9B2CED6B9647F130DA9F91E1B1CEB84F6E1618248F06D654E159F71033072F1517064BD96A5C138402771ABE7F39F53A798C2423B748EB7F310485D6376722E204FA33B9740E7FA68364289A677C5C78A19A7707D2549BF9329334478C64351FEA1634388ACD4BE57E4ABE9374A0E999B770CD81B1BF4A8FF300C297B116CEDA1A4A1C1BD5A2275581A0589A46142139FC596A1406D16293076527CDF9AEA2D0919F9678423B7D95B153DD1D9D62B72A12F6491A36604D19E7BB83C476D232769425557D3480623D40B7AC27C0F67D4ED5CA4D487BE915A68352DCB03A3929A4BB795248EBE2FBE0612833D9305A0A31D195718BAC193FC59B880042A7F61358104A919C7E7C210F02A856B8B1057DD8527FD4AE1EA81F9E1BF7C614ED8A312C95154873F86632CBD60C65176F13CAC695BB4C23675331058397D6E96E4F9DEEB859E3937553D94BEDE3C2B9A5EBF00964A49AB294BCCEE09E5A97381D2375941AA775A47F726E9 + +count = 45 +seed = 8BEA4E384E73C7E0B47381B3063334291A0F06D28DB61B5BF65B01D0A747722E0AA62B81AD46C00C8A5C31494E513836 +mlen = 1518 +msg = 047E2D484D798B3829CA6037D6C1588A2349DE09C5DDFBEC987652CFDA01454ED791DBFFA3D9DA13A35230ADBE1B39B042E3C70589658A03F75447C1CF3970DC10FE5A4A9E980F2A33B642B42E5E66E9AC4E7A56888FCD72913A79489B5B163BD37B8C3C8D242FFEB37D0C1ECE21034BE9E3685798C2EBC6B809DEFC02C6F0C2A3AD70EC0BAD12D57ADD63EC3584CA98E680267FA514B34DE4147C9D901B59914D49CE9E0F885855ED0CE7973F3307B675408F90B51C6A4D38A414D970EEC989CC7900D7723E19ACC4EF743F6D39EB1B563B8C13D42C0056B6C49732854925B606467F7BC662D17B924FC65E9C3CDC2AE73FF73040011A152B05ED7F96B2FF4CC39A22484AF72812EF02B08EF4DCB64C8936E74549AFDD5D876027FE2B431E61E52E8793888473F4C1E5C1BED2C4AEF8E5E300A735B302474FC6F54869984F1A62DAE29C7C9A0CCDECAA55FE137BA14B5C5C121E0C5EB33B035E01F3415529E0826B27498D7A71B0C086BACD140C02A5948AA54799D0DD0FFD384C7E68578247FA28D205B18ADAC94F7D3C8ACB7DAF71AEE347B577D97EE8E7E865CF4FC1C16640AD1E9D0192AA13AE81A71118408E145B6121ABB75B4BFFD1D403057D4AD5CC730452475A7F067690BB81E81E17BA8DBC31059969B20D387BA59CA8CE499E59A65C8583F29CD539F4F75DDCC68C7BBBC43C849802D8347143E2FE78C1AB6D7AB6BA9917301C88386B294AAC995C24AD680A8C3BDD7AEBEF21E84F5A1909A2D83A8DFE46A75F4B2B47614CD39BF3CA3460DE9BB5C37EB7349A17AB32214D031CE927806FA394470F407673B0CDC3D9A7E3749F09CA895D464A4269682CE6DDCB8FA0EC2F05372C73DC3D06FA6F58090EFBBC6D619A7A565D4EFE441AD7E018A7F5E1384B88EB4506FC54E0AB0A8B9EE3641760FFC08F6BDA78C12396473D1243BAAF6AE10316213115441C0B65C7E475B4E1578D066A47D9C6E92FA32D0F2C365FD15F5A2E88A81691F039DC642ECEDB6652D08ACBE64625B46083CE758FA96C142EB34477E065AEA04A45FF4FCC3E3D146ACD7041F5F7E4C6B26C8205BE7B66DB46DA55556CE02B48AF55A4710BB28B8CE102CB15C1A4AF59D9A17A2DDA6E2D1E96987F6AA9F4216D8D5E5CBFF7E2CB775E83A776063A4AAF937BF0EC84149EC1A7EE21F735D21625E85831B80DC11EBF04F30B13E3A7E4D4784C5F8C61C679E0B6863958F42ED31DEAFFB4C272A3731C1407445CA7673D225EB6509469DC6C1F0AF43EB00F18B3A210AA57D51169F2A9FC251BB338ED4E9DDB19282DCE871211D26482E13A8D533DEE00D36FF5CEA98DEA72D9F0B32DC398A3D5537A3373058FAAA3926C127A1EC739FAF3D57CC1A05D578074A3A72C3F2B1692C2BA1F1FFED943E7BFCBF1E664C4F52F7BF8D86174CA8910C290C06804A7748DB21008AC43E653D7FD7E0C982EDA9356F68DDEC26473956DFF281F7B767010C57F4AD09A05063A6B3CE078DD32F3DE1F40526C06A2D60E36E2C70502D5BEBFD2F3BFCACF8720CDE1657B9892406BAA3DF01E59313EB655B6A545331EBA01BCDB9C99E4AD7FEF7438AE8715FBE589A2F99CB9CA34B9610B3CE5BE38FCF979240698174348417420AAB069B8AD5F646F82958A136DC9F2F81E601056BB4AB5E10F4EBC4A00E18924C51D0FD104078471C6805C49D92C78C832EC3F10D8966E19ADD3D3B4516E12DAF4F63FE6BBD228062DB743D1F867800854F7BB7FFC2CAA0D01A0BB683E368673A8E664BBAA17A8C0C04BCFF05246F9C4F3020510A992EF26FD0933BBFDE9D042862DFFD33A6465F590A2287D8154777A89724FC3DF9F2F1B1ED8765E7C7B761CA4781006822065703ADE07A6E874E70928E1ABA29EE490690D24F6E73D96B85FB53ABFD1C1FDE439279E08FA232043B2344B267CFE5901C60E7CA14B0C85EDCFA2AB90F341821D2B4E25FE23129F2432DB932F23B5957706A433B308FB918D1C8D81EEB399BABE95E7229AD41F30460CF28671A4508B0BD1C61F48CDC23587BB9BDC6F565E76C86547CB71396661BEC8C7FC2223751F765C91C45C674C36B49AEDEF3DF2537F888904B507EDCD89155D40CB81DDA74376BC9CDCAFF8A368F1086C99EDE25526BC53F95F4017 +pk = E5FFF4C3047486D68824DFF96A4FF39AE709759F197456E9C0133200D7EC4F046345239D03E55CA51FD618439D0D7699085E8D272A4BFD8D78ABB92201C3BF0311 +sk = E5FFF4C3047486D68824DFF96A4FF39AE709759F197456E9C0133200D7EC4F046345239D03E55CA51FD618439D0D7699085E8D272A4BFD8D78ABB92201C3BF0311679DC356254184D1589F978269DE8D07F70200000000000000000000000000003068BC2F7B7DC79A3AE099B6EC2AF40131FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFB89EE3F1F23D302779B1FB13996DEF92FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000AE4780CF3917D2293424CC6F618E6CA594AD8EABBB7AFBC909DCE0D608E6FD00F5FE2283BE3EC18C2BB31E45E5F5B6B835BC7BED663D923EE4F999837BFDB9000D533D192607F2DE7B8F5280167E2F27B9205FC40321DDFF961BB3DED41A3D002FE6DF27B203A70A729CA0EC16CC68C73A4F1C17C0672C65198E3083F062C700 +smlen = 1666 +sm = 3C9EE061D6860EB4D4C976C0FF3B3FEF0641C036F521A6C25723DDF323661B00B1BBE7CD9276E495E9BAF1D0FEA9E4BC0F513C56FC2F348B2BC76594E1BE5201000278555529CBDF8D319EEA6DDB13E2188CCB7FA34D2CF51E1B6DDF707F7AB389FBCC3AC413AC0C4C86E31C727A891BB90F07AA1192BDEFD6D1663FA08D24A8DFDCDC75805FEBAE4E4FE0579A0F972137020206047E2D484D798B3829CA6037D6C1588A2349DE09C5DDFBEC987652CFDA01454ED791DBFFA3D9DA13A35230ADBE1B39B042E3C70589658A03F75447C1CF3970DC10FE5A4A9E980F2A33B642B42E5E66E9AC4E7A56888FCD72913A79489B5B163BD37B8C3C8D242FFEB37D0C1ECE21034BE9E3685798C2EBC6B809DEFC02C6F0C2A3AD70EC0BAD12D57ADD63EC3584CA98E680267FA514B34DE4147C9D901B59914D49CE9E0F885855ED0CE7973F3307B675408F90B51C6A4D38A414D970EEC989CC7900D7723E19ACC4EF743F6D39EB1B563B8C13D42C0056B6C49732854925B606467F7BC662D17B924FC65E9C3CDC2AE73FF73040011A152B05ED7F96B2FF4CC39A22484AF72812EF02B08EF4DCB64C8936E74549AFDD5D876027FE2B431E61E52E8793888473F4C1E5C1BED2C4AEF8E5E300A735B302474FC6F54869984F1A62DAE29C7C9A0CCDECAA55FE137BA14B5C5C121E0C5EB33B035E01F3415529E0826B27498D7A71B0C086BACD140C02A5948AA54799D0DD0FFD384C7E68578247FA28D205B18ADAC94F7D3C8ACB7DAF71AEE347B577D97EE8E7E865CF4FC1C16640AD1E9D0192AA13AE81A71118408E145B6121ABB75B4BFFD1D403057D4AD5CC730452475A7F067690BB81E81E17BA8DBC31059969B20D387BA59CA8CE499E59A65C8583F29CD539F4F75DDCC68C7BBBC43C849802D8347143E2FE78C1AB6D7AB6BA9917301C88386B294AAC995C24AD680A8C3BDD7AEBEF21E84F5A1909A2D83A8DFE46A75F4B2B47614CD39BF3CA3460DE9BB5C37EB7349A17AB32214D031CE927806FA394470F407673B0CDC3D9A7E3749F09CA895D464A4269682CE6DDCB8FA0EC2F05372C73DC3D06FA6F58090EFBBC6D619A7A565D4EFE441AD7E018A7F5E1384B88EB4506FC54E0AB0A8B9EE3641760FFC08F6BDA78C12396473D1243BAAF6AE10316213115441C0B65C7E475B4E1578D066A47D9C6E92FA32D0F2C365FD15F5A2E88A81691F039DC642ECEDB6652D08ACBE64625B46083CE758FA96C142EB34477E065AEA04A45FF4FCC3E3D146ACD7041F5F7E4C6B26C8205BE7B66DB46DA55556CE02B48AF55A4710BB28B8CE102CB15C1A4AF59D9A17A2DDA6E2D1E96987F6AA9F4216D8D5E5CBFF7E2CB775E83A776063A4AAF937BF0EC84149EC1A7EE21F735D21625E85831B80DC11EBF04F30B13E3A7E4D4784C5F8C61C679E0B6863958F42ED31DEAFFB4C272A3731C1407445CA7673D225EB6509469DC6C1F0AF43EB00F18B3A210AA57D51169F2A9FC251BB338ED4E9DDB19282DCE871211D26482E13A8D533DEE00D36FF5CEA98DEA72D9F0B32DC398A3D5537A3373058FAAA3926C127A1EC739FAF3D57CC1A05D578074A3A72C3F2B1692C2BA1F1FFED943E7BFCBF1E664C4F52F7BF8D86174CA8910C290C06804A7748DB21008AC43E653D7FD7E0C982EDA9356F68DDEC26473956DFF281F7B767010C57F4AD09A05063A6B3CE078DD32F3DE1F40526C06A2D60E36E2C70502D5BEBFD2F3BFCACF8720CDE1657B9892406BAA3DF01E59313EB655B6A545331EBA01BCDB9C99E4AD7FEF7438AE8715FBE589A2F99CB9CA34B9610B3CE5BE38FCF979240698174348417420AAB069B8AD5F646F82958A136DC9F2F81E601056BB4AB5E10F4EBC4A00E18924C51D0FD104078471C6805C49D92C78C832EC3F10D8966E19ADD3D3B4516E12DAF4F63FE6BBD228062DB743D1F867800854F7BB7FFC2CAA0D01A0BB683E368673A8E664BBAA17A8C0C04BCFF05246F9C4F3020510A992EF26FD0933BBFDE9D042862DFFD33A6465F590A2287D8154777A89724FC3DF9F2F1B1ED8765E7C7B761CA4781006822065703ADE07A6E874E70928E1ABA29EE490690D24F6E73D96B85FB53ABFD1C1FDE439279E08FA232043B2344B267CFE5901C60E7CA14B0C85EDCFA2AB90F341821D2B4E25FE23129F2432DB932F23B5957706A433B308FB918D1C8D81EEB399BABE95E7229AD41F30460CF28671A4508B0BD1C61F48CDC23587BB9BDC6F565E76C86547CB71396661BEC8C7FC2223751F765C91C45C674C36B49AEDEF3DF2537F888904B507EDCD89155D40CB81DDA74376BC9CDCAFF8A368F1086C99EDE25526BC53F95F4017 + +count = 46 +seed = CFA713E4A63A6FFBA43BFB898956DC400507F68AD164C3D24A67B5F8D7548C9DB44DAA43E5E4A0990325A4233089318A +mlen = 1551 +msg = 6A58AA820275A2F43D0F05DD0EE484AF42B665FFB8F21DB322ABD256A5C753BC8FF6A2C71467922E09726655F1A7218E736752065C871221C0B9DEE6A9D56B78A1C3B7357774396F6980226DCA1F91BA828E06BBF324D5CCE8D584D9D298261C7149899FC9F74D501E920F22AA34706A79213E35914DBF57B9642A42EF0D8226E31ADF89D18C5F3163ADECC79172C95650D764E3729EDAA08C207D930C26DF8EE1291C1CF889283B70AF00C0489175F799273C837B281A5D1284E4447ED72598EFAE23B523274644DA19BC0359BA59E5BE9E5828FF587C335E136C1D789257864D2648EF9C03D1C4B9809DD07CEABD865254D3D8D597587D71E374FC2DDE89C22C2330E8904F6B53F637348434A21ACEAB9892D5DF8FF84CC58229782BED739BFB13448896F7B1064B499087F7547CFC0A49272C2A670A9431B1B5A07284B6749EF834510A3EC0C61A43D5D0EB48C8F487947C4FCCEFCC49DECCB6111D617407C76A1B4A849C9A190310711B102F142F9E9CBB29F46447265E2C8DDB9174B780EB4A51003FB68483A265F2475D5BF6ECE18AF0CF31BF24CDD56583E777C4340086917B78068DFD380466F43D020E285CEED97A467DB96BFAEC22D80B4A6EC0DBB98CFC44436A41CADC85A90B214F00990D7B7010BBE4AC94809A0450C9ABEE5AA4037A44B0B4DEBD264120E762086B8D6F17AFD37086C93A8A368BE97E0F7546AF16D731C21878063E38DF3DCF3ADE6DD2DAA43C198F49B5D9FF5362333F29EC2F13CBB90DBE4E703EDAE9A4F7334A1C5AC60D5972C4AF2BA61B63C93BF719854E615D16BA4F704C55260A8838679815FA59BE08C4243CACC1A584CC1B4E777FCDC6E5A167C4CC9093749ACE4836AE058BE89CCA3221A3F63F07089006E4C44E40653BF262945A640D8C2A24E7CC3529E4BE76286C86CA2089CB8D4684508D1FAB81EAE7D8C731B65A22700BF9009A3190F5ED837EC22F9112383422027AED838F16A7740CF79EC101865D320E380D4ABA745ACC8EED376DC5B3AABE58DEBC35F8E983C92906AA2E3D8FBBE237325302E2A23CB1312EA7F532D64E79B9815996D28E0183EB728A37E19CB219987576C142F4B2F66AC6C7C77028ED59A8DF27F78ACD3910DDFCEB88888B4A604E5D07AE1B53EA6DF6EC2163DDC4BAB422D2438FFA543B22441E50E4087FDE4BEE6D79D90A2F72548DDC41C5AE07DCC87666EA3C4B89A0B14AFE03B585E7CA507E5F29997F2368B0C68C6AB6E344C082BD06AE922CD8089634918D9132DF9CBD665A4149C59BF76B0E94F66481766FD79054AA80C02E0AE04A6E2BE090582171B2A9AF455CD9FC302CA9D1EC837EE26E0E4D0AC8F0692CB9ABAC979B58CA92E5194EBE46B520125BD0B3ED1AC2BD817D3510E33CFD17058F865DBC64E9B99352B6CAF10F0A5A47449BF927A8EBA06D34C80D77A0B00B88B25A4C8747AADBB11BA15ADF9C959B05C4371CD8439FE5028E004A2E1D2F21190466FC7FD56E9BA0599A0EEDD98246AEB4B85994787B7604CB52F5515B42C2FBD4B5E9E372A36CC4E66483DD884DFE42AAA5EE7FAB200D8EC6E3556DDE0F9E9C7346F9967F8F3CEBE1E4D1CD8E6046E5E94BBC74AD3D51DB0DC704F4A4025383F0391B9DA37BCA8EC59E807593A4F040FBB186607280967E5048CAB92215DC783D9045F7A0922008628C771778661E97E9F88EA84BDAA8BA61126F71D193A2A564E3ACDE7ADF2C0B3D5B022EB6E0C629782B0025C9079D4545D88AA2BA27D10C5DCBCFB7CF648939155066518878CC54A4F611AAC21BD3A1EC628D3352F049915FCA55234B9146ECE5F78FBE7CFFB35695363202EDB9EC3501A93B4B6FC81B3DFDB5245FEEC8AA54195262C2467E15506B7D42A7FF61D75998722D0208BBFEA05CE7D2E66900A9B34F44C2A21257C220C03F9D6D7F0312A36F5C12DA20FB5290D5CFBC1DEC7D05C44820885C479063CA88783C5AA128829417EC4DD41CF83A1D991DF2EFDFEFE375E93F0371695E353EF737F4A75106211A5F70C82B4F360ABCD078C9E829C82A6B7A36D22B8D1F6E3101BA009C759FC83999D52E29B387A8DC1658A43EC4C4D9330A4ED2138E035EBEAE6343A76A82849E37141FCE34E9A41EB5EF88BBB9257017AD8696C3847FD77AE103A082ED1A05DE9420984C147AFF927E1950244912079BDBE5CC07 +pk = CE1AB128F4B241F1C780174232FEA7F6B6EA0D816F2EB97DB6AA768F30EB6D0314830EDDE5BCA62F228E1A920E5EBA3F49F8A677EFC4D767878FC1562083830011 +sk = CE1AB128F4B241F1C780174232FEA7F6B6EA0D816F2EB97DB6AA768F30EB6D0314830EDDE5BCA62F228E1A920E5EBA3F49F8A677EFC4D767878FC1562083830011DD0548A0F68883AA4BD3B116084CB9538F020000000000000000000000000000523BE50D5FCED0A6469625621697D7149FFDFFFFFFFFFFFFFFFFFFFFFFFFFFFF9921BE69CDDA1C090AA6992FDCDACB1E24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000008C0A0CA5F9A616BB4A89B0A64FF6646739B087518A38D2FEBDF8739E463E1F0089F26945CC5750316B89F81FB3FC64434201F98BED678C1FA137C88949A3D800B16D381728F238B6E53384E05D4810382C66E51C97F0CDFD63C337F0B3935D00B1A6ECF2CB34D4B2847D61152C8EA8CE446D31E10292D8A3613E042436BA8600 +smlen = 1699 +sm = FCB3312F8539C136F6B4D619E5FB5644CAA996D3C71A04975281535589BA86015C87FFF7BB5A6B8E4E9D4BD5374CEF7A9AA07D1C4E1681912E47DB6963555402000089C258680E515B211ACC154EAF14BB58C10BF828AD704634D7CB3359B5B9E4BB8773E5C9BC2913073F1281A594BA56B7D6633F32979BC55BDEBA8FC4B1D0E2EDB0FBBE68CBCFE5FF1A8561B2D711300012086A58AA820275A2F43D0F05DD0EE484AF42B665FFB8F21DB322ABD256A5C753BC8FF6A2C71467922E09726655F1A7218E736752065C871221C0B9DEE6A9D56B78A1C3B7357774396F6980226DCA1F91BA828E06BBF324D5CCE8D584D9D298261C7149899FC9F74D501E920F22AA34706A79213E35914DBF57B9642A42EF0D8226E31ADF89D18C5F3163ADECC79172C95650D764E3729EDAA08C207D930C26DF8EE1291C1CF889283B70AF00C0489175F799273C837B281A5D1284E4447ED72598EFAE23B523274644DA19BC0359BA59E5BE9E5828FF587C335E136C1D789257864D2648EF9C03D1C4B9809DD07CEABD865254D3D8D597587D71E374FC2DDE89C22C2330E8904F6B53F637348434A21ACEAB9892D5DF8FF84CC58229782BED739BFB13448896F7B1064B499087F7547CFC0A49272C2A670A9431B1B5A07284B6749EF834510A3EC0C61A43D5D0EB48C8F487947C4FCCEFCC49DECCB6111D617407C76A1B4A849C9A190310711B102F142F9E9CBB29F46447265E2C8DDB9174B780EB4A51003FB68483A265F2475D5BF6ECE18AF0CF31BF24CDD56583E777C4340086917B78068DFD380466F43D020E285CEED97A467DB96BFAEC22D80B4A6EC0DBB98CFC44436A41CADC85A90B214F00990D7B7010BBE4AC94809A0450C9ABEE5AA4037A44B0B4DEBD264120E762086B8D6F17AFD37086C93A8A368BE97E0F7546AF16D731C21878063E38DF3DCF3ADE6DD2DAA43C198F49B5D9FF5362333F29EC2F13CBB90DBE4E703EDAE9A4F7334A1C5AC60D5972C4AF2BA61B63C93BF719854E615D16BA4F704C55260A8838679815FA59BE08C4243CACC1A584CC1B4E777FCDC6E5A167C4CC9093749ACE4836AE058BE89CCA3221A3F63F07089006E4C44E40653BF262945A640D8C2A24E7CC3529E4BE76286C86CA2089CB8D4684508D1FAB81EAE7D8C731B65A22700BF9009A3190F5ED837EC22F9112383422027AED838F16A7740CF79EC101865D320E380D4ABA745ACC8EED376DC5B3AABE58DEBC35F8E983C92906AA2E3D8FBBE237325302E2A23CB1312EA7F532D64E79B9815996D28E0183EB728A37E19CB219987576C142F4B2F66AC6C7C77028ED59A8DF27F78ACD3910DDFCEB88888B4A604E5D07AE1B53EA6DF6EC2163DDC4BAB422D2438FFA543B22441E50E4087FDE4BEE6D79D90A2F72548DDC41C5AE07DCC87666EA3C4B89A0B14AFE03B585E7CA507E5F29997F2368B0C68C6AB6E344C082BD06AE922CD8089634918D9132DF9CBD665A4149C59BF76B0E94F66481766FD79054AA80C02E0AE04A6E2BE090582171B2A9AF455CD9FC302CA9D1EC837EE26E0E4D0AC8F0692CB9ABAC979B58CA92E5194EBE46B520125BD0B3ED1AC2BD817D3510E33CFD17058F865DBC64E9B99352B6CAF10F0A5A47449BF927A8EBA06D34C80D77A0B00B88B25A4C8747AADBB11BA15ADF9C959B05C4371CD8439FE5028E004A2E1D2F21190466FC7FD56E9BA0599A0EEDD98246AEB4B85994787B7604CB52F5515B42C2FBD4B5E9E372A36CC4E66483DD884DFE42AAA5EE7FAB200D8EC6E3556DDE0F9E9C7346F9967F8F3CEBE1E4D1CD8E6046E5E94BBC74AD3D51DB0DC704F4A4025383F0391B9DA37BCA8EC59E807593A4F040FBB186607280967E5048CAB92215DC783D9045F7A0922008628C771778661E97E9F88EA84BDAA8BA61126F71D193A2A564E3ACDE7ADF2C0B3D5B022EB6E0C629782B0025C9079D4545D88AA2BA27D10C5DCBCFB7CF648939155066518878CC54A4F611AAC21BD3A1EC628D3352F049915FCA55234B9146ECE5F78FBE7CFFB35695363202EDB9EC3501A93B4B6FC81B3DFDB5245FEEC8AA54195262C2467E15506B7D42A7FF61D75998722D0208BBFEA05CE7D2E66900A9B34F44C2A21257C220C03F9D6D7F0312A36F5C12DA20FB5290D5CFBC1DEC7D05C44820885C479063CA88783C5AA128829417EC4DD41CF83A1D991DF2EFDFEFE375E93F0371695E353EF737F4A75106211A5F70C82B4F360ABCD078C9E829C82A6B7A36D22B8D1F6E3101BA009C759FC83999D52E29B387A8DC1658A43EC4C4D9330A4ED2138E035EBEAE6343A76A82849E37141FCE34E9A41EB5EF88BBB9257017AD8696C3847FD77AE103A082ED1A05DE9420984C147AFF927E1950244912079BDBE5CC07 + +count = 47 +seed = 1F3193EBC58EF65E9E396D69220ADB8ADC729BB388A72CEC9028A094F1CBDED21CFB0C41356AF31E0CF66A3B0D843666 +mlen = 1584 +msg = 139BA17ED7B476DBB1CDFE3C42B3A57AF5BBCB3BE19ED04D6C3072FDFE917ECB9272D59EE89EF83522531D83AFF8B9934A8423315C350D1481A4B02980DC29E1CB83B76623869649AC40EF297B153B679C327BB251C6E6BC169C48ABA2A439F9EA24EF94656A415C3E86D7BCB43CB3717D54D773F1937DC8B0E02D4E6ABBB1C83FE73F1B221C9A359E454C19DE5E71EA4CB8C560EABF1DA133FF20D81785D2ECD935B99F24840761446C324DF81484C5C05045C0949DF8D0F10F942E1B5B79074B358C25B6EC2B0B42DF65D998B666CF1BC568E7D737F22FF541807BE95ED85A9980E940E24D2C506BB0F9BEE32EFFD85A2017DE694F61BCC2B292595C97FF4C2145E48AF8F0F3D71763B4DB433ED7BDB8DBF8643475FB2B9155F0CC6A0048C5546900792BC01EBA4B06C83A0C447EA0CF05410DE55ACB8E5521829C89BFBC084CD86E7CA3D701283B70F78E1CE9C3888AD2689E0EF5593D656285066F319E155F86C0A71256484F42A0C40E7CF13AF0CF77C6D1CC7231A48538E9060A7863B774C9CC65E321E45AACC002C0170EDDD18CC1424159D46BF99D08A28D2DEA8917D28D91A1D6C409D945A5EEA19413A1ADCA40DE9458FA6BDF1E5308EF9E67E1E90E9D92BF19B5351FC49DFF0A31E035038AAEC651C0F20F276E4EF0EE35C14BB625EB34205516D95ABEAA06A7A3BB3AF2F12236406689BFAB11E65FC63EBC5B944818DD1D53C0E7B88CE7AEBAE581D995AE7D8423778DFE20D6CEA7AC0B1B4EFE2B9D571DE77BD8F71E89D9F6A2DC89103B73625887AB376BD12CE89A65E6280515A44A80D6C32799669260167DA0A214AD0FB803930AB1952D93360B54433CE8220B29339DCF2702581E88952A5A1549DBA11F4CCDB6FEFD6D24522F3207796C8D5BA9D1582F888F2500964F2B975AED5D5AF83409FF9720EDCF5CE3FE9B6B586B08DE21956E7970D8DC28F6208A80F5378ECBC506333A1D98C58EB0E2EB0CDECE0F5D16A069FFD742D1E589F546C4F2EA3DA0A56F984CFD93F5F2912FB1D068F2BD7C1B5E979ABCC62E3A0164445398F5C0208E82B99AED1200D36289B1FDBBF03E43995341AED3AD712CC7C7530C751B40B765073EE4E4CDD411AE543AD5E2793F294320E9791AB35AE1697F23EBFA0280B8041859909B0089C101D7CC429408FABD2E073FCA7F2C2886031E9F6A32F2B596A799967BA8A47E87DCC8854D45DDB6DE39160600EB4235F4E3424D75DDC8CCF041AA05B25B5A3811540EA5B77CD8D7D611A63BEF5C26D57475B28E961645AEE0B9C8D47954FAF634017787A21A671493E7C5F1A4C553E0A68DDD726DB1DED4321DC735332FEFDF2A84C22097AB3552F878E304598EC40EB349E1C1AE416F94112A2CF8E8702A4C3BDE2F58245166550FC238E153D10F90652518B1D84CCD3ED836F150F1FF103976E743137DA5A97A61276DFB0C11D071B240069582265A9CAE4987B6C6B017DCD1594024D7B1336FF141E59936EC4CE5410E1B73BA6FB42D35F8999225CB1A135260967F4F6EF2172D53FA6AB6D1A2E3174B46C24BC103BAF69C2128F093AECEEBE8753EB352E2804EE64AE5140DF1ACDACD8F225B3C9A61264245B8E5CF759CDDD75E25E2D790FFAE8421515E0CD6F279D0080A3F80BB2E0729C0D2626B6ACE31CE20BCDA490C7660D04D1D82E6403000578926C52D8F9A4BE7103D64E0F03E8F148BB2236781EC30F6D8BC827C107FCC40F26DDAD485E6135BDC3BB331BE139A07891717B692E23312D0E5B1C41F30C3B4B4700EFFB481A835AB54340269FFF365FF87F58245621ACFD83B7FCC6FF108132D8966F9836544354F7E216FBBB851F390DCE8A72362F0454730B90D35AB3859763AEE35668310FD501C7501F4599563006AAEE9B636B676F3DBB6787317885B0F4A64171BF19CBF2EA7A625E1563032C196E1292D82C7484817DBF78D8E9E478FDC4C92CBEF48D4CB4F0E6DCDCA6682DC0A56C3E45EA0350D9FF88073748305FD7DF3A3BE8C055CB1C55167560D5C99345BA80C21CE791C4A511E384A02833B78E8AA02B1B877A9B8D806978519D716C611DF54AE8EA2691540E87C6E79EB006569E02745021BDC7852E1FA4177E2C3EC89257618B38719CB07B0BA68F600236167F019694959C2AB6FB39D5890CB176F6ACC3B9656E495C07027E3D4DE781F48C1F1A8AA1B41449689E191E495FF3F263DDAAA8DE0DF6F1A4AA3EF1F5EDFE437BB74BA +pk = 979C46E9A64320E6895066111EEDBE1FE97C0AB68F1E5D95A7BFBB1AFCF99401938B4FE4668D6FAEFC2EB8AD53ADDD7F5E6903A996EE6702373AB11EA2A18A040B +sk = 979C46E9A64320E6895066111EEDBE1FE97C0AB68F1E5D95A7BFBB1AFCF99401938B4FE4668D6FAEFC2EB8AD53ADDD7F5E6903A996EE6702373AB11EA2A18A040B316FD57D714C40462339A93C90502102A5020000000000000000000000000000F6431277F4BDD94B832D43BA7E0B64F7D8FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFA227CE7E14E10F975FD15A9FD17B06B0FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000BD1FC6D422658C3DB35ED03E6683B202C4A00AC19AED7DF5AA0C23FFBFDAF100B035A0287DCFD704EE1B6AC753AFAE00B4B30251A9F7A53FE6FBBB97FD65AF008F0697E60A4A8D276E119476285FA7519F0697434BC5D3A0A6C50D2D60BBF300CB51C4FEB7ACF7A9EE121B6DF998E2C901F5B42A701F9FC74EE2ED63A4C88E00 +smlen = 1732 +sm = DC0F19F6CAF55BA7E48B12AEE6DCAC506FCC1EC125CE252F6F9016AE3758770411EDF21F22ECE993261D0BB7ED84B7151BDD1B043609AF4A4DABB0C5B87A0B020004898DEE553635B960FEC51083BD5C7EF58EA6FFA3AF65821D0F142C4AF70E23DDEB68765A08C4BBA716DD9EEDA8EEB5CE7A3F2258067736709D7E962AA5CFFEB5487F79964BA735D46FC76AF91AD8EF030B02139BA17ED7B476DBB1CDFE3C42B3A57AF5BBCB3BE19ED04D6C3072FDFE917ECB9272D59EE89EF83522531D83AFF8B9934A8423315C350D1481A4B02980DC29E1CB83B76623869649AC40EF297B153B679C327BB251C6E6BC169C48ABA2A439F9EA24EF94656A415C3E86D7BCB43CB3717D54D773F1937DC8B0E02D4E6ABBB1C83FE73F1B221C9A359E454C19DE5E71EA4CB8C560EABF1DA133FF20D81785D2ECD935B99F24840761446C324DF81484C5C05045C0949DF8D0F10F942E1B5B79074B358C25B6EC2B0B42DF65D998B666CF1BC568E7D737F22FF541807BE95ED85A9980E940E24D2C506BB0F9BEE32EFFD85A2017DE694F61BCC2B292595C97FF4C2145E48AF8F0F3D71763B4DB433ED7BDB8DBF8643475FB2B9155F0CC6A0048C5546900792BC01EBA4B06C83A0C447EA0CF05410DE55ACB8E5521829C89BFBC084CD86E7CA3D701283B70F78E1CE9C3888AD2689E0EF5593D656285066F319E155F86C0A71256484F42A0C40E7CF13AF0CF77C6D1CC7231A48538E9060A7863B774C9CC65E321E45AACC002C0170EDDD18CC1424159D46BF99D08A28D2DEA8917D28D91A1D6C409D945A5EEA19413A1ADCA40DE9458FA6BDF1E5308EF9E67E1E90E9D92BF19B5351FC49DFF0A31E035038AAEC651C0F20F276E4EF0EE35C14BB625EB34205516D95ABEAA06A7A3BB3AF2F12236406689BFAB11E65FC63EBC5B944818DD1D53C0E7B88CE7AEBAE581D995AE7D8423778DFE20D6CEA7AC0B1B4EFE2B9D571DE77BD8F71E89D9F6A2DC89103B73625887AB376BD12CE89A65E6280515A44A80D6C32799669260167DA0A214AD0FB803930AB1952D93360B54433CE8220B29339DCF2702581E88952A5A1549DBA11F4CCDB6FEFD6D24522F3207796C8D5BA9D1582F888F2500964F2B975AED5D5AF83409FF9720EDCF5CE3FE9B6B586B08DE21956E7970D8DC28F6208A80F5378ECBC506333A1D98C58EB0E2EB0CDECE0F5D16A069FFD742D1E589F546C4F2EA3DA0A56F984CFD93F5F2912FB1D068F2BD7C1B5E979ABCC62E3A0164445398F5C0208E82B99AED1200D36289B1FDBBF03E43995341AED3AD712CC7C7530C751B40B765073EE4E4CDD411AE543AD5E2793F294320E9791AB35AE1697F23EBFA0280B8041859909B0089C101D7CC429408FABD2E073FCA7F2C2886031E9F6A32F2B596A799967BA8A47E87DCC8854D45DDB6DE39160600EB4235F4E3424D75DDC8CCF041AA05B25B5A3811540EA5B77CD8D7D611A63BEF5C26D57475B28E961645AEE0B9C8D47954FAF634017787A21A671493E7C5F1A4C553E0A68DDD726DB1DED4321DC735332FEFDF2A84C22097AB3552F878E304598EC40EB349E1C1AE416F94112A2CF8E8702A4C3BDE2F58245166550FC238E153D10F90652518B1D84CCD3ED836F150F1FF103976E743137DA5A97A61276DFB0C11D071B240069582265A9CAE4987B6C6B017DCD1594024D7B1336FF141E59936EC4CE5410E1B73BA6FB42D35F8999225CB1A135260967F4F6EF2172D53FA6AB6D1A2E3174B46C24BC103BAF69C2128F093AECEEBE8753EB352E2804EE64AE5140DF1ACDACD8F225B3C9A61264245B8E5CF759CDDD75E25E2D790FFAE8421515E0CD6F279D0080A3F80BB2E0729C0D2626B6ACE31CE20BCDA490C7660D04D1D82E6403000578926C52D8F9A4BE7103D64E0F03E8F148BB2236781EC30F6D8BC827C107FCC40F26DDAD485E6135BDC3BB331BE139A07891717B692E23312D0E5B1C41F30C3B4B4700EFFB481A835AB54340269FFF365FF87F58245621ACFD83B7FCC6FF108132D8966F9836544354F7E216FBBB851F390DCE8A72362F0454730B90D35AB3859763AEE35668310FD501C7501F4599563006AAEE9B636B676F3DBB6787317885B0F4A64171BF19CBF2EA7A625E1563032C196E1292D82C7484817DBF78D8E9E478FDC4C92CBEF48D4CB4F0E6DCDCA6682DC0A56C3E45EA0350D9FF88073748305FD7DF3A3BE8C055CB1C55167560D5C99345BA80C21CE791C4A511E384A02833B78E8AA02B1B877A9B8D806978519D716C611DF54AE8EA2691540E87C6E79EB006569E02745021BDC7852E1FA4177E2C3EC89257618B38719CB07B0BA68F600236167F019694959C2AB6FB39D5890CB176F6ACC3B9656E495C07027E3D4DE781F48C1F1A8AA1B41449689E191E495FF3F263DDAAA8DE0DF6F1A4AA3EF1F5EDFE437BB74BA + +count = 48 +seed = CF5A04DDB5EBC45328F703D486D24443A7692D65AA55F054E3078DB76A7939590A3F35CF1A21E82A845445DD1B64A85A +mlen = 1617 +msg = EDD4DA833528B0511534F77857FFD16EAFB1A2AC87E6844612DBB104B9F32025B7F54E993D65CE85A061B6AC6D70A15BB42BBBBB6E2E21AEA55BB8A556120EB15EF35FD9774FC7B5C2894B747D3E4965B77DD8D5B26F38D413662783DCD332765B4DE534D08D6514CA9DC6ED7F2BDB4B5C437178710B04491708836CF2CCA08F28582107D27AC305EDE6030B1F8AADC4A1D29AD16CB4D739D8F813D47DA715CAD6B5CDE24EA95DFF4415B527DD900442D9ED1CA712C58B206D6E79F8AEFB882013358BC578638225BE79B58FB677277F072AEBCF8CCD6AB61A9D98A3B260E60AA625D78058FAE6028E4C5562A0F3473C3AD530BC4471228F27502A8F8FE2D1F72022103C3A2DEA363E68248ED8693B3B066B495561CF4468E8EBF32B454E54DF1766468AD3831D56EF7EB9C231E999C4CC3A6B0EBBF2C4F22820E256F67497427F53AD22D42C9293DC8682D0BE3517B63C6E871910ADBB3406B6B3B1CAD980AAE47BF9686E80B6E5DF2DACCCEAF9506B4667271779D00B4C1065951E21F2ACF6CF3CCCB8A633D1114CE9D531D94420E4AE496086638F031C0BAAB5722A41A66788D3885EFC7FE1C3DB54BC69E35B7489A0237A37AFE5194B5F424F792CC1D696098BCF327D87EBC50429A95ED82105C4328D0095A9775589FDB6C262FA51FFEE4D99C6D1A68FA661D1B6A0A2E0693D73B39218A6895BD83FC1D54831B7DF146FE7BD2A91B979018787B9904285A35922E22A7F1761BEA541EAF21D74E3A2F3C6F2247B042379CA4C553FD9256DD0C63E4C9DEA60912D02FBE4CE7762069A86CDE02A4E1E311B2AFDE435DA0816ACA659BD8C0650C1F118C0EA3622D72A5E96132F8B0FF8458C757648BD46E58195FAA0FC4FF8FA44238E35A25C9807B6229000EE560D8E085F27375C2F659BAA5FDE302B9529BF4699505C28DE33AB5DC2B8C02967947CD24C6A599ACB5C2D1E7D6BF3BCCEA0253FBE11D8043FED532AAFC9EE1151243BB80B92BE239BC4FD1D1CAFF502951205F2E6393B704E67141E1218963F664FE0759C15E6C0A1B40602A73990F040502867A9EDDBD4DB0E554AEA4BB9597949D5FB32C2E3AF92CF7816BEDAD5EDE1B769C823CABDEFCA1D1B85213C79EB03E065146B58E3BFBE80B4D4683B65AD1E0611372729B99A0B93934D52DDE40C19FED5A2B3DC3030E0B5F26B66474A5CCA6D741AB294BBBA6BE516105C08BDBABC97BDEC2141D035BF6C3A71553D6F6350229CA2626B8B0B56A24F2D6EECE436ECB77A70D747B6A6F830578B4792DE533879B174353424E7D0EADF6BD5A74B36A4E6EA7E39A4215559557BCE7A00FAAF0D1F81016F913A10F3C9F406C7CB53282CA8FD5FE4F5FABB96F891583E0507912BA02709764694296A5248C340A1B9EC3DB0F926F438CA96FECD40C4AD8DAED9B8A29691601835FE14283762236EF2135443307E5F0082D1C2180AE96ED0DD99A6E9172088E8B94AA2952BA5E128B202B2CBC1966E69B6E6384820D9AB624BC71788EA84B4ADFCFAA2EFA1DDAA8855D1DB3F58EEF2D54FE11A8A5D78ED46B58460E6F2FBA6CB70640700A4520AA1A2A9B336AEFB17CDE8AC78D67F194662642A0107CE38B74D731380A72AD4A0A068F09E0878E521F15CE8134780C3FD0CAB2DC2473448654F88BF1FE2020901B90C0ED670866B1BC337881292FBA885FE2BFEF6FE74765CA12372C8CBD698AC41A4C337374587DB15AFFB511D8C224F1743498D7173897FF5B8D070B89592BEBE053D5C10DCE67CA8542781AE749F3A42FAD7E4A2004A565F81D5FAECF11115C270155FB8AF6AEDA138B9C71458D6D2FF63441130EE9107C39260469521E020D2B42CB5A51098027F23890DAE8B28BF722AF9ABA6224E02FEB47E40112CCB164E8CF174BC9AC4C11AF9B482DF9C9F7F5F1B826428C21BE395EB1F07DE511E8258C84F5F035F4787ACE18C190808EFE99FCB455A54D366DDE2E230B575ED5A4A75D57C9A38DDE3D91D0D1A1C4DE7F277CAF23E0C5DD8E3B693DBC66B6BF1679B0AF74A2B9065B64CF0978115CC456AF685B22D85135727A8AAD96338611DC109B36C85A92E4A0180AADD1D25C5B3D4C681A44BACB953E50F994FCF5281366CDEC0CC50976074D91840B5079180CF643184ADCF9E4CCB44328E7BB9EB2BD06DBB7A757C35EC3DCF795A5E05ED250159EC453A1692426F624CC0737F691E475804F155E44293151E42D3C0F115ECEE53C6EEEF69788F7E8E5C422BB102237499F2638244C0C080B3639A49FFC1730EBB0CFD8A46 +pk = 5C7F062F4C02CA11EBF1B43568327D42D38D7004731AFB623EFA0908B95C0B00DEAE4B4983B3C52F99F0932ED9F16E5730D6141FA5EA656E14D88A9689991D0204 +sk = 5C7F062F4C02CA11EBF1B43568327D42D38D7004731AFB623EFA0908B95C0B00DEAE4B4983B3C52F99F0932ED9F16E5730D6141FA5EA656E14D88A9689991D0204C5EBA4064E36C3A359486F58E730AF179D010000000000000000000000000000F66438D6B4E753E80370FCF49A082BE461FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB93C6A46FE071294FC6B28965B79E50E7FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000028575B5482C18E69A3053AC93E4B48795F27436A346DB4A31796086562CD56006BDC63BE82F4D19CE5B7D797AC04A545D71DA730A9FB15FCBC26C6B52BA599002DA7E0A251DD8E34982F764BD873BD015A73D46C0687149D3817F699C785A800EB39BF61989598393C5269426502D24BE84C663D1C3F70CF53F8383E26B52C00 +smlen = 1765 +sm = 241C36F45181ACAF89711D126491937D454C6B895C6A1952154B07B6EC7447018C6A192DFAF9CBB64ABE26CF64CD41AF50554E37C5B275BA36E4CB263BD70E0000002647241A0F2647A1CF37A9FDEC4F40E6D349FB344816D012DDD7019818B95EC7477B4E900336A625FBDCA45668E9805D5AF94FEB3BEC72BF5D2A322A54B6A5C36FD89B00F5481A6A855DE9061CD74C02020BEDD4DA833528B0511534F77857FFD16EAFB1A2AC87E6844612DBB104B9F32025B7F54E993D65CE85A061B6AC6D70A15BB42BBBBB6E2E21AEA55BB8A556120EB15EF35FD9774FC7B5C2894B747D3E4965B77DD8D5B26F38D413662783DCD332765B4DE534D08D6514CA9DC6ED7F2BDB4B5C437178710B04491708836CF2CCA08F28582107D27AC305EDE6030B1F8AADC4A1D29AD16CB4D739D8F813D47DA715CAD6B5CDE24EA95DFF4415B527DD900442D9ED1CA712C58B206D6E79F8AEFB882013358BC578638225BE79B58FB677277F072AEBCF8CCD6AB61A9D98A3B260E60AA625D78058FAE6028E4C5562A0F3473C3AD530BC4471228F27502A8F8FE2D1F72022103C3A2DEA363E68248ED8693B3B066B495561CF4468E8EBF32B454E54DF1766468AD3831D56EF7EB9C231E999C4CC3A6B0EBBF2C4F22820E256F67497427F53AD22D42C9293DC8682D0BE3517B63C6E871910ADBB3406B6B3B1CAD980AAE47BF9686E80B6E5DF2DACCCEAF9506B4667271779D00B4C1065951E21F2ACF6CF3CCCB8A633D1114CE9D531D94420E4AE496086638F031C0BAAB5722A41A66788D3885EFC7FE1C3DB54BC69E35B7489A0237A37AFE5194B5F424F792CC1D696098BCF327D87EBC50429A95ED82105C4328D0095A9775589FDB6C262FA51FFEE4D99C6D1A68FA661D1B6A0A2E0693D73B39218A6895BD83FC1D54831B7DF146FE7BD2A91B979018787B9904285A35922E22A7F1761BEA541EAF21D74E3A2F3C6F2247B042379CA4C553FD9256DD0C63E4C9DEA60912D02FBE4CE7762069A86CDE02A4E1E311B2AFDE435DA0816ACA659BD8C0650C1F118C0EA3622D72A5E96132F8B0FF8458C757648BD46E58195FAA0FC4FF8FA44238E35A25C9807B6229000EE560D8E085F27375C2F659BAA5FDE302B9529BF4699505C28DE33AB5DC2B8C02967947CD24C6A599ACB5C2D1E7D6BF3BCCEA0253FBE11D8043FED532AAFC9EE1151243BB80B92BE239BC4FD1D1CAFF502951205F2E6393B704E67141E1218963F664FE0759C15E6C0A1B40602A73990F040502867A9EDDBD4DB0E554AEA4BB9597949D5FB32C2E3AF92CF7816BEDAD5EDE1B769C823CABDEFCA1D1B85213C79EB03E065146B58E3BFBE80B4D4683B65AD1E0611372729B99A0B93934D52DDE40C19FED5A2B3DC3030E0B5F26B66474A5CCA6D741AB294BBBA6BE516105C08BDBABC97BDEC2141D035BF6C3A71553D6F6350229CA2626B8B0B56A24F2D6EECE436ECB77A70D747B6A6F830578B4792DE533879B174353424E7D0EADF6BD5A74B36A4E6EA7E39A4215559557BCE7A00FAAF0D1F81016F913A10F3C9F406C7CB53282CA8FD5FE4F5FABB96F891583E0507912BA02709764694296A5248C340A1B9EC3DB0F926F438CA96FECD40C4AD8DAED9B8A29691601835FE14283762236EF2135443307E5F0082D1C2180AE96ED0DD99A6E9172088E8B94AA2952BA5E128B202B2CBC1966E69B6E6384820D9AB624BC71788EA84B4ADFCFAA2EFA1DDAA8855D1DB3F58EEF2D54FE11A8A5D78ED46B58460E6F2FBA6CB70640700A4520AA1A2A9B336AEFB17CDE8AC78D67F194662642A0107CE38B74D731380A72AD4A0A068F09E0878E521F15CE8134780C3FD0CAB2DC2473448654F88BF1FE2020901B90C0ED670866B1BC337881292FBA885FE2BFEF6FE74765CA12372C8CBD698AC41A4C337374587DB15AFFB511D8C224F1743498D7173897FF5B8D070B89592BEBE053D5C10DCE67CA8542781AE749F3A42FAD7E4A2004A565F81D5FAECF11115C270155FB8AF6AEDA138B9C71458D6D2FF63441130EE9107C39260469521E020D2B42CB5A51098027F23890DAE8B28BF722AF9ABA6224E02FEB47E40112CCB164E8CF174BC9AC4C11AF9B482DF9C9F7F5F1B826428C21BE395EB1F07DE511E8258C84F5F035F4787ACE18C190808EFE99FCB455A54D366DDE2E230B575ED5A4A75D57C9A38DDE3D91D0D1A1C4DE7F277CAF23E0C5DD8E3B693DBC66B6BF1679B0AF74A2B9065B64CF0978115CC456AF685B22D85135727A8AAD96338611DC109B36C85A92E4A0180AADD1D25C5B3D4C681A44BACB953E50F994FCF5281366CDEC0CC50976074D91840B5079180CF643184ADCF9E4CCB44328E7BB9EB2BD06DBB7A757C35EC3DCF795A5E05ED250159EC453A1692426F624CC0737F691E475804F155E44293151E42D3C0F115ECEE53C6EEEF69788F7E8E5C422BB102237499F2638244C0C080B3639A49FFC1730EBB0CFD8A46 + +count = 49 +seed = 8C3D2FBBE0D39E293AF2D2CC5A9BEDEAAE3752DFD19CDC1E186D41E717A0412AA429CBDF005445AFDE684656B5D17690 +mlen = 1650 +msg = D868EC985F946F3C31B6CFE4811BA530EACD0ED061EC383C203B2481AC697B8B88BC0F72B635027E443AB1F54478440DE16E596D30A0F1252E0AF54C0F382BBF5655BEA8C6B9A2F6382D003CC7E4D4F223F8E35EC87CC543EAD52E0E1ED956CFB32E8075715C07CA4817C4B8DACE68C8B0DA459271746BE41D6102B3FA5E49AEE8D443E78AD3246D0B9BCCF6AB7CB7CF72B8A847CA16B435F0618594400037179441F3BF524231F747D920E86506E84C61D4D038D42E82D52D97ABFF896C1DB1C646807156324F7B68DB620EE435C7B8C9AC8B193B7C892565C3631E297495BD3B59293F9A9CEA5E29E23A242B81DD05C8DC9DD669424573298C85870B109C7B593BF864B56895D81386466CA5CB6071005781FB214F1EAE9672D0D16351A627A3FAAC49BE4E13D552340328323CDCB4703BBE07C2A39D75D7737D5C1BD04355B8694432DFB7CB4F1901550C7D6F41080C0F6A2CC49D63A69243D137A78260C06E7A53AAF4F4B086E0220EBC5361A6A78C9B2EC09C2EA4EC45A41065B4B2DAA866D9BABD71C8E6CB378595F068EDB258B2AD1F420B304E5924EBE273AD6D00684F75B6A31DC5290A37D0F9A848B1FC4A67DD9A4FB1F9B4C6CD45E87FAB4A09129C9AB95C44703B75B54C9EF9E825928ACA56527D79B338C5AC639D0265010F3C085D2B09AEF0E4F55D080FB5FF79F13E8E4E8DB020F4C095140D46A93F2E4811BFBC1393EC24F6B7EF31F13623DF0360B1E335FC42098CA1EFCD0306C5FECCE942F6E299AC9ED81054FE452D3F63991DA42D5680EEF749C02FCBA78DB5F4F7C734C6B4D99AF79711A0BAB723C24364AC85700242878CCA93465F286D5F7ADAD7F68F1D38CD6C6E0575A36F1E5521E420D348D947E745C2355FB5FB0F12DC6FB5E9435CF8E552C174A617151AF8D5E7D469AD5CD741E16EB88EA6D7C5806B08571697D22A525C2E30DFF608C921B955D2A990D9466829385DE0A81875BE564942AE740D15AC0AF46A876426EBBE481738BE19BE06F174D975AE8DFB52A94AF9A77E56267C0BB62169165ACE155041406CAF507146A02FB760629CC4C0E7D29108CB7C779455A3EF359BB6198AC75E16148998C16C9410DFF2DAE5F3C79DA61D371992D4A151BA91DAE8814C81EEA4F78D23871326BAFAA349C8EB57231B590F1AC13F599DF5B39DF36455F05E53CDC4D025410E8F8F8BB74854FEFE0C4F790F58434309D36C1E7F3935D4F896368C91AF95EC2DF292AE3166B83976ABD95089B05B461D4E9171CBB4747F3CD9BAB04E5A3B98095754021229B4B820EBDE63E463F2EE479FBFD83CACC61878773B129CD4B3E9AFBAEDB27C7FEDEC2F2D405B99933FE2C203D9949C567A7752AEF8A7788D2375900E70315823DACCD4F2A674196835C35EF813826B310346ABB16B0145CD70FD0A04611ED5AD0B8DDFCA6EBA6B93445038C3DD23D3D15E8899F9C889AF417E5662D538E466447E514A8897C21FE0BE2EF18948B66EB04051C0BC961FA485422A66D649DFA86D4B3DD504A89919A9928EF96FD467713DCCC1F19EE69CE3935F0416D9C5752B7DCF9272D2DB86C3EB6F4897D94DDBEF7C483FCC66232E535A8B0A5AA4BD443493FE539A32D433D9E89F7758DB5B0606A96455B39F92AA788FBBE43CEC8F1D36FEA3ADFD0353EA5532B49A7286381D985E018E6534005F605BF67AB4AAAFDCC499AC0882FCD9D90BD88053CFDADAF466E536F2FFA7F18B3DC254E42FFFC777E0339181473E2B7FC844B687ECCC0EB543A54211084B1EC06B0D9EB0A0C96B88D6585F414873C13EF7002AF2D47D5859A23D12A7D401FFD4BCF642DB96C70FDAD0CB03A6098437795BC9C7C6C804A26225EAA53F52747F01DB4E62471A21DBC1DED9C4DE2508812AB11F61F6364FCFEED445FFBA549E45E641A80FB4B58EE20677C7D6CF0526DBF4E26D9E5AFAC5429B4474DFFE709D09D766542D65E668D59C836BDFD0F78B846BC412F29DA00291871D94BB5E6557D833C8DB3D9BEB37888C3A70684ADC6B063FEC3D847C42E0CE20E05482DB165FFAC5D1F2C661B9DB6D19FB3E8909587351B25F2C225CB26BB137BC52D04AD8157F7D634F29A3623B4EB53B4EF9A78945280BCA8C5E1882FAE373EAC69EA366E2F13A9FEA75A6B7EB5CD4D9EB14F68A231BAC780F84200146CE7795282952382E2393F0C2A99DE830D3AA517DAC4AC97F2AAD3F7F8E3B49B22B078E3708C9CDD1B2A2A129656066C0030D747EDD646384611D4ECCC5B0B9DF4852AF7BFA94F6DD7584F6285CA2EA7ED3F8DECB534E6D31D7165C609FD9AD235F5AF8E4E8E58FD3D248D822C202 +pk = EBC0D42B9120E47AD2C683BF12F9E0250F8624E0871DEAF284548EEC4F4F8604E2E1221F28947FAF9309095CA37BAFDB49C9A8BEB0B8FDD8DFB0B3FA061E02021D +sk = EBC0D42B9120E47AD2C683BF12F9E0250F8624E0871DEAF284548EEC4F4F8604E2E1221F28947FAF9309095CA37BAFDB49C9A8BEB0B8FDD8DFB0B3FA061E02021D7933E8147F290392B36B616458B9A6CA5B020000000000000000000000000000A42052E58683F0A09D381183550671E0FDFBFFFFFFFFFFFFFFFFFFFFFFFFFFFF6990418E850E8E38D29473ABF26E59805AFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000C14946E825C7EAE522E607EAA1D08F3E923BEF5A46DC331B34D0E3F85AC04700769392BA3B61CBB12922E6D5C8A6F6DBD59FCF63DCCE50325FEAFC0685F497001B97E722B9F6138054F81F5944803D8AF9FCF4EAD7333EF9254E53B61B825900B969DCEB23E02CCC9364F5B5183E0A7C5446E06FD1F16AF39F7EB6F499C98500 +smlen = 1798 +sm = 3048EE8254CDFF50D736EE1B124CAC121FD97C2228F9CD4957BB7FFE9543D0020A33F72EEBFF600B38E80FCE90A1C1F6BF012754D21CDEB9F0D0CEEAA8ECEF01000630114F50E7C74FEE42E8156799DEA4E051A3FEA3786380EF47E5D24B08D971C0B0F0A135758A9008BE14B5F454A4450CE50FCB741262224E03922AE1954848183949A005725AB15317784C22A9BD5703041DD868EC985F946F3C31B6CFE4811BA530EACD0ED061EC383C203B2481AC697B8B88BC0F72B635027E443AB1F54478440DE16E596D30A0F1252E0AF54C0F382BBF5655BEA8C6B9A2F6382D003CC7E4D4F223F8E35EC87CC543EAD52E0E1ED956CFB32E8075715C07CA4817C4B8DACE68C8B0DA459271746BE41D6102B3FA5E49AEE8D443E78AD3246D0B9BCCF6AB7CB7CF72B8A847CA16B435F0618594400037179441F3BF524231F747D920E86506E84C61D4D038D42E82D52D97ABFF896C1DB1C646807156324F7B68DB620EE435C7B8C9AC8B193B7C892565C3631E297495BD3B59293F9A9CEA5E29E23A242B81DD05C8DC9DD669424573298C85870B109C7B593BF864B56895D81386466CA5CB6071005781FB214F1EAE9672D0D16351A627A3FAAC49BE4E13D552340328323CDCB4703BBE07C2A39D75D7737D5C1BD04355B8694432DFB7CB4F1901550C7D6F41080C0F6A2CC49D63A69243D137A78260C06E7A53AAF4F4B086E0220EBC5361A6A78C9B2EC09C2EA4EC45A41065B4B2DAA866D9BABD71C8E6CB378595F068EDB258B2AD1F420B304E5924EBE273AD6D00684F75B6A31DC5290A37D0F9A848B1FC4A67DD9A4FB1F9B4C6CD45E87FAB4A09129C9AB95C44703B75B54C9EF9E825928ACA56527D79B338C5AC639D0265010F3C085D2B09AEF0E4F55D080FB5FF79F13E8E4E8DB020F4C095140D46A93F2E4811BFBC1393EC24F6B7EF31F13623DF0360B1E335FC42098CA1EFCD0306C5FECCE942F6E299AC9ED81054FE452D3F63991DA42D5680EEF749C02FCBA78DB5F4F7C734C6B4D99AF79711A0BAB723C24364AC85700242878CCA93465F286D5F7ADAD7F68F1D38CD6C6E0575A36F1E5521E420D348D947E745C2355FB5FB0F12DC6FB5E9435CF8E552C174A617151AF8D5E7D469AD5CD741E16EB88EA6D7C5806B08571697D22A525C2E30DFF608C921B955D2A990D9466829385DE0A81875BE564942AE740D15AC0AF46A876426EBBE481738BE19BE06F174D975AE8DFB52A94AF9A77E56267C0BB62169165ACE155041406CAF507146A02FB760629CC4C0E7D29108CB7C779455A3EF359BB6198AC75E16148998C16C9410DFF2DAE5F3C79DA61D371992D4A151BA91DAE8814C81EEA4F78D23871326BAFAA349C8EB57231B590F1AC13F599DF5B39DF36455F05E53CDC4D025410E8F8F8BB74854FEFE0C4F790F58434309D36C1E7F3935D4F896368C91AF95EC2DF292AE3166B83976ABD95089B05B461D4E9171CBB4747F3CD9BAB04E5A3B98095754021229B4B820EBDE63E463F2EE479FBFD83CACC61878773B129CD4B3E9AFBAEDB27C7FEDEC2F2D405B99933FE2C203D9949C567A7752AEF8A7788D2375900E70315823DACCD4F2A674196835C35EF813826B310346ABB16B0145CD70FD0A04611ED5AD0B8DDFCA6EBA6B93445038C3DD23D3D15E8899F9C889AF417E5662D538E466447E514A8897C21FE0BE2EF18948B66EB04051C0BC961FA485422A66D649DFA86D4B3DD504A89919A9928EF96FD467713DCCC1F19EE69CE3935F0416D9C5752B7DCF9272D2DB86C3EB6F4897D94DDBEF7C483FCC66232E535A8B0A5AA4BD443493FE539A32D433D9E89F7758DB5B0606A96455B39F92AA788FBBE43CEC8F1D36FEA3ADFD0353EA5532B49A7286381D985E018E6534005F605BF67AB4AAAFDCC499AC0882FCD9D90BD88053CFDADAF466E536F2FFA7F18B3DC254E42FFFC777E0339181473E2B7FC844B687ECCC0EB543A54211084B1EC06B0D9EB0A0C96B88D6585F414873C13EF7002AF2D47D5859A23D12A7D401FFD4BCF642DB96C70FDAD0CB03A6098437795BC9C7C6C804A26225EAA53F52747F01DB4E62471A21DBC1DED9C4DE2508812AB11F61F6364FCFEED445FFBA549E45E641A80FB4B58EE20677C7D6CF0526DBF4E26D9E5AFAC5429B4474DFFE709D09D766542D65E668D59C836BDFD0F78B846BC412F29DA00291871D94BB5E6557D833C8DB3D9BEB37888C3A70684ADC6B063FEC3D847C42E0CE20E05482DB165FFAC5D1F2C661B9DB6D19FB3E8909587351B25F2C225CB26BB137BC52D04AD8157F7D634F29A3623B4EB53B4EF9A78945280BCA8C5E1882FAE373EAC69EA366E2F13A9FEA75A6B7EB5CD4D9EB14F68A231BAC780F84200146CE7795282952382E2393F0C2A99DE830D3AA517DAC4AC97F2AAD3F7F8E3B49B22B078E3708C9CDD1B2A2A129656066C0030D747EDD646384611D4ECCC5B0B9DF4852AF7BFA94F6DD7584F6285CA2EA7ED3F8DECB534E6D31D7165C609FD9AD235F5AF8E4E8E58FD3D248D822C202 + +count = 50 +seed = C10427EF0B26328163F85D45E22EC5215415326F013FF31EDD58BD3E97B1A72FF07D275D4C1B517F4661B0638F75640C +mlen = 1683 +msg = 4BEAF8CC3A7C393932CD37A2CD8ED790F05E4038ADF1287E2ACDCC0BED9BDBF92CE44AAE95CAF4EB142B858E1421610EAFC47DE566182835BDACD4C836F19BD686D53C3834EFD928487A2AB3402C2E3AB3AF97AA802B05223CA6927722C3BD1FE3F8C20F93C3951F907314896CD21CB99306FD7E5B6176945C2898B10C1DF62FBB2680752CABC8980B5A0430BE39D34BB7DE9544BCCCBFABAB709C11BFFF5C958C8763D8D5830235B49EAD26C834E63C3F3F2D6BA944FD2688F6350EC99DAF4CCCC42C6BE1CB19DD46514D71CB6E887DBA80EDB580B27F1142A20EA0D497E0336D55F1FFD4BB3D4B3521F0A01C7BB09258971D1ED4A98EC052B24776623D7B9A83C818795E3989EAEBA8C9142A97AFCE855CC6AC0ABA15F0546684AB5C2F48B23BB72A88B6AF2BA9C73881103CB6FA99E3B03119EAB03BC3B9BC365EFCD7B9F49A8BAB6A34A00AA8F2C88D7BEBBA808BD97111EBB192D82AD244E18BCA732FE6F72FDE5BD533E4BCCD3F50332DAD3A4169EA85C324D165413F10888AC3B21B91DE09FCBB9B636ED00FAAA669ABF6429B78C3C04F239722F31FB0B1A20CB1A6B553908070AC13521DF66772A6036E6695CF66B9A90E2111E499BCBF5DCD19744F43DEB943445248A5E84F168E7BFEA2DC4E1D0A87FB4140EB7C72D2DFCC27923206054CEC870888A79938DACBAACF1F122B22AB5C9701D777BCF9809CEBC9B7AAC52468134FC4A92C2BAA9B8C0F6249130A50337F460A42CB5364A5E7408CAEF8D12BA6934AB645DE9832818F9DB71F5EB0B158DE6A76619E75245B56020E1664D8FAF1C1782DE4A688D4055E07D842410600E9454E28676D44357853FFA7740200C91EAFA16BCA21D0006F47FE8159A733E0E91549DF434EF316E1DF9BB97DA6A2C2E2F20A65B3C00041A903270CBB55AE2432AEE25C71CE73BC2322CCB8E5BD0E24820616A890B0851D825D79411C14948DCDF48776D72565422056FE75765E50736C82F71270BBCF229A7B7A45DC88AADF4F84238C896DAB889E16C17DB7BE551AB24873FDA82F102D0FCFC139C9FEBE9FA99819CEF0E2684DFC5C843A6D496D8A595D33C51E1FDE9A84059C7BC596D32D53E2FE046F23FEFA51D13F9C28E227F5E24429B851ADDBF578922AEB0C5A61BBB666D11D127BA45C9E6378C70D75643DE776483582E034E81FAE0A3F029C47FB192CFA018CE1F68261D77CFC9E05EF19438E47F3DE9A68C8DC09D07B1BDC6CED69592623750F72EC2FB8C5CA981DFB84B4BF0734377EE9DD8EF5DDCD96F438D30AB78F402EBFF2163D43345EE8CA119F3208E21AA3A2185DE967B475B9ABFBC86465275F9A634FC22015E94A298E9C204E9786CB1FF14A5E99F942D42AB5DF51AD09654083DF0259AA1C26A760CCFDF4A276600C5FD3A54F210B20731941EB48A79435F1F86C45F8181D9758A1835721B87D36C725878375FEBCB8D48ED2CE8892DB50965753A98F4E7110281DB40ED64DD8EB51AB9CE41042589152D8CD5876FF30536F8955172A7A8F5C3F5FFD22C9954903136F781F0574F45F909BDF1657FC1CDCB9C4689F41E462C8D39108B10D78B6892C8775FDEB139258F8130BD1D2A1C72B5026506409F9862AA8729B35C652074494FEB84A553CEFBEED19D6EE94758E800F5FCBCAEC19B6A00F33EB237AAA6FC0B3A08C1D8829C180BF95E7D05F919A929933B7A032CD20ACE82AA5A45E5B2FB09812F36974B5EDA1B387FEB13BD49AC374F821341282C8FE2FB0CC5C075356833FF8CC6B648729A4298ECD73BD0EC73957077AC65722D0BE23C1536B8DB7B0506DAE47C0070564E7D7F9444F47B22C679EB8ACA4826F974A42043863E498E5301EA162C4E96684ACC5CA26CCD083541BC4C1D2FD690E51F07FB08337450A204B0F4F2C17785E037424FD6E78746764584D5F19255496DF1E524BFF0AAC31BDE9254429565278A39ECE4627C023EDF18BC21BB523D44EFC259742DEE9FF7159D5F700D957CCBB505A88C2037629402C2A322D17647E430777B184FF7B4E8D6B94724ABC36A5CCFAC08E2479E8310BCB7A617A25FAC6EFD10D0A07248F7D4597F14309B8064FE3BC4A4479F905E832210D49363D1E5D58176DEC9ABCC0C5132FD6ECCEAD2B05B56C96ECBBEB0B803E43DB2F982AD9EFE1E2A49649ED8E42707970C93615D54A3E673559B996E48A3B73143BA0884E918888156CA78F793DFF990FD721DE0C0B7916A5CED736E31292C5AF062D7CCD83FE653294FAC8C50CF6BA37B37D5A9BFD1E3B92D1825C1BE0795F9B257CDAB91CE99C0C51BDFCD6C0AB5A3BC6E30F884ECB4F1F61A3259CD279205B2C21CDDB196360061758E67B1C3724F5CB6311EB4FB92E6C0D71E6D1EA45 +pk = 37A336AF254587DD02DDA81F787621DDDC52DB923EEB7D0760E4F7E62D5813032231ACCDC1F99F3A4FBE434885FE3A2368CC9192A172D0BB146496B5E1103F010A +sk = 37A336AF254587DD02DDA81F787621DDDC52DB923EEB7D0760E4F7E62D5813032231ACCDC1F99F3A4FBE434885FE3A2368CC9192A172D0BB146496B5E1103F010A2329673CA9AD859D2DC6F47049545A0F8D030000000000000000000000000000FA87C93133ACF36567DA8D39B8BBA055EBFDFFFFFFFFFFFFFFFFFFFFFFFFFFFF05483C32804ED2606FB93BE86A35F75ACCFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000031A26800029960347EE38190DC1ED920E73319181D07FAB7F3FF3076A38C4C0060EF5283F86BB68D0A3244C1EBFD1236F872A8409DE98526CFCFDDEC1309A600C4983FA1EC026D7BE187BD1E1927BF6F8BE751870DCD6093E67B66597923010085F3568A69FAC8F876A6ED7CDE8A8C2664E8159AD4B63F7B1A2FD4EDD8068900 +smlen = 1831 +sm = 2CABCF403CDCB20EA69FB140649C71FFA41471F76F336BC2B9327487DA909200B40EC262EC32C77DA8CA9C1A7BA70EB1E4CAC4FF7A9173D7B5B623669FF53B010001B173D9A7A06CF8DB36D0F2455E4C5D2FE71E3FD8B333EAE38B350317EF01085256653FB5BE26694D39104002D6021AB6F0F76E6388BD83B7A36830BE0B76700BD6134E94CD562956F7996090E7BB5E0002024BEAF8CC3A7C393932CD37A2CD8ED790F05E4038ADF1287E2ACDCC0BED9BDBF92CE44AAE95CAF4EB142B858E1421610EAFC47DE566182835BDACD4C836F19BD686D53C3834EFD928487A2AB3402C2E3AB3AF97AA802B05223CA6927722C3BD1FE3F8C20F93C3951F907314896CD21CB99306FD7E5B6176945C2898B10C1DF62FBB2680752CABC8980B5A0430BE39D34BB7DE9544BCCCBFABAB709C11BFFF5C958C8763D8D5830235B49EAD26C834E63C3F3F2D6BA944FD2688F6350EC99DAF4CCCC42C6BE1CB19DD46514D71CB6E887DBA80EDB580B27F1142A20EA0D497E0336D55F1FFD4BB3D4B3521F0A01C7BB09258971D1ED4A98EC052B24776623D7B9A83C818795E3989EAEBA8C9142A97AFCE855CC6AC0ABA15F0546684AB5C2F48B23BB72A88B6AF2BA9C73881103CB6FA99E3B03119EAB03BC3B9BC365EFCD7B9F49A8BAB6A34A00AA8F2C88D7BEBBA808BD97111EBB192D82AD244E18BCA732FE6F72FDE5BD533E4BCCD3F50332DAD3A4169EA85C324D165413F10888AC3B21B91DE09FCBB9B636ED00FAAA669ABF6429B78C3C04F239722F31FB0B1A20CB1A6B553908070AC13521DF66772A6036E6695CF66B9A90E2111E499BCBF5DCD19744F43DEB943445248A5E84F168E7BFEA2DC4E1D0A87FB4140EB7C72D2DFCC27923206054CEC870888A79938DACBAACF1F122B22AB5C9701D777BCF9809CEBC9B7AAC52468134FC4A92C2BAA9B8C0F6249130A50337F460A42CB5364A5E7408CAEF8D12BA6934AB645DE9832818F9DB71F5EB0B158DE6A76619E75245B56020E1664D8FAF1C1782DE4A688D4055E07D842410600E9454E28676D44357853FFA7740200C91EAFA16BCA21D0006F47FE8159A733E0E91549DF434EF316E1DF9BB97DA6A2C2E2F20A65B3C00041A903270CBB55AE2432AEE25C71CE73BC2322CCB8E5BD0E24820616A890B0851D825D79411C14948DCDF48776D72565422056FE75765E50736C82F71270BBCF229A7B7A45DC88AADF4F84238C896DAB889E16C17DB7BE551AB24873FDA82F102D0FCFC139C9FEBE9FA99819CEF0E2684DFC5C843A6D496D8A595D33C51E1FDE9A84059C7BC596D32D53E2FE046F23FEFA51D13F9C28E227F5E24429B851ADDBF578922AEB0C5A61BBB666D11D127BA45C9E6378C70D75643DE776483582E034E81FAE0A3F029C47FB192CFA018CE1F68261D77CFC9E05EF19438E47F3DE9A68C8DC09D07B1BDC6CED69592623750F72EC2FB8C5CA981DFB84B4BF0734377EE9DD8EF5DDCD96F438D30AB78F402EBFF2163D43345EE8CA119F3208E21AA3A2185DE967B475B9ABFBC86465275F9A634FC22015E94A298E9C204E9786CB1FF14A5E99F942D42AB5DF51AD09654083DF0259AA1C26A760CCFDF4A276600C5FD3A54F210B20731941EB48A79435F1F86C45F8181D9758A1835721B87D36C725878375FEBCB8D48ED2CE8892DB50965753A98F4E7110281DB40ED64DD8EB51AB9CE41042589152D8CD5876FF30536F8955172A7A8F5C3F5FFD22C9954903136F781F0574F45F909BDF1657FC1CDCB9C4689F41E462C8D39108B10D78B6892C8775FDEB139258F8130BD1D2A1C72B5026506409F9862AA8729B35C652074494FEB84A553CEFBEED19D6EE94758E800F5FCBCAEC19B6A00F33EB237AAA6FC0B3A08C1D8829C180BF95E7D05F919A929933B7A032CD20ACE82AA5A45E5B2FB09812F36974B5EDA1B387FEB13BD49AC374F821341282C8FE2FB0CC5C075356833FF8CC6B648729A4298ECD73BD0EC73957077AC65722D0BE23C1536B8DB7B0506DAE47C0070564E7D7F9444F47B22C679EB8ACA4826F974A42043863E498E5301EA162C4E96684ACC5CA26CCD083541BC4C1D2FD690E51F07FB08337450A204B0F4F2C17785E037424FD6E78746764584D5F19255496DF1E524BFF0AAC31BDE9254429565278A39ECE4627C023EDF18BC21BB523D44EFC259742DEE9FF7159D5F700D957CCBB505A88C2037629402C2A322D17647E430777B184FF7B4E8D6B94724ABC36A5CCFAC08E2479E8310BCB7A617A25FAC6EFD10D0A07248F7D4597F14309B8064FE3BC4A4479F905E832210D49363D1E5D58176DEC9ABCC0C5132FD6ECCEAD2B05B56C96ECBBEB0B803E43DB2F982AD9EFE1E2A49649ED8E42707970C93615D54A3E673559B996E48A3B73143BA0884E918888156CA78F793DFF990FD721DE0C0B7916A5CED736E31292C5AF062D7CCD83FE653294FAC8C50CF6BA37B37D5A9BFD1E3B92D1825C1BE0795F9B257CDAB91CE99C0C51BDFCD6C0AB5A3BC6E30F884ECB4F1F61A3259CD279205B2C21CDDB196360061758E67B1C3724F5CB6311EB4FB92E6C0D71E6D1EA45 + +count = 51 +seed = 4B6B73E042CE76DBE39535E45D3BB2F3B9F8B2BDA170E76CC88666844703E32B2367460A0F6A0A2E3F4E7A6CD32BE998 +mlen = 1716 +msg = 0BF9A7C0F63CDCF3F850ED7C5DB6191EEEFE29E498A19F9D89BE4698821ABD72EDC34317B4F8EC2736DC83C24AC195BD55AFF00E797A83DFFADC7970FE53304F16F5DD92E6EC362B9E283E41EBF121FB2FA2A3F60124EF3EBF836AE51FDD55CA9F59B085DDD660724C072B86041B50A3A446CDB20A45BA65380ADF007E005DF2D9AA16A9D22B11DCF6F0B1964F04F45441A923691A15D80DC85003B9AE281F2B5983DD1A04D80A4D9C4372D9820BBFAE3AF7735E7C71E9F085C0A6E4BC107D9E4BA222B38FB236B2CC3A19DD6067BEAC460383FF2BCC771A7F1AAF092FC72C292FC1D5C6FC6B9715F1E1272EB22F8E0B33A2830E31BD6C531677902F6A95CABC3E9C1AE36F77037A785FEA355137A581FC14E6BD5F1F7AD1A5DD19DEDD448B47B558C22DD0FCBF296A812A726E7D1B57F4688D3F577104CFB15FC63C27F7B6051C7AED7D645186FCA63AD9C2D68BFF442466EFF76BCF0E398D2BF54C2CA4CC614839E9BCA48AB2CC53865803710A98D313AFF1DDD06A65680EB83C640052DB807EB2F38ED0CC211128044D331FEC3E6B0B2F3B675C631FDADE62C16D1719278413EA3F8E54BA34EDE7E73F3D94802D2F9CB9794D257C46679A3F00015945903190B97071F8FB55F8696253AA3F39B3FAD344FB88224F5313B43889B768171895F7AABEFF25E21E525EA01A996C764A3ACF12BFFED08F3F751F5CC094B50B325F8B62C7A5B3256964D48543690538E634E5730354358534B65EDDD44A526BB4B15E2042B6210F503EEE06D00D615CCAD10D73CDCBF5264B526674D85C0ED31BA5EE584F21FE6D13F883ACE4B094768865E43099E54671240E8E2AF8A7D7D22335B3974CE860E7238A7C1CA8A009EB51C8636F0659189AC8EF01C871E9008957CECE0A367B63BD2852BDE8690BD74C6D956435D0AB82F94A90CD00FC840DFC7036B84D51F1FF5076CA0974DB6CF25AF42EF7DC8C30C2B04CEB2510E86FFC510BF4C931639478FD1520AD571FA17958CCF8E37F5F6360030300EDE3A33871E9582808BDA2233996C5005FD0C23D99261F570AD9027767F6FC96D18BA98E8DDFC2B79AC12CDA5F2367B4BB6B99A3E07B59882E49A92AECE85339BBB18AB9644D20A3B2A795240492CE4EAF09D9EF728FB82B1DE7B64B5D391251FFB0699335CED8C7CE642FF1A79F04C3EA0DC37EA101188361AFAD236EB218CFBD1D0EBD784CE27DCBA0266DDEB87B59B66A4F75BB44665643FA358DD3D0B69B49F45A752B5C410E2299A62BE4B57B32B0924A069A8E8C15D754CC34DEBB0D967E70693A6FFA58CF7099C2C2458B437C7B205CC7E815F6CB494080F9EAF3017E5FF918558DDE415FF72E954EBC2ED4C20C8ECE38CC916060D22E582D54F74C6C181C2601400110A683F4A365E45FF1387BCE4E152A740136BB762B03A99FB68F6AB42620B2E3C00FA8D150944230A6330409B27E4AAD1693E2C3DD12216C4E2DDBC5E9CBA68B8B5417A7B2EDAE7EB67D25F4EDECBB087F93DC9C927C33076B1C71A2B83B33870D602562ED378805A690DD2A427D86C2C46BA4741F3DEFEB91A05EACE975C836E52868CFFE52CA92F97DE94768161A3E953BAB6A28016782909EC53C02F35184AA9CCBD5B793B525204B72DEB63E104376893B9452C3F2C492F423CBEF1EC87C85788CF3073FFBBCD67FF79BD038672943AE4BC68DA131DBA8D7B41C83B4E9CFB6931987B270C74919BBD40612F823114E4BB148671F1AA62BD2BDFCC8B0B24010EC112E883AEC9746D0F5DE467ADDAF51F8C070A359108B1F91643071438F098233AD9A94D0FAA665A39291A98D14A861905ECDE4755D00E690429C57580DCB6D51BB6186CE72EBB1FA8413892CAFB8713E89775013E546FDA30AEB8AF9F7155C08B25810C80CCAA5E700C124CFF59FA32E0293ADADBCC7B1A99F67E66B28DA614C5A4CCD706AFD05388C65EBCE07A543D3DC1E5A5D1F307F675728D4C629A04E9E455B4DA35236C677F26EDC622C1FBF29568D509EA0690AF4CB5DBB4E418B6162888E43B458774A31324BFD5EE8D2152E4AD43A3007D7D4AF5FDA172C2779837AD3A09E135DE953CE966727A7183BF77ADFC76430666B526692991D3C9DB5BB377552A7801C548AA63F6931D3EE91B875CDBCBB7441A4FF81F86762332D7192FBC2F7B69A58DB6CCD3558047F1940A1CACD6FA28A000B9795A2860394BF05F0120E6D85F96B1FE9DE14E3ED66A31D747924B6FF2620778E0714AEB34B79A5D935A0306E55C36506A292C5DC568403551907E49A43A6263D2915108916F1E27CF3529D1B7BD1544AF83A7CBE58547F192A93CE5C5BC6D652405FFCB95345F522B2D34E8EE0960BB85537A46121BD9A408D283A125EAA745BBAB04E2231C19AE95E13901C69E5C9C4D70B104478F4A70D64F81269A8 +pk = 8CE7B590B379C4C6739E47DE0E76C292F54334F199CB3FFA3B4BF0323EBC8B0166331191648EBB812651FB9B49C30EE2D526CA0F54B88FD78D0DE306F9249B020B +sk = 8CE7B590B379C4C6739E47DE0E76C292F54334F199CB3FFA3B4BF0323EBC8B0166331191648EBB812651FB9B49C30EE2D526CA0F54B88FD78D0DE306F9249B020B6F45195F3843B8483F0C4AD4E8B99019CD000000000000000000000000000000E4B1B061530CFADC1376623F9878FD886CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7C0164137DFF6A7784734C8C4F007232DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000AFD288D4AA91BE62540D39587E19B6AEA42AD105DB0CD07EF06DB3539C03D600533B13CEEDFFD03DACCD77B83436AA52147A997597A260701FDD6FD78C6EE400974C535AB3B7C96888ECDE1AECE6DD78AD3A8ACAEE641B3BABB161DFB1F170007845AEBB9C213CD7452310DF3C2AEBBCEB35C991BC97FAC387D7B761A0FFCF00 +smlen = 1864 +sm = DF143977C8A29F6C3CA07972F3CCE1DDEB31D1FDC18445B74BB492530D5DE804BC0C28B368142B78EE5E2FCDAE44262B639BAAF1DD3179B49902B7701F993B0400023BA338E6C8788A0180412F7417FF263A1D03F88903CE6FCE20BD729E43ED3B9DF90B49F32C66530E1F2B0EA1858EFC7423FE8E6D7DE8524D33263BE13D9F87BD8EBD4AE73056A351B92A3AC712338E03020B0BF9A7C0F63CDCF3F850ED7C5DB6191EEEFE29E498A19F9D89BE4698821ABD72EDC34317B4F8EC2736DC83C24AC195BD55AFF00E797A83DFFADC7970FE53304F16F5DD92E6EC362B9E283E41EBF121FB2FA2A3F60124EF3EBF836AE51FDD55CA9F59B085DDD660724C072B86041B50A3A446CDB20A45BA65380ADF007E005DF2D9AA16A9D22B11DCF6F0B1964F04F45441A923691A15D80DC85003B9AE281F2B5983DD1A04D80A4D9C4372D9820BBFAE3AF7735E7C71E9F085C0A6E4BC107D9E4BA222B38FB236B2CC3A19DD6067BEAC460383FF2BCC771A7F1AAF092FC72C292FC1D5C6FC6B9715F1E1272EB22F8E0B33A2830E31BD6C531677902F6A95CABC3E9C1AE36F77037A785FEA355137A581FC14E6BD5F1F7AD1A5DD19DEDD448B47B558C22DD0FCBF296A812A726E7D1B57F4688D3F577104CFB15FC63C27F7B6051C7AED7D645186FCA63AD9C2D68BFF442466EFF76BCF0E398D2BF54C2CA4CC614839E9BCA48AB2CC53865803710A98D313AFF1DDD06A65680EB83C640052DB807EB2F38ED0CC211128044D331FEC3E6B0B2F3B675C631FDADE62C16D1719278413EA3F8E54BA34EDE7E73F3D94802D2F9CB9794D257C46679A3F00015945903190B97071F8FB55F8696253AA3F39B3FAD344FB88224F5313B43889B768171895F7AABEFF25E21E525EA01A996C764A3ACF12BFFED08F3F751F5CC094B50B325F8B62C7A5B3256964D48543690538E634E5730354358534B65EDDD44A526BB4B15E2042B6210F503EEE06D00D615CCAD10D73CDCBF5264B526674D85C0ED31BA5EE584F21FE6D13F883ACE4B094768865E43099E54671240E8E2AF8A7D7D22335B3974CE860E7238A7C1CA8A009EB51C8636F0659189AC8EF01C871E9008957CECE0A367B63BD2852BDE8690BD74C6D956435D0AB82F94A90CD00FC840DFC7036B84D51F1FF5076CA0974DB6CF25AF42EF7DC8C30C2B04CEB2510E86FFC510BF4C931639478FD1520AD571FA17958CCF8E37F5F6360030300EDE3A33871E9582808BDA2233996C5005FD0C23D99261F570AD9027767F6FC96D18BA98E8DDFC2B79AC12CDA5F2367B4BB6B99A3E07B59882E49A92AECE85339BBB18AB9644D20A3B2A795240492CE4EAF09D9EF728FB82B1DE7B64B5D391251FFB0699335CED8C7CE642FF1A79F04C3EA0DC37EA101188361AFAD236EB218CFBD1D0EBD784CE27DCBA0266DDEB87B59B66A4F75BB44665643FA358DD3D0B69B49F45A752B5C410E2299A62BE4B57B32B0924A069A8E8C15D754CC34DEBB0D967E70693A6FFA58CF7099C2C2458B437C7B205CC7E815F6CB494080F9EAF3017E5FF918558DDE415FF72E954EBC2ED4C20C8ECE38CC916060D22E582D54F74C6C181C2601400110A683F4A365E45FF1387BCE4E152A740136BB762B03A99FB68F6AB42620B2E3C00FA8D150944230A6330409B27E4AAD1693E2C3DD12216C4E2DDBC5E9CBA68B8B5417A7B2EDAE7EB67D25F4EDECBB087F93DC9C927C33076B1C71A2B83B33870D602562ED378805A690DD2A427D86C2C46BA4741F3DEFEB91A05EACE975C836E52868CFFE52CA92F97DE94768161A3E953BAB6A28016782909EC53C02F35184AA9CCBD5B793B525204B72DEB63E104376893B9452C3F2C492F423CBEF1EC87C85788CF3073FFBBCD67FF79BD038672943AE4BC68DA131DBA8D7B41C83B4E9CFB6931987B270C74919BBD40612F823114E4BB148671F1AA62BD2BDFCC8B0B24010EC112E883AEC9746D0F5DE467ADDAF51F8C070A359108B1F91643071438F098233AD9A94D0FAA665A39291A98D14A861905ECDE4755D00E690429C57580DCB6D51BB6186CE72EBB1FA8413892CAFB8713E89775013E546FDA30AEB8AF9F7155C08B25810C80CCAA5E700C124CFF59FA32E0293ADADBCC7B1A99F67E66B28DA614C5A4CCD706AFD05388C65EBCE07A543D3DC1E5A5D1F307F675728D4C629A04E9E455B4DA35236C677F26EDC622C1FBF29568D509EA0690AF4CB5DBB4E418B6162888E43B458774A31324BFD5EE8D2152E4AD43A3007D7D4AF5FDA172C2779837AD3A09E135DE953CE966727A7183BF77ADFC76430666B526692991D3C9DB5BB377552A7801C548AA63F6931D3EE91B875CDBCBB7441A4FF81F86762332D7192FBC2F7B69A58DB6CCD3558047F1940A1CACD6FA28A000B9795A2860394BF05F0120E6D85F96B1FE9DE14E3ED66A31D747924B6FF2620778E0714AEB34B79A5D935A0306E55C36506A292C5DC568403551907E49A43A6263D2915108916F1E27CF3529D1B7BD1544AF83A7CBE58547F192A93CE5C5BC6D652405FFCB95345F522B2D34E8EE0960BB85537A46121BD9A408D283A125EAA745BBAB04E2231C19AE95E13901C69E5C9C4D70B104478F4A70D64F81269A8 + +count = 52 +seed = 3D4607399F6FCBE074FD2BEAB1A7571239D6BE6308617866B65B892EE65399E14DC7FA612CDBC5F7E23116FA86C3133D +mlen = 1749 +msg = DBFC582AE98D8FD326FAE96A1849EFE729A1173339D90C48C3A2B867135F1DFF5B497D05FD55130694B5F9C62D136647D767AE682A0F05C670CEECC03475FFD39E0BD4E45B720D9D7E8DD04E69C969627682AD83F48609F6E66D0BE99064988E4654E3913B7CAF1475622E211BC247B98E5BABA1B804E2BF651713197D8A610CC111BA5FD98A053408AD155DCB756D28A283BF3B20E6F3785DD5F105F8D7D9F2956064860B097C675630EDEE1F17E2EB0B26B6C20E260F9A5915D63F1BE2C74FB0B37013244481A2D0C581C4EE12516E0FD4701E9835C8526A490CB39E99FAE07C40236808F9605A63A5106C19517C3711CA4B9E8EDDC77B242575D904DBE64223CF14A8E39FEEDA9D6C5F9CD0D0719A7EB5EFA71453636F78CAB8262636FF1E136C787E38A43FAF02699C1F260EC45B068EDBEEBBB8A0E08CE282BF47D27A33216856F0C59E743DEB13397656FF17FC4B3C694B189C35E516BE719CDA6542260D1301DF93A5D93EE118F7CB0AC94D0364C9EA66718A4BC7F3D7ACFFA60AFB7100F7D97E98DFFE167D1D8E46C912D41EA057362C13B078CB1D9C443C1A57AC18C4566F5F5388F47A40CA49CDAAF34BD4C9A597FFBF7AB20D7CE88DD76A639E09ADA323C588B08140E9350268C1FF76079093A05CCF5E1613A70E6E37CD257875049A767332E5F7420F319F9AC78F97C0C4FA40B1EEF8C8B48045C78F73584590FE41F9F274DEA838DE75DADE66D04E9D9308CB0A9948320D28D9CA8F1F51E39FF3DE20FD5A2A267D127C317ACD51FB779E597A8DC7359D920548B8BCAD761C6B8012304E12628A2652D12A8161E538C20D582BF567E9C2B46B4CFE2D2DA31120C6DF50DF45C80513AA9EEE9F2613A221AA1D23F861C7F26AAC7813B7ED7278EB420A5C44F2A5879A2F1F9F11E14602762E3389B152C014EA9DDC9DDDE9ED1D6F74E7526F690EF37E71D448342C012E032C00E480A699ADE617434C12DA0E69139D0D9036743B9E2B9134B5086FCB96B193330ACE8E4F77148AD0F532E72E1792795080B54D7172FB9AF1972D00AE24D0B3D86528675B3BC8C7B80598D855B95A77667AD0F671F00039C08CC99F5644BB006BA9356B9C02BC935212C43490C741B0845CD7B4247592374AEAA1B589E670AC62777293870963B5132DCC27088F5DA5B831FA570766FA81C2A07B88BBD45B81992EDFD2A7FE934219B1F648DD8A414FA03EAFCD39E72BDF7D4F6B9C1F31A0A67DF03F6709F2BE0E7D1B1690C92CE7B8C6B1054270D796B16D6E445D24CB11229CB0F92DD81190A37838951AD28BE2AEEE6C5F63DA60A911AE0A24B1D05EF2F814FB30AAE8CA3BD9F01D4FABE5B279142AF948B0E6BBCCF7560107C161C816A0D8E61DD908445079BAAFB78C14F68B8B2BB241FB03C237A4CB250911142D0B460ACC75E6B0F58BF28546A4779EA7342238826F636A510CC9CFFEE8BB0292A58A07694C05672B560B26158A8566D01D0EEA0773E81F3F84376B29CE375FC56A0689A7CA5CE94B91814B62CBB61EA2EFCA0CE6712A941D612B0F700C56B46D464C2AAAB3F64A89CAA8561A1DAB2869D79DA1720274D031946C4C7715FB9C243DC95CCA7AECFF55EBA4044467EB922E93F57E3E39B93876A03936DFFDD2AF48D055C6C188F2F229812EC94F3FBDF7D7DB62E4274DC91718710EEC2CE034AEF266207C5CCBA21552D6FB8DDBEE8E931067010594A9E0CB37250F67281C0A369965367424D454CDD05D3C8F35A15F76B4C8C3FEE42F4C9CAD68849837DED3BE58730B94AE3A5F9146F90E03B4C0836381B3F9CCB5DE6BD2455D241BE9132EB6D4937FF27663F4CADAA9CDA193919F4CB0D0F727F6C7B26E831C3AC8DECC234D79D1B3BD28305E3012A3733AD718FDAB7DD1A6400BC47F47D20F627D2449DBFF10E37A62299E22E408A28A806D403CBEE19AFF6FA9B1814B35B9573ADC86F829A08893CFAE4A0212293447D3086E21BBA28049F3ED383519917B169E8A1B7DD64CEFE0DA643A97950A205CBFF6BD9334180556E84199F0B60738715CD69AAD7C882430578F6FBA4579D908F863CA54D0B9862EEA6ABED31301D183CF465B1A256CBD597A629307A8A890F11C23DBFF895B932E9CD2F5F06A4183D6F2D61117126FCD2CE2B86BB44A9A5B402E3EEDBE4ED1DF11716E91A2302CB72D8F0DAE132E16311C80DCA041694AF1EF63F659959FCAA133D9E5668F94D0489311AF3BAD379DE17793BB3EE8A284529A72CDEC474B3A82D92C6CB21C63017F262E0D7DD47AA5C58F5E23F8A37F00D5438717F05BB974F18A5D3E1CA054EA053C30B34FBFAEE88BC0195F061AC32F5B71B2A8A3ED4B8BC4EDAB40A6396C052DCE72E10768526C00610E96DF38AA70938CF844CF445D8E2BF73C4F32A742812D8C1DB53AFC6B6C0A4BC67C3CF7579702312D6C89BF14E9585D2C624D07FEB4B5B57F8E4C5CFDA69A5E922CC1E9 +pk = 84552C21CBCB29F4D6BD62D4120BD5A1272F2A3B2A8AAC84C1A951671C4B7F03B31B3E5EC16E333EA5C04952E066E8AF3B0B7E0ABF9584A32EE9D78447CE580104 +sk = 84552C21CBCB29F4D6BD62D4120BD5A1272F2A3B2A8AAC84C1A951671C4B7F03B31B3E5EC16E333EA5C04952E066E8AF3B0B7E0ABF9584A32EE9D78447CE580104050AD79B4B6DB6FE9878FF224CB110463602000000000000000000000000000028A484A4507F97F21807388A89E49237ABFCFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B2155ED7C8CAD186ACBA9ECBCC147683EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000059EBC89D5CBB8AEE25BCE2EEB0DD78DB900C319A4DA82B783A7D6A85F229DE00048DCD97D915460DB4A0D8839256640F3DD282F9EF4EE3B20737C194EDC27B0051B439F2E0CDC26675097942D93D9473327B4E3BBBF2206EAFA427886B1B3E00F569BAC8788F9CC99008DAF005F41F6D6032714E465922018C30E605429B9700 +smlen = 1897 +sm = 1563AEC17185417F62D5E1D6AA55A3606DA3A4445AD7D5C30C05048A7108F801F919723947B817F03B8B6F4D420832A6EBF56583A97650D886E9ABC35D955101010100FA7D8E40863688C895613F9496601BE7F51E3DB464D6AF1C6210AE97EBB877565EE5A0C51838F35A59EC198B61A576B7A00C61D39442DEA3C7A8C6A6CF9C18A7BCBFACA98DE96D968492349889C903041DDBFC582AE98D8FD326FAE96A1849EFE729A1173339D90C48C3A2B867135F1DFF5B497D05FD55130694B5F9C62D136647D767AE682A0F05C670CEECC03475FFD39E0BD4E45B720D9D7E8DD04E69C969627682AD83F48609F6E66D0BE99064988E4654E3913B7CAF1475622E211BC247B98E5BABA1B804E2BF651713197D8A610CC111BA5FD98A053408AD155DCB756D28A283BF3B20E6F3785DD5F105F8D7D9F2956064860B097C675630EDEE1F17E2EB0B26B6C20E260F9A5915D63F1BE2C74FB0B37013244481A2D0C581C4EE12516E0FD4701E9835C8526A490CB39E99FAE07C40236808F9605A63A5106C19517C3711CA4B9E8EDDC77B242575D904DBE64223CF14A8E39FEEDA9D6C5F9CD0D0719A7EB5EFA71453636F78CAB8262636FF1E136C787E38A43FAF02699C1F260EC45B068EDBEEBBB8A0E08CE282BF47D27A33216856F0C59E743DEB13397656FF17FC4B3C694B189C35E516BE719CDA6542260D1301DF93A5D93EE118F7CB0AC94D0364C9EA66718A4BC7F3D7ACFFA60AFB7100F7D97E98DFFE167D1D8E46C912D41EA057362C13B078CB1D9C443C1A57AC18C4566F5F5388F47A40CA49CDAAF34BD4C9A597FFBF7AB20D7CE88DD76A639E09ADA323C588B08140E9350268C1FF76079093A05CCF5E1613A70E6E37CD257875049A767332E5F7420F319F9AC78F97C0C4FA40B1EEF8C8B48045C78F73584590FE41F9F274DEA838DE75DADE66D04E9D9308CB0A9948320D28D9CA8F1F51E39FF3DE20FD5A2A267D127C317ACD51FB779E597A8DC7359D920548B8BCAD761C6B8012304E12628A2652D12A8161E538C20D582BF567E9C2B46B4CFE2D2DA31120C6DF50DF45C80513AA9EEE9F2613A221AA1D23F861C7F26AAC7813B7ED7278EB420A5C44F2A5879A2F1F9F11E14602762E3389B152C014EA9DDC9DDDE9ED1D6F74E7526F690EF37E71D448342C012E032C00E480A699ADE617434C12DA0E69139D0D9036743B9E2B9134B5086FCB96B193330ACE8E4F77148AD0F532E72E1792795080B54D7172FB9AF1972D00AE24D0B3D86528675B3BC8C7B80598D855B95A77667AD0F671F00039C08CC99F5644BB006BA9356B9C02BC935212C43490C741B0845CD7B4247592374AEAA1B589E670AC62777293870963B5132DCC27088F5DA5B831FA570766FA81C2A07B88BBD45B81992EDFD2A7FE934219B1F648DD8A414FA03EAFCD39E72BDF7D4F6B9C1F31A0A67DF03F6709F2BE0E7D1B1690C92CE7B8C6B1054270D796B16D6E445D24CB11229CB0F92DD81190A37838951AD28BE2AEEE6C5F63DA60A911AE0A24B1D05EF2F814FB30AAE8CA3BD9F01D4FABE5B279142AF948B0E6BBCCF7560107C161C816A0D8E61DD908445079BAAFB78C14F68B8B2BB241FB03C237A4CB250911142D0B460ACC75E6B0F58BF28546A4779EA7342238826F636A510CC9CFFEE8BB0292A58A07694C05672B560B26158A8566D01D0EEA0773E81F3F84376B29CE375FC56A0689A7CA5CE94B91814B62CBB61EA2EFCA0CE6712A941D612B0F700C56B46D464C2AAAB3F64A89CAA8561A1DAB2869D79DA1720274D031946C4C7715FB9C243DC95CCA7AECFF55EBA4044467EB922E93F57E3E39B93876A03936DFFDD2AF48D055C6C188F2F229812EC94F3FBDF7D7DB62E4274DC91718710EEC2CE034AEF266207C5CCBA21552D6FB8DDBEE8E931067010594A9E0CB37250F67281C0A369965367424D454CDD05D3C8F35A15F76B4C8C3FEE42F4C9CAD68849837DED3BE58730B94AE3A5F9146F90E03B4C0836381B3F9CCB5DE6BD2455D241BE9132EB6D4937FF27663F4CADAA9CDA193919F4CB0D0F727F6C7B26E831C3AC8DECC234D79D1B3BD28305E3012A3733AD718FDAB7DD1A6400BC47F47D20F627D2449DBFF10E37A62299E22E408A28A806D403CBEE19AFF6FA9B1814B35B9573ADC86F829A08893CFAE4A0212293447D3086E21BBA28049F3ED383519917B169E8A1B7DD64CEFE0DA643A97950A205CBFF6BD9334180556E84199F0B60738715CD69AAD7C882430578F6FBA4579D908F863CA54D0B9862EEA6ABED31301D183CF465B1A256CBD597A629307A8A890F11C23DBFF895B932E9CD2F5F06A4183D6F2D61117126FCD2CE2B86BB44A9A5B402E3EEDBE4ED1DF11716E91A2302CB72D8F0DAE132E16311C80DCA041694AF1EF63F659959FCAA133D9E5668F94D0489311AF3BAD379DE17793BB3EE8A284529A72CDEC474B3A82D92C6CB21C63017F262E0D7DD47AA5C58F5E23F8A37F00D5438717F05BB974F18A5D3E1CA054EA053C30B34FBFAEE88BC0195F061AC32F5B71B2A8A3ED4B8BC4EDAB40A6396C052DCE72E10768526C00610E96DF38AA70938CF844CF445D8E2BF73C4F32A742812D8C1DB53AFC6B6C0A4BC67C3CF7579702312D6C89BF14E9585D2C624D07FEB4B5B57F8E4C5CFDA69A5E922CC1E9 + +count = 53 +seed = 7031BA806F4D8BC28529163B239E0EE836871C51D2D62B601B71D6F2B69B203C81440F8FFC09C3AAD94DB1D880160671 +mlen = 1782 +msg = 6103E5B22F934203B5CA87337095C9A19267AFB9695D309BEB8A557BB7CC90332C4A03E1D416D397B945B607268F545928104CFFD71B02864E010B666CFCB68B762FA5EC839B5AEFD0407419441B38E6D881BD5218DF73C675DF101BF2C53D90FF86D4A3C7DB19EC9CAC044E0467A36337AAEEC32217FAF86CBD7BC2B663421754CFF1200A8A66E18F812868BC8D1C8CA495E6462DA4B8B96D4167F040F04927A7C27AD35CF174D42684ED55AC80D14CBE4CC2570642DDEC4F44880D967E9AF77EE27D0D3DBAEC9067FB6FC957AC4A136C1D564E17F59AC4938D43FB9050D810989907125C47FCEA6C162C723E79F68339CD1B3BF596988BD6E215271385CD50616868C6BF40FDC34BD30E5A00773E2C039723F2AC3A3FA45F4CE870841762D7435BD6CCC5FD3D58FE059EE455A806FDE89155C84797FBB73691A1FC6921859E99066A3239E31F28D1A46100DB1917621D9E61473CF1E71F9850B584B459D5690941E676A7DD56796313ED9ABDBE03DC75AFC1430DBA27FE0F8DF48EF7C339F462AF1A6D30A5F8B480DFBBE860C4C0BC136393C8FA0875AF454273C3CFDBA7EEA44EEF1A4060136948CD98B9D2C19AEA4934F3455F31DD15BE6545134F17A195B6BC409159C0975E592A15E86CA4943CCACF4B46719A072DB8C629B67768F1956F8158F179A0B645320489DEE404C8D0C4E786CFF39B324053F102C118E7D51173CEC0FDD017F213B2B07AC6B2C7DEC04172DD5396A020EDFB74ED86FC31952D241A7C3D139DEF543D90976AA70599792E73CF73AD0BD4A359BF60DFB2CE96A784D8DE5E23A95E831CA6FFBA6B187BC5F29A7757185EC06AC882572EC6283A1875B54FE4F295E1970BF311DBABAF9F894D3364D68F529C4EF9030AB934BCB09459D5AAC61919946FD28DF1AC85876F979E8B8528E9BBE69F03DEEF136EEA6A8FC86F31BD64285C8C9F49ADF53A8BAA7867CE52E72DC4A63929DF3BA2662DC77D71F88D8AF42B8D67AD54884EE11F5A6B3B794F7D5610909B0B740937587CF475DA903159994A262B6F32A3D1723FDAAE65E636B71CB0EF0A744F359BF08AC8231ED2970CE8C451266F703DA3B57F85ACEED4C1C174C50D9C226F028E972AC124FAA6F60518699CB4C499220EA51A538F9EDE67D0E98E1BF8FB4B24B1D8EF50A28A93E20076F8FB812CDAB04871D331FF434BA66DD4577B18DC3F471B3E96A174B58A7AC2470EB8463A71FFCBA2D064470FD2D4E15F9491DB09DF3E3BA376A3DDCC437312BE5848DB3B9079F2AE046798473BB970D725E1D7C6FDF405AE387DD7CC1735A7FC27D1A476592A514B87C9017E1E5D37E338F37916F3C72C5F2AF75185B88694D4E8E0A93FBF20CE81A7A0C10D55737B6473FBD92BBB39FEBC6167336BEB9C235997796B9C0DC18C353E80305175BB412ACC29E647813D0003F727ED0577A7C14BCF67173DA569320E887BDC8F5AD27FD8864261E802A6753C6F9BAC844B5900ED0D4274C0E6EDE42367079188B10BED5999501164FA4C5A818ED6EE229C3E0E0F7804B19EAF5D1132BE1D7FC18BE834C842B21F8DDB11F8CFAAC10D2E124981ED698EE7CACA211C5624F09C62E1D451429048B55ED0F8A714BB77A0D4B40F0A446EDDFB27602B7BF894805C4AAD9252658F6B21A05DC0CF6A3ACDC227FA867A4E5B1DB63A14DE26A79AACF1900A7B7D867C15CFD1DAA712F2A1E2A6C7B31B121465539CD0164E3CCF79A978B543AE9602996448C6F68069D044FC958911EF40B0B9AFC78ED014D94571F6771EA5E2306A7CAC32C135FEC0BBF1DCA3CB0B57DAA239C01671718017C907048E0D19515CBF430D4B3B4FF4FC9A391D15A38B39C4E528FAC04EBD3DC69144C98AFA75102D21FF961BAD2E1F25562AF92554814405C4EC08DAE4A0CD28BE592C9C9BF997CC0FE31502DD541000D4640D59654D26CA2A17BA4CAB0518EE097C05B2984FFC56E8182368E216768E0D07E17FB64003E95194D04C6E00E08386084FEBB6CBC841E8F3FE2A069C45554BC502C27591CA3C1DC9E6B1694BA2C1BC0713C1CF738DB22FFEEB7443D72D5BDB975D192976A58AB33DB58F5DAE497A0B24011E15E3256FF124DD99AF6FC300D1FECDCEE18DD4FBF25E901125D4E80EFA8E2A211701B74FD992E63376996994E054CC00E7E1DE7DB8E7D2898A735EC4920DBEFAAEA66B456CF6A12324C5D56762313A627B3523AB1E2C1C82E4FBAB136AE4395FCF2672A58011D96BBDCF2A7478305756D66B30A4AC44E48B18A5964AA89F14187EA114084D52B4BA77755BA04C34777409BDB782B7B645E93B4DB284525E2F9C9C38D73B475DDE2251277A2E6C3183D5DEA78414E22CC8FB4B2C7EFA797CD4A87AC81D3242EC8D2C2EFD6BCFD69C39F14B0B365F3151A96F75454A3A1400C76A4390FE9F2E7A22A0CFA687A5BEF1C905D3A893B0DFD35BDA184F25E62FDDC2A52B6A67E76F550ABE4CC8D1D63CC8631E4CC315E46D3015C3B8636B92B8D07075D401C654FB4A +pk = 19634D7E5F18ACF5D9D648707B03C70075AE0AA195968ED134D3B0BC76A7EE042CD84CDD7C1F1ED2A39EF92205371948A6916DF52B2B4CB67D3F89648650ED0311 +sk = 19634D7E5F18ACF5D9D648707B03C70075AE0AA195968ED134D3B0BC76A7EE042CD84CDD7C1F1ED2A39EF92205371948A6916DF52B2B4CB67D3F89648650ED03112F761A5C488D7AF751FEBF536200EAC34204000000000000000000000000000034EE3C3CF68C639E1F227F02FABF277C3BF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A8CDC344F9088B53FCC7087B5EB86AD6FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000D4034F856ACA826F2D1ECB5426D2F9A4BA0C4CB5C3D8918E0221B22730ED0100F106401F9D7B4DCB3390B94AEFC45B93B9783C870BFFF483C59CC7448ABBF000F9BA82FF6CDC46870B9992335AD8DC1DFEE3B7DD51D06714FE3367D751AABB0008B04B23CF7DEA7CA28FB8FC072F955BC05F9266381D01F402A2F089DF91C500 +smlen = 1930 +sm = 22B10ACDA436E9F4D1A396489CB578CD1A1CC6C9CFCD54FEE564A0D9B355A601169305D520B4DA40A2395F1CF67D1E3C9BF750A0B54C66D2E6063DF8695FE4020300A6D2DF748F47F95698F551B814502C0EE58BF1252A87F787EABE0ED0CA8CA21B9FDEF58E4B0D1F6A9EC023B8F729A90729EF603A5FAE3AFD74F909B39B7EF60DAD2DDF6C4ACDBDBE194A51DB030FA70006116103E5B22F934203B5CA87337095C9A19267AFB9695D309BEB8A557BB7CC90332C4A03E1D416D397B945B607268F545928104CFFD71B02864E010B666CFCB68B762FA5EC839B5AEFD0407419441B38E6D881BD5218DF73C675DF101BF2C53D90FF86D4A3C7DB19EC9CAC044E0467A36337AAEEC32217FAF86CBD7BC2B663421754CFF1200A8A66E18F812868BC8D1C8CA495E6462DA4B8B96D4167F040F04927A7C27AD35CF174D42684ED55AC80D14CBE4CC2570642DDEC4F44880D967E9AF77EE27D0D3DBAEC9067FB6FC957AC4A136C1D564E17F59AC4938D43FB9050D810989907125C47FCEA6C162C723E79F68339CD1B3BF596988BD6E215271385CD50616868C6BF40FDC34BD30E5A00773E2C039723F2AC3A3FA45F4CE870841762D7435BD6CCC5FD3D58FE059EE455A806FDE89155C84797FBB73691A1FC6921859E99066A3239E31F28D1A46100DB1917621D9E61473CF1E71F9850B584B459D5690941E676A7DD56796313ED9ABDBE03DC75AFC1430DBA27FE0F8DF48EF7C339F462AF1A6D30A5F8B480DFBBE860C4C0BC136393C8FA0875AF454273C3CFDBA7EEA44EEF1A4060136948CD98B9D2C19AEA4934F3455F31DD15BE6545134F17A195B6BC409159C0975E592A15E86CA4943CCACF4B46719A072DB8C629B67768F1956F8158F179A0B645320489DEE404C8D0C4E786CFF39B324053F102C118E7D51173CEC0FDD017F213B2B07AC6B2C7DEC04172DD5396A020EDFB74ED86FC31952D241A7C3D139DEF543D90976AA70599792E73CF73AD0BD4A359BF60DFB2CE96A784D8DE5E23A95E831CA6FFBA6B187BC5F29A7757185EC06AC882572EC6283A1875B54FE4F295E1970BF311DBABAF9F894D3364D68F529C4EF9030AB934BCB09459D5AAC61919946FD28DF1AC85876F979E8B8528E9BBE69F03DEEF136EEA6A8FC86F31BD64285C8C9F49ADF53A8BAA7867CE52E72DC4A63929DF3BA2662DC77D71F88D8AF42B8D67AD54884EE11F5A6B3B794F7D5610909B0B740937587CF475DA903159994A262B6F32A3D1723FDAAE65E636B71CB0EF0A744F359BF08AC8231ED2970CE8C451266F703DA3B57F85ACEED4C1C174C50D9C226F028E972AC124FAA6F60518699CB4C499220EA51A538F9EDE67D0E98E1BF8FB4B24B1D8EF50A28A93E20076F8FB812CDAB04871D331FF434BA66DD4577B18DC3F471B3E96A174B58A7AC2470EB8463A71FFCBA2D064470FD2D4E15F9491DB09DF3E3BA376A3DDCC437312BE5848DB3B9079F2AE046798473BB970D725E1D7C6FDF405AE387DD7CC1735A7FC27D1A476592A514B87C9017E1E5D37E338F37916F3C72C5F2AF75185B88694D4E8E0A93FBF20CE81A7A0C10D55737B6473FBD92BBB39FEBC6167336BEB9C235997796B9C0DC18C353E80305175BB412ACC29E647813D0003F727ED0577A7C14BCF67173DA569320E887BDC8F5AD27FD8864261E802A6753C6F9BAC844B5900ED0D4274C0E6EDE42367079188B10BED5999501164FA4C5A818ED6EE229C3E0E0F7804B19EAF5D1132BE1D7FC18BE834C842B21F8DDB11F8CFAAC10D2E124981ED698EE7CACA211C5624F09C62E1D451429048B55ED0F8A714BB77A0D4B40F0A446EDDFB27602B7BF894805C4AAD9252658F6B21A05DC0CF6A3ACDC227FA867A4E5B1DB63A14DE26A79AACF1900A7B7D867C15CFD1DAA712F2A1E2A6C7B31B121465539CD0164E3CCF79A978B543AE9602996448C6F68069D044FC958911EF40B0B9AFC78ED014D94571F6771EA5E2306A7CAC32C135FEC0BBF1DCA3CB0B57DAA239C01671718017C907048E0D19515CBF430D4B3B4FF4FC9A391D15A38B39C4E528FAC04EBD3DC69144C98AFA75102D21FF961BAD2E1F25562AF92554814405C4EC08DAE4A0CD28BE592C9C9BF997CC0FE31502DD541000D4640D59654D26CA2A17BA4CAB0518EE097C05B2984FFC56E8182368E216768E0D07E17FB64003E95194D04C6E00E08386084FEBB6CBC841E8F3FE2A069C45554BC502C27591CA3C1DC9E6B1694BA2C1BC0713C1CF738DB22FFEEB7443D72D5BDB975D192976A58AB33DB58F5DAE497A0B24011E15E3256FF124DD99AF6FC300D1FECDCEE18DD4FBF25E901125D4E80EFA8E2A211701B74FD992E63376996994E054CC00E7E1DE7DB8E7D2898A735EC4920DBEFAAEA66B456CF6A12324C5D56762313A627B3523AB1E2C1C82E4FBAB136AE4395FCF2672A58011D96BBDCF2A7478305756D66B30A4AC44E48B18A5964AA89F14187EA114084D52B4BA77755BA04C34777409BDB782B7B645E93B4DB284525E2F9C9C38D73B475DDE2251277A2E6C3183D5DEA78414E22CC8FB4B2C7EFA797CD4A87AC81D3242EC8D2C2EFD6BCFD69C39F14B0B365F3151A96F75454A3A1400C76A4390FE9F2E7A22A0CFA687A5BEF1C905D3A893B0DFD35BDA184F25E62FDDC2A52B6A67E76F550ABE4CC8D1D63CC8631E4CC315E46D3015C3B8636B92B8D07075D401C654FB4A + +count = 54 +seed = C8671A5D752CC6DDF075C899797603A625C142485EAC3D57CAF14F2244D7F84D116B28F959912A758E519D588A6A07EB +mlen = 1815 +msg = 3EAC87B3D642CEAA3DC904AC3C4245CB2A260E4B74D0394D33D4B71024144180A727F80B092305F31B2526998EDF6F98E46933FDAF0E8709E98D54F13C2701C58BBE35292FD3334C5E03D345A9A2EA1E01B2C4573567FF1FF3BA7406A16F5A5805EDD760AC78A3AB8602E415F67C7CEA5B36421C79F83CBB14FA775448A832A4B28851CE215C11DCBAEE652CDD7342B6B1204727479E6208FB556CF08BF7EE230F32659E829CE4FBCE0955D01D36624BBAC18C1D25A3E187722F8F74C88B56E518CF0E78B3B0EAC56D8F13C4AFC4DA3613A41CCC2B0B0E2EBBFE5799E479F81335360D483596E9AE926751EC9B956555F271C2CCD85F0F6C1BBB2C326C29B5DDF6B5C4C11F8EED15C0143993FEB626543E92CE4D66C0BD28C79ED1ECB793A3091D6B9AB510B0D41AA42D70C2D8F26EA0B826C8C375E1DD89B3E2A48FE5D88A462DEAC33BAC35AA32EBC010AF7E47B77AD23653D747760914E0CA12864CD401787EFD96F30D82D8907DC68578067703DD19B2377DF319EB540E8AE78B2BE86BEE1C915FF3B2F4B25C0AC22CCF89BD85371961944D8A4E6D20E2D3E9DF3A07D3BF6986898786F0667545275FAC3EB0F069B457D8EBBE5F60125F94756DB04EA203451A0DE160CBCE2A34650D92F200448B097691A61361AC487FBC3C82B2BD7C1ACCA02031311971C3CF69BA459A0B640A702DB4467973713A6F2466560FFAC0592D64FF1D4A935220826EB559CFE0144EA4B8E54EAF67DDF91988DD4B3749C865008C0C1CF98BBF76D929B85C8C426C15FA56706984E0F2E90658FA3CC33EC9FC700976870C94035ECF9A0534B18D07F55923663835416E40235CC2550BD9822F0912CF101F86039830AD9102AA4A3B6777EDEC5EBE621082FCF81A1C6A528F0324EC9D39FA80B6E87D6366E7EDAA0E14337D6708F7C3D2FB1978F4F5CD594FD35B267F9CD09370D3366DCE286CCB9647A1944F8D8BE63E5EF8F6108CC5E9AFE9127DA84E1913439EC35A4E17F7782DF042DC2F7C5CAD8A659DB282E61763539B56C2AFA0F2B507D549EC8C9E76C7DB306380CD7B46C9699B6DB8BE06CCA15E8E83763137B06BFF02DE2738A46C61B70EDF4F394D54D0453DABF689FB6BA41616BC589CB9847224E74F919B6E03672EC6A52584FE81456D6E648DD6F0F9B068EB72241F067BF6B891A498A9A59356C735E10EFB37B3ECF47CC5620A35442DD81E25D2C6DB0E9E871301ADD193D628B30E3B4345751BC17E0B5B05AF758A653DE7BED3763303FFE1AF05E407F296C736CA6F4C348B25718C7A814BD0730AFFC057842AF3D9B9ADB12FCCD740ADD16218AA57E43835821A2BCD70F1027F3042D4A92F10D0A1FB8323E87869BFA8DA24DA75F8743FA3038C24FEDC0C987065421BF4B300BE3ED3F6D6D590968D3EE32A8F5E20EA6168756AA18BB78B6AA48C299C36D0E78B6F84CACAB5946C69179E461F4C2DD201D8032A29EC6C52942AC37D9C76AB4A401C9AFF96284E1E9E39BFF6D912CA33B6118067605EA65D7F611DD963F4F75F97346FFFD1DF84C79CCBA06804B3017775D8C0BF614FCF4D824709557937B22E1805A0A961ECF226F26E3706362BF6D8D1DD30BE7EEDA481A64961641DC57B9F0211F8EE43578E4C2B6507114DFFF3C3F884586BFD1278D117F7C6014FD5980CDF1E2FD1F34CCAD170842B9E819C22FAB9890AE265C3BB6946FCCFE218544D00A6BA5BEF5224EAE24002B6E83E0B35E98C2322BE2EB3D8234BE8B048C54E40782C9A24D7A8B461EC05F38A94AAEF3DA3B46D0D85B0D949CF1089408189FF97C56C7DEE50A004AEAD82C15C7C0D0965F3C65A9A715A65D29CD3614954EBD91EEB4E74F862FBC944C56F2EDEC4D344F92E8154708AD0F5575880503EF0F107A9A9DB99BAE82357C16578F3E6CBDF9B427DA88DC322D11C6AB2A6AE6F5179C94454E09DF5CAA6A519A4C1903C8F2925639E12AF793695F256BF0E55E0D45B73880358F09719ED89A4A1A07868BFBF16095A20035D5D4F99FDA19DDAE3E21CB98308F4508B5CEE706C27898F03A2BF14F29ACBF055E4AB0713A7B6FC1A7853EFD36E1290E69587FEC15D492A66B9A4FEA6E2BCDE61E02FE18E06F59A2F4E06F177B14CE4C1CF1A8D1F49C554A8A4C68B9937B4C230320C80753D4B071BAB2DEDA89C9181820336F1E766E447EA1C44E15CBB7C002C1813D2C1726DB0E4DE289466077DA9610E5F3AA313B1B01DD79A4056A8BBE9D843CE5B0439325FFDFE91FDADDEC6CB86D5CEBB68D8F9C0ED237A4648C412780ACFF48FD9CE817EA70D950DCB989EA6B11FD87EA4F30347A27488C5C15BE7FD6D1280FEA3A7C022F8D9881FAC93176DB2025B4C7914A51099893A791BF5BE851F325347484CA6ED51B2BA71548A6046EA7EC85B31A9967E7D119D2CA3A51C1E14D5A3EEF0D41BDD615DA01D45979007A1997DE281BC340C3203D5BC0075B1AA38873A9DBB9D18E6E26971E70B54E41E2C8C91D2E60FBF85435C1EBC4893C45A201B1D2391549F52A1CA3E0440ADFB746FBBF0D9933F9FA0220B3E04EBEBB29D2A9AC1 +pk = 0BB25C718555D4E23FA1C1647906958ECBCD788A3C8BE439943088B0E2381702A3BE95281AB245CD6A1FC11A0AE39DD0A39071774CE02A5C4AD6FB32CE7A46000B +sk = 0BB25C718555D4E23FA1C1647906958ECBCD788A3C8BE439943088B0E2381702A3BE95281AB245CD6A1FC11A0AE39DD0A39071774CE02A5C4AD6FB32CE7A46000BE9C38B42B85DE6B61235D59C01DCD423F9000000000000000000000000000000CCE09FF29DBB86978C544805F84512BDCDFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51EB8EA13FC2C456D7FCD5B1CA21828B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000419C9D46D16D2F640AAB089EEB6DA50C158E79BE4E35E7F40FC86847AB1AD0008B972496FB8B22259B1446766DB7C2A554BCA8B40DA6F39EBA3A87B8F2026000ED85C607589713E7E2BEE2D5049F4B62CFFCB346D3AEA565A48C70CF257E6A00044E2B52B300A0710E14951DA57997B4D4F6AD5DA64B4D164DDD820DFE6CB700 +smlen = 1963 +sm = 92215AB0AD0743F52B449D9A7EAC2DD5567E6A798EFFDA2F37EC67C70EA0020132EA2680A871D3815FE953436545655FB65FF9B7D6CFBD8D57BCB9C59E64440300042503897041436E19072AA6206D60D5184485BD8C296749BBC19886E204D2B9D0D98AC7C1673FA2C6821AAD17A769D81D24E8A331E51BCE117896BCDB5010E501525D5BB00330BC8CE6EFA4DAD1323D0011173EAC87B3D642CEAA3DC904AC3C4245CB2A260E4B74D0394D33D4B71024144180A727F80B092305F31B2526998EDF6F98E46933FDAF0E8709E98D54F13C2701C58BBE35292FD3334C5E03D345A9A2EA1E01B2C4573567FF1FF3BA7406A16F5A5805EDD760AC78A3AB8602E415F67C7CEA5B36421C79F83CBB14FA775448A832A4B28851CE215C11DCBAEE652CDD7342B6B1204727479E6208FB556CF08BF7EE230F32659E829CE4FBCE0955D01D36624BBAC18C1D25A3E187722F8F74C88B56E518CF0E78B3B0EAC56D8F13C4AFC4DA3613A41CCC2B0B0E2EBBFE5799E479F81335360D483596E9AE926751EC9B956555F271C2CCD85F0F6C1BBB2C326C29B5DDF6B5C4C11F8EED15C0143993FEB626543E92CE4D66C0BD28C79ED1ECB793A3091D6B9AB510B0D41AA42D70C2D8F26EA0B826C8C375E1DD89B3E2A48FE5D88A462DEAC33BAC35AA32EBC010AF7E47B77AD23653D747760914E0CA12864CD401787EFD96F30D82D8907DC68578067703DD19B2377DF319EB540E8AE78B2BE86BEE1C915FF3B2F4B25C0AC22CCF89BD85371961944D8A4E6D20E2D3E9DF3A07D3BF6986898786F0667545275FAC3EB0F069B457D8EBBE5F60125F94756DB04EA203451A0DE160CBCE2A34650D92F200448B097691A61361AC487FBC3C82B2BD7C1ACCA02031311971C3CF69BA459A0B640A702DB4467973713A6F2466560FFAC0592D64FF1D4A935220826EB559CFE0144EA4B8E54EAF67DDF91988DD4B3749C865008C0C1CF98BBF76D929B85C8C426C15FA56706984E0F2E90658FA3CC33EC9FC700976870C94035ECF9A0534B18D07F55923663835416E40235CC2550BD9822F0912CF101F86039830AD9102AA4A3B6777EDEC5EBE621082FCF81A1C6A528F0324EC9D39FA80B6E87D6366E7EDAA0E14337D6708F7C3D2FB1978F4F5CD594FD35B267F9CD09370D3366DCE286CCB9647A1944F8D8BE63E5EF8F6108CC5E9AFE9127DA84E1913439EC35A4E17F7782DF042DC2F7C5CAD8A659DB282E61763539B56C2AFA0F2B507D549EC8C9E76C7DB306380CD7B46C9699B6DB8BE06CCA15E8E83763137B06BFF02DE2738A46C61B70EDF4F394D54D0453DABF689FB6BA41616BC589CB9847224E74F919B6E03672EC6A52584FE81456D6E648DD6F0F9B068EB72241F067BF6B891A498A9A59356C735E10EFB37B3ECF47CC5620A35442DD81E25D2C6DB0E9E871301ADD193D628B30E3B4345751BC17E0B5B05AF758A653DE7BED3763303FFE1AF05E407F296C736CA6F4C348B25718C7A814BD0730AFFC057842AF3D9B9ADB12FCCD740ADD16218AA57E43835821A2BCD70F1027F3042D4A92F10D0A1FB8323E87869BFA8DA24DA75F8743FA3038C24FEDC0C987065421BF4B300BE3ED3F6D6D590968D3EE32A8F5E20EA6168756AA18BB78B6AA48C299C36D0E78B6F84CACAB5946C69179E461F4C2DD201D8032A29EC6C52942AC37D9C76AB4A401C9AFF96284E1E9E39BFF6D912CA33B6118067605EA65D7F611DD963F4F75F97346FFFD1DF84C79CCBA06804B3017775D8C0BF614FCF4D824709557937B22E1805A0A961ECF226F26E3706362BF6D8D1DD30BE7EEDA481A64961641DC57B9F0211F8EE43578E4C2B6507114DFFF3C3F884586BFD1278D117F7C6014FD5980CDF1E2FD1F34CCAD170842B9E819C22FAB9890AE265C3BB6946FCCFE218544D00A6BA5BEF5224EAE24002B6E83E0B35E98C2322BE2EB3D8234BE8B048C54E40782C9A24D7A8B461EC05F38A94AAEF3DA3B46D0D85B0D949CF1089408189FF97C56C7DEE50A004AEAD82C15C7C0D0965F3C65A9A715A65D29CD3614954EBD91EEB4E74F862FBC944C56F2EDEC4D344F92E8154708AD0F5575880503EF0F107A9A9DB99BAE82357C16578F3E6CBDF9B427DA88DC322D11C6AB2A6AE6F5179C94454E09DF5CAA6A519A4C1903C8F2925639E12AF793695F256BF0E55E0D45B73880358F09719ED89A4A1A07868BFBF16095A20035D5D4F99FDA19DDAE3E21CB98308F4508B5CEE706C27898F03A2BF14F29ACBF055E4AB0713A7B6FC1A7853EFD36E1290E69587FEC15D492A66B9A4FEA6E2BCDE61E02FE18E06F59A2F4E06F177B14CE4C1CF1A8D1F49C554A8A4C68B9937B4C230320C80753D4B071BAB2DEDA89C9181820336F1E766E447EA1C44E15CBB7C002C1813D2C1726DB0E4DE289466077DA9610E5F3AA313B1B01DD79A4056A8BBE9D843CE5B0439325FFDFE91FDADDEC6CB86D5CEBB68D8F9C0ED237A4648C412780ACFF48FD9CE817EA70D950DCB989EA6B11FD87EA4F30347A27488C5C15BE7FD6D1280FEA3A7C022F8D9881FAC93176DB2025B4C7914A51099893A791BF5BE851F325347484CA6ED51B2BA71548A6046EA7EC85B31A9967E7D119D2CA3A51C1E14D5A3EEF0D41BDD615DA01D45979007A1997DE281BC340C3203D5BC0075B1AA38873A9DBB9D18E6E26971E70B54E41E2C8C91D2E60FBF85435C1EBC4893C45A201B1D2391549F52A1CA3E0440ADFB746FBBF0D9933F9FA0220B3E04EBEBB29D2A9AC1 + +count = 55 +seed = D780D7688AF364949A196657A066BD48FFA8DC45B4885279B6DEF362E5957F398CDCE1D20FC3F8F63A275C325FCCE654 +mlen = 1848 +msg = BAA4A41E4B68FE333FFA5EE97FD3DE18F0EECE8EB83E46A8E3505E2EF8AEA2C4040BA3809A764B681EC7449F41A2463651A8CC6DEF0E4A058EB843EF016E5CBA8D55F925E66524BE55CB98FC3169082E52E0D6CC3600C4E8A560B6D448A72CCC95620101323F98B43E28D6357414185ECB0263C7BB94E7F86146661FC897844CF52873114D39123260893DEF13516F982783B927864B61B56D3A8E5B4705DA3A95F6D12A6637C9CED02F07B4AA0B08B4924103036C2A93B31C91EBB6C5B77DE090EBF60A04191EB6CE9CC9B550F5B0C9104B74D15358854181C0C5640FC74CAEE14FED6577FD75EECA14070B6D02A9A421247A5BB262D6E62B04649E75BBD3ED8E72752289FA7C1A68096DD96A4BAC8A2DC27C44881DD2416387D74A005680A3D229D562D3DAAF8DC37B4C87CC86A8C991E9327CDD43BA930CDD8D1E44AEFB084B51111965C5DFB0EE2F09112B070CBFC545119ABA823EB3F65F26BCC025B39F79BE42C0396C5FC9FC924EF1B7EE9DDB71B6E69B579C0A64C5B020206CD3515B8D5F4FF29378B9580D282F7E5ECEEB5CE9C09A7B334E62151100CD658DFFFA66F4091231BEA6C9DE8129EC4F5FBE8BE0FF4BC93367DC69D9E38C177B23AFBA5C27FEE3E2B73C0037DD7C419C854DF7C2412349BAB43869469E80527C3AD3A7103152F9E0B03353A596002FF54ABA8B14AC393EE52EB5564D63BC2738D571FA3C255ABD20102BB299441B00EB988F3A5CFB238EF8C49963B4AE8877E6B317E208821510BF446CE6B06C33717C91C460924248382159198F09D0F5A25C1611B2D39CC6D2ED149FDF0E09A0B0B2BB77067182E386F5F6A55B68808DAD98E5CEB0FDFAE6A0315845ACC7B9C172B0E82190A5EB7C58DE4F86D883292A883045C62D6A1B3C886C345AA6158276EFA6B93AB2188E47ABDD25D332146E980E1B1E043CF63EE35A5AA01AB6CC62F77699DCA16FA30E3632DC5CCD3253D01E547746C78021AC307F0EF1A0119AD11504803EDAD933150981C4D9FD181835C507651DC92A86737E3AFD0EB4DDEF6182872FBD31BFC6D8427C2F4D3A39BCBE6B5120B8CF2AF5DC59949C92D10B1C6A96810564DD335E0755F9DE25EC26C102355688C38250DF8F96E105136855C8DE4BDCD86DF03F92977DA16908CAEEB4056F4A5F751A57BA057AC0309F1C107E594CF3C31544E4F1D93FB9AE7E1A2451E7082CF0C850990EE71ADE0498F6A3852DC4FC128BFDB8ABDDA3D759C8D4F83FED8509CDE5EED38410FB9F0A5F30EA45C9270BA2395DF645AAEE03F56158685A0BA65DE3D2C5209A7EF4BDD4BBE0CDC966DD1BDF1FE0BE06C7115F7CCD80F8012E5D17955AE0C9E4220076882F30DC5E391295994B9F809C09DBED8CCDFC89669F40492944FF20948080A4ED66AD8166B613AB2F4414762AE493EA6661950E8E56B3758A77CDBCFBF24FBBBF20EACD5CBF8815899A1C3FD20B1D04920025885388012D9C58EA842DB9530B7ADA901AB9CE46A12700687BDE07FB99BF66D0C775218B8454C936F03558B899B59361A0C664081CE8A7858DDBC5E7C5480280411C9ACF4D1EC45035D97524E9E44F963532CA5067609540C1BCB5627F99D5C61CB9A6D400F0BA0A74E45DDAB5A4E8A765DCF2F3684E3A2661A78AC069FA38163AD9F9713EB45C841C6617697CF8A72C54B550DBE9C22B04D579B09AAB0EF4EE8B70CA563F81EF9700C07761C944926F9A76A8C3EEE1CF7E7524D65908C47C35B0453DC10DB5B75123A5B26B9612C0AE18816A71F34638798DFCA21F5073CE771500034F9A71FEB8B621356C430B4D47CB1B59AD4677B5C679188D8861BEAF52558165F691F65A692E8CB8D24ABB74B8885EDEBBE52FB13DAC16E3A8EBC4EF192FD10D71898E93547C7A09F8642AA3B4FAAE23E48BFA809C5989D3462AA50FD4E5C4095542C45E5600926C2DECB4D18BB43B7274239A8DFA3D9DE1BB9CA099DFE56DEDFC9E120867EFCDA10B48F7E630506AA606D76E4537036127FA05FFFB8B8703CDC8DE70A78D014872111A431F393345D74E8866D9A9A633923072E93DBF47C54C4B205C60E67D5155B76F51AB49ACC7435525605DD43A10C88A03E08E257C68937BF2984BE63D40F8A60589D909F8F09688A77DA15DC7B4853339F235B1BD60AA845B4DB6B699325885C49DF9C40781CC56FABEA6201E2F8A9352C28CE321B9441422807E9C81C8F1EC85D240C9F1C8ECC4FF06D6E3682DEA3E6CF92F2B74C2165AF247CE0F5AB84460693254B523498A57E7442977F51F1C2F649BDF756E7F43AE543F5D8E692820F8A06322667A7FA9C1A5B10199A69CCEA22C74E172FED43E550C68C337ECC5E6AAD9F7EB997A7E619D47DF73CB917A705C3CDE5FF344F6FBCFAECCE6B734E09A385FE54B224A880704D774581074C59EB0A3B42C59B8BA4518E764C5A532F6655DD839862AF716903A118433CE0809376A88E88FA847B4D1C63EE393267B15C1E42A91DC6107CDE990EC9ECC7C1066E9480E90A22907C51AF47DA837438A90CC07DE8121691BD73802D5D09D18A2D8B38A28948735110891D1B559A73445838F359A6FB90A3CAB887486CC9D95CBA35B55693C890830D2 +pk = A8AFED2341705FE05E3277EBD59A9C1754028724904796986B67805A3E159702E1F92EF5E6D0DD0A7AEE5CE46B676413F63224475D034ADBFA248F129CA1A9000B +sk = A8AFED2341705FE05E3277EBD59A9C1754028724904796986B67805A3E159702E1F92EF5E6D0DD0A7AEE5CE46B676413F63224475D034ADBFA248F129CA1A9000BD9F76D8C18C9CA73BB7320B78EAB5DE59E010000000000000000000000000000E2AFA135AD7623FF80DA2501BB064C42E9FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1B9E227B43142E1B518F590245C721489FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000B7602CA864595AA5B6E915E945A6795B4F736B80215A345D5A7C9AD2D1E0C3001A91C340C6DD2F0135C62223C10F6E157B3AD7B42BDEF936C70C920B52B03E00690277618F2A789C417270F0F23A94AF1A32D7FC5A94D3A2E16D08DA36860900BD355E9A563D22F3A4901B35F17949F066BB2582CA765E0FD10186B0BC217100 +smlen = 1996 +sm = 01C3E5B017E56839316688907085C5A79DF67425057B77A1239D8DC893D4D9048148E5FE3D8D3FF413B3157BB464D5FA47BD9C35E3621F5F0658BD261DBCFF02000093629FB44E4315B51978939D60C4CEAF8ABF992EDDA813B07080C73B6C2A84F20F57FF6BE40DA485A2AC432D13B52037676F0632A180E24F73B1697CD2A8CB1895E74D8E7C7033ACF617F2BDD460BB010B04BAA4A41E4B68FE333FFA5EE97FD3DE18F0EECE8EB83E46A8E3505E2EF8AEA2C4040BA3809A764B681EC7449F41A2463651A8CC6DEF0E4A058EB843EF016E5CBA8D55F925E66524BE55CB98FC3169082E52E0D6CC3600C4E8A560B6D448A72CCC95620101323F98B43E28D6357414185ECB0263C7BB94E7F86146661FC897844CF52873114D39123260893DEF13516F982783B927864B61B56D3A8E5B4705DA3A95F6D12A6637C9CED02F07B4AA0B08B4924103036C2A93B31C91EBB6C5B77DE090EBF60A04191EB6CE9CC9B550F5B0C9104B74D15358854181C0C5640FC74CAEE14FED6577FD75EECA14070B6D02A9A421247A5BB262D6E62B04649E75BBD3ED8E72752289FA7C1A68096DD96A4BAC8A2DC27C44881DD2416387D74A005680A3D229D562D3DAAF8DC37B4C87CC86A8C991E9327CDD43BA930CDD8D1E44AEFB084B51111965C5DFB0EE2F09112B070CBFC545119ABA823EB3F65F26BCC025B39F79BE42C0396C5FC9FC924EF1B7EE9DDB71B6E69B579C0A64C5B020206CD3515B8D5F4FF29378B9580D282F7E5ECEEB5CE9C09A7B334E62151100CD658DFFFA66F4091231BEA6C9DE8129EC4F5FBE8BE0FF4BC93367DC69D9E38C177B23AFBA5C27FEE3E2B73C0037DD7C419C854DF7C2412349BAB43869469E80527C3AD3A7103152F9E0B03353A596002FF54ABA8B14AC393EE52EB5564D63BC2738D571FA3C255ABD20102BB299441B00EB988F3A5CFB238EF8C49963B4AE8877E6B317E208821510BF446CE6B06C33717C91C460924248382159198F09D0F5A25C1611B2D39CC6D2ED149FDF0E09A0B0B2BB77067182E386F5F6A55B68808DAD98E5CEB0FDFAE6A0315845ACC7B9C172B0E82190A5EB7C58DE4F86D883292A883045C62D6A1B3C886C345AA6158276EFA6B93AB2188E47ABDD25D332146E980E1B1E043CF63EE35A5AA01AB6CC62F77699DCA16FA30E3632DC5CCD3253D01E547746C78021AC307F0EF1A0119AD11504803EDAD933150981C4D9FD181835C507651DC92A86737E3AFD0EB4DDEF6182872FBD31BFC6D8427C2F4D3A39BCBE6B5120B8CF2AF5DC59949C92D10B1C6A96810564DD335E0755F9DE25EC26C102355688C38250DF8F96E105136855C8DE4BDCD86DF03F92977DA16908CAEEB4056F4A5F751A57BA057AC0309F1C107E594CF3C31544E4F1D93FB9AE7E1A2451E7082CF0C850990EE71ADE0498F6A3852DC4FC128BFDB8ABDDA3D759C8D4F83FED8509CDE5EED38410FB9F0A5F30EA45C9270BA2395DF645AAEE03F56158685A0BA65DE3D2C5209A7EF4BDD4BBE0CDC966DD1BDF1FE0BE06C7115F7CCD80F8012E5D17955AE0C9E4220076882F30DC5E391295994B9F809C09DBED8CCDFC89669F40492944FF20948080A4ED66AD8166B613AB2F4414762AE493EA6661950E8E56B3758A77CDBCFBF24FBBBF20EACD5CBF8815899A1C3FD20B1D04920025885388012D9C58EA842DB9530B7ADA901AB9CE46A12700687BDE07FB99BF66D0C775218B8454C936F03558B899B59361A0C664081CE8A7858DDBC5E7C5480280411C9ACF4D1EC45035D97524E9E44F963532CA5067609540C1BCB5627F99D5C61CB9A6D400F0BA0A74E45DDAB5A4E8A765DCF2F3684E3A2661A78AC069FA38163AD9F9713EB45C841C6617697CF8A72C54B550DBE9C22B04D579B09AAB0EF4EE8B70CA563F81EF9700C07761C944926F9A76A8C3EEE1CF7E7524D65908C47C35B0453DC10DB5B75123A5B26B9612C0AE18816A71F34638798DFCA21F5073CE771500034F9A71FEB8B621356C430B4D47CB1B59AD4677B5C679188D8861BEAF52558165F691F65A692E8CB8D24ABB74B8885EDEBBE52FB13DAC16E3A8EBC4EF192FD10D71898E93547C7A09F8642AA3B4FAAE23E48BFA809C5989D3462AA50FD4E5C4095542C45E5600926C2DECB4D18BB43B7274239A8DFA3D9DE1BB9CA099DFE56DEDFC9E120867EFCDA10B48F7E630506AA606D76E4537036127FA05FFFB8B8703CDC8DE70A78D014872111A431F393345D74E8866D9A9A633923072E93DBF47C54C4B205C60E67D5155B76F51AB49ACC7435525605DD43A10C88A03E08E257C68937BF2984BE63D40F8A60589D909F8F09688A77DA15DC7B4853339F235B1BD60AA845B4DB6B699325885C49DF9C40781CC56FABEA6201E2F8A9352C28CE321B9441422807E9C81C8F1EC85D240C9F1C8ECC4FF06D6E3682DEA3E6CF92F2B74C2165AF247CE0F5AB84460693254B523498A57E7442977F51F1C2F649BDF756E7F43AE543F5D8E692820F8A06322667A7FA9C1A5B10199A69CCEA22C74E172FED43E550C68C337ECC5E6AAD9F7EB997A7E619D47DF73CB917A705C3CDE5FF344F6FBCFAECCE6B734E09A385FE54B224A880704D774581074C59EB0A3B42C59B8BA4518E764C5A532F6655DD839862AF716903A118433CE0809376A88E88FA847B4D1C63EE393267B15C1E42A91DC6107CDE990EC9ECC7C1066E9480E90A22907C51AF47DA837438A90CC07DE8121691BD73802D5D09D18A2D8B38A28948735110891D1B559A73445838F359A6FB90A3CAB887486CC9D95CBA35B55693C890830D2 + +count = 56 +seed = 36AB8588F5233D15674677535A682382C29968FF824031AF646F58FCAF0E83C1C486B1E75479149FD6F4D9E8397CAF73 +mlen = 1881 +msg = 0707EA05515798829F42A4CBDDB4A95C5750879E0A584AB503F778015F83BEBF6D63C3B48A4F478EF01091403DDC5A9662E39707DBC8502ACF50F3E06ED0199CC647EA155FEEF503BE045BEA4035C07C4CCEDA306B8187185BD06C14220F2B7401229969C1CFF8C36D499D5A725FA1CE7B44D71E6C0E4E750766183883D838DAE4F00B140E0AFCCB0E72F935018A6314232DC632C5AD3C26919D1A7925BF0F665CA0223439518143486CE92650DD145FDB2E97E0D5BC9D6806F442FE90C9C1F52992E670DB2603AD885FA42B3D8BEA4E470B7F76A367AAA506E931890B6E4607F59E87A7A5FBF3991EEAEE47CFBBFE3CBE028E67BB645D37A7BE5E7CBA6D7955CD62D1D8DB0D9772EA0185C25BC1AD40A09D3E7E9CABA72BDC3A6EF3C40C7ED6208854157914A80B5C66A6DEC2317FB5A529421C03CCA6FC0A3B3D51556E8DEE7C1EBFBA924FE2EBCE8A46BE96E761AA6749C0A9A2B2FC49B42CA47663EA3395DF22DE20947DB14FC1FAD03805955D67F8473BAEFE2C1E22BDCC7BB988DB0DDE4E83E26A16F10B93BD9CFDBA77B9302EDBA0C9AFBA7369A023EF763C55484F7425F842111CAE27E07A511A725F25D422D933F2EC201BFFE3291411AC3CD6E91018C95074C18FC780A73945B148154987854CFA1CF1199BCD03519C8F34774453DF90B71FEA6734DEA7191EE2A5735F7A191F527642D53C844B087E9346B07EDD0B78C36F83445825E60A13C424F72530E05F75DA8D33957FAFF004DEB549985790956A0E7D9B256298D56BC6206F1E4E1E958FE298641A277A2C8B6B9B7660DBF689AD7E1A19CBD965CBEAA4A0D30741586290576996AE668ECBAB4F06F2A1D542E32C5D3F042E7E29A41BF86BAE29E7029D997876CFB23B10986A45CA029739B2446A29C55561AEE8FFB187961E6E7401D726AF6D8A5C816B2CEAA9A1C9B780DDCC4F0E4003542B193AE26EC687F8C51451D2D5387D9C3B9EB95981DF2DE069FE741CD5C15F6D1B12C5B9B94230ABA33BF46DCE8AC7E26896EDCB4F87272C32D19E72C313738855C02C6F46F1162BE0A3ED2E76704B16169689BF532EAD7AE7F2B26F4D9B22712662BEEA1F46748FA4C27D1D825D3FE493B5B3B513617C81D21A0912D329C5A4E3A90EF5A29A4E3137D1CE3EEE99C42D034E61593A4076EF124BD6BCF8FC911FC9F6077D82C2980C2ADB955939441BC9E81BDF9D6996CE578114C01F9BA096D6EA40F4E0FBB18B3E3D25E7F6D6CB670AD26F604368ACB6190667B7B7ED3C1A1DA04E42AE0087852834B91AA072AD51C0193E5299481221BC9083118F7B5503559F1E2D9E22A8D57932CD0B59509E7D7F459E20EBF4C1D0DF71472340E64992C0485D593714D6B469547616DFEAFC95089689931E79944204A6D0A47A565DC325F3BE19FD44BB6CD4BF2B1D4A78C883154D70705E121B833A4A7E7E80FCDCA03F52C1F831AB0D989AC5DBB5CD83BABCB3EE74B69681818DC05E33234775123F552CFC7C7BB0B98C937957A2C4E86E3D775468A7CB8D33756ED7489D04DBE52EAA2737EFBC4C4D0F55B5A841E1453763E611BAC358FAD0B5778C6015D97CC42CA9FECC66CF844DFE55587C200DA5250B3A419791F57D3A4F672551BE885DFE2AA8637D6C890EE8E1063E782FD7E2CB356BF47B6EB93A155D8D64C9F6CCA3971C5A7FACC3C052A2AA9FB286750F76933261AFF5CE408BDA8382AF8535145F432F78B3B25A768B5DA2A211D1D07AB557CABC7A139F66EDBB744AA76E0FBF22092E31C92CAFC624EE1DC6732F27E8E7632C6EEE2D1F5C85B52D712C884B36C91DA383F0DE9E06E5EF63D7B7A692E5E91BA1A1D9298E26694FAAD9EF262F117DF8115E2E877197A8069A96210CE65D45E6AA7011654ACFAFDA810CCCC20C1985D54483DAE12B29D7ECF66376968B52FBD727CBAE7C9E3DBFEE7391D985228ACA9EB8EF98FAE32BD24552A6B34BAA581DBB03676A3A4546E10EFCEF269B18E1172F560FA0F0344149543551E079C1745BC0425B5233B7D7DC32F751D321638EDB1CEE56DF0359EB6D9863CF3E341A56060C8EF8486014F956C39B751AE239A493A017B2FA5210D374BA83DF5D799B7CD92987FEBB0B2CDB3EE42A61381304C5EAE2ADD4777011C3279BBCD1EDD6F91FF72B3C353AC35DA8FA843DC5561D3CDB507730E8BEF20CF09B0DDC36D47F4C10D82652DC2937D889F83B1DDC30E52B244250D19EEA9CF7A3B5D931E2E25B64A0A81B2C4FE933A17BEAC2E10FD888D07F994E4F2583D204DA126533F5E36B62486A00CCC317C4381A8FE11D36C43E71BE108E22A98F53729F05A5E0AA38D512423DB4BC1D6BFAE9117383ACF94AE2A737F6B8070858BEAF08E365CA84925F8BEBAEEF5AF77EB73A9D3648AAA6493CEBDDB95149F0DAFACF129FC321E558084A44CCA4B429D664D90DD90F2A04818B48D135952746CECA76F99B947A33A3BF7C535B187C1971AF4FCB1EAC841BE7E96F429DD38127B52FACC2DD6512D8D019E0080CADBF7078FC67E9AF170A2A00F70F407B0A7FF469E2F6EA165F8B43EEF1779A115089DE9ABE6B78C93E4B8E3B018686D16CE8EBC88CBC1D571372A3996C9E5967C035F9DA6E200E7ECFD1CF7158563F36A3AAC3CD8ACF52A4EEE29DCEB03FA3272A671CFC9B +pk = 67C708892517C17D227B18A56AFE39B5E7AEE2B07D1ABB231BF4A09191B883012DC8BB83A7B3FEFF7E6D3F323640406FFABD2005F5A48C5E4EA02C633B6BEE000B +sk = 67C708892517C17D227B18A56AFE39B5E7AEE2B07D1ABB231BF4A09191B883012DC8BB83A7B3FEFF7E6D3F323640406FFABD2005F5A48C5E4EA02C633B6BEE000B37570FEB8C8D66E4434DA2E811E71CC77901000000000000000000000000000060133FF5431CDFB0C770329DA01D4FCE60FDFFFFFFFFFFFFFFFFFFFFFFFFFFFF234AF6A89AE17D2EC149790B30FFBF7E44FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000AD336D52869C589F41B511551E2BB1B5F9AEF2B80F87716BC1A72FC6D4C5CC00C51C4FBAA6BA09D2496188576492B537D60B0EBB8E61668173FEF7AD67B6A200A396C37AEB1C67C7D62C33872859A347A466FCFA63A804518E827EC891842D00F089C60E584A2224C73D73ED1C8035BC05D4A1AE4386A54E8B96B60ED4D17900 +smlen = 2029 +sm = 760998F57BC7F8DFF468D6A00CC12D24B84FF0A3F906D7D6C786C241D4D02B026A47EF025088E5AE515D2415ABF972E87E7FACEE1EC450EC9AA0DC57C0ABEB03000070D089307F4B52A0621A791D3F6E23C23B3D403DA93AB18AC1EECCF98390DFC559C070C04AD2CEF0F28F4D080C7E4521F56811DF5B5A8D30A5119ED89E102A879FF19AD18B1129B82BCF1B903F938D020B020707EA05515798829F42A4CBDDB4A95C5750879E0A584AB503F778015F83BEBF6D63C3B48A4F478EF01091403DDC5A9662E39707DBC8502ACF50F3E06ED0199CC647EA155FEEF503BE045BEA4035C07C4CCEDA306B8187185BD06C14220F2B7401229969C1CFF8C36D499D5A725FA1CE7B44D71E6C0E4E750766183883D838DAE4F00B140E0AFCCB0E72F935018A6314232DC632C5AD3C26919D1A7925BF0F665CA0223439518143486CE92650DD145FDB2E97E0D5BC9D6806F442FE90C9C1F52992E670DB2603AD885FA42B3D8BEA4E470B7F76A367AAA506E931890B6E4607F59E87A7A5FBF3991EEAEE47CFBBFE3CBE028E67BB645D37A7BE5E7CBA6D7955CD62D1D8DB0D9772EA0185C25BC1AD40A09D3E7E9CABA72BDC3A6EF3C40C7ED6208854157914A80B5C66A6DEC2317FB5A529421C03CCA6FC0A3B3D51556E8DEE7C1EBFBA924FE2EBCE8A46BE96E761AA6749C0A9A2B2FC49B42CA47663EA3395DF22DE20947DB14FC1FAD03805955D67F8473BAEFE2C1E22BDCC7BB988DB0DDE4E83E26A16F10B93BD9CFDBA77B9302EDBA0C9AFBA7369A023EF763C55484F7425F842111CAE27E07A511A725F25D422D933F2EC201BFFE3291411AC3CD6E91018C95074C18FC780A73945B148154987854CFA1CF1199BCD03519C8F34774453DF90B71FEA6734DEA7191EE2A5735F7A191F527642D53C844B087E9346B07EDD0B78C36F83445825E60A13C424F72530E05F75DA8D33957FAFF004DEB549985790956A0E7D9B256298D56BC6206F1E4E1E958FE298641A277A2C8B6B9B7660DBF689AD7E1A19CBD965CBEAA4A0D30741586290576996AE668ECBAB4F06F2A1D542E32C5D3F042E7E29A41BF86BAE29E7029D997876CFB23B10986A45CA029739B2446A29C55561AEE8FFB187961E6E7401D726AF6D8A5C816B2CEAA9A1C9B780DDCC4F0E4003542B193AE26EC687F8C51451D2D5387D9C3B9EB95981DF2DE069FE741CD5C15F6D1B12C5B9B94230ABA33BF46DCE8AC7E26896EDCB4F87272C32D19E72C313738855C02C6F46F1162BE0A3ED2E76704B16169689BF532EAD7AE7F2B26F4D9B22712662BEEA1F46748FA4C27D1D825D3FE493B5B3B513617C81D21A0912D329C5A4E3A90EF5A29A4E3137D1CE3EEE99C42D034E61593A4076EF124BD6BCF8FC911FC9F6077D82C2980C2ADB955939441BC9E81BDF9D6996CE578114C01F9BA096D6EA40F4E0FBB18B3E3D25E7F6D6CB670AD26F604368ACB6190667B7B7ED3C1A1DA04E42AE0087852834B91AA072AD51C0193E5299481221BC9083118F7B5503559F1E2D9E22A8D57932CD0B59509E7D7F459E20EBF4C1D0DF71472340E64992C0485D593714D6B469547616DFEAFC95089689931E79944204A6D0A47A565DC325F3BE19FD44BB6CD4BF2B1D4A78C883154D70705E121B833A4A7E7E80FCDCA03F52C1F831AB0D989AC5DBB5CD83BABCB3EE74B69681818DC05E33234775123F552CFC7C7BB0B98C937957A2C4E86E3D775468A7CB8D33756ED7489D04DBE52EAA2737EFBC4C4D0F55B5A841E1453763E611BAC358FAD0B5778C6015D97CC42CA9FECC66CF844DFE55587C200DA5250B3A419791F57D3A4F672551BE885DFE2AA8637D6C890EE8E1063E782FD7E2CB356BF47B6EB93A155D8D64C9F6CCA3971C5A7FACC3C052A2AA9FB286750F76933261AFF5CE408BDA8382AF8535145F432F78B3B25A768B5DA2A211D1D07AB557CABC7A139F66EDBB744AA76E0FBF22092E31C92CAFC624EE1DC6732F27E8E7632C6EEE2D1F5C85B52D712C884B36C91DA383F0DE9E06E5EF63D7B7A692E5E91BA1A1D9298E26694FAAD9EF262F117DF8115E2E877197A8069A96210CE65D45E6AA7011654ACFAFDA810CCCC20C1985D54483DAE12B29D7ECF66376968B52FBD727CBAE7C9E3DBFEE7391D985228ACA9EB8EF98FAE32BD24552A6B34BAA581DBB03676A3A4546E10EFCEF269B18E1172F560FA0F0344149543551E079C1745BC0425B5233B7D7DC32F751D321638EDB1CEE56DF0359EB6D9863CF3E341A56060C8EF8486014F956C39B751AE239A493A017B2FA5210D374BA83DF5D799B7CD92987FEBB0B2CDB3EE42A61381304C5EAE2ADD4777011C3279BBCD1EDD6F91FF72B3C353AC35DA8FA843DC5561D3CDB507730E8BEF20CF09B0DDC36D47F4C10D82652DC2937D889F83B1DDC30E52B244250D19EEA9CF7A3B5D931E2E25B64A0A81B2C4FE933A17BEAC2E10FD888D07F994E4F2583D204DA126533F5E36B62486A00CCC317C4381A8FE11D36C43E71BE108E22A98F53729F05A5E0AA38D512423DB4BC1D6BFAE9117383ACF94AE2A737F6B8070858BEAF08E365CA84925F8BEBAEEF5AF77EB73A9D3648AAA6493CEBDDB95149F0DAFACF129FC321E558084A44CCA4B429D664D90DD90F2A04818B48D135952746CECA76F99B947A33A3BF7C535B187C1971AF4FCB1EAC841BE7E96F429DD38127B52FACC2DD6512D8D019E0080CADBF7078FC67E9AF170A2A00F70F407B0A7FF469E2F6EA165F8B43EEF1779A115089DE9ABE6B78C93E4B8E3B018686D16CE8EBC88CBC1D571372A3996C9E5967C035F9DA6E200E7ECFD1CF7158563F36A3AAC3CD8ACF52A4EEE29DCEB03FA3272A671CFC9B + +count = 57 +seed = 4E94DD734A371A7C6AD4A567038CF93BAACE2B9D30F3862198DC55D2F21F8FDC9A7AE5DCA1541712179E3AB1FFA3F792 +mlen = 1914 +msg = F3EA695264936D537D86E545E132131442C2973D19B37F8C911E3ECEF4A13A8B1EDF5E5968A6198D26205FFE6B76CB14E353B5E2C9DE1BD44AB9BD55862BA1A479833335725EF52601810C778DA4A32C497CCFA43F91C72A1499E8D295AE7CDB43F1CA05F0D4A31B30D9A69CAB8288640F3F9E081E2C98CC8351C7EB9954D428DA4BB374B346A83EFF5AA3F455F2BB3FC922F901BBE5695E3AB9892A93BEEF90FC150B3BB47F6965C229F7DCC3100A4101840417A0E2547F9D42AB27216254A2898368BFC60E7D407271C213233B6913C8E48DF10967757BFAF5B5E2A284B8F67C70537C97583786B5185B45E2E36BD8B5443E98601F772829176C4D66F44A81AAE7C13F539490640BFC40B83E1C75305B06BE60E18A0AB568859435B715E15BA1EE4DE73E04E1B09DD15350AE423C131706F057255E9FA8FA3F9E3ADE7435A6451F7A2AAD0C0FE0F444C4A247DCBAA49E7C926DD52A33D3737B4439C1D40F861720E37BD25366EB5F34BF4B552160F3EB80CA8FB19304E1E4143090F8E965DAEFF17551A3931905B5CD991C6BC5AF5BE808073893A47FBFEEC0940EF5E7D2F2EE199847E1A4BEA447BEC40F86F6FDAEBECE6FF0F66E04193355C9576DD4AAB2D796CFEE5D432B1D32E13B8903A06FFD3AECB00C169A3AF8389848CEC724F647C6BA8DC3134CA18586DB3E4138601A16DF8873A490F23C4D27FD9C3D4FABF2BDCBA4AF3F0793E7B591198100EC97602D9BA572409EA49D7C8EDC646335FD4494577720EA7CDF3B4266FC201DE4BC204C0D35CFB55010BFAC68CA0DF3AC936C9FD2A9C532B8E3461D25362EFA37DA159B64670060CAB833ECA799FCF1342C7EE1B80BDE05ABAD08B9EE8908D50CD0D433DDA0B120D1980F690ACAD9C072502AB537EF71B691917A76D3098C27FDC6FAD1F1B29E307E17C87D9FA6A06CF8CEF6568D9E4E005FEEFCB5F41A46D91E31B41268367D636C4478921E690D5D57E99DA3448773D51B673109CFD3A58CC50C127F34F4963FCED6C216E60EA0952317FBFE88807BFF4223624F6126104CB46C8D39EE228BB4FC0002287E346E5ACE43E2CAEC07A22203FE3C4AA9008A94F7075F6E449FB89905BB955FA0023608C494F7B73D2AA4E2B0A8A7E3CAA889B6B6A6640F7222EF969D46FF6794BD97C5363921461BACDA17F2781E14419436E37610E52E3B7B7BF9C1A4B1D80876030F9A8981DAA4F06A432DBA739DB988BED5DE7F38378EC1F7D8A46B305896CA0CAA5D8AD74002863C6FF91EF25AE96450936509EFA93F94718E895A82B4616A965AF004038E0897A6563DBC91EB5A6172ADBA052250D06D210BCF5A250246FC3482E57FCD9901104C5AD58EEFFAC2860A4DA9D2C308552EFBDA2D4275F3F3651E9935A0E42869B9263FC7EA71079E604A4EC6DC61CEF6AC6CC06194DEF432C1F7CD9EDFB0C4B448DAE3C2A685BC818B2A90E17A4C1CAAA5FC2632F720E764E2B8DA314224498119A0D94CF5DCE24176421C2736575672B361119EC7C766265768CD9FF1957A17779C11244C1CC82D72D4E3C87107885F71C56DA2BC41008B0BC1375C12B3B2A80071EC03E377A93BFB227BD560EDD5E5D88F46F7FF9831F05BF262F01F62278D3DC13F4F0CECA0509091C25D20666D8D3527975CA3495F6843B46B5D5B6F5C650E981DEFB3943963E14F00A0F78CE785A21634C46B531B4F2AC5AD0F03D92372C334CE963E514A1891716EB5D5BB1B67834994EDA492719032E2A4F961DDD6D2002D8F52798C45A9DA8145BFD191E97D1FBA1B395858B0FC7D5F5A54E69FB3780635F70A763E44075075580778676E6B9705B40F40210E597B5AA1AA77BCC3BE5005159A4B68CBDC6AD8674495E0DF65A6DECABAFB993CC49C082D358DB1E5B3A8AF2FCB0049A15BF521986AD84148135CDB185FDDCA6802C2ADE9EA2E82047725D73F51E072CCD799D696D7530F61B16E9B4727C58CB0F552B188F9B451BE543BD809B63D66BCDBAEB7AA917BE6AEF05DF559B3AEAF65D5EA12E852D1370EFD6197F970F52292F27923A10D01AEB652A9A44573C137257B49D130F1DA48E532B3E33D4854B995534380B4549511B39A99145AF5ABE0CCD3A9DBAF673EFC115CB75A9A5A806679907BB525A2BD4507977329EB4C985B3575DE6533FC5D62358C21AF3DBDD20DEEFD7C417C77D37DC2A098A8FA48F7944B7EC6F929387BA11E3516C9EA681238650416FFB97EA343D5F227BADFDD509B94C1451C54F85E4539A8F70DBB5EFBB10B2D82A16FD0C997C603B8983CEB840A7C3B61918D8A97766BB8442C3B9EF2D324E28DC19748417D32F642874A8927688C74BF4F6F6724015C4DD50EB83B85F613FA20938F5C895F88830A40C9799C212B2DFB453BA0BC534F75CEDAF7A016F6744CB4F5269FBF0284EB90CF1023918078024C3B125CD9C7501224050B4D20B585472B42A0F494513ED131BCD8F75E223317F56B37CA48780750DE0BC81C74A3388C94D93A65719122E9D533274811B76965265D7B2F91EBE3C5924ED2D4DD5E327A6E7546AA2605E4C78D0208DB7A7F678CAADFB32E6BCF8C77FC7810F7D1D5D50E26D1A0DA03B8AFCF99904B2B3198670462451925381F0BC404C51F2F18FA7E2C1E8B0C6CF97A9A65E575373996C3E9DA15A18D15C93548377677DD713C9828DC4E4EE823A241377C65A2948BD29447BFBE +pk = 415024923F072A85684FCC9820D5345B3B7A98311B2399481B72CABAE19A5A04A039A30931150EFB86BBB025F1627245878BD41A76B6627A6C76CFD9B417D00102 +sk = 415024923F072A85684FCC9820D5345B3B7A98311B2399481B72CABAE19A5A04A039A30931150EFB86BBB025F1627245878BD41A76B6627A6C76CFD9B417D0010299840BD9715EE39C433C4CF373E005E941000000000000000000000000000000621311A96C706CC3A553D77B3ACDCD6AD8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC97A9CBD8F9F9362439CBC993727AF69A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000A22B861440F43747CA7743D9A26A988B57C8EF3E5DF9B6F8686A7BE908CDC0002399A43C60BD9AB102CB9617FDAE0691F31FBB0D5555183D439F1ADA7AFC4E004F89B839C0522751F6C470C88CF9DC7E260668317BCBDEFD9683C1EC92ACC9002FFC065D1859886C9FFC9156E7D1C91B9BA7F60F9C52C7658407551F69098100 +smlen = 2062 +sm = 84A3BFED74DCC6B16A95575C667E77267DFC0ABA609E75CDCC3D30CA794E8C012AA561230A7DC37D21BE93B4D7628D2A669B335073F1DA5884E11F33FF81510103009867C551A0866FA334D3B1A6601E7414A7A4F1FBFB0D054C2246AF350F8FC81F7FECD951C41E0441060D979FFB772402430EEB1EC31995E2776C59AC9B2BF20785474F83882578E07DFE19B860F537030611F3EA695264936D537D86E545E132131442C2973D19B37F8C911E3ECEF4A13A8B1EDF5E5968A6198D26205FFE6B76CB14E353B5E2C9DE1BD44AB9BD55862BA1A479833335725EF52601810C778DA4A32C497CCFA43F91C72A1499E8D295AE7CDB43F1CA05F0D4A31B30D9A69CAB8288640F3F9E081E2C98CC8351C7EB9954D428DA4BB374B346A83EFF5AA3F455F2BB3FC922F901BBE5695E3AB9892A93BEEF90FC150B3BB47F6965C229F7DCC3100A4101840417A0E2547F9D42AB27216254A2898368BFC60E7D407271C213233B6913C8E48DF10967757BFAF5B5E2A284B8F67C70537C97583786B5185B45E2E36BD8B5443E98601F772829176C4D66F44A81AAE7C13F539490640BFC40B83E1C75305B06BE60E18A0AB568859435B715E15BA1EE4DE73E04E1B09DD15350AE423C131706F057255E9FA8FA3F9E3ADE7435A6451F7A2AAD0C0FE0F444C4A247DCBAA49E7C926DD52A33D3737B4439C1D40F861720E37BD25366EB5F34BF4B552160F3EB80CA8FB19304E1E4143090F8E965DAEFF17551A3931905B5CD991C6BC5AF5BE808073893A47FBFEEC0940EF5E7D2F2EE199847E1A4BEA447BEC40F86F6FDAEBECE6FF0F66E04193355C9576DD4AAB2D796CFEE5D432B1D32E13B8903A06FFD3AECB00C169A3AF8389848CEC724F647C6BA8DC3134CA18586DB3E4138601A16DF8873A490F23C4D27FD9C3D4FABF2BDCBA4AF3F0793E7B591198100EC97602D9BA572409EA49D7C8EDC646335FD4494577720EA7CDF3B4266FC201DE4BC204C0D35CFB55010BFAC68CA0DF3AC936C9FD2A9C532B8E3461D25362EFA37DA159B64670060CAB833ECA799FCF1342C7EE1B80BDE05ABAD08B9EE8908D50CD0D433DDA0B120D1980F690ACAD9C072502AB537EF71B691917A76D3098C27FDC6FAD1F1B29E307E17C87D9FA6A06CF8CEF6568D9E4E005FEEFCB5F41A46D91E31B41268367D636C4478921E690D5D57E99DA3448773D51B673109CFD3A58CC50C127F34F4963FCED6C216E60EA0952317FBFE88807BFF4223624F6126104CB46C8D39EE228BB4FC0002287E346E5ACE43E2CAEC07A22203FE3C4AA9008A94F7075F6E449FB89905BB955FA0023608C494F7B73D2AA4E2B0A8A7E3CAA889B6B6A6640F7222EF969D46FF6794BD97C5363921461BACDA17F2781E14419436E37610E52E3B7B7BF9C1A4B1D80876030F9A8981DAA4F06A432DBA739DB988BED5DE7F38378EC1F7D8A46B305896CA0CAA5D8AD74002863C6FF91EF25AE96450936509EFA93F94718E895A82B4616A965AF004038E0897A6563DBC91EB5A6172ADBA052250D06D210BCF5A250246FC3482E57FCD9901104C5AD58EEFFAC2860A4DA9D2C308552EFBDA2D4275F3F3651E9935A0E42869B9263FC7EA71079E604A4EC6DC61CEF6AC6CC06194DEF432C1F7CD9EDFB0C4B448DAE3C2A685BC818B2A90E17A4C1CAAA5FC2632F720E764E2B8DA314224498119A0D94CF5DCE24176421C2736575672B361119EC7C766265768CD9FF1957A17779C11244C1CC82D72D4E3C87107885F71C56DA2BC41008B0BC1375C12B3B2A80071EC03E377A93BFB227BD560EDD5E5D88F46F7FF9831F05BF262F01F62278D3DC13F4F0CECA0509091C25D20666D8D3527975CA3495F6843B46B5D5B6F5C650E981DEFB3943963E14F00A0F78CE785A21634C46B531B4F2AC5AD0F03D92372C334CE963E514A1891716EB5D5BB1B67834994EDA492719032E2A4F961DDD6D2002D8F52798C45A9DA8145BFD191E97D1FBA1B395858B0FC7D5F5A54E69FB3780635F70A763E44075075580778676E6B9705B40F40210E597B5AA1AA77BCC3BE5005159A4B68CBDC6AD8674495E0DF65A6DECABAFB993CC49C082D358DB1E5B3A8AF2FCB0049A15BF521986AD84148135CDB185FDDCA6802C2ADE9EA2E82047725D73F51E072CCD799D696D7530F61B16E9B4727C58CB0F552B188F9B451BE543BD809B63D66BCDBAEB7AA917BE6AEF05DF559B3AEAF65D5EA12E852D1370EFD6197F970F52292F27923A10D01AEB652A9A44573C137257B49D130F1DA48E532B3E33D4854B995534380B4549511B39A99145AF5ABE0CCD3A9DBAF673EFC115CB75A9A5A806679907BB525A2BD4507977329EB4C985B3575DE6533FC5D62358C21AF3DBDD20DEEFD7C417C77D37DC2A098A8FA48F7944B7EC6F929387BA11E3516C9EA681238650416FFB97EA343D5F227BADFDD509B94C1451C54F85E4539A8F70DBB5EFBB10B2D82A16FD0C997C603B8983CEB840A7C3B61918D8A97766BB8442C3B9EF2D324E28DC19748417D32F642874A8927688C74BF4F6F6724015C4DD50EB83B85F613FA20938F5C895F88830A40C9799C212B2DFB453BA0BC534F75CEDAF7A016F6744CB4F5269FBF0284EB90CF1023918078024C3B125CD9C7501224050B4D20B585472B42A0F494513ED131BCD8F75E223317F56B37CA48780750DE0BC81C74A3388C94D93A65719122E9D533274811B76965265D7B2F91EBE3C5924ED2D4DD5E327A6E7546AA2605E4C78D0208DB7A7F678CAADFB32E6BCF8C77FC7810F7D1D5D50E26D1A0DA03B8AFCF99904B2B3198670462451925381F0BC404C51F2F18FA7E2C1E8B0C6CF97A9A65E575373996C3E9DA15A18D15C93548377677DD713C9828DC4E4EE823A241377C65A2948BD29447BFBE + +count = 58 +seed = D9281003AC5F7673E0E9A7BC29C4ED75E6B0F228DF49D11A2599BFF2DA9E887163BB26DBA4F071FBCE02891540EC6F1C +mlen = 1947 +msg = 437E0F77BD0E14D704BE86135119F39A0A65650C762852E2694AD9BF2EA45C7EE59DF915F5AAC128309847E944127294566FFB193D0361DD7111D32B06DBA60A12E053F424DDD70674E902E409BC6F5891CB9A76108322CDEC1491D3D89A74CEDD855BB0791DD6DA371A75AE979593B5159FBE9DDACF88506E6A184547E2A7395A46FBAAAF286EB7780B789FED86F257E5036A3555E777B909243695CE89957DF492C80050457AFD84AAD9F8918099AB00FD7AD3528A3D0AFE5B52300053575B839572D4D7CE43C255BBF5F16948D40BCC2E63714487AFD3638601ADF47A324482ECC99FB88574538809227F8C0A5FA7F20A0B2FEFDA38E6A665550E44B8D5630290A4815621A5DD74A2108CA946241C48661EB087240788808BF676B145442B2DE4C35E1A6B8CB1E97E54CB729202D8827A0D4994C6D7F3F406ED273B00B6590006AF069D69173B5EA8237B87705F362288AC3A50BBE7E70EB15DF6ED820D66290F57A87E51B2C5777C9C95C2A76ECF2E296A7C295BFE029BBE681B32A6D9F16D11C7CA2750E2F8877AF5DDB616D8A820DE998B0B2AF5B0C2C5641F498C99971932327EC2C73C0EF4058D9F33683F60553AD2962370AFC6725743C86E591D7D7C20944479DACA5E92D66A33CA0C862DC60DFEB5EC3C6E7DE356F6E43F06B1431358285398F8885176D60CBA218217DC7AFE4AD876D0890648052A56812BC3F8A9E6C49F9D70B0A032924B891A9410BBE2F214C842BBF0511EF9017744A0DBDBD500A4189B471930E25216D2588CF8BA39AAE7623966CC62D6C4ECC8B00B0613D912E60ADF613C8F55B778EFB93A513A776C64E8DC943E6272C0EAB4004B4B05CE9BCE9CE2F2B86FD8429E9A72CB16EC3DED285339EDFCD122150F4E7310F669B1DD4CD7E76D282D10314E8ABF61D53BF343F3EBF9968E1BE8F3785581F675BFC28C893729CF67345D0F7C11D6E7D6DA0BFF255BF706C986704A3B9C6FA0602C6DC108A59CCA70F624B08E4F5393E597459BEA4AAAA463A3B08DE147E10DE6B75A0D87BB79BA9A71E7F5999C8972BA992228B60912AA2D7A32703BA8BC02F774430A2B590911D48D3866396F1D71F19CA90EBD5277743A984E2156CB57DE88EBE91BCC09CCB5C687CBCD4E48E4EE110F4075A21F9A051700B0C2698FCD6A5A73372CA366A230A9ABD153E4DCAB7A33A8226F8458C5892098BC0A95619880156548F300C40BDEF81E8C1D8BD03031C690B7C3C000CE99675ADB4B94752EA22BC9E0278D0A53A2A19363A9388BB8D6C24A45B5DEDD8F7482E9C29603FF182F25856FBEEE2B41B88B352F99DB5F33D8EAB1A1A1FEDE60EA6CFB7478DB7540D3A286E88117503C4D0A2C13D32AFE3F1A31D1AF9EE60EAB8FE06248CFFFC7BB438B77D94B5644805CC276F19268DD1FFEFBAB3C796923288638DA1C15E014723A84F8C2DD9F55F7ADC2ADC13FA7CDC29BAF48CA438C882DA5F7CAA792B7CD984BB11EC4B681B332EDFD4AB4C132B08BFB688F81BAA3FEC5A079E2182C282A3EBE2AD5E4C59090BBB989E6A07D85D604F5FFDE0587ADD29A5175CE65D29FB9FDE3E8B49EDA1D88EE8DD64FA1498D33EBAF4A847EE9FEDD3376AF46C1552A150014C11DDFC5047929E2415D3F9D81186A685A1CAF2F004DE777760F0567E880866320A7B42E61CC994719DDC81E28525E50195FFE4E0467D9A9182B75EF57DFEE926D7744485A55E07D1BCD1C9B9B12A60460BFF016E9834848665F132E2FF87805E00154C7D9853DBCA43D005BB197EEDA3D2D9249A621EFC4177415BB103893C82EEB0AEEA056B40E98B5FE65527432FF33CE3E09FE1288A6E2641011721279253800ABC4B73F65B15B434BD34A573E77A94729A78C92F0E791570A416A0876DB39A8FDA8696FB12E7FA3BB11E7838054E4195164B9676DD03327810CCFF9586217AA3D50E7D3EBDB1AE1BF6889DF316047CBB278CE8C9741798452A38E48A7138E1FBA286B497FDB8B1E7BF6145C5F29ECF6D5430F8E550314DB3CF48F27897F312C6D9D6357A880B721E5148DA7F789238CE411F952695F4A878756BDE311BB4E62F10C2F9939B8530EF70D3FB431655AECA2AD36BB5DF0582A07F53F1DF8E0325E635D5A5E795C130106502A081F2FC52A9D97C5DAAF174F13D2DE1EA0F8860F08F4FD5B571E1AB1E84437F3C82BF19B96E46513C316BDCF994BC26FB8461F90594E08E6D4A032C1DA38481A1AD7BFB7D5270255BFF23CE035535CF478216E6D2E62E147AD93357D62636B1AE42C4E8433BB94CA91D0F8EC265F2793514543AA86B786D9760BE5C77AAD5A8449A7DBE92391EAAFC305C1267A68E6ACF0F044FC144D82C917992748B9232DEC4E33EC97534F2BF60B56EDBFF675F0343C9C78E8A8D0529A78E2EED9F998B360360352009F01905C1A4815A36B111CAD8E5B34688B99216171D4F57283CD669DC05995BB8D94ECBD3E7B662C4A603BD85251F2BA35FB6CA492C2B3E996FE66A1EB904CCD61B0900E7DEDCF136F50E4C3AD5FC312A2DE4B3E51F355D01763692C0722C700A544E681A316A1D261FAD727E557398E500F15DF33883ABE9D1BA645936891F5A91FF6C8A7B9B6FE5062718542DF4FC4BA50D7F513945482381ADC42D5A9D444CA211232615306D7241FC49F08912BACBAFBB056C018AD4D6021D99FD720ED6548A5A29DAEFDCE868D71A1BA72D9F998A3F89FCFE526493582C4C8AF5C1BE065EA29F6155428DBC955B745DF +pk = 0CA1DF78430B293C99F66DE4CC373C14E66DCF17E9EEB964E22D0E2374A2B60470646B711FFBF20858D1AF19299EBFA2ADBB66FF1E5CE4563F754FCC9BCC2A0302 +sk = 0CA1DF78430B293C99F66DE4CC373C14E66DCF17E9EEB964E22D0E2374A2B60470646B711FFBF20858D1AF19299EBFA2ADBB66FF1E5CE4563F754FCC9BCC2A0302E9D67BB6C5141C28D92B40ED533F08C9CB00000000000000000000000000000056C33568AEAC55D1DAED182078E1E84481FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF814354B0916646A0BB1BEEEF9264B6C3B0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000041F8857455881E2005560CB9949ADF5B6A84ECA66CC7D8BED7755720771A60002FE42BD7FB80BB80D4448975209FE604EE5FED1877AC646312FD5B7062D03E009EE2C23E90764F0541A41E144801E6FC3BE22E656D9DF0C4AF1DE38130443F00415C76CAF8EF95B48D8DFFC9D634E61BFF0907C4F1C338E1590B7A5DC1483B00 +smlen = 2095 +sm = 2DCB809D8C2E4174219A4CC36F032A0B4179223016842C13FD30165254D96300937EEA3E1473B8AF4D49ACEF5B0F4E2328992A4602A292979664CD411543540300021EE0CAA49FCF7A913F440ED6FD31382B9BEDE865648210058977D61E43AD7A2EF24EE82D1DF612C9EC171B2CAAF91710D736FF36503A2A0C912BFE6B357C4B6FF58882004414AD1931BC9135C25ADC020B04437E0F77BD0E14D704BE86135119F39A0A65650C762852E2694AD9BF2EA45C7EE59DF915F5AAC128309847E944127294566FFB193D0361DD7111D32B06DBA60A12E053F424DDD70674E902E409BC6F5891CB9A76108322CDEC1491D3D89A74CEDD855BB0791DD6DA371A75AE979593B5159FBE9DDACF88506E6A184547E2A7395A46FBAAAF286EB7780B789FED86F257E5036A3555E777B909243695CE89957DF492C80050457AFD84AAD9F8918099AB00FD7AD3528A3D0AFE5B52300053575B839572D4D7CE43C255BBF5F16948D40BCC2E63714487AFD3638601ADF47A324482ECC99FB88574538809227F8C0A5FA7F20A0B2FEFDA38E6A665550E44B8D5630290A4815621A5DD74A2108CA946241C48661EB087240788808BF676B145442B2DE4C35E1A6B8CB1E97E54CB729202D8827A0D4994C6D7F3F406ED273B00B6590006AF069D69173B5EA8237B87705F362288AC3A50BBE7E70EB15DF6ED820D66290F57A87E51B2C5777C9C95C2A76ECF2E296A7C295BFE029BBE681B32A6D9F16D11C7CA2750E2F8877AF5DDB616D8A820DE998B0B2AF5B0C2C5641F498C99971932327EC2C73C0EF4058D9F33683F60553AD2962370AFC6725743C86E591D7D7C20944479DACA5E92D66A33CA0C862DC60DFEB5EC3C6E7DE356F6E43F06B1431358285398F8885176D60CBA218217DC7AFE4AD876D0890648052A56812BC3F8A9E6C49F9D70B0A032924B891A9410BBE2F214C842BBF0511EF9017744A0DBDBD500A4189B471930E25216D2588CF8BA39AAE7623966CC62D6C4ECC8B00B0613D912E60ADF613C8F55B778EFB93A513A776C64E8DC943E6272C0EAB4004B4B05CE9BCE9CE2F2B86FD8429E9A72CB16EC3DED285339EDFCD122150F4E7310F669B1DD4CD7E76D282D10314E8ABF61D53BF343F3EBF9968E1BE8F3785581F675BFC28C893729CF67345D0F7C11D6E7D6DA0BFF255BF706C986704A3B9C6FA0602C6DC108A59CCA70F624B08E4F5393E597459BEA4AAAA463A3B08DE147E10DE6B75A0D87BB79BA9A71E7F5999C8972BA992228B60912AA2D7A32703BA8BC02F774430A2B590911D48D3866396F1D71F19CA90EBD5277743A984E2156CB57DE88EBE91BCC09CCB5C687CBCD4E48E4EE110F4075A21F9A051700B0C2698FCD6A5A73372CA366A230A9ABD153E4DCAB7A33A8226F8458C5892098BC0A95619880156548F300C40BDEF81E8C1D8BD03031C690B7C3C000CE99675ADB4B94752EA22BC9E0278D0A53A2A19363A9388BB8D6C24A45B5DEDD8F7482E9C29603FF182F25856FBEEE2B41B88B352F99DB5F33D8EAB1A1A1FEDE60EA6CFB7478DB7540D3A286E88117503C4D0A2C13D32AFE3F1A31D1AF9EE60EAB8FE06248CFFFC7BB438B77D94B5644805CC276F19268DD1FFEFBAB3C796923288638DA1C15E014723A84F8C2DD9F55F7ADC2ADC13FA7CDC29BAF48CA438C882DA5F7CAA792B7CD984BB11EC4B681B332EDFD4AB4C132B08BFB688F81BAA3FEC5A079E2182C282A3EBE2AD5E4C59090BBB989E6A07D85D604F5FFDE0587ADD29A5175CE65D29FB9FDE3E8B49EDA1D88EE8DD64FA1498D33EBAF4A847EE9FEDD3376AF46C1552A150014C11DDFC5047929E2415D3F9D81186A685A1CAF2F004DE777760F0567E880866320A7B42E61CC994719DDC81E28525E50195FFE4E0467D9A9182B75EF57DFEE926D7744485A55E07D1BCD1C9B9B12A60460BFF016E9834848665F132E2FF87805E00154C7D9853DBCA43D005BB197EEDA3D2D9249A621EFC4177415BB103893C82EEB0AEEA056B40E98B5FE65527432FF33CE3E09FE1288A6E2641011721279253800ABC4B73F65B15B434BD34A573E77A94729A78C92F0E791570A416A0876DB39A8FDA8696FB12E7FA3BB11E7838054E4195164B9676DD03327810CCFF9586217AA3D50E7D3EBDB1AE1BF6889DF316047CBB278CE8C9741798452A38E48A7138E1FBA286B497FDB8B1E7BF6145C5F29ECF6D5430F8E550314DB3CF48F27897F312C6D9D6357A880B721E5148DA7F789238CE411F952695F4A878756BDE311BB4E62F10C2F9939B8530EF70D3FB431655AECA2AD36BB5DF0582A07F53F1DF8E0325E635D5A5E795C130106502A081F2FC52A9D97C5DAAF174F13D2DE1EA0F8860F08F4FD5B571E1AB1E84437F3C82BF19B96E46513C316BDCF994BC26FB8461F90594E08E6D4A032C1DA38481A1AD7BFB7D5270255BFF23CE035535CF478216E6D2E62E147AD93357D62636B1AE42C4E8433BB94CA91D0F8EC265F2793514543AA86B786D9760BE5C77AAD5A8449A7DBE92391EAAFC305C1267A68E6ACF0F044FC144D82C917992748B9232DEC4E33EC97534F2BF60B56EDBFF675F0343C9C78E8A8D0529A78E2EED9F998B360360352009F01905C1A4815A36B111CAD8E5B34688B99216171D4F57283CD669DC05995BB8D94ECBD3E7B662C4A603BD85251F2BA35FB6CA492C2B3E996FE66A1EB904CCD61B0900E7DEDCF136F50E4C3AD5FC312A2DE4B3E51F355D01763692C0722C700A544E681A316A1D261FAD727E557398E500F15DF33883ABE9D1BA645936891F5A91FF6C8A7B9B6FE5062718542DF4FC4BA50D7F513945482381ADC42D5A9D444CA211232615306D7241FC49F08912BACBAFBB056C018AD4D6021D99FD720ED6548A5A29DAEFDCE868D71A1BA72D9F998A3F89FCFE526493582C4C8AF5C1BE065EA29F6155428DBC955B745DF + +count = 59 +seed = 750A74866BE8DF4E60BC14BF36E6D83ABF6DCBB86792D125CF0980007C5435F40F87BA96498A88252D9C5C6710807652 +mlen = 1980 +msg = E4E3EDCD70C4BBED033F402CEEDC2C265DCA10B2DE0DB00D454C3AE1A0D00C97E1DC8C6804B1777ED21DDF5145B9F9348A931C128A8FB03827F653C37CD95859868DDE356ACE682F627FB69FCD97757BBE8BD5A260A293D2ACF0BFA2C0A3548FE25A2BA1A21F95123D592B40C20A927FDB615E69878E8D7C98D261DC01958A088599D3F9BB5E14002192FC7DE417B1074B3F7B52CD2A699091FD9DC3C5929E51CC0259D2255CAF0E444EC11257B759978BD4A7C8E2CE8473325B7498681102DE6FFE9764334D862E379D9F2EBF9B312FA75D7A50E08B94BD43EEF78722D423928FB8E26FDA85A345EEED0326A5D694E4729154A9997B269407B7D03818025EEB2BA96580626DFDB3BFBFCE100C508170D8150E4980D5D386761F4E8311339B47852ACC2A0A01DAD90D3978DE6536547D4F203CEFFAA652E4F2F28639BC3FF83C485C28EDC0BBE21D17B8ECAF3794D64C36FFE7F07E8A906CAB8E7FC9067CA4BF9B074C7FB01EF99A05D7C0F35D889A63AFE5FF18023BF77F8A3DA0C3CECEA0E538A6DAB5C54F3A0D83151595AD3EC4C45132EC2F22F652EA5DD930E692A7C0D7C23DE84314CAA7C017AD50D430FEF42DE557073DDBA6CAA4A787C92E6E28368943CAD0974EDAEB7ADDF991CCE20BF51C5A898CF0A2104ABB810BD4937D23E5D43490A3194B8A109B745E0A365EFA59199B43835682E996794F16C5CB874C88D9697B189AC54A1BA1F459623C1563CBA7689EBB32DC4FA0BF30E064D119D40C36301A653A4F959C97873003CFF7E8E030A137BAFE0A60AD08E4F692DC107E68AB40EDD0C384875B8525AA0A5EC3ACEAFE557EC76DB5283672F9751AFE1166D53542D216186A3DEF4DFA94E57BFFBEBD6F4AFEC3C0F3F40F651A1251A9AB39C262D42313E9F22879645589EA54FE894AC005115A43DD806B2C8BE6222DD9F02189D4221A9DDE99ECB8C3EF4171776268C12ADC37E4CA92EEF09D2D1803DB1FE917521662BA7EC0C07292C7E2130ECA4EEFFE53EE0CEAAAFF6F4CCFD42186611AFEE79BC651B1ADBAD08458592D69FBEEC708C7537925658BABBE7E9867915C6A728EAF41B0AF2EFFE55207C01652891C373F7A14409D05FE9E26C2E72D688047DE9A0954516B85ED6A3230B6B0EA9C5F086720C26EFBF8B7F5C5D14651D54C4EA181A707C562239CFC08B2E09A2941D04D587B90134D8F670F734578534138CD9CB7EC04437A768FE65FC5B3FBE818DB423A2208E485669082B422AB1257C2529CBF7BA4CB30FA27B7F702418C2EF9C3BF7CDE53661DF716449C6337C54542EADC5209A0E030AD6577DEEACC6BE1813DB24BEC035CEE6AEE93749D524222535A0277600F8E4F4BEB473093C5A00B6666CB319DFF131AE4F004EEB1BF71E5D274E3DFBFA246DADA9D6F548907091045FCCF79B363E695AD54C2F791861CE04874EE8C3375612DE820CEDE04E4472BC3DC19ABBB91C42A1C3D7B467837570E7D20A2CA6405DECCFF1AEC03E0558076E988619CB0CDA9CC87A12367BD486B676A4F71D40B88AB4E7FA750350DADD1A8F12B70864792D3CC1804BE8B7CB9DDA532182C32582015C1788B43054B7010229F46BD39000440E7F5D22E4D52EED85B204B344680426AEF51F0CE0551FEB9672DBF391A9AD363ED090837CAC1E721878E65AF9BA92A0EE7C7979925FBA9F4E452EB4FE3AF03B9EFF0526FF0A331AC0B8CD27A0C49E5019B7025C3C9870C900A7FB31FF834E04B87DB77C4D6DAE4C3FEE741E923704EE5F294D8F881833E9137158D1EE0FBFCB4637ACB814A2A5346607BBCD6BC916235F7875334F2B75A7EA7B8B8DDCDF46C0B8007C9B3A014EC6E634D4173CAFB1DD09CB9ED4A123151F4F2631D4BEE1520C10C15AFEB17198009C2B254C1FF0BECAFBF69BE8C7DBBFC7E8F3F1EF05FF6A7945FF79ED6C317609B9238670DEA26D56D481F87CA171CCFD726CC0728C965D9BC38D376D707E6979908B19FDF7E74ECD2D0671EC338FD54AD6CC5F789E96018521882588F888D7D715104D65954DBA8907C0B7CE3F2ACB802ED49DDF1416C29E8D685C5AD879464819E1D53FDAC741F71E31AC0C17B6C8932A4A00E7164CF8BBFEC36EBBD30392145B292D355FB304A88A638F991F6F89A398B09F1DE4F0B29866029BEE75A12D724A52736F2B9F49937F0E51B0F2E1BD2C1BC9325BBD1061E0F7685ACA02DA735D8FC39646E0B2453BB9690ED1C4853A757EA9DC2F4EB4B5ADBCFCBFB0CD2587F61A24B77CA0D6CFCFF47A98C7098B986D4FBD0E46EF0D1F9DF842F4473C43912AB49F4117C8214A42F3083936C7E8A38B294BA081296A393DCAADDCD0D340AC62511E47DA6591836553EEDB466DA6285359EE831A952E6C7AE3B943636124E43224D527B7D394511CF31C50EC1D3E7A20E49850905D504F1AAE477830E3BDA50430EBD47FDBB0BF537D8D479CB799B0429C3F6591328299A09F45CF9C6D30D5C1C9203B9521D807875D7FB2C2CFAA688414497122161B1B4F159B66C0834E111DA4F82D5252367FD2DBFDC079333FC51AB0D34ECEBBE786F984852A596BE620EC6CF84ED596425B90316A13B39E5EBFA19B319BF0FD1D6C812F29970FB1FFE948BC0D2E057B1DEA15445D71B5F728C72DD0C69E277C58F031F90932994AC5A177926DCC1C570AC1B4B099ED66ABF7DDE5A5D77D08EF1AD7C6FFE018F56EFB07C737F33038846247EEEE147E4A5995BDC3352B73F15FCE5140410AAE3F0AF1764E5AD996D01608C5E6C6C96A20274EA7781B41FC532B01B52134FEE28F501EFD9CF +pk = 3B6736139B5DE5BC9D5CD589413D8A66C950996D6121DA753F28911FE83021035D3291E36C2ECC2D6D3853AF31C17DD7738401D79905B0149EFAAA68EC1C0D020B +sk = 3B6736139B5DE5BC9D5CD589413D8A66C950996D6121DA753F28911FE83021035D3291E36C2ECC2D6D3853AF31C17DD7738401D79905B0149EFAAA68EC1C0D020BFBE9B9223662951D18A38BACA20860632C0200000000000000000000000000001E8A6E4A83F383F342FC8C4D5F0C587658FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFED2D9E6389AD23F8C1CC5453418826F923FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000005F92BE610282355F630C356DFE6F20676D138181A888E6105E4F5A58012292004BCDA02FA5E000503D32A3783ADF1316C8622E9D6EC733866CACA3FFBA9A3D00126DF24EF50BBC8CE735BFAD6837241422E6E896A39F39DE659813BA3B795400F9F4D89C40991372A742A5740B625DA4D57D486EC7B8FF3424E27D3BBDF7B700 +smlen = 2128 +sm = 6055BFA164BA7C13E0E02ABA4CA6CB9D7D9097E7CC58F13019AC2C6AF79EB504EA4A29FAF9E193F7A2D70D1731C00F238CD789E28E700C46E6385091A720B1030001E507BB0ADE7E12FC5F1EB00616141512D6D48A47E90797CC0431D119EDCA97707E4215A10E1799C220CF9E7908D840745A301A90F577FE21A55A4DCFF223F5DFFE05A3ADBAFF9376CD4FEC768706E0030402E4E3EDCD70C4BBED033F402CEEDC2C265DCA10B2DE0DB00D454C3AE1A0D00C97E1DC8C6804B1777ED21DDF5145B9F9348A931C128A8FB03827F653C37CD95859868DDE356ACE682F627FB69FCD97757BBE8BD5A260A293D2ACF0BFA2C0A3548FE25A2BA1A21F95123D592B40C20A927FDB615E69878E8D7C98D261DC01958A088599D3F9BB5E14002192FC7DE417B1074B3F7B52CD2A699091FD9DC3C5929E51CC0259D2255CAF0E444EC11257B759978BD4A7C8E2CE8473325B7498681102DE6FFE9764334D862E379D9F2EBF9B312FA75D7A50E08B94BD43EEF78722D423928FB8E26FDA85A345EEED0326A5D694E4729154A9997B269407B7D03818025EEB2BA96580626DFDB3BFBFCE100C508170D8150E4980D5D386761F4E8311339B47852ACC2A0A01DAD90D3978DE6536547D4F203CEFFAA652E4F2F28639BC3FF83C485C28EDC0BBE21D17B8ECAF3794D64C36FFE7F07E8A906CAB8E7FC9067CA4BF9B074C7FB01EF99A05D7C0F35D889A63AFE5FF18023BF77F8A3DA0C3CECEA0E538A6DAB5C54F3A0D83151595AD3EC4C45132EC2F22F652EA5DD930E692A7C0D7C23DE84314CAA7C017AD50D430FEF42DE557073DDBA6CAA4A787C92E6E28368943CAD0974EDAEB7ADDF991CCE20BF51C5A898CF0A2104ABB810BD4937D23E5D43490A3194B8A109B745E0A365EFA59199B43835682E996794F16C5CB874C88D9697B189AC54A1BA1F459623C1563CBA7689EBB32DC4FA0BF30E064D119D40C36301A653A4F959C97873003CFF7E8E030A137BAFE0A60AD08E4F692DC107E68AB40EDD0C384875B8525AA0A5EC3ACEAFE557EC76DB5283672F9751AFE1166D53542D216186A3DEF4DFA94E57BFFBEBD6F4AFEC3C0F3F40F651A1251A9AB39C262D42313E9F22879645589EA54FE894AC005115A43DD806B2C8BE6222DD9F02189D4221A9DDE99ECB8C3EF4171776268C12ADC37E4CA92EEF09D2D1803DB1FE917521662BA7EC0C07292C7E2130ECA4EEFFE53EE0CEAAAFF6F4CCFD42186611AFEE79BC651B1ADBAD08458592D69FBEEC708C7537925658BABBE7E9867915C6A728EAF41B0AF2EFFE55207C01652891C373F7A14409D05FE9E26C2E72D688047DE9A0954516B85ED6A3230B6B0EA9C5F086720C26EFBF8B7F5C5D14651D54C4EA181A707C562239CFC08B2E09A2941D04D587B90134D8F670F734578534138CD9CB7EC04437A768FE65FC5B3FBE818DB423A2208E485669082B422AB1257C2529CBF7BA4CB30FA27B7F702418C2EF9C3BF7CDE53661DF716449C6337C54542EADC5209A0E030AD6577DEEACC6BE1813DB24BEC035CEE6AEE93749D524222535A0277600F8E4F4BEB473093C5A00B6666CB319DFF131AE4F004EEB1BF71E5D274E3DFBFA246DADA9D6F548907091045FCCF79B363E695AD54C2F791861CE04874EE8C3375612DE820CEDE04E4472BC3DC19ABBB91C42A1C3D7B467837570E7D20A2CA6405DECCFF1AEC03E0558076E988619CB0CDA9CC87A12367BD486B676A4F71D40B88AB4E7FA750350DADD1A8F12B70864792D3CC1804BE8B7CB9DDA532182C32582015C1788B43054B7010229F46BD39000440E7F5D22E4D52EED85B204B344680426AEF51F0CE0551FEB9672DBF391A9AD363ED090837CAC1E721878E65AF9BA92A0EE7C7979925FBA9F4E452EB4FE3AF03B9EFF0526FF0A331AC0B8CD27A0C49E5019B7025C3C9870C900A7FB31FF834E04B87DB77C4D6DAE4C3FEE741E923704EE5F294D8F881833E9137158D1EE0FBFCB4637ACB814A2A5346607BBCD6BC916235F7875334F2B75A7EA7B8B8DDCDF46C0B8007C9B3A014EC6E634D4173CAFB1DD09CB9ED4A123151F4F2631D4BEE1520C10C15AFEB17198009C2B254C1FF0BECAFBF69BE8C7DBBFC7E8F3F1EF05FF6A7945FF79ED6C317609B9238670DEA26D56D481F87CA171CCFD726CC0728C965D9BC38D376D707E6979908B19FDF7E74ECD2D0671EC338FD54AD6CC5F789E96018521882588F888D7D715104D65954DBA8907C0B7CE3F2ACB802ED49DDF1416C29E8D685C5AD879464819E1D53FDAC741F71E31AC0C17B6C8932A4A00E7164CF8BBFEC36EBBD30392145B292D355FB304A88A638F991F6F89A398B09F1DE4F0B29866029BEE75A12D724A52736F2B9F49937F0E51B0F2E1BD2C1BC9325BBD1061E0F7685ACA02DA735D8FC39646E0B2453BB9690ED1C4853A757EA9DC2F4EB4B5ADBCFCBFB0CD2587F61A24B77CA0D6CFCFF47A98C7098B986D4FBD0E46EF0D1F9DF842F4473C43912AB49F4117C8214A42F3083936C7E8A38B294BA081296A393DCAADDCD0D340AC62511E47DA6591836553EEDB466DA6285359EE831A952E6C7AE3B943636124E43224D527B7D394511CF31C50EC1D3E7A20E49850905D504F1AAE477830E3BDA50430EBD47FDBB0BF537D8D479CB799B0429C3F6591328299A09F45CF9C6D30D5C1C9203B9521D807875D7FB2C2CFAA688414497122161B1B4F159B66C0834E111DA4F82D5252367FD2DBFDC079333FC51AB0D34ECEBBE786F984852A596BE620EC6CF84ED596425B90316A13B39E5EBFA19B319BF0FD1D6C812F29970FB1FFE948BC0D2E057B1DEA15445D71B5F728C72DD0C69E277C58F031F90932994AC5A177926DCC1C570AC1B4B099ED66ABF7DDE5A5D77D08EF1AD7C6FFE018F56EFB07C737F33038846247EEEE147E4A5995BDC3352B73F15FCE5140410AAE3F0AF1764E5AD996D01608C5E6C6C96A20274EA7781B41FC532B01B52134FEE28F501EFD9CF + +count = 60 +seed = A832D4AAE8076C4EFE8319A74CE315928AB765BB629075254CBC63EAAE691C220F4B5E1839E9A99D8747AACD7C2F1EE3 +mlen = 2013 +msg = 84C603D1B5549C46964FF2987A1F533B4CED94E67D576A3B0BF1C8BD87A74AC7DB640FC9F7ADE44FF79B820846EB83367153F5DDDDF9DFB7848A13D59436916EFABB82DD61291447491D2CA04166FA8680E8E0E0DC98E79344534CA1CBDDB531797A61C291606200107002091ADFA927A763CF98CBBD631CFE890B0ED257AFD34AC0C5280AA7C70BD0C945D78E6FDA284CBB7B3AB636BDF17342F2BA28D707147F14D15173D9BC0B6D65FD1663C86971BE1FA59DA8325E1F3773BACC5B8D4158EF525FDE6E96631C51AD142250252A8E5786CD621210DF3E24CC0B4B60AC2F013D76DB0C73DF40EFAA05A65383A8892276B3D69DD511937D55D914C3222A2386D1BEC0A268E683716AF4AB709D2D225B86229095E87FE70D69E6A34BB214529CA3F082C0F2709E77B86B00B4A04BCCD343C862333B7C9163857B77E30551710CCC3A803323F5CD4EB5317CD2E6A24BFB77727E1C64D0AC47BEEA1CB35E5F2FF6024C06F2F391FEE76F2E69537673FC0124E48E4E2242E84D8AFFEE6803CE6EDF3A954D2C54562B8B76A4EDD91E24A8640AFE67255605849053B60F558B43DDB9F8A04E987D15F6292962D10AD8F7B47188D12D1C9090C0FE8710DC3937C6939496884BDE0BEA979839837C61BE4DF5662C724610C7FCB4631A0A2083417BE6A20F4EED094E2145BC72A83A6E147A655C481DCC906E63ADC0244D95B6085FC096FBCCE81EEB0497F48BB5EF827C0893E331795E3B301DC9F3A91DBA9FBC838E044E2AD9859F1DC67E9BCC375442B4EB59714B5EBBA87AC9A79C99CE74F8BC75740DDCCE46C4B408B91DD7D4AD26B0FB1A4AB874F5504C40E7363838D22AEC45C10D3CC2E233124A5CD8344249EDF388E37BA43598F2C2CF56D444BCEE04A335B154DFA3CA694DB481CBAA59514098CE6E0E4138C0A543EFAFEDA4AECC022C824259A06C3D57A70EA15A5DFC822449A27F58F9EF842DCBB636CE293684E1B331CD821594A12634E5594410B6C5E2306DC8BBE62C8B0F49F2F699A59EFB14D3CAD399F74ED893E1EB43FD770FD61E0C58E5D8CBC9435F4AD0892681A30DF4885927130432186AD4BE41F6FB7CFE660E23C5E55F60789B3E97C3B622599938B36BD1C0BCF6FDB7E4EE44C92B6A86CA2470BCDB8BAB8DF6079382CA314BF3A8B3C4286518C356018FD6F6FCDD9BE9AD9C228F29135544E723A898F483E9D9EE843E75ACB3FEAC447973D12461FEE3D984F3B4F31645FAEA56852D356C96CD73A6F185E8CD56731E83FEA145A2BF0C15ADC634DD9E2FFC799B59A0712EB4D2618680C7493F50A9BBF3F7BDE1025CD44AFDAF4A8C42C9254B1B34AA8559E1CEE9BDE7B4DA0FB3CB2289418110620E505B793B91F422FCF53ADDA8F7C96D55E26244E075D9A70004642712EAC377CE18F88F2C8581694B8F621707DAB6D292179B2A95AEC5AD6E409D78253DCC05ECCDB45683DFFFB9C629AFCFB0654725D650E4A283FD98E47F37AA9309E2933CC0393625DD81D4A02F9D5082644DE02B6472D5D3AAE110747E4F756973FDFCE8EA5F997E30B11EBD50B45F6889D227D87D9184CBC6ED40E96DEF8B9236763C9999E21BFC1A74457FFE5E0DC2B16876FE04C2E0F0F47012A767A7AC18D71A7FD65F8647A7E1AE2D4D255492A18AA81D17D390E381B1722BC3C38BCCEA9D5E73231D0C6E1A96CCB47079E36C994E94AF9A318D67B6408BB602A91D8E9EC6499DEED0B51A9AE31D9774A1BEF4C1DE0E7A324545B2AF9870CD733C2195C5ECDE386D298C33D492937497EA5F0E05C377A4D755DEA9D96C61FE82CF6299EB34B857217A2C6733FED64F5DAC5F95A0EF2294ECA844B96CEB5163363A31C58C88428152663AB0A2B310B1A9E9027CA8CC0DB6DFF528F9A421FA826A86ACB4FD1D79C1AE6123C9E685BA66F5FF109FDFF2497B1A50C2E4E7B4662FA11FBAA305A960CA70FF98E5290A8C3A27B4A3CF1705C6DF4290FA64F3259FDEDE7A81CFDE4214230DFB9EFB20049E905833B5D48923C8CE2F8A104946FB3356154519D950998677C56C8B2C80471A6117B142E26C0345CDF0634E356D80C3BE12F4AB89EB41DDDCF98188EAD2FF420EED3FD9287322F24C62B21F430D5F9B8592CE1CDC946616111C91C667006E47992FE2D5A2AAD82F8DD1AF3C1B8BA5326220645885CC94E8B2B76CBFF7E161E994C0CB9E489B8A5662E9D420913AF34433F5BAB10AC72C5EEB9249F3C102E1762E862C13CC882D20BE16834E54DCC323EA89A133F451B70087A8DCDC5B518EEF087A571B570A7966F1C49BFCDC70AC05034D1DCC56EDC2C0F57D1AAF16718C67D162BA330AA61A2875F90E2935752BFF1EC28A79EAD1AC18E70A833946CA6A15D8765E1A62AEF46BED232EAE89DBEC278297B396CF611448C5FD4B36B95CDC54E3394C63B9B0969D6488FF1C700B390E7226F99A945306C6504958CD43CD3D63910A4324BB662A0E5DB1622D90CE00E50CE7112193872AAB5CEE0B8D6FD42F26C2FB87FDF99062169C0BE75C85109D4E209DC8A640FED3EC71EF3DE8878B3D1729FF118F50F8A33361C6F707F6011454C5D744989EC1BEB644FCF99CB2E7C3CD20E6F1656E07C3566C4DE68593BCBA0EE9F7BD2E272C3D47A3E03985456F18CAFBEBBC1DE74964BECABDF3E9BBB9A10B29BF3B458FD50F19D63A6231CB51CDE3DF46E4BB6318E81E10AD1674A053C8CFE1E72853FD60E6E642642CB825644D6734AFB00329839F22CED734FA1421C4334E20F2ECC8BBC2652004203B3B639FBDCF5FDA1423F08C3A1100655E4763B8D8356A151D702124D30FDD87B34EC4D34BBB3639464E44A693690E193329 +pk = A172FAA3FFCC01DF8BC52ED3C8A148B83304C60B2A222D6C4E2609E726F1A30379A23B4334A09ABF6A64BFED9C135D57F606DA44DD24B215B7138C5D9E5F900004 +sk = A172FAA3FFCC01DF8BC52ED3C8A148B83304C60B2A222D6C4E2609E726F1A30379A23B4334A09ABF6A64BFED9C135D57F606DA44DD24B215B7138C5D9E5F9000048FDFCCE0D937B050530B166D10F9673F5C010000000000000000000000000000CAB9D0CEC7E6136D5B9CF73983D5E11D0CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF666659C10DA70AA47E97BA9D996305F9FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000DEB4FCDFFD4329984451D3FC1DA831BBFFAB014B0E51982234A45486C3022100B377D0FABF3E8BDB4D5B8610956955C93BE38D0F615A81837C851089E3FFD20029F1BDB365436799872F2384DF69C7ACAC5CB0818EB19E963CAB1ACA628E9D00E56153C6FBE47FC0692E9E05B0C507C1EC245614A1B9AA133F9B2B8D00C1FC00 +smlen = 2161 +sm = 056905A5154ADD79D203E15740330C7E71E8A7E43A77435F9D7FB4A174821B02E731272B25D7D85ACE456B2CC4A2A63209AE09F6BA40C62C07346573C9BBEF02000042278DB44E134FC99D52934E4F67479BE39A4DF4B190F2ECB9FFF9A741AEBEBD47B581B0A2FD15CE7948911BAD4966BD26E70DDC8960EF4771A85C32D839138FF020E2AB0E9A7FD09A0392C9153A5101020B84C603D1B5549C46964FF2987A1F533B4CED94E67D576A3B0BF1C8BD87A74AC7DB640FC9F7ADE44FF79B820846EB83367153F5DDDDF9DFB7848A13D59436916EFABB82DD61291447491D2CA04166FA8680E8E0E0DC98E79344534CA1CBDDB531797A61C291606200107002091ADFA927A763CF98CBBD631CFE890B0ED257AFD34AC0C5280AA7C70BD0C945D78E6FDA284CBB7B3AB636BDF17342F2BA28D707147F14D15173D9BC0B6D65FD1663C86971BE1FA59DA8325E1F3773BACC5B8D4158EF525FDE6E96631C51AD142250252A8E5786CD621210DF3E24CC0B4B60AC2F013D76DB0C73DF40EFAA05A65383A8892276B3D69DD511937D55D914C3222A2386D1BEC0A268E683716AF4AB709D2D225B86229095E87FE70D69E6A34BB214529CA3F082C0F2709E77B86B00B4A04BCCD343C862333B7C9163857B77E30551710CCC3A803323F5CD4EB5317CD2E6A24BFB77727E1C64D0AC47BEEA1CB35E5F2FF6024C06F2F391FEE76F2E69537673FC0124E48E4E2242E84D8AFFEE6803CE6EDF3A954D2C54562B8B76A4EDD91E24A8640AFE67255605849053B60F558B43DDB9F8A04E987D15F6292962D10AD8F7B47188D12D1C9090C0FE8710DC3937C6939496884BDE0BEA979839837C61BE4DF5662C724610C7FCB4631A0A2083417BE6A20F4EED094E2145BC72A83A6E147A655C481DCC906E63ADC0244D95B6085FC096FBCCE81EEB0497F48BB5EF827C0893E331795E3B301DC9F3A91DBA9FBC838E044E2AD9859F1DC67E9BCC375442B4EB59714B5EBBA87AC9A79C99CE74F8BC75740DDCCE46C4B408B91DD7D4AD26B0FB1A4AB874F5504C40E7363838D22AEC45C10D3CC2E233124A5CD8344249EDF388E37BA43598F2C2CF56D444BCEE04A335B154DFA3CA694DB481CBAA59514098CE6E0E4138C0A543EFAFEDA4AECC022C824259A06C3D57A70EA15A5DFC822449A27F58F9EF842DCBB636CE293684E1B331CD821594A12634E5594410B6C5E2306DC8BBE62C8B0F49F2F699A59EFB14D3CAD399F74ED893E1EB43FD770FD61E0C58E5D8CBC9435F4AD0892681A30DF4885927130432186AD4BE41F6FB7CFE660E23C5E55F60789B3E97C3B622599938B36BD1C0BCF6FDB7E4EE44C92B6A86CA2470BCDB8BAB8DF6079382CA314BF3A8B3C4286518C356018FD6F6FCDD9BE9AD9C228F29135544E723A898F483E9D9EE843E75ACB3FEAC447973D12461FEE3D984F3B4F31645FAEA56852D356C96CD73A6F185E8CD56731E83FEA145A2BF0C15ADC634DD9E2FFC799B59A0712EB4D2618680C7493F50A9BBF3F7BDE1025CD44AFDAF4A8C42C9254B1B34AA8559E1CEE9BDE7B4DA0FB3CB2289418110620E505B793B91F422FCF53ADDA8F7C96D55E26244E075D9A70004642712EAC377CE18F88F2C8581694B8F621707DAB6D292179B2A95AEC5AD6E409D78253DCC05ECCDB45683DFFFB9C629AFCFB0654725D650E4A283FD98E47F37AA9309E2933CC0393625DD81D4A02F9D5082644DE02B6472D5D3AAE110747E4F756973FDFCE8EA5F997E30B11EBD50B45F6889D227D87D9184CBC6ED40E96DEF8B9236763C9999E21BFC1A74457FFE5E0DC2B16876FE04C2E0F0F47012A767A7AC18D71A7FD65F8647A7E1AE2D4D255492A18AA81D17D390E381B1722BC3C38BCCEA9D5E73231D0C6E1A96CCB47079E36C994E94AF9A318D67B6408BB602A91D8E9EC6499DEED0B51A9AE31D9774A1BEF4C1DE0E7A324545B2AF9870CD733C2195C5ECDE386D298C33D492937497EA5F0E05C377A4D755DEA9D96C61FE82CF6299EB34B857217A2C6733FED64F5DAC5F95A0EF2294ECA844B96CEB5163363A31C58C88428152663AB0A2B310B1A9E9027CA8CC0DB6DFF528F9A421FA826A86ACB4FD1D79C1AE6123C9E685BA66F5FF109FDFF2497B1A50C2E4E7B4662FA11FBAA305A960CA70FF98E5290A8C3A27B4A3CF1705C6DF4290FA64F3259FDEDE7A81CFDE4214230DFB9EFB20049E905833B5D48923C8CE2F8A104946FB3356154519D950998677C56C8B2C80471A6117B142E26C0345CDF0634E356D80C3BE12F4AB89EB41DDDCF98188EAD2FF420EED3FD9287322F24C62B21F430D5F9B8592CE1CDC946616111C91C667006E47992FE2D5A2AAD82F8DD1AF3C1B8BA5326220645885CC94E8B2B76CBFF7E161E994C0CB9E489B8A5662E9D420913AF34433F5BAB10AC72C5EEB9249F3C102E1762E862C13CC882D20BE16834E54DCC323EA89A133F451B70087A8DCDC5B518EEF087A571B570A7966F1C49BFCDC70AC05034D1DCC56EDC2C0F57D1AAF16718C67D162BA330AA61A2875F90E2935752BFF1EC28A79EAD1AC18E70A833946CA6A15D8765E1A62AEF46BED232EAE89DBEC278297B396CF611448C5FD4B36B95CDC54E3394C63B9B0969D6488FF1C700B390E7226F99A945306C6504958CD43CD3D63910A4324BB662A0E5DB1622D90CE00E50CE7112193872AAB5CEE0B8D6FD42F26C2FB87FDF99062169C0BE75C85109D4E209DC8A640FED3EC71EF3DE8878B3D1729FF118F50F8A33361C6F707F6011454C5D744989EC1BEB644FCF99CB2E7C3CD20E6F1656E07C3566C4DE68593BCBA0EE9F7BD2E272C3D47A3E03985456F18CAFBEBBC1DE74964BECABDF3E9BBB9A10B29BF3B458FD50F19D63A6231CB51CDE3DF46E4BB6318E81E10AD1674A053C8CFE1E72853FD60E6E642642CB825644D6734AFB00329839F22CED734FA1421C4334E20F2ECC8BBC2652004203B3B639FBDCF5FDA1423F08C3A1100655E4763B8D8356A151D702124D30FDD87B34EC4D34BBB3639464E44A693690E193329 + +count = 61 +seed = 09B8441F47235EFC82D71933A0037FA4F69124C3BAD4EF6A3A7178B417A3FDA874081B7EEFD7EF1BF234C752458FBBAD +mlen = 2046 +msg = 92D5FEEF68737ECE61C6E0078D77FBAE97B0B9235F40B97099C114B1586E107B5ED1308A8A2D20BE41AF129DA2E0B38EAF02FAEF733C7A1D1A387BC55EF008530ABC22697D0465AA3EB71F41EE72ADD236CEA9A25995F3689C5A451E2F03915D96ABEA10D356D549D68048977587326523CCD71C05FD57BFB3C7A853F535BEDDEADFB84118F6548860F6BA536277DDD7AB42123E93381A385FA3E6CC023C1458A9F94822D93248F36C48FDDC972B5D6494B26658440FFBC23B57363F3D82CCE69FEE4747A889E85343288D55D30FC54D2D0744744DBA9977720E8EDD2C0ACA1FC51B0C6A3C68BB9BB8DA0385DB1CA4E9CE660CF7EB2382E5E95D2AE19DEF904A8651DFAE53A4D0DC4D057AB1A506C3BD7E1D1EA3FC4623E7D7B410DCB312F037B7A5FDE5E0E604FC33270FAF1FFB6ECB3125DDFA5C49F25BBC98238C8AB1B903537CD67238995E81B814280A4CED61513D69A2178086D505F8DD1DF7E11CE66AE33D4C982F94231957031A258E0EC745672A57A5CE76D1170111B8882A9EB5388094EBBD53EE9EA1FCE4A275F9D7060C8DA79018487B452817280C63B01B05EFBF897387592E2BB3BB486FAE0AB09F46D9F2E176DE96C59992C10A14EC16EAC36102B1D15541607075E67C842A888C87B268E9809148A323C423220DC31566B62F45CCE1E2BC1B3BF43B87C998F00023890BCE517271BEC16EFAA33F11611FDE87F197852BC2E7A2B44F8C72A6F79B22F73BE0611B81EFE09253931545D2453939C46B6797CC5DC5A8F1AA3BD8456EEEB84EE76DBF2EBF32598750ED10670DF422C7D7993ACC55F657E6E1B3DFA1BD6C1CD55FAE97E69D2F8F5AF368F7DA0A63B4065EB6D8F02B19A34600252FDFFDF4ED8DE2EA9CD2E74D63A6CEF29BF02F92D346ECB9A61081EE5AC811F33AA5792F6A1AF570A8B0846F3E6EF38452346DD637B19ECA37BD1A6C42B20A5BEDE9A5DE3C9F169D04D8C6CF5376D3404F0C21DEAD53DA6C169F390EED7B5B54DBE47CCE0B2AD1179EA8FC80FDDC7281BD4FE31B9A26A00444AF0B4D40A1B72BE37501308906149DC6FC5CF02B6F60AFF82B975FC8F146961EBCCB4D126ADD524A9B33BB16F6A83C6F3727A72EFA2BAC116E493E07B2CA718A63FCAC8E9D52A1B61479B4EE52A5ED30FABCEA4D01A792A92676721286814F3B0F4E15E23CE0C5D59A0C3EB8573C0A2F66C25F2EB2FCFF787324721004979BE5EAC505DFD39F5538E2C1B2CC12D20C1C5CD87299766361AEDDBFFF743693081842378744879E6E6371B3FFA9DDF34966FBF8DEE91B7EDF6EEC3E4E2F410CB5351F847646C22AB594046DED63347D04A008FBF6EE9696C638ECE73B39A269DB239DF36443868AD44D26A5C40FC92DFFB008E436E5C18907F5B18B5E6C5900B41A9801DB070D2DB651187A4DA7E2647ED3E9B6E9781627EB576BEE8334374468760DD3B32985D42945D953D434BFD80D7F7BA537265FFCF27DB0DA1ABDAE89BBE94D98BC9CA197E41C0839728F964FE4CE30B8CC43CBDCDD9CCBE06FE99DEBC6F4024F3F00D43FEBCD62A1822A6D507337EE79D4517AA486870602D4F1C5368B0EAA1FF6C011A9A953AAE58C75BBD3DC78D263A578C75CDB1AB324D71B9A065A9AF3DAB854189585C68D499AE8DB887745E20AD9738705B9D2F5D429F12D6462E5E2EF9FFBA53CE2F4E75449D2A7DBC3C818E61DC546175A6E0C10AE631DF6B1EAE6D134C08466EBF6EB5F8257AA10EF8C6F27F4295F7EBFD450629F3EB4E0F4BE247AD7F5E80703B1247A4FC277311D69E5D62E0B0201A805CC4F1F807DE99420D563A703493AD35A56B2B2DC237112F5EC21C70BF139A9EAD8F7E921F086E001B4C449E42A0E3AFCD5BC757040A2865D0E5ADAF98E37E6F8A501FF39CEF0BC364EECDFFD03069B81F5E1978C397862FD56362835C059FCBE4D8E2A957FADD7D05BB195E21AD67B429621E1D6872DE2D8BFDC91544F9E6AE8C164A23255AD0E00BCB21456F8FA6AE018F49605736C81A5AC0945E2D965F1493ED5BEFCE512AE93AD91DAF6F5A151D6C9856DFDDD1F877945D932261DED67AC8231DC3CCD0B04DC1B02079C897601E363FFB9A3BCBBBDB0B0A375E69EE4A7135C094ABDC237FAA2E5F82D2556290ADCF82ADBA8402C4FC9D0724F15BB87CD7A75A1A7BF826896D8EF63C7A2A3C371756AF638706270652C376100EC42FA55196DF332820D377760448D3E7ADC42E9F5D8A7074BD0FA97433B0E2C501252DE6939AB948552663A17DD7FF05430FA76E29F0519D650B86FBB19FBED097143FC242573E3E6FA4BD4A2EF6D9CE6932A066B4F9FF935BA9BC26FC2E5031C20AE30A52970A2DF3504576108D5F26517F8577BE61E6AA9D192ED62CF36AA641DA0D274B1ED5EE864B549154EB4115658E6C60219CC5B2E22C49CE3BA76A85EFB549117E1207F6DF081D0761421262E352182239F1E34EDBEA4BCD8FA0027543824DD58A20324FD4CFE943AAE5E361C367B22F587E2F9BEE841E11875B026F12B9571512F72985F98F6D0C212DF36A60975429173E317F6ACF72E621F30654A6DEAEF9E9E455524BF07FFDF44642A1826F734D69F3EEF4D52F26C06376C8F71DFB65A24A4C57D74B5976950AF3A57B4248909524BEC47D858C69041EED34E0ED3B111BBC117AB112BBF947D646AB3B7172F5FB726DBC53AE37956E29F5B6B1E3C90BAF4E4FA544FF63815FDF4AC9A2A80CA0E8722383437B9A02F3AC538FEDA7A6D6C1635D3624A385D846E79E956DCE483B89C346C1287A1A7293168D8A885FEB6569EBDF3F47F8BBB50AA43941EB20001959AF1B9B358ABA13FD9BBC596EA42A9774A120AF091D544E79C50686C26B4FEA396BF1E4C25B8EE4929D75569A5FAC521C77B +pk = 14CDC16B910FB42382C53E55E5A963236D47C174E7117322E1F1A5D70F75EE00BB2BB0E431970E25952EA8A4DA06B1557EFD04FB6B5162DA036ECA972562280304 +sk = 14CDC16B910FB42382C53E55E5A963236D47C174E7117322E1F1A5D70F75EE00BB2BB0E431970E25952EA8A4DA06B1557EFD04FB6B5162DA036ECA972562280304B56F1B561D0674314054DF8EA23416A878000000000000000000000000000000FA9FD30724314294E9A041634E9F83526EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D271110B738F8B960A2B2FF6573914AEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000D1EC8DE1858E5E9850A088CC33F22193EB354135BA3CE18BACB1C7CF796FBD003D62473D986EF44100048D4D8465D462A221E5099CBD62A737B1BE6E89D5E50028254D76768E70131571E714771757DE9164C8907D17070F50BB5D90696E7C0015929D9E0BA6F53A2931355AD9D2915BECCB3BE316809534841452F1DB8FA900 +smlen = 2194 +sm = A050B1C239800FB022174FA34612687286357D0F99107CCC3265946A2F731F02C36972FDD37FF0BAB04D284D8A8E6A3FFBCC8D98EDE5CE5398485E15E96C2E040000BD1DFB55CC35B3AE2B9607A101C98CB83825839526C5F75EA38C381D73E82F0CE01CAB879E460F69A646E0312956CCDC0128F31CF5BC6A505B1C0ADBC98680B33811708D4EB3BF3AF655399267647900020B92D5FEEF68737ECE61C6E0078D77FBAE97B0B9235F40B97099C114B1586E107B5ED1308A8A2D20BE41AF129DA2E0B38EAF02FAEF733C7A1D1A387BC55EF008530ABC22697D0465AA3EB71F41EE72ADD236CEA9A25995F3689C5A451E2F03915D96ABEA10D356D549D68048977587326523CCD71C05FD57BFB3C7A853F535BEDDEADFB84118F6548860F6BA536277DDD7AB42123E93381A385FA3E6CC023C1458A9F94822D93248F36C48FDDC972B5D6494B26658440FFBC23B57363F3D82CCE69FEE4747A889E85343288D55D30FC54D2D0744744DBA9977720E8EDD2C0ACA1FC51B0C6A3C68BB9BB8DA0385DB1CA4E9CE660CF7EB2382E5E95D2AE19DEF904A8651DFAE53A4D0DC4D057AB1A506C3BD7E1D1EA3FC4623E7D7B410DCB312F037B7A5FDE5E0E604FC33270FAF1FFB6ECB3125DDFA5C49F25BBC98238C8AB1B903537CD67238995E81B814280A4CED61513D69A2178086D505F8DD1DF7E11CE66AE33D4C982F94231957031A258E0EC745672A57A5CE76D1170111B8882A9EB5388094EBBD53EE9EA1FCE4A275F9D7060C8DA79018487B452817280C63B01B05EFBF897387592E2BB3BB486FAE0AB09F46D9F2E176DE96C59992C10A14EC16EAC36102B1D15541607075E67C842A888C87B268E9809148A323C423220DC31566B62F45CCE1E2BC1B3BF43B87C998F00023890BCE517271BEC16EFAA33F11611FDE87F197852BC2E7A2B44F8C72A6F79B22F73BE0611B81EFE09253931545D2453939C46B6797CC5DC5A8F1AA3BD8456EEEB84EE76DBF2EBF32598750ED10670DF422C7D7993ACC55F657E6E1B3DFA1BD6C1CD55FAE97E69D2F8F5AF368F7DA0A63B4065EB6D8F02B19A34600252FDFFDF4ED8DE2EA9CD2E74D63A6CEF29BF02F92D346ECB9A61081EE5AC811F33AA5792F6A1AF570A8B0846F3E6EF38452346DD637B19ECA37BD1A6C42B20A5BEDE9A5DE3C9F169D04D8C6CF5376D3404F0C21DEAD53DA6C169F390EED7B5B54DBE47CCE0B2AD1179EA8FC80FDDC7281BD4FE31B9A26A00444AF0B4D40A1B72BE37501308906149DC6FC5CF02B6F60AFF82B975FC8F146961EBCCB4D126ADD524A9B33BB16F6A83C6F3727A72EFA2BAC116E493E07B2CA718A63FCAC8E9D52A1B61479B4EE52A5ED30FABCEA4D01A792A92676721286814F3B0F4E15E23CE0C5D59A0C3EB8573C0A2F66C25F2EB2FCFF787324721004979BE5EAC505DFD39F5538E2C1B2CC12D20C1C5CD87299766361AEDDBFFF743693081842378744879E6E6371B3FFA9DDF34966FBF8DEE91B7EDF6EEC3E4E2F410CB5351F847646C22AB594046DED63347D04A008FBF6EE9696C638ECE73B39A269DB239DF36443868AD44D26A5C40FC92DFFB008E436E5C18907F5B18B5E6C5900B41A9801DB070D2DB651187A4DA7E2647ED3E9B6E9781627EB576BEE8334374468760DD3B32985D42945D953D434BFD80D7F7BA537265FFCF27DB0DA1ABDAE89BBE94D98BC9CA197E41C0839728F964FE4CE30B8CC43CBDCDD9CCBE06FE99DEBC6F4024F3F00D43FEBCD62A1822A6D507337EE79D4517AA486870602D4F1C5368B0EAA1FF6C011A9A953AAE58C75BBD3DC78D263A578C75CDB1AB324D71B9A065A9AF3DAB854189585C68D499AE8DB887745E20AD9738705B9D2F5D429F12D6462E5E2EF9FFBA53CE2F4E75449D2A7DBC3C818E61DC546175A6E0C10AE631DF6B1EAE6D134C08466EBF6EB5F8257AA10EF8C6F27F4295F7EBFD450629F3EB4E0F4BE247AD7F5E80703B1247A4FC277311D69E5D62E0B0201A805CC4F1F807DE99420D563A703493AD35A56B2B2DC237112F5EC21C70BF139A9EAD8F7E921F086E001B4C449E42A0E3AFCD5BC757040A2865D0E5ADAF98E37E6F8A501FF39CEF0BC364EECDFFD03069B81F5E1978C397862FD56362835C059FCBE4D8E2A957FADD7D05BB195E21AD67B429621E1D6872DE2D8BFDC91544F9E6AE8C164A23255AD0E00BCB21456F8FA6AE018F49605736C81A5AC0945E2D965F1493ED5BEFCE512AE93AD91DAF6F5A151D6C9856DFDDD1F877945D932261DED67AC8231DC3CCD0B04DC1B02079C897601E363FFB9A3BCBBBDB0B0A375E69EE4A7135C094ABDC237FAA2E5F82D2556290ADCF82ADBA8402C4FC9D0724F15BB87CD7A75A1A7BF826896D8EF63C7A2A3C371756AF638706270652C376100EC42FA55196DF332820D377760448D3E7ADC42E9F5D8A7074BD0FA97433B0E2C501252DE6939AB948552663A17DD7FF05430FA76E29F0519D650B86FBB19FBED097143FC242573E3E6FA4BD4A2EF6D9CE6932A066B4F9FF935BA9BC26FC2E5031C20AE30A52970A2DF3504576108D5F26517F8577BE61E6AA9D192ED62CF36AA641DA0D274B1ED5EE864B549154EB4115658E6C60219CC5B2E22C49CE3BA76A85EFB549117E1207F6DF081D0761421262E352182239F1E34EDBEA4BCD8FA0027543824DD58A20324FD4CFE943AAE5E361C367B22F587E2F9BEE841E11875B026F12B9571512F72985F98F6D0C212DF36A60975429173E317F6ACF72E621F30654A6DEAEF9E9E455524BF07FFDF44642A1826F734D69F3EEF4D52F26C06376C8F71DFB65A24A4C57D74B5976950AF3A57B4248909524BEC47D858C69041EED34E0ED3B111BBC117AB112BBF947D646AB3B7172F5FB726DBC53AE37956E29F5B6B1E3C90BAF4E4FA544FF63815FDF4AC9A2A80CA0E8722383437B9A02F3AC538FEDA7A6D6C1635D3624A385D846E79E956DCE483B89C346C1287A1A7293168D8A885FEB6569EBDF3F47F8BBB50AA43941EB20001959AF1B9B358ABA13FD9BBC596EA42A9774A120AF091D544E79C50686C26B4FEA396BF1E4C25B8EE4929D75569A5FAC521C77B + +count = 62 +seed = D2629CEEAE5C95D3C34C1FFCC2338B4A97782BDFCD39111E18540B69DB035B352D012857111F816F03550BFE5F56ABEE +mlen = 2079 +msg = 7F704CEF1C510BC2CAE9B70FD248C656226BD5686D366528F0D0BEFC0A8761EC640CD2DA7979DE5EEBDF6127F29ABB8607F8A3D3BE05BE25AACE7FEF3063DF28E22A522FFF0B6FF6A0C61F79B02A408E8E1C775AB80BE6841E9F8A9D030AE5518E3EA8A4E31E416E087D47919593598FD58122A9E601A57EF02DE183D56921811AE2253628125C24F93C84361C5EC99E7B16962BD96CA190C68F3AA9DD60CE3AA7610589813B4FB77A4688308D9BC72CBE918583E298E03AB95FC500209C14ABEB3A43BAA92DCB11CB523C4D17EB9C6697B56C8B61EDA05BF5789166F839291CFE2997B7DD462EDA69B0615F2AD82AAC0A32F4B30FE8725849C144A9C07799D6CE9D293C25D8302161757B8C8C8D07032D914EA7DAC275919A1DFA0D3348EC07FDC70266975722763EF85EC4AF9E14288C9659907526566BB3F2DD5DAFC0D422568CA3AE52486D3F2C18B667E5622BA7E52C56BF00F82AF2108CB4949A09179544F30758B7FB98C49EA160720991B14E2858D648F0585AD1BB1D08294F029BFE936154E9D328DF2E054004FC5C29070DF9EE50DCD0981D2BFB3AA7D6F637C4CE457C0C66D27E2670107A2B85D1F026BD970EF3FB7E32C60218D5E43A06D9CD26289A937B4FBAD2A831425728F3D0D30C6C602AF4B14411E9B3C7CF0B4D630614A9E03AC30BA2B024D496DA984D08854F1366012C2400A5C8268C2B126DEA5AEBA0DE7C92BE0AF08CA22E02604A753702BDCD642BBFA0CC91BD8375657A957306A76B6F139621481B6F15CB57BEE128954D30F552661F906D8AB42CF260F30F88993BB40C9679385F5C4639888973361216DF3C60C57D9B250F64B7634C94DDA3FD122713FD2405A7B71F476C263A781DCE271E7D0665E45DCB27F7293DE57312396C58C40E268F57ED856F536C8FEB4B0060488DE3C25949D2B7E64207576641B34920D04B46766AA2978D9352C2769D49F8599F3D0439C928532E0EE428A3773FA4D68E6052335C6D93368E321D750D296799FAF87B82C640A6E995D18DDA002887F141DB8ECE2584DA2FDDF848D38357D585CD619B1625A70A5D333561D6DE856ED9908D1E377EF7BE03B326594808BE58F7FB3939E939B73F11DAB3E572DBA41D43A046B8D2BB521728222D5A77DC886AC6F328D9A531118156D791D64F5DF8FF8BE8DCA32EABC3CB259B0F72B021CEB4DB36A6CD2FD149437B251F81F7588AE921456BEF1A79FE83447D80CADDBF20895667CA0E493A4731EEC901E03F66DE284400A5558922AD53D4E0FF7BC6C61640ADE0274C63D94E96BF6C642B790823109F53C3C27130A1EE38D448239187F5009373BE328AF866A9B8DD1BB735E8002296043C6FF641A432709148C707B900ECF46555D77644565D5998C096756F79B6F0E20850B8BF0528E78BF5FB4859BD655227873D289CCE47FEDA8414D09ED7E8D380FC4D580C7F44B01521E829E7B0CB2D2F345C517B65E2D476687EC9A4C160A3AC0B01CBAA588644D799B125910812790F06C1ECB1F1E64D5CCF92AE5E8147C98B0CFAD5626BAB5115844198E8C2AC1DF9A208FCD2D2891F4A29009F5B36D8E31383811A9493CF8E143B5AC8A14D48119CC16D2C6BF6826FC47D4B782FFC76B64401B8249777E32C1298606553DACF386A22809B599924A635796A1AEC3CD8568064852E54C95AD887D7AFE837F6FF676F69EE6288879F6D96193AD94A0418BBBA2EED5355876F2C3497448A5F8F3F83B136703D9A38FBB62784CC233DF448A5E88EB5F81A0BE97A16FD4CABA1D87A4BFB08E002EBA548F662D496A1478BB7C26C69CA4C100AA6872A4945D703CA812BDBA53AC86010AA1D2C53F29E46AD095936FF50DB8805DF4B08C9580AEECE3A6DDD828E7B5D4DABCAF112A6E35AB3C28A6DDC4D98AD1063C2ED72CAA50086E6B72090CC1F2AFEBEC6751F27EF51DD8557E53D928535D82A220F62BA0645E3C2618F3424EA1A339A138C9B8E26B14BC32D1736A4193C0C72CC402C3EAB58817335C1424BD6F38CFE16338611118B4100E4038D07DCA041C72E485C5290F0DDE601565DAE9CDF657A4C7839D3ADE72986AF396E767430125786E219BC5736F16FEF66B4014E5961CFB4CFEC4CB2A32205A92DBF1399E2710395BA1240D48277C120526CD9E2352F7D04D89CC2754379CE80A2CD1AC765718B8BA61EBB8BC6D0D407022E7AC672065FC8503BF5BC4138520CAE233EA997463D7C9E00BBD852F12EC17C6F1DB1914446AA21E156D210094B699B4117B31EAE6386DC0DE1F55CCEC09AA1EB38CDE4602598D452732C5EF8B07C477E3E2DD470737EAA7357E2E8B74C31A117B519BDCEF79B6B044148A10468E38B5A6B7B10D74C6130A60A268ED73DC9A25ED68AF354758FA3F57ED3558DA654CACA7150A8E4449D0EF640184A7A33D00BA765B01C442E88D9B4257B93904ACE04375679BFD8271A03073E34C4A1C0437C4009A9590CB98D0B5581DC83407F04A22C9B0246DE38E1A13F9B1191493818783950548BE562F940240CDECD4A50C94E406B1BAE04B50A3A19E7923183E3FD356238C45AE6559193E0E846DF0FC6878BE6C963AA8C3508DC31F766A4B29C78D749C89985AB8F580DBDF7993A2261CC4BBE489C3BBB38C46739BD2516D3C64A93F10CF559DB6A0EA3BAFEE8B43F696A5288C66509A57C642BBEAFB40F4CD0649B4CE25B6FB2EF5529B73556051213BB39CC4F1DC8004B1588C8DE836699C66CED567998523AD3AC303D9E13617CE6C1D2FC4C35B22A24504C51F64155F24D91D0E8785B40912B3DCEDEDE71A6933B36BB514FDD1D3D843AAACF2C1E79A5216622C20036C9C999DAC3A5A2D43FAC3B23119927806F497B4048F561A2276FDA0302423147D35579DD4411416F0F59273429AC0464AC49B230E29DC124115D18A045663D228BFDAC9F57B0C5B4 +pk = 5EAFA9C392EDE250F8C17E2713DAFADD94E1FB7BA84F27FA29E685920022F904D27FC64F94F4775FEDB55A1288D4F3D3772FC5E7B42C1FE73222684B57CB830204 +sk = 5EAFA9C392EDE250F8C17E2713DAFADD94E1FB7BA84F27FA29E685920022F904D27FC64F94F4775FEDB55A1288D4F3D3772FC5E7B42C1FE73222684B57CB830204958C462EBDA89499B06A17C98DE266B331010000000000000000000000000000C42E8FEFA2C53CDDCE646D370A186AE6B5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6520AE84A9799862E25A2F6E5B1454D784FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000008B36CA19EAE23F7CA18F9C1B4500C784E3C10D6D531E53966C4F697F35D75C00D5147088D7623D394784DBC5133F61D980A00885721D0582E80AD5DE2692E90003EF94606FBB7E58972919C82D4E2D699DBF73957548239D8B735E5B3F71EF0064706DC262F8C5F690D7AA43EF6D50FFF8322E26B16C235A95B7A3CAF85E7C00 +smlen = 2227 +sm = DEFF4ECAE24384EC79B02CF2917D8E7B3FAF4C1F8E5BF5D63130F51168326B04564CFF816C391D67C566F6BDD9682351542933D4FE5D9F8FD9558310B4777E000102772C094A119BBB87BC7560964784AA10F2A0041C3DE8BBF343770C517CFB48766F5B27CFAFB46FA1DAF38854C8E7747DBE867ECF9238960E9AD55A15923B90419C6C694465D3068D2958B9379456A60304117F704CEF1C510BC2CAE9B70FD248C656226BD5686D366528F0D0BEFC0A8761EC640CD2DA7979DE5EEBDF6127F29ABB8607F8A3D3BE05BE25AACE7FEF3063DF28E22A522FFF0B6FF6A0C61F79B02A408E8E1C775AB80BE6841E9F8A9D030AE5518E3EA8A4E31E416E087D47919593598FD58122A9E601A57EF02DE183D56921811AE2253628125C24F93C84361C5EC99E7B16962BD96CA190C68F3AA9DD60CE3AA7610589813B4FB77A4688308D9BC72CBE918583E298E03AB95FC500209C14ABEB3A43BAA92DCB11CB523C4D17EB9C6697B56C8B61EDA05BF5789166F839291CFE2997B7DD462EDA69B0615F2AD82AAC0A32F4B30FE8725849C144A9C07799D6CE9D293C25D8302161757B8C8C8D07032D914EA7DAC275919A1DFA0D3348EC07FDC70266975722763EF85EC4AF9E14288C9659907526566BB3F2DD5DAFC0D422568CA3AE52486D3F2C18B667E5622BA7E52C56BF00F82AF2108CB4949A09179544F30758B7FB98C49EA160720991B14E2858D648F0585AD1BB1D08294F029BFE936154E9D328DF2E054004FC5C29070DF9EE50DCD0981D2BFB3AA7D6F637C4CE457C0C66D27E2670107A2B85D1F026BD970EF3FB7E32C60218D5E43A06D9CD26289A937B4FBAD2A831425728F3D0D30C6C602AF4B14411E9B3C7CF0B4D630614A9E03AC30BA2B024D496DA984D08854F1366012C2400A5C8268C2B126DEA5AEBA0DE7C92BE0AF08CA22E02604A753702BDCD642BBFA0CC91BD8375657A957306A76B6F139621481B6F15CB57BEE128954D30F552661F906D8AB42CF260F30F88993BB40C9679385F5C4639888973361216DF3C60C57D9B250F64B7634C94DDA3FD122713FD2405A7B71F476C263A781DCE271E7D0665E45DCB27F7293DE57312396C58C40E268F57ED856F536C8FEB4B0060488DE3C25949D2B7E64207576641B34920D04B46766AA2978D9352C2769D49F8599F3D0439C928532E0EE428A3773FA4D68E6052335C6D93368E321D750D296799FAF87B82C640A6E995D18DDA002887F141DB8ECE2584DA2FDDF848D38357D585CD619B1625A70A5D333561D6DE856ED9908D1E377EF7BE03B326594808BE58F7FB3939E939B73F11DAB3E572DBA41D43A046B8D2BB521728222D5A77DC886AC6F328D9A531118156D791D64F5DF8FF8BE8DCA32EABC3CB259B0F72B021CEB4DB36A6CD2FD149437B251F81F7588AE921456BEF1A79FE83447D80CADDBF20895667CA0E493A4731EEC901E03F66DE284400A5558922AD53D4E0FF7BC6C61640ADE0274C63D94E96BF6C642B790823109F53C3C27130A1EE38D448239187F5009373BE328AF866A9B8DD1BB735E8002296043C6FF641A432709148C707B900ECF46555D77644565D5998C096756F79B6F0E20850B8BF0528E78BF5FB4859BD655227873D289CCE47FEDA8414D09ED7E8D380FC4D580C7F44B01521E829E7B0CB2D2F345C517B65E2D476687EC9A4C160A3AC0B01CBAA588644D799B125910812790F06C1ECB1F1E64D5CCF92AE5E8147C98B0CFAD5626BAB5115844198E8C2AC1DF9A208FCD2D2891F4A29009F5B36D8E31383811A9493CF8E143B5AC8A14D48119CC16D2C6BF6826FC47D4B782FFC76B64401B8249777E32C1298606553DACF386A22809B599924A635796A1AEC3CD8568064852E54C95AD887D7AFE837F6FF676F69EE6288879F6D96193AD94A0418BBBA2EED5355876F2C3497448A5F8F3F83B136703D9A38FBB62784CC233DF448A5E88EB5F81A0BE97A16FD4CABA1D87A4BFB08E002EBA548F662D496A1478BB7C26C69CA4C100AA6872A4945D703CA812BDBA53AC86010AA1D2C53F29E46AD095936FF50DB8805DF4B08C9580AEECE3A6DDD828E7B5D4DABCAF112A6E35AB3C28A6DDC4D98AD1063C2ED72CAA50086E6B72090CC1F2AFEBEC6751F27EF51DD8557E53D928535D82A220F62BA0645E3C2618F3424EA1A339A138C9B8E26B14BC32D1736A4193C0C72CC402C3EAB58817335C1424BD6F38CFE16338611118B4100E4038D07DCA041C72E485C5290F0DDE601565DAE9CDF657A4C7839D3ADE72986AF396E767430125786E219BC5736F16FEF66B4014E5961CFB4CFEC4CB2A32205A92DBF1399E2710395BA1240D48277C120526CD9E2352F7D04D89CC2754379CE80A2CD1AC765718B8BA61EBB8BC6D0D407022E7AC672065FC8503BF5BC4138520CAE233EA997463D7C9E00BBD852F12EC17C6F1DB1914446AA21E156D210094B699B4117B31EAE6386DC0DE1F55CCEC09AA1EB38CDE4602598D452732C5EF8B07C477E3E2DD470737EAA7357E2E8B74C31A117B519BDCEF79B6B044148A10468E38B5A6B7B10D74C6130A60A268ED73DC9A25ED68AF354758FA3F57ED3558DA654CACA7150A8E4449D0EF640184A7A33D00BA765B01C442E88D9B4257B93904ACE04375679BFD8271A03073E34C4A1C0437C4009A9590CB98D0B5581DC83407F04A22C9B0246DE38E1A13F9B1191493818783950548BE562F940240CDECD4A50C94E406B1BAE04B50A3A19E7923183E3FD356238C45AE6559193E0E846DF0FC6878BE6C963AA8C3508DC31F766A4B29C78D749C89985AB8F580DBDF7993A2261CC4BBE489C3BBB38C46739BD2516D3C64A93F10CF559DB6A0EA3BAFEE8B43F696A5288C66509A57C642BBEAFB40F4CD0649B4CE25B6FB2EF5529B73556051213BB39CC4F1DC8004B1588C8DE836699C66CED567998523AD3AC303D9E13617CE6C1D2FC4C35B22A24504C51F64155F24D91D0E8785B40912B3DCEDEDE71A6933B36BB514FDD1D3D843AAACF2C1E79A5216622C20036C9C999DAC3A5A2D43FAC3B23119927806F497B4048F561A2276FDA0302423147D35579DD4411416F0F59273429AC0464AC49B230E29DC124115D18A045663D228BFDAC9F57B0C5B4 + +count = 63 +seed = EAA4FB8EF0290A499A1D92EE398A8D7E71CD3CBF01A36750DA4B7EFF175DA26D17AC4ECE49A84C88D1D2C2493563C26D +mlen = 2112 +msg = 2E086FA0C4582E0C6CCB020F86A6107475985160BED201760D6489CB05B8D21452C81BD5D317F8857703DABA24E968F3164C82A4A9751DD88742B72141734DC0B4A77CBE2AE1C287A396A2F5804519456CF1EAE273A5C6361F52C35EDCE5ED7388D61D01AC040676522C9FD7B02A7DEAFDCB4169867EFB69792210A7069287C5DC958D0953C36F84D9A26989DD3B726BE8B94B41DCBA1B5374123F55A6DBD6360698551C27D16BAAFBB0ECBE116B44F11425DA45D7FE8ABA91697D83B6896A06A7888C97A91406B81B3A5BC8B68A984750893114B4011B9C8BEBA6F5C2D7D9F2C7A27030555633A0F90E30753A04B1958141AF7C1B95BA208DA36F729673D20DA0A83F913BEC8049F8CD032D9F9DD94B2086C61643AB2CFFDDB2B9BE0AF996D642B7A0A31CE0EEC8C61B343ABA980FCDACE9CED7BE4C9048B356D41002EEE0433428846BA4220EFB7F493FF57B0C706282EEE448CF7DA9B17B32D0EB0016983175469AA5BBA53489EC56BA3A92A70FDA2390E3A5D8C038F496E7C3180C6971A39491EAC10D828D44B3DE2BE64569B907005783E62710B9AD8EB8C9AF4B04993D40D1EBF165EFDEC748FE9F6B334DA6A30C568BCBAD095998A47242CA16803FE1720FCAB85233AD76EBDE102A5D93AB98460494BC886BB04C05AE89E157967747F8C050B33CCA52ED5E59050965523EC5C4EAF94CF2F2EE80C35AEEDD14E65D937C92855D03FC76ABAAD57A21A42420819EBB9AEB65F031F9C4BA0AC2EA27289E941DB89669A0620797091AEA3EBFC2AC354E94D27894F444FF9E604C8BDF7D6C00DF0E7FE9827171010445E737D0A5867636E3488EAACCCFCBAC1030C0DFAB639AB45C5AC5435E2C5B8244E58C3A6BAC81EEA408020BFEC66EF55FDDC618083ED737F4DD3BB65474487CADDF3AA2720A6931FC69533B6491DFC7E6E5FABF8103D05F870BFEFDDEFA20822A68A710B517065BD2478CE080E5DEA09EFFBA3A136C1BC9D7D8088F736C363B30E2AF2A6F2395EA8161CB64079340FA642C7763E3BF0623C968A16263CDFDF1B8334E427955E20C1EBCE8C8CB136DA8D002D8A9E5DA3B1F56668C1C59E20DC3BE026A43F40910D3A2B601D9D3EA2BF6D2C2781F976BA840FC986C8AF0DF84B8B0FB291D1310039D6914F8F7CC6B26CC33AF94150253E8EB410344A64344A5A0C06E0F3AA23C68617C6F4659DF79285782C89BEA3091083A069EF8F048371CFA054DE45E32C19A44DB5D435BC8FEF5570B68D80D5BF5DC06DA13C36E3AEA341CA9FE20047AC30683AA9D862306534EC93E79EFF79FE22E3BA15E2BA3F59F7B8B9314DCE31095D3015710C2927B54BA6F46D3981975229EED16C9B17813801C7D3CB3604DE9B7A4F18C2F91B2B50C1F43E87198AFBAC718935DB9CB96D9FE048D969635CB9F4DCA659AB1612A698CE45336B8D9FF5468301BF05D04B3558D66E88DE88427FE87E65D36D3C29FA3FB126F1F294E9BB391EE427001C34126C6622905514CE153682754D7FB1C985AE4DA600AADA1593A0A214332B310620B1B4E95BCBFD6EB8A241CBE848BAB37462224994E0D2F3F4B521DCA4A9A5AB10BEE741C5919907AFD2552D4AA300ADDF67CEC2862420C8D1D8DFFF60FDBE2D4A8D03C92E23BDB3400F5390EE4B141C5843B1E2C07C9AFDBC70E3FC08E2840EBF3B0E5296E1EE44D12E68240FDF063C07BEBF01C08586E8153068C1ADC744A7B54F53B0FEC3C752DA9F6F989A1AFEA4ADF1AD6AE926CABE4E0CB2CD864412DAEE377DE559A38047F31E834A6CE56D4041BA709945F07E514F96D783F32B0EFCC8B889FAF2B6D217246BA7C07B687E028F23D2409BBC12D6EC0D94AD9697BAB6395B7070B6FEB2E907A119209C9B7D86AF953BA7D2EA63982BCD794A5BAC69407BB7CEC5E027833B17420F146AE08F4B753BEF6CA0922F3294CD2A670127F9D2A2CA78A30F62056A425CBB7074C9A55135BD06CE677ABDF33B420F66CFDBE9461BFDF385A97439B3431CD29DECD9B5E59EC3ADAAE879A4E8D5E28CA13E73FCDBA51C828DE271207A5DEAB373B1B6677A29ACB87CBB01F10CD2C090EE66D472E8DB61615A5ECB84A7FF0988DD0DF9831BF43D732A12EC8CD50A86ADD12A5A2EA765744B05F73725AB8704ECCB08BD74517F21054E58903481E7A724F7FF24C43D6CD23DE84CD69C9E464E67003903C3858A6724247EB929716E170E2D2739AAE10B88BC3FB8FFA849E385B4113E78C24DE1673FC7E7285E6E3744F3843AC7BE7EC16BF74215694CE467A2E859DD4FACAB86250FECE28E0A6A31DD529D08566A6389B85C310C28A8DABBCCA9CD6A631EF0473ABFD6846D8326561CC9CB8181C1593D0F15EFB8129AF9E838AF518477CE361640169D9731FC139881D452773F21A3E79E514DDAA513D7B9F3399C0C57D21EAA00D44A7F031B79CAC9FC304E936E75A0CF8D204A6CC3C0FA7D037DD8ACC3A33CF5718061FCD57EBD06A607FE0BB0204E687B2A17B1FF47DA357B51A753076CB89422098D4F880F831842957E648C54ADBFCC0E488A95581E709B5A5A129DA7EC5B00AC9B18B80533F2DD1BD0F475A61DB18FC0C4EA655F602B207B572234230C831B26CECB7BC3284797C4BED5A977C3BFBEAFEA3DBFC4257D4C2C5BB8689830EE157F3B5AA1EAC09CFCE0555880A074AEB86062A8ACE19ACDC1A25F8D0E454F50F119D12E707D103F3C1A502D4E358D563E53554395B5D386AD49363978AFBCA2F8B673A693ACEF70D1DB4CEAA8FA580160924D4F18119BE46C71E09FDEE45EFB14A74DB1C688E99E24CB6025E73A3E7F0F7EA9C485274D2B6CF9784CBE39E388F9CCF1E2E8DBFA6DB43355391A369DEF645F815424253ABD0B6DE9C0A0AF156D9A4EB7474A2E5937F008134DEBC9FC7E54812967FCF5BCE28FB5CD43F1AA240BA2E9CEDD6F350D556DB1658868091E6034D7E1EE5C6645D0A345D46C42E23C6821C360F5ACD13F589 +pk = DE481CD721F5CE98C9B732CCCD5D41B49BDFEDD3EA99DD3F83E5AADA3EE15201CE6B908D138453A0EA02F61D8F9918C077A668613A312775510101375559220306 +sk = DE481CD721F5CE98C9B732CCCD5D41B49BDFEDD3EA99DD3F83E5AADA3EE15201CE6B908D138453A0EA02F61D8F9918C077A668613A3127755101013755592203064D33CDD974BA5C393F722E01625E9D6983010000000000000000000000000000C47FA52BBF11299A533245EC6324E50501FDFFFFFFFFFFFFFFFFFFFFFFFFFFFF43B89AC0B668222350B4FC357BFC57A13FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000EF91B934B59120879DF66D8900BB71F00C10679AAA321261DF027FBC356C3500FC1833C725CF1D06B22DB70F9754CAEE795098947DB994195C8860FF114B5000B748F69B9506F05635110678A032816D86C137BE9D3C631F4C4DA83A1FC29A00313F6B8E6771406B80D329BE244F26393C3A2B8D76E913D1C02EE5CB4DDB1900 +smlen = 2260 +sm = 203B38A4003613A48A4899D7300B27AFF10D7F2228ECFD37B12782278E752C022DC95A8AEF95143762A66770ED7BB18767818A834B18AD7A110EC6AD3F2E0A000100A367120CF56D0D9A88B26E74D01DB5618A0E936B5C9D8C76955E712AA4666C5CF6256CACCA2EA0195CECDBB2D5CE2A03FD424A9AE4629FDC9BC011C1592CFD281D9460EB24E3073E3756EA68748E0E000B0B2E086FA0C4582E0C6CCB020F86A6107475985160BED201760D6489CB05B8D21452C81BD5D317F8857703DABA24E968F3164C82A4A9751DD88742B72141734DC0B4A77CBE2AE1C287A396A2F5804519456CF1EAE273A5C6361F52C35EDCE5ED7388D61D01AC040676522C9FD7B02A7DEAFDCB4169867EFB69792210A7069287C5DC958D0953C36F84D9A26989DD3B726BE8B94B41DCBA1B5374123F55A6DBD6360698551C27D16BAAFBB0ECBE116B44F11425DA45D7FE8ABA91697D83B6896A06A7888C97A91406B81B3A5BC8B68A984750893114B4011B9C8BEBA6F5C2D7D9F2C7A27030555633A0F90E30753A04B1958141AF7C1B95BA208DA36F729673D20DA0A83F913BEC8049F8CD032D9F9DD94B2086C61643AB2CFFDDB2B9BE0AF996D642B7A0A31CE0EEC8C61B343ABA980FCDACE9CED7BE4C9048B356D41002EEE0433428846BA4220EFB7F493FF57B0C706282EEE448CF7DA9B17B32D0EB0016983175469AA5BBA53489EC56BA3A92A70FDA2390E3A5D8C038F496E7C3180C6971A39491EAC10D828D44B3DE2BE64569B907005783E62710B9AD8EB8C9AF4B04993D40D1EBF165EFDEC748FE9F6B334DA6A30C568BCBAD095998A47242CA16803FE1720FCAB85233AD76EBDE102A5D93AB98460494BC886BB04C05AE89E157967747F8C050B33CCA52ED5E59050965523EC5C4EAF94CF2F2EE80C35AEEDD14E65D937C92855D03FC76ABAAD57A21A42420819EBB9AEB65F031F9C4BA0AC2EA27289E941DB89669A0620797091AEA3EBFC2AC354E94D27894F444FF9E604C8BDF7D6C00DF0E7FE9827171010445E737D0A5867636E3488EAACCCFCBAC1030C0DFAB639AB45C5AC5435E2C5B8244E58C3A6BAC81EEA408020BFEC66EF55FDDC618083ED737F4DD3BB65474487CADDF3AA2720A6931FC69533B6491DFC7E6E5FABF8103D05F870BFEFDDEFA20822A68A710B517065BD2478CE080E5DEA09EFFBA3A136C1BC9D7D8088F736C363B30E2AF2A6F2395EA8161CB64079340FA642C7763E3BF0623C968A16263CDFDF1B8334E427955E20C1EBCE8C8CB136DA8D002D8A9E5DA3B1F56668C1C59E20DC3BE026A43F40910D3A2B601D9D3EA2BF6D2C2781F976BA840FC986C8AF0DF84B8B0FB291D1310039D6914F8F7CC6B26CC33AF94150253E8EB410344A64344A5A0C06E0F3AA23C68617C6F4659DF79285782C89BEA3091083A069EF8F048371CFA054DE45E32C19A44DB5D435BC8FEF5570B68D80D5BF5DC06DA13C36E3AEA341CA9FE20047AC30683AA9D862306534EC93E79EFF79FE22E3BA15E2BA3F59F7B8B9314DCE31095D3015710C2927B54BA6F46D3981975229EED16C9B17813801C7D3CB3604DE9B7A4F18C2F91B2B50C1F43E87198AFBAC718935DB9CB96D9FE048D969635CB9F4DCA659AB1612A698CE45336B8D9FF5468301BF05D04B3558D66E88DE88427FE87E65D36D3C29FA3FB126F1F294E9BB391EE427001C34126C6622905514CE153682754D7FB1C985AE4DA600AADA1593A0A214332B310620B1B4E95BCBFD6EB8A241CBE848BAB37462224994E0D2F3F4B521DCA4A9A5AB10BEE741C5919907AFD2552D4AA300ADDF67CEC2862420C8D1D8DFFF60FDBE2D4A8D03C92E23BDB3400F5390EE4B141C5843B1E2C07C9AFDBC70E3FC08E2840EBF3B0E5296E1EE44D12E68240FDF063C07BEBF01C08586E8153068C1ADC744A7B54F53B0FEC3C752DA9F6F989A1AFEA4ADF1AD6AE926CABE4E0CB2CD864412DAEE377DE559A38047F31E834A6CE56D4041BA709945F07E514F96D783F32B0EFCC8B889FAF2B6D217246BA7C07B687E028F23D2409BBC12D6EC0D94AD9697BAB6395B7070B6FEB2E907A119209C9B7D86AF953BA7D2EA63982BCD794A5BAC69407BB7CEC5E027833B17420F146AE08F4B753BEF6CA0922F3294CD2A670127F9D2A2CA78A30F62056A425CBB7074C9A55135BD06CE677ABDF33B420F66CFDBE9461BFDF385A97439B3431CD29DECD9B5E59EC3ADAAE879A4E8D5E28CA13E73FCDBA51C828DE271207A5DEAB373B1B6677A29ACB87CBB01F10CD2C090EE66D472E8DB61615A5ECB84A7FF0988DD0DF9831BF43D732A12EC8CD50A86ADD12A5A2EA765744B05F73725AB8704ECCB08BD74517F21054E58903481E7A724F7FF24C43D6CD23DE84CD69C9E464E67003903C3858A6724247EB929716E170E2D2739AAE10B88BC3FB8FFA849E385B4113E78C24DE1673FC7E7285E6E3744F3843AC7BE7EC16BF74215694CE467A2E859DD4FACAB86250FECE28E0A6A31DD529D08566A6389B85C310C28A8DABBCCA9CD6A631EF0473ABFD6846D8326561CC9CB8181C1593D0F15EFB8129AF9E838AF518477CE361640169D9731FC139881D452773F21A3E79E514DDAA513D7B9F3399C0C57D21EAA00D44A7F031B79CAC9FC304E936E75A0CF8D204A6CC3C0FA7D037DD8ACC3A33CF5718061FCD57EBD06A607FE0BB0204E687B2A17B1FF47DA357B51A753076CB89422098D4F880F831842957E648C54ADBFCC0E488A95581E709B5A5A129DA7EC5B00AC9B18B80533F2DD1BD0F475A61DB18FC0C4EA655F602B207B572234230C831B26CECB7BC3284797C4BED5A977C3BFBEAFEA3DBFC4257D4C2C5BB8689830EE157F3B5AA1EAC09CFCE0555880A074AEB86062A8ACE19ACDC1A25F8D0E454F50F119D12E707D103F3C1A502D4E358D563E53554395B5D386AD49363978AFBCA2F8B673A693ACEF70D1DB4CEAA8FA580160924D4F18119BE46C71E09FDEE45EFB14A74DB1C688E99E24CB6025E73A3E7F0F7EA9C485274D2B6CF9784CBE39E388F9CCF1E2E8DBFA6DB43355391A369DEF645F815424253ABD0B6DE9C0A0AF156D9A4EB7474A2E5937F008134DEBC9FC7E54812967FCF5BCE28FB5CD43F1AA240BA2E9CEDD6F350D556DB1658868091E6034D7E1EE5C6645D0A345D46C42E23C6821C360F5ACD13F589 + +count = 64 +seed = 5909111F333F3E939105DFF8532548927EBF289F31A72F4C1B0C66816D8B68F64622F36A9BC85E63601BEE8EE7CB3DC5 +mlen = 2145 +msg = 5180B7DE9A84F651DA10D334009B3D65582F3912D329FBAD4AE39A9EEC78943338C29DB4F49EF41E3C50DABBB530E99113440383F20D5A3A8AE279A6201A0C84B003F6717C709C21AE893B6E412D87F8E0CEE5A89E60A14CE975A4D42E4F43F4710FC9FA29E9B2AFA93441EF5570123AA88AFF009E2507A3E60A79CDA25652E3AC3AC0C10A816BC04739B6FC758FF9AC467879BB67F270E4EAB43F10A633E5932B8D6DCF23814DE8643407B17B5E2A91B340F7BF6882DB694DE4DEE4C480CE037B9F9A220ACDCE84B03746F307A6026531D712C0630E7DE3ADD3A8516BA602D2463E3478008B3252B658FEA54DE41265B5C81E4E913EA0E2A63309497ABF961EC40AC374ADC0FF3C6FAE9BFAC5CC2DF475885B0BC636702828489183CDE1A2934F2D63828AD1F2B8CFAFFA53151B0FFAE6224DF54C2AC47CC8844B76222C2A3B6E132071150049B6E46AA75DEA28C13477980315FB64CE500BF0C6F633AE621D65B331BA96CFAC162DD7897B8505257E228CB621BBA9176A7AFB3A2CC20D7804DDB3AAE4B87FFAFD3C8DC541D05624DB02BD62491067EC1CDF73147014FEBCFA5B561756D5E7A13B88D1E7B2C0375E1D0DE71ED20CA9CC4E6DACDC579F1AB024AAE2A0BEC9004E5DD81C046F00A2A4CB767C4EB240D205278CB863D1A61DEF16635C6A84C2406288410FA4B73B21077D8F7A4075A1DDCA3D0D334725151E434BDA80D3E73593338B07958D27337E32CDE0010DFE5E58B99EB27A97DBD1C5E6F9A552A02726AAD5A4AA63EDC336D83E5870DBD514193367AF2274804628B4EEDFDA3B2A155694E89F5A6798C5D6E036159C1F00D8DFB03D41940E775974B11C3FE4456E07B127CCB44E6FD6B2918F57A6523D7F77F32478D9F1BB539846793D4284E2907830E5EA76054802A266C85B122A389EAF4700629036716E2869C0FC9440856D562711E903A1853BC68582A95344B612E5CBC7C5B2AEE23CCE4161A75829B2048742FBD65ABFE2397CC7D66023DE34DF4F2DF8540CCE9781ED6482D29CA4E906716C8CC9596B158EB51BAB8C2E00253D6589A99B3D20FB494834B42BBFFB80E7B0441E356B541F83877736985F6330EA459C007CE8BF18D84E78E36482D581DC7DF97528CE15F68E604B4DE62422B3AA76F3E7E5B33A49CBA9D89FCF50DEB65EE45173795393A50FD4C60CF6BECBA7E733513537D13F89FCF1C4D6437DE0EAE608FB11D68B9ADC0C3A19A3565F6D62BA81A326EC334B239B212B87320C03A75C58DC8F828C4195ED9D7ACDDCE493123E235D098E9DC60F5D3A625E1FF66F245E9977F9630A40D26E3AFB6676F5122A88CE5507BD825757D9CCD53FE574FD0E6E728DA355403AD664FFDEAAF636256FADC3283D6F15B297F79216833CF2C745C4C5E17D03260A69178F2216168BF8F00C9889E1E35540254F150C587A884CDFC9E5F7D379BE474356C06943E416EB0697A1AE989AB4872D0BDF436D9FFAAFEC1631C9939FCECB84DB2846F12CA395F506687B4A5638085BC6EF58FE8E2ABE9F8D51F272EE855E2DB84A89D348DD66950B8F43939DB897C519FA302594FD1FBD6B6E94CA8FF63A7949432DC2D35C60803A570B1DAC95EE0A60C62FD18B3319601AD29A156400D392DC9A14FF50AF6752C1F6EDC2ACB7ECCA71097B6E82227DE429F1A29C5E38ABEA1C74DE06E6788CB1790AE9F0E8AB35AFE60B001F45971D42949263AA62519B0D630281A4C5788D5591B1EF5A003C58987E8665701E5B1C6063F93533094E96820F918C354903775CEB6675C4CE9CF940C4BEB8845B4F5E1F642BF505821E5A23122E2D1ADB82A63AD18CD1E4775A96CA9EF9493D75FF784A2D4A99F54DC3F87828BDFF4B3A3D98FA5A29B62A85CAAFFBACE4592A81BFAA5B8BAE6606AD25A92A43140690A6003AA2D617FC707A53EC9D868E33596E098773942D798263F58FE5A1B23046CFA136EA35203B90BEA2C5F0AAEB5EA8C24B8B8CBA14CDEE28F45D0278F193228484BCC7E08A75D0064D605D674ACA9019A0A9AAECD6AC672CB8410FEE4192E6DCA7855FBB1C584CF288BACB40707D7E6F8BA2956F6D099F52BC7B0AD72B5A3FFC03C7B47086330244EA5D393C6B9F256FD82D5CB9436A469ACC3F8FC237146895BE148749F82D39B7BA4CE47715BB393A96AB471665529AB9E9958B12396C1BA7529DBF289184FF0F635C2BA9DF301036C869D52D993463222B70BA778E81C8DC668DE41C0356EEF5C39F1BD42398BFF30F959E115C6B386E73F0FE28A2665BD463C781DA1C46D6D4EA284B152C8C12426DC9CC467809BFDA6FBFBC0BB4793BABBF6AD564D57AE9F5E2B7F651D6ED980F8B1174A126CC58B23C32BA73F5031B3FCABFE7BC360AAE412D799CC14D8B252D9F9EC9005B7FCA04A88CC8AE9F7AEFCA94137003D5764FAA3C7C45670585C84F74C4EBD1F5AD1F97EA093595592FB90E3CAB01F98F06E114F13DE67CDC36F3FFB01C3D51EA643C25A3F6AA2C57690E42B98583D925AC7B06A349782A1D33C06BD05A82A7AA3DD679326D948D74A1861926B45DB78D36070D3087AA9C5F4F42CA57EE9CE7035BD88A85CE1107C8E07E5BA3A62ECF012BC75FBF97C4C72331B55AB9A6EFFD78869F1CD3F330526F262F7DFCFA2B084B61E90772D5FCE8F038C0F72554467192CC8A27F1F53C8714DA1864815974B00991F466648478C5F9BF036DC4083D72E8D144AB10FD32408DA7677729347FEBC79E48E7B87388D9B59AEFC84B5B3B589FD91863811A6436ED76B43E657F7EE03EB796285A4D93BE9AAAD1E1A1E81687E42EC83F3DD059B78BB7F8EC70E6C831DB5E90C6B3AA511F36507DBC8E7A77DF0F5B9EF03BFEFE9471DE7C7FBE67B9922260D3703D95A5BFCBCB62D830E20C23C6CFDDC210E47CB575957D8C3514A2ED4561C738928F210057896EAEB1499D4DDC70F44E30661E780AAF5C0A20C8553F40D7D3FF6D120511C1073510D04F2DE544121AB851E98F666906367C21302EEFB1AAA723F6A531C454EEA0BE7D50 +pk = A417371DE74E68BDFBE1ECF81551C9A0356B9F38FDBFE177BBD65A9D9F97AA01E526253B5434DA9C1E888E947027C13382130D9254A258753A1FBE14858D4C040B +sk = A417371DE74E68BDFBE1ECF81551C9A0356B9F38FDBFE177BBD65A9D9F97AA01E526253B5434DA9C1E888E947027C13382130D9254A258753A1FBE14858D4C040B43E060C9E9478B3DB0E3B0C968D404059E020000000000000000000000000000B05BA684DA4B8921C61CC6E1DA7521C525FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D9F076033CD3F30E152E16E3654BFE522FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000006EFED680CC99590418718D3240967C6D462F18FE14CBCC08A52E202572662600B7C0679274DBD4415141C70EC61DEB968AF09153C4D4450C55ACCF05DD8A55009D8693A6BCDDDCB3EEDA55262A4678C7525996399F0A2516DB4F4CA60F9E2400AB6E23C7500DA3CD3AB13B8E59DD91CA508A846E0501BA8E78F7C864EBAFD000 +smlen = 2293 +sm = ADBFC5DA731CC43221D8281A0C263BF2A5002081B2FC228626125BF47DA0FC04033FECCB402D692CAE29E4BEFF756F211316E38E17EFBE50880C36B18A6E290100014DC8BD826B0B33EA5A96D79A2B9208FCB6C8A011CC3FB4E08E97387B9B01F1AAD88DF7A848CD1ABC45F22BB6C579E323AEC832DA8447BA54F358723D2640EDD6F39D62120CCFD4374B9EFF59599CB801190B5180B7DE9A84F651DA10D334009B3D65582F3912D329FBAD4AE39A9EEC78943338C29DB4F49EF41E3C50DABBB530E99113440383F20D5A3A8AE279A6201A0C84B003F6717C709C21AE893B6E412D87F8E0CEE5A89E60A14CE975A4D42E4F43F4710FC9FA29E9B2AFA93441EF5570123AA88AFF009E2507A3E60A79CDA25652E3AC3AC0C10A816BC04739B6FC758FF9AC467879BB67F270E4EAB43F10A633E5932B8D6DCF23814DE8643407B17B5E2A91B340F7BF6882DB694DE4DEE4C480CE037B9F9A220ACDCE84B03746F307A6026531D712C0630E7DE3ADD3A8516BA602D2463E3478008B3252B658FEA54DE41265B5C81E4E913EA0E2A63309497ABF961EC40AC374ADC0FF3C6FAE9BFAC5CC2DF475885B0BC636702828489183CDE1A2934F2D63828AD1F2B8CFAFFA53151B0FFAE6224DF54C2AC47CC8844B76222C2A3B6E132071150049B6E46AA75DEA28C13477980315FB64CE500BF0C6F633AE621D65B331BA96CFAC162DD7897B8505257E228CB621BBA9176A7AFB3A2CC20D7804DDB3AAE4B87FFAFD3C8DC541D05624DB02BD62491067EC1CDF73147014FEBCFA5B561756D5E7A13B88D1E7B2C0375E1D0DE71ED20CA9CC4E6DACDC579F1AB024AAE2A0BEC9004E5DD81C046F00A2A4CB767C4EB240D205278CB863D1A61DEF16635C6A84C2406288410FA4B73B21077D8F7A4075A1DDCA3D0D334725151E434BDA80D3E73593338B07958D27337E32CDE0010DFE5E58B99EB27A97DBD1C5E6F9A552A02726AAD5A4AA63EDC336D83E5870DBD514193367AF2274804628B4EEDFDA3B2A155694E89F5A6798C5D6E036159C1F00D8DFB03D41940E775974B11C3FE4456E07B127CCB44E6FD6B2918F57A6523D7F77F32478D9F1BB539846793D4284E2907830E5EA76054802A266C85B122A389EAF4700629036716E2869C0FC9440856D562711E903A1853BC68582A95344B612E5CBC7C5B2AEE23CCE4161A75829B2048742FBD65ABFE2397CC7D66023DE34DF4F2DF8540CCE9781ED6482D29CA4E906716C8CC9596B158EB51BAB8C2E00253D6589A99B3D20FB494834B42BBFFB80E7B0441E356B541F83877736985F6330EA459C007CE8BF18D84E78E36482D581DC7DF97528CE15F68E604B4DE62422B3AA76F3E7E5B33A49CBA9D89FCF50DEB65EE45173795393A50FD4C60CF6BECBA7E733513537D13F89FCF1C4D6437DE0EAE608FB11D68B9ADC0C3A19A3565F6D62BA81A326EC334B239B212B87320C03A75C58DC8F828C4195ED9D7ACDDCE493123E235D098E9DC60F5D3A625E1FF66F245E9977F9630A40D26E3AFB6676F5122A88CE5507BD825757D9CCD53FE574FD0E6E728DA355403AD664FFDEAAF636256FADC3283D6F15B297F79216833CF2C745C4C5E17D03260A69178F2216168BF8F00C9889E1E35540254F150C587A884CDFC9E5F7D379BE474356C06943E416EB0697A1AE989AB4872D0BDF436D9FFAAFEC1631C9939FCECB84DB2846F12CA395F506687B4A5638085BC6EF58FE8E2ABE9F8D51F272EE855E2DB84A89D348DD66950B8F43939DB897C519FA302594FD1FBD6B6E94CA8FF63A7949432DC2D35C60803A570B1DAC95EE0A60C62FD18B3319601AD29A156400D392DC9A14FF50AF6752C1F6EDC2ACB7ECCA71097B6E82227DE429F1A29C5E38ABEA1C74DE06E6788CB1790AE9F0E8AB35AFE60B001F45971D42949263AA62519B0D630281A4C5788D5591B1EF5A003C58987E8665701E5B1C6063F93533094E96820F918C354903775CEB6675C4CE9CF940C4BEB8845B4F5E1F642BF505821E5A23122E2D1ADB82A63AD18CD1E4775A96CA9EF9493D75FF784A2D4A99F54DC3F87828BDFF4B3A3D98FA5A29B62A85CAAFFBACE4592A81BFAA5B8BAE6606AD25A92A43140690A6003AA2D617FC707A53EC9D868E33596E098773942D798263F58FE5A1B23046CFA136EA35203B90BEA2C5F0AAEB5EA8C24B8B8CBA14CDEE28F45D0278F193228484BCC7E08A75D0064D605D674ACA9019A0A9AAECD6AC672CB8410FEE4192E6DCA7855FBB1C584CF288BACB40707D7E6F8BA2956F6D099F52BC7B0AD72B5A3FFC03C7B47086330244EA5D393C6B9F256FD82D5CB9436A469ACC3F8FC237146895BE148749F82D39B7BA4CE47715BB393A96AB471665529AB9E9958B12396C1BA7529DBF289184FF0F635C2BA9DF301036C869D52D993463222B70BA778E81C8DC668DE41C0356EEF5C39F1BD42398BFF30F959E115C6B386E73F0FE28A2665BD463C781DA1C46D6D4EA284B152C8C12426DC9CC467809BFDA6FBFBC0BB4793BABBF6AD564D57AE9F5E2B7F651D6ED980F8B1174A126CC58B23C32BA73F5031B3FCABFE7BC360AAE412D799CC14D8B252D9F9EC9005B7FCA04A88CC8AE9F7AEFCA94137003D5764FAA3C7C45670585C84F74C4EBD1F5AD1F97EA093595592FB90E3CAB01F98F06E114F13DE67CDC36F3FFB01C3D51EA643C25A3F6AA2C57690E42B98583D925AC7B06A349782A1D33C06BD05A82A7AA3DD679326D948D74A1861926B45DB78D36070D3087AA9C5F4F42CA57EE9CE7035BD88A85CE1107C8E07E5BA3A62ECF012BC75FBF97C4C72331B55AB9A6EFFD78869F1CD3F330526F262F7DFCFA2B084B61E90772D5FCE8F038C0F72554467192CC8A27F1F53C8714DA1864815974B00991F466648478C5F9BF036DC4083D72E8D144AB10FD32408DA7677729347FEBC79E48E7B87388D9B59AEFC84B5B3B589FD91863811A6436ED76B43E657F7EE03EB796285A4D93BE9AAAD1E1A1E81687E42EC83F3DD059B78BB7F8EC70E6C831DB5E90C6B3AA511F36507DBC8E7A77DF0F5B9EF03BFEFE9471DE7C7FBE67B9922260D3703D95A5BFCBCB62D830E20C23C6CFDDC210E47CB575957D8C3514A2ED4561C738928F210057896EAEB1499D4DDC70F44E30661E780AAF5C0A20C8553F40D7D3FF6D120511C1073510D04F2DE544121AB851E98F666906367C21302EEFB1AAA723F6A531C454EEA0BE7D50 + +count = 65 +seed = 238461A224ABEECCF709AB6CACF4EDD372D45E5F4274095273A49AFE614F2BF713134ABF68B4DD058E6D7B612C3658C3 +mlen = 2178 +msg = 99B5B6FECDB52897A1958C5C3D1FC2F20B7D045F551856EA3CB441BAD9089C64CB9489DB6B63E0655AFC4C2FA73C7417FF1B80B9C7A1D659687D2C415B3A909CA30E96849D4BCEC6A9A6A4311204936BA972086B2394D86E840770D01550CAA6AD85ADC0EC851D2B3808E4A0E9830B99A70F6204ED4DBCB6759F6228126039607AD7ED8EAFEEA28D1C3E25A46BC18AF7E01F55FAD8244F15DE36F890416AA09548554338972C5F88FD9357792819E51A63D0B872B0A4D21EA3597405B52793D50C6CD70B52841D53484BCD3EAD004CEF0A6BC16CE74CB8AD0848000D8C5158DC16625112D1D85D17A3C1C8BBDAEA42C3A43E9930724655592116C4C6D0B8B223337EE4E754541A09D898F7FED71C3785B7F8721653986C525BC00F15590616437D11F9722824DFDE7E9615F1FB8488E5327E4D8BAF5F79D1FF5E808D154951AD87638910607B03FAAC3A61FE9916BA65FFD16986DEB4169BD24A72B1C8168FE569F3C81F93F3EBDD21D4E806F79FB28550912E9AFFFB52E97860C4DC0D042C56E1BB71C28B68E416874EC7043306A29BD1F4B9A3E612A6778315E2C2B850D6EAB9FF1905030FADA250CAF308735393C191134F3C493D00B5695775D82ADB9F2ABDAD17FC41FBD7A1DEFE337C2F8ADF69154CC0862FBD43035295B1A9C80B88FA8CF75B36CA08868F881966B41FB3E239EB1DB9CB51606A0A9EBCD552B2F4E819E2C30ABDECCDDE88D2D2F82F3585B5143943C929591D20CEF559CD2BAF2DC7FE03C9E4E084E8890FCE64A4AA9F13D5EB945AD7E3CC53E01FCDC192B97ADC1F98D9E773A0177E8D97405808EBF48BF17B689BFC15F4C515E38A855A9266230C9085ADC9A6DDAED93D80C3F38BC516695D202B4E89DA5B4EBC43788C848F8C4A72F79F37F857EDC105F13E4ECECFD09302711BC1993F5308B8F32AB96FB8EC3F5EA0531DAFD0AB3451F81F47E62C593C8D3E3BEEE79DB06909576BF876145856F5F716CAA436C98EAB28C5B85BC2E4D7E1653ECBB8BB6B5BD6981DC72D7F63BA06CAC8197ECCDC72C1481DB44724A3C21F7FC60661F11FDDE8122DA5D0B1D72A29952618B373423A892875E6AD24D0916109ED8E9A9A8D9A68ACEC4BB5EEB0D00EAEA72D8D5A76C2A42F18CBDB3D336B71C70AC73D39D7EB04533453779A1F210BB4FC056B4728AFDFCF46675C6AC76F750626D642E3AB117E5D6740154759A46C27D51306587650E1039054B876849882E7DFD807BD03E69021E337DD69D9B097722C6D2AEB517D773D2F7D84D69DABE1A1D6422EA1766C0FE7B8DD4D7283F2985D96D91A132B8BA03AD85F7D56095773222D0AFDC5A192D29F3BB0C2539A1C99DB4E711B6ACE3FEBD58E45E99C9F5A04CECBB309D50397F28C48BB9CC9F9CF75A52253B634EC47216A1FD6358AF26501821864569879BE1736B0AD242AB5B8ED16A7EA0989ED4CAE3567AFE1F8209A028DB46DB0270B3BC06668A9BF5E1BC1061BABBA00EC4EC37280379139D19BC6072CC6B7D260A816CB82F9BC90897BE3025475AF12191690F9F400A914789A860155EFD2D606A15895378C827F2A4FF700303962FD96DB2DCD2D213EEBB2460F0B753BC6902DA81D44C983DD027F1171D40A2039997241E09AE5B6165B4D55A8E4C79671A8B8BDEFEF2C21F81C541A5719DEB939F866B61BE250AF371CEA7B7525094C904698D412737F7781BD779365F122EE627D9CD4A68DA9D5BE1B0431998AACF824CDD864C7365C01CD5A5F480B6AC1E5FEAD8FFE40D87C1F9FCE81867157242285C5E76CF9667919C29A67CA0C0A61D7819D9EE6B792250A358F5691CCD80578F15288F3D5D6D7DD6DFA351FCF8DF0223F7D1DA1B76711FBE0E7FABD30377660ACE7B23ACF03ABC1D973248CDD0897773FB74E20481EBD3E52657C9296B980905AD29271EC128513284F1B78F38634BF84CB80791A0C5649177791CDAB87769D57B626F78A03435C758A207F52BD2A1F31E34B6A122B8701CD9FE478C57CF3535B6D51EB46CAF794BD69363D5A56ADDE6945E9788F1E1DFD045BFBD0A68834B13D6B9EC4EA9C860EEA0E9AC19C2DE14FFBD6B57E5992B08943EA0283813F3F15E4F928B8D0F13DE6863990F5C77F130C97D8BE12571EDCEC7DEEC4B6EF4835F136DA45DA70A11F9192478FD8B4846C507410FD11668365B05252E68CB2C972ACF50156E369B83BB85E62E4BD4D84C2E9FF41A5844D5D88AAAE7DED852DAA0AE5C14A5DCE64C7E236E9B7B60F5B5AD4D953A2D842A52929491BE3555AB8DF534CAD56DBBB86B28A8A86B7BD9AD1C58C87B8A089324E00FDE32F8186B2B74523A22904C18ADE02C3E965F94624F8DF57E750EA6335E3EBA705294B76CD6ADA33D90FEC1F48DE7BA9DC7D8D60A53D2563964188874810C45736C57EFBC3A3CEEE7238AEE5281882A554F2143BDF89ED4BD819C08239C187C12A8B6E763434B92C26FDD658B350F51775C60CBAB7A2CB120DB8CE8AE9AAF6AF559F8CADE84C4820209CBD27CC09230B22F013A0E4CF8041E4A789A5D20BE9914A624AB957318848ADDB39C9748C8922C54327048A2E46523BFB22487538363459035BA49858F85A469957DF1F4831BB7FFA0564C53233B99B596F5356089949306DEDD6B904433D25C4854A80590B964DF6B0703B4F9628D6B9A4D3F0A4096E9A0B46D6B32F66D563BAF688ADD18DE001DA62E33C503A4387CE0920BA5D1E8B69C38E3745B19F8D8B6CA5E1AC6DE90EDB25FC32DF04F0849D769FBED3F8169EA1D2252619A2304E055370B4443CD23E56D4934F9F3FC92F1C1EEC626657E6A89C1394E56061AF8ECE3E2A17FBAAA4D579A99A7998632A6AE2683DDFFFFD27A27C8815511855F09ADFF7BC627A7A5C95FE57FA3EF81F494FA7EA6E6CA2D14775A25BEAF1B5A3E35ECD4A306545D597E4E44301C3D1648F0A7D841F2F76FE59C6EAFA3F5B58907FC4E642ECD28D16A71EE3D295F1DE12DE1485B9CEBEB2CC6C9AC051D3D42B6A1A068533A7680A98D015B09C5B819FFC61688D441C1B7FD71180C4423E64EE940917C7DFAA19F3F51CB5B38D1B2B7C81D10E7C +pk = 097B2D27CE291C033D1D0DEBFDD1F1134FCBD0892F36EE395607995F4978B1024727F6801AD193C762A99150B3D2C5328B3E8B6DC2D387305E9FECE3BA44CD0211 +sk = 097B2D27CE291C033D1D0DEBFDD1F1134FCBD0892F36EE395607995F4978B1024727F6801AD193C762A99150B3D2C5328B3E8B6DC2D387305E9FECE3BA44CD02113907FF70350C57A32A2E10E6430DBD46A702000000000000000000000000000004A0E20A46A68C47EF656BD92EBBC2520FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF45B8A30CF4D9BAD7976EA9AB557761B2DDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000D551BD5104CC9D52259C66348A0A7F5584D787D42C09E25EAFFFD614A2DE5C00E4CDBD9A24971CE525974893219D4BACC10BC7E9F357DED7993BEB0CE5BA0800A32219623AAE195170B1E9F0972D5A2E216C3F5A9427E15D9A7CE3130DF14700F365C4D6149C830445AE8A7554C658379D798735877CC5C2E3BAC45332D1B200 +smlen = 2326 +sm = 31CA43CA4F93BCA0F6C02D902EEC6B36CB70BFAE3ED1FFDCBA8D4F37905ECE00459C238F4BB652476249DFD5D01E8701EAF2A2E9CB3080209F9C729E971DDA0300004114D3CE3FCC93CAAB91871B74D84CE1D0C85CF9616E57DE26E24ECEDFFE2093AAAF251D48BFB259194316293EC3CFE4672EBBCD17B08C8609F9A61692A9303E5446C62E44C1552A586ACDA1E1110B00111D99B5B6FECDB52897A1958C5C3D1FC2F20B7D045F551856EA3CB441BAD9089C64CB9489DB6B63E0655AFC4C2FA73C7417FF1B80B9C7A1D659687D2C415B3A909CA30E96849D4BCEC6A9A6A4311204936BA972086B2394D86E840770D01550CAA6AD85ADC0EC851D2B3808E4A0E9830B99A70F6204ED4DBCB6759F6228126039607AD7ED8EAFEEA28D1C3E25A46BC18AF7E01F55FAD8244F15DE36F890416AA09548554338972C5F88FD9357792819E51A63D0B872B0A4D21EA3597405B52793D50C6CD70B52841D53484BCD3EAD004CEF0A6BC16CE74CB8AD0848000D8C5158DC16625112D1D85D17A3C1C8BBDAEA42C3A43E9930724655592116C4C6D0B8B223337EE4E754541A09D898F7FED71C3785B7F8721653986C525BC00F15590616437D11F9722824DFDE7E9615F1FB8488E5327E4D8BAF5F79D1FF5E808D154951AD87638910607B03FAAC3A61FE9916BA65FFD16986DEB4169BD24A72B1C8168FE569F3C81F93F3EBDD21D4E806F79FB28550912E9AFFFB52E97860C4DC0D042C56E1BB71C28B68E416874EC7043306A29BD1F4B9A3E612A6778315E2C2B850D6EAB9FF1905030FADA250CAF308735393C191134F3C493D00B5695775D82ADB9F2ABDAD17FC41FBD7A1DEFE337C2F8ADF69154CC0862FBD43035295B1A9C80B88FA8CF75B36CA08868F881966B41FB3E239EB1DB9CB51606A0A9EBCD552B2F4E819E2C30ABDECCDDE88D2D2F82F3585B5143943C929591D20CEF559CD2BAF2DC7FE03C9E4E084E8890FCE64A4AA9F13D5EB945AD7E3CC53E01FCDC192B97ADC1F98D9E773A0177E8D97405808EBF48BF17B689BFC15F4C515E38A855A9266230C9085ADC9A6DDAED93D80C3F38BC516695D202B4E89DA5B4EBC43788C848F8C4A72F79F37F857EDC105F13E4ECECFD09302711BC1993F5308B8F32AB96FB8EC3F5EA0531DAFD0AB3451F81F47E62C593C8D3E3BEEE79DB06909576BF876145856F5F716CAA436C98EAB28C5B85BC2E4D7E1653ECBB8BB6B5BD6981DC72D7F63BA06CAC8197ECCDC72C1481DB44724A3C21F7FC60661F11FDDE8122DA5D0B1D72A29952618B373423A892875E6AD24D0916109ED8E9A9A8D9A68ACEC4BB5EEB0D00EAEA72D8D5A76C2A42F18CBDB3D336B71C70AC73D39D7EB04533453779A1F210BB4FC056B4728AFDFCF46675C6AC76F750626D642E3AB117E5D6740154759A46C27D51306587650E1039054B876849882E7DFD807BD03E69021E337DD69D9B097722C6D2AEB517D773D2F7D84D69DABE1A1D6422EA1766C0FE7B8DD4D7283F2985D96D91A132B8BA03AD85F7D56095773222D0AFDC5A192D29F3BB0C2539A1C99DB4E711B6ACE3FEBD58E45E99C9F5A04CECBB309D50397F28C48BB9CC9F9CF75A52253B634EC47216A1FD6358AF26501821864569879BE1736B0AD242AB5B8ED16A7EA0989ED4CAE3567AFE1F8209A028DB46DB0270B3BC06668A9BF5E1BC1061BABBA00EC4EC37280379139D19BC6072CC6B7D260A816CB82F9BC90897BE3025475AF12191690F9F400A914789A860155EFD2D606A15895378C827F2A4FF700303962FD96DB2DCD2D213EEBB2460F0B753BC6902DA81D44C983DD027F1171D40A2039997241E09AE5B6165B4D55A8E4C79671A8B8BDEFEF2C21F81C541A5719DEB939F866B61BE250AF371CEA7B7525094C904698D412737F7781BD779365F122EE627D9CD4A68DA9D5BE1B0431998AACF824CDD864C7365C01CD5A5F480B6AC1E5FEAD8FFE40D87C1F9FCE81867157242285C5E76CF9667919C29A67CA0C0A61D7819D9EE6B792250A358F5691CCD80578F15288F3D5D6D7DD6DFA351FCF8DF0223F7D1DA1B76711FBE0E7FABD30377660ACE7B23ACF03ABC1D973248CDD0897773FB74E20481EBD3E52657C9296B980905AD29271EC128513284F1B78F38634BF84CB80791A0C5649177791CDAB87769D57B626F78A03435C758A207F52BD2A1F31E34B6A122B8701CD9FE478C57CF3535B6D51EB46CAF794BD69363D5A56ADDE6945E9788F1E1DFD045BFBD0A68834B13D6B9EC4EA9C860EEA0E9AC19C2DE14FFBD6B57E5992B08943EA0283813F3F15E4F928B8D0F13DE6863990F5C77F130C97D8BE12571EDCEC7DEEC4B6EF4835F136DA45DA70A11F9192478FD8B4846C507410FD11668365B05252E68CB2C972ACF50156E369B83BB85E62E4BD4D84C2E9FF41A5844D5D88AAAE7DED852DAA0AE5C14A5DCE64C7E236E9B7B60F5B5AD4D953A2D842A52929491BE3555AB8DF534CAD56DBBB86B28A8A86B7BD9AD1C58C87B8A089324E00FDE32F8186B2B74523A22904C18ADE02C3E965F94624F8DF57E750EA6335E3EBA705294B76CD6ADA33D90FEC1F48DE7BA9DC7D8D60A53D2563964188874810C45736C57EFBC3A3CEEE7238AEE5281882A554F2143BDF89ED4BD819C08239C187C12A8B6E763434B92C26FDD658B350F51775C60CBAB7A2CB120DB8CE8AE9AAF6AF559F8CADE84C4820209CBD27CC09230B22F013A0E4CF8041E4A789A5D20BE9914A624AB957318848ADDB39C9748C8922C54327048A2E46523BFB22487538363459035BA49858F85A469957DF1F4831BB7FFA0564C53233B99B596F5356089949306DEDD6B904433D25C4854A80590B964DF6B0703B4F9628D6B9A4D3F0A4096E9A0B46D6B32F66D563BAF688ADD18DE001DA62E33C503A4387CE0920BA5D1E8B69C38E3745B19F8D8B6CA5E1AC6DE90EDB25FC32DF04F0849D769FBED3F8169EA1D2252619A2304E055370B4443CD23E56D4934F9F3FC92F1C1EEC626657E6A89C1394E56061AF8ECE3E2A17FBAAA4D579A99A7998632A6AE2683DDFFFFD27A27C8815511855F09ADFF7BC627A7A5C95FE57FA3EF81F494FA7EA6E6CA2D14775A25BEAF1B5A3E35ECD4A306545D597E4E44301C3D1648F0A7D841F2F76FE59C6EAFA3F5B58907FC4E642ECD28D16A71EE3D295F1DE12DE1485B9CEBEB2CC6C9AC051D3D42B6A1A068533A7680A98D015B09C5B819FFC61688D441C1B7FD71180C4423E64EE940917C7DFAA19F3F51CB5B38D1B2B7C81D10E7C + +count = 66 +seed = 83C653708FAF3E5F6FBC9DFBE6FB5E83E572A7688645D75D2C4835B28695DEA4BD7093740D0FF43237354EAD1C978BC2 +mlen = 2211 +msg = E3B57B208352A820F622A694B7C3F6F297239EF0A069615DC664C02F1822BBA48E11E37BD9749C98FACEFFFB0FE1792A386BE10CA7B98CC874C68C36F5096D3718DC93E0734D6D6F913E3B958DC1FD1424818C9437B0FD59728ED46A79FB52C737A1D1D26F04EBAC279A7FF6A971E2B69576B712D9224EA18FB9BF4E613A8935F3B36A073B01F37BDC0B77981C8F2804E93C395419352B85C8A32DD77D41DA9BF3ECB914173E80DD1FC06E8FF5BF0E4F7424849A15EB7FAF7DE77456EBB64D10DC10FEC6254070C7DF387397137372EA3A53DFDA7DA13414AF2DF16C1E38C5C70A5F5F44F725D622049256BB15DC04A8D846A1A0DAE7E765A7F00C498F1D0B2893B8405BE4A43FB7E97881069A49134A2A847184B82EB5A690D87BAF2F579619EE19A3D7A7C7EEA72D6E3FCCF0A8092BB8D3C6B551F27E63E762A30B4A4DF2DBC4D119139AE1B135D06FF827846901577700935E0011B65461C2EF9A7B71EEA33C8CA4519C7BCFB557C5E1D42D9243F2DC34057F5E0CCB9A457FC34DCB10D9B47F6EC3B9550D3AE4FD593DFA3E28C6CCA1FF1EBC9D98DA8DB869F8C80BDBF8AD4684ACB6A779CA9D0A106F26DA17043773862681C5DD2DEB1BCA2CA48D4FBB4BB7C1F765DCA3A1D991D890B9A8751CEAFF543997FAE5B128AB2EF22B3BE94499DFD9D8E78FB4C82CA8D296B0415E84CA8B5F2024455B5DECC8B4CCDC7BC4EE06B4F0C66E6748FBD07E3A3BC5B4B6889C40DC4A97AE3EB43C3914DEF976EFE3BFD84A093BD69102D7B37C89B458A55B98A1974A13A7685D26E9D816C79585BCFC1042C2AF88534A9FE8B0A6C8C44355A6D606F902DB40D5490264BF0F352C27355633CB095268D5B8BEC985A62D84B2323FE814053F05DEDC22029D2998BD0BCB255C162C4BC03F60E3580AC3AE86C37850110E9A1BCBD75F64A0DD60B941E2F57DA9D72498B3EA8324EEA53DA3895585ED2942B9140F260895DC6A1131A4C3AD2B64028BB8C0FD67E1BE4C07F808B47DAEF306FD9578025F9C639660075837B2C95473F7F860D6EA2C53F4BA677A2345CF212C7757BB94F1A4F76D4E96625F6FE051B8246D1B7611BF6FE325FFFF8514D2F9A3453F0E77AE8B958AB5B567E541F156C6F4D315B4C3C547D59BBD0D7403E2E6A49B9E7D3FDBA338ADA41875CEB03830A846A1FB266C0F1228AAD2B76A2E3404278DBE482907206FA66487AD2C999867F870C8CB7A70B83437E14B9E893BF6B391DAD75E84588E882246D161799ADEA63ADF1AD706C0A3B76BAE595D84B21AE9DA30BBC0856987F2C2C543D977747B8CBD5A613B92804ECC5284ED23650E9DAFB4B76D63F069710897334F18EA6B0CBF99CD590A78E3B050E1BB24C86D6323A17106F0CAE3F30B01E4EB3DB1B5F3A4771A880C8AC06BCD5A82D4103D0452FD7B54834C1CF8595DD77F82D4AD9EBC1CFD0C9A8CC787E10AA4D1688474208B69FF7AD4DA6986E5F62A34AC3093E0FB1EFE8AE3A96F6AAE09B0E8F6E7A2B65C7387999CECCA43CC33F026DC19BBFD867C48127CFF579D1D71AFF0C4A0E20F9FDFD599A6169DF1B85F6051E02290DF6F5EDE4F29BB6F0C8F806D6850C6534ECDDCCD75BB8E4A097C70445585740F822E5CEBB0E19EAC82BB78EBDE2CA60A810AC6C54119FD6427DA8A0155EF48653515A919B299A306FD3C62B505A6911DB2B56CA2F296E487BA02C546ECA2783ADE8E46A8C78EB1F3D7C04BB24548F92383E475CE6E572D8DE1BFA9B3E35D9BD6C79547B592C95693750010A3D22CBB31AA5A4ABE94897831B1ED9287631F006A735C36BC84A8C87497EEA4873801A733F35B328C7D2CCBE4A41C193D22F972571BA7630B33080793498CC85E6EEA1C412914459DA175A6DB8658D0BD7A823FAB286EDC20C785C40BFD539924A24AF4E3D37BD781353677C76D4672098F5BDD17017012571D9AFDA05A40AB56998E40F5E359C43DFE32CA10A45BF08F67D128C24B1ACC03CBAC46BA6CA5A532C105E91E0C77ED59FB534AEECD68735A4978177BB5A656B9F83B202BB604D61A24574C16656E512C0A4CC6F597B3268573E10539D1BA775ED83BB680BB9115011C6AD43FBB66FB37C467249060A1586DF27B2CEFA65265CCB9051E468000CCAE24F08BA941A8180A64BB624F146C8EC562363B32C369F62997C4B1375DD7DE64725A598529244273CAF8398913C6FC01522683CF1F9F965C491ABE7A554F0019514ED98D75EB8BB8565F77C195F629F98163494B4AA2674F92A41DCB67EDD1D818A5B98993D0B1198BB6BEDABBB486BC6FDE039433E842BAC568A5B4EACC028CC2544B57D8883848DDDEE2E967EA85A6102BD0ABDDA41C3D78447BEE1D4949449ABAA9B3377E8CEDCF04A500FD1A6916E26983E64B5E96FEF87B32A060444D374409262453CB1376C349A8B5D1767B1E2991A1A6044E0F58831BD11F12159675D215D7EAA74807C995FE22017E30482DB8A4B09CA7800822C75C92FF649FC0728F5A1D44EFE7D0FF147274152D5F2F60342C8F5F951D8C95F83C1D54613A182D9DCA68F54FD55047F1F90CFECC04D733DFA82CFF2618F29A4DB4F7E1E59DEAD58CA65D07CC90C25F804A895D6A82F9375451CC55506D276FBF783F7D4D53B9BFB83DBE4A8771AFE21AC543983D68034BADC980F9434527F9EDAA2E228646FDF75B44899E749CF4C9E5B345222385A4424382603AD6EFC24C56E769028F4394F2F6220A9B390D395E412498E57A08BAD927B8BD5D76E18E8FEB457FCBD3248D218236B07783E57FBFA03C292A9F5719E6AEF2EEA3FAB2CAEED5442E89BFFB236CB13DB2CF9C35A38C338C377C475DAF45F8EA822F9AAAC13425FBD43D3DD9229367F0B3687D7E82AC5EC2FC7CDB69C99A4EB1B8E45465C6A53F16AC0C4E0C970B8C732AF515C09EAF25596F64A04AE4621037B8841FD2B1BBCB310EA23E122B0B9AB96D8F7702952D0E96E4CF79C2A30DF0091ACDA91479EE2979B0054997C48F6A0E909BC52A943459AF25553969EB31CE7685369A7FB014561B4697B8BCE220983136E5EB2303CCA4EADD4C6CC74EA2FE69D448AE6ED953A80363DDED5591B27A1EA956DF081CE99AA59DFC789D9D8FAE952B0737099D467D +pk = FE34BF50B435B519646E1F932AD2CEB78D08F7FD35481F1F457B47B5C6A387049607F5EBC1224680226C4B0E7EDD3CD55FDA80DEDFF3C7EB15865350AEAFF50117 +sk = FE34BF50B435B519646E1F932AD2CEB78D08F7FD35481F1F457B47B5C6A387049607F5EBC1224680226C4B0E7EDD3CD55FDA80DEDFF3C7EB15865350AEAFF50117E590C975CCDD7202A63A660E745692A9D801000000000000000000000000000022FF9C15FCE4C1803889CDD06057572875FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4FB05A4A5B48538CF4F0CDA9012D77D38CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000D986FA33946C40CAC30153C7D365DA042E0ECEF6D2D60A3D4825E95D42A6A5005ACC81C0E56C9537D729E72E3FC88DAAFEE2CFCBD79E3774E719A3982976AC00333314847191F0BEDA12C44581C96CDA3B966B3081970CB994719A4068C12C002F63382F6324CD065B19A652D572370DE95F7551BC9AB055BC69902DD37EAF00 +smlen = 2359 +sm = 0B746D157045B72FA5274CD0208AAF79B62626152A57C83A266B536736FA7303E4A757E50686D95D62131EBDEE6FA918DE40AD2DE3F4BA6A2982099879CCEB020102EAB394C8AD48360D64FCFBE6EF70834333E915203A7E4DB7F9F598C95C63CC4D92DFD86B7F1D32052DC8D8E34CB7A404918418FD5F10594C24F1E946E0281923148F90F815934D58AE58AD3ADC342C000208E3B57B208352A820F622A694B7C3F6F297239EF0A069615DC664C02F1822BBA48E11E37BD9749C98FACEFFFB0FE1792A386BE10CA7B98CC874C68C36F5096D3718DC93E0734D6D6F913E3B958DC1FD1424818C9437B0FD59728ED46A79FB52C737A1D1D26F04EBAC279A7FF6A971E2B69576B712D9224EA18FB9BF4E613A8935F3B36A073B01F37BDC0B77981C8F2804E93C395419352B85C8A32DD77D41DA9BF3ECB914173E80DD1FC06E8FF5BF0E4F7424849A15EB7FAF7DE77456EBB64D10DC10FEC6254070C7DF387397137372EA3A53DFDA7DA13414AF2DF16C1E38C5C70A5F5F44F725D622049256BB15DC04A8D846A1A0DAE7E765A7F00C498F1D0B2893B8405BE4A43FB7E97881069A49134A2A847184B82EB5A690D87BAF2F579619EE19A3D7A7C7EEA72D6E3FCCF0A8092BB8D3C6B551F27E63E762A30B4A4DF2DBC4D119139AE1B135D06FF827846901577700935E0011B65461C2EF9A7B71EEA33C8CA4519C7BCFB557C5E1D42D9243F2DC34057F5E0CCB9A457FC34DCB10D9B47F6EC3B9550D3AE4FD593DFA3E28C6CCA1FF1EBC9D98DA8DB869F8C80BDBF8AD4684ACB6A779CA9D0A106F26DA17043773862681C5DD2DEB1BCA2CA48D4FBB4BB7C1F765DCA3A1D991D890B9A8751CEAFF543997FAE5B128AB2EF22B3BE94499DFD9D8E78FB4C82CA8D296B0415E84CA8B5F2024455B5DECC8B4CCDC7BC4EE06B4F0C66E6748FBD07E3A3BC5B4B6889C40DC4A97AE3EB43C3914DEF976EFE3BFD84A093BD69102D7B37C89B458A55B98A1974A13A7685D26E9D816C79585BCFC1042C2AF88534A9FE8B0A6C8C44355A6D606F902DB40D5490264BF0F352C27355633CB095268D5B8BEC985A62D84B2323FE814053F05DEDC22029D2998BD0BCB255C162C4BC03F60E3580AC3AE86C37850110E9A1BCBD75F64A0DD60B941E2F57DA9D72498B3EA8324EEA53DA3895585ED2942B9140F260895DC6A1131A4C3AD2B64028BB8C0FD67E1BE4C07F808B47DAEF306FD9578025F9C639660075837B2C95473F7F860D6EA2C53F4BA677A2345CF212C7757BB94F1A4F76D4E96625F6FE051B8246D1B7611BF6FE325FFFF8514D2F9A3453F0E77AE8B958AB5B567E541F156C6F4D315B4C3C547D59BBD0D7403E2E6A49B9E7D3FDBA338ADA41875CEB03830A846A1FB266C0F1228AAD2B76A2E3404278DBE482907206FA66487AD2C999867F870C8CB7A70B83437E14B9E893BF6B391DAD75E84588E882246D161799ADEA63ADF1AD706C0A3B76BAE595D84B21AE9DA30BBC0856987F2C2C543D977747B8CBD5A613B92804ECC5284ED23650E9DAFB4B76D63F069710897334F18EA6B0CBF99CD590A78E3B050E1BB24C86D6323A17106F0CAE3F30B01E4EB3DB1B5F3A4771A880C8AC06BCD5A82D4103D0452FD7B54834C1CF8595DD77F82D4AD9EBC1CFD0C9A8CC787E10AA4D1688474208B69FF7AD4DA6986E5F62A34AC3093E0FB1EFE8AE3A96F6AAE09B0E8F6E7A2B65C7387999CECCA43CC33F026DC19BBFD867C48127CFF579D1D71AFF0C4A0E20F9FDFD599A6169DF1B85F6051E02290DF6F5EDE4F29BB6F0C8F806D6850C6534ECDDCCD75BB8E4A097C70445585740F822E5CEBB0E19EAC82BB78EBDE2CA60A810AC6C54119FD6427DA8A0155EF48653515A919B299A306FD3C62B505A6911DB2B56CA2F296E487BA02C546ECA2783ADE8E46A8C78EB1F3D7C04BB24548F92383E475CE6E572D8DE1BFA9B3E35D9BD6C79547B592C95693750010A3D22CBB31AA5A4ABE94897831B1ED9287631F006A735C36BC84A8C87497EEA4873801A733F35B328C7D2CCBE4A41C193D22F972571BA7630B33080793498CC85E6EEA1C412914459DA175A6DB8658D0BD7A823FAB286EDC20C785C40BFD539924A24AF4E3D37BD781353677C76D4672098F5BDD17017012571D9AFDA05A40AB56998E40F5E359C43DFE32CA10A45BF08F67D128C24B1ACC03CBAC46BA6CA5A532C105E91E0C77ED59FB534AEECD68735A4978177BB5A656B9F83B202BB604D61A24574C16656E512C0A4CC6F597B3268573E10539D1BA775ED83BB680BB9115011C6AD43FBB66FB37C467249060A1586DF27B2CEFA65265CCB9051E468000CCAE24F08BA941A8180A64BB624F146C8EC562363B32C369F62997C4B1375DD7DE64725A598529244273CAF8398913C6FC01522683CF1F9F965C491ABE7A554F0019514ED98D75EB8BB8565F77C195F629F98163494B4AA2674F92A41DCB67EDD1D818A5B98993D0B1198BB6BEDABBB486BC6FDE039433E842BAC568A5B4EACC028CC2544B57D8883848DDDEE2E967EA85A6102BD0ABDDA41C3D78447BEE1D4949449ABAA9B3377E8CEDCF04A500FD1A6916E26983E64B5E96FEF87B32A060444D374409262453CB1376C349A8B5D1767B1E2991A1A6044E0F58831BD11F12159675D215D7EAA74807C995FE22017E30482DB8A4B09CA7800822C75C92FF649FC0728F5A1D44EFE7D0FF147274152D5F2F60342C8F5F951D8C95F83C1D54613A182D9DCA68F54FD55047F1F90CFECC04D733DFA82CFF2618F29A4DB4F7E1E59DEAD58CA65D07CC90C25F804A895D6A82F9375451CC55506D276FBF783F7D4D53B9BFB83DBE4A8771AFE21AC543983D68034BADC980F9434527F9EDAA2E228646FDF75B44899E749CF4C9E5B345222385A4424382603AD6EFC24C56E769028F4394F2F6220A9B390D395E412498E57A08BAD927B8BD5D76E18E8FEB457FCBD3248D218236B07783E57FBFA03C292A9F5719E6AEF2EEA3FAB2CAEED5442E89BFFB236CB13DB2CF9C35A38C338C377C475DAF45F8EA822F9AAAC13425FBD43D3DD9229367F0B3687D7E82AC5EC2FC7CDB69C99A4EB1B8E45465C6A53F16AC0C4E0C970B8C732AF515C09EAF25596F64A04AE4621037B8841FD2B1BBCB310EA23E122B0B9AB96D8F7702952D0E96E4CF79C2A30DF0091ACDA91479EE2979B0054997C48F6A0E909BC52A943459AF25553969EB31CE7685369A7FB014561B4697B8BCE220983136E5EB2303CCA4EADD4C6CC74EA2FE69D448AE6ED953A80363DDED5591B27A1EA956DF081CE99AA59DFC789D9D8FAE952B0737099D467D + +count = 67 +seed = BC81485EE93AAD8B464B5199FFEF9FEFC06EA97645BDFE0B4E915B812E606A77F93917ED925E882161CBB909747AC4C8 +mlen = 2244 +msg = 89D960D04A3DF6984276A3D17D59AF9E72B25418C8797170FA701A672C5835CEAA22DC35470D038C6ACC5082D2AE329F36697C91CBB1F9E42DA59A654462BF19E04352192778CB050DB6F4A656F6AB0BD9641CA8CE6C1EF8B020A3D9FD9DFF772F38926458BDA6E6072456E506AE464785399AD7B498AFD4C211F09D0C722FBD9E20890CDDC8C6EB9EE75390E6D76D0672FA64D8B97C65CCA46DD1F542B6D6014F035D2817C4B9430AC8DC318CF8642AB34F4C8D71FC0E3B1FC961E94B6A84622876250FDC21987777360784D9A58F35E1C9B71F30561ED6854EE9B112E7B20CE064272213BD1A46D0D19E5EFAFAAC7ADDF4D7B7A519D689398EAF1E67E64ACE8E5E89756377E1FE458D04E3DF7F6680F8B69815680276ACDBEE6C8E1AA909EC56994F3EF3B65FBEFDBC29AEB0EA906274E838CAC36A0607716FBC2B8DA6150A4EF39E1CD9CCA72915007723C5D2442F7133258234D18A257DA2C13E53B47DC6ABC2D607B98E351FCECEE8BA8886821985BB3A7BD02429ECDC5A27EB04D01DADCE88A324AE44F567593FBF730C284414056FA33CE90A6D6F146DBB1635BD26B4F883D4948DA47216C70D2AA58CEB3979523C6A4F2F7EA455A97C7ADB6C43685D63BD4C51D7DDCB81A06B9BAC31A7B255B94052D686128D234BCB63CE713028451B18B981B83DA1246281FC3BD2B06C741CF71979DAEFDFA0FD06FBA3722FF7BCB2821FBA964FBE9F6467FE583C06D3889A40360A7AA03358175EE75EB8FD1D3368C30B5691776C163764DB924FBA2362CC9572F642CDD2B11B40FA2683A529EC2100DEDEDEAA70A1E639A71D6A96AD31F70A00FB63875D0FD5C21E56AE57B6E74EECD2EF34BB3E20BE5A1F9F1F54955A18B4E4E4B9119973DEB76A2A603FB6410A350667ECE5C1C147DD00B07A88A7D0E86AA2D747A867AD90BA6660C7A0432E20849EF642A20CF5A20AF7E34D139B39DD65C65B36750F17F0B9F1DB06CC6E16F10EB289F567B647454A581604F381D66371238AB785585A4DA2D00810EF6851A6009025FCADFB77FF7996BA6B091FE4130733466B29FED46554FEBC2AD291DD966BEF4D79A9E04014D3003C95696E8BC39892AD32DB6D6AD22D33E931BC87F78114BBBD97B334BCEA676F9E9DB23C0485EC06D8F37F070C143117B1BEA49F06E1A2423D98C12883D32D29103F7699646E7091D393B21A260703E17380A1BD85452702C3AF7DF73AE7856A1C066013014DE62C3C817DD74C44AA436A71490E7BDC6B8B74BF61711FDCC541AD7DC49CF4C3EC154879E048FF30DF25065B5641367CBD3BBA19606A9A27A64055D5D3B538FC88EDA66FF9F26E619DCBA696866DE54A8DC8580B5B28144F952FFC6DC543E98CC9FD7F4538135C0F4DEB4BF892266DCC48A4D1DDCF407BE4FDF2A5AFE4A0105A20CE2B3D9F48D608DE2315240875F1FED696C49CD8D4A78AD26F51B3C804949C536CE35C3963DC1D238516B3F2D297F5C9939A946A0170E185C75087F37ACF907F9E3F87A2B15CF81C7ECBF2165F0F3962D11E9C6A7845ECEF432CE9E1FBE74C77EA1057D79CB595D47A8DDC1D911C6B97AF76D91F3515081B95CED16275DECDEDCED9AC790D73739E35973834503133510DBE39201F9B5C618231184B9DBAFAA7ED6623E8BC492170812444DB62D4F01925DC4F821C0896A746B4453E93EE51844B311B0A0A51601477BFF651EB5EE331227A2E9E49F593EB2988E449E750E990A8A89906EFAB00E0955C81B6AEB160313007B481C40908130597626935389E47AFCB0A20146F0C7B29B567E95D59CED7FA8023A2D69C89443A11E7150A03D09EE6B0F74358141D48E9BCAA3EE081C7D8F8C223F4D48EFB3DF8A4E287FC5B90B4FD251CB616687ED09AB1A06C42EB9D6A578D72E99D499882D216DDB3F35B0A33D9F2D3D4A700161A5C3B5A6729F197479E78009794AA1BE3C25E0B9142613AD2EA508ACAEF5EEE33DACF60CB7A16AB38D9F3CAFD2150081B63A3A6CA0163A25FE81206A37A0874FD55FA3068B4C1B25E6325FA56646EE5F3431D33D0BC691C134AB306B0BD2D1087F4D898A529DAE08B97683FE2EB8ABC9095D67B79CFF0E77404C1F7FF316C3CECBAB77C710FBF961008047AF22805D77EFF79F815B21D142F517DA2199F6627AD9FD85AA24E9B7F40C7796207A82901C7B5A3A42369A9BCEBC24ECE13A3ED064E4E748BEE2890BB21B8E4845362BE9AEE46E25418F7CA38ED087E46E24F12012A1312BC623AABA6ED227CEF116A3C2130B4B837AC77D86F8CA3553BA0CF5AD45E9B4E4E55059F1D4675291581D7CC9E5839212AFCFA897E90CB601CB33A4D2241A5ED5925F6416BE5A43D4767FA04F701076AD5ED5ECE2D09B8DAF11B00FEDD2AA2E748CBCBE365031394EF823951EBC52B3E4C79D79234C16575910C29A35EB67C624F7504EECA3921F461D7F95EEE39638C402481DF7B59310C4554450789DFB28ED1E485C0018512EB05F14DC7A3DB5C0606F9E28420D76B8F8534D2AE31AA01E90A20E248A7FB3B72EA859031C67F7B2B043D38F7183165A42AB28C6308608C530A9CA98F82C133BBC313FDDD2109838E970DC9989EC14DF781A518F6CB56DBEDFC1E381250C64F95D0BE5F37515437673425374D44811F4406EE2B5130334BA555839E61AE623D283C77247D2EF8B22ED138A526F7E41DFD41FC69A2839B77B51C6FD96D97D3EF8359E8725BA1AFA80278FB3BA9C697F7E2BBCC5D3F0F2E61BFCF542D3160EDE02CD6295FCC55865E7890342572499347DF80EC073A91E00193BAF804B884E9CF5C43269824D4CAF7EEF49FABD8BDC5496D190263C96DBCD287681C19B90C34635FFBDFEAFE0601BBB7514FD84896A22895E9B21FAEEA372696E350F13959FC23533F3E8C34B17B595F3C935E37220AAF644F3A565114C34C7B85F1A3E465470166A62B13ADB00A2BCD5A9A3ECD59FB772F09DD6A6E2AD12FD54EC62CFACE0022F2FFE3EB62DB0F4D0F0F9D1FD6F3F11D76DA868D2C1C4124915DE19EACFFCDB31F7CA018B6976260CA1BB2C4FCD6B9958F096313B608E208D875EA5A1FA89916D0367EDC4F8890E93F1E660AFF16EA79D1E583007E693BF06C172105B3DC24117DD921FB60D3AC0D2E5C89FEF17087D885A0794E496E3CBEA333CF72A507788EFE +pk = 1620D624B05B1E22DD7C3E09604746AAAFE33F3DBD35FCB722FE18A51DFBBB006E3927BC26A2C9681638236DEF493BBE6C089520F24AEE8C258967B18BCE120004 +sk = 1620D624B05B1E22DD7C3E09604746AAAFE33F3DBD35FCB722FE18A51DFBBB006E3927BC26A2C9681638236DEF493BBE6C089520F24AEE8C258967B18BCE1200047FF650162C2DE2911F60D12D8D25EAFB29010000000000000000000000000000847FCC1EF69912FF6DA1EDC57E31F646E8FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF63F37B9EADB0E9E2A8E3BB54829A12B169FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000017D75A1C237EBB39A4C6B8B1D8B04CD09B118DD2054273F735E2DC301BC18400FF405F1FD69361BFF993632027358A0471F2C9B2D6BA2AB510592AEE89DC0F001358CED7C15C433B4282C744D1610B927A0970F6CB2B7950DE2574B726AB2600EE653D8F041755ED31DAC94D89F60A23AC4C1E4BAA9D86D92337A5C5D000D000 +smlen = 2392 +sm = 3CD5CD9E06D9476ABBBE31A7C6728E416647A5FCA099D73DDFDC22314B275A044D84CFD0AAD3E1EDD016428D0121461B368ED329D3D936A432D30B8D11A61E04010170A850ECECF2B7BD0B54ADD10D9DF93FC78E5E170AEFAFB535FDF37B30B01B2CD2D1C2788E7260AF9BE99B963BF8B37DDFBDEAA5142E87F4AE26F1F31BFA5B197697C24172DA23E1232D7EE492F53E00190B89D960D04A3DF6984276A3D17D59AF9E72B25418C8797170FA701A672C5835CEAA22DC35470D038C6ACC5082D2AE329F36697C91CBB1F9E42DA59A654462BF19E04352192778CB050DB6F4A656F6AB0BD9641CA8CE6C1EF8B020A3D9FD9DFF772F38926458BDA6E6072456E506AE464785399AD7B498AFD4C211F09D0C722FBD9E20890CDDC8C6EB9EE75390E6D76D0672FA64D8B97C65CCA46DD1F542B6D6014F035D2817C4B9430AC8DC318CF8642AB34F4C8D71FC0E3B1FC961E94B6A84622876250FDC21987777360784D9A58F35E1C9B71F30561ED6854EE9B112E7B20CE064272213BD1A46D0D19E5EFAFAAC7ADDF4D7B7A519D689398EAF1E67E64ACE8E5E89756377E1FE458D04E3DF7F6680F8B69815680276ACDBEE6C8E1AA909EC56994F3EF3B65FBEFDBC29AEB0EA906274E838CAC36A0607716FBC2B8DA6150A4EF39E1CD9CCA72915007723C5D2442F7133258234D18A257DA2C13E53B47DC6ABC2D607B98E351FCECEE8BA8886821985BB3A7BD02429ECDC5A27EB04D01DADCE88A324AE44F567593FBF730C284414056FA33CE90A6D6F146DBB1635BD26B4F883D4948DA47216C70D2AA58CEB3979523C6A4F2F7EA455A97C7ADB6C43685D63BD4C51D7DDCB81A06B9BAC31A7B255B94052D686128D234BCB63CE713028451B18B981B83DA1246281FC3BD2B06C741CF71979DAEFDFA0FD06FBA3722FF7BCB2821FBA964FBE9F6467FE583C06D3889A40360A7AA03358175EE75EB8FD1D3368C30B5691776C163764DB924FBA2362CC9572F642CDD2B11B40FA2683A529EC2100DEDEDEAA70A1E639A71D6A96AD31F70A00FB63875D0FD5C21E56AE57B6E74EECD2EF34BB3E20BE5A1F9F1F54955A18B4E4E4B9119973DEB76A2A603FB6410A350667ECE5C1C147DD00B07A88A7D0E86AA2D747A867AD90BA6660C7A0432E20849EF642A20CF5A20AF7E34D139B39DD65C65B36750F17F0B9F1DB06CC6E16F10EB289F567B647454A581604F381D66371238AB785585A4DA2D00810EF6851A6009025FCADFB77FF7996BA6B091FE4130733466B29FED46554FEBC2AD291DD966BEF4D79A9E04014D3003C95696E8BC39892AD32DB6D6AD22D33E931BC87F78114BBBD97B334BCEA676F9E9DB23C0485EC06D8F37F070C143117B1BEA49F06E1A2423D98C12883D32D29103F7699646E7091D393B21A260703E17380A1BD85452702C3AF7DF73AE7856A1C066013014DE62C3C817DD74C44AA436A71490E7BDC6B8B74BF61711FDCC541AD7DC49CF4C3EC154879E048FF30DF25065B5641367CBD3BBA19606A9A27A64055D5D3B538FC88EDA66FF9F26E619DCBA696866DE54A8DC8580B5B28144F952FFC6DC543E98CC9FD7F4538135C0F4DEB4BF892266DCC48A4D1DDCF407BE4FDF2A5AFE4A0105A20CE2B3D9F48D608DE2315240875F1FED696C49CD8D4A78AD26F51B3C804949C536CE35C3963DC1D238516B3F2D297F5C9939A946A0170E185C75087F37ACF907F9E3F87A2B15CF81C7ECBF2165F0F3962D11E9C6A7845ECEF432CE9E1FBE74C77EA1057D79CB595D47A8DDC1D911C6B97AF76D91F3515081B95CED16275DECDEDCED9AC790D73739E35973834503133510DBE39201F9B5C618231184B9DBAFAA7ED6623E8BC492170812444DB62D4F01925DC4F821C0896A746B4453E93EE51844B311B0A0A51601477BFF651EB5EE331227A2E9E49F593EB2988E449E750E990A8A89906EFAB00E0955C81B6AEB160313007B481C40908130597626935389E47AFCB0A20146F0C7B29B567E95D59CED7FA8023A2D69C89443A11E7150A03D09EE6B0F74358141D48E9BCAA3EE081C7D8F8C223F4D48EFB3DF8A4E287FC5B90B4FD251CB616687ED09AB1A06C42EB9D6A578D72E99D499882D216DDB3F35B0A33D9F2D3D4A700161A5C3B5A6729F197479E78009794AA1BE3C25E0B9142613AD2EA508ACAEF5EEE33DACF60CB7A16AB38D9F3CAFD2150081B63A3A6CA0163A25FE81206A37A0874FD55FA3068B4C1B25E6325FA56646EE5F3431D33D0BC691C134AB306B0BD2D1087F4D898A529DAE08B97683FE2EB8ABC9095D67B79CFF0E77404C1F7FF316C3CECBAB77C710FBF961008047AF22805D77EFF79F815B21D142F517DA2199F6627AD9FD85AA24E9B7F40C7796207A82901C7B5A3A42369A9BCEBC24ECE13A3ED064E4E748BEE2890BB21B8E4845362BE9AEE46E25418F7CA38ED087E46E24F12012A1312BC623AABA6ED227CEF116A3C2130B4B837AC77D86F8CA3553BA0CF5AD45E9B4E4E55059F1D4675291581D7CC9E5839212AFCFA897E90CB601CB33A4D2241A5ED5925F6416BE5A43D4767FA04F701076AD5ED5ECE2D09B8DAF11B00FEDD2AA2E748CBCBE365031394EF823951EBC52B3E4C79D79234C16575910C29A35EB67C624F7504EECA3921F461D7F95EEE39638C402481DF7B59310C4554450789DFB28ED1E485C0018512EB05F14DC7A3DB5C0606F9E28420D76B8F8534D2AE31AA01E90A20E248A7FB3B72EA859031C67F7B2B043D38F7183165A42AB28C6308608C530A9CA98F82C133BBC313FDDD2109838E970DC9989EC14DF781A518F6CB56DBEDFC1E381250C64F95D0BE5F37515437673425374D44811F4406EE2B5130334BA555839E61AE623D283C77247D2EF8B22ED138A526F7E41DFD41FC69A2839B77B51C6FD96D97D3EF8359E8725BA1AFA80278FB3BA9C697F7E2BBCC5D3F0F2E61BFCF542D3160EDE02CD6295FCC55865E7890342572499347DF80EC073A91E00193BAF804B884E9CF5C43269824D4CAF7EEF49FABD8BDC5496D190263C96DBCD287681C19B90C34635FFBDFEAFE0601BBB7514FD84896A22895E9B21FAEEA372696E350F13959FC23533F3E8C34B17B595F3C935E37220AAF644F3A565114C34C7B85F1A3E465470166A62B13ADB00A2BCD5A9A3ECD59FB772F09DD6A6E2AD12FD54EC62CFACE0022F2FFE3EB62DB0F4D0F0F9D1FD6F3F11D76DA868D2C1C4124915DE19EACFFCDB31F7CA018B6976260CA1BB2C4FCD6B9958F096313B608E208D875EA5A1FA89916D0367EDC4F8890E93F1E660AFF16EA79D1E583007E693BF06C172105B3DC24117DD921FB60D3AC0D2E5C89FEF17087D885A0794E496E3CBEA333CF72A507788EFE + +count = 68 +seed = DE9E2742591A5AF6A6153DA85A510C39FD31A2ACD8A8511F190A9A5E5753E63D9801A8019508E67DEB1E9219CC18BA3A +mlen = 2277 +msg = 8337940EE74590EB25E52E78E8563A09CD2D45F650F48775E3E61F9E3509CC8EB7E983310D0185359F66BD80E0DA1E45A6BEB53ACEBB9030E310E81A576D0F80C64FCE1D1FD77DCA27B7C6E02B0CC26EDBF496AD2E3CE8484E988E56BB28153587D7ECB02FD8882545E7BF79CC9966A7FEDE93F7E9451BC48FDBB481673D1C4135F95D68F40F4B4F847345A320FB4D736BF5F9FD347435462DD3A238E4C799E7CEE081107E11682C7B558B19177522427F1D269FAD81B565BE538E8FF2D7193579AEE51E50974BDC0B66331B59BF496C87E4F6E143754076DB516C9C538410FB38A930CB5BA1E6610441126D01C8EB5F34E2E58424B8B218D9E68C5D8B4F5258EEF07EE0AA5475A72CCF363D47D825FA524C16C7B7587C44864DA9E4B267F738B87F7E5701147F550CD38774B17DE48E6969A0DEDF334FA67470419059C4D1607880CB12FA9C0ED23032C7E0F325169EACE7DACCDD4C2E5097FBBA859970D7EAC4522C1FEA043C9278C1C89FCCE95203033B4CEA4F9F24B55BA6B79EF88F275310C6E48189EFC1EEEDAB66B56B6BB028726BC463D93D742492841E85D5C837948978D0FADD1C172F8859C802C6BE8394A05DADA7546EE1CC5BB909D3189088F4FA6D07C573ED7263C081720E701D5D4B027AE54BE175536F3BD5E91993CC040311A7D352AA26414CAE30D10408DDB44E8C9513F4619E99EDC894F963489876B24BB0B91BDC3EE5B78AC0D4046B2E864789C0C779E5AF97F8F84F09A26FF74B8BCDE66C007970830B70C2A1122DC9845905C3AA7810B40641E8BBB398A23BBEF52BEDABEC7BB54823E64177A73786992DD67D5C007D770938402EFBCB3A60281C5706920A9EEE4C26C0B251C32B9E1936FDEC2928110959E99255508250FD5BA84B4FB314187124072D30FBF2163D36F1480ECC08F7FB8093BFAA72F1914C63533EBB3A57420DC38DC93DD6AE4D197FAB790C1EFC1B7A2234522E0B408D0648C7AE782F2F08CB70B96CD76B5089AF1EF4BA3A4C2FAAC363A4DC1C6C421F6AE1E9B67461EB02F36C25E763F1A2B73CEED4DCEDDCE619CB313D124CE6F7AC986D6BC344E630F22CB654C1286FBC0EE01C968DADD1EDAD744C8BC828CF5F316336A5883166ED000FF98D6CE2CEAE7D3E40BBC5714F71BA9E25E1506D644FB2DE2FE190D327ACCCA79D9B6D9DB505CF1853E98F30E9BA5E568ED83E2567C936A64420C5D8F07AC4F65F38C28E88DD7B5209A600AEB81A6D2AFA4FAAEFDAFD9B7FD3AD7F49462CD577204184F9D44A45E2A909373CED24EC0EE56BF2E6675C506EDA67B1E6DAB75CBF1822E20E7A8A81A7729B42A6D67A1DD457FCD19B62F048AB97B3D694254E5C051FD2DAF3D12AD627EC37C22117BDEE9EAA290D11D56BAFF0DE1037EBA908FA03E2F869FA2B27936669306E8E70A0A4910A123F202797BF1C8FE47178BB1E8E8D7AB1C01F30F5E779B2BC99902DF15185FED4C865997AB72254162D00858E0908EA95A9ACD0FCE72E571C7A381CC33E06A27FE6A5922775EE82C973CC3CA8A05717608F8703946C9A89854D627744DA475DEFC1390DC44FCC3A23C47AA8AF17240EB1A1A00A062D258D471F31333D0356243DC1CECFC559378B4395F01A970EA4074D5666B44D49EF291ED15930DADA66765B165CB8331CFE549C38CD0672F534BE60F4D9B4C125FFE747670513B5744676899B256B992E15106B99B794DB3950582816612144649210751F3D0DFD5B25CD393E724F7FDEF00756D0C8540E8891E592507599B06EDFA6EBFE543084AC81858F5EB02D8F5EB8A72184851E8589A3AC6DFE1CDCF286723FC4C1202765FA4F783EE58C627ED494C7149BCA6A4DDB420827CDCA82DC42515BEAF46CE9D9ED524BD00EBD3094F770B1E1DD09FC431E4C244D2305619DAE208E65EF385EA92F5A79F12B99AFDAEA79C9D8D319944AC6CBBE3F1290EC6B87D97785E059E6871FDF239BC404021CB52064B88EB4CB3FB6A871B0F76C12D7B8C5E8FE0A65024AB5B25F4C67B6D15C22B0005B754CF7CBEC898B49F4326F1AE4034E5F5A446A96CE08083D48525A3661E10C996DD22DC34FE570A4C8817D10D750FC5C2ED0C24C7CBCBA5CD1B2680DBAA3315FBF2BA7457ABEEDC96B5D111110D4678EA5C7851D25F258926B0B028365799E940A6E17BB03CB332FBC6D713DEA7108FC6268C8D33E7A578C94FF75BE808C15FF7884F092C0E309F1AF99B1A7314FA0F32C8D8E32B3E9D92C9C8FF6B8FBB99111529C4BE3A2A4F62884373D0903180B4DEABE613DE5CF19415DFBA7F9A46297AE2F21D7EA420B41F628FD8DEBA55207606539D11791623CB325F1E18C98AAC27283BFAB2408F4FD6CC58EC9E306643BA1C0C77D84B3930263E5A76A1CE94F3D7721F0098D54E6C990C3AFF69B6A0D82C853EA2AF2D3D2B3E96DAD59FF873171B55D16CA9A7C68DAD2E918174D264919DDCB4B9D01CE622D56C599BF60711C74315C918A7BB97B9513937AFB6A652DA68B6B0B34E316D7BE9F5C282A5E8773C892782EFF220667A6A54069C37B88EB1CE676AAECF2015E59FB7AF4D30C4625DD8DE4805F505E83C877CD61D2A0BA65B32B0DBDFBACFC88CA43E4DDF7A1A4517DCE83B7B8ACF8DCAAD28284039747935865DAF8DCFCA29FB676CE2EBA2C509CD75588FA5E58CEFD0694626C9BB31C3AFC372ED313C9BB3ADC398E89DBDB108DDA63F9380EBF9DA17B378451634682F9823E209BF10E39F884ED270413152025CDBF4875C121B1E83E12C044453FFDA6D8CA2C240AD522577C6898AB6F2ABE1FE77F860939408CD193E605F87FF2248FA163AC2FC0F39BFC38503B23F5441E0E364CAAAB890073266B3B51217661F5DF41C0BA925BB425AB3DD7B6A3675B7D60D0290131EAD53A4EAB0C66BAA83F2FB77E74C3C123ABA7731A3F62FAB8EAB2A96E8BBC911E501CD23A088E7887A469284E0B5C27B5CBC1DE2B6938CF1AF58A47FE78141306CB76E8F2B73620BC4549DB6826D2D72873885F6C5311EB5B9462BB4631D314DFB9C836C6F4D9EEC6818940C04689CC4D8D11ED9869355617861340E722B2BE78197746E2759AAA8D68D1965888E89B6B0F5BF51F94E586B2CB8708F4CDB520BF31DDCCFB7CB69E29A7AE8AAB12C11F431DE40FB9E82EB5F2B6BA1F9757F1487B63255FA69A755601C2FE17CD1892D5A6799C35D05098DC133BDD71318667D47C4671 +pk = 85BA076F81646785B76E686FD598235E6C632149ED2AE461FDB4F35C49D45300A28C02689E259B017B2349473A1BED781CE2742AF18A56BA963ECF1313F3DC0402 +sk = 85BA076F81646785B76E686FD598235E6C632149ED2AE461FDB4F35C49D45300A28C02689E259B017B2349473A1BED781CE2742AF18A56BA963ECF1313F3DC04024B0767CA8A3C8EA57C41AB1D0A4171774A010000000000000000000000000000BE28CC468C4B5D52C34D6C3C4C0248A9E0FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFE121FA7B4223D0A9C5DCB01B9398FBBFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000BBC6C83FA8FFA832A8E3FB1792FD9E1E8934780510D23A6B9D06B9A7F69AEE00EC0850562DEAA61540AA770175BC28FE586E3D561915059471D39957E818F1007B4AA074AE15D2FBB3EC6E00B7A542E8537F03BBB7B16367A41FF6122AD220001B7D8D0D4F70860AC3F076B9F3E22D38425AE2428328C26BA679C6925BAFEE00 +smlen = 2425 +sm = 355BDB1B950FB1D980D412AE483399BB6F50E031573D07C11F5A3A28CA6B7C0052EB838BBA289E5DE40910EC939A66BF4FD870A70BCD42C75CF56E7B1E2034030100B98DD029560ED9D4CE9C63CE5A98F72467658C481B3ECE5773FC9DAC87525434338D27CF739AC311CDE64AE05CC5CA49B6BA25908DB1189CDEDBE664667404326DD77C5AF82E72D202826275D4DFA500040A8337940EE74590EB25E52E78E8563A09CD2D45F650F48775E3E61F9E3509CC8EB7E983310D0185359F66BD80E0DA1E45A6BEB53ACEBB9030E310E81A576D0F80C64FCE1D1FD77DCA27B7C6E02B0CC26EDBF496AD2E3CE8484E988E56BB28153587D7ECB02FD8882545E7BF79CC9966A7FEDE93F7E9451BC48FDBB481673D1C4135F95D68F40F4B4F847345A320FB4D736BF5F9FD347435462DD3A238E4C799E7CEE081107E11682C7B558B19177522427F1D269FAD81B565BE538E8FF2D7193579AEE51E50974BDC0B66331B59BF496C87E4F6E143754076DB516C9C538410FB38A930CB5BA1E6610441126D01C8EB5F34E2E58424B8B218D9E68C5D8B4F5258EEF07EE0AA5475A72CCF363D47D825FA524C16C7B7587C44864DA9E4B267F738B87F7E5701147F550CD38774B17DE48E6969A0DEDF334FA67470419059C4D1607880CB12FA9C0ED23032C7E0F325169EACE7DACCDD4C2E5097FBBA859970D7EAC4522C1FEA043C9278C1C89FCCE95203033B4CEA4F9F24B55BA6B79EF88F275310C6E48189EFC1EEEDAB66B56B6BB028726BC463D93D742492841E85D5C837948978D0FADD1C172F8859C802C6BE8394A05DADA7546EE1CC5BB909D3189088F4FA6D07C573ED7263C081720E701D5D4B027AE54BE175536F3BD5E91993CC040311A7D352AA26414CAE30D10408DDB44E8C9513F4619E99EDC894F963489876B24BB0B91BDC3EE5B78AC0D4046B2E864789C0C779E5AF97F8F84F09A26FF74B8BCDE66C007970830B70C2A1122DC9845905C3AA7810B40641E8BBB398A23BBEF52BEDABEC7BB54823E64177A73786992DD67D5C007D770938402EFBCB3A60281C5706920A9EEE4C26C0B251C32B9E1936FDEC2928110959E99255508250FD5BA84B4FB314187124072D30FBF2163D36F1480ECC08F7FB8093BFAA72F1914C63533EBB3A57420DC38DC93DD6AE4D197FAB790C1EFC1B7A2234522E0B408D0648C7AE782F2F08CB70B96CD76B5089AF1EF4BA3A4C2FAAC363A4DC1C6C421F6AE1E9B67461EB02F36C25E763F1A2B73CEED4DCEDDCE619CB313D124CE6F7AC986D6BC344E630F22CB654C1286FBC0EE01C968DADD1EDAD744C8BC828CF5F316336A5883166ED000FF98D6CE2CEAE7D3E40BBC5714F71BA9E25E1506D644FB2DE2FE190D327ACCCA79D9B6D9DB505CF1853E98F30E9BA5E568ED83E2567C936A64420C5D8F07AC4F65F38C28E88DD7B5209A600AEB81A6D2AFA4FAAEFDAFD9B7FD3AD7F49462CD577204184F9D44A45E2A909373CED24EC0EE56BF2E6675C506EDA67B1E6DAB75CBF1822E20E7A8A81A7729B42A6D67A1DD457FCD19B62F048AB97B3D694254E5C051FD2DAF3D12AD627EC37C22117BDEE9EAA290D11D56BAFF0DE1037EBA908FA03E2F869FA2B27936669306E8E70A0A4910A123F202797BF1C8FE47178BB1E8E8D7AB1C01F30F5E779B2BC99902DF15185FED4C865997AB72254162D00858E0908EA95A9ACD0FCE72E571C7A381CC33E06A27FE6A5922775EE82C973CC3CA8A05717608F8703946C9A89854D627744DA475DEFC1390DC44FCC3A23C47AA8AF17240EB1A1A00A062D258D471F31333D0356243DC1CECFC559378B4395F01A970EA4074D5666B44D49EF291ED15930DADA66765B165CB8331CFE549C38CD0672F534BE60F4D9B4C125FFE747670513B5744676899B256B992E15106B99B794DB3950582816612144649210751F3D0DFD5B25CD393E724F7FDEF00756D0C8540E8891E592507599B06EDFA6EBFE543084AC81858F5EB02D8F5EB8A72184851E8589A3AC6DFE1CDCF286723FC4C1202765FA4F783EE58C627ED494C7149BCA6A4DDB420827CDCA82DC42515BEAF46CE9D9ED524BD00EBD3094F770B1E1DD09FC431E4C244D2305619DAE208E65EF385EA92F5A79F12B99AFDAEA79C9D8D319944AC6CBBE3F1290EC6B87D97785E059E6871FDF239BC404021CB52064B88EB4CB3FB6A871B0F76C12D7B8C5E8FE0A65024AB5B25F4C67B6D15C22B0005B754CF7CBEC898B49F4326F1AE4034E5F5A446A96CE08083D48525A3661E10C996DD22DC34FE570A4C8817D10D750FC5C2ED0C24C7CBCBA5CD1B2680DBAA3315FBF2BA7457ABEEDC96B5D111110D4678EA5C7851D25F258926B0B028365799E940A6E17BB03CB332FBC6D713DEA7108FC6268C8D33E7A578C94FF75BE808C15FF7884F092C0E309F1AF99B1A7314FA0F32C8D8E32B3E9D92C9C8FF6B8FBB99111529C4BE3A2A4F62884373D0903180B4DEABE613DE5CF19415DFBA7F9A46297AE2F21D7EA420B41F628FD8DEBA55207606539D11791623CB325F1E18C98AAC27283BFAB2408F4FD6CC58EC9E306643BA1C0C77D84B3930263E5A76A1CE94F3D7721F0098D54E6C990C3AFF69B6A0D82C853EA2AF2D3D2B3E96DAD59FF873171B55D16CA9A7C68DAD2E918174D264919DDCB4B9D01CE622D56C599BF60711C74315C918A7BB97B9513937AFB6A652DA68B6B0B34E316D7BE9F5C282A5E8773C892782EFF220667A6A54069C37B88EB1CE676AAECF2015E59FB7AF4D30C4625DD8DE4805F505E83C877CD61D2A0BA65B32B0DBDFBACFC88CA43E4DDF7A1A4517DCE83B7B8ACF8DCAAD28284039747935865DAF8DCFCA29FB676CE2EBA2C509CD75588FA5E58CEFD0694626C9BB31C3AFC372ED313C9BB3ADC398E89DBDB108DDA63F9380EBF9DA17B378451634682F9823E209BF10E39F884ED270413152025CDBF4875C121B1E83E12C044453FFDA6D8CA2C240AD522577C6898AB6F2ABE1FE77F860939408CD193E605F87FF2248FA163AC2FC0F39BFC38503B23F5441E0E364CAAAB890073266B3B51217661F5DF41C0BA925BB425AB3DD7B6A3675B7D60D0290131EAD53A4EAB0C66BAA83F2FB77E74C3C123ABA7731A3F62FAB8EAB2A96E8BBC911E501CD23A088E7887A469284E0B5C27B5CBC1DE2B6938CF1AF58A47FE78141306CB76E8F2B73620BC4549DB6826D2D72873885F6C5311EB5B9462BB4631D314DFB9C836C6F4D9EEC6818940C04689CC4D8D11ED9869355617861340E722B2BE78197746E2759AAA8D68D1965888E89B6B0F5BF51F94E586B2CB8708F4CDB520BF31DDCCFB7CB69E29A7AE8AAB12C11F431DE40FB9E82EB5F2B6BA1F9757F1487B63255FA69A755601C2FE17CD1892D5A6799C35D05098DC133BDD71318667D47C4671 + +count = 69 +seed = 272E459EAB6A0BDF720E4C5B79E641C95BAB66C3CEE261D0E3596BB04D232ACE0A1CE24BACCAAE9037665A962C711B08 +mlen = 2310 +msg = 62215248E1F3AFB19849F758D742F8AFAB595040C4DC520D603C9A80FA9CF2E97E4F4BD7350551FB667D606BDC31A45D88836CD376785C01F9007D47DF95C1F4D1E30A927A13525409D91C9F5145C0B86D3B44E933CA81E4ED9559AC17940C61EB85B2D26D2C47924AB80ACBAA3D9B1C8855C13EE45F5C8047C161AAA5321839A01783B21A5EE90CF91B8285C4779465B7A89DE3D74D482080F68EB2D8B47429D5475356C50A92B3ACBDEA5786F4D6C2A304AB500490F84FD1D0F21ACBEA325D62D2657F3889B6F591A7F63D8633C061CB14B8266A7FE17642DEDF1D08D9FFE369126CD780D9F99FC6262B5BEFCFEF35D33498CB2CFFE55F2F8D567EA8687DFC6E7D49A61FDBFE768C1D11BF5B3B18CA52225B096490C97CB9A0B3B2CA0762DCC36B60F7D26FCAA4E38B1F3A6279D889323010D9CB0A97FC488E09B06237E6EB0166465C2CBC2B9CD06F155759B6C93CA0CD3178845E0F3A2D20A68757AAF3C4E74545494462CCF28F6F51EC0FDFF4F1E6D98FC5B63BFF068FA7BE1764BCF14497E71E424C9389C5DCF8C5CE1DCD40B82F1D75C3C3970DA433A92A04DE958766AC5EB3645F4D21882F7071383AF8DFFD6CDD91B549F143DCF59FED6674441EEB03D5013E90ADCCBD7E3DA115535AC855DBAAB7F51D70630DC00009E726A16DEADB12047D85906CFF315C73EE7D4E24C9067E3B772F3DCC44C25C7CB8622FDD7B8ECF5E9C877838D71D500F864A662619B1478F8AB4DB2DD09A111ACC99ABE737DDBCA06E88926C4E73B5F5D21EAFC4B11938FEEEA5F8D5A4C616A342B54C9CE371817AA2409A55A3237BE85A50F05B33D35AA86A62E85A01CF34EE7DC840A26FA1B8C6B307817C062D9A2E7163A3B036874D2ABF6531A772D4031FDCD59CA79FBF442CB9155F90148DC3B723778E699C6985634185C3FFDB966ADB80A3D1308150B12964142498466506BC0742783C27BD3472A5CB45021DE066C28143FFBC82B5742BE51E93BCFDE1A61E661B730D8760E108B80C859E4B3A07D483A6A8967E5F01B03EC8B63A20C6A03755C75F419558878A5EB8BB0B2120F183E4BECD4A104EB4DB62CACF5F9964583815334A25BDB75724E549211699AC3BC9B2B5F58F1FB33429905DF81C9422F8B84E95A7C36DEC6AE9B48D4F502D8AB59B69E9D112693578D143A3F111EF00844303950F65DDEEA6E30F1286DE16546F90C4364A5C09755AF3FECB13983C418B2FE4AC17BDDA57E4D597E8BDCCBFBE4082C446FC920E5145BBAFC67FADD9799CD8C7714510DA579516ED39B3E22DE319977FC77A9CA61AE8252795D11724AAA866C1FFDBCBC1FF91AF1B8713248864A4E8B9C59DD12863245F5048110DEDE7FE31FF9836715886C37E9642DBD6C668BA7AB8C2B706CDD58586EB7227B5768C3509C1F66493468859E275700EA38BA69064179F6036D7B50BD232B61C9B9659492894C0057DBFB80329A76CDC57B2A89BBB910483301CA0BF6AEC7D5DDF86644FF52F48FF6C7CD00406CACBC09AA251708BAF3276A52BE2C7B42FB6A9036C318529CA98940769A67DCD532C0000AFB5FC63AD2303E94E09D2CB40CCBE47FAA1DD22ECF528179AD40FD4BFD43717864149243D61CA255344C52743200ED8385A7CA6CCA24CF967D23D07DC2A3F9AD5F3240F4F022A6C6CD281B6C492E8D144A2F4641957ECC65B32C9F74BB468524FF58F0F3DA2F5A56742896CC8F99088574264F857DC67CF04C4B63C6A08FC534229CA8BA616CD504F969EA6E3C98A517355F98A9E884062805B77623239074206E01AD2F3FC9FE9FF8254A5D3525C3B2F0A692803500C967A2E18511EF5B8845DC4B0DEE9338C38C4B1B8B84EE63923250EB6F9E9C272617C7895BD538A6F34D3557812BBBFAB2B8FA6EB5E95B9BCE33AD3185CD90DD536A68639022C079B5CA7748864D37D45FA6780A45AA991F28BC0D3BF371EE2FF0C913CEA6DB38E4A278A4840EA1F255F8E83B6B6C5E260A49D727AA42095A88CB8120B51DAFD764E690102F7FA07CEA2EB86AC613E7BE2F498F5767B622D04E8A6F272976FB058C3334CF8CAAD1D180E3456C210763C974E431CBC3E25EAD8B9FF9243628D5B08D92CBF1D5DF29A85B1A04D2999B3C669227B33610121D543CF4A978F8D9365C0FF8AFFA92B07FC8C8604A0F357F3C669445685B6A29898301A5AFBE10ACE8D64A47009C8741D7CE82E9900643900A3B92A26FE5F24886C06AE0918C3F2523C320699C799CBF72F0DDB08A0F1F63D6DC2F021C78A9D44503209190EE4BE654663679CFD292292D71FC4BA6233A196EF9E95CB965852773404B2622B565BD91FCA6747AAF7F4EADED7BD3BB53645381B687AE04B8D8A9BEF1095EEB39A0BEB4EA89BADB4655A1AFC7EECB7DA0D670C192297CCE0B31BBEFEBFE94C84603BA8C0B7CC73159FF59C01A037CF2C866DC40D88432CD6C2F1989351A4E41343CACF7BF2C2B395C863709D6EC1DBAB2AF514CC771DF14DF095DEA8284BE2B65097D8E6F72EF3936595384AFC0026956E819F1657C901B92644E9D6D32D0D95549729B2CB3D5EFAC9C42A5F284ABC3BF5CCA5B08161B09D9A48FFB2996C3D4383D65B8D1F7FC3248CBE84B9C05464F4A76EFA005FEC342EDD56959CD26CB0DAE1B61B0493A4B68EB3D6335BBC280508F09D84E0C5F4EF520D92CD34D69E5BAB76DF5D2B72CB41A298D370EBEEFCD6C1904B956458BDA581EFA6B3654BE402AC3A971603F23F2B543C5BEEDA5F018543B72C146CF04680BCEA31B4A238460329E2BC12F14C804FDA3494C15452223D2477C9C8A497D04EAAE7DE09D7D7A879D3A5DBA565AE1A38F15E69C18838C487C0FBAD44A068C42EFB7D3F5EF488F91C42F25AC564751F0EFE0ECE7D98BB1B3D0FC42C9756F4B8F9DAF1FD0D414391155285C8DAEAAF380BD07E43570F14E9A47A87BC733F1E676233F17BFB71AAE464AED68487392D339AE064AE27BD57F8695F493AE56CA96C0615BDA8DA37133DD13C2B21DA189A7329773FD8D51381BC118645440B28FA4F402EF84C4091D3A0BC4D206BDCF9007F5DE9AA1E6CF7F6058AC6B69FBC703E908C4221F9065147766E48F54BE4B076406E2F9ED19C1BE982E636FD02DC26267C3ED989E6AD1CCE62E7B988FA7C1831E5126111A4C3C29C38A1F96CCB3A04132175FA46F73C634AC6EC741B135645ABF1DCEA18571CF9A539F5CC935BC6D32BEB1C7B8B3B5A141146EBC12DBBCC17BB4900CF0B95EBFAA52190AFC6D8933CAFC9 +pk = 60EF0B126A9C6D4E63C516C8CD5E79E59120B12401DCB3810368EBBADCA7B70138EA263C50487297FEDF27365F2C3D18E975C33281674353C68C8E78A208490402 +sk = 60EF0B126A9C6D4E63C516C8CD5E79E59120B12401DCB3810368EBBADCA7B70138EA263C50487297FEDF27365F2C3D18E975C33281674353C68C8E78A2084904025BB6765E5196B4CB630EEC5C29DD5CAC3602000000000000000000000000000000F425B20F2217536E45AEF158D8811AF7FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF79BBCE86D4CB62E26A2F2283FC0D71098EFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000071FB66F7400D2D2C6EBF2D8366A3D478A71B2F030A063B8CEEF941812096DB002A0EF3387596BCF180A40957DC95B1B11915CA9E5594DBB747F338E469CA530023AA6BC37EC9EDEE5B333BE90571A76CE1B3C00E6BF38927EFF980A541F003004164E44635684AF9071FACC41CD4FE7377271E95D63814412F4E247031AA6B00 +smlen = 2458 +sm = C1C17EABE7D2D5F2EAFE3390CD73860DB6C5F9536328171D371A4F8D37576304B3B1199EB8B81180FBC7EF78A7F080B7FDD926CCBD079B60E4BB3F501D870402010037CD4B2E93ABE66C5503437321676B17C8C8F3A88DE4F6A194905D5A2AEA074229EBE55F18AC590C316A5A025D2D6F79AB3F70E1D8F20B9251454B442012A93232CF00EAB7A4CDF641EEF8925CBAFC00021162215248E1F3AFB19849F758D742F8AFAB595040C4DC520D603C9A80FA9CF2E97E4F4BD7350551FB667D606BDC31A45D88836CD376785C01F9007D47DF95C1F4D1E30A927A13525409D91C9F5145C0B86D3B44E933CA81E4ED9559AC17940C61EB85B2D26D2C47924AB80ACBAA3D9B1C8855C13EE45F5C8047C161AAA5321839A01783B21A5EE90CF91B8285C4779465B7A89DE3D74D482080F68EB2D8B47429D5475356C50A92B3ACBDEA5786F4D6C2A304AB500490F84FD1D0F21ACBEA325D62D2657F3889B6F591A7F63D8633C061CB14B8266A7FE17642DEDF1D08D9FFE369126CD780D9F99FC6262B5BEFCFEF35D33498CB2CFFE55F2F8D567EA8687DFC6E7D49A61FDBFE768C1D11BF5B3B18CA52225B096490C97CB9A0B3B2CA0762DCC36B60F7D26FCAA4E38B1F3A6279D889323010D9CB0A97FC488E09B06237E6EB0166465C2CBC2B9CD06F155759B6C93CA0CD3178845E0F3A2D20A68757AAF3C4E74545494462CCF28F6F51EC0FDFF4F1E6D98FC5B63BFF068FA7BE1764BCF14497E71E424C9389C5DCF8C5CE1DCD40B82F1D75C3C3970DA433A92A04DE958766AC5EB3645F4D21882F7071383AF8DFFD6CDD91B549F143DCF59FED6674441EEB03D5013E90ADCCBD7E3DA115535AC855DBAAB7F51D70630DC00009E726A16DEADB12047D85906CFF315C73EE7D4E24C9067E3B772F3DCC44C25C7CB8622FDD7B8ECF5E9C877838D71D500F864A662619B1478F8AB4DB2DD09A111ACC99ABE737DDBCA06E88926C4E73B5F5D21EAFC4B11938FEEEA5F8D5A4C616A342B54C9CE371817AA2409A55A3237BE85A50F05B33D35AA86A62E85A01CF34EE7DC840A26FA1B8C6B307817C062D9A2E7163A3B036874D2ABF6531A772D4031FDCD59CA79FBF442CB9155F90148DC3B723778E699C6985634185C3FFDB966ADB80A3D1308150B12964142498466506BC0742783C27BD3472A5CB45021DE066C28143FFBC82B5742BE51E93BCFDE1A61E661B730D8760E108B80C859E4B3A07D483A6A8967E5F01B03EC8B63A20C6A03755C75F419558878A5EB8BB0B2120F183E4BECD4A104EB4DB62CACF5F9964583815334A25BDB75724E549211699AC3BC9B2B5F58F1FB33429905DF81C9422F8B84E95A7C36DEC6AE9B48D4F502D8AB59B69E9D112693578D143A3F111EF00844303950F65DDEEA6E30F1286DE16546F90C4364A5C09755AF3FECB13983C418B2FE4AC17BDDA57E4D597E8BDCCBFBE4082C446FC920E5145BBAFC67FADD9799CD8C7714510DA579516ED39B3E22DE319977FC77A9CA61AE8252795D11724AAA866C1FFDBCBC1FF91AF1B8713248864A4E8B9C59DD12863245F5048110DEDE7FE31FF9836715886C37E9642DBD6C668BA7AB8C2B706CDD58586EB7227B5768C3509C1F66493468859E275700EA38BA69064179F6036D7B50BD232B61C9B9659492894C0057DBFB80329A76CDC57B2A89BBB910483301CA0BF6AEC7D5DDF86644FF52F48FF6C7CD00406CACBC09AA251708BAF3276A52BE2C7B42FB6A9036C318529CA98940769A67DCD532C0000AFB5FC63AD2303E94E09D2CB40CCBE47FAA1DD22ECF528179AD40FD4BFD43717864149243D61CA255344C52743200ED8385A7CA6CCA24CF967D23D07DC2A3F9AD5F3240F4F022A6C6CD281B6C492E8D144A2F4641957ECC65B32C9F74BB468524FF58F0F3DA2F5A56742896CC8F99088574264F857DC67CF04C4B63C6A08FC534229CA8BA616CD504F969EA6E3C98A517355F98A9E884062805B77623239074206E01AD2F3FC9FE9FF8254A5D3525C3B2F0A692803500C967A2E18511EF5B8845DC4B0DEE9338C38C4B1B8B84EE63923250EB6F9E9C272617C7895BD538A6F34D3557812BBBFAB2B8FA6EB5E95B9BCE33AD3185CD90DD536A68639022C079B5CA7748864D37D45FA6780A45AA991F28BC0D3BF371EE2FF0C913CEA6DB38E4A278A4840EA1F255F8E83B6B6C5E260A49D727AA42095A88CB8120B51DAFD764E690102F7FA07CEA2EB86AC613E7BE2F498F5767B622D04E8A6F272976FB058C3334CF8CAAD1D180E3456C210763C974E431CBC3E25EAD8B9FF9243628D5B08D92CBF1D5DF29A85B1A04D2999B3C669227B33610121D543CF4A978F8D9365C0FF8AFFA92B07FC8C8604A0F357F3C669445685B6A29898301A5AFBE10ACE8D64A47009C8741D7CE82E9900643900A3B92A26FE5F24886C06AE0918C3F2523C320699C799CBF72F0DDB08A0F1F63D6DC2F021C78A9D44503209190EE4BE654663679CFD292292D71FC4BA6233A196EF9E95CB965852773404B2622B565BD91FCA6747AAF7F4EADED7BD3BB53645381B687AE04B8D8A9BEF1095EEB39A0BEB4EA89BADB4655A1AFC7EECB7DA0D670C192297CCE0B31BBEFEBFE94C84603BA8C0B7CC73159FF59C01A037CF2C866DC40D88432CD6C2F1989351A4E41343CACF7BF2C2B395C863709D6EC1DBAB2AF514CC771DF14DF095DEA8284BE2B65097D8E6F72EF3936595384AFC0026956E819F1657C901B92644E9D6D32D0D95549729B2CB3D5EFAC9C42A5F284ABC3BF5CCA5B08161B09D9A48FFB2996C3D4383D65B8D1F7FC3248CBE84B9C05464F4A76EFA005FEC342EDD56959CD26CB0DAE1B61B0493A4B68EB3D6335BBC280508F09D84E0C5F4EF520D92CD34D69E5BAB76DF5D2B72CB41A298D370EBEEFCD6C1904B956458BDA581EFA6B3654BE402AC3A971603F23F2B543C5BEEDA5F018543B72C146CF04680BCEA31B4A238460329E2BC12F14C804FDA3494C15452223D2477C9C8A497D04EAAE7DE09D7D7A879D3A5DBA565AE1A38F15E69C18838C487C0FBAD44A068C42EFB7D3F5EF488F91C42F25AC564751F0EFE0ECE7D98BB1B3D0FC42C9756F4B8F9DAF1FD0D414391155285C8DAEAAF380BD07E43570F14E9A47A87BC733F1E676233F17BFB71AAE464AED68487392D339AE064AE27BD57F8695F493AE56CA96C0615BDA8DA37133DD13C2B21DA189A7329773FD8D51381BC118645440B28FA4F402EF84C4091D3A0BC4D206BDCF9007F5DE9AA1E6CF7F6058AC6B69FBC703E908C4221F9065147766E48F54BE4B076406E2F9ED19C1BE982E636FD02DC26267C3ED989E6AD1CCE62E7B988FA7C1831E5126111A4C3C29C38A1F96CCB3A04132175FA46F73C634AC6EC741B135645ABF1DCEA18571CF9A539F5CC935BC6D32BEB1C7B8B3B5A141146EBC12DBBCC17BB4900CF0B95EBFAA52190AFC6D8933CAFC9 + +count = 70 +seed = DCC58DFC13B035323ED44BE50A7096F697C9C143518FED50A59181160960203831A9904847BA20B85E99FFA63E4AB0B2 +mlen = 2343 +msg = 954511394B9D10E1BA162861802A717E24EE42A346C9ED280C88E267A41EC09D6D73B6076E7E30257BF265B71A0B6E0CF408F02BA9078811BE94D0F38559E9985463FC9671D182286CC4F18CABCAEE1A3E5ABDBC384FB27911168B54A387171C0524489FDF512E4D8D2F65050CFE7405D8DF63A79C6E42A76F4538907EFF4DC5870095241523F56FE8E389EBF1A1CC47DDB9F0188513D5259BE257BDA5BE7381F22392CDC2406E0F2448A80F3824F2670F61920C667499DE899F0F6B397381A2DE66255E061AB92CD864DE75C9DB7CBAB9FE76AC38E0AB3389530B4004055268B289B40D79B32E5EBCC74353510BD1627E2D5DD0BE7D3DFD04138F6E3EE7526133DC70490612EAA5024BE6FBEFAB24E1E83D8941A113D8B871F3DBC3011869174888CB7A265D7DE9AB99B999C19AF9B442EBDC904FEDAB52CF40B787AAB35626417C5291F2EB892F43E698A8C65CBB6442A4832F33920FB2DBFC50B8E996FB227F2FF294C385A330957D2FADA9F86839235EA79ECDE6D9D94FBE7C79A38D40B9A8F241F53B921107FF1C72624C9600EC04DFA1160F1FA9E5D986A5A363E9CE8627276DA73F5DB47E4B90328884CFE93194CFFA6FA680F77886E4A7A0FDAF13A7DDFF6984B8855E1F58235BABFD5106338FE2B075D4F10A9FB3D3C5F829B7C61B02B34E9BDE6E62CBCC3AC9F467A6CA170EB43E632EBDBF6847F781E2469B4740FDB83DA34CE34A286E3B363A72CBB13EB66CE1DE35D8FD77DBEDBF45C44DCD16E6B58A1699694D9006947C8C20810E85E3EBF8FB2C68B967743642D86556AB6958E545AB83EC24B96F2B4BB99CC8890C3C1E0FECCE26CE09B6D99000694F870AF9F642374FF0BBF61EFC7CD5AAF5667FC3FE5745DFAF7F13FED70FE070EA4C09CB1A92D8B7F0DFD4B4A4B7DCF4CA6A97043BCEF6346F1570F37B0EB48DB8D15C8A82ED69B0C7833D6C830414C111C987471E84D2CEB5BD973DCA34ACD3A65D7B1A502368941935435B78B8F2B74C2BEF127D96651247BDBE68EB7E466B9EA2A64A13C375103D7C8F7D30A13CBE184BD1EBB19F3274E645F5C7B82EFDF09233D8AD146DC0715266963FD3CCE6F8CDEC20743BF1B7F57C101AC24C64D568923203E1A6AF03A700F5A401EC4572BBA528E284C151F1D108F7563858011FAB32B3776CF2B910D7B21180DBE75742032791018258F4D1407C9A213755C5C91205352DF919B6F14BE056243DF6AC2909E52C9A79F6917440667719185F1C5F1AAF40D873BA22956FA0BBAD9C35360853333A10A0841D9D2E758A0B1BC187F6BBD31C41B74F9EEEF1F7A28BDB7AC3D52FDC6FCB3EF0383A06A61188548963E552716D2BFBD6C2DCDE496D06615E86A5CDB76A03BCA2822ABA85EC6807EBB6918AD2948D193CCF74F4BDAF7090CD4294C1785DCEDB6B55886A848284A6A4A88A496800053E84A9F2DBF6B334AACE11A5A540626716302E259A64C6316ED543806B3BBFE37563897E83BBEFA570312DF908C1786DF0FCF55069EDC336501A5AE9D4BF212D56A9CEE811038656912238AE284575EF8DE1285B763AE54ADF44F91B6DD9E309B7A7A0AB71EC2E4611831B3CE1C9DC85CF907B52DF7406B06367E7A43DECE72DCCC57D268820EA021C27056E3C6B50E7BA7A59B53539A6B7B06B35051E3151C23F3BD3C889B25D0ECE1FD0DF1AEDF657FBB096CA1C861ACB0158501EA1AEFBF6DAD11BDC325AC1CED3739A40B7A83458EF4F3453C0F6EABC1A48037809A90480DF9DC4FF07DADDC58DF2733D49A4FA53C2A41E55A4A0167C6D33BA6E752AED3A125DFD6A0322CD235254505D7B3CED7A0DEE7EB662ACFD30F8B79D1A872998CBCF15CD86E26809E0D2DA0324DDC90FD12CAF9D8E4EDA437FE4E658D47D67C95927C4B5DEE965B940CE93E6743917296E10820A7101F8F633C93069E8B569F4625AFD4EC61BFE4549FDD06C2290A91AC0FB40CB1F55DC8BC1FE695C73AF603840AC0351F5256E00555C984E79A09E58C566D1A117B7E569BEB5850FB491FD9B982442B55BDF53832AA65180DCDDC2F768B1A1361994DE8C25F3608EC853D5982E0AFD1F9FA70170FC3589DDAF958DD840B4B502F8E2697D01AD7AC2233F6A16D540EF8D232887D2B4FA727AE2F038A69AF3DAE69EDA8EF6BF1E0B67D811160B75231543EC5A4D0778B7B42FC1DD6732385AA4400450B3CAEEFDFFCF147635CFA4AAA53DE4EE3035BC40CE8670016384BB877A86A15B59F3DF0C5D624D3D2B23EC46913618C745330A96C715C6F0BD096487E89B917384CC30B3D20A332F1B4056462227E98AF9874FF1D18DF2A6BF84AE822EE737F9E34EE8C69F23EEB9BF38ED056F499545F405759355C104284A6D08A9EFAD8FE28288B2084336A6479A6D42404F3E6FF3AD1DFC63C8AAE971AF11F2699F32F57AD29188492CE07BC1A271035B4D13A686EFDE5572353283A0F3138F6DC05CC35E5E5057C5C8B9E12B0164C0915ADEDF40A6E23848FA59ADC0E65BDD2120486942F232315FC94B4676751A35AAED2828889864C4CB7DD95A662A475733C2CA8F6997A9C822C6C8B9DC95A8B4C367E613E97D3EC6D6DDC2F81022EC21B3A93244E3BC8C2737A7724A3CBD480B26819EEB2676FD383601D79FA266ED3F9BAC2A98FF0109AD7E43E33E108D88C09BA82AFCCCFE98F50F789109D99DCD0A2C61947544F3666EDC621B5D5ECB7088B2430A611BEA52BE7F5EDFC6E2649F5E81F6DF72FA9A748BFF06AF766A60D2B751B23A8AA95CBF733359F7C0CD19B1482A6E6572D1570349C688D78CF8B8C7DD37576DC47A193A2C2797D0AF7504DEE303823A8B77204AE7B6E91D431979798A7EDF435056251D0E3F26B2CA16BFE3422CEA0398D30F0A0DC06DC8A93D27D13650E5BFB6BA04C93FAF0D7D06F99FE4F1F52A059FBE808179515FDA48ECA714F0947FE9A98F02D66FB0D80952411CDFCEAEF6ABA16D92B8F1B82DB151D7DCD7FB7781EC55F4A86C86011FBB9C5570EE76897E7803036E2FE3CDC2D5EA7A613897F3C69A6EA734E3811BFD15E90D7256A0C0C88CEB54EC6AAC151B435CD2A870E4A02087C2B847C75B00B44BB3CA6D4404C3052BD308B8D5F595277592D26F6D5A2193CD4D650BF931FEFB9DEEE61032B29EC0412F38E1CBE025B2891C59574C1450D9E3D8EF27940EF712143F06F38DDB86341A7FC781E0FA8971DAD13AA7E93F1858C70A71A40164211EA9F6A41AE90D19032C2EA52C23375CE3C4E59599ECD6855213AEA83F8DFC5CC70F58A62E4DCA17C09705C0C099B29056592986C03CF5D67074735F2BEA +pk = 3B089D505FB33DCBC5560056711F992895F29F94AFF09F31BD9C5705945856025AE61E2E0E9E4E9CA2589B911D7DEF56AB5315BD0DB717C50AD5EF98F2903B000B +sk = 3B089D505FB33DCBC5560056711F992895F29F94AFF09F31BD9C5705945856025AE61E2E0E9E4E9CA2589B911D7DEF56AB5315BD0DB717C50AD5EF98F2903B000B69F537F942A20336E0C3E546993579744C01000000000000000000000000000048D9AE5CF7CB0A5A8EDA25219ADFF139C2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE729C4CA28B9ACDA8F8D9047F8EEE427D6FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000008212628C5977FC464D8BDC353344D042ACF26073C7DB7B6C86178CAC20F01A00A1A515B56B2179E951EC6178EC81EFCA87B2A481F40C0CC2618A473D153AFA00F3DD43CBC0600734EB22593FEF00A6AB5AAA33AC60EDD19333BCE9C5BEF23400CD632ECE0AC9EDC1C3B179FFE1238F124739E73EE9F2E08B3AD2FD068AC8EC00 +smlen = 2491 +sm = 853ACCA5DA0709AE899C55E1D6DB56EB638BDA8D6D341714CE70755F33811C02182CFE52390CA5DDE01A523F0F40CF15D6ABBFCBAE17CD95BFF0A13611C3D30301001BE9C44342683FA01A6A5DD404D81A09E17A3E4CDCB83BE7642460815EF3406C0DA8EE94927E804EB736F55B6440177674C42FE28075C3EE393C8A000BEF55081B824FE5AE23F3CC6B2374C6C0A86D00020B954511394B9D10E1BA162861802A717E24EE42A346C9ED280C88E267A41EC09D6D73B6076E7E30257BF265B71A0B6E0CF408F02BA9078811BE94D0F38559E9985463FC9671D182286CC4F18CABCAEE1A3E5ABDBC384FB27911168B54A387171C0524489FDF512E4D8D2F65050CFE7405D8DF63A79C6E42A76F4538907EFF4DC5870095241523F56FE8E389EBF1A1CC47DDB9F0188513D5259BE257BDA5BE7381F22392CDC2406E0F2448A80F3824F2670F61920C667499DE899F0F6B397381A2DE66255E061AB92CD864DE75C9DB7CBAB9FE76AC38E0AB3389530B4004055268B289B40D79B32E5EBCC74353510BD1627E2D5DD0BE7D3DFD04138F6E3EE7526133DC70490612EAA5024BE6FBEFAB24E1E83D8941A113D8B871F3DBC3011869174888CB7A265D7DE9AB99B999C19AF9B442EBDC904FEDAB52CF40B787AAB35626417C5291F2EB892F43E698A8C65CBB6442A4832F33920FB2DBFC50B8E996FB227F2FF294C385A330957D2FADA9F86839235EA79ECDE6D9D94FBE7C79A38D40B9A8F241F53B921107FF1C72624C9600EC04DFA1160F1FA9E5D986A5A363E9CE8627276DA73F5DB47E4B90328884CFE93194CFFA6FA680F77886E4A7A0FDAF13A7DDFF6984B8855E1F58235BABFD5106338FE2B075D4F10A9FB3D3C5F829B7C61B02B34E9BDE6E62CBCC3AC9F467A6CA170EB43E632EBDBF6847F781E2469B4740FDB83DA34CE34A286E3B363A72CBB13EB66CE1DE35D8FD77DBEDBF45C44DCD16E6B58A1699694D9006947C8C20810E85E3EBF8FB2C68B967743642D86556AB6958E545AB83EC24B96F2B4BB99CC8890C3C1E0FECCE26CE09B6D99000694F870AF9F642374FF0BBF61EFC7CD5AAF5667FC3FE5745DFAF7F13FED70FE070EA4C09CB1A92D8B7F0DFD4B4A4B7DCF4CA6A97043BCEF6346F1570F37B0EB48DB8D15C8A82ED69B0C7833D6C830414C111C987471E84D2CEB5BD973DCA34ACD3A65D7B1A502368941935435B78B8F2B74C2BEF127D96651247BDBE68EB7E466B9EA2A64A13C375103D7C8F7D30A13CBE184BD1EBB19F3274E645F5C7B82EFDF09233D8AD146DC0715266963FD3CCE6F8CDEC20743BF1B7F57C101AC24C64D568923203E1A6AF03A700F5A401EC4572BBA528E284C151F1D108F7563858011FAB32B3776CF2B910D7B21180DBE75742032791018258F4D1407C9A213755C5C91205352DF919B6F14BE056243DF6AC2909E52C9A79F6917440667719185F1C5F1AAF40D873BA22956FA0BBAD9C35360853333A10A0841D9D2E758A0B1BC187F6BBD31C41B74F9EEEF1F7A28BDB7AC3D52FDC6FCB3EF0383A06A61188548963E552716D2BFBD6C2DCDE496D06615E86A5CDB76A03BCA2822ABA85EC6807EBB6918AD2948D193CCF74F4BDAF7090CD4294C1785DCEDB6B55886A848284A6A4A88A496800053E84A9F2DBF6B334AACE11A5A540626716302E259A64C6316ED543806B3BBFE37563897E83BBEFA570312DF908C1786DF0FCF55069EDC336501A5AE9D4BF212D56A9CEE811038656912238AE284575EF8DE1285B763AE54ADF44F91B6DD9E309B7A7A0AB71EC2E4611831B3CE1C9DC85CF907B52DF7406B06367E7A43DECE72DCCC57D268820EA021C27056E3C6B50E7BA7A59B53539A6B7B06B35051E3151C23F3BD3C889B25D0ECE1FD0DF1AEDF657FBB096CA1C861ACB0158501EA1AEFBF6DAD11BDC325AC1CED3739A40B7A83458EF4F3453C0F6EABC1A48037809A90480DF9DC4FF07DADDC58DF2733D49A4FA53C2A41E55A4A0167C6D33BA6E752AED3A125DFD6A0322CD235254505D7B3CED7A0DEE7EB662ACFD30F8B79D1A872998CBCF15CD86E26809E0D2DA0324DDC90FD12CAF9D8E4EDA437FE4E658D47D67C95927C4B5DEE965B940CE93E6743917296E10820A7101F8F633C93069E8B569F4625AFD4EC61BFE4549FDD06C2290A91AC0FB40CB1F55DC8BC1FE695C73AF603840AC0351F5256E00555C984E79A09E58C566D1A117B7E569BEB5850FB491FD9B982442B55BDF53832AA65180DCDDC2F768B1A1361994DE8C25F3608EC853D5982E0AFD1F9FA70170FC3589DDAF958DD840B4B502F8E2697D01AD7AC2233F6A16D540EF8D232887D2B4FA727AE2F038A69AF3DAE69EDA8EF6BF1E0B67D811160B75231543EC5A4D0778B7B42FC1DD6732385AA4400450B3CAEEFDFFCF147635CFA4AAA53DE4EE3035BC40CE8670016384BB877A86A15B59F3DF0C5D624D3D2B23EC46913618C745330A96C715C6F0BD096487E89B917384CC30B3D20A332F1B4056462227E98AF9874FF1D18DF2A6BF84AE822EE737F9E34EE8C69F23EEB9BF38ED056F499545F405759355C104284A6D08A9EFAD8FE28288B2084336A6479A6D42404F3E6FF3AD1DFC63C8AAE971AF11F2699F32F57AD29188492CE07BC1A271035B4D13A686EFDE5572353283A0F3138F6DC05CC35E5E5057C5C8B9E12B0164C0915ADEDF40A6E23848FA59ADC0E65BDD2120486942F232315FC94B4676751A35AAED2828889864C4CB7DD95A662A475733C2CA8F6997A9C822C6C8B9DC95A8B4C367E613E97D3EC6D6DDC2F81022EC21B3A93244E3BC8C2737A7724A3CBD480B26819EEB2676FD383601D79FA266ED3F9BAC2A98FF0109AD7E43E33E108D88C09BA82AFCCCFE98F50F789109D99DCD0A2C61947544F3666EDC621B5D5ECB7088B2430A611BEA52BE7F5EDFC6E2649F5E81F6DF72FA9A748BFF06AF766A60D2B751B23A8AA95CBF733359F7C0CD19B1482A6E6572D1570349C688D78CF8B8C7DD37576DC47A193A2C2797D0AF7504DEE303823A8B77204AE7B6E91D431979798A7EDF435056251D0E3F26B2CA16BFE3422CEA0398D30F0A0DC06DC8A93D27D13650E5BFB6BA04C93FAF0D7D06F99FE4F1F52A059FBE808179515FDA48ECA714F0947FE9A98F02D66FB0D80952411CDFCEAEF6ABA16D92B8F1B82DB151D7DCD7FB7781EC55F4A86C86011FBB9C5570EE76897E7803036E2FE3CDC2D5EA7A613897F3C69A6EA734E3811BFD15E90D7256A0C0C88CEB54EC6AAC151B435CD2A870E4A02087C2B847C75B00B44BB3CA6D4404C3052BD308B8D5F595277592D26F6D5A2193CD4D650BF931FEFB9DEEE61032B29EC0412F38E1CBE025B2891C59574C1450D9E3D8EF27940EF712143F06F38DDB86341A7FC781E0FA8971DAD13AA7E93F1858C70A71A40164211EA9F6A41AE90D19032C2EA52C23375CE3C4E59599ECD6855213AEA83F8DFC5CC70F58A62E4DCA17C09705C0C099B29056592986C03CF5D67074735F2BEA + +count = 71 +seed = 270BEDAA7BCD43990FD8B4F44FFB63A3AE8E991BB2BF84DA7BC2CCD1A079C579AEBE2082ACBAB7FF286DE795F31973B4 +mlen = 2376 +msg = 326A4FE723BE9363ACFC000705A10B6CD8A7B25E99A34B4A354CBD6F50550BED30F6C4208490B4194AB79B24B093FBE132C299DF924F2FFCC2CDC6C2C9019EEDF4B72D7F0817825BD787135927102E1DA041E9A78B501B42DCE777A79ACE604E57DF11775D7B87E75E5B00ADAC90D1ADD78CC5AD348C7472EEC6E6E06F737E77115A9509A6AE6570F738DC2F21314A7CCB9D44ADD6E1434CDFE3614BC73A6B468F6691B60F4F2DB103289A90C4FB2BF5AAF87826D2BEB0880FA64E07E9BD30D4EDA00D6BDA01D1EB22BCF14EE797A859C9A0D9034E8C5316201AF91388C47E1DDF061C9F45E067A5F60B355C98F8734559B8F1B82F47BD9CEE0224A1D67D40706333523C34F3582B6C8CB47BF7D0E4FBC7D7CF3DBF21077E664FD59998338F4DD4A423C3A145EE1E994AACC1A48F81A7E9FE106008DB93A6626B8C8505043AB864D93AE3972675E69C3825304086AA3419216CCAE7F7D5117739E99D8F4A0B658148DE33FDAAEB9967EF56677D2028C3B584C5CC1C096F4DA16799408B2EE2FC3482AD2F49293CF4097A78492470099BDB90BCB4FE3B245AC8B3C53E05D7609E34770ADCC147033A8FADE81359FF63C3FB90C5A498C98B7A0E5EE9CF4D287759ACDA4BFA3965CA85E1D1C1019E7FE6D82E5E66A717F94890277E6DB1EAA6F3291FE1BCD7D437094749FF5574B8728E0DC21A143A14E382937EFB7EC1B0FB3F6F9C0F547F470E3B436DFC7986F923BEAA89583D8978C433E0CB0C4E98516AF1AC797C778662455A57FEF45BA2C7865C1DF5C502EDB01C8CC729468091BB96BE9DA9C298528187867EEE9A06141DAA15F60CF719DE2BD15010550B92A41F12D8F38B54692589AFF51A9D5E6047A0D9B707369992251DF31341A45B01B05FFED8ADEE5810824F903EA59F14FD500AEDAE797F8BAEB470C0B14C4EDA5C687E4848A85B30A8E8F59C45D4C9F0C65FCCB15F4D4209A55722C29B6CB09AECB4E53FA3AA602C56EE3BA6900CC12889E7B87D5EF283AF1586764519A30CF60833C82F0ED15E39A8BCAD5C6AEE9999E63D399C5CEA10AE1F53B04858EF7896AA29FA541451FDB685734C39470250545193CAF26C9891F7F965904AE10E8566BFF9B2F465BBE13D6EA4A79586E68844B9FA68B2F992565C8B0EF5FFDEB5878CC12A0571CA3AEA50ADD29DD06E13741A1AB215BF487BE7735D1634332F47E037253054A21E0AD8D8F011334CB5951F833D4D344D632BCAB7C373CB7DAFE8F3D79E7E13BDB1C6CFFA474A9FBB46F5736D55F3466534596EBD22B29107A8FA50C1D0E62F0533E343FEE038FC0C3040A6DF2D318BBC8420019B1B148D6D1DD2FE428C2FD617CA73F224EF9AF9BF6F83CF1006616235471B69DD4EAF9F32529EF3E1DFE6765E61E246B519C702351C9CD66C57065EC78993D793B082E3685EB06F2530B07862277D339A52813C99EBE16C06C4C8F547D9705850E770982E8FA0275A52F430FF2422A115ECE46A9202CAA0195789532B1444F1507AAB2E4303464E499989F21C7D881328F18DBC77D4B9B467CAE244A93053C0321DFBF815DA28B6EBF483EAFBE634E9947BB5383FEE3A31BC03A63FCDDA5E3E46D5D3184718C348A83975728714351DF43BAF91787CACA346DBB819602F18A4C4FE90C4CE307984BCDED89CD2E4AEB66318C10D95AFA5BE53393FEB981C21BB1411BB9C58818BCC141223D66ED5F35F90C05FD4848617220DD72F5E892292CE20AA9A0F9AD54022CBE94D2C86DAF3FC66949AC35D8E122B02E2D155E73F4CE24D7E85A5C301DCC173CA8EC090AF9DC7F443C983280DDA27ED4B9BC71F86E84F7AEE39E6A7E9BF5E43920AAC858F0F49A06216D9D3984CD2E3575C0FA6CE8A5E28B0F481CCBAAB450FABCE8A1084EF458DBE257CF09D8116136C2CF1EDFA6CCE31AED0F1F8278C1C8D9C79846886D48E3FD311C015BF2373F7CAA71AA26B011D0DF5A843AB53D7E7F0466CCF49C5D4DE872CA87B8895101EE0147A3DBD391BEED75FC16F65814D56CB29273A5F4E5400FCABF85040505C31D001DF0023726E9C1F7C29A37039FDDA73B9B99ACEC3A029F7C0DD61ADE7D5E835E1CD605AA8E583BF8DC99285E86CF91F4B4827A0E8956EFDE2B495A86F85E78B954341CF3AFEBE8DB71C26B9B1BA27B47284AA84E55B1C2AFEE733AC596A10186D9AB504F33E34A06CA931D7633462B04B9B2B0D4751B0343503BCB2A1893D944FBDB4BE63DE167348A1588E6551FD9CF2101B0B4CB61422655FBEB50D64CB9E87A23007A39821EC3ABA391485347624EFC3DFDA4A133C537D7CD8C3A549BB6BEF9A52D2EDF0A8892C6FC3EEC3EFC3C18741C85BF24CD3B36CA04EE77F654ED5595A0E4B9316CCFE4D2AA6B4A66B06F309337E363C9E39829C8838729F19811093DFBE962246473B7A19FAEDFDB0193F63EB85EF308CD3BE5831F35CED36D9448D0EA8306044F78946079210CF89FF78104BCB2964CE2AF9954D53885D7914E4FFA4AC7E9B3D103922FD1AD68C0A4592F885C5FEE51D52214E17035E8681086203B79B5EB176679EB3263B44EA7287262DD84BB98F6639B9657AC04E397D69C634A0C1181ECA485E467D62631AD2D9AFD5AC5B86ED4005FDBB7404B65BBB826F1A2334A481B9CD46E0CE9C414A162E84368089F24149D7D05EA6ADF40B25A708357AAA5A28801FF100F69252810188CFC6087507BB5BDE1CD43BF72B1B3207CE4F7E65A18E5276613D4BEDDAF21AF7B964FF69965C47CB03846F7CEDDD2C5133080FC632A4F0B3495B2D2751727CF7681F28675552DF2A0994E425A922BBFCF84189B8C9F43058D691DB3166C596F6BC480EFDE06BDAE7B9C2985A1F2F6441520620E193D7B94AB46DBA2A1ADE44E2B006734E6770F34B0E2122DD7F4EAF045164DEA8C2FECE7758630384C00A6B528A6ECF07045B2DC0281C936A540904733149BC65B0F57ACD9A5E41C2ADF83FD6A760B169BEEBF04644DB1314270ADF86D01CC2CD580C609E78BBCD9D2694A89F9CB6DD36B9AA2AA5581FF561B5417BE2B52F3EF2581E461CB0690782F33862C52590643BECE0A6141DC805D8F56C4F64C1BBC49A3ECF1E8827926796E5F9335DF47DA6D3E4C14795B547116FD1F3351FC55C28B543183FEAD8DF7DA4DFBCC38E224901FF7BD83B16631064CAC4A37FA632F53F004374AA19861FDCA515AF91E66186EF804366D5A1B3B4FAAA60A0C4B36B972A9579548B4CDACE7EB85F1F68A4E4255FD994C1786975E7F6F0BA87D0295DE72876BCE37146A09EDEBC0164B9C4911CE41EF4D48130A27651BD0DC315FD622CB6D03759D35756806332658B5B33E768860C1946569AA45130486AD49B +pk = BA5EF98156C26EAECC654C2D2144A40683136EDF913DF2BBE2AD3B8820C8F8003F5F6CC2E69AB3E8FC8162D53A4840E9AACC4A0AC29F5E5E5B1D4C5F8579D30219 +sk = BA5EF98156C26EAECC654C2D2144A40683136EDF913DF2BBE2AD3B8820C8F8003F5F6CC2E69AB3E8FC8162D53A4840E9AACC4A0AC29F5E5E5B1D4C5F8579D302197F973C91AED63FA8A626FA708A764279A20000000000000000000000000000007A4FBC2E64763B38A609DE3FA674BD7F79FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF415F2C9AF4BDC0D2DF1210090540CDBADEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000085E2F46C7A57C832E4A26B0CCCA817DE862DA90882A7B036178E11F8BF3F390014309ACEC4D0E6781E366052F383840F7B0A0C35A25B566B40B79AD05CA30300A6AF5E43E48238432AF0328EE9DB13830A080230619936E2A9AEF20E371175002D9409918C36A0B39FFE260B3C885EA8E528CB1CE6A53C7635FB7B0ACE033600 +smlen = 2524 +sm = E2B1A2D592E69342482742BF1514347C660772423EE2601C1231C0906D299102441A5A0BFC17C23423484923CC526FC2A5454BAD0E0E5F6DD662C176D3A18C0200016BADF266909B4567D4C2E490D22AA4B63D19BC5C3BFF98484BC2237875BAD9D827EA33723C623669CCC5EAEC15B691B0B34A0BA09183500CA547D099AFB5A933405417EFE5E8348D0D47DCC13F48FA02040B326A4FE723BE9363ACFC000705A10B6CD8A7B25E99A34B4A354CBD6F50550BED30F6C4208490B4194AB79B24B093FBE132C299DF924F2FFCC2CDC6C2C9019EEDF4B72D7F0817825BD787135927102E1DA041E9A78B501B42DCE777A79ACE604E57DF11775D7B87E75E5B00ADAC90D1ADD78CC5AD348C7472EEC6E6E06F737E77115A9509A6AE6570F738DC2F21314A7CCB9D44ADD6E1434CDFE3614BC73A6B468F6691B60F4F2DB103289A90C4FB2BF5AAF87826D2BEB0880FA64E07E9BD30D4EDA00D6BDA01D1EB22BCF14EE797A859C9A0D9034E8C5316201AF91388C47E1DDF061C9F45E067A5F60B355C98F8734559B8F1B82F47BD9CEE0224A1D67D40706333523C34F3582B6C8CB47BF7D0E4FBC7D7CF3DBF21077E664FD59998338F4DD4A423C3A145EE1E994AACC1A48F81A7E9FE106008DB93A6626B8C8505043AB864D93AE3972675E69C3825304086AA3419216CCAE7F7D5117739E99D8F4A0B658148DE33FDAAEB9967EF56677D2028C3B584C5CC1C096F4DA16799408B2EE2FC3482AD2F49293CF4097A78492470099BDB90BCB4FE3B245AC8B3C53E05D7609E34770ADCC147033A8FADE81359FF63C3FB90C5A498C98B7A0E5EE9CF4D287759ACDA4BFA3965CA85E1D1C1019E7FE6D82E5E66A717F94890277E6DB1EAA6F3291FE1BCD7D437094749FF5574B8728E0DC21A143A14E382937EFB7EC1B0FB3F6F9C0F547F470E3B436DFC7986F923BEAA89583D8978C433E0CB0C4E98516AF1AC797C778662455A57FEF45BA2C7865C1DF5C502EDB01C8CC729468091BB96BE9DA9C298528187867EEE9A06141DAA15F60CF719DE2BD15010550B92A41F12D8F38B54692589AFF51A9D5E6047A0D9B707369992251DF31341A45B01B05FFED8ADEE5810824F903EA59F14FD500AEDAE797F8BAEB470C0B14C4EDA5C687E4848A85B30A8E8F59C45D4C9F0C65FCCB15F4D4209A55722C29B6CB09AECB4E53FA3AA602C56EE3BA6900CC12889E7B87D5EF283AF1586764519A30CF60833C82F0ED15E39A8BCAD5C6AEE9999E63D399C5CEA10AE1F53B04858EF7896AA29FA541451FDB685734C39470250545193CAF26C9891F7F965904AE10E8566BFF9B2F465BBE13D6EA4A79586E68844B9FA68B2F992565C8B0EF5FFDEB5878CC12A0571CA3AEA50ADD29DD06E13741A1AB215BF487BE7735D1634332F47E037253054A21E0AD8D8F011334CB5951F833D4D344D632BCAB7C373CB7DAFE8F3D79E7E13BDB1C6CFFA474A9FBB46F5736D55F3466534596EBD22B29107A8FA50C1D0E62F0533E343FEE038FC0C3040A6DF2D318BBC8420019B1B148D6D1DD2FE428C2FD617CA73F224EF9AF9BF6F83CF1006616235471B69DD4EAF9F32529EF3E1DFE6765E61E246B519C702351C9CD66C57065EC78993D793B082E3685EB06F2530B07862277D339A52813C99EBE16C06C4C8F547D9705850E770982E8FA0275A52F430FF2422A115ECE46A9202CAA0195789532B1444F1507AAB2E4303464E499989F21C7D881328F18DBC77D4B9B467CAE244A93053C0321DFBF815DA28B6EBF483EAFBE634E9947BB5383FEE3A31BC03A63FCDDA5E3E46D5D3184718C348A83975728714351DF43BAF91787CACA346DBB819602F18A4C4FE90C4CE307984BCDED89CD2E4AEB66318C10D95AFA5BE53393FEB981C21BB1411BB9C58818BCC141223D66ED5F35F90C05FD4848617220DD72F5E892292CE20AA9A0F9AD54022CBE94D2C86DAF3FC66949AC35D8E122B02E2D155E73F4CE24D7E85A5C301DCC173CA8EC090AF9DC7F443C983280DDA27ED4B9BC71F86E84F7AEE39E6A7E9BF5E43920AAC858F0F49A06216D9D3984CD2E3575C0FA6CE8A5E28B0F481CCBAAB450FABCE8A1084EF458DBE257CF09D8116136C2CF1EDFA6CCE31AED0F1F8278C1C8D9C79846886D48E3FD311C015BF2373F7CAA71AA26B011D0DF5A843AB53D7E7F0466CCF49C5D4DE872CA87B8895101EE0147A3DBD391BEED75FC16F65814D56CB29273A5F4E5400FCABF85040505C31D001DF0023726E9C1F7C29A37039FDDA73B9B99ACEC3A029F7C0DD61ADE7D5E835E1CD605AA8E583BF8DC99285E86CF91F4B4827A0E8956EFDE2B495A86F85E78B954341CF3AFEBE8DB71C26B9B1BA27B47284AA84E55B1C2AFEE733AC596A10186D9AB504F33E34A06CA931D7633462B04B9B2B0D4751B0343503BCB2A1893D944FBDB4BE63DE167348A1588E6551FD9CF2101B0B4CB61422655FBEB50D64CB9E87A23007A39821EC3ABA391485347624EFC3DFDA4A133C537D7CD8C3A549BB6BEF9A52D2EDF0A8892C6FC3EEC3EFC3C18741C85BF24CD3B36CA04EE77F654ED5595A0E4B9316CCFE4D2AA6B4A66B06F309337E363C9E39829C8838729F19811093DFBE962246473B7A19FAEDFDB0193F63EB85EF308CD3BE5831F35CED36D9448D0EA8306044F78946079210CF89FF78104BCB2964CE2AF9954D53885D7914E4FFA4AC7E9B3D103922FD1AD68C0A4592F885C5FEE51D52214E17035E8681086203B79B5EB176679EB3263B44EA7287262DD84BB98F6639B9657AC04E397D69C634A0C1181ECA485E467D62631AD2D9AFD5AC5B86ED4005FDBB7404B65BBB826F1A2334A481B9CD46E0CE9C414A162E84368089F24149D7D05EA6ADF40B25A708357AAA5A28801FF100F69252810188CFC6087507BB5BDE1CD43BF72B1B3207CE4F7E65A18E5276613D4BEDDAF21AF7B964FF69965C47CB03846F7CEDDD2C5133080FC632A4F0B3495B2D2751727CF7681F28675552DF2A0994E425A922BBFCF84189B8C9F43058D691DB3166C596F6BC480EFDE06BDAE7B9C2985A1F2F6441520620E193D7B94AB46DBA2A1ADE44E2B006734E6770F34B0E2122DD7F4EAF045164DEA8C2FECE7758630384C00A6B528A6ECF07045B2DC0281C936A540904733149BC65B0F57ACD9A5E41C2ADF83FD6A760B169BEEBF04644DB1314270ADF86D01CC2CD580C609E78BBCD9D2694A89F9CB6DD36B9AA2AA5581FF561B5417BE2B52F3EF2581E461CB0690782F33862C52590643BECE0A6141DC805D8F56C4F64C1BBC49A3ECF1E8827926796E5F9335DF47DA6D3E4C14795B547116FD1F3351FC55C28B543183FEAD8DF7DA4DFBCC38E224901FF7BD83B16631064CAC4A37FA632F53F004374AA19861FDCA515AF91E66186EF804366D5A1B3B4FAAA60A0C4B36B972A9579548B4CDACE7EB85F1F68A4E4255FD994C1786975E7F6F0BA87D0295DE72876BCE37146A09EDEBC0164B9C4911CE41EF4D48130A27651BD0DC315FD622CB6D03759D35756806332658B5B33E768860C1946569AA45130486AD49B + +count = 72 +seed = F151196F55A9ED88F1663AF6BD24B2CB9DCAF3C9B313CD8F0A27639D3CDAE72EA90D60ED5C7C6AB697A06185E5A2E215 +mlen = 2409 +msg = EFC63DD588A7230CE08EFCFEEA534F5A0EB005480AD1D169C386E476715238526E936FEA7136E2D8AED60DE31CC91DAE4E764CE5F93624FA7F72B87562FB6AD8996B5E41FD478AF0AF8338A7FD9AA250EFD2F2D20364E8A88A8642E8E38F38583ABF8D3BE97F14C3EDE66EBF8EBC84385CAE646CDED8C5CE8F06910BA7FEC05D828446D558D6FED766FBA347DA2E84DA247C34266AA31C328804F4E3AAF6ACBB0AD50FEECCEC00D20B3610785B9F1BA06A0BADFB42A8F43DE3F7BAC36057EE0B4D2A15DB040A8903F767F7352995C8FC3E06ED1B1322587EEE5B31806192E04B09A7B433D08CB2A340942CB75C51E0F8409F907F69C5F8DC316A227942EDF7A458974FDA76C255FF4F1A85A352CD2CD2A21507E0F37451060D31D0847528B3ED5DA3E7168CBD0302F1B03842E63B3DEC6FB37357E37FC3CC26721F290726A47AB3D4DD8FD1778FE5133726C240E7B3E398F3D809C6C469680B9EFD25DBE890D6936B76A52F97AEF3F93872B76506A95685EECDCBCE203400D182252471B99B7F4C6CED4CAC8FACA7682D0DF07BC5904AAE042479855098CBC41534F0EF17F38F1BC8C272CF72C1AC4A5564DD132130EE676E7D7EC3CABB4E85AC81945C87DE08EC60CED3FA0AB3E83C18AE493A851434BFA2C4968B42ACCCF3609539C62A4E01F8BC159362E15EE91D8AA399D8BD8D67BA1E8FD646EEBB4583812293406B05BA5BE2B1DF9620E6FE3DAF8CEBD9652BB04494B899F407C7D9ED1C4E77FFADE24ABE56AD597BD438928E05B0363D6D2685D34D6B51D71012844415C46F13181B146A3AF25AE4E8853CC7C7EF6387306C45180A6EF9E97ABE1E7D5E10115752C3071B6A213367E8B1A3D1C3703CC1840735315623901D772C61D55EF8C47DB10F0EB7582D7A043018DC1363E93F315DD984B8002EA7BF5BED38D3F273276CA577CF99A635CB6ED9D6525520793405BE27C86E6EFFEABB1E5F84A0076BD151CAFC59853424DE4B3460C673B0820D76E15EE47B6505D2D5C179DB92A44042F3631C646D350EA9721B8984660A76018DCA5C6BB1223CD03CC844DC9371D32549D9D645F75D2683FDAD1DF6434BBE43200E506ED2A815FAB511172C70F99A85FA3970433E8955B2F9389F23C10141B5779A23B8671EAE8B91991B78F635FBE8E627D3E79D91FD1E6E90699640BA3AE8D7E4CF5145F1259CC76AE50B1FA150D8338A9450A5B6B90EEC9C94318BC78C9C7715A3EB215AEE6443540D211A0556813529023E5A581623CD6D19BEF0705A5F69AAD4833A57C308144E92899AC5683147CDBD279D5C3A55BBC5E8F8E26A158A3E42F8C5B858909B024B4BA4069E26DE66460FF4A7DC92BD54AC244007B6AC6CE07A31A2AF3323CB55F07B8F480D279308FE10F2DDB001DA6C4AA132B988AD03FB63E0EB06544571F5505CF377A81153D6FBD4FA2B7562074CFAF587CCF28DAC84AFA58809C0B296E0D2594D3582C28596F5AF7500E143BE7B49C63D04F49BBFBDF60B024DABA5533F945BA90659758E06984921EFEEF79604059EB808C9FE1BF9BC5351A406FBBA7F5D8FC9F891488E537DB14B216A0535C9FF7BF8D5C68A2453A8A48E58FA7BF6EB76448D6D0BD05BD4628C4B852A236A11BEC0F67118F1267CA42647F6F2303509094C9A7F3A07B2724ABD2D9B56B71FA7AC6CDDE456EC209BE76C419855A5151EC9EBF0E0CF1B86F4E8E81B8173960F8D1C8AFFED1AC7B818AF8E3BC092E2B209D693E80B11EC7DA39CA93223E1B47C6127E8AD40A78BDB0ECBFA1F39C84CB9ECDF960ABB39884627BC4105C53EE7BCA4802B92AF60241420CBB36C407F46CC2E953D7E3503CC82287A8D68D0E673E212173D80A12257ADD5256652188C00590DADCFB7DBB6B35507B853EA5FAD4F52E02230CB3D3BBDFC43EB74780583E8DBB851E0257117F4A39A6676586216220C1CA21DE16CDFE6E1CC99EA7C989916AD2FED4A8373CFCFF02207529BFFCB7B7601317450BF430BAC9CE111B0FBA8D7DE6627F863078D8E6286B2D34856426EA90FFD58705444D0DC12D4FEEAD0FFE543811E1EF306F40939922563832D06E6DEA7109087AC051A361EA9E755856FD4E51388BC7C40C63E0953C8413AB0CBFF70C466E15DE5B089D095E8EE8A64E929D26CA3B71EF0B2360AECDFA89284CCE08C666F4E0146362F0BB84B87A49FCF2324EBB96DD941F00E2586F7246436EB66B1E04AF84482D8ECD2BC8EF9955CBEC62AFDD754A7F235C7F3C41CD0B36A9024D426B7388D3C33A5A6E858846C0FB0D88BA5798C923F9B43D14A6661C65092D5C5EC0F97D84784FA336AE6EF57C7A5D04804B96D19849FF9074724A5FACA538E32C6EFAA5209317543159272CE50454FE1E7D068C8F5FF3797A66D5F87758627AB5D40EBE1FB7CE9D69287AE7A5F349A5DAABD8A8E7778BAA26DA0EB237034A3366448280237A165CBB303BE6B33C0F11C1E56C50A84384A0F6878F2A99B14CD3B6820ABD27D2011E0C37F8439BEDE65747038A5FF7F00DAEDA094331523CDB7E10F1063B64A584D3E9F0655268F89DBEF3EA3FA4C6E54FEEBF8F0046C6C811F0767CF6FCC9B3497DB05582774047A8DCFF6A0C1B5188076E64A9D5693195075F2A05E507A5A523EEE4537079F9E5E79210E4AF056D6624D45A0EBA553CA9BC92171451970102CAB57DCD89ACEBBD7025008325C61145264F42E4D14A76E5C2F1C129D4C054DA00501081617D1A27012A6E160750DBA73BECB5DC05105BFDE1F1D0CDC837355844B291B09015FD610628513C1C86EAD373730B99FCD4A552FBA07163CE9CF6A3D3AC0525593F0648256E8B33FBCF92AF58CE26D0F036E11230879DBB789507BCEEFD2960EA320236A224EA74DD2AAAC541664FA3EA9430D4FB09C878169A8AF1E7FD4BE5E7926CB0B6A352B25F452454474107286EDAA145C0A0573361522EACB618DD9C8B32BD1A8A5923F4C698CCA0139DC640C1D5D557CE889BB69CE32D85853DFBB0F34DA2CF18CC79472906B67F6BACBF287F31DE0B9E7A01A356EC9B64653CB922501EA1EDA940089BA0F293B667F482E92438805CD6851776CEA0920CDEFC4062C9B4E51F5AA1D7FF909CC2608B6F28CCF28D574BF67CE80D4DDCCE28F2ADE0162CB66894B5B2DA0EB975CD95EE7FE72FDA2736616C8B571FAC94BF8C64ACD1642D9431118F08A62328D99B2B9D90BBC915DB764C4935951A59C369C72060CD9F4273BDCA0C295294008C0AC3A149E8CA5E8BF21042F5F21C067147F3BB52B13975026A9DF7246AFB1D053670982AB316509F2850342913E1322758ED89DA02DD79126726B1C5566C1831CCB1D62B3E271875E62CDE0DF0715D404F95F580B63923F362D416F83FE5AD98EED584717FBC2CB7D1B00101200F4EB4CA5 +pk = 8BDD1798514D9886CE4EA51C6CD4AD0D2290F12C8C24B0E4654C95D75E15F4032941522842AB0CA8EF6EBD46EA8B5232CFC264951318CA002DF5F4902C731D0008 +sk = 8BDD1798514D9886CE4EA51C6CD4AD0D2290F12C8C24B0E4654C95D75E15F4032941522842AB0CA8EF6EBD46EA8B5232CFC264951318CA002DF5F4902C731D0008275AC5E152742B1B3DFD9D5389E4D62E6C01000000000000000000000000000062D0A057317728300ABE1F9D89DD08179BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1F1EB3C7F753311FC096FDB788B5C0D68FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000917929ACCFB9CFF9DCEF3E4496366058326806B437E8284D354A65CEEA387700A8E751A16C4E70B5DB26BB2731BA75D1F4FE0929C36344B4C18DBDDE862E5F00646D1D07BD707613C40EC2F141FA313E8C1BCEFABE602CF1C8DA7547024B3A0039848EB31522FBCF01831C93195DFCE9CAE03217FC9A01325F5EA90989578D00 +smlen = 2557 +sm = 4806E3CD95DEF1E24C619F968D2D51BEDA9ED7DBD134CD571D7EFB632C631903C22FCE7E0014DDBE83A6FD07FC322FB043EF6C2299B7F2BB1124641432461100000098DFCAFB6A9D377D8A402CD3BAB18E536170F6ACE5368B51F273F3D3D51D51A9C35F54B90FACDC02CCC24C396C2927E4BF067DA80C9A87795C6ED210D81387399045D623827938117D677995715BDD02110AEFC63DD588A7230CE08EFCFEEA534F5A0EB005480AD1D169C386E476715238526E936FEA7136E2D8AED60DE31CC91DAE4E764CE5F93624FA7F72B87562FB6AD8996B5E41FD478AF0AF8338A7FD9AA250EFD2F2D20364E8A88A8642E8E38F38583ABF8D3BE97F14C3EDE66EBF8EBC84385CAE646CDED8C5CE8F06910BA7FEC05D828446D558D6FED766FBA347DA2E84DA247C34266AA31C328804F4E3AAF6ACBB0AD50FEECCEC00D20B3610785B9F1BA06A0BADFB42A8F43DE3F7BAC36057EE0B4D2A15DB040A8903F767F7352995C8FC3E06ED1B1322587EEE5B31806192E04B09A7B433D08CB2A340942CB75C51E0F8409F907F69C5F8DC316A227942EDF7A458974FDA76C255FF4F1A85A352CD2CD2A21507E0F37451060D31D0847528B3ED5DA3E7168CBD0302F1B03842E63B3DEC6FB37357E37FC3CC26721F290726A47AB3D4DD8FD1778FE5133726C240E7B3E398F3D809C6C469680B9EFD25DBE890D6936B76A52F97AEF3F93872B76506A95685EECDCBCE203400D182252471B99B7F4C6CED4CAC8FACA7682D0DF07BC5904AAE042479855098CBC41534F0EF17F38F1BC8C272CF72C1AC4A5564DD132130EE676E7D7EC3CABB4E85AC81945C87DE08EC60CED3FA0AB3E83C18AE493A851434BFA2C4968B42ACCCF3609539C62A4E01F8BC159362E15EE91D8AA399D8BD8D67BA1E8FD646EEBB4583812293406B05BA5BE2B1DF9620E6FE3DAF8CEBD9652BB04494B899F407C7D9ED1C4E77FFADE24ABE56AD597BD438928E05B0363D6D2685D34D6B51D71012844415C46F13181B146A3AF25AE4E8853CC7C7EF6387306C45180A6EF9E97ABE1E7D5E10115752C3071B6A213367E8B1A3D1C3703CC1840735315623901D772C61D55EF8C47DB10F0EB7582D7A043018DC1363E93F315DD984B8002EA7BF5BED38D3F273276CA577CF99A635CB6ED9D6525520793405BE27C86E6EFFEABB1E5F84A0076BD151CAFC59853424DE4B3460C673B0820D76E15EE47B6505D2D5C179DB92A44042F3631C646D350EA9721B8984660A76018DCA5C6BB1223CD03CC844DC9371D32549D9D645F75D2683FDAD1DF6434BBE43200E506ED2A815FAB511172C70F99A85FA3970433E8955B2F9389F23C10141B5779A23B8671EAE8B91991B78F635FBE8E627D3E79D91FD1E6E90699640BA3AE8D7E4CF5145F1259CC76AE50B1FA150D8338A9450A5B6B90EEC9C94318BC78C9C7715A3EB215AEE6443540D211A0556813529023E5A581623CD6D19BEF0705A5F69AAD4833A57C308144E92899AC5683147CDBD279D5C3A55BBC5E8F8E26A158A3E42F8C5B858909B024B4BA4069E26DE66460FF4A7DC92BD54AC244007B6AC6CE07A31A2AF3323CB55F07B8F480D279308FE10F2DDB001DA6C4AA132B988AD03FB63E0EB06544571F5505CF377A81153D6FBD4FA2B7562074CFAF587CCF28DAC84AFA58809C0B296E0D2594D3582C28596F5AF7500E143BE7B49C63D04F49BBFBDF60B024DABA5533F945BA90659758E06984921EFEEF79604059EB808C9FE1BF9BC5351A406FBBA7F5D8FC9F891488E537DB14B216A0535C9FF7BF8D5C68A2453A8A48E58FA7BF6EB76448D6D0BD05BD4628C4B852A236A11BEC0F67118F1267CA42647F6F2303509094C9A7F3A07B2724ABD2D9B56B71FA7AC6CDDE456EC209BE76C419855A5151EC9EBF0E0CF1B86F4E8E81B8173960F8D1C8AFFED1AC7B818AF8E3BC092E2B209D693E80B11EC7DA39CA93223E1B47C6127E8AD40A78BDB0ECBFA1F39C84CB9ECDF960ABB39884627BC4105C53EE7BCA4802B92AF60241420CBB36C407F46CC2E953D7E3503CC82287A8D68D0E673E212173D80A12257ADD5256652188C00590DADCFB7DBB6B35507B853EA5FAD4F52E02230CB3D3BBDFC43EB74780583E8DBB851E0257117F4A39A6676586216220C1CA21DE16CDFE6E1CC99EA7C989916AD2FED4A8373CFCFF02207529BFFCB7B7601317450BF430BAC9CE111B0FBA8D7DE6627F863078D8E6286B2D34856426EA90FFD58705444D0DC12D4FEEAD0FFE543811E1EF306F40939922563832D06E6DEA7109087AC051A361EA9E755856FD4E51388BC7C40C63E0953C8413AB0CBFF70C466E15DE5B089D095E8EE8A64E929D26CA3B71EF0B2360AECDFA89284CCE08C666F4E0146362F0BB84B87A49FCF2324EBB96DD941F00E2586F7246436EB66B1E04AF84482D8ECD2BC8EF9955CBEC62AFDD754A7F235C7F3C41CD0B36A9024D426B7388D3C33A5A6E858846C0FB0D88BA5798C923F9B43D14A6661C65092D5C5EC0F97D84784FA336AE6EF57C7A5D04804B96D19849FF9074724A5FACA538E32C6EFAA5209317543159272CE50454FE1E7D068C8F5FF3797A66D5F87758627AB5D40EBE1FB7CE9D69287AE7A5F349A5DAABD8A8E7778BAA26DA0EB237034A3366448280237A165CBB303BE6B33C0F11C1E56C50A84384A0F6878F2A99B14CD3B6820ABD27D2011E0C37F8439BEDE65747038A5FF7F00DAEDA094331523CDB7E10F1063B64A584D3E9F0655268F89DBEF3EA3FA4C6E54FEEBF8F0046C6C811F0767CF6FCC9B3497DB05582774047A8DCFF6A0C1B5188076E64A9D5693195075F2A05E507A5A523EEE4537079F9E5E79210E4AF056D6624D45A0EBA553CA9BC92171451970102CAB57DCD89ACEBBD7025008325C61145264F42E4D14A76E5C2F1C129D4C054DA00501081617D1A27012A6E160750DBA73BECB5DC05105BFDE1F1D0CDC837355844B291B09015FD610628513C1C86EAD373730B99FCD4A552FBA07163CE9CF6A3D3AC0525593F0648256E8B33FBCF92AF58CE26D0F036E11230879DBB789507BCEEFD2960EA320236A224EA74DD2AAAC541664FA3EA9430D4FB09C878169A8AF1E7FD4BE5E7926CB0B6A352B25F452454474107286EDAA145C0A0573361522EACB618DD9C8B32BD1A8A5923F4C698CCA0139DC640C1D5D557CE889BB69CE32D85853DFBB0F34DA2CF18CC79472906B67F6BACBF287F31DE0B9E7A01A356EC9B64653CB922501EA1EDA940089BA0F293B667F482E92438805CD6851776CEA0920CDEFC4062C9B4E51F5AA1D7FF909CC2608B6F28CCF28D574BF67CE80D4DDCCE28F2ADE0162CB66894B5B2DA0EB975CD95EE7FE72FDA2736616C8B571FAC94BF8C64ACD1642D9431118F08A62328D99B2B9D90BBC915DB764C4935951A59C369C72060CD9F4273BDCA0C295294008C0AC3A149E8CA5E8BF21042F5F21C067147F3BB52B13975026A9DF7246AFB1D053670982AB316509F2850342913E1322758ED89DA02DD79126726B1C5566C1831CCB1D62B3E271875E62CDE0DF0715D404F95F580B63923F362D416F83FE5AD98EED584717FBC2CB7D1B00101200F4EB4CA5 + +count = 73 +seed = C7ECD1EC1A3D83F5116C0AA4345FB3ADB4D9F81BD79896BC4932EE2F9D2D1F179BAF7A002D88F4F69071A7931E7F7FAE +mlen = 2442 +msg = ACB414EB55AE5E49107BD0AC5975544F83104F7264495AE0BF0A6D9594C422C16B99469ECCDFE8B8000875B469309891EA42586A615D146DE64FE59277A61631B2C7F7379CD52FAB3871BADE120EE9558D1479A91925634578CF14D35DF3B5672F8B5F9F956FA9F7489D6E37E207FE556017736F6B147A8CF664D0E0521D94737E18188A1B7C30296CCC9067E7B55D6E0F2FBD875F42FEFECAC49510E324968B07372DEB10A31C585457E0C48879CE44BC78898ECEFAC7BCEE90D0F8925DF2B52D5AC81692E0160F8FD5808645498428260F592E29BB90FCB07D0424EC79FB081840CB827CAA4A9D562183D10EE41D281E26CE3EC0069C83E1E446EF82E2E30DEBE3F409E0A9E6D1550E224DB15DBDDA44341E4ED6F8B8984716CA87233197528547D090058607CA141424A13145F1E896555288C5E2877AB3B51C7F9248D2D56A8521975BC4EAE3D009988CBD73C66931BADA0725FB8A3448D43E0C7364E9494FC4E295A700E79972E1FFD626D1CBE0199917851638B192EF9F5C03223F2BBD67EB59A5E8BAEC3DB40616938274201DEA1AE640F6EE7E047CC4C13F80DC65E3FCB5C62386015F4EF1BFEC561E121F9BFA9B2075BC1C4730503FDD5DEBCE8A535ECA01B9D5B021C290854B5F3D49EFFB263DDA34C4E96AEAE9E71A686C009B205994B46CFDF1F76727CA67D415B9D21D54312CDC6A8ED0AEAB96B580D0B419E2058E5D843C17C96D156549962F81C266233ED2B795FAC40B1992B626457F211F08106AD86F5702B9DEB9323A0970AD86125ECA836E0A3D6CCBC380D474049BD96EA246B8BD9542793A66E15B319AECE6BEE17ADBBA7DB337D25F8F642774030A2FF969CB5671F59901CB109E661E55FD5E75EB2A96DC37FEC76A82EB89D020B4916271CFB0CB3342494FDB62EA0D253FB8FF2E91357B33D96D41530B8B5E9550FE9B3F9F34FD5A2A1A6A8BEB93CCC322622F3B5E8487DE19AF57CBD1481ACE02779AD928B17A9B05CBEB722C783B088B5912C2D67CE5073F1801C23170DEB1EB6DDFFC4C33DD25F94F4FBE59D704E478FB49DD2142801C37ED8F539EC1782EBD2F3253BBE19C5A048B9EF41824A811119F3A6AD2A0D4B77338E001358C61A9794572B0C46EB1E0E575D4DA141A415829BA8712B791B625B1B0EA840EE745D9FFE1E99EFD782BA25859351F443654995102CBEFAD7E59D03C9A502ED7B77144D0566E4BFAC086A7DEA356CB9E5AC02DBF7E81D6CEED4A33DA8D801D61BAB5C01F259EE3A99FF7F6D7BF8F2160C4BC3F890736074B000C4C58FA4615880F93FAD43D5657C76045D7C414E6B85F63AAC91F04A616184E04FF9AAD513BA767215FB0331A369D36C0AE9B1EC1268F1D0B43C42B786DB23DD66465B3AF17FFC68C67964C2FC9E41EABC45DB68CD2C3D95B8BEC787D994BB8E9CF1DD7D4C563FCA5D80B3F1FE8E3C7BFB7D171F5B9023BFBCC0CF4371B63C856EDBDA154B4313C47983F4027F9E61E86DA1E8CD787E3E6B50E1DFC9201B9AB92059F8B6D1BF7856CD55C5B1D6C4E6EBF818D481C56F66C79444F5A6544A64A7D78EAD33EB805A6AC4310CD46A2331E707B9B0950CA12092402D68C1CC5C3F269DFDB13AB34B97EAB50B0745BE72BB0FD2D73BEA5DD37802393B635E42A0DEF8544A96E7F40A8D9D06B64E38DC406BD59AC5C4E218591D20B8DBA2125978096517EC5C03F9BC6F96CB255E216EF82D7C7C873029F9E1D98EBC0D8E1312B84B8D02E8D680AA56A506C8668B5B9C56D04CF68E37C7CB1B9377C867240CD42FC7FBDE0AC44E3DCCFD3F877C9923AE9CECE0CBDAB00CA530F434A33F1C939FB88ADEF4D12ACBD8B2B5A139A3FB776D8223A9846465C0372B8C3233FB5280E936BBE9FD49058961463A4419D939F4F1FEA705EB63114F0A3533638DC4D3EFD620147770AD877E2354299CEC6E5C18924E78DD661697ADF89A77C7365522D3E8FC0855187139F7E43E9A0629EE321B2CBD9F007B05C22EFF56FE48045686B36C5BAC2267F37A2E3D4E03E19B1E422ACEA31C2E9F3E7541976D4E2FA03119DF9C4CC2D5418F0FC7A467CD98E290695B9530B91D5DF8C626C7236A5C0FBA73578B9A47491CA0AD26A144B0F23EC23D2C5B2DAA03BF40130F14B9A427CDFF1F232C9CF02426228C570CF1FA7C00A773BC0D70858588542BBF8F581540870897BFAC8387CBBA3416A846CF9F4F5D3F9DCEDD080CC0DE9F71B93828B835430898E82896CD3F30FE2AF8349DB294FB2A8FFC0848692A0B9E8A66EBBFC0F896F8D03E3C6A0C27E0F2177B85A2F6FE31E8AAF14EA5C1FDC54E80CDE47AE27A161264680107023CFFA961E913C4E6AF96C0BE37AD859C334CDB8BBEECB5443662739D027EF1B9535A5A46E2169933E419454025623FD6779F54C622EF81AB9289B50758EA34F868EC85AEE589B08962B85CF537BC733F62AAFA95FD81A60D5C2E38D6EA0DF7D1390BC5050E2463E3E2E3A769DE2A94ABDEDFA0ED67CC0FFAFC5A05A3B0FD37BBE6967BED8DEBF02A42CDC80BDC62158E184FDB6672F7947505E2C0A6C7762B1145C4BAF30E3D32434D22707044DC99D2CF2D38F15C43ABC8632382BBBC9E0F106565906F7D4948D30FB19EDCC3748100397F71E1548E58A5A01876D0A12DCC80000224221C4ABD98A5022506D24BF4D9B9108991AD3421D4AB9CC393DCB8D744F97822F95CBB2640E73E401F044FE20253ACB8B32A75FEDA640E190454BAB695A23B14AE3EF60B00491AB22F622DAA89B6B2E6D18E735672FE0EB2DE269E4E386C926E23B865E1BA22DDA688293DE144102F7030FDE6DF653E4106C08C2467AD7C54D1DF0DC5981004876C6BAA8720F70942700A154A376C8D45DAE1BE74910148EE3F2733E591E1965FE763B58C8B28AF25E9B3C633ABD83F1C0A4F68DA2E0B85083BF97D4E919340C0437A604416C4F629B33039BBF2A1F561548321780411D2E8AC0EDAE76FC3A19F3C84C3BE902A1E84FDF69B11A12DC8B78EF257B5FBB5D923FFD548451A52C6A3AF31C70266AE8A957B2BD72A51A034A2921B8E19321108AC303B0D2E269D032C3DB13F21D558C82BA4158962F2210E1C5FDD96C98D6639AA844F34E40C1B9C909CC6AF1E97A8DC83B78C72B30B7AE400F44CA60AF37770B3D9147F7D6F5A327F34DF7CB8891E71D41D723CB18E0DD324E5CD22AE0D9F2B1D2BFCED0288B7AA73AF4FE0A8181BA1AA7EAE966D0A240E10FE5735D98326A106D16DC49F3FDB19D3A8449C56A74153655600E4C9E38D302C6D4080017D93C628388DF94860329BAA289EFA4587F079C6F03FA03C54540A0AB4B067EE46A5A346F2FBBFF6570ED0166A55C258EABD62AD90F060FADE84E8FAC799F7928285F58557A72E055B535D00BD9A4880D10C05C07CFE7A6FEADFCDED880521803E339F6EAE3FF28A0A471A003358F952320F41A0AEF9D28 +pk = 43A35C891D9E8CC0991A31BE7287E5DE40D0D7D15D2EB7CFE106FFE1380A370392A064F23C34C9FF1AE642B5523CE0ACC0588BAAB059B395432802E092BF380302 +sk = 43A35C891D9E8CC0991A31BE7287E5DE40D0D7D15D2EB7CFE106FFE1380A370392A064F23C34C9FF1AE642B5523CE0ACC0588BAAB059B395432802E092BF380302D9E6ACCF55EC91691F2E5D6F06819C8B34010000000000000000000000000000AABC634AA4C1D83DB251A0D5AA0010B7B6FDFFFFFFFFFFFFFFFFFFFFFFFFFFFF457CBE5409DD5055A87295BCE863E6ABEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000B0AED3CC2CB2C1D49DF134C0A5FEC89778A44A6D4D12549E0158C03C66DC2B004DBE4BF4E9BBF3BB341B086EEB85A110EA29F3D4A12BE771E12128E7B4D60900E96725BF985C9B8B587C8ABB57BC8921E3FAF60C049F1CD85C254EE298124600D238DCBAFDC37725518FF6AE50B80503953B3A0D776C760BAB26A54A5C80BE00 +smlen = 2590 +sm = 608CE72DD36784FBFF4E8FD58B2616B52FC3486743C51B0B5C3B115A8AE9A9025BDE78A46AED581829740A58DF5D571981281AFA2CC4EFAD0019687E8F5D330401033BDCC7A90943AC5C42C17B4946742702DB63C829F673A5B9630AD8FE283E2866985EABA298FDAE0670B1608269471638C00F9C0E9C4DF9186EAE63DC260E6C5EA907AB7B7191DA7EEA462B7C6F9363030B0BACB414EB55AE5E49107BD0AC5975544F83104F7264495AE0BF0A6D9594C422C16B99469ECCDFE8B8000875B469309891EA42586A615D146DE64FE59277A61631B2C7F7379CD52FAB3871BADE120EE9558D1479A91925634578CF14D35DF3B5672F8B5F9F956FA9F7489D6E37E207FE556017736F6B147A8CF664D0E0521D94737E18188A1B7C30296CCC9067E7B55D6E0F2FBD875F42FEFECAC49510E324968B07372DEB10A31C585457E0C48879CE44BC78898ECEFAC7BCEE90D0F8925DF2B52D5AC81692E0160F8FD5808645498428260F592E29BB90FCB07D0424EC79FB081840CB827CAA4A9D562183D10EE41D281E26CE3EC0069C83E1E446EF82E2E30DEBE3F409E0A9E6D1550E224DB15DBDDA44341E4ED6F8B8984716CA87233197528547D090058607CA141424A13145F1E896555288C5E2877AB3B51C7F9248D2D56A8521975BC4EAE3D009988CBD73C66931BADA0725FB8A3448D43E0C7364E9494FC4E295A700E79972E1FFD626D1CBE0199917851638B192EF9F5C03223F2BBD67EB59A5E8BAEC3DB40616938274201DEA1AE640F6EE7E047CC4C13F80DC65E3FCB5C62386015F4EF1BFEC561E121F9BFA9B2075BC1C4730503FDD5DEBCE8A535ECA01B9D5B021C290854B5F3D49EFFB263DDA34C4E96AEAE9E71A686C009B205994B46CFDF1F76727CA67D415B9D21D54312CDC6A8ED0AEAB96B580D0B419E2058E5D843C17C96D156549962F81C266233ED2B795FAC40B1992B626457F211F08106AD86F5702B9DEB9323A0970AD86125ECA836E0A3D6CCBC380D474049BD96EA246B8BD9542793A66E15B319AECE6BEE17ADBBA7DB337D25F8F642774030A2FF969CB5671F59901CB109E661E55FD5E75EB2A96DC37FEC76A82EB89D020B4916271CFB0CB3342494FDB62EA0D253FB8FF2E91357B33D96D41530B8B5E9550FE9B3F9F34FD5A2A1A6A8BEB93CCC322622F3B5E8487DE19AF57CBD1481ACE02779AD928B17A9B05CBEB722C783B088B5912C2D67CE5073F1801C23170DEB1EB6DDFFC4C33DD25F94F4FBE59D704E478FB49DD2142801C37ED8F539EC1782EBD2F3253BBE19C5A048B9EF41824A811119F3A6AD2A0D4B77338E001358C61A9794572B0C46EB1E0E575D4DA141A415829BA8712B791B625B1B0EA840EE745D9FFE1E99EFD782BA25859351F443654995102CBEFAD7E59D03C9A502ED7B77144D0566E4BFAC086A7DEA356CB9E5AC02DBF7E81D6CEED4A33DA8D801D61BAB5C01F259EE3A99FF7F6D7BF8F2160C4BC3F890736074B000C4C58FA4615880F93FAD43D5657C76045D7C414E6B85F63AAC91F04A616184E04FF9AAD513BA767215FB0331A369D36C0AE9B1EC1268F1D0B43C42B786DB23DD66465B3AF17FFC68C67964C2FC9E41EABC45DB68CD2C3D95B8BEC787D994BB8E9CF1DD7D4C563FCA5D80B3F1FE8E3C7BFB7D171F5B9023BFBCC0CF4371B63C856EDBDA154B4313C47983F4027F9E61E86DA1E8CD787E3E6B50E1DFC9201B9AB92059F8B6D1BF7856CD55C5B1D6C4E6EBF818D481C56F66C79444F5A6544A64A7D78EAD33EB805A6AC4310CD46A2331E707B9B0950CA12092402D68C1CC5C3F269DFDB13AB34B97EAB50B0745BE72BB0FD2D73BEA5DD37802393B635E42A0DEF8544A96E7F40A8D9D06B64E38DC406BD59AC5C4E218591D20B8DBA2125978096517EC5C03F9BC6F96CB255E216EF82D7C7C873029F9E1D98EBC0D8E1312B84B8D02E8D680AA56A506C8668B5B9C56D04CF68E37C7CB1B9377C867240CD42FC7FBDE0AC44E3DCCFD3F877C9923AE9CECE0CBDAB00CA530F434A33F1C939FB88ADEF4D12ACBD8B2B5A139A3FB776D8223A9846465C0372B8C3233FB5280E936BBE9FD49058961463A4419D939F4F1FEA705EB63114F0A3533638DC4D3EFD620147770AD877E2354299CEC6E5C18924E78DD661697ADF89A77C7365522D3E8FC0855187139F7E43E9A0629EE321B2CBD9F007B05C22EFF56FE48045686B36C5BAC2267F37A2E3D4E03E19B1E422ACEA31C2E9F3E7541976D4E2FA03119DF9C4CC2D5418F0FC7A467CD98E290695B9530B91D5DF8C626C7236A5C0FBA73578B9A47491CA0AD26A144B0F23EC23D2C5B2DAA03BF40130F14B9A427CDFF1F232C9CF02426228C570CF1FA7C00A773BC0D70858588542BBF8F581540870897BFAC8387CBBA3416A846CF9F4F5D3F9DCEDD080CC0DE9F71B93828B835430898E82896CD3F30FE2AF8349DB294FB2A8FFC0848692A0B9E8A66EBBFC0F896F8D03E3C6A0C27E0F2177B85A2F6FE31E8AAF14EA5C1FDC54E80CDE47AE27A161264680107023CFFA961E913C4E6AF96C0BE37AD859C334CDB8BBEECB5443662739D027EF1B9535A5A46E2169933E419454025623FD6779F54C622EF81AB9289B50758EA34F868EC85AEE589B08962B85CF537BC733F62AAFA95FD81A60D5C2E38D6EA0DF7D1390BC5050E2463E3E2E3A769DE2A94ABDEDFA0ED67CC0FFAFC5A05A3B0FD37BBE6967BED8DEBF02A42CDC80BDC62158E184FDB6672F7947505E2C0A6C7762B1145C4BAF30E3D32434D22707044DC99D2CF2D38F15C43ABC8632382BBBC9E0F106565906F7D4948D30FB19EDCC3748100397F71E1548E58A5A01876D0A12DCC80000224221C4ABD98A5022506D24BF4D9B9108991AD3421D4AB9CC393DCB8D744F97822F95CBB2640E73E401F044FE20253ACB8B32A75FEDA640E190454BAB695A23B14AE3EF60B00491AB22F622DAA89B6B2E6D18E735672FE0EB2DE269E4E386C926E23B865E1BA22DDA688293DE144102F7030FDE6DF653E4106C08C2467AD7C54D1DF0DC5981004876C6BAA8720F70942700A154A376C8D45DAE1BE74910148EE3F2733E591E1965FE763B58C8B28AF25E9B3C633ABD83F1C0A4F68DA2E0B85083BF97D4E919340C0437A604416C4F629B33039BBF2A1F561548321780411D2E8AC0EDAE76FC3A19F3C84C3BE902A1E84FDF69B11A12DC8B78EF257B5FBB5D923FFD548451A52C6A3AF31C70266AE8A957B2BD72A51A034A2921B8E19321108AC303B0D2E269D032C3DB13F21D558C82BA4158962F2210E1C5FDD96C98D6639AA844F34E40C1B9C909CC6AF1E97A8DC83B78C72B30B7AE400F44CA60AF37770B3D9147F7D6F5A327F34DF7CB8891E71D41D723CB18E0DD324E5CD22AE0D9F2B1D2BFCED0288B7AA73AF4FE0A8181BA1AA7EAE966D0A240E10FE5735D98326A106D16DC49F3FDB19D3A8449C56A74153655600E4C9E38D302C6D4080017D93C628388DF94860329BAA289EFA4587F079C6F03FA03C54540A0AB4B067EE46A5A346F2FBBFF6570ED0166A55C258EABD62AD90F060FADE84E8FAC799F7928285F58557A72E055B535D00BD9A4880D10C05C07CFE7A6FEADFCDED880521803E339F6EAE3FF28A0A471A003358F952320F41A0AEF9D28 + +count = 74 +seed = 5DE03CAB3CBD81B8805A17E0FFC2105C3BCDC8D782EAAB161A15AAA543FED59353C1FBE03E7F36B955FC51C9B30F0C93 +mlen = 2475 +msg = 5F7522CE6BD0CE6321C27B9EAA6F572616201F283C5EC171D0BA47662C2320897805E1551ED438F3FCBDAF9DE6F3A19DC16FE9C167A65B6E52BCF512C919561B548496A4A80AF7CE25458A62EAE92EBF677872482D8647C30C12BB1F080C6B9A56560D64FAB73DB17487BBB007C66661EA9DDA14601AB27A100EF4CF4B7447E51418651C03211F8FB884BE91F3980FE13E00EA4ECFE6D54882059A436C90BCAD80E4101CC6C0754417545F2D167629F80A3C5FFE45C00AB2BAF0494D6C065872B03A987A5EE818B3EF11E47FE1747F49E2DB6A14410F0B1F9610A2D6114395EF6EBB231FDF71D595CC1171DB9C89D6CF202E42D4FB968AB8105FDDB2AACB15FAB8014B534CF468D77ECDE2072623B7002620B7AC3E78B62AD673FEEF9F8E97E91ACDAB171FD415B2D15605DDE00D074A770E36F2218F7130F13E91FA4C88DEEA7E854BCAA01B8458D40625A33E982F0955B83080A926EC240E31F0D9BF477EE3A016E146A3909683410D4D09ECDF32EAEF580402F0D416DFC082CF1362E8B79158BD57739AEE56DC41A549E534C7CCF3620C7D7D95B92994A747D5EFB8EC43CFA8189BAA9B75FD54694E512FCA388B71A5B9EA591AE9CFA34183DE59D284AB16B2EFFA4B26A24A0E615B38B83088A9827EEB5C29B419BC061B033E0E3FC809AFDD3DE948412677E0BB5136854532639F3CCB176D54EA1961B5C527EF66F4B3286A583E86208AEEB8ED07D9E6BF1BEB33995F76CA480039A6130775895F19E3CD4873ABE3BF2FA9DE81BF0CB04575DD6AE282720B152CF0EC6A4A04016DB0F3543D8272AE56B1152B02EAF22131420CB194021F97060D5CE52EB21B57CC93964DD21344786E3888617152D2ABD829799CE47D20158AA93F7DA85CA6146C5BB94B512DA053C35BFA8840CA43F6509A1477603FD50F5E4F9A7CF8D2369156989AD638D35D345BDC859C52688211BF7EF3F4AD4944657289406BF01DCBB49D560A11840EF35DBC0C7F9C96DBEA76300CF61997A87D70F5FF8C51AECA2CF0680B6FE8C4025E1E25B62103D248CDEE335F4FCD67597103362003206C507970EA6D78CFF4B68B44244019152DBF812675CF667E5E13C8596EB6FEA3903BFB25ED08F902722A37F8E460E37A03A2D6ADBDF79DA20052DE658390484B83BBAB28D039A303D7376BF555181680B7966C798A1C6CB215257E37739DE7B9706CD1CF3AB031F68C82D6ECFA507C104115040744D74A40C49245215639D0CF4A5A7A10098E9CE3564AC3C44F0683AE9D3094784D354DB1AF439BDDF63D5CCA668D8180264EFECEEAC0BE1B8E1C6418E45F9ED6C779ECF169143B034CD9F332989D445C83A8786398C507B9171B4D95728575539CBB29C5B804268D88F2B39AF1F9572B8DAA9FEEEF69C4A77DC64BF2DBB5E57F8B33AB151769B2D00010D67A2D6F188D6D5B35E5E1873FE2B327E42AFB8885A842D26C246F7C18E6BCDD6FA49B300C65A3822121E95004928104017CBCE2AB95ACADB9802BF4BB049B8E96468353D649654C6F69D774380A5A387D6414DC3000540BAB6ECCBAA088C1068CCEF20036E5C8342FD512F55E6794BF85FE15721D99A1BFEEDC218617A940C8C25D4DFAFEC677D2A719B2CDDCD302294B7FA41AEAB5606F859CC0D638AC94B99AC3EA48C687D278EEBEB396DC5BF2D2E89E880F76B533FA54EFD30D8EE38B34DC5F8AE62C637E9A7E85D99E011F62D261AB4D3DCEB98A8972D3482CF817EFF476B873AC56963BD60183B359713385BA82F6E24BE2D6CFEA6DBB4AD2E1B5B790EE54D23F64E740502E887629B346FC8FCCC3338D0F2921131B84590B32C7CB82CBA8BB3B81EF7BC5CB12F0AA0B3C6A5B2878DC4F868057C68460C71D40D4263AC5C8B8317D2D0B63403C7549439A9EF227268372EC3A54CF8EE97714BC4B55007F92B1A32238659EC1EE27D6F2987AB06FEE84C3AFDFA73240963F076A955BF3C19410E1DA6A19B3EA3AE2DD8766082D3295D35436597783DAFDADB905465D05FC21FA8AC2737A52FA8AAEFBD2ED83F12545C1FA3198FF225D37070694C9392738E89467EDB2DA3CD1734CE398E32BCB1FEA2E4FE1260A2D9F9EDC3607A8AC8A51D5DA36E99B31903025E0CB157FD2FF5B51C9191CC16A9CCB870B4060CFB0FD900AEF62738A58C5726F5164417F084EF14FC0953E3C6036B818C21CA3476B8CC5F8EBAACE257A0315031A03E64E7F749B9DF99BB56CEEBBAA4333BC7270EDEE90FA2715BDDC38D44898A41998B2374B6EE3B8524D3A385C03868EE9479355092C4D20EC32DEB51497F4FF34AE7E7EA4828C288F46E5148DE28A8C660EE132E5B5489833DC66205EC968B60DAB96C2A4452A7019BBA9FE3D19D5829129E2A9C75C39416AC8695145F2B62EB9468198CBD48D7670DDC6AF2F99F77E7ACD01A34EA8E0E974206FBC22656867D09807B980563E06A559B0C3A7E6F43CF8DB75B18C0F90C12FF3BD43ABCE7DF75D17E631C08C974322010648FE2E2BC940E6510FB8835DF8384EFF3FE6A264687256C6BC0A5F9D2DDF208171DB55C4446B03CF27796BC77E3C68D8F1252BE21877D7C53747404420302CA5AE1AB57E43B158BE8B707360A2F59D6A473F98B816FDE2CCEDD92385202C419278E8B840DBA4C05E9BB65F68AE2A635A29110329E8C0C02F6FB5EEE41ED225051EE975F92DA52F93EB1FD7C0A098F6D1421701537298651313514AD31CB333E9C5DA719BBA95E73878BA41F9E2512862A80602AA2DE1E1D086576531330CC7BB8F0CEC38050B3CFAE5C8B1D6CB849A579F2294F8CE80FDE5405BFA3E6ECB01D5117203A4523591AC4030397DE9FF81D5CC91AF3002590F5854E852B88667638B2D052F2A7852425C8EC026E48D9EF5E73D1993D7F3FD7F704760562C36D2278C9CE131EC6AA444D7B2EACA3EE888D9B2AE122688DCB35455E7DE31562BA618F1183308B30D07A5C34020546218101AD42AC5054D4703587FF60E860A60375FAB12734912058D5B0B06430FABBFE0C0B43C22814F56DAE9E2713325A31C682C13F008B9A3D4FFA8A454F0F64A9213FF2D557A4CBC64EC6E4ECA0A976CD9F27497BA544DBAA3E2ECA0F54C2634C719B9C3A2CE37BCC8158A880BAA72780F8B1D3494F589E2AF3044B4FDD86F4DB2DF0843EBD9F3518870F55488F41E234CE94E907A69D28BD83347702750DB1AE2EB1454CDCA37A8B5FC90091F548BABF489E57C8919646E977274FC972088A522FFF9F9306D2F0ED6C01FF92CAE8440D7F3526B8C186D5B96942CB08032886051DA2A9FE77E38BEB18F4FB25F1152EDF9D61347A00A844929976A327BE46FFD3E2EE0B6AB1014294EC5D40CF7071C36B11127FF90720596C1B3065E7DE8010AEA469BB4F4AC5A6EFD20591CEFB7B94B2006D85CA475FEE556F24CC41237C631B75EB594F8342DEB4F976D73AA46563C1AA6D0B605A16152315626BA08807DAA6025CF62B29176F3A85E4BCA483EFFEA7E5939 +pk = 2637AD929FB2AC833E355A680E8C156603102314E11A470900EDBC88B040BF007A60332910A894465E9576615809F7E28B0A678387C35A49EFE97F9C1A9AD00311 +sk = 2637AD929FB2AC833E355A680E8C156603102314E11A470900EDBC88B040BF007A60332910A894465E9576615809F7E28B0A678387C35A49EFE97F9C1A9AD00311C5A8E80E38DF002541A18D3534B61A136902000000000000000000000000000028EA166FB3CACB4C9D21C378B8CFBEE7A2FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF95520BBABD3C851798FEBCA301A525966BFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000009509B8091EB7ABF0DBCA289FE0961AA4A562B335A959561BF740C8B09F61AD000795EC2DCE18C96704A6FC95680313E0193F1135B117BDB53A415F9E5EB8620019190AEFE35E932FC944B103573C170A19ECA63E452C5BB9E600E7CCA2E6E900246A36716283907CB70A7498AE5201A6E3DFB0B1F0736A41C779A1038BA27500 +smlen = 2623 +sm = 1DAD289A04A294AD6676A4F33EA38BD5EED034135B19917022AEA8271BCDE201CDF7DDE0E514C5B09E5509464046391074AF6B0F71BC9B8076F9E0A4C08CD104010157840A906CF0DB0CC3A989F7230F3E7EA84E6D2233BC5E0EB339B46B66E80547BE4CF258368D4786F557ACAB5FCD7B203AD3359F8C30E0F5145027F0ECBD461D47C62DBAF8B26572E3A56FD2E5D94B0106115F7522CE6BD0CE6321C27B9EAA6F572616201F283C5EC171D0BA47662C2320897805E1551ED438F3FCBDAF9DE6F3A19DC16FE9C167A65B6E52BCF512C919561B548496A4A80AF7CE25458A62EAE92EBF677872482D8647C30C12BB1F080C6B9A56560D64FAB73DB17487BBB007C66661EA9DDA14601AB27A100EF4CF4B7447E51418651C03211F8FB884BE91F3980FE13E00EA4ECFE6D54882059A436C90BCAD80E4101CC6C0754417545F2D167629F80A3C5FFE45C00AB2BAF0494D6C065872B03A987A5EE818B3EF11E47FE1747F49E2DB6A14410F0B1F9610A2D6114395EF6EBB231FDF71D595CC1171DB9C89D6CF202E42D4FB968AB8105FDDB2AACB15FAB8014B534CF468D77ECDE2072623B7002620B7AC3E78B62AD673FEEF9F8E97E91ACDAB171FD415B2D15605DDE00D074A770E36F2218F7130F13E91FA4C88DEEA7E854BCAA01B8458D40625A33E982F0955B83080A926EC240E31F0D9BF477EE3A016E146A3909683410D4D09ECDF32EAEF580402F0D416DFC082CF1362E8B79158BD57739AEE56DC41A549E534C7CCF3620C7D7D95B92994A747D5EFB8EC43CFA8189BAA9B75FD54694E512FCA388B71A5B9EA591AE9CFA34183DE59D284AB16B2EFFA4B26A24A0E615B38B83088A9827EEB5C29B419BC061B033E0E3FC809AFDD3DE948412677E0BB5136854532639F3CCB176D54EA1961B5C527EF66F4B3286A583E86208AEEB8ED07D9E6BF1BEB33995F76CA480039A6130775895F19E3CD4873ABE3BF2FA9DE81BF0CB04575DD6AE282720B152CF0EC6A4A04016DB0F3543D8272AE56B1152B02EAF22131420CB194021F97060D5CE52EB21B57CC93964DD21344786E3888617152D2ABD829799CE47D20158AA93F7DA85CA6146C5BB94B512DA053C35BFA8840CA43F6509A1477603FD50F5E4F9A7CF8D2369156989AD638D35D345BDC859C52688211BF7EF3F4AD4944657289406BF01DCBB49D560A11840EF35DBC0C7F9C96DBEA76300CF61997A87D70F5FF8C51AECA2CF0680B6FE8C4025E1E25B62103D248CDEE335F4FCD67597103362003206C507970EA6D78CFF4B68B44244019152DBF812675CF667E5E13C8596EB6FEA3903BFB25ED08F902722A37F8E460E37A03A2D6ADBDF79DA20052DE658390484B83BBAB28D039A303D7376BF555181680B7966C798A1C6CB215257E37739DE7B9706CD1CF3AB031F68C82D6ECFA507C104115040744D74A40C49245215639D0CF4A5A7A10098E9CE3564AC3C44F0683AE9D3094784D354DB1AF439BDDF63D5CCA668D8180264EFECEEAC0BE1B8E1C6418E45F9ED6C779ECF169143B034CD9F332989D445C83A8786398C507B9171B4D95728575539CBB29C5B804268D88F2B39AF1F9572B8DAA9FEEEF69C4A77DC64BF2DBB5E57F8B33AB151769B2D00010D67A2D6F188D6D5B35E5E1873FE2B327E42AFB8885A842D26C246F7C18E6BCDD6FA49B300C65A3822121E95004928104017CBCE2AB95ACADB9802BF4BB049B8E96468353D649654C6F69D774380A5A387D6414DC3000540BAB6ECCBAA088C1068CCEF20036E5C8342FD512F55E6794BF85FE15721D99A1BFEEDC218617A940C8C25D4DFAFEC677D2A719B2CDDCD302294B7FA41AEAB5606F859CC0D638AC94B99AC3EA48C687D278EEBEB396DC5BF2D2E89E880F76B533FA54EFD30D8EE38B34DC5F8AE62C637E9A7E85D99E011F62D261AB4D3DCEB98A8972D3482CF817EFF476B873AC56963BD60183B359713385BA82F6E24BE2D6CFEA6DBB4AD2E1B5B790EE54D23F64E740502E887629B346FC8FCCC3338D0F2921131B84590B32C7CB82CBA8BB3B81EF7BC5CB12F0AA0B3C6A5B2878DC4F868057C68460C71D40D4263AC5C8B8317D2D0B63403C7549439A9EF227268372EC3A54CF8EE97714BC4B55007F92B1A32238659EC1EE27D6F2987AB06FEE84C3AFDFA73240963F076A955BF3C19410E1DA6A19B3EA3AE2DD8766082D3295D35436597783DAFDADB905465D05FC21FA8AC2737A52FA8AAEFBD2ED83F12545C1FA3198FF225D37070694C9392738E89467EDB2DA3CD1734CE398E32BCB1FEA2E4FE1260A2D9F9EDC3607A8AC8A51D5DA36E99B31903025E0CB157FD2FF5B51C9191CC16A9CCB870B4060CFB0FD900AEF62738A58C5726F5164417F084EF14FC0953E3C6036B818C21CA3476B8CC5F8EBAACE257A0315031A03E64E7F749B9DF99BB56CEEBBAA4333BC7270EDEE90FA2715BDDC38D44898A41998B2374B6EE3B8524D3A385C03868EE9479355092C4D20EC32DEB51497F4FF34AE7E7EA4828C288F46E5148DE28A8C660EE132E5B5489833DC66205EC968B60DAB96C2A4452A7019BBA9FE3D19D5829129E2A9C75C39416AC8695145F2B62EB9468198CBD48D7670DDC6AF2F99F77E7ACD01A34EA8E0E974206FBC22656867D09807B980563E06A559B0C3A7E6F43CF8DB75B18C0F90C12FF3BD43ABCE7DF75D17E631C08C974322010648FE2E2BC940E6510FB8835DF8384EFF3FE6A264687256C6BC0A5F9D2DDF208171DB55C4446B03CF27796BC77E3C68D8F1252BE21877D7C53747404420302CA5AE1AB57E43B158BE8B707360A2F59D6A473F98B816FDE2CCEDD92385202C419278E8B840DBA4C05E9BB65F68AE2A635A29110329E8C0C02F6FB5EEE41ED225051EE975F92DA52F93EB1FD7C0A098F6D1421701537298651313514AD31CB333E9C5DA719BBA95E73878BA41F9E2512862A80602AA2DE1E1D086576531330CC7BB8F0CEC38050B3CFAE5C8B1D6CB849A579F2294F8CE80FDE5405BFA3E6ECB01D5117203A4523591AC4030397DE9FF81D5CC91AF3002590F5854E852B88667638B2D052F2A7852425C8EC026E48D9EF5E73D1993D7F3FD7F704760562C36D2278C9CE131EC6AA444D7B2EACA3EE888D9B2AE122688DCB35455E7DE31562BA618F1183308B30D07A5C34020546218101AD42AC5054D4703587FF60E860A60375FAB12734912058D5B0B06430FABBFE0C0B43C22814F56DAE9E2713325A31C682C13F008B9A3D4FFA8A454F0F64A9213FF2D557A4CBC64EC6E4ECA0A976CD9F27497BA544DBAA3E2ECA0F54C2634C719B9C3A2CE37BCC8158A880BAA72780F8B1D3494F589E2AF3044B4FDD86F4DB2DF0843EBD9F3518870F55488F41E234CE94E907A69D28BD83347702750DB1AE2EB1454CDCA37A8B5FC90091F548BABF489E57C8919646E977274FC972088A522FFF9F9306D2F0ED6C01FF92CAE8440D7F3526B8C186D5B96942CB08032886051DA2A9FE77E38BEB18F4FB25F1152EDF9D61347A00A844929976A327BE46FFD3E2EE0B6AB1014294EC5D40CF7071C36B11127FF90720596C1B3065E7DE8010AEA469BB4F4AC5A6EFD20591CEFB7B94B2006D85CA475FEE556F24CC41237C631B75EB594F8342DEB4F976D73AA46563C1AA6D0B605A16152315626BA08807DAA6025CF62B29176F3A85E4BCA483EFFEA7E5939 + +count = 75 +seed = 63742CEFAE9868C3C0B31DDE0F9D378FD5D71BE7CC3F0B6ECD393DB55FB043CF00264852C45D1836CC12B9C872A20251 +mlen = 2508 +msg = 9FFA507328B2129C9F05A22B81A597FD1B8C27D554B36FD3EB150BC5FA0C6ED967EC5BE6F1E52D3BED1508DC3C841360020CFC2CA1B0713076251F2935EFA8500573CB4634C78A1D0F87D994E8E2B0BD265A877023B54D9A33282C12397DC74CAAB07AC2EFD140DF907651BCD1B37CAB2D03F77CC28872291F1CB28FD4BBB5331C2A18E02120BFD2D9EC0C8938A6D43681DC03527FC2BF59703B5160D8E25D08534EB5AA5CC9C10572257D9E4DB29235683BFE1776A2D9EDACFBA1ADAF66587BC451D32C524C7934556F94776F91CDDA96D2E5CAF91A39503D3A742DC5A0EFEF7C1A13666E200C5E3FD7652D200ADEF51FC5136281570B7832E0C6E7552972E43291F202E6F916C916DC3FA48858F3D92B1B7EFD42DE140D43648AEDD7C7379D7A4B71751A3348B6BBA3B0DB71B4C99C41E085E5536A3F0D2BDDAA88069249E21E2D9906191BBB5C8B45353DE72E00270431847AEB4FF6230CEBD1969A0FB68D6E302B78DA39ADF6C0E681117C8432E24820B9EBF38838545E95CF7AEFCF1E9436CF48E87B6C5181CB418132C7BC050B9498720D7D534792E0585F05DA2735B7E68FE35DEC358DA1BF1681F7F62329BEDFEA3D12BFB26AD9403F3AC1DB96D828050F39DCE4017B45C5DAE4D7DE9E9F687A9D7FAD1AE0E7197184142F6818A63D5617BE9D8D82334A12E68F2EEF88A0DA3A915DE63629550D8A64DF591EECDBD1B89EB40AE9F9D65815271693C85F2CA41BF45E4FA16EF8B17D945EC61E757C6C609D8AFAEE32B3CA628842DB255B619F6562E656F6125FB27195EC82FBEB9C14330DAB649CDB74F523F5A98244194581503356B5B7EC51E2B35AE889452D3457EAD713C0715AA7382DCC510B16E771B3A5A91949FAF5E29223C8F1F861BC3B4E77E095BB61ABA00EB29C065D6F9DA9B4413D61B2202547FB6E34671930EBCDCE4C541B3E2DC90073867A47197E08C96F74ED81DE5F10C37C062E8D82364D67EB185CD098CAC1BC3C522E4FABDF2FBEFB66B9EC6E848F732A737FA7B935EF2848C29B1FB94044996EEF006E251BCEB5BE356F286F0FC85E5CBA627B67398CBFD6C0F520C6F896353FE75BA323D8ECD9D3ED2997580E7E1E49EECD91982C5DA650D6B128068B8D3D72C1EC4BF1FBF121BA96E1CF5F247F9FDA7018CB609329B1C95E59E112C393C45EF7138905902227CD21A39CE30397FF017495BC98A968FB497E03DE5843E64923683F2E402DA63CC25AD0BA13B85E3E379B08DEB39542C06A268BBF44990447190A1F8ADF0D3ED9ED9917886210864CAD84E7C4D1282C4D3BFF9DC23E4FA68EF6B0480E76459D1B5E0A7CC0CFC17F59531C4C1CB1D416B7D009AB50173F706289DBB68201C305E39FEFAD87929EF933006598CE0F0242A2C60955AE487115B4C367A7E49488491A6F044FA8B7AFD81F6DA09D29D4BEFE1B3C9EAFDA4F17D22EAAE0B2D1646906D1CEE65614640B53479E23831C56EBE12B92997D5FEA725D78CA75F4509EEBD3DF4F741D6B2770521BE2AE63CA365FE1518CFDCD5088D58CDFB8D3DBA76731F74760A47C9D619A31B7E318E957194AC5ACC6867CF8C9C235043D5C09240F346FEA840AE0BB16094883FC801DA0BEFAC64A021F6F871413249E9C7F5CCA92F4EAB5713B0F2CD6C950F34BA6FB1CFAAD541BD5FAEA45EA5FB37258301A49D7BC4657E3E986D707213C0F836B030C21593F11518EAE3A8A95A2EFC8B9839E79CD8CB0E6DE59D5A43FF8F81FD35392F0C0659B7679542136782D559897FBCC0129C22F43A30CFB27E899A8CA52453F5459A281D0CC21F902403A596C7F69CBF9A64D97B935AB384FBEA5851D831E8420066826D7E11E34047D18CF08283BE8F29A8A79B0F477C27BC41B8EA4AA010ECF8ECE0D37389FF13E235A4526070F96F415D41AF2E053FD4440DDFFD69799456E7335CC6D9F4370008803F7BABB6C58B6996DC5A52649E25463B5267C188E2DC39B3258636ED8689E5C02E00574988B3AF881D30E9EB38AC51C1E00E1C0A411ECF37E314276221D7D8713F7A449E38371854EA26520ADDB58082287FAA1F77FC04095499A3C3A331A38852A287B24040C1CCC054086964FB1EE2B328F3DE21A986507CD20B4DE4898DFD15045324B93FDF85E5392DE0F32C3BADD04784012E97CB9BA19472B0C20EB0A71C89149EBB601ABAA4A853F2C75DD2622235AC30D97B9D7B1216089B9CC8E879660E40EBCD15203404A8DECADC42114715F4D8A6A10511BACC4DDC23520445A95FA3945BC95878BFF18728E64DE8B7767CFBBAA21F3EF2D92F3D7DFDA792BBE4E5B3381077658BFBEF8DB95B64F9F2A44917B38DF6F9391118978544369C882B218E7A7A31AFC3EB9A75A28095C4478DC81F9CFA127BB749CC53898409365170823D65A0B46BCFBA0E47CC0C5F6ECBEE09131F134EDD254F4F58B50C486DADA13195B1A35739420A45BE6558401F64C3B6AC94B73397925C20545621C7ECDC7DA9F71A755F84D27F2C6D8415D37F2BF1966A76845216E41764AB96DC2E14C12DF3684F7683FDAF5EC771DB7050F81A4B3E516C7D5C955201A18F436962476C1284531764A9397E0EDBFFA8C3699929DAEAF968B4524BD98EE62F9A0DB9CBF99FDA80CC6C57A5EE1099B1EB29799A5B5BF5593CDA26CE2C66DEA3D40545465C1D21F5B9373556B9ED0AE30E90B836003CA83F78E29BD8D49550286DC2DE6407860E9A9CC5EAF3E1B1C73FC2D248B81B1CC8F59DABFB5DAADE6F2A0B38E76D9E6D0125955D08DE7F334A56A8F362CC5D883D56BF7BABAE6D9E425376D34A05AB863A0D9ADF7C6FDA574FA8DC60965E021532C25ED4D568412D4143FBF2C4EC2F230D08337A4E546E01F7C1BFF4C97F2F27AF400CAA57BCF398AA5BFFE155B0F29A085D5053DFBEDC3423818DE8FC597EEAB2C1663D8C81C71CB876F73AC854286063A2E8BD8614D06B80F3BF56381179342143F4C89B8CEFE9168B6A96F416DC617B9F544F9DF65CA6F4F7A84A327909666B70CFFE889C86ACA706A0A1365E248D6B341A004A27D4EE344F03CE6E85D3573E272D48210DF7C3178EFB7BFBEF7765D24754673C9EEC14C7513FD8DE6386B0829EF0980B826EC9C77C81D1E3B8CAA65992DB9C2F8DD691C520FA6F233AFAAEDBF287A57A9A66D2330F4636F02EA3148C4BCD2C8B114D48A1027FB3BD5008D732C427ADEDEC9969AEAD451E166954FDC207C1A4EC409CAC60E42383385187AF44F136F91A8461E62EAFE6FCADD1E491162E46CFBBADDDB72E5B54B7C655CB9489E7F4F7E55C93D3AD50CF84E1F47A706FEDF818A5246BC755D6D18EF18702F5A90CE51812A67227C5E5A051133576E9EBC18AFA18C1B05C854D343727B25BB10E3B9A3645D789287858FA43734D66AD831E8646FE604286544238DC99ACFE3C8285230FC784BB73360F72ED34795B1C46EDBE32A346BFA7F534B500C6C9D3EC26AD7ED20D1500E3DEDF141DF3C2F92E981472F0010A48F25429329AE92CBBB918246F5A53212703C75DFA15D014801A830DEB75BAA36 +pk = A322F7ED66237BF15BD4529F528EF7C7950C04ED1660B9CDFDD945300FF026020379A4A13AFCAACC3B721D4393092293172131C70B7299CE4615DC74F823710102 +sk = A322F7ED66237BF15BD4529F528EF7C7950C04ED1660B9CDFDD945300FF026020379A4A13AFCAACC3B721D4393092293172131C70B7299CE4615DC74F823710102B5FAC87D69363AF83F5F484F9BE18BDBF4000000000000000000000000000000BE7096825A74DE7F7588BB8099A91B822CFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF677CD1795B2BDA5171FBC587D7E0B4B451FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000DF03FBC51307509267FF3EBE3D09DBBC96D3B7AB5ADAD91B1DC0A9691CEAD500D26C7D378ACB681AFAAEE1E310CACD409285F1717FF461ED059D7CA895B40500F337972507C77FC63E39CBB0F4D440E8D9034ADFD1CB1414D67BA6956A967F00FF8720DE6199FABB8ECD0C6FDC3789A69818BF547399D20C12F54B57C42A3700 +smlen = 2656 +sm = 56B01480C809C8D80C134B4A16060232829732B00229BE22A3B5040DD4E033017570429D44875BAB124F130BCF2C61209A08241209066E059582E449B362C00200000A9E802713CC6447E7D87E019BA892882DC2CBF659150809B635ABAC3CD40F9617BA5F3084D079882FD99A7D5C568EC420E0BD1ED020436C862E5B91A3A38CCC38631D386F40E00770F83D0D2DA8C9000B0A9FFA507328B2129C9F05A22B81A597FD1B8C27D554B36FD3EB150BC5FA0C6ED967EC5BE6F1E52D3BED1508DC3C841360020CFC2CA1B0713076251F2935EFA8500573CB4634C78A1D0F87D994E8E2B0BD265A877023B54D9A33282C12397DC74CAAB07AC2EFD140DF907651BCD1B37CAB2D03F77CC28872291F1CB28FD4BBB5331C2A18E02120BFD2D9EC0C8938A6D43681DC03527FC2BF59703B5160D8E25D08534EB5AA5CC9C10572257D9E4DB29235683BFE1776A2D9EDACFBA1ADAF66587BC451D32C524C7934556F94776F91CDDA96D2E5CAF91A39503D3A742DC5A0EFEF7C1A13666E200C5E3FD7652D200ADEF51FC5136281570B7832E0C6E7552972E43291F202E6F916C916DC3FA48858F3D92B1B7EFD42DE140D43648AEDD7C7379D7A4B71751A3348B6BBA3B0DB71B4C99C41E085E5536A3F0D2BDDAA88069249E21E2D9906191BBB5C8B45353DE72E00270431847AEB4FF6230CEBD1969A0FB68D6E302B78DA39ADF6C0E681117C8432E24820B9EBF38838545E95CF7AEFCF1E9436CF48E87B6C5181CB418132C7BC050B9498720D7D534792E0585F05DA2735B7E68FE35DEC358DA1BF1681F7F62329BEDFEA3D12BFB26AD9403F3AC1DB96D828050F39DCE4017B45C5DAE4D7DE9E9F687A9D7FAD1AE0E7197184142F6818A63D5617BE9D8D82334A12E68F2EEF88A0DA3A915DE63629550D8A64DF591EECDBD1B89EB40AE9F9D65815271693C85F2CA41BF45E4FA16EF8B17D945EC61E757C6C609D8AFAEE32B3CA628842DB255B619F6562E656F6125FB27195EC82FBEB9C14330DAB649CDB74F523F5A98244194581503356B5B7EC51E2B35AE889452D3457EAD713C0715AA7382DCC510B16E771B3A5A91949FAF5E29223C8F1F861BC3B4E77E095BB61ABA00EB29C065D6F9DA9B4413D61B2202547FB6E34671930EBCDCE4C541B3E2DC90073867A47197E08C96F74ED81DE5F10C37C062E8D82364D67EB185CD098CAC1BC3C522E4FABDF2FBEFB66B9EC6E848F732A737FA7B935EF2848C29B1FB94044996EEF006E251BCEB5BE356F286F0FC85E5CBA627B67398CBFD6C0F520C6F896353FE75BA323D8ECD9D3ED2997580E7E1E49EECD91982C5DA650D6B128068B8D3D72C1EC4BF1FBF121BA96E1CF5F247F9FDA7018CB609329B1C95E59E112C393C45EF7138905902227CD21A39CE30397FF017495BC98A968FB497E03DE5843E64923683F2E402DA63CC25AD0BA13B85E3E379B08DEB39542C06A268BBF44990447190A1F8ADF0D3ED9ED9917886210864CAD84E7C4D1282C4D3BFF9DC23E4FA68EF6B0480E76459D1B5E0A7CC0CFC17F59531C4C1CB1D416B7D009AB50173F706289DBB68201C305E39FEFAD87929EF933006598CE0F0242A2C60955AE487115B4C367A7E49488491A6F044FA8B7AFD81F6DA09D29D4BEFE1B3C9EAFDA4F17D22EAAE0B2D1646906D1CEE65614640B53479E23831C56EBE12B92997D5FEA725D78CA75F4509EEBD3DF4F741D6B2770521BE2AE63CA365FE1518CFDCD5088D58CDFB8D3DBA76731F74760A47C9D619A31B7E318E957194AC5ACC6867CF8C9C235043D5C09240F346FEA840AE0BB16094883FC801DA0BEFAC64A021F6F871413249E9C7F5CCA92F4EAB5713B0F2CD6C950F34BA6FB1CFAAD541BD5FAEA45EA5FB37258301A49D7BC4657E3E986D707213C0F836B030C21593F11518EAE3A8A95A2EFC8B9839E79CD8CB0E6DE59D5A43FF8F81FD35392F0C0659B7679542136782D559897FBCC0129C22F43A30CFB27E899A8CA52453F5459A281D0CC21F902403A596C7F69CBF9A64D97B935AB384FBEA5851D831E8420066826D7E11E34047D18CF08283BE8F29A8A79B0F477C27BC41B8EA4AA010ECF8ECE0D37389FF13E235A4526070F96F415D41AF2E053FD4440DDFFD69799456E7335CC6D9F4370008803F7BABB6C58B6996DC5A52649E25463B5267C188E2DC39B3258636ED8689E5C02E00574988B3AF881D30E9EB38AC51C1E00E1C0A411ECF37E314276221D7D8713F7A449E38371854EA26520ADDB58082287FAA1F77FC04095499A3C3A331A38852A287B24040C1CCC054086964FB1EE2B328F3DE21A986507CD20B4DE4898DFD15045324B93FDF85E5392DE0F32C3BADD04784012E97CB9BA19472B0C20EB0A71C89149EBB601ABAA4A853F2C75DD2622235AC30D97B9D7B1216089B9CC8E879660E40EBCD15203404A8DECADC42114715F4D8A6A10511BACC4DDC23520445A95FA3945BC95878BFF18728E64DE8B7767CFBBAA21F3EF2D92F3D7DFDA792BBE4E5B3381077658BFBEF8DB95B64F9F2A44917B38DF6F9391118978544369C882B218E7A7A31AFC3EB9A75A28095C4478DC81F9CFA127BB749CC53898409365170823D65A0B46BCFBA0E47CC0C5F6ECBEE09131F134EDD254F4F58B50C486DADA13195B1A35739420A45BE6558401F64C3B6AC94B73397925C20545621C7ECDC7DA9F71A755F84D27F2C6D8415D37F2BF1966A76845216E41764AB96DC2E14C12DF3684F7683FDAF5EC771DB7050F81A4B3E516C7D5C955201A18F436962476C1284531764A9397E0EDBFFA8C3699929DAEAF968B4524BD98EE62F9A0DB9CBF99FDA80CC6C57A5EE1099B1EB29799A5B5BF5593CDA26CE2C66DEA3D40545465C1D21F5B9373556B9ED0AE30E90B836003CA83F78E29BD8D49550286DC2DE6407860E9A9CC5EAF3E1B1C73FC2D248B81B1CC8F59DABFB5DAADE6F2A0B38E76D9E6D0125955D08DE7F334A56A8F362CC5D883D56BF7BABAE6D9E425376D34A05AB863A0D9ADF7C6FDA574FA8DC60965E021532C25ED4D568412D4143FBF2C4EC2F230D08337A4E546E01F7C1BFF4C97F2F27AF400CAA57BCF398AA5BFFE155B0F29A085D5053DFBEDC3423818DE8FC597EEAB2C1663D8C81C71CB876F73AC854286063A2E8BD8614D06B80F3BF56381179342143F4C89B8CEFE9168B6A96F416DC617B9F544F9DF65CA6F4F7A84A327909666B70CFFE889C86ACA706A0A1365E248D6B341A004A27D4EE344F03CE6E85D3573E272D48210DF7C3178EFB7BFBEF7765D24754673C9EEC14C7513FD8DE6386B0829EF0980B826EC9C77C81D1E3B8CAA65992DB9C2F8DD691C520FA6F233AFAAEDBF287A57A9A66D2330F4636F02EA3148C4BCD2C8B114D48A1027FB3BD5008D732C427ADEDEC9969AEAD451E166954FDC207C1A4EC409CAC60E42383385187AF44F136F91A8461E62EAFE6FCADD1E491162E46CFBBADDDB72E5B54B7C655CB9489E7F4F7E55C93D3AD50CF84E1F47A706FEDF818A5246BC755D6D18EF18702F5A90CE51812A67227C5E5A051133576E9EBC18AFA18C1B05C854D343727B25BB10E3B9A3645D789287858FA43734D66AD831E8646FE604286544238DC99ACFE3C8285230FC784BB73360F72ED34795B1C46EDBE32A346BFA7F534B500C6C9D3EC26AD7ED20D1500E3DEDF141DF3C2F92E981472F0010A48F25429329AE92CBBB918246F5A53212703C75DFA15D014801A830DEB75BAA36 + +count = 76 +seed = B887F07DB5358C3FDC2402947BBC87ABD064B02A859FE8DB37B5BCBB916020443DABA5534A0778FD0B1C05EF3ABE6269 +mlen = 2541 +msg = E7E845902E852B331EF9923416E492C1641236E4E72408D800FD70774BA32B6B4BE04B6E82237A247D26F9A33AFC4745C16CE0554774C68B33CFC6E67AE34E42038FC6C324972642338DAEA75982C71720F1EC9542DF94B38434DA34A2003FABD9DAEA1950B7751DA6C81AFF7D03390F5D63455D417F5D12A510337A16197EBAF921B6A7A9A9A58F9696418ECED6B27CB8EFC8ECBD9B68714F721561AF8553A0D84E30E009A8985D011CB994EEAAF88C76F7F3261B47FC174155C138DB2EADB09A06073B211FC0D27113E8FEA0DA56E181CF532BA8207F5D80D6A30D8BACBA540D49A81A0763A0467DBA7883766ED6358E809261AA3D8B757C839B532F272C5767671A3A8BF3391B14F5E97BF2668A4E98847F1ABFA21E2370870DDF24504F89B3DB71E210C46D66EA7296D65C926E2C955D899AC830CD9D06808A68E9B3722B86E878CF21A5E5D41D7F3CD95D23A6344C259859735AE1A953ADE13CA103692B33AF90ED0345C7B038D938F8F494D90CBD3933B2A80FEDC2BE57960DB23AD018BAC63017A04FCC510553226CD86C74AB90E13C72A1BE12E4D751DC670A98EC4F81E9F8954A693FC7175BA7E50D340FF7F15D568D0ABDED0BB1FC557B1E55971B4C4CE8CC1B4D9E239C73B1133C9E1672DEE36A2D9527F315C21764648643D866B0E2AB6D2DEE61D838BC5DAC183FC511C4501B6E535ECC54F3EDAD6E8EDBF0DE7CB70BEE861B2BFF0D41BB87FFC0EBCAEE9A6DFB98D31D35CFB6DC0442FC285AD0879E7B218B6E66453FE04207FE814C5F72E49406B48FCB1DB145753DC2A2D3E9793594F7EF1A1A6339619E1040CDE605648234A51B2F6774B31C7F9A77C2CE3B98819132BB725D288C65901F7001E05FE5326B6F701C337D41C8CF8748FF9C276ECD398C725C36C11857605F58C0B154DD9F3C1B4649AE677533EB0338B7475254E273B786C2FE7DB4C13468CAF0AA2AECD55DC1A5F868C8EDFFD8BE8DEEC20A9FAA621C4680F3EEF4DFE4A79794FCBC5F8C56EEDCC3E1963569A36525D4F6A5BDBBA5D12966FD8A0FCC70783FD9F61613842F80D000C9281CBDF28C01C6F6AEAC10DF1DDCD0322E00C4E3CC801EF091D9C1B01E84DCE725D57C800D38990251AA1D1206AD93A7DDA40F27726D6A03D973150F7A88703724E314C0953D56DA6EAC442A70C2A08BC66BFA2B0EE11E185131E352D10DD714DDE502097AF0AD155AEEEC2A6B93B149B75DBB898B2B3A7C5FEF2F48D9B12A580F54C4EEF3FF83A4F13F2F194AF551D4800AE86AAD6EFC82CE460D325CBCFEE3400AE939431AB4070D7A7CC005F270896051E32B1051E58941530E250F05AF19FF416E65CE40655FDA31D2E7A6158E07DA08FA61AFD5319B682DE44AFAE146129A8B769C1708A5D3479B6C910B2FF0FC872A4A41AA8BF3EE16F80011D163B599D18501335A2BE10CF117DDA094FE01596C404C14580A7075D04CEEF68BD8F813D7DE6599F478F3DE9CE60B294CB7CE5284A61E078939D08F3D4FD998ADD3B92532AA54E0C31087CF14BF4EC964EBAAD53BD15D04E37948E94917DDE181EE3BB2346335FFB403B000F5669019C5281D88A0E771176E49DD0BA22E719C0B731EC2AAE9C898E74B2967BCBDCE0D7D73057E004BD62269F4E7F3823DCC18CD6C551104B9B896B0AD138DDE7C3D761138641BD3EFF3DF1552659FD97BDADFC59A05CBC622A4492A1B22CFF72AC197D61A4C5A949AA9AC09D4C1112F4C1B1CAE353C70278A21663E11F27E9EC66ECD4AD56F2179A3FCEC37AC3A3F4B33C06BBBD4C8CE8E74825BBDA3E58A2E2D928C2C6E6D886274BC0E2175AB03D8721C664FBD6455DB2960E3AEF0BB25AFD3CB0BAFB71A2BD18A89ADAEE00AADBC7E4AE70ED4B534AEEAB88559194755F9656B43BC83E3952000D9E2295BF3391904218A015C786DE0144868EE4AED203B261FE743B7168788A0680F7484792A3F64782B2B1ED9217B09AE9845DD71ED363F18E8AAECD51A4F5913AAB33FEA3FC5F1E37E0CD6333D2A8347CF45EB7C4AD967FE6FCFFF3565743435EF09A646E75C7E968ECF4202A9B2C23AA8118A1683219B1155C2CABC95C696704F5B270C6D213332649363AE13EC811E9A1090D1603EFF745E2FA83379DFC6DA5EFECED556E46A8A5FF1F2A5C0D911B95C20EC2465AD0C96AE7E16FC36143762BBC0734CF4D6134DCB0D739F7822470E0ABF66A0AB15CE0D6096D3ABBA2CA4C81C1C68BDC252A8A4BA609B7C05CCD913EA56126F418FC0B06DE8F76EF651F8085604C16E5910F3B8651AB78296B56B78326E41AC15774E442017FE5B291E5227EF5A4B78CCFA96D6921C8542A8A984BC87E2678903869C52C2568FEE4E23EF3CC466CE270614E6472244A4294B31F9438F7E43437FC9C9C5F3EFB0F4F0AF2110A613661DC24A1C7F7A7F8CD14A943821F16F94BD874F1A32E305DB4776CDF6633446724CCBB2488B1B06F0177819D53885127E6EB717C0D6718366A8B8A089AA6AB17CB2581A75EC748123B7D0383F3900EFCFF77D2E022E90AA41491117758221A0B149C8EBC23CC01C17B9FD39118DAD413A391CFA0A5C614208060A61646C7CF1DFAD4ABC3A9CC5CD566DB2AC8FAF392C9D8E7DA0F84B941D792A8493FBEBAD30D0DAA0D683DCC1583F0C9019622EB6C92FBC475BABC8B626319BE2264ED873AC063F84B7F83688AC99D732A1E3FC12281BFB1E1E63D48BFBFCA619BF4B95F899C50AD0F5FE4673347DF2BBF2CA21BEF49C7F8440D95A83299960F1E42B457ADDCCCE236946DE80FD4862BAF36387E041DEAAC3C9751AE345512BB1F423A3B4CA8D3A5E3796D289641D3424FF22670A46552EC68D7D095E8636441D777DBE2E9DBF6B5FEDE5318516C3886B943F6ADF17D8B7CD40B20A48233C9FD981145B45A5CB8F6A88EAA36C270E93E1D876D7781BB92A1FD99727D8E0AE34C73398AB8781BB342F5AACF4081459EA5EC20C30CBB6122344C457F92B20448F78E1A2A291202003781EBDA1747061C6CE1F8BF882FEA4FB50BFE638685CD638EEC15BC24252567025FC5C16ED1F5D98DD90C76E720EF7B4E25A20D262E339C5E5BB5A9CF051BF5FD1F63E93452A179277B57956821CDD901F1C01E634AE18485708A6ED8F592AE2EF3A9D54C9734FFBADC6F0B86D0398AECE9374F9ACAFEF38D4B97BE9B932B9852F97AEEC435311A67AE344AC1985738C72F52B3D8B71F64A916240477FDDC5FAF02F8224EB35D310FEA03FD2C5933047355A438676D92EADF70DF662D97C2F5E00CB293053699D51D302B78145C77AB03F34EAF170EDA5215436FAF0238A4B0D41D29F36052A5278C7D8AF9A6FFC6E2B6FFC4C5D524F7640A7170957F3DE2451AC75589CE328B61EA7179FD990DA1698F5C73BB8639A4DA2AD67D364DB04771CA118C4055C25F1120A0643158C07CD22B375D5C1DFA26FFCDA44921F41D4A504B2279DFF03421CAD19960F87C6B6DD8C29981CB66C9731F931E43B0D97C6AC9862E2CF711DF0DED8E4D06F3957FFF9085A95D9FCC95610FDE22856B229A3121D8B81EE83DEE4A6A9FA3FE8C75351574CB000BF7F3746CA1CC5414AEB23A2 +pk = 5DEFB1BD673D23B3C9C5FD92E5F9C127247EF2B8433B9D937B6527776FDE05035CC0ABC7C7CAAD9EB8D2E33587E3BE086DA78B9FD4C0460B6F8EB764457340030B +sk = 5DEFB1BD673D23B3C9C5FD92E5F9C127247EF2B8433B9D937B6527776FDE05035CC0ABC7C7CAAD9EB8D2E33587E3BE086DA78B9FD4C0460B6F8EB764457340030BA36C8836A4BAF5E470E0428308CCFF4B5401000000000000000000000000000060B75B55974B3E54B9FAF246B081EC29B4FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB8AB162B65ED2658E83EDDD329FCAFA87FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000009520212B620BB63A1A5D55B4E35CFC666C6DBA3C0147CB8943DEA132D9790A00B19CA0CAFDB98841D7EB1F7145650D1FB83ABACCC932FB63A63C9ED68B7CC000A914EFAA390BA0CB57872C4699B5EC1C09AC21C4E2699F3879D2A045FDD68800AA9F6BD1696588A5AEF1695BAC400606A611F14D5EF9BE5963753B67D9D23400 +smlen = 2689 +sm = CA8B63691FBB9E36CE28EFB104ED41A20524420840B85E8CD2F8DD61DA00830312C3D69744A3BB1F429FF91A74C32F48F6AE48D45379070FC3BB69A07E70910001006FF56C472AC1680EE1DCF6F4D99A245A18231819D90B25A5540EAC99C946E87A4FC59BDCDE6ECACFF819E5A7004DBD10AF7D5BD702FA0DFC35D8E8C06BAE975C1E928D31646FD20C21E425848FD112021D11E7E845902E852B331EF9923416E492C1641236E4E72408D800FD70774BA32B6B4BE04B6E82237A247D26F9A33AFC4745C16CE0554774C68B33CFC6E67AE34E42038FC6C324972642338DAEA75982C71720F1EC9542DF94B38434DA34A2003FABD9DAEA1950B7751DA6C81AFF7D03390F5D63455D417F5D12A510337A16197EBAF921B6A7A9A9A58F9696418ECED6B27CB8EFC8ECBD9B68714F721561AF8553A0D84E30E009A8985D011CB994EEAAF88C76F7F3261B47FC174155C138DB2EADB09A06073B211FC0D27113E8FEA0DA56E181CF532BA8207F5D80D6A30D8BACBA540D49A81A0763A0467DBA7883766ED6358E809261AA3D8B757C839B532F272C5767671A3A8BF3391B14F5E97BF2668A4E98847F1ABFA21E2370870DDF24504F89B3DB71E210C46D66EA7296D65C926E2C955D899AC830CD9D06808A68E9B3722B86E878CF21A5E5D41D7F3CD95D23A6344C259859735AE1A953ADE13CA103692B33AF90ED0345C7B038D938F8F494D90CBD3933B2A80FEDC2BE57960DB23AD018BAC63017A04FCC510553226CD86C74AB90E13C72A1BE12E4D751DC670A98EC4F81E9F8954A693FC7175BA7E50D340FF7F15D568D0ABDED0BB1FC557B1E55971B4C4CE8CC1B4D9E239C73B1133C9E1672DEE36A2D9527F315C21764648643D866B0E2AB6D2DEE61D838BC5DAC183FC511C4501B6E535ECC54F3EDAD6E8EDBF0DE7CB70BEE861B2BFF0D41BB87FFC0EBCAEE9A6DFB98D31D35CFB6DC0442FC285AD0879E7B218B6E66453FE04207FE814C5F72E49406B48FCB1DB145753DC2A2D3E9793594F7EF1A1A6339619E1040CDE605648234A51B2F6774B31C7F9A77C2CE3B98819132BB725D288C65901F7001E05FE5326B6F701C337D41C8CF8748FF9C276ECD398C725C36C11857605F58C0B154DD9F3C1B4649AE677533EB0338B7475254E273B786C2FE7DB4C13468CAF0AA2AECD55DC1A5F868C8EDFFD8BE8DEEC20A9FAA621C4680F3EEF4DFE4A79794FCBC5F8C56EEDCC3E1963569A36525D4F6A5BDBBA5D12966FD8A0FCC70783FD9F61613842F80D000C9281CBDF28C01C6F6AEAC10DF1DDCD0322E00C4E3CC801EF091D9C1B01E84DCE725D57C800D38990251AA1D1206AD93A7DDA40F27726D6A03D973150F7A88703724E314C0953D56DA6EAC442A70C2A08BC66BFA2B0EE11E185131E352D10DD714DDE502097AF0AD155AEEEC2A6B93B149B75DBB898B2B3A7C5FEF2F48D9B12A580F54C4EEF3FF83A4F13F2F194AF551D4800AE86AAD6EFC82CE460D325CBCFEE3400AE939431AB4070D7A7CC005F270896051E32B1051E58941530E250F05AF19FF416E65CE40655FDA31D2E7A6158E07DA08FA61AFD5319B682DE44AFAE146129A8B769C1708A5D3479B6C910B2FF0FC872A4A41AA8BF3EE16F80011D163B599D18501335A2BE10CF117DDA094FE01596C404C14580A7075D04CEEF68BD8F813D7DE6599F478F3DE9CE60B294CB7CE5284A61E078939D08F3D4FD998ADD3B92532AA54E0C31087CF14BF4EC964EBAAD53BD15D04E37948E94917DDE181EE3BB2346335FFB403B000F5669019C5281D88A0E771176E49DD0BA22E719C0B731EC2AAE9C898E74B2967BCBDCE0D7D73057E004BD62269F4E7F3823DCC18CD6C551104B9B896B0AD138DDE7C3D761138641BD3EFF3DF1552659FD97BDADFC59A05CBC622A4492A1B22CFF72AC197D61A4C5A949AA9AC09D4C1112F4C1B1CAE353C70278A21663E11F27E9EC66ECD4AD56F2179A3FCEC37AC3A3F4B33C06BBBD4C8CE8E74825BBDA3E58A2E2D928C2C6E6D886274BC0E2175AB03D8721C664FBD6455DB2960E3AEF0BB25AFD3CB0BAFB71A2BD18A89ADAEE00AADBC7E4AE70ED4B534AEEAB88559194755F9656B43BC83E3952000D9E2295BF3391904218A015C786DE0144868EE4AED203B261FE743B7168788A0680F7484792A3F64782B2B1ED9217B09AE9845DD71ED363F18E8AAECD51A4F5913AAB33FEA3FC5F1E37E0CD6333D2A8347CF45EB7C4AD967FE6FCFFF3565743435EF09A646E75C7E968ECF4202A9B2C23AA8118A1683219B1155C2CABC95C696704F5B270C6D213332649363AE13EC811E9A1090D1603EFF745E2FA83379DFC6DA5EFECED556E46A8A5FF1F2A5C0D911B95C20EC2465AD0C96AE7E16FC36143762BBC0734CF4D6134DCB0D739F7822470E0ABF66A0AB15CE0D6096D3ABBA2CA4C81C1C68BDC252A8A4BA609B7C05CCD913EA56126F418FC0B06DE8F76EF651F8085604C16E5910F3B8651AB78296B56B78326E41AC15774E442017FE5B291E5227EF5A4B78CCFA96D6921C8542A8A984BC87E2678903869C52C2568FEE4E23EF3CC466CE270614E6472244A4294B31F9438F7E43437FC9C9C5F3EFB0F4F0AF2110A613661DC24A1C7F7A7F8CD14A943821F16F94BD874F1A32E305DB4776CDF6633446724CCBB2488B1B06F0177819D53885127E6EB717C0D6718366A8B8A089AA6AB17CB2581A75EC748123B7D0383F3900EFCFF77D2E022E90AA41491117758221A0B149C8EBC23CC01C17B9FD39118DAD413A391CFA0A5C614208060A61646C7CF1DFAD4ABC3A9CC5CD566DB2AC8FAF392C9D8E7DA0F84B941D792A8493FBEBAD30D0DAA0D683DCC1583F0C9019622EB6C92FBC475BABC8B626319BE2264ED873AC063F84B7F83688AC99D732A1E3FC12281BFB1E1E63D48BFBFCA619BF4B95F899C50AD0F5FE4673347DF2BBF2CA21BEF49C7F8440D95A83299960F1E42B457ADDCCCE236946DE80FD4862BAF36387E041DEAAC3C9751AE345512BB1F423A3B4CA8D3A5E3796D289641D3424FF22670A46552EC68D7D095E8636441D777DBE2E9DBF6B5FEDE5318516C3886B943F6ADF17D8B7CD40B20A48233C9FD981145B45A5CB8F6A88EAA36C270E93E1D876D7781BB92A1FD99727D8E0AE34C73398AB8781BB342F5AACF4081459EA5EC20C30CBB6122344C457F92B20448F78E1A2A291202003781EBDA1747061C6CE1F8BF882FEA4FB50BFE638685CD638EEC15BC24252567025FC5C16ED1F5D98DD90C76E720EF7B4E25A20D262E339C5E5BB5A9CF051BF5FD1F63E93452A179277B57956821CDD901F1C01E634AE18485708A6ED8F592AE2EF3A9D54C9734FFBADC6F0B86D0398AECE9374F9ACAFEF38D4B97BE9B932B9852F97AEEC435311A67AE344AC1985738C72F52B3D8B71F64A916240477FDDC5FAF02F8224EB35D310FEA03FD2C5933047355A438676D92EADF70DF662D97C2F5E00CB293053699D51D302B78145C77AB03F34EAF170EDA5215436FAF0238A4B0D41D29F36052A5278C7D8AF9A6FFC6E2B6FFC4C5D524F7640A7170957F3DE2451AC75589CE328B61EA7179FD990DA1698F5C73BB8639A4DA2AD67D364DB04771CA118C4055C25F1120A0643158C07CD22B375D5C1DFA26FFCDA44921F41D4A504B2279DFF03421CAD19960F87C6B6DD8C29981CB66C9731F931E43B0D97C6AC9862E2CF711DF0DED8E4D06F3957FFF9085A95D9FCC95610FDE22856B229A3121D8B81EE83DEE4A6A9FA3FE8C75351574CB000BF7F3746CA1CC5414AEB23A2 + +count = 77 +seed = D08A139CC7147ECAF4B1D1E434EB2EFA2B2607B0033D8BA989133E496DC9F3654944C7AF91CBB79866443E8C4E8217ED +mlen = 2574 +msg = 34FCF4626248B979A7A8D306CB9ED69C4CCB5CC3729D2692E0BA679D5C2FEAAC54A4E06D4EFCEDF78E19357DAE263E1B5D107FB09618A9C34F54F19A738A66B95E6F88E20E01F879F53E8F4C371B571E1438FF70E0A8CD00D608976E24501B2DDD323EFE6C1302A318CAD821C6FFE641672BB80AC62286C69FCFFD93422911C46D43DC9A1F00A73E19EBE6CC09A9801F2A1DA708F0F1F98E7F1A18529010823230279F487911CEF1E784A229D9E311BCE5E2D368E6D613F791DDD617D0F37F604B786CA2BAB754E8BC4BD3DA37E66A54DF1D3B268A5A80379A30A52B1532E8CFABE24168D83CBFD61E2346F901C361F771E0BE3E03DAE8CC30614C10FB8DCCDCAA5B9A25DDD8D61E61F60F22308E12ADC137D3D8C53CF7B31984CB813758BAA19AC178F2F0CD2155ED674A7509A3CFA7FF66D2D9B1E60BE50FE7FB79591C500F66BB1D35EDB80263F4B696A3DDA0B9B2911D01E76E9070D99DB93D1D0C3874CFFA776BA24424A6B453526F7C44EAFABE13C0750F9DF33E82105930139E70B5CF1B09DC3913D6BF4A4859F67FE814FF038F0FDAB93522A35E7F81002A395989D68B8B7E4235A09837CC6402A5338DA08E7C73DC63C43BAC42054C694F4931B80140D6B104EDEC995CEBCC5629F85D09DED8257626F9FA4079ADEF81D044C18BF2277DAAA41931B62A6028F89F95F06D8A8FDEB95EB2EB1E90C0D8523E0B476B158E3040F212390AB2503021E8D6FC0733B963CC6188FB2532829925B59C8255D89F10B657053D0FA1D8E76C84826A4609284503D3A101EBFE7AF93EDC423EF5303CD946C8B570511E38EB04BEE0060E678D03E4134F84F279A570AAD0332417FB2099E3F1F279CE7D6DDB080C5D83064D107BB560B21183AE165CBB54CC75313DE72D40D1CF5173455AA55C5C356D7C40A2A7023DD95D3F89B515D7598F800DCB7BF68B707978ECAF55B794A17559BD1E913F4472B1830783BBBAB5F23A760C78C46157FD1B429C445494CDF92FEC8BF9FC217D3CE2697BB6C671BAA793CD0C1C84F579F0DAEC400BEADA799A9F417FE4744145F21C6F8559AFA7A514A0E951F03E5E68C17A8E5816F3FCF41774D26BE2EDC11FC3A42CFCF00F817C3D0FBF474FD7F30C9C3C6BE7F74FCC79FA6AB07CAB037EEA7D83866673A74C087B5F7542804071D53CE348D2E836749E35AF0FB884D5D53ABB195AE1EE6E9AE35DC91BE359BCD510A7801FC243C07DEE92373918AA4F8A89EDA3895A52456F7244D1FF007CC7B1A52CBEF4C1ADE1C2C0AC189AB24B3F260475E1D08E7C5BFA30A1CDD71DE5ACE80D5FBD1D0F17198B79C8EEA0365D139F2AE73CAB6FBC9A79786896DE0CE7FC747D68FA4ABAB662A09E0E409F7E652153352BB92F5DA1836B0E92B0B644C821B2DD2BD0AF193AC0F8CF5B8D88432F0248DAB09B46FBEF2EF1899B5981E9B33DE4E9927AE50890FEFC35F681E075D8B0169A2E16FEDA6392AB9858DB87ED18ACBA25575AFD1FEDA9FB3FD01ECAC13C245DF6972F65087513F505187C4E8EA54B6433FA092B6CD3AF13F4718693904435C55D273060FBB5FDA76074691269493E86F287922D074E54EFF04209B2FDD3417D8436D1395E638D57DB75D68F4F819141B6DAF4D13A9A18629CF5F84B0CD02E7A397715DDE5476BDC467218D11AACD6CE399D9D54645BB27CA43076B7E4E57FB4F7C4F4B8D0AA949719D731C3A927FDEF1533D773CF1BB562D5EA43817A5ACEFE9EB7E51029DEA143E8A1D5F76F9BFD74A26C6D38F54194319A1AAABC4DAF45EFBAE770B9E9D834C09FE45C15D4BBC0251D3DF2F2F23387DCABCE6CA7A59625E18FD997770D164C338D0692AF97C749FB746C0D3944CA4B2DA6D3AD7B8C3AA922FC029CF9AC5580CFEAFF50CB2E9044211EA522BB5769BEB7A7BBA0743F345FEEA9AA9DA6EC5F0579CF7A5AA4DEDC832FE3F65185A31FD49C0D259E3B7F8FA96E110D130F588CDEC30D0FD4860CA6673C46D961FC68A4020FB03AE24B1AE12967EC1ED19ABEC0808A7EF89521152033F70F406A7005819D28DFC556C79DE18584088F40BE40A555EAEFA78E3FA3D9360A7CEBD963555CF208DC408A07CCC1369F98BD840F5C940721064E6C7CB241ED0697AF0FACF36F05632A504870ABF90134A01AF00D340F7A5D548A8078C2049600EE454D15EB8CE58C26B3C8185CF9DFCDCA7D4B6DCDEB82230F993D51E701D8387B06BD45B4B61DC9DA6D3B4356F50C1D4AD2B467D36AC092442FA90D1DEB014475AC7CE90C974063459DC951DECFA30D2DE4C70FBA39A8B6931217D0924FFA783C8C3DAF048908E4AAEAAA3B7C98846278AFDD1753252F39CAED7D334D8575CE3ECFB2EDEC31AFEB2BBE67FA929A267376293C2B2F295CD8DBD66106E1D9518BE1798949F3315E0454D018C2B706FE836FB37AB908D9D698AF495BD285A74E4CFC7612D42121F43FDAA7DCF44DA82897B820514D66B92983A3EC819D2CE208D688B6F0AACADC0CDD619D815CD231AD8DD9B6DBAD9C47E16FAC098D0F4279AB52055D2FF765AF6E3618C4509FAE6AB00FA23980EFB19A26E0A6EA4C9A7DC699121388748449C429B28AD2779F5642F05FF58B68BA3E289F90EB27CE06392616C080D659338CAF274D46A90D58F2BFED25E8D4A8C62030A5E89F6B1A5F6112A38661E2F2B5A37BCBF050812DCDCE9C0A939ADF929C921E7DA0C30815DA318EB2F350F286441CC92060C970077623EEE68B8C6FEC9FFFE780A6FC85FD7AF90172951337AF57339E98049132A4CF58874A7418FB7ABA0628B6192BB2C43102EE6B1D7E824725D9C75D34A8B69DF4A6BCB1F96B57767046C99EC6352751E2FE1075BB4092672379B3518DDC884FEAD5BD062B0336EA88BCBE0D22E066566347FEB617A322BEC561E9AA9D2177EEF0DFEEAF6231AD56D0CD9E300709C9317B3D334D8D2AC97F96CF2F45B8582C4128D95DA8CA207AE34D3DAACCDB128C11694EEE6D3E8E6AB767B6886B1F7235D85A4D9C7C831C5DB8AD8323F63927A638E19497CFB308285A03CA2C1FE2AC4D919AD11511ECC6F28E7D0E0A614FE21B57BCCDF83535C7E2C40840BA0014247190C580378454751EB3F2361D7193E160B9516F7EE1D683B336B873C8BA22E97480A61F002A73844C78309C0A3B31BE30A192A62BDCC3D33A7A5BA1F6AE0404A8558740CAE46E5FD15971B41C0BC39665A9B92EEB3328C328B073ED5B3720D37A1C097AF8A6FDDC3B2B067680E6CAA760368B0E1C052E804E9F80F26B52596202FF2E0AF7215999EAF7D3EE3E8916744E40AA1154322DD068AA15960DC38671A4F5889FBE709CE1DECCFA80B9D33AD2FD963FE0581A2ED7718A27CA62819D05BAA3212EC7CC1C5472BCF579AD52D5E1B2BEE637D9827851C419A4CB91DB57B2A6CB4433C1BD209648F1FE170ABB964B272BCF0A263CE28CFA3A9D1449CFFDF643E37AD97182F0031CB334A1EEAD23D63A5C2D0A675D0ED000F37FD2153E1AFC4AC01692701014927601203ED2B8A477CCEC45C1F43190E4FBAF2295E32A9383FC7915AA76950A301ABE47BFFAA9C294292126934CCFC173115A6CA96F3945FD5F924A5017125AD5AAC705106EB852EF3190A24420196ECD37F7C67B57162CBEB97DFA +pk = A92FA1A950E0BE849F38346363A6A56AFE50111845AB15F4C17461ADF373220159F46CC984C502023EB1DDEA3295F394C3043033FED5E9DFFD8D3616B61E6D0404 +sk = A92FA1A950E0BE849F38346363A6A56AFE50111845AB15F4C17461ADF373220159F46CC984C502023EB1DDEA3295F394C3043033FED5E9DFFD8D3616B61E6D040493F5053FA67C7415405B85083A84D5CEFA000000000000000000000000000000EE857BF2F8D9FB98B06DBB972ED509870FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFC93F1296806465F022D29EA190FD8AD066FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000A30E97D329654F5ED8A11902167EC0C0F3E3F5697F7FD23685C8E0B2FC807700B6C0F2F17FEA9B81999FA1D8962C021FF9D8CF8A966D09956CF6075E82A25600F4657847618C123B2A9FC5D95A4E83F9DA515675D064B650853393B435956F0019AA806E88F8B9E6EC6550CDD8115AE879E5E340000B7A980BAF4ACCB06E9A00 +smlen = 2722 +sm = 28DEB0B7CB0143DC87F7D77D7FCD39C3321F2D1E5EF2CB6F810A6F449FB5C3014443288F01D5609962ED4E3B9EF56B6AD3DC09829A11D63B054D02AC0032AC030000C7B00B47CC2A63C84C6C2F891E63DE644FE4039E0983F7F49A693FD6DDDD922133DF4719094AEDEDB1D2FCB8D678232A2445C96DC4340CA8A67980344EB29B1463E1CC8CF65D546F29097AF66DC81A02190634FCF4626248B979A7A8D306CB9ED69C4CCB5CC3729D2692E0BA679D5C2FEAAC54A4E06D4EFCEDF78E19357DAE263E1B5D107FB09618A9C34F54F19A738A66B95E6F88E20E01F879F53E8F4C371B571E1438FF70E0A8CD00D608976E24501B2DDD323EFE6C1302A318CAD821C6FFE641672BB80AC62286C69FCFFD93422911C46D43DC9A1F00A73E19EBE6CC09A9801F2A1DA708F0F1F98E7F1A18529010823230279F487911CEF1E784A229D9E311BCE5E2D368E6D613F791DDD617D0F37F604B786CA2BAB754E8BC4BD3DA37E66A54DF1D3B268A5A80379A30A52B1532E8CFABE24168D83CBFD61E2346F901C361F771E0BE3E03DAE8CC30614C10FB8DCCDCAA5B9A25DDD8D61E61F60F22308E12ADC137D3D8C53CF7B31984CB813758BAA19AC178F2F0CD2155ED674A7509A3CFA7FF66D2D9B1E60BE50FE7FB79591C500F66BB1D35EDB80263F4B696A3DDA0B9B2911D01E76E9070D99DB93D1D0C3874CFFA776BA24424A6B453526F7C44EAFABE13C0750F9DF33E82105930139E70B5CF1B09DC3913D6BF4A4859F67FE814FF038F0FDAB93522A35E7F81002A395989D68B8B7E4235A09837CC6402A5338DA08E7C73DC63C43BAC42054C694F4931B80140D6B104EDEC995CEBCC5629F85D09DED8257626F9FA4079ADEF81D044C18BF2277DAAA41931B62A6028F89F95F06D8A8FDEB95EB2EB1E90C0D8523E0B476B158E3040F212390AB2503021E8D6FC0733B963CC6188FB2532829925B59C8255D89F10B657053D0FA1D8E76C84826A4609284503D3A101EBFE7AF93EDC423EF5303CD946C8B570511E38EB04BEE0060E678D03E4134F84F279A570AAD0332417FB2099E3F1F279CE7D6DDB080C5D83064D107BB560B21183AE165CBB54CC75313DE72D40D1CF5173455AA55C5C356D7C40A2A7023DD95D3F89B515D7598F800DCB7BF68B707978ECAF55B794A17559BD1E913F4472B1830783BBBAB5F23A760C78C46157FD1B429C445494CDF92FEC8BF9FC217D3CE2697BB6C671BAA793CD0C1C84F579F0DAEC400BEADA799A9F417FE4744145F21C6F8559AFA7A514A0E951F03E5E68C17A8E5816F3FCF41774D26BE2EDC11FC3A42CFCF00F817C3D0FBF474FD7F30C9C3C6BE7F74FCC79FA6AB07CAB037EEA7D83866673A74C087B5F7542804071D53CE348D2E836749E35AF0FB884D5D53ABB195AE1EE6E9AE35DC91BE359BCD510A7801FC243C07DEE92373918AA4F8A89EDA3895A52456F7244D1FF007CC7B1A52CBEF4C1ADE1C2C0AC189AB24B3F260475E1D08E7C5BFA30A1CDD71DE5ACE80D5FBD1D0F17198B79C8EEA0365D139F2AE73CAB6FBC9A79786896DE0CE7FC747D68FA4ABAB662A09E0E409F7E652153352BB92F5DA1836B0E92B0B644C821B2DD2BD0AF193AC0F8CF5B8D88432F0248DAB09B46FBEF2EF1899B5981E9B33DE4E9927AE50890FEFC35F681E075D8B0169A2E16FEDA6392AB9858DB87ED18ACBA25575AFD1FEDA9FB3FD01ECAC13C245DF6972F65087513F505187C4E8EA54B6433FA092B6CD3AF13F4718693904435C55D273060FBB5FDA76074691269493E86F287922D074E54EFF04209B2FDD3417D8436D1395E638D57DB75D68F4F819141B6DAF4D13A9A18629CF5F84B0CD02E7A397715DDE5476BDC467218D11AACD6CE399D9D54645BB27CA43076B7E4E57FB4F7C4F4B8D0AA949719D731C3A927FDEF1533D773CF1BB562D5EA43817A5ACEFE9EB7E51029DEA143E8A1D5F76F9BFD74A26C6D38F54194319A1AAABC4DAF45EFBAE770B9E9D834C09FE45C15D4BBC0251D3DF2F2F23387DCABCE6CA7A59625E18FD997770D164C338D0692AF97C749FB746C0D3944CA4B2DA6D3AD7B8C3AA922FC029CF9AC5580CFEAFF50CB2E9044211EA522BB5769BEB7A7BBA0743F345FEEA9AA9DA6EC5F0579CF7A5AA4DEDC832FE3F65185A31FD49C0D259E3B7F8FA96E110D130F588CDEC30D0FD4860CA6673C46D961FC68A4020FB03AE24B1AE12967EC1ED19ABEC0808A7EF89521152033F70F406A7005819D28DFC556C79DE18584088F40BE40A555EAEFA78E3FA3D9360A7CEBD963555CF208DC408A07CCC1369F98BD840F5C940721064E6C7CB241ED0697AF0FACF36F05632A504870ABF90134A01AF00D340F7A5D548A8078C2049600EE454D15EB8CE58C26B3C8185CF9DFCDCA7D4B6DCDEB82230F993D51E701D8387B06BD45B4B61DC9DA6D3B4356F50C1D4AD2B467D36AC092442FA90D1DEB014475AC7CE90C974063459DC951DECFA30D2DE4C70FBA39A8B6931217D0924FFA783C8C3DAF048908E4AAEAAA3B7C98846278AFDD1753252F39CAED7D334D8575CE3ECFB2EDEC31AFEB2BBE67FA929A267376293C2B2F295CD8DBD66106E1D9518BE1798949F3315E0454D018C2B706FE836FB37AB908D9D698AF495BD285A74E4CFC7612D42121F43FDAA7DCF44DA82897B820514D66B92983A3EC819D2CE208D688B6F0AACADC0CDD619D815CD231AD8DD9B6DBAD9C47E16FAC098D0F4279AB52055D2FF765AF6E3618C4509FAE6AB00FA23980EFB19A26E0A6EA4C9A7DC699121388748449C429B28AD2779F5642F05FF58B68BA3E289F90EB27CE06392616C080D659338CAF274D46A90D58F2BFED25E8D4A8C62030A5E89F6B1A5F6112A38661E2F2B5A37BCBF050812DCDCE9C0A939ADF929C921E7DA0C30815DA318EB2F350F286441CC92060C970077623EEE68B8C6FEC9FFFE780A6FC85FD7AF90172951337AF57339E98049132A4CF58874A7418FB7ABA0628B6192BB2C43102EE6B1D7E824725D9C75D34A8B69DF4A6BCB1F96B57767046C99EC6352751E2FE1075BB4092672379B3518DDC884FEAD5BD062B0336EA88BCBE0D22E066566347FEB617A322BEC561E9AA9D2177EEF0DFEEAF6231AD56D0CD9E300709C9317B3D334D8D2AC97F96CF2F45B8582C4128D95DA8CA207AE34D3DAACCDB128C11694EEE6D3E8E6AB767B6886B1F7235D85A4D9C7C831C5DB8AD8323F63927A638E19497CFB308285A03CA2C1FE2AC4D919AD11511ECC6F28E7D0E0A614FE21B57BCCDF83535C7E2C40840BA0014247190C580378454751EB3F2361D7193E160B9516F7EE1D683B336B873C8BA22E97480A61F002A73844C78309C0A3B31BE30A192A62BDCC3D33A7A5BA1F6AE0404A8558740CAE46E5FD15971B41C0BC39665A9B92EEB3328C328B073ED5B3720D37A1C097AF8A6FDDC3B2B067680E6CAA760368B0E1C052E804E9F80F26B52596202FF2E0AF7215999EAF7D3EE3E8916744E40AA1154322DD068AA15960DC38671A4F5889FBE709CE1DECCFA80B9D33AD2FD963FE0581A2ED7718A27CA62819D05BAA3212EC7CC1C5472BCF579AD52D5E1B2BEE637D9827851C419A4CB91DB57B2A6CB4433C1BD209648F1FE170ABB964B272BCF0A263CE28CFA3A9D1449CFFDF643E37AD97182F0031CB334A1EEAD23D63A5C2D0A675D0ED000F37FD2153E1AFC4AC01692701014927601203ED2B8A477CCEC45C1F43190E4FBAF2295E32A9383FC7915AA76950A301ABE47BFFAA9C294292126934CCFC173115A6CA96F3945FD5F924A5017125AD5AAC705106EB852EF3190A24420196ECD37F7C67B57162CBEB97DFA + +count = 78 +seed = A315BCF0E6835892ADFA07C034BFCD39F80B62925A95490B20170BD29378E11559C7F1CD296377FF1E01284EC727FFCD +mlen = 2607 +msg = 96AD5FAEF409B8A4C21ACB1ACB596BADF387D26656BE3EB17987AF59737E324B7BF8412A306B0E706AEF73D79AF753D9B0064BA9CED8DCEA966543FE748E2611709ECD1CE6E4DD8FA812D485E91809A225936675369574B0D104A258E3353EE0E021683615CA5C7C531FB29A5025CC7F7323860443DC19C9858F741EB9D24A9F6F04FC839B67153214116E8B7FA982F338445830F915F7C85C88C23BA2A3CE8E2020A9D8DD7B18EFE95563E3924D2A341826AF51A8584CD026B1C433EF0221145BA8BDC8F73A467B33A9EB3E8CD2A4D671C17D7C28AAA539D1C5BF2F4138639AFB89CE791DAF0EF0281D52598F4C13D210974CFA1F099A0FC70B1DC120E5C00C33A2BD360BED57CCE069060D6380BE2204852D8BCFFF4918BA0B70B0BD1E1D55DC1D68DB1D20AE713B0093EAEFA1E33D40D9BD95CFF17568393E9BBF5CC1287325D2668F65DFCF44ACE2F6C6CEBB62F1433E69CD19E6C6532EA93682B22C4C4A62C6ABCFAED08EE64F32723E56205222E4AE0831AB8FCA8C265FEA0CFC66AAB1E367201752AEC11F752B963792C071E42A8A1AB80658A0C6960147ED740CD07F307CF6A644A98E1D2E56C625ACF458D0BDF6216A4F1B9C78EC3F14850C803A4207C894E61A8AA88840A27F2B439FA7CBAABBC789102A95323E06E2C324859DB92C6CEAEFDCA389F677082180FE3D6202FF60DAB9F87E3B84841C0A4EB5974D893333F7F1513E54EA4AE0731EC409F69B77089FAFB121300042880EA59B7927E9435EABFDCC1019A96E145D5D157998D620E7BC6945DBD6CD78E94C2D89589F8DC8A01CF1B295A26B091847F034937F764ADFD811F52B3AA187F3F49273EAE5949FF34B64BC86FF11EEFE378825D526509483E7191B33333E5465FFB025B269F898CE1F83EA549F1864B556C729F510118921B69594F67B8C229236AD3AEE55BD7082E027B5D342C976A549E01618288944DE0B2C77473A25201B61034B334968178AFAB7F8CD1FEB6A25CF8DCE3586FFAAA861471E2EE7F0C22538FB3C95D2145965C4673E6489764AE24B4F048DED77FE3487AE175F6D4898F69F9FFF276470A93DAF986A75F685919D98C9C609C795D4785AE941C782B551EF382F47209AADEA19066AE5D3EBA7BBD99E91943F1E62754A42FFC8048F7B87F128CCF6C96BD760B45F07F740E94491874B06CC3450AAF55BC664B407C57369CABD2708A9C478DFF64D292D96AB71EB997F8B71CDD6BA02F52C5035EC26E8111EBF8268CB00DF9ECD63BC0D557E2D2E77A6363B00DAF25237E77DAD03F929E5E9B39447A70D4E5F4B90958F312C80D594E1B1F3D0D23F2B0D9753BF3544061CF0C0F841C440319E74F9B9D15B91EBA1E680ED6AAB7D63A97B48C0A4AAF314E8E77E2EA6BE9DCFC7B5557FEC1B996A37C86CF6941325EC356EE75671726BCED7D2157BE8D4C62CF4BD0420BAF2C4223597C0EF75F7A7C9533D14BE0D21C37F06FAA53ED5EE0DDB025862417F98D2F188895395CF2FE72185ACBEA952F55CAD7EC2D684A5AB94B1257D7ABB565B8C07B88C6335FFB9D2FC6F6779CC24FC3CDF92BB3B12EC54360A7CF3579632A2A65C518E57015DF1C616C857F83F5F1AAFF693ACFF210DD1E95CE04CCA9A0BF385ED6EA2AED894E79D5133799393469B666209371E708D4D279E1AC5ACE28985D0DB2765D547C2902B715BAED5A4FA3E7AA42645F3BBE1E9F3CDB87B1DD8DBB5AAB08626591921CB49E552F8EBAFCBCF428470719AE40B9CA847F31848F39E4D42049C5D40B0BFF036E5409A6A12E7924148E60B64BB83386079B54486FFC8187302893B8BF826578D9CA03A1291983F21DE7F6E65458F8942DC1B135C6C8C1FEF4F3863A58DB17112419590AE57B9425592FF22E596191E5BA7C513EC315EC3476C95A149F6A5EC1CF24870400FDF46217A23F42E0B61157C3CEE23E7916B4475A94B96B917C171B1A34DB13AD98833E457343F94A76EE226FA5B9F3066C2FD69F14D3AAED1B31F5114780442EBBC88D0DE5F689CD910E7464D73423B9D4E03718C5C51871250D11E27E28DF1268166E3AF328A80D9D335F2D27D2E91DC61CDDC7F733E345D56C11B6130875D93D527F93542FB352407185E7AC07051AF7F642E34FA06B1376BA15A35D837C1BFE090BA67A89FC1E307DFF3F02A988ECD48FD229733F641F2609EC8DB14B1A5AC170B104F03C2509D2EE6844C716766D06A6A25D957530FD68A8DE6F1753F83EC19EA2DEB1A4F9C7986F20FF60A7508DED6547A85BABA70577062E8144BA0496777A5218595E021937FEBAD4BFDECAC29E3FFF2EFE7D598FCB86F93A734E4C573E1496A6282A3B40E817DD3C9D631939AAB350ADC703899EE3BCB1B5EAF6EA8420DD6EB2D4F64A1818AAFA97B73C75610B6005F1EDC1EC7D8F8DB1E5D3E9666C1292515105037D26F2C8D83FEE1F4EF5DEEB287CD7C1E11960218C1B8BB50453488BAB019435065AEDFECD8D218BD1E751FE736442E8D09CE7176A71C06415A30B070693A68BDAA5CDF62351AE665F37FEFDA9481E62EC181ED24F0D0649AD01C89AC422F1B7E27895E55DCC2FD817346D361FA559094B37894C0B478C68A1D7564D089D9D4417D5C7372A33BA475A81FC129F3259C5407BC7435825B415782CC84D85E69D9B44B32D78FA255A895CFD55319DAE677FF89D93A3884CE9401775563FF1788CF3AC11CF96DAA199E7F4579A0264378A323FDA64FAD2349C09465FB23BA09069C7FBC79E7288A82F9165268F6842E0AFF0E250C21BBAEEFB4347D4EF1CD51161DFD29BFAFFBEDF71DEC93F4157A5C18995379ADE8D15DB59EC4A8B308C2EADE1B7DDAB55CE2220F3B3AE8CBA7C8211CCCB3846A225B438F4B37DF54363A987C5C4E6B9D20EC3C0096317D11F982184B75D8EFFD168B7B41317D40F903A23A2649999DB36CAAE31BA5D91998A684D30AAADBD3B1EC154BB6C92513BFC0C47C673254F42B1FA36B995CB737668CBDC2A0D1BA838E74E0E50B22FC22DD048F48B6D1E89E1CCCE5A226F63AC7B8E6E9E8CE27050BF3DCD7D0F35F47BBEC1CAABD4D619CD77302AB4FF6F56DFBE9F5821AFF2D72EE6A628DAAAE4440EDCC070473BDAA54CCD775331AC2812FC5B9884915DA582EB36F85C7923F06D961594753802EFC5883CA484FC64FACE42DE6C3105E23CB90663A3B381D0C6A7265B740BFF0A1A017058F06E39A74BB07B63F883CF914FE675E7E5AD5AD44C9F90DDBE23A125D9BE02264EDC13972FF22BA48ECE8890A223EC13ADDBE055A8B4E03882677FC0D94C9053DA6CED34E132FD83810A793350446D60AE5DD0D174B534A3B6F5BC1B497F9406B5CDD414401B6DD881CEABAB12CC51425E88A81BD9E14BDA18273583CCE0849AA48DBA1CFC49CDF29242C73C99C87F063B8B739AA787570459C098405DCCEF78D6D97C21545F2959DF9CD62F9C38AD9A849507C23A51714565642DD76C9103154327985F7DCC701B795A7AF8625F06367ADC11A7FD7B6ABBDA5B2FF6A825DD43B64A48EDE4EFF8603A82159A6011F9E626171E4593C0E963595A6E068AD05FEB12378C71AE515A82C293EB7D2B01B333CBC7991B44685AA7513B3A58342BA5D094B773E6A27F8582F3DABF54DEF59974CB8A2499369B5B64C7AC08D32D75FE37371C578073DC83B82A828DFC325976FF282D3F6 +pk = 8687257A460EE6DD5B6EB10AA641E64F11E408C101F4B5CC56FBF84C62B3AA02C9A50D4C22321CE5B96D38B41E44D21AB8B15886B78ADC0EAA65DFD17789E10002 +sk = 8687257A460EE6DD5B6EB10AA641E64F11E408C101F4B5CC56FBF84C62B3AA02C9A50D4C22321CE5B96D38B41E44D21AB8B15886B78ADC0EAA65DFD17789E10002237EB14FCFCDC109CCD6FF58352230BEAD0100000000000000000000000000003285B861EBFDFEFD2DF62A7C80EE5346D2FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF71109B4C863FBB8CB59C28E426B0C41808FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000D87B69564EF8E998D9B379E1DBCC995029F3163FDA37F34ED6A12BA1A942300B90495581FFE71EE4F45D34036C1FF9DA84D0A037849EC59C6CACDECA4AD2F00DEF04F842A3174AF9E46926285A5643AEB9DF08D9D2F9A3651091975C33040005F06490B23758E6F60380A20643407C964B5ACEA690E10CBBA4B5876BBFB2D00 +smlen = 2755 +sm = 2CDA52501D1039A2E6D3D092FD883B30C0322033FE43DC838A78E5D925CA7301D9D965CD5802B2CD0C831089DA6EA69BD9D452AF0636AC013365F57E1BAE280300010BD140946E682A9ADD6F89A301C7D9A0E72B5B5BD524921BBA05F127ED626C5CAC6B3B2F209ADF2EB04CFB01CBC91BD196F9A1DE2278B39975F8C5F152F5568B9348752CC61ADD4FBCFBC0FAF427B303020A96AD5FAEF409B8A4C21ACB1ACB596BADF387D26656BE3EB17987AF59737E324B7BF8412A306B0E706AEF73D79AF753D9B0064BA9CED8DCEA966543FE748E2611709ECD1CE6E4DD8FA812D485E91809A225936675369574B0D104A258E3353EE0E021683615CA5C7C531FB29A5025CC7F7323860443DC19C9858F741EB9D24A9F6F04FC839B67153214116E8B7FA982F338445830F915F7C85C88C23BA2A3CE8E2020A9D8DD7B18EFE95563E3924D2A341826AF51A8584CD026B1C433EF0221145BA8BDC8F73A467B33A9EB3E8CD2A4D671C17D7C28AAA539D1C5BF2F4138639AFB89CE791DAF0EF0281D52598F4C13D210974CFA1F099A0FC70B1DC120E5C00C33A2BD360BED57CCE069060D6380BE2204852D8BCFFF4918BA0B70B0BD1E1D55DC1D68DB1D20AE713B0093EAEFA1E33D40D9BD95CFF17568393E9BBF5CC1287325D2668F65DFCF44ACE2F6C6CEBB62F1433E69CD19E6C6532EA93682B22C4C4A62C6ABCFAED08EE64F32723E56205222E4AE0831AB8FCA8C265FEA0CFC66AAB1E367201752AEC11F752B963792C071E42A8A1AB80658A0C6960147ED740CD07F307CF6A644A98E1D2E56C625ACF458D0BDF6216A4F1B9C78EC3F14850C803A4207C894E61A8AA88840A27F2B439FA7CBAABBC789102A95323E06E2C324859DB92C6CEAEFDCA389F677082180FE3D6202FF60DAB9F87E3B84841C0A4EB5974D893333F7F1513E54EA4AE0731EC409F69B77089FAFB121300042880EA59B7927E9435EABFDCC1019A96E145D5D157998D620E7BC6945DBD6CD78E94C2D89589F8DC8A01CF1B295A26B091847F034937F764ADFD811F52B3AA187F3F49273EAE5949FF34B64BC86FF11EEFE378825D526509483E7191B33333E5465FFB025B269F898CE1F83EA549F1864B556C729F510118921B69594F67B8C229236AD3AEE55BD7082E027B5D342C976A549E01618288944DE0B2C77473A25201B61034B334968178AFAB7F8CD1FEB6A25CF8DCE3586FFAAA861471E2EE7F0C22538FB3C95D2145965C4673E6489764AE24B4F048DED77FE3487AE175F6D4898F69F9FFF276470A93DAF986A75F685919D98C9C609C795D4785AE941C782B551EF382F47209AADEA19066AE5D3EBA7BBD99E91943F1E62754A42FFC8048F7B87F128CCF6C96BD760B45F07F740E94491874B06CC3450AAF55BC664B407C57369CABD2708A9C478DFF64D292D96AB71EB997F8B71CDD6BA02F52C5035EC26E8111EBF8268CB00DF9ECD63BC0D557E2D2E77A6363B00DAF25237E77DAD03F929E5E9B39447A70D4E5F4B90958F312C80D594E1B1F3D0D23F2B0D9753BF3544061CF0C0F841C440319E74F9B9D15B91EBA1E680ED6AAB7D63A97B48C0A4AAF314E8E77E2EA6BE9DCFC7B5557FEC1B996A37C86CF6941325EC356EE75671726BCED7D2157BE8D4C62CF4BD0420BAF2C4223597C0EF75F7A7C9533D14BE0D21C37F06FAA53ED5EE0DDB025862417F98D2F188895395CF2FE72185ACBEA952F55CAD7EC2D684A5AB94B1257D7ABB565B8C07B88C6335FFB9D2FC6F6779CC24FC3CDF92BB3B12EC54360A7CF3579632A2A65C518E57015DF1C616C857F83F5F1AAFF693ACFF210DD1E95CE04CCA9A0BF385ED6EA2AED894E79D5133799393469B666209371E708D4D279E1AC5ACE28985D0DB2765D547C2902B715BAED5A4FA3E7AA42645F3BBE1E9F3CDB87B1DD8DBB5AAB08626591921CB49E552F8EBAFCBCF428470719AE40B9CA847F31848F39E4D42049C5D40B0BFF036E5409A6A12E7924148E60B64BB83386079B54486FFC8187302893B8BF826578D9CA03A1291983F21DE7F6E65458F8942DC1B135C6C8C1FEF4F3863A58DB17112419590AE57B9425592FF22E596191E5BA7C513EC315EC3476C95A149F6A5EC1CF24870400FDF46217A23F42E0B61157C3CEE23E7916B4475A94B96B917C171B1A34DB13AD98833E457343F94A76EE226FA5B9F3066C2FD69F14D3AAED1B31F5114780442EBBC88D0DE5F689CD910E7464D73423B9D4E03718C5C51871250D11E27E28DF1268166E3AF328A80D9D335F2D27D2E91DC61CDDC7F733E345D56C11B6130875D93D527F93542FB352407185E7AC07051AF7F642E34FA06B1376BA15A35D837C1BFE090BA67A89FC1E307DFF3F02A988ECD48FD229733F641F2609EC8DB14B1A5AC170B104F03C2509D2EE6844C716766D06A6A25D957530FD68A8DE6F1753F83EC19EA2DEB1A4F9C7986F20FF60A7508DED6547A85BABA70577062E8144BA0496777A5218595E021937FEBAD4BFDECAC29E3FFF2EFE7D598FCB86F93A734E4C573E1496A6282A3B40E817DD3C9D631939AAB350ADC703899EE3BCB1B5EAF6EA8420DD6EB2D4F64A1818AAFA97B73C75610B6005F1EDC1EC7D8F8DB1E5D3E9666C1292515105037D26F2C8D83FEE1F4EF5DEEB287CD7C1E11960218C1B8BB50453488BAB019435065AEDFECD8D218BD1E751FE736442E8D09CE7176A71C06415A30B070693A68BDAA5CDF62351AE665F37FEFDA9481E62EC181ED24F0D0649AD01C89AC422F1B7E27895E55DCC2FD817346D361FA559094B37894C0B478C68A1D7564D089D9D4417D5C7372A33BA475A81FC129F3259C5407BC7435825B415782CC84D85E69D9B44B32D78FA255A895CFD55319DAE677FF89D93A3884CE9401775563FF1788CF3AC11CF96DAA199E7F4579A0264378A323FDA64FAD2349C09465FB23BA09069C7FBC79E7288A82F9165268F6842E0AFF0E250C21BBAEEFB4347D4EF1CD51161DFD29BFAFFBEDF71DEC93F4157A5C18995379ADE8D15DB59EC4A8B308C2EADE1B7DDAB55CE2220F3B3AE8CBA7C8211CCCB3846A225B438F4B37DF54363A987C5C4E6B9D20EC3C0096317D11F982184B75D8EFFD168B7B41317D40F903A23A2649999DB36CAAE31BA5D91998A684D30AAADBD3B1EC154BB6C92513BFC0C47C673254F42B1FA36B995CB737668CBDC2A0D1BA838E74E0E50B22FC22DD048F48B6D1E89E1CCCE5A226F63AC7B8E6E9E8CE27050BF3DCD7D0F35F47BBEC1CAABD4D619CD77302AB4FF6F56DFBE9F5821AFF2D72EE6A628DAAAE4440EDCC070473BDAA54CCD775331AC2812FC5B9884915DA582EB36F85C7923F06D961594753802EFC5883CA484FC64FACE42DE6C3105E23CB90663A3B381D0C6A7265B740BFF0A1A017058F06E39A74BB07B63F883CF914FE675E7E5AD5AD44C9F90DDBE23A125D9BE02264EDC13972FF22BA48ECE8890A223EC13ADDBE055A8B4E03882677FC0D94C9053DA6CED34E132FD83810A793350446D60AE5DD0D174B534A3B6F5BC1B497F9406B5CDD414401B6DD881CEABAB12CC51425E88A81BD9E14BDA18273583CCE0849AA48DBA1CFC49CDF29242C73C99C87F063B8B739AA787570459C098405DCCEF78D6D97C21545F2959DF9CD62F9C38AD9A849507C23A51714565642DD76C9103154327985F7DCC701B795A7AF8625F06367ADC11A7FD7B6ABBDA5B2FF6A825DD43B64A48EDE4EFF8603A82159A6011F9E626171E4593C0E963595A6E068AD05FEB12378C71AE515A82C293EB7D2B01B333CBC7991B44685AA7513B3A58342BA5D094B773E6A27F8582F3DABF54DEF59974CB8A2499369B5B64C7AC08D32D75FE37371C578073DC83B82A828DFC325976FF282D3F6 + +count = 79 +seed = 8B47E0EBE786914C9A52D547106CEB4A3D3DE938B3244E02E5F9660954C4C95A23F2476FCCB487673AAD0513820905DF +mlen = 2640 +msg = 2447D338BF1A375B66B77FB96CBE7742508B57DFF4D33A368EBB8451C2C67B980D3576E6588D8678B285EF288A8B5C9C2726C4A550E764E47FFFA2A128533A7653E480288447509E10013AE1944FFFAFBD9E2BACA0B3C7069C07A4186C056FD3857CADDADD5F891512DAEEB26865F5C89FFA63A64C85A08E41EBE7BD8786A8ADD571A4267D5A9E426840A0B988E197A09F3770B5B0D80D65515CD4D8390AF40E6150062DC4B8661A8238F232692C152C97B8CD5BFE7B5AD863DC92D99744D769087B3EDD81D2E475F5CF0224B10CDE6FAE8DFC3519EFDBE66805AD4468D84D3DD93430363677360DA8F56CB58A6B775FF6417C1F324380B15C9BA668EB0F25FC2A690B483E856F3327B2D79FA6259E30D7F76199CFD21152B7C6FFC3FC113F70D3930C08B3C1EB1BF25C100C5A930EEC2C52664F092B89614943D9D85ED86A2EF666A94F9826C3D116A2BBE49443E2C11748C977716381D9463DA8D09612B80A6760E5A6FC5F59425EAAAD6C8342C1EA4BEEDD5D73151CE213C0B155286FF22CD28E3BB88E0CEE39CB859900D1E0FC19F6A7237BDA8E51476F4844A316752FB347492A928EEB07AA39ABDCC0164D1921B61352ED4AC94B82C410A56505633BAD53A3E649ACAF64C43C1ACFCD4715FC594AF6FB9E85B0B7DDD6E8621BD12A2BEE48223A97EC8502C16B550B03087B6E87C1A860D36322064F8FEBC52F2B7C31DAE7430870259BDAA5889852E3AE6F61013F5AD0D38727CF9D90C67BD7BB3B82D303C6C35383ED86FD5B7DDEC824EA198EF780BE830A1F2679D24EA6E2FEEFB979563F511D188F409F0CFD0050FD418414D01E46DB3D23B3A90B24F4E96EDD4F863BFB333D6A826D29EED167738BBE22C516C59FDF81B032BB55473A5EA2A1DEFE71C95A1EEB5C028435AD0379896CBBC76877501B054CF1FD2F6D7A9DECCD70D0C07111147EF568DCE514DE96EED61600029C8D103B31C8B344A700DE630276BA2C5633419C59E66577659538A6381E45584C7E1D6ED978AB0AF89067AC83BB70DEB6F2C58E339A5A66176A54D985DA6E02002948C62BE6F12314240FE18B09AACBCE82EA462586B8316C3E0AEA00F9998922F8D956120E53B4178223F4D2934A20976FD5A72027C8F4CB33E9BBCC0ABD15395151266B6CD5B4A9E2FC1725D8E9AB2CBDA47B507BB25AC995EDD51EBDA5FD19CAF68FAD8EAC57CB5EF0C6FC861A73E64648EE3255DB4C3394438F49377CC4AC2FCE1B6BC812E5D282F122678713C6C6D452A33C632C0AA47686588752D72B0586FE5EC2464A6DB40662FD2106A19F67DCCC45692FCA03685251D512642B0CEE436C78D94C6F5F25BBCB41FC7E5B1AECD52B846A0B70EAC93579603E9870F942AD4C1CFC9D49B1132777C6F1C184C1537178E5029067257A2DA2827A2EC44D323D13DC6E4E1B9EDF5949D4324228687FD54F02CCC3C4DDA635FA546A5A6783959B1C48AA9D9C9F6381EBCCD979253460857D3CB1C70893EE6F04709E35923883EE3C71C7F33B8CC28B9136B3EBE5F52B9A76817F2F74FDC2F12B459DFF32D5A295BE374B3FE507A0995BCACF1E7B24F4501B29F1E8B4F2A8CB394B3E459A4296F6439BA59EC88305AB045FF40B1DAB4F672F878DE1F9E46B9326CB3E2F3457B83EAD8DEC28DD079AF0E984A69ED882E1CF21036578485DFC2DEBC9CFE82FCE0383B4039D147C4C7E31E315FB57B9093DAA811F4EE4568E32E5625ABE76C5A1AE42A03441DBE766D0EF4DF607406F7D489275E8C5D4470866F9049A4AD5C428B843DEC3702E86E177E4B60181D2B5F099BEBCB25F04C93D087C72436E87A9B3AFCE78FA31E2B892400B5C1071F8AE0F78EF6F7D71859A97C17EC0912D5EA27AFEACE739FCF66F489EC6355A3318F79649881CD6C7E96A881ECC4FF6934C3D10D99F1DFD00592CB037749B025BD4BC2832E206C1407E600FC2170C0BB57E5C7AF0756830C2A6913E2B9C60575CD4A394F2A65C50E40A43CF5EBCA6A8A32335707DDF4633BAC7375DD53E24DF20AF30203B514D3793392E38FA8429B050F58B28CAD0146F385809CC7FAEFF8B71B2BC93D2C6F72E31AE2D07CBB3CB7F43540894E01654EDC71CCF4F361A847EC5B1D23C2D4680E29F0E1F992EDA3AC41ECFE614FC010A2EED1BAD87A7D17468D6FA5356EDB25E9008A9BB328225F85202246816E1A542E1DD746A5FD3E064FAA1248579D31CD3D65F8FFF36F782622402DB328C7850D82D8D8A52B897353A2F8B95624D2D958FC1C3AE6466EACCA2A6A5E6ADD4A582D27E07633CCF697FA02E243A4FBB3DC727B718B5AC0FA6AAB217E241627E69CA46F05ED6B496A739A29EDAEEF76992A507130715BE555C68A7EEAD6E8FF3A378D8F4B7BAFDEE3EDB9EC094440E31BBA717A9C82A117D05EDCA2370003DFABFB2EFB29510466F74E76CECCFC41709FAC4CD8EAA998357170A7A293209EB0BB83DFE5E2F6D73C28D5409C55E95068D647BEC42DB8098F0089EF8A5FC5976BAC421C37DDA6C4227BC1AE5AE229F067515CEA3D794C8D85564AF208AE0FCF836B6C0AF41477F99C8773D9DD1923C5C07E1FD508C7436EA93383797F372EF3103546A5278A4F59614A5D182344F0431D065C35620D63D4D001D7F626993241362E67D1BF41419858EECC2626537D44E2E23619381E96CFA91B3D8054681D298509D9B99E7AA99CF8742E37637B24136F8E1B487E9571E4C24AE5DF307E4C7C62E55C47132AE404B33E5367C6F24D6680BE32D20BC58370145486FD5EACBCF98EB7E7FB6293044067AF11879E91444025FE52E24617269BE192BB71BD9F95356EDBED9DF352AB56A854F9F531889A88689D3F161FE6155C6C1E8011D60A46F59C7D08C477FA652B559A80567076B4EAC29A85D54C66B35D6960DFF75A696CDB17EC9A7B74DC6C3652DAE866E8758170D055C4BF60FA1238448CC9E29160DF50160C4B0DFB36BCA40AF0BC5F7D490E7DBCA49535742EECB90098A0A0FBBBBC7AF25C0CA9BC039DFB555DD8431AF188F7C1D0FF786D627C058A0B9A15F26B58AA2A5992BC8FC5AA14025FF95F294203B45EA081E28F094D0D4AD671C885E67B2E9E800F10048158698D56648F67BFA8CC73DD5AFA15C1E48936B2596DEE34459B484336C20CD77E58BF682479F9AEF2FCDA86E4F3A2FED7046E5A3828A9B3C0DBFFC25FE699F25629A2045A51242E310CB369B730A5E81167758D7FE843261A598E4541B02D0DB4BF5616BA07A440665F7FEA6213114B6B1B38BC033D70E845445DCD18E23D34D3D6F4A52F5F904AC5D8FECA5AF1123658D09613209EE19954174A1AC7A8C7F9EA288BBE5A0705F3CE38F30ED5EE69CF5208D461EFAD51C456507C3729EB338CE15C4C253BE21E81F082B0847C6871CA0FC8B3E80115FE2BB8CD8AFAE69A3C1429D21F149B7446888BB4DCB639819EFEE665B6D6F69E61452B9328B4887A7C04E9949390980A2609A667267035B11BF862C1131533DDAFA518221627E0EE7E4009CD48E4AA9D0753A9AE82AA0257B69D569B4C53F05A75A521B327322C60398DB0947D205D2A33AE51CF2CEA8C9162DD604F8EDBE91F5199D19EFBF9896A46389E7BCBA54B4AA57CBA0D4F9DA117F288133AD01A9A9B2A824D54F74D4172BE2B1E5F0D3DE60C13AA5B668EE6A45397C2E39573EBFABAABA48D1DDB2AB6453FBBAC8DCC05349404889C7DE23A16EAFAC8D5E541457C32CDCE80CBC +pk = F2854FEC15A978AB6EFD84EC091BA4004D97D507452E6EDD8581C9A52B9AC90106210578E81E852C474DBEE2CCCB2BF50B8CF9F7B22A80179B96DE6194A20C010B +sk = F2854FEC15A978AB6EFD84EC091BA4004D97D507452E6EDD8581C9A52B9AC90106210578E81E852C474DBEE2CCCB2BF50B8CF9F7B22A80179B96DE6194A20C010B7D5D5F1241BC1218D8B88FF047F1DCEEB1010000000000000000000000000000B22660D7728F6839F507229B506D62937DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8BB4ABEC9CEB807F96A3302FF752F33B37FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000001B5793AC5C2C6208911512C16025AF7BC008B60CEA161BB27373A4FC00D3D000F9DCA41829C697B738EC20F22409AC6AB45C0C31951D1A57D590ADAA38952D00806AEEFB9639C221AAFC65E30C7A207AF4A81E3DC522348C02C2EEC6199D48008D4A35C508C17CA9B364B305C1F6EA2C77B1285A13080EF9882A5405EB0CBE00 +smlen = 2788 +sm = DB6D4520069A46BEC89ECD89430837FFE6A03AB81DE3953B5DBF1F7B55F255018DD2460B0AE5C691A537599B91386E5A97612EC4C0495D1427DFC814405A3604000191F11A4E5BC2B42DF6FFAD8A5F9AECFFFDBEC463043E2C35FA2380C8D2C317F91B3BBA5EE803A3709953E030BAF983E695CFCABD4448FB53BEF59A5F07E5DCFBB449508C43400A549639F45DD729790102022447D338BF1A375B66B77FB96CBE7742508B57DFF4D33A368EBB8451C2C67B980D3576E6588D8678B285EF288A8B5C9C2726C4A550E764E47FFFA2A128533A7653E480288447509E10013AE1944FFFAFBD9E2BACA0B3C7069C07A4186C056FD3857CADDADD5F891512DAEEB26865F5C89FFA63A64C85A08E41EBE7BD8786A8ADD571A4267D5A9E426840A0B988E197A09F3770B5B0D80D65515CD4D8390AF40E6150062DC4B8661A8238F232692C152C97B8CD5BFE7B5AD863DC92D99744D769087B3EDD81D2E475F5CF0224B10CDE6FAE8DFC3519EFDBE66805AD4468D84D3DD93430363677360DA8F56CB58A6B775FF6417C1F324380B15C9BA668EB0F25FC2A690B483E856F3327B2D79FA6259E30D7F76199CFD21152B7C6FFC3FC113F70D3930C08B3C1EB1BF25C100C5A930EEC2C52664F092B89614943D9D85ED86A2EF666A94F9826C3D116A2BBE49443E2C11748C977716381D9463DA8D09612B80A6760E5A6FC5F59425EAAAD6C8342C1EA4BEEDD5D73151CE213C0B155286FF22CD28E3BB88E0CEE39CB859900D1E0FC19F6A7237BDA8E51476F4844A316752FB347492A928EEB07AA39ABDCC0164D1921B61352ED4AC94B82C410A56505633BAD53A3E649ACAF64C43C1ACFCD4715FC594AF6FB9E85B0B7DDD6E8621BD12A2BEE48223A97EC8502C16B550B03087B6E87C1A860D36322064F8FEBC52F2B7C31DAE7430870259BDAA5889852E3AE6F61013F5AD0D38727CF9D90C67BD7BB3B82D303C6C35383ED86FD5B7DDEC824EA198EF780BE830A1F2679D24EA6E2FEEFB979563F511D188F409F0CFD0050FD418414D01E46DB3D23B3A90B24F4E96EDD4F863BFB333D6A826D29EED167738BBE22C516C59FDF81B032BB55473A5EA2A1DEFE71C95A1EEB5C028435AD0379896CBBC76877501B054CF1FD2F6D7A9DECCD70D0C07111147EF568DCE514DE96EED61600029C8D103B31C8B344A700DE630276BA2C5633419C59E66577659538A6381E45584C7E1D6ED978AB0AF89067AC83BB70DEB6F2C58E339A5A66176A54D985DA6E02002948C62BE6F12314240FE18B09AACBCE82EA462586B8316C3E0AEA00F9998922F8D956120E53B4178223F4D2934A20976FD5A72027C8F4CB33E9BBCC0ABD15395151266B6CD5B4A9E2FC1725D8E9AB2CBDA47B507BB25AC995EDD51EBDA5FD19CAF68FAD8EAC57CB5EF0C6FC861A73E64648EE3255DB4C3394438F49377CC4AC2FCE1B6BC812E5D282F122678713C6C6D452A33C632C0AA47686588752D72B0586FE5EC2464A6DB40662FD2106A19F67DCCC45692FCA03685251D512642B0CEE436C78D94C6F5F25BBCB41FC7E5B1AECD52B846A0B70EAC93579603E9870F942AD4C1CFC9D49B1132777C6F1C184C1537178E5029067257A2DA2827A2EC44D323D13DC6E4E1B9EDF5949D4324228687FD54F02CCC3C4DDA635FA546A5A6783959B1C48AA9D9C9F6381EBCCD979253460857D3CB1C70893EE6F04709E35923883EE3C71C7F33B8CC28B9136B3EBE5F52B9A76817F2F74FDC2F12B459DFF32D5A295BE374B3FE507A0995BCACF1E7B24F4501B29F1E8B4F2A8CB394B3E459A4296F6439BA59EC88305AB045FF40B1DAB4F672F878DE1F9E46B9326CB3E2F3457B83EAD8DEC28DD079AF0E984A69ED882E1CF21036578485DFC2DEBC9CFE82FCE0383B4039D147C4C7E31E315FB57B9093DAA811F4EE4568E32E5625ABE76C5A1AE42A03441DBE766D0EF4DF607406F7D489275E8C5D4470866F9049A4AD5C428B843DEC3702E86E177E4B60181D2B5F099BEBCB25F04C93D087C72436E87A9B3AFCE78FA31E2B892400B5C1071F8AE0F78EF6F7D71859A97C17EC0912D5EA27AFEACE739FCF66F489EC6355A3318F79649881CD6C7E96A881ECC4FF6934C3D10D99F1DFD00592CB037749B025BD4BC2832E206C1407E600FC2170C0BB57E5C7AF0756830C2A6913E2B9C60575CD4A394F2A65C50E40A43CF5EBCA6A8A32335707DDF4633BAC7375DD53E24DF20AF30203B514D3793392E38FA8429B050F58B28CAD0146F385809CC7FAEFF8B71B2BC93D2C6F72E31AE2D07CBB3CB7F43540894E01654EDC71CCF4F361A847EC5B1D23C2D4680E29F0E1F992EDA3AC41ECFE614FC010A2EED1BAD87A7D17468D6FA5356EDB25E9008A9BB328225F85202246816E1A542E1DD746A5FD3E064FAA1248579D31CD3D65F8FFF36F782622402DB328C7850D82D8D8A52B897353A2F8B95624D2D958FC1C3AE6466EACCA2A6A5E6ADD4A582D27E07633CCF697FA02E243A4FBB3DC727B718B5AC0FA6AAB217E241627E69CA46F05ED6B496A739A29EDAEEF76992A507130715BE555C68A7EEAD6E8FF3A378D8F4B7BAFDEE3EDB9EC094440E31BBA717A9C82A117D05EDCA2370003DFABFB2EFB29510466F74E76CECCFC41709FAC4CD8EAA998357170A7A293209EB0BB83DFE5E2F6D73C28D5409C55E95068D647BEC42DB8098F0089EF8A5FC5976BAC421C37DDA6C4227BC1AE5AE229F067515CEA3D794C8D85564AF208AE0FCF836B6C0AF41477F99C8773D9DD1923C5C07E1FD508C7436EA93383797F372EF3103546A5278A4F59614A5D182344F0431D065C35620D63D4D001D7F626993241362E67D1BF41419858EECC2626537D44E2E23619381E96CFA91B3D8054681D298509D9B99E7AA99CF8742E37637B24136F8E1B487E9571E4C24AE5DF307E4C7C62E55C47132AE404B33E5367C6F24D6680BE32D20BC58370145486FD5EACBCF98EB7E7FB6293044067AF11879E91444025FE52E24617269BE192BB71BD9F95356EDBED9DF352AB56A854F9F531889A88689D3F161FE6155C6C1E8011D60A46F59C7D08C477FA652B559A80567076B4EAC29A85D54C66B35D6960DFF75A696CDB17EC9A7B74DC6C3652DAE866E8758170D055C4BF60FA1238448CC9E29160DF50160C4B0DFB36BCA40AF0BC5F7D490E7DBCA49535742EECB90098A0A0FBBBBC7AF25C0CA9BC039DFB555DD8431AF188F7C1D0FF786D627C058A0B9A15F26B58AA2A5992BC8FC5AA14025FF95F294203B45EA081E28F094D0D4AD671C885E67B2E9E800F10048158698D56648F67BFA8CC73DD5AFA15C1E48936B2596DEE34459B484336C20CD77E58BF682479F9AEF2FCDA86E4F3A2FED7046E5A3828A9B3C0DBFFC25FE699F25629A2045A51242E310CB369B730A5E81167758D7FE843261A598E4541B02D0DB4BF5616BA07A440665F7FEA6213114B6B1B38BC033D70E845445DCD18E23D34D3D6F4A52F5F904AC5D8FECA5AF1123658D09613209EE19954174A1AC7A8C7F9EA288BBE5A0705F3CE38F30ED5EE69CF5208D461EFAD51C456507C3729EB338CE15C4C253BE21E81F082B0847C6871CA0FC8B3E80115FE2BB8CD8AFAE69A3C1429D21F149B7446888BB4DCB639819EFEE665B6D6F69E61452B9328B4887A7C04E9949390980A2609A667267035B11BF862C1131533DDAFA518221627E0EE7E4009CD48E4AA9D0753A9AE82AA0257B69D569B4C53F05A75A521B327322C60398DB0947D205D2A33AE51CF2CEA8C9162DD604F8EDBE91F5199D19EFBF9896A46389E7BCBA54B4AA57CBA0D4F9DA117F288133AD01A9A9B2A824D54F74D4172BE2B1E5F0D3DE60C13AA5B668EE6A45397C2E39573EBFABAABA48D1DDB2AB6453FBBAC8DCC05349404889C7DE23A16EAFAC8D5E541457C32CDCE80CBC + +count = 80 +seed = 07CD8F8AB7CD12EA7CC94103B8623D6F0FEA2BAFD2325BF6089DF5351BDBB9A94525C3C6B72D3820F2E4D5F9E7C849F8 +mlen = 2673 +msg = AAFA792BFF719A3B794B2F8198EBD1556889C8C61EE6A51470AC9B274CB162AF44A26E2BA5EA7663C4C78B4B66B322ECACA8F2EBB6A610B51D7C4399F4A64A870C038797CAC80F709CA5C3C9FAFF7D797963E60983B584130C1B99328AADB2D261217CB95A535B8518A78A6D2F6CB8400C2AAA2DAF451391F7B8AB0277A3AF88E1CE6F1D3DBC386CBAFF15308F073D29838692E645F566D4B3DB4186C259BC84606855EA88938CEC4F7211BC9B461E39DFBB9E44CBC273E02D4314A037E0A26D60985EF5A35F069D8B51F86E9B6801CA067AB75565D73581EBBBBD98ECB5AF47509C8729D82EA0B35F0A376EBE6D90108CD61FBD0CEC966C17264F6A87864457F41162FF7210049E6CE2B5354F8F19161E0866D6BC3935815D9267C600DC529521FD092B126EC440D49B8E3A166587657B52AE9E2923644F72876EE94A61D2DB0EF4DAB33ABEC0C47A6A725D4CDABD06D4F6A30BD7C90DB3778C17B7D8CE82A5123B798D8B47C7F3E968C9E9F82A6EB3C2BDD8FC06D282F5CBF3050F6FF71E2EDF7A109F23AB47F427BD75163162C37722BF70A6BBEBEBE8FD9C39152AFEB78C37D718014F739F20BAAD1597B1F9C4E0B59FD82B834D83DAFFC935DE4A3272D7C2454508C07502943E90FDB56128D6E6009ED09CE80A9B60D51AA2E4E162F7F0C362F6886BBCABE29EF6C7F38B742000B9D152FF709082FAFE809C5DC9BCBC6F300B0A7840D0D36F39567D14D8227E7145F7CA670EFE917E0F18B0570DA3E05DDE56883FF12BC0C76C2A1E9FEFFBB728D991769B7D0B0D34853C76FC0655AE200501C28755F57934BB9F46A3C6AB1DD8E0161C698133F4F2D7CAF3392576B4BD2B6F8735D80BCF60656E132442BB7FCFDAE160A2DFE3F3FB8209B5C933201785A7E8206096B84A222A68E62501846273F6A9145820F87F450D12C64FF79A843E897C8394AD54AAF4F3B886FB00A6C37B2EFD0F6D4DD639C9989E7CA30E4F12EEF440946B61D7A28904E1D74009B6D1AEDF2FDA8B5991CB37795A8EE51BBDAAEA34A4C7040944761B9B4B4C12F455C536992A0852F7F07A9AEDA8E522591CB4831B0C79FA977AB6BC49C9730186855986035D2C6E5A6D93DA43E8825753721978AAEB433CE2F2A7D67C1FFEBFEA6F6059474D3022817A7329D9DD0E4A292302E4A57174B9C5346E4B6D75D65882CA7339A48C6E7AF776A8515014A20E4390F6B4F4A19990FA725F5A69B9C3BD4E8BBAEAE49979AC19600A3CEC6DE154985E236C3D0684269974BFC82301AC7196675F618182D7CF15EE5CE3B7ABEE0DEEA5C72F54CAFEF203D556B31327089A0C0DE94F74458CFECB481ADFE3CBB5DA422BD3626B00C4572B4C2BD7584ACD9129A76C616AAE51F944BECC4682AACAFB8E3BB1A42A6A8E5FE7BDEB43305A34A98308EF2D49EDE4F41361446A9AE4DFC1EE13D12821BE0B01E55B865B563633E5A19DFB6425CB60159C147B18A6419F5085C5D0882656ED533EEDF97674D0BABB6CF32F696DEC0F9921CB3DC9E6021FA198D554B1D83C42A0BF214FE4C0431547384F45AED9190CBCF98ED8278E8A03D551FA284C8A26218F0B0B58D99879DB98449CC99B6B399DDDAD9924E6A7EB20A0F1FDAD2F8138BDC7B445BC01503C509066B1603CDA76FE41727AB5E027DCB15032E8F66BFA84544D22C501AA6F62B02C0F8764387163CCADBF1ED7238E7F16C80E6C37AFEC2E10FFB95AB0A39784F9FCCD8AE263758ABE392727E9AD442A44738D77CB61A6B1540ADE751130489015AE5917C927232EED27BBF88481F3CA0C5ED2C31DFA943B2EAD4A8C80B4946E3C138A61BAF43A72C7A25E16874CBAE254D3F14C154F7C60CCF665B566799A01E0F769B60F73C17C840E0018C6FBC10EEDA3E35A77586B3A5936B363B2D5CB25C78A3E3AABBB84F1E64DF47F97AE1645650FE1751A724EA9BF80744D0F33DA6F313A3CC17D8F261585B62A75C167126D899219A26210DC55AB6DB2B94E6993849B4986F988EFB07478D6621CBF4B8ED772E61B0246A5582242FA20339B2D6CB89BA1B9210A318EB4697FD21EFCFD230DE9680514A442A13B29D8CB2627A6970BB97BF09C79C6ED7A27247662B25F39C8D675B0747F1A6D9EBBF7CFA7BC51A7EA3A7307EA4FA2A463BF53A645FE701FBF26628731CBC18636567AE633A49E59F6F049447803FA3D4F1F79F38026DE9B07D8610C9F01BEFB7054AA46E523E001C1EC3A4E7084DE0CCE596DC63D9C1F1DC03F35F9B1918E62ACB2640102E1D520E900969D53E83D2DBDDC80D1DC54BEE99531FAA5A8D2DBF8346C7ED123587353DD63823453DE350545C176446845BB3522A862F5D675419DA901CF7D2D1F7050ABFA3237D42753203BE251B0364379232D2D9D8642D52A60F6F4CB09EF29FA1E6069F97A1175F8447FE98A813CC182E33FFD8B8CAD93BF32A60F1A9E63A79A7F7FB9162783B89BB57F3E73155CED1D0084D5BA967F76C89C61C1A3E944F3B6F78D6CD3D1139A315C5276493481F3FFF9B6A6B40C920EEED9EFC74108C6BBA5A15DA736680A23DB5672C5A32ABDA24B49F2011F44FA8FF9C73609EC195025F0456D753C848DC6296920FC32DDE2174D37BFBCB86CF618AA0D486EE46C5E1EA14A3BAE4952AF5D4837F9B8122A19D1E59B909ACEBA6C849C8B452CD6CEF877A65FD83E6D0C6EE35886688F1D877612CB8E671D83216A1F76693D6A4D6A2EC13EB6CA2005328B3C91F51B352A707EF8180F320D6E1685C1EF4D87E3CB77FA549BC12727E59C11BDF8A9631CC272998253028CECEE8A2914182B90F586D80E7ECE370979BDE683F37123090012AB9243A4C145D6349C2791DC44E54956C5E9B59FAD017D3EA27D85B48A896671A0AC14A73B5AB9145D8BA6AEBF9EA25AC2E8E2C4D16C5009A83D0E84CEB80E95DF2CEC4CBEFC7F5B90A84D408E8C4855F9AA2987D9FC9D8A451F32B367BB1DE5271ED35EA153B5D400A6D8050EE82F519BD930245A96C9727FD24D8B94DC53D4B4F00D03172CD6B7F2BE163B6D16FD6247B01988A6EE6CE7BFEAFF78E983B8DDFBA4242730E52B57876E3719D1F9F6CBCC81620F848D23C31E3FFF7EBF2AFE5011E6466B1889E7EF6281FAF8B18A012CEB96796FCA9B28E78335DFCB85BBEAFAEBB0FA75EE2D0D391CA97E05F0FE43475135B13613206A0D88438F17EC8E604B007AFDCB9FA1378B7CB96675E0B19DC6FB02508E05A7FDAAF09297A3884AA051B6389A52F921F8FF31970FB082DF554226C2613B80CC1ADFF770024D6BF011C0F028A012597AE56F36EB6B3E864D79639810B8BA7258B18192B5CAA80DEA4B140D3C6F1D707ACD2256D676AE90980BA80E10B44109211ABA830EE96E1BBD248315C804D391A86AB7D4B3A4A37FED90D9867DA4B93FC32E79403E5D78AE99AF1CD2ACCE65D4F3384D9CEAB71B1E93B99704C64CAF17B999234361E378B9362D14BE3FD9E6C268013CB1FA2EA8361749D635C0429F796EB15A685E31DFE7A76AE870EBA120331AC830F8C486F6C0C4F07B658EBB9274A463E0EEA101481DD6B58835A303ACE802AE79EBEF51ADD98A67B7FF7968815ACF4504B9D360F7C0120A00ABA1FC558E6CBD8324EC35E0985294563A8D7ECCCCD9E3D1557A09885770836ECCC7AEE0F18B81E30F85D695440B5BCE29945CBF60FF402B281942D38EA33A4B03E9FCBBBEFAAC2C455E8A03FF3F35154132C538EA16F0605EFB788C3CA8435F6D595F776433585094ABC75BA581EC59AF701F66DD6091623E4676D167 +pk = BF2D01BCF11913810C69AB37FBBB14AA852342A04B4A3293E477EE13B8FACA00E0D83D7C8A0D02D9CA91C8D701020A16634BFCB41A1E9C90F80E8BF05E8DAC0304 +sk = BF2D01BCF11913810C69AB37FBBB14AA852342A04B4A3293E477EE13B8FACA00E0D83D7C8A0D02D9CA91C8D701020A16634BFCB41A1E9C90F80E8BF05E8DAC03045DC6BF3B90E4E8072AD0DB8AF89989EDA700000000000000000000000000000064B5D23C40B2DA85C4E7D12845CDD35DC0FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9BE774B30A5022EB9A0E4745D51962ECEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000001A6FE66F0E29681A824536E854844F56214DEE6391DB3C632502E5A9921197008FC84F2325FB51FF83E1092425C767954EE0C96C6F9E6D555F2300ACD776E0008156B5FC1001F9A271266CEF849B89233B1CEF1982AFC6C30345D34A11F76000C257B559AF0838082CBBF9CC2A726C57C8FF4C8EBEAE1937A8E5FEACEC229800 +smlen = 2821 +sm = 489D2841DE72ABF74489EB7AD6F9DEABF29D13A447064F7AEC6954D73092E6019F17AA85C09CB47C79E3FA2482D764ABE76EB323A9414AC6A60C267479FC39000007C5E6BC05F65A7C291EBAD1D1B432492302DAA5031988F8E9D67FBD4F93F561334DDEDEF9B2C68228ED8100613F43C4D7527B55FA01772A440DC437A21335315CB2A46B8C17FCBAC86AE5BFBB95140E030404AAFA792BFF719A3B794B2F8198EBD1556889C8C61EE6A51470AC9B274CB162AF44A26E2BA5EA7663C4C78B4B66B322ECACA8F2EBB6A610B51D7C4399F4A64A870C038797CAC80F709CA5C3C9FAFF7D797963E60983B584130C1B99328AADB2D261217CB95A535B8518A78A6D2F6CB8400C2AAA2DAF451391F7B8AB0277A3AF88E1CE6F1D3DBC386CBAFF15308F073D29838692E645F566D4B3DB4186C259BC84606855EA88938CEC4F7211BC9B461E39DFBB9E44CBC273E02D4314A037E0A26D60985EF5A35F069D8B51F86E9B6801CA067AB75565D73581EBBBBD98ECB5AF47509C8729D82EA0B35F0A376EBE6D90108CD61FBD0CEC966C17264F6A87864457F41162FF7210049E6CE2B5354F8F19161E0866D6BC3935815D9267C600DC529521FD092B126EC440D49B8E3A166587657B52AE9E2923644F72876EE94A61D2DB0EF4DAB33ABEC0C47A6A725D4CDABD06D4F6A30BD7C90DB3778C17B7D8CE82A5123B798D8B47C7F3E968C9E9F82A6EB3C2BDD8FC06D282F5CBF3050F6FF71E2EDF7A109F23AB47F427BD75163162C37722BF70A6BBEBEBE8FD9C39152AFEB78C37D718014F739F20BAAD1597B1F9C4E0B59FD82B834D83DAFFC935DE4A3272D7C2454508C07502943E90FDB56128D6E6009ED09CE80A9B60D51AA2E4E162F7F0C362F6886BBCABE29EF6C7F38B742000B9D152FF709082FAFE809C5DC9BCBC6F300B0A7840D0D36F39567D14D8227E7145F7CA670EFE917E0F18B0570DA3E05DDE56883FF12BC0C76C2A1E9FEFFBB728D991769B7D0B0D34853C76FC0655AE200501C28755F57934BB9F46A3C6AB1DD8E0161C698133F4F2D7CAF3392576B4BD2B6F8735D80BCF60656E132442BB7FCFDAE160A2DFE3F3FB8209B5C933201785A7E8206096B84A222A68E62501846273F6A9145820F87F450D12C64FF79A843E897C8394AD54AAF4F3B886FB00A6C37B2EFD0F6D4DD639C9989E7CA30E4F12EEF440946B61D7A28904E1D74009B6D1AEDF2FDA8B5991CB37795A8EE51BBDAAEA34A4C7040944761B9B4B4C12F455C536992A0852F7F07A9AEDA8E522591CB4831B0C79FA977AB6BC49C9730186855986035D2C6E5A6D93DA43E8825753721978AAEB433CE2F2A7D67C1FFEBFEA6F6059474D3022817A7329D9DD0E4A292302E4A57174B9C5346E4B6D75D65882CA7339A48C6E7AF776A8515014A20E4390F6B4F4A19990FA725F5A69B9C3BD4E8BBAEAE49979AC19600A3CEC6DE154985E236C3D0684269974BFC82301AC7196675F618182D7CF15EE5CE3B7ABEE0DEEA5C72F54CAFEF203D556B31327089A0C0DE94F74458CFECB481ADFE3CBB5DA422BD3626B00C4572B4C2BD7584ACD9129A76C616AAE51F944BECC4682AACAFB8E3BB1A42A6A8E5FE7BDEB43305A34A98308EF2D49EDE4F41361446A9AE4DFC1EE13D12821BE0B01E55B865B563633E5A19DFB6425CB60159C147B18A6419F5085C5D0882656ED533EEDF97674D0BABB6CF32F696DEC0F9921CB3DC9E6021FA198D554B1D83C42A0BF214FE4C0431547384F45AED9190CBCF98ED8278E8A03D551FA284C8A26218F0B0B58D99879DB98449CC99B6B399DDDAD9924E6A7EB20A0F1FDAD2F8138BDC7B445BC01503C509066B1603CDA76FE41727AB5E027DCB15032E8F66BFA84544D22C501AA6F62B02C0F8764387163CCADBF1ED7238E7F16C80E6C37AFEC2E10FFB95AB0A39784F9FCCD8AE263758ABE392727E9AD442A44738D77CB61A6B1540ADE751130489015AE5917C927232EED27BBF88481F3CA0C5ED2C31DFA943B2EAD4A8C80B4946E3C138A61BAF43A72C7A25E16874CBAE254D3F14C154F7C60CCF665B566799A01E0F769B60F73C17C840E0018C6FBC10EEDA3E35A77586B3A5936B363B2D5CB25C78A3E3AABBB84F1E64DF47F97AE1645650FE1751A724EA9BF80744D0F33DA6F313A3CC17D8F261585B62A75C167126D899219A26210DC55AB6DB2B94E6993849B4986F988EFB07478D6621CBF4B8ED772E61B0246A5582242FA20339B2D6CB89BA1B9210A318EB4697FD21EFCFD230DE9680514A442A13B29D8CB2627A6970BB97BF09C79C6ED7A27247662B25F39C8D675B0747F1A6D9EBBF7CFA7BC51A7EA3A7307EA4FA2A463BF53A645FE701FBF26628731CBC18636567AE633A49E59F6F049447803FA3D4F1F79F38026DE9B07D8610C9F01BEFB7054AA46E523E001C1EC3A4E7084DE0CCE596DC63D9C1F1DC03F35F9B1918E62ACB2640102E1D520E900969D53E83D2DBDDC80D1DC54BEE99531FAA5A8D2DBF8346C7ED123587353DD63823453DE350545C176446845BB3522A862F5D675419DA901CF7D2D1F7050ABFA3237D42753203BE251B0364379232D2D9D8642D52A60F6F4CB09EF29FA1E6069F97A1175F8447FE98A813CC182E33FFD8B8CAD93BF32A60F1A9E63A79A7F7FB9162783B89BB57F3E73155CED1D0084D5BA967F76C89C61C1A3E944F3B6F78D6CD3D1139A315C5276493481F3FFF9B6A6B40C920EEED9EFC74108C6BBA5A15DA736680A23DB5672C5A32ABDA24B49F2011F44FA8FF9C73609EC195025F0456D753C848DC6296920FC32DDE2174D37BFBCB86CF618AA0D486EE46C5E1EA14A3BAE4952AF5D4837F9B8122A19D1E59B909ACEBA6C849C8B452CD6CEF877A65FD83E6D0C6EE35886688F1D877612CB8E671D83216A1F76693D6A4D6A2EC13EB6CA2005328B3C91F51B352A707EF8180F320D6E1685C1EF4D87E3CB77FA549BC12727E59C11BDF8A9631CC272998253028CECEE8A2914182B90F586D80E7ECE370979BDE683F37123090012AB9243A4C145D6349C2791DC44E54956C5E9B59FAD017D3EA27D85B48A896671A0AC14A73B5AB9145D8BA6AEBF9EA25AC2E8E2C4D16C5009A83D0E84CEB80E95DF2CEC4CBEFC7F5B90A84D408E8C4855F9AA2987D9FC9D8A451F32B367BB1DE5271ED35EA153B5D400A6D8050EE82F519BD930245A96C9727FD24D8B94DC53D4B4F00D03172CD6B7F2BE163B6D16FD6247B01988A6EE6CE7BFEAFF78E983B8DDFBA4242730E52B57876E3719D1F9F6CBCC81620F848D23C31E3FFF7EBF2AFE5011E6466B1889E7EF6281FAF8B18A012CEB96796FCA9B28E78335DFCB85BBEAFAEBB0FA75EE2D0D391CA97E05F0FE43475135B13613206A0D88438F17EC8E604B007AFDCB9FA1378B7CB96675E0B19DC6FB02508E05A7FDAAF09297A3884AA051B6389A52F921F8FF31970FB082DF554226C2613B80CC1ADFF770024D6BF011C0F028A012597AE56F36EB6B3E864D79639810B8BA7258B18192B5CAA80DEA4B140D3C6F1D707ACD2256D676AE90980BA80E10B44109211ABA830EE96E1BBD248315C804D391A86AB7D4B3A4A37FED90D9867DA4B93FC32E79403E5D78AE99AF1CD2ACCE65D4F3384D9CEAB71B1E93B99704C64CAF17B999234361E378B9362D14BE3FD9E6C268013CB1FA2EA8361749D635C0429F796EB15A685E31DFE7A76AE870EBA120331AC830F8C486F6C0C4F07B658EBB9274A463E0EEA101481DD6B58835A303ACE802AE79EBEF51ADD98A67B7FF7968815ACF4504B9D360F7C0120A00ABA1FC558E6CBD8324EC35E0985294563A8D7ECCCCD9E3D1557A09885770836ECCC7AEE0F18B81E30F85D695440B5BCE29945CBF60FF402B281942D38EA33A4B03E9FCBBBEFAAC2C455E8A03FF3F35154132C538EA16F0605EFB788C3CA8435F6D595F776433585094ABC75BA581EC59AF701F66DD6091623E4676D167 + +count = 81 +seed = 3D598F7C498D8A1095C40945975380554BEF6142578638A7627E2C0A21C59C579F8E8CDA309348FC54C764C899FB93E9 +mlen = 2706 +msg = 63EC08B711DDF5C66036A13F574BB7BE76445A1D1F83C7732B9F4C25FB9E799D4AFA55817BCB39B974AF92F3730767CE7D863B6A3406450DCBC5E0145D10B7D532DA6E80196157C38D1B6D3C173F74D67AD8DF24ECAD4D9B59921418863A38270B982C4392225EDD1845AED2199E2C38B36C7E0E5D2F3CC7F6803926D977C59ECDAC67CA290658E72BAD633358FCDDE2A4B9C40169A0C7CCCFDD93E4DA3C3838E9308533BD468A9128C5A141C4842840E45BC8E4610A7C5E7535834C5EC73312A50197C76AE984B3521883F549BE04E27D97580E6D85D0EE84CD0B8C65BFB1AA005C607DE82DA70021F8F90B7912C67DC5657E1882CFA6DA3DE1BA4ED823789C052649DEBC9085C74528162243133A6AE5C1C6BCA3F730525B167D816485E40C208AFFA8706E3D74631EB4413032730A7647548B77579323EB03D36C2EC37D2389D4A17305F607C78F3073A2F4B4395BBC94AF163ACBE3C990306BA3F89AF9AFFE785C3F6D102FB2BD55F0C1044034D6A871293B31A1B38E383CB926BAF3AB4B5F79A47E9FA7B77BCD58AA35A7F16DDD11FF642069A8A327DFA800049BABAAB4AFBEEC9FA98ADB9796FBEE925BB70EE9E96540436E1473E3AE4C56D7099D8DBDDE755A7E101BCCEB596B9415F52374C8A3A73EC66B229DFD8CD7EE7D2CF1C5E7F490C7D9381D9321B15F84F640017851ECED1DC80D32DA3A0A57ADC3EF37E021031866E278C7D51FF5CA8E9ECEA1082423B41D772C5ADC61A8C71C3D4CAAAA3433928D7931EE715875BDE2BFACAA0A7F799B45241C21BD2ECE4A5944FB6890BF24908DE58DD3C76173373254A36B0B2AC7D67926948CC0136DD9A5079D776C297FB6A585C290D5DAE1C45E91153299EEDB731E527F0F62E83C1E93C75FC74F9C7E63311562B0A55459A0D41E034C3AF637EB29BC789E5920DAADF265F42F2707DD1AD490B5F8A8D24A9968BFF11A0C364A779EC385A9A33EDB9CFC7DBC672BA60CE5F421B40634270B982D619F8E7960D32E1B8A76CECD13A3B0214DD34214CB5BB7FD530058D5DE1FB9E4E88ADCA05926CE1F5597100F55DCBF64D47FC177FF87C4BD9F6ED7670FA7B7D339EDCCE6FC1EAE069E0C303138689DDFD23396C145B79AFCF68125989C8477BFC318CDBD69D1AA6D3EE41F4B1F9BE4BE9FA58A072412078CB9196556EE56FB7B2A2761DD04120FCD9AE9736F599C8B96BF8F964B305530A6DF1F94874F36F07962F87ACC0B285EDA64D2E4857E26BED40E9A5DC0327F1D91259292C608D6C6D59804DC23A34D1F9F1B69331D68771E41542FC5D669CBC3CD7F8310F87E8FE8F6201E57B475DE2318EA6EF9F7D32A728A44334CC9DF28DF77038C37CBA62EA8CC5EE80E571879AD111F35B6A154FDF8D40FC93360D547D02F0743A37EBC4AF178C6CE36C92CE6B80B6350202D2978621684A19AFE1474155BB962014587B1F5A477092F42BC446D7811C0EB439A6829E538077ABBBF03F515F1E6AC018EFB05AF79069C2569D2CD7140C4B1B47886064DAC695D59FDE2D8FDDB35318D33EDAD94AD4FD988095B1156FD59551F0658EE666186369BFA84E30672E4659BFBF7963C377F0039E08DE2C2D9803FC12D97B5E67CE9536AF12DAEB3B9903D8D95F336FF53286284BFE8D7AD13EC21C2A9BA93C9A97BD7F6148DE7C8CB41CA75A9ECC8F9CC68D888FAF6B3E75376B5B16F41E7E6B76A686EB365365E2074FB1D7EFB1B285A2357B020FD3E47B89943FBC1596F3FA8289AD844386A691F33DAED4B7A6A6729526160F2D32BA7F68AE6678564FCA05BD811F208A8FA62F6731F23D46027008246FD4BF3C454A39EE225245E74DA5910E7937B36661548A55A2270A9D27114DDC94DD9B9D4122289DF0A5700222A977F15FD8E36AFA1C4870BD3CE9B658E2D83882AAC5F3DB814346240FF8C8FBA3F36E52AC9B441C76B6F104A0931BC45E202ADDCACCFB93A486A7734A6D82B9F6CA911448F988626846D413D987C5AC860FCC0D5F734269AEF88D41A055794DCE832BABB7E306F622E5EAEFDBE1CF195E320A1ACEB4834B3E70061EC2D624C12EB35B16E5AAE73053A3290D4BB1F51FFDF48C1A7218D365DB7FEC15BF0F710954CDEC54917600014BDE3A901DAB1DEC0844D7FF148EDED9788CC85C0CFF26E5895D91C56BA6950C0BA8FC6C773AB4A6091A5DE3AC335DDC2110EB0144FD89B3D815EF4A26F718C1ACB5723AF1DA5515442A03CFB9D90623FB21D78DAF441000E285E9E7C235C0F31E258E6B3FEAC048DB652B83E07848D2E9357649372B1A55975B2EC7FCFED19D0B6613BFDBB4B5B01A9AA3128AE137BDC1D8FFC3A38B597578042CF183BA8383C289C3D92F6B70AA9B3364E9FC5D43F3CD3F310D229912E91D5806C2A11E0BDD208A2AF438BE77B43680E2DE67918FD414338A763910E1316965BF96BBF7DF639266D075E90EE9C073011F6783750764FBE4906ECDD94EE9FB7E4AEDB23EE88EBFB018C44FC8BAFC66E6B454A3D0E332C7A6B34C2E8D1D26416FF43D768CC36CA9D3168355F1A281A6B2EAAEAC7B64AABBAD2156A1D781A78A896248C56F3491A5DDA8C22C231AA7AE14BD558F66E6280FA65F20B246D815BFF1D3C6CEE6DF9B4AA7F750307A7BF73850E6BCD22CA0AD74B4AFC13CD4AA2FB7E7B588ADB3A46A23EC88A34F13214B261A283AE8FBCE8007C6EF6BE255C33218AEBECD3EC27EDAFD252994B70BD67407620D26E8567F4C7F6D636803B6A27EACC3B853706A8D57ADBF7F7E142FF149C35119A6172D5884EDE7C71E6C34D1B485A684DD56C9D670576B75CACB870A68EA7FF2BB461D9E2FDBF500B2F200110265A3CF24370A3F480DA66F98FB5327B4CD796EAF0E559A5519F3C643B59E3B89D05D2A9F9DA6732CDC2996408B7FAB5A734310FCD73FA3FA5CACAF31AB04EC0B9734407C6DC575350212239AC9092DA5812137BFC40F7735BFDF9827F768FC0363FC8C5739C7DF828075EA2BBE6321D5A8EA2EB7E397C3D58A953C7F0BAA69A96AC8110B125EE2E9701F43EEB87FDF58A6E6266BE1136437599E26E8E6E853DBB6ED9DF3931C5F402FD09B7E203AB36EAA6EEAE72E908BD2B9CFD379BC9B407F0C882807BBD2E91F920EB24137002A48F1AAA0CBDF89FDE5C51079F1D8CF7A014207F1B40773321AD952D77CE18EC7B48F2CA054E65420C1132AB67C832EE22FFD8672803CCE3DE7E9FD0690E55FA1AF5F11611E3E2C71CED55E3E347F4CBEB9C93BEC2B98E48495585392471AF0AE589257ED8D01792112C798BCA5107030F207CE567594B8433490D8FF1811F21B03A42AD0678927183321355E3D6908DC1125CDCE038CD0469D72458B6CC5E67EB0D78C20819C6F3C4518B15CC63754FF8679915E329DD46FEAEFDA5249ED7E754E7BD55C75CB764B6CC36BC06267B2479CAFBB3F0BAE32A93558190B65C85DCDC080CD56D51D4105C5B0717691D4DB1893EF8AD550F55855B4123A38D18FD67B588A3A4C2A6604E874D721359352B235C17AB1DA2758712AF8179FF433211B93078735F909F985F557D0DE52CB9203DDC67BF9DC8632ACD8D4F90196AF6BD2E79834371C5E9FDF5992ADB04AEA186AF36F56271F763ACFFBF94DF4B0512CA6B7CA8FF486504E565BDA367E044FCD0F25FBC2A6C720867F95BFD92109780D2E6DD60CE90A4CA8EEB8C4CAB289DCF99E687B017B37695C3B99B4FE97D7E5D52BB9813C04D03C9AD71770FE0986C7F3A3FFD3A261AC771DE88C7ACDEF253E5CE2B50BC5C576D132B68CCC694BA883770B80F5ED7D527CEE816527F69CA2C101747A0088879C3663037DB5B +pk = 808C9A7F20062FBEB28D7F7F1962A7CD9F8D6D424FE85D485E44115627D109026BFE17167CA0CED9E2DD320228ABAAAB4F5B486B088631F0B7301591E951E40204 +sk = 808C9A7F20062FBEB28D7F7F1962A7CD9F8D6D424FE85D485E44115627D109026BFE17167CA0CED9E2DD320228ABAAAB4F5B486B088631F0B7301591E951E40204F1877D49FA3D7085A70AD51F1684A50AA7000000000000000000000000000000E4EE58E8CD04D03056691A0589A5AE0279FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB8526880DED1C3636CBC1D20E22165F03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000005DF61593A8C26008820DB5B24CA77AC8C59B8FB002BE77F8339BDE267CA59D005F9593B5CE25CC3E5F896407BDE5425F7309244340EC9D38F79D5F6CA92AB40054F562DCEA5F97287049B4C125387217198F4F5927535C4E55C339FD7643150099EAF0E40EABB7A3679F7DBA9826611D5A0984068A7474FED1C97BC8D25C6300 +smlen = 2854 +sm = 94DD05F069DD6E81DCCB6E1535E9C139429BD72B3CBA9AD44CB88ACFAD23EE008816C686A457FEA02C2F3F152A8108D9A6B31FD6DB565EDB8134375E7AF338040102151AA4E2910E741A8F21A2EA469B6E1F6EE0132F02F58BFE83483854A83F547EBDDB0E1FD00956B219CE3C2CBB892C0E1A0D45BB89F6279B3D517349E1EBDC100D37E6B0989B72A510D023047F616E010B1163EC08B711DDF5C66036A13F574BB7BE76445A1D1F83C7732B9F4C25FB9E799D4AFA55817BCB39B974AF92F3730767CE7D863B6A3406450DCBC5E0145D10B7D532DA6E80196157C38D1B6D3C173F74D67AD8DF24ECAD4D9B59921418863A38270B982C4392225EDD1845AED2199E2C38B36C7E0E5D2F3CC7F6803926D977C59ECDAC67CA290658E72BAD633358FCDDE2A4B9C40169A0C7CCCFDD93E4DA3C3838E9308533BD468A9128C5A141C4842840E45BC8E4610A7C5E7535834C5EC73312A50197C76AE984B3521883F549BE04E27D97580E6D85D0EE84CD0B8C65BFB1AA005C607DE82DA70021F8F90B7912C67DC5657E1882CFA6DA3DE1BA4ED823789C052649DEBC9085C74528162243133A6AE5C1C6BCA3F730525B167D816485E40C208AFFA8706E3D74631EB4413032730A7647548B77579323EB03D36C2EC37D2389D4A17305F607C78F3073A2F4B4395BBC94AF163ACBE3C990306BA3F89AF9AFFE785C3F6D102FB2BD55F0C1044034D6A871293B31A1B38E383CB926BAF3AB4B5F79A47E9FA7B77BCD58AA35A7F16DDD11FF642069A8A327DFA800049BABAAB4AFBEEC9FA98ADB9796FBEE925BB70EE9E96540436E1473E3AE4C56D7099D8DBDDE755A7E101BCCEB596B9415F52374C8A3A73EC66B229DFD8CD7EE7D2CF1C5E7F490C7D9381D9321B15F84F640017851ECED1DC80D32DA3A0A57ADC3EF37E021031866E278C7D51FF5CA8E9ECEA1082423B41D772C5ADC61A8C71C3D4CAAAA3433928D7931EE715875BDE2BFACAA0A7F799B45241C21BD2ECE4A5944FB6890BF24908DE58DD3C76173373254A36B0B2AC7D67926948CC0136DD9A5079D776C297FB6A585C290D5DAE1C45E91153299EEDB731E527F0F62E83C1E93C75FC74F9C7E63311562B0A55459A0D41E034C3AF637EB29BC789E5920DAADF265F42F2707DD1AD490B5F8A8D24A9968BFF11A0C364A779EC385A9A33EDB9CFC7DBC672BA60CE5F421B40634270B982D619F8E7960D32E1B8A76CECD13A3B0214DD34214CB5BB7FD530058D5DE1FB9E4E88ADCA05926CE1F5597100F55DCBF64D47FC177FF87C4BD9F6ED7670FA7B7D339EDCCE6FC1EAE069E0C303138689DDFD23396C145B79AFCF68125989C8477BFC318CDBD69D1AA6D3EE41F4B1F9BE4BE9FA58A072412078CB9196556EE56FB7B2A2761DD04120FCD9AE9736F599C8B96BF8F964B305530A6DF1F94874F36F07962F87ACC0B285EDA64D2E4857E26BED40E9A5DC0327F1D91259292C608D6C6D59804DC23A34D1F9F1B69331D68771E41542FC5D669CBC3CD7F8310F87E8FE8F6201E57B475DE2318EA6EF9F7D32A728A44334CC9DF28DF77038C37CBA62EA8CC5EE80E571879AD111F35B6A154FDF8D40FC93360D547D02F0743A37EBC4AF178C6CE36C92CE6B80B6350202D2978621684A19AFE1474155BB962014587B1F5A477092F42BC446D7811C0EB439A6829E538077ABBBF03F515F1E6AC018EFB05AF79069C2569D2CD7140C4B1B47886064DAC695D59FDE2D8FDDB35318D33EDAD94AD4FD988095B1156FD59551F0658EE666186369BFA84E30672E4659BFBF7963C377F0039E08DE2C2D9803FC12D97B5E67CE9536AF12DAEB3B9903D8D95F336FF53286284BFE8D7AD13EC21C2A9BA93C9A97BD7F6148DE7C8CB41CA75A9ECC8F9CC68D888FAF6B3E75376B5B16F41E7E6B76A686EB365365E2074FB1D7EFB1B285A2357B020FD3E47B89943FBC1596F3FA8289AD844386A691F33DAED4B7A6A6729526160F2D32BA7F68AE6678564FCA05BD811F208A8FA62F6731F23D46027008246FD4BF3C454A39EE225245E74DA5910E7937B36661548A55A2270A9D27114DDC94DD9B9D4122289DF0A5700222A977F15FD8E36AFA1C4870BD3CE9B658E2D83882AAC5F3DB814346240FF8C8FBA3F36E52AC9B441C76B6F104A0931BC45E202ADDCACCFB93A486A7734A6D82B9F6CA911448F988626846D413D987C5AC860FCC0D5F734269AEF88D41A055794DCE832BABB7E306F622E5EAEFDBE1CF195E320A1ACEB4834B3E70061EC2D624C12EB35B16E5AAE73053A3290D4BB1F51FFDF48C1A7218D365DB7FEC15BF0F710954CDEC54917600014BDE3A901DAB1DEC0844D7FF148EDED9788CC85C0CFF26E5895D91C56BA6950C0BA8FC6C773AB4A6091A5DE3AC335DDC2110EB0144FD89B3D815EF4A26F718C1ACB5723AF1DA5515442A03CFB9D90623FB21D78DAF441000E285E9E7C235C0F31E258E6B3FEAC048DB652B83E07848D2E9357649372B1A55975B2EC7FCFED19D0B6613BFDBB4B5B01A9AA3128AE137BDC1D8FFC3A38B597578042CF183BA8383C289C3D92F6B70AA9B3364E9FC5D43F3CD3F310D229912E91D5806C2A11E0BDD208A2AF438BE77B43680E2DE67918FD414338A763910E1316965BF96BBF7DF639266D075E90EE9C073011F6783750764FBE4906ECDD94EE9FB7E4AEDB23EE88EBFB018C44FC8BAFC66E6B454A3D0E332C7A6B34C2E8D1D26416FF43D768CC36CA9D3168355F1A281A6B2EAAEAC7B64AABBAD2156A1D781A78A896248C56F3491A5DDA8C22C231AA7AE14BD558F66E6280FA65F20B246D815BFF1D3C6CEE6DF9B4AA7F750307A7BF73850E6BCD22CA0AD74B4AFC13CD4AA2FB7E7B588ADB3A46A23EC88A34F13214B261A283AE8FBCE8007C6EF6BE255C33218AEBECD3EC27EDAFD252994B70BD67407620D26E8567F4C7F6D636803B6A27EACC3B853706A8D57ADBF7F7E142FF149C35119A6172D5884EDE7C71E6C34D1B485A684DD56C9D670576B75CACB870A68EA7FF2BB461D9E2FDBF500B2F200110265A3CF24370A3F480DA66F98FB5327B4CD796EAF0E559A5519F3C643B59E3B89D05D2A9F9DA6732CDC2996408B7FAB5A734310FCD73FA3FA5CACAF31AB04EC0B9734407C6DC575350212239AC9092DA5812137BFC40F7735BFDF9827F768FC0363FC8C5739C7DF828075EA2BBE6321D5A8EA2EB7E397C3D58A953C7F0BAA69A96AC8110B125EE2E9701F43EEB87FDF58A6E6266BE1136437599E26E8E6E853DBB6ED9DF3931C5F402FD09B7E203AB36EAA6EEAE72E908BD2B9CFD379BC9B407F0C882807BBD2E91F920EB24137002A48F1AAA0CBDF89FDE5C51079F1D8CF7A014207F1B40773321AD952D77CE18EC7B48F2CA054E65420C1132AB67C832EE22FFD8672803CCE3DE7E9FD0690E55FA1AF5F11611E3E2C71CED55E3E347F4CBEB9C93BEC2B98E48495585392471AF0AE589257ED8D01792112C798BCA5107030F207CE567594B8433490D8FF1811F21B03A42AD0678927183321355E3D6908DC1125CDCE038CD0469D72458B6CC5E67EB0D78C20819C6F3C4518B15CC63754FF8679915E329DD46FEAEFDA5249ED7E754E7BD55C75CB764B6CC36BC06267B2479CAFBB3F0BAE32A93558190B65C85DCDC080CD56D51D4105C5B0717691D4DB1893EF8AD550F55855B4123A38D18FD67B588A3A4C2A6604E874D721359352B235C17AB1DA2758712AF8179FF433211B93078735F909F985F557D0DE52CB9203DDC67BF9DC8632ACD8D4F90196AF6BD2E79834371C5E9FDF5992ADB04AEA186AF36F56271F763ACFFBF94DF4B0512CA6B7CA8FF486504E565BDA367E044FCD0F25FBC2A6C720867F95BFD92109780D2E6DD60CE90A4CA8EEB8C4CAB289DCF99E687B017B37695C3B99B4FE97D7E5D52BB9813C04D03C9AD71770FE0986C7F3A3FFD3A261AC771DE88C7ACDEF253E5CE2B50BC5C576D132B68CCC694BA883770B80F5ED7D527CEE816527F69CA2C101747A0088879C3663037DB5B + +count = 82 +seed = 6CDB757AD36DF99E52F535C2680431D5FF36C812D8EA19399F666F2FDD66D3A842A7A5AE1038359AB618FA58A0A6E840 +mlen = 2739 +msg = 7785A08A3892C97D5EBFE52475298BA444674086D63E17E1FAEC96F6B10723447FC1B8CC758D1724A33E26518798183A4B3C99A7DA54038B86473DFAB8E626EB3BF54DE5581E04450B2821F5020C466505990B173DB9F030CFCFA505AA04B37CF0A063876843A042F17AEB1728787187428F8D1010D532C94C7AB2E1193994BFF0CB56415FCD2A96BE7F7FC2C57C8313E795367A22B6A17CE3B803083A74FDBCF030D91C957128099D6199686F2BEA618CEE111AA9D55A6F9E8966C102D849ADE596A1B576924DE0E92DD91FBB01CD93E24AA71EEF219A78430D84965672FE6AF091D46DCFA9AB906F6240913C1286EE0A152666ECFE2C154CD3FB14DC0F9C173E30FC9958A75AA6DD74822AF7ACAD243FDFB743E47E48280990C2870904EF1C902261D0BD6BCFDA91412BDEE9A28C628F218E7648AA0027D918B48EF30A9B18390331805C6739BF6A2CB69A0DE8766A7B3A448910D181F6449565A363430BA1C0FA8B11E1A151F6CEFA3870C3B1D8CD800983EBD41B48C5624269EFB440DF23FF9BCB31A4B02F6505DC862B2103F76137FC6560F893577BC3FCE92ADA27F291305F2345AC82A846854F172131B042735D4B76C6AB2DCFD32BB6258B23AC790AF2AF7624451172FA7A29E0C5FDB3DC3B719B274B2838FF7A8B25F272AC8EA90FA3C8010AC7F65633EB43FF7A0A95CE99717F35D3C416B0E0DA30470B5AA20EB9E2B66315B9407A4753DF8BF505B8066C5D57EC4CCDD2236B9C58BD7337925191ED7B75B92C9CEE626F13EADDECB07173C8160540FB9F6A4D43A1E9AB263B300C08966C247514647DFAB3B420202529E963A51F8D23BD0F689BBC4D67D5A603B876E8CD3EC0770F0D9694DFC30083991CF3989DB1812B4AC5452358075534190F012F7C0E47734C3BA748E04910783C0B845484461DCEA67A1EC731354B902557486B484F67183FC711D10F906C68CD01F46481D040F084271DD784E5B958AE05B65BF5D207EFBB5FDEB25366D6FF4161CA3A1CB71B2B9F90F86A315D800935AC0086D85D907A036C4333EA347000A0755550B68FE3DD7686E416483781B563680146697D6FAE8333C24ADC8A2436852DDADF6061E2B16FD3829C0B55C2E9C2C89F64CB8DA02A6706498CF0330742083E9AC4593A1762D32DC4E6CC2D9F4310014FB15DEBBEA324EBC2EA1E1660782559B9B39FBCF34C85FDA9AD350D195AD7587AAB621EF7FFB63277CE35AB43B01977C9F8DD6C2AE7B34FA7B35D5FA37D8B3719E736F18734CB3A2468BE9CA0832DDE0B958925A377FE6751C4EB8FF1AD295355302F0A5ED4E8F8C33FD5162542B8ED7CD985DBE3C84401830F6A7EB9D955EC74C7F98B02388B4E1353317CDB5EADAAC9025038CC01F8655C7FB9AEE940FC4B282748B39D277A7FEF462038833A9A8EB50A8719F68B3E858825911F294A80FAEDE9D4C1815844C2632DD20387950003DAB80B1A58E541A5E6658AF7D4CDD91FD1C08735B584F5C69C5CA94F6B7F97A4761B127DB394AC72E902DB9EB4B3E0B884C448FF2763FF9ADD530753263688CF92BB746181C17294BFFC2A0B3969A7BBA429A481C425B24745CEAD66286F5DF04F1E4421C56ACAA668E87BA58E3B07A062D1DA60CC6B411667BDE6F466B72C9169965BC7781DA78A818F779A9B3D7A577F71A1DF49AAC865A0D6F2668CFD2C77CFA8D306A14DBBDE4D3A3818B07DC89D5F51E117F7BFD007D60F32BB1B6BB01E76862398371FB91E0A3D4B39FD9146C47F627A066618CF83C32E5C82592B418BD2F5DCD8D42234625974F988A6F729C60BA5EAF18C77B611DFB187A581E3A10268A965F650FE242CE2FE08AA71515B59A6EDFC9CBDAE22DF3AEB22E773CC2EB373619E9CDA23C236CA3F7845C2136E93849D9F6AA1477F4513358CD8CB4E21444C9E5709818801EADFCA23F2C23DDFD5B4EBB6089DAEDD14A21EBF3F7A8C1C80BBF7D37973BD156AC5C4462D29DCCB7EEFFA22A8B6CE433B600532F33999ADC39196F01230614767285089FB262D8469DC66D24AE0B77FD05C3EC02FBC5EE328319409B8E2D7B0AC6801C1C8BA86F793C2037C71E2A25F114E9EE0EDB3B83076EABFDAFEDEFA0548DAE91E62CB7C29C03413235B8C6EB9F46BE29DE8F5D30E8D97DB6F45687DC4719B1024E48B7DFFD0D2B474B2032B4E69B6382E603D4777F3450E2E467C6D9AB2782C0AE266C320D36BF67BD6B86EA9721B22741684D9C0CCC774335430071A5410C1E34B4BC1A823A93A38F5AB4781CC593B13A593867FB634C0C705107CD278C6CCEE6D842748BFBD2FFD205C6BDFB3AC87F693C25C832C86D96B00BBA0AF88DCFBC8CA4328765DE27FBF1389C4EDE28317BD0EE447F030990E957D223A5EC66CED9D16400AF6DA8663C4E4111B4584F8F0066CDF8258D90C5D7B439503E3AB3FCC55FDF933E06D704416187AAF86E6C39695DEA8B8189EC1299670BE03B6A636889CB7F10F04CCD67278E77886CF3F6E2A05BA8D25AB8664EA817642ACF5DB4D9B3EF80E169463EDB6BFDF67172E88D233609B091BBD085B970DB8AE0DAA5048CA42D6A54042F42445BAB03F9BF1ACCEF341B7349109BA0073D3715A9073AD9BED258268AEE9DD5202E0EDFA5720A317EA5CB41706C0D235465BECDC8E3FF0D628EE5EEA6AAF1BBD3E18FE9217516893DF115E979C4CFFEC494988B6F9B86026610898C44AB1547C5F8ED5CBF3C3A837DDB6A444BD3E803E1824E6AB931310FE86B36587F1B34B0B48D358F4B97E9774213DE7D92571380BE2199E703119C5B9836DADFC826B71D588250AC37DE0EC05C5823573C102BCE44C9F044507671C4E1723950A3C0E14968CBABBFEEB049EB723DB9B23CDF0273525C29CC5165530A1F1CF830D3551DD6BDED53954947D5C334DC9C71907CDBFA109EBC52D6305477C14159257AF8C51C6F09D76FC0085C3D969EC60FB09145E66A8A7489611DB3FDEFC35202B8AAE82D3CDF666034BEFF49FE49A45C5EC438F4118F338545532CED916DE78E3BF82B4E55907474386B9C172F393EFE895334F7323CBB2AA7CE7718BEF5E7A23AF734BD4963FBC7889AA5C50F3955B904B5E577D71B21A293D766865E3F8C212DE5EA084A9D22748A8009A7D1858328A1BDF7BA0F4E3B83BE9707629252B3339CEF796696855A574B4A4896CA68C3D6A6824E3F593069EC0A571E61282F8A29BEB8BD788F7B351A8939CDAD9E257587A77804F2704F49DB3305514B85B449AEE56EE40CB2A75D51690194284AACD0855B02893F8DCD3091629DC548705A1085E5CC33DE7726A0F521C149003DF380ABDAE96BCDA55C44BF9BFA1103150F049563E848A8750625DCFDD9BFE02E1E57489B5B3AA28BEAA80F4DAA562DEABB4BB6A27125369415885020D237A92CCC3A23593FE2183225BFA2FF39B0BEF9CB0425375E256BCD572175483F713BD38F937F2B3D4C1F686C5AF60061E0B05CC3EBAAB0AE8BA21E47A8318BEE4A01516046363D152936A1344E17A65E08030522EC667233145A56001B8D065DC2FED0D2A9F02C981A8962F984916314805DAB644A5112CAA1564895121D8B1FD046F547BE282CF979752883EC79AF70CF59A88D960F3336F0AE61357877AAAA34699A876144B65CA5B77A684D850D09B3D42CDBFC4539EA103F8377CFE5F9E5432403FAB416662C4C83226191EEB7F82B01E0819C081FC40E7B978669C7856067E8B582832DD0B92588103C2616BA2C7774C46840318CA2B1A3798FF7ED9FEC087F01798EA2445B92E67E2446126A7406E82FF8D3711311BE16E9171531A95C966E6BEFEA34938E6F5FA660F7C7CB533A119377F1D26AE6AE51D805AB96A64C8B80D6EE137F634B384C2E377 +pk = 4ED4647F38F5FD07C424B96FE67803DD890DBEAA998A8AF49D01E0B63A60B400561A3C30E9DEC1D8162B88A11B3EDA95B63AD9E509293A2297F5E6BAD0D3920302 +sk = 4ED4647F38F5FD07C424B96FE67803DD890DBEAA998A8AF49D01E0B63A60B400561A3C30E9DEC1D8162B88A11B3EDA95B63AD9E509293A2297F5E6BAD0D3920302A1DC63ACCE836912FCD4288003D284322D020000000000000000000000000000B499B050308E946126B253BFFB67BFDC01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3C961BB2FC0E09E00042430DF95F8127EFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000BADF4A36AC239F6D5CB8007D938CC50FEE0FD9B4710CF1F7DD33D223BB0C880081A10409827422B45E1B080A05BCAF1FC4810889B00DB0C1B37DB80DA9CDDD00AD3E6F160EBDAF3075F760D24AA7782AA2EE6556CFE34EEB537191D5E6080400F9881E64101B1A9BC1DFD23699BDD3482B63E7BD08D4DC464DD8CE6241129800 +smlen = 2887 +sm = EE2E79ACA3009956B62859B0F6EB2D313BD7D2A44D003FE50A4DF69FB0FF5703CAAA3CEC67C85CE2DC617116A5C1161AD826748EACC766D895ED322C0C2681030001518F74BED5A867812AB2F62E5168E9BEAD61A6282F816B47D465A87E1BED7235660402FFBF63F9661BD1DD433ACE527FF8BE38A15AA49BD3B9CE1D27AD6576F7977B69A3D80E7DD038384634617B510311027785A08A3892C97D5EBFE52475298BA444674086D63E17E1FAEC96F6B10723447FC1B8CC758D1724A33E26518798183A4B3C99A7DA54038B86473DFAB8E626EB3BF54DE5581E04450B2821F5020C466505990B173DB9F030CFCFA505AA04B37CF0A063876843A042F17AEB1728787187428F8D1010D532C94C7AB2E1193994BFF0CB56415FCD2A96BE7F7FC2C57C8313E795367A22B6A17CE3B803083A74FDBCF030D91C957128099D6199686F2BEA618CEE111AA9D55A6F9E8966C102D849ADE596A1B576924DE0E92DD91FBB01CD93E24AA71EEF219A78430D84965672FE6AF091D46DCFA9AB906F6240913C1286EE0A152666ECFE2C154CD3FB14DC0F9C173E30FC9958A75AA6DD74822AF7ACAD243FDFB743E47E48280990C2870904EF1C902261D0BD6BCFDA91412BDEE9A28C628F218E7648AA0027D918B48EF30A9B18390331805C6739BF6A2CB69A0DE8766A7B3A448910D181F6449565A363430BA1C0FA8B11E1A151F6CEFA3870C3B1D8CD800983EBD41B48C5624269EFB440DF23FF9BCB31A4B02F6505DC862B2103F76137FC6560F893577BC3FCE92ADA27F291305F2345AC82A846854F172131B042735D4B76C6AB2DCFD32BB6258B23AC790AF2AF7624451172FA7A29E0C5FDB3DC3B719B274B2838FF7A8B25F272AC8EA90FA3C8010AC7F65633EB43FF7A0A95CE99717F35D3C416B0E0DA30470B5AA20EB9E2B66315B9407A4753DF8BF505B8066C5D57EC4CCDD2236B9C58BD7337925191ED7B75B92C9CEE626F13EADDECB07173C8160540FB9F6A4D43A1E9AB263B300C08966C247514647DFAB3B420202529E963A51F8D23BD0F689BBC4D67D5A603B876E8CD3EC0770F0D9694DFC30083991CF3989DB1812B4AC5452358075534190F012F7C0E47734C3BA748E04910783C0B845484461DCEA67A1EC731354B902557486B484F67183FC711D10F906C68CD01F46481D040F084271DD784E5B958AE05B65BF5D207EFBB5FDEB25366D6FF4161CA3A1CB71B2B9F90F86A315D800935AC0086D85D907A036C4333EA347000A0755550B68FE3DD7686E416483781B563680146697D6FAE8333C24ADC8A2436852DDADF6061E2B16FD3829C0B55C2E9C2C89F64CB8DA02A6706498CF0330742083E9AC4593A1762D32DC4E6CC2D9F4310014FB15DEBBEA324EBC2EA1E1660782559B9B39FBCF34C85FDA9AD350D195AD7587AAB621EF7FFB63277CE35AB43B01977C9F8DD6C2AE7B34FA7B35D5FA37D8B3719E736F18734CB3A2468BE9CA0832DDE0B958925A377FE6751C4EB8FF1AD295355302F0A5ED4E8F8C33FD5162542B8ED7CD985DBE3C84401830F6A7EB9D955EC74C7F98B02388B4E1353317CDB5EADAAC9025038CC01F8655C7FB9AEE940FC4B282748B39D277A7FEF462038833A9A8EB50A8719F68B3E858825911F294A80FAEDE9D4C1815844C2632DD20387950003DAB80B1A58E541A5E6658AF7D4CDD91FD1C08735B584F5C69C5CA94F6B7F97A4761B127DB394AC72E902DB9EB4B3E0B884C448FF2763FF9ADD530753263688CF92BB746181C17294BFFC2A0B3969A7BBA429A481C425B24745CEAD66286F5DF04F1E4421C56ACAA668E87BA58E3B07A062D1DA60CC6B411667BDE6F466B72C9169965BC7781DA78A818F779A9B3D7A577F71A1DF49AAC865A0D6F2668CFD2C77CFA8D306A14DBBDE4D3A3818B07DC89D5F51E117F7BFD007D60F32BB1B6BB01E76862398371FB91E0A3D4B39FD9146C47F627A066618CF83C32E5C82592B418BD2F5DCD8D42234625974F988A6F729C60BA5EAF18C77B611DFB187A581E3A10268A965F650FE242CE2FE08AA71515B59A6EDFC9CBDAE22DF3AEB22E773CC2EB373619E9CDA23C236CA3F7845C2136E93849D9F6AA1477F4513358CD8CB4E21444C9E5709818801EADFCA23F2C23DDFD5B4EBB6089DAEDD14A21EBF3F7A8C1C80BBF7D37973BD156AC5C4462D29DCCB7EEFFA22A8B6CE433B600532F33999ADC39196F01230614767285089FB262D8469DC66D24AE0B77FD05C3EC02FBC5EE328319409B8E2D7B0AC6801C1C8BA86F793C2037C71E2A25F114E9EE0EDB3B83076EABFDAFEDEFA0548DAE91E62CB7C29C03413235B8C6EB9F46BE29DE8F5D30E8D97DB6F45687DC4719B1024E48B7DFFD0D2B474B2032B4E69B6382E603D4777F3450E2E467C6D9AB2782C0AE266C320D36BF67BD6B86EA9721B22741684D9C0CCC774335430071A5410C1E34B4BC1A823A93A38F5AB4781CC593B13A593867FB634C0C705107CD278C6CCEE6D842748BFBD2FFD205C6BDFB3AC87F693C25C832C86D96B00BBA0AF88DCFBC8CA4328765DE27FBF1389C4EDE28317BD0EE447F030990E957D223A5EC66CED9D16400AF6DA8663C4E4111B4584F8F0066CDF8258D90C5D7B439503E3AB3FCC55FDF933E06D704416187AAF86E6C39695DEA8B8189EC1299670BE03B6A636889CB7F10F04CCD67278E77886CF3F6E2A05BA8D25AB8664EA817642ACF5DB4D9B3EF80E169463EDB6BFDF67172E88D233609B091BBD085B970DB8AE0DAA5048CA42D6A54042F42445BAB03F9BF1ACCEF341B7349109BA0073D3715A9073AD9BED258268AEE9DD5202E0EDFA5720A317EA5CB41706C0D235465BECDC8E3FF0D628EE5EEA6AAF1BBD3E18FE9217516893DF115E979C4CFFEC494988B6F9B86026610898C44AB1547C5F8ED5CBF3C3A837DDB6A444BD3E803E1824E6AB931310FE86B36587F1B34B0B48D358F4B97E9774213DE7D92571380BE2199E703119C5B9836DADFC826B71D588250AC37DE0EC05C5823573C102BCE44C9F044507671C4E1723950A3C0E14968CBABBFEEB049EB723DB9B23CDF0273525C29CC5165530A1F1CF830D3551DD6BDED53954947D5C334DC9C71907CDBFA109EBC52D6305477C14159257AF8C51C6F09D76FC0085C3D969EC60FB09145E66A8A7489611DB3FDEFC35202B8AAE82D3CDF666034BEFF49FE49A45C5EC438F4118F338545532CED916DE78E3BF82B4E55907474386B9C172F393EFE895334F7323CBB2AA7CE7718BEF5E7A23AF734BD4963FBC7889AA5C50F3955B904B5E577D71B21A293D766865E3F8C212DE5EA084A9D22748A8009A7D1858328A1BDF7BA0F4E3B83BE9707629252B3339CEF796696855A574B4A4896CA68C3D6A6824E3F593069EC0A571E61282F8A29BEB8BD788F7B351A8939CDAD9E257587A77804F2704F49DB3305514B85B449AEE56EE40CB2A75D51690194284AACD0855B02893F8DCD3091629DC548705A1085E5CC33DE7726A0F521C149003DF380ABDAE96BCDA55C44BF9BFA1103150F049563E848A8750625DCFDD9BFE02E1E57489B5B3AA28BEAA80F4DAA562DEABB4BB6A27125369415885020D237A92CCC3A23593FE2183225BFA2FF39B0BEF9CB0425375E256BCD572175483F713BD38F937F2B3D4C1F686C5AF60061E0B05CC3EBAAB0AE8BA21E47A8318BEE4A01516046363D152936A1344E17A65E08030522EC667233145A56001B8D065DC2FED0D2A9F02C981A8962F984916314805DAB644A5112CAA1564895121D8B1FD046F547BE282CF979752883EC79AF70CF59A88D960F3336F0AE61357877AAAA34699A876144B65CA5B77A684D850D09B3D42CDBFC4539EA103F8377CFE5F9E5432403FAB416662C4C83226191EEB7F82B01E0819C081FC40E7B978669C7856067E8B582832DD0B92588103C2616BA2C7774C46840318CA2B1A3798FF7ED9FEC087F01798EA2445B92E67E2446126A7406E82FF8D3711311BE16E9171531A95C966E6BEFEA34938E6F5FA660F7C7CB533A119377F1D26AE6AE51D805AB96A64C8B80D6EE137F634B384C2E377 + +count = 83 +seed = A97269579EB70D268C58D94FF744329B197F722A8A407B788510DDCACA34C8CD4C72FFC14B76300C86AEA1E4CFA66BA4 +mlen = 2772 +msg = AE3DDE9E33719040345DF8EA7E4C0B5E2CBC5CB80B34FDDB959E2DA1D67D74D2FBE5AAB07C6357A9F3E5F6EF5379B4C75008E9077A1EB025F9023FE32FCD9076C8D2B291D0BECF2DC624F9E752B1EEA2CF0755FC9D4B2E4320DFD042C68577D58E61DAD075BC1C3931ABA78B473C0726ED495150D6A11A81DBBD1C840F5F1FAACD54E3470E0D994DEACA7E6E324A9FB4E581AB447A4EA026DA3DC3C7E6AD55E88CB841E069ECA63404CACE0E3D4C8B9CEC33BFF6AA6341AA1EB69AD799C6CCE358CA94555287D01B0192B1B49EB6F705E54FBC86465C4BA70134AFC9A53C1C3A732E21B010002B49B7CC6F5237B794BC1D1F1E30A7F1EB95D195D5F26B46A704F77F80B092117EDE1C340622FF32302DCA7E7E43C2A4D8852CB508403B1AA8ACA27A86936350264811550DFEF05D72542C74D6243AB9D259202295A63F54C836CBF610E40EB85E9704041A51BF68578B10F7985C752DC35788E7B7754358082AFEC9E4B271D36974EB90A46F7D703B0CCE941C3CD072A88F931A4FFD098634BE0921D089E46637F88F9625B7DF900A276B4BB75FC75921C8A8B6668DF9946290E11FCE4565A76D39D8FA55F324253FFBBF81536581621DEE664A9E9E4F4FCD3A9765706B8EA833125A825B1CB30314B7C6C78B301638EAD4311932FD4611D78572180EE441648F8BFAB869874611C153FEEFF88A45F7A98206D0B2D97CB7EC2144F045225AF5A9925AE7FD3DB017E37259B7A2FF6C66820DDAAC5651B2EC2E5767DDBBE18256B1D0D0F96CF5EE04266B8ADB29B0AC5D55B73E1ECA8FE724EE174B76EA1C0A54896E2BB565075F1669D3CCA171657B66F343A634F4250287F853B52182B9BE50DF29021673DB1841ACA45E7263DCE653F0DD84338E49FF5C6E3BB42F1A3C7164704A2A000149114D36BB9231606EDA06C712A904C1E323C4AA3EEE0BCE6062A9CB956E004407014ADB58EEABF486B38570955C30F2B5C28179F86CD5FFD603CD441A1FB06519368886BFF9C2C127ABD079346D762E51C311F196D5F825B45EDDD4A48C7C2123E10A3D369D772750987EDB96968C59441FB2F47F8E33FA4CED3006766C06BB6B339ED94B8FE57B20D96F1A27A61966289D8FF5072FD11D7EE53DEFE0014A11667D0A6C988BD16629FB53F269130B22A13AABA2E9F70DCC93D3BF6E611EFB006BA585FB8E8720357E25DF69C6DF388FAC792F87CCE801FA49A8CBEAD1698C11B82C4F85FDB4D52A2A808483DCA7334295BB3B2658AAC18857878730831622124F5A254A464DE459F3528C5194220E5BB1779C8F5E3866B0D60931A1A47502D99E2B186785658DEF57ABA676626F9CCAAAF449609B07AF7B57C78FA5BD06B2AD2927AB491EE461A94AC37A079D9BFA02203B09F7EF180C1C1C430518FF2D3F2A3582EAEB6668060A2B544E973E8A2B88733A902A0A80F8E4F30AC5D0223C1076482EB2CA5AE67039597514A4866061D5FBDD99694A060D0D0EE43A1B7290FFD7D796A9F1A2142DB6E0F154ABA8720396B6DE939E668447C81CC828FF9D2A014FE001CA718C1D6ACF4C08BC7796D344A29FD8913E4CE71E986C46BB66C2610FA797C9E1639DF423C338D7192638F621D83A6802E72E38BEE3AAB064FB606962329997FE908597E7407CEF098D4591E5E6011CACA701994E4ACF572F7C91057D3DA06058A7DFFD3248EE3333208BFF27473E6F1EA3914C5B2056AECD7AEE07F8DD26B3C2B8B9656EA4260D38E8D5F23C925A4476754240D0702C5859AEC2329E1CC3E426BD7665B2A4EE2E75B41B561FCE79690F64D1068DD35A294A8E8CB43A6AAA901109F0E09D985B6E323C30A017E75BF01D0AAA739102C1A6667ED48E60DD4499EAB862851558DFD17229878F5BEF0CC29FD19F59835579F3CDD4F85684E0D46D9618A205DE3B29B0BFA5FBB36745B989211E2BA711527D32CBB5E35830DF4549FEA652377EBBAC6D52787F9EBC3CB687EBB641BF51D3E22E98FCA48F99584FB1F3BED3F97F33EBF656C5795055268F49985CEA00819A07B8F4B0ECD7BEDA95EAF11E3498FA7AA414C54C38A08A841B012AE91763BE911DAEF803E2CA385C9D4CDC642A0B343DB6534C10D9E1755B7B2DE543AFE1D3C90981A7BD907E9CB14367243D9FDCAA8776AEE5F65ED6DC02F633BCF9F57DAE39E8E8261DC10029DF7B7124BEB67DD753B36892481EA7CC54DDC3A60EF8D4DCEC4D5796DDE0E7453BBF0FD93FCACE97CE5048D75ED1F34B69A392E1734E262B2B2A1E246331A373B5CF1FEE7BB46096C76349B0F19BE63FE539DCD33A8450BE894C2DC21BEFF0DE6A841A533F4C9949289037D161BB97DCE31CDFF4C1E0AE36B4192594DEC3B021E8F3D5B500C244CB122974F8CADF125DE0CF832A920DEC3A6F7150585D0209651B0FAAE0F74A36FC8779115B96136805DDD4F6F3A69C06AF472F369F481359FF834A0FD2F9AE899EA36B9B061B63D07C1D4ED7A373ACC40EAD808564B05FB0C6E656A80FA3865AABE483848D14D1DFD66D7AB1F353642EE3417869DA21622F6AF551659D07E6C827C18EA36E2C5E806A9571A7B05BBC1BA283A8984BFABC555AACAEAB2453573F782A4087F0F903AF34596E83282A2E54773AC33543BD353A3F855BC46810930C3635A9B70BA7FFBEEA95A129CCF9E9538EB11E119A072F806130D831AF7E57D332AC889D7D9E6BBD1C65D64E089722F6954F126E64EA939D98084D434EE74B55C549BED21D11264F8B5E023277DB52B03D7B8A8E75B12B11D62052E474E435707272D72D00D92288CEDDCD1ABF8E63A8A9963A48B54F492487B309F69CD90C9FF54B9C5A55CD2BAD4A2E0A6B00B188FD6C527A8184BB63670BF626A995815810CC0F280131F5F652EC20609C7D3B910E4168FE273626BF0E2CBF05BC9CCD178AD91BC25CDF178B387DFF0B6B40A46FDB6C975349B6CD8AD103CDC5DAB8D09D9A5B55622E74564C1E789C5C185CAC04FA0ED6065B9CCADB1D5DC80E90AB244CE1AAC516B346ADAEBAF7A030D66FB90FD070ED062A41E0B70BEE3B07F1C03887DE5F79D70F9955B25B8C8201602784EF8A60147260D1BDE8E152E8D3F992CB8255ADACE9D5DD2E9C856C47537742094190AA867459D20989DB11841AE44824979C0A2093D7EDCAA13C9DE25E6EECBC5124055F17466467E123E39034502BA966CEA873997EE25E52DE2DBBA874DC9AC222B49967B7BEDB5C81BE09827CAB782F458795B2903D72AB16F4423964F82DC69C138EEFA3273BC10376939E544964150D9DF09E14BE08CFCA06C10BB2C315B1B676C40762F8209C0EF13CFE5FAD76CFC17FE462D8330F78BAB072C5465F7A26D047FEC4BD3B918C9C761B91B02D820ED7EF345E79A66FBA61AE13D3050A27488CBDBE693B800F1E76C188EBD8118C9432EB9E7124D35A1A038D237918F1DB83304D10AB5DEDF58C6951A92AAB1A1A40E180254E730EB43B566A83CC71FB6B9749BFCD3A90B964966CAE90FAD7406A8A89B1E48C885BFE2DB41C1996F20DC9A8DFCBA1A6F2F307EF8FBA5EEAE9631C2D6328D90F17679DD9E8E9660D6BD4C8A1D79C47A5FD46BD2ACCACA2D5C6407B0F7F31D093CEEF0342C67DDE3F1BA5067ED1500DC45161B8636255924BF007C4C870990C5DCE098C5A26386AD84D0F0CE4860349A147A4E7AB80151FA63882590B91C6AD3E70A68E6FEC1A2CF65881A6DC38048FC14DE71C702C934C5D3C4CF4C474F906C3400364BC400A7DA087F94F1ACCB68439A9A6FFA8C6439B2CC5C0B17A7D649033798429F211D9DE12B24D117583E1C425C2C0348C625CC44E9B976D319E72D4E09D5D6F36EE243F5FBCB190E84DE56EB680DEC8566F5A2C7D5F595116C628CA09401D561BD78356C634419225FB01CB637C46A627F6026D39EC1C62E9A3E85FAE +pk = F202A2B05E25230B0093C1213C54D4604CECBE30567A5D892341623E4788D401172F187BC1D70A1EFE66DFC120DFEB2C40A8F4666FA4338BE8D2F73DB153AD0106 +sk = F202A2B05E25230B0093C1213C54D4604CECBE30567A5D892341623E4788D401172F187BC1D70A1EFE66DFC120DFEB2C40A8F4666FA4338BE8D2F73DB153AD0106453656D73BDF52C4DAEB58896CB59223B5010000000000000000000000000000F600B0B64F3FFE2123A4C7BA943C772364FDFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B2B7C159A098BD0A4DDAE44DB1BD176B4FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000002C6AA787782D560887D7521F0FB4FC8E70A8776790ED8D5477A36A5F31AD3001D0574F89F1EBD186B2A437D928C10E92AF0D16796C26C25B9A2B6B674DBDE004393782354D79A3304C48F48F97143F291E92A6BA76114DCC79BF5E8918FB000B0349912D0E27F9FDB757036502026FA3700DDF677AAACC55E4BD1716B283D00 +smlen = 2920 +sm = 7D712E4548D7D927CB42094AD15516803C00870ADEAE4CFA68568E1F8B562803DAA53B6A1C05180B6E8BBD9D606B089518CF2604E5DE2DD532A584AA6867000000005301B113FE595B2C51DA54C07EB74374678138378A75B30F0D9E1982C9C6191C03A71169D3EAB8435EF174A79F4881031E3B5BD2FCD6F08F8ED0082F40C226366B94697C490D7688AAB1696C8CA534020B02AE3DDE9E33719040345DF8EA7E4C0B5E2CBC5CB80B34FDDB959E2DA1D67D74D2FBE5AAB07C6357A9F3E5F6EF5379B4C75008E9077A1EB025F9023FE32FCD9076C8D2B291D0BECF2DC624F9E752B1EEA2CF0755FC9D4B2E4320DFD042C68577D58E61DAD075BC1C3931ABA78B473C0726ED495150D6A11A81DBBD1C840F5F1FAACD54E3470E0D994DEACA7E6E324A9FB4E581AB447A4EA026DA3DC3C7E6AD55E88CB841E069ECA63404CACE0E3D4C8B9CEC33BFF6AA6341AA1EB69AD799C6CCE358CA94555287D01B0192B1B49EB6F705E54FBC86465C4BA70134AFC9A53C1C3A732E21B010002B49B7CC6F5237B794BC1D1F1E30A7F1EB95D195D5F26B46A704F77F80B092117EDE1C340622FF32302DCA7E7E43C2A4D8852CB508403B1AA8ACA27A86936350264811550DFEF05D72542C74D6243AB9D259202295A63F54C836CBF610E40EB85E9704041A51BF68578B10F7985C752DC35788E7B7754358082AFEC9E4B271D36974EB90A46F7D703B0CCE941C3CD072A88F931A4FFD098634BE0921D089E46637F88F9625B7DF900A276B4BB75FC75921C8A8B6668DF9946290E11FCE4565A76D39D8FA55F324253FFBBF81536581621DEE664A9E9E4F4FCD3A9765706B8EA833125A825B1CB30314B7C6C78B301638EAD4311932FD4611D78572180EE441648F8BFAB869874611C153FEEFF88A45F7A98206D0B2D97CB7EC2144F045225AF5A9925AE7FD3DB017E37259B7A2FF6C66820DDAAC5651B2EC2E5767DDBBE18256B1D0D0F96CF5EE04266B8ADB29B0AC5D55B73E1ECA8FE724EE174B76EA1C0A54896E2BB565075F1669D3CCA171657B66F343A634F4250287F853B52182B9BE50DF29021673DB1841ACA45E7263DCE653F0DD84338E49FF5C6E3BB42F1A3C7164704A2A000149114D36BB9231606EDA06C712A904C1E323C4AA3EEE0BCE6062A9CB956E004407014ADB58EEABF486B38570955C30F2B5C28179F86CD5FFD603CD441A1FB06519368886BFF9C2C127ABD079346D762E51C311F196D5F825B45EDDD4A48C7C2123E10A3D369D772750987EDB96968C59441FB2F47F8E33FA4CED3006766C06BB6B339ED94B8FE57B20D96F1A27A61966289D8FF5072FD11D7EE53DEFE0014A11667D0A6C988BD16629FB53F269130B22A13AABA2E9F70DCC93D3BF6E611EFB006BA585FB8E8720357E25DF69C6DF388FAC792F87CCE801FA49A8CBEAD1698C11B82C4F85FDB4D52A2A808483DCA7334295BB3B2658AAC18857878730831622124F5A254A464DE459F3528C5194220E5BB1779C8F5E3866B0D60931A1A47502D99E2B186785658DEF57ABA676626F9CCAAAF449609B07AF7B57C78FA5BD06B2AD2927AB491EE461A94AC37A079D9BFA02203B09F7EF180C1C1C430518FF2D3F2A3582EAEB6668060A2B544E973E8A2B88733A902A0A80F8E4F30AC5D0223C1076482EB2CA5AE67039597514A4866061D5FBDD99694A060D0D0EE43A1B7290FFD7D796A9F1A2142DB6E0F154ABA8720396B6DE939E668447C81CC828FF9D2A014FE001CA718C1D6ACF4C08BC7796D344A29FD8913E4CE71E986C46BB66C2610FA797C9E1639DF423C338D7192638F621D83A6802E72E38BEE3AAB064FB606962329997FE908597E7407CEF098D4591E5E6011CACA701994E4ACF572F7C91057D3DA06058A7DFFD3248EE3333208BFF27473E6F1EA3914C5B2056AECD7AEE07F8DD26B3C2B8B9656EA4260D38E8D5F23C925A4476754240D0702C5859AEC2329E1CC3E426BD7665B2A4EE2E75B41B561FCE79690F64D1068DD35A294A8E8CB43A6AAA901109F0E09D985B6E323C30A017E75BF01D0AAA739102C1A6667ED48E60DD4499EAB862851558DFD17229878F5BEF0CC29FD19F59835579F3CDD4F85684E0D46D9618A205DE3B29B0BFA5FBB36745B989211E2BA711527D32CBB5E35830DF4549FEA652377EBBAC6D52787F9EBC3CB687EBB641BF51D3E22E98FCA48F99584FB1F3BED3F97F33EBF656C5795055268F49985CEA00819A07B8F4B0ECD7BEDA95EAF11E3498FA7AA414C54C38A08A841B012AE91763BE911DAEF803E2CA385C9D4CDC642A0B343DB6534C10D9E1755B7B2DE543AFE1D3C90981A7BD907E9CB14367243D9FDCAA8776AEE5F65ED6DC02F633BCF9F57DAE39E8E8261DC10029DF7B7124BEB67DD753B36892481EA7CC54DDC3A60EF8D4DCEC4D5796DDE0E7453BBF0FD93FCACE97CE5048D75ED1F34B69A392E1734E262B2B2A1E246331A373B5CF1FEE7BB46096C76349B0F19BE63FE539DCD33A8450BE894C2DC21BEFF0DE6A841A533F4C9949289037D161BB97DCE31CDFF4C1E0AE36B4192594DEC3B021E8F3D5B500C244CB122974F8CADF125DE0CF832A920DEC3A6F7150585D0209651B0FAAE0F74A36FC8779115B96136805DDD4F6F3A69C06AF472F369F481359FF834A0FD2F9AE899EA36B9B061B63D07C1D4ED7A373ACC40EAD808564B05FB0C6E656A80FA3865AABE483848D14D1DFD66D7AB1F353642EE3417869DA21622F6AF551659D07E6C827C18EA36E2C5E806A9571A7B05BBC1BA283A8984BFABC555AACAEAB2453573F782A4087F0F903AF34596E83282A2E54773AC33543BD353A3F855BC46810930C3635A9B70BA7FFBEEA95A129CCF9E9538EB11E119A072F806130D831AF7E57D332AC889D7D9E6BBD1C65D64E089722F6954F126E64EA939D98084D434EE74B55C549BED21D11264F8B5E023277DB52B03D7B8A8E75B12B11D62052E474E435707272D72D00D92288CEDDCD1ABF8E63A8A9963A48B54F492487B309F69CD90C9FF54B9C5A55CD2BAD4A2E0A6B00B188FD6C527A8184BB63670BF626A995815810CC0F280131F5F652EC20609C7D3B910E4168FE273626BF0E2CBF05BC9CCD178AD91BC25CDF178B387DFF0B6B40A46FDB6C975349B6CD8AD103CDC5DAB8D09D9A5B55622E74564C1E789C5C185CAC04FA0ED6065B9CCADB1D5DC80E90AB244CE1AAC516B346ADAEBAF7A030D66FB90FD070ED062A41E0B70BEE3B07F1C03887DE5F79D70F9955B25B8C8201602784EF8A60147260D1BDE8E152E8D3F992CB8255ADACE9D5DD2E9C856C47537742094190AA867459D20989DB11841AE44824979C0A2093D7EDCAA13C9DE25E6EECBC5124055F17466467E123E39034502BA966CEA873997EE25E52DE2DBBA874DC9AC222B49967B7BEDB5C81BE09827CAB782F458795B2903D72AB16F4423964F82DC69C138EEFA3273BC10376939E544964150D9DF09E14BE08CFCA06C10BB2C315B1B676C40762F8209C0EF13CFE5FAD76CFC17FE462D8330F78BAB072C5465F7A26D047FEC4BD3B918C9C761B91B02D820ED7EF345E79A66FBA61AE13D3050A27488CBDBE693B800F1E76C188EBD8118C9432EB9E7124D35A1A038D237918F1DB83304D10AB5DEDF58C6951A92AAB1A1A40E180254E730EB43B566A83CC71FB6B9749BFCD3A90B964966CAE90FAD7406A8A89B1E48C885BFE2DB41C1996F20DC9A8DFCBA1A6F2F307EF8FBA5EEAE9631C2D6328D90F17679DD9E8E9660D6BD4C8A1D79C47A5FD46BD2ACCACA2D5C6407B0F7F31D093CEEF0342C67DDE3F1BA5067ED1500DC45161B8636255924BF007C4C870990C5DCE098C5A26386AD84D0F0CE4860349A147A4E7AB80151FA63882590B91C6AD3E70A68E6FEC1A2CF65881A6DC38048FC14DE71C702C934C5D3C4CF4C474F906C3400364BC400A7DA087F94F1ACCB68439A9A6FFA8C6439B2CC5C0B17A7D649033798429F211D9DE12B24D117583E1C425C2C0348C625CC44E9B976D319E72D4E09D5D6F36EE243F5FBCB190E84DE56EB680DEC8566F5A2C7D5F595116C628CA09401D561BD78356C634419225FB01CB637C46A627F6026D39EC1C62E9A3E85FAE + +count = 84 +seed = 483A81716F91A43ACA6764C4BD2A57C9156B762E9174EA49730A6BEB9CB19A0B3755E37BA47EC524BBE2FA25B9FEF687 +mlen = 2805 +msg = A7E941D3C14E2DDB4F971C9955868ACA753A73E8EC6845ED6E9D3B444C826480F03AC771F92E94380BCA7E50303FB79CBA608E351A1A67BF217B9816E2AF9F89BE8A79F661470CA16BFB2C99EFDE97859AD1D217848289EAF543005F5C231599FF74299EC2A7C737FF94B7465DE11F80E17D4FDA264DE568D8767CE822B3AB9642D95BC89533CE05FB331B86E3C5A296E4EA4C637EA458BCED1F89355C0270D083D4920E72112CA1ED486191748B4F730ED52F9803D05A0F2F065BE03B2603D6CDB154DD7765847D656B919B08969E41B23F9D376135BD5D924529410392ACEB004849550E6CF2903181C9A395FD469B7DE2C5060ED22922AA4D7C782A33330714A0AF206B29B4FCBE0F12C18948F6634FFD7F2710138020E273CB0DFA735BDCDE9BD6CEC898C5E564EC71AA7880D97CC711412F28603DE293CD5E904E9156D4F6BFE2BE15347B9FF7848EB51CD0785D6A649EA3514E02695C7E3C4F021A9992D67BEA1D68E5B17DB2E0DC061CCB5ABABA49D110055467F9DEE61ABA8F3E5C713E94A8A96C3A8AFB698887C1FA4ABC5157CED33A834DBF0F5AF9EECBB5F2AD7B63B4C2CA94A117C2B92F3D51900926E26B101FBE6207AB0884CBFCB15F9F98F95B0D08E29390977F4D3DC710EEA3AE7433D5EA87A5F710F1FCEAB26D516FC19FD272F6B0F01EE167F06E6C33273481F280CA64FDA0549C8DB884FDD467B93998360766D4CAC4C8DE783752FB6C6D7B1E47DF23CEECA572F2AD3E2B628E31984B9054448ED1D90658BC658A9CAEC0485512CE084A535E7C8196B8BBCA5D26C105C41E083F8D56F1530A8C1B36A7F3E41FCCBAC7F342B2D026064B304444192D4873FC57978E44151896EA6C0F13D017F683B203BA1DE677ED00F2B737C4C69E53ECF16AB918939E120E9FE14B2243EFF0116B24C6654BE09C582F1E62E75EFD8593E62E45AC36F717815B854B47A4DDCFC91FC533FA85BCECB6E560CF11E46D2F334B396D68B275E7404A70F2A805A64CD458A8E5F114A89124BA1866F917749FF32E59EE71948BD97F2D4128BEAB8BB0B6B06D84C6D466BFA30FD8100E48D951D0B3E787EF9611A56FFD64D970DBACFB1B4DF064B1CB5DA9918F5C58A10F0903B64286B1C1AE5CBD00EB8B363BDD7A7AAF2111C0C6E86E15ABF6C1E761FBF027425968CDC19522B44FF3F56335C59760FAE6D9028E76B284330F7510F2B55B6F46ADF90311CC785D35C2BB49272BE514CFBBD7A2B7B2E8C0B6DC28CB683D3D581F547F83BBD3B8C7B76925E44E6DA89D5EEF17AB0BF4213EF9C05B7B473901D483C647F416B98478C7100919C28515B617A27321841BAA174C1A2D3494395294CEBD48EEA14BC3106CA9C69D9F6485D6ABF1C2B1111A8BC602454685CA61AB4EE4DB9F413CAF8F0F204F04D40CD36FA5DAB629CB53876DB3E16372E626B6BC892C63C6B6C503C9D22EFE113927395206BDAA4B83D4FEF4FEB42FA7A71F7CE2197FE282A02D0FE50F96B1F917A67E50EB79CD3FFEF064542F7BEB51AB05B56AFD7AEA5F4164CC9BA37D8FDB35A3DEACF0CFB555161E7E41EB798160798BE9D01E3DE0C4288E0BAB19AE398E94353ADBE9A43524ACE35830B82FCFD4B1DC2800CA4C38A56B7CD28BC3E2F69A0AC4655CD79B5789A2B72EAF93B018D4D6F4C983D08932B22C85AF6FB07DF0A786D98820E1B06BC17F62D6E39739790A13049252F1B9102DC692CEB20C270FFE9B902AB7EC5A4EAAF47F7E2D31B2195F5F48AD18D099C33384141DA14E151BA57F6B1BB97901457202CDB83B5C713BD8A13F6E3E276C7D6C130AE287CA8931D9EECE06AB7CCA124D6D02D497D55EA9151A95E8A4DCCDA72D3F51A7DB3F2879918753683B01BA1B154DA83E6D84DDC9492F2DD8C128A30C75174ED1A6B8D93D08645270BDE247782E882418EA158B2A2153B2D8F75C09932F324EC199D26E9F3C4C4CECD807367E3981E137858B98BD1268D2C894541EC99BBBAD19A6856EA16A1E56B7B193BAF79AB89D4E76327405658C4ECB5A8626302B3A4618AEAC7E11A1199C4BB08C60AD78FEA4827B59CC883B2CA7038D7845106DE9174B2B8C17267273D23418AF560265000543ED9886884912B4160FBD372FCDF706EF642CF1829493884B6CFE946ECF6140106DCBE11B3746E33FBD4B5852B732230B9047004F4FAFA0D4BD7043C7D6595ACCD1B2771AAA76FE05A0C80B7B221DBEF79950FC69147816CAD0E52C05E72CECCF55FB4DABD81ECDB476417DBFDAF3B555CC90573CBED9474266C89FC55FF0BCC55602A51A1B5F91E425A1A58DCD4ABD09BBC63933FB4279B9E21298F9FE0CF1A93C4A19695240E8978D604047ABC7239F5053EA650D781307C50DEC4D5E2360ADEB9AA02C0F6FEC5784784A271169CE456E1C32BF984C3323656CCC588C97E0ECE5A40FC7B4DDBDDDB764EDC512DE63270F07891BD160F78B8ECD3A4D11EC4C68EA0A0FBD0F23AF9AB261A110F431F926C4995B05462E0DABF29D9660ABBC660C9A675628270CEA7EC5AE9B6F298B17B2392263700B8EAD9C845AD29CCF109A2ED66ED5BAF9C935754AAA1B84BE2B5339F9BF3CF5E80AF16967863FA8DCA64F5FE873DA4A6D33E39A592749B721FEC203C0CAC527CA96DE7A96CE9A540F5DA1902C97F960A05EBF0C32934F9B81244C945A60FD3F176DD8C261690D8EC98D19607129A50EDD51135FFBAEBC04A0961ACC5A32FD058FFDF2C6866BF90A3E177787E7061BD2011EC08EC118EF0451CAD010B53C68D0BDDC701D10920D697EA3439B1A0F96E6256B7712F59C746D1C74C20B17D461C3DF635EEC83E3B8E098034F119B9D9A79ADA735158EAC3F434E805444D5EA2EC85CC8ED8F5BCCAB7DBB6ECFC2E385781579AF1263D9FD32BEE32E01DB94703B5C756B894DEF19783B12BCE2A1A8D29D96F329CB0791D697BE7E0F05DD5C9DADA52E1B8C1E5F75A0FC90ED8C05BDFF86644B1EE61989CAAA271061D4222818C894AE9ECA2DA7326E5C24CA1EEEBE3720D2127BA997B0C572AE30615F8BC4278057F4762D46A39B934DDB2A0903FE1568C1BCC6C37E1F7C145EB7CB20A6A4B3466A7ABA58B48BE94F7E14CD20C87B2768358D06E3F607FE5E9DD1AAA8477975660F1E379B9EA26CC00CEA8CFD6420F2FDC7EE6393AA17CEF88645B821F8F42FC7DD97B0E16C04631F86ECF1CB76A6502FD1C13917CEB26A83596B117D5336387DDBEA56162E8A5BF2FA35E697245BC7210CEC13BFA694AE884582924168BF8EE2F61A734E37876F363225E5AE19B7C65CA6AFC31C8B37BCCB308A9C27F3E9902DE365E288E6CC46E329E78BE914B85EB980C0BAD932C164671ED395D5D8317C133E2E000A10E0D20D0F408019B33D9A87ED7725EA4C5ABAD67E0CAFBFF31DD236E59DEFAB7FF2CB40F479B56B261A32656F016DECA5302A336CA15D10E0AFCD168A4B922B79C11CB21881220374492D64DF21453B41346A85174A0A4A3C1E973845C856CA70D6D25BB854D0C6BD3C75CD73998C7F64E35A58DCF593C85C2440A6ABA4E470F87E6F9B4ABE127B30F8992D8AAD0BE38F008D9D937582EB3AAFC68F516D5AAF2503ACC96E59A151D2D4B072AB6B38C54928D6656441C709F1C1B770CE6EFCECE11F8B3602EAB63E0C629BBD8A79A96BE4CDB072780F3D287B091FC94FF2C0D347FE280BBAC308644BDB15A3C653863EDD945AF0AE725507507B82C283DC9909CCACBCF357D7A19703401B6E4474B94A6CBAE575B942501A281B8166FDC70E6B4B60C2F57A4D66FE1197D301D0E0C7BEC12CEDF9496BCA2183D04632711A79C8374B6DE35C2EECB0239391C2019C720894BC7A635DF18FCEEB9AAE16B3CE92717E2C56903D20D0712EF80131B8C48635163E97EFB1FABD1500D061C93AD935BE9A65A45A92E4A4E885268E712EFBE5337214701BAAD4C73E81E73BFF19AF131F0ABA105BAABE849F +pk = 863BC9B538C2295400C7BFEC5432EC0A4C449C08DF996161B0324E3EC4F3FA022027539823B06DC9AA2E2189E126C162A7C3AEA82368588DCD8266E2A885600304 +sk = 863BC9B538C2295400C7BFEC5432EC0A4C449C08DF996161B0324E3EC4F3FA022027539823B06DC9AA2E2189E126C162A7C3AEA82368588DCD8266E2A8856003042BD68957510F685B8377C99D48BB2A9FF5010000000000000000000000000000FECA9BF283B246405FB866AAD1415EE9ECFCFFFFFFFFFFFFFFFFFFFFFFFFFFFF5192B2457F59F6B85D77E17DCDDFADCE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000976531E255566C1A3B711D94CD9F32FE7E52B9859E46B17249FCC330058F7900C5FE53A4DEC48DA7100274786266936AB2A12F9F92EFA8F891BBF9F94A163600A7EE92A99996B26179A599F411C7F9C02F6531A44924413CD3C93526895E3F00443E26A76D9D44BB9B25325C7217291146B1065D81F9F4C34BD488C915AC3700 +smlen = 2953 +sm = 8DAA77ED181B874C0C0FD6500A4E8A34CDFC8B1A64B4C7F5859092CCE1BFD1046E445C95B509D76A076EA3203BE31E3B1E812CF1BE9497A6C94EDF714F694B0300015A0AE11940E87532DC4256C6A35BAEC5D78DEAF0E0DB3B8CF1608CD744BC3D98A44C29D04E48C38A793CA24F6A6163CC297AA5B4EDECFA13B5C72A890B8942132B676C8DBF6DED0675F9CE041C4A3E02020BA7E941D3C14E2DDB4F971C9955868ACA753A73E8EC6845ED6E9D3B444C826480F03AC771F92E94380BCA7E50303FB79CBA608E351A1A67BF217B9816E2AF9F89BE8A79F661470CA16BFB2C99EFDE97859AD1D217848289EAF543005F5C231599FF74299EC2A7C737FF94B7465DE11F80E17D4FDA264DE568D8767CE822B3AB9642D95BC89533CE05FB331B86E3C5A296E4EA4C637EA458BCED1F89355C0270D083D4920E72112CA1ED486191748B4F730ED52F9803D05A0F2F065BE03B2603D6CDB154DD7765847D656B919B08969E41B23F9D376135BD5D924529410392ACEB004849550E6CF2903181C9A395FD469B7DE2C5060ED22922AA4D7C782A33330714A0AF206B29B4FCBE0F12C18948F6634FFD7F2710138020E273CB0DFA735BDCDE9BD6CEC898C5E564EC71AA7880D97CC711412F28603DE293CD5E904E9156D4F6BFE2BE15347B9FF7848EB51CD0785D6A649EA3514E02695C7E3C4F021A9992D67BEA1D68E5B17DB2E0DC061CCB5ABABA49D110055467F9DEE61ABA8F3E5C713E94A8A96C3A8AFB698887C1FA4ABC5157CED33A834DBF0F5AF9EECBB5F2AD7B63B4C2CA94A117C2B92F3D51900926E26B101FBE6207AB0884CBFCB15F9F98F95B0D08E29390977F4D3DC710EEA3AE7433D5EA87A5F710F1FCEAB26D516FC19FD272F6B0F01EE167F06E6C33273481F280CA64FDA0549C8DB884FDD467B93998360766D4CAC4C8DE783752FB6C6D7B1E47DF23CEECA572F2AD3E2B628E31984B9054448ED1D90658BC658A9CAEC0485512CE084A535E7C8196B8BBCA5D26C105C41E083F8D56F1530A8C1B36A7F3E41FCCBAC7F342B2D026064B304444192D4873FC57978E44151896EA6C0F13D017F683B203BA1DE677ED00F2B737C4C69E53ECF16AB918939E120E9FE14B2243EFF0116B24C6654BE09C582F1E62E75EFD8593E62E45AC36F717815B854B47A4DDCFC91FC533FA85BCECB6E560CF11E46D2F334B396D68B275E7404A70F2A805A64CD458A8E5F114A89124BA1866F917749FF32E59EE71948BD97F2D4128BEAB8BB0B6B06D84C6D466BFA30FD8100E48D951D0B3E787EF9611A56FFD64D970DBACFB1B4DF064B1CB5DA9918F5C58A10F0903B64286B1C1AE5CBD00EB8B363BDD7A7AAF2111C0C6E86E15ABF6C1E761FBF027425968CDC19522B44FF3F56335C59760FAE6D9028E76B284330F7510F2B55B6F46ADF90311CC785D35C2BB49272BE514CFBBD7A2B7B2E8C0B6DC28CB683D3D581F547F83BBD3B8C7B76925E44E6DA89D5EEF17AB0BF4213EF9C05B7B473901D483C647F416B98478C7100919C28515B617A27321841BAA174C1A2D3494395294CEBD48EEA14BC3106CA9C69D9F6485D6ABF1C2B1111A8BC602454685CA61AB4EE4DB9F413CAF8F0F204F04D40CD36FA5DAB629CB53876DB3E16372E626B6BC892C63C6B6C503C9D22EFE113927395206BDAA4B83D4FEF4FEB42FA7A71F7CE2197FE282A02D0FE50F96B1F917A67E50EB79CD3FFEF064542F7BEB51AB05B56AFD7AEA5F4164CC9BA37D8FDB35A3DEACF0CFB555161E7E41EB798160798BE9D01E3DE0C4288E0BAB19AE398E94353ADBE9A43524ACE35830B82FCFD4B1DC2800CA4C38A56B7CD28BC3E2F69A0AC4655CD79B5789A2B72EAF93B018D4D6F4C983D08932B22C85AF6FB07DF0A786D98820E1B06BC17F62D6E39739790A13049252F1B9102DC692CEB20C270FFE9B902AB7EC5A4EAAF47F7E2D31B2195F5F48AD18D099C33384141DA14E151BA57F6B1BB97901457202CDB83B5C713BD8A13F6E3E276C7D6C130AE287CA8931D9EECE06AB7CCA124D6D02D497D55EA9151A95E8A4DCCDA72D3F51A7DB3F2879918753683B01BA1B154DA83E6D84DDC9492F2DD8C128A30C75174ED1A6B8D93D08645270BDE247782E882418EA158B2A2153B2D8F75C09932F324EC199D26E9F3C4C4CECD807367E3981E137858B98BD1268D2C894541EC99BBBAD19A6856EA16A1E56B7B193BAF79AB89D4E76327405658C4ECB5A8626302B3A4618AEAC7E11A1199C4BB08C60AD78FEA4827B59CC883B2CA7038D7845106DE9174B2B8C17267273D23418AF560265000543ED9886884912B4160FBD372FCDF706EF642CF1829493884B6CFE946ECF6140106DCBE11B3746E33FBD4B5852B732230B9047004F4FAFA0D4BD7043C7D6595ACCD1B2771AAA76FE05A0C80B7B221DBEF79950FC69147816CAD0E52C05E72CECCF55FB4DABD81ECDB476417DBFDAF3B555CC90573CBED9474266C89FC55FF0BCC55602A51A1B5F91E425A1A58DCD4ABD09BBC63933FB4279B9E21298F9FE0CF1A93C4A19695240E8978D604047ABC7239F5053EA650D781307C50DEC4D5E2360ADEB9AA02C0F6FEC5784784A271169CE456E1C32BF984C3323656CCC588C97E0ECE5A40FC7B4DDBDDDB764EDC512DE63270F07891BD160F78B8ECD3A4D11EC4C68EA0A0FBD0F23AF9AB261A110F431F926C4995B05462E0DABF29D9660ABBC660C9A675628270CEA7EC5AE9B6F298B17B2392263700B8EAD9C845AD29CCF109A2ED66ED5BAF9C935754AAA1B84BE2B5339F9BF3CF5E80AF16967863FA8DCA64F5FE873DA4A6D33E39A592749B721FEC203C0CAC527CA96DE7A96CE9A540F5DA1902C97F960A05EBF0C32934F9B81244C945A60FD3F176DD8C261690D8EC98D19607129A50EDD51135FFBAEBC04A0961ACC5A32FD058FFDF2C6866BF90A3E177787E7061BD2011EC08EC118EF0451CAD010B53C68D0BDDC701D10920D697EA3439B1A0F96E6256B7712F59C746D1C74C20B17D461C3DF635EEC83E3B8E098034F119B9D9A79ADA735158EAC3F434E805444D5EA2EC85CC8ED8F5BCCAB7DBB6ECFC2E385781579AF1263D9FD32BEE32E01DB94703B5C756B894DEF19783B12BCE2A1A8D29D96F329CB0791D697BE7E0F05DD5C9DADA52E1B8C1E5F75A0FC90ED8C05BDFF86644B1EE61989CAAA271061D4222818C894AE9ECA2DA7326E5C24CA1EEEBE3720D2127BA997B0C572AE30615F8BC4278057F4762D46A39B934DDB2A0903FE1568C1BCC6C37E1F7C145EB7CB20A6A4B3466A7ABA58B48BE94F7E14CD20C87B2768358D06E3F607FE5E9DD1AAA8477975660F1E379B9EA26CC00CEA8CFD6420F2FDC7EE6393AA17CEF88645B821F8F42FC7DD97B0E16C04631F86ECF1CB76A6502FD1C13917CEB26A83596B117D5336387DDBEA56162E8A5BF2FA35E697245BC7210CEC13BFA694AE884582924168BF8EE2F61A734E37876F363225E5AE19B7C65CA6AFC31C8B37BCCB308A9C27F3E9902DE365E288E6CC46E329E78BE914B85EB980C0BAD932C164671ED395D5D8317C133E2E000A10E0D20D0F408019B33D9A87ED7725EA4C5ABAD67E0CAFBFF31DD236E59DEFAB7FF2CB40F479B56B261A32656F016DECA5302A336CA15D10E0AFCD168A4B922B79C11CB21881220374492D64DF21453B41346A85174A0A4A3C1E973845C856CA70D6D25BB854D0C6BD3C75CD73998C7F64E35A58DCF593C85C2440A6ABA4E470F87E6F9B4ABE127B30F8992D8AAD0BE38F008D9D937582EB3AAFC68F516D5AAF2503ACC96E59A151D2D4B072AB6B38C54928D6656441C709F1C1B770CE6EFCECE11F8B3602EAB63E0C629BBD8A79A96BE4CDB072780F3D287B091FC94FF2C0D347FE280BBAC308644BDB15A3C653863EDD945AF0AE725507507B82C283DC9909CCACBCF357D7A19703401B6E4474B94A6CBAE575B942501A281B8166FDC70E6B4B60C2F57A4D66FE1197D301D0E0C7BEC12CEDF9496BCA2183D04632711A79C8374B6DE35C2EECB0239391C2019C720894BC7A635DF18FCEEB9AAE16B3CE92717E2C56903D20D0712EF80131B8C48635163E97EFB1FABD1500D061C93AD935BE9A65A45A92E4A4E885268E712EFBE5337214701BAAD4C73E81E73BFF19AF131F0ABA105BAABE849F + +count = 85 +seed = 30F0E117513AAF27AB2516BCEADD1188B4BBDE76E57DFAF43CBF2D70723D941E8F875C5EBF02BD7D67AE81ABCC54440A +mlen = 2838 +msg = E43EEBE157E43D9F54130C668A153907D65BB19856A1B7C2FD5E2C770FD6BACB13BAEF951EB758485C128ECE4F3E9377A58A45EBA1C3A9CA5C94B50714088700D6FDA933ECE3A6989EE77A824A9E99674748A90B7F227B589250C9E156A8E50B74A7F49DE036FCED86CA0D4C02E217EEFCAEF7234F651CE4380B86389D7331C7657AC283F58C781F904405ACBB68661310EC6921C1FB7483E74116378086D4A0C9A52AF9847BB3CE0FE97F5A7C2CF588DB3B6FD725CA83391656CB38FCB6D79531E56F5D42FC0CC20D04AD7BBF57001BF2F8E6B335CC57CA2DB23C247EF9B75BBBA3159030975D65B9AA7C10E0FA4F615F77126D5271129D8839A3F8DA30C79174373C4BA643E4C4F0CB26BD5B8B9F7EA56DE459EDA15037D8772478FD9F7F7E06F3B422DF0B425DBF1E91D3893CE20F78CDF1910C5D4674EFADF122F41D6C7D6290DF59FA029BD82E792E758AD4388F9D352E9D2FBE3E58810C380D1CC5768865D24BDD92145DBD1EE0D4724C769EF5CEE12DB2AE2708B4C8C7865E70CA31386388D991D46C4DC4DAFC5CE66CB24D455BEE01488A7C764A308C7054572FCA0CC74A01A2B1F191C54146FB1AAF55B834F998B50909F3D003271E6504985DC836B5C44655B938769639799F2575BCFA92F13D32B283A5BDA11177CE1F66D6B30788415BEF598773E87B4C8C41F0CE6633B6C945A3B4C46B74F30945EFD99CF3709FDAFAEB4BD4C6BF605F89C7A9B4EEA1A6599F0A32CE3F2C58587EA8BB3FE6495D92F2FEEC52BEA3DE2047F5EEA7EA1453C762201FF1291AFA87923107F7FF586E00D07824EE021649ABD2D6E9EF11A1D31726EA9277134341EC57D790949590A963D25D6FADFA9CA21E43ACB7E5ED4CB6E8BB36377C2618997943CD100A927D395376871ACB9619BDE9B1FFD5E48E271952613875FA3ACD3E1F2E872F1D672AAE6E2A575A4FDC4FAE2DC6A7196E7EBA94AE5B49BE41E7295433ADF49A6D2D945F43699D444A726423CD9164B9E28B0AA4485B0C767A9398DF5DC5F23D27889C14B1ABE98880E7BD5DF9AB3D1321D5493A0A8B91EA4827627A9B59308CB0104CD8DA7D9DEF2D47B27074BA007401415E900DF03F251C8AA425F0FA59D74C41BA7A9288C8E280141CAAF6C6932DDC4184F81F5C33F0FDA005BF3FB6A0A9169A709875AE475302D57CE96D3DB332188202597FF29D1F9EBAD2B0FFA27C14CE9CCA58C923283BA10E9FA1689D6C2B8804225D706E09FF97AE9CEDC27D256E8736DAA54382040648F2F6BFBECD6C3A9BFAF5D1ED23EAD00EAB351F1E0BB4C719AE6A1F5D12E7F09ECEA62A2F554B18397FE1400DA1EB6694635D7C9C626E0FC82CF8DF6AA4CA88B69F78CD065C53F929BAA58507FD3E3D8124C4BF287D452AF47AF9F4D926DFDB529A8ABB8BB57C5C7611A97053A0CB0B01C754CB479C6CD3A3E867BAC33E45EA0BB6BF77E0B2EC2F136DAC0E259FA309FB5F6D8E7005E1696CE203C5D054E5927A87A1B4E81E73F22FAFE61D7D64CBFBE519D39E716BDCBB37657E71B9390FF04B3C01C6F6842684115CD7F5AAC208EEA48906890248E58D1615634CC1263CD3ADC14B67F1A1A8ED2626E7237AF5488F5D269973F11458E3E4FC2EE35A4BF49C2F5F2361939FA243FA8F33B54EEEBA9B0453701E367A7BF4D698C62DA64732652C68C20A956522826F8E29A764BA93DBC98FCC87E59A1423886694057E131333C5DCDFF3BE7A1F0D344A2DEBB90051721E0226178DEED353A136F69481F83651BE3281C562D6127914CD24C38FFB327786086B08EBE89D03A33BF7B5DCCF90DE9C4D907D308E08A616C5343C116A098786383009DC70787AAFB4529CD27CF85F946B8B238AD2F00DF109FC84CDB48BB52B73E1DE066636176E8C6C76216105486C553511DF1F0664EC1E04EE0B0BD74A08070207486B7F326C3EE73188AB5BB7F8F5643093916491D62F0DB18675BA4CE90B2AB310BBA4705B65A581FBC5E76842A99D4926AE5BF7B8EABCE5FA30CB98C1BCF0E0708DA970096234D47BFE23A4F9ADE29BE5A8B6BBB748EA1C13D00388AC90B65EE10BE6A9AC422EBDDAF5482422AECE19E702F6D26ED954D4E489CC48B2E39A6F168E98E11C1DFCB4A843354F1AFD447962E5090CCF51DDF6643CE0AFAFCF3E4363187E69C31AB796132EEB04F2D4976A576B9BC8D9B1D491B74613C1AF32E3D2DEF408ABEBCC27E4A915C983E10B6090FB2DE6FF9E60C96CF4F940B09AEC048E7A174711798FD76DB15DCAE0E570BE3AC147E2F8777A522555B0898BCD7B04ABBF060FA72B04604C9A583FEFD02B2AF9FA035F97DE4DAA4EE777F9D6985149DB6C2F0A33EE1A1436B38DFDFF87F831E83399C6A884273E612433EE3958F37C99A748DF151E3EA011F4DF5F0050597685E0230DA1B1C7095E1203EA7099BA5C43E58AB0EDA60AF65291C3CC9A07257D71CA6C9EAB93CEF41294853A67A5B11F9192C96A36C701F142DC36B046218BEBAD9904FB765550598F8E2F49F5F0AD2608117196751E7E4C5CC4C3EF425A921C1EE15F37A1F80DF1E24163CA145EDB0FC4D988B8C7167ACF9CD94F919AC96E5469859FDAEC54E1970007EB9699342A9AA044A8EE478A3ECF8B59B0109EA7640C218ECC1E8CBC5E2FB61A1748B7C038EFDADC2D096BC29D95B1BE770D097AFD8B0FE02173A1B3D7110F80D6C849F1AFD1B01A60894B16140F9B34D96071A753545159C4FFA4DBAA938BDEC287C6B83751C5E699724AB355D1FA0E081DB286EC83343877C520E856C4ADC65322AEB39CD87B7D8E4FF9222E085ED84C58B7FF513AD77F8A9EFF2760A03F69AE5DD14DD92DD3F2D3D98E97B1987086B3EEF2F2E822C851B7ADD83903786C050F30C4A4F4BA9361E49ACAD503E2A07EA119752E12D4FA09DC83F7A48EE3DCC1F09475960B6839CA736E498A128F78E58279063D839ABA88AC9E5BC24BC07BBD2DE1CF2E1CCC5987E63F83780D0ECF07EAE21C8C752529735B37C980EB320DC949468C69B17DA8AD612825A84D0529EB97FF8C4CD225FDFD1563BB6C5360ABDCB3339434A298DDCF5F36188F3AB501E505828E8D2FD6DDA062AD415C56414FD7557170F0F57BC5A401FA648699F3C7F7FD8F1F058849B817FADDDC24726DF851D3644414F55CADE30A5764914675D574EAD4D4DB8725866A6C51BF0EB23B12FBA1E101A6F3BDB98A2884D0F2B8DEB3F279E9C38EBD0209DD05C0FCC6EA715257355D0D6BE2C8BC7835187CDAEA43A8EF9C59E88AF6AA667A697A3DF8BDE250EAF4341A835B5EF93CFF97656133B49E13213949A3F368D985E0D6C793319F4284DFADA383137DC5B000B7FDD85F27865DC633562949BBE4FBFF75417AB109F03015BD0F67728969435EFAE791AC72C6AEF99A385A3E8B4C35F58380149C653FD78391A7C3B26A3550D37F9639164979288BEEE99E36AC6F44D0FCBAF0D210839D563A6249059A30CE6F047F5D541FC8A90A18610A8BEFB9493C5AC804D34D40881CA82E673788870705BCD585044B11F1D9BBD6B17D8B82B7CCC0554D1E3AA7F2762FE01385571C9FA7A103D07C1A209504876189DE4B3C5910C26C5F33EA725A7D57CC30A6EC8F3EECF2409F1234A094556C0F7941CFB30FE86F208FEB73C8E8EA8623640AFBDB1CC589768A714CF945731DEBF4519B70870FB3A50F1FB368ADA3FB217704A5D46D879CEFF9BB72667ACC673CB196AFAA0DB1160CC2CD7B260DEB791A94D0988ED54B7E45F33E7CDBA0FA105F3AF3CB1521EA382B1266DF304C900BF53E195CED03871A22C50DA166BB9441CEC83607083195D6CFA17297B678ABB5E03950160130B47E25713B0829F64D2552EFCF404F65798A86D5899B72150A91BA00F7DFBFFE82531497B60C31C28992377A2DFD5FAC8A9C16C835CE4DC24D0389277E6355C655C8A33C89BD48F55C13EDE24B9BB348DEC89612F0905719743C95C0E8B5653855676CE171F812ECA405B6F96F2212D1A5369A11379282AC0C5AC41D +pk = E73F4490E6C2EA9BB46FC92E32E55F0038293861458255AC757D199BD2F30F046ECDB057F00B249C3EBB6148C14FBCD194EBBD74D0F45265C1313E2417948E0402 +sk = E73F4490E6C2EA9BB46FC92E32E55F0038293861458255AC757D199BD2F30F046ECDB057F00B249C3EBB6148C14FBCD194EBBD74D0F45265C1313E2417948E040203F2A87A118FB62F6F318E522923DD9EEC0000000000000000000000000000004EC199A945736382010FF8813560A78B57FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF95204403758BE8AD86F794A2A04B802099FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000003B1755EC379D42CB1E4823D333101109D65C2C34E92F5FD69EFE84DD2BA1840076E07B3D3E1A224B4BFA9E365C135F4794D78D7D2E8A974DCF541CDC15D75800F7D986C012AFCE079DB8523E50685F885864A8C658309C37C056666794149C007FFA444F1CBDF1319DBB85492BC2F655AD86195055F15E027AE181CA22CADA00 +smlen = 2986 +sm = 67C17359D492FB29E50CE8C30F75F488072ADFEB45B2EEB3D2661805254EB8025D765F00BB9858AD3538AF896AA54A8EC0FA8808BFAB285EDB65D8B40E18E80400006BD40021006E8FC29CA0F3F5ABA088306332D814A0D3DADE06DF42552AA36D1A130A4DB3EEB007C868D161589FCEDC6B48971365D29FFBD3424A7E97B4E79011F433117D4BA81A691A07FBDADA57F500110BE43EEBE157E43D9F54130C668A153907D65BB19856A1B7C2FD5E2C770FD6BACB13BAEF951EB758485C128ECE4F3E9377A58A45EBA1C3A9CA5C94B50714088700D6FDA933ECE3A6989EE77A824A9E99674748A90B7F227B589250C9E156A8E50B74A7F49DE036FCED86CA0D4C02E217EEFCAEF7234F651CE4380B86389D7331C7657AC283F58C781F904405ACBB68661310EC6921C1FB7483E74116378086D4A0C9A52AF9847BB3CE0FE97F5A7C2CF588DB3B6FD725CA83391656CB38FCB6D79531E56F5D42FC0CC20D04AD7BBF57001BF2F8E6B335CC57CA2DB23C247EF9B75BBBA3159030975D65B9AA7C10E0FA4F615F77126D5271129D8839A3F8DA30C79174373C4BA643E4C4F0CB26BD5B8B9F7EA56DE459EDA15037D8772478FD9F7F7E06F3B422DF0B425DBF1E91D3893CE20F78CDF1910C5D4674EFADF122F41D6C7D6290DF59FA029BD82E792E758AD4388F9D352E9D2FBE3E58810C380D1CC5768865D24BDD92145DBD1EE0D4724C769EF5CEE12DB2AE2708B4C8C7865E70CA31386388D991D46C4DC4DAFC5CE66CB24D455BEE01488A7C764A308C7054572FCA0CC74A01A2B1F191C54146FB1AAF55B834F998B50909F3D003271E6504985DC836B5C44655B938769639799F2575BCFA92F13D32B283A5BDA11177CE1F66D6B30788415BEF598773E87B4C8C41F0CE6633B6C945A3B4C46B74F30945EFD99CF3709FDAFAEB4BD4C6BF605F89C7A9B4EEA1A6599F0A32CE3F2C58587EA8BB3FE6495D92F2FEEC52BEA3DE2047F5EEA7EA1453C762201FF1291AFA87923107F7FF586E00D07824EE021649ABD2D6E9EF11A1D31726EA9277134341EC57D790949590A963D25D6FADFA9CA21E43ACB7E5ED4CB6E8BB36377C2618997943CD100A927D395376871ACB9619BDE9B1FFD5E48E271952613875FA3ACD3E1F2E872F1D672AAE6E2A575A4FDC4FAE2DC6A7196E7EBA94AE5B49BE41E7295433ADF49A6D2D945F43699D444A726423CD9164B9E28B0AA4485B0C767A9398DF5DC5F23D27889C14B1ABE98880E7BD5DF9AB3D1321D5493A0A8B91EA4827627A9B59308CB0104CD8DA7D9DEF2D47B27074BA007401415E900DF03F251C8AA425F0FA59D74C41BA7A9288C8E280141CAAF6C6932DDC4184F81F5C33F0FDA005BF3FB6A0A9169A709875AE475302D57CE96D3DB332188202597FF29D1F9EBAD2B0FFA27C14CE9CCA58C923283BA10E9FA1689D6C2B8804225D706E09FF97AE9CEDC27D256E8736DAA54382040648F2F6BFBECD6C3A9BFAF5D1ED23EAD00EAB351F1E0BB4C719AE6A1F5D12E7F09ECEA62A2F554B18397FE1400DA1EB6694635D7C9C626E0FC82CF8DF6AA4CA88B69F78CD065C53F929BAA58507FD3E3D8124C4BF287D452AF47AF9F4D926DFDB529A8ABB8BB57C5C7611A97053A0CB0B01C754CB479C6CD3A3E867BAC33E45EA0BB6BF77E0B2EC2F136DAC0E259FA309FB5F6D8E7005E1696CE203C5D054E5927A87A1B4E81E73F22FAFE61D7D64CBFBE519D39E716BDCBB37657E71B9390FF04B3C01C6F6842684115CD7F5AAC208EEA48906890248E58D1615634CC1263CD3ADC14B67F1A1A8ED2626E7237AF5488F5D269973F11458E3E4FC2EE35A4BF49C2F5F2361939FA243FA8F33B54EEEBA9B0453701E367A7BF4D698C62DA64732652C68C20A956522826F8E29A764BA93DBC98FCC87E59A1423886694057E131333C5DCDFF3BE7A1F0D344A2DEBB90051721E0226178DEED353A136F69481F83651BE3281C562D6127914CD24C38FFB327786086B08EBE89D03A33BF7B5DCCF90DE9C4D907D308E08A616C5343C116A098786383009DC70787AAFB4529CD27CF85F946B8B238AD2F00DF109FC84CDB48BB52B73E1DE066636176E8C6C76216105486C553511DF1F0664EC1E04EE0B0BD74A08070207486B7F326C3EE73188AB5BB7F8F5643093916491D62F0DB18675BA4CE90B2AB310BBA4705B65A581FBC5E76842A99D4926AE5BF7B8EABCE5FA30CB98C1BCF0E0708DA970096234D47BFE23A4F9ADE29BE5A8B6BBB748EA1C13D00388AC90B65EE10BE6A9AC422EBDDAF5482422AECE19E702F6D26ED954D4E489CC48B2E39A6F168E98E11C1DFCB4A843354F1AFD447962E5090CCF51DDF6643CE0AFAFCF3E4363187E69C31AB796132EEB04F2D4976A576B9BC8D9B1D491B74613C1AF32E3D2DEF408ABEBCC27E4A915C983E10B6090FB2DE6FF9E60C96CF4F940B09AEC048E7A174711798FD76DB15DCAE0E570BE3AC147E2F8777A522555B0898BCD7B04ABBF060FA72B04604C9A583FEFD02B2AF9FA035F97DE4DAA4EE777F9D6985149DB6C2F0A33EE1A1436B38DFDFF87F831E83399C6A884273E612433EE3958F37C99A748DF151E3EA011F4DF5F0050597685E0230DA1B1C7095E1203EA7099BA5C43E58AB0EDA60AF65291C3CC9A07257D71CA6C9EAB93CEF41294853A67A5B11F9192C96A36C701F142DC36B046218BEBAD9904FB765550598F8E2F49F5F0AD2608117196751E7E4C5CC4C3EF425A921C1EE15F37A1F80DF1E24163CA145EDB0FC4D988B8C7167ACF9CD94F919AC96E5469859FDAEC54E1970007EB9699342A9AA044A8EE478A3ECF8B59B0109EA7640C218ECC1E8CBC5E2FB61A1748B7C038EFDADC2D096BC29D95B1BE770D097AFD8B0FE02173A1B3D7110F80D6C849F1AFD1B01A60894B16140F9B34D96071A753545159C4FFA4DBAA938BDEC287C6B83751C5E699724AB355D1FA0E081DB286EC83343877C520E856C4ADC65322AEB39CD87B7D8E4FF9222E085ED84C58B7FF513AD77F8A9EFF2760A03F69AE5DD14DD92DD3F2D3D98E97B1987086B3EEF2F2E822C851B7ADD83903786C050F30C4A4F4BA9361E49ACAD503E2A07EA119752E12D4FA09DC83F7A48EE3DCC1F09475960B6839CA736E498A128F78E58279063D839ABA88AC9E5BC24BC07BBD2DE1CF2E1CCC5987E63F83780D0ECF07EAE21C8C752529735B37C980EB320DC949468C69B17DA8AD612825A84D0529EB97FF8C4CD225FDFD1563BB6C5360ABDCB3339434A298DDCF5F36188F3AB501E505828E8D2FD6DDA062AD415C56414FD7557170F0F57BC5A401FA648699F3C7F7FD8F1F058849B817FADDDC24726DF851D3644414F55CADE30A5764914675D574EAD4D4DB8725866A6C51BF0EB23B12FBA1E101A6F3BDB98A2884D0F2B8DEB3F279E9C38EBD0209DD05C0FCC6EA715257355D0D6BE2C8BC7835187CDAEA43A8EF9C59E88AF6AA667A697A3DF8BDE250EAF4341A835B5EF93CFF97656133B49E13213949A3F368D985E0D6C793319F4284DFADA383137DC5B000B7FDD85F27865DC633562949BBE4FBFF75417AB109F03015BD0F67728969435EFAE791AC72C6AEF99A385A3E8B4C35F58380149C653FD78391A7C3B26A3550D37F9639164979288BEEE99E36AC6F44D0FCBAF0D210839D563A6249059A30CE6F047F5D541FC8A90A18610A8BEFB9493C5AC804D34D40881CA82E673788870705BCD585044B11F1D9BBD6B17D8B82B7CCC0554D1E3AA7F2762FE01385571C9FA7A103D07C1A209504876189DE4B3C5910C26C5F33EA725A7D57CC30A6EC8F3EECF2409F1234A094556C0F7941CFB30FE86F208FEB73C8E8EA8623640AFBDB1CC589768A714CF945731DEBF4519B70870FB3A50F1FB368ADA3FB217704A5D46D879CEFF9BB72667ACC673CB196AFAA0DB1160CC2CD7B260DEB791A94D0988ED54B7E45F33E7CDBA0FA105F3AF3CB1521EA382B1266DF304C900BF53E195CED03871A22C50DA166BB9441CEC83607083195D6CFA17297B678ABB5E03950160130B47E25713B0829F64D2552EFCF404F65798A86D5899B72150A91BA00F7DFBFFE82531497B60C31C28992377A2DFD5FAC8A9C16C835CE4DC24D0389277E6355C655C8A33C89BD48F55C13EDE24B9BB348DEC89612F0905719743C95C0E8B5653855676CE171F812ECA405B6F96F2212D1A5369A11379282AC0C5AC41D + +count = 86 +seed = 070FFB907EE8AB7152A9D380DEA2C4C4796780FCFD80906C5E489B917A45D5E7EDFE6F37C4420E5480E8BB599FE36451 +mlen = 2871 +msg = C07185E0343DF2A4201649AD5DE4CFFA20BAF5DD43F5E4A6C81CD5143FE72865A7C036A2DFD617D96626995C12EFAD019FF44E0EDD7028F29E3657EE3C0D02E9CE83EF0A648FD7CF183A7BF7C15095E0F9278B14FDF6C983CDCF2987DD0CC085400906DCD0D14ABA60124F4B7494ADBBAE3A8D6052122575F99792F7240EB17864DC6D231721140E43F1110E73EB2E3C05049783B33AAC4E4CA0A248775BAF81FDB03D114508928BEC3169A810296B5A4DAC27E7C7F8D01CF5943CF4D8CF6EE6F9042BB300E50EEA3224D35C9628E38C368EC3B42393FC820371DB6557216A2C2D5A230FE3A7C6BCBDD89A2BE5CDBE7F783BA379B6A4237DB051E6256DCE14DCF641190A956E8E85EB2638736B899ED045636DDB7A351F5A4F4108D9D6E0413F92B9D392495299128A5F4ACCE8C7747C675EFE05ED7182DB51C515B345029440AB61A904D2A390122680C951ED4575515144C5CA80D6F14D1CFDBB5373B78E09D04D0544151CFA1240790CD31165048D1484DC4D11D05057071DB3433DF071B367E00FD38C386DAB689E4DFF6FB421B2A95FF54DC29375C9D1C18A76C79ACAE3D3F35D4CFC385199A4CCAF6C9F0421BCF58D296EC7E0D1B95A6C4BCBAC1271F94E438360A71A6440275591E41389B30CAF2626A865B9E59552CB198A1D4453EBA6D0F6FC491A8A7783B4A8BAEB81E54F9189CE493EFC1C5D830A4F637F2BF43CD86B91637611415C95685FE79966174312FDFBF33A646625F97521B5CB1F008135B824F1D6D8373006C7158E62B1F794AE34548A0C6DAC8B60C559D81580AC0D84034A501516EE36CB4082732918365A5AB787FACE591AB02BE6957AE4BB96B58E2B173DA019D3E0CABEBEBA0AF775779F14BFBA8F595697731522DF3C80CBDEC16F6ACC32659CF5DAF193178307887EF1BE1B48B5806D0FA9868A7FB853708B26873857786B974709C687D6597BCF6C7E476C1E47CAFDBF30B6311ED434C0F998C4065399C59073C1F2BAB1D46104E74EA6C976D416E58BDFD24CCD957CB431870DE5DA8763992EF68BB18075926B0E4E826095EB3B8CAE086FB1759C94B873A1F4DF477E0EE9EED8DFD7C77508B3F0C67F69BE04355ABA9344960639F6DD6B3A956DCD66370338617A365579C5993986B4F748CB7C990344B209785E22A40FDCF8F83061D37C9F1351B4473D6C74ABE6B3EB2A7D62CA0F0C88A0AA8A46973F781DF0126E8D55D3E9C41C2E3884F84FB0A06C484CFA0C9A0DFB8CFD573749C711C7C236B0F2F144E1BA4DB2525C093DEED29434FE43CB3040C5A374CFEF33214FDD2D660398E91BF070A4F5F9746C2F08C41256FD5E955891146FFD38B155987E6A0FC47AC2A5950509B9E2C86B9DD9929378F43EF3935F1562672498C5640A22315BE15B001D4B01418DF8EB41DFE5C570E850582D8916C2E7FC2B728048E24BB9D1E8283615E039C16A2FC61011631BBD8F2BEB24ADF9552CF5797CE05D9D1A7E7F3F5455017B127D9BACD32BAD0CDBD3991BBCAEA5FC988EE7AEC0B1003732F25489EDB0A1F9897247CBC40E60F1DD276259CE19DECCB90067F7293A68B683FB5232ACD2217B8929859109D6852A43892098630A67D72B1CF4BD5D58E20C5C18B85D69DF74EE8CC69BAAC7DA48EB71A160F03B68C6BE87A4919736F14363F004EA3F41DD37FD8E621BF433BCA71E17565E060F3C0F889515D0A8C17FE0D6D734FF756256B0A62058B95422257780DE000557DF289F47910CC272A14BEC737C0715F204C49F03150082DC904A5D170F7383F04F1E355F50F80D5461CBA53490BB2E9484806D369D61FD00ED1EE5BE518D04A24503B1C4C08C7CA084902A3942C04143807203287A985EB3FCAE3C5309410CD9B9A548F54DED44321CE8C2A04679841DAEF7FBB6AA11091D240AFBB467D9969C31C1CBF6B24F8CBFA20CB4CFA404B1310400271664763E9C1CD1B6FE5FF2A0FAE22AB14EFC016CCBB19C5DD5D047750DB4ADDEA3E7A193128A5F4D7BB6358F21B39A44259695904DE3440BB28CF9466B562065C387189EAC2F7522C9385DC2A607F6F9335FF8ADD47C7BA932659AFF69B1F26EC8655BEE4F97FBC846E48111CBE25524873D1DB2F2282D0472A2AAA3CF491C26DDC5E1BE77866A3B692E417E6717A4F4454C56F97F063B9E598865B6F71136D65DDB0F3CDEC57DECD5A57366BA96E4315A88B4EA3479321468FFFF508D23B0701A62CE0CBC0FA37C91CFF5C5A0433FD61AE11A922575F5BAA714DE46A58D6EFC79BDB10C9AF7E9950A61D44B3E17E3B5298501146485B562B1570FF5798B47641D67091CDF90902B2D762E3EFE94C540DE4A28269CC416EDBDDD4D43AC2FA82D638DD9BF11F3BF22FD81CC4BD4759D7D864EEA0E8E8AB71796254B278CF9B650D1FEF38B8437362B2D69ED84C54498331C6899E20C596FEE7CAD9ED8D83D86774AFA6E56A4ED34B0B0842B21CCB67035406DEDFF0CECB0CD089929ED5FFA0CE210822444808BAD99AF603082BFE5C98EE4653349F8A43DB64CF90190C96B0446CC9CD23E0D75B47F54A731E8BCB0A4C67401DEE87876011033D2A526067FB73786FBC1CE696130FCE5D5379CDAC6788875D27C04783B1E2EF41063D57E3D6560D1FF48882C39131C95BAE5A9C9392DAB6CD17EEFBCF61C464A4DBC08447443CBBF3FA80481F3BC1A5806042C07F7A7AD435875DDB1001565EB6B7B872CC6C853F771C1DD5D9C16BC27ACEB3C7690125C1907C7CE904852108CAFE76351269A3D3EA8812FAE4FAE35F0DAEC8E8B186F760005524998BB5DE475E4DF85209DA915BDC972218AE7DB7E2EFA05A7D752AE61CF2F3DC26CA2D282C8E32B4838524BE460971E077348290FA0043FB7616D821A71DDA3A5FB76BFCE0DC84AAEA432DF32B05133A26B46165297EBC45024777A868B8B1B0DD6F97658BE799BD366CFDF99861E916F7CF06C034E4F79594F1BB6ECD9B7347911488928E1E473C4B8C73297F7ED845B9EC59020373EDA57A436C1C9D1459C6114BB6258543D8F4F97B10AAEF5A2E082EA173EE69702D83711FEE6AEE8F6B260D03AB74C3B5D8FDDB81B208E16458511270DD1DA295F25CDE7E44A8349B60BF0C59D4B425C1FBA60D2BCBA47B906D2830D8D5C091DBA756E61620D78B2DFF28407FDC9DA9113CBE82219BB2CC05E11C70D040BDE821AA17B3E981558961CA571E5D5041F7DE047A1727D9C904DEEBE561DC6DBD8876BC77C27322F512D6171BC03871EB0FDECE70F119BACB41D1852220CFF26110EB0EB78E39AA1B2A4C2E78679F53683520C5A57FEA71A8E96E0AED33118DC4BDD035FD88F535B011D9C7DEB6F406A072AE6C091016ED10A5A4EE9827882EE27C535262D1D745AA5231736F2DEEC8A6017BF0DA36B416C98AB71C6824A6EEFF3564665007C9E850FD02A1F5E201B534627B92D21A493DF293DB9F24DE70C7B49A6E07ACF2DB6C90B448681666DCDA318C08AAD08D3E257AF7E774C75DEBE3B3C07AF683735E87F205B0FDE07351849C5AFD07D5722C6AA17B6AC2CC3551C305E6AC31E3601A236961F6618CD3A0F7DCF6F65B8EC82E27E44C8518CDC16ECF79374F796A3DAABE2D5005B25576B35B021497C5A8F9B98DA68D80E56A1CC1044C04DFB11D36CB147EABFDAAFBA0A93FCED8675D7D6A9F999785C0E7346F4C68EB17C0A2409E2F5BD4AC5551FF66A9857C66F642F2A385131377B6372884C417E01BFBBE1CA748AC8969BF2C0BD8944767746D1D57D862795E8ECF9E8A5CA122D0259FFBA822588C5ECCD14CC6FF4B7354CB572F5BD695ED9D85DE131FDD97DD5D6CE7844DDF9F3D112028B5125AE7A77A4AEB2EBB554682A26F457C43FE96D67C90BE7E49FF443478E82D3A48680D737D1260B8210BBE962EFAE6505E496B1B6D4F1042A7B971605E2DC50BE3BDFECC3010B9F5618D3A1B2C1F48888B859E4D6B63CA9D29990B6D502FC22B738B203A83D597B48D73C41860E4E99C57181F5B02F108CA193451025F3B368CF2741244F42B27CB9E57260D2E127CA166B32E0B9C927B247B31619B1D4 +pk = E057BCF63D1836DB43402BCCD8B4B35C762D953B65E251A6003A285AF5954F0248C7299B9BD8BB7CEFD6390D65616B726B169744E5772B21863F45EA356BCC0417 +sk = E057BCF63D1836DB43402BCCD8B4B35C762D953B65E251A6003A285AF5954F0248C7299B9BD8BB7CEFD6390D65616B726B169744E5772B21863F45EA356BCC0417275EF447059764DB5A23928A95650C74E9000000000000000000000000000000108167EA29C59D395CEE8708823ABA8CF5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF570E4CCA828DB9F1BF6888DF1D510FFEC2FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000EDA96F3F914DF2D5102A99B1D6E9C618C230E414C05F5BF25C9F754A8E3F9600A8156F032C2A4B215D68001FFB935309628CC073EF6725848072309DAC53EA00E116238DCECF3F25417029AD3C0783A7385EF7EAE7AB27EEE4E8EBB1B915B6001FD92DBFA9C6BC44E066EDA72684FAB3DD238BB3DC8C8A68FEC0AECF63A48D00 +smlen = 3019 +sm = 15EA7B1D8C03218628B900D8D7C8FBD7F90ACBC0E1A4B1A0192E54B0AA0DB802FAC37FCD1D450E1EECFBB503EE42AEF7C626AD532D120CDE5BC9D4DABF7DFC0300002BC1CD849994C134085DEA264CD9A3BC66F3F979414356ED1113CA28E7AB4D31F633E9D32284428BC0267A807799E34047078FF255304EEF2F8846CA4B30F0F277055EDE0502471A560CAB648971A6020B02C07185E0343DF2A4201649AD5DE4CFFA20BAF5DD43F5E4A6C81CD5143FE72865A7C036A2DFD617D96626995C12EFAD019FF44E0EDD7028F29E3657EE3C0D02E9CE83EF0A648FD7CF183A7BF7C15095E0F9278B14FDF6C983CDCF2987DD0CC085400906DCD0D14ABA60124F4B7494ADBBAE3A8D6052122575F99792F7240EB17864DC6D231721140E43F1110E73EB2E3C05049783B33AAC4E4CA0A248775BAF81FDB03D114508928BEC3169A810296B5A4DAC27E7C7F8D01CF5943CF4D8CF6EE6F9042BB300E50EEA3224D35C9628E38C368EC3B42393FC820371DB6557216A2C2D5A230FE3A7C6BCBDD89A2BE5CDBE7F783BA379B6A4237DB051E6256DCE14DCF641190A956E8E85EB2638736B899ED045636DDB7A351F5A4F4108D9D6E0413F92B9D392495299128A5F4ACCE8C7747C675EFE05ED7182DB51C515B345029440AB61A904D2A390122680C951ED4575515144C5CA80D6F14D1CFDBB5373B78E09D04D0544151CFA1240790CD31165048D1484DC4D11D05057071DB3433DF071B367E00FD38C386DAB689E4DFF6FB421B2A95FF54DC29375C9D1C18A76C79ACAE3D3F35D4CFC385199A4CCAF6C9F0421BCF58D296EC7E0D1B95A6C4BCBAC1271F94E438360A71A6440275591E41389B30CAF2626A865B9E59552CB198A1D4453EBA6D0F6FC491A8A7783B4A8BAEB81E54F9189CE493EFC1C5D830A4F637F2BF43CD86B91637611415C95685FE79966174312FDFBF33A646625F97521B5CB1F008135B824F1D6D8373006C7158E62B1F794AE34548A0C6DAC8B60C559D81580AC0D84034A501516EE36CB4082732918365A5AB787FACE591AB02BE6957AE4BB96B58E2B173DA019D3E0CABEBEBA0AF775779F14BFBA8F595697731522DF3C80CBDEC16F6ACC32659CF5DAF193178307887EF1BE1B48B5806D0FA9868A7FB853708B26873857786B974709C687D6597BCF6C7E476C1E47CAFDBF30B6311ED434C0F998C4065399C59073C1F2BAB1D46104E74EA6C976D416E58BDFD24CCD957CB431870DE5DA8763992EF68BB18075926B0E4E826095EB3B8CAE086FB1759C94B873A1F4DF477E0EE9EED8DFD7C77508B3F0C67F69BE04355ABA9344960639F6DD6B3A956DCD66370338617A365579C5993986B4F748CB7C990344B209785E22A40FDCF8F83061D37C9F1351B4473D6C74ABE6B3EB2A7D62CA0F0C88A0AA8A46973F781DF0126E8D55D3E9C41C2E3884F84FB0A06C484CFA0C9A0DFB8CFD573749C711C7C236B0F2F144E1BA4DB2525C093DEED29434FE43CB3040C5A374CFEF33214FDD2D660398E91BF070A4F5F9746C2F08C41256FD5E955891146FFD38B155987E6A0FC47AC2A5950509B9E2C86B9DD9929378F43EF3935F1562672498C5640A22315BE15B001D4B01418DF8EB41DFE5C570E850582D8916C2E7FC2B728048E24BB9D1E8283615E039C16A2FC61011631BBD8F2BEB24ADF9552CF5797CE05D9D1A7E7F3F5455017B127D9BACD32BAD0CDBD3991BBCAEA5FC988EE7AEC0B1003732F25489EDB0A1F9897247CBC40E60F1DD276259CE19DECCB90067F7293A68B683FB5232ACD2217B8929859109D6852A43892098630A67D72B1CF4BD5D58E20C5C18B85D69DF74EE8CC69BAAC7DA48EB71A160F03B68C6BE87A4919736F14363F004EA3F41DD37FD8E621BF433BCA71E17565E060F3C0F889515D0A8C17FE0D6D734FF756256B0A62058B95422257780DE000557DF289F47910CC272A14BEC737C0715F204C49F03150082DC904A5D170F7383F04F1E355F50F80D5461CBA53490BB2E9484806D369D61FD00ED1EE5BE518D04A24503B1C4C08C7CA084902A3942C04143807203287A985EB3FCAE3C5309410CD9B9A548F54DED44321CE8C2A04679841DAEF7FBB6AA11091D240AFBB467D9969C31C1CBF6B24F8CBFA20CB4CFA404B1310400271664763E9C1CD1B6FE5FF2A0FAE22AB14EFC016CCBB19C5DD5D047750DB4ADDEA3E7A193128A5F4D7BB6358F21B39A44259695904DE3440BB28CF9466B562065C387189EAC2F7522C9385DC2A607F6F9335FF8ADD47C7BA932659AFF69B1F26EC8655BEE4F97FBC846E48111CBE25524873D1DB2F2282D0472A2AAA3CF491C26DDC5E1BE77866A3B692E417E6717A4F4454C56F97F063B9E598865B6F71136D65DDB0F3CDEC57DECD5A57366BA96E4315A88B4EA3479321468FFFF508D23B0701A62CE0CBC0FA37C91CFF5C5A0433FD61AE11A922575F5BAA714DE46A58D6EFC79BDB10C9AF7E9950A61D44B3E17E3B5298501146485B562B1570FF5798B47641D67091CDF90902B2D762E3EFE94C540DE4A28269CC416EDBDDD4D43AC2FA82D638DD9BF11F3BF22FD81CC4BD4759D7D864EEA0E8E8AB71796254B278CF9B650D1FEF38B8437362B2D69ED84C54498331C6899E20C596FEE7CAD9ED8D83D86774AFA6E56A4ED34B0B0842B21CCB67035406DEDFF0CECB0CD089929ED5FFA0CE210822444808BAD99AF603082BFE5C98EE4653349F8A43DB64CF90190C96B0446CC9CD23E0D75B47F54A731E8BCB0A4C67401DEE87876011033D2A526067FB73786FBC1CE696130FCE5D5379CDAC6788875D27C04783B1E2EF41063D57E3D6560D1FF48882C39131C95BAE5A9C9392DAB6CD17EEFBCF61C464A4DBC08447443CBBF3FA80481F3BC1A5806042C07F7A7AD435875DDB1001565EB6B7B872CC6C853F771C1DD5D9C16BC27ACEB3C7690125C1907C7CE904852108CAFE76351269A3D3EA8812FAE4FAE35F0DAEC8E8B186F760005524998BB5DE475E4DF85209DA915BDC972218AE7DB7E2EFA05A7D752AE61CF2F3DC26CA2D282C8E32B4838524BE460971E077348290FA0043FB7616D821A71DDA3A5FB76BFCE0DC84AAEA432DF32B05133A26B46165297EBC45024777A868B8B1B0DD6F97658BE799BD366CFDF99861E916F7CF06C034E4F79594F1BB6ECD9B7347911488928E1E473C4B8C73297F7ED845B9EC59020373EDA57A436C1C9D1459C6114BB6258543D8F4F97B10AAEF5A2E082EA173EE69702D83711FEE6AEE8F6B260D03AB74C3B5D8FDDB81B208E16458511270DD1DA295F25CDE7E44A8349B60BF0C59D4B425C1FBA60D2BCBA47B906D2830D8D5C091DBA756E61620D78B2DFF28407FDC9DA9113CBE82219BB2CC05E11C70D040BDE821AA17B3E981558961CA571E5D5041F7DE047A1727D9C904DEEBE561DC6DBD8876BC77C27322F512D6171BC03871EB0FDECE70F119BACB41D1852220CFF26110EB0EB78E39AA1B2A4C2E78679F53683520C5A57FEA71A8E96E0AED33118DC4BDD035FD88F535B011D9C7DEB6F406A072AE6C091016ED10A5A4EE9827882EE27C535262D1D745AA5231736F2DEEC8A6017BF0DA36B416C98AB71C6824A6EEFF3564665007C9E850FD02A1F5E201B534627B92D21A493DF293DB9F24DE70C7B49A6E07ACF2DB6C90B448681666DCDA318C08AAD08D3E257AF7E774C75DEBE3B3C07AF683735E87F205B0FDE07351849C5AFD07D5722C6AA17B6AC2CC3551C305E6AC31E3601A236961F6618CD3A0F7DCF6F65B8EC82E27E44C8518CDC16ECF79374F796A3DAABE2D5005B25576B35B021497C5A8F9B98DA68D80E56A1CC1044C04DFB11D36CB147EABFDAAFBA0A93FCED8675D7D6A9F999785C0E7346F4C68EB17C0A2409E2F5BD4AC5551FF66A9857C66F642F2A385131377B6372884C417E01BFBBE1CA748AC8969BF2C0BD8944767746D1D57D862795E8ECF9E8A5CA122D0259FFBA822588C5ECCD14CC6FF4B7354CB572F5BD695ED9D85DE131FDD97DD5D6CE7844DDF9F3D112028B5125AE7A77A4AEB2EBB554682A26F457C43FE96D67C90BE7E49FF443478E82D3A48680D737D1260B8210BBE962EFAE6505E496B1B6D4F1042A7B971605E2DC50BE3BDFECC3010B9F5618D3A1B2C1F48888B859E4D6B63CA9D29990B6D502FC22B738B203A83D597B48D73C41860E4E99C57181F5B02F108CA193451025F3B368CF2741244F42B27CB9E57260D2E127CA166B32E0B9C927B247B31619B1D4 + +count = 87 +seed = EDBCC4F6AD0F30066947D678A368B960CCD164889D77730516B444ED2DF10B49C101902F5FA227377C3163A0045B34E4 +mlen = 2904 +msg = 836254422C7D13F1120012FB9CC7CDAA1D8B72F6FA3943AA7DE75263D3DF814BBF2E80C3A204BC0F9AE33E4FA82CE893D35C57E41C7147602BE12455B00B7949A3195264A3281CECC3FDE34802B28C6E1F2B505AB6087D453BD6AA067B2370124840BCAC4605EE4F14EDFC4B4FF19A4D7A828E60156B49B4027AC18DCCD20294F89CCF03D0CF47BB2F22D3749EEE69EE17AB5D8E4DFCCF36824D23E3F95E959D0494FFBC712CE3975E3A661B3F9E149A0234F691C2D820000DE97CC016C43EFE958DA469F740610FD22B64D4BD2E30075E22BCFD4AB41D952D2394FC629F016EE1CD61AAB4581F62A7B8648F8F8CF02462C81023CBE2755C91195A5917FE5A8B5058ECB8DAFF91DD3F73FE38665666DBF79CF6F203FAF94A5CA3F3AFFAA2C2BD5F5DBC011DAF46FD7CEB74B5875E4B5D80B6EDB9817106B91865267E78731662218C8EDE73E588256FB1AD57232AA5533D25BFC54452612F0C2AECAE6DE19355E1D508B888D18FF9F6D7D68199755CF5C210172F65342269ED96C77D80AF8A244B43A99DEB49B97A6F358AADFCFF6AFF72AB39540D375165185F31E0F1A6F97722EE365620BC5D642F8CDC59F7E84FD8615F4A336ED340BE6ED8451997D87B7904C1B9A3A0BD1F8A01AFD6A2D9F5B995E3FD0D44DF8FBC8389B6CBB5537816C91F0EFC3D2349F15EEE747B254C5BBF9418BB979294423DD6DE4D13484408362582A86D082350CC79EBCDCC05B70110A038736034CE4F3DC1D17E5D11C9C7620D40730B61437906933193D1272F7C89C701D495ED682F1335B7E1C42C994E090A67D932A8E825F4B9EDA8F2A94B9A1F11F10E91396908A9D436DD01BAE1D1DE2C6ACF458C0880E3F81ADC2240A99E6083C9C188982713DB243028AB07DF407218CA6B3C4C93989AC96D92375834B915B724F2A105D6240E52B9D7003C67FF76F7A325D84ABBC229266BB40D1DC8784CE1A4A6BD17972CDB26C274B06337D525F61B5BF952D23FA13757460B7B8A3B99EB023831F4FBEF72D62931348622041FFD12634947579BC6E16BD1EAA8E8B2DFD54D74EFCED79EF4FF31AD42036DEBD0FDA3B7F3F8E7A3F45955F82936A67122CD42E38AF646CF565E294F422FAC1E7D274185896F58E9D0FA1FCD3F4D379ECF5B566586246216556939BDF86D6A417C3BF77C64F95D7DE8197EE25B44EEF00209D33159710DF001372C3E3D09F24B9B08B8938C522690674A7588933E1CA37D2C14DF50777806EF6FD2285771A44F6DE90475C6CC314DF140C3962DD9D70C54E58CC5FA3302D69C80C6511D9D42A51B7CB7FD7FEA8D8BD65A66FDB2AC80D945FB7EC72E138F5566CEB570968D84B60068DF20C6CDA2AD48372DC97424793FEA8D2136923070C25F47C3D10839D1747B613B93530968D5E97A3FC0F563BFFCDE7B42C839EFE66C3A8655D0CEB5AF7A37D23DBBB52D05CF6FCBFFA7C7491703349819AD94CE218912557D6C87937B2E7B0473856EC78713C29A02CF7B2B38E0DFE16804AF6C2BA8607026892138011E06B4AF179D63DBD97CB917B6507B798E58D74F485D3F063C044211E428FBFFD5AF2D7941900299602D3B15D5D600B435D9A21948B8D87A35205A3AF9AA9BA491D56573A93C35AF6683655E04A7A17F1B9709ED83E70D82A3DF59A2FB7C051ABE508601F322FFEC089C49DC666BA04366C038AD59D397022F0F6344255F4D98BBB17120441CC75107005A74DB35459C63770547A4AFE59F2703894DEB67612448BA7C4F6FEADC1717F6ACE410C6BE62AC319CD33AF285D17D55F500E364A0ABE71D357AE0802AF464B6D2732F3FB94BDB3BAA497F2E44727BDCCA5A4B65AE9DF189FF1AC640940FF4D479A8072D34ECC523DC8FC7C87FC89A540485AE7BB3F29B041446CA427C0B48CA7515A1E31788E8B53E1122D372B6557F8D2A97CDE893B20E60283954E2934AF340A358A4376DD0CFCBFE305A2CE7B72DCFE2DE105CF44833F548D1BCE88D34B60BD29B69309DD87F4B91DE10EBDD7D7F87D6231307D0AC784E0496DB725AB97656C34E60B34B230F37E30FE326296C4E1BB88C0BAC261DF0E5F45E6E126103EED6B1CA146D58140A8893D847E92D9F3A0A883E8BF830147CEDBDC7DD42C1A58A826A8A827F9AB26ECCF64F68E9CA6B68261260B659B47E0DEDBF5B077982B24ED9B36E8466DCB21EE69B5E2BCCC49A163B4860EC2CCBD65032776DAE601E18ECDAB8E35C2760D5758592F6CC074298A97FC5E82E7DA84036FD10E0725A0E4E58CC4DB30499ABEC0C7D95D88BAC2C58EB093312779BC1B8619FF2762FD1FF009273456D829394664C31FF6D7848B27174B36E59FB65D6BEF6D974D5038A28F49AD465B28857CC12BAAFFABF3652C2E22B46B040E579FB040A0FB4B1DAF0C157D35407C0B78E305CEEB232E7B7426C95639B1CF7B079E80521FAA538E51E69255576650C3A16E143D0F815D2CC89EB00AA13AF20394AA23CC6AA99A9F297D886AB9AF2655D53816E066A02CF21C277DADDEF3D7D0825D094FD8FBD5386139757EFD0B7F8501829725A4B70FF1DABF2958E07ED21DB76266A88483EE7C51A7D215E1B41D2464911ABBB1DC71F9613ED5446E4B0C97BDD47F22B372FB7662956FDCF3B108E0107F74301A054FB004925B041AF354C04C20FD370CE1A014EBEBD8311F3265A2F78B48124521A4AAE240D3BA9F94FD33CA4A92D24A029E0754831869B58F670435A44DCDD7BF75ED9FF06DBA52980DCE49C1C26BA0965DE3623F459E36127AC6AFAD4D5598FC45A95173D039CBBE2CDC7DAB2865FB6BC0FA8DFD33C4A826CFC77BB7F45CB5AA73377A27271AE41630DD3D4E2722581537FCFB233E5AF8F04CA824012B5C429EA498F4AD44AFC249DE2229FD7266FE84173A5CE44632B3650D6E1F278625D564B374C10C1AFA3F17432CBE4B65327C6B6E0CD2F99B68AB043C5C6C99D7FE7FCF940F4887D309D7BC0FFAA5DC4B90C79266514F46CA2D5477F2B84B04E30DCAFD0224170FA6D4BA9AD2A6DFA8ED73DFF9D5D40D43F02610032719A7C5646CCD453CEF409B4325F3FB6D9B9201FB115E4DFAA0B4D29959A44518774E94B2D4D6D06C7F065973BECD203F5CF6CB59F869340EC6BAF0121049DB3E1146234CEE4657C1B821AF817DA27BD4C9B1103C81F5B5161E6A9329D83D6E4DAE1F3299858CD201222D34A85E2991BDCF32E9771F3E701897F647D62729C9805CBF118C9FA727B056A7271A23181B92F033DE1EF113A856A884AD527B8DEB92085AF3DB509FDB0265FBA3376B31BF753DFA477DD5E247D939109F31CD430A692BCEC4D9FC7C5B4630CAB90C64B75496BC7CA54D5621FE3315AD03EBF1AFD6D436BD2DBCBE707B35F916CFC147BBB5B8AD2E80ABD692834E42E0724C8B901F5924212C4129F7451B9DD860A85855D1AC59F0B6B87A66B6A395DD81990AA3DEBF64C91CEA6862B5793BAFFF81677FA2928E950D94A6333B0E77A15AE461E710BE70AFCB9FE6E0C21C5AD188E439A6E5138A2C5AD17126E759D48491E3F3F93F81EEB77B7B3A6ADD96917CF0BEEA202EEA5ADB3D5593A3DC9FF1F8F05DBF5A2707EDBB6640EFF5B65A0003CCED2EB480942A13C1F1CCDF9994F1D11DBEF0D3BA7C3801AA508C17BCF287A928B635F475195D88ADF9F4C1CA7D3D1462DFD0F6939B89E5ED95F177BBB12253391876492BC01AFF1C1DAAF0A1C7821C2A4E33F52BADF51987E010B391FC984328E020206EE98E9C8E6763120055F99725E48356FD800E11CE973D00C800C353A5DF8B028E1E42F817C7433084C440E47532FC639172533DF35F0FF43257841C3E4EC7DD7F601EAA81E9886FA3253844C195A62F89FA5D292536BE8CACD80C94BBCD1A83C985936353C9233E512431A8863D7D8340E89307547BD10B16BF2C7E0BB01AB8093C70E4F4C8FD30608FA14FF072D81048391C07DDD82475A280D4EDF81F739AD1A13BC6483C3C37BF52ED52CE8D568AA81864ACABE225BC6467C79FBF43781F29B0C508E6825D4E56D25E45A8C0C6298765069FDCC66B2C5492FDDFFF69D6F5975FCD81041F30FFD7813BA3219B3139583EB588DDC57851E581FBD5E20127EBD +pk = 4E9A65642E8E655EDF00F0EE8E89F1A3B5B21458B8ADB60168F6FCEFC3DF3E02F133D77A2B0DB58C0708BF24771C61D7419EF30EFFFF4D608618FBBCC048560202 +sk = 4E9A65642E8E655EDF00F0EE8E89F1A3B5B21458B8ADB60168F6FCEFC3DF3E02F133D77A2B0DB58C0708BF24771C61D7419EF30EFFFF4D608618FBBCC048560202A12E77A060DA00D8137B9FC0C45D0F3F2202000000000000000000000000000020986EEFC441896642134CAB31E44C7160FCFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F6F4AF8BA53F20F9C422BC7877D48166AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000023A20DDB380F88D77A565588AB5E09CEF7FC659790DB2EDA3A0060A9AB51C900D77773212BAF7158094F777BCA2BD4217851C51CCD0335B0D79D12E1CD0B6900C5847642405A8974118992B53B8EB4E22319FEE674E0E63BC8F7AD6C2AC2F900463C9847F83B210AB1BBB5C2479C12258734E3784ADC26DCEB3A29A8503DDD00 +smlen = 3052 +sm = B8D6E351991F17E1C25B25B87BC90FF60EAE1DD444850B1154B15F1EF1C24102FBD2D54CBF8AD0E30547178BC2A1476A26C8B817D06E4A87354B5B32720737020000DB28AC90AE9D5A6481BF68D13EFE57A12DD0E938AF620A79BD410FA21C5E549AEDD4412959653392A4E7A45B02A724F11E4BE5FB6E39C6B2D12531EDDC089798778DB8FF10F9B449B3398B82D15E9C000B0B836254422C7D13F1120012FB9CC7CDAA1D8B72F6FA3943AA7DE75263D3DF814BBF2E80C3A204BC0F9AE33E4FA82CE893D35C57E41C7147602BE12455B00B7949A3195264A3281CECC3FDE34802B28C6E1F2B505AB6087D453BD6AA067B2370124840BCAC4605EE4F14EDFC4B4FF19A4D7A828E60156B49B4027AC18DCCD20294F89CCF03D0CF47BB2F22D3749EEE69EE17AB5D8E4DFCCF36824D23E3F95E959D0494FFBC712CE3975E3A661B3F9E149A0234F691C2D820000DE97CC016C43EFE958DA469F740610FD22B64D4BD2E30075E22BCFD4AB41D952D2394FC629F016EE1CD61AAB4581F62A7B8648F8F8CF02462C81023CBE2755C91195A5917FE5A8B5058ECB8DAFF91DD3F73FE38665666DBF79CF6F203FAF94A5CA3F3AFFAA2C2BD5F5DBC011DAF46FD7CEB74B5875E4B5D80B6EDB9817106B91865267E78731662218C8EDE73E588256FB1AD57232AA5533D25BFC54452612F0C2AECAE6DE19355E1D508B888D18FF9F6D7D68199755CF5C210172F65342269ED96C77D80AF8A244B43A99DEB49B97A6F358AADFCFF6AFF72AB39540D375165185F31E0F1A6F97722EE365620BC5D642F8CDC59F7E84FD8615F4A336ED340BE6ED8451997D87B7904C1B9A3A0BD1F8A01AFD6A2D9F5B995E3FD0D44DF8FBC8389B6CBB5537816C91F0EFC3D2349F15EEE747B254C5BBF9418BB979294423DD6DE4D13484408362582A86D082350CC79EBCDCC05B70110A038736034CE4F3DC1D17E5D11C9C7620D40730B61437906933193D1272F7C89C701D495ED682F1335B7E1C42C994E090A67D932A8E825F4B9EDA8F2A94B9A1F11F10E91396908A9D436DD01BAE1D1DE2C6ACF458C0880E3F81ADC2240A99E6083C9C188982713DB243028AB07DF407218CA6B3C4C93989AC96D92375834B915B724F2A105D6240E52B9D7003C67FF76F7A325D84ABBC229266BB40D1DC8784CE1A4A6BD17972CDB26C274B06337D525F61B5BF952D23FA13757460B7B8A3B99EB023831F4FBEF72D62931348622041FFD12634947579BC6E16BD1EAA8E8B2DFD54D74EFCED79EF4FF31AD42036DEBD0FDA3B7F3F8E7A3F45955F82936A67122CD42E38AF646CF565E294F422FAC1E7D274185896F58E9D0FA1FCD3F4D379ECF5B566586246216556939BDF86D6A417C3BF77C64F95D7DE8197EE25B44EEF00209D33159710DF001372C3E3D09F24B9B08B8938C522690674A7588933E1CA37D2C14DF50777806EF6FD2285771A44F6DE90475C6CC314DF140C3962DD9D70C54E58CC5FA3302D69C80C6511D9D42A51B7CB7FD7FEA8D8BD65A66FDB2AC80D945FB7EC72E138F5566CEB570968D84B60068DF20C6CDA2AD48372DC97424793FEA8D2136923070C25F47C3D10839D1747B613B93530968D5E97A3FC0F563BFFCDE7B42C839EFE66C3A8655D0CEB5AF7A37D23DBBB52D05CF6FCBFFA7C7491703349819AD94CE218912557D6C87937B2E7B0473856EC78713C29A02CF7B2B38E0DFE16804AF6C2BA8607026892138011E06B4AF179D63DBD97CB917B6507B798E58D74F485D3F063C044211E428FBFFD5AF2D7941900299602D3B15D5D600B435D9A21948B8D87A35205A3AF9AA9BA491D56573A93C35AF6683655E04A7A17F1B9709ED83E70D82A3DF59A2FB7C051ABE508601F322FFEC089C49DC666BA04366C038AD59D397022F0F6344255F4D98BBB17120441CC75107005A74DB35459C63770547A4AFE59F2703894DEB67612448BA7C4F6FEADC1717F6ACE410C6BE62AC319CD33AF285D17D55F500E364A0ABE71D357AE0802AF464B6D2732F3FB94BDB3BAA497F2E44727BDCCA5A4B65AE9DF189FF1AC640940FF4D479A8072D34ECC523DC8FC7C87FC89A540485AE7BB3F29B041446CA427C0B48CA7515A1E31788E8B53E1122D372B6557F8D2A97CDE893B20E60283954E2934AF340A358A4376DD0CFCBFE305A2CE7B72DCFE2DE105CF44833F548D1BCE88D34B60BD29B69309DD87F4B91DE10EBDD7D7F87D6231307D0AC784E0496DB725AB97656C34E60B34B230F37E30FE326296C4E1BB88C0BAC261DF0E5F45E6E126103EED6B1CA146D58140A8893D847E92D9F3A0A883E8BF830147CEDBDC7DD42C1A58A826A8A827F9AB26ECCF64F68E9CA6B68261260B659B47E0DEDBF5B077982B24ED9B36E8466DCB21EE69B5E2BCCC49A163B4860EC2CCBD65032776DAE601E18ECDAB8E35C2760D5758592F6CC074298A97FC5E82E7DA84036FD10E0725A0E4E58CC4DB30499ABEC0C7D95D88BAC2C58EB093312779BC1B8619FF2762FD1FF009273456D829394664C31FF6D7848B27174B36E59FB65D6BEF6D974D5038A28F49AD465B28857CC12BAAFFABF3652C2E22B46B040E579FB040A0FB4B1DAF0C157D35407C0B78E305CEEB232E7B7426C95639B1CF7B079E80521FAA538E51E69255576650C3A16E143D0F815D2CC89EB00AA13AF20394AA23CC6AA99A9F297D886AB9AF2655D53816E066A02CF21C277DADDEF3D7D0825D094FD8FBD5386139757EFD0B7F8501829725A4B70FF1DABF2958E07ED21DB76266A88483EE7C51A7D215E1B41D2464911ABBB1DC71F9613ED5446E4B0C97BDD47F22B372FB7662956FDCF3B108E0107F74301A054FB004925B041AF354C04C20FD370CE1A014EBEBD8311F3265A2F78B48124521A4AAE240D3BA9F94FD33CA4A92D24A029E0754831869B58F670435A44DCDD7BF75ED9FF06DBA52980DCE49C1C26BA0965DE3623F459E36127AC6AFAD4D5598FC45A95173D039CBBE2CDC7DAB2865FB6BC0FA8DFD33C4A826CFC77BB7F45CB5AA73377A27271AE41630DD3D4E2722581537FCFB233E5AF8F04CA824012B5C429EA498F4AD44AFC249DE2229FD7266FE84173A5CE44632B3650D6E1F278625D564B374C10C1AFA3F17432CBE4B65327C6B6E0CD2F99B68AB043C5C6C99D7FE7FCF940F4887D309D7BC0FFAA5DC4B90C79266514F46CA2D5477F2B84B04E30DCAFD0224170FA6D4BA9AD2A6DFA8ED73DFF9D5D40D43F02610032719A7C5646CCD453CEF409B4325F3FB6D9B9201FB115E4DFAA0B4D29959A44518774E94B2D4D6D06C7F065973BECD203F5CF6CB59F869340EC6BAF0121049DB3E1146234CEE4657C1B821AF817DA27BD4C9B1103C81F5B5161E6A9329D83D6E4DAE1F3299858CD201222D34A85E2991BDCF32E9771F3E701897F647D62729C9805CBF118C9FA727B056A7271A23181B92F033DE1EF113A856A884AD527B8DEB92085AF3DB509FDB0265FBA3376B31BF753DFA477DD5E247D939109F31CD430A692BCEC4D9FC7C5B4630CAB90C64B75496BC7CA54D5621FE3315AD03EBF1AFD6D436BD2DBCBE707B35F916CFC147BBB5B8AD2E80ABD692834E42E0724C8B901F5924212C4129F7451B9DD860A85855D1AC59F0B6B87A66B6A395DD81990AA3DEBF64C91CEA6862B5793BAFFF81677FA2928E950D94A6333B0E77A15AE461E710BE70AFCB9FE6E0C21C5AD188E439A6E5138A2C5AD17126E759D48491E3F3F93F81EEB77B7B3A6ADD96917CF0BEEA202EEA5ADB3D5593A3DC9FF1F8F05DBF5A2707EDBB6640EFF5B65A0003CCED2EB480942A13C1F1CCDF9994F1D11DBEF0D3BA7C3801AA508C17BCF287A928B635F475195D88ADF9F4C1CA7D3D1462DFD0F6939B89E5ED95F177BBB12253391876492BC01AFF1C1DAAF0A1C7821C2A4E33F52BADF51987E010B391FC984328E020206EE98E9C8E6763120055F99725E48356FD800E11CE973D00C800C353A5DF8B028E1E42F817C7433084C440E47532FC639172533DF35F0FF43257841C3E4EC7DD7F601EAA81E9886FA3253844C195A62F89FA5D292536BE8CACD80C94BBCD1A83C985936353C9233E512431A8863D7D8340E89307547BD10B16BF2C7E0BB01AB8093C70E4F4C8FD30608FA14FF072D81048391C07DDD82475A280D4EDF81F739AD1A13BC6483C3C37BF52ED52CE8D568AA81864ACABE225BC6467C79FBF43781F29B0C508E6825D4E56D25E45A8C0C6298765069FDCC66B2C5492FDDFFF69D6F5975FCD81041F30FFD7813BA3219B3139583EB588DDC57851E581FBD5E20127EBD + +count = 88 +seed = DEEE61A2FAC04E4D6B7A250124DFD91518D9B90A71FA02665E3088760BF69CB3CD7B6977F860A7026819D178623C9676 +mlen = 2937 +msg = BD2B4058218A15C008A4BBBA29592079583F684FEAD3E6B3F09ABFF0DBCA23670AE4496077D47945E5F1AC3CD4ADD5763581285D80DFB43BBA9C0730858293FF6A15915AB203FBE65C118B87EA37DFA1E06CBC0F24EBA3F43A8BE17FF1DAF4277CDA2CAE8AA924E852C9D60524B98306927746C4EB26DC9475E8A0D0F920F33E1AFF9D07EA5561E70865B2D8161B86FDD7638E7A72345DD72EE95BAE1EBD2C24D2A5510ABE3FC2CED397A067D215F6088D63FA63F2247427917E5C4FBA14F0A22A04FD0AC1D948507751F3523BE2B0A0CF2F96DC61F8187ADF646D6914667759D49A6DF9A327830EFFC9470CEC6C82EA127A8B0C6510203879FAAC4323145931E146D962846BB1A6E84CB2C31BC686E388C853413EA7D3EBF7C752C6AEC774637EE01F2817A5AF133928AF35F23FC3541FE7FA749A863A048EFED2F8CC2BA86520B97FDE0324C68D1DDDE1E430C30DED0B25664EA676AAC6B1F22925A40B319CAA37DD5DEDB99DE4D963630A6FB0E8B00AD8F2A2B9BCC497A00099A70A9DC190A2AB2A058930E63FD6DF342A625E9A095EE79137CAEB8885117C7A9FB8DF7A35D5A300D6F7EEE40578A7507EDC38A0D6522474E672F156FEDE7E1690C3BBDFF40342F1F3AD3C34325BCDBFF0A68249858C777551683A9F3AF225163C9323A4AD5E666E0A9F44C6496269038AAC5DC2767966C1560C5A09207406F3C47157D2FE5909346D8ACBFDDF3E3D19FE48B7C60E1C8CFB2EAAB19E736B2595D33A0AA034726CB6146A01EBF5CC72EB1182B9A4BCEF90A1AAF74079862CD775F8F773BCC490F6015B4D5469EE0BD95C1A32A1FBF283FCE1FBF6F8CDCFC1884F4D2A899F3E7A95414DE419D56462F502EE703CDBA007C3BB78F20243C35B882C90CB7DE3CAE3F0468079C546645977347BC183FB0A6CD24481391CBDF9372E2D6765B6CAF8EB0145BB269A47A1B4E2CDF9901D6AA284D919BA57163AB9929E715341BACD81F35BDBFF36D59A1EDABFF3CAD2C122386A6335348A3170337B94E4336B2B74E791981656CB5234A6F84DB4142D3F323000FA98BE61527F7548DAB6E83928E9DD2E461F08A5BB52F241BB42254E5746FCCE0F3620ABC69A6E275B5E06A333360F9B809562ED116AA6CC2334694AAA4169310ED6AF695678DE22D3E551DAF61C0A6C5F6C0F36FD3469A3B977F6D295E75ABB804A43E1E7AC4708208A94E8368DCA40856F1D43C9865D98F69F1C0BA9C8B33AC9CCD18D400D2559B1CDD82A0C875B5E136B97C02126C81A81EB5D1E421221564100450531DBD97BDA77C1B0186527ECF526CE6BCD0ADD5668382D984AF9277A21D40C06EB4BBBB0CCD6F64E90272FD632D47A388D301377EE745FBC9CB4C02E1F096DDF303BCA4E1FB4B6DF867676080CDFA6A29CEDD15003EE636DB8C74E7E293A087B1A5F62334585369D12D9876ED0F334C6711146643FD598F0D69BB3475D219D1F89066644897A9CC5630BC84C0CB5844087216038C8FB6750D0968D3D3E2D29D93639486C76DC045900AE1A13529E74BECEB3338684402BBC3EB36870E0B37584E9F309BFB0DD9B966F0BE1298DFE55D1A94A6767CAE5EB3120133B7D7B71C9F2A538A97F8548FB176B0E8923B14AF28AE26306214F1D392AE63C3736B9F9374CA10EBE93370C11BEBEB45D066477F374866C8A7208CE6DCEC404194BB1F833DE0AA4700CA29681FA0F72D98679DC3E1E142852347B01DAA08E5CBBFD242F7223600804E066FB5C98C8358370F5D390898FA44023A30F824F1C6A95B8E23308B4BE474D03E34CF72BE65F90D698DFE0D2828A797BBF8397EC87AB9EE00C76A1C7B3CED0100D3A1030136CAB9A69F05CBE58A4A56A9C700BC591B87783DE59369F2E62D5B885DA09F25835A6DC06F954C19B347724244FDA69E3356A4EF60F6A41CFF3BB7CB22ECB128415CD1B89A9AEC12B66F1EC23B14E7D7FD601EF7B000A0C96F386216F75710EB2C12817DABA1D1295E7535331CB90A9B0D8F7542E73DE2D93FE554063F57274DF27BFB39BC4B78B72A88473408086D8DF531E53B5BE018E076032D1F8EF86D7AFB8E8867B9D7728A25ACFB6856D83592CADA4494977678A9F4D134F49A8598A8E0F23D3B7A09B5308243410CA6F47E0BF8C43871600817460BDEB74E7D32C2FF7C40EA4BF924E795516FF7C7BC8E5FD5D64CC489F1894C6BCF0E9C312B1EE7E2BC68739372E7402E6AA2ECDCA39C18D7441F0FF373946559C475E37D4ADA64B98283E5A64BE7BC2D1A1C148D2CDB4EDA35F591D3A7E7CE15162F50FF1B025F87CBB82289FBE7F9C32DB8F23012CCCB87ACA7D758D42019B9A8C15F508CAC9284928F46F0DC1C1B6C6B4DA030DB9286FF8D3762EA4A83D096AE04F98E9416D3DAC59E04F9E4E4359AD76926BBD9570A3D5811F69A1C4345B646BD946D0168ED62A7A431D920D707D8CC7E840BB9CF13D8ABAE8196D9177E8C28CE0DD9EF647EAAF0D3C97E52CB31B560EA7067B45AEFB5EC2B7C7BDFA3996D1C7E467636BFA1BBE11D1CCF86B64ADE9FAF9287A23502E9FF711CA97D6CC09DE814A67BA6123A8E4E67CF6E8CB6F7B36621BC6192ECEE94D61860703AC8411B16E19644A6AB01813402629AF52301C9D76A94CEE22B1DCA49F13B130028991C8AB383C8461433383DA92AB34F1EBB4124B24C6C391EA44EE6E736BBC7A2D4660A878A600AE39B7DCCAA51ADBE90BD705EA51AD13C05E611749D43DE336D396352CB0673ABCE7473DECB0FC708EF28DCBE18C85EE0068FEF64685ACC3A7D0DA9A21DD0AFB10B95D81F6AE437022218B6094CE35D01248EA85A9EC6FB56A7A2A8453EB03E6CCBEA0F2EADB015D8BE3D09739EAC07AD9E3F17D13E5F71CADFA220ECAE90EA50BEA87B19CA6FC5DF31874D51723BECC80C8845C9EA718454D2817EF8AFD99B63090CBA6C8089AFA78770222FADEE3B3B829CF36A8153EFAF2CF28DC4651FF37A8921E402EF81A0F457FC1802AB06A759BF4071F082BFDC100AB612A4584B5AE19354854101AB0173D7D6A5A0637CCB58AE58978A8BEFD5A2C51D3D53150C336C0C0C2A27B442E2BCE120C4CCF8D97EA4584434A6F48C0245B63B2255BC52ADAD4EDA9279412D70BE457F7DCAC492FE53C06EDEED766B46EBC3419E6DA2A2847251F75C62A5FE7AE74F0DD5AF50A447DA6356DCC828C5F1A2C0C873E57041EB1158296C038B91F2E13D3D4B2887B284384A9ECB8BB378BB311F4ABB19E1B90EB3A399C03BFB4CCB29AAD80C55C1636559FC79A6C894B5BAD8D529BF680631541A45EB0E57BA5B458A05F456C60FBB593DAE90AE549416AF96642A486F10843482AFC3989BBD1E8E4DDF0791204F4B720ABD2D8995C87C8A388ECB14860CF83B7A4406FB6C8C9393475082D24E516C5F1AF91CEBA444D8E460D0695746BE057EA8D76F8C0C80358F3DB2AE5B996272737516EF5E4EF5A1FE5967304CB6D00090C9623D29F0D4BCE8CA3CBD54A30F9597E01E5845C1CDD8777E18C5D5D86492FDD0606F623D11A28DD9F02032E3A378C71B757B52021DCE6CEEC63792CEA24D6DD7150AC8FCFCA6554F7B08A5529D59628D0F35122504DD1542F6291BEDBEE09F81AA744A0F6C6DFCA6207FBFAB6B9E17E8A4040741F6508471E72D227D0FDC50C13F444310245AD17BF819FFBBC4E0485FA68CF1F0A4423F251538F25DA989ABCD008C803D368F626438432569F12D1612370E4C6C971079371081B37D8DF7EE709198AAA2FCBD443B96732AAA4E6924A461B60CA4F4CB13E88D539AAD709A3DB84D2D6D26671A9F3877125B7A358389BBEEA846A32E949DB9A7853DBC7D5ADD92729CE1B5C00680974F3DDC6A8235C7319B6CD1CE5E0B66FE7C2F1115206C42B4C02990D79EFA8BE94927543C19EE93D0EC8811F9330693696C878CFADAA2D56E877D42A3680AB2F6A576FDA7BF7957F781655CC664A0A4A0D16CE34D04D7C98A9E0C93D2E6D42870FE66864660B564ED4F881693D466BD68B6470AF03A5A6E703DBB40515AF5DCA7142C4C8D79F5BE4BB01A1B56BE9D0936396A7EED9A84DA86A4F00DCF676B4942D5DF6E1378EA26D9118A54E17FC623B83AADB417EC82F9AFCACEABBDCFE2F0B6AD4BC1601B4E24F547D61D1C1737ADBCB46D98287372C +pk = 25B57092E9D331D0C4B1CDCC616352BBF09C1FAAE64AB509D19ACAC367D66403ED1C8CC393C85EB142B478DFA1BA4D627B486055418406D1D95DD495D60527010B +sk = 25B57092E9D331D0C4B1CDCC616352BBF09C1FAAE64AB509D19ACAC367D66403ED1C8CC393C85EB142B478DFA1BA4D627B486055418406D1D95DD495D60527010B775ED9FBE896D47DFC11555299A66FB99100000000000000000000000000000010AA28E2693CCA4D3BE0C7CA91E87D0B2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8DC9B6117C91D70D7C55A46CCACC921F94FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000FE34AFC26C18D0CEFF026BD10E11F1A17A25178BB45B391014D3CDF10671E2001DFBA9B23ED8407F79DB6F616AD0BC3CD6A981C3BF9CB5AFDD6C6A3B21D92500F583239DF553EE0B8041909B2347A814A40D0F96575BAC5E31B2461113088E00E457F9EE39ADF570AEA5F127F22369F762C055417C3BECF9228D2C962F13A600 +smlen = 3085 +sm = 2C1D322D9229321A496B9CD74AACC63EF77CF736BBA9BDF06FEE5CE469749A0135810C48CDC7AF9EAB6A8ED745ED8E9351C568E0E03830DC641B757B3C645A0400001526A29902EC30FA320D71F903692794846CFC988CB9967C0C2913F7B63C45F6512E52D993847152E845572856056BC5D107B2F6C667B5A2FAA7C5C3A28C1CA023ABFA4202F8903A342782A237A43A010B0BBD2B4058218A15C008A4BBBA29592079583F684FEAD3E6B3F09ABFF0DBCA23670AE4496077D47945E5F1AC3CD4ADD5763581285D80DFB43BBA9C0730858293FF6A15915AB203FBE65C118B87EA37DFA1E06CBC0F24EBA3F43A8BE17FF1DAF4277CDA2CAE8AA924E852C9D60524B98306927746C4EB26DC9475E8A0D0F920F33E1AFF9D07EA5561E70865B2D8161B86FDD7638E7A72345DD72EE95BAE1EBD2C24D2A5510ABE3FC2CED397A067D215F6088D63FA63F2247427917E5C4FBA14F0A22A04FD0AC1D948507751F3523BE2B0A0CF2F96DC61F8187ADF646D6914667759D49A6DF9A327830EFFC9470CEC6C82EA127A8B0C6510203879FAAC4323145931E146D962846BB1A6E84CB2C31BC686E388C853413EA7D3EBF7C752C6AEC774637EE01F2817A5AF133928AF35F23FC3541FE7FA749A863A048EFED2F8CC2BA86520B97FDE0324C68D1DDDE1E430C30DED0B25664EA676AAC6B1F22925A40B319CAA37DD5DEDB99DE4D963630A6FB0E8B00AD8F2A2B9BCC497A00099A70A9DC190A2AB2A058930E63FD6DF342A625E9A095EE79137CAEB8885117C7A9FB8DF7A35D5A300D6F7EEE40578A7507EDC38A0D6522474E672F156FEDE7E1690C3BBDFF40342F1F3AD3C34325BCDBFF0A68249858C777551683A9F3AF225163C9323A4AD5E666E0A9F44C6496269038AAC5DC2767966C1560C5A09207406F3C47157D2FE5909346D8ACBFDDF3E3D19FE48B7C60E1C8CFB2EAAB19E736B2595D33A0AA034726CB6146A01EBF5CC72EB1182B9A4BCEF90A1AAF74079862CD775F8F773BCC490F6015B4D5469EE0BD95C1A32A1FBF283FCE1FBF6F8CDCFC1884F4D2A899F3E7A95414DE419D56462F502EE703CDBA007C3BB78F20243C35B882C90CB7DE3CAE3F0468079C546645977347BC183FB0A6CD24481391CBDF9372E2D6765B6CAF8EB0145BB269A47A1B4E2CDF9901D6AA284D919BA57163AB9929E715341BACD81F35BDBFF36D59A1EDABFF3CAD2C122386A6335348A3170337B94E4336B2B74E791981656CB5234A6F84DB4142D3F323000FA98BE61527F7548DAB6E83928E9DD2E461F08A5BB52F241BB42254E5746FCCE0F3620ABC69A6E275B5E06A333360F9B809562ED116AA6CC2334694AAA4169310ED6AF695678DE22D3E551DAF61C0A6C5F6C0F36FD3469A3B977F6D295E75ABB804A43E1E7AC4708208A94E8368DCA40856F1D43C9865D98F69F1C0BA9C8B33AC9CCD18D400D2559B1CDD82A0C875B5E136B97C02126C81A81EB5D1E421221564100450531DBD97BDA77C1B0186527ECF526CE6BCD0ADD5668382D984AF9277A21D40C06EB4BBBB0CCD6F64E90272FD632D47A388D301377EE745FBC9CB4C02E1F096DDF303BCA4E1FB4B6DF867676080CDFA6A29CEDD15003EE636DB8C74E7E293A087B1A5F62334585369D12D9876ED0F334C6711146643FD598F0D69BB3475D219D1F89066644897A9CC5630BC84C0CB5844087216038C8FB6750D0968D3D3E2D29D93639486C76DC045900AE1A13529E74BECEB3338684402BBC3EB36870E0B37584E9F309BFB0DD9B966F0BE1298DFE55D1A94A6767CAE5EB3120133B7D7B71C9F2A538A97F8548FB176B0E8923B14AF28AE26306214F1D392AE63C3736B9F9374CA10EBE93370C11BEBEB45D066477F374866C8A7208CE6DCEC404194BB1F833DE0AA4700CA29681FA0F72D98679DC3E1E142852347B01DAA08E5CBBFD242F7223600804E066FB5C98C8358370F5D390898FA44023A30F824F1C6A95B8E23308B4BE474D03E34CF72BE65F90D698DFE0D2828A797BBF8397EC87AB9EE00C76A1C7B3CED0100D3A1030136CAB9A69F05CBE58A4A56A9C700BC591B87783DE59369F2E62D5B885DA09F25835A6DC06F954C19B347724244FDA69E3356A4EF60F6A41CFF3BB7CB22ECB128415CD1B89A9AEC12B66F1EC23B14E7D7FD601EF7B000A0C96F386216F75710EB2C12817DABA1D1295E7535331CB90A9B0D8F7542E73DE2D93FE554063F57274DF27BFB39BC4B78B72A88473408086D8DF531E53B5BE018E076032D1F8EF86D7AFB8E8867B9D7728A25ACFB6856D83592CADA4494977678A9F4D134F49A8598A8E0F23D3B7A09B5308243410CA6F47E0BF8C43871600817460BDEB74E7D32C2FF7C40EA4BF924E795516FF7C7BC8E5FD5D64CC489F1894C6BCF0E9C312B1EE7E2BC68739372E7402E6AA2ECDCA39C18D7441F0FF373946559C475E37D4ADA64B98283E5A64BE7BC2D1A1C148D2CDB4EDA35F591D3A7E7CE15162F50FF1B025F87CBB82289FBE7F9C32DB8F23012CCCB87ACA7D758D42019B9A8C15F508CAC9284928F46F0DC1C1B6C6B4DA030DB9286FF8D3762EA4A83D096AE04F98E9416D3DAC59E04F9E4E4359AD76926BBD9570A3D5811F69A1C4345B646BD946D0168ED62A7A431D920D707D8CC7E840BB9CF13D8ABAE8196D9177E8C28CE0DD9EF647EAAF0D3C97E52CB31B560EA7067B45AEFB5EC2B7C7BDFA3996D1C7E467636BFA1BBE11D1CCF86B64ADE9FAF9287A23502E9FF711CA97D6CC09DE814A67BA6123A8E4E67CF6E8CB6F7B36621BC6192ECEE94D61860703AC8411B16E19644A6AB01813402629AF52301C9D76A94CEE22B1DCA49F13B130028991C8AB383C8461433383DA92AB34F1EBB4124B24C6C391EA44EE6E736BBC7A2D4660A878A600AE39B7DCCAA51ADBE90BD705EA51AD13C05E611749D43DE336D396352CB0673ABCE7473DECB0FC708EF28DCBE18C85EE0068FEF64685ACC3A7D0DA9A21DD0AFB10B95D81F6AE437022218B6094CE35D01248EA85A9EC6FB56A7A2A8453EB03E6CCBEA0F2EADB015D8BE3D09739EAC07AD9E3F17D13E5F71CADFA220ECAE90EA50BEA87B19CA6FC5DF31874D51723BECC80C8845C9EA718454D2817EF8AFD99B63090CBA6C8089AFA78770222FADEE3B3B829CF36A8153EFAF2CF28DC4651FF37A8921E402EF81A0F457FC1802AB06A759BF4071F082BFDC100AB612A4584B5AE19354854101AB0173D7D6A5A0637CCB58AE58978A8BEFD5A2C51D3D53150C336C0C0C2A27B442E2BCE120C4CCF8D97EA4584434A6F48C0245B63B2255BC52ADAD4EDA9279412D70BE457F7DCAC492FE53C06EDEED766B46EBC3419E6DA2A2847251F75C62A5FE7AE74F0DD5AF50A447DA6356DCC828C5F1A2C0C873E57041EB1158296C038B91F2E13D3D4B2887B284384A9ECB8BB378BB311F4ABB19E1B90EB3A399C03BFB4CCB29AAD80C55C1636559FC79A6C894B5BAD8D529BF680631541A45EB0E57BA5B458A05F456C60FBB593DAE90AE549416AF96642A486F10843482AFC3989BBD1E8E4DDF0791204F4B720ABD2D8995C87C8A388ECB14860CF83B7A4406FB6C8C9393475082D24E516C5F1AF91CEBA444D8E460D0695746BE057EA8D76F8C0C80358F3DB2AE5B996272737516EF5E4EF5A1FE5967304CB6D00090C9623D29F0D4BCE8CA3CBD54A30F9597E01E5845C1CDD8777E18C5D5D86492FDD0606F623D11A28DD9F02032E3A378C71B757B52021DCE6CEEC63792CEA24D6DD7150AC8FCFCA6554F7B08A5529D59628D0F35122504DD1542F6291BEDBEE09F81AA744A0F6C6DFCA6207FBFAB6B9E17E8A4040741F6508471E72D227D0FDC50C13F444310245AD17BF819FFBBC4E0485FA68CF1F0A4423F251538F25DA989ABCD008C803D368F626438432569F12D1612370E4C6C971079371081B37D8DF7EE709198AAA2FCBD443B96732AAA4E6924A461B60CA4F4CB13E88D539AAD709A3DB84D2D6D26671A9F3877125B7A358389BBEEA846A32E949DB9A7853DBC7D5ADD92729CE1B5C00680974F3DDC6A8235C7319B6CD1CE5E0B66FE7C2F1115206C42B4C02990D79EFA8BE94927543C19EE93D0EC8811F9330693696C878CFADAA2D56E877D42A3680AB2F6A576FDA7BF7957F781655CC664A0A4A0D16CE34D04D7C98A9E0C93D2E6D42870FE66864660B564ED4F881693D466BD68B6470AF03A5A6E703DBB40515AF5DCA7142C4C8D79F5BE4BB01A1B56BE9D0936396A7EED9A84DA86A4F00DCF676B4942D5DF6E1378EA26D9118A54E17FC623B83AADB417EC82F9AFCACEABBDCFE2F0B6AD4BC1601B4E24F547D61D1C1737ADBCB46D98287372C + +count = 89 +seed = DAB6C05E29342106CC34769BF419ADCC88010C05B57E673A503E63AE7A4EE55B72AB2CA86C4EF57FC8C02D2E0C8694A1 +mlen = 2970 +msg = 4D83349DD620DC2CC0E9ADA524B9BE9B195973A839A042F4342D69E6B38918507A9747FCDD8B751D7C75ABCE2B482B3313D4C74EA4E7A4A91F2E08A059536B651508307B7F4C3AFF5CF1579F90F32BA1E847778673E3956713C14661AFA2D11CCF61FD8F9BC914D4B6E6D09C52AFF7FEFAE325C180147153C9AE1924C9A2B8DE4900BFBBC6797558B000C5ADB9A8DC4CAFB458AD328F19A2C55D5434BBFA7BE5057E56511529709992BD6527E913B46ABE38DBFF90D4AB3C024A66FC0F8FB34AFB96E22535A0EA8F313A087AA65355D7D5989C486E103FD526A7A6D812C0E4D8C081BCCE4DCFBC64B68436739451BE0C4B67BFCA71BE955BA9F9A23C223C7D0FFB1B2196C9C9845B6AF341A363951E2008BDC4F3296DD0E1E3F480F2E4B0EC77A002ECCFDABCC58D24CB0BAA26EACE96DECAA0F6BF1CDE0175AFA65AD5C23C5E71B50DF778208EDBE426AA6E876C12440D7C4FCCB42D039A14509092784BAAD37D9B8EDF186CD4FCB3D9F8B0397E951777D602B8AF613060FDAB6B358302B3FD28437A06694F36CE12A035F09D677E48D077CEFD1676D8FE51541BC19E3A6D6A5D879C4F9EB4713B7C0F3A652F3A05D74DABFF79A302FDAF147531FDD57924F49E52B298219B03D6DF166B481F232FC85C7CF52838969CED2DCFC18DD8C95891C498FB49289D1A982922A0FC02C849AC3BB7FA92CF43A64464D5BD919F75ADA287FE657BF61DC07B3808C0FD0D71EA24DE5353268B2C17C989C29465BA49111CC479F51A8CC623CFB6FF68149E52C77A7D85B5ECCE66C05900AB9957BC7ED39E03649A103B5B6BFEEB168B7C1F30DCA84AEA509FEC2B215DD95558A2708839396552F517A8FDA28C3ED61F84E1B2E0DCDFA708DE50D44BFC65BD4E70260C437C8B5B7158EC7E2301D9C7AAA68E0ADEF89FDB601711AD2998379145B29CE3681B513DC3BA9B2EB668C1B53697833670466E21E767361C0A4362E5B8DDC38EE6A9C4DC5205EB808B93C72FFAFB635B4254E4F4496BACC753C8ED0BCAA88DB683CE77C8165E8DDDE665392CCCD57BC07573D83CB3AA10648281EFB08F92AACD8AB6F9B5D7FC66D29526BD57E421220FFE375B26C61A0DDBD9807022EB3B4B681A43E7719F5EC255C1E19AE6C542D6DEEF3B94B6960C18D0D7C8110B88F995826073B874042FAF97F1FF034B8257418CA269F5CA588223393B0179F9817E08E7212D0D410EA259EA66BC4A00E7FB1190A732BFDBF7ADEA0E4550BE90C3E37BF33BAF436955742A2632AEDE259235702EA2E079D99A22C9755ED34C1E3CCBE746E728A932B1852F692B103112B303033AD3CE1172AA066860DF570D21EBBA51FAB72D5AFC4AE8995F532AE384CCCC3C4A295AF76A803FE076CCC920A80D82A9B614760EC43208579EF5DEE164356D62EA33953E55195EEE9B2E2018E6FD9D19A9F49258702DBAF6EDBFD093919917B1B6734F012E2BEB4F758DD481FB8A8D7796E755C6647501E28862B9F5B16FFA1C5D80DCB07141806FC348881A5A8891BB632A4AE4292A102D71504D0FC12C79D15BCD0799D30C7B9E72625A7DF7DBC7ECF9EACC627CA9AE5D71E264F2F2A9D5DB8593F3A90F3915CE480ADF800C99FC2C8692F2B57B492BF9D84171F8C29AF8D5549F82D3730927096CA18FF0B0C0C0B8B800508C44D5749B92D7D48F7FBD5C86E408ECE0EAE639AF475073DF5CA2CD5083BC4FF8852DDF5C399946A6B21B0841D137F583E0DDA3A6046F082872B783ECA3E14B21A2AF61BB150847026F2371812B1A2BE72024226F4613DA860AC2FFC578DCB171DC27B896EEFE49F885F9BE4CC8766F37038E01CF20DBB661F507B2ECF2B023203A6259B0A018FC00B2CA9B3107B605F04388D5493AE7CC4BDD093CE761A92847C2A167739E0750B427B2ACEB3ABC5FF751A5F32D36B589787D4DA509C85EAD751353AB2C68A9C14B8B2C8166AEB6F27C7F101221C306AAC74AAB6B4E795525FE12038725D7AF3D2A6D60E1EA85F2B94EA24F1B72FED9DDAD4C8E5DA484E80A2150DE22E6ADEF41153D7B4331E8F011A3CD48DAB02876B067312D0DC736E465F99AC3C9C56321507E79ACCF652E3857C749AD92DAD15350A6B4B67229A3905DB18AB2053E2D4F92F156A1D76D0AA891364002C991E632B53FA217AAC1709F37F3402F43B0753361EB2F595F9FAE3D7D96FF050DCA0B9657F4C3AB49EBDBFE8816051C4E0AFF32C5137749D53B062CB61F7201171B5DD716E9CCB38D00E50955596845DFF602200B30D375A854CA4E9A7276CA1A1D9EE92A04BCD78854BE251F7080ABA6D8325D40B37054596AD80211A50AFCC1DBC177600A70E648D8BEB4FCB8919214894CDDAA6D63B6F6C445469A6866721D4BF1117F25DFF9D65FC8FBE5B0ACC8B9039C7F94B2A5CC6068A0489E2E13A731DBE1094FA8558A601ADDB9E4DAB04FA744CD5B95A9D57C52C8124AD950A5944DEE2C55E5C8540DBEE5823DAA624F57FD5BE994BAB3AD4E74EA9443F8B6024BD6B49ADF3972442D88E61E04FE8478FF28916584CCB65FB15686991D5781CB7EDA067745258EA671E0A2665F94FEA1B5490669D1EE8711518BB911094957586C8075E3BBEDC47BE059053A7658ADFA0ACEABDD46E0DD9647B34EBA32E56B6305653ED386C50E79E15084F00F003B1D12504FDD8E47D03D9F7572276047BD22B82B8E81F87C86E6F20D2A756B16F291179A97B010F993C0F839C9A1238CFC9BDE8074405CF1B35DF423C7566CE965681F21C969E4F3F8FDCA72A18D5DAA80287F53B5F8429FEA81612CF63CCF1B7A13512DB4D1DD2678FE1189398032EAEB4368332972C728AD726B7290302C3C5ACAB6E73432E825B9046F846ADCA9D93780A36095AA5C51E354CC6E9A910CABBE59130E98F4ACB3CB6D4EFDA9E2F78748ED58465937FC81C548AD038FDC32AEC46B078CC5A7207658A9706F1C9653359DE6C4457DBFA71D300F98F9BC5DAA14DBDD5EF20DCEDE7E9D3F7DA5C932AC3338BA40E46B17D89FE38F725129991983D4A81321B394F2D7B20D66E3DEAAEB6FEFC8CFF0B68A766E27CCFBA66DEDDB1F541DEB3C1892ED2AD5D073162F0DD06B82E8878477BC96E03101C9B5D9D0ADA10EC060B45E144B31E6B4DE283FD43538B47178398FDD15B01ED421EE2C65847F7A4E9AECE2F1D13971FFC0157040782AD4B591DEA0906370820DDE1000490AB1C27C03D02A0F4B4BFAB0E56D7257288441CEA63175CD6BD11382E6C873154332E627CE82E37C63889EFBD8537AC35C21AD7A09C986CFEBF13B19D5677C1104B373F3B55198D075AAC608145FF9D0C4C12C83BB41036AB32227629EEB4922F172281A66C23C35B8A3E92DE0A10D5E8C18B9A54D6C30230F3A8263986AC535B6BF63EDDAF6A02C9100B712EC4BD49851A22AF0E647F259C2E19B9ACAEB6147C476C90745A353F6252ADE8212A9F7C215C0B3053BF2B4E0AD225E8B344EC14C1B839877349C3743E8337D9C1EB128B06939C5A08F60A46FA700723EB6652FC26440D9BDA3C99C10AD0742C2F039BE6B66749B77E14F8223509365053E87ED870FE3906A16DA6C62945DD2112C96A23942B1E14431AECA7DFCE3FD4D6633E0B661FB34B0BF05C4D21E689CAC9B6ABD9F507F08E4AAB94BBEF1C629C0E1CF344E66D3A3E100B615BF762DFF0CEFC5E4CCE0DD908F46C94E7411A151E713FE0C18ED33C4C03E55E12C0AC366DA5C757C7090E0F94E2C34D93EA3B226ADB2979D23E071F18C2EFF33BCF41BAAF52F4B44E38675DDDEC89C7BFE858BFD1AE70D96D0487972D70F8D8681982656FF734BB6323AA91EA14C6330C71783D235D9F094CB111ABC4990319BBF163891535AA5F870164DA65FFF395DB68B390084D4F2448B98CD56103E49CAAEB6CD040C3ABA8290284E9B2BC423117F4104D89B1B1607C6D34AC30AA9E79D8753B97CAE90ECADA6CAFC6100D3D6D91E20393E0DC95B981FE0EDBCF88E046F74184A96705AC226FD26089468E432D525643293BDA781B64BACBDFD6C7301AC42AED7DBBCE7ABB9D67AF315BCC3509CF03523FC887E27EDCBD7C74DADFD0F126CDB49E28ECAD38080F18A775E6D824C18359935D921744EA72FE293F299B530D9DC9285EF174EE60E2DDFFCCFFE89960BABA90D955CD2C96672513C758142D29A1AD79CA9291BC6782B64717F11A71E6D65A1A71D +pk = A8B39E50DA4B9C4F3CBF6E31CA8F8EAF88D98A6407E333B099B807BFCE22AF041AC69636F9A04548B3892C824265E6D48DA08C9B9EAE3ED4A16A3856D8CF5B030A +sk = A8B39E50DA4B9C4F3CBF6E31CA8F8EAF88D98A6407E333B099B807BFCE22AF041AC69636F9A04548B3892C824265E6D48DA08C9B9EAE3ED4A16A3856D8CF5B030A4FC369472242A02F9CE0602C372A400987010000000000000000000000000000EA194A1CD07F21A768A124FFF89821C55DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D708B59CCAC8993AC9CF96840467AD704FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000DB892A6A2A2B7BCEA9C223C38798EC499A35B2C8739DF40F58D145799914310000E1E9A8A7FC38A5C92456318C858C444243E3949C145B348E19EEA0C5ECDB00B8FA5A6D363C39CF556999962BB91B7C9B90A63BDE9EF2A16A780F51EFF80B0033FAD87ADFD46393FFA6A93B5946B4D0AA31D1921E12DF662AB27C2C9FDC8F00 +smlen = 3118 +sm = 734D622EFB49990B197ECE13EA33E4157E84B5CC58483996E84FFD00BC89CB0137946EDB39D92B2497B19D1C49C2B7A6C0EDACAF1CB5B5C0D72062E9CA2F8F040002E3AFCBB73A3690485843536A90FB4B930E3229A6A3D2515261198CA4873AF19083BB421E11CC131725C173D98383CB1DC24F5602FF62636B5699A70EAD96B49A625B345C540577F858179920790E470217114D83349DD620DC2CC0E9ADA524B9BE9B195973A839A042F4342D69E6B38918507A9747FCDD8B751D7C75ABCE2B482B3313D4C74EA4E7A4A91F2E08A059536B651508307B7F4C3AFF5CF1579F90F32BA1E847778673E3956713C14661AFA2D11CCF61FD8F9BC914D4B6E6D09C52AFF7FEFAE325C180147153C9AE1924C9A2B8DE4900BFBBC6797558B000C5ADB9A8DC4CAFB458AD328F19A2C55D5434BBFA7BE5057E56511529709992BD6527E913B46ABE38DBFF90D4AB3C024A66FC0F8FB34AFB96E22535A0EA8F313A087AA65355D7D5989C486E103FD526A7A6D812C0E4D8C081BCCE4DCFBC64B68436739451BE0C4B67BFCA71BE955BA9F9A23C223C7D0FFB1B2196C9C9845B6AF341A363951E2008BDC4F3296DD0E1E3F480F2E4B0EC77A002ECCFDABCC58D24CB0BAA26EACE96DECAA0F6BF1CDE0175AFA65AD5C23C5E71B50DF778208EDBE426AA6E876C12440D7C4FCCB42D039A14509092784BAAD37D9B8EDF186CD4FCB3D9F8B0397E951777D602B8AF613060FDAB6B358302B3FD28437A06694F36CE12A035F09D677E48D077CEFD1676D8FE51541BC19E3A6D6A5D879C4F9EB4713B7C0F3A652F3A05D74DABFF79A302FDAF147531FDD57924F49E52B298219B03D6DF166B481F232FC85C7CF52838969CED2DCFC18DD8C95891C498FB49289D1A982922A0FC02C849AC3BB7FA92CF43A64464D5BD919F75ADA287FE657BF61DC07B3808C0FD0D71EA24DE5353268B2C17C989C29465BA49111CC479F51A8CC623CFB6FF68149E52C77A7D85B5ECCE66C05900AB9957BC7ED39E03649A103B5B6BFEEB168B7C1F30DCA84AEA509FEC2B215DD95558A2708839396552F517A8FDA28C3ED61F84E1B2E0DCDFA708DE50D44BFC65BD4E70260C437C8B5B7158EC7E2301D9C7AAA68E0ADEF89FDB601711AD2998379145B29CE3681B513DC3BA9B2EB668C1B53697833670466E21E767361C0A4362E5B8DDC38EE6A9C4DC5205EB808B93C72FFAFB635B4254E4F4496BACC753C8ED0BCAA88DB683CE77C8165E8DDDE665392CCCD57BC07573D83CB3AA10648281EFB08F92AACD8AB6F9B5D7FC66D29526BD57E421220FFE375B26C61A0DDBD9807022EB3B4B681A43E7719F5EC255C1E19AE6C542D6DEEF3B94B6960C18D0D7C8110B88F995826073B874042FAF97F1FF034B8257418CA269F5CA588223393B0179F9817E08E7212D0D410EA259EA66BC4A00E7FB1190A732BFDBF7ADEA0E4550BE90C3E37BF33BAF436955742A2632AEDE259235702EA2E079D99A22C9755ED34C1E3CCBE746E728A932B1852F692B103112B303033AD3CE1172AA066860DF570D21EBBA51FAB72D5AFC4AE8995F532AE384CCCC3C4A295AF76A803FE076CCC920A80D82A9B614760EC43208579EF5DEE164356D62EA33953E55195EEE9B2E2018E6FD9D19A9F49258702DBAF6EDBFD093919917B1B6734F012E2BEB4F758DD481FB8A8D7796E755C6647501E28862B9F5B16FFA1C5D80DCB07141806FC348881A5A8891BB632A4AE4292A102D71504D0FC12C79D15BCD0799D30C7B9E72625A7DF7DBC7ECF9EACC627CA9AE5D71E264F2F2A9D5DB8593F3A90F3915CE480ADF800C99FC2C8692F2B57B492BF9D84171F8C29AF8D5549F82D3730927096CA18FF0B0C0C0B8B800508C44D5749B92D7D48F7FBD5C86E408ECE0EAE639AF475073DF5CA2CD5083BC4FF8852DDF5C399946A6B21B0841D137F583E0DDA3A6046F082872B783ECA3E14B21A2AF61BB150847026F2371812B1A2BE72024226F4613DA860AC2FFC578DCB171DC27B896EEFE49F885F9BE4CC8766F37038E01CF20DBB661F507B2ECF2B023203A6259B0A018FC00B2CA9B3107B605F04388D5493AE7CC4BDD093CE761A92847C2A167739E0750B427B2ACEB3ABC5FF751A5F32D36B589787D4DA509C85EAD751353AB2C68A9C14B8B2C8166AEB6F27C7F101221C306AAC74AAB6B4E795525FE12038725D7AF3D2A6D60E1EA85F2B94EA24F1B72FED9DDAD4C8E5DA484E80A2150DE22E6ADEF41153D7B4331E8F011A3CD48DAB02876B067312D0DC736E465F99AC3C9C56321507E79ACCF652E3857C749AD92DAD15350A6B4B67229A3905DB18AB2053E2D4F92F156A1D76D0AA891364002C991E632B53FA217AAC1709F37F3402F43B0753361EB2F595F9FAE3D7D96FF050DCA0B9657F4C3AB49EBDBFE8816051C4E0AFF32C5137749D53B062CB61F7201171B5DD716E9CCB38D00E50955596845DFF602200B30D375A854CA4E9A7276CA1A1D9EE92A04BCD78854BE251F7080ABA6D8325D40B37054596AD80211A50AFCC1DBC177600A70E648D8BEB4FCB8919214894CDDAA6D63B6F6C445469A6866721D4BF1117F25DFF9D65FC8FBE5B0ACC8B9039C7F94B2A5CC6068A0489E2E13A731DBE1094FA8558A601ADDB9E4DAB04FA744CD5B95A9D57C52C8124AD950A5944DEE2C55E5C8540DBEE5823DAA624F57FD5BE994BAB3AD4E74EA9443F8B6024BD6B49ADF3972442D88E61E04FE8478FF28916584CCB65FB15686991D5781CB7EDA067745258EA671E0A2665F94FEA1B5490669D1EE8711518BB911094957586C8075E3BBEDC47BE059053A7658ADFA0ACEABDD46E0DD9647B34EBA32E56B6305653ED386C50E79E15084F00F003B1D12504FDD8E47D03D9F7572276047BD22B82B8E81F87C86E6F20D2A756B16F291179A97B010F993C0F839C9A1238CFC9BDE8074405CF1B35DF423C7566CE965681F21C969E4F3F8FDCA72A18D5DAA80287F53B5F8429FEA81612CF63CCF1B7A13512DB4D1DD2678FE1189398032EAEB4368332972C728AD726B7290302C3C5ACAB6E73432E825B9046F846ADCA9D93780A36095AA5C51E354CC6E9A910CABBE59130E98F4ACB3CB6D4EFDA9E2F78748ED58465937FC81C548AD038FDC32AEC46B078CC5A7207658A9706F1C9653359DE6C4457DBFA71D300F98F9BC5DAA14DBDD5EF20DCEDE7E9D3F7DA5C932AC3338BA40E46B17D89FE38F725129991983D4A81321B394F2D7B20D66E3DEAAEB6FEFC8CFF0B68A766E27CCFBA66DEDDB1F541DEB3C1892ED2AD5D073162F0DD06B82E8878477BC96E03101C9B5D9D0ADA10EC060B45E144B31E6B4DE283FD43538B47178398FDD15B01ED421EE2C65847F7A4E9AECE2F1D13971FFC0157040782AD4B591DEA0906370820DDE1000490AB1C27C03D02A0F4B4BFAB0E56D7257288441CEA63175CD6BD11382E6C873154332E627CE82E37C63889EFBD8537AC35C21AD7A09C986CFEBF13B19D5677C1104B373F3B55198D075AAC608145FF9D0C4C12C83BB41036AB32227629EEB4922F172281A66C23C35B8A3E92DE0A10D5E8C18B9A54D6C30230F3A8263986AC535B6BF63EDDAF6A02C9100B712EC4BD49851A22AF0E647F259C2E19B9ACAEB6147C476C90745A353F6252ADE8212A9F7C215C0B3053BF2B4E0AD225E8B344EC14C1B839877349C3743E8337D9C1EB128B06939C5A08F60A46FA700723EB6652FC26440D9BDA3C99C10AD0742C2F039BE6B66749B77E14F8223509365053E87ED870FE3906A16DA6C62945DD2112C96A23942B1E14431AECA7DFCE3FD4D6633E0B661FB34B0BF05C4D21E689CAC9B6ABD9F507F08E4AAB94BBEF1C629C0E1CF344E66D3A3E100B615BF762DFF0CEFC5E4CCE0DD908F46C94E7411A151E713FE0C18ED33C4C03E55E12C0AC366DA5C757C7090E0F94E2C34D93EA3B226ADB2979D23E071F18C2EFF33BCF41BAAF52F4B44E38675DDDEC89C7BFE858BFD1AE70D96D0487972D70F8D8681982656FF734BB6323AA91EA14C6330C71783D235D9F094CB111ABC4990319BBF163891535AA5F870164DA65FFF395DB68B390084D4F2448B98CD56103E49CAAEB6CD040C3ABA8290284E9B2BC423117F4104D89B1B1607C6D34AC30AA9E79D8753B97CAE90ECADA6CAFC6100D3D6D91E20393E0DC95B981FE0EDBCF88E046F74184A96705AC226FD26089468E432D525643293BDA781B64BACBDFD6C7301AC42AED7DBBCE7ABB9D67AF315BCC3509CF03523FC887E27EDCBD7C74DADFD0F126CDB49E28ECAD38080F18A775E6D824C18359935D921744EA72FE293F299B530D9DC9285EF174EE60E2DDFFCCFFE89960BABA90D955CD2C96672513C758142D29A1AD79CA9291BC6782B64717F11A71E6D65A1A71D + +count = 90 +seed = 0CAF47BD9AABD7D09FFAD404449BBAB2E1D48E80AC78550831A365BED8765420DBBE9A566EFDF20D4E5233D7848582E4 +mlen = 3003 +msg = E0F434DFA04EC225FF6B6DB802A047E221BC064E5BE89A5FC13937AE9D3F22B4439BB1C1BBA01547A64AB3E810BBB09706D01959E2E906A69FFDDF0C56726BDB58FB039D66AC5D77C7F0E9A8617B0C69176770DA328D38171F39B5220279186250139922C0DD0F7C3F96D48615FC66DB7568810931D257B230258FFE9CB35F87859E08139EBF7432E948EE3F962BB9015CACB8499BC69597ABAE4B841B606657E2E3C51FF5A8961AD42177A9E73950E3FA150439E2063B6555624A6D8E3AF4FD5710FBE722B8C6267BA5DF56846A085C56444573D692D5412CB70E443761751E58C41953BB9FAA3CE1F4564C825A02F0E1339CD659AB1480804DD2E90E3086AAA292DB39C6E2AAF1B001B47A21CC721C0C502C46EF0479BB7D8CBDF8E9C136397FEBC2D83C0FDBB3ED4FA6868068477206A26D2B7E0D20507AECB2756B888FCF5B446217DE14EE6A20CF7E7B732FAB22CA3ABBE81B2BE18463ACAA3132773ACD7476460536111CDCAC98B1CC9B2C36AEB3FB318340F7397B4B4AD6AA87EAC94AB7D98CC12EA5606162877465FA2CAD276CBB5D36C40A0B014C53D2D3A96825E237342DFEFAA6B9456B5FF1DCA859C5976F77C3D3CBC9DF355237EE9B4B4C90A9DD941294431DB76DBB539DC48669E7AAD21808332C8A4FE98B8F043FB756B526890452FA3C3527FCD584CD33E38FF9FF783538D39A184B7B3EB649E1C04C289FB65998F6CF5D5BBB0609FC3403D85C6DF269017032CD24AC540E1B294BDD3C3A0C7117CAB02B1A0063A174FF26FCDA687433A667322320C0DEC1EA3963F3B14375882B3478AED43C2C74DEBFE3A734F8B1A5CF92007F8FB627CC3AAD5C6AE4C31846B72E7573041270FF40E762C0F8DBCEB7512D44DC260A97D5CA7D60699981ED8476D8651C35C8ED498FC2961D1E38AF46F3653630773209A63838A9222B813C23DB0CF4196D6654126BA2B1840A7180E653B3D6E10C4C7AC3CEE93B0399D918A52E59F0215B09A119E634E6E8A9886C877F157BF7B7DD827ADEDBAF03C718AE037C0B262588171839E952721DE72180F8EED00B01F53E098B82165199C53129576036FC753A3D33AEC92060DD19AA078A496A2B214B1BFBB747A1EC64071B0A078D74D0212E6203C9698C7449326A42BCBBE8D9501DB916C64307D5F1083BCC36C0FFA18C0E4410B0B17D443481C3673D17BBD7A366A5FD1C3C5B3391A02EDA7596B4F869A91A32B5A02A05611371231BE035EDC716F534724B5225E1A72A2B2CD357F4C326F1DEE963FAB680721D40DD70B750A019E70885515F43946A0DD3DD042969139F61ECA0E9EE3107D3D28AC606AD53F236303E1FE986C38825318B7C4597B14E1A83B81295FEF49FD0F2C1E14A0B146540D853DB9706CD224B376343317BF7330B0C2721A409B856304FFFE60C24C441D5E2797D4696C0FE046D305AEE93CC6A2D89A81EB19643636A8B424B310034612105DF16516CE9607CC0A2BAC5835642C6FF9572191BC45E44D9B40DA36B607F570AE8C39D490342786F31CE6764F3F7A764665B6CB93E54922C6D89DB566F494E0EE069811AC82E8132F2F388D68490CB1C2172D2979FCE3659D7076B4F457232EB839172963F8C342E2CD18969F086F451D33BB774F3D00E6FA2BE02292F2E5CAD3ADF5DEC28932BD784801E69364962BF39E25455303E1F289052D2F0CD4964E0FFCDE29E7C074E5D57E43739DFA42AAD636C352D363E3A23BDD134BAABC7CD1621CA638DED7DB7051F0456641CA872ECDB4D3C2603DDBBCE16637010E782C4BD5230992E2EE7DD904F8A83EBAA7B4C3CEE15B10794ACE894118304BCDA9E9B1376331D2248B802557AABCF913E95F783715BB5E90A4436E4BDE7D651397A70A24257C39E0516BB1F548DA36C1F1F92A416DC1114107CD863F3BFCB360286E774B21296259756EA6040CB61738EEFE29A67895AC69797C640E03F0E9E731647C2DA93373920341FDFBD50EB6B737BB0D9FDA8EC8784920407D4F41486D8FC616430768D6431CCD789DEFF332B239FFD1900800CEDD9661A55D6D96089007E9089A117F03D7858EB4C3FE2D07E91D8CAB88D2BA5421846069FA6D4E5C9161A140CC3A288100BFBE61C3B0F0E820AB12D8FC54B054A0F4C777052495B45A7D1A883E67663DCF50C2230CA5319AB31CD76435DAE41CE1EE25ECD3FA0C7E83B0168852B2CAB674127CD7BC9DDF9DD4B57EB40128988C7C8994DC6A5FC939FF957F06C70A4056E63331F9AAD254EBF2B8FCCD580285BEA486D91A0C2DBD5823AC8F6846DDABCDE25A2252F8DA1AEB32E6969276BD2A7F94CD7DD3143F3181489272B1589FD385BA844F90E35982B53141DAEAED413054CDB935F3412E31D99C1147079CB487FEEE85E3906DAED18106B8C407BBCB7716EF9D4D34E2FF04709C7457997AD6FADC55A8FA70BC907815805578A11A012C521A1325754CAE2E3F7C9E1FFFDBD4BE31DC534961C318D1A894838E0C33806735DD11E408E500995B86B6ECD20D325347F792A3381D2A45587D9B6AE0AA27533732A6C421CA621AAC42335848D9C0DD89F14EADF2F92EC532756CD5697AD752B6260C598EC9F0E9976A950B22DAEA8B74FCC87F28B5E9ED83C0339E566259ECF06E5CE209065DE87FEEE5D1E9C466004B34583D6AE89B590EAD6A96CD2951705AC764F329E28C996AD6DB05F6C69AD2A39D3EE230F6501F1760AA41FFD936C9DBF20DE3996917322D32B946062A3C27D8BF35ECDA22403AB684CDC680DD166562D018D943369CAEFB9133A4BC4515CD5F9C08E7C22D153F0A7733EB4EB2CD8A74A4C85E40DADEF6858C5927B6EEB2B01E9B7AB02F7048C8869991068B00FC19B9545AB42181DD5CB5488222A402E827F60A8D87B09ECC88350032F998E3C10A88D4733227334812EC97C5E5FA85FAEE1A1E28A58641531B139AA58BEF49780DCEAA408986CF3C40E226C60531945A20F91E5DC31EC86C9F9A0545E5FCB79A13B9AFE9B133867BA7A38152ABC6D9F8EE10090BB71E6ADC6A6C2513B066F2565138BADA60B0BD339F9BE1AADDFC90DD272B4146D0F5830C6A53E295C849C15D001176E7774FCD7619D6EF1A30BA93CFE278AB4806BBF25CE4A4E94163F614E81DFF7EFCB015997F5138E22B80B2B00AD7579CD84DB5D1C7FB16E9E8C5D9A5BA0AD0E0A7DE79C18839D673632F3D2C7DA2062EAE844FACCAF23590B2FBF1861405AC347EB9D723ECBDE54CC96BC4D8EE2178F353310E5D69230C5DB2841D2A06A3A4E03E054D99DEFC6004A6E405FA89B198A901EA1AE9F3112A29F3AEC5698A42794E04D74D761E4AA5AD23DE271969BAF124450F4796DA1EB1C01480436AB0F5D0B1B2E6717DD87EEBF137420961F978896077E40B2D2EBB5664FD8AD89BB9333FDF46C33EF3BED21BCB5B4697451BDACF364F85462F5CB9F546657B4744EDF757DAAA4D3A9A2A6F281184C3576B1DB0B540F3B36310020BC6AC0C6454A7CC8EC1182422B17BDA202729C270194CD6044210D2B98731565812339EDFE5A0DAD79BA826D8C566C7D25DEA9BFF0BADF1E4E5DA2B884966E03FADC51C6D9BCFE877511157201DAB48AED1AB038999E5CC3FE58CCD37D40050DEE92E0BD5332413A7F0118724084EE5545FB51942DF1EF399F734FB9592555B5F32290C53D7E5017EFA2B61E29FDCE90CC3E7C1B0E545425B1D3E1ACB9089DAA786CB0122DB3FF27EA0367751A5462230F0F248147EBCCBA2E16D214E9A0BAEBE989BBA020F95B623CB14ACAF2BE6F157DFDB1E32627133F0D26C7B65A189F39955EE31D9B507B43126B06B9E4524732C8621D2274438DB7ECAF736AB7257CED950EB68BB868581649232793EC83379A16F40781E76F5CC57C48C3F5C2989BEA803E1B63768436D39AD19BB77DB46AAE6E8473ED5DFEC983F49E4B8E7CA6BF476AB2F0272C0C2DBEF1BCB064D7400BFE1B9ECCE13578A20B1D5B48133A74C5C59CAE0115BC3B50574580BFA99D58BCAD336EE2CCA5B7994C784BB90CC8F1B9A0E21B39D5EBA464DE34D46AC0BBE436C2F419D60D8AB13786F9A841B52710D1B49BEC290DE317B66B6855ABE156C07619A4B998CC582E3F54A7F457F1D2839BC3EBAC937AD3EBC6A9E6E845379CF1D66D7C59000E3F6CF6823B005728A95BFB0ACD044EB35D5ADBE8933A3637887CF91EE74BB910FDCBE797B0C6B1B056500542BD39781BDF13EBFBFE949D7BA0B7F31102E63BFC6E22693F97 +pk = 860378DF0E0CEB89C7DCE504F7A11E5972C5FA2ACC2D1BD6CCC4E6E5A5A340008CA5263A93ED461B6845851484F191A6A58C28D5A299EE893CAD160EC60C9B0102 +sk = 860378DF0E0CEB89C7DCE504F7A11E5972C5FA2ACC2D1BD6CCC4E6E5A5A340008CA5263A93ED461B6845851484F191A6A58C28D5A299EE893CAD160EC60C9B01029D93605167B1BD075B35547BB328EEDB81030000000000000000000000000000904C5896C16D70F3688A81EB07489E9402FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFD748F5B2F7D392E506D63651796630B7AAF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000C59786EF654AC794BE0A69A9BA0DC0D2AAA49C8CFB5733A3B1FF663E9CA05900E7605EDC65F5F7610E8888C974F2E24AC4BF6C2705E1E2E91507FC18C3D52400FFA46C71CE142E403D0634DAD4B4CC2855DE037DF51531AD1AD029E2CD070A005EDC1FBB3AC215CF955E5551CDC521C8BBDE444407390EA92D03134043FE6800 +smlen = 3151 +sm = FB2E443082173DD5B782D5FF53F17802F8B80B835D6D8BE6553E8162F3FA7603B8A3F6976FF5162905D3674DDEB60C1A287AE398803ECB62A3089356B91DDF000003771411342F307CEB55D932FB91833A0221EEC9DAF2646220ABCA4BD907B70B833A5719A963170CF6881FD05D23301B435E1ECE53D349F61495DDFDF2050EAFE0738D11993B5128BDF953C789E17E76011111E0F434DFA04EC225FF6B6DB802A047E221BC064E5BE89A5FC13937AE9D3F22B4439BB1C1BBA01547A64AB3E810BBB09706D01959E2E906A69FFDDF0C56726BDB58FB039D66AC5D77C7F0E9A8617B0C69176770DA328D38171F39B5220279186250139922C0DD0F7C3F96D48615FC66DB7568810931D257B230258FFE9CB35F87859E08139EBF7432E948EE3F962BB9015CACB8499BC69597ABAE4B841B606657E2E3C51FF5A8961AD42177A9E73950E3FA150439E2063B6555624A6D8E3AF4FD5710FBE722B8C6267BA5DF56846A085C56444573D692D5412CB70E443761751E58C41953BB9FAA3CE1F4564C825A02F0E1339CD659AB1480804DD2E90E3086AAA292DB39C6E2AAF1B001B47A21CC721C0C502C46EF0479BB7D8CBDF8E9C136397FEBC2D83C0FDBB3ED4FA6868068477206A26D2B7E0D20507AECB2756B888FCF5B446217DE14EE6A20CF7E7B732FAB22CA3ABBE81B2BE18463ACAA3132773ACD7476460536111CDCAC98B1CC9B2C36AEB3FB318340F7397B4B4AD6AA87EAC94AB7D98CC12EA5606162877465FA2CAD276CBB5D36C40A0B014C53D2D3A96825E237342DFEFAA6B9456B5FF1DCA859C5976F77C3D3CBC9DF355237EE9B4B4C90A9DD941294431DB76DBB539DC48669E7AAD21808332C8A4FE98B8F043FB756B526890452FA3C3527FCD584CD33E38FF9FF783538D39A184B7B3EB649E1C04C289FB65998F6CF5D5BBB0609FC3403D85C6DF269017032CD24AC540E1B294BDD3C3A0C7117CAB02B1A0063A174FF26FCDA687433A667322320C0DEC1EA3963F3B14375882B3478AED43C2C74DEBFE3A734F8B1A5CF92007F8FB627CC3AAD5C6AE4C31846B72E7573041270FF40E762C0F8DBCEB7512D44DC260A97D5CA7D60699981ED8476D8651C35C8ED498FC2961D1E38AF46F3653630773209A63838A9222B813C23DB0CF4196D6654126BA2B1840A7180E653B3D6E10C4C7AC3CEE93B0399D918A52E59F0215B09A119E634E6E8A9886C877F157BF7B7DD827ADEDBAF03C718AE037C0B262588171839E952721DE72180F8EED00B01F53E098B82165199C53129576036FC753A3D33AEC92060DD19AA078A496A2B214B1BFBB747A1EC64071B0A078D74D0212E6203C9698C7449326A42BCBBE8D9501DB916C64307D5F1083BCC36C0FFA18C0E4410B0B17D443481C3673D17BBD7A366A5FD1C3C5B3391A02EDA7596B4F869A91A32B5A02A05611371231BE035EDC716F534724B5225E1A72A2B2CD357F4C326F1DEE963FAB680721D40DD70B750A019E70885515F43946A0DD3DD042969139F61ECA0E9EE3107D3D28AC606AD53F236303E1FE986C38825318B7C4597B14E1A83B81295FEF49FD0F2C1E14A0B146540D853DB9706CD224B376343317BF7330B0C2721A409B856304FFFE60C24C441D5E2797D4696C0FE046D305AEE93CC6A2D89A81EB19643636A8B424B310034612105DF16516CE9607CC0A2BAC5835642C6FF9572191BC45E44D9B40DA36B607F570AE8C39D490342786F31CE6764F3F7A764665B6CB93E54922C6D89DB566F494E0EE069811AC82E8132F2F388D68490CB1C2172D2979FCE3659D7076B4F457232EB839172963F8C342E2CD18969F086F451D33BB774F3D00E6FA2BE02292F2E5CAD3ADF5DEC28932BD784801E69364962BF39E25455303E1F289052D2F0CD4964E0FFCDE29E7C074E5D57E43739DFA42AAD636C352D363E3A23BDD134BAABC7CD1621CA638DED7DB7051F0456641CA872ECDB4D3C2603DDBBCE16637010E782C4BD5230992E2EE7DD904F8A83EBAA7B4C3CEE15B10794ACE894118304BCDA9E9B1376331D2248B802557AABCF913E95F783715BB5E90A4436E4BDE7D651397A70A24257C39E0516BB1F548DA36C1F1F92A416DC1114107CD863F3BFCB360286E774B21296259756EA6040CB61738EEFE29A67895AC69797C640E03F0E9E731647C2DA93373920341FDFBD50EB6B737BB0D9FDA8EC8784920407D4F41486D8FC616430768D6431CCD789DEFF332B239FFD1900800CEDD9661A55D6D96089007E9089A117F03D7858EB4C3FE2D07E91D8CAB88D2BA5421846069FA6D4E5C9161A140CC3A288100BFBE61C3B0F0E820AB12D8FC54B054A0F4C777052495B45A7D1A883E67663DCF50C2230CA5319AB31CD76435DAE41CE1EE25ECD3FA0C7E83B0168852B2CAB674127CD7BC9DDF9DD4B57EB40128988C7C8994DC6A5FC939FF957F06C70A4056E63331F9AAD254EBF2B8FCCD580285BEA486D91A0C2DBD5823AC8F6846DDABCDE25A2252F8DA1AEB32E6969276BD2A7F94CD7DD3143F3181489272B1589FD385BA844F90E35982B53141DAEAED413054CDB935F3412E31D99C1147079CB487FEEE85E3906DAED18106B8C407BBCB7716EF9D4D34E2FF04709C7457997AD6FADC55A8FA70BC907815805578A11A012C521A1325754CAE2E3F7C9E1FFFDBD4BE31DC534961C318D1A894838E0C33806735DD11E408E500995B86B6ECD20D325347F792A3381D2A45587D9B6AE0AA27533732A6C421CA621AAC42335848D9C0DD89F14EADF2F92EC532756CD5697AD752B6260C598EC9F0E9976A950B22DAEA8B74FCC87F28B5E9ED83C0339E566259ECF06E5CE209065DE87FEEE5D1E9C466004B34583D6AE89B590EAD6A96CD2951705AC764F329E28C996AD6DB05F6C69AD2A39D3EE230F6501F1760AA41FFD936C9DBF20DE3996917322D32B946062A3C27D8BF35ECDA22403AB684CDC680DD166562D018D943369CAEFB9133A4BC4515CD5F9C08E7C22D153F0A7733EB4EB2CD8A74A4C85E40DADEF6858C5927B6EEB2B01E9B7AB02F7048C8869991068B00FC19B9545AB42181DD5CB5488222A402E827F60A8D87B09ECC88350032F998E3C10A88D4733227334812EC97C5E5FA85FAEE1A1E28A58641531B139AA58BEF49780DCEAA408986CF3C40E226C60531945A20F91E5DC31EC86C9F9A0545E5FCB79A13B9AFE9B133867BA7A38152ABC6D9F8EE10090BB71E6ADC6A6C2513B066F2565138BADA60B0BD339F9BE1AADDFC90DD272B4146D0F5830C6A53E295C849C15D001176E7774FCD7619D6EF1A30BA93CFE278AB4806BBF25CE4A4E94163F614E81DFF7EFCB015997F5138E22B80B2B00AD7579CD84DB5D1C7FB16E9E8C5D9A5BA0AD0E0A7DE79C18839D673632F3D2C7DA2062EAE844FACCAF23590B2FBF1861405AC347EB9D723ECBDE54CC96BC4D8EE2178F353310E5D69230C5DB2841D2A06A3A4E03E054D99DEFC6004A6E405FA89B198A901EA1AE9F3112A29F3AEC5698A42794E04D74D761E4AA5AD23DE271969BAF124450F4796DA1EB1C01480436AB0F5D0B1B2E6717DD87EEBF137420961F978896077E40B2D2EBB5664FD8AD89BB9333FDF46C33EF3BED21BCB5B4697451BDACF364F85462F5CB9F546657B4744EDF757DAAA4D3A9A2A6F281184C3576B1DB0B540F3B36310020BC6AC0C6454A7CC8EC1182422B17BDA202729C270194CD6044210D2B98731565812339EDFE5A0DAD79BA826D8C566C7D25DEA9BFF0BADF1E4E5DA2B884966E03FADC51C6D9BCFE877511157201DAB48AED1AB038999E5CC3FE58CCD37D40050DEE92E0BD5332413A7F0118724084EE5545FB51942DF1EF399F734FB9592555B5F32290C53D7E5017EFA2B61E29FDCE90CC3E7C1B0E545425B1D3E1ACB9089DAA786CB0122DB3FF27EA0367751A5462230F0F248147EBCCBA2E16D214E9A0BAEBE989BBA020F95B623CB14ACAF2BE6F157DFDB1E32627133F0D26C7B65A189F39955EE31D9B507B43126B06B9E4524732C8621D2274438DB7ECAF736AB7257CED950EB68BB868581649232793EC83379A16F40781E76F5CC57C48C3F5C2989BEA803E1B63768436D39AD19BB77DB46AAE6E8473ED5DFEC983F49E4B8E7CA6BF476AB2F0272C0C2DBEF1BCB064D7400BFE1B9ECCE13578A20B1D5B48133A74C5C59CAE0115BC3B50574580BFA99D58BCAD336EE2CCA5B7994C784BB90CC8F1B9A0E21B39D5EBA464DE34D46AC0BBE436C2F419D60D8AB13786F9A841B52710D1B49BEC290DE317B66B6855ABE156C07619A4B998CC582E3F54A7F457F1D2839BC3EBAC937AD3EBC6A9E6E845379CF1D66D7C59000E3F6CF6823B005728A95BFB0ACD044EB35D5ADBE8933A3637887CF91EE74BB910FDCBE797B0C6B1B056500542BD39781BDF13EBFBFE949D7BA0B7F31102E63BFC6E22693F97 + +count = 91 +seed = 9564E88F336C091EAD50C893F3EAA8351FA388682F433F7A72A34731020B9C96DFCF75EF5EAE47E12684AFA51EFB49B7 +mlen = 3036 +msg = 2601A39B6D7D91DE539EF11C3B67AE3EB1607716F587BAD5F60D311A9F4FE7F04350CA085EDA6D41C4BB6C6E13E376BF8A314DDF791AE18BE2EC0544AFD3CC27BDF270C4550E9E78D497B92349AC07755BF9167B2958BDE919123439D6F49C3408E8D88021E668A0A5FB6799330188E35EC5939B77097E3737C4F664D01D85FAAD0F583B3E95EDE125587E2A79991750D5CF804325C72DC8DDF3471EE8FDE02519D2D0CA7EDD651EEE30B3BE335CCF7FB02059BC3A47EE3C056D4929EAD4FCD82C8CF49625D5DA460DAA299718556BF0F77CC5CBADB99B64C8EAD4474601FD5C79309D4E63AAC392853072619EFD7B958F0EBDE5CBD40ACD57DF269A8810776D6DFF2E637EA57ADBFAA08DF8D2581C38CB262DBB4D1F3C65A4FA068539D2056E08DCF03BAFF006EDC688023A20728B227A99FED3B8F2BCBED2E3E6ECD8B8665A2E4D233B78D7C33F6E3BD9D0A24D13C8EACCCB53A21DDA9E7A34F9A0F031091E65F749C9EBCCF3DDC4097A121D8C68EB7883405EE34F6A8B0208EA8D5A3FAB53FE2CAD1110BFA6E094F78D5314880BB67BFDFBC2DF8AA250F1D7200FF9A3247C4976DBD1BBE99DF02A3F246E5D466F85ED2F68E0B2DE06B0F2448A7B98FBCBF5872BCAE71BF0DB4E70105B020FF130141E8DE86DBE05B7D2A234CE2EA83A38E23A262E46FFBC837E8A71F657E443052E9A49DEA4E344D497DD2DE2AFB4009D681F232BFF4FEEB173546CBCC4C80C9F85B1CE125BE678E5EC62EF04433D55D4B8829B01AC165A440FCD6594F2C0CB456C8A47444AB05A0F0717B8185930D9738E885D24DAB98E11ECFF7D7A48A4527F94FC4C9D1B9D71F5E6BB39CF92B1A6D0509FFFD42E77AC9AD6F50F8FC649B96B8AC08673F78AE8D0BA2B7243452B33AAC44B06A2B9BE1AD6A12583D3590A3F9AF0E0DC35DA88A257170D315F32F3A889601D6729433B7ADE0F719386723EB2A008634749F5253CB7D9B2FC99A1AE1BBBE7F00A536CD38F8A7237D3992C3897DF412F5B1D45E1EF5B5DC974D49CF8DBF785160BC527543458FD9378B3D4D3124214AE5676185794209AD0EE73B063CBD5B7830D00F817CA0D5CBB597C44D28E4885D935B7BF426C1339C500DAF4F2033FA6A27A4196F233256650472F205D2C5E00E7087FB73027B0C6C9AC5C1D928CCD190B8A6BB33F512CA8E2369DAE6111156DE47A24469683F4721A25652FF87474DFD92A028B3EC5BCFC244CE442752A7DA1DA6C33FC22573BF0B13E371CA9FCC86C76FCF7A1654EEF4442E47399835A06336E62952770C6E61C573CFD07B3AB631B8831FE3F5DD2C6DF68EBF2F8E02EC9F6B90A371ED5E62C8463780AC453AB6F72D38C8F5212C8B650F63B98E3C0886B6A85AE8E7256C1EFB30969532CDBF72184AECBDE2A17B9811DD4222D080049C5D36C532CC0E910779D64AF93D750EE96BDA87562EBD3830FEAD07A3960CD6DE7146603199563693392D3CCE1332DF35C2C8A2C251911D38E95815CE5A4CE5596E2D77711D87CDD54D22E8F0AB431BF8B24CE9C7BD6D077E436543C70B02F338841AF0FB86B5EA4B6A47E27C1D83E1AB06801044F546ADADA437F3CE7D788A1C92A74BA540664658E70D4F2711979153FF1589792859C3BF122628479C7C35EEE951DAB8CDB0D4D150C2DA338346988D34F8C5E589B231B5E00849611BA09711BD3A0516FD515E6C4AE1E8A3657C282C8120C97AA7A2E3BAA22B6EABB8D8212A9A48E7759A9DAAA51B538F662A05FB897067B7CF9D2CEB47A1897214CCFC225CE47CD60E86F7DEA49E220F7DDD6894B30B66460DECBBCB2E42B31F4ADF0AACDDE544B9124EA5ECB04B03C448B17E8094D489F516D23164D2317D3A1332E0500F1423136C8535D69065E880AF34CF7E36DB5FF2C18122E41880585B4D188411E86B370A024BD6E28143EA2EAE52EB46BE334A21A02E21C6755C0182B9A055A7D4C7B056E4930CE63EDC79C9FB4E2FBFFC58F776086F3487F02F8D1E7C8519C7F452E75CE5686A037B3642B95D7526ACD4A81A47112CF96A8DA7548016A22E9359198E871DBCC5852FBE14EECF3CCC5EB2FB5EC31D10474DF7D63482A03E11F4AAA2EAEDB714786E21D03AF1CD644D06BB05FF7B3959601580BF50E5F7F82FF42E9CF2FFCA0C67FFC52CEDC53C7A5C9EFB6C21092DDA374D1CCCBC78BBD9F5EE0FDF6DA6AC60C95F7C2E96F17E3C379A52D5DBD1A92DD76D1F5DFA19EA0408E0E7F7867445445CFA60BCEFC016E68872FBAC9098FD6A8E84731C285570B1BEACCA6F4728958E7924F7A7B7730B9BDC9AAEBD9E045F464071843C650D06C96D487CF8397286F81D93D0CC2008A62EE32421E5231998140909474F6D98541D899EA53714AEFE652A3D792E4C72533332C3133707A49293E3B2E06AE18F2F81D601AADDAF2FD09EC59350E0979A5AE2B721771682A1BFB5748D000F9736031CA971288F34993DF10FC06A16A6DBEED8CDAAA8127F3B71432E723558F0281459820A0F4A75A3B2716F976BDEB88BE9C73F31623050D7C1A96C84988B01D847309E1B6D7B815883F83C9BDB7FCDAEFA8BA69E25B824812B7D54530A3ECC96611897661158DAE1B4AAC112E9AC13D07FDC03DC7D5AF23C08C5E4BBFF737238FD3F1C06F94215BF2351DCE9CAE14B4DD4745AC0CD626054469C6A5286FF821BA192706D47CCEBC443DD67FDDB76797A8B78DD0DAF850CB5D181C82298616E1D3A92F7FC82FD256857915773C7AD97CBB9710373299AE8516B8A1D647A13C7BE848E0269ED6C8A91DC50D0CAD21430A3BC9E718A13D1966A0182D9A24FFF7ECBC7876C868AF2BAF2D8B782172C6719CF140E8CB877FE6D78779E1BB31C70C6C9A6A77529C51CF78A5E4FBD7FF6153B5195817F80603E5C5810C38CF43CA812ECA52F73F045E33DF4E3D04EC8C5F8B4A7399F6CBBF0D39DC951C476B9BCC002720CE89F09C3885673BBA9C90D20DCCCA4A82CE5BEB38BCD60AFE2BA65FCFB01C8793B7ECC0F0B17A9DA74F2E0FEF4C90B5132FD6BAF8C010FCB5E8E7FAEAD7F2E0DB29BFDD1811072623CEE274EF2EFB0F7D4191F332AAF20CF36FF89A2EDF15F7B284CABBBEF46901271D8C1B180F736125C8A44FE164AC7E687E9A58C3B1775238BF1A11F99BCB583D0E3C44BF4F76DCF9496A06F80CA52E24D55B54AB849D3040B4798BF5292B0574672E9F844016A52A4D4E4DAD2053207BC97215BCC1BB93271C03C9AD2DFC7485EE2ED399236AA06CF9A12972E21AFDC587A6334CD1D71A7539362D714BA26214664E3B4BC39CDB1DB847583DB8E002A2AAB451B4E5BD6FE200730BFB2745D03C82B640F4CCF58701708F724EFFDF98CB04C78DF36B7A866CFD596BF5EA18445EEA0E34ED514D0DC2625039049A0CC82711DBBEDCE339C77F9FA1DC60EDDD8D58C8F144B0F3D00227AFD8710BDC66D29809728D7FBE85F08AA38AEBE5605DA29A09CC0526FEE84691EAA54DC3744BF5A95275037FA2F600B1F91E502D5D81AF48F8EC4C1834FE625FCDF2364067048727559047E07062B4D8A7D3851853BF28BE9D2C511451E5FDD9459270328A2612DBFF42E1DD34005A3DA1226A023162F454923C0337E6C74B44BB27A3B1AC82DFD68B0A6DAF93473D97A9E4591EC01A51CB6B47E2C7A85C1FFA73C35E5CE3003BC4534A2D9B16EBF9FED6464CB1E0CC665A451616A62B6A8481E4506A73883198C144A06331224D358196C815C811B103959EDCA35B26BCF86F41D9C7638547496787885EE62B14AF431CAB2AD4E0224D33476C58B8B0833BF13B50BE2B1D682CA7DD194B793AD2C6E4EE25AAF95459302F0B4DAED907A317BCC6A5F8D76CA9AA0D799F8EA39F330D6244BFB9F35E6223A0F665A65F55EAB9BCBAB446D7FCD424DCE87F234864D2C27EE84600ED9193AFEFB6E7681BC94F514FE0748EB32D32262CAB880D79CD4FE5CC963A4F688D448F2DB2DCC5B0CA87AC26DD8506512C100273B8D4D902FC054D48D8BF9EE818AD9619F68A8904B613256DB78C881CEA3373F0CBBAC336A78CD91AD9D60126E05CB8C16E9AA8482CF1B806B2F9C57BC8D63BF008AB2E49EDE8E788BF96B9F1DB2918DC5063F3F1D5B9B1C0327141ACC0B4B248FFDCB8BCC127050D27C805E154A4825DEE6BE9C8D4E42B1F5EFC1EECC6A45DBC119AFB15CCAD19789EAAFA8B1715111AE32E2ACED2278803B60E2FD63A43317498244A7CF7342342B60462510E19D83240DFF5D58E762C093DF326EA503FD347D2A92A5A4680D5E13B305671C729179FA21BE83B0D83144E63 +pk = 7F704FA71FBD4A365415A5C7EB450845C30E43AE685528C5B5C254DA4390C302ACD2AABCD39866FAD0B963DCAD24E00E016E23C7C62FD2F3461C112F1EDAE30202 +sk = 7F704FA71FBD4A365415A5C7EB450845C30E43AE685528C5B5C254DA4390C302ACD2AABCD39866FAD0B963DCAD24E00E016E23C7C62FD2F3461C112F1EDAE302020F0B71012E7DE3AD39F1324C1A34DD52620400000000000000000000000000002EF99BA69F71390145D688E1B3E39C84C0FBFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F772ED1018423731148DDFB5A18715220FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000007D400C60C56D5692FE4ED1D4AB5C9AD5D877A8ED25E7B01BBD6407E6500D8A00F6B730E80D985110FB273656BCA2BD2D7F44369AC9B4D9EDCA479B603B6045008A58700CB7FB9DF32249CDB9FD272675A5F1DB3235446A9D7E705DBC76111D00177D4D275DA1806A07A9952638F0715C6E1670516F241CAC3AA6BB4BF120C800 +smlen = 3184 +sm = 43F8D065EBC1AB8F4F94AE392C91023EF717290EA2A544370131700212B91204092F4068F99332CC52B110578190C124785704309DC8D90CD2A79AEDA79B2A0201005951E5E0FEF5AC9CB7E93EBD1CAE366B25A9BBA1E764876AC37A5257F08941371D6752DCC76623A9512634F00563E336BC506E88BF3FA96A8D21E3D13CFB8102F60DE6BF89AF1022CFBB291AF6FB75030B022601A39B6D7D91DE539EF11C3B67AE3EB1607716F587BAD5F60D311A9F4FE7F04350CA085EDA6D41C4BB6C6E13E376BF8A314DDF791AE18BE2EC0544AFD3CC27BDF270C4550E9E78D497B92349AC07755BF9167B2958BDE919123439D6F49C3408E8D88021E668A0A5FB6799330188E35EC5939B77097E3737C4F664D01D85FAAD0F583B3E95EDE125587E2A79991750D5CF804325C72DC8DDF3471EE8FDE02519D2D0CA7EDD651EEE30B3BE335CCF7FB02059BC3A47EE3C056D4929EAD4FCD82C8CF49625D5DA460DAA299718556BF0F77CC5CBADB99B64C8EAD4474601FD5C79309D4E63AAC392853072619EFD7B958F0EBDE5CBD40ACD57DF269A8810776D6DFF2E637EA57ADBFAA08DF8D2581C38CB262DBB4D1F3C65A4FA068539D2056E08DCF03BAFF006EDC688023A20728B227A99FED3B8F2BCBED2E3E6ECD8B8665A2E4D233B78D7C33F6E3BD9D0A24D13C8EACCCB53A21DDA9E7A34F9A0F031091E65F749C9EBCCF3DDC4097A121D8C68EB7883405EE34F6A8B0208EA8D5A3FAB53FE2CAD1110BFA6E094F78D5314880BB67BFDFBC2DF8AA250F1D7200FF9A3247C4976DBD1BBE99DF02A3F246E5D466F85ED2F68E0B2DE06B0F2448A7B98FBCBF5872BCAE71BF0DB4E70105B020FF130141E8DE86DBE05B7D2A234CE2EA83A38E23A262E46FFBC837E8A71F657E443052E9A49DEA4E344D497DD2DE2AFB4009D681F232BFF4FEEB173546CBCC4C80C9F85B1CE125BE678E5EC62EF04433D55D4B8829B01AC165A440FCD6594F2C0CB456C8A47444AB05A0F0717B8185930D9738E885D24DAB98E11ECFF7D7A48A4527F94FC4C9D1B9D71F5E6BB39CF92B1A6D0509FFFD42E77AC9AD6F50F8FC649B96B8AC08673F78AE8D0BA2B7243452B33AAC44B06A2B9BE1AD6A12583D3590A3F9AF0E0DC35DA88A257170D315F32F3A889601D6729433B7ADE0F719386723EB2A008634749F5253CB7D9B2FC99A1AE1BBBE7F00A536CD38F8A7237D3992C3897DF412F5B1D45E1EF5B5DC974D49CF8DBF785160BC527543458FD9378B3D4D3124214AE5676185794209AD0EE73B063CBD5B7830D00F817CA0D5CBB597C44D28E4885D935B7BF426C1339C500DAF4F2033FA6A27A4196F233256650472F205D2C5E00E7087FB73027B0C6C9AC5C1D928CCD190B8A6BB33F512CA8E2369DAE6111156DE47A24469683F4721A25652FF87474DFD92A028B3EC5BCFC244CE442752A7DA1DA6C33FC22573BF0B13E371CA9FCC86C76FCF7A1654EEF4442E47399835A06336E62952770C6E61C573CFD07B3AB631B8831FE3F5DD2C6DF68EBF2F8E02EC9F6B90A371ED5E62C8463780AC453AB6F72D38C8F5212C8B650F63B98E3C0886B6A85AE8E7256C1EFB30969532CDBF72184AECBDE2A17B9811DD4222D080049C5D36C532CC0E910779D64AF93D750EE96BDA87562EBD3830FEAD07A3960CD6DE7146603199563693392D3CCE1332DF35C2C8A2C251911D38E95815CE5A4CE5596E2D77711D87CDD54D22E8F0AB431BF8B24CE9C7BD6D077E436543C70B02F338841AF0FB86B5EA4B6A47E27C1D83E1AB06801044F546ADADA437F3CE7D788A1C92A74BA540664658E70D4F2711979153FF1589792859C3BF122628479C7C35EEE951DAB8CDB0D4D150C2DA338346988D34F8C5E589B231B5E00849611BA09711BD3A0516FD515E6C4AE1E8A3657C282C8120C97AA7A2E3BAA22B6EABB8D8212A9A48E7759A9DAAA51B538F662A05FB897067B7CF9D2CEB47A1897214CCFC225CE47CD60E86F7DEA49E220F7DDD6894B30B66460DECBBCB2E42B31F4ADF0AACDDE544B9124EA5ECB04B03C448B17E8094D489F516D23164D2317D3A1332E0500F1423136C8535D69065E880AF34CF7E36DB5FF2C18122E41880585B4D188411E86B370A024BD6E28143EA2EAE52EB46BE334A21A02E21C6755C0182B9A055A7D4C7B056E4930CE63EDC79C9FB4E2FBFFC58F776086F3487F02F8D1E7C8519C7F452E75CE5686A037B3642B95D7526ACD4A81A47112CF96A8DA7548016A22E9359198E871DBCC5852FBE14EECF3CCC5EB2FB5EC31D10474DF7D63482A03E11F4AAA2EAEDB714786E21D03AF1CD644D06BB05FF7B3959601580BF50E5F7F82FF42E9CF2FFCA0C67FFC52CEDC53C7A5C9EFB6C21092DDA374D1CCCBC78BBD9F5EE0FDF6DA6AC60C95F7C2E96F17E3C379A52D5DBD1A92DD76D1F5DFA19EA0408E0E7F7867445445CFA60BCEFC016E68872FBAC9098FD6A8E84731C285570B1BEACCA6F4728958E7924F7A7B7730B9BDC9AAEBD9E045F464071843C650D06C96D487CF8397286F81D93D0CC2008A62EE32421E5231998140909474F6D98541D899EA53714AEFE652A3D792E4C72533332C3133707A49293E3B2E06AE18F2F81D601AADDAF2FD09EC59350E0979A5AE2B721771682A1BFB5748D000F9736031CA971288F34993DF10FC06A16A6DBEED8CDAAA8127F3B71432E723558F0281459820A0F4A75A3B2716F976BDEB88BE9C73F31623050D7C1A96C84988B01D847309E1B6D7B815883F83C9BDB7FCDAEFA8BA69E25B824812B7D54530A3ECC96611897661158DAE1B4AAC112E9AC13D07FDC03DC7D5AF23C08C5E4BBFF737238FD3F1C06F94215BF2351DCE9CAE14B4DD4745AC0CD626054469C6A5286FF821BA192706D47CCEBC443DD67FDDB76797A8B78DD0DAF850CB5D181C82298616E1D3A92F7FC82FD256857915773C7AD97CBB9710373299AE8516B8A1D647A13C7BE848E0269ED6C8A91DC50D0CAD21430A3BC9E718A13D1966A0182D9A24FFF7ECBC7876C868AF2BAF2D8B782172C6719CF140E8CB877FE6D78779E1BB31C70C6C9A6A77529C51CF78A5E4FBD7FF6153B5195817F80603E5C5810C38CF43CA812ECA52F73F045E33DF4E3D04EC8C5F8B4A7399F6CBBF0D39DC951C476B9BCC002720CE89F09C3885673BBA9C90D20DCCCA4A82CE5BEB38BCD60AFE2BA65FCFB01C8793B7ECC0F0B17A9DA74F2E0FEF4C90B5132FD6BAF8C010FCB5E8E7FAEAD7F2E0DB29BFDD1811072623CEE274EF2EFB0F7D4191F332AAF20CF36FF89A2EDF15F7B284CABBBEF46901271D8C1B180F736125C8A44FE164AC7E687E9A58C3B1775238BF1A11F99BCB583D0E3C44BF4F76DCF9496A06F80CA52E24D55B54AB849D3040B4798BF5292B0574672E9F844016A52A4D4E4DAD2053207BC97215BCC1BB93271C03C9AD2DFC7485EE2ED399236AA06CF9A12972E21AFDC587A6334CD1D71A7539362D714BA26214664E3B4BC39CDB1DB847583DB8E002A2AAB451B4E5BD6FE200730BFB2745D03C82B640F4CCF58701708F724EFFDF98CB04C78DF36B7A866CFD596BF5EA18445EEA0E34ED514D0DC2625039049A0CC82711DBBEDCE339C77F9FA1DC60EDDD8D58C8F144B0F3D00227AFD8710BDC66D29809728D7FBE85F08AA38AEBE5605DA29A09CC0526FEE84691EAA54DC3744BF5A95275037FA2F600B1F91E502D5D81AF48F8EC4C1834FE625FCDF2364067048727559047E07062B4D8A7D3851853BF28BE9D2C511451E5FDD9459270328A2612DBFF42E1DD34005A3DA1226A023162F454923C0337E6C74B44BB27A3B1AC82DFD68B0A6DAF93473D97A9E4591EC01A51CB6B47E2C7A85C1FFA73C35E5CE3003BC4534A2D9B16EBF9FED6464CB1E0CC665A451616A62B6A8481E4506A73883198C144A06331224D358196C815C811B103959EDCA35B26BCF86F41D9C7638547496787885EE62B14AF431CAB2AD4E0224D33476C58B8B0833BF13B50BE2B1D682CA7DD194B793AD2C6E4EE25AAF95459302F0B4DAED907A317BCC6A5F8D76CA9AA0D799F8EA39F330D6244BFB9F35E6223A0F665A65F55EAB9BCBAB446D7FCD424DCE87F234864D2C27EE84600ED9193AFEFB6E7681BC94F514FE0748EB32D32262CAB880D79CD4FE5CC963A4F688D448F2DB2DCC5B0CA87AC26DD8506512C100273B8D4D902FC054D48D8BF9EE818AD9619F68A8904B613256DB78C881CEA3373F0CBBAC336A78CD91AD9D60126E05CB8C16E9AA8482CF1B806B2F9C57BC8D63BF008AB2E49EDE8E788BF96B9F1DB2918DC5063F3F1D5B9B1C0327141ACC0B4B248FFDCB8BCC127050D27C805E154A4825DEE6BE9C8D4E42B1F5EFC1EECC6A45DBC119AFB15CCAD19789EAAFA8B1715111AE32E2ACED2278803B60E2FD63A43317498244A7CF7342342B60462510E19D83240DFF5D58E762C093DF326EA503FD347D2A92A5A4680D5E13B305671C729179FA21BE83B0D83144E63 + +count = 92 +seed = 4D0788DE958A707899D5DCC02F756A10DEA2EFE0214F5E01B3281DF4E013CA75523ECEC64723D6C8BEC0B92C4F821D8F +mlen = 3069 +msg = 9163116C86E64D90D35CB216FED71BDBE6A0797A48CB915F5A40FC8D31AD340767058B28CFF0C240720327E12E653C1F98B5755D8000BC01324DB2820781B94C4434FDA76223845E0613E2526A95F28FB4A768B1487AA34DADB28CBE8DF4FDB510DFFE672FF004F37C7AC32072A24C0F12A050BB396AD56346F4E0BA75C0EFAC162288A7EE8A63255DBA5CF451A0932FD56B05E40EDD491293E045A6081F6586BDCA10B41A6970D8F9A7B3B6B58AA772EEFA9ED22C9A24A384D6947770862BE4FE45C5E0E56FA4D116B79699ACE41E5D9F2E4C245059CD798DD986A3763F527E0C9D5A88A09C4D76D447348509FA7D9BFBF3DEA59EA57711A3B1A9352123D4A74DF273FA24A89BCAB42A6D455B5FE3C503F1FF638280F87C740B9E4C5FF20133CBDFB8D08CAEB7DE9F26811D437E6EC8C3143C0419C2F5135D25C7F40C7908C03F295FD26F1A03FBC7285196BE40ADC6FBDDDC912B3BC94B0BCE08DBC2185EE3CB766325068DB55C31FFEBE4B1F6848AD4FC201A5FD056916A397ABE6A66FF9BB03B037B50AC509E46CA441ED45812E3334FD7036D190A7991E55CB817EC2A63CD800F293277E7D15F086618B55AD395C614D168FCEDFB274FDF4FCD50CB976F68A266C5365E02A1ED0221BA4E13E70304824F94251249CA23C089B4D54E02EA03FB7C9841DD30404428AAB2519D68CF564D75D18530C7D062496C120A8F5305AAB23AE52255EC919EB0CD875422B144BF47F7472349558E746B0EB5493F1FC40ABDADD2ED84A8B31221A485052369FD0B552972C9FAEB1A78E826BA4DFB9E91E301DB589E9D7C256E7051692C48534C6A5E2BF0F45B78ACA66D5F53E549827E15D64E2F294F93D43B9F36BEDCE6CEBC05E56CED3F846635AE3C384C3FD55B969CA31E8C625103C2B24E7EE45E92984CA23A331C5B14281B20116069C619D82D6080C6FE35C3A3FB2E73B695CAD9C5D3300814FD65738DCC3EAFCEFCD24361AAD13A25B3570D2D509FA449612BDB5B49E0605D7EB78449D1DB40660AF0F3D8BCD4869B6F175CD28AD72FE2668C3DFC1D4963D0EAB309DD50B74B9D2947F86FBE9864AE5D0DC69B55B182AC1D914B11F631193F5F1F897CE52CEE97D7AE95631FC2F2A1AE9B672165432EB2E5633B55185AFA5E883268D8503AEC10774D25D39C800B74405414FB06C55B8C48835577884D6B4F2F128246563066F8F34D76213E0720E899FC1F11A3B0A591885D82C688E40D6B44B54D6C7C6973156E2DD50C40A28D2EBBA60F5117D64646CAEF72974F4B8362E4820EC04F2F373DA8D883AF27518567688146F16BF4E10969E70BE8ACE5D2FF6A135DB1DD738907EA355FB6D243904F6427D11592672060DA14443B55A9089167FC9D5EFB2C64B0069795C341F90DAFF684E566611EA87BC40A4C45F22C23AB6888A754B89E4C95BB54629CE74EC999889C82714B5AEC703DE7BC080B0D2E622ED53B645688CE164ECDFF4ED66C86049B2F9077F2A94CD685294F8EA9CBC1DE29A48D39F6B308288DFDB47731E39644B576A298646752F5C53D7943A5D0F7DBBC9604902B61B8EDEFEB5AB7E5BFDBC1E6723E6047894547E440E918038CC13B47424CCFE1A207E08A40524B553C750683F5F6C960F05836FB9B28C59E1B471FD5331F1811DDF3EAFF73798B7FFD6C9714978988C440CA906B4782A410372D70EE65A0A803061708003688F576E2D3A22580B706149A24B93A162BE9F1B546680A1DB2A8E54A576C28B4772C50A55161B2994514369C2192B2C90017CC8282F41D28099F38B2F1F0D2C0E46B444417A2078755591F00F01DF0CE72B1D1BD255A14D2BF67AB3E630F95A5DA9BD9E10F08EFBF6FE722CF000C32460FA3271F18B39EAA4487C1DDF828B6BEDF4523837BB3425BA1C1606E8D5D1E6182AA6A74F068F3E90B42641347CA755779216AFBC99603391FCEF4E8E5AA202BDCA24B83FF42F4F01232D3F2831CDA2DB76FB93A4CF6E9EFB71B5438A4B74C3190A8901D73566C50727559BA9BF6317D116E8F5536BACF064D3F86282E0F88DD40B63E75519C6A8E5664AF8E1029FAE87930F523E4DC7C2DD6DC3296A42A59F178D438866D929A70951BED05533EB1D818B7C7C595971C26B1D436D26897D6A6EB036A13511AC4A3BD724F2CA57FEF07D2C0730800D35683D745125F4237ADD64B538B7DAB0D0F258DAF7DE1A74F74A2FD010CDEE810F514FCF6045F0CC84E2054B5F4EC2772718FFB4CCA9C9BE77F8F007333860180D60EE4DD8CE976E63FF49AA11DD42FE6946515E59DA3E602B1861BD3F63C89362BCFE8438BC71959A617D8D63331A3D903BC5734B777FB14F7A2B063D79EA8637AC52C758EF88DF217B95FA8FDF1009AB28D8A4F318F78772568CC7AA9E3B3E001C0111B1751B698EF1B66383D6B3CA942FE4F66FC97613CFBBC03EEC9D0B7E08F80939D9A2EA1F72BDA7B0D655AC3A94B4C699D3EB1BBD6076E63EF5C1FE9CE258B55D21164CA7EE03BB53D8BA4306F695E648093542D769DA95A35FF3A2C071DD8ABD5A82E217D82317065D50A87B689AE3A2EC7887957BB243373CF986490961220EA61EBE12AC0287B185070E124FC518C300620B4B6D4F29402B18C2462A7985C00E2A87691053B1FDECB7AA264F33E27C6B201CA6065EF79E5266513AEA92E8D3E646453C089B5EBA66D14BC45844D0240D2E7737C16668FD53E38A93D6003146019777C03644C300D06927EF6994AC794914EFC5BE0CA81680CA8C9752908FBD2D56D7FD1FC1C76EED755408F1D7802F0D3D0F347D82B162EE6F0A2A890E083C20B822FA6C4AD627F4AB5D1526D83D897C244D6ED4A427B23B4A0C19F4E8889257C1373764AB7063B5DB8ED9C2443CB012381A2B3365EB568649D7CCD52271F25FD22FDC397E4C9C536EBB452CD2CD10DC5010BF433F88CB58D2B9EDF2BCBFA83B782FFD4388F1BCE3F8F9AF5AE6BE590BDCECB1BFEA846D2F0199ECCDB0C7E4D419F69B6A428EAEB462B67AA40340417BDFEBB6039AAB8242E39F6C11EC136D73FB315CF71414A2A1203AF08FDEE34ED0072C27462395815F7779012A41EC526BE53DA954E1F7A7EBBB68FEB15CBAEA8ADD6CD0F2FE3D3615991AB54F4C7884E8A80A9535F13BE2ED944B3BB315DE8AF2A70439294CD53F041F41D3562BE840C78EFCB08661B1731FEEC46A9091ECEDE3A9FBC2DAE42C72EBDD84308E95644373595DB62157DBA7DBF124BB45DE6C2837B0066673BFD215FF915A8D41637EEB029C345E444251ECBBCDF79E246A80AA4591976A00DA06C759C6160ED1986F8E15A562417DA55109174628E7B11D49586882851205755B4F99A875AB3599FDCC094E4A2164E1764D24DE805FD7B20EFEF2A8E23FEA4E206DFA1FD9C31D90C1FECF745D3EB886190827D952703AA6A99B5000D8EE9D51DE94A82DD053B6AA89CD7E94E92D4AA93A9224D3F688B5C834A53F2993638166A3DE78ABA7CB930CC5845F9915E6523683715A187E940FA2A978B5CA4C3B80DB62E96A600F1864BF0B1AAC23B1330B13EADD3A2F07CE7181D0A9497C455D228278E5CC3E4C00A2EA3EB8E5B9CE2799256302B0F8F1F829D3A3AE8AA7CC4EA229C5AF476C01B8D48A9F6987DF57C3469B6EF6DFCB488A3D5B91FE17B5798FE154AB8399A2E75F0D15B2A6AA91302056266B22A38A604EDC374E2D2155ABCA119C11DC6827A47E3CEE7032F6E0F59708DFACE221E47041CFFC59CE0334D9B7C5E91C2C320A70EC2F32906624128363C893909F47BD970DF652D5E6C2324033F32B1653A039F8C051D9DC8F839C50F5696E9E08F7F1CDAC4750B429AF03176FF6E643ECA1D8FC710C6CDB0D26074D85316F4C9084D5F453F6D36C1CEA0E389F3462E1478E2503C1DB99FC46F3F0627F173672C21F3CC3B483998192E81EFA689819D0007762ADBD141A058587E030A3568E412D25662C40ACDAFC3C6EE30C10CC23E3DDEDB6C73085C90C89B1218D67A328F06C3637A786D4715CB9F9D8B0B22D920B68B0557CC80A56FCE0B6E2D6627DE576E308757A8F37821898E96785AE323E413D3572205B0A5710143A2621C258C76C7C3FF7100A2FCAE99C84D1AB1CECF7FC5B1E4698BFA3BA2A0856A65F2D4F291A4A164C0381D70D1213F7E40FC4BA42C43EA8E70043E27C5AB0827559B7CF7F2587D0D2F93C6382CF54E92764D815280D68C554E5B6FBB351BD18635786299DDE39FCAF3EFA708A3F18701EDA1579BFB0BEE4FA1F1ED6E09D450D427E4B91F4552F87F31F06F109E74AF4BF301481452AAFA2146F6375DA467EA008BAFC3C8408AADD61B07C28C55249EC0C8BFDB00EA +pk = 4B921C802BDC0C7BAC8A7B7A80100539B304F14478789C81A8971CF0A25DF703FF3D246DB58420338327746B60F5FE1ACBDD8247E03EB9F8787E11A759B899020B +sk = 4B921C802BDC0C7BAC8A7B7A80100539B304F14478789C81A8971CF0A25DF703FF3D246DB58420338327746B60F5FE1ACBDD8247E03EB9F8787E11A759B899020BA96E0BE0D88DBEF9093CC276ED042D80D8020000000000000000000000000000584DF93656B369F13AF8CEB83205F18873FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE3C086E1870E662404C47058862C174DFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000053B381D812E82CBDADD02A8F1BA7B52BA4F8DB251F8FB4A9540A76E4C8EF2400A6546F9364CCAACC1DA8A708032BF07EFD21244F97C7C52C25DFB2EEE0405E0056A4408031F1661D0C5E97DAFAC755196E299C7C38F80014C2F66CABEBFC48000DE084577007868F978F4845EC366CFCA8A5F90DACAC8AFE9F8609F2CAC75800 +smlen = 3217 +sm = FC620CFCF04D376A6F180A19A45E0217865C5FC882CFE4D2A39648E3CA0BB502BD4294946EFB1F315180CE726BA878DB1FBD8F7F8DA1C22A4E91F08B5A76F4040002B7ABADB07A5B5B3C0E747C5888ABDA22BBC68CCEF1C2510A3DED10AF00C09ABE84FFA931F0E148FC4EA5773F62D93E3ED05AF035035CBA2DFF140E88DC9F73AD9496570F0CD946A0EC84CEAC4A5EBC020B0C9163116C86E64D90D35CB216FED71BDBE6A0797A48CB915F5A40FC8D31AD340767058B28CFF0C240720327E12E653C1F98B5755D8000BC01324DB2820781B94C4434FDA76223845E0613E2526A95F28FB4A768B1487AA34DADB28CBE8DF4FDB510DFFE672FF004F37C7AC32072A24C0F12A050BB396AD56346F4E0BA75C0EFAC162288A7EE8A63255DBA5CF451A0932FD56B05E40EDD491293E045A6081F6586BDCA10B41A6970D8F9A7B3B6B58AA772EEFA9ED22C9A24A384D6947770862BE4FE45C5E0E56FA4D116B79699ACE41E5D9F2E4C245059CD798DD986A3763F527E0C9D5A88A09C4D76D447348509FA7D9BFBF3DEA59EA57711A3B1A9352123D4A74DF273FA24A89BCAB42A6D455B5FE3C503F1FF638280F87C740B9E4C5FF20133CBDFB8D08CAEB7DE9F26811D437E6EC8C3143C0419C2F5135D25C7F40C7908C03F295FD26F1A03FBC7285196BE40ADC6FBDDDC912B3BC94B0BCE08DBC2185EE3CB766325068DB55C31FFEBE4B1F6848AD4FC201A5FD056916A397ABE6A66FF9BB03B037B50AC509E46CA441ED45812E3334FD7036D190A7991E55CB817EC2A63CD800F293277E7D15F086618B55AD395C614D168FCEDFB274FDF4FCD50CB976F68A266C5365E02A1ED0221BA4E13E70304824F94251249CA23C089B4D54E02EA03FB7C9841DD30404428AAB2519D68CF564D75D18530C7D062496C120A8F5305AAB23AE52255EC919EB0CD875422B144BF47F7472349558E746B0EB5493F1FC40ABDADD2ED84A8B31221A485052369FD0B552972C9FAEB1A78E826BA4DFB9E91E301DB589E9D7C256E7051692C48534C6A5E2BF0F45B78ACA66D5F53E549827E15D64E2F294F93D43B9F36BEDCE6CEBC05E56CED3F846635AE3C384C3FD55B969CA31E8C625103C2B24E7EE45E92984CA23A331C5B14281B20116069C619D82D6080C6FE35C3A3FB2E73B695CAD9C5D3300814FD65738DCC3EAFCEFCD24361AAD13A25B3570D2D509FA449612BDB5B49E0605D7EB78449D1DB40660AF0F3D8BCD4869B6F175CD28AD72FE2668C3DFC1D4963D0EAB309DD50B74B9D2947F86FBE9864AE5D0DC69B55B182AC1D914B11F631193F5F1F897CE52CEE97D7AE95631FC2F2A1AE9B672165432EB2E5633B55185AFA5E883268D8503AEC10774D25D39C800B74405414FB06C55B8C48835577884D6B4F2F128246563066F8F34D76213E0720E899FC1F11A3B0A591885D82C688E40D6B44B54D6C7C6973156E2DD50C40A28D2EBBA60F5117D64646CAEF72974F4B8362E4820EC04F2F373DA8D883AF27518567688146F16BF4E10969E70BE8ACE5D2FF6A135DB1DD738907EA355FB6D243904F6427D11592672060DA14443B55A9089167FC9D5EFB2C64B0069795C341F90DAFF684E566611EA87BC40A4C45F22C23AB6888A754B89E4C95BB54629CE74EC999889C82714B5AEC703DE7BC080B0D2E622ED53B645688CE164ECDFF4ED66C86049B2F9077F2A94CD685294F8EA9CBC1DE29A48D39F6B308288DFDB47731E39644B576A298646752F5C53D7943A5D0F7DBBC9604902B61B8EDEFEB5AB7E5BFDBC1E6723E6047894547E440E918038CC13B47424CCFE1A207E08A40524B553C750683F5F6C960F05836FB9B28C59E1B471FD5331F1811DDF3EAFF73798B7FFD6C9714978988C440CA906B4782A410372D70EE65A0A803061708003688F576E2D3A22580B706149A24B93A162BE9F1B546680A1DB2A8E54A576C28B4772C50A55161B2994514369C2192B2C90017CC8282F41D28099F38B2F1F0D2C0E46B444417A2078755591F00F01DF0CE72B1D1BD255A14D2BF67AB3E630F95A5DA9BD9E10F08EFBF6FE722CF000C32460FA3271F18B39EAA4487C1DDF828B6BEDF4523837BB3425BA1C1606E8D5D1E6182AA6A74F068F3E90B42641347CA755779216AFBC99603391FCEF4E8E5AA202BDCA24B83FF42F4F01232D3F2831CDA2DB76FB93A4CF6E9EFB71B5438A4B74C3190A8901D73566C50727559BA9BF6317D116E8F5536BACF064D3F86282E0F88DD40B63E75519C6A8E5664AF8E1029FAE87930F523E4DC7C2DD6DC3296A42A59F178D438866D929A70951BED05533EB1D818B7C7C595971C26B1D436D26897D6A6EB036A13511AC4A3BD724F2CA57FEF07D2C0730800D35683D745125F4237ADD64B538B7DAB0D0F258DAF7DE1A74F74A2FD010CDEE810F514FCF6045F0CC84E2054B5F4EC2772718FFB4CCA9C9BE77F8F007333860180D60EE4DD8CE976E63FF49AA11DD42FE6946515E59DA3E602B1861BD3F63C89362BCFE8438BC71959A617D8D63331A3D903BC5734B777FB14F7A2B063D79EA8637AC52C758EF88DF217B95FA8FDF1009AB28D8A4F318F78772568CC7AA9E3B3E001C0111B1751B698EF1B66383D6B3CA942FE4F66FC97613CFBBC03EEC9D0B7E08F80939D9A2EA1F72BDA7B0D655AC3A94B4C699D3EB1BBD6076E63EF5C1FE9CE258B55D21164CA7EE03BB53D8BA4306F695E648093542D769DA95A35FF3A2C071DD8ABD5A82E217D82317065D50A87B689AE3A2EC7887957BB243373CF986490961220EA61EBE12AC0287B185070E124FC518C300620B4B6D4F29402B18C2462A7985C00E2A87691053B1FDECB7AA264F33E27C6B201CA6065EF79E5266513AEA92E8D3E646453C089B5EBA66D14BC45844D0240D2E7737C16668FD53E38A93D6003146019777C03644C300D06927EF6994AC794914EFC5BE0CA81680CA8C9752908FBD2D56D7FD1FC1C76EED755408F1D7802F0D3D0F347D82B162EE6F0A2A890E083C20B822FA6C4AD627F4AB5D1526D83D897C244D6ED4A427B23B4A0C19F4E8889257C1373764AB7063B5DB8ED9C2443CB012381A2B3365EB568649D7CCD52271F25FD22FDC397E4C9C536EBB452CD2CD10DC5010BF433F88CB58D2B9EDF2BCBFA83B782FFD4388F1BCE3F8F9AF5AE6BE590BDCECB1BFEA846D2F0199ECCDB0C7E4D419F69B6A428EAEB462B67AA40340417BDFEBB6039AAB8242E39F6C11EC136D73FB315CF71414A2A1203AF08FDEE34ED0072C27462395815F7779012A41EC526BE53DA954E1F7A7EBBB68FEB15CBAEA8ADD6CD0F2FE3D3615991AB54F4C7884E8A80A9535F13BE2ED944B3BB315DE8AF2A70439294CD53F041F41D3562BE840C78EFCB08661B1731FEEC46A9091ECEDE3A9FBC2DAE42C72EBDD84308E95644373595DB62157DBA7DBF124BB45DE6C2837B0066673BFD215FF915A8D41637EEB029C345E444251ECBBCDF79E246A80AA4591976A00DA06C759C6160ED1986F8E15A562417DA55109174628E7B11D49586882851205755B4F99A875AB3599FDCC094E4A2164E1764D24DE805FD7B20EFEF2A8E23FEA4E206DFA1FD9C31D90C1FECF745D3EB886190827D952703AA6A99B5000D8EE9D51DE94A82DD053B6AA89CD7E94E92D4AA93A9224D3F688B5C834A53F2993638166A3DE78ABA7CB930CC5845F9915E6523683715A187E940FA2A978B5CA4C3B80DB62E96A600F1864BF0B1AAC23B1330B13EADD3A2F07CE7181D0A9497C455D228278E5CC3E4C00A2EA3EB8E5B9CE2799256302B0F8F1F829D3A3AE8AA7CC4EA229C5AF476C01B8D48A9F6987DF57C3469B6EF6DFCB488A3D5B91FE17B5798FE154AB8399A2E75F0D15B2A6AA91302056266B22A38A604EDC374E2D2155ABCA119C11DC6827A47E3CEE7032F6E0F59708DFACE221E47041CFFC59CE0334D9B7C5E91C2C320A70EC2F32906624128363C893909F47BD970DF652D5E6C2324033F32B1653A039F8C051D9DC8F839C50F5696E9E08F7F1CDAC4750B429AF03176FF6E643ECA1D8FC710C6CDB0D26074D85316F4C9084D5F453F6D36C1CEA0E389F3462E1478E2503C1DB99FC46F3F0627F173672C21F3CC3B483998192E81EFA689819D0007762ADBD141A058587E030A3568E412D25662C40ACDAFC3C6EE30C10CC23E3DDEDB6C73085C90C89B1218D67A328F06C3637A786D4715CB9F9D8B0B22D920B68B0557CC80A56FCE0B6E2D6627DE576E308757A8F37821898E96785AE323E413D3572205B0A5710143A2621C258C76C7C3FF7100A2FCAE99C84D1AB1CECF7FC5B1E4698BFA3BA2A0856A65F2D4F291A4A164C0381D70D1213F7E40FC4BA42C43EA8E70043E27C5AB0827559B7CF7F2587D0D2F93C6382CF54E92764D815280D68C554E5B6FBB351BD18635786299DDE39FCAF3EFA708A3F18701EDA1579BFB0BEE4FA1F1ED6E09D450D427E4B91F4552F87F31F06F109E74AF4BF301481452AAFA2146F6375DA467EA008BAFC3C8408AADD61B07C28C55249EC0C8BFDB00EA + +count = 93 +seed = 55A9C7A0B49706090BC0702ECFC070AB060427FFC820C3FE05B499B59AEB125F2DB4787A5910B88C6F8FAF0A69BE0AE5 +mlen = 3102 +msg = 02C7C4451DA90503C43FDED1CCB3DEE468A6A8D9E56670CD8F6A58E7941F1BC5EFA6E2AFDC0141A2F7E8F781D79E70B4813263A9DBC8D8A67F89371CFBD90977EC96461B28BEE4C644F2C91E96257B1909B84ECB25CF438A3FD6B835E20D5CDA56A1FB7995FCAA0EE1B5327FB1288E3C57CBEF0554CA5AD6FCD1F1865C6AEC6CBDB24495700AB5AAF078D8516CA4FA3A231A97C77BD150B127CDBFB42C03702C9027B2A5F6594B022EF55B63BF3EEC27EB0E9529ECCDC82BC6AD1F011F167D602EF1F175DA5DB4028BF08A053AF2C728ADE93B37EDC2A75B7B6C6CF38CD1C07F359C73B131B13DF76139DEE6795F1D85B47F29AE97D0E40CF5DBB67360044F78940A1E80D9D99FD5AB0185210D8769911BC471650DF0FCB9C3AF038F7882F677790E146E612FCDD6FB89F90B7E5E46CD648F4BF8F736D69F8A91E4806346B4366FD48D1481C0B47ADD82003310B0A99B779D63EDE1771F50221651B2D8AF40F48B92EE1327C85A1D2EF2D86378076BEB58556FCAEC6029649A0EA5FDE517A85D87704210E071FCB6F63317AEAC3EB3E9746018E1028C50C790A45B1BEDA6EEA2D646DCE401AD5D7850A5F69CD85301920DE77AB0D01B1361EFA3E70AC05881BC02190720ACC75A691D6064F9D24C79DC72476309E58CDDF5FB2A253D857A79C8E898AB6ADC300EAAF208820CB02F5F2CD317F4052D40DE28E52C55A0349DD855D64E8DA8296D4F572281E221A3D27EF76FEE67FBE5484E6460C99950763B801FCE828E93D2A633A1CA5D7EC582D7C463DA5A9AA8056BB2173306F3820BD0A3273742789B61AF89CCC42B81CC68745800D2A59231D5D28E832F443A871DE5B6B10B58A8AA7CC9816014D7F3545DDF1F481B7F0C9DD41B4D96E5DB767B74776C2253FA230DF65F3E0B944B95ECD4138E2847418B084D9F9E0798CB5247238EC12B88C10A5C0C645E1D09D09059C72E33C28A472FDD8B88EAA93C63BE7D980A12195C2EC3105DF2BB81CC9C3009F7771B6B813CD12303E3A9961D6731AF55ECFE5127BAC68D06F835DD5F2D584FC0E648C3A4256E2A3D4B81966010964657F33D1FE0400724C488D5AACF9F2C0B802CD812C8452E5B8E2B17FF4A1289D33FC405F5DB4ECAB4A73FCA3634756DFBF9012C413B6F64788FD0F68F8AB7620477ACD3C14009377F3DD54B9EAF2784433D63341323F54D113FD63D7456AFEF885F13C13172A37A5DC82336B9515F8F7F4903EF6DBE9CB34930743B6ED11265CF94AAF406DEA9802D17BCB369AD0D9964792F74D338DAFE47EE88B3B74EBA8E70774EDC1F16FA876FD62B0BFF880CE252EE4435B1DEBF36F0A06A4FB406F01D618C135E6103E2A39F4C9CF41EC93702BA76BA753AB49B5836C20F67D05943EDDDF47AB8C5B81F4BC22D773305076F7E5B697A7B25B016190072F756F19F397884E0521595326CA591672684A3BE17C9F5CC8E8F4848F7136762178FBDCC7BC6A6C6A31345FEE687B0505F72BF1AB7EB87BFE5F896CFD42DD67A239C70648B39BC0C84DA33CA17838FB4213C38B68F22914FEC3DC50194E883720719E9B5F8D037DEBB726DBD899ABD97853C54B0BC347A322BFAF961C6CD6209C98AA81B8E2595FC151B1375BF4FCA2DFF49DF40A3D1C694EDFF6E9687E73EF62DD42AD7A05195A7F206F097196AA0E4D68F8132D4A00CEDED940C4F6AE02E6D3763073462C7A4BB11778290E744471EC554A05917E52C5263FF02C07BEE055234EEE10B79175DC164AB2051B03598DF1D4311E87ACF4AEC45C55B1A58B0F05EBDABE248A27C0187643CB8F9529D31FE0AC4A28D780196DA00DACFF5F2DD64FB04E7C159DBBCDD3343BCB7AE188DE15D923D2AC0AF232C5389DC9C949FCE554F7A0425D4F9B28DF2EE4B81740C2B5A5B93F0F7AB75EBD360CBC78B11C28608B5BAFC970CF3D4455A20A198392D876EDCF89E2639B50CD84AE21BD50FB077050EBFFB210BE711D8EA807CA66493650E909911FD3CAD99AB94B2AB2EDFF192D9D75257818272E147A9C54E06C53210FC091BF4175F2F44423669716FD9A6C4F96A0C4BE17839769A806453E55D7357FBFB3D7A458E70957D524C0E896398E135BFA68A0CC136FB93EE7D30AD463E32E152FC32CB8E7F0B05A30EB13C0DF98BC187EC0A54856D2EFCDA10A82B89DC8CD21C67D9B6DF3D7005EF3B2BC9DCD5D55B64DB40B74FD322CDF9D9911A00B5A02E1AD5CA9BF65D90DB709FC1E5FC84BE97574B09C83B49963A51228A667BBD84BFD8E0D90EC161FE5CA73BCB8D95FD7AFD982AB7EBAB51BD2B24CD6D356EB850D2C65593313D8EBB97E7DFA450AE982918582F86A356F538EB05AFD460566D79F040D36C93D3C645B636560007D51B121DE3FAFB3ED70B475AFF9617DA4B52937C628678B109C3B76BC15BD02B766A394893D8EC966DFD8033D12A8D98AC5BE201134325E32CB6786F4FAECD7DCD05AEF5F3739122B817824A672E71DEB312CB7DD6A77116B30715076384297B1962EFDFEE6D6D2B2ED2EA4DD802F4784872D825DB828557D4D927B7232682AD91CEC3E508854F529853A8797B7BF7BFF8E3C180980DDF4081E96A12A495ACDE0C73282AC78617C68A55A94573E5A37B859858D1E19ADC82821B316B9D346ECFC6DBFFB3779F692A62D20D1BC4E730FDE2AEE826E76638ADE3DFAA11057B0BC8A80E8905B15E41D9A4105109F18E7E1362149AE9C568D1D642D65B94253BE2B13E7230F8BCF34DC87241D1DE72A65BBA111C111CBF5BD618CD02E0A06E37F60B3736631073A6BE004C1AD5F0091A82C87B276F7C5AAF6938C886A6039DF23482E2064F6AF05636B4C6BA6B24A29AAF2174AF4BD959177203AE9B160F81CA6764948AFCDACF6BEC0B987C6DBE178DCF47C137C64809483019C5F2072D0301C19C500C60B5CA913C24A8F28F50E1578D806FF9F9B810CA14BF5F2268FA18DEC67D973EB1D975AAF871ABC980D06222493D900CEBD8811FA20D5DB8F8036430F8BD7F9554F7CB47F9EBF389F66C3CCF9F42DB57AFFEE074FFEE4EB3E11612FD8A8FE02CC4E9D2F8BB36C505CECE9DC87512AEB5D8EBE33328C5217CCAF2E1AF1E38BFA84C0035DECD8D8C250FB4D964E8F0AE448AAB740D9EE9D794390686FE9A95183F0D5166D479C51014F1F29D8FEC616E1A4E7A9C86E2AF790BC7BD7BB6F746A2266332E04AFFBE6B9512E6620681C3317DC846E4FD7974E8AE87E370ECF9DFED574E339CD7E8A663ECD1A7BF5842391913D98686F7F2145BBC420F2F58B89131D5F3BE41C85752E13504BCC549A8F690CD2B0E1E29E4DFA3CC76BD398BBF28F33A00C3915DD719F7CB985E9A0A7CC8190BFFC8BF47310C71418D7A6C629C491EB8E455148BD4438BA6B7014608B0CE6A1BC5B035BC174C9BFFD966D8305FE9E5619BCA3FE4B39E6732DC652531819AC828F86EA11360678E786EAA741382D713AE26A608D582A3E4583D45744ACEDD32670B5AD4A1310301B28A174DC9858A55F0C1B7486CD66CB0635083B0C63016E40DFC533AB80C9CFAF1378D00769DCBAD56B09DA3A4E6CDBFD8F3FCB951680020DCA58647665462E42F42DC14E7B20F262D3CEB0B1A2BA807B98D66232AD7D3839C298564BC36A134CC2447B1B9FE69271960459C0A6F897C1878140690DA7D41FD8AAA05A679FDC3037EB2885AD3C82374F4BB991745351292DFD8E54F565E0093776B7EA65DDCD500BEB4D15AF6029F2630A0062F2D4FB331B47B6A5E139D385016E1FA490EAA209636B1383B7D7DC1148F07ED2CC2C03FA7FEE09305F34C57B3CE899C18462B4F1EF88C1AC5259440AAB48C5849652AAD9D3CF3D31F36C7F64F918868182D36345BA5BB7A4EE088D8B081EB78FE977F5A5295177AA427215BB26D1DE33AD4B2D610A47F8C672EEDA703A04D0FAE4C5961F13AD6FCA81863D8A394135565D8B27904A511FD0621A532F84A47CCF4FCC2114D4C369B7A76822959F8CAA25A6495081CA9EC3AC3348A981618592C090B6439CDA2FBC932C8697B3709323E3388AF8EFA1B9CDBD65A65C8F0C302330DDBD10E0235F8030562452EDE447EE5A5A9A636AF6F615B1210AA7CBE69572B3467B643BC5F5EC3F9AD15B3AD918993355E209ACBD0F1393076DA3B0950803295B6571E476ACAA04D48A4627367CB7FAA83796C4178CA9071DCCB8D3EA70381B61F0C56D515E0A765E266DACB13056317AD8737A1AD541AACCEA1641946E331229F19BB54C20BD51E63D63BFFA13110A552FD0A95AB984EF53BD639EFA0568C6875B2798E3A0578C940C0C4197D3587BCB1CC45A99F5D37B1612DC1A4178A3E288FBD79DDACD049159D6A5416F9EF3F38C74449BFB2E6A894566C5C17B4555E154F29A93241463690 +pk = 1D16C25E40C7111DA010681E49E1CA3B20C01DE33DF1E6C77EF169AFF6129A01A85802ADBA4643E1D0359B0C0ECE90D202DFB58AE5B3792F8B67E0C8E884C5010B +sk = 1D16C25E40C7111DA010681E49E1CA3B20C01DE33DF1E6C77EF169AFF6129A01A85802ADBA4643E1D0359B0C0ECE90D202DFB58AE5B3792F8B67E0C8E884C5010B370F8A03B1FE8C3BBE3AA993A94968F31F020000000000000000000000000000B0EFC4F63E09689931A16CD2B9B4FB044BFDFFFFFFFFFFFFFFFFFFFFFFFFFFFF2749D1F5B6042D294C34795F0CCCBDEB34FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000006940D27EB265EB47BA582ACEAF1E99508BD8183D50CB1841EEBA460F122D6D003961EC859F76627BCE74C8E20D2F43CE34363C680724FFE8BA2E67A12815E000855695F0E9485D46DE8B93A91825E215DF29DD0464608178E21ED8CA967D3600A89C66390C761B669FE4A5194DB3B30372515A9EEB6A19F450E492BC4EE96900 +smlen = 3250 +sm = 243E93E46E860FC0E42F7A2B7F5D332B1AE09018B2FD5EA34BACCCA2B5EEB7001002CD43DB58DDC1F7775B914C15EAFB00C56AB0596A519A6D0DA48281D40A04000112688CAAAD325F8D8FB699035F76A0C6555B2E6786E30B131E5EE21B92B1AAC24692AC1A19E884F47A72E0ED9A3726E09C58A3EED4D4DE3CD4BC7FECD047213E4881E40BE5895CA6F236A7BC76CEB702040402C7C4451DA90503C43FDED1CCB3DEE468A6A8D9E56670CD8F6A58E7941F1BC5EFA6E2AFDC0141A2F7E8F781D79E70B4813263A9DBC8D8A67F89371CFBD90977EC96461B28BEE4C644F2C91E96257B1909B84ECB25CF438A3FD6B835E20D5CDA56A1FB7995FCAA0EE1B5327FB1288E3C57CBEF0554CA5AD6FCD1F1865C6AEC6CBDB24495700AB5AAF078D8516CA4FA3A231A97C77BD150B127CDBFB42C03702C9027B2A5F6594B022EF55B63BF3EEC27EB0E9529ECCDC82BC6AD1F011F167D602EF1F175DA5DB4028BF08A053AF2C728ADE93B37EDC2A75B7B6C6CF38CD1C07F359C73B131B13DF76139DEE6795F1D85B47F29AE97D0E40CF5DBB67360044F78940A1E80D9D99FD5AB0185210D8769911BC471650DF0FCB9C3AF038F7882F677790E146E612FCDD6FB89F90B7E5E46CD648F4BF8F736D69F8A91E4806346B4366FD48D1481C0B47ADD82003310B0A99B779D63EDE1771F50221651B2D8AF40F48B92EE1327C85A1D2EF2D86378076BEB58556FCAEC6029649A0EA5FDE517A85D87704210E071FCB6F63317AEAC3EB3E9746018E1028C50C790A45B1BEDA6EEA2D646DCE401AD5D7850A5F69CD85301920DE77AB0D01B1361EFA3E70AC05881BC02190720ACC75A691D6064F9D24C79DC72476309E58CDDF5FB2A253D857A79C8E898AB6ADC300EAAF208820CB02F5F2CD317F4052D40DE28E52C55A0349DD855D64E8DA8296D4F572281E221A3D27EF76FEE67FBE5484E6460C99950763B801FCE828E93D2A633A1CA5D7EC582D7C463DA5A9AA8056BB2173306F3820BD0A3273742789B61AF89CCC42B81CC68745800D2A59231D5D28E832F443A871DE5B6B10B58A8AA7CC9816014D7F3545DDF1F481B7F0C9DD41B4D96E5DB767B74776C2253FA230DF65F3E0B944B95ECD4138E2847418B084D9F9E0798CB5247238EC12B88C10A5C0C645E1D09D09059C72E33C28A472FDD8B88EAA93C63BE7D980A12195C2EC3105DF2BB81CC9C3009F7771B6B813CD12303E3A9961D6731AF55ECFE5127BAC68D06F835DD5F2D584FC0E648C3A4256E2A3D4B81966010964657F33D1FE0400724C488D5AACF9F2C0B802CD812C8452E5B8E2B17FF4A1289D33FC405F5DB4ECAB4A73FCA3634756DFBF9012C413B6F64788FD0F68F8AB7620477ACD3C14009377F3DD54B9EAF2784433D63341323F54D113FD63D7456AFEF885F13C13172A37A5DC82336B9515F8F7F4903EF6DBE9CB34930743B6ED11265CF94AAF406DEA9802D17BCB369AD0D9964792F74D338DAFE47EE88B3B74EBA8E70774EDC1F16FA876FD62B0BFF880CE252EE4435B1DEBF36F0A06A4FB406F01D618C135E6103E2A39F4C9CF41EC93702BA76BA753AB49B5836C20F67D05943EDDDF47AB8C5B81F4BC22D773305076F7E5B697A7B25B016190072F756F19F397884E0521595326CA591672684A3BE17C9F5CC8E8F4848F7136762178FBDCC7BC6A6C6A31345FEE687B0505F72BF1AB7EB87BFE5F896CFD42DD67A239C70648B39BC0C84DA33CA17838FB4213C38B68F22914FEC3DC50194E883720719E9B5F8D037DEBB726DBD899ABD97853C54B0BC347A322BFAF961C6CD6209C98AA81B8E2595FC151B1375BF4FCA2DFF49DF40A3D1C694EDFF6E9687E73EF62DD42AD7A05195A7F206F097196AA0E4D68F8132D4A00CEDED940C4F6AE02E6D3763073462C7A4BB11778290E744471EC554A05917E52C5263FF02C07BEE055234EEE10B79175DC164AB2051B03598DF1D4311E87ACF4AEC45C55B1A58B0F05EBDABE248A27C0187643CB8F9529D31FE0AC4A28D780196DA00DACFF5F2DD64FB04E7C159DBBCDD3343BCB7AE188DE15D923D2AC0AF232C5389DC9C949FCE554F7A0425D4F9B28DF2EE4B81740C2B5A5B93F0F7AB75EBD360CBC78B11C28608B5BAFC970CF3D4455A20A198392D876EDCF89E2639B50CD84AE21BD50FB077050EBFFB210BE711D8EA807CA66493650E909911FD3CAD99AB94B2AB2EDFF192D9D75257818272E147A9C54E06C53210FC091BF4175F2F44423669716FD9A6C4F96A0C4BE17839769A806453E55D7357FBFB3D7A458E70957D524C0E896398E135BFA68A0CC136FB93EE7D30AD463E32E152FC32CB8E7F0B05A30EB13C0DF98BC187EC0A54856D2EFCDA10A82B89DC8CD21C67D9B6DF3D7005EF3B2BC9DCD5D55B64DB40B74FD322CDF9D9911A00B5A02E1AD5CA9BF65D90DB709FC1E5FC84BE97574B09C83B49963A51228A667BBD84BFD8E0D90EC161FE5CA73BCB8D95FD7AFD982AB7EBAB51BD2B24CD6D356EB850D2C65593313D8EBB97E7DFA450AE982918582F86A356F538EB05AFD460566D79F040D36C93D3C645B636560007D51B121DE3FAFB3ED70B475AFF9617DA4B52937C628678B109C3B76BC15BD02B766A394893D8EC966DFD8033D12A8D98AC5BE201134325E32CB6786F4FAECD7DCD05AEF5F3739122B817824A672E71DEB312CB7DD6A77116B30715076384297B1962EFDFEE6D6D2B2ED2EA4DD802F4784872D825DB828557D4D927B7232682AD91CEC3E508854F529853A8797B7BF7BFF8E3C180980DDF4081E96A12A495ACDE0C73282AC78617C68A55A94573E5A37B859858D1E19ADC82821B316B9D346ECFC6DBFFB3779F692A62D20D1BC4E730FDE2AEE826E76638ADE3DFAA11057B0BC8A80E8905B15E41D9A4105109F18E7E1362149AE9C568D1D642D65B94253BE2B13E7230F8BCF34DC87241D1DE72A65BBA111C111CBF5BD618CD02E0A06E37F60B3736631073A6BE004C1AD5F0091A82C87B276F7C5AAF6938C886A6039DF23482E2064F6AF05636B4C6BA6B24A29AAF2174AF4BD959177203AE9B160F81CA6764948AFCDACF6BEC0B987C6DBE178DCF47C137C64809483019C5F2072D0301C19C500C60B5CA913C24A8F28F50E1578D806FF9F9B810CA14BF5F2268FA18DEC67D973EB1D975AAF871ABC980D06222493D900CEBD8811FA20D5DB8F8036430F8BD7F9554F7CB47F9EBF389F66C3CCF9F42DB57AFFEE074FFEE4EB3E11612FD8A8FE02CC4E9D2F8BB36C505CECE9DC87512AEB5D8EBE33328C5217CCAF2E1AF1E38BFA84C0035DECD8D8C250FB4D964E8F0AE448AAB740D9EE9D794390686FE9A95183F0D5166D479C51014F1F29D8FEC616E1A4E7A9C86E2AF790BC7BD7BB6F746A2266332E04AFFBE6B9512E6620681C3317DC846E4FD7974E8AE87E370ECF9DFED574E339CD7E8A663ECD1A7BF5842391913D98686F7F2145BBC420F2F58B89131D5F3BE41C85752E13504BCC549A8F690CD2B0E1E29E4DFA3CC76BD398BBF28F33A00C3915DD719F7CB985E9A0A7CC8190BFFC8BF47310C71418D7A6C629C491EB8E455148BD4438BA6B7014608B0CE6A1BC5B035BC174C9BFFD966D8305FE9E5619BCA3FE4B39E6732DC652531819AC828F86EA11360678E786EAA741382D713AE26A608D582A3E4583D45744ACEDD32670B5AD4A1310301B28A174DC9858A55F0C1B7486CD66CB0635083B0C63016E40DFC533AB80C9CFAF1378D00769DCBAD56B09DA3A4E6CDBFD8F3FCB951680020DCA58647665462E42F42DC14E7B20F262D3CEB0B1A2BA807B98D66232AD7D3839C298564BC36A134CC2447B1B9FE69271960459C0A6F897C1878140690DA7D41FD8AAA05A679FDC3037EB2885AD3C82374F4BB991745351292DFD8E54F565E0093776B7EA65DDCD500BEB4D15AF6029F2630A0062F2D4FB331B47B6A5E139D385016E1FA490EAA209636B1383B7D7DC1148F07ED2CC2C03FA7FEE09305F34C57B3CE899C18462B4F1EF88C1AC5259440AAB48C5849652AAD9D3CF3D31F36C7F64F918868182D36345BA5BB7A4EE088D8B081EB78FE977F5A5295177AA427215BB26D1DE33AD4B2D610A47F8C672EEDA703A04D0FAE4C5961F13AD6FCA81863D8A394135565D8B27904A511FD0621A532F84A47CCF4FCC2114D4C369B7A76822959F8CAA25A6495081CA9EC3AC3348A981618592C090B6439CDA2FBC932C8697B3709323E3388AF8EFA1B9CDBD65A65C8F0C302330DDBD10E0235F8030562452EDE447EE5A5A9A636AF6F615B1210AA7CBE69572B3467B643BC5F5EC3F9AD15B3AD918993355E209ACBD0F1393076DA3B0950803295B6571E476ACAA04D48A4627367CB7FAA83796C4178CA9071DCCB8D3EA70381B61F0C56D515E0A765E266DACB13056317AD8737A1AD541AACCEA1641946E331229F19BB54C20BD51E63D63BFFA13110A552FD0A95AB984EF53BD639EFA0568C6875B2798E3A0578C940C0C4197D3587BCB1CC45A99F5D37B1612DC1A4178A3E288FBD79DDACD049159D6A5416F9EF3F38C74449BFB2E6A894566C5C17B4555E154F29A93241463690 + +count = 94 +seed = CEECCCD3F7BB922650E3F6E8F20C47AF17C1C1053EA8FE08226F167D67C3B0781BD774C4C7AAD23C6AB0B9F3E3F96F97 +mlen = 3135 +msg = E13692E3CC06EBE8FF9A292D890F0A34DFE9A4F968F196B475AC4DF553A30E2FD5DF008DF4D7508302AAF6389B6A5A9135E9BC8A5ACCD2BD2DF98FF662B763101D31E24E8F182FA50840BE27F76BA5ED645BB4D3F7F2F6CE25179A47FD7B6441A9B3A28783CEEDB425B2912734A75D7D03811172188253BD8F0F52EAEE84A9FB025F95EA1B566C53297A6A090F7FD8B21639523E073ADAA750D63DA61631F933FEDFFB2819E0EB3074E9E11E10B102AC88E2C8D6CF408FD241AD301F9B8E18A88B74CB4B0DAC76347635DFBB3EECFDF84229BABCC003C6E4EFB7394E25667DD7FA47D36E027559F53E98789E6E732E6AA23A71607677FB975C2852367C5BA5E3D10B3017AD26F9A38CE803929D08A43646FFBC3980B359D8BC2E9615636D4E5DE8DE6FB2465A983EB1696E98DD33FAEB7AF8C2D30506B22390D7F9FC21C7A016FDF22D21ED2EA4175FE9F5F44598EC26452700DC9A495675431E1236865F2F4AA5BC9C9A10EEE9E29B1FC4FEFCF8F24BF94342FC7E19AA6534C3B771D910AA419EA2BF70E2C1915891CC630A3397551E4F34BD2192B70EB210EA67CF152A35A3F5D0878E153579B42AFAFE5068B2BE2B48127FFB54553B7A9B6F845E7D72C43938AE42BC03E33B836AB212909510AAE7DBE8EE6D0EB8AD84D60832F3151273A1E09C514C3AA4CACD15564643F4255F36059022B91BA4137ECD97B34BE3308D40EF06BCF4F45EC625B54C7347F52A21815508199C8B7A6212779CD171894DA9FC3DE2A6EF5D76BFE03B8199ED1DC92B2A403E4DA009CBC0FB597C5952BE32579EB8E781EB12D935848C051029C528CBB68CBC1DE0102B42561E21F48E72E028C2CD8816A9027914571B49D2F94C9189E1A7F18D7D3D0A09B3A36EDB8A084ACE5FCCC77E3E42EDA0FBAB8C81EAF170103CA757981839C9448362BCAAAA3F20C8DC653AEF36953559F3597E1915F02A8D33D0E46201FC794EE055E6D9955B91FC7ABA1F136C280367404725CB355FC2F129413581401F98236D2A6F8BED7FDD7EA99060DABE3F0E8CE20B0E98EA80994D1673E8CCC6A0BA4A9D544F3D31BD95C9D3847527A978C1F155EFD84B6A7BECFB749628CE82E80285FC7272EA05F953404E437AD557F38FD9BBF77A69B81E4441605B23F2AAEDB00C7519D8E9CB4CAE5F8C3FA74FAABF6C12595BA045F647ABA7168C65C8A6006733D1341435495C7088C3361B50C43787EC24C24F57323466B5C088E8097B44666453010DA38AD65B426E72140AF78A5448B2F93DF3820F013FB9DCAC49604C86F2B2E4EA565463917285F148E8BFA9E11943AD3B86B14ED59A190CAE097DB26DAF8FD2A642676A37DD90C23B52C82CE028B80A805D9BA05457F7B6CBAECBA4094822E16C14D6E2291B731D581B12FB16802653360AAA6A7989D61C80DEBFCCE81A36D9ECC84039C4F086A5579D36FF5D0CBE61292E4FC3D14277AF380A9C1DBF36C2D61F59CFC0D62524E042710BFF5BA719E56BA367FFE849D660B9F7F3B638E113BF2E1A4DB1B8F65A0FD680BB2A168A4FD5B4E0EDF3208AD47F1FF4AFBAA726E38763CB5C84C03DA3D1E32CBA873B9A0C750922CD3D0A10A4877EAFEF602F5C875FBF0EE2F4F0AF7F308EF934F7E8E74FDA62A860BB594FD061D1B2BB32BA613339042FD90E749ACEF450D204072ACF58B18C365E4F4B815F1E837453C4255D53BB68D50F3677E7173FCC23D2B592149A9F3DD615868AF91F705387547862D34553FD45B8DF643F596DFDB7ABA47BD5D91445826C86FD4D30365A2F9A3CC0913DE19707D072F27A09EAB906304008875B5BE3526210D6B8BC8663975A1F78EAB9CD7F7305CDD4C00D6277622E50606E1CADD639730101D088BC2BAB295AD86BA8E26F5EBCB3E9C7C543E533A7B3C20F0F89001775F714825DC8547BAB06F5B99C5305EF18372A184569323FE269D45B669B9A222C9DEFBB0B2C84F42A57EF343A5C12F5712EEC33985DF8F0C566D471A9403FC103A3EEED42829D8E3E5C517BDE29447841CE96C8AC587DF3E4B6227FAB386140DB0112ED0D2846355C4A45E94F3A0718CEEC13FD3CAAEEFDF0B7F89F502AACF8C9D96D01B5549157B7DF2BE65BC30C889E69971700286C561DF91C8CB923001E5F0E21D2C7A3DFE8D1AF07FECE1EDA20C031B29A4389F265D2C7BE64EC37B2884849EF30FC8A82D2F766ACE68C72F0A4B72F3B50884749814387893DB2370A3410F794C64CD24BF0D13E44AD500BA9816F9BAED72F7593F758592C2E974D1207A664B869130BAA1FA71DBC55875134E7CFA276E36568F79483886099A1070C14C6E4EB87523E04C0154A2250624261211723453CFAD185298DE06D08CC25FA18BC58B34ECDF5D9DBB02541BAB4A2AF110AE09130E12439F1CECC34F9AB5D7BE36C827A6F2F6708B543D4AD2E424805E2A74895742B0A5DA30CABE4AB45F40CBFCCBEEBDAB9B8EB8F78781168B5BC79E04EFFE1757AB0547B9BD0D2625673CE528D2B4874D46DF0E09C24FC413EF9AB4C3D2E803C1E316D77FF5DE3368BB925B2B1F6FFC340525663931F5595C8AAAF9FB0DCCDFA4793519A66D4FDE38BD2044C60FD1DE15D60BA878FDA570E7AEF6DB69D2527A1F1481A9D05FF2F6F621238939ACF5D2C37B2BC3A194A9E65E7441764A5EE37B1FEF3B8C9C425BE1B5FF0D05BCB6A3B91876EC04ED89A31749FD443C2B85F8F388E7070D77DEE37E2B666628CC9A961236DD24AF2769C1F613B4E77F8E82D1F410ED59F63F1DF19BC53A448106DE4F8EFB8CC37E40144B0F658A4135E25A3CF36D8692DEF2677E4BEA3A9770F19E44D55080625421D5BADEBEF3B39BE71C08650B5718A9B2FCEFC4BECB26C4B63C43F6557DD66517D103907F82F9C2B965B7C5E36059D2159183F5ACB8B5FF5E6B92E94D53AB25AE955424E80EDEC4650BE293E836DA6148392C500FF4B7672932E90E068569B81AE335B2E5013CCC95F571948D58127EB1269A08D6E897D2D9B60F3E49847C05D0B3AC230A67EB6D38FFDBD4B8D82D7B9EC803429C701F080BE86FAA165C0111131712DB4957FD84A8936AB55558C69D33D5890CADD08D7F0D4962CF9E2F69C7517E79DB14B76E6E188F5ED95169A2A7E4C0EBC2175EC2DD44ABCF239CEB3E22F955ED25DA41768CA5FD9A9AE15FAAAFEB431958A679249AB8BF879185E8FBF9986B96A92972153B4CD0D1BE001E5AFAE3AD1F0B1191F1483738E728D4AD240538E5EF7BC9BA4D5903929D74CB64241306FDBAAAE17B1C3134AED2CC394D3EF9653CC62A29C4B0B9BE04E95E072EC98F7A80A7B575DED4A1993AA884C1EDFFE056EC475D934B4EB0EBF418975728C6E9CB3919B2B67D2C71228A4DF1FE2C8388E3A2BDD75549417FE795F1947F857B1C0C9CA021515FD4D79E691493B988080943C394BF29E4190082A94F224AFDE5853323EA51C06B41547EEC0DA5CC202A048D77C7B91E794C51E72B02EA7C14578C11D9DF48E099465783E496029EBB6D42D9CAA52902A4694355DB01DD7F5D7C113AE06E3F712FA577E937CD4FB817659F93964E194FE7D509A81C258C69C3415A8F11D35B414339FD1CC1D4F50665D9111592D1C3A3D69FCF6A971C285A94F5FFBFE8D2FD2746DCEB3B218D970D670D10135126E479D92000D41EABDEEA4C04D1748A4908DD39C60A52AA5FE29C8ACED50DC1295B5C2C4A98E3C62EE4F370F4D3E500FE27B66F65BAE604FD558D66B7F09CE36C36C8B5B4FED193EF56D1D8DF0FE6FE0031466A1C633203966FE83D6BFF843657DC0AF176AA8D5CB7312CB4E072BCFF24D5F3828E29B2037E8D1FB63537C70C27011E9A97E3F04895F4E84AC69C55D450B46D5792A5D790557BE64F765FA243AFA98527B976783E7ACDF76A7E1DCBDA72431FC30D7B05197478D8D74077626FF7409F95B24A1F1BB6B803B9F1B9AD5B06883FAE6C4B587C309A63F3B2FC9619032157B98C1DA9608107E87F4FEE0DAE995AB86AC9869446CDE92441F0B9F8240E6F7F7AA9189D92B7FAA3280FA749BA8C7729F8974049C5CBCB8C6650CF1C16B8194C7AE1A82B40B8B04488FCC69E674362FE4821D4C1846CD9BC49234BCC464013F5F9A082FB83D63098C331D4B1C9129F52259CCAF4A9237F8EC5BCCF06F230C08DDAF1D0C21C5930F55D3D5F60CBFC447E7FCBC75CD199733F8D17BD043B67B0C138CB0C9C8F2E477728F27DEE573796F71B013689B537AEAD4991E67F2F5EB94BFAD9509D7C235C9E55F68F26B9CE8AA90834D170F8B700A40AE9A817D5D17B1644D25BCF1172A5CF0C755A6EC04FAFC39DB06AAA05F5988E187B9E110EEDEA9C84B99AD29A4B31950F2C870A1F91DAA6A5817FAEAE516FA42660FCF56000F7365D8C6CC11D4784C6FC02E4D0C727806E9D43B957BBA124C980C31F81FACC6D46F6C38D227EEF8F0 +pk = 9A65A181921D2AD95DCF0529944762EC23E5652F5307A3516DB8278CA03A6F041C8324CB1D535EBE9C6B0682EE89F018C03FC7B2F862BAF1CFA6BB9A09F74B0306 +sk = 9A65A181921D2AD95DCF0529944762EC23E5652F5307A3516DB8278CA03A6F041C8324CB1D535EBE9C6B0682EE89F018C03FC7B2F862BAF1CFA6BB9A09F74B03060751AC809CCEB4003D6C5AA13EF51E415D0100000000000000000000000000001A8763EF4F021F4473589F6BBA0B0FF901FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF1958DC0A92F2FD2B63AFFE32B46957BA39FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000026F9FD65E0F5919DBE3814BB796E1F451C4E2BEE7604EAF4D9234862E5A851001117DB6282FC66065CC2CADCA9CA26C0901D50E2F956648E487058BB33663200556AC1C495A8928C2F9762E4AD7997CF69071C6DE083F56A320CD0684C4FA2005E93C78F4CE040973B4102655C9460D292EC8DFB8160D60ACDDC411A09C7E600 +smlen = 3283 +sm = B051F697EC09B228C8067D58B2D89DD60BA3092FB0D8C605AB39BD9A94DF070075EA1C717B80EF5F3D66B5359D5BE7D479F9753092C5492E5CC9B85EE049140400016DF5BE54DDEF13A170D992E2E603D3EFFBF3A7DA8C3F20927CB6D15ACAB2DBD8160CB79F76191307DE30871A44B4CE17E4CB993A54C52E32EB1C665C70F42B253C2D3D670C87EE4B9D7A9302D040E1010B02E13692E3CC06EBE8FF9A292D890F0A34DFE9A4F968F196B475AC4DF553A30E2FD5DF008DF4D7508302AAF6389B6A5A9135E9BC8A5ACCD2BD2DF98FF662B763101D31E24E8F182FA50840BE27F76BA5ED645BB4D3F7F2F6CE25179A47FD7B6441A9B3A28783CEEDB425B2912734A75D7D03811172188253BD8F0F52EAEE84A9FB025F95EA1B566C53297A6A090F7FD8B21639523E073ADAA750D63DA61631F933FEDFFB2819E0EB3074E9E11E10B102AC88E2C8D6CF408FD241AD301F9B8E18A88B74CB4B0DAC76347635DFBB3EECFDF84229BABCC003C6E4EFB7394E25667DD7FA47D36E027559F53E98789E6E732E6AA23A71607677FB975C2852367C5BA5E3D10B3017AD26F9A38CE803929D08A43646FFBC3980B359D8BC2E9615636D4E5DE8DE6FB2465A983EB1696E98DD33FAEB7AF8C2D30506B22390D7F9FC21C7A016FDF22D21ED2EA4175FE9F5F44598EC26452700DC9A495675431E1236865F2F4AA5BC9C9A10EEE9E29B1FC4FEFCF8F24BF94342FC7E19AA6534C3B771D910AA419EA2BF70E2C1915891CC630A3397551E4F34BD2192B70EB210EA67CF152A35A3F5D0878E153579B42AFAFE5068B2BE2B48127FFB54553B7A9B6F845E7D72C43938AE42BC03E33B836AB212909510AAE7DBE8EE6D0EB8AD84D60832F3151273A1E09C514C3AA4CACD15564643F4255F36059022B91BA4137ECD97B34BE3308D40EF06BCF4F45EC625B54C7347F52A21815508199C8B7A6212779CD171894DA9FC3DE2A6EF5D76BFE03B8199ED1DC92B2A403E4DA009CBC0FB597C5952BE32579EB8E781EB12D935848C051029C528CBB68CBC1DE0102B42561E21F48E72E028C2CD8816A9027914571B49D2F94C9189E1A7F18D7D3D0A09B3A36EDB8A084ACE5FCCC77E3E42EDA0FBAB8C81EAF170103CA757981839C9448362BCAAAA3F20C8DC653AEF36953559F3597E1915F02A8D33D0E46201FC794EE055E6D9955B91FC7ABA1F136C280367404725CB355FC2F129413581401F98236D2A6F8BED7FDD7EA99060DABE3F0E8CE20B0E98EA80994D1673E8CCC6A0BA4A9D544F3D31BD95C9D3847527A978C1F155EFD84B6A7BECFB749628CE82E80285FC7272EA05F953404E437AD557F38FD9BBF77A69B81E4441605B23F2AAEDB00C7519D8E9CB4CAE5F8C3FA74FAABF6C12595BA045F647ABA7168C65C8A6006733D1341435495C7088C3361B50C43787EC24C24F57323466B5C088E8097B44666453010DA38AD65B426E72140AF78A5448B2F93DF3820F013FB9DCAC49604C86F2B2E4EA565463917285F148E8BFA9E11943AD3B86B14ED59A190CAE097DB26DAF8FD2A642676A37DD90C23B52C82CE028B80A805D9BA05457F7B6CBAECBA4094822E16C14D6E2291B731D581B12FB16802653360AAA6A7989D61C80DEBFCCE81A36D9ECC84039C4F086A5579D36FF5D0CBE61292E4FC3D14277AF380A9C1DBF36C2D61F59CFC0D62524E042710BFF5BA719E56BA367FFE849D660B9F7F3B638E113BF2E1A4DB1B8F65A0FD680BB2A168A4FD5B4E0EDF3208AD47F1FF4AFBAA726E38763CB5C84C03DA3D1E32CBA873B9A0C750922CD3D0A10A4877EAFEF602F5C875FBF0EE2F4F0AF7F308EF934F7E8E74FDA62A860BB594FD061D1B2BB32BA613339042FD90E749ACEF450D204072ACF58B18C365E4F4B815F1E837453C4255D53BB68D50F3677E7173FCC23D2B592149A9F3DD615868AF91F705387547862D34553FD45B8DF643F596DFDB7ABA47BD5D91445826C86FD4D30365A2F9A3CC0913DE19707D072F27A09EAB906304008875B5BE3526210D6B8BC8663975A1F78EAB9CD7F7305CDD4C00D6277622E50606E1CADD639730101D088BC2BAB295AD86BA8E26F5EBCB3E9C7C543E533A7B3C20F0F89001775F714825DC8547BAB06F5B99C5305EF18372A184569323FE269D45B669B9A222C9DEFBB0B2C84F42A57EF343A5C12F5712EEC33985DF8F0C566D471A9403FC103A3EEED42829D8E3E5C517BDE29447841CE96C8AC587DF3E4B6227FAB386140DB0112ED0D2846355C4A45E94F3A0718CEEC13FD3CAAEEFDF0B7F89F502AACF8C9D96D01B5549157B7DF2BE65BC30C889E69971700286C561DF91C8CB923001E5F0E21D2C7A3DFE8D1AF07FECE1EDA20C031B29A4389F265D2C7BE64EC37B2884849EF30FC8A82D2F766ACE68C72F0A4B72F3B50884749814387893DB2370A3410F794C64CD24BF0D13E44AD500BA9816F9BAED72F7593F758592C2E974D1207A664B869130BAA1FA71DBC55875134E7CFA276E36568F79483886099A1070C14C6E4EB87523E04C0154A2250624261211723453CFAD185298DE06D08CC25FA18BC58B34ECDF5D9DBB02541BAB4A2AF110AE09130E12439F1CECC34F9AB5D7BE36C827A6F2F6708B543D4AD2E424805E2A74895742B0A5DA30CABE4AB45F40CBFCCBEEBDAB9B8EB8F78781168B5BC79E04EFFE1757AB0547B9BD0D2625673CE528D2B4874D46DF0E09C24FC413EF9AB4C3D2E803C1E316D77FF5DE3368BB925B2B1F6FFC340525663931F5595C8AAAF9FB0DCCDFA4793519A66D4FDE38BD2044C60FD1DE15D60BA878FDA570E7AEF6DB69D2527A1F1481A9D05FF2F6F621238939ACF5D2C37B2BC3A194A9E65E7441764A5EE37B1FEF3B8C9C425BE1B5FF0D05BCB6A3B91876EC04ED89A31749FD443C2B85F8F388E7070D77DEE37E2B666628CC9A961236DD24AF2769C1F613B4E77F8E82D1F410ED59F63F1DF19BC53A448106DE4F8EFB8CC37E40144B0F658A4135E25A3CF36D8692DEF2677E4BEA3A9770F19E44D55080625421D5BADEBEF3B39BE71C08650B5718A9B2FCEFC4BECB26C4B63C43F6557DD66517D103907F82F9C2B965B7C5E36059D2159183F5ACB8B5FF5E6B92E94D53AB25AE955424E80EDEC4650BE293E836DA6148392C500FF4B7672932E90E068569B81AE335B2E5013CCC95F571948D58127EB1269A08D6E897D2D9B60F3E49847C05D0B3AC230A67EB6D38FFDBD4B8D82D7B9EC803429C701F080BE86FAA165C0111131712DB4957FD84A8936AB55558C69D33D5890CADD08D7F0D4962CF9E2F69C7517E79DB14B76E6E188F5ED95169A2A7E4C0EBC2175EC2DD44ABCF239CEB3E22F955ED25DA41768CA5FD9A9AE15FAAAFEB431958A679249AB8BF879185E8FBF9986B96A92972153B4CD0D1BE001E5AFAE3AD1F0B1191F1483738E728D4AD240538E5EF7BC9BA4D5903929D74CB64241306FDBAAAE17B1C3134AED2CC394D3EF9653CC62A29C4B0B9BE04E95E072EC98F7A80A7B575DED4A1993AA884C1EDFFE056EC475D934B4EB0EBF418975728C6E9CB3919B2B67D2C71228A4DF1FE2C8388E3A2BDD75549417FE795F1947F857B1C0C9CA021515FD4D79E691493B988080943C394BF29E4190082A94F224AFDE5853323EA51C06B41547EEC0DA5CC202A048D77C7B91E794C51E72B02EA7C14578C11D9DF48E099465783E496029EBB6D42D9CAA52902A4694355DB01DD7F5D7C113AE06E3F712FA577E937CD4FB817659F93964E194FE7D509A81C258C69C3415A8F11D35B414339FD1CC1D4F50665D9111592D1C3A3D69FCF6A971C285A94F5FFBFE8D2FD2746DCEB3B218D970D670D10135126E479D92000D41EABDEEA4C04D1748A4908DD39C60A52AA5FE29C8ACED50DC1295B5C2C4A98E3C62EE4F370F4D3E500FE27B66F65BAE604FD558D66B7F09CE36C36C8B5B4FED193EF56D1D8DF0FE6FE0031466A1C633203966FE83D6BFF843657DC0AF176AA8D5CB7312CB4E072BCFF24D5F3828E29B2037E8D1FB63537C70C27011E9A97E3F04895F4E84AC69C55D450B46D5792A5D790557BE64F765FA243AFA98527B976783E7ACDF76A7E1DCBDA72431FC30D7B05197478D8D74077626FF7409F95B24A1F1BB6B803B9F1B9AD5B06883FAE6C4B587C309A63F3B2FC9619032157B98C1DA9608107E87F4FEE0DAE995AB86AC9869446CDE92441F0B9F8240E6F7F7AA9189D92B7FAA3280FA749BA8C7729F8974049C5CBCB8C6650CF1C16B8194C7AE1A82B40B8B04488FCC69E674362FE4821D4C1846CD9BC49234BCC464013F5F9A082FB83D63098C331D4B1C9129F52259CCAF4A9237F8EC5BCCF06F230C08DDAF1D0C21C5930F55D3D5F60CBFC447E7FCBC75CD199733F8D17BD043B67B0C138CB0C9C8F2E477728F27DEE573796F71B013689B537AEAD4991E67F2F5EB94BFAD9509D7C235C9E55F68F26B9CE8AA90834D170F8B700A40AE9A817D5D17B1644D25BCF1172A5CF0C755A6EC04FAFC39DB06AAA05F5988E187B9E110EEDEA9C84B99AD29A4B31950F2C870A1F91DAA6A5817FAEAE516FA42660FCF56000F7365D8C6CC11D4784C6FC02E4D0C727806E9D43B957BBA124C980C31F81FACC6D46F6C38D227EEF8F0 + +count = 95 +seed = 2489C04BA57D149A60F446670C13C29998B52F3BAD548A751D7134B694DB25ABFA034FB4BA45E105AE27D575CBD02B99 +mlen = 3168 +msg = 1F7AB96E8C14D1A5094672D7034FA8F81703A2CC18983C972CC66736CD98B031AC8A479CED21A1F634938DF85F3E83161646DB81B9AC3EA22F80980B8E2EBA4E9975714E5A98985817F426C41F3968349686B69AF917564A2648401B8FA127FC3200DC16A9E663D1D345EA83131E21229DD39E70D7270DE7577A7E9635602FD2C30EFAF204A9234F0A73D21375658B0B0B04927E67F3F5534614EDF5137BADFED914A49AA301000092DA93B3FA4A0FF592CC3A53F4A75B54FEE775EFA421EEFCD6E0D32FB5CDC096886076DA940B26C6E07F12F6E08FA7B3E2DC42055308E5607A2732717AE592A6909C6E084252A5B08685FE8C6C1DA387B0AA9800B67CDB3EE2FB21B9BE5E6B79AB545563068441C0C9C1E68CEF6028A5CEDF27D3CA47D95094C9E1E68B8449758BE3FF8FDE148ABC420295DC76E3EBA8E11433217FDC3136551A5A41C1C7E7D6EF43601946897FDA54842D8F73FAA7EB7ED0DE544FEF2A95C6FECB13C8C0F14B5B22493F54374184B73D5BD47383BBC5DD7BC1BEAC0CB8E66D2F413A9DCEB7E1D0EE2D63B9EB28DB232C33A95B792AE67D2591F5AF59DDC45771A0E7195C4D25E7F4079359597678B0C0A87DF3D66A686A9215DD566D4722C212AD05A23E1377E37E18A6AB3AB8BF5CD47BF1BAF06EB05E4C150CA67D7E52BD297A08CFC97B575752E686B83575F425F3A450BB0F596A60E41F7183F463007FD019EE255BDEF1D98B7A0A12EC33B3E2BC9BF0CC8F4860DEBCFBBD5E40B2ADC2CD10EC35A341BE7A49F8D204FDAE86921B7DE5BA700A61E2B041A8EA7040ACEE844892E5CF025FFEC5322FF6D765BFF1107C967A12ECCB0489F64F8C13BD7057DF76485446641AA7A560C7E73008C46572628E1A225A8D3F6D68DDC9759A952FC07CD43DE4434BD3391089E900275E9EBC92563AC1403BB7DFDD182092130E3E6AEB7B666F4BA66C38BBE1F726F40A07DF6C42079A6054399519E26D765CA065F4DDFD27A29CBA292699CD826FA9D3E7EE31B0D76813879DB5EC5C7F454095DC3BD27323DABD2DFF949AC760D6137334507816330FA67D886021661ADC69AEBD882A07E01B4B6E5492399ECDEA99222EE785C810B30409DFAF2A3CE5A05D699C2368249C9588D86FEAA778B4860D6DD442088A21D2D9D0B49B15EC579776812AF8AD582F1C44BB6432D7472300B5440A382ED87AB64B20373A0ABDBCE391D0BFFC9C543EC686449FCA9D04B7141836A416720BDFF250A06D7651A1F98EABE4B340B2303591D0847AED6FFE423B6DD8C0C03459C381DB506F531343F82C116323899DF1E5D8DB8997BEC12EB70103F0BF2B3D53C4D4694052606EE32BE4F5B35450358D7D85062DCF7F0BDB51364700BAF92CD6ACE4E2C10E6CD9A332716F5F4BF7598466A99238357798A499C9B8BE77690635C57E7D87A904B3F2278C0B1B23E5860B0532F152E1626C86FD855F656B5D070BC81CE4634A87C8EA6D6A433C02DD2E6D6561B25968B149A6F3BBA40B749F188B84314B5778A000CAE91A53D59860EE6F7DF38CA0935CD64C08A34BF19981C17951B9C39A847D0637441452E38CE5E1D9B99BED51B86705CEBB8D3244C40BB8D70F846936A2BE29C21604A7E6BD3E655022B929954F6C9A5743F5FC2127B49956D80128DD582CEAA06FC174813E5F5E6A0A4D7D26756FB28A6588E9410722591CCE2A6C6ED0976B98E1FB0C642D5DF8F08E96BAE1FE10375FA1D7C70806101570FEF1EBC8F58664281E2B61DF2081B655013AEF54616308504F5F4A1E8F156680163489D3FE7BB0A514F1D2D57EE6302853D7D03C767C7BDFB79E2B8C80403F26F6EDBDD6A890A0A0B9B76D334E0F729FF9C47BFE960A1C3FAF77E81B9AC156367423DBB4D766A1F3B1E67595EFFD76287F22BC37DA4F0204633E804002EB7C1AD0836FA4D01E2FCDEAB8457DFC3D8B7F1151BEF3574F8F4653AA3780003787B8891901ABC8250A974C15F2DDDF9E1BE6798647EED710D06CC3FB4C276BFFA585680FC632D8EFD1614745BC3C72B82C53FEAE935EA5014E2B321F69BADF570FAD878C9590FD20FB7BF1B31E373DA93D1A8C63EA45E698CE060FE70ABA0FA84F37E836F2AD2998F07101D3FC7CA2B08B1398E1687ED5A8CE860EF9B4889FF436B74D13281D1F6A7EDF1DBE8989BFAEEFE6A475E65217643E757006871E664099F5B3846553603CD9EEF8FC195807361FBFDEB8DEE6A0B79F009C10DF397FFB865F4EBD0473D458D553358029C6B5A95D6FFEE9B645311D10A8F479B7E5249AA87E3DED08311B4DDF3A458FE61AE294A22643861826ACBBC9B0EA8B73157CE15D1FF35098AE67159B07CA7499398C26776DD9884B5D3786C87D48E864D8BBE2B73E2890F217E135BFDFC4DC5E805D9CEFEF5268E33DB611ABA6A5D57EC82B7246A63DCF3EAF3A51CF503D65C206D2362421DE774158AEAFFEE45A6B5AD5CC0B1DE0E2EA74E97913729A69E9C00A309DDCEB7738BAF4757EA9CC96E055BBDF692B12D8B01B92CE5ECF3D52187402CB7FD961A2672DC1875B6EA22AD7F5F42B1B52BA2D780F2E6C5B25FC7E30B1B663E3A09C8FF0B5C302E0E7F984DDCC62DDA65FD996E17DA72F02A16C354BBDAD44C5B5044759BD53789B98BC58CC25FCDF10A9CBBF0FD6ABD58A4CEDD92C5D85EF22B3C5EE5D9440CE42995517D2F7352CE997F51A36B9FA5703B4C6491AD01F406FD1B5BF85321026D28B51354DADEDF057B37743499A986469F908A01F3C1B74DEF5D8E2F57ED25A80720B540333109A0A65E7984B557F65429F3D3BD7EC3732A10D7AF36DD5D2414A09949A0F57F37BD9021D2C482E61437CC15E9DFDD92D4C212C4FC6C22C54591E5AFD48210FDC88040135E433F50E45874E0D5EE2BBC857F2C80E2FA4FC7ACFEC8EEC0CAB351F677C790787C715945C21BF923EDC0A58878AE09ACF5FB5A003C9C0B6E30A450CE6DAD4B626108B88E89F1E6A7BB3843E1EC8AEE35AF69E81773CFF71190F819CCF24142D60AC51B80B61019EC7ED2EFB6C5F18B499FC9727BED2E3324F8B94A522092E0A98241E29F8F14C6561DF3FEA0824F9CB0FE10BB497E427EE62085E7AABB2900FA47BF27C1638BD116C5555C076DEEFE9754E8ED333D72CE9423E27EF640FD5199C0CAFBCF2DA1C5C34121A69E7E0DEB3C268FE60C6797056383DA43E6F472D225116F63124498271D3D43AADCC5871F2349CE040BE068D72EB57B7827A7D9AA01405BA0AB07E684B91EF05418948F6713AEF1F4948399E0E6130740CAE3E481A6366295422BE3EE2E892AA9FEE86A6E23E2EBCBE654989FD93D1C4E7D62910E1223BD66B7C54F8DD7D373986E5D4141BF0BDE98DD13AAB7D598D698660F11FA4BFB0AD09D5C27B65386C8673E6C4AE9E8E30F8DD1A5A3FE557A3C29DCF99A7C376200AB595C49445E740E3DAEC07BC047FD6EA4FC6CFDC23D7449F9D1170FE635CA36D3DE5B57F1CFB182DE240CD4C1E480600C449D1A8596D8315906A53954201929E7665DD2E27D590D481DD394CF2E8AE19217F1FF0CB511DEF7460DC9E49C21607247857BA744B1384344B4C2D8CE987512376F66F1A279509281242A7A2A58ED500395418138ABDB9C5572A258D157F4D3E88ED216BBE9CEE3BD054FE61F94C59A4AD19AA62E456B86CADE61622A6FEA877575EEAEA20C76AE8A89E7B44396BAE0EEEAB1C23F221A3DF2B2CC683256A4E5C8207EDA0B235562AD3B510F9D3FBE0B51CD8F238A0ABD2EC182681606C8FD111D8CE1EC1CDA6DB4572303DDEB925AC1FFFD75E321468266790DEE6BC0E85070CEE749D9E46795936324DD1388E1B11AA617500534B8DAF2DE12B035F73111B770F5F56F5C6A4152C45CE0E112E650FAA9F3C7E59E3410745C29FA59CAE5CC37FE4C6594990E50DF1576B69B2B292AFC58A804743F49DD7C98C1768FD19AB4213AE4FB197492AF5BF7FBC6C8B507673539D8515DD527FAFDD8CA3EFF629CAA720AA11E65922678447AD4DDF5FF943873DF5203AFEA4130CA5F633E104AB083EC690CF092D208A98006E91BC7E33731D18E592869E564E6D3FF8BBBBB9837FFC1F1B92DE0F5DD4A029C51E3F64592CAC3DE1B4CA5414F894B7B0B7D73D6BF1DA4B908ACEAB47771DA56A8B0536301FC5FD270CAA55CE171332F7DB2EB4619C4B2C1971EBC0AB8B0B11FD54C24285DA8428AB9E0150D8897216B133ED554DE8CEE532024DF8B8D9314D7C9A3EC60464F9C7BCA8C3D4FBA23A7B543AC111ABA8C8F1BD54A243D565DC062F84CCCEDB0A03375FDFBCEF8AD8CAFC440D3E6F988DC607ECB947673DEC4AD48724C91A6BE22A0027E42AF6D94D26D188D0B7B3A5AF012880FC0105DD2F11171742321DD41A0401415C58AD4DC445642A2CBB466788F54D270BD8DF25602B298B62B6D0FA3ADA97008A99B73A807092F8957F17EEAD9D53B1128FBEF1DEFCBC607EA92AFBD353E95F52D33AB7C1EBE2 +pk = B88AEE7553D16879D458530258756C11C21A933E64DE60215C650AD888152601353ED647C938F5E120D1911D26BDF5E92F860420AFC1303BCDF329FE7B2280040B +sk = B88AEE7553D16879D458530258756C11C21A933E64DE60215C650AD888152601353ED647C938F5E120D1911D26BDF5E92F860420AFC1303BCDF329FE7B2280040BD109EE819DACE9A0A2521E5D07E58F512C010000000000000000000000000000EE0A122FFAE6D5F9119D9BDA78E252912DFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B2D05873AE9B902F6288EEE2F69B9173CFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000002BA313FAEEAD3E5461EF362A64E8F324ED7217EDF53F959C88D216E330541E000648B32B70CC65D0CE511299E4FDF12569C2A30CF83AD0047784D0FB3CD82B00246BAA4F8BAE6017FFBC45CDD8C4E6D60E248F0FB4D6029046BA5856AB5D2A0031CA66126824C931080E7847D108F7CB1A0BC12223A589B6B03B1A5853E6C100 +smlen = 3316 +sm = B5E81ED5DE831457247DCDE788228CDE6E984C93B39145A7815A455DB48C5E00F0A4445E84F00BBA643DC293E4A19CD5F263BEC73310212E2D6ACF2B0C74090300002C73D1496B5E1C563455522D5F97C8520766413E88D928A35E82E9296A793BC0D1B234CC01D898310EC4CBF7E9294B414FE5032F3E6C8E680C39B13741FED8A08805D33AFDE92FE84C63798FF7E4C6020B041F7AB96E8C14D1A5094672D7034FA8F81703A2CC18983C972CC66736CD98B031AC8A479CED21A1F634938DF85F3E83161646DB81B9AC3EA22F80980B8E2EBA4E9975714E5A98985817F426C41F3968349686B69AF917564A2648401B8FA127FC3200DC16A9E663D1D345EA83131E21229DD39E70D7270DE7577A7E9635602FD2C30EFAF204A9234F0A73D21375658B0B0B04927E67F3F5534614EDF5137BADFED914A49AA301000092DA93B3FA4A0FF592CC3A53F4A75B54FEE775EFA421EEFCD6E0D32FB5CDC096886076DA940B26C6E07F12F6E08FA7B3E2DC42055308E5607A2732717AE592A6909C6E084252A5B08685FE8C6C1DA387B0AA9800B67CDB3EE2FB21B9BE5E6B79AB545563068441C0C9C1E68CEF6028A5CEDF27D3CA47D95094C9E1E68B8449758BE3FF8FDE148ABC420295DC76E3EBA8E11433217FDC3136551A5A41C1C7E7D6EF43601946897FDA54842D8F73FAA7EB7ED0DE544FEF2A95C6FECB13C8C0F14B5B22493F54374184B73D5BD47383BBC5DD7BC1BEAC0CB8E66D2F413A9DCEB7E1D0EE2D63B9EB28DB232C33A95B792AE67D2591F5AF59DDC45771A0E7195C4D25E7F4079359597678B0C0A87DF3D66A686A9215DD566D4722C212AD05A23E1377E37E18A6AB3AB8BF5CD47BF1BAF06EB05E4C150CA67D7E52BD297A08CFC97B575752E686B83575F425F3A450BB0F596A60E41F7183F463007FD019EE255BDEF1D98B7A0A12EC33B3E2BC9BF0CC8F4860DEBCFBBD5E40B2ADC2CD10EC35A341BE7A49F8D204FDAE86921B7DE5BA700A61E2B041A8EA7040ACEE844892E5CF025FFEC5322FF6D765BFF1107C967A12ECCB0489F64F8C13BD7057DF76485446641AA7A560C7E73008C46572628E1A225A8D3F6D68DDC9759A952FC07CD43DE4434BD3391089E900275E9EBC92563AC1403BB7DFDD182092130E3E6AEB7B666F4BA66C38BBE1F726F40A07DF6C42079A6054399519E26D765CA065F4DDFD27A29CBA292699CD826FA9D3E7EE31B0D76813879DB5EC5C7F454095DC3BD27323DABD2DFF949AC760D6137334507816330FA67D886021661ADC69AEBD882A07E01B4B6E5492399ECDEA99222EE785C810B30409DFAF2A3CE5A05D699C2368249C9588D86FEAA778B4860D6DD442088A21D2D9D0B49B15EC579776812AF8AD582F1C44BB6432D7472300B5440A382ED87AB64B20373A0ABDBCE391D0BFFC9C543EC686449FCA9D04B7141836A416720BDFF250A06D7651A1F98EABE4B340B2303591D0847AED6FFE423B6DD8C0C03459C381DB506F531343F82C116323899DF1E5D8DB8997BEC12EB70103F0BF2B3D53C4D4694052606EE32BE4F5B35450358D7D85062DCF7F0BDB51364700BAF92CD6ACE4E2C10E6CD9A332716F5F4BF7598466A99238357798A499C9B8BE77690635C57E7D87A904B3F2278C0B1B23E5860B0532F152E1626C86FD855F656B5D070BC81CE4634A87C8EA6D6A433C02DD2E6D6561B25968B149A6F3BBA40B749F188B84314B5778A000CAE91A53D59860EE6F7DF38CA0935CD64C08A34BF19981C17951B9C39A847D0637441452E38CE5E1D9B99BED51B86705CEBB8D3244C40BB8D70F846936A2BE29C21604A7E6BD3E655022B929954F6C9A5743F5FC2127B49956D80128DD582CEAA06FC174813E5F5E6A0A4D7D26756FB28A6588E9410722591CCE2A6C6ED0976B98E1FB0C642D5DF8F08E96BAE1FE10375FA1D7C70806101570FEF1EBC8F58664281E2B61DF2081B655013AEF54616308504F5F4A1E8F156680163489D3FE7BB0A514F1D2D57EE6302853D7D03C767C7BDFB79E2B8C80403F26F6EDBDD6A890A0A0B9B76D334E0F729FF9C47BFE960A1C3FAF77E81B9AC156367423DBB4D766A1F3B1E67595EFFD76287F22BC37DA4F0204633E804002EB7C1AD0836FA4D01E2FCDEAB8457DFC3D8B7F1151BEF3574F8F4653AA3780003787B8891901ABC8250A974C15F2DDDF9E1BE6798647EED710D06CC3FB4C276BFFA585680FC632D8EFD1614745BC3C72B82C53FEAE935EA5014E2B321F69BADF570FAD878C9590FD20FB7BF1B31E373DA93D1A8C63EA45E698CE060FE70ABA0FA84F37E836F2AD2998F07101D3FC7CA2B08B1398E1687ED5A8CE860EF9B4889FF436B74D13281D1F6A7EDF1DBE8989BFAEEFE6A475E65217643E757006871E664099F5B3846553603CD9EEF8FC195807361FBFDEB8DEE6A0B79F009C10DF397FFB865F4EBD0473D458D553358029C6B5A95D6FFEE9B645311D10A8F479B7E5249AA87E3DED08311B4DDF3A458FE61AE294A22643861826ACBBC9B0EA8B73157CE15D1FF35098AE67159B07CA7499398C26776DD9884B5D3786C87D48E864D8BBE2B73E2890F217E135BFDFC4DC5E805D9CEFEF5268E33DB611ABA6A5D57EC82B7246A63DCF3EAF3A51CF503D65C206D2362421DE774158AEAFFEE45A6B5AD5CC0B1DE0E2EA74E97913729A69E9C00A309DDCEB7738BAF4757EA9CC96E055BBDF692B12D8B01B92CE5ECF3D52187402CB7FD961A2672DC1875B6EA22AD7F5F42B1B52BA2D780F2E6C5B25FC7E30B1B663E3A09C8FF0B5C302E0E7F984DDCC62DDA65FD996E17DA72F02A16C354BBDAD44C5B5044759BD53789B98BC58CC25FCDF10A9CBBF0FD6ABD58A4CEDD92C5D85EF22B3C5EE5D9440CE42995517D2F7352CE997F51A36B9FA5703B4C6491AD01F406FD1B5BF85321026D28B51354DADEDF057B37743499A986469F908A01F3C1B74DEF5D8E2F57ED25A80720B540333109A0A65E7984B557F65429F3D3BD7EC3732A10D7AF36DD5D2414A09949A0F57F37BD9021D2C482E61437CC15E9DFDD92D4C212C4FC6C22C54591E5AFD48210FDC88040135E433F50E45874E0D5EE2BBC857F2C80E2FA4FC7ACFEC8EEC0CAB351F677C790787C715945C21BF923EDC0A58878AE09ACF5FB5A003C9C0B6E30A450CE6DAD4B626108B88E89F1E6A7BB3843E1EC8AEE35AF69E81773CFF71190F819CCF24142D60AC51B80B61019EC7ED2EFB6C5F18B499FC9727BED2E3324F8B94A522092E0A98241E29F8F14C6561DF3FEA0824F9CB0FE10BB497E427EE62085E7AABB2900FA47BF27C1638BD116C5555C076DEEFE9754E8ED333D72CE9423E27EF640FD5199C0CAFBCF2DA1C5C34121A69E7E0DEB3C268FE60C6797056383DA43E6F472D225116F63124498271D3D43AADCC5871F2349CE040BE068D72EB57B7827A7D9AA01405BA0AB07E684B91EF05418948F6713AEF1F4948399E0E6130740CAE3E481A6366295422BE3EE2E892AA9FEE86A6E23E2EBCBE654989FD93D1C4E7D62910E1223BD66B7C54F8DD7D373986E5D4141BF0BDE98DD13AAB7D598D698660F11FA4BFB0AD09D5C27B65386C8673E6C4AE9E8E30F8DD1A5A3FE557A3C29DCF99A7C376200AB595C49445E740E3DAEC07BC047FD6EA4FC6CFDC23D7449F9D1170FE635CA36D3DE5B57F1CFB182DE240CD4C1E480600C449D1A8596D8315906A53954201929E7665DD2E27D590D481DD394CF2E8AE19217F1FF0CB511DEF7460DC9E49C21607247857BA744B1384344B4C2D8CE987512376F66F1A279509281242A7A2A58ED500395418138ABDB9C5572A258D157F4D3E88ED216BBE9CEE3BD054FE61F94C59A4AD19AA62E456B86CADE61622A6FEA877575EEAEA20C76AE8A89E7B44396BAE0EEEAB1C23F221A3DF2B2CC683256A4E5C8207EDA0B235562AD3B510F9D3FBE0B51CD8F238A0ABD2EC182681606C8FD111D8CE1EC1CDA6DB4572303DDEB925AC1FFFD75E321468266790DEE6BC0E85070CEE749D9E46795936324DD1388E1B11AA617500534B8DAF2DE12B035F73111B770F5F56F5C6A4152C45CE0E112E650FAA9F3C7E59E3410745C29FA59CAE5CC37FE4C6594990E50DF1576B69B2B292AFC58A804743F49DD7C98C1768FD19AB4213AE4FB197492AF5BF7FBC6C8B507673539D8515DD527FAFDD8CA3EFF629CAA720AA11E65922678447AD4DDF5FF943873DF5203AFEA4130CA5F633E104AB083EC690CF092D208A98006E91BC7E33731D18E592869E564E6D3FF8BBBBB9837FFC1F1B92DE0F5DD4A029C51E3F64592CAC3DE1B4CA5414F894B7B0B7D73D6BF1DA4B908ACEAB47771DA56A8B0536301FC5FD270CAA55CE171332F7DB2EB4619C4B2C1971EBC0AB8B0B11FD54C24285DA8428AB9E0150D8897216B133ED554DE8CEE532024DF8B8D9314D7C9A3EC60464F9C7BCA8C3D4FBA23A7B543AC111ABA8C8F1BD54A243D565DC062F84CCCEDB0A03375FDFBCEF8AD8CAFC440D3E6F988DC607ECB947673DEC4AD48724C91A6BE22A0027E42AF6D94D26D188D0B7B3A5AF012880FC0105DD2F11171742321DD41A0401415C58AD4DC445642A2CBB466788F54D270BD8DF25602B298B62B6D0FA3ADA97008A99B73A807092F8957F17EEAD9D53B1128FBEF1DEFCBC607EA92AFBD353E95F52D33AB7C1EBE2 + +count = 96 +seed = 26CF860726D4DFA38AE07399838BB336F1BEE59E9F23AE4C81E73D49964997EF21CB5F5412F9A70A1EC39FC6228C36CA +mlen = 3201 +msg = DE897F02AE7292ABAFA6A0CAD52929113410F2BA972B4184E894C4D31081420751560956F49CE2B772635625AFC3CA6698FBFDE4D0A05EF243DF190BA1CE780EB572590E01E6E283E1963F2B0722B0CEB365552F65BD405F1A284DDBED07BA61C4453D30CC28C83E41590E09D7BB6932D231285205D61332FA9263B8A2D3D7F7FA20F521CA4B49F249896780E08C2DC41669BF0777278F87BB1F72CDDF4B998062B1642791F81AD474D6D8F963DCB4458CE11108544C41CDF19145B77038C7E8ADCD6501508C53B25BE6E787313018620D1BA647CCA4A5A8399E11815EAECEC6AE66DBC576699BB0AB44DE111AB6F252256389EFDC0546E641DE87FD6A3A724716257A9174F39542539A593864441EB79D499FCDF2F1D053CEBB3A1FCC09419D2C553C2265B3DC3943E0341BB49130E9981EC59945FA0B23E9DBDBF352ABA0D925C4333F2EE1F2C83C847EFA78BB13263B893D7CAE029BF08CEA2A5D1B5B997E403A489C6D9A124FB8386FE58C2476894E7754B8E5A162102A119482B5E59F8D89C8B1DEA70B6C80641C77BFD12D45C5B3CE0021EE500A1665ABCF740794E0D3E7E8CB5804A1E0D0C81A107DEE80BF63BFF8CE2EE2DD602DF279DE39C579B417A758356D2B48B41E83495DEE9ADFE4506E03F19DD096E81405264D408B2FBCDBF41DB5CED6FBDC2645DBEFE5BD038382993970C7686DBA3FEDC24E1F91BA4B6CF70B2E832B97BE24B6393273A519DB0B4446E98D77E86CCACFBECCB18939013C66F7A29B10DE2E88FCFAEF656B858B7DFACC4F21EF5F328C0EF604FEDD993510BA40530B79525FE8D336DEF0E5C303539E664A9360EDAD7268F70DF4DE199AB3F70EB2BA65E2752BF5FDB1E853E6F4EFCAFBB31D8CC23155413BE31082DA958B01682894A9057CAB66D4D64A6F3B1D81C5B75815A3E0CAF6486B17339174276A84E11C117B060302DC2EE06A03C0E15395C0DD32661638F059A385578C1B792349A41C511D12AC7185B060A831EE296E6626459C2750FAF3AFB579F6F6836D566C00C979B5130E8E50431E914834CBB3D26F6E5BA50BCF05D50F699FAF10767AA2831C3557A53AF14BFD9F23C00F76C2680C7DBF4A9B2A425E34C943228C3EBE55A0960ACC757D7878F7943E2E8A1CBC8C0D2139A6A6459D3492A1A7757F71E90A58A78E0FF9B04D059C5D131F6E3C30742FDE5506AE7860045A4C903DE96DC43AC6A69273BF8EDAB7E7FAFBAAD9EFA8FA609961502EFACCDE63A6D98D8D017075487C608FF701A7E3381D7A2ACB134B198950ECC6970A75AF5625FAA4EAF968CCE48FFB673F4F365802A984C609C33BA312140A60A6F0924E945D11BAACFCD643C874D352A90367EA4C59B63665364832B1A9A9A01EDA92C64F393C357158973FA7C6047B8B5E27EEDB28E26359402B63032F8B230F5AA968272819CA486A8BAFD3D66799AE951CABF04EA81E1E7E4632B915D4E8387C7D1F4FAFE1C1FC8666FE0318403EA0027487E947D844A7FA28C0523A64EBD95D2A8ABF6A71FEFB5BC059B2CBEECD4375F3A3F109DEAD98539244DDCFEE9E42DB3ABDAF943C445712EBF19508A1FFA6133C5078C1DA69A32CBE729A8876C4C73CB232024A87D87FD5F9456D3D4A936CB4CE2E00EF415406D66D344000A4A95CC9651425A16021336C4BEFF310210324C754BBE13CD0066C507413671C80CF492B4655D898A18A2F4DB5A393400C6AD821580B0712D6C919C62E87FE212260EAEF6876C409FCA1047A67B223E0766144F3F676F051FBE912C4CE4A9F7B85459DA031EC47C621F6EF06CD1621421FA52B047B51C944DFA94807083B4ED40D533B19813477193D1E4E96C8D76A5AF3100FA44A985A6513060B08A7F3848159B3CC551D43370B223037753B824A099A7C7DF59305BE09E2E79618C83818BD542F39380126A927190EA5536DFA63B664AA7601C6D82CDDF4CE4006E1AF2601EC453971828CD09C29D2F3EA6392B58D38BCF40BF6B6497F6B848CB853B187610CD23880CB09787C76087356C66565C0399BE746A81753442E4AAA54E84F1D8C2CCB2D00A551E960203D61E71A72E131ED1967DD06E72C99264EF2EE5BD156FC869B5031BA23A6D354D7CEC58F339F6BC2DD1C547F07AA733994860197DCE5BCE6024A74668ED89A2C9CAFE1F78B31638C3225D96009C260FBD28C1F0423E75C9C01A0F9E62B7F265FA3817F441F56AE79BA54A0C107FD7946A2DDDA60D0EAE428715FE2B4FF93BEF83CD10E5E17760FE028F1AAC8084A43EDCC12BFD3265D13FA94D9704809A50881D48F0080A976C5BF31B353B9043C0F0B69AE6F2B8BADD056752F2FC9E90C4B35850C2D45B9F354B41ED7826B976528875547A0C389B83725E26C006CC8240E380E3EB554DBF2133A131743539B1D174CCA6B135C59F81D499631BDA4CF90DED836E8C24C074A0BCD83271309FFEF320791C9030FC2B1F53FD2DE870E54EBA20CE9930C279B48B39CB481737F012F65933650374BA39E2222191B0E3C7DB9632CE9CB077322CEF97ED832DDD8AAEE53C52C03D2AAF8EB5597D8D6467A406BF428E2F16462E0C0D486A1C1C7348CBBF92633EC4FFA75945025A3C92095317E32290D4CBAA6CA40F3F201975F3FC8B733D1467C094E075E8415352E3AE51A6C5169A4AA430BCD66FF39B184F5B7174042DFCC6840EEF60CCDCAC12D012AE4F24F7184A038D8D9964AB405366740600B98CFE2E4737C8D846FD4E9B22B5047110D85B37BDB9E7E3BAF5298BBDC1050AA20F14E34DEC283830F5FA9C570C22CA659C1276BE8FFBC0AC3551DB8488855AE7EC21E239E88A0F68227D17DD87FFA3B3D0535F9E57807755DE56A65C0DE9F4A79F8746B20908BF9416A86F62EE2C2545BCA2D55CD4D45DCDF06DC879E1B6270A80778D0274AA658395D800EAEF367DF4F4D838EEE0A66093E0F419B9EDC5F003E31CF0EB7E1CEE9ACCDA7A2DFC920A4B5222389DBF12AD17392850C434A9B3C260159B0F52E78E7A66D28DD5B3C77662CFED2CB3DD5BC3CC26A34293EBF1FB3A9BC59BB0C104C5A9387F3893A65D145D424CE741A375F9C65E733A024E78FE274B29FF4B0EB6F21FAFC31453EAF7E48FABEC5711D3898B876F59952C73123281A8E85148CEF5A166BF45DF36053D57AE6F29D3E334BB2395FA236D4DAA8A4FDF99D80A9BCDBED36154BF4FA3D463D51974032D7B88B2504317E14165B1C3FE3D8FE366FC8284321D80F9CF512F418C63F73B7C29C07870332387BBD1A870AC39485F64086006CFD68C8299347615A423736C01FAEF2DA56CFB6FC966948649324E22D4551B9F50654EE505547F7D0B8481ADF6AAC3977F49D7E6AE5C4248DF7B43BDA7F082AACFCDCF1C1BC04F2D45F5E028498ECBCA47EC4D1DDEB03A2AB27BE9E4B80585145676F8AE7A5017BC5EFA317A576ED6E423D5A0495B8DC619712A2C3E6162B04B9BBC7DE4BE6532F6C1C019E702C014C60189A2612594BCB18317804C630264D07B7396DB562777BC305B885E00706FF6D0208737BD229BC7AEEFF5FB770A4C057B347601F1F6C16F60D4A53A0B32631AD2D41FA307F6630228E1807D22475D5E331A50A680896DC606F3941AC08F8BA46DE5A49F5ED6A94965334FDFD69C4A6C7973D9615B3FE576B15AACB9B98D9E498D2A3A89B4F8EEE715ED5F29F13DDE7629BB386F7CC800F16F3B5BA8BD0E14CD8D9BB0F0AA615BE9D7557F6EFD00F7BBEF9989E7F463279408E6AD77E100AE4457D57424F2B1CAEF43052C5B25C896BAA1C2FE67D1D6F669311F17D39460F0B176A7727F53257A36FAACBF3DFE623D8F882F8EE41BA1CE387E1D1860F4BABE26ED678395B9979D84DEA5C7B38905D4C7FD867ED7722D066BFF3A833D3282BB40D1CD310DC8DAC9270A49B65B5181EB30F166CAF0832A8DC56B9D135550B506D98D036BE7876836AAE669507990DE6D03E78A38139CF64F65FB410F192E30B045C93FE259C10E0C5B56A2B5F0605DA0851104C4BEEB4E3B30135CAE5A6C68403C63121B0993832834A3B5EBDD345C41B26DD219560B624024B8B945A10D385B3CE4E0BD54E10A64ACA59D283302028A9592120D142CCEB1CC30E1F96AD041F1E17BCDC3C68C2EA2E0D65D6BA3696166CB365CC461ABC4D67D504E8290EB452ECB77F6D5FAA5053D01317646242384C5C510BD43C5780BBD01EBC3AF33D29D8A09EF39AC85E70398D2A64DFFA72B3EFD8D6D57AA2F9DAC0CC6EEAB27B69FDF2403A5FEDE0BFAF441619BE03FDE44C49FF0A34E9C37D2B9AEB726D56EB646A67BF349323F397DB056D71DE72A2597D780942554C8F8273E307DBA6BD02E944E0559509E1F28B511BD709D03EA2451EF234DF6F077E06AA01E2806D5BDF89DF29F1B3D8C6D8014496AD83857F7465F1072E88709D0194733E1FC8C9F092DF5B9802FD2DDDA8B142217B9532D8604E2F32D06F6400025930DA2BE9B25529788E6BF4EB7F84C272DF455CE2ADA291CFDB5FE815129E4AED59625C879E99B3E3C1B6C5D7 +pk = 624909BA3AA3A59F0B7FDF7718047B7DB5CEB4FAD564ED4FE30CB1A6CE28AC04469795ABEBC765044ECA68AB5BF9F45759AA462108BB0E3CB87BF5B649FCEE0404 +sk = 624909BA3AA3A59F0B7FDF7718047B7DB5CEB4FAD564ED4FE30CB1A6CE28AC04469795ABEBC765044ECA68AB5BF9F45759AA462108BB0E3CB87BF5B649FCEE040441BE90EAEE57DB2B6409B8DD826A70366101000000000000000000000000000030109025B104576732841BD306B94C479AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23C57AB1116E8C48EEADDA9758FD34408CFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000033F7C9D1AD8FA1C411CA8896C166C30E762296E32C74896ED7A1D661587B630040AE1468A8867908CE5B13B4E4915E239856E449196B6CEC08ED44F37EF20C00E106DF03744BCC5AF0602902DC91CD78DE032AC4AA26459D0B063B7F951B7D0057FD279C179BB23EEB0CAC66394FA2AEB02321AEC3066CF4B7D5B2792B7C6E00 +smlen = 3349 +sm = F2880D4532B5839983397727C86E79A356ECF846037B92D045B38638F417190029F4CA25A14F78C595EAC9B38CCFC9C24941C728D57338638070EED33205A50200025F7B2815FEBD41EE5BA42F76E0625B52DB95812888A4B200B5BD5EAAA784573A05EF1B76FF0E34CFA846D7AA08DB899885D49993C0E2FF11346AC0190022FFE2DBF86041FB37D3F80FA83346821CD202020BDE897F02AE7292ABAFA6A0CAD52929113410F2BA972B4184E894C4D31081420751560956F49CE2B772635625AFC3CA6698FBFDE4D0A05EF243DF190BA1CE780EB572590E01E6E283E1963F2B0722B0CEB365552F65BD405F1A284DDBED07BA61C4453D30CC28C83E41590E09D7BB6932D231285205D61332FA9263B8A2D3D7F7FA20F521CA4B49F249896780E08C2DC41669BF0777278F87BB1F72CDDF4B998062B1642791F81AD474D6D8F963DCB4458CE11108544C41CDF19145B77038C7E8ADCD6501508C53B25BE6E787313018620D1BA647CCA4A5A8399E11815EAECEC6AE66DBC576699BB0AB44DE111AB6F252256389EFDC0546E641DE87FD6A3A724716257A9174F39542539A593864441EB79D499FCDF2F1D053CEBB3A1FCC09419D2C553C2265B3DC3943E0341BB49130E9981EC59945FA0B23E9DBDBF352ABA0D925C4333F2EE1F2C83C847EFA78BB13263B893D7CAE029BF08CEA2A5D1B5B997E403A489C6D9A124FB8386FE58C2476894E7754B8E5A162102A119482B5E59F8D89C8B1DEA70B6C80641C77BFD12D45C5B3CE0021EE500A1665ABCF740794E0D3E7E8CB5804A1E0D0C81A107DEE80BF63BFF8CE2EE2DD602DF279DE39C579B417A758356D2B48B41E83495DEE9ADFE4506E03F19DD096E81405264D408B2FBCDBF41DB5CED6FBDC2645DBEFE5BD038382993970C7686DBA3FEDC24E1F91BA4B6CF70B2E832B97BE24B6393273A519DB0B4446E98D77E86CCACFBECCB18939013C66F7A29B10DE2E88FCFAEF656B858B7DFACC4F21EF5F328C0EF604FEDD993510BA40530B79525FE8D336DEF0E5C303539E664A9360EDAD7268F70DF4DE199AB3F70EB2BA65E2752BF5FDB1E853E6F4EFCAFBB31D8CC23155413BE31082DA958B01682894A9057CAB66D4D64A6F3B1D81C5B75815A3E0CAF6486B17339174276A84E11C117B060302DC2EE06A03C0E15395C0DD32661638F059A385578C1B792349A41C511D12AC7185B060A831EE296E6626459C2750FAF3AFB579F6F6836D566C00C979B5130E8E50431E914834CBB3D26F6E5BA50BCF05D50F699FAF10767AA2831C3557A53AF14BFD9F23C00F76C2680C7DBF4A9B2A425E34C943228C3EBE55A0960ACC757D7878F7943E2E8A1CBC8C0D2139A6A6459D3492A1A7757F71E90A58A78E0FF9B04D059C5D131F6E3C30742FDE5506AE7860045A4C903DE96DC43AC6A69273BF8EDAB7E7FAFBAAD9EFA8FA609961502EFACCDE63A6D98D8D017075487C608FF701A7E3381D7A2ACB134B198950ECC6970A75AF5625FAA4EAF968CCE48FFB673F4F365802A984C609C33BA312140A60A6F0924E945D11BAACFCD643C874D352A90367EA4C59B63665364832B1A9A9A01EDA92C64F393C357158973FA7C6047B8B5E27EEDB28E26359402B63032F8B230F5AA968272819CA486A8BAFD3D66799AE951CABF04EA81E1E7E4632B915D4E8387C7D1F4FAFE1C1FC8666FE0318403EA0027487E947D844A7FA28C0523A64EBD95D2A8ABF6A71FEFB5BC059B2CBEECD4375F3A3F109DEAD98539244DDCFEE9E42DB3ABDAF943C445712EBF19508A1FFA6133C5078C1DA69A32CBE729A8876C4C73CB232024A87D87FD5F9456D3D4A936CB4CE2E00EF415406D66D344000A4A95CC9651425A16021336C4BEFF310210324C754BBE13CD0066C507413671C80CF492B4655D898A18A2F4DB5A393400C6AD821580B0712D6C919C62E87FE212260EAEF6876C409FCA1047A67B223E0766144F3F676F051FBE912C4CE4A9F7B85459DA031EC47C621F6EF06CD1621421FA52B047B51C944DFA94807083B4ED40D533B19813477193D1E4E96C8D76A5AF3100FA44A985A6513060B08A7F3848159B3CC551D43370B223037753B824A099A7C7DF59305BE09E2E79618C83818BD542F39380126A927190EA5536DFA63B664AA7601C6D82CDDF4CE4006E1AF2601EC453971828CD09C29D2F3EA6392B58D38BCF40BF6B6497F6B848CB853B187610CD23880CB09787C76087356C66565C0399BE746A81753442E4AAA54E84F1D8C2CCB2D00A551E960203D61E71A72E131ED1967DD06E72C99264EF2EE5BD156FC869B5031BA23A6D354D7CEC58F339F6BC2DD1C547F07AA733994860197DCE5BCE6024A74668ED89A2C9CAFE1F78B31638C3225D96009C260FBD28C1F0423E75C9C01A0F9E62B7F265FA3817F441F56AE79BA54A0C107FD7946A2DDDA60D0EAE428715FE2B4FF93BEF83CD10E5E17760FE028F1AAC8084A43EDCC12BFD3265D13FA94D9704809A50881D48F0080A976C5BF31B353B9043C0F0B69AE6F2B8BADD056752F2FC9E90C4B35850C2D45B9F354B41ED7826B976528875547A0C389B83725E26C006CC8240E380E3EB554DBF2133A131743539B1D174CCA6B135C59F81D499631BDA4CF90DED836E8C24C074A0BCD83271309FFEF320791C9030FC2B1F53FD2DE870E54EBA20CE9930C279B48B39CB481737F012F65933650374BA39E2222191B0E3C7DB9632CE9CB077322CEF97ED832DDD8AAEE53C52C03D2AAF8EB5597D8D6467A406BF428E2F16462E0C0D486A1C1C7348CBBF92633EC4FFA75945025A3C92095317E32290D4CBAA6CA40F3F201975F3FC8B733D1467C094E075E8415352E3AE51A6C5169A4AA430BCD66FF39B184F5B7174042DFCC6840EEF60CCDCAC12D012AE4F24F7184A038D8D9964AB405366740600B98CFE2E4737C8D846FD4E9B22B5047110D85B37BDB9E7E3BAF5298BBDC1050AA20F14E34DEC283830F5FA9C570C22CA659C1276BE8FFBC0AC3551DB8488855AE7EC21E239E88A0F68227D17DD87FFA3B3D0535F9E57807755DE56A65C0DE9F4A79F8746B20908BF9416A86F62EE2C2545BCA2D55CD4D45DCDF06DC879E1B6270A80778D0274AA658395D800EAEF367DF4F4D838EEE0A66093E0F419B9EDC5F003E31CF0EB7E1CEE9ACCDA7A2DFC920A4B5222389DBF12AD17392850C434A9B3C260159B0F52E78E7A66D28DD5B3C77662CFED2CB3DD5BC3CC26A34293EBF1FB3A9BC59BB0C104C5A9387F3893A65D145D424CE741A375F9C65E733A024E78FE274B29FF4B0EB6F21FAFC31453EAF7E48FABEC5711D3898B876F59952C73123281A8E85148CEF5A166BF45DF36053D57AE6F29D3E334BB2395FA236D4DAA8A4FDF99D80A9BCDBED36154BF4FA3D463D51974032D7B88B2504317E14165B1C3FE3D8FE366FC8284321D80F9CF512F418C63F73B7C29C07870332387BBD1A870AC39485F64086006CFD68C8299347615A423736C01FAEF2DA56CFB6FC966948649324E22D4551B9F50654EE505547F7D0B8481ADF6AAC3977F49D7E6AE5C4248DF7B43BDA7F082AACFCDCF1C1BC04F2D45F5E028498ECBCA47EC4D1DDEB03A2AB27BE9E4B80585145676F8AE7A5017BC5EFA317A576ED6E423D5A0495B8DC619712A2C3E6162B04B9BBC7DE4BE6532F6C1C019E702C014C60189A2612594BCB18317804C630264D07B7396DB562777BC305B885E00706FF6D0208737BD229BC7AEEFF5FB770A4C057B347601F1F6C16F60D4A53A0B32631AD2D41FA307F6630228E1807D22475D5E331A50A680896DC606F3941AC08F8BA46DE5A49F5ED6A94965334FDFD69C4A6C7973D9615B3FE576B15AACB9B98D9E498D2A3A89B4F8EEE715ED5F29F13DDE7629BB386F7CC800F16F3B5BA8BD0E14CD8D9BB0F0AA615BE9D7557F6EFD00F7BBEF9989E7F463279408E6AD77E100AE4457D57424F2B1CAEF43052C5B25C896BAA1C2FE67D1D6F669311F17D39460F0B176A7727F53257A36FAACBF3DFE623D8F882F8EE41BA1CE387E1D1860F4BABE26ED678395B9979D84DEA5C7B38905D4C7FD867ED7722D066BFF3A833D3282BB40D1CD310DC8DAC9270A49B65B5181EB30F166CAF0832A8DC56B9D135550B506D98D036BE7876836AAE669507990DE6D03E78A38139CF64F65FB410F192E30B045C93FE259C10E0C5B56A2B5F0605DA0851104C4BEEB4E3B30135CAE5A6C68403C63121B0993832834A3B5EBDD345C41B26DD219560B624024B8B945A10D385B3CE4E0BD54E10A64ACA59D283302028A9592120D142CCEB1CC30E1F96AD041F1E17BCDC3C68C2EA2E0D65D6BA3696166CB365CC461ABC4D67D504E8290EB452ECB77F6D5FAA5053D01317646242384C5C510BD43C5780BBD01EBC3AF33D29D8A09EF39AC85E70398D2A64DFFA72B3EFD8D6D57AA2F9DAC0CC6EEAB27B69FDF2403A5FEDE0BFAF441619BE03FDE44C49FF0A34E9C37D2B9AEB726D56EB646A67BF349323F397DB056D71DE72A2597D780942554C8F8273E307DBA6BD02E944E0559509E1F28B511BD709D03EA2451EF234DF6F077E06AA01E2806D5BDF89DF29F1B3D8C6D8014496AD83857F7465F1072E88709D0194733E1FC8C9F092DF5B9802FD2DDDA8B142217B9532D8604E2F32D06F6400025930DA2BE9B25529788E6BF4EB7F84C272DF455CE2ADA291CFDB5FE815129E4AED59625C879E99B3E3C1B6C5D7 + +count = 97 +seed = 13F1F446D9AA5AC853278BF74C9E6447A6CE4294C037867F43DF554370EE261D05C7260EEBF46D6694D0850B8343FBE5 +mlen = 3234 +msg = 525E8B98C55864849FFC71EBC953F7A0ECA6298F6AA15A83BF6923BD5921B1C86DBBFC544A39C364EF6D9281481E946C994F96829D6639727A5345560D8641E9A510F913F7FE5592C2A40CB278F5AFD8D4504B5387C20945654F08168247A98F56A43A5020955F882D2D93781F4A83676B08F50341E953A5D1B67DE7F6D1BE3D78D5D060AA85B5EE4271763C437CCD595890DBC8FCFAF2754AE9349BA2FDF89847A15188716C0EC672887A4B9A15176AE0C5138819CA232D012BE1DCFFD29F677442083087C127CBD80B0D9CC0962BC8318E734910D1E2653BBF700C84BB0919E12DF331CCDC7128B41F0666F6419AFBADAF673BE16C9177D3CF113C6488504DE088149BFB83EACBBC400309B7AD753F7B2F5AA89F070C9D14C084C32DF91C5F7CB6A7D869D64F4A05AF80A98BE7517ED784C17B0D7DF96B9987B7EA7A398CE018AE6E13E1C0F7AA040AC3FFD273BB9687AD6FEFDB211061A6228967E9DFEF69BCC1C5D02EE56D49A93C8AAD46D08322A2CA246AE8C3EDC071D063AD605A97B8AE94D58E897A4A6310BCBF55B0CAE1AA81769D30B46F883EAF29D4B5FEA32F2DBDE49360CB6235754BDC305ABB5E5395360097378656E2BACE675448889B0149D6086C51E9C3AF07A76563164864F131CF9C0CD475CD4A58726AD237CFB76ACA68032351FB24711DA635871386B4BFC94B0DB6D35F07D0196F75CEDB92EFBE7D653E0FF9326A596F9166FF6CAB73125DAD27F361D6122CA531D86910187E75F849EDB52DB26C96FDF05925DCCA232480D3F979EAB07CCA68FC9069965D12BB666A180989AD1FBEE3FE65E746C5A8F64DAB2E370F0487D001121EDD0D0D760531AF46DA65C75DE11688EBF31DD2AC95C188BCFA07EA798609F3EA8E6364A43742A2825144FAFC05ABD17476480812EB2483734B13D075B3EE3AD510B67CF7057014351B2CE5357E3F12F43BA74CED614BE3A9AC0E26763E9AC596F87AE98F72ABE0DE213A81A9A03E2B82F2312C1A186DFCFC3DB346FEB132931C793ECF837F57D8E326101F59705B77A3083E712CE347C2C29C23468B0C5857EFA410197833987C61ECBC2A855EF78B3D7B1B697AB9844AAD07C4B8EF666BD80DABA5FCAC900C5D358A11676FFC89DFF4F36F29F14D9F9B854DCED41FFC4B36381449D22801C19BF8E8BA1F07A1B38FFB527A34D009C4064A1E606FF2AB90AB2E05C156150EC14D7DC792578A16F46650D0ABB61175D1817E2C38F109EBC01A3ABB358673561691185DA32EEEF566C1BA1C72C1F08CD1B427B552425501B8783116F2EB0CFF73C5D2DEF18D291C106980135821A77428FAB20A935AC8B6DD8EDD1A936225344EB103DE0D5879CCA09359B5B882291C0FB1FCCF167C30DBECFC324AC315713CD10F35B72F0D4871A7CBAA2B4CC2BC2598F23DA607C94A063C9E2013B0EDA5F3BD5AADB2C429177A4BFD7B6181ED5F9A55C1F043DA8155C9E7BEBDA7EA07DEA49938FE07743DF2295C220EB53348310842B1000B7A02AC025C3A94FA82D46ED7E2712DE71B149742731EBE62E225D21A7F29D5F3A8A62B71FE16258570DA412C07CECF82B2064AB5D98761C69FC5E899A8E174875B3179DEAA0BF4A0261DA9BF39148440DCBEB0C887E41FDF751505DE79AA1F8593F45482B659F5B5F4CC3E7BFEE59DEF49458DB195A1A692B8AF4AA44CCFB00B753AC761181B8AAB39DB82385AE776CFC585F7873613B62DE55BB10A6B2F27E631CE41436C3FE390163E6F4EBD6B501519C96C06FADCAC8F75920FE1435542FDF535EAD6C0E3F41345996063B95A208DEFB6F110CC861580979BF4422ED395CA218CFC3B22C0BA8B31CB9EEEB51C3DF35FECE92795CAFB8440F522B44E21B3A18D5CDBC296B887A4B927F36715E4AC2CAB043D8B69A8704D6BE24C725B0C2E814BCA7B040C27FE8F4C14911051039AF13F44E0485EB767F5404CFB6FD19DA24D82FE24B53033C83DD8634E2E28AA330A81F14BAC1C57DEAD7FFE39994D9D094383E14322E146A3DF27A776E2F09A11EC9014C809F8E543594D6B4814918A129B36FD25015A044E04D3F081D4D201DF86A0FCAFBBFC695088170B8246776B6A28E59449C646D1E706CEA96B12683CD3A7C60459D42989CA46694B0089CF88E9AEC5E110F69FE0E3FE20D18309D1BA72A83A34813B771484505B08548FE5D376AAA0C414260EA4BCE5EB81F6545CD5203026264938905BE1E252574F4B4E71C6E12F99F6EFD35EFFD64183CD0665FE89D6A357B1908E083511DCE2CDF792A608044C31418C433F86719E156AF3FF98D0F54EBEB9F9FBF24588A5557D310EF9D7CF5DD8A68512D8CB15114773C69D7B40C927858AFC049F7C6A89841020E1C313C5C38B988EF505EBE6C15FC1D6CCD8B472F90ED64DA895D06AC01BB99F455A195A670D22DBD5E3F03AC84A08831E9842A566E9785A0FD4C460C5CAC154D705DCE1E7FD1C45BAEB23976AF881CF5628F3CD92AB19BAE8D45A03A859518E4A1E558FAC2B48A432E46CF274E6496B63874CA4E4571132568AA43EEC3D2A3948F40D327976A6D28CD816CFBEAF8FE126913384061D219F51179F679081503371EA0B6BD7E9524B0ECE2573304ECB4A16EB471CA0817C0C6EDE751F283ACEEC5A60C2796C6261FFC6226E4813241619F465DCE67B38E1D5A647B079503144907307C7D6EB6E6EC1936B5C94FCC08A882B4555B19B33A9BF22384DB38473A313966D157DAF8AAD41EF67D3A5FE723559096AB1768FF69773EB9D5C88D6F35F00DFA4473DF71C7E9E35393638DED05D05C105CBF37711D38E3EEE35E8CC0029B3761241FD1E56969E09E949690D4FE25735D774E777A2CA17FE058E14AE6806F611FB1E9FCD516E20499A704B67990716703A4287B50AB45D155D40EDC0AAF97F5B87551C236CEBE9CADD562B27957EAD251F79CAAC6433F228B50167FB1A753306FFF08B53A8A3CECC226857A321700EBE23AB4D6C35415CA79B682D6CFEF6B1341E7CE00CB9870F432B63A2D9A9A43C87D28A95C514582812DA37738BDA6CC76142E08F69EBAA5ACD0403100C2343E2FA088441E9A55C720BB509BC3600C27C1D39157E049650D1749751EFE55A72349E2A5B714556CE2188CE972287BE2152C7E58D3FCAD43A214A4095DE55CAE9F627D8B9018DAA01547842FA1AD14D67327CD47EB9B90CD94AFDF5244DE57E527F17894A410FB4210E06632E88A398400B0AA48CB3FEB9A90ACC668615D193D5A98158092FBB59AD2D6D4FFEE433A2A6A971A228685AE5BBAFB3AB28242C630AF4656C5071C545618A0A765FCE41B19970C2152D44C349D0CDFB29673D1A42FFEC139D1C9958B0962F7B57F80CB8FE6331553B0DF93DA9BFC722B1C001F48FF9C0FEF032610A1118AC9EBAF9202DFFEA605272A50A90768F031C72D570C0AA5B0D4FEE4AD568895274388104C0BF88D03FADC3159D6CF28AC6A7E3E5CF6FE5C6658128CBF81456DB8C29A76F9C75230F3837F1A94CB83C3AAABDF4B29C9045B45AB9552BBB6C0844BF2926267C0D74D3337249D5C9610E0F6FFD0278F12F39C48650C048D61A3FDB8E1A2E08CCCA68803A55B39BD39160B0420CBEAC7D8A55F571F490F694A7AA8B725BA84238EE1E711864AA1F74AFF252C088E36B79B09C80278DD442EAEA8C7D5833CD1BAA18BDD866689E663EADD0EAA6E0C78A3E09DFFE5F6F1F4003DE24336586B25DC5EE45D56F31D8BB2DE31B24E87172F3F1B26D400B08D50FF624E456183F269CBF06B3707260383174FDA152E4D0C528A90C54114C4F278D0FB35B74DD3ECDA14EE89D38E3227A7E18B068F134B22154348867A61719C926EA3320D1BE0B9ED78466B2DED728CA04C15AC144185FB2F5084511A38CFD765659351AC1AC3E5F327D9F3DE9B2B003758DA78DFD08FAEF3625CEDD87C8A55A3CD0257AA71B3788FD2449EFD1F48948CB304468E3CA07EA7044FA185A2B91F9761C6532B9273DB74C66B2DE95AB19E5102CB90C719EC85671E2829B182BB6D09323248D6584F0CA67D422BCDA65A0146D8DF27AB4AE651706D5FA33B5BB88ADC2A1A95105D55CCA8439A5060D110760DEE8B855D0839053BE595278EAE66542736D25C93D8544C6E55ED51AD6E7029C2E6D32CFA8844BC14972809E31754AF84BB479C504EE77CB65CEDDB6BDA613FEAA2AE6598D1F4975D0FCF9D9DC787EEB5C03F8B0BF438E83C38E2195EF1D35D40F5A14E194BC1BCC64D02CA722E7DA28334E91FB6654D708C5B07946CDF58747086EB3CA59D095EB27F1B7E6806D3A35335B2265031A1120F28EED8B4C5D9AF268502727C5D23152149C98E6970D4DCC4B9D0FECFA6A79FEF82CB233E71FC8AA999DF66EBF5A1DB2ED1583C65803FA8958F49890D13BC05C6A991F26C31766BDEF9BAC601A47C8C3C5E395FD8F47E56F04439E9BC8E9B1901A529395F2D57495D70D0712881D298A60E3E013326CD56BF9F1319EA8D6A6511EEFF373F081478A51E14F0AA4A33C6C5EA7816380C8984F7A5DA45B0C4B6B550644E65A5B2DF059ED050936FE6F073B4E8056ACCD3EB65A0B +pk = 60FFF89DD22626D2E1E03C33892EA62F996EEB46561F7E1496C3753EF882B10454AB98E909FF4814AC3EFF4AC40F590AED6C11688E0B867998F54E3CE4BA380004 +sk = 60FFF89DD22626D2E1E03C33892EA62F996EEB46561F7E1496C3753EF882B10454AB98E909FF4814AC3EFF4AC40F590AED6C11688E0B867998F54E3CE4BA38000479CC90CCF243C7EFFC33BC5EC0B422E7630300000000000000000000000000000A9ADD471EDADABB274B7F05578EF92D92FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3D5F3A669E68EC45B1AFF3D9E63E4986CFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000085E4B0FC40BF3A3B1A3C77921F2D45771AAE6D293E305BD97B3C67405799E10051FEDE98460B03C3BFA3C0FA771DC37F9199FFC4CD4D0F12FDAD054FAD4C9B00AE35043DF66565D7E54B4EA33044329F73456E769A72E501FD0F8F72B6D72100DB1EBE798DA8ED2674B3BB95BD9872B90E22A42FD929B0DBD2E3728057923400 +smlen = 3382 +sm = 9F36C9C85DAEB04BFE5DE66D34FC96BC662B1DB9572A7A3DE3B6AD5150480E018613E3B31DBA764E0CDCC6E3DF9B2D0866E1820BE9AC3BECBD998C575D6CD200000201E5EC189C63E655FCC0AAC5EC8BEF99AF9AE4D1AE6F5100CD1477D29A8056B11D5DCD1FB213AFB092F4A381CA9D2C08DFDD81107AC3C995519C64F57FE1670742CBE45DE6B5447340F13F47267EDA031102525E8B98C55864849FFC71EBC953F7A0ECA6298F6AA15A83BF6923BD5921B1C86DBBFC544A39C364EF6D9281481E946C994F96829D6639727A5345560D8641E9A510F913F7FE5592C2A40CB278F5AFD8D4504B5387C20945654F08168247A98F56A43A5020955F882D2D93781F4A83676B08F50341E953A5D1B67DE7F6D1BE3D78D5D060AA85B5EE4271763C437CCD595890DBC8FCFAF2754AE9349BA2FDF89847A15188716C0EC672887A4B9A15176AE0C5138819CA232D012BE1DCFFD29F677442083087C127CBD80B0D9CC0962BC8318E734910D1E2653BBF700C84BB0919E12DF331CCDC7128B41F0666F6419AFBADAF673BE16C9177D3CF113C6488504DE088149BFB83EACBBC400309B7AD753F7B2F5AA89F070C9D14C084C32DF91C5F7CB6A7D869D64F4A05AF80A98BE7517ED784C17B0D7DF96B9987B7EA7A398CE018AE6E13E1C0F7AA040AC3FFD273BB9687AD6FEFDB211061A6228967E9DFEF69BCC1C5D02EE56D49A93C8AAD46D08322A2CA246AE8C3EDC071D063AD605A97B8AE94D58E897A4A6310BCBF55B0CAE1AA81769D30B46F883EAF29D4B5FEA32F2DBDE49360CB6235754BDC305ABB5E5395360097378656E2BACE675448889B0149D6086C51E9C3AF07A76563164864F131CF9C0CD475CD4A58726AD237CFB76ACA68032351FB24711DA635871386B4BFC94B0DB6D35F07D0196F75CEDB92EFBE7D653E0FF9326A596F9166FF6CAB73125DAD27F361D6122CA531D86910187E75F849EDB52DB26C96FDF05925DCCA232480D3F979EAB07CCA68FC9069965D12BB666A180989AD1FBEE3FE65E746C5A8F64DAB2E370F0487D001121EDD0D0D760531AF46DA65C75DE11688EBF31DD2AC95C188BCFA07EA798609F3EA8E6364A43742A2825144FAFC05ABD17476480812EB2483734B13D075B3EE3AD510B67CF7057014351B2CE5357E3F12F43BA74CED614BE3A9AC0E26763E9AC596F87AE98F72ABE0DE213A81A9A03E2B82F2312C1A186DFCFC3DB346FEB132931C793ECF837F57D8E326101F59705B77A3083E712CE347C2C29C23468B0C5857EFA410197833987C61ECBC2A855EF78B3D7B1B697AB9844AAD07C4B8EF666BD80DABA5FCAC900C5D358A11676FFC89DFF4F36F29F14D9F9B854DCED41FFC4B36381449D22801C19BF8E8BA1F07A1B38FFB527A34D009C4064A1E606FF2AB90AB2E05C156150EC14D7DC792578A16F46650D0ABB61175D1817E2C38F109EBC01A3ABB358673561691185DA32EEEF566C1BA1C72C1F08CD1B427B552425501B8783116F2EB0CFF73C5D2DEF18D291C106980135821A77428FAB20A935AC8B6DD8EDD1A936225344EB103DE0D5879CCA09359B5B882291C0FB1FCCF167C30DBECFC324AC315713CD10F35B72F0D4871A7CBAA2B4CC2BC2598F23DA607C94A063C9E2013B0EDA5F3BD5AADB2C429177A4BFD7B6181ED5F9A55C1F043DA8155C9E7BEBDA7EA07DEA49938FE07743DF2295C220EB53348310842B1000B7A02AC025C3A94FA82D46ED7E2712DE71B149742731EBE62E225D21A7F29D5F3A8A62B71FE16258570DA412C07CECF82B2064AB5D98761C69FC5E899A8E174875B3179DEAA0BF4A0261DA9BF39148440DCBEB0C887E41FDF751505DE79AA1F8593F45482B659F5B5F4CC3E7BFEE59DEF49458DB195A1A692B8AF4AA44CCFB00B753AC761181B8AAB39DB82385AE776CFC585F7873613B62DE55BB10A6B2F27E631CE41436C3FE390163E6F4EBD6B501519C96C06FADCAC8F75920FE1435542FDF535EAD6C0E3F41345996063B95A208DEFB6F110CC861580979BF4422ED395CA218CFC3B22C0BA8B31CB9EEEB51C3DF35FECE92795CAFB8440F522B44E21B3A18D5CDBC296B887A4B927F36715E4AC2CAB043D8B69A8704D6BE24C725B0C2E814BCA7B040C27FE8F4C14911051039AF13F44E0485EB767F5404CFB6FD19DA24D82FE24B53033C83DD8634E2E28AA330A81F14BAC1C57DEAD7FFE39994D9D094383E14322E146A3DF27A776E2F09A11EC9014C809F8E543594D6B4814918A129B36FD25015A044E04D3F081D4D201DF86A0FCAFBBFC695088170B8246776B6A28E59449C646D1E706CEA96B12683CD3A7C60459D42989CA46694B0089CF88E9AEC5E110F69FE0E3FE20D18309D1BA72A83A34813B771484505B08548FE5D376AAA0C414260EA4BCE5EB81F6545CD5203026264938905BE1E252574F4B4E71C6E12F99F6EFD35EFFD64183CD0665FE89D6A357B1908E083511DCE2CDF792A608044C31418C433F86719E156AF3FF98D0F54EBEB9F9FBF24588A5557D310EF9D7CF5DD8A68512D8CB15114773C69D7B40C927858AFC049F7C6A89841020E1C313C5C38B988EF505EBE6C15FC1D6CCD8B472F90ED64DA895D06AC01BB99F455A195A670D22DBD5E3F03AC84A08831E9842A566E9785A0FD4C460C5CAC154D705DCE1E7FD1C45BAEB23976AF881CF5628F3CD92AB19BAE8D45A03A859518E4A1E558FAC2B48A432E46CF274E6496B63874CA4E4571132568AA43EEC3D2A3948F40D327976A6D28CD816CFBEAF8FE126913384061D219F51179F679081503371EA0B6BD7E9524B0ECE2573304ECB4A16EB471CA0817C0C6EDE751F283ACEEC5A60C2796C6261FFC6226E4813241619F465DCE67B38E1D5A647B079503144907307C7D6EB6E6EC1936B5C94FCC08A882B4555B19B33A9BF22384DB38473A313966D157DAF8AAD41EF67D3A5FE723559096AB1768FF69773EB9D5C88D6F35F00DFA4473DF71C7E9E35393638DED05D05C105CBF37711D38E3EEE35E8CC0029B3761241FD1E56969E09E949690D4FE25735D774E777A2CA17FE058E14AE6806F611FB1E9FCD516E20499A704B67990716703A4287B50AB45D155D40EDC0AAF97F5B87551C236CEBE9CADD562B27957EAD251F79CAAC6433F228B50167FB1A753306FFF08B53A8A3CECC226857A321700EBE23AB4D6C35415CA79B682D6CFEF6B1341E7CE00CB9870F432B63A2D9A9A43C87D28A95C514582812DA37738BDA6CC76142E08F69EBAA5ACD0403100C2343E2FA088441E9A55C720BB509BC3600C27C1D39157E049650D1749751EFE55A72349E2A5B714556CE2188CE972287BE2152C7E58D3FCAD43A214A4095DE55CAE9F627D8B9018DAA01547842FA1AD14D67327CD47EB9B90CD94AFDF5244DE57E527F17894A410FB4210E06632E88A398400B0AA48CB3FEB9A90ACC668615D193D5A98158092FBB59AD2D6D4FFEE433A2A6A971A228685AE5BBAFB3AB28242C630AF4656C5071C545618A0A765FCE41B19970C2152D44C349D0CDFB29673D1A42FFEC139D1C9958B0962F7B57F80CB8FE6331553B0DF93DA9BFC722B1C001F48FF9C0FEF032610A1118AC9EBAF9202DFFEA605272A50A90768F031C72D570C0AA5B0D4FEE4AD568895274388104C0BF88D03FADC3159D6CF28AC6A7E3E5CF6FE5C6658128CBF81456DB8C29A76F9C75230F3837F1A94CB83C3AAABDF4B29C9045B45AB9552BBB6C0844BF2926267C0D74D3337249D5C9610E0F6FFD0278F12F39C48650C048D61A3FDB8E1A2E08CCCA68803A55B39BD39160B0420CBEAC7D8A55F571F490F694A7AA8B725BA84238EE1E711864AA1F74AFF252C088E36B79B09C80278DD442EAEA8C7D5833CD1BAA18BDD866689E663EADD0EAA6E0C78A3E09DFFE5F6F1F4003DE24336586B25DC5EE45D56F31D8BB2DE31B24E87172F3F1B26D400B08D50FF624E456183F269CBF06B3707260383174FDA152E4D0C528A90C54114C4F278D0FB35B74DD3ECDA14EE89D38E3227A7E18B068F134B22154348867A61719C926EA3320D1BE0B9ED78466B2DED728CA04C15AC144185FB2F5084511A38CFD765659351AC1AC3E5F327D9F3DE9B2B003758DA78DFD08FAEF3625CEDD87C8A55A3CD0257AA71B3788FD2449EFD1F48948CB304468E3CA07EA7044FA185A2B91F9761C6532B9273DB74C66B2DE95AB19E5102CB90C719EC85671E2829B182BB6D09323248D6584F0CA67D422BCDA65A0146D8DF27AB4AE651706D5FA33B5BB88ADC2A1A95105D55CCA8439A5060D110760DEE8B855D0839053BE595278EAE66542736D25C93D8544C6E55ED51AD6E7029C2E6D32CFA8844BC14972809E31754AF84BB479C504EE77CB65CEDDB6BDA613FEAA2AE6598D1F4975D0FCF9D9DC787EEB5C03F8B0BF438E83C38E2195EF1D35D40F5A14E194BC1BCC64D02CA722E7DA28334E91FB6654D708C5B07946CDF58747086EB3CA59D095EB27F1B7E6806D3A35335B2265031A1120F28EED8B4C5D9AF268502727C5D23152149C98E6970D4DCC4B9D0FECFA6A79FEF82CB233E71FC8AA999DF66EBF5A1DB2ED1583C65803FA8958F49890D13BC05C6A991F26C31766BDEF9BAC601A47C8C3C5E395FD8F47E56F04439E9BC8E9B1901A529395F2D57495D70D0712881D298A60E3E013326CD56BF9F1319EA8D6A6511EEFF373F081478A51E14F0AA4A33C6C5EA7816380C8984F7A5DA45B0C4B6B550644E65A5B2DF059ED050936FE6F073B4E8056ACCD3EB65A0B + +count = 98 +seed = 6F6E47E8336ADEE99B2C52CF2DC8D461E0A54C3DF2F08199A9F0816AF8455381054CE47A7766726D3AFC2E2F2BEAF8E8 +mlen = 3267 +msg = 00769683FE7BFD74B3ACD21AF3898B74CA73DD126C8315538937CAC4EF0AD4588765A26DCCE1C90C559CE691E7EB3E0A497D357E1AB583C761439C0A66D1164518F01B6894067925753CC2866A91552FCD0EF029C2284C620CAF364DE6C56EB41EE0E4431D9BE22B76451D132A3F9AD91A53449BE820A7ACF56F6ADBC7107C7C729EC8A64FFF6A24B4CF83FF4E945DEF336DBFEA6067FCCBD1CD6B5698ADB1AD6DF03FD0A553457B8E9FEB4A1243FEEFC2DF7F66AE3ECA5BF169F7891ADAEA8D5C59012C7AA00A5A86B0A33D0006F8AD5A01C60ABBDA6D249D3FAC7EBFB85103A3A747A45D0ADB7DEF52ED3A5F1A620EE383A9C0CCE1900E413FC74A7A97646111D54783928B15BCA783D01EFC67F49CE6F781E82D25D3F30561F507E3831CB4EA5B4A08D5489830017270B63D8298BEEBF48EB56BDA5685D5E1E06404EB9A6C3790E9B29C99168B10BADF8FDB03F3C568672773EEC96428149CA272EA5A8083F8208BDCE361E7D40BC4DA75029D4A18B0B6AD615DBF849935D4755CFFD270A52FA290811CD55BDCA38ED89F0066ADB9BA7F58366379FFE1CAF3A9127E147C3AF3DC27279391E0C09537E81E20E7B9FE4FE3DA970FE50BFC96555233CC9E61D3C356AAA8EED5A8AEA2327D7036EE03E7EE40AA35E9DA4544B121514C261EC1CB0B2D75B1D5CE129E47F89825F69BA8254163179FC1331A917AE9C5A18556A10C5F983871B1258CB6FC8AD207F97A220C5598860B6C56F1EFF09DE6000241E901A89E107FEEC15833D34D6EB12DB6B188FAA0B858A5B9E32F84F783B43B6F8A3B2E4B044CFF8902E1EB0C527BB4E29C92ACC9DC7E0D9AC6B3A021415768B21DD9695983EE89C871C0EADE0BCE4FB72E682DFB5A2BB7498BF4D2C01240F67D1B62BAA4E587069C16E3032114B14A1C4288FEBAEBB4C75C3C05924A358C4BB7DF95ECF81D67147FAE3F605EDE61B7BA164EBA1AB36ECE97DB0ECB32A673E899B24557D8987AF3ADC57A9DA609914C9B2D6D8AC58E5954E0DB5AA9E75B444700B8F704E15A6A7BBA81809FA8801C6CEB5747A44CEB8F99CFE6D8A2A03C03451E5F3D392725207F3DD28B2C00004425B7AE05FA3769183AB60857B27AB08BCC4321D293C93D1D850D4E7A81B14564D7B15AC0E3BC1BFE0561622C6AA06923EEFE163629EDE8BA1732DBFCAD52D3BAA6E11E569EA790B36A8472B2CA37BD5C0EDD37D8F164B874952D00D592FB705C6B3110A12B03829C157191D33C579593E7828CDA5C24A284BA2F5A42F0BFA601A8F6D3DB1CA6D703ECBD261629C9F96EBC0458737B9951219E5B1F86192E2A85B47D80610A0ACC8B1A70DB2916F89CDB2C7F8943471DDBABD2A3536C5DC8A73CDEDDEAAEDC86FA148D2EE479F8465558852FCBEA0DD8017F1B976281A5014319C2C3CACCBF571D9550215B24134F6DAEF32716802E7945CB3F97AFC1AB1DA17D0C41B545A750EF345A6F88AD5FF52D512AFA6558335B5EB8979D8E6DC1DA562BB997E7D152D9FA3EAA09119C3474E11218230D8A56C19AD87FDE483FBD6DDDE9ACBA813BEBC8505A323C601E5B5251650DAE9334562E3DCC38A28BD7DED6942D0CC2014235C1B66CF4A57BA3010B83CC7050309F57A27207512D195D070DB3D10FFCBACDB47E4231142BAE588F92C5B0A71ABD67CA9390C2E05FD2CF7A1FABB14C5A7AE3773C66DB1F055214479E388B5E6ABF0DF8FD1B0E4F90828ACC397643CBC274143FB4331262A20634877BE4C7489C1AE9EAF90BB2A177A6B5AC15CBDA27DA0616E5F87461554F5686A7BD6D047AD0B98C8CDEA3DB78DD2970C78FB861F2A92DDC277876791C4A30F525659557831F4377065D19ACB384CC68340152A6DE6D84CDB58F433923D1FB8CC6B10BACD95B9AB1B45563998620D192032269FA8301C09A29C4B5B20CA0A3D63A4F5984B7DB0F5B17417DC7B939B9B177BF423E2F3D57DFF296E6E4FF0FB1744B13731206EAD54EF0AA1DA09BEA8B0AC0EF71B73D009D30531DE9FDE90D86BF5F20D8E5A9E324E657A98F8C0031ADAC4385157BA4E28B48AED957A5B36C3B49057F8ECA7F56808F794014DAD170601070607010E004F42D01CC63B2A1761126BA045F1165E25FDD05901FAC6B76E777FAAAEE6F5ED94302E2DA28046B4BC60228E1B9E194F364E377F84681B3011583554B76FBF8D7456DBDEA665ADAD6AA0556C8CC714F217A518A98615C4C1CFC8ADBBD4D12C5BC23AD7A0F849E32FE2005334B55D7BCB43D1C95D4793E7C3882740CDE8DD24B367294496A3E2F3251A66CDAECE9E0A73D853F8D4E3A4637836DED68CB28BA4FCAB02D61FB5CFA581792E636217F3238D78912EA0863816FFB2F388823174B19433C2B14BAB69E12C3B791FE683744D4519455A52555AF0D7E12749F6094AFDBA00FC6A609C7578C531FC4C3C3065EBF78414F112014726EC2230F9BCD9C15E36283144CCBE0D1785B65CF49BA8FEFE92EB6907C0330BC98AC172EA9E8DD4DF8974DD6B6772BBC6CA8E8562C5EC0B6592DE7440AC915C35E0AC8087F22EBA110CA3037B469B1D5BC92636D81881E38D8BBED01A29B3EBCF0C19EB95BF999EB848022592AEAAB649CE19824ED9D3A32D75FBA556EE07606A306D1FCEC2E24B38274C361B7BC96CE37B7F4FE434EBA17AC2A097051A92E4EC32E4C678F7762E8B96EBFD2600C0F224B04B2CD7E9F4AD327D53603828015E9CF45969800F02FA5E0BA26B8C844BA1FDFFDE44303AD0389C1B31D582877CA6BFAD4973BA35FBB90ECDD95F430078BC39AA89434130A5FB8321E51F9624090D0277A9F112EE8FF65D3DBA999C7C08727D0F08DCF00CE22F62C955D6A822F247C8065AB94AC442E1CB5F31254816794CC2556891A523B8AEF09D3B9E07AA8B67B3B87567ADEBDBDFB93BA9A082F72052572C97E73AF16CFC42D2A51A3683F84748A338AAB56264753BA4083D356A27C71F47221ED8340C50AFD46CD207C4F9634AB5A44888A4234770C46232C35EFF83FA950B0A6879137DCE209D5A1F26809B411F046F51FF084F15BFE03292EE845D3044235ADBC299925235462E67F803DAA1426F0E116B93F4532DD2784F7F87AE360281CE21F70D230C242E1A98DE8FE1D6147AD71EDEC89E24A5980C45FD91E23516758AF71DF8E0DD96929D4DA61A3BAEABB96C9378986DEB4C9101175E3AF1E102B52A8DA27D916EE4A28263CA485CFE87EE5436249C1A2F933669F6E3274E9BD93092F4A798AE85D6592EBB54DC65C28BA08582E275972B0A12C22A7792CCFD4A398E504C6FB2CF5EF1F9C268540B4FD7D07D59C49A559D86A56A009C4C18A3FCECA109FC7A45C6E842ABC22053E84878C4805D96AC96BA00FA40FC3B50407141105845055447CA94BD27F234183C2B8BF37F5CD249ED0705AFAEAE59C8BE8F6B38069D67FB23F74284E8185C176B58B482900A3E09774383C7ECACF4FE5E580DF99DB102AD4018DB73C73A635D3FCDC833B000C948D846AACC92ED54FFB3ACAE1BFE205D6B2312658F15DECFA085D13BC3757C754C5704D8089563E0CCF52B04A49DF293CAFBBC2FED5D9551B5A3897EC7BEAA56A4034BEDCEB4840A9BDFBB8BF47D66DD3A4E3EB1666372C6B2C39A48D52761BD36403CB130A087685E2EABB8711C11005EA09F90AC49665415C56CAB6FD2719C45B6800DF914F8FF327EED29D9B9A5BBD6B80B8BB31AD1522803B2C8D89166D5C6B2ED47BC5BBBC4ABE6709D46B856AB81DDF15F098A9AB76A8257E7E5C2E7DAE53FBD691736F0D6BAFE0BB939172614E99C7D7E37754AF6C3C637D076A43DBD70E5EAE910C8170CECFF1621E382D2977635B67F4FAC555419F8A0BB76CCAEAEF4C7385D293C9595AE10E5201C4A31B4C3ECB9F3B304EFB1886F9C58A4EF04E73341B95D9BDB85D706B2A8D3FDD153743A8BB7B3289D0FE79F6A3B9E0FE160DD6700FD64FC87D9AC96858A6D395FEF6F3D2193EBAE7C3A92E18746A7F12B244FBC5B1DF0086CC7045036519D9D7BF8E92B850EA0D3D1E775DEA362362462DEA2D3501D39203E2879070D1F7AC92FA1576F6D12886D5B979E3C788C09A769EF4EE45E14CD8E7553EBEEFCD31FF3D43D4988DB08F6630BA8AE8C7250AC42A3D78EDB967D59310A4A224567D8797C42370CBD2302A3F49ABEAF85FAD9455F98B61EF2B5E34A5C552583872145E191BBFFCAA526F5E38E497A1A1E1220A0F283A935ECD366A9069D5A2A80BABA3A22FA85A2557DB72D7E29EB4E33E8ED8BB4EC2EC7C2E9CEDEF46EA955834ACF8C9AB23B78052446FD73C9D61683D7FA0088DB97D07CC350AF0B6B2AD7E66A493AF814C11F8C0F2FDF0DF40AAFD0D218C00319C367E98D7F10C74EA06D31276F3F216E1CB2F12033915008CC83B00AC60FC9C2FB7F97D6E8CD79650D0F9D82BFD9CAFEF668021D3D165F3FE84221998BC8C29AEA0B5B7E0F1F25A0D7447E806CC3FC39E6038BE3DF9AC01F46222D3A609F8A026744AB4F58A734E3782BEC301EA91F2D8E2242D04A11E82474002143223F29656B1A7675AA5AD181004C4F1381DF6A0F95A0186E82C04B4DE881209E9CCCA3EE5B1DEF0B02353738D92A07314403A1A2721C256121FBA8B8CE9B460 +pk = 8F03ABE9D36B168AB16AD66C15BBD7FE02CDB0870A2547A0F28A29AF69911200895127182A8AE17E2131165A0C82482C9C62A6FA38407947B93C9BDED32AB90011 +sk = 8F03ABE9D36B168AB16AD66C15BBD7FE02CDB0870A2547A0F28A29AF69911200895127182A8AE17E2131165A0C82482C9C62A6FA38407947B93C9BDED32AB90011B917D7A27880170AC634D1AB5470EE92BF000000000000000000000000000000C85BD581CE2E4C70B2FF5D9699A94A41FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF337975EFECEB9C56DF5E3764B91E869D2EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000002BD1883B56EEB8732C73B5E6FFCF46B132F039A31D0647C85B912E7487744700F6322402215696DC3DC4BBBD1924C67F241A96093AE2514EC372081D2E0EA700CDE475679EA02BB41BD41FA100E085F2AFA58CF0A53A4FF5F20DB778AF6516004F1FB2538B2C05E0EDF0F70698DE9F2F3103569AF0EA13DC274797CC0EAE0000 +smlen = 3415 +sm = 0E909DD003F571F2D04389B83DB2EEA57D651652EB7321C6F6122E4E126314049E5198B4D14A5E8EA24E5A1497FAFA917B436CF0DE7A92C0A6FAD778E5C9420200009AADBB5B4A7C78A33D655BD4E3ABC4BA591671455BEE81192A64EF90C4A7D8D721104A659AEA3CA3FDA4A7BD12625B16F77F55FA62E733C8F6073285B2D2B630FB12BFD3850E3EE24E4E0670382E17000B1700769683FE7BFD74B3ACD21AF3898B74CA73DD126C8315538937CAC4EF0AD4588765A26DCCE1C90C559CE691E7EB3E0A497D357E1AB583C761439C0A66D1164518F01B6894067925753CC2866A91552FCD0EF029C2284C620CAF364DE6C56EB41EE0E4431D9BE22B76451D132A3F9AD91A53449BE820A7ACF56F6ADBC7107C7C729EC8A64FFF6A24B4CF83FF4E945DEF336DBFEA6067FCCBD1CD6B5698ADB1AD6DF03FD0A553457B8E9FEB4A1243FEEFC2DF7F66AE3ECA5BF169F7891ADAEA8D5C59012C7AA00A5A86B0A33D0006F8AD5A01C60ABBDA6D249D3FAC7EBFB85103A3A747A45D0ADB7DEF52ED3A5F1A620EE383A9C0CCE1900E413FC74A7A97646111D54783928B15BCA783D01EFC67F49CE6F781E82D25D3F30561F507E3831CB4EA5B4A08D5489830017270B63D8298BEEBF48EB56BDA5685D5E1E06404EB9A6C3790E9B29C99168B10BADF8FDB03F3C568672773EEC96428149CA272EA5A8083F8208BDCE361E7D40BC4DA75029D4A18B0B6AD615DBF849935D4755CFFD270A52FA290811CD55BDCA38ED89F0066ADB9BA7F58366379FFE1CAF3A9127E147C3AF3DC27279391E0C09537E81E20E7B9FE4FE3DA970FE50BFC96555233CC9E61D3C356AAA8EED5A8AEA2327D7036EE03E7EE40AA35E9DA4544B121514C261EC1CB0B2D75B1D5CE129E47F89825F69BA8254163179FC1331A917AE9C5A18556A10C5F983871B1258CB6FC8AD207F97A220C5598860B6C56F1EFF09DE6000241E901A89E107FEEC15833D34D6EB12DB6B188FAA0B858A5B9E32F84F783B43B6F8A3B2E4B044CFF8902E1EB0C527BB4E29C92ACC9DC7E0D9AC6B3A021415768B21DD9695983EE89C871C0EADE0BCE4FB72E682DFB5A2BB7498BF4D2C01240F67D1B62BAA4E587069C16E3032114B14A1C4288FEBAEBB4C75C3C05924A358C4BB7DF95ECF81D67147FAE3F605EDE61B7BA164EBA1AB36ECE97DB0ECB32A673E899B24557D8987AF3ADC57A9DA609914C9B2D6D8AC58E5954E0DB5AA9E75B444700B8F704E15A6A7BBA81809FA8801C6CEB5747A44CEB8F99CFE6D8A2A03C03451E5F3D392725207F3DD28B2C00004425B7AE05FA3769183AB60857B27AB08BCC4321D293C93D1D850D4E7A81B14564D7B15AC0E3BC1BFE0561622C6AA06923EEFE163629EDE8BA1732DBFCAD52D3BAA6E11E569EA790B36A8472B2CA37BD5C0EDD37D8F164B874952D00D592FB705C6B3110A12B03829C157191D33C579593E7828CDA5C24A284BA2F5A42F0BFA601A8F6D3DB1CA6D703ECBD261629C9F96EBC0458737B9951219E5B1F86192E2A85B47D80610A0ACC8B1A70DB2916F89CDB2C7F8943471DDBABD2A3536C5DC8A73CDEDDEAAEDC86FA148D2EE479F8465558852FCBEA0DD8017F1B976281A5014319C2C3CACCBF571D9550215B24134F6DAEF32716802E7945CB3F97AFC1AB1DA17D0C41B545A750EF345A6F88AD5FF52D512AFA6558335B5EB8979D8E6DC1DA562BB997E7D152D9FA3EAA09119C3474E11218230D8A56C19AD87FDE483FBD6DDDE9ACBA813BEBC8505A323C601E5B5251650DAE9334562E3DCC38A28BD7DED6942D0CC2014235C1B66CF4A57BA3010B83CC7050309F57A27207512D195D070DB3D10FFCBACDB47E4231142BAE588F92C5B0A71ABD67CA9390C2E05FD2CF7A1FABB14C5A7AE3773C66DB1F055214479E388B5E6ABF0DF8FD1B0E4F90828ACC397643CBC274143FB4331262A20634877BE4C7489C1AE9EAF90BB2A177A6B5AC15CBDA27DA0616E5F87461554F5686A7BD6D047AD0B98C8CDEA3DB78DD2970C78FB861F2A92DDC277876791C4A30F525659557831F4377065D19ACB384CC68340152A6DE6D84CDB58F433923D1FB8CC6B10BACD95B9AB1B45563998620D192032269FA8301C09A29C4B5B20CA0A3D63A4F5984B7DB0F5B17417DC7B939B9B177BF423E2F3D57DFF296E6E4FF0FB1744B13731206EAD54EF0AA1DA09BEA8B0AC0EF71B73D009D30531DE9FDE90D86BF5F20D8E5A9E324E657A98F8C0031ADAC4385157BA4E28B48AED957A5B36C3B49057F8ECA7F56808F794014DAD170601070607010E004F42D01CC63B2A1761126BA045F1165E25FDD05901FAC6B76E777FAAAEE6F5ED94302E2DA28046B4BC60228E1B9E194F364E377F84681B3011583554B76FBF8D7456DBDEA665ADAD6AA0556C8CC714F217A518A98615C4C1CFC8ADBBD4D12C5BC23AD7A0F849E32FE2005334B55D7BCB43D1C95D4793E7C3882740CDE8DD24B367294496A3E2F3251A66CDAECE9E0A73D853F8D4E3A4637836DED68CB28BA4FCAB02D61FB5CFA581792E636217F3238D78912EA0863816FFB2F388823174B19433C2B14BAB69E12C3B791FE683744D4519455A52555AF0D7E12749F6094AFDBA00FC6A609C7578C531FC4C3C3065EBF78414F112014726EC2230F9BCD9C15E36283144CCBE0D1785B65CF49BA8FEFE92EB6907C0330BC98AC172EA9E8DD4DF8974DD6B6772BBC6CA8E8562C5EC0B6592DE7440AC915C35E0AC8087F22EBA110CA3037B469B1D5BC92636D81881E38D8BBED01A29B3EBCF0C19EB95BF999EB848022592AEAAB649CE19824ED9D3A32D75FBA556EE07606A306D1FCEC2E24B38274C361B7BC96CE37B7F4FE434EBA17AC2A097051A92E4EC32E4C678F7762E8B96EBFD2600C0F224B04B2CD7E9F4AD327D53603828015E9CF45969800F02FA5E0BA26B8C844BA1FDFFDE44303AD0389C1B31D582877CA6BFAD4973BA35FBB90ECDD95F430078BC39AA89434130A5FB8321E51F9624090D0277A9F112EE8FF65D3DBA999C7C08727D0F08DCF00CE22F62C955D6A822F247C8065AB94AC442E1CB5F31254816794CC2556891A523B8AEF09D3B9E07AA8B67B3B87567ADEBDBDFB93BA9A082F72052572C97E73AF16CFC42D2A51A3683F84748A338AAB56264753BA4083D356A27C71F47221ED8340C50AFD46CD207C4F9634AB5A44888A4234770C46232C35EFF83FA950B0A6879137DCE209D5A1F26809B411F046F51FF084F15BFE03292EE845D3044235ADBC299925235462E67F803DAA1426F0E116B93F4532DD2784F7F87AE360281CE21F70D230C242E1A98DE8FE1D6147AD71EDEC89E24A5980C45FD91E23516758AF71DF8E0DD96929D4DA61A3BAEABB96C9378986DEB4C9101175E3AF1E102B52A8DA27D916EE4A28263CA485CFE87EE5436249C1A2F933669F6E3274E9BD93092F4A798AE85D6592EBB54DC65C28BA08582E275972B0A12C22A7792CCFD4A398E504C6FB2CF5EF1F9C268540B4FD7D07D59C49A559D86A56A009C4C18A3FCECA109FC7A45C6E842ABC22053E84878C4805D96AC96BA00FA40FC3B50407141105845055447CA94BD27F234183C2B8BF37F5CD249ED0705AFAEAE59C8BE8F6B38069D67FB23F74284E8185C176B58B482900A3E09774383C7ECACF4FE5E580DF99DB102AD4018DB73C73A635D3FCDC833B000C948D846AACC92ED54FFB3ACAE1BFE205D6B2312658F15DECFA085D13BC3757C754C5704D8089563E0CCF52B04A49DF293CAFBBC2FED5D9551B5A3897EC7BEAA56A4034BEDCEB4840A9BDFBB8BF47D66DD3A4E3EB1666372C6B2C39A48D52761BD36403CB130A087685E2EABB8711C11005EA09F90AC49665415C56CAB6FD2719C45B6800DF914F8FF327EED29D9B9A5BBD6B80B8BB31AD1522803B2C8D89166D5C6B2ED47BC5BBBC4ABE6709D46B856AB81DDF15F098A9AB76A8257E7E5C2E7DAE53FBD691736F0D6BAFE0BB939172614E99C7D7E37754AF6C3C637D076A43DBD70E5EAE910C8170CECFF1621E382D2977635B67F4FAC555419F8A0BB76CCAEAEF4C7385D293C9595AE10E5201C4A31B4C3ECB9F3B304EFB1886F9C58A4EF04E73341B95D9BDB85D706B2A8D3FDD153743A8BB7B3289D0FE79F6A3B9E0FE160DD6700FD64FC87D9AC96858A6D395FEF6F3D2193EBAE7C3A92E18746A7F12B244FBC5B1DF0086CC7045036519D9D7BF8E92B850EA0D3D1E775DEA362362462DEA2D3501D39203E2879070D1F7AC92FA1576F6D12886D5B979E3C788C09A769EF4EE45E14CD8E7553EBEEFCD31FF3D43D4988DB08F6630BA8AE8C7250AC42A3D78EDB967D59310A4A224567D8797C42370CBD2302A3F49ABEAF85FAD9455F98B61EF2B5E34A5C552583872145E191BBFFCAA526F5E38E497A1A1E1220A0F283A935ECD366A9069D5A2A80BABA3A22FA85A2557DB72D7E29EB4E33E8ED8BB4EC2EC7C2E9CEDEF46EA955834ACF8C9AB23B78052446FD73C9D61683D7FA0088DB97D07CC350AF0B6B2AD7E66A493AF814C11F8C0F2FDF0DF40AAFD0D218C00319C367E98D7F10C74EA06D31276F3F216E1CB2F12033915008CC83B00AC60FC9C2FB7F97D6E8CD79650D0F9D82BFD9CAFEF668021D3D165F3FE84221998BC8C29AEA0B5B7E0F1F25A0D7447E806CC3FC39E6038BE3DF9AC01F46222D3A609F8A026744AB4F58A734E3782BEC301EA91F2D8E2242D04A11E82474002143223F29656B1A7675AA5AD181004C4F1381DF6A0F95A0186E82C04B4DE881209E9CCCA3EE5B1DEF0B02353738D92A07314403A1A2721C256121FBA8B8CE9B460 + +count = 99 +seed = CB2E6226615393FC3BD4AB3A412AAA030AAD40E8648EE6B56D2C1591D8B97915D88F2D22F7221377B4B04CF2AE9ECC4E +mlen = 3300 +msg = D21A6BB3A2356805E678673C45FB055FC5266E3F692AF9935AEA307F14A5C41B979966A5DFE42EBFED1487E4822B74AB5AF28995E085EC8007ECA4977C63EE5299FEC63DCCBC42EEACAB488E574249E9D856146750AD97C8A443485EC1C5820BEB0964640010F6407140791E74684DBB91052E2D8BEF7BDCD78B2EC03C97A53295D683BDBE32A70DC19A2F75B8613AEA9616AE0E280179492820F73FB7FA4121E673FB5C328F41B67FF8FFA7AEE6564ADABA046D6E1D6AA13FB24965390F829246DFA8763851405075F76CF94C66FFC3308214DF0960C649AAEDC22926CE9357D3875F8B71D68D75999AA3663C30A9EDF07228BF7DFF49EC1E6C7A33D2053597003B82392E826EBD701B4C981AAAC9951C79E08F592C2C0637C8E5A7F9DCDA599E859C317D4888B4098992E0E2D979E41C703686D577E5BA6001EC4F587140711293D664963632F87EA0461E0E0C5E9D8D292FB409F9F9AB172EE17FC8AFABAD06E42B437CE22924EB5DBD3A80A06962F3B37946259F9C75A233CB2B4ABDC5CD1B648FAEB1BE8630DB40D151B8FBA693DF2C5BDCAA14DC4783F450B6BC407515CEEBC5C9A47BD1A141384F0B596CAB1135C075651CBA989C190F3171DC1D72330EDAA01656813C4B7811715060B023FC426745C301B2A91E0D08ED3BDED438C4CE6799C35F3981C882A0BDE4A2FEEB1A52CAFA47B0C48558FC43F98FE08F03A71128362BB6FB9DA6A22249F4D4352AE7D3DAE85DE497E2411EADCFE5BF1A3C075C45811E0097ECEA255FE15BD8321FE8B546A8CACFB899EECF5419DB363C7567C2FE7360B36DE14674F500A31D3EEC71451A7C0D5576A8939C0F6D4D9F2F03F3C516CE25CE73ABB35C73AA94F6AEFAE6AD87052D6B195FA43586817F5BB974AAE7F1B8608922411AA5B0D7D574016CBD3DED13395623470A108FA0E1D3F9FAA7E1E5031843F2A23DBCE8B196315290DEA5795E4115D53DC570A444064CFA3C9457DBF3EE323B1966ECD2270C32910F8F430522471258A1F1955A6E1DD8C84ED9A566499BF85628615351ABE84B401421DA2CFAF575E2644C9304C075ECFC374066CEC713FA4C0D89043689FBC59FF54B8F97EE0A3B0989BC5E4EF83CC9833E75BC8B67BB5EE3C06EA156611CDA95A6702416807530EA206ED89835D20805EA988B1958569CDF7F809996214DADAB4E20BD44917E3410EC6BEAC98FEA07F764E85B66AED5E17CF675D2ED8E63DB728FE75158CB31779E31379648B43D68CCFF3780854CF03535C57122019456E73CF06769BF1FBF558542241CE665BD10F921828553585E0CF664CDC6160F9C47FA5330591B74194F4716056CA83993EFEC4A52DB9A1FBD3B2F504AC19667325167407375B6D7DE739F07947B511C8D475744E5C29D6E286A37F1FF8317BD0178F0E306A38FA6E75F4A80427FEB2C91235D3E7F20D8101CFC03BB73F44EF59AF3526E9AFC580027A1DADE37654238B8EC7AF0105248FE30784A88B72E11FC1BD807E47A349BD29075BEFBB29730EF8E85E3ABD5105559BACEE74AA27D90D360A8D629DBEC95EB34C7F7CA20096FF7B521E40D3944A975436896F372EEAB6B8615EB91697965BBF955779DD3047F7E3BF029E3509A5780247445D6223D085AFB4291D976EFADC41E42DC2C0728D18F6155654A332FEC72EB6AEF8B92C1D177E3DC28C31971BCAFF76DDEBFD9588BC244B116D409E58DC5ADA1648663D603C47FAEB814AAA7EB9B6264356F926C18B9357BF426B89DDC8EB9177ECEB5C6CDC64DD8FEB7B326BC1BA89BD9035235DA0E644EF959C58DD97B88D5C749B36931AC2694C67151DB0894652E99254222D37CEFE9E27B3DD663A152DBE29A3639AFE42F4578937076180563AAD6AD739255EA012A17D2A56627D84C44FBAB261D392A966CFE19278799CF1634D42384323C496190D4B9FB662694E3887EA66AB9E8B195488C8DCA47C8BC0424247759137CFBF86DEDC3641904CB6FACBB30A9FA84ACF69A67B4AFDF4C2AA420FC0D90CEFA0DFBBCD3072D9F772FD6058E2BF0E251BE93B00DC43765B53DB51B22F12D3ED0CC5655E4AEBD9D923F99A43E4461DCF5992030E66A1CDC3A65558D9BB3A39788D92328387D144850DD3706FD7A079E3D2398F542F91A8AAABF0C5068DBAF1FCC5160398ABECF74884BEB04F3A3EA38BBB80D798F5981B3F2DB6C7B33F867B7DC06A4417E30F94CDB4F523AEEA0BE12BD75AAED57520DB0D4B4F013BE3A1DC7AE5C58FD1DE9637F7D82F697B7E92DA427A78FEEC6A5C0255EB57A43DEA6CEBC8805BC04E04FE789E222B1E2642D26EDC14FB36ECC6092B3060E45EED6C5B35DE8741F72933930ECBD7338CF39474122357365700CB50C5EB176FB92814FA7F4032570CCEE6B859236AD5DA5F1730129EDC7BE218BA9874620F6F0EBC45E0BD622F8FD1AE6974994AF95C6519EC1C46650C073D194FA6EBC62F405F63A3416782A47872C7D77D648D0A1C802FFDFDE5FDC112C94CFC68F401889EFC522FE488FDB5384C0D93147AB6587659D936F98ECFBCDCFBF8B352D605F18C855E2559743ED97991C5D50DF44A7B929303835654A3955ABC5BEE6327400A7CCCE460B318D8B5ECE5B12F606ADB3D7B5ED59563B8E675E78029AABC234442C2463256FE02B04F556DA35C4615D14A9F4EFF17DB0DB81DE4BDD894F6628A120BE2D4CF3E1F46D53817899657035A76137E23C0B0E8DDD29465D7F15628FD435E6CAACA4194FDBF85FDCC31D5DAFCB52568B7C0CFBE713BC85FA424BA3ABE149E4035FC86807A8B876D2163B447CAD5EC0E6EF38A1D591AFB46267F9DBF142CAB1CAC1F73BEBA212992FC6D4647EC17848D1ADBB1901277A5078DD72D9C9184E893C0806E9B4AFF0A824670D438620F2A7E8D2965B619D291E5824C014FC888A36FBBE17356431F0039038F9B497902AED969F9C488390B7087763638E976801127BAF1F53803C4DC9649F0EE85D67B239E2BDAFB2BD75F1D1DA22A56FB3AF10A9DDE7AD306C4AF8681029316C0E1949228E6BF5ADF942F1C0EF92B2BCBC0C70D49E5808851444240A78B14D21B54F66271482F49B85F5180B268050327368496CFA8B54ECB97EE6D28EB74A3742F68583DA046809002C22F7B31FBC0566969F9A15CDCA892C4BEB101A2AC3526C76E9D30982C9B4893450FDEC4001D2431828D24D8B1A67DF80E2E10ED2EA8D723227055C48006665F7DA8E032EFDC70BC7EEB2B369B551FAC542AD6DF1A23107E2B3C0E3CCACC25F26404C085CBF56E52D35D7948DB9FDA6DFC24709994719D8CED41A2CC9B3C4B2BEF0967CB71861CF0E6AEA9BEC9395726AA0E2F1A7247ED0F6038E3DF4BF566786073590DCF97F8F0A99658D8F630A2D130C46CF4D26C669360D0F70B75F904C9F923AB285D5DB129F6C25AD21F9E26AC844D07A8EED86C4E224EBFC5B3F720D6F94B0A01B1433C46B40CF84E80F7A6AFA7BB8F9ACF818AD3CAB2DDD6904C067BEA4F1FE79B83CB0AA8FC75B6B096BAD6FE94ABFD48F8EFC0F2B9A02EBDA8FDBDBE1C77F1854EDBA18AAE7F31CED9CD34C1B355108DF18A8953932F7554AF05B203A96A9BB93E0EFF51D7F93B56E351562CF85A2D35EAE2C2427B89A8662A1C723D4F14E6EAFDBD636C2BB7ADE29C1A6BC8A463734C808BEC68B1E9A31AF6E29B412F1CB8C90A9911AC5C3EA71E46113D2D7B1AE2D8802B06A770FD0E9E4652895E42181AD09BB541E9493F258711BB7BEDD3E7CA8B8CE875669CF80A6880ECA3F13800DE7011EA67F443E505C4FB455608AE586F922B3C83FD33B306BDEDB86223C33E3AA65EDC93CBCF3A03ADAF9F328997951D59A9200C0BA2618E3596AF176B43122CEDC52B1E006EA6D12DC236A6FCD7CC46825F2EF7ED71683A731D746FFF2FE54E0B392A8CBFA38873196BB2B835DCA7CB7C3ED9A004C7A329B9734A111744BDACDB669E69E9DF1E52F07C513E3752A0CCD81D7DDC4A64868B7BB2BBBD2095373480522BE10615248A179DCB61DAC90F7FA5FA9B84F190A9C62B5FF9CD473A940F03E7107157D7EB60AF1E3E384FFE8A67DCB2389B3B0FAB7C789CF100CA95CD6A85442CB9A2C243FB9D454B20BAE5762D72B8FE79B4DF81163D61DE4578CF976992D8B9989FC68089F811F53DB1E1092B60220552876B818BEA981571898CD6AB7B5F13C46B0A076526E3241D65014F855EFD7BDE08AD91F259DCB64E94EC3DAD97811EB024EE1D341521DC92AE5E93C73422088976F2D27D64E1D193B955E6736AD2BCCF3C1A53D590576434ACBC0B687F27F255FEF354E68ACA47160EFA7126F908E08E4548C11546D9C412D685FA84D2EB4DCB2BDFC48E2FA8023548198EBB072A48044F4391143E3BEF4FF9066A4B0D03ADC826819D67588BA84F99DA27424103652ACC039DDD3B567851CD78E4117A8B93AFE01FC8EEBDAA1ACB8BA9D095789E76B9D5AB9EE177A15D666EF171FE1D4BDCCFE2E58CE669B561F63028C6CE26DB5C8182FE048680B175C7AB407215FF3A7801C950D509867AB1B0BEF89B3E38A387915225EDE76F91AAD15A85D8C46EFD588BB3BAACBC52C036211512473420F3F061F5F53E9353DE0780425745A76439B3811511C86CA503251F24113384E1A24A9367536E796CE08B896F572489A2339E82A856C +pk = AEE7A3BCB9BFDE8D559B028389ABFCAE3A6EE8772B23D30A744290C52686D801651DBBAE757C6998DA21786936DB9A0E50804EAF749BF18802EBB0B052CC0F0311 +sk = AEE7A3BCB9BFDE8D559B028389ABFCAE3A6EE8772B23D30A744290C52686D801651DBBAE757C6998DA21786936DB9A0E50804EAF749BF18802EBB0B052CC0F03112767106192888ED378E9CBA1374BD8427E04000000000000000000000000000004A6CDDA4122E39D0941BCBBB5E267651DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9154E840D72E512EAD75EF13E70610069FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000244C8DEAA8980F2ABF5812FE730C559F2AE0521BF315BEF7B7FDC731FF728D00D9728D8A91D1D8BF818A779CAEC4A9CFADAFC8C3387F257316A41525CD89900065B7AA6170B77C796FB727B81369C268B4B5F0F5302F618001F77BFA01511D00DC7F4A62E86B71B9F2A25F008F9193DDAA564D88DE39CF6F5478000F50663100 +smlen = 3448 +sm = 48D53AACF3227B4F92ECC9B6B9B5E069937AC61BD84AF6488A357CE6D4A1A1010F08AB4373D63513C9C19D7174954F856151814A344098998AD3B0AC69CB8E00000025E4A5C4801D2BC437F96ABBEB2F12A9E50A8ACA6D9948C65F24D920DEAA83F67793AD3D0F676604427F52F89118A0F17AB38194079FE3CFBB51058C3DFE7421DDA8A63C51E24A64AFAE912D248997001717D21A6BB3A2356805E678673C45FB055FC5266E3F692AF9935AEA307F14A5C41B979966A5DFE42EBFED1487E4822B74AB5AF28995E085EC8007ECA4977C63EE5299FEC63DCCBC42EEACAB488E574249E9D856146750AD97C8A443485EC1C5820BEB0964640010F6407140791E74684DBB91052E2D8BEF7BDCD78B2EC03C97A53295D683BDBE32A70DC19A2F75B8613AEA9616AE0E280179492820F73FB7FA4121E673FB5C328F41B67FF8FFA7AEE6564ADABA046D6E1D6AA13FB24965390F829246DFA8763851405075F76CF94C66FFC3308214DF0960C649AAEDC22926CE9357D3875F8B71D68D75999AA3663C30A9EDF07228BF7DFF49EC1E6C7A33D2053597003B82392E826EBD701B4C981AAAC9951C79E08F592C2C0637C8E5A7F9DCDA599E859C317D4888B4098992E0E2D979E41C703686D577E5BA6001EC4F587140711293D664963632F87EA0461E0E0C5E9D8D292FB409F9F9AB172EE17FC8AFABAD06E42B437CE22924EB5DBD3A80A06962F3B37946259F9C75A233CB2B4ABDC5CD1B648FAEB1BE8630DB40D151B8FBA693DF2C5BDCAA14DC4783F450B6BC407515CEEBC5C9A47BD1A141384F0B596CAB1135C075651CBA989C190F3171DC1D72330EDAA01656813C4B7811715060B023FC426745C301B2A91E0D08ED3BDED438C4CE6799C35F3981C882A0BDE4A2FEEB1A52CAFA47B0C48558FC43F98FE08F03A71128362BB6FB9DA6A22249F4D4352AE7D3DAE85DE497E2411EADCFE5BF1A3C075C45811E0097ECEA255FE15BD8321FE8B546A8CACFB899EECF5419DB363C7567C2FE7360B36DE14674F500A31D3EEC71451A7C0D5576A8939C0F6D4D9F2F03F3C516CE25CE73ABB35C73AA94F6AEFAE6AD87052D6B195FA43586817F5BB974AAE7F1B8608922411AA5B0D7D574016CBD3DED13395623470A108FA0E1D3F9FAA7E1E5031843F2A23DBCE8B196315290DEA5795E4115D53DC570A444064CFA3C9457DBF3EE323B1966ECD2270C32910F8F430522471258A1F1955A6E1DD8C84ED9A566499BF85628615351ABE84B401421DA2CFAF575E2644C9304C075ECFC374066CEC713FA4C0D89043689FBC59FF54B8F97EE0A3B0989BC5E4EF83CC9833E75BC8B67BB5EE3C06EA156611CDA95A6702416807530EA206ED89835D20805EA988B1958569CDF7F809996214DADAB4E20BD44917E3410EC6BEAC98FEA07F764E85B66AED5E17CF675D2ED8E63DB728FE75158CB31779E31379648B43D68CCFF3780854CF03535C57122019456E73CF06769BF1FBF558542241CE665BD10F921828553585E0CF664CDC6160F9C47FA5330591B74194F4716056CA83993EFEC4A52DB9A1FBD3B2F504AC19667325167407375B6D7DE739F07947B511C8D475744E5C29D6E286A37F1FF8317BD0178F0E306A38FA6E75F4A80427FEB2C91235D3E7F20D8101CFC03BB73F44EF59AF3526E9AFC580027A1DADE37654238B8EC7AF0105248FE30784A88B72E11FC1BD807E47A349BD29075BEFBB29730EF8E85E3ABD5105559BACEE74AA27D90D360A8D629DBEC95EB34C7F7CA20096FF7B521E40D3944A975436896F372EEAB6B8615EB91697965BBF955779DD3047F7E3BF029E3509A5780247445D6223D085AFB4291D976EFADC41E42DC2C0728D18F6155654A332FEC72EB6AEF8B92C1D177E3DC28C31971BCAFF76DDEBFD9588BC244B116D409E58DC5ADA1648663D603C47FAEB814AAA7EB9B6264356F926C18B9357BF426B89DDC8EB9177ECEB5C6CDC64DD8FEB7B326BC1BA89BD9035235DA0E644EF959C58DD97B88D5C749B36931AC2694C67151DB0894652E99254222D37CEFE9E27B3DD663A152DBE29A3639AFE42F4578937076180563AAD6AD739255EA012A17D2A56627D84C44FBAB261D392A966CFE19278799CF1634D42384323C496190D4B9FB662694E3887EA66AB9E8B195488C8DCA47C8BC0424247759137CFBF86DEDC3641904CB6FACBB30A9FA84ACF69A67B4AFDF4C2AA420FC0D90CEFA0DFBBCD3072D9F772FD6058E2BF0E251BE93B00DC43765B53DB51B22F12D3ED0CC5655E4AEBD9D923F99A43E4461DCF5992030E66A1CDC3A65558D9BB3A39788D92328387D144850DD3706FD7A079E3D2398F542F91A8AAABF0C5068DBAF1FCC5160398ABECF74884BEB04F3A3EA38BBB80D798F5981B3F2DB6C7B33F867B7DC06A4417E30F94CDB4F523AEEA0BE12BD75AAED57520DB0D4B4F013BE3A1DC7AE5C58FD1DE9637F7D82F697B7E92DA427A78FEEC6A5C0255EB57A43DEA6CEBC8805BC04E04FE789E222B1E2642D26EDC14FB36ECC6092B3060E45EED6C5B35DE8741F72933930ECBD7338CF39474122357365700CB50C5EB176FB92814FA7F4032570CCEE6B859236AD5DA5F1730129EDC7BE218BA9874620F6F0EBC45E0BD622F8FD1AE6974994AF95C6519EC1C46650C073D194FA6EBC62F405F63A3416782A47872C7D77D648D0A1C802FFDFDE5FDC112C94CFC68F401889EFC522FE488FDB5384C0D93147AB6587659D936F98ECFBCDCFBF8B352D605F18C855E2559743ED97991C5D50DF44A7B929303835654A3955ABC5BEE6327400A7CCCE460B318D8B5ECE5B12F606ADB3D7B5ED59563B8E675E78029AABC234442C2463256FE02B04F556DA35C4615D14A9F4EFF17DB0DB81DE4BDD894F6628A120BE2D4CF3E1F46D53817899657035A76137E23C0B0E8DDD29465D7F15628FD435E6CAACA4194FDBF85FDCC31D5DAFCB52568B7C0CFBE713BC85FA424BA3ABE149E4035FC86807A8B876D2163B447CAD5EC0E6EF38A1D591AFB46267F9DBF142CAB1CAC1F73BEBA212992FC6D4647EC17848D1ADBB1901277A5078DD72D9C9184E893C0806E9B4AFF0A824670D438620F2A7E8D2965B619D291E5824C014FC888A36FBBE17356431F0039038F9B497902AED969F9C488390B7087763638E976801127BAF1F53803C4DC9649F0EE85D67B239E2BDAFB2BD75F1D1DA22A56FB3AF10A9DDE7AD306C4AF8681029316C0E1949228E6BF5ADF942F1C0EF92B2BCBC0C70D49E5808851444240A78B14D21B54F66271482F49B85F5180B268050327368496CFA8B54ECB97EE6D28EB74A3742F68583DA046809002C22F7B31FBC0566969F9A15CDCA892C4BEB101A2AC3526C76E9D30982C9B4893450FDEC4001D2431828D24D8B1A67DF80E2E10ED2EA8D723227055C48006665F7DA8E032EFDC70BC7EEB2B369B551FAC542AD6DF1A23107E2B3C0E3CCACC25F26404C085CBF56E52D35D7948DB9FDA6DFC24709994719D8CED41A2CC9B3C4B2BEF0967CB71861CF0E6AEA9BEC9395726AA0E2F1A7247ED0F6038E3DF4BF566786073590DCF97F8F0A99658D8F630A2D130C46CF4D26C669360D0F70B75F904C9F923AB285D5DB129F6C25AD21F9E26AC844D07A8EED86C4E224EBFC5B3F720D6F94B0A01B1433C46B40CF84E80F7A6AFA7BB8F9ACF818AD3CAB2DDD6904C067BEA4F1FE79B83CB0AA8FC75B6B096BAD6FE94ABFD48F8EFC0F2B9A02EBDA8FDBDBE1C77F1854EDBA18AAE7F31CED9CD34C1B355108DF18A8953932F7554AF05B203A96A9BB93E0EFF51D7F93B56E351562CF85A2D35EAE2C2427B89A8662A1C723D4F14E6EAFDBD636C2BB7ADE29C1A6BC8A463734C808BEC68B1E9A31AF6E29B412F1CB8C90A9911AC5C3EA71E46113D2D7B1AE2D8802B06A770FD0E9E4652895E42181AD09BB541E9493F258711BB7BEDD3E7CA8B8CE875669CF80A6880ECA3F13800DE7011EA67F443E505C4FB455608AE586F922B3C83FD33B306BDEDB86223C33E3AA65EDC93CBCF3A03ADAF9F328997951D59A9200C0BA2618E3596AF176B43122CEDC52B1E006EA6D12DC236A6FCD7CC46825F2EF7ED71683A731D746FFF2FE54E0B392A8CBFA38873196BB2B835DCA7CB7C3ED9A004C7A329B9734A111744BDACDB669E69E9DF1E52F07C513E3752A0CCD81D7DDC4A64868B7BB2BBBD2095373480522BE10615248A179DCB61DAC90F7FA5FA9B84F190A9C62B5FF9CD473A940F03E7107157D7EB60AF1E3E384FFE8A67DCB2389B3B0FAB7C789CF100CA95CD6A85442CB9A2C243FB9D454B20BAE5762D72B8FE79B4DF81163D61DE4578CF976992D8B9989FC68089F811F53DB1E1092B60220552876B818BEA981571898CD6AB7B5F13C46B0A076526E3241D65014F855EFD7BDE08AD91F259DCB64E94EC3DAD97811EB024EE1D341521DC92AE5E93C73422088976F2D27D64E1D193B955E6736AD2BCCF3C1A53D590576434ACBC0B687F27F255FEF354E68ACA47160EFA7126F908E08E4548C11546D9C412D685FA84D2EB4DCB2BDFC48E2FA8023548198EBB072A48044F4391143E3BEF4FF9066A4B0D03ADC826819D67588BA84F99DA27424103652ACC039DDD3B567851CD78E4117A8B93AFE01FC8EEBDAA1ACB8BA9D095789E76B9D5AB9EE177A15D666EF171FE1D4BDCCFE2E58CE669B561F63028C6CE26DB5C8182FE048680B175C7AB407215FF3A7801C950D509867AB1B0BEF89B3E38A387915225EDE76F91AAD15A85D8C46EFD588BB3BAACBC52C036211512473420F3F061F5F53E9353DE0780425745A76439B3811511C86CA503251F24113384E1A24A9367536E796CE08B896F572489A2339E82A856C + diff --git a/KAT/PQCsignKAT_1509_lvl5.req b/KAT/PQCsignKAT_529_SQIsign_lvl3.req similarity index 100% rename from KAT/PQCsignKAT_1509_lvl5.req rename to KAT/PQCsignKAT_529_SQIsign_lvl3.req diff --git a/KAT/PQCsignKAT_529_SQIsign_lvl3.rsp b/KAT/PQCsignKAT_529_SQIsign_lvl3.rsp new file mode 100644 index 0000000..38b798b --- /dev/null +++ b/KAT/PQCsignKAT_529_SQIsign_lvl3.rsp @@ -0,0 +1,902 @@ +# SQIsign_lvl3 + +count = 0 +seed = 061550234D158C5EC95595FE04EF7A25767F2E24CC2BC479D09D86DC9ABCFDE7056A8C266F9EF97ED08541DBD2E1FFA1 +mlen = 33 +msg = D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8 +pk = C32377D6F6D70729884A7F6877EF4791E35D21F751A3E96DE23F9A7A3C01BCD8A5F146DC19E4E2AC63007457F97D8A40EE84AEE7564CA9A7FBE6200FD3E5E55901BFC60EB25C50D39F5C91C96510556BAA22028DF76360841721A601D65E8D0F06 +sk = C32377D6F6D70729884A7F6877EF4791E35D21F751A3E96DE23F9A7A3C01BCD8A5F146DC19E4E2AC63007457F97D8A40EE84AEE7564CA9A7FBE6200FD3E5E55901BFC60EB25C50D39F5C91C96510556BAA22028DF76360841721A601D65E8D0F06755AF9F356EEDC7F5AAF658B344692E740BB502077959C2F80140000000000000000000000000000000000000000000000B258183AD021B2AF6F79737F5918EF05D460BFC703C57661DAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83FC10C362468FD443EA1D38DDC8C7523DB5AA73159724643DF1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C1A4F65C7D62BDCAC3268EB598C5DDA0D27F4FB47D2181541CE8B06F09CFB70FB051CDE52F16DF4A681409AC19D649006DE2760B3179E8F5C52695A675C80484137A068A41376909D6D20F5ACF3A90B0497BD68B473E6C72CD2E60EAF4B35500665532FA5AD8B4863248315C3377EAFF3E18B5681376AC456F215F46F7A61875AE91861DC893CA87C63E9FB4145E1200A9D47BB166EBF96F7CE7C2062040C8BB05FA319F925992D0B99C77101B4C6A33D521842579A9138D7038D6F8CB21D600 +smlen = 257 +sm = 0868CFBF275B8E7B19BF597D658D62CC913B9B2933E30A297288FBE687F6F6B8AC8AF7AA007F191386BB1A203CDDBC2BDB42792D05DA69A4507073D12B0BDC47E2B36BC4BA45C68791918281E578F2DC14294504726DCD4CA4C4565FBB89A12800048C7B84746A2CBD8247248E248B70B51AE91994957857692A028D8F5CABABFC91E4BF1C5D350219A0189C57DE4A7710D29E0364C79B2188449EC0397359430D594C7B5980CC67551933A902D3C11F0FBD6DC39711D3E1F501159EE7FB85CE81B4CE24E1016006567DF469315D513E73F69F6301664E6449AF9DCEB4000D15D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8 + +count = 1 +seed = 64335BF29E5DE62842C941766BA129B0643B5E7121CA26CFC190EC7DC3543830557FDD5C03CF123A456D48EFEA43C868 +mlen = 66 +msg = 225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1AB2568209E46DBA961869C6F83983B17DCD49 +pk = 92D7F219CA4D00DB42C9AB761DF9970AB2C2AF76FA3E8DC7ADA29D2E32D773F9A9BFA8D53CF280247E51FFEB39D8F30C214B343A387BD64F1FA87541F6B6ED565266C207E9EE0672D56891C1C321A0D19858D1A26DD7DBF783FABF3A8C20ED1015 +sk = 92D7F219CA4D00DB42C9AB761DF9970AB2C2AF76FA3E8DC7ADA29D2E32D773F9A9BFA8D53CF280247E51FFEB39D8F30C214B343A387BD64F1FA87541F6B6ED565266C207E9EE0672D56891C1C321A0D19858D1A26DD7DBF783FABF3A8C20ED101503405AFDEBDAC1CD023E5B6DCF13C3DC2522AD66ABC1F37C5201000000000000000000000000000000000000000000003821AF9ADE7BCD64DBDB81B9C8333167874A4746F4EE5D976EFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85D84AAC1377426EDE816859D5DD53687808A5B9BEBDACB7E8FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001A1EFA4CD120AD09B4FE0D5C0B04882DBCA66878C4FB8D7C8BA33FD68B7B1941977D336B74229952ABD7D950A499AF00F55AA74551DE2FB2F0B5527BD4466E0C175376DD2AACD8D4AC736D245966990EC6E2CAB4AABC724A106CBFC968716900F51664293DCF53AFEC239FAEA2E0554BFFA747DB718B17430BD739036BBC03765140A56A35FD66E547B40F94C45D5300C7C1356794897BEBBE56C62A3C65FDBC4AD3CC6CC9DE81C4FDA0FDDFB7A4FCED9ECCD6C912D338872CF42DE926E41E00 +smlen = 290 +sm = 2F467E3147AB46603FBD1B6D68C127AFABA0C7BA7C0E18B4E346D97D4B4447F44F9A628F30406C3BB1EE0E9F2E20A7222671ABE5A235F034DBDC1E6F3CD713244BC9E89C62F42A385C14CCD154BB8A4CCBC4171278356B86BA09922152C7BF290002E5596944226870DF7CD61D03524B4627C6FEDCB1972744C602B42537F4F5547B5C193767C3454C26C4FED3D36B259760E40130FD3F0DC49D7E21E1FBF4DC676920D5FF9E280919CE345E010C7EC81211B3956A64DABFB139E2373B93004885EFDE20780336DB2295D8B5B8394958127E14AAF887CAC09F7EFFA35F000404225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1AB2568209E46DBA961869C6F83983B17DCD49 + +count = 2 +seed = BFF58FDA9DB4C2D8BD02E4647868D4A2FA12500A65CA4C9F918B505707FA775951018D9149C97D443EA16B07DD68435B +mlen = 99 +msg = 2B8C4B0F29363EAEE469A7E33524538AA066AE98980EAA19D1F10593203DA2143B9E9E1973F7FF0E6C6AAA3C0B900E50D003412EFE96DEECE3046D8C46BC7709228789775ABDF56AED6416C90033780CB7A4984815DA1B14660DCF34AA34BF82CEBBCF +pk = EB728CE5E8A421F40BFE8880ECAB2A240EE04F7A225E59B71C4F7FD7A454958E3B0BD76B85F77FF8105B9AF50C4C0D19DA1DA62884F73F7F594DC20F645EBD98EE6DFDB697E78725C1BD9DB18B1CFE3800390F5D36E0DAEB99B294695C23202B08 +sk = EB728CE5E8A421F40BFE8880ECAB2A240EE04F7A225E59B71C4F7FD7A454958E3B0BD76B85F77FF8105B9AF50C4C0D19DA1DA62884F73F7F594DC20F645EBD98EE6DFDB697E78725C1BD9DB18B1CFE3800390F5D36E0DAEB99B294695C23202B08E5D2F1C0C7E4CA300855E18253F1BF1D74795592D535296C1A07000000000000000000000000000000000000000000002894D4595C2EDC5A0B8A99A23774C2ADC369530D651A626AB4F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1D69C0B415F7C67B4C8C9EA057C62E8170F4D0A5E697183C2F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032C47FF370C8C586AF8AA849E646DAF48A62910F1D55D733F9AF821B4BED97687188EBB1D357DA5481FF4299FFCA4A00E72559B20DB9281A619D75954B911C6B744A7096FEA4F8939B1539AD3C9B788666FFD5EEE1C2492F16ED4B1B2F34CB00555E763D8BE9A67F776FBFC318ADA079B71F2361935BFF5A2E45276971976B4A48C85FBBE5911D80540326E613A7C2007DF33DA935E71A797D66BE74C55005D8826ADDA1AD3C82816AB329E2F26FE554DB2621BD31A5CAEF8F2131DB4E99FD00 +smlen = 323 +sm = DA3AF5395AD7BBB673824E96917EA1C19B670F7D0739B34631CC9DC5EB02F5B1128F8C53AF12527B9CC4E117BCA0AF20172CB6628C16EA99D3E142307A5B7BB739E00ABE6E491ED3CCCF5D7669A096758E42227696193CE199B835A9131AC43C0101B458A1078AF34EEA2AC093FEC66718D06774C5E0020EEE3B00E7E9C2BC0854B1DC524D30043807E4DE36287FBFAB91E611013ECB989371B91F930B454238BB18DAB6294A29A84D3E22BE00E67C853B1B23DB69186B09EF2A85F127C09A08663887A436003A3253BCDBCACC23C3E0C5792261181DB808303B1B4A750006022B8C4B0F29363EAEE469A7E33524538AA066AE98980EAA19D1F10593203DA2143B9E9E1973F7FF0E6C6AAA3C0B900E50D003412EFE96DEECE3046D8C46BC7709228789775ABDF56AED6416C90033780CB7A4984815DA1B14660DCF34AA34BF82CEBBCF + +count = 3 +seed = 58C094D217BC13EDFDBEA57EDBF3A536F8F69FED1D54648CE3D0CCB4847A5C9917C2E2BC4D5F620E937F0D329FCF8A16 +mlen = 132 +msg = 2F7AF5B52A046471EFCD720C9384919BE05A61CDE8E8B01251C5AB885E820FD36ED9FF6FDF45783EC81A86728CBB74B426ADFF96123C08FAC2BC6C58A9C0DD71761292262C65F20DF47751F0831770A6BB7B3760BB7F5EFFFB6E11AC35F353A6F24400B80B287834E92C9CF0D3C949D6DCA31B0B94E0E3312E8BD02174B170C2CA9355FE +pk = 3DDE0BC396AE6A0A09E59118F81DB9DF8D501F98B8227C210E8AAB1BDBB9AD56314DDD76153D409AFB9F2D47D0981231A41758BF4B2BE0F49DA3FD4C5EB7F28A1E9D3F3A04D41DBEB65658D035EEFA1857CF72B06F99ECF62253C4BD72B5712B0D +sk = 3DDE0BC396AE6A0A09E59118F81DB9DF8D501F98B8227C210E8AAB1BDBB9AD56314DDD76153D409AFB9F2D47D0981231A41758BF4B2BE0F49DA3FD4C5EB7F28A1E9D3F3A04D41DBEB65658D035EEFA1857CF72B06F99ECF62253C4BD72B5712B0D593951DBE33DAFB215345C6D6B21E857F95E8D2F70D19BCBA004000000000000000000000000000000000000000000009A207CE5C0EF8032B9128969F3C0C906758DA55D03755637C5FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B0A1BE43DEEC9962F66BB1BBB102D8A536BE1984B6BB9528FFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000855CE1B5588C36F2848A51652AB2578B48492F80FFB18396661E65D053FF6A63FA81E5F3F56B868FA3512ADCF5E115007735526D362348146F148B1D761E8B5D3F19284E5F1B0BC73E881EFEC75E225FBF39822A94F9B96363BD67470BB80D0002BF74B276618CD140923AF83C308EE0DBB6CC3CA2829E24D96AC6C85DA4392932104EA0AD34A9F7E20C7642EAE12400B5B8C70B87707929DF3636F016CD73DBD0DC6A0067694E408D5419391117D871FEEC0FE1956BFDA9807C85E31EF6E100 +smlen = 356 +sm = 9697443B688A2D4D782AAABA7574215F7B002F56961F186FE600FAB7F10B4FCB1F43BCF1A1FA42DD9492B6CB58B6B80D3C8EACD42EB7C93FCB7D87396BBAD6D20D1010DC0B48F38C5D5AADA5972ABDDAE893373C9276E2904F51F2C43CD6C01F00022DFE0E85BF0A0D092CCD56A76EA925B9156813B20413F0E3015BBFF0DBC971BC89E980E2D46C6DB622F104711C8D4D86C7009812991C904A55542A761E2EFFB3297F9CD6B31E80942F270174E631F8F13C597CED157E9764B0FC066FD0071A5C58DB4101A2B173FEECD5EB599A5015129900EEDCA285AD5DFD987000170D2F7AF5B52A046471EFCD720C9384919BE05A61CDE8E8B01251C5AB885E820FD36ED9FF6FDF45783EC81A86728CBB74B426ADFF96123C08FAC2BC6C58A9C0DD71761292262C65F20DF47751F0831770A6BB7B3760BB7F5EFFFB6E11AC35F353A6F24400B80B287834E92C9CF0D3C949D6DCA31B0B94E0E3312E8BD02174B170C2CA9355FE + +count = 4 +seed = F1902A7815F37BC7F5802D8CBCE5B48D82EB85691718062BFB84D8C06AA41D6E9039B0A107245DAFA4EC109A57332914 +mlen = 165 +msg = 1CDF0AE1124780A8FF00318F779A3B86B3504D059CA7AB3FE4D6EAE9FD46428D1DABB704C0735A8FE8708F409741017B723D9A304E54FDC5789A7B0748C2464B7308AC9665115644C569AE253D5205751342574C03346DDDC1950A6273546616B96D0C5ECE0A044AF0EDEFBE445F9AE37DA5AFB8D22A56D9FD1801425A0A276F48431D7AF039521E549551481391FE5F4EBFB7644D9F9782D83A95137E84EA3AEB3C2F8099 +pk = F5E50CB53363976CEB633E49C7EFAB26AD1BAB13E2B678AADE4F20692C9D37075E3CD3ED463949811257AB4DD36BEB3DA475DAC1D2BD235DBF8253719600B769B7B0C54F7FCDDE8C7218F082CF5430F9E782629973E4BA480A2291D62913110208 +sk = F5E50CB53363976CEB633E49C7EFAB26AD1BAB13E2B678AADE4F20692C9D37075E3CD3ED463949811257AB4DD36BEB3DA475DAC1D2BD235DBF8253719600B769B7B0C54F7FCDDE8C7218F082CF5430F9E782629973E4BA480A2291D629131102083F0905C9CDAD1120E1C372B508B7523E0F16C416E2E29377F1020000000000000000000000000000000000000000000008D99B1F4D108E0363C02CBC6CA8B7DE3BFD21CC683C0712D4FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA82AEF5478586D85E58BCC0DCD6D454E8467CF6BD1C01E75FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AF7D57356E67C52A3E85C335FD937487B4EB1F5D37DFBA3358264C03E0624CFED4BE82067237D3DD9B68D38F71D09C00AA3F015B7432141989A60ED5621610C25851E48CA3D17A37435703C0691E19E2C1EF02E81BDBBF1AC03325540327660082780823F679D20C309A84B8254D69CFBA2BE3CF09EAE4FBCAD7F5C4F3829F4C826D05BFF695398DC9BF29287BD905009BED949AD66E44694C66A79A234CA9568196B918960EA0F13116BC4E7619074226AF5531DBBB81A657DC68387069D000 +smlen = 389 +sm = 6285D7BF636914656AC4E9CCB92B0AF197C87F97B29E92AC08030970B13C86BBDAEF9FE677B22B3072768ECC99D2490232CE57E3C229DDE967E241DD53D6F69DBF0C3AEEF510A75C46F95ACCDD2715BC61FBB40905B9F99D1C8ABC65B085FB010000BAACA3F9E8B4829AF53D2BD47E62F16FECB2838F1E2639E2038B25DE72576ACC19BC4A78B255B217E551DC1E344F6DD16802BD2D74E37DFC542FFA658EF4193E6C1778351BFE1C2DCCE000B31DA58478BD4DEE10E99C430C66FAF1A6C834418289BE3601377D94BB978B30E85EF6F2F88FB9B2932B2F389A686FFD000D1D1CDF0AE1124780A8FF00318F779A3B86B3504D059CA7AB3FE4D6EAE9FD46428D1DABB704C0735A8FE8708F409741017B723D9A304E54FDC5789A7B0748C2464B7308AC9665115644C569AE253D5205751342574C03346DDDC1950A6273546616B96D0C5ECE0A044AF0EDEFBE445F9AE37DA5AFB8D22A56D9FD1801425A0A276F48431D7AF039521E549551481391FE5F4EBFB7644D9F9782D83A95137E84EA3AEB3C2F8099 + +count = 5 +seed = 75224ECC026C18159FF92256844D0ADF953F0A4DD8D74D4EBF1DC5EE8F5630B011A447FD4DC34A2404D620CA0E1F273E +mlen = 198 +msg = DBE5B6C299B44F8D60FA972A336DF789EF4534EC9BA90DF92AD401D1907951EB6285EDA8F134277AB0A1145001C34E392187122506AA2DBB8617D7943A129EB5C07DF133D7CCDE94A7CB7F1795C62493ED375353D1F044257DA799F7D112C174FBC35687E2F87FEFBE2D83D29D7314B30A749FE41B1B81095638F112BC4563420AF235280E466FFBE7050C4937C60FC18D1A6025BCBD489F0C538E088E906ABE8597E2C8EBB64F01D225C847AAE4B77BAE6EBA9269962C4B94A9732CEAA2CB4093D442FFBCDD +pk = 60F8C71D573B7A2B851EFD256AD59C44A5C19A3D80B5120DF106BAA913D40FFE015F81343C047393E67CAAA9EE2D292EA5EEDB63D8A496B624656750243C281592E8C00DAE0DC5922D53572FEA9CAF477AF7DF768BC58DEDDA173ADEC4BE4A1C04 +sk = 60F8C71D573B7A2B851EFD256AD59C44A5C19A3D80B5120DF106BAA913D40FFE015F81343C047393E67CAAA9EE2D292EA5EEDB63D8A496B624656750243C281592E8C00DAE0DC5922D53572FEA9CAF477AF7DF768BC58DEDDA173ADEC4BE4A1C043741FB3FCFDD90F6BF97EE2CA065365C9600A5C7A1F7F15D6F080000000000000000000000000000000000000000000002A8776A26EDEB064A1C3A0007BB791C83E2FE5132F9A1A17AF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD522CA4541B67A15CCD0BB0B3C59875AB845D7B0185AD5398BF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000859B2F7F029406BAB47706ED873FFF44A89EB2098D522D5499A8C400A60CAAA0E89733400297FDA1A22BB05DF3C984002B9A400FFB2A9EB48D3F7D6D5BDC5BBAB51271DDC2A070B5F6B17E9497DD79B6DD83BB169D80F16F54DCA4C4930FCD001CF01749C96DCF0803666B3302B3A686B55DA5CBDEBD99574D2169ED2837CBF2E5147C42A3043A08D2892FFF2466E90075FCE1FD93591C59FF7C55983FE6F5D73527AE3CD051330F16F6FEFE7F4C8CDD921E740C1EDA104A9532531090B5DB00 +smlen = 422 +sm = CDD1E86D4BDF2A004D3A43186691BCFEBD1D7518E6AF0B8A7EC1C699B612B6B0D9E7F715D2E8172D9827EA584BA76335FF89D4F0FB12D321915B5EFCA3EB52F89B0F48EBE8D962ECEE3FA1A78A089CC9B48E50EAEFA1230A71F10D5DF075EB3E0100DBBD656DEC7760B7D680FD0B9A5E11F5F85CEF90248AAECD00C97F47EDC6156DC6F70881D51AB154CF91D3D51E223C37EB01F27B59AE0D426D4D625412A82D5E39BF875F287BEBD14716002989E8CD0B79506380A95734433FECEFCC516CE14F50AC9901AA3EF8A6C414ED33A75AB7CA16BDDE2AF23FAA06FFF0BE00020DDBE5B6C299B44F8D60FA972A336DF789EF4534EC9BA90DF92AD401D1907951EB6285EDA8F134277AB0A1145001C34E392187122506AA2DBB8617D7943A129EB5C07DF133D7CCDE94A7CB7F1795C62493ED375353D1F044257DA799F7D112C174FBC35687E2F87FEFBE2D83D29D7314B30A749FE41B1B81095638F112BC4563420AF235280E466FFBE7050C4937C60FC18D1A6025BCBD489F0C538E088E906ABE8597E2C8EBB64F01D225C847AAE4B77BAE6EBA9269962C4B94A9732CEAA2CB4093D442FFBCDD + +count = 6 +seed = 447F03C8CD27EDAA1FA0436DA492812F57AC946479A9F1F90EC4F5E913A05F8AB0DD7645026A96510F6D40AF05D85B07 +mlen = 231 +msg = 0073BEE97FC97C0FBC750D474AEB93189F061E1A5CF6600C04FB0464338EC7E85252F94FCBC7B2BD00E438480D9AF3ADD92A92E3E2E8ACB55077C3278FC7503988A76E9B6062996B20889AA55B343D5A003C8A8852D738F955799FA3426BE5CCD3AA6B6EDA04D4884941FFC0B69C5ACF12B347A74D0580CC3335BA816200F87674A4C1D98097C70F2F27C74E94A661850610ECF4847AB5B58344F958C5719E06BA396225BBE21ACB0FDC512B885D391E11B0C0ED5CE6B5DD8FAFF91F50025C69D43072F7706D80D9FD786E1104125D79A5F4B5FD838815D44FC8B1AB678078CC174DDE970D448B +pk = 562A17430AB81314909FF4BD52EE1553AB33D18C23EACE1B7A72D394C4A3CAA28CB8AAC90AF8919EE4BA093BED85F808F7DB46E28C274AEBB27B6291F931AFD9FCD88BD56F3C54DAF36A804FAA901AD70E6B53C814CDE4CAF15F859DE058EC2C04 +sk = 562A17430AB81314909FF4BD52EE1553AB33D18C23EACE1B7A72D394C4A3CAA28CB8AAC90AF8919EE4BA093BED85F808F7DB46E28C274AEBB27B6291F931AFD9FCD88BD56F3C54DAF36A804FAA901AD70E6B53C814CDE4CAF15F859DE058EC2C044D1E9FD20EFF42B79DE3049351C0D802D9E1F1F71A32D1BC260600000000000000000000000000000000000000000000D023A32C57F9BDB7AF3CB95DE8D64C09EE9E82415048B2A780F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81768876B9AD6F3CF2E839E9ED4EA5A61DD6F554A25FBC906DFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000071E1EEAB98B1111DF64EC38D0B09AF8777916ADD47A1440E369EEE491318F27091AAC0E74B712ED82E7A494E9ED826002E10CCB70D5736349B2152EEA0AE22BEA506FCF77D076531E27B89FC9D70E3D51ED1CE1041C6A5D7D2EB0D31CD5BB6006427C5C26FD1EFEFC20D0D21762D54BA504ABBAD65D2FFA1D23C1030531C8FCD47FCB88E1B1F9969AC60C9431D77E10043907288A82410C0A3C87127D0DE72587BFB4C275EFC5696EE2A0AA5606B20ACFA45300F97600B54D9E9D133A09DC400 +smlen = 455 +sm = 524BF9849425B34C2A497F84E029D15B48EFCEAD80ECA9C921D0A79FE7980B5261EC41A1B40BFD13917324A744549211834C6857472A1DE068B8D2088C046767581B75A84EBCFEF97EC1AEE63D1A5385F469F7986A92F4BEE37FA90B80880D2A00008D77E48E69FFAA9D8E9AF2A0A71CA064F98F39C883D4FB56025F1DCB3A37079973EC274F077814C051150DCB5B5D643456002D0F3D8B8D816EFA6AEEF852715B9F86145EC17B3CC0C2FD0250AB7A775EA01EF9C20082548EDD5A3EEB4A636D2A581AF903F8D0632FDA84AF1D31F0D53789695E171F910F67CDDEFC000A0D0073BEE97FC97C0FBC750D474AEB93189F061E1A5CF6600C04FB0464338EC7E85252F94FCBC7B2BD00E438480D9AF3ADD92A92E3E2E8ACB55077C3278FC7503988A76E9B6062996B20889AA55B343D5A003C8A8852D738F955799FA3426BE5CCD3AA6B6EDA04D4884941FFC0B69C5ACF12B347A74D0580CC3335BA816200F87674A4C1D98097C70F2F27C74E94A661850610ECF4847AB5B58344F958C5719E06BA396225BBE21ACB0FDC512B885D391E11B0C0ED5CE6B5DD8FAFF91F50025C69D43072F7706D80D9FD786E1104125D79A5F4B5FD838815D44FC8B1AB678078CC174DDE970D448B + +count = 7 +seed = 8C151C556DA912A82DEB32144C8A8C9090CFAF5C12AB822AC3C72618837A41C2453B715EEFF3724CAFE69B1ADCAE9DDA +mlen = 264 +msg = A1586245D81F96BD8EE81AA30F10C0ADB343D74CF72C4DFF71550C12873AF89FA1874D4731C996243C3749AF3F6188FFE9FA45430549045134EB29EF3CEC37E72904AA082B1C6161E6B52361E49AF4933A8D8C0734F21CAFD7467B0C02876F43211D6122E3E735FE36064DF7A0C91449237C2BC7C3A78AC7BB0F9567F2576F05802C872ADF183A87AA3B8217188F2F3535F877724F35B29E545DE4BCF258F13BBC7EDD8C6587F733C9691F74B4151CF8C060C3AE9E8D49FE7C77BF477DC9F23FD0F0B67320275529034B84F94176730923C03AA50F9584D9C2D60B8DCCF85A13F243F30A51ABEFBBF2CDA602BF3D75E849EB92422B808416C7E56B046CE38E4677AD24D23D7237A9 +pk = 3EC6D2041D9DD9774298B6BAD696D2A8C6D5C21CF17928AE4E851D864DE11A0055EDF7215C419BB3419F4995C1A5683F0EFBB0BFD1CE620F59A5AD6BEA24EDAA8ED5A87A61FFF84E810DFA75CEE37C5BFDF658FAC1D50C0FAF10CC2785C52D0C04 +sk = 3EC6D2041D9DD9774298B6BAD696D2A8C6D5C21CF17928AE4E851D864DE11A0055EDF7215C419BB3419F4995C1A5683F0EFBB0BFD1CE620F59A5AD6BEA24EDAA8ED5A87A61FFF84E810DFA75CEE37C5BFDF658FAC1D50C0FAF10CC2785C52D0C04B17A4B80209E640E28BA35E171D33371971647327B5E9B87500400000000000000000000000000000000000000000000FCEC42091E9B3391B9EB431BF0F30800952379AA1A76180E30FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9448595BA87A5CA8626FB1D079C383458444B62C6256B6A0FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F39A0F8167745D0756E01674749AD83C2E0169806337280D245906F00335D8CE444AB89F599B4C10ED0BF8CE80441500EA05D41572749FC9E56A70684467619EBBEF021241C1FA6BEA0A6B9EA8CBEE08C26524F3A56BCF2AD1AE98BF1791CB00C2C28E37E0C5EF91B3FE12528E23BD4EA2019D00D01C9878DCD8AFFAFF79A90D096487DCBF31842FC9CA702961F842000B5E56BD6A304C45A5078A46D1027B36ACB57510F5BE1493142C06CF191446E1965B5B009FF80AB8F45A4F42FF390B00 +smlen = 488 +sm = ADC712A3D5BF350E13AEA655B9BF01D92472478B404A6F6071DDFA39CA584497C71E66F6C0F1AEEEA987E528E8BFAE31A413C5CBF98609A7BA3DFA199592D65D9517B50B12DFE71D72B1F4EEE7E6D2E54A4F3F0B0603C892F1D3132DEC2F3115000006E7DD9C150E201836B853F93DA71F5BF31E79902CD6C7B503A51D532DC9DE43B574C920A1887390C33F10F5CADB463F17035577BE9935F389AE9BD4DBC27903965CCC9721604DAD0FDE00426E5E365E03D4D1D559FAA7B06EEF679631BADB8770F798034F142E80C0719CD6575CD0A9742CF9F52E7A18C5B3C181000408A1586245D81F96BD8EE81AA30F10C0ADB343D74CF72C4DFF71550C12873AF89FA1874D4731C996243C3749AF3F6188FFE9FA45430549045134EB29EF3CEC37E72904AA082B1C6161E6B52361E49AF4933A8D8C0734F21CAFD7467B0C02876F43211D6122E3E735FE36064DF7A0C91449237C2BC7C3A78AC7BB0F9567F2576F05802C872ADF183A87AA3B8217188F2F3535F877724F35B29E545DE4BCF258F13BBC7EDD8C6587F733C9691F74B4151CF8C060C3AE9E8D49FE7C77BF477DC9F23FD0F0B67320275529034B84F94176730923C03AA50F9584D9C2D60B8DCCF85A13F243F30A51ABEFBBF2CDA602BF3D75E849EB92422B808416C7E56B046CE38E4677AD24D23D7237A9 + +count = 8 +seed = 9B42F41492530EAC81992F17613EFDF155F407D7E67F18AE193EDCE714D65D1031E7AD10839AAB46D0850EAF5997AB4D +mlen = 297 +msg = 9366ED7B3B623C411448B634446F1A3FAABDD163A6CC1E2BCAE4A98703CD8CEE441405892FBA051BE2A586A6950A5EF73A255E5F86B0D7212E0C51C3BC79BE4B88E76ED6F043FEF3204FAF044BFB1ED722D61EB5D0B74C66A257E8AC3A2206273C80D2EC2123A4DBB715D60118D99ED7322E38F1562F82379138DA3DDB8BAA7CE61AB729AFC3748C0134633CF45A9973C05C75D04E82F631845427626B5799DC07DDF830BA01E8BC6236BB6D03B37D949DBB29EEC7DFE60FBC17EA590956D251539792016E2A8B01E70476961BC9ADA43CDA682D0CAA4FCC58810BBA1A673EF8F6BC90BAEE701E8E4F7C04A346CA56C7B2862FF57756CE6CD1EE22D677BCDAA896EAE96F87870E032C18B6C6A0C1A191FAE2ED487CE55296CC4B6339EAC9E8A742BD0A44C3525CC750 +pk = CF617023C07FE87C73F88A258F218CB1C7A661FEF55788EB28CBC2DA0226FFCAB1A6DCEB73011455B9F6F2053227DD4064836DD9B1DD0561D75CB143D683BEABC113114B7714658FC0492806C38D56C365E5ED06B71D4B84A8F269467E0F2B250D +sk = CF617023C07FE87C73F88A258F218CB1C7A661FEF55788EB28CBC2DA0226FFCAB1A6DCEB73011455B9F6F2053227DD4064836DD9B1DD0561D75CB143D683BEABC113114B7714658FC0492806C38D56C365E5ED06B71D4B84A8F269467E0F2B250D9759403F047EB8DED0AEEB4D37F4153302D99916A5C5C1296505000000000000000000000000000000000000000000004833F6C1E2F729CB6DD5642651ECB4DB48C469A86918CB64EAFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35FA6043E915BF2596F12D12867465F09669CD93D3744E8E66F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000290A618A21C97D960DA2602700C41786D14071B7A7BD604F47B1C1E22F773782352E1D791ED80B5181BEDC905CCEF5002725AE2EF285431D78149CDBD658C1017055B797881D305FA1B2F0167F9E9BAB9A953EBDA1A7C9F71B8A89B6DA0A350034DAD23758B359BA839B21B23FA68BCAB82A150F1338E47E68CDADD7BE198453BA1748A84FF61F813ED147AF1907FC00EF158336655F4E83EBE599B84A790535477E698E97B3934535C30C7D6683074BF095D248A3BAF4B31B72BD93D4FD4E00 +smlen = 521 +sm = E10E935CBBC3B7B548B565F207F95DAAA655959A95F630360C17E6D56A61C29101DA728B6893C73D08791BF6AFADC4337BFBC64C52961CBC4CE4AEE971BF66F67940CD1E4D0B9B3EC67919C34D8C7B9E05B9ED89C257AB050C3FB61E60F16B1A010353BBB23066A3B7CB5DA03BB0FCE8E3F7DB8199FDF4BD507600A7068B42246AFB70CA57EB4BFD8740C8D13B7F81CCE089ED01EAC7F688A16490F8FCEE33BA88964A3219C8D394D4D0C46F00DA6729E38B28C4AAD3CE2EA547C859FB92A8ED6298F172CC010C97AE896DB94812A525829B56816ED27A7E7F67F58F1C00170D9366ED7B3B623C411448B634446F1A3FAABDD163A6CC1E2BCAE4A98703CD8CEE441405892FBA051BE2A586A6950A5EF73A255E5F86B0D7212E0C51C3BC79BE4B88E76ED6F043FEF3204FAF044BFB1ED722D61EB5D0B74C66A257E8AC3A2206273C80D2EC2123A4DBB715D60118D99ED7322E38F1562F82379138DA3DDB8BAA7CE61AB729AFC3748C0134633CF45A9973C05C75D04E82F631845427626B5799DC07DDF830BA01E8BC6236BB6D03B37D949DBB29EEC7DFE60FBC17EA590956D251539792016E2A8B01E70476961BC9ADA43CDA682D0CAA4FCC58810BBA1A673EF8F6BC90BAEE701E8E4F7C04A346CA56C7B2862FF57756CE6CD1EE22D677BCDAA896EAE96F87870E032C18B6C6A0C1A191FAE2ED487CE55296CC4B6339EAC9E8A742BD0A44C3525CC750 + +count = 9 +seed = 11134936880F5A11ED3504CF7B273E55A351FCCB10943BBBD186623EE6C7A13A6565C3080D1F536BFDB018F99C4E46CD +mlen = 330 +msg = 0998114C84F84080E7EEBB47D248980FAC9D28F1ABB6DBAB3DD59A5CFD2C7CFF7F308372874DD5447C7B02E30165501C0C673128E4C543A414222BDF47E7F4E8DCA757B0F4A3281C0D10C4F02AB52AAF5B9A715E012607BA310947A60A5F62D6B8CFA96386D27CFA709189202421C078934AA2D955468E550AD4D0D4ACDD98B168A9568E232192E92789830317FBC959087FFFE353B6C168F3EFBE7164444F1D6CBA5246E31658C65440A841DBA78257E78502843EC1A6E9710229C8EEB85D6CDDC7D543285624AA1F756A5DD4F1A5D4FA52DB8C5C34880ED448FBB6D254509FBEEA0FA022F276B6A66BEF7ABFEA6049FF74291BABE781F718683397077B29FA9E2B46BC6B09251E587CC5B182195DD4060CC4A319BFBE251A5B660A739DFE5D0E5B93F3CB7E440194F1C8BDA922CB1A3EE3D27EDFD61C1D31A7F4534E84889EC83B51F1641892766434 +pk = 4B483894AC1A2E7D881FF9D10B3A1D1F1AFE79587DA4032A766A16C4FC127EE80C078C3BEDE4A458256B7BA1D3368F060C01242DE6CF9A0425BB2837EC935A20D2222775180CB523BB3783E45ECC0BD828B43308B6B833F3E045A5CEFDB0AF391D +sk = 4B483894AC1A2E7D881FF9D10B3A1D1F1AFE79587DA4032A766A16C4FC127EE80C078C3BEDE4A458256B7BA1D3368F060C01242DE6CF9A0425BB2837EC935A20D2222775180CB523BB3783E45ECC0BD828B43308B6B833F3E045A5CEFDB0AF391D81C2A487D43715D5672D46CF59DACFC8D9E12AA80BDD9C99B50100000000000000000000000000000000000000000000FE29524F9F54FCBACBE3D4AFA5C90915F33F13DF67B9401F3DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B44F5991BEB4C9E9B7F38E0DC29F2D3881E6A278CECEFCFC5FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005DB7D4A67E3BCCC1B069FB1F8077E2D12C423365CEBF4861AFFD25C2EDF83E53A26A974C3BA6F17687C46F7168B6950066400BB0A1E4DAEA83B6B6729889B61A925E689C15DEF2E01434BB991D1859E2213FAC4622D91F272118B28D632EC200BBCA4DDA5DCA1BAE522FE02AAF30D7588D4129A0348B96620C3AD02E9DBFBEF55A8A009A4FB9C79D08549BA20616310059B34ADDDC3856AC1E065F4A63BE2CF57BD02D2BB8F799D90FD43783E01588744E8DC8D963922D207A3D4B65D7FBDE00 +smlen = 554 +sm = E5A65B71E479CD4FAA8635ABC9CBDE691D2294DCC3CEE1AF86551E9097C92CFA76B19C67DB202C81624203075E7CDE13CD481115E7682D3F4A521CAE66323BA52F5B059B8F5A7782620519329094B2F500B03C9C86AE62F805D98E7CE3288F30020003901776E410CFE760AA7542DA9092AF4E5CE51BA2C277430057659F3282DB6E6EDDD4A63828C4121582CB0EF7F69A176800291B640D60298D558B0AF49DC9ED70CD654871D5A02E576000E08E58F2F58606BC94274922332B5133215E5E098AD9D331008966DB366B3B5044A338DD795282DC2586868D8FCD48CC0004150998114C84F84080E7EEBB47D248980FAC9D28F1ABB6DBAB3DD59A5CFD2C7CFF7F308372874DD5447C7B02E30165501C0C673128E4C543A414222BDF47E7F4E8DCA757B0F4A3281C0D10C4F02AB52AAF5B9A715E012607BA310947A60A5F62D6B8CFA96386D27CFA709189202421C078934AA2D955468E550AD4D0D4ACDD98B168A9568E232192E92789830317FBC959087FFFE353B6C168F3EFBE7164444F1D6CBA5246E31658C65440A841DBA78257E78502843EC1A6E9710229C8EEB85D6CDDC7D543285624AA1F756A5DD4F1A5D4FA52DB8C5C34880ED448FBB6D254509FBEEA0FA022F276B6A66BEF7ABFEA6049FF74291BABE781F718683397077B29FA9E2B46BC6B09251E587CC5B182195DD4060CC4A319BFBE251A5B660A739DFE5D0E5B93F3CB7E440194F1C8BDA922CB1A3EE3D27EDFD61C1D31A7F4534E84889EC83B51F1641892766434 + +count = 10 +seed = 98DDA6B97E89A479D5EE214E660DD6B5D8F6CC638A1CD4F462A0EC545F5B0B0A1A403AADF566F7B1C0C5FFCA29B36FCB +mlen = 363 +msg = 4CCA95CB9F254C2EAA7DCFFEF662EE03320D5FC626A6484304BF62FC20F341FBE26E1537D7BD20E95440F7CC95EE84E1297C807A0BC9006DFCD5C22A5C1FC0865F5D70E5D63AD677FFFDEA52BF85D1A4F159F7ED16A745B4D971B620048B5F518EB2DC672CA35022578059E1ADAD7C07FE910A5D566B8321D9A12F34C250BE35CE964DDDEA23C90EA77C9C1BBE3532FEEFDA3637157786EC7D37775AE5CB0BB92EAB45A0FB1E833E8A6F3D06B85946E31A79B64A02B31FA640ED514A85882C89F693A06354DFDDB0B5E23E7792134C69C1D3908882DF3A7694A05B241B87FB2DBD1A4D9F26943B69F3CDF730301663089D1EBFC23299DA21300F735CEDF7B109F3E0BBE273776E6AAFA7054A6CD9682B967EB7903DE549E9558E62DCF3AC444DD7042FEA362EFB555BB97FB464AD7FAEABA3197C14A6740477DB50CE3FB8B762F48F880381D510FCC836E5880B48F08BD6333202E838AB73F2E106CFBFB218AAB802DA8A00F13F78FFB70C +pk = 1B3736DF3A9172651BBA16390DEC80616C6C505E1602E458381DC5D99771A4A107499EDCB518667A28CF95897BBF7439E30097D21A0C15338820A723284DBD02F2965F05DF07CE4943F2257D5F1C783FC86B9F46C7111CEDAE76F6842112F94002 +sk = 1B3736DF3A9172651BBA16390DEC80616C6C505E1602E458381DC5D99771A4A107499EDCB518667A28CF95897BBF7439E30097D21A0C15338820A723284DBD02F2965F05DF07CE4943F2257D5F1C783FC86B9F46C7111CEDAE76F6842112F9400231679BD44B645E2FBFE27009153B522530C8A3CAFE703413840500000000000000000000000000000000000000000000B07A1A89EB686B9AE7571F5498023A1AD0A5C878C5605A4746FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD87C0470D6783FF1DBE7C3AC64069ADB3B2EEA4E27CDB9624F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003163BEC69FB02E5E9CBF6532EC81C11CFC779F78463D27550DE581CBBE09F3B684C9B1B5B83D4988E9DD9F8CAD3E1300EC5FF3D69432D6B4AB171F7134E68EDB918DA51BF97B5B70EB034F197DE171BEC7A0AE2CEED145912B0F1640E0EA3000CE240E3AB002B4C1FCDB829846D7EFF89373540F12EE35DC4CE0D4862D6A5A310F6CB3064EF20CD297BB6A329D0C9A001D8197074298660C13655B79488444655732712BAEC17D992EF0779DF1A14BB0604D536383B8A62C201797B6E8A55B00 +smlen = 587 +sm = 4EC160AD70DE3447B0BC789FC17A8A1C4B5C979C6EACDCE99714BC462B07717F31263F9B3B2443BCCD1658580DBF440F4661B4C6BE24F8AFAC09660388140FD732D2343747146C8E38E4E7290FF3346339D7B59AA84A0373B5F3D4840BAFF6130001222F3CBB8FF808EE1447B1857FD4B97767FFEA5F4DA7765C03BD21B73704A4B3F699C86756AF0A06A346D63C4E952B00C0031CB506286487E108E3A2CC5C4155E7A4BD820CD5E618E30600C109AD48A29CD246D14E449EC2D93239E98E5C93755FD34203EA5235F1C1A186E0023BD4595B0B4F1789F6926A536B4B0015024CCA95CB9F254C2EAA7DCFFEF662EE03320D5FC626A6484304BF62FC20F341FBE26E1537D7BD20E95440F7CC95EE84E1297C807A0BC9006DFCD5C22A5C1FC0865F5D70E5D63AD677FFFDEA52BF85D1A4F159F7ED16A745B4D971B620048B5F518EB2DC672CA35022578059E1ADAD7C07FE910A5D566B8321D9A12F34C250BE35CE964DDDEA23C90EA77C9C1BBE3532FEEFDA3637157786EC7D37775AE5CB0BB92EAB45A0FB1E833E8A6F3D06B85946E31A79B64A02B31FA640ED514A85882C89F693A06354DFDDB0B5E23E7792134C69C1D3908882DF3A7694A05B241B87FB2DBD1A4D9F26943B69F3CDF730301663089D1EBFC23299DA21300F735CEDF7B109F3E0BBE273776E6AAFA7054A6CD9682B967EB7903DE549E9558E62DCF3AC444DD7042FEA362EFB555BB97FB464AD7FAEABA3197C14A6740477DB50CE3FB8B762F48F880381D510FCC836E5880B48F08BD6333202E838AB73F2E106CFBFB218AAB802DA8A00F13F78FFB70C + +count = 11 +seed = D34A0AAD27ECAD31A5E08E9A2D7901A9B85F864D9B1B46F40CDCA0B3615B2CBA04EF82AD7BD8CF627C3E861477030BE2 +mlen = 396 +msg = 5C4B2E1A344DA1418B0F4BE3FD99505FC30F2A1E5B696E943BEE2451D7B268F722E04F8E00FDD9E1A470F8C977A6D45A5F621B8815E352FA14F64977D1FA08082A48AF495719EA6AC1C0B3D898603B4CF7EC88E68DD7190884382896D953D612CC21ABECFB01A04A1BB1BBE8986D34625756396CCD84BD1A6B5454DDA98824CD4844D98F356AB485EEB19F9196ABB1C3088C0C3C5846C88760B696D91A232D6F4CFFC85BFF33DE1A3433A27A209A461FCF37F2289F98BEA7CCF183DB1FC42A7EDF958E7913F8711DC375E43F09BE7C7A2C2B1318AE2A9CF5988FBC2CE0735A2CD9FB6C8496C34406C538C01BD494193240BFF947FED47B7CCE99A1747973F1FAA5223AC564BBA0CA8973D1310B5BFA1452CACE9110BC22A8D4080A8BAAA8ADFA3CFB6685679B648484E3A43F9B1B2531949BBB8FAE1846F6D45D9272FC2CAA2913B5D9F8D322E9B18A685122D74634C60730C101578BEF2480711FEFFE02123E76D6C846559E2EA99A98923EF095630102A5573EF027E0AB6E52555A9EDE0D15A73C8B2FEF87CA6FD9F903F0 +pk = 02A032C541158135EA66ADFBD2286C79E63674993AB9FA2E0FB81BECB3F1B79B05E730BD049209B4282F0DA484C63321ACEEC53559191F45DB70FE5DFA6D055EFF2B2E562E817D41D974A22D85CFA3802A14A21C4B8BBDA9F0F006CC6E559F1904 +sk = 02A032C541158135EA66ADFBD2286C79E63674993AB9FA2E0FB81BECB3F1B79B05E730BD049209B4282F0DA484C63321ACEEC53559191F45DB70FE5DFA6D055EFF2B2E562E817D41D974A22D85CFA3802A14A21C4B8BBDA9F0F006CC6E559F1904BB756D564364CAF76BCE52DFBD9AE468FAEB997A69C0C9783D04000000000000000000000000000000000000000000001A3FD6E90728288AA6F6BECA8680A6783DFDDA2D2465F7E381F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF916D415734A6792738DA82C7F8710262D044F1405BE2F61271FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073D3CA88818E1C236D6417582B6823A6E9D9A251D43B0693B0AE399F90E43574A80A648C3D6043461DD233FF0A200D004F57050C6F1A25F49218E021407A3EA08B8BFD8800332EE2F71887CD308C696F3AC3BA673C242234B7EC47C998E997007F5F508AEF7B6E07D9A3CF421E1D5009F32B7947EC3A87780E4F66AFD9C403E5242DD1B7562F6A145636F7C4E099B400FA58A168213E7C46EEB27D78DCE2C70DE1C811B15BC126A5DDC05F0B46E5E9DEF29521F5DBB8288E7185B08FB74C1100 +smlen = 620 +sm = C44125C56DC631BF6155F1AAD007B5FAC2CCD21A46F87A18AC258613194202FCEB9FC5CEBFE3A38FCAB87CB0970FFF0F4F2541B13EF7517D42FAD3E330318F1DB2F677D4FF78AA14789EC2E6ABCDC149185F083E73833C19266467088955522100004D3F8C89AB17D97B8FCA7E148A7B1F988D684FB52FF115BB037C9DD44A3116B13A23FACA914070B3BB9F39D81ED824608F03D8913309446AD6DD89CFE6065F9B8E4B1C03030B652BB32A030505FAF275F0CB3391B03DD0D2C54740E30075A239E307440137449B558EAF919BDED83440B6130D18F41E5FF554CD510015085C4B2E1A344DA1418B0F4BE3FD99505FC30F2A1E5B696E943BEE2451D7B268F722E04F8E00FDD9E1A470F8C977A6D45A5F621B8815E352FA14F64977D1FA08082A48AF495719EA6AC1C0B3D898603B4CF7EC88E68DD7190884382896D953D612CC21ABECFB01A04A1BB1BBE8986D34625756396CCD84BD1A6B5454DDA98824CD4844D98F356AB485EEB19F9196ABB1C3088C0C3C5846C88760B696D91A232D6F4CFFC85BFF33DE1A3433A27A209A461FCF37F2289F98BEA7CCF183DB1FC42A7EDF958E7913F8711DC375E43F09BE7C7A2C2B1318AE2A9CF5988FBC2CE0735A2CD9FB6C8496C34406C538C01BD494193240BFF947FED47B7CCE99A1747973F1FAA5223AC564BBA0CA8973D1310B5BFA1452CACE9110BC22A8D4080A8BAAA8ADFA3CFB6685679B648484E3A43F9B1B2531949BBB8FAE1846F6D45D9272FC2CAA2913B5D9F8D322E9B18A685122D74634C60730C101578BEF2480711FEFFE02123E76D6C846559E2EA99A98923EF095630102A5573EF027E0AB6E52555A9EDE0D15A73C8B2FEF87CA6FD9F903F0 + +count = 12 +seed = 4FDA9FB6929E3F391901D69FA0AA2F25A9657D249A620F1B9E305A5965676BA76794CAD3355EB632579C3958CA7D443D +mlen = 429 +msg = 49755A7B1A7CDC5C9BDF5149968061D3C95EE67BFBAF02750C45094303A9D9CD23A08F19B9C768ADC63FFD1527186D09CA4E0356BB882E263BF015CBE3716C05B31A69DDDB790BA82C341AC9B6BE68A81B8BEF8D882304BAF0020D761A0DB04412033DC369961A5213B04E81736A580F1162780599CC029E262D67F31B2773AFB457A1ADAAA292163144F17DE384234F3303111FCD89BCB30333C6C6486F775ED099043C34E6C86450B650F1A02D03781B1D20691B767D166DADF1DCC4D8604D976EFDC9168373A7316DDA9B9FB02A4A321218D9F54E287B7167A08BC0153843BD6355AEA1310824DD5D5EC458BE694AF176119D9E588A29C650FF5500293659EA478B39A62149F819CDB7E7CB32E1D7B1284F159E2AB1B1EA41AF4D0AC94FF3111FC1CCD818F9B2CC7A259701405FDF6A51D2D3EF62789297BD16A659F14968EF902C4A23DA409BF13A4913467B5C991854B2CA6CC006D3F4197A6AA58BD5DD95C36928DA9583332C3FB134FA3890FE7E299F1C17205366C4F4230724C43E4803912E72B816658BBB1B63780865A1F66A2A49B96E93711B1BE97B827D12173402828B1A065B94310D5BD6098D +pk = E4237C37CA4D0E861F896779FF38F5813ECE17672ADBA120327737771E4A20AE93725789E3705F5F02AE1211CC05511D36E90A8F8A13697AAC566E7BA63258DFFA395E8A1A77A2999F675DF2F077DC50B1DAA5269ECBF2DFBD1E9BF2493CE70A0C +sk = E4237C37CA4D0E861F896779FF38F5813ECE17672ADBA120327737771E4A20AE93725789E3705F5F02AE1211CC05511D36E90A8F8A13697AAC566E7BA63258DFFA395E8A1A77A2999F675DF2F077DC50B1DAA5269ECBF2DFBD1E9BF2493CE70A0C1746A719BF5FF8CD8558D7D6A53435CC130FDAD74C9B35AA9A0300000000000000000000000000000000000000000000F6D37CDC93D8A0B6A0D8968B7609E86B63B2F5D12564B493D2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5754A672019169699639ED8CB5C3EBA59E6A3D98CFD0CB7A15FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070FFC3FF83BBCCE62F38C922F9BCC3B39D24988B48A381AEF4CCFFBB31E91F7CFD1D1D4C4D460EA948282D7810E89E00C30C99530C0A3326BBBC373E10B93641C8181AB06816D2BEA5BE7B18392B4AE6BCAA2DD80CFA16A454F8655F0619F6003DA7009CCCC84710F611BCAAF29C868922DC8907ADEAAC85A7EE9A288A1F00C77634AC01A3DBFCC422063A7AC2B21700A11F6D2D529BF27454DF3D54AB5B70278BE5290EADD556A28DD4F72047B993EA15805E68777FB031F28DD00C97161B00 +smlen = 653 +sm = 057853C2DAC8A28B149DF69C10A86F0649F0FA929B1EB9364FAAA0857DFC63233A8B606FFD9B0F1DF635950D9727C417552B6888E26CA8381EFBD5E1DBAA5E34F9327B4006F02C9CC35A2B61973A93A2C98343531A0596284C095642DA99922E00003A953792FC90018C951B96A8F84AB399FC8976E466BD79C5012BBF345FC28DAC9488CE523FA90C31678F65757D79872BE4033BDA9131CC263CFE1A0F532DFF1C196B8BB4F7BC8DC8392602E5AC74F7EFDEDA850DDB0676406F87D27D0C5118EABBCED8039A9C601C4484978721FF02877CAF28A3935106E7A2F29E001D0D49755A7B1A7CDC5C9BDF5149968061D3C95EE67BFBAF02750C45094303A9D9CD23A08F19B9C768ADC63FFD1527186D09CA4E0356BB882E263BF015CBE3716C05B31A69DDDB790BA82C341AC9B6BE68A81B8BEF8D882304BAF0020D761A0DB04412033DC369961A5213B04E81736A580F1162780599CC029E262D67F31B2773AFB457A1ADAAA292163144F17DE384234F3303111FCD89BCB30333C6C6486F775ED099043C34E6C86450B650F1A02D03781B1D20691B767D166DADF1DCC4D8604D976EFDC9168373A7316DDA9B9FB02A4A321218D9F54E287B7167A08BC0153843BD6355AEA1310824DD5D5EC458BE694AF176119D9E588A29C650FF5500293659EA478B39A62149F819CDB7E7CB32E1D7B1284F159E2AB1B1EA41AF4D0AC94FF3111FC1CCD818F9B2CC7A259701405FDF6A51D2D3EF62789297BD16A659F14968EF902C4A23DA409BF13A4913467B5C991854B2CA6CC006D3F4197A6AA58BD5DD95C36928DA9583332C3FB134FA3890FE7E299F1C17205366C4F4230724C43E4803912E72B816658BBB1B63780865A1F66A2A49B96E93711B1BE97B827D12173402828B1A065B94310D5BD6098D + +count = 13 +seed = B0E6A23FAB10A7A333E3720BE00D31507917F39C5EFE1C98CA18BEB5C3101FB4479B478A1558C4C00398C55C9822FC44 +mlen = 462 +msg = 439529DF1864297E33956AFEE00A60099B658A67830A6A6ABDDC329E87831D9F9B647917FEDF1AE182A40402143285516FCAB83F447354C72FAE81AC26E7005C2AA561763C152E66BD80F14565F47DEFA440DBB491E7994AB9FE35995D5FBB3800CA030B43DF611141637A5246AB9D9CAC02EFE14AF60736B6BDB2BABB97CF21E831E5D04D41C00F090B154977900EFADD3A9313389A3F84CB3AC38E8B57B70A43DD08A8243F8154013FD5CF29DE5A8DF0B197C12B17E0610FCFE3625CC94067E01E23D23A243AD1C1F805CC50E1447D1DF93C25B8D76396BB7199E64129522462C5FC8B30C132D4EE9E0BF6F52961FCE7ECF650647E7064AA5A6574649A323E144D7C5491DE4C0A1A76D08F93F87A2FC7F6955FEF86991E62E2CB42908E83B0C0A8BC180B7453CED293F1E20F300431EC1D395E8A537F0BC36A673D491F14381DEA90D8F176D06031B0A7AFB40EA8F76D37FA82E2572B9799A5FC7CF4C49BC20AD78EFA8CD989A84D72ED680AC3C0F64155C56ACBFD7C7D628B418A489F961357F77BD62204ADB079DD3106485A37FEE535C9CF82E832D8AADCBF686976B806B02AE733DB46DB0BF162E973931C3E338CC86DB38C66262D1B2EBC7691B8281E0B20BF36305FBA996D20ECFDC695 +pk = 5C9DE8B722494787F7E689176A52C77248B0AB8580AFBCA92A81771337C05FB5F6003DC55D184000F815097D98EF6E0ABE8A60497FE21D3939B3B5D8792BB9B9CCEB28FFCB95878A10AFC4DBDED0634B2AAC9C71D58240C3A745B5E57FB9FA3917 +sk = 5C9DE8B722494787F7E689176A52C77248B0AB8580AFBCA92A81771337C05FB5F6003DC55D184000F815097D98EF6E0ABE8A60497FE21D3939B3B5D8792BB9B9CCEB28FFCB95878A10AFC4DBDED0634B2AAC9C71D58240C3A745B5E57FB9FA39171149B3CDDA03182F9B82E6C5B41440F5BC0454BA28E4654E400B000000000000000000000000000000000000000000001C33AA3CC71B4E2DD8B3DC282D5BF78DDD7B5FA69373F40C79EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF515A6EAF90710B02044E3DAAA062CC24E6462361CE580F600FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F72BDD1E39819FE21B4C9A60AADD5A9C48463823A6D5657834EE661027DAD9215E95B66ED9CB27737C81991FC77B200037C8C8DB4CFE902D3DEDC2B69132D7F88EC41A7E725DCD62B5147BAA968BE21D079F53782FF44F5BF70A6265D777DE0095AF40A03AA9C875E86BB0220659EA85C52304304DA3C830C5E8B62BC11B4484811A121644DFAD56C3A72F9D5DC32000B0F8ED4A203FBC7AA1C9A59F76F30C17F70A31A24B9268365F97E24A982F0DA331C25FC3A80B22B71E17A98D428B3C00 +smlen = 686 +sm = 7F97BAEA5A72F853D48626D3FCC3FB0E83ED1F1F5B8C9B62F3244C9960EDE5CB8E128690357ABAA025A874C0A81BB20C015FD96F22B3F430EC1B822016E8DB4D192B746050EBE3CB6DA10882C72C7B6049311AD06DEE493CEB5FEB49AD6661220001EAC3EDB0EE4A2F777B4AB542890D6913B2FE89E3DE63C338032117F3EB9BAC500ACFA64CF98D062C8542DC4E19534E2EF701DE9E0917242416BE29D3EA32BA73654DC4376C043EBA95C603B2769098218FCB704EAA84F10FCBC8E8892404FF0CF6E789037A3271BCB0829D221E9723F9FAECCD5FE05B3676156B84000215439529DF1864297E33956AFEE00A60099B658A67830A6A6ABDDC329E87831D9F9B647917FEDF1AE182A40402143285516FCAB83F447354C72FAE81AC26E7005C2AA561763C152E66BD80F14565F47DEFA440DBB491E7994AB9FE35995D5FBB3800CA030B43DF611141637A5246AB9D9CAC02EFE14AF60736B6BDB2BABB97CF21E831E5D04D41C00F090B154977900EFADD3A9313389A3F84CB3AC38E8B57B70A43DD08A8243F8154013FD5CF29DE5A8DF0B197C12B17E0610FCFE3625CC94067E01E23D23A243AD1C1F805CC50E1447D1DF93C25B8D76396BB7199E64129522462C5FC8B30C132D4EE9E0BF6F52961FCE7ECF650647E7064AA5A6574649A323E144D7C5491DE4C0A1A76D08F93F87A2FC7F6955FEF86991E62E2CB42908E83B0C0A8BC180B7453CED293F1E20F300431EC1D395E8A537F0BC36A673D491F14381DEA90D8F176D06031B0A7AFB40EA8F76D37FA82E2572B9799A5FC7CF4C49BC20AD78EFA8CD989A84D72ED680AC3C0F64155C56ACBFD7C7D628B418A489F961357F77BD62204ADB079DD3106485A37FEE535C9CF82E832D8AADCBF686976B806B02AE733DB46DB0BF162E973931C3E338CC86DB38C66262D1B2EBC7691B8281E0B20BF36305FBA996D20ECFDC695 + +count = 14 +seed = 0A98A2BD2B9FF42CFC18D3396BAD052E1D0F3372854DA69A318B142F7A1AAC609C3861263BD8FB0549DA7266784DB8B4 +mlen = 495 +msg = 8CB18850E27D8416B88A9A71F4A66BDF447814DB6C82098C371B53F61600EF5DFD88E4FB34200207C3F6F55166AF4878D38FCA7E2DC18FE662E3EA491B58A86246CAE16090FB7ADA53B9A67B3D0E3787D3323EA921274C60CFFB19A889BCF0300FE10E242AAE025F374DD83FBE9D007C8B9D9D75574C74146331DDEC6F0E49C10DBAF15654897E33E2B4780DBA484224AA6FAC79015D5792FAA2D532BB7D239B11D91420B98690B1FBDE9632223927E0804BFB284368A426C414C3DB8EA82F0D246413861475ED2DCA9E80FB4F3C34FEF7528069AE1975AFC52AC5AD2CDBCA1459E140F655556093210D7905A1A1E6CEEAEF0194A0B2EAB2C1EE853484E715D2A1DB551FDC620D5331164C74CA4848B61D408D2F2A943FA09EFEB63D524691C99DCC0B22CC61B98E6FB8039E5E0B2D7DE2CAAA900A44184BD56C9F02141A3AE8AFC661E3E898ECD3004FDB0704272BA780CD5DE35153B6FE223843024273642DCF8E4B58BE2AB1F61668680084AA0B75A32E766C8AE5EB30D4E02A12E6798DEA40F80D8DDFAD2041A52922701C689F46F49F84CFC05ECA6D7D4C356D50B6A0BA61966245D45134D6A1F5197540A1C39C36BB0B78831AF3F5156E669FD9213B64E0CF1C5A31E88AE79AD61757EC67B551B9F0A760F646BF81F6B92403A62840CC29FA4F3949B3A9F0A9A4286EE7808A +pk = CB56804A36177A6F61D402AC1CB77EF1498E891D9D20EC63082846FEBDE86FCBA195BEE7682279F5EC9A913DDD8FD711630C4017EB831C900A26071818735464BEB333AE258B70B2BF35A7D53A37A3B3ABD142A5D9F91AC13DE15060439B55340D +sk = CB56804A36177A6F61D402AC1CB77EF1498E891D9D20EC63082846FEBDE86FCBA195BEE7682279F5EC9A913DDD8FD711630C4017EB831C900A26071818735464BEB333AE258B70B2BF35A7D53A37A3B3ABD142A5D9F91AC13DE15060439B55340D2D95C5BBEA3E1EB94F01241D4DA3EA5CA6810CA33EDD3389A60100000000000000000000000000000000000000000000D6632A1877E444179288D7240AB5472F3BE4D85A231C57D01EFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F357E0AFB78508C9650BF7BB6F0C81F8F5001B7F1840F8258FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EBE49E1D350563206FE8462C653E636C039AD276D186CE8AEB40F84FB5D1583C717F2ECA5C8CC3B75F361472CE10890043679D625AF365FD1288DDF6BA6268649E21A04B5F4487050E2005E9957831EE61C5FC194E913812B8CA918F17896800846129D1BE21C99C1DADEE2387D3F9D1B37461B5D188A7B9C739BB1E452F6E4F42470B9493EEA5B42EFEBAD0E0069200598E15FB0B4334016B8A6A1CA1EFE327915CAB429FA1C988274CFE4B4073C783F63ACA5D36F1698BD6B667493FCB5000 +smlen = 719 +sm = 6F39BF6D31835EF378434866BF201D18DF3FF4B6FB1D36EB703EBD7A3EEC69DA35862C816A15A5B740C9D1AAC0666331F132B915445C5DF52721828669A470E7514355F3FA57881CE02B7957FA4273B56737EE0A08E7833EE34224CAF173A50E0100A1A50D07AE02BEC8C685EDA633E87664C3CF6F4DCD18813D0118557DAC0638A59A9756CCFE0D8AD6C1576394637710A882003F557DA30120CAFFD0CEFA281F31FCC8D7DDA9D8401331D9000F3907EE8221DA2F1563D0ED10FEC94DCCEA5CFA0AF26A4C01514F993DA902322305EE8369D7C66CE44ECA95A3D0D75900170D8CB18850E27D8416B88A9A71F4A66BDF447814DB6C82098C371B53F61600EF5DFD88E4FB34200207C3F6F55166AF4878D38FCA7E2DC18FE662E3EA491B58A86246CAE16090FB7ADA53B9A67B3D0E3787D3323EA921274C60CFFB19A889BCF0300FE10E242AAE025F374DD83FBE9D007C8B9D9D75574C74146331DDEC6F0E49C10DBAF15654897E33E2B4780DBA484224AA6FAC79015D5792FAA2D532BB7D239B11D91420B98690B1FBDE9632223927E0804BFB284368A426C414C3DB8EA82F0D246413861475ED2DCA9E80FB4F3C34FEF7528069AE1975AFC52AC5AD2CDBCA1459E140F655556093210D7905A1A1E6CEEAEF0194A0B2EAB2C1EE853484E715D2A1DB551FDC620D5331164C74CA4848B61D408D2F2A943FA09EFEB63D524691C99DCC0B22CC61B98E6FB8039E5E0B2D7DE2CAAA900A44184BD56C9F02141A3AE8AFC661E3E898ECD3004FDB0704272BA780CD5DE35153B6FE223843024273642DCF8E4B58BE2AB1F61668680084AA0B75A32E766C8AE5EB30D4E02A12E6798DEA40F80D8DDFAD2041A52922701C689F46F49F84CFC05ECA6D7D4C356D50B6A0BA61966245D45134D6A1F5197540A1C39C36BB0B78831AF3F5156E669FD9213B64E0CF1C5A31E88AE79AD61757EC67B551B9F0A760F646BF81F6B92403A62840CC29FA4F3949B3A9F0A9A4286EE7808A + +count = 15 +seed = 9887F1FD854241A301EE0120645CD8E119B43F7BEE11F77A835E9ADF518C3A51CB76D86653FBE73AA716264C146797EE +mlen = 528 +msg = 9B64813C058F07A09A796FD764604EAF58CE144363702896DF0AB5FF26D5DE000D14BB8FD358FF5532D3B909AB62C18AC30F1900F84EBD3F4F18BD532D16C7B3470F0F8BDF72938C916DB18BCF1429DC1635B1C152C5F89A9EDB17116C11815A6C06273A889132923DA908FF39F4940A840D3CB575DC4D637AAFD37968EC61FC4EA04B4C320491A73ECFBDD8E10F1DFE902FCCEF93DD287ED872F67146BB8CA5A6ADCF0350E8BBA7F2F9762C4AA748FCE19748EB17334146C152FD63FAE3DFBB1A2C2B3C78960369551FDAC5D54643BEEAA59C1FEB0C21DBBB19977D848CD82A7AE0005F45956E0FE4700F14FBAA0C12FB8C65A6AEC95C5A5C8E79A6DA9C4E446872575C06AE49A31B82245E1757C7CE84D6D5DF3F642D3434B7E1A15A8B8A9DB460826B6CDCA69022DBF87595B582DDBB90A81E09A13C2AB1C125E4435FF30ABC9C56A00EDFA979F79D9C895E800D2DD6372FAE5FAACD83ADF8A6D55279D52DF547E9BAB39D99076AD7D297371344D35BD584E0FB5932F92FD5183B9250CD180FC645BEF6028C405B0EF35DAF783428173F1F2482AA1363640F66AF0FE8ECACC0DAB84ABD2A1FB53AF44445698CF1DDF4C2EA214DD339BE004E75BF76E95CA5C16981ABA5540689C1C1F1DAF4D0F89D62CCB3496340D61E7D5F5156FD3EDD02EDFEC8FCDD0B231697B0E66F4A3AAF46117532F5EE2CB4D2B3B82B0BEAE0A45A482CE9A976CC99AA82BEB0FE08CB68C4 +pk = 3384239526C3968C4E8576DE55CF839990237EE27A99E8FA70401412B80B4BC27616081303F3340799F94E032D8042026F0C24E72B1196A8D29956A91FE62C401C9B231C9EBAC3A9F25764E47C3177CF3738F862620D855AA6CF7B1BB2970F3902 +sk = 3384239526C3968C4E8576DE55CF839990237EE27A99E8FA70401412B80B4BC27616081303F3340799F94E032D8042026F0C24E72B1196A8D29956A91FE62C401C9B231C9EBAC3A9F25764E47C3177CF3738F862620D855AA6CF7B1BB2970F3902E597B8C6BA0EF90ABF81F762237E16F477E9433D6A8C180F51040000000000000000000000000000000000000000000014FC7FB55DD2A1937F1A8ED9E1484D03FD0863E85B6CD75754F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55047C8B0877DA468A539AAECC087A74A899FA80CFF9B6AFF9F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C9AA729933FC6681E19747DEE1B975B76094A0278AB21D8C63F709DAA1421A736986070201B33796F395FE8776594200B5D4A8AEDA12492A5411C00A15BF2244567E25843FF956DA9295EEFC6C2D6CC79E8FA7A08FF357A32C71B37F99216100BBB87F8013271B2533C03647563C2BB4E6EAE0D9AC6488E8E36EC2836990E3DC576DFB0F7A949911DB3408884FD42900663B3715359082B49646CEACF7B5EE151E5631F2DF322AF53B70D66207E6DC0A0164759A0E19AA917904A6CE096F1600 +smlen = 752 +sm = D77963FA0F53C6D12ADBD2AE53C856B5CD9B656CB6481E0ED7D64142EEE8E66936EED08C963B80F8676268555B0C45144345248143F9DA689E5BA1FE48AA10C0974D67B4D43A4B26F6FDE1BF30A691B4578109F6BAFAC37657E491828BD8BA060101B39015CA6FDB4266ACF2CF46AA84E18438271C6BBD0AA777002EEC373E5B56893D1180B44AF2CAC88F82A39DA977122D7A01DDC9FCAA1C204B095040894601E089C41960E93C0CCCA39E014C0738B6619AE6326620328836DB1350C08B486EEFC5510D003467402EE286BF37975B9A0A5EEEB71755B07C87C9C43F0015049B64813C058F07A09A796FD764604EAF58CE144363702896DF0AB5FF26D5DE000D14BB8FD358FF5532D3B909AB62C18AC30F1900F84EBD3F4F18BD532D16C7B3470F0F8BDF72938C916DB18BCF1429DC1635B1C152C5F89A9EDB17116C11815A6C06273A889132923DA908FF39F4940A840D3CB575DC4D637AAFD37968EC61FC4EA04B4C320491A73ECFBDD8E10F1DFE902FCCEF93DD287ED872F67146BB8CA5A6ADCF0350E8BBA7F2F9762C4AA748FCE19748EB17334146C152FD63FAE3DFBB1A2C2B3C78960369551FDAC5D54643BEEAA59C1FEB0C21DBBB19977D848CD82A7AE0005F45956E0FE4700F14FBAA0C12FB8C65A6AEC95C5A5C8E79A6DA9C4E446872575C06AE49A31B82245E1757C7CE84D6D5DF3F642D3434B7E1A15A8B8A9DB460826B6CDCA69022DBF87595B582DDBB90A81E09A13C2AB1C125E4435FF30ABC9C56A00EDFA979F79D9C895E800D2DD6372FAE5FAACD83ADF8A6D55279D52DF547E9BAB39D99076AD7D297371344D35BD584E0FB5932F92FD5183B9250CD180FC645BEF6028C405B0EF35DAF783428173F1F2482AA1363640F66AF0FE8ECACC0DAB84ABD2A1FB53AF44445698CF1DDF4C2EA214DD339BE004E75BF76E95CA5C16981ABA5540689C1C1F1DAF4D0F89D62CCB3496340D61E7D5F5156FD3EDD02EDFEC8FCDD0B231697B0E66F4A3AAF46117532F5EE2CB4D2B3B82B0BEAE0A45A482CE9A976CC99AA82BEB0FE08CB68C4 + +count = 16 +seed = 5B485527C3B9A5E5B7579950049CD357975D4BCFEF83FE33C087ACBFCC10A0BE4225E7F8A5F77203B5FC7C0B5FC0E78B +mlen = 561 +msg = 922320F7439E492F13C272A5738FF7122DD7A6B2832632E1F7A653FEF3B8639BCB9E84F482F22A948EA17DDE6958489593D2CB268BB52DF8ED612F2317BD6847D1622CF0532CB499ADC432233B93B6F7B1866B38975AC87859AC49F91E8D235846775F9E6E6D052339C741EF6178016EDB3D0B1E3F3536667B3EA2D489F88D254B8582421A31461374F465D7AD62E896BE0857134707A70477FABC09FE0A5CC3B3F32911F5FF3806B878205525AF69007F50535DF05C33AF3B0D00E297AC7EAA012E1D863DD5DD5FA47FB09467DBAD8BC42EDBAB42A9625BFDB9FE578343297506A3B71CDC8D5919955AF4605FCB0C7164D96A187AFF65D0F6210FEF2D11BA08D90C4458542BE72E084577BE9E451B8B6F4909884BCC5D25316ADCCD0925664D4D91C2E56433C1B68C632B0CA56D856DF1EDD5E113D1F026B30DAC4FD648A504F8F6809C701C97BCAC2B99286CEF5C1C923200B1BF6141EE1CFC51C5E14554BC02D7E058970254D2C02948360ABC4DFB439E66946A8AD615147BD8A6CB0886211E8B15DFF3C72B6F8908CE56BBC1B40E838103202E9F188D98E07555DB61778F895F76FBD838B6D14209D28EB393668924AC0E61072CBD9F93B864904FF4302DCEA131B2CA16BB04959ACEE096B1963CE07F59AB505FCC8D89FE08FC58751965F2F5CA753D76D58705652D3B1505E0F720EDE3142DE9776FFE4AA0C8A25E76C7A04843377C59F1002844E89189E22F621467B813A98BF07540A1649264F14A6844D65692617F7A4D93FA9A23829E256626 +pk = B032AA05AAF1BA53EB1D501E32312AE779AE1CD3A93E4D56ABB7A29704FBC0014316B935B8F7736305296DAEF2C8C51B3D0B06F2BCAC24AB7A5144D75B91F98F28DD95DD50C6B17DB23D9B2CC62BB4210D60AC51B534F2199E46D06AED23BE0004 +sk = B032AA05AAF1BA53EB1D501E32312AE779AE1CD3A93E4D56ABB7A29704FBC0014316B935B8F7736305296DAEF2C8C51B3D0B06F2BCAC24AB7A5144D75B91F98F28DD95DD50C6B17DB23D9B2CC62BB4210D60AC51B534F2199E46D06AED23BE0004210AD7DB266923FA467E65AC019D8FAD4F56EA9A3BDCAB975709000000000000000000000000000000000000000000008AEEAA84AD1A482941C0E9111A3B1CFE805F165C59CB0D553EF2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49D975761E38B2594A471B5654A4286ABCFFC67AD4C4CC03B8F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007B6B846FD94BD918A6E18D6A8DAE1F2D9ECE7F5A8470BDF98FC40AD29952619591CFFEA7D5B19E80F08BABB4057B95009496C89983D51CD7771793B4EF8A60374E411EC3FBB14A1136569E10117A7A2EADE068E5530E4D2DBF90BCC035D73C00EE47A2E7E3D67ED409D9661CF9FC3D8449386686E3E2487BB3F632460C22AFB202C5299698964A07020B570A63ED6100EBF127323F5CE44C31FCAE38889C26CC76827B5187DFB5C28A81D04842E0963011E8B941F2CAF02C21B29A57FC0CA200 +smlen = 785 +sm = C9FF462E859CC6045648D134D82FBC2FA7D6C2248313914282CB5109340FB900CC9698818698D9A8F9EAF2B3D168C60DA4B86B7F66DDC6B09B23CFC75F4F07D15ABCBB466E0F9A6F45266A6CEAFA4477BFBA30D7C7A897FAF68701A92B3CEA370002D0B6B3EEE48676C168B1575086ACAE5CBA8BEBA8D5BE786C03FD966247E4222718A311B04BC4935A21563AEC85B90B397002A499A9EF91DD5FFFD97C7D954A887BD4972E0D09AE7A9EE201578DE59DDA2FE28C12FDF8F23AF80568994632865EA1C05702566F6FC357A5975DD2DC3F7A7CFCB4859092AA3EBAB2DF000D02922320F7439E492F13C272A5738FF7122DD7A6B2832632E1F7A653FEF3B8639BCB9E84F482F22A948EA17DDE6958489593D2CB268BB52DF8ED612F2317BD6847D1622CF0532CB499ADC432233B93B6F7B1866B38975AC87859AC49F91E8D235846775F9E6E6D052339C741EF6178016EDB3D0B1E3F3536667B3EA2D489F88D254B8582421A31461374F465D7AD62E896BE0857134707A70477FABC09FE0A5CC3B3F32911F5FF3806B878205525AF69007F50535DF05C33AF3B0D00E297AC7EAA012E1D863DD5DD5FA47FB09467DBAD8BC42EDBAB42A9625BFDB9FE578343297506A3B71CDC8D5919955AF4605FCB0C7164D96A187AFF65D0F6210FEF2D11BA08D90C4458542BE72E084577BE9E451B8B6F4909884BCC5D25316ADCCD0925664D4D91C2E56433C1B68C632B0CA56D856DF1EDD5E113D1F026B30DAC4FD648A504F8F6809C701C97BCAC2B99286CEF5C1C923200B1BF6141EE1CFC51C5E14554BC02D7E058970254D2C02948360ABC4DFB439E66946A8AD615147BD8A6CB0886211E8B15DFF3C72B6F8908CE56BBC1B40E838103202E9F188D98E07555DB61778F895F76FBD838B6D14209D28EB393668924AC0E61072CBD9F93B864904FF4302DCEA131B2CA16BB04959ACEE096B1963CE07F59AB505FCC8D89FE08FC58751965F2F5CA753D76D58705652D3B1505E0F720EDE3142DE9776FFE4AA0C8A25E76C7A04843377C59F1002844E89189E22F621467B813A98BF07540A1649264F14A6844D65692617F7A4D93FA9A23829E256626 + +count = 17 +seed = 327CE565CFF6CD9A25EDD84F482FA0758B78CBC246567DAE98B818314AE28CD438E339043EB3FF16E1C2B4B104A717B8 +mlen = 594 +msg = 576289D10AB03D5699EAC322D349F55C547101E4424BFA43BBBA3747B79F075AE1153A7A0AC8BB51D24FC46B7604E42EFE4343FA34AA4EB16D918F25E8A4D67C860CCA3F7480E1221ED3AE13A138F079FC252C6D7BEBC55CB81B86E74F339614BEBCF7E8F4440DF8678B01A4A41B3AFB1D112FE1C4C8D8C6BFE9D3EE2A335D477C60FBF43B2E5FFFE1546F5172EF51CFFB2A772E1575EAC79B24D49FD77F0BE351233E57EE6DCC7E2E29994873ABD434D34ACE83400C026E27E27888EA0BDD1BDE5A3E55AA8B5F2FEB57B8B0A96CD831906297C8169D04F15843A3249C50523CF56A4E19492EA16927DBA8759B88A99E0D20820E51FC9B6A6863115CF05C5BC3F4C869EB5A87124DF5DB102D737F3899CFAA5FEA4DD62DC4FEDB1AAFF67906ADAF8968020EFA5B10190F70E5F2C0F0457E4341BD449201D3A80AEB791254EC1C46DDCEBC3896C6DF702509BA62CD446D275806438EB4C03132B2E6BD01BD2F832D1D3C053C48C5A9DB1C4A22B130C4C9E96A2BF4C2A8F7DE0217A52D9AA5AEEE5E6A49708237EAB60B4019A51390C3EF10572A73D436875BB8D7D78543F96376E4BF3BCAABB92F89215E8D1093F3B287945708B5514BD7E62654D3BDF34B29009C64829A0CBF33C54D7AB0E81B81BDDA93028B341AB1DFF3D752DC4A1E5F9636A5C46E137EA35919D99E6571C5370C6E804BD2E2ABF566F035D65CF8F97E3E8F2ECAFA153BC6D8EC2831667A37FC96D1C2DA40BA84D0FB041DEF32AADAEF3F98CAFA957F6552F79D28A36B8BA20A9452671DE1BE8AF5D66714232507EDB9FF657F3D7E5FA7320FC0359A5F99280D446283BC +pk = A501BE65AAAB4D360F0E3EE66A756879F3A940C176571FAC8C5E23B8AA3902C59ACF08E00C25E3E068FCF6BCC81E2C1D42A9B4CC4CF4EC752DAB927D26AE8235788B744194700440DCB47E88CD3CAE69BE6D8434357C731372ADC4E8DF34920A02 +sk = A501BE65AAAB4D360F0E3EE66A756879F3A940C176571FAC8C5E23B8AA3902C59ACF08E00C25E3E068FCF6BCC81E2C1D42A9B4CC4CF4EC752DAB927D26AE8235788B744194700440DCB47E88CD3CAE69BE6D8434357C731372ADC4E8DF34920A0209B0956C5E4B17D684BB784AA31B606548FE8FC600C362878C040000000000000000000000000000000000000000000050DE5D278152C4676602DA48F39BBB96E41EBA20214339886FFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED84BB43CE7564B964F37368B7BCBF9A5E8045109B05567582F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F15F535CA0C03C88431536B83BD6349F6545A30E404DB9DFEB7E3312E406D98E1A2A5CAECF097ED523824863F3F83E006B7AC42A76DA78D442AFDFEC990409941D013107F55A1A32F77C9E86BBCBD8363FB8FA7B3475F48271FDF7DA9BBF8D0068ACAB71DC4570DABA24C4B8B50FCCB44F54053E30B0DD1F4B32D835C0E6E8A36B72ABD278B70E96225CB826741AE3005D76887003614D7AECE5430A046A1C767214CCE319C3781BAA9FED15ABBAE059DAA79F6B759CCA31062917D9338C0F00 +smlen = 818 +sm = 0223AE9D8E3EF619B3D2769BC4DAFEA30A2F70E0F6EFDE3079420428FBB9C65A2A31660ED0A35F0C0546564A0C5E53203BB295A2309CBEADA4605EE79C9072E11E6C18BC29DDAAC1AC8AA7EAE69D12863A0AC2E9EF5F5E63E6B7A506F194D4370100D3AADB622D00EEF1C0759390D7B694E8BAABA952888961EF0093747FEF0EB2A7969AB00FCD953A0ADD6317B927E5127AC401865ED41E8AB87ED34BBC40C48F985E13906E166BA0B9240601719B99CB53E54A7F44F41169D4FD7833D4C390276AF69E610115130D702EE257B3BB4644CC77A84AAB8BEDD678A5752E000202576289D10AB03D5699EAC322D349F55C547101E4424BFA43BBBA3747B79F075AE1153A7A0AC8BB51D24FC46B7604E42EFE4343FA34AA4EB16D918F25E8A4D67C860CCA3F7480E1221ED3AE13A138F079FC252C6D7BEBC55CB81B86E74F339614BEBCF7E8F4440DF8678B01A4A41B3AFB1D112FE1C4C8D8C6BFE9D3EE2A335D477C60FBF43B2E5FFFE1546F5172EF51CFFB2A772E1575EAC79B24D49FD77F0BE351233E57EE6DCC7E2E29994873ABD434D34ACE83400C026E27E27888EA0BDD1BDE5A3E55AA8B5F2FEB57B8B0A96CD831906297C8169D04F15843A3249C50523CF56A4E19492EA16927DBA8759B88A99E0D20820E51FC9B6A6863115CF05C5BC3F4C869EB5A87124DF5DB102D737F3899CFAA5FEA4DD62DC4FEDB1AAFF67906ADAF8968020EFA5B10190F70E5F2C0F0457E4341BD449201D3A80AEB791254EC1C46DDCEBC3896C6DF702509BA62CD446D275806438EB4C03132B2E6BD01BD2F832D1D3C053C48C5A9DB1C4A22B130C4C9E96A2BF4C2A8F7DE0217A52D9AA5AEEE5E6A49708237EAB60B4019A51390C3EF10572A73D436875BB8D7D78543F96376E4BF3BCAABB92F89215E8D1093F3B287945708B5514BD7E62654D3BDF34B29009C64829A0CBF33C54D7AB0E81B81BDDA93028B341AB1DFF3D752DC4A1E5F9636A5C46E137EA35919D99E6571C5370C6E804BD2E2ABF566F035D65CF8F97E3E8F2ECAFA153BC6D8EC2831667A37FC96D1C2DA40BA84D0FB041DEF32AADAEF3F98CAFA957F6552F79D28A36B8BA20A9452671DE1BE8AF5D66714232507EDB9FF657F3D7E5FA7320FC0359A5F99280D446283BC + +count = 18 +seed = 790FC03F956D1301A735504075B67A05944A762E0A4BDA77BB8C036C5CF911E2B561EC1CA6AA355D5CEC919AED42A1D2 +mlen = 627 +msg = 021E9C06A2E4EF63D1A61958620C40016783879080D44311E04F2A446BCAEE5A486D17FF0F356BA70FF1C2B55BF957A59202903AE349878CB822E04275E0AFAABC0803BB6CDE3741E0BF9FCE0C5D5C814977474533DC63F9ED4F32AC3477A3EC9893EF55186728C85B03F4C2E61CA7733E1706766AEB8FEA80E233E8761B57FD5A3CEF700196674B34A3A55F68B3368B688FB1DDC976FF48BA6A98E2D66023F291A3C617A56CCBDB8732B8C34369ED11F4CCEA8FC8F673AD9FA0FD8990BEF70AF44C617FDFA096695D0C94EA8E17554F4461DC776DB2F416448B17680FE4D29B09E57603D8EBF55771AF84D8D4B9097302901C25CB6D73932E67C323D12C8ACB0E74CB89755F7EB3999D4EAB5E1B775E6B5C29D9733697030A26F3B93B3F286DB0F2DBDA71E1F103878063E77919D8892EB6A34F821B603ED4A898A9F30D00FEEF20985FEF1A7B7AF70DD29C269E88687F005D551EF05EB0603FD38745AED4F5BF4C2FC09F0604C98AE3A89E46BBFE907B87A1672DE547D651F035F392A8D4DB5E7260F43953028E312B95B9F25FFF2C0C579218390411D13D9A25F22DE4C7AA05FD11781DB08977160D48E02372C7D826F5CAC37D1A9B4230BE99A2D13CC2E9B2B17F0A1044EB9E0A2FBA376D35CDD2BC05F57DCE4BBC3BF07A09BCDE369929E6250EFDC61689466B040AEA376B09453A2C16813BBB685B54A225C49008BA6811E8BB5B3627F8C281244FDF5533216D126ED0E64FDABEC533424BFF77FE722CC438CA7587C19D965F0BF085D8692C27C5C84A9DEE53256D978948D89ABDF9842E0B765BE6A507D8630CBC5CA7FA0FBCA1CECC78D2E536AA7B2B902C4379777AC0920D69C57CC4E6032252BDE99E1A555E80D4 +pk = 66B4D16AEAB97EC38A3AA053D50071D3B8956BA344398D4B8A620BA803D94C139EC87EF29629241A9CCCE92B9B986B2C197EB80FB1B46A3A8E0E48B70FDE6300F5272CBDE3882F78095551BE5692B65D6626B0E56F02836F43E06BD45CAD983B02 +sk = 66B4D16AEAB97EC38A3AA053D50071D3B8956BA344398D4B8A620BA803D94C139EC87EF29629241A9CCCE92B9B986B2C197EB80FB1B46A3A8E0E48B70FDE6300F5272CBDE3882F78095551BE5692B65D6626B0E56F02836F43E06BD45CAD983B02257871956617740DDD24C0EB024E6DE5E013A0CD6CEC1681840C00000000000000000000000000000000000000000000CC2BF8EDBA8E15BF251CC25258D69A574102D103C430957CE0EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5322F82DDF09D7D70CF87D505BF9F36608825782207C4273FEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056FC35313F07584E8604D9E4F00D290D321EEA3ECFBA24637EA0A4949B56B29CAD766A4980AADC4A9F04BB8B0A1B9C00DF54E02DF0D30DBB126AAA86B5D0A5C74B3A9C9E109038D6C899211E1A2AA620760286727FAFC0C1DF945BDFFA129B000538E57EB4585A0DC4DC352E3679C67ADCBC9C588F43E96BDB368B2542108101F2D684C0D6FF57342A3058E502087B00344EAFEFC650EE769F33993C7E79BAE0068E9FCA574B67BED5ED26F181132D617E780EA1BA9881BF38A241553CE65800 +smlen = 851 +sm = F510ED49BFCBAF5AD04CF048D8C43A548A8A9B4F85FD82FDF37C37EB215CE3A0C8E676884F6CB7E077DBBAE6846AE928674369A37C128923513433C175162A6302CF3382F86B7966F39D87D8D597D4F11CB41D56BD2EBBA6C15638A4CAFF75330002959CEEC038CB79F8FCDE3D44E95D2EA0CEE9F64F608099D50192BAF6C99052E373DD5744D6B56C946186532F4FF56CC1C4018316F81F77D00985B960B1D52169422CB029469B4E22DABF017AF91CBE2455948095985307CB2A836A7F46B75A37990F5003F0BFD8DFAC588DB0C36034523A4413682233C4282B8D7900020D021E9C06A2E4EF63D1A61958620C40016783879080D44311E04F2A446BCAEE5A486D17FF0F356BA70FF1C2B55BF957A59202903AE349878CB822E04275E0AFAABC0803BB6CDE3741E0BF9FCE0C5D5C814977474533DC63F9ED4F32AC3477A3EC9893EF55186728C85B03F4C2E61CA7733E1706766AEB8FEA80E233E8761B57FD5A3CEF700196674B34A3A55F68B3368B688FB1DDC976FF48BA6A98E2D66023F291A3C617A56CCBDB8732B8C34369ED11F4CCEA8FC8F673AD9FA0FD8990BEF70AF44C617FDFA096695D0C94EA8E17554F4461DC776DB2F416448B17680FE4D29B09E57603D8EBF55771AF84D8D4B9097302901C25CB6D73932E67C323D12C8ACB0E74CB89755F7EB3999D4EAB5E1B775E6B5C29D9733697030A26F3B93B3F286DB0F2DBDA71E1F103878063E77919D8892EB6A34F821B603ED4A898A9F30D00FEEF20985FEF1A7B7AF70DD29C269E88687F005D551EF05EB0603FD38745AED4F5BF4C2FC09F0604C98AE3A89E46BBFE907B87A1672DE547D651F035F392A8D4DB5E7260F43953028E312B95B9F25FFF2C0C579218390411D13D9A25F22DE4C7AA05FD11781DB08977160D48E02372C7D826F5CAC37D1A9B4230BE99A2D13CC2E9B2B17F0A1044EB9E0A2FBA376D35CDD2BC05F57DCE4BBC3BF07A09BCDE369929E6250EFDC61689466B040AEA376B09453A2C16813BBB685B54A225C49008BA6811E8BB5B3627F8C281244FDF5533216D126ED0E64FDABEC533424BFF77FE722CC438CA7587C19D965F0BF085D8692C27C5C84A9DEE53256D978948D89ABDF9842E0B765BE6A507D8630CBC5CA7FA0FBCA1CECC78D2E536AA7B2B902C4379777AC0920D69C57CC4E6032252BDE99E1A555E80D4 + +count = 19 +seed = 716354F7DEAE272CD26929C0932CA257AED1DD23D67260726B5213D82E61466FA99BB6A7D81DEE9D0EBE03DEEE4DBFC7 +mlen = 660 +msg = 7BEDAFEBABBBFB863CE496475F54E69A905AFA45899C3D7C16CFC73E31597D2404AE7014612E4CBFA238EFAF5B396B0B7435ADA5DE817E013188C280423C68924E1FA2A33CA56E6B85B7CCA7F00D3A6151F0629C1B92A13573320E0025863BBA7F3EEB987EE1B1A6230B10765DFC1FEEA498AE4B83521188E7503B506259103CEFB370E3651B06DD4F08013FF3AB9E2430626B0BD584232948462D85C0F82DA07B96FC65F62A43CD2F132D1A1D691C085980DAD8796CCE2FA0B268395EAC3DA2CC400F30F75BE87316216980CE213B48651DDB9E294F8CDB2CA05D3F2A507E4A03E2849AA8062918AFB5BCE9E4C3ABF2FFD4751DDDCF08AB09E36A29B830F3BAC6FEEBEA084575472E6F4B239AF89965A72954769A83E391DE467934237B07D8884A6B14CAD034FBF9BD7531D50D742E234E227E1A2DAF77A2FFACC579525134B15186D81AE6E5538871024BD2897475D6EE5B11BC51EDBB928D98475073785A75B331BF3D2297165AE6CF95C3A05F06DF747498462054F58A5AC736F96014B1A8CDB319D030D06DAD9CAB2B913F35FC392E1FC4B027CDBE775D64B04F1076A7C8F44C360745F98E87B84C18AB76F84F373F635AF4C8A87DF08DD4507899BAD892FF8CC1EE534D3277B5B82095628B84A7D5582149CF46C50AA963B56B4B91966B106B4B2EAA45D83A10993E8F933370AB29C6606B7CCFC41B21C6B99F2B9AC643E24300B350FA199EC10E64E4AF19181F78E8C43B2FA796241DC42CC8992BDFCDC39E7BC41BE68CDCE4FBC47C996DB42E8249EEDC146C216B514430C705FC939B9EEF677AD87F9CEE3398551FA0DAF774302324A410F4A4F4FC035CFBE960B38C390441E92D9E5624A8745976BC88FA538E398712361B77AD4CA5FF038D9F6CE157EB8A6137420D4E57018275DCEEBC4E480A5D +pk = 91CC079BF1F78B3980477C4942F82DF8799A4C78290C86DB441EFDFCA6E7F052FC3C7272A6B962DD6F00FABCC1E6DE0FC5F0125728D8AC5B1A5706C5B8D6C85B77D7828025EDBAA88E4B6616C62A54CE86E860D9ED0A2B7A4E4526622BBCE0270D +sk = 91CC079BF1F78B3980477C4942F82DF8799A4C78290C86DB441EFDFCA6E7F052FC3C7272A6B962DD6F00FABCC1E6DE0FC5F0125728D8AC5B1A5706C5B8D6C85B77D7828025EDBAA88E4B6616C62A54CE86E860D9ED0A2B7A4E4526622BBCE0270D016BF73CFBF1A89D2B9BB04C0605AF9A3C1DC40DE00884416B0200000000000000000000000000000000000000000000FC53503A10B64808392ACA5F4644194FCF24A1821F0100FEA7FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9814ADC7931FAE36C2E5BC980A2ECB005271F0795DCAECD6DFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AB75BB550B23FED9AA5A80EE019DE87524991AAE681056B47947F502EE62A16B64DA3A24868B472696EDA203DF6760006108697E533D0ECAF30B1D646F7584526D26E519F6692566F3CED9C0F8308748DA50B98FF8FD58AF876E68219103180017E8200D98E2B8033AA0B82A74E0A9E3F385117CB600D9A7BFC239A45E54D47F9DD53B3A6DD28352C301E82CAE8D230060A8B8D98E07A65A57567912E216552B4D62BEA1F81EA60181527FF46A46116DC3792B580AC98922C06744299A6DA700 +smlen = 884 +sm = 941B390E3A932A05E1CAAB98217BB652741C896D76890BA99444EAA2D5E8E9988000CC25A2A8292E52727210E6F96F29B4D57838016AEC5F3B3561032AD752E4E07FB6AC821A39E857B88305C07F6ECC097B3A28AFBD62929E84E61F3C9E55220003BF74E2FBAC45595A709607C1D1F8D1706BE5F6EB6E47AF0C0166077CEC5F9CD77EE55AC1F22B3D9AE9CCDEA878EDCEE6B200DEE9A24D977EF9C9B249B69185914A00723C31362FACAD410394E31F7FC6E0A4C49A40F2BCC2B95EF19BC7481B92FE72FD001090B83DE00DEB5149554B97EA5ADB218EEEEB08DD6C4500040D7BEDAFEBABBBFB863CE496475F54E69A905AFA45899C3D7C16CFC73E31597D2404AE7014612E4CBFA238EFAF5B396B0B7435ADA5DE817E013188C280423C68924E1FA2A33CA56E6B85B7CCA7F00D3A6151F0629C1B92A13573320E0025863BBA7F3EEB987EE1B1A6230B10765DFC1FEEA498AE4B83521188E7503B506259103CEFB370E3651B06DD4F08013FF3AB9E2430626B0BD584232948462D85C0F82DA07B96FC65F62A43CD2F132D1A1D691C085980DAD8796CCE2FA0B268395EAC3DA2CC400F30F75BE87316216980CE213B48651DDB9E294F8CDB2CA05D3F2A507E4A03E2849AA8062918AFB5BCE9E4C3ABF2FFD4751DDDCF08AB09E36A29B830F3BAC6FEEBEA084575472E6F4B239AF89965A72954769A83E391DE467934237B07D8884A6B14CAD034FBF9BD7531D50D742E234E227E1A2DAF77A2FFACC579525134B15186D81AE6E5538871024BD2897475D6EE5B11BC51EDBB928D98475073785A75B331BF3D2297165AE6CF95C3A05F06DF747498462054F58A5AC736F96014B1A8CDB319D030D06DAD9CAB2B913F35FC392E1FC4B027CDBE775D64B04F1076A7C8F44C360745F98E87B84C18AB76F84F373F635AF4C8A87DF08DD4507899BAD892FF8CC1EE534D3277B5B82095628B84A7D5582149CF46C50AA963B56B4B91966B106B4B2EAA45D83A10993E8F933370AB29C6606B7CCFC41B21C6B99F2B9AC643E24300B350FA199EC10E64E4AF19181F78E8C43B2FA796241DC42CC8992BDFCDC39E7BC41BE68CDCE4FBC47C996DB42E8249EEDC146C216B514430C705FC939B9EEF677AD87F9CEE3398551FA0DAF774302324A410F4A4F4FC035CFBE960B38C390441E92D9E5624A8745976BC88FA538E398712361B77AD4CA5FF038D9F6CE157EB8A6137420D4E57018275DCEEBC4E480A5D + +count = 20 +seed = A32E6FF879EC8866A5F5E4F6318DA8FE6743812ED2CF5FB94F5C3AA3EDF953CBC32665810B71B2CFEBF343A571CBC570 +mlen = 693 +msg = A86EE95388DF139F9C5A84108D1E63F7A7842909B818E9A0425C257649ABF125386FB5286031E7E6D0EEB85C452E254DA39BBDA51F0D2167EC0A51992753DDFA76874AA80804E705CF8BBADF3B82B6D7FBA3D1CAD130ABCC0B44D6D893356F3E94BF8E82AC532EF8C5E5F4200207BCF6B754F14E57A889FFB753F516EF8DE2A647FAD8E449264F0BBB4CF48BD01501736DA49509C3426A3D4108B98E6A4AA6C4430E8EE76540051FBD1DFBFC01750E26547F8718EF7D897A0342BB000FB99AA63B781C9A4B831DA798C014E58725E03D2F8B1A029C3337F4099239244AA320965B2CB5075052D901B6077A18C1ECFA5F272850A475B5F6BBC83F3C09A27072F80743B23EC6A9870913EE2805B4D296B2F81A9D733E5C8D5C0B477E51F9328AF3AF8ABED960408AFECD27FBDD08FEF50F4B07959646E0A02104A69674294A79DE0B25B65F4DBFA797E5FA56D66E8BC07D5E2E7C7D2E845699ACEA3BFAC60B2C0B988CBAB949A5B598D8E2F1AEC66196E115AD7F237A1C7FCFB95A1BBD6939A250E7BB0F4A02C23CB1BD81090CB770E3A70CB081D121BD0BD5ED1DC06D61282B98BF2DD7B13D2C6CF833891C67951D7D0F429EBDE3F1DA943ADB8AD285E6F13F798D6CD9A0A06BCD6125EBAA48F8F3BD5100A122F617817E3C42EBC3C3B154258FA26B9FD886EBFAD42DEDC6A2C4F9986BAD88A2A79D7EE603554E9CFC5FE33A3A171CF7BA94FD43228019B2F6FF96A8ABBC58D2098AD95A95442F6858EB69E131D7BCADAD81B9BB69D7682A978279B631E22927DECFFBEFBE8FB2E51D46A3FCA66225D30451CEF9953EF94F30B99F2B26EA75B84935EA4FB257DBE5734454B8087B3A4E115C6D31E72709303E9F0BB8C86FC6B11B93B53F9781BB92851A5CB5DC00D0B4E15683DBE4EDBE986966FE1F711F24DE9A0E1BEAEA8E835C70CDDC589773D31191B74AF780EB69867829ABED6D3FFA94D577 +pk = 1BAC9FD8A7718E88BD0F5776FC4312FA74610209A2C30212990F50BDFC715D5DD584E858F9F69F229D3B9992E22E6E3D66FC8D468BD0B3F3C90000CA22F0390EE2AACB3607ECED8F55218BBC955A238D695C9B65A799E3C5EEE2B53D74885D2702 +sk = 1BAC9FD8A7718E88BD0F5776FC4312FA74610209A2C30212990F50BDFC715D5DD584E858F9F69F229D3B9992E22E6E3D66FC8D468BD0B3F3C90000CA22F0390EE2AACB3607ECED8F55218BBC955A238D695C9B65A799E3C5EEE2B53D74885D27026B2C27CED2C430EE114E2B9A001FD898ABE39F8EBBA75BFCC30400000000000000000000000000000000000000000000DEE66FFA2DD11DDD2BB6D38F4664BB65335D458B00CCDB5E13FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA954EEF0DB6F8BC91CBE92B99EA5A0DF274BC6021E1C7CF8A4FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004528E37755B74A31652DBA4DF8E5EED077E2EA107840AFC66206BC6DC2DE6C37DD2D1C49C871FAD7E4D8A260629EDE00408EF25DCD824BDC75BC1866C19F358776687030F5E1F47C3FFF49FB44DCFD0F8CBEBC882DF34B8F7374E8B0DCBC7200E98412E8CBC84101A2B70787BE73A2A286C33D434744C261B365DE92767D144D47393553AC255E9735568413836DA800871015A5C7619A322725A9436E646D2CCBC11063B0207397258558250CEDD90054C70DA5474826152406A8DB6EBE6200 +smlen = 917 +sm = 4C1E961A91DF9ACCC41161370674C69E9A509E864A2764A0D222593C497F6E327F8C2C114C258F520C83DCCC983CC21ED6CE25C8A92AC0DAE99187538076AF46D413AE72A43F177867897F1389E11EA3131BB7994AD72C108E33B7FA972B610F0003D010E64A163ED59020BD767DD5D3A4B0FB97661C101C82330111AD0D051811C81F3DD5048C220A8E941525A7347E8D1F7B01D85F62424D90812A1D6C544F71ABD740F837D0BE6C30233B013D4D3756F1859F48F625D6CF2914B3EE68940CFECE0072470009FC33D6B8AC6F17F6010C4BF4DA078D921861B691D0E4000D04A86EE95388DF139F9C5A84108D1E63F7A7842909B818E9A0425C257649ABF125386FB5286031E7E6D0EEB85C452E254DA39BBDA51F0D2167EC0A51992753DDFA76874AA80804E705CF8BBADF3B82B6D7FBA3D1CAD130ABCC0B44D6D893356F3E94BF8E82AC532EF8C5E5F4200207BCF6B754F14E57A889FFB753F516EF8DE2A647FAD8E449264F0BBB4CF48BD01501736DA49509C3426A3D4108B98E6A4AA6C4430E8EE76540051FBD1DFBFC01750E26547F8718EF7D897A0342BB000FB99AA63B781C9A4B831DA798C014E58725E03D2F8B1A029C3337F4099239244AA320965B2CB5075052D901B6077A18C1ECFA5F272850A475B5F6BBC83F3C09A27072F80743B23EC6A9870913EE2805B4D296B2F81A9D733E5C8D5C0B477E51F9328AF3AF8ABED960408AFECD27FBDD08FEF50F4B07959646E0A02104A69674294A79DE0B25B65F4DBFA797E5FA56D66E8BC07D5E2E7C7D2E845699ACEA3BFAC60B2C0B988CBAB949A5B598D8E2F1AEC66196E115AD7F237A1C7FCFB95A1BBD6939A250E7BB0F4A02C23CB1BD81090CB770E3A70CB081D121BD0BD5ED1DC06D61282B98BF2DD7B13D2C6CF833891C67951D7D0F429EBDE3F1DA943ADB8AD285E6F13F798D6CD9A0A06BCD6125EBAA48F8F3BD5100A122F617817E3C42EBC3C3B154258FA26B9FD886EBFAD42DEDC6A2C4F9986BAD88A2A79D7EE603554E9CFC5FE33A3A171CF7BA94FD43228019B2F6FF96A8ABBC58D2098AD95A95442F6858EB69E131D7BCADAD81B9BB69D7682A978279B631E22927DECFFBEFBE8FB2E51D46A3FCA66225D30451CEF9953EF94F30B99F2B26EA75B84935EA4FB257DBE5734454B8087B3A4E115C6D31E72709303E9F0BB8C86FC6B11B93B53F9781BB92851A5CB5DC00D0B4E15683DBE4EDBE986966FE1F711F24DE9A0E1BEAEA8E835C70CDDC589773D31191B74AF780EB69867829ABED6D3FFA94D577 + +count = 21 +seed = 5A64401EF8E63AEE18E8CC0162845DC7AF388230E86728ECB330007F2546F949764273EA05B397FE71F567E1527FA445 +mlen = 726 +msg = F5ABE373CE1F6FB14F2014F5BC0071B17AB2C84E8845FCBF4B15C79FBF2E5E06CFFE6CAD9A283014A975F81C9216B261CBC79EDCD58D0E20C586D7C641E0EE97221BEFE54DBCC56A594DF103EC24B52DDBB6052D1644972640F39DEB98997FEE7A252A65070798B7E46707FA440375B1BA705B3ECC7EAC56D9C45297E585299C7D747B430F0D01E82081C70B4A87846F90267D5163181DED63E089A00AFD33B0E2B3ACE91182D8CC899223CE65A5D84B86BB3E8B34B13949BC800F2145468BA5411EACD6A6C331C340D4442D28EFA0DA959A2797C7181BD4BBE6E6DFFD134CEF373ECB0EC08590F06BE0CE292D3718E2C0EFC7CB40F1DB26F5F38FDC82A72F81AFBBC16591EE02DC818D63CAE69FF0A28F942F7E07F6B0A741F3F0EBE3D0EA5859024AA408462D3D268C23F95D717C0A685A4CA73AD90EE923DB57CD6CDD828B7AB0D4AFA6A9AD7E32D407A44D7515C0A6AF52A66AD72119BA1DAEC6514DE3F8B462EC473072226AAD61135B0F5EC646BA9A127C9894E51FDD1B2D38011A2A6D7497A55283133695D0AF9B3FF7C5A8FD667231F9E511E3B8C4C3ADC44D02DE08C47B2382DE67B32826754C6BE5231CE0FC657341E20247CC6CE574F3D1A9376AC8237B49E5030E877A4E33CDE25D838EAD659EB1678706C759707FC66CE84CC968A8334C18F1632348824A6985A0331A93B59497B70C1A03A6848F18F5992972BC79F07F4222D2612797F495463836AE6CD3858D5B9BDF744A1CF361B5D454D41AC899A4FA61081B937CBABBF0FFEC1B31C162224EA36CA2CD7FCE54EC1A504932ACC5BD0B17A156DA7488F7017E4916A687FDE7FCEBB2901813B07964084AB0447A94DAC3A0D3FDA05B9F497CC1555A8C74838E29CB8CE89D304DEBE419D26BA7F3DC6E9526BD895495A5FF1D7EC83F70D045E306E7C2487A52CD7553F062D31888EF7FD27F667FCFFA984AFE0B9A4C4E85CA943812CDC157C5486B0B5EA6DA05E4BB8697113190321A976D1806DA129101E60A28B7 +pk = 14ECE164456FC91BDF32DCA26B823EF4243B2BC8450AB3AEFFDC0778D53F1AC078EAD687E054872BFA3B8EF53C61BC0653910290B215C8F750E317D8454D738F1F4EAF4D55D33A02AD4DDDF6A650685D2B134163D3E32FACD26B44BD169B7E1802 +sk = 14ECE164456FC91BDF32DCA26B823EF4243B2BC8450AB3AEFFDC0778D53F1AC078EAD687E054872BFA3B8EF53C61BC0653910290B215C8F750E317D8454D738F1F4EAF4D55D33A02AD4DDDF6A650685D2B134163D3E32FACD26B44BD169B7E18024BAFAC95184216F88B8BB70D375B341179DB5643DED442A6F705000000000000000000000000000000000000000000008E7C125B11113B7D63F5B0BEAEB882339EB7E2370FEE5C3B66FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F8DD22F1C006645F926A2EB13B232E50729B439E023469ED4F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008624D48D1EC714A8910E1FCF7363A7D8D89E87D658010E12679941E7473E3C848C173FCECB5CDCF4BE25BD824E1333006D3EF9060279EED3C9125737675B8F261BE9A55A16C09348BC75D111902B3AE992F5F4F1C92B0A5C3A246401051BC800A54E19B4672C9CFE2A717358BA61B56E0012DBDCD44D6739FD2214106955D5F03624B5597BE29D535F2316D8F4B081009F7AF18618CD3452B015A52B6CAE9CE3794051AEEBF9952AE32103600AC4661AA9F175DE7DEA7CF61B0679D5D1CCF200 +smlen = 950 +sm = DD3E313820B6F783E17DD6BD052ED2370C8A1143CCBAACF6461CD1314AD3C4F40B219FAB0C13B0E5AA8C01ACB2D8A606CE511BB61642B078648B956BF1A731AEFAED556CD47243CF536C27149D7A122D7306E375339D7D1B0B712D1CD053F0400001CBAC1FE9E50A77222DDAF015E0EB2C5F8CA1B9D32F32DF1B0296A8F35A5DF58E5DA1F73E5C3F1FAD9F47DC31B718B2828500CEFF7658559D9A2212EE598B0B1C4A19BA66670CF5A868200232207EC4C417EDA8D252F2388E88A72B7A055AB4D8F3214D017207F1418DC78BD49BE1072D2F3FD2F61D2F5CD578E63300150DF5ABE373CE1F6FB14F2014F5BC0071B17AB2C84E8845FCBF4B15C79FBF2E5E06CFFE6CAD9A283014A975F81C9216B261CBC79EDCD58D0E20C586D7C641E0EE97221BEFE54DBCC56A594DF103EC24B52DDBB6052D1644972640F39DEB98997FEE7A252A65070798B7E46707FA440375B1BA705B3ECC7EAC56D9C45297E585299C7D747B430F0D01E82081C70B4A87846F90267D5163181DED63E089A00AFD33B0E2B3ACE91182D8CC899223CE65A5D84B86BB3E8B34B13949BC800F2145468BA5411EACD6A6C331C340D4442D28EFA0DA959A2797C7181BD4BBE6E6DFFD134CEF373ECB0EC08590F06BE0CE292D3718E2C0EFC7CB40F1DB26F5F38FDC82A72F81AFBBC16591EE02DC818D63CAE69FF0A28F942F7E07F6B0A741F3F0EBE3D0EA5859024AA408462D3D268C23F95D717C0A685A4CA73AD90EE923DB57CD6CDD828B7AB0D4AFA6A9AD7E32D407A44D7515C0A6AF52A66AD72119BA1DAEC6514DE3F8B462EC473072226AAD61135B0F5EC646BA9A127C9894E51FDD1B2D38011A2A6D7497A55283133695D0AF9B3FF7C5A8FD667231F9E511E3B8C4C3ADC44D02DE08C47B2382DE67B32826754C6BE5231CE0FC657341E20247CC6CE574F3D1A9376AC8237B49E5030E877A4E33CDE25D838EAD659EB1678706C759707FC66CE84CC968A8334C18F1632348824A6985A0331A93B59497B70C1A03A6848F18F5992972BC79F07F4222D2612797F495463836AE6CD3858D5B9BDF744A1CF361B5D454D41AC899A4FA61081B937CBABBF0FFEC1B31C162224EA36CA2CD7FCE54EC1A504932ACC5BD0B17A156DA7488F7017E4916A687FDE7FCEBB2901813B07964084AB0447A94DAC3A0D3FDA05B9F497CC1555A8C74838E29CB8CE89D304DEBE419D26BA7F3DC6E9526BD895495A5FF1D7EC83F70D045E306E7C2487A52CD7553F062D31888EF7FD27F667FCFFA984AFE0B9A4C4E85CA943812CDC157C5486B0B5EA6DA05E4BB8697113190321A976D1806DA129101E60A28B7 + +count = 22 +seed = 3222E4B55D6767E300FDE03DB3D8227E19FB8B08EA9B923FEDE18D699DC3694EFFA7C4DAE2AF57E4A0162B7C564199BD +mlen = 759 +msg = 4C4697A7D8195BC7D4B8F2FCF3A7E9419E8FC9AC6BAFC5D658260511C697286BFE44E2CE98C21C98BE42E5AF0FCEEF8AA54C5770AF287A81C7481FE3391A6111AE6243D545B2A651599B45931D7640579F8659A8BD6F77260F235F71476ED64714FDDB70C549CBE089322130F7B0A21F530508970D55CBA55BAEACBEDF684C7979078102ECFFC2C3F182F710280CABC2DECD3D3B5D3CE908CB2307B00FCC0C5412A12AECD041B5F70CC0149390312B9C81592BB0E2ECE83D4495944E29AA798DE67FD69E2BD0695DC573F78D8BB48E6B8679E1C50D1E6E58E218B77EE51597EB43ECF7301D86F457353D60E98CEDC95B4A76844E889BF7E9D03503757569E40D55AB43D63293EDDBB579FE981FFD4DAB056F85006FFB5E759B9C16F5F6B235D7DD78458A73EF37118EDF599AA504E9DB9AB5DBC90B8E478F3DC1F35A7C4604A383BBBB410CFB2C5F746F83EF94BDB2F244D421818C26827D5B7D665B8A802181EB7A9CE95B6633E24D914FECA7E969F64038ACC3009B15168426EDB67AF2CCF4E859F5C616891D355F7910ACFA599C396BBB2D2782CBF1432E6259FAA77730B6B86FE0D67730152CD2AE0F9B0314048CCD25772C01FC9773EBF06618A8CE1E940F48663427775990CDC41C4DD3E9AC6EDA1EA50E04F1D329E64C8532A7AE32238C131753D60A25810A5FFBEAA9007A6984EF69EED92B777E079CE0FF48C2AEE9C18D1DB9F49B5419EC6C0E2212DDD2E2FDEAF0FE9F2B84D9C50DDE86A70FC28BBF8918A973CC67A36E97CE3027D73891E7AEB24BAF4B12A9DC8AAB5D6AFA380BFAC3703D2D32F1E40FBB532FD6D7D710DC0741DFC7EABFE55BA5C311A00E3BE55C2EE74155E3A06685071A962D7532AC76D59FC187EFF01F8D339F74323732168FA5D14F4B2A72C9164A04A6EF14BF5DEB1833E4BAA19A55AE590F542D4448E0EAFF0E0AFD2FB30FD671631B9325F4A0BAC9A43DCD2840185A2F601117A625B0DAD5503578537BE2A535D2F556F371536BCF68C0E01C96301F08E1567DBF9D8504096A8FD89C086DB695DA191099FD1E8EA94035276D1D +pk = 2D8F39E7D087D6A9160F0E05FE56E3C3AD45BBD0C559F5DFCB507FC77F709B58C049A45A628BE083A000CDFF99048C0EF82DBA369FFC9F7DB7F0D300553202705C68AC279512F3F231467475C5AE2AAB7FCAE0867F29BAA5B77B8065873D930302 +sk = 2D8F39E7D087D6A9160F0E05FE56E3C3AD45BBD0C559F5DFCB507FC77F709B58C049A45A628BE083A000CDFF99048C0EF82DBA369FFC9F7DB7F0D300553202705C68AC279512F3F231467475C5AE2AAB7FCAE0867F29BAA5B77B8065873D9303023FB19060EF8D899746E3810608291F88D9224DAACBFE29B3F307000000000000000000000000000000000000000000002A560D8F863248D2CCF10531710CFA58E1AAA737A65D3D91E9F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7BCC8D8BFC3C8F1523B18BB8A3F7E24A515DB409E731BB50A1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007F736937AD1ABAEDB21F8DE22CCA1ACDFED08D2A90A2E53CE8EC359412D68862A57388C5172AF4B3F0D331D6ED339200D011BFE1C628AF563F7910189302E9D06D75998B142F801AD3A4C7BEA9239F83FC8EE8A7C73D9AF613D7CBC7F70C0B00DAB0B0E9B172BC7FD0F59D666F0298C41A7FBA81647C1D34B23F93FC28DA559E77DB18990D8BBFF0244C4CC95BE6E100251EF60AB13569697DE0E7E7E5E0EACD95FDBCF27CAFC84BF49F7A1ADD848692B19F128B4AE076F84D340882C6B49400 +smlen = 983 +sm = FB26906EDC4F0F045A9F24FEB5D837153E3A8BA40C2A7897B8291F15C6190D35EA4890962B676017B436B4FD0C90741651532629EB92AC9569D8A06B6F0835DBE2F04445371A4C220FF595137E379F680DB16DE87DC2837BBB42F56BDA3269010102DF5017520E4004DB488A8B51851B45E23EFC0D6B179F97B20191C3EC4FE49F4FABDCCE3EB472DEC3321BFA4AB2C03158280042093619FB24BDE9B0F6F39B5F20906F86A5A63D7B5F46E701EA770D52636A8EFD769CAD0DE951E3AC974AB64D5CD5AC8800B118A9B6DFE0BC10106738D131C550DE6E4339D5946DCA00040D4C4697A7D8195BC7D4B8F2FCF3A7E9419E8FC9AC6BAFC5D658260511C697286BFE44E2CE98C21C98BE42E5AF0FCEEF8AA54C5770AF287A81C7481FE3391A6111AE6243D545B2A651599B45931D7640579F8659A8BD6F77260F235F71476ED64714FDDB70C549CBE089322130F7B0A21F530508970D55CBA55BAEACBEDF684C7979078102ECFFC2C3F182F710280CABC2DECD3D3B5D3CE908CB2307B00FCC0C5412A12AECD041B5F70CC0149390312B9C81592BB0E2ECE83D4495944E29AA798DE67FD69E2BD0695DC573F78D8BB48E6B8679E1C50D1E6E58E218B77EE51597EB43ECF7301D86F457353D60E98CEDC95B4A76844E889BF7E9D03503757569E40D55AB43D63293EDDBB579FE981FFD4DAB056F85006FFB5E759B9C16F5F6B235D7DD78458A73EF37118EDF599AA504E9DB9AB5DBC90B8E478F3DC1F35A7C4604A383BBBB410CFB2C5F746F83EF94BDB2F244D421818C26827D5B7D665B8A802181EB7A9CE95B6633E24D914FECA7E969F64038ACC3009B15168426EDB67AF2CCF4E859F5C616891D355F7910ACFA599C396BBB2D2782CBF1432E6259FAA77730B6B86FE0D67730152CD2AE0F9B0314048CCD25772C01FC9773EBF06618A8CE1E940F48663427775990CDC41C4DD3E9AC6EDA1EA50E04F1D329E64C8532A7AE32238C131753D60A25810A5FFBEAA9007A6984EF69EED92B777E079CE0FF48C2AEE9C18D1DB9F49B5419EC6C0E2212DDD2E2FDEAF0FE9F2B84D9C50DDE86A70FC28BBF8918A973CC67A36E97CE3027D73891E7AEB24BAF4B12A9DC8AAB5D6AFA380BFAC3703D2D32F1E40FBB532FD6D7D710DC0741DFC7EABFE55BA5C311A00E3BE55C2EE74155E3A06685071A962D7532AC76D59FC187EFF01F8D339F74323732168FA5D14F4B2A72C9164A04A6EF14BF5DEB1833E4BAA19A55AE590F542D4448E0EAFF0E0AFD2FB30FD671631B9325F4A0BAC9A43DCD2840185A2F601117A625B0DAD5503578537BE2A535D2F556F371536BCF68C0E01C96301F08E1567DBF9D8504096A8FD89C086DB695DA191099FD1E8EA94035276D1D + +count = 23 +seed = F41B3C6225245C06455272A6A073F363E5F19F09A0B146AFCDFC2B3B0EA64BAA3F90359F32B2D1017608B03064E90AB2 +mlen = 792 +msg = 72713EA55F1E5CCD5787F172657C6F6C74081DE2D70816E8531497965DF02DAC04D91C4D09DCF8904CB152E2138F829386F4351015DA253A5B5EB92D96E537DAE3CE809443EA90332D9C754EB11F4DE586A83B5DEE7B1B9BD547EE7107530249B14279BAA04683D74B69D7BFC8BBCD447FE7706593C01188FE6AD8D0E2572D49F83E93986B380D4169BDD94E3311941DD2B041DFABC5AEA1297C65BB5C8352C99FF838D46B93B3E5F79E3CC5BE5408FE5E59A10D488DD65A997B086FDD96CEFB0247B2BAF7B490317E34330A879D04E374C92ADA33EE243D84DA015FDDEC243B00BD7488AEFE373E8AB1890273A7A2285988E9DAF9C4E7C5A17F54AD6195EDE2C79657E1BCCED0641E20F7EE26EAF53DD8C82827F2D2783D44FB030C95791F41653E628062267A5CF534DF00116C1ED1DE9F360B97555C65CDD80724104FB1BD4DA5785B5D9C24438557E48AEE58D57A03E06D553B05B67E1C8D10085C2F153647F174F7922FB8D2210454F7014BDDBC627756EB7CDEF99B6E3A2779F82088E3F2DA14C2DCB5B185AEB5D6ACBFAD43E286AAE8F84A58E8DF6ABC64E4A8EFD69FEA18DBFA6808F25FD418DE8BA923500B74E34DDA3CA6AD8DC208102DC4A876D8B8CD2926AEA4B3AE11A546F6235ABEA152DBDF43E0BCDFCDC83299207F294A707C8B4D1F56AA64A205C718ACA69B862AFE7489F11B324E7AF6BE68380D2CA6E0AF0E2E20F890F2CF98907A9D43135C03E85E86C9EE417140EFEE9054B46C110A84F1841AE3CFAFE5B4A95D6B2B606D8D0A70BAEA85C9412BC2D54146E9F866800E8E8615A0D64D1D595677E8C88699E3CA6097D47E9FE64050FB55033FAD4D5F226DA8EB5DDF99369ACC7552927ED3AC7368B9EFEA2443926DF26D1C172858FD8A5D4E1D7D39E7F7DF047385D39131184087CDC45B299BD1F7048E918223DA3F960608E853EE49EA667465DBBD889CBDA20FFBB540C9EBBA5C2CD16A22A57B561E01331D6EA6BDADBD6A5D2BD1441EF4E1D9DD11CC62A0FA5BBFFCBED0D27B6ACAF0889EAA5863DD9BB35920707B71A0805630D1769FEA320516E71CB2B125AC274F16F7A6876F4B922C7C006F38AE1F7183CA768715D2AF +pk = 3AF62725D562F71077EF0853C89799517970B9F21F468880603D471B51B568B882B008ADB7AE444F86FF88BDD229FB14520D8B9C598EEC0F2002256934F53545A43EC2DAB64B53C55C2CC821DE0516A25340BD8C19E20378CDFD0A5541C3221502 +sk = 3AF62725D562F71077EF0853C89799517970B9F21F468880603D471B51B568B882B008ADB7AE444F86FF88BDD229FB14520D8B9C598EEC0F2002256934F53545A43EC2DAB64B53C55C2CC821DE0516A25340BD8C19E20378CDFD0A5541C322150247736F970812DC57E3D25EB7E8FE0E32D026264B65397C8C4B050000000000000000000000000000000000000000000024195B78268BB326AA68B19C2598D91E6E5733495765F5268CF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5F6C91621B6834D7D87A45E88AA136C19A5E4E5D5B33775C4FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064B1993FA96CFB89487FB7642876A132C965658A4FA387AC133A67C7E45C8D30149FA8F34D7F9756178E7B111F367000CF742D7EBD10FA4A0A6AC535E4C9B8C29C80A8B8F606023AB3C8323EC4D2BC8FB28918EF9113F4435FCC81D161D2520063A07ADB09D33758D7A30DA1DCAD093B35B56A0B31AFA7B9A0E0B1E0D772017840CD061C085B0FAFB753515390723200DCFEDA3C41F695268A8D770EFFFF86EA8A95F571BA50B848BF7E80CB57199923D3CDF9CB92B004771878F9C4AC28E300 +smlen = 1016 +sm = 13E9718E31966099214A6742D4352C8EB869D275A0C45C43697E69B3891F69F6018392DD4277A9E4892153DD14FBFE405E4AD91AA959E772E372DEACF9BDF7B14007717AD6AA5079DF4B9978A4C8BE4979FB097BCD1126348E5CE9D25AA6A00E0002DDEB2EECF7A42F95948DAFAE0C2571D98B0EA22241039A5E019A88FDEF1591B481B62138CBB7A1D4DB4CE7B656865ABF0903E5366EACFDD819746539C3D06C88C0A577A83F53A1896176028E26BC150E91202678AECABD374B2690A5ABF9027BBFC4060395F7D11A0A54CCD0AB6B86ACC49657DB7BE4663AB2C1AC000D0272713EA55F1E5CCD5787F172657C6F6C74081DE2D70816E8531497965DF02DAC04D91C4D09DCF8904CB152E2138F829386F4351015DA253A5B5EB92D96E537DAE3CE809443EA90332D9C754EB11F4DE586A83B5DEE7B1B9BD547EE7107530249B14279BAA04683D74B69D7BFC8BBCD447FE7706593C01188FE6AD8D0E2572D49F83E93986B380D4169BDD94E3311941DD2B041DFABC5AEA1297C65BB5C8352C99FF838D46B93B3E5F79E3CC5BE5408FE5E59A10D488DD65A997B086FDD96CEFB0247B2BAF7B490317E34330A879D04E374C92ADA33EE243D84DA015FDDEC243B00BD7488AEFE373E8AB1890273A7A2285988E9DAF9C4E7C5A17F54AD6195EDE2C79657E1BCCED0641E20F7EE26EAF53DD8C82827F2D2783D44FB030C95791F41653E628062267A5CF534DF00116C1ED1DE9F360B97555C65CDD80724104FB1BD4DA5785B5D9C24438557E48AEE58D57A03E06D553B05B67E1C8D10085C2F153647F174F7922FB8D2210454F7014BDDBC627756EB7CDEF99B6E3A2779F82088E3F2DA14C2DCB5B185AEB5D6ACBFAD43E286AAE8F84A58E8DF6ABC64E4A8EFD69FEA18DBFA6808F25FD418DE8BA923500B74E34DDA3CA6AD8DC208102DC4A876D8B8CD2926AEA4B3AE11A546F6235ABEA152DBDF43E0BCDFCDC83299207F294A707C8B4D1F56AA64A205C718ACA69B862AFE7489F11B324E7AF6BE68380D2CA6E0AF0E2E20F890F2CF98907A9D43135C03E85E86C9EE417140EFEE9054B46C110A84F1841AE3CFAFE5B4A95D6B2B606D8D0A70BAEA85C9412BC2D54146E9F866800E8E8615A0D64D1D595677E8C88699E3CA6097D47E9FE64050FB55033FAD4D5F226DA8EB5DDF99369ACC7552927ED3AC7368B9EFEA2443926DF26D1C172858FD8A5D4E1D7D39E7F7DF047385D39131184087CDC45B299BD1F7048E918223DA3F960608E853EE49EA667465DBBD889CBDA20FFBB540C9EBBA5C2CD16A22A57B561E01331D6EA6BDADBD6A5D2BD1441EF4E1D9DD11CC62A0FA5BBFFCBED0D27B6ACAF0889EAA5863DD9BB35920707B71A0805630D1769FEA320516E71CB2B125AC274F16F7A6876F4B922C7C006F38AE1F7183CA768715D2AF + +count = 24 +seed = A08AD391E0FC57A83B74CA8CF44DB67F8178262ED9B20AA0163CDD8274AC2BE05F558B112B094244370C1AAAB75077E6 +mlen = 825 +msg = 209658CD1D801079FFE8E950BAFD70A028CFCC35B9FB00D232C5603A1D51BA13E5DE59E0277962C4474E9F3F60FCD99C9B79665B3839D5C037B921A4DE8E144FA1D38182FBDEECDA6934E814D9186591F01C5E23349B34F4439B4D402C4072CB4D702966AB473D2C39443F41FBDD0C48E566D33E076422EE72FB47B2FFD661F367E9EFDDC988BCA02382EF93590D4FE3ECE8B1D9D8B3A653219C7D131B43E2FDE2851541F467C31129E6F9B9D124221CD52610B9F138EAC1D01F193148FA0415B29F5C86D15067EB1E26C9D51F05655E8545F734F8F244854AD76C6B04C230898BEA33EFDCEEF100D79F8E3B894BA583466749B82007067806E3A7B3BA954F6FC5ABFF0E099A24D14D865F6F4538736124ACC5EAD4169DDF2144AD558DA3C74CDABEC147D2AFA113EDFD1E2280766B18792310FB6B4FE5D0D9F65906B1CC43655BB3D6178EF9093AC9C8F1A91BF49008179394EEE79E1D8E3228F567770C1BA1E30BA4BCE2465AB68F53CE21C0D8AB2F6E535828F211D4DB957DC3AF8B7E00DABD8F1F74C959B2AFF45121C5B5ABD3136C6F55D5F5FFDBCEBC3CD7A430FF3813D23BCDC1254FE6949DA4E7694028B7FCB876099E91B92C65D85C39D4BE9325AFE81703E5B18CBD7BD9EB59A9BB9408ABD966ADE9A60303807AD1B2C14C04CDF8FAE6950A55B21C9EBB5E94713BF8C2890215C5DA94B59CB31EDC671093B15FF5014DB4CD3EA8060260DC1612E9FD6E5AB40F0656121F689C8E94212269A7B24305C83BF0583418755CE690913CB081F2893FB42BC4750F2C053C48C1552430793CDDE1A49AC9E21913210D727C4BEB5640AB9B7505EA4E59AF417A085394181784BF1BB0BC32BD71CC57CE77541581F14B8BA4B758500694796262B561A38C72893C77B548D779A3833EEB064CDDBA5471CBFFBC769E139946155BF376A56415AB743DE568CD21895ED6951B5BFE1B1629DD6510DCD4483F206954964E0517546DD96900A2540A51835818D1730B0C9123E7FD8B28E6843BFFB659945A273CEA944FF6E83C234B3E43DB4630614E0B67778EA760EE341FE68C525E90475A1560821AE6B2A85015292C36EAA2E041AC04FB55922C48204525187C7E0476A9FED04EFBBA96F369D8AE709506620127FD399613A9796C4FF96D7E +pk = 3A0B6C35209AE27BF955881BC85D04962D22239B23DC1D69179089213B49E0F18C3C1DBE5D4E7F5DE6D8BA2DCF037F110D6399319E4CFCBA8147726BAFA792A69A01F9846180C96AD073251600C0F2128FD02B89E2C7466CB8020B2AC70F1E0D0C +sk = 3A0B6C35209AE27BF955881BC85D04962D22239B23DC1D69179089213B49E0F18C3C1DBE5D4E7F5DE6D8BA2DCF037F110D6399319E4CFCBA8147726BAFA792A69A01F9846180C96AD073251600C0F2128FD02B89E2C7466CB8020B2AC70F1E0D0CFD906CA23FB558012EF7B02EF0ABAE6A42E1D45351FA5932D60200000000000000000000000000000000000000000000C2058AA27E4018FD87C65121DEFEA980D3BC139FE2EB16FEB8FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5274001C5C93FADC3F3E96B4AD651805D596B05E39F9F9C64FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E7AA4547A81F7A8EE1B774163A800E5144FC86684E99D47207973CFF4571A534C82FFB1D56DAA763909517D65904AE00ABAC161CC7BD6475AF4F18982622638890058DD1B0BC8AFAE597565BC9A2A03CA460F77B633881A86943E83A5944B60022A3BC97A99E7BC4A08911CA9BFF3ABD2F6941F40B50A355F859623669CAE7BADE813688BECB3C3CF68DD24F52AE7600317F226473B4A18F67C7CD3AC84B3CF86C853FD28BD457DF695D8C244CF5EDE5E7550D64E6466A7260E1D2DD9D5EB600 +smlen = 1049 +sm = CBAEEC4A5203560F0387940B2A0E55B6EC06F4B3A1ED13159AA18621DC942D1A1C53C56129787713DA9926EE2D0BE22F31F4F623CCEC8B4055473B1BB6CFC35DC95245E328B7FF9D8398AB50B85B9DDE824B5B0B4CDDECA0CD669574BF32C43A01026448198D6752EC6CB713FFE85B813A475A9A6D7C37B0D2500111D1C2BEEB21E711F0178C7EDC92090EE208D57BC73D123100643B66A9EC1BD61716C4B308A309805C2D5F0D89C26FD5AE00AA02352CFA6B6F123C28B8993AB0B1F2ABB0D352FF8841C10123E14B19E1FE9D27A503A468DAC0A1170D6DCFCB8FEE85001515209658CD1D801079FFE8E950BAFD70A028CFCC35B9FB00D232C5603A1D51BA13E5DE59E0277962C4474E9F3F60FCD99C9B79665B3839D5C037B921A4DE8E144FA1D38182FBDEECDA6934E814D9186591F01C5E23349B34F4439B4D402C4072CB4D702966AB473D2C39443F41FBDD0C48E566D33E076422EE72FB47B2FFD661F367E9EFDDC988BCA02382EF93590D4FE3ECE8B1D9D8B3A653219C7D131B43E2FDE2851541F467C31129E6F9B9D124221CD52610B9F138EAC1D01F193148FA0415B29F5C86D15067EB1E26C9D51F05655E8545F734F8F244854AD76C6B04C230898BEA33EFDCEEF100D79F8E3B894BA583466749B82007067806E3A7B3BA954F6FC5ABFF0E099A24D14D865F6F4538736124ACC5EAD4169DDF2144AD558DA3C74CDABEC147D2AFA113EDFD1E2280766B18792310FB6B4FE5D0D9F65906B1CC43655BB3D6178EF9093AC9C8F1A91BF49008179394EEE79E1D8E3228F567770C1BA1E30BA4BCE2465AB68F53CE21C0D8AB2F6E535828F211D4DB957DC3AF8B7E00DABD8F1F74C959B2AFF45121C5B5ABD3136C6F55D5F5FFDBCEBC3CD7A430FF3813D23BCDC1254FE6949DA4E7694028B7FCB876099E91B92C65D85C39D4BE9325AFE81703E5B18CBD7BD9EB59A9BB9408ABD966ADE9A60303807AD1B2C14C04CDF8FAE6950A55B21C9EBB5E94713BF8C2890215C5DA94B59CB31EDC671093B15FF5014DB4CD3EA8060260DC1612E9FD6E5AB40F0656121F689C8E94212269A7B24305C83BF0583418755CE690913CB081F2893FB42BC4750F2C053C48C1552430793CDDE1A49AC9E21913210D727C4BEB5640AB9B7505EA4E59AF417A085394181784BF1BB0BC32BD71CC57CE77541581F14B8BA4B758500694796262B561A38C72893C77B548D779A3833EEB064CDDBA5471CBFFBC769E139946155BF376A56415AB743DE568CD21895ED6951B5BFE1B1629DD6510DCD4483F206954964E0517546DD96900A2540A51835818D1730B0C9123E7FD8B28E6843BFFB659945A273CEA944FF6E83C234B3E43DB4630614E0B67778EA760EE341FE68C525E90475A1560821AE6B2A85015292C36EAA2E041AC04FB55922C48204525187C7E0476A9FED04EFBBA96F369D8AE709506620127FD399613A9796C4FF96D7E + +count = 25 +seed = 6E0A8EF5156D693FD0140BC4A31084E79773A83F42C8D133AC8A9D62DE3CD74511F893DCB26041E6B35E2B175408FCE7 +mlen = 858 +msg = 8F37A065DD696AD437EC82909261B842EC0A3E66F8AC574105A3C82EC8B4926F2466FA550F8EA1B6A9A142C00AFA44BE6512A85350930DFFC99B95AA21012057051B68C48581AE439B9290A163AA4B6AFCF80FFB91A3321C7B9ABAD56D5DC1BE4E67E5576C9F3A7DB96071859B94EB22A73DD96C66AE67AB11D1AB62A86D826C682DFB8CCA3259DCB5B34BE635421CD4206E7D92147F14C36424EAA407B441F58E5C187E58A26B2AE144888A3CC1387AC7D0A681EEDDC3B7781AB282E8185CCF33FB27500CFD119E0415DB1E45237520A868C8457C88A1D3EE97EC9451DA35D7E74924F8902949E7EB14BA87C8AC672D7E4F3BEC1B2814DFA67A8DD2E2D4FF4661D64BC4C6D6A78D4E489689B6063CDFF5A3F1554501B424284A9F4B8FE777FE4E6AFB83A85E36200A9AB40B9C18678454B2A3F50A4862BA1E36F0C57AD004FF90192B5619614E37DBB38A1B8A65AC613F7796C70772128377065B84F122540106D1B4F9123C4E009B4C0A85D59B35F72DEBDDD154ABEC7F3FB25FD1FA04367386098DE610B26FA3ECB031A6072D14607E92FFBE195ABFF71E586A984131AF24E18AE94DBAB0544FD2AD217960F337111BFBD4046809EA03C7C47B7177757A4A43E1FD0134859BA735A8FC17597E593BB58322136602954D3A21096B0D1DEE5CF0AD17A5FCF561FFA21CAA70D33998840E4CFA18BA481704A8B82D2CC1C110FC9A6704751365AE9F338AFE4CF9C811697DDDFA8635A2F3CD02DD1845251014BF2F2D6C02A907BD783207C4773A937048A07C500D7C424B5F65A2C376523740DF9A0B60437CB8AE17D64DD51DD4E433AF83B20C4B6B890B97976DF09E3A86AC19006C229D59FC7A2923245B7B1F0ACF7C42E486D41CA1AC1D7051AEEF6003CE94182F97D099C74317F61EB47AE18C2BED6A3CB253C21EC835E435123E0A657ED926F880CE8E5DE3155272328A467278F52AC50A1121AE818A3EA3A2E1F7401CE23AAF66A4AC289748A7E98A5124C586D8957BB4EDD3F091492BB1A64D75EFCD45AD51CA420F15DA848B20DC6BB765E7B71359B3A9E95E121266AE4A40DC2E9A3D81EA1B1A643594B3D4E6ABB7D1202201DE92BDF0CC1ED977E2D5851822A01F48A6F23180822888CE345AC9BE0CC69BC448D41CA20B79C35B1DAD73E6C683E70C4439B404CBF07FCC39B0E5A1D33F3717A6BAD28A6DA4F091BC7A +pk = B2E7705256B2693C2EB23F53FAC819A0299CC1943BD8A412586E754E18DBCD52BBF89E6A1B0A10CF4B4D5A29A04C443293141D24B2ED40F14CE23063AD5211606455CC43D23829A23DBFF5DF973B05298AECA0848F580372C1F2B27B1BF5200815 +sk = B2E7705256B2693C2EB23F53FAC819A0299CC1943BD8A412586E754E18DBCD52BBF89E6A1B0A10CF4B4D5A29A04C443293141D24B2ED40F14CE23063AD5211606455CC43D23829A23DBFF5DF973B05298AECA0848F580372C1F2B27B1BF52008152B47C54F960F686F31CAED72EAF95B004F275EF75DA294091D0800000000000000000000000000000000000000000000721D667CF68D6ABBCFE1171C1AEEAD704B891105D60D493747F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9648260299BD66DFD92213577197BC20D1B9069FB9E30F7B5F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B6773C6BCDF04F6856989DF4BCD5C02AB613E100133AA3DE1BDFFF7EED4A228CA6E680A555E6A9E179C7DA730B481D00616C654B4E44ECFFE445101E0FFFA948D7CBC4CA0B57F647B6E22D72B37F3667D3648997A4F3B607BEB138BE43A1FA009F62927C327D6D3DEC251AB6F2C284720A8309E8F006A83BBB32F1DDE2658943D316C796201022FC53C3474494DABE00540DDE345CABADDF4956484304FAD03EB43CE54AE1D3E6B41D6C287EF8CA2640A46BA868E53FF6949B16ADA3D90A0400 +smlen = 1082 +sm = 320E8600CEFB3118461C029E34FA55F51727D55DED48B58C231947DF2CB9ECCFB573D6D0640FCAFEB94577AAB312F81F4AB9123740D86EAF073B30F222ECF1AFFD00646B572D5B71228EB086B8EB298ABB778BAA576C52B5E7EBBB6A4F96AE210200904558F05CF0E38CCAA1EEA53B5FD0031D5C1BB3687FEF7100A3DB25140B95D8AE4690FD2E4457CB9B0796E1696CA3AF5C00058E65BDB5998D3259DDFC58B65F3CCDD5D423937C3C5EF600964686EB2CAAB5396707467C9E49EB6860E13A32ADC17D7200F1B8CBDBB532986FC869F7FBAD4BFA93747B5C7F43AD5C00020D8F37A065DD696AD437EC82909261B842EC0A3E66F8AC574105A3C82EC8B4926F2466FA550F8EA1B6A9A142C00AFA44BE6512A85350930DFFC99B95AA21012057051B68C48581AE439B9290A163AA4B6AFCF80FFB91A3321C7B9ABAD56D5DC1BE4E67E5576C9F3A7DB96071859B94EB22A73DD96C66AE67AB11D1AB62A86D826C682DFB8CCA3259DCB5B34BE635421CD4206E7D92147F14C36424EAA407B441F58E5C187E58A26B2AE144888A3CC1387AC7D0A681EEDDC3B7781AB282E8185CCF33FB27500CFD119E0415DB1E45237520A868C8457C88A1D3EE97EC9451DA35D7E74924F8902949E7EB14BA87C8AC672D7E4F3BEC1B2814DFA67A8DD2E2D4FF4661D64BC4C6D6A78D4E489689B6063CDFF5A3F1554501B424284A9F4B8FE777FE4E6AFB83A85E36200A9AB40B9C18678454B2A3F50A4862BA1E36F0C57AD004FF90192B5619614E37DBB38A1B8A65AC613F7796C70772128377065B84F122540106D1B4F9123C4E009B4C0A85D59B35F72DEBDDD154ABEC7F3FB25FD1FA04367386098DE610B26FA3ECB031A6072D14607E92FFBE195ABFF71E586A984131AF24E18AE94DBAB0544FD2AD217960F337111BFBD4046809EA03C7C47B7177757A4A43E1FD0134859BA735A8FC17597E593BB58322136602954D3A21096B0D1DEE5CF0AD17A5FCF561FFA21CAA70D33998840E4CFA18BA481704A8B82D2CC1C110FC9A6704751365AE9F338AFE4CF9C811697DDDFA8635A2F3CD02DD1845251014BF2F2D6C02A907BD783207C4773A937048A07C500D7C424B5F65A2C376523740DF9A0B60437CB8AE17D64DD51DD4E433AF83B20C4B6B890B97976DF09E3A86AC19006C229D59FC7A2923245B7B1F0ACF7C42E486D41CA1AC1D7051AEEF6003CE94182F97D099C74317F61EB47AE18C2BED6A3CB253C21EC835E435123E0A657ED926F880CE8E5DE3155272328A467278F52AC50A1121AE818A3EA3A2E1F7401CE23AAF66A4AC289748A7E98A5124C586D8957BB4EDD3F091492BB1A64D75EFCD45AD51CA420F15DA848B20DC6BB765E7B71359B3A9E95E121266AE4A40DC2E9A3D81EA1B1A643594B3D4E6ABB7D1202201DE92BDF0CC1ED977E2D5851822A01F48A6F23180822888CE345AC9BE0CC69BC448D41CA20B79C35B1DAD73E6C683E70C4439B404CBF07FCC39B0E5A1D33F3717A6BAD28A6DA4F091BC7A + +count = 26 +seed = 49CC05312D1DBE216FF03B60575017A6A1464C06D2C5A4A6F973AD9F275F7C66163A29A803BE759B117043862D277C27 +mlen = 891 +msg = 30D61C6FBD64113FCED8C5205026EBAC0D9F3522182617CB00B6E70C8DA62ECC1BBC8E1FDAF17CC61DD01CE85A9072CC1D9D34FDADBA5B93E0AAB4C9C4C9E26D3F7F145FCB23673B6E0B373C0FD1A58F52486B72624EF91A539519EE5305772A006E49521744912BCF3CDBAD424F00428AA96CCC21D000EFB09DA5CE652E361A6FB649A060835E3B9DC9CBEC660C7531620115EC905DCA6EE2A1CE36554C0FC1D6DD6863B8F3843508ED5C214B6923E7F5C0304E9B0D5E5E433BD029116A33A60CB980737AC950577D0594BFE0AD2225CB8D3FA42F192B0EC05A49391632A32FA931C0FBD83A7B6EA24301AD0906E7911F9D900D19AE1247ABABB1C0E9B9BD165185D9D7413EA068FE8824CCE5B3AD51FE8E2BB2C4022C61B002C1DF4852E4910F38613787CA12371038B6364D920E07B4B417401253451DDC25624B5D038B2DFE29B8494EC960F87803CAA256A95C9868AF819747E4BF26FAABA6DDBAED93A7815C795AD5EB7FB4592DF678AC1375388CC7ED3A6230CBE80ABBB113C80B70C789CF0C66B943E67CE814F12D3D83F3B90A4320FEB7FB81DC93B05D7FE2D36584399214D3D7C71AEF322A5D04B5470703B3660BF86B0B17BA9FF23E45F7BEFEC3758786D2111C81BA4D81B83FEEA35A0668E5EB3694963BB4DB3ACCE4FCBA6F3F6FED9627580DD2D2DC103EF7E52BB9745BD42A7FBDB459B5C8AAEBA67686EB899E3177FAF0897C61B008ACE3304C41B4C79E2EF9C865E9958D8716BDDB69154FB33187D927B5296C1589FB1AE3D553F116FF6CAE56910CE6717C446B9947AB2A981A8F5999C1C6E517EB3FE584F5D10059910E22F40FBDDB709C9F686F51ABF7D7206A8BAB4A346B51523C362D749238D7EF6671A89CD86A8540604F134D760267E91EB92FC0FC275CAB69C776EF81DBAD35027E5307F1D34EBF5D6E4DF424D709666A1E649C044C4930098B2E6E3782A93976B55073C504563C7E052B6816C07F0FD54A759D2BC189FAC3FF54549FC4DE192EFB58A9E301863A77380967735910F63D35EF5FDBD8751DE4BC6BF2E3095628DC7F67C1F5571D17AA342593B2C7F953C3F0F22DA1862122031BBEAF0D00A029C043304E3E2609C4FED8A7404FA10E2EC846A70EB0E37C5BE61E698CF2296EC1FBE6FED75F6FE3113C23B29AFB5A6D7E3A9E46E2D89D8C06450CEA11492C1A97F7D6BE8FF6C014930043022B264FD32593952BC606F779598631E48EED86EC2A013D8EB866F311A400 +pk = C234D53CCE8BB0CC57975D3BFD6DAD1335BE362042F9549CD5AE7FB454E137875C078EF2DB0EE7252D6D1A6F6CF3E51AEF5F0E95765704276B3553383D73AC84A94D8D6625B1DED871A3EE6D47163B9BA9C652B0E5A6A75CCA7216D04239310F1D +sk = C234D53CCE8BB0CC57975D3BFD6DAD1335BE362042F9549CD5AE7FB454E137875C078EF2DB0EE7252D6D1A6F6CF3E51AEF5F0E95765704276B3553383D73AC84A94D8D6625B1DED871A3EE6D47163B9BA9C652B0E5A6A75CCA7216D04239310F1DBBCD13C8474E8C5A6A0B5E4793EEB49748A055C1C411BE57D80400000000000000000000000000000000000000000000BC329AE48A8CF82B2ADAEE8282288CB3A795AEDDFA80E7DED2F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA764D5C951513B8F6331CF455EF22B04D4E5952DA61FBD710BFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077CEF086A10A5B9752A9D28E716BA4554C262E5C8F6982C97F066A5A6069F8431799823959DE372D70F54D6445DA500FE0CCF9E0C9217AD7D9158FFBC0FC1EB3D9B571F3F1404E79769143FB52488557E98BB97F9D5ABEEDB06E891EFE016009839C0547748A87F9B06D6BEC57C8FD57FA972014EEAB39F68167CFCEFA854D8B516BBE6A05C4B1DA61B1E4BACB7C0002B23082A6FCA07BA17802D118396757606AC352A190ABFC0EBDD3BBB9E9214CF8ED92207253075BA44F2911EF1D3D600 +smlen = 1115 +sm = 2AAC28AD35D40887E34571B9E214D398776961A80062EEFF1B82FF4953F5615A3A4E3870960600C4A7D9B0F3740B7E3810CC2AF394E25A041A7094DF4CDEB7FABCE0556636C3BC663287749BCD9988FF8B68353734A65F82D6AAFF277644BB090002B294196B4202E2A4781B84DA6EF791F8E6627E53C6DBFC310191C13BE91720602CD5466D75A182D91C0A621ED8258D987502A2C69FAE791A4E0AC5F264F258BE3B1C67D5CC37706A6810032B7F2EC2D94CF82E5250A4CEB9F0CC357B99E74ADC23FBFB025BF597D9E070BF272CA770FCF3D17AB39D5CAB50481ADA000D0230D61C6FBD64113FCED8C5205026EBAC0D9F3522182617CB00B6E70C8DA62ECC1BBC8E1FDAF17CC61DD01CE85A9072CC1D9D34FDADBA5B93E0AAB4C9C4C9E26D3F7F145FCB23673B6E0B373C0FD1A58F52486B72624EF91A539519EE5305772A006E49521744912BCF3CDBAD424F00428AA96CCC21D000EFB09DA5CE652E361A6FB649A060835E3B9DC9CBEC660C7531620115EC905DCA6EE2A1CE36554C0FC1D6DD6863B8F3843508ED5C214B6923E7F5C0304E9B0D5E5E433BD029116A33A60CB980737AC950577D0594BFE0AD2225CB8D3FA42F192B0EC05A49391632A32FA931C0FBD83A7B6EA24301AD0906E7911F9D900D19AE1247ABABB1C0E9B9BD165185D9D7413EA068FE8824CCE5B3AD51FE8E2BB2C4022C61B002C1DF4852E4910F38613787CA12371038B6364D920E07B4B417401253451DDC25624B5D038B2DFE29B8494EC960F87803CAA256A95C9868AF819747E4BF26FAABA6DDBAED93A7815C795AD5EB7FB4592DF678AC1375388CC7ED3A6230CBE80ABBB113C80B70C789CF0C66B943E67CE814F12D3D83F3B90A4320FEB7FB81DC93B05D7FE2D36584399214D3D7C71AEF322A5D04B5470703B3660BF86B0B17BA9FF23E45F7BEFEC3758786D2111C81BA4D81B83FEEA35A0668E5EB3694963BB4DB3ACCE4FCBA6F3F6FED9627580DD2D2DC103EF7E52BB9745BD42A7FBDB459B5C8AAEBA67686EB899E3177FAF0897C61B008ACE3304C41B4C79E2EF9C865E9958D8716BDDB69154FB33187D927B5296C1589FB1AE3D553F116FF6CAE56910CE6717C446B9947AB2A981A8F5999C1C6E517EB3FE584F5D10059910E22F40FBDDB709C9F686F51ABF7D7206A8BAB4A346B51523C362D749238D7EF6671A89CD86A8540604F134D760267E91EB92FC0FC275CAB69C776EF81DBAD35027E5307F1D34EBF5D6E4DF424D709666A1E649C044C4930098B2E6E3782A93976B55073C504563C7E052B6816C07F0FD54A759D2BC189FAC3FF54549FC4DE192EFB58A9E301863A77380967735910F63D35EF5FDBD8751DE4BC6BF2E3095628DC7F67C1F5571D17AA342593B2C7F953C3F0F22DA1862122031BBEAF0D00A029C043304E3E2609C4FED8A7404FA10E2EC846A70EB0E37C5BE61E698CF2296EC1FBE6FED75F6FE3113C23B29AFB5A6D7E3A9E46E2D89D8C06450CEA11492C1A97F7D6BE8FF6C014930043022B264FD32593952BC606F779598631E48EED86EC2A013D8EB866F311A400 + +count = 27 +seed = C33EE43A9CBB4347BFAF71147B7FBDD88D212462CB06FBE695A35402C503CD15732B7D0E8BF829A555B9167BCFA2F2BF +mlen = 924 +msg = C83441B16B39BD7993766E7260D07751AF2F19A41E70689B0EEED0C118D9EF109866AAEF31B2D2962A25A3D1CA999214CDF0EB54598382EEAD64435B7122D275EA8879BD47B41EB64EA908867FD78ECFBE8E992A2636AA7477DE5058179565D3A2CEB8ACE5C0302018043C411D89975A64927B48CB622A13F1ED85CC1113897A68488161AFA1E636EC786A0AA37B928BA88A50164A9EC372523AA9EC8885AA9C95B29F7CA1BBF0652BAC195BA94E976D336B69A9F5346B4C7C81457F802DC9757C7A2435A617317340F764C1A2AE131A716318F00AF0EFA89D3B57D8F31E155598B3944D950D6A1D6485B509358EFB3745B95EDC30DCFF02574F54DFB2D31B259D132D18897DF868115679F06D41102CD4EED4EA290F711148B99B647B8555A4C0DCA1D2D0871C59AB1382A2D6417E6236D71E2BFA1A75CDA54F93E6C087D611878AC7670A04FD7D8CB0993F456E3BC1C3B5898076E22D2D9E0EEBC7D7BB8D142BD2B5F6FA42B40BF676FB69C532D7520A4A105EF0C1337F53D6E9B4BA17F1E76AF4CFDF08F794752D2BF71E8777E2A209F8891B1A53D7BF2A5786B00B9A0CD0FCE79408F26BEFA2535BE188A68201B1514074CD70660971F86E8D3E92790AE7AC591AA7A996149BCDF060C615209FFAB82E6000F41B2A5606FDAF4CD08CAB0C2F1103B2436B1FD7DEC477C6233FBCA3B07A0CA01BF3476BFE5334E32AAA2ED35D5747D673E7BB622E1AA7901C77F28A3AB2197C8B8253A1D28C969EEE73D17AD71C7919E7F217BA2BADBD1EBF986CFE981024FC347028C1109CD4204C7D53535A9B677E39A43193E054D0FD68104D88934DC7BA6CB3E942AEC744B935CDCFEEF4221784F96798E650FFB0FEBF2715D75339D0CB6C2E57C1E9D10F13E6786B7F041AB307B8CFA51A2F10B622995230FBA54B70D94AE278EC224D9D0950BA97BEBA7EEB0E2FBC4093E548D9EC09CA1A08E5F0483024D7C1927FF8DC270900D42D31B81B13A29839BD746CBB3591BC33817741A31DEA308F549A74F3A4E5478844183B8D7363AC1F4D4A5E907D9ED98AFD08FB8BAA84C324563495387A4F12C239FB63F0810447131311B2D2CA302C7DA2DA57C94C3B5E844F537886FB766EC0E977254DBCA8FC84AD77430428F0692E55D8E2CAB294B857AB51A2CE4A725433DF28D9CABA86C770743AD987BBA58C0565BD18590931E283292889294B607A5F19D9E905AA3940836E2A74A2E94FF3062E85A5C6C978B5EB2B254BBCDE128280E6CF02C11A0C2066F349E3C6C083965D5B8A9C000E15FF36C5BF3A6D42 +pk = F439E6150EBA5AC8052981BCC89B84E619882C6E5D5B7E8055D986E5A2DA688188AC5D76078C7427B88C63AF85EF313D0C398837BACA9EC0B5AB5F83703AEF2509A749018F15D6AA61058851B92D80A523FE495F5BEDAB4FDFC0FA4947E9572A02 +sk = F439E6150EBA5AC8052981BCC89B84E619882C6E5D5B7E8055D986E5A2DA688188AC5D76078C7427B88C63AF85EF313D0C398837BACA9EC0B5AB5F83703AEF2509A749018F15D6AA61058851B92D80A523FE495F5BEDAB4FDFC0FA4947E9572A028114B8E7FDA7E023A500C7B7DAD2E349E868C729463814DA6E01000000000000000000000000000000000000000000001C31E8F4F04F2E9BB31D5C7027D9E1B7ADD04DE124BC0012F3FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF951CDE6BF2D7D496F7F7244FC9FEBF3CC002690CAE23E4FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000653E7C9341235CB28085468218141506F6255775D6419B2275D4C4AB1E2BA221BD739074DEDF344CD3F66047BD920800F10548BF337266849ACD84FBEFA37654CBDF46DE41175638FBA9747CA87CC0BF976CABDB5A3B6673351D30CC4C742E006E184ADC9C13BBEB19BFAE8B33ABA5DCFF094CC9FDCF5D156F10C138B27CC035A8EDE93FCDF2B6D4711289DE8F6B8A00592ABDE8653CDAB44BBF6B2563F29A716041FB5CD74E1A968F653E3CFE72587C84DE33581DB6DF21689397AA9C4F2000 +smlen = 1148 +sm = B5A7D050D205BA71D4119FE4E158C75B32BDB3EC84614C1FF489BF40188287F7CA399C1F8F365E72687DF6C25CE5C40C29ADE082211863B6C44CC61B146F010192E0C5B52AF01F2E9B62BF500A797B18E6049C5C5BA35D0CAA1F260002E9571A00003B9D4C8F38CD31EF2BEFDC4E136B4FE8FF8DA3390A132AC502FB8CC8B328360C058864944030EC86D31EBA41D8EB3CCB07020B873E32648F62029FD7947253CCDD334D7A87BF183F0DBE02E467F8219FE1DB1A0577C544737F6268252D3E83B152AA020201B7FF57ADA8DB66D2C0ECAB32D051BA6411857871BFE7000402C83441B16B39BD7993766E7260D07751AF2F19A41E70689B0EEED0C118D9EF109866AAEF31B2D2962A25A3D1CA999214CDF0EB54598382EEAD64435B7122D275EA8879BD47B41EB64EA908867FD78ECFBE8E992A2636AA7477DE5058179565D3A2CEB8ACE5C0302018043C411D89975A64927B48CB622A13F1ED85CC1113897A68488161AFA1E636EC786A0AA37B928BA88A50164A9EC372523AA9EC8885AA9C95B29F7CA1BBF0652BAC195BA94E976D336B69A9F5346B4C7C81457F802DC9757C7A2435A617317340F764C1A2AE131A716318F00AF0EFA89D3B57D8F31E155598B3944D950D6A1D6485B509358EFB3745B95EDC30DCFF02574F54DFB2D31B259D132D18897DF868115679F06D41102CD4EED4EA290F711148B99B647B8555A4C0DCA1D2D0871C59AB1382A2D6417E6236D71E2BFA1A75CDA54F93E6C087D611878AC7670A04FD7D8CB0993F456E3BC1C3B5898076E22D2D9E0EEBC7D7BB8D142BD2B5F6FA42B40BF676FB69C532D7520A4A105EF0C1337F53D6E9B4BA17F1E76AF4CFDF08F794752D2BF71E8777E2A209F8891B1A53D7BF2A5786B00B9A0CD0FCE79408F26BEFA2535BE188A68201B1514074CD70660971F86E8D3E92790AE7AC591AA7A996149BCDF060C615209FFAB82E6000F41B2A5606FDAF4CD08CAB0C2F1103B2436B1FD7DEC477C6233FBCA3B07A0CA01BF3476BFE5334E32AAA2ED35D5747D673E7BB622E1AA7901C77F28A3AB2197C8B8253A1D28C969EEE73D17AD71C7919E7F217BA2BADBD1EBF986CFE981024FC347028C1109CD4204C7D53535A9B677E39A43193E054D0FD68104D88934DC7BA6CB3E942AEC744B935CDCFEEF4221784F96798E650FFB0FEBF2715D75339D0CB6C2E57C1E9D10F13E6786B7F041AB307B8CFA51A2F10B622995230FBA54B70D94AE278EC224D9D0950BA97BEBA7EEB0E2FBC4093E548D9EC09CA1A08E5F0483024D7C1927FF8DC270900D42D31B81B13A29839BD746CBB3591BC33817741A31DEA308F549A74F3A4E5478844183B8D7363AC1F4D4A5E907D9ED98AFD08FB8BAA84C324563495387A4F12C239FB63F0810447131311B2D2CA302C7DA2DA57C94C3B5E844F537886FB766EC0E977254DBCA8FC84AD77430428F0692E55D8E2CAB294B857AB51A2CE4A725433DF28D9CABA86C770743AD987BBA58C0565BD18590931E283292889294B607A5F19D9E905AA3940836E2A74A2E94FF3062E85A5C6C978B5EB2B254BBCDE128280E6CF02C11A0C2066F349E3C6C083965D5B8A9C000E15FF36C5BF3A6D42 + +count = 28 +seed = 19CB4BE2332F7FF0C078BC001FAB3C5FD8569A76EBCE373D1ED4FC8EB5D744C6464E2B5EECB9EE836CD5D87BEDA78BA7 +mlen = 957 +msg = 86D27C1FCDB8164F8909073F590D0A280E5EF193B0C42863BA518BC8A51E625658DBE2184C3353FAEB674C991EED3F1B0FE3BBE50A21EC70E9F57B97C38D6E436D3DD577D7056B07A401FF0EBBBEFAF8212B993A39281190E309ED0C50B269E4852DEA85432A5941269FDF63766B21D25D8816DE5E87FFA051009D232D6B258C5F43F45F2D48BE09B2CCD8FC963FAD81FB368502057AFA7C865D62D932F652802A299295B29411439DCF832E8367A749B4D7ADF7E8ABDE3EBFB844A9B1D32F77B2BF96B5D29FC15DAE83EA80A990AEF6590776CE1CB81587ADA80B9A7B45ACA3BBC54DBE67DF090104FA196701280B97607A333A9B56A728710CC1CBB7569B79FF034572495181A92D2380A7EE5E9CD1B0F758C2BFBCC4E11464F1CC7D91F117319C30CCBF4C11E60B5DEC724225B8D77B71AA58F5FBD498A3F49115687D58393BE648805BA1737BB921A08D738243920C3834F8782A8256B7DD22CCD5F4ECE86B8A0860BFF21C5C8F0BE987F2D510ED4DF9CF94BF698680B7CFA22A575A3D1B5B431734B59A4B31913019C1F42DCB76A9FF32BFBC6E16D2FADE26E3C17BAE49CC415E4B370D1FB43FF652BE62D18B0AFFDF286765F4F30FC8D6F2C4A58CD17B3BDFA013BB2DAA075BE5F522EF9BFC2E1506CC1C4D381B3342EDC19C955A5FE48A712AF5ACE66A028D03FC859711C9D33231E48D41E58A2C2AD81DA77529AD5E6B73E1AC96F0C8E53F153FAEA7903F917492A1D2B1203174A08551FF0F9F91E32BD0F31D606C80A505D5EB55265542DB3653C2621E7EB3FD677F49534F261205F834EEF1645AF419EF6BE5CFC16D54C7EEEA12D2EB9458831F77FA558E4D5C7FE446DDAAC3E1D502C941C95F572AD545ECC7CAD21F0DD50845CBDEDF589505FD34CD8C00D57243C3AA3615D84C39B0A72C28F40AC72DA25EBC6987DF5A7E390399463786E75D524FFB6C961BBC9301264BFE3C699101D18ADA4A72D193971D54089E6FFFA684CD3D77570CE0BB9179A156D3E2DCF266358499BFC158AC9A6913F622CA861C968EBBA0A59A12674BFE39389A2125A02563B082259483E80C89A3763C0A9C3DB485AEBF22C844539EDAA28A3FBC0053EEC475679B741D9AFC16B5FA109399FDD1FC3574DF8A1292B8D7401AAC1BE452D38F97D531813369EE4C50F36736B95AE9C3E4F91AE85E2D664337DAA40F75CCED2F4A4D210BB4EE25A56DC217DD176DB5ACA43C002AFD63ED8712D89E266674D9736FE4A9F202A81D177970411DCCD289B25798272D2647CE6451906A4F7D46E87A46CF6CD048B6BDB62488A24F48D1EBD61FFA474321B929E0A7B6F9D0F6D777ACC14815F343E1 +pk = FE562AD899A5875C85C3AE4A9F539913FEC0CFE648E3757C58B5FECE2462C10350DCD6107F42C740C089B730123D8F24CE328961BEB50565DCC279F73B38FB31648D223BE562AEB6E52D509EC88BC78599874B9545B5DCC7E9381554A8D7933815 +sk = FE562AD899A5875C85C3AE4A9F539913FEC0CFE648E3757C58B5FECE2462C10350DCD6107F42C740C089B730123D8F24CE328961BEB50565DCC279F73B38FB31648D223BE562AEB6E52D509EC88BC78599874B9545B5DCC7E9381554A8D7933815C7740F18A884657C4B37AD31192A25DDC17139DD8BFCF97A6406000000000000000000000000000000000000000000000696EB6CE53C5DCE65E85702215CF3DD4099636853C2C90B94F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1947AD57D643DFF85764E7EE36756C74EF643D86181E41CC50FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FE5D101EDC5D20FABB0583C804FD14400156927183B952A6DAE614A66E333606F9EA7AB58A0B288D6C740B9DF4A904004B44C6A78C0DA51524F8D93A82F29561B633EFA0609CF9927C6585ECE4C06FE411DC1A263C2DA582D8FC52887361A9001DC4D059527D71AC98C47A5EF0E178CB3288971AE4AE2A2F92C38DB73A281F7ADAE185A3F79777890EF73336D35D69007B626045E0D1D571B68E8F20AE41E8CD8F40530B31707019BAC8523A2502052AA9AD4C5CB94A3495CB62C70F22337200 +smlen = 1181 +sm = 44826DAFEAC80A8DE394BD28C122E40EE5844D8D0EE652CBEF33F60B1881808ED7968A0E1CEF71AFB0E6DDD14EC3FE001D0980E27B4E9ACF12A8D8F68210B78E2E276FEE8DE0912122C87ECF5B5232CCA2355D64FA77DAE163FC730500F6AC2500004B937EDA2577D3C2E4084E9324C9F48E942DF13C71B3C3BC039AF97389F9EA950D5A1784DF6BB5D30D139032C5F8C63B8B01E3BA5F4F488D84143A2D04062AF66D195AF61D47ADFDEF7801A72EC7D95E843A17D88C2C97841886F59EEBE324508B12D30159479E5CB784B34E3DB99D98BD5312BF9EEB6BDF975F7B00160286D27C1FCDB8164F8909073F590D0A280E5EF193B0C42863BA518BC8A51E625658DBE2184C3353FAEB674C991EED3F1B0FE3BBE50A21EC70E9F57B97C38D6E436D3DD577D7056B07A401FF0EBBBEFAF8212B993A39281190E309ED0C50B269E4852DEA85432A5941269FDF63766B21D25D8816DE5E87FFA051009D232D6B258C5F43F45F2D48BE09B2CCD8FC963FAD81FB368502057AFA7C865D62D932F652802A299295B29411439DCF832E8367A749B4D7ADF7E8ABDE3EBFB844A9B1D32F77B2BF96B5D29FC15DAE83EA80A990AEF6590776CE1CB81587ADA80B9A7B45ACA3BBC54DBE67DF090104FA196701280B97607A333A9B56A728710CC1CBB7569B79FF034572495181A92D2380A7EE5E9CD1B0F758C2BFBCC4E11464F1CC7D91F117319C30CCBF4C11E60B5DEC724225B8D77B71AA58F5FBD498A3F49115687D58393BE648805BA1737BB921A08D738243920C3834F8782A8256B7DD22CCD5F4ECE86B8A0860BFF21C5C8F0BE987F2D510ED4DF9CF94BF698680B7CFA22A575A3D1B5B431734B59A4B31913019C1F42DCB76A9FF32BFBC6E16D2FADE26E3C17BAE49CC415E4B370D1FB43FF652BE62D18B0AFFDF286765F4F30FC8D6F2C4A58CD17B3BDFA013BB2DAA075BE5F522EF9BFC2E1506CC1C4D381B3342EDC19C955A5FE48A712AF5ACE66A028D03FC859711C9D33231E48D41E58A2C2AD81DA77529AD5E6B73E1AC96F0C8E53F153FAEA7903F917492A1D2B1203174A08551FF0F9F91E32BD0F31D606C80A505D5EB55265542DB3653C2621E7EB3FD677F49534F261205F834EEF1645AF419EF6BE5CFC16D54C7EEEA12D2EB9458831F77FA558E4D5C7FE446DDAAC3E1D502C941C95F572AD545ECC7CAD21F0DD50845CBDEDF589505FD34CD8C00D57243C3AA3615D84C39B0A72C28F40AC72DA25EBC6987DF5A7E390399463786E75D524FFB6C961BBC9301264BFE3C699101D18ADA4A72D193971D54089E6FFFA684CD3D77570CE0BB9179A156D3E2DCF266358499BFC158AC9A6913F622CA861C968EBBA0A59A12674BFE39389A2125A02563B082259483E80C89A3763C0A9C3DB485AEBF22C844539EDAA28A3FBC0053EEC475679B741D9AFC16B5FA109399FDD1FC3574DF8A1292B8D7401AAC1BE452D38F97D531813369EE4C50F36736B95AE9C3E4F91AE85E2D664337DAA40F75CCED2F4A4D210BB4EE25A56DC217DD176DB5ACA43C002AFD63ED8712D89E266674D9736FE4A9F202A81D177970411DCCD289B25798272D2647CE6451906A4F7D46E87A46CF6CD048B6BDB62488A24F48D1EBD61FFA474321B929E0A7B6F9D0F6D777ACC14815F343E1 + +count = 29 +seed = 6BD93FD13C0299B3EC7403638673F3DBC449F3A617B691DDF73C072B62BF028913375D7460BED2CF9FDCA517690CBAC3 +mlen = 990 +msg = 56ED7708F98432FBC623424C2A3634780470A01784BECFF01BEA5BA192D02C33675084263C4315420A009579EF80DD15ECCBB812652421872A9577EF7D07896A727A64141BAE7173426DD5A3925159BFA927FF1039E70F729847B48365B4D3551476206AA049BA5AE8F605847AA03965F058FCFD478961EBEED06530ABE900042321059C297DACFE76CC12D52311B2FF8EE1231C77049E232D9FDB751FB27EB7EB6A373B4B1C06BD0FF46B1B208072C873E6F938E689839079E48C6D18F678769F5F28A903467F2FF2A8B02CB19DF675A8FC7560A7D38A918AB8BE083EC4E0EA148517AB90F38394833304F245BFFC47F9ECA771FB80B9C71CCD05FC3B0D66EB06D24B914B63D9F16AD2F2BC454B591D01ECFC527277AE71E3DC683161A53F129743F3428FB82A89DBD5D42F3EED237CD2F8D76DE2E56A2143AC6B2BA811F745CC72132028EECD4412B76FDD87A2E396ADCE72DC69B8FE053042E798B220974587AF96BA419DA6888B13FFE217C9D01434347F4162FD554B760883E8EB1AEE46C4C26B990C6BA10D2D939F513BF0EECADE8B5DEB8DE2BC8C8894ACA51E65AA696E390C11689F1C2CFBB70BC5F72C1872D99BABE8DE8FE2DBB446A8129AF0AB8D9613F0CBF3CFA6EA3CC409F4A97581D5012707756994B6C8D4FE7F64E0F0B85A85D0A5FE23224DFD7ABEBA8E3FB2E97AD87FA8DD477ADF48F64FAF486D0DF11AE9C3BD3A04ABC962C5B02CDA02D48F0B52D84D4920C116C22455DF291A96E6ADFF91E3CD35CB8B5B4E70E3DA8B87CDC969643A32B1F97131C5E0BAE7F6DFBFAC32218EAA596D444574EE85EF7C9998DC1088E5813D50A4377D29506817E4234F68B32AD68E00ADBF6462F8D4E215F15A19DFDE452F0A65360F7C1F20E11C42EEC55565CCB23CE248BD62E9DBE8A7D6639028A92B422AB444C5688B5D191A4BA8956F358D131E2FF6DFC607ACCC5D31AF9678F1A226530078FF9A73D681DEB697670DDC3E9096AB0FEDAB664473DCFFEDF9BE62A5C7C54FA2EB5059E9A1D38413B1A4FE6D531B799453BC7185ABAF78CABCF65F365B00827CEC5F29C4737047E3B2932A78757E9626A958486D1740ECF1EC17A01AAE6ADEC5104EB934F432207CE31D7096ACB3A0FE2F5DD7890C021892FE7D3F34596CF20B6B12FD55911ACB46D7386F99A9E9EE067A45C6A1FBB463E63D69CB582DA6EBD6330F4F80A1FA72F2ED24CE9BBCD967118CFC7E21F6BFB68A905F532BCF8B8BEFA03295D362B41D25CDCCFC9B41767858F651BC56AB2BB4A8675513C5D6F1C943A20A27DD29F941AD141DEBAAD219E056510BC984063FA0F389090D434157438BB1759690C453A2F55F72C033797A4B0C534EA2EA084B3B6F8966AC56B106FCC11EF08902F2ED +pk = 6C651C3CA600B9CFAD170F07E5086D68805FF08FB13A655D2120510F9C08DF45CA7147342EBBD8696C3FD07D81113337DB3C11A4E5833160C31725D9DACF5D74554B39DD858C3DA20282385297289FBAD1CF3ED6DEB619C577630AB53589A31A15 +sk = 6C651C3CA600B9CFAD170F07E5086D68805FF08FB13A655D2120510F9C08DF45CA7147342EBBD8696C3FD07D81113337DB3C11A4E5833160C31725D9DACF5D74554B39DD858C3DA20282385297289FBAD1CF3ED6DEB619C577630AB53589A31A158FA888B8AB699880516569B4CF1FFCE2E397D9C62EE5A917B90B00000000000000000000000000000000000000000000EC2570328F401432F736644543BF3E74CC957872B05D385981FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB32FAE76F487B5115D81CAD318B7437044808521160698868FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AC51336E720FDF37D06B5F62DEC42D3C5B75691A474F00FB5D78AE342C6210ED86F308DC7623D72E3FE0C159C8D7A100E39CF06BA57F9D800821AF7CF586C1741EC164F34DCD85BD2DECE8543EA0DB81094D8A4C87543E5E6E0308E2A0621700A53BAF501FA6EE2E72D4D83EE9A6C8891A03F9CA28500AC994C8EF9A74C85E9250D3340F584BE8BAF2C82230E120FF00A581A37A02C640FDD3DD05E922EA15D47AA859BA87BF8D967E95E831879499998DA9CF70170FCEC8C623331B2EB91300 +smlen = 1214 +sm = C01489A9727BA7EE66314BA4D1799C7577970169E8B5BDF10E78444DD6151EFAD42D1029CB799CFAE1573D9D94EE953B281B826458C67839A9D6751CC6F23C1FE50BD5113DAB038298B50E87F9981C82E4917715AB7B21EC6A277374CA74803B00036F5E425AC0ED92CD729435D113142BF198ADA8F5170A74C0013B1D66D18DCDD73B4E51A7A6067A180D2F6F832513984A3D0198666306C3EFCEDFECBA2ADDB428C6B275D8869694779CB101402CBF69676E4E56A966A2ED400C5036F5B510B371FA477B023B31CE65A48F039574260DCD2EADA14FC836EF412130FC000D0256ED7708F98432FBC623424C2A3634780470A01784BECFF01BEA5BA192D02C33675084263C4315420A009579EF80DD15ECCBB812652421872A9577EF7D07896A727A64141BAE7173426DD5A3925159BFA927FF1039E70F729847B48365B4D3551476206AA049BA5AE8F605847AA03965F058FCFD478961EBEED06530ABE900042321059C297DACFE76CC12D52311B2FF8EE1231C77049E232D9FDB751FB27EB7EB6A373B4B1C06BD0FF46B1B208072C873E6F938E689839079E48C6D18F678769F5F28A903467F2FF2A8B02CB19DF675A8FC7560A7D38A918AB8BE083EC4E0EA148517AB90F38394833304F245BFFC47F9ECA771FB80B9C71CCD05FC3B0D66EB06D24B914B63D9F16AD2F2BC454B591D01ECFC527277AE71E3DC683161A53F129743F3428FB82A89DBD5D42F3EED237CD2F8D76DE2E56A2143AC6B2BA811F745CC72132028EECD4412B76FDD87A2E396ADCE72DC69B8FE053042E798B220974587AF96BA419DA6888B13FFE217C9D01434347F4162FD554B760883E8EB1AEE46C4C26B990C6BA10D2D939F513BF0EECADE8B5DEB8DE2BC8C8894ACA51E65AA696E390C11689F1C2CFBB70BC5F72C1872D99BABE8DE8FE2DBB446A8129AF0AB8D9613F0CBF3CFA6EA3CC409F4A97581D5012707756994B6C8D4FE7F64E0F0B85A85D0A5FE23224DFD7ABEBA8E3FB2E97AD87FA8DD477ADF48F64FAF486D0DF11AE9C3BD3A04ABC962C5B02CDA02D48F0B52D84D4920C116C22455DF291A96E6ADFF91E3CD35CB8B5B4E70E3DA8B87CDC969643A32B1F97131C5E0BAE7F6DFBFAC32218EAA596D444574EE85EF7C9998DC1088E5813D50A4377D29506817E4234F68B32AD68E00ADBF6462F8D4E215F15A19DFDE452F0A65360F7C1F20E11C42EEC55565CCB23CE248BD62E9DBE8A7D6639028A92B422AB444C5688B5D191A4BA8956F358D131E2FF6DFC607ACCC5D31AF9678F1A226530078FF9A73D681DEB697670DDC3E9096AB0FEDAB664473DCFFEDF9BE62A5C7C54FA2EB5059E9A1D38413B1A4FE6D531B799453BC7185ABAF78CABCF65F365B00827CEC5F29C4737047E3B2932A78757E9626A958486D1740ECF1EC17A01AAE6ADEC5104EB934F432207CE31D7096ACB3A0FE2F5DD7890C021892FE7D3F34596CF20B6B12FD55911ACB46D7386F99A9E9EE067A45C6A1FBB463E63D69CB582DA6EBD6330F4F80A1FA72F2ED24CE9BBCD967118CFC7E21F6BFB68A905F532BCF8B8BEFA03295D362B41D25CDCCFC9B41767858F651BC56AB2BB4A8675513C5D6F1C943A20A27DD29F941AD141DEBAAD219E056510BC984063FA0F389090D434157438BB1759690C453A2F55F72C033797A4B0C534EA2EA084B3B6F8966AC56B106FCC11EF08902F2ED + +count = 30 +seed = 1787C82DA9F2E6CA9ACF7D6CCA70116A1724902C81EDC1439F332C74807AF2BCCCCDC7AC1788BA798520B2999F39DC3B +mlen = 1023 +msg = E42C006F144B0B4E188FEBC82D63D3D37096DEEC9D3DFC3B421635DDDB73C76F6260FF1C53222A50D30B26E2DE3D16E3AA64C78604E1191BBC0E2553117A441159B2A35FC8889499A2EFBDD2F30B8B4C6CEA38EB5B2575926E6F22AB96DDB4B0C5C6D78C3754A1B6DEBA49FFBCFA7477BE9A0F74EC379D1C9AA59247C091611573AF765AE698D78152187B291717A9F03FE767BCBB12F52311215579352E7CEAA8654B5403F18CE82E0A73BFD5FEC1063B506F44EB1C9C5A03697D03DCB2AE15C5095F292B4BCB130B55C19AB728B3232EF77D1594611573CC6BDAA254F05934A329DC27CFA6CD8C02CB51C3C295C964C40502FE2B1A81A51C866F7C7380BFBE339B39C8F51F73722A05B5D1E9CB6313557B3656863803C9DC99BB1905D7F729B2DB8DA23D88200032F36FFD04DA11FFDF6277ACC69C5407289D00FDC3C56B32D54877F4A8DC70ABD37EC532B8617D9F3C535B8E962FB389E976B4D1AA12DE5C1C2FFACD50ACFFF65201104648E0C04CF7C1F880E8BDA1D68404BA67C4BF64C9D2ACEEF81B35FABCE58645E0F2F61EB4CCFEFDE7239BE408710D349987D849D40B3AD294B9D815A91848F9ED53B69F78D9E955F6D1FD7E38EC291664D54C2BC359FBA241BA6ABCBF5FC2502D93760D9F6B1F7FB766040E98BDC23A6047134A35327FE128AE24B4C7D0CDCF1801947A1821DDD7424892DF50E2DD5C1E2E6C5BFB4467524FB45C7D977604E7E0F1F98EB8C03EEE1D9A5796C8A801F082678940F076BF44D3496730C9A640FEFCE385865899FC33B5DD34D036F2FD5D07FDC0A40FB725E84CE403B46DE712B4B44CA8801A1CCF58233C5DA06719769823B5945849DDABCA56B0B4EF9327C8B5E5A445E6853E5B66B8D590759D6B2DB722C22F8C741CF3C6325A76D93F4FDE5872D5732FB19AAADEB7C18094727ED43B305B87AE2DBAAD67F90FEB86498CF65CC57EA635340F27AE5C5CD60AD3C763223AF877E65A005C488AA4AF9309E1AA02002B01DF8865FD481EA254015796985969997A53B06DF0355A6AB3C8219B652B09E1F86A6CA12D27C4BCB9E8D35E6889198C8FED71AD5642F5F9F7CE1DF270D68AA05467EF9ACD9A51347AF1EE9CA7C4A5D78189042900C6D561F68D410A77E79726DC123B196C78829F02CAE7D0623BFE9E7B0D8BF84033086295992B77ACF027489D51BC7FF006A8D4AB8079D494413A565E7F687AF40DD18B86AA4274EDB8845DF114C0146DE3199CB55F773A87FFB126B3A4D00D38835CFD2D6652C07F572F39D0397FCD62ACF6ED9F3E8951348AE7E52A669FA4E2BFCDA548ABB1989A1D74A27B73103770290E6ECAC87029359354EE4C87A77BCB5CEB10162DD54499905AC8ED442C173CACDE068BC546720D1284015ACB90CA19147694B53899395DC663D6683908F3CBA29AD37F15CD3903C4C7F4BD73 +pk = 168DE0DFCDAF39CE97867C4EC7D67D3A30773A0D290E1A2A22B1AE4368A19CE4C3A97E47954896A4AB47A17AE4F8682CEFC7995B235464656C43D5D083C07629DB36D619F559126993E5111564811E75EB2D9E92FBDDDE33BCA5A34EE2EC363015 +sk = 168DE0DFCDAF39CE97867C4EC7D67D3A30773A0D290E1A2A22B1AE4368A19CE4C3A97E47954896A4AB47A17AE4F8682CEFC7995B235464656C43D5D083C07629DB36D619F559126993E5111564811E75EB2D9E92FBDDDE33BCA5A34EE2EC363015019F1E3CA7FB9DF2F61F1588D74F7E7BF1BCD6888A55D655A10300000000000000000000000000000000000000000000CA10B2E0F5442F1F3B153BEB34048FAEEF729A268465EB1C9BFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7315DD86E9B25F6A1B4EA9C65435BFEC02F3F7AC6E9A95227CFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D0BC43C80A64B00D23233606F770901DD3529D3DFBF728B000515E7D309FC5714913B2A92CA14C2F025F6D3F317F60041491BF55E45CAF50DAE098AD3FD24D26E73F88607A566BD71DDB51802547122CDAFFC159326EB40513E317A5C4AF20043E76F3C8FAFD70338EEC1E10B2AD001A60E78D88E552D03F74949F4FA4E79326C1EE3FB9C752693DE78B0F930DE260028A612176CE3ADA183C187467775FB3EEBD46A1511C9E5E7115D7B139E52077735B4B5A725BDEA413A9B8B206B427700 +smlen = 1247 +sm = BA6D16B09ACFA4514F0CBB05D6125DA5C7D4E8E9EE36791F63C82A3F0CB8DAA9722B08E4A31CF9BADBF987ECA36D7232822CBB63F5130C1CC483655E365D25A185787D43859D0750A0352A6DB279370C5B1B9BB3918EB42452F160BBDD3EA6050001154B56F316E3A2B77396953EFC846BE9DD4B208E508B041000271B308BDC692D395BB70AC0F5FD721F030F63B8475BABD800918E1ABD7787EE96800DA1BFE0BED95AADA8A9ADCA120B5401A1705637DAB21D72468C8658202B0C5359E00488A914ED6E011075E2DEDA9424BED153BF1E7D81D338A946F6F33965E7001704E42C006F144B0B4E188FEBC82D63D3D37096DEEC9D3DFC3B421635DDDB73C76F6260FF1C53222A50D30B26E2DE3D16E3AA64C78604E1191BBC0E2553117A441159B2A35FC8889499A2EFBDD2F30B8B4C6CEA38EB5B2575926E6F22AB96DDB4B0C5C6D78C3754A1B6DEBA49FFBCFA7477BE9A0F74EC379D1C9AA59247C091611573AF765AE698D78152187B291717A9F03FE767BCBB12F52311215579352E7CEAA8654B5403F18CE82E0A73BFD5FEC1063B506F44EB1C9C5A03697D03DCB2AE15C5095F292B4BCB130B55C19AB728B3232EF77D1594611573CC6BDAA254F05934A329DC27CFA6CD8C02CB51C3C295C964C40502FE2B1A81A51C866F7C7380BFBE339B39C8F51F73722A05B5D1E9CB6313557B3656863803C9DC99BB1905D7F729B2DB8DA23D88200032F36FFD04DA11FFDF6277ACC69C5407289D00FDC3C56B32D54877F4A8DC70ABD37EC532B8617D9F3C535B8E962FB389E976B4D1AA12DE5C1C2FFACD50ACFFF65201104648E0C04CF7C1F880E8BDA1D68404BA67C4BF64C9D2ACEEF81B35FABCE58645E0F2F61EB4CCFEFDE7239BE408710D349987D849D40B3AD294B9D815A91848F9ED53B69F78D9E955F6D1FD7E38EC291664D54C2BC359FBA241BA6ABCBF5FC2502D93760D9F6B1F7FB766040E98BDC23A6047134A35327FE128AE24B4C7D0CDCF1801947A1821DDD7424892DF50E2DD5C1E2E6C5BFB4467524FB45C7D977604E7E0F1F98EB8C03EEE1D9A5796C8A801F082678940F076BF44D3496730C9A640FEFCE385865899FC33B5DD34D036F2FD5D07FDC0A40FB725E84CE403B46DE712B4B44CA8801A1CCF58233C5DA06719769823B5945849DDABCA56B0B4EF9327C8B5E5A445E6853E5B66B8D590759D6B2DB722C22F8C741CF3C6325A76D93F4FDE5872D5732FB19AAADEB7C18094727ED43B305B87AE2DBAAD67F90FEB86498CF65CC57EA635340F27AE5C5CD60AD3C763223AF877E65A005C488AA4AF9309E1AA02002B01DF8865FD481EA254015796985969997A53B06DF0355A6AB3C8219B652B09E1F86A6CA12D27C4BCB9E8D35E6889198C8FED71AD5642F5F9F7CE1DF270D68AA05467EF9ACD9A51347AF1EE9CA7C4A5D78189042900C6D561F68D410A77E79726DC123B196C78829F02CAE7D0623BFE9E7B0D8BF84033086295992B77ACF027489D51BC7FF006A8D4AB8079D494413A565E7F687AF40DD18B86AA4274EDB8845DF114C0146DE3199CB55F773A87FFB126B3A4D00D38835CFD2D6652C07F572F39D0397FCD62ACF6ED9F3E8951348AE7E52A669FA4E2BFCDA548ABB1989A1D74A27B73103770290E6ECAC87029359354EE4C87A77BCB5CEB10162DD54499905AC8ED442C173CACDE068BC546720D1284015ACB90CA19147694B53899395DC663D6683908F3CBA29AD37F15CD3903C4C7F4BD73 + +count = 31 +seed = 9E6E12F025B2A57B0F5A3A9FA70396FC332E1802608E5CA07CC4FBA922F1FE5DEA6721B96F1BA2BFB97825A19F08FF2F +mlen = 1056 +msg = 9C311FF20F574CD9B7BCE1DF705AE7DCE6E7A621C935A6E57A59EB31FC443AB1E014AD332FA784583260AA6153C464565C4568108D60CC126F6E8EC3BC9120E5659C86CDA8A31A7131936DE7B3DB39A4692808DC3D2BEE8A99880FF9D1D5EFF1E825A0F043D908D62A99779E013845AC0C21ABE8E4DF0EE901E4C6BEB8BB36B30228B7756D617A8F30C16351D8FF91786F7406F75D9FB648830F88EA4537F42EAD62E8790E9CF11F72C31D718221049C9AA35376AD8FB065F4809F4383A23C2B29425836C2DBCE4680450896EEADEE6B83539ADFDF59AA4FCE709D601640EB9A22DC3B41108A8EE1FCCDE9945EBB1D3F676EC8395255E125E62A32149C73451F597E1C32AD979E5BE914FFC7C548D6AE92ED08501831E9007770A0233E5778F22ADF7F1AAADF9C9A7C82D2F42989BF21627D3EF8BD0377A5BE5C9F5A585A246A73DE4340E6B43B36DB775B34033962646C16F26A2B7179C40A721FEA54805B9EC42177B42160B1A67341235B5AF9F30B2703BFF8CDEEE5BD7CE506B0707A69F84225B6E5A92E80EDFA235803DBE2CEC47CFEF0D9FAC95C3379816A39F4550BDBFB45609C76D0351DDF8D61724BD5E8BE94673B3013EEBE172CACE247D79925B12B5DBA2F6FB72E797B2DA849B79DEE3DB76775F5F1DD4595678671C7B18BB3749FBB0C6A7135D639F16B3864B5A251114DE7E9F8CB02B4CC69902EC8D7D544D98E24A05F8ACCB182E2EB44BDE868B077B1FAC4726E8B01CDD0D024405665F7ADB60A23FDBACF421246354E824CB74DFB35E57902794E459493905400D0A0BAD51D8EB94EFAD55C67CD0C7CEFE7A1B055F06371AEC7F490FA685C611D553D8430992EE7B1855A9CB305B5CE53154345D7DEF6110DDBDB5CB59559EB664C6439E057DC022F8686F2AA0CA81552428437B0CEB5FBB5DF254036BD2BAE7290D947C963046771A39D2656312236569E775E7D2A041B7EECCEC99C1B9D2757C7370E474012AE707AE00AC37B73ED9C8E1A2774E54BACEB42E8B31BEA734463CC15576BD4F7A33430B1987D62E47473391938312F2481838F286C4DFAF701ECBC6EAB1A9F074C1F8D8963457DFAAC9A9A8EEA70C50CE70D1BA1006760AD3887605EC38861DC1A777D21E46EA169537057CDFE256CC08699D73B1AC4FBC62F863353581CAD358B9C573D77585DF6544E5D55048D66A352828CD1ADF5F42310FFAC022A25824430F741371027B2DC14717DC87342A74F0038674187E478D8ECEFFC16474A4AA8BDA0C8D41962EF2A4B64A036C888CCF4EA628E1CB9EE0F9A918FB1B22B9367FEEEE0218C83CC7E27C5CB2AC64DC7E111E3C85CA0E6BD4F685E5DDD428E028D192142CCEE3F0C8337BDF43CE4B62704AA53C703EC334FB56FFDFB81D7D4419535D17E5FCC0E6F558AD82149C591FE0357DA15660F61544B4041128218B6DE2B75D3801510669A3977E2983BCAF957EE2942E504C29890A81542EA208E1CEC +pk = ACD087BFBBA242AB7B10CA520065B040D5E91C983200BD5F65A4435545965AC6338AD10C9304FC10A366051E9FA2F6360C549AF95E4FF415D2738EC49F09813D16681772A9E7DD598668570B92D0B756BB7382FAA6F0E73921E85FDBE2C4232802 +sk = ACD087BFBBA242AB7B10CA520065B040D5E91C983200BD5F65A4435545965AC6338AD10C9304FC10A366051E9FA2F6360C549AF95E4FF415D2738EC49F09813D16681772A9E7DD598668570B92D0B756BB7382FAA6F0E73921E85FDBE2C42328029D8C8D8AD4D66ECDAC5BD3F55F881771561286C3F87CCE1B740900000000000000000000000000000000000000000000E84492699141FA0FB69921436092110A1E140F4D205ADAEAF5F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF739532B2CF2D9EA8C7B4C28A0F9BF540455DEA4F22950A4DFCF1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DBA4F7F6B4E0810E841B63FFE758593576EC737BB755E1D09C791F66377739E71AE90FD7A226B11FFC68F3FFC04CE7008807177063508D48C22A4D6277241816469F8F4C3E6197B0C002436EE790959A317F83118BF57FEB6C24D2BAA46D4C0066BD5F628B168827B0FF9D976C8944EA7455C0C3F5B81EFA497355DE1549E19A0C51DD31275E55930821DE1074EB8200D320F4C4F7211141652E3E1BBC8C0718916386AC677F827EEE376728C1BB8EDB43F30037E79D43C78F71DB7989606E00 +smlen = 1280 +sm = 7A39F3A95A5526CB2C8BC203E87EBDF6CD2D41A408696B9DD418863D6CA0942BFA12E5282BB7DA0CBCFC8D7E71484325B24252BE8427430F072559FDB612BEDA917CDE760E70B3DF32BC0D49D439284E07B557C19F82EAD1D40CEF9D4185F827000432DF8A178FD9E8A4BB198EAC59AB27028D9669C3890DCF92025F93E2733D75525B522696EA6A865239121DD296BCB66C9201FEF7B70B4C4DC698BA40A10A8520951DEB5E28FDE411CFC503B1D13A0867781C53E943350254D5420FC3BFEAB01F1BA83A02A072EAA757784168D6A70D6F80662286B00EA85E3A040900170D9C311FF20F574CD9B7BCE1DF705AE7DCE6E7A621C935A6E57A59EB31FC443AB1E014AD332FA784583260AA6153C464565C4568108D60CC126F6E8EC3BC9120E5659C86CDA8A31A7131936DE7B3DB39A4692808DC3D2BEE8A99880FF9D1D5EFF1E825A0F043D908D62A99779E013845AC0C21ABE8E4DF0EE901E4C6BEB8BB36B30228B7756D617A8F30C16351D8FF91786F7406F75D9FB648830F88EA4537F42EAD62E8790E9CF11F72C31D718221049C9AA35376AD8FB065F4809F4383A23C2B29425836C2DBCE4680450896EEADEE6B83539ADFDF59AA4FCE709D601640EB9A22DC3B41108A8EE1FCCDE9945EBB1D3F676EC8395255E125E62A32149C73451F597E1C32AD979E5BE914FFC7C548D6AE92ED08501831E9007770A0233E5778F22ADF7F1AAADF9C9A7C82D2F42989BF21627D3EF8BD0377A5BE5C9F5A585A246A73DE4340E6B43B36DB775B34033962646C16F26A2B7179C40A721FEA54805B9EC42177B42160B1A67341235B5AF9F30B2703BFF8CDEEE5BD7CE506B0707A69F84225B6E5A92E80EDFA235803DBE2CEC47CFEF0D9FAC95C3379816A39F4550BDBFB45609C76D0351DDF8D61724BD5E8BE94673B3013EEBE172CACE247D79925B12B5DBA2F6FB72E797B2DA849B79DEE3DB76775F5F1DD4595678671C7B18BB3749FBB0C6A7135D639F16B3864B5A251114DE7E9F8CB02B4CC69902EC8D7D544D98E24A05F8ACCB182E2EB44BDE868B077B1FAC4726E8B01CDD0D024405665F7ADB60A23FDBACF421246354E824CB74DFB35E57902794E459493905400D0A0BAD51D8EB94EFAD55C67CD0C7CEFE7A1B055F06371AEC7F490FA685C611D553D8430992EE7B1855A9CB305B5CE53154345D7DEF6110DDBDB5CB59559EB664C6439E057DC022F8686F2AA0CA81552428437B0CEB5FBB5DF254036BD2BAE7290D947C963046771A39D2656312236569E775E7D2A041B7EECCEC99C1B9D2757C7370E474012AE707AE00AC37B73ED9C8E1A2774E54BACEB42E8B31BEA734463CC15576BD4F7A33430B1987D62E47473391938312F2481838F286C4DFAF701ECBC6EAB1A9F074C1F8D8963457DFAAC9A9A8EEA70C50CE70D1BA1006760AD3887605EC38861DC1A777D21E46EA169537057CDFE256CC08699D73B1AC4FBC62F863353581CAD358B9C573D77585DF6544E5D55048D66A352828CD1ADF5F42310FFAC022A25824430F741371027B2DC14717DC87342A74F0038674187E478D8ECEFFC16474A4AA8BDA0C8D41962EF2A4B64A036C888CCF4EA628E1CB9EE0F9A918FB1B22B9367FEEEE0218C83CC7E27C5CB2AC64DC7E111E3C85CA0E6BD4F685E5DDD428E028D192142CCEE3F0C8337BDF43CE4B62704AA53C703EC334FB56FFDFB81D7D4419535D17E5FCC0E6F558AD82149C591FE0357DA15660F61544B4041128218B6DE2B75D3801510669A3977E2983BCAF957EE2942E504C29890A81542EA208E1CEC + +count = 32 +seed = 569B8B9BDB707B19CD6F9BEB29F304D603C1509B9CF25987C280C342E870B1E13EFC7DD7E41DC85BF4F42D0493B84B0F +mlen = 1089 +msg = 7FF38725F35312D75E58845FBC33E112DD95D5C1CF78119CB413AC839377C7051BF5F17ADD1484F5EE12F42B0587AB41DF487BA5E4D8836777B614A9931A5FEFDC4AC451662B342D675C940061C4FF01F747B69CFF585FC5317636E2A830140C0007F73C76FCAB96195C86DB98E5E65C733825DB0325407E5BB059490F2E9133F9B4AA328976256EAAED2FBC59D00288D4830D99731A3AEF36E5BF5239F2899C500F942B80B00C3B33307450FF0C105BEDB7DF84231C5D24C3C3475AE2F46336582DE93AADBFD385C824F21362C19B1C6A75F56B69297FB3084B6164204E2348CB1D7CD3AB494BFA7EC8FE346251C874085F803BD7F4DDE1995F0D3D17033C461D06B49ECCEEE0D5312C3A435AF5BEC9808ACC524599668AACD95ECEA7EF07C4CA3FAB1CF964FDBA987C345046E6507AC3D372BF07D72CAB816BA627C2BD452AB8DC3044A7F0A01D8C0EA47904A5DD66C6B7EF9130D628A4F2CEA5A0D05AEAB7DAF2729C1041FBDB3C2D17BD66AE293C03E77A0837419471C29691EDFB20CF69BC6260975089AA437628F140A44FA2E2967357AC1BF1345E4208C33CFFEDE6CD634B371E7745143FF848F77E5130D1E0F51868585509F9CD3B906EE0A5072CA2E908D6765C74D9B5C35B6BA784A3EA59D808ACBB1C24D6C088CA6C9E17BCEB18337A4DA0C1DAEB5D51EFB35712A475D6C5A2EA51E93FD79F7DEB127F3418F354DF06489E10B42BC1F20651660CAEA17F67F306F48E15DB7E67A1B56578BA7BE6C229FED9567E128D48551E6EEFA17AF5B95A716555571F44FBC41AB29208DB7C1846E130866D5C9BE6F73E601C55610DFD0F67D98933D252059DAA1DEC20AE0E5BED6568A6322322D8A40E6835FA66E317733E1B465434532EEA8FA76886B600E06EFC1DA41F8DCEC0A5E8BA8419F0B7879CC0A93BD14D99608B5BEA931D8971DA8D2D89053E1DE40209E257E741BEF48C17FA15467F1312A368D4A061BFC76C2B7BBD900B4A34DA51B7CB5BD6E2FB08806A53C0D60273167D822FB6982785F2C3B0EC7D893B615724D0193928D0EA8EA2A1DEC5ABDCAA904C754CB7747449E87221B3D86BD5DF26E11DA753E768A8B481C306E485EC91074377DFC68BE74A444906E420C2D8BCCD84BE13AA5CCD11115B669C89E9C0CE374BC4059C696E5F8344FEE467AC8C8ADE37DAF614992914C763D971327B60946943847FB6B82672CC376B780953B6F4433DF69AC61E110FBF1A35F6272561193D8652EBCE3291333FDD4D84B9CFBC60A57E1F8B817E84EA15D440D4A4B4F7E19C08DDFC5949FE8CBDDCD0296A62F12F53D48B1288B80E24C756FC38E2FAE9C7A3315D1C6DA42AE838AFBBF5569F633A68289EB7073BABCB210F4E08856FA65057BFABC70AD3B58C2C870DFB5E1B0D11B6FA6D5BBB68285D8F9C21BD89669781C9F4DC32EB1EF58B80B1D371334D36FA66A2B3DD4B3E4DEDBA7AA9FB7E0245F5FDBB66CDA653C5232A131EC1F0C21DB1C47B990A64A24DC8C4DA951F419F57C03FF506E0147C22E99461 +pk = C00B500FC287A7C05A91D802E5CF564B1277E076C1FE80F83A2F6EF22D40F150379CED8BF63E2F175332AF56BCC72A379084F0666D296902710EA26194060AFAF331D2CF852E84C7F09EBDBD323407EC4DA2CB37541241BCD3C1B5D05E3FF11A19 +sk = C00B500FC287A7C05A91D802E5CF564B1277E076C1FE80F83A2F6EF22D40F150379CED8BF63E2F175332AF56BCC72A379084F0666D296902710EA26194060AFAF331D2CF852E84C7F09EBDBD323407EC4DA2CB37541241BCD3C1B5D05E3FF11A190FD5E14B61A8472A2304EF363ED10EB5C694DE3A9DA05054AB04000000000000000000000000000000000000000000004423F2C6FA89AD61386F0C03F9776493D7FCD0B77654A68144FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF412591366BD0A57E772EBA7AC1B5D1899465C08C2F27357A4AF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BFC59883DD0EEF9BD43199DDA0783EACE6B8E460293BD6987D111279F3DC75C3A006DA98CA5B2DDD26D3DAA955EC9002716CB71703A73AB036D9126C612D0A43E562954399CCDDEB7B85662F4A15551AED8DE7C7725F776324B7B5801F668004D84C30A72D79E6D6A7C92FF7D47FB6846853CA75EED68FB34DCB74D89B8AFD2918EFAD3F25B5D763EFA087A3BE2D00032118AC85EE10BB6DC1C58263449EA0CBE3B7E764556EA6C2EE23371A31CD325A4E861A475FB91A1F4A06B84F3685C00 +smlen = 1313 +sm = CD0A8FAC93BD5A02D6CAC6408DBA7464FFA549E831B30775A8B5EFBC1F1BF993D6147A09C46B867771118EA7DBAF3D0654A1B488620D41ED4F46E5B9DBB81FE79301100B86CA190CBEA555DAA8551AD48B521A4E11CC05A09A9B1F46F512652500039D532C0F7EC21DA39307843830EEC150B3F57609EE50C150014F6772030EE24374293867FDC61BC41767E46A249669916A03D0240F48C93784016C42527B106F257F128020B86D0E7CD4038849D4D5B46C43A87E69ECBAE4B2C4D1B814CFDE00657E6003EC70A21688A6E3399242513173EE1B80F4A48D3E2C21C00002027FF38725F35312D75E58845FBC33E112DD95D5C1CF78119CB413AC839377C7051BF5F17ADD1484F5EE12F42B0587AB41DF487BA5E4D8836777B614A9931A5FEFDC4AC451662B342D675C940061C4FF01F747B69CFF585FC5317636E2A830140C0007F73C76FCAB96195C86DB98E5E65C733825DB0325407E5BB059490F2E9133F9B4AA328976256EAAED2FBC59D00288D4830D99731A3AEF36E5BF5239F2899C500F942B80B00C3B33307450FF0C105BEDB7DF84231C5D24C3C3475AE2F46336582DE93AADBFD385C824F21362C19B1C6A75F56B69297FB3084B6164204E2348CB1D7CD3AB494BFA7EC8FE346251C874085F803BD7F4DDE1995F0D3D17033C461D06B49ECCEEE0D5312C3A435AF5BEC9808ACC524599668AACD95ECEA7EF07C4CA3FAB1CF964FDBA987C345046E6507AC3D372BF07D72CAB816BA627C2BD452AB8DC3044A7F0A01D8C0EA47904A5DD66C6B7EF9130D628A4F2CEA5A0D05AEAB7DAF2729C1041FBDB3C2D17BD66AE293C03E77A0837419471C29691EDFB20CF69BC6260975089AA437628F140A44FA2E2967357AC1BF1345E4208C33CFFEDE6CD634B371E7745143FF848F77E5130D1E0F51868585509F9CD3B906EE0A5072CA2E908D6765C74D9B5C35B6BA784A3EA59D808ACBB1C24D6C088CA6C9E17BCEB18337A4DA0C1DAEB5D51EFB35712A475D6C5A2EA51E93FD79F7DEB127F3418F354DF06489E10B42BC1F20651660CAEA17F67F306F48E15DB7E67A1B56578BA7BE6C229FED9567E128D48551E6EEFA17AF5B95A716555571F44FBC41AB29208DB7C1846E130866D5C9BE6F73E601C55610DFD0F67D98933D252059DAA1DEC20AE0E5BED6568A6322322D8A40E6835FA66E317733E1B465434532EEA8FA76886B600E06EFC1DA41F8DCEC0A5E8BA8419F0B7879CC0A93BD14D99608B5BEA931D8971DA8D2D89053E1DE40209E257E741BEF48C17FA15467F1312A368D4A061BFC76C2B7BBD900B4A34DA51B7CB5BD6E2FB08806A53C0D60273167D822FB6982785F2C3B0EC7D893B615724D0193928D0EA8EA2A1DEC5ABDCAA904C754CB7747449E87221B3D86BD5DF26E11DA753E768A8B481C306E485EC91074377DFC68BE74A444906E420C2D8BCCD84BE13AA5CCD11115B669C89E9C0CE374BC4059C696E5F8344FEE467AC8C8ADE37DAF614992914C763D971327B60946943847FB6B82672CC376B780953B6F4433DF69AC61E110FBF1A35F6272561193D8652EBCE3291333FDD4D84B9CFBC60A57E1F8B817E84EA15D440D4A4B4F7E19C08DDFC5949FE8CBDDCD0296A62F12F53D48B1288B80E24C756FC38E2FAE9C7A3315D1C6DA42AE838AFBBF5569F633A68289EB7073BABCB210F4E08856FA65057BFABC70AD3B58C2C870DFB5E1B0D11B6FA6D5BBB68285D8F9C21BD89669781C9F4DC32EB1EF58B80B1D371334D36FA66A2B3DD4B3E4DEDBA7AA9FB7E0245F5FDBB66CDA653C5232A131EC1F0C21DB1C47B990A64A24DC8C4DA951F419F57C03FF506E0147C22E99461 + +count = 33 +seed = F32C3715B0BA8C1D0BD59F0645E9697DFCF9AEAF761A71ECDF9672215B9F138C0502D7214F6B1BB4D6612432F9FBED5E +mlen = 1122 +msg = 789518EE21DC99CAC94DD5298B2F3EB8F6AB8D0705D24D9AA3012F217464E7F203E08E5CEA9E44F54A6F73E88D81592826E243B7F0B2A1B3A06E5AFDE23A2985183A0E430E01C3FA90E9F1DB7E69DD8E7DC6FB802933E04A18834C091ECD46F0DD423F532668CEE8A12A06BBC7E5FF3B9488B8F4A87A92BB8D6F313269AD95C574245E06563BB58BFF6169B8F4C333033BC128B91CB81DD41B831DF5103B295F744EDE95FC3A0C72F1134A9321836AFCFD563192C343040B943F69C0E98E8D740C06CCF840CBFC6BF777C9561065916F13D116D758A151E8FF4C355363AAE8E4F49D2A2E062A2BB213AFF25662D95549B4B025E70AA3363B50D25AF84A3E5B0FFA598CE074733AD191C86C351592299C26C0A4933573EF436B73DFD0C4EACF93D361AFE5F824B91BC178EE8381B9EFD52302AB8CAD6C08C7E090393B9B8ABC78AF374FAC6E60BD104BAABA524E68D75A759B94176105A9CFF2E5B9C3984FF61C5AFBF22B8E1B9E4F9BDFFEC0B19C2A5C8DB3B8B2C02115D101805C1BD6652F738F02600E38998CA41BA8955094FAD5BDC34133D4B523EDE66CF483F1CD5ACD9EFAA69703807410939974D6DC033BC696541357DA9881A4FD1385671B6E4BB889C68B544175C1E2EC1395DFF4CC87E037087C615CAF40804D5F44A2DE301961A59818173730A45CF4C2DF172614AFF7199A40C9FFB9957242A89FF86B36A4F4D60F15DB569C2FEFAF677B35FE5F12AD5A323397714286E338FF6B9080FCA50B657DB477A52A93B243BF28CE2743794C361F443AD81EBAAEAB2B237EBBC572D8586C3EAB1F42BAEC1C985D28BC58B296A11D96A04B0E1F7F6790B92E450248804F3F62B5865941BFD444A910F31E1D6B79D8906E7E9828618F960EC14124FBEED28E1F58A8BC9D31773442FEDC5A220F3912D0B41267D427C0C15BB76F9200C54B5F050307E13F1EB3DE92B864C994A3DF4CEBD1BCA634710FA342E23D7C8A5BAC1B58AA321E215E4418428206F05232E2BCD1B5EE1BB7E34E7D4C93088991EE9DD643FD08B0185A2F0AEFFB0EF0EEA3ACB4CE234BD5479A4F4296001305826F23083CC9DC99011864F250E77E42A0DE26AB09FF6E3F32552F6F913256729B357CBF5DFC825E91BB5D3FAC1F729803D431D339955960EAD69B1E54536CFD774341CDFDE1D1F527DA4E738B2E292BDC884687D1016DC193EDF34A37D284D026D33698295E864196E0BF16FA83A35F65FF2B38B7030E9E63EAAF594F272E07941313D538546BC84671739AF822391CA4DBE6A579A81F45FF51FA5B7EF49BEEE7BEBA4AE07452C13366668F02752923EA3653043B26C883799FE6352F95144283D946CA87143B74C8A009C024D073BAAB9BC4DA6C87D35FFFD753E1EEC7F01944639E566FE17A6F715F4197D1CBA58D3D153BDA37D7D2D5E19620FF0842527D109333FA2BA8BFC491689F4551BEE6C9D13BB9E69EE4F44B782BB05D1E48D293BC15B9FC706D52B021C7159FF7DF80E55627DD7555795F1FC616830A4BA2C02FE1A19DABE088E460BF3C5A88313C443179C593458467FAA468791CA74E9B1E759847B6939F +pk = 342D41E195BCC0F17DA0EBB52E2F503ABE98596EAFC8FB8C7DBDDBECC804E3A98E62F28975B02654ECB0A47DBC35B83208DEBA3B070EF3DC4306DD99CC3C5656B2B9DBA958CDF58C01DBB0D608E48237A92762DB5A9E12F64BFD0973CC173A171D +sk = 342D41E195BCC0F17DA0EBB52E2F503ABE98596EAFC8FB8C7DBDDBECC804E3A98E62F28975B02654ECB0A47DBC35B83208DEBA3B070EF3DC4306DD99CC3C5656B2B9DBA958CDF58C01DBB0D608E48237A92762DB5A9E12F64BFD0973CC173A171D1B3F98CE8E446BD44A227574700A0D96C001250901E28B376F0400000000000000000000000000000000000000000000746D6E4836B16EA500413AC81D06B136B954408DB06DE29993F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6BC6D0D99D0A815F4D7537C83F124F013244E9E571D0A02BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006C5964DE3476276A57549C85B34771FC6C99830D71D3E1FBF4517B837D56ABE24669136F37162CD24D48DEE12B76BD00D105CC75926C995AD5DEEC969A54F43F950095FA33D168004A9F5CB86028825BD8E2FDC7AFB37839A113755552E797004FA82535F5D28F248B6599F9096413CBE862E4697267F6B8A082D212190BEB54D29E5AAF92AD74DDD7B896F1A86AB000DA09A35492238275347A11AE7EB9CF040621C125410911CA39C8AE2CACAD51ED7C534A61578D76AA2D4EF66EFC160300 +smlen = 1346 +sm = 568E8181E19210876500B571B163BAEEED34FBA5DE528F79BC3C981AEFDC094B027480109833123B1483AA8B6BFF2A1AF0DCCFCA937E776EC61BEFBA8F15F5004BDB81023CCBC2268B1986A676011FD2F3C840C7C66F0239E9E53F5215078E230002A760EFADA971A446172D27B13A7AD9D38005BB9EAFAD6921026E27D40678395C5DDA7E125AD971B0DEEFE294EE52B148030099AA1194875D8A893CDE65F524BDD39AFD1E5730EEF6E0E203DE58CAC89836DB3539D61A928E953A7A5E472315180ED7CB012D556426359A7D328B20E16C4F23AEF99C5C3BE7601F16001504789518EE21DC99CAC94DD5298B2F3EB8F6AB8D0705D24D9AA3012F217464E7F203E08E5CEA9E44F54A6F73E88D81592826E243B7F0B2A1B3A06E5AFDE23A2985183A0E430E01C3FA90E9F1DB7E69DD8E7DC6FB802933E04A18834C091ECD46F0DD423F532668CEE8A12A06BBC7E5FF3B9488B8F4A87A92BB8D6F313269AD95C574245E06563BB58BFF6169B8F4C333033BC128B91CB81DD41B831DF5103B295F744EDE95FC3A0C72F1134A9321836AFCFD563192C343040B943F69C0E98E8D740C06CCF840CBFC6BF777C9561065916F13D116D758A151E8FF4C355363AAE8E4F49D2A2E062A2BB213AFF25662D95549B4B025E70AA3363B50D25AF84A3E5B0FFA598CE074733AD191C86C351592299C26C0A4933573EF436B73DFD0C4EACF93D361AFE5F824B91BC178EE8381B9EFD52302AB8CAD6C08C7E090393B9B8ABC78AF374FAC6E60BD104BAABA524E68D75A759B94176105A9CFF2E5B9C3984FF61C5AFBF22B8E1B9E4F9BDFFEC0B19C2A5C8DB3B8B2C02115D101805C1BD6652F738F02600E38998CA41BA8955094FAD5BDC34133D4B523EDE66CF483F1CD5ACD9EFAA69703807410939974D6DC033BC696541357DA9881A4FD1385671B6E4BB889C68B544175C1E2EC1395DFF4CC87E037087C615CAF40804D5F44A2DE301961A59818173730A45CF4C2DF172614AFF7199A40C9FFB9957242A89FF86B36A4F4D60F15DB569C2FEFAF677B35FE5F12AD5A323397714286E338FF6B9080FCA50B657DB477A52A93B243BF28CE2743794C361F443AD81EBAAEAB2B237EBBC572D8586C3EAB1F42BAEC1C985D28BC58B296A11D96A04B0E1F7F6790B92E450248804F3F62B5865941BFD444A910F31E1D6B79D8906E7E9828618F960EC14124FBEED28E1F58A8BC9D31773442FEDC5A220F3912D0B41267D427C0C15BB76F9200C54B5F050307E13F1EB3DE92B864C994A3DF4CEBD1BCA634710FA342E23D7C8A5BAC1B58AA321E215E4418428206F05232E2BCD1B5EE1BB7E34E7D4C93088991EE9DD643FD08B0185A2F0AEFFB0EF0EEA3ACB4CE234BD5479A4F4296001305826F23083CC9DC99011864F250E77E42A0DE26AB09FF6E3F32552F6F913256729B357CBF5DFC825E91BB5D3FAC1F729803D431D339955960EAD69B1E54536CFD774341CDFDE1D1F527DA4E738B2E292BDC884687D1016DC193EDF34A37D284D026D33698295E864196E0BF16FA83A35F65FF2B38B7030E9E63EAAF594F272E07941313D538546BC84671739AF822391CA4DBE6A579A81F45FF51FA5B7EF49BEEE7BEBA4AE07452C13366668F02752923EA3653043B26C883799FE6352F95144283D946CA87143B74C8A009C024D073BAAB9BC4DA6C87D35FFFD753E1EEC7F01944639E566FE17A6F715F4197D1CBA58D3D153BDA37D7D2D5E19620FF0842527D109333FA2BA8BFC491689F4551BEE6C9D13BB9E69EE4F44B782BB05D1E48D293BC15B9FC706D52B021C7159FF7DF80E55627DD7555795F1FC616830A4BA2C02FE1A19DABE088E460BF3C5A88313C443179C593458467FAA468791CA74E9B1E759847B6939F + +count = 34 +seed = B0C7530A52AC9F561C2C14548D3A5F5053396B738EA1C7A5190F5AB01C9C38719C4DBE856E42D37A114FA24FD5DF5081 +mlen = 1155 +msg = A4117808D9D05B702483924E99623E778E7A3B7623739AB7AC488ED93E711EBDDEC383BFB7E06086FD0C374F4668AB744AD99B8AF1C75309B60F55DC03FF7BE6F23187FFD5CB224068568CE2D06ABE441557B04A5A0C2858C416F6F7AA89A96ADFC2AFC54E0F31416CEED005B7B140B342652DAC7BF401FED4D94D475784936FCEB4B4F334BB14BA55B1EA9A36E2B0591287EAF4ACED997162691A96E7F59853E609ECA9A225F615A49A12763D80B5DFE6F8638923C39BD652936B19B944D5116F790E866A61947EB60CD1F3A1F319710D0F40E487EFBEF51FB4D00F5DBB94810128215F72B1AEDD74A1B1D237088DE3098417714EEB67D6A3E6BB647B6B0AC6D0BA3089D4CF6252B69C414E2BD6614429B6FCEABEBA50A4B53C7394652ACF7DD9403AE14436ED5FD4D1C9E238A8399A763806FEF5C3742C55B7159EBF5A13B271428F91229C191D617808A26AF9190F9D445BFD3B273702BC3E7F610854C8E86066BE7757960A880CB6727CEF19DC7B464C464A7DAC9AE85B799747B8488A4123B6BC7F0F7C2A8E53FD4F8687075B4E25660F5107ACF22CA688057DAE0496FF15A3EB9379A9F6E22FA43C932F137E389478C05DB86060686AFEAFBCB9ED79AE194C4146A48CE5E07EAF585279313851CB864A50075AE46C1AAB3B3CB920DEE2652F5AFA0138051C7C980946E8D5E18C16789CD184DC5598F65875EF43418DD56E11DEFB5A4A6AFBCE041BB292E0E2EC563296BA4EA6CBFDCCA32A18C8AA395515A83D0FB7819413E5AE056FF0EC2F63F1D52A8BE0B334A628D00995BEC7E46A34BCD2DCA0E9C5A88E0FC8C43843D6AE074C699276293FD8DB2BE48885155688428C2F5A6C6C91BD4A03CDE2126205F9EBAFE319D1B4F80277FE99211A09628AD840046EB9AA568EC71252CE9F69827B677D9C0D99546DF5A48A8D253AC0036DDAF4D045A70F94EC54BF5F06296B2C2617F2B0EC0B8374DD28DE269FAF739B1E55AE1846F548FB6C0403C5ECEE3CF9D1927E317F0D07E11AEBA01C240FE17C6660F7CB32305AF1EB6DE4312FDEA6990DA4E9135DBC0B88AD0AE0847E1576F3C2711B785B846C7A4B823688E4218596CAED583A90DC46BB9B27E00E4C1110B65F77E602F043A8441563667691C07162E52A53CD76E2D74DCAAA2983BF2E8F02CC30B05BD4F9AC731931C59F9EBC038FAFB09FBC886F4C4191352206BB49ADAEF9D74BD08A5B780FF0FA301343F5EA81D36912ECCB0FF24BBF0BE6A8283EBDECA79CFB22639DA38C9C639C4BD66FE5A75F0414FCC1455702856E6FC58344BF02998E17E967183AE920B7E04F58AA09145D6DA79B65EFCD18EC55BB9CFD53914F80D73C2B08BB754AC63E4C82D44B72376A544D97394B7C99678758B15CB94E71F9FCCF674B29ED5AFDCE452959BE5AF510D57F9E5395A576EAA1FA7BA9AA4122A779727071FA485C005B447760410DEE20B7C2299B4A0D5D9E5E4E038A19C87806C3FB875EA5BD7F47D034D7D5FEC4BF132B04E47574172D392EA7B371516190AB81C67B45FEF6332848A51B6C7DBA90C410A44E9A88AC082FE296A7435E7D2DDFC645D5AEBBC29620525757DAD1B0222159D658C7225D02374EE6AF479FCF1AA28CD91B +pk = 32A1114EFA96B9549306E0E515048E09A4A5DB317D3E00202D68486131FA9528CFB4C23055A806CC900958D4BC1C95258C0705132A272B29FE03B6AACF7D2EE9C269BC1DA3B5416F8B4161F746F9F236A954F3CB89D76CF3DEB5FA6BA5B5761E15 +sk = 32A1114EFA96B9549306E0E515048E09A4A5DB317D3E00202D68486131FA9528CFB4C23055A806CC900958D4BC1C95258C0705132A272B29FE03B6AACF7D2EE9C269BC1DA3B5416F8B4161F746F9F236A954F3CB89D76CF3DEB5FA6BA5B5761E151BBF0EB3713A5C62B6EB86BA90467E8ED0330EE24C645AD0D40600000000000000000000000000000000000000000000F6030D7193B083E61714F4EAB33F936382AD452A7880913E9FF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9CA331749225076979268168D51C2DDBAA6C57FAAF007F56FFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B582F4920EF85F8B62D23B9B35EBAE2F2F2D9B03BA45714A3AD9922788329E67216EAC55277DADB5F57B5C35F3B393000AC519CCAFF5857CFE464971DF24989E799CF9DFD73F02785FDD3838F142FE50AEAE07AD0AE5AEC4C7D1FF153F49CE00748057333E7C91DA46A60DDFBA837462F5BD2F30BD995FC322855E5ABDE46F9703E04C2D3C7BDB453ACF1405770254002DD0AFD79B5E261FDCFADAC8E442A8E48B8418766AAB9305FD1EBD35C430163DF1D66C9AEDEF7288AD5F9AFE5BB9CC00 +smlen = 1379 +sm = EEA4485793831D2D969A9CBD430A5C913AE3C3F6756309D60197E97A8356A99733B4397020A55CEA83AE59FE32B77A14C30C813FE61158457547273C3439C24541EE2129DCF670FA5D13D51B34E05471E808AC706DB3805424475D099E036811010135C3739993D6D3522B9486F764D862EBCDA5F9EEDCF1C7F5013F135FD57066AC8669955C17A5A60137E9BB049825B65C2E005CBD49178A5C4DB4F9367AD6644259E03EC5034E7CD4031000F24C944A379A00CA83ED15A965E54DEA86507AAB0651CDEA007B2BDDADE795AA46436E09CBD5809B67B7CD7DB879EF4C000206A4117808D9D05B702483924E99623E778E7A3B7623739AB7AC488ED93E711EBDDEC383BFB7E06086FD0C374F4668AB744AD99B8AF1C75309B60F55DC03FF7BE6F23187FFD5CB224068568CE2D06ABE441557B04A5A0C2858C416F6F7AA89A96ADFC2AFC54E0F31416CEED005B7B140B342652DAC7BF401FED4D94D475784936FCEB4B4F334BB14BA55B1EA9A36E2B0591287EAF4ACED997162691A96E7F59853E609ECA9A225F615A49A12763D80B5DFE6F8638923C39BD652936B19B944D5116F790E866A61947EB60CD1F3A1F319710D0F40E487EFBEF51FB4D00F5DBB94810128215F72B1AEDD74A1B1D237088DE3098417714EEB67D6A3E6BB647B6B0AC6D0BA3089D4CF6252B69C414E2BD6614429B6FCEABEBA50A4B53C7394652ACF7DD9403AE14436ED5FD4D1C9E238A8399A763806FEF5C3742C55B7159EBF5A13B271428F91229C191D617808A26AF9190F9D445BFD3B273702BC3E7F610854C8E86066BE7757960A880CB6727CEF19DC7B464C464A7DAC9AE85B799747B8488A4123B6BC7F0F7C2A8E53FD4F8687075B4E25660F5107ACF22CA688057DAE0496FF15A3EB9379A9F6E22FA43C932F137E389478C05DB86060686AFEAFBCB9ED79AE194C4146A48CE5E07EAF585279313851CB864A50075AE46C1AAB3B3CB920DEE2652F5AFA0138051C7C980946E8D5E18C16789CD184DC5598F65875EF43418DD56E11DEFB5A4A6AFBCE041BB292E0E2EC563296BA4EA6CBFDCCA32A18C8AA395515A83D0FB7819413E5AE056FF0EC2F63F1D52A8BE0B334A628D00995BEC7E46A34BCD2DCA0E9C5A88E0FC8C43843D6AE074C699276293FD8DB2BE48885155688428C2F5A6C6C91BD4A03CDE2126205F9EBAFE319D1B4F80277FE99211A09628AD840046EB9AA568EC71252CE9F69827B677D9C0D99546DF5A48A8D253AC0036DDAF4D045A70F94EC54BF5F06296B2C2617F2B0EC0B8374DD28DE269FAF739B1E55AE1846F548FB6C0403C5ECEE3CF9D1927E317F0D07E11AEBA01C240FE17C6660F7CB32305AF1EB6DE4312FDEA6990DA4E9135DBC0B88AD0AE0847E1576F3C2711B785B846C7A4B823688E4218596CAED583A90DC46BB9B27E00E4C1110B65F77E602F043A8441563667691C07162E52A53CD76E2D74DCAAA2983BF2E8F02CC30B05BD4F9AC731931C59F9EBC038FAFB09FBC886F4C4191352206BB49ADAEF9D74BD08A5B780FF0FA301343F5EA81D36912ECCB0FF24BBF0BE6A8283EBDECA79CFB22639DA38C9C639C4BD66FE5A75F0414FCC1455702856E6FC58344BF02998E17E967183AE920B7E04F58AA09145D6DA79B65EFCD18EC55BB9CFD53914F80D73C2B08BB754AC63E4C82D44B72376A544D97394B7C99678758B15CB94E71F9FCCF674B29ED5AFDCE452959BE5AF510D57F9E5395A576EAA1FA7BA9AA4122A779727071FA485C005B447760410DEE20B7C2299B4A0D5D9E5E4E038A19C87806C3FB875EA5BD7F47D034D7D5FEC4BF132B04E47574172D392EA7B371516190AB81C67B45FEF6332848A51B6C7DBA90C410A44E9A88AC082FE296A7435E7D2DDFC645D5AEBBC29620525757DAD1B0222159D658C7225D02374EE6AF479FCF1AA28CD91B + +count = 35 +seed = B2FD7BFAAFB667C9DABE5915C3BC271EF41F18588666A6F4990C09D098E62DB590110DF6A56F08C5E0DE65B00F91D60F +mlen = 1188 +msg = E82F5ACC7C1A326D430475357629D568EA3D0DBE131114781D5BF8DAA32FDE9F3CECD288ACD14445678C5EA6D3AFAFCE48EA3957A6AF8D8F23F78D84130FB6419F706EADD430CC85AFF48283F15602265059ABB075E011E3941834EBE70787CDD55F1E604C6B86F761D94C4F5E525791333DF6D43869D6F36B212A8F35583D38A21D0947CBE26FBE6A36E189C73137F2F2D89F48566D04D2DD9125D2EA4E0B2A7E5C1E9D2EA036CFADCF7BB28F6DF3B7D6395230C9D39D1E7558EA25340252708BE23EC6C0C9A0946C5C5AF0FE037C254D1A5B2B70B8F916CF37945BEF76BDFDFB19A0DAAC5A83A6357E986B3155CFF31024121634C3700CA99E5ECEF1F2E411C6621FED6092C1AB59860271AC7F431E568075D59F71AA18096195F30BBEB1A6BAC20E034F83C72BE0536315879F1D1B7F31D38C12DD8E97819B4803D02BECD436B61D1296CEB78EBF857E34087EC8AE8395269B5B0770B3423B39638910D2A3DDFEC8502389FD8B5B09FFD10CAAD1A5C86E7E39629AB09A4ABCDD00FBB9821F92E7DD24DDA83D1D9762F52A89BED6C20648EA04FBAD4233E5920AE83FFEC28FDB5E432929A41DB782B2CEA8FEB40CAD0B27903050B650477E5D9443A536ECDFDAC673952810596F1985427359D9E4797CABCCD2FA0C0A2394D853B4E6F8E150B3E3AB5136CF476605FF5FFA9067C0FE58A143B50B18B09256657CF091132D449A6E7EE79AA870E9DBE46BF840EDCB983F585EC2856C059808E72B8C901A25D6AFD5372F168D533052A6D26418E035D87D0BF818ADEA19915047C8D824A425A8C7915756673E0F5FCCB1B4FE7C1FDFCE505F7E18F023FDD32A605906EC48E0FA755B6D87E47711E158D672C5FB4CD3B8D1D13FE9EECE58453987CFCDD87B621B870F3AA27E73B6FB7FC0A6757893B978C63B7723C49D1005A1E5B1A4D60C4A2FEF392DF7EF97F149B499164455633FA485BDF92F804A47C8703D124522D73887A2B032F10F45343993FFB009D69E80FB54B6999A5BDB2760F8BCCA648F3C52BFA1D887AE49862DB4CBCCC7213ACBFDC48A57C3DA1F1EBBEA828182432AA1C593C3E5591C825E5706A5F9503311E91EC3D8F4A9554C3DF915B5FBE0516A7A5597ECF8862A8DF286ADA96C90C9F2783F7F947A18EBBC64C1BAF24B29F77521A9EBE09BECFFDB902EFCD024046FD3E6182BF0C84BD3A0A5410EEDBABFC60114E5DB28B0943D79F58F766E2EDB16759850D4CC3A9A57AE073CF6F3B24D36A4365E2BC64674259170B6D11DFF63D0DEED085B6321C45F218E09351AA0D4155189CC98DE5627A03396A067AB3FEA2C133062E3823FB1CAFA5D592070C8E82ABE812979DBDCB6D2E595F33830AD0E8E2F9E6CDC4D9C74B8026EAD1815DE36772769C4E00806F79950A40C979C14A4BDBFDB79DF1DE01FDFCAAEBC93DDBAD62BA166843A121D2B144559064E9DE9E310DFC93D624C1061BAD3195D6C9F46DB64C65A31E90371F9B644E2A15E01C262395269A9AE83F50776F852903F86E5518BD008CF1B35E78F910D48C0B7BBAAAD5DFF2375C55D56B8F65B922229D5F494EDCCD2D676361619FEDFE6BF0BFD7E4C77FC459F181120C4430C409BA89D2E5A8C36CC6200497611D9D705DA6AE1ACA4E16B389D632A982E017E1DAD95DFFBC7A7D7191E7B8FA1C0ED +pk = 67367C99EF4BF2D82FE6A1D67F48EDA9A153E77901A268C8A9A94B4549DD85EA16429B3E74D81FCA797A81E5B174E633677DD5F69E3A5BED02260BFF7F4C58DDD8B670BA5DCFF4FB66B0E2957E0400ECC6493CC4C06C157C29444CC755E62D1706 +sk = 67367C99EF4BF2D82FE6A1D67F48EDA9A153E77901A268C8A9A94B4549DD85EA16429B3E74D81FCA797A81E5B174E633677DD5F69E3A5BED02260BFF7F4C58DDD8B670BA5DCFF4FB66B0E2957E0400ECC6493CC4C06C157C29444CC755E62D1706D7675BEF536267746BFAD741EF64A53E9E3BF5D79D9ED9C1E70000000000000000000000000000000000000000000000F6357A9BFDC3F8F5F664712209FB682DAAA09F0DB79782B9C7FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55163FD4EEC9E805B2F2DFB49A42E1D87E94A44918341F59F4FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BCEC00DD1429D206E037D1603D23E2F2E3E6221C3F2DF837126ACB6E97C7FB4C19328321E4B94491E6643F07D1B4D400BB909C67E650A4621CBD4F89B77DA4C1081ECBF1EE90D839E0624EC04683B19BD213C31110917180FDED33F309660700FD5DE0A98895B7107B10772771E4A08DD201A61B6C210C535923AC2986AEFD07BFE3A52590509B4DC8D405917E253F00AE82DFC9F9ECDFEF7AE41381E363600798B0EC1478F5AE861C128A819F8BA413FCA898F9B4CAA9F0BA87E82388AB4A00 +smlen = 1412 +sm = 5F1FB120254CAE3A7D6C6EF9B6BB071C8591C0DF1F9D518440BD6B6DFF600B462D1A29F1C93FDB8541C14B55CEDFA40566B45F00BDC808A7071110DD33581E060EA829B578046127C699D1FD323F98EB5700845CFF54B718A5BFCC363FABAB2F000077D2DE0699869F5843C4D85C1F2855C603B3A598A1B7F59503B704433308D0EF3C1BC294374A4B30EB7CA8F797BD5708EB0327F9B1AA489E08499715E4CA160CC1A3870D1DE1C1968B4900029A3C801BCAD9DBF00117AAE56CF7BBCEF89440D23E86C902B80148D9970D04EF350A0CEB23EFDFE89998E1082E991300040DE82F5ACC7C1A326D430475357629D568EA3D0DBE131114781D5BF8DAA32FDE9F3CECD288ACD14445678C5EA6D3AFAFCE48EA3957A6AF8D8F23F78D84130FB6419F706EADD430CC85AFF48283F15602265059ABB075E011E3941834EBE70787CDD55F1E604C6B86F761D94C4F5E525791333DF6D43869D6F36B212A8F35583D38A21D0947CBE26FBE6A36E189C73137F2F2D89F48566D04D2DD9125D2EA4E0B2A7E5C1E9D2EA036CFADCF7BB28F6DF3B7D6395230C9D39D1E7558EA25340252708BE23EC6C0C9A0946C5C5AF0FE037C254D1A5B2B70B8F916CF37945BEF76BDFDFB19A0DAAC5A83A6357E986B3155CFF31024121634C3700CA99E5ECEF1F2E411C6621FED6092C1AB59860271AC7F431E568075D59F71AA18096195F30BBEB1A6BAC20E034F83C72BE0536315879F1D1B7F31D38C12DD8E97819B4803D02BECD436B61D1296CEB78EBF857E34087EC8AE8395269B5B0770B3423B39638910D2A3DDFEC8502389FD8B5B09FFD10CAAD1A5C86E7E39629AB09A4ABCDD00FBB9821F92E7DD24DDA83D1D9762F52A89BED6C20648EA04FBAD4233E5920AE83FFEC28FDB5E432929A41DB782B2CEA8FEB40CAD0B27903050B650477E5D9443A536ECDFDAC673952810596F1985427359D9E4797CABCCD2FA0C0A2394D853B4E6F8E150B3E3AB5136CF476605FF5FFA9067C0FE58A143B50B18B09256657CF091132D449A6E7EE79AA870E9DBE46BF840EDCB983F585EC2856C059808E72B8C901A25D6AFD5372F168D533052A6D26418E035D87D0BF818ADEA19915047C8D824A425A8C7915756673E0F5FCCB1B4FE7C1FDFCE505F7E18F023FDD32A605906EC48E0FA755B6D87E47711E158D672C5FB4CD3B8D1D13FE9EECE58453987CFCDD87B621B870F3AA27E73B6FB7FC0A6757893B978C63B7723C49D1005A1E5B1A4D60C4A2FEF392DF7EF97F149B499164455633FA485BDF92F804A47C8703D124522D73887A2B032F10F45343993FFB009D69E80FB54B6999A5BDB2760F8BCCA648F3C52BFA1D887AE49862DB4CBCCC7213ACBFDC48A57C3DA1F1EBBEA828182432AA1C593C3E5591C825E5706A5F9503311E91EC3D8F4A9554C3DF915B5FBE0516A7A5597ECF8862A8DF286ADA96C90C9F2783F7F947A18EBBC64C1BAF24B29F77521A9EBE09BECFFDB902EFCD024046FD3E6182BF0C84BD3A0A5410EEDBABFC60114E5DB28B0943D79F58F766E2EDB16759850D4CC3A9A57AE073CF6F3B24D36A4365E2BC64674259170B6D11DFF63D0DEED085B6321C45F218E09351AA0D4155189CC98DE5627A03396A067AB3FEA2C133062E3823FB1CAFA5D592070C8E82ABE812979DBDCB6D2E595F33830AD0E8E2F9E6CDC4D9C74B8026EAD1815DE36772769C4E00806F79950A40C979C14A4BDBFDB79DF1DE01FDFCAAEBC93DDBAD62BA166843A121D2B144559064E9DE9E310DFC93D624C1061BAD3195D6C9F46DB64C65A31E90371F9B644E2A15E01C262395269A9AE83F50776F852903F86E5518BD008CF1B35E78F910D48C0B7BBAAAD5DFF2375C55D56B8F65B922229D5F494EDCCD2D676361619FEDFE6BF0BFD7E4C77FC459F181120C4430C409BA89D2E5A8C36CC6200497611D9D705DA6AE1ACA4E16B389D632A982E017E1DAD95DFFBC7A7D7191E7B8FA1C0ED + +count = 36 +seed = C08E846A8E039C8655651919A8433D475F494899FB617DC3B4715DEF0C992C195CE38158B7FF40E0684B30FD7E623265 +mlen = 1221 +msg = 743E5D96B9B4C1469E7AD2B3703F711FAF60CA335358FF3EFC8FCFF02CD020A443243B4169F9123351B6C36762B85BE5E5EDDF8D4B43D82CAA615788406A31CDF4F7087D42DB21AE48A069AA23A8F6D20A1C0762F973E526F011DEC737E986CC324724BC5336D0362525757410E21046A12AC54F2237E68DA036A5C1389E46A53ED8C21774906948D4C9E14F40519C54DBD02B7A4ACAABD24FFD7F6CA4D6D582EF48940296D2893415E811FE7EF0801B35F1C594E6FEA2C293869BBD45618B6F04FC26B55D55A0AE99445AEA12F851B7E58A49CC6A0044F28E3EB838CFA6BAC5DF53B0DB78BE2CA2BEA1BF2DEFFEBD673A783C91A6C9EE710B12042EC2863A9B52EADA5B0D32101BBA8338F7C75CDAE7B7FD6797B25F96ABD53A24A7647A1C91610306FFC72A8DA4D46B1778146A98BD59CEA3173D41D5A53F9A7F9E282B5FDA1AFB062D8AFB63CB19B0E76DF782FEB9F7FD50902133529CFDD7C51AF297895EF6E1871AFD4C3DE93DEFA8FCF1FE67BD27B7EEB0CF37A6A8E09AF1203922BD9B62672D4756519CD09DD9271ECD0285F92030A9FC81C09BF2FAE86F5F50596C628E0BE673571CBC2FD76C563E113004529B234FB50E9E3D6D1F814CB8E5B5CC3EA365D0BC7602B146CC0361397D9BEE9246FBA3A724C462E177D27836093EC009741ABFA28379AEBCF5EF09BBCE00CE449FEC3A3302FB9AD0F010CA338363539DA545F159FBCD3D6A0482454023587A324F5132FB6F4CA602FAB2CF6CD59104427264CC9EDE8D10CD9DD7FA6133E65693DBF744443AE920994226E21D98634BC7F0710DBC37C18203EFA5ADB467B523322E21E4E686B6B85B00CB501ED84153BAECD4D6CAC9D1183E38B510F7B1DBBE5995BCB717529B83FBBE969DFD8DE21183762FCDED692B16502834FE8E7A7C46F84ACDCD2C9975098CF0CDE8AC0EFAFA449DC26840180DCD9353A2F1B06962677C808B07345E8ABE95B8D24F21D751A4EDCFA0E02FF077DE64E6B992E8C8822682DCC7F03CA7582FE7C74E0A9822A02D888FDDE1FC9E73C2EDEDDF32001E918771E5F511EF8F88AC19B76FAC0C812F56938F814D712D99269D7802E47634E541B54E00F9EAF78A421506A88B4BF7332DFC7D79E8C41835031FB449507D19D5A8A512A5C527C95B6F21EE3E41FA43591DD9BD2E4293701BDAFB624E0EA290DA4B7A173003867C4CC3FD814E117B4EEE283C58F5FB33D653E410F68C8962155B8C4FBC13BB750A0343737D1FAB36EBC618A6A7C8E6F93855CB24937B01C438FA713D334DF335D0745582F680627D8B94CBC25F0D12E3B1C27A3ED72E2558B800C19DC6B719B961E0FEE43BFC34E999027CA1969ABA4C45FDAB9AF01B955E948DE951F5A1088BEDA43AC930FE99D8CBB3473475C444F43E928E1A44966265B38FADF9B1183700A95A81F85EA43E5C61DD9B2D67701C95583E8E3F15083717E1722D764B6E624505347C30E5E70163ED9A046C504FF534956E911294D2B9097BBEEF8740377EF0D6C4CC8086422902BF63556CE6DA8E33E68FCFB42707C00693A995D17680B76293194DB217EB5A928303DCF1814E4A881B057BAF2553AC4FAAC8E4BF23FD4074154CD4AE189FF7E204EEDB8EDD594CDC21B5B7D73A712B511D068F4D217C0F91F9D84C524D973D67AA741EB13FE922AFABF79CD2396181143783030FD2D0CFEFC877934D8037A4C32AE8E15B50A6FA4269 +pk = B8E9F9A0EB150608CC94B4A2BD8EB2CB923EFF312CF6109C0A2B3266838A6D336D3D5D86E95D678ABE10F3A89B2E51108ABC888CB0685971781EDD53E9E1C3DFDF412AFB20A0AFE71118C62E46740FB5250E4AB9F312019FE42B5EE6C5FF283D17 +sk = B8E9F9A0EB150608CC94B4A2BD8EB2CB923EFF312CF6109C0A2B3266838A6D336D3D5D86E95D678ABE10F3A89B2E51108ABC888CB0685971781EDD53E9E1C3DFDF412AFB20A0AFE71118C62E46740FB5250E4AB9F312019FE42B5EE6C5FF283D176F47853B90D539E55BA35B5D8081CFC220DA737BF58A722B150A00000000000000000000000000000000000000000000E6159EED862A5A8927E2753FA059A1017516447BFAAD2956D3ECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9396AA0AAF1AD7BBE15128C734C402A7CB05C0F3932E50C015F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001B0D5A9CA88EABC72C8A10F4A55AE8C26F6B5FE21394CA616B025B76A51D06E318047791EA06D08E0E034EDD04614F00E175ADD378956D210B1DC39CE5D477FE8FD93ADA88AD90F1B5D47F892AD3B61B9478E85759B66A5409736C49252CD100FA9B26EC9901D5F62CE1EE86221A834208FE0E54E9958262945B7DA9FD583B31B6931674C108ACCDE800354B19BA0F0091BCA4D9E290F6651BA92B00D26CA021ACF93FE75C231E156CBE095F4230690A861A929BBC42B94E8FBBFA6AB8A24C00 +smlen = 1445 +sm = B0FF334974D8CBB67981EBB9804079D7A9D39AF5F4F501238DA754B37CF9AE1F9C84A070E52544BD681D6F8368581E06E3BB4EB28AF28EF04D612F5EE63F9954DCB7AB6087A05B8F8BACE06B6B456F3F0FC121EA9FD93BAF41F998D80F8FFB3A00010E9C7CC01A91F6853064B8E2CE9630DB63894B395A2836C6018B3D115F16431719709D96D5C03507B206EDE3497F9325B100B2C193917A72FDDF1BC4DBF22D2747A058EAE77958141E7D0148994940038F2ACFF69FC724000C2D74770F4A81DFBA5362009A9783CDFF6E5F861C53C22D3B8B31F72E79477BE62690000202743E5D96B9B4C1469E7AD2B3703F711FAF60CA335358FF3EFC8FCFF02CD020A443243B4169F9123351B6C36762B85BE5E5EDDF8D4B43D82CAA615788406A31CDF4F7087D42DB21AE48A069AA23A8F6D20A1C0762F973E526F011DEC737E986CC324724BC5336D0362525757410E21046A12AC54F2237E68DA036A5C1389E46A53ED8C21774906948D4C9E14F40519C54DBD02B7A4ACAABD24FFD7F6CA4D6D582EF48940296D2893415E811FE7EF0801B35F1C594E6FEA2C293869BBD45618B6F04FC26B55D55A0AE99445AEA12F851B7E58A49CC6A0044F28E3EB838CFA6BAC5DF53B0DB78BE2CA2BEA1BF2DEFFEBD673A783C91A6C9EE710B12042EC2863A9B52EADA5B0D32101BBA8338F7C75CDAE7B7FD6797B25F96ABD53A24A7647A1C91610306FFC72A8DA4D46B1778146A98BD59CEA3173D41D5A53F9A7F9E282B5FDA1AFB062D8AFB63CB19B0E76DF782FEB9F7FD50902133529CFDD7C51AF297895EF6E1871AFD4C3DE93DEFA8FCF1FE67BD27B7EEB0CF37A6A8E09AF1203922BD9B62672D4756519CD09DD9271ECD0285F92030A9FC81C09BF2FAE86F5F50596C628E0BE673571CBC2FD76C563E113004529B234FB50E9E3D6D1F814CB8E5B5CC3EA365D0BC7602B146CC0361397D9BEE9246FBA3A724C462E177D27836093EC009741ABFA28379AEBCF5EF09BBCE00CE449FEC3A3302FB9AD0F010CA338363539DA545F159FBCD3D6A0482454023587A324F5132FB6F4CA602FAB2CF6CD59104427264CC9EDE8D10CD9DD7FA6133E65693DBF744443AE920994226E21D98634BC7F0710DBC37C18203EFA5ADB467B523322E21E4E686B6B85B00CB501ED84153BAECD4D6CAC9D1183E38B510F7B1DBBE5995BCB717529B83FBBE969DFD8DE21183762FCDED692B16502834FE8E7A7C46F84ACDCD2C9975098CF0CDE8AC0EFAFA449DC26840180DCD9353A2F1B06962677C808B07345E8ABE95B8D24F21D751A4EDCFA0E02FF077DE64E6B992E8C8822682DCC7F03CA7582FE7C74E0A9822A02D888FDDE1FC9E73C2EDEDDF32001E918771E5F511EF8F88AC19B76FAC0C812F56938F814D712D99269D7802E47634E541B54E00F9EAF78A421506A88B4BF7332DFC7D79E8C41835031FB449507D19D5A8A512A5C527C95B6F21EE3E41FA43591DD9BD2E4293701BDAFB624E0EA290DA4B7A173003867C4CC3FD814E117B4EEE283C58F5FB33D653E410F68C8962155B8C4FBC13BB750A0343737D1FAB36EBC618A6A7C8E6F93855CB24937B01C438FA713D334DF335D0745582F680627D8B94CBC25F0D12E3B1C27A3ED72E2558B800C19DC6B719B961E0FEE43BFC34E999027CA1969ABA4C45FDAB9AF01B955E948DE951F5A1088BEDA43AC930FE99D8CBB3473475C444F43E928E1A44966265B38FADF9B1183700A95A81F85EA43E5C61DD9B2D67701C95583E8E3F15083717E1722D764B6E624505347C30E5E70163ED9A046C504FF534956E911294D2B9097BBEEF8740377EF0D6C4CC8086422902BF63556CE6DA8E33E68FCFB42707C00693A995D17680B76293194DB217EB5A928303DCF1814E4A881B057BAF2553AC4FAAC8E4BF23FD4074154CD4AE189FF7E204EEDB8EDD594CDC21B5B7D73A712B511D068F4D217C0F91F9D84C524D973D67AA741EB13FE922AFABF79CD2396181143783030FD2D0CFEFC877934D8037A4C32AE8E15B50A6FA4269 + +count = 37 +seed = 1D9C060EA0408A068BD982D9694D39D02BA5A473378F6F9F09349F686566F331E767263FAFF5DC0E823BB6F648843876 +mlen = 1254 +msg = 3382E87BA70EA986A044B0CBA2EAFC3316C1AC95A5F16F6368C210DBEADFAE6CF2382DDF5078AD594CDE3BD1A837C517B1A20A2099D938DF6AA02B6C0E62FE6147C904BCF3EDE51DDDA60DE7887DFEB2866DB402D23E5934A74C9CE4852D4B2F53CC9BCDDA312964A548F6F7C8320AF1D1BDBA7FD32EC6C86BC3FCB4205ED3DB092FDCAD9AC4D2B8575883E13F69D8C16CB18D1B9284B31823ECE917C905C5C8B9D180C1BD87975871014F773FB57D402B8FE16EE312692665824CF0BCE4509326A31957319364CD421E9B21BBC1DFF663ED850858A2450C2FFE64B65E009A3999CE4504BA5313BA0EE4A8843349C30FA6E59FD3ACECA130A37C04F9B64722608768973996112684B64D0C87BF95E5DD60661935831A6A1A9575EBCB2F64A15296BE788C775D80523D6BB4267D91B0C71BA5F90DDF1933DE898E79FC7E39D0A3D146F185214468DA50AEB47402AB542E52CEB768A70CB1F749E4164CF20E549B674CE965FFBB98D874D34B5B7851E575E6C1E4DE9C170A10DAB84940AF055A951260B0119F5ACBA320B55CDCE4F16346905A2073CD9FEFBA95734E4F4DFDB7A33F292D45698831F1D3E9FBF56D9692C14A8F9887265CBB4441AB331D977E3A68A1BC9F406AE0FB1C6E91205670641B9868E2A987BACEEE2364FDB089A63B53976D600BD7A8AE88A02872E46927269D281CEFA385C98CCDFA6609394943FAC32237368C6203AAFABDE072054AB5A14A91391D5A943F4ED4A4407F275CCFD15FD28F1AE0EB6EDCC6612E3436572919E4DFB57C049BD77B344D8E04152863EFD4FAE8FE3A7230AEAAAF82870820085F4B3EB5215111B6B8952CF2FF468B3D10F3AF849F16E190E9560F40B05E6E2204591B58A850E2710F7043AEE2A44A6D4A108CEEDEB2D216E51102DD08751925DE6A7F67BCA1980F0789B34E2F86729621F2285C5D3A036CD87C76102E9D607C37CCDAC8062CEB961053F3195B5ABD88BC64FC65F8BE34166841683F1EED291938F75DFDB3AF4FD2AA98CE95382ACFB5D5DFE6EF243C8A0B19B80584FC0CD533E38BD485D1C52E0EB5BFF90C0A947D9B9095AC1C0CE9754EABFC860990206B981235C7B612DB61C9FDEFC0F14DBF68A8A0EA4986CDC4AABAD6C218559E11CCEECD804EB98446FB33EAE47C0388BD8972DDAC02CE807B707D6D188CB31A1D76D44323E93DAC4F8ECF77E7896C052EF16009CE4D1147DF84FD5785D95D77310783F9AEFF1DDA693F4BED26457ED82A1CEA19D9C4919257E3050B25A7D1CE7561740DDAC3FD93A607C79875E050E40498BFBCCA95BDB3D0FE639DC7CEA80E3DAB3AD73A4265F012451C1BCC2FDA1E1AEBB7FB18407F31E7496E2A18D2C686B47120688240A2FB134A3C314D4CB422811E850524684EC485E061F7365494A6403AF170DA461A3BC32FFAF9143D5E9B17B2285C56977AECAF880CDD34F26120DAC4C950198233A50654EFACA6EA97333D2BBC024A5E668821D20333DF0B712510100AECAB6B484CCB7814178F851A3E6BA0B76F16C4685D5AC8BA48558D382ABECBDCF0B919C1ACAE46EBEB5011DD0B3C22B539810720CFBE4CBADB111E100C09C811E724A67C66A1B89EED1E7218861F55A4DC55E236C6E3521DCB374437A14E8000DBEBF0F7F9BF409AF952888675C11326D9E3E8A8828BF50CAECFF96075CF29446CADA373529D310660CBD60C042C143E1736FE7AFAF6FBE42791A8DB01EC0475145257FE2DF766D4EA972B14AE5110B8F8F42D659383E9BD76 +pk = 2921130EFD0F72C45A9CC84E8B1DD2582010EBF53F3E4661653226F742B1990BA00CEBAC0B436AEBE5EEB5E5D26C8A306A996C1CF4D86C4E91F53658F1A15150D82B93667533BC53306719B0227B964B6316A2FAD1A5D1665533EB1484BB1B2A0D +sk = 2921130EFD0F72C45A9CC84E8B1DD2582010EBF53F3E4661653226F742B1990BA00CEBAC0B436AEBE5EEB5E5D26C8A306A996C1CF4D86C4E91F53658F1A15150D82B93667533BC53306719B0227B964B6316A2FAD1A5D1665533EB1484BB1B2A0DDFDD97B9B03ABDCC091B285C7D034D7EFD7AE4034F649C5F2F040000000000000000000000000000000000000000000060A3B4E8F5E1C5F65E4BCCF102EF43B109CDD1FAED40457531FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC18EFAD69334CF7521F23DA27CB2D0CE407297AA5FAFF85899FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005C4C1962821501B0707C52F9EB306C4008E83AA111A53F20183639AD30B5EC155DA53751DA29D794F4FB7FE89C14C00DCD01E6BC39952BB5FA89E081C7DE683C4E20CE76D2E63DC7BE988061537F6C02AE1B619C3D172553B2538869061BF005D3ED65B86493C1963EFB78B71B9CEA50C9F3750C500C5B238D9FE950054BB750B1DC333F605C86B56DA9C0490DDFA00F1BFC54E8DE621FF4CA0F755AE83F7F3E718B6A102F457377B7B9DCF40BA7EA707056CF9E750D03A12878B2665D82D00 +smlen = 1478 +sm = 499F38692573F25B15B98B402DC33BCB867F93F8233B67DBDAC212477A48C006382231A9E5CC92106369863F14A0852C2C30DD94514A149CB47A8602CFCFFAB0C837AD4FA0C66539A2062A51E50DB78C112902C08678A6D7B44F8BCF808E1A4000003C73EC604BA7918B7636BE10D41C3F89D1A54D21E1AB3F8B032B4A47CCF195889F7222305A7B074136278073F16A80373B00F5024522B07F7B16A1E79BC7F3810D396DDA8ECAB676AEC90009F12F88F4ED03FEAE4995B410BAEF1533AACD940728AD3C00BC90684ADB4D7E0FDB9A2DD15D9718190FD5E5724EFD4D00020D3382E87BA70EA986A044B0CBA2EAFC3316C1AC95A5F16F6368C210DBEADFAE6CF2382DDF5078AD594CDE3BD1A837C517B1A20A2099D938DF6AA02B6C0E62FE6147C904BCF3EDE51DDDA60DE7887DFEB2866DB402D23E5934A74C9CE4852D4B2F53CC9BCDDA312964A548F6F7C8320AF1D1BDBA7FD32EC6C86BC3FCB4205ED3DB092FDCAD9AC4D2B8575883E13F69D8C16CB18D1B9284B31823ECE917C905C5C8B9D180C1BD87975871014F773FB57D402B8FE16EE312692665824CF0BCE4509326A31957319364CD421E9B21BBC1DFF663ED850858A2450C2FFE64B65E009A3999CE4504BA5313BA0EE4A8843349C30FA6E59FD3ACECA130A37C04F9B64722608768973996112684B64D0C87BF95E5DD60661935831A6A1A9575EBCB2F64A15296BE788C775D80523D6BB4267D91B0C71BA5F90DDF1933DE898E79FC7E39D0A3D146F185214468DA50AEB47402AB542E52CEB768A70CB1F749E4164CF20E549B674CE965FFBB98D874D34B5B7851E575E6C1E4DE9C170A10DAB84940AF055A951260B0119F5ACBA320B55CDCE4F16346905A2073CD9FEFBA95734E4F4DFDB7A33F292D45698831F1D3E9FBF56D9692C14A8F9887265CBB4441AB331D977E3A68A1BC9F406AE0FB1C6E91205670641B9868E2A987BACEEE2364FDB089A63B53976D600BD7A8AE88A02872E46927269D281CEFA385C98CCDFA6609394943FAC32237368C6203AAFABDE072054AB5A14A91391D5A943F4ED4A4407F275CCFD15FD28F1AE0EB6EDCC6612E3436572919E4DFB57C049BD77B344D8E04152863EFD4FAE8FE3A7230AEAAAF82870820085F4B3EB5215111B6B8952CF2FF468B3D10F3AF849F16E190E9560F40B05E6E2204591B58A850E2710F7043AEE2A44A6D4A108CEEDEB2D216E51102DD08751925DE6A7F67BCA1980F0789B34E2F86729621F2285C5D3A036CD87C76102E9D607C37CCDAC8062CEB961053F3195B5ABD88BC64FC65F8BE34166841683F1EED291938F75DFDB3AF4FD2AA98CE95382ACFB5D5DFE6EF243C8A0B19B80584FC0CD533E38BD485D1C52E0EB5BFF90C0A947D9B9095AC1C0CE9754EABFC860990206B981235C7B612DB61C9FDEFC0F14DBF68A8A0EA4986CDC4AABAD6C218559E11CCEECD804EB98446FB33EAE47C0388BD8972DDAC02CE807B707D6D188CB31A1D76D44323E93DAC4F8ECF77E7896C052EF16009CE4D1147DF84FD5785D95D77310783F9AEFF1DDA693F4BED26457ED82A1CEA19D9C4919257E3050B25A7D1CE7561740DDAC3FD93A607C79875E050E40498BFBCCA95BDB3D0FE639DC7CEA80E3DAB3AD73A4265F012451C1BCC2FDA1E1AEBB7FB18407F31E7496E2A18D2C686B47120688240A2FB134A3C314D4CB422811E850524684EC485E061F7365494A6403AF170DA461A3BC32FFAF9143D5E9B17B2285C56977AECAF880CDD34F26120DAC4C950198233A50654EFACA6EA97333D2BBC024A5E668821D20333DF0B712510100AECAB6B484CCB7814178F851A3E6BA0B76F16C4685D5AC8BA48558D382ABECBDCF0B919C1ACAE46EBEB5011DD0B3C22B539810720CFBE4CBADB111E100C09C811E724A67C66A1B89EED1E7218861F55A4DC55E236C6E3521DCB374437A14E8000DBEBF0F7F9BF409AF952888675C11326D9E3E8A8828BF50CAECFF96075CF29446CADA373529D310660CBD60C042C143E1736FE7AFAF6FBE42791A8DB01EC0475145257FE2DF766D4EA972B14AE5110B8F8F42D659383E9BD76 + +count = 38 +seed = A4563D09AD21D3916BF4636301F2E64183A8F003DA186753D7F2DC3BE0089BA09C62B8A52B72C2C8451213606801FB29 +mlen = 1287 +msg = 67109894C579974373CA0054ED5F7C373B7AEB810721C3D9CEFA02EB244EF6B17507300370ADB24AE0173C6D114C51E05F822A770318033C082B6502F70012283EDA2A9DC0A1381F145470E5D3729D201773D2AA63C18885A92C962BCD3628835391D70DC36273DFAA4966F65AD40EB51FB4B416A8D0B1DDF39CB932EC4503BEA23E3D9D3B4501DB426C6AD99C28D415FB565F62EB5C22BB043C8CAFC42EBD1C7190DD32A5B14B571644471453740C081F3E3305F9AE70A5BD505874382EC0F6E2188563E763BB8D1BB8B16587AE25A6252F51E4AD02D0483C4A6E8AA2849C44629CF4B7C6DD6A5FECDAB0F9B2F0B35E306C7532B64BD5A3CE67A0247D97024AAFE5CBC13E375AA69B8287BBA9DDC9AAAC2BCF41A71E373EE36B13DF9F829BBEE8F48802DD9E03BE42A5E290251BB130E0E2ABCC4E096DD0F264E5D29F8C2388A0C3010E78F2A03F5BA1BE13AA5E50F2BA67A031CE3F787754B8276EA1AF62BC5FB4DD9A9B9BB84217A37EB9FC7AAFB517337B30454200D6AAE491E50D5007EAC2150F60F640A5C4624CE6D8112119413731322BAD9762BCF72349EE38E2A41102BC5461D72033072A90E82D105E6FCDAED9C223A4142CD55920196D7B1B9278C84B67A2E35BDE3C9CEEBB8E9007BA8758BD35C875DD5FA0A8FDAAAA9A09629B9DF69AFAAB456E105DABF2AC5834B8D223B0A406E0D1295C876C447E8E09C93FB09ED1B3EF6E1F3B7FCB029F576A45A12620567E05F218BC3753109DD29AE0ADE1370C0F871AB5AD8A9DBAA277FB869EE552E8733E73886D6DFEACE6B35E481F37A516EBE191DAA6F83E4FF453CF9CC9DDEA8EE507AF0E62EF3CB8C22949CB828E21C6AAF3FA9AC301E2257B0A054FF0A237F527D53EB757820AF637FFC9F983A2B5AFF0B4CC493E610314432C9C2F0FF73C4240D520D1D73721B429CE41807B7424B14F5EB1CD23D5562263FE1D58CB1D52E5175414800CB090242E240C3A7ACAD4C84DBD8ABC2731FA2B1D9820DA60FDB6BAA7EA849B6A146E07AF7FC201B3A98E5194BB5826945FACA3690209E5726F070A71EE07AE76ADB7E6199FCCC81C8AF7A463633A58873B4F7E65F522FDA409979DE41CF54F659E66CD5950A3A3E01570526C46417A00EC2E8821DC380ABFA21384D141D259CBB9722F267E46272ADC5CC4BCE382B554226996F4A6A1605287276C18A48C8FF1A92ECD2815CA5452FD6157FC27532680022993535549BF9AB064052E6DB4E9F83B5D0D885B94A90F59E67B9DF0C321EB0F95AC07007E4EE33BA89AABEEEEA01FD1172ECA4E31FB02C507FFE43CD0D6C8570769A180E68A70BD344B4C992E7D3A6BFB96AC4D69C2D4F5EFACA1D348DC1988DE44B30DA76BABC307A88124F96F26737A85FE6047E7E485C7E4B6B99B575FAEDC9BACA3E080E2B074CFFCE1F716C6A1D08234C45706D2883C6E5A001D02596CFE5B260DE6134C75DF3AC8BCF1919759E15576CA147CEBE041D04E369BDE70CC64157AEDA311C8DA520EAE907C33E30DD89013E24B7B02E66C9F285BF7D5C3FD65BAE24AB20D40ADDB451AB4BC4B9772D0B9039461BCA8D3D2A4D71A2E6BFBE7F02325FD571FCAE1FB47F855612F382188A5FA3D61C3E8E59EF016DB0149C52E1C7DC84030E6C93C4F32DA6CE5F3B8196AFFDE834D2ADC26CFA05940055401891519386BCD33D85584D74B2F16D8E19556C272AEE8397A1741EFFC283DBAD317740C1B67F8F4B7D2D1EDD68D6615EAC3F8E3CD26AC4F8058667FB388B19C654711B5B2EDA75A9AB55174157CBE08C186A3D0963BB3011A9567BD499AD2A8 +pk = 397560AB6EDE7504CD531608FCE28B0F8D6AD2DFD16E89D13333EEA40E4723A031E761C531974AAF1438764FB7BD7512178B6C32800395D9044ED277A6ADD0554F32ACC63B67A5BABD5C6EEFDDB4D51CC83616477E048506D161ECC3644FB01006 +sk = 397560AB6EDE7504CD531608FCE28B0F8D6AD2DFD16E89D13333EEA40E4723A031E761C531974AAF1438764FB7BD7512178B6C32800395D9044ED277A6ADD0554F32ACC63B67A5BABD5C6EEFDDB4D51CC83616477E048506D161ECC3644FB0100637A071DA1B4575848B08D28FE2EECF71945CADAAF719A7311D0C0000000000000000000000000000000000000000000084F09C0B7324B4209123925970C58DEA45EC446CCD324ADE05FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33DE2DC0BF51A3403446DF89E0CC119C574DC27C4B66A7D0B0FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075B5A01E8E9BF53CA7EC2AEAA8E80F521A47CC0D03C4EEE78161B93B25C09AC2382CD1FB5C47BC1BA8DEBA4CAE0A550037D728A3FBE104F026BBD9598FAF0C7F11B53DEFBFB92FC9DF41FC3848B197350C867BA80E599511779B52F7E72DB5009E87345E7D97CE1BCD3F8842A7DC8B46FBABF4078E1F0D8E915E7DEB7CCEF8375CB75E31659E3A9A75C3D00658881F00C3C06618C319213C1F30D206976E77799D91E5C6845834D56B6771EC142EDB60CC253310700F6D6C5BB98847368A3300 +smlen = 1511 +sm = 204C2F627751E7F7A63957A6758F01EE7CA9E290EDEDBE6FAFCD8E6EC1B641D5CC64A514AA25285FC853FC86DFE3D037CF76B8DE85BCAE48D3AFCE0015EC8818B00683AB2F594A845C0838214BF4A678572C1EF85C9C00CDCF0C2DD73E780B0E0000595DA5464350BAD046C36883E46D5F5B5156ECB220599F8403C25D66AEBC7961956487941818D0AD8B9731FEF4E4BD59140087EABBDB6DEBCC5493502B5036F22CD915CF724AFFF822B702199051A6E643256BC20D001574905A290E2D0D253235F57F02F767E886D224F870C318413D62DD6259DAEE2648689959000A0267109894C579974373CA0054ED5F7C373B7AEB810721C3D9CEFA02EB244EF6B17507300370ADB24AE0173C6D114C51E05F822A770318033C082B6502F70012283EDA2A9DC0A1381F145470E5D3729D201773D2AA63C18885A92C962BCD3628835391D70DC36273DFAA4966F65AD40EB51FB4B416A8D0B1DDF39CB932EC4503BEA23E3D9D3B4501DB426C6AD99C28D415FB565F62EB5C22BB043C8CAFC42EBD1C7190DD32A5B14B571644471453740C081F3E3305F9AE70A5BD505874382EC0F6E2188563E763BB8D1BB8B16587AE25A6252F51E4AD02D0483C4A6E8AA2849C44629CF4B7C6DD6A5FECDAB0F9B2F0B35E306C7532B64BD5A3CE67A0247D97024AAFE5CBC13E375AA69B8287BBA9DDC9AAAC2BCF41A71E373EE36B13DF9F829BBEE8F48802DD9E03BE42A5E290251BB130E0E2ABCC4E096DD0F264E5D29F8C2388A0C3010E78F2A03F5BA1BE13AA5E50F2BA67A031CE3F787754B8276EA1AF62BC5FB4DD9A9B9BB84217A37EB9FC7AAFB517337B30454200D6AAE491E50D5007EAC2150F60F640A5C4624CE6D8112119413731322BAD9762BCF72349EE38E2A41102BC5461D72033072A90E82D105E6FCDAED9C223A4142CD55920196D7B1B9278C84B67A2E35BDE3C9CEEBB8E9007BA8758BD35C875DD5FA0A8FDAAAA9A09629B9DF69AFAAB456E105DABF2AC5834B8D223B0A406E0D1295C876C447E8E09C93FB09ED1B3EF6E1F3B7FCB029F576A45A12620567E05F218BC3753109DD29AE0ADE1370C0F871AB5AD8A9DBAA277FB869EE552E8733E73886D6DFEACE6B35E481F37A516EBE191DAA6F83E4FF453CF9CC9DDEA8EE507AF0E62EF3CB8C22949CB828E21C6AAF3FA9AC301E2257B0A054FF0A237F527D53EB757820AF637FFC9F983A2B5AFF0B4CC493E610314432C9C2F0FF73C4240D520D1D73721B429CE41807B7424B14F5EB1CD23D5562263FE1D58CB1D52E5175414800CB090242E240C3A7ACAD4C84DBD8ABC2731FA2B1D9820DA60FDB6BAA7EA849B6A146E07AF7FC201B3A98E5194BB5826945FACA3690209E5726F070A71EE07AE76ADB7E6199FCCC81C8AF7A463633A58873B4F7E65F522FDA409979DE41CF54F659E66CD5950A3A3E01570526C46417A00EC2E8821DC380ABFA21384D141D259CBB9722F267E46272ADC5CC4BCE382B554226996F4A6A1605287276C18A48C8FF1A92ECD2815CA5452FD6157FC27532680022993535549BF9AB064052E6DB4E9F83B5D0D885B94A90F59E67B9DF0C321EB0F95AC07007E4EE33BA89AABEEEEA01FD1172ECA4E31FB02C507FFE43CD0D6C8570769A180E68A70BD344B4C992E7D3A6BFB96AC4D69C2D4F5EFACA1D348DC1988DE44B30DA76BABC307A88124F96F26737A85FE6047E7E485C7E4B6B99B575FAEDC9BACA3E080E2B074CFFCE1F716C6A1D08234C45706D2883C6E5A001D02596CFE5B260DE6134C75DF3AC8BCF1919759E15576CA147CEBE041D04E369BDE70CC64157AEDA311C8DA520EAE907C33E30DD89013E24B7B02E66C9F285BF7D5C3FD65BAE24AB20D40ADDB451AB4BC4B9772D0B9039461BCA8D3D2A4D71A2E6BFBE7F02325FD571FCAE1FB47F855612F382188A5FA3D61C3E8E59EF016DB0149C52E1C7DC84030E6C93C4F32DA6CE5F3B8196AFFDE834D2ADC26CFA05940055401891519386BCD33D85584D74B2F16D8E19556C272AEE8397A1741EFFC283DBAD317740C1B67F8F4B7D2D1EDD68D6615EAC3F8E3CD26AC4F8058667FB388B19C654711B5B2EDA75A9AB55174157CBE08C186A3D0963BB3011A9567BD499AD2A8 + +count = 39 +seed = 811A8A2ED2917CC616FAF246C5F9BB902E5FBF5430AB078AD6CE871CF8C160512A748216EFAB3A4CE1271AAFEA12C11B +mlen = 1320 +msg = 061934748C6758ECDEDDF3A2DF78574A470621496CE3F12E5E4555FEBCCC1A46A772FCBADEBA8B2EB5231B5B15DEDA5A38076C737E5D091A8CA8482F84EC4A20A51DDDA391088F2C3926F8E1D8B77DD0ABD606E9AC25A17A86A5C75ADC215C5030355C4A1B307C1CC80A3BC4A7D4B4044FD35D173A2C7C081318F707828A3438DABE0836C2D6C14E1643F05EF8405531D5594411AE4DAC6F3992279CAE379D7C1762B122037301D3FFE8EFD1BEB4E027E055527D485D0871F2013E7B25CC26531C2CA6DDB98B31F0AC2C3BDF400A0BAE942C9D4C4003F9952B67AF67E85F572EDC3345A84B6DC3CEBBAADB7E3C876AB2DA16ED0EACF4858033BF5A4F739F9E083A345C2BB5D8611DAE90D25AC45D8B3D39B4DE584CBEACCC6F5B6E61524349B50E818BB6B03C7E5B86795D49324CE6B1603791F20B3500A1B8ADE82359263470D777B35DBA38276096445842BA5D5E960FB2AB58730F970A15AA42D9737C33BE700127A7CE7CADE024D3ABCA59CA49F9A7EDF44DB62CCC07A595016868AA97A140178DC92530EFF864C24954464BA886DB7D74BE7B540BAAF807F1AEBD014680FF4A51E16E1391E32069EE823F3D23DB72244D657233578CB7D29A33E6EC31DF1FDD43B51742CC30EFC54BE83149177E7BCDE4450DCD142EB2CB745F8865DFD99DC84AB92750F1CFB0F3944E4E4EAA41261A1E8C58D9B230ADD792DCE20D2612823C0FF9F82E04B61E48DBB83F1A6DD5CC7F92BCD0A37AB3053803D1188029AA1FED9BA04F4C961588C9AD2BA7EF1CFBC50FA69B799898EB0DFE9668260CA5680F91A10D2BEF8F108AB28FCAB693ECDB942070D2B9B8BBB22609C8395C23D7482C31B69B0F555B7C079D3DEFAA5FB302ED92619C058ADF334E845EB1C6EDD903C0DE2AEDD3D9830943F8BCC5954B65DF37C901A17EF13FA75B0F2C8C1D2E38681874AEBFE90B463F2CC7831958FDC0DE0446991EB3C3612CC00188DFC1078FE458D2E5B80EFA7BFCE800C6B4CA0E570FA5858859633551DA28F36F1FF418A9B7AD18AA89B4612F9D676D5FD98BCE6F144CD7458CA9F2BC732A36A4D186EA290A009A870DA3C1F60617D56EA7554062367121F3E5E569503AA573B172C6278DDE5AA4CCDA79D9D8FAF41C6C9040C1D1D3CB78B41FFA8A0180395439F0D1B72E42471A9100973AB3BC7AEC559D94D2D6402374BA5A584DE168395A156324E1E4149ABD35C72AE0F79863CB59EE6BA22145E36E0D85D3CAF8A427D38C96CE489CD0AEA20D7960608C074CE3CD0494B6D6D5EC8895F0F03CE78982AD8FD6784BCF16825286C51325662F34726BA66D3A91EEB598124D6755DA090EF863FA31CCD5B08909A3279A35CFDCE24D2BA16F42AD280B029A0E27137A671C862B0E6F73FF4A1DE320C4DAFFB5CD4AC3522EF1C10E8A918005535F355CE6366B43A757938594366831DBF7EE72F311BE4953EDD1EA1C598960745D3DBB7F1E2D882CC063BC0791D18C6376A8497F2F91389A13AA96DAB78FECA081D761479848A5B4CC2E3D015F343B9000583E95E785A45A06842D7C6C0FE9AC4D70F085503D7AC954516953C497635AC8B7698BB784F73FE6E7F9D0AB9473E828168DF4EC142CC1FE18FA067525915ADF0764E44292A0316EF3C0A443683C92C4661409589EABD7B4DBD43F54317AE0E3D1C69C35A7868991FA0BC2F83430D89821B91A08DDC2D314A717F5BC6F3D89DAF163AF73E10C61630139E3FEDA723FEB2EDFFE6C7F364FBA22E6AAB75E267065B5E7575946C56265743816B2CF12A106AE21921E3E92BFB7FF80E105468F8409D6698E8660B5B05F3F4BB19A0BD4BE3569D24F51795752BE74C429AECA5BE737DE8C01 +pk = 45707F8AEE3375EB8343A5C0A577675EE06846B49D9D679706AB484A265A8F0D6F2EE4B936E6C5A7CF575569B715832079C77D46D45CB4F062928EB229E79F3F76C307B22283C028D332AB4C6F4CBD106A9ADC27069F262C2B764DC107C30D2D02 +sk = 45707F8AEE3375EB8343A5C0A577675EE06846B49D9D679706AB484A265A8F0D6F2EE4B936E6C5A7CF575569B715832079C77D46D45CB4F062928EB229E79F3F76C307B22283C028D332AB4C6F4CBD106A9ADC27069F262C2B764DC107C30D2D026342549D3FB3119C77E54BD0FE9FCC32F08A5A1DD84CF6ECD9040000000000000000000000000000000000000000000074F15D15B778DA066D134188B6D1FE5CC7D3AC29C409FDC4D2FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FD708C1FA6DC2883288FF636B8A185C5D8B4D6A1C7787FB98FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A95BECA55426E82F57DD95F70ABB2E850870DEDA5573504ECAEC399368AF45C77458649A91455E9DC93F4633C23BF005DFD9294E0FD6E824B23384ADEB315BED9389D9F65352456061910F92ABC852EF9D94A398C780655724DFB218AFE1900F9131F4935DD3EFE067B5EBD1A0A7255F1A9C299DE9023B9BD00F9101CADF6D70B212A4D915D615F6EF7A3602DCDBE00E0858AC902AF496A781A7ED9B5E843962EC6B198ADCA3EFA847F14DCCA7BB4736A1139273ECBFB5521FD614D9567D800 +smlen = 1544 +sm = BA90B3C924340B088E4F12AC1A4503D74FCD95D27558455C8D151F43A95E7C9FE91F3DB09B9B4CC3AF0620D5A709F810DB62B59A39AE9BB997C89CCB85760FBBBA614998A99013F190A6807AE52C755CFE60E4F3D9CEF1068ED7452B8C489F3C0100EFAF46A10D02FDACF50AAC3E9AFBF4819C1DBF9A70057F4700DBFE2D2B260D1E25023BD16431D661365108BA9EE860435F00BE8909852CCF63C800EF003FB409C9DB8E45594539582755008DEA56EB895F46CF7AC870C01184D2CDDB7C2EC902D9167C00CE4237A46C34E9D073D1E869149D179D6A3D78C5AAC400000D04061934748C6758ECDEDDF3A2DF78574A470621496CE3F12E5E4555FEBCCC1A46A772FCBADEBA8B2EB5231B5B15DEDA5A38076C737E5D091A8CA8482F84EC4A20A51DDDA391088F2C3926F8E1D8B77DD0ABD606E9AC25A17A86A5C75ADC215C5030355C4A1B307C1CC80A3BC4A7D4B4044FD35D173A2C7C081318F707828A3438DABE0836C2D6C14E1643F05EF8405531D5594411AE4DAC6F3992279CAE379D7C1762B122037301D3FFE8EFD1BEB4E027E055527D485D0871F2013E7B25CC26531C2CA6DDB98B31F0AC2C3BDF400A0BAE942C9D4C4003F9952B67AF67E85F572EDC3345A84B6DC3CEBBAADB7E3C876AB2DA16ED0EACF4858033BF5A4F739F9E083A345C2BB5D8611DAE90D25AC45D8B3D39B4DE584CBEACCC6F5B6E61524349B50E818BB6B03C7E5B86795D49324CE6B1603791F20B3500A1B8ADE82359263470D777B35DBA38276096445842BA5D5E960FB2AB58730F970A15AA42D9737C33BE700127A7CE7CADE024D3ABCA59CA49F9A7EDF44DB62CCC07A595016868AA97A140178DC92530EFF864C24954464BA886DB7D74BE7B540BAAF807F1AEBD014680FF4A51E16E1391E32069EE823F3D23DB72244D657233578CB7D29A33E6EC31DF1FDD43B51742CC30EFC54BE83149177E7BCDE4450DCD142EB2CB745F8865DFD99DC84AB92750F1CFB0F3944E4E4EAA41261A1E8C58D9B230ADD792DCE20D2612823C0FF9F82E04B61E48DBB83F1A6DD5CC7F92BCD0A37AB3053803D1188029AA1FED9BA04F4C961588C9AD2BA7EF1CFBC50FA69B799898EB0DFE9668260CA5680F91A10D2BEF8F108AB28FCAB693ECDB942070D2B9B8BBB22609C8395C23D7482C31B69B0F555B7C079D3DEFAA5FB302ED92619C058ADF334E845EB1C6EDD903C0DE2AEDD3D9830943F8BCC5954B65DF37C901A17EF13FA75B0F2C8C1D2E38681874AEBFE90B463F2CC7831958FDC0DE0446991EB3C3612CC00188DFC1078FE458D2E5B80EFA7BFCE800C6B4CA0E570FA5858859633551DA28F36F1FF418A9B7AD18AA89B4612F9D676D5FD98BCE6F144CD7458CA9F2BC732A36A4D186EA290A009A870DA3C1F60617D56EA7554062367121F3E5E569503AA573B172C6278DDE5AA4CCDA79D9D8FAF41C6C9040C1D1D3CB78B41FFA8A0180395439F0D1B72E42471A9100973AB3BC7AEC559D94D2D6402374BA5A584DE168395A156324E1E4149ABD35C72AE0F79863CB59EE6BA22145E36E0D85D3CAF8A427D38C96CE489CD0AEA20D7960608C074CE3CD0494B6D6D5EC8895F0F03CE78982AD8FD6784BCF16825286C51325662F34726BA66D3A91EEB598124D6755DA090EF863FA31CCD5B08909A3279A35CFDCE24D2BA16F42AD280B029A0E27137A671C862B0E6F73FF4A1DE320C4DAFFB5CD4AC3522EF1C10E8A918005535F355CE6366B43A757938594366831DBF7EE72F311BE4953EDD1EA1C598960745D3DBB7F1E2D882CC063BC0791D18C6376A8497F2F91389A13AA96DAB78FECA081D761479848A5B4CC2E3D015F343B9000583E95E785A45A06842D7C6C0FE9AC4D70F085503D7AC954516953C497635AC8B7698BB784F73FE6E7F9D0AB9473E828168DF4EC142CC1FE18FA067525915ADF0764E44292A0316EF3C0A443683C92C4661409589EABD7B4DBD43F54317AE0E3D1C69C35A7868991FA0BC2F83430D89821B91A08DDC2D314A717F5BC6F3D89DAF163AF73E10C61630139E3FEDA723FEB2EDFFE6C7F364FBA22E6AAB75E267065B5E7575946C56265743816B2CF12A106AE21921E3E92BFB7FF80E105468F8409D6698E8660B5B05F3F4BB19A0BD4BE3569D24F51795752BE74C429AECA5BE737DE8C01 + +count = 40 +seed = 41CC9DB2E90239AB5158A2628E7478D0B3512FDF84CD27A4CA5FE3119A455C22045F198C3C5C39F491FB975BD1CFF7F8 +mlen = 1353 +msg = AE2638D944822298959F47B2173DE7D1E58AAA622296AD4A4CB67EC7EAD8220AC2F171605BA2D08AF3D6FF5849566EAF96209E9E00CC28EB9A517CF5061545AAD24CCE143A2EE1AB7CFA259AD9C01860B33B0036F2CB3A5086861212F408C5F055D226CCC77CC884452B2670D89548EC1C6E98FB311DF03979CABF725E78956AF185447287BCA2517F554E9F25E19D93790318EFC5D2602FABF262E5C7FC307E5A991E0122E332A803AC4A91B318B30D79394248521190D2BE326037A89FE918D139F763DC8DAA2C3BBCE53F04809F0D97303F2F1B88B572B3086ACAF38EEF36B4C0791B4918204B0E1E923BCE9E3BB1E7BAA07135B176E266AF174D5DF26C44842CEAC4AE4C1CFF05557DA3DB8651261BE78D766699B1891CB825FA9A418C45BB9F7F2D347F3F92F9529CA6DB94E2FFCC69337FB3690F556C5A44CBBD9D79F60AFF063DE68B14BD2F4B7E8CDF94F6C2F40219D27F71E8AB3D4D6872A5D4B82EAF8E3943A6D425ED04FBC5C7596AE929AD680B245E3D6A7C5CCD7FDFA1D14EF0F72B9BAAEF05B7B84ADC02913DDBC76D5FE80DE30527FFAD1825CCBA34F8587C5B0291471D6957AD99C5FBCF3669B4AE5930C8AF68305C2D3E84E714CB9049A9560A3C94AEB95A252F69B68F755DC0E0AAB52DD054B670A275BD2BAD7FF8EC0CDE6224E9A0EB537E95DAB992C382D6B03FA045DA402CE7C5B55138FB400D9E86AFE30923AFEE82C4528D1B38CE16D33BEB47A96C18428D919BA98C9782806D6F4A40B52F7F0989337C724BE24E9A5430CFEA470D02EA36CA479FAEAD94A74049898D1F1BE53D5AB8CC0CDD5438A7C55827131DE264AECD18E5F5F2F9FD60E8D2D6F55BEB27EB77AEEAC2A15432A5F1467483BE6073243D0165A6C242FE1BD7B7AA701A0827F286ECB51E4C2626DCBE95466BC94A7E2A09AB334FEE3959CA31974B6286E2A2051653341623CF3ACA65637DF657280B6025DB0C0377EC09E6E32010F0F59711A30496695D23728319DFD0AB5F3AA69025276E68808130659D912A53693584188E310B1CACC41AF4B19FAD8DA95D4B35E2569053F553A9DFCBB8FDEE1455DFA0E4F5E94324C86A24288AE27F3576AE15FBC8BED49BFD8521D77A61FB523BADF0E3CEE53799016C6EE4E1E5DEFC19C7717A5C41ED8FA6BF0E5811BAEA76676DE03767A607735C2A48BEDE511012EAF1F79E4D2C3566042FF2C63BB82FBB399CE20E1F268D3844BB473AD7366EF86D064C5BA080FC0C01BDD2AD343C5367D80D2A058CF40725268CD34123C219D9109780335611B008EE3F8848EA9D174D7B96BD2FD9A04FA2B550DCF0B301D64C0764299D317DCD0CA05718A1AC008D86FEA330095E81567E83BDE31A0D635098D7B86176CE6CC4025E8628C73B394D9A45B09B64BFD3A424162B16E1ADAA1AB60006847C6D5CA5733237A330147CFE6B9170D7B88834BB79F1FDDEFCC0EBB1D4FEF326E28C41C919607BF12AD112807BF8582933DDB096F1F3E2BCD6BCBD844DA317CEA2A7688A5FBBA14D84C537814EC2B171ADE28ACF83EA481631B968C26F8D2BF2C5AF7D61A93378E1E23FC756E2F0EE79199475AB4BA1FBC55D9ADC2B05888B2910049BCA98DEFEFE96CDCB67CA9D4AA5BBFC6CA0ECBB78BF29035D158DE2A1708D98BEB85C70AD1C64B39B387516073E2FE85BD9EFA25CB048C224E0EF76547DCA67FD66485A97EB5E56C06C78FFA08EC1C9C6F2380912A2585CBCBA2CD702CD2B51022F63EC920412989BD743A8A8BEB07241E3E8EB38CA14CD400C83DBFA6FC8E04F58529007A1477E9613291AF877692E4CA9AE118A1902AE7B4AE7DC2E992A6495CD19DF32CE64131A8D8C41969A8BAE1D870DD5F1360BA9278D5B76E746FAF99D526199E87A4B1D3A5C48A33989F103CFB2 +pk = 31A17EC2473FA0B9A1305A28394E92D9264AF21017779C0B849D635EED965E658BC0E83C24BBA14BBD58B8EAF9E6E0107904D68EB2CC61F8DCE6442AC19E63A8B8C4974D67C884C80CD4A62DEA291CD7D66A98048DA64A413A24A85D8B363F3902 +sk = 31A17EC2473FA0B9A1305A28394E92D9264AF21017779C0B849D635EED965E658BC0E83C24BBA14BBD58B8EAF9E6E0107904D68EB2CC61F8DCE6442AC19E63A8B8C4974D67C884C80CD4A62DEA291CD7D66A98048DA64A413A24A85D8B363F3902213E557BEC77F3A3C5BFD846A6B7024B0CEB95DEBD3D15D9DB0500000000000000000000000000000000000000000000B692DA9A5BCBA7657BB5F1012524260D8DFED868A133295334F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15FC14BF77CA6477DD10C5109FC7FA21E677BBEA707E441F61FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021ADA029475C57CD0CC7F737E12E05A6D622A5443D6B5566B5F58442266411CB41C860895A0CB1760DD4608E6BB01A009DD2CB03E6C63BDDB50C6DCFC355E5327060A1E86AC90D6EE5BF3537CA4FB9C3DD7AFAFFCB2D8B7EA9277B33A171B800C1CB463D33D656337835CB34064E4840381E86938C8915F6E5F4C359A7B8548B64E11DF0DF67EB1F07ACAA3F3568B500C43A72BE7E894F743218F2F29D846E5A03313D6253763C5373A01854B12F2377B7600CF960601C96129FCE4653764200 +smlen = 1577 +sm = 514EBAC64305C83AD30FFE55E0F6A94AA2CF6A7D94723880F0DE9502E565F095B809FC2D9F0B28A9B0D7C37CCEA4C50EDD54629E4F8B8F6E6A81F3E28F21A10A8448549DD6571387C1066900113277C6EF219D33F4B00DAF397F028376EE851500009EBCFB4AFC8C56DD4E69C65A1A6D8482DDB8E6DAF7A92D0B01B7A42B1E84A4E41ADC49C4B100CD5827F0DC7AE605B5156603F3ADFE4B130F872C1862E51EAECC4A36DC496D3FA2F1EDDB023982FA5826E77090B6C9158F43B7C53E2BD1EB4E45C2E7A500A2F2AEE252E8A15AA03C1AABA424CA94CAD00ED7B249EA00020DAE2638D944822298959F47B2173DE7D1E58AAA622296AD4A4CB67EC7EAD8220AC2F171605BA2D08AF3D6FF5849566EAF96209E9E00CC28EB9A517CF5061545AAD24CCE143A2EE1AB7CFA259AD9C01860B33B0036F2CB3A5086861212F408C5F055D226CCC77CC884452B2670D89548EC1C6E98FB311DF03979CABF725E78956AF185447287BCA2517F554E9F25E19D93790318EFC5D2602FABF262E5C7FC307E5A991E0122E332A803AC4A91B318B30D79394248521190D2BE326037A89FE918D139F763DC8DAA2C3BBCE53F04809F0D97303F2F1B88B572B3086ACAF38EEF36B4C0791B4918204B0E1E923BCE9E3BB1E7BAA07135B176E266AF174D5DF26C44842CEAC4AE4C1CFF05557DA3DB8651261BE78D766699B1891CB825FA9A418C45BB9F7F2D347F3F92F9529CA6DB94E2FFCC69337FB3690F556C5A44CBBD9D79F60AFF063DE68B14BD2F4B7E8CDF94F6C2F40219D27F71E8AB3D4D6872A5D4B82EAF8E3943A6D425ED04FBC5C7596AE929AD680B245E3D6A7C5CCD7FDFA1D14EF0F72B9BAAEF05B7B84ADC02913DDBC76D5FE80DE30527FFAD1825CCBA34F8587C5B0291471D6957AD99C5FBCF3669B4AE5930C8AF68305C2D3E84E714CB9049A9560A3C94AEB95A252F69B68F755DC0E0AAB52DD054B670A275BD2BAD7FF8EC0CDE6224E9A0EB537E95DAB992C382D6B03FA045DA402CE7C5B55138FB400D9E86AFE30923AFEE82C4528D1B38CE16D33BEB47A96C18428D919BA98C9782806D6F4A40B52F7F0989337C724BE24E9A5430CFEA470D02EA36CA479FAEAD94A74049898D1F1BE53D5AB8CC0CDD5438A7C55827131DE264AECD18E5F5F2F9FD60E8D2D6F55BEB27EB77AEEAC2A15432A5F1467483BE6073243D0165A6C242FE1BD7B7AA701A0827F286ECB51E4C2626DCBE95466BC94A7E2A09AB334FEE3959CA31974B6286E2A2051653341623CF3ACA65637DF657280B6025DB0C0377EC09E6E32010F0F59711A30496695D23728319DFD0AB5F3AA69025276E68808130659D912A53693584188E310B1CACC41AF4B19FAD8DA95D4B35E2569053F553A9DFCBB8FDEE1455DFA0E4F5E94324C86A24288AE27F3576AE15FBC8BED49BFD8521D77A61FB523BADF0E3CEE53799016C6EE4E1E5DEFC19C7717A5C41ED8FA6BF0E5811BAEA76676DE03767A607735C2A48BEDE511012EAF1F79E4D2C3566042FF2C63BB82FBB399CE20E1F268D3844BB473AD7366EF86D064C5BA080FC0C01BDD2AD343C5367D80D2A058CF40725268CD34123C219D9109780335611B008EE3F8848EA9D174D7B96BD2FD9A04FA2B550DCF0B301D64C0764299D317DCD0CA05718A1AC008D86FEA330095E81567E83BDE31A0D635098D7B86176CE6CC4025E8628C73B394D9A45B09B64BFD3A424162B16E1ADAA1AB60006847C6D5CA5733237A330147CFE6B9170D7B88834BB79F1FDDEFCC0EBB1D4FEF326E28C41C919607BF12AD112807BF8582933DDB096F1F3E2BCD6BCBD844DA317CEA2A7688A5FBBA14D84C537814EC2B171ADE28ACF83EA481631B968C26F8D2BF2C5AF7D61A93378E1E23FC756E2F0EE79199475AB4BA1FBC55D9ADC2B05888B2910049BCA98DEFEFE96CDCB67CA9D4AA5BBFC6CA0ECBB78BF29035D158DE2A1708D98BEB85C70AD1C64B39B387516073E2FE85BD9EFA25CB048C224E0EF76547DCA67FD66485A97EB5E56C06C78FFA08EC1C9C6F2380912A2585CBCBA2CD702CD2B51022F63EC920412989BD743A8A8BEB07241E3E8EB38CA14CD400C83DBFA6FC8E04F58529007A1477E9613291AF877692E4CA9AE118A1902AE7B4AE7DC2E992A6495CD19DF32CE64131A8D8C41969A8BAE1D870DD5F1360BA9278D5B76E746FAF99D526199E87A4B1D3A5C48A33989F103CFB2 + +count = 41 +seed = 1C13369824A3FDD41B1065E17297574715D9BD9CE5BB733D36D22C31B62BB1033989A604D78BFB1A0746BD4A2271FC0C +mlen = 1386 +msg = 9D84E1DD28C513987D5587A4427853762B7D7AF668FF9EC2E90211D6CF5C0DE6C7E54B298C1A6C67EA9A693CEDC4FCA1A6ADC2C6DD0E5BBCEE7266B9C6AC8FA8AF5E50078A6151F938161F1FEACDE4D8079B5A9D563423258CF3AE9E47D8E75740314F2FFA63865A8B30743F773A53E1AEDEAC45CAAE01993B75C8116FB0B431631AC001AA8BD02E5B83DE627AF0CCB3A3D86F66A7E5FB658F9226DF31095780A6E8262A247D70F4E7C971D108567FFBD7FED0E16B7FFDDD93F5764C3E02A61998C32146564D46589538B2E071AF86A26321A3523354F4F0C396B863FC8E9E2E3A173901D0D178A9D2828D0E0974B72CEDFB17937D6054F185A81D4F853787E6C3681A74FE25FAA6C256A9F9E9A9253F98B9AE4B8FA0068DC28BC7E8D5785CFAD20F7DDD643DAE6A2DDB02713C9CAFC2EB2FD18EFDECED05CC24913061BDC38E932DB5E8181FC0D3DE26A94E2138800B3C01E07E83B3B0BE187EDC75DA576AF1CC7B7122367EFFD6EBF05F4C2EEB0AB6E9F91201A4237910A87DE9FEF777981D48FBA28AB8D64D76380911F2A6621335DFA96B331AE8B3242EA1F2A260260244196B0B9596C411218A17D0A58D3B5735B9AD7B6259655CF6E2D0FE5B37D0A0B02E67951F5D3FB277B6E1EC87528B08229AB0EBD895CBA2D075A47CC8100E9DD17DE7D951BF0A68D710AAC21C8226D8CA95AC49FCBE9D493A8D3C7F93FA61685BE57FF422FAD036304F317A3DBCFEE7A4610C8C1DDAA79E37C19D6414F47230E01EF1CD5C7C2FFC319A29AE6A9C95B06C603F2CFC1D1FC914B036CDA6CF9A876946983B06123C2E5C7D09BC190647CDC0512F35DB9E214C77D3D7D0234C3F2590941236A367700F9C04D3AFB949DCA2067571BF28E78ED35FC026BD801C4AFEE9BF31C97580953950D2E81EE6426E78D6F8134ED19707473F0874367C86C9BE170BE63405A9BF7C46A420724B6CCFF9C21B015E21BB02C5A7AEABCA873B46571530DE56E47288C3424DA398517ABB6502A9A6A65D4983D97E479941C44CF0136D225991226F70837E2A7D1E9CB1226F40BF59D52C66549BF8E360096954F5875C466160A0C75A252E5FE6B8F1841FE210BF08520CE74D77B69692086EF50BB64732F19D1A49E5800F077700553290635D418168A6B9E3AE980112AFB9D58A18B94F972845C309E86FEC7E456191D8760A1C2106036E44C5C9A5F2CFBC67D741E8E937E99ED7820AB0787E39C385356EF0F05CD3E31C44115A8892224197B1D1F554D5098B72058FAD49C665F716A266CB4DB6204666E1DC07B6CFDE0EA00345661E0F94A5025D2EC98483CF482058D2EDDB018CEC11D91EB46B63971AB29367DB46137CD7690D5782E3A3DDC8CABD545FC1AAD8A9A0A39542AEC55CC3D58A5BB5E4A559DB1FCD2932EFF6E81C8B8E5AD5B4E0424A444BC55D96DF63C8971A5890310FE19DFF8ACBA72D96FD3F32D67D41A2F3D0B343489C7FDEE7556012C2D88E2BA9D512B71E7D04F92E6BE3A9386565271D755BED752C853E4539F95C3287A275004F76B9A93837C6EFC6760BE4A39B8AA92C7605AC369472FB29E11ACAD98FC91B1B9BB3505638D4D46A3AE3C10C8DC115C35725F06649BFB00BA1EF214B9F2FE98BE2DA99AB23E7B9F014F5C5D0248A9E0E088AC175C8048C6BEB5108DA59DC234E9EDFBE603BA912BEA22505C2A9EAAE766FF55AAC8392AEA5C722DF25BC6C9FCF9B0275DF71206A4E5290FC5E71D79928E357400DCB04EFD7CC9BD0B86E04BFED9BDBCE5787E40FCD6041ADDA615B5ECF03C30AB9B2809E3514E9AC87226C55F259C5F157945B0073431715E1740DCB319EDDDD1B5F2763F0439CC0D6ED5867D9D98C227CA3008F30D1B2AEA40DC73FF8289E4A21586EFF519520F888E7E2F6D29A269C12607D13D398F437CD7F0A07C94EE1E1E3D8518D0C97BE1E250D79C5AE1709AD8A638F55 +pk = D4FA37FA9097DA63398E22E0BA526F599E9FE78101BD0D96EFD56656B502819D83542098F700BD53B29B03E41C5BEB07F5E6FDCB0DD420300F3B52F2F38C6B9E42662B6F31ED140E09F66F5CBF8AC84989F5B01702F96766F541006EE620200515 +sk = D4FA37FA9097DA63398E22E0BA526F599E9FE78101BD0D96EFD56656B502819D83542098F700BD53B29B03E41C5BEB07F5E6FDCB0DD420300F3B52F2F38C6B9E42662B6F31ED140E09F66F5CBF8AC84989F5B01702F96766F541006EE6202005153D1159900C72A27A433CAB78DBD7A370C1C5B0864E23C40BA00600000000000000000000000000000000000000000000245BF65F769A7754E273B45EA9E17E69F498E29627F3B8E679FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51031D36BE172692D1A951C08E75989FC526B7D4FA5812B862F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B57D3C7F31F61E7CF48CDE704278BEDB5C9E3D614A029F465F5058C599721EB9591951E447F836A87BFF85B6B7A5CF002AD5858F66605D4F32D6A80F0D607D8F997EC2F1169F7BB4817460BFC7CB03B468D53875EA464FF73395BE7BCD22B100BE763A9E986ADD39D2884CA2CC66F956EB6E5B9597EA689D76D7A8FF15805BD5D41BA993C0A0AF003DE3735EA3CDCB001328C2DB62A944FDE2F1A2E480B89905877025693C78E48A93845F2D3489F2DD946FAF1173998BE735F6D66B49C1D900 +smlen = 1610 +sm = 835633951BCC54106E63CEED3CE93CDC8BAC24AAC4911E1D0D1666E308BF2B2ED669338636918CAE1B7A755F1D6E1612548FC2B7607CB9440BD5A258491FC80A2DBD68B7A803B3DF921D56F96AFDEFC3EDE391AA9BEBE7A076E635E267383F1600004AC5EE0CFA86ADA7C900AFF3156989844F203C427B518AED00F784CE6F98AA8A3883266D74ECDEC02FDF1C025A41F659EC00237AAC4CC250E90158C9797966CA7D7CD12A736EEE7CABB002885B64A606440419F2D1E4A99EADDE9B2B5B7CA702867DCE01E1EE25F4DF4554CC84D82CD25A4BF16C85A88CBB6FC0A9000D069D84E1DD28C513987D5587A4427853762B7D7AF668FF9EC2E90211D6CF5C0DE6C7E54B298C1A6C67EA9A693CEDC4FCA1A6ADC2C6DD0E5BBCEE7266B9C6AC8FA8AF5E50078A6151F938161F1FEACDE4D8079B5A9D563423258CF3AE9E47D8E75740314F2FFA63865A8B30743F773A53E1AEDEAC45CAAE01993B75C8116FB0B431631AC001AA8BD02E5B83DE627AF0CCB3A3D86F66A7E5FB658F9226DF31095780A6E8262A247D70F4E7C971D108567FFBD7FED0E16B7FFDDD93F5764C3E02A61998C32146564D46589538B2E071AF86A26321A3523354F4F0C396B863FC8E9E2E3A173901D0D178A9D2828D0E0974B72CEDFB17937D6054F185A81D4F853787E6C3681A74FE25FAA6C256A9F9E9A9253F98B9AE4B8FA0068DC28BC7E8D5785CFAD20F7DDD643DAE6A2DDB02713C9CAFC2EB2FD18EFDECED05CC24913061BDC38E932DB5E8181FC0D3DE26A94E2138800B3C01E07E83B3B0BE187EDC75DA576AF1CC7B7122367EFFD6EBF05F4C2EEB0AB6E9F91201A4237910A87DE9FEF777981D48FBA28AB8D64D76380911F2A6621335DFA96B331AE8B3242EA1F2A260260244196B0B9596C411218A17D0A58D3B5735B9AD7B6259655CF6E2D0FE5B37D0A0B02E67951F5D3FB277B6E1EC87528B08229AB0EBD895CBA2D075A47CC8100E9DD17DE7D951BF0A68D710AAC21C8226D8CA95AC49FCBE9D493A8D3C7F93FA61685BE57FF422FAD036304F317A3DBCFEE7A4610C8C1DDAA79E37C19D6414F47230E01EF1CD5C7C2FFC319A29AE6A9C95B06C603F2CFC1D1FC914B036CDA6CF9A876946983B06123C2E5C7D09BC190647CDC0512F35DB9E214C77D3D7D0234C3F2590941236A367700F9C04D3AFB949DCA2067571BF28E78ED35FC026BD801C4AFEE9BF31C97580953950D2E81EE6426E78D6F8134ED19707473F0874367C86C9BE170BE63405A9BF7C46A420724B6CCFF9C21B015E21BB02C5A7AEABCA873B46571530DE56E47288C3424DA398517ABB6502A9A6A65D4983D97E479941C44CF0136D225991226F70837E2A7D1E9CB1226F40BF59D52C66549BF8E360096954F5875C466160A0C75A252E5FE6B8F1841FE210BF08520CE74D77B69692086EF50BB64732F19D1A49E5800F077700553290635D418168A6B9E3AE980112AFB9D58A18B94F972845C309E86FEC7E456191D8760A1C2106036E44C5C9A5F2CFBC67D741E8E937E99ED7820AB0787E39C385356EF0F05CD3E31C44115A8892224197B1D1F554D5098B72058FAD49C665F716A266CB4DB6204666E1DC07B6CFDE0EA00345661E0F94A5025D2EC98483CF482058D2EDDB018CEC11D91EB46B63971AB29367DB46137CD7690D5782E3A3DDC8CABD545FC1AAD8A9A0A39542AEC55CC3D58A5BB5E4A559DB1FCD2932EFF6E81C8B8E5AD5B4E0424A444BC55D96DF63C8971A5890310FE19DFF8ACBA72D96FD3F32D67D41A2F3D0B343489C7FDEE7556012C2D88E2BA9D512B71E7D04F92E6BE3A9386565271D755BED752C853E4539F95C3287A275004F76B9A93837C6EFC6760BE4A39B8AA92C7605AC369472FB29E11ACAD98FC91B1B9BB3505638D4D46A3AE3C10C8DC115C35725F06649BFB00BA1EF214B9F2FE98BE2DA99AB23E7B9F014F5C5D0248A9E0E088AC175C8048C6BEB5108DA59DC234E9EDFBE603BA912BEA22505C2A9EAAE766FF55AAC8392AEA5C722DF25BC6C9FCF9B0275DF71206A4E5290FC5E71D79928E357400DCB04EFD7CC9BD0B86E04BFED9BDBCE5787E40FCD6041ADDA615B5ECF03C30AB9B2809E3514E9AC87226C55F259C5F157945B0073431715E1740DCB319EDDDD1B5F2763F0439CC0D6ED5867D9D98C227CA3008F30D1B2AEA40DC73FF8289E4A21586EFF519520F888E7E2F6D29A269C12607D13D398F437CD7F0A07C94EE1E1E3D8518D0C97BE1E250D79C5AE1709AD8A638F55 + +count = 42 +seed = 7AD6C7DF00C9E52A75290D28DA946305D83CCF6DE2515C19A8E26850C34C8C2E545E2E32108F13B9C97F87AB68D10131 +mlen = 1419 +msg = AF2860129C08A1A9C7A7BB3120B3E40AFA1A4A09050C8483E7511FABF3285544D4CE3F41401DAB8C17DA547F6777A72519F6EEAAC83016FA0E0FB0B33329DD02AB8EB1F291758074EBB5B7C4C102B75BA422821E6755B37B914D689D84808A89CF88F69A446F489A260BA03CA52A4AA14E8BCF4BFE5134DD2918A88D67329B9BADC6ADA4A3071FD21CFC45235FA0A1B82D91C5877F10AE087464251C8899732AA7FC8F6C0A5BEAF4FA41E64CA97932925A06E218272500249577705804C6DD9F0F61DEE6AAE096BE0AE5E67923137933FE4D61E9A88DFD5B3BD75AEEAF5018A5153985E2837AD1AAD5EED91620D935EB9982DD2364B5413F490BF251FC783503FA146300E6ADAE0682E0597C3839C645DBE855919BB1CB80C3DC6E233909017BB31F5ADAEE05CE442EEF594FC15FEC3A2B4B81ECAAD1340B0677F27009290AB3AB8788556389047F63C2CE9390658E151CA85BAAE45ED2FE12B6667967F6B772EE683AC2E7347C7B0EFA332B3354B5043CB86200F8E4249F68030844D00A86FAA7B79A4129AD676D1E9D58828A1AF4C6BD68C29CC23002E0A0313500BA717B8756D4A18E41E381DF8D7A999A153876DB876CA4A508486A4F331CAC9CB3E7C416C6329713CAB76E1C8B63A8CAD46F8EB1E65116F89A3B4EB8FAA14A73097CA71AEA3220BE7FB7FE64919893930445D962C309E23332E4B3ED8CA768EF0ED46EAAB199827AD628A1BC20CCD9F61BEF67F7FCB017300EBC7493A7CCDAEDBFCA5F91E80B80DECBFD9EAD9BF22FE16B563512C7383D34801C504202D7A0E19821EC8495016362EDAC165904D2BBAC484DE1D4112C3A3E6EA56A78785B7CAF2A44B5BC8BECBC50BF4B521C1D086086FEB009C06ACB8FA0F53E7654FB02AD7898E35E5F3A7DCFC50124BA1F30178C707F4D36E4E7758C4CF82747753CC30A836311794A6A9017F53ABD17A1C9647AB38BA56AAC83C1812DEE8A5A75C5CC958780A3E9C3C1F39729BD365948F7FCD8104CF09660060FBAD2BE9B8D8E5BDD22286EB0BFD4010681AE7928D0FC008E21C8F877D97B5B9C7A06C02530FBC6A9D6FCEDFEDF68A9682177757CDDDFFA6CB9086B8330E61851E2761D84DA37635EA8441E3B23FD165CCEA562B0A3616B30EE5FAE00F76D6801B22F2215D80829E01DB2C0743E3074CF26C96B0EDDF97D79FB9C7FFE9B5CDB891F9E61FEFE7E1CBD28FE25B7858921C8C99C45A84B50A8233037DACC20BEEEBB9B22089DDAF2EBF0698498DA694F75ED2463D09BA2C757A986B8CA556CDF46CBCDF288C078041D497242F66411F47F35A21918855F105F24686076FA21BC1283F17245A7122A848B4BC10D996B2C5161FCE0336B2EC747A4A07FA9851AC5423D1EFC4B524E795B2E4BFFD1C5CD21F5FEC954824DCC53BC3883A7F571A9323DFDD2682C4A4C54E8862F347C9A8897779170B257AD26D90121DDE722A3F214A44CF6C5A5DDB2452A2471EBE7FC8D0EF7F1EDC7920CB42A71E4DB49A0168D51843F47D17BADE50DCB340E5F7B7E5B6A6C3AFE0FB26B5EA172A4011EEE838E5634E521483C6EDBE9994B0658406ED8F4998C7B4E869845CD16CC4368DA3BC1B025A6FFAFBF540133C372D452DD831DCAD39D61CCED0A0AD193FA9886EAC749001E3BEAD5A7962275FC62298A1BD054F4BD97ACAB2BBFDC355C73509D98B6DE5B4CD774BDCAF1398532BB3DB56524CC047ABDE6880C3B282FCE0FB2AD7E4C5F7BC138B48D194E8C8036DF4B9F3949E912AFE5D2734662F27583193D0FBA2B73C1A0D012DB853BBBE4383F6C391F3220E1B5761C337A054FC9FDF09C01864B87324A90C776EFBF5D34A68DEE38EBAACCBB61B4C79A58CC848184F605D43CF9D40BE90C1FBCF6735270132B59A636B16ED28111246270AF32EA2CB7A42A084005AEBB6161002E65B37217361BC269F5ED12F7D50613C82934A6D1D98D1308AC82827B7504F3FD351E0ACA1C62843C9219023FD092692BA4B83BE198EA +pk = 59B9662666C97220E8ABDA8B13B6BAB4B9A1FC7631254E89695B9F98192D0414570E50C7DF2BBA044981CBB798D3EC261D2572D1E9D38A704C86BAE221F26B31206F23AC7D6B15178D4B001F828C7A7BD8851C8EB7847711EAEE20575844AA0906 +sk = 59B9662666C97220E8ABDA8B13B6BAB4B9A1FC7631254E89695B9F98192D0414570E50C7DF2BBA044981CBB798D3EC261D2572D1E9D38A704C86BAE221F26B31206F23AC7D6B15178D4B001F828C7A7BD8851C8EB7847711EAEE20575844AA09069370A9C05739638C7F3E2EF0D7DE13A66693FF7196364285700600000000000000000000000000000000000000000000A49DB83FFFDD2ECFF140F02CF32449E827B4E4F376F6070D03F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37D15EB8558C696301451AED57295850F208C6D15B3E3F0304FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F34BEB6050408DBBCE588B3A85796B09975A93A1426428C5D8ECA558249A90F9E65C49F0DEC54BE5A7C37DEEF016C2002F26AD18B6B29717BF4884B085D844A85D3624889B3730976385C78762797EB592CF2BF311F723F83B3893848B12CE0042BBBFF2834A784B23FE257285E803CF4D273E616350039643F45B4D24C9F836E80A0B1A74BA5A695CF94AAD2094D900214293179EEB81C09B989CFB78365B9C8D4BFB254EEF73CADEC6733651C16A1FAA5E0FBEF77256BCCDACE6E80DEF3F00 +smlen = 1643 +sm = A783A684F8495282190912FE85629AFEA029F74D6CAD476E240ECB3D2B9E0A0D5DDE5A164430A9153313E3BF33FEAC24C99BDFF7F05F8A0A77E4A22F64B305F1FAA5E454B5E15EBC5F18737BD389BCDDAE21380F1B9F099B73DD83C75B86A2170001D94E2BCA15C4393D8974BD4DAE3CAE7DE12AC906EEC87013013390BF8F4F54D2052496B2244E8CEDC17AAE749AF15FCF320101FB9570C35AAE14E2C8AB981B9294348E279554F49E0B6401C94353D926854764B72B9BA4D90AD843DC31EAE4C8DC3BBF00048B732AECE4AA01751A26A7EAE16083C0CDC272D6619C00150DAF2860129C08A1A9C7A7BB3120B3E40AFA1A4A09050C8483E7511FABF3285544D4CE3F41401DAB8C17DA547F6777A72519F6EEAAC83016FA0E0FB0B33329DD02AB8EB1F291758074EBB5B7C4C102B75BA422821E6755B37B914D689D84808A89CF88F69A446F489A260BA03CA52A4AA14E8BCF4BFE5134DD2918A88D67329B9BADC6ADA4A3071FD21CFC45235FA0A1B82D91C5877F10AE087464251C8899732AA7FC8F6C0A5BEAF4FA41E64CA97932925A06E218272500249577705804C6DD9F0F61DEE6AAE096BE0AE5E67923137933FE4D61E9A88DFD5B3BD75AEEAF5018A5153985E2837AD1AAD5EED91620D935EB9982DD2364B5413F490BF251FC783503FA146300E6ADAE0682E0597C3839C645DBE855919BB1CB80C3DC6E233909017BB31F5ADAEE05CE442EEF594FC15FEC3A2B4B81ECAAD1340B0677F27009290AB3AB8788556389047F63C2CE9390658E151CA85BAAE45ED2FE12B6667967F6B772EE683AC2E7347C7B0EFA332B3354B5043CB86200F8E4249F68030844D00A86FAA7B79A4129AD676D1E9D58828A1AF4C6BD68C29CC23002E0A0313500BA717B8756D4A18E41E381DF8D7A999A153876DB876CA4A508486A4F331CAC9CB3E7C416C6329713CAB76E1C8B63A8CAD46F8EB1E65116F89A3B4EB8FAA14A73097CA71AEA3220BE7FB7FE64919893930445D962C309E23332E4B3ED8CA768EF0ED46EAAB199827AD628A1BC20CCD9F61BEF67F7FCB017300EBC7493A7CCDAEDBFCA5F91E80B80DECBFD9EAD9BF22FE16B563512C7383D34801C504202D7A0E19821EC8495016362EDAC165904D2BBAC484DE1D4112C3A3E6EA56A78785B7CAF2A44B5BC8BECBC50BF4B521C1D086086FEB009C06ACB8FA0F53E7654FB02AD7898E35E5F3A7DCFC50124BA1F30178C707F4D36E4E7758C4CF82747753CC30A836311794A6A9017F53ABD17A1C9647AB38BA56AAC83C1812DEE8A5A75C5CC958780A3E9C3C1F39729BD365948F7FCD8104CF09660060FBAD2BE9B8D8E5BDD22286EB0BFD4010681AE7928D0FC008E21C8F877D97B5B9C7A06C02530FBC6A9D6FCEDFEDF68A9682177757CDDDFFA6CB9086B8330E61851E2761D84DA37635EA8441E3B23FD165CCEA562B0A3616B30EE5FAE00F76D6801B22F2215D80829E01DB2C0743E3074CF26C96B0EDDF97D79FB9C7FFE9B5CDB891F9E61FEFE7E1CBD28FE25B7858921C8C99C45A84B50A8233037DACC20BEEEBB9B22089DDAF2EBF0698498DA694F75ED2463D09BA2C757A986B8CA556CDF46CBCDF288C078041D497242F66411F47F35A21918855F105F24686076FA21BC1283F17245A7122A848B4BC10D996B2C5161FCE0336B2EC747A4A07FA9851AC5423D1EFC4B524E795B2E4BFFD1C5CD21F5FEC954824DCC53BC3883A7F571A9323DFDD2682C4A4C54E8862F347C9A8897779170B257AD26D90121DDE722A3F214A44CF6C5A5DDB2452A2471EBE7FC8D0EF7F1EDC7920CB42A71E4DB49A0168D51843F47D17BADE50DCB340E5F7B7E5B6A6C3AFE0FB26B5EA172A4011EEE838E5634E521483C6EDBE9994B0658406ED8F4998C7B4E869845CD16CC4368DA3BC1B025A6FFAFBF540133C372D452DD831DCAD39D61CCED0A0AD193FA9886EAC749001E3BEAD5A7962275FC62298A1BD054F4BD97ACAB2BBFDC355C73509D98B6DE5B4CD774BDCAF1398532BB3DB56524CC047ABDE6880C3B282FCE0FB2AD7E4C5F7BC138B48D194E8C8036DF4B9F3949E912AFE5D2734662F27583193D0FBA2B73C1A0D012DB853BBBE4383F6C391F3220E1B5761C337A054FC9FDF09C01864B87324A90C776EFBF5D34A68DEE38EBAACCBB61B4C79A58CC848184F605D43CF9D40BE90C1FBCF6735270132B59A636B16ED28111246270AF32EA2CB7A42A084005AEBB6161002E65B37217361BC269F5ED12F7D50613C82934A6D1D98D1308AC82827B7504F3FD351E0ACA1C62843C9219023FD092692BA4B83BE198EA + +count = 43 +seed = 38FFDE9B60DEDB5BBFAD6C52AA02EF6D49369BF276C99E588D796A4F260E0FF0A65C96C35863BAACFFD9B212EC305E7F +mlen = 1452 +msg = ECA4505D43235F274D902464F4E763312BD11060F908621A063409EB42FAA6BB5E20FACD87B8FF41767C20F69B1F7E05D5F3A957F48DEA57DCC91824FA48DA6DDBDE7E3327A0A8D46A47606EDA01E67CEA1F29BDC5FBA446DE60541DBED6F73D1FC5F49BD77D45285D3D8CA93F6DF25AEEF9324BEDB40E800ACB49794AB05E6D0AEB11A5994FBA36DABB9559CD93CF522174061C116CF31874A18C46689FB8C075079DFAF73EA0EA7FAADD47AD8EF68C06AF9738B41BE771020FEDB79CA3D0165427B58E547105FCF82A12B67579D1D3AAB29968817068732CDBC5A2E9E8D55D17468D03F38D564F5AC6EFE1538E4A680E9E15E35AB54D07B6B58EC9EA7815CCF29F4F880CBF1946F39556BDC2BBC78A5134FA7A086DDC146AD9D503A4CA837E0823BF0728453F6B053788C69EFF8D11ACDF5F07282A75CBD17F2AED58E39D862FF056DF17178625234CA7E03D22AAAFC4C07E3FB08F4297B511B10579934D2761FBB600C9454AC05FFF80CFB93DE3B9E0DDD0AB1E494DE477DA2B5635E48D5BED5CE359E66A3AC845826BE2B4BBFA6D825373BB2A4E93AA417648D1CEA755AA4978784D6D9489F6738B4DA03FAEDC659408D9395C934AF774749A498B1406522351F86838865F53CB0157247484FD37EA59BA72FF3226AFF1EEE353ABD34DDD63FCC89387B947027E04A6F4ECCA1EE5F6BD1CA758AA4F796FE839338164B58D8E5D71E6D5CDEEF6B279EF15A7BAD873B12F7C5B3E2817C37BF00802D2534D425D52D0BD5935BF8658E5BD39B5268CC45D0F27CEE5A57300F497E77AF5268970782030E6928281379CB14BB56D2ACD963D189C078C7A60E98A782F9483ECE7B4871A061277186A01E878087381704BD72C63C32CBF2470A561C22A5DD3A1988B7ED0D274182E1B075AF277920B362D612DC7ED82057EBFE51A3CA5A9A9A45DE015C460BE6A48CF67C820813048A1CEA0FC3D7307F802B4FB7E523E7C8555FA56DCF66237F176D3D973C47F55AF93FC4BC92B98B7DE89829B1471DFF53B649CB03B719DB58DAF824DAA2DE570DF6314DCAF5B705557F9D783559277A754F3CD5B783D5A577EBE4A065D320284B01F71540F1986BCD443CF4FD480DBE06EF7710387CB5185DEACB5C2A612BCA275950B8988F247C4B773D8983D87F47D60F5BF80E6E7BAEDEB14B5FFBC46893A81C63F99F511D3E24FA8F7B1BA66A7DB0C1D9ACC6B5010AD725BDC2282D8A24018C975C8B12ED3326F48194D4FF93EBF051204CD224EA39F27D63FE07CFD0162358B412DBFD4715AD049EE5A31638D3111AF2DB7952F3A973646612712A607EA35826249D14CBDE4380D8BC986067B1CC27503449FB128767986A406585C3D40DACA75C27BD36117D2487BAE82CF639ED1FA016ADD279D109B8CDAE59EB31E1F006CB7AF000A267E8582E55375CF6F06D1A47BE9BFA21C8428045B9DF96808AD74D054820A4D0873257EB318A3DC9B6D9585D973E26D435345B4D699A952C3092EEDDD975FB59474212080D03EC489C695F19CBA4D1CAB1AE8D2E2C730B06E657D33722D24222FF7B613B6E8608E8A6003E11C80239FF431B5D8FA52B84B867A581798833590524C7B84EAF6CDA9CA94C5AB8EF55A1262EEC5C37467807C89FF7D075606A3902E7247E9C6646839C18493584D33DB65D6DFC0F23E68C9D13FD57FAF4836C28926693DC3EE372DE27A9D3E4AB4229425EF48CC410F1792A51C9F6FA5316A1D9A7C99979884EF350B4882F6045921CA88D4E44B435C69C1AAC11660971C2A3F6480C79E6E146C0B5CD2371BF5E7486AD7D0BE88D62A2AE8F0D73C17CBAC86FF6BDA55A880B182A5237498E9CB343A9CD82D7784B72473D222E688D13CB81B2908BBA854B9624A11DBE8CEE9C3825C1BFBA476B4D23D0B0C325F1C498A65A3589EA8E8DF8DD9030B279EDE30443CF80367CEEA4A122DC8329E5AD42491CF57EF47AE2B15F9C54120966B95ACD727A4A2B686B00626BC808F43D82D20DEEBCA79B074A7BFF38D2531AB2F726AC7087236EB3FB4BEC8A2D4207DC84C +pk = 57A40ABD295109D27E407D9167B09BA5333E6D16524CE89592F2AA012A7B86A3224E2D2956C5C76C7C0B7E94D65C4309A94A019E56E69BD47E2149F3E0C15ED896C863DC9B90489DAAD31AA267058B55F6B140E06B9E110A949F0C4CE78E740302 +sk = 57A40ABD295109D27E407D9167B09BA5333E6D16524CE89592F2AA012A7B86A3224E2D2956C5C76C7C0B7E94D65C4309A94A019E56E69BD47E2149F3E0C15ED896C863DC9B90489DAAD31AA267058B55F6B140E06B9E110A949F0C4CE78E740302FB6271B620CB90F69AB034D6F771B9174C55DAB8887B2BDD570700000000000000000000000000000000000000000000A833FBEC7DF3A2B945A1A07DA1C6837A1E327D06658EE3B156F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34570E12533DE7871B6EED1E966542C21FF93C894C301BE3DF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006F6B785399AB8F42CB622B2AFC01C7D0BD38CCC0758C12777CBA0C45C70D60460F2F0E8F10AF2E12A9CFA4F03EF67000CECFC211115DEB7BD482ADF91E9EBEA383660A52BAB6659446D423A543F6584BCA426AB1BEBEE2EFC9D012D8F1984600F7416E2F85691F47E147856E5464277B08936A635D3BC1FCF0800BA3BEFF5339A0BAF83B0AA1DC48CA51525AA0A23600FF74F3854D3BD67E5518260A4AFF1B0044D98DD24247E5BFBDF9059C93D74AD62BE86D2F28B8CC0348707D78F02D2800 +smlen = 1676 +sm = 1AE3BE4C79D2DBDD763FE1787523C43AD3CB52409EA00C5702A588E0937FDBA5E44CFF5ACE9CF672BFFFAB72BACD1D2B0EFB69A57431D673692964104A6F5BAE19F07902D20F69E851CBC72D2DE219502469ED5C12F1815208D2EF2198B9B60400009B4AD63200D0C2E432263EB025B57651C0691573DFB151F503549451DD530EB6424F1FD24C7578B27C5A8B93435115D10B0215DE0F3E3CEE3773A5529F07392B2E2CA0FA8EAA5ACCFD410077FDEDC1CA593DAF6A3074CC96DA258F9391A2C33AB05FC903AD24286F0AC906EB5FE97799F87D4C25377B7CEE6A7520001502ECA4505D43235F274D902464F4E763312BD11060F908621A063409EB42FAA6BB5E20FACD87B8FF41767C20F69B1F7E05D5F3A957F48DEA57DCC91824FA48DA6DDBDE7E3327A0A8D46A47606EDA01E67CEA1F29BDC5FBA446DE60541DBED6F73D1FC5F49BD77D45285D3D8CA93F6DF25AEEF9324BEDB40E800ACB49794AB05E6D0AEB11A5994FBA36DABB9559CD93CF522174061C116CF31874A18C46689FB8C075079DFAF73EA0EA7FAADD47AD8EF68C06AF9738B41BE771020FEDB79CA3D0165427B58E547105FCF82A12B67579D1D3AAB29968817068732CDBC5A2E9E8D55D17468D03F38D564F5AC6EFE1538E4A680E9E15E35AB54D07B6B58EC9EA7815CCF29F4F880CBF1946F39556BDC2BBC78A5134FA7A086DDC146AD9D503A4CA837E0823BF0728453F6B053788C69EFF8D11ACDF5F07282A75CBD17F2AED58E39D862FF056DF17178625234CA7E03D22AAAFC4C07E3FB08F4297B511B10579934D2761FBB600C9454AC05FFF80CFB93DE3B9E0DDD0AB1E494DE477DA2B5635E48D5BED5CE359E66A3AC845826BE2B4BBFA6D825373BB2A4E93AA417648D1CEA755AA4978784D6D9489F6738B4DA03FAEDC659408D9395C934AF774749A498B1406522351F86838865F53CB0157247484FD37EA59BA72FF3226AFF1EEE353ABD34DDD63FCC89387B947027E04A6F4ECCA1EE5F6BD1CA758AA4F796FE839338164B58D8E5D71E6D5CDEEF6B279EF15A7BAD873B12F7C5B3E2817C37BF00802D2534D425D52D0BD5935BF8658E5BD39B5268CC45D0F27CEE5A57300F497E77AF5268970782030E6928281379CB14BB56D2ACD963D189C078C7A60E98A782F9483ECE7B4871A061277186A01E878087381704BD72C63C32CBF2470A561C22A5DD3A1988B7ED0D274182E1B075AF277920B362D612DC7ED82057EBFE51A3CA5A9A9A45DE015C460BE6A48CF67C820813048A1CEA0FC3D7307F802B4FB7E523E7C8555FA56DCF66237F176D3D973C47F55AF93FC4BC92B98B7DE89829B1471DFF53B649CB03B719DB58DAF824DAA2DE570DF6314DCAF5B705557F9D783559277A754F3CD5B783D5A577EBE4A065D320284B01F71540F1986BCD443CF4FD480DBE06EF7710387CB5185DEACB5C2A612BCA275950B8988F247C4B773D8983D87F47D60F5BF80E6E7BAEDEB14B5FFBC46893A81C63F99F511D3E24FA8F7B1BA66A7DB0C1D9ACC6B5010AD725BDC2282D8A24018C975C8B12ED3326F48194D4FF93EBF051204CD224EA39F27D63FE07CFD0162358B412DBFD4715AD049EE5A31638D3111AF2DB7952F3A973646612712A607EA35826249D14CBDE4380D8BC986067B1CC27503449FB128767986A406585C3D40DACA75C27BD36117D2487BAE82CF639ED1FA016ADD279D109B8CDAE59EB31E1F006CB7AF000A267E8582E55375CF6F06D1A47BE9BFA21C8428045B9DF96808AD74D054820A4D0873257EB318A3DC9B6D9585D973E26D435345B4D699A952C3092EEDDD975FB59474212080D03EC489C695F19CBA4D1CAB1AE8D2E2C730B06E657D33722D24222FF7B613B6E8608E8A6003E11C80239FF431B5D8FA52B84B867A581798833590524C7B84EAF6CDA9CA94C5AB8EF55A1262EEC5C37467807C89FF7D075606A3902E7247E9C6646839C18493584D33DB65D6DFC0F23E68C9D13FD57FAF4836C28926693DC3EE372DE27A9D3E4AB4229425EF48CC410F1792A51C9F6FA5316A1D9A7C99979884EF350B4882F6045921CA88D4E44B435C69C1AAC11660971C2A3F6480C79E6E146C0B5CD2371BF5E7486AD7D0BE88D62A2AE8F0D73C17CBAC86FF6BDA55A880B182A5237498E9CB343A9CD82D7784B72473D222E688D13CB81B2908BBA854B9624A11DBE8CEE9C3825C1BFBA476B4D23D0B0C325F1C498A65A3589EA8E8DF8DD9030B279EDE30443CF80367CEEA4A122DC8329E5AD42491CF57EF47AE2B15F9C54120966B95ACD727A4A2B686B00626BC808F43D82D20DEEBCA79B074A7BFF38D2531AB2F726AC7087236EB3FB4BEC8A2D4207DC84C + +count = 44 +seed = ACC98B16DCC9A50EF57F332D66255CA56C2BB679CAE705B4297F1418DA845861448DA6CC5CC458DE6C6E96128EEB2898 +mlen = 1485 +msg = 96E2865A0E602EA4E3C5657A7F761A6F771007989FF885261F5638C14C1BF80AADE34CB956D2B5FA1CE38FDE831423201D3692E8E6F40E68A68C085DBE3C4CD8E35394F74072F44DE98A74E42C9176A86AC06BED8C0CA937DB4C3BF92371106B7A68EA8FDE1D1E082CCF522A397401AD0F8DA6C82BF76EAB8AFE101C7FF023A0FCF015B40ADA0073363E7CB25260C18662D651222A4CCF1B290EE6F7B111B9A963211D67D7674B499449F760352FEEB9FB7265A5F2F7F20C0174802C7F48226D92620D3E009E85B104230C21BA2FB0012DAC4BDF9FD184E09CB3E593EB1F3EEB418A8BF3173E6CB91FD8080C7E80DBE6730833A4A9F22C52716731C7CEA4F70CDE0F81D2D9AAFB6B60820598A7F6AA1B963B7686528E6E7885AE085C3D26C4ACBF9FC15080D972CA841175B343E59FED79AE3CB4DBB4F0D7D463BD3E0C4B2090139145B8D7DB5DB10ABFA51DC909C5CF7809030D72A5090CDC765EECADE2B365F719127548CA601AE0D21E402E18050ACAED30EE13CDDADACC9373A87A218787B585319A7E66FBB13851F7AD0D2BBC1EFE6EFE4F7ED248D844F58B6A5A21FA9295E0044982AF6286DE296550F72B5E416373F1DAC006687DED1E7D40961E5177C207579F25E77BE808A6BA33DCE8A2A6F88E97AE98ECFBEE5296D4A170E3574D9BA592A384CB0545BCFC32B3831C0B736AB77440722299F192DCAD519523995F71F2983BA87AAD2261E6E01C19DCCAE00F8D6914501D1AC3D4AFF0C12FA125ECDCA34DCDD8407F0045F8E8BE0763E19EB007ED4DAE36E30AFB07F8DAA7431B72F4A0A8017B3FDE27123AC3E8EE575F8BE310F68F81B696DB1FE63CCB8D32B899B209B2205956D209BD6E48166BBB4372A607E83C47698DB5AC8F9B40D05F38EFC4A4A1309D999D5CE1E1A5828D56EDA4666995897C8E6362D0B5054F04BCCF79D03852D1003C80CCD55E9F4578D8BB2C8E220A4D7A4E2190024C85C718654CCF174AC96C1BC50EA49F961EE7697C88E6BB718679F1D1F1118376B31A4B8C0471F6D7AEFC5AB426515D1B2CF0EAE66246B3C4132A63C63D7E33EB9DF8D8807215D58F46EE832AD3EC893D74E00C73510B9625F62D4EB5B500EECDBC7D088D3D318077A4A0F7D64ADB13220232C08DA75D23CA7B20CB109C972B7C159863991C32508339558B9383DDFE7E7DDA740E5BED0EBD14ED300C634DB01F359F81A7133669183EB187C17A2C8AB855BFCE73E34A1F59ADB0EC39EC0C7573AD3620A819333EE79D5E09CB8449F91923EF4C5E21549EB7F56075C014E1C3AD2805E682F07BA8AA265745CB600A460069678745FB9638F6709D62D2DAD8DEFDD5A4D0C2AE7401292BD1DA5F40D4CF5D59A403932FFB677237AD74691CAE29FA31B955172EFC5E83C225F2DC0430AB0C909A97BFB468AE182ECF91E9026DE819F3440FBE69B9DE26F812FF3F3CE8037F124AB368B1153C1CC127D140F754C525D4799E1A19D93B90460E6518F0B6936DC6310B7E9E6534B595E00225978214EE5AEB12A6F45B5C73FE86771818843FF7A6B88379C37165D9DAD48AFFD6FBABD11B1FB90AA5A78918B317C5F9B2CED6B9647F130DA9F91E1B1CEB84F6E1618248F06D654E159F71033072F1517064BD96A5C138402771ABE7F39F53A798C2423B748EB7F310485D6376722E204FA33B9740E7FA68364289A677C5C78A19A7707D2549BF9329334478C64351FEA1634388ACD4BE57E4ABE9374A0E999B770CD81B1BF4A8FF300C297B116CEDA1A4A1C1BD5A2275581A0589A46142139FC596A1406D16293076527CDF9AEA2D0919F9678423B7D95B153DD1D9D62B72A12F6491A36604D19E7BB83C476D232769425557D3480623D40B7AC27C0F67D4ED5CA4D487BE915A68352DCB03A3929A4BB795248EBE2FBE0612833D9305A0A31D195718BAC193FC59B880042A7F61358104A919C7E7C210F02A856B8B1057DD8527FD4AE1EA81F9E1BF7C614ED8A312C95154873F86632CBD60C65176F13CAC695BB4C23675331058397D6E96E4F9DEEB859E3937553D94BEDE3C2B9A5EBF00964A49AB294BCCEE09E5A97381D2375941AA775A47F726E9 +pk = 435E5754639352CD27339DB833A0FDDA57CD927F9BAAE4AC87B002AB44E20DEE35BF64F1D5DFAAAEFBED70E91D6C7A08A62EDF576FEEA49F40BABF746BD71EBDE77176439F2290EBFCA8449F98BE6A790A66AF5A847E8A4DEF62D0AE4B701C1B15 +sk = 435E5754639352CD27339DB833A0FDDA57CD927F9BAAE4AC87B002AB44E20DEE35BF64F1D5DFAAAEFBED70E91D6C7A08A62EDF576FEEA49F40BABF746BD71EBDE77176439F2290EBFCA8449F98BE6A790A66AF5A847E8A4DEF62D0AE4B701C1B1581A5B52F2B42B464213C505F85422814D6994FFE01FB721AA006000000000000000000000000000000000000000000008C5E3B09EC4449A303B65BA0FEB5BA850415278F6160BFF007F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF59FE7C600C1DACB75702BA7BFDE175EB840C66273FAF23BEF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A30A4E556E8E8C3767954BE6C6AD63773F828D295607162671E5EF32C598F25171030CE090852D210641966863A6AF0042F67271BDDB1003690360C872CB4DCAA77D236136EF43579DB56EE7F8AB27F6FD35D5470A168425533B4EC0A6BEDC00C4C8B1DB752799203F1B2D0C32B4EF2644920F1443BCDCDF9F8451604AF1C81F47B99B1CFE329170159C472E7E6CA000817B2FC432E4A4B1561C9C53D665F33700BB51B4FA4E7D12228A549FADEBC40F911426E187FDBA78B1192EE3521FF700 +smlen = 1709 +sm = 432FE3547B2730E62911903784D6F30564A3860FAD8FF367CC6D61F68CFB8AE6F384F1995FF315B9721D1D46F3B2F40C11C7FCA1FC4D06998AF0D36D348EED4C3BCB9FE033F9C65FE4059F443E1B5A15ECB88BB235BC2287DCECD350AFB02700020151032218F8195D0BE9B0C96635E66D134BD9CC0F07E272B8000A477227E2AE15722154A69E2C574A2EC6D93F2FCADE194700EA701209BDD7A21F3571F2FB837B78C6ACB6ED4CE3B275D6005285F28CFB81D107171C839CB4E5EF54C4DA83018449903800DF6CCF98B35B858CA8A8CB9217D9D463BE154C4CAA6E9100020496E2865A0E602EA4E3C5657A7F761A6F771007989FF885261F5638C14C1BF80AADE34CB956D2B5FA1CE38FDE831423201D3692E8E6F40E68A68C085DBE3C4CD8E35394F74072F44DE98A74E42C9176A86AC06BED8C0CA937DB4C3BF92371106B7A68EA8FDE1D1E082CCF522A397401AD0F8DA6C82BF76EAB8AFE101C7FF023A0FCF015B40ADA0073363E7CB25260C18662D651222A4CCF1B290EE6F7B111B9A963211D67D7674B499449F760352FEEB9FB7265A5F2F7F20C0174802C7F48226D92620D3E009E85B104230C21BA2FB0012DAC4BDF9FD184E09CB3E593EB1F3EEB418A8BF3173E6CB91FD8080C7E80DBE6730833A4A9F22C52716731C7CEA4F70CDE0F81D2D9AAFB6B60820598A7F6AA1B963B7686528E6E7885AE085C3D26C4ACBF9FC15080D972CA841175B343E59FED79AE3CB4DBB4F0D7D463BD3E0C4B2090139145B8D7DB5DB10ABFA51DC909C5CF7809030D72A5090CDC765EECADE2B365F719127548CA601AE0D21E402E18050ACAED30EE13CDDADACC9373A87A218787B585319A7E66FBB13851F7AD0D2BBC1EFE6EFE4F7ED248D844F58B6A5A21FA9295E0044982AF6286DE296550F72B5E416373F1DAC006687DED1E7D40961E5177C207579F25E77BE808A6BA33DCE8A2A6F88E97AE98ECFBEE5296D4A170E3574D9BA592A384CB0545BCFC32B3831C0B736AB77440722299F192DCAD519523995F71F2983BA87AAD2261E6E01C19DCCAE00F8D6914501D1AC3D4AFF0C12FA125ECDCA34DCDD8407F0045F8E8BE0763E19EB007ED4DAE36E30AFB07F8DAA7431B72F4A0A8017B3FDE27123AC3E8EE575F8BE310F68F81B696DB1FE63CCB8D32B899B209B2205956D209BD6E48166BBB4372A607E83C47698DB5AC8F9B40D05F38EFC4A4A1309D999D5CE1E1A5828D56EDA4666995897C8E6362D0B5054F04BCCF79D03852D1003C80CCD55E9F4578D8BB2C8E220A4D7A4E2190024C85C718654CCF174AC96C1BC50EA49F961EE7697C88E6BB718679F1D1F1118376B31A4B8C0471F6D7AEFC5AB426515D1B2CF0EAE66246B3C4132A63C63D7E33EB9DF8D8807215D58F46EE832AD3EC893D74E00C73510B9625F62D4EB5B500EECDBC7D088D3D318077A4A0F7D64ADB13220232C08DA75D23CA7B20CB109C972B7C159863991C32508339558B9383DDFE7E7DDA740E5BED0EBD14ED300C634DB01F359F81A7133669183EB187C17A2C8AB855BFCE73E34A1F59ADB0EC39EC0C7573AD3620A819333EE79D5E09CB8449F91923EF4C5E21549EB7F56075C014E1C3AD2805E682F07BA8AA265745CB600A460069678745FB9638F6709D62D2DAD8DEFDD5A4D0C2AE7401292BD1DA5F40D4CF5D59A403932FFB677237AD74691CAE29FA31B955172EFC5E83C225F2DC0430AB0C909A97BFB468AE182ECF91E9026DE819F3440FBE69B9DE26F812FF3F3CE8037F124AB368B1153C1CC127D140F754C525D4799E1A19D93B90460E6518F0B6936DC6310B7E9E6534B595E00225978214EE5AEB12A6F45B5C73FE86771818843FF7A6B88379C37165D9DAD48AFFD6FBABD11B1FB90AA5A78918B317C5F9B2CED6B9647F130DA9F91E1B1CEB84F6E1618248F06D654E159F71033072F1517064BD96A5C138402771ABE7F39F53A798C2423B748EB7F310485D6376722E204FA33B9740E7FA68364289A677C5C78A19A7707D2549BF9329334478C64351FEA1634388ACD4BE57E4ABE9374A0E999B770CD81B1BF4A8FF300C297B116CEDA1A4A1C1BD5A2275581A0589A46142139FC596A1406D16293076527CDF9AEA2D0919F9678423B7D95B153DD1D9D62B72A12F6491A36604D19E7BB83C476D232769425557D3480623D40B7AC27C0F67D4ED5CA4D487BE915A68352DCB03A3929A4BB795248EBE2FBE0612833D9305A0A31D195718BAC193FC59B880042A7F61358104A919C7E7C210F02A856B8B1057DD8527FD4AE1EA81F9E1BF7C614ED8A312C95154873F86632CBD60C65176F13CAC695BB4C23675331058397D6E96E4F9DEEB859E3937553D94BEDE3C2B9A5EBF00964A49AB294BCCEE09E5A97381D2375941AA775A47F726E9 + +count = 45 +seed = 8BEA4E384E73C7E0B47381B3063334291A0F06D28DB61B5BF65B01D0A747722E0AA62B81AD46C00C8A5C31494E513836 +mlen = 1518 +msg = 047E2D484D798B3829CA6037D6C1588A2349DE09C5DDFBEC987652CFDA01454ED791DBFFA3D9DA13A35230ADBE1B39B042E3C70589658A03F75447C1CF3970DC10FE5A4A9E980F2A33B642B42E5E66E9AC4E7A56888FCD72913A79489B5B163BD37B8C3C8D242FFEB37D0C1ECE21034BE9E3685798C2EBC6B809DEFC02C6F0C2A3AD70EC0BAD12D57ADD63EC3584CA98E680267FA514B34DE4147C9D901B59914D49CE9E0F885855ED0CE7973F3307B675408F90B51C6A4D38A414D970EEC989CC7900D7723E19ACC4EF743F6D39EB1B563B8C13D42C0056B6C49732854925B606467F7BC662D17B924FC65E9C3CDC2AE73FF73040011A152B05ED7F96B2FF4CC39A22484AF72812EF02B08EF4DCB64C8936E74549AFDD5D876027FE2B431E61E52E8793888473F4C1E5C1BED2C4AEF8E5E300A735B302474FC6F54869984F1A62DAE29C7C9A0CCDECAA55FE137BA14B5C5C121E0C5EB33B035E01F3415529E0826B27498D7A71B0C086BACD140C02A5948AA54799D0DD0FFD384C7E68578247FA28D205B18ADAC94F7D3C8ACB7DAF71AEE347B577D97EE8E7E865CF4FC1C16640AD1E9D0192AA13AE81A71118408E145B6121ABB75B4BFFD1D403057D4AD5CC730452475A7F067690BB81E81E17BA8DBC31059969B20D387BA59CA8CE499E59A65C8583F29CD539F4F75DDCC68C7BBBC43C849802D8347143E2FE78C1AB6D7AB6BA9917301C88386B294AAC995C24AD680A8C3BDD7AEBEF21E84F5A1909A2D83A8DFE46A75F4B2B47614CD39BF3CA3460DE9BB5C37EB7349A17AB32214D031CE927806FA394470F407673B0CDC3D9A7E3749F09CA895D464A4269682CE6DDCB8FA0EC2F05372C73DC3D06FA6F58090EFBBC6D619A7A565D4EFE441AD7E018A7F5E1384B88EB4506FC54E0AB0A8B9EE3641760FFC08F6BDA78C12396473D1243BAAF6AE10316213115441C0B65C7E475B4E1578D066A47D9C6E92FA32D0F2C365FD15F5A2E88A81691F039DC642ECEDB6652D08ACBE64625B46083CE758FA96C142EB34477E065AEA04A45FF4FCC3E3D146ACD7041F5F7E4C6B26C8205BE7B66DB46DA55556CE02B48AF55A4710BB28B8CE102CB15C1A4AF59D9A17A2DDA6E2D1E96987F6AA9F4216D8D5E5CBFF7E2CB775E83A776063A4AAF937BF0EC84149EC1A7EE21F735D21625E85831B80DC11EBF04F30B13E3A7E4D4784C5F8C61C679E0B6863958F42ED31DEAFFB4C272A3731C1407445CA7673D225EB6509469DC6C1F0AF43EB00F18B3A210AA57D51169F2A9FC251BB338ED4E9DDB19282DCE871211D26482E13A8D533DEE00D36FF5CEA98DEA72D9F0B32DC398A3D5537A3373058FAAA3926C127A1EC739FAF3D57CC1A05D578074A3A72C3F2B1692C2BA1F1FFED943E7BFCBF1E664C4F52F7BF8D86174CA8910C290C06804A7748DB21008AC43E653D7FD7E0C982EDA9356F68DDEC26473956DFF281F7B767010C57F4AD09A05063A6B3CE078DD32F3DE1F40526C06A2D60E36E2C70502D5BEBFD2F3BFCACF8720CDE1657B9892406BAA3DF01E59313EB655B6A545331EBA01BCDB9C99E4AD7FEF7438AE8715FBE589A2F99CB9CA34B9610B3CE5BE38FCF979240698174348417420AAB069B8AD5F646F82958A136DC9F2F81E601056BB4AB5E10F4EBC4A00E18924C51D0FD104078471C6805C49D92C78C832EC3F10D8966E19ADD3D3B4516E12DAF4F63FE6BBD228062DB743D1F867800854F7BB7FFC2CAA0D01A0BB683E368673A8E664BBAA17A8C0C04BCFF05246F9C4F3020510A992EF26FD0933BBFDE9D042862DFFD33A6465F590A2287D8154777A89724FC3DF9F2F1B1ED8765E7C7B761CA4781006822065703ADE07A6E874E70928E1ABA29EE490690D24F6E73D96B85FB53ABFD1C1FDE439279E08FA232043B2344B267CFE5901C60E7CA14B0C85EDCFA2AB90F341821D2B4E25FE23129F2432DB932F23B5957706A433B308FB918D1C8D81EEB399BABE95E7229AD41F30460CF28671A4508B0BD1C61F48CDC23587BB9BDC6F565E76C86547CB71396661BEC8C7FC2223751F765C91C45C674C36B49AEDEF3DF2537F888904B507EDCD89155D40CB81DDA74376BC9CDCAFF8A368F1086C99EDE25526BC53F95F4017 +pk = E5DEA097D250D5180619186B8388161DC55333B32C729BE549CEC3F42643B7BEE09CEF8205F4C2314BA0DA834FFCAD312D7E8B29E182F400547DA89A0A97A110F13871ED5DB09D9CFC17F1DE84E1FC11A4C06C982A5674EDA3FAB77F8C2D380C15 +sk = E5DEA097D250D5180619186B8388161DC55333B32C729BE549CEC3F42643B7BEE09CEF8205F4C2314BA0DA834FFCAD312D7E8B29E182F400547DA89A0A97A110F13871ED5DB09D9CFC17F1DE84E1FC11A4C06C982A5674EDA3FAB77F8C2D380C153995F44523ED78304BDBB14CD4B42DEF72345FE1F47BBD451F0500000000000000000000000000000000000000000000EA3972E6816E1E003AEA67E6A7708F07BBA34B01060D89E731F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF257B19421F023958D7AAFE96E6D64CB172F8F8A6FC9E0AF07EFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006DDA29EE3FD2DE634767D2E45390AC49BE317870262BEE9764A3DA27F51DF1515765CCD4D2A714D451A8C8D282982400F66F7C82FD3B0C04B2364E3EE757988C043B70846AC3EC9C0DB74A274640CCA87EF2D638A372458C0F9CC04C2742A300FB09E77B2BD2A1C4D78D6124E9E523384FF0F64B231D3C810FDB6242F87F98C98B85101AF78141118BA1756915EAF60009B70744D178780C4DE26574C4F6BF537F5A8E9A5C29CFE2C4B94682A19EB76E2132C6DDA5B1D860AF05D04FDDE43300 +smlen = 1742 +sm = 56DCE881EA3598D49FC29CAF0198666A463B15CF322DFEFCE3406F6C1B8AF0B50F76B7636F9BE09E6D2113D19EC0C006B3731954DF518EC9DB1844BD3A3DDD139ACA1971CA501243BA89FC4C419E66E6ACE34F213A6A78A5D89928B26E93BC0001002E9129B678A5AD6515EAE1AF536F73BACBBEFE51B6699C8801CF4E150535A3CC085EC89569A305179EDC916C02789FFF900123835D17B906C87C82A1C12358555614AA2BEA5B20C7B63B013BAB3D54FED5C1653E705ED4EB8A914E259CAE88A97E983E01C56A3121A3199F1A813E19041849C8A2A03CF78082C608000D02047E2D484D798B3829CA6037D6C1588A2349DE09C5DDFBEC987652CFDA01454ED791DBFFA3D9DA13A35230ADBE1B39B042E3C70589658A03F75447C1CF3970DC10FE5A4A9E980F2A33B642B42E5E66E9AC4E7A56888FCD72913A79489B5B163BD37B8C3C8D242FFEB37D0C1ECE21034BE9E3685798C2EBC6B809DEFC02C6F0C2A3AD70EC0BAD12D57ADD63EC3584CA98E680267FA514B34DE4147C9D901B59914D49CE9E0F885855ED0CE7973F3307B675408F90B51C6A4D38A414D970EEC989CC7900D7723E19ACC4EF743F6D39EB1B563B8C13D42C0056B6C49732854925B606467F7BC662D17B924FC65E9C3CDC2AE73FF73040011A152B05ED7F96B2FF4CC39A22484AF72812EF02B08EF4DCB64C8936E74549AFDD5D876027FE2B431E61E52E8793888473F4C1E5C1BED2C4AEF8E5E300A735B302474FC6F54869984F1A62DAE29C7C9A0CCDECAA55FE137BA14B5C5C121E0C5EB33B035E01F3415529E0826B27498D7A71B0C086BACD140C02A5948AA54799D0DD0FFD384C7E68578247FA28D205B18ADAC94F7D3C8ACB7DAF71AEE347B577D97EE8E7E865CF4FC1C16640AD1E9D0192AA13AE81A71118408E145B6121ABB75B4BFFD1D403057D4AD5CC730452475A7F067690BB81E81E17BA8DBC31059969B20D387BA59CA8CE499E59A65C8583F29CD539F4F75DDCC68C7BBBC43C849802D8347143E2FE78C1AB6D7AB6BA9917301C88386B294AAC995C24AD680A8C3BDD7AEBEF21E84F5A1909A2D83A8DFE46A75F4B2B47614CD39BF3CA3460DE9BB5C37EB7349A17AB32214D031CE927806FA394470F407673B0CDC3D9A7E3749F09CA895D464A4269682CE6DDCB8FA0EC2F05372C73DC3D06FA6F58090EFBBC6D619A7A565D4EFE441AD7E018A7F5E1384B88EB4506FC54E0AB0A8B9EE3641760FFC08F6BDA78C12396473D1243BAAF6AE10316213115441C0B65C7E475B4E1578D066A47D9C6E92FA32D0F2C365FD15F5A2E88A81691F039DC642ECEDB6652D08ACBE64625B46083CE758FA96C142EB34477E065AEA04A45FF4FCC3E3D146ACD7041F5F7E4C6B26C8205BE7B66DB46DA55556CE02B48AF55A4710BB28B8CE102CB15C1A4AF59D9A17A2DDA6E2D1E96987F6AA9F4216D8D5E5CBFF7E2CB775E83A776063A4AAF937BF0EC84149EC1A7EE21F735D21625E85831B80DC11EBF04F30B13E3A7E4D4784C5F8C61C679E0B6863958F42ED31DEAFFB4C272A3731C1407445CA7673D225EB6509469DC6C1F0AF43EB00F18B3A210AA57D51169F2A9FC251BB338ED4E9DDB19282DCE871211D26482E13A8D533DEE00D36FF5CEA98DEA72D9F0B32DC398A3D5537A3373058FAAA3926C127A1EC739FAF3D57CC1A05D578074A3A72C3F2B1692C2BA1F1FFED943E7BFCBF1E664C4F52F7BF8D86174CA8910C290C06804A7748DB21008AC43E653D7FD7E0C982EDA9356F68DDEC26473956DFF281F7B767010C57F4AD09A05063A6B3CE078DD32F3DE1F40526C06A2D60E36E2C70502D5BEBFD2F3BFCACF8720CDE1657B9892406BAA3DF01E59313EB655B6A545331EBA01BCDB9C99E4AD7FEF7438AE8715FBE589A2F99CB9CA34B9610B3CE5BE38FCF979240698174348417420AAB069B8AD5F646F82958A136DC9F2F81E601056BB4AB5E10F4EBC4A00E18924C51D0FD104078471C6805C49D92C78C832EC3F10D8966E19ADD3D3B4516E12DAF4F63FE6BBD228062DB743D1F867800854F7BB7FFC2CAA0D01A0BB683E368673A8E664BBAA17A8C0C04BCFF05246F9C4F3020510A992EF26FD0933BBFDE9D042862DFFD33A6465F590A2287D8154777A89724FC3DF9F2F1B1ED8765E7C7B761CA4781006822065703ADE07A6E874E70928E1ABA29EE490690D24F6E73D96B85FB53ABFD1C1FDE439279E08FA232043B2344B267CFE5901C60E7CA14B0C85EDCFA2AB90F341821D2B4E25FE23129F2432DB932F23B5957706A433B308FB918D1C8D81EEB399BABE95E7229AD41F30460CF28671A4508B0BD1C61F48CDC23587BB9BDC6F565E76C86547CB71396661BEC8C7FC2223751F765C91C45C674C36B49AEDEF3DF2537F888904B507EDCD89155D40CB81DDA74376BC9CDCAFF8A368F1086C99EDE25526BC53F95F4017 + +count = 46 +seed = CFA713E4A63A6FFBA43BFB898956DC400507F68AD164C3D24A67B5F8D7548C9DB44DAA43E5E4A0990325A4233089318A +mlen = 1551 +msg = 6A58AA820275A2F43D0F05DD0EE484AF42B665FFB8F21DB322ABD256A5C753BC8FF6A2C71467922E09726655F1A7218E736752065C871221C0B9DEE6A9D56B78A1C3B7357774396F6980226DCA1F91BA828E06BBF324D5CCE8D584D9D298261C7149899FC9F74D501E920F22AA34706A79213E35914DBF57B9642A42EF0D8226E31ADF89D18C5F3163ADECC79172C95650D764E3729EDAA08C207D930C26DF8EE1291C1CF889283B70AF00C0489175F799273C837B281A5D1284E4447ED72598EFAE23B523274644DA19BC0359BA59E5BE9E5828FF587C335E136C1D789257864D2648EF9C03D1C4B9809DD07CEABD865254D3D8D597587D71E374FC2DDE89C22C2330E8904F6B53F637348434A21ACEAB9892D5DF8FF84CC58229782BED739BFB13448896F7B1064B499087F7547CFC0A49272C2A670A9431B1B5A07284B6749EF834510A3EC0C61A43D5D0EB48C8F487947C4FCCEFCC49DECCB6111D617407C76A1B4A849C9A190310711B102F142F9E9CBB29F46447265E2C8DDB9174B780EB4A51003FB68483A265F2475D5BF6ECE18AF0CF31BF24CDD56583E777C4340086917B78068DFD380466F43D020E285CEED97A467DB96BFAEC22D80B4A6EC0DBB98CFC44436A41CADC85A90B214F00990D7B7010BBE4AC94809A0450C9ABEE5AA4037A44B0B4DEBD264120E762086B8D6F17AFD37086C93A8A368BE97E0F7546AF16D731C21878063E38DF3DCF3ADE6DD2DAA43C198F49B5D9FF5362333F29EC2F13CBB90DBE4E703EDAE9A4F7334A1C5AC60D5972C4AF2BA61B63C93BF719854E615D16BA4F704C55260A8838679815FA59BE08C4243CACC1A584CC1B4E777FCDC6E5A167C4CC9093749ACE4836AE058BE89CCA3221A3F63F07089006E4C44E40653BF262945A640D8C2A24E7CC3529E4BE76286C86CA2089CB8D4684508D1FAB81EAE7D8C731B65A22700BF9009A3190F5ED837EC22F9112383422027AED838F16A7740CF79EC101865D320E380D4ABA745ACC8EED376DC5B3AABE58DEBC35F8E983C92906AA2E3D8FBBE237325302E2A23CB1312EA7F532D64E79B9815996D28E0183EB728A37E19CB219987576C142F4B2F66AC6C7C77028ED59A8DF27F78ACD3910DDFCEB88888B4A604E5D07AE1B53EA6DF6EC2163DDC4BAB422D2438FFA543B22441E50E4087FDE4BEE6D79D90A2F72548DDC41C5AE07DCC87666EA3C4B89A0B14AFE03B585E7CA507E5F29997F2368B0C68C6AB6E344C082BD06AE922CD8089634918D9132DF9CBD665A4149C59BF76B0E94F66481766FD79054AA80C02E0AE04A6E2BE090582171B2A9AF455CD9FC302CA9D1EC837EE26E0E4D0AC8F0692CB9ABAC979B58CA92E5194EBE46B520125BD0B3ED1AC2BD817D3510E33CFD17058F865DBC64E9B99352B6CAF10F0A5A47449BF927A8EBA06D34C80D77A0B00B88B25A4C8747AADBB11BA15ADF9C959B05C4371CD8439FE5028E004A2E1D2F21190466FC7FD56E9BA0599A0EEDD98246AEB4B85994787B7604CB52F5515B42C2FBD4B5E9E372A36CC4E66483DD884DFE42AAA5EE7FAB200D8EC6E3556DDE0F9E9C7346F9967F8F3CEBE1E4D1CD8E6046E5E94BBC74AD3D51DB0DC704F4A4025383F0391B9DA37BCA8EC59E807593A4F040FBB186607280967E5048CAB92215DC783D9045F7A0922008628C771778661E97E9F88EA84BDAA8BA61126F71D193A2A564E3ACDE7ADF2C0B3D5B022EB6E0C629782B0025C9079D4545D88AA2BA27D10C5DCBCFB7CF648939155066518878CC54A4F611AAC21BD3A1EC628D3352F049915FCA55234B9146ECE5F78FBE7CFFB35695363202EDB9EC3501A93B4B6FC81B3DFDB5245FEEC8AA54195262C2467E15506B7D42A7FF61D75998722D0208BBFEA05CE7D2E66900A9B34F44C2A21257C220C03F9D6D7F0312A36F5C12DA20FB5290D5CFBC1DEC7D05C44820885C479063CA88783C5AA128829417EC4DD41CF83A1D991DF2EFDFEFE375E93F0371695E353EF737F4A75106211A5F70C82B4F360ABCD078C9E829C82A6B7A36D22B8D1F6E3101BA009C759FC83999D52E29B387A8DC1658A43EC4C4D9330A4ED2138E035EBEAE6343A76A82849E37141FCE34E9A41EB5EF88BBB9257017AD8696C3847FD77AE103A082ED1A05DE9420984C147AFF927E1950244912079BDBE5CC07 +pk = A955AF761E87312A72EC6AD8EC29E3463BB3805210A2C7ACDBA50139190EB6A18B0CFB2545EB05EB7D775C68B394D91C6B6B0E85863CC3ECF95CC312B97893CFF52E017C96E35CEE67B105FD539F3393AFB499CBA501C74B6CEBF9432964663B04 +sk = A955AF761E87312A72EC6AD8EC29E3463BB3805210A2C7ACDBA50139190EB6A18B0CFB2545EB05EB7D775C68B394D91C6B6B0E85863CC3ECF95CC312B97893CFF52E017C96E35CEE67B105FD539F3393AFB499CBA501C74B6CEBF9432964663B04E5437A905ACBCC4606498C8D77C6437EF692ABFA2DC1E102F00600000000000000000000000000000000000000000000ACE7CD6EFDDF9C6DD48F44863F3E2222FA4FE3692E5C93C57DFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65D28FCF160DB874209918BB92C039A710C073C9484437995CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A2159970E20843C86EAAE2434AF83722DD2BE686D559EAD471316BFD161AA9693967AB113F4A78C441628BB1F45A910083444E19428EF4453BE42EEAEB103F8737CE0CEA8B81D55F6E0EA017802B406991B7808F74449046DF7DA65CE73F4500856FC3046F45F74F6D84042D18FEA3E9ED903EFA9C36C9A13F1B68F5DB7CE540D1937B62F7C20EBECE6F411910F81600C796209AD39A0402C784F564742882B273AF40D3E936AA4D5A353960C31B812F3549EEF7A592648E5E7EEAECC9C09B00 +smlen = 1775 +sm = 25A355C4F550B69320655D783DBC3DA2D6816C508DDE663F697155141D08AA7D2DFFDD6DE678E5CAF3EADDD26FB8950DF5573BA5834354174F92453E7257097B6083447A3E8F3E4233462F21C757C16664C9C52983EC7AD9C6BDAEDD3A98051E0003D53D474CFD10293E09823298AF4C864A20408AB085F89A1A006A796FD82DFCE17A6C93F147A486DF9C316622E5FCD00DFA01EFADBDE435B1AD633545CA20901C20260274A944804B198403D64BF7F21CD6115DE3F8D57BCB6BCEFB4D4149C7DF8E5DD30052FA8BF55139987B5F54A9E09764200CF08656E7940A1600020D6A58AA820275A2F43D0F05DD0EE484AF42B665FFB8F21DB322ABD256A5C753BC8FF6A2C71467922E09726655F1A7218E736752065C871221C0B9DEE6A9D56B78A1C3B7357774396F6980226DCA1F91BA828E06BBF324D5CCE8D584D9D298261C7149899FC9F74D501E920F22AA34706A79213E35914DBF57B9642A42EF0D8226E31ADF89D18C5F3163ADECC79172C95650D764E3729EDAA08C207D930C26DF8EE1291C1CF889283B70AF00C0489175F799273C837B281A5D1284E4447ED72598EFAE23B523274644DA19BC0359BA59E5BE9E5828FF587C335E136C1D789257864D2648EF9C03D1C4B9809DD07CEABD865254D3D8D597587D71E374FC2DDE89C22C2330E8904F6B53F637348434A21ACEAB9892D5DF8FF84CC58229782BED739BFB13448896F7B1064B499087F7547CFC0A49272C2A670A9431B1B5A07284B6749EF834510A3EC0C61A43D5D0EB48C8F487947C4FCCEFCC49DECCB6111D617407C76A1B4A849C9A190310711B102F142F9E9CBB29F46447265E2C8DDB9174B780EB4A51003FB68483A265F2475D5BF6ECE18AF0CF31BF24CDD56583E777C4340086917B78068DFD380466F43D020E285CEED97A467DB96BFAEC22D80B4A6EC0DBB98CFC44436A41CADC85A90B214F00990D7B7010BBE4AC94809A0450C9ABEE5AA4037A44B0B4DEBD264120E762086B8D6F17AFD37086C93A8A368BE97E0F7546AF16D731C21878063E38DF3DCF3ADE6DD2DAA43C198F49B5D9FF5362333F29EC2F13CBB90DBE4E703EDAE9A4F7334A1C5AC60D5972C4AF2BA61B63C93BF719854E615D16BA4F704C55260A8838679815FA59BE08C4243CACC1A584CC1B4E777FCDC6E5A167C4CC9093749ACE4836AE058BE89CCA3221A3F63F07089006E4C44E40653BF262945A640D8C2A24E7CC3529E4BE76286C86CA2089CB8D4684508D1FAB81EAE7D8C731B65A22700BF9009A3190F5ED837EC22F9112383422027AED838F16A7740CF79EC101865D320E380D4ABA745ACC8EED376DC5B3AABE58DEBC35F8E983C92906AA2E3D8FBBE237325302E2A23CB1312EA7F532D64E79B9815996D28E0183EB728A37E19CB219987576C142F4B2F66AC6C7C77028ED59A8DF27F78ACD3910DDFCEB88888B4A604E5D07AE1B53EA6DF6EC2163DDC4BAB422D2438FFA543B22441E50E4087FDE4BEE6D79D90A2F72548DDC41C5AE07DCC87666EA3C4B89A0B14AFE03B585E7CA507E5F29997F2368B0C68C6AB6E344C082BD06AE922CD8089634918D9132DF9CBD665A4149C59BF76B0E94F66481766FD79054AA80C02E0AE04A6E2BE090582171B2A9AF455CD9FC302CA9D1EC837EE26E0E4D0AC8F0692CB9ABAC979B58CA92E5194EBE46B520125BD0B3ED1AC2BD817D3510E33CFD17058F865DBC64E9B99352B6CAF10F0A5A47449BF927A8EBA06D34C80D77A0B00B88B25A4C8747AADBB11BA15ADF9C959B05C4371CD8439FE5028E004A2E1D2F21190466FC7FD56E9BA0599A0EEDD98246AEB4B85994787B7604CB52F5515B42C2FBD4B5E9E372A36CC4E66483DD884DFE42AAA5EE7FAB200D8EC6E3556DDE0F9E9C7346F9967F8F3CEBE1E4D1CD8E6046E5E94BBC74AD3D51DB0DC704F4A4025383F0391B9DA37BCA8EC59E807593A4F040FBB186607280967E5048CAB92215DC783D9045F7A0922008628C771778661E97E9F88EA84BDAA8BA61126F71D193A2A564E3ACDE7ADF2C0B3D5B022EB6E0C629782B0025C9079D4545D88AA2BA27D10C5DCBCFB7CF648939155066518878CC54A4F611AAC21BD3A1EC628D3352F049915FCA55234B9146ECE5F78FBE7CFFB35695363202EDB9EC3501A93B4B6FC81B3DFDB5245FEEC8AA54195262C2467E15506B7D42A7FF61D75998722D0208BBFEA05CE7D2E66900A9B34F44C2A21257C220C03F9D6D7F0312A36F5C12DA20FB5290D5CFBC1DEC7D05C44820885C479063CA88783C5AA128829417EC4DD41CF83A1D991DF2EFDFEFE375E93F0371695E353EF737F4A75106211A5F70C82B4F360ABCD078C9E829C82A6B7A36D22B8D1F6E3101BA009C759FC83999D52E29B387A8DC1658A43EC4C4D9330A4ED2138E035EBEAE6343A76A82849E37141FCE34E9A41EB5EF88BBB9257017AD8696C3847FD77AE103A082ED1A05DE9420984C147AFF927E1950244912079BDBE5CC07 + +count = 47 +seed = 1F3193EBC58EF65E9E396D69220ADB8ADC729BB388A72CEC9028A094F1CBDED21CFB0C41356AF31E0CF66A3B0D843666 +mlen = 1584 +msg = 139BA17ED7B476DBB1CDFE3C42B3A57AF5BBCB3BE19ED04D6C3072FDFE917ECB9272D59EE89EF83522531D83AFF8B9934A8423315C350D1481A4B02980DC29E1CB83B76623869649AC40EF297B153B679C327BB251C6E6BC169C48ABA2A439F9EA24EF94656A415C3E86D7BCB43CB3717D54D773F1937DC8B0E02D4E6ABBB1C83FE73F1B221C9A359E454C19DE5E71EA4CB8C560EABF1DA133FF20D81785D2ECD935B99F24840761446C324DF81484C5C05045C0949DF8D0F10F942E1B5B79074B358C25B6EC2B0B42DF65D998B666CF1BC568E7D737F22FF541807BE95ED85A9980E940E24D2C506BB0F9BEE32EFFD85A2017DE694F61BCC2B292595C97FF4C2145E48AF8F0F3D71763B4DB433ED7BDB8DBF8643475FB2B9155F0CC6A0048C5546900792BC01EBA4B06C83A0C447EA0CF05410DE55ACB8E5521829C89BFBC084CD86E7CA3D701283B70F78E1CE9C3888AD2689E0EF5593D656285066F319E155F86C0A71256484F42A0C40E7CF13AF0CF77C6D1CC7231A48538E9060A7863B774C9CC65E321E45AACC002C0170EDDD18CC1424159D46BF99D08A28D2DEA8917D28D91A1D6C409D945A5EEA19413A1ADCA40DE9458FA6BDF1E5308EF9E67E1E90E9D92BF19B5351FC49DFF0A31E035038AAEC651C0F20F276E4EF0EE35C14BB625EB34205516D95ABEAA06A7A3BB3AF2F12236406689BFAB11E65FC63EBC5B944818DD1D53C0E7B88CE7AEBAE581D995AE7D8423778DFE20D6CEA7AC0B1B4EFE2B9D571DE77BD8F71E89D9F6A2DC89103B73625887AB376BD12CE89A65E6280515A44A80D6C32799669260167DA0A214AD0FB803930AB1952D93360B54433CE8220B29339DCF2702581E88952A5A1549DBA11F4CCDB6FEFD6D24522F3207796C8D5BA9D1582F888F2500964F2B975AED5D5AF83409FF9720EDCF5CE3FE9B6B586B08DE21956E7970D8DC28F6208A80F5378ECBC506333A1D98C58EB0E2EB0CDECE0F5D16A069FFD742D1E589F546C4F2EA3DA0A56F984CFD93F5F2912FB1D068F2BD7C1B5E979ABCC62E3A0164445398F5C0208E82B99AED1200D36289B1FDBBF03E43995341AED3AD712CC7C7530C751B40B765073EE4E4CDD411AE543AD5E2793F294320E9791AB35AE1697F23EBFA0280B8041859909B0089C101D7CC429408FABD2E073FCA7F2C2886031E9F6A32F2B596A799967BA8A47E87DCC8854D45DDB6DE39160600EB4235F4E3424D75DDC8CCF041AA05B25B5A3811540EA5B77CD8D7D611A63BEF5C26D57475B28E961645AEE0B9C8D47954FAF634017787A21A671493E7C5F1A4C553E0A68DDD726DB1DED4321DC735332FEFDF2A84C22097AB3552F878E304598EC40EB349E1C1AE416F94112A2CF8E8702A4C3BDE2F58245166550FC238E153D10F90652518B1D84CCD3ED836F150F1FF103976E743137DA5A97A61276DFB0C11D071B240069582265A9CAE4987B6C6B017DCD1594024D7B1336FF141E59936EC4CE5410E1B73BA6FB42D35F8999225CB1A135260967F4F6EF2172D53FA6AB6D1A2E3174B46C24BC103BAF69C2128F093AECEEBE8753EB352E2804EE64AE5140DF1ACDACD8F225B3C9A61264245B8E5CF759CDDD75E25E2D790FFAE8421515E0CD6F279D0080A3F80BB2E0729C0D2626B6ACE31CE20BCDA490C7660D04D1D82E6403000578926C52D8F9A4BE7103D64E0F03E8F148BB2236781EC30F6D8BC827C107FCC40F26DDAD485E6135BDC3BB331BE139A07891717B692E23312D0E5B1C41F30C3B4B4700EFFB481A835AB54340269FFF365FF87F58245621ACFD83B7FCC6FF108132D8966F9836544354F7E216FBBB851F390DCE8A72362F0454730B90D35AB3859763AEE35668310FD501C7501F4599563006AAEE9B636B676F3DBB6787317885B0F4A64171BF19CBF2EA7A625E1563032C196E1292D82C7484817DBF78D8E9E478FDC4C92CBEF48D4CB4F0E6DCDCA6682DC0A56C3E45EA0350D9FF88073748305FD7DF3A3BE8C055CB1C55167560D5C99345BA80C21CE791C4A511E384A02833B78E8AA02B1B877A9B8D806978519D716C611DF54AE8EA2691540E87C6E79EB006569E02745021BDC7852E1FA4177E2C3EC89257618B38719CB07B0BA68F600236167F019694959C2AB6FB39D5890CB176F6ACC3B9656E495C07027E3D4DE781F48C1F1A8AA1B41449689E191E495FF3F263DDAAA8DE0DF6F1A4AA3EF1F5EDFE437BB74BA +pk = 6481BFA821C24449C29629D7962FE50F52D472F586AAC852A68AABA5FA47879CCDE3879743FAD38D5E8C049CB2719318F127C3CE1E554F48D8FE497CA5F89AD8263861660843A43B7CF46E50685CEEE611AE3DD2343460A69C734A22513BFB1617 +sk = 6481BFA821C24449C29629D7962FE50F52D472F586AAC852A68AABA5FA47879CCDE3879743FAD38D5E8C049CB2719318F127C3CE1E554F48D8FE497CA5F89AD8263861660843A43B7CF46E50685CEEE611AE3DD2343460A69C734A22513BFB161747CEB93AE04D1395EC2525F32F173CECE3E0554CE4E8EC5BFE0100000000000000000000000000000000000000000000089E336C944444DEE358236BF4CEEA927CBF2C66BEFED121A0FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD3552023E5FAEF5D4326DAB056EBA45F5660313C902C395F9FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098378A2E2FB6626C13DE2E93800C12CE8DA40417988C90257EA303290C13BED16D28B05087980FFE90F0A2CC13AEF00001F7F73DF13FB2A61D6E356837453C1FAB99ADD39167556A0800D4193273883ECC0F2073D2113EEED9414F6122AA5B005F0A0E16ADB2F10FC072AE8D5064321DD13226E9274D9CA40ADBC9EB1BA5AA91DAC65E1FF65BF386D42079D9C749B500451F839D82130F7C5C001D03D6F8D9E48A84138804E8A2521A378D17B6F287FD67B1F78D97DDEBEB49F7E744BB1ADA00 +smlen = 1808 +sm = 4FB40B09EA54A59A9D5F7C036680864D7210A289089DDB0E1DE62307B1699B2AC9DA87E982290089B6D19601F111BB27CBEE508B16A913455F0B032D027EDE028A9E414531ED7203F0DF8B406CF7D318918CF0A4BC746B4476FBAF9EE3F6F1200002E76B69531E6999CF4409EFD6AD81BBD15B64A1312940133D02F6CAFB1F7C69EAA0634825415201BA164CCF0D221BB0D107036DDA9CAD3CE297DF74B3921BF0531C9A480EE7EC2CFD11550176573E50F1EDCCCEF9C8E51D682C166FEE8D8D8B7926D3CF00FAB28C9DE1BFBE4F5BD9AFCDFB01B984EB42B1AF49A520000215139BA17ED7B476DBB1CDFE3C42B3A57AF5BBCB3BE19ED04D6C3072FDFE917ECB9272D59EE89EF83522531D83AFF8B9934A8423315C350D1481A4B02980DC29E1CB83B76623869649AC40EF297B153B679C327BB251C6E6BC169C48ABA2A439F9EA24EF94656A415C3E86D7BCB43CB3717D54D773F1937DC8B0E02D4E6ABBB1C83FE73F1B221C9A359E454C19DE5E71EA4CB8C560EABF1DA133FF20D81785D2ECD935B99F24840761446C324DF81484C5C05045C0949DF8D0F10F942E1B5B79074B358C25B6EC2B0B42DF65D998B666CF1BC568E7D737F22FF541807BE95ED85A9980E940E24D2C506BB0F9BEE32EFFD85A2017DE694F61BCC2B292595C97FF4C2145E48AF8F0F3D71763B4DB433ED7BDB8DBF8643475FB2B9155F0CC6A0048C5546900792BC01EBA4B06C83A0C447EA0CF05410DE55ACB8E5521829C89BFBC084CD86E7CA3D701283B70F78E1CE9C3888AD2689E0EF5593D656285066F319E155F86C0A71256484F42A0C40E7CF13AF0CF77C6D1CC7231A48538E9060A7863B774C9CC65E321E45AACC002C0170EDDD18CC1424159D46BF99D08A28D2DEA8917D28D91A1D6C409D945A5EEA19413A1ADCA40DE9458FA6BDF1E5308EF9E67E1E90E9D92BF19B5351FC49DFF0A31E035038AAEC651C0F20F276E4EF0EE35C14BB625EB34205516D95ABEAA06A7A3BB3AF2F12236406689BFAB11E65FC63EBC5B944818DD1D53C0E7B88CE7AEBAE581D995AE7D8423778DFE20D6CEA7AC0B1B4EFE2B9D571DE77BD8F71E89D9F6A2DC89103B73625887AB376BD12CE89A65E6280515A44A80D6C32799669260167DA0A214AD0FB803930AB1952D93360B54433CE8220B29339DCF2702581E88952A5A1549DBA11F4CCDB6FEFD6D24522F3207796C8D5BA9D1582F888F2500964F2B975AED5D5AF83409FF9720EDCF5CE3FE9B6B586B08DE21956E7970D8DC28F6208A80F5378ECBC506333A1D98C58EB0E2EB0CDECE0F5D16A069FFD742D1E589F546C4F2EA3DA0A56F984CFD93F5F2912FB1D068F2BD7C1B5E979ABCC62E3A0164445398F5C0208E82B99AED1200D36289B1FDBBF03E43995341AED3AD712CC7C7530C751B40B765073EE4E4CDD411AE543AD5E2793F294320E9791AB35AE1697F23EBFA0280B8041859909B0089C101D7CC429408FABD2E073FCA7F2C2886031E9F6A32F2B596A799967BA8A47E87DCC8854D45DDB6DE39160600EB4235F4E3424D75DDC8CCF041AA05B25B5A3811540EA5B77CD8D7D611A63BEF5C26D57475B28E961645AEE0B9C8D47954FAF634017787A21A671493E7C5F1A4C553E0A68DDD726DB1DED4321DC735332FEFDF2A84C22097AB3552F878E304598EC40EB349E1C1AE416F94112A2CF8E8702A4C3BDE2F58245166550FC238E153D10F90652518B1D84CCD3ED836F150F1FF103976E743137DA5A97A61276DFB0C11D071B240069582265A9CAE4987B6C6B017DCD1594024D7B1336FF141E59936EC4CE5410E1B73BA6FB42D35F8999225CB1A135260967F4F6EF2172D53FA6AB6D1A2E3174B46C24BC103BAF69C2128F093AECEEBE8753EB352E2804EE64AE5140DF1ACDACD8F225B3C9A61264245B8E5CF759CDDD75E25E2D790FFAE8421515E0CD6F279D0080A3F80BB2E0729C0D2626B6ACE31CE20BCDA490C7660D04D1D82E6403000578926C52D8F9A4BE7103D64E0F03E8F148BB2236781EC30F6D8BC827C107FCC40F26DDAD485E6135BDC3BB331BE139A07891717B692E23312D0E5B1C41F30C3B4B4700EFFB481A835AB54340269FFF365FF87F58245621ACFD83B7FCC6FF108132D8966F9836544354F7E216FBBB851F390DCE8A72362F0454730B90D35AB3859763AEE35668310FD501C7501F4599563006AAEE9B636B676F3DBB6787317885B0F4A64171BF19CBF2EA7A625E1563032C196E1292D82C7484817DBF78D8E9E478FDC4C92CBEF48D4CB4F0E6DCDCA6682DC0A56C3E45EA0350D9FF88073748305FD7DF3A3BE8C055CB1C55167560D5C99345BA80C21CE791C4A511E384A02833B78E8AA02B1B877A9B8D806978519D716C611DF54AE8EA2691540E87C6E79EB006569E02745021BDC7852E1FA4177E2C3EC89257618B38719CB07B0BA68F600236167F019694959C2AB6FB39D5890CB176F6ACC3B9656E495C07027E3D4DE781F48C1F1A8AA1B41449689E191E495FF3F263DDAAA8DE0DF6F1A4AA3EF1F5EDFE437BB74BA + +count = 48 +seed = CF5A04DDB5EBC45328F703D486D24443A7692D65AA55F054E3078DB76A7939590A3F35CF1A21E82A845445DD1B64A85A +mlen = 1617 +msg = EDD4DA833528B0511534F77857FFD16EAFB1A2AC87E6844612DBB104B9F32025B7F54E993D65CE85A061B6AC6D70A15BB42BBBBB6E2E21AEA55BB8A556120EB15EF35FD9774FC7B5C2894B747D3E4965B77DD8D5B26F38D413662783DCD332765B4DE534D08D6514CA9DC6ED7F2BDB4B5C437178710B04491708836CF2CCA08F28582107D27AC305EDE6030B1F8AADC4A1D29AD16CB4D739D8F813D47DA715CAD6B5CDE24EA95DFF4415B527DD900442D9ED1CA712C58B206D6E79F8AEFB882013358BC578638225BE79B58FB677277F072AEBCF8CCD6AB61A9D98A3B260E60AA625D78058FAE6028E4C5562A0F3473C3AD530BC4471228F27502A8F8FE2D1F72022103C3A2DEA363E68248ED8693B3B066B495561CF4468E8EBF32B454E54DF1766468AD3831D56EF7EB9C231E999C4CC3A6B0EBBF2C4F22820E256F67497427F53AD22D42C9293DC8682D0BE3517B63C6E871910ADBB3406B6B3B1CAD980AAE47BF9686E80B6E5DF2DACCCEAF9506B4667271779D00B4C1065951E21F2ACF6CF3CCCB8A633D1114CE9D531D94420E4AE496086638F031C0BAAB5722A41A66788D3885EFC7FE1C3DB54BC69E35B7489A0237A37AFE5194B5F424F792CC1D696098BCF327D87EBC50429A95ED82105C4328D0095A9775589FDB6C262FA51FFEE4D99C6D1A68FA661D1B6A0A2E0693D73B39218A6895BD83FC1D54831B7DF146FE7BD2A91B979018787B9904285A35922E22A7F1761BEA541EAF21D74E3A2F3C6F2247B042379CA4C553FD9256DD0C63E4C9DEA60912D02FBE4CE7762069A86CDE02A4E1E311B2AFDE435DA0816ACA659BD8C0650C1F118C0EA3622D72A5E96132F8B0FF8458C757648BD46E58195FAA0FC4FF8FA44238E35A25C9807B6229000EE560D8E085F27375C2F659BAA5FDE302B9529BF4699505C28DE33AB5DC2B8C02967947CD24C6A599ACB5C2D1E7D6BF3BCCEA0253FBE11D8043FED532AAFC9EE1151243BB80B92BE239BC4FD1D1CAFF502951205F2E6393B704E67141E1218963F664FE0759C15E6C0A1B40602A73990F040502867A9EDDBD4DB0E554AEA4BB9597949D5FB32C2E3AF92CF7816BEDAD5EDE1B769C823CABDEFCA1D1B85213C79EB03E065146B58E3BFBE80B4D4683B65AD1E0611372729B99A0B93934D52DDE40C19FED5A2B3DC3030E0B5F26B66474A5CCA6D741AB294BBBA6BE516105C08BDBABC97BDEC2141D035BF6C3A71553D6F6350229CA2626B8B0B56A24F2D6EECE436ECB77A70D747B6A6F830578B4792DE533879B174353424E7D0EADF6BD5A74B36A4E6EA7E39A4215559557BCE7A00FAAF0D1F81016F913A10F3C9F406C7CB53282CA8FD5FE4F5FABB96F891583E0507912BA02709764694296A5248C340A1B9EC3DB0F926F438CA96FECD40C4AD8DAED9B8A29691601835FE14283762236EF2135443307E5F0082D1C2180AE96ED0DD99A6E9172088E8B94AA2952BA5E128B202B2CBC1966E69B6E6384820D9AB624BC71788EA84B4ADFCFAA2EFA1DDAA8855D1DB3F58EEF2D54FE11A8A5D78ED46B58460E6F2FBA6CB70640700A4520AA1A2A9B336AEFB17CDE8AC78D67F194662642A0107CE38B74D731380A72AD4A0A068F09E0878E521F15CE8134780C3FD0CAB2DC2473448654F88BF1FE2020901B90C0ED670866B1BC337881292FBA885FE2BFEF6FE74765CA12372C8CBD698AC41A4C337374587DB15AFFB511D8C224F1743498D7173897FF5B8D070B89592BEBE053D5C10DCE67CA8542781AE749F3A42FAD7E4A2004A565F81D5FAECF11115C270155FB8AF6AEDA138B9C71458D6D2FF63441130EE9107C39260469521E020D2B42CB5A51098027F23890DAE8B28BF722AF9ABA6224E02FEB47E40112CCB164E8CF174BC9AC4C11AF9B482DF9C9F7F5F1B826428C21BE395EB1F07DE511E8258C84F5F035F4787ACE18C190808EFE99FCB455A54D366DDE2E230B575ED5A4A75D57C9A38DDE3D91D0D1A1C4DE7F277CAF23E0C5DD8E3B693DBC66B6BF1679B0AF74A2B9065B64CF0978115CC456AF685B22D85135727A8AAD96338611DC109B36C85A92E4A0180AADD1D25C5B3D4C681A44BACB953E50F994FCF5281366CDEC0CC50976074D91840B5079180CF643184ADCF9E4CCB44328E7BB9EB2BD06DBB7A757C35EC3DCF795A5E05ED250159EC453A1692426F624CC0737F691E475804F155E44293151E42D3C0F115ECEE53C6EEEF69788F7E8E5C422BB102237499F2638244C0C080B3639A49FFC1730EBB0CFD8A46 +pk = 85398A4C3ADCA128CFEB81A9791072629000A6D06BDC7FFAC6AE031A89C1003F9F6D6B7D32214F39852F1C61CDDA1E3DAC74DE1FF220E3AFC171FF5D59A9BB22529D2F37C1089B27D1265CB63BC3F5EE93B91174F9B593ED073680EDEFFBFA220D +sk = 85398A4C3ADCA128CFEB81A9791072629000A6D06BDC7FFAC6AE031A89C1003F9F6D6B7D32214F39852F1C61CDDA1E3DAC74DE1FF220E3AFC171FF5D59A9BB22529D2F37C1089B27D1265CB63BC3F5EE93B91174F9B593ED073680EDEFFBFA220DE9CEE17005E3C610FBF44C2D44C8FEA5CA20012ED7A01AE9CE0300000000000000000000000000000000000000000000F6686DD1609DB44C74210EFD6F07DC3D7CCAB07E1EAB7E9D3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCDE774814BE8CAA2D0B1369FE4E808848909B60961FCB71E1DFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FBE22318E11E8AFB620C28B0019980CB48B415BB84DBD19BAE2348BAA62098621057E3F7086D286B8BEFA202E70AC00497F5974BC3EFDD7A8C33164D974A8E3EEF95DCC33030C07D95F11154DAFEDC8147B7DCF305F5F6ACED3D306C30397001F6917BA47364519267F78D0336C03179B806102032695024C595B6A4639D3FA31EE03A97EBAB5D0031882F886E90E0026DABF91F0209766307B980B06CD6D920367244B885542345702C300C8EC19B1A49C20A4D5F90BDBBCFA8BEF9C9CE800 +smlen = 1841 +sm = DD2BAF7151FAA77A5DED54A6F783B93861B50BD266DCB199DB62A8DDD88A9F1F87F1B9FEED60B21638A42EEC53ABAC2EFAC274F54475FB17F2EA2632F610301D75C79C990CADB8C0EC40CCBE2F57A9605A9C8F6BF1D5E8B0104D78995F658E0F0100C62862D59667F95226FF817693DE57E79FD8410398E76B0600D5650638E1473BAA4E4FE03E693C4D158034B093CD2C58B5019D2BC9AED53E1850002C1E648E8EE7F0E42008EF19FACAB4014F3CC6138D3CA44781E6A061DEC2F11B092442F2CB01B7C7013C901EE9C0F11EBBC827BD423F4F95A862871D6DC5DECA001704EDD4DA833528B0511534F77857FFD16EAFB1A2AC87E6844612DBB104B9F32025B7F54E993D65CE85A061B6AC6D70A15BB42BBBBB6E2E21AEA55BB8A556120EB15EF35FD9774FC7B5C2894B747D3E4965B77DD8D5B26F38D413662783DCD332765B4DE534D08D6514CA9DC6ED7F2BDB4B5C437178710B04491708836CF2CCA08F28582107D27AC305EDE6030B1F8AADC4A1D29AD16CB4D739D8F813D47DA715CAD6B5CDE24EA95DFF4415B527DD900442D9ED1CA712C58B206D6E79F8AEFB882013358BC578638225BE79B58FB677277F072AEBCF8CCD6AB61A9D98A3B260E60AA625D78058FAE6028E4C5562A0F3473C3AD530BC4471228F27502A8F8FE2D1F72022103C3A2DEA363E68248ED8693B3B066B495561CF4468E8EBF32B454E54DF1766468AD3831D56EF7EB9C231E999C4CC3A6B0EBBF2C4F22820E256F67497427F53AD22D42C9293DC8682D0BE3517B63C6E871910ADBB3406B6B3B1CAD980AAE47BF9686E80B6E5DF2DACCCEAF9506B4667271779D00B4C1065951E21F2ACF6CF3CCCB8A633D1114CE9D531D94420E4AE496086638F031C0BAAB5722A41A66788D3885EFC7FE1C3DB54BC69E35B7489A0237A37AFE5194B5F424F792CC1D696098BCF327D87EBC50429A95ED82105C4328D0095A9775589FDB6C262FA51FFEE4D99C6D1A68FA661D1B6A0A2E0693D73B39218A6895BD83FC1D54831B7DF146FE7BD2A91B979018787B9904285A35922E22A7F1761BEA541EAF21D74E3A2F3C6F2247B042379CA4C553FD9256DD0C63E4C9DEA60912D02FBE4CE7762069A86CDE02A4E1E311B2AFDE435DA0816ACA659BD8C0650C1F118C0EA3622D72A5E96132F8B0FF8458C757648BD46E58195FAA0FC4FF8FA44238E35A25C9807B6229000EE560D8E085F27375C2F659BAA5FDE302B9529BF4699505C28DE33AB5DC2B8C02967947CD24C6A599ACB5C2D1E7D6BF3BCCEA0253FBE11D8043FED532AAFC9EE1151243BB80B92BE239BC4FD1D1CAFF502951205F2E6393B704E67141E1218963F664FE0759C15E6C0A1B40602A73990F040502867A9EDDBD4DB0E554AEA4BB9597949D5FB32C2E3AF92CF7816BEDAD5EDE1B769C823CABDEFCA1D1B85213C79EB03E065146B58E3BFBE80B4D4683B65AD1E0611372729B99A0B93934D52DDE40C19FED5A2B3DC3030E0B5F26B66474A5CCA6D741AB294BBBA6BE516105C08BDBABC97BDEC2141D035BF6C3A71553D6F6350229CA2626B8B0B56A24F2D6EECE436ECB77A70D747B6A6F830578B4792DE533879B174353424E7D0EADF6BD5A74B36A4E6EA7E39A4215559557BCE7A00FAAF0D1F81016F913A10F3C9F406C7CB53282CA8FD5FE4F5FABB96F891583E0507912BA02709764694296A5248C340A1B9EC3DB0F926F438CA96FECD40C4AD8DAED9B8A29691601835FE14283762236EF2135443307E5F0082D1C2180AE96ED0DD99A6E9172088E8B94AA2952BA5E128B202B2CBC1966E69B6E6384820D9AB624BC71788EA84B4ADFCFAA2EFA1DDAA8855D1DB3F58EEF2D54FE11A8A5D78ED46B58460E6F2FBA6CB70640700A4520AA1A2A9B336AEFB17CDE8AC78D67F194662642A0107CE38B74D731380A72AD4A0A068F09E0878E521F15CE8134780C3FD0CAB2DC2473448654F88BF1FE2020901B90C0ED670866B1BC337881292FBA885FE2BFEF6FE74765CA12372C8CBD698AC41A4C337374587DB15AFFB511D8C224F1743498D7173897FF5B8D070B89592BEBE053D5C10DCE67CA8542781AE749F3A42FAD7E4A2004A565F81D5FAECF11115C270155FB8AF6AEDA138B9C71458D6D2FF63441130EE9107C39260469521E020D2B42CB5A51098027F23890DAE8B28BF722AF9ABA6224E02FEB47E40112CCB164E8CF174BC9AC4C11AF9B482DF9C9F7F5F1B826428C21BE395EB1F07DE511E8258C84F5F035F4787ACE18C190808EFE99FCB455A54D366DDE2E230B575ED5A4A75D57C9A38DDE3D91D0D1A1C4DE7F277CAF23E0C5DD8E3B693DBC66B6BF1679B0AF74A2B9065B64CF0978115CC456AF685B22D85135727A8AAD96338611DC109B36C85A92E4A0180AADD1D25C5B3D4C681A44BACB953E50F994FCF5281366CDEC0CC50976074D91840B5079180CF643184ADCF9E4CCB44328E7BB9EB2BD06DBB7A757C35EC3DCF795A5E05ED250159EC453A1692426F624CC0737F691E475804F155E44293151E42D3C0F115ECEE53C6EEEF69788F7E8E5C422BB102237499F2638244C0C080B3639A49FFC1730EBB0CFD8A46 + +count = 49 +seed = 8C3D2FBBE0D39E293AF2D2CC5A9BEDEAAE3752DFD19CDC1E186D41E717A0412AA429CBDF005445AFDE684656B5D17690 +mlen = 1650 +msg = D868EC985F946F3C31B6CFE4811BA530EACD0ED061EC383C203B2481AC697B8B88BC0F72B635027E443AB1F54478440DE16E596D30A0F1252E0AF54C0F382BBF5655BEA8C6B9A2F6382D003CC7E4D4F223F8E35EC87CC543EAD52E0E1ED956CFB32E8075715C07CA4817C4B8DACE68C8B0DA459271746BE41D6102B3FA5E49AEE8D443E78AD3246D0B9BCCF6AB7CB7CF72B8A847CA16B435F0618594400037179441F3BF524231F747D920E86506E84C61D4D038D42E82D52D97ABFF896C1DB1C646807156324F7B68DB620EE435C7B8C9AC8B193B7C892565C3631E297495BD3B59293F9A9CEA5E29E23A242B81DD05C8DC9DD669424573298C85870B109C7B593BF864B56895D81386466CA5CB6071005781FB214F1EAE9672D0D16351A627A3FAAC49BE4E13D552340328323CDCB4703BBE07C2A39D75D7737D5C1BD04355B8694432DFB7CB4F1901550C7D6F41080C0F6A2CC49D63A69243D137A78260C06E7A53AAF4F4B086E0220EBC5361A6A78C9B2EC09C2EA4EC45A41065B4B2DAA866D9BABD71C8E6CB378595F068EDB258B2AD1F420B304E5924EBE273AD6D00684F75B6A31DC5290A37D0F9A848B1FC4A67DD9A4FB1F9B4C6CD45E87FAB4A09129C9AB95C44703B75B54C9EF9E825928ACA56527D79B338C5AC639D0265010F3C085D2B09AEF0E4F55D080FB5FF79F13E8E4E8DB020F4C095140D46A93F2E4811BFBC1393EC24F6B7EF31F13623DF0360B1E335FC42098CA1EFCD0306C5FECCE942F6E299AC9ED81054FE452D3F63991DA42D5680EEF749C02FCBA78DB5F4F7C734C6B4D99AF79711A0BAB723C24364AC85700242878CCA93465F286D5F7ADAD7F68F1D38CD6C6E0575A36F1E5521E420D348D947E745C2355FB5FB0F12DC6FB5E9435CF8E552C174A617151AF8D5E7D469AD5CD741E16EB88EA6D7C5806B08571697D22A525C2E30DFF608C921B955D2A990D9466829385DE0A81875BE564942AE740D15AC0AF46A876426EBBE481738BE19BE06F174D975AE8DFB52A94AF9A77E56267C0BB62169165ACE155041406CAF507146A02FB760629CC4C0E7D29108CB7C779455A3EF359BB6198AC75E16148998C16C9410DFF2DAE5F3C79DA61D371992D4A151BA91DAE8814C81EEA4F78D23871326BAFAA349C8EB57231B590F1AC13F599DF5B39DF36455F05E53CDC4D025410E8F8F8BB74854FEFE0C4F790F58434309D36C1E7F3935D4F896368C91AF95EC2DF292AE3166B83976ABD95089B05B461D4E9171CBB4747F3CD9BAB04E5A3B98095754021229B4B820EBDE63E463F2EE479FBFD83CACC61878773B129CD4B3E9AFBAEDB27C7FEDEC2F2D405B99933FE2C203D9949C567A7752AEF8A7788D2375900E70315823DACCD4F2A674196835C35EF813826B310346ABB16B0145CD70FD0A04611ED5AD0B8DDFCA6EBA6B93445038C3DD23D3D15E8899F9C889AF417E5662D538E466447E514A8897C21FE0BE2EF18948B66EB04051C0BC961FA485422A66D649DFA86D4B3DD504A89919A9928EF96FD467713DCCC1F19EE69CE3935F0416D9C5752B7DCF9272D2DB86C3EB6F4897D94DDBEF7C483FCC66232E535A8B0A5AA4BD443493FE539A32D433D9E89F7758DB5B0606A96455B39F92AA788FBBE43CEC8F1D36FEA3ADFD0353EA5532B49A7286381D985E018E6534005F605BF67AB4AAAFDCC499AC0882FCD9D90BD88053CFDADAF466E536F2FFA7F18B3DC254E42FFFC777E0339181473E2B7FC844B687ECCC0EB543A54211084B1EC06B0D9EB0A0C96B88D6585F414873C13EF7002AF2D47D5859A23D12A7D401FFD4BCF642DB96C70FDAD0CB03A6098437795BC9C7C6C804A26225EAA53F52747F01DB4E62471A21DBC1DED9C4DE2508812AB11F61F6364FCFEED445FFBA549E45E641A80FB4B58EE20677C7D6CF0526DBF4E26D9E5AFAC5429B4474DFFE709D09D766542D65E668D59C836BDFD0F78B846BC412F29DA00291871D94BB5E6557D833C8DB3D9BEB37888C3A70684ADC6B063FEC3D847C42E0CE20E05482DB165FFAC5D1F2C661B9DB6D19FB3E8909587351B25F2C225CB26BB137BC52D04AD8157F7D634F29A3623B4EB53B4EF9A78945280BCA8C5E1882FAE373EAC69EA366E2F13A9FEA75A6B7EB5CD4D9EB14F68A231BAC780F84200146CE7795282952382E2393F0C2A99DE830D3AA517DAC4AC97F2AAD3F7F8E3B49B22B078E3708C9CDD1B2A2A129656066C0030D747EDD646384611D4ECCC5B0B9DF4852AF7BFA94F6DD7584F6285CA2EA7ED3F8DECB534E6D31D7165C609FD9AD235F5AF8E4E8E58FD3D248D822C202 +pk = 34886577EE113E52F8AC7E2611ED08C1B95B85AAEB58E97CB9A56EB713404F92A7A7231F145D7F213AF533015E1D630CD0561689C91D3CB64F4B2045FAC04049EC76659A5A0D1F692437069E01C1539FF595832ACADFFFB632DEB8F1CB200D2F17 +sk = 34886577EE113E52F8AC7E2611ED08C1B95B85AAEB58E97CB9A56EB713404F92A7A7231F145D7F213AF533015E1D630CD0561689C91D3CB64F4B2045FAC04049EC76659A5A0D1F692437069E01C1539FF595832ACADFFFB632DEB8F1CB200D2F177DE1C1D3C7C9A0DE90BEB4E2632F556F57D1EA86BA1CC62E9C03000000000000000000000000000000000000000000007092347C4754EFFD516FD4495EC7DAF495E8AB806D4EFE33B0FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFB6CB4556C96DDB986F26F0DE40FBFFDDE660C14DD8309F3BFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098E55FA3277D954DA53D3B7F9382879702F93FAA637B40CD5E25172D346F8AD3808CA7ECF35763B28BE244087BEA5001346075F5B75056301EF3A0686BA034EEFB9CB855E987D15FEC371D909A3FE93C7667B9DFB4719A0C20F7A1311422C00E371691A4ACCF964D9AE05FBDFDA2F1080192F4A5E1C37AED2A842D3DDF6BD3A48000D9753EB647581424A494E5BEC00227F2E9950E38F810D9AF54F109D158C842880791257B51A548106592E22B98EE243B9B5CFD5E1831BC55D1F1FEB0000 +smlen = 1874 +sm = 363F534958109D359ACC34F77C39FD87D3ECCD7B771E2B5E6C8BE8E46FC61C80E9BE428C726B44D37E07B042658F973B54D9CFDF03137BF5B99802294C6B85917E93F07F0051E46FF86C04AD9103EDB153B9899D83CF26C3F8C35FCAD87B0A13000240C3BA81E87C9A422293FD610DF8BB6FE38789582FC7378401A50D41B59D8F2A1632353A3D6F1FE8BF6589E938EC05D00E02243102DE3CDC3833AAE5B4B6CDF9FD3A88BD1A343603C84D00C95F77D83C3D8F1169D560CBF7BB9C0C8E50594CEDC8ECFD0095AC86878FA5C341003EB0B16D887E17E12D226BA8E3C2000D15D868EC985F946F3C31B6CFE4811BA530EACD0ED061EC383C203B2481AC697B8B88BC0F72B635027E443AB1F54478440DE16E596D30A0F1252E0AF54C0F382BBF5655BEA8C6B9A2F6382D003CC7E4D4F223F8E35EC87CC543EAD52E0E1ED956CFB32E8075715C07CA4817C4B8DACE68C8B0DA459271746BE41D6102B3FA5E49AEE8D443E78AD3246D0B9BCCF6AB7CB7CF72B8A847CA16B435F0618594400037179441F3BF524231F747D920E86506E84C61D4D038D42E82D52D97ABFF896C1DB1C646807156324F7B68DB620EE435C7B8C9AC8B193B7C892565C3631E297495BD3B59293F9A9CEA5E29E23A242B81DD05C8DC9DD669424573298C85870B109C7B593BF864B56895D81386466CA5CB6071005781FB214F1EAE9672D0D16351A627A3FAAC49BE4E13D552340328323CDCB4703BBE07C2A39D75D7737D5C1BD04355B8694432DFB7CB4F1901550C7D6F41080C0F6A2CC49D63A69243D137A78260C06E7A53AAF4F4B086E0220EBC5361A6A78C9B2EC09C2EA4EC45A41065B4B2DAA866D9BABD71C8E6CB378595F068EDB258B2AD1F420B304E5924EBE273AD6D00684F75B6A31DC5290A37D0F9A848B1FC4A67DD9A4FB1F9B4C6CD45E87FAB4A09129C9AB95C44703B75B54C9EF9E825928ACA56527D79B338C5AC639D0265010F3C085D2B09AEF0E4F55D080FB5FF79F13E8E4E8DB020F4C095140D46A93F2E4811BFBC1393EC24F6B7EF31F13623DF0360B1E335FC42098CA1EFCD0306C5FECCE942F6E299AC9ED81054FE452D3F63991DA42D5680EEF749C02FCBA78DB5F4F7C734C6B4D99AF79711A0BAB723C24364AC85700242878CCA93465F286D5F7ADAD7F68F1D38CD6C6E0575A36F1E5521E420D348D947E745C2355FB5FB0F12DC6FB5E9435CF8E552C174A617151AF8D5E7D469AD5CD741E16EB88EA6D7C5806B08571697D22A525C2E30DFF608C921B955D2A990D9466829385DE0A81875BE564942AE740D15AC0AF46A876426EBBE481738BE19BE06F174D975AE8DFB52A94AF9A77E56267C0BB62169165ACE155041406CAF507146A02FB760629CC4C0E7D29108CB7C779455A3EF359BB6198AC75E16148998C16C9410DFF2DAE5F3C79DA61D371992D4A151BA91DAE8814C81EEA4F78D23871326BAFAA349C8EB57231B590F1AC13F599DF5B39DF36455F05E53CDC4D025410E8F8F8BB74854FEFE0C4F790F58434309D36C1E7F3935D4F896368C91AF95EC2DF292AE3166B83976ABD95089B05B461D4E9171CBB4747F3CD9BAB04E5A3B98095754021229B4B820EBDE63E463F2EE479FBFD83CACC61878773B129CD4B3E9AFBAEDB27C7FEDEC2F2D405B99933FE2C203D9949C567A7752AEF8A7788D2375900E70315823DACCD4F2A674196835C35EF813826B310346ABB16B0145CD70FD0A04611ED5AD0B8DDFCA6EBA6B93445038C3DD23D3D15E8899F9C889AF417E5662D538E466447E514A8897C21FE0BE2EF18948B66EB04051C0BC961FA485422A66D649DFA86D4B3DD504A89919A9928EF96FD467713DCCC1F19EE69CE3935F0416D9C5752B7DCF9272D2DB86C3EB6F4897D94DDBEF7C483FCC66232E535A8B0A5AA4BD443493FE539A32D433D9E89F7758DB5B0606A96455B39F92AA788FBBE43CEC8F1D36FEA3ADFD0353EA5532B49A7286381D985E018E6534005F605BF67AB4AAAFDCC499AC0882FCD9D90BD88053CFDADAF466E536F2FFA7F18B3DC254E42FFFC777E0339181473E2B7FC844B687ECCC0EB543A54211084B1EC06B0D9EB0A0C96B88D6585F414873C13EF7002AF2D47D5859A23D12A7D401FFD4BCF642DB96C70FDAD0CB03A6098437795BC9C7C6C804A26225EAA53F52747F01DB4E62471A21DBC1DED9C4DE2508812AB11F61F6364FCFEED445FFBA549E45E641A80FB4B58EE20677C7D6CF0526DBF4E26D9E5AFAC5429B4474DFFE709D09D766542D65E668D59C836BDFD0F78B846BC412F29DA00291871D94BB5E6557D833C8DB3D9BEB37888C3A70684ADC6B063FEC3D847C42E0CE20E05482DB165FFAC5D1F2C661B9DB6D19FB3E8909587351B25F2C225CB26BB137BC52D04AD8157F7D634F29A3623B4EB53B4EF9A78945280BCA8C5E1882FAE373EAC69EA366E2F13A9FEA75A6B7EB5CD4D9EB14F68A231BAC780F84200146CE7795282952382E2393F0C2A99DE830D3AA517DAC4AC97F2AAD3F7F8E3B49B22B078E3708C9CDD1B2A2A129656066C0030D747EDD646384611D4ECCC5B0B9DF4852AF7BFA94F6DD7584F6285CA2EA7ED3F8DECB534E6D31D7165C609FD9AD235F5AF8E4E8E58FD3D248D822C202 + +count = 50 +seed = C10427EF0B26328163F85D45E22EC5215415326F013FF31EDD58BD3E97B1A72FF07D275D4C1B517F4661B0638F75640C +mlen = 1683 +msg = 4BEAF8CC3A7C393932CD37A2CD8ED790F05E4038ADF1287E2ACDCC0BED9BDBF92CE44AAE95CAF4EB142B858E1421610EAFC47DE566182835BDACD4C836F19BD686D53C3834EFD928487A2AB3402C2E3AB3AF97AA802B05223CA6927722C3BD1FE3F8C20F93C3951F907314896CD21CB99306FD7E5B6176945C2898B10C1DF62FBB2680752CABC8980B5A0430BE39D34BB7DE9544BCCCBFABAB709C11BFFF5C958C8763D8D5830235B49EAD26C834E63C3F3F2D6BA944FD2688F6350EC99DAF4CCCC42C6BE1CB19DD46514D71CB6E887DBA80EDB580B27F1142A20EA0D497E0336D55F1FFD4BB3D4B3521F0A01C7BB09258971D1ED4A98EC052B24776623D7B9A83C818795E3989EAEBA8C9142A97AFCE855CC6AC0ABA15F0546684AB5C2F48B23BB72A88B6AF2BA9C73881103CB6FA99E3B03119EAB03BC3B9BC365EFCD7B9F49A8BAB6A34A00AA8F2C88D7BEBBA808BD97111EBB192D82AD244E18BCA732FE6F72FDE5BD533E4BCCD3F50332DAD3A4169EA85C324D165413F10888AC3B21B91DE09FCBB9B636ED00FAAA669ABF6429B78C3C04F239722F31FB0B1A20CB1A6B553908070AC13521DF66772A6036E6695CF66B9A90E2111E499BCBF5DCD19744F43DEB943445248A5E84F168E7BFEA2DC4E1D0A87FB4140EB7C72D2DFCC27923206054CEC870888A79938DACBAACF1F122B22AB5C9701D777BCF9809CEBC9B7AAC52468134FC4A92C2BAA9B8C0F6249130A50337F460A42CB5364A5E7408CAEF8D12BA6934AB645DE9832818F9DB71F5EB0B158DE6A76619E75245B56020E1664D8FAF1C1782DE4A688D4055E07D842410600E9454E28676D44357853FFA7740200C91EAFA16BCA21D0006F47FE8159A733E0E91549DF434EF316E1DF9BB97DA6A2C2E2F20A65B3C00041A903270CBB55AE2432AEE25C71CE73BC2322CCB8E5BD0E24820616A890B0851D825D79411C14948DCDF48776D72565422056FE75765E50736C82F71270BBCF229A7B7A45DC88AADF4F84238C896DAB889E16C17DB7BE551AB24873FDA82F102D0FCFC139C9FEBE9FA99819CEF0E2684DFC5C843A6D496D8A595D33C51E1FDE9A84059C7BC596D32D53E2FE046F23FEFA51D13F9C28E227F5E24429B851ADDBF578922AEB0C5A61BBB666D11D127BA45C9E6378C70D75643DE776483582E034E81FAE0A3F029C47FB192CFA018CE1F68261D77CFC9E05EF19438E47F3DE9A68C8DC09D07B1BDC6CED69592623750F72EC2FB8C5CA981DFB84B4BF0734377EE9DD8EF5DDCD96F438D30AB78F402EBFF2163D43345EE8CA119F3208E21AA3A2185DE967B475B9ABFBC86465275F9A634FC22015E94A298E9C204E9786CB1FF14A5E99F942D42AB5DF51AD09654083DF0259AA1C26A760CCFDF4A276600C5FD3A54F210B20731941EB48A79435F1F86C45F8181D9758A1835721B87D36C725878375FEBCB8D48ED2CE8892DB50965753A98F4E7110281DB40ED64DD8EB51AB9CE41042589152D8CD5876FF30536F8955172A7A8F5C3F5FFD22C9954903136F781F0574F45F909BDF1657FC1CDCB9C4689F41E462C8D39108B10D78B6892C8775FDEB139258F8130BD1D2A1C72B5026506409F9862AA8729B35C652074494FEB84A553CEFBEED19D6EE94758E800F5FCBCAEC19B6A00F33EB237AAA6FC0B3A08C1D8829C180BF95E7D05F919A929933B7A032CD20ACE82AA5A45E5B2FB09812F36974B5EDA1B387FEB13BD49AC374F821341282C8FE2FB0CC5C075356833FF8CC6B648729A4298ECD73BD0EC73957077AC65722D0BE23C1536B8DB7B0506DAE47C0070564E7D7F9444F47B22C679EB8ACA4826F974A42043863E498E5301EA162C4E96684ACC5CA26CCD083541BC4C1D2FD690E51F07FB08337450A204B0F4F2C17785E037424FD6E78746764584D5F19255496DF1E524BFF0AAC31BDE9254429565278A39ECE4627C023EDF18BC21BB523D44EFC259742DEE9FF7159D5F700D957CCBB505A88C2037629402C2A322D17647E430777B184FF7B4E8D6B94724ABC36A5CCFAC08E2479E8310BCB7A617A25FAC6EFD10D0A07248F7D4597F14309B8064FE3BC4A4479F905E832210D49363D1E5D58176DEC9ABCC0C5132FD6ECCEAD2B05B56C96ECBBEB0B803E43DB2F982AD9EFE1E2A49649ED8E42707970C93615D54A3E673559B996E48A3B73143BA0884E918888156CA78F793DFF990FD721DE0C0B7916A5CED736E31292C5AF062D7CCD83FE653294FAC8C50CF6BA37B37D5A9BFD1E3B92D1825C1BE0795F9B257CDAB91CE99C0C51BDFCD6C0AB5A3BC6E30F884ECB4F1F61A3259CD279205B2C21CDDB196360061758E67B1C3724F5CB6311EB4FB92E6C0D71E6D1EA45 +pk = F53FECDB1474FCDEFF1CB7C350866CACD773A47635265192C9F27764B9E8EB9BD143AB543BB2F58F01FF44413BE4C512E6A557189CE005F96DF816D8709F05BE871D65A86C6CE7D938AAE53D694869E57BEDC2B6421A300E905C98C0D883143F04 +sk = F53FECDB1474FCDEFF1CB7C350866CACD773A47635265192C9F27764B9E8EB9BD143AB543BB2F58F01FF44413BE4C512E6A557189CE005F96DF816D8709F05BE871D65A86C6CE7D938AAE53D694869E57BEDC2B6421A300E905C98C0D883143F049B9DAD540C38DA70C2EDB5A5417AD89CEDC6CA349C5325CBA80700000000000000000000000000000000000000000000DEC734F91C9E1068FD64D3A7549D88BAAC450AAE7EAC1493FBF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7D57147606396DC9CED6F61637F874C5C4FD22A71CA6A3C70F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001D86B2BF88880127F1AFF1061CEFFF2033854B4847A927060585A045ADBA33A36D2D80F05ECFA987CFF50A5A73348A003AC52BD4FF75894D49AC021623BC7843E38973CDBDD100527B37736319EF039F74AB2D389BE10FCFAAFBC93928892200B852F3AE45E8D82CDAB75BE03677D4DDBA80835C5DE880D88260499F0487D250DABB4848B421299BC84417B17EACEC00E3A92746035C28DDCBCBE1427285DDF4D252EB89316AD6C797532040D46D7CC0E9D6731C2F9E3C5ECAF4940E0790F500 +smlen = 1907 +sm = A7E57A41BFA1C7EC585C49835FA217244C38D32AC81922A5B69996C73E9CDBA200DB097ECE7C3314B194A44567C18A3EB16E0102A4248AB574847A045ECA2357ABC4232E118D130D0934F760E0485D915D3AFEE5FC40F27843F62B227F54BE190001196F0D833B58273F33DE989FEDAD9E0108C20E93092E08440396ACF1969F5771AA138AB2BA91B2EC51197B9F3926E6436602CC0938D95921EF83538B3447B36DA738B68217057D0DA22200CEFCF5540DF789DB57A9E0EA23AD119AC2C6F8A64D3A177E00D22B864A436D9E63CC56329E06EBAA8DA86EEE3B7A9F1700021D4BEAF8CC3A7C393932CD37A2CD8ED790F05E4038ADF1287E2ACDCC0BED9BDBF92CE44AAE95CAF4EB142B858E1421610EAFC47DE566182835BDACD4C836F19BD686D53C3834EFD928487A2AB3402C2E3AB3AF97AA802B05223CA6927722C3BD1FE3F8C20F93C3951F907314896CD21CB99306FD7E5B6176945C2898B10C1DF62FBB2680752CABC8980B5A0430BE39D34BB7DE9544BCCCBFABAB709C11BFFF5C958C8763D8D5830235B49EAD26C834E63C3F3F2D6BA944FD2688F6350EC99DAF4CCCC42C6BE1CB19DD46514D71CB6E887DBA80EDB580B27F1142A20EA0D497E0336D55F1FFD4BB3D4B3521F0A01C7BB09258971D1ED4A98EC052B24776623D7B9A83C818795E3989EAEBA8C9142A97AFCE855CC6AC0ABA15F0546684AB5C2F48B23BB72A88B6AF2BA9C73881103CB6FA99E3B03119EAB03BC3B9BC365EFCD7B9F49A8BAB6A34A00AA8F2C88D7BEBBA808BD97111EBB192D82AD244E18BCA732FE6F72FDE5BD533E4BCCD3F50332DAD3A4169EA85C324D165413F10888AC3B21B91DE09FCBB9B636ED00FAAA669ABF6429B78C3C04F239722F31FB0B1A20CB1A6B553908070AC13521DF66772A6036E6695CF66B9A90E2111E499BCBF5DCD19744F43DEB943445248A5E84F168E7BFEA2DC4E1D0A87FB4140EB7C72D2DFCC27923206054CEC870888A79938DACBAACF1F122B22AB5C9701D777BCF9809CEBC9B7AAC52468134FC4A92C2BAA9B8C0F6249130A50337F460A42CB5364A5E7408CAEF8D12BA6934AB645DE9832818F9DB71F5EB0B158DE6A76619E75245B56020E1664D8FAF1C1782DE4A688D4055E07D842410600E9454E28676D44357853FFA7740200C91EAFA16BCA21D0006F47FE8159A733E0E91549DF434EF316E1DF9BB97DA6A2C2E2F20A65B3C00041A903270CBB55AE2432AEE25C71CE73BC2322CCB8E5BD0E24820616A890B0851D825D79411C14948DCDF48776D72565422056FE75765E50736C82F71270BBCF229A7B7A45DC88AADF4F84238C896DAB889E16C17DB7BE551AB24873FDA82F102D0FCFC139C9FEBE9FA99819CEF0E2684DFC5C843A6D496D8A595D33C51E1FDE9A84059C7BC596D32D53E2FE046F23FEFA51D13F9C28E227F5E24429B851ADDBF578922AEB0C5A61BBB666D11D127BA45C9E6378C70D75643DE776483582E034E81FAE0A3F029C47FB192CFA018CE1F68261D77CFC9E05EF19438E47F3DE9A68C8DC09D07B1BDC6CED69592623750F72EC2FB8C5CA981DFB84B4BF0734377EE9DD8EF5DDCD96F438D30AB78F402EBFF2163D43345EE8CA119F3208E21AA3A2185DE967B475B9ABFBC86465275F9A634FC22015E94A298E9C204E9786CB1FF14A5E99F942D42AB5DF51AD09654083DF0259AA1C26A760CCFDF4A276600C5FD3A54F210B20731941EB48A79435F1F86C45F8181D9758A1835721B87D36C725878375FEBCB8D48ED2CE8892DB50965753A98F4E7110281DB40ED64DD8EB51AB9CE41042589152D8CD5876FF30536F8955172A7A8F5C3F5FFD22C9954903136F781F0574F45F909BDF1657FC1CDCB9C4689F41E462C8D39108B10D78B6892C8775FDEB139258F8130BD1D2A1C72B5026506409F9862AA8729B35C652074494FEB84A553CEFBEED19D6EE94758E800F5FCBCAEC19B6A00F33EB237AAA6FC0B3A08C1D8829C180BF95E7D05F919A929933B7A032CD20ACE82AA5A45E5B2FB09812F36974B5EDA1B387FEB13BD49AC374F821341282C8FE2FB0CC5C075356833FF8CC6B648729A4298ECD73BD0EC73957077AC65722D0BE23C1536B8DB7B0506DAE47C0070564E7D7F9444F47B22C679EB8ACA4826F974A42043863E498E5301EA162C4E96684ACC5CA26CCD083541BC4C1D2FD690E51F07FB08337450A204B0F4F2C17785E037424FD6E78746764584D5F19255496DF1E524BFF0AAC31BDE9254429565278A39ECE4627C023EDF18BC21BB523D44EFC259742DEE9FF7159D5F700D957CCBB505A88C2037629402C2A322D17647E430777B184FF7B4E8D6B94724ABC36A5CCFAC08E2479E8310BCB7A617A25FAC6EFD10D0A07248F7D4597F14309B8064FE3BC4A4479F905E832210D49363D1E5D58176DEC9ABCC0C5132FD6ECCEAD2B05B56C96ECBBEB0B803E43DB2F982AD9EFE1E2A49649ED8E42707970C93615D54A3E673559B996E48A3B73143BA0884E918888156CA78F793DFF990FD721DE0C0B7916A5CED736E31292C5AF062D7CCD83FE653294FAC8C50CF6BA37B37D5A9BFD1E3B92D1825C1BE0795F9B257CDAB91CE99C0C51BDFCD6C0AB5A3BC6E30F884ECB4F1F61A3259CD279205B2C21CDDB196360061758E67B1C3724F5CB6311EB4FB92E6C0D71E6D1EA45 + +count = 51 +seed = 4B6B73E042CE76DBE39535E45D3BB2F3B9F8B2BDA170E76CC88666844703E32B2367460A0F6A0A2E3F4E7A6CD32BE998 +mlen = 1716 +msg = 0BF9A7C0F63CDCF3F850ED7C5DB6191EEEFE29E498A19F9D89BE4698821ABD72EDC34317B4F8EC2736DC83C24AC195BD55AFF00E797A83DFFADC7970FE53304F16F5DD92E6EC362B9E283E41EBF121FB2FA2A3F60124EF3EBF836AE51FDD55CA9F59B085DDD660724C072B86041B50A3A446CDB20A45BA65380ADF007E005DF2D9AA16A9D22B11DCF6F0B1964F04F45441A923691A15D80DC85003B9AE281F2B5983DD1A04D80A4D9C4372D9820BBFAE3AF7735E7C71E9F085C0A6E4BC107D9E4BA222B38FB236B2CC3A19DD6067BEAC460383FF2BCC771A7F1AAF092FC72C292FC1D5C6FC6B9715F1E1272EB22F8E0B33A2830E31BD6C531677902F6A95CABC3E9C1AE36F77037A785FEA355137A581FC14E6BD5F1F7AD1A5DD19DEDD448B47B558C22DD0FCBF296A812A726E7D1B57F4688D3F577104CFB15FC63C27F7B6051C7AED7D645186FCA63AD9C2D68BFF442466EFF76BCF0E398D2BF54C2CA4CC614839E9BCA48AB2CC53865803710A98D313AFF1DDD06A65680EB83C640052DB807EB2F38ED0CC211128044D331FEC3E6B0B2F3B675C631FDADE62C16D1719278413EA3F8E54BA34EDE7E73F3D94802D2F9CB9794D257C46679A3F00015945903190B97071F8FB55F8696253AA3F39B3FAD344FB88224F5313B43889B768171895F7AABEFF25E21E525EA01A996C764A3ACF12BFFED08F3F751F5CC094B50B325F8B62C7A5B3256964D48543690538E634E5730354358534B65EDDD44A526BB4B15E2042B6210F503EEE06D00D615CCAD10D73CDCBF5264B526674D85C0ED31BA5EE584F21FE6D13F883ACE4B094768865E43099E54671240E8E2AF8A7D7D22335B3974CE860E7238A7C1CA8A009EB51C8636F0659189AC8EF01C871E9008957CECE0A367B63BD2852BDE8690BD74C6D956435D0AB82F94A90CD00FC840DFC7036B84D51F1FF5076CA0974DB6CF25AF42EF7DC8C30C2B04CEB2510E86FFC510BF4C931639478FD1520AD571FA17958CCF8E37F5F6360030300EDE3A33871E9582808BDA2233996C5005FD0C23D99261F570AD9027767F6FC96D18BA98E8DDFC2B79AC12CDA5F2367B4BB6B99A3E07B59882E49A92AECE85339BBB18AB9644D20A3B2A795240492CE4EAF09D9EF728FB82B1DE7B64B5D391251FFB0699335CED8C7CE642FF1A79F04C3EA0DC37EA101188361AFAD236EB218CFBD1D0EBD784CE27DCBA0266DDEB87B59B66A4F75BB44665643FA358DD3D0B69B49F45A752B5C410E2299A62BE4B57B32B0924A069A8E8C15D754CC34DEBB0D967E70693A6FFA58CF7099C2C2458B437C7B205CC7E815F6CB494080F9EAF3017E5FF918558DDE415FF72E954EBC2ED4C20C8ECE38CC916060D22E582D54F74C6C181C2601400110A683F4A365E45FF1387BCE4E152A740136BB762B03A99FB68F6AB42620B2E3C00FA8D150944230A6330409B27E4AAD1693E2C3DD12216C4E2DDBC5E9CBA68B8B5417A7B2EDAE7EB67D25F4EDECBB087F93DC9C927C33076B1C71A2B83B33870D602562ED378805A690DD2A427D86C2C46BA4741F3DEFEB91A05EACE975C836E52868CFFE52CA92F97DE94768161A3E953BAB6A28016782909EC53C02F35184AA9CCBD5B793B525204B72DEB63E104376893B9452C3F2C492F423CBEF1EC87C85788CF3073FFBBCD67FF79BD038672943AE4BC68DA131DBA8D7B41C83B4E9CFB6931987B270C74919BBD40612F823114E4BB148671F1AA62BD2BDFCC8B0B24010EC112E883AEC9746D0F5DE467ADDAF51F8C070A359108B1F91643071438F098233AD9A94D0FAA665A39291A98D14A861905ECDE4755D00E690429C57580DCB6D51BB6186CE72EBB1FA8413892CAFB8713E89775013E546FDA30AEB8AF9F7155C08B25810C80CCAA5E700C124CFF59FA32E0293ADADBCC7B1A99F67E66B28DA614C5A4CCD706AFD05388C65EBCE07A543D3DC1E5A5D1F307F675728D4C629A04E9E455B4DA35236C677F26EDC622C1FBF29568D509EA0690AF4CB5DBB4E418B6162888E43B458774A31324BFD5EE8D2152E4AD43A3007D7D4AF5FDA172C2779837AD3A09E135DE953CE966727A7183BF77ADFC76430666B526692991D3C9DB5BB377552A7801C548AA63F6931D3EE91B875CDBCBB7441A4FF81F86762332D7192FBC2F7B69A58DB6CCD3558047F1940A1CACD6FA28A000B9795A2860394BF05F0120E6D85F96B1FE9DE14E3ED66A31D747924B6FF2620778E0714AEB34B79A5D935A0306E55C36506A292C5DC568403551907E49A43A6263D2915108916F1E27CF3529D1B7BD1544AF83A7CBE58547F192A93CE5C5BC6D652405FFCB95345F522B2D34E8EE0960BB85537A46121BD9A408D283A125EAA745BBAB04E2231C19AE95E13901C69E5C9C4D70B104478F4A70D64F81269A8 +pk = 1E170339BA8462FD5BB229C4686A0505BB32B80D033008EF52A909C0CFF676BA600B775DDE58E87948CD202ECAB7892131F68E3C129C2729D32B5888F987BC855FFA98C9B1847FDDAD92B264CADCE85A2209F393F981D7FBF038A782F885CC1E15 +sk = 1E170339BA8462FD5BB229C4686A0505BB32B80D033008EF52A909C0CFF676BA600B775DDE58E87948CD202ECAB7892131F68E3C129C2729D32B5888F987BC855FFA98C9B1847FDDAD92B264CADCE85A2209F393F981D7FBF038A782F885CC1E157BDC0F0B5EA329E9877183204B03241ABACC46DDCDB01864050E00000000000000000000000000000000000000000000C2F4889E0616D1E6061D11121B71DB22F68FD783F17D291E20E7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA71ADB0FACFEC0349DBFF8E11A37DDB0FBEEAF281FBA4668BFEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035463D1BF400B952174BA87E3083502354E0C47D2B61305B514B651D456F2736867AFD1F40AA1E64AD9073B5DB493600EE66357DAD4AEC0F270E8BBD271E22B8D36589974475218DE5F05C434B65646E7B3B2F4C9F6AB9D5ED0CB37D486EED0021279D58F98CE5CE84D0E1D5A804DE157E94130699CF94944D2C2D3B79ACBCE1108EB32BF631E677CA7C28572944A400D7C7840D07CF4DCF28906E5995965A51026BCD10C828D244E4BBD5B42AAFABBC0AFFC00D5BED9031A5E2BB23158FC100 +smlen = 1940 +sm = 214171747CCF19263631033C3D9EC02B214A620509ED3586ADEEC8E74468F812FB2E17191B084409BD1E78E3C6A798150888ACC3EB7D15FAF1EE4BBB00D93A899E1289852AD95F46AE393046BD0F032B61A2059D20E4AF692987B6021B9050300200D5588DB08C3E6BD4239756B38B92733BE7944AFE2ABBC84500E9C031CC9D3969DAD6354A0E31F5315CD3DA0783DAEC3EC1005C343DE21C312D1222E28D4971B7C45535F740B27A8F7E2B00BF69E5962B3E4D92463852E3FFC5F5B466DB614B4C94A8AC0071473F5907B76A07A7936F326A0CEC32D640B5086618AD0006020BF9A7C0F63CDCF3F850ED7C5DB6191EEEFE29E498A19F9D89BE4698821ABD72EDC34317B4F8EC2736DC83C24AC195BD55AFF00E797A83DFFADC7970FE53304F16F5DD92E6EC362B9E283E41EBF121FB2FA2A3F60124EF3EBF836AE51FDD55CA9F59B085DDD660724C072B86041B50A3A446CDB20A45BA65380ADF007E005DF2D9AA16A9D22B11DCF6F0B1964F04F45441A923691A15D80DC85003B9AE281F2B5983DD1A04D80A4D9C4372D9820BBFAE3AF7735E7C71E9F085C0A6E4BC107D9E4BA222B38FB236B2CC3A19DD6067BEAC460383FF2BCC771A7F1AAF092FC72C292FC1D5C6FC6B9715F1E1272EB22F8E0B33A2830E31BD6C531677902F6A95CABC3E9C1AE36F77037A785FEA355137A581FC14E6BD5F1F7AD1A5DD19DEDD448B47B558C22DD0FCBF296A812A726E7D1B57F4688D3F577104CFB15FC63C27F7B6051C7AED7D645186FCA63AD9C2D68BFF442466EFF76BCF0E398D2BF54C2CA4CC614839E9BCA48AB2CC53865803710A98D313AFF1DDD06A65680EB83C640052DB807EB2F38ED0CC211128044D331FEC3E6B0B2F3B675C631FDADE62C16D1719278413EA3F8E54BA34EDE7E73F3D94802D2F9CB9794D257C46679A3F00015945903190B97071F8FB55F8696253AA3F39B3FAD344FB88224F5313B43889B768171895F7AABEFF25E21E525EA01A996C764A3ACF12BFFED08F3F751F5CC094B50B325F8B62C7A5B3256964D48543690538E634E5730354358534B65EDDD44A526BB4B15E2042B6210F503EEE06D00D615CCAD10D73CDCBF5264B526674D85C0ED31BA5EE584F21FE6D13F883ACE4B094768865E43099E54671240E8E2AF8A7D7D22335B3974CE860E7238A7C1CA8A009EB51C8636F0659189AC8EF01C871E9008957CECE0A367B63BD2852BDE8690BD74C6D956435D0AB82F94A90CD00FC840DFC7036B84D51F1FF5076CA0974DB6CF25AF42EF7DC8C30C2B04CEB2510E86FFC510BF4C931639478FD1520AD571FA17958CCF8E37F5F6360030300EDE3A33871E9582808BDA2233996C5005FD0C23D99261F570AD9027767F6FC96D18BA98E8DDFC2B79AC12CDA5F2367B4BB6B99A3E07B59882E49A92AECE85339BBB18AB9644D20A3B2A795240492CE4EAF09D9EF728FB82B1DE7B64B5D391251FFB0699335CED8C7CE642FF1A79F04C3EA0DC37EA101188361AFAD236EB218CFBD1D0EBD784CE27DCBA0266DDEB87B59B66A4F75BB44665643FA358DD3D0B69B49F45A752B5C410E2299A62BE4B57B32B0924A069A8E8C15D754CC34DEBB0D967E70693A6FFA58CF7099C2C2458B437C7B205CC7E815F6CB494080F9EAF3017E5FF918558DDE415FF72E954EBC2ED4C20C8ECE38CC916060D22E582D54F74C6C181C2601400110A683F4A365E45FF1387BCE4E152A740136BB762B03A99FB68F6AB42620B2E3C00FA8D150944230A6330409B27E4AAD1693E2C3DD12216C4E2DDBC5E9CBA68B8B5417A7B2EDAE7EB67D25F4EDECBB087F93DC9C927C33076B1C71A2B83B33870D602562ED378805A690DD2A427D86C2C46BA4741F3DEFEB91A05EACE975C836E52868CFFE52CA92F97DE94768161A3E953BAB6A28016782909EC53C02F35184AA9CCBD5B793B525204B72DEB63E104376893B9452C3F2C492F423CBEF1EC87C85788CF3073FFBBCD67FF79BD038672943AE4BC68DA131DBA8D7B41C83B4E9CFB6931987B270C74919BBD40612F823114E4BB148671F1AA62BD2BDFCC8B0B24010EC112E883AEC9746D0F5DE467ADDAF51F8C070A359108B1F91643071438F098233AD9A94D0FAA665A39291A98D14A861905ECDE4755D00E690429C57580DCB6D51BB6186CE72EBB1FA8413892CAFB8713E89775013E546FDA30AEB8AF9F7155C08B25810C80CCAA5E700C124CFF59FA32E0293ADADBCC7B1A99F67E66B28DA614C5A4CCD706AFD05388C65EBCE07A543D3DC1E5A5D1F307F675728D4C629A04E9E455B4DA35236C677F26EDC622C1FBF29568D509EA0690AF4CB5DBB4E418B6162888E43B458774A31324BFD5EE8D2152E4AD43A3007D7D4AF5FDA172C2779837AD3A09E135DE953CE966727A7183BF77ADFC76430666B526692991D3C9DB5BB377552A7801C548AA63F6931D3EE91B875CDBCBB7441A4FF81F86762332D7192FBC2F7B69A58DB6CCD3558047F1940A1CACD6FA28A000B9795A2860394BF05F0120E6D85F96B1FE9DE14E3ED66A31D747924B6FF2620778E0714AEB34B79A5D935A0306E55C36506A292C5DC568403551907E49A43A6263D2915108916F1E27CF3529D1B7BD1544AF83A7CBE58547F192A93CE5C5BC6D652405FFCB95345F522B2D34E8EE0960BB85537A46121BD9A408D283A125EAA745BBAB04E2231C19AE95E13901C69E5C9C4D70B104478F4A70D64F81269A8 + +count = 52 +seed = 3D4607399F6FCBE074FD2BEAB1A7571239D6BE6308617866B65B892EE65399E14DC7FA612CDBC5F7E23116FA86C3133D +mlen = 1749 +msg = DBFC582AE98D8FD326FAE96A1849EFE729A1173339D90C48C3A2B867135F1DFF5B497D05FD55130694B5F9C62D136647D767AE682A0F05C670CEECC03475FFD39E0BD4E45B720D9D7E8DD04E69C969627682AD83F48609F6E66D0BE99064988E4654E3913B7CAF1475622E211BC247B98E5BABA1B804E2BF651713197D8A610CC111BA5FD98A053408AD155DCB756D28A283BF3B20E6F3785DD5F105F8D7D9F2956064860B097C675630EDEE1F17E2EB0B26B6C20E260F9A5915D63F1BE2C74FB0B37013244481A2D0C581C4EE12516E0FD4701E9835C8526A490CB39E99FAE07C40236808F9605A63A5106C19517C3711CA4B9E8EDDC77B242575D904DBE64223CF14A8E39FEEDA9D6C5F9CD0D0719A7EB5EFA71453636F78CAB8262636FF1E136C787E38A43FAF02699C1F260EC45B068EDBEEBBB8A0E08CE282BF47D27A33216856F0C59E743DEB13397656FF17FC4B3C694B189C35E516BE719CDA6542260D1301DF93A5D93EE118F7CB0AC94D0364C9EA66718A4BC7F3D7ACFFA60AFB7100F7D97E98DFFE167D1D8E46C912D41EA057362C13B078CB1D9C443C1A57AC18C4566F5F5388F47A40CA49CDAAF34BD4C9A597FFBF7AB20D7CE88DD76A639E09ADA323C588B08140E9350268C1FF76079093A05CCF5E1613A70E6E37CD257875049A767332E5F7420F319F9AC78F97C0C4FA40B1EEF8C8B48045C78F73584590FE41F9F274DEA838DE75DADE66D04E9D9308CB0A9948320D28D9CA8F1F51E39FF3DE20FD5A2A267D127C317ACD51FB779E597A8DC7359D920548B8BCAD761C6B8012304E12628A2652D12A8161E538C20D582BF567E9C2B46B4CFE2D2DA31120C6DF50DF45C80513AA9EEE9F2613A221AA1D23F861C7F26AAC7813B7ED7278EB420A5C44F2A5879A2F1F9F11E14602762E3389B152C014EA9DDC9DDDE9ED1D6F74E7526F690EF37E71D448342C012E032C00E480A699ADE617434C12DA0E69139D0D9036743B9E2B9134B5086FCB96B193330ACE8E4F77148AD0F532E72E1792795080B54D7172FB9AF1972D00AE24D0B3D86528675B3BC8C7B80598D855B95A77667AD0F671F00039C08CC99F5644BB006BA9356B9C02BC935212C43490C741B0845CD7B4247592374AEAA1B589E670AC62777293870963B5132DCC27088F5DA5B831FA570766FA81C2A07B88BBD45B81992EDFD2A7FE934219B1F648DD8A414FA03EAFCD39E72BDF7D4F6B9C1F31A0A67DF03F6709F2BE0E7D1B1690C92CE7B8C6B1054270D796B16D6E445D24CB11229CB0F92DD81190A37838951AD28BE2AEEE6C5F63DA60A911AE0A24B1D05EF2F814FB30AAE8CA3BD9F01D4FABE5B279142AF948B0E6BBCCF7560107C161C816A0D8E61DD908445079BAAFB78C14F68B8B2BB241FB03C237A4CB250911142D0B460ACC75E6B0F58BF28546A4779EA7342238826F636A510CC9CFFEE8BB0292A58A07694C05672B560B26158A8566D01D0EEA0773E81F3F84376B29CE375FC56A0689A7CA5CE94B91814B62CBB61EA2EFCA0CE6712A941D612B0F700C56B46D464C2AAAB3F64A89CAA8561A1DAB2869D79DA1720274D031946C4C7715FB9C243DC95CCA7AECFF55EBA4044467EB922E93F57E3E39B93876A03936DFFDD2AF48D055C6C188F2F229812EC94F3FBDF7D7DB62E4274DC91718710EEC2CE034AEF266207C5CCBA21552D6FB8DDBEE8E931067010594A9E0CB37250F67281C0A369965367424D454CDD05D3C8F35A15F76B4C8C3FEE42F4C9CAD68849837DED3BE58730B94AE3A5F9146F90E03B4C0836381B3F9CCB5DE6BD2455D241BE9132EB6D4937FF27663F4CADAA9CDA193919F4CB0D0F727F6C7B26E831C3AC8DECC234D79D1B3BD28305E3012A3733AD718FDAB7DD1A6400BC47F47D20F627D2449DBFF10E37A62299E22E408A28A806D403CBEE19AFF6FA9B1814B35B9573ADC86F829A08893CFAE4A0212293447D3086E21BBA28049F3ED383519917B169E8A1B7DD64CEFE0DA643A97950A205CBFF6BD9334180556E84199F0B60738715CD69AAD7C882430578F6FBA4579D908F863CA54D0B9862EEA6ABED31301D183CF465B1A256CBD597A629307A8A890F11C23DBFF895B932E9CD2F5F06A4183D6F2D61117126FCD2CE2B86BB44A9A5B402E3EEDBE4ED1DF11716E91A2302CB72D8F0DAE132E16311C80DCA041694AF1EF63F659959FCAA133D9E5668F94D0489311AF3BAD379DE17793BB3EE8A284529A72CDEC474B3A82D92C6CB21C63017F262E0D7DD47AA5C58F5E23F8A37F00D5438717F05BB974F18A5D3E1CA054EA053C30B34FBFAEE88BC0195F061AC32F5B71B2A8A3ED4B8BC4EDAB40A6396C052DCE72E10768526C00610E96DF38AA70938CF844CF445D8E2BF73C4F32A742812D8C1DB53AFC6B6C0A4BC67C3CF7579702312D6C89BF14E9585D2C624D07FEB4B5B57F8E4C5CFDA69A5E922CC1E9 +pk = 36F79EA00035C13ADF1B9C61FD411125630510F1AAD74C4951EE8ABC7E49F5331BC18E502F5FF4895DDC4EB1A139E4216B64F4CCA988E1BFE6E09BA2EBC24DB53967824D5A5E1593DC35434B7B2CAD3755BBA8031F2C522506D8EE8C714A231A04 +sk = 36F79EA00035C13ADF1B9C61FD411125630510F1AAD74C4951EE8ABC7E49F5331BC18E502F5FF4895DDC4EB1A139E4216B64F4CCA988E1BFE6E09BA2EBC24DB53967824D5A5E1593DC35434B7B2CAD3755BBA8031F2C522506D8EE8C714A231A04E73807F26E4E90502097219D6C3715D04C1B6AB5B8161774DC0600000000000000000000000000000000000000000000FE0374BC8F65A80FF8492297EF95467696CA7BE577D4F0235DF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05345C1D772296D7B4EEF5CB84F3A4C85F2F240EFF2862A583F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C3DDA1EB695BD01FEFD205C4274F0478CD06B21F6BC11A98896A0EF43017D36F7FA8B81D49FF83451BC9FDD06CE26E00B82118AFDFEAC7A70F607E0CCB1E0DD782C13E81B039819B2C871A7291DF6976A073BE08CF6EB1020C12189F3A1B1200675B0FEF4D12E25C20C0FF298612D298C8FA2C4C339EB86604568EF62583B684E71D6991EAC6AC046C67257E82295A00C7D65D31DD13296CC7DD78373D51E5D7F5F91432900727F4F9DDF3E773C0986E4AF1F08C736E9F5E10ABE620F6E2CB00 +smlen = 1973 +sm = 38FBCDC3A71DD23CD2AAB50CB39241BFE0E6E72A94384672993E775FE0639A215081741E690DB35945D034FFF3E14D0AE67F7518C855DFE4D0AFEC481C5430F6AC7E442CBF3FC7630E227226C0DBF25473C1903669F0365559C94A357CE8B33E010233790C2D41E4AC954B5BDAC25E357AFB1FC36F77A10A2D380131156FA726D0BC54B52073624E8AEDEE29C3C16F8F09E59701B06C08D71D164AEAD7845DD2027AAD53E3A067B5120C25B801248058E459ED14C55B51FAD5B24CBCAB37577A492CAE4A8700ED5F531A53A846A5848F6501AA17A6D0DCE8AAD21D309B001519DBFC582AE98D8FD326FAE96A1849EFE729A1173339D90C48C3A2B867135F1DFF5B497D05FD55130694B5F9C62D136647D767AE682A0F05C670CEECC03475FFD39E0BD4E45B720D9D7E8DD04E69C969627682AD83F48609F6E66D0BE99064988E4654E3913B7CAF1475622E211BC247B98E5BABA1B804E2BF651713197D8A610CC111BA5FD98A053408AD155DCB756D28A283BF3B20E6F3785DD5F105F8D7D9F2956064860B097C675630EDEE1F17E2EB0B26B6C20E260F9A5915D63F1BE2C74FB0B37013244481A2D0C581C4EE12516E0FD4701E9835C8526A490CB39E99FAE07C40236808F9605A63A5106C19517C3711CA4B9E8EDDC77B242575D904DBE64223CF14A8E39FEEDA9D6C5F9CD0D0719A7EB5EFA71453636F78CAB8262636FF1E136C787E38A43FAF02699C1F260EC45B068EDBEEBBB8A0E08CE282BF47D27A33216856F0C59E743DEB13397656FF17FC4B3C694B189C35E516BE719CDA6542260D1301DF93A5D93EE118F7CB0AC94D0364C9EA66718A4BC7F3D7ACFFA60AFB7100F7D97E98DFFE167D1D8E46C912D41EA057362C13B078CB1D9C443C1A57AC18C4566F5F5388F47A40CA49CDAAF34BD4C9A597FFBF7AB20D7CE88DD76A639E09ADA323C588B08140E9350268C1FF76079093A05CCF5E1613A70E6E37CD257875049A767332E5F7420F319F9AC78F97C0C4FA40B1EEF8C8B48045C78F73584590FE41F9F274DEA838DE75DADE66D04E9D9308CB0A9948320D28D9CA8F1F51E39FF3DE20FD5A2A267D127C317ACD51FB779E597A8DC7359D920548B8BCAD761C6B8012304E12628A2652D12A8161E538C20D582BF567E9C2B46B4CFE2D2DA31120C6DF50DF45C80513AA9EEE9F2613A221AA1D23F861C7F26AAC7813B7ED7278EB420A5C44F2A5879A2F1F9F11E14602762E3389B152C014EA9DDC9DDDE9ED1D6F74E7526F690EF37E71D448342C012E032C00E480A699ADE617434C12DA0E69139D0D9036743B9E2B9134B5086FCB96B193330ACE8E4F77148AD0F532E72E1792795080B54D7172FB9AF1972D00AE24D0B3D86528675B3BC8C7B80598D855B95A77667AD0F671F00039C08CC99F5644BB006BA9356B9C02BC935212C43490C741B0845CD7B4247592374AEAA1B589E670AC62777293870963B5132DCC27088F5DA5B831FA570766FA81C2A07B88BBD45B81992EDFD2A7FE934219B1F648DD8A414FA03EAFCD39E72BDF7D4F6B9C1F31A0A67DF03F6709F2BE0E7D1B1690C92CE7B8C6B1054270D796B16D6E445D24CB11229CB0F92DD81190A37838951AD28BE2AEEE6C5F63DA60A911AE0A24B1D05EF2F814FB30AAE8CA3BD9F01D4FABE5B279142AF948B0E6BBCCF7560107C161C816A0D8E61DD908445079BAAFB78C14F68B8B2BB241FB03C237A4CB250911142D0B460ACC75E6B0F58BF28546A4779EA7342238826F636A510CC9CFFEE8BB0292A58A07694C05672B560B26158A8566D01D0EEA0773E81F3F84376B29CE375FC56A0689A7CA5CE94B91814B62CBB61EA2EFCA0CE6712A941D612B0F700C56B46D464C2AAAB3F64A89CAA8561A1DAB2869D79DA1720274D031946C4C7715FB9C243DC95CCA7AECFF55EBA4044467EB922E93F57E3E39B93876A03936DFFDD2AF48D055C6C188F2F229812EC94F3FBDF7D7DB62E4274DC91718710EEC2CE034AEF266207C5CCBA21552D6FB8DDBEE8E931067010594A9E0CB37250F67281C0A369965367424D454CDD05D3C8F35A15F76B4C8C3FEE42F4C9CAD68849837DED3BE58730B94AE3A5F9146F90E03B4C0836381B3F9CCB5DE6BD2455D241BE9132EB6D4937FF27663F4CADAA9CDA193919F4CB0D0F727F6C7B26E831C3AC8DECC234D79D1B3BD28305E3012A3733AD718FDAB7DD1A6400BC47F47D20F627D2449DBFF10E37A62299E22E408A28A806D403CBEE19AFF6FA9B1814B35B9573ADC86F829A08893CFAE4A0212293447D3086E21BBA28049F3ED383519917B169E8A1B7DD64CEFE0DA643A97950A205CBFF6BD9334180556E84199F0B60738715CD69AAD7C882430578F6FBA4579D908F863CA54D0B9862EEA6ABED31301D183CF465B1A256CBD597A629307A8A890F11C23DBFF895B932E9CD2F5F06A4183D6F2D61117126FCD2CE2B86BB44A9A5B402E3EEDBE4ED1DF11716E91A2302CB72D8F0DAE132E16311C80DCA041694AF1EF63F659959FCAA133D9E5668F94D0489311AF3BAD379DE17793BB3EE8A284529A72CDEC474B3A82D92C6CB21C63017F262E0D7DD47AA5C58F5E23F8A37F00D5438717F05BB974F18A5D3E1CA054EA053C30B34FBFAEE88BC0195F061AC32F5B71B2A8A3ED4B8BC4EDAB40A6396C052DCE72E10768526C00610E96DF38AA70938CF844CF445D8E2BF73C4F32A742812D8C1DB53AFC6B6C0A4BC67C3CF7579702312D6C89BF14E9585D2C624D07FEB4B5B57F8E4C5CFDA69A5E922CC1E9 + +count = 53 +seed = 7031BA806F4D8BC28529163B239E0EE836871C51D2D62B601B71D6F2B69B203C81440F8FFC09C3AAD94DB1D880160671 +mlen = 1782 +msg = 6103E5B22F934203B5CA87337095C9A19267AFB9695D309BEB8A557BB7CC90332C4A03E1D416D397B945B607268F545928104CFFD71B02864E010B666CFCB68B762FA5EC839B5AEFD0407419441B38E6D881BD5218DF73C675DF101BF2C53D90FF86D4A3C7DB19EC9CAC044E0467A36337AAEEC32217FAF86CBD7BC2B663421754CFF1200A8A66E18F812868BC8D1C8CA495E6462DA4B8B96D4167F040F04927A7C27AD35CF174D42684ED55AC80D14CBE4CC2570642DDEC4F44880D967E9AF77EE27D0D3DBAEC9067FB6FC957AC4A136C1D564E17F59AC4938D43FB9050D810989907125C47FCEA6C162C723E79F68339CD1B3BF596988BD6E215271385CD50616868C6BF40FDC34BD30E5A00773E2C039723F2AC3A3FA45F4CE870841762D7435BD6CCC5FD3D58FE059EE455A806FDE89155C84797FBB73691A1FC6921859E99066A3239E31F28D1A46100DB1917621D9E61473CF1E71F9850B584B459D5690941E676A7DD56796313ED9ABDBE03DC75AFC1430DBA27FE0F8DF48EF7C339F462AF1A6D30A5F8B480DFBBE860C4C0BC136393C8FA0875AF454273C3CFDBA7EEA44EEF1A4060136948CD98B9D2C19AEA4934F3455F31DD15BE6545134F17A195B6BC409159C0975E592A15E86CA4943CCACF4B46719A072DB8C629B67768F1956F8158F179A0B645320489DEE404C8D0C4E786CFF39B324053F102C118E7D51173CEC0FDD017F213B2B07AC6B2C7DEC04172DD5396A020EDFB74ED86FC31952D241A7C3D139DEF543D90976AA70599792E73CF73AD0BD4A359BF60DFB2CE96A784D8DE5E23A95E831CA6FFBA6B187BC5F29A7757185EC06AC882572EC6283A1875B54FE4F295E1970BF311DBABAF9F894D3364D68F529C4EF9030AB934BCB09459D5AAC61919946FD28DF1AC85876F979E8B8528E9BBE69F03DEEF136EEA6A8FC86F31BD64285C8C9F49ADF53A8BAA7867CE52E72DC4A63929DF3BA2662DC77D71F88D8AF42B8D67AD54884EE11F5A6B3B794F7D5610909B0B740937587CF475DA903159994A262B6F32A3D1723FDAAE65E636B71CB0EF0A744F359BF08AC8231ED2970CE8C451266F703DA3B57F85ACEED4C1C174C50D9C226F028E972AC124FAA6F60518699CB4C499220EA51A538F9EDE67D0E98E1BF8FB4B24B1D8EF50A28A93E20076F8FB812CDAB04871D331FF434BA66DD4577B18DC3F471B3E96A174B58A7AC2470EB8463A71FFCBA2D064470FD2D4E15F9491DB09DF3E3BA376A3DDCC437312BE5848DB3B9079F2AE046798473BB970D725E1D7C6FDF405AE387DD7CC1735A7FC27D1A476592A514B87C9017E1E5D37E338F37916F3C72C5F2AF75185B88694D4E8E0A93FBF20CE81A7A0C10D55737B6473FBD92BBB39FEBC6167336BEB9C235997796B9C0DC18C353E80305175BB412ACC29E647813D0003F727ED0577A7C14BCF67173DA569320E887BDC8F5AD27FD8864261E802A6753C6F9BAC844B5900ED0D4274C0E6EDE42367079188B10BED5999501164FA4C5A818ED6EE229C3E0E0F7804B19EAF5D1132BE1D7FC18BE834C842B21F8DDB11F8CFAAC10D2E124981ED698EE7CACA211C5624F09C62E1D451429048B55ED0F8A714BB77A0D4B40F0A446EDDFB27602B7BF894805C4AAD9252658F6B21A05DC0CF6A3ACDC227FA867A4E5B1DB63A14DE26A79AACF1900A7B7D867C15CFD1DAA712F2A1E2A6C7B31B121465539CD0164E3CCF79A978B543AE9602996448C6F68069D044FC958911EF40B0B9AFC78ED014D94571F6771EA5E2306A7CAC32C135FEC0BBF1DCA3CB0B57DAA239C01671718017C907048E0D19515CBF430D4B3B4FF4FC9A391D15A38B39C4E528FAC04EBD3DC69144C98AFA75102D21FF961BAD2E1F25562AF92554814405C4EC08DAE4A0CD28BE592C9C9BF997CC0FE31502DD541000D4640D59654D26CA2A17BA4CAB0518EE097C05B2984FFC56E8182368E216768E0D07E17FB64003E95194D04C6E00E08386084FEBB6CBC841E8F3FE2A069C45554BC502C27591CA3C1DC9E6B1694BA2C1BC0713C1CF738DB22FFEEB7443D72D5BDB975D192976A58AB33DB58F5DAE497A0B24011E15E3256FF124DD99AF6FC300D1FECDCEE18DD4FBF25E901125D4E80EFA8E2A211701B74FD992E63376996994E054CC00E7E1DE7DB8E7D2898A735EC4920DBEFAAEA66B456CF6A12324C5D56762313A627B3523AB1E2C1C82E4FBAB136AE4395FCF2672A58011D96BBDCF2A7478305756D66B30A4AC44E48B18A5964AA89F14187EA114084D52B4BA77755BA04C34777409BDB782B7B645E93B4DB284525E2F9C9C38D73B475DDE2251277A2E6C3183D5DEA78414E22CC8FB4B2C7EFA797CD4A87AC81D3242EC8D2C2EFD6BCFD69C39F14B0B365F3151A96F75454A3A1400C76A4390FE9F2E7A22A0CFA687A5BEF1C905D3A893B0DFD35BDA184F25E62FDDC2A52B6A67E76F550ABE4CC8D1D63CC8631E4CC315E46D3015C3B8636B92B8D07075D401C654FB4A +pk = 6F0A296346BAB0784DF610F7E881824B63276B36C183456D4152BBC8CDB63D4BA106C5A9DAA66A39BFC016635C61A90B786DB88E5AEE2BD6499AC23687B23403A5AC26BA69655CB1FFE1C6D6DE76E70BBC28A3572DC3309C079E1590E27A0A2C15 +sk = 6F0A296346BAB0784DF610F7E881824B63276B36C183456D4152BBC8CDB63D4BA106C5A9DAA66A39BFC016635C61A90B786DB88E5AEE2BD6499AC23687B23403A5AC26BA69655CB1FFE1C6D6DE76E70BBC28A3572DC3309C079E1590E27A0A2C15AB31A316F560C9D54FC36BBBDB6604E3624863554AB17F722E0A00000000000000000000000000000000000000000000D686D6C6F2028946EB76E42B9A2E9B67EC4093DC95A4DEE88DFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67C80B8BCAD30F55C3BAE4A1F6B9FA1A6414BB0C94C4550647FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E5E8D03B23CB02085D9E6330C841064D108CD2155F64ABEB297046EC04FF6A49C79DC8B14DB95D7E2ACC5670475486006AC4CCBE57483AB0B903F11D6F0BC480A0115AE68298E141FDA45DC6E4796C494F6DADE0727F60D88AFAE8E26F126300724CBD46526793D008F421F550B713D9ADAEEE17D4BC6B0CE3E1B3946E9F251B2F8B10C9C41FDD94DC5A2575F5B5F0004F51E6A284631E52075B8B0F71644A304E4DB415553C60F137C9E149346E46AADF345FCA53BE469A3311EE6CCE509300 +smlen = 2006 +sm = C5AFBE71C9194E348EF2920F5E4EF96B5142DCABB6FB4FA6F546A31654E69F1CD3A6DEF4F361566212D8B35A2C920D408675CDF68338B68CCCF2F1F11F5AF4FA55E51B49554608B671A780AA3C8EF6B982F45C6E0DA01D504EDF2E1677AC670501009437427CDB43541F33FD338F74D8D9CF0D11AD3C0F58ABCB008B330D241AB70C51FB989CEFF522037971616FD0C5F6D96400F5AC28A21382497B69071AD552B6CA6E8D81C5A89373881600215FB583F1BD0B9F31EC8C1DFD96479723169B25F8E9766A01689B90018C2D96BB04FD269E071788115CCB676DE1BD950019026103E5B22F934203B5CA87337095C9A19267AFB9695D309BEB8A557BB7CC90332C4A03E1D416D397B945B607268F545928104CFFD71B02864E010B666CFCB68B762FA5EC839B5AEFD0407419441B38E6D881BD5218DF73C675DF101BF2C53D90FF86D4A3C7DB19EC9CAC044E0467A36337AAEEC32217FAF86CBD7BC2B663421754CFF1200A8A66E18F812868BC8D1C8CA495E6462DA4B8B96D4167F040F04927A7C27AD35CF174D42684ED55AC80D14CBE4CC2570642DDEC4F44880D967E9AF77EE27D0D3DBAEC9067FB6FC957AC4A136C1D564E17F59AC4938D43FB9050D810989907125C47FCEA6C162C723E79F68339CD1B3BF596988BD6E215271385CD50616868C6BF40FDC34BD30E5A00773E2C039723F2AC3A3FA45F4CE870841762D7435BD6CCC5FD3D58FE059EE455A806FDE89155C84797FBB73691A1FC6921859E99066A3239E31F28D1A46100DB1917621D9E61473CF1E71F9850B584B459D5690941E676A7DD56796313ED9ABDBE03DC75AFC1430DBA27FE0F8DF48EF7C339F462AF1A6D30A5F8B480DFBBE860C4C0BC136393C8FA0875AF454273C3CFDBA7EEA44EEF1A4060136948CD98B9D2C19AEA4934F3455F31DD15BE6545134F17A195B6BC409159C0975E592A15E86CA4943CCACF4B46719A072DB8C629B67768F1956F8158F179A0B645320489DEE404C8D0C4E786CFF39B324053F102C118E7D51173CEC0FDD017F213B2B07AC6B2C7DEC04172DD5396A020EDFB74ED86FC31952D241A7C3D139DEF543D90976AA70599792E73CF73AD0BD4A359BF60DFB2CE96A784D8DE5E23A95E831CA6FFBA6B187BC5F29A7757185EC06AC882572EC6283A1875B54FE4F295E1970BF311DBABAF9F894D3364D68F529C4EF9030AB934BCB09459D5AAC61919946FD28DF1AC85876F979E8B8528E9BBE69F03DEEF136EEA6A8FC86F31BD64285C8C9F49ADF53A8BAA7867CE52E72DC4A63929DF3BA2662DC77D71F88D8AF42B8D67AD54884EE11F5A6B3B794F7D5610909B0B740937587CF475DA903159994A262B6F32A3D1723FDAAE65E636B71CB0EF0A744F359BF08AC8231ED2970CE8C451266F703DA3B57F85ACEED4C1C174C50D9C226F028E972AC124FAA6F60518699CB4C499220EA51A538F9EDE67D0E98E1BF8FB4B24B1D8EF50A28A93E20076F8FB812CDAB04871D331FF434BA66DD4577B18DC3F471B3E96A174B58A7AC2470EB8463A71FFCBA2D064470FD2D4E15F9491DB09DF3E3BA376A3DDCC437312BE5848DB3B9079F2AE046798473BB970D725E1D7C6FDF405AE387DD7CC1735A7FC27D1A476592A514B87C9017E1E5D37E338F37916F3C72C5F2AF75185B88694D4E8E0A93FBF20CE81A7A0C10D55737B6473FBD92BBB39FEBC6167336BEB9C235997796B9C0DC18C353E80305175BB412ACC29E647813D0003F727ED0577A7C14BCF67173DA569320E887BDC8F5AD27FD8864261E802A6753C6F9BAC844B5900ED0D4274C0E6EDE42367079188B10BED5999501164FA4C5A818ED6EE229C3E0E0F7804B19EAF5D1132BE1D7FC18BE834C842B21F8DDB11F8CFAAC10D2E124981ED698EE7CACA211C5624F09C62E1D451429048B55ED0F8A714BB77A0D4B40F0A446EDDFB27602B7BF894805C4AAD9252658F6B21A05DC0CF6A3ACDC227FA867A4E5B1DB63A14DE26A79AACF1900A7B7D867C15CFD1DAA712F2A1E2A6C7B31B121465539CD0164E3CCF79A978B543AE9602996448C6F68069D044FC958911EF40B0B9AFC78ED014D94571F6771EA5E2306A7CAC32C135FEC0BBF1DCA3CB0B57DAA239C01671718017C907048E0D19515CBF430D4B3B4FF4FC9A391D15A38B39C4E528FAC04EBD3DC69144C98AFA75102D21FF961BAD2E1F25562AF92554814405C4EC08DAE4A0CD28BE592C9C9BF997CC0FE31502DD541000D4640D59654D26CA2A17BA4CAB0518EE097C05B2984FFC56E8182368E216768E0D07E17FB64003E95194D04C6E00E08386084FEBB6CBC841E8F3FE2A069C45554BC502C27591CA3C1DC9E6B1694BA2C1BC0713C1CF738DB22FFEEB7443D72D5BDB975D192976A58AB33DB58F5DAE497A0B24011E15E3256FF124DD99AF6FC300D1FECDCEE18DD4FBF25E901125D4E80EFA8E2A211701B74FD992E63376996994E054CC00E7E1DE7DB8E7D2898A735EC4920DBEFAAEA66B456CF6A12324C5D56762313A627B3523AB1E2C1C82E4FBAB136AE4395FCF2672A58011D96BBDCF2A7478305756D66B30A4AC44E48B18A5964AA89F14187EA114084D52B4BA77755BA04C34777409BDB782B7B645E93B4DB284525E2F9C9C38D73B475DDE2251277A2E6C3183D5DEA78414E22CC8FB4B2C7EFA797CD4A87AC81D3242EC8D2C2EFD6BCFD69C39F14B0B365F3151A96F75454A3A1400C76A4390FE9F2E7A22A0CFA687A5BEF1C905D3A893B0DFD35BDA184F25E62FDDC2A52B6A67E76F550ABE4CC8D1D63CC8631E4CC315E46D3015C3B8636B92B8D07075D401C654FB4A + +count = 54 +seed = C8671A5D752CC6DDF075C899797603A625C142485EAC3D57CAF14F2244D7F84D116B28F959912A758E519D588A6A07EB +mlen = 1815 +msg = 3EAC87B3D642CEAA3DC904AC3C4245CB2A260E4B74D0394D33D4B71024144180A727F80B092305F31B2526998EDF6F98E46933FDAF0E8709E98D54F13C2701C58BBE35292FD3334C5E03D345A9A2EA1E01B2C4573567FF1FF3BA7406A16F5A5805EDD760AC78A3AB8602E415F67C7CEA5B36421C79F83CBB14FA775448A832A4B28851CE215C11DCBAEE652CDD7342B6B1204727479E6208FB556CF08BF7EE230F32659E829CE4FBCE0955D01D36624BBAC18C1D25A3E187722F8F74C88B56E518CF0E78B3B0EAC56D8F13C4AFC4DA3613A41CCC2B0B0E2EBBFE5799E479F81335360D483596E9AE926751EC9B956555F271C2CCD85F0F6C1BBB2C326C29B5DDF6B5C4C11F8EED15C0143993FEB626543E92CE4D66C0BD28C79ED1ECB793A3091D6B9AB510B0D41AA42D70C2D8F26EA0B826C8C375E1DD89B3E2A48FE5D88A462DEAC33BAC35AA32EBC010AF7E47B77AD23653D747760914E0CA12864CD401787EFD96F30D82D8907DC68578067703DD19B2377DF319EB540E8AE78B2BE86BEE1C915FF3B2F4B25C0AC22CCF89BD85371961944D8A4E6D20E2D3E9DF3A07D3BF6986898786F0667545275FAC3EB0F069B457D8EBBE5F60125F94756DB04EA203451A0DE160CBCE2A34650D92F200448B097691A61361AC487FBC3C82B2BD7C1ACCA02031311971C3CF69BA459A0B640A702DB4467973713A6F2466560FFAC0592D64FF1D4A935220826EB559CFE0144EA4B8E54EAF67DDF91988DD4B3749C865008C0C1CF98BBF76D929B85C8C426C15FA56706984E0F2E90658FA3CC33EC9FC700976870C94035ECF9A0534B18D07F55923663835416E40235CC2550BD9822F0912CF101F86039830AD9102AA4A3B6777EDEC5EBE621082FCF81A1C6A528F0324EC9D39FA80B6E87D6366E7EDAA0E14337D6708F7C3D2FB1978F4F5CD594FD35B267F9CD09370D3366DCE286CCB9647A1944F8D8BE63E5EF8F6108CC5E9AFE9127DA84E1913439EC35A4E17F7782DF042DC2F7C5CAD8A659DB282E61763539B56C2AFA0F2B507D549EC8C9E76C7DB306380CD7B46C9699B6DB8BE06CCA15E8E83763137B06BFF02DE2738A46C61B70EDF4F394D54D0453DABF689FB6BA41616BC589CB9847224E74F919B6E03672EC6A52584FE81456D6E648DD6F0F9B068EB72241F067BF6B891A498A9A59356C735E10EFB37B3ECF47CC5620A35442DD81E25D2C6DB0E9E871301ADD193D628B30E3B4345751BC17E0B5B05AF758A653DE7BED3763303FFE1AF05E407F296C736CA6F4C348B25718C7A814BD0730AFFC057842AF3D9B9ADB12FCCD740ADD16218AA57E43835821A2BCD70F1027F3042D4A92F10D0A1FB8323E87869BFA8DA24DA75F8743FA3038C24FEDC0C987065421BF4B300BE3ED3F6D6D590968D3EE32A8F5E20EA6168756AA18BB78B6AA48C299C36D0E78B6F84CACAB5946C69179E461F4C2DD201D8032A29EC6C52942AC37D9C76AB4A401C9AFF96284E1E9E39BFF6D912CA33B6118067605EA65D7F611DD963F4F75F97346FFFD1DF84C79CCBA06804B3017775D8C0BF614FCF4D824709557937B22E1805A0A961ECF226F26E3706362BF6D8D1DD30BE7EEDA481A64961641DC57B9F0211F8EE43578E4C2B6507114DFFF3C3F884586BFD1278D117F7C6014FD5980CDF1E2FD1F34CCAD170842B9E819C22FAB9890AE265C3BB6946FCCFE218544D00A6BA5BEF5224EAE24002B6E83E0B35E98C2322BE2EB3D8234BE8B048C54E40782C9A24D7A8B461EC05F38A94AAEF3DA3B46D0D85B0D949CF1089408189FF97C56C7DEE50A004AEAD82C15C7C0D0965F3C65A9A715A65D29CD3614954EBD91EEB4E74F862FBC944C56F2EDEC4D344F92E8154708AD0F5575880503EF0F107A9A9DB99BAE82357C16578F3E6CBDF9B427DA88DC322D11C6AB2A6AE6F5179C94454E09DF5CAA6A519A4C1903C8F2925639E12AF793695F256BF0E55E0D45B73880358F09719ED89A4A1A07868BFBF16095A20035D5D4F99FDA19DDAE3E21CB98308F4508B5CEE706C27898F03A2BF14F29ACBF055E4AB0713A7B6FC1A7853EFD36E1290E69587FEC15D492A66B9A4FEA6E2BCDE61E02FE18E06F59A2F4E06F177B14CE4C1CF1A8D1F49C554A8A4C68B9937B4C230320C80753D4B071BAB2DEDA89C9181820336F1E766E447EA1C44E15CBB7C002C1813D2C1726DB0E4DE289466077DA9610E5F3AA313B1B01DD79A4056A8BBE9D843CE5B0439325FFDFE91FDADDEC6CB86D5CEBB68D8F9C0ED237A4648C412780ACFF48FD9CE817EA70D950DCB989EA6B11FD87EA4F30347A27488C5C15BE7FD6D1280FEA3A7C022F8D9881FAC93176DB2025B4C7914A51099893A791BF5BE851F325347484CA6ED51B2BA71548A6046EA7EC85B31A9967E7D119D2CA3A51C1E14D5A3EEF0D41BDD615DA01D45979007A1997DE281BC340C3203D5BC0075B1AA38873A9DBB9D18E6E26971E70B54E41E2C8C91D2E60FBF85435C1EBC4893C45A201B1D2391549F52A1CA3E0440ADFB746FBBF0D9933F9FA0220B3E04EBEBB29D2A9AC1 +pk = B6102F9B34ECC91323B2FFE2452D90F5DECE6DB575ED0BEB36BA42C19E8E9557BCC9A5C13D0410B7A9D39E4CD658512C017B913565A9CCF78A36F89145A1D69D031C2DAFFB29FC0CC368BABB9B02B6112D0B3593C14C7CDC0D49D139CB41EA2B0A +sk = B6102F9B34ECC91323B2FFE2452D90F5DECE6DB575ED0BEB36BA42C19E8E9557BCC9A5C13D0410B7A9D39E4CD658512C017B913565A9CCF78A36F89145A1D69D031C2DAFFB29FC0CC368BABB9B02B6112D0B3593C14C7CDC0D49D139CB41EA2B0A41B6D7A5A04E88FEBB8DE71C1F04BC0CC4C3A49F2BAD0A54DD0000000000000000000000000000000000000000000000921A0FCCF3C6845BB3C54B972221BD983A2A41E249D1D386CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F7220703C09A7E5AE50BF6DC9042A4F82896011EABF35C487FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002BAEE4AC080376D63F0C2929A2F91EBD653B3136570FF2E5A80173B369588EE0F01E36A9E5845CA4BA2CD5CA27E15200C6E5412A7DF7EC960DE023CE889CF34B1450B481EE0A69D04B4BE068B1DF1DA7AD94B5543D2BC296AD19FC864DDF460099DE9E29A43904D47AD4198A4CBEB525679CDF4A3DC53EAE6BB8EC0F8FCE141586EFCF5A24C173684AB812787E034F001352014527B72580949C8D615C2E5976D46CC1E7C423AB26321F5BC4D28219F605EE6C85413C0FCC709F9FB509541F00 +smlen = 2039 +sm = 44C851B6689C6AE3612CAF5F0B7946DACE7DC1386CC10FE27634267879D474C6025F498DA6401FA47E3D027439CB7F3526BA6D0E0D51E6FDE2D5776DE48DE1603694561D4D89626A1AB3401860B26934DAD623C4FE419918D23A9CDF9F4CAE320001DF20EBE8871F1CEABFDC3F335FFE04267874B20BEB18888A00EAC3C7D22D13394BE380E4C2F7A2BB20F71C350862A8518A00743611E987A84B6645AB5670C06D4665B29D5B570656C05703DA53310E0ADF4E2FF56CD017A69AB14BEE2C5296AD0AF326012ECC98CFDD384754917E7AAB420FAEF4E487F4422F398200040D3EAC87B3D642CEAA3DC904AC3C4245CB2A260E4B74D0394D33D4B71024144180A727F80B092305F31B2526998EDF6F98E46933FDAF0E8709E98D54F13C2701C58BBE35292FD3334C5E03D345A9A2EA1E01B2C4573567FF1FF3BA7406A16F5A5805EDD760AC78A3AB8602E415F67C7CEA5B36421C79F83CBB14FA775448A832A4B28851CE215C11DCBAEE652CDD7342B6B1204727479E6208FB556CF08BF7EE230F32659E829CE4FBCE0955D01D36624BBAC18C1D25A3E187722F8F74C88B56E518CF0E78B3B0EAC56D8F13C4AFC4DA3613A41CCC2B0B0E2EBBFE5799E479F81335360D483596E9AE926751EC9B956555F271C2CCD85F0F6C1BBB2C326C29B5DDF6B5C4C11F8EED15C0143993FEB626543E92CE4D66C0BD28C79ED1ECB793A3091D6B9AB510B0D41AA42D70C2D8F26EA0B826C8C375E1DD89B3E2A48FE5D88A462DEAC33BAC35AA32EBC010AF7E47B77AD23653D747760914E0CA12864CD401787EFD96F30D82D8907DC68578067703DD19B2377DF319EB540E8AE78B2BE86BEE1C915FF3B2F4B25C0AC22CCF89BD85371961944D8A4E6D20E2D3E9DF3A07D3BF6986898786F0667545275FAC3EB0F069B457D8EBBE5F60125F94756DB04EA203451A0DE160CBCE2A34650D92F200448B097691A61361AC487FBC3C82B2BD7C1ACCA02031311971C3CF69BA459A0B640A702DB4467973713A6F2466560FFAC0592D64FF1D4A935220826EB559CFE0144EA4B8E54EAF67DDF91988DD4B3749C865008C0C1CF98BBF76D929B85C8C426C15FA56706984E0F2E90658FA3CC33EC9FC700976870C94035ECF9A0534B18D07F55923663835416E40235CC2550BD9822F0912CF101F86039830AD9102AA4A3B6777EDEC5EBE621082FCF81A1C6A528F0324EC9D39FA80B6E87D6366E7EDAA0E14337D6708F7C3D2FB1978F4F5CD594FD35B267F9CD09370D3366DCE286CCB9647A1944F8D8BE63E5EF8F6108CC5E9AFE9127DA84E1913439EC35A4E17F7782DF042DC2F7C5CAD8A659DB282E61763539B56C2AFA0F2B507D549EC8C9E76C7DB306380CD7B46C9699B6DB8BE06CCA15E8E83763137B06BFF02DE2738A46C61B70EDF4F394D54D0453DABF689FB6BA41616BC589CB9847224E74F919B6E03672EC6A52584FE81456D6E648DD6F0F9B068EB72241F067BF6B891A498A9A59356C735E10EFB37B3ECF47CC5620A35442DD81E25D2C6DB0E9E871301ADD193D628B30E3B4345751BC17E0B5B05AF758A653DE7BED3763303FFE1AF05E407F296C736CA6F4C348B25718C7A814BD0730AFFC057842AF3D9B9ADB12FCCD740ADD16218AA57E43835821A2BCD70F1027F3042D4A92F10D0A1FB8323E87869BFA8DA24DA75F8743FA3038C24FEDC0C987065421BF4B300BE3ED3F6D6D590968D3EE32A8F5E20EA6168756AA18BB78B6AA48C299C36D0E78B6F84CACAB5946C69179E461F4C2DD201D8032A29EC6C52942AC37D9C76AB4A401C9AFF96284E1E9E39BFF6D912CA33B6118067605EA65D7F611DD963F4F75F97346FFFD1DF84C79CCBA06804B3017775D8C0BF614FCF4D824709557937B22E1805A0A961ECF226F26E3706362BF6D8D1DD30BE7EEDA481A64961641DC57B9F0211F8EE43578E4C2B6507114DFFF3C3F884586BFD1278D117F7C6014FD5980CDF1E2FD1F34CCAD170842B9E819C22FAB9890AE265C3BB6946FCCFE218544D00A6BA5BEF5224EAE24002B6E83E0B35E98C2322BE2EB3D8234BE8B048C54E40782C9A24D7A8B461EC05F38A94AAEF3DA3B46D0D85B0D949CF1089408189FF97C56C7DEE50A004AEAD82C15C7C0D0965F3C65A9A715A65D29CD3614954EBD91EEB4E74F862FBC944C56F2EDEC4D344F92E8154708AD0F5575880503EF0F107A9A9DB99BAE82357C16578F3E6CBDF9B427DA88DC322D11C6AB2A6AE6F5179C94454E09DF5CAA6A519A4C1903C8F2925639E12AF793695F256BF0E55E0D45B73880358F09719ED89A4A1A07868BFBF16095A20035D5D4F99FDA19DDAE3E21CB98308F4508B5CEE706C27898F03A2BF14F29ACBF055E4AB0713A7B6FC1A7853EFD36E1290E69587FEC15D492A66B9A4FEA6E2BCDE61E02FE18E06F59A2F4E06F177B14CE4C1CF1A8D1F49C554A8A4C68B9937B4C230320C80753D4B071BAB2DEDA89C9181820336F1E766E447EA1C44E15CBB7C002C1813D2C1726DB0E4DE289466077DA9610E5F3AA313B1B01DD79A4056A8BBE9D843CE5B0439325FFDFE91FDADDEC6CB86D5CEBB68D8F9C0ED237A4648C412780ACFF48FD9CE817EA70D950DCB989EA6B11FD87EA4F30347A27488C5C15BE7FD6D1280FEA3A7C022F8D9881FAC93176DB2025B4C7914A51099893A791BF5BE851F325347484CA6ED51B2BA71548A6046EA7EC85B31A9967E7D119D2CA3A51C1E14D5A3EEF0D41BDD615DA01D45979007A1997DE281BC340C3203D5BC0075B1AA38873A9DBB9D18E6E26971E70B54E41E2C8C91D2E60FBF85435C1EBC4893C45A201B1D2391549F52A1CA3E0440ADFB746FBBF0D9933F9FA0220B3E04EBEBB29D2A9AC1 + +count = 55 +seed = D780D7688AF364949A196657A066BD48FFA8DC45B4885279B6DEF362E5957F398CDCE1D20FC3F8F63A275C325FCCE654 +mlen = 1848 +msg = BAA4A41E4B68FE333FFA5EE97FD3DE18F0EECE8EB83E46A8E3505E2EF8AEA2C4040BA3809A764B681EC7449F41A2463651A8CC6DEF0E4A058EB843EF016E5CBA8D55F925E66524BE55CB98FC3169082E52E0D6CC3600C4E8A560B6D448A72CCC95620101323F98B43E28D6357414185ECB0263C7BB94E7F86146661FC897844CF52873114D39123260893DEF13516F982783B927864B61B56D3A8E5B4705DA3A95F6D12A6637C9CED02F07B4AA0B08B4924103036C2A93B31C91EBB6C5B77DE090EBF60A04191EB6CE9CC9B550F5B0C9104B74D15358854181C0C5640FC74CAEE14FED6577FD75EECA14070B6D02A9A421247A5BB262D6E62B04649E75BBD3ED8E72752289FA7C1A68096DD96A4BAC8A2DC27C44881DD2416387D74A005680A3D229D562D3DAAF8DC37B4C87CC86A8C991E9327CDD43BA930CDD8D1E44AEFB084B51111965C5DFB0EE2F09112B070CBFC545119ABA823EB3F65F26BCC025B39F79BE42C0396C5FC9FC924EF1B7EE9DDB71B6E69B579C0A64C5B020206CD3515B8D5F4FF29378B9580D282F7E5ECEEB5CE9C09A7B334E62151100CD658DFFFA66F4091231BEA6C9DE8129EC4F5FBE8BE0FF4BC93367DC69D9E38C177B23AFBA5C27FEE3E2B73C0037DD7C419C854DF7C2412349BAB43869469E80527C3AD3A7103152F9E0B03353A596002FF54ABA8B14AC393EE52EB5564D63BC2738D571FA3C255ABD20102BB299441B00EB988F3A5CFB238EF8C49963B4AE8877E6B317E208821510BF446CE6B06C33717C91C460924248382159198F09D0F5A25C1611B2D39CC6D2ED149FDF0E09A0B0B2BB77067182E386F5F6A55B68808DAD98E5CEB0FDFAE6A0315845ACC7B9C172B0E82190A5EB7C58DE4F86D883292A883045C62D6A1B3C886C345AA6158276EFA6B93AB2188E47ABDD25D332146E980E1B1E043CF63EE35A5AA01AB6CC62F77699DCA16FA30E3632DC5CCD3253D01E547746C78021AC307F0EF1A0119AD11504803EDAD933150981C4D9FD181835C507651DC92A86737E3AFD0EB4DDEF6182872FBD31BFC6D8427C2F4D3A39BCBE6B5120B8CF2AF5DC59949C92D10B1C6A96810564DD335E0755F9DE25EC26C102355688C38250DF8F96E105136855C8DE4BDCD86DF03F92977DA16908CAEEB4056F4A5F751A57BA057AC0309F1C107E594CF3C31544E4F1D93FB9AE7E1A2451E7082CF0C850990EE71ADE0498F6A3852DC4FC128BFDB8ABDDA3D759C8D4F83FED8509CDE5EED38410FB9F0A5F30EA45C9270BA2395DF645AAEE03F56158685A0BA65DE3D2C5209A7EF4BDD4BBE0CDC966DD1BDF1FE0BE06C7115F7CCD80F8012E5D17955AE0C9E4220076882F30DC5E391295994B9F809C09DBED8CCDFC89669F40492944FF20948080A4ED66AD8166B613AB2F4414762AE493EA6661950E8E56B3758A77CDBCFBF24FBBBF20EACD5CBF8815899A1C3FD20B1D04920025885388012D9C58EA842DB9530B7ADA901AB9CE46A12700687BDE07FB99BF66D0C775218B8454C936F03558B899B59361A0C664081CE8A7858DDBC5E7C5480280411C9ACF4D1EC45035D97524E9E44F963532CA5067609540C1BCB5627F99D5C61CB9A6D400F0BA0A74E45DDAB5A4E8A765DCF2F3684E3A2661A78AC069FA38163AD9F9713EB45C841C6617697CF8A72C54B550DBE9C22B04D579B09AAB0EF4EE8B70CA563F81EF9700C07761C944926F9A76A8C3EEE1CF7E7524D65908C47C35B0453DC10DB5B75123A5B26B9612C0AE18816A71F34638798DFCA21F5073CE771500034F9A71FEB8B621356C430B4D47CB1B59AD4677B5C679188D8861BEAF52558165F691F65A692E8CB8D24ABB74B8885EDEBBE52FB13DAC16E3A8EBC4EF192FD10D71898E93547C7A09F8642AA3B4FAAE23E48BFA809C5989D3462AA50FD4E5C4095542C45E5600926C2DECB4D18BB43B7274239A8DFA3D9DE1BB9CA099DFE56DEDFC9E120867EFCDA10B48F7E630506AA606D76E4537036127FA05FFFB8B8703CDC8DE70A78D014872111A431F393345D74E8866D9A9A633923072E93DBF47C54C4B205C60E67D5155B76F51AB49ACC7435525605DD43A10C88A03E08E257C68937BF2984BE63D40F8A60589D909F8F09688A77DA15DC7B4853339F235B1BD60AA845B4DB6B699325885C49DF9C40781CC56FABEA6201E2F8A9352C28CE321B9441422807E9C81C8F1EC85D240C9F1C8ECC4FF06D6E3682DEA3E6CF92F2B74C2165AF247CE0F5AB84460693254B523498A57E7442977F51F1C2F649BDF756E7F43AE543F5D8E692820F8A06322667A7FA9C1A5B10199A69CCEA22C74E172FED43E550C68C337ECC5E6AAD9F7EB997A7E619D47DF73CB917A705C3CDE5FF344F6FBCFAECCE6B734E09A385FE54B224A880704D774581074C59EB0A3B42C59B8BA4518E764C5A532F6655DD839862AF716903A118433CE0809376A88E88FA847B4D1C63EE393267B15C1E42A91DC6107CDE990EC9ECC7C1066E9480E90A22907C51AF47DA837438A90CC07DE8121691BD73802D5D09D18A2D8B38A28948735110891D1B559A73445838F359A6FB90A3CAB887486CC9D95CBA35B55693C890830D2 +pk = B3F306A0B94BCD949C2C401B222C30845BBF026B6E08D80DED1DCFC9422537579CF87B86155F958C765AB706500B4035A02307ABB3A7664F44B02A8CBFFFBCB677BF3CAA858ABFBD1FB0D49388B05382931D5DECA96B0A4253C6B6F5109EF8040D +sk = B3F306A0B94BCD949C2C401B222C30845BBF026B6E08D80DED1DCFC9422537579CF87B86155F958C765AB706500B4035A02307ABB3A7664F44B02A8CBFFFBCB677BF3CAA858ABFBD1FB0D49388B05382931D5DECA96B0A4253C6B6F5109EF8040D99C8C9CC902A477E588D5D7D3BDEB9E4187BFBA566856EDFEC0C00000000000000000000000000000000000000000000DC876DEC680833F92B93CD0D8B18E317C7A802F58B9ED85FA0FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F7CE33A213A97015186DE162C4081FE45DC9CF0C06EAE1AE7F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B960465644E2B5720A5B8B2ECB05B3FBF91F7AB8D12BE6D811B9E679E6AC031A28EA0154EFC2BA000220F6DEAC919400E9C93A61CAC087EA5F2325FDFAD4693C810D44C26A93E431CBB2EA818564207818704601D2ED5A55719452EC9DF86A00D2313FBA25ABB2611F79207E7A00EF98E50A79458DD6A1D0254382B56AA93A7D3AD1413EE03FCAD80265E409C5D345007962E1C5BF01A7DF0BC321AE22AABD0FC2F88C7F8A99502F0B652FDE49A36170C8BB5A738B082EEA60D7F2B718065900 +smlen = 2072 +sm = E076913578D841A2ED93678905BCBB295D29801E70A5ADD1C32FEC7EF5DA0E3B994DE2072616DAA5AA74F97C5A41DB33B2249A7187A91E85D01B4AC7175F52E87D482F3F817E9EE2B726516FF7224B77A2AEF8B9C16DA78D6E49971B4B092E3E000331978B5D17FA5BCC6F8162CC5ABC8390B02A400BF028F3EF028AFEABF70D2B935F86371C899202296E7F8137D7B9AE9D3E02769063C44E8109396515EE1938A2E88AB60E3C5F948C94460244D2CD5DAA48D4945816135218D1F92AF0259417DB24C50B00EC1A24C66CC40820B119AA19E05F462EBAA4BF755AB6D0001D17BAA4A41E4B68FE333FFA5EE97FD3DE18F0EECE8EB83E46A8E3505E2EF8AEA2C4040BA3809A764B681EC7449F41A2463651A8CC6DEF0E4A058EB843EF016E5CBA8D55F925E66524BE55CB98FC3169082E52E0D6CC3600C4E8A560B6D448A72CCC95620101323F98B43E28D6357414185ECB0263C7BB94E7F86146661FC897844CF52873114D39123260893DEF13516F982783B927864B61B56D3A8E5B4705DA3A95F6D12A6637C9CED02F07B4AA0B08B4924103036C2A93B31C91EBB6C5B77DE090EBF60A04191EB6CE9CC9B550F5B0C9104B74D15358854181C0C5640FC74CAEE14FED6577FD75EECA14070B6D02A9A421247A5BB262D6E62B04649E75BBD3ED8E72752289FA7C1A68096DD96A4BAC8A2DC27C44881DD2416387D74A005680A3D229D562D3DAAF8DC37B4C87CC86A8C991E9327CDD43BA930CDD8D1E44AEFB084B51111965C5DFB0EE2F09112B070CBFC545119ABA823EB3F65F26BCC025B39F79BE42C0396C5FC9FC924EF1B7EE9DDB71B6E69B579C0A64C5B020206CD3515B8D5F4FF29378B9580D282F7E5ECEEB5CE9C09A7B334E62151100CD658DFFFA66F4091231BEA6C9DE8129EC4F5FBE8BE0FF4BC93367DC69D9E38C177B23AFBA5C27FEE3E2B73C0037DD7C419C854DF7C2412349BAB43869469E80527C3AD3A7103152F9E0B03353A596002FF54ABA8B14AC393EE52EB5564D63BC2738D571FA3C255ABD20102BB299441B00EB988F3A5CFB238EF8C49963B4AE8877E6B317E208821510BF446CE6B06C33717C91C460924248382159198F09D0F5A25C1611B2D39CC6D2ED149FDF0E09A0B0B2BB77067182E386F5F6A55B68808DAD98E5CEB0FDFAE6A0315845ACC7B9C172B0E82190A5EB7C58DE4F86D883292A883045C62D6A1B3C886C345AA6158276EFA6B93AB2188E47ABDD25D332146E980E1B1E043CF63EE35A5AA01AB6CC62F77699DCA16FA30E3632DC5CCD3253D01E547746C78021AC307F0EF1A0119AD11504803EDAD933150981C4D9FD181835C507651DC92A86737E3AFD0EB4DDEF6182872FBD31BFC6D8427C2F4D3A39BCBE6B5120B8CF2AF5DC59949C92D10B1C6A96810564DD335E0755F9DE25EC26C102355688C38250DF8F96E105136855C8DE4BDCD86DF03F92977DA16908CAEEB4056F4A5F751A57BA057AC0309F1C107E594CF3C31544E4F1D93FB9AE7E1A2451E7082CF0C850990EE71ADE0498F6A3852DC4FC128BFDB8ABDDA3D759C8D4F83FED8509CDE5EED38410FB9F0A5F30EA45C9270BA2395DF645AAEE03F56158685A0BA65DE3D2C5209A7EF4BDD4BBE0CDC966DD1BDF1FE0BE06C7115F7CCD80F8012E5D17955AE0C9E4220076882F30DC5E391295994B9F809C09DBED8CCDFC89669F40492944FF20948080A4ED66AD8166B613AB2F4414762AE493EA6661950E8E56B3758A77CDBCFBF24FBBBF20EACD5CBF8815899A1C3FD20B1D04920025885388012D9C58EA842DB9530B7ADA901AB9CE46A12700687BDE07FB99BF66D0C775218B8454C936F03558B899B59361A0C664081CE8A7858DDBC5E7C5480280411C9ACF4D1EC45035D97524E9E44F963532CA5067609540C1BCB5627F99D5C61CB9A6D400F0BA0A74E45DDAB5A4E8A765DCF2F3684E3A2661A78AC069FA38163AD9F9713EB45C841C6617697CF8A72C54B550DBE9C22B04D579B09AAB0EF4EE8B70CA563F81EF9700C07761C944926F9A76A8C3EEE1CF7E7524D65908C47C35B0453DC10DB5B75123A5B26B9612C0AE18816A71F34638798DFCA21F5073CE771500034F9A71FEB8B621356C430B4D47CB1B59AD4677B5C679188D8861BEAF52558165F691F65A692E8CB8D24ABB74B8885EDEBBE52FB13DAC16E3A8EBC4EF192FD10D71898E93547C7A09F8642AA3B4FAAE23E48BFA809C5989D3462AA50FD4E5C4095542C45E5600926C2DECB4D18BB43B7274239A8DFA3D9DE1BB9CA099DFE56DEDFC9E120867EFCDA10B48F7E630506AA606D76E4537036127FA05FFFB8B8703CDC8DE70A78D014872111A431F393345D74E8866D9A9A633923072E93DBF47C54C4B205C60E67D5155B76F51AB49ACC7435525605DD43A10C88A03E08E257C68937BF2984BE63D40F8A60589D909F8F09688A77DA15DC7B4853339F235B1BD60AA845B4DB6B699325885C49DF9C40781CC56FABEA6201E2F8A9352C28CE321B9441422807E9C81C8F1EC85D240C9F1C8ECC4FF06D6E3682DEA3E6CF92F2B74C2165AF247CE0F5AB84460693254B523498A57E7442977F51F1C2F649BDF756E7F43AE543F5D8E692820F8A06322667A7FA9C1A5B10199A69CCEA22C74E172FED43E550C68C337ECC5E6AAD9F7EB997A7E619D47DF73CB917A705C3CDE5FF344F6FBCFAECCE6B734E09A385FE54B224A880704D774581074C59EB0A3B42C59B8BA4518E764C5A532F6655DD839862AF716903A118433CE0809376A88E88FA847B4D1C63EE393267B15C1E42A91DC6107CDE990EC9ECC7C1066E9480E90A22907C51AF47DA837438A90CC07DE8121691BD73802D5D09D18A2D8B38A28948735110891D1B559A73445838F359A6FB90A3CAB887486CC9D95CBA35B55693C890830D2 + +count = 56 +seed = 36AB8588F5233D15674677535A682382C29968FF824031AF646F58FCAF0E83C1C486B1E75479149FD6F4D9E8397CAF73 +mlen = 1881 +msg = 0707EA05515798829F42A4CBDDB4A95C5750879E0A584AB503F778015F83BEBF6D63C3B48A4F478EF01091403DDC5A9662E39707DBC8502ACF50F3E06ED0199CC647EA155FEEF503BE045BEA4035C07C4CCEDA306B8187185BD06C14220F2B7401229969C1CFF8C36D499D5A725FA1CE7B44D71E6C0E4E750766183883D838DAE4F00B140E0AFCCB0E72F935018A6314232DC632C5AD3C26919D1A7925BF0F665CA0223439518143486CE92650DD145FDB2E97E0D5BC9D6806F442FE90C9C1F52992E670DB2603AD885FA42B3D8BEA4E470B7F76A367AAA506E931890B6E4607F59E87A7A5FBF3991EEAEE47CFBBFE3CBE028E67BB645D37A7BE5E7CBA6D7955CD62D1D8DB0D9772EA0185C25BC1AD40A09D3E7E9CABA72BDC3A6EF3C40C7ED6208854157914A80B5C66A6DEC2317FB5A529421C03CCA6FC0A3B3D51556E8DEE7C1EBFBA924FE2EBCE8A46BE96E761AA6749C0A9A2B2FC49B42CA47663EA3395DF22DE20947DB14FC1FAD03805955D67F8473BAEFE2C1E22BDCC7BB988DB0DDE4E83E26A16F10B93BD9CFDBA77B9302EDBA0C9AFBA7369A023EF763C55484F7425F842111CAE27E07A511A725F25D422D933F2EC201BFFE3291411AC3CD6E91018C95074C18FC780A73945B148154987854CFA1CF1199BCD03519C8F34774453DF90B71FEA6734DEA7191EE2A5735F7A191F527642D53C844B087E9346B07EDD0B78C36F83445825E60A13C424F72530E05F75DA8D33957FAFF004DEB549985790956A0E7D9B256298D56BC6206F1E4E1E958FE298641A277A2C8B6B9B7660DBF689AD7E1A19CBD965CBEAA4A0D30741586290576996AE668ECBAB4F06F2A1D542E32C5D3F042E7E29A41BF86BAE29E7029D997876CFB23B10986A45CA029739B2446A29C55561AEE8FFB187961E6E7401D726AF6D8A5C816B2CEAA9A1C9B780DDCC4F0E4003542B193AE26EC687F8C51451D2D5387D9C3B9EB95981DF2DE069FE741CD5C15F6D1B12C5B9B94230ABA33BF46DCE8AC7E26896EDCB4F87272C32D19E72C313738855C02C6F46F1162BE0A3ED2E76704B16169689BF532EAD7AE7F2B26F4D9B22712662BEEA1F46748FA4C27D1D825D3FE493B5B3B513617C81D21A0912D329C5A4E3A90EF5A29A4E3137D1CE3EEE99C42D034E61593A4076EF124BD6BCF8FC911FC9F6077D82C2980C2ADB955939441BC9E81BDF9D6996CE578114C01F9BA096D6EA40F4E0FBB18B3E3D25E7F6D6CB670AD26F604368ACB6190667B7B7ED3C1A1DA04E42AE0087852834B91AA072AD51C0193E5299481221BC9083118F7B5503559F1E2D9E22A8D57932CD0B59509E7D7F459E20EBF4C1D0DF71472340E64992C0485D593714D6B469547616DFEAFC95089689931E79944204A6D0A47A565DC325F3BE19FD44BB6CD4BF2B1D4A78C883154D70705E121B833A4A7E7E80FCDCA03F52C1F831AB0D989AC5DBB5CD83BABCB3EE74B69681818DC05E33234775123F552CFC7C7BB0B98C937957A2C4E86E3D775468A7CB8D33756ED7489D04DBE52EAA2737EFBC4C4D0F55B5A841E1453763E611BAC358FAD0B5778C6015D97CC42CA9FECC66CF844DFE55587C200DA5250B3A419791F57D3A4F672551BE885DFE2AA8637D6C890EE8E1063E782FD7E2CB356BF47B6EB93A155D8D64C9F6CCA3971C5A7FACC3C052A2AA9FB286750F76933261AFF5CE408BDA8382AF8535145F432F78B3B25A768B5DA2A211D1D07AB557CABC7A139F66EDBB744AA76E0FBF22092E31C92CAFC624EE1DC6732F27E8E7632C6EEE2D1F5C85B52D712C884B36C91DA383F0DE9E06E5EF63D7B7A692E5E91BA1A1D9298E26694FAAD9EF262F117DF8115E2E877197A8069A96210CE65D45E6AA7011654ACFAFDA810CCCC20C1985D54483DAE12B29D7ECF66376968B52FBD727CBAE7C9E3DBFEE7391D985228ACA9EB8EF98FAE32BD24552A6B34BAA581DBB03676A3A4546E10EFCEF269B18E1172F560FA0F0344149543551E079C1745BC0425B5233B7D7DC32F751D321638EDB1CEE56DF0359EB6D9863CF3E341A56060C8EF8486014F956C39B751AE239A493A017B2FA5210D374BA83DF5D799B7CD92987FEBB0B2CDB3EE42A61381304C5EAE2ADD4777011C3279BBCD1EDD6F91FF72B3C353AC35DA8FA843DC5561D3CDB507730E8BEF20CF09B0DDC36D47F4C10D82652DC2937D889F83B1DDC30E52B244250D19EEA9CF7A3B5D931E2E25B64A0A81B2C4FE933A17BEAC2E10FD888D07F994E4F2583D204DA126533F5E36B62486A00CCC317C4381A8FE11D36C43E71BE108E22A98F53729F05A5E0AA38D512423DB4BC1D6BFAE9117383ACF94AE2A737F6B8070858BEAF08E365CA84925F8BEBAEEF5AF77EB73A9D3648AAA6493CEBDDB95149F0DAFACF129FC321E558084A44CCA4B429D664D90DD90F2A04818B48D135952746CECA76F99B947A33A3BF7C535B187C1971AF4FCB1EAC841BE7E96F429DD38127B52FACC2DD6512D8D019E0080CADBF7078FC67E9AF170A2A00F70F407B0A7FF469E2F6EA165F8B43EEF1779A115089DE9ABE6B78C93E4B8E3B018686D16CE8EBC88CBC1D571372A3996C9E5967C035F9DA6E200E7ECFD1CF7158563F36A3AAC3CD8ACF52A4EEE29DCEB03FA3272A671CFC9B +pk = A9ABBB48FCC238E917694739CD6ABB6C8BAAA1DE18BC989FFC3500DBBB1B0934FA9B335CBF683D63038A53C4940E8B061469CABCBF9BA0C5FEBC3C7F0B0A0AD7DE8222242CA669D895612332584D572F1CD163E84003CE9A65BB1B40B94A574004 +sk = A9ABBB48FCC238E917694739CD6ABB6C8BAAA1DE18BC989FFC3500DBBB1B0934FA9B335CBF683D63038A53C4940E8B061469CABCBF9BA0C5FEBC3C7F0B0A0AD7DE8222242CA669D895612332584D572F1CD163E84003CE9A65BB1B40B94A5740047BE77D931FB1B8472DB900327CC7B425D0730A9E2744B06E6A0C0000000000000000000000000000000000000000000046F9C0376A3A611AD94A892EF2DD952927BBD44B8EE2089C9EECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B137D6A05FF246BDAC9A97645608E98A53BC4263259CCA1D1EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DDF4F95CA441773A163BD38D5F0B9B1E9B7F9CDACB010259424333186BDDD7EE877DC4EDEB84A0326254E6979F654F00D730663F077A1BF8127F4E3D1C04E4E46576B822B6AEA87122969F5F017E165B673B727386005E979FE80CED7277530009EC7FF85DE46E04976D11A3EC57E63804ED73F46412605D22A4D46BEE910BFFBCB2C7C929AB75586D9FD2D6C672A300C08387263269ABF4144331DABFEBABACF913395CAF344E8AECE965FF3CD2A6350C4625209F0421EAAAC8916C66EA9C00 +smlen = 2105 +sm = 408699D637AE75C8A39F16F560DCF436DE0AAC5E8E8B94355BE48FC4F1195F57B01E4300C55442F48A6C746D0FD88C1ACCF881873638A74E848E3E12095A5DD008C97672898F439DB45EB336CC48B7D973E74E046931684B17E749F985D14A3C0001CCA46354C5EB290DA53EE61714316EC3D47574A017BC6B9901D589E3EB9F825A171401740E2060A26BC81EB8BD84DFBBB60162AB5685A644789EFAFBBC1E0ABC7C90416666D6235F2CF20225E33055A3400020B643780BABC0528F72D8319B9E3AF86C000078F4230195C2B4D1C29EC981164617B4A8786152A1290002170707EA05515798829F42A4CBDDB4A95C5750879E0A584AB503F778015F83BEBF6D63C3B48A4F478EF01091403DDC5A9662E39707DBC8502ACF50F3E06ED0199CC647EA155FEEF503BE045BEA4035C07C4CCEDA306B8187185BD06C14220F2B7401229969C1CFF8C36D499D5A725FA1CE7B44D71E6C0E4E750766183883D838DAE4F00B140E0AFCCB0E72F935018A6314232DC632C5AD3C26919D1A7925BF0F665CA0223439518143486CE92650DD145FDB2E97E0D5BC9D6806F442FE90C9C1F52992E670DB2603AD885FA42B3D8BEA4E470B7F76A367AAA506E931890B6E4607F59E87A7A5FBF3991EEAEE47CFBBFE3CBE028E67BB645D37A7BE5E7CBA6D7955CD62D1D8DB0D9772EA0185C25BC1AD40A09D3E7E9CABA72BDC3A6EF3C40C7ED6208854157914A80B5C66A6DEC2317FB5A529421C03CCA6FC0A3B3D51556E8DEE7C1EBFBA924FE2EBCE8A46BE96E761AA6749C0A9A2B2FC49B42CA47663EA3395DF22DE20947DB14FC1FAD03805955D67F8473BAEFE2C1E22BDCC7BB988DB0DDE4E83E26A16F10B93BD9CFDBA77B9302EDBA0C9AFBA7369A023EF763C55484F7425F842111CAE27E07A511A725F25D422D933F2EC201BFFE3291411AC3CD6E91018C95074C18FC780A73945B148154987854CFA1CF1199BCD03519C8F34774453DF90B71FEA6734DEA7191EE2A5735F7A191F527642D53C844B087E9346B07EDD0B78C36F83445825E60A13C424F72530E05F75DA8D33957FAFF004DEB549985790956A0E7D9B256298D56BC6206F1E4E1E958FE298641A277A2C8B6B9B7660DBF689AD7E1A19CBD965CBEAA4A0D30741586290576996AE668ECBAB4F06F2A1D542E32C5D3F042E7E29A41BF86BAE29E7029D997876CFB23B10986A45CA029739B2446A29C55561AEE8FFB187961E6E7401D726AF6D8A5C816B2CEAA9A1C9B780DDCC4F0E4003542B193AE26EC687F8C51451D2D5387D9C3B9EB95981DF2DE069FE741CD5C15F6D1B12C5B9B94230ABA33BF46DCE8AC7E26896EDCB4F87272C32D19E72C313738855C02C6F46F1162BE0A3ED2E76704B16169689BF532EAD7AE7F2B26F4D9B22712662BEEA1F46748FA4C27D1D825D3FE493B5B3B513617C81D21A0912D329C5A4E3A90EF5A29A4E3137D1CE3EEE99C42D034E61593A4076EF124BD6BCF8FC911FC9F6077D82C2980C2ADB955939441BC9E81BDF9D6996CE578114C01F9BA096D6EA40F4E0FBB18B3E3D25E7F6D6CB670AD26F604368ACB6190667B7B7ED3C1A1DA04E42AE0087852834B91AA072AD51C0193E5299481221BC9083118F7B5503559F1E2D9E22A8D57932CD0B59509E7D7F459E20EBF4C1D0DF71472340E64992C0485D593714D6B469547616DFEAFC95089689931E79944204A6D0A47A565DC325F3BE19FD44BB6CD4BF2B1D4A78C883154D70705E121B833A4A7E7E80FCDCA03F52C1F831AB0D989AC5DBB5CD83BABCB3EE74B69681818DC05E33234775123F552CFC7C7BB0B98C937957A2C4E86E3D775468A7CB8D33756ED7489D04DBE52EAA2737EFBC4C4D0F55B5A841E1453763E611BAC358FAD0B5778C6015D97CC42CA9FECC66CF844DFE55587C200DA5250B3A419791F57D3A4F672551BE885DFE2AA8637D6C890EE8E1063E782FD7E2CB356BF47B6EB93A155D8D64C9F6CCA3971C5A7FACC3C052A2AA9FB286750F76933261AFF5CE408BDA8382AF8535145F432F78B3B25A768B5DA2A211D1D07AB557CABC7A139F66EDBB744AA76E0FBF22092E31C92CAFC624EE1DC6732F27E8E7632C6EEE2D1F5C85B52D712C884B36C91DA383F0DE9E06E5EF63D7B7A692E5E91BA1A1D9298E26694FAAD9EF262F117DF8115E2E877197A8069A96210CE65D45E6AA7011654ACFAFDA810CCCC20C1985D54483DAE12B29D7ECF66376968B52FBD727CBAE7C9E3DBFEE7391D985228ACA9EB8EF98FAE32BD24552A6B34BAA581DBB03676A3A4546E10EFCEF269B18E1172F560FA0F0344149543551E079C1745BC0425B5233B7D7DC32F751D321638EDB1CEE56DF0359EB6D9863CF3E341A56060C8EF8486014F956C39B751AE239A493A017B2FA5210D374BA83DF5D799B7CD92987FEBB0B2CDB3EE42A61381304C5EAE2ADD4777011C3279BBCD1EDD6F91FF72B3C353AC35DA8FA843DC5561D3CDB507730E8BEF20CF09B0DDC36D47F4C10D82652DC2937D889F83B1DDC30E52B244250D19EEA9CF7A3B5D931E2E25B64A0A81B2C4FE933A17BEAC2E10FD888D07F994E4F2583D204DA126533F5E36B62486A00CCC317C4381A8FE11D36C43E71BE108E22A98F53729F05A5E0AA38D512423DB4BC1D6BFAE9117383ACF94AE2A737F6B8070858BEAF08E365CA84925F8BEBAEEF5AF77EB73A9D3648AAA6493CEBDDB95149F0DAFACF129FC321E558084A44CCA4B429D664D90DD90F2A04818B48D135952746CECA76F99B947A33A3BF7C535B187C1971AF4FCB1EAC841BE7E96F429DD38127B52FACC2DD6512D8D019E0080CADBF7078FC67E9AF170A2A00F70F407B0A7FF469E2F6EA165F8B43EEF1779A115089DE9ABE6B78C93E4B8E3B018686D16CE8EBC88CBC1D571372A3996C9E5967C035F9DA6E200E7ECFD1CF7158563F36A3AAC3CD8ACF52A4EEE29DCEB03FA3272A671CFC9B + +count = 57 +seed = 4E94DD734A371A7C6AD4A567038CF93BAACE2B9D30F3862198DC55D2F21F8FDC9A7AE5DCA1541712179E3AB1FFA3F792 +mlen = 1914 +msg = F3EA695264936D537D86E545E132131442C2973D19B37F8C911E3ECEF4A13A8B1EDF5E5968A6198D26205FFE6B76CB14E353B5E2C9DE1BD44AB9BD55862BA1A479833335725EF52601810C778DA4A32C497CCFA43F91C72A1499E8D295AE7CDB43F1CA05F0D4A31B30D9A69CAB8288640F3F9E081E2C98CC8351C7EB9954D428DA4BB374B346A83EFF5AA3F455F2BB3FC922F901BBE5695E3AB9892A93BEEF90FC150B3BB47F6965C229F7DCC3100A4101840417A0E2547F9D42AB27216254A2898368BFC60E7D407271C213233B6913C8E48DF10967757BFAF5B5E2A284B8F67C70537C97583786B5185B45E2E36BD8B5443E98601F772829176C4D66F44A81AAE7C13F539490640BFC40B83E1C75305B06BE60E18A0AB568859435B715E15BA1EE4DE73E04E1B09DD15350AE423C131706F057255E9FA8FA3F9E3ADE7435A6451F7A2AAD0C0FE0F444C4A247DCBAA49E7C926DD52A33D3737B4439C1D40F861720E37BD25366EB5F34BF4B552160F3EB80CA8FB19304E1E4143090F8E965DAEFF17551A3931905B5CD991C6BC5AF5BE808073893A47FBFEEC0940EF5E7D2F2EE199847E1A4BEA447BEC40F86F6FDAEBECE6FF0F66E04193355C9576DD4AAB2D796CFEE5D432B1D32E13B8903A06FFD3AECB00C169A3AF8389848CEC724F647C6BA8DC3134CA18586DB3E4138601A16DF8873A490F23C4D27FD9C3D4FABF2BDCBA4AF3F0793E7B591198100EC97602D9BA572409EA49D7C8EDC646335FD4494577720EA7CDF3B4266FC201DE4BC204C0D35CFB55010BFAC68CA0DF3AC936C9FD2A9C532B8E3461D25362EFA37DA159B64670060CAB833ECA799FCF1342C7EE1B80BDE05ABAD08B9EE8908D50CD0D433DDA0B120D1980F690ACAD9C072502AB537EF71B691917A76D3098C27FDC6FAD1F1B29E307E17C87D9FA6A06CF8CEF6568D9E4E005FEEFCB5F41A46D91E31B41268367D636C4478921E690D5D57E99DA3448773D51B673109CFD3A58CC50C127F34F4963FCED6C216E60EA0952317FBFE88807BFF4223624F6126104CB46C8D39EE228BB4FC0002287E346E5ACE43E2CAEC07A22203FE3C4AA9008A94F7075F6E449FB89905BB955FA0023608C494F7B73D2AA4E2B0A8A7E3CAA889B6B6A6640F7222EF969D46FF6794BD97C5363921461BACDA17F2781E14419436E37610E52E3B7B7BF9C1A4B1D80876030F9A8981DAA4F06A432DBA739DB988BED5DE7F38378EC1F7D8A46B305896CA0CAA5D8AD74002863C6FF91EF25AE96450936509EFA93F94718E895A82B4616A965AF004038E0897A6563DBC91EB5A6172ADBA052250D06D210BCF5A250246FC3482E57FCD9901104C5AD58EEFFAC2860A4DA9D2C308552EFBDA2D4275F3F3651E9935A0E42869B9263FC7EA71079E604A4EC6DC61CEF6AC6CC06194DEF432C1F7CD9EDFB0C4B448DAE3C2A685BC818B2A90E17A4C1CAAA5FC2632F720E764E2B8DA314224498119A0D94CF5DCE24176421C2736575672B361119EC7C766265768CD9FF1957A17779C11244C1CC82D72D4E3C87107885F71C56DA2BC41008B0BC1375C12B3B2A80071EC03E377A93BFB227BD560EDD5E5D88F46F7FF9831F05BF262F01F62278D3DC13F4F0CECA0509091C25D20666D8D3527975CA3495F6843B46B5D5B6F5C650E981DEFB3943963E14F00A0F78CE785A21634C46B531B4F2AC5AD0F03D92372C334CE963E514A1891716EB5D5BB1B67834994EDA492719032E2A4F961DDD6D2002D8F52798C45A9DA8145BFD191E97D1FBA1B395858B0FC7D5F5A54E69FB3780635F70A763E44075075580778676E6B9705B40F40210E597B5AA1AA77BCC3BE5005159A4B68CBDC6AD8674495E0DF65A6DECABAFB993CC49C082D358DB1E5B3A8AF2FCB0049A15BF521986AD84148135CDB185FDDCA6802C2ADE9EA2E82047725D73F51E072CCD799D696D7530F61B16E9B4727C58CB0F552B188F9B451BE543BD809B63D66BCDBAEB7AA917BE6AEF05DF559B3AEAF65D5EA12E852D1370EFD6197F970F52292F27923A10D01AEB652A9A44573C137257B49D130F1DA48E532B3E33D4854B995534380B4549511B39A99145AF5ABE0CCD3A9DBAF673EFC115CB75A9A5A806679907BB525A2BD4507977329EB4C985B3575DE6533FC5D62358C21AF3DBDD20DEEFD7C417C77D37DC2A098A8FA48F7944B7EC6F929387BA11E3516C9EA681238650416FFB97EA343D5F227BADFDD509B94C1451C54F85E4539A8F70DBB5EFBB10B2D82A16FD0C997C603B8983CEB840A7C3B61918D8A97766BB8442C3B9EF2D324E28DC19748417D32F642874A8927688C74BF4F6F6724015C4DD50EB83B85F613FA20938F5C895F88830A40C9799C212B2DFB453BA0BC534F75CEDAF7A016F6744CB4F5269FBF0284EB90CF1023918078024C3B125CD9C7501224050B4D20B585472B42A0F494513ED131BCD8F75E223317F56B37CA48780750DE0BC81C74A3388C94D93A65719122E9D533274811B76965265D7B2F91EBE3C5924ED2D4DD5E327A6E7546AA2605E4C78D0208DB7A7F678CAADFB32E6BCF8C77FC7810F7D1D5D50E26D1A0DA03B8AFCF99904B2B3198670462451925381F0BC404C51F2F18FA7E2C1E8B0C6CF97A9A65E575373996C3E9DA15A18D15C93548377677DD713C9828DC4E4EE823A241377C65A2948BD29447BFBE +pk = 770537D6205BCCE545199412D69FC527B0C1283A9F6EADDCD776AE11087F3A3CBE214475E9F5878D8FE38EF8E7D2710CEB97CFC2777CFCC97EBDB4DEED248695AA57670F6D87C1DDB7598B1D604D3C9B5135DBE174F442C060DCFA713B5E002A12 +sk = 770537D6205BCCE545199412D69FC527B0C1283A9F6EADDCD776AE11087F3A3CBE214475E9F5878D8FE38EF8E7D2710CEB97CFC2777CFCC97EBDB4DEED248695AA57670F6D87C1DDB7598B1D604D3C9B5135DBE174F442C060DCFA713B5E002A1297A977019554CC3BC42BC4446B6096B2D9823FA91E0C85E35001000000000000000000000000000000000000000000004C7130A1D6110D001076F7091B07D72EEC6267C894FF81F88CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1A2F59C8E28F81644FB57FEA856F73B17B4337AE4090D20ADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008B23499DB3408E3A5664FE3BE139C3E8BBF982478EB2AAFD95452921100BAFB01DAE13F9A43720E8BD83B713E4078E004F2A514A1CF22535CC7CF8FC4BD98005260E41B73A6D5B222DF9FFAAACE573A936820C169929685421FE1CABEEB8E600DD1F0A06535B849C5D6A6EEDD5B0F68B77758724230B4A55F0B3D8877CDA07C947C3AFE9ABE8EA60BD2CC8F0EB451B0096FD9BEFA2D85664CF3104A9D3247BC03C1E4D806A60678F03965124FDF65C187753821E3E14B413CD590C6528AD2000 +smlen = 2138 +sm = 35FB556511666F78006472E283495750501010D88F9BA3BD600C5A600B41AD7F2CCB38FEB5F125139C93639E76BD6B3A567B35C570205A33EBCB4B31544E6757B49BBD970C14CC2CB8F3B076531309D4E40956713A493F2CF0AC407CCAAAC127010068A442E192614C0DFA478E46D1747A5E65D142A613DE9E760189435A91097C6015C05C628FF5A3EF8964A9C1F73050684B019730DD70A005C67A21F35456B2AC1FF24432ACC4B7FBAA0C001112E57E5747FF33F507431B1127F3D8DD23473491F6E76A019165B4E1E60FCB06496E8D0BF34EBFF27ECBFE2C39FAB0000D08F3EA695264936D537D86E545E132131442C2973D19B37F8C911E3ECEF4A13A8B1EDF5E5968A6198D26205FFE6B76CB14E353B5E2C9DE1BD44AB9BD55862BA1A479833335725EF52601810C778DA4A32C497CCFA43F91C72A1499E8D295AE7CDB43F1CA05F0D4A31B30D9A69CAB8288640F3F9E081E2C98CC8351C7EB9954D428DA4BB374B346A83EFF5AA3F455F2BB3FC922F901BBE5695E3AB9892A93BEEF90FC150B3BB47F6965C229F7DCC3100A4101840417A0E2547F9D42AB27216254A2898368BFC60E7D407271C213233B6913C8E48DF10967757BFAF5B5E2A284B8F67C70537C97583786B5185B45E2E36BD8B5443E98601F772829176C4D66F44A81AAE7C13F539490640BFC40B83E1C75305B06BE60E18A0AB568859435B715E15BA1EE4DE73E04E1B09DD15350AE423C131706F057255E9FA8FA3F9E3ADE7435A6451F7A2AAD0C0FE0F444C4A247DCBAA49E7C926DD52A33D3737B4439C1D40F861720E37BD25366EB5F34BF4B552160F3EB80CA8FB19304E1E4143090F8E965DAEFF17551A3931905B5CD991C6BC5AF5BE808073893A47FBFEEC0940EF5E7D2F2EE199847E1A4BEA447BEC40F86F6FDAEBECE6FF0F66E04193355C9576DD4AAB2D796CFEE5D432B1D32E13B8903A06FFD3AECB00C169A3AF8389848CEC724F647C6BA8DC3134CA18586DB3E4138601A16DF8873A490F23C4D27FD9C3D4FABF2BDCBA4AF3F0793E7B591198100EC97602D9BA572409EA49D7C8EDC646335FD4494577720EA7CDF3B4266FC201DE4BC204C0D35CFB55010BFAC68CA0DF3AC936C9FD2A9C532B8E3461D25362EFA37DA159B64670060CAB833ECA799FCF1342C7EE1B80BDE05ABAD08B9EE8908D50CD0D433DDA0B120D1980F690ACAD9C072502AB537EF71B691917A76D3098C27FDC6FAD1F1B29E307E17C87D9FA6A06CF8CEF6568D9E4E005FEEFCB5F41A46D91E31B41268367D636C4478921E690D5D57E99DA3448773D51B673109CFD3A58CC50C127F34F4963FCED6C216E60EA0952317FBFE88807BFF4223624F6126104CB46C8D39EE228BB4FC0002287E346E5ACE43E2CAEC07A22203FE3C4AA9008A94F7075F6E449FB89905BB955FA0023608C494F7B73D2AA4E2B0A8A7E3CAA889B6B6A6640F7222EF969D46FF6794BD97C5363921461BACDA17F2781E14419436E37610E52E3B7B7BF9C1A4B1D80876030F9A8981DAA4F06A432DBA739DB988BED5DE7F38378EC1F7D8A46B305896CA0CAA5D8AD74002863C6FF91EF25AE96450936509EFA93F94718E895A82B4616A965AF004038E0897A6563DBC91EB5A6172ADBA052250D06D210BCF5A250246FC3482E57FCD9901104C5AD58EEFFAC2860A4DA9D2C308552EFBDA2D4275F3F3651E9935A0E42869B9263FC7EA71079E604A4EC6DC61CEF6AC6CC06194DEF432C1F7CD9EDFB0C4B448DAE3C2A685BC818B2A90E17A4C1CAAA5FC2632F720E764E2B8DA314224498119A0D94CF5DCE24176421C2736575672B361119EC7C766265768CD9FF1957A17779C11244C1CC82D72D4E3C87107885F71C56DA2BC41008B0BC1375C12B3B2A80071EC03E377A93BFB227BD560EDD5E5D88F46F7FF9831F05BF262F01F62278D3DC13F4F0CECA0509091C25D20666D8D3527975CA3495F6843B46B5D5B6F5C650E981DEFB3943963E14F00A0F78CE785A21634C46B531B4F2AC5AD0F03D92372C334CE963E514A1891716EB5D5BB1B67834994EDA492719032E2A4F961DDD6D2002D8F52798C45A9DA8145BFD191E97D1FBA1B395858B0FC7D5F5A54E69FB3780635F70A763E44075075580778676E6B9705B40F40210E597B5AA1AA77BCC3BE5005159A4B68CBDC6AD8674495E0DF65A6DECABAFB993CC49C082D358DB1E5B3A8AF2FCB0049A15BF521986AD84148135CDB185FDDCA6802C2ADE9EA2E82047725D73F51E072CCD799D696D7530F61B16E9B4727C58CB0F552B188F9B451BE543BD809B63D66BCDBAEB7AA917BE6AEF05DF559B3AEAF65D5EA12E852D1370EFD6197F970F52292F27923A10D01AEB652A9A44573C137257B49D130F1DA48E532B3E33D4854B995534380B4549511B39A99145AF5ABE0CCD3A9DBAF673EFC115CB75A9A5A806679907BB525A2BD4507977329EB4C985B3575DE6533FC5D62358C21AF3DBDD20DEEFD7C417C77D37DC2A098A8FA48F7944B7EC6F929387BA11E3516C9EA681238650416FFB97EA343D5F227BADFDD509B94C1451C54F85E4539A8F70DBB5EFBB10B2D82A16FD0C997C603B8983CEB840A7C3B61918D8A97766BB8442C3B9EF2D324E28DC19748417D32F642874A8927688C74BF4F6F6724015C4DD50EB83B85F613FA20938F5C895F88830A40C9799C212B2DFB453BA0BC534F75CEDAF7A016F6744CB4F5269FBF0284EB90CF1023918078024C3B125CD9C7501224050B4D20B585472B42A0F494513ED131BCD8F75E223317F56B37CA48780750DE0BC81C74A3388C94D93A65719122E9D533274811B76965265D7B2F91EBE3C5924ED2D4DD5E327A6E7546AA2605E4C78D0208DB7A7F678CAADFB32E6BCF8C77FC7810F7D1D5D50E26D1A0DA03B8AFCF99904B2B3198670462451925381F0BC404C51F2F18FA7E2C1E8B0C6CF97A9A65E575373996C3E9DA15A18D15C93548377677DD713C9828DC4E4EE823A241377C65A2948BD29447BFBE + +count = 58 +seed = D9281003AC5F7673E0E9A7BC29C4ED75E6B0F228DF49D11A2599BFF2DA9E887163BB26DBA4F071FBCE02891540EC6F1C +mlen = 1947 +msg = 437E0F77BD0E14D704BE86135119F39A0A65650C762852E2694AD9BF2EA45C7EE59DF915F5AAC128309847E944127294566FFB193D0361DD7111D32B06DBA60A12E053F424DDD70674E902E409BC6F5891CB9A76108322CDEC1491D3D89A74CEDD855BB0791DD6DA371A75AE979593B5159FBE9DDACF88506E6A184547E2A7395A46FBAAAF286EB7780B789FED86F257E5036A3555E777B909243695CE89957DF492C80050457AFD84AAD9F8918099AB00FD7AD3528A3D0AFE5B52300053575B839572D4D7CE43C255BBF5F16948D40BCC2E63714487AFD3638601ADF47A324482ECC99FB88574538809227F8C0A5FA7F20A0B2FEFDA38E6A665550E44B8D5630290A4815621A5DD74A2108CA946241C48661EB087240788808BF676B145442B2DE4C35E1A6B8CB1E97E54CB729202D8827A0D4994C6D7F3F406ED273B00B6590006AF069D69173B5EA8237B87705F362288AC3A50BBE7E70EB15DF6ED820D66290F57A87E51B2C5777C9C95C2A76ECF2E296A7C295BFE029BBE681B32A6D9F16D11C7CA2750E2F8877AF5DDB616D8A820DE998B0B2AF5B0C2C5641F498C99971932327EC2C73C0EF4058D9F33683F60553AD2962370AFC6725743C86E591D7D7C20944479DACA5E92D66A33CA0C862DC60DFEB5EC3C6E7DE356F6E43F06B1431358285398F8885176D60CBA218217DC7AFE4AD876D0890648052A56812BC3F8A9E6C49F9D70B0A032924B891A9410BBE2F214C842BBF0511EF9017744A0DBDBD500A4189B471930E25216D2588CF8BA39AAE7623966CC62D6C4ECC8B00B0613D912E60ADF613C8F55B778EFB93A513A776C64E8DC943E6272C0EAB4004B4B05CE9BCE9CE2F2B86FD8429E9A72CB16EC3DED285339EDFCD122150F4E7310F669B1DD4CD7E76D282D10314E8ABF61D53BF343F3EBF9968E1BE8F3785581F675BFC28C893729CF67345D0F7C11D6E7D6DA0BFF255BF706C986704A3B9C6FA0602C6DC108A59CCA70F624B08E4F5393E597459BEA4AAAA463A3B08DE147E10DE6B75A0D87BB79BA9A71E7F5999C8972BA992228B60912AA2D7A32703BA8BC02F774430A2B590911D48D3866396F1D71F19CA90EBD5277743A984E2156CB57DE88EBE91BCC09CCB5C687CBCD4E48E4EE110F4075A21F9A051700B0C2698FCD6A5A73372CA366A230A9ABD153E4DCAB7A33A8226F8458C5892098BC0A95619880156548F300C40BDEF81E8C1D8BD03031C690B7C3C000CE99675ADB4B94752EA22BC9E0278D0A53A2A19363A9388BB8D6C24A45B5DEDD8F7482E9C29603FF182F25856FBEEE2B41B88B352F99DB5F33D8EAB1A1A1FEDE60EA6CFB7478DB7540D3A286E88117503C4D0A2C13D32AFE3F1A31D1AF9EE60EAB8FE06248CFFFC7BB438B77D94B5644805CC276F19268DD1FFEFBAB3C796923288638DA1C15E014723A84F8C2DD9F55F7ADC2ADC13FA7CDC29BAF48CA438C882DA5F7CAA792B7CD984BB11EC4B681B332EDFD4AB4C132B08BFB688F81BAA3FEC5A079E2182C282A3EBE2AD5E4C59090BBB989E6A07D85D604F5FFDE0587ADD29A5175CE65D29FB9FDE3E8B49EDA1D88EE8DD64FA1498D33EBAF4A847EE9FEDD3376AF46C1552A150014C11DDFC5047929E2415D3F9D81186A685A1CAF2F004DE777760F0567E880866320A7B42E61CC994719DDC81E28525E50195FFE4E0467D9A9182B75EF57DFEE926D7744485A55E07D1BCD1C9B9B12A60460BFF016E9834848665F132E2FF87805E00154C7D9853DBCA43D005BB197EEDA3D2D9249A621EFC4177415BB103893C82EEB0AEEA056B40E98B5FE65527432FF33CE3E09FE1288A6E2641011721279253800ABC4B73F65B15B434BD34A573E77A94729A78C92F0E791570A416A0876DB39A8FDA8696FB12E7FA3BB11E7838054E4195164B9676DD03327810CCFF9586217AA3D50E7D3EBDB1AE1BF6889DF316047CBB278CE8C9741798452A38E48A7138E1FBA286B497FDB8B1E7BF6145C5F29ECF6D5430F8E550314DB3CF48F27897F312C6D9D6357A880B721E5148DA7F789238CE411F952695F4A878756BDE311BB4E62F10C2F9939B8530EF70D3FB431655AECA2AD36BB5DF0582A07F53F1DF8E0325E635D5A5E795C130106502A081F2FC52A9D97C5DAAF174F13D2DE1EA0F8860F08F4FD5B571E1AB1E84437F3C82BF19B96E46513C316BDCF994BC26FB8461F90594E08E6D4A032C1DA38481A1AD7BFB7D5270255BFF23CE035535CF478216E6D2E62E147AD93357D62636B1AE42C4E8433BB94CA91D0F8EC265F2793514543AA86B786D9760BE5C77AAD5A8449A7DBE92391EAAFC305C1267A68E6ACF0F044FC144D82C917992748B9232DEC4E33EC97534F2BF60B56EDBFF675F0343C9C78E8A8D0529A78E2EED9F998B360360352009F01905C1A4815A36B111CAD8E5B34688B99216171D4F57283CD669DC05995BB8D94ECBD3E7B662C4A603BD85251F2BA35FB6CA492C2B3E996FE66A1EB904CCD61B0900E7DEDCF136F50E4C3AD5FC312A2DE4B3E51F355D01763692C0722C700A544E681A316A1D261FAD727E557398E500F15DF33883ABE9D1BA645936891F5A91FF6C8A7B9B6FE5062718542DF4FC4BA50D7F513945482381ADC42D5A9D444CA211232615306D7241FC49F08912BACBAFBB056C018AD4D6021D99FD720ED6548A5A29DAEFDCE868D71A1BA72D9F998A3F89FCFE526493582C4C8AF5C1BE065EA29F6155428DBC955B745DF +pk = 26562DDCCDEDB0544A61A5E6025790E3C17F65E0AC75B58B32168BC1471537535A54026918358296AAB4A8866FA8551A88A42C0A828B611F02DC8AFCF80C36225A3FD957E9C6AD1D2F482B4AF7FD9A4AFB3F33F9706A008AE49D87E4F1D6973E02 +sk = 26562DDCCDEDB0544A61A5E6025790E3C17F65E0AC75B58B32168BC1471537535A54026918358296AAB4A8866FA8551A88A42C0A828B611F02DC8AFCF80C36225A3FD957E9C6AD1D2F482B4AF7FD9A4AFB3F33F9706A008AE49D87E4F1D6973E02F5922D38EDC32D8B3F741E22AD43E812845FB10134EE4E47FA07000000000000000000000000000000000000000000001E9A0D6FB5210F0A59F7609503FC671AD6A43697FAA65FDCD5F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE93ED22EE2C23EB4EB0EE6CEDE74974B798711B61577F16574F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CA4A38DB668862728DC75B157CACD3A74E1E1F04EC27322CD47B62F396B21CE000742071D1FBD878A86887D6638A0F00D1EC07FA3D822296DFE94420BA25083A3DEEF0BAAF4D21CCCA36C0171D6902664D7CF327FF06D04C414683A9367675004D898946316B47487F7D849A543DF1D083D0AF8D252BF135A91A3D7674A38291FD3789D603D610283CE1BC2B3528F200086C66549E5D91DB7C6B2D518A1A3B04A1C8E7115B10186A21027737C68DAF996CCF4AA014B224A52D21D4321AE7AE00 +smlen = 2171 +sm = 634DC56285B89B7407A0264B968B557357E94B7A33E6FA0E9E29DB2810FF4F154E62690E84E92F59C097749BE7510726E02EB84D79C24CDAD793E3492188469EECC7D681B365B086BC774AF7646BE4535A627E2501C1C066A2F41D93D4A0DC1F00005F00544207B8442B63E1FA6750944B388C769F2ADE3E36B2019201F624097EB7AE3EFE80B10EE2F544CD8E8AF77AE36F6C033F15D5A08326EC8587616FB8695B1362B11C09EBB7DDED26000B1697E99401FBAAEAFDF08EDD4780B76ADAA763035CF4360237E1FA010497FB2199D15A40B94700AE2C372EA9AF7AFC001702437E0F77BD0E14D704BE86135119F39A0A65650C762852E2694AD9BF2EA45C7EE59DF915F5AAC128309847E944127294566FFB193D0361DD7111D32B06DBA60A12E053F424DDD70674E902E409BC6F5891CB9A76108322CDEC1491D3D89A74CEDD855BB0791DD6DA371A75AE979593B5159FBE9DDACF88506E6A184547E2A7395A46FBAAAF286EB7780B789FED86F257E5036A3555E777B909243695CE89957DF492C80050457AFD84AAD9F8918099AB00FD7AD3528A3D0AFE5B52300053575B839572D4D7CE43C255BBF5F16948D40BCC2E63714487AFD3638601ADF47A324482ECC99FB88574538809227F8C0A5FA7F20A0B2FEFDA38E6A665550E44B8D5630290A4815621A5DD74A2108CA946241C48661EB087240788808BF676B145442B2DE4C35E1A6B8CB1E97E54CB729202D8827A0D4994C6D7F3F406ED273B00B6590006AF069D69173B5EA8237B87705F362288AC3A50BBE7E70EB15DF6ED820D66290F57A87E51B2C5777C9C95C2A76ECF2E296A7C295BFE029BBE681B32A6D9F16D11C7CA2750E2F8877AF5DDB616D8A820DE998B0B2AF5B0C2C5641F498C99971932327EC2C73C0EF4058D9F33683F60553AD2962370AFC6725743C86E591D7D7C20944479DACA5E92D66A33CA0C862DC60DFEB5EC3C6E7DE356F6E43F06B1431358285398F8885176D60CBA218217DC7AFE4AD876D0890648052A56812BC3F8A9E6C49F9D70B0A032924B891A9410BBE2F214C842BBF0511EF9017744A0DBDBD500A4189B471930E25216D2588CF8BA39AAE7623966CC62D6C4ECC8B00B0613D912E60ADF613C8F55B778EFB93A513A776C64E8DC943E6272C0EAB4004B4B05CE9BCE9CE2F2B86FD8429E9A72CB16EC3DED285339EDFCD122150F4E7310F669B1DD4CD7E76D282D10314E8ABF61D53BF343F3EBF9968E1BE8F3785581F675BFC28C893729CF67345D0F7C11D6E7D6DA0BFF255BF706C986704A3B9C6FA0602C6DC108A59CCA70F624B08E4F5393E597459BEA4AAAA463A3B08DE147E10DE6B75A0D87BB79BA9A71E7F5999C8972BA992228B60912AA2D7A32703BA8BC02F774430A2B590911D48D3866396F1D71F19CA90EBD5277743A984E2156CB57DE88EBE91BCC09CCB5C687CBCD4E48E4EE110F4075A21F9A051700B0C2698FCD6A5A73372CA366A230A9ABD153E4DCAB7A33A8226F8458C5892098BC0A95619880156548F300C40BDEF81E8C1D8BD03031C690B7C3C000CE99675ADB4B94752EA22BC9E0278D0A53A2A19363A9388BB8D6C24A45B5DEDD8F7482E9C29603FF182F25856FBEEE2B41B88B352F99DB5F33D8EAB1A1A1FEDE60EA6CFB7478DB7540D3A286E88117503C4D0A2C13D32AFE3F1A31D1AF9EE60EAB8FE06248CFFFC7BB438B77D94B5644805CC276F19268DD1FFEFBAB3C796923288638DA1C15E014723A84F8C2DD9F55F7ADC2ADC13FA7CDC29BAF48CA438C882DA5F7CAA792B7CD984BB11EC4B681B332EDFD4AB4C132B08BFB688F81BAA3FEC5A079E2182C282A3EBE2AD5E4C59090BBB989E6A07D85D604F5FFDE0587ADD29A5175CE65D29FB9FDE3E8B49EDA1D88EE8DD64FA1498D33EBAF4A847EE9FEDD3376AF46C1552A150014C11DDFC5047929E2415D3F9D81186A685A1CAF2F004DE777760F0567E880866320A7B42E61CC994719DDC81E28525E50195FFE4E0467D9A9182B75EF57DFEE926D7744485A55E07D1BCD1C9B9B12A60460BFF016E9834848665F132E2FF87805E00154C7D9853DBCA43D005BB197EEDA3D2D9249A621EFC4177415BB103893C82EEB0AEEA056B40E98B5FE65527432FF33CE3E09FE1288A6E2641011721279253800ABC4B73F65B15B434BD34A573E77A94729A78C92F0E791570A416A0876DB39A8FDA8696FB12E7FA3BB11E7838054E4195164B9676DD03327810CCFF9586217AA3D50E7D3EBDB1AE1BF6889DF316047CBB278CE8C9741798452A38E48A7138E1FBA286B497FDB8B1E7BF6145C5F29ECF6D5430F8E550314DB3CF48F27897F312C6D9D6357A880B721E5148DA7F789238CE411F952695F4A878756BDE311BB4E62F10C2F9939B8530EF70D3FB431655AECA2AD36BB5DF0582A07F53F1DF8E0325E635D5A5E795C130106502A081F2FC52A9D97C5DAAF174F13D2DE1EA0F8860F08F4FD5B571E1AB1E84437F3C82BF19B96E46513C316BDCF994BC26FB8461F90594E08E6D4A032C1DA38481A1AD7BFB7D5270255BFF23CE035535CF478216E6D2E62E147AD93357D62636B1AE42C4E8433BB94CA91D0F8EC265F2793514543AA86B786D9760BE5C77AAD5A8449A7DBE92391EAAFC305C1267A68E6ACF0F044FC144D82C917992748B9232DEC4E33EC97534F2BF60B56EDBFF675F0343C9C78E8A8D0529A78E2EED9F998B360360352009F01905C1A4815A36B111CAD8E5B34688B99216171D4F57283CD669DC05995BB8D94ECBD3E7B662C4A603BD85251F2BA35FB6CA492C2B3E996FE66A1EB904CCD61B0900E7DEDCF136F50E4C3AD5FC312A2DE4B3E51F355D01763692C0722C700A544E681A316A1D261FAD727E557398E500F15DF33883ABE9D1BA645936891F5A91FF6C8A7B9B6FE5062718542DF4FC4BA50D7F513945482381ADC42D5A9D444CA211232615306D7241FC49F08912BACBAFBB056C018AD4D6021D99FD720ED6548A5A29DAEFDCE868D71A1BA72D9F998A3F89FCFE526493582C4C8AF5C1BE065EA29F6155428DBC955B745DF + +count = 59 +seed = 750A74866BE8DF4E60BC14BF36E6D83ABF6DCBB86792D125CF0980007C5435F40F87BA96498A88252D9C5C6710807652 +mlen = 1980 +msg = E4E3EDCD70C4BBED033F402CEEDC2C265DCA10B2DE0DB00D454C3AE1A0D00C97E1DC8C6804B1777ED21DDF5145B9F9348A931C128A8FB03827F653C37CD95859868DDE356ACE682F627FB69FCD97757BBE8BD5A260A293D2ACF0BFA2C0A3548FE25A2BA1A21F95123D592B40C20A927FDB615E69878E8D7C98D261DC01958A088599D3F9BB5E14002192FC7DE417B1074B3F7B52CD2A699091FD9DC3C5929E51CC0259D2255CAF0E444EC11257B759978BD4A7C8E2CE8473325B7498681102DE6FFE9764334D862E379D9F2EBF9B312FA75D7A50E08B94BD43EEF78722D423928FB8E26FDA85A345EEED0326A5D694E4729154A9997B269407B7D03818025EEB2BA96580626DFDB3BFBFCE100C508170D8150E4980D5D386761F4E8311339B47852ACC2A0A01DAD90D3978DE6536547D4F203CEFFAA652E4F2F28639BC3FF83C485C28EDC0BBE21D17B8ECAF3794D64C36FFE7F07E8A906CAB8E7FC9067CA4BF9B074C7FB01EF99A05D7C0F35D889A63AFE5FF18023BF77F8A3DA0C3CECEA0E538A6DAB5C54F3A0D83151595AD3EC4C45132EC2F22F652EA5DD930E692A7C0D7C23DE84314CAA7C017AD50D430FEF42DE557073DDBA6CAA4A787C92E6E28368943CAD0974EDAEB7ADDF991CCE20BF51C5A898CF0A2104ABB810BD4937D23E5D43490A3194B8A109B745E0A365EFA59199B43835682E996794F16C5CB874C88D9697B189AC54A1BA1F459623C1563CBA7689EBB32DC4FA0BF30E064D119D40C36301A653A4F959C97873003CFF7E8E030A137BAFE0A60AD08E4F692DC107E68AB40EDD0C384875B8525AA0A5EC3ACEAFE557EC76DB5283672F9751AFE1166D53542D216186A3DEF4DFA94E57BFFBEBD6F4AFEC3C0F3F40F651A1251A9AB39C262D42313E9F22879645589EA54FE894AC005115A43DD806B2C8BE6222DD9F02189D4221A9DDE99ECB8C3EF4171776268C12ADC37E4CA92EEF09D2D1803DB1FE917521662BA7EC0C07292C7E2130ECA4EEFFE53EE0CEAAAFF6F4CCFD42186611AFEE79BC651B1ADBAD08458592D69FBEEC708C7537925658BABBE7E9867915C6A728EAF41B0AF2EFFE55207C01652891C373F7A14409D05FE9E26C2E72D688047DE9A0954516B85ED6A3230B6B0EA9C5F086720C26EFBF8B7F5C5D14651D54C4EA181A707C562239CFC08B2E09A2941D04D587B90134D8F670F734578534138CD9CB7EC04437A768FE65FC5B3FBE818DB423A2208E485669082B422AB1257C2529CBF7BA4CB30FA27B7F702418C2EF9C3BF7CDE53661DF716449C6337C54542EADC5209A0E030AD6577DEEACC6BE1813DB24BEC035CEE6AEE93749D524222535A0277600F8E4F4BEB473093C5A00B6666CB319DFF131AE4F004EEB1BF71E5D274E3DFBFA246DADA9D6F548907091045FCCF79B363E695AD54C2F791861CE04874EE8C3375612DE820CEDE04E4472BC3DC19ABBB91C42A1C3D7B467837570E7D20A2CA6405DECCFF1AEC03E0558076E988619CB0CDA9CC87A12367BD486B676A4F71D40B88AB4E7FA750350DADD1A8F12B70864792D3CC1804BE8B7CB9DDA532182C32582015C1788B43054B7010229F46BD39000440E7F5D22E4D52EED85B204B344680426AEF51F0CE0551FEB9672DBF391A9AD363ED090837CAC1E721878E65AF9BA92A0EE7C7979925FBA9F4E452EB4FE3AF03B9EFF0526FF0A331AC0B8CD27A0C49E5019B7025C3C9870C900A7FB31FF834E04B87DB77C4D6DAE4C3FEE741E923704EE5F294D8F881833E9137158D1EE0FBFCB4637ACB814A2A5346607BBCD6BC916235F7875334F2B75A7EA7B8B8DDCDF46C0B8007C9B3A014EC6E634D4173CAFB1DD09CB9ED4A123151F4F2631D4BEE1520C10C15AFEB17198009C2B254C1FF0BECAFBF69BE8C7DBBFC7E8F3F1EF05FF6A7945FF79ED6C317609B9238670DEA26D56D481F87CA171CCFD726CC0728C965D9BC38D376D707E6979908B19FDF7E74ECD2D0671EC338FD54AD6CC5F789E96018521882588F888D7D715104D65954DBA8907C0B7CE3F2ACB802ED49DDF1416C29E8D685C5AD879464819E1D53FDAC741F71E31AC0C17B6C8932A4A00E7164CF8BBFEC36EBBD30392145B292D355FB304A88A638F991F6F89A398B09F1DE4F0B29866029BEE75A12D724A52736F2B9F49937F0E51B0F2E1BD2C1BC9325BBD1061E0F7685ACA02DA735D8FC39646E0B2453BB9690ED1C4853A757EA9DC2F4EB4B5ADBCFCBFB0CD2587F61A24B77CA0D6CFCFF47A98C7098B986D4FBD0E46EF0D1F9DF842F4473C43912AB49F4117C8214A42F3083936C7E8A38B294BA081296A393DCAADDCD0D340AC62511E47DA6591836553EEDB466DA6285359EE831A952E6C7AE3B943636124E43224D527B7D394511CF31C50EC1D3E7A20E49850905D504F1AAE477830E3BDA50430EBD47FDBB0BF537D8D479CB799B0429C3F6591328299A09F45CF9C6D30D5C1C9203B9521D807875D7FB2C2CFAA688414497122161B1B4F159B66C0834E111DA4F82D5252367FD2DBFDC079333FC51AB0D34ECEBBE786F984852A596BE620EC6CF84ED596425B90316A13B39E5EBFA19B319BF0FD1D6C812F29970FB1FFE948BC0D2E057B1DEA15445D71B5F728C72DD0C69E277C58F031F90932994AC5A177926DCC1C570AC1B4B099ED66ABF7DDE5A5D77D08EF1AD7C6FFE018F56EFB07C737F33038846247EEEE147E4A5995BDC3352B73F15FCE5140410AAE3F0AF1764E5AD996D01608C5E6C6C96A20274EA7781B41FC532B01B52134FEE28F501EFD9CF +pk = BF29E889CEB263445B1888174F77EC7795458F38D3D76A3A363339DD744F1D66DDBCE52C6C8A71F8CE0EA9F0F661EE25E54845E2238D025CB591646AAA727D50D95BD738876615F10F8630E0342F260899A2C5502D0F58A163EDB29D5077A53D0D +sk = BF29E889CEB263445B1888174F77EC7795458F38D3D76A3A363339DD744F1D66DDBCE52C6C8A71F8CE0EA9F0F661EE25E54845E2238D025CB591646AAA727D50D95BD738876615F10F8630E0342F260899A2C5502D0F58A163EDB29D5077A53D0DB191629BF1865A038A68E88F93648D89A70AC7169026C9EBE30B00000000000000000000000000000000000000000000AC799084F398188009E480251ED1105EB4D1639EAD4227FEBAEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF037B418B7B6887D36C75E9C121EE45194C17DEAA7C619CE0C5F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009DBE62448DF4FF2EC90267731C45D63B43E337C782B5EC7C259D5870A931F1425230F55C330A7E166D9EE18E16E319002270A14D063E65FAE65118BBB00677B9A3B6786451681BA9D8AC19819A91F2E7367AA41932F97D192DACAD016DA9BF007B66CBE2BCD54A6E4A372AC7FDBADA7FD6805CA9F4D344BB3A3209B1B4AA9D461F0275D7F1C630C6435E9BBBAA793F00832315D168F3AA559B620B70879EBC46A1F229B550190333A852FCECCB0979AD509EB22F985CCB24219D17B49889DA00 +smlen = 2204 +sm = C1176D6DDFB15F4EB590FEBE109B5C90CB26A90EE26A8B8A96F46F5BBCC7F02F99806BD16FAC90625F9C00935D572337F5B7235BA250CEC76DF00A31FD57FED248F4C9949D4B5FDFDFF4DE7E16C152B1CB91FF1417331BAA3FED1A891326EC17000196A7B8CB3575C23018F6DB64A783A789EE7B380B7F674E9E01A76E42B59CA97E11C24D03D2E56940E71C16F2A538C3D00103EE48D8DC5E9BD496C96E231E312745C9786AABA6B94409E6022236B2F9DE16C916F5742CED60BD6B02A408803DB9BC211D038E133928DD38CC552DAC4E92212F6D6729A451C536EA5F000C0AE4E3EDCD70C4BBED033F402CEEDC2C265DCA10B2DE0DB00D454C3AE1A0D00C97E1DC8C6804B1777ED21DDF5145B9F9348A931C128A8FB03827F653C37CD95859868DDE356ACE682F627FB69FCD97757BBE8BD5A260A293D2ACF0BFA2C0A3548FE25A2BA1A21F95123D592B40C20A927FDB615E69878E8D7C98D261DC01958A088599D3F9BB5E14002192FC7DE417B1074B3F7B52CD2A699091FD9DC3C5929E51CC0259D2255CAF0E444EC11257B759978BD4A7C8E2CE8473325B7498681102DE6FFE9764334D862E379D9F2EBF9B312FA75D7A50E08B94BD43EEF78722D423928FB8E26FDA85A345EEED0326A5D694E4729154A9997B269407B7D03818025EEB2BA96580626DFDB3BFBFCE100C508170D8150E4980D5D386761F4E8311339B47852ACC2A0A01DAD90D3978DE6536547D4F203CEFFAA652E4F2F28639BC3FF83C485C28EDC0BBE21D17B8ECAF3794D64C36FFE7F07E8A906CAB8E7FC9067CA4BF9B074C7FB01EF99A05D7C0F35D889A63AFE5FF18023BF77F8A3DA0C3CECEA0E538A6DAB5C54F3A0D83151595AD3EC4C45132EC2F22F652EA5DD930E692A7C0D7C23DE84314CAA7C017AD50D430FEF42DE557073DDBA6CAA4A787C92E6E28368943CAD0974EDAEB7ADDF991CCE20BF51C5A898CF0A2104ABB810BD4937D23E5D43490A3194B8A109B745E0A365EFA59199B43835682E996794F16C5CB874C88D9697B189AC54A1BA1F459623C1563CBA7689EBB32DC4FA0BF30E064D119D40C36301A653A4F959C97873003CFF7E8E030A137BAFE0A60AD08E4F692DC107E68AB40EDD0C384875B8525AA0A5EC3ACEAFE557EC76DB5283672F9751AFE1166D53542D216186A3DEF4DFA94E57BFFBEBD6F4AFEC3C0F3F40F651A1251A9AB39C262D42313E9F22879645589EA54FE894AC005115A43DD806B2C8BE6222DD9F02189D4221A9DDE99ECB8C3EF4171776268C12ADC37E4CA92EEF09D2D1803DB1FE917521662BA7EC0C07292C7E2130ECA4EEFFE53EE0CEAAAFF6F4CCFD42186611AFEE79BC651B1ADBAD08458592D69FBEEC708C7537925658BABBE7E9867915C6A728EAF41B0AF2EFFE55207C01652891C373F7A14409D05FE9E26C2E72D688047DE9A0954516B85ED6A3230B6B0EA9C5F086720C26EFBF8B7F5C5D14651D54C4EA181A707C562239CFC08B2E09A2941D04D587B90134D8F670F734578534138CD9CB7EC04437A768FE65FC5B3FBE818DB423A2208E485669082B422AB1257C2529CBF7BA4CB30FA27B7F702418C2EF9C3BF7CDE53661DF716449C6337C54542EADC5209A0E030AD6577DEEACC6BE1813DB24BEC035CEE6AEE93749D524222535A0277600F8E4F4BEB473093C5A00B6666CB319DFF131AE4F004EEB1BF71E5D274E3DFBFA246DADA9D6F548907091045FCCF79B363E695AD54C2F791861CE04874EE8C3375612DE820CEDE04E4472BC3DC19ABBB91C42A1C3D7B467837570E7D20A2CA6405DECCFF1AEC03E0558076E988619CB0CDA9CC87A12367BD486B676A4F71D40B88AB4E7FA750350DADD1A8F12B70864792D3CC1804BE8B7CB9DDA532182C32582015C1788B43054B7010229F46BD39000440E7F5D22E4D52EED85B204B344680426AEF51F0CE0551FEB9672DBF391A9AD363ED090837CAC1E721878E65AF9BA92A0EE7C7979925FBA9F4E452EB4FE3AF03B9EFF0526FF0A331AC0B8CD27A0C49E5019B7025C3C9870C900A7FB31FF834E04B87DB77C4D6DAE4C3FEE741E923704EE5F294D8F881833E9137158D1EE0FBFCB4637ACB814A2A5346607BBCD6BC916235F7875334F2B75A7EA7B8B8DDCDF46C0B8007C9B3A014EC6E634D4173CAFB1DD09CB9ED4A123151F4F2631D4BEE1520C10C15AFEB17198009C2B254C1FF0BECAFBF69BE8C7DBBFC7E8F3F1EF05FF6A7945FF79ED6C317609B9238670DEA26D56D481F87CA171CCFD726CC0728C965D9BC38D376D707E6979908B19FDF7E74ECD2D0671EC338FD54AD6CC5F789E96018521882588F888D7D715104D65954DBA8907C0B7CE3F2ACB802ED49DDF1416C29E8D685C5AD879464819E1D53FDAC741F71E31AC0C17B6C8932A4A00E7164CF8BBFEC36EBBD30392145B292D355FB304A88A638F991F6F89A398B09F1DE4F0B29866029BEE75A12D724A52736F2B9F49937F0E51B0F2E1BD2C1BC9325BBD1061E0F7685ACA02DA735D8FC39646E0B2453BB9690ED1C4853A757EA9DC2F4EB4B5ADBCFCBFB0CD2587F61A24B77CA0D6CFCFF47A98C7098B986D4FBD0E46EF0D1F9DF842F4473C43912AB49F4117C8214A42F3083936C7E8A38B294BA081296A393DCAADDCD0D340AC62511E47DA6591836553EEDB466DA6285359EE831A952E6C7AE3B943636124E43224D527B7D394511CF31C50EC1D3E7A20E49850905D504F1AAE477830E3BDA50430EBD47FDBB0BF537D8D479CB799B0429C3F6591328299A09F45CF9C6D30D5C1C9203B9521D807875D7FB2C2CFAA688414497122161B1B4F159B66C0834E111DA4F82D5252367FD2DBFDC079333FC51AB0D34ECEBBE786F984852A596BE620EC6CF84ED596425B90316A13B39E5EBFA19B319BF0FD1D6C812F29970FB1FFE948BC0D2E057B1DEA15445D71B5F728C72DD0C69E277C58F031F90932994AC5A177926DCC1C570AC1B4B099ED66ABF7DDE5A5D77D08EF1AD7C6FFE018F56EFB07C737F33038846247EEEE147E4A5995BDC3352B73F15FCE5140410AAE3F0AF1764E5AD996D01608C5E6C6C96A20274EA7781B41FC532B01B52134FEE28F501EFD9CF + +count = 60 +seed = A832D4AAE8076C4EFE8319A74CE315928AB765BB629075254CBC63EAAE691C220F4B5E1839E9A99D8747AACD7C2F1EE3 +mlen = 2013 +msg = 84C603D1B5549C46964FF2987A1F533B4CED94E67D576A3B0BF1C8BD87A74AC7DB640FC9F7ADE44FF79B820846EB83367153F5DDDDF9DFB7848A13D59436916EFABB82DD61291447491D2CA04166FA8680E8E0E0DC98E79344534CA1CBDDB531797A61C291606200107002091ADFA927A763CF98CBBD631CFE890B0ED257AFD34AC0C5280AA7C70BD0C945D78E6FDA284CBB7B3AB636BDF17342F2BA28D707147F14D15173D9BC0B6D65FD1663C86971BE1FA59DA8325E1F3773BACC5B8D4158EF525FDE6E96631C51AD142250252A8E5786CD621210DF3E24CC0B4B60AC2F013D76DB0C73DF40EFAA05A65383A8892276B3D69DD511937D55D914C3222A2386D1BEC0A268E683716AF4AB709D2D225B86229095E87FE70D69E6A34BB214529CA3F082C0F2709E77B86B00B4A04BCCD343C862333B7C9163857B77E30551710CCC3A803323F5CD4EB5317CD2E6A24BFB77727E1C64D0AC47BEEA1CB35E5F2FF6024C06F2F391FEE76F2E69537673FC0124E48E4E2242E84D8AFFEE6803CE6EDF3A954D2C54562B8B76A4EDD91E24A8640AFE67255605849053B60F558B43DDB9F8A04E987D15F6292962D10AD8F7B47188D12D1C9090C0FE8710DC3937C6939496884BDE0BEA979839837C61BE4DF5662C724610C7FCB4631A0A2083417BE6A20F4EED094E2145BC72A83A6E147A655C481DCC906E63ADC0244D95B6085FC096FBCCE81EEB0497F48BB5EF827C0893E331795E3B301DC9F3A91DBA9FBC838E044E2AD9859F1DC67E9BCC375442B4EB59714B5EBBA87AC9A79C99CE74F8BC75740DDCCE46C4B408B91DD7D4AD26B0FB1A4AB874F5504C40E7363838D22AEC45C10D3CC2E233124A5CD8344249EDF388E37BA43598F2C2CF56D444BCEE04A335B154DFA3CA694DB481CBAA59514098CE6E0E4138C0A543EFAFEDA4AECC022C824259A06C3D57A70EA15A5DFC822449A27F58F9EF842DCBB636CE293684E1B331CD821594A12634E5594410B6C5E2306DC8BBE62C8B0F49F2F699A59EFB14D3CAD399F74ED893E1EB43FD770FD61E0C58E5D8CBC9435F4AD0892681A30DF4885927130432186AD4BE41F6FB7CFE660E23C5E55F60789B3E97C3B622599938B36BD1C0BCF6FDB7E4EE44C92B6A86CA2470BCDB8BAB8DF6079382CA314BF3A8B3C4286518C356018FD6F6FCDD9BE9AD9C228F29135544E723A898F483E9D9EE843E75ACB3FEAC447973D12461FEE3D984F3B4F31645FAEA56852D356C96CD73A6F185E8CD56731E83FEA145A2BF0C15ADC634DD9E2FFC799B59A0712EB4D2618680C7493F50A9BBF3F7BDE1025CD44AFDAF4A8C42C9254B1B34AA8559E1CEE9BDE7B4DA0FB3CB2289418110620E505B793B91F422FCF53ADDA8F7C96D55E26244E075D9A70004642712EAC377CE18F88F2C8581694B8F621707DAB6D292179B2A95AEC5AD6E409D78253DCC05ECCDB45683DFFFB9C629AFCFB0654725D650E4A283FD98E47F37AA9309E2933CC0393625DD81D4A02F9D5082644DE02B6472D5D3AAE110747E4F756973FDFCE8EA5F997E30B11EBD50B45F6889D227D87D9184CBC6ED40E96DEF8B9236763C9999E21BFC1A74457FFE5E0DC2B16876FE04C2E0F0F47012A767A7AC18D71A7FD65F8647A7E1AE2D4D255492A18AA81D17D390E381B1722BC3C38BCCEA9D5E73231D0C6E1A96CCB47079E36C994E94AF9A318D67B6408BB602A91D8E9EC6499DEED0B51A9AE31D9774A1BEF4C1DE0E7A324545B2AF9870CD733C2195C5ECDE386D298C33D492937497EA5F0E05C377A4D755DEA9D96C61FE82CF6299EB34B857217A2C6733FED64F5DAC5F95A0EF2294ECA844B96CEB5163363A31C58C88428152663AB0A2B310B1A9E9027CA8CC0DB6DFF528F9A421FA826A86ACB4FD1D79C1AE6123C9E685BA66F5FF109FDFF2497B1A50C2E4E7B4662FA11FBAA305A960CA70FF98E5290A8C3A27B4A3CF1705C6DF4290FA64F3259FDEDE7A81CFDE4214230DFB9EFB20049E905833B5D48923C8CE2F8A104946FB3356154519D950998677C56C8B2C80471A6117B142E26C0345CDF0634E356D80C3BE12F4AB89EB41DDDCF98188EAD2FF420EED3FD9287322F24C62B21F430D5F9B8592CE1CDC946616111C91C667006E47992FE2D5A2AAD82F8DD1AF3C1B8BA5326220645885CC94E8B2B76CBFF7E161E994C0CB9E489B8A5662E9D420913AF34433F5BAB10AC72C5EEB9249F3C102E1762E862C13CC882D20BE16834E54DCC323EA89A133F451B70087A8DCDC5B518EEF087A571B570A7966F1C49BFCDC70AC05034D1DCC56EDC2C0F57D1AAF16718C67D162BA330AA61A2875F90E2935752BFF1EC28A79EAD1AC18E70A833946CA6A15D8765E1A62AEF46BED232EAE89DBEC278297B396CF611448C5FD4B36B95CDC54E3394C63B9B0969D6488FF1C700B390E7226F99A945306C6504958CD43CD3D63910A4324BB662A0E5DB1622D90CE00E50CE7112193872AAB5CEE0B8D6FD42F26C2FB87FDF99062169C0BE75C85109D4E209DC8A640FED3EC71EF3DE8878B3D1729FF118F50F8A33361C6F707F6011454C5D744989EC1BEB644FCF99CB2E7C3CD20E6F1656E07C3566C4DE68593BCBA0EE9F7BD2E272C3D47A3E03985456F18CAFBEBBC1DE74964BECABDF3E9BBB9A10B29BF3B458FD50F19D63A6231CB51CDE3DF46E4BB6318E81E10AD1674A053C8CFE1E72853FD60E6E642642CB825644D6734AFB00329839F22CED734FA1421C4334E20F2ECC8BBC2652004203B3B639FBDCF5FDA1423F08C3A1100655E4763B8D8356A151D702124D30FDD87B34EC4D34BBB3639464E44A693690E193329 +pk = 1DDB86A6C92F87E644F633D1B996102AAFEBF78ED7D4BF10289533C62D6AF1CB09EB7D88EAB9E1180F37BCC656A55411793B7F68CFB75324EC3CA0943AAE45D8C661BA935A32A9A71737AA91C0B43E6659956A354F679F5B590DAB3DD232F81B15 +sk = 1DDB86A6C92F87E644F633D1B996102AAFEBF78ED7D4BF10289533C62D6AF1CB09EB7D88EAB9E1180F37BCC656A55411793B7F68CFB75324EC3CA0943AAE45D8C661BA935A32A9A71737AA91C0B43E6659956A354F679F5B590DAB3DD232F81B1525B1A7096C29BDA4EA4451BE97C5DEFCA1B17D5D5C9CD59883050000000000000000000000000000000000000000000024ED713BBAC905C6DB9CB46B44A9457064A7FA10A0E0FC6A12F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF517DF548E58738F6610AF5AE3377C38D6602B943452B84220FF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004165E6A6E71E2C3ADB8E236A4AA7FB2AE30C36636CD03405BC9FD61964020C6F3D50D805944A87E9245D5253BF36EF00ABB34333D1A135E730D971A8702213E20825FA6B2B2253A40EB946AA5638DC19778B95138A98423CEFF80F1BA2AF32002AC5BDE88E6A3F22502EB78E1F5BE133443293C0B97343F216B7DDB5B0DF0E566AB136AAC6B0B7841A6A983C44926400D51CA85670DF0F889F4A457B84F2297D2AC3B091760D72A4101EBF09470362BE49580805EFA63538F536408FFE8BD700 +smlen = 2237 +sm = 9998AC0A91294131D587C338CB89FE8F93A80C08A4F08E47C1AD7280F88CE118FB5B753EB2C104EF300B6451671DCC05A6020BDFCE165023E72027C7D863966CA7CE2605C427513747745E18D9175D7FEF16863669D084D3449F82FC9A910B2900002CB5622CC4CF1FF47E1C41B156E03E6B93153E3F3451F9B203BB4337234B4E62302EFE73F65DFAD02983025E551E1B382D03F5934A8EFEA4928DA1603A458D3DEB7558EB76F2CDCC941B00F01338A69F2E297E6099585A2F6D9D0E70E4A4FFE28BE0B003AA2078498FF8B04BD3CB58CF13EC69AA11C85802671E4700020284C603D1B5549C46964FF2987A1F533B4CED94E67D576A3B0BF1C8BD87A74AC7DB640FC9F7ADE44FF79B820846EB83367153F5DDDDF9DFB7848A13D59436916EFABB82DD61291447491D2CA04166FA8680E8E0E0DC98E79344534CA1CBDDB531797A61C291606200107002091ADFA927A763CF98CBBD631CFE890B0ED257AFD34AC0C5280AA7C70BD0C945D78E6FDA284CBB7B3AB636BDF17342F2BA28D707147F14D15173D9BC0B6D65FD1663C86971BE1FA59DA8325E1F3773BACC5B8D4158EF525FDE6E96631C51AD142250252A8E5786CD621210DF3E24CC0B4B60AC2F013D76DB0C73DF40EFAA05A65383A8892276B3D69DD511937D55D914C3222A2386D1BEC0A268E683716AF4AB709D2D225B86229095E87FE70D69E6A34BB214529CA3F082C0F2709E77B86B00B4A04BCCD343C862333B7C9163857B77E30551710CCC3A803323F5CD4EB5317CD2E6A24BFB77727E1C64D0AC47BEEA1CB35E5F2FF6024C06F2F391FEE76F2E69537673FC0124E48E4E2242E84D8AFFEE6803CE6EDF3A954D2C54562B8B76A4EDD91E24A8640AFE67255605849053B60F558B43DDB9F8A04E987D15F6292962D10AD8F7B47188D12D1C9090C0FE8710DC3937C6939496884BDE0BEA979839837C61BE4DF5662C724610C7FCB4631A0A2083417BE6A20F4EED094E2145BC72A83A6E147A655C481DCC906E63ADC0244D95B6085FC096FBCCE81EEB0497F48BB5EF827C0893E331795E3B301DC9F3A91DBA9FBC838E044E2AD9859F1DC67E9BCC375442B4EB59714B5EBBA87AC9A79C99CE74F8BC75740DDCCE46C4B408B91DD7D4AD26B0FB1A4AB874F5504C40E7363838D22AEC45C10D3CC2E233124A5CD8344249EDF388E37BA43598F2C2CF56D444BCEE04A335B154DFA3CA694DB481CBAA59514098CE6E0E4138C0A543EFAFEDA4AECC022C824259A06C3D57A70EA15A5DFC822449A27F58F9EF842DCBB636CE293684E1B331CD821594A12634E5594410B6C5E2306DC8BBE62C8B0F49F2F699A59EFB14D3CAD399F74ED893E1EB43FD770FD61E0C58E5D8CBC9435F4AD0892681A30DF4885927130432186AD4BE41F6FB7CFE660E23C5E55F60789B3E97C3B622599938B36BD1C0BCF6FDB7E4EE44C92B6A86CA2470BCDB8BAB8DF6079382CA314BF3A8B3C4286518C356018FD6F6FCDD9BE9AD9C228F29135544E723A898F483E9D9EE843E75ACB3FEAC447973D12461FEE3D984F3B4F31645FAEA56852D356C96CD73A6F185E8CD56731E83FEA145A2BF0C15ADC634DD9E2FFC799B59A0712EB4D2618680C7493F50A9BBF3F7BDE1025CD44AFDAF4A8C42C9254B1B34AA8559E1CEE9BDE7B4DA0FB3CB2289418110620E505B793B91F422FCF53ADDA8F7C96D55E26244E075D9A70004642712EAC377CE18F88F2C8581694B8F621707DAB6D292179B2A95AEC5AD6E409D78253DCC05ECCDB45683DFFFB9C629AFCFB0654725D650E4A283FD98E47F37AA9309E2933CC0393625DD81D4A02F9D5082644DE02B6472D5D3AAE110747E4F756973FDFCE8EA5F997E30B11EBD50B45F6889D227D87D9184CBC6ED40E96DEF8B9236763C9999E21BFC1A74457FFE5E0DC2B16876FE04C2E0F0F47012A767A7AC18D71A7FD65F8647A7E1AE2D4D255492A18AA81D17D390E381B1722BC3C38BCCEA9D5E73231D0C6E1A96CCB47079E36C994E94AF9A318D67B6408BB602A91D8E9EC6499DEED0B51A9AE31D9774A1BEF4C1DE0E7A324545B2AF9870CD733C2195C5ECDE386D298C33D492937497EA5F0E05C377A4D755DEA9D96C61FE82CF6299EB34B857217A2C6733FED64F5DAC5F95A0EF2294ECA844B96CEB5163363A31C58C88428152663AB0A2B310B1A9E9027CA8CC0DB6DFF528F9A421FA826A86ACB4FD1D79C1AE6123C9E685BA66F5FF109FDFF2497B1A50C2E4E7B4662FA11FBAA305A960CA70FF98E5290A8C3A27B4A3CF1705C6DF4290FA64F3259FDEDE7A81CFDE4214230DFB9EFB20049E905833B5D48923C8CE2F8A104946FB3356154519D950998677C56C8B2C80471A6117B142E26C0345CDF0634E356D80C3BE12F4AB89EB41DDDCF98188EAD2FF420EED3FD9287322F24C62B21F430D5F9B8592CE1CDC946616111C91C667006E47992FE2D5A2AAD82F8DD1AF3C1B8BA5326220645885CC94E8B2B76CBFF7E161E994C0CB9E489B8A5662E9D420913AF34433F5BAB10AC72C5EEB9249F3C102E1762E862C13CC882D20BE16834E54DCC323EA89A133F451B70087A8DCDC5B518EEF087A571B570A7966F1C49BFCDC70AC05034D1DCC56EDC2C0F57D1AAF16718C67D162BA330AA61A2875F90E2935752BFF1EC28A79EAD1AC18E70A833946CA6A15D8765E1A62AEF46BED232EAE89DBEC278297B396CF611448C5FD4B36B95CDC54E3394C63B9B0969D6488FF1C700B390E7226F99A945306C6504958CD43CD3D63910A4324BB662A0E5DB1622D90CE00E50CE7112193872AAB5CEE0B8D6FD42F26C2FB87FDF99062169C0BE75C85109D4E209DC8A640FED3EC71EF3DE8878B3D1729FF118F50F8A33361C6F707F6011454C5D744989EC1BEB644FCF99CB2E7C3CD20E6F1656E07C3566C4DE68593BCBA0EE9F7BD2E272C3D47A3E03985456F18CAFBEBBC1DE74964BECABDF3E9BBB9A10B29BF3B458FD50F19D63A6231CB51CDE3DF46E4BB6318E81E10AD1674A053C8CFE1E72853FD60E6E642642CB825644D6734AFB00329839F22CED734FA1421C4334E20F2ECC8BBC2652004203B3B639FBDCF5FDA1423F08C3A1100655E4763B8D8356A151D702124D30FDD87B34EC4D34BBB3639464E44A693690E193329 + +count = 61 +seed = 09B8441F47235EFC82D71933A0037FA4F69124C3BAD4EF6A3A7178B417A3FDA874081B7EEFD7EF1BF234C752458FBBAD +mlen = 2046 +msg = 92D5FEEF68737ECE61C6E0078D77FBAE97B0B9235F40B97099C114B1586E107B5ED1308A8A2D20BE41AF129DA2E0B38EAF02FAEF733C7A1D1A387BC55EF008530ABC22697D0465AA3EB71F41EE72ADD236CEA9A25995F3689C5A451E2F03915D96ABEA10D356D549D68048977587326523CCD71C05FD57BFB3C7A853F535BEDDEADFB84118F6548860F6BA536277DDD7AB42123E93381A385FA3E6CC023C1458A9F94822D93248F36C48FDDC972B5D6494B26658440FFBC23B57363F3D82CCE69FEE4747A889E85343288D55D30FC54D2D0744744DBA9977720E8EDD2C0ACA1FC51B0C6A3C68BB9BB8DA0385DB1CA4E9CE660CF7EB2382E5E95D2AE19DEF904A8651DFAE53A4D0DC4D057AB1A506C3BD7E1D1EA3FC4623E7D7B410DCB312F037B7A5FDE5E0E604FC33270FAF1FFB6ECB3125DDFA5C49F25BBC98238C8AB1B903537CD67238995E81B814280A4CED61513D69A2178086D505F8DD1DF7E11CE66AE33D4C982F94231957031A258E0EC745672A57A5CE76D1170111B8882A9EB5388094EBBD53EE9EA1FCE4A275F9D7060C8DA79018487B452817280C63B01B05EFBF897387592E2BB3BB486FAE0AB09F46D9F2E176DE96C59992C10A14EC16EAC36102B1D15541607075E67C842A888C87B268E9809148A323C423220DC31566B62F45CCE1E2BC1B3BF43B87C998F00023890BCE517271BEC16EFAA33F11611FDE87F197852BC2E7A2B44F8C72A6F79B22F73BE0611B81EFE09253931545D2453939C46B6797CC5DC5A8F1AA3BD8456EEEB84EE76DBF2EBF32598750ED10670DF422C7D7993ACC55F657E6E1B3DFA1BD6C1CD55FAE97E69D2F8F5AF368F7DA0A63B4065EB6D8F02B19A34600252FDFFDF4ED8DE2EA9CD2E74D63A6CEF29BF02F92D346ECB9A61081EE5AC811F33AA5792F6A1AF570A8B0846F3E6EF38452346DD637B19ECA37BD1A6C42B20A5BEDE9A5DE3C9F169D04D8C6CF5376D3404F0C21DEAD53DA6C169F390EED7B5B54DBE47CCE0B2AD1179EA8FC80FDDC7281BD4FE31B9A26A00444AF0B4D40A1B72BE37501308906149DC6FC5CF02B6F60AFF82B975FC8F146961EBCCB4D126ADD524A9B33BB16F6A83C6F3727A72EFA2BAC116E493E07B2CA718A63FCAC8E9D52A1B61479B4EE52A5ED30FABCEA4D01A792A92676721286814F3B0F4E15E23CE0C5D59A0C3EB8573C0A2F66C25F2EB2FCFF787324721004979BE5EAC505DFD39F5538E2C1B2CC12D20C1C5CD87299766361AEDDBFFF743693081842378744879E6E6371B3FFA9DDF34966FBF8DEE91B7EDF6EEC3E4E2F410CB5351F847646C22AB594046DED63347D04A008FBF6EE9696C638ECE73B39A269DB239DF36443868AD44D26A5C40FC92DFFB008E436E5C18907F5B18B5E6C5900B41A9801DB070D2DB651187A4DA7E2647ED3E9B6E9781627EB576BEE8334374468760DD3B32985D42945D953D434BFD80D7F7BA537265FFCF27DB0DA1ABDAE89BBE94D98BC9CA197E41C0839728F964FE4CE30B8CC43CBDCDD9CCBE06FE99DEBC6F4024F3F00D43FEBCD62A1822A6D507337EE79D4517AA486870602D4F1C5368B0EAA1FF6C011A9A953AAE58C75BBD3DC78D263A578C75CDB1AB324D71B9A065A9AF3DAB854189585C68D499AE8DB887745E20AD9738705B9D2F5D429F12D6462E5E2EF9FFBA53CE2F4E75449D2A7DBC3C818E61DC546175A6E0C10AE631DF6B1EAE6D134C08466EBF6EB5F8257AA10EF8C6F27F4295F7EBFD450629F3EB4E0F4BE247AD7F5E80703B1247A4FC277311D69E5D62E0B0201A805CC4F1F807DE99420D563A703493AD35A56B2B2DC237112F5EC21C70BF139A9EAD8F7E921F086E001B4C449E42A0E3AFCD5BC757040A2865D0E5ADAF98E37E6F8A501FF39CEF0BC364EECDFFD03069B81F5E1978C397862FD56362835C059FCBE4D8E2A957FADD7D05BB195E21AD67B429621E1D6872DE2D8BFDC91544F9E6AE8C164A23255AD0E00BCB21456F8FA6AE018F49605736C81A5AC0945E2D965F1493ED5BEFCE512AE93AD91DAF6F5A151D6C9856DFDDD1F877945D932261DED67AC8231DC3CCD0B04DC1B02079C897601E363FFB9A3BCBBBDB0B0A375E69EE4A7135C094ABDC237FAA2E5F82D2556290ADCF82ADBA8402C4FC9D0724F15BB87CD7A75A1A7BF826896D8EF63C7A2A3C371756AF638706270652C376100EC42FA55196DF332820D377760448D3E7ADC42E9F5D8A7074BD0FA97433B0E2C501252DE6939AB948552663A17DD7FF05430FA76E29F0519D650B86FBB19FBED097143FC242573E3E6FA4BD4A2EF6D9CE6932A066B4F9FF935BA9BC26FC2E5031C20AE30A52970A2DF3504576108D5F26517F8577BE61E6AA9D192ED62CF36AA641DA0D274B1ED5EE864B549154EB4115658E6C60219CC5B2E22C49CE3BA76A85EFB549117E1207F6DF081D0761421262E352182239F1E34EDBEA4BCD8FA0027543824DD58A20324FD4CFE943AAE5E361C367B22F587E2F9BEE841E11875B026F12B9571512F72985F98F6D0C212DF36A60975429173E317F6ACF72E621F30654A6DEAEF9E9E455524BF07FFDF44642A1826F734D69F3EEF4D52F26C06376C8F71DFB65A24A4C57D74B5976950AF3A57B4248909524BEC47D858C69041EED34E0ED3B111BBC117AB112BBF947D646AB3B7172F5FB726DBC53AE37956E29F5B6B1E3C90BAF4E4FA544FF63815FDF4AC9A2A80CA0E8722383437B9A02F3AC538FEDA7A6D6C1635D3624A385D846E79E956DCE483B89C346C1287A1A7293168D8A885FEB6569EBDF3F47F8BBB50AA43941EB20001959AF1B9B358ABA13FD9BBC596EA42A9774A120AF091D544E79C50686C26B4FEA396BF1E4C25B8EE4929D75569A5FAC521C77B +pk = B1A34D1C67A25CBC40FA1F900A56259C1D10D26BFFEE4C47C6ECE3AA8D573BB959E00787D504302749EB278C1963B50F0F9C268B43A78A47A5979F28EDA96E9F62F9FFBB1DEF1CA525109322FC8F7DBAECF09CA47675080750524E973D4E011F04 +sk = B1A34D1C67A25CBC40FA1F900A56259C1D10D26BFFEE4C47C6ECE3AA8D573BB959E00787D504302749EB278C1963B50F0F9C268B43A78A47A5979F28EDA96E9F62F9FFBB1DEF1CA525109322FC8F7DBAECF09CA47675080750524E973D4E011F0431BF1EEA705E84D4E3E96D0E64ADA0BD879BE76646814AE975030000000000000000000000000000000000000000000052F8EF8A2F788725202F7EF0845292C75A8FCD30ECEB8703D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99A9C7609D59801ABF3B9C90DE86A6E460B339935F3A86E1B1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009F14BCF9FE13BD27F4B916A9D66C9288345FECC2673403495921B313ED5AAD6A2D790B66698EDA9CC90F5EC8FEFDBE00FFD406F47BBA802E55F76CDBFE3F0CA160C3C24D500EA2F5E228D407619BB7ED2D54675640E25986322961E7B5F4A700E89ACFF88C57AEF6AF0BF07C51B0138F20AC1AC9A91C0EFCF0FFAFF12A8CF424A0069E44C5BCF34752923042F0532C0097A4EBACC50E39A72D2B9BE916B2824A8B57DB10CCE3DE4ADC00BFB6D92253ABD4936E9E8468419356FD3C035A60BF00 +smlen = 2270 +sm = 57193DF57F6AC4C6E2ED2AE774F2557E30136334CB18AEEB57F567155119C48E348E28A3501D2976DFD8D59EC401DB381E7A9571CFB988865E8BDC4CCC6C3A4B5E2D339A161136838882312AB4CE525D9C9FD09EFA44D660BE9BE655A56C4F390101ED4CA1D4BE6B7F9CFE2FF921ED73D5175BA9A6D7F57CF72F0105C6D45542DB4ABBA83299C8CDCBD16014591D0EB6D0F358003E8FD8997853579BC65CDD4993D2B06AE3C713E513D108340100EA6C359E6E320FF92CA554B4AB4BDFCA0A2670992DD47C00F7437CF8FF1B673D31B0458959ACA52430B7CCFA9CC1E900022192D5FEEF68737ECE61C6E0078D77FBAE97B0B9235F40B97099C114B1586E107B5ED1308A8A2D20BE41AF129DA2E0B38EAF02FAEF733C7A1D1A387BC55EF008530ABC22697D0465AA3EB71F41EE72ADD236CEA9A25995F3689C5A451E2F03915D96ABEA10D356D549D68048977587326523CCD71C05FD57BFB3C7A853F535BEDDEADFB84118F6548860F6BA536277DDD7AB42123E93381A385FA3E6CC023C1458A9F94822D93248F36C48FDDC972B5D6494B26658440FFBC23B57363F3D82CCE69FEE4747A889E85343288D55D30FC54D2D0744744DBA9977720E8EDD2C0ACA1FC51B0C6A3C68BB9BB8DA0385DB1CA4E9CE660CF7EB2382E5E95D2AE19DEF904A8651DFAE53A4D0DC4D057AB1A506C3BD7E1D1EA3FC4623E7D7B410DCB312F037B7A5FDE5E0E604FC33270FAF1FFB6ECB3125DDFA5C49F25BBC98238C8AB1B903537CD67238995E81B814280A4CED61513D69A2178086D505F8DD1DF7E11CE66AE33D4C982F94231957031A258E0EC745672A57A5CE76D1170111B8882A9EB5388094EBBD53EE9EA1FCE4A275F9D7060C8DA79018487B452817280C63B01B05EFBF897387592E2BB3BB486FAE0AB09F46D9F2E176DE96C59992C10A14EC16EAC36102B1D15541607075E67C842A888C87B268E9809148A323C423220DC31566B62F45CCE1E2BC1B3BF43B87C998F00023890BCE517271BEC16EFAA33F11611FDE87F197852BC2E7A2B44F8C72A6F79B22F73BE0611B81EFE09253931545D2453939C46B6797CC5DC5A8F1AA3BD8456EEEB84EE76DBF2EBF32598750ED10670DF422C7D7993ACC55F657E6E1B3DFA1BD6C1CD55FAE97E69D2F8F5AF368F7DA0A63B4065EB6D8F02B19A34600252FDFFDF4ED8DE2EA9CD2E74D63A6CEF29BF02F92D346ECB9A61081EE5AC811F33AA5792F6A1AF570A8B0846F3E6EF38452346DD637B19ECA37BD1A6C42B20A5BEDE9A5DE3C9F169D04D8C6CF5376D3404F0C21DEAD53DA6C169F390EED7B5B54DBE47CCE0B2AD1179EA8FC80FDDC7281BD4FE31B9A26A00444AF0B4D40A1B72BE37501308906149DC6FC5CF02B6F60AFF82B975FC8F146961EBCCB4D126ADD524A9B33BB16F6A83C6F3727A72EFA2BAC116E493E07B2CA718A63FCAC8E9D52A1B61479B4EE52A5ED30FABCEA4D01A792A92676721286814F3B0F4E15E23CE0C5D59A0C3EB8573C0A2F66C25F2EB2FCFF787324721004979BE5EAC505DFD39F5538E2C1B2CC12D20C1C5CD87299766361AEDDBFFF743693081842378744879E6E6371B3FFA9DDF34966FBF8DEE91B7EDF6EEC3E4E2F410CB5351F847646C22AB594046DED63347D04A008FBF6EE9696C638ECE73B39A269DB239DF36443868AD44D26A5C40FC92DFFB008E436E5C18907F5B18B5E6C5900B41A9801DB070D2DB651187A4DA7E2647ED3E9B6E9781627EB576BEE8334374468760DD3B32985D42945D953D434BFD80D7F7BA537265FFCF27DB0DA1ABDAE89BBE94D98BC9CA197E41C0839728F964FE4CE30B8CC43CBDCDD9CCBE06FE99DEBC6F4024F3F00D43FEBCD62A1822A6D507337EE79D4517AA486870602D4F1C5368B0EAA1FF6C011A9A953AAE58C75BBD3DC78D263A578C75CDB1AB324D71B9A065A9AF3DAB854189585C68D499AE8DB887745E20AD9738705B9D2F5D429F12D6462E5E2EF9FFBA53CE2F4E75449D2A7DBC3C818E61DC546175A6E0C10AE631DF6B1EAE6D134C08466EBF6EB5F8257AA10EF8C6F27F4295F7EBFD450629F3EB4E0F4BE247AD7F5E80703B1247A4FC277311D69E5D62E0B0201A805CC4F1F807DE99420D563A703493AD35A56B2B2DC237112F5EC21C70BF139A9EAD8F7E921F086E001B4C449E42A0E3AFCD5BC757040A2865D0E5ADAF98E37E6F8A501FF39CEF0BC364EECDFFD03069B81F5E1978C397862FD56362835C059FCBE4D8E2A957FADD7D05BB195E21AD67B429621E1D6872DE2D8BFDC91544F9E6AE8C164A23255AD0E00BCB21456F8FA6AE018F49605736C81A5AC0945E2D965F1493ED5BEFCE512AE93AD91DAF6F5A151D6C9856DFDDD1F877945D932261DED67AC8231DC3CCD0B04DC1B02079C897601E363FFB9A3BCBBBDB0B0A375E69EE4A7135C094ABDC237FAA2E5F82D2556290ADCF82ADBA8402C4FC9D0724F15BB87CD7A75A1A7BF826896D8EF63C7A2A3C371756AF638706270652C376100EC42FA55196DF332820D377760448D3E7ADC42E9F5D8A7074BD0FA97433B0E2C501252DE6939AB948552663A17DD7FF05430FA76E29F0519D650B86FBB19FBED097143FC242573E3E6FA4BD4A2EF6D9CE6932A066B4F9FF935BA9BC26FC2E5031C20AE30A52970A2DF3504576108D5F26517F8577BE61E6AA9D192ED62CF36AA641DA0D274B1ED5EE864B549154EB4115658E6C60219CC5B2E22C49CE3BA76A85EFB549117E1207F6DF081D0761421262E352182239F1E34EDBEA4BCD8FA0027543824DD58A20324FD4CFE943AAE5E361C367B22F587E2F9BEE841E11875B026F12B9571512F72985F98F6D0C212DF36A60975429173E317F6ACF72E621F30654A6DEAEF9E9E455524BF07FFDF44642A1826F734D69F3EEF4D52F26C06376C8F71DFB65A24A4C57D74B5976950AF3A57B4248909524BEC47D858C69041EED34E0ED3B111BBC117AB112BBF947D646AB3B7172F5FB726DBC53AE37956E29F5B6B1E3C90BAF4E4FA544FF63815FDF4AC9A2A80CA0E8722383437B9A02F3AC538FEDA7A6D6C1635D3624A385D846E79E956DCE483B89C346C1287A1A7293168D8A885FEB6569EBDF3F47F8BBB50AA43941EB20001959AF1B9B358ABA13FD9BBC596EA42A9774A120AF091D544E79C50686C26B4FEA396BF1E4C25B8EE4929D75569A5FAC521C77B + +count = 62 +seed = D2629CEEAE5C95D3C34C1FFCC2338B4A97782BDFCD39111E18540B69DB035B352D012857111F816F03550BFE5F56ABEE +mlen = 2079 +msg = 7F704CEF1C510BC2CAE9B70FD248C656226BD5686D366528F0D0BEFC0A8761EC640CD2DA7979DE5EEBDF6127F29ABB8607F8A3D3BE05BE25AACE7FEF3063DF28E22A522FFF0B6FF6A0C61F79B02A408E8E1C775AB80BE6841E9F8A9D030AE5518E3EA8A4E31E416E087D47919593598FD58122A9E601A57EF02DE183D56921811AE2253628125C24F93C84361C5EC99E7B16962BD96CA190C68F3AA9DD60CE3AA7610589813B4FB77A4688308D9BC72CBE918583E298E03AB95FC500209C14ABEB3A43BAA92DCB11CB523C4D17EB9C6697B56C8B61EDA05BF5789166F839291CFE2997B7DD462EDA69B0615F2AD82AAC0A32F4B30FE8725849C144A9C07799D6CE9D293C25D8302161757B8C8C8D07032D914EA7DAC275919A1DFA0D3348EC07FDC70266975722763EF85EC4AF9E14288C9659907526566BB3F2DD5DAFC0D422568CA3AE52486D3F2C18B667E5622BA7E52C56BF00F82AF2108CB4949A09179544F30758B7FB98C49EA160720991B14E2858D648F0585AD1BB1D08294F029BFE936154E9D328DF2E054004FC5C29070DF9EE50DCD0981D2BFB3AA7D6F637C4CE457C0C66D27E2670107A2B85D1F026BD970EF3FB7E32C60218D5E43A06D9CD26289A937B4FBAD2A831425728F3D0D30C6C602AF4B14411E9B3C7CF0B4D630614A9E03AC30BA2B024D496DA984D08854F1366012C2400A5C8268C2B126DEA5AEBA0DE7C92BE0AF08CA22E02604A753702BDCD642BBFA0CC91BD8375657A957306A76B6F139621481B6F15CB57BEE128954D30F552661F906D8AB42CF260F30F88993BB40C9679385F5C4639888973361216DF3C60C57D9B250F64B7634C94DDA3FD122713FD2405A7B71F476C263A781DCE271E7D0665E45DCB27F7293DE57312396C58C40E268F57ED856F536C8FEB4B0060488DE3C25949D2B7E64207576641B34920D04B46766AA2978D9352C2769D49F8599F3D0439C928532E0EE428A3773FA4D68E6052335C6D93368E321D750D296799FAF87B82C640A6E995D18DDA002887F141DB8ECE2584DA2FDDF848D38357D585CD619B1625A70A5D333561D6DE856ED9908D1E377EF7BE03B326594808BE58F7FB3939E939B73F11DAB3E572DBA41D43A046B8D2BB521728222D5A77DC886AC6F328D9A531118156D791D64F5DF8FF8BE8DCA32EABC3CB259B0F72B021CEB4DB36A6CD2FD149437B251F81F7588AE921456BEF1A79FE83447D80CADDBF20895667CA0E493A4731EEC901E03F66DE284400A5558922AD53D4E0FF7BC6C61640ADE0274C63D94E96BF6C642B790823109F53C3C27130A1EE38D448239187F5009373BE328AF866A9B8DD1BB735E8002296043C6FF641A432709148C707B900ECF46555D77644565D5998C096756F79B6F0E20850B8BF0528E78BF5FB4859BD655227873D289CCE47FEDA8414D09ED7E8D380FC4D580C7F44B01521E829E7B0CB2D2F345C517B65E2D476687EC9A4C160A3AC0B01CBAA588644D799B125910812790F06C1ECB1F1E64D5CCF92AE5E8147C98B0CFAD5626BAB5115844198E8C2AC1DF9A208FCD2D2891F4A29009F5B36D8E31383811A9493CF8E143B5AC8A14D48119CC16D2C6BF6826FC47D4B782FFC76B64401B8249777E32C1298606553DACF386A22809B599924A635796A1AEC3CD8568064852E54C95AD887D7AFE837F6FF676F69EE6288879F6D96193AD94A0418BBBA2EED5355876F2C3497448A5F8F3F83B136703D9A38FBB62784CC233DF448A5E88EB5F81A0BE97A16FD4CABA1D87A4BFB08E002EBA548F662D496A1478BB7C26C69CA4C100AA6872A4945D703CA812BDBA53AC86010AA1D2C53F29E46AD095936FF50DB8805DF4B08C9580AEECE3A6DDD828E7B5D4DABCAF112A6E35AB3C28A6DDC4D98AD1063C2ED72CAA50086E6B72090CC1F2AFEBEC6751F27EF51DD8557E53D928535D82A220F62BA0645E3C2618F3424EA1A339A138C9B8E26B14BC32D1736A4193C0C72CC402C3EAB58817335C1424BD6F38CFE16338611118B4100E4038D07DCA041C72E485C5290F0DDE601565DAE9CDF657A4C7839D3ADE72986AF396E767430125786E219BC5736F16FEF66B4014E5961CFB4CFEC4CB2A32205A92DBF1399E2710395BA1240D48277C120526CD9E2352F7D04D89CC2754379CE80A2CD1AC765718B8BA61EBB8BC6D0D407022E7AC672065FC8503BF5BC4138520CAE233EA997463D7C9E00BBD852F12EC17C6F1DB1914446AA21E156D210094B699B4117B31EAE6386DC0DE1F55CCEC09AA1EB38CDE4602598D452732C5EF8B07C477E3E2DD470737EAA7357E2E8B74C31A117B519BDCEF79B6B044148A10468E38B5A6B7B10D74C6130A60A268ED73DC9A25ED68AF354758FA3F57ED3558DA654CACA7150A8E4449D0EF640184A7A33D00BA765B01C442E88D9B4257B93904ACE04375679BFD8271A03073E34C4A1C0437C4009A9590CB98D0B5581DC83407F04A22C9B0246DE38E1A13F9B1191493818783950548BE562F940240CDECD4A50C94E406B1BAE04B50A3A19E7923183E3FD356238C45AE6559193E0E846DF0FC6878BE6C963AA8C3508DC31F766A4B29C78D749C89985AB8F580DBDF7993A2261CC4BBE489C3BBB38C46739BD2516D3C64A93F10CF559DB6A0EA3BAFEE8B43F696A5288C66509A57C642BBEAFB40F4CD0649B4CE25B6FB2EF5529B73556051213BB39CC4F1DC8004B1588C8DE836699C66CED567998523AD3AC303D9E13617CE6C1D2FC4C35B22A24504C51F64155F24D91D0E8785B40912B3DCEDEDE71A6933B36BB514FDD1D3D843AAACF2C1E79A5216622C20036C9C999DAC3A5A2D43FAC3B23119927806F497B4048F561A2276FDA0302423147D35579DD4411416F0F59273429AC0464AC49B230E29DC124115D18A045663D228BFDAC9F57B0C5B4 +pk = BFC5B5E807B42AD853DD163A7E4D350DC8CB8951EE3534A9C86EEBFB4ADEEE4CAC4FB938462E10E77F30760BD019F50D618B6D23471AF768FC2B36A9A9ED753AD07234754AB1F4D265F3FDA51DA9301F067ADD02EAA5DFCC1806FA3DE04F7E0F08 +sk = BFC5B5E807B42AD853DD163A7E4D350DC8CB8951EE3534A9C86EEBFB4ADEEE4CAC4FB938462E10E77F30760BD019F50D618B6D23471AF768FC2B36A9A9ED753AD07234754AB1F4D265F3FDA51DA9301F067ADD02EAA5DFCC1806FA3DE04F7E0F08E13F0E7D13B12610B33DE6A3056B234F01400A67F086B1718A0200000000000000000000000000000000000000000000A293BB3CF2EDCBA83EE9E629AC0ECBA56D78676CBF7AACECFEFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B021A04BD2CF0213E65B01E3146CDA9466F60BC540052DFD9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C3CAC3162998D88EE674F396EB25F0E070B8ADEF2CD3C1121DBBA587CDAF972332E33D5D5CB692333B2ACA3C801C8200E0DB90B42744AE5A5D2E2B997490A57F42AFB2324FA1C3F95964E699298C3F8CD016B5640647E5D9CD2CEF58C2CC1100A1F6CCCF129BEA1CA179B1CB8982811BEAB5EA0426B49DBA6F5471513BB74A266695F4E6637AF5823EB3CDD2439CDB007373B4A26A785EC08BEE5C62CA322553B4B83B68B15429169FFB3B3170D1F3BA3F6AB6E2E1103BC9D8A76C75F2774F00 +smlen = 2303 +sm = BE161E8A562924B9C3A300C2829B5ED4AD48023370BF2FC56056FA5ECCE66BAFC0384F4E6B79B088143C33FE86DE2C3135B17004BD317F4A328EDF28F114E7E3E2AF6DD1F27D4AB9FA8C26835A0E067CF61072F5D1682675391F2C58CDE9310E01018D4564B0D3C67FA4F2706EA5DCB56AFDFCE004A192CEF91301BD5DCB40D61AEC43A8D210F415F8A960898A228AE3FE6FF1013323A03B06EE302F5334D56AEDB9F9020260C318145374D201592A67C1FD75B805DEAC9E01A042635F8432C228A2EA349201FC9C4FC06E6430614F9FB28289D181A8DD34E7478CE03A0015027F704CEF1C510BC2CAE9B70FD248C656226BD5686D366528F0D0BEFC0A8761EC640CD2DA7979DE5EEBDF6127F29ABB8607F8A3D3BE05BE25AACE7FEF3063DF28E22A522FFF0B6FF6A0C61F79B02A408E8E1C775AB80BE6841E9F8A9D030AE5518E3EA8A4E31E416E087D47919593598FD58122A9E601A57EF02DE183D56921811AE2253628125C24F93C84361C5EC99E7B16962BD96CA190C68F3AA9DD60CE3AA7610589813B4FB77A4688308D9BC72CBE918583E298E03AB95FC500209C14ABEB3A43BAA92DCB11CB523C4D17EB9C6697B56C8B61EDA05BF5789166F839291CFE2997B7DD462EDA69B0615F2AD82AAC0A32F4B30FE8725849C144A9C07799D6CE9D293C25D8302161757B8C8C8D07032D914EA7DAC275919A1DFA0D3348EC07FDC70266975722763EF85EC4AF9E14288C9659907526566BB3F2DD5DAFC0D422568CA3AE52486D3F2C18B667E5622BA7E52C56BF00F82AF2108CB4949A09179544F30758B7FB98C49EA160720991B14E2858D648F0585AD1BB1D08294F029BFE936154E9D328DF2E054004FC5C29070DF9EE50DCD0981D2BFB3AA7D6F637C4CE457C0C66D27E2670107A2B85D1F026BD970EF3FB7E32C60218D5E43A06D9CD26289A937B4FBAD2A831425728F3D0D30C6C602AF4B14411E9B3C7CF0B4D630614A9E03AC30BA2B024D496DA984D08854F1366012C2400A5C8268C2B126DEA5AEBA0DE7C92BE0AF08CA22E02604A753702BDCD642BBFA0CC91BD8375657A957306A76B6F139621481B6F15CB57BEE128954D30F552661F906D8AB42CF260F30F88993BB40C9679385F5C4639888973361216DF3C60C57D9B250F64B7634C94DDA3FD122713FD2405A7B71F476C263A781DCE271E7D0665E45DCB27F7293DE57312396C58C40E268F57ED856F536C8FEB4B0060488DE3C25949D2B7E64207576641B34920D04B46766AA2978D9352C2769D49F8599F3D0439C928532E0EE428A3773FA4D68E6052335C6D93368E321D750D296799FAF87B82C640A6E995D18DDA002887F141DB8ECE2584DA2FDDF848D38357D585CD619B1625A70A5D333561D6DE856ED9908D1E377EF7BE03B326594808BE58F7FB3939E939B73F11DAB3E572DBA41D43A046B8D2BB521728222D5A77DC886AC6F328D9A531118156D791D64F5DF8FF8BE8DCA32EABC3CB259B0F72B021CEB4DB36A6CD2FD149437B251F81F7588AE921456BEF1A79FE83447D80CADDBF20895667CA0E493A4731EEC901E03F66DE284400A5558922AD53D4E0FF7BC6C61640ADE0274C63D94E96BF6C642B790823109F53C3C27130A1EE38D448239187F5009373BE328AF866A9B8DD1BB735E8002296043C6FF641A432709148C707B900ECF46555D77644565D5998C096756F79B6F0E20850B8BF0528E78BF5FB4859BD655227873D289CCE47FEDA8414D09ED7E8D380FC4D580C7F44B01521E829E7B0CB2D2F345C517B65E2D476687EC9A4C160A3AC0B01CBAA588644D799B125910812790F06C1ECB1F1E64D5CCF92AE5E8147C98B0CFAD5626BAB5115844198E8C2AC1DF9A208FCD2D2891F4A29009F5B36D8E31383811A9493CF8E143B5AC8A14D48119CC16D2C6BF6826FC47D4B782FFC76B64401B8249777E32C1298606553DACF386A22809B599924A635796A1AEC3CD8568064852E54C95AD887D7AFE837F6FF676F69EE6288879F6D96193AD94A0418BBBA2EED5355876F2C3497448A5F8F3F83B136703D9A38FBB62784CC233DF448A5E88EB5F81A0BE97A16FD4CABA1D87A4BFB08E002EBA548F662D496A1478BB7C26C69CA4C100AA6872A4945D703CA812BDBA53AC86010AA1D2C53F29E46AD095936FF50DB8805DF4B08C9580AEECE3A6DDD828E7B5D4DABCAF112A6E35AB3C28A6DDC4D98AD1063C2ED72CAA50086E6B72090CC1F2AFEBEC6751F27EF51DD8557E53D928535D82A220F62BA0645E3C2618F3424EA1A339A138C9B8E26B14BC32D1736A4193C0C72CC402C3EAB58817335C1424BD6F38CFE16338611118B4100E4038D07DCA041C72E485C5290F0DDE601565DAE9CDF657A4C7839D3ADE72986AF396E767430125786E219BC5736F16FEF66B4014E5961CFB4CFEC4CB2A32205A92DBF1399E2710395BA1240D48277C120526CD9E2352F7D04D89CC2754379CE80A2CD1AC765718B8BA61EBB8BC6D0D407022E7AC672065FC8503BF5BC4138520CAE233EA997463D7C9E00BBD852F12EC17C6F1DB1914446AA21E156D210094B699B4117B31EAE6386DC0DE1F55CCEC09AA1EB38CDE4602598D452732C5EF8B07C477E3E2DD470737EAA7357E2E8B74C31A117B519BDCEF79B6B044148A10468E38B5A6B7B10D74C6130A60A268ED73DC9A25ED68AF354758FA3F57ED3558DA654CACA7150A8E4449D0EF640184A7A33D00BA765B01C442E88D9B4257B93904ACE04375679BFD8271A03073E34C4A1C0437C4009A9590CB98D0B5581DC83407F04A22C9B0246DE38E1A13F9B1191493818783950548BE562F940240CDECD4A50C94E406B1BAE04B50A3A19E7923183E3FD356238C45AE6559193E0E846DF0FC6878BE6C963AA8C3508DC31F766A4B29C78D749C89985AB8F580DBDF7993A2261CC4BBE489C3BBB38C46739BD2516D3C64A93F10CF559DB6A0EA3BAFEE8B43F696A5288C66509A57C642BBEAFB40F4CD0649B4CE25B6FB2EF5529B73556051213BB39CC4F1DC8004B1588C8DE836699C66CED567998523AD3AC303D9E13617CE6C1D2FC4C35B22A24504C51F64155F24D91D0E8785B40912B3DCEDEDE71A6933B36BB514FDD1D3D843AAACF2C1E79A5216622C20036C9C999DAC3A5A2D43FAC3B23119927806F497B4048F561A2276FDA0302423147D35579DD4411416F0F59273429AC0464AC49B230E29DC124115D18A045663D228BFDAC9F57B0C5B4 + +count = 63 +seed = EAA4FB8EF0290A499A1D92EE398A8D7E71CD3CBF01A36750DA4B7EFF175DA26D17AC4ECE49A84C88D1D2C2493563C26D +mlen = 2112 +msg = 2E086FA0C4582E0C6CCB020F86A6107475985160BED201760D6489CB05B8D21452C81BD5D317F8857703DABA24E968F3164C82A4A9751DD88742B72141734DC0B4A77CBE2AE1C287A396A2F5804519456CF1EAE273A5C6361F52C35EDCE5ED7388D61D01AC040676522C9FD7B02A7DEAFDCB4169867EFB69792210A7069287C5DC958D0953C36F84D9A26989DD3B726BE8B94B41DCBA1B5374123F55A6DBD6360698551C27D16BAAFBB0ECBE116B44F11425DA45D7FE8ABA91697D83B6896A06A7888C97A91406B81B3A5BC8B68A984750893114B4011B9C8BEBA6F5C2D7D9F2C7A27030555633A0F90E30753A04B1958141AF7C1B95BA208DA36F729673D20DA0A83F913BEC8049F8CD032D9F9DD94B2086C61643AB2CFFDDB2B9BE0AF996D642B7A0A31CE0EEC8C61B343ABA980FCDACE9CED7BE4C9048B356D41002EEE0433428846BA4220EFB7F493FF57B0C706282EEE448CF7DA9B17B32D0EB0016983175469AA5BBA53489EC56BA3A92A70FDA2390E3A5D8C038F496E7C3180C6971A39491EAC10D828D44B3DE2BE64569B907005783E62710B9AD8EB8C9AF4B04993D40D1EBF165EFDEC748FE9F6B334DA6A30C568BCBAD095998A47242CA16803FE1720FCAB85233AD76EBDE102A5D93AB98460494BC886BB04C05AE89E157967747F8C050B33CCA52ED5E59050965523EC5C4EAF94CF2F2EE80C35AEEDD14E65D937C92855D03FC76ABAAD57A21A42420819EBB9AEB65F031F9C4BA0AC2EA27289E941DB89669A0620797091AEA3EBFC2AC354E94D27894F444FF9E604C8BDF7D6C00DF0E7FE9827171010445E737D0A5867636E3488EAACCCFCBAC1030C0DFAB639AB45C5AC5435E2C5B8244E58C3A6BAC81EEA408020BFEC66EF55FDDC618083ED737F4DD3BB65474487CADDF3AA2720A6931FC69533B6491DFC7E6E5FABF8103D05F870BFEFDDEFA20822A68A710B517065BD2478CE080E5DEA09EFFBA3A136C1BC9D7D8088F736C363B30E2AF2A6F2395EA8161CB64079340FA642C7763E3BF0623C968A16263CDFDF1B8334E427955E20C1EBCE8C8CB136DA8D002D8A9E5DA3B1F56668C1C59E20DC3BE026A43F40910D3A2B601D9D3EA2BF6D2C2781F976BA840FC986C8AF0DF84B8B0FB291D1310039D6914F8F7CC6B26CC33AF94150253E8EB410344A64344A5A0C06E0F3AA23C68617C6F4659DF79285782C89BEA3091083A069EF8F048371CFA054DE45E32C19A44DB5D435BC8FEF5570B68D80D5BF5DC06DA13C36E3AEA341CA9FE20047AC30683AA9D862306534EC93E79EFF79FE22E3BA15E2BA3F59F7B8B9314DCE31095D3015710C2927B54BA6F46D3981975229EED16C9B17813801C7D3CB3604DE9B7A4F18C2F91B2B50C1F43E87198AFBAC718935DB9CB96D9FE048D969635CB9F4DCA659AB1612A698CE45336B8D9FF5468301BF05D04B3558D66E88DE88427FE87E65D36D3C29FA3FB126F1F294E9BB391EE427001C34126C6622905514CE153682754D7FB1C985AE4DA600AADA1593A0A214332B310620B1B4E95BCBFD6EB8A241CBE848BAB37462224994E0D2F3F4B521DCA4A9A5AB10BEE741C5919907AFD2552D4AA300ADDF67CEC2862420C8D1D8DFFF60FDBE2D4A8D03C92E23BDB3400F5390EE4B141C5843B1E2C07C9AFDBC70E3FC08E2840EBF3B0E5296E1EE44D12E68240FDF063C07BEBF01C08586E8153068C1ADC744A7B54F53B0FEC3C752DA9F6F989A1AFEA4ADF1AD6AE926CABE4E0CB2CD864412DAEE377DE559A38047F31E834A6CE56D4041BA709945F07E514F96D783F32B0EFCC8B889FAF2B6D217246BA7C07B687E028F23D2409BBC12D6EC0D94AD9697BAB6395B7070B6FEB2E907A119209C9B7D86AF953BA7D2EA63982BCD794A5BAC69407BB7CEC5E027833B17420F146AE08F4B753BEF6CA0922F3294CD2A670127F9D2A2CA78A30F62056A425CBB7074C9A55135BD06CE677ABDF33B420F66CFDBE9461BFDF385A97439B3431CD29DECD9B5E59EC3ADAAE879A4E8D5E28CA13E73FCDBA51C828DE271207A5DEAB373B1B6677A29ACB87CBB01F10CD2C090EE66D472E8DB61615A5ECB84A7FF0988DD0DF9831BF43D732A12EC8CD50A86ADD12A5A2EA765744B05F73725AB8704ECCB08BD74517F21054E58903481E7A724F7FF24C43D6CD23DE84CD69C9E464E67003903C3858A6724247EB929716E170E2D2739AAE10B88BC3FB8FFA849E385B4113E78C24DE1673FC7E7285E6E3744F3843AC7BE7EC16BF74215694CE467A2E859DD4FACAB86250FECE28E0A6A31DD529D08566A6389B85C310C28A8DABBCCA9CD6A631EF0473ABFD6846D8326561CC9CB8181C1593D0F15EFB8129AF9E838AF518477CE361640169D9731FC139881D452773F21A3E79E514DDAA513D7B9F3399C0C57D21EAA00D44A7F031B79CAC9FC304E936E75A0CF8D204A6CC3C0FA7D037DD8ACC3A33CF5718061FCD57EBD06A607FE0BB0204E687B2A17B1FF47DA357B51A753076CB89422098D4F880F831842957E648C54ADBFCC0E488A95581E709B5A5A129DA7EC5B00AC9B18B80533F2DD1BD0F475A61DB18FC0C4EA655F602B207B572234230C831B26CECB7BC3284797C4BED5A977C3BFBEAFEA3DBFC4257D4C2C5BB8689830EE157F3B5AA1EAC09CFCE0555880A074AEB86062A8ACE19ACDC1A25F8D0E454F50F119D12E707D103F3C1A502D4E358D563E53554395B5D386AD49363978AFBCA2F8B673A693ACEF70D1DB4CEAA8FA580160924D4F18119BE46C71E09FDEE45EFB14A74DB1C688E99E24CB6025E73A3E7F0F7EA9C485274D2B6CF9784CBE39E388F9CCF1E2E8DBFA6DB43355391A369DEF645F815424253ABD0B6DE9C0A0AF156D9A4EB7474A2E5937F008134DEBC9FC7E54812967FCF5BCE28FB5CD43F1AA240BA2E9CEDD6F350D556DB1658868091E6034D7E1EE5C6645D0A345D46C42E23C6821C360F5ACD13F589 +pk = 31D581D7CE5CF90A35B36B35A287108BDF745A4EFB8C62E09F0C6DFC744B24CF7E30EB9571D30AC9446245274A66BA0DE91D8E5C5E806DB7F54886C54A446AB36D215E581FBF76943D7A57314B19AE57AAEF9D807B695C218C9FBD66CD0F052E0D +sk = 31D581D7CE5CF90A35B36B35A287108BDF745A4EFB8C62E09F0C6DFC744B24CF7E30EB9571D30AC9446245274A66BA0DE91D8E5C5E806DB7F54886C54A446AB36D215E581FBF76943D7A57314B19AE57AAEF9D807B695C218C9FBD66CD0F052E0D916D38F553C031A40DB230F7D92E2C84C99200CBA8E37FCB5806000000000000000000000000000000000000000000009627184630DF76EE4034959EE074AAC68983D51D3FE40F66C3FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B3F86E9390B8C4A9DFDDF29951F95FE697D6DF282AB79DF80F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F8F9D449E8855E5E60A4E342C35C010980ACAEF099CFFA3146B34060CBDCF502D57E6D2DC208C5E325FF1D2C767D8B005D7DE50420C4A064436C592BAC7E8DE53CB71C551A04FFD3EDBDC82BEAEB00657CE0413733E439831383D42FDB6A560003C7EF7436B15C25B6B9996D50B0AF09131BBD18F5204DAD2D26926E0C3792042DDA29613436B376C2A045F5468ED700788D7212FF744A23B38D1C1F8C0E50C9AC427D540965EC5785B37BC7F84DBE2FE4088BD9272A34812EAF351AAC529600 +smlen = 2336 +sm = B580F3080A17E4CD375DA560CA32102FCEF7860BBDEE6266E35E3FB7FBC60F3E64A1EA074B7C21990FD4D9E1A5B1A40435B1490F58A270A8970CF5A68E241060EF0E94211FCC0BA52181F0ED2BAB85BB0C6BA327E40A4C55FD788ED1AB7652060000C35FBDE7C6DCE1F7658055A56BB244DDA1FF9DF9E47951FA017CD439310FA70C7F76A3E97F2E37ABF530B54033698B5B98022E6EEC8658AB84637BE8B096A53F19C00E228EDEC6F5F07E00ABB67689489D9C8AC15945AC883009537988BA7F6F57BE9702E8834A3BC6E5D4DDE4B8D5B24F430CDB2E75A8F08CF10F0004062E086FA0C4582E0C6CCB020F86A6107475985160BED201760D6489CB05B8D21452C81BD5D317F8857703DABA24E968F3164C82A4A9751DD88742B72141734DC0B4A77CBE2AE1C287A396A2F5804519456CF1EAE273A5C6361F52C35EDCE5ED7388D61D01AC040676522C9FD7B02A7DEAFDCB4169867EFB69792210A7069287C5DC958D0953C36F84D9A26989DD3B726BE8B94B41DCBA1B5374123F55A6DBD6360698551C27D16BAAFBB0ECBE116B44F11425DA45D7FE8ABA91697D83B6896A06A7888C97A91406B81B3A5BC8B68A984750893114B4011B9C8BEBA6F5C2D7D9F2C7A27030555633A0F90E30753A04B1958141AF7C1B95BA208DA36F729673D20DA0A83F913BEC8049F8CD032D9F9DD94B2086C61643AB2CFFDDB2B9BE0AF996D642B7A0A31CE0EEC8C61B343ABA980FCDACE9CED7BE4C9048B356D41002EEE0433428846BA4220EFB7F493FF57B0C706282EEE448CF7DA9B17B32D0EB0016983175469AA5BBA53489EC56BA3A92A70FDA2390E3A5D8C038F496E7C3180C6971A39491EAC10D828D44B3DE2BE64569B907005783E62710B9AD8EB8C9AF4B04993D40D1EBF165EFDEC748FE9F6B334DA6A30C568BCBAD095998A47242CA16803FE1720FCAB85233AD76EBDE102A5D93AB98460494BC886BB04C05AE89E157967747F8C050B33CCA52ED5E59050965523EC5C4EAF94CF2F2EE80C35AEEDD14E65D937C92855D03FC76ABAAD57A21A42420819EBB9AEB65F031F9C4BA0AC2EA27289E941DB89669A0620797091AEA3EBFC2AC354E94D27894F444FF9E604C8BDF7D6C00DF0E7FE9827171010445E737D0A5867636E3488EAACCCFCBAC1030C0DFAB639AB45C5AC5435E2C5B8244E58C3A6BAC81EEA408020BFEC66EF55FDDC618083ED737F4DD3BB65474487CADDF3AA2720A6931FC69533B6491DFC7E6E5FABF8103D05F870BFEFDDEFA20822A68A710B517065BD2478CE080E5DEA09EFFBA3A136C1BC9D7D8088F736C363B30E2AF2A6F2395EA8161CB64079340FA642C7763E3BF0623C968A16263CDFDF1B8334E427955E20C1EBCE8C8CB136DA8D002D8A9E5DA3B1F56668C1C59E20DC3BE026A43F40910D3A2B601D9D3EA2BF6D2C2781F976BA840FC986C8AF0DF84B8B0FB291D1310039D6914F8F7CC6B26CC33AF94150253E8EB410344A64344A5A0C06E0F3AA23C68617C6F4659DF79285782C89BEA3091083A069EF8F048371CFA054DE45E32C19A44DB5D435BC8FEF5570B68D80D5BF5DC06DA13C36E3AEA341CA9FE20047AC30683AA9D862306534EC93E79EFF79FE22E3BA15E2BA3F59F7B8B9314DCE31095D3015710C2927B54BA6F46D3981975229EED16C9B17813801C7D3CB3604DE9B7A4F18C2F91B2B50C1F43E87198AFBAC718935DB9CB96D9FE048D969635CB9F4DCA659AB1612A698CE45336B8D9FF5468301BF05D04B3558D66E88DE88427FE87E65D36D3C29FA3FB126F1F294E9BB391EE427001C34126C6622905514CE153682754D7FB1C985AE4DA600AADA1593A0A214332B310620B1B4E95BCBFD6EB8A241CBE848BAB37462224994E0D2F3F4B521DCA4A9A5AB10BEE741C5919907AFD2552D4AA300ADDF67CEC2862420C8D1D8DFFF60FDBE2D4A8D03C92E23BDB3400F5390EE4B141C5843B1E2C07C9AFDBC70E3FC08E2840EBF3B0E5296E1EE44D12E68240FDF063C07BEBF01C08586E8153068C1ADC744A7B54F53B0FEC3C752DA9F6F989A1AFEA4ADF1AD6AE926CABE4E0CB2CD864412DAEE377DE559A38047F31E834A6CE56D4041BA709945F07E514F96D783F32B0EFCC8B889FAF2B6D217246BA7C07B687E028F23D2409BBC12D6EC0D94AD9697BAB6395B7070B6FEB2E907A119209C9B7D86AF953BA7D2EA63982BCD794A5BAC69407BB7CEC5E027833B17420F146AE08F4B753BEF6CA0922F3294CD2A670127F9D2A2CA78A30F62056A425CBB7074C9A55135BD06CE677ABDF33B420F66CFDBE9461BFDF385A97439B3431CD29DECD9B5E59EC3ADAAE879A4E8D5E28CA13E73FCDBA51C828DE271207A5DEAB373B1B6677A29ACB87CBB01F10CD2C090EE66D472E8DB61615A5ECB84A7FF0988DD0DF9831BF43D732A12EC8CD50A86ADD12A5A2EA765744B05F73725AB8704ECCB08BD74517F21054E58903481E7A724F7FF24C43D6CD23DE84CD69C9E464E67003903C3858A6724247EB929716E170E2D2739AAE10B88BC3FB8FFA849E385B4113E78C24DE1673FC7E7285E6E3744F3843AC7BE7EC16BF74215694CE467A2E859DD4FACAB86250FECE28E0A6A31DD529D08566A6389B85C310C28A8DABBCCA9CD6A631EF0473ABFD6846D8326561CC9CB8181C1593D0F15EFB8129AF9E838AF518477CE361640169D9731FC139881D452773F21A3E79E514DDAA513D7B9F3399C0C57D21EAA00D44A7F031B79CAC9FC304E936E75A0CF8D204A6CC3C0FA7D037DD8ACC3A33CF5718061FCD57EBD06A607FE0BB0204E687B2A17B1FF47DA357B51A753076CB89422098D4F880F831842957E648C54ADBFCC0E488A95581E709B5A5A129DA7EC5B00AC9B18B80533F2DD1BD0F475A61DB18FC0C4EA655F602B207B572234230C831B26CECB7BC3284797C4BED5A977C3BFBEAFEA3DBFC4257D4C2C5BB8689830EE157F3B5AA1EAC09CFCE0555880A074AEB86062A8ACE19ACDC1A25F8D0E454F50F119D12E707D103F3C1A502D4E358D563E53554395B5D386AD49363978AFBCA2F8B673A693ACEF70D1DB4CEAA8FA580160924D4F18119BE46C71E09FDEE45EFB14A74DB1C688E99E24CB6025E73A3E7F0F7EA9C485274D2B6CF9784CBE39E388F9CCF1E2E8DBFA6DB43355391A369DEF645F815424253ABD0B6DE9C0A0AF156D9A4EB7474A2E5937F008134DEBC9FC7E54812967FCF5BCE28FB5CD43F1AA240BA2E9CEDD6F350D556DB1658868091E6034D7E1EE5C6645D0A345D46C42E23C6821C360F5ACD13F589 + +count = 64 +seed = 5909111F333F3E939105DFF8532548927EBF289F31A72F4C1B0C66816D8B68F64622F36A9BC85E63601BEE8EE7CB3DC5 +mlen = 2145 +msg = 5180B7DE9A84F651DA10D334009B3D65582F3912D329FBAD4AE39A9EEC78943338C29DB4F49EF41E3C50DABBB530E99113440383F20D5A3A8AE279A6201A0C84B003F6717C709C21AE893B6E412D87F8E0CEE5A89E60A14CE975A4D42E4F43F4710FC9FA29E9B2AFA93441EF5570123AA88AFF009E2507A3E60A79CDA25652E3AC3AC0C10A816BC04739B6FC758FF9AC467879BB67F270E4EAB43F10A633E5932B8D6DCF23814DE8643407B17B5E2A91B340F7BF6882DB694DE4DEE4C480CE037B9F9A220ACDCE84B03746F307A6026531D712C0630E7DE3ADD3A8516BA602D2463E3478008B3252B658FEA54DE41265B5C81E4E913EA0E2A63309497ABF961EC40AC374ADC0FF3C6FAE9BFAC5CC2DF475885B0BC636702828489183CDE1A2934F2D63828AD1F2B8CFAFFA53151B0FFAE6224DF54C2AC47CC8844B76222C2A3B6E132071150049B6E46AA75DEA28C13477980315FB64CE500BF0C6F633AE621D65B331BA96CFAC162DD7897B8505257E228CB621BBA9176A7AFB3A2CC20D7804DDB3AAE4B87FFAFD3C8DC541D05624DB02BD62491067EC1CDF73147014FEBCFA5B561756D5E7A13B88D1E7B2C0375E1D0DE71ED20CA9CC4E6DACDC579F1AB024AAE2A0BEC9004E5DD81C046F00A2A4CB767C4EB240D205278CB863D1A61DEF16635C6A84C2406288410FA4B73B21077D8F7A4075A1DDCA3D0D334725151E434BDA80D3E73593338B07958D27337E32CDE0010DFE5E58B99EB27A97DBD1C5E6F9A552A02726AAD5A4AA63EDC336D83E5870DBD514193367AF2274804628B4EEDFDA3B2A155694E89F5A6798C5D6E036159C1F00D8DFB03D41940E775974B11C3FE4456E07B127CCB44E6FD6B2918F57A6523D7F77F32478D9F1BB539846793D4284E2907830E5EA76054802A266C85B122A389EAF4700629036716E2869C0FC9440856D562711E903A1853BC68582A95344B612E5CBC7C5B2AEE23CCE4161A75829B2048742FBD65ABFE2397CC7D66023DE34DF4F2DF8540CCE9781ED6482D29CA4E906716C8CC9596B158EB51BAB8C2E00253D6589A99B3D20FB494834B42BBFFB80E7B0441E356B541F83877736985F6330EA459C007CE8BF18D84E78E36482D581DC7DF97528CE15F68E604B4DE62422B3AA76F3E7E5B33A49CBA9D89FCF50DEB65EE45173795393A50FD4C60CF6BECBA7E733513537D13F89FCF1C4D6437DE0EAE608FB11D68B9ADC0C3A19A3565F6D62BA81A326EC334B239B212B87320C03A75C58DC8F828C4195ED9D7ACDDCE493123E235D098E9DC60F5D3A625E1FF66F245E9977F9630A40D26E3AFB6676F5122A88CE5507BD825757D9CCD53FE574FD0E6E728DA355403AD664FFDEAAF636256FADC3283D6F15B297F79216833CF2C745C4C5E17D03260A69178F2216168BF8F00C9889E1E35540254F150C587A884CDFC9E5F7D379BE474356C06943E416EB0697A1AE989AB4872D0BDF436D9FFAAFEC1631C9939FCECB84DB2846F12CA395F506687B4A5638085BC6EF58FE8E2ABE9F8D51F272EE855E2DB84A89D348DD66950B8F43939DB897C519FA302594FD1FBD6B6E94CA8FF63A7949432DC2D35C60803A570B1DAC95EE0A60C62FD18B3319601AD29A156400D392DC9A14FF50AF6752C1F6EDC2ACB7ECCA71097B6E82227DE429F1A29C5E38ABEA1C74DE06E6788CB1790AE9F0E8AB35AFE60B001F45971D42949263AA62519B0D630281A4C5788D5591B1EF5A003C58987E8665701E5B1C6063F93533094E96820F918C354903775CEB6675C4CE9CF940C4BEB8845B4F5E1F642BF505821E5A23122E2D1ADB82A63AD18CD1E4775A96CA9EF9493D75FF784A2D4A99F54DC3F87828BDFF4B3A3D98FA5A29B62A85CAAFFBACE4592A81BFAA5B8BAE6606AD25A92A43140690A6003AA2D617FC707A53EC9D868E33596E098773942D798263F58FE5A1B23046CFA136EA35203B90BEA2C5F0AAEB5EA8C24B8B8CBA14CDEE28F45D0278F193228484BCC7E08A75D0064D605D674ACA9019A0A9AAECD6AC672CB8410FEE4192E6DCA7855FBB1C584CF288BACB40707D7E6F8BA2956F6D099F52BC7B0AD72B5A3FFC03C7B47086330244EA5D393C6B9F256FD82D5CB9436A469ACC3F8FC237146895BE148749F82D39B7BA4CE47715BB393A96AB471665529AB9E9958B12396C1BA7529DBF289184FF0F635C2BA9DF301036C869D52D993463222B70BA778E81C8DC668DE41C0356EEF5C39F1BD42398BFF30F959E115C6B386E73F0FE28A2665BD463C781DA1C46D6D4EA284B152C8C12426DC9CC467809BFDA6FBFBC0BB4793BABBF6AD564D57AE9F5E2B7F651D6ED980F8B1174A126CC58B23C32BA73F5031B3FCABFE7BC360AAE412D799CC14D8B252D9F9EC9005B7FCA04A88CC8AE9F7AEFCA94137003D5764FAA3C7C45670585C84F74C4EBD1F5AD1F97EA093595592FB90E3CAB01F98F06E114F13DE67CDC36F3FFB01C3D51EA643C25A3F6AA2C57690E42B98583D925AC7B06A349782A1D33C06BD05A82A7AA3DD679326D948D74A1861926B45DB78D36070D3087AA9C5F4F42CA57EE9CE7035BD88A85CE1107C8E07E5BA3A62ECF012BC75FBF97C4C72331B55AB9A6EFFD78869F1CD3F330526F262F7DFCFA2B084B61E90772D5FCE8F038C0F72554467192CC8A27F1F53C8714DA1864815974B00991F466648478C5F9BF036DC4083D72E8D144AB10FD32408DA7677729347FEBC79E48E7B87388D9B59AEFC84B5B3B589FD91863811A6436ED76B43E657F7EE03EB796285A4D93BE9AAAD1E1A1E81687E42EC83F3DD059B78BB7F8EC70E6C831DB5E90C6B3AA511F36507DBC8E7A77DF0F5B9EF03BFEFE9471DE7C7FBE67B9922260D3703D95A5BFCBCB62D830E20C23C6CFDDC210E47CB575957D8C3514A2ED4561C738928F210057896EAEB1499D4DDC70F44E30661E780AAF5C0A20C8553F40D7D3FF6D120511C1073510D04F2DE544121AB851E98F666906367C21302EEFB1AAA723F6A531C454EEA0BE7D50 +pk = 4DD61EAE5D4A921F63BB8135D692D7CDCB185550292BFD9CF2B1C4E566A727E22B0653540FCC6F8F8277DD9123D6713A11D30BECABEE87E749346870AF39D81F754D6B328101C4142912F6EFE5EE79747959CB1F0D7C2F07D4006B94A88E1F1F08 +sk = 4DD61EAE5D4A921F63BB8135D692D7CDCB185550292BFD9CF2B1C4E566A727E22B0653540FCC6F8F8277DD9123D6713A11D30BECABEE87E749346870AF39D81F754D6B328101C4142912F6EFE5EE79747959CB1F0D7C2F07D4006B94A88E1F1F084D0100DECF1D1AF77635C16E26877876C8A1287FC16ABE92030400000000000000000000000000000000000000000000EC841AE932AAB6F6B160872E635C6F575299E684F558075FC5FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC34D71EDABFB8A46EAB8FDF0636413C33FE9241F7010E7623BFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A763CF2CCB32D3BE88E6CF27D0DF97D0AB1545F20B37F8B8F434F36472700CE435799F329D878031950553F96610700C5AF2049F63809C4E080BC76962AA2E1D7FFEDE196AC7BFDFBB1A6E4182993A9600A5DDEF44D45521E9715A9A73D1000079DD947186582AE9C046C0E5FEA7D420208570E6883D15BEB99CA8F6F74A14A8D8A2C6B8FB25B412049276243697900E5648C839BC108BE47DF057DD464841DA71C846FA6BCD6C3FDC07A75850875E6123C4AF502FFC8177B62BA9F2CA89800 +smlen = 2369 +sm = A227B7B91D92A72917266B1082C941ACF683168625C89EAE9570840A1A509139D56CE0E06B6F7071DF967BEDBC598B1657B06BF7172B58D90DC096AF58A590B36CF9D05EB11AC7F96EB8ABB17A40030A7741CF961F358FDB7FD33590CDC1E63C010061EA85249F806D758E97AAEC75256010E656C2838BB235D2017705E913E493874CCBDEA648FC8A6CF3E1093AA3858CA4C500B25AF8C7A02D410ED771ED49AF66BFD796631545860D64500127D399465388A490116B6439C638217DBA29AEEAA2D6EE99017F281C4F59C88AD674B7A83D7EAB1A34B72749260A12E80002025180B7DE9A84F651DA10D334009B3D65582F3912D329FBAD4AE39A9EEC78943338C29DB4F49EF41E3C50DABBB530E99113440383F20D5A3A8AE279A6201A0C84B003F6717C709C21AE893B6E412D87F8E0CEE5A89E60A14CE975A4D42E4F43F4710FC9FA29E9B2AFA93441EF5570123AA88AFF009E2507A3E60A79CDA25652E3AC3AC0C10A816BC04739B6FC758FF9AC467879BB67F270E4EAB43F10A633E5932B8D6DCF23814DE8643407B17B5E2A91B340F7BF6882DB694DE4DEE4C480CE037B9F9A220ACDCE84B03746F307A6026531D712C0630E7DE3ADD3A8516BA602D2463E3478008B3252B658FEA54DE41265B5C81E4E913EA0E2A63309497ABF961EC40AC374ADC0FF3C6FAE9BFAC5CC2DF475885B0BC636702828489183CDE1A2934F2D63828AD1F2B8CFAFFA53151B0FFAE6224DF54C2AC47CC8844B76222C2A3B6E132071150049B6E46AA75DEA28C13477980315FB64CE500BF0C6F633AE621D65B331BA96CFAC162DD7897B8505257E228CB621BBA9176A7AFB3A2CC20D7804DDB3AAE4B87FFAFD3C8DC541D05624DB02BD62491067EC1CDF73147014FEBCFA5B561756D5E7A13B88D1E7B2C0375E1D0DE71ED20CA9CC4E6DACDC579F1AB024AAE2A0BEC9004E5DD81C046F00A2A4CB767C4EB240D205278CB863D1A61DEF16635C6A84C2406288410FA4B73B21077D8F7A4075A1DDCA3D0D334725151E434BDA80D3E73593338B07958D27337E32CDE0010DFE5E58B99EB27A97DBD1C5E6F9A552A02726AAD5A4AA63EDC336D83E5870DBD514193367AF2274804628B4EEDFDA3B2A155694E89F5A6798C5D6E036159C1F00D8DFB03D41940E775974B11C3FE4456E07B127CCB44E6FD6B2918F57A6523D7F77F32478D9F1BB539846793D4284E2907830E5EA76054802A266C85B122A389EAF4700629036716E2869C0FC9440856D562711E903A1853BC68582A95344B612E5CBC7C5B2AEE23CCE4161A75829B2048742FBD65ABFE2397CC7D66023DE34DF4F2DF8540CCE9781ED6482D29CA4E906716C8CC9596B158EB51BAB8C2E00253D6589A99B3D20FB494834B42BBFFB80E7B0441E356B541F83877736985F6330EA459C007CE8BF18D84E78E36482D581DC7DF97528CE15F68E604B4DE62422B3AA76F3E7E5B33A49CBA9D89FCF50DEB65EE45173795393A50FD4C60CF6BECBA7E733513537D13F89FCF1C4D6437DE0EAE608FB11D68B9ADC0C3A19A3565F6D62BA81A326EC334B239B212B87320C03A75C58DC8F828C4195ED9D7ACDDCE493123E235D098E9DC60F5D3A625E1FF66F245E9977F9630A40D26E3AFB6676F5122A88CE5507BD825757D9CCD53FE574FD0E6E728DA355403AD664FFDEAAF636256FADC3283D6F15B297F79216833CF2C745C4C5E17D03260A69178F2216168BF8F00C9889E1E35540254F150C587A884CDFC9E5F7D379BE474356C06943E416EB0697A1AE989AB4872D0BDF436D9FFAAFEC1631C9939FCECB84DB2846F12CA395F506687B4A5638085BC6EF58FE8E2ABE9F8D51F272EE855E2DB84A89D348DD66950B8F43939DB897C519FA302594FD1FBD6B6E94CA8FF63A7949432DC2D35C60803A570B1DAC95EE0A60C62FD18B3319601AD29A156400D392DC9A14FF50AF6752C1F6EDC2ACB7ECCA71097B6E82227DE429F1A29C5E38ABEA1C74DE06E6788CB1790AE9F0E8AB35AFE60B001F45971D42949263AA62519B0D630281A4C5788D5591B1EF5A003C58987E8665701E5B1C6063F93533094E96820F918C354903775CEB6675C4CE9CF940C4BEB8845B4F5E1F642BF505821E5A23122E2D1ADB82A63AD18CD1E4775A96CA9EF9493D75FF784A2D4A99F54DC3F87828BDFF4B3A3D98FA5A29B62A85CAAFFBACE4592A81BFAA5B8BAE6606AD25A92A43140690A6003AA2D617FC707A53EC9D868E33596E098773942D798263F58FE5A1B23046CFA136EA35203B90BEA2C5F0AAEB5EA8C24B8B8CBA14CDEE28F45D0278F193228484BCC7E08A75D0064D605D674ACA9019A0A9AAECD6AC672CB8410FEE4192E6DCA7855FBB1C584CF288BACB40707D7E6F8BA2956F6D099F52BC7B0AD72B5A3FFC03C7B47086330244EA5D393C6B9F256FD82D5CB9436A469ACC3F8FC237146895BE148749F82D39B7BA4CE47715BB393A96AB471665529AB9E9958B12396C1BA7529DBF289184FF0F635C2BA9DF301036C869D52D993463222B70BA778E81C8DC668DE41C0356EEF5C39F1BD42398BFF30F959E115C6B386E73F0FE28A2665BD463C781DA1C46D6D4EA284B152C8C12426DC9CC467809BFDA6FBFBC0BB4793BABBF6AD564D57AE9F5E2B7F651D6ED980F8B1174A126CC58B23C32BA73F5031B3FCABFE7BC360AAE412D799CC14D8B252D9F9EC9005B7FCA04A88CC8AE9F7AEFCA94137003D5764FAA3C7C45670585C84F74C4EBD1F5AD1F97EA093595592FB90E3CAB01F98F06E114F13DE67CDC36F3FFB01C3D51EA643C25A3F6AA2C57690E42B98583D925AC7B06A349782A1D33C06BD05A82A7AA3DD679326D948D74A1861926B45DB78D36070D3087AA9C5F4F42CA57EE9CE7035BD88A85CE1107C8E07E5BA3A62ECF012BC75FBF97C4C72331B55AB9A6EFFD78869F1CD3F330526F262F7DFCFA2B084B61E90772D5FCE8F038C0F72554467192CC8A27F1F53C8714DA1864815974B00991F466648478C5F9BF036DC4083D72E8D144AB10FD32408DA7677729347FEBC79E48E7B87388D9B59AEFC84B5B3B589FD91863811A6436ED76B43E657F7EE03EB796285A4D93BE9AAAD1E1A1E81687E42EC83F3DD059B78BB7F8EC70E6C831DB5E90C6B3AA511F36507DBC8E7A77DF0F5B9EF03BFEFE9471DE7C7FBE67B9922260D3703D95A5BFCBCB62D830E20C23C6CFDDC210E47CB575957D8C3514A2ED4561C738928F210057896EAEB1499D4DDC70F44E30661E780AAF5C0A20C8553F40D7D3FF6D120511C1073510D04F2DE544121AB851E98F666906367C21302EEFB1AAA723F6A531C454EEA0BE7D50 + +count = 65 +seed = 238461A224ABEECCF709AB6CACF4EDD372D45E5F4274095273A49AFE614F2BF713134ABF68B4DD058E6D7B612C3658C3 +mlen = 2178 +msg = 99B5B6FECDB52897A1958C5C3D1FC2F20B7D045F551856EA3CB441BAD9089C64CB9489DB6B63E0655AFC4C2FA73C7417FF1B80B9C7A1D659687D2C415B3A909CA30E96849D4BCEC6A9A6A4311204936BA972086B2394D86E840770D01550CAA6AD85ADC0EC851D2B3808E4A0E9830B99A70F6204ED4DBCB6759F6228126039607AD7ED8EAFEEA28D1C3E25A46BC18AF7E01F55FAD8244F15DE36F890416AA09548554338972C5F88FD9357792819E51A63D0B872B0A4D21EA3597405B52793D50C6CD70B52841D53484BCD3EAD004CEF0A6BC16CE74CB8AD0848000D8C5158DC16625112D1D85D17A3C1C8BBDAEA42C3A43E9930724655592116C4C6D0B8B223337EE4E754541A09D898F7FED71C3785B7F8721653986C525BC00F15590616437D11F9722824DFDE7E9615F1FB8488E5327E4D8BAF5F79D1FF5E808D154951AD87638910607B03FAAC3A61FE9916BA65FFD16986DEB4169BD24A72B1C8168FE569F3C81F93F3EBDD21D4E806F79FB28550912E9AFFFB52E97860C4DC0D042C56E1BB71C28B68E416874EC7043306A29BD1F4B9A3E612A6778315E2C2B850D6EAB9FF1905030FADA250CAF308735393C191134F3C493D00B5695775D82ADB9F2ABDAD17FC41FBD7A1DEFE337C2F8ADF69154CC0862FBD43035295B1A9C80B88FA8CF75B36CA08868F881966B41FB3E239EB1DB9CB51606A0A9EBCD552B2F4E819E2C30ABDECCDDE88D2D2F82F3585B5143943C929591D20CEF559CD2BAF2DC7FE03C9E4E084E8890FCE64A4AA9F13D5EB945AD7E3CC53E01FCDC192B97ADC1F98D9E773A0177E8D97405808EBF48BF17B689BFC15F4C515E38A855A9266230C9085ADC9A6DDAED93D80C3F38BC516695D202B4E89DA5B4EBC43788C848F8C4A72F79F37F857EDC105F13E4ECECFD09302711BC1993F5308B8F32AB96FB8EC3F5EA0531DAFD0AB3451F81F47E62C593C8D3E3BEEE79DB06909576BF876145856F5F716CAA436C98EAB28C5B85BC2E4D7E1653ECBB8BB6B5BD6981DC72D7F63BA06CAC8197ECCDC72C1481DB44724A3C21F7FC60661F11FDDE8122DA5D0B1D72A29952618B373423A892875E6AD24D0916109ED8E9A9A8D9A68ACEC4BB5EEB0D00EAEA72D8D5A76C2A42F18CBDB3D336B71C70AC73D39D7EB04533453779A1F210BB4FC056B4728AFDFCF46675C6AC76F750626D642E3AB117E5D6740154759A46C27D51306587650E1039054B876849882E7DFD807BD03E69021E337DD69D9B097722C6D2AEB517D773D2F7D84D69DABE1A1D6422EA1766C0FE7B8DD4D7283F2985D96D91A132B8BA03AD85F7D56095773222D0AFDC5A192D29F3BB0C2539A1C99DB4E711B6ACE3FEBD58E45E99C9F5A04CECBB309D50397F28C48BB9CC9F9CF75A52253B634EC47216A1FD6358AF26501821864569879BE1736B0AD242AB5B8ED16A7EA0989ED4CAE3567AFE1F8209A028DB46DB0270B3BC06668A9BF5E1BC1061BABBA00EC4EC37280379139D19BC6072CC6B7D260A816CB82F9BC90897BE3025475AF12191690F9F400A914789A860155EFD2D606A15895378C827F2A4FF700303962FD96DB2DCD2D213EEBB2460F0B753BC6902DA81D44C983DD027F1171D40A2039997241E09AE5B6165B4D55A8E4C79671A8B8BDEFEF2C21F81C541A5719DEB939F866B61BE250AF371CEA7B7525094C904698D412737F7781BD779365F122EE627D9CD4A68DA9D5BE1B0431998AACF824CDD864C7365C01CD5A5F480B6AC1E5FEAD8FFE40D87C1F9FCE81867157242285C5E76CF9667919C29A67CA0C0A61D7819D9EE6B792250A358F5691CCD80578F15288F3D5D6D7DD6DFA351FCF8DF0223F7D1DA1B76711FBE0E7FABD30377660ACE7B23ACF03ABC1D973248CDD0897773FB74E20481EBD3E52657C9296B980905AD29271EC128513284F1B78F38634BF84CB80791A0C5649177791CDAB87769D57B626F78A03435C758A207F52BD2A1F31E34B6A122B8701CD9FE478C57CF3535B6D51EB46CAF794BD69363D5A56ADDE6945E9788F1E1DFD045BFBD0A68834B13D6B9EC4EA9C860EEA0E9AC19C2DE14FFBD6B57E5992B08943EA0283813F3F15E4F928B8D0F13DE6863990F5C77F130C97D8BE12571EDCEC7DEEC4B6EF4835F136DA45DA70A11F9192478FD8B4846C507410FD11668365B05252E68CB2C972ACF50156E369B83BB85E62E4BD4D84C2E9FF41A5844D5D88AAAE7DED852DAA0AE5C14A5DCE64C7E236E9B7B60F5B5AD4D953A2D842A52929491BE3555AB8DF534CAD56DBBB86B28A8A86B7BD9AD1C58C87B8A089324E00FDE32F8186B2B74523A22904C18ADE02C3E965F94624F8DF57E750EA6335E3EBA705294B76CD6ADA33D90FEC1F48DE7BA9DC7D8D60A53D2563964188874810C45736C57EFBC3A3CEEE7238AEE5281882A554F2143BDF89ED4BD819C08239C187C12A8B6E763434B92C26FDD658B350F51775C60CBAB7A2CB120DB8CE8AE9AAF6AF559F8CADE84C4820209CBD27CC09230B22F013A0E4CF8041E4A789A5D20BE9914A624AB957318848ADDB39C9748C8922C54327048A2E46523BFB22487538363459035BA49858F85A469957DF1F4831BB7FFA0564C53233B99B596F5356089949306DEDD6B904433D25C4854A80590B964DF6B0703B4F9628D6B9A4D3F0A4096E9A0B46D6B32F66D563BAF688ADD18DE001DA62E33C503A4387CE0920BA5D1E8B69C38E3745B19F8D8B6CA5E1AC6DE90EDB25FC32DF04F0849D769FBED3F8169EA1D2252619A2304E055370B4443CD23E56D4934F9F3FC92F1C1EEC626657E6A89C1394E56061AF8ECE3E2A17FBAAA4D579A99A7998632A6AE2683DDFFFFD27A27C8815511855F09ADFF7BC627A7A5C95FE57FA3EF81F494FA7EA6E6CA2D14775A25BEAF1B5A3E35ECD4A306545D597E4E44301C3D1648F0A7D841F2F76FE59C6EAFA3F5B58907FC4E642ECD28D16A71EE3D295F1DE12DE1485B9CEBEB2CC6C9AC051D3D42B6A1A068533A7680A98D015B09C5B819FFC61688D441C1B7FD71180C4423E64EE940917C7DFAA19F3F51CB5B38D1B2B7C81D10E7C +pk = 9C5D171D6BBC3AB86F8900A8A4A737A42C0F82E557B84FBB6AF73ED851C7B584CB74974C6A254CEA350DC413E8F89221A5E72EA787FA329FB1B1F43996AA48CA273EC7B12BE3B8D532483C62EFD4CCCBA0015CC257560C51D0E7C9F118D07C400D +sk = 9C5D171D6BBC3AB86F8900A8A4A737A42C0F82E557B84FBB6AF73ED851C7B584CB74974C6A254CEA350DC413E8F89221A5E72EA787FA329FB1B1F43996AA48CA273EC7B12BE3B8D532483C62EFD4CCCBA0015CC257560C51D0E7C9F118D07C400D31EA1FAD99394C098FB426413E1786D30D39B5CD2AFD5E457B0200000000000000000000000000000000000000000000FA90BDFF4E041DBC2B217BCCDEE1138BA7315A3BE2B775AFD9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99C7F53F074ACAE5E82ED1E84CA2369F43601A61388F52DA12FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008B0216DC6C847FA343AAA8308B8F9EEBAAFE9373FEDE294BA53E9805405E2633621E875E2645C189FFA3AF426FD125000C8F1E5AE1863340ABA68454E719CD3B1D1F2E3E9AFEBD21DE459626FEF354804715513B9464F7B48917A309F2CEE20031113CE803337A4AF8666355B62A7C6AC2446E970B8AD6D41FC855B5A2426DB36B753236199135B2696C69C5FFE6BD0081AACBE2AEE9F96480F93EA77A34A61F214B228A38B1C546FEF20DE9CA31B3DD9EB4F22866342FCC3CE1C55080FD3800 +smlen = 2402 +sm = 8EA5F5201BC27CD1696F0438B5C5036D1484CC03CE133CA0BE1EF2A851766E256DEA43D8D9559072829D349488256210086BE8B8B6763CBE025364F39CF4B5C90516B78D745DB456C45102486E6813F4F3D11BF98C2DBFE4B1CAC3D367CB7F400000D55E28FAE3BD478F9A13C4A0640692F90425ABF293088B0002CCDAFE9F13ED1BE72D21FD3408C23E35048F153BCBF2D68F01D824C284C5632B02B18812DA4CEE70B80E7598149AE987CE038D7E402E47D1594346A6EB3EB500DFA5938A663765BF969C02227ECAE7A3B7727D285D11A383B8FCCFD8C9BBBE92EDCF000D0D99B5B6FECDB52897A1958C5C3D1FC2F20B7D045F551856EA3CB441BAD9089C64CB9489DB6B63E0655AFC4C2FA73C7417FF1B80B9C7A1D659687D2C415B3A909CA30E96849D4BCEC6A9A6A4311204936BA972086B2394D86E840770D01550CAA6AD85ADC0EC851D2B3808E4A0E9830B99A70F6204ED4DBCB6759F6228126039607AD7ED8EAFEEA28D1C3E25A46BC18AF7E01F55FAD8244F15DE36F890416AA09548554338972C5F88FD9357792819E51A63D0B872B0A4D21EA3597405B52793D50C6CD70B52841D53484BCD3EAD004CEF0A6BC16CE74CB8AD0848000D8C5158DC16625112D1D85D17A3C1C8BBDAEA42C3A43E9930724655592116C4C6D0B8B223337EE4E754541A09D898F7FED71C3785B7F8721653986C525BC00F15590616437D11F9722824DFDE7E9615F1FB8488E5327E4D8BAF5F79D1FF5E808D154951AD87638910607B03FAAC3A61FE9916BA65FFD16986DEB4169BD24A72B1C8168FE569F3C81F93F3EBDD21D4E806F79FB28550912E9AFFFB52E97860C4DC0D042C56E1BB71C28B68E416874EC7043306A29BD1F4B9A3E612A6778315E2C2B850D6EAB9FF1905030FADA250CAF308735393C191134F3C493D00B5695775D82ADB9F2ABDAD17FC41FBD7A1DEFE337C2F8ADF69154CC0862FBD43035295B1A9C80B88FA8CF75B36CA08868F881966B41FB3E239EB1DB9CB51606A0A9EBCD552B2F4E819E2C30ABDECCDDE88D2D2F82F3585B5143943C929591D20CEF559CD2BAF2DC7FE03C9E4E084E8890FCE64A4AA9F13D5EB945AD7E3CC53E01FCDC192B97ADC1F98D9E773A0177E8D97405808EBF48BF17B689BFC15F4C515E38A855A9266230C9085ADC9A6DDAED93D80C3F38BC516695D202B4E89DA5B4EBC43788C848F8C4A72F79F37F857EDC105F13E4ECECFD09302711BC1993F5308B8F32AB96FB8EC3F5EA0531DAFD0AB3451F81F47E62C593C8D3E3BEEE79DB06909576BF876145856F5F716CAA436C98EAB28C5B85BC2E4D7E1653ECBB8BB6B5BD6981DC72D7F63BA06CAC8197ECCDC72C1481DB44724A3C21F7FC60661F11FDDE8122DA5D0B1D72A29952618B373423A892875E6AD24D0916109ED8E9A9A8D9A68ACEC4BB5EEB0D00EAEA72D8D5A76C2A42F18CBDB3D336B71C70AC73D39D7EB04533453779A1F210BB4FC056B4728AFDFCF46675C6AC76F750626D642E3AB117E5D6740154759A46C27D51306587650E1039054B876849882E7DFD807BD03E69021E337DD69D9B097722C6D2AEB517D773D2F7D84D69DABE1A1D6422EA1766C0FE7B8DD4D7283F2985D96D91A132B8BA03AD85F7D56095773222D0AFDC5A192D29F3BB0C2539A1C99DB4E711B6ACE3FEBD58E45E99C9F5A04CECBB309D50397F28C48BB9CC9F9CF75A52253B634EC47216A1FD6358AF26501821864569879BE1736B0AD242AB5B8ED16A7EA0989ED4CAE3567AFE1F8209A028DB46DB0270B3BC06668A9BF5E1BC1061BABBA00EC4EC37280379139D19BC6072CC6B7D260A816CB82F9BC90897BE3025475AF12191690F9F400A914789A860155EFD2D606A15895378C827F2A4FF700303962FD96DB2DCD2D213EEBB2460F0B753BC6902DA81D44C983DD027F1171D40A2039997241E09AE5B6165B4D55A8E4C79671A8B8BDEFEF2C21F81C541A5719DEB939F866B61BE250AF371CEA7B7525094C904698D412737F7781BD779365F122EE627D9CD4A68DA9D5BE1B0431998AACF824CDD864C7365C01CD5A5F480B6AC1E5FEAD8FFE40D87C1F9FCE81867157242285C5E76CF9667919C29A67CA0C0A61D7819D9EE6B792250A358F5691CCD80578F15288F3D5D6D7DD6DFA351FCF8DF0223F7D1DA1B76711FBE0E7FABD30377660ACE7B23ACF03ABC1D973248CDD0897773FB74E20481EBD3E52657C9296B980905AD29271EC128513284F1B78F38634BF84CB80791A0C5649177791CDAB87769D57B626F78A03435C758A207F52BD2A1F31E34B6A122B8701CD9FE478C57CF3535B6D51EB46CAF794BD69363D5A56ADDE6945E9788F1E1DFD045BFBD0A68834B13D6B9EC4EA9C860EEA0E9AC19C2DE14FFBD6B57E5992B08943EA0283813F3F15E4F928B8D0F13DE6863990F5C77F130C97D8BE12571EDCEC7DEEC4B6EF4835F136DA45DA70A11F9192478FD8B4846C507410FD11668365B05252E68CB2C972ACF50156E369B83BB85E62E4BD4D84C2E9FF41A5844D5D88AAAE7DED852DAA0AE5C14A5DCE64C7E236E9B7B60F5B5AD4D953A2D842A52929491BE3555AB8DF534CAD56DBBB86B28A8A86B7BD9AD1C58C87B8A089324E00FDE32F8186B2B74523A22904C18ADE02C3E965F94624F8DF57E750EA6335E3EBA705294B76CD6ADA33D90FEC1F48DE7BA9DC7D8D60A53D2563964188874810C45736C57EFBC3A3CEEE7238AEE5281882A554F2143BDF89ED4BD819C08239C187C12A8B6E763434B92C26FDD658B350F51775C60CBAB7A2CB120DB8CE8AE9AAF6AF559F8CADE84C4820209CBD27CC09230B22F013A0E4CF8041E4A789A5D20BE9914A624AB957318848ADDB39C9748C8922C54327048A2E46523BFB22487538363459035BA49858F85A469957DF1F4831BB7FFA0564C53233B99B596F5356089949306DEDD6B904433D25C4854A80590B964DF6B0703B4F9628D6B9A4D3F0A4096E9A0B46D6B32F66D563BAF688ADD18DE001DA62E33C503A4387CE0920BA5D1E8B69C38E3745B19F8D8B6CA5E1AC6DE90EDB25FC32DF04F0849D769FBED3F8169EA1D2252619A2304E055370B4443CD23E56D4934F9F3FC92F1C1EEC626657E6A89C1394E56061AF8ECE3E2A17FBAAA4D579A99A7998632A6AE2683DDFFFFD27A27C8815511855F09ADFF7BC627A7A5C95FE57FA3EF81F494FA7EA6E6CA2D14775A25BEAF1B5A3E35ECD4A306545D597E4E44301C3D1648F0A7D841F2F76FE59C6EAFA3F5B58907FC4E642ECD28D16A71EE3D295F1DE12DE1485B9CEBEB2CC6C9AC051D3D42B6A1A068533A7680A98D015B09C5B819FFC61688D441C1B7FD71180C4423E64EE940917C7DFAA19F3F51CB5B38D1B2B7C81D10E7C + +count = 66 +seed = 83C653708FAF3E5F6FBC9DFBE6FB5E83E572A7688645D75D2C4835B28695DEA4BD7093740D0FF43237354EAD1C978BC2 +mlen = 2211 +msg = E3B57B208352A820F622A694B7C3F6F297239EF0A069615DC664C02F1822BBA48E11E37BD9749C98FACEFFFB0FE1792A386BE10CA7B98CC874C68C36F5096D3718DC93E0734D6D6F913E3B958DC1FD1424818C9437B0FD59728ED46A79FB52C737A1D1D26F04EBAC279A7FF6A971E2B69576B712D9224EA18FB9BF4E613A8935F3B36A073B01F37BDC0B77981C8F2804E93C395419352B85C8A32DD77D41DA9BF3ECB914173E80DD1FC06E8FF5BF0E4F7424849A15EB7FAF7DE77456EBB64D10DC10FEC6254070C7DF387397137372EA3A53DFDA7DA13414AF2DF16C1E38C5C70A5F5F44F725D622049256BB15DC04A8D846A1A0DAE7E765A7F00C498F1D0B2893B8405BE4A43FB7E97881069A49134A2A847184B82EB5A690D87BAF2F579619EE19A3D7A7C7EEA72D6E3FCCF0A8092BB8D3C6B551F27E63E762A30B4A4DF2DBC4D119139AE1B135D06FF827846901577700935E0011B65461C2EF9A7B71EEA33C8CA4519C7BCFB557C5E1D42D9243F2DC34057F5E0CCB9A457FC34DCB10D9B47F6EC3B9550D3AE4FD593DFA3E28C6CCA1FF1EBC9D98DA8DB869F8C80BDBF8AD4684ACB6A779CA9D0A106F26DA17043773862681C5DD2DEB1BCA2CA48D4FBB4BB7C1F765DCA3A1D991D890B9A8751CEAFF543997FAE5B128AB2EF22B3BE94499DFD9D8E78FB4C82CA8D296B0415E84CA8B5F2024455B5DECC8B4CCDC7BC4EE06B4F0C66E6748FBD07E3A3BC5B4B6889C40DC4A97AE3EB43C3914DEF976EFE3BFD84A093BD69102D7B37C89B458A55B98A1974A13A7685D26E9D816C79585BCFC1042C2AF88534A9FE8B0A6C8C44355A6D606F902DB40D5490264BF0F352C27355633CB095268D5B8BEC985A62D84B2323FE814053F05DEDC22029D2998BD0BCB255C162C4BC03F60E3580AC3AE86C37850110E9A1BCBD75F64A0DD60B941E2F57DA9D72498B3EA8324EEA53DA3895585ED2942B9140F260895DC6A1131A4C3AD2B64028BB8C0FD67E1BE4C07F808B47DAEF306FD9578025F9C639660075837B2C95473F7F860D6EA2C53F4BA677A2345CF212C7757BB94F1A4F76D4E96625F6FE051B8246D1B7611BF6FE325FFFF8514D2F9A3453F0E77AE8B958AB5B567E541F156C6F4D315B4C3C547D59BBD0D7403E2E6A49B9E7D3FDBA338ADA41875CEB03830A846A1FB266C0F1228AAD2B76A2E3404278DBE482907206FA66487AD2C999867F870C8CB7A70B83437E14B9E893BF6B391DAD75E84588E882246D161799ADEA63ADF1AD706C0A3B76BAE595D84B21AE9DA30BBC0856987F2C2C543D977747B8CBD5A613B92804ECC5284ED23650E9DAFB4B76D63F069710897334F18EA6B0CBF99CD590A78E3B050E1BB24C86D6323A17106F0CAE3F30B01E4EB3DB1B5F3A4771A880C8AC06BCD5A82D4103D0452FD7B54834C1CF8595DD77F82D4AD9EBC1CFD0C9A8CC787E10AA4D1688474208B69FF7AD4DA6986E5F62A34AC3093E0FB1EFE8AE3A96F6AAE09B0E8F6E7A2B65C7387999CECCA43CC33F026DC19BBFD867C48127CFF579D1D71AFF0C4A0E20F9FDFD599A6169DF1B85F6051E02290DF6F5EDE4F29BB6F0C8F806D6850C6534ECDDCCD75BB8E4A097C70445585740F822E5CEBB0E19EAC82BB78EBDE2CA60A810AC6C54119FD6427DA8A0155EF48653515A919B299A306FD3C62B505A6911DB2B56CA2F296E487BA02C546ECA2783ADE8E46A8C78EB1F3D7C04BB24548F92383E475CE6E572D8DE1BFA9B3E35D9BD6C79547B592C95693750010A3D22CBB31AA5A4ABE94897831B1ED9287631F006A735C36BC84A8C87497EEA4873801A733F35B328C7D2CCBE4A41C193D22F972571BA7630B33080793498CC85E6EEA1C412914459DA175A6DB8658D0BD7A823FAB286EDC20C785C40BFD539924A24AF4E3D37BD781353677C76D4672098F5BDD17017012571D9AFDA05A40AB56998E40F5E359C43DFE32CA10A45BF08F67D128C24B1ACC03CBAC46BA6CA5A532C105E91E0C77ED59FB534AEECD68735A4978177BB5A656B9F83B202BB604D61A24574C16656E512C0A4CC6F597B3268573E10539D1BA775ED83BB680BB9115011C6AD43FBB66FB37C467249060A1586DF27B2CEFA65265CCB9051E468000CCAE24F08BA941A8180A64BB624F146C8EC562363B32C369F62997C4B1375DD7DE64725A598529244273CAF8398913C6FC01522683CF1F9F965C491ABE7A554F0019514ED98D75EB8BB8565F77C195F629F98163494B4AA2674F92A41DCB67EDD1D818A5B98993D0B1198BB6BEDABBB486BC6FDE039433E842BAC568A5B4EACC028CC2544B57D8883848DDDEE2E967EA85A6102BD0ABDDA41C3D78447BEE1D4949449ABAA9B3377E8CEDCF04A500FD1A6916E26983E64B5E96FEF87B32A060444D374409262453CB1376C349A8B5D1767B1E2991A1A6044E0F58831BD11F12159675D215D7EAA74807C995FE22017E30482DB8A4B09CA7800822C75C92FF649FC0728F5A1D44EFE7D0FF147274152D5F2F60342C8F5F951D8C95F83C1D54613A182D9DCA68F54FD55047F1F90CFECC04D733DFA82CFF2618F29A4DB4F7E1E59DEAD58CA65D07CC90C25F804A895D6A82F9375451CC55506D276FBF783F7D4D53B9BFB83DBE4A8771AFE21AC543983D68034BADC980F9434527F9EDAA2E228646FDF75B44899E749CF4C9E5B345222385A4424382603AD6EFC24C56E769028F4394F2F6220A9B390D395E412498E57A08BAD927B8BD5D76E18E8FEB457FCBD3248D218236B07783E57FBFA03C292A9F5719E6AEF2EEA3FAB2CAEED5442E89BFFB236CB13DB2CF9C35A38C338C377C475DAF45F8EA822F9AAAC13425FBD43D3DD9229367F0B3687D7E82AC5EC2FC7CDB69C99A4EB1B8E45465C6A53F16AC0C4E0C970B8C732AF515C09EAF25596F64A04AE4621037B8841FD2B1BBCB310EA23E122B0B9AB96D8F7702952D0E96E4CF79C2A30DF0091ACDA91479EE2979B0054997C48F6A0E909BC52A943459AF25553969EB31CE7685369A7FB014561B4697B8BCE220983136E5EB2303CCA4EADD4C6CC74EA2FE69D448AE6ED953A80363DDED5591B27A1EA956DF081CE99AA59DFC789D9D8FAE952B0737099D467D +pk = 60EBFDDAFC244AA3F770BB20AF3C13F3F5357E3F2334831294A92C5C8C12FDFB7C8760557D9807FA2741D3E12DEDA31EFC32CD20BB0C851759A6C7F04F1EA28E7F329B5D9E1FD5A4C2D88D21920EBB02440342E759B47126203FDA5E56CBF82502 +sk = 60EBFDDAFC244AA3F770BB20AF3C13F3F5357E3F2334831294A92C5C8C12FDFB7C8760557D9807FA2741D3E12DEDA31EFC32CD20BB0C851759A6C7F04F1EA28E7F329B5D9E1FD5A4C2D88D21920EBB02440342E759B47126203FDA5E56CBF825028BD2787C526223C44EF5A83F72FD4752A78355BBB2A21978B0020000000000000000000000000000000000000000000068938F026D0B471B88CF0A8C0326F64FAF2DB6FCE88EE2E7BBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD41847A29D24EFBF392B9F2258D6F1B84EAA2124CCA9C7565FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000884F5E93D2CC30A093148562892CF5B73AB32035B71513865EBAB8FBF44663822C062EE08B7E3A64A106FCEEA7E421000BF15A7AB2D4805D4EB6D5731C256A4BE3AD0174ABC3DAB58EC68CEB35F790AF8DB664FBBAAA28975466AC6C6C566A00D3DFC8CEDE2F1BCFE91B2B2605220D0F464F009FEB255B7D5F3547B4BC98B6AB183F1572D81C9AFE93D8596CB23DE90061CEAE9EE3F3CAF391B177D8E22B05BC9A11C8CAF8A54BB0AB9613B57BB7683BE3D020D3BDB392C1B3809F950D7B0E00 +smlen = 2435 +sm = D3E7C5671216FCF4CEEF239C048781D39B53A1D665431A97C7F8C6D443EC7660914F6E787D5798121011F7CB44A9F32A06F018066D6EE18FC4031A89E24D16C6CE2568AA9BF211ED0E34B55C22E55914D75E6D855043822F31A1160A081806320002FB6BD774EBD7AEFFB0E4DEB1B7898DDB793F6130E0038BCA03C854043A3392C05A89CE8918963AEDD0C511BD3C3F336C7400DC6E5DCC496D5EED56C95E6FB12FD5C28CC0EC0B40B791F201B4A55077FB62D249AFB73936D0918E61A4FB2AECA32E5DAF00C0DF293A3DC5EB76339C527E1512270B765913C090AE60000202E3B57B208352A820F622A694B7C3F6F297239EF0A069615DC664C02F1822BBA48E11E37BD9749C98FACEFFFB0FE1792A386BE10CA7B98CC874C68C36F5096D3718DC93E0734D6D6F913E3B958DC1FD1424818C9437B0FD59728ED46A79FB52C737A1D1D26F04EBAC279A7FF6A971E2B69576B712D9224EA18FB9BF4E613A8935F3B36A073B01F37BDC0B77981C8F2804E93C395419352B85C8A32DD77D41DA9BF3ECB914173E80DD1FC06E8FF5BF0E4F7424849A15EB7FAF7DE77456EBB64D10DC10FEC6254070C7DF387397137372EA3A53DFDA7DA13414AF2DF16C1E38C5C70A5F5F44F725D622049256BB15DC04A8D846A1A0DAE7E765A7F00C498F1D0B2893B8405BE4A43FB7E97881069A49134A2A847184B82EB5A690D87BAF2F579619EE19A3D7A7C7EEA72D6E3FCCF0A8092BB8D3C6B551F27E63E762A30B4A4DF2DBC4D119139AE1B135D06FF827846901577700935E0011B65461C2EF9A7B71EEA33C8CA4519C7BCFB557C5E1D42D9243F2DC34057F5E0CCB9A457FC34DCB10D9B47F6EC3B9550D3AE4FD593DFA3E28C6CCA1FF1EBC9D98DA8DB869F8C80BDBF8AD4684ACB6A779CA9D0A106F26DA17043773862681C5DD2DEB1BCA2CA48D4FBB4BB7C1F765DCA3A1D991D890B9A8751CEAFF543997FAE5B128AB2EF22B3BE94499DFD9D8E78FB4C82CA8D296B0415E84CA8B5F2024455B5DECC8B4CCDC7BC4EE06B4F0C66E6748FBD07E3A3BC5B4B6889C40DC4A97AE3EB43C3914DEF976EFE3BFD84A093BD69102D7B37C89B458A55B98A1974A13A7685D26E9D816C79585BCFC1042C2AF88534A9FE8B0A6C8C44355A6D606F902DB40D5490264BF0F352C27355633CB095268D5B8BEC985A62D84B2323FE814053F05DEDC22029D2998BD0BCB255C162C4BC03F60E3580AC3AE86C37850110E9A1BCBD75F64A0DD60B941E2F57DA9D72498B3EA8324EEA53DA3895585ED2942B9140F260895DC6A1131A4C3AD2B64028BB8C0FD67E1BE4C07F808B47DAEF306FD9578025F9C639660075837B2C95473F7F860D6EA2C53F4BA677A2345CF212C7757BB94F1A4F76D4E96625F6FE051B8246D1B7611BF6FE325FFFF8514D2F9A3453F0E77AE8B958AB5B567E541F156C6F4D315B4C3C547D59BBD0D7403E2E6A49B9E7D3FDBA338ADA41875CEB03830A846A1FB266C0F1228AAD2B76A2E3404278DBE482907206FA66487AD2C999867F870C8CB7A70B83437E14B9E893BF6B391DAD75E84588E882246D161799ADEA63ADF1AD706C0A3B76BAE595D84B21AE9DA30BBC0856987F2C2C543D977747B8CBD5A613B92804ECC5284ED23650E9DAFB4B76D63F069710897334F18EA6B0CBF99CD590A78E3B050E1BB24C86D6323A17106F0CAE3F30B01E4EB3DB1B5F3A4771A880C8AC06BCD5A82D4103D0452FD7B54834C1CF8595DD77F82D4AD9EBC1CFD0C9A8CC787E10AA4D1688474208B69FF7AD4DA6986E5F62A34AC3093E0FB1EFE8AE3A96F6AAE09B0E8F6E7A2B65C7387999CECCA43CC33F026DC19BBFD867C48127CFF579D1D71AFF0C4A0E20F9FDFD599A6169DF1B85F6051E02290DF6F5EDE4F29BB6F0C8F806D6850C6534ECDDCCD75BB8E4A097C70445585740F822E5CEBB0E19EAC82BB78EBDE2CA60A810AC6C54119FD6427DA8A0155EF48653515A919B299A306FD3C62B505A6911DB2B56CA2F296E487BA02C546ECA2783ADE8E46A8C78EB1F3D7C04BB24548F92383E475CE6E572D8DE1BFA9B3E35D9BD6C79547B592C95693750010A3D22CBB31AA5A4ABE94897831B1ED9287631F006A735C36BC84A8C87497EEA4873801A733F35B328C7D2CCBE4A41C193D22F972571BA7630B33080793498CC85E6EEA1C412914459DA175A6DB8658D0BD7A823FAB286EDC20C785C40BFD539924A24AF4E3D37BD781353677C76D4672098F5BDD17017012571D9AFDA05A40AB56998E40F5E359C43DFE32CA10A45BF08F67D128C24B1ACC03CBAC46BA6CA5A532C105E91E0C77ED59FB534AEECD68735A4978177BB5A656B9F83B202BB604D61A24574C16656E512C0A4CC6F597B3268573E10539D1BA775ED83BB680BB9115011C6AD43FBB66FB37C467249060A1586DF27B2CEFA65265CCB9051E468000CCAE24F08BA941A8180A64BB624F146C8EC562363B32C369F62997C4B1375DD7DE64725A598529244273CAF8398913C6FC01522683CF1F9F965C491ABE7A554F0019514ED98D75EB8BB8565F77C195F629F98163494B4AA2674F92A41DCB67EDD1D818A5B98993D0B1198BB6BEDABBB486BC6FDE039433E842BAC568A5B4EACC028CC2544B57D8883848DDDEE2E967EA85A6102BD0ABDDA41C3D78447BEE1D4949449ABAA9B3377E8CEDCF04A500FD1A6916E26983E64B5E96FEF87B32A060444D374409262453CB1376C349A8B5D1767B1E2991A1A6044E0F58831BD11F12159675D215D7EAA74807C995FE22017E30482DB8A4B09CA7800822C75C92FF649FC0728F5A1D44EFE7D0FF147274152D5F2F60342C8F5F951D8C95F83C1D54613A182D9DCA68F54FD55047F1F90CFECC04D733DFA82CFF2618F29A4DB4F7E1E59DEAD58CA65D07CC90C25F804A895D6A82F9375451CC55506D276FBF783F7D4D53B9BFB83DBE4A8771AFE21AC543983D68034BADC980F9434527F9EDAA2E228646FDF75B44899E749CF4C9E5B345222385A4424382603AD6EFC24C56E769028F4394F2F6220A9B390D395E412498E57A08BAD927B8BD5D76E18E8FEB457FCBD3248D218236B07783E57FBFA03C292A9F5719E6AEF2EEA3FAB2CAEED5442E89BFFB236CB13DB2CF9C35A38C338C377C475DAF45F8EA822F9AAAC13425FBD43D3DD9229367F0B3687D7E82AC5EC2FC7CDB69C99A4EB1B8E45465C6A53F16AC0C4E0C970B8C732AF515C09EAF25596F64A04AE4621037B8841FD2B1BBCB310EA23E122B0B9AB96D8F7702952D0E96E4CF79C2A30DF0091ACDA91479EE2979B0054997C48F6A0E909BC52A943459AF25553969EB31CE7685369A7FB014561B4697B8BCE220983136E5EB2303CCA4EADD4C6CC74EA2FE69D448AE6ED953A80363DDED5591B27A1EA956DF081CE99AA59DFC789D9D8FAE952B0737099D467D + +count = 67 +seed = BC81485EE93AAD8B464B5199FFEF9FEFC06EA97645BDFE0B4E915B812E606A77F93917ED925E882161CBB909747AC4C8 +mlen = 2244 +msg = 89D960D04A3DF6984276A3D17D59AF9E72B25418C8797170FA701A672C5835CEAA22DC35470D038C6ACC5082D2AE329F36697C91CBB1F9E42DA59A654462BF19E04352192778CB050DB6F4A656F6AB0BD9641CA8CE6C1EF8B020A3D9FD9DFF772F38926458BDA6E6072456E506AE464785399AD7B498AFD4C211F09D0C722FBD9E20890CDDC8C6EB9EE75390E6D76D0672FA64D8B97C65CCA46DD1F542B6D6014F035D2817C4B9430AC8DC318CF8642AB34F4C8D71FC0E3B1FC961E94B6A84622876250FDC21987777360784D9A58F35E1C9B71F30561ED6854EE9B112E7B20CE064272213BD1A46D0D19E5EFAFAAC7ADDF4D7B7A519D689398EAF1E67E64ACE8E5E89756377E1FE458D04E3DF7F6680F8B69815680276ACDBEE6C8E1AA909EC56994F3EF3B65FBEFDBC29AEB0EA906274E838CAC36A0607716FBC2B8DA6150A4EF39E1CD9CCA72915007723C5D2442F7133258234D18A257DA2C13E53B47DC6ABC2D607B98E351FCECEE8BA8886821985BB3A7BD02429ECDC5A27EB04D01DADCE88A324AE44F567593FBF730C284414056FA33CE90A6D6F146DBB1635BD26B4F883D4948DA47216C70D2AA58CEB3979523C6A4F2F7EA455A97C7ADB6C43685D63BD4C51D7DDCB81A06B9BAC31A7B255B94052D686128D234BCB63CE713028451B18B981B83DA1246281FC3BD2B06C741CF71979DAEFDFA0FD06FBA3722FF7BCB2821FBA964FBE9F6467FE583C06D3889A40360A7AA03358175EE75EB8FD1D3368C30B5691776C163764DB924FBA2362CC9572F642CDD2B11B40FA2683A529EC2100DEDEDEAA70A1E639A71D6A96AD31F70A00FB63875D0FD5C21E56AE57B6E74EECD2EF34BB3E20BE5A1F9F1F54955A18B4E4E4B9119973DEB76A2A603FB6410A350667ECE5C1C147DD00B07A88A7D0E86AA2D747A867AD90BA6660C7A0432E20849EF642A20CF5A20AF7E34D139B39DD65C65B36750F17F0B9F1DB06CC6E16F10EB289F567B647454A581604F381D66371238AB785585A4DA2D00810EF6851A6009025FCADFB77FF7996BA6B091FE4130733466B29FED46554FEBC2AD291DD966BEF4D79A9E04014D3003C95696E8BC39892AD32DB6D6AD22D33E931BC87F78114BBBD97B334BCEA676F9E9DB23C0485EC06D8F37F070C143117B1BEA49F06E1A2423D98C12883D32D29103F7699646E7091D393B21A260703E17380A1BD85452702C3AF7DF73AE7856A1C066013014DE62C3C817DD74C44AA436A71490E7BDC6B8B74BF61711FDCC541AD7DC49CF4C3EC154879E048FF30DF25065B5641367CBD3BBA19606A9A27A64055D5D3B538FC88EDA66FF9F26E619DCBA696866DE54A8DC8580B5B28144F952FFC6DC543E98CC9FD7F4538135C0F4DEB4BF892266DCC48A4D1DDCF407BE4FDF2A5AFE4A0105A20CE2B3D9F48D608DE2315240875F1FED696C49CD8D4A78AD26F51B3C804949C536CE35C3963DC1D238516B3F2D297F5C9939A946A0170E185C75087F37ACF907F9E3F87A2B15CF81C7ECBF2165F0F3962D11E9C6A7845ECEF432CE9E1FBE74C77EA1057D79CB595D47A8DDC1D911C6B97AF76D91F3515081B95CED16275DECDEDCED9AC790D73739E35973834503133510DBE39201F9B5C618231184B9DBAFAA7ED6623E8BC492170812444DB62D4F01925DC4F821C0896A746B4453E93EE51844B311B0A0A51601477BFF651EB5EE331227A2E9E49F593EB2988E449E750E990A8A89906EFAB00E0955C81B6AEB160313007B481C40908130597626935389E47AFCB0A20146F0C7B29B567E95D59CED7FA8023A2D69C89443A11E7150A03D09EE6B0F74358141D48E9BCAA3EE081C7D8F8C223F4D48EFB3DF8A4E287FC5B90B4FD251CB616687ED09AB1A06C42EB9D6A578D72E99D499882D216DDB3F35B0A33D9F2D3D4A700161A5C3B5A6729F197479E78009794AA1BE3C25E0B9142613AD2EA508ACAEF5EEE33DACF60CB7A16AB38D9F3CAFD2150081B63A3A6CA0163A25FE81206A37A0874FD55FA3068B4C1B25E6325FA56646EE5F3431D33D0BC691C134AB306B0BD2D1087F4D898A529DAE08B97683FE2EB8ABC9095D67B79CFF0E77404C1F7FF316C3CECBAB77C710FBF961008047AF22805D77EFF79F815B21D142F517DA2199F6627AD9FD85AA24E9B7F40C7796207A82901C7B5A3A42369A9BCEBC24ECE13A3ED064E4E748BEE2890BB21B8E4845362BE9AEE46E25418F7CA38ED087E46E24F12012A1312BC623AABA6ED227CEF116A3C2130B4B837AC77D86F8CA3553BA0CF5AD45E9B4E4E55059F1D4675291581D7CC9E5839212AFCFA897E90CB601CB33A4D2241A5ED5925F6416BE5A43D4767FA04F701076AD5ED5ECE2D09B8DAF11B00FEDD2AA2E748CBCBE365031394EF823951EBC52B3E4C79D79234C16575910C29A35EB67C624F7504EECA3921F461D7F95EEE39638C402481DF7B59310C4554450789DFB28ED1E485C0018512EB05F14DC7A3DB5C0606F9E28420D76B8F8534D2AE31AA01E90A20E248A7FB3B72EA859031C67F7B2B043D38F7183165A42AB28C6308608C530A9CA98F82C133BBC313FDDD2109838E970DC9989EC14DF781A518F6CB56DBEDFC1E381250C64F95D0BE5F37515437673425374D44811F4406EE2B5130334BA555839E61AE623D283C77247D2EF8B22ED138A526F7E41DFD41FC69A2839B77B51C6FD96D97D3EF8359E8725BA1AFA80278FB3BA9C697F7E2BBCC5D3F0F2E61BFCF542D3160EDE02CD6295FCC55865E7890342572499347DF80EC073A91E00193BAF804B884E9CF5C43269824D4CAF7EEF49FABD8BDC5496D190263C96DBCD287681C19B90C34635FFBDFEAFE0601BBB7514FD84896A22895E9B21FAEEA372696E350F13959FC23533F3E8C34B17B595F3C935E37220AAF644F3A565114C34C7B85F1A3E465470166A62B13ADB00A2BCD5A9A3ECD59FB772F09DD6A6E2AD12FD54EC62CFACE0022F2FFE3EB62DB0F4D0F0F9D1FD6F3F11D76DA868D2C1C4124915DE19EACFFCDB31F7CA018B6976260CA1BB2C4FCD6B9958F096313B608E208D875EA5A1FA89916D0367EDC4F8890E93F1E660AFF16EA79D1E583007E693BF06C172105B3DC24117DD921FB60D3AC0D2E5C89FEF17087D885A0794E496E3CBEA333CF72A507788EFE +pk = 2314DA10722E48990EF8AFD657DEA8C619B183A9D83C4DD1B6E39A14815660FFA3993436800DE9D8C3058B918BEB4A0544C19BD68EB3A49281A8FBB585723D428B6F1A148F9DDA4697EB5495B286B58415E01F71A15E0F1891D15CE80513B92A0D +sk = 2314DA10722E48990EF8AFD657DEA8C619B183A9D83C4DD1B6E39A14815660FFA3993436800DE9D8C3058B918BEB4A0544C19BD68EB3A49281A8FBB585723D428B6F1A148F9DDA4697EB5495B286B58415E01F71A15E0F1891D15CE80513B92A0D8B47C407D43D6BEF7F4B2C473847160DD746480E46B949F3410300000000000000000000000000000000000000000000E62BBD281C694A6D07E930B2C81C8C996F4E9F1478B48AEDC4FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD023C6658F18E75D6B0AB2DAA909B833D50C07CD9DF167DB5FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A1AB4DB5AE4EA6721B68203EA56BE498D975BDC2CC9DEC7582B0A6A8405C25C738F5F92D9F068C7C4F5EC7120877F20064425F1447CD10A7364B81463C48E99E4184EFADBF124465D99E12FA6A588574A461CCAC392A688EDB9A502ABBE4C6009F6014BB4FBD4CC26D4DAC7691CAD31BADEDBE7296487372652DFA04E501FE9AC50D3E8881B081F322A4D6C3CEF99F00ED4BB56A1903160B66ED86E0C0A6533FDEE61E5A6E6DCE494AB43EBAF14D31964B07600A5EF84C02B431AA225E2A0B00 +smlen = 2468 +sm = 7756F37BCDB09C4634856AE42E60FBCB0B8FDDDC08B55C93C30ACB294FB71A1A1CB2F9936009CC8407FA2AFCB1DC8C2862D4CCE87212CA7119C16BD35BD29FDBCBB5B4BE6D19C699A17AAC597522B2E9BE0C2E364D6E81581D81069709145725000661BDB04FC371F994864194BDB4C7AE3BC1843100125B42A80188AA4EDD1341F45DDFA3735E29BAEC72A7CE12F98BDE972D039E794F467A1A4F862E8F048D1FF873E493078E2FDA1B8A1D03B00CDC9E373A1F730D570B6E40EAFA85D30364C7BADA5D1903FECE0F73DFE07892A8C7DDB3FE7592715D53053B60D35100020D89D960D04A3DF6984276A3D17D59AF9E72B25418C8797170FA701A672C5835CEAA22DC35470D038C6ACC5082D2AE329F36697C91CBB1F9E42DA59A654462BF19E04352192778CB050DB6F4A656F6AB0BD9641CA8CE6C1EF8B020A3D9FD9DFF772F38926458BDA6E6072456E506AE464785399AD7B498AFD4C211F09D0C722FBD9E20890CDDC8C6EB9EE75390E6D76D0672FA64D8B97C65CCA46DD1F542B6D6014F035D2817C4B9430AC8DC318CF8642AB34F4C8D71FC0E3B1FC961E94B6A84622876250FDC21987777360784D9A58F35E1C9B71F30561ED6854EE9B112E7B20CE064272213BD1A46D0D19E5EFAFAAC7ADDF4D7B7A519D689398EAF1E67E64ACE8E5E89756377E1FE458D04E3DF7F6680F8B69815680276ACDBEE6C8E1AA909EC56994F3EF3B65FBEFDBC29AEB0EA906274E838CAC36A0607716FBC2B8DA6150A4EF39E1CD9CCA72915007723C5D2442F7133258234D18A257DA2C13E53B47DC6ABC2D607B98E351FCECEE8BA8886821985BB3A7BD02429ECDC5A27EB04D01DADCE88A324AE44F567593FBF730C284414056FA33CE90A6D6F146DBB1635BD26B4F883D4948DA47216C70D2AA58CEB3979523C6A4F2F7EA455A97C7ADB6C43685D63BD4C51D7DDCB81A06B9BAC31A7B255B94052D686128D234BCB63CE713028451B18B981B83DA1246281FC3BD2B06C741CF71979DAEFDFA0FD06FBA3722FF7BCB2821FBA964FBE9F6467FE583C06D3889A40360A7AA03358175EE75EB8FD1D3368C30B5691776C163764DB924FBA2362CC9572F642CDD2B11B40FA2683A529EC2100DEDEDEAA70A1E639A71D6A96AD31F70A00FB63875D0FD5C21E56AE57B6E74EECD2EF34BB3E20BE5A1F9F1F54955A18B4E4E4B9119973DEB76A2A603FB6410A350667ECE5C1C147DD00B07A88A7D0E86AA2D747A867AD90BA6660C7A0432E20849EF642A20CF5A20AF7E34D139B39DD65C65B36750F17F0B9F1DB06CC6E16F10EB289F567B647454A581604F381D66371238AB785585A4DA2D00810EF6851A6009025FCADFB77FF7996BA6B091FE4130733466B29FED46554FEBC2AD291DD966BEF4D79A9E04014D3003C95696E8BC39892AD32DB6D6AD22D33E931BC87F78114BBBD97B334BCEA676F9E9DB23C0485EC06D8F37F070C143117B1BEA49F06E1A2423D98C12883D32D29103F7699646E7091D393B21A260703E17380A1BD85452702C3AF7DF73AE7856A1C066013014DE62C3C817DD74C44AA436A71490E7BDC6B8B74BF61711FDCC541AD7DC49CF4C3EC154879E048FF30DF25065B5641367CBD3BBA19606A9A27A64055D5D3B538FC88EDA66FF9F26E619DCBA696866DE54A8DC8580B5B28144F952FFC6DC543E98CC9FD7F4538135C0F4DEB4BF892266DCC48A4D1DDCF407BE4FDF2A5AFE4A0105A20CE2B3D9F48D608DE2315240875F1FED696C49CD8D4A78AD26F51B3C804949C536CE35C3963DC1D238516B3F2D297F5C9939A946A0170E185C75087F37ACF907F9E3F87A2B15CF81C7ECBF2165F0F3962D11E9C6A7845ECEF432CE9E1FBE74C77EA1057D79CB595D47A8DDC1D911C6B97AF76D91F3515081B95CED16275DECDEDCED9AC790D73739E35973834503133510DBE39201F9B5C618231184B9DBAFAA7ED6623E8BC492170812444DB62D4F01925DC4F821C0896A746B4453E93EE51844B311B0A0A51601477BFF651EB5EE331227A2E9E49F593EB2988E449E750E990A8A89906EFAB00E0955C81B6AEB160313007B481C40908130597626935389E47AFCB0A20146F0C7B29B567E95D59CED7FA8023A2D69C89443A11E7150A03D09EE6B0F74358141D48E9BCAA3EE081C7D8F8C223F4D48EFB3DF8A4E287FC5B90B4FD251CB616687ED09AB1A06C42EB9D6A578D72E99D499882D216DDB3F35B0A33D9F2D3D4A700161A5C3B5A6729F197479E78009794AA1BE3C25E0B9142613AD2EA508ACAEF5EEE33DACF60CB7A16AB38D9F3CAFD2150081B63A3A6CA0163A25FE81206A37A0874FD55FA3068B4C1B25E6325FA56646EE5F3431D33D0BC691C134AB306B0BD2D1087F4D898A529DAE08B97683FE2EB8ABC9095D67B79CFF0E77404C1F7FF316C3CECBAB77C710FBF961008047AF22805D77EFF79F815B21D142F517DA2199F6627AD9FD85AA24E9B7F40C7796207A82901C7B5A3A42369A9BCEBC24ECE13A3ED064E4E748BEE2890BB21B8E4845362BE9AEE46E25418F7CA38ED087E46E24F12012A1312BC623AABA6ED227CEF116A3C2130B4B837AC77D86F8CA3553BA0CF5AD45E9B4E4E55059F1D4675291581D7CC9E5839212AFCFA897E90CB601CB33A4D2241A5ED5925F6416BE5A43D4767FA04F701076AD5ED5ECE2D09B8DAF11B00FEDD2AA2E748CBCBE365031394EF823951EBC52B3E4C79D79234C16575910C29A35EB67C624F7504EECA3921F461D7F95EEE39638C402481DF7B59310C4554450789DFB28ED1E485C0018512EB05F14DC7A3DB5C0606F9E28420D76B8F8534D2AE31AA01E90A20E248A7FB3B72EA859031C67F7B2B043D38F7183165A42AB28C6308608C530A9CA98F82C133BBC313FDDD2109838E970DC9989EC14DF781A518F6CB56DBEDFC1E381250C64F95D0BE5F37515437673425374D44811F4406EE2B5130334BA555839E61AE623D283C77247D2EF8B22ED138A526F7E41DFD41FC69A2839B77B51C6FD96D97D3EF8359E8725BA1AFA80278FB3BA9C697F7E2BBCC5D3F0F2E61BFCF542D3160EDE02CD6295FCC55865E7890342572499347DF80EC073A91E00193BAF804B884E9CF5C43269824D4CAF7EEF49FABD8BDC5496D190263C96DBCD287681C19B90C34635FFBDFEAFE0601BBB7514FD84896A22895E9B21FAEEA372696E350F13959FC23533F3E8C34B17B595F3C935E37220AAF644F3A565114C34C7B85F1A3E465470166A62B13ADB00A2BCD5A9A3ECD59FB772F09DD6A6E2AD12FD54EC62CFACE0022F2FFE3EB62DB0F4D0F0F9D1FD6F3F11D76DA868D2C1C4124915DE19EACFFCDB31F7CA018B6976260CA1BB2C4FCD6B9958F096313B608E208D875EA5A1FA89916D0367EDC4F8890E93F1E660AFF16EA79D1E583007E693BF06C172105B3DC24117DD921FB60D3AC0D2E5C89FEF17087D885A0794E496E3CBEA333CF72A507788EFE + +count = 68 +seed = DE9E2742591A5AF6A6153DA85A510C39FD31A2ACD8A8511F190A9A5E5753E63D9801A8019508E67DEB1E9219CC18BA3A +mlen = 2277 +msg = 8337940EE74590EB25E52E78E8563A09CD2D45F650F48775E3E61F9E3509CC8EB7E983310D0185359F66BD80E0DA1E45A6BEB53ACEBB9030E310E81A576D0F80C64FCE1D1FD77DCA27B7C6E02B0CC26EDBF496AD2E3CE8484E988E56BB28153587D7ECB02FD8882545E7BF79CC9966A7FEDE93F7E9451BC48FDBB481673D1C4135F95D68F40F4B4F847345A320FB4D736BF5F9FD347435462DD3A238E4C799E7CEE081107E11682C7B558B19177522427F1D269FAD81B565BE538E8FF2D7193579AEE51E50974BDC0B66331B59BF496C87E4F6E143754076DB516C9C538410FB38A930CB5BA1E6610441126D01C8EB5F34E2E58424B8B218D9E68C5D8B4F5258EEF07EE0AA5475A72CCF363D47D825FA524C16C7B7587C44864DA9E4B267F738B87F7E5701147F550CD38774B17DE48E6969A0DEDF334FA67470419059C4D1607880CB12FA9C0ED23032C7E0F325169EACE7DACCDD4C2E5097FBBA859970D7EAC4522C1FEA043C9278C1C89FCCE95203033B4CEA4F9F24B55BA6B79EF88F275310C6E48189EFC1EEEDAB66B56B6BB028726BC463D93D742492841E85D5C837948978D0FADD1C172F8859C802C6BE8394A05DADA7546EE1CC5BB909D3189088F4FA6D07C573ED7263C081720E701D5D4B027AE54BE175536F3BD5E91993CC040311A7D352AA26414CAE30D10408DDB44E8C9513F4619E99EDC894F963489876B24BB0B91BDC3EE5B78AC0D4046B2E864789C0C779E5AF97F8F84F09A26FF74B8BCDE66C007970830B70C2A1122DC9845905C3AA7810B40641E8BBB398A23BBEF52BEDABEC7BB54823E64177A73786992DD67D5C007D770938402EFBCB3A60281C5706920A9EEE4C26C0B251C32B9E1936FDEC2928110959E99255508250FD5BA84B4FB314187124072D30FBF2163D36F1480ECC08F7FB8093BFAA72F1914C63533EBB3A57420DC38DC93DD6AE4D197FAB790C1EFC1B7A2234522E0B408D0648C7AE782F2F08CB70B96CD76B5089AF1EF4BA3A4C2FAAC363A4DC1C6C421F6AE1E9B67461EB02F36C25E763F1A2B73CEED4DCEDDCE619CB313D124CE6F7AC986D6BC344E630F22CB654C1286FBC0EE01C968DADD1EDAD744C8BC828CF5F316336A5883166ED000FF98D6CE2CEAE7D3E40BBC5714F71BA9E25E1506D644FB2DE2FE190D327ACCCA79D9B6D9DB505CF1853E98F30E9BA5E568ED83E2567C936A64420C5D8F07AC4F65F38C28E88DD7B5209A600AEB81A6D2AFA4FAAEFDAFD9B7FD3AD7F49462CD577204184F9D44A45E2A909373CED24EC0EE56BF2E6675C506EDA67B1E6DAB75CBF1822E20E7A8A81A7729B42A6D67A1DD457FCD19B62F048AB97B3D694254E5C051FD2DAF3D12AD627EC37C22117BDEE9EAA290D11D56BAFF0DE1037EBA908FA03E2F869FA2B27936669306E8E70A0A4910A123F202797BF1C8FE47178BB1E8E8D7AB1C01F30F5E779B2BC99902DF15185FED4C865997AB72254162D00858E0908EA95A9ACD0FCE72E571C7A381CC33E06A27FE6A5922775EE82C973CC3CA8A05717608F8703946C9A89854D627744DA475DEFC1390DC44FCC3A23C47AA8AF17240EB1A1A00A062D258D471F31333D0356243DC1CECFC559378B4395F01A970EA4074D5666B44D49EF291ED15930DADA66765B165CB8331CFE549C38CD0672F534BE60F4D9B4C125FFE747670513B5744676899B256B992E15106B99B794DB3950582816612144649210751F3D0DFD5B25CD393E724F7FDEF00756D0C8540E8891E592507599B06EDFA6EBFE543084AC81858F5EB02D8F5EB8A72184851E8589A3AC6DFE1CDCF286723FC4C1202765FA4F783EE58C627ED494C7149BCA6A4DDB420827CDCA82DC42515BEAF46CE9D9ED524BD00EBD3094F770B1E1DD09FC431E4C244D2305619DAE208E65EF385EA92F5A79F12B99AFDAEA79C9D8D319944AC6CBBE3F1290EC6B87D97785E059E6871FDF239BC404021CB52064B88EB4CB3FB6A871B0F76C12D7B8C5E8FE0A65024AB5B25F4C67B6D15C22B0005B754CF7CBEC898B49F4326F1AE4034E5F5A446A96CE08083D48525A3661E10C996DD22DC34FE570A4C8817D10D750FC5C2ED0C24C7CBCBA5CD1B2680DBAA3315FBF2BA7457ABEEDC96B5D111110D4678EA5C7851D25F258926B0B028365799E940A6E17BB03CB332FBC6D713DEA7108FC6268C8D33E7A578C94FF75BE808C15FF7884F092C0E309F1AF99B1A7314FA0F32C8D8E32B3E9D92C9C8FF6B8FBB99111529C4BE3A2A4F62884373D0903180B4DEABE613DE5CF19415DFBA7F9A46297AE2F21D7EA420B41F628FD8DEBA55207606539D11791623CB325F1E18C98AAC27283BFAB2408F4FD6CC58EC9E306643BA1C0C77D84B3930263E5A76A1CE94F3D7721F0098D54E6C990C3AFF69B6A0D82C853EA2AF2D3D2B3E96DAD59FF873171B55D16CA9A7C68DAD2E918174D264919DDCB4B9D01CE622D56C599BF60711C74315C918A7BB97B9513937AFB6A652DA68B6B0B34E316D7BE9F5C282A5E8773C892782EFF220667A6A54069C37B88EB1CE676AAECF2015E59FB7AF4D30C4625DD8DE4805F505E83C877CD61D2A0BA65B32B0DBDFBACFC88CA43E4DDF7A1A4517DCE83B7B8ACF8DCAAD28284039747935865DAF8DCFCA29FB676CE2EBA2C509CD75588FA5E58CEFD0694626C9BB31C3AFC372ED313C9BB3ADC398E89DBDB108DDA63F9380EBF9DA17B378451634682F9823E209BF10E39F884ED270413152025CDBF4875C121B1E83E12C044453FFDA6D8CA2C240AD522577C6898AB6F2ABE1FE77F860939408CD193E605F87FF2248FA163AC2FC0F39BFC38503B23F5441E0E364CAAAB890073266B3B51217661F5DF41C0BA925BB425AB3DD7B6A3675B7D60D0290131EAD53A4EAB0C66BAA83F2FB77E74C3C123ABA7731A3F62FAB8EAB2A96E8BBC911E501CD23A088E7887A469284E0B5C27B5CBC1DE2B6938CF1AF58A47FE78141306CB76E8F2B73620BC4549DB6826D2D72873885F6C5311EB5B9462BB4631D314DFB9C836C6F4D9EEC6818940C04689CC4D8D11ED9869355617861340E722B2BE78197746E2759AAA8D68D1965888E89B6B0F5BF51F94E586B2CB8708F4CDB520BF31DDCCFB7CB69E29A7AE8AAB12C11F431DE40FB9E82EB5F2B6BA1F9757F1487B63255FA69A755601C2FE17CD1892D5A6799C35D05098DC133BDD71318667D47C4671 +pk = A0981413FB53C7B74F18F5243F58FD8A601602A08CE000B4CA4A845C81372C7DCD6E058DA03371C254E74D1155E24037ED69FA3595D8A73846FAE58949782E917DB06DD1A97F1014551DF8F66F7803F281843B764C5DE5BAA41641D0AF04BA1915 +sk = A0981413FB53C7B74F18F5243F58FD8A601602A08CE000B4CA4A845C81372C7DCD6E058DA03371C254E74D1155E24037ED69FA3595D8A73846FAE58949782E917DB06DD1A97F1014551DF8F66F7803F281843B764C5DE5BAA41641D0AF04BA191503312C250E5C04927FE136EF867F43B3C865CB45DC8DDD513B0100000000000000000000000000000000000000000000FA1C3C1B05D7D9A1EA4B4580FA84B2C047BA25892963570ADAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1F945BAD07C834A6202B4D050390C5DA4AE0DB4C896AA885CFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F82658125730243B3CFFED335423678CCCEC19B6F4FFC330CBE305BF27CA20AD3FA1AFB7FC28FD36D9CDAEE2A58AA6001BB3FF7E6EBA040B06E216499B78B0C4C43984B3307579E09B1C89CFE769E5AAC8FFA977C21642B4EDB00639243E0600ED255AA0B465E95CB17F2758EFFCAA25AD199239FE3626EED688330884F50B49520E2F953B4A3A24A9677C993B5DF700E22A93033FC771507CD69712AAAFE63E5B9BA43D196F836705E6FB63618F45334C7DFA302F0BA6AEA2941A5003F56B00 +smlen = 2501 +sm = CD2AF01272CE2D9F1D18F05DD4E2999FF8F9AB2AC7BBA96AE33EA3CC262A70E90A9C9FF1B46C5D71588BD7C52488BC3DF150D457C1F4FB825535C339D3D3449BD69C006D107CCDA0B077FD94069E6113340309B839349B1C9D0892AD620E762100000DEF7EECEDCCEB5B53C0085A54F164C5B12D896BC28FD38603E6C376554DA9870D235869315E6B85BE40751A7E8A0400990206AA3949104D6F05F3C7923976F8D3928141B3BBAD06BE4B0285CEF698D2DFCF54908EF6ACAF4997DEBD77DA5848BAB2DB035997C33A157894F52D6290770FF44914D20FB121B02F1F001D0D8337940EE74590EB25E52E78E8563A09CD2D45F650F48775E3E61F9E3509CC8EB7E983310D0185359F66BD80E0DA1E45A6BEB53ACEBB9030E310E81A576D0F80C64FCE1D1FD77DCA27B7C6E02B0CC26EDBF496AD2E3CE8484E988E56BB28153587D7ECB02FD8882545E7BF79CC9966A7FEDE93F7E9451BC48FDBB481673D1C4135F95D68F40F4B4F847345A320FB4D736BF5F9FD347435462DD3A238E4C799E7CEE081107E11682C7B558B19177522427F1D269FAD81B565BE538E8FF2D7193579AEE51E50974BDC0B66331B59BF496C87E4F6E143754076DB516C9C538410FB38A930CB5BA1E6610441126D01C8EB5F34E2E58424B8B218D9E68C5D8B4F5258EEF07EE0AA5475A72CCF363D47D825FA524C16C7B7587C44864DA9E4B267F738B87F7E5701147F550CD38774B17DE48E6969A0DEDF334FA67470419059C4D1607880CB12FA9C0ED23032C7E0F325169EACE7DACCDD4C2E5097FBBA859970D7EAC4522C1FEA043C9278C1C89FCCE95203033B4CEA4F9F24B55BA6B79EF88F275310C6E48189EFC1EEEDAB66B56B6BB028726BC463D93D742492841E85D5C837948978D0FADD1C172F8859C802C6BE8394A05DADA7546EE1CC5BB909D3189088F4FA6D07C573ED7263C081720E701D5D4B027AE54BE175536F3BD5E91993CC040311A7D352AA26414CAE30D10408DDB44E8C9513F4619E99EDC894F963489876B24BB0B91BDC3EE5B78AC0D4046B2E864789C0C779E5AF97F8F84F09A26FF74B8BCDE66C007970830B70C2A1122DC9845905C3AA7810B40641E8BBB398A23BBEF52BEDABEC7BB54823E64177A73786992DD67D5C007D770938402EFBCB3A60281C5706920A9EEE4C26C0B251C32B9E1936FDEC2928110959E99255508250FD5BA84B4FB314187124072D30FBF2163D36F1480ECC08F7FB8093BFAA72F1914C63533EBB3A57420DC38DC93DD6AE4D197FAB790C1EFC1B7A2234522E0B408D0648C7AE782F2F08CB70B96CD76B5089AF1EF4BA3A4C2FAAC363A4DC1C6C421F6AE1E9B67461EB02F36C25E763F1A2B73CEED4DCEDDCE619CB313D124CE6F7AC986D6BC344E630F22CB654C1286FBC0EE01C968DADD1EDAD744C8BC828CF5F316336A5883166ED000FF98D6CE2CEAE7D3E40BBC5714F71BA9E25E1506D644FB2DE2FE190D327ACCCA79D9B6D9DB505CF1853E98F30E9BA5E568ED83E2567C936A64420C5D8F07AC4F65F38C28E88DD7B5209A600AEB81A6D2AFA4FAAEFDAFD9B7FD3AD7F49462CD577204184F9D44A45E2A909373CED24EC0EE56BF2E6675C506EDA67B1E6DAB75CBF1822E20E7A8A81A7729B42A6D67A1DD457FCD19B62F048AB97B3D694254E5C051FD2DAF3D12AD627EC37C22117BDEE9EAA290D11D56BAFF0DE1037EBA908FA03E2F869FA2B27936669306E8E70A0A4910A123F202797BF1C8FE47178BB1E8E8D7AB1C01F30F5E779B2BC99902DF15185FED4C865997AB72254162D00858E0908EA95A9ACD0FCE72E571C7A381CC33E06A27FE6A5922775EE82C973CC3CA8A05717608F8703946C9A89854D627744DA475DEFC1390DC44FCC3A23C47AA8AF17240EB1A1A00A062D258D471F31333D0356243DC1CECFC559378B4395F01A970EA4074D5666B44D49EF291ED15930DADA66765B165CB8331CFE549C38CD0672F534BE60F4D9B4C125FFE747670513B5744676899B256B992E15106B99B794DB3950582816612144649210751F3D0DFD5B25CD393E724F7FDEF00756D0C8540E8891E592507599B06EDFA6EBFE543084AC81858F5EB02D8F5EB8A72184851E8589A3AC6DFE1CDCF286723FC4C1202765FA4F783EE58C627ED494C7149BCA6A4DDB420827CDCA82DC42515BEAF46CE9D9ED524BD00EBD3094F770B1E1DD09FC431E4C244D2305619DAE208E65EF385EA92F5A79F12B99AFDAEA79C9D8D319944AC6CBBE3F1290EC6B87D97785E059E6871FDF239BC404021CB52064B88EB4CB3FB6A871B0F76C12D7B8C5E8FE0A65024AB5B25F4C67B6D15C22B0005B754CF7CBEC898B49F4326F1AE4034E5F5A446A96CE08083D48525A3661E10C996DD22DC34FE570A4C8817D10D750FC5C2ED0C24C7CBCBA5CD1B2680DBAA3315FBF2BA7457ABEEDC96B5D111110D4678EA5C7851D25F258926B0B028365799E940A6E17BB03CB332FBC6D713DEA7108FC6268C8D33E7A578C94FF75BE808C15FF7884F092C0E309F1AF99B1A7314FA0F32C8D8E32B3E9D92C9C8FF6B8FBB99111529C4BE3A2A4F62884373D0903180B4DEABE613DE5CF19415DFBA7F9A46297AE2F21D7EA420B41F628FD8DEBA55207606539D11791623CB325F1E18C98AAC27283BFAB2408F4FD6CC58EC9E306643BA1C0C77D84B3930263E5A76A1CE94F3D7721F0098D54E6C990C3AFF69B6A0D82C853EA2AF2D3D2B3E96DAD59FF873171B55D16CA9A7C68DAD2E918174D264919DDCB4B9D01CE622D56C599BF60711C74315C918A7BB97B9513937AFB6A652DA68B6B0B34E316D7BE9F5C282A5E8773C892782EFF220667A6A54069C37B88EB1CE676AAECF2015E59FB7AF4D30C4625DD8DE4805F505E83C877CD61D2A0BA65B32B0DBDFBACFC88CA43E4DDF7A1A4517DCE83B7B8ACF8DCAAD28284039747935865DAF8DCFCA29FB676CE2EBA2C509CD75588FA5E58CEFD0694626C9BB31C3AFC372ED313C9BB3ADC398E89DBDB108DDA63F9380EBF9DA17B378451634682F9823E209BF10E39F884ED270413152025CDBF4875C121B1E83E12C044453FFDA6D8CA2C240AD522577C6898AB6F2ABE1FE77F860939408CD193E605F87FF2248FA163AC2FC0F39BFC38503B23F5441E0E364CAAAB890073266B3B51217661F5DF41C0BA925BB425AB3DD7B6A3675B7D60D0290131EAD53A4EAB0C66BAA83F2FB77E74C3C123ABA7731A3F62FAB8EAB2A96E8BBC911E501CD23A088E7887A469284E0B5C27B5CBC1DE2B6938CF1AF58A47FE78141306CB76E8F2B73620BC4549DB6826D2D72873885F6C5311EB5B9462BB4631D314DFB9C836C6F4D9EEC6818940C04689CC4D8D11ED9869355617861340E722B2BE78197746E2759AAA8D68D1965888E89B6B0F5BF51F94E586B2CB8708F4CDB520BF31DDCCFB7CB69E29A7AE8AAB12C11F431DE40FB9E82EB5F2B6BA1F9757F1487B63255FA69A755601C2FE17CD1892D5A6799C35D05098DC133BDD71318667D47C4671 + +count = 69 +seed = 272E459EAB6A0BDF720E4C5B79E641C95BAB66C3CEE261D0E3596BB04D232ACE0A1CE24BACCAAE9037665A962C711B08 +mlen = 2310 +msg = 62215248E1F3AFB19849F758D742F8AFAB595040C4DC520D603C9A80FA9CF2E97E4F4BD7350551FB667D606BDC31A45D88836CD376785C01F9007D47DF95C1F4D1E30A927A13525409D91C9F5145C0B86D3B44E933CA81E4ED9559AC17940C61EB85B2D26D2C47924AB80ACBAA3D9B1C8855C13EE45F5C8047C161AAA5321839A01783B21A5EE90CF91B8285C4779465B7A89DE3D74D482080F68EB2D8B47429D5475356C50A92B3ACBDEA5786F4D6C2A304AB500490F84FD1D0F21ACBEA325D62D2657F3889B6F591A7F63D8633C061CB14B8266A7FE17642DEDF1D08D9FFE369126CD780D9F99FC6262B5BEFCFEF35D33498CB2CFFE55F2F8D567EA8687DFC6E7D49A61FDBFE768C1D11BF5B3B18CA52225B096490C97CB9A0B3B2CA0762DCC36B60F7D26FCAA4E38B1F3A6279D889323010D9CB0A97FC488E09B06237E6EB0166465C2CBC2B9CD06F155759B6C93CA0CD3178845E0F3A2D20A68757AAF3C4E74545494462CCF28F6F51EC0FDFF4F1E6D98FC5B63BFF068FA7BE1764BCF14497E71E424C9389C5DCF8C5CE1DCD40B82F1D75C3C3970DA433A92A04DE958766AC5EB3645F4D21882F7071383AF8DFFD6CDD91B549F143DCF59FED6674441EEB03D5013E90ADCCBD7E3DA115535AC855DBAAB7F51D70630DC00009E726A16DEADB12047D85906CFF315C73EE7D4E24C9067E3B772F3DCC44C25C7CB8622FDD7B8ECF5E9C877838D71D500F864A662619B1478F8AB4DB2DD09A111ACC99ABE737DDBCA06E88926C4E73B5F5D21EAFC4B11938FEEEA5F8D5A4C616A342B54C9CE371817AA2409A55A3237BE85A50F05B33D35AA86A62E85A01CF34EE7DC840A26FA1B8C6B307817C062D9A2E7163A3B036874D2ABF6531A772D4031FDCD59CA79FBF442CB9155F90148DC3B723778E699C6985634185C3FFDB966ADB80A3D1308150B12964142498466506BC0742783C27BD3472A5CB45021DE066C28143FFBC82B5742BE51E93BCFDE1A61E661B730D8760E108B80C859E4B3A07D483A6A8967E5F01B03EC8B63A20C6A03755C75F419558878A5EB8BB0B2120F183E4BECD4A104EB4DB62CACF5F9964583815334A25BDB75724E549211699AC3BC9B2B5F58F1FB33429905DF81C9422F8B84E95A7C36DEC6AE9B48D4F502D8AB59B69E9D112693578D143A3F111EF00844303950F65DDEEA6E30F1286DE16546F90C4364A5C09755AF3FECB13983C418B2FE4AC17BDDA57E4D597E8BDCCBFBE4082C446FC920E5145BBAFC67FADD9799CD8C7714510DA579516ED39B3E22DE319977FC77A9CA61AE8252795D11724AAA866C1FFDBCBC1FF91AF1B8713248864A4E8B9C59DD12863245F5048110DEDE7FE31FF9836715886C37E9642DBD6C668BA7AB8C2B706CDD58586EB7227B5768C3509C1F66493468859E275700EA38BA69064179F6036D7B50BD232B61C9B9659492894C0057DBFB80329A76CDC57B2A89BBB910483301CA0BF6AEC7D5DDF86644FF52F48FF6C7CD00406CACBC09AA251708BAF3276A52BE2C7B42FB6A9036C318529CA98940769A67DCD532C0000AFB5FC63AD2303E94E09D2CB40CCBE47FAA1DD22ECF528179AD40FD4BFD43717864149243D61CA255344C52743200ED8385A7CA6CCA24CF967D23D07DC2A3F9AD5F3240F4F022A6C6CD281B6C492E8D144A2F4641957ECC65B32C9F74BB468524FF58F0F3DA2F5A56742896CC8F99088574264F857DC67CF04C4B63C6A08FC534229CA8BA616CD504F969EA6E3C98A517355F98A9E884062805B77623239074206E01AD2F3FC9FE9FF8254A5D3525C3B2F0A692803500C967A2E18511EF5B8845DC4B0DEE9338C38C4B1B8B84EE63923250EB6F9E9C272617C7895BD538A6F34D3557812BBBFAB2B8FA6EB5E95B9BCE33AD3185CD90DD536A68639022C079B5CA7748864D37D45FA6780A45AA991F28BC0D3BF371EE2FF0C913CEA6DB38E4A278A4840EA1F255F8E83B6B6C5E260A49D727AA42095A88CB8120B51DAFD764E690102F7FA07CEA2EB86AC613E7BE2F498F5767B622D04E8A6F272976FB058C3334CF8CAAD1D180E3456C210763C974E431CBC3E25EAD8B9FF9243628D5B08D92CBF1D5DF29A85B1A04D2999B3C669227B33610121D543CF4A978F8D9365C0FF8AFFA92B07FC8C8604A0F357F3C669445685B6A29898301A5AFBE10ACE8D64A47009C8741D7CE82E9900643900A3B92A26FE5F24886C06AE0918C3F2523C320699C799CBF72F0DDB08A0F1F63D6DC2F021C78A9D44503209190EE4BE654663679CFD292292D71FC4BA6233A196EF9E95CB965852773404B2622B565BD91FCA6747AAF7F4EADED7BD3BB53645381B687AE04B8D8A9BEF1095EEB39A0BEB4EA89BADB4655A1AFC7EECB7DA0D670C192297CCE0B31BBEFEBFE94C84603BA8C0B7CC73159FF59C01A037CF2C866DC40D88432CD6C2F1989351A4E41343CACF7BF2C2B395C863709D6EC1DBAB2AF514CC771DF14DF095DEA8284BE2B65097D8E6F72EF3936595384AFC0026956E819F1657C901B92644E9D6D32D0D95549729B2CB3D5EFAC9C42A5F284ABC3BF5CCA5B08161B09D9A48FFB2996C3D4383D65B8D1F7FC3248CBE84B9C05464F4A76EFA005FEC342EDD56959CD26CB0DAE1B61B0493A4B68EB3D6335BBC280508F09D84E0C5F4EF520D92CD34D69E5BAB76DF5D2B72CB41A298D370EBEEFCD6C1904B956458BDA581EFA6B3654BE402AC3A971603F23F2B543C5BEEDA5F018543B72C146CF04680BCEA31B4A238460329E2BC12F14C804FDA3494C15452223D2477C9C8A497D04EAAE7DE09D7D7A879D3A5DBA565AE1A38F15E69C18838C487C0FBAD44A068C42EFB7D3F5EF488F91C42F25AC564751F0EFE0ECE7D98BB1B3D0FC42C9756F4B8F9DAF1FD0D414391155285C8DAEAAF380BD07E43570F14E9A47A87BC733F1E676233F17BFB71AAE464AED68487392D339AE064AE27BD57F8695F493AE56CA96C0615BDA8DA37133DD13C2B21DA189A7329773FD8D51381BC118645440B28FA4F402EF84C4091D3A0BC4D206BDCF9007F5DE9AA1E6CF7F6058AC6B69FBC703E908C4221F9065147766E48F54BE4B076406E2F9ED19C1BE982E636FD02DC26267C3ED989E6AD1CCE62E7B988FA7C1831E5126111A4C3C29C38A1F96CCB3A04132175FA46F73C634AC6EC741B135645ABF1DCEA18571CF9A539F5CC935BC6D32BEB1C7B8B3B5A141146EBC12DBBCC17BB4900CF0B95EBFAA52190AFC6D8933CAFC9 +pk = 7282A2422A608147472C50CA0FD8208D9142731DB360FE98C1355F237FCDF8F07C14F25D1259A4D2F62056D11ACA9240908ECDD49921F36A69453865F48600BE9B765BA58B0D032570139715E0ABD6CB2E57465CB95B7F47A506A770FCC03A0817 +sk = 7282A2422A608147472C50CA0FD8208D9142731DB360FE98C1355F237FCDF8F07C14F25D1259A4D2F62056D11ACA9240908ECDD49921F36A69453865F48600BE9B765BA58B0D032570139715E0ABD6CB2E57465CB95B7F47A506A770FCC03A081773EFCD4B6361E80B47C7523C58B3805CE619AB9044AA9861680A00000000000000000000000000000000000000000000AA270C3EA12ED6071FC6C0195CC0FE5226F16F183D1B23934BFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD9A58142D8F1450D30FF181BA9E8A6DA3C4F0090851A38F26F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A2A60E7EF5A85F94BC11A3D1C49022B3756138BE44B7A5AB413514FA6435B751735F71A3E20CFF22437F77E61BFD39009305B8438FC823E822CF14CDF5020FEF0746FB29EB9BB8A4ACA7C36699C72CDE4081CCE9DCE84A912C9282356BBCCE00E9D365B251116F38E6586BB613EDD5FBAEA99C65B0575164EBF554C18FA66250966B077832FAD02AD5DB3567B29FF4005AE4F98B52F89685BB45FCB9D68E1F5F8D418C1495268EB9ADBA0A26D3809560046C56A5A7AC7EA745F01E89FD28D500 +smlen = 2534 +sm = 4FCB71B22A0A8143DC91C39C2DEE93A3D89C21304085B205955F4288D6966FAF9059FAC6D1B6403DFC940ABD1DCA1214174721A36BA3119C31106509ADF8BBAC659F46E49A1914C3BB1FFDF138FAABC58776E7CDCAFB733B5BF9F5AE3665761A010086621D98A69BD9FD666CFFE5FCC6733365808CF3DFA08FAD013525D2EF7D210308664788D5553D691B60F6AD2AFBA90EC2007BD260252866513839A092BF821E96B736BBBB9ED633B53401C97B2E817876ADED5CB28C08B8517D50BD145BD636EDAFFC01484A7B409FC9FE81EFA0B5C05689E329D670774DF8370B000D0262215248E1F3AFB19849F758D742F8AFAB595040C4DC520D603C9A80FA9CF2E97E4F4BD7350551FB667D606BDC31A45D88836CD376785C01F9007D47DF95C1F4D1E30A927A13525409D91C9F5145C0B86D3B44E933CA81E4ED9559AC17940C61EB85B2D26D2C47924AB80ACBAA3D9B1C8855C13EE45F5C8047C161AAA5321839A01783B21A5EE90CF91B8285C4779465B7A89DE3D74D482080F68EB2D8B47429D5475356C50A92B3ACBDEA5786F4D6C2A304AB500490F84FD1D0F21ACBEA325D62D2657F3889B6F591A7F63D8633C061CB14B8266A7FE17642DEDF1D08D9FFE369126CD780D9F99FC6262B5BEFCFEF35D33498CB2CFFE55F2F8D567EA8687DFC6E7D49A61FDBFE768C1D11BF5B3B18CA52225B096490C97CB9A0B3B2CA0762DCC36B60F7D26FCAA4E38B1F3A6279D889323010D9CB0A97FC488E09B06237E6EB0166465C2CBC2B9CD06F155759B6C93CA0CD3178845E0F3A2D20A68757AAF3C4E74545494462CCF28F6F51EC0FDFF4F1E6D98FC5B63BFF068FA7BE1764BCF14497E71E424C9389C5DCF8C5CE1DCD40B82F1D75C3C3970DA433A92A04DE958766AC5EB3645F4D21882F7071383AF8DFFD6CDD91B549F143DCF59FED6674441EEB03D5013E90ADCCBD7E3DA115535AC855DBAAB7F51D70630DC00009E726A16DEADB12047D85906CFF315C73EE7D4E24C9067E3B772F3DCC44C25C7CB8622FDD7B8ECF5E9C877838D71D500F864A662619B1478F8AB4DB2DD09A111ACC99ABE737DDBCA06E88926C4E73B5F5D21EAFC4B11938FEEEA5F8D5A4C616A342B54C9CE371817AA2409A55A3237BE85A50F05B33D35AA86A62E85A01CF34EE7DC840A26FA1B8C6B307817C062D9A2E7163A3B036874D2ABF6531A772D4031FDCD59CA79FBF442CB9155F90148DC3B723778E699C6985634185C3FFDB966ADB80A3D1308150B12964142498466506BC0742783C27BD3472A5CB45021DE066C28143FFBC82B5742BE51E93BCFDE1A61E661B730D8760E108B80C859E4B3A07D483A6A8967E5F01B03EC8B63A20C6A03755C75F419558878A5EB8BB0B2120F183E4BECD4A104EB4DB62CACF5F9964583815334A25BDB75724E549211699AC3BC9B2B5F58F1FB33429905DF81C9422F8B84E95A7C36DEC6AE9B48D4F502D8AB59B69E9D112693578D143A3F111EF00844303950F65DDEEA6E30F1286DE16546F90C4364A5C09755AF3FECB13983C418B2FE4AC17BDDA57E4D597E8BDCCBFBE4082C446FC920E5145BBAFC67FADD9799CD8C7714510DA579516ED39B3E22DE319977FC77A9CA61AE8252795D11724AAA866C1FFDBCBC1FF91AF1B8713248864A4E8B9C59DD12863245F5048110DEDE7FE31FF9836715886C37E9642DBD6C668BA7AB8C2B706CDD58586EB7227B5768C3509C1F66493468859E275700EA38BA69064179F6036D7B50BD232B61C9B9659492894C0057DBFB80329A76CDC57B2A89BBB910483301CA0BF6AEC7D5DDF86644FF52F48FF6C7CD00406CACBC09AA251708BAF3276A52BE2C7B42FB6A9036C318529CA98940769A67DCD532C0000AFB5FC63AD2303E94E09D2CB40CCBE47FAA1DD22ECF528179AD40FD4BFD43717864149243D61CA255344C52743200ED8385A7CA6CCA24CF967D23D07DC2A3F9AD5F3240F4F022A6C6CD281B6C492E8D144A2F4641957ECC65B32C9F74BB468524FF58F0F3DA2F5A56742896CC8F99088574264F857DC67CF04C4B63C6A08FC534229CA8BA616CD504F969EA6E3C98A517355F98A9E884062805B77623239074206E01AD2F3FC9FE9FF8254A5D3525C3B2F0A692803500C967A2E18511EF5B8845DC4B0DEE9338C38C4B1B8B84EE63923250EB6F9E9C272617C7895BD538A6F34D3557812BBBFAB2B8FA6EB5E95B9BCE33AD3185CD90DD536A68639022C079B5CA7748864D37D45FA6780A45AA991F28BC0D3BF371EE2FF0C913CEA6DB38E4A278A4840EA1F255F8E83B6B6C5E260A49D727AA42095A88CB8120B51DAFD764E690102F7FA07CEA2EB86AC613E7BE2F498F5767B622D04E8A6F272976FB058C3334CF8CAAD1D180E3456C210763C974E431CBC3E25EAD8B9FF9243628D5B08D92CBF1D5DF29A85B1A04D2999B3C669227B33610121D543CF4A978F8D9365C0FF8AFFA92B07FC8C8604A0F357F3C669445685B6A29898301A5AFBE10ACE8D64A47009C8741D7CE82E9900643900A3B92A26FE5F24886C06AE0918C3F2523C320699C799CBF72F0DDB08A0F1F63D6DC2F021C78A9D44503209190EE4BE654663679CFD292292D71FC4BA6233A196EF9E95CB965852773404B2622B565BD91FCA6747AAF7F4EADED7BD3BB53645381B687AE04B8D8A9BEF1095EEB39A0BEB4EA89BADB4655A1AFC7EECB7DA0D670C192297CCE0B31BBEFEBFE94C84603BA8C0B7CC73159FF59C01A037CF2C866DC40D88432CD6C2F1989351A4E41343CACF7BF2C2B395C863709D6EC1DBAB2AF514CC771DF14DF095DEA8284BE2B65097D8E6F72EF3936595384AFC0026956E819F1657C901B92644E9D6D32D0D95549729B2CB3D5EFAC9C42A5F284ABC3BF5CCA5B08161B09D9A48FFB2996C3D4383D65B8D1F7FC3248CBE84B9C05464F4A76EFA005FEC342EDD56959CD26CB0DAE1B61B0493A4B68EB3D6335BBC280508F09D84E0C5F4EF520D92CD34D69E5BAB76DF5D2B72CB41A298D370EBEEFCD6C1904B956458BDA581EFA6B3654BE402AC3A971603F23F2B543C5BEEDA5F018543B72C146CF04680BCEA31B4A238460329E2BC12F14C804FDA3494C15452223D2477C9C8A497D04EAAE7DE09D7D7A879D3A5DBA565AE1A38F15E69C18838C487C0FBAD44A068C42EFB7D3F5EF488F91C42F25AC564751F0EFE0ECE7D98BB1B3D0FC42C9756F4B8F9DAF1FD0D414391155285C8DAEAAF380BD07E43570F14E9A47A87BC733F1E676233F17BFB71AAE464AED68487392D339AE064AE27BD57F8695F493AE56CA96C0615BDA8DA37133DD13C2B21DA189A7329773FD8D51381BC118645440B28FA4F402EF84C4091D3A0BC4D206BDCF9007F5DE9AA1E6CF7F6058AC6B69FBC703E908C4221F9065147766E48F54BE4B076406E2F9ED19C1BE982E636FD02DC26267C3ED989E6AD1CCE62E7B988FA7C1831E5126111A4C3C29C38A1F96CCB3A04132175FA46F73C634AC6EC741B135645ABF1DCEA18571CF9A539F5CC935BC6D32BEB1C7B8B3B5A141146EBC12DBBCC17BB4900CF0B95EBFAA52190AFC6D8933CAFC9 + +count = 70 +seed = DCC58DFC13B035323ED44BE50A7096F697C9C143518FED50A59181160960203831A9904847BA20B85E99FFA63E4AB0B2 +mlen = 2343 +msg = 954511394B9D10E1BA162861802A717E24EE42A346C9ED280C88E267A41EC09D6D73B6076E7E30257BF265B71A0B6E0CF408F02BA9078811BE94D0F38559E9985463FC9671D182286CC4F18CABCAEE1A3E5ABDBC384FB27911168B54A387171C0524489FDF512E4D8D2F65050CFE7405D8DF63A79C6E42A76F4538907EFF4DC5870095241523F56FE8E389EBF1A1CC47DDB9F0188513D5259BE257BDA5BE7381F22392CDC2406E0F2448A80F3824F2670F61920C667499DE899F0F6B397381A2DE66255E061AB92CD864DE75C9DB7CBAB9FE76AC38E0AB3389530B4004055268B289B40D79B32E5EBCC74353510BD1627E2D5DD0BE7D3DFD04138F6E3EE7526133DC70490612EAA5024BE6FBEFAB24E1E83D8941A113D8B871F3DBC3011869174888CB7A265D7DE9AB99B999C19AF9B442EBDC904FEDAB52CF40B787AAB35626417C5291F2EB892F43E698A8C65CBB6442A4832F33920FB2DBFC50B8E996FB227F2FF294C385A330957D2FADA9F86839235EA79ECDE6D9D94FBE7C79A38D40B9A8F241F53B921107FF1C72624C9600EC04DFA1160F1FA9E5D986A5A363E9CE8627276DA73F5DB47E4B90328884CFE93194CFFA6FA680F77886E4A7A0FDAF13A7DDFF6984B8855E1F58235BABFD5106338FE2B075D4F10A9FB3D3C5F829B7C61B02B34E9BDE6E62CBCC3AC9F467A6CA170EB43E632EBDBF6847F781E2469B4740FDB83DA34CE34A286E3B363A72CBB13EB66CE1DE35D8FD77DBEDBF45C44DCD16E6B58A1699694D9006947C8C20810E85E3EBF8FB2C68B967743642D86556AB6958E545AB83EC24B96F2B4BB99CC8890C3C1E0FECCE26CE09B6D99000694F870AF9F642374FF0BBF61EFC7CD5AAF5667FC3FE5745DFAF7F13FED70FE070EA4C09CB1A92D8B7F0DFD4B4A4B7DCF4CA6A97043BCEF6346F1570F37B0EB48DB8D15C8A82ED69B0C7833D6C830414C111C987471E84D2CEB5BD973DCA34ACD3A65D7B1A502368941935435B78B8F2B74C2BEF127D96651247BDBE68EB7E466B9EA2A64A13C375103D7C8F7D30A13CBE184BD1EBB19F3274E645F5C7B82EFDF09233D8AD146DC0715266963FD3CCE6F8CDEC20743BF1B7F57C101AC24C64D568923203E1A6AF03A700F5A401EC4572BBA528E284C151F1D108F7563858011FAB32B3776CF2B910D7B21180DBE75742032791018258F4D1407C9A213755C5C91205352DF919B6F14BE056243DF6AC2909E52C9A79F6917440667719185F1C5F1AAF40D873BA22956FA0BBAD9C35360853333A10A0841D9D2E758A0B1BC187F6BBD31C41B74F9EEEF1F7A28BDB7AC3D52FDC6FCB3EF0383A06A61188548963E552716D2BFBD6C2DCDE496D06615E86A5CDB76A03BCA2822ABA85EC6807EBB6918AD2948D193CCF74F4BDAF7090CD4294C1785DCEDB6B55886A848284A6A4A88A496800053E84A9F2DBF6B334AACE11A5A540626716302E259A64C6316ED543806B3BBFE37563897E83BBEFA570312DF908C1786DF0FCF55069EDC336501A5AE9D4BF212D56A9CEE811038656912238AE284575EF8DE1285B763AE54ADF44F91B6DD9E309B7A7A0AB71EC2E4611831B3CE1C9DC85CF907B52DF7406B06367E7A43DECE72DCCC57D268820EA021C27056E3C6B50E7BA7A59B53539A6B7B06B35051E3151C23F3BD3C889B25D0ECE1FD0DF1AEDF657FBB096CA1C861ACB0158501EA1AEFBF6DAD11BDC325AC1CED3739A40B7A83458EF4F3453C0F6EABC1A48037809A90480DF9DC4FF07DADDC58DF2733D49A4FA53C2A41E55A4A0167C6D33BA6E752AED3A125DFD6A0322CD235254505D7B3CED7A0DEE7EB662ACFD30F8B79D1A872998CBCF15CD86E26809E0D2DA0324DDC90FD12CAF9D8E4EDA437FE4E658D47D67C95927C4B5DEE965B940CE93E6743917296E10820A7101F8F633C93069E8B569F4625AFD4EC61BFE4549FDD06C2290A91AC0FB40CB1F55DC8BC1FE695C73AF603840AC0351F5256E00555C984E79A09E58C566D1A117B7E569BEB5850FB491FD9B982442B55BDF53832AA65180DCDDC2F768B1A1361994DE8C25F3608EC853D5982E0AFD1F9FA70170FC3589DDAF958DD840B4B502F8E2697D01AD7AC2233F6A16D540EF8D232887D2B4FA727AE2F038A69AF3DAE69EDA8EF6BF1E0B67D811160B75231543EC5A4D0778B7B42FC1DD6732385AA4400450B3CAEEFDFFCF147635CFA4AAA53DE4EE3035BC40CE8670016384BB877A86A15B59F3DF0C5D624D3D2B23EC46913618C745330A96C715C6F0BD096487E89B917384CC30B3D20A332F1B4056462227E98AF9874FF1D18DF2A6BF84AE822EE737F9E34EE8C69F23EEB9BF38ED056F499545F405759355C104284A6D08A9EFAD8FE28288B2084336A6479A6D42404F3E6FF3AD1DFC63C8AAE971AF11F2699F32F57AD29188492CE07BC1A271035B4D13A686EFDE5572353283A0F3138F6DC05CC35E5E5057C5C8B9E12B0164C0915ADEDF40A6E23848FA59ADC0E65BDD2120486942F232315FC94B4676751A35AAED2828889864C4CB7DD95A662A475733C2CA8F6997A9C822C6C8B9DC95A8B4C367E613E97D3EC6D6DDC2F81022EC21B3A93244E3BC8C2737A7724A3CBD480B26819EEB2676FD383601D79FA266ED3F9BAC2A98FF0109AD7E43E33E108D88C09BA82AFCCCFE98F50F789109D99DCD0A2C61947544F3666EDC621B5D5ECB7088B2430A611BEA52BE7F5EDFC6E2649F5E81F6DF72FA9A748BFF06AF766A60D2B751B23A8AA95CBF733359F7C0CD19B1482A6E6572D1570349C688D78CF8B8C7DD37576DC47A193A2C2797D0AF7504DEE303823A8B77204AE7B6E91D431979798A7EDF435056251D0E3F26B2CA16BFE3422CEA0398D30F0A0DC06DC8A93D27D13650E5BFB6BA04C93FAF0D7D06F99FE4F1F52A059FBE808179515FDA48ECA714F0947FE9A98F02D66FB0D80952411CDFCEAEF6ABA16D92B8F1B82DB151D7DCD7FB7781EC55F4A86C86011FBB9C5570EE76897E7803036E2FE3CDC2D5EA7A613897F3C69A6EA734E3811BFD15E90D7256A0C0C88CEB54EC6AAC151B435CD2A870E4A02087C2B847C75B00B44BB3CA6D4404C3052BD308B8D5F595277592D26F6D5A2193CD4D650BF931FEFB9DEEE61032B29EC0412F38E1CBE025B2891C59574C1450D9E3D8EF27940EF712143F06F38DDB86341A7FC781E0FA8971DAD13AA7E93F1858C70A71A40164211EA9F6A41AE90D19032C2EA52C23375CE3C4E59599ECD6855213AEA83F8DFC5CC70F58A62E4DCA17C09705C0C099B29056592986C03CF5D67074735F2BEA +pk = FE2F83C162DBECA216919DD6EB2FCB6A73B3F3F0A2B06916C393E1442A166E01F7FC5294D3BAB39E6551AF3285CF3F376A9EE8E3F35A093F68B669E8DA917E43D117C2E97F6A39249AB9BBDDCE399A07251FF3592B6FCB56F7651783F046691319 +sk = FE2F83C162DBECA216919DD6EB2FCB6A73B3F3F0A2B06916C393E1442A166E01F7FC5294D3BAB39E6551AF3285CF3F376A9EE8E3F35A093F68B669E8DA917E43D117C2E97F6A39249AB9BBDDCE399A07251FF3592B6FCB56F7651783F046691319C79EA1E18E33D1EC20E2C9C27A571C120BE0E3CB966BBF4F6C0A000000000000000000000000000000000000000000002EE6E11DA9523A000C1C3F717BF283C841FE172E5974477E67F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3534482B48FCF094EC8699114E85160FA24AC6939B9B674BBAFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005B9C202C5584A3A329FC146AF7124EEB9C896D1EC92AFA0437CAB5165118FEE55B928F44B1EE3A06491E4B7B9CB2C00B0A8208DE52926418B67C46C54BC73CCA553F3220C80967C16F09E7F442636EFDADF918A98EFFEED82219D651147AD001D2CF0D1E3DE01E39431BEF185D72B3E01E8998CA952297F54918014C906554C8BA196D6CC085020AECA1A28BD488D009748217F151F04B0C80ED6040D37D28FB5D44FAFCB702666EEB4A4924C9CC4401182564136158AE15060214026A3CF00 +smlen = 2567 +sm = DFA5B8A7F99F9207751FDBDE13375C768B195E05EBD9851EB421BAB076D8794E92BE757DF4FB8E4F163002E37D7FAA05EEDAA433E7F4211AFCAB8FCC9132BC5A665546223C0C6047222D47793D7A6997652D274EA21196CE48A41E5FA6FAD5400000976E45B13458C36DB6CDDB7780803C6D0275485C69869A9C00FC031353B1653D5EBA579EB82C9244F44E217A55C34B2CE3006532D7D5F2B1CF18705938618A339B96F8C8B9AD446DA0B003B7B18B38E50BF089E798A526D5D8432BDF498A70270EAC94010A98ACA7BDDCDFA0FA2555AD198191F717D3FE0B35663C000415954511394B9D10E1BA162861802A717E24EE42A346C9ED280C88E267A41EC09D6D73B6076E7E30257BF265B71A0B6E0CF408F02BA9078811BE94D0F38559E9985463FC9671D182286CC4F18CABCAEE1A3E5ABDBC384FB27911168B54A387171C0524489FDF512E4D8D2F65050CFE7405D8DF63A79C6E42A76F4538907EFF4DC5870095241523F56FE8E389EBF1A1CC47DDB9F0188513D5259BE257BDA5BE7381F22392CDC2406E0F2448A80F3824F2670F61920C667499DE899F0F6B397381A2DE66255E061AB92CD864DE75C9DB7CBAB9FE76AC38E0AB3389530B4004055268B289B40D79B32E5EBCC74353510BD1627E2D5DD0BE7D3DFD04138F6E3EE7526133DC70490612EAA5024BE6FBEFAB24E1E83D8941A113D8B871F3DBC3011869174888CB7A265D7DE9AB99B999C19AF9B442EBDC904FEDAB52CF40B787AAB35626417C5291F2EB892F43E698A8C65CBB6442A4832F33920FB2DBFC50B8E996FB227F2FF294C385A330957D2FADA9F86839235EA79ECDE6D9D94FBE7C79A38D40B9A8F241F53B921107FF1C72624C9600EC04DFA1160F1FA9E5D986A5A363E9CE8627276DA73F5DB47E4B90328884CFE93194CFFA6FA680F77886E4A7A0FDAF13A7DDFF6984B8855E1F58235BABFD5106338FE2B075D4F10A9FB3D3C5F829B7C61B02B34E9BDE6E62CBCC3AC9F467A6CA170EB43E632EBDBF6847F781E2469B4740FDB83DA34CE34A286E3B363A72CBB13EB66CE1DE35D8FD77DBEDBF45C44DCD16E6B58A1699694D9006947C8C20810E85E3EBF8FB2C68B967743642D86556AB6958E545AB83EC24B96F2B4BB99CC8890C3C1E0FECCE26CE09B6D99000694F870AF9F642374FF0BBF61EFC7CD5AAF5667FC3FE5745DFAF7F13FED70FE070EA4C09CB1A92D8B7F0DFD4B4A4B7DCF4CA6A97043BCEF6346F1570F37B0EB48DB8D15C8A82ED69B0C7833D6C830414C111C987471E84D2CEB5BD973DCA34ACD3A65D7B1A502368941935435B78B8F2B74C2BEF127D96651247BDBE68EB7E466B9EA2A64A13C375103D7C8F7D30A13CBE184BD1EBB19F3274E645F5C7B82EFDF09233D8AD146DC0715266963FD3CCE6F8CDEC20743BF1B7F57C101AC24C64D568923203E1A6AF03A700F5A401EC4572BBA528E284C151F1D108F7563858011FAB32B3776CF2B910D7B21180DBE75742032791018258F4D1407C9A213755C5C91205352DF919B6F14BE056243DF6AC2909E52C9A79F6917440667719185F1C5F1AAF40D873BA22956FA0BBAD9C35360853333A10A0841D9D2E758A0B1BC187F6BBD31C41B74F9EEEF1F7A28BDB7AC3D52FDC6FCB3EF0383A06A61188548963E552716D2BFBD6C2DCDE496D06615E86A5CDB76A03BCA2822ABA85EC6807EBB6918AD2948D193CCF74F4BDAF7090CD4294C1785DCEDB6B55886A848284A6A4A88A496800053E84A9F2DBF6B334AACE11A5A540626716302E259A64C6316ED543806B3BBFE37563897E83BBEFA570312DF908C1786DF0FCF55069EDC336501A5AE9D4BF212D56A9CEE811038656912238AE284575EF8DE1285B763AE54ADF44F91B6DD9E309B7A7A0AB71EC2E4611831B3CE1C9DC85CF907B52DF7406B06367E7A43DECE72DCCC57D268820EA021C27056E3C6B50E7BA7A59B53539A6B7B06B35051E3151C23F3BD3C889B25D0ECE1FD0DF1AEDF657FBB096CA1C861ACB0158501EA1AEFBF6DAD11BDC325AC1CED3739A40B7A83458EF4F3453C0F6EABC1A48037809A90480DF9DC4FF07DADDC58DF2733D49A4FA53C2A41E55A4A0167C6D33BA6E752AED3A125DFD6A0322CD235254505D7B3CED7A0DEE7EB662ACFD30F8B79D1A872998CBCF15CD86E26809E0D2DA0324DDC90FD12CAF9D8E4EDA437FE4E658D47D67C95927C4B5DEE965B940CE93E6743917296E10820A7101F8F633C93069E8B569F4625AFD4EC61BFE4549FDD06C2290A91AC0FB40CB1F55DC8BC1FE695C73AF603840AC0351F5256E00555C984E79A09E58C566D1A117B7E569BEB5850FB491FD9B982442B55BDF53832AA65180DCDDC2F768B1A1361994DE8C25F3608EC853D5982E0AFD1F9FA70170FC3589DDAF958DD840B4B502F8E2697D01AD7AC2233F6A16D540EF8D232887D2B4FA727AE2F038A69AF3DAE69EDA8EF6BF1E0B67D811160B75231543EC5A4D0778B7B42FC1DD6732385AA4400450B3CAEEFDFFCF147635CFA4AAA53DE4EE3035BC40CE8670016384BB877A86A15B59F3DF0C5D624D3D2B23EC46913618C745330A96C715C6F0BD096487E89B917384CC30B3D20A332F1B4056462227E98AF9874FF1D18DF2A6BF84AE822EE737F9E34EE8C69F23EEB9BF38ED056F499545F405759355C104284A6D08A9EFAD8FE28288B2084336A6479A6D42404F3E6FF3AD1DFC63C8AAE971AF11F2699F32F57AD29188492CE07BC1A271035B4D13A686EFDE5572353283A0F3138F6DC05CC35E5E5057C5C8B9E12B0164C0915ADEDF40A6E23848FA59ADC0E65BDD2120486942F232315FC94B4676751A35AAED2828889864C4CB7DD95A662A475733C2CA8F6997A9C822C6C8B9DC95A8B4C367E613E97D3EC6D6DDC2F81022EC21B3A93244E3BC8C2737A7724A3CBD480B26819EEB2676FD383601D79FA266ED3F9BAC2A98FF0109AD7E43E33E108D88C09BA82AFCCCFE98F50F789109D99DCD0A2C61947544F3666EDC621B5D5ECB7088B2430A611BEA52BE7F5EDFC6E2649F5E81F6DF72FA9A748BFF06AF766A60D2B751B23A8AA95CBF733359F7C0CD19B1482A6E6572D1570349C688D78CF8B8C7DD37576DC47A193A2C2797D0AF7504DEE303823A8B77204AE7B6E91D431979798A7EDF435056251D0E3F26B2CA16BFE3422CEA0398D30F0A0DC06DC8A93D27D13650E5BFB6BA04C93FAF0D7D06F99FE4F1F52A059FBE808179515FDA48ECA714F0947FE9A98F02D66FB0D80952411CDFCEAEF6ABA16D92B8F1B82DB151D7DCD7FB7781EC55F4A86C86011FBB9C5570EE76897E7803036E2FE3CDC2D5EA7A613897F3C69A6EA734E3811BFD15E90D7256A0C0C88CEB54EC6AAC151B435CD2A870E4A02087C2B847C75B00B44BB3CA6D4404C3052BD308B8D5F595277592D26F6D5A2193CD4D650BF931FEFB9DEEE61032B29EC0412F38E1CBE025B2891C59574C1450D9E3D8EF27940EF712143F06F38DDB86341A7FC781E0FA8971DAD13AA7E93F1858C70A71A40164211EA9F6A41AE90D19032C2EA52C23375CE3C4E59599ECD6855213AEA83F8DFC5CC70F58A62E4DCA17C09705C0C099B29056592986C03CF5D67074735F2BEA + +count = 71 +seed = 270BEDAA7BCD43990FD8B4F44FFB63A3AE8E991BB2BF84DA7BC2CCD1A079C579AEBE2082ACBAB7FF286DE795F31973B4 +mlen = 2376 +msg = 326A4FE723BE9363ACFC000705A10B6CD8A7B25E99A34B4A354CBD6F50550BED30F6C4208490B4194AB79B24B093FBE132C299DF924F2FFCC2CDC6C2C9019EEDF4B72D7F0817825BD787135927102E1DA041E9A78B501B42DCE777A79ACE604E57DF11775D7B87E75E5B00ADAC90D1ADD78CC5AD348C7472EEC6E6E06F737E77115A9509A6AE6570F738DC2F21314A7CCB9D44ADD6E1434CDFE3614BC73A6B468F6691B60F4F2DB103289A90C4FB2BF5AAF87826D2BEB0880FA64E07E9BD30D4EDA00D6BDA01D1EB22BCF14EE797A859C9A0D9034E8C5316201AF91388C47E1DDF061C9F45E067A5F60B355C98F8734559B8F1B82F47BD9CEE0224A1D67D40706333523C34F3582B6C8CB47BF7D0E4FBC7D7CF3DBF21077E664FD59998338F4DD4A423C3A145EE1E994AACC1A48F81A7E9FE106008DB93A6626B8C8505043AB864D93AE3972675E69C3825304086AA3419216CCAE7F7D5117739E99D8F4A0B658148DE33FDAAEB9967EF56677D2028C3B584C5CC1C096F4DA16799408B2EE2FC3482AD2F49293CF4097A78492470099BDB90BCB4FE3B245AC8B3C53E05D7609E34770ADCC147033A8FADE81359FF63C3FB90C5A498C98B7A0E5EE9CF4D287759ACDA4BFA3965CA85E1D1C1019E7FE6D82E5E66A717F94890277E6DB1EAA6F3291FE1BCD7D437094749FF5574B8728E0DC21A143A14E382937EFB7EC1B0FB3F6F9C0F547F470E3B436DFC7986F923BEAA89583D8978C433E0CB0C4E98516AF1AC797C778662455A57FEF45BA2C7865C1DF5C502EDB01C8CC729468091BB96BE9DA9C298528187867EEE9A06141DAA15F60CF719DE2BD15010550B92A41F12D8F38B54692589AFF51A9D5E6047A0D9B707369992251DF31341A45B01B05FFED8ADEE5810824F903EA59F14FD500AEDAE797F8BAEB470C0B14C4EDA5C687E4848A85B30A8E8F59C45D4C9F0C65FCCB15F4D4209A55722C29B6CB09AECB4E53FA3AA602C56EE3BA6900CC12889E7B87D5EF283AF1586764519A30CF60833C82F0ED15E39A8BCAD5C6AEE9999E63D399C5CEA10AE1F53B04858EF7896AA29FA541451FDB685734C39470250545193CAF26C9891F7F965904AE10E8566BFF9B2F465BBE13D6EA4A79586E68844B9FA68B2F992565C8B0EF5FFDEB5878CC12A0571CA3AEA50ADD29DD06E13741A1AB215BF487BE7735D1634332F47E037253054A21E0AD8D8F011334CB5951F833D4D344D632BCAB7C373CB7DAFE8F3D79E7E13BDB1C6CFFA474A9FBB46F5736D55F3466534596EBD22B29107A8FA50C1D0E62F0533E343FEE038FC0C3040A6DF2D318BBC8420019B1B148D6D1DD2FE428C2FD617CA73F224EF9AF9BF6F83CF1006616235471B69DD4EAF9F32529EF3E1DFE6765E61E246B519C702351C9CD66C57065EC78993D793B082E3685EB06F2530B07862277D339A52813C99EBE16C06C4C8F547D9705850E770982E8FA0275A52F430FF2422A115ECE46A9202CAA0195789532B1444F1507AAB2E4303464E499989F21C7D881328F18DBC77D4B9B467CAE244A93053C0321DFBF815DA28B6EBF483EAFBE634E9947BB5383FEE3A31BC03A63FCDDA5E3E46D5D3184718C348A83975728714351DF43BAF91787CACA346DBB819602F18A4C4FE90C4CE307984BCDED89CD2E4AEB66318C10D95AFA5BE53393FEB981C21BB1411BB9C58818BCC141223D66ED5F35F90C05FD4848617220DD72F5E892292CE20AA9A0F9AD54022CBE94D2C86DAF3FC66949AC35D8E122B02E2D155E73F4CE24D7E85A5C301DCC173CA8EC090AF9DC7F443C983280DDA27ED4B9BC71F86E84F7AEE39E6A7E9BF5E43920AAC858F0F49A06216D9D3984CD2E3575C0FA6CE8A5E28B0F481CCBAAB450FABCE8A1084EF458DBE257CF09D8116136C2CF1EDFA6CCE31AED0F1F8278C1C8D9C79846886D48E3FD311C015BF2373F7CAA71AA26B011D0DF5A843AB53D7E7F0466CCF49C5D4DE872CA87B8895101EE0147A3DBD391BEED75FC16F65814D56CB29273A5F4E5400FCABF85040505C31D001DF0023726E9C1F7C29A37039FDDA73B9B99ACEC3A029F7C0DD61ADE7D5E835E1CD605AA8E583BF8DC99285E86CF91F4B4827A0E8956EFDE2B495A86F85E78B954341CF3AFEBE8DB71C26B9B1BA27B47284AA84E55B1C2AFEE733AC596A10186D9AB504F33E34A06CA931D7633462B04B9B2B0D4751B0343503BCB2A1893D944FBDB4BE63DE167348A1588E6551FD9CF2101B0B4CB61422655FBEB50D64CB9E87A23007A39821EC3ABA391485347624EFC3DFDA4A133C537D7CD8C3A549BB6BEF9A52D2EDF0A8892C6FC3EEC3EFC3C18741C85BF24CD3B36CA04EE77F654ED5595A0E4B9316CCFE4D2AA6B4A66B06F309337E363C9E39829C8838729F19811093DFBE962246473B7A19FAEDFDB0193F63EB85EF308CD3BE5831F35CED36D9448D0EA8306044F78946079210CF89FF78104BCB2964CE2AF9954D53885D7914E4FFA4AC7E9B3D103922FD1AD68C0A4592F885C5FEE51D52214E17035E8681086203B79B5EB176679EB3263B44EA7287262DD84BB98F6639B9657AC04E397D69C634A0C1181ECA485E467D62631AD2D9AFD5AC5B86ED4005FDBB7404B65BBB826F1A2334A481B9CD46E0CE9C414A162E84368089F24149D7D05EA6ADF40B25A708357AAA5A28801FF100F69252810188CFC6087507BB5BDE1CD43BF72B1B3207CE4F7E65A18E5276613D4BEDDAF21AF7B964FF69965C47CB03846F7CEDDD2C5133080FC632A4F0B3495B2D2751727CF7681F28675552DF2A0994E425A922BBFCF84189B8C9F43058D691DB3166C596F6BC480EFDE06BDAE7B9C2985A1F2F6441520620E193D7B94AB46DBA2A1ADE44E2B006734E6770F34B0E2122DD7F4EAF045164DEA8C2FECE7758630384C00A6B528A6ECF07045B2DC0281C936A540904733149BC65B0F57ACD9A5E41C2ADF83FD6A760B169BEEBF04644DB1314270ADF86D01CC2CD580C609E78BBCD9D2694A89F9CB6DD36B9AA2AA5581FF561B5417BE2B52F3EF2581E461CB0690782F33862C52590643BECE0A6141DC805D8F56C4F64C1BBC49A3ECF1E8827926796E5F9335DF47DA6D3E4C14795B547116FD1F3351FC55C28B543183FEAD8DF7DA4DFBCC38E224901FF7BD83B16631064CAC4A37FA632F53F004374AA19861FDCA515AF91E66186EF804366D5A1B3B4FAAA60A0C4B36B972A9579548B4CDACE7EB85F1F68A4E4255FD994C1786975E7F6F0BA87D0295DE72876BCE37146A09EDEBC0164B9C4911CE41EF4D48130A27651BD0DC315FD622CB6D03759D35756806332658B5B33E768860C1946569AA45130486AD49B +pk = BA5CD9D2664C177350793A6126D0201B2B9EB62BD9E7C0953B6A4A5B980742ED78210D256C567166028A2D06BF176D211275C4B38E21815D2F6A45B56EAFCB2F8BE99B2F49ECFB1A0431AC51FAEA6D8A167B9A81877653A462380ED515F41F0A0D +sk = BA5CD9D2664C177350793A6126D0201B2B9EB62BD9E7C0953B6A4A5B980742ED78210D256C567166028A2D06BF176D211275C4B38E21815D2F6A45B56EAFCB2F8BE99B2F49ECFB1A0431AC51FAEA6D8A167B9A81877653A462380ED515F41F0A0DCDF56469C3EFDA2F53A87A28952A6E3BB8D479432BA61159FF0200000000000000000000000000000000000000000000BAD8A09889723A2CBFE4259D0F0EC2A335C003E0A35055C632FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95509DA0F41F6D229A69F0F9D9930D17B8BE9E82E8B325A842FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000452A1EB5C288DE8B722702E93CACE2A4AD34DDD495F38BB043524A40AE4882A2BD05AC5FAF841B69A7C5E368BB9CF900F48FFAEA4AA14D06340932F427A7041A022F48AF4B2502998BBC450CB4B565077B4CE711A05CBEABB4F6FA151D347E00DC9D7E09F53C9DCAFE436B3B784B1E363DBA81756DE39FA708F14A1FC82FE42D5909F26D02D0EC62E3D193E2F02E4F00C702530B85D81A9D505F5BCCC51F47DCC775A03C4DD1B3890ACBB4B5B1246DBCE6332071BF8FC5F32A5FFB72D925BB00 +smlen = 2600 +sm = 2877A1E6FC120A8B599B1805A791F25ABDB3140D372EB90A9EBE799BDE8B741EDD1A6B8C94B7064A616B6FEB003BBD1B0C95DEE17E86AEB517F3A663749812C5DAB644FAD816957D75A64540DC982B2F63A1B86BDC79A4DA36DDA20A9803F303000227B8ACC81522D66E769E818566625C6DF526C213DB92C21D03F8B33A21497971B6F9754C2C1EFA07AE69B05F773EDA684E03BCDF9AFB62056A03C0948BA2D5FCDE86C1AA346DEE0791FF00ECD3E97899F1D7BE2AEED3C25F8F5A62C9ED4F86AC92FE4000258A84189A0AE064258D152B7DA11F1E801BCB01C24866000202326A4FE723BE9363ACFC000705A10B6CD8A7B25E99A34B4A354CBD6F50550BED30F6C4208490B4194AB79B24B093FBE132C299DF924F2FFCC2CDC6C2C9019EEDF4B72D7F0817825BD787135927102E1DA041E9A78B501B42DCE777A79ACE604E57DF11775D7B87E75E5B00ADAC90D1ADD78CC5AD348C7472EEC6E6E06F737E77115A9509A6AE6570F738DC2F21314A7CCB9D44ADD6E1434CDFE3614BC73A6B468F6691B60F4F2DB103289A90C4FB2BF5AAF87826D2BEB0880FA64E07E9BD30D4EDA00D6BDA01D1EB22BCF14EE797A859C9A0D9034E8C5316201AF91388C47E1DDF061C9F45E067A5F60B355C98F8734559B8F1B82F47BD9CEE0224A1D67D40706333523C34F3582B6C8CB47BF7D0E4FBC7D7CF3DBF21077E664FD59998338F4DD4A423C3A145EE1E994AACC1A48F81A7E9FE106008DB93A6626B8C8505043AB864D93AE3972675E69C3825304086AA3419216CCAE7F7D5117739E99D8F4A0B658148DE33FDAAEB9967EF56677D2028C3B584C5CC1C096F4DA16799408B2EE2FC3482AD2F49293CF4097A78492470099BDB90BCB4FE3B245AC8B3C53E05D7609E34770ADCC147033A8FADE81359FF63C3FB90C5A498C98B7A0E5EE9CF4D287759ACDA4BFA3965CA85E1D1C1019E7FE6D82E5E66A717F94890277E6DB1EAA6F3291FE1BCD7D437094749FF5574B8728E0DC21A143A14E382937EFB7EC1B0FB3F6F9C0F547F470E3B436DFC7986F923BEAA89583D8978C433E0CB0C4E98516AF1AC797C778662455A57FEF45BA2C7865C1DF5C502EDB01C8CC729468091BB96BE9DA9C298528187867EEE9A06141DAA15F60CF719DE2BD15010550B92A41F12D8F38B54692589AFF51A9D5E6047A0D9B707369992251DF31341A45B01B05FFED8ADEE5810824F903EA59F14FD500AEDAE797F8BAEB470C0B14C4EDA5C687E4848A85B30A8E8F59C45D4C9F0C65FCCB15F4D4209A55722C29B6CB09AECB4E53FA3AA602C56EE3BA6900CC12889E7B87D5EF283AF1586764519A30CF60833C82F0ED15E39A8BCAD5C6AEE9999E63D399C5CEA10AE1F53B04858EF7896AA29FA541451FDB685734C39470250545193CAF26C9891F7F965904AE10E8566BFF9B2F465BBE13D6EA4A79586E68844B9FA68B2F992565C8B0EF5FFDEB5878CC12A0571CA3AEA50ADD29DD06E13741A1AB215BF487BE7735D1634332F47E037253054A21E0AD8D8F011334CB5951F833D4D344D632BCAB7C373CB7DAFE8F3D79E7E13BDB1C6CFFA474A9FBB46F5736D55F3466534596EBD22B29107A8FA50C1D0E62F0533E343FEE038FC0C3040A6DF2D318BBC8420019B1B148D6D1DD2FE428C2FD617CA73F224EF9AF9BF6F83CF1006616235471B69DD4EAF9F32529EF3E1DFE6765E61E246B519C702351C9CD66C57065EC78993D793B082E3685EB06F2530B07862277D339A52813C99EBE16C06C4C8F547D9705850E770982E8FA0275A52F430FF2422A115ECE46A9202CAA0195789532B1444F1507AAB2E4303464E499989F21C7D881328F18DBC77D4B9B467CAE244A93053C0321DFBF815DA28B6EBF483EAFBE634E9947BB5383FEE3A31BC03A63FCDDA5E3E46D5D3184718C348A83975728714351DF43BAF91787CACA346DBB819602F18A4C4FE90C4CE307984BCDED89CD2E4AEB66318C10D95AFA5BE53393FEB981C21BB1411BB9C58818BCC141223D66ED5F35F90C05FD4848617220DD72F5E892292CE20AA9A0F9AD54022CBE94D2C86DAF3FC66949AC35D8E122B02E2D155E73F4CE24D7E85A5C301DCC173CA8EC090AF9DC7F443C983280DDA27ED4B9BC71F86E84F7AEE39E6A7E9BF5E43920AAC858F0F49A06216D9D3984CD2E3575C0FA6CE8A5E28B0F481CCBAAB450FABCE8A1084EF458DBE257CF09D8116136C2CF1EDFA6CCE31AED0F1F8278C1C8D9C79846886D48E3FD311C015BF2373F7CAA71AA26B011D0DF5A843AB53D7E7F0466CCF49C5D4DE872CA87B8895101EE0147A3DBD391BEED75FC16F65814D56CB29273A5F4E5400FCABF85040505C31D001DF0023726E9C1F7C29A37039FDDA73B9B99ACEC3A029F7C0DD61ADE7D5E835E1CD605AA8E583BF8DC99285E86CF91F4B4827A0E8956EFDE2B495A86F85E78B954341CF3AFEBE8DB71C26B9B1BA27B47284AA84E55B1C2AFEE733AC596A10186D9AB504F33E34A06CA931D7633462B04B9B2B0D4751B0343503BCB2A1893D944FBDB4BE63DE167348A1588E6551FD9CF2101B0B4CB61422655FBEB50D64CB9E87A23007A39821EC3ABA391485347624EFC3DFDA4A133C537D7CD8C3A549BB6BEF9A52D2EDF0A8892C6FC3EEC3EFC3C18741C85BF24CD3B36CA04EE77F654ED5595A0E4B9316CCFE4D2AA6B4A66B06F309337E363C9E39829C8838729F19811093DFBE962246473B7A19FAEDFDB0193F63EB85EF308CD3BE5831F35CED36D9448D0EA8306044F78946079210CF89FF78104BCB2964CE2AF9954D53885D7914E4FFA4AC7E9B3D103922FD1AD68C0A4592F885C5FEE51D52214E17035E8681086203B79B5EB176679EB3263B44EA7287262DD84BB98F6639B9657AC04E397D69C634A0C1181ECA485E467D62631AD2D9AFD5AC5B86ED4005FDBB7404B65BBB826F1A2334A481B9CD46E0CE9C414A162E84368089F24149D7D05EA6ADF40B25A708357AAA5A28801FF100F69252810188CFC6087507BB5BDE1CD43BF72B1B3207CE4F7E65A18E5276613D4BEDDAF21AF7B964FF69965C47CB03846F7CEDDD2C5133080FC632A4F0B3495B2D2751727CF7681F28675552DF2A0994E425A922BBFCF84189B8C9F43058D691DB3166C596F6BC480EFDE06BDAE7B9C2985A1F2F6441520620E193D7B94AB46DBA2A1ADE44E2B006734E6770F34B0E2122DD7F4EAF045164DEA8C2FECE7758630384C00A6B528A6ECF07045B2DC0281C936A540904733149BC65B0F57ACD9A5E41C2ADF83FD6A760B169BEEBF04644DB1314270ADF86D01CC2CD580C609E78BBCD9D2694A89F9CB6DD36B9AA2AA5581FF561B5417BE2B52F3EF2581E461CB0690782F33862C52590643BECE0A6141DC805D8F56C4F64C1BBC49A3ECF1E8827926796E5F9335DF47DA6D3E4C14795B547116FD1F3351FC55C28B543183FEAD8DF7DA4DFBCC38E224901FF7BD83B16631064CAC4A37FA632F53F004374AA19861FDCA515AF91E66186EF804366D5A1B3B4FAAA60A0C4B36B972A9579548B4CDACE7EB85F1F68A4E4255FD994C1786975E7F6F0BA87D0295DE72876BCE37146A09EDEBC0164B9C4911CE41EF4D48130A27651BD0DC315FD622CB6D03759D35756806332658B5B33E768860C1946569AA45130486AD49B + +count = 72 +seed = F151196F55A9ED88F1663AF6BD24B2CB9DCAF3C9B313CD8F0A27639D3CDAE72EA90D60ED5C7C6AB697A06185E5A2E215 +mlen = 2409 +msg = EFC63DD588A7230CE08EFCFEEA534F5A0EB005480AD1D169C386E476715238526E936FEA7136E2D8AED60DE31CC91DAE4E764CE5F93624FA7F72B87562FB6AD8996B5E41FD478AF0AF8338A7FD9AA250EFD2F2D20364E8A88A8642E8E38F38583ABF8D3BE97F14C3EDE66EBF8EBC84385CAE646CDED8C5CE8F06910BA7FEC05D828446D558D6FED766FBA347DA2E84DA247C34266AA31C328804F4E3AAF6ACBB0AD50FEECCEC00D20B3610785B9F1BA06A0BADFB42A8F43DE3F7BAC36057EE0B4D2A15DB040A8903F767F7352995C8FC3E06ED1B1322587EEE5B31806192E04B09A7B433D08CB2A340942CB75C51E0F8409F907F69C5F8DC316A227942EDF7A458974FDA76C255FF4F1A85A352CD2CD2A21507E0F37451060D31D0847528B3ED5DA3E7168CBD0302F1B03842E63B3DEC6FB37357E37FC3CC26721F290726A47AB3D4DD8FD1778FE5133726C240E7B3E398F3D809C6C469680B9EFD25DBE890D6936B76A52F97AEF3F93872B76506A95685EECDCBCE203400D182252471B99B7F4C6CED4CAC8FACA7682D0DF07BC5904AAE042479855098CBC41534F0EF17F38F1BC8C272CF72C1AC4A5564DD132130EE676E7D7EC3CABB4E85AC81945C87DE08EC60CED3FA0AB3E83C18AE493A851434BFA2C4968B42ACCCF3609539C62A4E01F8BC159362E15EE91D8AA399D8BD8D67BA1E8FD646EEBB4583812293406B05BA5BE2B1DF9620E6FE3DAF8CEBD9652BB04494B899F407C7D9ED1C4E77FFADE24ABE56AD597BD438928E05B0363D6D2685D34D6B51D71012844415C46F13181B146A3AF25AE4E8853CC7C7EF6387306C45180A6EF9E97ABE1E7D5E10115752C3071B6A213367E8B1A3D1C3703CC1840735315623901D772C61D55EF8C47DB10F0EB7582D7A043018DC1363E93F315DD984B8002EA7BF5BED38D3F273276CA577CF99A635CB6ED9D6525520793405BE27C86E6EFFEABB1E5F84A0076BD151CAFC59853424DE4B3460C673B0820D76E15EE47B6505D2D5C179DB92A44042F3631C646D350EA9721B8984660A76018DCA5C6BB1223CD03CC844DC9371D32549D9D645F75D2683FDAD1DF6434BBE43200E506ED2A815FAB511172C70F99A85FA3970433E8955B2F9389F23C10141B5779A23B8671EAE8B91991B78F635FBE8E627D3E79D91FD1E6E90699640BA3AE8D7E4CF5145F1259CC76AE50B1FA150D8338A9450A5B6B90EEC9C94318BC78C9C7715A3EB215AEE6443540D211A0556813529023E5A581623CD6D19BEF0705A5F69AAD4833A57C308144E92899AC5683147CDBD279D5C3A55BBC5E8F8E26A158A3E42F8C5B858909B024B4BA4069E26DE66460FF4A7DC92BD54AC244007B6AC6CE07A31A2AF3323CB55F07B8F480D279308FE10F2DDB001DA6C4AA132B988AD03FB63E0EB06544571F5505CF377A81153D6FBD4FA2B7562074CFAF587CCF28DAC84AFA58809C0B296E0D2594D3582C28596F5AF7500E143BE7B49C63D04F49BBFBDF60B024DABA5533F945BA90659758E06984921EFEEF79604059EB808C9FE1BF9BC5351A406FBBA7F5D8FC9F891488E537DB14B216A0535C9FF7BF8D5C68A2453A8A48E58FA7BF6EB76448D6D0BD05BD4628C4B852A236A11BEC0F67118F1267CA42647F6F2303509094C9A7F3A07B2724ABD2D9B56B71FA7AC6CDDE456EC209BE76C419855A5151EC9EBF0E0CF1B86F4E8E81B8173960F8D1C8AFFED1AC7B818AF8E3BC092E2B209D693E80B11EC7DA39CA93223E1B47C6127E8AD40A78BDB0ECBFA1F39C84CB9ECDF960ABB39884627BC4105C53EE7BCA4802B92AF60241420CBB36C407F46CC2E953D7E3503CC82287A8D68D0E673E212173D80A12257ADD5256652188C00590DADCFB7DBB6B35507B853EA5FAD4F52E02230CB3D3BBDFC43EB74780583E8DBB851E0257117F4A39A6676586216220C1CA21DE16CDFE6E1CC99EA7C989916AD2FED4A8373CFCFF02207529BFFCB7B7601317450BF430BAC9CE111B0FBA8D7DE6627F863078D8E6286B2D34856426EA90FFD58705444D0DC12D4FEEAD0FFE543811E1EF306F40939922563832D06E6DEA7109087AC051A361EA9E755856FD4E51388BC7C40C63E0953C8413AB0CBFF70C466E15DE5B089D095E8EE8A64E929D26CA3B71EF0B2360AECDFA89284CCE08C666F4E0146362F0BB84B87A49FCF2324EBB96DD941F00E2586F7246436EB66B1E04AF84482D8ECD2BC8EF9955CBEC62AFDD754A7F235C7F3C41CD0B36A9024D426B7388D3C33A5A6E858846C0FB0D88BA5798C923F9B43D14A6661C65092D5C5EC0F97D84784FA336AE6EF57C7A5D04804B96D19849FF9074724A5FACA538E32C6EFAA5209317543159272CE50454FE1E7D068C8F5FF3797A66D5F87758627AB5D40EBE1FB7CE9D69287AE7A5F349A5DAABD8A8E7778BAA26DA0EB237034A3366448280237A165CBB303BE6B33C0F11C1E56C50A84384A0F6878F2A99B14CD3B6820ABD27D2011E0C37F8439BEDE65747038A5FF7F00DAEDA094331523CDB7E10F1063B64A584D3E9F0655268F89DBEF3EA3FA4C6E54FEEBF8F0046C6C811F0767CF6FCC9B3497DB05582774047A8DCFF6A0C1B5188076E64A9D5693195075F2A05E507A5A523EEE4537079F9E5E79210E4AF056D6624D45A0EBA553CA9BC92171451970102CAB57DCD89ACEBBD7025008325C61145264F42E4D14A76E5C2F1C129D4C054DA00501081617D1A27012A6E160750DBA73BECB5DC05105BFDE1F1D0CDC837355844B291B09015FD610628513C1C86EAD373730B99FCD4A552FBA07163CE9CF6A3D3AC0525593F0648256E8B33FBCF92AF58CE26D0F036E11230879DBB789507BCEEFD2960EA320236A224EA74DD2AAAC541664FA3EA9430D4FB09C878169A8AF1E7FD4BE5E7926CB0B6A352B25F452454474107286EDAA145C0A0573361522EACB618DD9C8B32BD1A8A5923F4C698CCA0139DC640C1D5D557CE889BB69CE32D85853DFBB0F34DA2CF18CC79472906B67F6BACBF287F31DE0B9E7A01A356EC9B64653CB922501EA1EDA940089BA0F293B667F482E92438805CD6851776CEA0920CDEFC4062C9B4E51F5AA1D7FF909CC2608B6F28CCF28D574BF67CE80D4DDCCE28F2ADE0162CB66894B5B2DA0EB975CD95EE7FE72FDA2736616C8B571FAC94BF8C64ACD1642D9431118F08A62328D99B2B9D90BBC915DB764C4935951A59C369C72060CD9F4273BDCA0C295294008C0AC3A149E8CA5E8BF21042F5F21C067147F3BB52B13975026A9DF7246AFB1D053670982AB316509F2850342913E1322758ED89DA02DD79126726B1C5566C1831CCB1D62B3E271875E62CDE0DF0715D404F95F580B63923F362D416F83FE5AD98EED584717FBC2CB7D1B00101200F4EB4CA5 +pk = 132C30C4F9EFD0FFE7105B0BF68D90D49495022A1864BEE0A1C3ACB6BA22848DD450EE1F5730B0B8CAC750B0D71B7B0DA235AB11F91CC728F946503C40871E04A6EC9D89545FC6D2E8B20B1ABEE953CEBD4545BDFE2B1199074FFE8D8E07672E0D +sk = 132C30C4F9EFD0FFE7105B0BF68D90D49495022A1864BEE0A1C3ACB6BA22848DD450EE1F5730B0B8CAC750B0D71B7B0DA235AB11F91CC728F946503C40871E04A6EC9D89545FC6D2E8B20B1ABEE953CEBD4545BDFE2B1199074FFE8D8E07672E0DEB9CA60B591EC5516A2227E5C8EE0A201BBBB81718DE01B1430300000000000000000000000000000000000000000000DC1A89CA5512F3FD1F2304DC7B7342DE1D6B1D60FAC546718DFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF076D9B5F6F4A12E12ED6ED5BCBC49BCD73E43894AB01016C3DFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025B00ABA432E194C7BD0980D20E11DE225C8EFF74E0B6F3D19FC11CD11F74B2C935FF1F6E4F60450E255EBC718560400F12F106ACC87FB496CDCBD780F4FA2D142DBAC8EACDDDB39DA44005C1D925227020FFB42D0BFF2EA8899EE1E97C1510072D54661CC4089C43DFD004935C66A4F01D063B15BBC416D2D6DDCAA0443290C097FA58ECCD5076A4CCD13FD860FD6006B3BAA9AB85B9920E9EFD16B372D7067D7CF0593D739BEB5F1DB2B8A60DCF01A548D9D193B4657AAE413BE06344C3C00 +smlen = 2633 +sm = 4C4D8B58B3EA81DC574C711F8DBC44CFB82696CDE583D69873ED2B056D4D79CFDFC8FD1B91A1CAE40BCA38672219EF045BB2D998FA00561FE7BB93EE3161C513A4AF687545A0E2D250FFCDBEACD7A553A5011B3A6EBB6108879C0D23C308152A0002A5B08029E39B70A83C8CD737763F49F60CCB516992BCE5A001CEF3ECBFA1FDC011F3C3EB86CAD843DCE82109E16F3DAE93004030D2BFF3939B3EC1CCB0FE1769505E53D260FAB761FAE9026CA070D34C908C8BA89C222601122E2BDF9B812BC3B35F710298063A2446FC7DCAFA101798C0DFE93EFFA43266AE99FE000802EFC63DD588A7230CE08EFCFEEA534F5A0EB005480AD1D169C386E476715238526E936FEA7136E2D8AED60DE31CC91DAE4E764CE5F93624FA7F72B87562FB6AD8996B5E41FD478AF0AF8338A7FD9AA250EFD2F2D20364E8A88A8642E8E38F38583ABF8D3BE97F14C3EDE66EBF8EBC84385CAE646CDED8C5CE8F06910BA7FEC05D828446D558D6FED766FBA347DA2E84DA247C34266AA31C328804F4E3AAF6ACBB0AD50FEECCEC00D20B3610785B9F1BA06A0BADFB42A8F43DE3F7BAC36057EE0B4D2A15DB040A8903F767F7352995C8FC3E06ED1B1322587EEE5B31806192E04B09A7B433D08CB2A340942CB75C51E0F8409F907F69C5F8DC316A227942EDF7A458974FDA76C255FF4F1A85A352CD2CD2A21507E0F37451060D31D0847528B3ED5DA3E7168CBD0302F1B03842E63B3DEC6FB37357E37FC3CC26721F290726A47AB3D4DD8FD1778FE5133726C240E7B3E398F3D809C6C469680B9EFD25DBE890D6936B76A52F97AEF3F93872B76506A95685EECDCBCE203400D182252471B99B7F4C6CED4CAC8FACA7682D0DF07BC5904AAE042479855098CBC41534F0EF17F38F1BC8C272CF72C1AC4A5564DD132130EE676E7D7EC3CABB4E85AC81945C87DE08EC60CED3FA0AB3E83C18AE493A851434BFA2C4968B42ACCCF3609539C62A4E01F8BC159362E15EE91D8AA399D8BD8D67BA1E8FD646EEBB4583812293406B05BA5BE2B1DF9620E6FE3DAF8CEBD9652BB04494B899F407C7D9ED1C4E77FFADE24ABE56AD597BD438928E05B0363D6D2685D34D6B51D71012844415C46F13181B146A3AF25AE4E8853CC7C7EF6387306C45180A6EF9E97ABE1E7D5E10115752C3071B6A213367E8B1A3D1C3703CC1840735315623901D772C61D55EF8C47DB10F0EB7582D7A043018DC1363E93F315DD984B8002EA7BF5BED38D3F273276CA577CF99A635CB6ED9D6525520793405BE27C86E6EFFEABB1E5F84A0076BD151CAFC59853424DE4B3460C673B0820D76E15EE47B6505D2D5C179DB92A44042F3631C646D350EA9721B8984660A76018DCA5C6BB1223CD03CC844DC9371D32549D9D645F75D2683FDAD1DF6434BBE43200E506ED2A815FAB511172C70F99A85FA3970433E8955B2F9389F23C10141B5779A23B8671EAE8B91991B78F635FBE8E627D3E79D91FD1E6E90699640BA3AE8D7E4CF5145F1259CC76AE50B1FA150D8338A9450A5B6B90EEC9C94318BC78C9C7715A3EB215AEE6443540D211A0556813529023E5A581623CD6D19BEF0705A5F69AAD4833A57C308144E92899AC5683147CDBD279D5C3A55BBC5E8F8E26A158A3E42F8C5B858909B024B4BA4069E26DE66460FF4A7DC92BD54AC244007B6AC6CE07A31A2AF3323CB55F07B8F480D279308FE10F2DDB001DA6C4AA132B988AD03FB63E0EB06544571F5505CF377A81153D6FBD4FA2B7562074CFAF587CCF28DAC84AFA58809C0B296E0D2594D3582C28596F5AF7500E143BE7B49C63D04F49BBFBDF60B024DABA5533F945BA90659758E06984921EFEEF79604059EB808C9FE1BF9BC5351A406FBBA7F5D8FC9F891488E537DB14B216A0535C9FF7BF8D5C68A2453A8A48E58FA7BF6EB76448D6D0BD05BD4628C4B852A236A11BEC0F67118F1267CA42647F6F2303509094C9A7F3A07B2724ABD2D9B56B71FA7AC6CDDE456EC209BE76C419855A5151EC9EBF0E0CF1B86F4E8E81B8173960F8D1C8AFFED1AC7B818AF8E3BC092E2B209D693E80B11EC7DA39CA93223E1B47C6127E8AD40A78BDB0ECBFA1F39C84CB9ECDF960ABB39884627BC4105C53EE7BCA4802B92AF60241420CBB36C407F46CC2E953D7E3503CC82287A8D68D0E673E212173D80A12257ADD5256652188C00590DADCFB7DBB6B35507B853EA5FAD4F52E02230CB3D3BBDFC43EB74780583E8DBB851E0257117F4A39A6676586216220C1CA21DE16CDFE6E1CC99EA7C989916AD2FED4A8373CFCFF02207529BFFCB7B7601317450BF430BAC9CE111B0FBA8D7DE6627F863078D8E6286B2D34856426EA90FFD58705444D0DC12D4FEEAD0FFE543811E1EF306F40939922563832D06E6DEA7109087AC051A361EA9E755856FD4E51388BC7C40C63E0953C8413AB0CBFF70C466E15DE5B089D095E8EE8A64E929D26CA3B71EF0B2360AECDFA89284CCE08C666F4E0146362F0BB84B87A49FCF2324EBB96DD941F00E2586F7246436EB66B1E04AF84482D8ECD2BC8EF9955CBEC62AFDD754A7F235C7F3C41CD0B36A9024D426B7388D3C33A5A6E858846C0FB0D88BA5798C923F9B43D14A6661C65092D5C5EC0F97D84784FA336AE6EF57C7A5D04804B96D19849FF9074724A5FACA538E32C6EFAA5209317543159272CE50454FE1E7D068C8F5FF3797A66D5F87758627AB5D40EBE1FB7CE9D69287AE7A5F349A5DAABD8A8E7778BAA26DA0EB237034A3366448280237A165CBB303BE6B33C0F11C1E56C50A84384A0F6878F2A99B14CD3B6820ABD27D2011E0C37F8439BEDE65747038A5FF7F00DAEDA094331523CDB7E10F1063B64A584D3E9F0655268F89DBEF3EA3FA4C6E54FEEBF8F0046C6C811F0767CF6FCC9B3497DB05582774047A8DCFF6A0C1B5188076E64A9D5693195075F2A05E507A5A523EEE4537079F9E5E79210E4AF056D6624D45A0EBA553CA9BC92171451970102CAB57DCD89ACEBBD7025008325C61145264F42E4D14A76E5C2F1C129D4C054DA00501081617D1A27012A6E160750DBA73BECB5DC05105BFDE1F1D0CDC837355844B291B09015FD610628513C1C86EAD373730B99FCD4A552FBA07163CE9CF6A3D3AC0525593F0648256E8B33FBCF92AF58CE26D0F036E11230879DBB789507BCEEFD2960EA320236A224EA74DD2AAAC541664FA3EA9430D4FB09C878169A8AF1E7FD4BE5E7926CB0B6A352B25F452454474107286EDAA145C0A0573361522EACB618DD9C8B32BD1A8A5923F4C698CCA0139DC640C1D5D557CE889BB69CE32D85853DFBB0F34DA2CF18CC79472906B67F6BACBF287F31DE0B9E7A01A356EC9B64653CB922501EA1EDA940089BA0F293B667F482E92438805CD6851776CEA0920CDEFC4062C9B4E51F5AA1D7FF909CC2608B6F28CCF28D574BF67CE80D4DDCCE28F2ADE0162CB66894B5B2DA0EB975CD95EE7FE72FDA2736616C8B571FAC94BF8C64ACD1642D9431118F08A62328D99B2B9D90BBC915DB764C4935951A59C369C72060CD9F4273BDCA0C295294008C0AC3A149E8CA5E8BF21042F5F21C067147F3BB52B13975026A9DF7246AFB1D053670982AB316509F2850342913E1322758ED89DA02DD79126726B1C5566C1831CCB1D62B3E271875E62CDE0DF0715D404F95F580B63923F362D416F83FE5AD98EED584717FBC2CB7D1B00101200F4EB4CA5 + +count = 73 +seed = C7ECD1EC1A3D83F5116C0AA4345FB3ADB4D9F81BD79896BC4932EE2F9D2D1F179BAF7A002D88F4F69071A7931E7F7FAE +mlen = 2442 +msg = ACB414EB55AE5E49107BD0AC5975544F83104F7264495AE0BF0A6D9594C422C16B99469ECCDFE8B8000875B469309891EA42586A615D146DE64FE59277A61631B2C7F7379CD52FAB3871BADE120EE9558D1479A91925634578CF14D35DF3B5672F8B5F9F956FA9F7489D6E37E207FE556017736F6B147A8CF664D0E0521D94737E18188A1B7C30296CCC9067E7B55D6E0F2FBD875F42FEFECAC49510E324968B07372DEB10A31C585457E0C48879CE44BC78898ECEFAC7BCEE90D0F8925DF2B52D5AC81692E0160F8FD5808645498428260F592E29BB90FCB07D0424EC79FB081840CB827CAA4A9D562183D10EE41D281E26CE3EC0069C83E1E446EF82E2E30DEBE3F409E0A9E6D1550E224DB15DBDDA44341E4ED6F8B8984716CA87233197528547D090058607CA141424A13145F1E896555288C5E2877AB3B51C7F9248D2D56A8521975BC4EAE3D009988CBD73C66931BADA0725FB8A3448D43E0C7364E9494FC4E295A700E79972E1FFD626D1CBE0199917851638B192EF9F5C03223F2BBD67EB59A5E8BAEC3DB40616938274201DEA1AE640F6EE7E047CC4C13F80DC65E3FCB5C62386015F4EF1BFEC561E121F9BFA9B2075BC1C4730503FDD5DEBCE8A535ECA01B9D5B021C290854B5F3D49EFFB263DDA34C4E96AEAE9E71A686C009B205994B46CFDF1F76727CA67D415B9D21D54312CDC6A8ED0AEAB96B580D0B419E2058E5D843C17C96D156549962F81C266233ED2B795FAC40B1992B626457F211F08106AD86F5702B9DEB9323A0970AD86125ECA836E0A3D6CCBC380D474049BD96EA246B8BD9542793A66E15B319AECE6BEE17ADBBA7DB337D25F8F642774030A2FF969CB5671F59901CB109E661E55FD5E75EB2A96DC37FEC76A82EB89D020B4916271CFB0CB3342494FDB62EA0D253FB8FF2E91357B33D96D41530B8B5E9550FE9B3F9F34FD5A2A1A6A8BEB93CCC322622F3B5E8487DE19AF57CBD1481ACE02779AD928B17A9B05CBEB722C783B088B5912C2D67CE5073F1801C23170DEB1EB6DDFFC4C33DD25F94F4FBE59D704E478FB49DD2142801C37ED8F539EC1782EBD2F3253BBE19C5A048B9EF41824A811119F3A6AD2A0D4B77338E001358C61A9794572B0C46EB1E0E575D4DA141A415829BA8712B791B625B1B0EA840EE745D9FFE1E99EFD782BA25859351F443654995102CBEFAD7E59D03C9A502ED7B77144D0566E4BFAC086A7DEA356CB9E5AC02DBF7E81D6CEED4A33DA8D801D61BAB5C01F259EE3A99FF7F6D7BF8F2160C4BC3F890736074B000C4C58FA4615880F93FAD43D5657C76045D7C414E6B85F63AAC91F04A616184E04FF9AAD513BA767215FB0331A369D36C0AE9B1EC1268F1D0B43C42B786DB23DD66465B3AF17FFC68C67964C2FC9E41EABC45DB68CD2C3D95B8BEC787D994BB8E9CF1DD7D4C563FCA5D80B3F1FE8E3C7BFB7D171F5B9023BFBCC0CF4371B63C856EDBDA154B4313C47983F4027F9E61E86DA1E8CD787E3E6B50E1DFC9201B9AB92059F8B6D1BF7856CD55C5B1D6C4E6EBF818D481C56F66C79444F5A6544A64A7D78EAD33EB805A6AC4310CD46A2331E707B9B0950CA12092402D68C1CC5C3F269DFDB13AB34B97EAB50B0745BE72BB0FD2D73BEA5DD37802393B635E42A0DEF8544A96E7F40A8D9D06B64E38DC406BD59AC5C4E218591D20B8DBA2125978096517EC5C03F9BC6F96CB255E216EF82D7C7C873029F9E1D98EBC0D8E1312B84B8D02E8D680AA56A506C8668B5B9C56D04CF68E37C7CB1B9377C867240CD42FC7FBDE0AC44E3DCCFD3F877C9923AE9CECE0CBDAB00CA530F434A33F1C939FB88ADEF4D12ACBD8B2B5A139A3FB776D8223A9846465C0372B8C3233FB5280E936BBE9FD49058961463A4419D939F4F1FEA705EB63114F0A3533638DC4D3EFD620147770AD877E2354299CEC6E5C18924E78DD661697ADF89A77C7365522D3E8FC0855187139F7E43E9A0629EE321B2CBD9F007B05C22EFF56FE48045686B36C5BAC2267F37A2E3D4E03E19B1E422ACEA31C2E9F3E7541976D4E2FA03119DF9C4CC2D5418F0FC7A467CD98E290695B9530B91D5DF8C626C7236A5C0FBA73578B9A47491CA0AD26A144B0F23EC23D2C5B2DAA03BF40130F14B9A427CDFF1F232C9CF02426228C570CF1FA7C00A773BC0D70858588542BBF8F581540870897BFAC8387CBBA3416A846CF9F4F5D3F9DCEDD080CC0DE9F71B93828B835430898E82896CD3F30FE2AF8349DB294FB2A8FFC0848692A0B9E8A66EBBFC0F896F8D03E3C6A0C27E0F2177B85A2F6FE31E8AAF14EA5C1FDC54E80CDE47AE27A161264680107023CFFA961E913C4E6AF96C0BE37AD859C334CDB8BBEECB5443662739D027EF1B9535A5A46E2169933E419454025623FD6779F54C622EF81AB9289B50758EA34F868EC85AEE589B08962B85CF537BC733F62AAFA95FD81A60D5C2E38D6EA0DF7D1390BC5050E2463E3E2E3A769DE2A94ABDEDFA0ED67CC0FFAFC5A05A3B0FD37BBE6967BED8DEBF02A42CDC80BDC62158E184FDB6672F7947505E2C0A6C7762B1145C4BAF30E3D32434D22707044DC99D2CF2D38F15C43ABC8632382BBBC9E0F106565906F7D4948D30FB19EDCC3748100397F71E1548E58A5A01876D0A12DCC80000224221C4ABD98A5022506D24BF4D9B9108991AD3421D4AB9CC393DCB8D744F97822F95CBB2640E73E401F044FE20253ACB8B32A75FEDA640E190454BAB695A23B14AE3EF60B00491AB22F622DAA89B6B2E6D18E735672FE0EB2DE269E4E386C926E23B865E1BA22DDA688293DE144102F7030FDE6DF653E4106C08C2467AD7C54D1DF0DC5981004876C6BAA8720F70942700A154A376C8D45DAE1BE74910148EE3F2733E591E1965FE763B58C8B28AF25E9B3C633ABD83F1C0A4F68DA2E0B85083BF97D4E919340C0437A604416C4F629B33039BBF2A1F561548321780411D2E8AC0EDAE76FC3A19F3C84C3BE902A1E84FDF69B11A12DC8B78EF257B5FBB5D923FFD548451A52C6A3AF31C70266AE8A957B2BD72A51A034A2921B8E19321108AC303B0D2E269D032C3DB13F21D558C82BA4158962F2210E1C5FDD96C98D6639AA844F34E40C1B9C909CC6AF1E97A8DC83B78C72B30B7AE400F44CA60AF37770B3D9147F7D6F5A327F34DF7CB8891E71D41D723CB18E0DD324E5CD22AE0D9F2B1D2BFCED0288B7AA73AF4FE0A8181BA1AA7EAE966D0A240E10FE5735D98326A106D16DC49F3FDB19D3A8449C56A74153655600E4C9E38D302C6D4080017D93C628388DF94860329BAA289EFA4587F079C6F03FA03C54540A0AB4B067EE46A5A346F2FBBFF6570ED0166A55C258EABD62AD90F060FADE84E8FAC799F7928285F58557A72E055B535D00BD9A4880D10C05C07CFE7A6FEADFCDED880521803E339F6EAE3FF28A0A471A003358F952320F41A0AEF9D28 +pk = BEE14C675116A2B08C27B3E063AC4C38FCCD4F29735CD589A5EE24A0DBE738DEBF5739920A960191AF8AE139032547131CE636DEE68D11ED5888DEA71116772DA141B5552F330CBC2DFB4CAD245975A98F9E519112E2A933F99E25B88C901B0C02 +sk = BEE14C675116A2B08C27B3E063AC4C38FCCD4F29735CD589A5EE24A0DBE738DEBF5739920A960191AF8AE139032547131CE636DEE68D11ED5888DEA71116772DA141B5552F330CBC2DFB4CAD245975A98F9E519112E2A933F99E25B88C901B0C02099E14B52211926F0DCD9FE7B33687CB87E255656FEED9F5FA0900000000000000000000000000000000000000000000AC1841B3060D78CA1F9E324E6F3F4BF10786C0B52202583EB5FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05269B89D3029BEDFE71DDB649779DDEB812C09C62CEE0BD38EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033FF7261A2B91E00F141ABB1413B42C6AE26952F17F6F0CD8382EE7966EE64A6FB49BB3B13A0F1E375758307C591F10011489AA5C0E5249DFBD4F1F473E21A33CFC20C03828C5AEE81F8A634425609244479A113EDC3ADBA8CC41A43E5D2DA00BA5C69F926D79F17DB7FA944B0DB281CA9BD35F2A1DE14BE0C4883EB5C6BA563B08A657AB0E03F529E25F6D1B8F9FA00CF4E1D932DBC0D588F3B861B683F02824C328406EBDD7F7C14670E4CC1BEC9D39C4FB9A02344F405869EA492558A1C00 +smlen = 2666 +sm = D4D4B923805EE3158A5263F0FA2E2D6D5666B44D4639F255366F1BBC17B2106FCBABB9BF08A62E43DC86921AD8C8AB065C5653B020A3B15DE46EC3D3A42A51FB99510146A7193A9031BC78ABDF7DF18F096307A838E61F0861524C7D16F498360001EF5E336171020E63D537E8A450C57E8AC0042D10D5639E8803069BEF526589FBB06A74B1C69F47A96B064D19483F5E773602D73596F1A7C1BC352E8AB4C3D24439993239D407EF5AC9CE02CCEBB3D55E79AC9AE430ACCFA7D0D2B260C3CB1B1FD1C4C502F3D34F69AD81F2896899B47AAC5EE5509467F60E675F5500150CACB414EB55AE5E49107BD0AC5975544F83104F7264495AE0BF0A6D9594C422C16B99469ECCDFE8B8000875B469309891EA42586A615D146DE64FE59277A61631B2C7F7379CD52FAB3871BADE120EE9558D1479A91925634578CF14D35DF3B5672F8B5F9F956FA9F7489D6E37E207FE556017736F6B147A8CF664D0E0521D94737E18188A1B7C30296CCC9067E7B55D6E0F2FBD875F42FEFECAC49510E324968B07372DEB10A31C585457E0C48879CE44BC78898ECEFAC7BCEE90D0F8925DF2B52D5AC81692E0160F8FD5808645498428260F592E29BB90FCB07D0424EC79FB081840CB827CAA4A9D562183D10EE41D281E26CE3EC0069C83E1E446EF82E2E30DEBE3F409E0A9E6D1550E224DB15DBDDA44341E4ED6F8B8984716CA87233197528547D090058607CA141424A13145F1E896555288C5E2877AB3B51C7F9248D2D56A8521975BC4EAE3D009988CBD73C66931BADA0725FB8A3448D43E0C7364E9494FC4E295A700E79972E1FFD626D1CBE0199917851638B192EF9F5C03223F2BBD67EB59A5E8BAEC3DB40616938274201DEA1AE640F6EE7E047CC4C13F80DC65E3FCB5C62386015F4EF1BFEC561E121F9BFA9B2075BC1C4730503FDD5DEBCE8A535ECA01B9D5B021C290854B5F3D49EFFB263DDA34C4E96AEAE9E71A686C009B205994B46CFDF1F76727CA67D415B9D21D54312CDC6A8ED0AEAB96B580D0B419E2058E5D843C17C96D156549962F81C266233ED2B795FAC40B1992B626457F211F08106AD86F5702B9DEB9323A0970AD86125ECA836E0A3D6CCBC380D474049BD96EA246B8BD9542793A66E15B319AECE6BEE17ADBBA7DB337D25F8F642774030A2FF969CB5671F59901CB109E661E55FD5E75EB2A96DC37FEC76A82EB89D020B4916271CFB0CB3342494FDB62EA0D253FB8FF2E91357B33D96D41530B8B5E9550FE9B3F9F34FD5A2A1A6A8BEB93CCC322622F3B5E8487DE19AF57CBD1481ACE02779AD928B17A9B05CBEB722C783B088B5912C2D67CE5073F1801C23170DEB1EB6DDFFC4C33DD25F94F4FBE59D704E478FB49DD2142801C37ED8F539EC1782EBD2F3253BBE19C5A048B9EF41824A811119F3A6AD2A0D4B77338E001358C61A9794572B0C46EB1E0E575D4DA141A415829BA8712B791B625B1B0EA840EE745D9FFE1E99EFD782BA25859351F443654995102CBEFAD7E59D03C9A502ED7B77144D0566E4BFAC086A7DEA356CB9E5AC02DBF7E81D6CEED4A33DA8D801D61BAB5C01F259EE3A99FF7F6D7BF8F2160C4BC3F890736074B000C4C58FA4615880F93FAD43D5657C76045D7C414E6B85F63AAC91F04A616184E04FF9AAD513BA767215FB0331A369D36C0AE9B1EC1268F1D0B43C42B786DB23DD66465B3AF17FFC68C67964C2FC9E41EABC45DB68CD2C3D95B8BEC787D994BB8E9CF1DD7D4C563FCA5D80B3F1FE8E3C7BFB7D171F5B9023BFBCC0CF4371B63C856EDBDA154B4313C47983F4027F9E61E86DA1E8CD787E3E6B50E1DFC9201B9AB92059F8B6D1BF7856CD55C5B1D6C4E6EBF818D481C56F66C79444F5A6544A64A7D78EAD33EB805A6AC4310CD46A2331E707B9B0950CA12092402D68C1CC5C3F269DFDB13AB34B97EAB50B0745BE72BB0FD2D73BEA5DD37802393B635E42A0DEF8544A96E7F40A8D9D06B64E38DC406BD59AC5C4E218591D20B8DBA2125978096517EC5C03F9BC6F96CB255E216EF82D7C7C873029F9E1D98EBC0D8E1312B84B8D02E8D680AA56A506C8668B5B9C56D04CF68E37C7CB1B9377C867240CD42FC7FBDE0AC44E3DCCFD3F877C9923AE9CECE0CBDAB00CA530F434A33F1C939FB88ADEF4D12ACBD8B2B5A139A3FB776D8223A9846465C0372B8C3233FB5280E936BBE9FD49058961463A4419D939F4F1FEA705EB63114F0A3533638DC4D3EFD620147770AD877E2354299CEC6E5C18924E78DD661697ADF89A77C7365522D3E8FC0855187139F7E43E9A0629EE321B2CBD9F007B05C22EFF56FE48045686B36C5BAC2267F37A2E3D4E03E19B1E422ACEA31C2E9F3E7541976D4E2FA03119DF9C4CC2D5418F0FC7A467CD98E290695B9530B91D5DF8C626C7236A5C0FBA73578B9A47491CA0AD26A144B0F23EC23D2C5B2DAA03BF40130F14B9A427CDFF1F232C9CF02426228C570CF1FA7C00A773BC0D70858588542BBF8F581540870897BFAC8387CBBA3416A846CF9F4F5D3F9DCEDD080CC0DE9F71B93828B835430898E82896CD3F30FE2AF8349DB294FB2A8FFC0848692A0B9E8A66EBBFC0F896F8D03E3C6A0C27E0F2177B85A2F6FE31E8AAF14EA5C1FDC54E80CDE47AE27A161264680107023CFFA961E913C4E6AF96C0BE37AD859C334CDB8BBEECB5443662739D027EF1B9535A5A46E2169933E419454025623FD6779F54C622EF81AB9289B50758EA34F868EC85AEE589B08962B85CF537BC733F62AAFA95FD81A60D5C2E38D6EA0DF7D1390BC5050E2463E3E2E3A769DE2A94ABDEDFA0ED67CC0FFAFC5A05A3B0FD37BBE6967BED8DEBF02A42CDC80BDC62158E184FDB6672F7947505E2C0A6C7762B1145C4BAF30E3D32434D22707044DC99D2CF2D38F15C43ABC8632382BBBC9E0F106565906F7D4948D30FB19EDCC3748100397F71E1548E58A5A01876D0A12DCC80000224221C4ABD98A5022506D24BF4D9B9108991AD3421D4AB9CC393DCB8D744F97822F95CBB2640E73E401F044FE20253ACB8B32A75FEDA640E190454BAB695A23B14AE3EF60B00491AB22F622DAA89B6B2E6D18E735672FE0EB2DE269E4E386C926E23B865E1BA22DDA688293DE144102F7030FDE6DF653E4106C08C2467AD7C54D1DF0DC5981004876C6BAA8720F70942700A154A376C8D45DAE1BE74910148EE3F2733E591E1965FE763B58C8B28AF25E9B3C633ABD83F1C0A4F68DA2E0B85083BF97D4E919340C0437A604416C4F629B33039BBF2A1F561548321780411D2E8AC0EDAE76FC3A19F3C84C3BE902A1E84FDF69B11A12DC8B78EF257B5FBB5D923FFD548451A52C6A3AF31C70266AE8A957B2BD72A51A034A2921B8E19321108AC303B0D2E269D032C3DB13F21D558C82BA4158962F2210E1C5FDD96C98D6639AA844F34E40C1B9C909CC6AF1E97A8DC83B78C72B30B7AE400F44CA60AF37770B3D9147F7D6F5A327F34DF7CB8891E71D41D723CB18E0DD324E5CD22AE0D9F2B1D2BFCED0288B7AA73AF4FE0A8181BA1AA7EAE966D0A240E10FE5735D98326A106D16DC49F3FDB19D3A8449C56A74153655600E4C9E38D302C6D4080017D93C628388DF94860329BAA289EFA4587F079C6F03FA03C54540A0AB4B067EE46A5A346F2FBBFF6570ED0166A55C258EABD62AD90F060FADE84E8FAC799F7928285F58557A72E055B535D00BD9A4880D10C05C07CFE7A6FEADFCDED880521803E339F6EAE3FF28A0A471A003358F952320F41A0AEF9D28 + +count = 74 +seed = 5DE03CAB3CBD81B8805A17E0FFC2105C3BCDC8D782EAAB161A15AAA543FED59353C1FBE03E7F36B955FC51C9B30F0C93 +mlen = 2475 +msg = 5F7522CE6BD0CE6321C27B9EAA6F572616201F283C5EC171D0BA47662C2320897805E1551ED438F3FCBDAF9DE6F3A19DC16FE9C167A65B6E52BCF512C919561B548496A4A80AF7CE25458A62EAE92EBF677872482D8647C30C12BB1F080C6B9A56560D64FAB73DB17487BBB007C66661EA9DDA14601AB27A100EF4CF4B7447E51418651C03211F8FB884BE91F3980FE13E00EA4ECFE6D54882059A436C90BCAD80E4101CC6C0754417545F2D167629F80A3C5FFE45C00AB2BAF0494D6C065872B03A987A5EE818B3EF11E47FE1747F49E2DB6A14410F0B1F9610A2D6114395EF6EBB231FDF71D595CC1171DB9C89D6CF202E42D4FB968AB8105FDDB2AACB15FAB8014B534CF468D77ECDE2072623B7002620B7AC3E78B62AD673FEEF9F8E97E91ACDAB171FD415B2D15605DDE00D074A770E36F2218F7130F13E91FA4C88DEEA7E854BCAA01B8458D40625A33E982F0955B83080A926EC240E31F0D9BF477EE3A016E146A3909683410D4D09ECDF32EAEF580402F0D416DFC082CF1362E8B79158BD57739AEE56DC41A549E534C7CCF3620C7D7D95B92994A747D5EFB8EC43CFA8189BAA9B75FD54694E512FCA388B71A5B9EA591AE9CFA34183DE59D284AB16B2EFFA4B26A24A0E615B38B83088A9827EEB5C29B419BC061B033E0E3FC809AFDD3DE948412677E0BB5136854532639F3CCB176D54EA1961B5C527EF66F4B3286A583E86208AEEB8ED07D9E6BF1BEB33995F76CA480039A6130775895F19E3CD4873ABE3BF2FA9DE81BF0CB04575DD6AE282720B152CF0EC6A4A04016DB0F3543D8272AE56B1152B02EAF22131420CB194021F97060D5CE52EB21B57CC93964DD21344786E3888617152D2ABD829799CE47D20158AA93F7DA85CA6146C5BB94B512DA053C35BFA8840CA43F6509A1477603FD50F5E4F9A7CF8D2369156989AD638D35D345BDC859C52688211BF7EF3F4AD4944657289406BF01DCBB49D560A11840EF35DBC0C7F9C96DBEA76300CF61997A87D70F5FF8C51AECA2CF0680B6FE8C4025E1E25B62103D248CDEE335F4FCD67597103362003206C507970EA6D78CFF4B68B44244019152DBF812675CF667E5E13C8596EB6FEA3903BFB25ED08F902722A37F8E460E37A03A2D6ADBDF79DA20052DE658390484B83BBAB28D039A303D7376BF555181680B7966C798A1C6CB215257E37739DE7B9706CD1CF3AB031F68C82D6ECFA507C104115040744D74A40C49245215639D0CF4A5A7A10098E9CE3564AC3C44F0683AE9D3094784D354DB1AF439BDDF63D5CCA668D8180264EFECEEAC0BE1B8E1C6418E45F9ED6C779ECF169143B034CD9F332989D445C83A8786398C507B9171B4D95728575539CBB29C5B804268D88F2B39AF1F9572B8DAA9FEEEF69C4A77DC64BF2DBB5E57F8B33AB151769B2D00010D67A2D6F188D6D5B35E5E1873FE2B327E42AFB8885A842D26C246F7C18E6BCDD6FA49B300C65A3822121E95004928104017CBCE2AB95ACADB9802BF4BB049B8E96468353D649654C6F69D774380A5A387D6414DC3000540BAB6ECCBAA088C1068CCEF20036E5C8342FD512F55E6794BF85FE15721D99A1BFEEDC218617A940C8C25D4DFAFEC677D2A719B2CDDCD302294B7FA41AEAB5606F859CC0D638AC94B99AC3EA48C687D278EEBEB396DC5BF2D2E89E880F76B533FA54EFD30D8EE38B34DC5F8AE62C637E9A7E85D99E011F62D261AB4D3DCEB98A8972D3482CF817EFF476B873AC56963BD60183B359713385BA82F6E24BE2D6CFEA6DBB4AD2E1B5B790EE54D23F64E740502E887629B346FC8FCCC3338D0F2921131B84590B32C7CB82CBA8BB3B81EF7BC5CB12F0AA0B3C6A5B2878DC4F868057C68460C71D40D4263AC5C8B8317D2D0B63403C7549439A9EF227268372EC3A54CF8EE97714BC4B55007F92B1A32238659EC1EE27D6F2987AB06FEE84C3AFDFA73240963F076A955BF3C19410E1DA6A19B3EA3AE2DD8766082D3295D35436597783DAFDADB905465D05FC21FA8AC2737A52FA8AAEFBD2ED83F12545C1FA3198FF225D37070694C9392738E89467EDB2DA3CD1734CE398E32BCB1FEA2E4FE1260A2D9F9EDC3607A8AC8A51D5DA36E99B31903025E0CB157FD2FF5B51C9191CC16A9CCB870B4060CFB0FD900AEF62738A58C5726F5164417F084EF14FC0953E3C6036B818C21CA3476B8CC5F8EBAACE257A0315031A03E64E7F749B9DF99BB56CEEBBAA4333BC7270EDEE90FA2715BDDC38D44898A41998B2374B6EE3B8524D3A385C03868EE9479355092C4D20EC32DEB51497F4FF34AE7E7EA4828C288F46E5148DE28A8C660EE132E5B5489833DC66205EC968B60DAB96C2A4452A7019BBA9FE3D19D5829129E2A9C75C39416AC8695145F2B62EB9468198CBD48D7670DDC6AF2F99F77E7ACD01A34EA8E0E974206FBC22656867D09807B980563E06A559B0C3A7E6F43CF8DB75B18C0F90C12FF3BD43ABCE7DF75D17E631C08C974322010648FE2E2BC940E6510FB8835DF8384EFF3FE6A264687256C6BC0A5F9D2DDF208171DB55C4446B03CF27796BC77E3C68D8F1252BE21877D7C53747404420302CA5AE1AB57E43B158BE8B707360A2F59D6A473F98B816FDE2CCEDD92385202C419278E8B840DBA4C05E9BB65F68AE2A635A29110329E8C0C02F6FB5EEE41ED225051EE975F92DA52F93EB1FD7C0A098F6D1421701537298651313514AD31CB333E9C5DA719BBA95E73878BA41F9E2512862A80602AA2DE1E1D086576531330CC7BB8F0CEC38050B3CFAE5C8B1D6CB849A579F2294F8CE80FDE5405BFA3E6ECB01D5117203A4523591AC4030397DE9FF81D5CC91AF3002590F5854E852B88667638B2D052F2A7852425C8EC026E48D9EF5E73D1993D7F3FD7F704760562C36D2278C9CE131EC6AA444D7B2EACA3EE888D9B2AE122688DCB35455E7DE31562BA618F1183308B30D07A5C34020546218101AD42AC5054D4703587FF60E860A60375FAB12734912058D5B0B06430FABBFE0C0B43C22814F56DAE9E2713325A31C682C13F008B9A3D4FFA8A454F0F64A9213FF2D557A4CBC64EC6E4ECA0A976CD9F27497BA544DBAA3E2ECA0F54C2634C719B9C3A2CE37BCC8158A880BAA72780F8B1D3494F589E2AF3044B4FDD86F4DB2DF0843EBD9F3518870F55488F41E234CE94E907A69D28BD83347702750DB1AE2EB1454CDCA37A8B5FC90091F548BABF489E57C8919646E977274FC972088A522FFF9F9306D2F0ED6C01FF92CAE8440D7F3526B8C186D5B96942CB08032886051DA2A9FE77E38BEB18F4FB25F1152EDF9D61347A00A844929976A327BE46FFD3E2EE0B6AB1014294EC5D40CF7071C36B11127FF90720596C1B3065E7DE8010AEA469BB4F4AC5A6EFD20591CEFB7B94B2006D85CA475FEE556F24CC41237C631B75EB594F8342DEB4F976D73AA46563C1AA6D0B605A16152315626BA08807DAA6025CF62B29176F3A85E4BCA483EFFEA7E5939 +pk = CF4AFDC959CBA52F3F48419A6F93962E4332CF8B2A078817201DBFDAE21EB16C49B9A4FF749A5AE44851C92A02F2B53D13C6D703EFE62FCA2CBE877C4064246153CC0F75A1E690EC13B43640B751BB8DAFBCBEC78E365A77FCDAD15CD27DAF1A19 +sk = CF4AFDC959CBA52F3F48419A6F93962E4332CF8B2A078817201DBFDAE21EB16C49B9A4FF749A5AE44851C92A02F2B53D13C6D703EFE62FCA2CBE877C4064246153CC0F75A1E690EC13B43640B751BB8DAFBCBEC78E365A77FCDAD15CD27DAF1A1977ABEAD17F6C35BE6016DF64C2BF86BA04AB6918E56E10FE651100000000000000000000000000000000000000000000A2C27A3EA02B045956A3DC7153F219072EBA623EE649566F6AF2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9166DA272ECCF8D3B64B5E79C05C7CC57C243A92F73C7B6B7FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042A114C152859285C76BF277CCFA2B1DF971A5770E45571B8AA40F27C1847A4C9DD9085CE84C77F472819EE4D0B539002166D0E515433C2C5FE0AFADE87357B670438DA6973FA6DC66EC225B6D3955564DF7E5E96CC0C085607C6F278904F3000D67E8C3CD355E004083AB8C47FD579F3EFA49DFEEBA381F6D3A494054ACD5C4F7FC849DF468AA45454FB410472641003DD825E58FCF6905EA00E8337003D1F6BCB80DDBE0AD6A8C7AF6F7A1F6966E7C2E3556E5F82777A7D196619A94BF5400 +smlen = 2699 +sm = D4B4CA1D7A855ECDEDA3C3236D4E643AAEBAA0CE2EF6AAAF9D41733BF9FEC417E59E27D0EB1B137644826D603473890E6212AFB0E2F1D38270D07848E3D21A81ED9A9F59BFADA39DDEF83B103B299381D1A4A6FE654D5290FAE3325E7A8AB71B0000F8154BE0F3752B57707F73DEF3CFD1F31EC040BE6AAD12F6008D313DA89790D89C957FD4F9EFD54876490E7A60A0A21A0A012B00096F4DD4BDC89ED63AFCE455CFC1970D1E72F82FAC9303B6D42C930825860F1369C54F84CBC5D17383B47FE09B4B9303E6CE6EF110F91EA2C91B311A18ABAECFFB5B7072602B0A0002025F7522CE6BD0CE6321C27B9EAA6F572616201F283C5EC171D0BA47662C2320897805E1551ED438F3FCBDAF9DE6F3A19DC16FE9C167A65B6E52BCF512C919561B548496A4A80AF7CE25458A62EAE92EBF677872482D8647C30C12BB1F080C6B9A56560D64FAB73DB17487BBB007C66661EA9DDA14601AB27A100EF4CF4B7447E51418651C03211F8FB884BE91F3980FE13E00EA4ECFE6D54882059A436C90BCAD80E4101CC6C0754417545F2D167629F80A3C5FFE45C00AB2BAF0494D6C065872B03A987A5EE818B3EF11E47FE1747F49E2DB6A14410F0B1F9610A2D6114395EF6EBB231FDF71D595CC1171DB9C89D6CF202E42D4FB968AB8105FDDB2AACB15FAB8014B534CF468D77ECDE2072623B7002620B7AC3E78B62AD673FEEF9F8E97E91ACDAB171FD415B2D15605DDE00D074A770E36F2218F7130F13E91FA4C88DEEA7E854BCAA01B8458D40625A33E982F0955B83080A926EC240E31F0D9BF477EE3A016E146A3909683410D4D09ECDF32EAEF580402F0D416DFC082CF1362E8B79158BD57739AEE56DC41A549E534C7CCF3620C7D7D95B92994A747D5EFB8EC43CFA8189BAA9B75FD54694E512FCA388B71A5B9EA591AE9CFA34183DE59D284AB16B2EFFA4B26A24A0E615B38B83088A9827EEB5C29B419BC061B033E0E3FC809AFDD3DE948412677E0BB5136854532639F3CCB176D54EA1961B5C527EF66F4B3286A583E86208AEEB8ED07D9E6BF1BEB33995F76CA480039A6130775895F19E3CD4873ABE3BF2FA9DE81BF0CB04575DD6AE282720B152CF0EC6A4A04016DB0F3543D8272AE56B1152B02EAF22131420CB194021F97060D5CE52EB21B57CC93964DD21344786E3888617152D2ABD829799CE47D20158AA93F7DA85CA6146C5BB94B512DA053C35BFA8840CA43F6509A1477603FD50F5E4F9A7CF8D2369156989AD638D35D345BDC859C52688211BF7EF3F4AD4944657289406BF01DCBB49D560A11840EF35DBC0C7F9C96DBEA76300CF61997A87D70F5FF8C51AECA2CF0680B6FE8C4025E1E25B62103D248CDEE335F4FCD67597103362003206C507970EA6D78CFF4B68B44244019152DBF812675CF667E5E13C8596EB6FEA3903BFB25ED08F902722A37F8E460E37A03A2D6ADBDF79DA20052DE658390484B83BBAB28D039A303D7376BF555181680B7966C798A1C6CB215257E37739DE7B9706CD1CF3AB031F68C82D6ECFA507C104115040744D74A40C49245215639D0CF4A5A7A10098E9CE3564AC3C44F0683AE9D3094784D354DB1AF439BDDF63D5CCA668D8180264EFECEEAC0BE1B8E1C6418E45F9ED6C779ECF169143B034CD9F332989D445C83A8786398C507B9171B4D95728575539CBB29C5B804268D88F2B39AF1F9572B8DAA9FEEEF69C4A77DC64BF2DBB5E57F8B33AB151769B2D00010D67A2D6F188D6D5B35E5E1873FE2B327E42AFB8885A842D26C246F7C18E6BCDD6FA49B300C65A3822121E95004928104017CBCE2AB95ACADB9802BF4BB049B8E96468353D649654C6F69D774380A5A387D6414DC3000540BAB6ECCBAA088C1068CCEF20036E5C8342FD512F55E6794BF85FE15721D99A1BFEEDC218617A940C8C25D4DFAFEC677D2A719B2CDDCD302294B7FA41AEAB5606F859CC0D638AC94B99AC3EA48C687D278EEBEB396DC5BF2D2E89E880F76B533FA54EFD30D8EE38B34DC5F8AE62C637E9A7E85D99E011F62D261AB4D3DCEB98A8972D3482CF817EFF476B873AC56963BD60183B359713385BA82F6E24BE2D6CFEA6DBB4AD2E1B5B790EE54D23F64E740502E887629B346FC8FCCC3338D0F2921131B84590B32C7CB82CBA8BB3B81EF7BC5CB12F0AA0B3C6A5B2878DC4F868057C68460C71D40D4263AC5C8B8317D2D0B63403C7549439A9EF227268372EC3A54CF8EE97714BC4B55007F92B1A32238659EC1EE27D6F2987AB06FEE84C3AFDFA73240963F076A955BF3C19410E1DA6A19B3EA3AE2DD8766082D3295D35436597783DAFDADB905465D05FC21FA8AC2737A52FA8AAEFBD2ED83F12545C1FA3198FF225D37070694C9392738E89467EDB2DA3CD1734CE398E32BCB1FEA2E4FE1260A2D9F9EDC3607A8AC8A51D5DA36E99B31903025E0CB157FD2FF5B51C9191CC16A9CCB870B4060CFB0FD900AEF62738A58C5726F5164417F084EF14FC0953E3C6036B818C21CA3476B8CC5F8EBAACE257A0315031A03E64E7F749B9DF99BB56CEEBBAA4333BC7270EDEE90FA2715BDDC38D44898A41998B2374B6EE3B8524D3A385C03868EE9479355092C4D20EC32DEB51497F4FF34AE7E7EA4828C288F46E5148DE28A8C660EE132E5B5489833DC66205EC968B60DAB96C2A4452A7019BBA9FE3D19D5829129E2A9C75C39416AC8695145F2B62EB9468198CBD48D7670DDC6AF2F99F77E7ACD01A34EA8E0E974206FBC22656867D09807B980563E06A559B0C3A7E6F43CF8DB75B18C0F90C12FF3BD43ABCE7DF75D17E631C08C974322010648FE2E2BC940E6510FB8835DF8384EFF3FE6A264687256C6BC0A5F9D2DDF208171DB55C4446B03CF27796BC77E3C68D8F1252BE21877D7C53747404420302CA5AE1AB57E43B158BE8B707360A2F59D6A473F98B816FDE2CCEDD92385202C419278E8B840DBA4C05E9BB65F68AE2A635A29110329E8C0C02F6FB5EEE41ED225051EE975F92DA52F93EB1FD7C0A098F6D1421701537298651313514AD31CB333E9C5DA719BBA95E73878BA41F9E2512862A80602AA2DE1E1D086576531330CC7BB8F0CEC38050B3CFAE5C8B1D6CB849A579F2294F8CE80FDE5405BFA3E6ECB01D5117203A4523591AC4030397DE9FF81D5CC91AF3002590F5854E852B88667638B2D052F2A7852425C8EC026E48D9EF5E73D1993D7F3FD7F704760562C36D2278C9CE131EC6AA444D7B2EACA3EE888D9B2AE122688DCB35455E7DE31562BA618F1183308B30D07A5C34020546218101AD42AC5054D4703587FF60E860A60375FAB12734912058D5B0B06430FABBFE0C0B43C22814F56DAE9E2713325A31C682C13F008B9A3D4FFA8A454F0F64A9213FF2D557A4CBC64EC6E4ECA0A976CD9F27497BA544DBAA3E2ECA0F54C2634C719B9C3A2CE37BCC8158A880BAA72780F8B1D3494F589E2AF3044B4FDD86F4DB2DF0843EBD9F3518870F55488F41E234CE94E907A69D28BD83347702750DB1AE2EB1454CDCA37A8B5FC90091F548BABF489E57C8919646E977274FC972088A522FFF9F9306D2F0ED6C01FF92CAE8440D7F3526B8C186D5B96942CB08032886051DA2A9FE77E38BEB18F4FB25F1152EDF9D61347A00A844929976A327BE46FFD3E2EE0B6AB1014294EC5D40CF7071C36B11127FF90720596C1B3065E7DE8010AEA469BB4F4AC5A6EFD20591CEFB7B94B2006D85CA475FEE556F24CC41237C631B75EB594F8342DEB4F976D73AA46563C1AA6D0B605A16152315626BA08807DAA6025CF62B29176F3A85E4BCA483EFFEA7E5939 + +count = 75 +seed = 63742CEFAE9868C3C0B31DDE0F9D378FD5D71BE7CC3F0B6ECD393DB55FB043CF00264852C45D1836CC12B9C872A20251 +mlen = 2508 +msg = 9FFA507328B2129C9F05A22B81A597FD1B8C27D554B36FD3EB150BC5FA0C6ED967EC5BE6F1E52D3BED1508DC3C841360020CFC2CA1B0713076251F2935EFA8500573CB4634C78A1D0F87D994E8E2B0BD265A877023B54D9A33282C12397DC74CAAB07AC2EFD140DF907651BCD1B37CAB2D03F77CC28872291F1CB28FD4BBB5331C2A18E02120BFD2D9EC0C8938A6D43681DC03527FC2BF59703B5160D8E25D08534EB5AA5CC9C10572257D9E4DB29235683BFE1776A2D9EDACFBA1ADAF66587BC451D32C524C7934556F94776F91CDDA96D2E5CAF91A39503D3A742DC5A0EFEF7C1A13666E200C5E3FD7652D200ADEF51FC5136281570B7832E0C6E7552972E43291F202E6F916C916DC3FA48858F3D92B1B7EFD42DE140D43648AEDD7C7379D7A4B71751A3348B6BBA3B0DB71B4C99C41E085E5536A3F0D2BDDAA88069249E21E2D9906191BBB5C8B45353DE72E00270431847AEB4FF6230CEBD1969A0FB68D6E302B78DA39ADF6C0E681117C8432E24820B9EBF38838545E95CF7AEFCF1E9436CF48E87B6C5181CB418132C7BC050B9498720D7D534792E0585F05DA2735B7E68FE35DEC358DA1BF1681F7F62329BEDFEA3D12BFB26AD9403F3AC1DB96D828050F39DCE4017B45C5DAE4D7DE9E9F687A9D7FAD1AE0E7197184142F6818A63D5617BE9D8D82334A12E68F2EEF88A0DA3A915DE63629550D8A64DF591EECDBD1B89EB40AE9F9D65815271693C85F2CA41BF45E4FA16EF8B17D945EC61E757C6C609D8AFAEE32B3CA628842DB255B619F6562E656F6125FB27195EC82FBEB9C14330DAB649CDB74F523F5A98244194581503356B5B7EC51E2B35AE889452D3457EAD713C0715AA7382DCC510B16E771B3A5A91949FAF5E29223C8F1F861BC3B4E77E095BB61ABA00EB29C065D6F9DA9B4413D61B2202547FB6E34671930EBCDCE4C541B3E2DC90073867A47197E08C96F74ED81DE5F10C37C062E8D82364D67EB185CD098CAC1BC3C522E4FABDF2FBEFB66B9EC6E848F732A737FA7B935EF2848C29B1FB94044996EEF006E251BCEB5BE356F286F0FC85E5CBA627B67398CBFD6C0F520C6F896353FE75BA323D8ECD9D3ED2997580E7E1E49EECD91982C5DA650D6B128068B8D3D72C1EC4BF1FBF121BA96E1CF5F247F9FDA7018CB609329B1C95E59E112C393C45EF7138905902227CD21A39CE30397FF017495BC98A968FB497E03DE5843E64923683F2E402DA63CC25AD0BA13B85E3E379B08DEB39542C06A268BBF44990447190A1F8ADF0D3ED9ED9917886210864CAD84E7C4D1282C4D3BFF9DC23E4FA68EF6B0480E76459D1B5E0A7CC0CFC17F59531C4C1CB1D416B7D009AB50173F706289DBB68201C305E39FEFAD87929EF933006598CE0F0242A2C60955AE487115B4C367A7E49488491A6F044FA8B7AFD81F6DA09D29D4BEFE1B3C9EAFDA4F17D22EAAE0B2D1646906D1CEE65614640B53479E23831C56EBE12B92997D5FEA725D78CA75F4509EEBD3DF4F741D6B2770521BE2AE63CA365FE1518CFDCD5088D58CDFB8D3DBA76731F74760A47C9D619A31B7E318E957194AC5ACC6867CF8C9C235043D5C09240F346FEA840AE0BB16094883FC801DA0BEFAC64A021F6F871413249E9C7F5CCA92F4EAB5713B0F2CD6C950F34BA6FB1CFAAD541BD5FAEA45EA5FB37258301A49D7BC4657E3E986D707213C0F836B030C21593F11518EAE3A8A95A2EFC8B9839E79CD8CB0E6DE59D5A43FF8F81FD35392F0C0659B7679542136782D559897FBCC0129C22F43A30CFB27E899A8CA52453F5459A281D0CC21F902403A596C7F69CBF9A64D97B935AB384FBEA5851D831E8420066826D7E11E34047D18CF08283BE8F29A8A79B0F477C27BC41B8EA4AA010ECF8ECE0D37389FF13E235A4526070F96F415D41AF2E053FD4440DDFFD69799456E7335CC6D9F4370008803F7BABB6C58B6996DC5A52649E25463B5267C188E2DC39B3258636ED8689E5C02E00574988B3AF881D30E9EB38AC51C1E00E1C0A411ECF37E314276221D7D8713F7A449E38371854EA26520ADDB58082287FAA1F77FC04095499A3C3A331A38852A287B24040C1CCC054086964FB1EE2B328F3DE21A986507CD20B4DE4898DFD15045324B93FDF85E5392DE0F32C3BADD04784012E97CB9BA19472B0C20EB0A71C89149EBB601ABAA4A853F2C75DD2622235AC30D97B9D7B1216089B9CC8E879660E40EBCD15203404A8DECADC42114715F4D8A6A10511BACC4DDC23520445A95FA3945BC95878BFF18728E64DE8B7767CFBBAA21F3EF2D92F3D7DFDA792BBE4E5B3381077658BFBEF8DB95B64F9F2A44917B38DF6F9391118978544369C882B218E7A7A31AFC3EB9A75A28095C4478DC81F9CFA127BB749CC53898409365170823D65A0B46BCFBA0E47CC0C5F6ECBEE09131F134EDD254F4F58B50C486DADA13195B1A35739420A45BE6558401F64C3B6AC94B73397925C20545621C7ECDC7DA9F71A755F84D27F2C6D8415D37F2BF1966A76845216E41764AB96DC2E14C12DF3684F7683FDAF5EC771DB7050F81A4B3E516C7D5C955201A18F436962476C1284531764A9397E0EDBFFA8C3699929DAEAF968B4524BD98EE62F9A0DB9CBF99FDA80CC6C57A5EE1099B1EB29799A5B5BF5593CDA26CE2C66DEA3D40545465C1D21F5B9373556B9ED0AE30E90B836003CA83F78E29BD8D49550286DC2DE6407860E9A9CC5EAF3E1B1C73FC2D248B81B1CC8F59DABFB5DAADE6F2A0B38E76D9E6D0125955D08DE7F334A56A8F362CC5D883D56BF7BABAE6D9E425376D34A05AB863A0D9ADF7C6FDA574FA8DC60965E021532C25ED4D568412D4143FBF2C4EC2F230D08337A4E546E01F7C1BFF4C97F2F27AF400CAA57BCF398AA5BFFE155B0F29A085D5053DFBEDC3423818DE8FC597EEAB2C1663D8C81C71CB876F73AC854286063A2E8BD8614D06B80F3BF56381179342143F4C89B8CEFE9168B6A96F416DC617B9F544F9DF65CA6F4F7A84A327909666B70CFFE889C86ACA706A0A1365E248D6B341A004A27D4EE344F03CE6E85D3573E272D48210DF7C3178EFB7BFBEF7765D24754673C9EEC14C7513FD8DE6386B0829EF0980B826EC9C77C81D1E3B8CAA65992DB9C2F8DD691C520FA6F233AFAAEDBF287A57A9A66D2330F4636F02EA3148C4BCD2C8B114D48A1027FB3BD5008D732C427ADEDEC9969AEAD451E166954FDC207C1A4EC409CAC60E42383385187AF44F136F91A8461E62EAFE6FCADD1E491162E46CFBBADDDB72E5B54B7C655CB9489E7F4F7E55C93D3AD50CF84E1F47A706FEDF818A5246BC755D6D18EF18702F5A90CE51812A67227C5E5A051133576E9EBC18AFA18C1B05C854D343727B25BB10E3B9A3645D789287858FA43734D66AD831E8646FE604286544238DC99ACFE3C8285230FC784BB73360F72ED34795B1C46EDBE32A346BFA7F534B500C6C9D3EC26AD7ED20D1500E3DEDF141DF3C2F92E981472F0010A48F25429329AE92CBBB918246F5A53212703C75DFA15D014801A830DEB75BAA36 +pk = 835CD070D41DC42AC9590767F5F3C6865B0DE9235AC28069AE32DB78981F4D9D2FF2777E9B50E97139D2CAF8A7605412FAE4BCF0C9D306D938FCB3F9650C020955FAC1D6044D39A8581D6FF22E591D8098748862C2499F24EA4D25B32DBB9C1404 +sk = 835CD070D41DC42AC9590767F5F3C6865B0DE9235AC28069AE32DB78981F4D9D2FF2777E9B50E97139D2CAF8A7605412FAE4BCF0C9D306D938FCB3F9650C020955FAC1D6044D39A8581D6FF22E591D8098748862C2499F24EA4D25B32DBB9C140403F1A4721D6E4C05B3C89B35654F7F9ADD47658B87CBD44A0A0F00000000000000000000000000000000000000000000569BBA1FF16FC9DEC386B54AB823ACBA418040FAE72B9D5BA4FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D01D4A2FBC684F60EBE6EC9FF63ED69E9600112F375F1AE25F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000861E7C50502550B6F2EBC5166ABA5104F244C3E88443422B7FE8B1E891386618CE31B5B62F692B951809B09A22381400735AF989EE960D2A324FAAD70CB4F6EB93E91429244D627FFCEBD136BA4D895CF04506AD102E8580F2EC396F08A4E00055CFE52D250B09369BE667E187768030D28B042CC7EA261BA13E9C61029B09AFB687D924D67473E4613F72DB745FFC00CF6D79F6AE564303F1BA1D81EEE3E9D435C1D39618FE948FCC2A9BBBEF5B83B6224BBB0978AA0E6608157D8261581A00 +smlen = 2732 +sm = 5EF3010BFCA9EDD53F5F2344E54A90EDB59B2A59B78DB5C63ED903D2FDC5895EA7FB3C48C11514C43DAB46D231F30A34A3E6C74603C627182D71D89D96B24C6BB8FD353DB90D69A16203FA22C8FD6E41DF9A33E3F1E1AE4BEDE4F6E03EE41904000089DA8A3B361F2382AE5B9A325FD1A729DC26869CDD674572002A51315DC69620C3CF161D04CA8B3665D2340F8CA3B139B001FB464E451AFB40D294B738DC59F18AB41A3AD5E547C92D7C01BF6F2F95405993794DB5EB96D420DD3B1CA815C76C3C0FEA00FC598ED020541C44999D95C96A613B5E5371DC4EDF5C27000D0D9FFA507328B2129C9F05A22B81A597FD1B8C27D554B36FD3EB150BC5FA0C6ED967EC5BE6F1E52D3BED1508DC3C841360020CFC2CA1B0713076251F2935EFA8500573CB4634C78A1D0F87D994E8E2B0BD265A877023B54D9A33282C12397DC74CAAB07AC2EFD140DF907651BCD1B37CAB2D03F77CC28872291F1CB28FD4BBB5331C2A18E02120BFD2D9EC0C8938A6D43681DC03527FC2BF59703B5160D8E25D08534EB5AA5CC9C10572257D9E4DB29235683BFE1776A2D9EDACFBA1ADAF66587BC451D32C524C7934556F94776F91CDDA96D2E5CAF91A39503D3A742DC5A0EFEF7C1A13666E200C5E3FD7652D200ADEF51FC5136281570B7832E0C6E7552972E43291F202E6F916C916DC3FA48858F3D92B1B7EFD42DE140D43648AEDD7C7379D7A4B71751A3348B6BBA3B0DB71B4C99C41E085E5536A3F0D2BDDAA88069249E21E2D9906191BBB5C8B45353DE72E00270431847AEB4FF6230CEBD1969A0FB68D6E302B78DA39ADF6C0E681117C8432E24820B9EBF38838545E95CF7AEFCF1E9436CF48E87B6C5181CB418132C7BC050B9498720D7D534792E0585F05DA2735B7E68FE35DEC358DA1BF1681F7F62329BEDFEA3D12BFB26AD9403F3AC1DB96D828050F39DCE4017B45C5DAE4D7DE9E9F687A9D7FAD1AE0E7197184142F6818A63D5617BE9D8D82334A12E68F2EEF88A0DA3A915DE63629550D8A64DF591EECDBD1B89EB40AE9F9D65815271693C85F2CA41BF45E4FA16EF8B17D945EC61E757C6C609D8AFAEE32B3CA628842DB255B619F6562E656F6125FB27195EC82FBEB9C14330DAB649CDB74F523F5A98244194581503356B5B7EC51E2B35AE889452D3457EAD713C0715AA7382DCC510B16E771B3A5A91949FAF5E29223C8F1F861BC3B4E77E095BB61ABA00EB29C065D6F9DA9B4413D61B2202547FB6E34671930EBCDCE4C541B3E2DC90073867A47197E08C96F74ED81DE5F10C37C062E8D82364D67EB185CD098CAC1BC3C522E4FABDF2FBEFB66B9EC6E848F732A737FA7B935EF2848C29B1FB94044996EEF006E251BCEB5BE356F286F0FC85E5CBA627B67398CBFD6C0F520C6F896353FE75BA323D8ECD9D3ED2997580E7E1E49EECD91982C5DA650D6B128068B8D3D72C1EC4BF1FBF121BA96E1CF5F247F9FDA7018CB609329B1C95E59E112C393C45EF7138905902227CD21A39CE30397FF017495BC98A968FB497E03DE5843E64923683F2E402DA63CC25AD0BA13B85E3E379B08DEB39542C06A268BBF44990447190A1F8ADF0D3ED9ED9917886210864CAD84E7C4D1282C4D3BFF9DC23E4FA68EF6B0480E76459D1B5E0A7CC0CFC17F59531C4C1CB1D416B7D009AB50173F706289DBB68201C305E39FEFAD87929EF933006598CE0F0242A2C60955AE487115B4C367A7E49488491A6F044FA8B7AFD81F6DA09D29D4BEFE1B3C9EAFDA4F17D22EAAE0B2D1646906D1CEE65614640B53479E23831C56EBE12B92997D5FEA725D78CA75F4509EEBD3DF4F741D6B2770521BE2AE63CA365FE1518CFDCD5088D58CDFB8D3DBA76731F74760A47C9D619A31B7E318E957194AC5ACC6867CF8C9C235043D5C09240F346FEA840AE0BB16094883FC801DA0BEFAC64A021F6F871413249E9C7F5CCA92F4EAB5713B0F2CD6C950F34BA6FB1CFAAD541BD5FAEA45EA5FB37258301A49D7BC4657E3E986D707213C0F836B030C21593F11518EAE3A8A95A2EFC8B9839E79CD8CB0E6DE59D5A43FF8F81FD35392F0C0659B7679542136782D559897FBCC0129C22F43A30CFB27E899A8CA52453F5459A281D0CC21F902403A596C7F69CBF9A64D97B935AB384FBEA5851D831E8420066826D7E11E34047D18CF08283BE8F29A8A79B0F477C27BC41B8EA4AA010ECF8ECE0D37389FF13E235A4526070F96F415D41AF2E053FD4440DDFFD69799456E7335CC6D9F4370008803F7BABB6C58B6996DC5A52649E25463B5267C188E2DC39B3258636ED8689E5C02E00574988B3AF881D30E9EB38AC51C1E00E1C0A411ECF37E314276221D7D8713F7A449E38371854EA26520ADDB58082287FAA1F77FC04095499A3C3A331A38852A287B24040C1CCC054086964FB1EE2B328F3DE21A986507CD20B4DE4898DFD15045324B93FDF85E5392DE0F32C3BADD04784012E97CB9BA19472B0C20EB0A71C89149EBB601ABAA4A853F2C75DD2622235AC30D97B9D7B1216089B9CC8E879660E40EBCD15203404A8DECADC42114715F4D8A6A10511BACC4DDC23520445A95FA3945BC95878BFF18728E64DE8B7767CFBBAA21F3EF2D92F3D7DFDA792BBE4E5B3381077658BFBEF8DB95B64F9F2A44917B38DF6F9391118978544369C882B218E7A7A31AFC3EB9A75A28095C4478DC81F9CFA127BB749CC53898409365170823D65A0B46BCFBA0E47CC0C5F6ECBEE09131F134EDD254F4F58B50C486DADA13195B1A35739420A45BE6558401F64C3B6AC94B73397925C20545621C7ECDC7DA9F71A755F84D27F2C6D8415D37F2BF1966A76845216E41764AB96DC2E14C12DF3684F7683FDAF5EC771DB7050F81A4B3E516C7D5C955201A18F436962476C1284531764A9397E0EDBFFA8C3699929DAEAF968B4524BD98EE62F9A0DB9CBF99FDA80CC6C57A5EE1099B1EB29799A5B5BF5593CDA26CE2C66DEA3D40545465C1D21F5B9373556B9ED0AE30E90B836003CA83F78E29BD8D49550286DC2DE6407860E9A9CC5EAF3E1B1C73FC2D248B81B1CC8F59DABFB5DAADE6F2A0B38E76D9E6D0125955D08DE7F334A56A8F362CC5D883D56BF7BABAE6D9E425376D34A05AB863A0D9ADF7C6FDA574FA8DC60965E021532C25ED4D568412D4143FBF2C4EC2F230D08337A4E546E01F7C1BFF4C97F2F27AF400CAA57BCF398AA5BFFE155B0F29A085D5053DFBEDC3423818DE8FC597EEAB2C1663D8C81C71CB876F73AC854286063A2E8BD8614D06B80F3BF56381179342143F4C89B8CEFE9168B6A96F416DC617B9F544F9DF65CA6F4F7A84A327909666B70CFFE889C86ACA706A0A1365E248D6B341A004A27D4EE344F03CE6E85D3573E272D48210DF7C3178EFB7BFBEF7765D24754673C9EEC14C7513FD8DE6386B0829EF0980B826EC9C77C81D1E3B8CAA65992DB9C2F8DD691C520FA6F233AFAAEDBF287A57A9A66D2330F4636F02EA3148C4BCD2C8B114D48A1027FB3BD5008D732C427ADEDEC9969AEAD451E166954FDC207C1A4EC409CAC60E42383385187AF44F136F91A8461E62EAFE6FCADD1E491162E46CFBBADDDB72E5B54B7C655CB9489E7F4F7E55C93D3AD50CF84E1F47A706FEDF818A5246BC755D6D18EF18702F5A90CE51812A67227C5E5A051133576E9EBC18AFA18C1B05C854D343727B25BB10E3B9A3645D789287858FA43734D66AD831E8646FE604286544238DC99ACFE3C8285230FC784BB73360F72ED34795B1C46EDBE32A346BFA7F534B500C6C9D3EC26AD7ED20D1500E3DEDF141DF3C2F92E981472F0010A48F25429329AE92CBBB918246F5A53212703C75DFA15D014801A830DEB75BAA36 + +count = 76 +seed = B887F07DB5358C3FDC2402947BBC87ABD064B02A859FE8DB37B5BCBB916020443DABA5534A0778FD0B1C05EF3ABE6269 +mlen = 2541 +msg = E7E845902E852B331EF9923416E492C1641236E4E72408D800FD70774BA32B6B4BE04B6E82237A247D26F9A33AFC4745C16CE0554774C68B33CFC6E67AE34E42038FC6C324972642338DAEA75982C71720F1EC9542DF94B38434DA34A2003FABD9DAEA1950B7751DA6C81AFF7D03390F5D63455D417F5D12A510337A16197EBAF921B6A7A9A9A58F9696418ECED6B27CB8EFC8ECBD9B68714F721561AF8553A0D84E30E009A8985D011CB994EEAAF88C76F7F3261B47FC174155C138DB2EADB09A06073B211FC0D27113E8FEA0DA56E181CF532BA8207F5D80D6A30D8BACBA540D49A81A0763A0467DBA7883766ED6358E809261AA3D8B757C839B532F272C5767671A3A8BF3391B14F5E97BF2668A4E98847F1ABFA21E2370870DDF24504F89B3DB71E210C46D66EA7296D65C926E2C955D899AC830CD9D06808A68E9B3722B86E878CF21A5E5D41D7F3CD95D23A6344C259859735AE1A953ADE13CA103692B33AF90ED0345C7B038D938F8F494D90CBD3933B2A80FEDC2BE57960DB23AD018BAC63017A04FCC510553226CD86C74AB90E13C72A1BE12E4D751DC670A98EC4F81E9F8954A693FC7175BA7E50D340FF7F15D568D0ABDED0BB1FC557B1E55971B4C4CE8CC1B4D9E239C73B1133C9E1672DEE36A2D9527F315C21764648643D866B0E2AB6D2DEE61D838BC5DAC183FC511C4501B6E535ECC54F3EDAD6E8EDBF0DE7CB70BEE861B2BFF0D41BB87FFC0EBCAEE9A6DFB98D31D35CFB6DC0442FC285AD0879E7B218B6E66453FE04207FE814C5F72E49406B48FCB1DB145753DC2A2D3E9793594F7EF1A1A6339619E1040CDE605648234A51B2F6774B31C7F9A77C2CE3B98819132BB725D288C65901F7001E05FE5326B6F701C337D41C8CF8748FF9C276ECD398C725C36C11857605F58C0B154DD9F3C1B4649AE677533EB0338B7475254E273B786C2FE7DB4C13468CAF0AA2AECD55DC1A5F868C8EDFFD8BE8DEEC20A9FAA621C4680F3EEF4DFE4A79794FCBC5F8C56EEDCC3E1963569A36525D4F6A5BDBBA5D12966FD8A0FCC70783FD9F61613842F80D000C9281CBDF28C01C6F6AEAC10DF1DDCD0322E00C4E3CC801EF091D9C1B01E84DCE725D57C800D38990251AA1D1206AD93A7DDA40F27726D6A03D973150F7A88703724E314C0953D56DA6EAC442A70C2A08BC66BFA2B0EE11E185131E352D10DD714DDE502097AF0AD155AEEEC2A6B93B149B75DBB898B2B3A7C5FEF2F48D9B12A580F54C4EEF3FF83A4F13F2F194AF551D4800AE86AAD6EFC82CE460D325CBCFEE3400AE939431AB4070D7A7CC005F270896051E32B1051E58941530E250F05AF19FF416E65CE40655FDA31D2E7A6158E07DA08FA61AFD5319B682DE44AFAE146129A8B769C1708A5D3479B6C910B2FF0FC872A4A41AA8BF3EE16F80011D163B599D18501335A2BE10CF117DDA094FE01596C404C14580A7075D04CEEF68BD8F813D7DE6599F478F3DE9CE60B294CB7CE5284A61E078939D08F3D4FD998ADD3B92532AA54E0C31087CF14BF4EC964EBAAD53BD15D04E37948E94917DDE181EE3BB2346335FFB403B000F5669019C5281D88A0E771176E49DD0BA22E719C0B731EC2AAE9C898E74B2967BCBDCE0D7D73057E004BD62269F4E7F3823DCC18CD6C551104B9B896B0AD138DDE7C3D761138641BD3EFF3DF1552659FD97BDADFC59A05CBC622A4492A1B22CFF72AC197D61A4C5A949AA9AC09D4C1112F4C1B1CAE353C70278A21663E11F27E9EC66ECD4AD56F2179A3FCEC37AC3A3F4B33C06BBBD4C8CE8E74825BBDA3E58A2E2D928C2C6E6D886274BC0E2175AB03D8721C664FBD6455DB2960E3AEF0BB25AFD3CB0BAFB71A2BD18A89ADAEE00AADBC7E4AE70ED4B534AEEAB88559194755F9656B43BC83E3952000D9E2295BF3391904218A015C786DE0144868EE4AED203B261FE743B7168788A0680F7484792A3F64782B2B1ED9217B09AE9845DD71ED363F18E8AAECD51A4F5913AAB33FEA3FC5F1E37E0CD6333D2A8347CF45EB7C4AD967FE6FCFFF3565743435EF09A646E75C7E968ECF4202A9B2C23AA8118A1683219B1155C2CABC95C696704F5B270C6D213332649363AE13EC811E9A1090D1603EFF745E2FA83379DFC6DA5EFECED556E46A8A5FF1F2A5C0D911B95C20EC2465AD0C96AE7E16FC36143762BBC0734CF4D6134DCB0D739F7822470E0ABF66A0AB15CE0D6096D3ABBA2CA4C81C1C68BDC252A8A4BA609B7C05CCD913EA56126F418FC0B06DE8F76EF651F8085604C16E5910F3B8651AB78296B56B78326E41AC15774E442017FE5B291E5227EF5A4B78CCFA96D6921C8542A8A984BC87E2678903869C52C2568FEE4E23EF3CC466CE270614E6472244A4294B31F9438F7E43437FC9C9C5F3EFB0F4F0AF2110A613661DC24A1C7F7A7F8CD14A943821F16F94BD874F1A32E305DB4776CDF6633446724CCBB2488B1B06F0177819D53885127E6EB717C0D6718366A8B8A089AA6AB17CB2581A75EC748123B7D0383F3900EFCFF77D2E022E90AA41491117758221A0B149C8EBC23CC01C17B9FD39118DAD413A391CFA0A5C614208060A61646C7CF1DFAD4ABC3A9CC5CD566DB2AC8FAF392C9D8E7DA0F84B941D792A8493FBEBAD30D0DAA0D683DCC1583F0C9019622EB6C92FBC475BABC8B626319BE2264ED873AC063F84B7F83688AC99D732A1E3FC12281BFB1E1E63D48BFBFCA619BF4B95F899C50AD0F5FE4673347DF2BBF2CA21BEF49C7F8440D95A83299960F1E42B457ADDCCCE236946DE80FD4862BAF36387E041DEAAC3C9751AE345512BB1F423A3B4CA8D3A5E3796D289641D3424FF22670A46552EC68D7D095E8636441D777DBE2E9DBF6B5FEDE5318516C3886B943F6ADF17D8B7CD40B20A48233C9FD981145B45A5CB8F6A88EAA36C270E93E1D876D7781BB92A1FD99727D8E0AE34C73398AB8781BB342F5AACF4081459EA5EC20C30CBB6122344C457F92B20448F78E1A2A291202003781EBDA1747061C6CE1F8BF882FEA4FB50BFE638685CD638EEC15BC24252567025FC5C16ED1F5D98DD90C76E720EF7B4E25A20D262E339C5E5BB5A9CF051BF5FD1F63E93452A179277B57956821CDD901F1C01E634AE18485708A6ED8F592AE2EF3A9D54C9734FFBADC6F0B86D0398AECE9374F9ACAFEF38D4B97BE9B932B9852F97AEEC435311A67AE344AC1985738C72F52B3D8B71F64A916240477FDDC5FAF02F8224EB35D310FEA03FD2C5933047355A438676D92EADF70DF662D97C2F5E00CB293053699D51D302B78145C77AB03F34EAF170EDA5215436FAF0238A4B0D41D29F36052A5278C7D8AF9A6FFC6E2B6FFC4C5D524F7640A7170957F3DE2451AC75589CE328B61EA7179FD990DA1698F5C73BB8639A4DA2AD67D364DB04771CA118C4055C25F1120A0643158C07CD22B375D5C1DFA26FFCDA44921F41D4A504B2279DFF03421CAD19960F87C6B6DD8C29981CB66C9731F931E43B0D97C6AC9862E2CF711DF0DED8E4D06F3957FFF9085A95D9FCC95610FDE22856B229A3121D8B81EE83DEE4A6A9FA3FE8C75351574CB000BF7F3746CA1CC5414AEB23A2 +pk = 15FAB55E3121101F1181793C2FC138817291F5147C8809678737FD8C01748F5C7600CE31EB8F53620B1DAB26ECDBB83C62699E95383D56B2B29CEC543DAABF784AAD998AB8DAA84AF083E868DA06A867E12A2FD844FF37B6661B98AF1E177A1C04 +sk = 15FAB55E3121101F1181793C2FC138817291F5147C8809678737FD8C01748F5C7600CE31EB8F53620B1DAB26ECDBB83C62699E95383D56B2B29CEC543DAABF784AAD998AB8DAA84AF083E868DA06A867E12A2FD844FF37B6661B98AF1E177A1C04118142897BABF4FA9880D36B9F4D5C22CCF73C390A9046510A1500000000000000000000000000000000000000000000122F5D2D3DBAA0E65CEAF32AE70D58D577DE12C4CD1BFF0388EAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE79178E83785C758D91C8CCDC477639C60ABDA094A65F07835E7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005B6688545F9822DC2B35917338CAF3B47E172D888E21F1F1E8104C8A3165FA6D8132FAF0F1AF6A731DA605BB9AD14100E99938CF640384B2B4F683F98D723ACF639F221CC8D79D80207058E894B19507AF59F8876BCACD89CDADEA53F8644F00A7E1684A28AB7C08A4F90AC32C75FCD0C3304D07AF7776836BCB5C9453C350F9D2BFA5E599051BFAA2243E043BF95C0080491677287770BCD3AC104A353F3C34E26EDD1B4C65DD82291605474404C3EB03E844B5BDE6AFD2EAD6C87D6CF4E200 +smlen = 2765 +sm = 1C233766E33D08A9FBA88A987A31337A887334AC0EF0ED9471F610D337DE5717AC914F15428002C74CD654E96F85571701B6194BF53EB45347ABA26C2C94552B564EE5AB65D46A7FCE11A7A5370AEE6D6D862C2547F45D670F448F771BF4B10F000302FFF6D1854E06F652317690541C2D44D9FFB3159DFFD607011587E5C0248B7CBABB1277638940A49F140B940FE4D17A65019C590D611A5B1F099E8076FAF3F5045330A2F8B84B09FE66018AFCE1C1C6E41C9D2602DD18F110CD81A547ADFA1286C3EC006554C8376E5CB39285CEDBAEB360B5F2373A62FA18BEDB001502E7E845902E852B331EF9923416E492C1641236E4E72408D800FD70774BA32B6B4BE04B6E82237A247D26F9A33AFC4745C16CE0554774C68B33CFC6E67AE34E42038FC6C324972642338DAEA75982C71720F1EC9542DF94B38434DA34A2003FABD9DAEA1950B7751DA6C81AFF7D03390F5D63455D417F5D12A510337A16197EBAF921B6A7A9A9A58F9696418ECED6B27CB8EFC8ECBD9B68714F721561AF8553A0D84E30E009A8985D011CB994EEAAF88C76F7F3261B47FC174155C138DB2EADB09A06073B211FC0D27113E8FEA0DA56E181CF532BA8207F5D80D6A30D8BACBA540D49A81A0763A0467DBA7883766ED6358E809261AA3D8B757C839B532F272C5767671A3A8BF3391B14F5E97BF2668A4E98847F1ABFA21E2370870DDF24504F89B3DB71E210C46D66EA7296D65C926E2C955D899AC830CD9D06808A68E9B3722B86E878CF21A5E5D41D7F3CD95D23A6344C259859735AE1A953ADE13CA103692B33AF90ED0345C7B038D938F8F494D90CBD3933B2A80FEDC2BE57960DB23AD018BAC63017A04FCC510553226CD86C74AB90E13C72A1BE12E4D751DC670A98EC4F81E9F8954A693FC7175BA7E50D340FF7F15D568D0ABDED0BB1FC557B1E55971B4C4CE8CC1B4D9E239C73B1133C9E1672DEE36A2D9527F315C21764648643D866B0E2AB6D2DEE61D838BC5DAC183FC511C4501B6E535ECC54F3EDAD6E8EDBF0DE7CB70BEE861B2BFF0D41BB87FFC0EBCAEE9A6DFB98D31D35CFB6DC0442FC285AD0879E7B218B6E66453FE04207FE814C5F72E49406B48FCB1DB145753DC2A2D3E9793594F7EF1A1A6339619E1040CDE605648234A51B2F6774B31C7F9A77C2CE3B98819132BB725D288C65901F7001E05FE5326B6F701C337D41C8CF8748FF9C276ECD398C725C36C11857605F58C0B154DD9F3C1B4649AE677533EB0338B7475254E273B786C2FE7DB4C13468CAF0AA2AECD55DC1A5F868C8EDFFD8BE8DEEC20A9FAA621C4680F3EEF4DFE4A79794FCBC5F8C56EEDCC3E1963569A36525D4F6A5BDBBA5D12966FD8A0FCC70783FD9F61613842F80D000C9281CBDF28C01C6F6AEAC10DF1DDCD0322E00C4E3CC801EF091D9C1B01E84DCE725D57C800D38990251AA1D1206AD93A7DDA40F27726D6A03D973150F7A88703724E314C0953D56DA6EAC442A70C2A08BC66BFA2B0EE11E185131E352D10DD714DDE502097AF0AD155AEEEC2A6B93B149B75DBB898B2B3A7C5FEF2F48D9B12A580F54C4EEF3FF83A4F13F2F194AF551D4800AE86AAD6EFC82CE460D325CBCFEE3400AE939431AB4070D7A7CC005F270896051E32B1051E58941530E250F05AF19FF416E65CE40655FDA31D2E7A6158E07DA08FA61AFD5319B682DE44AFAE146129A8B769C1708A5D3479B6C910B2FF0FC872A4A41AA8BF3EE16F80011D163B599D18501335A2BE10CF117DDA094FE01596C404C14580A7075D04CEEF68BD8F813D7DE6599F478F3DE9CE60B294CB7CE5284A61E078939D08F3D4FD998ADD3B92532AA54E0C31087CF14BF4EC964EBAAD53BD15D04E37948E94917DDE181EE3BB2346335FFB403B000F5669019C5281D88A0E771176E49DD0BA22E719C0B731EC2AAE9C898E74B2967BCBDCE0D7D73057E004BD62269F4E7F3823DCC18CD6C551104B9B896B0AD138DDE7C3D761138641BD3EFF3DF1552659FD97BDADFC59A05CBC622A4492A1B22CFF72AC197D61A4C5A949AA9AC09D4C1112F4C1B1CAE353C70278A21663E11F27E9EC66ECD4AD56F2179A3FCEC37AC3A3F4B33C06BBBD4C8CE8E74825BBDA3E58A2E2D928C2C6E6D886274BC0E2175AB03D8721C664FBD6455DB2960E3AEF0BB25AFD3CB0BAFB71A2BD18A89ADAEE00AADBC7E4AE70ED4B534AEEAB88559194755F9656B43BC83E3952000D9E2295BF3391904218A015C786DE0144868EE4AED203B261FE743B7168788A0680F7484792A3F64782B2B1ED9217B09AE9845DD71ED363F18E8AAECD51A4F5913AAB33FEA3FC5F1E37E0CD6333D2A8347CF45EB7C4AD967FE6FCFFF3565743435EF09A646E75C7E968ECF4202A9B2C23AA8118A1683219B1155C2CABC95C696704F5B270C6D213332649363AE13EC811E9A1090D1603EFF745E2FA83379DFC6DA5EFECED556E46A8A5FF1F2A5C0D911B95C20EC2465AD0C96AE7E16FC36143762BBC0734CF4D6134DCB0D739F7822470E0ABF66A0AB15CE0D6096D3ABBA2CA4C81C1C68BDC252A8A4BA609B7C05CCD913EA56126F418FC0B06DE8F76EF651F8085604C16E5910F3B8651AB78296B56B78326E41AC15774E442017FE5B291E5227EF5A4B78CCFA96D6921C8542A8A984BC87E2678903869C52C2568FEE4E23EF3CC466CE270614E6472244A4294B31F9438F7E43437FC9C9C5F3EFB0F4F0AF2110A613661DC24A1C7F7A7F8CD14A943821F16F94BD874F1A32E305DB4776CDF6633446724CCBB2488B1B06F0177819D53885127E6EB717C0D6718366A8B8A089AA6AB17CB2581A75EC748123B7D0383F3900EFCFF77D2E022E90AA41491117758221A0B149C8EBC23CC01C17B9FD39118DAD413A391CFA0A5C614208060A61646C7CF1DFAD4ABC3A9CC5CD566DB2AC8FAF392C9D8E7DA0F84B941D792A8493FBEBAD30D0DAA0D683DCC1583F0C9019622EB6C92FBC475BABC8B626319BE2264ED873AC063F84B7F83688AC99D732A1E3FC12281BFB1E1E63D48BFBFCA619BF4B95F899C50AD0F5FE4673347DF2BBF2CA21BEF49C7F8440D95A83299960F1E42B457ADDCCCE236946DE80FD4862BAF36387E041DEAAC3C9751AE345512BB1F423A3B4CA8D3A5E3796D289641D3424FF22670A46552EC68D7D095E8636441D777DBE2E9DBF6B5FEDE5318516C3886B943F6ADF17D8B7CD40B20A48233C9FD981145B45A5CB8F6A88EAA36C270E93E1D876D7781BB92A1FD99727D8E0AE34C73398AB8781BB342F5AACF4081459EA5EC20C30CBB6122344C457F92B20448F78E1A2A291202003781EBDA1747061C6CE1F8BF882FEA4FB50BFE638685CD638EEC15BC24252567025FC5C16ED1F5D98DD90C76E720EF7B4E25A20D262E339C5E5BB5A9CF051BF5FD1F63E93452A179277B57956821CDD901F1C01E634AE18485708A6ED8F592AE2EF3A9D54C9734FFBADC6F0B86D0398AECE9374F9ACAFEF38D4B97BE9B932B9852F97AEEC435311A67AE344AC1985738C72F52B3D8B71F64A916240477FDDC5FAF02F8224EB35D310FEA03FD2C5933047355A438676D92EADF70DF662D97C2F5E00CB293053699D51D302B78145C77AB03F34EAF170EDA5215436FAF0238A4B0D41D29F36052A5278C7D8AF9A6FFC6E2B6FFC4C5D524F7640A7170957F3DE2451AC75589CE328B61EA7179FD990DA1698F5C73BB8639A4DA2AD67D364DB04771CA118C4055C25F1120A0643158C07CD22B375D5C1DFA26FFCDA44921F41D4A504B2279DFF03421CAD19960F87C6B6DD8C29981CB66C9731F931E43B0D97C6AC9862E2CF711DF0DED8E4D06F3957FFF9085A95D9FCC95610FDE22856B229A3121D8B81EE83DEE4A6A9FA3FE8C75351574CB000BF7F3746CA1CC5414AEB23A2 + +count = 77 +seed = D08A139CC7147ECAF4B1D1E434EB2EFA2B2607B0033D8BA989133E496DC9F3654944C7AF91CBB79866443E8C4E8217ED +mlen = 2574 +msg = 34FCF4626248B979A7A8D306CB9ED69C4CCB5CC3729D2692E0BA679D5C2FEAAC54A4E06D4EFCEDF78E19357DAE263E1B5D107FB09618A9C34F54F19A738A66B95E6F88E20E01F879F53E8F4C371B571E1438FF70E0A8CD00D608976E24501B2DDD323EFE6C1302A318CAD821C6FFE641672BB80AC62286C69FCFFD93422911C46D43DC9A1F00A73E19EBE6CC09A9801F2A1DA708F0F1F98E7F1A18529010823230279F487911CEF1E784A229D9E311BCE5E2D368E6D613F791DDD617D0F37F604B786CA2BAB754E8BC4BD3DA37E66A54DF1D3B268A5A80379A30A52B1532E8CFABE24168D83CBFD61E2346F901C361F771E0BE3E03DAE8CC30614C10FB8DCCDCAA5B9A25DDD8D61E61F60F22308E12ADC137D3D8C53CF7B31984CB813758BAA19AC178F2F0CD2155ED674A7509A3CFA7FF66D2D9B1E60BE50FE7FB79591C500F66BB1D35EDB80263F4B696A3DDA0B9B2911D01E76E9070D99DB93D1D0C3874CFFA776BA24424A6B453526F7C44EAFABE13C0750F9DF33E82105930139E70B5CF1B09DC3913D6BF4A4859F67FE814FF038F0FDAB93522A35E7F81002A395989D68B8B7E4235A09837CC6402A5338DA08E7C73DC63C43BAC42054C694F4931B80140D6B104EDEC995CEBCC5629F85D09DED8257626F9FA4079ADEF81D044C18BF2277DAAA41931B62A6028F89F95F06D8A8FDEB95EB2EB1E90C0D8523E0B476B158E3040F212390AB2503021E8D6FC0733B963CC6188FB2532829925B59C8255D89F10B657053D0FA1D8E76C84826A4609284503D3A101EBFE7AF93EDC423EF5303CD946C8B570511E38EB04BEE0060E678D03E4134F84F279A570AAD0332417FB2099E3F1F279CE7D6DDB080C5D83064D107BB560B21183AE165CBB54CC75313DE72D40D1CF5173455AA55C5C356D7C40A2A7023DD95D3F89B515D7598F800DCB7BF68B707978ECAF55B794A17559BD1E913F4472B1830783BBBAB5F23A760C78C46157FD1B429C445494CDF92FEC8BF9FC217D3CE2697BB6C671BAA793CD0C1C84F579F0DAEC400BEADA799A9F417FE4744145F21C6F8559AFA7A514A0E951F03E5E68C17A8E5816F3FCF41774D26BE2EDC11FC3A42CFCF00F817C3D0FBF474FD7F30C9C3C6BE7F74FCC79FA6AB07CAB037EEA7D83866673A74C087B5F7542804071D53CE348D2E836749E35AF0FB884D5D53ABB195AE1EE6E9AE35DC91BE359BCD510A7801FC243C07DEE92373918AA4F8A89EDA3895A52456F7244D1FF007CC7B1A52CBEF4C1ADE1C2C0AC189AB24B3F260475E1D08E7C5BFA30A1CDD71DE5ACE80D5FBD1D0F17198B79C8EEA0365D139F2AE73CAB6FBC9A79786896DE0CE7FC747D68FA4ABAB662A09E0E409F7E652153352BB92F5DA1836B0E92B0B644C821B2DD2BD0AF193AC0F8CF5B8D88432F0248DAB09B46FBEF2EF1899B5981E9B33DE4E9927AE50890FEFC35F681E075D8B0169A2E16FEDA6392AB9858DB87ED18ACBA25575AFD1FEDA9FB3FD01ECAC13C245DF6972F65087513F505187C4E8EA54B6433FA092B6CD3AF13F4718693904435C55D273060FBB5FDA76074691269493E86F287922D074E54EFF04209B2FDD3417D8436D1395E638D57DB75D68F4F819141B6DAF4D13A9A18629CF5F84B0CD02E7A397715DDE5476BDC467218D11AACD6CE399D9D54645BB27CA43076B7E4E57FB4F7C4F4B8D0AA949719D731C3A927FDEF1533D773CF1BB562D5EA43817A5ACEFE9EB7E51029DEA143E8A1D5F76F9BFD74A26C6D38F54194319A1AAABC4DAF45EFBAE770B9E9D834C09FE45C15D4BBC0251D3DF2F2F23387DCABCE6CA7A59625E18FD997770D164C338D0692AF97C749FB746C0D3944CA4B2DA6D3AD7B8C3AA922FC029CF9AC5580CFEAFF50CB2E9044211EA522BB5769BEB7A7BBA0743F345FEEA9AA9DA6EC5F0579CF7A5AA4DEDC832FE3F65185A31FD49C0D259E3B7F8FA96E110D130F588CDEC30D0FD4860CA6673C46D961FC68A4020FB03AE24B1AE12967EC1ED19ABEC0808A7EF89521152033F70F406A7005819D28DFC556C79DE18584088F40BE40A555EAEFA78E3FA3D9360A7CEBD963555CF208DC408A07CCC1369F98BD840F5C940721064E6C7CB241ED0697AF0FACF36F05632A504870ABF90134A01AF00D340F7A5D548A8078C2049600EE454D15EB8CE58C26B3C8185CF9DFCDCA7D4B6DCDEB82230F993D51E701D8387B06BD45B4B61DC9DA6D3B4356F50C1D4AD2B467D36AC092442FA90D1DEB014475AC7CE90C974063459DC951DECFA30D2DE4C70FBA39A8B6931217D0924FFA783C8C3DAF048908E4AAEAAA3B7C98846278AFDD1753252F39CAED7D334D8575CE3ECFB2EDEC31AFEB2BBE67FA929A267376293C2B2F295CD8DBD66106E1D9518BE1798949F3315E0454D018C2B706FE836FB37AB908D9D698AF495BD285A74E4CFC7612D42121F43FDAA7DCF44DA82897B820514D66B92983A3EC819D2CE208D688B6F0AACADC0CDD619D815CD231AD8DD9B6DBAD9C47E16FAC098D0F4279AB52055D2FF765AF6E3618C4509FAE6AB00FA23980EFB19A26E0A6EA4C9A7DC699121388748449C429B28AD2779F5642F05FF58B68BA3E289F90EB27CE06392616C080D659338CAF274D46A90D58F2BFED25E8D4A8C62030A5E89F6B1A5F6112A38661E2F2B5A37BCBF050812DCDCE9C0A939ADF929C921E7DA0C30815DA318EB2F350F286441CC92060C970077623EEE68B8C6FEC9FFFE780A6FC85FD7AF90172951337AF57339E98049132A4CF58874A7418FB7ABA0628B6192BB2C43102EE6B1D7E824725D9C75D34A8B69DF4A6BCB1F96B57767046C99EC6352751E2FE1075BB4092672379B3518DDC884FEAD5BD062B0336EA88BCBE0D22E066566347FEB617A322BEC561E9AA9D2177EEF0DFEEAF6231AD56D0CD9E300709C9317B3D334D8D2AC97F96CF2F45B8582C4128D95DA8CA207AE34D3DAACCDB128C11694EEE6D3E8E6AB767B6886B1F7235D85A4D9C7C831C5DB8AD8323F63927A638E19497CFB308285A03CA2C1FE2AC4D919AD11511ECC6F28E7D0E0A614FE21B57BCCDF83535C7E2C40840BA0014247190C580378454751EB3F2361D7193E160B9516F7EE1D683B336B873C8BA22E97480A61F002A73844C78309C0A3B31BE30A192A62BDCC3D33A7A5BA1F6AE0404A8558740CAE46E5FD15971B41C0BC39665A9B92EEB3328C328B073ED5B3720D37A1C097AF8A6FDDC3B2B067680E6CAA760368B0E1C052E804E9F80F26B52596202FF2E0AF7215999EAF7D3EE3E8916744E40AA1154322DD068AA15960DC38671A4F5889FBE709CE1DECCFA80B9D33AD2FD963FE0581A2ED7718A27CA62819D05BAA3212EC7CC1C5472BCF579AD52D5E1B2BEE637D9827851C419A4CB91DB57B2A6CB4433C1BD209648F1FE170ABB964B272BCF0A263CE28CFA3A9D1449CFFDF643E37AD97182F0031CB334A1EEAD23D63A5C2D0A675D0ED000F37FD2153E1AFC4AC01692701014927601203ED2B8A477CCEC45C1F43190E4FBAF2295E32A9383FC7915AA76950A301ABE47BFFAA9C294292126934CCFC173115A6CA96F3945FD5F924A5017125AD5AAC705106EB852EF3190A24420196ECD37F7C67B57162CBEB97DFA +pk = 1DA727D91FDFB84F20B871F4D9598DFAF7603C574C81FC06F1C7B88DE847CA1DDDD9626CF66C55ADA5A005377AFFEA1E7D7E2DA73145F475412E327DDF14A7DA83279E0384AB175DE5C1E9543534F50B1F8DCE8C0E43781185E2BE73BC9ABD280A +sk = 1DA727D91FDFB84F20B871F4D9598DFAF7603C574C81FC06F1C7B88DE847CA1DDDD9626CF66C55ADA5A005377AFFEA1E7D7E2DA73145F475412E327DDF14A7DA83279E0384AB175DE5C1E9543534F50B1F8DCE8C0E43781185E2BE73BC9ABD280AF70CEEBF2444424F9B3AC7071C65D191C9A6B990D70C413715090000000000000000000000000000000000000000000048F830E64FB55DCCA71ADC8CF99E321825D04936A8C396E1F3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79DF1732730D08F07A880001A9EF0ACA2A0B5A1F6221506420F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000079A6C2A166CBE4ADCDFADC3CFBF9AEBCB368A37C533472E87EE5FD4D25E50F1DAC34D79B204FC5A3CA7040300EF34F0064958ADDD4FFBC4AD33C6D34AF5D6AECBCBC246AFA58E0B8D4B6B046FA16F6EB56B1C06841C4B92CE2FCE3A48976E3005BCCB747A908E13454015B23D3721F9CB408DC8E9AE05C57FAC55D5A6259ABE6DFD4E5724F06EA646D22F292D16B8D005B170E4BC6C5457ECB01FA5EE9ACB66B43D12BC15EE05DD91D67AB17C33BB640AB709EFCA9CF52F596D7FD3C9D0CD300 +smlen = 2798 +sm = 1CBF4DCF893B8D703AF5144A30CDA3931BFC456ED64C1179A398EB8DA3E1C3D03E4546C0AF6724B4E1597D8CE7357D33DFEF4D1AE2B32D3497EB8CD7B5BCDFA036686BE90B134133EBD731A0FD4961F472448FF48EC1273C315E6EFE6F832822010416323EEE9B2D117510738C6E859B65C63E41915C616A2432007BB6F1AE0EA37B065FFA4E466859DAE3E484220E06091D820030A96BD00F80C64A2BF8C8A8F720DCC72D964C0466B655F30090828844FFC346BFAB80FD8F2F7A99880DD8243A7B85CFD400D3356A9F8F168D00F53A46300D45E71F6C97C6B6AF0DEA00080234FCF4626248B979A7A8D306CB9ED69C4CCB5CC3729D2692E0BA679D5C2FEAAC54A4E06D4EFCEDF78E19357DAE263E1B5D107FB09618A9C34F54F19A738A66B95E6F88E20E01F879F53E8F4C371B571E1438FF70E0A8CD00D608976E24501B2DDD323EFE6C1302A318CAD821C6FFE641672BB80AC62286C69FCFFD93422911C46D43DC9A1F00A73E19EBE6CC09A9801F2A1DA708F0F1F98E7F1A18529010823230279F487911CEF1E784A229D9E311BCE5E2D368E6D613F791DDD617D0F37F604B786CA2BAB754E8BC4BD3DA37E66A54DF1D3B268A5A80379A30A52B1532E8CFABE24168D83CBFD61E2346F901C361F771E0BE3E03DAE8CC30614C10FB8DCCDCAA5B9A25DDD8D61E61F60F22308E12ADC137D3D8C53CF7B31984CB813758BAA19AC178F2F0CD2155ED674A7509A3CFA7FF66D2D9B1E60BE50FE7FB79591C500F66BB1D35EDB80263F4B696A3DDA0B9B2911D01E76E9070D99DB93D1D0C3874CFFA776BA24424A6B453526F7C44EAFABE13C0750F9DF33E82105930139E70B5CF1B09DC3913D6BF4A4859F67FE814FF038F0FDAB93522A35E7F81002A395989D68B8B7E4235A09837CC6402A5338DA08E7C73DC63C43BAC42054C694F4931B80140D6B104EDEC995CEBCC5629F85D09DED8257626F9FA4079ADEF81D044C18BF2277DAAA41931B62A6028F89F95F06D8A8FDEB95EB2EB1E90C0D8523E0B476B158E3040F212390AB2503021E8D6FC0733B963CC6188FB2532829925B59C8255D89F10B657053D0FA1D8E76C84826A4609284503D3A101EBFE7AF93EDC423EF5303CD946C8B570511E38EB04BEE0060E678D03E4134F84F279A570AAD0332417FB2099E3F1F279CE7D6DDB080C5D83064D107BB560B21183AE165CBB54CC75313DE72D40D1CF5173455AA55C5C356D7C40A2A7023DD95D3F89B515D7598F800DCB7BF68B707978ECAF55B794A17559BD1E913F4472B1830783BBBAB5F23A760C78C46157FD1B429C445494CDF92FEC8BF9FC217D3CE2697BB6C671BAA793CD0C1C84F579F0DAEC400BEADA799A9F417FE4744145F21C6F8559AFA7A514A0E951F03E5E68C17A8E5816F3FCF41774D26BE2EDC11FC3A42CFCF00F817C3D0FBF474FD7F30C9C3C6BE7F74FCC79FA6AB07CAB037EEA7D83866673A74C087B5F7542804071D53CE348D2E836749E35AF0FB884D5D53ABB195AE1EE6E9AE35DC91BE359BCD510A7801FC243C07DEE92373918AA4F8A89EDA3895A52456F7244D1FF007CC7B1A52CBEF4C1ADE1C2C0AC189AB24B3F260475E1D08E7C5BFA30A1CDD71DE5ACE80D5FBD1D0F17198B79C8EEA0365D139F2AE73CAB6FBC9A79786896DE0CE7FC747D68FA4ABAB662A09E0E409F7E652153352BB92F5DA1836B0E92B0B644C821B2DD2BD0AF193AC0F8CF5B8D88432F0248DAB09B46FBEF2EF1899B5981E9B33DE4E9927AE50890FEFC35F681E075D8B0169A2E16FEDA6392AB9858DB87ED18ACBA25575AFD1FEDA9FB3FD01ECAC13C245DF6972F65087513F505187C4E8EA54B6433FA092B6CD3AF13F4718693904435C55D273060FBB5FDA76074691269493E86F287922D074E54EFF04209B2FDD3417D8436D1395E638D57DB75D68F4F819141B6DAF4D13A9A18629CF5F84B0CD02E7A397715DDE5476BDC467218D11AACD6CE399D9D54645BB27CA43076B7E4E57FB4F7C4F4B8D0AA949719D731C3A927FDEF1533D773CF1BB562D5EA43817A5ACEFE9EB7E51029DEA143E8A1D5F76F9BFD74A26C6D38F54194319A1AAABC4DAF45EFBAE770B9E9D834C09FE45C15D4BBC0251D3DF2F2F23387DCABCE6CA7A59625E18FD997770D164C338D0692AF97C749FB746C0D3944CA4B2DA6D3AD7B8C3AA922FC029CF9AC5580CFEAFF50CB2E9044211EA522BB5769BEB7A7BBA0743F345FEEA9AA9DA6EC5F0579CF7A5AA4DEDC832FE3F65185A31FD49C0D259E3B7F8FA96E110D130F588CDEC30D0FD4860CA6673C46D961FC68A4020FB03AE24B1AE12967EC1ED19ABEC0808A7EF89521152033F70F406A7005819D28DFC556C79DE18584088F40BE40A555EAEFA78E3FA3D9360A7CEBD963555CF208DC408A07CCC1369F98BD840F5C940721064E6C7CB241ED0697AF0FACF36F05632A504870ABF90134A01AF00D340F7A5D548A8078C2049600EE454D15EB8CE58C26B3C8185CF9DFCDCA7D4B6DCDEB82230F993D51E701D8387B06BD45B4B61DC9DA6D3B4356F50C1D4AD2B467D36AC092442FA90D1DEB014475AC7CE90C974063459DC951DECFA30D2DE4C70FBA39A8B6931217D0924FFA783C8C3DAF048908E4AAEAAA3B7C98846278AFDD1753252F39CAED7D334D8575CE3ECFB2EDEC31AFEB2BBE67FA929A267376293C2B2F295CD8DBD66106E1D9518BE1798949F3315E0454D018C2B706FE836FB37AB908D9D698AF495BD285A74E4CFC7612D42121F43FDAA7DCF44DA82897B820514D66B92983A3EC819D2CE208D688B6F0AACADC0CDD619D815CD231AD8DD9B6DBAD9C47E16FAC098D0F4279AB52055D2FF765AF6E3618C4509FAE6AB00FA23980EFB19A26E0A6EA4C9A7DC699121388748449C429B28AD2779F5642F05FF58B68BA3E289F90EB27CE06392616C080D659338CAF274D46A90D58F2BFED25E8D4A8C62030A5E89F6B1A5F6112A38661E2F2B5A37BCBF050812DCDCE9C0A939ADF929C921E7DA0C30815DA318EB2F350F286441CC92060C970077623EEE68B8C6FEC9FFFE780A6FC85FD7AF90172951337AF57339E98049132A4CF58874A7418FB7ABA0628B6192BB2C43102EE6B1D7E824725D9C75D34A8B69DF4A6BCB1F96B57767046C99EC6352751E2FE1075BB4092672379B3518DDC884FEAD5BD062B0336EA88BCBE0D22E066566347FEB617A322BEC561E9AA9D2177EEF0DFEEAF6231AD56D0CD9E300709C9317B3D334D8D2AC97F96CF2F45B8582C4128D95DA8CA207AE34D3DAACCDB128C11694EEE6D3E8E6AB767B6886B1F7235D85A4D9C7C831C5DB8AD8323F63927A638E19497CFB308285A03CA2C1FE2AC4D919AD11511ECC6F28E7D0E0A614FE21B57BCCDF83535C7E2C40840BA0014247190C580378454751EB3F2361D7193E160B9516F7EE1D683B336B873C8BA22E97480A61F002A73844C78309C0A3B31BE30A192A62BDCC3D33A7A5BA1F6AE0404A8558740CAE46E5FD15971B41C0BC39665A9B92EEB3328C328B073ED5B3720D37A1C097AF8A6FDDC3B2B067680E6CAA760368B0E1C052E804E9F80F26B52596202FF2E0AF7215999EAF7D3EE3E8916744E40AA1154322DD068AA15960DC38671A4F5889FBE709CE1DECCFA80B9D33AD2FD963FE0581A2ED7718A27CA62819D05BAA3212EC7CC1C5472BCF579AD52D5E1B2BEE637D9827851C419A4CB91DB57B2A6CB4433C1BD209648F1FE170ABB964B272BCF0A263CE28CFA3A9D1449CFFDF643E37AD97182F0031CB334A1EEAD23D63A5C2D0A675D0ED000F37FD2153E1AFC4AC01692701014927601203ED2B8A477CCEC45C1F43190E4FBAF2295E32A9383FC7915AA76950A301ABE47BFFAA9C294292126934CCFC173115A6CA96F3945FD5F924A5017125AD5AAC705106EB852EF3190A24420196ECD37F7C67B57162CBEB97DFA + +count = 78 +seed = A315BCF0E6835892ADFA07C034BFCD39F80B62925A95490B20170BD29378E11559C7F1CD296377FF1E01284EC727FFCD +mlen = 2607 +msg = 96AD5FAEF409B8A4C21ACB1ACB596BADF387D26656BE3EB17987AF59737E324B7BF8412A306B0E706AEF73D79AF753D9B0064BA9CED8DCEA966543FE748E2611709ECD1CE6E4DD8FA812D485E91809A225936675369574B0D104A258E3353EE0E021683615CA5C7C531FB29A5025CC7F7323860443DC19C9858F741EB9D24A9F6F04FC839B67153214116E8B7FA982F338445830F915F7C85C88C23BA2A3CE8E2020A9D8DD7B18EFE95563E3924D2A341826AF51A8584CD026B1C433EF0221145BA8BDC8F73A467B33A9EB3E8CD2A4D671C17D7C28AAA539D1C5BF2F4138639AFB89CE791DAF0EF0281D52598F4C13D210974CFA1F099A0FC70B1DC120E5C00C33A2BD360BED57CCE069060D6380BE2204852D8BCFFF4918BA0B70B0BD1E1D55DC1D68DB1D20AE713B0093EAEFA1E33D40D9BD95CFF17568393E9BBF5CC1287325D2668F65DFCF44ACE2F6C6CEBB62F1433E69CD19E6C6532EA93682B22C4C4A62C6ABCFAED08EE64F32723E56205222E4AE0831AB8FCA8C265FEA0CFC66AAB1E367201752AEC11F752B963792C071E42A8A1AB80658A0C6960147ED740CD07F307CF6A644A98E1D2E56C625ACF458D0BDF6216A4F1B9C78EC3F14850C803A4207C894E61A8AA88840A27F2B439FA7CBAABBC789102A95323E06E2C324859DB92C6CEAEFDCA389F677082180FE3D6202FF60DAB9F87E3B84841C0A4EB5974D893333F7F1513E54EA4AE0731EC409F69B77089FAFB121300042880EA59B7927E9435EABFDCC1019A96E145D5D157998D620E7BC6945DBD6CD78E94C2D89589F8DC8A01CF1B295A26B091847F034937F764ADFD811F52B3AA187F3F49273EAE5949FF34B64BC86FF11EEFE378825D526509483E7191B33333E5465FFB025B269F898CE1F83EA549F1864B556C729F510118921B69594F67B8C229236AD3AEE55BD7082E027B5D342C976A549E01618288944DE0B2C77473A25201B61034B334968178AFAB7F8CD1FEB6A25CF8DCE3586FFAAA861471E2EE7F0C22538FB3C95D2145965C4673E6489764AE24B4F048DED77FE3487AE175F6D4898F69F9FFF276470A93DAF986A75F685919D98C9C609C795D4785AE941C782B551EF382F47209AADEA19066AE5D3EBA7BBD99E91943F1E62754A42FFC8048F7B87F128CCF6C96BD760B45F07F740E94491874B06CC3450AAF55BC664B407C57369CABD2708A9C478DFF64D292D96AB71EB997F8B71CDD6BA02F52C5035EC26E8111EBF8268CB00DF9ECD63BC0D557E2D2E77A6363B00DAF25237E77DAD03F929E5E9B39447A70D4E5F4B90958F312C80D594E1B1F3D0D23F2B0D9753BF3544061CF0C0F841C440319E74F9B9D15B91EBA1E680ED6AAB7D63A97B48C0A4AAF314E8E77E2EA6BE9DCFC7B5557FEC1B996A37C86CF6941325EC356EE75671726BCED7D2157BE8D4C62CF4BD0420BAF2C4223597C0EF75F7A7C9533D14BE0D21C37F06FAA53ED5EE0DDB025862417F98D2F188895395CF2FE72185ACBEA952F55CAD7EC2D684A5AB94B1257D7ABB565B8C07B88C6335FFB9D2FC6F6779CC24FC3CDF92BB3B12EC54360A7CF3579632A2A65C518E57015DF1C616C857F83F5F1AAFF693ACFF210DD1E95CE04CCA9A0BF385ED6EA2AED894E79D5133799393469B666209371E708D4D279E1AC5ACE28985D0DB2765D547C2902B715BAED5A4FA3E7AA42645F3BBE1E9F3CDB87B1DD8DBB5AAB08626591921CB49E552F8EBAFCBCF428470719AE40B9CA847F31848F39E4D42049C5D40B0BFF036E5409A6A12E7924148E60B64BB83386079B54486FFC8187302893B8BF826578D9CA03A1291983F21DE7F6E65458F8942DC1B135C6C8C1FEF4F3863A58DB17112419590AE57B9425592FF22E596191E5BA7C513EC315EC3476C95A149F6A5EC1CF24870400FDF46217A23F42E0B61157C3CEE23E7916B4475A94B96B917C171B1A34DB13AD98833E457343F94A76EE226FA5B9F3066C2FD69F14D3AAED1B31F5114780442EBBC88D0DE5F689CD910E7464D73423B9D4E03718C5C51871250D11E27E28DF1268166E3AF328A80D9D335F2D27D2E91DC61CDDC7F733E345D56C11B6130875D93D527F93542FB352407185E7AC07051AF7F642E34FA06B1376BA15A35D837C1BFE090BA67A89FC1E307DFF3F02A988ECD48FD229733F641F2609EC8DB14B1A5AC170B104F03C2509D2EE6844C716766D06A6A25D957530FD68A8DE6F1753F83EC19EA2DEB1A4F9C7986F20FF60A7508DED6547A85BABA70577062E8144BA0496777A5218595E021937FEBAD4BFDECAC29E3FFF2EFE7D598FCB86F93A734E4C573E1496A6282A3B40E817DD3C9D631939AAB350ADC703899EE3BCB1B5EAF6EA8420DD6EB2D4F64A1818AAFA97B73C75610B6005F1EDC1EC7D8F8DB1E5D3E9666C1292515105037D26F2C8D83FEE1F4EF5DEEB287CD7C1E11960218C1B8BB50453488BAB019435065AEDFECD8D218BD1E751FE736442E8D09CE7176A71C06415A30B070693A68BDAA5CDF62351AE665F37FEFDA9481E62EC181ED24F0D0649AD01C89AC422F1B7E27895E55DCC2FD817346D361FA559094B37894C0B478C68A1D7564D089D9D4417D5C7372A33BA475A81FC129F3259C5407BC7435825B415782CC84D85E69D9B44B32D78FA255A895CFD55319DAE677FF89D93A3884CE9401775563FF1788CF3AC11CF96DAA199E7F4579A0264378A323FDA64FAD2349C09465FB23BA09069C7FBC79E7288A82F9165268F6842E0AFF0E250C21BBAEEFB4347D4EF1CD51161DFD29BFAFFBEDF71DEC93F4157A5C18995379ADE8D15DB59EC4A8B308C2EADE1B7DDAB55CE2220F3B3AE8CBA7C8211CCCB3846A225B438F4B37DF54363A987C5C4E6B9D20EC3C0096317D11F982184B75D8EFFD168B7B41317D40F903A23A2649999DB36CAAE31BA5D91998A684D30AAADBD3B1EC154BB6C92513BFC0C47C673254F42B1FA36B995CB737668CBDC2A0D1BA838E74E0E50B22FC22DD048F48B6D1E89E1CCCE5A226F63AC7B8E6E9E8CE27050BF3DCD7D0F35F47BBEC1CAABD4D619CD77302AB4FF6F56DFBE9F5821AFF2D72EE6A628DAAAE4440EDCC070473BDAA54CCD775331AC2812FC5B9884915DA582EB36F85C7923F06D961594753802EFC5883CA484FC64FACE42DE6C3105E23CB90663A3B381D0C6A7265B740BFF0A1A017058F06E39A74BB07B63F883CF914FE675E7E5AD5AD44C9F90DDBE23A125D9BE02264EDC13972FF22BA48ECE8890A223EC13ADDBE055A8B4E03882677FC0D94C9053DA6CED34E132FD83810A793350446D60AE5DD0D174B534A3B6F5BC1B497F9406B5CDD414401B6DD881CEABAB12CC51425E88A81BD9E14BDA18273583CCE0849AA48DBA1CFC49CDF29242C73C99C87F063B8B739AA787570459C098405DCCEF78D6D97C21545F2959DF9CD62F9C38AD9A849507C23A51714565642DD76C9103154327985F7DCC701B795A7AF8625F06367ADC11A7FD7B6ABBDA5B2FF6A825DD43B64A48EDE4EFF8603A82159A6011F9E626171E4593C0E963595A6E068AD05FEB12378C71AE515A82C293EB7D2B01B333CBC7991B44685AA7513B3A58342BA5D094B773E6A27F8582F3DABF54DEF59974CB8A2499369B5B64C7AC08D32D75FE37371C578073DC83B82A828DFC325976FF282D3F6 +pk = 95287E919BCF3240EB644E1AA22BE9E847E4DA00BC7546B3A3B1D502BAD27C70B9EDD03C156F864CBA78BD1E4DF0F81E0518A2D65A1BD153AD39C08967950A82E5149F8105DCF885F29634F16CFF6350619197A50C16C2C388CF80954B48102B02 +sk = 95287E919BCF3240EB644E1AA22BE9E847E4DA00BC7546B3A3B1D502BAD27C70B9EDD03C156F864CBA78BD1E4DF0F81E0518A2D65A1BD153AD39C08967950A82E5149F8105DCF885F29634F16CFF6350619197A50C16C2C388CF80954B48102B02E7419B799D7371790C1937040F316CDB072C37386F0728D6BB0200000000000000000000000000000000000000000000A8F24B608C234C299B9F0A3360FAEBC8E3059BF7EE84155F79FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF918D16ECC79CC761D2576B2D1D56C0419786AA88B8370E4935FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006F3512082367F46E6839CDD063DBFEC8744CC8A1F8D0980653AEA56C3EE0C0D79F5698FE10C7FB74A3F775153BA9C900C09C9EAB4C2A99467DB671994533B1E3D748D41DF545F2EB2E14F0C3A74A97175F47692CEB426D38D07A32129DA2F500BEA48E68DE452560ABE63BC86402A4999E16AEC26369A64E6323BCA3CA941DF5BF9F5F1AC5E97E39912C6AFAF270E60061E9B939F0FFB658523F5E467998E270CCDEDD5725468A3676180BF9290E69C2810DB7646EE76CC643D483D3EAFFF500 +smlen = 2831 +sm = F6614CB7F8D230A5D2DD029594934FD84DED309F1759F2F2D744A8060EA114BA4B4912DE90B848582F1DA3060D8FBB161913DD3B2D2263E9F9929D4F2DF35FBE10F32A12E0B19BA2E450237FC692B8FA5B2BF4BFD1063E087180F5A1EDFE5D2F000438B2A51C9306737F4F7234B21C129A51A6514723182C9F3A009139EC8F1D2A832D8656B9536B0622526BC314C1ED4DD0D502F05514E8B1ADDD036111D22438BD86CC5DDD648F6B8D47690380CB6D9B9D878665F41FA2F6A140C28A5F45D3B3196C013B03C266FD06ED22AFBBA70D11B716EC8389E23EB845049AE3000D0296AD5FAEF409B8A4C21ACB1ACB596BADF387D26656BE3EB17987AF59737E324B7BF8412A306B0E706AEF73D79AF753D9B0064BA9CED8DCEA966543FE748E2611709ECD1CE6E4DD8FA812D485E91809A225936675369574B0D104A258E3353EE0E021683615CA5C7C531FB29A5025CC7F7323860443DC19C9858F741EB9D24A9F6F04FC839B67153214116E8B7FA982F338445830F915F7C85C88C23BA2A3CE8E2020A9D8DD7B18EFE95563E3924D2A341826AF51A8584CD026B1C433EF0221145BA8BDC8F73A467B33A9EB3E8CD2A4D671C17D7C28AAA539D1C5BF2F4138639AFB89CE791DAF0EF0281D52598F4C13D210974CFA1F099A0FC70B1DC120E5C00C33A2BD360BED57CCE069060D6380BE2204852D8BCFFF4918BA0B70B0BD1E1D55DC1D68DB1D20AE713B0093EAEFA1E33D40D9BD95CFF17568393E9BBF5CC1287325D2668F65DFCF44ACE2F6C6CEBB62F1433E69CD19E6C6532EA93682B22C4C4A62C6ABCFAED08EE64F32723E56205222E4AE0831AB8FCA8C265FEA0CFC66AAB1E367201752AEC11F752B963792C071E42A8A1AB80658A0C6960147ED740CD07F307CF6A644A98E1D2E56C625ACF458D0BDF6216A4F1B9C78EC3F14850C803A4207C894E61A8AA88840A27F2B439FA7CBAABBC789102A95323E06E2C324859DB92C6CEAEFDCA389F677082180FE3D6202FF60DAB9F87E3B84841C0A4EB5974D893333F7F1513E54EA4AE0731EC409F69B77089FAFB121300042880EA59B7927E9435EABFDCC1019A96E145D5D157998D620E7BC6945DBD6CD78E94C2D89589F8DC8A01CF1B295A26B091847F034937F764ADFD811F52B3AA187F3F49273EAE5949FF34B64BC86FF11EEFE378825D526509483E7191B33333E5465FFB025B269F898CE1F83EA549F1864B556C729F510118921B69594F67B8C229236AD3AEE55BD7082E027B5D342C976A549E01618288944DE0B2C77473A25201B61034B334968178AFAB7F8CD1FEB6A25CF8DCE3586FFAAA861471E2EE7F0C22538FB3C95D2145965C4673E6489764AE24B4F048DED77FE3487AE175F6D4898F69F9FFF276470A93DAF986A75F685919D98C9C609C795D4785AE941C782B551EF382F47209AADEA19066AE5D3EBA7BBD99E91943F1E62754A42FFC8048F7B87F128CCF6C96BD760B45F07F740E94491874B06CC3450AAF55BC664B407C57369CABD2708A9C478DFF64D292D96AB71EB997F8B71CDD6BA02F52C5035EC26E8111EBF8268CB00DF9ECD63BC0D557E2D2E77A6363B00DAF25237E77DAD03F929E5E9B39447A70D4E5F4B90958F312C80D594E1B1F3D0D23F2B0D9753BF3544061CF0C0F841C440319E74F9B9D15B91EBA1E680ED6AAB7D63A97B48C0A4AAF314E8E77E2EA6BE9DCFC7B5557FEC1B996A37C86CF6941325EC356EE75671726BCED7D2157BE8D4C62CF4BD0420BAF2C4223597C0EF75F7A7C9533D14BE0D21C37F06FAA53ED5EE0DDB025862417F98D2F188895395CF2FE72185ACBEA952F55CAD7EC2D684A5AB94B1257D7ABB565B8C07B88C6335FFB9D2FC6F6779CC24FC3CDF92BB3B12EC54360A7CF3579632A2A65C518E57015DF1C616C857F83F5F1AAFF693ACFF210DD1E95CE04CCA9A0BF385ED6EA2AED894E79D5133799393469B666209371E708D4D279E1AC5ACE28985D0DB2765D547C2902B715BAED5A4FA3E7AA42645F3BBE1E9F3CDB87B1DD8DBB5AAB08626591921CB49E552F8EBAFCBCF428470719AE40B9CA847F31848F39E4D42049C5D40B0BFF036E5409A6A12E7924148E60B64BB83386079B54486FFC8187302893B8BF826578D9CA03A1291983F21DE7F6E65458F8942DC1B135C6C8C1FEF4F3863A58DB17112419590AE57B9425592FF22E596191E5BA7C513EC315EC3476C95A149F6A5EC1CF24870400FDF46217A23F42E0B61157C3CEE23E7916B4475A94B96B917C171B1A34DB13AD98833E457343F94A76EE226FA5B9F3066C2FD69F14D3AAED1B31F5114780442EBBC88D0DE5F689CD910E7464D73423B9D4E03718C5C51871250D11E27E28DF1268166E3AF328A80D9D335F2D27D2E91DC61CDDC7F733E345D56C11B6130875D93D527F93542FB352407185E7AC07051AF7F642E34FA06B1376BA15A35D837C1BFE090BA67A89FC1E307DFF3F02A988ECD48FD229733F641F2609EC8DB14B1A5AC170B104F03C2509D2EE6844C716766D06A6A25D957530FD68A8DE6F1753F83EC19EA2DEB1A4F9C7986F20FF60A7508DED6547A85BABA70577062E8144BA0496777A5218595E021937FEBAD4BFDECAC29E3FFF2EFE7D598FCB86F93A734E4C573E1496A6282A3B40E817DD3C9D631939AAB350ADC703899EE3BCB1B5EAF6EA8420DD6EB2D4F64A1818AAFA97B73C75610B6005F1EDC1EC7D8F8DB1E5D3E9666C1292515105037D26F2C8D83FEE1F4EF5DEEB287CD7C1E11960218C1B8BB50453488BAB019435065AEDFECD8D218BD1E751FE736442E8D09CE7176A71C06415A30B070693A68BDAA5CDF62351AE665F37FEFDA9481E62EC181ED24F0D0649AD01C89AC422F1B7E27895E55DCC2FD817346D361FA559094B37894C0B478C68A1D7564D089D9D4417D5C7372A33BA475A81FC129F3259C5407BC7435825B415782CC84D85E69D9B44B32D78FA255A895CFD55319DAE677FF89D93A3884CE9401775563FF1788CF3AC11CF96DAA199E7F4579A0264378A323FDA64FAD2349C09465FB23BA09069C7FBC79E7288A82F9165268F6842E0AFF0E250C21BBAEEFB4347D4EF1CD51161DFD29BFAFFBEDF71DEC93F4157A5C18995379ADE8D15DB59EC4A8B308C2EADE1B7DDAB55CE2220F3B3AE8CBA7C8211CCCB3846A225B438F4B37DF54363A987C5C4E6B9D20EC3C0096317D11F982184B75D8EFFD168B7B41317D40F903A23A2649999DB36CAAE31BA5D91998A684D30AAADBD3B1EC154BB6C92513BFC0C47C673254F42B1FA36B995CB737668CBDC2A0D1BA838E74E0E50B22FC22DD048F48B6D1E89E1CCCE5A226F63AC7B8E6E9E8CE27050BF3DCD7D0F35F47BBEC1CAABD4D619CD77302AB4FF6F56DFBE9F5821AFF2D72EE6A628DAAAE4440EDCC070473BDAA54CCD775331AC2812FC5B9884915DA582EB36F85C7923F06D961594753802EFC5883CA484FC64FACE42DE6C3105E23CB90663A3B381D0C6A7265B740BFF0A1A017058F06E39A74BB07B63F883CF914FE675E7E5AD5AD44C9F90DDBE23A125D9BE02264EDC13972FF22BA48ECE8890A223EC13ADDBE055A8B4E03882677FC0D94C9053DA6CED34E132FD83810A793350446D60AE5DD0D174B534A3B6F5BC1B497F9406B5CDD414401B6DD881CEABAB12CC51425E88A81BD9E14BDA18273583CCE0849AA48DBA1CFC49CDF29242C73C99C87F063B8B739AA787570459C098405DCCEF78D6D97C21545F2959DF9CD62F9C38AD9A849507C23A51714565642DD76C9103154327985F7DCC701B795A7AF8625F06367ADC11A7FD7B6ABBDA5B2FF6A825DD43B64A48EDE4EFF8603A82159A6011F9E626171E4593C0E963595A6E068AD05FEB12378C71AE515A82C293EB7D2B01B333CBC7991B44685AA7513B3A58342BA5D094B773E6A27F8582F3DABF54DEF59974CB8A2499369B5B64C7AC08D32D75FE37371C578073DC83B82A828DFC325976FF282D3F6 + +count = 79 +seed = 8B47E0EBE786914C9A52D547106CEB4A3D3DE938B3244E02E5F9660954C4C95A23F2476FCCB487673AAD0513820905DF +mlen = 2640 +msg = 2447D338BF1A375B66B77FB96CBE7742508B57DFF4D33A368EBB8451C2C67B980D3576E6588D8678B285EF288A8B5C9C2726C4A550E764E47FFFA2A128533A7653E480288447509E10013AE1944FFFAFBD9E2BACA0B3C7069C07A4186C056FD3857CADDADD5F891512DAEEB26865F5C89FFA63A64C85A08E41EBE7BD8786A8ADD571A4267D5A9E426840A0B988E197A09F3770B5B0D80D65515CD4D8390AF40E6150062DC4B8661A8238F232692C152C97B8CD5BFE7B5AD863DC92D99744D769087B3EDD81D2E475F5CF0224B10CDE6FAE8DFC3519EFDBE66805AD4468D84D3DD93430363677360DA8F56CB58A6B775FF6417C1F324380B15C9BA668EB0F25FC2A690B483E856F3327B2D79FA6259E30D7F76199CFD21152B7C6FFC3FC113F70D3930C08B3C1EB1BF25C100C5A930EEC2C52664F092B89614943D9D85ED86A2EF666A94F9826C3D116A2BBE49443E2C11748C977716381D9463DA8D09612B80A6760E5A6FC5F59425EAAAD6C8342C1EA4BEEDD5D73151CE213C0B155286FF22CD28E3BB88E0CEE39CB859900D1E0FC19F6A7237BDA8E51476F4844A316752FB347492A928EEB07AA39ABDCC0164D1921B61352ED4AC94B82C410A56505633BAD53A3E649ACAF64C43C1ACFCD4715FC594AF6FB9E85B0B7DDD6E8621BD12A2BEE48223A97EC8502C16B550B03087B6E87C1A860D36322064F8FEBC52F2B7C31DAE7430870259BDAA5889852E3AE6F61013F5AD0D38727CF9D90C67BD7BB3B82D303C6C35383ED86FD5B7DDEC824EA198EF780BE830A1F2679D24EA6E2FEEFB979563F511D188F409F0CFD0050FD418414D01E46DB3D23B3A90B24F4E96EDD4F863BFB333D6A826D29EED167738BBE22C516C59FDF81B032BB55473A5EA2A1DEFE71C95A1EEB5C028435AD0379896CBBC76877501B054CF1FD2F6D7A9DECCD70D0C07111147EF568DCE514DE96EED61600029C8D103B31C8B344A700DE630276BA2C5633419C59E66577659538A6381E45584C7E1D6ED978AB0AF89067AC83BB70DEB6F2C58E339A5A66176A54D985DA6E02002948C62BE6F12314240FE18B09AACBCE82EA462586B8316C3E0AEA00F9998922F8D956120E53B4178223F4D2934A20976FD5A72027C8F4CB33E9BBCC0ABD15395151266B6CD5B4A9E2FC1725D8E9AB2CBDA47B507BB25AC995EDD51EBDA5FD19CAF68FAD8EAC57CB5EF0C6FC861A73E64648EE3255DB4C3394438F49377CC4AC2FCE1B6BC812E5D282F122678713C6C6D452A33C632C0AA47686588752D72B0586FE5EC2464A6DB40662FD2106A19F67DCCC45692FCA03685251D512642B0CEE436C78D94C6F5F25BBCB41FC7E5B1AECD52B846A0B70EAC93579603E9870F942AD4C1CFC9D49B1132777C6F1C184C1537178E5029067257A2DA2827A2EC44D323D13DC6E4E1B9EDF5949D4324228687FD54F02CCC3C4DDA635FA546A5A6783959B1C48AA9D9C9F6381EBCCD979253460857D3CB1C70893EE6F04709E35923883EE3C71C7F33B8CC28B9136B3EBE5F52B9A76817F2F74FDC2F12B459DFF32D5A295BE374B3FE507A0995BCACF1E7B24F4501B29F1E8B4F2A8CB394B3E459A4296F6439BA59EC88305AB045FF40B1DAB4F672F878DE1F9E46B9326CB3E2F3457B83EAD8DEC28DD079AF0E984A69ED882E1CF21036578485DFC2DEBC9CFE82FCE0383B4039D147C4C7E31E315FB57B9093DAA811F4EE4568E32E5625ABE76C5A1AE42A03441DBE766D0EF4DF607406F7D489275E8C5D4470866F9049A4AD5C428B843DEC3702E86E177E4B60181D2B5F099BEBCB25F04C93D087C72436E87A9B3AFCE78FA31E2B892400B5C1071F8AE0F78EF6F7D71859A97C17EC0912D5EA27AFEACE739FCF66F489EC6355A3318F79649881CD6C7E96A881ECC4FF6934C3D10D99F1DFD00592CB037749B025BD4BC2832E206C1407E600FC2170C0BB57E5C7AF0756830C2A6913E2B9C60575CD4A394F2A65C50E40A43CF5EBCA6A8A32335707DDF4633BAC7375DD53E24DF20AF30203B514D3793392E38FA8429B050F58B28CAD0146F385809CC7FAEFF8B71B2BC93D2C6F72E31AE2D07CBB3CB7F43540894E01654EDC71CCF4F361A847EC5B1D23C2D4680E29F0E1F992EDA3AC41ECFE614FC010A2EED1BAD87A7D17468D6FA5356EDB25E9008A9BB328225F85202246816E1A542E1DD746A5FD3E064FAA1248579D31CD3D65F8FFF36F782622402DB328C7850D82D8D8A52B897353A2F8B95624D2D958FC1C3AE6466EACCA2A6A5E6ADD4A582D27E07633CCF697FA02E243A4FBB3DC727B718B5AC0FA6AAB217E241627E69CA46F05ED6B496A739A29EDAEEF76992A507130715BE555C68A7EEAD6E8FF3A378D8F4B7BAFDEE3EDB9EC094440E31BBA717A9C82A117D05EDCA2370003DFABFB2EFB29510466F74E76CECCFC41709FAC4CD8EAA998357170A7A293209EB0BB83DFE5E2F6D73C28D5409C55E95068D647BEC42DB8098F0089EF8A5FC5976BAC421C37DDA6C4227BC1AE5AE229F067515CEA3D794C8D85564AF208AE0FCF836B6C0AF41477F99C8773D9DD1923C5C07E1FD508C7436EA93383797F372EF3103546A5278A4F59614A5D182344F0431D065C35620D63D4D001D7F626993241362E67D1BF41419858EECC2626537D44E2E23619381E96CFA91B3D8054681D298509D9B99E7AA99CF8742E37637B24136F8E1B487E9571E4C24AE5DF307E4C7C62E55C47132AE404B33E5367C6F24D6680BE32D20BC58370145486FD5EACBCF98EB7E7FB6293044067AF11879E91444025FE52E24617269BE192BB71BD9F95356EDBED9DF352AB56A854F9F531889A88689D3F161FE6155C6C1E8011D60A46F59C7D08C477FA652B559A80567076B4EAC29A85D54C66B35D6960DFF75A696CDB17EC9A7B74DC6C3652DAE866E8758170D055C4BF60FA1238448CC9E29160DF50160C4B0DFB36BCA40AF0BC5F7D490E7DBCA49535742EECB90098A0A0FBBBBC7AF25C0CA9BC039DFB555DD8431AF188F7C1D0FF786D627C058A0B9A15F26B58AA2A5992BC8FC5AA14025FF95F294203B45EA081E28F094D0D4AD671C885E67B2E9E800F10048158698D56648F67BFA8CC73DD5AFA15C1E48936B2596DEE34459B484336C20CD77E58BF682479F9AEF2FCDA86E4F3A2FED7046E5A3828A9B3C0DBFFC25FE699F25629A2045A51242E310CB369B730A5E81167758D7FE843261A598E4541B02D0DB4BF5616BA07A440665F7FEA6213114B6B1B38BC033D70E845445DCD18E23D34D3D6F4A52F5F904AC5D8FECA5AF1123658D09613209EE19954174A1AC7A8C7F9EA288BBE5A0705F3CE38F30ED5EE69CF5208D461EFAD51C456507C3729EB338CE15C4C253BE21E81F082B0847C6871CA0FC8B3E80115FE2BB8CD8AFAE69A3C1429D21F149B7446888BB4DCB639819EFEE665B6D6F69E61452B9328B4887A7C04E9949390980A2609A667267035B11BF862C1131533DDAFA518221627E0EE7E4009CD48E4AA9D0753A9AE82AA0257B69D569B4C53F05A75A521B327322C60398DB0947D205D2A33AE51CF2CEA8C9162DD604F8EDBE91F5199D19EFBF9896A46389E7BCBA54B4AA57CBA0D4F9DA117F288133AD01A9A9B2A824D54F74D4172BE2B1E5F0D3DE60C13AA5B668EE6A45397C2E39573EBFABAABA48D1DDB2AB6453FBBAC8DCC05349404889C7DE23A16EAFAC8D5E541457C32CDCE80CBC +pk = A53CE76B2D27DCAB7F2A7C855985519DE0DE8072E01C97836B1BF76E02DDC34E47BE697458095FAAF495CDE9C962A91D213963F478EE73FCB808F392BAD761CD76FE69C2F00CE22A7A47CCA98661C97DFFD738712DE7AC5BF8D523B180B99A1004 +sk = A53CE76B2D27DCAB7F2A7C855985519DE0DE8072E01C97836B1BF76E02DDC34E47BE697458095FAAF495CDE9C962A91D213963F478EE73FCB808F392BAD761CD76FE69C2F00CE22A7A47CCA98661C97DFFD738712DE7AC5BF8D523B180B99A10047D4F265F5BA419280B0500A4B5CFD0A6DC269834C8A567B4A10200000000000000000000000000000000000000000000FA95FA27CEF991C68E0DA28D82E572A8CE25AE5AF1442B2D5FFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE965221AF86CA03BCD00EED66E8ADECBD6DE843D449D828E5EFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000645959E77E253353FB7AAC3E6CD346BAF4183510412B0DD568A014D357ED125C396E66761B0FDD36F2C38DF6EE117B00C1E2338B21619DB4A2057A540493FE1C2D1DF589209FBF94BCEDBFD32120CF24EF85A0999532DD3BE7101F7A38D31400BFD55F5EAC88C39EF9E173628E0114706C86F308E3DA10D8231A40053E5560B0982F71573F93EA74747116551D81D300D259378D6628383F3BA13770B9FCB92C199B74A82D5C22D8691558D7B7C9D3DCDDB1FF8184A5736ACD0A4C303B5F5100 +smlen = 2864 +sm = E99A7427F53AB20D3786816915C1DF359FC92D4B3EBB079097AC17554947E44DE3C27B441A6455E17D73A817B2D43018DD367AC0FD64826BB47C2F742305A32FD78212AA7089B6BF9269ACCD0413441DB56E1C497E1CB8AC89DD91F208CCC21303015F6C9ADFD32B615D480EA55EC901FFB20A1EC93180FA4B5800FBB0D40CA3CEB1E33179A748961CB25F269606AA2D73847E00E162010996326D376F525B6FE460D96FF0A29A3D135B4E6300C74F2AA755265FDF8DF28DD827374000D69F21D2D0EABA7200AC13B4593E1BD8BB8627B719A344BAEAD361A700513A3F0002172447D338BF1A375B66B77FB96CBE7742508B57DFF4D33A368EBB8451C2C67B980D3576E6588D8678B285EF288A8B5C9C2726C4A550E764E47FFFA2A128533A7653E480288447509E10013AE1944FFFAFBD9E2BACA0B3C7069C07A4186C056FD3857CADDADD5F891512DAEEB26865F5C89FFA63A64C85A08E41EBE7BD8786A8ADD571A4267D5A9E426840A0B988E197A09F3770B5B0D80D65515CD4D8390AF40E6150062DC4B8661A8238F232692C152C97B8CD5BFE7B5AD863DC92D99744D769087B3EDD81D2E475F5CF0224B10CDE6FAE8DFC3519EFDBE66805AD4468D84D3DD93430363677360DA8F56CB58A6B775FF6417C1F324380B15C9BA668EB0F25FC2A690B483E856F3327B2D79FA6259E30D7F76199CFD21152B7C6FFC3FC113F70D3930C08B3C1EB1BF25C100C5A930EEC2C52664F092B89614943D9D85ED86A2EF666A94F9826C3D116A2BBE49443E2C11748C977716381D9463DA8D09612B80A6760E5A6FC5F59425EAAAD6C8342C1EA4BEEDD5D73151CE213C0B155286FF22CD28E3BB88E0CEE39CB859900D1E0FC19F6A7237BDA8E51476F4844A316752FB347492A928EEB07AA39ABDCC0164D1921B61352ED4AC94B82C410A56505633BAD53A3E649ACAF64C43C1ACFCD4715FC594AF6FB9E85B0B7DDD6E8621BD12A2BEE48223A97EC8502C16B550B03087B6E87C1A860D36322064F8FEBC52F2B7C31DAE7430870259BDAA5889852E3AE6F61013F5AD0D38727CF9D90C67BD7BB3B82D303C6C35383ED86FD5B7DDEC824EA198EF780BE830A1F2679D24EA6E2FEEFB979563F511D188F409F0CFD0050FD418414D01E46DB3D23B3A90B24F4E96EDD4F863BFB333D6A826D29EED167738BBE22C516C59FDF81B032BB55473A5EA2A1DEFE71C95A1EEB5C028435AD0379896CBBC76877501B054CF1FD2F6D7A9DECCD70D0C07111147EF568DCE514DE96EED61600029C8D103B31C8B344A700DE630276BA2C5633419C59E66577659538A6381E45584C7E1D6ED978AB0AF89067AC83BB70DEB6F2C58E339A5A66176A54D985DA6E02002948C62BE6F12314240FE18B09AACBCE82EA462586B8316C3E0AEA00F9998922F8D956120E53B4178223F4D2934A20976FD5A72027C8F4CB33E9BBCC0ABD15395151266B6CD5B4A9E2FC1725D8E9AB2CBDA47B507BB25AC995EDD51EBDA5FD19CAF68FAD8EAC57CB5EF0C6FC861A73E64648EE3255DB4C3394438F49377CC4AC2FCE1B6BC812E5D282F122678713C6C6D452A33C632C0AA47686588752D72B0586FE5EC2464A6DB40662FD2106A19F67DCCC45692FCA03685251D512642B0CEE436C78D94C6F5F25BBCB41FC7E5B1AECD52B846A0B70EAC93579603E9870F942AD4C1CFC9D49B1132777C6F1C184C1537178E5029067257A2DA2827A2EC44D323D13DC6E4E1B9EDF5949D4324228687FD54F02CCC3C4DDA635FA546A5A6783959B1C48AA9D9C9F6381EBCCD979253460857D3CB1C70893EE6F04709E35923883EE3C71C7F33B8CC28B9136B3EBE5F52B9A76817F2F74FDC2F12B459DFF32D5A295BE374B3FE507A0995BCACF1E7B24F4501B29F1E8B4F2A8CB394B3E459A4296F6439BA59EC88305AB045FF40B1DAB4F672F878DE1F9E46B9326CB3E2F3457B83EAD8DEC28DD079AF0E984A69ED882E1CF21036578485DFC2DEBC9CFE82FCE0383B4039D147C4C7E31E315FB57B9093DAA811F4EE4568E32E5625ABE76C5A1AE42A03441DBE766D0EF4DF607406F7D489275E8C5D4470866F9049A4AD5C428B843DEC3702E86E177E4B60181D2B5F099BEBCB25F04C93D087C72436E87A9B3AFCE78FA31E2B892400B5C1071F8AE0F78EF6F7D71859A97C17EC0912D5EA27AFEACE739FCF66F489EC6355A3318F79649881CD6C7E96A881ECC4FF6934C3D10D99F1DFD00592CB037749B025BD4BC2832E206C1407E600FC2170C0BB57E5C7AF0756830C2A6913E2B9C60575CD4A394F2A65C50E40A43CF5EBCA6A8A32335707DDF4633BAC7375DD53E24DF20AF30203B514D3793392E38FA8429B050F58B28CAD0146F385809CC7FAEFF8B71B2BC93D2C6F72E31AE2D07CBB3CB7F43540894E01654EDC71CCF4F361A847EC5B1D23C2D4680E29F0E1F992EDA3AC41ECFE614FC010A2EED1BAD87A7D17468D6FA5356EDB25E9008A9BB328225F85202246816E1A542E1DD746A5FD3E064FAA1248579D31CD3D65F8FFF36F782622402DB328C7850D82D8D8A52B897353A2F8B95624D2D958FC1C3AE6466EACCA2A6A5E6ADD4A582D27E07633CCF697FA02E243A4FBB3DC727B718B5AC0FA6AAB217E241627E69CA46F05ED6B496A739A29EDAEEF76992A507130715BE555C68A7EEAD6E8FF3A378D8F4B7BAFDEE3EDB9EC094440E31BBA717A9C82A117D05EDCA2370003DFABFB2EFB29510466F74E76CECCFC41709FAC4CD8EAA998357170A7A293209EB0BB83DFE5E2F6D73C28D5409C55E95068D647BEC42DB8098F0089EF8A5FC5976BAC421C37DDA6C4227BC1AE5AE229F067515CEA3D794C8D85564AF208AE0FCF836B6C0AF41477F99C8773D9DD1923C5C07E1FD508C7436EA93383797F372EF3103546A5278A4F59614A5D182344F0431D065C35620D63D4D001D7F626993241362E67D1BF41419858EECC2626537D44E2E23619381E96CFA91B3D8054681D298509D9B99E7AA99CF8742E37637B24136F8E1B487E9571E4C24AE5DF307E4C7C62E55C47132AE404B33E5367C6F24D6680BE32D20BC58370145486FD5EACBCF98EB7E7FB6293044067AF11879E91444025FE52E24617269BE192BB71BD9F95356EDBED9DF352AB56A854F9F531889A88689D3F161FE6155C6C1E8011D60A46F59C7D08C477FA652B559A80567076B4EAC29A85D54C66B35D6960DFF75A696CDB17EC9A7B74DC6C3652DAE866E8758170D055C4BF60FA1238448CC9E29160DF50160C4B0DFB36BCA40AF0BC5F7D490E7DBCA49535742EECB90098A0A0FBBBBC7AF25C0CA9BC039DFB555DD8431AF188F7C1D0FF786D627C058A0B9A15F26B58AA2A5992BC8FC5AA14025FF95F294203B45EA081E28F094D0D4AD671C885E67B2E9E800F10048158698D56648F67BFA8CC73DD5AFA15C1E48936B2596DEE34459B484336C20CD77E58BF682479F9AEF2FCDA86E4F3A2FED7046E5A3828A9B3C0DBFFC25FE699F25629A2045A51242E310CB369B730A5E81167758D7FE843261A598E4541B02D0DB4BF5616BA07A440665F7FEA6213114B6B1B38BC033D70E845445DCD18E23D34D3D6F4A52F5F904AC5D8FECA5AF1123658D09613209EE19954174A1AC7A8C7F9EA288BBE5A0705F3CE38F30ED5EE69CF5208D461EFAD51C456507C3729EB338CE15C4C253BE21E81F082B0847C6871CA0FC8B3E80115FE2BB8CD8AFAE69A3C1429D21F149B7446888BB4DCB639819EFEE665B6D6F69E61452B9328B4887A7C04E9949390980A2609A667267035B11BF862C1131533DDAFA518221627E0EE7E4009CD48E4AA9D0753A9AE82AA0257B69D569B4C53F05A75A521B327322C60398DB0947D205D2A33AE51CF2CEA8C9162DD604F8EDBE91F5199D19EFBF9896A46389E7BCBA54B4AA57CBA0D4F9DA117F288133AD01A9A9B2A824D54F74D4172BE2B1E5F0D3DE60C13AA5B668EE6A45397C2E39573EBFABAABA48D1DDB2AB6453FBBAC8DCC05349404889C7DE23A16EAFAC8D5E541457C32CDCE80CBC + +count = 80 +seed = 07CD8F8AB7CD12EA7CC94103B8623D6F0FEA2BAFD2325BF6089DF5351BDBB9A94525C3C6B72D3820F2E4D5F9E7C849F8 +mlen = 2673 +msg = AAFA792BFF719A3B794B2F8198EBD1556889C8C61EE6A51470AC9B274CB162AF44A26E2BA5EA7663C4C78B4B66B322ECACA8F2EBB6A610B51D7C4399F4A64A870C038797CAC80F709CA5C3C9FAFF7D797963E60983B584130C1B99328AADB2D261217CB95A535B8518A78A6D2F6CB8400C2AAA2DAF451391F7B8AB0277A3AF88E1CE6F1D3DBC386CBAFF15308F073D29838692E645F566D4B3DB4186C259BC84606855EA88938CEC4F7211BC9B461E39DFBB9E44CBC273E02D4314A037E0A26D60985EF5A35F069D8B51F86E9B6801CA067AB75565D73581EBBBBD98ECB5AF47509C8729D82EA0B35F0A376EBE6D90108CD61FBD0CEC966C17264F6A87864457F41162FF7210049E6CE2B5354F8F19161E0866D6BC3935815D9267C600DC529521FD092B126EC440D49B8E3A166587657B52AE9E2923644F72876EE94A61D2DB0EF4DAB33ABEC0C47A6A725D4CDABD06D4F6A30BD7C90DB3778C17B7D8CE82A5123B798D8B47C7F3E968C9E9F82A6EB3C2BDD8FC06D282F5CBF3050F6FF71E2EDF7A109F23AB47F427BD75163162C37722BF70A6BBEBEBE8FD9C39152AFEB78C37D718014F739F20BAAD1597B1F9C4E0B59FD82B834D83DAFFC935DE4A3272D7C2454508C07502943E90FDB56128D6E6009ED09CE80A9B60D51AA2E4E162F7F0C362F6886BBCABE29EF6C7F38B742000B9D152FF709082FAFE809C5DC9BCBC6F300B0A7840D0D36F39567D14D8227E7145F7CA670EFE917E0F18B0570DA3E05DDE56883FF12BC0C76C2A1E9FEFFBB728D991769B7D0B0D34853C76FC0655AE200501C28755F57934BB9F46A3C6AB1DD8E0161C698133F4F2D7CAF3392576B4BD2B6F8735D80BCF60656E132442BB7FCFDAE160A2DFE3F3FB8209B5C933201785A7E8206096B84A222A68E62501846273F6A9145820F87F450D12C64FF79A843E897C8394AD54AAF4F3B886FB00A6C37B2EFD0F6D4DD639C9989E7CA30E4F12EEF440946B61D7A28904E1D74009B6D1AEDF2FDA8B5991CB37795A8EE51BBDAAEA34A4C7040944761B9B4B4C12F455C536992A0852F7F07A9AEDA8E522591CB4831B0C79FA977AB6BC49C9730186855986035D2C6E5A6D93DA43E8825753721978AAEB433CE2F2A7D67C1FFEBFEA6F6059474D3022817A7329D9DD0E4A292302E4A57174B9C5346E4B6D75D65882CA7339A48C6E7AF776A8515014A20E4390F6B4F4A19990FA725F5A69B9C3BD4E8BBAEAE49979AC19600A3CEC6DE154985E236C3D0684269974BFC82301AC7196675F618182D7CF15EE5CE3B7ABEE0DEEA5C72F54CAFEF203D556B31327089A0C0DE94F74458CFECB481ADFE3CBB5DA422BD3626B00C4572B4C2BD7584ACD9129A76C616AAE51F944BECC4682AACAFB8E3BB1A42A6A8E5FE7BDEB43305A34A98308EF2D49EDE4F41361446A9AE4DFC1EE13D12821BE0B01E55B865B563633E5A19DFB6425CB60159C147B18A6419F5085C5D0882656ED533EEDF97674D0BABB6CF32F696DEC0F9921CB3DC9E6021FA198D554B1D83C42A0BF214FE4C0431547384F45AED9190CBCF98ED8278E8A03D551FA284C8A26218F0B0B58D99879DB98449CC99B6B399DDDAD9924E6A7EB20A0F1FDAD2F8138BDC7B445BC01503C509066B1603CDA76FE41727AB5E027DCB15032E8F66BFA84544D22C501AA6F62B02C0F8764387163CCADBF1ED7238E7F16C80E6C37AFEC2E10FFB95AB0A39784F9FCCD8AE263758ABE392727E9AD442A44738D77CB61A6B1540ADE751130489015AE5917C927232EED27BBF88481F3CA0C5ED2C31DFA943B2EAD4A8C80B4946E3C138A61BAF43A72C7A25E16874CBAE254D3F14C154F7C60CCF665B566799A01E0F769B60F73C17C840E0018C6FBC10EEDA3E35A77586B3A5936B363B2D5CB25C78A3E3AABBB84F1E64DF47F97AE1645650FE1751A724EA9BF80744D0F33DA6F313A3CC17D8F261585B62A75C167126D899219A26210DC55AB6DB2B94E6993849B4986F988EFB07478D6621CBF4B8ED772E61B0246A5582242FA20339B2D6CB89BA1B9210A318EB4697FD21EFCFD230DE9680514A442A13B29D8CB2627A6970BB97BF09C79C6ED7A27247662B25F39C8D675B0747F1A6D9EBBF7CFA7BC51A7EA3A7307EA4FA2A463BF53A645FE701FBF26628731CBC18636567AE633A49E59F6F049447803FA3D4F1F79F38026DE9B07D8610C9F01BEFB7054AA46E523E001C1EC3A4E7084DE0CCE596DC63D9C1F1DC03F35F9B1918E62ACB2640102E1D520E900969D53E83D2DBDDC80D1DC54BEE99531FAA5A8D2DBF8346C7ED123587353DD63823453DE350545C176446845BB3522A862F5D675419DA901CF7D2D1F7050ABFA3237D42753203BE251B0364379232D2D9D8642D52A60F6F4CB09EF29FA1E6069F97A1175F8447FE98A813CC182E33FFD8B8CAD93BF32A60F1A9E63A79A7F7FB9162783B89BB57F3E73155CED1D0084D5BA967F76C89C61C1A3E944F3B6F78D6CD3D1139A315C5276493481F3FFF9B6A6B40C920EEED9EFC74108C6BBA5A15DA736680A23DB5672C5A32ABDA24B49F2011F44FA8FF9C73609EC195025F0456D753C848DC6296920FC32DDE2174D37BFBCB86CF618AA0D486EE46C5E1EA14A3BAE4952AF5D4837F9B8122A19D1E59B909ACEBA6C849C8B452CD6CEF877A65FD83E6D0C6EE35886688F1D877612CB8E671D83216A1F76693D6A4D6A2EC13EB6CA2005328B3C91F51B352A707EF8180F320D6E1685C1EF4D87E3CB77FA549BC12727E59C11BDF8A9631CC272998253028CECEE8A2914182B90F586D80E7ECE370979BDE683F37123090012AB9243A4C145D6349C2791DC44E54956C5E9B59FAD017D3EA27D85B48A896671A0AC14A73B5AB9145D8BA6AEBF9EA25AC2E8E2C4D16C5009A83D0E84CEB80E95DF2CEC4CBEFC7F5B90A84D408E8C4855F9AA2987D9FC9D8A451F32B367BB1DE5271ED35EA153B5D400A6D8050EE82F519BD930245A96C9727FD24D8B94DC53D4B4F00D03172CD6B7F2BE163B6D16FD6247B01988A6EE6CE7BFEAFF78E983B8DDFBA4242730E52B57876E3719D1F9F6CBCC81620F848D23C31E3FFF7EBF2AFE5011E6466B1889E7EF6281FAF8B18A012CEB96796FCA9B28E78335DFCB85BBEAFAEBB0FA75EE2D0D391CA97E05F0FE43475135B13613206A0D88438F17EC8E604B007AFDCB9FA1378B7CB96675E0B19DC6FB02508E05A7FDAAF09297A3884AA051B6389A52F921F8FF31970FB082DF554226C2613B80CC1ADFF770024D6BF011C0F028A012597AE56F36EB6B3E864D79639810B8BA7258B18192B5CAA80DEA4B140D3C6F1D707ACD2256D676AE90980BA80E10B44109211ABA830EE96E1BBD248315C804D391A86AB7D4B3A4A37FED90D9867DA4B93FC32E79403E5D78AE99AF1CD2ACCE65D4F3384D9CEAB71B1E93B99704C64CAF17B999234361E378B9362D14BE3FD9E6C268013CB1FA2EA8361749D635C0429F796EB15A685E31DFE7A76AE870EBA120331AC830F8C486F6C0C4F07B658EBB9274A463E0EEA101481DD6B58835A303ACE802AE79EBEF51ADD98A67B7FF7968815ACF4504B9D360F7C0120A00ABA1FC558E6CBD8324EC35E0985294563A8D7ECCCCD9E3D1557A09885770836ECCC7AEE0F18B81E30F85D695440B5BCE29945CBF60FF402B281942D38EA33A4B03E9FCBBBEFAAC2C455E8A03FF3F35154132C538EA16F0605EFB788C3CA8435F6D595F776433585094ABC75BA581EC59AF701F66DD6091623E4676D167 +pk = E79859AE6628025E989609CB3E80EB5C31F03893B7A5A06A5984916144AC938A7203D0E13B5ADFD8AE32271386D69417879F7F591B146AACDA36F7071C551FD68DC3D43265B0DE3D73C3E28426AC79F759C1761BB75CB606168594C0E3EC4C0902 +sk = E79859AE6628025E989609CB3E80EB5C31F03893B7A5A06A5984916144AC938A7203D0E13B5ADFD8AE32271386D69417879F7F591B146AACDA36F7071C551FD68DC3D43265B0DE3D73C3E28426AC79F759C1761BB75CB606168594C0E3EC4C09023D3F21640848074D8ACABD1CFA862093FE1D6BA86708AB564B070000000000000000000000000000000000000000000092D1617E2D40BA3496DAA1188214EBD2F017E7B24AFB63C4CBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF035166725F31A35BCBB9BD8EB1B94C103F0244BFF7223A12EFF2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007FC9BE2CBB461D1BA109A26FC06D9ABF99096FB069210BB4E30A2AAE9874672B8F08F1A2F44E09727D621E1FF1B0A2001C651CB48D4E9A0B8027AE324F6D2D31602FB90993782483159A792FA08B7D08F7CA406B569C234D0E630E43F2816500D67B2DF052DBC3EF25DCCF0CA2AD58280446CC5CB1CC8CE324AC4B0B6EA51D2D718E6909AF3A256A8E23AD00A654BD00E9A7C1603DDC9BDC0DDB4C428AB8C339FDE87F4C131A201F04791149D98C062F3E12F47F278EDE454A81E2BFB691EC00 +smlen = 2897 +sm = 693743042A9D8204478AB4D99705A1D2BE4FB9420F4D4C1A0DB4EC37BA0E701CEB7DF0CBA369AC6BC615EF830088CE29430AC5D9E91BFF78D9AA025A7F4C05EFF31562FACBACA30CF39FE47154864A75969B1A44E6ADD1423D87B1C03135A1140003EB7AAB48A5D424B4D286D76885570DA362540ADB503F07C000EB1DE8300ED982B994512EA00CDEBF9E4C948ADA66CB36EE03BEB718584A8B8512D8A704A3C8BBFD141504D6AE9A5D33B800F66A9A69210F33815451DD66A7F57D0578E7E100884E2350000B8A22A07FB3C88AB3E004666DF10A5488104BCC028F4600040DAAFA792BFF719A3B794B2F8198EBD1556889C8C61EE6A51470AC9B274CB162AF44A26E2BA5EA7663C4C78B4B66B322ECACA8F2EBB6A610B51D7C4399F4A64A870C038797CAC80F709CA5C3C9FAFF7D797963E60983B584130C1B99328AADB2D261217CB95A535B8518A78A6D2F6CB8400C2AAA2DAF451391F7B8AB0277A3AF88E1CE6F1D3DBC386CBAFF15308F073D29838692E645F566D4B3DB4186C259BC84606855EA88938CEC4F7211BC9B461E39DFBB9E44CBC273E02D4314A037E0A26D60985EF5A35F069D8B51F86E9B6801CA067AB75565D73581EBBBBD98ECB5AF47509C8729D82EA0B35F0A376EBE6D90108CD61FBD0CEC966C17264F6A87864457F41162FF7210049E6CE2B5354F8F19161E0866D6BC3935815D9267C600DC529521FD092B126EC440D49B8E3A166587657B52AE9E2923644F72876EE94A61D2DB0EF4DAB33ABEC0C47A6A725D4CDABD06D4F6A30BD7C90DB3778C17B7D8CE82A5123B798D8B47C7F3E968C9E9F82A6EB3C2BDD8FC06D282F5CBF3050F6FF71E2EDF7A109F23AB47F427BD75163162C37722BF70A6BBEBEBE8FD9C39152AFEB78C37D718014F739F20BAAD1597B1F9C4E0B59FD82B834D83DAFFC935DE4A3272D7C2454508C07502943E90FDB56128D6E6009ED09CE80A9B60D51AA2E4E162F7F0C362F6886BBCABE29EF6C7F38B742000B9D152FF709082FAFE809C5DC9BCBC6F300B0A7840D0D36F39567D14D8227E7145F7CA670EFE917E0F18B0570DA3E05DDE56883FF12BC0C76C2A1E9FEFFBB728D991769B7D0B0D34853C76FC0655AE200501C28755F57934BB9F46A3C6AB1DD8E0161C698133F4F2D7CAF3392576B4BD2B6F8735D80BCF60656E132442BB7FCFDAE160A2DFE3F3FB8209B5C933201785A7E8206096B84A222A68E62501846273F6A9145820F87F450D12C64FF79A843E897C8394AD54AAF4F3B886FB00A6C37B2EFD0F6D4DD639C9989E7CA30E4F12EEF440946B61D7A28904E1D74009B6D1AEDF2FDA8B5991CB37795A8EE51BBDAAEA34A4C7040944761B9B4B4C12F455C536992A0852F7F07A9AEDA8E522591CB4831B0C79FA977AB6BC49C9730186855986035D2C6E5A6D93DA43E8825753721978AAEB433CE2F2A7D67C1FFEBFEA6F6059474D3022817A7329D9DD0E4A292302E4A57174B9C5346E4B6D75D65882CA7339A48C6E7AF776A8515014A20E4390F6B4F4A19990FA725F5A69B9C3BD4E8BBAEAE49979AC19600A3CEC6DE154985E236C3D0684269974BFC82301AC7196675F618182D7CF15EE5CE3B7ABEE0DEEA5C72F54CAFEF203D556B31327089A0C0DE94F74458CFECB481ADFE3CBB5DA422BD3626B00C4572B4C2BD7584ACD9129A76C616AAE51F944BECC4682AACAFB8E3BB1A42A6A8E5FE7BDEB43305A34A98308EF2D49EDE4F41361446A9AE4DFC1EE13D12821BE0B01E55B865B563633E5A19DFB6425CB60159C147B18A6419F5085C5D0882656ED533EEDF97674D0BABB6CF32F696DEC0F9921CB3DC9E6021FA198D554B1D83C42A0BF214FE4C0431547384F45AED9190CBCF98ED8278E8A03D551FA284C8A26218F0B0B58D99879DB98449CC99B6B399DDDAD9924E6A7EB20A0F1FDAD2F8138BDC7B445BC01503C509066B1603CDA76FE41727AB5E027DCB15032E8F66BFA84544D22C501AA6F62B02C0F8764387163CCADBF1ED7238E7F16C80E6C37AFEC2E10FFB95AB0A39784F9FCCD8AE263758ABE392727E9AD442A44738D77CB61A6B1540ADE751130489015AE5917C927232EED27BBF88481F3CA0C5ED2C31DFA943B2EAD4A8C80B4946E3C138A61BAF43A72C7A25E16874CBAE254D3F14C154F7C60CCF665B566799A01E0F769B60F73C17C840E0018C6FBC10EEDA3E35A77586B3A5936B363B2D5CB25C78A3E3AABBB84F1E64DF47F97AE1645650FE1751A724EA9BF80744D0F33DA6F313A3CC17D8F261585B62A75C167126D899219A26210DC55AB6DB2B94E6993849B4986F988EFB07478D6621CBF4B8ED772E61B0246A5582242FA20339B2D6CB89BA1B9210A318EB4697FD21EFCFD230DE9680514A442A13B29D8CB2627A6970BB97BF09C79C6ED7A27247662B25F39C8D675B0747F1A6D9EBBF7CFA7BC51A7EA3A7307EA4FA2A463BF53A645FE701FBF26628731CBC18636567AE633A49E59F6F049447803FA3D4F1F79F38026DE9B07D8610C9F01BEFB7054AA46E523E001C1EC3A4E7084DE0CCE596DC63D9C1F1DC03F35F9B1918E62ACB2640102E1D520E900969D53E83D2DBDDC80D1DC54BEE99531FAA5A8D2DBF8346C7ED123587353DD63823453DE350545C176446845BB3522A862F5D675419DA901CF7D2D1F7050ABFA3237D42753203BE251B0364379232D2D9D8642D52A60F6F4CB09EF29FA1E6069F97A1175F8447FE98A813CC182E33FFD8B8CAD93BF32A60F1A9E63A79A7F7FB9162783B89BB57F3E73155CED1D0084D5BA967F76C89C61C1A3E944F3B6F78D6CD3D1139A315C5276493481F3FFF9B6A6B40C920EEED9EFC74108C6BBA5A15DA736680A23DB5672C5A32ABDA24B49F2011F44FA8FF9C73609EC195025F0456D753C848DC6296920FC32DDE2174D37BFBCB86CF618AA0D486EE46C5E1EA14A3BAE4952AF5D4837F9B8122A19D1E59B909ACEBA6C849C8B452CD6CEF877A65FD83E6D0C6EE35886688F1D877612CB8E671D83216A1F76693D6A4D6A2EC13EB6CA2005328B3C91F51B352A707EF8180F320D6E1685C1EF4D87E3CB77FA549BC12727E59C11BDF8A9631CC272998253028CECEE8A2914182B90F586D80E7ECE370979BDE683F37123090012AB9243A4C145D6349C2791DC44E54956C5E9B59FAD017D3EA27D85B48A896671A0AC14A73B5AB9145D8BA6AEBF9EA25AC2E8E2C4D16C5009A83D0E84CEB80E95DF2CEC4CBEFC7F5B90A84D408E8C4855F9AA2987D9FC9D8A451F32B367BB1DE5271ED35EA153B5D400A6D8050EE82F519BD930245A96C9727FD24D8B94DC53D4B4F00D03172CD6B7F2BE163B6D16FD6247B01988A6EE6CE7BFEAFF78E983B8DDFBA4242730E52B57876E3719D1F9F6CBCC81620F848D23C31E3FFF7EBF2AFE5011E6466B1889E7EF6281FAF8B18A012CEB96796FCA9B28E78335DFCB85BBEAFAEBB0FA75EE2D0D391CA97E05F0FE43475135B13613206A0D88438F17EC8E604B007AFDCB9FA1378B7CB96675E0B19DC6FB02508E05A7FDAAF09297A3884AA051B6389A52F921F8FF31970FB082DF554226C2613B80CC1ADFF770024D6BF011C0F028A012597AE56F36EB6B3E864D79639810B8BA7258B18192B5CAA80DEA4B140D3C6F1D707ACD2256D676AE90980BA80E10B44109211ABA830EE96E1BBD248315C804D391A86AB7D4B3A4A37FED90D9867DA4B93FC32E79403E5D78AE99AF1CD2ACCE65D4F3384D9CEAB71B1E93B99704C64CAF17B999234361E378B9362D14BE3FD9E6C268013CB1FA2EA8361749D635C0429F796EB15A685E31DFE7A76AE870EBA120331AC830F8C486F6C0C4F07B658EBB9274A463E0EEA101481DD6B58835A303ACE802AE79EBEF51ADD98A67B7FF7968815ACF4504B9D360F7C0120A00ABA1FC558E6CBD8324EC35E0985294563A8D7ECCCCD9E3D1557A09885770836ECCC7AEE0F18B81E30F85D695440B5BCE29945CBF60FF402B281942D38EA33A4B03E9FCBBBEFAAC2C455E8A03FF3F35154132C538EA16F0605EFB788C3CA8435F6D595F776433585094ABC75BA581EC59AF701F66DD6091623E4676D167 + +count = 81 +seed = 3D598F7C498D8A1095C40945975380554BEF6142578638A7627E2C0A21C59C579F8E8CDA309348FC54C764C899FB93E9 +mlen = 2706 +msg = 63EC08B711DDF5C66036A13F574BB7BE76445A1D1F83C7732B9F4C25FB9E799D4AFA55817BCB39B974AF92F3730767CE7D863B6A3406450DCBC5E0145D10B7D532DA6E80196157C38D1B6D3C173F74D67AD8DF24ECAD4D9B59921418863A38270B982C4392225EDD1845AED2199E2C38B36C7E0E5D2F3CC7F6803926D977C59ECDAC67CA290658E72BAD633358FCDDE2A4B9C40169A0C7CCCFDD93E4DA3C3838E9308533BD468A9128C5A141C4842840E45BC8E4610A7C5E7535834C5EC73312A50197C76AE984B3521883F549BE04E27D97580E6D85D0EE84CD0B8C65BFB1AA005C607DE82DA70021F8F90B7912C67DC5657E1882CFA6DA3DE1BA4ED823789C052649DEBC9085C74528162243133A6AE5C1C6BCA3F730525B167D816485E40C208AFFA8706E3D74631EB4413032730A7647548B77579323EB03D36C2EC37D2389D4A17305F607C78F3073A2F4B4395BBC94AF163ACBE3C990306BA3F89AF9AFFE785C3F6D102FB2BD55F0C1044034D6A871293B31A1B38E383CB926BAF3AB4B5F79A47E9FA7B77BCD58AA35A7F16DDD11FF642069A8A327DFA800049BABAAB4AFBEEC9FA98ADB9796FBEE925BB70EE9E96540436E1473E3AE4C56D7099D8DBDDE755A7E101BCCEB596B9415F52374C8A3A73EC66B229DFD8CD7EE7D2CF1C5E7F490C7D9381D9321B15F84F640017851ECED1DC80D32DA3A0A57ADC3EF37E021031866E278C7D51FF5CA8E9ECEA1082423B41D772C5ADC61A8C71C3D4CAAAA3433928D7931EE715875BDE2BFACAA0A7F799B45241C21BD2ECE4A5944FB6890BF24908DE58DD3C76173373254A36B0B2AC7D67926948CC0136DD9A5079D776C297FB6A585C290D5DAE1C45E91153299EEDB731E527F0F62E83C1E93C75FC74F9C7E63311562B0A55459A0D41E034C3AF637EB29BC789E5920DAADF265F42F2707DD1AD490B5F8A8D24A9968BFF11A0C364A779EC385A9A33EDB9CFC7DBC672BA60CE5F421B40634270B982D619F8E7960D32E1B8A76CECD13A3B0214DD34214CB5BB7FD530058D5DE1FB9E4E88ADCA05926CE1F5597100F55DCBF64D47FC177FF87C4BD9F6ED7670FA7B7D339EDCCE6FC1EAE069E0C303138689DDFD23396C145B79AFCF68125989C8477BFC318CDBD69D1AA6D3EE41F4B1F9BE4BE9FA58A072412078CB9196556EE56FB7B2A2761DD04120FCD9AE9736F599C8B96BF8F964B305530A6DF1F94874F36F07962F87ACC0B285EDA64D2E4857E26BED40E9A5DC0327F1D91259292C608D6C6D59804DC23A34D1F9F1B69331D68771E41542FC5D669CBC3CD7F8310F87E8FE8F6201E57B475DE2318EA6EF9F7D32A728A44334CC9DF28DF77038C37CBA62EA8CC5EE80E571879AD111F35B6A154FDF8D40FC93360D547D02F0743A37EBC4AF178C6CE36C92CE6B80B6350202D2978621684A19AFE1474155BB962014587B1F5A477092F42BC446D7811C0EB439A6829E538077ABBBF03F515F1E6AC018EFB05AF79069C2569D2CD7140C4B1B47886064DAC695D59FDE2D8FDDB35318D33EDAD94AD4FD988095B1156FD59551F0658EE666186369BFA84E30672E4659BFBF7963C377F0039E08DE2C2D9803FC12D97B5E67CE9536AF12DAEB3B9903D8D95F336FF53286284BFE8D7AD13EC21C2A9BA93C9A97BD7F6148DE7C8CB41CA75A9ECC8F9CC68D888FAF6B3E75376B5B16F41E7E6B76A686EB365365E2074FB1D7EFB1B285A2357B020FD3E47B89943FBC1596F3FA8289AD844386A691F33DAED4B7A6A6729526160F2D32BA7F68AE6678564FCA05BD811F208A8FA62F6731F23D46027008246FD4BF3C454A39EE225245E74DA5910E7937B36661548A55A2270A9D27114DDC94DD9B9D4122289DF0A5700222A977F15FD8E36AFA1C4870BD3CE9B658E2D83882AAC5F3DB814346240FF8C8FBA3F36E52AC9B441C76B6F104A0931BC45E202ADDCACCFB93A486A7734A6D82B9F6CA911448F988626846D413D987C5AC860FCC0D5F734269AEF88D41A055794DCE832BABB7E306F622E5EAEFDBE1CF195E320A1ACEB4834B3E70061EC2D624C12EB35B16E5AAE73053A3290D4BB1F51FFDF48C1A7218D365DB7FEC15BF0F710954CDEC54917600014BDE3A901DAB1DEC0844D7FF148EDED9788CC85C0CFF26E5895D91C56BA6950C0BA8FC6C773AB4A6091A5DE3AC335DDC2110EB0144FD89B3D815EF4A26F718C1ACB5723AF1DA5515442A03CFB9D90623FB21D78DAF441000E285E9E7C235C0F31E258E6B3FEAC048DB652B83E07848D2E9357649372B1A55975B2EC7FCFED19D0B6613BFDBB4B5B01A9AA3128AE137BDC1D8FFC3A38B597578042CF183BA8383C289C3D92F6B70AA9B3364E9FC5D43F3CD3F310D229912E91D5806C2A11E0BDD208A2AF438BE77B43680E2DE67918FD414338A763910E1316965BF96BBF7DF639266D075E90EE9C073011F6783750764FBE4906ECDD94EE9FB7E4AEDB23EE88EBFB018C44FC8BAFC66E6B454A3D0E332C7A6B34C2E8D1D26416FF43D768CC36CA9D3168355F1A281A6B2EAAEAC7B64AABBAD2156A1D781A78A896248C56F3491A5DDA8C22C231AA7AE14BD558F66E6280FA65F20B246D815BFF1D3C6CEE6DF9B4AA7F750307A7BF73850E6BCD22CA0AD74B4AFC13CD4AA2FB7E7B588ADB3A46A23EC88A34F13214B261A283AE8FBCE8007C6EF6BE255C33218AEBECD3EC27EDAFD252994B70BD67407620D26E8567F4C7F6D636803B6A27EACC3B853706A8D57ADBF7F7E142FF149C35119A6172D5884EDE7C71E6C34D1B485A684DD56C9D670576B75CACB870A68EA7FF2BB461D9E2FDBF500B2F200110265A3CF24370A3F480DA66F98FB5327B4CD796EAF0E559A5519F3C643B59E3B89D05D2A9F9DA6732CDC2996408B7FAB5A734310FCD73FA3FA5CACAF31AB04EC0B9734407C6DC575350212239AC9092DA5812137BFC40F7735BFDF9827F768FC0363FC8C5739C7DF828075EA2BBE6321D5A8EA2EB7E397C3D58A953C7F0BAA69A96AC8110B125EE2E9701F43EEB87FDF58A6E6266BE1136437599E26E8E6E853DBB6ED9DF3931C5F402FD09B7E203AB36EAA6EEAE72E908BD2B9CFD379BC9B407F0C882807BBD2E91F920EB24137002A48F1AAA0CBDF89FDE5C51079F1D8CF7A014207F1B40773321AD952D77CE18EC7B48F2CA054E65420C1132AB67C832EE22FFD8672803CCE3DE7E9FD0690E55FA1AF5F11611E3E2C71CED55E3E347F4CBEB9C93BEC2B98E48495585392471AF0AE589257ED8D01792112C798BCA5107030F207CE567594B8433490D8FF1811F21B03A42AD0678927183321355E3D6908DC1125CDCE038CD0469D72458B6CC5E67EB0D78C20819C6F3C4518B15CC63754FF8679915E329DD46FEAEFDA5249ED7E754E7BD55C75CB764B6CC36BC06267B2479CAFBB3F0BAE32A93558190B65C85DCDC080CD56D51D4105C5B0717691D4DB1893EF8AD550F55855B4123A38D18FD67B588A3A4C2A6604E874D721359352B235C17AB1DA2758712AF8179FF433211B93078735F909F985F557D0DE52CB9203DDC67BF9DC8632ACD8D4F90196AF6BD2E79834371C5E9FDF5992ADB04AEA186AF36F56271F763ACFFBF94DF4B0512CA6B7CA8FF486504E565BDA367E044FCD0F25FBC2A6C720867F95BFD92109780D2E6DD60CE90A4CA8EEB8C4CAB289DCF99E687B017B37695C3B99B4FE97D7E5D52BB9813C04D03C9AD71770FE0986C7F3A3FFD3A261AC771DE88C7ACDEF253E5CE2B50BC5C576D132B68CCC694BA883770B80F5ED7D527CEE816527F69CA2C101747A0088879C3663037DB5B +pk = 77DE3A17913FD1A2C293BE3F90F575C69728E7361AE956779DF827102C2EED76D2337F9EF885A8314A977058B3E83315EB1B132D7FD05A43C9540B002C412C23AF08AADC2AACCB1A9F9D9961453D10CAF45D01D443654D169C91E613E2B75D220D +sk = 77DE3A17913FD1A2C293BE3F90F575C69728E7361AE956779DF827102C2EED76D2337F9EF885A8314A977058B3E83315EB1B132D7FD05A43C9540B002C412C23AF08AADC2AACCB1A9F9D9961453D10CAF45D01D443654D169C91E613E2B75D220D4F3BA7F012B23D2E4E2CC84E460BDCE4E4019F63F42F6910080C00000000000000000000000000000000000000000000F45FF0D97ECF31FFBF586AA232A99935FF21D41D97131493F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE32E0CDE040E8534B0ED4BA2A3D531EA62F7BEBF1FFA7FB40BFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000291482AE24E930B189FF3D1E5FD2C0838BC096F3ACE7DA2ED4CD5E15FA1CA3A496148F18BA3271BF6E48B507D1442A009956ACEE0C81D747BB4434CC5344919CAF2357F5B09423AC56A87CB78A7309133F12DB0DC2E86061FF92EF1AD05C76008D9056D8137BD32EBB51ADDF4A48950527AB0552569301B907B00BF40CC1EFF76F1A48E38E2E8B169DAE4AB176CB550054658EF7912AFD78A7761FD22D80B796BEF6DDD130DBE3B9B7941E2C144CBC9B7F8E335545F8133E9B92E8590A958800 +smlen = 2930 +sm = 38F5E92E5C90B568C2443E985B5CFE3B48E18A4EF5708E7E52AF54C9460A8566282B711FE892F49A210EC678718FEA3D7F5A1780EC36E8D6A2C6BB7541D874EDABC18EF24B3D798781415E310D2652083DBB498FB9672ED1D95F39F8AA982F3D0004D53B0FC2777CAFDCD99B95CEB4F3CD4E8CA1D183BCF4253701368F8F8387BECBCAFA1F27A83D575B5B471C691656F2207000D4472C807AADF8B939707C3A280E24C685A87210D68F26EE01286C1D04661FB500C27444A85041096BF0E920BE32241CC102662428146775FBF809120C43BBD6BED7CB80BF573469C4000D1563EC08B711DDF5C66036A13F574BB7BE76445A1D1F83C7732B9F4C25FB9E799D4AFA55817BCB39B974AF92F3730767CE7D863B6A3406450DCBC5E0145D10B7D532DA6E80196157C38D1B6D3C173F74D67AD8DF24ECAD4D9B59921418863A38270B982C4392225EDD1845AED2199E2C38B36C7E0E5D2F3CC7F6803926D977C59ECDAC67CA290658E72BAD633358FCDDE2A4B9C40169A0C7CCCFDD93E4DA3C3838E9308533BD468A9128C5A141C4842840E45BC8E4610A7C5E7535834C5EC73312A50197C76AE984B3521883F549BE04E27D97580E6D85D0EE84CD0B8C65BFB1AA005C607DE82DA70021F8F90B7912C67DC5657E1882CFA6DA3DE1BA4ED823789C052649DEBC9085C74528162243133A6AE5C1C6BCA3F730525B167D816485E40C208AFFA8706E3D74631EB4413032730A7647548B77579323EB03D36C2EC37D2389D4A17305F607C78F3073A2F4B4395BBC94AF163ACBE3C990306BA3F89AF9AFFE785C3F6D102FB2BD55F0C1044034D6A871293B31A1B38E383CB926BAF3AB4B5F79A47E9FA7B77BCD58AA35A7F16DDD11FF642069A8A327DFA800049BABAAB4AFBEEC9FA98ADB9796FBEE925BB70EE9E96540436E1473E3AE4C56D7099D8DBDDE755A7E101BCCEB596B9415F52374C8A3A73EC66B229DFD8CD7EE7D2CF1C5E7F490C7D9381D9321B15F84F640017851ECED1DC80D32DA3A0A57ADC3EF37E021031866E278C7D51FF5CA8E9ECEA1082423B41D772C5ADC61A8C71C3D4CAAAA3433928D7931EE715875BDE2BFACAA0A7F799B45241C21BD2ECE4A5944FB6890BF24908DE58DD3C76173373254A36B0B2AC7D67926948CC0136DD9A5079D776C297FB6A585C290D5DAE1C45E91153299EEDB731E527F0F62E83C1E93C75FC74F9C7E63311562B0A55459A0D41E034C3AF637EB29BC789E5920DAADF265F42F2707DD1AD490B5F8A8D24A9968BFF11A0C364A779EC385A9A33EDB9CFC7DBC672BA60CE5F421B40634270B982D619F8E7960D32E1B8A76CECD13A3B0214DD34214CB5BB7FD530058D5DE1FB9E4E88ADCA05926CE1F5597100F55DCBF64D47FC177FF87C4BD9F6ED7670FA7B7D339EDCCE6FC1EAE069E0C303138689DDFD23396C145B79AFCF68125989C8477BFC318CDBD69D1AA6D3EE41F4B1F9BE4BE9FA58A072412078CB9196556EE56FB7B2A2761DD04120FCD9AE9736F599C8B96BF8F964B305530A6DF1F94874F36F07962F87ACC0B285EDA64D2E4857E26BED40E9A5DC0327F1D91259292C608D6C6D59804DC23A34D1F9F1B69331D68771E41542FC5D669CBC3CD7F8310F87E8FE8F6201E57B475DE2318EA6EF9F7D32A728A44334CC9DF28DF77038C37CBA62EA8CC5EE80E571879AD111F35B6A154FDF8D40FC93360D547D02F0743A37EBC4AF178C6CE36C92CE6B80B6350202D2978621684A19AFE1474155BB962014587B1F5A477092F42BC446D7811C0EB439A6829E538077ABBBF03F515F1E6AC018EFB05AF79069C2569D2CD7140C4B1B47886064DAC695D59FDE2D8FDDB35318D33EDAD94AD4FD988095B1156FD59551F0658EE666186369BFA84E30672E4659BFBF7963C377F0039E08DE2C2D9803FC12D97B5E67CE9536AF12DAEB3B9903D8D95F336FF53286284BFE8D7AD13EC21C2A9BA93C9A97BD7F6148DE7C8CB41CA75A9ECC8F9CC68D888FAF6B3E75376B5B16F41E7E6B76A686EB365365E2074FB1D7EFB1B285A2357B020FD3E47B89943FBC1596F3FA8289AD844386A691F33DAED4B7A6A6729526160F2D32BA7F68AE6678564FCA05BD811F208A8FA62F6731F23D46027008246FD4BF3C454A39EE225245E74DA5910E7937B36661548A55A2270A9D27114DDC94DD9B9D4122289DF0A5700222A977F15FD8E36AFA1C4870BD3CE9B658E2D83882AAC5F3DB814346240FF8C8FBA3F36E52AC9B441C76B6F104A0931BC45E202ADDCACCFB93A486A7734A6D82B9F6CA911448F988626846D413D987C5AC860FCC0D5F734269AEF88D41A055794DCE832BABB7E306F622E5EAEFDBE1CF195E320A1ACEB4834B3E70061EC2D624C12EB35B16E5AAE73053A3290D4BB1F51FFDF48C1A7218D365DB7FEC15BF0F710954CDEC54917600014BDE3A901DAB1DEC0844D7FF148EDED9788CC85C0CFF26E5895D91C56BA6950C0BA8FC6C773AB4A6091A5DE3AC335DDC2110EB0144FD89B3D815EF4A26F718C1ACB5723AF1DA5515442A03CFB9D90623FB21D78DAF441000E285E9E7C235C0F31E258E6B3FEAC048DB652B83E07848D2E9357649372B1A55975B2EC7FCFED19D0B6613BFDBB4B5B01A9AA3128AE137BDC1D8FFC3A38B597578042CF183BA8383C289C3D92F6B70AA9B3364E9FC5D43F3CD3F310D229912E91D5806C2A11E0BDD208A2AF438BE77B43680E2DE67918FD414338A763910E1316965BF96BBF7DF639266D075E90EE9C073011F6783750764FBE4906ECDD94EE9FB7E4AEDB23EE88EBFB018C44FC8BAFC66E6B454A3D0E332C7A6B34C2E8D1D26416FF43D768CC36CA9D3168355F1A281A6B2EAAEAC7B64AABBAD2156A1D781A78A896248C56F3491A5DDA8C22C231AA7AE14BD558F66E6280FA65F20B246D815BFF1D3C6CEE6DF9B4AA7F750307A7BF73850E6BCD22CA0AD74B4AFC13CD4AA2FB7E7B588ADB3A46A23EC88A34F13214B261A283AE8FBCE8007C6EF6BE255C33218AEBECD3EC27EDAFD252994B70BD67407620D26E8567F4C7F6D636803B6A27EACC3B853706A8D57ADBF7F7E142FF149C35119A6172D5884EDE7C71E6C34D1B485A684DD56C9D670576B75CACB870A68EA7FF2BB461D9E2FDBF500B2F200110265A3CF24370A3F480DA66F98FB5327B4CD796EAF0E559A5519F3C643B59E3B89D05D2A9F9DA6732CDC2996408B7FAB5A734310FCD73FA3FA5CACAF31AB04EC0B9734407C6DC575350212239AC9092DA5812137BFC40F7735BFDF9827F768FC0363FC8C5739C7DF828075EA2BBE6321D5A8EA2EB7E397C3D58A953C7F0BAA69A96AC8110B125EE2E9701F43EEB87FDF58A6E6266BE1136437599E26E8E6E853DBB6ED9DF3931C5F402FD09B7E203AB36EAA6EEAE72E908BD2B9CFD379BC9B407F0C882807BBD2E91F920EB24137002A48F1AAA0CBDF89FDE5C51079F1D8CF7A014207F1B40773321AD952D77CE18EC7B48F2CA054E65420C1132AB67C832EE22FFD8672803CCE3DE7E9FD0690E55FA1AF5F11611E3E2C71CED55E3E347F4CBEB9C93BEC2B98E48495585392471AF0AE589257ED8D01792112C798BCA5107030F207CE567594B8433490D8FF1811F21B03A42AD0678927183321355E3D6908DC1125CDCE038CD0469D72458B6CC5E67EB0D78C20819C6F3C4518B15CC63754FF8679915E329DD46FEAEFDA5249ED7E754E7BD55C75CB764B6CC36BC06267B2479CAFBB3F0BAE32A93558190B65C85DCDC080CD56D51D4105C5B0717691D4DB1893EF8AD550F55855B4123A38D18FD67B588A3A4C2A6604E874D721359352B235C17AB1DA2758712AF8179FF433211B93078735F909F985F557D0DE52CB9203DDC67BF9DC8632ACD8D4F90196AF6BD2E79834371C5E9FDF5992ADB04AEA186AF36F56271F763ACFFBF94DF4B0512CA6B7CA8FF486504E565BDA367E044FCD0F25FBC2A6C720867F95BFD92109780D2E6DD60CE90A4CA8EEB8C4CAB289DCF99E687B017B37695C3B99B4FE97D7E5D52BB9813C04D03C9AD71770FE0986C7F3A3FFD3A261AC771DE88C7ACDEF253E5CE2B50BC5C576D132B68CCC694BA883770B80F5ED7D527CEE816527F69CA2C101747A0088879C3663037DB5B + +count = 82 +seed = 6CDB757AD36DF99E52F535C2680431D5FF36C812D8EA19399F666F2FDD66D3A842A7A5AE1038359AB618FA58A0A6E840 +mlen = 2739 +msg = 7785A08A3892C97D5EBFE52475298BA444674086D63E17E1FAEC96F6B10723447FC1B8CC758D1724A33E26518798183A4B3C99A7DA54038B86473DFAB8E626EB3BF54DE5581E04450B2821F5020C466505990B173DB9F030CFCFA505AA04B37CF0A063876843A042F17AEB1728787187428F8D1010D532C94C7AB2E1193994BFF0CB56415FCD2A96BE7F7FC2C57C8313E795367A22B6A17CE3B803083A74FDBCF030D91C957128099D6199686F2BEA618CEE111AA9D55A6F9E8966C102D849ADE596A1B576924DE0E92DD91FBB01CD93E24AA71EEF219A78430D84965672FE6AF091D46DCFA9AB906F6240913C1286EE0A152666ECFE2C154CD3FB14DC0F9C173E30FC9958A75AA6DD74822AF7ACAD243FDFB743E47E48280990C2870904EF1C902261D0BD6BCFDA91412BDEE9A28C628F218E7648AA0027D918B48EF30A9B18390331805C6739BF6A2CB69A0DE8766A7B3A448910D181F6449565A363430BA1C0FA8B11E1A151F6CEFA3870C3B1D8CD800983EBD41B48C5624269EFB440DF23FF9BCB31A4B02F6505DC862B2103F76137FC6560F893577BC3FCE92ADA27F291305F2345AC82A846854F172131B042735D4B76C6AB2DCFD32BB6258B23AC790AF2AF7624451172FA7A29E0C5FDB3DC3B719B274B2838FF7A8B25F272AC8EA90FA3C8010AC7F65633EB43FF7A0A95CE99717F35D3C416B0E0DA30470B5AA20EB9E2B66315B9407A4753DF8BF505B8066C5D57EC4CCDD2236B9C58BD7337925191ED7B75B92C9CEE626F13EADDECB07173C8160540FB9F6A4D43A1E9AB263B300C08966C247514647DFAB3B420202529E963A51F8D23BD0F689BBC4D67D5A603B876E8CD3EC0770F0D9694DFC30083991CF3989DB1812B4AC5452358075534190F012F7C0E47734C3BA748E04910783C0B845484461DCEA67A1EC731354B902557486B484F67183FC711D10F906C68CD01F46481D040F084271DD784E5B958AE05B65BF5D207EFBB5FDEB25366D6FF4161CA3A1CB71B2B9F90F86A315D800935AC0086D85D907A036C4333EA347000A0755550B68FE3DD7686E416483781B563680146697D6FAE8333C24ADC8A2436852DDADF6061E2B16FD3829C0B55C2E9C2C89F64CB8DA02A6706498CF0330742083E9AC4593A1762D32DC4E6CC2D9F4310014FB15DEBBEA324EBC2EA1E1660782559B9B39FBCF34C85FDA9AD350D195AD7587AAB621EF7FFB63277CE35AB43B01977C9F8DD6C2AE7B34FA7B35D5FA37D8B3719E736F18734CB3A2468BE9CA0832DDE0B958925A377FE6751C4EB8FF1AD295355302F0A5ED4E8F8C33FD5162542B8ED7CD985DBE3C84401830F6A7EB9D955EC74C7F98B02388B4E1353317CDB5EADAAC9025038CC01F8655C7FB9AEE940FC4B282748B39D277A7FEF462038833A9A8EB50A8719F68B3E858825911F294A80FAEDE9D4C1815844C2632DD20387950003DAB80B1A58E541A5E6658AF7D4CDD91FD1C08735B584F5C69C5CA94F6B7F97A4761B127DB394AC72E902DB9EB4B3E0B884C448FF2763FF9ADD530753263688CF92BB746181C17294BFFC2A0B3969A7BBA429A481C425B24745CEAD66286F5DF04F1E4421C56ACAA668E87BA58E3B07A062D1DA60CC6B411667BDE6F466B72C9169965BC7781DA78A818F779A9B3D7A577F71A1DF49AAC865A0D6F2668CFD2C77CFA8D306A14DBBDE4D3A3818B07DC89D5F51E117F7BFD007D60F32BB1B6BB01E76862398371FB91E0A3D4B39FD9146C47F627A066618CF83C32E5C82592B418BD2F5DCD8D42234625974F988A6F729C60BA5EAF18C77B611DFB187A581E3A10268A965F650FE242CE2FE08AA71515B59A6EDFC9CBDAE22DF3AEB22E773CC2EB373619E9CDA23C236CA3F7845C2136E93849D9F6AA1477F4513358CD8CB4E21444C9E5709818801EADFCA23F2C23DDFD5B4EBB6089DAEDD14A21EBF3F7A8C1C80BBF7D37973BD156AC5C4462D29DCCB7EEFFA22A8B6CE433B600532F33999ADC39196F01230614767285089FB262D8469DC66D24AE0B77FD05C3EC02FBC5EE328319409B8E2D7B0AC6801C1C8BA86F793C2037C71E2A25F114E9EE0EDB3B83076EABFDAFEDEFA0548DAE91E62CB7C29C03413235B8C6EB9F46BE29DE8F5D30E8D97DB6F45687DC4719B1024E48B7DFFD0D2B474B2032B4E69B6382E603D4777F3450E2E467C6D9AB2782C0AE266C320D36BF67BD6B86EA9721B22741684D9C0CCC774335430071A5410C1E34B4BC1A823A93A38F5AB4781CC593B13A593867FB634C0C705107CD278C6CCEE6D842748BFBD2FFD205C6BDFB3AC87F693C25C832C86D96B00BBA0AF88DCFBC8CA4328765DE27FBF1389C4EDE28317BD0EE447F030990E957D223A5EC66CED9D16400AF6DA8663C4E4111B4584F8F0066CDF8258D90C5D7B439503E3AB3FCC55FDF933E06D704416187AAF86E6C39695DEA8B8189EC1299670BE03B6A636889CB7F10F04CCD67278E77886CF3F6E2A05BA8D25AB8664EA817642ACF5DB4D9B3EF80E169463EDB6BFDF67172E88D233609B091BBD085B970DB8AE0DAA5048CA42D6A54042F42445BAB03F9BF1ACCEF341B7349109BA0073D3715A9073AD9BED258268AEE9DD5202E0EDFA5720A317EA5CB41706C0D235465BECDC8E3FF0D628EE5EEA6AAF1BBD3E18FE9217516893DF115E979C4CFFEC494988B6F9B86026610898C44AB1547C5F8ED5CBF3C3A837DDB6A444BD3E803E1824E6AB931310FE86B36587F1B34B0B48D358F4B97E9774213DE7D92571380BE2199E703119C5B9836DADFC826B71D588250AC37DE0EC05C5823573C102BCE44C9F044507671C4E1723950A3C0E14968CBABBFEEB049EB723DB9B23CDF0273525C29CC5165530A1F1CF830D3551DD6BDED53954947D5C334DC9C71907CDBFA109EBC52D6305477C14159257AF8C51C6F09D76FC0085C3D969EC60FB09145E66A8A7489611DB3FDEFC35202B8AAE82D3CDF666034BEFF49FE49A45C5EC438F4118F338545532CED916DE78E3BF82B4E55907474386B9C172F393EFE895334F7323CBB2AA7CE7718BEF5E7A23AF734BD4963FBC7889AA5C50F3955B904B5E577D71B21A293D766865E3F8C212DE5EA084A9D22748A8009A7D1858328A1BDF7BA0F4E3B83BE9707629252B3339CEF796696855A574B4A4896CA68C3D6A6824E3F593069EC0A571E61282F8A29BEB8BD788F7B351A8939CDAD9E257587A77804F2704F49DB3305514B85B449AEE56EE40CB2A75D51690194284AACD0855B02893F8DCD3091629DC548705A1085E5CC33DE7726A0F521C149003DF380ABDAE96BCDA55C44BF9BFA1103150F049563E848A8750625DCFDD9BFE02E1E57489B5B3AA28BEAA80F4DAA562DEABB4BB6A27125369415885020D237A92CCC3A23593FE2183225BFA2FF39B0BEF9CB0425375E256BCD572175483F713BD38F937F2B3D4C1F686C5AF60061E0B05CC3EBAAB0AE8BA21E47A8318BEE4A01516046363D152936A1344E17A65E08030522EC667233145A56001B8D065DC2FED0D2A9F02C981A8962F984916314805DAB644A5112CAA1564895121D8B1FD046F547BE282CF979752883EC79AF70CF59A88D960F3336F0AE61357877AAAA34699A876144B65CA5B77A684D850D09B3D42CDBFC4539EA103F8377CFE5F9E5432403FAB416662C4C83226191EEB7F82B01E0819C081FC40E7B978669C7856067E8B582832DD0B92588103C2616BA2C7774C46840318CA2B1A3798FF7ED9FEC087F01798EA2445B92E67E2446126A7406E82FF8D3711311BE16E9171531A95C966E6BEFEA34938E6F5FA660F7C7CB533A119377F1D26AE6AE51D805AB96A64C8B80D6EE137F634B384C2E377 +pk = 5C2398340A0F0CFC6E960527C31AE18DAE87822F75C1ADF4DC6EDBECCEC6C1779C640B955CA0C929505CCEB531E690395946348676CA5109BCFD4C38662D0F74FCB613642AE0A6A3CC3DE4FED0D643D2B6CD3870EBB2F59A31B80E99EC56AF120D +sk = 5C2398340A0F0CFC6E960527C31AE18DAE87822F75C1ADF4DC6EDBECCEC6C1779C640B955CA0C929505CCEB531E690395946348676CA5109BCFD4C38662D0F74FCB613642AE0A6A3CC3DE4FED0D643D2B6CD3870EBB2F59A31B80E99EC56AF120D21C248C30983C2F68F45AF273F1110E59619307C11D519212D0100000000000000000000000000000000000000000000B2A55856C5412D40023EE3720B031127DCA5BABDA8AC5BD408FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01CF6A4FDBEE879E20F4D0A88434D3D57E9C116F1B52BC1CD8FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B344EA1C6D07EEF2A2BD32815C58700F368070A5C18FC65867D7F765AAA3DBEB1B5AE92986165C5EAD25A9E8C307E00C881ECB4A6067686E2B6138E841E47033AA00BDF4AC6EEF45A50E9ED9F1770C6ECB6B2F060ADB6F6E0A4B875E812D000D1967440939EB3CBD2F74B4D681F4EA870586F39815A420A767A87E065AFD1992172657C7D1AE3BB9284627B02CA68007345BF47F973F17FE4F7DEB4C2CF227360AA93683286B09D01B75576BD6F1313B10C53D3DFB3DB495133881B369B2D00 +smlen = 2963 +sm = A924C44DA7605536B88C17792EF9723968A48FB3B5CC12FEE66FCC3D70DB9FCE9BE4141B3D4A6EDA83471EBC37BD1814AF6D7D01BA3FBE71B98093F0922B647D46BDE31B5B9DA1978B80E2E033BEB4CC0B8B8BEDC4A93C563F13E4383405CD1100015B46DABBB4AA3D21E631933807DA772A43EF646D86715EBD03FB76F1720D999DB0E119B0EDB02CC86490A11028F0C28A8F0147591366B1B3F3AAFD311B46F8E4DB66D620078A5C46015F02C5FAE39228470EC38EC1C530B2C82356E401670C68494A93007FF9A21FB05B76ADD74EAF034CA38B2A2B02342BD4FB33000D177785A08A3892C97D5EBFE52475298BA444674086D63E17E1FAEC96F6B10723447FC1B8CC758D1724A33E26518798183A4B3C99A7DA54038B86473DFAB8E626EB3BF54DE5581E04450B2821F5020C466505990B173DB9F030CFCFA505AA04B37CF0A063876843A042F17AEB1728787187428F8D1010D532C94C7AB2E1193994BFF0CB56415FCD2A96BE7F7FC2C57C8313E795367A22B6A17CE3B803083A74FDBCF030D91C957128099D6199686F2BEA618CEE111AA9D55A6F9E8966C102D849ADE596A1B576924DE0E92DD91FBB01CD93E24AA71EEF219A78430D84965672FE6AF091D46DCFA9AB906F6240913C1286EE0A152666ECFE2C154CD3FB14DC0F9C173E30FC9958A75AA6DD74822AF7ACAD243FDFB743E47E48280990C2870904EF1C902261D0BD6BCFDA91412BDEE9A28C628F218E7648AA0027D918B48EF30A9B18390331805C6739BF6A2CB69A0DE8766A7B3A448910D181F6449565A363430BA1C0FA8B11E1A151F6CEFA3870C3B1D8CD800983EBD41B48C5624269EFB440DF23FF9BCB31A4B02F6505DC862B2103F76137FC6560F893577BC3FCE92ADA27F291305F2345AC82A846854F172131B042735D4B76C6AB2DCFD32BB6258B23AC790AF2AF7624451172FA7A29E0C5FDB3DC3B719B274B2838FF7A8B25F272AC8EA90FA3C8010AC7F65633EB43FF7A0A95CE99717F35D3C416B0E0DA30470B5AA20EB9E2B66315B9407A4753DF8BF505B8066C5D57EC4CCDD2236B9C58BD7337925191ED7B75B92C9CEE626F13EADDECB07173C8160540FB9F6A4D43A1E9AB263B300C08966C247514647DFAB3B420202529E963A51F8D23BD0F689BBC4D67D5A603B876E8CD3EC0770F0D9694DFC30083991CF3989DB1812B4AC5452358075534190F012F7C0E47734C3BA748E04910783C0B845484461DCEA67A1EC731354B902557486B484F67183FC711D10F906C68CD01F46481D040F084271DD784E5B958AE05B65BF5D207EFBB5FDEB25366D6FF4161CA3A1CB71B2B9F90F86A315D800935AC0086D85D907A036C4333EA347000A0755550B68FE3DD7686E416483781B563680146697D6FAE8333C24ADC8A2436852DDADF6061E2B16FD3829C0B55C2E9C2C89F64CB8DA02A6706498CF0330742083E9AC4593A1762D32DC4E6CC2D9F4310014FB15DEBBEA324EBC2EA1E1660782559B9B39FBCF34C85FDA9AD350D195AD7587AAB621EF7FFB63277CE35AB43B01977C9F8DD6C2AE7B34FA7B35D5FA37D8B3719E736F18734CB3A2468BE9CA0832DDE0B958925A377FE6751C4EB8FF1AD295355302F0A5ED4E8F8C33FD5162542B8ED7CD985DBE3C84401830F6A7EB9D955EC74C7F98B02388B4E1353317CDB5EADAAC9025038CC01F8655C7FB9AEE940FC4B282748B39D277A7FEF462038833A9A8EB50A8719F68B3E858825911F294A80FAEDE9D4C1815844C2632DD20387950003DAB80B1A58E541A5E6658AF7D4CDD91FD1C08735B584F5C69C5CA94F6B7F97A4761B127DB394AC72E902DB9EB4B3E0B884C448FF2763FF9ADD530753263688CF92BB746181C17294BFFC2A0B3969A7BBA429A481C425B24745CEAD66286F5DF04F1E4421C56ACAA668E87BA58E3B07A062D1DA60CC6B411667BDE6F466B72C9169965BC7781DA78A818F779A9B3D7A577F71A1DF49AAC865A0D6F2668CFD2C77CFA8D306A14DBBDE4D3A3818B07DC89D5F51E117F7BFD007D60F32BB1B6BB01E76862398371FB91E0A3D4B39FD9146C47F627A066618CF83C32E5C82592B418BD2F5DCD8D42234625974F988A6F729C60BA5EAF18C77B611DFB187A581E3A10268A965F650FE242CE2FE08AA71515B59A6EDFC9CBDAE22DF3AEB22E773CC2EB373619E9CDA23C236CA3F7845C2136E93849D9F6AA1477F4513358CD8CB4E21444C9E5709818801EADFCA23F2C23DDFD5B4EBB6089DAEDD14A21EBF3F7A8C1C80BBF7D37973BD156AC5C4462D29DCCB7EEFFA22A8B6CE433B600532F33999ADC39196F01230614767285089FB262D8469DC66D24AE0B77FD05C3EC02FBC5EE328319409B8E2D7B0AC6801C1C8BA86F793C2037C71E2A25F114E9EE0EDB3B83076EABFDAFEDEFA0548DAE91E62CB7C29C03413235B8C6EB9F46BE29DE8F5D30E8D97DB6F45687DC4719B1024E48B7DFFD0D2B474B2032B4E69B6382E603D4777F3450E2E467C6D9AB2782C0AE266C320D36BF67BD6B86EA9721B22741684D9C0CCC774335430071A5410C1E34B4BC1A823A93A38F5AB4781CC593B13A593867FB634C0C705107CD278C6CCEE6D842748BFBD2FFD205C6BDFB3AC87F693C25C832C86D96B00BBA0AF88DCFBC8CA4328765DE27FBF1389C4EDE28317BD0EE447F030990E957D223A5EC66CED9D16400AF6DA8663C4E4111B4584F8F0066CDF8258D90C5D7B439503E3AB3FCC55FDF933E06D704416187AAF86E6C39695DEA8B8189EC1299670BE03B6A636889CB7F10F04CCD67278E77886CF3F6E2A05BA8D25AB8664EA817642ACF5DB4D9B3EF80E169463EDB6BFDF67172E88D233609B091BBD085B970DB8AE0DAA5048CA42D6A54042F42445BAB03F9BF1ACCEF341B7349109BA0073D3715A9073AD9BED258268AEE9DD5202E0EDFA5720A317EA5CB41706C0D235465BECDC8E3FF0D628EE5EEA6AAF1BBD3E18FE9217516893DF115E979C4CFFEC494988B6F9B86026610898C44AB1547C5F8ED5CBF3C3A837DDB6A444BD3E803E1824E6AB931310FE86B36587F1B34B0B48D358F4B97E9774213DE7D92571380BE2199E703119C5B9836DADFC826B71D588250AC37DE0EC05C5823573C102BCE44C9F044507671C4E1723950A3C0E14968CBABBFEEB049EB723DB9B23CDF0273525C29CC5165530A1F1CF830D3551DD6BDED53954947D5C334DC9C71907CDBFA109EBC52D6305477C14159257AF8C51C6F09D76FC0085C3D969EC60FB09145E66A8A7489611DB3FDEFC35202B8AAE82D3CDF666034BEFF49FE49A45C5EC438F4118F338545532CED916DE78E3BF82B4E55907474386B9C172F393EFE895334F7323CBB2AA7CE7718BEF5E7A23AF734BD4963FBC7889AA5C50F3955B904B5E577D71B21A293D766865E3F8C212DE5EA084A9D22748A8009A7D1858328A1BDF7BA0F4E3B83BE9707629252B3339CEF796696855A574B4A4896CA68C3D6A6824E3F593069EC0A571E61282F8A29BEB8BD788F7B351A8939CDAD9E257587A77804F2704F49DB3305514B85B449AEE56EE40CB2A75D51690194284AACD0855B02893F8DCD3091629DC548705A1085E5CC33DE7726A0F521C149003DF380ABDAE96BCDA55C44BF9BFA1103150F049563E848A8750625DCFDD9BFE02E1E57489B5B3AA28BEAA80F4DAA562DEABB4BB6A27125369415885020D237A92CCC3A23593FE2183225BFA2FF39B0BEF9CB0425375E256BCD572175483F713BD38F937F2B3D4C1F686C5AF60061E0B05CC3EBAAB0AE8BA21E47A8318BEE4A01516046363D152936A1344E17A65E08030522EC667233145A56001B8D065DC2FED0D2A9F02C981A8962F984916314805DAB644A5112CAA1564895121D8B1FD046F547BE282CF979752883EC79AF70CF59A88D960F3336F0AE61357877AAAA34699A876144B65CA5B77A684D850D09B3D42CDBFC4539EA103F8377CFE5F9E5432403FAB416662C4C83226191EEB7F82B01E0819C081FC40E7B978669C7856067E8B582832DD0B92588103C2616BA2C7774C46840318CA2B1A3798FF7ED9FEC087F01798EA2445B92E67E2446126A7406E82FF8D3711311BE16E9171531A95C966E6BEFEA34938E6F5FA660F7C7CB533A119377F1D26AE6AE51D805AB96A64C8B80D6EE137F634B384C2E377 + +count = 83 +seed = A97269579EB70D268C58D94FF744329B197F722A8A407B788510DDCACA34C8CD4C72FFC14B76300C86AEA1E4CFA66BA4 +mlen = 2772 +msg = AE3DDE9E33719040345DF8EA7E4C0B5E2CBC5CB80B34FDDB959E2DA1D67D74D2FBE5AAB07C6357A9F3E5F6EF5379B4C75008E9077A1EB025F9023FE32FCD9076C8D2B291D0BECF2DC624F9E752B1EEA2CF0755FC9D4B2E4320DFD042C68577D58E61DAD075BC1C3931ABA78B473C0726ED495150D6A11A81DBBD1C840F5F1FAACD54E3470E0D994DEACA7E6E324A9FB4E581AB447A4EA026DA3DC3C7E6AD55E88CB841E069ECA63404CACE0E3D4C8B9CEC33BFF6AA6341AA1EB69AD799C6CCE358CA94555287D01B0192B1B49EB6F705E54FBC86465C4BA70134AFC9A53C1C3A732E21B010002B49B7CC6F5237B794BC1D1F1E30A7F1EB95D195D5F26B46A704F77F80B092117EDE1C340622FF32302DCA7E7E43C2A4D8852CB508403B1AA8ACA27A86936350264811550DFEF05D72542C74D6243AB9D259202295A63F54C836CBF610E40EB85E9704041A51BF68578B10F7985C752DC35788E7B7754358082AFEC9E4B271D36974EB90A46F7D703B0CCE941C3CD072A88F931A4FFD098634BE0921D089E46637F88F9625B7DF900A276B4BB75FC75921C8A8B6668DF9946290E11FCE4565A76D39D8FA55F324253FFBBF81536581621DEE664A9E9E4F4FCD3A9765706B8EA833125A825B1CB30314B7C6C78B301638EAD4311932FD4611D78572180EE441648F8BFAB869874611C153FEEFF88A45F7A98206D0B2D97CB7EC2144F045225AF5A9925AE7FD3DB017E37259B7A2FF6C66820DDAAC5651B2EC2E5767DDBBE18256B1D0D0F96CF5EE04266B8ADB29B0AC5D55B73E1ECA8FE724EE174B76EA1C0A54896E2BB565075F1669D3CCA171657B66F343A634F4250287F853B52182B9BE50DF29021673DB1841ACA45E7263DCE653F0DD84338E49FF5C6E3BB42F1A3C7164704A2A000149114D36BB9231606EDA06C712A904C1E323C4AA3EEE0BCE6062A9CB956E004407014ADB58EEABF486B38570955C30F2B5C28179F86CD5FFD603CD441A1FB06519368886BFF9C2C127ABD079346D762E51C311F196D5F825B45EDDD4A48C7C2123E10A3D369D772750987EDB96968C59441FB2F47F8E33FA4CED3006766C06BB6B339ED94B8FE57B20D96F1A27A61966289D8FF5072FD11D7EE53DEFE0014A11667D0A6C988BD16629FB53F269130B22A13AABA2E9F70DCC93D3BF6E611EFB006BA585FB8E8720357E25DF69C6DF388FAC792F87CCE801FA49A8CBEAD1698C11B82C4F85FDB4D52A2A808483DCA7334295BB3B2658AAC18857878730831622124F5A254A464DE459F3528C5194220E5BB1779C8F5E3866B0D60931A1A47502D99E2B186785658DEF57ABA676626F9CCAAAF449609B07AF7B57C78FA5BD06B2AD2927AB491EE461A94AC37A079D9BFA02203B09F7EF180C1C1C430518FF2D3F2A3582EAEB6668060A2B544E973E8A2B88733A902A0A80F8E4F30AC5D0223C1076482EB2CA5AE67039597514A4866061D5FBDD99694A060D0D0EE43A1B7290FFD7D796A9F1A2142DB6E0F154ABA8720396B6DE939E668447C81CC828FF9D2A014FE001CA718C1D6ACF4C08BC7796D344A29FD8913E4CE71E986C46BB66C2610FA797C9E1639DF423C338D7192638F621D83A6802E72E38BEE3AAB064FB606962329997FE908597E7407CEF098D4591E5E6011CACA701994E4ACF572F7C91057D3DA06058A7DFFD3248EE3333208BFF27473E6F1EA3914C5B2056AECD7AEE07F8DD26B3C2B8B9656EA4260D38E8D5F23C925A4476754240D0702C5859AEC2329E1CC3E426BD7665B2A4EE2E75B41B561FCE79690F64D1068DD35A294A8E8CB43A6AAA901109F0E09D985B6E323C30A017E75BF01D0AAA739102C1A6667ED48E60DD4499EAB862851558DFD17229878F5BEF0CC29FD19F59835579F3CDD4F85684E0D46D9618A205DE3B29B0BFA5FBB36745B989211E2BA711527D32CBB5E35830DF4549FEA652377EBBAC6D52787F9EBC3CB687EBB641BF51D3E22E98FCA48F99584FB1F3BED3F97F33EBF656C5795055268F49985CEA00819A07B8F4B0ECD7BEDA95EAF11E3498FA7AA414C54C38A08A841B012AE91763BE911DAEF803E2CA385C9D4CDC642A0B343DB6534C10D9E1755B7B2DE543AFE1D3C90981A7BD907E9CB14367243D9FDCAA8776AEE5F65ED6DC02F633BCF9F57DAE39E8E8261DC10029DF7B7124BEB67DD753B36892481EA7CC54DDC3A60EF8D4DCEC4D5796DDE0E7453BBF0FD93FCACE97CE5048D75ED1F34B69A392E1734E262B2B2A1E246331A373B5CF1FEE7BB46096C76349B0F19BE63FE539DCD33A8450BE894C2DC21BEFF0DE6A841A533F4C9949289037D161BB97DCE31CDFF4C1E0AE36B4192594DEC3B021E8F3D5B500C244CB122974F8CADF125DE0CF832A920DEC3A6F7150585D0209651B0FAAE0F74A36FC8779115B96136805DDD4F6F3A69C06AF472F369F481359FF834A0FD2F9AE899EA36B9B061B63D07C1D4ED7A373ACC40EAD808564B05FB0C6E656A80FA3865AABE483848D14D1DFD66D7AB1F353642EE3417869DA21622F6AF551659D07E6C827C18EA36E2C5E806A9571A7B05BBC1BA283A8984BFABC555AACAEAB2453573F782A4087F0F903AF34596E83282A2E54773AC33543BD353A3F855BC46810930C3635A9B70BA7FFBEEA95A129CCF9E9538EB11E119A072F806130D831AF7E57D332AC889D7D9E6BBD1C65D64E089722F6954F126E64EA939D98084D434EE74B55C549BED21D11264F8B5E023277DB52B03D7B8A8E75B12B11D62052E474E435707272D72D00D92288CEDDCD1ABF8E63A8A9963A48B54F492487B309F69CD90C9FF54B9C5A55CD2BAD4A2E0A6B00B188FD6C527A8184BB63670BF626A995815810CC0F280131F5F652EC20609C7D3B910E4168FE273626BF0E2CBF05BC9CCD178AD91BC25CDF178B387DFF0B6B40A46FDB6C975349B6CD8AD103CDC5DAB8D09D9A5B55622E74564C1E789C5C185CAC04FA0ED6065B9CCADB1D5DC80E90AB244CE1AAC516B346ADAEBAF7A030D66FB90FD070ED062A41E0B70BEE3B07F1C03887DE5F79D70F9955B25B8C8201602784EF8A60147260D1BDE8E152E8D3F992CB8255ADACE9D5DD2E9C856C47537742094190AA867459D20989DB11841AE44824979C0A2093D7EDCAA13C9DE25E6EECBC5124055F17466467E123E39034502BA966CEA873997EE25E52DE2DBBA874DC9AC222B49967B7BEDB5C81BE09827CAB782F458795B2903D72AB16F4423964F82DC69C138EEFA3273BC10376939E544964150D9DF09E14BE08CFCA06C10BB2C315B1B676C40762F8209C0EF13CFE5FAD76CFC17FE462D8330F78BAB072C5465F7A26D047FEC4BD3B918C9C761B91B02D820ED7EF345E79A66FBA61AE13D3050A27488CBDBE693B800F1E76C188EBD8118C9432EB9E7124D35A1A038D237918F1DB83304D10AB5DEDF58C6951A92AAB1A1A40E180254E730EB43B566A83CC71FB6B9749BFCD3A90B964966CAE90FAD7406A8A89B1E48C885BFE2DB41C1996F20DC9A8DFCBA1A6F2F307EF8FBA5EEAE9631C2D6328D90F17679DD9E8E9660D6BD4C8A1D79C47A5FD46BD2ACCACA2D5C6407B0F7F31D093CEEF0342C67DDE3F1BA5067ED1500DC45161B8636255924BF007C4C870990C5DCE098C5A26386AD84D0F0CE4860349A147A4E7AB80151FA63882590B91C6AD3E70A68E6FEC1A2CF65881A6DC38048FC14DE71C702C934C5D3C4CF4C474F906C3400364BC400A7DA087F94F1ACCB68439A9A6FFA8C6439B2CC5C0B17A7D649033798429F211D9DE12B24D117583E1C425C2C0348C625CC44E9B976D319E72D4E09D5D6F36EE243F5FBCB190E84DE56EB680DEC8566F5A2C7D5F595116C628CA09401D561BD78356C634419225FB01CB637C46A627F6026D39EC1C62E9A3E85FAE +pk = D6BDD284A3EBE2C62EB4CAD038FF040E0FDB58799B4FBC547C4731B0A0EF6789000597489E2475B8A5F21E46AE2AD9271673E16CD029C215002244F6ACC4CEE2C6A4E8F2DEEF47E1ECA318002B8A2902FA876408FCA8A3DBFEC99FA642B9A72B08 +sk = D6BDD284A3EBE2C62EB4CAD038FF040E0FDB58799B4FBC547C4731B0A0EF6789000597489E2475B8A5F21E46AE2AD9271673E16CD029C215002244F6ACC4CEE2C6A4E8F2DEEF47E1ECA318002B8A2902FA876408FCA8A3DBFEC99FA642B9A72B08B581668576A9260F7E6776FDEF40D9D1C1751C0FF2E441FDB70600000000000000000000000000000000000000000000B0774CB197CAEDCCEAB2FFDF2D119EB890F812704AC576F07EF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D0EECFD0D26D95D713901C660D326F0FA119A432BFCFDE5C2F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008F99DD57758F62A19C73A2B8504BFB76879B967CF7631B4912525DD8EA419408B38FB671D5C44441E572B8A24DB6CB0007536D45412EC5C1259AD4CF108A91854C4D1F1D7AFF460B450B1FFF2E5A8510EA52830FF7A103DE3336AD7F9C86520012E24A245F6D148BF8FB04B792FE60241CF68D776260B13EDE58CBF751D33FFC70EA3B1C45E75BF77615A9A8F4DEDE001F4511646E773A7613D549FF5A59C001C83E42CD3A8512D86B7F7C6128D64917082DD1A9A790FBA9E279DC7FFDA1E200 +smlen = 2996 +sm = A1BCFED6660C47565DD1739C9293D275427AF3D90A6D9A1BC425B08B20A2CFF232020CF6308E9D1938CDA0979CBECE1A79E5850F3F325A954113AEB65F87D0D4F3582C7DB59DBE30FB346185D7DD2C291DE730779EE850E216E9265A59BD150F000111F26C617CF70C1BE0A9F0E840B1CCF379F31B4300EA6A1003CCBCC1517FF24D1CB1016BDF89D1533E63E21411A23CD55F0388C6DBA698A3F0D1EB8985BCB7A5679C8C421B6306858A2701F653E781CE3DE81BCEE1F2716DD4A37D65165A0AE44537A100185D77EC413ED797CD3C2E3D0235A2DE28A115602CC2F900020DAE3DDE9E33719040345DF8EA7E4C0B5E2CBC5CB80B34FDDB959E2DA1D67D74D2FBE5AAB07C6357A9F3E5F6EF5379B4C75008E9077A1EB025F9023FE32FCD9076C8D2B291D0BECF2DC624F9E752B1EEA2CF0755FC9D4B2E4320DFD042C68577D58E61DAD075BC1C3931ABA78B473C0726ED495150D6A11A81DBBD1C840F5F1FAACD54E3470E0D994DEACA7E6E324A9FB4E581AB447A4EA026DA3DC3C7E6AD55E88CB841E069ECA63404CACE0E3D4C8B9CEC33BFF6AA6341AA1EB69AD799C6CCE358CA94555287D01B0192B1B49EB6F705E54FBC86465C4BA70134AFC9A53C1C3A732E21B010002B49B7CC6F5237B794BC1D1F1E30A7F1EB95D195D5F26B46A704F77F80B092117EDE1C340622FF32302DCA7E7E43C2A4D8852CB508403B1AA8ACA27A86936350264811550DFEF05D72542C74D6243AB9D259202295A63F54C836CBF610E40EB85E9704041A51BF68578B10F7985C752DC35788E7B7754358082AFEC9E4B271D36974EB90A46F7D703B0CCE941C3CD072A88F931A4FFD098634BE0921D089E46637F88F9625B7DF900A276B4BB75FC75921C8A8B6668DF9946290E11FCE4565A76D39D8FA55F324253FFBBF81536581621DEE664A9E9E4F4FCD3A9765706B8EA833125A825B1CB30314B7C6C78B301638EAD4311932FD4611D78572180EE441648F8BFAB869874611C153FEEFF88A45F7A98206D0B2D97CB7EC2144F045225AF5A9925AE7FD3DB017E37259B7A2FF6C66820DDAAC5651B2EC2E5767DDBBE18256B1D0D0F96CF5EE04266B8ADB29B0AC5D55B73E1ECA8FE724EE174B76EA1C0A54896E2BB565075F1669D3CCA171657B66F343A634F4250287F853B52182B9BE50DF29021673DB1841ACA45E7263DCE653F0DD84338E49FF5C6E3BB42F1A3C7164704A2A000149114D36BB9231606EDA06C712A904C1E323C4AA3EEE0BCE6062A9CB956E004407014ADB58EEABF486B38570955C30F2B5C28179F86CD5FFD603CD441A1FB06519368886BFF9C2C127ABD079346D762E51C311F196D5F825B45EDDD4A48C7C2123E10A3D369D772750987EDB96968C59441FB2F47F8E33FA4CED3006766C06BB6B339ED94B8FE57B20D96F1A27A61966289D8FF5072FD11D7EE53DEFE0014A11667D0A6C988BD16629FB53F269130B22A13AABA2E9F70DCC93D3BF6E611EFB006BA585FB8E8720357E25DF69C6DF388FAC792F87CCE801FA49A8CBEAD1698C11B82C4F85FDB4D52A2A808483DCA7334295BB3B2658AAC18857878730831622124F5A254A464DE459F3528C5194220E5BB1779C8F5E3866B0D60931A1A47502D99E2B186785658DEF57ABA676626F9CCAAAF449609B07AF7B57C78FA5BD06B2AD2927AB491EE461A94AC37A079D9BFA02203B09F7EF180C1C1C430518FF2D3F2A3582EAEB6668060A2B544E973E8A2B88733A902A0A80F8E4F30AC5D0223C1076482EB2CA5AE67039597514A4866061D5FBDD99694A060D0D0EE43A1B7290FFD7D796A9F1A2142DB6E0F154ABA8720396B6DE939E668447C81CC828FF9D2A014FE001CA718C1D6ACF4C08BC7796D344A29FD8913E4CE71E986C46BB66C2610FA797C9E1639DF423C338D7192638F621D83A6802E72E38BEE3AAB064FB606962329997FE908597E7407CEF098D4591E5E6011CACA701994E4ACF572F7C91057D3DA06058A7DFFD3248EE3333208BFF27473E6F1EA3914C5B2056AECD7AEE07F8DD26B3C2B8B9656EA4260D38E8D5F23C925A4476754240D0702C5859AEC2329E1CC3E426BD7665B2A4EE2E75B41B561FCE79690F64D1068DD35A294A8E8CB43A6AAA901109F0E09D985B6E323C30A017E75BF01D0AAA739102C1A6667ED48E60DD4499EAB862851558DFD17229878F5BEF0CC29FD19F59835579F3CDD4F85684E0D46D9618A205DE3B29B0BFA5FBB36745B989211E2BA711527D32CBB5E35830DF4549FEA652377EBBAC6D52787F9EBC3CB687EBB641BF51D3E22E98FCA48F99584FB1F3BED3F97F33EBF656C5795055268F49985CEA00819A07B8F4B0ECD7BEDA95EAF11E3498FA7AA414C54C38A08A841B012AE91763BE911DAEF803E2CA385C9D4CDC642A0B343DB6534C10D9E1755B7B2DE543AFE1D3C90981A7BD907E9CB14367243D9FDCAA8776AEE5F65ED6DC02F633BCF9F57DAE39E8E8261DC10029DF7B7124BEB67DD753B36892481EA7CC54DDC3A60EF8D4DCEC4D5796DDE0E7453BBF0FD93FCACE97CE5048D75ED1F34B69A392E1734E262B2B2A1E246331A373B5CF1FEE7BB46096C76349B0F19BE63FE539DCD33A8450BE894C2DC21BEFF0DE6A841A533F4C9949289037D161BB97DCE31CDFF4C1E0AE36B4192594DEC3B021E8F3D5B500C244CB122974F8CADF125DE0CF832A920DEC3A6F7150585D0209651B0FAAE0F74A36FC8779115B96136805DDD4F6F3A69C06AF472F369F481359FF834A0FD2F9AE899EA36B9B061B63D07C1D4ED7A373ACC40EAD808564B05FB0C6E656A80FA3865AABE483848D14D1DFD66D7AB1F353642EE3417869DA21622F6AF551659D07E6C827C18EA36E2C5E806A9571A7B05BBC1BA283A8984BFABC555AACAEAB2453573F782A4087F0F903AF34596E83282A2E54773AC33543BD353A3F855BC46810930C3635A9B70BA7FFBEEA95A129CCF9E9538EB11E119A072F806130D831AF7E57D332AC889D7D9E6BBD1C65D64E089722F6954F126E64EA939D98084D434EE74B55C549BED21D11264F8B5E023277DB52B03D7B8A8E75B12B11D62052E474E435707272D72D00D92288CEDDCD1ABF8E63A8A9963A48B54F492487B309F69CD90C9FF54B9C5A55CD2BAD4A2E0A6B00B188FD6C527A8184BB63670BF626A995815810CC0F280131F5F652EC20609C7D3B910E4168FE273626BF0E2CBF05BC9CCD178AD91BC25CDF178B387DFF0B6B40A46FDB6C975349B6CD8AD103CDC5DAB8D09D9A5B55622E74564C1E789C5C185CAC04FA0ED6065B9CCADB1D5DC80E90AB244CE1AAC516B346ADAEBAF7A030D66FB90FD070ED062A41E0B70BEE3B07F1C03887DE5F79D70F9955B25B8C8201602784EF8A60147260D1BDE8E152E8D3F992CB8255ADACE9D5DD2E9C856C47537742094190AA867459D20989DB11841AE44824979C0A2093D7EDCAA13C9DE25E6EECBC5124055F17466467E123E39034502BA966CEA873997EE25E52DE2DBBA874DC9AC222B49967B7BEDB5C81BE09827CAB782F458795B2903D72AB16F4423964F82DC69C138EEFA3273BC10376939E544964150D9DF09E14BE08CFCA06C10BB2C315B1B676C40762F8209C0EF13CFE5FAD76CFC17FE462D8330F78BAB072C5465F7A26D047FEC4BD3B918C9C761B91B02D820ED7EF345E79A66FBA61AE13D3050A27488CBDBE693B800F1E76C188EBD8118C9432EB9E7124D35A1A038D237918F1DB83304D10AB5DEDF58C6951A92AAB1A1A40E180254E730EB43B566A83CC71FB6B9749BFCD3A90B964966CAE90FAD7406A8A89B1E48C885BFE2DB41C1996F20DC9A8DFCBA1A6F2F307EF8FBA5EEAE9631C2D6328D90F17679DD9E8E9660D6BD4C8A1D79C47A5FD46BD2ACCACA2D5C6407B0F7F31D093CEEF0342C67DDE3F1BA5067ED1500DC45161B8636255924BF007C4C870990C5DCE098C5A26386AD84D0F0CE4860349A147A4E7AB80151FA63882590B91C6AD3E70A68E6FEC1A2CF65881A6DC38048FC14DE71C702C934C5D3C4CF4C474F906C3400364BC400A7DA087F94F1ACCB68439A9A6FFA8C6439B2CC5C0B17A7D649033798429F211D9DE12B24D117583E1C425C2C0348C625CC44E9B976D319E72D4E09D5D6F36EE243F5FBCB190E84DE56EB680DEC8566F5A2C7D5F595116C628CA09401D561BD78356C634419225FB01CB637C46A627F6026D39EC1C62E9A3E85FAE + +count = 84 +seed = 483A81716F91A43ACA6764C4BD2A57C9156B762E9174EA49730A6BEB9CB19A0B3755E37BA47EC524BBE2FA25B9FEF687 +mlen = 2805 +msg = A7E941D3C14E2DDB4F971C9955868ACA753A73E8EC6845ED6E9D3B444C826480F03AC771F92E94380BCA7E50303FB79CBA608E351A1A67BF217B9816E2AF9F89BE8A79F661470CA16BFB2C99EFDE97859AD1D217848289EAF543005F5C231599FF74299EC2A7C737FF94B7465DE11F80E17D4FDA264DE568D8767CE822B3AB9642D95BC89533CE05FB331B86E3C5A296E4EA4C637EA458BCED1F89355C0270D083D4920E72112CA1ED486191748B4F730ED52F9803D05A0F2F065BE03B2603D6CDB154DD7765847D656B919B08969E41B23F9D376135BD5D924529410392ACEB004849550E6CF2903181C9A395FD469B7DE2C5060ED22922AA4D7C782A33330714A0AF206B29B4FCBE0F12C18948F6634FFD7F2710138020E273CB0DFA735BDCDE9BD6CEC898C5E564EC71AA7880D97CC711412F28603DE293CD5E904E9156D4F6BFE2BE15347B9FF7848EB51CD0785D6A649EA3514E02695C7E3C4F021A9992D67BEA1D68E5B17DB2E0DC061CCB5ABABA49D110055467F9DEE61ABA8F3E5C713E94A8A96C3A8AFB698887C1FA4ABC5157CED33A834DBF0F5AF9EECBB5F2AD7B63B4C2CA94A117C2B92F3D51900926E26B101FBE6207AB0884CBFCB15F9F98F95B0D08E29390977F4D3DC710EEA3AE7433D5EA87A5F710F1FCEAB26D516FC19FD272F6B0F01EE167F06E6C33273481F280CA64FDA0549C8DB884FDD467B93998360766D4CAC4C8DE783752FB6C6D7B1E47DF23CEECA572F2AD3E2B628E31984B9054448ED1D90658BC658A9CAEC0485512CE084A535E7C8196B8BBCA5D26C105C41E083F8D56F1530A8C1B36A7F3E41FCCBAC7F342B2D026064B304444192D4873FC57978E44151896EA6C0F13D017F683B203BA1DE677ED00F2B737C4C69E53ECF16AB918939E120E9FE14B2243EFF0116B24C6654BE09C582F1E62E75EFD8593E62E45AC36F717815B854B47A4DDCFC91FC533FA85BCECB6E560CF11E46D2F334B396D68B275E7404A70F2A805A64CD458A8E5F114A89124BA1866F917749FF32E59EE71948BD97F2D4128BEAB8BB0B6B06D84C6D466BFA30FD8100E48D951D0B3E787EF9611A56FFD64D970DBACFB1B4DF064B1CB5DA9918F5C58A10F0903B64286B1C1AE5CBD00EB8B363BDD7A7AAF2111C0C6E86E15ABF6C1E761FBF027425968CDC19522B44FF3F56335C59760FAE6D9028E76B284330F7510F2B55B6F46ADF90311CC785D35C2BB49272BE514CFBBD7A2B7B2E8C0B6DC28CB683D3D581F547F83BBD3B8C7B76925E44E6DA89D5EEF17AB0BF4213EF9C05B7B473901D483C647F416B98478C7100919C28515B617A27321841BAA174C1A2D3494395294CEBD48EEA14BC3106CA9C69D9F6485D6ABF1C2B1111A8BC602454685CA61AB4EE4DB9F413CAF8F0F204F04D40CD36FA5DAB629CB53876DB3E16372E626B6BC892C63C6B6C503C9D22EFE113927395206BDAA4B83D4FEF4FEB42FA7A71F7CE2197FE282A02D0FE50F96B1F917A67E50EB79CD3FFEF064542F7BEB51AB05B56AFD7AEA5F4164CC9BA37D8FDB35A3DEACF0CFB555161E7E41EB798160798BE9D01E3DE0C4288E0BAB19AE398E94353ADBE9A43524ACE35830B82FCFD4B1DC2800CA4C38A56B7CD28BC3E2F69A0AC4655CD79B5789A2B72EAF93B018D4D6F4C983D08932B22C85AF6FB07DF0A786D98820E1B06BC17F62D6E39739790A13049252F1B9102DC692CEB20C270FFE9B902AB7EC5A4EAAF47F7E2D31B2195F5F48AD18D099C33384141DA14E151BA57F6B1BB97901457202CDB83B5C713BD8A13F6E3E276C7D6C130AE287CA8931D9EECE06AB7CCA124D6D02D497D55EA9151A95E8A4DCCDA72D3F51A7DB3F2879918753683B01BA1B154DA83E6D84DDC9492F2DD8C128A30C75174ED1A6B8D93D08645270BDE247782E882418EA158B2A2153B2D8F75C09932F324EC199D26E9F3C4C4CECD807367E3981E137858B98BD1268D2C894541EC99BBBAD19A6856EA16A1E56B7B193BAF79AB89D4E76327405658C4ECB5A8626302B3A4618AEAC7E11A1199C4BB08C60AD78FEA4827B59CC883B2CA7038D7845106DE9174B2B8C17267273D23418AF560265000543ED9886884912B4160FBD372FCDF706EF642CF1829493884B6CFE946ECF6140106DCBE11B3746E33FBD4B5852B732230B9047004F4FAFA0D4BD7043C7D6595ACCD1B2771AAA76FE05A0C80B7B221DBEF79950FC69147816CAD0E52C05E72CECCF55FB4DABD81ECDB476417DBFDAF3B555CC90573CBED9474266C89FC55FF0BCC55602A51A1B5F91E425A1A58DCD4ABD09BBC63933FB4279B9E21298F9FE0CF1A93C4A19695240E8978D604047ABC7239F5053EA650D781307C50DEC4D5E2360ADEB9AA02C0F6FEC5784784A271169CE456E1C32BF984C3323656CCC588C97E0ECE5A40FC7B4DDBDDDB764EDC512DE63270F07891BD160F78B8ECD3A4D11EC4C68EA0A0FBD0F23AF9AB261A110F431F926C4995B05462E0DABF29D9660ABBC660C9A675628270CEA7EC5AE9B6F298B17B2392263700B8EAD9C845AD29CCF109A2ED66ED5BAF9C935754AAA1B84BE2B5339F9BF3CF5E80AF16967863FA8DCA64F5FE873DA4A6D33E39A592749B721FEC203C0CAC527CA96DE7A96CE9A540F5DA1902C97F960A05EBF0C32934F9B81244C945A60FD3F176DD8C261690D8EC98D19607129A50EDD51135FFBAEBC04A0961ACC5A32FD058FFDF2C6866BF90A3E177787E7061BD2011EC08EC118EF0451CAD010B53C68D0BDDC701D10920D697EA3439B1A0F96E6256B7712F59C746D1C74C20B17D461C3DF635EEC83E3B8E098034F119B9D9A79ADA735158EAC3F434E805444D5EA2EC85CC8ED8F5BCCAB7DBB6ECFC2E385781579AF1263D9FD32BEE32E01DB94703B5C756B894DEF19783B12BCE2A1A8D29D96F329CB0791D697BE7E0F05DD5C9DADA52E1B8C1E5F75A0FC90ED8C05BDFF86644B1EE61989CAAA271061D4222818C894AE9ECA2DA7326E5C24CA1EEEBE3720D2127BA997B0C572AE30615F8BC4278057F4762D46A39B934DDB2A0903FE1568C1BCC6C37E1F7C145EB7CB20A6A4B3466A7ABA58B48BE94F7E14CD20C87B2768358D06E3F607FE5E9DD1AAA8477975660F1E379B9EA26CC00CEA8CFD6420F2FDC7EE6393AA17CEF88645B821F8F42FC7DD97B0E16C04631F86ECF1CB76A6502FD1C13917CEB26A83596B117D5336387DDBEA56162E8A5BF2FA35E697245BC7210CEC13BFA694AE884582924168BF8EE2F61A734E37876F363225E5AE19B7C65CA6AFC31C8B37BCCB308A9C27F3E9902DE365E288E6CC46E329E78BE914B85EB980C0BAD932C164671ED395D5D8317C133E2E000A10E0D20D0F408019B33D9A87ED7725EA4C5ABAD67E0CAFBFF31DD236E59DEFAB7FF2CB40F479B56B261A32656F016DECA5302A336CA15D10E0AFCD168A4B922B79C11CB21881220374492D64DF21453B41346A85174A0A4A3C1E973845C856CA70D6D25BB854D0C6BD3C75CD73998C7F64E35A58DCF593C85C2440A6ABA4E470F87E6F9B4ABE127B30F8992D8AAD0BE38F008D9D937582EB3AAFC68F516D5AAF2503ACC96E59A151D2D4B072AB6B38C54928D6656441C709F1C1B770CE6EFCECE11F8B3602EAB63E0C629BBD8A79A96BE4CDB072780F3D287B091FC94FF2C0D347FE280BBAC308644BDB15A3C653863EDD945AF0AE725507507B82C283DC9909CCACBCF357D7A19703401B6E4474B94A6CBAE575B942501A281B8166FDC70E6B4B60C2F57A4D66FE1197D301D0E0C7BEC12CEDF9496BCA2183D04632711A79C8374B6DE35C2EECB0239391C2019C720894BC7A635DF18FCEEB9AAE16B3CE92717E2C56903D20D0712EF80131B8C48635163E97EFB1FABD1500D061C93AD935BE9A65A45A92E4A4E885268E712EFBE5337214701BAAD4C73E81E73BFF19AF131F0ABA105BAABE849F +pk = 9659687AF5AD44F33E14D816D3A1BDE87CDE7D760704F45B389EAC41EEB8B195190EB4F91F3DD788C16078808F10DD1B5BF7576B8D0B72AB5D1D3C25E7C1E36897858945B42FEDAEFAE5E7D9124C456FEA79F4C8A6635B1BFCCE3238B09BD50504 +sk = 9659687AF5AD44F33E14D816D3A1BDE87CDE7D760704F45B389EAC41EEB8B195190EB4F91F3DD788C16078808F10DD1B5BF7576B8D0B72AB5D1D3C25E7C1E36897858945B42FEDAEFAE5E7D9124C456FEA79F4C8A6635B1BFCCE3238B09BD505041D905A1A9CD52DC86066312EA07DFBF0B52528ADC1E1B8B43F0300000000000000000000000000000000000000000000D63C0941879D382B59F8700916E60DD9251034A8D00DD5955DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF195015C551C272E53122D06A61CC4CB3842BC217F0C0232EC7FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001BF09B1D841397A6418E605426CDC13C26B27A165B794B3A1D0392968E1AA04CE04AFFB8AF3B65565B1B622A2A106F00DEE57702B31FE804B986D3F2142F8345EF4E7E898266D672C939191526A72765718FF30C3588103BA4D062A8B2818B00096937BDEADA53023D5E600A560589F13426F76AD1C180BE429D8CD3497E0A67480EDA3060EC057A721C1B3B9A038E0077B3A673C444B84D2FCB4EC8C2DDD12BA41359FF14535CAED2E538880E846EE21B99EC4747EEDFE26934037D02634100 +smlen = 3029 +sm = 3D5CF30783C0F6F9F6FF90002F5F7665078A14530A47765390242575ECAA2413A7174D64044AED3A65488EF041EDB70DC786D45DCE1094C19DCC5EAD2179B420043D0DE4B4B2EA4C9491F0D40E6F23F886C87B5E07600B17A6E26C972847DD240102FA8377F609D7708FBDB913B7C8D8B676872C5A30348E7E6700FFD5792A93A67B664D17F60ACE822DE4068E9AF7892506B90078BFEE0BA52FA738B41A43A013A23227F140EBA96827FBC4001EA4C4D451F41A6E6BB1E8B92F657F19E052E7841254C08C00EC80F109DFB1813DA4E0E66F81B24CB3F03B174F7CBA4800040DA7E941D3C14E2DDB4F971C9955868ACA753A73E8EC6845ED6E9D3B444C826480F03AC771F92E94380BCA7E50303FB79CBA608E351A1A67BF217B9816E2AF9F89BE8A79F661470CA16BFB2C99EFDE97859AD1D217848289EAF543005F5C231599FF74299EC2A7C737FF94B7465DE11F80E17D4FDA264DE568D8767CE822B3AB9642D95BC89533CE05FB331B86E3C5A296E4EA4C637EA458BCED1F89355C0270D083D4920E72112CA1ED486191748B4F730ED52F9803D05A0F2F065BE03B2603D6CDB154DD7765847D656B919B08969E41B23F9D376135BD5D924529410392ACEB004849550E6CF2903181C9A395FD469B7DE2C5060ED22922AA4D7C782A33330714A0AF206B29B4FCBE0F12C18948F6634FFD7F2710138020E273CB0DFA735BDCDE9BD6CEC898C5E564EC71AA7880D97CC711412F28603DE293CD5E904E9156D4F6BFE2BE15347B9FF7848EB51CD0785D6A649EA3514E02695C7E3C4F021A9992D67BEA1D68E5B17DB2E0DC061CCB5ABABA49D110055467F9DEE61ABA8F3E5C713E94A8A96C3A8AFB698887C1FA4ABC5157CED33A834DBF0F5AF9EECBB5F2AD7B63B4C2CA94A117C2B92F3D51900926E26B101FBE6207AB0884CBFCB15F9F98F95B0D08E29390977F4D3DC710EEA3AE7433D5EA87A5F710F1FCEAB26D516FC19FD272F6B0F01EE167F06E6C33273481F280CA64FDA0549C8DB884FDD467B93998360766D4CAC4C8DE783752FB6C6D7B1E47DF23CEECA572F2AD3E2B628E31984B9054448ED1D90658BC658A9CAEC0485512CE084A535E7C8196B8BBCA5D26C105C41E083F8D56F1530A8C1B36A7F3E41FCCBAC7F342B2D026064B304444192D4873FC57978E44151896EA6C0F13D017F683B203BA1DE677ED00F2B737C4C69E53ECF16AB918939E120E9FE14B2243EFF0116B24C6654BE09C582F1E62E75EFD8593E62E45AC36F717815B854B47A4DDCFC91FC533FA85BCECB6E560CF11E46D2F334B396D68B275E7404A70F2A805A64CD458A8E5F114A89124BA1866F917749FF32E59EE71948BD97F2D4128BEAB8BB0B6B06D84C6D466BFA30FD8100E48D951D0B3E787EF9611A56FFD64D970DBACFB1B4DF064B1CB5DA9918F5C58A10F0903B64286B1C1AE5CBD00EB8B363BDD7A7AAF2111C0C6E86E15ABF6C1E761FBF027425968CDC19522B44FF3F56335C59760FAE6D9028E76B284330F7510F2B55B6F46ADF90311CC785D35C2BB49272BE514CFBBD7A2B7B2E8C0B6DC28CB683D3D581F547F83BBD3B8C7B76925E44E6DA89D5EEF17AB0BF4213EF9C05B7B473901D483C647F416B98478C7100919C28515B617A27321841BAA174C1A2D3494395294CEBD48EEA14BC3106CA9C69D9F6485D6ABF1C2B1111A8BC602454685CA61AB4EE4DB9F413CAF8F0F204F04D40CD36FA5DAB629CB53876DB3E16372E626B6BC892C63C6B6C503C9D22EFE113927395206BDAA4B83D4FEF4FEB42FA7A71F7CE2197FE282A02D0FE50F96B1F917A67E50EB79CD3FFEF064542F7BEB51AB05B56AFD7AEA5F4164CC9BA37D8FDB35A3DEACF0CFB555161E7E41EB798160798BE9D01E3DE0C4288E0BAB19AE398E94353ADBE9A43524ACE35830B82FCFD4B1DC2800CA4C38A56B7CD28BC3E2F69A0AC4655CD79B5789A2B72EAF93B018D4D6F4C983D08932B22C85AF6FB07DF0A786D98820E1B06BC17F62D6E39739790A13049252F1B9102DC692CEB20C270FFE9B902AB7EC5A4EAAF47F7E2D31B2195F5F48AD18D099C33384141DA14E151BA57F6B1BB97901457202CDB83B5C713BD8A13F6E3E276C7D6C130AE287CA8931D9EECE06AB7CCA124D6D02D497D55EA9151A95E8A4DCCDA72D3F51A7DB3F2879918753683B01BA1B154DA83E6D84DDC9492F2DD8C128A30C75174ED1A6B8D93D08645270BDE247782E882418EA158B2A2153B2D8F75C09932F324EC199D26E9F3C4C4CECD807367E3981E137858B98BD1268D2C894541EC99BBBAD19A6856EA16A1E56B7B193BAF79AB89D4E76327405658C4ECB5A8626302B3A4618AEAC7E11A1199C4BB08C60AD78FEA4827B59CC883B2CA7038D7845106DE9174B2B8C17267273D23418AF560265000543ED9886884912B4160FBD372FCDF706EF642CF1829493884B6CFE946ECF6140106DCBE11B3746E33FBD4B5852B732230B9047004F4FAFA0D4BD7043C7D6595ACCD1B2771AAA76FE05A0C80B7B221DBEF79950FC69147816CAD0E52C05E72CECCF55FB4DABD81ECDB476417DBFDAF3B555CC90573CBED9474266C89FC55FF0BCC55602A51A1B5F91E425A1A58DCD4ABD09BBC63933FB4279B9E21298F9FE0CF1A93C4A19695240E8978D604047ABC7239F5053EA650D781307C50DEC4D5E2360ADEB9AA02C0F6FEC5784784A271169CE456E1C32BF984C3323656CCC588C97E0ECE5A40FC7B4DDBDDDB764EDC512DE63270F07891BD160F78B8ECD3A4D11EC4C68EA0A0FBD0F23AF9AB261A110F431F926C4995B05462E0DABF29D9660ABBC660C9A675628270CEA7EC5AE9B6F298B17B2392263700B8EAD9C845AD29CCF109A2ED66ED5BAF9C935754AAA1B84BE2B5339F9BF3CF5E80AF16967863FA8DCA64F5FE873DA4A6D33E39A592749B721FEC203C0CAC527CA96DE7A96CE9A540F5DA1902C97F960A05EBF0C32934F9B81244C945A60FD3F176DD8C261690D8EC98D19607129A50EDD51135FFBAEBC04A0961ACC5A32FD058FFDF2C6866BF90A3E177787E7061BD2011EC08EC118EF0451CAD010B53C68D0BDDC701D10920D697EA3439B1A0F96E6256B7712F59C746D1C74C20B17D461C3DF635EEC83E3B8E098034F119B9D9A79ADA735158EAC3F434E805444D5EA2EC85CC8ED8F5BCCAB7DBB6ECFC2E385781579AF1263D9FD32BEE32E01DB94703B5C756B894DEF19783B12BCE2A1A8D29D96F329CB0791D697BE7E0F05DD5C9DADA52E1B8C1E5F75A0FC90ED8C05BDFF86644B1EE61989CAAA271061D4222818C894AE9ECA2DA7326E5C24CA1EEEBE3720D2127BA997B0C572AE30615F8BC4278057F4762D46A39B934DDB2A0903FE1568C1BCC6C37E1F7C145EB7CB20A6A4B3466A7ABA58B48BE94F7E14CD20C87B2768358D06E3F607FE5E9DD1AAA8477975660F1E379B9EA26CC00CEA8CFD6420F2FDC7EE6393AA17CEF88645B821F8F42FC7DD97B0E16C04631F86ECF1CB76A6502FD1C13917CEB26A83596B117D5336387DDBEA56162E8A5BF2FA35E697245BC7210CEC13BFA694AE884582924168BF8EE2F61A734E37876F363225E5AE19B7C65CA6AFC31C8B37BCCB308A9C27F3E9902DE365E288E6CC46E329E78BE914B85EB980C0BAD932C164671ED395D5D8317C133E2E000A10E0D20D0F408019B33D9A87ED7725EA4C5ABAD67E0CAFBFF31DD236E59DEFAB7FF2CB40F479B56B261A32656F016DECA5302A336CA15D10E0AFCD168A4B922B79C11CB21881220374492D64DF21453B41346A85174A0A4A3C1E973845C856CA70D6D25BB854D0C6BD3C75CD73998C7F64E35A58DCF593C85C2440A6ABA4E470F87E6F9B4ABE127B30F8992D8AAD0BE38F008D9D937582EB3AAFC68F516D5AAF2503ACC96E59A151D2D4B072AB6B38C54928D6656441C709F1C1B770CE6EFCECE11F8B3602EAB63E0C629BBD8A79A96BE4CDB072780F3D287B091FC94FF2C0D347FE280BBAC308644BDB15A3C653863EDD945AF0AE725507507B82C283DC9909CCACBCF357D7A19703401B6E4474B94A6CBAE575B942501A281B8166FDC70E6B4B60C2F57A4D66FE1197D301D0E0C7BEC12CEDF9496BCA2183D04632711A79C8374B6DE35C2EECB0239391C2019C720894BC7A635DF18FCEEB9AAE16B3CE92717E2C56903D20D0712EF80131B8C48635163E97EFB1FABD1500D061C93AD935BE9A65A45A92E4A4E885268E712EFBE5337214701BAAD4C73E81E73BFF19AF131F0ABA105BAABE849F + +count = 85 +seed = 30F0E117513AAF27AB2516BCEADD1188B4BBDE76E57DFAF43CBF2D70723D941E8F875C5EBF02BD7D67AE81ABCC54440A +mlen = 2838 +msg = E43EEBE157E43D9F54130C668A153907D65BB19856A1B7C2FD5E2C770FD6BACB13BAEF951EB758485C128ECE4F3E9377A58A45EBA1C3A9CA5C94B50714088700D6FDA933ECE3A6989EE77A824A9E99674748A90B7F227B589250C9E156A8E50B74A7F49DE036FCED86CA0D4C02E217EEFCAEF7234F651CE4380B86389D7331C7657AC283F58C781F904405ACBB68661310EC6921C1FB7483E74116378086D4A0C9A52AF9847BB3CE0FE97F5A7C2CF588DB3B6FD725CA83391656CB38FCB6D79531E56F5D42FC0CC20D04AD7BBF57001BF2F8E6B335CC57CA2DB23C247EF9B75BBBA3159030975D65B9AA7C10E0FA4F615F77126D5271129D8839A3F8DA30C79174373C4BA643E4C4F0CB26BD5B8B9F7EA56DE459EDA15037D8772478FD9F7F7E06F3B422DF0B425DBF1E91D3893CE20F78CDF1910C5D4674EFADF122F41D6C7D6290DF59FA029BD82E792E758AD4388F9D352E9D2FBE3E58810C380D1CC5768865D24BDD92145DBD1EE0D4724C769EF5CEE12DB2AE2708B4C8C7865E70CA31386388D991D46C4DC4DAFC5CE66CB24D455BEE01488A7C764A308C7054572FCA0CC74A01A2B1F191C54146FB1AAF55B834F998B50909F3D003271E6504985DC836B5C44655B938769639799F2575BCFA92F13D32B283A5BDA11177CE1F66D6B30788415BEF598773E87B4C8C41F0CE6633B6C945A3B4C46B74F30945EFD99CF3709FDAFAEB4BD4C6BF605F89C7A9B4EEA1A6599F0A32CE3F2C58587EA8BB3FE6495D92F2FEEC52BEA3DE2047F5EEA7EA1453C762201FF1291AFA87923107F7FF586E00D07824EE021649ABD2D6E9EF11A1D31726EA9277134341EC57D790949590A963D25D6FADFA9CA21E43ACB7E5ED4CB6E8BB36377C2618997943CD100A927D395376871ACB9619BDE9B1FFD5E48E271952613875FA3ACD3E1F2E872F1D672AAE6E2A575A4FDC4FAE2DC6A7196E7EBA94AE5B49BE41E7295433ADF49A6D2D945F43699D444A726423CD9164B9E28B0AA4485B0C767A9398DF5DC5F23D27889C14B1ABE98880E7BD5DF9AB3D1321D5493A0A8B91EA4827627A9B59308CB0104CD8DA7D9DEF2D47B27074BA007401415E900DF03F251C8AA425F0FA59D74C41BA7A9288C8E280141CAAF6C6932DDC4184F81F5C33F0FDA005BF3FB6A0A9169A709875AE475302D57CE96D3DB332188202597FF29D1F9EBAD2B0FFA27C14CE9CCA58C923283BA10E9FA1689D6C2B8804225D706E09FF97AE9CEDC27D256E8736DAA54382040648F2F6BFBECD6C3A9BFAF5D1ED23EAD00EAB351F1E0BB4C719AE6A1F5D12E7F09ECEA62A2F554B18397FE1400DA1EB6694635D7C9C626E0FC82CF8DF6AA4CA88B69F78CD065C53F929BAA58507FD3E3D8124C4BF287D452AF47AF9F4D926DFDB529A8ABB8BB57C5C7611A97053A0CB0B01C754CB479C6CD3A3E867BAC33E45EA0BB6BF77E0B2EC2F136DAC0E259FA309FB5F6D8E7005E1696CE203C5D054E5927A87A1B4E81E73F22FAFE61D7D64CBFBE519D39E716BDCBB37657E71B9390FF04B3C01C6F6842684115CD7F5AAC208EEA48906890248E58D1615634CC1263CD3ADC14B67F1A1A8ED2626E7237AF5488F5D269973F11458E3E4FC2EE35A4BF49C2F5F2361939FA243FA8F33B54EEEBA9B0453701E367A7BF4D698C62DA64732652C68C20A956522826F8E29A764BA93DBC98FCC87E59A1423886694057E131333C5DCDFF3BE7A1F0D344A2DEBB90051721E0226178DEED353A136F69481F83651BE3281C562D6127914CD24C38FFB327786086B08EBE89D03A33BF7B5DCCF90DE9C4D907D308E08A616C5343C116A098786383009DC70787AAFB4529CD27CF85F946B8B238AD2F00DF109FC84CDB48BB52B73E1DE066636176E8C6C76216105486C553511DF1F0664EC1E04EE0B0BD74A08070207486B7F326C3EE73188AB5BB7F8F5643093916491D62F0DB18675BA4CE90B2AB310BBA4705B65A581FBC5E76842A99D4926AE5BF7B8EABCE5FA30CB98C1BCF0E0708DA970096234D47BFE23A4F9ADE29BE5A8B6BBB748EA1C13D00388AC90B65EE10BE6A9AC422EBDDAF5482422AECE19E702F6D26ED954D4E489CC48B2E39A6F168E98E11C1DFCB4A843354F1AFD447962E5090CCF51DDF6643CE0AFAFCF3E4363187E69C31AB796132EEB04F2D4976A576B9BC8D9B1D491B74613C1AF32E3D2DEF408ABEBCC27E4A915C983E10B6090FB2DE6FF9E60C96CF4F940B09AEC048E7A174711798FD76DB15DCAE0E570BE3AC147E2F8777A522555B0898BCD7B04ABBF060FA72B04604C9A583FEFD02B2AF9FA035F97DE4DAA4EE777F9D6985149DB6C2F0A33EE1A1436B38DFDFF87F831E83399C6A884273E612433EE3958F37C99A748DF151E3EA011F4DF5F0050597685E0230DA1B1C7095E1203EA7099BA5C43E58AB0EDA60AF65291C3CC9A07257D71CA6C9EAB93CEF41294853A67A5B11F9192C96A36C701F142DC36B046218BEBAD9904FB765550598F8E2F49F5F0AD2608117196751E7E4C5CC4C3EF425A921C1EE15F37A1F80DF1E24163CA145EDB0FC4D988B8C7167ACF9CD94F919AC96E5469859FDAEC54E1970007EB9699342A9AA044A8EE478A3ECF8B59B0109EA7640C218ECC1E8CBC5E2FB61A1748B7C038EFDADC2D096BC29D95B1BE770D097AFD8B0FE02173A1B3D7110F80D6C849F1AFD1B01A60894B16140F9B34D96071A753545159C4FFA4DBAA938BDEC287C6B83751C5E699724AB355D1FA0E081DB286EC83343877C520E856C4ADC65322AEB39CD87B7D8E4FF9222E085ED84C58B7FF513AD77F8A9EFF2760A03F69AE5DD14DD92DD3F2D3D98E97B1987086B3EEF2F2E822C851B7ADD83903786C050F30C4A4F4BA9361E49ACAD503E2A07EA119752E12D4FA09DC83F7A48EE3DCC1F09475960B6839CA736E498A128F78E58279063D839ABA88AC9E5BC24BC07BBD2DE1CF2E1CCC5987E63F83780D0ECF07EAE21C8C752529735B37C980EB320DC949468C69B17DA8AD612825A84D0529EB97FF8C4CD225FDFD1563BB6C5360ABDCB3339434A298DDCF5F36188F3AB501E505828E8D2FD6DDA062AD415C56414FD7557170F0F57BC5A401FA648699F3C7F7FD8F1F058849B817FADDDC24726DF851D3644414F55CADE30A5764914675D574EAD4D4DB8725866A6C51BF0EB23B12FBA1E101A6F3BDB98A2884D0F2B8DEB3F279E9C38EBD0209DD05C0FCC6EA715257355D0D6BE2C8BC7835187CDAEA43A8EF9C59E88AF6AA667A697A3DF8BDE250EAF4341A835B5EF93CFF97656133B49E13213949A3F368D985E0D6C793319F4284DFADA383137DC5B000B7FDD85F27865DC633562949BBE4FBFF75417AB109F03015BD0F67728969435EFAE791AC72C6AEF99A385A3E8B4C35F58380149C653FD78391A7C3B26A3550D37F9639164979288BEEE99E36AC6F44D0FCBAF0D210839D563A6249059A30CE6F047F5D541FC8A90A18610A8BEFB9493C5AC804D34D40881CA82E673788870705BCD585044B11F1D9BBD6B17D8B82B7CCC0554D1E3AA7F2762FE01385571C9FA7A103D07C1A209504876189DE4B3C5910C26C5F33EA725A7D57CC30A6EC8F3EECF2409F1234A094556C0F7941CFB30FE86F208FEB73C8E8EA8623640AFBDB1CC589768A714CF945731DEBF4519B70870FB3A50F1FB368ADA3FB217704A5D46D879CEFF9BB72667ACC673CB196AFAA0DB1160CC2CD7B260DEB791A94D0988ED54B7E45F33E7CDBA0FA105F3AF3CB1521EA382B1266DF304C900BF53E195CED03871A22C50DA166BB9441CEC83607083195D6CFA17297B678ABB5E03950160130B47E25713B0829F64D2552EFCF404F65798A86D5899B72150A91BA00F7DFBFFE82531497B60C31C28992377A2DFD5FAC8A9C16C835CE4DC24D0389277E6355C655C8A33C89BD48F55C13EDE24B9BB348DEC89612F0905719743C95C0E8B5653855676CE171F812ECA405B6F96F2212D1A5369A11379282AC0C5AC41D +pk = 112207EE865D8F5C4A1953200EFF4B9CD183ADF5F7273EC368B9E6136769F7242444BD9B3BA1D208FCEB00D6A22F73401BB7079B62A36F4512F4097F933059B7C9864EFA90DE27D396A5DF25BD0BD055BE17E314762DCFC181D0DFC91B87F12402 +sk = 112207EE865D8F5C4A1953200EFF4B9CD183ADF5F7273EC368B9E6136769F7242444BD9B3BA1D208FCEB00D6A22F73401BB7079B62A36F4512F4097F933059B7C9864EFA90DE27D396A5DF25BD0BD055BE17E314762DCFC181D0DFC91B87F12402ED4950B286CE3A9553499DD854275271B3F02AA09FCF9ECBD40100000000000000000000000000000000000000000000AC50C59E66B7923B10BD887EFF94236D21B8391D8903C88B92FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5191FD455D3045648E389BFC8BD80B8BAB143168575BC4AECFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004CCCDC44728558A699584C4CE11F983C614A1F82A62B162D45FD0AE943126CB3105EF02C629297F55F77F32C09DC440019C1441F891A3C2D897DF480E0117A36603A60E8126FA9EF5796928FD9456EBEA70B8CD3BCE7075EBA20AA5E92F838007D96E85006EC47F85576521DBA6E0FBAC937AC0E382243744FB88263699624E6AA4A4097DB3108A5C8B6E979A6564800AB780A1D31F4359816733146085A03ED705B1BDB4620F6F50FF1BFFDF70A8A12E5B2C376811FF82993A453026A2C9100 +smlen = 3062 +sm = 3826E68E7DFED6A4D2DED374397D32624DDC2CE4E4172273B5B99F4515873DDB5B93ACFA43B1260F22A8FFE651898623DAFE336ABD4C03313D173AB55F2C7DF4719BBD808337621C0D219983B2BCEECBC2B0948B7B6BEBCF1EB91B7CE14CAD3B000397F249F297B275118323415CA218F521C40DB0232D22E92602037CD089CC8205845616257A64D13D32C646C73EAD577BB802256414F510EC1271B1482050953C852E85C54B56EF29A19D02815CB96624017AB03A043E222E98539B8D431BDB2DB8A869026B4860C07058A0399A70B6B6FD6D3206ACCEDCBCAE952C00100DE43EEBE157E43D9F54130C668A153907D65BB19856A1B7C2FD5E2C770FD6BACB13BAEF951EB758485C128ECE4F3E9377A58A45EBA1C3A9CA5C94B50714088700D6FDA933ECE3A6989EE77A824A9E99674748A90B7F227B589250C9E156A8E50B74A7F49DE036FCED86CA0D4C02E217EEFCAEF7234F651CE4380B86389D7331C7657AC283F58C781F904405ACBB68661310EC6921C1FB7483E74116378086D4A0C9A52AF9847BB3CE0FE97F5A7C2CF588DB3B6FD725CA83391656CB38FCB6D79531E56F5D42FC0CC20D04AD7BBF57001BF2F8E6B335CC57CA2DB23C247EF9B75BBBA3159030975D65B9AA7C10E0FA4F615F77126D5271129D8839A3F8DA30C79174373C4BA643E4C4F0CB26BD5B8B9F7EA56DE459EDA15037D8772478FD9F7F7E06F3B422DF0B425DBF1E91D3893CE20F78CDF1910C5D4674EFADF122F41D6C7D6290DF59FA029BD82E792E758AD4388F9D352E9D2FBE3E58810C380D1CC5768865D24BDD92145DBD1EE0D4724C769EF5CEE12DB2AE2708B4C8C7865E70CA31386388D991D46C4DC4DAFC5CE66CB24D455BEE01488A7C764A308C7054572FCA0CC74A01A2B1F191C54146FB1AAF55B834F998B50909F3D003271E6504985DC836B5C44655B938769639799F2575BCFA92F13D32B283A5BDA11177CE1F66D6B30788415BEF598773E87B4C8C41F0CE6633B6C945A3B4C46B74F30945EFD99CF3709FDAFAEB4BD4C6BF605F89C7A9B4EEA1A6599F0A32CE3F2C58587EA8BB3FE6495D92F2FEEC52BEA3DE2047F5EEA7EA1453C762201FF1291AFA87923107F7FF586E00D07824EE021649ABD2D6E9EF11A1D31726EA9277134341EC57D790949590A963D25D6FADFA9CA21E43ACB7E5ED4CB6E8BB36377C2618997943CD100A927D395376871ACB9619BDE9B1FFD5E48E271952613875FA3ACD3E1F2E872F1D672AAE6E2A575A4FDC4FAE2DC6A7196E7EBA94AE5B49BE41E7295433ADF49A6D2D945F43699D444A726423CD9164B9E28B0AA4485B0C767A9398DF5DC5F23D27889C14B1ABE98880E7BD5DF9AB3D1321D5493A0A8B91EA4827627A9B59308CB0104CD8DA7D9DEF2D47B27074BA007401415E900DF03F251C8AA425F0FA59D74C41BA7A9288C8E280141CAAF6C6932DDC4184F81F5C33F0FDA005BF3FB6A0A9169A709875AE475302D57CE96D3DB332188202597FF29D1F9EBAD2B0FFA27C14CE9CCA58C923283BA10E9FA1689D6C2B8804225D706E09FF97AE9CEDC27D256E8736DAA54382040648F2F6BFBECD6C3A9BFAF5D1ED23EAD00EAB351F1E0BB4C719AE6A1F5D12E7F09ECEA62A2F554B18397FE1400DA1EB6694635D7C9C626E0FC82CF8DF6AA4CA88B69F78CD065C53F929BAA58507FD3E3D8124C4BF287D452AF47AF9F4D926DFDB529A8ABB8BB57C5C7611A97053A0CB0B01C754CB479C6CD3A3E867BAC33E45EA0BB6BF77E0B2EC2F136DAC0E259FA309FB5F6D8E7005E1696CE203C5D054E5927A87A1B4E81E73F22FAFE61D7D64CBFBE519D39E716BDCBB37657E71B9390FF04B3C01C6F6842684115CD7F5AAC208EEA48906890248E58D1615634CC1263CD3ADC14B67F1A1A8ED2626E7237AF5488F5D269973F11458E3E4FC2EE35A4BF49C2F5F2361939FA243FA8F33B54EEEBA9B0453701E367A7BF4D698C62DA64732652C68C20A956522826F8E29A764BA93DBC98FCC87E59A1423886694057E131333C5DCDFF3BE7A1F0D344A2DEBB90051721E0226178DEED353A136F69481F83651BE3281C562D6127914CD24C38FFB327786086B08EBE89D03A33BF7B5DCCF90DE9C4D907D308E08A616C5343C116A098786383009DC70787AAFB4529CD27CF85F946B8B238AD2F00DF109FC84CDB48BB52B73E1DE066636176E8C6C76216105486C553511DF1F0664EC1E04EE0B0BD74A08070207486B7F326C3EE73188AB5BB7F8F5643093916491D62F0DB18675BA4CE90B2AB310BBA4705B65A581FBC5E76842A99D4926AE5BF7B8EABCE5FA30CB98C1BCF0E0708DA970096234D47BFE23A4F9ADE29BE5A8B6BBB748EA1C13D00388AC90B65EE10BE6A9AC422EBDDAF5482422AECE19E702F6D26ED954D4E489CC48B2E39A6F168E98E11C1DFCB4A843354F1AFD447962E5090CCF51DDF6643CE0AFAFCF3E4363187E69C31AB796132EEB04F2D4976A576B9BC8D9B1D491B74613C1AF32E3D2DEF408ABEBCC27E4A915C983E10B6090FB2DE6FF9E60C96CF4F940B09AEC048E7A174711798FD76DB15DCAE0E570BE3AC147E2F8777A522555B0898BCD7B04ABBF060FA72B04604C9A583FEFD02B2AF9FA035F97DE4DAA4EE777F9D6985149DB6C2F0A33EE1A1436B38DFDFF87F831E83399C6A884273E612433EE3958F37C99A748DF151E3EA011F4DF5F0050597685E0230DA1B1C7095E1203EA7099BA5C43E58AB0EDA60AF65291C3CC9A07257D71CA6C9EAB93CEF41294853A67A5B11F9192C96A36C701F142DC36B046218BEBAD9904FB765550598F8E2F49F5F0AD2608117196751E7E4C5CC4C3EF425A921C1EE15F37A1F80DF1E24163CA145EDB0FC4D988B8C7167ACF9CD94F919AC96E5469859FDAEC54E1970007EB9699342A9AA044A8EE478A3ECF8B59B0109EA7640C218ECC1E8CBC5E2FB61A1748B7C038EFDADC2D096BC29D95B1BE770D097AFD8B0FE02173A1B3D7110F80D6C849F1AFD1B01A60894B16140F9B34D96071A753545159C4FFA4DBAA938BDEC287C6B83751C5E699724AB355D1FA0E081DB286EC83343877C520E856C4ADC65322AEB39CD87B7D8E4FF9222E085ED84C58B7FF513AD77F8A9EFF2760A03F69AE5DD14DD92DD3F2D3D98E97B1987086B3EEF2F2E822C851B7ADD83903786C050F30C4A4F4BA9361E49ACAD503E2A07EA119752E12D4FA09DC83F7A48EE3DCC1F09475960B6839CA736E498A128F78E58279063D839ABA88AC9E5BC24BC07BBD2DE1CF2E1CCC5987E63F83780D0ECF07EAE21C8C752529735B37C980EB320DC949468C69B17DA8AD612825A84D0529EB97FF8C4CD225FDFD1563BB6C5360ABDCB3339434A298DDCF5F36188F3AB501E505828E8D2FD6DDA062AD415C56414FD7557170F0F57BC5A401FA648699F3C7F7FD8F1F058849B817FADDDC24726DF851D3644414F55CADE30A5764914675D574EAD4D4DB8725866A6C51BF0EB23B12FBA1E101A6F3BDB98A2884D0F2B8DEB3F279E9C38EBD0209DD05C0FCC6EA715257355D0D6BE2C8BC7835187CDAEA43A8EF9C59E88AF6AA667A697A3DF8BDE250EAF4341A835B5EF93CFF97656133B49E13213949A3F368D985E0D6C793319F4284DFADA383137DC5B000B7FDD85F27865DC633562949BBE4FBFF75417AB109F03015BD0F67728969435EFAE791AC72C6AEF99A385A3E8B4C35F58380149C653FD78391A7C3B26A3550D37F9639164979288BEEE99E36AC6F44D0FCBAF0D210839D563A6249059A30CE6F047F5D541FC8A90A18610A8BEFB9493C5AC804D34D40881CA82E673788870705BCD585044B11F1D9BBD6B17D8B82B7CCC0554D1E3AA7F2762FE01385571C9FA7A103D07C1A209504876189DE4B3C5910C26C5F33EA725A7D57CC30A6EC8F3EECF2409F1234A094556C0F7941CFB30FE86F208FEB73C8E8EA8623640AFBDB1CC589768A714CF945731DEBF4519B70870FB3A50F1FB368ADA3FB217704A5D46D879CEFF9BB72667ACC673CB196AFAA0DB1160CC2CD7B260DEB791A94D0988ED54B7E45F33E7CDBA0FA105F3AF3CB1521EA382B1266DF304C900BF53E195CED03871A22C50DA166BB9441CEC83607083195D6CFA17297B678ABB5E03950160130B47E25713B0829F64D2552EFCF404F65798A86D5899B72150A91BA00F7DFBFFE82531497B60C31C28992377A2DFD5FAC8A9C16C835CE4DC24D0389277E6355C655C8A33C89BD48F55C13EDE24B9BB348DEC89612F0905719743C95C0E8B5653855676CE171F812ECA405B6F96F2212D1A5369A11379282AC0C5AC41D + +count = 86 +seed = 070FFB907EE8AB7152A9D380DEA2C4C4796780FCFD80906C5E489B917A45D5E7EDFE6F37C4420E5480E8BB599FE36451 +mlen = 2871 +msg = C07185E0343DF2A4201649AD5DE4CFFA20BAF5DD43F5E4A6C81CD5143FE72865A7C036A2DFD617D96626995C12EFAD019FF44E0EDD7028F29E3657EE3C0D02E9CE83EF0A648FD7CF183A7BF7C15095E0F9278B14FDF6C983CDCF2987DD0CC085400906DCD0D14ABA60124F4B7494ADBBAE3A8D6052122575F99792F7240EB17864DC6D231721140E43F1110E73EB2E3C05049783B33AAC4E4CA0A248775BAF81FDB03D114508928BEC3169A810296B5A4DAC27E7C7F8D01CF5943CF4D8CF6EE6F9042BB300E50EEA3224D35C9628E38C368EC3B42393FC820371DB6557216A2C2D5A230FE3A7C6BCBDD89A2BE5CDBE7F783BA379B6A4237DB051E6256DCE14DCF641190A956E8E85EB2638736B899ED045636DDB7A351F5A4F4108D9D6E0413F92B9D392495299128A5F4ACCE8C7747C675EFE05ED7182DB51C515B345029440AB61A904D2A390122680C951ED4575515144C5CA80D6F14D1CFDBB5373B78E09D04D0544151CFA1240790CD31165048D1484DC4D11D05057071DB3433DF071B367E00FD38C386DAB689E4DFF6FB421B2A95FF54DC29375C9D1C18A76C79ACAE3D3F35D4CFC385199A4CCAF6C9F0421BCF58D296EC7E0D1B95A6C4BCBAC1271F94E438360A71A6440275591E41389B30CAF2626A865B9E59552CB198A1D4453EBA6D0F6FC491A8A7783B4A8BAEB81E54F9189CE493EFC1C5D830A4F637F2BF43CD86B91637611415C95685FE79966174312FDFBF33A646625F97521B5CB1F008135B824F1D6D8373006C7158E62B1F794AE34548A0C6DAC8B60C559D81580AC0D84034A501516EE36CB4082732918365A5AB787FACE591AB02BE6957AE4BB96B58E2B173DA019D3E0CABEBEBA0AF775779F14BFBA8F595697731522DF3C80CBDEC16F6ACC32659CF5DAF193178307887EF1BE1B48B5806D0FA9868A7FB853708B26873857786B974709C687D6597BCF6C7E476C1E47CAFDBF30B6311ED434C0F998C4065399C59073C1F2BAB1D46104E74EA6C976D416E58BDFD24CCD957CB431870DE5DA8763992EF68BB18075926B0E4E826095EB3B8CAE086FB1759C94B873A1F4DF477E0EE9EED8DFD7C77508B3F0C67F69BE04355ABA9344960639F6DD6B3A956DCD66370338617A365579C5993986B4F748CB7C990344B209785E22A40FDCF8F83061D37C9F1351B4473D6C74ABE6B3EB2A7D62CA0F0C88A0AA8A46973F781DF0126E8D55D3E9C41C2E3884F84FB0A06C484CFA0C9A0DFB8CFD573749C711C7C236B0F2F144E1BA4DB2525C093DEED29434FE43CB3040C5A374CFEF33214FDD2D660398E91BF070A4F5F9746C2F08C41256FD5E955891146FFD38B155987E6A0FC47AC2A5950509B9E2C86B9DD9929378F43EF3935F1562672498C5640A22315BE15B001D4B01418DF8EB41DFE5C570E850582D8916C2E7FC2B728048E24BB9D1E8283615E039C16A2FC61011631BBD8F2BEB24ADF9552CF5797CE05D9D1A7E7F3F5455017B127D9BACD32BAD0CDBD3991BBCAEA5FC988EE7AEC0B1003732F25489EDB0A1F9897247CBC40E60F1DD276259CE19DECCB90067F7293A68B683FB5232ACD2217B8929859109D6852A43892098630A67D72B1CF4BD5D58E20C5C18B85D69DF74EE8CC69BAAC7DA48EB71A160F03B68C6BE87A4919736F14363F004EA3F41DD37FD8E621BF433BCA71E17565E060F3C0F889515D0A8C17FE0D6D734FF756256B0A62058B95422257780DE000557DF289F47910CC272A14BEC737C0715F204C49F03150082DC904A5D170F7383F04F1E355F50F80D5461CBA53490BB2E9484806D369D61FD00ED1EE5BE518D04A24503B1C4C08C7CA084902A3942C04143807203287A985EB3FCAE3C5309410CD9B9A548F54DED44321CE8C2A04679841DAEF7FBB6AA11091D240AFBB467D9969C31C1CBF6B24F8CBFA20CB4CFA404B1310400271664763E9C1CD1B6FE5FF2A0FAE22AB14EFC016CCBB19C5DD5D047750DB4ADDEA3E7A193128A5F4D7BB6358F21B39A44259695904DE3440BB28CF9466B562065C387189EAC2F7522C9385DC2A607F6F9335FF8ADD47C7BA932659AFF69B1F26EC8655BEE4F97FBC846E48111CBE25524873D1DB2F2282D0472A2AAA3CF491C26DDC5E1BE77866A3B692E417E6717A4F4454C56F97F063B9E598865B6F71136D65DDB0F3CDEC57DECD5A57366BA96E4315A88B4EA3479321468FFFF508D23B0701A62CE0CBC0FA37C91CFF5C5A0433FD61AE11A922575F5BAA714DE46A58D6EFC79BDB10C9AF7E9950A61D44B3E17E3B5298501146485B562B1570FF5798B47641D67091CDF90902B2D762E3EFE94C540DE4A28269CC416EDBDDD4D43AC2FA82D638DD9BF11F3BF22FD81CC4BD4759D7D864EEA0E8E8AB71796254B278CF9B650D1FEF38B8437362B2D69ED84C54498331C6899E20C596FEE7CAD9ED8D83D86774AFA6E56A4ED34B0B0842B21CCB67035406DEDFF0CECB0CD089929ED5FFA0CE210822444808BAD99AF603082BFE5C98EE4653349F8A43DB64CF90190C96B0446CC9CD23E0D75B47F54A731E8BCB0A4C67401DEE87876011033D2A526067FB73786FBC1CE696130FCE5D5379CDAC6788875D27C04783B1E2EF41063D57E3D6560D1FF48882C39131C95BAE5A9C9392DAB6CD17EEFBCF61C464A4DBC08447443CBBF3FA80481F3BC1A5806042C07F7A7AD435875DDB1001565EB6B7B872CC6C853F771C1DD5D9C16BC27ACEB3C7690125C1907C7CE904852108CAFE76351269A3D3EA8812FAE4FAE35F0DAEC8E8B186F760005524998BB5DE475E4DF85209DA915BDC972218AE7DB7E2EFA05A7D752AE61CF2F3DC26CA2D282C8E32B4838524BE460971E077348290FA0043FB7616D821A71DDA3A5FB76BFCE0DC84AAEA432DF32B05133A26B46165297EBC45024777A868B8B1B0DD6F97658BE799BD366CFDF99861E916F7CF06C034E4F79594F1BB6ECD9B7347911488928E1E473C4B8C73297F7ED845B9EC59020373EDA57A436C1C9D1459C6114BB6258543D8F4F97B10AAEF5A2E082EA173EE69702D83711FEE6AEE8F6B260D03AB74C3B5D8FDDB81B208E16458511270DD1DA295F25CDE7E44A8349B60BF0C59D4B425C1FBA60D2BCBA47B906D2830D8D5C091DBA756E61620D78B2DFF28407FDC9DA9113CBE82219BB2CC05E11C70D040BDE821AA17B3E981558961CA571E5D5041F7DE047A1727D9C904DEEBE561DC6DBD8876BC77C27322F512D6171BC03871EB0FDECE70F119BACB41D1852220CFF26110EB0EB78E39AA1B2A4C2E78679F53683520C5A57FEA71A8E96E0AED33118DC4BDD035FD88F535B011D9C7DEB6F406A072AE6C091016ED10A5A4EE9827882EE27C535262D1D745AA5231736F2DEEC8A6017BF0DA36B416C98AB71C6824A6EEFF3564665007C9E850FD02A1F5E201B534627B92D21A493DF293DB9F24DE70C7B49A6E07ACF2DB6C90B448681666DCDA318C08AAD08D3E257AF7E774C75DEBE3B3C07AF683735E87F205B0FDE07351849C5AFD07D5722C6AA17B6AC2CC3551C305E6AC31E3601A236961F6618CD3A0F7DCF6F65B8EC82E27E44C8518CDC16ECF79374F796A3DAABE2D5005B25576B35B021497C5A8F9B98DA68D80E56A1CC1044C04DFB11D36CB147EABFDAAFBA0A93FCED8675D7D6A9F999785C0E7346F4C68EB17C0A2409E2F5BD4AC5551FF66A9857C66F642F2A385131377B6372884C417E01BFBBE1CA748AC8969BF2C0BD8944767746D1D57D862795E8ECF9E8A5CA122D0259FFBA822588C5ECCD14CC6FF4B7354CB572F5BD695ED9D85DE131FDD97DD5D6CE7844DDF9F3D112028B5125AE7A77A4AEB2EBB554682A26F457C43FE96D67C90BE7E49FF443478E82D3A48680D737D1260B8210BBE962EFAE6505E496B1B6D4F1042A7B971605E2DC50BE3BDFECC3010B9F5618D3A1B2C1F48888B859E4D6B63CA9D29990B6D502FC22B738B203A83D597B48D73C41860E4E99C57181F5B02F108CA193451025F3B368CF2741244F42B27CB9E57260D2E127CA166B32E0B9C927B247B31619B1D4 +pk = FA504CF77C4FDA63BE02FAF5C77315588E4512A8A28E28FF9D52EBA6E8D9E9D5BCD9F20F4EA3CE624329876D69584507EC002663B5244FD836C9E2B5F55C784C7C925228C4188A05A73E227D17FA22D68A7C2708825EB82CF22E302E39998C2402 +sk = FA504CF77C4FDA63BE02FAF5C77315588E4512A8A28E28FF9D52EBA6E8D9E9D5BCD9F20F4EA3CE624329876D69584507EC002663B5244FD836C9E2B5F55C784C7C925228C4188A05A73E227D17FA22D68A7C2708825EB82CF22E302E39998C240253CABF059104A5CC8D3B73B9CACDABE3479C0E4056C776275C0800000000000000000000000000000000000000000000463CEC107D8853F99BB4B49AEE20C2E42B6D2B7F55B504AB1EF5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D9F10E85759C6D1B3A87457B299173F823EAF9619957DC3F4F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AC0F953B393A4C514673824F6700220BD8A1FEB018544EBA5D9E877D5A2E69A14F72B50606BF3CB7284B0F4C4D12CE004BE3E5830097DEE7EDD6E5E14E3F625219AC341BD679D56C09DD45CC815AE4F685CDD7572CB9FA36E585308977E0BC00B14A0D66192EB8A0C26376EE1C7ECB4448360711AF7F2261B5A17A628143E389BAD6EC7399DF5ECC2B8A361B2B721800FCE44733282B69EBEBE60571DC026FD205DBAC335A2AA0A1EA998E25AEA6DED646022A2431DD61809EF4CFB8D7E4B300 +smlen = 3095 +sm = E99122084AC80C0D3C3C14A49438A889969402D8BB91E150ACEA5381E7EB31CB7C976D0C5FE95D897A7211827E83A237A5BDB04ED44A6BA7E2B9F6A81DFE525B4C9CB13A928AEBF677F1E2A96C93622F127B1A01006DD4CADF4903F7E49C6C1A0000731A1C42220F2389B45A90F1851A7F7E52F17A140F63F70202F0837916B393E6F27B09707B9AC82F657B90A3994F44C5670136371CE9B77A65A615079F6C4D4F2CF2913D908062F526E003916472099B2173193449CFBFED6DC55F0078C37EE66EB28E02C201E0F4184E62702607796B16046F124F561390C2919F000615C07185E0343DF2A4201649AD5DE4CFFA20BAF5DD43F5E4A6C81CD5143FE72865A7C036A2DFD617D96626995C12EFAD019FF44E0EDD7028F29E3657EE3C0D02E9CE83EF0A648FD7CF183A7BF7C15095E0F9278B14FDF6C983CDCF2987DD0CC085400906DCD0D14ABA60124F4B7494ADBBAE3A8D6052122575F99792F7240EB17864DC6D231721140E43F1110E73EB2E3C05049783B33AAC4E4CA0A248775BAF81FDB03D114508928BEC3169A810296B5A4DAC27E7C7F8D01CF5943CF4D8CF6EE6F9042BB300E50EEA3224D35C9628E38C368EC3B42393FC820371DB6557216A2C2D5A230FE3A7C6BCBDD89A2BE5CDBE7F783BA379B6A4237DB051E6256DCE14DCF641190A956E8E85EB2638736B899ED045636DDB7A351F5A4F4108D9D6E0413F92B9D392495299128A5F4ACCE8C7747C675EFE05ED7182DB51C515B345029440AB61A904D2A390122680C951ED4575515144C5CA80D6F14D1CFDBB5373B78E09D04D0544151CFA1240790CD31165048D1484DC4D11D05057071DB3433DF071B367E00FD38C386DAB689E4DFF6FB421B2A95FF54DC29375C9D1C18A76C79ACAE3D3F35D4CFC385199A4CCAF6C9F0421BCF58D296EC7E0D1B95A6C4BCBAC1271F94E438360A71A6440275591E41389B30CAF2626A865B9E59552CB198A1D4453EBA6D0F6FC491A8A7783B4A8BAEB81E54F9189CE493EFC1C5D830A4F637F2BF43CD86B91637611415C95685FE79966174312FDFBF33A646625F97521B5CB1F008135B824F1D6D8373006C7158E62B1F794AE34548A0C6DAC8B60C559D81580AC0D84034A501516EE36CB4082732918365A5AB787FACE591AB02BE6957AE4BB96B58E2B173DA019D3E0CABEBEBA0AF775779F14BFBA8F595697731522DF3C80CBDEC16F6ACC32659CF5DAF193178307887EF1BE1B48B5806D0FA9868A7FB853708B26873857786B974709C687D6597BCF6C7E476C1E47CAFDBF30B6311ED434C0F998C4065399C59073C1F2BAB1D46104E74EA6C976D416E58BDFD24CCD957CB431870DE5DA8763992EF68BB18075926B0E4E826095EB3B8CAE086FB1759C94B873A1F4DF477E0EE9EED8DFD7C77508B3F0C67F69BE04355ABA9344960639F6DD6B3A956DCD66370338617A365579C5993986B4F748CB7C990344B209785E22A40FDCF8F83061D37C9F1351B4473D6C74ABE6B3EB2A7D62CA0F0C88A0AA8A46973F781DF0126E8D55D3E9C41C2E3884F84FB0A06C484CFA0C9A0DFB8CFD573749C711C7C236B0F2F144E1BA4DB2525C093DEED29434FE43CB3040C5A374CFEF33214FDD2D660398E91BF070A4F5F9746C2F08C41256FD5E955891146FFD38B155987E6A0FC47AC2A5950509B9E2C86B9DD9929378F43EF3935F1562672498C5640A22315BE15B001D4B01418DF8EB41DFE5C570E850582D8916C2E7FC2B728048E24BB9D1E8283615E039C16A2FC61011631BBD8F2BEB24ADF9552CF5797CE05D9D1A7E7F3F5455017B127D9BACD32BAD0CDBD3991BBCAEA5FC988EE7AEC0B1003732F25489EDB0A1F9897247CBC40E60F1DD276259CE19DECCB90067F7293A68B683FB5232ACD2217B8929859109D6852A43892098630A67D72B1CF4BD5D58E20C5C18B85D69DF74EE8CC69BAAC7DA48EB71A160F03B68C6BE87A4919736F14363F004EA3F41DD37FD8E621BF433BCA71E17565E060F3C0F889515D0A8C17FE0D6D734FF756256B0A62058B95422257780DE000557DF289F47910CC272A14BEC737C0715F204C49F03150082DC904A5D170F7383F04F1E355F50F80D5461CBA53490BB2E9484806D369D61FD00ED1EE5BE518D04A24503B1C4C08C7CA084902A3942C04143807203287A985EB3FCAE3C5309410CD9B9A548F54DED44321CE8C2A04679841DAEF7FBB6AA11091D240AFBB467D9969C31C1CBF6B24F8CBFA20CB4CFA404B1310400271664763E9C1CD1B6FE5FF2A0FAE22AB14EFC016CCBB19C5DD5D047750DB4ADDEA3E7A193128A5F4D7BB6358F21B39A44259695904DE3440BB28CF9466B562065C387189EAC2F7522C9385DC2A607F6F9335FF8ADD47C7BA932659AFF69B1F26EC8655BEE4F97FBC846E48111CBE25524873D1DB2F2282D0472A2AAA3CF491C26DDC5E1BE77866A3B692E417E6717A4F4454C56F97F063B9E598865B6F71136D65DDB0F3CDEC57DECD5A57366BA96E4315A88B4EA3479321468FFFF508D23B0701A62CE0CBC0FA37C91CFF5C5A0433FD61AE11A922575F5BAA714DE46A58D6EFC79BDB10C9AF7E9950A61D44B3E17E3B5298501146485B562B1570FF5798B47641D67091CDF90902B2D762E3EFE94C540DE4A28269CC416EDBDDD4D43AC2FA82D638DD9BF11F3BF22FD81CC4BD4759D7D864EEA0E8E8AB71796254B278CF9B650D1FEF38B8437362B2D69ED84C54498331C6899E20C596FEE7CAD9ED8D83D86774AFA6E56A4ED34B0B0842B21CCB67035406DEDFF0CECB0CD089929ED5FFA0CE210822444808BAD99AF603082BFE5C98EE4653349F8A43DB64CF90190C96B0446CC9CD23E0D75B47F54A731E8BCB0A4C67401DEE87876011033D2A526067FB73786FBC1CE696130FCE5D5379CDAC6788875D27C04783B1E2EF41063D57E3D6560D1FF48882C39131C95BAE5A9C9392DAB6CD17EEFBCF61C464A4DBC08447443CBBF3FA80481F3BC1A5806042C07F7A7AD435875DDB1001565EB6B7B872CC6C853F771C1DD5D9C16BC27ACEB3C7690125C1907C7CE904852108CAFE76351269A3D3EA8812FAE4FAE35F0DAEC8E8B186F760005524998BB5DE475E4DF85209DA915BDC972218AE7DB7E2EFA05A7D752AE61CF2F3DC26CA2D282C8E32B4838524BE460971E077348290FA0043FB7616D821A71DDA3A5FB76BFCE0DC84AAEA432DF32B05133A26B46165297EBC45024777A868B8B1B0DD6F97658BE799BD366CFDF99861E916F7CF06C034E4F79594F1BB6ECD9B7347911488928E1E473C4B8C73297F7ED845B9EC59020373EDA57A436C1C9D1459C6114BB6258543D8F4F97B10AAEF5A2E082EA173EE69702D83711FEE6AEE8F6B260D03AB74C3B5D8FDDB81B208E16458511270DD1DA295F25CDE7E44A8349B60BF0C59D4B425C1FBA60D2BCBA47B906D2830D8D5C091DBA756E61620D78B2DFF28407FDC9DA9113CBE82219BB2CC05E11C70D040BDE821AA17B3E981558961CA571E5D5041F7DE047A1727D9C904DEEBE561DC6DBD8876BC77C27322F512D6171BC03871EB0FDECE70F119BACB41D1852220CFF26110EB0EB78E39AA1B2A4C2E78679F53683520C5A57FEA71A8E96E0AED33118DC4BDD035FD88F535B011D9C7DEB6F406A072AE6C091016ED10A5A4EE9827882EE27C535262D1D745AA5231736F2DEEC8A6017BF0DA36B416C98AB71C6824A6EEFF3564665007C9E850FD02A1F5E201B534627B92D21A493DF293DB9F24DE70C7B49A6E07ACF2DB6C90B448681666DCDA318C08AAD08D3E257AF7E774C75DEBE3B3C07AF683735E87F205B0FDE07351849C5AFD07D5722C6AA17B6AC2CC3551C305E6AC31E3601A236961F6618CD3A0F7DCF6F65B8EC82E27E44C8518CDC16ECF79374F796A3DAABE2D5005B25576B35B021497C5A8F9B98DA68D80E56A1CC1044C04DFB11D36CB147EABFDAAFBA0A93FCED8675D7D6A9F999785C0E7346F4C68EB17C0A2409E2F5BD4AC5551FF66A9857C66F642F2A385131377B6372884C417E01BFBBE1CA748AC8969BF2C0BD8944767746D1D57D862795E8ECF9E8A5CA122D0259FFBA822588C5ECCD14CC6FF4B7354CB572F5BD695ED9D85DE131FDD97DD5D6CE7844DDF9F3D112028B5125AE7A77A4AEB2EBB554682A26F457C43FE96D67C90BE7E49FF443478E82D3A48680D737D1260B8210BBE962EFAE6505E496B1B6D4F1042A7B971605E2DC50BE3BDFECC3010B9F5618D3A1B2C1F48888B859E4D6B63CA9D29990B6D502FC22B738B203A83D597B48D73C41860E4E99C57181F5B02F108CA193451025F3B368CF2741244F42B27CB9E57260D2E127CA166B32E0B9C927B247B31619B1D4 + +count = 87 +seed = EDBCC4F6AD0F30066947D678A368B960CCD164889D77730516B444ED2DF10B49C101902F5FA227377C3163A0045B34E4 +mlen = 2904 +msg = 836254422C7D13F1120012FB9CC7CDAA1D8B72F6FA3943AA7DE75263D3DF814BBF2E80C3A204BC0F9AE33E4FA82CE893D35C57E41C7147602BE12455B00B7949A3195264A3281CECC3FDE34802B28C6E1F2B505AB6087D453BD6AA067B2370124840BCAC4605EE4F14EDFC4B4FF19A4D7A828E60156B49B4027AC18DCCD20294F89CCF03D0CF47BB2F22D3749EEE69EE17AB5D8E4DFCCF36824D23E3F95E959D0494FFBC712CE3975E3A661B3F9E149A0234F691C2D820000DE97CC016C43EFE958DA469F740610FD22B64D4BD2E30075E22BCFD4AB41D952D2394FC629F016EE1CD61AAB4581F62A7B8648F8F8CF02462C81023CBE2755C91195A5917FE5A8B5058ECB8DAFF91DD3F73FE38665666DBF79CF6F203FAF94A5CA3F3AFFAA2C2BD5F5DBC011DAF46FD7CEB74B5875E4B5D80B6EDB9817106B91865267E78731662218C8EDE73E588256FB1AD57232AA5533D25BFC54452612F0C2AECAE6DE19355E1D508B888D18FF9F6D7D68199755CF5C210172F65342269ED96C77D80AF8A244B43A99DEB49B97A6F358AADFCFF6AFF72AB39540D375165185F31E0F1A6F97722EE365620BC5D642F8CDC59F7E84FD8615F4A336ED340BE6ED8451997D87B7904C1B9A3A0BD1F8A01AFD6A2D9F5B995E3FD0D44DF8FBC8389B6CBB5537816C91F0EFC3D2349F15EEE747B254C5BBF9418BB979294423DD6DE4D13484408362582A86D082350CC79EBCDCC05B70110A038736034CE4F3DC1D17E5D11C9C7620D40730B61437906933193D1272F7C89C701D495ED682F1335B7E1C42C994E090A67D932A8E825F4B9EDA8F2A94B9A1F11F10E91396908A9D436DD01BAE1D1DE2C6ACF458C0880E3F81ADC2240A99E6083C9C188982713DB243028AB07DF407218CA6B3C4C93989AC96D92375834B915B724F2A105D6240E52B9D7003C67FF76F7A325D84ABBC229266BB40D1DC8784CE1A4A6BD17972CDB26C274B06337D525F61B5BF952D23FA13757460B7B8A3B99EB023831F4FBEF72D62931348622041FFD12634947579BC6E16BD1EAA8E8B2DFD54D74EFCED79EF4FF31AD42036DEBD0FDA3B7F3F8E7A3F45955F82936A67122CD42E38AF646CF565E294F422FAC1E7D274185896F58E9D0FA1FCD3F4D379ECF5B566586246216556939BDF86D6A417C3BF77C64F95D7DE8197EE25B44EEF00209D33159710DF001372C3E3D09F24B9B08B8938C522690674A7588933E1CA37D2C14DF50777806EF6FD2285771A44F6DE90475C6CC314DF140C3962DD9D70C54E58CC5FA3302D69C80C6511D9D42A51B7CB7FD7FEA8D8BD65A66FDB2AC80D945FB7EC72E138F5566CEB570968D84B60068DF20C6CDA2AD48372DC97424793FEA8D2136923070C25F47C3D10839D1747B613B93530968D5E97A3FC0F563BFFCDE7B42C839EFE66C3A8655D0CEB5AF7A37D23DBBB52D05CF6FCBFFA7C7491703349819AD94CE218912557D6C87937B2E7B0473856EC78713C29A02CF7B2B38E0DFE16804AF6C2BA8607026892138011E06B4AF179D63DBD97CB917B6507B798E58D74F485D3F063C044211E428FBFFD5AF2D7941900299602D3B15D5D600B435D9A21948B8D87A35205A3AF9AA9BA491D56573A93C35AF6683655E04A7A17F1B9709ED83E70D82A3DF59A2FB7C051ABE508601F322FFEC089C49DC666BA04366C038AD59D397022F0F6344255F4D98BBB17120441CC75107005A74DB35459C63770547A4AFE59F2703894DEB67612448BA7C4F6FEADC1717F6ACE410C6BE62AC319CD33AF285D17D55F500E364A0ABE71D357AE0802AF464B6D2732F3FB94BDB3BAA497F2E44727BDCCA5A4B65AE9DF189FF1AC640940FF4D479A8072D34ECC523DC8FC7C87FC89A540485AE7BB3F29B041446CA427C0B48CA7515A1E31788E8B53E1122D372B6557F8D2A97CDE893B20E60283954E2934AF340A358A4376DD0CFCBFE305A2CE7B72DCFE2DE105CF44833F548D1BCE88D34B60BD29B69309DD87F4B91DE10EBDD7D7F87D6231307D0AC784E0496DB725AB97656C34E60B34B230F37E30FE326296C4E1BB88C0BAC261DF0E5F45E6E126103EED6B1CA146D58140A8893D847E92D9F3A0A883E8BF830147CEDBDC7DD42C1A58A826A8A827F9AB26ECCF64F68E9CA6B68261260B659B47E0DEDBF5B077982B24ED9B36E8466DCB21EE69B5E2BCCC49A163B4860EC2CCBD65032776DAE601E18ECDAB8E35C2760D5758592F6CC074298A97FC5E82E7DA84036FD10E0725A0E4E58CC4DB30499ABEC0C7D95D88BAC2C58EB093312779BC1B8619FF2762FD1FF009273456D829394664C31FF6D7848B27174B36E59FB65D6BEF6D974D5038A28F49AD465B28857CC12BAAFFABF3652C2E22B46B040E579FB040A0FB4B1DAF0C157D35407C0B78E305CEEB232E7B7426C95639B1CF7B079E80521FAA538E51E69255576650C3A16E143D0F815D2CC89EB00AA13AF20394AA23CC6AA99A9F297D886AB9AF2655D53816E066A02CF21C277DADDEF3D7D0825D094FD8FBD5386139757EFD0B7F8501829725A4B70FF1DABF2958E07ED21DB76266A88483EE7C51A7D215E1B41D2464911ABBB1DC71F9613ED5446E4B0C97BDD47F22B372FB7662956FDCF3B108E0107F74301A054FB004925B041AF354C04C20FD370CE1A014EBEBD8311F3265A2F78B48124521A4AAE240D3BA9F94FD33CA4A92D24A029E0754831869B58F670435A44DCDD7BF75ED9FF06DBA52980DCE49C1C26BA0965DE3623F459E36127AC6AFAD4D5598FC45A95173D039CBBE2CDC7DAB2865FB6BC0FA8DFD33C4A826CFC77BB7F45CB5AA73377A27271AE41630DD3D4E2722581537FCFB233E5AF8F04CA824012B5C429EA498F4AD44AFC249DE2229FD7266FE84173A5CE44632B3650D6E1F278625D564B374C10C1AFA3F17432CBE4B65327C6B6E0CD2F99B68AB043C5C6C99D7FE7FCF940F4887D309D7BC0FFAA5DC4B90C79266514F46CA2D5477F2B84B04E30DCAFD0224170FA6D4BA9AD2A6DFA8ED73DFF9D5D40D43F02610032719A7C5646CCD453CEF409B4325F3FB6D9B9201FB115E4DFAA0B4D29959A44518774E94B2D4D6D06C7F065973BECD203F5CF6CB59F869340EC6BAF0121049DB3E1146234CEE4657C1B821AF817DA27BD4C9B1103C81F5B5161E6A9329D83D6E4DAE1F3299858CD201222D34A85E2991BDCF32E9771F3E701897F647D62729C9805CBF118C9FA727B056A7271A23181B92F033DE1EF113A856A884AD527B8DEB92085AF3DB509FDB0265FBA3376B31BF753DFA477DD5E247D939109F31CD430A692BCEC4D9FC7C5B4630CAB90C64B75496BC7CA54D5621FE3315AD03EBF1AFD6D436BD2DBCBE707B35F916CFC147BBB5B8AD2E80ABD692834E42E0724C8B901F5924212C4129F7451B9DD860A85855D1AC59F0B6B87A66B6A395DD81990AA3DEBF64C91CEA6862B5793BAFFF81677FA2928E950D94A6333B0E77A15AE461E710BE70AFCB9FE6E0C21C5AD188E439A6E5138A2C5AD17126E759D48491E3F3F93F81EEB77B7B3A6ADD96917CF0BEEA202EEA5ADB3D5593A3DC9FF1F8F05DBF5A2707EDBB6640EFF5B65A0003CCED2EB480942A13C1F1CCDF9994F1D11DBEF0D3BA7C3801AA508C17BCF287A928B635F475195D88ADF9F4C1CA7D3D1462DFD0F6939B89E5ED95F177BBB12253391876492BC01AFF1C1DAAF0A1C7821C2A4E33F52BADF51987E010B391FC984328E020206EE98E9C8E6763120055F99725E48356FD800E11CE973D00C800C353A5DF8B028E1E42F817C7433084C440E47532FC639172533DF35F0FF43257841C3E4EC7DD7F601EAA81E9886FA3253844C195A62F89FA5D292536BE8CACD80C94BBCD1A83C985936353C9233E512431A8863D7D8340E89307547BD10B16BF2C7E0BB01AB8093C70E4F4C8FD30608FA14FF072D81048391C07DDD82475A280D4EDF81F739AD1A13BC6483C3C37BF52ED52CE8D568AA81864ACABE225BC6467C79FBF43781F29B0C508E6825D4E56D25E45A8C0C6298765069FDCC66B2C5492FDDFFF69D6F5975FCD81041F30FFD7813BA3219B3139583EB588DDC57851E581FBD5E20127EBD +pk = 69806CCFD3B14DE9794E5A3C5F598B4AD580BF29CD59790CAB19DB97339620CA6854D1252B440A126B6BDDD7A2FD1B0B0A0525F34E891FCCEB8A403AFC054074EEC772A8C89D7CA54FB2FAEB758DF6451A8BD45467F91DE2071EBBC535D8202D04 +sk = 69806CCFD3B14DE9794E5A3C5F598B4AD580BF29CD59790CAB19DB97339620CA6854D1252B440A126B6BDDD7A2FD1B0B0A0525F34E891FCCEB8A403AFC054074EEC772A8C89D7CA54FB2FAEB758DF6451A8BD45467F91DE2071EBBC535D8202D049F38FB31026B48A6B2380BC75BF482487E8837CCD64E10818D0E00000000000000000000000000000000000000000000B6A2EA04334DE0F39B65C09C985352D020279259E4AA5C8E54F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75A168FEACE66EA7BB05AA0BE86B36231EFF0B530CDC951013F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004AAF7D8B8DAE001E9983CE8E15CE2020D34C864A4E237E0725796E3CA9BA9B280E1FFA36581252CD60F7E6443E28B600B78AAF33B4EA669496B8C2859B164205427C5CEB314A397A7F37E18F5100DEA2BD399BCDB7887450170EB6DF6704550041CF98A984F732F33A88C948586A82CD8543C19C0EEA281BAFCA802FA5BFE1B05FD3C28DE799211C89B855ED51E8A5002B6D43ED61C7310D9E649EA1971CDD8874D0FB3B226B50C816F294D7121408603B36FED9C0AE2110BE6508839C28AA00 +smlen = 3128 +sm = B7D69B13D44D476433E1FC090134A495E106A18A80DCF29660A647096B97F7DBC7FE3A96FB0E0F6251BAD2B2B07A7E36D8F9C73FE19A4F358E0F477B1D0BF4B87C6FB8F6F73FD668BECD8729A78DB5EDFD1B051834F4B4491149C5A1017A653802016970E05E9528A100D8277A548E191F0ED9BEF9EB0BD0B43B00E7A198CD861C718F9A04A01AB7B40001AE8E223D45A5FC0800FB30DADBEEA5677C5FD655BC897523E8DE4B1DE354696115000FB46DC90D2ACA9709F1831263ADB4BFF7DF2B732CEFEFD70013A16293C71F964844F64970888D7D283EC24721C6FEC1001704836254422C7D13F1120012FB9CC7CDAA1D8B72F6FA3943AA7DE75263D3DF814BBF2E80C3A204BC0F9AE33E4FA82CE893D35C57E41C7147602BE12455B00B7949A3195264A3281CECC3FDE34802B28C6E1F2B505AB6087D453BD6AA067B2370124840BCAC4605EE4F14EDFC4B4FF19A4D7A828E60156B49B4027AC18DCCD20294F89CCF03D0CF47BB2F22D3749EEE69EE17AB5D8E4DFCCF36824D23E3F95E959D0494FFBC712CE3975E3A661B3F9E149A0234F691C2D820000DE97CC016C43EFE958DA469F740610FD22B64D4BD2E30075E22BCFD4AB41D952D2394FC629F016EE1CD61AAB4581F62A7B8648F8F8CF02462C81023CBE2755C91195A5917FE5A8B5058ECB8DAFF91DD3F73FE38665666DBF79CF6F203FAF94A5CA3F3AFFAA2C2BD5F5DBC011DAF46FD7CEB74B5875E4B5D80B6EDB9817106B91865267E78731662218C8EDE73E588256FB1AD57232AA5533D25BFC54452612F0C2AECAE6DE19355E1D508B888D18FF9F6D7D68199755CF5C210172F65342269ED96C77D80AF8A244B43A99DEB49B97A6F358AADFCFF6AFF72AB39540D375165185F31E0F1A6F97722EE365620BC5D642F8CDC59F7E84FD8615F4A336ED340BE6ED8451997D87B7904C1B9A3A0BD1F8A01AFD6A2D9F5B995E3FD0D44DF8FBC8389B6CBB5537816C91F0EFC3D2349F15EEE747B254C5BBF9418BB979294423DD6DE4D13484408362582A86D082350CC79EBCDCC05B70110A038736034CE4F3DC1D17E5D11C9C7620D40730B61437906933193D1272F7C89C701D495ED682F1335B7E1C42C994E090A67D932A8E825F4B9EDA8F2A94B9A1F11F10E91396908A9D436DD01BAE1D1DE2C6ACF458C0880E3F81ADC2240A99E6083C9C188982713DB243028AB07DF407218CA6B3C4C93989AC96D92375834B915B724F2A105D6240E52B9D7003C67FF76F7A325D84ABBC229266BB40D1DC8784CE1A4A6BD17972CDB26C274B06337D525F61B5BF952D23FA13757460B7B8A3B99EB023831F4FBEF72D62931348622041FFD12634947579BC6E16BD1EAA8E8B2DFD54D74EFCED79EF4FF31AD42036DEBD0FDA3B7F3F8E7A3F45955F82936A67122CD42E38AF646CF565E294F422FAC1E7D274185896F58E9D0FA1FCD3F4D379ECF5B566586246216556939BDF86D6A417C3BF77C64F95D7DE8197EE25B44EEF00209D33159710DF001372C3E3D09F24B9B08B8938C522690674A7588933E1CA37D2C14DF50777806EF6FD2285771A44F6DE90475C6CC314DF140C3962DD9D70C54E58CC5FA3302D69C80C6511D9D42A51B7CB7FD7FEA8D8BD65A66FDB2AC80D945FB7EC72E138F5566CEB570968D84B60068DF20C6CDA2AD48372DC97424793FEA8D2136923070C25F47C3D10839D1747B613B93530968D5E97A3FC0F563BFFCDE7B42C839EFE66C3A8655D0CEB5AF7A37D23DBBB52D05CF6FCBFFA7C7491703349819AD94CE218912557D6C87937B2E7B0473856EC78713C29A02CF7B2B38E0DFE16804AF6C2BA8607026892138011E06B4AF179D63DBD97CB917B6507B798E58D74F485D3F063C044211E428FBFFD5AF2D7941900299602D3B15D5D600B435D9A21948B8D87A35205A3AF9AA9BA491D56573A93C35AF6683655E04A7A17F1B9709ED83E70D82A3DF59A2FB7C051ABE508601F322FFEC089C49DC666BA04366C038AD59D397022F0F6344255F4D98BBB17120441CC75107005A74DB35459C63770547A4AFE59F2703894DEB67612448BA7C4F6FEADC1717F6ACE410C6BE62AC319CD33AF285D17D55F500E364A0ABE71D357AE0802AF464B6D2732F3FB94BDB3BAA497F2E44727BDCCA5A4B65AE9DF189FF1AC640940FF4D479A8072D34ECC523DC8FC7C87FC89A540485AE7BB3F29B041446CA427C0B48CA7515A1E31788E8B53E1122D372B6557F8D2A97CDE893B20E60283954E2934AF340A358A4376DD0CFCBFE305A2CE7B72DCFE2DE105CF44833F548D1BCE88D34B60BD29B69309DD87F4B91DE10EBDD7D7F87D6231307D0AC784E0496DB725AB97656C34E60B34B230F37E30FE326296C4E1BB88C0BAC261DF0E5F45E6E126103EED6B1CA146D58140A8893D847E92D9F3A0A883E8BF830147CEDBDC7DD42C1A58A826A8A827F9AB26ECCF64F68E9CA6B68261260B659B47E0DEDBF5B077982B24ED9B36E8466DCB21EE69B5E2BCCC49A163B4860EC2CCBD65032776DAE601E18ECDAB8E35C2760D5758592F6CC074298A97FC5E82E7DA84036FD10E0725A0E4E58CC4DB30499ABEC0C7D95D88BAC2C58EB093312779BC1B8619FF2762FD1FF009273456D829394664C31FF6D7848B27174B36E59FB65D6BEF6D974D5038A28F49AD465B28857CC12BAAFFABF3652C2E22B46B040E579FB040A0FB4B1DAF0C157D35407C0B78E305CEEB232E7B7426C95639B1CF7B079E80521FAA538E51E69255576650C3A16E143D0F815D2CC89EB00AA13AF20394AA23CC6AA99A9F297D886AB9AF2655D53816E066A02CF21C277DADDEF3D7D0825D094FD8FBD5386139757EFD0B7F8501829725A4B70FF1DABF2958E07ED21DB76266A88483EE7C51A7D215E1B41D2464911ABBB1DC71F9613ED5446E4B0C97BDD47F22B372FB7662956FDCF3B108E0107F74301A054FB004925B041AF354C04C20FD370CE1A014EBEBD8311F3265A2F78B48124521A4AAE240D3BA9F94FD33CA4A92D24A029E0754831869B58F670435A44DCDD7BF75ED9FF06DBA52980DCE49C1C26BA0965DE3623F459E36127AC6AFAD4D5598FC45A95173D039CBBE2CDC7DAB2865FB6BC0FA8DFD33C4A826CFC77BB7F45CB5AA73377A27271AE41630DD3D4E2722581537FCFB233E5AF8F04CA824012B5C429EA498F4AD44AFC249DE2229FD7266FE84173A5CE44632B3650D6E1F278625D564B374C10C1AFA3F17432CBE4B65327C6B6E0CD2F99B68AB043C5C6C99D7FE7FCF940F4887D309D7BC0FFAA5DC4B90C79266514F46CA2D5477F2B84B04E30DCAFD0224170FA6D4BA9AD2A6DFA8ED73DFF9D5D40D43F02610032719A7C5646CCD453CEF409B4325F3FB6D9B9201FB115E4DFAA0B4D29959A44518774E94B2D4D6D06C7F065973BECD203F5CF6CB59F869340EC6BAF0121049DB3E1146234CEE4657C1B821AF817DA27BD4C9B1103C81F5B5161E6A9329D83D6E4DAE1F3299858CD201222D34A85E2991BDCF32E9771F3E701897F647D62729C9805CBF118C9FA727B056A7271A23181B92F033DE1EF113A856A884AD527B8DEB92085AF3DB509FDB0265FBA3376B31BF753DFA477DD5E247D939109F31CD430A692BCEC4D9FC7C5B4630CAB90C64B75496BC7CA54D5621FE3315AD03EBF1AFD6D436BD2DBCBE707B35F916CFC147BBB5B8AD2E80ABD692834E42E0724C8B901F5924212C4129F7451B9DD860A85855D1AC59F0B6B87A66B6A395DD81990AA3DEBF64C91CEA6862B5793BAFFF81677FA2928E950D94A6333B0E77A15AE461E710BE70AFCB9FE6E0C21C5AD188E439A6E5138A2C5AD17126E759D48491E3F3F93F81EEB77B7B3A6ADD96917CF0BEEA202EEA5ADB3D5593A3DC9FF1F8F05DBF5A2707EDBB6640EFF5B65A0003CCED2EB480942A13C1F1CCDF9994F1D11DBEF0D3BA7C3801AA508C17BCF287A928B635F475195D88ADF9F4C1CA7D3D1462DFD0F6939B89E5ED95F177BBB12253391876492BC01AFF1C1DAAF0A1C7821C2A4E33F52BADF51987E010B391FC984328E020206EE98E9C8E6763120055F99725E48356FD800E11CE973D00C800C353A5DF8B028E1E42F817C7433084C440E47532FC639172533DF35F0FF43257841C3E4EC7DD7F601EAA81E9886FA3253844C195A62F89FA5D292536BE8CACD80C94BBCD1A83C985936353C9233E512431A8863D7D8340E89307547BD10B16BF2C7E0BB01AB8093C70E4F4C8FD30608FA14FF072D81048391C07DDD82475A280D4EDF81F739AD1A13BC6483C3C37BF52ED52CE8D568AA81864ACABE225BC6467C79FBF43781F29B0C508E6825D4E56D25E45A8C0C6298765069FDCC66B2C5492FDDFFF69D6F5975FCD81041F30FFD7813BA3219B3139583EB588DDC57851E581FBD5E20127EBD + +count = 88 +seed = DEEE61A2FAC04E4D6B7A250124DFD91518D9B90A71FA02665E3088760BF69CB3CD7B6977F860A7026819D178623C9676 +mlen = 2937 +msg = BD2B4058218A15C008A4BBBA29592079583F684FEAD3E6B3F09ABFF0DBCA23670AE4496077D47945E5F1AC3CD4ADD5763581285D80DFB43BBA9C0730858293FF6A15915AB203FBE65C118B87EA37DFA1E06CBC0F24EBA3F43A8BE17FF1DAF4277CDA2CAE8AA924E852C9D60524B98306927746C4EB26DC9475E8A0D0F920F33E1AFF9D07EA5561E70865B2D8161B86FDD7638E7A72345DD72EE95BAE1EBD2C24D2A5510ABE3FC2CED397A067D215F6088D63FA63F2247427917E5C4FBA14F0A22A04FD0AC1D948507751F3523BE2B0A0CF2F96DC61F8187ADF646D6914667759D49A6DF9A327830EFFC9470CEC6C82EA127A8B0C6510203879FAAC4323145931E146D962846BB1A6E84CB2C31BC686E388C853413EA7D3EBF7C752C6AEC774637EE01F2817A5AF133928AF35F23FC3541FE7FA749A863A048EFED2F8CC2BA86520B97FDE0324C68D1DDDE1E430C30DED0B25664EA676AAC6B1F22925A40B319CAA37DD5DEDB99DE4D963630A6FB0E8B00AD8F2A2B9BCC497A00099A70A9DC190A2AB2A058930E63FD6DF342A625E9A095EE79137CAEB8885117C7A9FB8DF7A35D5A300D6F7EEE40578A7507EDC38A0D6522474E672F156FEDE7E1690C3BBDFF40342F1F3AD3C34325BCDBFF0A68249858C777551683A9F3AF225163C9323A4AD5E666E0A9F44C6496269038AAC5DC2767966C1560C5A09207406F3C47157D2FE5909346D8ACBFDDF3E3D19FE48B7C60E1C8CFB2EAAB19E736B2595D33A0AA034726CB6146A01EBF5CC72EB1182B9A4BCEF90A1AAF74079862CD775F8F773BCC490F6015B4D5469EE0BD95C1A32A1FBF283FCE1FBF6F8CDCFC1884F4D2A899F3E7A95414DE419D56462F502EE703CDBA007C3BB78F20243C35B882C90CB7DE3CAE3F0468079C546645977347BC183FB0A6CD24481391CBDF9372E2D6765B6CAF8EB0145BB269A47A1B4E2CDF9901D6AA284D919BA57163AB9929E715341BACD81F35BDBFF36D59A1EDABFF3CAD2C122386A6335348A3170337B94E4336B2B74E791981656CB5234A6F84DB4142D3F323000FA98BE61527F7548DAB6E83928E9DD2E461F08A5BB52F241BB42254E5746FCCE0F3620ABC69A6E275B5E06A333360F9B809562ED116AA6CC2334694AAA4169310ED6AF695678DE22D3E551DAF61C0A6C5F6C0F36FD3469A3B977F6D295E75ABB804A43E1E7AC4708208A94E8368DCA40856F1D43C9865D98F69F1C0BA9C8B33AC9CCD18D400D2559B1CDD82A0C875B5E136B97C02126C81A81EB5D1E421221564100450531DBD97BDA77C1B0186527ECF526CE6BCD0ADD5668382D984AF9277A21D40C06EB4BBBB0CCD6F64E90272FD632D47A388D301377EE745FBC9CB4C02E1F096DDF303BCA4E1FB4B6DF867676080CDFA6A29CEDD15003EE636DB8C74E7E293A087B1A5F62334585369D12D9876ED0F334C6711146643FD598F0D69BB3475D219D1F89066644897A9CC5630BC84C0CB5844087216038C8FB6750D0968D3D3E2D29D93639486C76DC045900AE1A13529E74BECEB3338684402BBC3EB36870E0B37584E9F309BFB0DD9B966F0BE1298DFE55D1A94A6767CAE5EB3120133B7D7B71C9F2A538A97F8548FB176B0E8923B14AF28AE26306214F1D392AE63C3736B9F9374CA10EBE93370C11BEBEB45D066477F374866C8A7208CE6DCEC404194BB1F833DE0AA4700CA29681FA0F72D98679DC3E1E142852347B01DAA08E5CBBFD242F7223600804E066FB5C98C8358370F5D390898FA44023A30F824F1C6A95B8E23308B4BE474D03E34CF72BE65F90D698DFE0D2828A797BBF8397EC87AB9EE00C76A1C7B3CED0100D3A1030136CAB9A69F05CBE58A4A56A9C700BC591B87783DE59369F2E62D5B885DA09F25835A6DC06F954C19B347724244FDA69E3356A4EF60F6A41CFF3BB7CB22ECB128415CD1B89A9AEC12B66F1EC23B14E7D7FD601EF7B000A0C96F386216F75710EB2C12817DABA1D1295E7535331CB90A9B0D8F7542E73DE2D93FE554063F57274DF27BFB39BC4B78B72A88473408086D8DF531E53B5BE018E076032D1F8EF86D7AFB8E8867B9D7728A25ACFB6856D83592CADA4494977678A9F4D134F49A8598A8E0F23D3B7A09B5308243410CA6F47E0BF8C43871600817460BDEB74E7D32C2FF7C40EA4BF924E795516FF7C7BC8E5FD5D64CC489F1894C6BCF0E9C312B1EE7E2BC68739372E7402E6AA2ECDCA39C18D7441F0FF373946559C475E37D4ADA64B98283E5A64BE7BC2D1A1C148D2CDB4EDA35F591D3A7E7CE15162F50FF1B025F87CBB82289FBE7F9C32DB8F23012CCCB87ACA7D758D42019B9A8C15F508CAC9284928F46F0DC1C1B6C6B4DA030DB9286FF8D3762EA4A83D096AE04F98E9416D3DAC59E04F9E4E4359AD76926BBD9570A3D5811F69A1C4345B646BD946D0168ED62A7A431D920D707D8CC7E840BB9CF13D8ABAE8196D9177E8C28CE0DD9EF647EAAF0D3C97E52CB31B560EA7067B45AEFB5EC2B7C7BDFA3996D1C7E467636BFA1BBE11D1CCF86B64ADE9FAF9287A23502E9FF711CA97D6CC09DE814A67BA6123A8E4E67CF6E8CB6F7B36621BC6192ECEE94D61860703AC8411B16E19644A6AB01813402629AF52301C9D76A94CEE22B1DCA49F13B130028991C8AB383C8461433383DA92AB34F1EBB4124B24C6C391EA44EE6E736BBC7A2D4660A878A600AE39B7DCCAA51ADBE90BD705EA51AD13C05E611749D43DE336D396352CB0673ABCE7473DECB0FC708EF28DCBE18C85EE0068FEF64685ACC3A7D0DA9A21DD0AFB10B95D81F6AE437022218B6094CE35D01248EA85A9EC6FB56A7A2A8453EB03E6CCBEA0F2EADB015D8BE3D09739EAC07AD9E3F17D13E5F71CADFA220ECAE90EA50BEA87B19CA6FC5DF31874D51723BECC80C8845C9EA718454D2817EF8AFD99B63090CBA6C8089AFA78770222FADEE3B3B829CF36A8153EFAF2CF28DC4651FF37A8921E402EF81A0F457FC1802AB06A759BF4071F082BFDC100AB612A4584B5AE19354854101AB0173D7D6A5A0637CCB58AE58978A8BEFD5A2C51D3D53150C336C0C0C2A27B442E2BCE120C4CCF8D97EA4584434A6F48C0245B63B2255BC52ADAD4EDA9279412D70BE457F7DCAC492FE53C06EDEED766B46EBC3419E6DA2A2847251F75C62A5FE7AE74F0DD5AF50A447DA6356DCC828C5F1A2C0C873E57041EB1158296C038B91F2E13D3D4B2887B284384A9ECB8BB378BB311F4ABB19E1B90EB3A399C03BFB4CCB29AAD80C55C1636559FC79A6C894B5BAD8D529BF680631541A45EB0E57BA5B458A05F456C60FBB593DAE90AE549416AF96642A486F10843482AFC3989BBD1E8E4DDF0791204F4B720ABD2D8995C87C8A388ECB14860CF83B7A4406FB6C8C9393475082D24E516C5F1AF91CEBA444D8E460D0695746BE057EA8D76F8C0C80358F3DB2AE5B996272737516EF5E4EF5A1FE5967304CB6D00090C9623D29F0D4BCE8CA3CBD54A30F9597E01E5845C1CDD8777E18C5D5D86492FDD0606F623D11A28DD9F02032E3A378C71B757B52021DCE6CEEC63792CEA24D6DD7150AC8FCFCA6554F7B08A5529D59628D0F35122504DD1542F6291BEDBEE09F81AA744A0F6C6DFCA6207FBFAB6B9E17E8A4040741F6508471E72D227D0FDC50C13F444310245AD17BF819FFBBC4E0485FA68CF1F0A4423F251538F25DA989ABCD008C803D368F626438432569F12D1612370E4C6C971079371081B37D8DF7EE709198AAA2FCBD443B96732AAA4E6924A461B60CA4F4CB13E88D539AAD709A3DB84D2D6D26671A9F3877125B7A358389BBEEA846A32E949DB9A7853DBC7D5ADD92729CE1B5C00680974F3DDC6A8235C7319B6CD1CE5E0B66FE7C2F1115206C42B4C02990D79EFA8BE94927543C19EE93D0EC8811F9330693696C878CFADAA2D56E877D42A3680AB2F6A576FDA7BF7957F781655CC664A0A4A0D16CE34D04D7C98A9E0C93D2E6D42870FE66864660B564ED4F881693D466BD68B6470AF03A5A6E703DBB40515AF5DCA7142C4C8D79F5BE4BB01A1B56BE9D0936396A7EED9A84DA86A4F00DCF676B4942D5DF6E1378EA26D9118A54E17FC623B83AADB417EC82F9AFCACEABBDCFE2F0B6AD4BC1601B4E24F547D61D1C1737ADBCB46D98287372C +pk = 8FB1BD9F9840A7C85394DB787993BAF12B7498976623ABE1246F8780FABBF9C0FA513FF51364AD8ACB6FEB210B38173812CDDF1E8616B72401456C089EB0B994969C6F4E1EC40F2D9A0F51D7BE7FA5B9CC1882BEB99B854DE0841CFD69104E0A0D +sk = 8FB1BD9F9840A7C85394DB787993BAF12B7498976623ABE1246F8780FABBF9C0FA513FF51364AD8ACB6FEB210B38173812CDDF1E8616B72401456C089EB0B994969C6F4E1EC40F2D9A0F51D7BE7FA5B9CC1882BEB99B854DE0841CFD69104E0A0D472A986E46805CD9CAC5F47BE4879CD149AF8FDE540E8A80F70200000000000000000000000000000000000000000000246116EE446E0402F6BABFEE10E1EF5AEA45F37674AEF4C297FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F254CA9271582B6E372E1A8956AAF896C46BA0D566B347355FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AB6F64866E9BD09D3A8B4F80553998294042DBCF3D46FF3746CE4B316E3F4CDF2B435A67271997E0D343351FBF5D9700BDFFF744DAAD7A206177FF51E47939E9D802FE7EB9C75BC4F3264740AED12ED62C48C706199EADC396D98AAE2DCB9900C6040978766326A71B1116321A3FA8F268304D1D5BFC516A8D30890321BDAE3559DB50CFA70E7DC93B5AE6F9D229FB007D8CE7B53AF5A24848D4CEDCC9A9138BE6EB886C71065708CFD6F8A5BE52EB8AE52C8FDB5B23DC7EFA816A7B1DCA9600 +smlen = 3161 +sm = 825F845C51DFE953427B6AC09CBCCA38267292531185C312C0154A0A2D58A42B81E34D22FCE959DE458B873DB308971369A57D2195A41E9E644A313056E48F3760B3BE92DBC45691AB2FE4E8E21E3046B99D2B9D3C6265AD9668193AE01A681200081827D8B0F13935FD1AC0E62EA0A935C63A8E7793AB2AAD5803AF745E38F87BB47A9B30696607D1FCE9D91894236ED500250128E1204F7E8E6A24D69A794D58D184D522D1511C807B4EB103191C8E5AAF5021B79E964B93A6EB793E0794FF99AC3D4FBE0320D0D2C1B9FD2B48CB5AF10176F351AD69FC4F701A139F00150DBD2B4058218A15C008A4BBBA29592079583F684FEAD3E6B3F09ABFF0DBCA23670AE4496077D47945E5F1AC3CD4ADD5763581285D80DFB43BBA9C0730858293FF6A15915AB203FBE65C118B87EA37DFA1E06CBC0F24EBA3F43A8BE17FF1DAF4277CDA2CAE8AA924E852C9D60524B98306927746C4EB26DC9475E8A0D0F920F33E1AFF9D07EA5561E70865B2D8161B86FDD7638E7A72345DD72EE95BAE1EBD2C24D2A5510ABE3FC2CED397A067D215F6088D63FA63F2247427917E5C4FBA14F0A22A04FD0AC1D948507751F3523BE2B0A0CF2F96DC61F8187ADF646D6914667759D49A6DF9A327830EFFC9470CEC6C82EA127A8B0C6510203879FAAC4323145931E146D962846BB1A6E84CB2C31BC686E388C853413EA7D3EBF7C752C6AEC774637EE01F2817A5AF133928AF35F23FC3541FE7FA749A863A048EFED2F8CC2BA86520B97FDE0324C68D1DDDE1E430C30DED0B25664EA676AAC6B1F22925A40B319CAA37DD5DEDB99DE4D963630A6FB0E8B00AD8F2A2B9BCC497A00099A70A9DC190A2AB2A058930E63FD6DF342A625E9A095EE79137CAEB8885117C7A9FB8DF7A35D5A300D6F7EEE40578A7507EDC38A0D6522474E672F156FEDE7E1690C3BBDFF40342F1F3AD3C34325BCDBFF0A68249858C777551683A9F3AF225163C9323A4AD5E666E0A9F44C6496269038AAC5DC2767966C1560C5A09207406F3C47157D2FE5909346D8ACBFDDF3E3D19FE48B7C60E1C8CFB2EAAB19E736B2595D33A0AA034726CB6146A01EBF5CC72EB1182B9A4BCEF90A1AAF74079862CD775F8F773BCC490F6015B4D5469EE0BD95C1A32A1FBF283FCE1FBF6F8CDCFC1884F4D2A899F3E7A95414DE419D56462F502EE703CDBA007C3BB78F20243C35B882C90CB7DE3CAE3F0468079C546645977347BC183FB0A6CD24481391CBDF9372E2D6765B6CAF8EB0145BB269A47A1B4E2CDF9901D6AA284D919BA57163AB9929E715341BACD81F35BDBFF36D59A1EDABFF3CAD2C122386A6335348A3170337B94E4336B2B74E791981656CB5234A6F84DB4142D3F323000FA98BE61527F7548DAB6E83928E9DD2E461F08A5BB52F241BB42254E5746FCCE0F3620ABC69A6E275B5E06A333360F9B809562ED116AA6CC2334694AAA4169310ED6AF695678DE22D3E551DAF61C0A6C5F6C0F36FD3469A3B977F6D295E75ABB804A43E1E7AC4708208A94E8368DCA40856F1D43C9865D98F69F1C0BA9C8B33AC9CCD18D400D2559B1CDD82A0C875B5E136B97C02126C81A81EB5D1E421221564100450531DBD97BDA77C1B0186527ECF526CE6BCD0ADD5668382D984AF9277A21D40C06EB4BBBB0CCD6F64E90272FD632D47A388D301377EE745FBC9CB4C02E1F096DDF303BCA4E1FB4B6DF867676080CDFA6A29CEDD15003EE636DB8C74E7E293A087B1A5F62334585369D12D9876ED0F334C6711146643FD598F0D69BB3475D219D1F89066644897A9CC5630BC84C0CB5844087216038C8FB6750D0968D3D3E2D29D93639486C76DC045900AE1A13529E74BECEB3338684402BBC3EB36870E0B37584E9F309BFB0DD9B966F0BE1298DFE55D1A94A6767CAE5EB3120133B7D7B71C9F2A538A97F8548FB176B0E8923B14AF28AE26306214F1D392AE63C3736B9F9374CA10EBE93370C11BEBEB45D066477F374866C8A7208CE6DCEC404194BB1F833DE0AA4700CA29681FA0F72D98679DC3E1E142852347B01DAA08E5CBBFD242F7223600804E066FB5C98C8358370F5D390898FA44023A30F824F1C6A95B8E23308B4BE474D03E34CF72BE65F90D698DFE0D2828A797BBF8397EC87AB9EE00C76A1C7B3CED0100D3A1030136CAB9A69F05CBE58A4A56A9C700BC591B87783DE59369F2E62D5B885DA09F25835A6DC06F954C19B347724244FDA69E3356A4EF60F6A41CFF3BB7CB22ECB128415CD1B89A9AEC12B66F1EC23B14E7D7FD601EF7B000A0C96F386216F75710EB2C12817DABA1D1295E7535331CB90A9B0D8F7542E73DE2D93FE554063F57274DF27BFB39BC4B78B72A88473408086D8DF531E53B5BE018E076032D1F8EF86D7AFB8E8867B9D7728A25ACFB6856D83592CADA4494977678A9F4D134F49A8598A8E0F23D3B7A09B5308243410CA6F47E0BF8C43871600817460BDEB74E7D32C2FF7C40EA4BF924E795516FF7C7BC8E5FD5D64CC489F1894C6BCF0E9C312B1EE7E2BC68739372E7402E6AA2ECDCA39C18D7441F0FF373946559C475E37D4ADA64B98283E5A64BE7BC2D1A1C148D2CDB4EDA35F591D3A7E7CE15162F50FF1B025F87CBB82289FBE7F9C32DB8F23012CCCB87ACA7D758D42019B9A8C15F508CAC9284928F46F0DC1C1B6C6B4DA030DB9286FF8D3762EA4A83D096AE04F98E9416D3DAC59E04F9E4E4359AD76926BBD9570A3D5811F69A1C4345B646BD946D0168ED62A7A431D920D707D8CC7E840BB9CF13D8ABAE8196D9177E8C28CE0DD9EF647EAAF0D3C97E52CB31B560EA7067B45AEFB5EC2B7C7BDFA3996D1C7E467636BFA1BBE11D1CCF86B64ADE9FAF9287A23502E9FF711CA97D6CC09DE814A67BA6123A8E4E67CF6E8CB6F7B36621BC6192ECEE94D61860703AC8411B16E19644A6AB01813402629AF52301C9D76A94CEE22B1DCA49F13B130028991C8AB383C8461433383DA92AB34F1EBB4124B24C6C391EA44EE6E736BBC7A2D4660A878A600AE39B7DCCAA51ADBE90BD705EA51AD13C05E611749D43DE336D396352CB0673ABCE7473DECB0FC708EF28DCBE18C85EE0068FEF64685ACC3A7D0DA9A21DD0AFB10B95D81F6AE437022218B6094CE35D01248EA85A9EC6FB56A7A2A8453EB03E6CCBEA0F2EADB015D8BE3D09739EAC07AD9E3F17D13E5F71CADFA220ECAE90EA50BEA87B19CA6FC5DF31874D51723BECC80C8845C9EA718454D2817EF8AFD99B63090CBA6C8089AFA78770222FADEE3B3B829CF36A8153EFAF2CF28DC4651FF37A8921E402EF81A0F457FC1802AB06A759BF4071F082BFDC100AB612A4584B5AE19354854101AB0173D7D6A5A0637CCB58AE58978A8BEFD5A2C51D3D53150C336C0C0C2A27B442E2BCE120C4CCF8D97EA4584434A6F48C0245B63B2255BC52ADAD4EDA9279412D70BE457F7DCAC492FE53C06EDEED766B46EBC3419E6DA2A2847251F75C62A5FE7AE74F0DD5AF50A447DA6356DCC828C5F1A2C0C873E57041EB1158296C038B91F2E13D3D4B2887B284384A9ECB8BB378BB311F4ABB19E1B90EB3A399C03BFB4CCB29AAD80C55C1636559FC79A6C894B5BAD8D529BF680631541A45EB0E57BA5B458A05F456C60FBB593DAE90AE549416AF96642A486F10843482AFC3989BBD1E8E4DDF0791204F4B720ABD2D8995C87C8A388ECB14860CF83B7A4406FB6C8C9393475082D24E516C5F1AF91CEBA444D8E460D0695746BE057EA8D76F8C0C80358F3DB2AE5B996272737516EF5E4EF5A1FE5967304CB6D00090C9623D29F0D4BCE8CA3CBD54A30F9597E01E5845C1CDD8777E18C5D5D86492FDD0606F623D11A28DD9F02032E3A378C71B757B52021DCE6CEEC63792CEA24D6DD7150AC8FCFCA6554F7B08A5529D59628D0F35122504DD1542F6291BEDBEE09F81AA744A0F6C6DFCA6207FBFAB6B9E17E8A4040741F6508471E72D227D0FDC50C13F444310245AD17BF819FFBBC4E0485FA68CF1F0A4423F251538F25DA989ABCD008C803D368F626438432569F12D1612370E4C6C971079371081B37D8DF7EE709198AAA2FCBD443B96732AAA4E6924A461B60CA4F4CB13E88D539AAD709A3DB84D2D6D26671A9F3877125B7A358389BBEEA846A32E949DB9A7853DBC7D5ADD92729CE1B5C00680974F3DDC6A8235C7319B6CD1CE5E0B66FE7C2F1115206C42B4C02990D79EFA8BE94927543C19EE93D0EC8811F9330693696C878CFADAA2D56E877D42A3680AB2F6A576FDA7BF7957F781655CC664A0A4A0D16CE34D04D7C98A9E0C93D2E6D42870FE66864660B564ED4F881693D466BD68B6470AF03A5A6E703DBB40515AF5DCA7142C4C8D79F5BE4BB01A1B56BE9D0936396A7EED9A84DA86A4F00DCF676B4942D5DF6E1378EA26D9118A54E17FC623B83AADB417EC82F9AFCACEABBDCFE2F0B6AD4BC1601B4E24F547D61D1C1737ADBCB46D98287372C + +count = 89 +seed = DAB6C05E29342106CC34769BF419ADCC88010C05B57E673A503E63AE7A4EE55B72AB2CA86C4EF57FC8C02D2E0C8694A1 +mlen = 2970 +msg = 4D83349DD620DC2CC0E9ADA524B9BE9B195973A839A042F4342D69E6B38918507A9747FCDD8B751D7C75ABCE2B482B3313D4C74EA4E7A4A91F2E08A059536B651508307B7F4C3AFF5CF1579F90F32BA1E847778673E3956713C14661AFA2D11CCF61FD8F9BC914D4B6E6D09C52AFF7FEFAE325C180147153C9AE1924C9A2B8DE4900BFBBC6797558B000C5ADB9A8DC4CAFB458AD328F19A2C55D5434BBFA7BE5057E56511529709992BD6527E913B46ABE38DBFF90D4AB3C024A66FC0F8FB34AFB96E22535A0EA8F313A087AA65355D7D5989C486E103FD526A7A6D812C0E4D8C081BCCE4DCFBC64B68436739451BE0C4B67BFCA71BE955BA9F9A23C223C7D0FFB1B2196C9C9845B6AF341A363951E2008BDC4F3296DD0E1E3F480F2E4B0EC77A002ECCFDABCC58D24CB0BAA26EACE96DECAA0F6BF1CDE0175AFA65AD5C23C5E71B50DF778208EDBE426AA6E876C12440D7C4FCCB42D039A14509092784BAAD37D9B8EDF186CD4FCB3D9F8B0397E951777D602B8AF613060FDAB6B358302B3FD28437A06694F36CE12A035F09D677E48D077CEFD1676D8FE51541BC19E3A6D6A5D879C4F9EB4713B7C0F3A652F3A05D74DABFF79A302FDAF147531FDD57924F49E52B298219B03D6DF166B481F232FC85C7CF52838969CED2DCFC18DD8C95891C498FB49289D1A982922A0FC02C849AC3BB7FA92CF43A64464D5BD919F75ADA287FE657BF61DC07B3808C0FD0D71EA24DE5353268B2C17C989C29465BA49111CC479F51A8CC623CFB6FF68149E52C77A7D85B5ECCE66C05900AB9957BC7ED39E03649A103B5B6BFEEB168B7C1F30DCA84AEA509FEC2B215DD95558A2708839396552F517A8FDA28C3ED61F84E1B2E0DCDFA708DE50D44BFC65BD4E70260C437C8B5B7158EC7E2301D9C7AAA68E0ADEF89FDB601711AD2998379145B29CE3681B513DC3BA9B2EB668C1B53697833670466E21E767361C0A4362E5B8DDC38EE6A9C4DC5205EB808B93C72FFAFB635B4254E4F4496BACC753C8ED0BCAA88DB683CE77C8165E8DDDE665392CCCD57BC07573D83CB3AA10648281EFB08F92AACD8AB6F9B5D7FC66D29526BD57E421220FFE375B26C61A0DDBD9807022EB3B4B681A43E7719F5EC255C1E19AE6C542D6DEEF3B94B6960C18D0D7C8110B88F995826073B874042FAF97F1FF034B8257418CA269F5CA588223393B0179F9817E08E7212D0D410EA259EA66BC4A00E7FB1190A732BFDBF7ADEA0E4550BE90C3E37BF33BAF436955742A2632AEDE259235702EA2E079D99A22C9755ED34C1E3CCBE746E728A932B1852F692B103112B303033AD3CE1172AA066860DF570D21EBBA51FAB72D5AFC4AE8995F532AE384CCCC3C4A295AF76A803FE076CCC920A80D82A9B614760EC43208579EF5DEE164356D62EA33953E55195EEE9B2E2018E6FD9D19A9F49258702DBAF6EDBFD093919917B1B6734F012E2BEB4F758DD481FB8A8D7796E755C6647501E28862B9F5B16FFA1C5D80DCB07141806FC348881A5A8891BB632A4AE4292A102D71504D0FC12C79D15BCD0799D30C7B9E72625A7DF7DBC7ECF9EACC627CA9AE5D71E264F2F2A9D5DB8593F3A90F3915CE480ADF800C99FC2C8692F2B57B492BF9D84171F8C29AF8D5549F82D3730927096CA18FF0B0C0C0B8B800508C44D5749B92D7D48F7FBD5C86E408ECE0EAE639AF475073DF5CA2CD5083BC4FF8852DDF5C399946A6B21B0841D137F583E0DDA3A6046F082872B783ECA3E14B21A2AF61BB150847026F2371812B1A2BE72024226F4613DA860AC2FFC578DCB171DC27B896EEFE49F885F9BE4CC8766F37038E01CF20DBB661F507B2ECF2B023203A6259B0A018FC00B2CA9B3107B605F04388D5493AE7CC4BDD093CE761A92847C2A167739E0750B427B2ACEB3ABC5FF751A5F32D36B589787D4DA509C85EAD751353AB2C68A9C14B8B2C8166AEB6F27C7F101221C306AAC74AAB6B4E795525FE12038725D7AF3D2A6D60E1EA85F2B94EA24F1B72FED9DDAD4C8E5DA484E80A2150DE22E6ADEF41153D7B4331E8F011A3CD48DAB02876B067312D0DC736E465F99AC3C9C56321507E79ACCF652E3857C749AD92DAD15350A6B4B67229A3905DB18AB2053E2D4F92F156A1D76D0AA891364002C991E632B53FA217AAC1709F37F3402F43B0753361EB2F595F9FAE3D7D96FF050DCA0B9657F4C3AB49EBDBFE8816051C4E0AFF32C5137749D53B062CB61F7201171B5DD716E9CCB38D00E50955596845DFF602200B30D375A854CA4E9A7276CA1A1D9EE92A04BCD78854BE251F7080ABA6D8325D40B37054596AD80211A50AFCC1DBC177600A70E648D8BEB4FCB8919214894CDDAA6D63B6F6C445469A6866721D4BF1117F25DFF9D65FC8FBE5B0ACC8B9039C7F94B2A5CC6068A0489E2E13A731DBE1094FA8558A601ADDB9E4DAB04FA744CD5B95A9D57C52C8124AD950A5944DEE2C55E5C8540DBEE5823DAA624F57FD5BE994BAB3AD4E74EA9443F8B6024BD6B49ADF3972442D88E61E04FE8478FF28916584CCB65FB15686991D5781CB7EDA067745258EA671E0A2665F94FEA1B5490669D1EE8711518BB911094957586C8075E3BBEDC47BE059053A7658ADFA0ACEABDD46E0DD9647B34EBA32E56B6305653ED386C50E79E15084F00F003B1D12504FDD8E47D03D9F7572276047BD22B82B8E81F87C86E6F20D2A756B16F291179A97B010F993C0F839C9A1238CFC9BDE8074405CF1B35DF423C7566CE965681F21C969E4F3F8FDCA72A18D5DAA80287F53B5F8429FEA81612CF63CCF1B7A13512DB4D1DD2678FE1189398032EAEB4368332972C728AD726B7290302C3C5ACAB6E73432E825B9046F846ADCA9D93780A36095AA5C51E354CC6E9A910CABBE59130E98F4ACB3CB6D4EFDA9E2F78748ED58465937FC81C548AD038FDC32AEC46B078CC5A7207658A9706F1C9653359DE6C4457DBFA71D300F98F9BC5DAA14DBDD5EF20DCEDE7E9D3F7DA5C932AC3338BA40E46B17D89FE38F725129991983D4A81321B394F2D7B20D66E3DEAAEB6FEFC8CFF0B68A766E27CCFBA66DEDDB1F541DEB3C1892ED2AD5D073162F0DD06B82E8878477BC96E03101C9B5D9D0ADA10EC060B45E144B31E6B4DE283FD43538B47178398FDD15B01ED421EE2C65847F7A4E9AECE2F1D13971FFC0157040782AD4B591DEA0906370820DDE1000490AB1C27C03D02A0F4B4BFAB0E56D7257288441CEA63175CD6BD11382E6C873154332E627CE82E37C63889EFBD8537AC35C21AD7A09C986CFEBF13B19D5677C1104B373F3B55198D075AAC608145FF9D0C4C12C83BB41036AB32227629EEB4922F172281A66C23C35B8A3E92DE0A10D5E8C18B9A54D6C30230F3A8263986AC535B6BF63EDDAF6A02C9100B712EC4BD49851A22AF0E647F259C2E19B9ACAEB6147C476C90745A353F6252ADE8212A9F7C215C0B3053BF2B4E0AD225E8B344EC14C1B839877349C3743E8337D9C1EB128B06939C5A08F60A46FA700723EB6652FC26440D9BDA3C99C10AD0742C2F039BE6B66749B77E14F8223509365053E87ED870FE3906A16DA6C62945DD2112C96A23942B1E14431AECA7DFCE3FD4D6633E0B661FB34B0BF05C4D21E689CAC9B6ABD9F507F08E4AAB94BBEF1C629C0E1CF344E66D3A3E100B615BF762DFF0CEFC5E4CCE0DD908F46C94E7411A151E713FE0C18ED33C4C03E55E12C0AC366DA5C757C7090E0F94E2C34D93EA3B226ADB2979D23E071F18C2EFF33BCF41BAAF52F4B44E38675DDDEC89C7BFE858BFD1AE70D96D0487972D70F8D8681982656FF734BB6323AA91EA14C6330C71783D235D9F094CB111ABC4990319BBF163891535AA5F870164DA65FFF395DB68B390084D4F2448B98CD56103E49CAAEB6CD040C3ABA8290284E9B2BC423117F4104D89B1B1607C6D34AC30AA9E79D8753B97CAE90ECADA6CAFC6100D3D6D91E20393E0DC95B981FE0EDBCF88E046F74184A96705AC226FD26089468E432D525643293BDA781B64BACBDFD6C7301AC42AED7DBBCE7ABB9D67AF315BCC3509CF03523FC887E27EDCBD7C74DADFD0F126CDB49E28ECAD38080F18A775E6D824C18359935D921744EA72FE293F299B530D9DC9285EF174EE60E2DDFFCCFFE89960BABA90D955CD2C96672513C758142D29A1AD79CA9291BC6782B64717F11A71E6D65A1A71D +pk = B3B1D97469C08D9A6ABDB925B6E9B094892F36413591AAC27FE2E3EEE2B14A7CB3102D7A87D6238C09D7BA9EA3A4840FB34D3FBA90F9814D463D941439B2E8659CBD0DDFB3D2816EB97DF2C2E99B8C33CC2EBD23FC3BCD75767F13B7A51B482006 +sk = B3B1D97469C08D9A6ABDB925B6E9B094892F36413591AAC27FE2E3EEE2B14A7CB3102D7A87D6238C09D7BA9EA3A4840FB34D3FBA90F9814D463D941439B2E8659CBD0DDFB3D2816EB97DF2C2E99B8C33CC2EBD23FC3BCD75767F13B7A51B4820068B865F98FB3CC7B6427FDC802DBBA9FD961FDEB074ABE8377407000000000000000000000000000000000000000000005A68BB4265021BA4C55186E52F1DDF829C7A712F4CE93C01C2FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF671163F3D26AE8E29A44E0D0007E0DA6665367200ECF9277B1F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005115FC65DF553E4FADE3148EDEE6161B06BDFD5FC1C6D1AADF206443FDB4A9A720D0B959182AC02F1F5C7A89931055002746CC17C403760B009A7E15FB163A43CB6EF08982516239D70B0BEF298A26B2CBD8DE469096701424881EFF5EC3AC00618841F5DD8C2A24B59315C308FC2455DC7589DBBF5671BD21BAD1AC9305C8CB99CD4C74C9CBFED57CF26A3A618EF200CC4146DBDBC4A782DC7C57D9025F3CE133C722B0507D2E9F1E64ED41C2984EFFFD9B80F3B6C7BDD3AB7FC24C0E676F00 +smlen = 3194 +sm = E969BD29CF343118B041357BD519EF957221D880B174C7C56EF4C5A6936F248DB2E28ABFE2FDA4231CFACD633673353202FBC59B205C094F712A7766E9C292C515F7D35EDBD9FEE09EA77748F8972EC5DA414593D6D88B0FE63EE80AAE2D6C1F0101FDE49022FF672A102CDFD7A339C753BDFE53790721F41D6B0125F183F049FB2C03AACA322480A062AEC3F81CBB384F18CC00887EC367C408E68076D6E9CC78094DFBD91A7EAE6AE5B90901925A39A2033ED30968424A068CD18511069A96D1DBC3325A00A3DAB98870CBDC2F42593129D8DBDF881406084F56478B0006154D83349DD620DC2CC0E9ADA524B9BE9B195973A839A042F4342D69E6B38918507A9747FCDD8B751D7C75ABCE2B482B3313D4C74EA4E7A4A91F2E08A059536B651508307B7F4C3AFF5CF1579F90F32BA1E847778673E3956713C14661AFA2D11CCF61FD8F9BC914D4B6E6D09C52AFF7FEFAE325C180147153C9AE1924C9A2B8DE4900BFBBC6797558B000C5ADB9A8DC4CAFB458AD328F19A2C55D5434BBFA7BE5057E56511529709992BD6527E913B46ABE38DBFF90D4AB3C024A66FC0F8FB34AFB96E22535A0EA8F313A087AA65355D7D5989C486E103FD526A7A6D812C0E4D8C081BCCE4DCFBC64B68436739451BE0C4B67BFCA71BE955BA9F9A23C223C7D0FFB1B2196C9C9845B6AF341A363951E2008BDC4F3296DD0E1E3F480F2E4B0EC77A002ECCFDABCC58D24CB0BAA26EACE96DECAA0F6BF1CDE0175AFA65AD5C23C5E71B50DF778208EDBE426AA6E876C12440D7C4FCCB42D039A14509092784BAAD37D9B8EDF186CD4FCB3D9F8B0397E951777D602B8AF613060FDAB6B358302B3FD28437A06694F36CE12A035F09D677E48D077CEFD1676D8FE51541BC19E3A6D6A5D879C4F9EB4713B7C0F3A652F3A05D74DABFF79A302FDAF147531FDD57924F49E52B298219B03D6DF166B481F232FC85C7CF52838969CED2DCFC18DD8C95891C498FB49289D1A982922A0FC02C849AC3BB7FA92CF43A64464D5BD919F75ADA287FE657BF61DC07B3808C0FD0D71EA24DE5353268B2C17C989C29465BA49111CC479F51A8CC623CFB6FF68149E52C77A7D85B5ECCE66C05900AB9957BC7ED39E03649A103B5B6BFEEB168B7C1F30DCA84AEA509FEC2B215DD95558A2708839396552F517A8FDA28C3ED61F84E1B2E0DCDFA708DE50D44BFC65BD4E70260C437C8B5B7158EC7E2301D9C7AAA68E0ADEF89FDB601711AD2998379145B29CE3681B513DC3BA9B2EB668C1B53697833670466E21E767361C0A4362E5B8DDC38EE6A9C4DC5205EB808B93C72FFAFB635B4254E4F4496BACC753C8ED0BCAA88DB683CE77C8165E8DDDE665392CCCD57BC07573D83CB3AA10648281EFB08F92AACD8AB6F9B5D7FC66D29526BD57E421220FFE375B26C61A0DDBD9807022EB3B4B681A43E7719F5EC255C1E19AE6C542D6DEEF3B94B6960C18D0D7C8110B88F995826073B874042FAF97F1FF034B8257418CA269F5CA588223393B0179F9817E08E7212D0D410EA259EA66BC4A00E7FB1190A732BFDBF7ADEA0E4550BE90C3E37BF33BAF436955742A2632AEDE259235702EA2E079D99A22C9755ED34C1E3CCBE746E728A932B1852F692B103112B303033AD3CE1172AA066860DF570D21EBBA51FAB72D5AFC4AE8995F532AE384CCCC3C4A295AF76A803FE076CCC920A80D82A9B614760EC43208579EF5DEE164356D62EA33953E55195EEE9B2E2018E6FD9D19A9F49258702DBAF6EDBFD093919917B1B6734F012E2BEB4F758DD481FB8A8D7796E755C6647501E28862B9F5B16FFA1C5D80DCB07141806FC348881A5A8891BB632A4AE4292A102D71504D0FC12C79D15BCD0799D30C7B9E72625A7DF7DBC7ECF9EACC627CA9AE5D71E264F2F2A9D5DB8593F3A90F3915CE480ADF800C99FC2C8692F2B57B492BF9D84171F8C29AF8D5549F82D3730927096CA18FF0B0C0C0B8B800508C44D5749B92D7D48F7FBD5C86E408ECE0EAE639AF475073DF5CA2CD5083BC4FF8852DDF5C399946A6B21B0841D137F583E0DDA3A6046F082872B783ECA3E14B21A2AF61BB150847026F2371812B1A2BE72024226F4613DA860AC2FFC578DCB171DC27B896EEFE49F885F9BE4CC8766F37038E01CF20DBB661F507B2ECF2B023203A6259B0A018FC00B2CA9B3107B605F04388D5493AE7CC4BDD093CE761A92847C2A167739E0750B427B2ACEB3ABC5FF751A5F32D36B589787D4DA509C85EAD751353AB2C68A9C14B8B2C8166AEB6F27C7F101221C306AAC74AAB6B4E795525FE12038725D7AF3D2A6D60E1EA85F2B94EA24F1B72FED9DDAD4C8E5DA484E80A2150DE22E6ADEF41153D7B4331E8F011A3CD48DAB02876B067312D0DC736E465F99AC3C9C56321507E79ACCF652E3857C749AD92DAD15350A6B4B67229A3905DB18AB2053E2D4F92F156A1D76D0AA891364002C991E632B53FA217AAC1709F37F3402F43B0753361EB2F595F9FAE3D7D96FF050DCA0B9657F4C3AB49EBDBFE8816051C4E0AFF32C5137749D53B062CB61F7201171B5DD716E9CCB38D00E50955596845DFF602200B30D375A854CA4E9A7276CA1A1D9EE92A04BCD78854BE251F7080ABA6D8325D40B37054596AD80211A50AFCC1DBC177600A70E648D8BEB4FCB8919214894CDDAA6D63B6F6C445469A6866721D4BF1117F25DFF9D65FC8FBE5B0ACC8B9039C7F94B2A5CC6068A0489E2E13A731DBE1094FA8558A601ADDB9E4DAB04FA744CD5B95A9D57C52C8124AD950A5944DEE2C55E5C8540DBEE5823DAA624F57FD5BE994BAB3AD4E74EA9443F8B6024BD6B49ADF3972442D88E61E04FE8478FF28916584CCB65FB15686991D5781CB7EDA067745258EA671E0A2665F94FEA1B5490669D1EE8711518BB911094957586C8075E3BBEDC47BE059053A7658ADFA0ACEABDD46E0DD9647B34EBA32E56B6305653ED386C50E79E15084F00F003B1D12504FDD8E47D03D9F7572276047BD22B82B8E81F87C86E6F20D2A756B16F291179A97B010F993C0F839C9A1238CFC9BDE8074405CF1B35DF423C7566CE965681F21C969E4F3F8FDCA72A18D5DAA80287F53B5F8429FEA81612CF63CCF1B7A13512DB4D1DD2678FE1189398032EAEB4368332972C728AD726B7290302C3C5ACAB6E73432E825B9046F846ADCA9D93780A36095AA5C51E354CC6E9A910CABBE59130E98F4ACB3CB6D4EFDA9E2F78748ED58465937FC81C548AD038FDC32AEC46B078CC5A7207658A9706F1C9653359DE6C4457DBFA71D300F98F9BC5DAA14DBDD5EF20DCEDE7E9D3F7DA5C932AC3338BA40E46B17D89FE38F725129991983D4A81321B394F2D7B20D66E3DEAAEB6FEFC8CFF0B68A766E27CCFBA66DEDDB1F541DEB3C1892ED2AD5D073162F0DD06B82E8878477BC96E03101C9B5D9D0ADA10EC060B45E144B31E6B4DE283FD43538B47178398FDD15B01ED421EE2C65847F7A4E9AECE2F1D13971FFC0157040782AD4B591DEA0906370820DDE1000490AB1C27C03D02A0F4B4BFAB0E56D7257288441CEA63175CD6BD11382E6C873154332E627CE82E37C63889EFBD8537AC35C21AD7A09C986CFEBF13B19D5677C1104B373F3B55198D075AAC608145FF9D0C4C12C83BB41036AB32227629EEB4922F172281A66C23C35B8A3E92DE0A10D5E8C18B9A54D6C30230F3A8263986AC535B6BF63EDDAF6A02C9100B712EC4BD49851A22AF0E647F259C2E19B9ACAEB6147C476C90745A353F6252ADE8212A9F7C215C0B3053BF2B4E0AD225E8B344EC14C1B839877349C3743E8337D9C1EB128B06939C5A08F60A46FA700723EB6652FC26440D9BDA3C99C10AD0742C2F039BE6B66749B77E14F8223509365053E87ED870FE3906A16DA6C62945DD2112C96A23942B1E14431AECA7DFCE3FD4D6633E0B661FB34B0BF05C4D21E689CAC9B6ABD9F507F08E4AAB94BBEF1C629C0E1CF344E66D3A3E100B615BF762DFF0CEFC5E4CCE0DD908F46C94E7411A151E713FE0C18ED33C4C03E55E12C0AC366DA5C757C7090E0F94E2C34D93EA3B226ADB2979D23E071F18C2EFF33BCF41BAAF52F4B44E38675DDDEC89C7BFE858BFD1AE70D96D0487972D70F8D8681982656FF734BB6323AA91EA14C6330C71783D235D9F094CB111ABC4990319BBF163891535AA5F870164DA65FFF395DB68B390084D4F2448B98CD56103E49CAAEB6CD040C3ABA8290284E9B2BC423117F4104D89B1B1607C6D34AC30AA9E79D8753B97CAE90ECADA6CAFC6100D3D6D91E20393E0DC95B981FE0EDBCF88E046F74184A96705AC226FD26089468E432D525643293BDA781B64BACBDFD6C7301AC42AED7DBBCE7ABB9D67AF315BCC3509CF03523FC887E27EDCBD7C74DADFD0F126CDB49E28ECAD38080F18A775E6D824C18359935D921744EA72FE293F299B530D9DC9285EF174EE60E2DDFFCCFFE89960BABA90D955CD2C96672513C758142D29A1AD79CA9291BC6782B64717F11A71E6D65A1A71D + +count = 90 +seed = 0CAF47BD9AABD7D09FFAD404449BBAB2E1D48E80AC78550831A365BED8765420DBBE9A566EFDF20D4E5233D7848582E4 +mlen = 3003 +msg = E0F434DFA04EC225FF6B6DB802A047E221BC064E5BE89A5FC13937AE9D3F22B4439BB1C1BBA01547A64AB3E810BBB09706D01959E2E906A69FFDDF0C56726BDB58FB039D66AC5D77C7F0E9A8617B0C69176770DA328D38171F39B5220279186250139922C0DD0F7C3F96D48615FC66DB7568810931D257B230258FFE9CB35F87859E08139EBF7432E948EE3F962BB9015CACB8499BC69597ABAE4B841B606657E2E3C51FF5A8961AD42177A9E73950E3FA150439E2063B6555624A6D8E3AF4FD5710FBE722B8C6267BA5DF56846A085C56444573D692D5412CB70E443761751E58C41953BB9FAA3CE1F4564C825A02F0E1339CD659AB1480804DD2E90E3086AAA292DB39C6E2AAF1B001B47A21CC721C0C502C46EF0479BB7D8CBDF8E9C136397FEBC2D83C0FDBB3ED4FA6868068477206A26D2B7E0D20507AECB2756B888FCF5B446217DE14EE6A20CF7E7B732FAB22CA3ABBE81B2BE18463ACAA3132773ACD7476460536111CDCAC98B1CC9B2C36AEB3FB318340F7397B4B4AD6AA87EAC94AB7D98CC12EA5606162877465FA2CAD276CBB5D36C40A0B014C53D2D3A96825E237342DFEFAA6B9456B5FF1DCA859C5976F77C3D3CBC9DF355237EE9B4B4C90A9DD941294431DB76DBB539DC48669E7AAD21808332C8A4FE98B8F043FB756B526890452FA3C3527FCD584CD33E38FF9FF783538D39A184B7B3EB649E1C04C289FB65998F6CF5D5BBB0609FC3403D85C6DF269017032CD24AC540E1B294BDD3C3A0C7117CAB02B1A0063A174FF26FCDA687433A667322320C0DEC1EA3963F3B14375882B3478AED43C2C74DEBFE3A734F8B1A5CF92007F8FB627CC3AAD5C6AE4C31846B72E7573041270FF40E762C0F8DBCEB7512D44DC260A97D5CA7D60699981ED8476D8651C35C8ED498FC2961D1E38AF46F3653630773209A63838A9222B813C23DB0CF4196D6654126BA2B1840A7180E653B3D6E10C4C7AC3CEE93B0399D918A52E59F0215B09A119E634E6E8A9886C877F157BF7B7DD827ADEDBAF03C718AE037C0B262588171839E952721DE72180F8EED00B01F53E098B82165199C53129576036FC753A3D33AEC92060DD19AA078A496A2B214B1BFBB747A1EC64071B0A078D74D0212E6203C9698C7449326A42BCBBE8D9501DB916C64307D5F1083BCC36C0FFA18C0E4410B0B17D443481C3673D17BBD7A366A5FD1C3C5B3391A02EDA7596B4F869A91A32B5A02A05611371231BE035EDC716F534724B5225E1A72A2B2CD357F4C326F1DEE963FAB680721D40DD70B750A019E70885515F43946A0DD3DD042969139F61ECA0E9EE3107D3D28AC606AD53F236303E1FE986C38825318B7C4597B14E1A83B81295FEF49FD0F2C1E14A0B146540D853DB9706CD224B376343317BF7330B0C2721A409B856304FFFE60C24C441D5E2797D4696C0FE046D305AEE93CC6A2D89A81EB19643636A8B424B310034612105DF16516CE9607CC0A2BAC5835642C6FF9572191BC45E44D9B40DA36B607F570AE8C39D490342786F31CE6764F3F7A764665B6CB93E54922C6D89DB566F494E0EE069811AC82E8132F2F388D68490CB1C2172D2979FCE3659D7076B4F457232EB839172963F8C342E2CD18969F086F451D33BB774F3D00E6FA2BE02292F2E5CAD3ADF5DEC28932BD784801E69364962BF39E25455303E1F289052D2F0CD4964E0FFCDE29E7C074E5D57E43739DFA42AAD636C352D363E3A23BDD134BAABC7CD1621CA638DED7DB7051F0456641CA872ECDB4D3C2603DDBBCE16637010E782C4BD5230992E2EE7DD904F8A83EBAA7B4C3CEE15B10794ACE894118304BCDA9E9B1376331D2248B802557AABCF913E95F783715BB5E90A4436E4BDE7D651397A70A24257C39E0516BB1F548DA36C1F1F92A416DC1114107CD863F3BFCB360286E774B21296259756EA6040CB61738EEFE29A67895AC69797C640E03F0E9E731647C2DA93373920341FDFBD50EB6B737BB0D9FDA8EC8784920407D4F41486D8FC616430768D6431CCD789DEFF332B239FFD1900800CEDD9661A55D6D96089007E9089A117F03D7858EB4C3FE2D07E91D8CAB88D2BA5421846069FA6D4E5C9161A140CC3A288100BFBE61C3B0F0E820AB12D8FC54B054A0F4C777052495B45A7D1A883E67663DCF50C2230CA5319AB31CD76435DAE41CE1EE25ECD3FA0C7E83B0168852B2CAB674127CD7BC9DDF9DD4B57EB40128988C7C8994DC6A5FC939FF957F06C70A4056E63331F9AAD254EBF2B8FCCD580285BEA486D91A0C2DBD5823AC8F6846DDABCDE25A2252F8DA1AEB32E6969276BD2A7F94CD7DD3143F3181489272B1589FD385BA844F90E35982B53141DAEAED413054CDB935F3412E31D99C1147079CB487FEEE85E3906DAED18106B8C407BBCB7716EF9D4D34E2FF04709C7457997AD6FADC55A8FA70BC907815805578A11A012C521A1325754CAE2E3F7C9E1FFFDBD4BE31DC534961C318D1A894838E0C33806735DD11E408E500995B86B6ECD20D325347F792A3381D2A45587D9B6AE0AA27533732A6C421CA621AAC42335848D9C0DD89F14EADF2F92EC532756CD5697AD752B6260C598EC9F0E9976A950B22DAEA8B74FCC87F28B5E9ED83C0339E566259ECF06E5CE209065DE87FEEE5D1E9C466004B34583D6AE89B590EAD6A96CD2951705AC764F329E28C996AD6DB05F6C69AD2A39D3EE230F6501F1760AA41FFD936C9DBF20DE3996917322D32B946062A3C27D8BF35ECDA22403AB684CDC680DD166562D018D943369CAEFB9133A4BC4515CD5F9C08E7C22D153F0A7733EB4EB2CD8A74A4C85E40DADEF6858C5927B6EEB2B01E9B7AB02F7048C8869991068B00FC19B9545AB42181DD5CB5488222A402E827F60A8D87B09ECC88350032F998E3C10A88D4733227334812EC97C5E5FA85FAEE1A1E28A58641531B139AA58BEF49780DCEAA408986CF3C40E226C60531945A20F91E5DC31EC86C9F9A0545E5FCB79A13B9AFE9B133867BA7A38152ABC6D9F8EE10090BB71E6ADC6A6C2513B066F2565138BADA60B0BD339F9BE1AADDFC90DD272B4146D0F5830C6A53E295C849C15D001176E7774FCD7619D6EF1A30BA93CFE278AB4806BBF25CE4A4E94163F614E81DFF7EFCB015997F5138E22B80B2B00AD7579CD84DB5D1C7FB16E9E8C5D9A5BA0AD0E0A7DE79C18839D673632F3D2C7DA2062EAE844FACCAF23590B2FBF1861405AC347EB9D723ECBDE54CC96BC4D8EE2178F353310E5D69230C5DB2841D2A06A3A4E03E054D99DEFC6004A6E405FA89B198A901EA1AE9F3112A29F3AEC5698A42794E04D74D761E4AA5AD23DE271969BAF124450F4796DA1EB1C01480436AB0F5D0B1B2E6717DD87EEBF137420961F978896077E40B2D2EBB5664FD8AD89BB9333FDF46C33EF3BED21BCB5B4697451BDACF364F85462F5CB9F546657B4744EDF757DAAA4D3A9A2A6F281184C3576B1DB0B540F3B36310020BC6AC0C6454A7CC8EC1182422B17BDA202729C270194CD6044210D2B98731565812339EDFE5A0DAD79BA826D8C566C7D25DEA9BFF0BADF1E4E5DA2B884966E03FADC51C6D9BCFE877511157201DAB48AED1AB038999E5CC3FE58CCD37D40050DEE92E0BD5332413A7F0118724084EE5545FB51942DF1EF399F734FB9592555B5F32290C53D7E5017EFA2B61E29FDCE90CC3E7C1B0E545425B1D3E1ACB9089DAA786CB0122DB3FF27EA0367751A5462230F0F248147EBCCBA2E16D214E9A0BAEBE989BBA020F95B623CB14ACAF2BE6F157DFDB1E32627133F0D26C7B65A189F39955EE31D9B507B43126B06B9E4524732C8621D2274438DB7ECAF736AB7257CED950EB68BB868581649232793EC83379A16F40781E76F5CC57C48C3F5C2989BEA803E1B63768436D39AD19BB77DB46AAE6E8473ED5DFEC983F49E4B8E7CA6BF476AB2F0272C0C2DBEF1BCB064D7400BFE1B9ECCE13578A20B1D5B48133A74C5C59CAE0115BC3B50574580BFA99D58BCAD336EE2CCA5B7994C784BB90CC8F1B9A0E21B39D5EBA464DE34D46AC0BBE436C2F419D60D8AB13786F9A841B52710D1B49BEC290DE317B66B6855ABE156C07619A4B998CC582E3F54A7F457F1D2839BC3EBAC937AD3EBC6A9E6E845379CF1D66D7C59000E3F6CF6823B005728A95BFB0ACD044EB35D5ADBE8933A3637887CF91EE74BB910FDCBE797B0C6B1B056500542BD39781BDF13EBFBFE949D7BA0B7F31102E63BFC6E22693F97 +pk = 53DB7306DDDFA971875F5293B2EDD587DDA2DCC34A7AD6005407785C5E3E9E199D98F7CD8B782A9867E91FF23EA37522BCC5C431F30FF0A5A230BCDD748227AB9F31349DD10789C9ED9B27290A7A76600D524E4B018E24A700525D3E8B3BEF3319 +sk = 53DB7306DDDFA971875F5293B2EDD587DDA2DCC34A7AD6005407785C5E3E9E199D98F7CD8B782A9867E91FF23EA37522BCC5C431F30FF0A5A230BCDD748227AB9F31349DD10789C9ED9B27290A7A76600D524E4B018E24A700525D3E8B3BEF33193736166F7E45606EBF2F8A0A5944AD30E0FDAD86E97628F9C10400000000000000000000000000000000000000000000225EA7F086499886CEF6750653233C4CF607F6EE501DD23189FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4748C65BE4E2193AB865E3D735E0E48BA5762F28445AFBABE4FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007253DD4E76EBE67050B63CE8CEFFF72677E9F0DF78BA881A1A0DF3D1CF58C6A38CB570EEDC6968DD4669B7343E540A00570F883084F4F68425CFB4FD7D8BA540DED615984C9659066F3322F835DEA6EB08CF0B2D324AB3B742789431411EB600BB75568EBF7C66F0E9E5CFCC39B389261F3EE7CD9FE0C4ED79A95B240A732D4B19914703A15412C45CDA64992975610015DA6DE550120CDB24B20E23003115CB8660D1096690F936E74409D5C5E0837895DAD728B079DEBFC75E7FDF6FD59200 +smlen = 3227 +sm = 50F14EE762AD36C0F46B1B525E9E47230A9BD8299C34C954B0EBFD520B23BFCF7C1F730C309A3EF34AA15874FDDE792BC807B3063D2395E192B1973D2A3DF932B9A9E6D6AA36F115D408DD534A1D7551B49FB2B56356E3278C0BCFB398E66C0C000136074680CB74C268136487B4A7491BB47D3DEDBB2CA662470331FA852F957BAC28B9C38913511D0A14BC2D6FF39FE6D823017067D444829D01C2D64A7115B32E52A965014CCFC196DC30009DFB4C47C626197DBF78558E8BEEDDA3897318EA73163E4401A4E9D35037BE7A99879FD38AD5E4F1079531D569E7D631000402E0F434DFA04EC225FF6B6DB802A047E221BC064E5BE89A5FC13937AE9D3F22B4439BB1C1BBA01547A64AB3E810BBB09706D01959E2E906A69FFDDF0C56726BDB58FB039D66AC5D77C7F0E9A8617B0C69176770DA328D38171F39B5220279186250139922C0DD0F7C3F96D48615FC66DB7568810931D257B230258FFE9CB35F87859E08139EBF7432E948EE3F962BB9015CACB8499BC69597ABAE4B841B606657E2E3C51FF5A8961AD42177A9E73950E3FA150439E2063B6555624A6D8E3AF4FD5710FBE722B8C6267BA5DF56846A085C56444573D692D5412CB70E443761751E58C41953BB9FAA3CE1F4564C825A02F0E1339CD659AB1480804DD2E90E3086AAA292DB39C6E2AAF1B001B47A21CC721C0C502C46EF0479BB7D8CBDF8E9C136397FEBC2D83C0FDBB3ED4FA6868068477206A26D2B7E0D20507AECB2756B888FCF5B446217DE14EE6A20CF7E7B732FAB22CA3ABBE81B2BE18463ACAA3132773ACD7476460536111CDCAC98B1CC9B2C36AEB3FB318340F7397B4B4AD6AA87EAC94AB7D98CC12EA5606162877465FA2CAD276CBB5D36C40A0B014C53D2D3A96825E237342DFEFAA6B9456B5FF1DCA859C5976F77C3D3CBC9DF355237EE9B4B4C90A9DD941294431DB76DBB539DC48669E7AAD21808332C8A4FE98B8F043FB756B526890452FA3C3527FCD584CD33E38FF9FF783538D39A184B7B3EB649E1C04C289FB65998F6CF5D5BBB0609FC3403D85C6DF269017032CD24AC540E1B294BDD3C3A0C7117CAB02B1A0063A174FF26FCDA687433A667322320C0DEC1EA3963F3B14375882B3478AED43C2C74DEBFE3A734F8B1A5CF92007F8FB627CC3AAD5C6AE4C31846B72E7573041270FF40E762C0F8DBCEB7512D44DC260A97D5CA7D60699981ED8476D8651C35C8ED498FC2961D1E38AF46F3653630773209A63838A9222B813C23DB0CF4196D6654126BA2B1840A7180E653B3D6E10C4C7AC3CEE93B0399D918A52E59F0215B09A119E634E6E8A9886C877F157BF7B7DD827ADEDBAF03C718AE037C0B262588171839E952721DE72180F8EED00B01F53E098B82165199C53129576036FC753A3D33AEC92060DD19AA078A496A2B214B1BFBB747A1EC64071B0A078D74D0212E6203C9698C7449326A42BCBBE8D9501DB916C64307D5F1083BCC36C0FFA18C0E4410B0B17D443481C3673D17BBD7A366A5FD1C3C5B3391A02EDA7596B4F869A91A32B5A02A05611371231BE035EDC716F534724B5225E1A72A2B2CD357F4C326F1DEE963FAB680721D40DD70B750A019E70885515F43946A0DD3DD042969139F61ECA0E9EE3107D3D28AC606AD53F236303E1FE986C38825318B7C4597B14E1A83B81295FEF49FD0F2C1E14A0B146540D853DB9706CD224B376343317BF7330B0C2721A409B856304FFFE60C24C441D5E2797D4696C0FE046D305AEE93CC6A2D89A81EB19643636A8B424B310034612105DF16516CE9607CC0A2BAC5835642C6FF9572191BC45E44D9B40DA36B607F570AE8C39D490342786F31CE6764F3F7A764665B6CB93E54922C6D89DB566F494E0EE069811AC82E8132F2F388D68490CB1C2172D2979FCE3659D7076B4F457232EB839172963F8C342E2CD18969F086F451D33BB774F3D00E6FA2BE02292F2E5CAD3ADF5DEC28932BD784801E69364962BF39E25455303E1F289052D2F0CD4964E0FFCDE29E7C074E5D57E43739DFA42AAD636C352D363E3A23BDD134BAABC7CD1621CA638DED7DB7051F0456641CA872ECDB4D3C2603DDBBCE16637010E782C4BD5230992E2EE7DD904F8A83EBAA7B4C3CEE15B10794ACE894118304BCDA9E9B1376331D2248B802557AABCF913E95F783715BB5E90A4436E4BDE7D651397A70A24257C39E0516BB1F548DA36C1F1F92A416DC1114107CD863F3BFCB360286E774B21296259756EA6040CB61738EEFE29A67895AC69797C640E03F0E9E731647C2DA93373920341FDFBD50EB6B737BB0D9FDA8EC8784920407D4F41486D8FC616430768D6431CCD789DEFF332B239FFD1900800CEDD9661A55D6D96089007E9089A117F03D7858EB4C3FE2D07E91D8CAB88D2BA5421846069FA6D4E5C9161A140CC3A288100BFBE61C3B0F0E820AB12D8FC54B054A0F4C777052495B45A7D1A883E67663DCF50C2230CA5319AB31CD76435DAE41CE1EE25ECD3FA0C7E83B0168852B2CAB674127CD7BC9DDF9DD4B57EB40128988C7C8994DC6A5FC939FF957F06C70A4056E63331F9AAD254EBF2B8FCCD580285BEA486D91A0C2DBD5823AC8F6846DDABCDE25A2252F8DA1AEB32E6969276BD2A7F94CD7DD3143F3181489272B1589FD385BA844F90E35982B53141DAEAED413054CDB935F3412E31D99C1147079CB487FEEE85E3906DAED18106B8C407BBCB7716EF9D4D34E2FF04709C7457997AD6FADC55A8FA70BC907815805578A11A012C521A1325754CAE2E3F7C9E1FFFDBD4BE31DC534961C318D1A894838E0C33806735DD11E408E500995B86B6ECD20D325347F792A3381D2A45587D9B6AE0AA27533732A6C421CA621AAC42335848D9C0DD89F14EADF2F92EC532756CD5697AD752B6260C598EC9F0E9976A950B22DAEA8B74FCC87F28B5E9ED83C0339E566259ECF06E5CE209065DE87FEEE5D1E9C466004B34583D6AE89B590EAD6A96CD2951705AC764F329E28C996AD6DB05F6C69AD2A39D3EE230F6501F1760AA41FFD936C9DBF20DE3996917322D32B946062A3C27D8BF35ECDA22403AB684CDC680DD166562D018D943369CAEFB9133A4BC4515CD5F9C08E7C22D153F0A7733EB4EB2CD8A74A4C85E40DADEF6858C5927B6EEB2B01E9B7AB02F7048C8869991068B00FC19B9545AB42181DD5CB5488222A402E827F60A8D87B09ECC88350032F998E3C10A88D4733227334812EC97C5E5FA85FAEE1A1E28A58641531B139AA58BEF49780DCEAA408986CF3C40E226C60531945A20F91E5DC31EC86C9F9A0545E5FCB79A13B9AFE9B133867BA7A38152ABC6D9F8EE10090BB71E6ADC6A6C2513B066F2565138BADA60B0BD339F9BE1AADDFC90DD272B4146D0F5830C6A53E295C849C15D001176E7774FCD7619D6EF1A30BA93CFE278AB4806BBF25CE4A4E94163F614E81DFF7EFCB015997F5138E22B80B2B00AD7579CD84DB5D1C7FB16E9E8C5D9A5BA0AD0E0A7DE79C18839D673632F3D2C7DA2062EAE844FACCAF23590B2FBF1861405AC347EB9D723ECBDE54CC96BC4D8EE2178F353310E5D69230C5DB2841D2A06A3A4E03E054D99DEFC6004A6E405FA89B198A901EA1AE9F3112A29F3AEC5698A42794E04D74D761E4AA5AD23DE271969BAF124450F4796DA1EB1C01480436AB0F5D0B1B2E6717DD87EEBF137420961F978896077E40B2D2EBB5664FD8AD89BB9333FDF46C33EF3BED21BCB5B4697451BDACF364F85462F5CB9F546657B4744EDF757DAAA4D3A9A2A6F281184C3576B1DB0B540F3B36310020BC6AC0C6454A7CC8EC1182422B17BDA202729C270194CD6044210D2B98731565812339EDFE5A0DAD79BA826D8C566C7D25DEA9BFF0BADF1E4E5DA2B884966E03FADC51C6D9BCFE877511157201DAB48AED1AB038999E5CC3FE58CCD37D40050DEE92E0BD5332413A7F0118724084EE5545FB51942DF1EF399F734FB9592555B5F32290C53D7E5017EFA2B61E29FDCE90CC3E7C1B0E545425B1D3E1ACB9089DAA786CB0122DB3FF27EA0367751A5462230F0F248147EBCCBA2E16D214E9A0BAEBE989BBA020F95B623CB14ACAF2BE6F157DFDB1E32627133F0D26C7B65A189F39955EE31D9B507B43126B06B9E4524732C8621D2274438DB7ECAF736AB7257CED950EB68BB868581649232793EC83379A16F40781E76F5CC57C48C3F5C2989BEA803E1B63768436D39AD19BB77DB46AAE6E8473ED5DFEC983F49E4B8E7CA6BF476AB2F0272C0C2DBEF1BCB064D7400BFE1B9ECCE13578A20B1D5B48133A74C5C59CAE0115BC3B50574580BFA99D58BCAD336EE2CCA5B7994C784BB90CC8F1B9A0E21B39D5EBA464DE34D46AC0BBE436C2F419D60D8AB13786F9A841B52710D1B49BEC290DE317B66B6855ABE156C07619A4B998CC582E3F54A7F457F1D2839BC3EBAC937AD3EBC6A9E6E845379CF1D66D7C59000E3F6CF6823B005728A95BFB0ACD044EB35D5ADBE8933A3637887CF91EE74BB910FDCBE797B0C6B1B056500542BD39781BDF13EBFBFE949D7BA0B7F31102E63BFC6E22693F97 + +count = 91 +seed = 9564E88F336C091EAD50C893F3EAA8351FA388682F433F7A72A34731020B9C96DFCF75EF5EAE47E12684AFA51EFB49B7 +mlen = 3036 +msg = 2601A39B6D7D91DE539EF11C3B67AE3EB1607716F587BAD5F60D311A9F4FE7F04350CA085EDA6D41C4BB6C6E13E376BF8A314DDF791AE18BE2EC0544AFD3CC27BDF270C4550E9E78D497B92349AC07755BF9167B2958BDE919123439D6F49C3408E8D88021E668A0A5FB6799330188E35EC5939B77097E3737C4F664D01D85FAAD0F583B3E95EDE125587E2A79991750D5CF804325C72DC8DDF3471EE8FDE02519D2D0CA7EDD651EEE30B3BE335CCF7FB02059BC3A47EE3C056D4929EAD4FCD82C8CF49625D5DA460DAA299718556BF0F77CC5CBADB99B64C8EAD4474601FD5C79309D4E63AAC392853072619EFD7B958F0EBDE5CBD40ACD57DF269A8810776D6DFF2E637EA57ADBFAA08DF8D2581C38CB262DBB4D1F3C65A4FA068539D2056E08DCF03BAFF006EDC688023A20728B227A99FED3B8F2BCBED2E3E6ECD8B8665A2E4D233B78D7C33F6E3BD9D0A24D13C8EACCCB53A21DDA9E7A34F9A0F031091E65F749C9EBCCF3DDC4097A121D8C68EB7883405EE34F6A8B0208EA8D5A3FAB53FE2CAD1110BFA6E094F78D5314880BB67BFDFBC2DF8AA250F1D7200FF9A3247C4976DBD1BBE99DF02A3F246E5D466F85ED2F68E0B2DE06B0F2448A7B98FBCBF5872BCAE71BF0DB4E70105B020FF130141E8DE86DBE05B7D2A234CE2EA83A38E23A262E46FFBC837E8A71F657E443052E9A49DEA4E344D497DD2DE2AFB4009D681F232BFF4FEEB173546CBCC4C80C9F85B1CE125BE678E5EC62EF04433D55D4B8829B01AC165A440FCD6594F2C0CB456C8A47444AB05A0F0717B8185930D9738E885D24DAB98E11ECFF7D7A48A4527F94FC4C9D1B9D71F5E6BB39CF92B1A6D0509FFFD42E77AC9AD6F50F8FC649B96B8AC08673F78AE8D0BA2B7243452B33AAC44B06A2B9BE1AD6A12583D3590A3F9AF0E0DC35DA88A257170D315F32F3A889601D6729433B7ADE0F719386723EB2A008634749F5253CB7D9B2FC99A1AE1BBBE7F00A536CD38F8A7237D3992C3897DF412F5B1D45E1EF5B5DC974D49CF8DBF785160BC527543458FD9378B3D4D3124214AE5676185794209AD0EE73B063CBD5B7830D00F817CA0D5CBB597C44D28E4885D935B7BF426C1339C500DAF4F2033FA6A27A4196F233256650472F205D2C5E00E7087FB73027B0C6C9AC5C1D928CCD190B8A6BB33F512CA8E2369DAE6111156DE47A24469683F4721A25652FF87474DFD92A028B3EC5BCFC244CE442752A7DA1DA6C33FC22573BF0B13E371CA9FCC86C76FCF7A1654EEF4442E47399835A06336E62952770C6E61C573CFD07B3AB631B8831FE3F5DD2C6DF68EBF2F8E02EC9F6B90A371ED5E62C8463780AC453AB6F72D38C8F5212C8B650F63B98E3C0886B6A85AE8E7256C1EFB30969532CDBF72184AECBDE2A17B9811DD4222D080049C5D36C532CC0E910779D64AF93D750EE96BDA87562EBD3830FEAD07A3960CD6DE7146603199563693392D3CCE1332DF35C2C8A2C251911D38E95815CE5A4CE5596E2D77711D87CDD54D22E8F0AB431BF8B24CE9C7BD6D077E436543C70B02F338841AF0FB86B5EA4B6A47E27C1D83E1AB06801044F546ADADA437F3CE7D788A1C92A74BA540664658E70D4F2711979153FF1589792859C3BF122628479C7C35EEE951DAB8CDB0D4D150C2DA338346988D34F8C5E589B231B5E00849611BA09711BD3A0516FD515E6C4AE1E8A3657C282C8120C97AA7A2E3BAA22B6EABB8D8212A9A48E7759A9DAAA51B538F662A05FB897067B7CF9D2CEB47A1897214CCFC225CE47CD60E86F7DEA49E220F7DDD6894B30B66460DECBBCB2E42B31F4ADF0AACDDE544B9124EA5ECB04B03C448B17E8094D489F516D23164D2317D3A1332E0500F1423136C8535D69065E880AF34CF7E36DB5FF2C18122E41880585B4D188411E86B370A024BD6E28143EA2EAE52EB46BE334A21A02E21C6755C0182B9A055A7D4C7B056E4930CE63EDC79C9FB4E2FBFFC58F776086F3487F02F8D1E7C8519C7F452E75CE5686A037B3642B95D7526ACD4A81A47112CF96A8DA7548016A22E9359198E871DBCC5852FBE14EECF3CCC5EB2FB5EC31D10474DF7D63482A03E11F4AAA2EAEDB714786E21D03AF1CD644D06BB05FF7B3959601580BF50E5F7F82FF42E9CF2FFCA0C67FFC52CEDC53C7A5C9EFB6C21092DDA374D1CCCBC78BBD9F5EE0FDF6DA6AC60C95F7C2E96F17E3C379A52D5DBD1A92DD76D1F5DFA19EA0408E0E7F7867445445CFA60BCEFC016E68872FBAC9098FD6A8E84731C285570B1BEACCA6F4728958E7924F7A7B7730B9BDC9AAEBD9E045F464071843C650D06C96D487CF8397286F81D93D0CC2008A62EE32421E5231998140909474F6D98541D899EA53714AEFE652A3D792E4C72533332C3133707A49293E3B2E06AE18F2F81D601AADDAF2FD09EC59350E0979A5AE2B721771682A1BFB5748D000F9736031CA971288F34993DF10FC06A16A6DBEED8CDAAA8127F3B71432E723558F0281459820A0F4A75A3B2716F976BDEB88BE9C73F31623050D7C1A96C84988B01D847309E1B6D7B815883F83C9BDB7FCDAEFA8BA69E25B824812B7D54530A3ECC96611897661158DAE1B4AAC112E9AC13D07FDC03DC7D5AF23C08C5E4BBFF737238FD3F1C06F94215BF2351DCE9CAE14B4DD4745AC0CD626054469C6A5286FF821BA192706D47CCEBC443DD67FDDB76797A8B78DD0DAF850CB5D181C82298616E1D3A92F7FC82FD256857915773C7AD97CBB9710373299AE8516B8A1D647A13C7BE848E0269ED6C8A91DC50D0CAD21430A3BC9E718A13D1966A0182D9A24FFF7ECBC7876C868AF2BAF2D8B782172C6719CF140E8CB877FE6D78779E1BB31C70C6C9A6A77529C51CF78A5E4FBD7FF6153B5195817F80603E5C5810C38CF43CA812ECA52F73F045E33DF4E3D04EC8C5F8B4A7399F6CBBF0D39DC951C476B9BCC002720CE89F09C3885673BBA9C90D20DCCCA4A82CE5BEB38BCD60AFE2BA65FCFB01C8793B7ECC0F0B17A9DA74F2E0FEF4C90B5132FD6BAF8C010FCB5E8E7FAEAD7F2E0DB29BFDD1811072623CEE274EF2EFB0F7D4191F332AAF20CF36FF89A2EDF15F7B284CABBBEF46901271D8C1B180F736125C8A44FE164AC7E687E9A58C3B1775238BF1A11F99BCB583D0E3C44BF4F76DCF9496A06F80CA52E24D55B54AB849D3040B4798BF5292B0574672E9F844016A52A4D4E4DAD2053207BC97215BCC1BB93271C03C9AD2DFC7485EE2ED399236AA06CF9A12972E21AFDC587A6334CD1D71A7539362D714BA26214664E3B4BC39CDB1DB847583DB8E002A2AAB451B4E5BD6FE200730BFB2745D03C82B640F4CCF58701708F724EFFDF98CB04C78DF36B7A866CFD596BF5EA18445EEA0E34ED514D0DC2625039049A0CC82711DBBEDCE339C77F9FA1DC60EDDD8D58C8F144B0F3D00227AFD8710BDC66D29809728D7FBE85F08AA38AEBE5605DA29A09CC0526FEE84691EAA54DC3744BF5A95275037FA2F600B1F91E502D5D81AF48F8EC4C1834FE625FCDF2364067048727559047E07062B4D8A7D3851853BF28BE9D2C511451E5FDD9459270328A2612DBFF42E1DD34005A3DA1226A023162F454923C0337E6C74B44BB27A3B1AC82DFD68B0A6DAF93473D97A9E4591EC01A51CB6B47E2C7A85C1FFA73C35E5CE3003BC4534A2D9B16EBF9FED6464CB1E0CC665A451616A62B6A8481E4506A73883198C144A06331224D358196C815C811B103959EDCA35B26BCF86F41D9C7638547496787885EE62B14AF431CAB2AD4E0224D33476C58B8B0833BF13B50BE2B1D682CA7DD194B793AD2C6E4EE25AAF95459302F0B4DAED907A317BCC6A5F8D76CA9AA0D799F8EA39F330D6244BFB9F35E6223A0F665A65F55EAB9BCBAB446D7FCD424DCE87F234864D2C27EE84600ED9193AFEFB6E7681BC94F514FE0748EB32D32262CAB880D79CD4FE5CC963A4F688D448F2DB2DCC5B0CA87AC26DD8506512C100273B8D4D902FC054D48D8BF9EE818AD9619F68A8904B613256DB78C881CEA3373F0CBBAC336A78CD91AD9D60126E05CB8C16E9AA8482CF1B806B2F9C57BC8D63BF008AB2E49EDE8E788BF96B9F1DB2918DC5063F3F1D5B9B1C0327141ACC0B4B248FFDCB8BCC127050D27C805E154A4825DEE6BE9C8D4E42B1F5EFC1EECC6A45DBC119AFB15CCAD19789EAAFA8B1715111AE32E2ACED2278803B60E2FD63A43317498244A7CF7342342B60462510E19D83240DFF5D58E762C093DF326EA503FD347D2A92A5A4680D5E13B305671C729179FA21BE83B0D83144E63 +pk = FD07C9E3ACB3F384289405FAE39C7A203EA31F327A64D34A92B74837A73BA9FB573B0AA997ABEA0BA5B5FDBCC8D4B607BFBF1D2CCCB58DA00C581E83853190E3B6FCD08FCC9C4AF3DFDBAA29BFDD2C61AE3DAFF0C01E1E25FC27788D678FFC1002 +sk = FD07C9E3ACB3F384289405FAE39C7A203EA31F327A64D34A92B74837A73BA9FB573B0AA997ABEA0BA5B5FDBCC8D4B607BFBF1D2CCCB58DA00C581E83853190E3B6FCD08FCC9C4AF3DFDBAA29BFDD2C61AE3DAFF0C01E1E25FC27788D678FFC10020FF4889325B3F0AA275ED855F930CAC1BF097C1AD2DB2DC9730300000000000000000000000000000000000000000000501531C0413D8387753EFC0E859A397114F62E598D22EA7A73FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF996D63F9F4350B0BD8978F3E521AB5B937EB76EEB41C566CB8FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005D3C97893D019A626CCE36BBCB72454E1A8C0C0FE6849831D3E954021B2E7362D5B253F8C08BCB1563A200F6B3E94600E00AEF4F866284761E59BE410FC3235718DD8D98326DF05C5E3ED5868D0D7B55F58410DA531DEF6BB9714712AE737C00BEF4C09FD6E070EEA3855D1DD31AC883EB8EF16801091AAA474740ED6DED83330FB509C2FDE8AA96F999849935165C00C52D81AAD487239BFCD75D7B6F333407A562A8AA77D49ADCA34F2A0B642E4DACC0EA70773679239AA8A9A33A150FF300 +smlen = 3260 +sm = EE8E95A768E9648373C2898B1D5A35F1D044382C54A0BD06E744C542D75C4172E40CE3E7B8806F6CD141EEECA7F02330A749034BACAA2EC61671C568AC0CD769B5E9F99D5201B1FF89C62CECBF0698D47F00CBD077EA46621169F5E5FACA96300101FB0055D0FD8F91724B2409183F88C004FADF269A2A6E47970033F8AD2C04CEE68417CF800197B6FFF6D752DB9632B8ADB7012872C5CB23AE0BCA672E918143EAD9BB25E9DB1521DD7848002A0D3D5CDD9AEDECF0D7F7F3897123769C97A6078014DDA1010668B48D05CE5DE3FF817E4DBAB7FE4F2ED7B356E248BB0004042601A39B6D7D91DE539EF11C3B67AE3EB1607716F587BAD5F60D311A9F4FE7F04350CA085EDA6D41C4BB6C6E13E376BF8A314DDF791AE18BE2EC0544AFD3CC27BDF270C4550E9E78D497B92349AC07755BF9167B2958BDE919123439D6F49C3408E8D88021E668A0A5FB6799330188E35EC5939B77097E3737C4F664D01D85FAAD0F583B3E95EDE125587E2A79991750D5CF804325C72DC8DDF3471EE8FDE02519D2D0CA7EDD651EEE30B3BE335CCF7FB02059BC3A47EE3C056D4929EAD4FCD82C8CF49625D5DA460DAA299718556BF0F77CC5CBADB99B64C8EAD4474601FD5C79309D4E63AAC392853072619EFD7B958F0EBDE5CBD40ACD57DF269A8810776D6DFF2E637EA57ADBFAA08DF8D2581C38CB262DBB4D1F3C65A4FA068539D2056E08DCF03BAFF006EDC688023A20728B227A99FED3B8F2BCBED2E3E6ECD8B8665A2E4D233B78D7C33F6E3BD9D0A24D13C8EACCCB53A21DDA9E7A34F9A0F031091E65F749C9EBCCF3DDC4097A121D8C68EB7883405EE34F6A8B0208EA8D5A3FAB53FE2CAD1110BFA6E094F78D5314880BB67BFDFBC2DF8AA250F1D7200FF9A3247C4976DBD1BBE99DF02A3F246E5D466F85ED2F68E0B2DE06B0F2448A7B98FBCBF5872BCAE71BF0DB4E70105B020FF130141E8DE86DBE05B7D2A234CE2EA83A38E23A262E46FFBC837E8A71F657E443052E9A49DEA4E344D497DD2DE2AFB4009D681F232BFF4FEEB173546CBCC4C80C9F85B1CE125BE678E5EC62EF04433D55D4B8829B01AC165A440FCD6594F2C0CB456C8A47444AB05A0F0717B8185930D9738E885D24DAB98E11ECFF7D7A48A4527F94FC4C9D1B9D71F5E6BB39CF92B1A6D0509FFFD42E77AC9AD6F50F8FC649B96B8AC08673F78AE8D0BA2B7243452B33AAC44B06A2B9BE1AD6A12583D3590A3F9AF0E0DC35DA88A257170D315F32F3A889601D6729433B7ADE0F719386723EB2A008634749F5253CB7D9B2FC99A1AE1BBBE7F00A536CD38F8A7237D3992C3897DF412F5B1D45E1EF5B5DC974D49CF8DBF785160BC527543458FD9378B3D4D3124214AE5676185794209AD0EE73B063CBD5B7830D00F817CA0D5CBB597C44D28E4885D935B7BF426C1339C500DAF4F2033FA6A27A4196F233256650472F205D2C5E00E7087FB73027B0C6C9AC5C1D928CCD190B8A6BB33F512CA8E2369DAE6111156DE47A24469683F4721A25652FF87474DFD92A028B3EC5BCFC244CE442752A7DA1DA6C33FC22573BF0B13E371CA9FCC86C76FCF7A1654EEF4442E47399835A06336E62952770C6E61C573CFD07B3AB631B8831FE3F5DD2C6DF68EBF2F8E02EC9F6B90A371ED5E62C8463780AC453AB6F72D38C8F5212C8B650F63B98E3C0886B6A85AE8E7256C1EFB30969532CDBF72184AECBDE2A17B9811DD4222D080049C5D36C532CC0E910779D64AF93D750EE96BDA87562EBD3830FEAD07A3960CD6DE7146603199563693392D3CCE1332DF35C2C8A2C251911D38E95815CE5A4CE5596E2D77711D87CDD54D22E8F0AB431BF8B24CE9C7BD6D077E436543C70B02F338841AF0FB86B5EA4B6A47E27C1D83E1AB06801044F546ADADA437F3CE7D788A1C92A74BA540664658E70D4F2711979153FF1589792859C3BF122628479C7C35EEE951DAB8CDB0D4D150C2DA338346988D34F8C5E589B231B5E00849611BA09711BD3A0516FD515E6C4AE1E8A3657C282C8120C97AA7A2E3BAA22B6EABB8D8212A9A48E7759A9DAAA51B538F662A05FB897067B7CF9D2CEB47A1897214CCFC225CE47CD60E86F7DEA49E220F7DDD6894B30B66460DECBBCB2E42B31F4ADF0AACDDE544B9124EA5ECB04B03C448B17E8094D489F516D23164D2317D3A1332E0500F1423136C8535D69065E880AF34CF7E36DB5FF2C18122E41880585B4D188411E86B370A024BD6E28143EA2EAE52EB46BE334A21A02E21C6755C0182B9A055A7D4C7B056E4930CE63EDC79C9FB4E2FBFFC58F776086F3487F02F8D1E7C8519C7F452E75CE5686A037B3642B95D7526ACD4A81A47112CF96A8DA7548016A22E9359198E871DBCC5852FBE14EECF3CCC5EB2FB5EC31D10474DF7D63482A03E11F4AAA2EAEDB714786E21D03AF1CD644D06BB05FF7B3959601580BF50E5F7F82FF42E9CF2FFCA0C67FFC52CEDC53C7A5C9EFB6C21092DDA374D1CCCBC78BBD9F5EE0FDF6DA6AC60C95F7C2E96F17E3C379A52D5DBD1A92DD76D1F5DFA19EA0408E0E7F7867445445CFA60BCEFC016E68872FBAC9098FD6A8E84731C285570B1BEACCA6F4728958E7924F7A7B7730B9BDC9AAEBD9E045F464071843C650D06C96D487CF8397286F81D93D0CC2008A62EE32421E5231998140909474F6D98541D899EA53714AEFE652A3D792E4C72533332C3133707A49293E3B2E06AE18F2F81D601AADDAF2FD09EC59350E0979A5AE2B721771682A1BFB5748D000F9736031CA971288F34993DF10FC06A16A6DBEED8CDAAA8127F3B71432E723558F0281459820A0F4A75A3B2716F976BDEB88BE9C73F31623050D7C1A96C84988B01D847309E1B6D7B815883F83C9BDB7FCDAEFA8BA69E25B824812B7D54530A3ECC96611897661158DAE1B4AAC112E9AC13D07FDC03DC7D5AF23C08C5E4BBFF737238FD3F1C06F94215BF2351DCE9CAE14B4DD4745AC0CD626054469C6A5286FF821BA192706D47CCEBC443DD67FDDB76797A8B78DD0DAF850CB5D181C82298616E1D3A92F7FC82FD256857915773C7AD97CBB9710373299AE8516B8A1D647A13C7BE848E0269ED6C8A91DC50D0CAD21430A3BC9E718A13D1966A0182D9A24FFF7ECBC7876C868AF2BAF2D8B782172C6719CF140E8CB877FE6D78779E1BB31C70C6C9A6A77529C51CF78A5E4FBD7FF6153B5195817F80603E5C5810C38CF43CA812ECA52F73F045E33DF4E3D04EC8C5F8B4A7399F6CBBF0D39DC951C476B9BCC002720CE89F09C3885673BBA9C90D20DCCCA4A82CE5BEB38BCD60AFE2BA65FCFB01C8793B7ECC0F0B17A9DA74F2E0FEF4C90B5132FD6BAF8C010FCB5E8E7FAEAD7F2E0DB29BFDD1811072623CEE274EF2EFB0F7D4191F332AAF20CF36FF89A2EDF15F7B284CABBBEF46901271D8C1B180F736125C8A44FE164AC7E687E9A58C3B1775238BF1A11F99BCB583D0E3C44BF4F76DCF9496A06F80CA52E24D55B54AB849D3040B4798BF5292B0574672E9F844016A52A4D4E4DAD2053207BC97215BCC1BB93271C03C9AD2DFC7485EE2ED399236AA06CF9A12972E21AFDC587A6334CD1D71A7539362D714BA26214664E3B4BC39CDB1DB847583DB8E002A2AAB451B4E5BD6FE200730BFB2745D03C82B640F4CCF58701708F724EFFDF98CB04C78DF36B7A866CFD596BF5EA18445EEA0E34ED514D0DC2625039049A0CC82711DBBEDCE339C77F9FA1DC60EDDD8D58C8F144B0F3D00227AFD8710BDC66D29809728D7FBE85F08AA38AEBE5605DA29A09CC0526FEE84691EAA54DC3744BF5A95275037FA2F600B1F91E502D5D81AF48F8EC4C1834FE625FCDF2364067048727559047E07062B4D8A7D3851853BF28BE9D2C511451E5FDD9459270328A2612DBFF42E1DD34005A3DA1226A023162F454923C0337E6C74B44BB27A3B1AC82DFD68B0A6DAF93473D97A9E4591EC01A51CB6B47E2C7A85C1FFA73C35E5CE3003BC4534A2D9B16EBF9FED6464CB1E0CC665A451616A62B6A8481E4506A73883198C144A06331224D358196C815C811B103959EDCA35B26BCF86F41D9C7638547496787885EE62B14AF431CAB2AD4E0224D33476C58B8B0833BF13B50BE2B1D682CA7DD194B793AD2C6E4EE25AAF95459302F0B4DAED907A317BCC6A5F8D76CA9AA0D799F8EA39F330D6244BFB9F35E6223A0F665A65F55EAB9BCBAB446D7FCD424DCE87F234864D2C27EE84600ED9193AFEFB6E7681BC94F514FE0748EB32D32262CAB880D79CD4FE5CC963A4F688D448F2DB2DCC5B0CA87AC26DD8506512C100273B8D4D902FC054D48D8BF9EE818AD9619F68A8904B613256DB78C881CEA3373F0CBBAC336A78CD91AD9D60126E05CB8C16E9AA8482CF1B806B2F9C57BC8D63BF008AB2E49EDE8E788BF96B9F1DB2918DC5063F3F1D5B9B1C0327141ACC0B4B248FFDCB8BCC127050D27C805E154A4825DEE6BE9C8D4E42B1F5EFC1EECC6A45DBC119AFB15CCAD19789EAAFA8B1715111AE32E2ACED2278803B60E2FD63A43317498244A7CF7342342B60462510E19D83240DFF5D58E762C093DF326EA503FD347D2A92A5A4680D5E13B305671C729179FA21BE83B0D83144E63 + +count = 92 +seed = 4D0788DE958A707899D5DCC02F756A10DEA2EFE0214F5E01B3281DF4E013CA75523ECEC64723D6C8BEC0B92C4F821D8F +mlen = 3069 +msg = 9163116C86E64D90D35CB216FED71BDBE6A0797A48CB915F5A40FC8D31AD340767058B28CFF0C240720327E12E653C1F98B5755D8000BC01324DB2820781B94C4434FDA76223845E0613E2526A95F28FB4A768B1487AA34DADB28CBE8DF4FDB510DFFE672FF004F37C7AC32072A24C0F12A050BB396AD56346F4E0BA75C0EFAC162288A7EE8A63255DBA5CF451A0932FD56B05E40EDD491293E045A6081F6586BDCA10B41A6970D8F9A7B3B6B58AA772EEFA9ED22C9A24A384D6947770862BE4FE45C5E0E56FA4D116B79699ACE41E5D9F2E4C245059CD798DD986A3763F527E0C9D5A88A09C4D76D447348509FA7D9BFBF3DEA59EA57711A3B1A9352123D4A74DF273FA24A89BCAB42A6D455B5FE3C503F1FF638280F87C740B9E4C5FF20133CBDFB8D08CAEB7DE9F26811D437E6EC8C3143C0419C2F5135D25C7F40C7908C03F295FD26F1A03FBC7285196BE40ADC6FBDDDC912B3BC94B0BCE08DBC2185EE3CB766325068DB55C31FFEBE4B1F6848AD4FC201A5FD056916A397ABE6A66FF9BB03B037B50AC509E46CA441ED45812E3334FD7036D190A7991E55CB817EC2A63CD800F293277E7D15F086618B55AD395C614D168FCEDFB274FDF4FCD50CB976F68A266C5365E02A1ED0221BA4E13E70304824F94251249CA23C089B4D54E02EA03FB7C9841DD30404428AAB2519D68CF564D75D18530C7D062496C120A8F5305AAB23AE52255EC919EB0CD875422B144BF47F7472349558E746B0EB5493F1FC40ABDADD2ED84A8B31221A485052369FD0B552972C9FAEB1A78E826BA4DFB9E91E301DB589E9D7C256E7051692C48534C6A5E2BF0F45B78ACA66D5F53E549827E15D64E2F294F93D43B9F36BEDCE6CEBC05E56CED3F846635AE3C384C3FD55B969CA31E8C625103C2B24E7EE45E92984CA23A331C5B14281B20116069C619D82D6080C6FE35C3A3FB2E73B695CAD9C5D3300814FD65738DCC3EAFCEFCD24361AAD13A25B3570D2D509FA449612BDB5B49E0605D7EB78449D1DB40660AF0F3D8BCD4869B6F175CD28AD72FE2668C3DFC1D4963D0EAB309DD50B74B9D2947F86FBE9864AE5D0DC69B55B182AC1D914B11F631193F5F1F897CE52CEE97D7AE95631FC2F2A1AE9B672165432EB2E5633B55185AFA5E883268D8503AEC10774D25D39C800B74405414FB06C55B8C48835577884D6B4F2F128246563066F8F34D76213E0720E899FC1F11A3B0A591885D82C688E40D6B44B54D6C7C6973156E2DD50C40A28D2EBBA60F5117D64646CAEF72974F4B8362E4820EC04F2F373DA8D883AF27518567688146F16BF4E10969E70BE8ACE5D2FF6A135DB1DD738907EA355FB6D243904F6427D11592672060DA14443B55A9089167FC9D5EFB2C64B0069795C341F90DAFF684E566611EA87BC40A4C45F22C23AB6888A754B89E4C95BB54629CE74EC999889C82714B5AEC703DE7BC080B0D2E622ED53B645688CE164ECDFF4ED66C86049B2F9077F2A94CD685294F8EA9CBC1DE29A48D39F6B308288DFDB47731E39644B576A298646752F5C53D7943A5D0F7DBBC9604902B61B8EDEFEB5AB7E5BFDBC1E6723E6047894547E440E918038CC13B47424CCFE1A207E08A40524B553C750683F5F6C960F05836FB9B28C59E1B471FD5331F1811DDF3EAFF73798B7FFD6C9714978988C440CA906B4782A410372D70EE65A0A803061708003688F576E2D3A22580B706149A24B93A162BE9F1B546680A1DB2A8E54A576C28B4772C50A55161B2994514369C2192B2C90017CC8282F41D28099F38B2F1F0D2C0E46B444417A2078755591F00F01DF0CE72B1D1BD255A14D2BF67AB3E630F95A5DA9BD9E10F08EFBF6FE722CF000C32460FA3271F18B39EAA4487C1DDF828B6BEDF4523837BB3425BA1C1606E8D5D1E6182AA6A74F068F3E90B42641347CA755779216AFBC99603391FCEF4E8E5AA202BDCA24B83FF42F4F01232D3F2831CDA2DB76FB93A4CF6E9EFB71B5438A4B74C3190A8901D73566C50727559BA9BF6317D116E8F5536BACF064D3F86282E0F88DD40B63E75519C6A8E5664AF8E1029FAE87930F523E4DC7C2DD6DC3296A42A59F178D438866D929A70951BED05533EB1D818B7C7C595971C26B1D436D26897D6A6EB036A13511AC4A3BD724F2CA57FEF07D2C0730800D35683D745125F4237ADD64B538B7DAB0D0F258DAF7DE1A74F74A2FD010CDEE810F514FCF6045F0CC84E2054B5F4EC2772718FFB4CCA9C9BE77F8F007333860180D60EE4DD8CE976E63FF49AA11DD42FE6946515E59DA3E602B1861BD3F63C89362BCFE8438BC71959A617D8D63331A3D903BC5734B777FB14F7A2B063D79EA8637AC52C758EF88DF217B95FA8FDF1009AB28D8A4F318F78772568CC7AA9E3B3E001C0111B1751B698EF1B66383D6B3CA942FE4F66FC97613CFBBC03EEC9D0B7E08F80939D9A2EA1F72BDA7B0D655AC3A94B4C699D3EB1BBD6076E63EF5C1FE9CE258B55D21164CA7EE03BB53D8BA4306F695E648093542D769DA95A35FF3A2C071DD8ABD5A82E217D82317065D50A87B689AE3A2EC7887957BB243373CF986490961220EA61EBE12AC0287B185070E124FC518C300620B4B6D4F29402B18C2462A7985C00E2A87691053B1FDECB7AA264F33E27C6B201CA6065EF79E5266513AEA92E8D3E646453C089B5EBA66D14BC45844D0240D2E7737C16668FD53E38A93D6003146019777C03644C300D06927EF6994AC794914EFC5BE0CA81680CA8C9752908FBD2D56D7FD1FC1C76EED755408F1D7802F0D3D0F347D82B162EE6F0A2A890E083C20B822FA6C4AD627F4AB5D1526D83D897C244D6ED4A427B23B4A0C19F4E8889257C1373764AB7063B5DB8ED9C2443CB012381A2B3365EB568649D7CCD52271F25FD22FDC397E4C9C536EBB452CD2CD10DC5010BF433F88CB58D2B9EDF2BCBFA83B782FFD4388F1BCE3F8F9AF5AE6BE590BDCECB1BFEA846D2F0199ECCDB0C7E4D419F69B6A428EAEB462B67AA40340417BDFEBB6039AAB8242E39F6C11EC136D73FB315CF71414A2A1203AF08FDEE34ED0072C27462395815F7779012A41EC526BE53DA954E1F7A7EBBB68FEB15CBAEA8ADD6CD0F2FE3D3615991AB54F4C7884E8A80A9535F13BE2ED944B3BB315DE8AF2A70439294CD53F041F41D3562BE840C78EFCB08661B1731FEEC46A9091ECEDE3A9FBC2DAE42C72EBDD84308E95644373595DB62157DBA7DBF124BB45DE6C2837B0066673BFD215FF915A8D41637EEB029C345E444251ECBBCDF79E246A80AA4591976A00DA06C759C6160ED1986F8E15A562417DA55109174628E7B11D49586882851205755B4F99A875AB3599FDCC094E4A2164E1764D24DE805FD7B20EFEF2A8E23FEA4E206DFA1FD9C31D90C1FECF745D3EB886190827D952703AA6A99B5000D8EE9D51DE94A82DD053B6AA89CD7E94E92D4AA93A9224D3F688B5C834A53F2993638166A3DE78ABA7CB930CC5845F9915E6523683715A187E940FA2A978B5CA4C3B80DB62E96A600F1864BF0B1AAC23B1330B13EADD3A2F07CE7181D0A9497C455D228278E5CC3E4C00A2EA3EB8E5B9CE2799256302B0F8F1F829D3A3AE8AA7CC4EA229C5AF476C01B8D48A9F6987DF57C3469B6EF6DFCB488A3D5B91FE17B5798FE154AB8399A2E75F0D15B2A6AA91302056266B22A38A604EDC374E2D2155ABCA119C11DC6827A47E3CEE7032F6E0F59708DFACE221E47041CFFC59CE0334D9B7C5E91C2C320A70EC2F32906624128363C893909F47BD970DF652D5E6C2324033F32B1653A039F8C051D9DC8F839C50F5696E9E08F7F1CDAC4750B429AF03176FF6E643ECA1D8FC710C6CDB0D26074D85316F4C9084D5F453F6D36C1CEA0E389F3462E1478E2503C1DB99FC46F3F0627F173672C21F3CC3B483998192E81EFA689819D0007762ADBD141A058587E030A3568E412D25662C40ACDAFC3C6EE30C10CC23E3DDEDB6C73085C90C89B1218D67A328F06C3637A786D4715CB9F9D8B0B22D920B68B0557CC80A56FCE0B6E2D6627DE576E308757A8F37821898E96785AE323E413D3572205B0A5710143A2621C258C76C7C3FF7100A2FCAE99C84D1AB1CECF7FC5B1E4698BFA3BA2A0856A65F2D4F291A4A164C0381D70D1213F7E40FC4BA42C43EA8E70043E27C5AB0827559B7CF7F2587D0D2F93C6382CF54E92764D815280D68C554E5B6FBB351BD18635786299DDE39FCAF3EFA708A3F18701EDA1579BFB0BEE4FA1F1ED6E09D450D427E4B91F4552F87F31F06F109E74AF4BF301481452AAFA2146F6375DA467EA008BAFC3C8408AADD61B07C28C55249EC0C8BFDB00EA +pk = E46537C877D27F403973B0733FB1744A27BB6189B4C5261A1EEE7FBF6892448458F0EDF6E048E512159649952CA57B2662BADCA4BAC283E1748EB0285A8CDFD039ADD5E9AB9C829DE0BBA8B61F38642B76DD4FF9BC13CD5B43719B985841762917 +sk = E46537C877D27F403973B0733FB1744A27BB6189B4C5261A1EEE7FBF6892448458F0EDF6E048E512159649952CA57B2662BADCA4BAC283E1748EB0285A8CDFD039ADD5E9AB9C829DE0BBA8B61F38642B76DD4FF9BC13CD5B43719B985841762917652A26C39E50736CFBB21B92B9DD7E43FFF72D9AC4467DFDAE0600000000000000000000000000000000000000000000E4E30B627097937E6AFFF8872855332040B76334A09D447A0AF5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF87E889112F1F792E1B76664685D5B7FFC20FC88666D6BAB6FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A743C973F062B91CBB9F7F385E12909E84070DBB0A27F4E505592B5075BD25DD34DED6727DFE832F0DB92FC13FBFB200BED1F03F04E2750AAA584D9909A257E8680ABAAA3B16A6C606664ADCDC04701D0566D2E885F9640831FF0453F485A400EE3FAA8C4EEF3C3AD8540E61982E5CC848647CD70F7598B56AFF549B57A5462203928935BAD99F99FB682760EA07CD003764043F315F2CD0C694D3ED1619E3C60BB6026AFA61CD09C16C73C7F4FC1A3ABE95D24ACA1361F41BEDA0364FD43600 +smlen = 3293 +sm = EBC0478521BB503EF13D77D8DA956F473A7ED6EA63CD261C68773F17BA20E00C7726745EB1B8B0F19389BEDF7B5728084F92051C09062C2A87A26D6CDB0614D12D8FE418FA30EADDE1221F4834CAC8D8D6A312E5379B11F14699D59C5F3B013200008C189D385ECACAC6515E5E6EDD48594CB15F119283EA442802C9B5D03B69A05F1019185BDE93536EE51F4D4CFAEBA1551801319DC2A398E56F5C6B3A9848BF3ED30AA17AC6C701F26A14030361F094B99AECB3462A663E2609C8DDE07B1783E8C02CF20105152392CE76AA14D3689D3DBE62D88E72B11E07C539C0000D049163116C86E64D90D35CB216FED71BDBE6A0797A48CB915F5A40FC8D31AD340767058B28CFF0C240720327E12E653C1F98B5755D8000BC01324DB2820781B94C4434FDA76223845E0613E2526A95F28FB4A768B1487AA34DADB28CBE8DF4FDB510DFFE672FF004F37C7AC32072A24C0F12A050BB396AD56346F4E0BA75C0EFAC162288A7EE8A63255DBA5CF451A0932FD56B05E40EDD491293E045A6081F6586BDCA10B41A6970D8F9A7B3B6B58AA772EEFA9ED22C9A24A384D6947770862BE4FE45C5E0E56FA4D116B79699ACE41E5D9F2E4C245059CD798DD986A3763F527E0C9D5A88A09C4D76D447348509FA7D9BFBF3DEA59EA57711A3B1A9352123D4A74DF273FA24A89BCAB42A6D455B5FE3C503F1FF638280F87C740B9E4C5FF20133CBDFB8D08CAEB7DE9F26811D437E6EC8C3143C0419C2F5135D25C7F40C7908C03F295FD26F1A03FBC7285196BE40ADC6FBDDDC912B3BC94B0BCE08DBC2185EE3CB766325068DB55C31FFEBE4B1F6848AD4FC201A5FD056916A397ABE6A66FF9BB03B037B50AC509E46CA441ED45812E3334FD7036D190A7991E55CB817EC2A63CD800F293277E7D15F086618B55AD395C614D168FCEDFB274FDF4FCD50CB976F68A266C5365E02A1ED0221BA4E13E70304824F94251249CA23C089B4D54E02EA03FB7C9841DD30404428AAB2519D68CF564D75D18530C7D062496C120A8F5305AAB23AE52255EC919EB0CD875422B144BF47F7472349558E746B0EB5493F1FC40ABDADD2ED84A8B31221A485052369FD0B552972C9FAEB1A78E826BA4DFB9E91E301DB589E9D7C256E7051692C48534C6A5E2BF0F45B78ACA66D5F53E549827E15D64E2F294F93D43B9F36BEDCE6CEBC05E56CED3F846635AE3C384C3FD55B969CA31E8C625103C2B24E7EE45E92984CA23A331C5B14281B20116069C619D82D6080C6FE35C3A3FB2E73B695CAD9C5D3300814FD65738DCC3EAFCEFCD24361AAD13A25B3570D2D509FA449612BDB5B49E0605D7EB78449D1DB40660AF0F3D8BCD4869B6F175CD28AD72FE2668C3DFC1D4963D0EAB309DD50B74B9D2947F86FBE9864AE5D0DC69B55B182AC1D914B11F631193F5F1F897CE52CEE97D7AE95631FC2F2A1AE9B672165432EB2E5633B55185AFA5E883268D8503AEC10774D25D39C800B74405414FB06C55B8C48835577884D6B4F2F128246563066F8F34D76213E0720E899FC1F11A3B0A591885D82C688E40D6B44B54D6C7C6973156E2DD50C40A28D2EBBA60F5117D64646CAEF72974F4B8362E4820EC04F2F373DA8D883AF27518567688146F16BF4E10969E70BE8ACE5D2FF6A135DB1DD738907EA355FB6D243904F6427D11592672060DA14443B55A9089167FC9D5EFB2C64B0069795C341F90DAFF684E566611EA87BC40A4C45F22C23AB6888A754B89E4C95BB54629CE74EC999889C82714B5AEC703DE7BC080B0D2E622ED53B645688CE164ECDFF4ED66C86049B2F9077F2A94CD685294F8EA9CBC1DE29A48D39F6B308288DFDB47731E39644B576A298646752F5C53D7943A5D0F7DBBC9604902B61B8EDEFEB5AB7E5BFDBC1E6723E6047894547E440E918038CC13B47424CCFE1A207E08A40524B553C750683F5F6C960F05836FB9B28C59E1B471FD5331F1811DDF3EAFF73798B7FFD6C9714978988C440CA906B4782A410372D70EE65A0A803061708003688F576E2D3A22580B706149A24B93A162BE9F1B546680A1DB2A8E54A576C28B4772C50A55161B2994514369C2192B2C90017CC8282F41D28099F38B2F1F0D2C0E46B444417A2078755591F00F01DF0CE72B1D1BD255A14D2BF67AB3E630F95A5DA9BD9E10F08EFBF6FE722CF000C32460FA3271F18B39EAA4487C1DDF828B6BEDF4523837BB3425BA1C1606E8D5D1E6182AA6A74F068F3E90B42641347CA755779216AFBC99603391FCEF4E8E5AA202BDCA24B83FF42F4F01232D3F2831CDA2DB76FB93A4CF6E9EFB71B5438A4B74C3190A8901D73566C50727559BA9BF6317D116E8F5536BACF064D3F86282E0F88DD40B63E75519C6A8E5664AF8E1029FAE87930F523E4DC7C2DD6DC3296A42A59F178D438866D929A70951BED05533EB1D818B7C7C595971C26B1D436D26897D6A6EB036A13511AC4A3BD724F2CA57FEF07D2C0730800D35683D745125F4237ADD64B538B7DAB0D0F258DAF7DE1A74F74A2FD010CDEE810F514FCF6045F0CC84E2054B5F4EC2772718FFB4CCA9C9BE77F8F007333860180D60EE4DD8CE976E63FF49AA11DD42FE6946515E59DA3E602B1861BD3F63C89362BCFE8438BC71959A617D8D63331A3D903BC5734B777FB14F7A2B063D79EA8637AC52C758EF88DF217B95FA8FDF1009AB28D8A4F318F78772568CC7AA9E3B3E001C0111B1751B698EF1B66383D6B3CA942FE4F66FC97613CFBBC03EEC9D0B7E08F80939D9A2EA1F72BDA7B0D655AC3A94B4C699D3EB1BBD6076E63EF5C1FE9CE258B55D21164CA7EE03BB53D8BA4306F695E648093542D769DA95A35FF3A2C071DD8ABD5A82E217D82317065D50A87B689AE3A2EC7887957BB243373CF986490961220EA61EBE12AC0287B185070E124FC518C300620B4B6D4F29402B18C2462A7985C00E2A87691053B1FDECB7AA264F33E27C6B201CA6065EF79E5266513AEA92E8D3E646453C089B5EBA66D14BC45844D0240D2E7737C16668FD53E38A93D6003146019777C03644C300D06927EF6994AC794914EFC5BE0CA81680CA8C9752908FBD2D56D7FD1FC1C76EED755408F1D7802F0D3D0F347D82B162EE6F0A2A890E083C20B822FA6C4AD627F4AB5D1526D83D897C244D6ED4A427B23B4A0C19F4E8889257C1373764AB7063B5DB8ED9C2443CB012381A2B3365EB568649D7CCD52271F25FD22FDC397E4C9C536EBB452CD2CD10DC5010BF433F88CB58D2B9EDF2BCBFA83B782FFD4388F1BCE3F8F9AF5AE6BE590BDCECB1BFEA846D2F0199ECCDB0C7E4D419F69B6A428EAEB462B67AA40340417BDFEBB6039AAB8242E39F6C11EC136D73FB315CF71414A2A1203AF08FDEE34ED0072C27462395815F7779012A41EC526BE53DA954E1F7A7EBBB68FEB15CBAEA8ADD6CD0F2FE3D3615991AB54F4C7884E8A80A9535F13BE2ED944B3BB315DE8AF2A70439294CD53F041F41D3562BE840C78EFCB08661B1731FEEC46A9091ECEDE3A9FBC2DAE42C72EBDD84308E95644373595DB62157DBA7DBF124BB45DE6C2837B0066673BFD215FF915A8D41637EEB029C345E444251ECBBCDF79E246A80AA4591976A00DA06C759C6160ED1986F8E15A562417DA55109174628E7B11D49586882851205755B4F99A875AB3599FDCC094E4A2164E1764D24DE805FD7B20EFEF2A8E23FEA4E206DFA1FD9C31D90C1FECF745D3EB886190827D952703AA6A99B5000D8EE9D51DE94A82DD053B6AA89CD7E94E92D4AA93A9224D3F688B5C834A53F2993638166A3DE78ABA7CB930CC5845F9915E6523683715A187E940FA2A978B5CA4C3B80DB62E96A600F1864BF0B1AAC23B1330B13EADD3A2F07CE7181D0A9497C455D228278E5CC3E4C00A2EA3EB8E5B9CE2799256302B0F8F1F829D3A3AE8AA7CC4EA229C5AF476C01B8D48A9F6987DF57C3469B6EF6DFCB488A3D5B91FE17B5798FE154AB8399A2E75F0D15B2A6AA91302056266B22A38A604EDC374E2D2155ABCA119C11DC6827A47E3CEE7032F6E0F59708DFACE221E47041CFFC59CE0334D9B7C5E91C2C320A70EC2F32906624128363C893909F47BD970DF652D5E6C2324033F32B1653A039F8C051D9DC8F839C50F5696E9E08F7F1CDAC4750B429AF03176FF6E643ECA1D8FC710C6CDB0D26074D85316F4C9084D5F453F6D36C1CEA0E389F3462E1478E2503C1DB99FC46F3F0627F173672C21F3CC3B483998192E81EFA689819D0007762ADBD141A058587E030A3568E412D25662C40ACDAFC3C6EE30C10CC23E3DDEDB6C73085C90C89B1218D67A328F06C3637A786D4715CB9F9D8B0B22D920B68B0557CC80A56FCE0B6E2D6627DE576E308757A8F37821898E96785AE323E413D3572205B0A5710143A2621C258C76C7C3FF7100A2FCAE99C84D1AB1CECF7FC5B1E4698BFA3BA2A0856A65F2D4F291A4A164C0381D70D1213F7E40FC4BA42C43EA8E70043E27C5AB0827559B7CF7F2587D0D2F93C6382CF54E92764D815280D68C554E5B6FBB351BD18635786299DDE39FCAF3EFA708A3F18701EDA1579BFB0BEE4FA1F1ED6E09D450D427E4B91F4552F87F31F06F109E74AF4BF301481452AAFA2146F6375DA467EA008BAFC3C8408AADD61B07C28C55249EC0C8BFDB00EA + +count = 93 +seed = 55A9C7A0B49706090BC0702ECFC070AB060427FFC820C3FE05B499B59AEB125F2DB4787A5910B88C6F8FAF0A69BE0AE5 +mlen = 3102 +msg = 02C7C4451DA90503C43FDED1CCB3DEE468A6A8D9E56670CD8F6A58E7941F1BC5EFA6E2AFDC0141A2F7E8F781D79E70B4813263A9DBC8D8A67F89371CFBD90977EC96461B28BEE4C644F2C91E96257B1909B84ECB25CF438A3FD6B835E20D5CDA56A1FB7995FCAA0EE1B5327FB1288E3C57CBEF0554CA5AD6FCD1F1865C6AEC6CBDB24495700AB5AAF078D8516CA4FA3A231A97C77BD150B127CDBFB42C03702C9027B2A5F6594B022EF55B63BF3EEC27EB0E9529ECCDC82BC6AD1F011F167D602EF1F175DA5DB4028BF08A053AF2C728ADE93B37EDC2A75B7B6C6CF38CD1C07F359C73B131B13DF76139DEE6795F1D85B47F29AE97D0E40CF5DBB67360044F78940A1E80D9D99FD5AB0185210D8769911BC471650DF0FCB9C3AF038F7882F677790E146E612FCDD6FB89F90B7E5E46CD648F4BF8F736D69F8A91E4806346B4366FD48D1481C0B47ADD82003310B0A99B779D63EDE1771F50221651B2D8AF40F48B92EE1327C85A1D2EF2D86378076BEB58556FCAEC6029649A0EA5FDE517A85D87704210E071FCB6F63317AEAC3EB3E9746018E1028C50C790A45B1BEDA6EEA2D646DCE401AD5D7850A5F69CD85301920DE77AB0D01B1361EFA3E70AC05881BC02190720ACC75A691D6064F9D24C79DC72476309E58CDDF5FB2A253D857A79C8E898AB6ADC300EAAF208820CB02F5F2CD317F4052D40DE28E52C55A0349DD855D64E8DA8296D4F572281E221A3D27EF76FEE67FBE5484E6460C99950763B801FCE828E93D2A633A1CA5D7EC582D7C463DA5A9AA8056BB2173306F3820BD0A3273742789B61AF89CCC42B81CC68745800D2A59231D5D28E832F443A871DE5B6B10B58A8AA7CC9816014D7F3545DDF1F481B7F0C9DD41B4D96E5DB767B74776C2253FA230DF65F3E0B944B95ECD4138E2847418B084D9F9E0798CB5247238EC12B88C10A5C0C645E1D09D09059C72E33C28A472FDD8B88EAA93C63BE7D980A12195C2EC3105DF2BB81CC9C3009F7771B6B813CD12303E3A9961D6731AF55ECFE5127BAC68D06F835DD5F2D584FC0E648C3A4256E2A3D4B81966010964657F33D1FE0400724C488D5AACF9F2C0B802CD812C8452E5B8E2B17FF4A1289D33FC405F5DB4ECAB4A73FCA3634756DFBF9012C413B6F64788FD0F68F8AB7620477ACD3C14009377F3DD54B9EAF2784433D63341323F54D113FD63D7456AFEF885F13C13172A37A5DC82336B9515F8F7F4903EF6DBE9CB34930743B6ED11265CF94AAF406DEA9802D17BCB369AD0D9964792F74D338DAFE47EE88B3B74EBA8E70774EDC1F16FA876FD62B0BFF880CE252EE4435B1DEBF36F0A06A4FB406F01D618C135E6103E2A39F4C9CF41EC93702BA76BA753AB49B5836C20F67D05943EDDDF47AB8C5B81F4BC22D773305076F7E5B697A7B25B016190072F756F19F397884E0521595326CA591672684A3BE17C9F5CC8E8F4848F7136762178FBDCC7BC6A6C6A31345FEE687B0505F72BF1AB7EB87BFE5F896CFD42DD67A239C70648B39BC0C84DA33CA17838FB4213C38B68F22914FEC3DC50194E883720719E9B5F8D037DEBB726DBD899ABD97853C54B0BC347A322BFAF961C6CD6209C98AA81B8E2595FC151B1375BF4FCA2DFF49DF40A3D1C694EDFF6E9687E73EF62DD42AD7A05195A7F206F097196AA0E4D68F8132D4A00CEDED940C4F6AE02E6D3763073462C7A4BB11778290E744471EC554A05917E52C5263FF02C07BEE055234EEE10B79175DC164AB2051B03598DF1D4311E87ACF4AEC45C55B1A58B0F05EBDABE248A27C0187643CB8F9529D31FE0AC4A28D780196DA00DACFF5F2DD64FB04E7C159DBBCDD3343BCB7AE188DE15D923D2AC0AF232C5389DC9C949FCE554F7A0425D4F9B28DF2EE4B81740C2B5A5B93F0F7AB75EBD360CBC78B11C28608B5BAFC970CF3D4455A20A198392D876EDCF89E2639B50CD84AE21BD50FB077050EBFFB210BE711D8EA807CA66493650E909911FD3CAD99AB94B2AB2EDFF192D9D75257818272E147A9C54E06C53210FC091BF4175F2F44423669716FD9A6C4F96A0C4BE17839769A806453E55D7357FBFB3D7A458E70957D524C0E896398E135BFA68A0CC136FB93EE7D30AD463E32E152FC32CB8E7F0B05A30EB13C0DF98BC187EC0A54856D2EFCDA10A82B89DC8CD21C67D9B6DF3D7005EF3B2BC9DCD5D55B64DB40B74FD322CDF9D9911A00B5A02E1AD5CA9BF65D90DB709FC1E5FC84BE97574B09C83B49963A51228A667BBD84BFD8E0D90EC161FE5CA73BCB8D95FD7AFD982AB7EBAB51BD2B24CD6D356EB850D2C65593313D8EBB97E7DFA450AE982918582F86A356F538EB05AFD460566D79F040D36C93D3C645B636560007D51B121DE3FAFB3ED70B475AFF9617DA4B52937C628678B109C3B76BC15BD02B766A394893D8EC966DFD8033D12A8D98AC5BE201134325E32CB6786F4FAECD7DCD05AEF5F3739122B817824A672E71DEB312CB7DD6A77116B30715076384297B1962EFDFEE6D6D2B2ED2EA4DD802F4784872D825DB828557D4D927B7232682AD91CEC3E508854F529853A8797B7BF7BFF8E3C180980DDF4081E96A12A495ACDE0C73282AC78617C68A55A94573E5A37B859858D1E19ADC82821B316B9D346ECFC6DBFFB3779F692A62D20D1BC4E730FDE2AEE826E76638ADE3DFAA11057B0BC8A80E8905B15E41D9A4105109F18E7E1362149AE9C568D1D642D65B94253BE2B13E7230F8BCF34DC87241D1DE72A65BBA111C111CBF5BD618CD02E0A06E37F60B3736631073A6BE004C1AD5F0091A82C87B276F7C5AAF6938C886A6039DF23482E2064F6AF05636B4C6BA6B24A29AAF2174AF4BD959177203AE9B160F81CA6764948AFCDACF6BEC0B987C6DBE178DCF47C137C64809483019C5F2072D0301C19C500C60B5CA913C24A8F28F50E1578D806FF9F9B810CA14BF5F2268FA18DEC67D973EB1D975AAF871ABC980D06222493D900CEBD8811FA20D5DB8F8036430F8BD7F9554F7CB47F9EBF389F66C3CCF9F42DB57AFFEE074FFEE4EB3E11612FD8A8FE02CC4E9D2F8BB36C505CECE9DC87512AEB5D8EBE33328C5217CCAF2E1AF1E38BFA84C0035DECD8D8C250FB4D964E8F0AE448AAB740D9EE9D794390686FE9A95183F0D5166D479C51014F1F29D8FEC616E1A4E7A9C86E2AF790BC7BD7BB6F746A2266332E04AFFBE6B9512E6620681C3317DC846E4FD7974E8AE87E370ECF9DFED574E339CD7E8A663ECD1A7BF5842391913D98686F7F2145BBC420F2F58B89131D5F3BE41C85752E13504BCC549A8F690CD2B0E1E29E4DFA3CC76BD398BBF28F33A00C3915DD719F7CB985E9A0A7CC8190BFFC8BF47310C71418D7A6C629C491EB8E455148BD4438BA6B7014608B0CE6A1BC5B035BC174C9BFFD966D8305FE9E5619BCA3FE4B39E6732DC652531819AC828F86EA11360678E786EAA741382D713AE26A608D582A3E4583D45744ACEDD32670B5AD4A1310301B28A174DC9858A55F0C1B7486CD66CB0635083B0C63016E40DFC533AB80C9CFAF1378D00769DCBAD56B09DA3A4E6CDBFD8F3FCB951680020DCA58647665462E42F42DC14E7B20F262D3CEB0B1A2BA807B98D66232AD7D3839C298564BC36A134CC2447B1B9FE69271960459C0A6F897C1878140690DA7D41FD8AAA05A679FDC3037EB2885AD3C82374F4BB991745351292DFD8E54F565E0093776B7EA65DDCD500BEB4D15AF6029F2630A0062F2D4FB331B47B6A5E139D385016E1FA490EAA209636B1383B7D7DC1148F07ED2CC2C03FA7FEE09305F34C57B3CE899C18462B4F1EF88C1AC5259440AAB48C5849652AAD9D3CF3D31F36C7F64F918868182D36345BA5BB7A4EE088D8B081EB78FE977F5A5295177AA427215BB26D1DE33AD4B2D610A47F8C672EEDA703A04D0FAE4C5961F13AD6FCA81863D8A394135565D8B27904A511FD0621A532F84A47CCF4FCC2114D4C369B7A76822959F8CAA25A6495081CA9EC3AC3348A981618592C090B6439CDA2FBC932C8697B3709323E3388AF8EFA1B9CDBD65A65C8F0C302330DDBD10E0235F8030562452EDE447EE5A5A9A636AF6F615B1210AA7CBE69572B3467B643BC5F5EC3F9AD15B3AD918993355E209ACBD0F1393076DA3B0950803295B6571E476ACAA04D48A4627367CB7FAA83796C4178CA9071DCCB8D3EA70381B61F0C56D515E0A765E266DACB13056317AD8737A1AD541AACCEA1641946E331229F19BB54C20BD51E63D63BFFA13110A552FD0A95AB984EF53BD639EFA0568C6875B2798E3A0578C940C0C4197D3587BCB1CC45A99F5D37B1612DC1A4178A3E288FBD79DDACD049159D6A5416F9EF3F38C74449BFB2E6A894566C5C17B4555E154F29A93241463690 +pk = BAD97EE9163009F504014511289C806438481FD6A89A317F3762119359D1939ED02E2267E78B9150CB1AABB55694313331FFA6BDE5C2817688671E9F68644E766304E95AEB3BB9F3C50F5A7357479EAD1C20D1A7187B6F338156ED0D3D76E13F0D +sk = BAD97EE9163009F504014511289C806438481FD6A89A317F3762119359D1939ED02E2267E78B9150CB1AABB55694313331FFA6BDE5C2817688671E9F68644E766304E95AEB3BB9F3C50F5A7357479EAD1C20D1A7187B6F338156ED0D3D76E13F0D5BD5C2D88A0BCD4C261A8C5E9137B336655B27C591335A526708000000000000000000000000000000000000000000001CD4DAC1D3D2807898DF68903E0145365B09F223EB3669CF4BFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4FBF9DC4C588FB08B017CCA9809EE123FDEDBCBBA5393917BCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009BF2B1A45C1C970206CCA03A13E9D63B860C42FF375D4E0B6C0A447426BB83968F1ACDD1148E78F2D5144F6272AAA7003C56A482B5A8B1583B281A3FB321E7066F564E6DA8C9CFAD8FB6BFEBC3E45AD6B797E6A273D46D09103DAFCB5719260087CF8137184302E48A7E506637FA690F58C359F1F647794B8CB88F67D9CE806DC36C1DE3A072EB770E40BDBC96EACE0049706ACD5395F7017C7EB7CE8D5145FC58FDAD886E169A1888B2C12C6FF1D8CC4CDE5D0612E98D64F91966579CBCC300 +smlen = 3326 +sm = CC682D346464318C725D0A939DCB148DAAFD8A42A35B19B17950C849D274A83B6D46D658788714B946BBE1473EC60E3EFCB9A97D0FFED0F7E7885AEB5C7AA39041F8BFB9019E3F01F0776A18ADE9D4E2CFB9BDACB4458ECE41642645227CF11A0000637254FAF5B50870C02A891ECC408FF204D0275788CCE54E0111811B988434DAE8EADDD3B56E9055F94253DDD9769C5E30018132A9F6E5F984C3085BCDAE4076A1D594AFEB1F002FC44D003E2BAE479694477178AADEF16A2863F0EA09FD632849196003DA14FDBFBDEB0F7C686C1A16E3DDDA41B1804888EAFB0300040202C7C4451DA90503C43FDED1CCB3DEE468A6A8D9E56670CD8F6A58E7941F1BC5EFA6E2AFDC0141A2F7E8F781D79E70B4813263A9DBC8D8A67F89371CFBD90977EC96461B28BEE4C644F2C91E96257B1909B84ECB25CF438A3FD6B835E20D5CDA56A1FB7995FCAA0EE1B5327FB1288E3C57CBEF0554CA5AD6FCD1F1865C6AEC6CBDB24495700AB5AAF078D8516CA4FA3A231A97C77BD150B127CDBFB42C03702C9027B2A5F6594B022EF55B63BF3EEC27EB0E9529ECCDC82BC6AD1F011F167D602EF1F175DA5DB4028BF08A053AF2C728ADE93B37EDC2A75B7B6C6CF38CD1C07F359C73B131B13DF76139DEE6795F1D85B47F29AE97D0E40CF5DBB67360044F78940A1E80D9D99FD5AB0185210D8769911BC471650DF0FCB9C3AF038F7882F677790E146E612FCDD6FB89F90B7E5E46CD648F4BF8F736D69F8A91E4806346B4366FD48D1481C0B47ADD82003310B0A99B779D63EDE1771F50221651B2D8AF40F48B92EE1327C85A1D2EF2D86378076BEB58556FCAEC6029649A0EA5FDE517A85D87704210E071FCB6F63317AEAC3EB3E9746018E1028C50C790A45B1BEDA6EEA2D646DCE401AD5D7850A5F69CD85301920DE77AB0D01B1361EFA3E70AC05881BC02190720ACC75A691D6064F9D24C79DC72476309E58CDDF5FB2A253D857A79C8E898AB6ADC300EAAF208820CB02F5F2CD317F4052D40DE28E52C55A0349DD855D64E8DA8296D4F572281E221A3D27EF76FEE67FBE5484E6460C99950763B801FCE828E93D2A633A1CA5D7EC582D7C463DA5A9AA8056BB2173306F3820BD0A3273742789B61AF89CCC42B81CC68745800D2A59231D5D28E832F443A871DE5B6B10B58A8AA7CC9816014D7F3545DDF1F481B7F0C9DD41B4D96E5DB767B74776C2253FA230DF65F3E0B944B95ECD4138E2847418B084D9F9E0798CB5247238EC12B88C10A5C0C645E1D09D09059C72E33C28A472FDD8B88EAA93C63BE7D980A12195C2EC3105DF2BB81CC9C3009F7771B6B813CD12303E3A9961D6731AF55ECFE5127BAC68D06F835DD5F2D584FC0E648C3A4256E2A3D4B81966010964657F33D1FE0400724C488D5AACF9F2C0B802CD812C8452E5B8E2B17FF4A1289D33FC405F5DB4ECAB4A73FCA3634756DFBF9012C413B6F64788FD0F68F8AB7620477ACD3C14009377F3DD54B9EAF2784433D63341323F54D113FD63D7456AFEF885F13C13172A37A5DC82336B9515F8F7F4903EF6DBE9CB34930743B6ED11265CF94AAF406DEA9802D17BCB369AD0D9964792F74D338DAFE47EE88B3B74EBA8E70774EDC1F16FA876FD62B0BFF880CE252EE4435B1DEBF36F0A06A4FB406F01D618C135E6103E2A39F4C9CF41EC93702BA76BA753AB49B5836C20F67D05943EDDDF47AB8C5B81F4BC22D773305076F7E5B697A7B25B016190072F756F19F397884E0521595326CA591672684A3BE17C9F5CC8E8F4848F7136762178FBDCC7BC6A6C6A31345FEE687B0505F72BF1AB7EB87BFE5F896CFD42DD67A239C70648B39BC0C84DA33CA17838FB4213C38B68F22914FEC3DC50194E883720719E9B5F8D037DEBB726DBD899ABD97853C54B0BC347A322BFAF961C6CD6209C98AA81B8E2595FC151B1375BF4FCA2DFF49DF40A3D1C694EDFF6E9687E73EF62DD42AD7A05195A7F206F097196AA0E4D68F8132D4A00CEDED940C4F6AE02E6D3763073462C7A4BB11778290E744471EC554A05917E52C5263FF02C07BEE055234EEE10B79175DC164AB2051B03598DF1D4311E87ACF4AEC45C55B1A58B0F05EBDABE248A27C0187643CB8F9529D31FE0AC4A28D780196DA00DACFF5F2DD64FB04E7C159DBBCDD3343BCB7AE188DE15D923D2AC0AF232C5389DC9C949FCE554F7A0425D4F9B28DF2EE4B81740C2B5A5B93F0F7AB75EBD360CBC78B11C28608B5BAFC970CF3D4455A20A198392D876EDCF89E2639B50CD84AE21BD50FB077050EBFFB210BE711D8EA807CA66493650E909911FD3CAD99AB94B2AB2EDFF192D9D75257818272E147A9C54E06C53210FC091BF4175F2F44423669716FD9A6C4F96A0C4BE17839769A806453E55D7357FBFB3D7A458E70957D524C0E896398E135BFA68A0CC136FB93EE7D30AD463E32E152FC32CB8E7F0B05A30EB13C0DF98BC187EC0A54856D2EFCDA10A82B89DC8CD21C67D9B6DF3D7005EF3B2BC9DCD5D55B64DB40B74FD322CDF9D9911A00B5A02E1AD5CA9BF65D90DB709FC1E5FC84BE97574B09C83B49963A51228A667BBD84BFD8E0D90EC161FE5CA73BCB8D95FD7AFD982AB7EBAB51BD2B24CD6D356EB850D2C65593313D8EBB97E7DFA450AE982918582F86A356F538EB05AFD460566D79F040D36C93D3C645B636560007D51B121DE3FAFB3ED70B475AFF9617DA4B52937C628678B109C3B76BC15BD02B766A394893D8EC966DFD8033D12A8D98AC5BE201134325E32CB6786F4FAECD7DCD05AEF5F3739122B817824A672E71DEB312CB7DD6A77116B30715076384297B1962EFDFEE6D6D2B2ED2EA4DD802F4784872D825DB828557D4D927B7232682AD91CEC3E508854F529853A8797B7BF7BFF8E3C180980DDF4081E96A12A495ACDE0C73282AC78617C68A55A94573E5A37B859858D1E19ADC82821B316B9D346ECFC6DBFFB3779F692A62D20D1BC4E730FDE2AEE826E76638ADE3DFAA11057B0BC8A80E8905B15E41D9A4105109F18E7E1362149AE9C568D1D642D65B94253BE2B13E7230F8BCF34DC87241D1DE72A65BBA111C111CBF5BD618CD02E0A06E37F60B3736631073A6BE004C1AD5F0091A82C87B276F7C5AAF6938C886A6039DF23482E2064F6AF05636B4C6BA6B24A29AAF2174AF4BD959177203AE9B160F81CA6764948AFCDACF6BEC0B987C6DBE178DCF47C137C64809483019C5F2072D0301C19C500C60B5CA913C24A8F28F50E1578D806FF9F9B810CA14BF5F2268FA18DEC67D973EB1D975AAF871ABC980D06222493D900CEBD8811FA20D5DB8F8036430F8BD7F9554F7CB47F9EBF389F66C3CCF9F42DB57AFFEE074FFEE4EB3E11612FD8A8FE02CC4E9D2F8BB36C505CECE9DC87512AEB5D8EBE33328C5217CCAF2E1AF1E38BFA84C0035DECD8D8C250FB4D964E8F0AE448AAB740D9EE9D794390686FE9A95183F0D5166D479C51014F1F29D8FEC616E1A4E7A9C86E2AF790BC7BD7BB6F746A2266332E04AFFBE6B9512E6620681C3317DC846E4FD7974E8AE87E370ECF9DFED574E339CD7E8A663ECD1A7BF5842391913D98686F7F2145BBC420F2F58B89131D5F3BE41C85752E13504BCC549A8F690CD2B0E1E29E4DFA3CC76BD398BBF28F33A00C3915DD719F7CB985E9A0A7CC8190BFFC8BF47310C71418D7A6C629C491EB8E455148BD4438BA6B7014608B0CE6A1BC5B035BC174C9BFFD966D8305FE9E5619BCA3FE4B39E6732DC652531819AC828F86EA11360678E786EAA741382D713AE26A608D582A3E4583D45744ACEDD32670B5AD4A1310301B28A174DC9858A55F0C1B7486CD66CB0635083B0C63016E40DFC533AB80C9CFAF1378D00769DCBAD56B09DA3A4E6CDBFD8F3FCB951680020DCA58647665462E42F42DC14E7B20F262D3CEB0B1A2BA807B98D66232AD7D3839C298564BC36A134CC2447B1B9FE69271960459C0A6F897C1878140690DA7D41FD8AAA05A679FDC3037EB2885AD3C82374F4BB991745351292DFD8E54F565E0093776B7EA65DDCD500BEB4D15AF6029F2630A0062F2D4FB331B47B6A5E139D385016E1FA490EAA209636B1383B7D7DC1148F07ED2CC2C03FA7FEE09305F34C57B3CE899C18462B4F1EF88C1AC5259440AAB48C5849652AAD9D3CF3D31F36C7F64F918868182D36345BA5BB7A4EE088D8B081EB78FE977F5A5295177AA427215BB26D1DE33AD4B2D610A47F8C672EEDA703A04D0FAE4C5961F13AD6FCA81863D8A394135565D8B27904A511FD0621A532F84A47CCF4FCC2114D4C369B7A76822959F8CAA25A6495081CA9EC3AC3348A981618592C090B6439CDA2FBC932C8697B3709323E3388AF8EFA1B9CDBD65A65C8F0C302330DDBD10E0235F8030562452EDE447EE5A5A9A636AF6F615B1210AA7CBE69572B3467B643BC5F5EC3F9AD15B3AD918993355E209ACBD0F1393076DA3B0950803295B6571E476ACAA04D48A4627367CB7FAA83796C4178CA9071DCCB8D3EA70381B61F0C56D515E0A765E266DACB13056317AD8737A1AD541AACCEA1641946E331229F19BB54C20BD51E63D63BFFA13110A552FD0A95AB984EF53BD639EFA0568C6875B2798E3A0578C940C0C4197D3587BCB1CC45A99F5D37B1612DC1A4178A3E288FBD79DDACD049159D6A5416F9EF3F38C74449BFB2E6A894566C5C17B4555E154F29A93241463690 + +count = 94 +seed = CEECCCD3F7BB922650E3F6E8F20C47AF17C1C1053EA8FE08226F167D67C3B0781BD774C4C7AAD23C6AB0B9F3E3F96F97 +mlen = 3135 +msg = E13692E3CC06EBE8FF9A292D890F0A34DFE9A4F968F196B475AC4DF553A30E2FD5DF008DF4D7508302AAF6389B6A5A9135E9BC8A5ACCD2BD2DF98FF662B763101D31E24E8F182FA50840BE27F76BA5ED645BB4D3F7F2F6CE25179A47FD7B6441A9B3A28783CEEDB425B2912734A75D7D03811172188253BD8F0F52EAEE84A9FB025F95EA1B566C53297A6A090F7FD8B21639523E073ADAA750D63DA61631F933FEDFFB2819E0EB3074E9E11E10B102AC88E2C8D6CF408FD241AD301F9B8E18A88B74CB4B0DAC76347635DFBB3EECFDF84229BABCC003C6E4EFB7394E25667DD7FA47D36E027559F53E98789E6E732E6AA23A71607677FB975C2852367C5BA5E3D10B3017AD26F9A38CE803929D08A43646FFBC3980B359D8BC2E9615636D4E5DE8DE6FB2465A983EB1696E98DD33FAEB7AF8C2D30506B22390D7F9FC21C7A016FDF22D21ED2EA4175FE9F5F44598EC26452700DC9A495675431E1236865F2F4AA5BC9C9A10EEE9E29B1FC4FEFCF8F24BF94342FC7E19AA6534C3B771D910AA419EA2BF70E2C1915891CC630A3397551E4F34BD2192B70EB210EA67CF152A35A3F5D0878E153579B42AFAFE5068B2BE2B48127FFB54553B7A9B6F845E7D72C43938AE42BC03E33B836AB212909510AAE7DBE8EE6D0EB8AD84D60832F3151273A1E09C514C3AA4CACD15564643F4255F36059022B91BA4137ECD97B34BE3308D40EF06BCF4F45EC625B54C7347F52A21815508199C8B7A6212779CD171894DA9FC3DE2A6EF5D76BFE03B8199ED1DC92B2A403E4DA009CBC0FB597C5952BE32579EB8E781EB12D935848C051029C528CBB68CBC1DE0102B42561E21F48E72E028C2CD8816A9027914571B49D2F94C9189E1A7F18D7D3D0A09B3A36EDB8A084ACE5FCCC77E3E42EDA0FBAB8C81EAF170103CA757981839C9448362BCAAAA3F20C8DC653AEF36953559F3597E1915F02A8D33D0E46201FC794EE055E6D9955B91FC7ABA1F136C280367404725CB355FC2F129413581401F98236D2A6F8BED7FDD7EA99060DABE3F0E8CE20B0E98EA80994D1673E8CCC6A0BA4A9D544F3D31BD95C9D3847527A978C1F155EFD84B6A7BECFB749628CE82E80285FC7272EA05F953404E437AD557F38FD9BBF77A69B81E4441605B23F2AAEDB00C7519D8E9CB4CAE5F8C3FA74FAABF6C12595BA045F647ABA7168C65C8A6006733D1341435495C7088C3361B50C43787EC24C24F57323466B5C088E8097B44666453010DA38AD65B426E72140AF78A5448B2F93DF3820F013FB9DCAC49604C86F2B2E4EA565463917285F148E8BFA9E11943AD3B86B14ED59A190CAE097DB26DAF8FD2A642676A37DD90C23B52C82CE028B80A805D9BA05457F7B6CBAECBA4094822E16C14D6E2291B731D581B12FB16802653360AAA6A7989D61C80DEBFCCE81A36D9ECC84039C4F086A5579D36FF5D0CBE61292E4FC3D14277AF380A9C1DBF36C2D61F59CFC0D62524E042710BFF5BA719E56BA367FFE849D660B9F7F3B638E113BF2E1A4DB1B8F65A0FD680BB2A168A4FD5B4E0EDF3208AD47F1FF4AFBAA726E38763CB5C84C03DA3D1E32CBA873B9A0C750922CD3D0A10A4877EAFEF602F5C875FBF0EE2F4F0AF7F308EF934F7E8E74FDA62A860BB594FD061D1B2BB32BA613339042FD90E749ACEF450D204072ACF58B18C365E4F4B815F1E837453C4255D53BB68D50F3677E7173FCC23D2B592149A9F3DD615868AF91F705387547862D34553FD45B8DF643F596DFDB7ABA47BD5D91445826C86FD4D30365A2F9A3CC0913DE19707D072F27A09EAB906304008875B5BE3526210D6B8BC8663975A1F78EAB9CD7F7305CDD4C00D6277622E50606E1CADD639730101D088BC2BAB295AD86BA8E26F5EBCB3E9C7C543E533A7B3C20F0F89001775F714825DC8547BAB06F5B99C5305EF18372A184569323FE269D45B669B9A222C9DEFBB0B2C84F42A57EF343A5C12F5712EEC33985DF8F0C566D471A9403FC103A3EEED42829D8E3E5C517BDE29447841CE96C8AC587DF3E4B6227FAB386140DB0112ED0D2846355C4A45E94F3A0718CEEC13FD3CAAEEFDF0B7F89F502AACF8C9D96D01B5549157B7DF2BE65BC30C889E69971700286C561DF91C8CB923001E5F0E21D2C7A3DFE8D1AF07FECE1EDA20C031B29A4389F265D2C7BE64EC37B2884849EF30FC8A82D2F766ACE68C72F0A4B72F3B50884749814387893DB2370A3410F794C64CD24BF0D13E44AD500BA9816F9BAED72F7593F758592C2E974D1207A664B869130BAA1FA71DBC55875134E7CFA276E36568F79483886099A1070C14C6E4EB87523E04C0154A2250624261211723453CFAD185298DE06D08CC25FA18BC58B34ECDF5D9DBB02541BAB4A2AF110AE09130E12439F1CECC34F9AB5D7BE36C827A6F2F6708B543D4AD2E424805E2A74895742B0A5DA30CABE4AB45F40CBFCCBEEBDAB9B8EB8F78781168B5BC79E04EFFE1757AB0547B9BD0D2625673CE528D2B4874D46DF0E09C24FC413EF9AB4C3D2E803C1E316D77FF5DE3368BB925B2B1F6FFC340525663931F5595C8AAAF9FB0DCCDFA4793519A66D4FDE38BD2044C60FD1DE15D60BA878FDA570E7AEF6DB69D2527A1F1481A9D05FF2F6F621238939ACF5D2C37B2BC3A194A9E65E7441764A5EE37B1FEF3B8C9C425BE1B5FF0D05BCB6A3B91876EC04ED89A31749FD443C2B85F8F388E7070D77DEE37E2B666628CC9A961236DD24AF2769C1F613B4E77F8E82D1F410ED59F63F1DF19BC53A448106DE4F8EFB8CC37E40144B0F658A4135E25A3CF36D8692DEF2677E4BEA3A9770F19E44D55080625421D5BADEBEF3B39BE71C08650B5718A9B2FCEFC4BECB26C4B63C43F6557DD66517D103907F82F9C2B965B7C5E36059D2159183F5ACB8B5FF5E6B92E94D53AB25AE955424E80EDEC4650BE293E836DA6148392C500FF4B7672932E90E068569B81AE335B2E5013CCC95F571948D58127EB1269A08D6E897D2D9B60F3E49847C05D0B3AC230A67EB6D38FFDBD4B8D82D7B9EC803429C701F080BE86FAA165C0111131712DB4957FD84A8936AB55558C69D33D5890CADD08D7F0D4962CF9E2F69C7517E79DB14B76E6E188F5ED95169A2A7E4C0EBC2175EC2DD44ABCF239CEB3E22F955ED25DA41768CA5FD9A9AE15FAAAFEB431958A679249AB8BF879185E8FBF9986B96A92972153B4CD0D1BE001E5AFAE3AD1F0B1191F1483738E728D4AD240538E5EF7BC9BA4D5903929D74CB64241306FDBAAAE17B1C3134AED2CC394D3EF9653CC62A29C4B0B9BE04E95E072EC98F7A80A7B575DED4A1993AA884C1EDFFE056EC475D934B4EB0EBF418975728C6E9CB3919B2B67D2C71228A4DF1FE2C8388E3A2BDD75549417FE795F1947F857B1C0C9CA021515FD4D79E691493B988080943C394BF29E4190082A94F224AFDE5853323EA51C06B41547EEC0DA5CC202A048D77C7B91E794C51E72B02EA7C14578C11D9DF48E099465783E496029EBB6D42D9CAA52902A4694355DB01DD7F5D7C113AE06E3F712FA577E937CD4FB817659F93964E194FE7D509A81C258C69C3415A8F11D35B414339FD1CC1D4F50665D9111592D1C3A3D69FCF6A971C285A94F5FFBFE8D2FD2746DCEB3B218D970D670D10135126E479D92000D41EABDEEA4C04D1748A4908DD39C60A52AA5FE29C8ACED50DC1295B5C2C4A98E3C62EE4F370F4D3E500FE27B66F65BAE604FD558D66B7F09CE36C36C8B5B4FED193EF56D1D8DF0FE6FE0031466A1C633203966FE83D6BFF843657DC0AF176AA8D5CB7312CB4E072BCFF24D5F3828E29B2037E8D1FB63537C70C27011E9A97E3F04895F4E84AC69C55D450B46D5792A5D790557BE64F765FA243AFA98527B976783E7ACDF76A7E1DCBDA72431FC30D7B05197478D8D74077626FF7409F95B24A1F1BB6B803B9F1B9AD5B06883FAE6C4B587C309A63F3B2FC9619032157B98C1DA9608107E87F4FEE0DAE995AB86AC9869446CDE92441F0B9F8240E6F7F7AA9189D92B7FAA3280FA749BA8C7729F8974049C5CBCB8C6650CF1C16B8194C7AE1A82B40B8B04488FCC69E674362FE4821D4C1846CD9BC49234BCC464013F5F9A082FB83D63098C331D4B1C9129F52259CCAF4A9237F8EC5BCCF06F230C08DDAF1D0C21C5930F55D3D5F60CBFC447E7FCBC75CD199733F8D17BD043B67B0C138CB0C9C8F2E477728F27DEE573796F71B013689B537AEAD4991E67F2F5EB94BFAD9509D7C235C9E55F68F26B9CE8AA90834D170F8B700A40AE9A817D5D17B1644D25BCF1172A5CF0C755A6EC04FAFC39DB06AAA05F5988E187B9E110EEDEA9C84B99AD29A4B31950F2C870A1F91DAA6A5817FAEAE516FA42660FCF56000F7365D8C6CC11D4784C6FC02E4D0C727806E9D43B957BBA124C980C31F81FACC6D46F6C38D227EEF8F0 +pk = D0A480C6512B3B1F118919AA96971CF8D08A44632B2F5D52D0A76F85AF82F045319C1C74B69E635C7EA334721D1EEE15F27D30FCDF9031366740C9F6C874DA78745D6E3AFC5E84B5B2EC3A8DF2D9DAA716705DC78F30357BDF5EB867DD96001716 +sk = D0A480C6512B3B1F118919AA96971CF8D08A44632B2F5D52D0A76F85AF82F045319C1C74B69E635C7EA334721D1EEE15F27D30FCDF9031366740C9F6C874DA78745D6E3AFC5E84B5B2EC3A8DF2D9DAA716705DC78F30357BDF5EB867DD96001716C300852B3D5BAD598C82381B3912A86A59B43C847E83795F2906000000000000000000000000000000000000000000002EF07F7AAC911B401897765B4759D52B352FF000202C191BFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED4BE49ABE4B1FD9BA792E2D8FD04A7453B8A34A67D35BA631FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081FC1095E2C3CAF7BD2586574033922E328B177049299278A188C74EAFA20CF98DB9A92DFF11440A2C690CE72237DB00CA855869EECD26BA95F6523DCE248E5808C6A68A9638D0906C59124AF183FD0F79385EFBBCCF81CA1B0E8CD3BFF47E00E341F3D58B47A6DF69A886F228D827A98DEA49A2665B6494AF2CDDB33F87616E701DF5BC6620EF20B9F993798F82BB00096BFC544D5BD910D3A83D8EC085A0761D63BF63B957CBA3E3391842F57AA5877A891FC22875E13BE5D666C48A88E400 +smlen = 3359 +sm = 718A8EB3CDF536B02788FD7798980E4DFFF7CAC151697102EF42C7BFCD3FB788FF0B21FB4C025EF5AD95B37EBE4CCF08CDB02CEE7D377C58F927BFC521254DFBB6204D440A1F180D22E83C460D72F14E95EBCB829360D272652DF694FFE8BD0E0100C98EC261D94AD6F7E2528CE25A96C68E92D6D0BE2EE9B577006FA011F123C71F0F9DBC1934A62E2E259067C47CC419901101E22184F5D5F8D66AD6952FAEC10BE269B095BC3E6F11A0BC00ED50A44966497429467B8764CE62421F71844A3C30EB43B100A549FBF749A735C1ABC92905B0235DCBBF035EE1D7137E00020AE13692E3CC06EBE8FF9A292D890F0A34DFE9A4F968F196B475AC4DF553A30E2FD5DF008DF4D7508302AAF6389B6A5A9135E9BC8A5ACCD2BD2DF98FF662B763101D31E24E8F182FA50840BE27F76BA5ED645BB4D3F7F2F6CE25179A47FD7B6441A9B3A28783CEEDB425B2912734A75D7D03811172188253BD8F0F52EAEE84A9FB025F95EA1B566C53297A6A090F7FD8B21639523E073ADAA750D63DA61631F933FEDFFB2819E0EB3074E9E11E10B102AC88E2C8D6CF408FD241AD301F9B8E18A88B74CB4B0DAC76347635DFBB3EECFDF84229BABCC003C6E4EFB7394E25667DD7FA47D36E027559F53E98789E6E732E6AA23A71607677FB975C2852367C5BA5E3D10B3017AD26F9A38CE803929D08A43646FFBC3980B359D8BC2E9615636D4E5DE8DE6FB2465A983EB1696E98DD33FAEB7AF8C2D30506B22390D7F9FC21C7A016FDF22D21ED2EA4175FE9F5F44598EC26452700DC9A495675431E1236865F2F4AA5BC9C9A10EEE9E29B1FC4FEFCF8F24BF94342FC7E19AA6534C3B771D910AA419EA2BF70E2C1915891CC630A3397551E4F34BD2192B70EB210EA67CF152A35A3F5D0878E153579B42AFAFE5068B2BE2B48127FFB54553B7A9B6F845E7D72C43938AE42BC03E33B836AB212909510AAE7DBE8EE6D0EB8AD84D60832F3151273A1E09C514C3AA4CACD15564643F4255F36059022B91BA4137ECD97B34BE3308D40EF06BCF4F45EC625B54C7347F52A21815508199C8B7A6212779CD171894DA9FC3DE2A6EF5D76BFE03B8199ED1DC92B2A403E4DA009CBC0FB597C5952BE32579EB8E781EB12D935848C051029C528CBB68CBC1DE0102B42561E21F48E72E028C2CD8816A9027914571B49D2F94C9189E1A7F18D7D3D0A09B3A36EDB8A084ACE5FCCC77E3E42EDA0FBAB8C81EAF170103CA757981839C9448362BCAAAA3F20C8DC653AEF36953559F3597E1915F02A8D33D0E46201FC794EE055E6D9955B91FC7ABA1F136C280367404725CB355FC2F129413581401F98236D2A6F8BED7FDD7EA99060DABE3F0E8CE20B0E98EA80994D1673E8CCC6A0BA4A9D544F3D31BD95C9D3847527A978C1F155EFD84B6A7BECFB749628CE82E80285FC7272EA05F953404E437AD557F38FD9BBF77A69B81E4441605B23F2AAEDB00C7519D8E9CB4CAE5F8C3FA74FAABF6C12595BA045F647ABA7168C65C8A6006733D1341435495C7088C3361B50C43787EC24C24F57323466B5C088E8097B44666453010DA38AD65B426E72140AF78A5448B2F93DF3820F013FB9DCAC49604C86F2B2E4EA565463917285F148E8BFA9E11943AD3B86B14ED59A190CAE097DB26DAF8FD2A642676A37DD90C23B52C82CE028B80A805D9BA05457F7B6CBAECBA4094822E16C14D6E2291B731D581B12FB16802653360AAA6A7989D61C80DEBFCCE81A36D9ECC84039C4F086A5579D36FF5D0CBE61292E4FC3D14277AF380A9C1DBF36C2D61F59CFC0D62524E042710BFF5BA719E56BA367FFE849D660B9F7F3B638E113BF2E1A4DB1B8F65A0FD680BB2A168A4FD5B4E0EDF3208AD47F1FF4AFBAA726E38763CB5C84C03DA3D1E32CBA873B9A0C750922CD3D0A10A4877EAFEF602F5C875FBF0EE2F4F0AF7F308EF934F7E8E74FDA62A860BB594FD061D1B2BB32BA613339042FD90E749ACEF450D204072ACF58B18C365E4F4B815F1E837453C4255D53BB68D50F3677E7173FCC23D2B592149A9F3DD615868AF91F705387547862D34553FD45B8DF643F596DFDB7ABA47BD5D91445826C86FD4D30365A2F9A3CC0913DE19707D072F27A09EAB906304008875B5BE3526210D6B8BC8663975A1F78EAB9CD7F7305CDD4C00D6277622E50606E1CADD639730101D088BC2BAB295AD86BA8E26F5EBCB3E9C7C543E533A7B3C20F0F89001775F714825DC8547BAB06F5B99C5305EF18372A184569323FE269D45B669B9A222C9DEFBB0B2C84F42A57EF343A5C12F5712EEC33985DF8F0C566D471A9403FC103A3EEED42829D8E3E5C517BDE29447841CE96C8AC587DF3E4B6227FAB386140DB0112ED0D2846355C4A45E94F3A0718CEEC13FD3CAAEEFDF0B7F89F502AACF8C9D96D01B5549157B7DF2BE65BC30C889E69971700286C561DF91C8CB923001E5F0E21D2C7A3DFE8D1AF07FECE1EDA20C031B29A4389F265D2C7BE64EC37B2884849EF30FC8A82D2F766ACE68C72F0A4B72F3B50884749814387893DB2370A3410F794C64CD24BF0D13E44AD500BA9816F9BAED72F7593F758592C2E974D1207A664B869130BAA1FA71DBC55875134E7CFA276E36568F79483886099A1070C14C6E4EB87523E04C0154A2250624261211723453CFAD185298DE06D08CC25FA18BC58B34ECDF5D9DBB02541BAB4A2AF110AE09130E12439F1CECC34F9AB5D7BE36C827A6F2F6708B543D4AD2E424805E2A74895742B0A5DA30CABE4AB45F40CBFCCBEEBDAB9B8EB8F78781168B5BC79E04EFFE1757AB0547B9BD0D2625673CE528D2B4874D46DF0E09C24FC413EF9AB4C3D2E803C1E316D77FF5DE3368BB925B2B1F6FFC340525663931F5595C8AAAF9FB0DCCDFA4793519A66D4FDE38BD2044C60FD1DE15D60BA878FDA570E7AEF6DB69D2527A1F1481A9D05FF2F6F621238939ACF5D2C37B2BC3A194A9E65E7441764A5EE37B1FEF3B8C9C425BE1B5FF0D05BCB6A3B91876EC04ED89A31749FD443C2B85F8F388E7070D77DEE37E2B666628CC9A961236DD24AF2769C1F613B4E77F8E82D1F410ED59F63F1DF19BC53A448106DE4F8EFB8CC37E40144B0F658A4135E25A3CF36D8692DEF2677E4BEA3A9770F19E44D55080625421D5BADEBEF3B39BE71C08650B5718A9B2FCEFC4BECB26C4B63C43F6557DD66517D103907F82F9C2B965B7C5E36059D2159183F5ACB8B5FF5E6B92E94D53AB25AE955424E80EDEC4650BE293E836DA6148392C500FF4B7672932E90E068569B81AE335B2E5013CCC95F571948D58127EB1269A08D6E897D2D9B60F3E49847C05D0B3AC230A67EB6D38FFDBD4B8D82D7B9EC803429C701F080BE86FAA165C0111131712DB4957FD84A8936AB55558C69D33D5890CADD08D7F0D4962CF9E2F69C7517E79DB14B76E6E188F5ED95169A2A7E4C0EBC2175EC2DD44ABCF239CEB3E22F955ED25DA41768CA5FD9A9AE15FAAAFEB431958A679249AB8BF879185E8FBF9986B96A92972153B4CD0D1BE001E5AFAE3AD1F0B1191F1483738E728D4AD240538E5EF7BC9BA4D5903929D74CB64241306FDBAAAE17B1C3134AED2CC394D3EF9653CC62A29C4B0B9BE04E95E072EC98F7A80A7B575DED4A1993AA884C1EDFFE056EC475D934B4EB0EBF418975728C6E9CB3919B2B67D2C71228A4DF1FE2C8388E3A2BDD75549417FE795F1947F857B1C0C9CA021515FD4D79E691493B988080943C394BF29E4190082A94F224AFDE5853323EA51C06B41547EEC0DA5CC202A048D77C7B91E794C51E72B02EA7C14578C11D9DF48E099465783E496029EBB6D42D9CAA52902A4694355DB01DD7F5D7C113AE06E3F712FA577E937CD4FB817659F93964E194FE7D509A81C258C69C3415A8F11D35B414339FD1CC1D4F50665D9111592D1C3A3D69FCF6A971C285A94F5FFBFE8D2FD2746DCEB3B218D970D670D10135126E479D92000D41EABDEEA4C04D1748A4908DD39C60A52AA5FE29C8ACED50DC1295B5C2C4A98E3C62EE4F370F4D3E500FE27B66F65BAE604FD558D66B7F09CE36C36C8B5B4FED193EF56D1D8DF0FE6FE0031466A1C633203966FE83D6BFF843657DC0AF176AA8D5CB7312CB4E072BCFF24D5F3828E29B2037E8D1FB63537C70C27011E9A97E3F04895F4E84AC69C55D450B46D5792A5D790557BE64F765FA243AFA98527B976783E7ACDF76A7E1DCBDA72431FC30D7B05197478D8D74077626FF7409F95B24A1F1BB6B803B9F1B9AD5B06883FAE6C4B587C309A63F3B2FC9619032157B98C1DA9608107E87F4FEE0DAE995AB86AC9869446CDE92441F0B9F8240E6F7F7AA9189D92B7FAA3280FA749BA8C7729F8974049C5CBCB8C6650CF1C16B8194C7AE1A82B40B8B04488FCC69E674362FE4821D4C1846CD9BC49234BCC464013F5F9A082FB83D63098C331D4B1C9129F52259CCAF4A9237F8EC5BCCF06F230C08DDAF1D0C21C5930F55D3D5F60CBFC447E7FCBC75CD199733F8D17BD043B67B0C138CB0C9C8F2E477728F27DEE573796F71B013689B537AEAD4991E67F2F5EB94BFAD9509D7C235C9E55F68F26B9CE8AA90834D170F8B700A40AE9A817D5D17B1644D25BCF1172A5CF0C755A6EC04FAFC39DB06AAA05F5988E187B9E110EEDEA9C84B99AD29A4B31950F2C870A1F91DAA6A5817FAEAE516FA42660FCF56000F7365D8C6CC11D4784C6FC02E4D0C727806E9D43B957BBA124C980C31F81FACC6D46F6C38D227EEF8F0 + +count = 95 +seed = 2489C04BA57D149A60F446670C13C29998B52F3BAD548A751D7134B694DB25ABFA034FB4BA45E105AE27D575CBD02B99 +mlen = 3168 +msg = 1F7AB96E8C14D1A5094672D7034FA8F81703A2CC18983C972CC66736CD98B031AC8A479CED21A1F634938DF85F3E83161646DB81B9AC3EA22F80980B8E2EBA4E9975714E5A98985817F426C41F3968349686B69AF917564A2648401B8FA127FC3200DC16A9E663D1D345EA83131E21229DD39E70D7270DE7577A7E9635602FD2C30EFAF204A9234F0A73D21375658B0B0B04927E67F3F5534614EDF5137BADFED914A49AA301000092DA93B3FA4A0FF592CC3A53F4A75B54FEE775EFA421EEFCD6E0D32FB5CDC096886076DA940B26C6E07F12F6E08FA7B3E2DC42055308E5607A2732717AE592A6909C6E084252A5B08685FE8C6C1DA387B0AA9800B67CDB3EE2FB21B9BE5E6B79AB545563068441C0C9C1E68CEF6028A5CEDF27D3CA47D95094C9E1E68B8449758BE3FF8FDE148ABC420295DC76E3EBA8E11433217FDC3136551A5A41C1C7E7D6EF43601946897FDA54842D8F73FAA7EB7ED0DE544FEF2A95C6FECB13C8C0F14B5B22493F54374184B73D5BD47383BBC5DD7BC1BEAC0CB8E66D2F413A9DCEB7E1D0EE2D63B9EB28DB232C33A95B792AE67D2591F5AF59DDC45771A0E7195C4D25E7F4079359597678B0C0A87DF3D66A686A9215DD566D4722C212AD05A23E1377E37E18A6AB3AB8BF5CD47BF1BAF06EB05E4C150CA67D7E52BD297A08CFC97B575752E686B83575F425F3A450BB0F596A60E41F7183F463007FD019EE255BDEF1D98B7A0A12EC33B3E2BC9BF0CC8F4860DEBCFBBD5E40B2ADC2CD10EC35A341BE7A49F8D204FDAE86921B7DE5BA700A61E2B041A8EA7040ACEE844892E5CF025FFEC5322FF6D765BFF1107C967A12ECCB0489F64F8C13BD7057DF76485446641AA7A560C7E73008C46572628E1A225A8D3F6D68DDC9759A952FC07CD43DE4434BD3391089E900275E9EBC92563AC1403BB7DFDD182092130E3E6AEB7B666F4BA66C38BBE1F726F40A07DF6C42079A6054399519E26D765CA065F4DDFD27A29CBA292699CD826FA9D3E7EE31B0D76813879DB5EC5C7F454095DC3BD27323DABD2DFF949AC760D6137334507816330FA67D886021661ADC69AEBD882A07E01B4B6E5492399ECDEA99222EE785C810B30409DFAF2A3CE5A05D699C2368249C9588D86FEAA778B4860D6DD442088A21D2D9D0B49B15EC579776812AF8AD582F1C44BB6432D7472300B5440A382ED87AB64B20373A0ABDBCE391D0BFFC9C543EC686449FCA9D04B7141836A416720BDFF250A06D7651A1F98EABE4B340B2303591D0847AED6FFE423B6DD8C0C03459C381DB506F531343F82C116323899DF1E5D8DB8997BEC12EB70103F0BF2B3D53C4D4694052606EE32BE4F5B35450358D7D85062DCF7F0BDB51364700BAF92CD6ACE4E2C10E6CD9A332716F5F4BF7598466A99238357798A499C9B8BE77690635C57E7D87A904B3F2278C0B1B23E5860B0532F152E1626C86FD855F656B5D070BC81CE4634A87C8EA6D6A433C02DD2E6D6561B25968B149A6F3BBA40B749F188B84314B5778A000CAE91A53D59860EE6F7DF38CA0935CD64C08A34BF19981C17951B9C39A847D0637441452E38CE5E1D9B99BED51B86705CEBB8D3244C40BB8D70F846936A2BE29C21604A7E6BD3E655022B929954F6C9A5743F5FC2127B49956D80128DD582CEAA06FC174813E5F5E6A0A4D7D26756FB28A6588E9410722591CCE2A6C6ED0976B98E1FB0C642D5DF8F08E96BAE1FE10375FA1D7C70806101570FEF1EBC8F58664281E2B61DF2081B655013AEF54616308504F5F4A1E8F156680163489D3FE7BB0A514F1D2D57EE6302853D7D03C767C7BDFB79E2B8C80403F26F6EDBDD6A890A0A0B9B76D334E0F729FF9C47BFE960A1C3FAF77E81B9AC156367423DBB4D766A1F3B1E67595EFFD76287F22BC37DA4F0204633E804002EB7C1AD0836FA4D01E2FCDEAB8457DFC3D8B7F1151BEF3574F8F4653AA3780003787B8891901ABC8250A974C15F2DDDF9E1BE6798647EED710D06CC3FB4C276BFFA585680FC632D8EFD1614745BC3C72B82C53FEAE935EA5014E2B321F69BADF570FAD878C9590FD20FB7BF1B31E373DA93D1A8C63EA45E698CE060FE70ABA0FA84F37E836F2AD2998F07101D3FC7CA2B08B1398E1687ED5A8CE860EF9B4889FF436B74D13281D1F6A7EDF1DBE8989BFAEEFE6A475E65217643E757006871E664099F5B3846553603CD9EEF8FC195807361FBFDEB8DEE6A0B79F009C10DF397FFB865F4EBD0473D458D553358029C6B5A95D6FFEE9B645311D10A8F479B7E5249AA87E3DED08311B4DDF3A458FE61AE294A22643861826ACBBC9B0EA8B73157CE15D1FF35098AE67159B07CA7499398C26776DD9884B5D3786C87D48E864D8BBE2B73E2890F217E135BFDFC4DC5E805D9CEFEF5268E33DB611ABA6A5D57EC82B7246A63DCF3EAF3A51CF503D65C206D2362421DE774158AEAFFEE45A6B5AD5CC0B1DE0E2EA74E97913729A69E9C00A309DDCEB7738BAF4757EA9CC96E055BBDF692B12D8B01B92CE5ECF3D52187402CB7FD961A2672DC1875B6EA22AD7F5F42B1B52BA2D780F2E6C5B25FC7E30B1B663E3A09C8FF0B5C302E0E7F984DDCC62DDA65FD996E17DA72F02A16C354BBDAD44C5B5044759BD53789B98BC58CC25FCDF10A9CBBF0FD6ABD58A4CEDD92C5D85EF22B3C5EE5D9440CE42995517D2F7352CE997F51A36B9FA5703B4C6491AD01F406FD1B5BF85321026D28B51354DADEDF057B37743499A986469F908A01F3C1B74DEF5D8E2F57ED25A80720B540333109A0A65E7984B557F65429F3D3BD7EC3732A10D7AF36DD5D2414A09949A0F57F37BD9021D2C482E61437CC15E9DFDD92D4C212C4FC6C22C54591E5AFD48210FDC88040135E433F50E45874E0D5EE2BBC857F2C80E2FA4FC7ACFEC8EEC0CAB351F677C790787C715945C21BF923EDC0A58878AE09ACF5FB5A003C9C0B6E30A450CE6DAD4B626108B88E89F1E6A7BB3843E1EC8AEE35AF69E81773CFF71190F819CCF24142D60AC51B80B61019EC7ED2EFB6C5F18B499FC9727BED2E3324F8B94A522092E0A98241E29F8F14C6561DF3FEA0824F9CB0FE10BB497E427EE62085E7AABB2900FA47BF27C1638BD116C5555C076DEEFE9754E8ED333D72CE9423E27EF640FD5199C0CAFBCF2DA1C5C34121A69E7E0DEB3C268FE60C6797056383DA43E6F472D225116F63124498271D3D43AADCC5871F2349CE040BE068D72EB57B7827A7D9AA01405BA0AB07E684B91EF05418948F6713AEF1F4948399E0E6130740CAE3E481A6366295422BE3EE2E892AA9FEE86A6E23E2EBCBE654989FD93D1C4E7D62910E1223BD66B7C54F8DD7D373986E5D4141BF0BDE98DD13AAB7D598D698660F11FA4BFB0AD09D5C27B65386C8673E6C4AE9E8E30F8DD1A5A3FE557A3C29DCF99A7C376200AB595C49445E740E3DAEC07BC047FD6EA4FC6CFDC23D7449F9D1170FE635CA36D3DE5B57F1CFB182DE240CD4C1E480600C449D1A8596D8315906A53954201929E7665DD2E27D590D481DD394CF2E8AE19217F1FF0CB511DEF7460DC9E49C21607247857BA744B1384344B4C2D8CE987512376F66F1A279509281242A7A2A58ED500395418138ABDB9C5572A258D157F4D3E88ED216BBE9CEE3BD054FE61F94C59A4AD19AA62E456B86CADE61622A6FEA877575EEAEA20C76AE8A89E7B44396BAE0EEEAB1C23F221A3DF2B2CC683256A4E5C8207EDA0B235562AD3B510F9D3FBE0B51CD8F238A0ABD2EC182681606C8FD111D8CE1EC1CDA6DB4572303DDEB925AC1FFFD75E321468266790DEE6BC0E85070CEE749D9E46795936324DD1388E1B11AA617500534B8DAF2DE12B035F73111B770F5F56F5C6A4152C45CE0E112E650FAA9F3C7E59E3410745C29FA59CAE5CC37FE4C6594990E50DF1576B69B2B292AFC58A804743F49DD7C98C1768FD19AB4213AE4FB197492AF5BF7FBC6C8B507673539D8515DD527FAFDD8CA3EFF629CAA720AA11E65922678447AD4DDF5FF943873DF5203AFEA4130CA5F633E104AB083EC690CF092D208A98006E91BC7E33731D18E592869E564E6D3FF8BBBBB9837FFC1F1B92DE0F5DD4A029C51E3F64592CAC3DE1B4CA5414F894B7B0B7D73D6BF1DA4B908ACEAB47771DA56A8B0536301FC5FD270CAA55CE171332F7DB2EB4619C4B2C1971EBC0AB8B0B11FD54C24285DA8428AB9E0150D8897216B133ED554DE8CEE532024DF8B8D9314D7C9A3EC60464F9C7BCA8C3D4FBA23A7B543AC111ABA8C8F1BD54A243D565DC062F84CCCEDB0A03375FDFBCEF8AD8CAFC440D3E6F988DC607ECB947673DEC4AD48724C91A6BE22A0027E42AF6D94D26D188D0B7B3A5AF012880FC0105DD2F11171742321DD41A0401415C58AD4DC445642A2CBB466788F54D270BD8DF25602B298B62B6D0FA3ADA97008A99B73A807092F8957F17EEAD9D53B1128FBEF1DEFCBC607EA92AFBD353E95F52D33AB7C1EBE2 +pk = B8A33E04B1EF9007EFD16F7C6E8C7923928667D4D0D6D14C673C5665BF4FE0A634E704657BD623FFDA29079AA6309D33A86D498063DF0E01DB17C594844A335EE2E8754F7408EBEE4897726C3446C5FF7C7519E8BC43C3E50A1910DBFD710D1717 +sk = B8A33E04B1EF9007EFD16F7C6E8C7923928667D4D0D6D14C673C5665BF4FE0A634E704657BD623FFDA29079AA6309D33A86D498063DF0E01DB17C594844A335EE2E8754F7408EBEE4897726C3446C5FF7C7519E8BC43C3E50A1910DBFD710D171779C4DAE6D9E62050C79E7DDA69902513E251CEC9A214A3A8250E000000000000000000000000000000000000000000008EC44D6843571490D22D18D990765C3C47E2495934D85357BDEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37DB6F83550997FAB3A657B9644192451FCD1732A58F3D7265FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020F7EF776E88FCAC009CFB4E1725F96B8C7EF85483FE3A6C3DB061F49ED8DF00937B4CCA9FD57DA964D745BA0F128D000B4C706CA7BC48F28F8E807E6B381BDCDD401C46A0637AE3A327CEC6D62ABB2B40A1F0BCE4FE25B5F2A17864F2AA9B000FC977C3EBA13D3AD060385F5F7E77D9B65CFABE22FBBC6B66F49887B93D2DABDF11373ED53CFAA86EAC6AAAF73FA80013C53C0CE2A62FF134821CFD33B591A4673EB6FE946BC5FDCDAFD721022EE3D1FBE9EC76BC446DE9B49A732B14A87B00 +smlen = 3392 +sm = ECB1BCE110A70B3847C8DEC5C934B826D0D426AAF2E15943192E4E23E5AC232D8F0016DF90A291CCFEF88E1DD04C1C37E594D84560F163DDEF34390C77A1BB2281D19878F702FC6DCA0A48906AF265C90C7A90070470E264BD4ACBDA784079150002564D336734753B510DDBA3092A1F10F793C7FA741D1F8106031D3482BBC587CF479F43CA56573D1CD3BA69BEB59007E82E0026BBDCFC834C171E5A2EB5D775D9441B94CAF6E8DACB88430067B7375E7DBCE873233B4F4A99D5A23B76310CC42962524702B4E77D26D6CCB1F21FBB567AA6488B5DFB60E929BC0AEA0004021F7AB96E8C14D1A5094672D7034FA8F81703A2CC18983C972CC66736CD98B031AC8A479CED21A1F634938DF85F3E83161646DB81B9AC3EA22F80980B8E2EBA4E9975714E5A98985817F426C41F3968349686B69AF917564A2648401B8FA127FC3200DC16A9E663D1D345EA83131E21229DD39E70D7270DE7577A7E9635602FD2C30EFAF204A9234F0A73D21375658B0B0B04927E67F3F5534614EDF5137BADFED914A49AA301000092DA93B3FA4A0FF592CC3A53F4A75B54FEE775EFA421EEFCD6E0D32FB5CDC096886076DA940B26C6E07F12F6E08FA7B3E2DC42055308E5607A2732717AE592A6909C6E084252A5B08685FE8C6C1DA387B0AA9800B67CDB3EE2FB21B9BE5E6B79AB545563068441C0C9C1E68CEF6028A5CEDF27D3CA47D95094C9E1E68B8449758BE3FF8FDE148ABC420295DC76E3EBA8E11433217FDC3136551A5A41C1C7E7D6EF43601946897FDA54842D8F73FAA7EB7ED0DE544FEF2A95C6FECB13C8C0F14B5B22493F54374184B73D5BD47383BBC5DD7BC1BEAC0CB8E66D2F413A9DCEB7E1D0EE2D63B9EB28DB232C33A95B792AE67D2591F5AF59DDC45771A0E7195C4D25E7F4079359597678B0C0A87DF3D66A686A9215DD566D4722C212AD05A23E1377E37E18A6AB3AB8BF5CD47BF1BAF06EB05E4C150CA67D7E52BD297A08CFC97B575752E686B83575F425F3A450BB0F596A60E41F7183F463007FD019EE255BDEF1D98B7A0A12EC33B3E2BC9BF0CC8F4860DEBCFBBD5E40B2ADC2CD10EC35A341BE7A49F8D204FDAE86921B7DE5BA700A61E2B041A8EA7040ACEE844892E5CF025FFEC5322FF6D765BFF1107C967A12ECCB0489F64F8C13BD7057DF76485446641AA7A560C7E73008C46572628E1A225A8D3F6D68DDC9759A952FC07CD43DE4434BD3391089E900275E9EBC92563AC1403BB7DFDD182092130E3E6AEB7B666F4BA66C38BBE1F726F40A07DF6C42079A6054399519E26D765CA065F4DDFD27A29CBA292699CD826FA9D3E7EE31B0D76813879DB5EC5C7F454095DC3BD27323DABD2DFF949AC760D6137334507816330FA67D886021661ADC69AEBD882A07E01B4B6E5492399ECDEA99222EE785C810B30409DFAF2A3CE5A05D699C2368249C9588D86FEAA778B4860D6DD442088A21D2D9D0B49B15EC579776812AF8AD582F1C44BB6432D7472300B5440A382ED87AB64B20373A0ABDBCE391D0BFFC9C543EC686449FCA9D04B7141836A416720BDFF250A06D7651A1F98EABE4B340B2303591D0847AED6FFE423B6DD8C0C03459C381DB506F531343F82C116323899DF1E5D8DB8997BEC12EB70103F0BF2B3D53C4D4694052606EE32BE4F5B35450358D7D85062DCF7F0BDB51364700BAF92CD6ACE4E2C10E6CD9A332716F5F4BF7598466A99238357798A499C9B8BE77690635C57E7D87A904B3F2278C0B1B23E5860B0532F152E1626C86FD855F656B5D070BC81CE4634A87C8EA6D6A433C02DD2E6D6561B25968B149A6F3BBA40B749F188B84314B5778A000CAE91A53D59860EE6F7DF38CA0935CD64C08A34BF19981C17951B9C39A847D0637441452E38CE5E1D9B99BED51B86705CEBB8D3244C40BB8D70F846936A2BE29C21604A7E6BD3E655022B929954F6C9A5743F5FC2127B49956D80128DD582CEAA06FC174813E5F5E6A0A4D7D26756FB28A6588E9410722591CCE2A6C6ED0976B98E1FB0C642D5DF8F08E96BAE1FE10375FA1D7C70806101570FEF1EBC8F58664281E2B61DF2081B655013AEF54616308504F5F4A1E8F156680163489D3FE7BB0A514F1D2D57EE6302853D7D03C767C7BDFB79E2B8C80403F26F6EDBDD6A890A0A0B9B76D334E0F729FF9C47BFE960A1C3FAF77E81B9AC156367423DBB4D766A1F3B1E67595EFFD76287F22BC37DA4F0204633E804002EB7C1AD0836FA4D01E2FCDEAB8457DFC3D8B7F1151BEF3574F8F4653AA3780003787B8891901ABC8250A974C15F2DDDF9E1BE6798647EED710D06CC3FB4C276BFFA585680FC632D8EFD1614745BC3C72B82C53FEAE935EA5014E2B321F69BADF570FAD878C9590FD20FB7BF1B31E373DA93D1A8C63EA45E698CE060FE70ABA0FA84F37E836F2AD2998F07101D3FC7CA2B08B1398E1687ED5A8CE860EF9B4889FF436B74D13281D1F6A7EDF1DBE8989BFAEEFE6A475E65217643E757006871E664099F5B3846553603CD9EEF8FC195807361FBFDEB8DEE6A0B79F009C10DF397FFB865F4EBD0473D458D553358029C6B5A95D6FFEE9B645311D10A8F479B7E5249AA87E3DED08311B4DDF3A458FE61AE294A22643861826ACBBC9B0EA8B73157CE15D1FF35098AE67159B07CA7499398C26776DD9884B5D3786C87D48E864D8BBE2B73E2890F217E135BFDFC4DC5E805D9CEFEF5268E33DB611ABA6A5D57EC82B7246A63DCF3EAF3A51CF503D65C206D2362421DE774158AEAFFEE45A6B5AD5CC0B1DE0E2EA74E97913729A69E9C00A309DDCEB7738BAF4757EA9CC96E055BBDF692B12D8B01B92CE5ECF3D52187402CB7FD961A2672DC1875B6EA22AD7F5F42B1B52BA2D780F2E6C5B25FC7E30B1B663E3A09C8FF0B5C302E0E7F984DDCC62DDA65FD996E17DA72F02A16C354BBDAD44C5B5044759BD53789B98BC58CC25FCDF10A9CBBF0FD6ABD58A4CEDD92C5D85EF22B3C5EE5D9440CE42995517D2F7352CE997F51A36B9FA5703B4C6491AD01F406FD1B5BF85321026D28B51354DADEDF057B37743499A986469F908A01F3C1B74DEF5D8E2F57ED25A80720B540333109A0A65E7984B557F65429F3D3BD7EC3732A10D7AF36DD5D2414A09949A0F57F37BD9021D2C482E61437CC15E9DFDD92D4C212C4FC6C22C54591E5AFD48210FDC88040135E433F50E45874E0D5EE2BBC857F2C80E2FA4FC7ACFEC8EEC0CAB351F677C790787C715945C21BF923EDC0A58878AE09ACF5FB5A003C9C0B6E30A450CE6DAD4B626108B88E89F1E6A7BB3843E1EC8AEE35AF69E81773CFF71190F819CCF24142D60AC51B80B61019EC7ED2EFB6C5F18B499FC9727BED2E3324F8B94A522092E0A98241E29F8F14C6561DF3FEA0824F9CB0FE10BB497E427EE62085E7AABB2900FA47BF27C1638BD116C5555C076DEEFE9754E8ED333D72CE9423E27EF640FD5199C0CAFBCF2DA1C5C34121A69E7E0DEB3C268FE60C6797056383DA43E6F472D225116F63124498271D3D43AADCC5871F2349CE040BE068D72EB57B7827A7D9AA01405BA0AB07E684B91EF05418948F6713AEF1F4948399E0E6130740CAE3E481A6366295422BE3EE2E892AA9FEE86A6E23E2EBCBE654989FD93D1C4E7D62910E1223BD66B7C54F8DD7D373986E5D4141BF0BDE98DD13AAB7D598D698660F11FA4BFB0AD09D5C27B65386C8673E6C4AE9E8E30F8DD1A5A3FE557A3C29DCF99A7C376200AB595C49445E740E3DAEC07BC047FD6EA4FC6CFDC23D7449F9D1170FE635CA36D3DE5B57F1CFB182DE240CD4C1E480600C449D1A8596D8315906A53954201929E7665DD2E27D590D481DD394CF2E8AE19217F1FF0CB511DEF7460DC9E49C21607247857BA744B1384344B4C2D8CE987512376F66F1A279509281242A7A2A58ED500395418138ABDB9C5572A258D157F4D3E88ED216BBE9CEE3BD054FE61F94C59A4AD19AA62E456B86CADE61622A6FEA877575EEAEA20C76AE8A89E7B44396BAE0EEEAB1C23F221A3DF2B2CC683256A4E5C8207EDA0B235562AD3B510F9D3FBE0B51CD8F238A0ABD2EC182681606C8FD111D8CE1EC1CDA6DB4572303DDEB925AC1FFFD75E321468266790DEE6BC0E85070CEE749D9E46795936324DD1388E1B11AA617500534B8DAF2DE12B035F73111B770F5F56F5C6A4152C45CE0E112E650FAA9F3C7E59E3410745C29FA59CAE5CC37FE4C6594990E50DF1576B69B2B292AFC58A804743F49DD7C98C1768FD19AB4213AE4FB197492AF5BF7FBC6C8B507673539D8515DD527FAFDD8CA3EFF629CAA720AA11E65922678447AD4DDF5FF943873DF5203AFEA4130CA5F633E104AB083EC690CF092D208A98006E91BC7E33731D18E592869E564E6D3FF8BBBBB9837FFC1F1B92DE0F5DD4A029C51E3F64592CAC3DE1B4CA5414F894B7B0B7D73D6BF1DA4B908ACEAB47771DA56A8B0536301FC5FD270CAA55CE171332F7DB2EB4619C4B2C1971EBC0AB8B0B11FD54C24285DA8428AB9E0150D8897216B133ED554DE8CEE532024DF8B8D9314D7C9A3EC60464F9C7BCA8C3D4FBA23A7B543AC111ABA8C8F1BD54A243D565DC062F84CCCEDB0A03375FDFBCEF8AD8CAFC440D3E6F988DC607ECB947673DEC4AD48724C91A6BE22A0027E42AF6D94D26D188D0B7B3A5AF012880FC0105DD2F11171742321DD41A0401415C58AD4DC445642A2CBB466788F54D270BD8DF25602B298B62B6D0FA3ADA97008A99B73A807092F8957F17EEAD9D53B1128FBEF1DEFCBC607EA92AFBD353E95F52D33AB7C1EBE2 + +count = 96 +seed = 26CF860726D4DFA38AE07399838BB336F1BEE59E9F23AE4C81E73D49964997EF21CB5F5412F9A70A1EC39FC6228C36CA +mlen = 3201 +msg = DE897F02AE7292ABAFA6A0CAD52929113410F2BA972B4184E894C4D31081420751560956F49CE2B772635625AFC3CA6698FBFDE4D0A05EF243DF190BA1CE780EB572590E01E6E283E1963F2B0722B0CEB365552F65BD405F1A284DDBED07BA61C4453D30CC28C83E41590E09D7BB6932D231285205D61332FA9263B8A2D3D7F7FA20F521CA4B49F249896780E08C2DC41669BF0777278F87BB1F72CDDF4B998062B1642791F81AD474D6D8F963DCB4458CE11108544C41CDF19145B77038C7E8ADCD6501508C53B25BE6E787313018620D1BA647CCA4A5A8399E11815EAECEC6AE66DBC576699BB0AB44DE111AB6F252256389EFDC0546E641DE87FD6A3A724716257A9174F39542539A593864441EB79D499FCDF2F1D053CEBB3A1FCC09419D2C553C2265B3DC3943E0341BB49130E9981EC59945FA0B23E9DBDBF352ABA0D925C4333F2EE1F2C83C847EFA78BB13263B893D7CAE029BF08CEA2A5D1B5B997E403A489C6D9A124FB8386FE58C2476894E7754B8E5A162102A119482B5E59F8D89C8B1DEA70B6C80641C77BFD12D45C5B3CE0021EE500A1665ABCF740794E0D3E7E8CB5804A1E0D0C81A107DEE80BF63BFF8CE2EE2DD602DF279DE39C579B417A758356D2B48B41E83495DEE9ADFE4506E03F19DD096E81405264D408B2FBCDBF41DB5CED6FBDC2645DBEFE5BD038382993970C7686DBA3FEDC24E1F91BA4B6CF70B2E832B97BE24B6393273A519DB0B4446E98D77E86CCACFBECCB18939013C66F7A29B10DE2E88FCFAEF656B858B7DFACC4F21EF5F328C0EF604FEDD993510BA40530B79525FE8D336DEF0E5C303539E664A9360EDAD7268F70DF4DE199AB3F70EB2BA65E2752BF5FDB1E853E6F4EFCAFBB31D8CC23155413BE31082DA958B01682894A9057CAB66D4D64A6F3B1D81C5B75815A3E0CAF6486B17339174276A84E11C117B060302DC2EE06A03C0E15395C0DD32661638F059A385578C1B792349A41C511D12AC7185B060A831EE296E6626459C2750FAF3AFB579F6F6836D566C00C979B5130E8E50431E914834CBB3D26F6E5BA50BCF05D50F699FAF10767AA2831C3557A53AF14BFD9F23C00F76C2680C7DBF4A9B2A425E34C943228C3EBE55A0960ACC757D7878F7943E2E8A1CBC8C0D2139A6A6459D3492A1A7757F71E90A58A78E0FF9B04D059C5D131F6E3C30742FDE5506AE7860045A4C903DE96DC43AC6A69273BF8EDAB7E7FAFBAAD9EFA8FA609961502EFACCDE63A6D98D8D017075487C608FF701A7E3381D7A2ACB134B198950ECC6970A75AF5625FAA4EAF968CCE48FFB673F4F365802A984C609C33BA312140A60A6F0924E945D11BAACFCD643C874D352A90367EA4C59B63665364832B1A9A9A01EDA92C64F393C357158973FA7C6047B8B5E27EEDB28E26359402B63032F8B230F5AA968272819CA486A8BAFD3D66799AE951CABF04EA81E1E7E4632B915D4E8387C7D1F4FAFE1C1FC8666FE0318403EA0027487E947D844A7FA28C0523A64EBD95D2A8ABF6A71FEFB5BC059B2CBEECD4375F3A3F109DEAD98539244DDCFEE9E42DB3ABDAF943C445712EBF19508A1FFA6133C5078C1DA69A32CBE729A8876C4C73CB232024A87D87FD5F9456D3D4A936CB4CE2E00EF415406D66D344000A4A95CC9651425A16021336C4BEFF310210324C754BBE13CD0066C507413671C80CF492B4655D898A18A2F4DB5A393400C6AD821580B0712D6C919C62E87FE212260EAEF6876C409FCA1047A67B223E0766144F3F676F051FBE912C4CE4A9F7B85459DA031EC47C621F6EF06CD1621421FA52B047B51C944DFA94807083B4ED40D533B19813477193D1E4E96C8D76A5AF3100FA44A985A6513060B08A7F3848159B3CC551D43370B223037753B824A099A7C7DF59305BE09E2E79618C83818BD542F39380126A927190EA5536DFA63B664AA7601C6D82CDDF4CE4006E1AF2601EC453971828CD09C29D2F3EA6392B58D38BCF40BF6B6497F6B848CB853B187610CD23880CB09787C76087356C66565C0399BE746A81753442E4AAA54E84F1D8C2CCB2D00A551E960203D61E71A72E131ED1967DD06E72C99264EF2EE5BD156FC869B5031BA23A6D354D7CEC58F339F6BC2DD1C547F07AA733994860197DCE5BCE6024A74668ED89A2C9CAFE1F78B31638C3225D96009C260FBD28C1F0423E75C9C01A0F9E62B7F265FA3817F441F56AE79BA54A0C107FD7946A2DDDA60D0EAE428715FE2B4FF93BEF83CD10E5E17760FE028F1AAC8084A43EDCC12BFD3265D13FA94D9704809A50881D48F0080A976C5BF31B353B9043C0F0B69AE6F2B8BADD056752F2FC9E90C4B35850C2D45B9F354B41ED7826B976528875547A0C389B83725E26C006CC8240E380E3EB554DBF2133A131743539B1D174CCA6B135C59F81D499631BDA4CF90DED836E8C24C074A0BCD83271309FFEF320791C9030FC2B1F53FD2DE870E54EBA20CE9930C279B48B39CB481737F012F65933650374BA39E2222191B0E3C7DB9632CE9CB077322CEF97ED832DDD8AAEE53C52C03D2AAF8EB5597D8D6467A406BF428E2F16462E0C0D486A1C1C7348CBBF92633EC4FFA75945025A3C92095317E32290D4CBAA6CA40F3F201975F3FC8B733D1467C094E075E8415352E3AE51A6C5169A4AA430BCD66FF39B184F5B7174042DFCC6840EEF60CCDCAC12D012AE4F24F7184A038D8D9964AB405366740600B98CFE2E4737C8D846FD4E9B22B5047110D85B37BDB9E7E3BAF5298BBDC1050AA20F14E34DEC283830F5FA9C570C22CA659C1276BE8FFBC0AC3551DB8488855AE7EC21E239E88A0F68227D17DD87FFA3B3D0535F9E57807755DE56A65C0DE9F4A79F8746B20908BF9416A86F62EE2C2545BCA2D55CD4D45DCDF06DC879E1B6270A80778D0274AA658395D800EAEF367DF4F4D838EEE0A66093E0F419B9EDC5F003E31CF0EB7E1CEE9ACCDA7A2DFC920A4B5222389DBF12AD17392850C434A9B3C260159B0F52E78E7A66D28DD5B3C77662CFED2CB3DD5BC3CC26A34293EBF1FB3A9BC59BB0C104C5A9387F3893A65D145D424CE741A375F9C65E733A024E78FE274B29FF4B0EB6F21FAFC31453EAF7E48FABEC5711D3898B876F59952C73123281A8E85148CEF5A166BF45DF36053D57AE6F29D3E334BB2395FA236D4DAA8A4FDF99D80A9BCDBED36154BF4FA3D463D51974032D7B88B2504317E14165B1C3FE3D8FE366FC8284321D80F9CF512F418C63F73B7C29C07870332387BBD1A870AC39485F64086006CFD68C8299347615A423736C01FAEF2DA56CFB6FC966948649324E22D4551B9F50654EE505547F7D0B8481ADF6AAC3977F49D7E6AE5C4248DF7B43BDA7F082AACFCDCF1C1BC04F2D45F5E028498ECBCA47EC4D1DDEB03A2AB27BE9E4B80585145676F8AE7A5017BC5EFA317A576ED6E423D5A0495B8DC619712A2C3E6162B04B9BBC7DE4BE6532F6C1C019E702C014C60189A2612594BCB18317804C630264D07B7396DB562777BC305B885E00706FF6D0208737BD229BC7AEEFF5FB770A4C057B347601F1F6C16F60D4A53A0B32631AD2D41FA307F6630228E1807D22475D5E331A50A680896DC606F3941AC08F8BA46DE5A49F5ED6A94965334FDFD69C4A6C7973D9615B3FE576B15AACB9B98D9E498D2A3A89B4F8EEE715ED5F29F13DDE7629BB386F7CC800F16F3B5BA8BD0E14CD8D9BB0F0AA615BE9D7557F6EFD00F7BBEF9989E7F463279408E6AD77E100AE4457D57424F2B1CAEF43052C5B25C896BAA1C2FE67D1D6F669311F17D39460F0B176A7727F53257A36FAACBF3DFE623D8F882F8EE41BA1CE387E1D1860F4BABE26ED678395B9979D84DEA5C7B38905D4C7FD867ED7722D066BFF3A833D3282BB40D1CD310DC8DAC9270A49B65B5181EB30F166CAF0832A8DC56B9D135550B506D98D036BE7876836AAE669507990DE6D03E78A38139CF64F65FB410F192E30B045C93FE259C10E0C5B56A2B5F0605DA0851104C4BEEB4E3B30135CAE5A6C68403C63121B0993832834A3B5EBDD345C41B26DD219560B624024B8B945A10D385B3CE4E0BD54E10A64ACA59D283302028A9592120D142CCEB1CC30E1F96AD041F1E17BCDC3C68C2EA2E0D65D6BA3696166CB365CC461ABC4D67D504E8290EB452ECB77F6D5FAA5053D01317646242384C5C510BD43C5780BBD01EBC3AF33D29D8A09EF39AC85E70398D2A64DFFA72B3EFD8D6D57AA2F9DAC0CC6EEAB27B69FDF2403A5FEDE0BFAF441619BE03FDE44C49FF0A34E9C37D2B9AEB726D56EB646A67BF349323F397DB056D71DE72A2597D780942554C8F8273E307DBA6BD02E944E0559509E1F28B511BD709D03EA2451EF234DF6F077E06AA01E2806D5BDF89DF29F1B3D8C6D8014496AD83857F7465F1072E88709D0194733E1FC8C9F092DF5B9802FD2DDDA8B142217B9532D8604E2F32D06F6400025930DA2BE9B25529788E6BF4EB7F84C272DF455CE2ADA291CFDB5FE815129E4AED59625C879E99B3E3C1B6C5D7 +pk = CAE068B163D88807169E716A4DD31B9086E6240001992F0E9C0EBFEA54EED31BC4D24C024B5E16F03C5F394A6747C93A351FE6F6A489A13F351A8E226112D9119FA10DD8BB9655FC1CE6ACA60F0B1D329DF1ED3C8196844BF9D2F507D393713A04 +sk = CAE068B163D88807169E716A4DD31B9086E6240001992F0E9C0EBFEA54EED31BC4D24C024B5E16F03C5F394A6747C93A351FE6F6A489A13F351A8E226112D9119FA10DD8BB9655FC1CE6ACA60F0B1D329DF1ED3C8196844BF9D2F507D393713A047DD07DFD91D9D8E4F66DCCA59942BE590DA665F225DA5AB39F0800000000000000000000000000000000000000000000F007711C6B712980AF3A8BD9CFF19E864453EB3BA308164C15F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83518CD4E5ED7E08029419FF7EC8549A754F16E8B156C26165F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020C19B6D96A7CDDA1A61B7CF09B4DB415DDB79FDC0ADC20693DCB491DB02F2E929342A25CE0BB693576FB7EEDA69BD00C5F122F41418DC11D4BC755FF5F104A2A6F590501429783BCFE250625DF280D880D6F6C531FFFEC482EC2B330156630091F18E09B14336FD437B9DEA9785E6C16E69FC6E1C9650B4C6FB940CA1E267B5F33848428393E3E025471B8CED9709006EBF7F09A5B91FE7523D95B55E197F1319ECE00CF191A6FF9282391F9FFF11F046EB49FADE46F31D4A04A5CDF740D600 +smlen = 3425 +sm = 80A2A7534C9A1771F0D2131986DEC194140C5CA67793B2BF68C97B60E11D120B8B76ED18DA52EF5BAFD0E0E92EBB5D028909A1B92FA159D4A6B9C34E6ADB09D595C0CB36C5D13C397FB3967E1362A8056DA1BAFDFA6348C16A7AB29231C9E11801024A0396E5402B7D84139224BDFEE78EE8CF82199E518E98DD01A3ABB0229942B5FF7F2D25C96FF474E054618766297A4D020042BC093A60A50809AEBB1BA58DD5B8A43B8A8B7A68189ED00161840BEEC6B5677D7C6C0FFBE861729AB451DD9A5EC9D7230148B6CDF825D48B5C273A8BE2E123D68964832F0B489673000406DE897F02AE7292ABAFA6A0CAD52929113410F2BA972B4184E894C4D31081420751560956F49CE2B772635625AFC3CA6698FBFDE4D0A05EF243DF190BA1CE780EB572590E01E6E283E1963F2B0722B0CEB365552F65BD405F1A284DDBED07BA61C4453D30CC28C83E41590E09D7BB6932D231285205D61332FA9263B8A2D3D7F7FA20F521CA4B49F249896780E08C2DC41669BF0777278F87BB1F72CDDF4B998062B1642791F81AD474D6D8F963DCB4458CE11108544C41CDF19145B77038C7E8ADCD6501508C53B25BE6E787313018620D1BA647CCA4A5A8399E11815EAECEC6AE66DBC576699BB0AB44DE111AB6F252256389EFDC0546E641DE87FD6A3A724716257A9174F39542539A593864441EB79D499FCDF2F1D053CEBB3A1FCC09419D2C553C2265B3DC3943E0341BB49130E9981EC59945FA0B23E9DBDBF352ABA0D925C4333F2EE1F2C83C847EFA78BB13263B893D7CAE029BF08CEA2A5D1B5B997E403A489C6D9A124FB8386FE58C2476894E7754B8E5A162102A119482B5E59F8D89C8B1DEA70B6C80641C77BFD12D45C5B3CE0021EE500A1665ABCF740794E0D3E7E8CB5804A1E0D0C81A107DEE80BF63BFF8CE2EE2DD602DF279DE39C579B417A758356D2B48B41E83495DEE9ADFE4506E03F19DD096E81405264D408B2FBCDBF41DB5CED6FBDC2645DBEFE5BD038382993970C7686DBA3FEDC24E1F91BA4B6CF70B2E832B97BE24B6393273A519DB0B4446E98D77E86CCACFBECCB18939013C66F7A29B10DE2E88FCFAEF656B858B7DFACC4F21EF5F328C0EF604FEDD993510BA40530B79525FE8D336DEF0E5C303539E664A9360EDAD7268F70DF4DE199AB3F70EB2BA65E2752BF5FDB1E853E6F4EFCAFBB31D8CC23155413BE31082DA958B01682894A9057CAB66D4D64A6F3B1D81C5B75815A3E0CAF6486B17339174276A84E11C117B060302DC2EE06A03C0E15395C0DD32661638F059A385578C1B792349A41C511D12AC7185B060A831EE296E6626459C2750FAF3AFB579F6F6836D566C00C979B5130E8E50431E914834CBB3D26F6E5BA50BCF05D50F699FAF10767AA2831C3557A53AF14BFD9F23C00F76C2680C7DBF4A9B2A425E34C943228C3EBE55A0960ACC757D7878F7943E2E8A1CBC8C0D2139A6A6459D3492A1A7757F71E90A58A78E0FF9B04D059C5D131F6E3C30742FDE5506AE7860045A4C903DE96DC43AC6A69273BF8EDAB7E7FAFBAAD9EFA8FA609961502EFACCDE63A6D98D8D017075487C608FF701A7E3381D7A2ACB134B198950ECC6970A75AF5625FAA4EAF968CCE48FFB673F4F365802A984C609C33BA312140A60A6F0924E945D11BAACFCD643C874D352A90367EA4C59B63665364832B1A9A9A01EDA92C64F393C357158973FA7C6047B8B5E27EEDB28E26359402B63032F8B230F5AA968272819CA486A8BAFD3D66799AE951CABF04EA81E1E7E4632B915D4E8387C7D1F4FAFE1C1FC8666FE0318403EA0027487E947D844A7FA28C0523A64EBD95D2A8ABF6A71FEFB5BC059B2CBEECD4375F3A3F109DEAD98539244DDCFEE9E42DB3ABDAF943C445712EBF19508A1FFA6133C5078C1DA69A32CBE729A8876C4C73CB232024A87D87FD5F9456D3D4A936CB4CE2E00EF415406D66D344000A4A95CC9651425A16021336C4BEFF310210324C754BBE13CD0066C507413671C80CF492B4655D898A18A2F4DB5A393400C6AD821580B0712D6C919C62E87FE212260EAEF6876C409FCA1047A67B223E0766144F3F676F051FBE912C4CE4A9F7B85459DA031EC47C621F6EF06CD1621421FA52B047B51C944DFA94807083B4ED40D533B19813477193D1E4E96C8D76A5AF3100FA44A985A6513060B08A7F3848159B3CC551D43370B223037753B824A099A7C7DF59305BE09E2E79618C83818BD542F39380126A927190EA5536DFA63B664AA7601C6D82CDDF4CE4006E1AF2601EC453971828CD09C29D2F3EA6392B58D38BCF40BF6B6497F6B848CB853B187610CD23880CB09787C76087356C66565C0399BE746A81753442E4AAA54E84F1D8C2CCB2D00A551E960203D61E71A72E131ED1967DD06E72C99264EF2EE5BD156FC869B5031BA23A6D354D7CEC58F339F6BC2DD1C547F07AA733994860197DCE5BCE6024A74668ED89A2C9CAFE1F78B31638C3225D96009C260FBD28C1F0423E75C9C01A0F9E62B7F265FA3817F441F56AE79BA54A0C107FD7946A2DDDA60D0EAE428715FE2B4FF93BEF83CD10E5E17760FE028F1AAC8084A43EDCC12BFD3265D13FA94D9704809A50881D48F0080A976C5BF31B353B9043C0F0B69AE6F2B8BADD056752F2FC9E90C4B35850C2D45B9F354B41ED7826B976528875547A0C389B83725E26C006CC8240E380E3EB554DBF2133A131743539B1D174CCA6B135C59F81D499631BDA4CF90DED836E8C24C074A0BCD83271309FFEF320791C9030FC2B1F53FD2DE870E54EBA20CE9930C279B48B39CB481737F012F65933650374BA39E2222191B0E3C7DB9632CE9CB077322CEF97ED832DDD8AAEE53C52C03D2AAF8EB5597D8D6467A406BF428E2F16462E0C0D486A1C1C7348CBBF92633EC4FFA75945025A3C92095317E32290D4CBAA6CA40F3F201975F3FC8B733D1467C094E075E8415352E3AE51A6C5169A4AA430BCD66FF39B184F5B7174042DFCC6840EEF60CCDCAC12D012AE4F24F7184A038D8D9964AB405366740600B98CFE2E4737C8D846FD4E9B22B5047110D85B37BDB9E7E3BAF5298BBDC1050AA20F14E34DEC283830F5FA9C570C22CA659C1276BE8FFBC0AC3551DB8488855AE7EC21E239E88A0F68227D17DD87FFA3B3D0535F9E57807755DE56A65C0DE9F4A79F8746B20908BF9416A86F62EE2C2545BCA2D55CD4D45DCDF06DC879E1B6270A80778D0274AA658395D800EAEF367DF4F4D838EEE0A66093E0F419B9EDC5F003E31CF0EB7E1CEE9ACCDA7A2DFC920A4B5222389DBF12AD17392850C434A9B3C260159B0F52E78E7A66D28DD5B3C77662CFED2CB3DD5BC3CC26A34293EBF1FB3A9BC59BB0C104C5A9387F3893A65D145D424CE741A375F9C65E733A024E78FE274B29FF4B0EB6F21FAFC31453EAF7E48FABEC5711D3898B876F59952C73123281A8E85148CEF5A166BF45DF36053D57AE6F29D3E334BB2395FA236D4DAA8A4FDF99D80A9BCDBED36154BF4FA3D463D51974032D7B88B2504317E14165B1C3FE3D8FE366FC8284321D80F9CF512F418C63F73B7C29C07870332387BBD1A870AC39485F64086006CFD68C8299347615A423736C01FAEF2DA56CFB6FC966948649324E22D4551B9F50654EE505547F7D0B8481ADF6AAC3977F49D7E6AE5C4248DF7B43BDA7F082AACFCDCF1C1BC04F2D45F5E028498ECBCA47EC4D1DDEB03A2AB27BE9E4B80585145676F8AE7A5017BC5EFA317A576ED6E423D5A0495B8DC619712A2C3E6162B04B9BBC7DE4BE6532F6C1C019E702C014C60189A2612594BCB18317804C630264D07B7396DB562777BC305B885E00706FF6D0208737BD229BC7AEEFF5FB770A4C057B347601F1F6C16F60D4A53A0B32631AD2D41FA307F6630228E1807D22475D5E331A50A680896DC606F3941AC08F8BA46DE5A49F5ED6A94965334FDFD69C4A6C7973D9615B3FE576B15AACB9B98D9E498D2A3A89B4F8EEE715ED5F29F13DDE7629BB386F7CC800F16F3B5BA8BD0E14CD8D9BB0F0AA615BE9D7557F6EFD00F7BBEF9989E7F463279408E6AD77E100AE4457D57424F2B1CAEF43052C5B25C896BAA1C2FE67D1D6F669311F17D39460F0B176A7727F53257A36FAACBF3DFE623D8F882F8EE41BA1CE387E1D1860F4BABE26ED678395B9979D84DEA5C7B38905D4C7FD867ED7722D066BFF3A833D3282BB40D1CD310DC8DAC9270A49B65B5181EB30F166CAF0832A8DC56B9D135550B506D98D036BE7876836AAE669507990DE6D03E78A38139CF64F65FB410F192E30B045C93FE259C10E0C5B56A2B5F0605DA0851104C4BEEB4E3B30135CAE5A6C68403C63121B0993832834A3B5EBDD345C41B26DD219560B624024B8B945A10D385B3CE4E0BD54E10A64ACA59D283302028A9592120D142CCEB1CC30E1F96AD041F1E17BCDC3C68C2EA2E0D65D6BA3696166CB365CC461ABC4D67D504E8290EB452ECB77F6D5FAA5053D01317646242384C5C510BD43C5780BBD01EBC3AF33D29D8A09EF39AC85E70398D2A64DFFA72B3EFD8D6D57AA2F9DAC0CC6EEAB27B69FDF2403A5FEDE0BFAF441619BE03FDE44C49FF0A34E9C37D2B9AEB726D56EB646A67BF349323F397DB056D71DE72A2597D780942554C8F8273E307DBA6BD02E944E0559509E1F28B511BD709D03EA2451EF234DF6F077E06AA01E2806D5BDF89DF29F1B3D8C6D8014496AD83857F7465F1072E88709D0194733E1FC8C9F092DF5B9802FD2DDDA8B142217B9532D8604E2F32D06F6400025930DA2BE9B25529788E6BF4EB7F84C272DF455CE2ADA291CFDB5FE815129E4AED59625C879E99B3E3C1B6C5D7 + +count = 97 +seed = 13F1F446D9AA5AC853278BF74C9E6447A6CE4294C037867F43DF554370EE261D05C7260EEBF46D6694D0850B8343FBE5 +mlen = 3234 +msg = 525E8B98C55864849FFC71EBC953F7A0ECA6298F6AA15A83BF6923BD5921B1C86DBBFC544A39C364EF6D9281481E946C994F96829D6639727A5345560D8641E9A510F913F7FE5592C2A40CB278F5AFD8D4504B5387C20945654F08168247A98F56A43A5020955F882D2D93781F4A83676B08F50341E953A5D1B67DE7F6D1BE3D78D5D060AA85B5EE4271763C437CCD595890DBC8FCFAF2754AE9349BA2FDF89847A15188716C0EC672887A4B9A15176AE0C5138819CA232D012BE1DCFFD29F677442083087C127CBD80B0D9CC0962BC8318E734910D1E2653BBF700C84BB0919E12DF331CCDC7128B41F0666F6419AFBADAF673BE16C9177D3CF113C6488504DE088149BFB83EACBBC400309B7AD753F7B2F5AA89F070C9D14C084C32DF91C5F7CB6A7D869D64F4A05AF80A98BE7517ED784C17B0D7DF96B9987B7EA7A398CE018AE6E13E1C0F7AA040AC3FFD273BB9687AD6FEFDB211061A6228967E9DFEF69BCC1C5D02EE56D49A93C8AAD46D08322A2CA246AE8C3EDC071D063AD605A97B8AE94D58E897A4A6310BCBF55B0CAE1AA81769D30B46F883EAF29D4B5FEA32F2DBDE49360CB6235754BDC305ABB5E5395360097378656E2BACE675448889B0149D6086C51E9C3AF07A76563164864F131CF9C0CD475CD4A58726AD237CFB76ACA68032351FB24711DA635871386B4BFC94B0DB6D35F07D0196F75CEDB92EFBE7D653E0FF9326A596F9166FF6CAB73125DAD27F361D6122CA531D86910187E75F849EDB52DB26C96FDF05925DCCA232480D3F979EAB07CCA68FC9069965D12BB666A180989AD1FBEE3FE65E746C5A8F64DAB2E370F0487D001121EDD0D0D760531AF46DA65C75DE11688EBF31DD2AC95C188BCFA07EA798609F3EA8E6364A43742A2825144FAFC05ABD17476480812EB2483734B13D075B3EE3AD510B67CF7057014351B2CE5357E3F12F43BA74CED614BE3A9AC0E26763E9AC596F87AE98F72ABE0DE213A81A9A03E2B82F2312C1A186DFCFC3DB346FEB132931C793ECF837F57D8E326101F59705B77A3083E712CE347C2C29C23468B0C5857EFA410197833987C61ECBC2A855EF78B3D7B1B697AB9844AAD07C4B8EF666BD80DABA5FCAC900C5D358A11676FFC89DFF4F36F29F14D9F9B854DCED41FFC4B36381449D22801C19BF8E8BA1F07A1B38FFB527A34D009C4064A1E606FF2AB90AB2E05C156150EC14D7DC792578A16F46650D0ABB61175D1817E2C38F109EBC01A3ABB358673561691185DA32EEEF566C1BA1C72C1F08CD1B427B552425501B8783116F2EB0CFF73C5D2DEF18D291C106980135821A77428FAB20A935AC8B6DD8EDD1A936225344EB103DE0D5879CCA09359B5B882291C0FB1FCCF167C30DBECFC324AC315713CD10F35B72F0D4871A7CBAA2B4CC2BC2598F23DA607C94A063C9E2013B0EDA5F3BD5AADB2C429177A4BFD7B6181ED5F9A55C1F043DA8155C9E7BEBDA7EA07DEA49938FE07743DF2295C220EB53348310842B1000B7A02AC025C3A94FA82D46ED7E2712DE71B149742731EBE62E225D21A7F29D5F3A8A62B71FE16258570DA412C07CECF82B2064AB5D98761C69FC5E899A8E174875B3179DEAA0BF4A0261DA9BF39148440DCBEB0C887E41FDF751505DE79AA1F8593F45482B659F5B5F4CC3E7BFEE59DEF49458DB195A1A692B8AF4AA44CCFB00B753AC761181B8AAB39DB82385AE776CFC585F7873613B62DE55BB10A6B2F27E631CE41436C3FE390163E6F4EBD6B501519C96C06FADCAC8F75920FE1435542FDF535EAD6C0E3F41345996063B95A208DEFB6F110CC861580979BF4422ED395CA218CFC3B22C0BA8B31CB9EEEB51C3DF35FECE92795CAFB8440F522B44E21B3A18D5CDBC296B887A4B927F36715E4AC2CAB043D8B69A8704D6BE24C725B0C2E814BCA7B040C27FE8F4C14911051039AF13F44E0485EB767F5404CFB6FD19DA24D82FE24B53033C83DD8634E2E28AA330A81F14BAC1C57DEAD7FFE39994D9D094383E14322E146A3DF27A776E2F09A11EC9014C809F8E543594D6B4814918A129B36FD25015A044E04D3F081D4D201DF86A0FCAFBBFC695088170B8246776B6A28E59449C646D1E706CEA96B12683CD3A7C60459D42989CA46694B0089CF88E9AEC5E110F69FE0E3FE20D18309D1BA72A83A34813B771484505B08548FE5D376AAA0C414260EA4BCE5EB81F6545CD5203026264938905BE1E252574F4B4E71C6E12F99F6EFD35EFFD64183CD0665FE89D6A357B1908E083511DCE2CDF792A608044C31418C433F86719E156AF3FF98D0F54EBEB9F9FBF24588A5557D310EF9D7CF5DD8A68512D8CB15114773C69D7B40C927858AFC049F7C6A89841020E1C313C5C38B988EF505EBE6C15FC1D6CCD8B472F90ED64DA895D06AC01BB99F455A195A670D22DBD5E3F03AC84A08831E9842A566E9785A0FD4C460C5CAC154D705DCE1E7FD1C45BAEB23976AF881CF5628F3CD92AB19BAE8D45A03A859518E4A1E558FAC2B48A432E46CF274E6496B63874CA4E4571132568AA43EEC3D2A3948F40D327976A6D28CD816CFBEAF8FE126913384061D219F51179F679081503371EA0B6BD7E9524B0ECE2573304ECB4A16EB471CA0817C0C6EDE751F283ACEEC5A60C2796C6261FFC6226E4813241619F465DCE67B38E1D5A647B079503144907307C7D6EB6E6EC1936B5C94FCC08A882B4555B19B33A9BF22384DB38473A313966D157DAF8AAD41EF67D3A5FE723559096AB1768FF69773EB9D5C88D6F35F00DFA4473DF71C7E9E35393638DED05D05C105CBF37711D38E3EEE35E8CC0029B3761241FD1E56969E09E949690D4FE25735D774E777A2CA17FE058E14AE6806F611FB1E9FCD516E20499A704B67990716703A4287B50AB45D155D40EDC0AAF97F5B87551C236CEBE9CADD562B27957EAD251F79CAAC6433F228B50167FB1A753306FFF08B53A8A3CECC226857A321700EBE23AB4D6C35415CA79B682D6CFEF6B1341E7CE00CB9870F432B63A2D9A9A43C87D28A95C514582812DA37738BDA6CC76142E08F69EBAA5ACD0403100C2343E2FA088441E9A55C720BB509BC3600C27C1D39157E049650D1749751EFE55A72349E2A5B714556CE2188CE972287BE2152C7E58D3FCAD43A214A4095DE55CAE9F627D8B9018DAA01547842FA1AD14D67327CD47EB9B90CD94AFDF5244DE57E527F17894A410FB4210E06632E88A398400B0AA48CB3FEB9A90ACC668615D193D5A98158092FBB59AD2D6D4FFEE433A2A6A971A228685AE5BBAFB3AB28242C630AF4656C5071C545618A0A765FCE41B19970C2152D44C349D0CDFB29673D1A42FFEC139D1C9958B0962F7B57F80CB8FE6331553B0DF93DA9BFC722B1C001F48FF9C0FEF032610A1118AC9EBAF9202DFFEA605272A50A90768F031C72D570C0AA5B0D4FEE4AD568895274388104C0BF88D03FADC3159D6CF28AC6A7E3E5CF6FE5C6658128CBF81456DB8C29A76F9C75230F3837F1A94CB83C3AAABDF4B29C9045B45AB9552BBB6C0844BF2926267C0D74D3337249D5C9610E0F6FFD0278F12F39C48650C048D61A3FDB8E1A2E08CCCA68803A55B39BD39160B0420CBEAC7D8A55F571F490F694A7AA8B725BA84238EE1E711864AA1F74AFF252C088E36B79B09C80278DD442EAEA8C7D5833CD1BAA18BDD866689E663EADD0EAA6E0C78A3E09DFFE5F6F1F4003DE24336586B25DC5EE45D56F31D8BB2DE31B24E87172F3F1B26D400B08D50FF624E456183F269CBF06B3707260383174FDA152E4D0C528A90C54114C4F278D0FB35B74DD3ECDA14EE89D38E3227A7E18B068F134B22154348867A61719C926EA3320D1BE0B9ED78466B2DED728CA04C15AC144185FB2F5084511A38CFD765659351AC1AC3E5F327D9F3DE9B2B003758DA78DFD08FAEF3625CEDD87C8A55A3CD0257AA71B3788FD2449EFD1F48948CB304468E3CA07EA7044FA185A2B91F9761C6532B9273DB74C66B2DE95AB19E5102CB90C719EC85671E2829B182BB6D09323248D6584F0CA67D422BCDA65A0146D8DF27AB4AE651706D5FA33B5BB88ADC2A1A95105D55CCA8439A5060D110760DEE8B855D0839053BE595278EAE66542736D25C93D8544C6E55ED51AD6E7029C2E6D32CFA8844BC14972809E31754AF84BB479C504EE77CB65CEDDB6BDA613FEAA2AE6598D1F4975D0FCF9D9DC787EEB5C03F8B0BF438E83C38E2195EF1D35D40F5A14E194BC1BCC64D02CA722E7DA28334E91FB6654D708C5B07946CDF58747086EB3CA59D095EB27F1B7E6806D3A35335B2265031A1120F28EED8B4C5D9AF268502727C5D23152149C98E6970D4DCC4B9D0FECFA6A79FEF82CB233E71FC8AA999DF66EBF5A1DB2ED1583C65803FA8958F49890D13BC05C6A991F26C31766BDEF9BAC601A47C8C3C5E395FD8F47E56F04439E9BC8E9B1901A529395F2D57495D70D0712881D298A60E3E013326CD56BF9F1319EA8D6A6511EEFF373F081478A51E14F0AA4A33C6C5EA7816380C8984F7A5DA45B0C4B6B550644E65A5B2DF059ED050936FE6F073B4E8056ACCD3EB65A0B +pk = C06A1F8C8D75915A8ECD5FD416887677BC9E0A774B903887C0A59090FC0981AB0B973F93312F86CF927B5FC5EF02F913303FF3A63D0E260A9649E44FEB4C447E77B6A97572F5763654E6AF725EB41A4EB1218D1E7752D3327BB3F62ACAC5880515 +sk = C06A1F8C8D75915A8ECD5FD416887677BC9E0A774B903887C0A59090FC0981AB0B973F93312F86CF927B5FC5EF02F913303FF3A63D0E260A9649E44FEB4C447E77B6A97572F5763654E6AF725EB41A4EB1218D1E7752D3327BB3F62ACAC588051515A3593204871E539A92A020E20291B3D4C94AE8F278BDE02903000000000000000000000000000000000000000000004EB8019A19E402FD364E7650DF07BD39408A992940171E0860FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11D3118FDAFB54677A982E25C42132B75C043ED1967C43314AFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DF65A561738FD5D379BC3602AE7CB19B15B15B0F5875DB7CAE474501511289A4879AC5B28E0E8680955517403DB8E000F7FB1918D80D5DDCB0CBC996A72A7B31546AD4865840AB30A65BA0F8489ACE9D28BE2477A79939FE6AB1316FBA364B00AFDFC86E876B5EBFDA5D03CB1B75D89C557F995E63EBC85586775CDAE3EFFCB7304949C6A18D326817C490DE4F50890062AC1AD2D6F1E5D782D2DCCCC5526B93C70CAFAD9877C4E272593943C3C2675A9BE47F69D49CA26B37ADC8F0D1A4B100 +smlen = 3458 +sm = 801A07A234AFD9B2594DBDD1C53CC89A75213369FC6970DC7BB182623B6E448AAF379710F31C81EA0A9B95ACA9890A372760D5A41A6EA8DE4F2187E5BC3776B915AA29761AD5D527B182F9A89A8686B7BEEFCE05105BD96B4CA2FCBC32BFF1070404FBEA9631A095CE80E7A19A22CEC7F29EB2EF88B419B84122007BA4CD202964F915EAB6E32BAD10759CFA6E5B308C84FB230056689E76785B005BD64519731BEB8DF7809EDF75F3DC8B08000671E360E6D143193BAD9C3CB1B60D0DEA809AC41ED7270B0001690504DB5C198E7100AD105301A0CDA9F219D9D64F42001515525E8B98C55864849FFC71EBC953F7A0ECA6298F6AA15A83BF6923BD5921B1C86DBBFC544A39C364EF6D9281481E946C994F96829D6639727A5345560D8641E9A510F913F7FE5592C2A40CB278F5AFD8D4504B5387C20945654F08168247A98F56A43A5020955F882D2D93781F4A83676B08F50341E953A5D1B67DE7F6D1BE3D78D5D060AA85B5EE4271763C437CCD595890DBC8FCFAF2754AE9349BA2FDF89847A15188716C0EC672887A4B9A15176AE0C5138819CA232D012BE1DCFFD29F677442083087C127CBD80B0D9CC0962BC8318E734910D1E2653BBF700C84BB0919E12DF331CCDC7128B41F0666F6419AFBADAF673BE16C9177D3CF113C6488504DE088149BFB83EACBBC400309B7AD753F7B2F5AA89F070C9D14C084C32DF91C5F7CB6A7D869D64F4A05AF80A98BE7517ED784C17B0D7DF96B9987B7EA7A398CE018AE6E13E1C0F7AA040AC3FFD273BB9687AD6FEFDB211061A6228967E9DFEF69BCC1C5D02EE56D49A93C8AAD46D08322A2CA246AE8C3EDC071D063AD605A97B8AE94D58E897A4A6310BCBF55B0CAE1AA81769D30B46F883EAF29D4B5FEA32F2DBDE49360CB6235754BDC305ABB5E5395360097378656E2BACE675448889B0149D6086C51E9C3AF07A76563164864F131CF9C0CD475CD4A58726AD237CFB76ACA68032351FB24711DA635871386B4BFC94B0DB6D35F07D0196F75CEDB92EFBE7D653E0FF9326A596F9166FF6CAB73125DAD27F361D6122CA531D86910187E75F849EDB52DB26C96FDF05925DCCA232480D3F979EAB07CCA68FC9069965D12BB666A180989AD1FBEE3FE65E746C5A8F64DAB2E370F0487D001121EDD0D0D760531AF46DA65C75DE11688EBF31DD2AC95C188BCFA07EA798609F3EA8E6364A43742A2825144FAFC05ABD17476480812EB2483734B13D075B3EE3AD510B67CF7057014351B2CE5357E3F12F43BA74CED614BE3A9AC0E26763E9AC596F87AE98F72ABE0DE213A81A9A03E2B82F2312C1A186DFCFC3DB346FEB132931C793ECF837F57D8E326101F59705B77A3083E712CE347C2C29C23468B0C5857EFA410197833987C61ECBC2A855EF78B3D7B1B697AB9844AAD07C4B8EF666BD80DABA5FCAC900C5D358A11676FFC89DFF4F36F29F14D9F9B854DCED41FFC4B36381449D22801C19BF8E8BA1F07A1B38FFB527A34D009C4064A1E606FF2AB90AB2E05C156150EC14D7DC792578A16F46650D0ABB61175D1817E2C38F109EBC01A3ABB358673561691185DA32EEEF566C1BA1C72C1F08CD1B427B552425501B8783116F2EB0CFF73C5D2DEF18D291C106980135821A77428FAB20A935AC8B6DD8EDD1A936225344EB103DE0D5879CCA09359B5B882291C0FB1FCCF167C30DBECFC324AC315713CD10F35B72F0D4871A7CBAA2B4CC2BC2598F23DA607C94A063C9E2013B0EDA5F3BD5AADB2C429177A4BFD7B6181ED5F9A55C1F043DA8155C9E7BEBDA7EA07DEA49938FE07743DF2295C220EB53348310842B1000B7A02AC025C3A94FA82D46ED7E2712DE71B149742731EBE62E225D21A7F29D5F3A8A62B71FE16258570DA412C07CECF82B2064AB5D98761C69FC5E899A8E174875B3179DEAA0BF4A0261DA9BF39148440DCBEB0C887E41FDF751505DE79AA1F8593F45482B659F5B5F4CC3E7BFEE59DEF49458DB195A1A692B8AF4AA44CCFB00B753AC761181B8AAB39DB82385AE776CFC585F7873613B62DE55BB10A6B2F27E631CE41436C3FE390163E6F4EBD6B501519C96C06FADCAC8F75920FE1435542FDF535EAD6C0E3F41345996063B95A208DEFB6F110CC861580979BF4422ED395CA218CFC3B22C0BA8B31CB9EEEB51C3DF35FECE92795CAFB8440F522B44E21B3A18D5CDBC296B887A4B927F36715E4AC2CAB043D8B69A8704D6BE24C725B0C2E814BCA7B040C27FE8F4C14911051039AF13F44E0485EB767F5404CFB6FD19DA24D82FE24B53033C83DD8634E2E28AA330A81F14BAC1C57DEAD7FFE39994D9D094383E14322E146A3DF27A776E2F09A11EC9014C809F8E543594D6B4814918A129B36FD25015A044E04D3F081D4D201DF86A0FCAFBBFC695088170B8246776B6A28E59449C646D1E706CEA96B12683CD3A7C60459D42989CA46694B0089CF88E9AEC5E110F69FE0E3FE20D18309D1BA72A83A34813B771484505B08548FE5D376AAA0C414260EA4BCE5EB81F6545CD5203026264938905BE1E252574F4B4E71C6E12F99F6EFD35EFFD64183CD0665FE89D6A357B1908E083511DCE2CDF792A608044C31418C433F86719E156AF3FF98D0F54EBEB9F9FBF24588A5557D310EF9D7CF5DD8A68512D8CB15114773C69D7B40C927858AFC049F7C6A89841020E1C313C5C38B988EF505EBE6C15FC1D6CCD8B472F90ED64DA895D06AC01BB99F455A195A670D22DBD5E3F03AC84A08831E9842A566E9785A0FD4C460C5CAC154D705DCE1E7FD1C45BAEB23976AF881CF5628F3CD92AB19BAE8D45A03A859518E4A1E558FAC2B48A432E46CF274E6496B63874CA4E4571132568AA43EEC3D2A3948F40D327976A6D28CD816CFBEAF8FE126913384061D219F51179F679081503371EA0B6BD7E9524B0ECE2573304ECB4A16EB471CA0817C0C6EDE751F283ACEEC5A60C2796C6261FFC6226E4813241619F465DCE67B38E1D5A647B079503144907307C7D6EB6E6EC1936B5C94FCC08A882B4555B19B33A9BF22384DB38473A313966D157DAF8AAD41EF67D3A5FE723559096AB1768FF69773EB9D5C88D6F35F00DFA4473DF71C7E9E35393638DED05D05C105CBF37711D38E3EEE35E8CC0029B3761241FD1E56969E09E949690D4FE25735D774E777A2CA17FE058E14AE6806F611FB1E9FCD516E20499A704B67990716703A4287B50AB45D155D40EDC0AAF97F5B87551C236CEBE9CADD562B27957EAD251F79CAAC6433F228B50167FB1A753306FFF08B53A8A3CECC226857A321700EBE23AB4D6C35415CA79B682D6CFEF6B1341E7CE00CB9870F432B63A2D9A9A43C87D28A95C514582812DA37738BDA6CC76142E08F69EBAA5ACD0403100C2343E2FA088441E9A55C720BB509BC3600C27C1D39157E049650D1749751EFE55A72349E2A5B714556CE2188CE972287BE2152C7E58D3FCAD43A214A4095DE55CAE9F627D8B9018DAA01547842FA1AD14D67327CD47EB9B90CD94AFDF5244DE57E527F17894A410FB4210E06632E88A398400B0AA48CB3FEB9A90ACC668615D193D5A98158092FBB59AD2D6D4FFEE433A2A6A971A228685AE5BBAFB3AB28242C630AF4656C5071C545618A0A765FCE41B19970C2152D44C349D0CDFB29673D1A42FFEC139D1C9958B0962F7B57F80CB8FE6331553B0DF93DA9BFC722B1C001F48FF9C0FEF032610A1118AC9EBAF9202DFFEA605272A50A90768F031C72D570C0AA5B0D4FEE4AD568895274388104C0BF88D03FADC3159D6CF28AC6A7E3E5CF6FE5C6658128CBF81456DB8C29A76F9C75230F3837F1A94CB83C3AAABDF4B29C9045B45AB9552BBB6C0844BF2926267C0D74D3337249D5C9610E0F6FFD0278F12F39C48650C048D61A3FDB8E1A2E08CCCA68803A55B39BD39160B0420CBEAC7D8A55F571F490F694A7AA8B725BA84238EE1E711864AA1F74AFF252C088E36B79B09C80278DD442EAEA8C7D5833CD1BAA18BDD866689E663EADD0EAA6E0C78A3E09DFFE5F6F1F4003DE24336586B25DC5EE45D56F31D8BB2DE31B24E87172F3F1B26D400B08D50FF624E456183F269CBF06B3707260383174FDA152E4D0C528A90C54114C4F278D0FB35B74DD3ECDA14EE89D38E3227A7E18B068F134B22154348867A61719C926EA3320D1BE0B9ED78466B2DED728CA04C15AC144185FB2F5084511A38CFD765659351AC1AC3E5F327D9F3DE9B2B003758DA78DFD08FAEF3625CEDD87C8A55A3CD0257AA71B3788FD2449EFD1F48948CB304468E3CA07EA7044FA185A2B91F9761C6532B9273DB74C66B2DE95AB19E5102CB90C719EC85671E2829B182BB6D09323248D6584F0CA67D422BCDA65A0146D8DF27AB4AE651706D5FA33B5BB88ADC2A1A95105D55CCA8439A5060D110760DEE8B855D0839053BE595278EAE66542736D25C93D8544C6E55ED51AD6E7029C2E6D32CFA8844BC14972809E31754AF84BB479C504EE77CB65CEDDB6BDA613FEAA2AE6598D1F4975D0FCF9D9DC787EEB5C03F8B0BF438E83C38E2195EF1D35D40F5A14E194BC1BCC64D02CA722E7DA28334E91FB6654D708C5B07946CDF58747086EB3CA59D095EB27F1B7E6806D3A35335B2265031A1120F28EED8B4C5D9AF268502727C5D23152149C98E6970D4DCC4B9D0FECFA6A79FEF82CB233E71FC8AA999DF66EBF5A1DB2ED1583C65803FA8958F49890D13BC05C6A991F26C31766BDEF9BAC601A47C8C3C5E395FD8F47E56F04439E9BC8E9B1901A529395F2D57495D70D0712881D298A60E3E013326CD56BF9F1319EA8D6A6511EEFF373F081478A51E14F0AA4A33C6C5EA7816380C8984F7A5DA45B0C4B6B550644E65A5B2DF059ED050936FE6F073B4E8056ACCD3EB65A0B + +count = 98 +seed = 6F6E47E8336ADEE99B2C52CF2DC8D461E0A54C3DF2F08199A9F0816AF8455381054CE47A7766726D3AFC2E2F2BEAF8E8 +mlen = 3267 +msg = 00769683FE7BFD74B3ACD21AF3898B74CA73DD126C8315538937CAC4EF0AD4588765A26DCCE1C90C559CE691E7EB3E0A497D357E1AB583C761439C0A66D1164518F01B6894067925753CC2866A91552FCD0EF029C2284C620CAF364DE6C56EB41EE0E4431D9BE22B76451D132A3F9AD91A53449BE820A7ACF56F6ADBC7107C7C729EC8A64FFF6A24B4CF83FF4E945DEF336DBFEA6067FCCBD1CD6B5698ADB1AD6DF03FD0A553457B8E9FEB4A1243FEEFC2DF7F66AE3ECA5BF169F7891ADAEA8D5C59012C7AA00A5A86B0A33D0006F8AD5A01C60ABBDA6D249D3FAC7EBFB85103A3A747A45D0ADB7DEF52ED3A5F1A620EE383A9C0CCE1900E413FC74A7A97646111D54783928B15BCA783D01EFC67F49CE6F781E82D25D3F30561F507E3831CB4EA5B4A08D5489830017270B63D8298BEEBF48EB56BDA5685D5E1E06404EB9A6C3790E9B29C99168B10BADF8FDB03F3C568672773EEC96428149CA272EA5A8083F8208BDCE361E7D40BC4DA75029D4A18B0B6AD615DBF849935D4755CFFD270A52FA290811CD55BDCA38ED89F0066ADB9BA7F58366379FFE1CAF3A9127E147C3AF3DC27279391E0C09537E81E20E7B9FE4FE3DA970FE50BFC96555233CC9E61D3C356AAA8EED5A8AEA2327D7036EE03E7EE40AA35E9DA4544B121514C261EC1CB0B2D75B1D5CE129E47F89825F69BA8254163179FC1331A917AE9C5A18556A10C5F983871B1258CB6FC8AD207F97A220C5598860B6C56F1EFF09DE6000241E901A89E107FEEC15833D34D6EB12DB6B188FAA0B858A5B9E32F84F783B43B6F8A3B2E4B044CFF8902E1EB0C527BB4E29C92ACC9DC7E0D9AC6B3A021415768B21DD9695983EE89C871C0EADE0BCE4FB72E682DFB5A2BB7498BF4D2C01240F67D1B62BAA4E587069C16E3032114B14A1C4288FEBAEBB4C75C3C05924A358C4BB7DF95ECF81D67147FAE3F605EDE61B7BA164EBA1AB36ECE97DB0ECB32A673E899B24557D8987AF3ADC57A9DA609914C9B2D6D8AC58E5954E0DB5AA9E75B444700B8F704E15A6A7BBA81809FA8801C6CEB5747A44CEB8F99CFE6D8A2A03C03451E5F3D392725207F3DD28B2C00004425B7AE05FA3769183AB60857B27AB08BCC4321D293C93D1D850D4E7A81B14564D7B15AC0E3BC1BFE0561622C6AA06923EEFE163629EDE8BA1732DBFCAD52D3BAA6E11E569EA790B36A8472B2CA37BD5C0EDD37D8F164B874952D00D592FB705C6B3110A12B03829C157191D33C579593E7828CDA5C24A284BA2F5A42F0BFA601A8F6D3DB1CA6D703ECBD261629C9F96EBC0458737B9951219E5B1F86192E2A85B47D80610A0ACC8B1A70DB2916F89CDB2C7F8943471DDBABD2A3536C5DC8A73CDEDDEAAEDC86FA148D2EE479F8465558852FCBEA0DD8017F1B976281A5014319C2C3CACCBF571D9550215B24134F6DAEF32716802E7945CB3F97AFC1AB1DA17D0C41B545A750EF345A6F88AD5FF52D512AFA6558335B5EB8979D8E6DC1DA562BB997E7D152D9FA3EAA09119C3474E11218230D8A56C19AD87FDE483FBD6DDDE9ACBA813BEBC8505A323C601E5B5251650DAE9334562E3DCC38A28BD7DED6942D0CC2014235C1B66CF4A57BA3010B83CC7050309F57A27207512D195D070DB3D10FFCBACDB47E4231142BAE588F92C5B0A71ABD67CA9390C2E05FD2CF7A1FABB14C5A7AE3773C66DB1F055214479E388B5E6ABF0DF8FD1B0E4F90828ACC397643CBC274143FB4331262A20634877BE4C7489C1AE9EAF90BB2A177A6B5AC15CBDA27DA0616E5F87461554F5686A7BD6D047AD0B98C8CDEA3DB78DD2970C78FB861F2A92DDC277876791C4A30F525659557831F4377065D19ACB384CC68340152A6DE6D84CDB58F433923D1FB8CC6B10BACD95B9AB1B45563998620D192032269FA8301C09A29C4B5B20CA0A3D63A4F5984B7DB0F5B17417DC7B939B9B177BF423E2F3D57DFF296E6E4FF0FB1744B13731206EAD54EF0AA1DA09BEA8B0AC0EF71B73D009D30531DE9FDE90D86BF5F20D8E5A9E324E657A98F8C0031ADAC4385157BA4E28B48AED957A5B36C3B49057F8ECA7F56808F794014DAD170601070607010E004F42D01CC63B2A1761126BA045F1165E25FDD05901FAC6B76E777FAAAEE6F5ED94302E2DA28046B4BC60228E1B9E194F364E377F84681B3011583554B76FBF8D7456DBDEA665ADAD6AA0556C8CC714F217A518A98615C4C1CFC8ADBBD4D12C5BC23AD7A0F849E32FE2005334B55D7BCB43D1C95D4793E7C3882740CDE8DD24B367294496A3E2F3251A66CDAECE9E0A73D853F8D4E3A4637836DED68CB28BA4FCAB02D61FB5CFA581792E636217F3238D78912EA0863816FFB2F388823174B19433C2B14BAB69E12C3B791FE683744D4519455A52555AF0D7E12749F6094AFDBA00FC6A609C7578C531FC4C3C3065EBF78414F112014726EC2230F9BCD9C15E36283144CCBE0D1785B65CF49BA8FEFE92EB6907C0330BC98AC172EA9E8DD4DF8974DD6B6772BBC6CA8E8562C5EC0B6592DE7440AC915C35E0AC8087F22EBA110CA3037B469B1D5BC92636D81881E38D8BBED01A29B3EBCF0C19EB95BF999EB848022592AEAAB649CE19824ED9D3A32D75FBA556EE07606A306D1FCEC2E24B38274C361B7BC96CE37B7F4FE434EBA17AC2A097051A92E4EC32E4C678F7762E8B96EBFD2600C0F224B04B2CD7E9F4AD327D53603828015E9CF45969800F02FA5E0BA26B8C844BA1FDFFDE44303AD0389C1B31D582877CA6BFAD4973BA35FBB90ECDD95F430078BC39AA89434130A5FB8321E51F9624090D0277A9F112EE8FF65D3DBA999C7C08727D0F08DCF00CE22F62C955D6A822F247C8065AB94AC442E1CB5F31254816794CC2556891A523B8AEF09D3B9E07AA8B67B3B87567ADEBDBDFB93BA9A082F72052572C97E73AF16CFC42D2A51A3683F84748A338AAB56264753BA4083D356A27C71F47221ED8340C50AFD46CD207C4F9634AB5A44888A4234770C46232C35EFF83FA950B0A6879137DCE209D5A1F26809B411F046F51FF084F15BFE03292EE845D3044235ADBC299925235462E67F803DAA1426F0E116B93F4532DD2784F7F87AE360281CE21F70D230C242E1A98DE8FE1D6147AD71EDEC89E24A5980C45FD91E23516758AF71DF8E0DD96929D4DA61A3BAEABB96C9378986DEB4C9101175E3AF1E102B52A8DA27D916EE4A28263CA485CFE87EE5436249C1A2F933669F6E3274E9BD93092F4A798AE85D6592EBB54DC65C28BA08582E275972B0A12C22A7792CCFD4A398E504C6FB2CF5EF1F9C268540B4FD7D07D59C49A559D86A56A009C4C18A3FCECA109FC7A45C6E842ABC22053E84878C4805D96AC96BA00FA40FC3B50407141105845055447CA94BD27F234183C2B8BF37F5CD249ED0705AFAEAE59C8BE8F6B38069D67FB23F74284E8185C176B58B482900A3E09774383C7ECACF4FE5E580DF99DB102AD4018DB73C73A635D3FCDC833B000C948D846AACC92ED54FFB3ACAE1BFE205D6B2312658F15DECFA085D13BC3757C754C5704D8089563E0CCF52B04A49DF293CAFBBC2FED5D9551B5A3897EC7BEAA56A4034BEDCEB4840A9BDFBB8BF47D66DD3A4E3EB1666372C6B2C39A48D52761BD36403CB130A087685E2EABB8711C11005EA09F90AC49665415C56CAB6FD2719C45B6800DF914F8FF327EED29D9B9A5BBD6B80B8BB31AD1522803B2C8D89166D5C6B2ED47BC5BBBC4ABE6709D46B856AB81DDF15F098A9AB76A8257E7E5C2E7DAE53FBD691736F0D6BAFE0BB939172614E99C7D7E37754AF6C3C637D076A43DBD70E5EAE910C8170CECFF1621E382D2977635B67F4FAC555419F8A0BB76CCAEAEF4C7385D293C9595AE10E5201C4A31B4C3ECB9F3B304EFB1886F9C58A4EF04E73341B95D9BDB85D706B2A8D3FDD153743A8BB7B3289D0FE79F6A3B9E0FE160DD6700FD64FC87D9AC96858A6D395FEF6F3D2193EBAE7C3A92E18746A7F12B244FBC5B1DF0086CC7045036519D9D7BF8E92B850EA0D3D1E775DEA362362462DEA2D3501D39203E2879070D1F7AC92FA1576F6D12886D5B979E3C788C09A769EF4EE45E14CD8E7553EBEEFCD31FF3D43D4988DB08F6630BA8AE8C7250AC42A3D78EDB967D59310A4A224567D8797C42370CBD2302A3F49ABEAF85FAD9455F98B61EF2B5E34A5C552583872145E191BBFFCAA526F5E38E497A1A1E1220A0F283A935ECD366A9069D5A2A80BABA3A22FA85A2557DB72D7E29EB4E33E8ED8BB4EC2EC7C2E9CEDEF46EA955834ACF8C9AB23B78052446FD73C9D61683D7FA0088DB97D07CC350AF0B6B2AD7E66A493AF814C11F8C0F2FDF0DF40AAFD0D218C00319C367E98D7F10C74EA06D31276F3F216E1CB2F12033915008CC83B00AC60FC9C2FB7F97D6E8CD79650D0F9D82BFD9CAFEF668021D3D165F3FE84221998BC8C29AEA0B5B7E0F1F25A0D7447E806CC3FC39E6038BE3DF9AC01F46222D3A609F8A026744AB4F58A734E3782BEC301EA91F2D8E2242D04A11E82474002143223F29656B1A7675AA5AD181004C4F1381DF6A0F95A0186E82C04B4DE881209E9CCCA3EE5B1DEF0B02353738D92A07314403A1A2721C256121FBA8B8CE9B460 +pk = 12812B71758DB5FF7B4E9D23C212BF12A3E034897F8A863B02D84AE66F9B97FE3A2261DE981FE94DF2D657A647D65A094718FB8321BA7A1CD723CD54E3CA7E55E328A7A68DA5890DA570F6FD7A3DCD0C0839E674DD24D302D7A6278773E5193A0D +sk = 12812B71758DB5FF7B4E9D23C212BF12A3E034897F8A863B02D84AE66F9B97FE3A2261DE981FE94DF2D657A647D65A094718FB8321BA7A1CD723CD54E3CA7E55E328A7A68DA5890DA570F6FD7A3DCD0C0839E674DD24D302D7A6278773E5193A0D0F9E99FBAA399FB65AAEA9B665E9D5D8E8B51E6483B41EF54807000000000000000000000000000000000000000000001692BCDE7AA173123FFC635B637E71F25377B6F4827E908D65FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBC128A6251B21F8743531AC52CA23E9119A6FBC36FB072F86FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CE6150485DC3788DBF16DDA4D726A07D972732BED40CFE3E118382E720FFA47EED3405672ABF66490F40C8DF64077800277DF6A9284ECF89BCB666ADC0C20DBF702D093D71206A66E60B568AB894C573662533C124CF731FB4BBE9DE2DD82100BB806592AD66C566B7963E1B17E5A2C55EB0E744FEC639AFD6E29E424A2C637D5489A310B38AF5A39BC79BA40A0AD90001B88126D9EE144273578773FD01E57BD8DCC3283FF2A7746DDBAA5E95E0A721334AA736C79DF1262F321D0B733DBD00 +smlen = 3491 +sm = 0CACDB81744460787779C56A6233AC5740E24B18C197E108CA155428F2437AD2838FBF7761F62C0A379525EC0840E03154FE62CAF75C9A9C559C5BD4E2E3810814897FACE11DEB7CFE14A0464ECA04121A9743E61986DB672C1E1F24DD5EED3100004265A8E60E0B33760828E3BE4BACA44FB3BA172C7AC61C0A016D7D769EC21F79421A3734A37E0263B37A1DA37C1D426D4E02EFB1BA9AF2EBAE0CC91CE9758BFC94D500BE5958514DBE3C01A5EFCEFECCA74852824E9C7F4E9CED80D51B2F127C7903370119F92D6AB43795DC7473C47AAF764CD093AABD77C25A2D000D0200769683FE7BFD74B3ACD21AF3898B74CA73DD126C8315538937CAC4EF0AD4588765A26DCCE1C90C559CE691E7EB3E0A497D357E1AB583C761439C0A66D1164518F01B6894067925753CC2866A91552FCD0EF029C2284C620CAF364DE6C56EB41EE0E4431D9BE22B76451D132A3F9AD91A53449BE820A7ACF56F6ADBC7107C7C729EC8A64FFF6A24B4CF83FF4E945DEF336DBFEA6067FCCBD1CD6B5698ADB1AD6DF03FD0A553457B8E9FEB4A1243FEEFC2DF7F66AE3ECA5BF169F7891ADAEA8D5C59012C7AA00A5A86B0A33D0006F8AD5A01C60ABBDA6D249D3FAC7EBFB85103A3A747A45D0ADB7DEF52ED3A5F1A620EE383A9C0CCE1900E413FC74A7A97646111D54783928B15BCA783D01EFC67F49CE6F781E82D25D3F30561F507E3831CB4EA5B4A08D5489830017270B63D8298BEEBF48EB56BDA5685D5E1E06404EB9A6C3790E9B29C99168B10BADF8FDB03F3C568672773EEC96428149CA272EA5A8083F8208BDCE361E7D40BC4DA75029D4A18B0B6AD615DBF849935D4755CFFD270A52FA290811CD55BDCA38ED89F0066ADB9BA7F58366379FFE1CAF3A9127E147C3AF3DC27279391E0C09537E81E20E7B9FE4FE3DA970FE50BFC96555233CC9E61D3C356AAA8EED5A8AEA2327D7036EE03E7EE40AA35E9DA4544B121514C261EC1CB0B2D75B1D5CE129E47F89825F69BA8254163179FC1331A917AE9C5A18556A10C5F983871B1258CB6FC8AD207F97A220C5598860B6C56F1EFF09DE6000241E901A89E107FEEC15833D34D6EB12DB6B188FAA0B858A5B9E32F84F783B43B6F8A3B2E4B044CFF8902E1EB0C527BB4E29C92ACC9DC7E0D9AC6B3A021415768B21DD9695983EE89C871C0EADE0BCE4FB72E682DFB5A2BB7498BF4D2C01240F67D1B62BAA4E587069C16E3032114B14A1C4288FEBAEBB4C75C3C05924A358C4BB7DF95ECF81D67147FAE3F605EDE61B7BA164EBA1AB36ECE97DB0ECB32A673E899B24557D8987AF3ADC57A9DA609914C9B2D6D8AC58E5954E0DB5AA9E75B444700B8F704E15A6A7BBA81809FA8801C6CEB5747A44CEB8F99CFE6D8A2A03C03451E5F3D392725207F3DD28B2C00004425B7AE05FA3769183AB60857B27AB08BCC4321D293C93D1D850D4E7A81B14564D7B15AC0E3BC1BFE0561622C6AA06923EEFE163629EDE8BA1732DBFCAD52D3BAA6E11E569EA790B36A8472B2CA37BD5C0EDD37D8F164B874952D00D592FB705C6B3110A12B03829C157191D33C579593E7828CDA5C24A284BA2F5A42F0BFA601A8F6D3DB1CA6D703ECBD261629C9F96EBC0458737B9951219E5B1F86192E2A85B47D80610A0ACC8B1A70DB2916F89CDB2C7F8943471DDBABD2A3536C5DC8A73CDEDDEAAEDC86FA148D2EE479F8465558852FCBEA0DD8017F1B976281A5014319C2C3CACCBF571D9550215B24134F6DAEF32716802E7945CB3F97AFC1AB1DA17D0C41B545A750EF345A6F88AD5FF52D512AFA6558335B5EB8979D8E6DC1DA562BB997E7D152D9FA3EAA09119C3474E11218230D8A56C19AD87FDE483FBD6DDDE9ACBA813BEBC8505A323C601E5B5251650DAE9334562E3DCC38A28BD7DED6942D0CC2014235C1B66CF4A57BA3010B83CC7050309F57A27207512D195D070DB3D10FFCBACDB47E4231142BAE588F92C5B0A71ABD67CA9390C2E05FD2CF7A1FABB14C5A7AE3773C66DB1F055214479E388B5E6ABF0DF8FD1B0E4F90828ACC397643CBC274143FB4331262A20634877BE4C7489C1AE9EAF90BB2A177A6B5AC15CBDA27DA0616E5F87461554F5686A7BD6D047AD0B98C8CDEA3DB78DD2970C78FB861F2A92DDC277876791C4A30F525659557831F4377065D19ACB384CC68340152A6DE6D84CDB58F433923D1FB8CC6B10BACD95B9AB1B45563998620D192032269FA8301C09A29C4B5B20CA0A3D63A4F5984B7DB0F5B17417DC7B939B9B177BF423E2F3D57DFF296E6E4FF0FB1744B13731206EAD54EF0AA1DA09BEA8B0AC0EF71B73D009D30531DE9FDE90D86BF5F20D8E5A9E324E657A98F8C0031ADAC4385157BA4E28B48AED957A5B36C3B49057F8ECA7F56808F794014DAD170601070607010E004F42D01CC63B2A1761126BA045F1165E25FDD05901FAC6B76E777FAAAEE6F5ED94302E2DA28046B4BC60228E1B9E194F364E377F84681B3011583554B76FBF8D7456DBDEA665ADAD6AA0556C8CC714F217A518A98615C4C1CFC8ADBBD4D12C5BC23AD7A0F849E32FE2005334B55D7BCB43D1C95D4793E7C3882740CDE8DD24B367294496A3E2F3251A66CDAECE9E0A73D853F8D4E3A4637836DED68CB28BA4FCAB02D61FB5CFA581792E636217F3238D78912EA0863816FFB2F388823174B19433C2B14BAB69E12C3B791FE683744D4519455A52555AF0D7E12749F6094AFDBA00FC6A609C7578C531FC4C3C3065EBF78414F112014726EC2230F9BCD9C15E36283144CCBE0D1785B65CF49BA8FEFE92EB6907C0330BC98AC172EA9E8DD4DF8974DD6B6772BBC6CA8E8562C5EC0B6592DE7440AC915C35E0AC8087F22EBA110CA3037B469B1D5BC92636D81881E38D8BBED01A29B3EBCF0C19EB95BF999EB848022592AEAAB649CE19824ED9D3A32D75FBA556EE07606A306D1FCEC2E24B38274C361B7BC96CE37B7F4FE434EBA17AC2A097051A92E4EC32E4C678F7762E8B96EBFD2600C0F224B04B2CD7E9F4AD327D53603828015E9CF45969800F02FA5E0BA26B8C844BA1FDFFDE44303AD0389C1B31D582877CA6BFAD4973BA35FBB90ECDD95F430078BC39AA89434130A5FB8321E51F9624090D0277A9F112EE8FF65D3DBA999C7C08727D0F08DCF00CE22F62C955D6A822F247C8065AB94AC442E1CB5F31254816794CC2556891A523B8AEF09D3B9E07AA8B67B3B87567ADEBDBDFB93BA9A082F72052572C97E73AF16CFC42D2A51A3683F84748A338AAB56264753BA4083D356A27C71F47221ED8340C50AFD46CD207C4F9634AB5A44888A4234770C46232C35EFF83FA950B0A6879137DCE209D5A1F26809B411F046F51FF084F15BFE03292EE845D3044235ADBC299925235462E67F803DAA1426F0E116B93F4532DD2784F7F87AE360281CE21F70D230C242E1A98DE8FE1D6147AD71EDEC89E24A5980C45FD91E23516758AF71DF8E0DD96929D4DA61A3BAEABB96C9378986DEB4C9101175E3AF1E102B52A8DA27D916EE4A28263CA485CFE87EE5436249C1A2F933669F6E3274E9BD93092F4A798AE85D6592EBB54DC65C28BA08582E275972B0A12C22A7792CCFD4A398E504C6FB2CF5EF1F9C268540B4FD7D07D59C49A559D86A56A009C4C18A3FCECA109FC7A45C6E842ABC22053E84878C4805D96AC96BA00FA40FC3B50407141105845055447CA94BD27F234183C2B8BF37F5CD249ED0705AFAEAE59C8BE8F6B38069D67FB23F74284E8185C176B58B482900A3E09774383C7ECACF4FE5E580DF99DB102AD4018DB73C73A635D3FCDC833B000C948D846AACC92ED54FFB3ACAE1BFE205D6B2312658F15DECFA085D13BC3757C754C5704D8089563E0CCF52B04A49DF293CAFBBC2FED5D9551B5A3897EC7BEAA56A4034BEDCEB4840A9BDFBB8BF47D66DD3A4E3EB1666372C6B2C39A48D52761BD36403CB130A087685E2EABB8711C11005EA09F90AC49665415C56CAB6FD2719C45B6800DF914F8FF327EED29D9B9A5BBD6B80B8BB31AD1522803B2C8D89166D5C6B2ED47BC5BBBC4ABE6709D46B856AB81DDF15F098A9AB76A8257E7E5C2E7DAE53FBD691736F0D6BAFE0BB939172614E99C7D7E37754AF6C3C637D076A43DBD70E5EAE910C8170CECFF1621E382D2977635B67F4FAC555419F8A0BB76CCAEAEF4C7385D293C9595AE10E5201C4A31B4C3ECB9F3B304EFB1886F9C58A4EF04E73341B95D9BDB85D706B2A8D3FDD153743A8BB7B3289D0FE79F6A3B9E0FE160DD6700FD64FC87D9AC96858A6D395FEF6F3D2193EBAE7C3A92E18746A7F12B244FBC5B1DF0086CC7045036519D9D7BF8E92B850EA0D3D1E775DEA362362462DEA2D3501D39203E2879070D1F7AC92FA1576F6D12886D5B979E3C788C09A769EF4EE45E14CD8E7553EBEEFCD31FF3D43D4988DB08F6630BA8AE8C7250AC42A3D78EDB967D59310A4A224567D8797C42370CBD2302A3F49ABEAF85FAD9455F98B61EF2B5E34A5C552583872145E191BBFFCAA526F5E38E497A1A1E1220A0F283A935ECD366A9069D5A2A80BABA3A22FA85A2557DB72D7E29EB4E33E8ED8BB4EC2EC7C2E9CEDEF46EA955834ACF8C9AB23B78052446FD73C9D61683D7FA0088DB97D07CC350AF0B6B2AD7E66A493AF814C11F8C0F2FDF0DF40AAFD0D218C00319C367E98D7F10C74EA06D31276F3F216E1CB2F12033915008CC83B00AC60FC9C2FB7F97D6E8CD79650D0F9D82BFD9CAFEF668021D3D165F3FE84221998BC8C29AEA0B5B7E0F1F25A0D7447E806CC3FC39E6038BE3DF9AC01F46222D3A609F8A026744AB4F58A734E3782BEC301EA91F2D8E2242D04A11E82474002143223F29656B1A7675AA5AD181004C4F1381DF6A0F95A0186E82C04B4DE881209E9CCCA3EE5B1DEF0B02353738D92A07314403A1A2721C256121FBA8B8CE9B460 + +count = 99 +seed = CB2E6226615393FC3BD4AB3A412AAA030AAD40E8648EE6B56D2C1591D8B97915D88F2D22F7221377B4B04CF2AE9ECC4E +mlen = 3300 +msg = D21A6BB3A2356805E678673C45FB055FC5266E3F692AF9935AEA307F14A5C41B979966A5DFE42EBFED1487E4822B74AB5AF28995E085EC8007ECA4977C63EE5299FEC63DCCBC42EEACAB488E574249E9D856146750AD97C8A443485EC1C5820BEB0964640010F6407140791E74684DBB91052E2D8BEF7BDCD78B2EC03C97A53295D683BDBE32A70DC19A2F75B8613AEA9616AE0E280179492820F73FB7FA4121E673FB5C328F41B67FF8FFA7AEE6564ADABA046D6E1D6AA13FB24965390F829246DFA8763851405075F76CF94C66FFC3308214DF0960C649AAEDC22926CE9357D3875F8B71D68D75999AA3663C30A9EDF07228BF7DFF49EC1E6C7A33D2053597003B82392E826EBD701B4C981AAAC9951C79E08F592C2C0637C8E5A7F9DCDA599E859C317D4888B4098992E0E2D979E41C703686D577E5BA6001EC4F587140711293D664963632F87EA0461E0E0C5E9D8D292FB409F9F9AB172EE17FC8AFABAD06E42B437CE22924EB5DBD3A80A06962F3B37946259F9C75A233CB2B4ABDC5CD1B648FAEB1BE8630DB40D151B8FBA693DF2C5BDCAA14DC4783F450B6BC407515CEEBC5C9A47BD1A141384F0B596CAB1135C075651CBA989C190F3171DC1D72330EDAA01656813C4B7811715060B023FC426745C301B2A91E0D08ED3BDED438C4CE6799C35F3981C882A0BDE4A2FEEB1A52CAFA47B0C48558FC43F98FE08F03A71128362BB6FB9DA6A22249F4D4352AE7D3DAE85DE497E2411EADCFE5BF1A3C075C45811E0097ECEA255FE15BD8321FE8B546A8CACFB899EECF5419DB363C7567C2FE7360B36DE14674F500A31D3EEC71451A7C0D5576A8939C0F6D4D9F2F03F3C516CE25CE73ABB35C73AA94F6AEFAE6AD87052D6B195FA43586817F5BB974AAE7F1B8608922411AA5B0D7D574016CBD3DED13395623470A108FA0E1D3F9FAA7E1E5031843F2A23DBCE8B196315290DEA5795E4115D53DC570A444064CFA3C9457DBF3EE323B1966ECD2270C32910F8F430522471258A1F1955A6E1DD8C84ED9A566499BF85628615351ABE84B401421DA2CFAF575E2644C9304C075ECFC374066CEC713FA4C0D89043689FBC59FF54B8F97EE0A3B0989BC5E4EF83CC9833E75BC8B67BB5EE3C06EA156611CDA95A6702416807530EA206ED89835D20805EA988B1958569CDF7F809996214DADAB4E20BD44917E3410EC6BEAC98FEA07F764E85B66AED5E17CF675D2ED8E63DB728FE75158CB31779E31379648B43D68CCFF3780854CF03535C57122019456E73CF06769BF1FBF558542241CE665BD10F921828553585E0CF664CDC6160F9C47FA5330591B74194F4716056CA83993EFEC4A52DB9A1FBD3B2F504AC19667325167407375B6D7DE739F07947B511C8D475744E5C29D6E286A37F1FF8317BD0178F0E306A38FA6E75F4A80427FEB2C91235D3E7F20D8101CFC03BB73F44EF59AF3526E9AFC580027A1DADE37654238B8EC7AF0105248FE30784A88B72E11FC1BD807E47A349BD29075BEFBB29730EF8E85E3ABD5105559BACEE74AA27D90D360A8D629DBEC95EB34C7F7CA20096FF7B521E40D3944A975436896F372EEAB6B8615EB91697965BBF955779DD3047F7E3BF029E3509A5780247445D6223D085AFB4291D976EFADC41E42DC2C0728D18F6155654A332FEC72EB6AEF8B92C1D177E3DC28C31971BCAFF76DDEBFD9588BC244B116D409E58DC5ADA1648663D603C47FAEB814AAA7EB9B6264356F926C18B9357BF426B89DDC8EB9177ECEB5C6CDC64DD8FEB7B326BC1BA89BD9035235DA0E644EF959C58DD97B88D5C749B36931AC2694C67151DB0894652E99254222D37CEFE9E27B3DD663A152DBE29A3639AFE42F4578937076180563AAD6AD739255EA012A17D2A56627D84C44FBAB261D392A966CFE19278799CF1634D42384323C496190D4B9FB662694E3887EA66AB9E8B195488C8DCA47C8BC0424247759137CFBF86DEDC3641904CB6FACBB30A9FA84ACF69A67B4AFDF4C2AA420FC0D90CEFA0DFBBCD3072D9F772FD6058E2BF0E251BE93B00DC43765B53DB51B22F12D3ED0CC5655E4AEBD9D923F99A43E4461DCF5992030E66A1CDC3A65558D9BB3A39788D92328387D144850DD3706FD7A079E3D2398F542F91A8AAABF0C5068DBAF1FCC5160398ABECF74884BEB04F3A3EA38BBB80D798F5981B3F2DB6C7B33F867B7DC06A4417E30F94CDB4F523AEEA0BE12BD75AAED57520DB0D4B4F013BE3A1DC7AE5C58FD1DE9637F7D82F697B7E92DA427A78FEEC6A5C0255EB57A43DEA6CEBC8805BC04E04FE789E222B1E2642D26EDC14FB36ECC6092B3060E45EED6C5B35DE8741F72933930ECBD7338CF39474122357365700CB50C5EB176FB92814FA7F4032570CCEE6B859236AD5DA5F1730129EDC7BE218BA9874620F6F0EBC45E0BD622F8FD1AE6974994AF95C6519EC1C46650C073D194FA6EBC62F405F63A3416782A47872C7D77D648D0A1C802FFDFDE5FDC112C94CFC68F401889EFC522FE488FDB5384C0D93147AB6587659D936F98ECFBCDCFBF8B352D605F18C855E2559743ED97991C5D50DF44A7B929303835654A3955ABC5BEE6327400A7CCCE460B318D8B5ECE5B12F606ADB3D7B5ED59563B8E675E78029AABC234442C2463256FE02B04F556DA35C4615D14A9F4EFF17DB0DB81DE4BDD894F6628A120BE2D4CF3E1F46D53817899657035A76137E23C0B0E8DDD29465D7F15628FD435E6CAACA4194FDBF85FDCC31D5DAFCB52568B7C0CFBE713BC85FA424BA3ABE149E4035FC86807A8B876D2163B447CAD5EC0E6EF38A1D591AFB46267F9DBF142CAB1CAC1F73BEBA212992FC6D4647EC17848D1ADBB1901277A5078DD72D9C9184E893C0806E9B4AFF0A824670D438620F2A7E8D2965B619D291E5824C014FC888A36FBBE17356431F0039038F9B497902AED969F9C488390B7087763638E976801127BAF1F53803C4DC9649F0EE85D67B239E2BDAFB2BD75F1D1DA22A56FB3AF10A9DDE7AD306C4AF8681029316C0E1949228E6BF5ADF942F1C0EF92B2BCBC0C70D49E5808851444240A78B14D21B54F66271482F49B85F5180B268050327368496CFA8B54ECB97EE6D28EB74A3742F68583DA046809002C22F7B31FBC0566969F9A15CDCA892C4BEB101A2AC3526C76E9D30982C9B4893450FDEC4001D2431828D24D8B1A67DF80E2E10ED2EA8D723227055C48006665F7DA8E032EFDC70BC7EEB2B369B551FAC542AD6DF1A23107E2B3C0E3CCACC25F26404C085CBF56E52D35D7948DB9FDA6DFC24709994719D8CED41A2CC9B3C4B2BEF0967CB71861CF0E6AEA9BEC9395726AA0E2F1A7247ED0F6038E3DF4BF566786073590DCF97F8F0A99658D8F630A2D130C46CF4D26C669360D0F70B75F904C9F923AB285D5DB129F6C25AD21F9E26AC844D07A8EED86C4E224EBFC5B3F720D6F94B0A01B1433C46B40CF84E80F7A6AFA7BB8F9ACF818AD3CAB2DDD6904C067BEA4F1FE79B83CB0AA8FC75B6B096BAD6FE94ABFD48F8EFC0F2B9A02EBDA8FDBDBE1C77F1854EDBA18AAE7F31CED9CD34C1B355108DF18A8953932F7554AF05B203A96A9BB93E0EFF51D7F93B56E351562CF85A2D35EAE2C2427B89A8662A1C723D4F14E6EAFDBD636C2BB7ADE29C1A6BC8A463734C808BEC68B1E9A31AF6E29B412F1CB8C90A9911AC5C3EA71E46113D2D7B1AE2D8802B06A770FD0E9E4652895E42181AD09BB541E9493F258711BB7BEDD3E7CA8B8CE875669CF80A6880ECA3F13800DE7011EA67F443E505C4FB455608AE586F922B3C83FD33B306BDEDB86223C33E3AA65EDC93CBCF3A03ADAF9F328997951D59A9200C0BA2618E3596AF176B43122CEDC52B1E006EA6D12DC236A6FCD7CC46825F2EF7ED71683A731D746FFF2FE54E0B392A8CBFA38873196BB2B835DCA7CB7C3ED9A004C7A329B9734A111744BDACDB669E69E9DF1E52F07C513E3752A0CCD81D7DDC4A64868B7BB2BBBD2095373480522BE10615248A179DCB61DAC90F7FA5FA9B84F190A9C62B5FF9CD473A940F03E7107157D7EB60AF1E3E384FFE8A67DCB2389B3B0FAB7C789CF100CA95CD6A85442CB9A2C243FB9D454B20BAE5762D72B8FE79B4DF81163D61DE4578CF976992D8B9989FC68089F811F53DB1E1092B60220552876B818BEA981571898CD6AB7B5F13C46B0A076526E3241D65014F855EFD7BDE08AD91F259DCB64E94EC3DAD97811EB024EE1D341521DC92AE5E93C73422088976F2D27D64E1D193B955E6736AD2BCCF3C1A53D590576434ACBC0B687F27F255FEF354E68ACA47160EFA7126F908E08E4548C11546D9C412D685FA84D2EB4DCB2BDFC48E2FA8023548198EBB072A48044F4391143E3BEF4FF9066A4B0D03ADC826819D67588BA84F99DA27424103652ACC039DDD3B567851CD78E4117A8B93AFE01FC8EEBDAA1ACB8BA9D095789E76B9D5AB9EE177A15D666EF171FE1D4BDCCFE2E58CE669B561F63028C6CE26DB5C8182FE048680B175C7AB407215FF3A7801C950D509867AB1B0BEF89B3E38A387915225EDE76F91AAD15A85D8C46EFD588BB3BAACBC52C036211512473420F3F061F5F53E9353DE0780425745A76439B3811511C86CA503251F24113384E1A24A9367536E796CE08B896F572489A2339E82A856C +pk = 97B2491418546F83BA265558C1760B3A99D75B07E92911FAAB0C9E5C4C3BD5FC124D06C1279C79CD2DFE9BD5631F3A40E1DB911150909AAA6FFE0F15EA7A3BF99BD551D43E59EA73B18AD127338384EFF63FCAA1BF5470E28E6D25A92E48A91215 +sk = 97B2491418546F83BA265558C1760B3A99D75B07E92911FAAB0C9E5C4C3BD5FC124D06C1279C79CD2DFE9BD5631F3A40E1DB911150909AAA6FFE0F15EA7A3BF99BD551D43E59EA73B18AD127338384EFF63FCAA1BF5470E28E6D25A92E48A91215EDF23496BBB842D9B349A449648CDF5ABE415D32DCE428F0810E00000000000000000000000000000000000000000000F443D064BFC3BF1B04DC4C36C849DC2CB0DD786C288FE0CE2FF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7580B476E97C7A9010BB1850C1B9952D713FD1ECE1C927639FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091ECD973D130905F45B7F4F16C3F8E23E2E4B1F3984EC43E899ABB35C67771D14E1AC9980522D4797BB4C5FB22FE6400714E99F82044CAE74CF31B92EA7D21EBA52DEE208D3BC30E02DF152EF9528C093CE1E5AC7FB386E0D501AFE0803B57001C142C0CDA1456C5D54A8D2570B1CAB3BD0D825763936D0CF033E3D3E9C17CA1D2EFADF81C2DD96F2DAE700295AEA40039A984EFE4C8B9D39065ECD561B7DEA190A712AD85076E3DB7DC1A78D196DDF93847693701D53B626E16397F4B91EF00 +smlen = 3524 +sm = 395065FC036D268F8670C464031BD1C6B09234D88E8C03ACF55D46506CE9A46AD40F528843C411D8898DBF64973DD005D92CEC02E43F6F209108C30CB6CD7E05884AA6CCFD81BA271812AE37A79E823EF535EF92FB20A484FA609B266133092E0001636EA19FDA9113BF7E808409700879AC580753FFB9207B6E039AA07D0C58FB9248713E13F861838B392175FCA7DEF10D750341DEC723B607130DBC72C9FB71FBA306A6C908395EDB25D50388CDED7A0343F664B8F89786E549C0928A371A0F31B3C3D50203E4232FB30FD90C891680DF29B31EC40D4A9FCC8AC23A000204D21A6BB3A2356805E678673C45FB055FC5266E3F692AF9935AEA307F14A5C41B979966A5DFE42EBFED1487E4822B74AB5AF28995E085EC8007ECA4977C63EE5299FEC63DCCBC42EEACAB488E574249E9D856146750AD97C8A443485EC1C5820BEB0964640010F6407140791E74684DBB91052E2D8BEF7BDCD78B2EC03C97A53295D683BDBE32A70DC19A2F75B8613AEA9616AE0E280179492820F73FB7FA4121E673FB5C328F41B67FF8FFA7AEE6564ADABA046D6E1D6AA13FB24965390F829246DFA8763851405075F76CF94C66FFC3308214DF0960C649AAEDC22926CE9357D3875F8B71D68D75999AA3663C30A9EDF07228BF7DFF49EC1E6C7A33D2053597003B82392E826EBD701B4C981AAAC9951C79E08F592C2C0637C8E5A7F9DCDA599E859C317D4888B4098992E0E2D979E41C703686D577E5BA6001EC4F587140711293D664963632F87EA0461E0E0C5E9D8D292FB409F9F9AB172EE17FC8AFABAD06E42B437CE22924EB5DBD3A80A06962F3B37946259F9C75A233CB2B4ABDC5CD1B648FAEB1BE8630DB40D151B8FBA693DF2C5BDCAA14DC4783F450B6BC407515CEEBC5C9A47BD1A141384F0B596CAB1135C075651CBA989C190F3171DC1D72330EDAA01656813C4B7811715060B023FC426745C301B2A91E0D08ED3BDED438C4CE6799C35F3981C882A0BDE4A2FEEB1A52CAFA47B0C48558FC43F98FE08F03A71128362BB6FB9DA6A22249F4D4352AE7D3DAE85DE497E2411EADCFE5BF1A3C075C45811E0097ECEA255FE15BD8321FE8B546A8CACFB899EECF5419DB363C7567C2FE7360B36DE14674F500A31D3EEC71451A7C0D5576A8939C0F6D4D9F2F03F3C516CE25CE73ABB35C73AA94F6AEFAE6AD87052D6B195FA43586817F5BB974AAE7F1B8608922411AA5B0D7D574016CBD3DED13395623470A108FA0E1D3F9FAA7E1E5031843F2A23DBCE8B196315290DEA5795E4115D53DC570A444064CFA3C9457DBF3EE323B1966ECD2270C32910F8F430522471258A1F1955A6E1DD8C84ED9A566499BF85628615351ABE84B401421DA2CFAF575E2644C9304C075ECFC374066CEC713FA4C0D89043689FBC59FF54B8F97EE0A3B0989BC5E4EF83CC9833E75BC8B67BB5EE3C06EA156611CDA95A6702416807530EA206ED89835D20805EA988B1958569CDF7F809996214DADAB4E20BD44917E3410EC6BEAC98FEA07F764E85B66AED5E17CF675D2ED8E63DB728FE75158CB31779E31379648B43D68CCFF3780854CF03535C57122019456E73CF06769BF1FBF558542241CE665BD10F921828553585E0CF664CDC6160F9C47FA5330591B74194F4716056CA83993EFEC4A52DB9A1FBD3B2F504AC19667325167407375B6D7DE739F07947B511C8D475744E5C29D6E286A37F1FF8317BD0178F0E306A38FA6E75F4A80427FEB2C91235D3E7F20D8101CFC03BB73F44EF59AF3526E9AFC580027A1DADE37654238B8EC7AF0105248FE30784A88B72E11FC1BD807E47A349BD29075BEFBB29730EF8E85E3ABD5105559BACEE74AA27D90D360A8D629DBEC95EB34C7F7CA20096FF7B521E40D3944A975436896F372EEAB6B8615EB91697965BBF955779DD3047F7E3BF029E3509A5780247445D6223D085AFB4291D976EFADC41E42DC2C0728D18F6155654A332FEC72EB6AEF8B92C1D177E3DC28C31971BCAFF76DDEBFD9588BC244B116D409E58DC5ADA1648663D603C47FAEB814AAA7EB9B6264356F926C18B9357BF426B89DDC8EB9177ECEB5C6CDC64DD8FEB7B326BC1BA89BD9035235DA0E644EF959C58DD97B88D5C749B36931AC2694C67151DB0894652E99254222D37CEFE9E27B3DD663A152DBE29A3639AFE42F4578937076180563AAD6AD739255EA012A17D2A56627D84C44FBAB261D392A966CFE19278799CF1634D42384323C496190D4B9FB662694E3887EA66AB9E8B195488C8DCA47C8BC0424247759137CFBF86DEDC3641904CB6FACBB30A9FA84ACF69A67B4AFDF4C2AA420FC0D90CEFA0DFBBCD3072D9F772FD6058E2BF0E251BE93B00DC43765B53DB51B22F12D3ED0CC5655E4AEBD9D923F99A43E4461DCF5992030E66A1CDC3A65558D9BB3A39788D92328387D144850DD3706FD7A079E3D2398F542F91A8AAABF0C5068DBAF1FCC5160398ABECF74884BEB04F3A3EA38BBB80D798F5981B3F2DB6C7B33F867B7DC06A4417E30F94CDB4F523AEEA0BE12BD75AAED57520DB0D4B4F013BE3A1DC7AE5C58FD1DE9637F7D82F697B7E92DA427A78FEEC6A5C0255EB57A43DEA6CEBC8805BC04E04FE789E222B1E2642D26EDC14FB36ECC6092B3060E45EED6C5B35DE8741F72933930ECBD7338CF39474122357365700CB50C5EB176FB92814FA7F4032570CCEE6B859236AD5DA5F1730129EDC7BE218BA9874620F6F0EBC45E0BD622F8FD1AE6974994AF95C6519EC1C46650C073D194FA6EBC62F405F63A3416782A47872C7D77D648D0A1C802FFDFDE5FDC112C94CFC68F401889EFC522FE488FDB5384C0D93147AB6587659D936F98ECFBCDCFBF8B352D605F18C855E2559743ED97991C5D50DF44A7B929303835654A3955ABC5BEE6327400A7CCCE460B318D8B5ECE5B12F606ADB3D7B5ED59563B8E675E78029AABC234442C2463256FE02B04F556DA35C4615D14A9F4EFF17DB0DB81DE4BDD894F6628A120BE2D4CF3E1F46D53817899657035A76137E23C0B0E8DDD29465D7F15628FD435E6CAACA4194FDBF85FDCC31D5DAFCB52568B7C0CFBE713BC85FA424BA3ABE149E4035FC86807A8B876D2163B447CAD5EC0E6EF38A1D591AFB46267F9DBF142CAB1CAC1F73BEBA212992FC6D4647EC17848D1ADBB1901277A5078DD72D9C9184E893C0806E9B4AFF0A824670D438620F2A7E8D2965B619D291E5824C014FC888A36FBBE17356431F0039038F9B497902AED969F9C488390B7087763638E976801127BAF1F53803C4DC9649F0EE85D67B239E2BDAFB2BD75F1D1DA22A56FB3AF10A9DDE7AD306C4AF8681029316C0E1949228E6BF5ADF942F1C0EF92B2BCBC0C70D49E5808851444240A78B14D21B54F66271482F49B85F5180B268050327368496CFA8B54ECB97EE6D28EB74A3742F68583DA046809002C22F7B31FBC0566969F9A15CDCA892C4BEB101A2AC3526C76E9D30982C9B4893450FDEC4001D2431828D24D8B1A67DF80E2E10ED2EA8D723227055C48006665F7DA8E032EFDC70BC7EEB2B369B551FAC542AD6DF1A23107E2B3C0E3CCACC25F26404C085CBF56E52D35D7948DB9FDA6DFC24709994719D8CED41A2CC9B3C4B2BEF0967CB71861CF0E6AEA9BEC9395726AA0E2F1A7247ED0F6038E3DF4BF566786073590DCF97F8F0A99658D8F630A2D130C46CF4D26C669360D0F70B75F904C9F923AB285D5DB129F6C25AD21F9E26AC844D07A8EED86C4E224EBFC5B3F720D6F94B0A01B1433C46B40CF84E80F7A6AFA7BB8F9ACF818AD3CAB2DDD6904C067BEA4F1FE79B83CB0AA8FC75B6B096BAD6FE94ABFD48F8EFC0F2B9A02EBDA8FDBDBE1C77F1854EDBA18AAE7F31CED9CD34C1B355108DF18A8953932F7554AF05B203A96A9BB93E0EFF51D7F93B56E351562CF85A2D35EAE2C2427B89A8662A1C723D4F14E6EAFDBD636C2BB7ADE29C1A6BC8A463734C808BEC68B1E9A31AF6E29B412F1CB8C90A9911AC5C3EA71E46113D2D7B1AE2D8802B06A770FD0E9E4652895E42181AD09BB541E9493F258711BB7BEDD3E7CA8B8CE875669CF80A6880ECA3F13800DE7011EA67F443E505C4FB455608AE586F922B3C83FD33B306BDEDB86223C33E3AA65EDC93CBCF3A03ADAF9F328997951D59A9200C0BA2618E3596AF176B43122CEDC52B1E006EA6D12DC236A6FCD7CC46825F2EF7ED71683A731D746FFF2FE54E0B392A8CBFA38873196BB2B835DCA7CB7C3ED9A004C7A329B9734A111744BDACDB669E69E9DF1E52F07C513E3752A0CCD81D7DDC4A64868B7BB2BBBD2095373480522BE10615248A179DCB61DAC90F7FA5FA9B84F190A9C62B5FF9CD473A940F03E7107157D7EB60AF1E3E384FFE8A67DCB2389B3B0FAB7C789CF100CA95CD6A85442CB9A2C243FB9D454B20BAE5762D72B8FE79B4DF81163D61DE4578CF976992D8B9989FC68089F811F53DB1E1092B60220552876B818BEA981571898CD6AB7B5F13C46B0A076526E3241D65014F855EFD7BDE08AD91F259DCB64E94EC3DAD97811EB024EE1D341521DC92AE5E93C73422088976F2D27D64E1D193B955E6736AD2BCCF3C1A53D590576434ACBC0B687F27F255FEF354E68ACA47160EFA7126F908E08E4548C11546D9C412D685FA84D2EB4DCB2BDFC48E2FA8023548198EBB072A48044F4391143E3BEF4FF9066A4B0D03ADC826819D67588BA84F99DA27424103652ACC039DDD3B567851CD78E4117A8B93AFE01FC8EEBDAA1ACB8BA9D095789E76B9D5AB9EE177A15D666EF171FE1D4BDCCFE2E58CE669B561F63028C6CE26DB5C8182FE048680B175C7AB407215FF3A7801C950D509867AB1B0BEF89B3E38A387915225EDE76F91AAD15A85D8C46EFD588BB3BAACBC52C036211512473420F3F061F5F53E9353DE0780425745A76439B3811511C86CA503251F24113384E1A24A9367536E796CE08B896F572489A2339E82A856C + diff --git a/KAT/PQCsignKAT_782_lvl1.req b/KAT/PQCsignKAT_701_SQIsign_lvl5.req similarity index 100% rename from KAT/PQCsignKAT_782_lvl1.req rename to KAT/PQCsignKAT_701_SQIsign_lvl5.req diff --git a/KAT/PQCsignKAT_701_SQIsign_lvl5.rsp b/KAT/PQCsignKAT_701_SQIsign_lvl5.rsp new file mode 100644 index 0000000..4ec0f95 --- /dev/null +++ b/KAT/PQCsignKAT_701_SQIsign_lvl5.rsp @@ -0,0 +1,902 @@ +# SQIsign_lvl5 + +count = 0 +seed = 061550234D158C5EC95595FE04EF7A25767F2E24CC2BC479D09D86DC9ABCFDE7056A8C266F9EF97ED08541DBD2E1FFA1 +mlen = 33 +msg = D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8 +pk = 86FFA3B0F73D55A64D13C6F89F28D75FD17C5E2368E1D451127C16D1A97CDB440E20333A233AD2F8E4D70187C8AE31602049ADE949A87F95E79DA4C456F5D400B2485A96D04708A2F30046812B8D65A3BFBFDED0DD6563462F9E2BCE760CD753CAE8471BEC7049EF28FFEFE859C15DAC49DB959AEE99842D97A380A70DD7330106 +sk = 86FFA3B0F73D55A64D13C6F89F28D75FD17C5E2368E1D451127C16D1A97CDB440E20333A233AD2F8E4D70187C8AE31602049ADE949A87F95E79DA4C456F5D400B2485A96D04708A2F30046812B8D65A3BFBFDED0DD6563462F9E2BCE760CD753CAE8471BEC7049EF28FFEFE859C15DAC49DB959AEE99842D97A380A70DD7330106F14C3FCF2ADDA0DB66D0F7195AA2D8D1879DB85EEDC153ADDFAF01FA471C74492A01000000000000000000000000000000000000000000000000000000000000D2E0BC29F371BF8FA7827E1D87CB90F7B7C177042A24E4B8182084435C87E402AFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF072177EBCDF87393B1291C98A34A3A4CF96B18E9D0CB2AE1BD47B218E247081C38FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B7CF3AA021EA69832B2007DFB7D4D2942B529ECE361CABBF367BC484128F6A5A8AF847C6C23F6664AFE8F29BF13321FD5676B3BABA2F0A9C80167BB830A90DF6049881A5F7C5E46E319FB1A38BCFCA8F48D6263EF8CDF6A098494FA84CB0442A58F4AE4C665D3E41B3C507BCBFD8B2B14EFB978C34F6158062D5A64D82028294823F3C856903558EC51FF3BDF10952D376D4B1B0CCBA40DD28071F1037FC2E5625EA37A7ACAF4DB86776C45A6DFC3C67AE6F110FFFFA397486DEBA200FCFC4746F5F269903C44F48F3E4CFF02E109E498D5BB9C3581D62071CE462C682597A4AD7D911EA10383D34B6EF580378E44F14983391F7DA7157C435477E02 +smlen = 325 +sm = 6B8EF5D7689A1EA1CFCE9C6F7495E309E9D1D1B03E61CD97088E679C4901D0B6B6D38217F4AED6C44949B41F9AF80B43E84D0C91BDB1D00E06957BEBF30A58012AD01E52CF7906CE197AD06696F7FCF756908EA980549E7C215D089BDE7117799F628817A1B9C8FB7FEBFF7E9D9B776142460CFAAFC97D48A57E09E0DA378401000229CC8E1B94E1F2F8AFDC42066BEACE076E3E70DD01F90C4D01DAC17BEC58743532848D438A87A574D9DB940C17236AE3566281E27A99EFE5EE26E05B88A1D610A80B3AF38267D845C7FE330F199B43794A9B2E14846924127366B8F6A1F0F24D3C4B54D79DBB61B098BF32D98EA8819F7BE4A5FFBA29E88B1A996C6CDFD32B048BC2ACFFA28870181447FCC8B6F97B63C47CB013C6F3D84CBD07619A5C355B000911D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8 + +count = 1 +seed = 64335BF29E5DE62842C941766BA129B0643B5E7121CA26CFC190EC7DC3543830557FDD5C03CF123A456D48EFEA43C868 +mlen = 66 +msg = 225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1AB2568209E46DBA961869C6F83983B17DCD49 +pk = DDBF05B82D61DD94C4D04534D013C668524642505F0D674E0C10006BF6B45C87DC49B2E3055D9C1EE4C277598A60C295E174D52F6C4A938BB67730C50D409C015BD74FBA5C590E0B9EDA468865B3EEBA914AC1FF5CBD1E68502DBC7F72B9E5FEC5A593538F641215473CC5441A2FC3770723B7380BB6664967BBEC6A94B64A0108 +sk = DDBF05B82D61DD94C4D04534D013C668524642505F0D674E0C10006BF6B45C87DC49B2E3055D9C1EE4C277598A60C295E174D52F6C4A938BB67730C50D409C015BD74FBA5C590E0B9EDA468865B3EEBA914AC1FF5CBD1E68502DBC7F72B9E5FEC5A593538F641215473CC5441A2FC3770723B7380BB6664967BBEC6A94B64A0108A9814A001EFBCA101080DC988B718CDD356564C09981C0046082BA93F61D93126A02000000000000000000000000000000000000000000000000000000000000941944E281A4A1C9CC6DE84BC36BF4A305C45F17A4EB015BBD2F103829502D5C9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5116BBF5C8E55F9EE73E9BA24E2C01DAE1E0ADBCE644C3318E9EAEC3E17CD15FC6FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006B74642EB54C9A507EBA46037C5A28DFDBFEDE3117B1C0FD67B6202CC280B5E3897B7FDDCE85AAC02982475C9F6C23B5A2E5077740E880293EEF0D8B75C4041B872313889DE30433BD9614CE8ACF74F8B53ED9837389DB6041FD1D7B36D8848365BEA9631322AD506A85470489625A3ED98DA12871850A65C3DBD7BC0A02DBE3D00B9EE5CF179911FE14D2B6F2C91037E51579D6085A51857C2B09A24FA77482F3F3BF2AB270DF5AA1182CB410240A4A17A7A4D5F03F903981825EC306F233C28FF681036AA626B678094D1BA47514BA9BDC98B158BC5BEAEA91D0637C4A30ED3A8DC9A8BE72D3B8FE5C80EE70BCF65B8E6CA4D5FB30AA90898CF005 +smlen = 358 +sm = 2FE69D4C312452982E2B0911544D65EE17554ADBECB2A03860A180AF5B8964044F1BAE37D60EBEF295F7334574007B9909E8B9D5976A54801394AE59C762A300F67507792B1282B65DC7423BB49577BA5F904A276019694DB0C14201E589B0157E2B0EB2018E2060DF6CFC7C90EE2037C2344712D38F7EEBE13D2B79A1933B010101AF2BC85CB1642D01A69264DA9401DD3725C31ECB056D60F857EF6A4FD6500017E967F6A6948D1A6E047A557E87BDE88147A5291C8DDFADA35958AAF1EDD4E52320A8B309F58E8C43608DD70A39F62E36275CD4D0E0B07D319CB4C4BA9509B60C222A75C8FFC4B14F8562D98444D746E883586481AC539827913D3FEEFB6DC803ECD2209764AB4B483B952A021EFECC29452724FC981CD00F95848A3741E67F00090B225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1AB2568209E46DBA961869C6F83983B17DCD49 + +count = 2 +seed = BFF58FDA9DB4C2D8BD02E4647868D4A2FA12500A65CA4C9F918B505707FA775951018D9149C97D443EA16B07DD68435B +mlen = 99 +msg = 2B8C4B0F29363EAEE469A7E33524538AA066AE98980EAA19D1F10593203DA2143B9E9E1973F7FF0E6C6AAA3C0B900E50D003412EFE96DEECE3046D8C46BC7709228789775ABDF56AED6416C90033780CB7A4984815DA1B14660DCF34AA34BF82CEBBCF +pk = 4703985ADEA9F41A6CBCC98227E662690352617BBB05D5406297B8A12BEBDB1BBAAFF7C9B69BF5FC5351BDCB3664AD4F5160C188A390A41B2F36EAEFC2C63E01475746AABC99CD5A8FE6FD0D12C94A7585FE0B8551D82F83C6C7089A4FA9B05735BA15F77BC05D9EEBCB7628C2491A58F0768CEA699C19603A23E5EB75CEAF0004 +sk = 4703985ADEA9F41A6CBCC98227E662690352617BBB05D5406297B8A12BEBDB1BBAAFF7C9B69BF5FC5351BDCB3664AD4F5160C188A390A41B2F36EAEFC2C63E01475746AABC99CD5A8FE6FD0D12C94A7585FE0B8551D82F83C6C7089A4FA9B05735BA15F77BC05D9EEBCB7628C2491A58F0768CEA699C19603A23E5EB75CEAF000419A6ACF186A8755C0CEC4C07F53334EB48E5D9807A46A825461948FEE355AD4A65000000000000000000000000000000000000000000000000000000000000002276BF85DBD4FADEFD0A040C4447A74872FE0B281399F8D431110711D72C8C30C8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9D004B93340A6643D28DAEC0DCB9D18BCD6279C1ED686782CF436446C7074AD5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000039F2EF4792BD3F49D4B7112DBF8CC22A6A8C30C91CF24E37FC9F4CFEF7F8EDA78EFAF857A906DB7A9E08796A95D806C5A42AA42355D5C7E1B5B9D10906BD09A747E4C6E0D5C2A354000FAEC28A2F76E301A19F3DF7ED929E733BFA21E29F92E5282DC197699640AC002688F92D55791944FD51B39DA1B1F562AF3FD4C808E8C6BEDB10C2E0B9F8724182D4FA58808BB5439D28EC0D9A34FC9719CF1E572AD9538AB4676A56D8F0B2600FE9423B46EB0FADC597FC5DF9A2688F243A6F0EE331D67295C36739694DEC8D8A77B299831D47D1686CF1E521E2942C12D8C8A5DC912FFD53B7F50F0A95F55E25D9D3573EEE6503B7A93650E46F889B36BA00 +smlen = 391 +sm = F0DE30A68FFC1D912BEC7A314D61BA53D6F31DB502CDA21EC8BDA753478D14F6D43D18474FAA819616390823177287BF7A1C847925B6CDA81E69FDCF6157190098CA36E386DEE1B6A23C6A477A29D89A9F72A6EDCCAC71E7BD033E789DD540F2D17A861C2DD8683687380AFF21DCA83CD8139B216B68B47DB65C5A93DDB8820000008278E96A3FD471AF02AA36BB548DA75E179DAEDB9033151B257E3D59A96AEB54490D68A9DA03BCAEF327BA5587DCED533541473DEBDD67EB75559B670DF964590DF7AF6912D1E4C5B7147BA4A0483F719C7C37F9520D9F16AD07C047F4ADED35A881BDCA495BC6C77514BB54560812DDC23A28FC209B3678BA5FD966D755AE3214EFDFD44FB557252398C68801EC227CA857DCA93CF0B7D9714BA04E1BDD460009022B8C4B0F29363EAEE469A7E33524538AA066AE98980EAA19D1F10593203DA2143B9E9E1973F7FF0E6C6AAA3C0B900E50D003412EFE96DEECE3046D8C46BC7709228789775ABDF56AED6416C90033780CB7A4984815DA1B14660DCF34AA34BF82CEBBCF + +count = 3 +seed = 58C094D217BC13EDFDBEA57EDBF3A536F8F69FED1D54648CE3D0CCB4847A5C9917C2E2BC4D5F620E937F0D329FCF8A16 +mlen = 132 +msg = 2F7AF5B52A046471EFCD720C9384919BE05A61CDE8E8B01251C5AB885E820FD36ED9FF6FDF45783EC81A86728CBB74B426ADFF96123C08FAC2BC6C58A9C0DD71761292262C65F20DF47751F0831770A6BB7B3760BB7F5EFFFB6E11AC35F353A6F24400B80B287834E92C9CF0D3C949D6DCA31B0B94E0E3312E8BD02174B170C2CA9355FE +pk = 1680152A96029E779C0647DB83A8AA46B652B4B451F59D239A78A203766671CD1841A4C922D214783540A74CEDBFD5782CA9DA5FE590FEFC16677370AB212301F47F04AEDC4D00DB96ABC72BBE84D3EFA75110FE265432B46E9D98349DB040FDAFDE17FB9136FD46EB35238AB723A5AD3FF1E0D57F20A97CDA89E1CCB1408F000A +sk = 1680152A96029E779C0647DB83A8AA46B652B4B451F59D239A78A203766671CD1841A4C922D214783540A74CEDBFD5782CA9DA5FE590FEFC16677370AB212301F47F04AEDC4D00DB96ABC72BBE84D3EFA75110FE265432B46E9D98349DB040FDAFDE17FB9136FD46EB35238AB723A5AD3FF1E0D57F20A97CDA89E1CCB1408F000AD9A8463B0F5ED30A804E229F8D74C4B672F858DA8F2A3FCAF86302A36D347BEEF9000000000000000000000000000000000000000000000000000000000000000AB02CD124A9C322D19965E17FDBB4240A575C3A8145024558E3A1368A3AE0D558FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7351D7DB8C23801DBC78CDE3EAD2B3081894697D1F203B2A58E4778DEF42269A4EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008B2F06CB1BFE2D6B93E26F89FFBD8F8D600BAA4E05E93B806FA0077969E0D41A2839926C2BA1F72D25EE31755FE385810D268B3D948EA70F37B2D0B56AC60F2E64876E2067CDB4C5A2C1A8FA6967D362E03D8066B8EE924567766A782581AFEC8ACAAE16049A8D40394A093454E1489CE77FA5FD63437DBA4CB2ED9B70041D2381A8DDA6A4F50D3DC034DCB4756FD6DFDA0EA8135CCF79734BC3F2997ED823FC44150A8BEF221AA0F90DC62E46CBCB015946FD4E751F03357E67AD8003B777BCC701AF05EADFCADE380032557AD9389B6263F6A8169FE6E0EF64B6C85053B328508BCB8A3EADF702547BC739EB1892F52CFF93F938074C52E9A08B00 +smlen = 424 +sm = 528365BD8084F5C02A098D0744A199B780457475E7EDFB9CB1DAE22DE74AE0385DB2C7C56F0C88F5FFA70312B75A0EF390DC3CFF751A9184C324CA6B51AF6801B0F7FE7953F3C86D6DE5A75F0D408094095634886DDA2E3D4060E1E53123FA8BD6EF75CD4AFE980E9E4822397D02A5299684A0215CD8087E43234FB77099CE000000795FC94105E8EAEC8DE51A55A0DFFED30FB4C1BD10DEC2BAFE4C2D3C5B6ED363B4B8D621C0CF54B342EA12A84B71C99A4F8066A89781A3E80169B9C1C40EF411F2B4570B2CCF456CFEEA2CFD5261976B091BCE5C614E65E1C4558DFB6217112A89B3D8FCDBB697E7764F224A147989FF10AA2FA2CE6300D02C99043C464BB55ACCDA580AB2D5B88FA474690BBBCDFBDF79BA391C50833BA243A7C2F069D14C000B092F7AF5B52A046471EFCD720C9384919BE05A61CDE8E8B01251C5AB885E820FD36ED9FF6FDF45783EC81A86728CBB74B426ADFF96123C08FAC2BC6C58A9C0DD71761292262C65F20DF47751F0831770A6BB7B3760BB7F5EFFFB6E11AC35F353A6F24400B80B287834E92C9CF0D3C949D6DCA31B0B94E0E3312E8BD02174B170C2CA9355FE + +count = 4 +seed = F1902A7815F37BC7F5802D8CBCE5B48D82EB85691718062BFB84D8C06AA41D6E9039B0A107245DAFA4EC109A57332914 +mlen = 165 +msg = 1CDF0AE1124780A8FF00318F779A3B86B3504D059CA7AB3FE4D6EAE9FD46428D1DABB704C0735A8FE8708F409741017B723D9A304E54FDC5789A7B0748C2464B7308AC9665115644C569AE253D5205751342574C03346DDDC1950A6273546616B96D0C5ECE0A044AF0EDEFBE445F9AE37DA5AFB8D22A56D9FD1801425A0A276F48431D7AF039521E549551481391FE5F4EBFB7644D9F9782D83A95137E84EA3AEB3C2F8099 +pk = 75F754FB7FA58FEE2564F102417C8B868145AF2A48B80AE4ECF1EF79BFA9290457DBE80F1B9A869F900BBBC56C2AF28C3E6758E9673AF71975F0F0C46F7563000DEE012474A4D8FA6ED0BFD536963745862975C6DD179C8CA0343EF2F8750499448130AF4FB0A6B2EA5A5D5B5A7F5D743DF1EE04C32B639B71DFE430DB92080113 +sk = 75F754FB7FA58FEE2564F102417C8B868145AF2A48B80AE4ECF1EF79BFA9290457DBE80F1B9A869F900BBBC56C2AF28C3E6758E9673AF71975F0F0C46F7563000DEE012474A4D8FA6ED0BFD536963745862975C6DD179C8CA0343EF2F8750499448130AF4FB0A6B2EA5A5D5B5A7F5D743DF1EE04C32B639B71DFE430DB92080113F7151D9200CB6FB804F167ED16E665D1B73D021075C933E9AEFFFAAD2CAA5272DD01000000000000000000000000000000000000000000000000000000000000447B65A852BDA293732310D8CFB7C43A85360563CE804748549EE24495A66B302FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7F31F777A3E5ED4D1C94F6E34FAA7668B77ABD7DD8FD51C07348CABAF46830C04FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001DFDE5DD1E378ED1553FCD9DE3BEDEFC17A724949BCEED62D83BB28753FAD6181833C7797C54DB12D7A93E1E783E5BC14D2DA916F9746D8EBE80F94F6008933A09F9C2FC1CE3190E6E1ABE8ABB350B341B879791CC1C26F33D0ED2565E15F5E47DF21F512A3FD1EAD59E14BE018161957A05CFEACCE13002EDA4BC0A016154C650B910313C16B059BC9F961CCC95C3D42AC1276DE13A055419315B6700E71A3923D8CE20EA6ECB2849965C56D09897C5C44810FB3DABE450F564110546A423A761D26A5961853EBAB7D4D724A916418C85E88187E9E4F1DBC5894925641513EF917698A95750955EDF442617F1516CB598CE4138FBCFBD4BB4320C +smlen = 457 +sm = 942D75F0DB013499D1C4955E23AA834F690D6CF7F9AE27509B552C95E121FD9A0E2BC57F67BAA6302260116E605D06E11F29BE8471A874EB0EB8ED137047940055BCA71D13F9EDB525D9EB0DBD0DD683007F62135E0D667D80BE4020A94924C7F9A0AF590318EC3C3307F19C4E03334AD21C29E7E947B913D11850EA652FA3000005886F78FE624F8AF4FAAF4E52BBF975D4EDBCC2F785814C103BA818943105693E4BB98EACADD1399ECE8624E975E40F14A500C34DA055B5E53D179E170119170D888DDDB85437D1F596423715E2E3EA1564DD5C8F6A0A2ADE527DDA3C43369F272F753BF7418D8B3D667E50BB726CC7892E0275EDD18708925A61DF1D1EBA8C02362640EF5F7682851D387AF3C78E427D2BE86315D939AC26DC72EB49583F6700090B1CDF0AE1124780A8FF00318F779A3B86B3504D059CA7AB3FE4D6EAE9FD46428D1DABB704C0735A8FE8708F409741017B723D9A304E54FDC5789A7B0748C2464B7308AC9665115644C569AE253D5205751342574C03346DDDC1950A6273546616B96D0C5ECE0A044AF0EDEFBE445F9AE37DA5AFB8D22A56D9FD1801425A0A276F48431D7AF039521E549551481391FE5F4EBFB7644D9F9782D83A95137E84EA3AEB3C2F8099 + +count = 5 +seed = 75224ECC026C18159FF92256844D0ADF953F0A4DD8D74D4EBF1DC5EE8F5630B011A447FD4DC34A2404D620CA0E1F273E +mlen = 198 +msg = DBE5B6C299B44F8D60FA972A336DF789EF4534EC9BA90DF92AD401D1907951EB6285EDA8F134277AB0A1145001C34E392187122506AA2DBB8617D7943A129EB5C07DF133D7CCDE94A7CB7F1795C62493ED375353D1F044257DA799F7D112C174FBC35687E2F87FEFBE2D83D29D7314B30A749FE41B1B81095638F112BC4563420AF235280E466FFBE7050C4937C60FC18D1A6025BCBD489F0C538E088E906ABE8597E2C8EBB64F01D225C847AAE4B77BAE6EBA9269962C4B94A9732CEAA2CB4093D442FFBCDD +pk = 998E2EC64B1E67FF78C4D3EB18D4AC2F0C67DD795C5B65CA90F14C42C9AF941B8723A211986732C8C528E8DF750238CE3ECF2EF2DBD2E6EE9CAC2FFF041BF000BD4E16414017D387ED80A07F90073A0D3F513482575044A6D6771DAB8EDB4667A70630FECA2E6AFD1D748623C626D57D32FA2324D1EC3C9057E4CFF81432950004 +sk = 998E2EC64B1E67FF78C4D3EB18D4AC2F0C67DD795C5B65CA90F14C42C9AF941B8723A211986732C8C528E8DF750238CE3ECF2EF2DBD2E6EE9CAC2FFF041BF000BD4E16414017D387ED80A07F90073A0D3F513482575044A6D6771DAB8EDB4667A70630FECA2E6AFD1D748623C626D57D32FA2324D1EC3C9057E4CFF8143295000417690AB53B555D1939D6728FD15FC0529F294177337840F90EAEC00882A50CD1610000000000000000000000000000000000000000000000000000000000000060AFFAEBF23E8EA071CA1EED340CE07F103DCCBFD6FCBD3ED4E07F184A8FBFF946FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF290366D2385C5709C98D6DC25500DCEBF43EFA42D07E7C8DC96128CFB3504AA1A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055A224934D0832B5B981468C798B1C572BEA1015D56DE358EE5E521B91D60961710775E1CCC8D15133B8D0BEC9118422625328476C6684A5BCD764772D990218A11A1C31446AB8979B5AE6D258195BD523B9C348535B0ACBDFFDB9C994AC34756CD004CEAA293ED2FABC13C6BD18BCA749A84E95030EA7059CA427DE9D0207EDD75D68396C61B4FFC2D41C6391FAF085B8B4735A6CF6503B1FD4F2E4F70211A60031AD472C05309914979265A77345D65CB8E125B0468D6DEB7F61D90F130E049AB304325B8C38DDA471E1F805AF521FE23A4CFE26C95D5A0525B4EB4FCBB2A975162D27A8426C1F15F4DC5FB8B688DCEF877D896C8EA7D95FA13609 +smlen = 490 +sm = 38AD3749DC40FE0F7D4AA6A4B324F93CD2E4D4BD96074660C21EF30A9B593A6A1EE9E93DA3BB94634F8A77F37131E4FD2B31AF2EAF425A03E7C7C862413637019BEA7B0C76F9E1A6780672CFAC61D6EE57AA988704CC0F29229A5CD34B739474CC99ABBEB549D3BF04903CF7D5EA959B0D5F4DFCEB7417B57FC2DACB1A3AA000000150573D77D3862631DC6CC6F4BB23A453814D759C9006BA777A8815D9313FED1361464B2E4FD3D92B3E23B6F511974891B98D8BB5AE4627AACD5FE9EF97F07F267A993957DE80A47D040E9CD61ABAA48393AC43A8616896046A583ED33C3E4C2FBC343D98AE78A7E417F98B6223F3B749E7FAE42068E3686F9EF83570CC22FC3F8BF8EDA062DD1B5F376BBCBD91042C7B2E9B9A5189EDA9504B6682404B2711000208DBE5B6C299B44F8D60FA972A336DF789EF4534EC9BA90DF92AD401D1907951EB6285EDA8F134277AB0A1145001C34E392187122506AA2DBB8617D7943A129EB5C07DF133D7CCDE94A7CB7F1795C62493ED375353D1F044257DA799F7D112C174FBC35687E2F87FEFBE2D83D29D7314B30A749FE41B1B81095638F112BC4563420AF235280E466FFBE7050C4937C60FC18D1A6025BCBD489F0C538E088E906ABE8597E2C8EBB64F01D225C847AAE4B77BAE6EBA9269962C4B94A9732CEAA2CB4093D442FFBCDD + +count = 6 +seed = 447F03C8CD27EDAA1FA0436DA492812F57AC946479A9F1F90EC4F5E913A05F8AB0DD7645026A96510F6D40AF05D85B07 +mlen = 231 +msg = 0073BEE97FC97C0FBC750D474AEB93189F061E1A5CF6600C04FB0464338EC7E85252F94FCBC7B2BD00E438480D9AF3ADD92A92E3E2E8ACB55077C3278FC7503988A76E9B6062996B20889AA55B343D5A003C8A8852D738F955799FA3426BE5CCD3AA6B6EDA04D4884941FFC0B69C5ACF12B347A74D0580CC3335BA816200F87674A4C1D98097C70F2F27C74E94A661850610ECF4847AB5B58344F958C5719E06BA396225BBE21ACB0FDC512B885D391E11B0C0ED5CE6B5DD8FAFF91F50025C69D43072F7706D80D9FD786E1104125D79A5F4B5FD838815D44FC8B1AB678078CC174DDE970D448B +pk = 618572A9B3C5B890DE13066244E0B14A71C10AF6C213BE77FA4D2D01A6CEEA4F0BDFE265A76344E2588DBE6D66FEC04A36FAFC5ECD7F13A06EF822F7EFD6AD00C2F741BA0428410AC8B4DB3A260279E2106E0B156AAA75FFD6C9CFA477F17E05494A1B019CCCBBD1EFB42EDDC1D3F617E1361BFBCDECE7547452ACABD2EF42000B +sk = 618572A9B3C5B890DE13066244E0B14A71C10AF6C213BE77FA4D2D01A6CEEA4F0BDFE265A76344E2588DBE6D66FEC04A36FAFC5ECD7F13A06EF822F7EFD6AD00C2F741BA0428410AC8B4DB3A260279E2106E0B156AAA75FFD6C9CFA477F17E05494A1B019CCCBBD1EFB42EDDC1D3F617E1361BFBCDECE7547452ACABD2EF42000BF7E19BD6D6425714C9EB1ECFF3443C11265328CFBE5EF19BC61C24E2B5E40138FF0100000000000000000000000000000000000000000000000000000000000088DA5049D8A48753F9CED6F7D16CD0CBA69A0C3DAA82778DB14E234A1A89D42119FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D2F675296712BCC1A0293974E1D881068F662ECD1B1157216A585D0476FB5B4F2FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A033D333E5F32DF0DBFA61DA62002DE0100849B25F86C2A1AEF9F0682A21B106601695F19733AD6494C07B818D3B5AC4412029748F86216FAE607938B6250B7BA0EE16C3A2E4E4D94BBFC6271B2AE59F7A76540F319199FBA92369A4864D25A9A83C41B3135A1BFB221E42AB8CDF66EF825E6F4685FDC90ED18C0F758A040BC629CCC6050C4CB9A5E442A27E1678F55502AA55A549339D3138F12C80FE15023AC86E00AA6FAF4BEBAAE79A3F98921EABAA1F0F876A39494A03D741CE091DF46779ED7845DF2AD1EB9CB12B5CBA17C8F396A105849E0C5D9EA82079DB1CEE7013886CB79E05E5A78DAD1FB3112D54019837E8293628DF84381C0A2E05 +smlen = 523 +sm = 15F76E14CEDDC3A3FADD5D4D8FDC753EDCFD8738AEEE084BF87F862336946FA22D7FED984804359C0EF79B5ADAB64807CD0792D66242D93CDF2CE4589EF24E012BB823440970651EE0190EFD957ED078E344FBF2566C9D79A361ECD00C132DC27ED2235774934CF93A662CA298844C4BBB988F5DC957E2ED400F0B7D69008B000002FB23D96F8CAB363E1EA1D079BC2280FB1FF779576BC1602EF210499E487BEF6A55642FF8E75B1FBAED2D3BCAFB1ABAF0B0028B5604703C4E800702DC3181B03530DFCB2A1EA307FCF060170B21A6B8D6202CB48BBB2941E6C441DEBC9E7F44401C63419A4386B4527DC2202D45A90062E52122D4A55C8428FB683B2CB030F24588E8536CA42B177FC4DD5216C83C41CA2E98EEBE8F6E822CE57907CD129C6C0013020073BEE97FC97C0FBC750D474AEB93189F061E1A5CF6600C04FB0464338EC7E85252F94FCBC7B2BD00E438480D9AF3ADD92A92E3E2E8ACB55077C3278FC7503988A76E9B6062996B20889AA55B343D5A003C8A8852D738F955799FA3426BE5CCD3AA6B6EDA04D4884941FFC0B69C5ACF12B347A74D0580CC3335BA816200F87674A4C1D98097C70F2F27C74E94A661850610ECF4847AB5B58344F958C5719E06BA396225BBE21ACB0FDC512B885D391E11B0C0ED5CE6B5DD8FAFF91F50025C69D43072F7706D80D9FD786E1104125D79A5F4B5FD838815D44FC8B1AB678078CC174DDE970D448B + +count = 7 +seed = 8C151C556DA912A82DEB32144C8A8C9090CFAF5C12AB822AC3C72618837A41C2453B715EEFF3724CAFE69B1ADCAE9DDA +mlen = 264 +msg = A1586245D81F96BD8EE81AA30F10C0ADB343D74CF72C4DFF71550C12873AF89FA1874D4731C996243C3749AF3F6188FFE9FA45430549045134EB29EF3CEC37E72904AA082B1C6161E6B52361E49AF4933A8D8C0734F21CAFD7467B0C02876F43211D6122E3E735FE36064DF7A0C91449237C2BC7C3A78AC7BB0F9567F2576F05802C872ADF183A87AA3B8217188F2F3535F877724F35B29E545DE4BCF258F13BBC7EDD8C6587F733C9691F74B4151CF8C060C3AE9E8D49FE7C77BF477DC9F23FD0F0B67320275529034B84F94176730923C03AA50F9584D9C2D60B8DCCF85A13F243F30A51ABEFBBF2CDA602BF3D75E849EB92422B808416C7E56B046CE38E4677AD24D23D7237A9 +pk = 76FA66233B237059099A990B2DAD4B54AC270601204E8560F67CF89BAB454CE04C720520F93266FE0E15C538102F0FDD5B4D1A3ECC7B43A5D73AE9D0F4BF3001E576B9EC42A359B9E4018C83E9C7966C2F7195D152569B3EE7A9E7FA2F06BCCBCE3C3227ED8184638F04AE7974C09C5702BB3A149338DAEDC31F004D2E4AD90011 +sk = 76FA66233B237059099A990B2DAD4B54AC270601204E8560F67CF89BAB454CE04C720520F93266FE0E15C538102F0FDD5B4D1A3ECC7B43A5D73AE9D0F4BF3001E576B9EC42A359B9E4018C83E9C7966C2F7195D152569B3EE7A9E7FA2F06BCCBCE3C3227ED8184638F04AE7974C09C5702BB3A149338DAEDC31F004D2E4AD9001103BE0203B2DFF29704FD97E8B65EBC0AEF2ED7EE27750C06A1DCF87A39FB26D06301000000000000000000000000000000000000000000000000000000000000F2FFB5AD4D4A4D664C52196BDEAC257FF18F394FD56635C2C3A525C7A19BA1F9ACFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B28B121E7E3316431C9E2DEFE976EE40C85458188FBF2AB44FB800EE28D6D2C4EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009FADE532158A794925A862A8F18F78573F58C44AE91C6FFA049E7703DD098CCC0F3C859D8B7619118774E9ACB55B882B49B43172AFD10132D7C94A66A4FC0CAFD25752F50116F0B02D7B1F4B3F26FCEEA7EDD9E3381FC7DBF1E86F4A01E293A5BFFABADA5920E28CC0CF8BF18912897C69C673D7CF8FE68D4C78F8FA25006E667C372968EDC4B2A871D1C17B411BC662CAA12990F3B92CF286D564F0245FBF93A698776EA31C7BB1B5FB1E8249E71CB98563B8F41F066FE31C71135C0849B5F44F8FCA124F5FA4D464E39D14F0EA222B4BD3498700EF27518B010A3597BBEAB1101330D1EF332241FD3381FEECDD2BB80DA4ED68F271DA2FD3BC3A09 +smlen = 556 +sm = C4F4BCB291C412BEB2543EBD214477C18C42C45DE2BDC0ADF905C07C0A268FC5F9429043D5DBC20757DC2840B65FC614E0AA4407F9EBB058F931FA666133320156848A7C1E601D2920C66A3800B79A07A7F719A4307F37EB8CF9A152F15734A9D7CB77AA39CF7999F1EC5731280421E2C77E795422B879CA4C6E61BBBE1AED0000005358D44D679D202C1A225DBA32A33F9C3372310D06B983B26F9FDB9AA1664A0A82B2064CA1651B267C8E5C8B53C680EC0D59DC6086553F2558E79A1884F7FC3DC999FFF51434FBBD848309398F21FDEE42CE33DD88E8A7008772FCC1D0D1F524DF5F5B8D9520F90C88E24A41A09E7B040AAA1A60839A700E44566F7DC045B7754D89088B7421A7CCCBFB832C6AFA1641A286D2B30FB072872C646154605E0C000B02A1586245D81F96BD8EE81AA30F10C0ADB343D74CF72C4DFF71550C12873AF89FA1874D4731C996243C3749AF3F6188FFE9FA45430549045134EB29EF3CEC37E72904AA082B1C6161E6B52361E49AF4933A8D8C0734F21CAFD7467B0C02876F43211D6122E3E735FE36064DF7A0C91449237C2BC7C3A78AC7BB0F9567F2576F05802C872ADF183A87AA3B8217188F2F3535F877724F35B29E545DE4BCF258F13BBC7EDD8C6587F733C9691F74B4151CF8C060C3AE9E8D49FE7C77BF477DC9F23FD0F0B67320275529034B84F94176730923C03AA50F9584D9C2D60B8DCCF85A13F243F30A51ABEFBBF2CDA602BF3D75E849EB92422B808416C7E56B046CE38E4677AD24D23D7237A9 + +count = 8 +seed = 9B42F41492530EAC81992F17613EFDF155F407D7E67F18AE193EDCE714D65D1031E7AD10839AAB46D0850EAF5997AB4D +mlen = 297 +msg = 9366ED7B3B623C411448B634446F1A3FAABDD163A6CC1E2BCAE4A98703CD8CEE441405892FBA051BE2A586A6950A5EF73A255E5F86B0D7212E0C51C3BC79BE4B88E76ED6F043FEF3204FAF044BFB1ED722D61EB5D0B74C66A257E8AC3A2206273C80D2EC2123A4DBB715D60118D99ED7322E38F1562F82379138DA3DDB8BAA7CE61AB729AFC3748C0134633CF45A9973C05C75D04E82F631845427626B5799DC07DDF830BA01E8BC6236BB6D03B37D949DBB29EEC7DFE60FBC17EA590956D251539792016E2A8B01E70476961BC9ADA43CDA682D0CAA4FCC58810BBA1A673EF8F6BC90BAEE701E8E4F7C04A346CA56C7B2862FF57756CE6CD1EE22D677BCDAA896EAE96F87870E032C18B6C6A0C1A191FAE2ED487CE55296CC4B6339EAC9E8A742BD0A44C3525CC750 +pk = 7510D115172DE1D55B44DD9C00C9D334F0908FB134E1004A108FAD32912767377930F1A70E9E968D8F9065D0FA9D5656C2884DCFE379D3A178C16428A68FF10032FEA028BD4CE04738612310D309BEB2A614AC7D8F9745AB158DDF4F9AF835EB03E30EA7FCC3E744B89879EC14527EEA6CC302B4ECA44A27469C857F2194240109 +sk = 7510D115172DE1D55B44DD9C00C9D334F0908FB134E1004A108FAD32912767377930F1A70E9E968D8F9065D0FA9D5656C2884DCFE379D3A178C16428A68FF10032FEA028BD4CE04738612310D309BEB2A614AC7D8F9745AB158DDF4F9AF835EB03E30EA7FCC3E744B89879EC14527EEA6CC302B4ECA44A27469C857F219424010987A68EFF626AA0E4B39B6B07EFDC6A6F27FAFD0197478764701CEE9043FE9DCFD300000000000000000000000000000000000000000000000000000000000000C2E9E6305A622028A137A279C26D72B58BA52F39F8774B3A7D3D8C2B22322E0D89FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4375ECEB53176D110121FB72EA2E11D386405E5FAF628786E1605EF694990FB317FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DDCE16026FB2952B946A93854D11A74797D624442E50BDF37D95016F01AF66EE44319167AB6E4E3488874328A12C09343EDEB0CC95D835A81F6372854C6207B2D69E1C14B099EF8352C5A7BE5C165476D259415A508471FFA443203E9799B9990557E0EB18C4D02E6102D66ED1290E92CE618910C427EE851A00072A430D58B6B2FEA5CB0B25D22987140CBFF537F419898B5C2F03F8814ECF3E5DE59207128844156CCEDC5A8BE09EB246093D84A09E1AF5073324F09D4E5CB4C2FE067DDC672B6E79E903B373BE8480B01A81B3440523099E3F63B1D3754A07E65DDAA6427B528F21A36510B1540CBFFB2508A39367DE08851F9BFEADB6005CFD04 +smlen = 589 +sm = 997FF4D350373E82577D25A0773626DDAC9214C23C4B089F8A1B2B9720BC50FB5EF94294710052538E867466BFC38DA151815E90D36ADE9E32F53778B6B496017EA6A6A7AA0CDCEE62F9358F962C98AA78AA4E5B2CC6F00CC859CB427514428041CDE56867BA22F6E15C7C35634952C7FE1B46F444F45D4054C7266615814E000000BA50A4FAD980A333E1648C1D06E10E6F260EAE69C4DF8FC06575CCCF76C30F77F344F128567C15CEB5EDD33003C1A905140424D3D303E7E19E657841F4E44436A39C162C948C5FEC67D16E8208DB030A24F50F4AB4590CFAFA2E6E351F79B607504EC3139CE05B5CD5FC37040D2AC7B82B81D37512F1B0BBF3AF54D3885D86032029922D634B7B3CB52731B4534C2D414A0D9D209023CF1ABD378634BCC40100020B9366ED7B3B623C411448B634446F1A3FAABDD163A6CC1E2BCAE4A98703CD8CEE441405892FBA051BE2A586A6950A5EF73A255E5F86B0D7212E0C51C3BC79BE4B88E76ED6F043FEF3204FAF044BFB1ED722D61EB5D0B74C66A257E8AC3A2206273C80D2EC2123A4DBB715D60118D99ED7322E38F1562F82379138DA3DDB8BAA7CE61AB729AFC3748C0134633CF45A9973C05C75D04E82F631845427626B5799DC07DDF830BA01E8BC6236BB6D03B37D949DBB29EEC7DFE60FBC17EA590956D251539792016E2A8B01E70476961BC9ADA43CDA682D0CAA4FCC58810BBA1A673EF8F6BC90BAEE701E8E4F7C04A346CA56C7B2862FF57756CE6CD1EE22D677BCDAA896EAE96F87870E032C18B6C6A0C1A191FAE2ED487CE55296CC4B6339EAC9E8A742BD0A44C3525CC750 + +count = 9 +seed = 11134936880F5A11ED3504CF7B273E55A351FCCB10943BBBD186623EE6C7A13A6565C3080D1F536BFDB018F99C4E46CD +mlen = 330 +msg = 0998114C84F84080E7EEBB47D248980FAC9D28F1ABB6DBAB3DD59A5CFD2C7CFF7F308372874DD5447C7B02E30165501C0C673128E4C543A414222BDF47E7F4E8DCA757B0F4A3281C0D10C4F02AB52AAF5B9A715E012607BA310947A60A5F62D6B8CFA96386D27CFA709189202421C078934AA2D955468E550AD4D0D4ACDD98B168A9568E232192E92789830317FBC959087FFFE353B6C168F3EFBE7164444F1D6CBA5246E31658C65440A841DBA78257E78502843EC1A6E9710229C8EEB85D6CDDC7D543285624AA1F756A5DD4F1A5D4FA52DB8C5C34880ED448FBB6D254509FBEEA0FA022F276B6A66BEF7ABFEA6049FF74291BABE781F718683397077B29FA9E2B46BC6B09251E587CC5B182195DD4060CC4A319BFBE251A5B660A739DFE5D0E5B93F3CB7E440194F1C8BDA922CB1A3EE3D27EDFD61C1D31A7F4534E84889EC83B51F1641892766434 +pk = 9ACF0BA18F0D88F81E230468E024B502872656F59AE7E649E04EA20EBA14DF141899D28844EB3A05EB9C0E7832012B6544C8DDDFEAE73E04ECC10F2F49344301A071A48958D65F30EEC4C431BCA2A6FA7798DA2872E9CB205FAAF18A8593AB288B93C0064AFC2AE1F67B8F23AE4E6550BFEA5A1E10B15829F4F1E573B871280002 +sk = 9ACF0BA18F0D88F81E230468E024B502872656F59AE7E649E04EA20EBA14DF141899D28844EB3A05EB9C0E7832012B6544C8DDDFEAE73E04ECC10F2F49344301A071A48958D65F30EEC4C431BCA2A6FA7798DA2872E9CB205FAAF18A8593AB288B93C0064AFC2AE1F67B8F23AE4E6550BFEA5A1E10B15829F4F1E573B8712800020D7D25B8579ED0C2E5E673C6D1AD6040FBF2F4C8280A3ACD578D7C917259742917010000000000000000000000000000000000000000000000000000000000006EC996B2AE80633885B9E776F725BF066406787B57A9C64C9F98E8CCC4B5FFEF44FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF373BA53DBDEF1B20826BD6417C26F605296A61459D502631C66D9CB8239BEAC5A1FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000791FF7B31A9EAF514D11F47696E44B4921B5964927B39DDBBD0CFBB27F442C328576A80D677D8A2B33B9A314D7E4CDFE2DBB9F14F5A6CF7B0E61D1DCF3D7045F3460B61CD1EC7FDF98175E4E658FE4AA2E325CFBA24E1C7CE4739806D3E0BF39CB373CD8696AA7C0624965DEE55A727907E5CC3F7C6ECE1543C6FB12F001CA8039BE5ECE9C2AD40C365E4B67AEF7F5BE6963336C7F57FE124D4DF5053D0CBE89EC20BA74FAB80FCEB34194D076B60091EEAC2D377B5A419BC83507340661DC4C80E58855782E2B15716A4E1D03302CAE8768988C92B5864D1B363956713F8B3CDA7024D9CB49E213BF6E098F8AE732393B40D00BAB92FB5785023E08 +smlen = 622 +sm = 4CC286089F45B8B0AA86D3CD53874DA3A4A7B5D20B4E3B2E779479E1F388560243474A6DFBD339E81613DBF6D715D6605E65E5B714B90517F28BCCB411787A0097A644F7FE3DD155AB2AAC2B68997F2FB6099EEC9188D243279C7E3D63C055C252120B76C4B77FD64D903402D401A8A315CB89058FC4257D0B4EF6E1109DE6000200FB3076F5A29FD75F5B7ADB8C1287361B1B4ABF1F5101012CD84FFC4C7C4EDB0704464575A39B0220EE6613CE53B08BEFAC0FB0FAB967A44454168B58B1DBBD09A62F8605B51E349225B61F6E62A257FEE47612320442713DA71234DBBE0DC705434C2D5B5F8B86979BD90D71B75841AFDF01C3D1167D0B74F86BB45025DCC5095A09A21A8784C1EA742AEC03CE1D0D1D6CFCF2C805C7519DBD9E17D6F48D540004110998114C84F84080E7EEBB47D248980FAC9D28F1ABB6DBAB3DD59A5CFD2C7CFF7F308372874DD5447C7B02E30165501C0C673128E4C543A414222BDF47E7F4E8DCA757B0F4A3281C0D10C4F02AB52AAF5B9A715E012607BA310947A60A5F62D6B8CFA96386D27CFA709189202421C078934AA2D955468E550AD4D0D4ACDD98B168A9568E232192E92789830317FBC959087FFFE353B6C168F3EFBE7164444F1D6CBA5246E31658C65440A841DBA78257E78502843EC1A6E9710229C8EEB85D6CDDC7D543285624AA1F756A5DD4F1A5D4FA52DB8C5C34880ED448FBB6D254509FBEEA0FA022F276B6A66BEF7ABFEA6049FF74291BABE781F718683397077B29FA9E2B46BC6B09251E587CC5B182195DD4060CC4A319BFBE251A5B660A739DFE5D0E5B93F3CB7E440194F1C8BDA922CB1A3EE3D27EDFD61C1D31A7F4534E84889EC83B51F1641892766434 + +count = 10 +seed = 98DDA6B97E89A479D5EE214E660DD6B5D8F6CC638A1CD4F462A0EC545F5B0B0A1A403AADF566F7B1C0C5FFCA29B36FCB +mlen = 363 +msg = 4CCA95CB9F254C2EAA7DCFFEF662EE03320D5FC626A6484304BF62FC20F341FBE26E1537D7BD20E95440F7CC95EE84E1297C807A0BC9006DFCD5C22A5C1FC0865F5D70E5D63AD677FFFDEA52BF85D1A4F159F7ED16A745B4D971B620048B5F518EB2DC672CA35022578059E1ADAD7C07FE910A5D566B8321D9A12F34C250BE35CE964DDDEA23C90EA77C9C1BBE3532FEEFDA3637157786EC7D37775AE5CB0BB92EAB45A0FB1E833E8A6F3D06B85946E31A79B64A02B31FA640ED514A85882C89F693A06354DFDDB0B5E23E7792134C69C1D3908882DF3A7694A05B241B87FB2DBD1A4D9F26943B69F3CDF730301663089D1EBFC23299DA21300F735CEDF7B109F3E0BBE273776E6AAFA7054A6CD9682B967EB7903DE549E9558E62DCF3AC444DD7042FEA362EFB555BB97FB464AD7FAEABA3197C14A6740477DB50CE3FB8B762F48F880381D510FCC836E5880B48F08BD6333202E838AB73F2E106CFBFB218AAB802DA8A00F13F78FFB70C +pk = E4C22ECFB06664EAE02EEBEF8228410D365F17CD6D5E6FD2F7234CDF22D1DF5E7426B4ACE2B3E5C0306C832C7F44415311C0BB8C39F598DC73751ADB5F709C01FBD9D1A3F2B41578BCFD5FE7D0946EBF8AFB33B10124300ACE562DD073F6E82864E9A01A5BB6AEA675B73CB4F34DD5035C53C08F8933CC85ED77B29BB26D0A0106 +sk = E4C22ECFB06664EAE02EEBEF8228410D365F17CD6D5E6FD2F7234CDF22D1DF5E7426B4ACE2B3E5C0306C832C7F44415311C0BB8C39F598DC73751ADB5F709C01FBD9D1A3F2B41578BCFD5FE7D0946EBF8AFB33B10124300ACE562DD073F6E82864E9A01A5BB6AEA675B73CB4F34DD5035C53C08F8933CC85ED77B29BB26D0A0106F926BF23DA3868F47850A6CBA26D1E9FB6FCC4F00629F87BDFCF730D3FEA21386C000000000000000000000000000000000000000000000000000000000000007CB09939105D04948AD700016BAF9CED7381B4FD1300474B33471C4F935A30D3BAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2310C312ECF7FA5F9941D49C6BA7C747B2C828251719B6D66073BC2A6A075DC54BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F547B16C8ABDC10B172DB9939FB0D2D418E765945C99895294018126B650AD5B54D4BF1D282ADA67F4A24352C6FBB759384F4D1A85CB352BF1E0989F9CDD0E648613A56A4EEA5F95B9A8D9EA8C465DB7B50099582CF051BB3F6F394AEC584FB26491205BB05466C9238F6931143302E37DA4B3283C0E93C07D5E973F900CA38A51C18246F96980276BA8D6C586F35D18BE1E0DF3C63BAFC7242281BB0C038215CDB09A8AF92FC240D2743884CD159958843D8337605929824E2F3DEC038180F487D4CA9ACCD8D75DA521591C9CC45EE0921A121FC5242883547D6A60047AA82C22861DBBE6524237983C22B8593A8EE9E2F2BB3CCE169BEBD422A504 +smlen = 655 +sm = 44D975942D1EB8D8A2F21261B8B6F7607622A54DA9897A165A653C5E499400E57DEFFCEEEBF982EFD2DAA110F33D05875637813C2318691CBF0E20FA778FA0019642B34EC650E7E63CCB1C16E147B851DAA82A8FA64188940763B31177BE537AC35D26CB1D92BC23083BA8252820D6FF25B30A469CB30B4D2E19F3A16E1E45000002FE4A8E364E05E3F49CE6C6E770D3F3EF36F19E22214D95BE2D8A1DF5FD7D2261E752F0F9F2A6EB2648440C013995FB4E733EAD1E6A490D177BF6D42160BB976198CFB44532D3B13AA9D173AE044A4598EC580FCBFDF0C1B7C83B4AE46D405F25921991FD02A6E7F347D247A1F4DC2203BAE7A2B7BBEF2017681F44DAE4E7CA7C24E3B29BB4845442E299E78EB7DF3AD98347BDF6BD044F715D8C15A849B0330009094CCA95CB9F254C2EAA7DCFFEF662EE03320D5FC626A6484304BF62FC20F341FBE26E1537D7BD20E95440F7CC95EE84E1297C807A0BC9006DFCD5C22A5C1FC0865F5D70E5D63AD677FFFDEA52BF85D1A4F159F7ED16A745B4D971B620048B5F518EB2DC672CA35022578059E1ADAD7C07FE910A5D566B8321D9A12F34C250BE35CE964DDDEA23C90EA77C9C1BBE3532FEEFDA3637157786EC7D37775AE5CB0BB92EAB45A0FB1E833E8A6F3D06B85946E31A79B64A02B31FA640ED514A85882C89F693A06354DFDDB0B5E23E7792134C69C1D3908882DF3A7694A05B241B87FB2DBD1A4D9F26943B69F3CDF730301663089D1EBFC23299DA21300F735CEDF7B109F3E0BBE273776E6AAFA7054A6CD9682B967EB7903DE549E9558E62DCF3AC444DD7042FEA362EFB555BB97FB464AD7FAEABA3197C14A6740477DB50CE3FB8B762F48F880381D510FCC836E5880B48F08BD6333202E838AB73F2E106CFBFB218AAB802DA8A00F13F78FFB70C + +count = 11 +seed = D34A0AAD27ECAD31A5E08E9A2D7901A9B85F864D9B1B46F40CDCA0B3615B2CBA04EF82AD7BD8CF627C3E861477030BE2 +mlen = 396 +msg = 5C4B2E1A344DA1418B0F4BE3FD99505FC30F2A1E5B696E943BEE2451D7B268F722E04F8E00FDD9E1A470F8C977A6D45A5F621B8815E352FA14F64977D1FA08082A48AF495719EA6AC1C0B3D898603B4CF7EC88E68DD7190884382896D953D612CC21ABECFB01A04A1BB1BBE8986D34625756396CCD84BD1A6B5454DDA98824CD4844D98F356AB485EEB19F9196ABB1C3088C0C3C5846C88760B696D91A232D6F4CFFC85BFF33DE1A3433A27A209A461FCF37F2289F98BEA7CCF183DB1FC42A7EDF958E7913F8711DC375E43F09BE7C7A2C2B1318AE2A9CF5988FBC2CE0735A2CD9FB6C8496C34406C538C01BD494193240BFF947FED47B7CCE99A1747973F1FAA5223AC564BBA0CA8973D1310B5BFA1452CACE9110BC22A8D4080A8BAAA8ADFA3CFB6685679B648484E3A43F9B1B2531949BBB8FAE1846F6D45D9272FC2CAA2913B5D9F8D322E9B18A685122D74634C60730C101578BEF2480711FEFFE02123E76D6C846559E2EA99A98923EF095630102A5573EF027E0AB6E52555A9EDE0D15A73C8B2FEF87CA6FD9F903F0 +pk = 324DA236FA8CB8BDDCE6F82568808C4BB325E07DCDA926BED7BCA233307857153DB5DF35C135FB19DD45420C044D60A15CDA24D0EA0B97117517D4744640700011069778887B7F3FFB4B10FD082C16A0809F7514D7A9783D219194D6C45859E6BD57AE18EFE8FDE920EAA2FFF74D66604CDBC65DF04470556954BF527A0872010B +sk = 324DA236FA8CB8BDDCE6F82568808C4BB325E07DCDA926BED7BCA233307857153DB5DF35C135FB19DD45420C044D60A15CDA24D0EA0B97117517D4744640700011069778887B7F3FFB4B10FD082C16A0809F7514D7A9783D219194D6C45859E6BD57AE18EFE8FDE920EAA2FFF74D66604CDBC65DF04470556954BF527A0872010BAF3D719CC4E02B849C6D2DCB61762DEBA32172C8FF8C736B2D90ACF2B1E9517E98020000000000000000000000000000000000000000000000000000000000007476D58BE1294B4A821FE824A99801FF3B2DF3A073AED9438BF151713322208947FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7B4925A8058E5A6511CD1489A005098F9C0105B01778846CA24801D52FD547B83FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CB027F60C9FF27C7DC920DA906E4A6745192169C37303FA211CA7F15CD49813C0B4A196DC4D1A493D057423A4C922A77525AD36BBC9AD0DC2F4D08B6B5320DEB3FD3EC19FB0655975B360AC24F6AA14C3FCCC66AE25A786A37DAABEEE75BADE7D4E0E94FD09DE9032856ED2E107F7966B866EF4686EC7CCD983B816A47099BF4DD4B6C16A5A2BBDA5AFCAFED401B2A7C1EF8E0661D129A312E9686A174CD58EB1944F5FDC64A54F9FD272720059898F473BBF1B842BBB4C2D44D5AB60A403A9ADAF909956FCB6F3064B5C5C34B8DF3CD51495945F4DED8C86FC39304BACEC67F56EEED8C072DA9EB99871B92F009D8F40EDC1050FD8F43F8846D0F0A +smlen = 688 +sm = BDDAB9C203E1C57D91FA4751AB6D4BB36252FA23504D19C02448290F306478EDFB4A52A6354EAA642CE4DA569493CD1A168F8AAF2FD98312ABCAC97579FF2F0086CF7CC85E15A4B064E5A252D29FD7B2D1F3E48FEC340BFF324E33F947E424588FEB08A284C0CC2F1947E9A61FCB30008242E144459A476B47BE3331B6D8350100001F299FCBA25DBD48142702CD8F82FC963927E0E8BAE3B867CC18672EAAEC645C1B4D42AE15E15B1B938BFF63EBB97B2E402286B98FFF96B096F75769B5DBBE254BD81E3DC438B8904C5EBD0A9195E7674D89D866DABC8E8CFCC8678C42F000550036556FD56FD0206269658217A161D35EE8632C7BCB5D1CEF4535A92FF4BA6C946380147969695FF235F4F8527C9B80E2F171608BE4B2985D2B0AF661A90F0009095C4B2E1A344DA1418B0F4BE3FD99505FC30F2A1E5B696E943BEE2451D7B268F722E04F8E00FDD9E1A470F8C977A6D45A5F621B8815E352FA14F64977D1FA08082A48AF495719EA6AC1C0B3D898603B4CF7EC88E68DD7190884382896D953D612CC21ABECFB01A04A1BB1BBE8986D34625756396CCD84BD1A6B5454DDA98824CD4844D98F356AB485EEB19F9196ABB1C3088C0C3C5846C88760B696D91A232D6F4CFFC85BFF33DE1A3433A27A209A461FCF37F2289F98BEA7CCF183DB1FC42A7EDF958E7913F8711DC375E43F09BE7C7A2C2B1318AE2A9CF5988FBC2CE0735A2CD9FB6C8496C34406C538C01BD494193240BFF947FED47B7CCE99A1747973F1FAA5223AC564BBA0CA8973D1310B5BFA1452CACE9110BC22A8D4080A8BAAA8ADFA3CFB6685679B648484E3A43F9B1B2531949BBB8FAE1846F6D45D9272FC2CAA2913B5D9F8D322E9B18A685122D74634C60730C101578BEF2480711FEFFE02123E76D6C846559E2EA99A98923EF095630102A5573EF027E0AB6E52555A9EDE0D15A73C8B2FEF87CA6FD9F903F0 + +count = 12 +seed = 4FDA9FB6929E3F391901D69FA0AA2F25A9657D249A620F1B9E305A5965676BA76794CAD3355EB632579C3958CA7D443D +mlen = 429 +msg = 49755A7B1A7CDC5C9BDF5149968061D3C95EE67BFBAF02750C45094303A9D9CD23A08F19B9C768ADC63FFD1527186D09CA4E0356BB882E263BF015CBE3716C05B31A69DDDB790BA82C341AC9B6BE68A81B8BEF8D882304BAF0020D761A0DB04412033DC369961A5213B04E81736A580F1162780599CC029E262D67F31B2773AFB457A1ADAAA292163144F17DE384234F3303111FCD89BCB30333C6C6486F775ED099043C34E6C86450B650F1A02D03781B1D20691B767D166DADF1DCC4D8604D976EFDC9168373A7316DDA9B9FB02A4A321218D9F54E287B7167A08BC0153843BD6355AEA1310824DD5D5EC458BE694AF176119D9E588A29C650FF5500293659EA478B39A62149F819CDB7E7CB32E1D7B1284F159E2AB1B1EA41AF4D0AC94FF3111FC1CCD818F9B2CC7A259701405FDF6A51D2D3EF62789297BD16A659F14968EF902C4A23DA409BF13A4913467B5C991854B2CA6CC006D3F4197A6AA58BD5DD95C36928DA9583332C3FB134FA3890FE7E299F1C17205366C4F4230724C43E4803912E72B816658BBB1B63780865A1F66A2A49B96E93711B1BE97B827D12173402828B1A065B94310D5BD6098D +pk = 714AB6197FF90E9397ED42F09EC458FA2257DD9B00DCE3801A87D7B9241ECB20E33C949A5F0E2D500EEC30E64168776E340AAB28ADA1847BF9C14E96FE092A00FF58C4949DB9B32E007F9E5A553E4FBDF921E4FED6C45A5900CA24823486F8A1735CF8E9A12640BE7F2915C879B004C7120261C887D7A25AAB77860DBB1A080109 +sk = 714AB6197FF90E9397ED42F09EC458FA2257DD9B00DCE3801A87D7B9241ECB20E33C949A5F0E2D500EEC30E64168776E340AAB28ADA1847BF9C14E96FE092A00FF58C4949DB9B32E007F9E5A553E4FBDF921E4FED6C45A5900CA24823486F8A1735CF8E9A12640BE7F2915C879B004C7120261C887D7A25AAB77860DBB1A080109A992F3D26A0524A901E5C1A5493CFDD2339FCA5E56A7AB1B6E0457CBF1E27A895100000000000000000000000000000000000000000000000000000000000000AEA767C7687E6C76D6276EC2BAC90BBAC2DF82DDF992D5BEC95C94CC31456C939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF392276C7A1E356FA73D0F60D0A6F749ADD4906D6443C3089AA6AC80888B0850C65FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003319FFF6D5920E15C15BCF6A25E93817AFF90189F5F11FFAFBB3FF4827865FF4243978CB95A3A08B21E0E2D693AB13820B01C01C84624E9B79526C1C8AE20B34CE1C7A01DC316F084EC4EE6D06D825CF2602CF117AC7C8BCAB240A59F7FB34556721B3B4A79C7C411F552A99CCF2EE2A52F2A5D024CE4913D473997C290F843EF7C89D78F0E1FE972B7A2509EE5738F5A63DC9CF479B2EB80EA24691D16F74F911BE58016AE7508C0D9FDA1D365D4C6B7CA22DA4AB9D363F7852D885083FB0509CD214D87E9496848CF0C61BD0EFB4E1B3CEE642EEEA9F26C6A359B89FC3C70B5B0744BD4C9124E9341A2980A4770428A8E23C64CA150186B29BF501 +smlen = 721 +sm = DB15110BB5FACC31E75610003BF0B1C3FE4AB32CD7D8F50045BB13789A729762BD168D37D47B50AEB48162D8DA2AB9725DC62D07C8B5E06E26601E9A4A943B0006209D5A458ADB12EBE9986F5B6743E0611CC223FC7579D33802B8102FE9AA2FA15D57609DE98225625AB623157FD77E678D6CF877BF536B4136B6572729050100009B92DBCC7093AA83F66791EC212D9D859E52011AE528EFCC6BF87DBF4F82405E5E2170A861B3DAAC9D8E18C1922731228750ACCC9DD5A15D547D1922A0C66D180BDABF011EC630901D89FE153E8E19927D4C42F2EA8EB5F15C878028470B262725D3340C6F36DE3A48D9E4551DA3B2588B1EB1524FAA067306974A992D687C754D4FECA2563445591A60338D1AED0C1337FB743D97E398AB6079528EC99E3100090B49755A7B1A7CDC5C9BDF5149968061D3C95EE67BFBAF02750C45094303A9D9CD23A08F19B9C768ADC63FFD1527186D09CA4E0356BB882E263BF015CBE3716C05B31A69DDDB790BA82C341AC9B6BE68A81B8BEF8D882304BAF0020D761A0DB04412033DC369961A5213B04E81736A580F1162780599CC029E262D67F31B2773AFB457A1ADAAA292163144F17DE384234F3303111FCD89BCB30333C6C6486F775ED099043C34E6C86450B650F1A02D03781B1D20691B767D166DADF1DCC4D8604D976EFDC9168373A7316DDA9B9FB02A4A321218D9F54E287B7167A08BC0153843BD6355AEA1310824DD5D5EC458BE694AF176119D9E588A29C650FF5500293659EA478B39A62149F819CDB7E7CB32E1D7B1284F159E2AB1B1EA41AF4D0AC94FF3111FC1CCD818F9B2CC7A259701405FDF6A51D2D3EF62789297BD16A659F14968EF902C4A23DA409BF13A4913467B5C991854B2CA6CC006D3F4197A6AA58BD5DD95C36928DA9583332C3FB134FA3890FE7E299F1C17205366C4F4230724C43E4803912E72B816658BBB1B63780865A1F66A2A49B96E93711B1BE97B827D12173402828B1A065B94310D5BD6098D + +count = 13 +seed = B0E6A23FAB10A7A333E3720BE00D31507917F39C5EFE1C98CA18BEB5C3101FB4479B478A1558C4C00398C55C9822FC44 +mlen = 462 +msg = 439529DF1864297E33956AFEE00A60099B658A67830A6A6ABDDC329E87831D9F9B647917FEDF1AE182A40402143285516FCAB83F447354C72FAE81AC26E7005C2AA561763C152E66BD80F14565F47DEFA440DBB491E7994AB9FE35995D5FBB3800CA030B43DF611141637A5246AB9D9CAC02EFE14AF60736B6BDB2BABB97CF21E831E5D04D41C00F090B154977900EFADD3A9313389A3F84CB3AC38E8B57B70A43DD08A8243F8154013FD5CF29DE5A8DF0B197C12B17E0610FCFE3625CC94067E01E23D23A243AD1C1F805CC50E1447D1DF93C25B8D76396BB7199E64129522462C5FC8B30C132D4EE9E0BF6F52961FCE7ECF650647E7064AA5A6574649A323E144D7C5491DE4C0A1A76D08F93F87A2FC7F6955FEF86991E62E2CB42908E83B0C0A8BC180B7453CED293F1E20F300431EC1D395E8A537F0BC36A673D491F14381DEA90D8F176D06031B0A7AFB40EA8F76D37FA82E2572B9799A5FC7CF4C49BC20AD78EFA8CD989A84D72ED680AC3C0F64155C56ACBFD7C7D628B418A489F961357F77BD62204ADB079DD3106485A37FEE535C9CF82E832D8AADCBF686976B806B02AE733DB46DB0BF162E973931C3E338CC86DB38C66262D1B2EBC7691B8281E0B20BF36305FBA996D20ECFDC695 +pk = 37018D6D0C3C5E4D9471F7BFAA0CCFADFF5C2B308522E6135ABB974443069AF69E0F0500CC9E0CCE1EA3065B5CE896871306FE288E0E54FC86FB73B4822C40019BA3DAA475B1E71BA878A7580D069D26B58814AB982354DF25B350F2540360D621A5D1C693EF36154F62F8978DA2CC923B6AD80E43E5FD5BFE3B18CFBCFF91000B +sk = 37018D6D0C3C5E4D9471F7BFAA0CCFADFF5C2B308522E6135ABB974443069AF69E0F0500CC9E0CCE1EA3065B5CE896871306FE288E0E54FC86FB73B4822C40019BA3DAA475B1E71BA878A7580D069D26B58814AB982354DF25B350F2540360D621A5D1C693EF36154F62F8978DA2CC923B6AD80E43E5FD5BFE3B18CFBCFF91000B733EF1C2AEC6505E54189FB77C0BB7342D0F5EDF2C5F1C8DB16F39B160AC77CDF700000000000000000000000000000000000000000000000000000000000000863B5C15538C79E1B68709DA725E2E0171C0CEB21B6662E65C1B47B13C64547D25FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF893FAA66F885FF8A579BFB6718CF4E2CD76C70520E5A63FBF1FC934668FC818AF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AF08483CCE75E4B3D385B802C21AE515741A8EE8AE7CCD07AE885911AD4327FAAC90E1D1950E7BC6587B4827CAA7DA75B278D5E89572F3F27D764AEABAF70AA3B3C7D68A1A6FAA3816E231A3CF6DBEA51BDABAEE345B120BEAF4E580A9680DB5A5BEDF88DD63604444D419B45D23D74318C23FF2C78202AD3C08ED7DE10E3C7FC9C62EB5557858BCF46AD11900C0736ADBE5E619115BE39578F0142E5BE29BEE69C8D9371AB276CCD89AB73BFD55A20C8597CC5E7B576663799C4A550B57F4E51BC9B5561EEC070D11FF5B01D2376E91AB4DE4FEEBCF123CDC89B5D09450C414327857D3D7B3C3DE8C7EA4B0628C4EC05CD2D55DF72DBA0B69EBF702 +smlen = 754 +sm = 435430153ECD491B58C7AFBEA99B501B05C0733E71BFAA7036A4AF523D97761A07F727AEECADB01D26CF084BC48851F9CFABD3B60FD70F115D7B480500342F01F8797285E73EF857D9A4D3673195974AA187F91C95E0581F4D77058E068BE409142B563A07B70013A88EE0FDAC17F53C3CA6C2410EE12C52C77F9A36E7E2890101018A919353D43022ED505FC1FEFAFA94C28516122162EEA752B3543778A9DC79018370D8907D4A9DF8B6C6E058DFBE80DDF24D4540495EF90E38A92D8C8EB1531D8CCDBA9766AA41DD6DCFD7F84CF7AD0CE57C1BC88C1FBD8B42FC2313A586C22929A463D991BF26F3F6C6D6CFF53DE1F51CBB2B092284AB8459E157A30ADBDF06BAE95287D74F0324AA442A6401B089BC3E7A3A95DB4BE7679F66CCF4ECAD6B000619439529DF1864297E33956AFEE00A60099B658A67830A6A6ABDDC329E87831D9F9B647917FEDF1AE182A40402143285516FCAB83F447354C72FAE81AC26E7005C2AA561763C152E66BD80F14565F47DEFA440DBB491E7994AB9FE35995D5FBB3800CA030B43DF611141637A5246AB9D9CAC02EFE14AF60736B6BDB2BABB97CF21E831E5D04D41C00F090B154977900EFADD3A9313389A3F84CB3AC38E8B57B70A43DD08A8243F8154013FD5CF29DE5A8DF0B197C12B17E0610FCFE3625CC94067E01E23D23A243AD1C1F805CC50E1447D1DF93C25B8D76396BB7199E64129522462C5FC8B30C132D4EE9E0BF6F52961FCE7ECF650647E7064AA5A6574649A323E144D7C5491DE4C0A1A76D08F93F87A2FC7F6955FEF86991E62E2CB42908E83B0C0A8BC180B7453CED293F1E20F300431EC1D395E8A537F0BC36A673D491F14381DEA90D8F176D06031B0A7AFB40EA8F76D37FA82E2572B9799A5FC7CF4C49BC20AD78EFA8CD989A84D72ED680AC3C0F64155C56ACBFD7C7D628B418A489F961357F77BD62204ADB079DD3106485A37FEE535C9CF82E832D8AADCBF686976B806B02AE733DB46DB0BF162E973931C3E338CC86DB38C66262D1B2EBC7691B8281E0B20BF36305FBA996D20ECFDC695 + +count = 14 +seed = 0A98A2BD2B9FF42CFC18D3396BAD052E1D0F3372854DA69A318B142F7A1AAC609C3861263BD8FB0549DA7266784DB8B4 +mlen = 495 +msg = 8CB18850E27D8416B88A9A71F4A66BDF447814DB6C82098C371B53F61600EF5DFD88E4FB34200207C3F6F55166AF4878D38FCA7E2DC18FE662E3EA491B58A86246CAE16090FB7ADA53B9A67B3D0E3787D3323EA921274C60CFFB19A889BCF0300FE10E242AAE025F374DD83FBE9D007C8B9D9D75574C74146331DDEC6F0E49C10DBAF15654897E33E2B4780DBA484224AA6FAC79015D5792FAA2D532BB7D239B11D91420B98690B1FBDE9632223927E0804BFB284368A426C414C3DB8EA82F0D246413861475ED2DCA9E80FB4F3C34FEF7528069AE1975AFC52AC5AD2CDBCA1459E140F655556093210D7905A1A1E6CEEAEF0194A0B2EAB2C1EE853484E715D2A1DB551FDC620D5331164C74CA4848B61D408D2F2A943FA09EFEB63D524691C99DCC0B22CC61B98E6FB8039E5E0B2D7DE2CAAA900A44184BD56C9F02141A3AE8AFC661E3E898ECD3004FDB0704272BA780CD5DE35153B6FE223843024273642DCF8E4B58BE2AB1F61668680084AA0B75A32E766C8AE5EB30D4E02A12E6798DEA40F80D8DDFAD2041A52922701C689F46F49F84CFC05ECA6D7D4C356D50B6A0BA61966245D45134D6A1F5197540A1C39C36BB0B78831AF3F5156E669FD9213B64E0CF1C5A31E88AE79AD61757EC67B551B9F0A760F646BF81F6B92403A62840CC29FA4F3949B3A9F0A9A4286EE7808A +pk = A4C0705D2AD82DDD6006451863F64A062D684D18F4F8C7AD58D7FE98BE06087F57C55ED7BBE161D33DCACC3B73D44FC216FF7C93231C97557B41077E1C2ADA00C19D6C86D8C231A33E6F3CE496C7D26DA1716113B2FED52563DE342059550FA6CB211AB63D70CCBFD0C71E426D2FC0DDD83D1F38B485AD67ED503DC162A10E0111 +sk = A4C0705D2AD82DDD6006451863F64A062D684D18F4F8C7AD58D7FE98BE06087F57C55ED7BBE161D33DCACC3B73D44FC216FF7C93231C97557B41077E1C2ADA00C19D6C86D8C231A33E6F3CE496C7D26DA1716113B2FED52563DE342059550FA6CB211AB63D70CCBFD0C71E426D2FC0DDD83D1F38B485AD67ED503DC162A10E0111211D42695E1D0E209835EADE7C9714DA8ACCF400BF9015AC77B6B3071254DC74BF00000000000000000000000000000000000000000000000000000000000000EEEED88D79D3CA8324CB12489F8D2EF4AE171AC6777CAD23EF486699DD4E47208EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01125A188603B9B8C1DFC01FCEAE80F31B746B5DC9E83670062111F1DAB5B48529FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001BA71320B5386BE3EB89D3EE7A91B4826BF1617F2028BBA326FEC8950D008AF95ABD7432D7B1C52B5CCD76D41C3AFAC0B9B331C302E77637907A5884E34D052EC04070902F85478CC3D741F4544826EF7EFA0D2F044FF68D750C1AB0584B23CD816E291ED2295664D4439A3D19248F7DC127EE6D87A768EA2C34A6EC3B0E30A3EF4D5943ABCFFAD1B8344BE46C0A923D8C64ACB45743BB51EF921267E36F13CF9024A833EC00275F6A8CCE27ABEC5C5A3078262DFAB4E5682A1446020E13A6A6FFE93149A664A488C8AF22328F442F90E936C7F78A2B491E285842BF9F39B35FC83AEF02E5614D38B7100B0858A39D81A0793F550096EA05F670E803 +smlen = 787 +sm = CE09692606B0B3C9C260D282DBCA1099EAC817ED2B5BB51754B71C513B5770F5D9F61862E605C5341A1F9A2AF46532ADAD4656AC4DBC935DE276BA7DF4EAD600C057BBA024F80A04993F676E643E105D45064E97701C835F5BAB933AD6632AC5CFFA8DEAF46DFB1CA5A05A70694A8F96467878EEA2A60657A82A272AAB556E01000135A43C9E0336C02B08E3C0A5A8AEC52C34A026FB1084A10FEEA5114864F9FE1D0AEA1F84DCBA03BF92558C0C736C60B1E267AFCCD5B4C8C822D74CAE9122F72A20C3DDCE0DEB6CB147746C442A35ED8B34CC5FA6E3176F1F015F519A9AE4CC2FEEEB9F324ADCAC3CABFF89BD18E1EE8D6526D429172370DFD69C5F5A1CE3711368AFB6ED44FCCBCD09A9606C74C9A05A0E3F9BC6F83739801AAB2A488EA4610009028CB18850E27D8416B88A9A71F4A66BDF447814DB6C82098C371B53F61600EF5DFD88E4FB34200207C3F6F55166AF4878D38FCA7E2DC18FE662E3EA491B58A86246CAE16090FB7ADA53B9A67B3D0E3787D3323EA921274C60CFFB19A889BCF0300FE10E242AAE025F374DD83FBE9D007C8B9D9D75574C74146331DDEC6F0E49C10DBAF15654897E33E2B4780DBA484224AA6FAC79015D5792FAA2D532BB7D239B11D91420B98690B1FBDE9632223927E0804BFB284368A426C414C3DB8EA82F0D246413861475ED2DCA9E80FB4F3C34FEF7528069AE1975AFC52AC5AD2CDBCA1459E140F655556093210D7905A1A1E6CEEAEF0194A0B2EAB2C1EE853484E715D2A1DB551FDC620D5331164C74CA4848B61D408D2F2A943FA09EFEB63D524691C99DCC0B22CC61B98E6FB8039E5E0B2D7DE2CAAA900A44184BD56C9F02141A3AE8AFC661E3E898ECD3004FDB0704272BA780CD5DE35153B6FE223843024273642DCF8E4B58BE2AB1F61668680084AA0B75A32E766C8AE5EB30D4E02A12E6798DEA40F80D8DDFAD2041A52922701C689F46F49F84CFC05ECA6D7D4C356D50B6A0BA61966245D45134D6A1F5197540A1C39C36BB0B78831AF3F5156E669FD9213B64E0CF1C5A31E88AE79AD61757EC67B551B9F0A760F646BF81F6B92403A62840CC29FA4F3949B3A9F0A9A4286EE7808A + +count = 15 +seed = 9887F1FD854241A301EE0120645CD8E119B43F7BEE11F77A835E9ADF518C3A51CB76D86653FBE73AA716264C146797EE +mlen = 528 +msg = 9B64813C058F07A09A796FD764604EAF58CE144363702896DF0AB5FF26D5DE000D14BB8FD358FF5532D3B909AB62C18AC30F1900F84EBD3F4F18BD532D16C7B3470F0F8BDF72938C916DB18BCF1429DC1635B1C152C5F89A9EDB17116C11815A6C06273A889132923DA908FF39F4940A840D3CB575DC4D637AAFD37968EC61FC4EA04B4C320491A73ECFBDD8E10F1DFE902FCCEF93DD287ED872F67146BB8CA5A6ADCF0350E8BBA7F2F9762C4AA748FCE19748EB17334146C152FD63FAE3DFBB1A2C2B3C78960369551FDAC5D54643BEEAA59C1FEB0C21DBBB19977D848CD82A7AE0005F45956E0FE4700F14FBAA0C12FB8C65A6AEC95C5A5C8E79A6DA9C4E446872575C06AE49A31B82245E1757C7CE84D6D5DF3F642D3434B7E1A15A8B8A9DB460826B6CDCA69022DBF87595B582DDBB90A81E09A13C2AB1C125E4435FF30ABC9C56A00EDFA979F79D9C895E800D2DD6372FAE5FAACD83ADF8A6D55279D52DF547E9BAB39D99076AD7D297371344D35BD584E0FB5932F92FD5183B9250CD180FC645BEF6028C405B0EF35DAF783428173F1F2482AA1363640F66AF0FE8ECACC0DAB84ABD2A1FB53AF44445698CF1DDF4C2EA214DD339BE004E75BF76E95CA5C16981ABA5540689C1C1F1DAF4D0F89D62CCB3496340D61E7D5F5156FD3EDD02EDFEC8FCDD0B231697B0E66F4A3AAF46117532F5EE2CB4D2B3B82B0BEAE0A45A482CE9A976CC99AA82BEB0FE08CB68C4 +pk = D402CFD1DE5CE453EAAC1958D5A6BEE05FBADDD39906A4C3786067C7FB6DE8BEE8395DD0319C45ECD848C7704807EE74611ED850C128405A17CD9A24EA15A30073F826EB4712B094A2FE47C28CFB7AFD0B92C0CE96E92B03A02634FA440B7D9C79F8BCAE31C98F5C95CB8BFEAF384C69BD89CBCB892476B078A8BE09F52B980002 +sk = D402CFD1DE5CE453EAAC1958D5A6BEE05FBADDD39906A4C3786067C7FB6DE8BEE8395DD0319C45ECD848C7704807EE74611ED850C128405A17CD9A24EA15A30073F826EB4712B094A2FE47C28CFB7AFD0B92C0CE96E92B03A02634FA440B7D9C79F8BCAE31C98F5C95CB8BFEAF384C69BD89CBCB892476B078A8BE09F52B9800021DF6A5EF71F05ABE3FA8F3547C5F4A6FAB302723DC8628BF7BEB95AFB24CC573860000000000000000000000000000000000000000000000000000000000000032C66A5CAF705303B548939404C1E8E8C666A8B661DB52688298741F134D1528C2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43AAF874F66E3B9B4DF371F279856803B21D3B48A1A4B8B8F1459F0C4A24BAC5BBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EA84DDFD6EC1E8335C415FE7D9EA6C6CABC803092DB42048A9AFC04E5D542AF877582CCF505E42CD49BDC8BBB2F7B003DAF3ABB979A03E2B93DACA8CA1FD0BC15E93533F4F72BA0475EE8110E81F017EDB7CDB6BCBC0B34CBDF70BAF5349C2318D41AE259B2327F1B67E58DBA4E0FDE2C5E9BE091EF58365AD8583B867066F6DDE321F5D3F9E92275E0ED8231426E4FED5205B38BF2EC48D4D859CA9C3DCD4C6607F57385E247413285142C2BC4C4A28463B8954D04D7183F017E64E0BAFD6E87756792CD4E7F757FDEADCE286BBE9787314B6D81C110B06981C91CF6C9C79301C3F91D2291E3B0BB6828B25E350165FBA9938E224D84446C9C54C0A +smlen = 820 +sm = 165D6E884CCAE8F3610499FBBCC9E262A78D814A14A624557CA729593E28EBCB2E0453B9184825D263F5BD5E4098BB937DE366466B67AE4F4A99877C04084301CC264591E5481B1FF50B4A864FC9D669835C9FEDA8BF3B4B2240767683CACB84AB4F87FE9CAD6BAAD4B2926C7DB0B318E6F3CB14722A0D3DC8F36DBC963AAA000001E515FADC14E3C7465C13895706F1E2506058D88DD5A2BBB1BB509413CB4C8546B7CD9C3D1841B9A57435134E8AD43EBFD500D1BCC726B2314B92E3AC5927D6287D2472772AE35ACFFECD312CDEE2ABC6CC114AD9D43D4408B1919989470A9E318D35629F34471D09FE3A899DA143DF2A2BC91FD6A19303C66DF0B4DBE8C4DC02E84F80795215358B70AE2BDD21E0FF3D3D4CAA10666793FE39A1DE9B849375000C099B64813C058F07A09A796FD764604EAF58CE144363702896DF0AB5FF26D5DE000D14BB8FD358FF5532D3B909AB62C18AC30F1900F84EBD3F4F18BD532D16C7B3470F0F8BDF72938C916DB18BCF1429DC1635B1C152C5F89A9EDB17116C11815A6C06273A889132923DA908FF39F4940A840D3CB575DC4D637AAFD37968EC61FC4EA04B4C320491A73ECFBDD8E10F1DFE902FCCEF93DD287ED872F67146BB8CA5A6ADCF0350E8BBA7F2F9762C4AA748FCE19748EB17334146C152FD63FAE3DFBB1A2C2B3C78960369551FDAC5D54643BEEAA59C1FEB0C21DBBB19977D848CD82A7AE0005F45956E0FE4700F14FBAA0C12FB8C65A6AEC95C5A5C8E79A6DA9C4E446872575C06AE49A31B82245E1757C7CE84D6D5DF3F642D3434B7E1A15A8B8A9DB460826B6CDCA69022DBF87595B582DDBB90A81E09A13C2AB1C125E4435FF30ABC9C56A00EDFA979F79D9C895E800D2DD6372FAE5FAACD83ADF8A6D55279D52DF547E9BAB39D99076AD7D297371344D35BD584E0FB5932F92FD5183B9250CD180FC645BEF6028C405B0EF35DAF783428173F1F2482AA1363640F66AF0FE8ECACC0DAB84ABD2A1FB53AF44445698CF1DDF4C2EA214DD339BE004E75BF76E95CA5C16981ABA5540689C1C1F1DAF4D0F89D62CCB3496340D61E7D5F5156FD3EDD02EDFEC8FCDD0B231697B0E66F4A3AAF46117532F5EE2CB4D2B3B82B0BEAE0A45A482CE9A976CC99AA82BEB0FE08CB68C4 + +count = 16 +seed = 5B485527C3B9A5E5B7579950049CD357975D4BCFEF83FE33C087ACBFCC10A0BE4225E7F8A5F77203B5FC7C0B5FC0E78B +mlen = 561 +msg = 922320F7439E492F13C272A5738FF7122DD7A6B2832632E1F7A653FEF3B8639BCB9E84F482F22A948EA17DDE6958489593D2CB268BB52DF8ED612F2317BD6847D1622CF0532CB499ADC432233B93B6F7B1866B38975AC87859AC49F91E8D235846775F9E6E6D052339C741EF6178016EDB3D0B1E3F3536667B3EA2D489F88D254B8582421A31461374F465D7AD62E896BE0857134707A70477FABC09FE0A5CC3B3F32911F5FF3806B878205525AF69007F50535DF05C33AF3B0D00E297AC7EAA012E1D863DD5DD5FA47FB09467DBAD8BC42EDBAB42A9625BFDB9FE578343297506A3B71CDC8D5919955AF4605FCB0C7164D96A187AFF65D0F6210FEF2D11BA08D90C4458542BE72E084577BE9E451B8B6F4909884BCC5D25316ADCCD0925664D4D91C2E56433C1B68C632B0CA56D856DF1EDD5E113D1F026B30DAC4FD648A504F8F6809C701C97BCAC2B99286CEF5C1C923200B1BF6141EE1CFC51C5E14554BC02D7E058970254D2C02948360ABC4DFB439E66946A8AD615147BD8A6CB0886211E8B15DFF3C72B6F8908CE56BBC1B40E838103202E9F188D98E07555DB61778F895F76FBD838B6D14209D28EB393668924AC0E61072CBD9F93B864904FF4302DCEA131B2CA16BB04959ACEE096B1963CE07F59AB505FCC8D89FE08FC58751965F2F5CA753D76D58705652D3B1505E0F720EDE3142DE9776FFE4AA0C8A25E76C7A04843377C59F1002844E89189E22F621467B813A98BF07540A1649264F14A6844D65692617F7A4D93FA9A23829E256626 +pk = 927D7BD63C93707EAF175FBD652DB368197BF8CBC8609523A8DF543D63EB4E26E05C5EF2E41D5AEFE0790D861D64D5E75F70021BCF358666D4E036C1DA7FFB00F76F7F69E31F7DD10FD3DC6058DB6F82FC1CDA42F303A19599A444F686D4AAFB84A3A2A65D9D73FACE698046F9F77A808CB54BB0D4D4F3492D2E78A2D381700009 +sk = 927D7BD63C93707EAF175FBD652DB368197BF8CBC8609523A8DF543D63EB4E26E05C5EF2E41D5AEFE0790D861D64D5E75F70021BCF358666D4E036C1DA7FFB00F76F7F69E31F7DD10FD3DC6058DB6F82FC1CDA42F303A19599A444F686D4AAFB84A3A2A65D9D73FACE698046F9F77A808CB54BB0D4D4F3492D2E78A2D381700009DF972DF3C190C79B8E307E69C43CA45855276F7DD3AFAA7A7A352317F7F72D4A8A00000000000000000000000000000000000000000000000000000000000000A0C165D07FE2B226E09A48B1E147274FC4849623FDC4F5291437ADA30A1F67A4DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B82476BCDE039B1F3FCAF8C65759366E883F30249D6EF94BC03C9BDD99DB8B908FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002C7B0CB16745E5228092EE4AC973B30541CF26B998916657B9985ED95962669BD953640F2144BE0C57E7F834A8E570EA9AC980E51269002D282B27E6C60F0F1B74E6A41207295BA6832D684205F267C424622CB36A8D92AB01AAED90EEBFEDEDB78FE6BE3A3EC6DBC3D925008B3A60EA48E5D9D905CB7A45DDF852F3540E351EAB766D5FF4E6700FFD86FAC8D03A2FB5B33AAE01096786C891480B019E192114496AB60EE6DE43B815F2A89536CA5E2385672B311E3709038A1317080C1568E64B1CF14EE14F296CD6CF0D121EDB5A2F0DFC47E31AD374009DC140400D90D8A6C5BA6B671A257C128380D079327D3D2851E97848346895E2C414310C +smlen = 853 +sm = EE463310DBB58AC2083D26370BAB2462CA1CFDD48D3241DFAA027DF0232771EC2430E1435900B5D0A0F3BB875AEF9749E0471F6DC6DF0896145ED4707E5F4E01FADB7FA33BC414FABABCA0DD3D758BA0A7BE8553979D54D710EEC2B120792F53135BAB62349AF84B52EF41A6F44EE7A2E97D742398B94BEC9FDC3373DA9E7500000214E8288671F091B15249B1F6B1F4145F0B51C99F7F7790EDC095D54DE3DAFB61C11CC6440EA5AF3C8EEDDD53C19976BD8E153A9A3F3E860F2968895BFBEAF31FF8FE20E1E4411ADCF16121F50732F338270B53AE9D43632A4C572098DF9CBE08DF8C3AEFDDF979F901C75E95C399E4A677274E6B8D40E80998F973A3BF9E91754AF9E509A1DBE8E48336A4EC201DDEFC0864339230EEC65D884A471269302D000B04922320F7439E492F13C272A5738FF7122DD7A6B2832632E1F7A653FEF3B8639BCB9E84F482F22A948EA17DDE6958489593D2CB268BB52DF8ED612F2317BD6847D1622CF0532CB499ADC432233B93B6F7B1866B38975AC87859AC49F91E8D235846775F9E6E6D052339C741EF6178016EDB3D0B1E3F3536667B3EA2D489F88D254B8582421A31461374F465D7AD62E896BE0857134707A70477FABC09FE0A5CC3B3F32911F5FF3806B878205525AF69007F50535DF05C33AF3B0D00E297AC7EAA012E1D863DD5DD5FA47FB09467DBAD8BC42EDBAB42A9625BFDB9FE578343297506A3B71CDC8D5919955AF4605FCB0C7164D96A187AFF65D0F6210FEF2D11BA08D90C4458542BE72E084577BE9E451B8B6F4909884BCC5D25316ADCCD0925664D4D91C2E56433C1B68C632B0CA56D856DF1EDD5E113D1F026B30DAC4FD648A504F8F6809C701C97BCAC2B99286CEF5C1C923200B1BF6141EE1CFC51C5E14554BC02D7E058970254D2C02948360ABC4DFB439E66946A8AD615147BD8A6CB0886211E8B15DFF3C72B6F8908CE56BBC1B40E838103202E9F188D98E07555DB61778F895F76FBD838B6D14209D28EB393668924AC0E61072CBD9F93B864904FF4302DCEA131B2CA16BB04959ACEE096B1963CE07F59AB505FCC8D89FE08FC58751965F2F5CA753D76D58705652D3B1505E0F720EDE3142DE9776FFE4AA0C8A25E76C7A04843377C59F1002844E89189E22F621467B813A98BF07540A1649264F14A6844D65692617F7A4D93FA9A23829E256626 + +count = 17 +seed = 327CE565CFF6CD9A25EDD84F482FA0758B78CBC246567DAE98B818314AE28CD438E339043EB3FF16E1C2B4B104A717B8 +mlen = 594 +msg = 576289D10AB03D5699EAC322D349F55C547101E4424BFA43BBBA3747B79F075AE1153A7A0AC8BB51D24FC46B7604E42EFE4343FA34AA4EB16D918F25E8A4D67C860CCA3F7480E1221ED3AE13A138F079FC252C6D7BEBC55CB81B86E74F339614BEBCF7E8F4440DF8678B01A4A41B3AFB1D112FE1C4C8D8C6BFE9D3EE2A335D477C60FBF43B2E5FFFE1546F5172EF51CFFB2A772E1575EAC79B24D49FD77F0BE351233E57EE6DCC7E2E29994873ABD434D34ACE83400C026E27E27888EA0BDD1BDE5A3E55AA8B5F2FEB57B8B0A96CD831906297C8169D04F15843A3249C50523CF56A4E19492EA16927DBA8759B88A99E0D20820E51FC9B6A6863115CF05C5BC3F4C869EB5A87124DF5DB102D737F3899CFAA5FEA4DD62DC4FEDB1AAFF67906ADAF8968020EFA5B10190F70E5F2C0F0457E4341BD449201D3A80AEB791254EC1C46DDCEBC3896C6DF702509BA62CD446D275806438EB4C03132B2E6BD01BD2F832D1D3C053C48C5A9DB1C4A22B130C4C9E96A2BF4C2A8F7DE0217A52D9AA5AEEE5E6A49708237EAB60B4019A51390C3EF10572A73D436875BB8D7D78543F96376E4BF3BCAABB92F89215E8D1093F3B287945708B5514BD7E62654D3BDF34B29009C64829A0CBF33C54D7AB0E81B81BDDA93028B341AB1DFF3D752DC4A1E5F9636A5C46E137EA35919D99E6571C5370C6E804BD2E2ABF566F035D65CF8F97E3E8F2ECAFA153BC6D8EC2831667A37FC96D1C2DA40BA84D0FB041DEF32AADAEF3F98CAFA957F6552F79D28A36B8BA20A9452671DE1BE8AF5D66714232507EDB9FF657F3D7E5FA7320FC0359A5F99280D446283BC +pk = B99DEAF88927EAC24DB3C9C7A2C84FEE099510394901D8BCFAC31CCA05413AA47251ED9B2AB356B784695ACC74C54E573057C7B7CBD83412FC7808C7982891018AB08AA40F33B35ACCD72FA69CD0179BFA84CA44AE1D1C5A17425A69F226B1267481CF7C58E34C3D1E367115CDF732032CC8573FA4964E3FB9DA5A2E25055D010B +sk = B99DEAF88927EAC24DB3C9C7A2C84FEE099510394901D8BCFAC31CCA05413AA47251ED9B2AB356B784695ACC74C54E573057C7B7CBD83412FC7808C7982891018AB08AA40F33B35ACCD72FA69CD0179BFA84CA44AE1D1C5A17425A69F226B1267481CF7C58E34C3D1E367115CDF732032CC8573FA4964E3FB9DA5A2E25055D010BA31ABEFBFA41EDF1BE4E2537EAB7B22BAFD3425643116CF8A363EADC8E6C6F6AD90000000000000000000000000000000000000000000000000000000000000046B1F90B5065E392F7C640B8B224F89E7D0E2F2B0432D0C3C89DFAA88502A07CD5FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC316E317CE6F2A317887B0711D4995D0C7DF7624DC274B79BCA6071DC229AF5633FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B5A83A577B25E0F7A9079CA98EDEFBEF763270197836C1BF60F693BBD75979EDB14DE7A7A298045013F4B7C75B7DEB05BF5670F06BDF59C8E4F7A75F1B780CCF957884D8B9FD58C717906FD9020DF08BC7F43EEC6538D9AFCA24ACFBF830F72025DC3F1145C1AD933D0042BE612E2753E3B3D7264C15BB5AA9731B23F20A507C625098E337F4894EA62DFEEBAC51342B3FCF88F15E12D8CFA44A1AEFF6881E6ED6A18715DC509F186234D722320B92791DBB3F37BB02356570401F370BCD22AFCFD08FAEB686F53A47E752A86157E79DFF0AE6EA70DCDD2C5233C3B9B7F326111C0E7F789D6C9E69E618B751A9A4B35680D2D068845BE55817C58F0A +smlen = 886 +sm = 489B89B0A3FE6DCACD01FBE63504DE30A889F1E48DE09B9CA76F03930B5C30F8F2C0384FFD5F6DCE77DE619C54237B3FEB4122C0367D70D2DE4DBF4AF712B2000DE60C8071EA6E3DE88C9CDE830538B0BA30E540A56943907C2CB2A770625D9B75B5C2FD136C8E07A37723C2AAB1CEF4F757BD637FCC32C2CA21973A84E411010001B534438271C869EBE5C01E81D13FE1EB5DA2D07A468B8D13CAADBF5919B3EA46CDD3833640E99719F464DC7DD92C10A39385B955E6D3C3B00B31927C33D24A2DC7DAC6AE90B5440D50762F0E6BCBBD98DAF2F18B74EABB210B5E5F0DD48BEA7CCDCBC2FB023F221E01EB995DC2453AEF01F04C54365A12F3143F0FFF5FFCD84D21A7AC63801800AA170E014663E7533E364D68CD8FDF7ED4E7DF3B3780881000110B576289D10AB03D5699EAC322D349F55C547101E4424BFA43BBBA3747B79F075AE1153A7A0AC8BB51D24FC46B7604E42EFE4343FA34AA4EB16D918F25E8A4D67C860CCA3F7480E1221ED3AE13A138F079FC252C6D7BEBC55CB81B86E74F339614BEBCF7E8F4440DF8678B01A4A41B3AFB1D112FE1C4C8D8C6BFE9D3EE2A335D477C60FBF43B2E5FFFE1546F5172EF51CFFB2A772E1575EAC79B24D49FD77F0BE351233E57EE6DCC7E2E29994873ABD434D34ACE83400C026E27E27888EA0BDD1BDE5A3E55AA8B5F2FEB57B8B0A96CD831906297C8169D04F15843A3249C50523CF56A4E19492EA16927DBA8759B88A99E0D20820E51FC9B6A6863115CF05C5BC3F4C869EB5A87124DF5DB102D737F3899CFAA5FEA4DD62DC4FEDB1AAFF67906ADAF8968020EFA5B10190F70E5F2C0F0457E4341BD449201D3A80AEB791254EC1C46DDCEBC3896C6DF702509BA62CD446D275806438EB4C03132B2E6BD01BD2F832D1D3C053C48C5A9DB1C4A22B130C4C9E96A2BF4C2A8F7DE0217A52D9AA5AEEE5E6A49708237EAB60B4019A51390C3EF10572A73D436875BB8D7D78543F96376E4BF3BCAABB92F89215E8D1093F3B287945708B5514BD7E62654D3BDF34B29009C64829A0CBF33C54D7AB0E81B81BDDA93028B341AB1DFF3D752DC4A1E5F9636A5C46E137EA35919D99E6571C5370C6E804BD2E2ABF566F035D65CF8F97E3E8F2ECAFA153BC6D8EC2831667A37FC96D1C2DA40BA84D0FB041DEF32AADAEF3F98CAFA957F6552F79D28A36B8BA20A9452671DE1BE8AF5D66714232507EDB9FF657F3D7E5FA7320FC0359A5F99280D446283BC + +count = 18 +seed = 790FC03F956D1301A735504075B67A05944A762E0A4BDA77BB8C036C5CF911E2B561EC1CA6AA355D5CEC919AED42A1D2 +mlen = 627 +msg = 021E9C06A2E4EF63D1A61958620C40016783879080D44311E04F2A446BCAEE5A486D17FF0F356BA70FF1C2B55BF957A59202903AE349878CB822E04275E0AFAABC0803BB6CDE3741E0BF9FCE0C5D5C814977474533DC63F9ED4F32AC3477A3EC9893EF55186728C85B03F4C2E61CA7733E1706766AEB8FEA80E233E8761B57FD5A3CEF700196674B34A3A55F68B3368B688FB1DDC976FF48BA6A98E2D66023F291A3C617A56CCBDB8732B8C34369ED11F4CCEA8FC8F673AD9FA0FD8990BEF70AF44C617FDFA096695D0C94EA8E17554F4461DC776DB2F416448B17680FE4D29B09E57603D8EBF55771AF84D8D4B9097302901C25CB6D73932E67C323D12C8ACB0E74CB89755F7EB3999D4EAB5E1B775E6B5C29D9733697030A26F3B93B3F286DB0F2DBDA71E1F103878063E77919D8892EB6A34F821B603ED4A898A9F30D00FEEF20985FEF1A7B7AF70DD29C269E88687F005D551EF05EB0603FD38745AED4F5BF4C2FC09F0604C98AE3A89E46BBFE907B87A1672DE547D651F035F392A8D4DB5E7260F43953028E312B95B9F25FFF2C0C579218390411D13D9A25F22DE4C7AA05FD11781DB08977160D48E02372C7D826F5CAC37D1A9B4230BE99A2D13CC2E9B2B17F0A1044EB9E0A2FBA376D35CDD2BC05F57DCE4BBC3BF07A09BCDE369929E6250EFDC61689466B040AEA376B09453A2C16813BBB685B54A225C49008BA6811E8BB5B3627F8C281244FDF5533216D126ED0E64FDABEC533424BFF77FE722CC438CA7587C19D965F0BF085D8692C27C5C84A9DEE53256D978948D89ABDF9842E0B765BE6A507D8630CBC5CA7FA0FBCA1CECC78D2E536AA7B2B902C4379777AC0920D69C57CC4E6032252BDE99E1A555E80D4 +pk = A27A76C95A406095416A577975B4A1E3FF368E268200395138C48F9CD6A4874087B522C232ED1189E490C12BC6D5AD6BFF4D7D06F58C9F0C667966CAC143660163B1C4C6F2A5B348740AF0EE962750739CF11252A265EE233B17E6292A8FDD6DF024BE8EBB52B13D4F9BBABDAFF03C5C7B2CFA415E3AE6E2332AD4DB65D4110008 +sk = A27A76C95A406095416A577975B4A1E3FF368E268200395138C48F9CD6A4874087B522C232ED1189E490C12BC6D5AD6BFF4D7D06F58C9F0C667966CAC143660163B1C4C6F2A5B348740AF0EE962750739CF11252A265EE233B17E6292A8FDD6DF024BE8EBB52B13D4F9BBABDAFF03C5C7B2CFA415E3AE6E2332AD4DB65D41100083DFEB41A3DB5D97B5FA640152CDFF32FAC2A7A25424A63717696305FDA5E36C8A300000000000000000000000000000000000000000000000000000000000000B834AEC57C8F149C4C73474B4D9BCD5AE049D21AA64EE82F41587F7DD0C91BC074FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6BF6BB66EB6C272460E8E4C5B64627B775C1AC0C4871A35A5C7AB5F0AD6467586BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E835D85A26D0EBCDDAF52AB8A2884E7E5FC38C6B0E978A93EA3663E62BABFC039C5AA58B2A1FEC131A309F2B19D6DFB6F02F356BD0DA8D7B107F6D21ACFD0A5B1A652E496D42AEA68E7F3117531590028AD66CAE20D24BB4A423170A0569AAB150438FA439E7A1F9DC865DE22197335BF797A83F05C6495930EC3C0D5504CF69857696EEE9BEC19C27AAD9560A149E8FF583E4572723364784876660EF8C269D10C1CE35ACCCD14A44874E130CD20C981B0C584AE2B5955DB5F02C7F0C8EB84D334CFDDCD5076F7F1F49178B7F31B4BDB722EB5CE001FBAFB9CECFD2631A97D744AB37488B40995C34B1223AE8AD3AF7789C970D83F389617D261A0E +smlen = 919 +sm = 0A8955F203B5EFD08235DE2E5C3DEE70D71E9DE1128029FFA5DD4E17BF6458C0A4C2A16AE8387EE54A86B6E65D629FAC7FEE26B530F6C9DE84BA4D612773340102B22EDD937AD88D80F99FE10EE245D1897DA9D00CF3C6B868CB9B0924A1E22AFAC7667E39CAECE1941BEC70BCA7C019AF7165FFEA7C7728573A666EB79BD00000039541E05A33537F0356EF05DF5A70AE1D5AC2527144D5A3B7362F1F8C9C5DD453BC5414A0C7E13E4CBA2EFD26B953A614920DFAEF30D23FDB12BD31AED7A508392E7F72B7F59DE9D4EAD1099F2BF7082E358FAD7FAA24F8A84EDBF77FC779AB2B00287A30F6CA7BF6A343E8E3AA6B1A7C9C51EA4656459AAF4A4CA0202A2FC86308D914E12A4309E1EA1A40671428E34918461936BBD02DC01E5670BE91FE20000B04021E9C06A2E4EF63D1A61958620C40016783879080D44311E04F2A446BCAEE5A486D17FF0F356BA70FF1C2B55BF957A59202903AE349878CB822E04275E0AFAABC0803BB6CDE3741E0BF9FCE0C5D5C814977474533DC63F9ED4F32AC3477A3EC9893EF55186728C85B03F4C2E61CA7733E1706766AEB8FEA80E233E8761B57FD5A3CEF700196674B34A3A55F68B3368B688FB1DDC976FF48BA6A98E2D66023F291A3C617A56CCBDB8732B8C34369ED11F4CCEA8FC8F673AD9FA0FD8990BEF70AF44C617FDFA096695D0C94EA8E17554F4461DC776DB2F416448B17680FE4D29B09E57603D8EBF55771AF84D8D4B9097302901C25CB6D73932E67C323D12C8ACB0E74CB89755F7EB3999D4EAB5E1B775E6B5C29D9733697030A26F3B93B3F286DB0F2DBDA71E1F103878063E77919D8892EB6A34F821B603ED4A898A9F30D00FEEF20985FEF1A7B7AF70DD29C269E88687F005D551EF05EB0603FD38745AED4F5BF4C2FC09F0604C98AE3A89E46BBFE907B87A1672DE547D651F035F392A8D4DB5E7260F43953028E312B95B9F25FFF2C0C579218390411D13D9A25F22DE4C7AA05FD11781DB08977160D48E02372C7D826F5CAC37D1A9B4230BE99A2D13CC2E9B2B17F0A1044EB9E0A2FBA376D35CDD2BC05F57DCE4BBC3BF07A09BCDE369929E6250EFDC61689466B040AEA376B09453A2C16813BBB685B54A225C49008BA6811E8BB5B3627F8C281244FDF5533216D126ED0E64FDABEC533424BFF77FE722CC438CA7587C19D965F0BF085D8692C27C5C84A9DEE53256D978948D89ABDF9842E0B765BE6A507D8630CBC5CA7FA0FBCA1CECC78D2E536AA7B2B902C4379777AC0920D69C57CC4E6032252BDE99E1A555E80D4 + +count = 19 +seed = 716354F7DEAE272CD26929C0932CA257AED1DD23D67260726B5213D82E61466FA99BB6A7D81DEE9D0EBE03DEEE4DBFC7 +mlen = 660 +msg = 7BEDAFEBABBBFB863CE496475F54E69A905AFA45899C3D7C16CFC73E31597D2404AE7014612E4CBFA238EFAF5B396B0B7435ADA5DE817E013188C280423C68924E1FA2A33CA56E6B85B7CCA7F00D3A6151F0629C1B92A13573320E0025863BBA7F3EEB987EE1B1A6230B10765DFC1FEEA498AE4B83521188E7503B506259103CEFB370E3651B06DD4F08013FF3AB9E2430626B0BD584232948462D85C0F82DA07B96FC65F62A43CD2F132D1A1D691C085980DAD8796CCE2FA0B268395EAC3DA2CC400F30F75BE87316216980CE213B48651DDB9E294F8CDB2CA05D3F2A507E4A03E2849AA8062918AFB5BCE9E4C3ABF2FFD4751DDDCF08AB09E36A29B830F3BAC6FEEBEA084575472E6F4B239AF89965A72954769A83E391DE467934237B07D8884A6B14CAD034FBF9BD7531D50D742E234E227E1A2DAF77A2FFACC579525134B15186D81AE6E5538871024BD2897475D6EE5B11BC51EDBB928D98475073785A75B331BF3D2297165AE6CF95C3A05F06DF747498462054F58A5AC736F96014B1A8CDB319D030D06DAD9CAB2B913F35FC392E1FC4B027CDBE775D64B04F1076A7C8F44C360745F98E87B84C18AB76F84F373F635AF4C8A87DF08DD4507899BAD892FF8CC1EE534D3277B5B82095628B84A7D5582149CF46C50AA963B56B4B91966B106B4B2EAA45D83A10993E8F933370AB29C6606B7CCFC41B21C6B99F2B9AC643E24300B350FA199EC10E64E4AF19181F78E8C43B2FA796241DC42CC8992BDFCDC39E7BC41BE68CDCE4FBC47C996DB42E8249EEDC146C216B514430C705FC939B9EEF677AD87F9CEE3398551FA0DAF774302324A410F4A4F4FC035CFBE960B38C390441E92D9E5624A8745976BC88FA538E398712361B77AD4CA5FF038D9F6CE157EB8A6137420D4E57018275DCEEBC4E480A5D +pk = 18228D8A383A6CBD62CAD3781E0399E733A1ECAC64B13A5E77ACEE4618E167BE1CC6A3D322071D8630285B591267633DF8A359621821A35E9752729FC171E6002B83D90A9D352423AE28876A19CC3AA70F50E95305243CFDC864B92FC25F199D0ACFD0D5F9CDEF71D436DF4B95D0CCFF3CCE8DB9CD7B754805293733B7E4290009 +sk = 18228D8A383A6CBD62CAD3781E0399E733A1ECAC64B13A5E77ACEE4618E167BE1CC6A3D322071D8630285B591267633DF8A359621821A35E9752729FC171E6002B83D90A9D352423AE28876A19CC3AA70F50E95305243CFDC864B92FC25F199D0ACFD0D5F9CDEF71D436DF4B95D0CCFF3CCE8DB9CD7B754805293733B7E42900099103AD1CBA75A1706FA918E51C88A863DB9E00CBBFA63983A7E057A6B80AA0049600000000000000000000000000000000000000000000000000000000000000DEA637939FBFD2AF71781BFB23CF0B9CC25F180AB56B56AD6A95860E333C120100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF538F587212C9B10D204C86992DE43839503FF9D4F11262ED4AE43A952169698253FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001F7FAC5CC8A711CD288ABCB8FF183FF0763B8B282A6489A536B8677E32BD6E65584B1CD34FBF5D225B10536CB72747800CE3931C3666D4EB0F0B4B593D9F07278A2F9BC52A06FC3A4E70930AC848AFFA3E0AAEE37816F5FB033266B20DECA858D6A49B8A5C4BFC5F275655BEBFFA0F57C9ED04A523308E214C8CED16350F65A0E481FCC62DFF472676104B6B12D792917E15CF2F7F8991470C5D68A8E348F58AAA4F3DC1B0253A00C48F7EEB790B8105C30F361CB13E0F7B53C084030D0254DDFCC66ECC3424B5BE77016AF746B2A7054AD6F6B1B87699A4F517FBEC84286A635DFD81780BBDE190E671D9166A2322DD06EF2B23EB85400C4EDCCB00 +smlen = 952 +sm = 3C05EB7F0A60DD8229ED8F99198FABFFC8A1B07796F2AED82554A88C68474C73E2C0706E9784838CC884E0110172874A4D1582747DA9283B71134083B8A0BE008721632B820B7AE8C9B72CA218280B1C14D7529FBC34A73962C5DA5D16217D7F1AFCF8F49FFAF0137B72CC2163468D749C4C5B0D30B6D8E8732BF8520EDE560100014DFFE221C85CB35FE6D4252298DC679677F615F2FE24A375FFE733F60DD89F64AC0E5D32899ACEA4C64DBDFD82CB3FDE69E2D365BAEBBF34BEF7E344FB93B4581F192E784DA59DFB745B3C83450CB5151CA021F487D3DDC8D1137D8CF8D9B71D82FE5C30A96462741E03EC70808334E20DA853030471F4FD92D5D8AFF306EE279659B1806EF702728241CB9EB15DD6DFC0BD6E2FBC9ED979DE4D441D27267C0002027BEDAFEBABBBFB863CE496475F54E69A905AFA45899C3D7C16CFC73E31597D2404AE7014612E4CBFA238EFAF5B396B0B7435ADA5DE817E013188C280423C68924E1FA2A33CA56E6B85B7CCA7F00D3A6151F0629C1B92A13573320E0025863BBA7F3EEB987EE1B1A6230B10765DFC1FEEA498AE4B83521188E7503B506259103CEFB370E3651B06DD4F08013FF3AB9E2430626B0BD584232948462D85C0F82DA07B96FC65F62A43CD2F132D1A1D691C085980DAD8796CCE2FA0B268395EAC3DA2CC400F30F75BE87316216980CE213B48651DDB9E294F8CDB2CA05D3F2A507E4A03E2849AA8062918AFB5BCE9E4C3ABF2FFD4751DDDCF08AB09E36A29B830F3BAC6FEEBEA084575472E6F4B239AF89965A72954769A83E391DE467934237B07D8884A6B14CAD034FBF9BD7531D50D742E234E227E1A2DAF77A2FFACC579525134B15186D81AE6E5538871024BD2897475D6EE5B11BC51EDBB928D98475073785A75B331BF3D2297165AE6CF95C3A05F06DF747498462054F58A5AC736F96014B1A8CDB319D030D06DAD9CAB2B913F35FC392E1FC4B027CDBE775D64B04F1076A7C8F44C360745F98E87B84C18AB76F84F373F635AF4C8A87DF08DD4507899BAD892FF8CC1EE534D3277B5B82095628B84A7D5582149CF46C50AA963B56B4B91966B106B4B2EAA45D83A10993E8F933370AB29C6606B7CCFC41B21C6B99F2B9AC643E24300B350FA199EC10E64E4AF19181F78E8C43B2FA796241DC42CC8992BDFCDC39E7BC41BE68CDCE4FBC47C996DB42E8249EEDC146C216B514430C705FC939B9EEF677AD87F9CEE3398551FA0DAF774302324A410F4A4F4FC035CFBE960B38C390441E92D9E5624A8745976BC88FA538E398712361B77AD4CA5FF038D9F6CE157EB8A6137420D4E57018275DCEEBC4E480A5D + +count = 20 +seed = A32E6FF879EC8866A5F5E4F6318DA8FE6743812ED2CF5FB94F5C3AA3EDF953CBC32665810B71B2CFEBF343A571CBC570 +mlen = 693 +msg = A86EE95388DF139F9C5A84108D1E63F7A7842909B818E9A0425C257649ABF125386FB5286031E7E6D0EEB85C452E254DA39BBDA51F0D2167EC0A51992753DDFA76874AA80804E705CF8BBADF3B82B6D7FBA3D1CAD130ABCC0B44D6D893356F3E94BF8E82AC532EF8C5E5F4200207BCF6B754F14E57A889FFB753F516EF8DE2A647FAD8E449264F0BBB4CF48BD01501736DA49509C3426A3D4108B98E6A4AA6C4430E8EE76540051FBD1DFBFC01750E26547F8718EF7D897A0342BB000FB99AA63B781C9A4B831DA798C014E58725E03D2F8B1A029C3337F4099239244AA320965B2CB5075052D901B6077A18C1ECFA5F272850A475B5F6BBC83F3C09A27072F80743B23EC6A9870913EE2805B4D296B2F81A9D733E5C8D5C0B477E51F9328AF3AF8ABED960408AFECD27FBDD08FEF50F4B07959646E0A02104A69674294A79DE0B25B65F4DBFA797E5FA56D66E8BC07D5E2E7C7D2E845699ACEA3BFAC60B2C0B988CBAB949A5B598D8E2F1AEC66196E115AD7F237A1C7FCFB95A1BBD6939A250E7BB0F4A02C23CB1BD81090CB770E3A70CB081D121BD0BD5ED1DC06D61282B98BF2DD7B13D2C6CF833891C67951D7D0F429EBDE3F1DA943ADB8AD285E6F13F798D6CD9A0A06BCD6125EBAA48F8F3BD5100A122F617817E3C42EBC3C3B154258FA26B9FD886EBFAD42DEDC6A2C4F9986BAD88A2A79D7EE603554E9CFC5FE33A3A171CF7BA94FD43228019B2F6FF96A8ABBC58D2098AD95A95442F6858EB69E131D7BCADAD81B9BB69D7682A978279B631E22927DECFFBEFBE8FB2E51D46A3FCA66225D30451CEF9953EF94F30B99F2B26EA75B84935EA4FB257DBE5734454B8087B3A4E115C6D31E72709303E9F0BB8C86FC6B11B93B53F9781BB92851A5CB5DC00D0B4E15683DBE4EDBE986966FE1F711F24DE9A0E1BEAEA8E835C70CDDC589773D31191B74AF780EB69867829ABED6D3FFA94D577 +pk = 18821E85FFD587A12FFF9BC93EE712109BBB4CBAA42000AF6BA0059227843D3452CCEC41C52C5A954B92911D80F053C5399D5BC142117572B8BC5C9631BBEE00CDB138677F8557F73B55C13CE6F7DB452FE484BC4851EDDB17ED7318964711218495555F21ABEBDD65A8C6C1D634D8BDCEBA45F17D1A664868C829072B50C50009 +sk = 18821E85FFD587A12FFF9BC93EE712109BBB4CBAA42000AF6BA0059227843D3452CCEC41C52C5A954B92911D80F053C5399D5BC142117572B8BC5C9631BBEE00CDB138677F8557F73B55C13CE6F7DB452FE484BC4851EDDB17ED7318964711218495555F21ABEBDD65A8C6C1D634D8BDCEBA45F17D1A664868C829072B50C500090BC9A48993D9B5D7E354B3AEA3EBD9E8FD25544152B45F079326830FBB4CB93EEB0000000000000000000000000000000000000000000000000000000000000094B97D7715F7F0B7C98E231F595A52D478F6E891E74B46EA7BF6867F98A2788AC0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25688E47C32326D73BBD5FB39BA41AC37DF807F3BA6DD62A9B117278693DAE83F3FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003AF96A05763921FC13321C1A0499F57D445A71DE773D2FB4FB031A162CCEBCAD9F9EDF3B4218F7A07B009EC6AD5CFB47B01731AA1F39F688BCE64C5A131700293B908C4EC1FDFFECD1B886D761EFC61CA4390414A3369A0792DA028DB09A0864FA0F6859743121543434250B95B20921D651AA7281E78F5AE48EC698CD0BF548C3A7C6F4B0B0AB06ED7321DBEAC4ED8890FB28DF96C62945019769BD9E3DB3994FCC445784C86B38E993A93ABBC5CAA5EAC4E6465ADF4D43DF08B3540E0995D852E0C872B6FC8EAB60F2DC64C496CB5279124496D28B25A88BD5E633314F7DFFAFA2A283BA327FF70094A3A2DB68AAE5BB90DEF152E108EFFAD4AA09 +smlen = 985 +sm = B342E2F0A8ABF2876329D46576BBB5D4627E38550CE9DEFE9C7E7C638F1FB83956AF8A279685F033BBD21B5B6CA44CD45FE3C114942B091DC784E45D13AB6C018DADB02FCDC7110ED32299FA688911A0CFAF910D80A994ACBDFAABBCADF7709E328A9DA458534252F04B90C4FEB1E578256242EC6E8086C8008362670FD79B010000D353E7A09A5D599D34530D55D8528F2AE3FADE5B311CE9F7FC10CC7BC64E8F677C19606C2DA815462AE39B0B12C35BCBA4C020A0DE62649C78D9E3E8FE8B4A7901025117B8D8539D7C1956E9CD8501A86635E51236E7910FE8DEB5DA0158926B4B597E523200B8D12D3FDD8EF0401DB6D5EAE7847EF2F8A484D4CE330596491FF3EB8B1E59405648535027E99237AAF4881E02DED934E2E7774FE3F1DC9544000402A86EE95388DF139F9C5A84108D1E63F7A7842909B818E9A0425C257649ABF125386FB5286031E7E6D0EEB85C452E254DA39BBDA51F0D2167EC0A51992753DDFA76874AA80804E705CF8BBADF3B82B6D7FBA3D1CAD130ABCC0B44D6D893356F3E94BF8E82AC532EF8C5E5F4200207BCF6B754F14E57A889FFB753F516EF8DE2A647FAD8E449264F0BBB4CF48BD01501736DA49509C3426A3D4108B98E6A4AA6C4430E8EE76540051FBD1DFBFC01750E26547F8718EF7D897A0342BB000FB99AA63B781C9A4B831DA798C014E58725E03D2F8B1A029C3337F4099239244AA320965B2CB5075052D901B6077A18C1ECFA5F272850A475B5F6BBC83F3C09A27072F80743B23EC6A9870913EE2805B4D296B2F81A9D733E5C8D5C0B477E51F9328AF3AF8ABED960408AFECD27FBDD08FEF50F4B07959646E0A02104A69674294A79DE0B25B65F4DBFA797E5FA56D66E8BC07D5E2E7C7D2E845699ACEA3BFAC60B2C0B988CBAB949A5B598D8E2F1AEC66196E115AD7F237A1C7FCFB95A1BBD6939A250E7BB0F4A02C23CB1BD81090CB770E3A70CB081D121BD0BD5ED1DC06D61282B98BF2DD7B13D2C6CF833891C67951D7D0F429EBDE3F1DA943ADB8AD285E6F13F798D6CD9A0A06BCD6125EBAA48F8F3BD5100A122F617817E3C42EBC3C3B154258FA26B9FD886EBFAD42DEDC6A2C4F9986BAD88A2A79D7EE603554E9CFC5FE33A3A171CF7BA94FD43228019B2F6FF96A8ABBC58D2098AD95A95442F6858EB69E131D7BCADAD81B9BB69D7682A978279B631E22927DECFFBEFBE8FB2E51D46A3FCA66225D30451CEF9953EF94F30B99F2B26EA75B84935EA4FB257DBE5734454B8087B3A4E115C6D31E72709303E9F0BB8C86FC6B11B93B53F9781BB92851A5CB5DC00D0B4E15683DBE4EDBE986966FE1F711F24DE9A0E1BEAEA8E835C70CDDC589773D31191B74AF780EB69867829ABED6D3FFA94D577 + +count = 21 +seed = 5A64401EF8E63AEE18E8CC0162845DC7AF388230E86728ECB330007F2546F949764273EA05B397FE71F567E1527FA445 +mlen = 726 +msg = F5ABE373CE1F6FB14F2014F5BC0071B17AB2C84E8845FCBF4B15C79FBF2E5E06CFFE6CAD9A283014A975F81C9216B261CBC79EDCD58D0E20C586D7C641E0EE97221BEFE54DBCC56A594DF103EC24B52DDBB6052D1644972640F39DEB98997FEE7A252A65070798B7E46707FA440375B1BA705B3ECC7EAC56D9C45297E585299C7D747B430F0D01E82081C70B4A87846F90267D5163181DED63E089A00AFD33B0E2B3ACE91182D8CC899223CE65A5D84B86BB3E8B34B13949BC800F2145468BA5411EACD6A6C331C340D4442D28EFA0DA959A2797C7181BD4BBE6E6DFFD134CEF373ECB0EC08590F06BE0CE292D3718E2C0EFC7CB40F1DB26F5F38FDC82A72F81AFBBC16591EE02DC818D63CAE69FF0A28F942F7E07F6B0A741F3F0EBE3D0EA5859024AA408462D3D268C23F95D717C0A685A4CA73AD90EE923DB57CD6CDD828B7AB0D4AFA6A9AD7E32D407A44D7515C0A6AF52A66AD72119BA1DAEC6514DE3F8B462EC473072226AAD61135B0F5EC646BA9A127C9894E51FDD1B2D38011A2A6D7497A55283133695D0AF9B3FF7C5A8FD667231F9E511E3B8C4C3ADC44D02DE08C47B2382DE67B32826754C6BE5231CE0FC657341E20247CC6CE574F3D1A9376AC8237B49E5030E877A4E33CDE25D838EAD659EB1678706C759707FC66CE84CC968A8334C18F1632348824A6985A0331A93B59497B70C1A03A6848F18F5992972BC79F07F4222D2612797F495463836AE6CD3858D5B9BDF744A1CF361B5D454D41AC899A4FA61081B937CBABBF0FFEC1B31C162224EA36CA2CD7FCE54EC1A504932ACC5BD0B17A156DA7488F7017E4916A687FDE7FCEBB2901813B07964084AB0447A94DAC3A0D3FDA05B9F497CC1555A8C74838E29CB8CE89D304DEBE419D26BA7F3DC6E9526BD895495A5FF1D7EC83F70D045E306E7C2487A52CD7553F062D31888EF7FD27F667FCFFA984AFE0B9A4C4E85CA943812CDC157C5486B0B5EA6DA05E4BB8697113190321A976D1806DA129101E60A28B7 +pk = E919E85984B77AE2B8D378DF88C32D7CB24BA0F1263B8AD8CEF85DCA9B5C0EC2F1EF4BF562D1646A043D4FF711080EC2217BE409F1DED5AEA192ADF3AEA68E00CE26B0D4572026A1BD94632A149DFC7DA3774E641A624611086C3545635ABDE81468BCF30CA35D67C32E648C61B89C8AE5096C2FC83E7948908C7F3DED8EEF0004 +sk = E919E85984B77AE2B8D378DF88C32D7CB24BA0F1263B8AD8CEF85DCA9B5C0EC2F1EF4BF562D1646A043D4FF711080EC2217BE409F1DED5AEA192ADF3AEA68E00CE26B0D4572026A1BD94632A149DFC7DA3774E641A624611086C3545635ABDE81468BCF30CA35D67C32E648C61B89C8AE5096C2FC83E7948908C7F3DED8EEF00042789D71130AA1A9134C53DB7BE877333EF1C872797157254BD7FD36D5884A39F4A0400000000000000000000000000000000000000000000000000000000000014B4DD0C078B5EA7CAB54D0887A87E23E91A8FA7A16CD1FB981A48D8F5B0C964F7FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35234390D5615877400931F275B004A6B32FDF0251A19F35F94FD79A2019CFD253FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BC7C7B1B57EFA36E8EE6E16765186634974D629631F6C29CE359D700C38DC231F1FB614880E51A5C6D6E5830446A6A7036C5A7CFEBAFDF18ACF0F10682220095007C303AE4A2C59CA43F3A46B00A49DCDBCAB8E1B12BDA3818A4A8E2E9B46C8FED4C023D2BBBC500B7A1D12BABB5E08F0F64AC15E09AD21ED7CBE8584F08CD248CF52C0F2015AA188E1D7C8FA4140EB6BDEE225B97D351A40299DA5282AB89212631165409738885331987A201A660BFDF142E5D60ED5617AF544BA90EA68BFCC9387FE1498B6A3C68FB89DFF1CBBD3A0C5C04659392589BDE83CBE1D0CB5E3A923D8DDCAA81A40DF43B48F805F0622542EFC94E3D0A379C6D300706 +smlen = 1018 +sm = 9C3FD844212756BDB37325B1DD2A0A4202D6536B74929460663BAFE1E25BA8D0293D0933C24EDE8FDF34C5BDD00FA6B9512BABB7457E773DD93CEC876A588E008BD1A6195104DC90C24325D2A601038161FBDECC4F2C84CF70AD69F863D7B8CBEE5645488AC8079B61974979E9663539170B7783C2CB6C8D473BFD18AC230A010100FD449ADDAD4B8AB92E171103FF646DE9EAB548F410BB48FDF5E6CA494B34C601C64E4FC20690057368455A967995E1C472DD2097A42BBD88055AB01BD418141356C3F91EA82B3313CE577541EFDBEAC7579585BA479C231CDE5873B3DFF9C70CA5229C3D9369C2330845AD7BCF75809FECA87461AFF5B3254E232309BE88AC00621667E1898907C8C269ABBC05D83F440EC4162C1403B74FCB0C1D16547754001309F5ABE373CE1F6FB14F2014F5BC0071B17AB2C84E8845FCBF4B15C79FBF2E5E06CFFE6CAD9A283014A975F81C9216B261CBC79EDCD58D0E20C586D7C641E0EE97221BEFE54DBCC56A594DF103EC24B52DDBB6052D1644972640F39DEB98997FEE7A252A65070798B7E46707FA440375B1BA705B3ECC7EAC56D9C45297E585299C7D747B430F0D01E82081C70B4A87846F90267D5163181DED63E089A00AFD33B0E2B3ACE91182D8CC899223CE65A5D84B86BB3E8B34B13949BC800F2145468BA5411EACD6A6C331C340D4442D28EFA0DA959A2797C7181BD4BBE6E6DFFD134CEF373ECB0EC08590F06BE0CE292D3718E2C0EFC7CB40F1DB26F5F38FDC82A72F81AFBBC16591EE02DC818D63CAE69FF0A28F942F7E07F6B0A741F3F0EBE3D0EA5859024AA408462D3D268C23F95D717C0A685A4CA73AD90EE923DB57CD6CDD828B7AB0D4AFA6A9AD7E32D407A44D7515C0A6AF52A66AD72119BA1DAEC6514DE3F8B462EC473072226AAD61135B0F5EC646BA9A127C9894E51FDD1B2D38011A2A6D7497A55283133695D0AF9B3FF7C5A8FD667231F9E511E3B8C4C3ADC44D02DE08C47B2382DE67B32826754C6BE5231CE0FC657341E20247CC6CE574F3D1A9376AC8237B49E5030E877A4E33CDE25D838EAD659EB1678706C759707FC66CE84CC968A8334C18F1632348824A6985A0331A93B59497B70C1A03A6848F18F5992972BC79F07F4222D2612797F495463836AE6CD3858D5B9BDF744A1CF361B5D454D41AC899A4FA61081B937CBABBF0FFEC1B31C162224EA36CA2CD7FCE54EC1A504932ACC5BD0B17A156DA7488F7017E4916A687FDE7FCEBB2901813B07964084AB0447A94DAC3A0D3FDA05B9F497CC1555A8C74838E29CB8CE89D304DEBE419D26BA7F3DC6E9526BD895495A5FF1D7EC83F70D045E306E7C2487A52CD7553F062D31888EF7FD27F667FCFFA984AFE0B9A4C4E85CA943812CDC157C5486B0B5EA6DA05E4BB8697113190321A976D1806DA129101E60A28B7 + +count = 22 +seed = 3222E4B55D6767E300FDE03DB3D8227E19FB8B08EA9B923FEDE18D699DC3694EFFA7C4DAE2AF57E4A0162B7C564199BD +mlen = 759 +msg = 4C4697A7D8195BC7D4B8F2FCF3A7E9419E8FC9AC6BAFC5D658260511C697286BFE44E2CE98C21C98BE42E5AF0FCEEF8AA54C5770AF287A81C7481FE3391A6111AE6243D545B2A651599B45931D7640579F8659A8BD6F77260F235F71476ED64714FDDB70C549CBE089322130F7B0A21F530508970D55CBA55BAEACBEDF684C7979078102ECFFC2C3F182F710280CABC2DECD3D3B5D3CE908CB2307B00FCC0C5412A12AECD041B5F70CC0149390312B9C81592BB0E2ECE83D4495944E29AA798DE67FD69E2BD0695DC573F78D8BB48E6B8679E1C50D1E6E58E218B77EE51597EB43ECF7301D86F457353D60E98CEDC95B4A76844E889BF7E9D03503757569E40D55AB43D63293EDDBB579FE981FFD4DAB056F85006FFB5E759B9C16F5F6B235D7DD78458A73EF37118EDF599AA504E9DB9AB5DBC90B8E478F3DC1F35A7C4604A383BBBB410CFB2C5F746F83EF94BDB2F244D421818C26827D5B7D665B8A802181EB7A9CE95B6633E24D914FECA7E969F64038ACC3009B15168426EDB67AF2CCF4E859F5C616891D355F7910ACFA599C396BBB2D2782CBF1432E6259FAA77730B6B86FE0D67730152CD2AE0F9B0314048CCD25772C01FC9773EBF06618A8CE1E940F48663427775990CDC41C4DD3E9AC6EDA1EA50E04F1D329E64C8532A7AE32238C131753D60A25810A5FFBEAA9007A6984EF69EED92B777E079CE0FF48C2AEE9C18D1DB9F49B5419EC6C0E2212DDD2E2FDEAF0FE9F2B84D9C50DDE86A70FC28BBF8918A973CC67A36E97CE3027D73891E7AEB24BAF4B12A9DC8AAB5D6AFA380BFAC3703D2D32F1E40FBB532FD6D7D710DC0741DFC7EABFE55BA5C311A00E3BE55C2EE74155E3A06685071A962D7532AC76D59FC187EFF01F8D339F74323732168FA5D14F4B2A72C9164A04A6EF14BF5DEB1833E4BAA19A55AE590F542D4448E0EAFF0E0AFD2FB30FD671631B9325F4A0BAC9A43DCD2840185A2F601117A625B0DAD5503578537BE2A535D2F556F371536BCF68C0E01C96301F08E1567DBF9D8504096A8FD89C086DB695DA191099FD1E8EA94035276D1D +pk = B44D634F81060844E8DBC94884151DAB4D77EF0C70854F57D528D982738F4B9999D71CDD636401E38DBBD5359CCC07E7697FB292562C00AF008F73945F06EF003A7A736E5CA12ACB6B38024FD3538FFA79B97B3B7031B17AF7CBF6F7FF5D880E2075518876B2D39C3D9E5812FD15E2B66ED70F39B48DF238AE516650D47BCE000A +sk = B44D634F81060844E8DBC94884151DAB4D77EF0C70854F57D528D982738F4B9999D71CDD636401E38DBBD5359CCC07E7697FB292562C00AF008F73945F06EF003A7A736E5CA12ACB6B38024FD3538FFA79B97B3B7031B17AF7CBF6F7FF5D880E2075518876B2D39C3D9E5812FD15E2B66ED70F39B48DF238AE516650D47BCE000A43133ADDE9BDB1830B6727CD5FC7C20A888DA2C74433C3AAEA0FDF1E95433F4161020000000000000000000000000000000000000000000000000000000000007AB6F9D5E07D7AB46CA1B9997658D21A4B4C3F7DA40D1F900FFD59E2F0EFE295FFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21EC2591D328EE6707861DC25BFD970863844556751A179A38B9CF2785299E027DFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007DAC40A9411E03BF83EB8245ACC64D8A7FD2BF1ACFE004D551BC6462F9AAC0BE85849717E8A45CDC711CFD6EF2C8C36D5D9B79B1B0CA118CE66EDEA5B2900E395F93C8C620F93B3400CD71FE22D01373F12107C977BB3A8620F32C59476C2070450E6EBD2AD6525A3D0CD1790F2A27B073407016F694B991E8E0A53B010618D1C8925EB8B14E75B3DE7CD7CA523C7B79E07DD749AD529B7D31F7275BE1F14A535F14F5911024ED8AC95560656320A7D4C53F281AF32742A57CE08C24018F1A4F32E68CFA0EB72A26FEBB273F91F6AA898861007291D112A68DCB350B8C76300038018F6F1DE88A87D798D6A28D7C317B60AA19F24754D504F5F3270F +smlen = 1051 +sm = 15C5AC7095F5B0F76D69D1247F790C1997C2C8A4071FA3F00FD035EF54BFF22C8BF1EFA2F7236D073CC9BC71FE7A4E38C22C4C862A0D19FFAE9DBFBD3369AF01C664ED971BE805C03A36E660EBFA22385EE28B943EA1255EFA67E3F3A24399A41A36CCCDA7B152680E5088D8339ECF063CE4C85B638E82C39B19B5B1C565D00001006E52A70FC530E1B91095C7F1602931A7DCD45E941A0C86097BA9267ED2B69F379B0DAFA548E31288FB76387768B58FE9FCBAEB2AC25578F037F9C2CF35B8A81B439A2B12550C7C1EA9960D9F2AC06E6AE6B4E986E0FD8347064A9A26705FA127D9E545C954B369E8C307790AEE5DE06DEEEBF30FCCC0F344C8284172403E872AB9876C22365BC8FC941BAA279DAFA368D7173632849401538D4E47AE7F810F0009024C4697A7D8195BC7D4B8F2FCF3A7E9419E8FC9AC6BAFC5D658260511C697286BFE44E2CE98C21C98BE42E5AF0FCEEF8AA54C5770AF287A81C7481FE3391A6111AE6243D545B2A651599B45931D7640579F8659A8BD6F77260F235F71476ED64714FDDB70C549CBE089322130F7B0A21F530508970D55CBA55BAEACBEDF684C7979078102ECFFC2C3F182F710280CABC2DECD3D3B5D3CE908CB2307B00FCC0C5412A12AECD041B5F70CC0149390312B9C81592BB0E2ECE83D4495944E29AA798DE67FD69E2BD0695DC573F78D8BB48E6B8679E1C50D1E6E58E218B77EE51597EB43ECF7301D86F457353D60E98CEDC95B4A76844E889BF7E9D03503757569E40D55AB43D63293EDDBB579FE981FFD4DAB056F85006FFB5E759B9C16F5F6B235D7DD78458A73EF37118EDF599AA504E9DB9AB5DBC90B8E478F3DC1F35A7C4604A383BBBB410CFB2C5F746F83EF94BDB2F244D421818C26827D5B7D665B8A802181EB7A9CE95B6633E24D914FECA7E969F64038ACC3009B15168426EDB67AF2CCF4E859F5C616891D355F7910ACFA599C396BBB2D2782CBF1432E6259FAA77730B6B86FE0D67730152CD2AE0F9B0314048CCD25772C01FC9773EBF06618A8CE1E940F48663427775990CDC41C4DD3E9AC6EDA1EA50E04F1D329E64C8532A7AE32238C131753D60A25810A5FFBEAA9007A6984EF69EED92B777E079CE0FF48C2AEE9C18D1DB9F49B5419EC6C0E2212DDD2E2FDEAF0FE9F2B84D9C50DDE86A70FC28BBF8918A973CC67A36E97CE3027D73891E7AEB24BAF4B12A9DC8AAB5D6AFA380BFAC3703D2D32F1E40FBB532FD6D7D710DC0741DFC7EABFE55BA5C311A00E3BE55C2EE74155E3A06685071A962D7532AC76D59FC187EFF01F8D339F74323732168FA5D14F4B2A72C9164A04A6EF14BF5DEB1833E4BAA19A55AE590F542D4448E0EAFF0E0AFD2FB30FD671631B9325F4A0BAC9A43DCD2840185A2F601117A625B0DAD5503578537BE2A535D2F556F371536BCF68C0E01C96301F08E1567DBF9D8504096A8FD89C086DB695DA191099FD1E8EA94035276D1D + +count = 23 +seed = F41B3C6225245C06455272A6A073F363E5F19F09A0B146AFCDFC2B3B0EA64BAA3F90359F32B2D1017608B03064E90AB2 +mlen = 792 +msg = 72713EA55F1E5CCD5787F172657C6F6C74081DE2D70816E8531497965DF02DAC04D91C4D09DCF8904CB152E2138F829386F4351015DA253A5B5EB92D96E537DAE3CE809443EA90332D9C754EB11F4DE586A83B5DEE7B1B9BD547EE7107530249B14279BAA04683D74B69D7BFC8BBCD447FE7706593C01188FE6AD8D0E2572D49F83E93986B380D4169BDD94E3311941DD2B041DFABC5AEA1297C65BB5C8352C99FF838D46B93B3E5F79E3CC5BE5408FE5E59A10D488DD65A997B086FDD96CEFB0247B2BAF7B490317E34330A879D04E374C92ADA33EE243D84DA015FDDEC243B00BD7488AEFE373E8AB1890273A7A2285988E9DAF9C4E7C5A17F54AD6195EDE2C79657E1BCCED0641E20F7EE26EAF53DD8C82827F2D2783D44FB030C95791F41653E628062267A5CF534DF00116C1ED1DE9F360B97555C65CDD80724104FB1BD4DA5785B5D9C24438557E48AEE58D57A03E06D553B05B67E1C8D10085C2F153647F174F7922FB8D2210454F7014BDDBC627756EB7CDEF99B6E3A2779F82088E3F2DA14C2DCB5B185AEB5D6ACBFAD43E286AAE8F84A58E8DF6ABC64E4A8EFD69FEA18DBFA6808F25FD418DE8BA923500B74E34DDA3CA6AD8DC208102DC4A876D8B8CD2926AEA4B3AE11A546F6235ABEA152DBDF43E0BCDFCDC83299207F294A707C8B4D1F56AA64A205C718ACA69B862AFE7489F11B324E7AF6BE68380D2CA6E0AF0E2E20F890F2CF98907A9D43135C03E85E86C9EE417140EFEE9054B46C110A84F1841AE3CFAFE5B4A95D6B2B606D8D0A70BAEA85C9412BC2D54146E9F866800E8E8615A0D64D1D595677E8C88699E3CA6097D47E9FE64050FB55033FAD4D5F226DA8EB5DDF99369ACC7552927ED3AC7368B9EFEA2443926DF26D1C172858FD8A5D4E1D7D39E7F7DF047385D39131184087CDC45B299BD1F7048E918223DA3F960608E853EE49EA667465DBBD889CBDA20FFBB540C9EBBA5C2CD16A22A57B561E01331D6EA6BDADBD6A5D2BD1441EF4E1D9DD11CC62A0FA5BBFFCBED0D27B6ACAF0889EAA5863DD9BB35920707B71A0805630D1769FEA320516E71CB2B125AC274F16F7A6876F4B922C7C006F38AE1F7183CA768715D2AF +pk = 7B9B0332AB99A71169356A89F779B1D91FABCB11E191F6D3EC9C8C614F8F37456CE06FCB7664624BE68179A4637D64E6639B8EDFAE67822865A9BD4207B73A01DB126C568C8EADB041D066BD4C55FE89D5CD5E55382A80C3E90C0A4BDE375A3DD3CCC0C40EE1EFA8E62696ABE39D9487B77A9BDAF49902D2CDA6E007970EF9000B +sk = 7B9B0332AB99A71169356A89F779B1D91FABCB11E191F6D3EC9C8C614F8F37456CE06FCB7664624BE68179A4637D64E6639B8EDFAE67822865A9BD4207B73A01DB126C568C8EADB041D066BD4C55FE89D5CD5E55382A80C3E90C0A4BDE375A3DD3CCC0C40EE1EFA8E62696ABE39D9487B77A9BDAF49902D2CDA6E007970EF9000B1D4B065134C7032607B936F432CEF38B16D6F294660F9D9802613B62C444502E51010000000000000000000000000000000000000000000000000000000000007AA9588BADB5C8670C0744B7B48D7B27ECEEB04F6B59D1FC71E6542FCB8ACA15DBFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF213638CAA2C82E4E49087B5B0B9F4AA82AF404E4E38B857ACD9B4462880CA87F60FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F9A497F550CE97559F667FAE7D8502BDA0CD222A19E9E215DFD4CFA6217A2CEEFAB909A0869710DD0514679F73C574D49E7AA5D6D6EC8A5C0577062626100D3E1A45181E1C0B13D53E298AF0B554DAE524F8F2A5A624576E9C1D552BB5D70FA1F5315C79FECF62075A77A63A4AA2C1955AAE40B14698C476B8B0A4F14C07F3B7EDC606836F6133976ADD64837A2FC94CA7D7070ACD6176CC68A552DB22252C84A5A2FE65B2F89206E302625F2486279AD7402809916EB1E8AC7FAFF50B3F2E3ADD39326FF8015834BED05E1AD939EA033DBB333213811ECD76A27C53040179A82DE5103251256959E516856217AAFFEB3501FCEA5F4DAA9FD6567405 +smlen = 1084 +sm = FF3CAEB1B8D988477657EF91CB9566550820C6D1F117DDC01A89FDCE6E0F61ADA9B5DC80AD8B850F776834657A90A2C402FC225614C4648AF6EABBDDBD3F8301C30DF28F5285A40CCD1D74EC92403A716F7E0D2121358B5474610807AF321358B1B9265F127890BDB4B16938C9BE697628304FC4B4A545E242946DBA401B0D0000008B2071733215C1F5B971D13070CA8DD9D7CC10F61F3FE427F3534F69AB387D2E6D9E47062DA40756A47AE952F0D0D9D0DA97E29F1C24D871AC32CB0A6FD40E0E360D10A6DFF20B9E7443A1F5CF8514C92CA60807983AB8C5FE9FBF7FEF496126F5BC8351F2A28775049357823A5AB50A9A139C656A95DC3E79F50872EB58EF7D5D1EF35F03899E3234ED81302969D23D8CD2E873DFF7D7CD01C19E40B4E00D00090B72713EA55F1E5CCD5787F172657C6F6C74081DE2D70816E8531497965DF02DAC04D91C4D09DCF8904CB152E2138F829386F4351015DA253A5B5EB92D96E537DAE3CE809443EA90332D9C754EB11F4DE586A83B5DEE7B1B9BD547EE7107530249B14279BAA04683D74B69D7BFC8BBCD447FE7706593C01188FE6AD8D0E2572D49F83E93986B380D4169BDD94E3311941DD2B041DFABC5AEA1297C65BB5C8352C99FF838D46B93B3E5F79E3CC5BE5408FE5E59A10D488DD65A997B086FDD96CEFB0247B2BAF7B490317E34330A879D04E374C92ADA33EE243D84DA015FDDEC243B00BD7488AEFE373E8AB1890273A7A2285988E9DAF9C4E7C5A17F54AD6195EDE2C79657E1BCCED0641E20F7EE26EAF53DD8C82827F2D2783D44FB030C95791F41653E628062267A5CF534DF00116C1ED1DE9F360B97555C65CDD80724104FB1BD4DA5785B5D9C24438557E48AEE58D57A03E06D553B05B67E1C8D10085C2F153647F174F7922FB8D2210454F7014BDDBC627756EB7CDEF99B6E3A2779F82088E3F2DA14C2DCB5B185AEB5D6ACBFAD43E286AAE8F84A58E8DF6ABC64E4A8EFD69FEA18DBFA6808F25FD418DE8BA923500B74E34DDA3CA6AD8DC208102DC4A876D8B8CD2926AEA4B3AE11A546F6235ABEA152DBDF43E0BCDFCDC83299207F294A707C8B4D1F56AA64A205C718ACA69B862AFE7489F11B324E7AF6BE68380D2CA6E0AF0E2E20F890F2CF98907A9D43135C03E85E86C9EE417140EFEE9054B46C110A84F1841AE3CFAFE5B4A95D6B2B606D8D0A70BAEA85C9412BC2D54146E9F866800E8E8615A0D64D1D595677E8C88699E3CA6097D47E9FE64050FB55033FAD4D5F226DA8EB5DDF99369ACC7552927ED3AC7368B9EFEA2443926DF26D1C172858FD8A5D4E1D7D39E7F7DF047385D39131184087CDC45B299BD1F7048E918223DA3F960608E853EE49EA667465DBBD889CBDA20FFBB540C9EBBA5C2CD16A22A57B561E01331D6EA6BDADBD6A5D2BD1441EF4E1D9DD11CC62A0FA5BBFFCBED0D27B6ACAF0889EAA5863DD9BB35920707B71A0805630D1769FEA320516E71CB2B125AC274F16F7A6876F4B922C7C006F38AE1F7183CA768715D2AF + +count = 24 +seed = A08AD391E0FC57A83B74CA8CF44DB67F8178262ED9B20AA0163CDD8274AC2BE05F558B112B094244370C1AAAB75077E6 +mlen = 825 +msg = 209658CD1D801079FFE8E950BAFD70A028CFCC35B9FB00D232C5603A1D51BA13E5DE59E0277962C4474E9F3F60FCD99C9B79665B3839D5C037B921A4DE8E144FA1D38182FBDEECDA6934E814D9186591F01C5E23349B34F4439B4D402C4072CB4D702966AB473D2C39443F41FBDD0C48E566D33E076422EE72FB47B2FFD661F367E9EFDDC988BCA02382EF93590D4FE3ECE8B1D9D8B3A653219C7D131B43E2FDE2851541F467C31129E6F9B9D124221CD52610B9F138EAC1D01F193148FA0415B29F5C86D15067EB1E26C9D51F05655E8545F734F8F244854AD76C6B04C230898BEA33EFDCEEF100D79F8E3B894BA583466749B82007067806E3A7B3BA954F6FC5ABFF0E099A24D14D865F6F4538736124ACC5EAD4169DDF2144AD558DA3C74CDABEC147D2AFA113EDFD1E2280766B18792310FB6B4FE5D0D9F65906B1CC43655BB3D6178EF9093AC9C8F1A91BF49008179394EEE79E1D8E3228F567770C1BA1E30BA4BCE2465AB68F53CE21C0D8AB2F6E535828F211D4DB957DC3AF8B7E00DABD8F1F74C959B2AFF45121C5B5ABD3136C6F55D5F5FFDBCEBC3CD7A430FF3813D23BCDC1254FE6949DA4E7694028B7FCB876099E91B92C65D85C39D4BE9325AFE81703E5B18CBD7BD9EB59A9BB9408ABD966ADE9A60303807AD1B2C14C04CDF8FAE6950A55B21C9EBB5E94713BF8C2890215C5DA94B59CB31EDC671093B15FF5014DB4CD3EA8060260DC1612E9FD6E5AB40F0656121F689C8E94212269A7B24305C83BF0583418755CE690913CB081F2893FB42BC4750F2C053C48C1552430793CDDE1A49AC9E21913210D727C4BEB5640AB9B7505EA4E59AF417A085394181784BF1BB0BC32BD71CC57CE77541581F14B8BA4B758500694796262B561A38C72893C77B548D779A3833EEB064CDDBA5471CBFFBC769E139946155BF376A56415AB743DE568CD21895ED6951B5BFE1B1629DD6510DCD4483F206954964E0517546DD96900A2540A51835818D1730B0C9123E7FD8B28E6843BFFB659945A273CEA944FF6E83C234B3E43DB4630614E0B67778EA760EE341FE68C525E90475A1560821AE6B2A85015292C36EAA2E041AC04FB55922C48204525187C7E0476A9FED04EFBBA96F369D8AE709506620127FD399613A9796C4FF96D7E +pk = 9AA3CC10A1563FA21216E06AD2D8322872CCD5BCE50C7B9E9772956C7513DA7B1652258C631B3F1C0A0CD71E6585BDD21D104E829BCD5D5C89A7429E00E494014BB984CA4C0E5F40EEA0CFE5375FE4C907993EBED2905A1EEFDC940C14A88E01050FD3483E872624F3B2F104A42BF40CC7488EACE0DEF541DCF8246A303E460102 +sk = 9AA3CC10A1563FA21216E06AD2D8322872CCD5BCE50C7B9E9772956C7513DA7B1652258C631B3F1C0A0CD71E6585BDD21D104E829BCD5D5C89A7429E00E494014BB984CA4C0E5F40EEA0CFE5375FE4C907993EBED2905A1EEFDC940C14A88E01050FD3483E872624F3B2F104A42BF40CC7488EACE0DEF541DCF8246A303E4601028B2BB438ACD4A18C457DEC77CEE6A70A27CEB5AC7B62A9119E12932F8AAE9128AA000000000000000000000000000000000000000000000000000000000000008C8E4FB0273DEDEE8DC9229C7608F807D9B01C21C21B016E7FDCB6A827D1337961FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF514C505BB7120C349BC58DC952E6D8760FAB0A5C6BF2AB6C8C30B8E9D7070FD2CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009085F68A437DB6037B245BE1597F00215EAF941837CC28C53F7BE4F63F9A9BD2A409F3AEA831DD4FDA1E58ED2D766A6369A7B350D983F6BC3926D242F5E9056D3B0CA7414A135BAD06BBAA9148D8F21F02853BF96AF33AE5B81AAB2E47978633B1337DCD095035A0735D8955876BFD7913260B6A1071CBF162033D43BD0F3796573D4F5DEE69B288ABF5FA2BCAB94D8CB8D5011967C5BAE41AF0BA8EFBAFF1A5B75D332B7D49918E15509AA68389AE3D13E9AEB8D8A4ED12E4C51BFF08F392058375447122F3C9658B2316F3745AE4BA135B5BAB9CF933782B7922429A28EB02D1BF37EA18B84FF0BDBC5BEEA2249AE65967CA6D9BBF126CCA52B802 +smlen = 1117 +sm = 53D65EB344ABE5553853BA79377E25C54D005BB43FCAA82FA7D855E1282E2E13114CB0B784DBCC49ED12DCFC0ABAC73737FC059F0B3C5DE6F9AA19EBD5A53201FDB6C51252D7312D7063B85ECE83CD31697D141E9AAABA2CC3B3674E8978FB1EB6D1F332BC1A901D78AAE126AC6DD4776DD321E8D983132E25D4494CE370200000005D73513892E2AA76C677380A158BD721EEE7CB21B3635A0F346A1F66F82E45620267D259CA39341122C779B47C33AA3584220C4FC0590736C8AA82EFA21E057B7AED8CD3165F11A44F59334CE437BEBE5F237FB8A005D9A4EA47C47138B13576D34E2D0B262D976FA4A33AC12AB374153CC815375856A21E98DA66DDC067001463770F7581D3EAA653EA34F845AD60F16CC3F136CDB50B0A818D2E8FA67611000C13209658CD1D801079FFE8E950BAFD70A028CFCC35B9FB00D232C5603A1D51BA13E5DE59E0277962C4474E9F3F60FCD99C9B79665B3839D5C037B921A4DE8E144FA1D38182FBDEECDA6934E814D9186591F01C5E23349B34F4439B4D402C4072CB4D702966AB473D2C39443F41FBDD0C48E566D33E076422EE72FB47B2FFD661F367E9EFDDC988BCA02382EF93590D4FE3ECE8B1D9D8B3A653219C7D131B43E2FDE2851541F467C31129E6F9B9D124221CD52610B9F138EAC1D01F193148FA0415B29F5C86D15067EB1E26C9D51F05655E8545F734F8F244854AD76C6B04C230898BEA33EFDCEEF100D79F8E3B894BA583466749B82007067806E3A7B3BA954F6FC5ABFF0E099A24D14D865F6F4538736124ACC5EAD4169DDF2144AD558DA3C74CDABEC147D2AFA113EDFD1E2280766B18792310FB6B4FE5D0D9F65906B1CC43655BB3D6178EF9093AC9C8F1A91BF49008179394EEE79E1D8E3228F567770C1BA1E30BA4BCE2465AB68F53CE21C0D8AB2F6E535828F211D4DB957DC3AF8B7E00DABD8F1F74C959B2AFF45121C5B5ABD3136C6F55D5F5FFDBCEBC3CD7A430FF3813D23BCDC1254FE6949DA4E7694028B7FCB876099E91B92C65D85C39D4BE9325AFE81703E5B18CBD7BD9EB59A9BB9408ABD966ADE9A60303807AD1B2C14C04CDF8FAE6950A55B21C9EBB5E94713BF8C2890215C5DA94B59CB31EDC671093B15FF5014DB4CD3EA8060260DC1612E9FD6E5AB40F0656121F689C8E94212269A7B24305C83BF0583418755CE690913CB081F2893FB42BC4750F2C053C48C1552430793CDDE1A49AC9E21913210D727C4BEB5640AB9B7505EA4E59AF417A085394181784BF1BB0BC32BD71CC57CE77541581F14B8BA4B758500694796262B561A38C72893C77B548D779A3833EEB064CDDBA5471CBFFBC769E139946155BF376A56415AB743DE568CD21895ED6951B5BFE1B1629DD6510DCD4483F206954964E0517546DD96900A2540A51835818D1730B0C9123E7FD8B28E6843BFFB659945A273CEA944FF6E83C234B3E43DB4630614E0B67778EA760EE341FE68C525E90475A1560821AE6B2A85015292C36EAA2E041AC04FB55922C48204525187C7E0476A9FED04EFBBA96F369D8AE709506620127FD399613A9796C4FF96D7E + +count = 25 +seed = 6E0A8EF5156D693FD0140BC4A31084E79773A83F42C8D133AC8A9D62DE3CD74511F893DCB26041E6B35E2B175408FCE7 +mlen = 858 +msg = 8F37A065DD696AD437EC82909261B842EC0A3E66F8AC574105A3C82EC8B4926F2466FA550F8EA1B6A9A142C00AFA44BE6512A85350930DFFC99B95AA21012057051B68C48581AE439B9290A163AA4B6AFCF80FFB91A3321C7B9ABAD56D5DC1BE4E67E5576C9F3A7DB96071859B94EB22A73DD96C66AE67AB11D1AB62A86D826C682DFB8CCA3259DCB5B34BE635421CD4206E7D92147F14C36424EAA407B441F58E5C187E58A26B2AE144888A3CC1387AC7D0A681EEDDC3B7781AB282E8185CCF33FB27500CFD119E0415DB1E45237520A868C8457C88A1D3EE97EC9451DA35D7E74924F8902949E7EB14BA87C8AC672D7E4F3BEC1B2814DFA67A8DD2E2D4FF4661D64BC4C6D6A78D4E489689B6063CDFF5A3F1554501B424284A9F4B8FE777FE4E6AFB83A85E36200A9AB40B9C18678454B2A3F50A4862BA1E36F0C57AD004FF90192B5619614E37DBB38A1B8A65AC613F7796C70772128377065B84F122540106D1B4F9123C4E009B4C0A85D59B35F72DEBDDD154ABEC7F3FB25FD1FA04367386098DE610B26FA3ECB031A6072D14607E92FFBE195ABFF71E586A984131AF24E18AE94DBAB0544FD2AD217960F337111BFBD4046809EA03C7C47B7177757A4A43E1FD0134859BA735A8FC17597E593BB58322136602954D3A21096B0D1DEE5CF0AD17A5FCF561FFA21CAA70D33998840E4CFA18BA481704A8B82D2CC1C110FC9A6704751365AE9F338AFE4CF9C811697DDDFA8635A2F3CD02DD1845251014BF2F2D6C02A907BD783207C4773A937048A07C500D7C424B5F65A2C376523740DF9A0B60437CB8AE17D64DD51DD4E433AF83B20C4B6B890B97976DF09E3A86AC19006C229D59FC7A2923245B7B1F0ACF7C42E486D41CA1AC1D7051AEEF6003CE94182F97D099C74317F61EB47AE18C2BED6A3CB253C21EC835E435123E0A657ED926F880CE8E5DE3155272328A467278F52AC50A1121AE818A3EA3A2E1F7401CE23AAF66A4AC289748A7E98A5124C586D8957BB4EDD3F091492BB1A64D75EFCD45AD51CA420F15DA848B20DC6BB765E7B71359B3A9E95E121266AE4A40DC2E9A3D81EA1B1A643594B3D4E6ABB7D1202201DE92BDF0CC1ED977E2D5851822A01F48A6F23180822888CE345AC9BE0CC69BC448D41CA20B79C35B1DAD73E6C683E70C4439B404CBF07FCC39B0E5A1D33F3717A6BAD28A6DA4F091BC7A +pk = DF25ED8E92034135EB39820724927E35FF8642FAF77A5546566DF6D4CD8F2601D9E35E23BD4F32495A9CBA1E49C00DA12598631526DF11BBB6EEA73684563A01773CD2DCB363A25CF537D5346466F75D8FDA3B5A7D40DA84D0F30AA9EEDAF44CB70504B0A8C27AD7AD6B25F61A3B53FFA45C712BC6D2F338974F2012D831D80015 +sk = DF25ED8E92034135EB39820724927E35FF8642FAF77A5546566DF6D4CD8F2601D9E35E23BD4F32495A9CBA1E49C00DA12598631526DF11BBB6EEA73684563A01773CD2DCB363A25CF537D5346466F75D8FDA3B5A7D40DA84D0F30AA9EEDAF44CB70504B0A8C27AD7AD6B25F61A3B53FFA45C712BC6D2F338974F2012D831D80015D5B5D8CA276508ED19150DC4C37DD14C4BB5C46D70DEFF261C1C455F6C2065C532000000000000000000000000000000000000000000000000000000000000004A9278CB3A0FE511016812B373BEF5016F5DD974801196EAF91B723595B1B950A1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3BE394C9B4E9691B8B2425588A6C579FD7A157664695F8B1585EC2034F9EF9F8F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EADE130F431B6562C4DE9634642DA7EDBF8DAAB1359AB5A8D2EEC3E9F8873F81BEC30084FF8C4941B88EF62D8AF183F9D0059E29BF7F7E7DE89BE1BEE25A0D4D05530D70D3D4116EA6F54CE7274A5301A81998E07DA21E471D5F60EAF1C28F77E8F85B5A5A0A3699F943646736E90A7BD772698293C270F3CD8A53D26802C9845D26683781A69B1CAA9041492C087A1B9A497DA5395F2CA5A98B62F4B784DD2B33016D5F7A8C57F36996A85EC8D07F5311CE66975F554CDEF4BB06C103B097E0023FEB364A9457D8F9B5FF60E12EDEFDB216CB6D60C738FDF01502D673C8106590AEF294A642C727DF9259C4563F54398185621C68C634CD1E105A07 +smlen = 1150 +sm = 80B7D189FAFCA68ED58EBC3D68A99437224A38D2A1483E96417912A51B696015678F2AA6B233C20ADA78670BE16036FE0E24BDAABF0E7C60335B38AA3844B300E32BC2672A5D90AFD6D3CEB8D858EF74C55133749E93B8C182C05F53E5AEF5AC4E389610C7C0D25FE40A77EC9706C9FB15209BBBD879E635CC0F43C84E7EAD0100002AC615954F34BB28C766EE05A97B869A40A995229B5EF0D3CC6E40F6EE867B402B2A416A49D31C71ED9E723BAB1D33C12A2F7261DF0C58CB440CBE8E407E102705C6DA0475CCC0A100B2391F45A3B8AA0C3E1087913B4A356B8584684A56EB1F45B7EBEE51AAC48260B8948F12C46282FC57787555D04B15A192D9BC8BF67252C99C05BEA641CF70D4AEACEF4F80CD8BE8E8DC084F0A3DA4AC8B9A0D6FD055000B048F37A065DD696AD437EC82909261B842EC0A3E66F8AC574105A3C82EC8B4926F2466FA550F8EA1B6A9A142C00AFA44BE6512A85350930DFFC99B95AA21012057051B68C48581AE439B9290A163AA4B6AFCF80FFB91A3321C7B9ABAD56D5DC1BE4E67E5576C9F3A7DB96071859B94EB22A73DD96C66AE67AB11D1AB62A86D826C682DFB8CCA3259DCB5B34BE635421CD4206E7D92147F14C36424EAA407B441F58E5C187E58A26B2AE144888A3CC1387AC7D0A681EEDDC3B7781AB282E8185CCF33FB27500CFD119E0415DB1E45237520A868C8457C88A1D3EE97EC9451DA35D7E74924F8902949E7EB14BA87C8AC672D7E4F3BEC1B2814DFA67A8DD2E2D4FF4661D64BC4C6D6A78D4E489689B6063CDFF5A3F1554501B424284A9F4B8FE777FE4E6AFB83A85E36200A9AB40B9C18678454B2A3F50A4862BA1E36F0C57AD004FF90192B5619614E37DBB38A1B8A65AC613F7796C70772128377065B84F122540106D1B4F9123C4E009B4C0A85D59B35F72DEBDDD154ABEC7F3FB25FD1FA04367386098DE610B26FA3ECB031A6072D14607E92FFBE195ABFF71E586A984131AF24E18AE94DBAB0544FD2AD217960F337111BFBD4046809EA03C7C47B7177757A4A43E1FD0134859BA735A8FC17597E593BB58322136602954D3A21096B0D1DEE5CF0AD17A5FCF561FFA21CAA70D33998840E4CFA18BA481704A8B82D2CC1C110FC9A6704751365AE9F338AFE4CF9C811697DDDFA8635A2F3CD02DD1845251014BF2F2D6C02A907BD783207C4773A937048A07C500D7C424B5F65A2C376523740DF9A0B60437CB8AE17D64DD51DD4E433AF83B20C4B6B890B97976DF09E3A86AC19006C229D59FC7A2923245B7B1F0ACF7C42E486D41CA1AC1D7051AEEF6003CE94182F97D099C74317F61EB47AE18C2BED6A3CB253C21EC835E435123E0A657ED926F880CE8E5DE3155272328A467278F52AC50A1121AE818A3EA3A2E1F7401CE23AAF66A4AC289748A7E98A5124C586D8957BB4EDD3F091492BB1A64D75EFCD45AD51CA420F15DA848B20DC6BB765E7B71359B3A9E95E121266AE4A40DC2E9A3D81EA1B1A643594B3D4E6ABB7D1202201DE92BDF0CC1ED977E2D5851822A01F48A6F23180822888CE345AC9BE0CC69BC448D41CA20B79C35B1DAD73E6C683E70C4439B404CBF07FCC39B0E5A1D33F3717A6BAD28A6DA4F091BC7A + +count = 26 +seed = 49CC05312D1DBE216FF03B60575017A6A1464C06D2C5A4A6F973AD9F275F7C66163A29A803BE759B117043862D277C27 +mlen = 891 +msg = 30D61C6FBD64113FCED8C5205026EBAC0D9F3522182617CB00B6E70C8DA62ECC1BBC8E1FDAF17CC61DD01CE85A9072CC1D9D34FDADBA5B93E0AAB4C9C4C9E26D3F7F145FCB23673B6E0B373C0FD1A58F52486B72624EF91A539519EE5305772A006E49521744912BCF3CDBAD424F00428AA96CCC21D000EFB09DA5CE652E361A6FB649A060835E3B9DC9CBEC660C7531620115EC905DCA6EE2A1CE36554C0FC1D6DD6863B8F3843508ED5C214B6923E7F5C0304E9B0D5E5E433BD029116A33A60CB980737AC950577D0594BFE0AD2225CB8D3FA42F192B0EC05A49391632A32FA931C0FBD83A7B6EA24301AD0906E7911F9D900D19AE1247ABABB1C0E9B9BD165185D9D7413EA068FE8824CCE5B3AD51FE8E2BB2C4022C61B002C1DF4852E4910F38613787CA12371038B6364D920E07B4B417401253451DDC25624B5D038B2DFE29B8494EC960F87803CAA256A95C9868AF819747E4BF26FAABA6DDBAED93A7815C795AD5EB7FB4592DF678AC1375388CC7ED3A6230CBE80ABBB113C80B70C789CF0C66B943E67CE814F12D3D83F3B90A4320FEB7FB81DC93B05D7FE2D36584399214D3D7C71AEF322A5D04B5470703B3660BF86B0B17BA9FF23E45F7BEFEC3758786D2111C81BA4D81B83FEEA35A0668E5EB3694963BB4DB3ACCE4FCBA6F3F6FED9627580DD2D2DC103EF7E52BB9745BD42A7FBDB459B5C8AAEBA67686EB899E3177FAF0897C61B008ACE3304C41B4C79E2EF9C865E9958D8716BDDB69154FB33187D927B5296C1589FB1AE3D553F116FF6CAE56910CE6717C446B9947AB2A981A8F5999C1C6E517EB3FE584F5D10059910E22F40FBDDB709C9F686F51ABF7D7206A8BAB4A346B51523C362D749238D7EF6671A89CD86A8540604F134D760267E91EB92FC0FC275CAB69C776EF81DBAD35027E5307F1D34EBF5D6E4DF424D709666A1E649C044C4930098B2E6E3782A93976B55073C504563C7E052B6816C07F0FD54A759D2BC189FAC3FF54549FC4DE192EFB58A9E301863A77380967735910F63D35EF5FDBD8751DE4BC6BF2E3095628DC7F67C1F5571D17AA342593B2C7F953C3F0F22DA1862122031BBEAF0D00A029C043304E3E2609C4FED8A7404FA10E2EC846A70EB0E37C5BE61E698CF2296EC1FBE6FED75F6FE3113C23B29AFB5A6D7E3A9E46E2D89D8C06450CEA11492C1A97F7D6BE8FF6C014930043022B264FD32593952BC606F779598631E48EED86EC2A013D8EB866F311A400 +pk = 019782F99FF4626AA38764E7E5D45E2AB6DFC501FE8F80707093F7286CDD97B5D8A0C73DF2D0968993877241BBF16DCC4918877F006FE37E6707FD1F4A1D3300782A2B88C2ABD7F125BB6599F1056488300F40C4EAF2006E671C3834F11FC3F9F2DAAE620F907653D9B62741C6E5EA861A5A6E24EEA12300BA623AF60F979F0109 +sk = 019782F99FF4626AA38764E7E5D45E2AB6DFC501FE8F80707093F7286CDD97B5D8A0C73DF2D0968993877241BBF16DCC4918877F006FE37E6707FD1F4A1D3300782A2B88C2ABD7F125BB6599F1056488300F40C4EAF2006E671C3834F11FC3F9F2DAAE620F907653D9B62741C6E5EA861A5A6E24EEA12300BA623AF60F979F01096358D1F6CD09D3E25A90AF1F9CCC90F90D39D94A46B4DAFEE823F63B409FB534AC020000000000000000000000000000000000000000000000000000000000006EC51524830F464788A471A4058C4D6B1B0E1E766F6A26A935B0BB259F591E9AB8FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF292BA13A46283F531318AE3569FC963488A638C8AE9F3034CA7DAD71607BE3ECC5FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002CD32FFF27A9A90DE28C5FF77C41B848C3512212B346365FB8F422FF6AFCD9195F947AFF7DB9891C4F8AEB597D48294C31C38F7A9724CE90960513462D48010FAC1B5A48F80C7CFE526A33AA5E2C1AED3ED9017F88444E6B908D49AF62FC869D896BCC3B14A3DB1E1EC68C04628B14D856E26264D86AD0D36EF4A1398800A90C24FC11EF7509BE5B966FEC72379DD5370832D0FEC4C64DB3766BF94A8567AC015BB50C158603F705E3EC7DE18A18944D2C1E6F890B0BA48FEDCCD106018AFD884984A862198FF12DAB6B24BB35F0740441C2D95B8F070A1A5905268904D492837E52304E5AACDFFB1612919F1657C807B82A32540C3ACF7FC574F502 +smlen = 1183 +sm = E38313D2E441D0CAF9A7329A1ED2F885B9BE7A0398CBFE3892AFF23800B97E59547DE079D4C135554C8BB20BD08D75C789E258FE077DC5A0EB75F35F5F5EDF00D407A253458F4A1DED8699D9B39ECCE8EDC0C3E7349BDB91F483D51F6AA15B427A13F2F40CC222C915FDD454D9E7CB58411ED4C56C35E7D12FE1D102AE0A7A00010101ED374168AD68FE38E68A228AF3F4E50231A2C987D897D3788A48FD4C3D160A6CC8FD0D2062B520DB6DA1737771D8CCCDEEE506F3B9A26E67EFD1AD13B13A278435E106DDF9AB8462D1369BCD027CE0E88B1402318A5E87C8D77D2629581C04B28C5FFB235676DB3E63EEE8950830CCFC5B2E79634D11F3842135930D9D94060B7B8D44AFF94243F3B187E31DA60E0CB777B51E52A76EDB4B3BD5E526D67B00040230D61C6FBD64113FCED8C5205026EBAC0D9F3522182617CB00B6E70C8DA62ECC1BBC8E1FDAF17CC61DD01CE85A9072CC1D9D34FDADBA5B93E0AAB4C9C4C9E26D3F7F145FCB23673B6E0B373C0FD1A58F52486B72624EF91A539519EE5305772A006E49521744912BCF3CDBAD424F00428AA96CCC21D000EFB09DA5CE652E361A6FB649A060835E3B9DC9CBEC660C7531620115EC905DCA6EE2A1CE36554C0FC1D6DD6863B8F3843508ED5C214B6923E7F5C0304E9B0D5E5E433BD029116A33A60CB980737AC950577D0594BFE0AD2225CB8D3FA42F192B0EC05A49391632A32FA931C0FBD83A7B6EA24301AD0906E7911F9D900D19AE1247ABABB1C0E9B9BD165185D9D7413EA068FE8824CCE5B3AD51FE8E2BB2C4022C61B002C1DF4852E4910F38613787CA12371038B6364D920E07B4B417401253451DDC25624B5D038B2DFE29B8494EC960F87803CAA256A95C9868AF819747E4BF26FAABA6DDBAED93A7815C795AD5EB7FB4592DF678AC1375388CC7ED3A6230CBE80ABBB113C80B70C789CF0C66B943E67CE814F12D3D83F3B90A4320FEB7FB81DC93B05D7FE2D36584399214D3D7C71AEF322A5D04B5470703B3660BF86B0B17BA9FF23E45F7BEFEC3758786D2111C81BA4D81B83FEEA35A0668E5EB3694963BB4DB3ACCE4FCBA6F3F6FED9627580DD2D2DC103EF7E52BB9745BD42A7FBDB459B5C8AAEBA67686EB899E3177FAF0897C61B008ACE3304C41B4C79E2EF9C865E9958D8716BDDB69154FB33187D927B5296C1589FB1AE3D553F116FF6CAE56910CE6717C446B9947AB2A981A8F5999C1C6E517EB3FE584F5D10059910E22F40FBDDB709C9F686F51ABF7D7206A8BAB4A346B51523C362D749238D7EF6671A89CD86A8540604F134D760267E91EB92FC0FC275CAB69C776EF81DBAD35027E5307F1D34EBF5D6E4DF424D709666A1E649C044C4930098B2E6E3782A93976B55073C504563C7E052B6816C07F0FD54A759D2BC189FAC3FF54549FC4DE192EFB58A9E301863A77380967735910F63D35EF5FDBD8751DE4BC6BF2E3095628DC7F67C1F5571D17AA342593B2C7F953C3F0F22DA1862122031BBEAF0D00A029C043304E3E2609C4FED8A7404FA10E2EC846A70EB0E37C5BE61E698CF2296EC1FBE6FED75F6FE3113C23B29AFB5A6D7E3A9E46E2D89D8C06450CEA11492C1A97F7D6BE8FF6C014930043022B264FD32593952BC606F779598631E48EED86EC2A013D8EB866F311A400 + +count = 27 +seed = C33EE43A9CBB4347BFAF71147B7FBDD88D212462CB06FBE695A35402C503CD15732B7D0E8BF829A555B9167BCFA2F2BF +mlen = 924 +msg = C83441B16B39BD7993766E7260D07751AF2F19A41E70689B0EEED0C118D9EF109866AAEF31B2D2962A25A3D1CA999214CDF0EB54598382EEAD64435B7122D275EA8879BD47B41EB64EA908867FD78ECFBE8E992A2636AA7477DE5058179565D3A2CEB8ACE5C0302018043C411D89975A64927B48CB622A13F1ED85CC1113897A68488161AFA1E636EC786A0AA37B928BA88A50164A9EC372523AA9EC8885AA9C95B29F7CA1BBF0652BAC195BA94E976D336B69A9F5346B4C7C81457F802DC9757C7A2435A617317340F764C1A2AE131A716318F00AF0EFA89D3B57D8F31E155598B3944D950D6A1D6485B509358EFB3745B95EDC30DCFF02574F54DFB2D31B259D132D18897DF868115679F06D41102CD4EED4EA290F711148B99B647B8555A4C0DCA1D2D0871C59AB1382A2D6417E6236D71E2BFA1A75CDA54F93E6C087D611878AC7670A04FD7D8CB0993F456E3BC1C3B5898076E22D2D9E0EEBC7D7BB8D142BD2B5F6FA42B40BF676FB69C532D7520A4A105EF0C1337F53D6E9B4BA17F1E76AF4CFDF08F794752D2BF71E8777E2A209F8891B1A53D7BF2A5786B00B9A0CD0FCE79408F26BEFA2535BE188A68201B1514074CD70660971F86E8D3E92790AE7AC591AA7A996149BCDF060C615209FFAB82E6000F41B2A5606FDAF4CD08CAB0C2F1103B2436B1FD7DEC477C6233FBCA3B07A0CA01BF3476BFE5334E32AAA2ED35D5747D673E7BB622E1AA7901C77F28A3AB2197C8B8253A1D28C969EEE73D17AD71C7919E7F217BA2BADBD1EBF986CFE981024FC347028C1109CD4204C7D53535A9B677E39A43193E054D0FD68104D88934DC7BA6CB3E942AEC744B935CDCFEEF4221784F96798E650FFB0FEBF2715D75339D0CB6C2E57C1E9D10F13E6786B7F041AB307B8CFA51A2F10B622995230FBA54B70D94AE278EC224D9D0950BA97BEBA7EEB0E2FBC4093E548D9EC09CA1A08E5F0483024D7C1927FF8DC270900D42D31B81B13A29839BD746CBB3591BC33817741A31DEA308F549A74F3A4E5478844183B8D7363AC1F4D4A5E907D9ED98AFD08FB8BAA84C324563495387A4F12C239FB63F0810447131311B2D2CA302C7DA2DA57C94C3B5E844F537886FB766EC0E977254DBCA8FC84AD77430428F0692E55D8E2CAB294B857AB51A2CE4A725433DF28D9CABA86C770743AD987BBA58C0565BD18590931E283292889294B607A5F19D9E905AA3940836E2A74A2E94FF3062E85A5C6C978B5EB2B254BBCDE128280E6CF02C11A0C2066F349E3C6C083965D5B8A9C000E15FF36C5BF3A6D42 +pk = D00401BFCE5070818161AAA1F82F8FD206316B543F0DE852395E8BB48E0A945CF0CCFBCDEFBD06257352538FDB42F5431C1534797F61C81C5531801E3F14280042CB25184B24E166AE913DE785E50D6613348BE4DB34EF8F158F926CCF08657827D78F0CA42D39940865E6C6326EF4EC11E4770DCDF76AE0C509C35B1B09930109 +sk = D00401BFCE5070818161AAA1F82F8FD206316B543F0DE852395E8BB48E0A945CF0CCFBCDEFBD06257352538FDB42F5431C1534797F61C81C5531801E3F14280042CB25184B24E166AE913DE785E50D6613348BE4DB34EF8F158F926CCF08657827D78F0CA42D39940865E6C6326EF4EC11E4770DCDF76AE0C509C35B1B09930109D91C8F4E3B6BC918C5C1DD13BDCA0F19C4B0C1590E481BCBC2271BC5EE0A3D2A1202000000000000000000000000000000000000000000000000000000000000B4718FEC6D93A6832D849EDEBFDE870D53EB847F2FD0707BE6BAE5B4AC461B069DFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB904B7BAA751619F295D8D63E3B02EF5B4498BE88B14E0AFBAA5D9F1D647BEC260FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006A92492D8F42AE5E463649BCCA9AD61A7FD7CF1A2B23D086DC962AE0C5939A802C4AAA70421ECCE33BE6B968506F30CC393CA8532ABA2E80E81F73007B2B01A1FA2A99CF1AA0BA9B299D6D64326B6F70D54C9C0D89C31ABA9AC7DFA3AF8D1DCCF95FC29CB85D5435C4D92686C1681CE17243E75953FB1A37AAE70E03FA0F41DFC9953EFD3FE61591076342A61D8BB8934690E18C5A6D2A8CE2F3901EF9FF427DDAE1772F28E12B9DC7496AEB4CEC920D0FCDE00DFD6155230939811205428E910651FD635E5A9E350024B4A4DDCBD7A9106149A255F75DC7D236AFC1EC8C1EF7B2F522E427870EAD1254EA701340C1A8358AA5BF24B08CE93EA24508 +smlen = 1216 +sm = F2C81A2F6E7A09EBBF7BAD95AFCA48FD03659E76F63D4943353BE59CD70AE64ACB2C60B4209F2A76B44510B0936F0779FE5BA12794127933302741E9DB415800A4123C8271DA4148D65D9CBD4E91FD453373D16A8032224336FFA482650528BDC07954EB7A4390E48BC26160DE11E7A6B5029E5D1DC2B7F7F2A57A7D34E9E70000015002E992281A6890F0BF5DDDEBE47D9B9D3E1EFFE388A947E85AFBA03D1C8F06E1051EA38F7EDFED42FCC04E7C9D5BAEE0747EED58EBB1B6AED90D416A9A484F56091E179EAE7774D73C72EAA1FA162956CB1CFCF82F7401FA876B701D89C03734DD8A7BDBC144C13100CF2D27DE274D3A9FBDCA46EDB2DC4F1AC57A67B2664B1828864B76C4CC3E2C9B34F7178181EB3FBE591907FAFF71297BAD97B03948000E04C83441B16B39BD7993766E7260D07751AF2F19A41E70689B0EEED0C118D9EF109866AAEF31B2D2962A25A3D1CA999214CDF0EB54598382EEAD64435B7122D275EA8879BD47B41EB64EA908867FD78ECFBE8E992A2636AA7477DE5058179565D3A2CEB8ACE5C0302018043C411D89975A64927B48CB622A13F1ED85CC1113897A68488161AFA1E636EC786A0AA37B928BA88A50164A9EC372523AA9EC8885AA9C95B29F7CA1BBF0652BAC195BA94E976D336B69A9F5346B4C7C81457F802DC9757C7A2435A617317340F764C1A2AE131A716318F00AF0EFA89D3B57D8F31E155598B3944D950D6A1D6485B509358EFB3745B95EDC30DCFF02574F54DFB2D31B259D132D18897DF868115679F06D41102CD4EED4EA290F711148B99B647B8555A4C0DCA1D2D0871C59AB1382A2D6417E6236D71E2BFA1A75CDA54F93E6C087D611878AC7670A04FD7D8CB0993F456E3BC1C3B5898076E22D2D9E0EEBC7D7BB8D142BD2B5F6FA42B40BF676FB69C532D7520A4A105EF0C1337F53D6E9B4BA17F1E76AF4CFDF08F794752D2BF71E8777E2A209F8891B1A53D7BF2A5786B00B9A0CD0FCE79408F26BEFA2535BE188A68201B1514074CD70660971F86E8D3E92790AE7AC591AA7A996149BCDF060C615209FFAB82E6000F41B2A5606FDAF4CD08CAB0C2F1103B2436B1FD7DEC477C6233FBCA3B07A0CA01BF3476BFE5334E32AAA2ED35D5747D673E7BB622E1AA7901C77F28A3AB2197C8B8253A1D28C969EEE73D17AD71C7919E7F217BA2BADBD1EBF986CFE981024FC347028C1109CD4204C7D53535A9B677E39A43193E054D0FD68104D88934DC7BA6CB3E942AEC744B935CDCFEEF4221784F96798E650FFB0FEBF2715D75339D0CB6C2E57C1E9D10F13E6786B7F041AB307B8CFA51A2F10B622995230FBA54B70D94AE278EC224D9D0950BA97BEBA7EEB0E2FBC4093E548D9EC09CA1A08E5F0483024D7C1927FF8DC270900D42D31B81B13A29839BD746CBB3591BC33817741A31DEA308F549A74F3A4E5478844183B8D7363AC1F4D4A5E907D9ED98AFD08FB8BAA84C324563495387A4F12C239FB63F0810447131311B2D2CA302C7DA2DA57C94C3B5E844F537886FB766EC0E977254DBCA8FC84AD77430428F0692E55D8E2CAB294B857AB51A2CE4A725433DF28D9CABA86C770743AD987BBA58C0565BD18590931E283292889294B607A5F19D9E905AA3940836E2A74A2E94FF3062E85A5C6C978B5EB2B254BBCDE128280E6CF02C11A0C2066F349E3C6C083965D5B8A9C000E15FF36C5BF3A6D42 + +count = 28 +seed = 19CB4BE2332F7FF0C078BC001FAB3C5FD8569A76EBCE373D1ED4FC8EB5D744C6464E2B5EECB9EE836CD5D87BEDA78BA7 +mlen = 957 +msg = 86D27C1FCDB8164F8909073F590D0A280E5EF193B0C42863BA518BC8A51E625658DBE2184C3353FAEB674C991EED3F1B0FE3BBE50A21EC70E9F57B97C38D6E436D3DD577D7056B07A401FF0EBBBEFAF8212B993A39281190E309ED0C50B269E4852DEA85432A5941269FDF63766B21D25D8816DE5E87FFA051009D232D6B258C5F43F45F2D48BE09B2CCD8FC963FAD81FB368502057AFA7C865D62D932F652802A299295B29411439DCF832E8367A749B4D7ADF7E8ABDE3EBFB844A9B1D32F77B2BF96B5D29FC15DAE83EA80A990AEF6590776CE1CB81587ADA80B9A7B45ACA3BBC54DBE67DF090104FA196701280B97607A333A9B56A728710CC1CBB7569B79FF034572495181A92D2380A7EE5E9CD1B0F758C2BFBCC4E11464F1CC7D91F117319C30CCBF4C11E60B5DEC724225B8D77B71AA58F5FBD498A3F49115687D58393BE648805BA1737BB921A08D738243920C3834F8782A8256B7DD22CCD5F4ECE86B8A0860BFF21C5C8F0BE987F2D510ED4DF9CF94BF698680B7CFA22A575A3D1B5B431734B59A4B31913019C1F42DCB76A9FF32BFBC6E16D2FADE26E3C17BAE49CC415E4B370D1FB43FF652BE62D18B0AFFDF286765F4F30FC8D6F2C4A58CD17B3BDFA013BB2DAA075BE5F522EF9BFC2E1506CC1C4D381B3342EDC19C955A5FE48A712AF5ACE66A028D03FC859711C9D33231E48D41E58A2C2AD81DA77529AD5E6B73E1AC96F0C8E53F153FAEA7903F917492A1D2B1203174A08551FF0F9F91E32BD0F31D606C80A505D5EB55265542DB3653C2621E7EB3FD677F49534F261205F834EEF1645AF419EF6BE5CFC16D54C7EEEA12D2EB9458831F77FA558E4D5C7FE446DDAAC3E1D502C941C95F572AD545ECC7CAD21F0DD50845CBDEDF589505FD34CD8C00D57243C3AA3615D84C39B0A72C28F40AC72DA25EBC6987DF5A7E390399463786E75D524FFB6C961BBC9301264BFE3C699101D18ADA4A72D193971D54089E6FFFA684CD3D77570CE0BB9179A156D3E2DCF266358499BFC158AC9A6913F622CA861C968EBBA0A59A12674BFE39389A2125A02563B082259483E80C89A3763C0A9C3DB485AEBF22C844539EDAA28A3FBC0053EEC475679B741D9AFC16B5FA109399FDD1FC3574DF8A1292B8D7401AAC1BE452D38F97D531813369EE4C50F36736B95AE9C3E4F91AE85E2D664337DAA40F75CCED2F4A4D210BB4EE25A56DC217DD176DB5ACA43C002AFD63ED8712D89E266674D9736FE4A9F202A81D177970411DCCD289B25798272D2647CE6451906A4F7D46E87A46CF6CD048B6BDB62488A24F48D1EBD61FFA474321B929E0A7B6F9D0F6D777ACC14815F343E1 +pk = 412A5D768787C17818FBBFD45BB494B6B36AC93D35C0A5465052D998A4735DE0FE5EE3C555E75D6D7A75E1910A92E0F89C9B1AD9DF8535A2DB52BD771D0D6F00BE317186AAD0A35207388D97C103D498CCA6A09898D86ABF3B545333CAEE1148AF13C209C1AE2FC9E47D43C820D2266351BED96D5569013F01D024D23D6BFC0002 +sk = 412A5D768787C17818FBBFD45BB494B6B36AC93D35C0A5465052D998A4735DE0FE5EE3C555E75D6D7A75E1910A92E0F89C9B1AD9DF8535A2DB52BD771D0D6F00BE317186AAD0A35207388D97C103D498CCA6A09898D86ABF3B545333CAEE1148AF13C209C1AE2FC9E47D43C820D2266351BED96D5569013F01D024D23D6BFC00022764B0A5CA1A6CC54EF5DAB62C05F084D2858D9A91775E12FACD4535D86CF3F55D010000000000000000000000000000000000000000000000000000000000009A91831DADF5CE503018EB1B71B8E63145A1E51484C66C81458352488D3204CCDBFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65107614493F1DB64C11B154F5DB691D638EABF5596881AD6C8567A2ACB2984E60FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E54B3381F133101C39400FC5AD705D82B75B635E07E344208ADC87E7017E5B1515C34D61E747BEAAD38798B3132BF6B144985B1C8C0FFE74D624F25F86B90ABC5075EEDC50044686ACD4937965CE055888855ADD769274E4DB1304BC09B012FE7F4BF545718A01291885E7616EBC1D6AEDBFDEACD6FCBDA2BC69B449FC06C8704976AABB15763362C788E28CF855695D556CC80911AF2302E3823976B3DAA49C1BDC6D63A50AADC88993DDD98FDC188719BB688052EF37286A198B4D0C79CF267FB42F03945448366D1C15BDC74F26078973E03CCD25432E3DDCD6ED7D7810CA98AE1EAB34090EEFD38954CCC5099B6D04D57276BC81564D26E7EA09 +smlen = 1249 +sm = A7BB35C97FE287DA3F77F9CA1129CF38EFEA7DB42CA3AC71030312333EED58DBD1B2BCF62D9B9E7B85150C5F8A3FB1C9951E4FC6CB0E3631884BAFD18ADB2200FEE9D271726A5805BCF7434A5A72F14B4BF3B070FFC5D5F4539FD676A963D9F6E4289B1452601E37D2FAB3349459E06FA1830193215EC87DBB40439122E51600000021394F7BBAE0A1D8A581CD5D85A2D1CCD33DA6014F8C21C3F920F4B43D3F4A03A705C9BF5C3BE59DE2A89DE777803BE05D1B115641309B61151A9CD3ED225B6DF2A5802D03A975864B9D7F17B344A6B8850768ABE6D3E1554BD55F998CA31C622BF32F0792C86E74CC7B107FFB5CAA446B6E0FFA2F850CF8D7920F63144464780935E96BBD84C018D70D0A88969AB0F5B5D0FA0675134F56270EAAAEA29D4600040986D27C1FCDB8164F8909073F590D0A280E5EF193B0C42863BA518BC8A51E625658DBE2184C3353FAEB674C991EED3F1B0FE3BBE50A21EC70E9F57B97C38D6E436D3DD577D7056B07A401FF0EBBBEFAF8212B993A39281190E309ED0C50B269E4852DEA85432A5941269FDF63766B21D25D8816DE5E87FFA051009D232D6B258C5F43F45F2D48BE09B2CCD8FC963FAD81FB368502057AFA7C865D62D932F652802A299295B29411439DCF832E8367A749B4D7ADF7E8ABDE3EBFB844A9B1D32F77B2BF96B5D29FC15DAE83EA80A990AEF6590776CE1CB81587ADA80B9A7B45ACA3BBC54DBE67DF090104FA196701280B97607A333A9B56A728710CC1CBB7569B79FF034572495181A92D2380A7EE5E9CD1B0F758C2BFBCC4E11464F1CC7D91F117319C30CCBF4C11E60B5DEC724225B8D77B71AA58F5FBD498A3F49115687D58393BE648805BA1737BB921A08D738243920C3834F8782A8256B7DD22CCD5F4ECE86B8A0860BFF21C5C8F0BE987F2D510ED4DF9CF94BF698680B7CFA22A575A3D1B5B431734B59A4B31913019C1F42DCB76A9FF32BFBC6E16D2FADE26E3C17BAE49CC415E4B370D1FB43FF652BE62D18B0AFFDF286765F4F30FC8D6F2C4A58CD17B3BDFA013BB2DAA075BE5F522EF9BFC2E1506CC1C4D381B3342EDC19C955A5FE48A712AF5ACE66A028D03FC859711C9D33231E48D41E58A2C2AD81DA77529AD5E6B73E1AC96F0C8E53F153FAEA7903F917492A1D2B1203174A08551FF0F9F91E32BD0F31D606C80A505D5EB55265542DB3653C2621E7EB3FD677F49534F261205F834EEF1645AF419EF6BE5CFC16D54C7EEEA12D2EB9458831F77FA558E4D5C7FE446DDAAC3E1D502C941C95F572AD545ECC7CAD21F0DD50845CBDEDF589505FD34CD8C00D57243C3AA3615D84C39B0A72C28F40AC72DA25EBC6987DF5A7E390399463786E75D524FFB6C961BBC9301264BFE3C699101D18ADA4A72D193971D54089E6FFFA684CD3D77570CE0BB9179A156D3E2DCF266358499BFC158AC9A6913F622CA861C968EBBA0A59A12674BFE39389A2125A02563B082259483E80C89A3763C0A9C3DB485AEBF22C844539EDAA28A3FBC0053EEC475679B741D9AFC16B5FA109399FDD1FC3574DF8A1292B8D7401AAC1BE452D38F97D531813369EE4C50F36736B95AE9C3E4F91AE85E2D664337DAA40F75CCED2F4A4D210BB4EE25A56DC217DD176DB5ACA43C002AFD63ED8712D89E266674D9736FE4A9F202A81D177970411DCCD289B25798272D2647CE6451906A4F7D46E87A46CF6CD048B6BDB62488A24F48D1EBD61FFA474321B929E0A7B6F9D0F6D777ACC14815F343E1 + +count = 29 +seed = 6BD93FD13C0299B3EC7403638673F3DBC449F3A617B691DDF73C072B62BF028913375D7460BED2CF9FDCA517690CBAC3 +mlen = 990 +msg = 56ED7708F98432FBC623424C2A3634780470A01784BECFF01BEA5BA192D02C33675084263C4315420A009579EF80DD15ECCBB812652421872A9577EF7D07896A727A64141BAE7173426DD5A3925159BFA927FF1039E70F729847B48365B4D3551476206AA049BA5AE8F605847AA03965F058FCFD478961EBEED06530ABE900042321059C297DACFE76CC12D52311B2FF8EE1231C77049E232D9FDB751FB27EB7EB6A373B4B1C06BD0FF46B1B208072C873E6F938E689839079E48C6D18F678769F5F28A903467F2FF2A8B02CB19DF675A8FC7560A7D38A918AB8BE083EC4E0EA148517AB90F38394833304F245BFFC47F9ECA771FB80B9C71CCD05FC3B0D66EB06D24B914B63D9F16AD2F2BC454B591D01ECFC527277AE71E3DC683161A53F129743F3428FB82A89DBD5D42F3EED237CD2F8D76DE2E56A2143AC6B2BA811F745CC72132028EECD4412B76FDD87A2E396ADCE72DC69B8FE053042E798B220974587AF96BA419DA6888B13FFE217C9D01434347F4162FD554B760883E8EB1AEE46C4C26B990C6BA10D2D939F513BF0EECADE8B5DEB8DE2BC8C8894ACA51E65AA696E390C11689F1C2CFBB70BC5F72C1872D99BABE8DE8FE2DBB446A8129AF0AB8D9613F0CBF3CFA6EA3CC409F4A97581D5012707756994B6C8D4FE7F64E0F0B85A85D0A5FE23224DFD7ABEBA8E3FB2E97AD87FA8DD477ADF48F64FAF486D0DF11AE9C3BD3A04ABC962C5B02CDA02D48F0B52D84D4920C116C22455DF291A96E6ADFF91E3CD35CB8B5B4E70E3DA8B87CDC969643A32B1F97131C5E0BAE7F6DFBFAC32218EAA596D444574EE85EF7C9998DC1088E5813D50A4377D29506817E4234F68B32AD68E00ADBF6462F8D4E215F15A19DFDE452F0A65360F7C1F20E11C42EEC55565CCB23CE248BD62E9DBE8A7D6639028A92B422AB444C5688B5D191A4BA8956F358D131E2FF6DFC607ACCC5D31AF9678F1A226530078FF9A73D681DEB697670DDC3E9096AB0FEDAB664473DCFFEDF9BE62A5C7C54FA2EB5059E9A1D38413B1A4FE6D531B799453BC7185ABAF78CABCF65F365B00827CEC5F29C4737047E3B2932A78757E9626A958486D1740ECF1EC17A01AAE6ADEC5104EB934F432207CE31D7096ACB3A0FE2F5DD7890C021892FE7D3F34596CF20B6B12FD55911ACB46D7386F99A9E9EE067A45C6A1FBB463E63D69CB582DA6EBD6330F4F80A1FA72F2ED24CE9BBCD967118CFC7E21F6BFB68A905F532BCF8B8BEFA03295D362B41D25CDCCFC9B41767858F651BC56AB2BB4A8675513C5D6F1C943A20A27DD29F941AD141DEBAAD219E056510BC984063FA0F389090D434157438BB1759690C453A2F55F72C033797A4B0C534EA2EA084B3B6F8966AC56B106FCC11EF08902F2ED +pk = 092B93C367D3951C157B2556DEE1FD0DB7B62C4438DA6CEC5D95E9CD7EF747194A1BFB395357CEC4CCCC1CFDCC626461F79972C265398AF608F37A098BEF0800EB7638706A3B8A43D2580DBCF318695EA3BFCCF47DEB62B43576A25A992F5EE6DA414A3C75BF4752C7C1582019A114029D772CFE275AD1F5B398C60332F0350015 +sk = 092B93C367D3951C157B2556DEE1FD0DB7B62C4438DA6CEC5D95E9CD7EF747194A1BFB395357CEC4CCCC1CFDCC626461F79972C265398AF608F37A098BEF0800EB7638706A3B8A43D2580DBCF318695EA3BFCCF47DEB62B43576A25A992F5EE6DA414A3C75BF4752C7C1582019A114029D772CFE275AD1F5B398C60332F03500158796E970CD3AD6CD8ABCF3E73E3AC0374A8767E75E17DBA617BDE3A81A82DA7C2B0600000000000000000000000000000000000000000000000000000000000052F454A99F127B1BAB0AB8384ABEE83375BFE4638D2A6D8F6D401CFA28328FAFC4F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA38762C57DF728F1F5A9A603F068D40AF8155D12698C7406A09B782B4E405F7E45FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019B74ED5E65920EE2D8695D95EB69341A0842676A0F16FA9DE64F6EEC835055F513D0CAFF71E2102A51C79DA4EECD6DC57C6D1FCAE8FC87A168D200DAB4C0B2BA52D239B2067C6B0F69A991088FD4530F9E0C5D45EEA01911DCD4C0A54D235B84CA58CD566D28CFEBF07FEEC614CE5B43485F33A2CBDA46DA2946CF390026CB5B402D1D803B349E97AF61944B027E9B9E796B4225E8A65950F2D72B3B2607374216B1B4D5B0710112503AEF9B1919CE3532640A5728ACB71FE1ABB8D0C05FC5C38DF01D934A765F70E3FACF24DD5538BA217E6EC3E77D135020F92AF0CF5338A6C9E28A12E562694F5486399A6F47611D3892C196A4DEEE3822A4A0B +smlen = 1282 +sm = 6E3769E68A09B6B6543D93680A70C46FAE93FFBC60F1C89A56B3061ED521FA91578ACE01FDEE7846F36F9977FC95E85211B48816258D6D5832E16E5FAF1C5200BFB752ABDAB7D822512A35F58BE6F683B4935ACB74E3F02BDAABF9EDBE4161D821087989F1D71B8E855EDFF0E820A7BE8256D002CD095BB3B0B3F8CF641575000100353789166D71B947F5D5F6427809F79538DFCE6CC80470405C2A73917A62B529984727698B6A253EE66FAE2DFA9822D606AFA901A69DC424A0D07833395F903A9BC346140D9D0CBDC53C69EDFA82BCEE89CF0A9FE1A1D8E0F90D68EE703DF219A5942CA5676893F117B41FDF7E6AEA27B7F750AFA9FA4216A4493D2937E0E82522ABAA825C033D35D1970B41FC80511B935AE11C2163E2B3EDAB4CC0D1353400020956ED7708F98432FBC623424C2A3634780470A01784BECFF01BEA5BA192D02C33675084263C4315420A009579EF80DD15ECCBB812652421872A9577EF7D07896A727A64141BAE7173426DD5A3925159BFA927FF1039E70F729847B48365B4D3551476206AA049BA5AE8F605847AA03965F058FCFD478961EBEED06530ABE900042321059C297DACFE76CC12D52311B2FF8EE1231C77049E232D9FDB751FB27EB7EB6A373B4B1C06BD0FF46B1B208072C873E6F938E689839079E48C6D18F678769F5F28A903467F2FF2A8B02CB19DF675A8FC7560A7D38A918AB8BE083EC4E0EA148517AB90F38394833304F245BFFC47F9ECA771FB80B9C71CCD05FC3B0D66EB06D24B914B63D9F16AD2F2BC454B591D01ECFC527277AE71E3DC683161A53F129743F3428FB82A89DBD5D42F3EED237CD2F8D76DE2E56A2143AC6B2BA811F745CC72132028EECD4412B76FDD87A2E396ADCE72DC69B8FE053042E798B220974587AF96BA419DA6888B13FFE217C9D01434347F4162FD554B760883E8EB1AEE46C4C26B990C6BA10D2D939F513BF0EECADE8B5DEB8DE2BC8C8894ACA51E65AA696E390C11689F1C2CFBB70BC5F72C1872D99BABE8DE8FE2DBB446A8129AF0AB8D9613F0CBF3CFA6EA3CC409F4A97581D5012707756994B6C8D4FE7F64E0F0B85A85D0A5FE23224DFD7ABEBA8E3FB2E97AD87FA8DD477ADF48F64FAF486D0DF11AE9C3BD3A04ABC962C5B02CDA02D48F0B52D84D4920C116C22455DF291A96E6ADFF91E3CD35CB8B5B4E70E3DA8B87CDC969643A32B1F97131C5E0BAE7F6DFBFAC32218EAA596D444574EE85EF7C9998DC1088E5813D50A4377D29506817E4234F68B32AD68E00ADBF6462F8D4E215F15A19DFDE452F0A65360F7C1F20E11C42EEC55565CCB23CE248BD62E9DBE8A7D6639028A92B422AB444C5688B5D191A4BA8956F358D131E2FF6DFC607ACCC5D31AF9678F1A226530078FF9A73D681DEB697670DDC3E9096AB0FEDAB664473DCFFEDF9BE62A5C7C54FA2EB5059E9A1D38413B1A4FE6D531B799453BC7185ABAF78CABCF65F365B00827CEC5F29C4737047E3B2932A78757E9626A958486D1740ECF1EC17A01AAE6ADEC5104EB934F432207CE31D7096ACB3A0FE2F5DD7890C021892FE7D3F34596CF20B6B12FD55911ACB46D7386F99A9E9EE067A45C6A1FBB463E63D69CB582DA6EBD6330F4F80A1FA72F2ED24CE9BBCD967118CFC7E21F6BFB68A905F532BCF8B8BEFA03295D362B41D25CDCCFC9B41767858F651BC56AB2BB4A8675513C5D6F1C943A20A27DD29F941AD141DEBAAD219E056510BC984063FA0F389090D434157438BB1759690C453A2F55F72C033797A4B0C534EA2EA084B3B6F8966AC56B106FCC11EF08902F2ED + +count = 30 +seed = 1787C82DA9F2E6CA9ACF7D6CCA70116A1724902C81EDC1439F332C74807AF2BCCCCDC7AC1788BA798520B2999F39DC3B +mlen = 1023 +msg = E42C006F144B0B4E188FEBC82D63D3D37096DEEC9D3DFC3B421635DDDB73C76F6260FF1C53222A50D30B26E2DE3D16E3AA64C78604E1191BBC0E2553117A441159B2A35FC8889499A2EFBDD2F30B8B4C6CEA38EB5B2575926E6F22AB96DDB4B0C5C6D78C3754A1B6DEBA49FFBCFA7477BE9A0F74EC379D1C9AA59247C091611573AF765AE698D78152187B291717A9F03FE767BCBB12F52311215579352E7CEAA8654B5403F18CE82E0A73BFD5FEC1063B506F44EB1C9C5A03697D03DCB2AE15C5095F292B4BCB130B55C19AB728B3232EF77D1594611573CC6BDAA254F05934A329DC27CFA6CD8C02CB51C3C295C964C40502FE2B1A81A51C866F7C7380BFBE339B39C8F51F73722A05B5D1E9CB6313557B3656863803C9DC99BB1905D7F729B2DB8DA23D88200032F36FFD04DA11FFDF6277ACC69C5407289D00FDC3C56B32D54877F4A8DC70ABD37EC532B8617D9F3C535B8E962FB389E976B4D1AA12DE5C1C2FFACD50ACFFF65201104648E0C04CF7C1F880E8BDA1D68404BA67C4BF64C9D2ACEEF81B35FABCE58645E0F2F61EB4CCFEFDE7239BE408710D349987D849D40B3AD294B9D815A91848F9ED53B69F78D9E955F6D1FD7E38EC291664D54C2BC359FBA241BA6ABCBF5FC2502D93760D9F6B1F7FB766040E98BDC23A6047134A35327FE128AE24B4C7D0CDCF1801947A1821DDD7424892DF50E2DD5C1E2E6C5BFB4467524FB45C7D977604E7E0F1F98EB8C03EEE1D9A5796C8A801F082678940F076BF44D3496730C9A640FEFCE385865899FC33B5DD34D036F2FD5D07FDC0A40FB725E84CE403B46DE712B4B44CA8801A1CCF58233C5DA06719769823B5945849DDABCA56B0B4EF9327C8B5E5A445E6853E5B66B8D590759D6B2DB722C22F8C741CF3C6325A76D93F4FDE5872D5732FB19AAADEB7C18094727ED43B305B87AE2DBAAD67F90FEB86498CF65CC57EA635340F27AE5C5CD60AD3C763223AF877E65A005C488AA4AF9309E1AA02002B01DF8865FD481EA254015796985969997A53B06DF0355A6AB3C8219B652B09E1F86A6CA12D27C4BCB9E8D35E6889198C8FED71AD5642F5F9F7CE1DF270D68AA05467EF9ACD9A51347AF1EE9CA7C4A5D78189042900C6D561F68D410A77E79726DC123B196C78829F02CAE7D0623BFE9E7B0D8BF84033086295992B77ACF027489D51BC7FF006A8D4AB8079D494413A565E7F687AF40DD18B86AA4274EDB8845DF114C0146DE3199CB55F773A87FFB126B3A4D00D38835CFD2D6652C07F572F39D0397FCD62ACF6ED9F3E8951348AE7E52A669FA4E2BFCDA548ABB1989A1D74A27B73103770290E6ECAC87029359354EE4C87A77BCB5CEB10162DD54499905AC8ED442C173CACDE068BC546720D1284015ACB90CA19147694B53899395DC663D6683908F3CBA29AD37F15CD3903C4C7F4BD73 +pk = 00D06F88772EE4EF0991A51A79956AED02FA705D1CE35F468B921308CA5E849CFD5D6C41D06535C11E95C2E1A57054C7A6B4107B0F2F59E73206264D60375801AFBF1BBFFF9B87A2238567AED824A3EAA1CA80ED3CA792586148185418EAB43D4D969F9D06BF658D578120AB1BBC4FABD6A5BB66CC22EAFAD5CC036B5CA94B0002 +sk = 00D06F88772EE4EF0991A51A79956AED02FA705D1CE35F468B921308CA5E849CFD5D6C41D06535C11E95C2E1A57054C7A6B4107B0F2F59E73206264D60375801AFBF1BBFFF9B87A2238567AED824A3EAA1CA80ED3CA792586148185418EAB43D4D969F9D06BF658D578120AB1BBC4FABD6A5BB66CC22EAFAD5CC036B5CA94B0002B31EBE999ED6A5543FD1AD85519909239A5B8BE9FB9CDBF29C87A9C4876CC4C46200000000000000000000000000000000000000000000000000000000000000C8A3A0A7A53994069095F3295D0792BFFE81FFBAC701BB398B46EE26FEAEBA5A80FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2302DD37CCA99919E72ED6625157EC4B436C105FF33AA496C2D6FDB7895F19CD42FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000478CBB837B310EAB26E0AC57D5BEAAE82DB91EC72DA90ECCAC05297376EF01BDC67283D4D142C3EFED6300FC196410358B0A640508236E9CA90DDA8A65C509DE66AF7C04025D64CD55C5D0744D35EC213FB007E3FC319B96EDD857FBE5EFA2E8874186A7E943F926FFFCB1E058022E3D72B93EE0C5AB753B9B735DF68B0FC8315F078A188227BD05B9D315CC1A880F1B7DE2F8FA06105FA8B23F616EAAA399FD161E1599CC024FDF5442D54229F48E9087D41C987FA3B570AE404B780CE549C49879282FB413EE6764BEC3159E64FCF38CD3F742265850856274BDC5A753401F5267D76DA2F989ED814663781D2460388A78E15280C2DF93FB199602 +smlen = 1315 +sm = 278E2E9DE655230F72345D7ED42C8EC75CDEB8CCDA647DF8B9896D068D36C1E92A4630AF0741F61DCC1B22C48AAFB2C6C0F5886CAD6799A026A5CA6B96376A011E00C63776E8714D434C0BA2E16222B34C844581B2889D3AD9FC2178FD5B03D82E67E38101BA6377630F4BC1BE201565F52D009603176DEE5DCCC10CD040E2000000C94D929E8D2CDC0823257E27935F0788FD3EA2169E09B144444BF33FCF6D7112FF5080AE706AF6A874EB81BFECFF5B8C3D50819241951D11F7B378EA89AC3832F380E722866FBD0771D6A4D28AC7105687F9A41CDC05C8CF8812F66A8C3E1B5536FEE2EE4C7E55A06BCE90BEAC735777003E307F62789A04CC9A9DECEBB920350D64BD27422FEB8921D19BA08F02BDF9C9A76BEC06A8A81D902E8866920827000202E42C006F144B0B4E188FEBC82D63D3D37096DEEC9D3DFC3B421635DDDB73C76F6260FF1C53222A50D30B26E2DE3D16E3AA64C78604E1191BBC0E2553117A441159B2A35FC8889499A2EFBDD2F30B8B4C6CEA38EB5B2575926E6F22AB96DDB4B0C5C6D78C3754A1B6DEBA49FFBCFA7477BE9A0F74EC379D1C9AA59247C091611573AF765AE698D78152187B291717A9F03FE767BCBB12F52311215579352E7CEAA8654B5403F18CE82E0A73BFD5FEC1063B506F44EB1C9C5A03697D03DCB2AE15C5095F292B4BCB130B55C19AB728B3232EF77D1594611573CC6BDAA254F05934A329DC27CFA6CD8C02CB51C3C295C964C40502FE2B1A81A51C866F7C7380BFBE339B39C8F51F73722A05B5D1E9CB6313557B3656863803C9DC99BB1905D7F729B2DB8DA23D88200032F36FFD04DA11FFDF6277ACC69C5407289D00FDC3C56B32D54877F4A8DC70ABD37EC532B8617D9F3C535B8E962FB389E976B4D1AA12DE5C1C2FFACD50ACFFF65201104648E0C04CF7C1F880E8BDA1D68404BA67C4BF64C9D2ACEEF81B35FABCE58645E0F2F61EB4CCFEFDE7239BE408710D349987D849D40B3AD294B9D815A91848F9ED53B69F78D9E955F6D1FD7E38EC291664D54C2BC359FBA241BA6ABCBF5FC2502D93760D9F6B1F7FB766040E98BDC23A6047134A35327FE128AE24B4C7D0CDCF1801947A1821DDD7424892DF50E2DD5C1E2E6C5BFB4467524FB45C7D977604E7E0F1F98EB8C03EEE1D9A5796C8A801F082678940F076BF44D3496730C9A640FEFCE385865899FC33B5DD34D036F2FD5D07FDC0A40FB725E84CE403B46DE712B4B44CA8801A1CCF58233C5DA06719769823B5945849DDABCA56B0B4EF9327C8B5E5A445E6853E5B66B8D590759D6B2DB722C22F8C741CF3C6325A76D93F4FDE5872D5732FB19AAADEB7C18094727ED43B305B87AE2DBAAD67F90FEB86498CF65CC57EA635340F27AE5C5CD60AD3C763223AF877E65A005C488AA4AF9309E1AA02002B01DF8865FD481EA254015796985969997A53B06DF0355A6AB3C8219B652B09E1F86A6CA12D27C4BCB9E8D35E6889198C8FED71AD5642F5F9F7CE1DF270D68AA05467EF9ACD9A51347AF1EE9CA7C4A5D78189042900C6D561F68D410A77E79726DC123B196C78829F02CAE7D0623BFE9E7B0D8BF84033086295992B77ACF027489D51BC7FF006A8D4AB8079D494413A565E7F687AF40DD18B86AA4274EDB8845DF114C0146DE3199CB55F773A87FFB126B3A4D00D38835CFD2D6652C07F572F39D0397FCD62ACF6ED9F3E8951348AE7E52A669FA4E2BFCDA548ABB1989A1D74A27B73103770290E6ECAC87029359354EE4C87A77BCB5CEB10162DD54499905AC8ED442C173CACDE068BC546720D1284015ACB90CA19147694B53899395DC663D6683908F3CBA29AD37F15CD3903C4C7F4BD73 + +count = 31 +seed = 9E6E12F025B2A57B0F5A3A9FA70396FC332E1802608E5CA07CC4FBA922F1FE5DEA6721B96F1BA2BFB97825A19F08FF2F +mlen = 1056 +msg = 9C311FF20F574CD9B7BCE1DF705AE7DCE6E7A621C935A6E57A59EB31FC443AB1E014AD332FA784583260AA6153C464565C4568108D60CC126F6E8EC3BC9120E5659C86CDA8A31A7131936DE7B3DB39A4692808DC3D2BEE8A99880FF9D1D5EFF1E825A0F043D908D62A99779E013845AC0C21ABE8E4DF0EE901E4C6BEB8BB36B30228B7756D617A8F30C16351D8FF91786F7406F75D9FB648830F88EA4537F42EAD62E8790E9CF11F72C31D718221049C9AA35376AD8FB065F4809F4383A23C2B29425836C2DBCE4680450896EEADEE6B83539ADFDF59AA4FCE709D601640EB9A22DC3B41108A8EE1FCCDE9945EBB1D3F676EC8395255E125E62A32149C73451F597E1C32AD979E5BE914FFC7C548D6AE92ED08501831E9007770A0233E5778F22ADF7F1AAADF9C9A7C82D2F42989BF21627D3EF8BD0377A5BE5C9F5A585A246A73DE4340E6B43B36DB775B34033962646C16F26A2B7179C40A721FEA54805B9EC42177B42160B1A67341235B5AF9F30B2703BFF8CDEEE5BD7CE506B0707A69F84225B6E5A92E80EDFA235803DBE2CEC47CFEF0D9FAC95C3379816A39F4550BDBFB45609C76D0351DDF8D61724BD5E8BE94673B3013EEBE172CACE247D79925B12B5DBA2F6FB72E797B2DA849B79DEE3DB76775F5F1DD4595678671C7B18BB3749FBB0C6A7135D639F16B3864B5A251114DE7E9F8CB02B4CC69902EC8D7D544D98E24A05F8ACCB182E2EB44BDE868B077B1FAC4726E8B01CDD0D024405665F7ADB60A23FDBACF421246354E824CB74DFB35E57902794E459493905400D0A0BAD51D8EB94EFAD55C67CD0C7CEFE7A1B055F06371AEC7F490FA685C611D553D8430992EE7B1855A9CB305B5CE53154345D7DEF6110DDBDB5CB59559EB664C6439E057DC022F8686F2AA0CA81552428437B0CEB5FBB5DF254036BD2BAE7290D947C963046771A39D2656312236569E775E7D2A041B7EECCEC99C1B9D2757C7370E474012AE707AE00AC37B73ED9C8E1A2774E54BACEB42E8B31BEA734463CC15576BD4F7A33430B1987D62E47473391938312F2481838F286C4DFAF701ECBC6EAB1A9F074C1F8D8963457DFAAC9A9A8EEA70C50CE70D1BA1006760AD3887605EC38861DC1A777D21E46EA169537057CDFE256CC08699D73B1AC4FBC62F863353581CAD358B9C573D77585DF6544E5D55048D66A352828CD1ADF5F42310FFAC022A25824430F741371027B2DC14717DC87342A74F0038674187E478D8ECEFFC16474A4AA8BDA0C8D41962EF2A4B64A036C888CCF4EA628E1CB9EE0F9A918FB1B22B9367FEEEE0218C83CC7E27C5CB2AC64DC7E111E3C85CA0E6BD4F685E5DDD428E028D192142CCEE3F0C8337BDF43CE4B62704AA53C703EC334FB56FFDFB81D7D4419535D17E5FCC0E6F558AD82149C591FE0357DA15660F61544B4041128218B6DE2B75D3801510669A3977E2983BCAF957EE2942E504C29890A81542EA208E1CEC +pk = 9013F2D352783AAB8DCE6BD56395DEF4052C64AD4E1C83609241C500DE3110AC1C7B08F38B64146DE8A7922B0D41862B18663A294A74B2442C33E463A94ED1005FDBB566D930D7D1E6D0270314F31C0B36B7604CDD644803D41F9EB3832EF97238A8AD204254B6B43B627D9988D27FBAD4CFEAD35092CF49425DD813EF00020004 +sk = 9013F2D352783AAB8DCE6BD56395DEF4052C64AD4E1C83609241C500DE3110AC1C7B08F38B64146DE8A7922B0D41862B18663A294A74B2442C33E463A94ED1005FDBB566D930D7D1E6D0270314F31C0B36B7604CDD644803D41F9EB3832EF97238A8AD204254B6B43B627D9988D27FBAD4CFEAD35092CF49425DD813EF000200043B8CFDDEA8CC73EAA4A6288B694C8209DEF6B564AC52550F4089A3EA7A2E10C10B00000000000000000000000000000000000000000000000000000000000000801E21B38519F5146948B1ABAB1E816B759E6E5C9AF6615D999CB74848B5F6A4F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F5BCB5024BE41FBBF88A53D6E8DB22C46A80FD4C526F6A3F65F424D16DCE7D3F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CD539177E5FAEE10C979741016EDD8CBF9F0715F447B7365BF9EBA70F0F8CAF2881E813DC66D3855EF3DC1F649A65F8A5CC8D2E1A151678035BA5EFA596404748E703965C6EE446005532EEF4FF99D41211885E9484E59035C167ECC2754D0F92650B0BC3C921010C9A02FBAF5B8B63D1DAF53D742D0CFC1919687B0F2061EC5EEE179E79D21899C1CE930FE088B2317573F199A9B7AAE35E05CC936C494D7DA8D4E264A9C4FF19A683ACA40807DAE15EF4D57D68B118286C75C1C25035165F8FFECE8858E6816F6C1E5589FE3882D289CB4B92D683593D9E9831D9CAB7C125DFC83E5BACD156BCDA424B251B97D4FA08AE48E4E3DD165FDFC245A03 +smlen = 1348 +sm = 433FD9232252BF6B6F011FA41AA6BA99B57B331ECCF8B1FEF7B0465A0BBF799DDB200370F292806D6953D30D16AF88BB70053BC63CC23FD02DC854C57374AF00A44DD70B01CF3822415163A4204F3138445ADE6E4303E2C66E64C265E1C0FCB609F6D73E558376D19430C197EF5A3959D111B3C5E4527534A320176EA2428C000100F24B00DD4CEE43F64E3FDBBE6F39C6F9E8E042493CE6BFE5B015CD4BBA955D23BFED56D8615481856A8F030E4D8917FCC68F4CC3105121C8EAFADF869A3980156FE76651F1187A938DEC6E10B72B06E5C4493A193405FA295F25FF5858B26A0435396C5202E0C5C07D71FC2DC5C3AC6CEF5F46A184AFDF9A80B5323380C62B16AEE94ECD036E4880EAA81E16E539F7C4AA148423BDF547F07409FB5AB463170004129C311FF20F574CD9B7BCE1DF705AE7DCE6E7A621C935A6E57A59EB31FC443AB1E014AD332FA784583260AA6153C464565C4568108D60CC126F6E8EC3BC9120E5659C86CDA8A31A7131936DE7B3DB39A4692808DC3D2BEE8A99880FF9D1D5EFF1E825A0F043D908D62A99779E013845AC0C21ABE8E4DF0EE901E4C6BEB8BB36B30228B7756D617A8F30C16351D8FF91786F7406F75D9FB648830F88EA4537F42EAD62E8790E9CF11F72C31D718221049C9AA35376AD8FB065F4809F4383A23C2B29425836C2DBCE4680450896EEADEE6B83539ADFDF59AA4FCE709D601640EB9A22DC3B41108A8EE1FCCDE9945EBB1D3F676EC8395255E125E62A32149C73451F597E1C32AD979E5BE914FFC7C548D6AE92ED08501831E9007770A0233E5778F22ADF7F1AAADF9C9A7C82D2F42989BF21627D3EF8BD0377A5BE5C9F5A585A246A73DE4340E6B43B36DB775B34033962646C16F26A2B7179C40A721FEA54805B9EC42177B42160B1A67341235B5AF9F30B2703BFF8CDEEE5BD7CE506B0707A69F84225B6E5A92E80EDFA235803DBE2CEC47CFEF0D9FAC95C3379816A39F4550BDBFB45609C76D0351DDF8D61724BD5E8BE94673B3013EEBE172CACE247D79925B12B5DBA2F6FB72E797B2DA849B79DEE3DB76775F5F1DD4595678671C7B18BB3749FBB0C6A7135D639F16B3864B5A251114DE7E9F8CB02B4CC69902EC8D7D544D98E24A05F8ACCB182E2EB44BDE868B077B1FAC4726E8B01CDD0D024405665F7ADB60A23FDBACF421246354E824CB74DFB35E57902794E459493905400D0A0BAD51D8EB94EFAD55C67CD0C7CEFE7A1B055F06371AEC7F490FA685C611D553D8430992EE7B1855A9CB305B5CE53154345D7DEF6110DDBDB5CB59559EB664C6439E057DC022F8686F2AA0CA81552428437B0CEB5FBB5DF254036BD2BAE7290D947C963046771A39D2656312236569E775E7D2A041B7EECCEC99C1B9D2757C7370E474012AE707AE00AC37B73ED9C8E1A2774E54BACEB42E8B31BEA734463CC15576BD4F7A33430B1987D62E47473391938312F2481838F286C4DFAF701ECBC6EAB1A9F074C1F8D8963457DFAAC9A9A8EEA70C50CE70D1BA1006760AD3887605EC38861DC1A777D21E46EA169537057CDFE256CC08699D73B1AC4FBC62F863353581CAD358B9C573D77585DF6544E5D55048D66A352828CD1ADF5F42310FFAC022A25824430F741371027B2DC14717DC87342A74F0038674187E478D8ECEFFC16474A4AA8BDA0C8D41962EF2A4B64A036C888CCF4EA628E1CB9EE0F9A918FB1B22B9367FEEEE0218C83CC7E27C5CB2AC64DC7E111E3C85CA0E6BD4F685E5DDD428E028D192142CCEE3F0C8337BDF43CE4B62704AA53C703EC334FB56FFDFB81D7D4419535D17E5FCC0E6F558AD82149C591FE0357DA15660F61544B4041128218B6DE2B75D3801510669A3977E2983BCAF957EE2942E504C29890A81542EA208E1CEC + +count = 32 +seed = 569B8B9BDB707B19CD6F9BEB29F304D603C1509B9CF25987C280C342E870B1E13EFC7DD7E41DC85BF4F42D0493B84B0F +mlen = 1089 +msg = 7FF38725F35312D75E58845FBC33E112DD95D5C1CF78119CB413AC839377C7051BF5F17ADD1484F5EE12F42B0587AB41DF487BA5E4D8836777B614A9931A5FEFDC4AC451662B342D675C940061C4FF01F747B69CFF585FC5317636E2A830140C0007F73C76FCAB96195C86DB98E5E65C733825DB0325407E5BB059490F2E9133F9B4AA328976256EAAED2FBC59D00288D4830D99731A3AEF36E5BF5239F2899C500F942B80B00C3B33307450FF0C105BEDB7DF84231C5D24C3C3475AE2F46336582DE93AADBFD385C824F21362C19B1C6A75F56B69297FB3084B6164204E2348CB1D7CD3AB494BFA7EC8FE346251C874085F803BD7F4DDE1995F0D3D17033C461D06B49ECCEEE0D5312C3A435AF5BEC9808ACC524599668AACD95ECEA7EF07C4CA3FAB1CF964FDBA987C345046E6507AC3D372BF07D72CAB816BA627C2BD452AB8DC3044A7F0A01D8C0EA47904A5DD66C6B7EF9130D628A4F2CEA5A0D05AEAB7DAF2729C1041FBDB3C2D17BD66AE293C03E77A0837419471C29691EDFB20CF69BC6260975089AA437628F140A44FA2E2967357AC1BF1345E4208C33CFFEDE6CD634B371E7745143FF848F77E5130D1E0F51868585509F9CD3B906EE0A5072CA2E908D6765C74D9B5C35B6BA784A3EA59D808ACBB1C24D6C088CA6C9E17BCEB18337A4DA0C1DAEB5D51EFB35712A475D6C5A2EA51E93FD79F7DEB127F3418F354DF06489E10B42BC1F20651660CAEA17F67F306F48E15DB7E67A1B56578BA7BE6C229FED9567E128D48551E6EEFA17AF5B95A716555571F44FBC41AB29208DB7C1846E130866D5C9BE6F73E601C55610DFD0F67D98933D252059DAA1DEC20AE0E5BED6568A6322322D8A40E6835FA66E317733E1B465434532EEA8FA76886B600E06EFC1DA41F8DCEC0A5E8BA8419F0B7879CC0A93BD14D99608B5BEA931D8971DA8D2D89053E1DE40209E257E741BEF48C17FA15467F1312A368D4A061BFC76C2B7BBD900B4A34DA51B7CB5BD6E2FB08806A53C0D60273167D822FB6982785F2C3B0EC7D893B615724D0193928D0EA8EA2A1DEC5ABDCAA904C754CB7747449E87221B3D86BD5DF26E11DA753E768A8B481C306E485EC91074377DFC68BE74A444906E420C2D8BCCD84BE13AA5CCD11115B669C89E9C0CE374BC4059C696E5F8344FEE467AC8C8ADE37DAF614992914C763D971327B60946943847FB6B82672CC376B780953B6F4433DF69AC61E110FBF1A35F6272561193D8652EBCE3291333FDD4D84B9CFBC60A57E1F8B817E84EA15D440D4A4B4F7E19C08DDFC5949FE8CBDDCD0296A62F12F53D48B1288B80E24C756FC38E2FAE9C7A3315D1C6DA42AE838AFBBF5569F633A68289EB7073BABCB210F4E08856FA65057BFABC70AD3B58C2C870DFB5E1B0D11B6FA6D5BBB68285D8F9C21BD89669781C9F4DC32EB1EF58B80B1D371334D36FA66A2B3DD4B3E4DEDBA7AA9FB7E0245F5FDBB66CDA653C5232A131EC1F0C21DB1C47B990A64A24DC8C4DA951F419F57C03FF506E0147C22E99461 +pk = 87A04FA8EA83535EC7025807B20A787D05541297EC0F679A3B99675DE40B78BAE25662725BAE9D6BA1DA2B20ECDEC8EAFB25CB19BF6F668D228840A7F99A5F0020B2408347535299316AAE82D33A745BEB464F7745D15459E300E00B0FD6C7425042856EA87B5DD61597EB97E6A4C22E6D36D32A7CF0E2256FBE0ACE7085860009 +sk = 87A04FA8EA83535EC7025807B20A787D05541297EC0F679A3B99675DE40B78BAE25662725BAE9D6BA1DA2B20ECDEC8EAFB25CB19BF6F668D228840A7F99A5F0020B2408347535299316AAE82D33A745BEB464F7745D15459E300E00B0FD6C7425042856EA87B5DD61597EB97E6A4C22E6D36D32A7CF0E2256FBE0ACE7085860009911EFBE96C4B751A97336F20F5E75942F01D85E1A3BE905915C6E684151B8BD16F00000000000000000000000000000000000000000000000000000000000000E4516FA51D85B1D3D319B86BE7AF32A387F1EF5ECB3E7C43834B8B6D3A80ECC07FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1351C6082880CD2FAE3ED576CE33E7D259715309271466877DC7219610B2781CF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FB77116199C5CBD136A72DD0FFCA8E2CA632EE3F3AB165086A7480BDB1FECF22E64B4BF53B5296FB167AFE7292118365EBD2841A36F71110E77E1B85ED4B0820EEEA9DF3FEE656D55FBB55C0DB7714A79E1758A0B702D9235F35D55C758BE6E5F0C4B50082CEC0387B20382C2B319E5303FB193C235951CFF13B608FD90A9B2DEDFCBD2B7B154438D20574231EF915A3CBDBA45E631E6453A9CDB2E721F6221E7DE4FBF1DC34078CE0D933D5ED31179176D446596793EEFBA38F0D41056F74EB9E3A9A8390FB0D67BA5973E929B18057071F6965AC48D7175F7519EE0CCF187B4454D26D8F98268EB3D71B34F7EFE983AE8D85819863DF7DE107EA03 +smlen = 1381 +sm = B456CAE354A392DBD8BDA1EB0F1EA2262E3403815ECFC7F497632B49174F0387FB2B273D5F63A88106E2511728D6BE006EDBE94ED3677ED170037FC1E8AD70011482EEFAA888E3C63FF8F661A3A1F33DF572499BF120140CC21BACA72AB78F76B5F0E8A59E113F163E9C7E094332F5FC574C92D15F6401BAA6FA667BFC792200000217A1D3292F81E1355A339160E460746E74C9638EF457A943313FE7C72507FB7F43F676DC33C1F97357CFCE100641C1440D50C852278EB7C22802EB3DEFBB984F1FB524ED88CAC53BCA04041D4D4AACF615E0547A2F969C05DA9B8928A2B3BA4EC7C60C720948C48588A9B34889279D9B8B57C7BA5611FF9A057FA0B76A82743BD9F7AC44496B289ECEECE8EFB599CF7772CC29E05F2DBE304C448FA2F6BF6A0011047FF38725F35312D75E58845FBC33E112DD95D5C1CF78119CB413AC839377C7051BF5F17ADD1484F5EE12F42B0587AB41DF487BA5E4D8836777B614A9931A5FEFDC4AC451662B342D675C940061C4FF01F747B69CFF585FC5317636E2A830140C0007F73C76FCAB96195C86DB98E5E65C733825DB0325407E5BB059490F2E9133F9B4AA328976256EAAED2FBC59D00288D4830D99731A3AEF36E5BF5239F2899C500F942B80B00C3B33307450FF0C105BEDB7DF84231C5D24C3C3475AE2F46336582DE93AADBFD385C824F21362C19B1C6A75F56B69297FB3084B6164204E2348CB1D7CD3AB494BFA7EC8FE346251C874085F803BD7F4DDE1995F0D3D17033C461D06B49ECCEEE0D5312C3A435AF5BEC9808ACC524599668AACD95ECEA7EF07C4CA3FAB1CF964FDBA987C345046E6507AC3D372BF07D72CAB816BA627C2BD452AB8DC3044A7F0A01D8C0EA47904A5DD66C6B7EF9130D628A4F2CEA5A0D05AEAB7DAF2729C1041FBDB3C2D17BD66AE293C03E77A0837419471C29691EDFB20CF69BC6260975089AA437628F140A44FA2E2967357AC1BF1345E4208C33CFFEDE6CD634B371E7745143FF848F77E5130D1E0F51868585509F9CD3B906EE0A5072CA2E908D6765C74D9B5C35B6BA784A3EA59D808ACBB1C24D6C088CA6C9E17BCEB18337A4DA0C1DAEB5D51EFB35712A475D6C5A2EA51E93FD79F7DEB127F3418F354DF06489E10B42BC1F20651660CAEA17F67F306F48E15DB7E67A1B56578BA7BE6C229FED9567E128D48551E6EEFA17AF5B95A716555571F44FBC41AB29208DB7C1846E130866D5C9BE6F73E601C55610DFD0F67D98933D252059DAA1DEC20AE0E5BED6568A6322322D8A40E6835FA66E317733E1B465434532EEA8FA76886B600E06EFC1DA41F8DCEC0A5E8BA8419F0B7879CC0A93BD14D99608B5BEA931D8971DA8D2D89053E1DE40209E257E741BEF48C17FA15467F1312A368D4A061BFC76C2B7BBD900B4A34DA51B7CB5BD6E2FB08806A53C0D60273167D822FB6982785F2C3B0EC7D893B615724D0193928D0EA8EA2A1DEC5ABDCAA904C754CB7747449E87221B3D86BD5DF26E11DA753E768A8B481C306E485EC91074377DFC68BE74A444906E420C2D8BCCD84BE13AA5CCD11115B669C89E9C0CE374BC4059C696E5F8344FEE467AC8C8ADE37DAF614992914C763D971327B60946943847FB6B82672CC376B780953B6F4433DF69AC61E110FBF1A35F6272561193D8652EBCE3291333FDD4D84B9CFBC60A57E1F8B817E84EA15D440D4A4B4F7E19C08DDFC5949FE8CBDDCD0296A62F12F53D48B1288B80E24C756FC38E2FAE9C7A3315D1C6DA42AE838AFBBF5569F633A68289EB7073BABCB210F4E08856FA65057BFABC70AD3B58C2C870DFB5E1B0D11B6FA6D5BBB68285D8F9C21BD89669781C9F4DC32EB1EF58B80B1D371334D36FA66A2B3DD4B3E4DEDBA7AA9FB7E0245F5FDBB66CDA653C5232A131EC1F0C21DB1C47B990A64A24DC8C4DA951F419F57C03FF506E0147C22E99461 + +count = 33 +seed = F32C3715B0BA8C1D0BD59F0645E9697DFCF9AEAF761A71ECDF9672215B9F138C0502D7214F6B1BB4D6612432F9FBED5E +mlen = 1122 +msg = 789518EE21DC99CAC94DD5298B2F3EB8F6AB8D0705D24D9AA3012F217464E7F203E08E5CEA9E44F54A6F73E88D81592826E243B7F0B2A1B3A06E5AFDE23A2985183A0E430E01C3FA90E9F1DB7E69DD8E7DC6FB802933E04A18834C091ECD46F0DD423F532668CEE8A12A06BBC7E5FF3B9488B8F4A87A92BB8D6F313269AD95C574245E06563BB58BFF6169B8F4C333033BC128B91CB81DD41B831DF5103B295F744EDE95FC3A0C72F1134A9321836AFCFD563192C343040B943F69C0E98E8D740C06CCF840CBFC6BF777C9561065916F13D116D758A151E8FF4C355363AAE8E4F49D2A2E062A2BB213AFF25662D95549B4B025E70AA3363B50D25AF84A3E5B0FFA598CE074733AD191C86C351592299C26C0A4933573EF436B73DFD0C4EACF93D361AFE5F824B91BC178EE8381B9EFD52302AB8CAD6C08C7E090393B9B8ABC78AF374FAC6E60BD104BAABA524E68D75A759B94176105A9CFF2E5B9C3984FF61C5AFBF22B8E1B9E4F9BDFFEC0B19C2A5C8DB3B8B2C02115D101805C1BD6652F738F02600E38998CA41BA8955094FAD5BDC34133D4B523EDE66CF483F1CD5ACD9EFAA69703807410939974D6DC033BC696541357DA9881A4FD1385671B6E4BB889C68B544175C1E2EC1395DFF4CC87E037087C615CAF40804D5F44A2DE301961A59818173730A45CF4C2DF172614AFF7199A40C9FFB9957242A89FF86B36A4F4D60F15DB569C2FEFAF677B35FE5F12AD5A323397714286E338FF6B9080FCA50B657DB477A52A93B243BF28CE2743794C361F443AD81EBAAEAB2B237EBBC572D8586C3EAB1F42BAEC1C985D28BC58B296A11D96A04B0E1F7F6790B92E450248804F3F62B5865941BFD444A910F31E1D6B79D8906E7E9828618F960EC14124FBEED28E1F58A8BC9D31773442FEDC5A220F3912D0B41267D427C0C15BB76F9200C54B5F050307E13F1EB3DE92B864C994A3DF4CEBD1BCA634710FA342E23D7C8A5BAC1B58AA321E215E4418428206F05232E2BCD1B5EE1BB7E34E7D4C93088991EE9DD643FD08B0185A2F0AEFFB0EF0EEA3ACB4CE234BD5479A4F4296001305826F23083CC9DC99011864F250E77E42A0DE26AB09FF6E3F32552F6F913256729B357CBF5DFC825E91BB5D3FAC1F729803D431D339955960EAD69B1E54536CFD774341CDFDE1D1F527DA4E738B2E292BDC884687D1016DC193EDF34A37D284D026D33698295E864196E0BF16FA83A35F65FF2B38B7030E9E63EAAF594F272E07941313D538546BC84671739AF822391CA4DBE6A579A81F45FF51FA5B7EF49BEEE7BEBA4AE07452C13366668F02752923EA3653043B26C883799FE6352F95144283D946CA87143B74C8A009C024D073BAAB9BC4DA6C87D35FFFD753E1EEC7F01944639E566FE17A6F715F4197D1CBA58D3D153BDA37D7D2D5E19620FF0842527D109333FA2BA8BFC491689F4551BEE6C9D13BB9E69EE4F44B782BB05D1E48D293BC15B9FC706D52B021C7159FF7DF80E55627DD7555795F1FC616830A4BA2C02FE1A19DABE088E460BF3C5A88313C443179C593458467FAA468791CA74E9B1E759847B6939F +pk = A8E8358C8F5D03986CB92B7060BB52B726534BC3E5193D5F85C87FC77A29D3D0A606C8D624255FE24EDE7179D7EE6B72207E7997AD7540C4A83FFA4B9CDC9A0078B3B310B1E8D3F8924D01E55CD99AA3FE9516490EAF0584E76BDA9A312D7C68B63433A9D7009704329F3408631FE04A83C7FBF3D8A010D7B70D36173763910009 +sk = A8E8358C8F5D03986CB92B7060BB52B726534BC3E5193D5F85C87FC77A29D3D0A606C8D624255FE24EDE7179D7EE6B72207E7997AD7540C4A83FFA4B9CDC9A0078B3B310B1E8D3F8924D01E55CD99AA3FE9516490EAF0584E76BDA9A312D7C68B63433A9D7009704329F3408631FE04A83C7FBF3D8A010D7B70D36173763910009C121123997D574BE652FE1D72EE4F6C8A63F7124B543C1E8A303C0F27702F6379B00000000000000000000000000000000000000000000000000000000000000181CEAA7EE77B39250E7865C8F08C6B0825FBC70DB82373583AA3D908032355C23FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB813F2E9D06EB2193939922DD1147B98DFC60772B5904E74A6876095BD7810CE4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003770AE99B84A2498BE9B6D09F67A17EEDD2D9E00FA2DDBD85013B02C04BEC62E4DA080AACD69438CEB609983D1BDC2B23C6E9E5D74D96AEA914FD2EF45010130C77F13A69DA02ED89573DCFFBA0CE5FB8CA9C6D3ECFE1103C0A5B11F85A496DC94B95D40200C6CC66E4D0A4B6AAEB818A7FF9ACCBB4D07DBA30C3D5EA801D406ABDC81C7213A77C1DDD639075AB20EB3A0F3C1721F96B61CF5AA4092348DB55E97544C4CABA3CE1BC4B0B7988098D6C77D93B758FBA8E19652AC331509D1E81C58C0D6AD821AE8E99937AC5B3239EB67FA66E836633C587A04CDFA5FE5D8FE664DA777F628B3492FD446E2B2DA19F00DD378F440D2F36BFB2A53A104 +smlen = 1414 +sm = 8C49D802493750DADEBBBC7D2B3E874D52B03D088A94E09C5998CAF2687441CABE2247464A337E5B93AF7C2A8EFD7F93371BB0F098653318616A113D3D4BC900533D873882AA5F360FDAE86BB607B1A8E7931A70890967F4AAF7B4EA549B5B5DC05D8C3A4EA234A2EDC43FBB827D36EB66965CD6EBBBE762026625695ADC71010301DAD90A05F1E6B132341A5E8C1085BAA9DBB0E41DD6D1C083ED1F87FA1EFED20E35637B6DE462A2AA96595C48CFFB7E8FF1D6C2F64F135E4548B580885133FA0614F150F7863432CD80DDC7EE057D4AAEC437B1A627779084EFB69D0AF13ADA01F7C3DB6A89884956752AF68434BF032C9D7F3ECFDEB0FD5824DCC055A486CF04EE22AA77919644225FD6F6EA3DF2441774B8E9AE2CC76F9B86076A9C1FAE70000602789518EE21DC99CAC94DD5298B2F3EB8F6AB8D0705D24D9AA3012F217464E7F203E08E5CEA9E44F54A6F73E88D81592826E243B7F0B2A1B3A06E5AFDE23A2985183A0E430E01C3FA90E9F1DB7E69DD8E7DC6FB802933E04A18834C091ECD46F0DD423F532668CEE8A12A06BBC7E5FF3B9488B8F4A87A92BB8D6F313269AD95C574245E06563BB58BFF6169B8F4C333033BC128B91CB81DD41B831DF5103B295F744EDE95FC3A0C72F1134A9321836AFCFD563192C343040B943F69C0E98E8D740C06CCF840CBFC6BF777C9561065916F13D116D758A151E8FF4C355363AAE8E4F49D2A2E062A2BB213AFF25662D95549B4B025E70AA3363B50D25AF84A3E5B0FFA598CE074733AD191C86C351592299C26C0A4933573EF436B73DFD0C4EACF93D361AFE5F824B91BC178EE8381B9EFD52302AB8CAD6C08C7E090393B9B8ABC78AF374FAC6E60BD104BAABA524E68D75A759B94176105A9CFF2E5B9C3984FF61C5AFBF22B8E1B9E4F9BDFFEC0B19C2A5C8DB3B8B2C02115D101805C1BD6652F738F02600E38998CA41BA8955094FAD5BDC34133D4B523EDE66CF483F1CD5ACD9EFAA69703807410939974D6DC033BC696541357DA9881A4FD1385671B6E4BB889C68B544175C1E2EC1395DFF4CC87E037087C615CAF40804D5F44A2DE301961A59818173730A45CF4C2DF172614AFF7199A40C9FFB9957242A89FF86B36A4F4D60F15DB569C2FEFAF677B35FE5F12AD5A323397714286E338FF6B9080FCA50B657DB477A52A93B243BF28CE2743794C361F443AD81EBAAEAB2B237EBBC572D8586C3EAB1F42BAEC1C985D28BC58B296A11D96A04B0E1F7F6790B92E450248804F3F62B5865941BFD444A910F31E1D6B79D8906E7E9828618F960EC14124FBEED28E1F58A8BC9D31773442FEDC5A220F3912D0B41267D427C0C15BB76F9200C54B5F050307E13F1EB3DE92B864C994A3DF4CEBD1BCA634710FA342E23D7C8A5BAC1B58AA321E215E4418428206F05232E2BCD1B5EE1BB7E34E7D4C93088991EE9DD643FD08B0185A2F0AEFFB0EF0EEA3ACB4CE234BD5479A4F4296001305826F23083CC9DC99011864F250E77E42A0DE26AB09FF6E3F32552F6F913256729B357CBF5DFC825E91BB5D3FAC1F729803D431D339955960EAD69B1E54536CFD774341CDFDE1D1F527DA4E738B2E292BDC884687D1016DC193EDF34A37D284D026D33698295E864196E0BF16FA83A35F65FF2B38B7030E9E63EAAF594F272E07941313D538546BC84671739AF822391CA4DBE6A579A81F45FF51FA5B7EF49BEEE7BEBA4AE07452C13366668F02752923EA3653043B26C883799FE6352F95144283D946CA87143B74C8A009C024D073BAAB9BC4DA6C87D35FFFD753E1EEC7F01944639E566FE17A6F715F4197D1CBA58D3D153BDA37D7D2D5E19620FF0842527D109333FA2BA8BFC491689F4551BEE6C9D13BB9E69EE4F44B782BB05D1E48D293BC15B9FC706D52B021C7159FF7DF80E55627DD7555795F1FC616830A4BA2C02FE1A19DABE088E460BF3C5A88313C443179C593458467FAA468791CA74E9B1E759847B6939F + +count = 34 +seed = B0C7530A52AC9F561C2C14548D3A5F5053396B738EA1C7A5190F5AB01C9C38719C4DBE856E42D37A114FA24FD5DF5081 +mlen = 1155 +msg = A4117808D9D05B702483924E99623E778E7A3B7623739AB7AC488ED93E711EBDDEC383BFB7E06086FD0C374F4668AB744AD99B8AF1C75309B60F55DC03FF7BE6F23187FFD5CB224068568CE2D06ABE441557B04A5A0C2858C416F6F7AA89A96ADFC2AFC54E0F31416CEED005B7B140B342652DAC7BF401FED4D94D475784936FCEB4B4F334BB14BA55B1EA9A36E2B0591287EAF4ACED997162691A96E7F59853E609ECA9A225F615A49A12763D80B5DFE6F8638923C39BD652936B19B944D5116F790E866A61947EB60CD1F3A1F319710D0F40E487EFBEF51FB4D00F5DBB94810128215F72B1AEDD74A1B1D237088DE3098417714EEB67D6A3E6BB647B6B0AC6D0BA3089D4CF6252B69C414E2BD6614429B6FCEABEBA50A4B53C7394652ACF7DD9403AE14436ED5FD4D1C9E238A8399A763806FEF5C3742C55B7159EBF5A13B271428F91229C191D617808A26AF9190F9D445BFD3B273702BC3E7F610854C8E86066BE7757960A880CB6727CEF19DC7B464C464A7DAC9AE85B799747B8488A4123B6BC7F0F7C2A8E53FD4F8687075B4E25660F5107ACF22CA688057DAE0496FF15A3EB9379A9F6E22FA43C932F137E389478C05DB86060686AFEAFBCB9ED79AE194C4146A48CE5E07EAF585279313851CB864A50075AE46C1AAB3B3CB920DEE2652F5AFA0138051C7C980946E8D5E18C16789CD184DC5598F65875EF43418DD56E11DEFB5A4A6AFBCE041BB292E0E2EC563296BA4EA6CBFDCCA32A18C8AA395515A83D0FB7819413E5AE056FF0EC2F63F1D52A8BE0B334A628D00995BEC7E46A34BCD2DCA0E9C5A88E0FC8C43843D6AE074C699276293FD8DB2BE48885155688428C2F5A6C6C91BD4A03CDE2126205F9EBAFE319D1B4F80277FE99211A09628AD840046EB9AA568EC71252CE9F69827B677D9C0D99546DF5A48A8D253AC0036DDAF4D045A70F94EC54BF5F06296B2C2617F2B0EC0B8374DD28DE269FAF739B1E55AE1846F548FB6C0403C5ECEE3CF9D1927E317F0D07E11AEBA01C240FE17C6660F7CB32305AF1EB6DE4312FDEA6990DA4E9135DBC0B88AD0AE0847E1576F3C2711B785B846C7A4B823688E4218596CAED583A90DC46BB9B27E00E4C1110B65F77E602F043A8441563667691C07162E52A53CD76E2D74DCAAA2983BF2E8F02CC30B05BD4F9AC731931C59F9EBC038FAFB09FBC886F4C4191352206BB49ADAEF9D74BD08A5B780FF0FA301343F5EA81D36912ECCB0FF24BBF0BE6A8283EBDECA79CFB22639DA38C9C639C4BD66FE5A75F0414FCC1455702856E6FC58344BF02998E17E967183AE920B7E04F58AA09145D6DA79B65EFCD18EC55BB9CFD53914F80D73C2B08BB754AC63E4C82D44B72376A544D97394B7C99678758B15CB94E71F9FCCF674B29ED5AFDCE452959BE5AF510D57F9E5395A576EAA1FA7BA9AA4122A779727071FA485C005B447760410DEE20B7C2299B4A0D5D9E5E4E038A19C87806C3FB875EA5BD7F47D034D7D5FEC4BF132B04E47574172D392EA7B371516190AB81C67B45FEF6332848A51B6C7DBA90C410A44E9A88AC082FE296A7435E7D2DDFC645D5AEBBC29620525757DAD1B0222159D658C7225D02374EE6AF479FCF1AA28CD91B +pk = 2E02AFD2BAF5B6011A970220D1C54071E99FBEF8CBEDA2829161A8CE901FFF61B0E71E9A2F8F15633AA0BD8EE28689D534E45767760D474F3B49D01A3717270003FAD49066B345F90673A71ACBD2D4F4706A308C2E78418875A3A6AC25C2922C078311CE7DD2435A30966CDA2ADD991C7612D093DBAC7DADEB6CCD8404C9580102 +sk = 2E02AFD2BAF5B6011A970220D1C54071E99FBEF8CBEDA2829161A8CE901FFF61B0E71E9A2F8F15633AA0BD8EE28689D534E45767760D474F3B49D01A3717270003FAD49066B345F90673A71ACBD2D4F4706A308C2E78418875A3A6AC25C2922C078311CE7DD2435A30966CDA2ADD991C7612D093DBAC7DADEB6CCD8404C95801026F416374BDB2F5431737DB422B7721374F6257156BB17197DBF70FE155B26738A701000000000000000000000000000000000000000000000000000000000000D4FB951310E31E1E76E27A764581D9BB459B8C2639B7F2F32D579A4B8723425B91FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01701FB6A5AB87161A077F4077512EBB704038751765D10FB2247DBDD564B7EFC1FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008144FC459473E4463BDC9C194D8055193E1FF1AC3567EF8AFE8E1E4755CC4ACF4BEF216B5C5D812FFBA69408379EF425DEB2F08951537A96459C93781C8706A3E8CE34233D3FCCE2D34FA277561C27F99D153625077CB07A8722A9806C8346D061B5B767A7D869F223DDAC8ED702C0BED5F7CEFD4EF4E852D0741CF9C902299B643026DAA59F607F5DCBE760227A816814815BE31347A7B5EF38A847599AC2EE5D0F087F078CA91A1D79A96EDAC77606E83221B89012F6B7B9760CD40426C7AC114D5F42BDE1B3CB8DC62308DFED269B0175CD720DB4FE371496C13C3B64DDDFDF5BC9A4FBE6857CA37C6C55D3632E999984F0B6C6069ED69ED0CD0C +smlen = 1447 +sm = ACDB7D6F1EDB93B1669F508EEF97F07725BAA963E4E51FB03BB0F91045B6F286F4DF7BCF80640DDED255E40691632D5E5620225AB8F0E20728AE5A5B1D1B7800F5E30187FD12268EE68C68CB19D0DB7DFAA0B62387A8878A2D22CB7F4477B5E8BF23757FF5E4FE3F07DC0EED1A1E2D2634879F875AC402D31FC739CFF0E13101000265A08CB4BBEB5F6E76D6AEFD860510E50B0352E6BBDB3216956E9AC785291905770E41A46A2E4F79B667738A5BE3680F7DB0A320322CA67160DC0F27F5D2AF5EA25D24EDE374553B4E403F746397BFB26D8FE94DC9F45E1881FE8492CBCC7376629B33A08AC8AC7A29B35582637F3831E3F7C897152D0B4BC93A91B48F74EF4C4A62A23BBB2E16D900CBF6F0AA290BE650B50F48DBE3F31A6BB77CCCF02F60000909A4117808D9D05B702483924E99623E778E7A3B7623739AB7AC488ED93E711EBDDEC383BFB7E06086FD0C374F4668AB744AD99B8AF1C75309B60F55DC03FF7BE6F23187FFD5CB224068568CE2D06ABE441557B04A5A0C2858C416F6F7AA89A96ADFC2AFC54E0F31416CEED005B7B140B342652DAC7BF401FED4D94D475784936FCEB4B4F334BB14BA55B1EA9A36E2B0591287EAF4ACED997162691A96E7F59853E609ECA9A225F615A49A12763D80B5DFE6F8638923C39BD652936B19B944D5116F790E866A61947EB60CD1F3A1F319710D0F40E487EFBEF51FB4D00F5DBB94810128215F72B1AEDD74A1B1D237088DE3098417714EEB67D6A3E6BB647B6B0AC6D0BA3089D4CF6252B69C414E2BD6614429B6FCEABEBA50A4B53C7394652ACF7DD9403AE14436ED5FD4D1C9E238A8399A763806FEF5C3742C55B7159EBF5A13B271428F91229C191D617808A26AF9190F9D445BFD3B273702BC3E7F610854C8E86066BE7757960A880CB6727CEF19DC7B464C464A7DAC9AE85B799747B8488A4123B6BC7F0F7C2A8E53FD4F8687075B4E25660F5107ACF22CA688057DAE0496FF15A3EB9379A9F6E22FA43C932F137E389478C05DB86060686AFEAFBCB9ED79AE194C4146A48CE5E07EAF585279313851CB864A50075AE46C1AAB3B3CB920DEE2652F5AFA0138051C7C980946E8D5E18C16789CD184DC5598F65875EF43418DD56E11DEFB5A4A6AFBCE041BB292E0E2EC563296BA4EA6CBFDCCA32A18C8AA395515A83D0FB7819413E5AE056FF0EC2F63F1D52A8BE0B334A628D00995BEC7E46A34BCD2DCA0E9C5A88E0FC8C43843D6AE074C699276293FD8DB2BE48885155688428C2F5A6C6C91BD4A03CDE2126205F9EBAFE319D1B4F80277FE99211A09628AD840046EB9AA568EC71252CE9F69827B677D9C0D99546DF5A48A8D253AC0036DDAF4D045A70F94EC54BF5F06296B2C2617F2B0EC0B8374DD28DE269FAF739B1E55AE1846F548FB6C0403C5ECEE3CF9D1927E317F0D07E11AEBA01C240FE17C6660F7CB32305AF1EB6DE4312FDEA6990DA4E9135DBC0B88AD0AE0847E1576F3C2711B785B846C7A4B823688E4218596CAED583A90DC46BB9B27E00E4C1110B65F77E602F043A8441563667691C07162E52A53CD76E2D74DCAAA2983BF2E8F02CC30B05BD4F9AC731931C59F9EBC038FAFB09FBC886F4C4191352206BB49ADAEF9D74BD08A5B780FF0FA301343F5EA81D36912ECCB0FF24BBF0BE6A8283EBDECA79CFB22639DA38C9C639C4BD66FE5A75F0414FCC1455702856E6FC58344BF02998E17E967183AE920B7E04F58AA09145D6DA79B65EFCD18EC55BB9CFD53914F80D73C2B08BB754AC63E4C82D44B72376A544D97394B7C99678758B15CB94E71F9FCCF674B29ED5AFDCE452959BE5AF510D57F9E5395A576EAA1FA7BA9AA4122A779727071FA485C005B447760410DEE20B7C2299B4A0D5D9E5E4E038A19C87806C3FB875EA5BD7F47D034D7D5FEC4BF132B04E47574172D392EA7B371516190AB81C67B45FEF6332848A51B6C7DBA90C410A44E9A88AC082FE296A7435E7D2DDFC645D5AEBBC29620525757DAD1B0222159D658C7225D02374EE6AF479FCF1AA28CD91B + +count = 35 +seed = B2FD7BFAAFB667C9DABE5915C3BC271EF41F18588666A6F4990C09D098E62DB590110DF6A56F08C5E0DE65B00F91D60F +mlen = 1188 +msg = E82F5ACC7C1A326D430475357629D568EA3D0DBE131114781D5BF8DAA32FDE9F3CECD288ACD14445678C5EA6D3AFAFCE48EA3957A6AF8D8F23F78D84130FB6419F706EADD430CC85AFF48283F15602265059ABB075E011E3941834EBE70787CDD55F1E604C6B86F761D94C4F5E525791333DF6D43869D6F36B212A8F35583D38A21D0947CBE26FBE6A36E189C73137F2F2D89F48566D04D2DD9125D2EA4E0B2A7E5C1E9D2EA036CFADCF7BB28F6DF3B7D6395230C9D39D1E7558EA25340252708BE23EC6C0C9A0946C5C5AF0FE037C254D1A5B2B70B8F916CF37945BEF76BDFDFB19A0DAAC5A83A6357E986B3155CFF31024121634C3700CA99E5ECEF1F2E411C6621FED6092C1AB59860271AC7F431E568075D59F71AA18096195F30BBEB1A6BAC20E034F83C72BE0536315879F1D1B7F31D38C12DD8E97819B4803D02BECD436B61D1296CEB78EBF857E34087EC8AE8395269B5B0770B3423B39638910D2A3DDFEC8502389FD8B5B09FFD10CAAD1A5C86E7E39629AB09A4ABCDD00FBB9821F92E7DD24DDA83D1D9762F52A89BED6C20648EA04FBAD4233E5920AE83FFEC28FDB5E432929A41DB782B2CEA8FEB40CAD0B27903050B650477E5D9443A536ECDFDAC673952810596F1985427359D9E4797CABCCD2FA0C0A2394D853B4E6F8E150B3E3AB5136CF476605FF5FFA9067C0FE58A143B50B18B09256657CF091132D449A6E7EE79AA870E9DBE46BF840EDCB983F585EC2856C059808E72B8C901A25D6AFD5372F168D533052A6D26418E035D87D0BF818ADEA19915047C8D824A425A8C7915756673E0F5FCCB1B4FE7C1FDFCE505F7E18F023FDD32A605906EC48E0FA755B6D87E47711E158D672C5FB4CD3B8D1D13FE9EECE58453987CFCDD87B621B870F3AA27E73B6FB7FC0A6757893B978C63B7723C49D1005A1E5B1A4D60C4A2FEF392DF7EF97F149B499164455633FA485BDF92F804A47C8703D124522D73887A2B032F10F45343993FFB009D69E80FB54B6999A5BDB2760F8BCCA648F3C52BFA1D887AE49862DB4CBCCC7213ACBFDC48A57C3DA1F1EBBEA828182432AA1C593C3E5591C825E5706A5F9503311E91EC3D8F4A9554C3DF915B5FBE0516A7A5597ECF8862A8DF286ADA96C90C9F2783F7F947A18EBBC64C1BAF24B29F77521A9EBE09BECFFDB902EFCD024046FD3E6182BF0C84BD3A0A5410EEDBABFC60114E5DB28B0943D79F58F766E2EDB16759850D4CC3A9A57AE073CF6F3B24D36A4365E2BC64674259170B6D11DFF63D0DEED085B6321C45F218E09351AA0D4155189CC98DE5627A03396A067AB3FEA2C133062E3823FB1CAFA5D592070C8E82ABE812979DBDCB6D2E595F33830AD0E8E2F9E6CDC4D9C74B8026EAD1815DE36772769C4E00806F79950A40C979C14A4BDBFDB79DF1DE01FDFCAAEBC93DDBAD62BA166843A121D2B144559064E9DE9E310DFC93D624C1061BAD3195D6C9F46DB64C65A31E90371F9B644E2A15E01C262395269A9AE83F50776F852903F86E5518BD008CF1B35E78F910D48C0B7BBAAAD5DFF2375C55D56B8F65B922229D5F494EDCCD2D676361619FEDFE6BF0BFD7E4C77FC459F181120C4430C409BA89D2E5A8C36CC6200497611D9D705DA6AE1ACA4E16B389D632A982E017E1DAD95DFFBC7A7D7191E7B8FA1C0ED +pk = 4FFB7D9A9E056D4948C4DFB41F92204A85AD92BF21211EC68404CA8045CADB364F786A47BC567599EE7AE27EE69D1018D080CC18CB5F0D7FF3D994308BDB3101FCB3638320001125ADB94F9AA12672B88378E82ABB1CE483C6F1ACD482FA06F79D8861D56B0236B8DA19E6B94C73A3CF81D3A8D9DF28CEE6A2352E476A2B910109 +sk = 4FFB7D9A9E056D4948C4DFB41F92204A85AD92BF21211EC68404CA8045CADB364F786A47BC567599EE7AE27EE69D1018D080CC18CB5F0D7FF3D994308BDB3101FCB3638320001125ADB94F9AA12672B88378E82ABB1CE483C6F1ACD482FA06F79D8861D56B0236B8DA19E6B94C73A3CF81D3A8D9DF28CEE6A2352E476A2B910109C3CAE5133CE68F3DC5426501EAC2B35DD17A11F3B4695E4DC994A2D15FD2B4178C0200000000000000000000000000000000000000000000000000000000000046F972E3127304CA7E910166C8C279231460BD47E0502741C81B79862DCC8889AAFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC559D55E0ED471D08DC65FC6A542696AC9FF02478BFD72051F86843703D830FAE9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CBCE4D6CCAF9DC0CA7CA7EFB34E613471B3B4E0E27FEAF81FE19B3772B884E73E6A81EAF6377161AA6553D9AF3C3C9F010BCEC6D6E7A9E71B9267B3A296B0240B199277FC6BAEE4293A68F133D1F68D9C5EC09B8A7426CF4DCF9C18FD08F6C2AFA18C1E0A7AAD7ADF39B7F868B7097181547F18A93F589B5E3E33C9C170BA2DF827B4BDB828860F537E19D526325A9718F331E25CCD201BBC1C06900B1C66B55AEDA889919253FC382E919D3C0978E8D532E458FB37AB596F41F8C7E0B27BB33136931223AFD995FA0DE0D38124693B960E0FAD95154B33F6069F2049EB424F3F31F6B7FCA17B3E95020EE16DD74C1E9A0B6F1A48DDB878E12C6E109 +smlen = 1480 +sm = 5414DE966211736EA3E5F077787F1A1FC3DBB94067BCD832894198C359B272285DCDE9E9EC86AF1D45C3A4EE1E0DEDF2FC7DF3837EF783085884EAF2959CD80061B690D044E002A0AD2FE5EEDF20755046518B965C19D87D475112330278D5732D9300B6793F2F31F0451E8DBFF3F2B55F7226E5FEFFBBA4C48CED7BEA10AF01000003CF40B690950971018FB623022C5D13E1E83993300FDFAA797ACE9C42B39C609A94091F586D8EBFB5096166E5637968457DA829C2A793AE2D2915F734653E7F3BC3AFA7145CED075126A8442E8375058B3294900F7D53D87A034D61A5FD66086108E8F2EDC280B2F74C9F47E5FC0B9183C3B509EDF3D9EEF99BE795176FDD7859D049C320F7D4DDC5442DABEB884FEC11747E0AC5422A26222CC5D8A74F01000206E82F5ACC7C1A326D430475357629D568EA3D0DBE131114781D5BF8DAA32FDE9F3CECD288ACD14445678C5EA6D3AFAFCE48EA3957A6AF8D8F23F78D84130FB6419F706EADD430CC85AFF48283F15602265059ABB075E011E3941834EBE70787CDD55F1E604C6B86F761D94C4F5E525791333DF6D43869D6F36B212A8F35583D38A21D0947CBE26FBE6A36E189C73137F2F2D89F48566D04D2DD9125D2EA4E0B2A7E5C1E9D2EA036CFADCF7BB28F6DF3B7D6395230C9D39D1E7558EA25340252708BE23EC6C0C9A0946C5C5AF0FE037C254D1A5B2B70B8F916CF37945BEF76BDFDFB19A0DAAC5A83A6357E986B3155CFF31024121634C3700CA99E5ECEF1F2E411C6621FED6092C1AB59860271AC7F431E568075D59F71AA18096195F30BBEB1A6BAC20E034F83C72BE0536315879F1D1B7F31D38C12DD8E97819B4803D02BECD436B61D1296CEB78EBF857E34087EC8AE8395269B5B0770B3423B39638910D2A3DDFEC8502389FD8B5B09FFD10CAAD1A5C86E7E39629AB09A4ABCDD00FBB9821F92E7DD24DDA83D1D9762F52A89BED6C20648EA04FBAD4233E5920AE83FFEC28FDB5E432929A41DB782B2CEA8FEB40CAD0B27903050B650477E5D9443A536ECDFDAC673952810596F1985427359D9E4797CABCCD2FA0C0A2394D853B4E6F8E150B3E3AB5136CF476605FF5FFA9067C0FE58A143B50B18B09256657CF091132D449A6E7EE79AA870E9DBE46BF840EDCB983F585EC2856C059808E72B8C901A25D6AFD5372F168D533052A6D26418E035D87D0BF818ADEA19915047C8D824A425A8C7915756673E0F5FCCB1B4FE7C1FDFCE505F7E18F023FDD32A605906EC48E0FA755B6D87E47711E158D672C5FB4CD3B8D1D13FE9EECE58453987CFCDD87B621B870F3AA27E73B6FB7FC0A6757893B978C63B7723C49D1005A1E5B1A4D60C4A2FEF392DF7EF97F149B499164455633FA485BDF92F804A47C8703D124522D73887A2B032F10F45343993FFB009D69E80FB54B6999A5BDB2760F8BCCA648F3C52BFA1D887AE49862DB4CBCCC7213ACBFDC48A57C3DA1F1EBBEA828182432AA1C593C3E5591C825E5706A5F9503311E91EC3D8F4A9554C3DF915B5FBE0516A7A5597ECF8862A8DF286ADA96C90C9F2783F7F947A18EBBC64C1BAF24B29F77521A9EBE09BECFFDB902EFCD024046FD3E6182BF0C84BD3A0A5410EEDBABFC60114E5DB28B0943D79F58F766E2EDB16759850D4CC3A9A57AE073CF6F3B24D36A4365E2BC64674259170B6D11DFF63D0DEED085B6321C45F218E09351AA0D4155189CC98DE5627A03396A067AB3FEA2C133062E3823FB1CAFA5D592070C8E82ABE812979DBDCB6D2E595F33830AD0E8E2F9E6CDC4D9C74B8026EAD1815DE36772769C4E00806F79950A40C979C14A4BDBFDB79DF1DE01FDFCAAEBC93DDBAD62BA166843A121D2B144559064E9DE9E310DFC93D624C1061BAD3195D6C9F46DB64C65A31E90371F9B644E2A15E01C262395269A9AE83F50776F852903F86E5518BD008CF1B35E78F910D48C0B7BBAAAD5DFF2375C55D56B8F65B922229D5F494EDCCD2D676361619FEDFE6BF0BFD7E4C77FC459F181120C4430C409BA89D2E5A8C36CC6200497611D9D705DA6AE1ACA4E16B389D632A982E017E1DAD95DFFBC7A7D7191E7B8FA1C0ED + +count = 36 +seed = C08E846A8E039C8655651919A8433D475F494899FB617DC3B4715DEF0C992C195CE38158B7FF40E0684B30FD7E623265 +mlen = 1221 +msg = 743E5D96B9B4C1469E7AD2B3703F711FAF60CA335358FF3EFC8FCFF02CD020A443243B4169F9123351B6C36762B85BE5E5EDDF8D4B43D82CAA615788406A31CDF4F7087D42DB21AE48A069AA23A8F6D20A1C0762F973E526F011DEC737E986CC324724BC5336D0362525757410E21046A12AC54F2237E68DA036A5C1389E46A53ED8C21774906948D4C9E14F40519C54DBD02B7A4ACAABD24FFD7F6CA4D6D582EF48940296D2893415E811FE7EF0801B35F1C594E6FEA2C293869BBD45618B6F04FC26B55D55A0AE99445AEA12F851B7E58A49CC6A0044F28E3EB838CFA6BAC5DF53B0DB78BE2CA2BEA1BF2DEFFEBD673A783C91A6C9EE710B12042EC2863A9B52EADA5B0D32101BBA8338F7C75CDAE7B7FD6797B25F96ABD53A24A7647A1C91610306FFC72A8DA4D46B1778146A98BD59CEA3173D41D5A53F9A7F9E282B5FDA1AFB062D8AFB63CB19B0E76DF782FEB9F7FD50902133529CFDD7C51AF297895EF6E1871AFD4C3DE93DEFA8FCF1FE67BD27B7EEB0CF37A6A8E09AF1203922BD9B62672D4756519CD09DD9271ECD0285F92030A9FC81C09BF2FAE86F5F50596C628E0BE673571CBC2FD76C563E113004529B234FB50E9E3D6D1F814CB8E5B5CC3EA365D0BC7602B146CC0361397D9BEE9246FBA3A724C462E177D27836093EC009741ABFA28379AEBCF5EF09BBCE00CE449FEC3A3302FB9AD0F010CA338363539DA545F159FBCD3D6A0482454023587A324F5132FB6F4CA602FAB2CF6CD59104427264CC9EDE8D10CD9DD7FA6133E65693DBF744443AE920994226E21D98634BC7F0710DBC37C18203EFA5ADB467B523322E21E4E686B6B85B00CB501ED84153BAECD4D6CAC9D1183E38B510F7B1DBBE5995BCB717529B83FBBE969DFD8DE21183762FCDED692B16502834FE8E7A7C46F84ACDCD2C9975098CF0CDE8AC0EFAFA449DC26840180DCD9353A2F1B06962677C808B07345E8ABE95B8D24F21D751A4EDCFA0E02FF077DE64E6B992E8C8822682DCC7F03CA7582FE7C74E0A9822A02D888FDDE1FC9E73C2EDEDDF32001E918771E5F511EF8F88AC19B76FAC0C812F56938F814D712D99269D7802E47634E541B54E00F9EAF78A421506A88B4BF7332DFC7D79E8C41835031FB449507D19D5A8A512A5C527C95B6F21EE3E41FA43591DD9BD2E4293701BDAFB624E0EA290DA4B7A173003867C4CC3FD814E117B4EEE283C58F5FB33D653E410F68C8962155B8C4FBC13BB750A0343737D1FAB36EBC618A6A7C8E6F93855CB24937B01C438FA713D334DF335D0745582F680627D8B94CBC25F0D12E3B1C27A3ED72E2558B800C19DC6B719B961E0FEE43BFC34E999027CA1969ABA4C45FDAB9AF01B955E948DE951F5A1088BEDA43AC930FE99D8CBB3473475C444F43E928E1A44966265B38FADF9B1183700A95A81F85EA43E5C61DD9B2D67701C95583E8E3F15083717E1722D764B6E624505347C30E5E70163ED9A046C504FF534956E911294D2B9097BBEEF8740377EF0D6C4CC8086422902BF63556CE6DA8E33E68FCFB42707C00693A995D17680B76293194DB217EB5A928303DCF1814E4A881B057BAF2553AC4FAAC8E4BF23FD4074154CD4AE189FF7E204EEDB8EDD594CDC21B5B7D73A712B511D068F4D217C0F91F9D84C524D973D67AA741EB13FE922AFABF79CD2396181143783030FD2D0CFEFC877934D8037A4C32AE8E15B50A6FA4269 +pk = CF712E8F8C03922DDBB9A1069A6FF9131DD014BF96978FECB02AB09309C08ECA9101525FCA048CB5C8743480762742F8684CAEFB1AC3D1BCAF2873C30A7A87016A62C3DC1D0C80961087E734B5C90631DB17AA6D43450D79B2FA2D25DB30582CD5E125467068C572B07A494647824DD90270CBA1CB0D186B7177001668260D0102 +sk = CF712E8F8C03922DDBB9A1069A6FF9131DD014BF96978FECB02AB09309C08ECA9101525FCA048CB5C8743480762742F8684CAEFB1AC3D1BCAF2873C30A7A87016A62C3DC1D0C80961087E734B5C90631DB17AA6D43450D79B2FA2D25DB30582CD5E125467068C572B07A494647824DD90270CBA1CB0D186B7177001668260D0102B1D6E3A7733C9606E1ECB80C21D1FE844C3B3E99EFF21D72EBB5D0F666834F36DB0100000000000000000000000000000000000000000000000000000000000060E7E466E07A51EFE5B90F065D6B969C3B84420383D0D9457E0D7F43D0BB41275AFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95D7B8E010682C0F0C148AE580F9F9F4E5ED3CAEE23B8E623B4DE46826853FD437FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009045112674771F3819264F77EEFCD5F2196911C8D2180113E5582172B61179ADF2CFDD0BF7508C22D5B5227F46F8AA3C8DE10D484A4E578B9F7B4744864D07DF0236F894ACD57BD9A45FD537A16BEDB213EC0C579E739E269EC82B707E25FA9B2F97E63E189CC4137557B7D2378D22EBD935B8627D805FCC52CF24F957034D579DC846F9453BECDCA8C7780DD14567406F6A30DB4EF2EEFF315D8A1A1D938F5603EA476912745C49718EB7B4EB03E47251B92625F4526F5460FB69440D61F82FAFEAA02C0C87D18E4B32962D34014D1D77F9AA21286273C2FE435003EC8AEE9EB7990EE8794CCB1139B6647C143D1A6DA125373DAB4689266315420C +smlen = 1513 +sm = D879DD4E42AE544212DB45AF385EFD0CECA9304AAC4E2656C535694973C212EAC00575B45B052CDA1E8D04FBB80A65A8C4E02AD802E08E3854D2C3024B05720167C5260C32C6684B078739475F020439FDB9EB13D581670CF0CE53D103F162EE86C02B62C54BD6B3B198F599028EC19653F9FBA864D59AC8F76EB7C73E4A460100021E534EC585119AE6C37472B7D8E6000A77A40E49E75ABD20B225DCF02B03363367CFA2425603065ACBE7795892E07A7A3C3BEF8890A8811ACF4B77C7C4ECF3159AF5D0BD62ECAA8722B27FEC282CBC2D3C128FD52402AB7F79990881A2D1E3118BC94A38764EEDBBDD73C8D57CCF513DC472EEE72B91B95901FCB08E00239C7F397534E7BB3340FDF38CD5B63BD2B910B06B5E523ECBBF6B8182995C2BF815000209743E5D96B9B4C1469E7AD2B3703F711FAF60CA335358FF3EFC8FCFF02CD020A443243B4169F9123351B6C36762B85BE5E5EDDF8D4B43D82CAA615788406A31CDF4F7087D42DB21AE48A069AA23A8F6D20A1C0762F973E526F011DEC737E986CC324724BC5336D0362525757410E21046A12AC54F2237E68DA036A5C1389E46A53ED8C21774906948D4C9E14F40519C54DBD02B7A4ACAABD24FFD7F6CA4D6D582EF48940296D2893415E811FE7EF0801B35F1C594E6FEA2C293869BBD45618B6F04FC26B55D55A0AE99445AEA12F851B7E58A49CC6A0044F28E3EB838CFA6BAC5DF53B0DB78BE2CA2BEA1BF2DEFFEBD673A783C91A6C9EE710B12042EC2863A9B52EADA5B0D32101BBA8338F7C75CDAE7B7FD6797B25F96ABD53A24A7647A1C91610306FFC72A8DA4D46B1778146A98BD59CEA3173D41D5A53F9A7F9E282B5FDA1AFB062D8AFB63CB19B0E76DF782FEB9F7FD50902133529CFDD7C51AF297895EF6E1871AFD4C3DE93DEFA8FCF1FE67BD27B7EEB0CF37A6A8E09AF1203922BD9B62672D4756519CD09DD9271ECD0285F92030A9FC81C09BF2FAE86F5F50596C628E0BE673571CBC2FD76C563E113004529B234FB50E9E3D6D1F814CB8E5B5CC3EA365D0BC7602B146CC0361397D9BEE9246FBA3A724C462E177D27836093EC009741ABFA28379AEBCF5EF09BBCE00CE449FEC3A3302FB9AD0F010CA338363539DA545F159FBCD3D6A0482454023587A324F5132FB6F4CA602FAB2CF6CD59104427264CC9EDE8D10CD9DD7FA6133E65693DBF744443AE920994226E21D98634BC7F0710DBC37C18203EFA5ADB467B523322E21E4E686B6B85B00CB501ED84153BAECD4D6CAC9D1183E38B510F7B1DBBE5995BCB717529B83FBBE969DFD8DE21183762FCDED692B16502834FE8E7A7C46F84ACDCD2C9975098CF0CDE8AC0EFAFA449DC26840180DCD9353A2F1B06962677C808B07345E8ABE95B8D24F21D751A4EDCFA0E02FF077DE64E6B992E8C8822682DCC7F03CA7582FE7C74E0A9822A02D888FDDE1FC9E73C2EDEDDF32001E918771E5F511EF8F88AC19B76FAC0C812F56938F814D712D99269D7802E47634E541B54E00F9EAF78A421506A88B4BF7332DFC7D79E8C41835031FB449507D19D5A8A512A5C527C95B6F21EE3E41FA43591DD9BD2E4293701BDAFB624E0EA290DA4B7A173003867C4CC3FD814E117B4EEE283C58F5FB33D653E410F68C8962155B8C4FBC13BB750A0343737D1FAB36EBC618A6A7C8E6F93855CB24937B01C438FA713D334DF335D0745582F680627D8B94CBC25F0D12E3B1C27A3ED72E2558B800C19DC6B719B961E0FEE43BFC34E999027CA1969ABA4C45FDAB9AF01B955E948DE951F5A1088BEDA43AC930FE99D8CBB3473475C444F43E928E1A44966265B38FADF9B1183700A95A81F85EA43E5C61DD9B2D67701C95583E8E3F15083717E1722D764B6E624505347C30E5E70163ED9A046C504FF534956E911294D2B9097BBEEF8740377EF0D6C4CC8086422902BF63556CE6DA8E33E68FCFB42707C00693A995D17680B76293194DB217EB5A928303DCF1814E4A881B057BAF2553AC4FAAC8E4BF23FD4074154CD4AE189FF7E204EEDB8EDD594CDC21B5B7D73A712B511D068F4D217C0F91F9D84C524D973D67AA741EB13FE922AFABF79CD2396181143783030FD2D0CFEFC877934D8037A4C32AE8E15B50A6FA4269 + +count = 37 +seed = 1D9C060EA0408A068BD982D9694D39D02BA5A473378F6F9F09349F686566F331E767263FAFF5DC0E823BB6F648843876 +mlen = 1254 +msg = 3382E87BA70EA986A044B0CBA2EAFC3316C1AC95A5F16F6368C210DBEADFAE6CF2382DDF5078AD594CDE3BD1A837C517B1A20A2099D938DF6AA02B6C0E62FE6147C904BCF3EDE51DDDA60DE7887DFEB2866DB402D23E5934A74C9CE4852D4B2F53CC9BCDDA312964A548F6F7C8320AF1D1BDBA7FD32EC6C86BC3FCB4205ED3DB092FDCAD9AC4D2B8575883E13F69D8C16CB18D1B9284B31823ECE917C905C5C8B9D180C1BD87975871014F773FB57D402B8FE16EE312692665824CF0BCE4509326A31957319364CD421E9B21BBC1DFF663ED850858A2450C2FFE64B65E009A3999CE4504BA5313BA0EE4A8843349C30FA6E59FD3ACECA130A37C04F9B64722608768973996112684B64D0C87BF95E5DD60661935831A6A1A9575EBCB2F64A15296BE788C775D80523D6BB4267D91B0C71BA5F90DDF1933DE898E79FC7E39D0A3D146F185214468DA50AEB47402AB542E52CEB768A70CB1F749E4164CF20E549B674CE965FFBB98D874D34B5B7851E575E6C1E4DE9C170A10DAB84940AF055A951260B0119F5ACBA320B55CDCE4F16346905A2073CD9FEFBA95734E4F4DFDB7A33F292D45698831F1D3E9FBF56D9692C14A8F9887265CBB4441AB331D977E3A68A1BC9F406AE0FB1C6E91205670641B9868E2A987BACEEE2364FDB089A63B53976D600BD7A8AE88A02872E46927269D281CEFA385C98CCDFA6609394943FAC32237368C6203AAFABDE072054AB5A14A91391D5A943F4ED4A4407F275CCFD15FD28F1AE0EB6EDCC6612E3436572919E4DFB57C049BD77B344D8E04152863EFD4FAE8FE3A7230AEAAAF82870820085F4B3EB5215111B6B8952CF2FF468B3D10F3AF849F16E190E9560F40B05E6E2204591B58A850E2710F7043AEE2A44A6D4A108CEEDEB2D216E51102DD08751925DE6A7F67BCA1980F0789B34E2F86729621F2285C5D3A036CD87C76102E9D607C37CCDAC8062CEB961053F3195B5ABD88BC64FC65F8BE34166841683F1EED291938F75DFDB3AF4FD2AA98CE95382ACFB5D5DFE6EF243C8A0B19B80584FC0CD533E38BD485D1C52E0EB5BFF90C0A947D9B9095AC1C0CE9754EABFC860990206B981235C7B612DB61C9FDEFC0F14DBF68A8A0EA4986CDC4AABAD6C218559E11CCEECD804EB98446FB33EAE47C0388BD8972DDAC02CE807B707D6D188CB31A1D76D44323E93DAC4F8ECF77E7896C052EF16009CE4D1147DF84FD5785D95D77310783F9AEFF1DDA693F4BED26457ED82A1CEA19D9C4919257E3050B25A7D1CE7561740DDAC3FD93A607C79875E050E40498BFBCCA95BDB3D0FE639DC7CEA80E3DAB3AD73A4265F012451C1BCC2FDA1E1AEBB7FB18407F31E7496E2A18D2C686B47120688240A2FB134A3C314D4CB422811E850524684EC485E061F7365494A6403AF170DA461A3BC32FFAF9143D5E9B17B2285C56977AECAF880CDD34F26120DAC4C950198233A50654EFACA6EA97333D2BBC024A5E668821D20333DF0B712510100AECAB6B484CCB7814178F851A3E6BA0B76F16C4685D5AC8BA48558D382ABECBDCF0B919C1ACAE46EBEB5011DD0B3C22B539810720CFBE4CBADB111E100C09C811E724A67C66A1B89EED1E7218861F55A4DC55E236C6E3521DCB374437A14E8000DBEBF0F7F9BF409AF952888675C11326D9E3E8A8828BF50CAECFF96075CF29446CADA373529D310660CBD60C042C143E1736FE7AFAF6FBE42791A8DB01EC0475145257FE2DF766D4EA972B14AE5110B8F8F42D659383E9BD76 +pk = F0528B218684756DFA0D9560D6FEC752EC4099C57ABA09ACAE104FCE5853CE88B75280F166261F74987C2F459066AC66835D0B0605E5D2852EE7BF2F745117012A74DCDC79745207354B2BC4F170539FA7F6D4530A869BAC0A9447A48FEF293497CB2FF2EFA80A983BA814BC359A3477BCC8AE8F61320018854073CED39E4B000B +sk = F0528B218684756DFA0D9560D6FEC752EC4099C57ABA09ACAE104FCE5853CE88B75280F166261F74987C2F459066AC66835D0B0605E5D2852EE7BF2F745117012A74DCDC79745207354B2BC4F170539FA7F6D4530A869BAC0A9447A48FEF293497CB2FF2EFA80A983BA814BC359A3477BCC8AE8F61320018854073CED39E4B000BB93D4F0C8DA02E9A0DD6FBDAF2D9A6D15EB57C4BA12591F228ACA5B0F09FA4EC7300000000000000000000000000000000000000000000000000000000000000E877AC031A911D4CEFA666FB9D998A80BB0DE6F7E5FDF995B940CA772EE7415763FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FF92A694531FE2F23E0E70ABB85480407405B9248DCC6A7F2646D5EA798EFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002E91609D6F9B8ADF252D7C1771B97F5777545002501A0AD57364B3A02681D7181E3BAFBEAFB18B870CF71ED70B0111AA18C8C2D91AD6ED8E905CE4F6F3880DBF27B341FF35478B20478EABE1B78F345D0C66D6C9CE9CAD74024F71653346FCB1185701A51F7F8B34267CAEEEC76C7AB5264984E19FC890600A9B1013C8094989263514009B6B63DF5AAF211589DCE6A3B7DDF8B4BFB09504C01B08AC9F1D1E82D58B8ECCEAC765B5FCDB98D97A5729ABAC5462E8712155AFE8EF6A2C0BB82C17C386CA4A0C4E407F710A4A040475EAC30BDF86F6900F7A0FC4D2E255E3A15FE45DE15660104C31CFF00798B3234BA55DB7AE9814FDD0E6D2B6A50400 +smlen = 1546 +sm = FACF9BB50732D738F7711089A5BD371E258793588225D84828E55BD73ADD360D1DA0BA6DBA6418A7E25E91198282B44D7BAAE9B9A163B2BE6C50AC6A06618C00F91D58865C3873AE5EBB99F988D06F81212E6ED93288A9A9890F01942A282B871E9CBD6B362238CE26CAF095A2006F34971D81DB9A2DE6F535458DB1147344000000E2BD24B8D7C1F87135C2991432897053A4B5E0CE7A8E7AE0DC717C8945BD5A1C993DC265E3E850C2A598CC91DE0CD353AE014DCB196407DF9366AB59F1F3577E4D4444C9BE88B30FAD5BD9455E22B6280122E9C0E14DC1A8D4A22F779822F65B6992EEC999D5C1EAE7B1C2F1253FD39A7A97790BD7AF346B04F5CE5F4A974B4D002B036334B4309A293865155176DABBC4E31566BF45F7BC0721F07E0048690006043382E87BA70EA986A044B0CBA2EAFC3316C1AC95A5F16F6368C210DBEADFAE6CF2382DDF5078AD594CDE3BD1A837C517B1A20A2099D938DF6AA02B6C0E62FE6147C904BCF3EDE51DDDA60DE7887DFEB2866DB402D23E5934A74C9CE4852D4B2F53CC9BCDDA312964A548F6F7C8320AF1D1BDBA7FD32EC6C86BC3FCB4205ED3DB092FDCAD9AC4D2B8575883E13F69D8C16CB18D1B9284B31823ECE917C905C5C8B9D180C1BD87975871014F773FB57D402B8FE16EE312692665824CF0BCE4509326A31957319364CD421E9B21BBC1DFF663ED850858A2450C2FFE64B65E009A3999CE4504BA5313BA0EE4A8843349C30FA6E59FD3ACECA130A37C04F9B64722608768973996112684B64D0C87BF95E5DD60661935831A6A1A9575EBCB2F64A15296BE788C775D80523D6BB4267D91B0C71BA5F90DDF1933DE898E79FC7E39D0A3D146F185214468DA50AEB47402AB542E52CEB768A70CB1F749E4164CF20E549B674CE965FFBB98D874D34B5B7851E575E6C1E4DE9C170A10DAB84940AF055A951260B0119F5ACBA320B55CDCE4F16346905A2073CD9FEFBA95734E4F4DFDB7A33F292D45698831F1D3E9FBF56D9692C14A8F9887265CBB4441AB331D977E3A68A1BC9F406AE0FB1C6E91205670641B9868E2A987BACEEE2364FDB089A63B53976D600BD7A8AE88A02872E46927269D281CEFA385C98CCDFA6609394943FAC32237368C6203AAFABDE072054AB5A14A91391D5A943F4ED4A4407F275CCFD15FD28F1AE0EB6EDCC6612E3436572919E4DFB57C049BD77B344D8E04152863EFD4FAE8FE3A7230AEAAAF82870820085F4B3EB5215111B6B8952CF2FF468B3D10F3AF849F16E190E9560F40B05E6E2204591B58A850E2710F7043AEE2A44A6D4A108CEEDEB2D216E51102DD08751925DE6A7F67BCA1980F0789B34E2F86729621F2285C5D3A036CD87C76102E9D607C37CCDAC8062CEB961053F3195B5ABD88BC64FC65F8BE34166841683F1EED291938F75DFDB3AF4FD2AA98CE95382ACFB5D5DFE6EF243C8A0B19B80584FC0CD533E38BD485D1C52E0EB5BFF90C0A947D9B9095AC1C0CE9754EABFC860990206B981235C7B612DB61C9FDEFC0F14DBF68A8A0EA4986CDC4AABAD6C218559E11CCEECD804EB98446FB33EAE47C0388BD8972DDAC02CE807B707D6D188CB31A1D76D44323E93DAC4F8ECF77E7896C052EF16009CE4D1147DF84FD5785D95D77310783F9AEFF1DDA693F4BED26457ED82A1CEA19D9C4919257E3050B25A7D1CE7561740DDAC3FD93A607C79875E050E40498BFBCCA95BDB3D0FE639DC7CEA80E3DAB3AD73A4265F012451C1BCC2FDA1E1AEBB7FB18407F31E7496E2A18D2C686B47120688240A2FB134A3C314D4CB422811E850524684EC485E061F7365494A6403AF170DA461A3BC32FFAF9143D5E9B17B2285C56977AECAF880CDD34F26120DAC4C950198233A50654EFACA6EA97333D2BBC024A5E668821D20333DF0B712510100AECAB6B484CCB7814178F851A3E6BA0B76F16C4685D5AC8BA48558D382ABECBDCF0B919C1ACAE46EBEB5011DD0B3C22B539810720CFBE4CBADB111E100C09C811E724A67C66A1B89EED1E7218861F55A4DC55E236C6E3521DCB374437A14E8000DBEBF0F7F9BF409AF952888675C11326D9E3E8A8828BF50CAECFF96075CF29446CADA373529D310660CBD60C042C143E1736FE7AFAF6FBE42791A8DB01EC0475145257FE2DF766D4EA972B14AE5110B8F8F42D659383E9BD76 + +count = 38 +seed = A4563D09AD21D3916BF4636301F2E64183A8F003DA186753D7F2DC3BE0089BA09C62B8A52B72C2C8451213606801FB29 +mlen = 1287 +msg = 67109894C579974373CA0054ED5F7C373B7AEB810721C3D9CEFA02EB244EF6B17507300370ADB24AE0173C6D114C51E05F822A770318033C082B6502F70012283EDA2A9DC0A1381F145470E5D3729D201773D2AA63C18885A92C962BCD3628835391D70DC36273DFAA4966F65AD40EB51FB4B416A8D0B1DDF39CB932EC4503BEA23E3D9D3B4501DB426C6AD99C28D415FB565F62EB5C22BB043C8CAFC42EBD1C7190DD32A5B14B571644471453740C081F3E3305F9AE70A5BD505874382EC0F6E2188563E763BB8D1BB8B16587AE25A6252F51E4AD02D0483C4A6E8AA2849C44629CF4B7C6DD6A5FECDAB0F9B2F0B35E306C7532B64BD5A3CE67A0247D97024AAFE5CBC13E375AA69B8287BBA9DDC9AAAC2BCF41A71E373EE36B13DF9F829BBEE8F48802DD9E03BE42A5E290251BB130E0E2ABCC4E096DD0F264E5D29F8C2388A0C3010E78F2A03F5BA1BE13AA5E50F2BA67A031CE3F787754B8276EA1AF62BC5FB4DD9A9B9BB84217A37EB9FC7AAFB517337B30454200D6AAE491E50D5007EAC2150F60F640A5C4624CE6D8112119413731322BAD9762BCF72349EE38E2A41102BC5461D72033072A90E82D105E6FCDAED9C223A4142CD55920196D7B1B9278C84B67A2E35BDE3C9CEEBB8E9007BA8758BD35C875DD5FA0A8FDAAAA9A09629B9DF69AFAAB456E105DABF2AC5834B8D223B0A406E0D1295C876C447E8E09C93FB09ED1B3EF6E1F3B7FCB029F576A45A12620567E05F218BC3753109DD29AE0ADE1370C0F871AB5AD8A9DBAA277FB869EE552E8733E73886D6DFEACE6B35E481F37A516EBE191DAA6F83E4FF453CF9CC9DDEA8EE507AF0E62EF3CB8C22949CB828E21C6AAF3FA9AC301E2257B0A054FF0A237F527D53EB757820AF637FFC9F983A2B5AFF0B4CC493E610314432C9C2F0FF73C4240D520D1D73721B429CE41807B7424B14F5EB1CD23D5562263FE1D58CB1D52E5175414800CB090242E240C3A7ACAD4C84DBD8ABC2731FA2B1D9820DA60FDB6BAA7EA849B6A146E07AF7FC201B3A98E5194BB5826945FACA3690209E5726F070A71EE07AE76ADB7E6199FCCC81C8AF7A463633A58873B4F7E65F522FDA409979DE41CF54F659E66CD5950A3A3E01570526C46417A00EC2E8821DC380ABFA21384D141D259CBB9722F267E46272ADC5CC4BCE382B554226996F4A6A1605287276C18A48C8FF1A92ECD2815CA5452FD6157FC27532680022993535549BF9AB064052E6DB4E9F83B5D0D885B94A90F59E67B9DF0C321EB0F95AC07007E4EE33BA89AABEEEEA01FD1172ECA4E31FB02C507FFE43CD0D6C8570769A180E68A70BD344B4C992E7D3A6BFB96AC4D69C2D4F5EFACA1D348DC1988DE44B30DA76BABC307A88124F96F26737A85FE6047E7E485C7E4B6B99B575FAEDC9BACA3E080E2B074CFFCE1F716C6A1D08234C45706D2883C6E5A001D02596CFE5B260DE6134C75DF3AC8BCF1919759E15576CA147CEBE041D04E369BDE70CC64157AEDA311C8DA520EAE907C33E30DD89013E24B7B02E66C9F285BF7D5C3FD65BAE24AB20D40ADDB451AB4BC4B9772D0B9039461BCA8D3D2A4D71A2E6BFBE7F02325FD571FCAE1FB47F855612F382188A5FA3D61C3E8E59EF016DB0149C52E1C7DC84030E6C93C4F32DA6CE5F3B8196AFFDE834D2ADC26CFA05940055401891519386BCD33D85584D74B2F16D8E19556C272AEE8397A1741EFFC283DBAD317740C1B67F8F4B7D2D1EDD68D6615EAC3F8E3CD26AC4F8058667FB388B19C654711B5B2EDA75A9AB55174157CBE08C186A3D0963BB3011A9567BD499AD2A8 +pk = E45066A7E0AA9D23E3D98AEB91CA678AC3C6B84547A117C61CA31A96F68A4FFFCF2295DA06DDEB69FB051EF59C787060367E36F76E5CE56BCA4E86B6BD10600009673D888A160F0AAEDC3BD49325C03039A638180E342C8F3B150DF5C7F40B8DC68E1567295173BEE2DDBA5EF5D8A556336DC39A4BE4B4CD4834DFDEFA9EDF0004 +sk = E45066A7E0AA9D23E3D98AEB91CA678AC3C6B84547A117C61CA31A96F68A4FFFCF2295DA06DDEB69FB051EF59C787060367E36F76E5CE56BCA4E86B6BD10600009673D888A160F0AAEDC3BD49325C03039A638180E342C8F3B150DF5C7F40B8DC68E1567295173BEE2DDBA5EF5D8A556336DC39A4BE4B4CD4834DFDEFA9EDF0004B1CCA63159B5DD2C607C16361945F8D35F14815D7288EB63C390AEA2675C67F0DB0000000000000000000000000000000000000000000000000000000000000036C2D27F828C16C6DD065982B4D4BBA9553D08B38D57C16EFD3F89BA2A9427B667FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD192FAE9DE547BF8230474B0756819C25DA08A56AE621526676151AEE7BA332131FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BF8F95D0FFA7DA2F2967388E2AC6BD4DDCA6CE56F2541694E021E9F0F577E6B4FEB6D5DBBB23AE24F630438AB1D97D25E3814AB2824B8264AB15F0781ED008F5B68E74B0428BD465793A54125F4AB80AB8C58364DB1C7CBA9F9EA684490E0DD06EDA82891F2FD202802B5A033314CC6220B9C360461BE47B66B5010BB00196B2C71DE4DAEE1DDABBD73033A01B285DD96AAAF2F6D183C05BC31CF4446B905D1895AE2AAE2A26F294B900A0EB198CD4E4BD9A07D027FF49151FF7E89F076DBEF5478E16DE2909FA83E0E2937FFCA3BB37D1C5689D85EEEF684D98805014956AB142C99597B7D5F002BAEBF73A23B418E6B6B426F609005F7B8C174309 +smlen = 1579 +sm = 0560127D6367E5B3E6A75B78A94B66C1D92181CC6FBAB36DFF8A4BCCDA34D693B2F69FD3D40DDA0621CA6FF4694519F2845C484D316AFFC80FFB9E57C3C60100DF855E1C69888E39CBA31CB19DA54AE7006A1ADA5D99A9C786CC93F94E69B640DF8ABC63A4FC1031F77D7E39D1CCDD94FD2041EB278C783EC60C5C3AED836A01000044ECCF7218C773D6B4EE26FDC36D15FAE61C3D549F613B13E044A169C459484413FF5CF62A4F1DED2050F1A3FBF2D5E0F2C1BE22FF1C348E514CEC1FD6F1D116691BFB74EC70F851BEB0FBA6EAB5CF17C215AB90701CB2B2CFF0694B58354977DC9B960CA8C3084410F9391E4946392FC06C5B84043A1510248D47D4C5F5B96F74E1A401BC9A986D99A6E036AEF6244F705492FA44ECB08D210406D2FBE85200021367109894C579974373CA0054ED5F7C373B7AEB810721C3D9CEFA02EB244EF6B17507300370ADB24AE0173C6D114C51E05F822A770318033C082B6502F70012283EDA2A9DC0A1381F145470E5D3729D201773D2AA63C18885A92C962BCD3628835391D70DC36273DFAA4966F65AD40EB51FB4B416A8D0B1DDF39CB932EC4503BEA23E3D9D3B4501DB426C6AD99C28D415FB565F62EB5C22BB043C8CAFC42EBD1C7190DD32A5B14B571644471453740C081F3E3305F9AE70A5BD505874382EC0F6E2188563E763BB8D1BB8B16587AE25A6252F51E4AD02D0483C4A6E8AA2849C44629CF4B7C6DD6A5FECDAB0F9B2F0B35E306C7532B64BD5A3CE67A0247D97024AAFE5CBC13E375AA69B8287BBA9DDC9AAAC2BCF41A71E373EE36B13DF9F829BBEE8F48802DD9E03BE42A5E290251BB130E0E2ABCC4E096DD0F264E5D29F8C2388A0C3010E78F2A03F5BA1BE13AA5E50F2BA67A031CE3F787754B8276EA1AF62BC5FB4DD9A9B9BB84217A37EB9FC7AAFB517337B30454200D6AAE491E50D5007EAC2150F60F640A5C4624CE6D8112119413731322BAD9762BCF72349EE38E2A41102BC5461D72033072A90E82D105E6FCDAED9C223A4142CD55920196D7B1B9278C84B67A2E35BDE3C9CEEBB8E9007BA8758BD35C875DD5FA0A8FDAAAA9A09629B9DF69AFAAB456E105DABF2AC5834B8D223B0A406E0D1295C876C447E8E09C93FB09ED1B3EF6E1F3B7FCB029F576A45A12620567E05F218BC3753109DD29AE0ADE1370C0F871AB5AD8A9DBAA277FB869EE552E8733E73886D6DFEACE6B35E481F37A516EBE191DAA6F83E4FF453CF9CC9DDEA8EE507AF0E62EF3CB8C22949CB828E21C6AAF3FA9AC301E2257B0A054FF0A237F527D53EB757820AF637FFC9F983A2B5AFF0B4CC493E610314432C9C2F0FF73C4240D520D1D73721B429CE41807B7424B14F5EB1CD23D5562263FE1D58CB1D52E5175414800CB090242E240C3A7ACAD4C84DBD8ABC2731FA2B1D9820DA60FDB6BAA7EA849B6A146E07AF7FC201B3A98E5194BB5826945FACA3690209E5726F070A71EE07AE76ADB7E6199FCCC81C8AF7A463633A58873B4F7E65F522FDA409979DE41CF54F659E66CD5950A3A3E01570526C46417A00EC2E8821DC380ABFA21384D141D259CBB9722F267E46272ADC5CC4BCE382B554226996F4A6A1605287276C18A48C8FF1A92ECD2815CA5452FD6157FC27532680022993535549BF9AB064052E6DB4E9F83B5D0D885B94A90F59E67B9DF0C321EB0F95AC07007E4EE33BA89AABEEEEA01FD1172ECA4E31FB02C507FFE43CD0D6C8570769A180E68A70BD344B4C992E7D3A6BFB96AC4D69C2D4F5EFACA1D348DC1988DE44B30DA76BABC307A88124F96F26737A85FE6047E7E485C7E4B6B99B575FAEDC9BACA3E080E2B074CFFCE1F716C6A1D08234C45706D2883C6E5A001D02596CFE5B260DE6134C75DF3AC8BCF1919759E15576CA147CEBE041D04E369BDE70CC64157AEDA311C8DA520EAE907C33E30DD89013E24B7B02E66C9F285BF7D5C3FD65BAE24AB20D40ADDB451AB4BC4B9772D0B9039461BCA8D3D2A4D71A2E6BFBE7F02325FD571FCAE1FB47F855612F382188A5FA3D61C3E8E59EF016DB0149C52E1C7DC84030E6C93C4F32DA6CE5F3B8196AFFDE834D2ADC26CFA05940055401891519386BCD33D85584D74B2F16D8E19556C272AEE8397A1741EFFC283DBAD317740C1B67F8F4B7D2D1EDD68D6615EAC3F8E3CD26AC4F8058667FB388B19C654711B5B2EDA75A9AB55174157CBE08C186A3D0963BB3011A9567BD499AD2A8 + +count = 39 +seed = 811A8A2ED2917CC616FAF246C5F9BB902E5FBF5430AB078AD6CE871CF8C160512A748216EFAB3A4CE1271AAFEA12C11B +mlen = 1320 +msg = 061934748C6758ECDEDDF3A2DF78574A470621496CE3F12E5E4555FEBCCC1A46A772FCBADEBA8B2EB5231B5B15DEDA5A38076C737E5D091A8CA8482F84EC4A20A51DDDA391088F2C3926F8E1D8B77DD0ABD606E9AC25A17A86A5C75ADC215C5030355C4A1B307C1CC80A3BC4A7D4B4044FD35D173A2C7C081318F707828A3438DABE0836C2D6C14E1643F05EF8405531D5594411AE4DAC6F3992279CAE379D7C1762B122037301D3FFE8EFD1BEB4E027E055527D485D0871F2013E7B25CC26531C2CA6DDB98B31F0AC2C3BDF400A0BAE942C9D4C4003F9952B67AF67E85F572EDC3345A84B6DC3CEBBAADB7E3C876AB2DA16ED0EACF4858033BF5A4F739F9E083A345C2BB5D8611DAE90D25AC45D8B3D39B4DE584CBEACCC6F5B6E61524349B50E818BB6B03C7E5B86795D49324CE6B1603791F20B3500A1B8ADE82359263470D777B35DBA38276096445842BA5D5E960FB2AB58730F970A15AA42D9737C33BE700127A7CE7CADE024D3ABCA59CA49F9A7EDF44DB62CCC07A595016868AA97A140178DC92530EFF864C24954464BA886DB7D74BE7B540BAAF807F1AEBD014680FF4A51E16E1391E32069EE823F3D23DB72244D657233578CB7D29A33E6EC31DF1FDD43B51742CC30EFC54BE83149177E7BCDE4450DCD142EB2CB745F8865DFD99DC84AB92750F1CFB0F3944E4E4EAA41261A1E8C58D9B230ADD792DCE20D2612823C0FF9F82E04B61E48DBB83F1A6DD5CC7F92BCD0A37AB3053803D1188029AA1FED9BA04F4C961588C9AD2BA7EF1CFBC50FA69B799898EB0DFE9668260CA5680F91A10D2BEF8F108AB28FCAB693ECDB942070D2B9B8BBB22609C8395C23D7482C31B69B0F555B7C079D3DEFAA5FB302ED92619C058ADF334E845EB1C6EDD903C0DE2AEDD3D9830943F8BCC5954B65DF37C901A17EF13FA75B0F2C8C1D2E38681874AEBFE90B463F2CC7831958FDC0DE0446991EB3C3612CC00188DFC1078FE458D2E5B80EFA7BFCE800C6B4CA0E570FA5858859633551DA28F36F1FF418A9B7AD18AA89B4612F9D676D5FD98BCE6F144CD7458CA9F2BC732A36A4D186EA290A009A870DA3C1F60617D56EA7554062367121F3E5E569503AA573B172C6278DDE5AA4CCDA79D9D8FAF41C6C9040C1D1D3CB78B41FFA8A0180395439F0D1B72E42471A9100973AB3BC7AEC559D94D2D6402374BA5A584DE168395A156324E1E4149ABD35C72AE0F79863CB59EE6BA22145E36E0D85D3CAF8A427D38C96CE489CD0AEA20D7960608C074CE3CD0494B6D6D5EC8895F0F03CE78982AD8FD6784BCF16825286C51325662F34726BA66D3A91EEB598124D6755DA090EF863FA31CCD5B08909A3279A35CFDCE24D2BA16F42AD280B029A0E27137A671C862B0E6F73FF4A1DE320C4DAFFB5CD4AC3522EF1C10E8A918005535F355CE6366B43A757938594366831DBF7EE72F311BE4953EDD1EA1C598960745D3DBB7F1E2D882CC063BC0791D18C6376A8497F2F91389A13AA96DAB78FECA081D761479848A5B4CC2E3D015F343B9000583E95E785A45A06842D7C6C0FE9AC4D70F085503D7AC954516953C497635AC8B7698BB784F73FE6E7F9D0AB9473E828168DF4EC142CC1FE18FA067525915ADF0764E44292A0316EF3C0A443683C92C4661409589EABD7B4DBD43F54317AE0E3D1C69C35A7868991FA0BC2F83430D89821B91A08DDC2D314A717F5BC6F3D89DAF163AF73E10C61630139E3FEDA723FEB2EDFFE6C7F364FBA22E6AAB75E267065B5E7575946C56265743816B2CF12A106AE21921E3E92BFB7FF80E105468F8409D6698E8660B5B05F3F4BB19A0BD4BE3569D24F51795752BE74C429AECA5BE737DE8C01 +pk = 0747079E19F3243AD728E7EB3E98960F5E7A4207C9F5C6B14878317D7380A53C1B8ACCD97DF15751D06C9CD83C61F8A60FE42E8A983EAACB08DFE36BEBC253010B1420E5DF5889C374B665D1C22B124A6EABC63747F45AAB355205DD2C6AC2CCA084C12D5D29471D81F5D56BAF6846896DE858720AECCFE76A8C6EFB4DD2BE0015 +sk = 0747079E19F3243AD728E7EB3E98960F5E7A4207C9F5C6B14878317D7380A53C1B8ACCD97DF15751D06C9CD83C61F8A60FE42E8A983EAACB08DFE36BEBC253010B1420E5DF5889C374B665D1C22B124A6EABC63747F45AAB355205DD2C6AC2CCA084C12D5D29471D81F5D56BAF6846896DE858720AECCFE76A8C6EFB4DD2BE0015D31CAFFE50264BA4AAE4B30091524A212371EA7AFC81303D2ABF7D6597153FEAA90100000000000000000000000000000000000000000000000000000000000086F5E290C60E8A55DBDE7BC4F445690A04304DF5F8838120B36550061257CDE78DFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3D37E5C5517E58F70926701F01DBB693A6BC0DFB0770B7DF79445FECD6ED63C4EFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056E192790CEE9D8217341A7D3449BBD499C997CDABCD677D48B95CD13141351637B04F7B9304ECC81E3E6AC149241C754304A5425C254AA79346E30505320747D33293D0745765105F72928262244B17BD3D85FBC30050510F6DE60F234AD180B132AA38F21C726151789F3E17C902F413D8E1194266ED73C4BD7F955207233037E984507EA27EF813A98305251FB4736CAA1146269D37D2411511280EEF8955AC16CE0E0C267727D7CE445C8B293F4D38E2E9E7114A36A575014F320BCFFF8E555501222F0804B935B86BADC125388FEA21C7181574646A3B423BE0934F1B31BE4D202C98C5CD1C5953A0942E116A586252583B32FD7A3CA46FA30A +smlen = 1612 +sm = 10E2848C718B91F08EC780396467ECBBEA51C87DF3439E64E49B91604019BE21E7E9FA3A087D1F19EA8576EA001F9B4308967F0F3EF88C54964C9437F36BE9007F648D9BAE8D04128C57FA997D9A3FE14DD8214881BC024F5C2BCC7489FDB6314044A48A8EA8E41666B45A90A766664D7FE9E01D5BF46BF39982EA1D53C6BC000000710B3113F2B24C3257467F441B7C5EE11D49210B36B3855068187045247C9C4C447388371818B836B763C8E348FB4776067CCC73F7ED5D78035005B39510F74DF50ADC7466ACED3072159E510A4E1EFAD6B0F0845D7D989FB8E85CF2C01046460FFD2925A9E4563CA182947C26F706DB16D998C28A9C23FAA0CF7DDEFDE419212AE12D4BD146D41B00C4F7A1BE2D706F277F0AF9D4D92AABEDCF4A603BD570000B0B061934748C6758ECDEDDF3A2DF78574A470621496CE3F12E5E4555FEBCCC1A46A772FCBADEBA8B2EB5231B5B15DEDA5A38076C737E5D091A8CA8482F84EC4A20A51DDDA391088F2C3926F8E1D8B77DD0ABD606E9AC25A17A86A5C75ADC215C5030355C4A1B307C1CC80A3BC4A7D4B4044FD35D173A2C7C081318F707828A3438DABE0836C2D6C14E1643F05EF8405531D5594411AE4DAC6F3992279CAE379D7C1762B122037301D3FFE8EFD1BEB4E027E055527D485D0871F2013E7B25CC26531C2CA6DDB98B31F0AC2C3BDF400A0BAE942C9D4C4003F9952B67AF67E85F572EDC3345A84B6DC3CEBBAADB7E3C876AB2DA16ED0EACF4858033BF5A4F739F9E083A345C2BB5D8611DAE90D25AC45D8B3D39B4DE584CBEACCC6F5B6E61524349B50E818BB6B03C7E5B86795D49324CE6B1603791F20B3500A1B8ADE82359263470D777B35DBA38276096445842BA5D5E960FB2AB58730F970A15AA42D9737C33BE700127A7CE7CADE024D3ABCA59CA49F9A7EDF44DB62CCC07A595016868AA97A140178DC92530EFF864C24954464BA886DB7D74BE7B540BAAF807F1AEBD014680FF4A51E16E1391E32069EE823F3D23DB72244D657233578CB7D29A33E6EC31DF1FDD43B51742CC30EFC54BE83149177E7BCDE4450DCD142EB2CB745F8865DFD99DC84AB92750F1CFB0F3944E4E4EAA41261A1E8C58D9B230ADD792DCE20D2612823C0FF9F82E04B61E48DBB83F1A6DD5CC7F92BCD0A37AB3053803D1188029AA1FED9BA04F4C961588C9AD2BA7EF1CFBC50FA69B799898EB0DFE9668260CA5680F91A10D2BEF8F108AB28FCAB693ECDB942070D2B9B8BBB22609C8395C23D7482C31B69B0F555B7C079D3DEFAA5FB302ED92619C058ADF334E845EB1C6EDD903C0DE2AEDD3D9830943F8BCC5954B65DF37C901A17EF13FA75B0F2C8C1D2E38681874AEBFE90B463F2CC7831958FDC0DE0446991EB3C3612CC00188DFC1078FE458D2E5B80EFA7BFCE800C6B4CA0E570FA5858859633551DA28F36F1FF418A9B7AD18AA89B4612F9D676D5FD98BCE6F144CD7458CA9F2BC732A36A4D186EA290A009A870DA3C1F60617D56EA7554062367121F3E5E569503AA573B172C6278DDE5AA4CCDA79D9D8FAF41C6C9040C1D1D3CB78B41FFA8A0180395439F0D1B72E42471A9100973AB3BC7AEC559D94D2D6402374BA5A584DE168395A156324E1E4149ABD35C72AE0F79863CB59EE6BA22145E36E0D85D3CAF8A427D38C96CE489CD0AEA20D7960608C074CE3CD0494B6D6D5EC8895F0F03CE78982AD8FD6784BCF16825286C51325662F34726BA66D3A91EEB598124D6755DA090EF863FA31CCD5B08909A3279A35CFDCE24D2BA16F42AD280B029A0E27137A671C862B0E6F73FF4A1DE320C4DAFFB5CD4AC3522EF1C10E8A918005535F355CE6366B43A757938594366831DBF7EE72F311BE4953EDD1EA1C598960745D3DBB7F1E2D882CC063BC0791D18C6376A8497F2F91389A13AA96DAB78FECA081D761479848A5B4CC2E3D015F343B9000583E95E785A45A06842D7C6C0FE9AC4D70F085503D7AC954516953C497635AC8B7698BB784F73FE6E7F9D0AB9473E828168DF4EC142CC1FE18FA067525915ADF0764E44292A0316EF3C0A443683C92C4661409589EABD7B4DBD43F54317AE0E3D1C69C35A7868991FA0BC2F83430D89821B91A08DDC2D314A717F5BC6F3D89DAF163AF73E10C61630139E3FEDA723FEB2EDFFE6C7F364FBA22E6AAB75E267065B5E7575946C56265743816B2CF12A106AE21921E3E92BFB7FF80E105468F8409D6698E8660B5B05F3F4BB19A0BD4BE3569D24F51795752BE74C429AECA5BE737DE8C01 + +count = 40 +seed = 41CC9DB2E90239AB5158A2628E7478D0B3512FDF84CD27A4CA5FE3119A455C22045F198C3C5C39F491FB975BD1CFF7F8 +mlen = 1353 +msg = AE2638D944822298959F47B2173DE7D1E58AAA622296AD4A4CB67EC7EAD8220AC2F171605BA2D08AF3D6FF5849566EAF96209E9E00CC28EB9A517CF5061545AAD24CCE143A2EE1AB7CFA259AD9C01860B33B0036F2CB3A5086861212F408C5F055D226CCC77CC884452B2670D89548EC1C6E98FB311DF03979CABF725E78956AF185447287BCA2517F554E9F25E19D93790318EFC5D2602FABF262E5C7FC307E5A991E0122E332A803AC4A91B318B30D79394248521190D2BE326037A89FE918D139F763DC8DAA2C3BBCE53F04809F0D97303F2F1B88B572B3086ACAF38EEF36B4C0791B4918204B0E1E923BCE9E3BB1E7BAA07135B176E266AF174D5DF26C44842CEAC4AE4C1CFF05557DA3DB8651261BE78D766699B1891CB825FA9A418C45BB9F7F2D347F3F92F9529CA6DB94E2FFCC69337FB3690F556C5A44CBBD9D79F60AFF063DE68B14BD2F4B7E8CDF94F6C2F40219D27F71E8AB3D4D6872A5D4B82EAF8E3943A6D425ED04FBC5C7596AE929AD680B245E3D6A7C5CCD7FDFA1D14EF0F72B9BAAEF05B7B84ADC02913DDBC76D5FE80DE30527FFAD1825CCBA34F8587C5B0291471D6957AD99C5FBCF3669B4AE5930C8AF68305C2D3E84E714CB9049A9560A3C94AEB95A252F69B68F755DC0E0AAB52DD054B670A275BD2BAD7FF8EC0CDE6224E9A0EB537E95DAB992C382D6B03FA045DA402CE7C5B55138FB400D9E86AFE30923AFEE82C4528D1B38CE16D33BEB47A96C18428D919BA98C9782806D6F4A40B52F7F0989337C724BE24E9A5430CFEA470D02EA36CA479FAEAD94A74049898D1F1BE53D5AB8CC0CDD5438A7C55827131DE264AECD18E5F5F2F9FD60E8D2D6F55BEB27EB77AEEAC2A15432A5F1467483BE6073243D0165A6C242FE1BD7B7AA701A0827F286ECB51E4C2626DCBE95466BC94A7E2A09AB334FEE3959CA31974B6286E2A2051653341623CF3ACA65637DF657280B6025DB0C0377EC09E6E32010F0F59711A30496695D23728319DFD0AB5F3AA69025276E68808130659D912A53693584188E310B1CACC41AF4B19FAD8DA95D4B35E2569053F553A9DFCBB8FDEE1455DFA0E4F5E94324C86A24288AE27F3576AE15FBC8BED49BFD8521D77A61FB523BADF0E3CEE53799016C6EE4E1E5DEFC19C7717A5C41ED8FA6BF0E5811BAEA76676DE03767A607735C2A48BEDE511012EAF1F79E4D2C3566042FF2C63BB82FBB399CE20E1F268D3844BB473AD7366EF86D064C5BA080FC0C01BDD2AD343C5367D80D2A058CF40725268CD34123C219D9109780335611B008EE3F8848EA9D174D7B96BD2FD9A04FA2B550DCF0B301D64C0764299D317DCD0CA05718A1AC008D86FEA330095E81567E83BDE31A0D635098D7B86176CE6CC4025E8628C73B394D9A45B09B64BFD3A424162B16E1ADAA1AB60006847C6D5CA5733237A330147CFE6B9170D7B88834BB79F1FDDEFCC0EBB1D4FEF326E28C41C919607BF12AD112807BF8582933DDB096F1F3E2BCD6BCBD844DA317CEA2A7688A5FBBA14D84C537814EC2B171ADE28ACF83EA481631B968C26F8D2BF2C5AF7D61A93378E1E23FC756E2F0EE79199475AB4BA1FBC55D9ADC2B05888B2910049BCA98DEFEFE96CDCB67CA9D4AA5BBFC6CA0ECBB78BF29035D158DE2A1708D98BEB85C70AD1C64B39B387516073E2FE85BD9EFA25CB048C224E0EF76547DCA67FD66485A97EB5E56C06C78FFA08EC1C9C6F2380912A2585CBCBA2CD702CD2B51022F63EC920412989BD743A8A8BEB07241E3E8EB38CA14CD400C83DBFA6FC8E04F58529007A1477E9613291AF877692E4CA9AE118A1902AE7B4AE7DC2E992A6495CD19DF32CE64131A8D8C41969A8BAE1D870DD5F1360BA9278D5B76E746FAF99D526199E87A4B1D3A5C48A33989F103CFB2 +pk = E02DFEC5974412309FEFB75A520A2B583DA96D550719396AA7A699FB87AB7EAAB2716B134DDDE77934977990774AA24D614D7E18403F78FD4FD56DE67BF50F00FA21337F8F263D0108B9C1F1095DF58DE8CB8BD754A11901FF0E5A2EB4387A2D98BE0358252E7FF1A404DBC387D78187C563E007E5A0D488D56FC00B5CE9160004 +sk = E02DFEC5974412309FEFB75A520A2B583DA96D550719396AA7A699FB87AB7EAAB2716B134DDDE77934977990774AA24D614D7E18403F78FD4FD56DE67BF50F00FA21337F8F263D0108B9C1F1095DF58DE8CB8BD754A11901FF0E5A2EB4387A2D98BE0358252E7FF1A404DBC387D78187C563E007E5A0D488D56FC00B5CE9160004A3D16789F8055CC8EF43903862419A86A5665A5D9F28A9B9E8E97B737CE010E3E800000000000000000000000000000000000000000000000000000000000000060A496A3BDC280922EF44F311340303AA190BF369BCF5CFA205BC20052822FC66FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19FA242EEEEF5223038C95759A82D8EB4556021A0C6730F0DDF26859CC340E364DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001BBBCCB8171A3CE2CAA21D72C78DD91C93491CE8B002780051C4CF30175D4AFE85348ACBF342F8ADDB259C116F7EE0E7C86B1B66404ADF626A7340B6C3DE0DE98E374DFDA3E1E21052A7E7E2D1C6C3F31BD5F8F0607F6D31A23A4DCF63CD388CCFA01902D5C346BD31BDD4E0CFAE1F8D753A7BE239A28B949111CA8AE20E8C01E3EE8B871C2A9112E085E67B7BC2DD701A77715AFBA0105AF60245106FF3D016B4911D266084734E74B86120B3B662C43D524B9CB215623EA35A700501F7D5E3A22A51120F1652430FC85C5F993BF83D06496E28BB2C6EB3F394D5CB1C333894F77E14FBD6A3BE313C5B636430169ED9F030002F07804B4CF2358209 +smlen = 1645 +sm = 6D80FEA2A2266D00DEA04F6F697E2CECE8C3F85ED458A044B53CA205B76BC532FF0D6600E99CEED67C68E6C13F878990A33C99A420D5B4EE142297E5E7468001D259073D9E685BFF1CB1B946C0DA55E8477235C823FBB7F23507246F876D86B973E530138D91CA6F78EDAA6C27C243C7B13C6268E06FC1C64B1BDF65C09D540000003BC85F978142E094637765766C49AF0F98E27D11DE2A70F6FF96A3CF1A5D357E2F8C5E37E7BBF8B0E1936072B6570E4F191EB208B5DBC964216D2454E24447178CE79FDFCAD0A6CFC94F6E53D579CBDD5A70097959D6D82AE1BF5B6F09EF512F2D490BD5866245AC634E7131512DE35E959BAFA7FE302139EE0CE26E41F8D8194DBF2936D04A56CF8233E16B119372F97717AAAF753A2C3725A6B9D26E9879000B04AE2638D944822298959F47B2173DE7D1E58AAA622296AD4A4CB67EC7EAD8220AC2F171605BA2D08AF3D6FF5849566EAF96209E9E00CC28EB9A517CF5061545AAD24CCE143A2EE1AB7CFA259AD9C01860B33B0036F2CB3A5086861212F408C5F055D226CCC77CC884452B2670D89548EC1C6E98FB311DF03979CABF725E78956AF185447287BCA2517F554E9F25E19D93790318EFC5D2602FABF262E5C7FC307E5A991E0122E332A803AC4A91B318B30D79394248521190D2BE326037A89FE918D139F763DC8DAA2C3BBCE53F04809F0D97303F2F1B88B572B3086ACAF38EEF36B4C0791B4918204B0E1E923BCE9E3BB1E7BAA07135B176E266AF174D5DF26C44842CEAC4AE4C1CFF05557DA3DB8651261BE78D766699B1891CB825FA9A418C45BB9F7F2D347F3F92F9529CA6DB94E2FFCC69337FB3690F556C5A44CBBD9D79F60AFF063DE68B14BD2F4B7E8CDF94F6C2F40219D27F71E8AB3D4D6872A5D4B82EAF8E3943A6D425ED04FBC5C7596AE929AD680B245E3D6A7C5CCD7FDFA1D14EF0F72B9BAAEF05B7B84ADC02913DDBC76D5FE80DE30527FFAD1825CCBA34F8587C5B0291471D6957AD99C5FBCF3669B4AE5930C8AF68305C2D3E84E714CB9049A9560A3C94AEB95A252F69B68F755DC0E0AAB52DD054B670A275BD2BAD7FF8EC0CDE6224E9A0EB537E95DAB992C382D6B03FA045DA402CE7C5B55138FB400D9E86AFE30923AFEE82C4528D1B38CE16D33BEB47A96C18428D919BA98C9782806D6F4A40B52F7F0989337C724BE24E9A5430CFEA470D02EA36CA479FAEAD94A74049898D1F1BE53D5AB8CC0CDD5438A7C55827131DE264AECD18E5F5F2F9FD60E8D2D6F55BEB27EB77AEEAC2A15432A5F1467483BE6073243D0165A6C242FE1BD7B7AA701A0827F286ECB51E4C2626DCBE95466BC94A7E2A09AB334FEE3959CA31974B6286E2A2051653341623CF3ACA65637DF657280B6025DB0C0377EC09E6E32010F0F59711A30496695D23728319DFD0AB5F3AA69025276E68808130659D912A53693584188E310B1CACC41AF4B19FAD8DA95D4B35E2569053F553A9DFCBB8FDEE1455DFA0E4F5E94324C86A24288AE27F3576AE15FBC8BED49BFD8521D77A61FB523BADF0E3CEE53799016C6EE4E1E5DEFC19C7717A5C41ED8FA6BF0E5811BAEA76676DE03767A607735C2A48BEDE511012EAF1F79E4D2C3566042FF2C63BB82FBB399CE20E1F268D3844BB473AD7366EF86D064C5BA080FC0C01BDD2AD343C5367D80D2A058CF40725268CD34123C219D9109780335611B008EE3F8848EA9D174D7B96BD2FD9A04FA2B550DCF0B301D64C0764299D317DCD0CA05718A1AC008D86FEA330095E81567E83BDE31A0D635098D7B86176CE6CC4025E8628C73B394D9A45B09B64BFD3A424162B16E1ADAA1AB60006847C6D5CA5733237A330147CFE6B9170D7B88834BB79F1FDDEFCC0EBB1D4FEF326E28C41C919607BF12AD112807BF8582933DDB096F1F3E2BCD6BCBD844DA317CEA2A7688A5FBBA14D84C537814EC2B171ADE28ACF83EA481631B968C26F8D2BF2C5AF7D61A93378E1E23FC756E2F0EE79199475AB4BA1FBC55D9ADC2B05888B2910049BCA98DEFEFE96CDCB67CA9D4AA5BBFC6CA0ECBB78BF29035D158DE2A1708D98BEB85C70AD1C64B39B387516073E2FE85BD9EFA25CB048C224E0EF76547DCA67FD66485A97EB5E56C06C78FFA08EC1C9C6F2380912A2585CBCBA2CD702CD2B51022F63EC920412989BD743A8A8BEB07241E3E8EB38CA14CD400C83DBFA6FC8E04F58529007A1477E9613291AF877692E4CA9AE118A1902AE7B4AE7DC2E992A6495CD19DF32CE64131A8D8C41969A8BAE1D870DD5F1360BA9278D5B76E746FAF99D526199E87A4B1D3A5C48A33989F103CFB2 + +count = 41 +seed = 1C13369824A3FDD41B1065E17297574715D9BD9CE5BB733D36D22C31B62BB1033989A604D78BFB1A0746BD4A2271FC0C +mlen = 1386 +msg = 9D84E1DD28C513987D5587A4427853762B7D7AF668FF9EC2E90211D6CF5C0DE6C7E54B298C1A6C67EA9A693CEDC4FCA1A6ADC2C6DD0E5BBCEE7266B9C6AC8FA8AF5E50078A6151F938161F1FEACDE4D8079B5A9D563423258CF3AE9E47D8E75740314F2FFA63865A8B30743F773A53E1AEDEAC45CAAE01993B75C8116FB0B431631AC001AA8BD02E5B83DE627AF0CCB3A3D86F66A7E5FB658F9226DF31095780A6E8262A247D70F4E7C971D108567FFBD7FED0E16B7FFDDD93F5764C3E02A61998C32146564D46589538B2E071AF86A26321A3523354F4F0C396B863FC8E9E2E3A173901D0D178A9D2828D0E0974B72CEDFB17937D6054F185A81D4F853787E6C3681A74FE25FAA6C256A9F9E9A9253F98B9AE4B8FA0068DC28BC7E8D5785CFAD20F7DDD643DAE6A2DDB02713C9CAFC2EB2FD18EFDECED05CC24913061BDC38E932DB5E8181FC0D3DE26A94E2138800B3C01E07E83B3B0BE187EDC75DA576AF1CC7B7122367EFFD6EBF05F4C2EEB0AB6E9F91201A4237910A87DE9FEF777981D48FBA28AB8D64D76380911F2A6621335DFA96B331AE8B3242EA1F2A260260244196B0B9596C411218A17D0A58D3B5735B9AD7B6259655CF6E2D0FE5B37D0A0B02E67951F5D3FB277B6E1EC87528B08229AB0EBD895CBA2D075A47CC8100E9DD17DE7D951BF0A68D710AAC21C8226D8CA95AC49FCBE9D493A8D3C7F93FA61685BE57FF422FAD036304F317A3DBCFEE7A4610C8C1DDAA79E37C19D6414F47230E01EF1CD5C7C2FFC319A29AE6A9C95B06C603F2CFC1D1FC914B036CDA6CF9A876946983B06123C2E5C7D09BC190647CDC0512F35DB9E214C77D3D7D0234C3F2590941236A367700F9C04D3AFB949DCA2067571BF28E78ED35FC026BD801C4AFEE9BF31C97580953950D2E81EE6426E78D6F8134ED19707473F0874367C86C9BE170BE63405A9BF7C46A420724B6CCFF9C21B015E21BB02C5A7AEABCA873B46571530DE56E47288C3424DA398517ABB6502A9A6A65D4983D97E479941C44CF0136D225991226F70837E2A7D1E9CB1226F40BF59D52C66549BF8E360096954F5875C466160A0C75A252E5FE6B8F1841FE210BF08520CE74D77B69692086EF50BB64732F19D1A49E5800F077700553290635D418168A6B9E3AE980112AFB9D58A18B94F972845C309E86FEC7E456191D8760A1C2106036E44C5C9A5F2CFBC67D741E8E937E99ED7820AB0787E39C385356EF0F05CD3E31C44115A8892224197B1D1F554D5098B72058FAD49C665F716A266CB4DB6204666E1DC07B6CFDE0EA00345661E0F94A5025D2EC98483CF482058D2EDDB018CEC11D91EB46B63971AB29367DB46137CD7690D5782E3A3DDC8CABD545FC1AAD8A9A0A39542AEC55CC3D58A5BB5E4A559DB1FCD2932EFF6E81C8B8E5AD5B4E0424A444BC55D96DF63C8971A5890310FE19DFF8ACBA72D96FD3F32D67D41A2F3D0B343489C7FDEE7556012C2D88E2BA9D512B71E7D04F92E6BE3A9386565271D755BED752C853E4539F95C3287A275004F76B9A93837C6EFC6760BE4A39B8AA92C7605AC369472FB29E11ACAD98FC91B1B9BB3505638D4D46A3AE3C10C8DC115C35725F06649BFB00BA1EF214B9F2FE98BE2DA99AB23E7B9F014F5C5D0248A9E0E088AC175C8048C6BEB5108DA59DC234E9EDFBE603BA912BEA22505C2A9EAAE766FF55AAC8392AEA5C722DF25BC6C9FCF9B0275DF71206A4E5290FC5E71D79928E357400DCB04EFD7CC9BD0B86E04BFED9BDBCE5787E40FCD6041ADDA615B5ECF03C30AB9B2809E3514E9AC87226C55F259C5F157945B0073431715E1740DCB319EDDDD1B5F2763F0439CC0D6ED5867D9D98C227CA3008F30D1B2AEA40DC73FF8289E4A21586EFF519520F888E7E2F6D29A269C12607D13D398F437CD7F0A07C94EE1E1E3D8518D0C97BE1E250D79C5AE1709AD8A638F55 +pk = 3FF992A603AF8817B8BEB8659BA63A66BA10F91D82FC959A314235E751228CB18E8BA9BAF36E0563C32B32656CF59C692BE6C7949E4C49A0B00D2C7D6D74F0002ABE74CD1063F70DC6B17DFED727A36961A531DD0D8D39B6A387C84DD21C0804BAD14F384DF266763C8949F8E521F28247F7ECBED74A2E7F37494688A4D3A3000B +sk = 3FF992A603AF8817B8BEB8659BA63A66BA10F91D82FC959A314235E751228CB18E8BA9BAF36E0563C32B32656CF59C692BE6C7949E4C49A0B00D2C7D6D74F0002ABE74CD1063F70DC6B17DFED727A36961A531DD0D8D39B6A387C84DD21C0804BAD14F384DF266763C8949F8E521F28247F7ECBED74A2E7F37494688A4D3A3000B5D1D2DE72A62C6DB94AC2ED981930686BF0193B499CED7DEE8657D5E4A7C21850C01000000000000000000000000000000000000000000000000000000000000320820AB2987C602C1F2A1EB3E8ED46A8E4EFBD68CBA56698D68EF4F9839C2714AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12B266C2592B9D8E1F63B67D5959034B8CF29B745849D31BAEBC23F5B9CE9E20EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044A2EED0CFF328D5D61CF4ECCE190AE34947C2615E2E885FFE3A85B59F00E28DADB347439C0D6637F6C0C9518FED781A08B5505F526A7987709CC0D04D420AC57C12F7E61AB6D1FF38218CFEB5D6199ED3ECD1B6532D1E729F58AECE7ACA7DA505363BF758E9958BF7003DC4F4062F282AB4457E7A5BFD822A4FA201F8030748FF4640D06F3E6295EF2AAA74600E72029C08A760B0DFB5C89DABD356BA8C05EF6297042D70209BCC21FA20C41A834D3A5EA16391143869ED2A415A920F5F95991BC5728C1E3ED865C1E060A18624121FA671618242D6FE03A1E539AF0A059BE0A7E6AFA9A1CB901A8DD4F1CE3BFA63F4D4E4B776364DBE530CAA9E0D +smlen = 1678 +sm = F36E8DECED0DD3E382B489FE4B2E4B4AE2ECBE0F3C771546DA44B34BB01090A34936BC6A1B8622B9F44010C05AFE209D90E92E5725ECB1EBBDC324CB1B6F9801F51B40B8851B915FC994292E91030AC205557FDB0EB52EF8997D615EDC764FFCF039582BFDE296D0CDEAED192DA763DA06FD6CE6D7ADF82C1231DDE12B760C000001FE746AA28C740A1DCD36AF3964F955BB835A4220D85A083751FD11B672E2E739CD78F5EA70DA84696849F57AD5067684E26B05DD76C63382B5BE0B7BD0EC1A42E6D1B3BA83D73C7BC50974F97D9043113265EF2A1AFA18E561B6712E7D0E137798D0434094EF2DC484D6A5D6419033C9EB8AA5B38CED1977316E870D9412A55544355909B134183B831B5EF94D7A9C76BAE09CA65B668EC548A6317F83B96F0009049D84E1DD28C513987D5587A4427853762B7D7AF668FF9EC2E90211D6CF5C0DE6C7E54B298C1A6C67EA9A693CEDC4FCA1A6ADC2C6DD0E5BBCEE7266B9C6AC8FA8AF5E50078A6151F938161F1FEACDE4D8079B5A9D563423258CF3AE9E47D8E75740314F2FFA63865A8B30743F773A53E1AEDEAC45CAAE01993B75C8116FB0B431631AC001AA8BD02E5B83DE627AF0CCB3A3D86F66A7E5FB658F9226DF31095780A6E8262A247D70F4E7C971D108567FFBD7FED0E16B7FFDDD93F5764C3E02A61998C32146564D46589538B2E071AF86A26321A3523354F4F0C396B863FC8E9E2E3A173901D0D178A9D2828D0E0974B72CEDFB17937D6054F185A81D4F853787E6C3681A74FE25FAA6C256A9F9E9A9253F98B9AE4B8FA0068DC28BC7E8D5785CFAD20F7DDD643DAE6A2DDB02713C9CAFC2EB2FD18EFDECED05CC24913061BDC38E932DB5E8181FC0D3DE26A94E2138800B3C01E07E83B3B0BE187EDC75DA576AF1CC7B7122367EFFD6EBF05F4C2EEB0AB6E9F91201A4237910A87DE9FEF777981D48FBA28AB8D64D76380911F2A6621335DFA96B331AE8B3242EA1F2A260260244196B0B9596C411218A17D0A58D3B5735B9AD7B6259655CF6E2D0FE5B37D0A0B02E67951F5D3FB277B6E1EC87528B08229AB0EBD895CBA2D075A47CC8100E9DD17DE7D951BF0A68D710AAC21C8226D8CA95AC49FCBE9D493A8D3C7F93FA61685BE57FF422FAD036304F317A3DBCFEE7A4610C8C1DDAA79E37C19D6414F47230E01EF1CD5C7C2FFC319A29AE6A9C95B06C603F2CFC1D1FC914B036CDA6CF9A876946983B06123C2E5C7D09BC190647CDC0512F35DB9E214C77D3D7D0234C3F2590941236A367700F9C04D3AFB949DCA2067571BF28E78ED35FC026BD801C4AFEE9BF31C97580953950D2E81EE6426E78D6F8134ED19707473F0874367C86C9BE170BE63405A9BF7C46A420724B6CCFF9C21B015E21BB02C5A7AEABCA873B46571530DE56E47288C3424DA398517ABB6502A9A6A65D4983D97E479941C44CF0136D225991226F70837E2A7D1E9CB1226F40BF59D52C66549BF8E360096954F5875C466160A0C75A252E5FE6B8F1841FE210BF08520CE74D77B69692086EF50BB64732F19D1A49E5800F077700553290635D418168A6B9E3AE980112AFB9D58A18B94F972845C309E86FEC7E456191D8760A1C2106036E44C5C9A5F2CFBC67D741E8E937E99ED7820AB0787E39C385356EF0F05CD3E31C44115A8892224197B1D1F554D5098B72058FAD49C665F716A266CB4DB6204666E1DC07B6CFDE0EA00345661E0F94A5025D2EC98483CF482058D2EDDB018CEC11D91EB46B63971AB29367DB46137CD7690D5782E3A3DDC8CABD545FC1AAD8A9A0A39542AEC55CC3D58A5BB5E4A559DB1FCD2932EFF6E81C8B8E5AD5B4E0424A444BC55D96DF63C8971A5890310FE19DFF8ACBA72D96FD3F32D67D41A2F3D0B343489C7FDEE7556012C2D88E2BA9D512B71E7D04F92E6BE3A9386565271D755BED752C853E4539F95C3287A275004F76B9A93837C6EFC6760BE4A39B8AA92C7605AC369472FB29E11ACAD98FC91B1B9BB3505638D4D46A3AE3C10C8DC115C35725F06649BFB00BA1EF214B9F2FE98BE2DA99AB23E7B9F014F5C5D0248A9E0E088AC175C8048C6BEB5108DA59DC234E9EDFBE603BA912BEA22505C2A9EAAE766FF55AAC8392AEA5C722DF25BC6C9FCF9B0275DF71206A4E5290FC5E71D79928E357400DCB04EFD7CC9BD0B86E04BFED9BDBCE5787E40FCD6041ADDA615B5ECF03C30AB9B2809E3514E9AC87226C55F259C5F157945B0073431715E1740DCB319EDDDD1B5F2763F0439CC0D6ED5867D9D98C227CA3008F30D1B2AEA40DC73FF8289E4A21586EFF519520F888E7E2F6D29A269C12607D13D398F437CD7F0A07C94EE1E1E3D8518D0C97BE1E250D79C5AE1709AD8A638F55 + +count = 42 +seed = 7AD6C7DF00C9E52A75290D28DA946305D83CCF6DE2515C19A8E26850C34C8C2E545E2E32108F13B9C97F87AB68D10131 +mlen = 1419 +msg = AF2860129C08A1A9C7A7BB3120B3E40AFA1A4A09050C8483E7511FABF3285544D4CE3F41401DAB8C17DA547F6777A72519F6EEAAC83016FA0E0FB0B33329DD02AB8EB1F291758074EBB5B7C4C102B75BA422821E6755B37B914D689D84808A89CF88F69A446F489A260BA03CA52A4AA14E8BCF4BFE5134DD2918A88D67329B9BADC6ADA4A3071FD21CFC45235FA0A1B82D91C5877F10AE087464251C8899732AA7FC8F6C0A5BEAF4FA41E64CA97932925A06E218272500249577705804C6DD9F0F61DEE6AAE096BE0AE5E67923137933FE4D61E9A88DFD5B3BD75AEEAF5018A5153985E2837AD1AAD5EED91620D935EB9982DD2364B5413F490BF251FC783503FA146300E6ADAE0682E0597C3839C645DBE855919BB1CB80C3DC6E233909017BB31F5ADAEE05CE442EEF594FC15FEC3A2B4B81ECAAD1340B0677F27009290AB3AB8788556389047F63C2CE9390658E151CA85BAAE45ED2FE12B6667967F6B772EE683AC2E7347C7B0EFA332B3354B5043CB86200F8E4249F68030844D00A86FAA7B79A4129AD676D1E9D58828A1AF4C6BD68C29CC23002E0A0313500BA717B8756D4A18E41E381DF8D7A999A153876DB876CA4A508486A4F331CAC9CB3E7C416C6329713CAB76E1C8B63A8CAD46F8EB1E65116F89A3B4EB8FAA14A73097CA71AEA3220BE7FB7FE64919893930445D962C309E23332E4B3ED8CA768EF0ED46EAAB199827AD628A1BC20CCD9F61BEF67F7FCB017300EBC7493A7CCDAEDBFCA5F91E80B80DECBFD9EAD9BF22FE16B563512C7383D34801C504202D7A0E19821EC8495016362EDAC165904D2BBAC484DE1D4112C3A3E6EA56A78785B7CAF2A44B5BC8BECBC50BF4B521C1D086086FEB009C06ACB8FA0F53E7654FB02AD7898E35E5F3A7DCFC50124BA1F30178C707F4D36E4E7758C4CF82747753CC30A836311794A6A9017F53ABD17A1C9647AB38BA56AAC83C1812DEE8A5A75C5CC958780A3E9C3C1F39729BD365948F7FCD8104CF09660060FBAD2BE9B8D8E5BDD22286EB0BFD4010681AE7928D0FC008E21C8F877D97B5B9C7A06C02530FBC6A9D6FCEDFEDF68A9682177757CDDDFFA6CB9086B8330E61851E2761D84DA37635EA8441E3B23FD165CCEA562B0A3616B30EE5FAE00F76D6801B22F2215D80829E01DB2C0743E3074CF26C96B0EDDF97D79FB9C7FFE9B5CDB891F9E61FEFE7E1CBD28FE25B7858921C8C99C45A84B50A8233037DACC20BEEEBB9B22089DDAF2EBF0698498DA694F75ED2463D09BA2C757A986B8CA556CDF46CBCDF288C078041D497242F66411F47F35A21918855F105F24686076FA21BC1283F17245A7122A848B4BC10D996B2C5161FCE0336B2EC747A4A07FA9851AC5423D1EFC4B524E795B2E4BFFD1C5CD21F5FEC954824DCC53BC3883A7F571A9323DFDD2682C4A4C54E8862F347C9A8897779170B257AD26D90121DDE722A3F214A44CF6C5A5DDB2452A2471EBE7FC8D0EF7F1EDC7920CB42A71E4DB49A0168D51843F47D17BADE50DCB340E5F7B7E5B6A6C3AFE0FB26B5EA172A4011EEE838E5634E521483C6EDBE9994B0658406ED8F4998C7B4E869845CD16CC4368DA3BC1B025A6FFAFBF540133C372D452DD831DCAD39D61CCED0A0AD193FA9886EAC749001E3BEAD5A7962275FC62298A1BD054F4BD97ACAB2BBFDC355C73509D98B6DE5B4CD774BDCAF1398532BB3DB56524CC047ABDE6880C3B282FCE0FB2AD7E4C5F7BC138B48D194E8C8036DF4B9F3949E912AFE5D2734662F27583193D0FBA2B73C1A0D012DB853BBBE4383F6C391F3220E1B5761C337A054FC9FDF09C01864B87324A90C776EFBF5D34A68DEE38EBAACCBB61B4C79A58CC848184F605D43CF9D40BE90C1FBCF6735270132B59A636B16ED28111246270AF32EA2CB7A42A084005AEBB6161002E65B37217361BC269F5ED12F7D50613C82934A6D1D98D1308AC82827B7504F3FD351E0ACA1C62843C9219023FD092692BA4B83BE198EA +pk = 4CBAC9B9239BB5F676CCC50A484D38FF958C70EEEFEB340FA0E8865A5D092DFFE639C6FD08BF46DF98072DBE6522E566BFF3DE6C939BD910D56B61CAFEBDFE00720AC7512B1224C3D338EDC5CBF2746DE2CA1F5F5ACB421BF36ADF283F9F44E7AB6E98B71056E7B6E4722187F8CD50EC7FF5328979598741BED583877AA7FB000B +sk = 4CBAC9B9239BB5F676CCC50A484D38FF958C70EEEFEB340FA0E8865A5D092DFFE639C6FD08BF46DF98072DBE6522E566BFF3DE6C939BD910D56B61CAFEBDFE00720AC7512B1224C3D338EDC5CBF2746DE2CA1F5F5ACB421BF36ADF283F9F44E7AB6E98B71056E7B6E4722187F8CD50EC7FF5328979598741BED583877AA7FB000B97F9440A990A60EED6EC0543FB9005FE427A167935EE3CB8F8B1A2A79CD74C9C440900000000000000000000000000000000000000000000000000000000000032AAC359165228FA2974AAAD715CC776CD375665F3BC7BE4414C1333E8316575E7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF695E59BEF1B24EB8D21A209EB5EC2440C740EA841FD505F2298FFB683B8461BD2EFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EA059DC4DB9E0B1A8EDBCDCD62D0162FDFA777D3A7D3D3373D8F4A14FAED21D50E029D06107812A089521C8A4B8F87DB3C3636A9CEFEB739BEB5712E362302AFF0FB2BDF859324C13CA4F1C03A031F326A1D326DDDC4D7762D63861C2CA6494CBD8070492FC9410EFCEB072B9AB3D792B500E5F39B3F3D7FA04A6DC9670E154230212E39F60EA265779AE564AFE2E9E8DEEAC10C79BF6AE38992F11492C825EA57ED7DC58DE4DA93E86D3FF9BE60F3F59E3E01621BAE92F082BB2D4E09EAB104D239078ECC8AA38911607393A3479E41C57A5D7FB26EE76AB7751DBE9B5D3E0E0C635C278046D5C6FC1E8298BC2826089D149A70C018CE0E79637F0D +smlen = 1711 +sm = 3178E7C039AEF65F2449BD7ADB0619C0F7A3314F0FB65F43E11CACBF725D518002DD0E099F2D35BB6C9CAA6973662D6D920969B85BD8F7A25A45074CA2208201F20DA95D1FDB57597DB0A9710DD79397BAC3901D97B97F26107F531B47E6A79D0436039EABAF1FDFF26835F9239F1F38B9ACEA44D5BDC98DB2F0B66A2292F3000001F8CC428A0365AC57AC4679C2830B6DF2CFFBC52010A6E0808462D0A052334866A97B7FD7C5BFA15CE805EA2A7484B38A3966BBDEF83B4FA003BC42BE2F84A74C5AC02EA141A61E0F8759228452E2142CCDA0A4B3F6549E80791ABFE24AB64264F1429F70CBA9230B58FB0616D007E380FEED5C09E5C4A51D8BF2C69BD244957797C438ED853DB3E29CCF48223D22AD771DE3F894F3B3EFE7B8D8EAAA237222000B02AF2860129C08A1A9C7A7BB3120B3E40AFA1A4A09050C8483E7511FABF3285544D4CE3F41401DAB8C17DA547F6777A72519F6EEAAC83016FA0E0FB0B33329DD02AB8EB1F291758074EBB5B7C4C102B75BA422821E6755B37B914D689D84808A89CF88F69A446F489A260BA03CA52A4AA14E8BCF4BFE5134DD2918A88D67329B9BADC6ADA4A3071FD21CFC45235FA0A1B82D91C5877F10AE087464251C8899732AA7FC8F6C0A5BEAF4FA41E64CA97932925A06E218272500249577705804C6DD9F0F61DEE6AAE096BE0AE5E67923137933FE4D61E9A88DFD5B3BD75AEEAF5018A5153985E2837AD1AAD5EED91620D935EB9982DD2364B5413F490BF251FC783503FA146300E6ADAE0682E0597C3839C645DBE855919BB1CB80C3DC6E233909017BB31F5ADAEE05CE442EEF594FC15FEC3A2B4B81ECAAD1340B0677F27009290AB3AB8788556389047F63C2CE9390658E151CA85BAAE45ED2FE12B6667967F6B772EE683AC2E7347C7B0EFA332B3354B5043CB86200F8E4249F68030844D00A86FAA7B79A4129AD676D1E9D58828A1AF4C6BD68C29CC23002E0A0313500BA717B8756D4A18E41E381DF8D7A999A153876DB876CA4A508486A4F331CAC9CB3E7C416C6329713CAB76E1C8B63A8CAD46F8EB1E65116F89A3B4EB8FAA14A73097CA71AEA3220BE7FB7FE64919893930445D962C309E23332E4B3ED8CA768EF0ED46EAAB199827AD628A1BC20CCD9F61BEF67F7FCB017300EBC7493A7CCDAEDBFCA5F91E80B80DECBFD9EAD9BF22FE16B563512C7383D34801C504202D7A0E19821EC8495016362EDAC165904D2BBAC484DE1D4112C3A3E6EA56A78785B7CAF2A44B5BC8BECBC50BF4B521C1D086086FEB009C06ACB8FA0F53E7654FB02AD7898E35E5F3A7DCFC50124BA1F30178C707F4D36E4E7758C4CF82747753CC30A836311794A6A9017F53ABD17A1C9647AB38BA56AAC83C1812DEE8A5A75C5CC958780A3E9C3C1F39729BD365948F7FCD8104CF09660060FBAD2BE9B8D8E5BDD22286EB0BFD4010681AE7928D0FC008E21C8F877D97B5B9C7A06C02530FBC6A9D6FCEDFEDF68A9682177757CDDDFFA6CB9086B8330E61851E2761D84DA37635EA8441E3B23FD165CCEA562B0A3616B30EE5FAE00F76D6801B22F2215D80829E01DB2C0743E3074CF26C96B0EDDF97D79FB9C7FFE9B5CDB891F9E61FEFE7E1CBD28FE25B7858921C8C99C45A84B50A8233037DACC20BEEEBB9B22089DDAF2EBF0698498DA694F75ED2463D09BA2C757A986B8CA556CDF46CBCDF288C078041D497242F66411F47F35A21918855F105F24686076FA21BC1283F17245A7122A848B4BC10D996B2C5161FCE0336B2EC747A4A07FA9851AC5423D1EFC4B524E795B2E4BFFD1C5CD21F5FEC954824DCC53BC3883A7F571A9323DFDD2682C4A4C54E8862F347C9A8897779170B257AD26D90121DDE722A3F214A44CF6C5A5DDB2452A2471EBE7FC8D0EF7F1EDC7920CB42A71E4DB49A0168D51843F47D17BADE50DCB340E5F7B7E5B6A6C3AFE0FB26B5EA172A4011EEE838E5634E521483C6EDBE9994B0658406ED8F4998C7B4E869845CD16CC4368DA3BC1B025A6FFAFBF540133C372D452DD831DCAD39D61CCED0A0AD193FA9886EAC749001E3BEAD5A7962275FC62298A1BD054F4BD97ACAB2BBFDC355C73509D98B6DE5B4CD774BDCAF1398532BB3DB56524CC047ABDE6880C3B282FCE0FB2AD7E4C5F7BC138B48D194E8C8036DF4B9F3949E912AFE5D2734662F27583193D0FBA2B73C1A0D012DB853BBBE4383F6C391F3220E1B5761C337A054FC9FDF09C01864B87324A90C776EFBF5D34A68DEE38EBAACCBB61B4C79A58CC848184F605D43CF9D40BE90C1FBCF6735270132B59A636B16ED28111246270AF32EA2CB7A42A084005AEBB6161002E65B37217361BC269F5ED12F7D50613C82934A6D1D98D1308AC82827B7504F3FD351E0ACA1C62843C9219023FD092692BA4B83BE198EA + +count = 43 +seed = 38FFDE9B60DEDB5BBFAD6C52AA02EF6D49369BF276C99E588D796A4F260E0FF0A65C96C35863BAACFFD9B212EC305E7F +mlen = 1452 +msg = ECA4505D43235F274D902464F4E763312BD11060F908621A063409EB42FAA6BB5E20FACD87B8FF41767C20F69B1F7E05D5F3A957F48DEA57DCC91824FA48DA6DDBDE7E3327A0A8D46A47606EDA01E67CEA1F29BDC5FBA446DE60541DBED6F73D1FC5F49BD77D45285D3D8CA93F6DF25AEEF9324BEDB40E800ACB49794AB05E6D0AEB11A5994FBA36DABB9559CD93CF522174061C116CF31874A18C46689FB8C075079DFAF73EA0EA7FAADD47AD8EF68C06AF9738B41BE771020FEDB79CA3D0165427B58E547105FCF82A12B67579D1D3AAB29968817068732CDBC5A2E9E8D55D17468D03F38D564F5AC6EFE1538E4A680E9E15E35AB54D07B6B58EC9EA7815CCF29F4F880CBF1946F39556BDC2BBC78A5134FA7A086DDC146AD9D503A4CA837E0823BF0728453F6B053788C69EFF8D11ACDF5F07282A75CBD17F2AED58E39D862FF056DF17178625234CA7E03D22AAAFC4C07E3FB08F4297B511B10579934D2761FBB600C9454AC05FFF80CFB93DE3B9E0DDD0AB1E494DE477DA2B5635E48D5BED5CE359E66A3AC845826BE2B4BBFA6D825373BB2A4E93AA417648D1CEA755AA4978784D6D9489F6738B4DA03FAEDC659408D9395C934AF774749A498B1406522351F86838865F53CB0157247484FD37EA59BA72FF3226AFF1EEE353ABD34DDD63FCC89387B947027E04A6F4ECCA1EE5F6BD1CA758AA4F796FE839338164B58D8E5D71E6D5CDEEF6B279EF15A7BAD873B12F7C5B3E2817C37BF00802D2534D425D52D0BD5935BF8658E5BD39B5268CC45D0F27CEE5A57300F497E77AF5268970782030E6928281379CB14BB56D2ACD963D189C078C7A60E98A782F9483ECE7B4871A061277186A01E878087381704BD72C63C32CBF2470A561C22A5DD3A1988B7ED0D274182E1B075AF277920B362D612DC7ED82057EBFE51A3CA5A9A9A45DE015C460BE6A48CF67C820813048A1CEA0FC3D7307F802B4FB7E523E7C8555FA56DCF66237F176D3D973C47F55AF93FC4BC92B98B7DE89829B1471DFF53B649CB03B719DB58DAF824DAA2DE570DF6314DCAF5B705557F9D783559277A754F3CD5B783D5A577EBE4A065D320284B01F71540F1986BCD443CF4FD480DBE06EF7710387CB5185DEACB5C2A612BCA275950B8988F247C4B773D8983D87F47D60F5BF80E6E7BAEDEB14B5FFBC46893A81C63F99F511D3E24FA8F7B1BA66A7DB0C1D9ACC6B5010AD725BDC2282D8A24018C975C8B12ED3326F48194D4FF93EBF051204CD224EA39F27D63FE07CFD0162358B412DBFD4715AD049EE5A31638D3111AF2DB7952F3A973646612712A607EA35826249D14CBDE4380D8BC986067B1CC27503449FB128767986A406585C3D40DACA75C27BD36117D2487BAE82CF639ED1FA016ADD279D109B8CDAE59EB31E1F006CB7AF000A267E8582E55375CF6F06D1A47BE9BFA21C8428045B9DF96808AD74D054820A4D0873257EB318A3DC9B6D9585D973E26D435345B4D699A952C3092EEDDD975FB59474212080D03EC489C695F19CBA4D1CAB1AE8D2E2C730B06E657D33722D24222FF7B613B6E8608E8A6003E11C80239FF431B5D8FA52B84B867A581798833590524C7B84EAF6CDA9CA94C5AB8EF55A1262EEC5C37467807C89FF7D075606A3902E7247E9C6646839C18493584D33DB65D6DFC0F23E68C9D13FD57FAF4836C28926693DC3EE372DE27A9D3E4AB4229425EF48CC410F1792A51C9F6FA5316A1D9A7C99979884EF350B4882F6045921CA88D4E44B435C69C1AAC11660971C2A3F6480C79E6E146C0B5CD2371BF5E7486AD7D0BE88D62A2AE8F0D73C17CBAC86FF6BDA55A880B182A5237498E9CB343A9CD82D7784B72473D222E688D13CB81B2908BBA854B9624A11DBE8CEE9C3825C1BFBA476B4D23D0B0C325F1C498A65A3589EA8E8DF8DD9030B279EDE30443CF80367CEEA4A122DC8329E5AD42491CF57EF47AE2B15F9C54120966B95ACD727A4A2B686B00626BC808F43D82D20DEEBCA79B074A7BFF38D2531AB2F726AC7087236EB3FB4BEC8A2D4207DC84C +pk = 8AFBB181D58AC7607FD69A05B578CBC46C9BB1BE947801F4B08652554D94F6E75B0FFCD81776D06E3FB656957258E199BC6D7EA2D35CC11A2F0B112AA0EE2401EE276635D65CCD7F6F62E24D660A1CEE0B7AD3C0DEF48B0F6C3533CE53DE5FA91CCA80DCA63982F7C382085EBE06CE96B676BAA3BB34FC3D37B4A79B420DB90009 +sk = 8AFBB181D58AC7607FD69A05B578CBC46C9BB1BE947801F4B08652554D94F6E75B0FFCD81776D06E3FB656957258E199BC6D7EA2D35CC11A2F0B112AA0EE2401EE276635D65CCD7F6F62E24D660A1CEE0B7AD3C0DEF48B0F6C3533CE53DE5FA91CCA80DCA63982F7C382085EBE06CE96B676BAA3BB34FC3D37B4A79B420DB9000921D86BE1CE7EDF7D22686D9E2B123592FA5E1A5772874DC800E5B79E5D4AFDA3C800000000000000000000000000000000000000000000000000000000000000383CDEDFE18F04783F07BBB1C17689E7C92AA8B35A9ED9D21B04FBAC531DCEF5CFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6B65F952ABB6375A81AD6B403DA9D67690C6683412556327538C15FCE25F5DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E9672106085B7AAF2BF41A97D468161A64D8F6041F2A15E726B1BA2D2A84EC209AB8FE0AE51B30697980D6E03703AFC4FA37F7E79CF63E8FB995E29A75402E5C8D9D87B8DB53F5A0B06A318113287C99E3B412CE3410D1550E400040A7D96419E013707239366AA4E5CA8F8428ECF2809462CF024AE999FA28FB96FE304E3EE865AF23F6D9CF41E3FBBD91FCE44FCF50529C05957764655F1EE95B1EF3AAB89AB543A8494452547E8BB0CE7F0D2E5D6213ADB68DCD854DDBE427BB805B58365BC35F213DA3DE06BF38FBA02B632D52FA5D9ED0505B283A9741F9FE78C433D308739BA44A364B261402F2EBEF0B08D0C4ADE014280539B86E8B4D401 +smlen = 1744 +sm = DD46BC5060A25AD5C5F6F35F04FF5DF807B4F0B6B348A3A1DF31939F24545F8587ED4F105217FFDA1C053514478CC4C96F9AF3147D9D955382E5FB5FC513A300B4C3E0B3C86DBF636F800D110B932F13AB77A4C519B66D4B70BC1AC98166A60A70823C54B99C41E887C2B73E1D54659D04CE7078636240F5EBE516D82CADCB0002006B7EB52EABF32CC5558F19BD409F5ADFA1AF6FFF4929161BF97B3FE2C314511374C61C8084BB6DFF7BF2164B439ADD32F792CBE2EC00A23A9F3CFA7277D2061725847FFD9AA7A390039B8C3908A0D51F84BD77A9527E1856C714236C00FE7D06ED3366AB9BD8499ADB11E6937E6925CDF2DB66BA1C74DC1C548C97DB0994EF076ACDBFE14609409A31782FFED11BA2B8FDF42C87F958988E54C8CBAF233A30000411ECA4505D43235F274D902464F4E763312BD11060F908621A063409EB42FAA6BB5E20FACD87B8FF41767C20F69B1F7E05D5F3A957F48DEA57DCC91824FA48DA6DDBDE7E3327A0A8D46A47606EDA01E67CEA1F29BDC5FBA446DE60541DBED6F73D1FC5F49BD77D45285D3D8CA93F6DF25AEEF9324BEDB40E800ACB49794AB05E6D0AEB11A5994FBA36DABB9559CD93CF522174061C116CF31874A18C46689FB8C075079DFAF73EA0EA7FAADD47AD8EF68C06AF9738B41BE771020FEDB79CA3D0165427B58E547105FCF82A12B67579D1D3AAB29968817068732CDBC5A2E9E8D55D17468D03F38D564F5AC6EFE1538E4A680E9E15E35AB54D07B6B58EC9EA7815CCF29F4F880CBF1946F39556BDC2BBC78A5134FA7A086DDC146AD9D503A4CA837E0823BF0728453F6B053788C69EFF8D11ACDF5F07282A75CBD17F2AED58E39D862FF056DF17178625234CA7E03D22AAAFC4C07E3FB08F4297B511B10579934D2761FBB600C9454AC05FFF80CFB93DE3B9E0DDD0AB1E494DE477DA2B5635E48D5BED5CE359E66A3AC845826BE2B4BBFA6D825373BB2A4E93AA417648D1CEA755AA4978784D6D9489F6738B4DA03FAEDC659408D9395C934AF774749A498B1406522351F86838865F53CB0157247484FD37EA59BA72FF3226AFF1EEE353ABD34DDD63FCC89387B947027E04A6F4ECCA1EE5F6BD1CA758AA4F796FE839338164B58D8E5D71E6D5CDEEF6B279EF15A7BAD873B12F7C5B3E2817C37BF00802D2534D425D52D0BD5935BF8658E5BD39B5268CC45D0F27CEE5A57300F497E77AF5268970782030E6928281379CB14BB56D2ACD963D189C078C7A60E98A782F9483ECE7B4871A061277186A01E878087381704BD72C63C32CBF2470A561C22A5DD3A1988B7ED0D274182E1B075AF277920B362D612DC7ED82057EBFE51A3CA5A9A9A45DE015C460BE6A48CF67C820813048A1CEA0FC3D7307F802B4FB7E523E7C8555FA56DCF66237F176D3D973C47F55AF93FC4BC92B98B7DE89829B1471DFF53B649CB03B719DB58DAF824DAA2DE570DF6314DCAF5B705557F9D783559277A754F3CD5B783D5A577EBE4A065D320284B01F71540F1986BCD443CF4FD480DBE06EF7710387CB5185DEACB5C2A612BCA275950B8988F247C4B773D8983D87F47D60F5BF80E6E7BAEDEB14B5FFBC46893A81C63F99F511D3E24FA8F7B1BA66A7DB0C1D9ACC6B5010AD725BDC2282D8A24018C975C8B12ED3326F48194D4FF93EBF051204CD224EA39F27D63FE07CFD0162358B412DBFD4715AD049EE5A31638D3111AF2DB7952F3A973646612712A607EA35826249D14CBDE4380D8BC986067B1CC27503449FB128767986A406585C3D40DACA75C27BD36117D2487BAE82CF639ED1FA016ADD279D109B8CDAE59EB31E1F006CB7AF000A267E8582E55375CF6F06D1A47BE9BFA21C8428045B9DF96808AD74D054820A4D0873257EB318A3DC9B6D9585D973E26D435345B4D699A952C3092EEDDD975FB59474212080D03EC489C695F19CBA4D1CAB1AE8D2E2C730B06E657D33722D24222FF7B613B6E8608E8A6003E11C80239FF431B5D8FA52B84B867A581798833590524C7B84EAF6CDA9CA94C5AB8EF55A1262EEC5C37467807C89FF7D075606A3902E7247E9C6646839C18493584D33DB65D6DFC0F23E68C9D13FD57FAF4836C28926693DC3EE372DE27A9D3E4AB4229425EF48CC410F1792A51C9F6FA5316A1D9A7C99979884EF350B4882F6045921CA88D4E44B435C69C1AAC11660971C2A3F6480C79E6E146C0B5CD2371BF5E7486AD7D0BE88D62A2AE8F0D73C17CBAC86FF6BDA55A880B182A5237498E9CB343A9CD82D7784B72473D222E688D13CB81B2908BBA854B9624A11DBE8CEE9C3825C1BFBA476B4D23D0B0C325F1C498A65A3589EA8E8DF8DD9030B279EDE30443CF80367CEEA4A122DC8329E5AD42491CF57EF47AE2B15F9C54120966B95ACD727A4A2B686B00626BC808F43D82D20DEEBCA79B074A7BFF38D2531AB2F726AC7087236EB3FB4BEC8A2D4207DC84C + +count = 44 +seed = ACC98B16DCC9A50EF57F332D66255CA56C2BB679CAE705B4297F1418DA845861448DA6CC5CC458DE6C6E96128EEB2898 +mlen = 1485 +msg = 96E2865A0E602EA4E3C5657A7F761A6F771007989FF885261F5638C14C1BF80AADE34CB956D2B5FA1CE38FDE831423201D3692E8E6F40E68A68C085DBE3C4CD8E35394F74072F44DE98A74E42C9176A86AC06BED8C0CA937DB4C3BF92371106B7A68EA8FDE1D1E082CCF522A397401AD0F8DA6C82BF76EAB8AFE101C7FF023A0FCF015B40ADA0073363E7CB25260C18662D651222A4CCF1B290EE6F7B111B9A963211D67D7674B499449F760352FEEB9FB7265A5F2F7F20C0174802C7F48226D92620D3E009E85B104230C21BA2FB0012DAC4BDF9FD184E09CB3E593EB1F3EEB418A8BF3173E6CB91FD8080C7E80DBE6730833A4A9F22C52716731C7CEA4F70CDE0F81D2D9AAFB6B60820598A7F6AA1B963B7686528E6E7885AE085C3D26C4ACBF9FC15080D972CA841175B343E59FED79AE3CB4DBB4F0D7D463BD3E0C4B2090139145B8D7DB5DB10ABFA51DC909C5CF7809030D72A5090CDC765EECADE2B365F719127548CA601AE0D21E402E18050ACAED30EE13CDDADACC9373A87A218787B585319A7E66FBB13851F7AD0D2BBC1EFE6EFE4F7ED248D844F58B6A5A21FA9295E0044982AF6286DE296550F72B5E416373F1DAC006687DED1E7D40961E5177C207579F25E77BE808A6BA33DCE8A2A6F88E97AE98ECFBEE5296D4A170E3574D9BA592A384CB0545BCFC32B3831C0B736AB77440722299F192DCAD519523995F71F2983BA87AAD2261E6E01C19DCCAE00F8D6914501D1AC3D4AFF0C12FA125ECDCA34DCDD8407F0045F8E8BE0763E19EB007ED4DAE36E30AFB07F8DAA7431B72F4A0A8017B3FDE27123AC3E8EE575F8BE310F68F81B696DB1FE63CCB8D32B899B209B2205956D209BD6E48166BBB4372A607E83C47698DB5AC8F9B40D05F38EFC4A4A1309D999D5CE1E1A5828D56EDA4666995897C8E6362D0B5054F04BCCF79D03852D1003C80CCD55E9F4578D8BB2C8E220A4D7A4E2190024C85C718654CCF174AC96C1BC50EA49F961EE7697C88E6BB718679F1D1F1118376B31A4B8C0471F6D7AEFC5AB426515D1B2CF0EAE66246B3C4132A63C63D7E33EB9DF8D8807215D58F46EE832AD3EC893D74E00C73510B9625F62D4EB5B500EECDBC7D088D3D318077A4A0F7D64ADB13220232C08DA75D23CA7B20CB109C972B7C159863991C32508339558B9383DDFE7E7DDA740E5BED0EBD14ED300C634DB01F359F81A7133669183EB187C17A2C8AB855BFCE73E34A1F59ADB0EC39EC0C7573AD3620A819333EE79D5E09CB8449F91923EF4C5E21549EB7F56075C014E1C3AD2805E682F07BA8AA265745CB600A460069678745FB9638F6709D62D2DAD8DEFDD5A4D0C2AE7401292BD1DA5F40D4CF5D59A403932FFB677237AD74691CAE29FA31B955172EFC5E83C225F2DC0430AB0C909A97BFB468AE182ECF91E9026DE819F3440FBE69B9DE26F812FF3F3CE8037F124AB368B1153C1CC127D140F754C525D4799E1A19D93B90460E6518F0B6936DC6310B7E9E6534B595E00225978214EE5AEB12A6F45B5C73FE86771818843FF7A6B88379C37165D9DAD48AFFD6FBABD11B1FB90AA5A78918B317C5F9B2CED6B9647F130DA9F91E1B1CEB84F6E1618248F06D654E159F71033072F1517064BD96A5C138402771ABE7F39F53A798C2423B748EB7F310485D6376722E204FA33B9740E7FA68364289A677C5C78A19A7707D2549BF9329334478C64351FEA1634388ACD4BE57E4ABE9374A0E999B770CD81B1BF4A8FF300C297B116CEDA1A4A1C1BD5A2275581A0589A46142139FC596A1406D16293076527CDF9AEA2D0919F9678423B7D95B153DD1D9D62B72A12F6491A36604D19E7BB83C476D232769425557D3480623D40B7AC27C0F67D4ED5CA4D487BE915A68352DCB03A3929A4BB795248EBE2FBE0612833D9305A0A31D195718BAC193FC59B880042A7F61358104A919C7E7C210F02A856B8B1057DD8527FD4AE1EA81F9E1BF7C614ED8A312C95154873F86632CBD60C65176F13CAC695BB4C23675331058397D6E96E4F9DEEB859E3937553D94BEDE3C2B9A5EBF00964A49AB294BCCEE09E5A97381D2375941AA775A47F726E9 +pk = 326A1EFC774D5F3CE6B11CA8EF53C12594552D4C5D79EBD0894959BE01938EF8C66700B1F6F09AA085D9E45C010A8C65CB2CC105E9130639AF56359D6D101E011842089B5EBFA5E39FD7E357276E957244BF96D8094F2406454EEB9BE5F31F5B4F7DE0024CE8793123DCCBC68B0237B4B2913CF3A7CFD7B0650D7396D3971E0002 +sk = 326A1EFC774D5F3CE6B11CA8EF53C12594552D4C5D79EBD0894959BE01938EF8C66700B1F6F09AA085D9E45C010A8C65CB2CC105E9130639AF56359D6D101E011842089B5EBFA5E39FD7E357276E957244BF96D8094F2406454EEB9BE5F31F5B4F7DE0024CE8793123DCCBC68B0237B4B2913CF3A7CFD7B0650D7396D3971E0002CD4E118807BB35EA68F21AEECE12B037D111EC49E23102FAC917536C9E559308F500000000000000000000000000000000000000000000000000000000000000AA3E3288148EFAE49D42E3D04E9D77D551DB015EA21ED7AB5E2B7A0FCB3DEBCB7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71CD9F684E28C572F23433D3E519E679BB8F6C0F1C3E70FFF8499DA3BBCBAD93F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F611CF4F1922A76E7A89171D1ADA302A2786ABFDE34007D3B1DC26A2DE0F5950BF3797726A958894BA0962C94F28573A08CC959B30EA3387AC0CB3BEAB7A0837C624B42B18B57DF12F2D8910AF71B031A22D31A09E2BED86A3CCAAA7218BD1765E8E74ACED7114657DDF8B377A5C9FDCD50BFAB8EEC9C8FC0D7121C1FE077F1B5A9204DCA004563C41EB29E3C15556369254B21724862161E8511CB107C239AF6F31E2365F14192D30B3023DD119CF7C9D2B185811D707BB7CA3E3010D94334B9227D51E0A8EFF4A426CEB99E36DF459DFABD747C0584A65D16B15863AB992E86F7AF9DB93DA73969C62E7C94E9F3E197E487DA97EE381C13C67DC06 +smlen = 1777 +sm = DBB74A539040C5F26947613A755FE9913828B1745EE0F603380BD74786908140A32B0F044DB493CAD5D95DF0F741F7C3814E3B3E2EFB4090AF753805CE825C00E9FB87A63E38A61332BC315D019A2BE37D8CE3E22FA7D32F0627899ACC8E1F501B011F1897CD83880EEEBE9BECF68128F0484B54FC27AB82FD9C77E941FA15010001F5BE03D6DFC6C0ED3C6128F663A599A614C626D393C2B8524E983EB5B16FE702DAFD61C13EF3FC59027BF27907DCA55CE4C9C69C923C18E56CCD4656B3E3F54EDD84DD1F75B9BBD9ECFB78499E4AC4F9BC48EADD7BC369FAAFDF7A15C6EE2C4FFCA5312F5CBB51D42D8A2D326DFB346EC6E5F91275E37D24C94039B91D33AB658E13141085EA21D87172B34F68DEF7FFFF167F8128351BB6E9C8DE53D6683300020296E2865A0E602EA4E3C5657A7F761A6F771007989FF885261F5638C14C1BF80AADE34CB956D2B5FA1CE38FDE831423201D3692E8E6F40E68A68C085DBE3C4CD8E35394F74072F44DE98A74E42C9176A86AC06BED8C0CA937DB4C3BF92371106B7A68EA8FDE1D1E082CCF522A397401AD0F8DA6C82BF76EAB8AFE101C7FF023A0FCF015B40ADA0073363E7CB25260C18662D651222A4CCF1B290EE6F7B111B9A963211D67D7674B499449F760352FEEB9FB7265A5F2F7F20C0174802C7F48226D92620D3E009E85B104230C21BA2FB0012DAC4BDF9FD184E09CB3E593EB1F3EEB418A8BF3173E6CB91FD8080C7E80DBE6730833A4A9F22C52716731C7CEA4F70CDE0F81D2D9AAFB6B60820598A7F6AA1B963B7686528E6E7885AE085C3D26C4ACBF9FC15080D972CA841175B343E59FED79AE3CB4DBB4F0D7D463BD3E0C4B2090139145B8D7DB5DB10ABFA51DC909C5CF7809030D72A5090CDC765EECADE2B365F719127548CA601AE0D21E402E18050ACAED30EE13CDDADACC9373A87A218787B585319A7E66FBB13851F7AD0D2BBC1EFE6EFE4F7ED248D844F58B6A5A21FA9295E0044982AF6286DE296550F72B5E416373F1DAC006687DED1E7D40961E5177C207579F25E77BE808A6BA33DCE8A2A6F88E97AE98ECFBEE5296D4A170E3574D9BA592A384CB0545BCFC32B3831C0B736AB77440722299F192DCAD519523995F71F2983BA87AAD2261E6E01C19DCCAE00F8D6914501D1AC3D4AFF0C12FA125ECDCA34DCDD8407F0045F8E8BE0763E19EB007ED4DAE36E30AFB07F8DAA7431B72F4A0A8017B3FDE27123AC3E8EE575F8BE310F68F81B696DB1FE63CCB8D32B899B209B2205956D209BD6E48166BBB4372A607E83C47698DB5AC8F9B40D05F38EFC4A4A1309D999D5CE1E1A5828D56EDA4666995897C8E6362D0B5054F04BCCF79D03852D1003C80CCD55E9F4578D8BB2C8E220A4D7A4E2190024C85C718654CCF174AC96C1BC50EA49F961EE7697C88E6BB718679F1D1F1118376B31A4B8C0471F6D7AEFC5AB426515D1B2CF0EAE66246B3C4132A63C63D7E33EB9DF8D8807215D58F46EE832AD3EC893D74E00C73510B9625F62D4EB5B500EECDBC7D088D3D318077A4A0F7D64ADB13220232C08DA75D23CA7B20CB109C972B7C159863991C32508339558B9383DDFE7E7DDA740E5BED0EBD14ED300C634DB01F359F81A7133669183EB187C17A2C8AB855BFCE73E34A1F59ADB0EC39EC0C7573AD3620A819333EE79D5E09CB8449F91923EF4C5E21549EB7F56075C014E1C3AD2805E682F07BA8AA265745CB600A460069678745FB9638F6709D62D2DAD8DEFDD5A4D0C2AE7401292BD1DA5F40D4CF5D59A403932FFB677237AD74691CAE29FA31B955172EFC5E83C225F2DC0430AB0C909A97BFB468AE182ECF91E9026DE819F3440FBE69B9DE26F812FF3F3CE8037F124AB368B1153C1CC127D140F754C525D4799E1A19D93B90460E6518F0B6936DC6310B7E9E6534B595E00225978214EE5AEB12A6F45B5C73FE86771818843FF7A6B88379C37165D9DAD48AFFD6FBABD11B1FB90AA5A78918B317C5F9B2CED6B9647F130DA9F91E1B1CEB84F6E1618248F06D654E159F71033072F1517064BD96A5C138402771ABE7F39F53A798C2423B748EB7F310485D6376722E204FA33B9740E7FA68364289A677C5C78A19A7707D2549BF9329334478C64351FEA1634388ACD4BE57E4ABE9374A0E999B770CD81B1BF4A8FF300C297B116CEDA1A4A1C1BD5A2275581A0589A46142139FC596A1406D16293076527CDF9AEA2D0919F9678423B7D95B153DD1D9D62B72A12F6491A36604D19E7BB83C476D232769425557D3480623D40B7AC27C0F67D4ED5CA4D487BE915A68352DCB03A3929A4BB795248EBE2FBE0612833D9305A0A31D195718BAC193FC59B880042A7F61358104A919C7E7C210F02A856B8B1057DD8527FD4AE1EA81F9E1BF7C614ED8A312C95154873F86632CBD60C65176F13CAC695BB4C23675331058397D6E96E4F9DEEB859E3937553D94BEDE3C2B9A5EBF00964A49AB294BCCEE09E5A97381D2375941AA775A47F726E9 + +count = 45 +seed = 8BEA4E384E73C7E0B47381B3063334291A0F06D28DB61B5BF65B01D0A747722E0AA62B81AD46C00C8A5C31494E513836 +mlen = 1518 +msg = 047E2D484D798B3829CA6037D6C1588A2349DE09C5DDFBEC987652CFDA01454ED791DBFFA3D9DA13A35230ADBE1B39B042E3C70589658A03F75447C1CF3970DC10FE5A4A9E980F2A33B642B42E5E66E9AC4E7A56888FCD72913A79489B5B163BD37B8C3C8D242FFEB37D0C1ECE21034BE9E3685798C2EBC6B809DEFC02C6F0C2A3AD70EC0BAD12D57ADD63EC3584CA98E680267FA514B34DE4147C9D901B59914D49CE9E0F885855ED0CE7973F3307B675408F90B51C6A4D38A414D970EEC989CC7900D7723E19ACC4EF743F6D39EB1B563B8C13D42C0056B6C49732854925B606467F7BC662D17B924FC65E9C3CDC2AE73FF73040011A152B05ED7F96B2FF4CC39A22484AF72812EF02B08EF4DCB64C8936E74549AFDD5D876027FE2B431E61E52E8793888473F4C1E5C1BED2C4AEF8E5E300A735B302474FC6F54869984F1A62DAE29C7C9A0CCDECAA55FE137BA14B5C5C121E0C5EB33B035E01F3415529E0826B27498D7A71B0C086BACD140C02A5948AA54799D0DD0FFD384C7E68578247FA28D205B18ADAC94F7D3C8ACB7DAF71AEE347B577D97EE8E7E865CF4FC1C16640AD1E9D0192AA13AE81A71118408E145B6121ABB75B4BFFD1D403057D4AD5CC730452475A7F067690BB81E81E17BA8DBC31059969B20D387BA59CA8CE499E59A65C8583F29CD539F4F75DDCC68C7BBBC43C849802D8347143E2FE78C1AB6D7AB6BA9917301C88386B294AAC995C24AD680A8C3BDD7AEBEF21E84F5A1909A2D83A8DFE46A75F4B2B47614CD39BF3CA3460DE9BB5C37EB7349A17AB32214D031CE927806FA394470F407673B0CDC3D9A7E3749F09CA895D464A4269682CE6DDCB8FA0EC2F05372C73DC3D06FA6F58090EFBBC6D619A7A565D4EFE441AD7E018A7F5E1384B88EB4506FC54E0AB0A8B9EE3641760FFC08F6BDA78C12396473D1243BAAF6AE10316213115441C0B65C7E475B4E1578D066A47D9C6E92FA32D0F2C365FD15F5A2E88A81691F039DC642ECEDB6652D08ACBE64625B46083CE758FA96C142EB34477E065AEA04A45FF4FCC3E3D146ACD7041F5F7E4C6B26C8205BE7B66DB46DA55556CE02B48AF55A4710BB28B8CE102CB15C1A4AF59D9A17A2DDA6E2D1E96987F6AA9F4216D8D5E5CBFF7E2CB775E83A776063A4AAF937BF0EC84149EC1A7EE21F735D21625E85831B80DC11EBF04F30B13E3A7E4D4784C5F8C61C679E0B6863958F42ED31DEAFFB4C272A3731C1407445CA7673D225EB6509469DC6C1F0AF43EB00F18B3A210AA57D51169F2A9FC251BB338ED4E9DDB19282DCE871211D26482E13A8D533DEE00D36FF5CEA98DEA72D9F0B32DC398A3D5537A3373058FAAA3926C127A1EC739FAF3D57CC1A05D578074A3A72C3F2B1692C2BA1F1FFED943E7BFCBF1E664C4F52F7BF8D86174CA8910C290C06804A7748DB21008AC43E653D7FD7E0C982EDA9356F68DDEC26473956DFF281F7B767010C57F4AD09A05063A6B3CE078DD32F3DE1F40526C06A2D60E36E2C70502D5BEBFD2F3BFCACF8720CDE1657B9892406BAA3DF01E59313EB655B6A545331EBA01BCDB9C99E4AD7FEF7438AE8715FBE589A2F99CB9CA34B9610B3CE5BE38FCF979240698174348417420AAB069B8AD5F646F82958A136DC9F2F81E601056BB4AB5E10F4EBC4A00E18924C51D0FD104078471C6805C49D92C78C832EC3F10D8966E19ADD3D3B4516E12DAF4F63FE6BBD228062DB743D1F867800854F7BB7FFC2CAA0D01A0BB683E368673A8E664BBAA17A8C0C04BCFF05246F9C4F3020510A992EF26FD0933BBFDE9D042862DFFD33A6465F590A2287D8154777A89724FC3DF9F2F1B1ED8765E7C7B761CA4781006822065703ADE07A6E874E70928E1ABA29EE490690D24F6E73D96B85FB53ABFD1C1FDE439279E08FA232043B2344B267CFE5901C60E7CA14B0C85EDCFA2AB90F341821D2B4E25FE23129F2432DB932F23B5957706A433B308FB918D1C8D81EEB399BABE95E7229AD41F30460CF28671A4508B0BD1C61F48CDC23587BB9BDC6F565E76C86547CB71396661BEC8C7FC2223751F765C91C45C674C36B49AEDEF3DF2537F888904B507EDCD89155D40CB81DDA74376BC9CDCAFF8A368F1086C99EDE25526BC53F95F4017 +pk = FC49E9EFE653B88F41E404451EEDC01BEE8775E4F43D58FE8859C1E07042EEEBDFA66DD466670B8C3DD160C14DCCE241AD606A4BD04DA611A690510C3949B700C5FF457121BA165D5A0CD868115AA5D981D11D32BA320C96C7522E8BC43033C7C7768A1CB20F7FBF4858C58C8E0436253E568C12B1C39575E5A3E3618A108B0011 +sk = FC49E9EFE653B88F41E404451EEDC01BEE8775E4F43D58FE8859C1E07042EEEBDFA66DD466670B8C3DD160C14DCCE241AD606A4BD04DA611A690510C3949B700C5FF457121BA165D5A0CD868115AA5D981D11D32BA320C96C7522E8BC43033C7C7768A1CB20F7FBF4858C58C8E0436253E568C12B1C39575E5A3E3618A108B0011BB994265E9080B943B0335D87D79B733AEE0EB302F6446E0626C933907BE1D811001000000000000000000000000000000000000000000000000000000000000F0694AAD69B1917B25D6BEA24AC784FCA4E063E10361DFEE04F5938F95FC4EBAE3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87C1695E47AC035C45B776813A413F9B89742E105292AF2FFFBC16FDA457DE82FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000273DDCDBEE830CCA275F7E1A87657663BB9F532E8DAB82ED613701EB548C67F27D558FB923655A6D9050567160FCDB2BB7225B382D9E0C863B1267EA32730809A3927336ED6A6E16EEE18EEF233C2828D3D86F1C9A1CAFE60DDF1643D854C13A1A0F4D49527081C2D67F11C28CF8269A5750F7AB5BFBF0C2E0F06F95DD054AF33C41DFF3B0F34F0FE63302982B08DE46483B3D7D1EA3749BAF8C814C6764EC740EAE6AD83FE48F39E2E405885DD02B5FDF03FB48949D6BAB1208FB45036175C59244B474982C39AB63E630F3F5B83A715F1A3C7F42DD80303457790413D26B9D695F58F48ACBF2E5066289BBCC8DDF8E6335601B218E2B77D05BD109 +smlen = 1810 +sm = 347C8EDCEB78968345E975EE9305B2A8D98AC220B8027B04482FDFBF75E13385CCE6BC19451CC4A0F522100270F692B0CE99727FB43D694A0A326C859DBB73009924F06565B325F995382EDD8B1D81DFDEC82F7FF1EF82BD0ADA943812B18B9B1D95CD41DAEAB081E6CC10A4E34EA30CEFB571E9821FDD6F614F921C7672C4000001894241B0821EA3FDEFBC6F1DBB7EED84E8F75BA5B5609B0D6DBE35C5A301AF7AAC0D869CCDEE9E7EE362674E73E4E65B1E00AD7FC093857700420C1D966AF436D2D303140E156424B63FDC656970BF8499131899045DA2150D78190FC134F94EDE5C3AD3CCF841B750FACD4EFB8349EBE8857FD05B395183FEA6944483F371042E54CB11F25FF839C50E0208EC7FD2A469F327A673F6704662273162181B6B000A09047E2D484D798B3829CA6037D6C1588A2349DE09C5DDFBEC987652CFDA01454ED791DBFFA3D9DA13A35230ADBE1B39B042E3C70589658A03F75447C1CF3970DC10FE5A4A9E980F2A33B642B42E5E66E9AC4E7A56888FCD72913A79489B5B163BD37B8C3C8D242FFEB37D0C1ECE21034BE9E3685798C2EBC6B809DEFC02C6F0C2A3AD70EC0BAD12D57ADD63EC3584CA98E680267FA514B34DE4147C9D901B59914D49CE9E0F885855ED0CE7973F3307B675408F90B51C6A4D38A414D970EEC989CC7900D7723E19ACC4EF743F6D39EB1B563B8C13D42C0056B6C49732854925B606467F7BC662D17B924FC65E9C3CDC2AE73FF73040011A152B05ED7F96B2FF4CC39A22484AF72812EF02B08EF4DCB64C8936E74549AFDD5D876027FE2B431E61E52E8793888473F4C1E5C1BED2C4AEF8E5E300A735B302474FC6F54869984F1A62DAE29C7C9A0CCDECAA55FE137BA14B5C5C121E0C5EB33B035E01F3415529E0826B27498D7A71B0C086BACD140C02A5948AA54799D0DD0FFD384C7E68578247FA28D205B18ADAC94F7D3C8ACB7DAF71AEE347B577D97EE8E7E865CF4FC1C16640AD1E9D0192AA13AE81A71118408E145B6121ABB75B4BFFD1D403057D4AD5CC730452475A7F067690BB81E81E17BA8DBC31059969B20D387BA59CA8CE499E59A65C8583F29CD539F4F75DDCC68C7BBBC43C849802D8347143E2FE78C1AB6D7AB6BA9917301C88386B294AAC995C24AD680A8C3BDD7AEBEF21E84F5A1909A2D83A8DFE46A75F4B2B47614CD39BF3CA3460DE9BB5C37EB7349A17AB32214D031CE927806FA394470F407673B0CDC3D9A7E3749F09CA895D464A4269682CE6DDCB8FA0EC2F05372C73DC3D06FA6F58090EFBBC6D619A7A565D4EFE441AD7E018A7F5E1384B88EB4506FC54E0AB0A8B9EE3641760FFC08F6BDA78C12396473D1243BAAF6AE10316213115441C0B65C7E475B4E1578D066A47D9C6E92FA32D0F2C365FD15F5A2E88A81691F039DC642ECEDB6652D08ACBE64625B46083CE758FA96C142EB34477E065AEA04A45FF4FCC3E3D146ACD7041F5F7E4C6B26C8205BE7B66DB46DA55556CE02B48AF55A4710BB28B8CE102CB15C1A4AF59D9A17A2DDA6E2D1E96987F6AA9F4216D8D5E5CBFF7E2CB775E83A776063A4AAF937BF0EC84149EC1A7EE21F735D21625E85831B80DC11EBF04F30B13E3A7E4D4784C5F8C61C679E0B6863958F42ED31DEAFFB4C272A3731C1407445CA7673D225EB6509469DC6C1F0AF43EB00F18B3A210AA57D51169F2A9FC251BB338ED4E9DDB19282DCE871211D26482E13A8D533DEE00D36FF5CEA98DEA72D9F0B32DC398A3D5537A3373058FAAA3926C127A1EC739FAF3D57CC1A05D578074A3A72C3F2B1692C2BA1F1FFED943E7BFCBF1E664C4F52F7BF8D86174CA8910C290C06804A7748DB21008AC43E653D7FD7E0C982EDA9356F68DDEC26473956DFF281F7B767010C57F4AD09A05063A6B3CE078DD32F3DE1F40526C06A2D60E36E2C70502D5BEBFD2F3BFCACF8720CDE1657B9892406BAA3DF01E59313EB655B6A545331EBA01BCDB9C99E4AD7FEF7438AE8715FBE589A2F99CB9CA34B9610B3CE5BE38FCF979240698174348417420AAB069B8AD5F646F82958A136DC9F2F81E601056BB4AB5E10F4EBC4A00E18924C51D0FD104078471C6805C49D92C78C832EC3F10D8966E19ADD3D3B4516E12DAF4F63FE6BBD228062DB743D1F867800854F7BB7FFC2CAA0D01A0BB683E368673A8E664BBAA17A8C0C04BCFF05246F9C4F3020510A992EF26FD0933BBFDE9D042862DFFD33A6465F590A2287D8154777A89724FC3DF9F2F1B1ED8765E7C7B761CA4781006822065703ADE07A6E874E70928E1ABA29EE490690D24F6E73D96B85FB53ABFD1C1FDE439279E08FA232043B2344B267CFE5901C60E7CA14B0C85EDCFA2AB90F341821D2B4E25FE23129F2432DB932F23B5957706A433B308FB918D1C8D81EEB399BABE95E7229AD41F30460CF28671A4508B0BD1C61F48CDC23587BB9BDC6F565E76C86547CB71396661BEC8C7FC2223751F765C91C45C674C36B49AEDEF3DF2537F888904B507EDCD89155D40CB81DDA74376BC9CDCAFF8A368F1086C99EDE25526BC53F95F4017 + +count = 46 +seed = CFA713E4A63A6FFBA43BFB898956DC400507F68AD164C3D24A67B5F8D7548C9DB44DAA43E5E4A0990325A4233089318A +mlen = 1551 +msg = 6A58AA820275A2F43D0F05DD0EE484AF42B665FFB8F21DB322ABD256A5C753BC8FF6A2C71467922E09726655F1A7218E736752065C871221C0B9DEE6A9D56B78A1C3B7357774396F6980226DCA1F91BA828E06BBF324D5CCE8D584D9D298261C7149899FC9F74D501E920F22AA34706A79213E35914DBF57B9642A42EF0D8226E31ADF89D18C5F3163ADECC79172C95650D764E3729EDAA08C207D930C26DF8EE1291C1CF889283B70AF00C0489175F799273C837B281A5D1284E4447ED72598EFAE23B523274644DA19BC0359BA59E5BE9E5828FF587C335E136C1D789257864D2648EF9C03D1C4B9809DD07CEABD865254D3D8D597587D71E374FC2DDE89C22C2330E8904F6B53F637348434A21ACEAB9892D5DF8FF84CC58229782BED739BFB13448896F7B1064B499087F7547CFC0A49272C2A670A9431B1B5A07284B6749EF834510A3EC0C61A43D5D0EB48C8F487947C4FCCEFCC49DECCB6111D617407C76A1B4A849C9A190310711B102F142F9E9CBB29F46447265E2C8DDB9174B780EB4A51003FB68483A265F2475D5BF6ECE18AF0CF31BF24CDD56583E777C4340086917B78068DFD380466F43D020E285CEED97A467DB96BFAEC22D80B4A6EC0DBB98CFC44436A41CADC85A90B214F00990D7B7010BBE4AC94809A0450C9ABEE5AA4037A44B0B4DEBD264120E762086B8D6F17AFD37086C93A8A368BE97E0F7546AF16D731C21878063E38DF3DCF3ADE6DD2DAA43C198F49B5D9FF5362333F29EC2F13CBB90DBE4E703EDAE9A4F7334A1C5AC60D5972C4AF2BA61B63C93BF719854E615D16BA4F704C55260A8838679815FA59BE08C4243CACC1A584CC1B4E777FCDC6E5A167C4CC9093749ACE4836AE058BE89CCA3221A3F63F07089006E4C44E40653BF262945A640D8C2A24E7CC3529E4BE76286C86CA2089CB8D4684508D1FAB81EAE7D8C731B65A22700BF9009A3190F5ED837EC22F9112383422027AED838F16A7740CF79EC101865D320E380D4ABA745ACC8EED376DC5B3AABE58DEBC35F8E983C92906AA2E3D8FBBE237325302E2A23CB1312EA7F532D64E79B9815996D28E0183EB728A37E19CB219987576C142F4B2F66AC6C7C77028ED59A8DF27F78ACD3910DDFCEB88888B4A604E5D07AE1B53EA6DF6EC2163DDC4BAB422D2438FFA543B22441E50E4087FDE4BEE6D79D90A2F72548DDC41C5AE07DCC87666EA3C4B89A0B14AFE03B585E7CA507E5F29997F2368B0C68C6AB6E344C082BD06AE922CD8089634918D9132DF9CBD665A4149C59BF76B0E94F66481766FD79054AA80C02E0AE04A6E2BE090582171B2A9AF455CD9FC302CA9D1EC837EE26E0E4D0AC8F0692CB9ABAC979B58CA92E5194EBE46B520125BD0B3ED1AC2BD817D3510E33CFD17058F865DBC64E9B99352B6CAF10F0A5A47449BF927A8EBA06D34C80D77A0B00B88B25A4C8747AADBB11BA15ADF9C959B05C4371CD8439FE5028E004A2E1D2F21190466FC7FD56E9BA0599A0EEDD98246AEB4B85994787B7604CB52F5515B42C2FBD4B5E9E372A36CC4E66483DD884DFE42AAA5EE7FAB200D8EC6E3556DDE0F9E9C7346F9967F8F3CEBE1E4D1CD8E6046E5E94BBC74AD3D51DB0DC704F4A4025383F0391B9DA37BCA8EC59E807593A4F040FBB186607280967E5048CAB92215DC783D9045F7A0922008628C771778661E97E9F88EA84BDAA8BA61126F71D193A2A564E3ACDE7ADF2C0B3D5B022EB6E0C629782B0025C9079D4545D88AA2BA27D10C5DCBCFB7CF648939155066518878CC54A4F611AAC21BD3A1EC628D3352F049915FCA55234B9146ECE5F78FBE7CFFB35695363202EDB9EC3501A93B4B6FC81B3DFDB5245FEEC8AA54195262C2467E15506B7D42A7FF61D75998722D0208BBFEA05CE7D2E66900A9B34F44C2A21257C220C03F9D6D7F0312A36F5C12DA20FB5290D5CFBC1DEC7D05C44820885C479063CA88783C5AA128829417EC4DD41CF83A1D991DF2EFDFEFE375E93F0371695E353EF737F4A75106211A5F70C82B4F360ABCD078C9E829C82A6B7A36D22B8D1F6E3101BA009C759FC83999D52E29B387A8DC1658A43EC4C4D9330A4ED2138E035EBEAE6343A76A82849E37141FCE34E9A41EB5EF88BBB9257017AD8696C3847FD77AE103A082ED1A05DE9420984C147AFF927E1950244912079BDBE5CC07 +pk = 658A6045412F9378885121675B0F1C3712E440139AA2DEF1E970E23DFB55369D677AA4807EF23A76A6F1EEC03FC79BFA2CEE162EC2AC4B3024475CC746AAFF00B95668713E483B2287BE00B747BA92B61079C6B430C826F29695B1FC9657A7ED1784C2E0F4CB99FA7E64E09CC61024F116AB90BE17A1EB389B5F98D3FAD6E4000B +sk = 658A6045412F9378885121675B0F1C3712E440139AA2DEF1E970E23DFB55369D677AA4807EF23A76A6F1EEC03FC79BFA2CEE162EC2AC4B3024475CC746AAFF00B95668713E483B2287BE00B747BA92B61079C6B430C826F29695B1FC9657A7ED1784C2E0F4CB99FA7E64E09CC61024F116AB90BE17A1EB389B5F98D3FAD6E4000BFB5A3E7CBCDB25A2C4176792CA0A736ADA765E71AD4AA836110260224F6D6BC12B0100000000000000000000000000000000000000000000000000000000000042FC9590D1846A989645FF04B7640575773C78EA24439355534AE32A8ACDD77ACAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83B0BCA999C4F4B101A0EF094F7143EF8DB64A6BAA78A24C850D65F4DE6CD97BE3FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A2D49762F1113450B3018FDE4E32F8DF8EA06FD990775384D22F6C53E69747E1FDF55C03CAB5766544E1E3B1C249AE6B426DD5F81249D3EA9CA496E55C48056504DC3DF4AC92CE257A50684430000C641E6B4BC61FE99DBBB9246E13552A59468217D10F2AF6239135645F79464C3F25E2E1D8DA1EEF20CD6D9C3E88E30533B3A24ABB1EA0A20A34C9869641C2E007A4CD707ED95290BED5DE749EB595FF2F6B87B28C15F64FCC84CBEDC5A43191C12059C118335CE78BD5B75FB8BC0A2897924F65E355A382FFECFC7D1DB4BF969746710F4474C26877FBAC8EEDF0590D40413F76CD60E9A0C13E05C7E7992C1E0AB3A641A8A8347B72C783E11B0B +smlen = 1843 +sm = 459DFF73EB44C432BECE1FEA9C4C2BEC8F6D58130BE6ADEBF38346818A1F6E03A669A321B12026CE54DCCD5016C272614FEB5645C302F39C4568CA44FCFD7B009984241082CA24430E131A9B9361EABBA8655BC8893AB976919119AC6672B0EF7CD7CB015A58DD1BA0C5B02DD52BDF91BC4DA44D5B740351BE79607C73A157010002579228D60758A47D77A0F1B9CF2D51243A1D7EB597E852FBB45E0F8A339EE432596FB41DEF0B239AD7234191B7FAC97831A2807AA043146DFCCCB60339C6F850389224B8211151B76BBB7C242D427E12AA446DA3E9DBE9414F88108610F1C02384D0AB2ECB96438482A14084B0EE0D35C865FABF7C0D14FA33B1A68F8C14A1159032707F4BD3768BD2306B268DD03A36005DD6C464405DE44377C0B9B5E95E00090B6A58AA820275A2F43D0F05DD0EE484AF42B665FFB8F21DB322ABD256A5C753BC8FF6A2C71467922E09726655F1A7218E736752065C871221C0B9DEE6A9D56B78A1C3B7357774396F6980226DCA1F91BA828E06BBF324D5CCE8D584D9D298261C7149899FC9F74D501E920F22AA34706A79213E35914DBF57B9642A42EF0D8226E31ADF89D18C5F3163ADECC79172C95650D764E3729EDAA08C207D930C26DF8EE1291C1CF889283B70AF00C0489175F799273C837B281A5D1284E4447ED72598EFAE23B523274644DA19BC0359BA59E5BE9E5828FF587C335E136C1D789257864D2648EF9C03D1C4B9809DD07CEABD865254D3D8D597587D71E374FC2DDE89C22C2330E8904F6B53F637348434A21ACEAB9892D5DF8FF84CC58229782BED739BFB13448896F7B1064B499087F7547CFC0A49272C2A670A9431B1B5A07284B6749EF834510A3EC0C61A43D5D0EB48C8F487947C4FCCEFCC49DECCB6111D617407C76A1B4A849C9A190310711B102F142F9E9CBB29F46447265E2C8DDB9174B780EB4A51003FB68483A265F2475D5BF6ECE18AF0CF31BF24CDD56583E777C4340086917B78068DFD380466F43D020E285CEED97A467DB96BFAEC22D80B4A6EC0DBB98CFC44436A41CADC85A90B214F00990D7B7010BBE4AC94809A0450C9ABEE5AA4037A44B0B4DEBD264120E762086B8D6F17AFD37086C93A8A368BE97E0F7546AF16D731C21878063E38DF3DCF3ADE6DD2DAA43C198F49B5D9FF5362333F29EC2F13CBB90DBE4E703EDAE9A4F7334A1C5AC60D5972C4AF2BA61B63C93BF719854E615D16BA4F704C55260A8838679815FA59BE08C4243CACC1A584CC1B4E777FCDC6E5A167C4CC9093749ACE4836AE058BE89CCA3221A3F63F07089006E4C44E40653BF262945A640D8C2A24E7CC3529E4BE76286C86CA2089CB8D4684508D1FAB81EAE7D8C731B65A22700BF9009A3190F5ED837EC22F9112383422027AED838F16A7740CF79EC101865D320E380D4ABA745ACC8EED376DC5B3AABE58DEBC35F8E983C92906AA2E3D8FBBE237325302E2A23CB1312EA7F532D64E79B9815996D28E0183EB728A37E19CB219987576C142F4B2F66AC6C7C77028ED59A8DF27F78ACD3910DDFCEB88888B4A604E5D07AE1B53EA6DF6EC2163DDC4BAB422D2438FFA543B22441E50E4087FDE4BEE6D79D90A2F72548DDC41C5AE07DCC87666EA3C4B89A0B14AFE03B585E7CA507E5F29997F2368B0C68C6AB6E344C082BD06AE922CD8089634918D9132DF9CBD665A4149C59BF76B0E94F66481766FD79054AA80C02E0AE04A6E2BE090582171B2A9AF455CD9FC302CA9D1EC837EE26E0E4D0AC8F0692CB9ABAC979B58CA92E5194EBE46B520125BD0B3ED1AC2BD817D3510E33CFD17058F865DBC64E9B99352B6CAF10F0A5A47449BF927A8EBA06D34C80D77A0B00B88B25A4C8747AADBB11BA15ADF9C959B05C4371CD8439FE5028E004A2E1D2F21190466FC7FD56E9BA0599A0EEDD98246AEB4B85994787B7604CB52F5515B42C2FBD4B5E9E372A36CC4E66483DD884DFE42AAA5EE7FAB200D8EC6E3556DDE0F9E9C7346F9967F8F3CEBE1E4D1CD8E6046E5E94BBC74AD3D51DB0DC704F4A4025383F0391B9DA37BCA8EC59E807593A4F040FBB186607280967E5048CAB92215DC783D9045F7A0922008628C771778661E97E9F88EA84BDAA8BA61126F71D193A2A564E3ACDE7ADF2C0B3D5B022EB6E0C629782B0025C9079D4545D88AA2BA27D10C5DCBCFB7CF648939155066518878CC54A4F611AAC21BD3A1EC628D3352F049915FCA55234B9146ECE5F78FBE7CFFB35695363202EDB9EC3501A93B4B6FC81B3DFDB5245FEEC8AA54195262C2467E15506B7D42A7FF61D75998722D0208BBFEA05CE7D2E66900A9B34F44C2A21257C220C03F9D6D7F0312A36F5C12DA20FB5290D5CFBC1DEC7D05C44820885C479063CA88783C5AA128829417EC4DD41CF83A1D991DF2EFDFEFE375E93F0371695E353EF737F4A75106211A5F70C82B4F360ABCD078C9E829C82A6B7A36D22B8D1F6E3101BA009C759FC83999D52E29B387A8DC1658A43EC4C4D9330A4ED2138E035EBEAE6343A76A82849E37141FCE34E9A41EB5EF88BBB9257017AD8696C3847FD77AE103A082ED1A05DE9420984C147AFF927E1950244912079BDBE5CC07 + +count = 47 +seed = 1F3193EBC58EF65E9E396D69220ADB8ADC729BB388A72CEC9028A094F1CBDED21CFB0C41356AF31E0CF66A3B0D843666 +mlen = 1584 +msg = 139BA17ED7B476DBB1CDFE3C42B3A57AF5BBCB3BE19ED04D6C3072FDFE917ECB9272D59EE89EF83522531D83AFF8B9934A8423315C350D1481A4B02980DC29E1CB83B76623869649AC40EF297B153B679C327BB251C6E6BC169C48ABA2A439F9EA24EF94656A415C3E86D7BCB43CB3717D54D773F1937DC8B0E02D4E6ABBB1C83FE73F1B221C9A359E454C19DE5E71EA4CB8C560EABF1DA133FF20D81785D2ECD935B99F24840761446C324DF81484C5C05045C0949DF8D0F10F942E1B5B79074B358C25B6EC2B0B42DF65D998B666CF1BC568E7D737F22FF541807BE95ED85A9980E940E24D2C506BB0F9BEE32EFFD85A2017DE694F61BCC2B292595C97FF4C2145E48AF8F0F3D71763B4DB433ED7BDB8DBF8643475FB2B9155F0CC6A0048C5546900792BC01EBA4B06C83A0C447EA0CF05410DE55ACB8E5521829C89BFBC084CD86E7CA3D701283B70F78E1CE9C3888AD2689E0EF5593D656285066F319E155F86C0A71256484F42A0C40E7CF13AF0CF77C6D1CC7231A48538E9060A7863B774C9CC65E321E45AACC002C0170EDDD18CC1424159D46BF99D08A28D2DEA8917D28D91A1D6C409D945A5EEA19413A1ADCA40DE9458FA6BDF1E5308EF9E67E1E90E9D92BF19B5351FC49DFF0A31E035038AAEC651C0F20F276E4EF0EE35C14BB625EB34205516D95ABEAA06A7A3BB3AF2F12236406689BFAB11E65FC63EBC5B944818DD1D53C0E7B88CE7AEBAE581D995AE7D8423778DFE20D6CEA7AC0B1B4EFE2B9D571DE77BD8F71E89D9F6A2DC89103B73625887AB376BD12CE89A65E6280515A44A80D6C32799669260167DA0A214AD0FB803930AB1952D93360B54433CE8220B29339DCF2702581E88952A5A1549DBA11F4CCDB6FEFD6D24522F3207796C8D5BA9D1582F888F2500964F2B975AED5D5AF83409FF9720EDCF5CE3FE9B6B586B08DE21956E7970D8DC28F6208A80F5378ECBC506333A1D98C58EB0E2EB0CDECE0F5D16A069FFD742D1E589F546C4F2EA3DA0A56F984CFD93F5F2912FB1D068F2BD7C1B5E979ABCC62E3A0164445398F5C0208E82B99AED1200D36289B1FDBBF03E43995341AED3AD712CC7C7530C751B40B765073EE4E4CDD411AE543AD5E2793F294320E9791AB35AE1697F23EBFA0280B8041859909B0089C101D7CC429408FABD2E073FCA7F2C2886031E9F6A32F2B596A799967BA8A47E87DCC8854D45DDB6DE39160600EB4235F4E3424D75DDC8CCF041AA05B25B5A3811540EA5B77CD8D7D611A63BEF5C26D57475B28E961645AEE0B9C8D47954FAF634017787A21A671493E7C5F1A4C553E0A68DDD726DB1DED4321DC735332FEFDF2A84C22097AB3552F878E304598EC40EB349E1C1AE416F94112A2CF8E8702A4C3BDE2F58245166550FC238E153D10F90652518B1D84CCD3ED836F150F1FF103976E743137DA5A97A61276DFB0C11D071B240069582265A9CAE4987B6C6B017DCD1594024D7B1336FF141E59936EC4CE5410E1B73BA6FB42D35F8999225CB1A135260967F4F6EF2172D53FA6AB6D1A2E3174B46C24BC103BAF69C2128F093AECEEBE8753EB352E2804EE64AE5140DF1ACDACD8F225B3C9A61264245B8E5CF759CDDD75E25E2D790FFAE8421515E0CD6F279D0080A3F80BB2E0729C0D2626B6ACE31CE20BCDA490C7660D04D1D82E6403000578926C52D8F9A4BE7103D64E0F03E8F148BB2236781EC30F6D8BC827C107FCC40F26DDAD485E6135BDC3BB331BE139A07891717B692E23312D0E5B1C41F30C3B4B4700EFFB481A835AB54340269FFF365FF87F58245621ACFD83B7FCC6FF108132D8966F9836544354F7E216FBBB851F390DCE8A72362F0454730B90D35AB3859763AEE35668310FD501C7501F4599563006AAEE9B636B676F3DBB6787317885B0F4A64171BF19CBF2EA7A625E1563032C196E1292D82C7484817DBF78D8E9E478FDC4C92CBEF48D4CB4F0E6DCDCA6682DC0A56C3E45EA0350D9FF88073748305FD7DF3A3BE8C055CB1C55167560D5C99345BA80C21CE791C4A511E384A02833B78E8AA02B1B877A9B8D806978519D716C611DF54AE8EA2691540E87C6E79EB006569E02745021BDC7852E1FA4177E2C3EC89257618B38719CB07B0BA68F600236167F019694959C2AB6FB39D5890CB176F6ACC3B9656E495C07027E3D4DE781F48C1F1A8AA1B41449689E191E495FF3F263DDAAA8DE0DF6F1A4AA3EF1F5EDFE437BB74BA +pk = 1D5F2CFD5740E1D0A2CBE66555A31F0A8823FDF1763B3E04A5D8A54F7A25041B6282359B6355F199FB341F0CD7D8502E735C419ACCE4854A51DA3016A63C74007886A8DDEC383667A76C53B510EAA89A0F74891B85BEF7BF11E203619254FCBCE21DDC3946AAB5E10E5B6EBB651CD45C290C72317D5A2A69D23F7016177DA90111 +sk = 1D5F2CFD5740E1D0A2CBE66555A31F0A8823FDF1763B3E04A5D8A54F7A25041B6282359B6355F199FB341F0CD7D8502E735C419ACCE4854A51DA3016A63C74007886A8DDEC383667A76C53B510EAA89A0F74891B85BEF7BF11E203619254FCBCE21DDC3946AAB5E10E5B6EBB651CD45C290C72317D5A2A69D23F7016177DA9011165DA162647ECEF61BB86535A1C55B16AC0DA173726CE13F5EFBD3C420B34E588BF01000000000000000000000000000000000000000000000000000000000000A2F0D5D7485E6B14D140456F9E0D2C442ABBB8598FCE8C096C865757C6D7D9CE3AFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCDF280B78CB991617389D977D4BFB7FB56990276FB7E10924BD828E68B7EC4DB43FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001F7659A5843F6EB9F0750674DAA33E4747880E20C161671A4800320FFBFCA01C55039BCABAB196E6A2D25F68C7410B86E3F6B28B19A7ED88E2397D788F540956DD0F7AA8E02B5E485DDFF1EE8E3DA5B1CFDF96F25B90493B4E51B1B2D56CF301D41532958401E613EA440D827C4168734CF3D215131BDDE60EA8D82215016F01507895A411145B23FA1D992683ACB616243B91C09299EDCFB2513EFF76E4087F40EFC5F9184F32AFBC9C63B4C982D6730FA60D7075CF470B14681A1F04319CF25C244F0BB74E9ECB5D462AD8BF13DEDF078DF1C6F6856FDBC568116C57BA6F8D9F16E4F68010EDC3D9ACCE8165B88B95E8EB2CB6DFFD36A59B54C10D +smlen = 1876 +sm = DC9E948CD353BF04A5EC349607DDBCCB5C7A25EDB60E47E5438378C73B347A0C319E34EF9D5FF8CC915BEC602F15525144BC24ABC31BAB86D6080E24978C0B01B8577E96FC2BCA24EEFB0712E7E1CDD1BBB051D8330A207A7388801CC4E388B1F17ECB3CF88CD614A13004E24FB73AF55C582DEAB50DAF205DE673D9AC94680100027B7A0E761C339889676241038C510F0ED96C9958B6A48F181986EC938736B51E5EF953B6C98459EB9B32EAB83AF3F45032A4C9A0C840D6F72286B5E6A6B0880D4524629AB9D9105D40BE2C4D61CF9EC079FDD5825777599CB96C0CC5447CF81BFE4A8AA32BC189E23CC16E8C499AEC44C9D05EC48600EB0999D656C43FCD981907C5E14137D1977591FE0A762B6E04B706518332451ADC5210CB90C22C9823001309139BA17ED7B476DBB1CDFE3C42B3A57AF5BBCB3BE19ED04D6C3072FDFE917ECB9272D59EE89EF83522531D83AFF8B9934A8423315C350D1481A4B02980DC29E1CB83B76623869649AC40EF297B153B679C327BB251C6E6BC169C48ABA2A439F9EA24EF94656A415C3E86D7BCB43CB3717D54D773F1937DC8B0E02D4E6ABBB1C83FE73F1B221C9A359E454C19DE5E71EA4CB8C560EABF1DA133FF20D81785D2ECD935B99F24840761446C324DF81484C5C05045C0949DF8D0F10F942E1B5B79074B358C25B6EC2B0B42DF65D998B666CF1BC568E7D737F22FF541807BE95ED85A9980E940E24D2C506BB0F9BEE32EFFD85A2017DE694F61BCC2B292595C97FF4C2145E48AF8F0F3D71763B4DB433ED7BDB8DBF8643475FB2B9155F0CC6A0048C5546900792BC01EBA4B06C83A0C447EA0CF05410DE55ACB8E5521829C89BFBC084CD86E7CA3D701283B70F78E1CE9C3888AD2689E0EF5593D656285066F319E155F86C0A71256484F42A0C40E7CF13AF0CF77C6D1CC7231A48538E9060A7863B774C9CC65E321E45AACC002C0170EDDD18CC1424159D46BF99D08A28D2DEA8917D28D91A1D6C409D945A5EEA19413A1ADCA40DE9458FA6BDF1E5308EF9E67E1E90E9D92BF19B5351FC49DFF0A31E035038AAEC651C0F20F276E4EF0EE35C14BB625EB34205516D95ABEAA06A7A3BB3AF2F12236406689BFAB11E65FC63EBC5B944818DD1D53C0E7B88CE7AEBAE581D995AE7D8423778DFE20D6CEA7AC0B1B4EFE2B9D571DE77BD8F71E89D9F6A2DC89103B73625887AB376BD12CE89A65E6280515A44A80D6C32799669260167DA0A214AD0FB803930AB1952D93360B54433CE8220B29339DCF2702581E88952A5A1549DBA11F4CCDB6FEFD6D24522F3207796C8D5BA9D1582F888F2500964F2B975AED5D5AF83409FF9720EDCF5CE3FE9B6B586B08DE21956E7970D8DC28F6208A80F5378ECBC506333A1D98C58EB0E2EB0CDECE0F5D16A069FFD742D1E589F546C4F2EA3DA0A56F984CFD93F5F2912FB1D068F2BD7C1B5E979ABCC62E3A0164445398F5C0208E82B99AED1200D36289B1FDBBF03E43995341AED3AD712CC7C7530C751B40B765073EE4E4CDD411AE543AD5E2793F294320E9791AB35AE1697F23EBFA0280B8041859909B0089C101D7CC429408FABD2E073FCA7F2C2886031E9F6A32F2B596A799967BA8A47E87DCC8854D45DDB6DE39160600EB4235F4E3424D75DDC8CCF041AA05B25B5A3811540EA5B77CD8D7D611A63BEF5C26D57475B28E961645AEE0B9C8D47954FAF634017787A21A671493E7C5F1A4C553E0A68DDD726DB1DED4321DC735332FEFDF2A84C22097AB3552F878E304598EC40EB349E1C1AE416F94112A2CF8E8702A4C3BDE2F58245166550FC238E153D10F90652518B1D84CCD3ED836F150F1FF103976E743137DA5A97A61276DFB0C11D071B240069582265A9CAE4987B6C6B017DCD1594024D7B1336FF141E59936EC4CE5410E1B73BA6FB42D35F8999225CB1A135260967F4F6EF2172D53FA6AB6D1A2E3174B46C24BC103BAF69C2128F093AECEEBE8753EB352E2804EE64AE5140DF1ACDACD8F225B3C9A61264245B8E5CF759CDDD75E25E2D790FFAE8421515E0CD6F279D0080A3F80BB2E0729C0D2626B6ACE31CE20BCDA490C7660D04D1D82E6403000578926C52D8F9A4BE7103D64E0F03E8F148BB2236781EC30F6D8BC827C107FCC40F26DDAD485E6135BDC3BB331BE139A07891717B692E23312D0E5B1C41F30C3B4B4700EFFB481A835AB54340269FFF365FF87F58245621ACFD83B7FCC6FF108132D8966F9836544354F7E216FBBB851F390DCE8A72362F0454730B90D35AB3859763AEE35668310FD501C7501F4599563006AAEE9B636B676F3DBB6787317885B0F4A64171BF19CBF2EA7A625E1563032C196E1292D82C7484817DBF78D8E9E478FDC4C92CBEF48D4CB4F0E6DCDCA6682DC0A56C3E45EA0350D9FF88073748305FD7DF3A3BE8C055CB1C55167560D5C99345BA80C21CE791C4A511E384A02833B78E8AA02B1B877A9B8D806978519D716C611DF54AE8EA2691540E87C6E79EB006569E02745021BDC7852E1FA4177E2C3EC89257618B38719CB07B0BA68F600236167F019694959C2AB6FB39D5890CB176F6ACC3B9656E495C07027E3D4DE781F48C1F1A8AA1B41449689E191E495FF3F263DDAAA8DE0DF6F1A4AA3EF1F5EDFE437BB74BA + +count = 48 +seed = CF5A04DDB5EBC45328F703D486D24443A7692D65AA55F054E3078DB76A7939590A3F35CF1A21E82A845445DD1B64A85A +mlen = 1617 +msg = EDD4DA833528B0511534F77857FFD16EAFB1A2AC87E6844612DBB104B9F32025B7F54E993D65CE85A061B6AC6D70A15BB42BBBBB6E2E21AEA55BB8A556120EB15EF35FD9774FC7B5C2894B747D3E4965B77DD8D5B26F38D413662783DCD332765B4DE534D08D6514CA9DC6ED7F2BDB4B5C437178710B04491708836CF2CCA08F28582107D27AC305EDE6030B1F8AADC4A1D29AD16CB4D739D8F813D47DA715CAD6B5CDE24EA95DFF4415B527DD900442D9ED1CA712C58B206D6E79F8AEFB882013358BC578638225BE79B58FB677277F072AEBCF8CCD6AB61A9D98A3B260E60AA625D78058FAE6028E4C5562A0F3473C3AD530BC4471228F27502A8F8FE2D1F72022103C3A2DEA363E68248ED8693B3B066B495561CF4468E8EBF32B454E54DF1766468AD3831D56EF7EB9C231E999C4CC3A6B0EBBF2C4F22820E256F67497427F53AD22D42C9293DC8682D0BE3517B63C6E871910ADBB3406B6B3B1CAD980AAE47BF9686E80B6E5DF2DACCCEAF9506B4667271779D00B4C1065951E21F2ACF6CF3CCCB8A633D1114CE9D531D94420E4AE496086638F031C0BAAB5722A41A66788D3885EFC7FE1C3DB54BC69E35B7489A0237A37AFE5194B5F424F792CC1D696098BCF327D87EBC50429A95ED82105C4328D0095A9775589FDB6C262FA51FFEE4D99C6D1A68FA661D1B6A0A2E0693D73B39218A6895BD83FC1D54831B7DF146FE7BD2A91B979018787B9904285A35922E22A7F1761BEA541EAF21D74E3A2F3C6F2247B042379CA4C553FD9256DD0C63E4C9DEA60912D02FBE4CE7762069A86CDE02A4E1E311B2AFDE435DA0816ACA659BD8C0650C1F118C0EA3622D72A5E96132F8B0FF8458C757648BD46E58195FAA0FC4FF8FA44238E35A25C9807B6229000EE560D8E085F27375C2F659BAA5FDE302B9529BF4699505C28DE33AB5DC2B8C02967947CD24C6A599ACB5C2D1E7D6BF3BCCEA0253FBE11D8043FED532AAFC9EE1151243BB80B92BE239BC4FD1D1CAFF502951205F2E6393B704E67141E1218963F664FE0759C15E6C0A1B40602A73990F040502867A9EDDBD4DB0E554AEA4BB9597949D5FB32C2E3AF92CF7816BEDAD5EDE1B769C823CABDEFCA1D1B85213C79EB03E065146B58E3BFBE80B4D4683B65AD1E0611372729B99A0B93934D52DDE40C19FED5A2B3DC3030E0B5F26B66474A5CCA6D741AB294BBBA6BE516105C08BDBABC97BDEC2141D035BF6C3A71553D6F6350229CA2626B8B0B56A24F2D6EECE436ECB77A70D747B6A6F830578B4792DE533879B174353424E7D0EADF6BD5A74B36A4E6EA7E39A4215559557BCE7A00FAAF0D1F81016F913A10F3C9F406C7CB53282CA8FD5FE4F5FABB96F891583E0507912BA02709764694296A5248C340A1B9EC3DB0F926F438CA96FECD40C4AD8DAED9B8A29691601835FE14283762236EF2135443307E5F0082D1C2180AE96ED0DD99A6E9172088E8B94AA2952BA5E128B202B2CBC1966E69B6E6384820D9AB624BC71788EA84B4ADFCFAA2EFA1DDAA8855D1DB3F58EEF2D54FE11A8A5D78ED46B58460E6F2FBA6CB70640700A4520AA1A2A9B336AEFB17CDE8AC78D67F194662642A0107CE38B74D731380A72AD4A0A068F09E0878E521F15CE8134780C3FD0CAB2DC2473448654F88BF1FE2020901B90C0ED670866B1BC337881292FBA885FE2BFEF6FE74765CA12372C8CBD698AC41A4C337374587DB15AFFB511D8C224F1743498D7173897FF5B8D070B89592BEBE053D5C10DCE67CA8542781AE749F3A42FAD7E4A2004A565F81D5FAECF11115C270155FB8AF6AEDA138B9C71458D6D2FF63441130EE9107C39260469521E020D2B42CB5A51098027F23890DAE8B28BF722AF9ABA6224E02FEB47E40112CCB164E8CF174BC9AC4C11AF9B482DF9C9F7F5F1B826428C21BE395EB1F07DE511E8258C84F5F035F4787ACE18C190808EFE99FCB455A54D366DDE2E230B575ED5A4A75D57C9A38DDE3D91D0D1A1C4DE7F277CAF23E0C5DD8E3B693DBC66B6BF1679B0AF74A2B9065B64CF0978115CC456AF685B22D85135727A8AAD96338611DC109B36C85A92E4A0180AADD1D25C5B3D4C681A44BACB953E50F994FCF5281366CDEC0CC50976074D91840B5079180CF643184ADCF9E4CCB44328E7BB9EB2BD06DBB7A757C35EC3DCF795A5E05ED250159EC453A1692426F624CC0737F691E475804F155E44293151E42D3C0F115ECEE53C6EEEF69788F7E8E5C422BB102237499F2638244C0C080B3639A49FFC1730EBB0CFD8A46 +pk = 9C5F4AE908CCF4098BFEFDCF92395843B8AC489FAD07033B84DDD56BCE06875CE0B1FB21E93A7E7CB91D522337EA6965F9BCBCC3205D35E38D636AF068E8F500A87046DD38D2EAE4084DB14DBAAA9932CEBCDC0684062EF65ED7DD8B5B02D8F811AB914114C2337361CA81512DE3FF0AC449EA32D25C8D4CE66F923E12C5C30004 +sk = 9C5F4AE908CCF4098BFEFDCF92395843B8AC489FAD07033B84DDD56BCE06875CE0B1FB21E93A7E7CB91D522337EA6965F9BCBCC3205D35E38D636AF068E8F500A87046DD38D2EAE4084DB14DBAAA9932CEBCDC0684062EF65ED7DD8B5B02D8F811AB914114C2337361CA81512DE3FF0AC449EA32D25C8D4CE66F923E12C5C300042169B2FDFFA7C6E39BE429B7B0645C6F500E3D9AE537229D63E4CDE27459830FEF0000000000000000000000000000000000000000000000000000000000000050B09F5C101AD458D12E873578D67B57CAA145095E29F104D822A5E3F6445ACCC3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC19B4A73FAC5EBBA3C56975D0E5CEAF55775F22F5F0316A7AE282B747181DE65A8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087A4074F9F413C96907E13D621EDF95F5D12C30168D8EEE6369D857A8546D538BC43B71368659BB60FB73DA67B68A6F8B3074E833DF4975B1CD68F0BE6D50CE3D165FF3308F62361475EFBE3D5D8F73A63C5A58C626DA0E4188C632032417C401DB752A5427BAF2308D37581ABD6288F0F95B6C7F580E9DB7AAE2C6E3A05C3D7603915E0F98AC01A57C25F379E8D2A39443843633ED7D2E624019BCB279CC2EC1857AA908AE1C3A942B5FE7C89EE9C0A7DB3890D270E1DC59A77F1B20E32CF415A41444B4BB63C341DD560A3AA080F4FAD607A4F5F56615FF25C541E0CFFB2C710A873F35DFB5D8BA6D08A2E8508C31EA0B5023F2E0A51DE63336203 +smlen = 1909 +sm = 8B34BBB1FD27608B7575D31C5B5C0F3825A22C61F15890964B13568B0CFC897D9D8EBC72E733970DF6FF82193FA0F25514EA849D1FC753B19DC75B25E9523300578A4C42565D3038720DCE8AAAEDF43ADC2441AA969DD0CDC22134996DD1A8B139B73B8FD85ECDAA7D7D31BAB31DB87D22D9FDF86695DF8BA02A108019147C0101009909F3FB6CDADEFC6520F2EA4E990BF37634F9C28138D70B53BD521189801B04E019522B07B96EE76C4D31DECD13B15E630207CC465D0BD4F741CF7B6A431E2D8B66278B7302376B007CA659044ACFF90AED4A70FEF6BD041E4B37D000DFE200FFA45A011ED56DFD6046E1D10589EBB3BAF24551A4F38AB914AFB445D591F011022309D469BE2BAF076B72E1F312F2194E12DCD199EFD68BD7F57D966F4E13000902EDD4DA833528B0511534F77857FFD16EAFB1A2AC87E6844612DBB104B9F32025B7F54E993D65CE85A061B6AC6D70A15BB42BBBBB6E2E21AEA55BB8A556120EB15EF35FD9774FC7B5C2894B747D3E4965B77DD8D5B26F38D413662783DCD332765B4DE534D08D6514CA9DC6ED7F2BDB4B5C437178710B04491708836CF2CCA08F28582107D27AC305EDE6030B1F8AADC4A1D29AD16CB4D739D8F813D47DA715CAD6B5CDE24EA95DFF4415B527DD900442D9ED1CA712C58B206D6E79F8AEFB882013358BC578638225BE79B58FB677277F072AEBCF8CCD6AB61A9D98A3B260E60AA625D78058FAE6028E4C5562A0F3473C3AD530BC4471228F27502A8F8FE2D1F72022103C3A2DEA363E68248ED8693B3B066B495561CF4468E8EBF32B454E54DF1766468AD3831D56EF7EB9C231E999C4CC3A6B0EBBF2C4F22820E256F67497427F53AD22D42C9293DC8682D0BE3517B63C6E871910ADBB3406B6B3B1CAD980AAE47BF9686E80B6E5DF2DACCCEAF9506B4667271779D00B4C1065951E21F2ACF6CF3CCCB8A633D1114CE9D531D94420E4AE496086638F031C0BAAB5722A41A66788D3885EFC7FE1C3DB54BC69E35B7489A0237A37AFE5194B5F424F792CC1D696098BCF327D87EBC50429A95ED82105C4328D0095A9775589FDB6C262FA51FFEE4D99C6D1A68FA661D1B6A0A2E0693D73B39218A6895BD83FC1D54831B7DF146FE7BD2A91B979018787B9904285A35922E22A7F1761BEA541EAF21D74E3A2F3C6F2247B042379CA4C553FD9256DD0C63E4C9DEA60912D02FBE4CE7762069A86CDE02A4E1E311B2AFDE435DA0816ACA659BD8C0650C1F118C0EA3622D72A5E96132F8B0FF8458C757648BD46E58195FAA0FC4FF8FA44238E35A25C9807B6229000EE560D8E085F27375C2F659BAA5FDE302B9529BF4699505C28DE33AB5DC2B8C02967947CD24C6A599ACB5C2D1E7D6BF3BCCEA0253FBE11D8043FED532AAFC9EE1151243BB80B92BE239BC4FD1D1CAFF502951205F2E6393B704E67141E1218963F664FE0759C15E6C0A1B40602A73990F040502867A9EDDBD4DB0E554AEA4BB9597949D5FB32C2E3AF92CF7816BEDAD5EDE1B769C823CABDEFCA1D1B85213C79EB03E065146B58E3BFBE80B4D4683B65AD1E0611372729B99A0B93934D52DDE40C19FED5A2B3DC3030E0B5F26B66474A5CCA6D741AB294BBBA6BE516105C08BDBABC97BDEC2141D035BF6C3A71553D6F6350229CA2626B8B0B56A24F2D6EECE436ECB77A70D747B6A6F830578B4792DE533879B174353424E7D0EADF6BD5A74B36A4E6EA7E39A4215559557BCE7A00FAAF0D1F81016F913A10F3C9F406C7CB53282CA8FD5FE4F5FABB96F891583E0507912BA02709764694296A5248C340A1B9EC3DB0F926F438CA96FECD40C4AD8DAED9B8A29691601835FE14283762236EF2135443307E5F0082D1C2180AE96ED0DD99A6E9172088E8B94AA2952BA5E128B202B2CBC1966E69B6E6384820D9AB624BC71788EA84B4ADFCFAA2EFA1DDAA8855D1DB3F58EEF2D54FE11A8A5D78ED46B58460E6F2FBA6CB70640700A4520AA1A2A9B336AEFB17CDE8AC78D67F194662642A0107CE38B74D731380A72AD4A0A068F09E0878E521F15CE8134780C3FD0CAB2DC2473448654F88BF1FE2020901B90C0ED670866B1BC337881292FBA885FE2BFEF6FE74765CA12372C8CBD698AC41A4C337374587DB15AFFB511D8C224F1743498D7173897FF5B8D070B89592BEBE053D5C10DCE67CA8542781AE749F3A42FAD7E4A2004A565F81D5FAECF11115C270155FB8AF6AEDA138B9C71458D6D2FF63441130EE9107C39260469521E020D2B42CB5A51098027F23890DAE8B28BF722AF9ABA6224E02FEB47E40112CCB164E8CF174BC9AC4C11AF9B482DF9C9F7F5F1B826428C21BE395EB1F07DE511E8258C84F5F035F4787ACE18C190808EFE99FCB455A54D366DDE2E230B575ED5A4A75D57C9A38DDE3D91D0D1A1C4DE7F277CAF23E0C5DD8E3B693DBC66B6BF1679B0AF74A2B9065B64CF0978115CC456AF685B22D85135727A8AAD96338611DC109B36C85A92E4A0180AADD1D25C5B3D4C681A44BACB953E50F994FCF5281366CDEC0CC50976074D91840B5079180CF643184ADCF9E4CCB44328E7BB9EB2BD06DBB7A757C35EC3DCF795A5E05ED250159EC453A1692426F624CC0737F691E475804F155E44293151E42D3C0F115ECEE53C6EEEF69788F7E8E5C422BB102237499F2638244C0C080B3639A49FFC1730EBB0CFD8A46 + +count = 49 +seed = 8C3D2FBBE0D39E293AF2D2CC5A9BEDEAAE3752DFD19CDC1E186D41E717A0412AA429CBDF005445AFDE684656B5D17690 +mlen = 1650 +msg = D868EC985F946F3C31B6CFE4811BA530EACD0ED061EC383C203B2481AC697B8B88BC0F72B635027E443AB1F54478440DE16E596D30A0F1252E0AF54C0F382BBF5655BEA8C6B9A2F6382D003CC7E4D4F223F8E35EC87CC543EAD52E0E1ED956CFB32E8075715C07CA4817C4B8DACE68C8B0DA459271746BE41D6102B3FA5E49AEE8D443E78AD3246D0B9BCCF6AB7CB7CF72B8A847CA16B435F0618594400037179441F3BF524231F747D920E86506E84C61D4D038D42E82D52D97ABFF896C1DB1C646807156324F7B68DB620EE435C7B8C9AC8B193B7C892565C3631E297495BD3B59293F9A9CEA5E29E23A242B81DD05C8DC9DD669424573298C85870B109C7B593BF864B56895D81386466CA5CB6071005781FB214F1EAE9672D0D16351A627A3FAAC49BE4E13D552340328323CDCB4703BBE07C2A39D75D7737D5C1BD04355B8694432DFB7CB4F1901550C7D6F41080C0F6A2CC49D63A69243D137A78260C06E7A53AAF4F4B086E0220EBC5361A6A78C9B2EC09C2EA4EC45A41065B4B2DAA866D9BABD71C8E6CB378595F068EDB258B2AD1F420B304E5924EBE273AD6D00684F75B6A31DC5290A37D0F9A848B1FC4A67DD9A4FB1F9B4C6CD45E87FAB4A09129C9AB95C44703B75B54C9EF9E825928ACA56527D79B338C5AC639D0265010F3C085D2B09AEF0E4F55D080FB5FF79F13E8E4E8DB020F4C095140D46A93F2E4811BFBC1393EC24F6B7EF31F13623DF0360B1E335FC42098CA1EFCD0306C5FECCE942F6E299AC9ED81054FE452D3F63991DA42D5680EEF749C02FCBA78DB5F4F7C734C6B4D99AF79711A0BAB723C24364AC85700242878CCA93465F286D5F7ADAD7F68F1D38CD6C6E0575A36F1E5521E420D348D947E745C2355FB5FB0F12DC6FB5E9435CF8E552C174A617151AF8D5E7D469AD5CD741E16EB88EA6D7C5806B08571697D22A525C2E30DFF608C921B955D2A990D9466829385DE0A81875BE564942AE740D15AC0AF46A876426EBBE481738BE19BE06F174D975AE8DFB52A94AF9A77E56267C0BB62169165ACE155041406CAF507146A02FB760629CC4C0E7D29108CB7C779455A3EF359BB6198AC75E16148998C16C9410DFF2DAE5F3C79DA61D371992D4A151BA91DAE8814C81EEA4F78D23871326BAFAA349C8EB57231B590F1AC13F599DF5B39DF36455F05E53CDC4D025410E8F8F8BB74854FEFE0C4F790F58434309D36C1E7F3935D4F896368C91AF95EC2DF292AE3166B83976ABD95089B05B461D4E9171CBB4747F3CD9BAB04E5A3B98095754021229B4B820EBDE63E463F2EE479FBFD83CACC61878773B129CD4B3E9AFBAEDB27C7FEDEC2F2D405B99933FE2C203D9949C567A7752AEF8A7788D2375900E70315823DACCD4F2A674196835C35EF813826B310346ABB16B0145CD70FD0A04611ED5AD0B8DDFCA6EBA6B93445038C3DD23D3D15E8899F9C889AF417E5662D538E466447E514A8897C21FE0BE2EF18948B66EB04051C0BC961FA485422A66D649DFA86D4B3DD504A89919A9928EF96FD467713DCCC1F19EE69CE3935F0416D9C5752B7DCF9272D2DB86C3EB6F4897D94DDBEF7C483FCC66232E535A8B0A5AA4BD443493FE539A32D433D9E89F7758DB5B0606A96455B39F92AA788FBBE43CEC8F1D36FEA3ADFD0353EA5532B49A7286381D985E018E6534005F605BF67AB4AAAFDCC499AC0882FCD9D90BD88053CFDADAF466E536F2FFA7F18B3DC254E42FFFC777E0339181473E2B7FC844B687ECCC0EB543A54211084B1EC06B0D9EB0A0C96B88D6585F414873C13EF7002AF2D47D5859A23D12A7D401FFD4BCF642DB96C70FDAD0CB03A6098437795BC9C7C6C804A26225EAA53F52747F01DB4E62471A21DBC1DED9C4DE2508812AB11F61F6364FCFEED445FFBA549E45E641A80FB4B58EE20677C7D6CF0526DBF4E26D9E5AFAC5429B4474DFFE709D09D766542D65E668D59C836BDFD0F78B846BC412F29DA00291871D94BB5E6557D833C8DB3D9BEB37888C3A70684ADC6B063FEC3D847C42E0CE20E05482DB165FFAC5D1F2C661B9DB6D19FB3E8909587351B25F2C225CB26BB137BC52D04AD8157F7D634F29A3623B4EB53B4EF9A78945280BCA8C5E1882FAE373EAC69EA366E2F13A9FEA75A6B7EB5CD4D9EB14F68A231BAC780F84200146CE7795282952382E2393F0C2A99DE830D3AA517DAC4AC97F2AAD3F7F8E3B49B22B078E3708C9CDD1B2A2A129656066C0030D747EDD646384611D4ECCC5B0B9DF4852AF7BFA94F6DD7584F6285CA2EA7ED3F8DECB534E6D31D7165C609FD9AD235F5AF8E4E8E58FD3D248D822C202 +pk = F0AFE8776A7C268D189E783654C540D88D8FAAB1CF9B77FC361EC2BCF8F427C0CB3C2DFBD4217171476D011E6AA8C2F272C8668A582E4A4C44DAE74A969A9B01C3EA125CDB2E93FB1BE9409F031749AC35462EFA8A80A3399EBFF7B3E9691596A206C2A392A3344114855EC744BCF676A4D0903FCAC8E6BDBEECA4E8183513010B +sk = F0AFE8776A7C268D189E783654C540D88D8FAAB1CF9B77FC361EC2BCF8F427C0CB3C2DFBD4217171476D011E6AA8C2F272C8668A582E4A4C44DAE74A969A9B01C3EA125CDB2E93FB1BE9409F031749AC35462EFA8A80A3399EBFF7B3E9691596A206C2A392A3344114855EC744BCF676A4D0903FCAC8E6BDBEECA4E8183513010BC3EEA267BCD7119E8A4585626384800F11E615A21B496905CC17358CBD97B5931601000000000000000000000000000000000000000000000000000000000000EADD700658A4EE7C4200E150354C68F5591402A6CF99C72826E4BE341D688FB83FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0BC364E104F6424759C0D3A3D682BB56B84BB0C543FDB05BBD1B84187DA77B43F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000789CCDB02C83379904E5734A01570E20FFEEBA68B4C854DD2BCE378119454CCCD21908FB8C7EC6C8F94328519E06EECDB1D4AEFCD55662A63B8BE48E79600F0B5B0F6365B922DC4A6B3301FF285C0333F04E7EAD78521E508540C249556D7B3CF2D2374F7625EED7A8724569ECF1E1CD3530F1C3673BC7D4252F7D6B67007124022F28D2B65B7C8E9F1298E3B6984BF078D004D76ED685ABDEB47EB308DED94CF5FC55135BDA6C0B0EA30FD2389CD9B66D5F25EE8F49539E9942D89202F56FB49A56B55136CCB37A32220C99197C6444A7F011145E8F43FE5D1C9A1716F4BB0AD918104D9ADC602A5E8AF854D7F244663ACF86711509C784DDCAF208 +smlen = 1942 +sm = 7FFA98CFE0776341F2D6D7E9814B179C9378D500B8B386F7A394B528242B6B87505C1101910ED69922664FE0FE86CFB6A626270239D3FBDB425D42BEA8E385004B260725ED9143A9A74912232DAA0A31371CC2DCAED29751CF7728796CE4BF035A6CE77CCF8B71C5B51509418D1D9ED335BA8A55AED3AEB2DB797D8D4EFFAD000001E96CA84E10E1667858E1D5F145C08D1C0FD6D7B3D7901FFE4BBEC2AE9862E958566CBD276ED4823A11AD7EAD2B91040594EF2715CD209CFF7C40677861516D71F32BCF4546B85377C4F5C70D14D9270C7DC8F15F05D8543BF04DAB099F795778D8AEB66A9E017A0F3B4E53AC40A29F022A34498CA73138C105612E3FB2E93E6D80D630A975055B141F0C0CE22BE7786E2F77AA8C5CE2A09FEACE6DD6A79007000B04D868EC985F946F3C31B6CFE4811BA530EACD0ED061EC383C203B2481AC697B8B88BC0F72B635027E443AB1F54478440DE16E596D30A0F1252E0AF54C0F382BBF5655BEA8C6B9A2F6382D003CC7E4D4F223F8E35EC87CC543EAD52E0E1ED956CFB32E8075715C07CA4817C4B8DACE68C8B0DA459271746BE41D6102B3FA5E49AEE8D443E78AD3246D0B9BCCF6AB7CB7CF72B8A847CA16B435F0618594400037179441F3BF524231F747D920E86506E84C61D4D038D42E82D52D97ABFF896C1DB1C646807156324F7B68DB620EE435C7B8C9AC8B193B7C892565C3631E297495BD3B59293F9A9CEA5E29E23A242B81DD05C8DC9DD669424573298C85870B109C7B593BF864B56895D81386466CA5CB6071005781FB214F1EAE9672D0D16351A627A3FAAC49BE4E13D552340328323CDCB4703BBE07C2A39D75D7737D5C1BD04355B8694432DFB7CB4F1901550C7D6F41080C0F6A2CC49D63A69243D137A78260C06E7A53AAF4F4B086E0220EBC5361A6A78C9B2EC09C2EA4EC45A41065B4B2DAA866D9BABD71C8E6CB378595F068EDB258B2AD1F420B304E5924EBE273AD6D00684F75B6A31DC5290A37D0F9A848B1FC4A67DD9A4FB1F9B4C6CD45E87FAB4A09129C9AB95C44703B75B54C9EF9E825928ACA56527D79B338C5AC639D0265010F3C085D2B09AEF0E4F55D080FB5FF79F13E8E4E8DB020F4C095140D46A93F2E4811BFBC1393EC24F6B7EF31F13623DF0360B1E335FC42098CA1EFCD0306C5FECCE942F6E299AC9ED81054FE452D3F63991DA42D5680EEF749C02FCBA78DB5F4F7C734C6B4D99AF79711A0BAB723C24364AC85700242878CCA93465F286D5F7ADAD7F68F1D38CD6C6E0575A36F1E5521E420D348D947E745C2355FB5FB0F12DC6FB5E9435CF8E552C174A617151AF8D5E7D469AD5CD741E16EB88EA6D7C5806B08571697D22A525C2E30DFF608C921B955D2A990D9466829385DE0A81875BE564942AE740D15AC0AF46A876426EBBE481738BE19BE06F174D975AE8DFB52A94AF9A77E56267C0BB62169165ACE155041406CAF507146A02FB760629CC4C0E7D29108CB7C779455A3EF359BB6198AC75E16148998C16C9410DFF2DAE5F3C79DA61D371992D4A151BA91DAE8814C81EEA4F78D23871326BAFAA349C8EB57231B590F1AC13F599DF5B39DF36455F05E53CDC4D025410E8F8F8BB74854FEFE0C4F790F58434309D36C1E7F3935D4F896368C91AF95EC2DF292AE3166B83976ABD95089B05B461D4E9171CBB4747F3CD9BAB04E5A3B98095754021229B4B820EBDE63E463F2EE479FBFD83CACC61878773B129CD4B3E9AFBAEDB27C7FEDEC2F2D405B99933FE2C203D9949C567A7752AEF8A7788D2375900E70315823DACCD4F2A674196835C35EF813826B310346ABB16B0145CD70FD0A04611ED5AD0B8DDFCA6EBA6B93445038C3DD23D3D15E8899F9C889AF417E5662D538E466447E514A8897C21FE0BE2EF18948B66EB04051C0BC961FA485422A66D649DFA86D4B3DD504A89919A9928EF96FD467713DCCC1F19EE69CE3935F0416D9C5752B7DCF9272D2DB86C3EB6F4897D94DDBEF7C483FCC66232E535A8B0A5AA4BD443493FE539A32D433D9E89F7758DB5B0606A96455B39F92AA788FBBE43CEC8F1D36FEA3ADFD0353EA5532B49A7286381D985E018E6534005F605BF67AB4AAAFDCC499AC0882FCD9D90BD88053CFDADAF466E536F2FFA7F18B3DC254E42FFFC777E0339181473E2B7FC844B687ECCC0EB543A54211084B1EC06B0D9EB0A0C96B88D6585F414873C13EF7002AF2D47D5859A23D12A7D401FFD4BCF642DB96C70FDAD0CB03A6098437795BC9C7C6C804A26225EAA53F52747F01DB4E62471A21DBC1DED9C4DE2508812AB11F61F6364FCFEED445FFBA549E45E641A80FB4B58EE20677C7D6CF0526DBF4E26D9E5AFAC5429B4474DFFE709D09D766542D65E668D59C836BDFD0F78B846BC412F29DA00291871D94BB5E6557D833C8DB3D9BEB37888C3A70684ADC6B063FEC3D847C42E0CE20E05482DB165FFAC5D1F2C661B9DB6D19FB3E8909587351B25F2C225CB26BB137BC52D04AD8157F7D634F29A3623B4EB53B4EF9A78945280BCA8C5E1882FAE373EAC69EA366E2F13A9FEA75A6B7EB5CD4D9EB14F68A231BAC780F84200146CE7795282952382E2393F0C2A99DE830D3AA517DAC4AC97F2AAD3F7F8E3B49B22B078E3708C9CDD1B2A2A129656066C0030D747EDD646384611D4ECCC5B0B9DF4852AF7BFA94F6DD7584F6285CA2EA7ED3F8DECB534E6D31D7165C609FD9AD235F5AF8E4E8E58FD3D248D822C202 + +count = 50 +seed = C10427EF0B26328163F85D45E22EC5215415326F013FF31EDD58BD3E97B1A72FF07D275D4C1B517F4661B0638F75640C +mlen = 1683 +msg = 4BEAF8CC3A7C393932CD37A2CD8ED790F05E4038ADF1287E2ACDCC0BED9BDBF92CE44AAE95CAF4EB142B858E1421610EAFC47DE566182835BDACD4C836F19BD686D53C3834EFD928487A2AB3402C2E3AB3AF97AA802B05223CA6927722C3BD1FE3F8C20F93C3951F907314896CD21CB99306FD7E5B6176945C2898B10C1DF62FBB2680752CABC8980B5A0430BE39D34BB7DE9544BCCCBFABAB709C11BFFF5C958C8763D8D5830235B49EAD26C834E63C3F3F2D6BA944FD2688F6350EC99DAF4CCCC42C6BE1CB19DD46514D71CB6E887DBA80EDB580B27F1142A20EA0D497E0336D55F1FFD4BB3D4B3521F0A01C7BB09258971D1ED4A98EC052B24776623D7B9A83C818795E3989EAEBA8C9142A97AFCE855CC6AC0ABA15F0546684AB5C2F48B23BB72A88B6AF2BA9C73881103CB6FA99E3B03119EAB03BC3B9BC365EFCD7B9F49A8BAB6A34A00AA8F2C88D7BEBBA808BD97111EBB192D82AD244E18BCA732FE6F72FDE5BD533E4BCCD3F50332DAD3A4169EA85C324D165413F10888AC3B21B91DE09FCBB9B636ED00FAAA669ABF6429B78C3C04F239722F31FB0B1A20CB1A6B553908070AC13521DF66772A6036E6695CF66B9A90E2111E499BCBF5DCD19744F43DEB943445248A5E84F168E7BFEA2DC4E1D0A87FB4140EB7C72D2DFCC27923206054CEC870888A79938DACBAACF1F122B22AB5C9701D777BCF9809CEBC9B7AAC52468134FC4A92C2BAA9B8C0F6249130A50337F460A42CB5364A5E7408CAEF8D12BA6934AB645DE9832818F9DB71F5EB0B158DE6A76619E75245B56020E1664D8FAF1C1782DE4A688D4055E07D842410600E9454E28676D44357853FFA7740200C91EAFA16BCA21D0006F47FE8159A733E0E91549DF434EF316E1DF9BB97DA6A2C2E2F20A65B3C00041A903270CBB55AE2432AEE25C71CE73BC2322CCB8E5BD0E24820616A890B0851D825D79411C14948DCDF48776D72565422056FE75765E50736C82F71270BBCF229A7B7A45DC88AADF4F84238C896DAB889E16C17DB7BE551AB24873FDA82F102D0FCFC139C9FEBE9FA99819CEF0E2684DFC5C843A6D496D8A595D33C51E1FDE9A84059C7BC596D32D53E2FE046F23FEFA51D13F9C28E227F5E24429B851ADDBF578922AEB0C5A61BBB666D11D127BA45C9E6378C70D75643DE776483582E034E81FAE0A3F029C47FB192CFA018CE1F68261D77CFC9E05EF19438E47F3DE9A68C8DC09D07B1BDC6CED69592623750F72EC2FB8C5CA981DFB84B4BF0734377EE9DD8EF5DDCD96F438D30AB78F402EBFF2163D43345EE8CA119F3208E21AA3A2185DE967B475B9ABFBC86465275F9A634FC22015E94A298E9C204E9786CB1FF14A5E99F942D42AB5DF51AD09654083DF0259AA1C26A760CCFDF4A276600C5FD3A54F210B20731941EB48A79435F1F86C45F8181D9758A1835721B87D36C725878375FEBCB8D48ED2CE8892DB50965753A98F4E7110281DB40ED64DD8EB51AB9CE41042589152D8CD5876FF30536F8955172A7A8F5C3F5FFD22C9954903136F781F0574F45F909BDF1657FC1CDCB9C4689F41E462C8D39108B10D78B6892C8775FDEB139258F8130BD1D2A1C72B5026506409F9862AA8729B35C652074494FEB84A553CEFBEED19D6EE94758E800F5FCBCAEC19B6A00F33EB237AAA6FC0B3A08C1D8829C180BF95E7D05F919A929933B7A032CD20ACE82AA5A45E5B2FB09812F36974B5EDA1B387FEB13BD49AC374F821341282C8FE2FB0CC5C075356833FF8CC6B648729A4298ECD73BD0EC73957077AC65722D0BE23C1536B8DB7B0506DAE47C0070564E7D7F9444F47B22C679EB8ACA4826F974A42043863E498E5301EA162C4E96684ACC5CA26CCD083541BC4C1D2FD690E51F07FB08337450A204B0F4F2C17785E037424FD6E78746764584D5F19255496DF1E524BFF0AAC31BDE9254429565278A39ECE4627C023EDF18BC21BB523D44EFC259742DEE9FF7159D5F700D957CCBB505A88C2037629402C2A322D17647E430777B184FF7B4E8D6B94724ABC36A5CCFAC08E2479E8310BCB7A617A25FAC6EFD10D0A07248F7D4597F14309B8064FE3BC4A4479F905E832210D49363D1E5D58176DEC9ABCC0C5132FD6ECCEAD2B05B56C96ECBBEB0B803E43DB2F982AD9EFE1E2A49649ED8E42707970C93615D54A3E673559B996E48A3B73143BA0884E918888156CA78F793DFF990FD721DE0C0B7916A5CED736E31292C5AF062D7CCD83FE653294FAC8C50CF6BA37B37D5A9BFD1E3B92D1825C1BE0795F9B257CDAB91CE99C0C51BDFCD6C0AB5A3BC6E30F884ECB4F1F61A3259CD279205B2C21CDDB196360061758E67B1C3724F5CB6311EB4FB92E6C0D71E6D1EA45 +pk = 42BB819A3C9C4D29F5CF202B083482818889A5CAB0B7243DB0F2C86756F6057E5CF7C9E0541A1340AE0F3D8FAA5D59E3E496D4AA1DCBA69B3F9F02668D2F1F01D7EC933069DBD0C0FE2FA251814CDAFCE0B807E9C5E28ADCAC02A8357EBB1DD65AACFE61E95FD15F7B8D0315ED0DD83E1807E7DA93F25A01C30D41739B8DAA0106 +sk = 42BB819A3C9C4D29F5CF202B083482818889A5CAB0B7243DB0F2C86756F6057E5CF7C9E0541A1340AE0F3D8FAA5D59E3E496D4AA1DCBA69B3F9F02668D2F1F01D7EC933069DBD0C0FE2FA251814CDAFCE0B807E9C5E28ADCAC02A8357EBB1DD65AACFE61E95FD15F7B8D0315ED0DD83E1807E7DA93F25A01C30D41739B8DAA0106519153F3E5490646809D5E210F6639E1D21BE3C0FF7EB4E0687AA6B680249E381A0200000000000000000000000000000000000000000000000000000000000032F5DCD6F069BA4903B91A52AA182610EAFD8D2BE0F5CE0AB388DC2A8973912281FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9113AA5D389013644C91CE3131FFA1B66FE203B47C02A4D973D28849E4241DF033FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020D1773D4E1919ECE776493FC44A9B052FBA6BD86E251BA3DEE926215A8BAF390AF6B712208FE7B7B05A082EB9178779ECFC6A58C2ABD8FE6958B2AA3E4709251F8DCF7490A5AFACA43F24D1AB234BB656DB95DDE94F40F0FFE772B885778F684695FA5C5D43CE62A7A082D7207657C67FB4ECB48131650121508195C10DF77C6A0DD4DEB4329DA4DAA577AD2DD83A8B01ADBB2F16235CF7500AB3EECAD09BC44776F6AA1A86B4B4A194877B0ED4D98D6B1652EA204DE4F4F8DA50B90EE6EBF65090B1DF678709692E712CD8D60383C8B9FDE1B1607295DF317ACF3A8E3A1BDACAC6508FA7FA4CEA8D19CEC1D4185E8CFCC0E055F5A4D33620BA8803 +smlen = 1975 +sm = F6EE2C0350EEE963E20FD65F1C413F7ACF207ECDAD0EACB45F325F40BC2B81681712B270BD84FFAB84FDF98ED5C6166051D404D050CEE93FF3F544C0EA8EE900F7336D7FD1F84659C740A3D28E3657A96052CFC01183B1F54C340FB982EEA6AD9C7E2A1637FDB73792D7F3634A130F0309736E9662C5195028FF57E1A89179010101982CA951EED2E01D9240C19A2837CF53E73AEA3CCAD108CC264254EBB203203FEB96286C2BD0F972E616F07B116BD86B6DD27FACE1572789E626EEDB1D52A8185A4BA0EF58D8FF310CC56DE318661C9ECEB8270F375FF57DF6EA9C84FD7F000AFA6E1260DE9C7F89396373275237FA442F32FA22C753EF62225D82DDCE54562088073AE2B3C951705E559752BC0F4BA7E90C3CF75806984D89A54B31B129200002024BEAF8CC3A7C393932CD37A2CD8ED790F05E4038ADF1287E2ACDCC0BED9BDBF92CE44AAE95CAF4EB142B858E1421610EAFC47DE566182835BDACD4C836F19BD686D53C3834EFD928487A2AB3402C2E3AB3AF97AA802B05223CA6927722C3BD1FE3F8C20F93C3951F907314896CD21CB99306FD7E5B6176945C2898B10C1DF62FBB2680752CABC8980B5A0430BE39D34BB7DE9544BCCCBFABAB709C11BFFF5C958C8763D8D5830235B49EAD26C834E63C3F3F2D6BA944FD2688F6350EC99DAF4CCCC42C6BE1CB19DD46514D71CB6E887DBA80EDB580B27F1142A20EA0D497E0336D55F1FFD4BB3D4B3521F0A01C7BB09258971D1ED4A98EC052B24776623D7B9A83C818795E3989EAEBA8C9142A97AFCE855CC6AC0ABA15F0546684AB5C2F48B23BB72A88B6AF2BA9C73881103CB6FA99E3B03119EAB03BC3B9BC365EFCD7B9F49A8BAB6A34A00AA8F2C88D7BEBBA808BD97111EBB192D82AD244E18BCA732FE6F72FDE5BD533E4BCCD3F50332DAD3A4169EA85C324D165413F10888AC3B21B91DE09FCBB9B636ED00FAAA669ABF6429B78C3C04F239722F31FB0B1A20CB1A6B553908070AC13521DF66772A6036E6695CF66B9A90E2111E499BCBF5DCD19744F43DEB943445248A5E84F168E7BFEA2DC4E1D0A87FB4140EB7C72D2DFCC27923206054CEC870888A79938DACBAACF1F122B22AB5C9701D777BCF9809CEBC9B7AAC52468134FC4A92C2BAA9B8C0F6249130A50337F460A42CB5364A5E7408CAEF8D12BA6934AB645DE9832818F9DB71F5EB0B158DE6A76619E75245B56020E1664D8FAF1C1782DE4A688D4055E07D842410600E9454E28676D44357853FFA7740200C91EAFA16BCA21D0006F47FE8159A733E0E91549DF434EF316E1DF9BB97DA6A2C2E2F20A65B3C00041A903270CBB55AE2432AEE25C71CE73BC2322CCB8E5BD0E24820616A890B0851D825D79411C14948DCDF48776D72565422056FE75765E50736C82F71270BBCF229A7B7A45DC88AADF4F84238C896DAB889E16C17DB7BE551AB24873FDA82F102D0FCFC139C9FEBE9FA99819CEF0E2684DFC5C843A6D496D8A595D33C51E1FDE9A84059C7BC596D32D53E2FE046F23FEFA51D13F9C28E227F5E24429B851ADDBF578922AEB0C5A61BBB666D11D127BA45C9E6378C70D75643DE776483582E034E81FAE0A3F029C47FB192CFA018CE1F68261D77CFC9E05EF19438E47F3DE9A68C8DC09D07B1BDC6CED69592623750F72EC2FB8C5CA981DFB84B4BF0734377EE9DD8EF5DDCD96F438D30AB78F402EBFF2163D43345EE8CA119F3208E21AA3A2185DE967B475B9ABFBC86465275F9A634FC22015E94A298E9C204E9786CB1FF14A5E99F942D42AB5DF51AD09654083DF0259AA1C26A760CCFDF4A276600C5FD3A54F210B20731941EB48A79435F1F86C45F8181D9758A1835721B87D36C725878375FEBCB8D48ED2CE8892DB50965753A98F4E7110281DB40ED64DD8EB51AB9CE41042589152D8CD5876FF30536F8955172A7A8F5C3F5FFD22C9954903136F781F0574F45F909BDF1657FC1CDCB9C4689F41E462C8D39108B10D78B6892C8775FDEB139258F8130BD1D2A1C72B5026506409F9862AA8729B35C652074494FEB84A553CEFBEED19D6EE94758E800F5FCBCAEC19B6A00F33EB237AAA6FC0B3A08C1D8829C180BF95E7D05F919A929933B7A032CD20ACE82AA5A45E5B2FB09812F36974B5EDA1B387FEB13BD49AC374F821341282C8FE2FB0CC5C075356833FF8CC6B648729A4298ECD73BD0EC73957077AC65722D0BE23C1536B8DB7B0506DAE47C0070564E7D7F9444F47B22C679EB8ACA4826F974A42043863E498E5301EA162C4E96684ACC5CA26CCD083541BC4C1D2FD690E51F07FB08337450A204B0F4F2C17785E037424FD6E78746764584D5F19255496DF1E524BFF0AAC31BDE9254429565278A39ECE4627C023EDF18BC21BB523D44EFC259742DEE9FF7159D5F700D957CCBB505A88C2037629402C2A322D17647E430777B184FF7B4E8D6B94724ABC36A5CCFAC08E2479E8310BCB7A617A25FAC6EFD10D0A07248F7D4597F14309B8064FE3BC4A4479F905E832210D49363D1E5D58176DEC9ABCC0C5132FD6ECCEAD2B05B56C96ECBBEB0B803E43DB2F982AD9EFE1E2A49649ED8E42707970C93615D54A3E673559B996E48A3B73143BA0884E918888156CA78F793DFF990FD721DE0C0B7916A5CED736E31292C5AF062D7CCD83FE653294FAC8C50CF6BA37B37D5A9BFD1E3B92D1825C1BE0795F9B257CDAB91CE99C0C51BDFCD6C0AB5A3BC6E30F884ECB4F1F61A3259CD279205B2C21CDDB196360061758E67B1C3724F5CB6311EB4FB92E6C0D71E6D1EA45 + +count = 51 +seed = 4B6B73E042CE76DBE39535E45D3BB2F3B9F8B2BDA170E76CC88666844703E32B2367460A0F6A0A2E3F4E7A6CD32BE998 +mlen = 1716 +msg = 0BF9A7C0F63CDCF3F850ED7C5DB6191EEEFE29E498A19F9D89BE4698821ABD72EDC34317B4F8EC2736DC83C24AC195BD55AFF00E797A83DFFADC7970FE53304F16F5DD92E6EC362B9E283E41EBF121FB2FA2A3F60124EF3EBF836AE51FDD55CA9F59B085DDD660724C072B86041B50A3A446CDB20A45BA65380ADF007E005DF2D9AA16A9D22B11DCF6F0B1964F04F45441A923691A15D80DC85003B9AE281F2B5983DD1A04D80A4D9C4372D9820BBFAE3AF7735E7C71E9F085C0A6E4BC107D9E4BA222B38FB236B2CC3A19DD6067BEAC460383FF2BCC771A7F1AAF092FC72C292FC1D5C6FC6B9715F1E1272EB22F8E0B33A2830E31BD6C531677902F6A95CABC3E9C1AE36F77037A785FEA355137A581FC14E6BD5F1F7AD1A5DD19DEDD448B47B558C22DD0FCBF296A812A726E7D1B57F4688D3F577104CFB15FC63C27F7B6051C7AED7D645186FCA63AD9C2D68BFF442466EFF76BCF0E398D2BF54C2CA4CC614839E9BCA48AB2CC53865803710A98D313AFF1DDD06A65680EB83C640052DB807EB2F38ED0CC211128044D331FEC3E6B0B2F3B675C631FDADE62C16D1719278413EA3F8E54BA34EDE7E73F3D94802D2F9CB9794D257C46679A3F00015945903190B97071F8FB55F8696253AA3F39B3FAD344FB88224F5313B43889B768171895F7AABEFF25E21E525EA01A996C764A3ACF12BFFED08F3F751F5CC094B50B325F8B62C7A5B3256964D48543690538E634E5730354358534B65EDDD44A526BB4B15E2042B6210F503EEE06D00D615CCAD10D73CDCBF5264B526674D85C0ED31BA5EE584F21FE6D13F883ACE4B094768865E43099E54671240E8E2AF8A7D7D22335B3974CE860E7238A7C1CA8A009EB51C8636F0659189AC8EF01C871E9008957CECE0A367B63BD2852BDE8690BD74C6D956435D0AB82F94A90CD00FC840DFC7036B84D51F1FF5076CA0974DB6CF25AF42EF7DC8C30C2B04CEB2510E86FFC510BF4C931639478FD1520AD571FA17958CCF8E37F5F6360030300EDE3A33871E9582808BDA2233996C5005FD0C23D99261F570AD9027767F6FC96D18BA98E8DDFC2B79AC12CDA5F2367B4BB6B99A3E07B59882E49A92AECE85339BBB18AB9644D20A3B2A795240492CE4EAF09D9EF728FB82B1DE7B64B5D391251FFB0699335CED8C7CE642FF1A79F04C3EA0DC37EA101188361AFAD236EB218CFBD1D0EBD784CE27DCBA0266DDEB87B59B66A4F75BB44665643FA358DD3D0B69B49F45A752B5C410E2299A62BE4B57B32B0924A069A8E8C15D754CC34DEBB0D967E70693A6FFA58CF7099C2C2458B437C7B205CC7E815F6CB494080F9EAF3017E5FF918558DDE415FF72E954EBC2ED4C20C8ECE38CC916060D22E582D54F74C6C181C2601400110A683F4A365E45FF1387BCE4E152A740136BB762B03A99FB68F6AB42620B2E3C00FA8D150944230A6330409B27E4AAD1693E2C3DD12216C4E2DDBC5E9CBA68B8B5417A7B2EDAE7EB67D25F4EDECBB087F93DC9C927C33076B1C71A2B83B33870D602562ED378805A690DD2A427D86C2C46BA4741F3DEFEB91A05EACE975C836E52868CFFE52CA92F97DE94768161A3E953BAB6A28016782909EC53C02F35184AA9CCBD5B793B525204B72DEB63E104376893B9452C3F2C492F423CBEF1EC87C85788CF3073FFBBCD67FF79BD038672943AE4BC68DA131DBA8D7B41C83B4E9CFB6931987B270C74919BBD40612F823114E4BB148671F1AA62BD2BDFCC8B0B24010EC112E883AEC9746D0F5DE467ADDAF51F8C070A359108B1F91643071438F098233AD9A94D0FAA665A39291A98D14A861905ECDE4755D00E690429C57580DCB6D51BB6186CE72EBB1FA8413892CAFB8713E89775013E546FDA30AEB8AF9F7155C08B25810C80CCAA5E700C124CFF59FA32E0293ADADBCC7B1A99F67E66B28DA614C5A4CCD706AFD05388C65EBCE07A543D3DC1E5A5D1F307F675728D4C629A04E9E455B4DA35236C677F26EDC622C1FBF29568D509EA0690AF4CB5DBB4E418B6162888E43B458774A31324BFD5EE8D2152E4AD43A3007D7D4AF5FDA172C2779837AD3A09E135DE953CE966727A7183BF77ADFC76430666B526692991D3C9DB5BB377552A7801C548AA63F6931D3EE91B875CDBCBB7441A4FF81F86762332D7192FBC2F7B69A58DB6CCD3558047F1940A1CACD6FA28A000B9795A2860394BF05F0120E6D85F96B1FE9DE14E3ED66A31D747924B6FF2620778E0714AEB34B79A5D935A0306E55C36506A292C5DC568403551907E49A43A6263D2915108916F1E27CF3529D1B7BD1544AF83A7CBE58547F192A93CE5C5BC6D652405FFCB95345F522B2D34E8EE0960BB85537A46121BD9A408D283A125EAA745BBAB04E2231C19AE95E13901C69E5C9C4D70B104478F4A70D64F81269A8 +pk = B2986782C3DDEDD3F12EDFD37320676124FDAB022B791E883EA1F3085F5BC0EAE730B11D422374571066925782289DF49E2FB9DA9ACF73261F086CC7A4F50700395F83AEF3B1B0DC40AC0F637EA809B46986E28C99943CB79AD1F2667E1CA77643D06EC881B37824995CD301F11C9C7051A50EC11E8EC20322FA72180BF4370109 +sk = B2986782C3DDEDD3F12EDFD37320676124FDAB022B791E883EA1F3085F5BC0EAE730B11D422374571066925782289DF49E2FB9DA9ACF73261F086CC7A4F50700395F83AEF3B1B0DC40AC0F637EA809B46986E28C99943CB79AD1F2667E1CA77643D06EC881B37824995CD301F11C9C7051A50EC11E8EC20322FA72180BF43701090F3B5B57EF281E5F1FD80455CC0CC4285200B6CACBA74CA7C9A8F2A853B45B628901000000000000000000000000000000000000000000000000000000000000D851FAFDD2FED6C0340FFB9A69F13CCADCD449543893A6E4D5729FCC747ECA05EDFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F01F779337AC23D0FA348B552B732761BF985C11A49CB4834768F9EFD56BACB31FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ABAA392C844E069327D2B671E4D5F7DDDBD4269633D765B7E43E038E422140315D78DE270D14A9D3ACC823E8B7027733CF2B5599526D6CB19E34CC110CEC07662C19B5ACA10DE3043452DB787830926DAFE53F15FBD6F4C238AC61FB31E996B6BEA24A64E91A88C297D0B19CB672B3BAFF51FAA62E90013C2DD477793705B250BC7E7F630E1DF83848A6206C714DD529597232AB03206419D1E344D8A2F86694EB0D60FF5F07BA0DDC8A9FBD69CBE1A27B89AB4323527A52A0137009063102A5EF9B6FBDE3EC9E68DF69F61DCF2952A48DD4954E991D406870F9A8083367796F125ECB0AF81BB5911AF924DAB91A442F3D33489570D202326188050A +smlen = 2008 +sm = 1C3A9A549ED52D965D7CD3FFB014B571C42E9783D3F439D6C962023EF4DED81CABDB01AAE03193A7F4FE5698D66B5D8E30FE3049B97862F84D9AFD83AA830D01AF76C8EAED18630FA7E6F4597312229502398B940783D58629495A44664AC5AD5D35567FCB7CA35C21562A96FED197A67D75713D1A29CFDF9127DEA0885AB2000001808880C2F4E44BE6C3D610D5226CF4523E8B38B33DA82D58D6AFABF2E485144779A9461F1FDCC074AF5F8634017CE50D669C93279FA94B3093C502EC801B1B5CDE76D3FC3307837F5FF9FFF3BC0DCFB850FADF530301559A400E7BE3773C5D4F3C8237C86ED92A408A6D80932001282647AF5E1D94A9933884CF62BE74114F5F18E97AD35DC68FB3450F9BF32EC22223C4B43FA5ED7118BDBFBEB377C17E7E0002020BF9A7C0F63CDCF3F850ED7C5DB6191EEEFE29E498A19F9D89BE4698821ABD72EDC34317B4F8EC2736DC83C24AC195BD55AFF00E797A83DFFADC7970FE53304F16F5DD92E6EC362B9E283E41EBF121FB2FA2A3F60124EF3EBF836AE51FDD55CA9F59B085DDD660724C072B86041B50A3A446CDB20A45BA65380ADF007E005DF2D9AA16A9D22B11DCF6F0B1964F04F45441A923691A15D80DC85003B9AE281F2B5983DD1A04D80A4D9C4372D9820BBFAE3AF7735E7C71E9F085C0A6E4BC107D9E4BA222B38FB236B2CC3A19DD6067BEAC460383FF2BCC771A7F1AAF092FC72C292FC1D5C6FC6B9715F1E1272EB22F8E0B33A2830E31BD6C531677902F6A95CABC3E9C1AE36F77037A785FEA355137A581FC14E6BD5F1F7AD1A5DD19DEDD448B47B558C22DD0FCBF296A812A726E7D1B57F4688D3F577104CFB15FC63C27F7B6051C7AED7D645186FCA63AD9C2D68BFF442466EFF76BCF0E398D2BF54C2CA4CC614839E9BCA48AB2CC53865803710A98D313AFF1DDD06A65680EB83C640052DB807EB2F38ED0CC211128044D331FEC3E6B0B2F3B675C631FDADE62C16D1719278413EA3F8E54BA34EDE7E73F3D94802D2F9CB9794D257C46679A3F00015945903190B97071F8FB55F8696253AA3F39B3FAD344FB88224F5313B43889B768171895F7AABEFF25E21E525EA01A996C764A3ACF12BFFED08F3F751F5CC094B50B325F8B62C7A5B3256964D48543690538E634E5730354358534B65EDDD44A526BB4B15E2042B6210F503EEE06D00D615CCAD10D73CDCBF5264B526674D85C0ED31BA5EE584F21FE6D13F883ACE4B094768865E43099E54671240E8E2AF8A7D7D22335B3974CE860E7238A7C1CA8A009EB51C8636F0659189AC8EF01C871E9008957CECE0A367B63BD2852BDE8690BD74C6D956435D0AB82F94A90CD00FC840DFC7036B84D51F1FF5076CA0974DB6CF25AF42EF7DC8C30C2B04CEB2510E86FFC510BF4C931639478FD1520AD571FA17958CCF8E37F5F6360030300EDE3A33871E9582808BDA2233996C5005FD0C23D99261F570AD9027767F6FC96D18BA98E8DDFC2B79AC12CDA5F2367B4BB6B99A3E07B59882E49A92AECE85339BBB18AB9644D20A3B2A795240492CE4EAF09D9EF728FB82B1DE7B64B5D391251FFB0699335CED8C7CE642FF1A79F04C3EA0DC37EA101188361AFAD236EB218CFBD1D0EBD784CE27DCBA0266DDEB87B59B66A4F75BB44665643FA358DD3D0B69B49F45A752B5C410E2299A62BE4B57B32B0924A069A8E8C15D754CC34DEBB0D967E70693A6FFA58CF7099C2C2458B437C7B205CC7E815F6CB494080F9EAF3017E5FF918558DDE415FF72E954EBC2ED4C20C8ECE38CC916060D22E582D54F74C6C181C2601400110A683F4A365E45FF1387BCE4E152A740136BB762B03A99FB68F6AB42620B2E3C00FA8D150944230A6330409B27E4AAD1693E2C3DD12216C4E2DDBC5E9CBA68B8B5417A7B2EDAE7EB67D25F4EDECBB087F93DC9C927C33076B1C71A2B83B33870D602562ED378805A690DD2A427D86C2C46BA4741F3DEFEB91A05EACE975C836E52868CFFE52CA92F97DE94768161A3E953BAB6A28016782909EC53C02F35184AA9CCBD5B793B525204B72DEB63E104376893B9452C3F2C492F423CBEF1EC87C85788CF3073FFBBCD67FF79BD038672943AE4BC68DA131DBA8D7B41C83B4E9CFB6931987B270C74919BBD40612F823114E4BB148671F1AA62BD2BDFCC8B0B24010EC112E883AEC9746D0F5DE467ADDAF51F8C070A359108B1F91643071438F098233AD9A94D0FAA665A39291A98D14A861905ECDE4755D00E690429C57580DCB6D51BB6186CE72EBB1FA8413892CAFB8713E89775013E546FDA30AEB8AF9F7155C08B25810C80CCAA5E700C124CFF59FA32E0293ADADBCC7B1A99F67E66B28DA614C5A4CCD706AFD05388C65EBCE07A543D3DC1E5A5D1F307F675728D4C629A04E9E455B4DA35236C677F26EDC622C1FBF29568D509EA0690AF4CB5DBB4E418B6162888E43B458774A31324BFD5EE8D2152E4AD43A3007D7D4AF5FDA172C2779837AD3A09E135DE953CE966727A7183BF77ADFC76430666B526692991D3C9DB5BB377552A7801C548AA63F6931D3EE91B875CDBCBB7441A4FF81F86762332D7192FBC2F7B69A58DB6CCD3558047F1940A1CACD6FA28A000B9795A2860394BF05F0120E6D85F96B1FE9DE14E3ED66A31D747924B6FF2620778E0714AEB34B79A5D935A0306E55C36506A292C5DC568403551907E49A43A6263D2915108916F1E27CF3529D1B7BD1544AF83A7CBE58547F192A93CE5C5BC6D652405FFCB95345F522B2D34E8EE0960BB85537A46121BD9A408D283A125EAA745BBAB04E2231C19AE95E13901C69E5C9C4D70B104478F4A70D64F81269A8 + +count = 52 +seed = 3D4607399F6FCBE074FD2BEAB1A7571239D6BE6308617866B65B892EE65399E14DC7FA612CDBC5F7E23116FA86C3133D +mlen = 1749 +msg = DBFC582AE98D8FD326FAE96A1849EFE729A1173339D90C48C3A2B867135F1DFF5B497D05FD55130694B5F9C62D136647D767AE682A0F05C670CEECC03475FFD39E0BD4E45B720D9D7E8DD04E69C969627682AD83F48609F6E66D0BE99064988E4654E3913B7CAF1475622E211BC247B98E5BABA1B804E2BF651713197D8A610CC111BA5FD98A053408AD155DCB756D28A283BF3B20E6F3785DD5F105F8D7D9F2956064860B097C675630EDEE1F17E2EB0B26B6C20E260F9A5915D63F1BE2C74FB0B37013244481A2D0C581C4EE12516E0FD4701E9835C8526A490CB39E99FAE07C40236808F9605A63A5106C19517C3711CA4B9E8EDDC77B242575D904DBE64223CF14A8E39FEEDA9D6C5F9CD0D0719A7EB5EFA71453636F78CAB8262636FF1E136C787E38A43FAF02699C1F260EC45B068EDBEEBBB8A0E08CE282BF47D27A33216856F0C59E743DEB13397656FF17FC4B3C694B189C35E516BE719CDA6542260D1301DF93A5D93EE118F7CB0AC94D0364C9EA66718A4BC7F3D7ACFFA60AFB7100F7D97E98DFFE167D1D8E46C912D41EA057362C13B078CB1D9C443C1A57AC18C4566F5F5388F47A40CA49CDAAF34BD4C9A597FFBF7AB20D7CE88DD76A639E09ADA323C588B08140E9350268C1FF76079093A05CCF5E1613A70E6E37CD257875049A767332E5F7420F319F9AC78F97C0C4FA40B1EEF8C8B48045C78F73584590FE41F9F274DEA838DE75DADE66D04E9D9308CB0A9948320D28D9CA8F1F51E39FF3DE20FD5A2A267D127C317ACD51FB779E597A8DC7359D920548B8BCAD761C6B8012304E12628A2652D12A8161E538C20D582BF567E9C2B46B4CFE2D2DA31120C6DF50DF45C80513AA9EEE9F2613A221AA1D23F861C7F26AAC7813B7ED7278EB420A5C44F2A5879A2F1F9F11E14602762E3389B152C014EA9DDC9DDDE9ED1D6F74E7526F690EF37E71D448342C012E032C00E480A699ADE617434C12DA0E69139D0D9036743B9E2B9134B5086FCB96B193330ACE8E4F77148AD0F532E72E1792795080B54D7172FB9AF1972D00AE24D0B3D86528675B3BC8C7B80598D855B95A77667AD0F671F00039C08CC99F5644BB006BA9356B9C02BC935212C43490C741B0845CD7B4247592374AEAA1B589E670AC62777293870963B5132DCC27088F5DA5B831FA570766FA81C2A07B88BBD45B81992EDFD2A7FE934219B1F648DD8A414FA03EAFCD39E72BDF7D4F6B9C1F31A0A67DF03F6709F2BE0E7D1B1690C92CE7B8C6B1054270D796B16D6E445D24CB11229CB0F92DD81190A37838951AD28BE2AEEE6C5F63DA60A911AE0A24B1D05EF2F814FB30AAE8CA3BD9F01D4FABE5B279142AF948B0E6BBCCF7560107C161C816A0D8E61DD908445079BAAFB78C14F68B8B2BB241FB03C237A4CB250911142D0B460ACC75E6B0F58BF28546A4779EA7342238826F636A510CC9CFFEE8BB0292A58A07694C05672B560B26158A8566D01D0EEA0773E81F3F84376B29CE375FC56A0689A7CA5CE94B91814B62CBB61EA2EFCA0CE6712A941D612B0F700C56B46D464C2AAAB3F64A89CAA8561A1DAB2869D79DA1720274D031946C4C7715FB9C243DC95CCA7AECFF55EBA4044467EB922E93F57E3E39B93876A03936DFFDD2AF48D055C6C188F2F229812EC94F3FBDF7D7DB62E4274DC91718710EEC2CE034AEF266207C5CCBA21552D6FB8DDBEE8E931067010594A9E0CB37250F67281C0A369965367424D454CDD05D3C8F35A15F76B4C8C3FEE42F4C9CAD68849837DED3BE58730B94AE3A5F9146F90E03B4C0836381B3F9CCB5DE6BD2455D241BE9132EB6D4937FF27663F4CADAA9CDA193919F4CB0D0F727F6C7B26E831C3AC8DECC234D79D1B3BD28305E3012A3733AD718FDAB7DD1A6400BC47F47D20F627D2449DBFF10E37A62299E22E408A28A806D403CBEE19AFF6FA9B1814B35B9573ADC86F829A08893CFAE4A0212293447D3086E21BBA28049F3ED383519917B169E8A1B7DD64CEFE0DA643A97950A205CBFF6BD9334180556E84199F0B60738715CD69AAD7C882430578F6FBA4579D908F863CA54D0B9862EEA6ABED31301D183CF465B1A256CBD597A629307A8A890F11C23DBFF895B932E9CD2F5F06A4183D6F2D61117126FCD2CE2B86BB44A9A5B402E3EEDBE4ED1DF11716E91A2302CB72D8F0DAE132E16311C80DCA041694AF1EF63F659959FCAA133D9E5668F94D0489311AF3BAD379DE17793BB3EE8A284529A72CDEC474B3A82D92C6CB21C63017F262E0D7DD47AA5C58F5E23F8A37F00D5438717F05BB974F18A5D3E1CA054EA053C30B34FBFAEE88BC0195F061AC32F5B71B2A8A3ED4B8BC4EDAB40A6396C052DCE72E10768526C00610E96DF38AA70938CF844CF445D8E2BF73C4F32A742812D8C1DB53AFC6B6C0A4BC67C3CF7579702312D6C89BF14E9585D2C624D07FEB4B5B57F8E4C5CFDA69A5E922CC1E9 +pk = 48C7E551C8F921A8F708621198AFB9720ED93204F42AA452C1193F2992BAC0EE7B6DD1EF47ED10AC44A136FA52B4BA379B116E6A07D8FAECF852D21586D7FF001C1258282F363B107261EC4EB8798934277630F050FDC94D1E6766FE684F11A29143B22EBB320F259FDC931946128FF9270F5F249307F5DB9FE9A7DC90A5030111 +sk = 48C7E551C8F921A8F708621198AFB9720ED93204F42AA452C1193F2992BAC0EE7B6DD1EF47ED10AC44A136FA52B4BA379B116E6A07D8FAECF852D21586D7FF001C1258282F363B107261EC4EB8798934277630F050FDC94D1E6766FE684F11A29143B22EBB320F259FDC931946128FF9270F5F249307F5DB9FE9A7DC90A50301113FC9A603A5A21F22A63C21015CC37FC07ECEF7CD0FB54E18485B6E3053E43B3E30000000000000000000000000000000000000000000000000000000000000009ED5E85B68E0FE5CA7F111FF99D604C0DE60079BD5304502D1EDB13A4BF89A7AAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3501D35628888A5153A436F5D180B8B3CC3CEC211F94FCCBBBFE6DA1633AE6D3B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001558989AFB831F181C5C2F9F2B5B449B8147F6A31A69FF17D4182E58D2228C19384B188A2C8CB68500E2D98913DD7B4320575887C8529E1389BB8ECD89680F01ECA7EB660D3BE56388D5CDE0A34EFE34B74E28EB05B07A20DCCD7E3CEFDB4ED2D3953486160C860FC925C9E50DCA9C8ECEF26F00BCE0C89E6AB969A3430AA38436EEB182549473F36452DD2B60D342ACB05B08CB056D2FEC5021F7F94CEFB65DBB7C026277011D2EFAA1DC59751B1203B8533D78EE9C656DF41E3794096C46FD94040780D1DE419A3997E2E1FFDB162355E848C877890156E5DA1F1F4A95304D01A5F1AB22B9D5B0D760EC3DF4DE650B0B9CEC35ED9411616AB5C80F +smlen = 2041 +sm = 33BFC88B8499E09F743C4B47D7C1D543BC6099837986DED55A64AF6086634DB6013026DABB5D9F08CB9FEF51FDE8C88E33BFE294E3CB2401F6DA0DC2E660F2003D4D0C61EF9D5F69D4A9A95C8CAAAF89817CB11BC7DE695FA5DE42AF51D363A9F8ED4D58537C81F4EEF325D1445ACBB640B781B1D065CB689ED64C9EB6406A010001F917FB200371BB7669C9CB991B2EC58177CAEA8828B2464CB4F52604020288536FD69E6DA7BD3C54190D8150F32F8EE2D4510EDF27999BBD9911813B0ED0690A34ECA4CBA2C685CA3F794394F2B4097343D94C9A623DDE0D4DCFC42089BD57412E5F718BA12E84BEF5A9F6E16186E5D917B8CADE26C8928A2B92C19AC8D40369E324DE8A57C79BDA420E69F104E678493C2F5BE03F747B3EDB24AECE8BBE00001109DBFC582AE98D8FD326FAE96A1849EFE729A1173339D90C48C3A2B867135F1DFF5B497D05FD55130694B5F9C62D136647D767AE682A0F05C670CEECC03475FFD39E0BD4E45B720D9D7E8DD04E69C969627682AD83F48609F6E66D0BE99064988E4654E3913B7CAF1475622E211BC247B98E5BABA1B804E2BF651713197D8A610CC111BA5FD98A053408AD155DCB756D28A283BF3B20E6F3785DD5F105F8D7D9F2956064860B097C675630EDEE1F17E2EB0B26B6C20E260F9A5915D63F1BE2C74FB0B37013244481A2D0C581C4EE12516E0FD4701E9835C8526A490CB39E99FAE07C40236808F9605A63A5106C19517C3711CA4B9E8EDDC77B242575D904DBE64223CF14A8E39FEEDA9D6C5F9CD0D0719A7EB5EFA71453636F78CAB8262636FF1E136C787E38A43FAF02699C1F260EC45B068EDBEEBBB8A0E08CE282BF47D27A33216856F0C59E743DEB13397656FF17FC4B3C694B189C35E516BE719CDA6542260D1301DF93A5D93EE118F7CB0AC94D0364C9EA66718A4BC7F3D7ACFFA60AFB7100F7D97E98DFFE167D1D8E46C912D41EA057362C13B078CB1D9C443C1A57AC18C4566F5F5388F47A40CA49CDAAF34BD4C9A597FFBF7AB20D7CE88DD76A639E09ADA323C588B08140E9350268C1FF76079093A05CCF5E1613A70E6E37CD257875049A767332E5F7420F319F9AC78F97C0C4FA40B1EEF8C8B48045C78F73584590FE41F9F274DEA838DE75DADE66D04E9D9308CB0A9948320D28D9CA8F1F51E39FF3DE20FD5A2A267D127C317ACD51FB779E597A8DC7359D920548B8BCAD761C6B8012304E12628A2652D12A8161E538C20D582BF567E9C2B46B4CFE2D2DA31120C6DF50DF45C80513AA9EEE9F2613A221AA1D23F861C7F26AAC7813B7ED7278EB420A5C44F2A5879A2F1F9F11E14602762E3389B152C014EA9DDC9DDDE9ED1D6F74E7526F690EF37E71D448342C012E032C00E480A699ADE617434C12DA0E69139D0D9036743B9E2B9134B5086FCB96B193330ACE8E4F77148AD0F532E72E1792795080B54D7172FB9AF1972D00AE24D0B3D86528675B3BC8C7B80598D855B95A77667AD0F671F00039C08CC99F5644BB006BA9356B9C02BC935212C43490C741B0845CD7B4247592374AEAA1B589E670AC62777293870963B5132DCC27088F5DA5B831FA570766FA81C2A07B88BBD45B81992EDFD2A7FE934219B1F648DD8A414FA03EAFCD39E72BDF7D4F6B9C1F31A0A67DF03F6709F2BE0E7D1B1690C92CE7B8C6B1054270D796B16D6E445D24CB11229CB0F92DD81190A37838951AD28BE2AEEE6C5F63DA60A911AE0A24B1D05EF2F814FB30AAE8CA3BD9F01D4FABE5B279142AF948B0E6BBCCF7560107C161C816A0D8E61DD908445079BAAFB78C14F68B8B2BB241FB03C237A4CB250911142D0B460ACC75E6B0F58BF28546A4779EA7342238826F636A510CC9CFFEE8BB0292A58A07694C05672B560B26158A8566D01D0EEA0773E81F3F84376B29CE375FC56A0689A7CA5CE94B91814B62CBB61EA2EFCA0CE6712A941D612B0F700C56B46D464C2AAAB3F64A89CAA8561A1DAB2869D79DA1720274D031946C4C7715FB9C243DC95CCA7AECFF55EBA4044467EB922E93F57E3E39B93876A03936DFFDD2AF48D055C6C188F2F229812EC94F3FBDF7D7DB62E4274DC91718710EEC2CE034AEF266207C5CCBA21552D6FB8DDBEE8E931067010594A9E0CB37250F67281C0A369965367424D454CDD05D3C8F35A15F76B4C8C3FEE42F4C9CAD68849837DED3BE58730B94AE3A5F9146F90E03B4C0836381B3F9CCB5DE6BD2455D241BE9132EB6D4937FF27663F4CADAA9CDA193919F4CB0D0F727F6C7B26E831C3AC8DECC234D79D1B3BD28305E3012A3733AD718FDAB7DD1A6400BC47F47D20F627D2449DBFF10E37A62299E22E408A28A806D403CBEE19AFF6FA9B1814B35B9573ADC86F829A08893CFAE4A0212293447D3086E21BBA28049F3ED383519917B169E8A1B7DD64CEFE0DA643A97950A205CBFF6BD9334180556E84199F0B60738715CD69AAD7C882430578F6FBA4579D908F863CA54D0B9862EEA6ABED31301D183CF465B1A256CBD597A629307A8A890F11C23DBFF895B932E9CD2F5F06A4183D6F2D61117126FCD2CE2B86BB44A9A5B402E3EEDBE4ED1DF11716E91A2302CB72D8F0DAE132E16311C80DCA041694AF1EF63F659959FCAA133D9E5668F94D0489311AF3BAD379DE17793BB3EE8A284529A72CDEC474B3A82D92C6CB21C63017F262E0D7DD47AA5C58F5E23F8A37F00D5438717F05BB974F18A5D3E1CA054EA053C30B34FBFAEE88BC0195F061AC32F5B71B2A8A3ED4B8BC4EDAB40A6396C052DCE72E10768526C00610E96DF38AA70938CF844CF445D8E2BF73C4F32A742812D8C1DB53AFC6B6C0A4BC67C3CF7579702312D6C89BF14E9585D2C624D07FEB4B5B57F8E4C5CFDA69A5E922CC1E9 + +count = 53 +seed = 7031BA806F4D8BC28529163B239E0EE836871C51D2D62B601B71D6F2B69B203C81440F8FFC09C3AAD94DB1D880160671 +mlen = 1782 +msg = 6103E5B22F934203B5CA87337095C9A19267AFB9695D309BEB8A557BB7CC90332C4A03E1D416D397B945B607268F545928104CFFD71B02864E010B666CFCB68B762FA5EC839B5AEFD0407419441B38E6D881BD5218DF73C675DF101BF2C53D90FF86D4A3C7DB19EC9CAC044E0467A36337AAEEC32217FAF86CBD7BC2B663421754CFF1200A8A66E18F812868BC8D1C8CA495E6462DA4B8B96D4167F040F04927A7C27AD35CF174D42684ED55AC80D14CBE4CC2570642DDEC4F44880D967E9AF77EE27D0D3DBAEC9067FB6FC957AC4A136C1D564E17F59AC4938D43FB9050D810989907125C47FCEA6C162C723E79F68339CD1B3BF596988BD6E215271385CD50616868C6BF40FDC34BD30E5A00773E2C039723F2AC3A3FA45F4CE870841762D7435BD6CCC5FD3D58FE059EE455A806FDE89155C84797FBB73691A1FC6921859E99066A3239E31F28D1A46100DB1917621D9E61473CF1E71F9850B584B459D5690941E676A7DD56796313ED9ABDBE03DC75AFC1430DBA27FE0F8DF48EF7C339F462AF1A6D30A5F8B480DFBBE860C4C0BC136393C8FA0875AF454273C3CFDBA7EEA44EEF1A4060136948CD98B9D2C19AEA4934F3455F31DD15BE6545134F17A195B6BC409159C0975E592A15E86CA4943CCACF4B46719A072DB8C629B67768F1956F8158F179A0B645320489DEE404C8D0C4E786CFF39B324053F102C118E7D51173CEC0FDD017F213B2B07AC6B2C7DEC04172DD5396A020EDFB74ED86FC31952D241A7C3D139DEF543D90976AA70599792E73CF73AD0BD4A359BF60DFB2CE96A784D8DE5E23A95E831CA6FFBA6B187BC5F29A7757185EC06AC882572EC6283A1875B54FE4F295E1970BF311DBABAF9F894D3364D68F529C4EF9030AB934BCB09459D5AAC61919946FD28DF1AC85876F979E8B8528E9BBE69F03DEEF136EEA6A8FC86F31BD64285C8C9F49ADF53A8BAA7867CE52E72DC4A63929DF3BA2662DC77D71F88D8AF42B8D67AD54884EE11F5A6B3B794F7D5610909B0B740937587CF475DA903159994A262B6F32A3D1723FDAAE65E636B71CB0EF0A744F359BF08AC8231ED2970CE8C451266F703DA3B57F85ACEED4C1C174C50D9C226F028E972AC124FAA6F60518699CB4C499220EA51A538F9EDE67D0E98E1BF8FB4B24B1D8EF50A28A93E20076F8FB812CDAB04871D331FF434BA66DD4577B18DC3F471B3E96A174B58A7AC2470EB8463A71FFCBA2D064470FD2D4E15F9491DB09DF3E3BA376A3DDCC437312BE5848DB3B9079F2AE046798473BB970D725E1D7C6FDF405AE387DD7CC1735A7FC27D1A476592A514B87C9017E1E5D37E338F37916F3C72C5F2AF75185B88694D4E8E0A93FBF20CE81A7A0C10D55737B6473FBD92BBB39FEBC6167336BEB9C235997796B9C0DC18C353E80305175BB412ACC29E647813D0003F727ED0577A7C14BCF67173DA569320E887BDC8F5AD27FD8864261E802A6753C6F9BAC844B5900ED0D4274C0E6EDE42367079188B10BED5999501164FA4C5A818ED6EE229C3E0E0F7804B19EAF5D1132BE1D7FC18BE834C842B21F8DDB11F8CFAAC10D2E124981ED698EE7CACA211C5624F09C62E1D451429048B55ED0F8A714BB77A0D4B40F0A446EDDFB27602B7BF894805C4AAD9252658F6B21A05DC0CF6A3ACDC227FA867A4E5B1DB63A14DE26A79AACF1900A7B7D867C15CFD1DAA712F2A1E2A6C7B31B121465539CD0164E3CCF79A978B543AE9602996448C6F68069D044FC958911EF40B0B9AFC78ED014D94571F6771EA5E2306A7CAC32C135FEC0BBF1DCA3CB0B57DAA239C01671718017C907048E0D19515CBF430D4B3B4FF4FC9A391D15A38B39C4E528FAC04EBD3DC69144C98AFA75102D21FF961BAD2E1F25562AF92554814405C4EC08DAE4A0CD28BE592C9C9BF997CC0FE31502DD541000D4640D59654D26CA2A17BA4CAB0518EE097C05B2984FFC56E8182368E216768E0D07E17FB64003E95194D04C6E00E08386084FEBB6CBC841E8F3FE2A069C45554BC502C27591CA3C1DC9E6B1694BA2C1BC0713C1CF738DB22FFEEB7443D72D5BDB975D192976A58AB33DB58F5DAE497A0B24011E15E3256FF124DD99AF6FC300D1FECDCEE18DD4FBF25E901125D4E80EFA8E2A211701B74FD992E63376996994E054CC00E7E1DE7DB8E7D2898A735EC4920DBEFAAEA66B456CF6A12324C5D56762313A627B3523AB1E2C1C82E4FBAB136AE4395FCF2672A58011D96BBDCF2A7478305756D66B30A4AC44E48B18A5964AA89F14187EA114084D52B4BA77755BA04C34777409BDB782B7B645E93B4DB284525E2F9C9C38D73B475DDE2251277A2E6C3183D5DEA78414E22CC8FB4B2C7EFA797CD4A87AC81D3242EC8D2C2EFD6BCFD69C39F14B0B365F3151A96F75454A3A1400C76A4390FE9F2E7A22A0CFA687A5BEF1C905D3A893B0DFD35BDA184F25E62FDDC2A52B6A67E76F550ABE4CC8D1D63CC8631E4CC315E46D3015C3B8636B92B8D07075D401C654FB4A +pk = 098DE1013AA751197637A3EFFEB591CEE999F8647A19F40F50CE4D5D2EC409D5DAA6C2C8857AFEE4FAFF776C934D17B3708B6E30C743F450D51B19C2ABFC04008964FEA57946C7D9D9D54C9536AB2392A203CD108347BF8067BEC03C86D89AAF1530ACD6CC24CAC9A85FC82E330404C2629EF0DEB7533B7ECDB1C1A39A121A0102 +sk = 098DE1013AA751197637A3EFFEB591CEE999F8647A19F40F50CE4D5D2EC409D5DAA6C2C8857AFEE4FAFF776C934D17B3708B6E30C743F450D51B19C2ABFC04008964FEA57946C7D9D9D54C9536AB2392A203CD108347BF8067BEC03C86D89AAF1530ACD6CC24CAC9A85FC82E330404C2629EF0DEB7533B7ECDB1C1A39A121A0102C3BD167840F4C43FBA15AC24BEC3B5C2731B1B5BD69A25B428EFA8804AAEE77FF801000000000000000000000000000000000000000000000000000000000000CA211F95F2E9A64F5ED4295EB51F30E969A9A9AE967602A1861952D0A1E747DE4DFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF333CCACC1E418DB0BF9EA5D7666718F77BBBEFAF38A383BB397AD117C1C412F15FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A158E5A6EDCA79D6C8CD1A94689DCC24493029CE98933A47649AB91462088924943F8E267EED91D1F2F49BE7E254EC94AD1BC8577212DC39FF66A69FA61B0A41E2C1A824968EFAB661A66A3936CFAD44207816996227FABD688D50F4CC3DB465EB04C29FA4FC110FC5F35612E119CB9F222626602CD59072A6E60CAE66053981B053B9A96E8ACF2A8280799BB01B58893ACF410749DFC259EDFBAD68B0BCBAE19C48B80C6889E16785FD74ACB9F2F87D3F4072A0537478207D1C9F1C02F2D1519F8E2E37BD1A88FAC173F29A6644C51A85476730D40BC7B55A77F36C4C6023BADCDB0EDE78EC787F7B9B28AB8E8677DA814D68194BB8BED144862D03 +smlen = 2074 +sm = 78D64DBEEA26EECDEC98CDE2FDC28C97A6852D074A757C0C4595B3FCE0067D5DC8F346CF7A57357477CF03A494EE285C820409CAEB7407FDCD07F7367978A10164D7BCE042F07A93D24BB5C74A45D54A48A7B09F0C14770FF43007EF819998767BDD8946B6C34B85D69F0BB47812878D434CA2A80FFF7C3B2A609FD5E020EF0000019B19136D670AE90153C2D6692E9A0C8F89590AB72B31B28F8E181715E225F340E9A5C45B08F92BCDF7B1047597867817B076423C723152821746A9A2797BDA053292E52535C7CEF426B1FA43470D60B2A1F6283E87DE697FB57B1D5E15DE54607C4D6A30F82361A1B2746D8F2A7E62E43526D2B76973C32F7325D327167A3F75F5B0EDA81DE11E7E0819101348BA13D4F5D5E59117538B90D5471BB665350B0008046103E5B22F934203B5CA87337095C9A19267AFB9695D309BEB8A557BB7CC90332C4A03E1D416D397B945B607268F545928104CFFD71B02864E010B666CFCB68B762FA5EC839B5AEFD0407419441B38E6D881BD5218DF73C675DF101BF2C53D90FF86D4A3C7DB19EC9CAC044E0467A36337AAEEC32217FAF86CBD7BC2B663421754CFF1200A8A66E18F812868BC8D1C8CA495E6462DA4B8B96D4167F040F04927A7C27AD35CF174D42684ED55AC80D14CBE4CC2570642DDEC4F44880D967E9AF77EE27D0D3DBAEC9067FB6FC957AC4A136C1D564E17F59AC4938D43FB9050D810989907125C47FCEA6C162C723E79F68339CD1B3BF596988BD6E215271385CD50616868C6BF40FDC34BD30E5A00773E2C039723F2AC3A3FA45F4CE870841762D7435BD6CCC5FD3D58FE059EE455A806FDE89155C84797FBB73691A1FC6921859E99066A3239E31F28D1A46100DB1917621D9E61473CF1E71F9850B584B459D5690941E676A7DD56796313ED9ABDBE03DC75AFC1430DBA27FE0F8DF48EF7C339F462AF1A6D30A5F8B480DFBBE860C4C0BC136393C8FA0875AF454273C3CFDBA7EEA44EEF1A4060136948CD98B9D2C19AEA4934F3455F31DD15BE6545134F17A195B6BC409159C0975E592A15E86CA4943CCACF4B46719A072DB8C629B67768F1956F8158F179A0B645320489DEE404C8D0C4E786CFF39B324053F102C118E7D51173CEC0FDD017F213B2B07AC6B2C7DEC04172DD5396A020EDFB74ED86FC31952D241A7C3D139DEF543D90976AA70599792E73CF73AD0BD4A359BF60DFB2CE96A784D8DE5E23A95E831CA6FFBA6B187BC5F29A7757185EC06AC882572EC6283A1875B54FE4F295E1970BF311DBABAF9F894D3364D68F529C4EF9030AB934BCB09459D5AAC61919946FD28DF1AC85876F979E8B8528E9BBE69F03DEEF136EEA6A8FC86F31BD64285C8C9F49ADF53A8BAA7867CE52E72DC4A63929DF3BA2662DC77D71F88D8AF42B8D67AD54884EE11F5A6B3B794F7D5610909B0B740937587CF475DA903159994A262B6F32A3D1723FDAAE65E636B71CB0EF0A744F359BF08AC8231ED2970CE8C451266F703DA3B57F85ACEED4C1C174C50D9C226F028E972AC124FAA6F60518699CB4C499220EA51A538F9EDE67D0E98E1BF8FB4B24B1D8EF50A28A93E20076F8FB812CDAB04871D331FF434BA66DD4577B18DC3F471B3E96A174B58A7AC2470EB8463A71FFCBA2D064470FD2D4E15F9491DB09DF3E3BA376A3DDCC437312BE5848DB3B9079F2AE046798473BB970D725E1D7C6FDF405AE387DD7CC1735A7FC27D1A476592A514B87C9017E1E5D37E338F37916F3C72C5F2AF75185B88694D4E8E0A93FBF20CE81A7A0C10D55737B6473FBD92BBB39FEBC6167336BEB9C235997796B9C0DC18C353E80305175BB412ACC29E647813D0003F727ED0577A7C14BCF67173DA569320E887BDC8F5AD27FD8864261E802A6753C6F9BAC844B5900ED0D4274C0E6EDE42367079188B10BED5999501164FA4C5A818ED6EE229C3E0E0F7804B19EAF5D1132BE1D7FC18BE834C842B21F8DDB11F8CFAAC10D2E124981ED698EE7CACA211C5624F09C62E1D451429048B55ED0F8A714BB77A0D4B40F0A446EDDFB27602B7BF894805C4AAD9252658F6B21A05DC0CF6A3ACDC227FA867A4E5B1DB63A14DE26A79AACF1900A7B7D867C15CFD1DAA712F2A1E2A6C7B31B121465539CD0164E3CCF79A978B543AE9602996448C6F68069D044FC958911EF40B0B9AFC78ED014D94571F6771EA5E2306A7CAC32C135FEC0BBF1DCA3CB0B57DAA239C01671718017C907048E0D19515CBF430D4B3B4FF4FC9A391D15A38B39C4E528FAC04EBD3DC69144C98AFA75102D21FF961BAD2E1F25562AF92554814405C4EC08DAE4A0CD28BE592C9C9BF997CC0FE31502DD541000D4640D59654D26CA2A17BA4CAB0518EE097C05B2984FFC56E8182368E216768E0D07E17FB64003E95194D04C6E00E08386084FEBB6CBC841E8F3FE2A069C45554BC502C27591CA3C1DC9E6B1694BA2C1BC0713C1CF738DB22FFEEB7443D72D5BDB975D192976A58AB33DB58F5DAE497A0B24011E15E3256FF124DD99AF6FC300D1FECDCEE18DD4FBF25E901125D4E80EFA8E2A211701B74FD992E63376996994E054CC00E7E1DE7DB8E7D2898A735EC4920DBEFAAEA66B456CF6A12324C5D56762313A627B3523AB1E2C1C82E4FBAB136AE4395FCF2672A58011D96BBDCF2A7478305756D66B30A4AC44E48B18A5964AA89F14187EA114084D52B4BA77755BA04C34777409BDB782B7B645E93B4DB284525E2F9C9C38D73B475DDE2251277A2E6C3183D5DEA78414E22CC8FB4B2C7EFA797CD4A87AC81D3242EC8D2C2EFD6BCFD69C39F14B0B365F3151A96F75454A3A1400C76A4390FE9F2E7A22A0CFA687A5BEF1C905D3A893B0DFD35BDA184F25E62FDDC2A52B6A67E76F550ABE4CC8D1D63CC8631E4CC315E46D3015C3B8636B92B8D07075D401C654FB4A + +count = 54 +seed = C8671A5D752CC6DDF075C899797603A625C142485EAC3D57CAF14F2244D7F84D116B28F959912A758E519D588A6A07EB +mlen = 1815 +msg = 3EAC87B3D642CEAA3DC904AC3C4245CB2A260E4B74D0394D33D4B71024144180A727F80B092305F31B2526998EDF6F98E46933FDAF0E8709E98D54F13C2701C58BBE35292FD3334C5E03D345A9A2EA1E01B2C4573567FF1FF3BA7406A16F5A5805EDD760AC78A3AB8602E415F67C7CEA5B36421C79F83CBB14FA775448A832A4B28851CE215C11DCBAEE652CDD7342B6B1204727479E6208FB556CF08BF7EE230F32659E829CE4FBCE0955D01D36624BBAC18C1D25A3E187722F8F74C88B56E518CF0E78B3B0EAC56D8F13C4AFC4DA3613A41CCC2B0B0E2EBBFE5799E479F81335360D483596E9AE926751EC9B956555F271C2CCD85F0F6C1BBB2C326C29B5DDF6B5C4C11F8EED15C0143993FEB626543E92CE4D66C0BD28C79ED1ECB793A3091D6B9AB510B0D41AA42D70C2D8F26EA0B826C8C375E1DD89B3E2A48FE5D88A462DEAC33BAC35AA32EBC010AF7E47B77AD23653D747760914E0CA12864CD401787EFD96F30D82D8907DC68578067703DD19B2377DF319EB540E8AE78B2BE86BEE1C915FF3B2F4B25C0AC22CCF89BD85371961944D8A4E6D20E2D3E9DF3A07D3BF6986898786F0667545275FAC3EB0F069B457D8EBBE5F60125F94756DB04EA203451A0DE160CBCE2A34650D92F200448B097691A61361AC487FBC3C82B2BD7C1ACCA02031311971C3CF69BA459A0B640A702DB4467973713A6F2466560FFAC0592D64FF1D4A935220826EB559CFE0144EA4B8E54EAF67DDF91988DD4B3749C865008C0C1CF98BBF76D929B85C8C426C15FA56706984E0F2E90658FA3CC33EC9FC700976870C94035ECF9A0534B18D07F55923663835416E40235CC2550BD9822F0912CF101F86039830AD9102AA4A3B6777EDEC5EBE621082FCF81A1C6A528F0324EC9D39FA80B6E87D6366E7EDAA0E14337D6708F7C3D2FB1978F4F5CD594FD35B267F9CD09370D3366DCE286CCB9647A1944F8D8BE63E5EF8F6108CC5E9AFE9127DA84E1913439EC35A4E17F7782DF042DC2F7C5CAD8A659DB282E61763539B56C2AFA0F2B507D549EC8C9E76C7DB306380CD7B46C9699B6DB8BE06CCA15E8E83763137B06BFF02DE2738A46C61B70EDF4F394D54D0453DABF689FB6BA41616BC589CB9847224E74F919B6E03672EC6A52584FE81456D6E648DD6F0F9B068EB72241F067BF6B891A498A9A59356C735E10EFB37B3ECF47CC5620A35442DD81E25D2C6DB0E9E871301ADD193D628B30E3B4345751BC17E0B5B05AF758A653DE7BED3763303FFE1AF05E407F296C736CA6F4C348B25718C7A814BD0730AFFC057842AF3D9B9ADB12FCCD740ADD16218AA57E43835821A2BCD70F1027F3042D4A92F10D0A1FB8323E87869BFA8DA24DA75F8743FA3038C24FEDC0C987065421BF4B300BE3ED3F6D6D590968D3EE32A8F5E20EA6168756AA18BB78B6AA48C299C36D0E78B6F84CACAB5946C69179E461F4C2DD201D8032A29EC6C52942AC37D9C76AB4A401C9AFF96284E1E9E39BFF6D912CA33B6118067605EA65D7F611DD963F4F75F97346FFFD1DF84C79CCBA06804B3017775D8C0BF614FCF4D824709557937B22E1805A0A961ECF226F26E3706362BF6D8D1DD30BE7EEDA481A64961641DC57B9F0211F8EE43578E4C2B6507114DFFF3C3F884586BFD1278D117F7C6014FD5980CDF1E2FD1F34CCAD170842B9E819C22FAB9890AE265C3BB6946FCCFE218544D00A6BA5BEF5224EAE24002B6E83E0B35E98C2322BE2EB3D8234BE8B048C54E40782C9A24D7A8B461EC05F38A94AAEF3DA3B46D0D85B0D949CF1089408189FF97C56C7DEE50A004AEAD82C15C7C0D0965F3C65A9A715A65D29CD3614954EBD91EEB4E74F862FBC944C56F2EDEC4D344F92E8154708AD0F5575880503EF0F107A9A9DB99BAE82357C16578F3E6CBDF9B427DA88DC322D11C6AB2A6AE6F5179C94454E09DF5CAA6A519A4C1903C8F2925639E12AF793695F256BF0E55E0D45B73880358F09719ED89A4A1A07868BFBF16095A20035D5D4F99FDA19DDAE3E21CB98308F4508B5CEE706C27898F03A2BF14F29ACBF055E4AB0713A7B6FC1A7853EFD36E1290E69587FEC15D492A66B9A4FEA6E2BCDE61E02FE18E06F59A2F4E06F177B14CE4C1CF1A8D1F49C554A8A4C68B9937B4C230320C80753D4B071BAB2DEDA89C9181820336F1E766E447EA1C44E15CBB7C002C1813D2C1726DB0E4DE289466077DA9610E5F3AA313B1B01DD79A4056A8BBE9D843CE5B0439325FFDFE91FDADDEC6CB86D5CEBB68D8F9C0ED237A4648C412780ACFF48FD9CE817EA70D950DCB989EA6B11FD87EA4F30347A27488C5C15BE7FD6D1280FEA3A7C022F8D9881FAC93176DB2025B4C7914A51099893A791BF5BE851F325347484CA6ED51B2BA71548A6046EA7EC85B31A9967E7D119D2CA3A51C1E14D5A3EEF0D41BDD615DA01D45979007A1997DE281BC340C3203D5BC0075B1AA38873A9DBB9D18E6E26971E70B54E41E2C8C91D2E60FBF85435C1EBC4893C45A201B1D2391549F52A1CA3E0440ADFB746FBBF0D9933F9FA0220B3E04EBEBB29D2A9AC1 +pk = 953C090629EB8CC35F4D0264915E72ADCCE988FB8D90F5E39DE6361CAFF08952BE016B1189F78AAF16AD150E0D4FF4F1ADC5AACFACF45CABC740909CA9C95300AE185ADBD57F292DF9DAD9FD508A02FDC7C633A2EFD93B4856AEC484B11F12621A53B15F37A582500D7F73ADABDCB1E78777EF912A80D6DADEEE6AC55213410006 +sk = 953C090629EB8CC35F4D0264915E72ADCCE988FB8D90F5E39DE6361CAFF08952BE016B1189F78AAF16AD150E0D4FF4F1ADC5AACFACF45CABC740909CA9C95300AE185ADBD57F292DF9DAD9FD508A02FDC7C633A2EFD93B4856AEC484B11F12621A53B15F37A582500D7F73ADABDCB1E78777EF912A80D6DADEEE6AC55213410006EBAC4331EEA59332A0934A4340DD877CD45304B46F0D2FA5F11BC2A22F3E438C6500000000000000000000000000000000000000000000000000000000000000C21C3B7EE9FDE3D9D046E7D6C1BE913AF28D989465C1DB803882FAD37B48586650FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F0AB2FAC75779D6851CD5E701A92DBD4EB890E06535643B80E08B82F6F942A246FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047215CC3D117FE78637B9F2381BEB50A4DA1C410AB42003407E3617F341313C6956907E8D82975F817D1AEA7D01002D9012B7FABDBBAF9A48D7DABB5F453095969A75B52FD9FE06E652CC9CCD7E5B972D0F69CF5741D95F2499FDC55F8F125F0C2EDE76CF02B7C46F34F79317C3BB26245CF8448701FC7E8D6AB800D9609FCAE64A14A5F77D20D1831D606BE560FA2F7204DC020D58126380F156BC92BFA1DA8E6CB337985AD0112B02F3CBA7DF2FE350C950559BFF8105CDBAD5C7202EF3C6BFE160D865B68CCFADBBD8DCCD9032D9509758B543D24DAC6D59D7C4C9F37C5443991702531B008E22401C48977F42C92644BFD75647C75136A4FFF06 +smlen = 2107 +sm = 3E17B40EEDD7D115B178455E87B883C84A5F6701FCC24525D2171ACB9C9DF765A15F6F5D62E71DE4EAB573A56FDF23C5CA20BCF96032D8F19F038242A6C98C01C352582E68B42464CD0740AFA33A78FBC102548BDAA2DA258566BD057DB12551C998DFE5A349D2B9B603639E4AA7F903D9D0B8DD58AC61E8C2DE273951813D01000013C7B366A40B71780468CB62BCECF5525B2DD5D11917A057EBD48623D4A42052223B831A2312C25C2D19289AEBC6B27C48691490E08D60D4EF1B023C7E98B922D670C4D5A41E4B8964D135F5AB8A5FC988DE68A373D7E6FC13D8289EF419961387D1A5069B220B4BC7979CF03B0DE100B38E557A091CC1735B8C57E4B99CE568AF3E4528FF2BD87B70C220C3F513465583DF3FCCF6C7B490135374D01BD0500011063EAC87B3D642CEAA3DC904AC3C4245CB2A260E4B74D0394D33D4B71024144180A727F80B092305F31B2526998EDF6F98E46933FDAF0E8709E98D54F13C2701C58BBE35292FD3334C5E03D345A9A2EA1E01B2C4573567FF1FF3BA7406A16F5A5805EDD760AC78A3AB8602E415F67C7CEA5B36421C79F83CBB14FA775448A832A4B28851CE215C11DCBAEE652CDD7342B6B1204727479E6208FB556CF08BF7EE230F32659E829CE4FBCE0955D01D36624BBAC18C1D25A3E187722F8F74C88B56E518CF0E78B3B0EAC56D8F13C4AFC4DA3613A41CCC2B0B0E2EBBFE5799E479F81335360D483596E9AE926751EC9B956555F271C2CCD85F0F6C1BBB2C326C29B5DDF6B5C4C11F8EED15C0143993FEB626543E92CE4D66C0BD28C79ED1ECB793A3091D6B9AB510B0D41AA42D70C2D8F26EA0B826C8C375E1DD89B3E2A48FE5D88A462DEAC33BAC35AA32EBC010AF7E47B77AD23653D747760914E0CA12864CD401787EFD96F30D82D8907DC68578067703DD19B2377DF319EB540E8AE78B2BE86BEE1C915FF3B2F4B25C0AC22CCF89BD85371961944D8A4E6D20E2D3E9DF3A07D3BF6986898786F0667545275FAC3EB0F069B457D8EBBE5F60125F94756DB04EA203451A0DE160CBCE2A34650D92F200448B097691A61361AC487FBC3C82B2BD7C1ACCA02031311971C3CF69BA459A0B640A702DB4467973713A6F2466560FFAC0592D64FF1D4A935220826EB559CFE0144EA4B8E54EAF67DDF91988DD4B3749C865008C0C1CF98BBF76D929B85C8C426C15FA56706984E0F2E90658FA3CC33EC9FC700976870C94035ECF9A0534B18D07F55923663835416E40235CC2550BD9822F0912CF101F86039830AD9102AA4A3B6777EDEC5EBE621082FCF81A1C6A528F0324EC9D39FA80B6E87D6366E7EDAA0E14337D6708F7C3D2FB1978F4F5CD594FD35B267F9CD09370D3366DCE286CCB9647A1944F8D8BE63E5EF8F6108CC5E9AFE9127DA84E1913439EC35A4E17F7782DF042DC2F7C5CAD8A659DB282E61763539B56C2AFA0F2B507D549EC8C9E76C7DB306380CD7B46C9699B6DB8BE06CCA15E8E83763137B06BFF02DE2738A46C61B70EDF4F394D54D0453DABF689FB6BA41616BC589CB9847224E74F919B6E03672EC6A52584FE81456D6E648DD6F0F9B068EB72241F067BF6B891A498A9A59356C735E10EFB37B3ECF47CC5620A35442DD81E25D2C6DB0E9E871301ADD193D628B30E3B4345751BC17E0B5B05AF758A653DE7BED3763303FFE1AF05E407F296C736CA6F4C348B25718C7A814BD0730AFFC057842AF3D9B9ADB12FCCD740ADD16218AA57E43835821A2BCD70F1027F3042D4A92F10D0A1FB8323E87869BFA8DA24DA75F8743FA3038C24FEDC0C987065421BF4B300BE3ED3F6D6D590968D3EE32A8F5E20EA6168756AA18BB78B6AA48C299C36D0E78B6F84CACAB5946C69179E461F4C2DD201D8032A29EC6C52942AC37D9C76AB4A401C9AFF96284E1E9E39BFF6D912CA33B6118067605EA65D7F611DD963F4F75F97346FFFD1DF84C79CCBA06804B3017775D8C0BF614FCF4D824709557937B22E1805A0A961ECF226F26E3706362BF6D8D1DD30BE7EEDA481A64961641DC57B9F0211F8EE43578E4C2B6507114DFFF3C3F884586BFD1278D117F7C6014FD5980CDF1E2FD1F34CCAD170842B9E819C22FAB9890AE265C3BB6946FCCFE218544D00A6BA5BEF5224EAE24002B6E83E0B35E98C2322BE2EB3D8234BE8B048C54E40782C9A24D7A8B461EC05F38A94AAEF3DA3B46D0D85B0D949CF1089408189FF97C56C7DEE50A004AEAD82C15C7C0D0965F3C65A9A715A65D29CD3614954EBD91EEB4E74F862FBC944C56F2EDEC4D344F92E8154708AD0F5575880503EF0F107A9A9DB99BAE82357C16578F3E6CBDF9B427DA88DC322D11C6AB2A6AE6F5179C94454E09DF5CAA6A519A4C1903C8F2925639E12AF793695F256BF0E55E0D45B73880358F09719ED89A4A1A07868BFBF16095A20035D5D4F99FDA19DDAE3E21CB98308F4508B5CEE706C27898F03A2BF14F29ACBF055E4AB0713A7B6FC1A7853EFD36E1290E69587FEC15D492A66B9A4FEA6E2BCDE61E02FE18E06F59A2F4E06F177B14CE4C1CF1A8D1F49C554A8A4C68B9937B4C230320C80753D4B071BAB2DEDA89C9181820336F1E766E447EA1C44E15CBB7C002C1813D2C1726DB0E4DE289466077DA9610E5F3AA313B1B01DD79A4056A8BBE9D843CE5B0439325FFDFE91FDADDEC6CB86D5CEBB68D8F9C0ED237A4648C412780ACFF48FD9CE817EA70D950DCB989EA6B11FD87EA4F30347A27488C5C15BE7FD6D1280FEA3A7C022F8D9881FAC93176DB2025B4C7914A51099893A791BF5BE851F325347484CA6ED51B2BA71548A6046EA7EC85B31A9967E7D119D2CA3A51C1E14D5A3EEF0D41BDD615DA01D45979007A1997DE281BC340C3203D5BC0075B1AA38873A9DBB9D18E6E26971E70B54E41E2C8C91D2E60FBF85435C1EBC4893C45A201B1D2391549F52A1CA3E0440ADFB746FBBF0D9933F9FA0220B3E04EBEBB29D2A9AC1 + +count = 55 +seed = D780D7688AF364949A196657A066BD48FFA8DC45B4885279B6DEF362E5957F398CDCE1D20FC3F8F63A275C325FCCE654 +mlen = 1848 +msg = BAA4A41E4B68FE333FFA5EE97FD3DE18F0EECE8EB83E46A8E3505E2EF8AEA2C4040BA3809A764B681EC7449F41A2463651A8CC6DEF0E4A058EB843EF016E5CBA8D55F925E66524BE55CB98FC3169082E52E0D6CC3600C4E8A560B6D448A72CCC95620101323F98B43E28D6357414185ECB0263C7BB94E7F86146661FC897844CF52873114D39123260893DEF13516F982783B927864B61B56D3A8E5B4705DA3A95F6D12A6637C9CED02F07B4AA0B08B4924103036C2A93B31C91EBB6C5B77DE090EBF60A04191EB6CE9CC9B550F5B0C9104B74D15358854181C0C5640FC74CAEE14FED6577FD75EECA14070B6D02A9A421247A5BB262D6E62B04649E75BBD3ED8E72752289FA7C1A68096DD96A4BAC8A2DC27C44881DD2416387D74A005680A3D229D562D3DAAF8DC37B4C87CC86A8C991E9327CDD43BA930CDD8D1E44AEFB084B51111965C5DFB0EE2F09112B070CBFC545119ABA823EB3F65F26BCC025B39F79BE42C0396C5FC9FC924EF1B7EE9DDB71B6E69B579C0A64C5B020206CD3515B8D5F4FF29378B9580D282F7E5ECEEB5CE9C09A7B334E62151100CD658DFFFA66F4091231BEA6C9DE8129EC4F5FBE8BE0FF4BC93367DC69D9E38C177B23AFBA5C27FEE3E2B73C0037DD7C419C854DF7C2412349BAB43869469E80527C3AD3A7103152F9E0B03353A596002FF54ABA8B14AC393EE52EB5564D63BC2738D571FA3C255ABD20102BB299441B00EB988F3A5CFB238EF8C49963B4AE8877E6B317E208821510BF446CE6B06C33717C91C460924248382159198F09D0F5A25C1611B2D39CC6D2ED149FDF0E09A0B0B2BB77067182E386F5F6A55B68808DAD98E5CEB0FDFAE6A0315845ACC7B9C172B0E82190A5EB7C58DE4F86D883292A883045C62D6A1B3C886C345AA6158276EFA6B93AB2188E47ABDD25D332146E980E1B1E043CF63EE35A5AA01AB6CC62F77699DCA16FA30E3632DC5CCD3253D01E547746C78021AC307F0EF1A0119AD11504803EDAD933150981C4D9FD181835C507651DC92A86737E3AFD0EB4DDEF6182872FBD31BFC6D8427C2F4D3A39BCBE6B5120B8CF2AF5DC59949C92D10B1C6A96810564DD335E0755F9DE25EC26C102355688C38250DF8F96E105136855C8DE4BDCD86DF03F92977DA16908CAEEB4056F4A5F751A57BA057AC0309F1C107E594CF3C31544E4F1D93FB9AE7E1A2451E7082CF0C850990EE71ADE0498F6A3852DC4FC128BFDB8ABDDA3D759C8D4F83FED8509CDE5EED38410FB9F0A5F30EA45C9270BA2395DF645AAEE03F56158685A0BA65DE3D2C5209A7EF4BDD4BBE0CDC966DD1BDF1FE0BE06C7115F7CCD80F8012E5D17955AE0C9E4220076882F30DC5E391295994B9F809C09DBED8CCDFC89669F40492944FF20948080A4ED66AD8166B613AB2F4414762AE493EA6661950E8E56B3758A77CDBCFBF24FBBBF20EACD5CBF8815899A1C3FD20B1D04920025885388012D9C58EA842DB9530B7ADA901AB9CE46A12700687BDE07FB99BF66D0C775218B8454C936F03558B899B59361A0C664081CE8A7858DDBC5E7C5480280411C9ACF4D1EC45035D97524E9E44F963532CA5067609540C1BCB5627F99D5C61CB9A6D400F0BA0A74E45DDAB5A4E8A765DCF2F3684E3A2661A78AC069FA38163AD9F9713EB45C841C6617697CF8A72C54B550DBE9C22B04D579B09AAB0EF4EE8B70CA563F81EF9700C07761C944926F9A76A8C3EEE1CF7E7524D65908C47C35B0453DC10DB5B75123A5B26B9612C0AE18816A71F34638798DFCA21F5073CE771500034F9A71FEB8B621356C430B4D47CB1B59AD4677B5C679188D8861BEAF52558165F691F65A692E8CB8D24ABB74B8885EDEBBE52FB13DAC16E3A8EBC4EF192FD10D71898E93547C7A09F8642AA3B4FAAE23E48BFA809C5989D3462AA50FD4E5C4095542C45E5600926C2DECB4D18BB43B7274239A8DFA3D9DE1BB9CA099DFE56DEDFC9E120867EFCDA10B48F7E630506AA606D76E4537036127FA05FFFB8B8703CDC8DE70A78D014872111A431F393345D74E8866D9A9A633923072E93DBF47C54C4B205C60E67D5155B76F51AB49ACC7435525605DD43A10C88A03E08E257C68937BF2984BE63D40F8A60589D909F8F09688A77DA15DC7B4853339F235B1BD60AA845B4DB6B699325885C49DF9C40781CC56FABEA6201E2F8A9352C28CE321B9441422807E9C81C8F1EC85D240C9F1C8ECC4FF06D6E3682DEA3E6CF92F2B74C2165AF247CE0F5AB84460693254B523498A57E7442977F51F1C2F649BDF756E7F43AE543F5D8E692820F8A06322667A7FA9C1A5B10199A69CCEA22C74E172FED43E550C68C337ECC5E6AAD9F7EB997A7E619D47DF73CB917A705C3CDE5FF344F6FBCFAECCE6B734E09A385FE54B224A880704D774581074C59EB0A3B42C59B8BA4518E764C5A532F6655DD839862AF716903A118433CE0809376A88E88FA847B4D1C63EE393267B15C1E42A91DC6107CDE990EC9ECC7C1066E9480E90A22907C51AF47DA837438A90CC07DE8121691BD73802D5D09D18A2D8B38A28948735110891D1B559A73445838F359A6FB90A3CAB887486CC9D95CBA35B55693C890830D2 +pk = 8D59FFBA0EB6527526523D96EB7B0095B553CB5CB07C93DA4390466360C645CE93E7721BB911848C171BDFDB98B7BC0348AAB771B3A115312A138D09E0240401B010F1AF992F9745968DCB06CBB749347D30C5FAF6B243199AA0299CBC229E5F4A4610008582C019FF23E4E3BB721B086FE3848376FA2E8CF6EFDA62809407010A +sk = 8D59FFBA0EB6527526523D96EB7B0095B553CB5CB07C93DA4390466360C645CE93E7721BB911848C171BDFDB98B7BC0348AAB771B3A115312A138D09E0240401B010F1AF992F9745968DCB06CBB749347D30C5FAF6B243199AA0299CBC229E5F4A4610008582C019FF23E4E3BB721B086FE3848376FA2E8CF6EFDA62809407010A6BD0AFFE63EA726AB6EDBE36581C66D6E4B05DB69FA1E958475E20F14E0104DA740100000000000000000000000000000000000000000000000000000000000072E3DC11232A4E96CCE872F7EBC8A573252499D7B4AC9451EFF2BFE64DAF4F90C4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB171978C6EA3E0E0B594F79744E553A99F68541A6E7AC9DEC629696CCF6230D21FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002AD865C130344C7BDA28A93DC2E582E96FED464B8AC1836B0559C59E1836CF2831AC25B6B451AE4713FBC084550223A36A9E60F73E8534A9A1A4BE7C02AA09536C7863FE71E173C699FC89EB35A62B2798D54AD64777FC57FBFA293DDDDD5332E5FB0FCB5735D4BADA3C158C8C4ACDB1512634CD91F4FC7F154458E7560E2B3D1AAEC87B1F865893BA48A5D158B7A09478CFDD1F8D0538DDAF4341384BC546FDFF60452102D6442B4DD79CF3459408EB30C437D256B5C5C3F41DDC3A0FEDA62580CABC9E63418705799B73D5F9AB1DA04AE7D038E4085CB43C8C6222006D4809900C86741D737E733E358C2C3A57C6696AA51224549EC54AC09FA70C +smlen = 2140 +sm = 963C3A0942B9AFAE292EB808BDB4E766DA4B1B139A03970D3ED3FA014CFD1C456752BAFDABBC9541237092A6EC5CC9463903CDF89E91B5DC10F781B1EBA52F01E0D54F29B017EC84C4F6764186658F1E79E1B51B0FBC191D9998FA7567D903BFFB5472A9834C1B12002765D300E92E7A093D275F31EE37E972251F1D1F51DE00010005DC226C43D07FBC7E513DE6D6D2CB2F0702C827424CB79EDD580E6A99BF181130DCF8E8D51AEF00D7ABCC85477577ECE39A9036DE477030E9DC13394C09A30D166EF12A7BF9A67800295D45F8506932ED1C91C4515FC3D1952FA92D18E4B5128107B25E37276220248FD525A39A88DA1FFDAEEB210A1A189FE7E87E1C2D881F7D60FF3EA18145E8B5E86AD55BFB18BC3F6A1D193A27ED4AC8FF6DBE7DD560000902BAA4A41E4B68FE333FFA5EE97FD3DE18F0EECE8EB83E46A8E3505E2EF8AEA2C4040BA3809A764B681EC7449F41A2463651A8CC6DEF0E4A058EB843EF016E5CBA8D55F925E66524BE55CB98FC3169082E52E0D6CC3600C4E8A560B6D448A72CCC95620101323F98B43E28D6357414185ECB0263C7BB94E7F86146661FC897844CF52873114D39123260893DEF13516F982783B927864B61B56D3A8E5B4705DA3A95F6D12A6637C9CED02F07B4AA0B08B4924103036C2A93B31C91EBB6C5B77DE090EBF60A04191EB6CE9CC9B550F5B0C9104B74D15358854181C0C5640FC74CAEE14FED6577FD75EECA14070B6D02A9A421247A5BB262D6E62B04649E75BBD3ED8E72752289FA7C1A68096DD96A4BAC8A2DC27C44881DD2416387D74A005680A3D229D562D3DAAF8DC37B4C87CC86A8C991E9327CDD43BA930CDD8D1E44AEFB084B51111965C5DFB0EE2F09112B070CBFC545119ABA823EB3F65F26BCC025B39F79BE42C0396C5FC9FC924EF1B7EE9DDB71B6E69B579C0A64C5B020206CD3515B8D5F4FF29378B9580D282F7E5ECEEB5CE9C09A7B334E62151100CD658DFFFA66F4091231BEA6C9DE8129EC4F5FBE8BE0FF4BC93367DC69D9E38C177B23AFBA5C27FEE3E2B73C0037DD7C419C854DF7C2412349BAB43869469E80527C3AD3A7103152F9E0B03353A596002FF54ABA8B14AC393EE52EB5564D63BC2738D571FA3C255ABD20102BB299441B00EB988F3A5CFB238EF8C49963B4AE8877E6B317E208821510BF446CE6B06C33717C91C460924248382159198F09D0F5A25C1611B2D39CC6D2ED149FDF0E09A0B0B2BB77067182E386F5F6A55B68808DAD98E5CEB0FDFAE6A0315845ACC7B9C172B0E82190A5EB7C58DE4F86D883292A883045C62D6A1B3C886C345AA6158276EFA6B93AB2188E47ABDD25D332146E980E1B1E043CF63EE35A5AA01AB6CC62F77699DCA16FA30E3632DC5CCD3253D01E547746C78021AC307F0EF1A0119AD11504803EDAD933150981C4D9FD181835C507651DC92A86737E3AFD0EB4DDEF6182872FBD31BFC6D8427C2F4D3A39BCBE6B5120B8CF2AF5DC59949C92D10B1C6A96810564DD335E0755F9DE25EC26C102355688C38250DF8F96E105136855C8DE4BDCD86DF03F92977DA16908CAEEB4056F4A5F751A57BA057AC0309F1C107E594CF3C31544E4F1D93FB9AE7E1A2451E7082CF0C850990EE71ADE0498F6A3852DC4FC128BFDB8ABDDA3D759C8D4F83FED8509CDE5EED38410FB9F0A5F30EA45C9270BA2395DF645AAEE03F56158685A0BA65DE3D2C5209A7EF4BDD4BBE0CDC966DD1BDF1FE0BE06C7115F7CCD80F8012E5D17955AE0C9E4220076882F30DC5E391295994B9F809C09DBED8CCDFC89669F40492944FF20948080A4ED66AD8166B613AB2F4414762AE493EA6661950E8E56B3758A77CDBCFBF24FBBBF20EACD5CBF8815899A1C3FD20B1D04920025885388012D9C58EA842DB9530B7ADA901AB9CE46A12700687BDE07FB99BF66D0C775218B8454C936F03558B899B59361A0C664081CE8A7858DDBC5E7C5480280411C9ACF4D1EC45035D97524E9E44F963532CA5067609540C1BCB5627F99D5C61CB9A6D400F0BA0A74E45DDAB5A4E8A765DCF2F3684E3A2661A78AC069FA38163AD9F9713EB45C841C6617697CF8A72C54B550DBE9C22B04D579B09AAB0EF4EE8B70CA563F81EF9700C07761C944926F9A76A8C3EEE1CF7E7524D65908C47C35B0453DC10DB5B75123A5B26B9612C0AE18816A71F34638798DFCA21F5073CE771500034F9A71FEB8B621356C430B4D47CB1B59AD4677B5C679188D8861BEAF52558165F691F65A692E8CB8D24ABB74B8885EDEBBE52FB13DAC16E3A8EBC4EF192FD10D71898E93547C7A09F8642AA3B4FAAE23E48BFA809C5989D3462AA50FD4E5C4095542C45E5600926C2DECB4D18BB43B7274239A8DFA3D9DE1BB9CA099DFE56DEDFC9E120867EFCDA10B48F7E630506AA606D76E4537036127FA05FFFB8B8703CDC8DE70A78D014872111A431F393345D74E8866D9A9A633923072E93DBF47C54C4B205C60E67D5155B76F51AB49ACC7435525605DD43A10C88A03E08E257C68937BF2984BE63D40F8A60589D909F8F09688A77DA15DC7B4853339F235B1BD60AA845B4DB6B699325885C49DF9C40781CC56FABEA6201E2F8A9352C28CE321B9441422807E9C81C8F1EC85D240C9F1C8ECC4FF06D6E3682DEA3E6CF92F2B74C2165AF247CE0F5AB84460693254B523498A57E7442977F51F1C2F649BDF756E7F43AE543F5D8E692820F8A06322667A7FA9C1A5B10199A69CCEA22C74E172FED43E550C68C337ECC5E6AAD9F7EB997A7E619D47DF73CB917A705C3CDE5FF344F6FBCFAECCE6B734E09A385FE54B224A880704D774581074C59EB0A3B42C59B8BA4518E764C5A532F6655DD839862AF716903A118433CE0809376A88E88FA847B4D1C63EE393267B15C1E42A91DC6107CDE990EC9ECC7C1066E9480E90A22907C51AF47DA837438A90CC07DE8121691BD73802D5D09D18A2D8B38A28948735110891D1B559A73445838F359A6FB90A3CAB887486CC9D95CBA35B55693C890830D2 + +count = 56 +seed = 36AB8588F5233D15674677535A682382C29968FF824031AF646F58FCAF0E83C1C486B1E75479149FD6F4D9E8397CAF73 +mlen = 1881 +msg = 0707EA05515798829F42A4CBDDB4A95C5750879E0A584AB503F778015F83BEBF6D63C3B48A4F478EF01091403DDC5A9662E39707DBC8502ACF50F3E06ED0199CC647EA155FEEF503BE045BEA4035C07C4CCEDA306B8187185BD06C14220F2B7401229969C1CFF8C36D499D5A725FA1CE7B44D71E6C0E4E750766183883D838DAE4F00B140E0AFCCB0E72F935018A6314232DC632C5AD3C26919D1A7925BF0F665CA0223439518143486CE92650DD145FDB2E97E0D5BC9D6806F442FE90C9C1F52992E670DB2603AD885FA42B3D8BEA4E470B7F76A367AAA506E931890B6E4607F59E87A7A5FBF3991EEAEE47CFBBFE3CBE028E67BB645D37A7BE5E7CBA6D7955CD62D1D8DB0D9772EA0185C25BC1AD40A09D3E7E9CABA72BDC3A6EF3C40C7ED6208854157914A80B5C66A6DEC2317FB5A529421C03CCA6FC0A3B3D51556E8DEE7C1EBFBA924FE2EBCE8A46BE96E761AA6749C0A9A2B2FC49B42CA47663EA3395DF22DE20947DB14FC1FAD03805955D67F8473BAEFE2C1E22BDCC7BB988DB0DDE4E83E26A16F10B93BD9CFDBA77B9302EDBA0C9AFBA7369A023EF763C55484F7425F842111CAE27E07A511A725F25D422D933F2EC201BFFE3291411AC3CD6E91018C95074C18FC780A73945B148154987854CFA1CF1199BCD03519C8F34774453DF90B71FEA6734DEA7191EE2A5735F7A191F527642D53C844B087E9346B07EDD0B78C36F83445825E60A13C424F72530E05F75DA8D33957FAFF004DEB549985790956A0E7D9B256298D56BC6206F1E4E1E958FE298641A277A2C8B6B9B7660DBF689AD7E1A19CBD965CBEAA4A0D30741586290576996AE668ECBAB4F06F2A1D542E32C5D3F042E7E29A41BF86BAE29E7029D997876CFB23B10986A45CA029739B2446A29C55561AEE8FFB187961E6E7401D726AF6D8A5C816B2CEAA9A1C9B780DDCC4F0E4003542B193AE26EC687F8C51451D2D5387D9C3B9EB95981DF2DE069FE741CD5C15F6D1B12C5B9B94230ABA33BF46DCE8AC7E26896EDCB4F87272C32D19E72C313738855C02C6F46F1162BE0A3ED2E76704B16169689BF532EAD7AE7F2B26F4D9B22712662BEEA1F46748FA4C27D1D825D3FE493B5B3B513617C81D21A0912D329C5A4E3A90EF5A29A4E3137D1CE3EEE99C42D034E61593A4076EF124BD6BCF8FC911FC9F6077D82C2980C2ADB955939441BC9E81BDF9D6996CE578114C01F9BA096D6EA40F4E0FBB18B3E3D25E7F6D6CB670AD26F604368ACB6190667B7B7ED3C1A1DA04E42AE0087852834B91AA072AD51C0193E5299481221BC9083118F7B5503559F1E2D9E22A8D57932CD0B59509E7D7F459E20EBF4C1D0DF71472340E64992C0485D593714D6B469547616DFEAFC95089689931E79944204A6D0A47A565DC325F3BE19FD44BB6CD4BF2B1D4A78C883154D70705E121B833A4A7E7E80FCDCA03F52C1F831AB0D989AC5DBB5CD83BABCB3EE74B69681818DC05E33234775123F552CFC7C7BB0B98C937957A2C4E86E3D775468A7CB8D33756ED7489D04DBE52EAA2737EFBC4C4D0F55B5A841E1453763E611BAC358FAD0B5778C6015D97CC42CA9FECC66CF844DFE55587C200DA5250B3A419791F57D3A4F672551BE885DFE2AA8637D6C890EE8E1063E782FD7E2CB356BF47B6EB93A155D8D64C9F6CCA3971C5A7FACC3C052A2AA9FB286750F76933261AFF5CE408BDA8382AF8535145F432F78B3B25A768B5DA2A211D1D07AB557CABC7A139F66EDBB744AA76E0FBF22092E31C92CAFC624EE1DC6732F27E8E7632C6EEE2D1F5C85B52D712C884B36C91DA383F0DE9E06E5EF63D7B7A692E5E91BA1A1D9298E26694FAAD9EF262F117DF8115E2E877197A8069A96210CE65D45E6AA7011654ACFAFDA810CCCC20C1985D54483DAE12B29D7ECF66376968B52FBD727CBAE7C9E3DBFEE7391D985228ACA9EB8EF98FAE32BD24552A6B34BAA581DBB03676A3A4546E10EFCEF269B18E1172F560FA0F0344149543551E079C1745BC0425B5233B7D7DC32F751D321638EDB1CEE56DF0359EB6D9863CF3E341A56060C8EF8486014F956C39B751AE239A493A017B2FA5210D374BA83DF5D799B7CD92987FEBB0B2CDB3EE42A61381304C5EAE2ADD4777011C3279BBCD1EDD6F91FF72B3C353AC35DA8FA843DC5561D3CDB507730E8BEF20CF09B0DDC36D47F4C10D82652DC2937D889F83B1DDC30E52B244250D19EEA9CF7A3B5D931E2E25B64A0A81B2C4FE933A17BEAC2E10FD888D07F994E4F2583D204DA126533F5E36B62486A00CCC317C4381A8FE11D36C43E71BE108E22A98F53729F05A5E0AA38D512423DB4BC1D6BFAE9117383ACF94AE2A737F6B8070858BEAF08E365CA84925F8BEBAEEF5AF77EB73A9D3648AAA6493CEBDDB95149F0DAFACF129FC321E558084A44CCA4B429D664D90DD90F2A04818B48D135952746CECA76F99B947A33A3BF7C535B187C1971AF4FCB1EAC841BE7E96F429DD38127B52FACC2DD6512D8D019E0080CADBF7078FC67E9AF170A2A00F70F407B0A7FF469E2F6EA165F8B43EEF1779A115089DE9ABE6B78C93E4B8E3B018686D16CE8EBC88CBC1D571372A3996C9E5967C035F9DA6E200E7ECFD1CF7158563F36A3AAC3CD8ACF52A4EEE29DCEB03FA3272A671CFC9B +pk = FEF2F4E0FBC14602D89492470C194E1A3FE63FE6D7C74854AA0B7559552209006F0A4C38CE79312F9989AA2209C6B689D5678E0D3F6DC060AB3C59D730530500D1214F79FEE5663AE4618AF8D5B57B941CD3C8CBD3A2A92AFD26461DEEE46A8F17A1E5FDEDBD194534BD8966625810A6A8EB9D652061405FEAA84DB7BF66840002 +sk = FEF2F4E0FBC14602D89492470C194E1A3FE63FE6D7C74854AA0B7559552209006F0A4C38CE79312F9989AA2209C6B689D5678E0D3F6DC060AB3C59D730530500D1214F79FEE5663AE4618AF8D5B57B941CD3C8CBD3A2A92AFD26461DEEE46A8F17A1E5FDEDBD194534BD8966625810A6A8EB9D652061405FEAA84DB7BF668400027BCFC167247C593E4E87781FFCB9EA335573520E89CFF68783B7DCA6441E601E2201000000000000000000000000000000000000000000000000000000000000DED2550483FBECE1371048E54EB1EFE63C25188ED1A382FCC467B1F9541506200AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1DD77039320C450728747EDEC180DF4065B248AD9086E9FCD06127B77D1842285BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000363D9469F19419F7BC7FF7F97BEE1720E4D91691EB1AFEC2A47F3BB21C1B0EA8C95BDCAEC17DB2DC93CF4A8BA6B557695B23A85DAD0416473E2005615ECF00238B3B4B2EB53DCC50D262867458BA7EF897D51A30638A21C518792719C7AC0555C1109E762EBB2C7C65DC8E744BA059308CFF9B45294D6F96C8F9D9614103DDCB783DEB7B5A7CE7E0ABE97B30B7C7F71933FD8A7F68FC408B65AD9457D1A85E2A9D990EE7329DA74152E14CBDAE3B4F8C09DD0B8683EDC0650C30997107666E58B8C6A0E53B5B228F5789CCA028F68B46F4403ED565A4F88664D4BB6BFE8D7B2E02FAB925BFC587D3616CE20B5AE98916758B8B24E6DF909391EEDA0C +smlen = 2173 +sm = 004A87B5E69574B9FD649FD763BA8B322B80AA9E30B50242CB430125543AE13CE8A9F7B714A969983152772DA1773BAEFF1D4F1B68194FFB1BDB504DE85E6C01F2AD363459A37D55772BD2041B7D01146D1CDD20FA5A94C56C35CC9EC022F35390837CFEBF95CB754BA94158AF4ACD051A0C0C9DB8AA61EFED937D213FC6000100009EEDF7F3A4B1D444492844D4CF866E7BA59C95CCA4A6D6DF303A0A789AFA216C1D9192EA4F8412A8CFC5CE5D6D35E822BC7E91FEE0F043C059ADF43C2009F663032F550707CB5EDE1ADEF5307C3B498664340949CCD71BE00705951F3F969168506E1462B76150B72984CCCF90F51AEC92C62F9C54C21CD78FC129EE1C29A86A38A60CBACF7513CD00A86EEFF2E70473CBD4F4B8BEBC4FC1ABBEA15EEB8C2500020B0707EA05515798829F42A4CBDDB4A95C5750879E0A584AB503F778015F83BEBF6D63C3B48A4F478EF01091403DDC5A9662E39707DBC8502ACF50F3E06ED0199CC647EA155FEEF503BE045BEA4035C07C4CCEDA306B8187185BD06C14220F2B7401229969C1CFF8C36D499D5A725FA1CE7B44D71E6C0E4E750766183883D838DAE4F00B140E0AFCCB0E72F935018A6314232DC632C5AD3C26919D1A7925BF0F665CA0223439518143486CE92650DD145FDB2E97E0D5BC9D6806F442FE90C9C1F52992E670DB2603AD885FA42B3D8BEA4E470B7F76A367AAA506E931890B6E4607F59E87A7A5FBF3991EEAEE47CFBBFE3CBE028E67BB645D37A7BE5E7CBA6D7955CD62D1D8DB0D9772EA0185C25BC1AD40A09D3E7E9CABA72BDC3A6EF3C40C7ED6208854157914A80B5C66A6DEC2317FB5A529421C03CCA6FC0A3B3D51556E8DEE7C1EBFBA924FE2EBCE8A46BE96E761AA6749C0A9A2B2FC49B42CA47663EA3395DF22DE20947DB14FC1FAD03805955D67F8473BAEFE2C1E22BDCC7BB988DB0DDE4E83E26A16F10B93BD9CFDBA77B9302EDBA0C9AFBA7369A023EF763C55484F7425F842111CAE27E07A511A725F25D422D933F2EC201BFFE3291411AC3CD6E91018C95074C18FC780A73945B148154987854CFA1CF1199BCD03519C8F34774453DF90B71FEA6734DEA7191EE2A5735F7A191F527642D53C844B087E9346B07EDD0B78C36F83445825E60A13C424F72530E05F75DA8D33957FAFF004DEB549985790956A0E7D9B256298D56BC6206F1E4E1E958FE298641A277A2C8B6B9B7660DBF689AD7E1A19CBD965CBEAA4A0D30741586290576996AE668ECBAB4F06F2A1D542E32C5D3F042E7E29A41BF86BAE29E7029D997876CFB23B10986A45CA029739B2446A29C55561AEE8FFB187961E6E7401D726AF6D8A5C816B2CEAA9A1C9B780DDCC4F0E4003542B193AE26EC687F8C51451D2D5387D9C3B9EB95981DF2DE069FE741CD5C15F6D1B12C5B9B94230ABA33BF46DCE8AC7E26896EDCB4F87272C32D19E72C313738855C02C6F46F1162BE0A3ED2E76704B16169689BF532EAD7AE7F2B26F4D9B22712662BEEA1F46748FA4C27D1D825D3FE493B5B3B513617C81D21A0912D329C5A4E3A90EF5A29A4E3137D1CE3EEE99C42D034E61593A4076EF124BD6BCF8FC911FC9F6077D82C2980C2ADB955939441BC9E81BDF9D6996CE578114C01F9BA096D6EA40F4E0FBB18B3E3D25E7F6D6CB670AD26F604368ACB6190667B7B7ED3C1A1DA04E42AE0087852834B91AA072AD51C0193E5299481221BC9083118F7B5503559F1E2D9E22A8D57932CD0B59509E7D7F459E20EBF4C1D0DF71472340E64992C0485D593714D6B469547616DFEAFC95089689931E79944204A6D0A47A565DC325F3BE19FD44BB6CD4BF2B1D4A78C883154D70705E121B833A4A7E7E80FCDCA03F52C1F831AB0D989AC5DBB5CD83BABCB3EE74B69681818DC05E33234775123F552CFC7C7BB0B98C937957A2C4E86E3D775468A7CB8D33756ED7489D04DBE52EAA2737EFBC4C4D0F55B5A841E1453763E611BAC358FAD0B5778C6015D97CC42CA9FECC66CF844DFE55587C200DA5250B3A419791F57D3A4F672551BE885DFE2AA8637D6C890EE8E1063E782FD7E2CB356BF47B6EB93A155D8D64C9F6CCA3971C5A7FACC3C052A2AA9FB286750F76933261AFF5CE408BDA8382AF8535145F432F78B3B25A768B5DA2A211D1D07AB557CABC7A139F66EDBB744AA76E0FBF22092E31C92CAFC624EE1DC6732F27E8E7632C6EEE2D1F5C85B52D712C884B36C91DA383F0DE9E06E5EF63D7B7A692E5E91BA1A1D9298E26694FAAD9EF262F117DF8115E2E877197A8069A96210CE65D45E6AA7011654ACFAFDA810CCCC20C1985D54483DAE12B29D7ECF66376968B52FBD727CBAE7C9E3DBFEE7391D985228ACA9EB8EF98FAE32BD24552A6B34BAA581DBB03676A3A4546E10EFCEF269B18E1172F560FA0F0344149543551E079C1745BC0425B5233B7D7DC32F751D321638EDB1CEE56DF0359EB6D9863CF3E341A56060C8EF8486014F956C39B751AE239A493A017B2FA5210D374BA83DF5D799B7CD92987FEBB0B2CDB3EE42A61381304C5EAE2ADD4777011C3279BBCD1EDD6F91FF72B3C353AC35DA8FA843DC5561D3CDB507730E8BEF20CF09B0DDC36D47F4C10D82652DC2937D889F83B1DDC30E52B244250D19EEA9CF7A3B5D931E2E25B64A0A81B2C4FE933A17BEAC2E10FD888D07F994E4F2583D204DA126533F5E36B62486A00CCC317C4381A8FE11D36C43E71BE108E22A98F53729F05A5E0AA38D512423DB4BC1D6BFAE9117383ACF94AE2A737F6B8070858BEAF08E365CA84925F8BEBAEEF5AF77EB73A9D3648AAA6493CEBDDB95149F0DAFACF129FC321E558084A44CCA4B429D664D90DD90F2A04818B48D135952746CECA76F99B947A33A3BF7C535B187C1971AF4FCB1EAC841BE7E96F429DD38127B52FACC2DD6512D8D019E0080CADBF7078FC67E9AF170A2A00F70F407B0A7FF469E2F6EA165F8B43EEF1779A115089DE9ABE6B78C93E4B8E3B018686D16CE8EBC88CBC1D571372A3996C9E5967C035F9DA6E200E7ECFD1CF7158563F36A3AAC3CD8ACF52A4EEE29DCEB03FA3272A671CFC9B + +count = 57 +seed = 4E94DD734A371A7C6AD4A567038CF93BAACE2B9D30F3862198DC55D2F21F8FDC9A7AE5DCA1541712179E3AB1FFA3F792 +mlen = 1914 +msg = F3EA695264936D537D86E545E132131442C2973D19B37F8C911E3ECEF4A13A8B1EDF5E5968A6198D26205FFE6B76CB14E353B5E2C9DE1BD44AB9BD55862BA1A479833335725EF52601810C778DA4A32C497CCFA43F91C72A1499E8D295AE7CDB43F1CA05F0D4A31B30D9A69CAB8288640F3F9E081E2C98CC8351C7EB9954D428DA4BB374B346A83EFF5AA3F455F2BB3FC922F901BBE5695E3AB9892A93BEEF90FC150B3BB47F6965C229F7DCC3100A4101840417A0E2547F9D42AB27216254A2898368BFC60E7D407271C213233B6913C8E48DF10967757BFAF5B5E2A284B8F67C70537C97583786B5185B45E2E36BD8B5443E98601F772829176C4D66F44A81AAE7C13F539490640BFC40B83E1C75305B06BE60E18A0AB568859435B715E15BA1EE4DE73E04E1B09DD15350AE423C131706F057255E9FA8FA3F9E3ADE7435A6451F7A2AAD0C0FE0F444C4A247DCBAA49E7C926DD52A33D3737B4439C1D40F861720E37BD25366EB5F34BF4B552160F3EB80CA8FB19304E1E4143090F8E965DAEFF17551A3931905B5CD991C6BC5AF5BE808073893A47FBFEEC0940EF5E7D2F2EE199847E1A4BEA447BEC40F86F6FDAEBECE6FF0F66E04193355C9576DD4AAB2D796CFEE5D432B1D32E13B8903A06FFD3AECB00C169A3AF8389848CEC724F647C6BA8DC3134CA18586DB3E4138601A16DF8873A490F23C4D27FD9C3D4FABF2BDCBA4AF3F0793E7B591198100EC97602D9BA572409EA49D7C8EDC646335FD4494577720EA7CDF3B4266FC201DE4BC204C0D35CFB55010BFAC68CA0DF3AC936C9FD2A9C532B8E3461D25362EFA37DA159B64670060CAB833ECA799FCF1342C7EE1B80BDE05ABAD08B9EE8908D50CD0D433DDA0B120D1980F690ACAD9C072502AB537EF71B691917A76D3098C27FDC6FAD1F1B29E307E17C87D9FA6A06CF8CEF6568D9E4E005FEEFCB5F41A46D91E31B41268367D636C4478921E690D5D57E99DA3448773D51B673109CFD3A58CC50C127F34F4963FCED6C216E60EA0952317FBFE88807BFF4223624F6126104CB46C8D39EE228BB4FC0002287E346E5ACE43E2CAEC07A22203FE3C4AA9008A94F7075F6E449FB89905BB955FA0023608C494F7B73D2AA4E2B0A8A7E3CAA889B6B6A6640F7222EF969D46FF6794BD97C5363921461BACDA17F2781E14419436E37610E52E3B7B7BF9C1A4B1D80876030F9A8981DAA4F06A432DBA739DB988BED5DE7F38378EC1F7D8A46B305896CA0CAA5D8AD74002863C6FF91EF25AE96450936509EFA93F94718E895A82B4616A965AF004038E0897A6563DBC91EB5A6172ADBA052250D06D210BCF5A250246FC3482E57FCD9901104C5AD58EEFFAC2860A4DA9D2C308552EFBDA2D4275F3F3651E9935A0E42869B9263FC7EA71079E604A4EC6DC61CEF6AC6CC06194DEF432C1F7CD9EDFB0C4B448DAE3C2A685BC818B2A90E17A4C1CAAA5FC2632F720E764E2B8DA314224498119A0D94CF5DCE24176421C2736575672B361119EC7C766265768CD9FF1957A17779C11244C1CC82D72D4E3C87107885F71C56DA2BC41008B0BC1375C12B3B2A80071EC03E377A93BFB227BD560EDD5E5D88F46F7FF9831F05BF262F01F62278D3DC13F4F0CECA0509091C25D20666D8D3527975CA3495F6843B46B5D5B6F5C650E981DEFB3943963E14F00A0F78CE785A21634C46B531B4F2AC5AD0F03D92372C334CE963E514A1891716EB5D5BB1B67834994EDA492719032E2A4F961DDD6D2002D8F52798C45A9DA8145BFD191E97D1FBA1B395858B0FC7D5F5A54E69FB3780635F70A763E44075075580778676E6B9705B40F40210E597B5AA1AA77BCC3BE5005159A4B68CBDC6AD8674495E0DF65A6DECABAFB993CC49C082D358DB1E5B3A8AF2FCB0049A15BF521986AD84148135CDB185FDDCA6802C2ADE9EA2E82047725D73F51E072CCD799D696D7530F61B16E9B4727C58CB0F552B188F9B451BE543BD809B63D66BCDBAEB7AA917BE6AEF05DF559B3AEAF65D5EA12E852D1370EFD6197F970F52292F27923A10D01AEB652A9A44573C137257B49D130F1DA48E532B3E33D4854B995534380B4549511B39A99145AF5ABE0CCD3A9DBAF673EFC115CB75A9A5A806679907BB525A2BD4507977329EB4C985B3575DE6533FC5D62358C21AF3DBDD20DEEFD7C417C77D37DC2A098A8FA48F7944B7EC6F929387BA11E3516C9EA681238650416FFB97EA343D5F227BADFDD509B94C1451C54F85E4539A8F70DBB5EFBB10B2D82A16FD0C997C603B8983CEB840A7C3B61918D8A97766BB8442C3B9EF2D324E28DC19748417D32F642874A8927688C74BF4F6F6724015C4DD50EB83B85F613FA20938F5C895F88830A40C9799C212B2DFB453BA0BC534F75CEDAF7A016F6744CB4F5269FBF0284EB90CF1023918078024C3B125CD9C7501224050B4D20B585472B42A0F494513ED131BCD8F75E223317F56B37CA48780750DE0BC81C74A3388C94D93A65719122E9D533274811B76965265D7B2F91EBE3C5924ED2D4DD5E327A6E7546AA2605E4C78D0208DB7A7F678CAADFB32E6BCF8C77FC7810F7D1D5D50E26D1A0DA03B8AFCF99904B2B3198670462451925381F0BC404C51F2F18FA7E2C1E8B0C6CF97A9A65E575373996C3E9DA15A18D15C93548377677DD713C9828DC4E4EE823A241377C65A2948BD29447BFBE +pk = 3E2172A11D117B502553F8D8195E78276565E2C77E94B48E9407816D5791DF4E02D554E6CE6DA79342BCCAEF842E8F5EED9A13FD7740ACA651B3FAE01130F3008322F21BB0F1E106F282C823FD083FA3BD8A6044BC9B71E60CD2C24908D6774A9F1F0763639AD3608757050F02A83AB7C48363CC89B2C74357F407592AEB4D0104 +sk = 3E2172A11D117B502553F8D8195E78276565E2C77E94B48E9407816D5791DF4E02D554E6CE6DA79342BCCAEF842E8F5EED9A13FD7740ACA651B3FAE01130F3008322F21BB0F1E106F282C823FD083FA3BD8A6044BC9B71E60CD2C24908D6774A9F1F0763639AD3608757050F02A83AB7C48363CC89B2C74357F407592AEB4D0104C59CCD0C310E7BDC93C1E5A606459006B6FF34E588331B35DF1A7D0011BC4198010100000000000000000000000000000000000000000000000000000000000016C4BF94E48EF29EAC90F36FC73CEB73870811A171DC4AA5965C2731E49FBDA9C2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBF78116B9C3D5FE0B4748FCFAAD402652D57A7E82FFB84A2E898E69F1B3029AAFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000762F7F94E8C5CA81203791EA4F9A8ECF7093ECE927A2534A17D0708000D8EDE54801016B05CF12B1B7387B71BBD41DB246EA46737EA926DC86D7D7B03CB105C70B36D21D8622785F48B20A66CBB29602CE41150F729BDA29C7866BCAF7B03A70843EFF90ABFDA0D1EB9F9CE5A09BD342A463EE3F07CE1B69CDC85D10160391833723AED4041B634F2F6DFFA3045F2EE3CD19119D2BA23CDAFA47453FE32972C04002DC54EFE1771E517DCF370980B4B1E82DA9185385F68F80FBAFCB0A67FAFB1B97EBA10C3DD64396274483EE1A2F1A2BA6D4B1321D9813A21E3F98EE3AF57EE68178A38E92BBA5DDA135B75A8978421C1B507A8453C36ABDFEED01 +smlen = 2206 +sm = 3235BDFAD6E3880AD7811463604816AF5BCEE401E95FAF5F5E03940DE7EBE66BD947A8D3C4F5AFC0499E720D64BE1BF83025AEB13C4963A1D77F721E9FBF0700780CA2E78B2DFB1211A33A68D46D9304100B5FDD9C803EFAF2490645A98DC1DCB8447454320F54B353BAFDDB3782DCDFB8CD801B6EFCDD675764B2D0654DDF0001013DBF7B122685CD6D5DFF0953B5684F2F77FC5D4918EFB5992E3176A9FF44F03C5243BFF53FE43764C76B03F5115E6EC5F1DB7AF9457F7A748CF2AB0965500E133173975C04F8297AE4F192A932978298FDBFE238C259FB2CA7DEE8BF75E965128CE9DB780C413F58BB026E56866F1E9FEB76BE6C2F4D01DA7FFFD40AB83C75140663207EC3D7F1CF8FB25F160FB72146F713C00F9B4AB7BB856E2C838F4761000909F3EA695264936D537D86E545E132131442C2973D19B37F8C911E3ECEF4A13A8B1EDF5E5968A6198D26205FFE6B76CB14E353B5E2C9DE1BD44AB9BD55862BA1A479833335725EF52601810C778DA4A32C497CCFA43F91C72A1499E8D295AE7CDB43F1CA05F0D4A31B30D9A69CAB8288640F3F9E081E2C98CC8351C7EB9954D428DA4BB374B346A83EFF5AA3F455F2BB3FC922F901BBE5695E3AB9892A93BEEF90FC150B3BB47F6965C229F7DCC3100A4101840417A0E2547F9D42AB27216254A2898368BFC60E7D407271C213233B6913C8E48DF10967757BFAF5B5E2A284B8F67C70537C97583786B5185B45E2E36BD8B5443E98601F772829176C4D66F44A81AAE7C13F539490640BFC40B83E1C75305B06BE60E18A0AB568859435B715E15BA1EE4DE73E04E1B09DD15350AE423C131706F057255E9FA8FA3F9E3ADE7435A6451F7A2AAD0C0FE0F444C4A247DCBAA49E7C926DD52A33D3737B4439C1D40F861720E37BD25366EB5F34BF4B552160F3EB80CA8FB19304E1E4143090F8E965DAEFF17551A3931905B5CD991C6BC5AF5BE808073893A47FBFEEC0940EF5E7D2F2EE199847E1A4BEA447BEC40F86F6FDAEBECE6FF0F66E04193355C9576DD4AAB2D796CFEE5D432B1D32E13B8903A06FFD3AECB00C169A3AF8389848CEC724F647C6BA8DC3134CA18586DB3E4138601A16DF8873A490F23C4D27FD9C3D4FABF2BDCBA4AF3F0793E7B591198100EC97602D9BA572409EA49D7C8EDC646335FD4494577720EA7CDF3B4266FC201DE4BC204C0D35CFB55010BFAC68CA0DF3AC936C9FD2A9C532B8E3461D25362EFA37DA159B64670060CAB833ECA799FCF1342C7EE1B80BDE05ABAD08B9EE8908D50CD0D433DDA0B120D1980F690ACAD9C072502AB537EF71B691917A76D3098C27FDC6FAD1F1B29E307E17C87D9FA6A06CF8CEF6568D9E4E005FEEFCB5F41A46D91E31B41268367D636C4478921E690D5D57E99DA3448773D51B673109CFD3A58CC50C127F34F4963FCED6C216E60EA0952317FBFE88807BFF4223624F6126104CB46C8D39EE228BB4FC0002287E346E5ACE43E2CAEC07A22203FE3C4AA9008A94F7075F6E449FB89905BB955FA0023608C494F7B73D2AA4E2B0A8A7E3CAA889B6B6A6640F7222EF969D46FF6794BD97C5363921461BACDA17F2781E14419436E37610E52E3B7B7BF9C1A4B1D80876030F9A8981DAA4F06A432DBA739DB988BED5DE7F38378EC1F7D8A46B305896CA0CAA5D8AD74002863C6FF91EF25AE96450936509EFA93F94718E895A82B4616A965AF004038E0897A6563DBC91EB5A6172ADBA052250D06D210BCF5A250246FC3482E57FCD9901104C5AD58EEFFAC2860A4DA9D2C308552EFBDA2D4275F3F3651E9935A0E42869B9263FC7EA71079E604A4EC6DC61CEF6AC6CC06194DEF432C1F7CD9EDFB0C4B448DAE3C2A685BC818B2A90E17A4C1CAAA5FC2632F720E764E2B8DA314224498119A0D94CF5DCE24176421C2736575672B361119EC7C766265768CD9FF1957A17779C11244C1CC82D72D4E3C87107885F71C56DA2BC41008B0BC1375C12B3B2A80071EC03E377A93BFB227BD560EDD5E5D88F46F7FF9831F05BF262F01F62278D3DC13F4F0CECA0509091C25D20666D8D3527975CA3495F6843B46B5D5B6F5C650E981DEFB3943963E14F00A0F78CE785A21634C46B531B4F2AC5AD0F03D92372C334CE963E514A1891716EB5D5BB1B67834994EDA492719032E2A4F961DDD6D2002D8F52798C45A9DA8145BFD191E97D1FBA1B395858B0FC7D5F5A54E69FB3780635F70A763E44075075580778676E6B9705B40F40210E597B5AA1AA77BCC3BE5005159A4B68CBDC6AD8674495E0DF65A6DECABAFB993CC49C082D358DB1E5B3A8AF2FCB0049A15BF521986AD84148135CDB185FDDCA6802C2ADE9EA2E82047725D73F51E072CCD799D696D7530F61B16E9B4727C58CB0F552B188F9B451BE543BD809B63D66BCDBAEB7AA917BE6AEF05DF559B3AEAF65D5EA12E852D1370EFD6197F970F52292F27923A10D01AEB652A9A44573C137257B49D130F1DA48E532B3E33D4854B995534380B4549511B39A99145AF5ABE0CCD3A9DBAF673EFC115CB75A9A5A806679907BB525A2BD4507977329EB4C985B3575DE6533FC5D62358C21AF3DBDD20DEEFD7C417C77D37DC2A098A8FA48F7944B7EC6F929387BA11E3516C9EA681238650416FFB97EA343D5F227BADFDD509B94C1451C54F85E4539A8F70DBB5EFBB10B2D82A16FD0C997C603B8983CEB840A7C3B61918D8A97766BB8442C3B9EF2D324E28DC19748417D32F642874A8927688C74BF4F6F6724015C4DD50EB83B85F613FA20938F5C895F88830A40C9799C212B2DFB453BA0BC534F75CEDAF7A016F6744CB4F5269FBF0284EB90CF1023918078024C3B125CD9C7501224050B4D20B585472B42A0F494513ED131BCD8F75E223317F56B37CA48780750DE0BC81C74A3388C94D93A65719122E9D533274811B76965265D7B2F91EBE3C5924ED2D4DD5E327A6E7546AA2605E4C78D0208DB7A7F678CAADFB32E6BCF8C77FC7810F7D1D5D50E26D1A0DA03B8AFCF99904B2B3198670462451925381F0BC404C51F2F18FA7E2C1E8B0C6CF97A9A65E575373996C3E9DA15A18D15C93548377677DD713C9828DC4E4EE823A241377C65A2948BD29447BFBE + +count = 58 +seed = D9281003AC5F7673E0E9A7BC29C4ED75E6B0F228DF49D11A2599BFF2DA9E887163BB26DBA4F071FBCE02891540EC6F1C +mlen = 1947 +msg = 437E0F77BD0E14D704BE86135119F39A0A65650C762852E2694AD9BF2EA45C7EE59DF915F5AAC128309847E944127294566FFB193D0361DD7111D32B06DBA60A12E053F424DDD70674E902E409BC6F5891CB9A76108322CDEC1491D3D89A74CEDD855BB0791DD6DA371A75AE979593B5159FBE9DDACF88506E6A184547E2A7395A46FBAAAF286EB7780B789FED86F257E5036A3555E777B909243695CE89957DF492C80050457AFD84AAD9F8918099AB00FD7AD3528A3D0AFE5B52300053575B839572D4D7CE43C255BBF5F16948D40BCC2E63714487AFD3638601ADF47A324482ECC99FB88574538809227F8C0A5FA7F20A0B2FEFDA38E6A665550E44B8D5630290A4815621A5DD74A2108CA946241C48661EB087240788808BF676B145442B2DE4C35E1A6B8CB1E97E54CB729202D8827A0D4994C6D7F3F406ED273B00B6590006AF069D69173B5EA8237B87705F362288AC3A50BBE7E70EB15DF6ED820D66290F57A87E51B2C5777C9C95C2A76ECF2E296A7C295BFE029BBE681B32A6D9F16D11C7CA2750E2F8877AF5DDB616D8A820DE998B0B2AF5B0C2C5641F498C99971932327EC2C73C0EF4058D9F33683F60553AD2962370AFC6725743C86E591D7D7C20944479DACA5E92D66A33CA0C862DC60DFEB5EC3C6E7DE356F6E43F06B1431358285398F8885176D60CBA218217DC7AFE4AD876D0890648052A56812BC3F8A9E6C49F9D70B0A032924B891A9410BBE2F214C842BBF0511EF9017744A0DBDBD500A4189B471930E25216D2588CF8BA39AAE7623966CC62D6C4ECC8B00B0613D912E60ADF613C8F55B778EFB93A513A776C64E8DC943E6272C0EAB4004B4B05CE9BCE9CE2F2B86FD8429E9A72CB16EC3DED285339EDFCD122150F4E7310F669B1DD4CD7E76D282D10314E8ABF61D53BF343F3EBF9968E1BE8F3785581F675BFC28C893729CF67345D0F7C11D6E7D6DA0BFF255BF706C986704A3B9C6FA0602C6DC108A59CCA70F624B08E4F5393E597459BEA4AAAA463A3B08DE147E10DE6B75A0D87BB79BA9A71E7F5999C8972BA992228B60912AA2D7A32703BA8BC02F774430A2B590911D48D3866396F1D71F19CA90EBD5277743A984E2156CB57DE88EBE91BCC09CCB5C687CBCD4E48E4EE110F4075A21F9A051700B0C2698FCD6A5A73372CA366A230A9ABD153E4DCAB7A33A8226F8458C5892098BC0A95619880156548F300C40BDEF81E8C1D8BD03031C690B7C3C000CE99675ADB4B94752EA22BC9E0278D0A53A2A19363A9388BB8D6C24A45B5DEDD8F7482E9C29603FF182F25856FBEEE2B41B88B352F99DB5F33D8EAB1A1A1FEDE60EA6CFB7478DB7540D3A286E88117503C4D0A2C13D32AFE3F1A31D1AF9EE60EAB8FE06248CFFFC7BB438B77D94B5644805CC276F19268DD1FFEFBAB3C796923288638DA1C15E014723A84F8C2DD9F55F7ADC2ADC13FA7CDC29BAF48CA438C882DA5F7CAA792B7CD984BB11EC4B681B332EDFD4AB4C132B08BFB688F81BAA3FEC5A079E2182C282A3EBE2AD5E4C59090BBB989E6A07D85D604F5FFDE0587ADD29A5175CE65D29FB9FDE3E8B49EDA1D88EE8DD64FA1498D33EBAF4A847EE9FEDD3376AF46C1552A150014C11DDFC5047929E2415D3F9D81186A685A1CAF2F004DE777760F0567E880866320A7B42E61CC994719DDC81E28525E50195FFE4E0467D9A9182B75EF57DFEE926D7744485A55E07D1BCD1C9B9B12A60460BFF016E9834848665F132E2FF87805E00154C7D9853DBCA43D005BB197EEDA3D2D9249A621EFC4177415BB103893C82EEB0AEEA056B40E98B5FE65527432FF33CE3E09FE1288A6E2641011721279253800ABC4B73F65B15B434BD34A573E77A94729A78C92F0E791570A416A0876DB39A8FDA8696FB12E7FA3BB11E7838054E4195164B9676DD03327810CCFF9586217AA3D50E7D3EBDB1AE1BF6889DF316047CBB278CE8C9741798452A38E48A7138E1FBA286B497FDB8B1E7BF6145C5F29ECF6D5430F8E550314DB3CF48F27897F312C6D9D6357A880B721E5148DA7F789238CE411F952695F4A878756BDE311BB4E62F10C2F9939B8530EF70D3FB431655AECA2AD36BB5DF0582A07F53F1DF8E0325E635D5A5E795C130106502A081F2FC52A9D97C5DAAF174F13D2DE1EA0F8860F08F4FD5B571E1AB1E84437F3C82BF19B96E46513C316BDCF994BC26FB8461F90594E08E6D4A032C1DA38481A1AD7BFB7D5270255BFF23CE035535CF478216E6D2E62E147AD93357D62636B1AE42C4E8433BB94CA91D0F8EC265F2793514543AA86B786D9760BE5C77AAD5A8449A7DBE92391EAAFC305C1267A68E6ACF0F044FC144D82C917992748B9232DEC4E33EC97534F2BF60B56EDBFF675F0343C9C78E8A8D0529A78E2EED9F998B360360352009F01905C1A4815A36B111CAD8E5B34688B99216171D4F57283CD669DC05995BB8D94ECBD3E7B662C4A603BD85251F2BA35FB6CA492C2B3E996FE66A1EB904CCD61B0900E7DEDCF136F50E4C3AD5FC312A2DE4B3E51F355D01763692C0722C700A544E681A316A1D261FAD727E557398E500F15DF33883ABE9D1BA645936891F5A91FF6C8A7B9B6FE5062718542DF4FC4BA50D7F513945482381ADC42D5A9D444CA211232615306D7241FC49F08912BACBAFBB056C018AD4D6021D99FD720ED6548A5A29DAEFDCE868D71A1BA72D9F998A3F89FCFE526493582C4C8AF5C1BE065EA29F6155428DBC955B745DF +pk = 3003C366C7F9EC3EE0F44B9EDFB35BB21E06B6959912C2AD18EA0F71837A647BF39A5C08FC920E27BBFE621A62F072425423B13517974B475B48BEF3D4F8A100908B381D218248DCB537E00B65945367F1CFFB5976B0BCF5BBC8EECE4885E19A87DAD6351CFEB70FC3782DA6A510A84CB626FB8A6AD97CDA8954EF74D7A3B50002 +sk = 3003C366C7F9EC3EE0F44B9EDFB35BB21E06B6959912C2AD18EA0F71837A647BF39A5C08FC920E27BBFE621A62F072425423B13517974B475B48BEF3D4F8A100908B381D218248DCB537E00B65945367F1CFFB5976B0BCF5BBC8EECE4885E19A87DAD6351CFEB70FC3782DA6A510A84CB626FB8A6AD97CDA8954EF74D7A3B500029F3EBC8BF1A8E6E057D21D4CA7812FC76D3754F7AD619DC4AF5CF936005FF0986F020000000000000000000000000000000000000000000000000000000000008CE7943B0ED91B76B4ADE07643A48021C54000FF33A7B0A8FDA32117FBCA9088A8FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55F5A646E4929E0829B929C8337F3FC2BE09D6478D3B250CBAB166FDCCA46B2427FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D7F2373B6E1839779994191E08E63E84AAA21863B9AB8BFD5772FC8F3871D3D2E655CC05F19FD043A66A3A2665BDBA37982E0A02A5F2C0F2B9FB8B8913DB0B1DDB70EA478CE800304D9E914B4EBCB19446397711EE33902F28D0312A0EB79B27AE3AF90EFEFAF9342DD161DA27E4A8C9E847AA02FAEE3E0ED27B8B4FDD041635737DD18F1BC905D5975A7FFBEF8CC525A2FE0A4166142E022B577B34841CE7D9B5A4DFD9C020C2B62022112150268A247E0270A7F9A6B64186D3139207056CD65785351955DAC7BEED6934EB464E20856F71CBDE609C30DA0B99ADF83C2345CAB72DE62362E03E048329E62F4AEB460B77A81E6D21A6C9C39646A90C +smlen = 2239 +sm = A9E134D68F216C77CB2D6DCEA469BDDA448CB2F6E8AE3E5F3DA56FE52CCD5E95C9221F3354A750455D72FF9B8FB8885E690193B7DD27683E86CE73DDCA621B012C3EEA321D7199629117B7E3D587C5A3E8F0883920260D5F211D6A9DB22C21EF8B993467439941984283761E8844F37D21C14F1D1AF9D4720F0229EF531EBC0002009058F27B9746BA984396CB8AF2B11A7C5B96C93D1858D792C83430C65C3BA610EBDE0C30E887F260E2AD4AAC29D81B89855F0421CC0AD8EAE05CAEA78290021A0D1A417AE4A2CE874278384A2C8A456657CDC4088FD96206EDC0D18210F95515301D842049109CA2E356CE8D1AD682C796056F94FB597947FB700F73941B830A1005A0ACA4F0AE4C0CDB95803E0098C0676548AD8191E482C9CD7265280E6E00040B437E0F77BD0E14D704BE86135119F39A0A65650C762852E2694AD9BF2EA45C7EE59DF915F5AAC128309847E944127294566FFB193D0361DD7111D32B06DBA60A12E053F424DDD70674E902E409BC6F5891CB9A76108322CDEC1491D3D89A74CEDD855BB0791DD6DA371A75AE979593B5159FBE9DDACF88506E6A184547E2A7395A46FBAAAF286EB7780B789FED86F257E5036A3555E777B909243695CE89957DF492C80050457AFD84AAD9F8918099AB00FD7AD3528A3D0AFE5B52300053575B839572D4D7CE43C255BBF5F16948D40BCC2E63714487AFD3638601ADF47A324482ECC99FB88574538809227F8C0A5FA7F20A0B2FEFDA38E6A665550E44B8D5630290A4815621A5DD74A2108CA946241C48661EB087240788808BF676B145442B2DE4C35E1A6B8CB1E97E54CB729202D8827A0D4994C6D7F3F406ED273B00B6590006AF069D69173B5EA8237B87705F362288AC3A50BBE7E70EB15DF6ED820D66290F57A87E51B2C5777C9C95C2A76ECF2E296A7C295BFE029BBE681B32A6D9F16D11C7CA2750E2F8877AF5DDB616D8A820DE998B0B2AF5B0C2C5641F498C99971932327EC2C73C0EF4058D9F33683F60553AD2962370AFC6725743C86E591D7D7C20944479DACA5E92D66A33CA0C862DC60DFEB5EC3C6E7DE356F6E43F06B1431358285398F8885176D60CBA218217DC7AFE4AD876D0890648052A56812BC3F8A9E6C49F9D70B0A032924B891A9410BBE2F214C842BBF0511EF9017744A0DBDBD500A4189B471930E25216D2588CF8BA39AAE7623966CC62D6C4ECC8B00B0613D912E60ADF613C8F55B778EFB93A513A776C64E8DC943E6272C0EAB4004B4B05CE9BCE9CE2F2B86FD8429E9A72CB16EC3DED285339EDFCD122150F4E7310F669B1DD4CD7E76D282D10314E8ABF61D53BF343F3EBF9968E1BE8F3785581F675BFC28C893729CF67345D0F7C11D6E7D6DA0BFF255BF706C986704A3B9C6FA0602C6DC108A59CCA70F624B08E4F5393E597459BEA4AAAA463A3B08DE147E10DE6B75A0D87BB79BA9A71E7F5999C8972BA992228B60912AA2D7A32703BA8BC02F774430A2B590911D48D3866396F1D71F19CA90EBD5277743A984E2156CB57DE88EBE91BCC09CCB5C687CBCD4E48E4EE110F4075A21F9A051700B0C2698FCD6A5A73372CA366A230A9ABD153E4DCAB7A33A8226F8458C5892098BC0A95619880156548F300C40BDEF81E8C1D8BD03031C690B7C3C000CE99675ADB4B94752EA22BC9E0278D0A53A2A19363A9388BB8D6C24A45B5DEDD8F7482E9C29603FF182F25856FBEEE2B41B88B352F99DB5F33D8EAB1A1A1FEDE60EA6CFB7478DB7540D3A286E88117503C4D0A2C13D32AFE3F1A31D1AF9EE60EAB8FE06248CFFFC7BB438B77D94B5644805CC276F19268DD1FFEFBAB3C796923288638DA1C15E014723A84F8C2DD9F55F7ADC2ADC13FA7CDC29BAF48CA438C882DA5F7CAA792B7CD984BB11EC4B681B332EDFD4AB4C132B08BFB688F81BAA3FEC5A079E2182C282A3EBE2AD5E4C59090BBB989E6A07D85D604F5FFDE0587ADD29A5175CE65D29FB9FDE3E8B49EDA1D88EE8DD64FA1498D33EBAF4A847EE9FEDD3376AF46C1552A150014C11DDFC5047929E2415D3F9D81186A685A1CAF2F004DE777760F0567E880866320A7B42E61CC994719DDC81E28525E50195FFE4E0467D9A9182B75EF57DFEE926D7744485A55E07D1BCD1C9B9B12A60460BFF016E9834848665F132E2FF87805E00154C7D9853DBCA43D005BB197EEDA3D2D9249A621EFC4177415BB103893C82EEB0AEEA056B40E98B5FE65527432FF33CE3E09FE1288A6E2641011721279253800ABC4B73F65B15B434BD34A573E77A94729A78C92F0E791570A416A0876DB39A8FDA8696FB12E7FA3BB11E7838054E4195164B9676DD03327810CCFF9586217AA3D50E7D3EBDB1AE1BF6889DF316047CBB278CE8C9741798452A38E48A7138E1FBA286B497FDB8B1E7BF6145C5F29ECF6D5430F8E550314DB3CF48F27897F312C6D9D6357A880B721E5148DA7F789238CE411F952695F4A878756BDE311BB4E62F10C2F9939B8530EF70D3FB431655AECA2AD36BB5DF0582A07F53F1DF8E0325E635D5A5E795C130106502A081F2FC52A9D97C5DAAF174F13D2DE1EA0F8860F08F4FD5B571E1AB1E84437F3C82BF19B96E46513C316BDCF994BC26FB8461F90594E08E6D4A032C1DA38481A1AD7BFB7D5270255BFF23CE035535CF478216E6D2E62E147AD93357D62636B1AE42C4E8433BB94CA91D0F8EC265F2793514543AA86B786D9760BE5C77AAD5A8449A7DBE92391EAAFC305C1267A68E6ACF0F044FC144D82C917992748B9232DEC4E33EC97534F2BF60B56EDBFF675F0343C9C78E8A8D0529A78E2EED9F998B360360352009F01905C1A4815A36B111CAD8E5B34688B99216171D4F57283CD669DC05995BB8D94ECBD3E7B662C4A603BD85251F2BA35FB6CA492C2B3E996FE66A1EB904CCD61B0900E7DEDCF136F50E4C3AD5FC312A2DE4B3E51F355D01763692C0722C700A544E681A316A1D261FAD727E557398E500F15DF33883ABE9D1BA645936891F5A91FF6C8A7B9B6FE5062718542DF4FC4BA50D7F513945482381ADC42D5A9D444CA211232615306D7241FC49F08912BACBAFBB056C018AD4D6021D99FD720ED6548A5A29DAEFDCE868D71A1BA72D9F998A3F89FCFE526493582C4C8AF5C1BE065EA29F6155428DBC955B745DF + +count = 59 +seed = 750A74866BE8DF4E60BC14BF36E6D83ABF6DCBB86792D125CF0980007C5435F40F87BA96498A88252D9C5C6710807652 +mlen = 1980 +msg = E4E3EDCD70C4BBED033F402CEEDC2C265DCA10B2DE0DB00D454C3AE1A0D00C97E1DC8C6804B1777ED21DDF5145B9F9348A931C128A8FB03827F653C37CD95859868DDE356ACE682F627FB69FCD97757BBE8BD5A260A293D2ACF0BFA2C0A3548FE25A2BA1A21F95123D592B40C20A927FDB615E69878E8D7C98D261DC01958A088599D3F9BB5E14002192FC7DE417B1074B3F7B52CD2A699091FD9DC3C5929E51CC0259D2255CAF0E444EC11257B759978BD4A7C8E2CE8473325B7498681102DE6FFE9764334D862E379D9F2EBF9B312FA75D7A50E08B94BD43EEF78722D423928FB8E26FDA85A345EEED0326A5D694E4729154A9997B269407B7D03818025EEB2BA96580626DFDB3BFBFCE100C508170D8150E4980D5D386761F4E8311339B47852ACC2A0A01DAD90D3978DE6536547D4F203CEFFAA652E4F2F28639BC3FF83C485C28EDC0BBE21D17B8ECAF3794D64C36FFE7F07E8A906CAB8E7FC9067CA4BF9B074C7FB01EF99A05D7C0F35D889A63AFE5FF18023BF77F8A3DA0C3CECEA0E538A6DAB5C54F3A0D83151595AD3EC4C45132EC2F22F652EA5DD930E692A7C0D7C23DE84314CAA7C017AD50D430FEF42DE557073DDBA6CAA4A787C92E6E28368943CAD0974EDAEB7ADDF991CCE20BF51C5A898CF0A2104ABB810BD4937D23E5D43490A3194B8A109B745E0A365EFA59199B43835682E996794F16C5CB874C88D9697B189AC54A1BA1F459623C1563CBA7689EBB32DC4FA0BF30E064D119D40C36301A653A4F959C97873003CFF7E8E030A137BAFE0A60AD08E4F692DC107E68AB40EDD0C384875B8525AA0A5EC3ACEAFE557EC76DB5283672F9751AFE1166D53542D216186A3DEF4DFA94E57BFFBEBD6F4AFEC3C0F3F40F651A1251A9AB39C262D42313E9F22879645589EA54FE894AC005115A43DD806B2C8BE6222DD9F02189D4221A9DDE99ECB8C3EF4171776268C12ADC37E4CA92EEF09D2D1803DB1FE917521662BA7EC0C07292C7E2130ECA4EEFFE53EE0CEAAAFF6F4CCFD42186611AFEE79BC651B1ADBAD08458592D69FBEEC708C7537925658BABBE7E9867915C6A728EAF41B0AF2EFFE55207C01652891C373F7A14409D05FE9E26C2E72D688047DE9A0954516B85ED6A3230B6B0EA9C5F086720C26EFBF8B7F5C5D14651D54C4EA181A707C562239CFC08B2E09A2941D04D587B90134D8F670F734578534138CD9CB7EC04437A768FE65FC5B3FBE818DB423A2208E485669082B422AB1257C2529CBF7BA4CB30FA27B7F702418C2EF9C3BF7CDE53661DF716449C6337C54542EADC5209A0E030AD6577DEEACC6BE1813DB24BEC035CEE6AEE93749D524222535A0277600F8E4F4BEB473093C5A00B6666CB319DFF131AE4F004EEB1BF71E5D274E3DFBFA246DADA9D6F548907091045FCCF79B363E695AD54C2F791861CE04874EE8C3375612DE820CEDE04E4472BC3DC19ABBB91C42A1C3D7B467837570E7D20A2CA6405DECCFF1AEC03E0558076E988619CB0CDA9CC87A12367BD486B676A4F71D40B88AB4E7FA750350DADD1A8F12B70864792D3CC1804BE8B7CB9DDA532182C32582015C1788B43054B7010229F46BD39000440E7F5D22E4D52EED85B204B344680426AEF51F0CE0551FEB9672DBF391A9AD363ED090837CAC1E721878E65AF9BA92A0EE7C7979925FBA9F4E452EB4FE3AF03B9EFF0526FF0A331AC0B8CD27A0C49E5019B7025C3C9870C900A7FB31FF834E04B87DB77C4D6DAE4C3FEE741E923704EE5F294D8F881833E9137158D1EE0FBFCB4637ACB814A2A5346607BBCD6BC916235F7875334F2B75A7EA7B8B8DDCDF46C0B8007C9B3A014EC6E634D4173CAFB1DD09CB9ED4A123151F4F2631D4BEE1520C10C15AFEB17198009C2B254C1FF0BECAFBF69BE8C7DBBFC7E8F3F1EF05FF6A7945FF79ED6C317609B9238670DEA26D56D481F87CA171CCFD726CC0728C965D9BC38D376D707E6979908B19FDF7E74ECD2D0671EC338FD54AD6CC5F789E96018521882588F888D7D715104D65954DBA8907C0B7CE3F2ACB802ED49DDF1416C29E8D685C5AD879464819E1D53FDAC741F71E31AC0C17B6C8932A4A00E7164CF8BBFEC36EBBD30392145B292D355FB304A88A638F991F6F89A398B09F1DE4F0B29866029BEE75A12D724A52736F2B9F49937F0E51B0F2E1BD2C1BC9325BBD1061E0F7685ACA02DA735D8FC39646E0B2453BB9690ED1C4853A757EA9DC2F4EB4B5ADBCFCBFB0CD2587F61A24B77CA0D6CFCFF47A98C7098B986D4FBD0E46EF0D1F9DF842F4473C43912AB49F4117C8214A42F3083936C7E8A38B294BA081296A393DCAADDCD0D340AC62511E47DA6591836553EEDB466DA6285359EE831A952E6C7AE3B943636124E43224D527B7D394511CF31C50EC1D3E7A20E49850905D504F1AAE477830E3BDA50430EBD47FDBB0BF537D8D479CB799B0429C3F6591328299A09F45CF9C6D30D5C1C9203B9521D807875D7FB2C2CFAA688414497122161B1B4F159B66C0834E111DA4F82D5252367FD2DBFDC079333FC51AB0D34ECEBBE786F984852A596BE620EC6CF84ED596425B90316A13B39E5EBFA19B319BF0FD1D6C812F29970FB1FFE948BC0D2E057B1DEA15445D71B5F728C72DD0C69E277C58F031F90932994AC5A177926DCC1C570AC1B4B099ED66ABF7DDE5A5D77D08EF1AD7C6FFE018F56EFB07C737F33038846247EEEE147E4A5995BDC3352B73F15FCE5140410AAE3F0AF1764E5AD996D01608C5E6C6C96A20274EA7781B41FC532B01B52134FEE28F501EFD9CF +pk = 37D3E6618A0EBA2105A1942FF02C24217BB9FB7FC3F31F7062F451CFBB9EE1A7838A5AA9B79F6E2C430D6863B49CFD44708C525B5EFFFD8D092289B100263F015014AC17939A718D7CA66F7D9B8FAA6061D0061BAC11D736200BA91B42D36E6B97508EFB43D092508FEA5F3E6D7CCFF3A945A88BB0314C447436CF017CEE5E0111 +sk = 37D3E6618A0EBA2105A1942FF02C24217BB9FB7FC3F31F7062F451CFBB9EE1A7838A5AA9B79F6E2C430D6863B49CFD44708C525B5EFFFD8D092289B100263F015014AC17939A718D7CA66F7D9B8FAA6061D0061BAC11D736200BA91B42D36E6B97508EFB43D092508FEA5F3E6D7CCFF3A945A88BB0314C447436CF017CEE5E01117B1776F905E18C7E4DC1A13E90D65E13448696EFD9186967719459A561CB558BC00000000000000000000000000000000000000000000000000000000000000092B244E43FB8234AA46FFC9BBDFB629C0D6D8EB7EFB195D8A7392C4B459A46B5BDFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFA6A7767598CCEC95DDE18D78C96FEC2A1CD1D36AB664CE8C1585C0ADD0F053BAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007B96F473302B865BE2B82625AB4EBD418762118CB8BCD51FC21E1D7C4C647C738300F3B21E82CE169F014D773D095E3CB7D87154D1E990C34F9F54EE894F087DCD59C9EBAED687C637AEC302ABFF1D033A969399F0E7F2F6F6BA571A2A352E5B6960D0080D6B7D7EA34A404A9F6C0C274F60413CECBDA2A6EDE42E8939037EEBC75F8E962C83F0ADCA83444931197D02659308ECE82616B1CC5E37A9F534200CBD2D533E9BD17F4480ABBB3DF1A2397CBBA17D6F5028233F57DEB58E033F2FED2982549E8B1C33FD9E3624686DFD16816FD2AD150031A331E78AC869E9CD5E20FF4E981F26DC892FC79FCCCE1F9F425D6633577D6496125B4F65FB07 +smlen = 2272 +sm = F48CA3B53A82D1E6D9767431D5F694B8247530967FA2B3467F6AF7CC2F4D001B8B9AAB1CF912AAB1DFA3BB47059914DB49CFA757015573E00BCEDF368D432C00C4451943CB3C8944164B0CAFAE69CB39FE5EA649BA6009AA912D8F0B5F9EB025F82774C01422E9413E2859FCB49FF3E660FF60D525D9DF161607BB5F086B6F000000B5175521E8F7518CB0B354F279C7BF26CABC5BB61CD5DA3E24ECDC48637EF324DEF6728BD54673D088386347A7C37C204D4723D213419437BC7428CB5512876577606644DD2D49F325BE52E8B804BFC9358B91EC0292F9B7FA6027D87CF6D72C7DB5AC40EEF5A88F4FF1F06B1716E7C7BF27EDE7117B9E3C4F865249CDB00605203477CD46D9032E8B858E6539CC51AD00EC32E6BFA3EFD76849E1EF85F440000909E4E3EDCD70C4BBED033F402CEEDC2C265DCA10B2DE0DB00D454C3AE1A0D00C97E1DC8C6804B1777ED21DDF5145B9F9348A931C128A8FB03827F653C37CD95859868DDE356ACE682F627FB69FCD97757BBE8BD5A260A293D2ACF0BFA2C0A3548FE25A2BA1A21F95123D592B40C20A927FDB615E69878E8D7C98D261DC01958A088599D3F9BB5E14002192FC7DE417B1074B3F7B52CD2A699091FD9DC3C5929E51CC0259D2255CAF0E444EC11257B759978BD4A7C8E2CE8473325B7498681102DE6FFE9764334D862E379D9F2EBF9B312FA75D7A50E08B94BD43EEF78722D423928FB8E26FDA85A345EEED0326A5D694E4729154A9997B269407B7D03818025EEB2BA96580626DFDB3BFBFCE100C508170D8150E4980D5D386761F4E8311339B47852ACC2A0A01DAD90D3978DE6536547D4F203CEFFAA652E4F2F28639BC3FF83C485C28EDC0BBE21D17B8ECAF3794D64C36FFE7F07E8A906CAB8E7FC9067CA4BF9B074C7FB01EF99A05D7C0F35D889A63AFE5FF18023BF77F8A3DA0C3CECEA0E538A6DAB5C54F3A0D83151595AD3EC4C45132EC2F22F652EA5DD930E692A7C0D7C23DE84314CAA7C017AD50D430FEF42DE557073DDBA6CAA4A787C92E6E28368943CAD0974EDAEB7ADDF991CCE20BF51C5A898CF0A2104ABB810BD4937D23E5D43490A3194B8A109B745E0A365EFA59199B43835682E996794F16C5CB874C88D9697B189AC54A1BA1F459623C1563CBA7689EBB32DC4FA0BF30E064D119D40C36301A653A4F959C97873003CFF7E8E030A137BAFE0A60AD08E4F692DC107E68AB40EDD0C384875B8525AA0A5EC3ACEAFE557EC76DB5283672F9751AFE1166D53542D216186A3DEF4DFA94E57BFFBEBD6F4AFEC3C0F3F40F651A1251A9AB39C262D42313E9F22879645589EA54FE894AC005115A43DD806B2C8BE6222DD9F02189D4221A9DDE99ECB8C3EF4171776268C12ADC37E4CA92EEF09D2D1803DB1FE917521662BA7EC0C07292C7E2130ECA4EEFFE53EE0CEAAAFF6F4CCFD42186611AFEE79BC651B1ADBAD08458592D69FBEEC708C7537925658BABBE7E9867915C6A728EAF41B0AF2EFFE55207C01652891C373F7A14409D05FE9E26C2E72D688047DE9A0954516B85ED6A3230B6B0EA9C5F086720C26EFBF8B7F5C5D14651D54C4EA181A707C562239CFC08B2E09A2941D04D587B90134D8F670F734578534138CD9CB7EC04437A768FE65FC5B3FBE818DB423A2208E485669082B422AB1257C2529CBF7BA4CB30FA27B7F702418C2EF9C3BF7CDE53661DF716449C6337C54542EADC5209A0E030AD6577DEEACC6BE1813DB24BEC035CEE6AEE93749D524222535A0277600F8E4F4BEB473093C5A00B6666CB319DFF131AE4F004EEB1BF71E5D274E3DFBFA246DADA9D6F548907091045FCCF79B363E695AD54C2F791861CE04874EE8C3375612DE820CEDE04E4472BC3DC19ABBB91C42A1C3D7B467837570E7D20A2CA6405DECCFF1AEC03E0558076E988619CB0CDA9CC87A12367BD486B676A4F71D40B88AB4E7FA750350DADD1A8F12B70864792D3CC1804BE8B7CB9DDA532182C32582015C1788B43054B7010229F46BD39000440E7F5D22E4D52EED85B204B344680426AEF51F0CE0551FEB9672DBF391A9AD363ED090837CAC1E721878E65AF9BA92A0EE7C7979925FBA9F4E452EB4FE3AF03B9EFF0526FF0A331AC0B8CD27A0C49E5019B7025C3C9870C900A7FB31FF834E04B87DB77C4D6DAE4C3FEE741E923704EE5F294D8F881833E9137158D1EE0FBFCB4637ACB814A2A5346607BBCD6BC916235F7875334F2B75A7EA7B8B8DDCDF46C0B8007C9B3A014EC6E634D4173CAFB1DD09CB9ED4A123151F4F2631D4BEE1520C10C15AFEB17198009C2B254C1FF0BECAFBF69BE8C7DBBFC7E8F3F1EF05FF6A7945FF79ED6C317609B9238670DEA26D56D481F87CA171CCFD726CC0728C965D9BC38D376D707E6979908B19FDF7E74ECD2D0671EC338FD54AD6CC5F789E96018521882588F888D7D715104D65954DBA8907C0B7CE3F2ACB802ED49DDF1416C29E8D685C5AD879464819E1D53FDAC741F71E31AC0C17B6C8932A4A00E7164CF8BBFEC36EBBD30392145B292D355FB304A88A638F991F6F89A398B09F1DE4F0B29866029BEE75A12D724A52736F2B9F49937F0E51B0F2E1BD2C1BC9325BBD1061E0F7685ACA02DA735D8FC39646E0B2453BB9690ED1C4853A757EA9DC2F4EB4B5ADBCFCBFB0CD2587F61A24B77CA0D6CFCFF47A98C7098B986D4FBD0E46EF0D1F9DF842F4473C43912AB49F4117C8214A42F3083936C7E8A38B294BA081296A393DCAADDCD0D340AC62511E47DA6591836553EEDB466DA6285359EE831A952E6C7AE3B943636124E43224D527B7D394511CF31C50EC1D3E7A20E49850905D504F1AAE477830E3BDA50430EBD47FDBB0BF537D8D479CB799B0429C3F6591328299A09F45CF9C6D30D5C1C9203B9521D807875D7FB2C2CFAA688414497122161B1B4F159B66C0834E111DA4F82D5252367FD2DBFDC079333FC51AB0D34ECEBBE786F984852A596BE620EC6CF84ED596425B90316A13B39E5EBFA19B319BF0FD1D6C812F29970FB1FFE948BC0D2E057B1DEA15445D71B5F728C72DD0C69E277C58F031F90932994AC5A177926DCC1C570AC1B4B099ED66ABF7DDE5A5D77D08EF1AD7C6FFE018F56EFB07C737F33038846247EEEE147E4A5995BDC3352B73F15FCE5140410AAE3F0AF1764E5AD996D01608C5E6C6C96A20274EA7781B41FC532B01B52134FEE28F501EFD9CF + +count = 60 +seed = A832D4AAE8076C4EFE8319A74CE315928AB765BB629075254CBC63EAAE691C220F4B5E1839E9A99D8747AACD7C2F1EE3 +mlen = 2013 +msg = 84C603D1B5549C46964FF2987A1F533B4CED94E67D576A3B0BF1C8BD87A74AC7DB640FC9F7ADE44FF79B820846EB83367153F5DDDDF9DFB7848A13D59436916EFABB82DD61291447491D2CA04166FA8680E8E0E0DC98E79344534CA1CBDDB531797A61C291606200107002091ADFA927A763CF98CBBD631CFE890B0ED257AFD34AC0C5280AA7C70BD0C945D78E6FDA284CBB7B3AB636BDF17342F2BA28D707147F14D15173D9BC0B6D65FD1663C86971BE1FA59DA8325E1F3773BACC5B8D4158EF525FDE6E96631C51AD142250252A8E5786CD621210DF3E24CC0B4B60AC2F013D76DB0C73DF40EFAA05A65383A8892276B3D69DD511937D55D914C3222A2386D1BEC0A268E683716AF4AB709D2D225B86229095E87FE70D69E6A34BB214529CA3F082C0F2709E77B86B00B4A04BCCD343C862333B7C9163857B77E30551710CCC3A803323F5CD4EB5317CD2E6A24BFB77727E1C64D0AC47BEEA1CB35E5F2FF6024C06F2F391FEE76F2E69537673FC0124E48E4E2242E84D8AFFEE6803CE6EDF3A954D2C54562B8B76A4EDD91E24A8640AFE67255605849053B60F558B43DDB9F8A04E987D15F6292962D10AD8F7B47188D12D1C9090C0FE8710DC3937C6939496884BDE0BEA979839837C61BE4DF5662C724610C7FCB4631A0A2083417BE6A20F4EED094E2145BC72A83A6E147A655C481DCC906E63ADC0244D95B6085FC096FBCCE81EEB0497F48BB5EF827C0893E331795E3B301DC9F3A91DBA9FBC838E044E2AD9859F1DC67E9BCC375442B4EB59714B5EBBA87AC9A79C99CE74F8BC75740DDCCE46C4B408B91DD7D4AD26B0FB1A4AB874F5504C40E7363838D22AEC45C10D3CC2E233124A5CD8344249EDF388E37BA43598F2C2CF56D444BCEE04A335B154DFA3CA694DB481CBAA59514098CE6E0E4138C0A543EFAFEDA4AECC022C824259A06C3D57A70EA15A5DFC822449A27F58F9EF842DCBB636CE293684E1B331CD821594A12634E5594410B6C5E2306DC8BBE62C8B0F49F2F699A59EFB14D3CAD399F74ED893E1EB43FD770FD61E0C58E5D8CBC9435F4AD0892681A30DF4885927130432186AD4BE41F6FB7CFE660E23C5E55F60789B3E97C3B622599938B36BD1C0BCF6FDB7E4EE44C92B6A86CA2470BCDB8BAB8DF6079382CA314BF3A8B3C4286518C356018FD6F6FCDD9BE9AD9C228F29135544E723A898F483E9D9EE843E75ACB3FEAC447973D12461FEE3D984F3B4F31645FAEA56852D356C96CD73A6F185E8CD56731E83FEA145A2BF0C15ADC634DD9E2FFC799B59A0712EB4D2618680C7493F50A9BBF3F7BDE1025CD44AFDAF4A8C42C9254B1B34AA8559E1CEE9BDE7B4DA0FB3CB2289418110620E505B793B91F422FCF53ADDA8F7C96D55E26244E075D9A70004642712EAC377CE18F88F2C8581694B8F621707DAB6D292179B2A95AEC5AD6E409D78253DCC05ECCDB45683DFFFB9C629AFCFB0654725D650E4A283FD98E47F37AA9309E2933CC0393625DD81D4A02F9D5082644DE02B6472D5D3AAE110747E4F756973FDFCE8EA5F997E30B11EBD50B45F6889D227D87D9184CBC6ED40E96DEF8B9236763C9999E21BFC1A74457FFE5E0DC2B16876FE04C2E0F0F47012A767A7AC18D71A7FD65F8647A7E1AE2D4D255492A18AA81D17D390E381B1722BC3C38BCCEA9D5E73231D0C6E1A96CCB47079E36C994E94AF9A318D67B6408BB602A91D8E9EC6499DEED0B51A9AE31D9774A1BEF4C1DE0E7A324545B2AF9870CD733C2195C5ECDE386D298C33D492937497EA5F0E05C377A4D755DEA9D96C61FE82CF6299EB34B857217A2C6733FED64F5DAC5F95A0EF2294ECA844B96CEB5163363A31C58C88428152663AB0A2B310B1A9E9027CA8CC0DB6DFF528F9A421FA826A86ACB4FD1D79C1AE6123C9E685BA66F5FF109FDFF2497B1A50C2E4E7B4662FA11FBAA305A960CA70FF98E5290A8C3A27B4A3CF1705C6DF4290FA64F3259FDEDE7A81CFDE4214230DFB9EFB20049E905833B5D48923C8CE2F8A104946FB3356154519D950998677C56C8B2C80471A6117B142E26C0345CDF0634E356D80C3BE12F4AB89EB41DDDCF98188EAD2FF420EED3FD9287322F24C62B21F430D5F9B8592CE1CDC946616111C91C667006E47992FE2D5A2AAD82F8DD1AF3C1B8BA5326220645885CC94E8B2B76CBFF7E161E994C0CB9E489B8A5662E9D420913AF34433F5BAB10AC72C5EEB9249F3C102E1762E862C13CC882D20BE16834E54DCC323EA89A133F451B70087A8DCDC5B518EEF087A571B570A7966F1C49BFCDC70AC05034D1DCC56EDC2C0F57D1AAF16718C67D162BA330AA61A2875F90E2935752BFF1EC28A79EAD1AC18E70A833946CA6A15D8765E1A62AEF46BED232EAE89DBEC278297B396CF611448C5FD4B36B95CDC54E3394C63B9B0969D6488FF1C700B390E7226F99A945306C6504958CD43CD3D63910A4324BB662A0E5DB1622D90CE00E50CE7112193872AAB5CEE0B8D6FD42F26C2FB87FDF99062169C0BE75C85109D4E209DC8A640FED3EC71EF3DE8878B3D1729FF118F50F8A33361C6F707F6011454C5D744989EC1BEB644FCF99CB2E7C3CD20E6F1656E07C3566C4DE68593BCBA0EE9F7BD2E272C3D47A3E03985456F18CAFBEBBC1DE74964BECABDF3E9BBB9A10B29BF3B458FD50F19D63A6231CB51CDE3DF46E4BB6318E81E10AD1674A053C8CFE1E72853FD60E6E642642CB825644D6734AFB00329839F22CED734FA1421C4334E20F2ECC8BBC2652004203B3B639FBDCF5FDA1423F08C3A1100655E4763B8D8356A151D702124D30FDD87B34EC4D34BBB3639464E44A693690E193329 +pk = 811EE8A347FB4C73210B57171DE37CBECDD5CDA8068F4E3BF5E0CC870961403E0C56ADD308216281DF18612118B9F4B4F9FF91206B6A5585CD2B5C9B5E02F20057A6CE3DF70F77F8BC515D95BC39A05522F940091ECFF7CB8C5C508285B7056660921184AF0592E34E3A43F05852897A98F9199D145BE9B2927B6C5B9BE361000B +sk = 811EE8A347FB4C73210B57171DE37CBECDD5CDA8068F4E3BF5E0CC870961403E0C56ADD308216281DF18612118B9F4B4F9FF91206B6A5585CD2B5C9B5E02F20057A6CE3DF70F77F8BC515D95BC39A05522F940091ECFF7CB8C5C508285B7056660921184AF0592E34E3A43F05852897A98F9199D145BE9B2927B6C5B9BE361000B2365B9CB4193A7EC3C9997E693F5F34E397164F9F547EEEC9669A3BF0CF9C4B4D300000000000000000000000000000000000000000000000000000000000000B87617DF078F2025E41C678E4C94A62215DA2D517DDAE6C5E7F73DD3827D74D3AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEC1BD17FBB07890FA5BCA63F351C119B39A66DAC5A4B82944CCFA0795896C1D9FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000928E9D98EBC7BCCCF7AA00688AC9D5D01EF3DDF8BBF789FC9F4DF4646433B94C5A26597307191FB9EC2272DF666CE917F57092FDFA78877C6ECDD6A05A7A087B8E5BD30EBA2C82062AC5A88D1896360744E5E51040D2CCC3B8329E087D27202FD79EE80F0989520B46E210E22EB7BB08E00E16A17A1E1DC6485EEEA8CF0315472C6EDCE966E776BA97656FA8BECB71833D588D5F02E99C28725AD87C790875B5B2F7C0462F1B2413790F1D90C6E874E29E63E82BF6B90DD866637409069A52ED91A783E26616BCD504B7B0C075AAEB73754CA98FAA0FF737847EF93DF23F5FB453D227274E94EE2B971F92BB968299A5BFFD4CF303126F997A69070F +smlen = 2305 +sm = A214E234E71D318EF4FA2B10818ED1C54565D16A01A87487236AA327E080930F59CCDF7FDCA499528C8F3EA5379E2619461635B324B337B521CF61604665ED00C18836472E25E62BEDBB57A3C8D43EDBBBB7813D294CFC3C772224950D709063CCBD3C68714E395CE5D1AE26FE3D653FA83E96BFE7D28BC91E2B933B2AA99F010100F379EB2C7015E6104FC6B178AE5E15E2314B67B48F2E92A94129EA200CC3CC0295907F46D47B9914850D0B10A2A51B81D60486B013133A078A628EB063BF6B1D89B21797EFDA5B06A008634A011A1008700E666C50D6D0287AAF5FF468013802B6CDBA644502B61374526823E80A14EDBE79CDFAB460DB0AD1912FD53EA1D2287DBBE80C99C543234A839C26E855D3AD7E2EBCD0D47003F3B440E9804F667500090284C603D1B5549C46964FF2987A1F533B4CED94E67D576A3B0BF1C8BD87A74AC7DB640FC9F7ADE44FF79B820846EB83367153F5DDDDF9DFB7848A13D59436916EFABB82DD61291447491D2CA04166FA8680E8E0E0DC98E79344534CA1CBDDB531797A61C291606200107002091ADFA927A763CF98CBBD631CFE890B0ED257AFD34AC0C5280AA7C70BD0C945D78E6FDA284CBB7B3AB636BDF17342F2BA28D707147F14D15173D9BC0B6D65FD1663C86971BE1FA59DA8325E1F3773BACC5B8D4158EF525FDE6E96631C51AD142250252A8E5786CD621210DF3E24CC0B4B60AC2F013D76DB0C73DF40EFAA05A65383A8892276B3D69DD511937D55D914C3222A2386D1BEC0A268E683716AF4AB709D2D225B86229095E87FE70D69E6A34BB214529CA3F082C0F2709E77B86B00B4A04BCCD343C862333B7C9163857B77E30551710CCC3A803323F5CD4EB5317CD2E6A24BFB77727E1C64D0AC47BEEA1CB35E5F2FF6024C06F2F391FEE76F2E69537673FC0124E48E4E2242E84D8AFFEE6803CE6EDF3A954D2C54562B8B76A4EDD91E24A8640AFE67255605849053B60F558B43DDB9F8A04E987D15F6292962D10AD8F7B47188D12D1C9090C0FE8710DC3937C6939496884BDE0BEA979839837C61BE4DF5662C724610C7FCB4631A0A2083417BE6A20F4EED094E2145BC72A83A6E147A655C481DCC906E63ADC0244D95B6085FC096FBCCE81EEB0497F48BB5EF827C0893E331795E3B301DC9F3A91DBA9FBC838E044E2AD9859F1DC67E9BCC375442B4EB59714B5EBBA87AC9A79C99CE74F8BC75740DDCCE46C4B408B91DD7D4AD26B0FB1A4AB874F5504C40E7363838D22AEC45C10D3CC2E233124A5CD8344249EDF388E37BA43598F2C2CF56D444BCEE04A335B154DFA3CA694DB481CBAA59514098CE6E0E4138C0A543EFAFEDA4AECC022C824259A06C3D57A70EA15A5DFC822449A27F58F9EF842DCBB636CE293684E1B331CD821594A12634E5594410B6C5E2306DC8BBE62C8B0F49F2F699A59EFB14D3CAD399F74ED893E1EB43FD770FD61E0C58E5D8CBC9435F4AD0892681A30DF4885927130432186AD4BE41F6FB7CFE660E23C5E55F60789B3E97C3B622599938B36BD1C0BCF6FDB7E4EE44C92B6A86CA2470BCDB8BAB8DF6079382CA314BF3A8B3C4286518C356018FD6F6FCDD9BE9AD9C228F29135544E723A898F483E9D9EE843E75ACB3FEAC447973D12461FEE3D984F3B4F31645FAEA56852D356C96CD73A6F185E8CD56731E83FEA145A2BF0C15ADC634DD9E2FFC799B59A0712EB4D2618680C7493F50A9BBF3F7BDE1025CD44AFDAF4A8C42C9254B1B34AA8559E1CEE9BDE7B4DA0FB3CB2289418110620E505B793B91F422FCF53ADDA8F7C96D55E26244E075D9A70004642712EAC377CE18F88F2C8581694B8F621707DAB6D292179B2A95AEC5AD6E409D78253DCC05ECCDB45683DFFFB9C629AFCFB0654725D650E4A283FD98E47F37AA9309E2933CC0393625DD81D4A02F9D5082644DE02B6472D5D3AAE110747E4F756973FDFCE8EA5F997E30B11EBD50B45F6889D227D87D9184CBC6ED40E96DEF8B9236763C9999E21BFC1A74457FFE5E0DC2B16876FE04C2E0F0F47012A767A7AC18D71A7FD65F8647A7E1AE2D4D255492A18AA81D17D390E381B1722BC3C38BCCEA9D5E73231D0C6E1A96CCB47079E36C994E94AF9A318D67B6408BB602A91D8E9EC6499DEED0B51A9AE31D9774A1BEF4C1DE0E7A324545B2AF9870CD733C2195C5ECDE386D298C33D492937497EA5F0E05C377A4D755DEA9D96C61FE82CF6299EB34B857217A2C6733FED64F5DAC5F95A0EF2294ECA844B96CEB5163363A31C58C88428152663AB0A2B310B1A9E9027CA8CC0DB6DFF528F9A421FA826A86ACB4FD1D79C1AE6123C9E685BA66F5FF109FDFF2497B1A50C2E4E7B4662FA11FBAA305A960CA70FF98E5290A8C3A27B4A3CF1705C6DF4290FA64F3259FDEDE7A81CFDE4214230DFB9EFB20049E905833B5D48923C8CE2F8A104946FB3356154519D950998677C56C8B2C80471A6117B142E26C0345CDF0634E356D80C3BE12F4AB89EB41DDDCF98188EAD2FF420EED3FD9287322F24C62B21F430D5F9B8592CE1CDC946616111C91C667006E47992FE2D5A2AAD82F8DD1AF3C1B8BA5326220645885CC94E8B2B76CBFF7E161E994C0CB9E489B8A5662E9D420913AF34433F5BAB10AC72C5EEB9249F3C102E1762E862C13CC882D20BE16834E54DCC323EA89A133F451B70087A8DCDC5B518EEF087A571B570A7966F1C49BFCDC70AC05034D1DCC56EDC2C0F57D1AAF16718C67D162BA330AA61A2875F90E2935752BFF1EC28A79EAD1AC18E70A833946CA6A15D8765E1A62AEF46BED232EAE89DBEC278297B396CF611448C5FD4B36B95CDC54E3394C63B9B0969D6488FF1C700B390E7226F99A945306C6504958CD43CD3D63910A4324BB662A0E5DB1622D90CE00E50CE7112193872AAB5CEE0B8D6FD42F26C2FB87FDF99062169C0BE75C85109D4E209DC8A640FED3EC71EF3DE8878B3D1729FF118F50F8A33361C6F707F6011454C5D744989EC1BEB644FCF99CB2E7C3CD20E6F1656E07C3566C4DE68593BCBA0EE9F7BD2E272C3D47A3E03985456F18CAFBEBBC1DE74964BECABDF3E9BBB9A10B29BF3B458FD50F19D63A6231CB51CDE3DF46E4BB6318E81E10AD1674A053C8CFE1E72853FD60E6E642642CB825644D6734AFB00329839F22CED734FA1421C4334E20F2ECC8BBC2652004203B3B639FBDCF5FDA1423F08C3A1100655E4763B8D8356A151D702124D30FDD87B34EC4D34BBB3639464E44A693690E193329 + +count = 61 +seed = 09B8441F47235EFC82D71933A0037FA4F69124C3BAD4EF6A3A7178B417A3FDA874081B7EEFD7EF1BF234C752458FBBAD +mlen = 2046 +msg = 92D5FEEF68737ECE61C6E0078D77FBAE97B0B9235F40B97099C114B1586E107B5ED1308A8A2D20BE41AF129DA2E0B38EAF02FAEF733C7A1D1A387BC55EF008530ABC22697D0465AA3EB71F41EE72ADD236CEA9A25995F3689C5A451E2F03915D96ABEA10D356D549D68048977587326523CCD71C05FD57BFB3C7A853F535BEDDEADFB84118F6548860F6BA536277DDD7AB42123E93381A385FA3E6CC023C1458A9F94822D93248F36C48FDDC972B5D6494B26658440FFBC23B57363F3D82CCE69FEE4747A889E85343288D55D30FC54D2D0744744DBA9977720E8EDD2C0ACA1FC51B0C6A3C68BB9BB8DA0385DB1CA4E9CE660CF7EB2382E5E95D2AE19DEF904A8651DFAE53A4D0DC4D057AB1A506C3BD7E1D1EA3FC4623E7D7B410DCB312F037B7A5FDE5E0E604FC33270FAF1FFB6ECB3125DDFA5C49F25BBC98238C8AB1B903537CD67238995E81B814280A4CED61513D69A2178086D505F8DD1DF7E11CE66AE33D4C982F94231957031A258E0EC745672A57A5CE76D1170111B8882A9EB5388094EBBD53EE9EA1FCE4A275F9D7060C8DA79018487B452817280C63B01B05EFBF897387592E2BB3BB486FAE0AB09F46D9F2E176DE96C59992C10A14EC16EAC36102B1D15541607075E67C842A888C87B268E9809148A323C423220DC31566B62F45CCE1E2BC1B3BF43B87C998F00023890BCE517271BEC16EFAA33F11611FDE87F197852BC2E7A2B44F8C72A6F79B22F73BE0611B81EFE09253931545D2453939C46B6797CC5DC5A8F1AA3BD8456EEEB84EE76DBF2EBF32598750ED10670DF422C7D7993ACC55F657E6E1B3DFA1BD6C1CD55FAE97E69D2F8F5AF368F7DA0A63B4065EB6D8F02B19A34600252FDFFDF4ED8DE2EA9CD2E74D63A6CEF29BF02F92D346ECB9A61081EE5AC811F33AA5792F6A1AF570A8B0846F3E6EF38452346DD637B19ECA37BD1A6C42B20A5BEDE9A5DE3C9F169D04D8C6CF5376D3404F0C21DEAD53DA6C169F390EED7B5B54DBE47CCE0B2AD1179EA8FC80FDDC7281BD4FE31B9A26A00444AF0B4D40A1B72BE37501308906149DC6FC5CF02B6F60AFF82B975FC8F146961EBCCB4D126ADD524A9B33BB16F6A83C6F3727A72EFA2BAC116E493E07B2CA718A63FCAC8E9D52A1B61479B4EE52A5ED30FABCEA4D01A792A92676721286814F3B0F4E15E23CE0C5D59A0C3EB8573C0A2F66C25F2EB2FCFF787324721004979BE5EAC505DFD39F5538E2C1B2CC12D20C1C5CD87299766361AEDDBFFF743693081842378744879E6E6371B3FFA9DDF34966FBF8DEE91B7EDF6EEC3E4E2F410CB5351F847646C22AB594046DED63347D04A008FBF6EE9696C638ECE73B39A269DB239DF36443868AD44D26A5C40FC92DFFB008E436E5C18907F5B18B5E6C5900B41A9801DB070D2DB651187A4DA7E2647ED3E9B6E9781627EB576BEE8334374468760DD3B32985D42945D953D434BFD80D7F7BA537265FFCF27DB0DA1ABDAE89BBE94D98BC9CA197E41C0839728F964FE4CE30B8CC43CBDCDD9CCBE06FE99DEBC6F4024F3F00D43FEBCD62A1822A6D507337EE79D4517AA486870602D4F1C5368B0EAA1FF6C011A9A953AAE58C75BBD3DC78D263A578C75CDB1AB324D71B9A065A9AF3DAB854189585C68D499AE8DB887745E20AD9738705B9D2F5D429F12D6462E5E2EF9FFBA53CE2F4E75449D2A7DBC3C818E61DC546175A6E0C10AE631DF6B1EAE6D134C08466EBF6EB5F8257AA10EF8C6F27F4295F7EBFD450629F3EB4E0F4BE247AD7F5E80703B1247A4FC277311D69E5D62E0B0201A805CC4F1F807DE99420D563A703493AD35A56B2B2DC237112F5EC21C70BF139A9EAD8F7E921F086E001B4C449E42A0E3AFCD5BC757040A2865D0E5ADAF98E37E6F8A501FF39CEF0BC364EECDFFD03069B81F5E1978C397862FD56362835C059FCBE4D8E2A957FADD7D05BB195E21AD67B429621E1D6872DE2D8BFDC91544F9E6AE8C164A23255AD0E00BCB21456F8FA6AE018F49605736C81A5AC0945E2D965F1493ED5BEFCE512AE93AD91DAF6F5A151D6C9856DFDDD1F877945D932261DED67AC8231DC3CCD0B04DC1B02079C897601E363FFB9A3BCBBBDB0B0A375E69EE4A7135C094ABDC237FAA2E5F82D2556290ADCF82ADBA8402C4FC9D0724F15BB87CD7A75A1A7BF826896D8EF63C7A2A3C371756AF638706270652C376100EC42FA55196DF332820D377760448D3E7ADC42E9F5D8A7074BD0FA97433B0E2C501252DE6939AB948552663A17DD7FF05430FA76E29F0519D650B86FBB19FBED097143FC242573E3E6FA4BD4A2EF6D9CE6932A066B4F9FF935BA9BC26FC2E5031C20AE30A52970A2DF3504576108D5F26517F8577BE61E6AA9D192ED62CF36AA641DA0D274B1ED5EE864B549154EB4115658E6C60219CC5B2E22C49CE3BA76A85EFB549117E1207F6DF081D0761421262E352182239F1E34EDBEA4BCD8FA0027543824DD58A20324FD4CFE943AAE5E361C367B22F587E2F9BEE841E11875B026F12B9571512F72985F98F6D0C212DF36A60975429173E317F6ACF72E621F30654A6DEAEF9E9E455524BF07FFDF44642A1826F734D69F3EEF4D52F26C06376C8F71DFB65A24A4C57D74B5976950AF3A57B4248909524BEC47D858C69041EED34E0ED3B111BBC117AB112BBF947D646AB3B7172F5FB726DBC53AE37956E29F5B6B1E3C90BAF4E4FA544FF63815FDF4AC9A2A80CA0E8722383437B9A02F3AC538FEDA7A6D6C1635D3624A385D846E79E956DCE483B89C346C1287A1A7293168D8A885FEB6569EBDF3F47F8BBB50AA43941EB20001959AF1B9B358ABA13FD9BBC596EA42A9774A120AF091D544E79C50686C26B4FEA396BF1E4C25B8EE4929D75569A5FAC521C77B +pk = 963001E677687EE54167796BC53ABDF29970E6B93BBAE8B1B42314EF4024A035C715EAE42CB2F02D57044537767E2E529D9C2FE2EB2E840965CB8ABEE70F000093FB520D27E4B3C597F8502B226C1E7271F3559C1ED9F2ACF1F37622EB18257A5DBC2E30AA0C44480A40700FB7E72FDC279CB776B8FB4D71374B8E4328CB610006 +sk = 963001E677687EE54167796BC53ABDF29970E6B93BBAE8B1B42314EF4024A035C715EAE42CB2F02D57044537767E2E529D9C2FE2EB2E840965CB8ABEE70F000093FB520D27E4B3C597F8502B226C1E7271F3559C1ED9F2ACF1F37622EB18257A5DBC2E30AA0C44480A40700FB7E72FDC279CB776B8FB4D71374B8E4328CB610006470541B80C81EA86BF39D073B54AF7C4E5314E75D36B52AC7AB7DD9F4114639E5600000000000000000000000000000000000000000000000000000000000000E8C00355FBB4B6D1E075F5755220B39C8C451EA69AA04971EB915B1685BF33B2E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3EB9CE7E204205063ECF4C1F507686A2BE33F89F7D05EDC632F76F7037688B0ACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033B55A54DF921AD96B869A94521EE3BAA7F00A4E8A2B8B8B78B2725197EB70DFD7B52E8CD6E1ED3D36F0BFDA5F4D5014FB3EEE288725CE47695F16CC1B0201E7494BE559B0329B25F106753850F87234864756E57F749E7C0E4185A2A24A638B30347662134EACEF89758AC9BFF6082EE2656D294FCBA6F3E61DED994502688A1E41F2A206399A0381368895D0F8AEB356A14613D4132A6AC422D5FEF3C559B8B7E7C10B22B80B7824D5C85BED08863C4062A5E1DB92009A1CD646350EED2220E7627960C5B46F6C68FE2F7EE32F5EC1D47A0C861874F7C934E2D4BC5FA60CF0FB2E894297CEC5CF63FB77E2495002A5EC857C18195402C1CFF3350D +smlen = 2338 +sm = A314BC20FB5410211DA680E4909B07209D618B12B9CE477E5DE305FCA63576842AA8ED0BE11505A4729A6A8B84630E41E03C5256592D0090B690E74CAA9C6A01CF33EEBAF2146ACDFA86CC5105D16BC4E3D754BDBEAE5CBAC8BE5CFA2E29F590890A17E2C598DFDC1751BC8BCC16E96AAD39BF9375BA3D8917E25BC90660230000004FD2484877C4D9381487DB1FE710AF9A9B5FFDE610AE7E4D911FA4AF059BD51A0FC7FD8B4D1258E2BB8E18E6E11623F801DE3614C9EA19A6D61DC61697F93C37A720DACAC94E1DE583553DE178309C8448CB38EB666353953EB2AD8032611B519CC3FE8ED9B3134B278A73C13BE08EB7E2D9164B9E33F035E1645B31F240B06DD58A90E4BBC0E57183AA4F061E3866D7DC4FC0287E2563BDDD19D43A6F7F5400060992D5FEEF68737ECE61C6E0078D77FBAE97B0B9235F40B97099C114B1586E107B5ED1308A8A2D20BE41AF129DA2E0B38EAF02FAEF733C7A1D1A387BC55EF008530ABC22697D0465AA3EB71F41EE72ADD236CEA9A25995F3689C5A451E2F03915D96ABEA10D356D549D68048977587326523CCD71C05FD57BFB3C7A853F535BEDDEADFB84118F6548860F6BA536277DDD7AB42123E93381A385FA3E6CC023C1458A9F94822D93248F36C48FDDC972B5D6494B26658440FFBC23B57363F3D82CCE69FEE4747A889E85343288D55D30FC54D2D0744744DBA9977720E8EDD2C0ACA1FC51B0C6A3C68BB9BB8DA0385DB1CA4E9CE660CF7EB2382E5E95D2AE19DEF904A8651DFAE53A4D0DC4D057AB1A506C3BD7E1D1EA3FC4623E7D7B410DCB312F037B7A5FDE5E0E604FC33270FAF1FFB6ECB3125DDFA5C49F25BBC98238C8AB1B903537CD67238995E81B814280A4CED61513D69A2178086D505F8DD1DF7E11CE66AE33D4C982F94231957031A258E0EC745672A57A5CE76D1170111B8882A9EB5388094EBBD53EE9EA1FCE4A275F9D7060C8DA79018487B452817280C63B01B05EFBF897387592E2BB3BB486FAE0AB09F46D9F2E176DE96C59992C10A14EC16EAC36102B1D15541607075E67C842A888C87B268E9809148A323C423220DC31566B62F45CCE1E2BC1B3BF43B87C998F00023890BCE517271BEC16EFAA33F11611FDE87F197852BC2E7A2B44F8C72A6F79B22F73BE0611B81EFE09253931545D2453939C46B6797CC5DC5A8F1AA3BD8456EEEB84EE76DBF2EBF32598750ED10670DF422C7D7993ACC55F657E6E1B3DFA1BD6C1CD55FAE97E69D2F8F5AF368F7DA0A63B4065EB6D8F02B19A34600252FDFFDF4ED8DE2EA9CD2E74D63A6CEF29BF02F92D346ECB9A61081EE5AC811F33AA5792F6A1AF570A8B0846F3E6EF38452346DD637B19ECA37BD1A6C42B20A5BEDE9A5DE3C9F169D04D8C6CF5376D3404F0C21DEAD53DA6C169F390EED7B5B54DBE47CCE0B2AD1179EA8FC80FDDC7281BD4FE31B9A26A00444AF0B4D40A1B72BE37501308906149DC6FC5CF02B6F60AFF82B975FC8F146961EBCCB4D126ADD524A9B33BB16F6A83C6F3727A72EFA2BAC116E493E07B2CA718A63FCAC8E9D52A1B61479B4EE52A5ED30FABCEA4D01A792A92676721286814F3B0F4E15E23CE0C5D59A0C3EB8573C0A2F66C25F2EB2FCFF787324721004979BE5EAC505DFD39F5538E2C1B2CC12D20C1C5CD87299766361AEDDBFFF743693081842378744879E6E6371B3FFA9DDF34966FBF8DEE91B7EDF6EEC3E4E2F410CB5351F847646C22AB594046DED63347D04A008FBF6EE9696C638ECE73B39A269DB239DF36443868AD44D26A5C40FC92DFFB008E436E5C18907F5B18B5E6C5900B41A9801DB070D2DB651187A4DA7E2647ED3E9B6E9781627EB576BEE8334374468760DD3B32985D42945D953D434BFD80D7F7BA537265FFCF27DB0DA1ABDAE89BBE94D98BC9CA197E41C0839728F964FE4CE30B8CC43CBDCDD9CCBE06FE99DEBC6F4024F3F00D43FEBCD62A1822A6D507337EE79D4517AA486870602D4F1C5368B0EAA1FF6C011A9A953AAE58C75BBD3DC78D263A578C75CDB1AB324D71B9A065A9AF3DAB854189585C68D499AE8DB887745E20AD9738705B9D2F5D429F12D6462E5E2EF9FFBA53CE2F4E75449D2A7DBC3C818E61DC546175A6E0C10AE631DF6B1EAE6D134C08466EBF6EB5F8257AA10EF8C6F27F4295F7EBFD450629F3EB4E0F4BE247AD7F5E80703B1247A4FC277311D69E5D62E0B0201A805CC4F1F807DE99420D563A703493AD35A56B2B2DC237112F5EC21C70BF139A9EAD8F7E921F086E001B4C449E42A0E3AFCD5BC757040A2865D0E5ADAF98E37E6F8A501FF39CEF0BC364EECDFFD03069B81F5E1978C397862FD56362835C059FCBE4D8E2A957FADD7D05BB195E21AD67B429621E1D6872DE2D8BFDC91544F9E6AE8C164A23255AD0E00BCB21456F8FA6AE018F49605736C81A5AC0945E2D965F1493ED5BEFCE512AE93AD91DAF6F5A151D6C9856DFDDD1F877945D932261DED67AC8231DC3CCD0B04DC1B02079C897601E363FFB9A3BCBBBDB0B0A375E69EE4A7135C094ABDC237FAA2E5F82D2556290ADCF82ADBA8402C4FC9D0724F15BB87CD7A75A1A7BF826896D8EF63C7A2A3C371756AF638706270652C376100EC42FA55196DF332820D377760448D3E7ADC42E9F5D8A7074BD0FA97433B0E2C501252DE6939AB948552663A17DD7FF05430FA76E29F0519D650B86FBB19FBED097143FC242573E3E6FA4BD4A2EF6D9CE6932A066B4F9FF935BA9BC26FC2E5031C20AE30A52970A2DF3504576108D5F26517F8577BE61E6AA9D192ED62CF36AA641DA0D274B1ED5EE864B549154EB4115658E6C60219CC5B2E22C49CE3BA76A85EFB549117E1207F6DF081D0761421262E352182239F1E34EDBEA4BCD8FA0027543824DD58A20324FD4CFE943AAE5E361C367B22F587E2F9BEE841E11875B026F12B9571512F72985F98F6D0C212DF36A60975429173E317F6ACF72E621F30654A6DEAEF9E9E455524BF07FFDF44642A1826F734D69F3EEF4D52F26C06376C8F71DFB65A24A4C57D74B5976950AF3A57B4248909524BEC47D858C69041EED34E0ED3B111BBC117AB112BBF947D646AB3B7172F5FB726DBC53AE37956E29F5B6B1E3C90BAF4E4FA544FF63815FDF4AC9A2A80CA0E8722383437B9A02F3AC538FEDA7A6D6C1635D3624A385D846E79E956DCE483B89C346C1287A1A7293168D8A885FEB6569EBDF3F47F8BBB50AA43941EB20001959AF1B9B358ABA13FD9BBC596EA42A9774A120AF091D544E79C50686C26B4FEA396BF1E4C25B8EE4929D75569A5FAC521C77B + +count = 62 +seed = D2629CEEAE5C95D3C34C1FFCC2338B4A97782BDFCD39111E18540B69DB035B352D012857111F816F03550BFE5F56ABEE +mlen = 2079 +msg = 7F704CEF1C510BC2CAE9B70FD248C656226BD5686D366528F0D0BEFC0A8761EC640CD2DA7979DE5EEBDF6127F29ABB8607F8A3D3BE05BE25AACE7FEF3063DF28E22A522FFF0B6FF6A0C61F79B02A408E8E1C775AB80BE6841E9F8A9D030AE5518E3EA8A4E31E416E087D47919593598FD58122A9E601A57EF02DE183D56921811AE2253628125C24F93C84361C5EC99E7B16962BD96CA190C68F3AA9DD60CE3AA7610589813B4FB77A4688308D9BC72CBE918583E298E03AB95FC500209C14ABEB3A43BAA92DCB11CB523C4D17EB9C6697B56C8B61EDA05BF5789166F839291CFE2997B7DD462EDA69B0615F2AD82AAC0A32F4B30FE8725849C144A9C07799D6CE9D293C25D8302161757B8C8C8D07032D914EA7DAC275919A1DFA0D3348EC07FDC70266975722763EF85EC4AF9E14288C9659907526566BB3F2DD5DAFC0D422568CA3AE52486D3F2C18B667E5622BA7E52C56BF00F82AF2108CB4949A09179544F30758B7FB98C49EA160720991B14E2858D648F0585AD1BB1D08294F029BFE936154E9D328DF2E054004FC5C29070DF9EE50DCD0981D2BFB3AA7D6F637C4CE457C0C66D27E2670107A2B85D1F026BD970EF3FB7E32C60218D5E43A06D9CD26289A937B4FBAD2A831425728F3D0D30C6C602AF4B14411E9B3C7CF0B4D630614A9E03AC30BA2B024D496DA984D08854F1366012C2400A5C8268C2B126DEA5AEBA0DE7C92BE0AF08CA22E02604A753702BDCD642BBFA0CC91BD8375657A957306A76B6F139621481B6F15CB57BEE128954D30F552661F906D8AB42CF260F30F88993BB40C9679385F5C4639888973361216DF3C60C57D9B250F64B7634C94DDA3FD122713FD2405A7B71F476C263A781DCE271E7D0665E45DCB27F7293DE57312396C58C40E268F57ED856F536C8FEB4B0060488DE3C25949D2B7E64207576641B34920D04B46766AA2978D9352C2769D49F8599F3D0439C928532E0EE428A3773FA4D68E6052335C6D93368E321D750D296799FAF87B82C640A6E995D18DDA002887F141DB8ECE2584DA2FDDF848D38357D585CD619B1625A70A5D333561D6DE856ED9908D1E377EF7BE03B326594808BE58F7FB3939E939B73F11DAB3E572DBA41D43A046B8D2BB521728222D5A77DC886AC6F328D9A531118156D791D64F5DF8FF8BE8DCA32EABC3CB259B0F72B021CEB4DB36A6CD2FD149437B251F81F7588AE921456BEF1A79FE83447D80CADDBF20895667CA0E493A4731EEC901E03F66DE284400A5558922AD53D4E0FF7BC6C61640ADE0274C63D94E96BF6C642B790823109F53C3C27130A1EE38D448239187F5009373BE328AF866A9B8DD1BB735E8002296043C6FF641A432709148C707B900ECF46555D77644565D5998C096756F79B6F0E20850B8BF0528E78BF5FB4859BD655227873D289CCE47FEDA8414D09ED7E8D380FC4D580C7F44B01521E829E7B0CB2D2F345C517B65E2D476687EC9A4C160A3AC0B01CBAA588644D799B125910812790F06C1ECB1F1E64D5CCF92AE5E8147C98B0CFAD5626BAB5115844198E8C2AC1DF9A208FCD2D2891F4A29009F5B36D8E31383811A9493CF8E143B5AC8A14D48119CC16D2C6BF6826FC47D4B782FFC76B64401B8249777E32C1298606553DACF386A22809B599924A635796A1AEC3CD8568064852E54C95AD887D7AFE837F6FF676F69EE6288879F6D96193AD94A0418BBBA2EED5355876F2C3497448A5F8F3F83B136703D9A38FBB62784CC233DF448A5E88EB5F81A0BE97A16FD4CABA1D87A4BFB08E002EBA548F662D496A1478BB7C26C69CA4C100AA6872A4945D703CA812BDBA53AC86010AA1D2C53F29E46AD095936FF50DB8805DF4B08C9580AEECE3A6DDD828E7B5D4DABCAF112A6E35AB3C28A6DDC4D98AD1063C2ED72CAA50086E6B72090CC1F2AFEBEC6751F27EF51DD8557E53D928535D82A220F62BA0645E3C2618F3424EA1A339A138C9B8E26B14BC32D1736A4193C0C72CC402C3EAB58817335C1424BD6F38CFE16338611118B4100E4038D07DCA041C72E485C5290F0DDE601565DAE9CDF657A4C7839D3ADE72986AF396E767430125786E219BC5736F16FEF66B4014E5961CFB4CFEC4CB2A32205A92DBF1399E2710395BA1240D48277C120526CD9E2352F7D04D89CC2754379CE80A2CD1AC765718B8BA61EBB8BC6D0D407022E7AC672065FC8503BF5BC4138520CAE233EA997463D7C9E00BBD852F12EC17C6F1DB1914446AA21E156D210094B699B4117B31EAE6386DC0DE1F55CCEC09AA1EB38CDE4602598D452732C5EF8B07C477E3E2DD470737EAA7357E2E8B74C31A117B519BDCEF79B6B044148A10468E38B5A6B7B10D74C6130A60A268ED73DC9A25ED68AF354758FA3F57ED3558DA654CACA7150A8E4449D0EF640184A7A33D00BA765B01C442E88D9B4257B93904ACE04375679BFD8271A03073E34C4A1C0437C4009A9590CB98D0B5581DC83407F04A22C9B0246DE38E1A13F9B1191493818783950548BE562F940240CDECD4A50C94E406B1BAE04B50A3A19E7923183E3FD356238C45AE6559193E0E846DF0FC6878BE6C963AA8C3508DC31F766A4B29C78D749C89985AB8F580DBDF7993A2261CC4BBE489C3BBB38C46739BD2516D3C64A93F10CF559DB6A0EA3BAFEE8B43F696A5288C66509A57C642BBEAFB40F4CD0649B4CE25B6FB2EF5529B73556051213BB39CC4F1DC8004B1588C8DE836699C66CED567998523AD3AC303D9E13617CE6C1D2FC4C35B22A24504C51F64155F24D91D0E8785B40912B3DCEDEDE71A6933B36BB514FDD1D3D843AAACF2C1E79A5216622C20036C9C999DAC3A5A2D43FAC3B23119927806F497B4048F561A2276FDA0302423147D35579DD4411416F0F59273429AC0464AC49B230E29DC124115D18A045663D228BFDAC9F57B0C5B4 +pk = A7D56E600D4CCBF36A4B26296D1A55D4F4E780D27F93E3EB5757106BD17411C19E8471ABC39EF8702F958DE59A65BCE6C68331E47177F7C3AD59FBB242AD4300B3ECE13186FE0595A23590B8CCBDE883B5D0DDF6568A54D5C9685DB3DEBE6E7BE738900490EF0CD555F4BA3007170E2FB1F26524FEFFC340A726D638A6149C0011 +sk = A7D56E600D4CCBF36A4B26296D1A55D4F4E780D27F93E3EB5757106BD17411C19E8471ABC39EF8702F958DE59A65BCE6C68331E47177F7C3AD59FBB242AD4300B3ECE13186FE0595A23590B8CCBDE883B5D0DDF6568A54D5C9685DB3DEBE6E7BE738900490EF0CD555F4BA3007170E2FB1F26524FEFFC340A726D638A6149C0011631F45F7187BC06A7E3F5AFBB441837EFBC87D2671D2C60ADB78F372A5344DF78800000000000000000000000000000000000000000000000000000000000000FAF58EC683535F4A0DC7C866C9D7F07774E0DBBBBBD8A9977CF12DB3601DFC2885FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3334962CFB87CC812747D8A7341F26D95E7C967A7F96BEFFC4A5CEA5FAD8C6325FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000937A1FBF95D214C431C18C0E1D612A999CF7916499F566336B6B966194A5540DFEB24727E98E968A954701894B9EB02D6B022785FE0A324D95936044E4390E87EA1041A31767BC810125EBB2F91701E8E10EE0E5A979930647FB458C7E23C281124DE9C203AB9480BA0B51F475A4B550DB3735393088A7494BD9E0B13205949913EE58BBC4823158934B7BCFA4F2978DF38B04FA0700274B9D5ACCF3B33AE4622B92861BE21D1C5D1D29524773C48F074CCB5A451CB312BF4593B3E4065D2A95DD3AF4012ED159DE244425DD50ABC39EF6767403DBE4F7E5F6353C73FD0BAE461309BA78BBD3EE72F4D444CAE0E2D2599EF7A950A04446870DD6F10E +smlen = 2371 +sm = 65FBA9393D36472C2C68EB3A86065A32208033C8DD9804193F092A7A42D46E2469959B456DE84EB5E2D528EB0403F5D19C30267A6F3321EB16B49913E64E79001B51B1E7E673AD3908B62C48B36D363988DF3612CEB45A2E6BAAC2EEDB9A05DB667963B34AACF54D8D485F0A7D58E6055AD756D2806402D1C45DE15E51F187000001D3DB22EFD52E14C24976F284908C2D1CFCED45D8F1F958D2D74014B978C4D17606DE6E1D13280610C328E98AB2C3A5E55D4DC76B4DDB4D9D41E8CB39737E7E685681407282DD0172903DE0B76EB29202975E3315FE5ABDF8CD762A69E4E2A9572A4BE4FB858D5CA31C87536C13D30834ACE98785B2E7D0EB8F11B6E487B099406014019060034AEE51A69D4C6220C6C8E5D5B336F440B1E71828FADA309E150006097F704CEF1C510BC2CAE9B70FD248C656226BD5686D366528F0D0BEFC0A8761EC640CD2DA7979DE5EEBDF6127F29ABB8607F8A3D3BE05BE25AACE7FEF3063DF28E22A522FFF0B6FF6A0C61F79B02A408E8E1C775AB80BE6841E9F8A9D030AE5518E3EA8A4E31E416E087D47919593598FD58122A9E601A57EF02DE183D56921811AE2253628125C24F93C84361C5EC99E7B16962BD96CA190C68F3AA9DD60CE3AA7610589813B4FB77A4688308D9BC72CBE918583E298E03AB95FC500209C14ABEB3A43BAA92DCB11CB523C4D17EB9C6697B56C8B61EDA05BF5789166F839291CFE2997B7DD462EDA69B0615F2AD82AAC0A32F4B30FE8725849C144A9C07799D6CE9D293C25D8302161757B8C8C8D07032D914EA7DAC275919A1DFA0D3348EC07FDC70266975722763EF85EC4AF9E14288C9659907526566BB3F2DD5DAFC0D422568CA3AE52486D3F2C18B667E5622BA7E52C56BF00F82AF2108CB4949A09179544F30758B7FB98C49EA160720991B14E2858D648F0585AD1BB1D08294F029BFE936154E9D328DF2E054004FC5C29070DF9EE50DCD0981D2BFB3AA7D6F637C4CE457C0C66D27E2670107A2B85D1F026BD970EF3FB7E32C60218D5E43A06D9CD26289A937B4FBAD2A831425728F3D0D30C6C602AF4B14411E9B3C7CF0B4D630614A9E03AC30BA2B024D496DA984D08854F1366012C2400A5C8268C2B126DEA5AEBA0DE7C92BE0AF08CA22E02604A753702BDCD642BBFA0CC91BD8375657A957306A76B6F139621481B6F15CB57BEE128954D30F552661F906D8AB42CF260F30F88993BB40C9679385F5C4639888973361216DF3C60C57D9B250F64B7634C94DDA3FD122713FD2405A7B71F476C263A781DCE271E7D0665E45DCB27F7293DE57312396C58C40E268F57ED856F536C8FEB4B0060488DE3C25949D2B7E64207576641B34920D04B46766AA2978D9352C2769D49F8599F3D0439C928532E0EE428A3773FA4D68E6052335C6D93368E321D750D296799FAF87B82C640A6E995D18DDA002887F141DB8ECE2584DA2FDDF848D38357D585CD619B1625A70A5D333561D6DE856ED9908D1E377EF7BE03B326594808BE58F7FB3939E939B73F11DAB3E572DBA41D43A046B8D2BB521728222D5A77DC886AC6F328D9A531118156D791D64F5DF8FF8BE8DCA32EABC3CB259B0F72B021CEB4DB36A6CD2FD149437B251F81F7588AE921456BEF1A79FE83447D80CADDBF20895667CA0E493A4731EEC901E03F66DE284400A5558922AD53D4E0FF7BC6C61640ADE0274C63D94E96BF6C642B790823109F53C3C27130A1EE38D448239187F5009373BE328AF866A9B8DD1BB735E8002296043C6FF641A432709148C707B900ECF46555D77644565D5998C096756F79B6F0E20850B8BF0528E78BF5FB4859BD655227873D289CCE47FEDA8414D09ED7E8D380FC4D580C7F44B01521E829E7B0CB2D2F345C517B65E2D476687EC9A4C160A3AC0B01CBAA588644D799B125910812790F06C1ECB1F1E64D5CCF92AE5E8147C98B0CFAD5626BAB5115844198E8C2AC1DF9A208FCD2D2891F4A29009F5B36D8E31383811A9493CF8E143B5AC8A14D48119CC16D2C6BF6826FC47D4B782FFC76B64401B8249777E32C1298606553DACF386A22809B599924A635796A1AEC3CD8568064852E54C95AD887D7AFE837F6FF676F69EE6288879F6D96193AD94A0418BBBA2EED5355876F2C3497448A5F8F3F83B136703D9A38FBB62784CC233DF448A5E88EB5F81A0BE97A16FD4CABA1D87A4BFB08E002EBA548F662D496A1478BB7C26C69CA4C100AA6872A4945D703CA812BDBA53AC86010AA1D2C53F29E46AD095936FF50DB8805DF4B08C9580AEECE3A6DDD828E7B5D4DABCAF112A6E35AB3C28A6DDC4D98AD1063C2ED72CAA50086E6B72090CC1F2AFEBEC6751F27EF51DD8557E53D928535D82A220F62BA0645E3C2618F3424EA1A339A138C9B8E26B14BC32D1736A4193C0C72CC402C3EAB58817335C1424BD6F38CFE16338611118B4100E4038D07DCA041C72E485C5290F0DDE601565DAE9CDF657A4C7839D3ADE72986AF396E767430125786E219BC5736F16FEF66B4014E5961CFB4CFEC4CB2A32205A92DBF1399E2710395BA1240D48277C120526CD9E2352F7D04D89CC2754379CE80A2CD1AC765718B8BA61EBB8BC6D0D407022E7AC672065FC8503BF5BC4138520CAE233EA997463D7C9E00BBD852F12EC17C6F1DB1914446AA21E156D210094B699B4117B31EAE6386DC0DE1F55CCEC09AA1EB38CDE4602598D452732C5EF8B07C477E3E2DD470737EAA7357E2E8B74C31A117B519BDCEF79B6B044148A10468E38B5A6B7B10D74C6130A60A268ED73DC9A25ED68AF354758FA3F57ED3558DA654CACA7150A8E4449D0EF640184A7A33D00BA765B01C442E88D9B4257B93904ACE04375679BFD8271A03073E34C4A1C0437C4009A9590CB98D0B5581DC83407F04A22C9B0246DE38E1A13F9B1191493818783950548BE562F940240CDECD4A50C94E406B1BAE04B50A3A19E7923183E3FD356238C45AE6559193E0E846DF0FC6878BE6C963AA8C3508DC31F766A4B29C78D749C89985AB8F580DBDF7993A2261CC4BBE489C3BBB38C46739BD2516D3C64A93F10CF559DB6A0EA3BAFEE8B43F696A5288C66509A57C642BBEAFB40F4CD0649B4CE25B6FB2EF5529B73556051213BB39CC4F1DC8004B1588C8DE836699C66CED567998523AD3AC303D9E13617CE6C1D2FC4C35B22A24504C51F64155F24D91D0E8785B40912B3DCEDEDE71A6933B36BB514FDD1D3D843AAACF2C1E79A5216622C20036C9C999DAC3A5A2D43FAC3B23119927806F497B4048F561A2276FDA0302423147D35579DD4411416F0F59273429AC0464AC49B230E29DC124115D18A045663D228BFDAC9F57B0C5B4 + +count = 63 +seed = EAA4FB8EF0290A499A1D92EE398A8D7E71CD3CBF01A36750DA4B7EFF175DA26D17AC4ECE49A84C88D1D2C2493563C26D +mlen = 2112 +msg = 2E086FA0C4582E0C6CCB020F86A6107475985160BED201760D6489CB05B8D21452C81BD5D317F8857703DABA24E968F3164C82A4A9751DD88742B72141734DC0B4A77CBE2AE1C287A396A2F5804519456CF1EAE273A5C6361F52C35EDCE5ED7388D61D01AC040676522C9FD7B02A7DEAFDCB4169867EFB69792210A7069287C5DC958D0953C36F84D9A26989DD3B726BE8B94B41DCBA1B5374123F55A6DBD6360698551C27D16BAAFBB0ECBE116B44F11425DA45D7FE8ABA91697D83B6896A06A7888C97A91406B81B3A5BC8B68A984750893114B4011B9C8BEBA6F5C2D7D9F2C7A27030555633A0F90E30753A04B1958141AF7C1B95BA208DA36F729673D20DA0A83F913BEC8049F8CD032D9F9DD94B2086C61643AB2CFFDDB2B9BE0AF996D642B7A0A31CE0EEC8C61B343ABA980FCDACE9CED7BE4C9048B356D41002EEE0433428846BA4220EFB7F493FF57B0C706282EEE448CF7DA9B17B32D0EB0016983175469AA5BBA53489EC56BA3A92A70FDA2390E3A5D8C038F496E7C3180C6971A39491EAC10D828D44B3DE2BE64569B907005783E62710B9AD8EB8C9AF4B04993D40D1EBF165EFDEC748FE9F6B334DA6A30C568BCBAD095998A47242CA16803FE1720FCAB85233AD76EBDE102A5D93AB98460494BC886BB04C05AE89E157967747F8C050B33CCA52ED5E59050965523EC5C4EAF94CF2F2EE80C35AEEDD14E65D937C92855D03FC76ABAAD57A21A42420819EBB9AEB65F031F9C4BA0AC2EA27289E941DB89669A0620797091AEA3EBFC2AC354E94D27894F444FF9E604C8BDF7D6C00DF0E7FE9827171010445E737D0A5867636E3488EAACCCFCBAC1030C0DFAB639AB45C5AC5435E2C5B8244E58C3A6BAC81EEA408020BFEC66EF55FDDC618083ED737F4DD3BB65474487CADDF3AA2720A6931FC69533B6491DFC7E6E5FABF8103D05F870BFEFDDEFA20822A68A710B517065BD2478CE080E5DEA09EFFBA3A136C1BC9D7D8088F736C363B30E2AF2A6F2395EA8161CB64079340FA642C7763E3BF0623C968A16263CDFDF1B8334E427955E20C1EBCE8C8CB136DA8D002D8A9E5DA3B1F56668C1C59E20DC3BE026A43F40910D3A2B601D9D3EA2BF6D2C2781F976BA840FC986C8AF0DF84B8B0FB291D1310039D6914F8F7CC6B26CC33AF94150253E8EB410344A64344A5A0C06E0F3AA23C68617C6F4659DF79285782C89BEA3091083A069EF8F048371CFA054DE45E32C19A44DB5D435BC8FEF5570B68D80D5BF5DC06DA13C36E3AEA341CA9FE20047AC30683AA9D862306534EC93E79EFF79FE22E3BA15E2BA3F59F7B8B9314DCE31095D3015710C2927B54BA6F46D3981975229EED16C9B17813801C7D3CB3604DE9B7A4F18C2F91B2B50C1F43E87198AFBAC718935DB9CB96D9FE048D969635CB9F4DCA659AB1612A698CE45336B8D9FF5468301BF05D04B3558D66E88DE88427FE87E65D36D3C29FA3FB126F1F294E9BB391EE427001C34126C6622905514CE153682754D7FB1C985AE4DA600AADA1593A0A214332B310620B1B4E95BCBFD6EB8A241CBE848BAB37462224994E0D2F3F4B521DCA4A9A5AB10BEE741C5919907AFD2552D4AA300ADDF67CEC2862420C8D1D8DFFF60FDBE2D4A8D03C92E23BDB3400F5390EE4B141C5843B1E2C07C9AFDBC70E3FC08E2840EBF3B0E5296E1EE44D12E68240FDF063C07BEBF01C08586E8153068C1ADC744A7B54F53B0FEC3C752DA9F6F989A1AFEA4ADF1AD6AE926CABE4E0CB2CD864412DAEE377DE559A38047F31E834A6CE56D4041BA709945F07E514F96D783F32B0EFCC8B889FAF2B6D217246BA7C07B687E028F23D2409BBC12D6EC0D94AD9697BAB6395B7070B6FEB2E907A119209C9B7D86AF953BA7D2EA63982BCD794A5BAC69407BB7CEC5E027833B17420F146AE08F4B753BEF6CA0922F3294CD2A670127F9D2A2CA78A30F62056A425CBB7074C9A55135BD06CE677ABDF33B420F66CFDBE9461BFDF385A97439B3431CD29DECD9B5E59EC3ADAAE879A4E8D5E28CA13E73FCDBA51C828DE271207A5DEAB373B1B6677A29ACB87CBB01F10CD2C090EE66D472E8DB61615A5ECB84A7FF0988DD0DF9831BF43D732A12EC8CD50A86ADD12A5A2EA765744B05F73725AB8704ECCB08BD74517F21054E58903481E7A724F7FF24C43D6CD23DE84CD69C9E464E67003903C3858A6724247EB929716E170E2D2739AAE10B88BC3FB8FFA849E385B4113E78C24DE1673FC7E7285E6E3744F3843AC7BE7EC16BF74215694CE467A2E859DD4FACAB86250FECE28E0A6A31DD529D08566A6389B85C310C28A8DABBCCA9CD6A631EF0473ABFD6846D8326561CC9CB8181C1593D0F15EFB8129AF9E838AF518477CE361640169D9731FC139881D452773F21A3E79E514DDAA513D7B9F3399C0C57D21EAA00D44A7F031B79CAC9FC304E936E75A0CF8D204A6CC3C0FA7D037DD8ACC3A33CF5718061FCD57EBD06A607FE0BB0204E687B2A17B1FF47DA357B51A753076CB89422098D4F880F831842957E648C54ADBFCC0E488A95581E709B5A5A129DA7EC5B00AC9B18B80533F2DD1BD0F475A61DB18FC0C4EA655F602B207B572234230C831B26CECB7BC3284797C4BED5A977C3BFBEAFEA3DBFC4257D4C2C5BB8689830EE157F3B5AA1EAC09CFCE0555880A074AEB86062A8ACE19ACDC1A25F8D0E454F50F119D12E707D103F3C1A502D4E358D563E53554395B5D386AD49363978AFBCA2F8B673A693ACEF70D1DB4CEAA8FA580160924D4F18119BE46C71E09FDEE45EFB14A74DB1C688E99E24CB6025E73A3E7F0F7EA9C485274D2B6CF9784CBE39E388F9CCF1E2E8DBFA6DB43355391A369DEF645F815424253ABD0B6DE9C0A0AF156D9A4EB7474A2E5937F008134DEBC9FC7E54812967FCF5BCE28FB5CD43F1AA240BA2E9CEDD6F350D556DB1658868091E6034D7E1EE5C6645D0A345D46C42E23C6821C360F5ACD13F589 +pk = 095F12674CC3D585AC0A6A94973082CDF14574E9431BC0032A987B076F26FEAEF983CEA1A40D15F48E2A41E45FDE000DD5A68F56CDEC72DE30A7903E0D2942015C3103DF230443C3FEC7905E0FA1DC687543C673D110071E83FDF14DDE030FF8CC1999261B5901770699E07E5DAD9D0E81B76C32C7E770DDE557D0E6869E8B0110 +sk = 095F12674CC3D585AC0A6A94973082CDF14574E9431BC0032A987B076F26FEAEF983CEA1A40D15F48E2A41E45FDE000DD5A68F56CDEC72DE30A7903E0D2942015C3103DF230443C3FEC7905E0FA1DC687543C673D110071E83FDF14DDE030FF8CC1999261B5901770699E07E5DAD9D0E81B76C32C7E770DDE557D0E6869E8B0110870E7E70C1FE5A25EFEAA17D7204154939B0A2018DC7D96DF60F1BA44A39FF615E01000000000000000000000000000000000000000000000000000000000000F8EEB9FD235CFE61FF2B2DF74C17CE447B81038719464C4F75D41B885BC61FDF9CFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8935E835C889BA517113AE204501F6DF197B664D34B1F5BA8C38785CE5953D9B9AFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005A4BC0A8245FE1588FEFD4D3CCF81C048975A73246B48CBD508266F9FF885935D37847C91FC45561756B9D8E4AA89D844AD03608E856DC5BC5F341BB9AF700733BEF7A56BF5D237C0F002D57DBAE77B1E6C394E9D5E03F8096B0A142A3CC0D890A8768E0BFFFAEEDB76EC214B958E7E9BC739D4424337C17A46384FCC9099DF29BEA5C69F8E38A364FD508D0ECABBCAF9EAB2ED1A4B1792F484CF2F6F1BC25AF8038B41961BC839F3301B8BBF888DFA31CB25516161A7DBE22F8AD3300B3B1B0591D3E05BC5F2CA925AD800B337A690689AE31B5943362DA5B169CBB981EB3A07CE6B82F0634CD10607832DC41612901003083D84DE1E788B7111605 +smlen = 2404 +sm = E31EC04ECBF766A665083AA4EE85244FCA1A6327EC2FD15B233B53711160BA3212263372CC9C0FB44DAFF7EAFA99EFB5D9DAF686280B3FDF86A0CD14D26D9A005A6015D5853E662007CAE175534A1CE7E221EAA71ABAEC2BA50696FF59045274011AD72F0C9086BAF20AA4ABC23B38573885975D77CCC40A05704434DAAAB1000100F4648D7CABC2571D0CAB3A3BCB0080253DF86559D7562BB897C445AFB7B2942C376960FFB85BAD76AB084B7689B3CA739EDC24B03298F3E8B43611D0EF288528898A9914ADAE73E4E6EF43C52C39195FB93ADE5D1B3E49CA01A8AEDDD632260E6E7DB77B0B8248DE08F141A13E8A7CD4DBCC3399F0844937998D35E0B6CBA31393FF08E10A9B2537F5EF1506863D18DE16D26F104BBBE5A568518C36C0137A0009092E086FA0C4582E0C6CCB020F86A6107475985160BED201760D6489CB05B8D21452C81BD5D317F8857703DABA24E968F3164C82A4A9751DD88742B72141734DC0B4A77CBE2AE1C287A396A2F5804519456CF1EAE273A5C6361F52C35EDCE5ED7388D61D01AC040676522C9FD7B02A7DEAFDCB4169867EFB69792210A7069287C5DC958D0953C36F84D9A26989DD3B726BE8B94B41DCBA1B5374123F55A6DBD6360698551C27D16BAAFBB0ECBE116B44F11425DA45D7FE8ABA91697D83B6896A06A7888C97A91406B81B3A5BC8B68A984750893114B4011B9C8BEBA6F5C2D7D9F2C7A27030555633A0F90E30753A04B1958141AF7C1B95BA208DA36F729673D20DA0A83F913BEC8049F8CD032D9F9DD94B2086C61643AB2CFFDDB2B9BE0AF996D642B7A0A31CE0EEC8C61B343ABA980FCDACE9CED7BE4C9048B356D41002EEE0433428846BA4220EFB7F493FF57B0C706282EEE448CF7DA9B17B32D0EB0016983175469AA5BBA53489EC56BA3A92A70FDA2390E3A5D8C038F496E7C3180C6971A39491EAC10D828D44B3DE2BE64569B907005783E62710B9AD8EB8C9AF4B04993D40D1EBF165EFDEC748FE9F6B334DA6A30C568BCBAD095998A47242CA16803FE1720FCAB85233AD76EBDE102A5D93AB98460494BC886BB04C05AE89E157967747F8C050B33CCA52ED5E59050965523EC5C4EAF94CF2F2EE80C35AEEDD14E65D937C92855D03FC76ABAAD57A21A42420819EBB9AEB65F031F9C4BA0AC2EA27289E941DB89669A0620797091AEA3EBFC2AC354E94D27894F444FF9E604C8BDF7D6C00DF0E7FE9827171010445E737D0A5867636E3488EAACCCFCBAC1030C0DFAB639AB45C5AC5435E2C5B8244E58C3A6BAC81EEA408020BFEC66EF55FDDC618083ED737F4DD3BB65474487CADDF3AA2720A6931FC69533B6491DFC7E6E5FABF8103D05F870BFEFDDEFA20822A68A710B517065BD2478CE080E5DEA09EFFBA3A136C1BC9D7D8088F736C363B30E2AF2A6F2395EA8161CB64079340FA642C7763E3BF0623C968A16263CDFDF1B8334E427955E20C1EBCE8C8CB136DA8D002D8A9E5DA3B1F56668C1C59E20DC3BE026A43F40910D3A2B601D9D3EA2BF6D2C2781F976BA840FC986C8AF0DF84B8B0FB291D1310039D6914F8F7CC6B26CC33AF94150253E8EB410344A64344A5A0C06E0F3AA23C68617C6F4659DF79285782C89BEA3091083A069EF8F048371CFA054DE45E32C19A44DB5D435BC8FEF5570B68D80D5BF5DC06DA13C36E3AEA341CA9FE20047AC30683AA9D862306534EC93E79EFF79FE22E3BA15E2BA3F59F7B8B9314DCE31095D3015710C2927B54BA6F46D3981975229EED16C9B17813801C7D3CB3604DE9B7A4F18C2F91B2B50C1F43E87198AFBAC718935DB9CB96D9FE048D969635CB9F4DCA659AB1612A698CE45336B8D9FF5468301BF05D04B3558D66E88DE88427FE87E65D36D3C29FA3FB126F1F294E9BB391EE427001C34126C6622905514CE153682754D7FB1C985AE4DA600AADA1593A0A214332B310620B1B4E95BCBFD6EB8A241CBE848BAB37462224994E0D2F3F4B521DCA4A9A5AB10BEE741C5919907AFD2552D4AA300ADDF67CEC2862420C8D1D8DFFF60FDBE2D4A8D03C92E23BDB3400F5390EE4B141C5843B1E2C07C9AFDBC70E3FC08E2840EBF3B0E5296E1EE44D12E68240FDF063C07BEBF01C08586E8153068C1ADC744A7B54F53B0FEC3C752DA9F6F989A1AFEA4ADF1AD6AE926CABE4E0CB2CD864412DAEE377DE559A38047F31E834A6CE56D4041BA709945F07E514F96D783F32B0EFCC8B889FAF2B6D217246BA7C07B687E028F23D2409BBC12D6EC0D94AD9697BAB6395B7070B6FEB2E907A119209C9B7D86AF953BA7D2EA63982BCD794A5BAC69407BB7CEC5E027833B17420F146AE08F4B753BEF6CA0922F3294CD2A670127F9D2A2CA78A30F62056A425CBB7074C9A55135BD06CE677ABDF33B420F66CFDBE9461BFDF385A97439B3431CD29DECD9B5E59EC3ADAAE879A4E8D5E28CA13E73FCDBA51C828DE271207A5DEAB373B1B6677A29ACB87CBB01F10CD2C090EE66D472E8DB61615A5ECB84A7FF0988DD0DF9831BF43D732A12EC8CD50A86ADD12A5A2EA765744B05F73725AB8704ECCB08BD74517F21054E58903481E7A724F7FF24C43D6CD23DE84CD69C9E464E67003903C3858A6724247EB929716E170E2D2739AAE10B88BC3FB8FFA849E385B4113E78C24DE1673FC7E7285E6E3744F3843AC7BE7EC16BF74215694CE467A2E859DD4FACAB86250FECE28E0A6A31DD529D08566A6389B85C310C28A8DABBCCA9CD6A631EF0473ABFD6846D8326561CC9CB8181C1593D0F15EFB8129AF9E838AF518477CE361640169D9731FC139881D452773F21A3E79E514DDAA513D7B9F3399C0C57D21EAA00D44A7F031B79CAC9FC304E936E75A0CF8D204A6CC3C0FA7D037DD8ACC3A33CF5718061FCD57EBD06A607FE0BB0204E687B2A17B1FF47DA357B51A753076CB89422098D4F880F831842957E648C54ADBFCC0E488A95581E709B5A5A129DA7EC5B00AC9B18B80533F2DD1BD0F475A61DB18FC0C4EA655F602B207B572234230C831B26CECB7BC3284797C4BED5A977C3BFBEAFEA3DBFC4257D4C2C5BB8689830EE157F3B5AA1EAC09CFCE0555880A074AEB86062A8ACE19ACDC1A25F8D0E454F50F119D12E707D103F3C1A502D4E358D563E53554395B5D386AD49363978AFBCA2F8B673A693ACEF70D1DB4CEAA8FA580160924D4F18119BE46C71E09FDEE45EFB14A74DB1C688E99E24CB6025E73A3E7F0F7EA9C485274D2B6CF9784CBE39E388F9CCF1E2E8DBFA6DB43355391A369DEF645F815424253ABD0B6DE9C0A0AF156D9A4EB7474A2E5937F008134DEBC9FC7E54812967FCF5BCE28FB5CD43F1AA240BA2E9CEDD6F350D556DB1658868091E6034D7E1EE5C6645D0A345D46C42E23C6821C360F5ACD13F589 + +count = 64 +seed = 5909111F333F3E939105DFF8532548927EBF289F31A72F4C1B0C66816D8B68F64622F36A9BC85E63601BEE8EE7CB3DC5 +mlen = 2145 +msg = 5180B7DE9A84F651DA10D334009B3D65582F3912D329FBAD4AE39A9EEC78943338C29DB4F49EF41E3C50DABBB530E99113440383F20D5A3A8AE279A6201A0C84B003F6717C709C21AE893B6E412D87F8E0CEE5A89E60A14CE975A4D42E4F43F4710FC9FA29E9B2AFA93441EF5570123AA88AFF009E2507A3E60A79CDA25652E3AC3AC0C10A816BC04739B6FC758FF9AC467879BB67F270E4EAB43F10A633E5932B8D6DCF23814DE8643407B17B5E2A91B340F7BF6882DB694DE4DEE4C480CE037B9F9A220ACDCE84B03746F307A6026531D712C0630E7DE3ADD3A8516BA602D2463E3478008B3252B658FEA54DE41265B5C81E4E913EA0E2A63309497ABF961EC40AC374ADC0FF3C6FAE9BFAC5CC2DF475885B0BC636702828489183CDE1A2934F2D63828AD1F2B8CFAFFA53151B0FFAE6224DF54C2AC47CC8844B76222C2A3B6E132071150049B6E46AA75DEA28C13477980315FB64CE500BF0C6F633AE621D65B331BA96CFAC162DD7897B8505257E228CB621BBA9176A7AFB3A2CC20D7804DDB3AAE4B87FFAFD3C8DC541D05624DB02BD62491067EC1CDF73147014FEBCFA5B561756D5E7A13B88D1E7B2C0375E1D0DE71ED20CA9CC4E6DACDC579F1AB024AAE2A0BEC9004E5DD81C046F00A2A4CB767C4EB240D205278CB863D1A61DEF16635C6A84C2406288410FA4B73B21077D8F7A4075A1DDCA3D0D334725151E434BDA80D3E73593338B07958D27337E32CDE0010DFE5E58B99EB27A97DBD1C5E6F9A552A02726AAD5A4AA63EDC336D83E5870DBD514193367AF2274804628B4EEDFDA3B2A155694E89F5A6798C5D6E036159C1F00D8DFB03D41940E775974B11C3FE4456E07B127CCB44E6FD6B2918F57A6523D7F77F32478D9F1BB539846793D4284E2907830E5EA76054802A266C85B122A389EAF4700629036716E2869C0FC9440856D562711E903A1853BC68582A95344B612E5CBC7C5B2AEE23CCE4161A75829B2048742FBD65ABFE2397CC7D66023DE34DF4F2DF8540CCE9781ED6482D29CA4E906716C8CC9596B158EB51BAB8C2E00253D6589A99B3D20FB494834B42BBFFB80E7B0441E356B541F83877736985F6330EA459C007CE8BF18D84E78E36482D581DC7DF97528CE15F68E604B4DE62422B3AA76F3E7E5B33A49CBA9D89FCF50DEB65EE45173795393A50FD4C60CF6BECBA7E733513537D13F89FCF1C4D6437DE0EAE608FB11D68B9ADC0C3A19A3565F6D62BA81A326EC334B239B212B87320C03A75C58DC8F828C4195ED9D7ACDDCE493123E235D098E9DC60F5D3A625E1FF66F245E9977F9630A40D26E3AFB6676F5122A88CE5507BD825757D9CCD53FE574FD0E6E728DA355403AD664FFDEAAF636256FADC3283D6F15B297F79216833CF2C745C4C5E17D03260A69178F2216168BF8F00C9889E1E35540254F150C587A884CDFC9E5F7D379BE474356C06943E416EB0697A1AE989AB4872D0BDF436D9FFAAFEC1631C9939FCECB84DB2846F12CA395F506687B4A5638085BC6EF58FE8E2ABE9F8D51F272EE855E2DB84A89D348DD66950B8F43939DB897C519FA302594FD1FBD6B6E94CA8FF63A7949432DC2D35C60803A570B1DAC95EE0A60C62FD18B3319601AD29A156400D392DC9A14FF50AF6752C1F6EDC2ACB7ECCA71097B6E82227DE429F1A29C5E38ABEA1C74DE06E6788CB1790AE9F0E8AB35AFE60B001F45971D42949263AA62519B0D630281A4C5788D5591B1EF5A003C58987E8665701E5B1C6063F93533094E96820F918C354903775CEB6675C4CE9CF940C4BEB8845B4F5E1F642BF505821E5A23122E2D1ADB82A63AD18CD1E4775A96CA9EF9493D75FF784A2D4A99F54DC3F87828BDFF4B3A3D98FA5A29B62A85CAAFFBACE4592A81BFAA5B8BAE6606AD25A92A43140690A6003AA2D617FC707A53EC9D868E33596E098773942D798263F58FE5A1B23046CFA136EA35203B90BEA2C5F0AAEB5EA8C24B8B8CBA14CDEE28F45D0278F193228484BCC7E08A75D0064D605D674ACA9019A0A9AAECD6AC672CB8410FEE4192E6DCA7855FBB1C584CF288BACB40707D7E6F8BA2956F6D099F52BC7B0AD72B5A3FFC03C7B47086330244EA5D393C6B9F256FD82D5CB9436A469ACC3F8FC237146895BE148749F82D39B7BA4CE47715BB393A96AB471665529AB9E9958B12396C1BA7529DBF289184FF0F635C2BA9DF301036C869D52D993463222B70BA778E81C8DC668DE41C0356EEF5C39F1BD42398BFF30F959E115C6B386E73F0FE28A2665BD463C781DA1C46D6D4EA284B152C8C12426DC9CC467809BFDA6FBFBC0BB4793BABBF6AD564D57AE9F5E2B7F651D6ED980F8B1174A126CC58B23C32BA73F5031B3FCABFE7BC360AAE412D799CC14D8B252D9F9EC9005B7FCA04A88CC8AE9F7AEFCA94137003D5764FAA3C7C45670585C84F74C4EBD1F5AD1F97EA093595592FB90E3CAB01F98F06E114F13DE67CDC36F3FFB01C3D51EA643C25A3F6AA2C57690E42B98583D925AC7B06A349782A1D33C06BD05A82A7AA3DD679326D948D74A1861926B45DB78D36070D3087AA9C5F4F42CA57EE9CE7035BD88A85CE1107C8E07E5BA3A62ECF012BC75FBF97C4C72331B55AB9A6EFFD78869F1CD3F330526F262F7DFCFA2B084B61E90772D5FCE8F038C0F72554467192CC8A27F1F53C8714DA1864815974B00991F466648478C5F9BF036DC4083D72E8D144AB10FD32408DA7677729347FEBC79E48E7B87388D9B59AEFC84B5B3B589FD91863811A6436ED76B43E657F7EE03EB796285A4D93BE9AAAD1E1A1E81687E42EC83F3DD059B78BB7F8EC70E6C831DB5E90C6B3AA511F36507DBC8E7A77DF0F5B9EF03BFEFE9471DE7C7FBE67B9922260D3703D95A5BFCBCB62D830E20C23C6CFDDC210E47CB575957D8C3514A2ED4561C738928F210057896EAEB1499D4DDC70F44E30661E780AAF5C0A20C8553F40D7D3FF6D120511C1073510D04F2DE544121AB851E98F666906367C21302EEFB1AAA723F6A531C454EEA0BE7D50 +pk = 66E055A31E7BACA431BEB5E53DB7F833BF46EBC24EEA56D4A812EB7E89DCEB60BA3229B20A52676FCBA2F228C16B1D45C11C3167385938226155CAAD54BE7301A5EB1A0CB8366BBCFB435DA9AF5684D22319940CDB55A85CE21C9CED8C34D9D5A9C344BDE439C1C90D1B98C76A3958CF14E4CB418858C6FBDB56D8F7744DE80009 +sk = 66E055A31E7BACA431BEB5E53DB7F833BF46EBC24EEA56D4A812EB7E89DCEB60BA3229B20A52676FCBA2F228C16B1D45C11C3167385938226155CAAD54BE7301A5EB1A0CB8366BBCFB435DA9AF5684D22319940CDB55A85CE21C9CED8C34D9D5A9C344BDE439C1C90D1B98C76A3958CF14E4CB418858C6FBDB56D8F7744DE80009074B60545CAAA92CB379E43C0DFAFCEF786384710770B88BD89CA396168C80F54200000000000000000000000000000000000000000000000000000000000000A68A55ED7B6A3CA2AF3251E48D869032F6D3A6E4E7CBBB64D3369BB12318D6F6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D9B685D3A5929D5D3FACB33661F0F1DC6364EFBA4DC9B901B510209C1C92F67B3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A92782EFA7FD1D04D04908386FC7571C14B0EA6AE14E9C871B43FAA36AA4307CFFE45D77A14C799D25C73151333F31D380FDF15A168DD939F70BBBCC05D50655E07163EB8EED71891F6AF3C4BB333F842E9FEC5FADA7CFE0540AE47AFE99F3AC9B15F054C252594DC329C8C6336BEA466AB2E4161C157768B25A9DDC600C1EA4A64A716E183433E9C58A3196869FFA9F8E7A7B0B97CA64FC1E6171A67DC17B91EE7295DA7B4E96FA02F99B2B013A375150E4A1D2BA798F68B7151D7A0A41826CEC3AB905FF9AEA869739831F69268881A12FB9BEA188880162183E81AE406426947F908925C0E919596599214490357D7B3DA4CFFE4335AAB60F520A +smlen = 2437 +sm = 310EE6336DC393BE7039DC6412AA5C069EB2DDF768C65EEC9B0EFA0BC121D00DE2E57FE453C9AD09B77AA3E2415FE6A9FD329D18152B78C7D9E6E4EE7B588501D62FE8B4B74449A9C15A5519034581542BBC9955EECF266F434B7908F96466D1EB9097F3B818129627297AE96280EBB6A10D9BD30DDE588A9B6F6222F6CCDB000001084A093170E3E46227291D8356C5C0BC7980EB764D41A163A33B0844993CCE7D3F745B18FD428ABCF0C637BDAAFB63DE52D0B3D5E0400C2CB0F9A15846F53F1A4282DA0C1EA8DD14E07629F437156CE7FDAE2BBA65862D3B441FB78518E32564423CD73329DC0CFB9EC61C7CC0327B9FCE2595C1F974191EB91CF6A49B25EA67C5BD1F5F21CA1968447481A416E696A0583C8A3820624A9E2BF5B2D5E06D6D000B025180B7DE9A84F651DA10D334009B3D65582F3912D329FBAD4AE39A9EEC78943338C29DB4F49EF41E3C50DABBB530E99113440383F20D5A3A8AE279A6201A0C84B003F6717C709C21AE893B6E412D87F8E0CEE5A89E60A14CE975A4D42E4F43F4710FC9FA29E9B2AFA93441EF5570123AA88AFF009E2507A3E60A79CDA25652E3AC3AC0C10A816BC04739B6FC758FF9AC467879BB67F270E4EAB43F10A633E5932B8D6DCF23814DE8643407B17B5E2A91B340F7BF6882DB694DE4DEE4C480CE037B9F9A220ACDCE84B03746F307A6026531D712C0630E7DE3ADD3A8516BA602D2463E3478008B3252B658FEA54DE41265B5C81E4E913EA0E2A63309497ABF961EC40AC374ADC0FF3C6FAE9BFAC5CC2DF475885B0BC636702828489183CDE1A2934F2D63828AD1F2B8CFAFFA53151B0FFAE6224DF54C2AC47CC8844B76222C2A3B6E132071150049B6E46AA75DEA28C13477980315FB64CE500BF0C6F633AE621D65B331BA96CFAC162DD7897B8505257E228CB621BBA9176A7AFB3A2CC20D7804DDB3AAE4B87FFAFD3C8DC541D05624DB02BD62491067EC1CDF73147014FEBCFA5B561756D5E7A13B88D1E7B2C0375E1D0DE71ED20CA9CC4E6DACDC579F1AB024AAE2A0BEC9004E5DD81C046F00A2A4CB767C4EB240D205278CB863D1A61DEF16635C6A84C2406288410FA4B73B21077D8F7A4075A1DDCA3D0D334725151E434BDA80D3E73593338B07958D27337E32CDE0010DFE5E58B99EB27A97DBD1C5E6F9A552A02726AAD5A4AA63EDC336D83E5870DBD514193367AF2274804628B4EEDFDA3B2A155694E89F5A6798C5D6E036159C1F00D8DFB03D41940E775974B11C3FE4456E07B127CCB44E6FD6B2918F57A6523D7F77F32478D9F1BB539846793D4284E2907830E5EA76054802A266C85B122A389EAF4700629036716E2869C0FC9440856D562711E903A1853BC68582A95344B612E5CBC7C5B2AEE23CCE4161A75829B2048742FBD65ABFE2397CC7D66023DE34DF4F2DF8540CCE9781ED6482D29CA4E906716C8CC9596B158EB51BAB8C2E00253D6589A99B3D20FB494834B42BBFFB80E7B0441E356B541F83877736985F6330EA459C007CE8BF18D84E78E36482D581DC7DF97528CE15F68E604B4DE62422B3AA76F3E7E5B33A49CBA9D89FCF50DEB65EE45173795393A50FD4C60CF6BECBA7E733513537D13F89FCF1C4D6437DE0EAE608FB11D68B9ADC0C3A19A3565F6D62BA81A326EC334B239B212B87320C03A75C58DC8F828C4195ED9D7ACDDCE493123E235D098E9DC60F5D3A625E1FF66F245E9977F9630A40D26E3AFB6676F5122A88CE5507BD825757D9CCD53FE574FD0E6E728DA355403AD664FFDEAAF636256FADC3283D6F15B297F79216833CF2C745C4C5E17D03260A69178F2216168BF8F00C9889E1E35540254F150C587A884CDFC9E5F7D379BE474356C06943E416EB0697A1AE989AB4872D0BDF436D9FFAAFEC1631C9939FCECB84DB2846F12CA395F506687B4A5638085BC6EF58FE8E2ABE9F8D51F272EE855E2DB84A89D348DD66950B8F43939DB897C519FA302594FD1FBD6B6E94CA8FF63A7949432DC2D35C60803A570B1DAC95EE0A60C62FD18B3319601AD29A156400D392DC9A14FF50AF6752C1F6EDC2ACB7ECCA71097B6E82227DE429F1A29C5E38ABEA1C74DE06E6788CB1790AE9F0E8AB35AFE60B001F45971D42949263AA62519B0D630281A4C5788D5591B1EF5A003C58987E8665701E5B1C6063F93533094E96820F918C354903775CEB6675C4CE9CF940C4BEB8845B4F5E1F642BF505821E5A23122E2D1ADB82A63AD18CD1E4775A96CA9EF9493D75FF784A2D4A99F54DC3F87828BDFF4B3A3D98FA5A29B62A85CAAFFBACE4592A81BFAA5B8BAE6606AD25A92A43140690A6003AA2D617FC707A53EC9D868E33596E098773942D798263F58FE5A1B23046CFA136EA35203B90BEA2C5F0AAEB5EA8C24B8B8CBA14CDEE28F45D0278F193228484BCC7E08A75D0064D605D674ACA9019A0A9AAECD6AC672CB8410FEE4192E6DCA7855FBB1C584CF288BACB40707D7E6F8BA2956F6D099F52BC7B0AD72B5A3FFC03C7B47086330244EA5D393C6B9F256FD82D5CB9436A469ACC3F8FC237146895BE148749F82D39B7BA4CE47715BB393A96AB471665529AB9E9958B12396C1BA7529DBF289184FF0F635C2BA9DF301036C869D52D993463222B70BA778E81C8DC668DE41C0356EEF5C39F1BD42398BFF30F959E115C6B386E73F0FE28A2665BD463C781DA1C46D6D4EA284B152C8C12426DC9CC467809BFDA6FBFBC0BB4793BABBF6AD564D57AE9F5E2B7F651D6ED980F8B1174A126CC58B23C32BA73F5031B3FCABFE7BC360AAE412D799CC14D8B252D9F9EC9005B7FCA04A88CC8AE9F7AEFCA94137003D5764FAA3C7C45670585C84F74C4EBD1F5AD1F97EA093595592FB90E3CAB01F98F06E114F13DE67CDC36F3FFB01C3D51EA643C25A3F6AA2C57690E42B98583D925AC7B06A349782A1D33C06BD05A82A7AA3DD679326D948D74A1861926B45DB78D36070D3087AA9C5F4F42CA57EE9CE7035BD88A85CE1107C8E07E5BA3A62ECF012BC75FBF97C4C72331B55AB9A6EFFD78869F1CD3F330526F262F7DFCFA2B084B61E90772D5FCE8F038C0F72554467192CC8A27F1F53C8714DA1864815974B00991F466648478C5F9BF036DC4083D72E8D144AB10FD32408DA7677729347FEBC79E48E7B87388D9B59AEFC84B5B3B589FD91863811A6436ED76B43E657F7EE03EB796285A4D93BE9AAAD1E1A1E81687E42EC83F3DD059B78BB7F8EC70E6C831DB5E90C6B3AA511F36507DBC8E7A77DF0F5B9EF03BFEFE9471DE7C7FBE67B9922260D3703D95A5BFCBCB62D830E20C23C6CFDDC210E47CB575957D8C3514A2ED4561C738928F210057896EAEB1499D4DDC70F44E30661E780AAF5C0A20C8553F40D7D3FF6D120511C1073510D04F2DE544121AB851E98F666906367C21302EEFB1AAA723F6A531C454EEA0BE7D50 + +count = 65 +seed = 238461A224ABEECCF709AB6CACF4EDD372D45E5F4274095273A49AFE614F2BF713134ABF68B4DD058E6D7B612C3658C3 +mlen = 2178 +msg = 99B5B6FECDB52897A1958C5C3D1FC2F20B7D045F551856EA3CB441BAD9089C64CB9489DB6B63E0655AFC4C2FA73C7417FF1B80B9C7A1D659687D2C415B3A909CA30E96849D4BCEC6A9A6A4311204936BA972086B2394D86E840770D01550CAA6AD85ADC0EC851D2B3808E4A0E9830B99A70F6204ED4DBCB6759F6228126039607AD7ED8EAFEEA28D1C3E25A46BC18AF7E01F55FAD8244F15DE36F890416AA09548554338972C5F88FD9357792819E51A63D0B872B0A4D21EA3597405B52793D50C6CD70B52841D53484BCD3EAD004CEF0A6BC16CE74CB8AD0848000D8C5158DC16625112D1D85D17A3C1C8BBDAEA42C3A43E9930724655592116C4C6D0B8B223337EE4E754541A09D898F7FED71C3785B7F8721653986C525BC00F15590616437D11F9722824DFDE7E9615F1FB8488E5327E4D8BAF5F79D1FF5E808D154951AD87638910607B03FAAC3A61FE9916BA65FFD16986DEB4169BD24A72B1C8168FE569F3C81F93F3EBDD21D4E806F79FB28550912E9AFFFB52E97860C4DC0D042C56E1BB71C28B68E416874EC7043306A29BD1F4B9A3E612A6778315E2C2B850D6EAB9FF1905030FADA250CAF308735393C191134F3C493D00B5695775D82ADB9F2ABDAD17FC41FBD7A1DEFE337C2F8ADF69154CC0862FBD43035295B1A9C80B88FA8CF75B36CA08868F881966B41FB3E239EB1DB9CB51606A0A9EBCD552B2F4E819E2C30ABDECCDDE88D2D2F82F3585B5143943C929591D20CEF559CD2BAF2DC7FE03C9E4E084E8890FCE64A4AA9F13D5EB945AD7E3CC53E01FCDC192B97ADC1F98D9E773A0177E8D97405808EBF48BF17B689BFC15F4C515E38A855A9266230C9085ADC9A6DDAED93D80C3F38BC516695D202B4E89DA5B4EBC43788C848F8C4A72F79F37F857EDC105F13E4ECECFD09302711BC1993F5308B8F32AB96FB8EC3F5EA0531DAFD0AB3451F81F47E62C593C8D3E3BEEE79DB06909576BF876145856F5F716CAA436C98EAB28C5B85BC2E4D7E1653ECBB8BB6B5BD6981DC72D7F63BA06CAC8197ECCDC72C1481DB44724A3C21F7FC60661F11FDDE8122DA5D0B1D72A29952618B373423A892875E6AD24D0916109ED8E9A9A8D9A68ACEC4BB5EEB0D00EAEA72D8D5A76C2A42F18CBDB3D336B71C70AC73D39D7EB04533453779A1F210BB4FC056B4728AFDFCF46675C6AC76F750626D642E3AB117E5D6740154759A46C27D51306587650E1039054B876849882E7DFD807BD03E69021E337DD69D9B097722C6D2AEB517D773D2F7D84D69DABE1A1D6422EA1766C0FE7B8DD4D7283F2985D96D91A132B8BA03AD85F7D56095773222D0AFDC5A192D29F3BB0C2539A1C99DB4E711B6ACE3FEBD58E45E99C9F5A04CECBB309D50397F28C48BB9CC9F9CF75A52253B634EC47216A1FD6358AF26501821864569879BE1736B0AD242AB5B8ED16A7EA0989ED4CAE3567AFE1F8209A028DB46DB0270B3BC06668A9BF5E1BC1061BABBA00EC4EC37280379139D19BC6072CC6B7D260A816CB82F9BC90897BE3025475AF12191690F9F400A914789A860155EFD2D606A15895378C827F2A4FF700303962FD96DB2DCD2D213EEBB2460F0B753BC6902DA81D44C983DD027F1171D40A2039997241E09AE5B6165B4D55A8E4C79671A8B8BDEFEF2C21F81C541A5719DEB939F866B61BE250AF371CEA7B7525094C904698D412737F7781BD779365F122EE627D9CD4A68DA9D5BE1B0431998AACF824CDD864C7365C01CD5A5F480B6AC1E5FEAD8FFE40D87C1F9FCE81867157242285C5E76CF9667919C29A67CA0C0A61D7819D9EE6B792250A358F5691CCD80578F15288F3D5D6D7DD6DFA351FCF8DF0223F7D1DA1B76711FBE0E7FABD30377660ACE7B23ACF03ABC1D973248CDD0897773FB74E20481EBD3E52657C9296B980905AD29271EC128513284F1B78F38634BF84CB80791A0C5649177791CDAB87769D57B626F78A03435C758A207F52BD2A1F31E34B6A122B8701CD9FE478C57CF3535B6D51EB46CAF794BD69363D5A56ADDE6945E9788F1E1DFD045BFBD0A68834B13D6B9EC4EA9C860EEA0E9AC19C2DE14FFBD6B57E5992B08943EA0283813F3F15E4F928B8D0F13DE6863990F5C77F130C97D8BE12571EDCEC7DEEC4B6EF4835F136DA45DA70A11F9192478FD8B4846C507410FD11668365B05252E68CB2C972ACF50156E369B83BB85E62E4BD4D84C2E9FF41A5844D5D88AAAE7DED852DAA0AE5C14A5DCE64C7E236E9B7B60F5B5AD4D953A2D842A52929491BE3555AB8DF534CAD56DBBB86B28A8A86B7BD9AD1C58C87B8A089324E00FDE32F8186B2B74523A22904C18ADE02C3E965F94624F8DF57E750EA6335E3EBA705294B76CD6ADA33D90FEC1F48DE7BA9DC7D8D60A53D2563964188874810C45736C57EFBC3A3CEEE7238AEE5281882A554F2143BDF89ED4BD819C08239C187C12A8B6E763434B92C26FDD658B350F51775C60CBAB7A2CB120DB8CE8AE9AAF6AF559F8CADE84C4820209CBD27CC09230B22F013A0E4CF8041E4A789A5D20BE9914A624AB957318848ADDB39C9748C8922C54327048A2E46523BFB22487538363459035BA49858F85A469957DF1F4831BB7FFA0564C53233B99B596F5356089949306DEDD6B904433D25C4854A80590B964DF6B0703B4F9628D6B9A4D3F0A4096E9A0B46D6B32F66D563BAF688ADD18DE001DA62E33C503A4387CE0920BA5D1E8B69C38E3745B19F8D8B6CA5E1AC6DE90EDB25FC32DF04F0849D769FBED3F8169EA1D2252619A2304E055370B4443CD23E56D4934F9F3FC92F1C1EEC626657E6A89C1394E56061AF8ECE3E2A17FBAAA4D579A99A7998632A6AE2683DDFFFFD27A27C8815511855F09ADFF7BC627A7A5C95FE57FA3EF81F494FA7EA6E6CA2D14775A25BEAF1B5A3E35ECD4A306545D597E4E44301C3D1648F0A7D841F2F76FE59C6EAFA3F5B58907FC4E642ECD28D16A71EE3D295F1DE12DE1485B9CEBEB2CC6C9AC051D3D42B6A1A068533A7680A98D015B09C5B819FFC61688D441C1B7FD71180C4423E64EE940917C7DFAA19F3F51CB5B38D1B2B7C81D10E7C +pk = 1C38CA6A0795EF722E627ADEC106D37DF4EC9F17A59746FC1E6BA1FC1F8630BD6BCCBBB9790C02E1A1C2ED6714A93FBBFF0C1F7277F1FF3952581D88205EA0015886663D206A7BC59BA30610C485E6CFEF8C61EBC679FF3D42C3FF52AA81957787DEEA988E8A4832B19E018B97A82A7D4141D7692073CAA20F8863CBBA061B0109 +sk = 1C38CA6A0795EF722E627ADEC106D37DF4EC9F17A59746FC1E6BA1FC1F8630BD6BCCBBB9790C02E1A1C2ED6714A93FBBFF0C1F7277F1FF3952581D88205EA0015886663D206A7BC59BA30610C485E6CFEF8C61EBC679FF3D42C3FF52AA81957787DEEA988E8A4832B19E018B97A82A7D4141D7692073CAA20F8863CBBA061B01097329BC25EFE6C13B4F465A49D6F316B2662EB9AB38B9F192D1637DC890B750FE9D0000000000000000000000000000000000000000000000000000000000000054A89636F9AA49EAC2A023A4AC1C156F8352704BC7E11AE11CF0E06DAC63B1490AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA14BEFC81BE9EA8AD99C984A7CDC5DAAF435826B9FC3F825D374A7F941E5656137FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000876E4C97EEE52A1FA7FD7EDF05EFCABFCD6BB50C36FE89025E1142998F0E5EE97BCD2FA6C0DF630780FC88A77342F1F7949ABF6A38683C1FCF4FE11B1723062E8E76239E9519194EAD80FF900AD4D7AD84BF9377FEF4DEAF7AC3653A79696D9C24FBDF1B0BD777CADF208B594D75872AFA51A6A9E45413F84251C6A94A0EB2799A02D470BD5D051141FDA79EE81508D0A45D5C545BC55F29C37EA0C3931D8754010C5EF6D473BDAE33746A9886145E123ACE00FF29C4F0060AA11DDA0D99A0241CF3BF346B6BB0C665D8B6D4261E69EA37D47131C7628925848AAA630631F51AA486EA01B7E40239CC65FADB0D43203B04DAECC9FF372F641E6A7A0B +smlen = 2470 +sm = 785D0D3C46C0261D87800E2700E7C61AB3F9896EE736DDDE2A1CA19C7DD5361D6AA3C36078E7F30870D1566A794E98C1C3EB6088456F2526FA83C7A05D518801218CD511B37F82BB093A9FDABE09BA223C9F69EE8A42E61BD0B3ADF71FB9260BDB111C89C521C59E8C5DA6F1620B7871FD18213CB998AC1E7680793C5F129800010014F56F4D9EE235A7B3EB96293F399CD9AA73FBBE5E4DF48713A831E99EA4F010375181E5F7C6CD1D07848433306C58BE9D78C435E8D7DCF7283161AD781948355363A541AC0535C4779762770867FA1E97A9231103452846F069898AF9BD551C011FFD21A0743CCD09BD1EC8CD551DCA4525295201AE4E8941DF9475C7152C0FDF77F271FECFC808CC1102748F36DC04BC570DB92DD5518E598C63DAC9AF5900130499B5B6FECDB52897A1958C5C3D1FC2F20B7D045F551856EA3CB441BAD9089C64CB9489DB6B63E0655AFC4C2FA73C7417FF1B80B9C7A1D659687D2C415B3A909CA30E96849D4BCEC6A9A6A4311204936BA972086B2394D86E840770D01550CAA6AD85ADC0EC851D2B3808E4A0E9830B99A70F6204ED4DBCB6759F6228126039607AD7ED8EAFEEA28D1C3E25A46BC18AF7E01F55FAD8244F15DE36F890416AA09548554338972C5F88FD9357792819E51A63D0B872B0A4D21EA3597405B52793D50C6CD70B52841D53484BCD3EAD004CEF0A6BC16CE74CB8AD0848000D8C5158DC16625112D1D85D17A3C1C8BBDAEA42C3A43E9930724655592116C4C6D0B8B223337EE4E754541A09D898F7FED71C3785B7F8721653986C525BC00F15590616437D11F9722824DFDE7E9615F1FB8488E5327E4D8BAF5F79D1FF5E808D154951AD87638910607B03FAAC3A61FE9916BA65FFD16986DEB4169BD24A72B1C8168FE569F3C81F93F3EBDD21D4E806F79FB28550912E9AFFFB52E97860C4DC0D042C56E1BB71C28B68E416874EC7043306A29BD1F4B9A3E612A6778315E2C2B850D6EAB9FF1905030FADA250CAF308735393C191134F3C493D00B5695775D82ADB9F2ABDAD17FC41FBD7A1DEFE337C2F8ADF69154CC0862FBD43035295B1A9C80B88FA8CF75B36CA08868F881966B41FB3E239EB1DB9CB51606A0A9EBCD552B2F4E819E2C30ABDECCDDE88D2D2F82F3585B5143943C929591D20CEF559CD2BAF2DC7FE03C9E4E084E8890FCE64A4AA9F13D5EB945AD7E3CC53E01FCDC192B97ADC1F98D9E773A0177E8D97405808EBF48BF17B689BFC15F4C515E38A855A9266230C9085ADC9A6DDAED93D80C3F38BC516695D202B4E89DA5B4EBC43788C848F8C4A72F79F37F857EDC105F13E4ECECFD09302711BC1993F5308B8F32AB96FB8EC3F5EA0531DAFD0AB3451F81F47E62C593C8D3E3BEEE79DB06909576BF876145856F5F716CAA436C98EAB28C5B85BC2E4D7E1653ECBB8BB6B5BD6981DC72D7F63BA06CAC8197ECCDC72C1481DB44724A3C21F7FC60661F11FDDE8122DA5D0B1D72A29952618B373423A892875E6AD24D0916109ED8E9A9A8D9A68ACEC4BB5EEB0D00EAEA72D8D5A76C2A42F18CBDB3D336B71C70AC73D39D7EB04533453779A1F210BB4FC056B4728AFDFCF46675C6AC76F750626D642E3AB117E5D6740154759A46C27D51306587650E1039054B876849882E7DFD807BD03E69021E337DD69D9B097722C6D2AEB517D773D2F7D84D69DABE1A1D6422EA1766C0FE7B8DD4D7283F2985D96D91A132B8BA03AD85F7D56095773222D0AFDC5A192D29F3BB0C2539A1C99DB4E711B6ACE3FEBD58E45E99C9F5A04CECBB309D50397F28C48BB9CC9F9CF75A52253B634EC47216A1FD6358AF26501821864569879BE1736B0AD242AB5B8ED16A7EA0989ED4CAE3567AFE1F8209A028DB46DB0270B3BC06668A9BF5E1BC1061BABBA00EC4EC37280379139D19BC6072CC6B7D260A816CB82F9BC90897BE3025475AF12191690F9F400A914789A860155EFD2D606A15895378C827F2A4FF700303962FD96DB2DCD2D213EEBB2460F0B753BC6902DA81D44C983DD027F1171D40A2039997241E09AE5B6165B4D55A8E4C79671A8B8BDEFEF2C21F81C541A5719DEB939F866B61BE250AF371CEA7B7525094C904698D412737F7781BD779365F122EE627D9CD4A68DA9D5BE1B0431998AACF824CDD864C7365C01CD5A5F480B6AC1E5FEAD8FFE40D87C1F9FCE81867157242285C5E76CF9667919C29A67CA0C0A61D7819D9EE6B792250A358F5691CCD80578F15288F3D5D6D7DD6DFA351FCF8DF0223F7D1DA1B76711FBE0E7FABD30377660ACE7B23ACF03ABC1D973248CDD0897773FB74E20481EBD3E52657C9296B980905AD29271EC128513284F1B78F38634BF84CB80791A0C5649177791CDAB87769D57B626F78A03435C758A207F52BD2A1F31E34B6A122B8701CD9FE478C57CF3535B6D51EB46CAF794BD69363D5A56ADDE6945E9788F1E1DFD045BFBD0A68834B13D6B9EC4EA9C860EEA0E9AC19C2DE14FFBD6B57E5992B08943EA0283813F3F15E4F928B8D0F13DE6863990F5C77F130C97D8BE12571EDCEC7DEEC4B6EF4835F136DA45DA70A11F9192478FD8B4846C507410FD11668365B05252E68CB2C972ACF50156E369B83BB85E62E4BD4D84C2E9FF41A5844D5D88AAAE7DED852DAA0AE5C14A5DCE64C7E236E9B7B60F5B5AD4D953A2D842A52929491BE3555AB8DF534CAD56DBBB86B28A8A86B7BD9AD1C58C87B8A089324E00FDE32F8186B2B74523A22904C18ADE02C3E965F94624F8DF57E750EA6335E3EBA705294B76CD6ADA33D90FEC1F48DE7BA9DC7D8D60A53D2563964188874810C45736C57EFBC3A3CEEE7238AEE5281882A554F2143BDF89ED4BD819C08239C187C12A8B6E763434B92C26FDD658B350F51775C60CBAB7A2CB120DB8CE8AE9AAF6AF559F8CADE84C4820209CBD27CC09230B22F013A0E4CF8041E4A789A5D20BE9914A624AB957318848ADDB39C9748C8922C54327048A2E46523BFB22487538363459035BA49858F85A469957DF1F4831BB7FFA0564C53233B99B596F5356089949306DEDD6B904433D25C4854A80590B964DF6B0703B4F9628D6B9A4D3F0A4096E9A0B46D6B32F66D563BAF688ADD18DE001DA62E33C503A4387CE0920BA5D1E8B69C38E3745B19F8D8B6CA5E1AC6DE90EDB25FC32DF04F0849D769FBED3F8169EA1D2252619A2304E055370B4443CD23E56D4934F9F3FC92F1C1EEC626657E6A89C1394E56061AF8ECE3E2A17FBAAA4D579A99A7998632A6AE2683DDFFFFD27A27C8815511855F09ADFF7BC627A7A5C95FE57FA3EF81F494FA7EA6E6CA2D14775A25BEAF1B5A3E35ECD4A306545D597E4E44301C3D1648F0A7D841F2F76FE59C6EAFA3F5B58907FC4E642ECD28D16A71EE3D295F1DE12DE1485B9CEBEB2CC6C9AC051D3D42B6A1A068533A7680A98D015B09C5B819FFC61688D441C1B7FD71180C4423E64EE940917C7DFAA19F3F51CB5B38D1B2B7C81D10E7C + +count = 66 +seed = 83C653708FAF3E5F6FBC9DFBE6FB5E83E572A7688645D75D2C4835B28695DEA4BD7093740D0FF43237354EAD1C978BC2 +mlen = 2211 +msg = E3B57B208352A820F622A694B7C3F6F297239EF0A069615DC664C02F1822BBA48E11E37BD9749C98FACEFFFB0FE1792A386BE10CA7B98CC874C68C36F5096D3718DC93E0734D6D6F913E3B958DC1FD1424818C9437B0FD59728ED46A79FB52C737A1D1D26F04EBAC279A7FF6A971E2B69576B712D9224EA18FB9BF4E613A8935F3B36A073B01F37BDC0B77981C8F2804E93C395419352B85C8A32DD77D41DA9BF3ECB914173E80DD1FC06E8FF5BF0E4F7424849A15EB7FAF7DE77456EBB64D10DC10FEC6254070C7DF387397137372EA3A53DFDA7DA13414AF2DF16C1E38C5C70A5F5F44F725D622049256BB15DC04A8D846A1A0DAE7E765A7F00C498F1D0B2893B8405BE4A43FB7E97881069A49134A2A847184B82EB5A690D87BAF2F579619EE19A3D7A7C7EEA72D6E3FCCF0A8092BB8D3C6B551F27E63E762A30B4A4DF2DBC4D119139AE1B135D06FF827846901577700935E0011B65461C2EF9A7B71EEA33C8CA4519C7BCFB557C5E1D42D9243F2DC34057F5E0CCB9A457FC34DCB10D9B47F6EC3B9550D3AE4FD593DFA3E28C6CCA1FF1EBC9D98DA8DB869F8C80BDBF8AD4684ACB6A779CA9D0A106F26DA17043773862681C5DD2DEB1BCA2CA48D4FBB4BB7C1F765DCA3A1D991D890B9A8751CEAFF543997FAE5B128AB2EF22B3BE94499DFD9D8E78FB4C82CA8D296B0415E84CA8B5F2024455B5DECC8B4CCDC7BC4EE06B4F0C66E6748FBD07E3A3BC5B4B6889C40DC4A97AE3EB43C3914DEF976EFE3BFD84A093BD69102D7B37C89B458A55B98A1974A13A7685D26E9D816C79585BCFC1042C2AF88534A9FE8B0A6C8C44355A6D606F902DB40D5490264BF0F352C27355633CB095268D5B8BEC985A62D84B2323FE814053F05DEDC22029D2998BD0BCB255C162C4BC03F60E3580AC3AE86C37850110E9A1BCBD75F64A0DD60B941E2F57DA9D72498B3EA8324EEA53DA3895585ED2942B9140F260895DC6A1131A4C3AD2B64028BB8C0FD67E1BE4C07F808B47DAEF306FD9578025F9C639660075837B2C95473F7F860D6EA2C53F4BA677A2345CF212C7757BB94F1A4F76D4E96625F6FE051B8246D1B7611BF6FE325FFFF8514D2F9A3453F0E77AE8B958AB5B567E541F156C6F4D315B4C3C547D59BBD0D7403E2E6A49B9E7D3FDBA338ADA41875CEB03830A846A1FB266C0F1228AAD2B76A2E3404278DBE482907206FA66487AD2C999867F870C8CB7A70B83437E14B9E893BF6B391DAD75E84588E882246D161799ADEA63ADF1AD706C0A3B76BAE595D84B21AE9DA30BBC0856987F2C2C543D977747B8CBD5A613B92804ECC5284ED23650E9DAFB4B76D63F069710897334F18EA6B0CBF99CD590A78E3B050E1BB24C86D6323A17106F0CAE3F30B01E4EB3DB1B5F3A4771A880C8AC06BCD5A82D4103D0452FD7B54834C1CF8595DD77F82D4AD9EBC1CFD0C9A8CC787E10AA4D1688474208B69FF7AD4DA6986E5F62A34AC3093E0FB1EFE8AE3A96F6AAE09B0E8F6E7A2B65C7387999CECCA43CC33F026DC19BBFD867C48127CFF579D1D71AFF0C4A0E20F9FDFD599A6169DF1B85F6051E02290DF6F5EDE4F29BB6F0C8F806D6850C6534ECDDCCD75BB8E4A097C70445585740F822E5CEBB0E19EAC82BB78EBDE2CA60A810AC6C54119FD6427DA8A0155EF48653515A919B299A306FD3C62B505A6911DB2B56CA2F296E487BA02C546ECA2783ADE8E46A8C78EB1F3D7C04BB24548F92383E475CE6E572D8DE1BFA9B3E35D9BD6C79547B592C95693750010A3D22CBB31AA5A4ABE94897831B1ED9287631F006A735C36BC84A8C87497EEA4873801A733F35B328C7D2CCBE4A41C193D22F972571BA7630B33080793498CC85E6EEA1C412914459DA175A6DB8658D0BD7A823FAB286EDC20C785C40BFD539924A24AF4E3D37BD781353677C76D4672098F5BDD17017012571D9AFDA05A40AB56998E40F5E359C43DFE32CA10A45BF08F67D128C24B1ACC03CBAC46BA6CA5A532C105E91E0C77ED59FB534AEECD68735A4978177BB5A656B9F83B202BB604D61A24574C16656E512C0A4CC6F597B3268573E10539D1BA775ED83BB680BB9115011C6AD43FBB66FB37C467249060A1586DF27B2CEFA65265CCB9051E468000CCAE24F08BA941A8180A64BB624F146C8EC562363B32C369F62997C4B1375DD7DE64725A598529244273CAF8398913C6FC01522683CF1F9F965C491ABE7A554F0019514ED98D75EB8BB8565F77C195F629F98163494B4AA2674F92A41DCB67EDD1D818A5B98993D0B1198BB6BEDABBB486BC6FDE039433E842BAC568A5B4EACC028CC2544B57D8883848DDDEE2E967EA85A6102BD0ABDDA41C3D78447BEE1D4949449ABAA9B3377E8CEDCF04A500FD1A6916E26983E64B5E96FEF87B32A060444D374409262453CB1376C349A8B5D1767B1E2991A1A6044E0F58831BD11F12159675D215D7EAA74807C995FE22017E30482DB8A4B09CA7800822C75C92FF649FC0728F5A1D44EFE7D0FF147274152D5F2F60342C8F5F951D8C95F83C1D54613A182D9DCA68F54FD55047F1F90CFECC04D733DFA82CFF2618F29A4DB4F7E1E59DEAD58CA65D07CC90C25F804A895D6A82F9375451CC55506D276FBF783F7D4D53B9BFB83DBE4A8771AFE21AC543983D68034BADC980F9434527F9EDAA2E228646FDF75B44899E749CF4C9E5B345222385A4424382603AD6EFC24C56E769028F4394F2F6220A9B390D395E412498E57A08BAD927B8BD5D76E18E8FEB457FCBD3248D218236B07783E57FBFA03C292A9F5719E6AEF2EEA3FAB2CAEED5442E89BFFB236CB13DB2CF9C35A38C338C377C475DAF45F8EA822F9AAAC13425FBD43D3DD9229367F0B3687D7E82AC5EC2FC7CDB69C99A4EB1B8E45465C6A53F16AC0C4E0C970B8C732AF515C09EAF25596F64A04AE4621037B8841FD2B1BBCB310EA23E122B0B9AB96D8F7702952D0E96E4CF79C2A30DF0091ACDA91479EE2979B0054997C48F6A0E909BC52A943459AF25553969EB31CE7685369A7FB014561B4697B8BCE220983136E5EB2303CCA4EADD4C6CC74EA2FE69D448AE6ED953A80363DDED5591B27A1EA956DF081CE99AA59DFC789D9D8FAE952B0737099D467D +pk = 9C951FDCDB65DF2833810D557F4053D3B80B71A8BBCF564C604BE589F38C8804B4045FFA464C0CCC0846E8A6E9E4F784E92D16CBE188003977EE0566E4204B00141E6C75F8B860AFA774D38B815227F5154EA3DAECF354591182D04367E1320EDF031B60D953D86F9E725A0654F181D565DDF52198DDDBD53E537337DD065A010B +sk = 9C951FDCDB65DF2833810D557F4053D3B80B71A8BBCF564C604BE589F38C8804B4045FFA464C0CCC0846E8A6E9E4F784E92D16CBE188003977EE0566E4204B00141E6C75F8B860AFA774D38B815227F5154EA3DAECF354591182D04367E1320EDF031B60D953D86F9E725A0654F181D565DDF52198DDDBD53E537337DD065A010B236BD768C68E6DEA3290DDF915AB078A2A80228A0C701C9AB8056B0FE67DF724590100000000000000000000000000000000000000000000000000000000000088C48DC8717AE7781C5A0602077A65D25D9BD9F6D9513625D53D8C802D4B12707EFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF636DDE7A7A7414BD2D5D00E9D924C25A144550EBEA77779BE2BEC43A04B56C72A1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081FE6F4D5BD3341ACA3190C687CD70845CFC82CB3208CF308A4B8B8709472423942B488BEC896BCEF9869D9B6B13957572EC8BABD6FBDD833076E01F2B0400C52C1E7D8A88304E52898F91784085ACF7644EC83248278A4B50AACEB6216090DCAAE35CCCEE8AC1DC85D22CC6E6768E4989D72CB6140C6EACADB18448DF0373BE4258F2D895F3338C700A1724FE3871C6883B13E831B0535E95A8B47E9CDA82A572DBDF2809D45E16C9807AEACE64E6AB370CBEB7E90BE3585C3435F20632AC004D0A44C43FF17B6F5DD223AF0E9107F69656AD82C7E0034F1F6B5CB08B71218B938D3E8B282CA71E76A3DED6E1ED30537D4FFD38EA39F29010B04F06 +smlen = 2503 +sm = FAC411C71F2EDC54A13192BBDC9196297A85D0ED11B03748E32AB6565AF800637EFB975AF74F3F857C937BDBD61B1D02D680D22AEE219DE1CD4569ADD935720169FC1663614FE1A175849B72BA96CD8EDE7057CD2A28D57F6B77125B555D88FCAF969304214C3D8A67BAD752240135231C524109100D0C1666DD41FD57FD680001059638C7EFDBE4416E042F6D577517EA42107B87B8BB17FCFCD01BBD83E3F9CA1A2D996762B1BD9FE505FF7C25EBCAFF1C549CB11962C91C27170AA54406041F06C66DB98744EFB86822D26D6496960999D26126598CE180691D97FDB2EE0BBA18452978B59A30E13BFC04889A9D19F532B170DD0ED3E3433EE3387CDAEA05522F34ADB5E09902E1DFD79ACF7A63D673F64A799E54E12AF8BA52A2D5045EFD2F000209E3B57B208352A820F622A694B7C3F6F297239EF0A069615DC664C02F1822BBA48E11E37BD9749C98FACEFFFB0FE1792A386BE10CA7B98CC874C68C36F5096D3718DC93E0734D6D6F913E3B958DC1FD1424818C9437B0FD59728ED46A79FB52C737A1D1D26F04EBAC279A7FF6A971E2B69576B712D9224EA18FB9BF4E613A8935F3B36A073B01F37BDC0B77981C8F2804E93C395419352B85C8A32DD77D41DA9BF3ECB914173E80DD1FC06E8FF5BF0E4F7424849A15EB7FAF7DE77456EBB64D10DC10FEC6254070C7DF387397137372EA3A53DFDA7DA13414AF2DF16C1E38C5C70A5F5F44F725D622049256BB15DC04A8D846A1A0DAE7E765A7F00C498F1D0B2893B8405BE4A43FB7E97881069A49134A2A847184B82EB5A690D87BAF2F579619EE19A3D7A7C7EEA72D6E3FCCF0A8092BB8D3C6B551F27E63E762A30B4A4DF2DBC4D119139AE1B135D06FF827846901577700935E0011B65461C2EF9A7B71EEA33C8CA4519C7BCFB557C5E1D42D9243F2DC34057F5E0CCB9A457FC34DCB10D9B47F6EC3B9550D3AE4FD593DFA3E28C6CCA1FF1EBC9D98DA8DB869F8C80BDBF8AD4684ACB6A779CA9D0A106F26DA17043773862681C5DD2DEB1BCA2CA48D4FBB4BB7C1F765DCA3A1D991D890B9A8751CEAFF543997FAE5B128AB2EF22B3BE94499DFD9D8E78FB4C82CA8D296B0415E84CA8B5F2024455B5DECC8B4CCDC7BC4EE06B4F0C66E6748FBD07E3A3BC5B4B6889C40DC4A97AE3EB43C3914DEF976EFE3BFD84A093BD69102D7B37C89B458A55B98A1974A13A7685D26E9D816C79585BCFC1042C2AF88534A9FE8B0A6C8C44355A6D606F902DB40D5490264BF0F352C27355633CB095268D5B8BEC985A62D84B2323FE814053F05DEDC22029D2998BD0BCB255C162C4BC03F60E3580AC3AE86C37850110E9A1BCBD75F64A0DD60B941E2F57DA9D72498B3EA8324EEA53DA3895585ED2942B9140F260895DC6A1131A4C3AD2B64028BB8C0FD67E1BE4C07F808B47DAEF306FD9578025F9C639660075837B2C95473F7F860D6EA2C53F4BA677A2345CF212C7757BB94F1A4F76D4E96625F6FE051B8246D1B7611BF6FE325FFFF8514D2F9A3453F0E77AE8B958AB5B567E541F156C6F4D315B4C3C547D59BBD0D7403E2E6A49B9E7D3FDBA338ADA41875CEB03830A846A1FB266C0F1228AAD2B76A2E3404278DBE482907206FA66487AD2C999867F870C8CB7A70B83437E14B9E893BF6B391DAD75E84588E882246D161799ADEA63ADF1AD706C0A3B76BAE595D84B21AE9DA30BBC0856987F2C2C543D977747B8CBD5A613B92804ECC5284ED23650E9DAFB4B76D63F069710897334F18EA6B0CBF99CD590A78E3B050E1BB24C86D6323A17106F0CAE3F30B01E4EB3DB1B5F3A4771A880C8AC06BCD5A82D4103D0452FD7B54834C1CF8595DD77F82D4AD9EBC1CFD0C9A8CC787E10AA4D1688474208B69FF7AD4DA6986E5F62A34AC3093E0FB1EFE8AE3A96F6AAE09B0E8F6E7A2B65C7387999CECCA43CC33F026DC19BBFD867C48127CFF579D1D71AFF0C4A0E20F9FDFD599A6169DF1B85F6051E02290DF6F5EDE4F29BB6F0C8F806D6850C6534ECDDCCD75BB8E4A097C70445585740F822E5CEBB0E19EAC82BB78EBDE2CA60A810AC6C54119FD6427DA8A0155EF48653515A919B299A306FD3C62B505A6911DB2B56CA2F296E487BA02C546ECA2783ADE8E46A8C78EB1F3D7C04BB24548F92383E475CE6E572D8DE1BFA9B3E35D9BD6C79547B592C95693750010A3D22CBB31AA5A4ABE94897831B1ED9287631F006A735C36BC84A8C87497EEA4873801A733F35B328C7D2CCBE4A41C193D22F972571BA7630B33080793498CC85E6EEA1C412914459DA175A6DB8658D0BD7A823FAB286EDC20C785C40BFD539924A24AF4E3D37BD781353677C76D4672098F5BDD17017012571D9AFDA05A40AB56998E40F5E359C43DFE32CA10A45BF08F67D128C24B1ACC03CBAC46BA6CA5A532C105E91E0C77ED59FB534AEECD68735A4978177BB5A656B9F83B202BB604D61A24574C16656E512C0A4CC6F597B3268573E10539D1BA775ED83BB680BB9115011C6AD43FBB66FB37C467249060A1586DF27B2CEFA65265CCB9051E468000CCAE24F08BA941A8180A64BB624F146C8EC562363B32C369F62997C4B1375DD7DE64725A598529244273CAF8398913C6FC01522683CF1F9F965C491ABE7A554F0019514ED98D75EB8BB8565F77C195F629F98163494B4AA2674F92A41DCB67EDD1D818A5B98993D0B1198BB6BEDABBB486BC6FDE039433E842BAC568A5B4EACC028CC2544B57D8883848DDDEE2E967EA85A6102BD0ABDDA41C3D78447BEE1D4949449ABAA9B3377E8CEDCF04A500FD1A6916E26983E64B5E96FEF87B32A060444D374409262453CB1376C349A8B5D1767B1E2991A1A6044E0F58831BD11F12159675D215D7EAA74807C995FE22017E30482DB8A4B09CA7800822C75C92FF649FC0728F5A1D44EFE7D0FF147274152D5F2F60342C8F5F951D8C95F83C1D54613A182D9DCA68F54FD55047F1F90CFECC04D733DFA82CFF2618F29A4DB4F7E1E59DEAD58CA65D07CC90C25F804A895D6A82F9375451CC55506D276FBF783F7D4D53B9BFB83DBE4A8771AFE21AC543983D68034BADC980F9434527F9EDAA2E228646FDF75B44899E749CF4C9E5B345222385A4424382603AD6EFC24C56E769028F4394F2F6220A9B390D395E412498E57A08BAD927B8BD5D76E18E8FEB457FCBD3248D218236B07783E57FBFA03C292A9F5719E6AEF2EEA3FAB2CAEED5442E89BFFB236CB13DB2CF9C35A38C338C377C475DAF45F8EA822F9AAAC13425FBD43D3DD9229367F0B3687D7E82AC5EC2FC7CDB69C99A4EB1B8E45465C6A53F16AC0C4E0C970B8C732AF515C09EAF25596F64A04AE4621037B8841FD2B1BBCB310EA23E122B0B9AB96D8F7702952D0E96E4CF79C2A30DF0091ACDA91479EE2979B0054997C48F6A0E909BC52A943459AF25553969EB31CE7685369A7FB014561B4697B8BCE220983136E5EB2303CCA4EADD4C6CC74EA2FE69D448AE6ED953A80363DDED5591B27A1EA956DF081CE99AA59DFC789D9D8FAE952B0737099D467D + +count = 67 +seed = BC81485EE93AAD8B464B5199FFEF9FEFC06EA97645BDFE0B4E915B812E606A77F93917ED925E882161CBB909747AC4C8 +mlen = 2244 +msg = 89D960D04A3DF6984276A3D17D59AF9E72B25418C8797170FA701A672C5835CEAA22DC35470D038C6ACC5082D2AE329F36697C91CBB1F9E42DA59A654462BF19E04352192778CB050DB6F4A656F6AB0BD9641CA8CE6C1EF8B020A3D9FD9DFF772F38926458BDA6E6072456E506AE464785399AD7B498AFD4C211F09D0C722FBD9E20890CDDC8C6EB9EE75390E6D76D0672FA64D8B97C65CCA46DD1F542B6D6014F035D2817C4B9430AC8DC318CF8642AB34F4C8D71FC0E3B1FC961E94B6A84622876250FDC21987777360784D9A58F35E1C9B71F30561ED6854EE9B112E7B20CE064272213BD1A46D0D19E5EFAFAAC7ADDF4D7B7A519D689398EAF1E67E64ACE8E5E89756377E1FE458D04E3DF7F6680F8B69815680276ACDBEE6C8E1AA909EC56994F3EF3B65FBEFDBC29AEB0EA906274E838CAC36A0607716FBC2B8DA6150A4EF39E1CD9CCA72915007723C5D2442F7133258234D18A257DA2C13E53B47DC6ABC2D607B98E351FCECEE8BA8886821985BB3A7BD02429ECDC5A27EB04D01DADCE88A324AE44F567593FBF730C284414056FA33CE90A6D6F146DBB1635BD26B4F883D4948DA47216C70D2AA58CEB3979523C6A4F2F7EA455A97C7ADB6C43685D63BD4C51D7DDCB81A06B9BAC31A7B255B94052D686128D234BCB63CE713028451B18B981B83DA1246281FC3BD2B06C741CF71979DAEFDFA0FD06FBA3722FF7BCB2821FBA964FBE9F6467FE583C06D3889A40360A7AA03358175EE75EB8FD1D3368C30B5691776C163764DB924FBA2362CC9572F642CDD2B11B40FA2683A529EC2100DEDEDEAA70A1E639A71D6A96AD31F70A00FB63875D0FD5C21E56AE57B6E74EECD2EF34BB3E20BE5A1F9F1F54955A18B4E4E4B9119973DEB76A2A603FB6410A350667ECE5C1C147DD00B07A88A7D0E86AA2D747A867AD90BA6660C7A0432E20849EF642A20CF5A20AF7E34D139B39DD65C65B36750F17F0B9F1DB06CC6E16F10EB289F567B647454A581604F381D66371238AB785585A4DA2D00810EF6851A6009025FCADFB77FF7996BA6B091FE4130733466B29FED46554FEBC2AD291DD966BEF4D79A9E04014D3003C95696E8BC39892AD32DB6D6AD22D33E931BC87F78114BBBD97B334BCEA676F9E9DB23C0485EC06D8F37F070C143117B1BEA49F06E1A2423D98C12883D32D29103F7699646E7091D393B21A260703E17380A1BD85452702C3AF7DF73AE7856A1C066013014DE62C3C817DD74C44AA436A71490E7BDC6B8B74BF61711FDCC541AD7DC49CF4C3EC154879E048FF30DF25065B5641367CBD3BBA19606A9A27A64055D5D3B538FC88EDA66FF9F26E619DCBA696866DE54A8DC8580B5B28144F952FFC6DC543E98CC9FD7F4538135C0F4DEB4BF892266DCC48A4D1DDCF407BE4FDF2A5AFE4A0105A20CE2B3D9F48D608DE2315240875F1FED696C49CD8D4A78AD26F51B3C804949C536CE35C3963DC1D238516B3F2D297F5C9939A946A0170E185C75087F37ACF907F9E3F87A2B15CF81C7ECBF2165F0F3962D11E9C6A7845ECEF432CE9E1FBE74C77EA1057D79CB595D47A8DDC1D911C6B97AF76D91F3515081B95CED16275DECDEDCED9AC790D73739E35973834503133510DBE39201F9B5C618231184B9DBAFAA7ED6623E8BC492170812444DB62D4F01925DC4F821C0896A746B4453E93EE51844B311B0A0A51601477BFF651EB5EE331227A2E9E49F593EB2988E449E750E990A8A89906EFAB00E0955C81B6AEB160313007B481C40908130597626935389E47AFCB0A20146F0C7B29B567E95D59CED7FA8023A2D69C89443A11E7150A03D09EE6B0F74358141D48E9BCAA3EE081C7D8F8C223F4D48EFB3DF8A4E287FC5B90B4FD251CB616687ED09AB1A06C42EB9D6A578D72E99D499882D216DDB3F35B0A33D9F2D3D4A700161A5C3B5A6729F197479E78009794AA1BE3C25E0B9142613AD2EA508ACAEF5EEE33DACF60CB7A16AB38D9F3CAFD2150081B63A3A6CA0163A25FE81206A37A0874FD55FA3068B4C1B25E6325FA56646EE5F3431D33D0BC691C134AB306B0BD2D1087F4D898A529DAE08B97683FE2EB8ABC9095D67B79CFF0E77404C1F7FF316C3CECBAB77C710FBF961008047AF22805D77EFF79F815B21D142F517DA2199F6627AD9FD85AA24E9B7F40C7796207A82901C7B5A3A42369A9BCEBC24ECE13A3ED064E4E748BEE2890BB21B8E4845362BE9AEE46E25418F7CA38ED087E46E24F12012A1312BC623AABA6ED227CEF116A3C2130B4B837AC77D86F8CA3553BA0CF5AD45E9B4E4E55059F1D4675291581D7CC9E5839212AFCFA897E90CB601CB33A4D2241A5ED5925F6416BE5A43D4767FA04F701076AD5ED5ECE2D09B8DAF11B00FEDD2AA2E748CBCBE365031394EF823951EBC52B3E4C79D79234C16575910C29A35EB67C624F7504EECA3921F461D7F95EEE39638C402481DF7B59310C4554450789DFB28ED1E485C0018512EB05F14DC7A3DB5C0606F9E28420D76B8F8534D2AE31AA01E90A20E248A7FB3B72EA859031C67F7B2B043D38F7183165A42AB28C6308608C530A9CA98F82C133BBC313FDDD2109838E970DC9989EC14DF781A518F6CB56DBEDFC1E381250C64F95D0BE5F37515437673425374D44811F4406EE2B5130334BA555839E61AE623D283C77247D2EF8B22ED138A526F7E41DFD41FC69A2839B77B51C6FD96D97D3EF8359E8725BA1AFA80278FB3BA9C697F7E2BBCC5D3F0F2E61BFCF542D3160EDE02CD6295FCC55865E7890342572499347DF80EC073A91E00193BAF804B884E9CF5C43269824D4CAF7EEF49FABD8BDC5496D190263C96DBCD287681C19B90C34635FFBDFEAFE0601BBB7514FD84896A22895E9B21FAEEA372696E350F13959FC23533F3E8C34B17B595F3C935E37220AAF644F3A565114C34C7B85F1A3E465470166A62B13ADB00A2BCD5A9A3ECD59FB772F09DD6A6E2AD12FD54EC62CFACE0022F2FFE3EB62DB0F4D0F0F9D1FD6F3F11D76DA868D2C1C4124915DE19EACFFCDB31F7CA018B6976260CA1BB2C4FCD6B9958F096313B608E208D875EA5A1FA89916D0367EDC4F8890E93F1E660AFF16EA79D1E583007E693BF06C172105B3DC24117DD921FB60D3AC0D2E5C89FEF17087D885A0794E496E3CBEA333CF72A507788EFE +pk = BD723A28E6710AF4FF0357EE32F0603C60FD9197A9CCC6DF79726A0C12A9931317A224C5CFFA0A62F9F15F8C8F4E0093442FB4567D4785D23A92D9AE89DF1B01F13F9C50C06082DC64C38FD1983DF8B56F7D8CEC01500BDBC6859E175F3CD886F29E32B4042A5EAC54C0DA5DF0FECB359D4AD7D1E73C533300F2DD3643E2BE000B +sk = BD723A28E6710AF4FF0357EE32F0603C60FD9197A9CCC6DF79726A0C12A9931317A224C5CFFA0A62F9F15F8C8F4E0093442FB4567D4785D23A92D9AE89DF1B01F13F9C50C06082DC64C38FD1983DF8B56F7D8CEC01500BDBC6859E175F3CD886F29E32B4042A5EAC54C0DA5DF0FECB359D4AD7D1E73C533300F2DD3643E2BE000B33C50D66A314987AEBA24D496E8E3A9D9D3F7D93A034FDE6694023A05ECACB494F00000000000000000000000000000000000000000000000000000000000000181BBB55262969B3AEE9EA01483AC78C94C32A085AC43BAC8F703C96AB396AFCD6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D5AA28010245577240E17919BC6CEF1A35DEEE36EE0677F0A05922C10A61DE062FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000553736CC6055B7E9C4DFE390689901781C7B8F001238C7B4FD40E3B45D129FD859FDF7E097DFAF7CCDBE4ECE8008A1214E7A22CB3B0FF3C4C2E1A6BEA996057EC0C96EB9260ADCA03BEB6B69A8E61EC5B793EB980C5EAD00CDF1424C0C72F81ED31E62C30A0280A9A68F844E4C24F1BE6972DAAAB0F6CE877C8BFD442A08E6A8B77EB73635FC3DB97BFFED4F2BFEDD789A0062F2D48FB7093C04B53C012D68AEBDFF27ACDDA254C9D92F7EFECA9080DA86B7746B5EA5D1BD933EB0AB0685F40BCFAF154F0B7ABE394F5EFB7E6462B6283B90CC1ECD2F932909A6E28E4FB42DDBC79034EE9405524DF690E90C436980BD0C96FD61AAF55A9A6E5D2702 +smlen = 2536 +sm = 0422F58E66C7A84D4F67B02644E54D6B982EE26B04C82AF927DF9E36B00930D05BE9C858AA6D7D895902F9B3B700A68F5D6696F5FAEF429FFE0BE99236C1CF005D85ED1AF5920A6052A48B9ADF8A08647B74BF23237EB9092A8AD4361AEA1747CB7823BE437B1CE1806FA3991C10499F5B7EF04D02EADE59806C117F2E309E000000AC0D2170B1F16FC099B05DC5AC2F324790E193DCABBD6EBA43DCF2A6384C7A5C758D24272B34FD161ECADAEE4C13DB06A35C8ECB1C24FA40516F92AD32576713FBD6A3DF344A7817611BA2104B2B7D24F3F7003300272A821A7BB6F4112F6B0360E640B43B3F1809EACDB0FFBECC0C11753D00630CB35F34495AE1DF414E201C5F5559976C1EA4410FE7FD2AAADC540559F3F39EE7B202EDBE434D4832762900090289D960D04A3DF6984276A3D17D59AF9E72B25418C8797170FA701A672C5835CEAA22DC35470D038C6ACC5082D2AE329F36697C91CBB1F9E42DA59A654462BF19E04352192778CB050DB6F4A656F6AB0BD9641CA8CE6C1EF8B020A3D9FD9DFF772F38926458BDA6E6072456E506AE464785399AD7B498AFD4C211F09D0C722FBD9E20890CDDC8C6EB9EE75390E6D76D0672FA64D8B97C65CCA46DD1F542B6D6014F035D2817C4B9430AC8DC318CF8642AB34F4C8D71FC0E3B1FC961E94B6A84622876250FDC21987777360784D9A58F35E1C9B71F30561ED6854EE9B112E7B20CE064272213BD1A46D0D19E5EFAFAAC7ADDF4D7B7A519D689398EAF1E67E64ACE8E5E89756377E1FE458D04E3DF7F6680F8B69815680276ACDBEE6C8E1AA909EC56994F3EF3B65FBEFDBC29AEB0EA906274E838CAC36A0607716FBC2B8DA6150A4EF39E1CD9CCA72915007723C5D2442F7133258234D18A257DA2C13E53B47DC6ABC2D607B98E351FCECEE8BA8886821985BB3A7BD02429ECDC5A27EB04D01DADCE88A324AE44F567593FBF730C284414056FA33CE90A6D6F146DBB1635BD26B4F883D4948DA47216C70D2AA58CEB3979523C6A4F2F7EA455A97C7ADB6C43685D63BD4C51D7DDCB81A06B9BAC31A7B255B94052D686128D234BCB63CE713028451B18B981B83DA1246281FC3BD2B06C741CF71979DAEFDFA0FD06FBA3722FF7BCB2821FBA964FBE9F6467FE583C06D3889A40360A7AA03358175EE75EB8FD1D3368C30B5691776C163764DB924FBA2362CC9572F642CDD2B11B40FA2683A529EC2100DEDEDEAA70A1E639A71D6A96AD31F70A00FB63875D0FD5C21E56AE57B6E74EECD2EF34BB3E20BE5A1F9F1F54955A18B4E4E4B9119973DEB76A2A603FB6410A350667ECE5C1C147DD00B07A88A7D0E86AA2D747A867AD90BA6660C7A0432E20849EF642A20CF5A20AF7E34D139B39DD65C65B36750F17F0B9F1DB06CC6E16F10EB289F567B647454A581604F381D66371238AB785585A4DA2D00810EF6851A6009025FCADFB77FF7996BA6B091FE4130733466B29FED46554FEBC2AD291DD966BEF4D79A9E04014D3003C95696E8BC39892AD32DB6D6AD22D33E931BC87F78114BBBD97B334BCEA676F9E9DB23C0485EC06D8F37F070C143117B1BEA49F06E1A2423D98C12883D32D29103F7699646E7091D393B21A260703E17380A1BD85452702C3AF7DF73AE7856A1C066013014DE62C3C817DD74C44AA436A71490E7BDC6B8B74BF61711FDCC541AD7DC49CF4C3EC154879E048FF30DF25065B5641367CBD3BBA19606A9A27A64055D5D3B538FC88EDA66FF9F26E619DCBA696866DE54A8DC8580B5B28144F952FFC6DC543E98CC9FD7F4538135C0F4DEB4BF892266DCC48A4D1DDCF407BE4FDF2A5AFE4A0105A20CE2B3D9F48D608DE2315240875F1FED696C49CD8D4A78AD26F51B3C804949C536CE35C3963DC1D238516B3F2D297F5C9939A946A0170E185C75087F37ACF907F9E3F87A2B15CF81C7ECBF2165F0F3962D11E9C6A7845ECEF432CE9E1FBE74C77EA1057D79CB595D47A8DDC1D911C6B97AF76D91F3515081B95CED16275DECDEDCED9AC790D73739E35973834503133510DBE39201F9B5C618231184B9DBAFAA7ED6623E8BC492170812444DB62D4F01925DC4F821C0896A746B4453E93EE51844B311B0A0A51601477BFF651EB5EE331227A2E9E49F593EB2988E449E750E990A8A89906EFAB00E0955C81B6AEB160313007B481C40908130597626935389E47AFCB0A20146F0C7B29B567E95D59CED7FA8023A2D69C89443A11E7150A03D09EE6B0F74358141D48E9BCAA3EE081C7D8F8C223F4D48EFB3DF8A4E287FC5B90B4FD251CB616687ED09AB1A06C42EB9D6A578D72E99D499882D216DDB3F35B0A33D9F2D3D4A700161A5C3B5A6729F197479E78009794AA1BE3C25E0B9142613AD2EA508ACAEF5EEE33DACF60CB7A16AB38D9F3CAFD2150081B63A3A6CA0163A25FE81206A37A0874FD55FA3068B4C1B25E6325FA56646EE5F3431D33D0BC691C134AB306B0BD2D1087F4D898A529DAE08B97683FE2EB8ABC9095D67B79CFF0E77404C1F7FF316C3CECBAB77C710FBF961008047AF22805D77EFF79F815B21D142F517DA2199F6627AD9FD85AA24E9B7F40C7796207A82901C7B5A3A42369A9BCEBC24ECE13A3ED064E4E748BEE2890BB21B8E4845362BE9AEE46E25418F7CA38ED087E46E24F12012A1312BC623AABA6ED227CEF116A3C2130B4B837AC77D86F8CA3553BA0CF5AD45E9B4E4E55059F1D4675291581D7CC9E5839212AFCFA897E90CB601CB33A4D2241A5ED5925F6416BE5A43D4767FA04F701076AD5ED5ECE2D09B8DAF11B00FEDD2AA2E748CBCBE365031394EF823951EBC52B3E4C79D79234C16575910C29A35EB67C624F7504EECA3921F461D7F95EEE39638C402481DF7B59310C4554450789DFB28ED1E485C0018512EB05F14DC7A3DB5C0606F9E28420D76B8F8534D2AE31AA01E90A20E248A7FB3B72EA859031C67F7B2B043D38F7183165A42AB28C6308608C530A9CA98F82C133BBC313FDDD2109838E970DC9989EC14DF781A518F6CB56DBEDFC1E381250C64F95D0BE5F37515437673425374D44811F4406EE2B5130334BA555839E61AE623D283C77247D2EF8B22ED138A526F7E41DFD41FC69A2839B77B51C6FD96D97D3EF8359E8725BA1AFA80278FB3BA9C697F7E2BBCC5D3F0F2E61BFCF542D3160EDE02CD6295FCC55865E7890342572499347DF80EC073A91E00193BAF804B884E9CF5C43269824D4CAF7EEF49FABD8BDC5496D190263C96DBCD287681C19B90C34635FFBDFEAFE0601BBB7514FD84896A22895E9B21FAEEA372696E350F13959FC23533F3E8C34B17B595F3C935E37220AAF644F3A565114C34C7B85F1A3E465470166A62B13ADB00A2BCD5A9A3ECD59FB772F09DD6A6E2AD12FD54EC62CFACE0022F2FFE3EB62DB0F4D0F0F9D1FD6F3F11D76DA868D2C1C4124915DE19EACFFCDB31F7CA018B6976260CA1BB2C4FCD6B9958F096313B608E208D875EA5A1FA89916D0367EDC4F8890E93F1E660AFF16EA79D1E583007E693BF06C172105B3DC24117DD921FB60D3AC0D2E5C89FEF17087D885A0794E496E3CBEA333CF72A507788EFE + +count = 68 +seed = DE9E2742591A5AF6A6153DA85A510C39FD31A2ACD8A8511F190A9A5E5753E63D9801A8019508E67DEB1E9219CC18BA3A +mlen = 2277 +msg = 8337940EE74590EB25E52E78E8563A09CD2D45F650F48775E3E61F9E3509CC8EB7E983310D0185359F66BD80E0DA1E45A6BEB53ACEBB9030E310E81A576D0F80C64FCE1D1FD77DCA27B7C6E02B0CC26EDBF496AD2E3CE8484E988E56BB28153587D7ECB02FD8882545E7BF79CC9966A7FEDE93F7E9451BC48FDBB481673D1C4135F95D68F40F4B4F847345A320FB4D736BF5F9FD347435462DD3A238E4C799E7CEE081107E11682C7B558B19177522427F1D269FAD81B565BE538E8FF2D7193579AEE51E50974BDC0B66331B59BF496C87E4F6E143754076DB516C9C538410FB38A930CB5BA1E6610441126D01C8EB5F34E2E58424B8B218D9E68C5D8B4F5258EEF07EE0AA5475A72CCF363D47D825FA524C16C7B7587C44864DA9E4B267F738B87F7E5701147F550CD38774B17DE48E6969A0DEDF334FA67470419059C4D1607880CB12FA9C0ED23032C7E0F325169EACE7DACCDD4C2E5097FBBA859970D7EAC4522C1FEA043C9278C1C89FCCE95203033B4CEA4F9F24B55BA6B79EF88F275310C6E48189EFC1EEEDAB66B56B6BB028726BC463D93D742492841E85D5C837948978D0FADD1C172F8859C802C6BE8394A05DADA7546EE1CC5BB909D3189088F4FA6D07C573ED7263C081720E701D5D4B027AE54BE175536F3BD5E91993CC040311A7D352AA26414CAE30D10408DDB44E8C9513F4619E99EDC894F963489876B24BB0B91BDC3EE5B78AC0D4046B2E864789C0C779E5AF97F8F84F09A26FF74B8BCDE66C007970830B70C2A1122DC9845905C3AA7810B40641E8BBB398A23BBEF52BEDABEC7BB54823E64177A73786992DD67D5C007D770938402EFBCB3A60281C5706920A9EEE4C26C0B251C32B9E1936FDEC2928110959E99255508250FD5BA84B4FB314187124072D30FBF2163D36F1480ECC08F7FB8093BFAA72F1914C63533EBB3A57420DC38DC93DD6AE4D197FAB790C1EFC1B7A2234522E0B408D0648C7AE782F2F08CB70B96CD76B5089AF1EF4BA3A4C2FAAC363A4DC1C6C421F6AE1E9B67461EB02F36C25E763F1A2B73CEED4DCEDDCE619CB313D124CE6F7AC986D6BC344E630F22CB654C1286FBC0EE01C968DADD1EDAD744C8BC828CF5F316336A5883166ED000FF98D6CE2CEAE7D3E40BBC5714F71BA9E25E1506D644FB2DE2FE190D327ACCCA79D9B6D9DB505CF1853E98F30E9BA5E568ED83E2567C936A64420C5D8F07AC4F65F38C28E88DD7B5209A600AEB81A6D2AFA4FAAEFDAFD9B7FD3AD7F49462CD577204184F9D44A45E2A909373CED24EC0EE56BF2E6675C506EDA67B1E6DAB75CBF1822E20E7A8A81A7729B42A6D67A1DD457FCD19B62F048AB97B3D694254E5C051FD2DAF3D12AD627EC37C22117BDEE9EAA290D11D56BAFF0DE1037EBA908FA03E2F869FA2B27936669306E8E70A0A4910A123F202797BF1C8FE47178BB1E8E8D7AB1C01F30F5E779B2BC99902DF15185FED4C865997AB72254162D00858E0908EA95A9ACD0FCE72E571C7A381CC33E06A27FE6A5922775EE82C973CC3CA8A05717608F8703946C9A89854D627744DA475DEFC1390DC44FCC3A23C47AA8AF17240EB1A1A00A062D258D471F31333D0356243DC1CECFC559378B4395F01A970EA4074D5666B44D49EF291ED15930DADA66765B165CB8331CFE549C38CD0672F534BE60F4D9B4C125FFE747670513B5744676899B256B992E15106B99B794DB3950582816612144649210751F3D0DFD5B25CD393E724F7FDEF00756D0C8540E8891E592507599B06EDFA6EBFE543084AC81858F5EB02D8F5EB8A72184851E8589A3AC6DFE1CDCF286723FC4C1202765FA4F783EE58C627ED494C7149BCA6A4DDB420827CDCA82DC42515BEAF46CE9D9ED524BD00EBD3094F770B1E1DD09FC431E4C244D2305619DAE208E65EF385EA92F5A79F12B99AFDAEA79C9D8D319944AC6CBBE3F1290EC6B87D97785E059E6871FDF239BC404021CB52064B88EB4CB3FB6A871B0F76C12D7B8C5E8FE0A65024AB5B25F4C67B6D15C22B0005B754CF7CBEC898B49F4326F1AE4034E5F5A446A96CE08083D48525A3661E10C996DD22DC34FE570A4C8817D10D750FC5C2ED0C24C7CBCBA5CD1B2680DBAA3315FBF2BA7457ABEEDC96B5D111110D4678EA5C7851D25F258926B0B028365799E940A6E17BB03CB332FBC6D713DEA7108FC6268C8D33E7A578C94FF75BE808C15FF7884F092C0E309F1AF99B1A7314FA0F32C8D8E32B3E9D92C9C8FF6B8FBB99111529C4BE3A2A4F62884373D0903180B4DEABE613DE5CF19415DFBA7F9A46297AE2F21D7EA420B41F628FD8DEBA55207606539D11791623CB325F1E18C98AAC27283BFAB2408F4FD6CC58EC9E306643BA1C0C77D84B3930263E5A76A1CE94F3D7721F0098D54E6C990C3AFF69B6A0D82C853EA2AF2D3D2B3E96DAD59FF873171B55D16CA9A7C68DAD2E918174D264919DDCB4B9D01CE622D56C599BF60711C74315C918A7BB97B9513937AFB6A652DA68B6B0B34E316D7BE9F5C282A5E8773C892782EFF220667A6A54069C37B88EB1CE676AAECF2015E59FB7AF4D30C4625DD8DE4805F505E83C877CD61D2A0BA65B32B0DBDFBACFC88CA43E4DDF7A1A4517DCE83B7B8ACF8DCAAD28284039747935865DAF8DCFCA29FB676CE2EBA2C509CD75588FA5E58CEFD0694626C9BB31C3AFC372ED313C9BB3ADC398E89DBDB108DDA63F9380EBF9DA17B378451634682F9823E209BF10E39F884ED270413152025CDBF4875C121B1E83E12C044453FFDA6D8CA2C240AD522577C6898AB6F2ABE1FE77F860939408CD193E605F87FF2248FA163AC2FC0F39BFC38503B23F5441E0E364CAAAB890073266B3B51217661F5DF41C0BA925BB425AB3DD7B6A3675B7D60D0290131EAD53A4EAB0C66BAA83F2FB77E74C3C123ABA7731A3F62FAB8EAB2A96E8BBC911E501CD23A088E7887A469284E0B5C27B5CBC1DE2B6938CF1AF58A47FE78141306CB76E8F2B73620BC4549DB6826D2D72873885F6C5311EB5B9462BB4631D314DFB9C836C6F4D9EEC6818940C04689CC4D8D11ED9869355617861340E722B2BE78197746E2759AAA8D68D1965888E89B6B0F5BF51F94E586B2CB8708F4CDB520BF31DDCCFB7CB69E29A7AE8AAB12C11F431DE40FB9E82EB5F2B6BA1F9757F1487B63255FA69A755601C2FE17CD1892D5A6799C35D05098DC133BDD71318667D47C4671 +pk = 8743B4495F1A9D92FCE89F8F3A451C4794FA5B25368EF6A25BD914E3F1145B6E0AD8C059DD53F1B3C3C19EE2A7F8AE5FA38468ABBC6E56C283658227784AB7002F6A0EA2145795EA3B9607EB20B1D825E17DB087DFB1AFA8FB94A7147EEB63938D5FE1DEED537DD6B39A6B5742E5E425A7F9A900FC77A71D78CA490F19352F0009 +sk = 8743B4495F1A9D92FCE89F8F3A451C4794FA5B25368EF6A25BD914E3F1145B6E0AD8C059DD53F1B3C3C19EE2A7F8AE5FA38468ABBC6E56C283658227784AB7002F6A0EA2145795EA3B9607EB20B1D825E17DB087DFB1AFA8FB94A7147EEB63938D5FE1DEED537DD6B39A6B5742E5E425A7F9A900FC77A71D78CA490F19352F00093F25D25CEE59DEDD98A2F8A3E49907860908BDA0A8C97D9991ADDD2D31F83DB62001000000000000000000000000000000000000000000000000000000000000728BB82BAE5D53C2B157EE6965A408A15046626F27FB0CEBF06671C2DDA2D278E2FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97DD84FB6A83C76500A51ED1B7BCB35C71395CAFE1B39EE9FB97A5E4573282FE13FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000712100201C05070AE94C1341714FA8D600CCC897119239D8F9B80CB45FE55CB00A37B2DBA40D471AE7E8C39DC4D5AC751E1525EC063134BDC93F7E45B2A50BE951EC594289E94C8FC35FA0052BA1491A697E8E78D1283312D728E62C6408529EE62D7EDC3F2947661CA18A5C3FE90EE2478C70D0BE64CF5100D037CD390735C1BB4092F2A2C0EC80F72DD5D2A4B7A01F24848710011FE3799C5947104F2D56A1FAAC5DC7BD76CA9A6A2D933760C9C820AFD9199D852B1A2CE4A9564B09844E06DAF827250D707245882E6E77ECCCE02D2984C916102688819EDACDFEB3B7C99FC32C673458BF3C3304927C59EDC94AC1560EBB540665FDC3A4683301 +smlen = 2569 +sm = 67C9B6557851F6DA0F09E94AF0D3D230359C309594B0841AF44D17B5D4F414605CFEE1FC8AB0A001C88DD3685AAD03BC53ED686B75A214EA95D7AD240B94030111FF9EC22D8E52BAC2EF5A680643E6F5F62794544DC379FBD4E58E2CF89AF6962AEF99CF4CC934B2DFF95D36F1EC2FE4E59266A41B16A77F1B5CE61F21F98D010004F5DB1E31A4043F52E24935E454A2BB00A4A06777AEC256060D731D329C4DE14E87D6BD5DABC82121AF41D9BABD70A7B4B185990A0B0927D9ECCA47F43DD781331EDA550BF74F9BE71CC39C426355C4E1C5195DBAB25392B04E3A78A134C5065FDA1E71448AF3F3EA99A421FABE9486E7B35FD558E53F8ED0441316BA0CD82179C21F0F1E75EA3C99AB0652679B7196A520DBEEA57A8142E4E2B788BF139F470009098337940EE74590EB25E52E78E8563A09CD2D45F650F48775E3E61F9E3509CC8EB7E983310D0185359F66BD80E0DA1E45A6BEB53ACEBB9030E310E81A576D0F80C64FCE1D1FD77DCA27B7C6E02B0CC26EDBF496AD2E3CE8484E988E56BB28153587D7ECB02FD8882545E7BF79CC9966A7FEDE93F7E9451BC48FDBB481673D1C4135F95D68F40F4B4F847345A320FB4D736BF5F9FD347435462DD3A238E4C799E7CEE081107E11682C7B558B19177522427F1D269FAD81B565BE538E8FF2D7193579AEE51E50974BDC0B66331B59BF496C87E4F6E143754076DB516C9C538410FB38A930CB5BA1E6610441126D01C8EB5F34E2E58424B8B218D9E68C5D8B4F5258EEF07EE0AA5475A72CCF363D47D825FA524C16C7B7587C44864DA9E4B267F738B87F7E5701147F550CD38774B17DE48E6969A0DEDF334FA67470419059C4D1607880CB12FA9C0ED23032C7E0F325169EACE7DACCDD4C2E5097FBBA859970D7EAC4522C1FEA043C9278C1C89FCCE95203033B4CEA4F9F24B55BA6B79EF88F275310C6E48189EFC1EEEDAB66B56B6BB028726BC463D93D742492841E85D5C837948978D0FADD1C172F8859C802C6BE8394A05DADA7546EE1CC5BB909D3189088F4FA6D07C573ED7263C081720E701D5D4B027AE54BE175536F3BD5E91993CC040311A7D352AA26414CAE30D10408DDB44E8C9513F4619E99EDC894F963489876B24BB0B91BDC3EE5B78AC0D4046B2E864789C0C779E5AF97F8F84F09A26FF74B8BCDE66C007970830B70C2A1122DC9845905C3AA7810B40641E8BBB398A23BBEF52BEDABEC7BB54823E64177A73786992DD67D5C007D770938402EFBCB3A60281C5706920A9EEE4C26C0B251C32B9E1936FDEC2928110959E99255508250FD5BA84B4FB314187124072D30FBF2163D36F1480ECC08F7FB8093BFAA72F1914C63533EBB3A57420DC38DC93DD6AE4D197FAB790C1EFC1B7A2234522E0B408D0648C7AE782F2F08CB70B96CD76B5089AF1EF4BA3A4C2FAAC363A4DC1C6C421F6AE1E9B67461EB02F36C25E763F1A2B73CEED4DCEDDCE619CB313D124CE6F7AC986D6BC344E630F22CB654C1286FBC0EE01C968DADD1EDAD744C8BC828CF5F316336A5883166ED000FF98D6CE2CEAE7D3E40BBC5714F71BA9E25E1506D644FB2DE2FE190D327ACCCA79D9B6D9DB505CF1853E98F30E9BA5E568ED83E2567C936A64420C5D8F07AC4F65F38C28E88DD7B5209A600AEB81A6D2AFA4FAAEFDAFD9B7FD3AD7F49462CD577204184F9D44A45E2A909373CED24EC0EE56BF2E6675C506EDA67B1E6DAB75CBF1822E20E7A8A81A7729B42A6D67A1DD457FCD19B62F048AB97B3D694254E5C051FD2DAF3D12AD627EC37C22117BDEE9EAA290D11D56BAFF0DE1037EBA908FA03E2F869FA2B27936669306E8E70A0A4910A123F202797BF1C8FE47178BB1E8E8D7AB1C01F30F5E779B2BC99902DF15185FED4C865997AB72254162D00858E0908EA95A9ACD0FCE72E571C7A381CC33E06A27FE6A5922775EE82C973CC3CA8A05717608F8703946C9A89854D627744DA475DEFC1390DC44FCC3A23C47AA8AF17240EB1A1A00A062D258D471F31333D0356243DC1CECFC559378B4395F01A970EA4074D5666B44D49EF291ED15930DADA66765B165CB8331CFE549C38CD0672F534BE60F4D9B4C125FFE747670513B5744676899B256B992E15106B99B794DB3950582816612144649210751F3D0DFD5B25CD393E724F7FDEF00756D0C8540E8891E592507599B06EDFA6EBFE543084AC81858F5EB02D8F5EB8A72184851E8589A3AC6DFE1CDCF286723FC4C1202765FA4F783EE58C627ED494C7149BCA6A4DDB420827CDCA82DC42515BEAF46CE9D9ED524BD00EBD3094F770B1E1DD09FC431E4C244D2305619DAE208E65EF385EA92F5A79F12B99AFDAEA79C9D8D319944AC6CBBE3F1290EC6B87D97785E059E6871FDF239BC404021CB52064B88EB4CB3FB6A871B0F76C12D7B8C5E8FE0A65024AB5B25F4C67B6D15C22B0005B754CF7CBEC898B49F4326F1AE4034E5F5A446A96CE08083D48525A3661E10C996DD22DC34FE570A4C8817D10D750FC5C2ED0C24C7CBCBA5CD1B2680DBAA3315FBF2BA7457ABEEDC96B5D111110D4678EA5C7851D25F258926B0B028365799E940A6E17BB03CB332FBC6D713DEA7108FC6268C8D33E7A578C94FF75BE808C15FF7884F092C0E309F1AF99B1A7314FA0F32C8D8E32B3E9D92C9C8FF6B8FBB99111529C4BE3A2A4F62884373D0903180B4DEABE613DE5CF19415DFBA7F9A46297AE2F21D7EA420B41F628FD8DEBA55207606539D11791623CB325F1E18C98AAC27283BFAB2408F4FD6CC58EC9E306643BA1C0C77D84B3930263E5A76A1CE94F3D7721F0098D54E6C990C3AFF69B6A0D82C853EA2AF2D3D2B3E96DAD59FF873171B55D16CA9A7C68DAD2E918174D264919DDCB4B9D01CE622D56C599BF60711C74315C918A7BB97B9513937AFB6A652DA68B6B0B34E316D7BE9F5C282A5E8773C892782EFF220667A6A54069C37B88EB1CE676AAECF2015E59FB7AF4D30C4625DD8DE4805F505E83C877CD61D2A0BA65B32B0DBDFBACFC88CA43E4DDF7A1A4517DCE83B7B8ACF8DCAAD28284039747935865DAF8DCFCA29FB676CE2EBA2C509CD75588FA5E58CEFD0694626C9BB31C3AFC372ED313C9BB3ADC398E89DBDB108DDA63F9380EBF9DA17B378451634682F9823E209BF10E39F884ED270413152025CDBF4875C121B1E83E12C044453FFDA6D8CA2C240AD522577C6898AB6F2ABE1FE77F860939408CD193E605F87FF2248FA163AC2FC0F39BFC38503B23F5441E0E364CAAAB890073266B3B51217661F5DF41C0BA925BB425AB3DD7B6A3675B7D60D0290131EAD53A4EAB0C66BAA83F2FB77E74C3C123ABA7731A3F62FAB8EAB2A96E8BBC911E501CD23A088E7887A469284E0B5C27B5CBC1DE2B6938CF1AF58A47FE78141306CB76E8F2B73620BC4549DB6826D2D72873885F6C5311EB5B9462BB4631D314DFB9C836C6F4D9EEC6818940C04689CC4D8D11ED9869355617861340E722B2BE78197746E2759AAA8D68D1965888E89B6B0F5BF51F94E586B2CB8708F4CDB520BF31DDCCFB7CB69E29A7AE8AAB12C11F431DE40FB9E82EB5F2B6BA1F9757F1487B63255FA69A755601C2FE17CD1892D5A6799C35D05098DC133BDD71318667D47C4671 + +count = 69 +seed = 272E459EAB6A0BDF720E4C5B79E641C95BAB66C3CEE261D0E3596BB04D232ACE0A1CE24BACCAAE9037665A962C711B08 +mlen = 2310 +msg = 62215248E1F3AFB19849F758D742F8AFAB595040C4DC520D603C9A80FA9CF2E97E4F4BD7350551FB667D606BDC31A45D88836CD376785C01F9007D47DF95C1F4D1E30A927A13525409D91C9F5145C0B86D3B44E933CA81E4ED9559AC17940C61EB85B2D26D2C47924AB80ACBAA3D9B1C8855C13EE45F5C8047C161AAA5321839A01783B21A5EE90CF91B8285C4779465B7A89DE3D74D482080F68EB2D8B47429D5475356C50A92B3ACBDEA5786F4D6C2A304AB500490F84FD1D0F21ACBEA325D62D2657F3889B6F591A7F63D8633C061CB14B8266A7FE17642DEDF1D08D9FFE369126CD780D9F99FC6262B5BEFCFEF35D33498CB2CFFE55F2F8D567EA8687DFC6E7D49A61FDBFE768C1D11BF5B3B18CA52225B096490C97CB9A0B3B2CA0762DCC36B60F7D26FCAA4E38B1F3A6279D889323010D9CB0A97FC488E09B06237E6EB0166465C2CBC2B9CD06F155759B6C93CA0CD3178845E0F3A2D20A68757AAF3C4E74545494462CCF28F6F51EC0FDFF4F1E6D98FC5B63BFF068FA7BE1764BCF14497E71E424C9389C5DCF8C5CE1DCD40B82F1D75C3C3970DA433A92A04DE958766AC5EB3645F4D21882F7071383AF8DFFD6CDD91B549F143DCF59FED6674441EEB03D5013E90ADCCBD7E3DA115535AC855DBAAB7F51D70630DC00009E726A16DEADB12047D85906CFF315C73EE7D4E24C9067E3B772F3DCC44C25C7CB8622FDD7B8ECF5E9C877838D71D500F864A662619B1478F8AB4DB2DD09A111ACC99ABE737DDBCA06E88926C4E73B5F5D21EAFC4B11938FEEEA5F8D5A4C616A342B54C9CE371817AA2409A55A3237BE85A50F05B33D35AA86A62E85A01CF34EE7DC840A26FA1B8C6B307817C062D9A2E7163A3B036874D2ABF6531A772D4031FDCD59CA79FBF442CB9155F90148DC3B723778E699C6985634185C3FFDB966ADB80A3D1308150B12964142498466506BC0742783C27BD3472A5CB45021DE066C28143FFBC82B5742BE51E93BCFDE1A61E661B730D8760E108B80C859E4B3A07D483A6A8967E5F01B03EC8B63A20C6A03755C75F419558878A5EB8BB0B2120F183E4BECD4A104EB4DB62CACF5F9964583815334A25BDB75724E549211699AC3BC9B2B5F58F1FB33429905DF81C9422F8B84E95A7C36DEC6AE9B48D4F502D8AB59B69E9D112693578D143A3F111EF00844303950F65DDEEA6E30F1286DE16546F90C4364A5C09755AF3FECB13983C418B2FE4AC17BDDA57E4D597E8BDCCBFBE4082C446FC920E5145BBAFC67FADD9799CD8C7714510DA579516ED39B3E22DE319977FC77A9CA61AE8252795D11724AAA866C1FFDBCBC1FF91AF1B8713248864A4E8B9C59DD12863245F5048110DEDE7FE31FF9836715886C37E9642DBD6C668BA7AB8C2B706CDD58586EB7227B5768C3509C1F66493468859E275700EA38BA69064179F6036D7B50BD232B61C9B9659492894C0057DBFB80329A76CDC57B2A89BBB910483301CA0BF6AEC7D5DDF86644FF52F48FF6C7CD00406CACBC09AA251708BAF3276A52BE2C7B42FB6A9036C318529CA98940769A67DCD532C0000AFB5FC63AD2303E94E09D2CB40CCBE47FAA1DD22ECF528179AD40FD4BFD43717864149243D61CA255344C52743200ED8385A7CA6CCA24CF967D23D07DC2A3F9AD5F3240F4F022A6C6CD281B6C492E8D144A2F4641957ECC65B32C9F74BB468524FF58F0F3DA2F5A56742896CC8F99088574264F857DC67CF04C4B63C6A08FC534229CA8BA616CD504F969EA6E3C98A517355F98A9E884062805B77623239074206E01AD2F3FC9FE9FF8254A5D3525C3B2F0A692803500C967A2E18511EF5B8845DC4B0DEE9338C38C4B1B8B84EE63923250EB6F9E9C272617C7895BD538A6F34D3557812BBBFAB2B8FA6EB5E95B9BCE33AD3185CD90DD536A68639022C079B5CA7748864D37D45FA6780A45AA991F28BC0D3BF371EE2FF0C913CEA6DB38E4A278A4840EA1F255F8E83B6B6C5E260A49D727AA42095A88CB8120B51DAFD764E690102F7FA07CEA2EB86AC613E7BE2F498F5767B622D04E8A6F272976FB058C3334CF8CAAD1D180E3456C210763C974E431CBC3E25EAD8B9FF9243628D5B08D92CBF1D5DF29A85B1A04D2999B3C669227B33610121D543CF4A978F8D9365C0FF8AFFA92B07FC8C8604A0F357F3C669445685B6A29898301A5AFBE10ACE8D64A47009C8741D7CE82E9900643900A3B92A26FE5F24886C06AE0918C3F2523C320699C799CBF72F0DDB08A0F1F63D6DC2F021C78A9D44503209190EE4BE654663679CFD292292D71FC4BA6233A196EF9E95CB965852773404B2622B565BD91FCA6747AAF7F4EADED7BD3BB53645381B687AE04B8D8A9BEF1095EEB39A0BEB4EA89BADB4655A1AFC7EECB7DA0D670C192297CCE0B31BBEFEBFE94C84603BA8C0B7CC73159FF59C01A037CF2C866DC40D88432CD6C2F1989351A4E41343CACF7BF2C2B395C863709D6EC1DBAB2AF514CC771DF14DF095DEA8284BE2B65097D8E6F72EF3936595384AFC0026956E819F1657C901B92644E9D6D32D0D95549729B2CB3D5EFAC9C42A5F284ABC3BF5CCA5B08161B09D9A48FFB2996C3D4383D65B8D1F7FC3248CBE84B9C05464F4A76EFA005FEC342EDD56959CD26CB0DAE1B61B0493A4B68EB3D6335BBC280508F09D84E0C5F4EF520D92CD34D69E5BAB76DF5D2B72CB41A298D370EBEEFCD6C1904B956458BDA581EFA6B3654BE402AC3A971603F23F2B543C5BEEDA5F018543B72C146CF04680BCEA31B4A238460329E2BC12F14C804FDA3494C15452223D2477C9C8A497D04EAAE7DE09D7D7A879D3A5DBA565AE1A38F15E69C18838C487C0FBAD44A068C42EFB7D3F5EF488F91C42F25AC564751F0EFE0ECE7D98BB1B3D0FC42C9756F4B8F9DAF1FD0D414391155285C8DAEAAF380BD07E43570F14E9A47A87BC733F1E676233F17BFB71AAE464AED68487392D339AE064AE27BD57F8695F493AE56CA96C0615BDA8DA37133DD13C2B21DA189A7329773FD8D51381BC118645440B28FA4F402EF84C4091D3A0BC4D206BDCF9007F5DE9AA1E6CF7F6058AC6B69FBC703E908C4221F9065147766E48F54BE4B076406E2F9ED19C1BE982E636FD02DC26267C3ED989E6AD1CCE62E7B988FA7C1831E5126111A4C3C29C38A1F96CCB3A04132175FA46F73C634AC6EC741B135645ABF1DCEA18571CF9A539F5CC935BC6D32BEB1C7B8B3B5A141146EBC12DBBCC17BB4900CF0B95EBFAA52190AFC6D8933CAFC9 +pk = 9DAF24D679D57297F1B5A98E1AF35636B42CBE88E29C9AFDBFBDB51404EE8E1419A73BA5002946D2FE49DF09B106BE7373E76EC2C011391B7F1CE1C951BA8101FAE1E5E92AA579F7372FF496BF01D33A2B9AE8F6C7494F33AD945D930C8A44D22AE3170B6DECFB45189F68ABB4D245329CA239A25C6F5BBA3AF3F20CBF27AA0102 +sk = 9DAF24D679D57297F1B5A98E1AF35636B42CBE88E29C9AFDBFBDB51404EE8E1419A73BA5002946D2FE49DF09B106BE7373E76EC2C011391B7F1CE1C951BA8101FAE1E5E92AA579F7372FF496BF01D33A2B9AE8F6C7494F33AD945D930C8A44D22AE3170B6DECFB45189F68ABB4D245329CA239A25C6F5BBA3AF3F20CBF27AA0102EF8D61EE8723D7F0C4FAD42584E0459C4C65C0EFF611E208EA61F6B42B99BD3630020000000000000000000000000000000000000000000000000000000000007AB90588BEB9AC779B36E2674994460FE6175C797BE0A35934734CC7FDB21DD519FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7389995B17B618CA23BEDF8165B7649A7992713EBB54B84AC881D78E6E252D2BD2FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003D0543AF86B6BDE0D9420804F2C7216FAADB941EC03EDFD822E406F6BCF997DCA63D58B4F95AEB52893523B852934D64B0735FC205FD3C991EFD2D93292A0E911957D544A3A3C02D89D64E83EA7E349BD7489F20757674B097FEA209FA33CB11F855A9C155EE55E6142C199B07DD234B4D2DF9CC4191EC31437614311908A4B57F60ED44116EA61FC1FFF9D78C540B0968CF0CB63C54A4C8CEEEC27F77D2B2BEC3C6AE9068870F5D883936D219D3AA7179BB88BE0F47229CFF7FD850066362174E6F014E7AF23E04587827725071EFA32BE552665331A5BFFEE651234938C8EC49DB77E682A08EB774A8619D907953DAB6EB9986318E3363FEB72604 +smlen = 2602 +sm = 0D91298C1BB89546C5BF9B197EA21F9F6A4B9B8059B65C0DCBBA7F0FAA83CA4DFA740AB119502B56D44E412F522D7B3341621DD6BC049E7D2486777E4FF537016766DB314FA9AD950AFCAEA1D48A46A1C9EF115EC8A132E3B70BFBA11EB91C26D0E31D2312EA610C0F43CA91421889603B35CE0F68EE1E757BB48A0683BDC30000031FEA9728728601EDBA4DF977337CCB33D7D61C22A861B49F7334AD1323A79B6C8366EE058AF3ECE5C80B13BD968F34F651628B36D20A0F90AB411BD20A073C1EA21AB80607565C5A4D944788CD049E54E36DAEB8F763FD4944FA7AFB924FA069E299D93DB0C7852237886EFC19F5EAB54F411DD33D555289371C0490C1EDE10BDAA7D748A3129DAD84899F8E04D981B6C4969A81637C71F4A29EC597FA227600020B62215248E1F3AFB19849F758D742F8AFAB595040C4DC520D603C9A80FA9CF2E97E4F4BD7350551FB667D606BDC31A45D88836CD376785C01F9007D47DF95C1F4D1E30A927A13525409D91C9F5145C0B86D3B44E933CA81E4ED9559AC17940C61EB85B2D26D2C47924AB80ACBAA3D9B1C8855C13EE45F5C8047C161AAA5321839A01783B21A5EE90CF91B8285C4779465B7A89DE3D74D482080F68EB2D8B47429D5475356C50A92B3ACBDEA5786F4D6C2A304AB500490F84FD1D0F21ACBEA325D62D2657F3889B6F591A7F63D8633C061CB14B8266A7FE17642DEDF1D08D9FFE369126CD780D9F99FC6262B5BEFCFEF35D33498CB2CFFE55F2F8D567EA8687DFC6E7D49A61FDBFE768C1D11BF5B3B18CA52225B096490C97CB9A0B3B2CA0762DCC36B60F7D26FCAA4E38B1F3A6279D889323010D9CB0A97FC488E09B06237E6EB0166465C2CBC2B9CD06F155759B6C93CA0CD3178845E0F3A2D20A68757AAF3C4E74545494462CCF28F6F51EC0FDFF4F1E6D98FC5B63BFF068FA7BE1764BCF14497E71E424C9389C5DCF8C5CE1DCD40B82F1D75C3C3970DA433A92A04DE958766AC5EB3645F4D21882F7071383AF8DFFD6CDD91B549F143DCF59FED6674441EEB03D5013E90ADCCBD7E3DA115535AC855DBAAB7F51D70630DC00009E726A16DEADB12047D85906CFF315C73EE7D4E24C9067E3B772F3DCC44C25C7CB8622FDD7B8ECF5E9C877838D71D500F864A662619B1478F8AB4DB2DD09A111ACC99ABE737DDBCA06E88926C4E73B5F5D21EAFC4B11938FEEEA5F8D5A4C616A342B54C9CE371817AA2409A55A3237BE85A50F05B33D35AA86A62E85A01CF34EE7DC840A26FA1B8C6B307817C062D9A2E7163A3B036874D2ABF6531A772D4031FDCD59CA79FBF442CB9155F90148DC3B723778E699C6985634185C3FFDB966ADB80A3D1308150B12964142498466506BC0742783C27BD3472A5CB45021DE066C28143FFBC82B5742BE51E93BCFDE1A61E661B730D8760E108B80C859E4B3A07D483A6A8967E5F01B03EC8B63A20C6A03755C75F419558878A5EB8BB0B2120F183E4BECD4A104EB4DB62CACF5F9964583815334A25BDB75724E549211699AC3BC9B2B5F58F1FB33429905DF81C9422F8B84E95A7C36DEC6AE9B48D4F502D8AB59B69E9D112693578D143A3F111EF00844303950F65DDEEA6E30F1286DE16546F90C4364A5C09755AF3FECB13983C418B2FE4AC17BDDA57E4D597E8BDCCBFBE4082C446FC920E5145BBAFC67FADD9799CD8C7714510DA579516ED39B3E22DE319977FC77A9CA61AE8252795D11724AAA866C1FFDBCBC1FF91AF1B8713248864A4E8B9C59DD12863245F5048110DEDE7FE31FF9836715886C37E9642DBD6C668BA7AB8C2B706CDD58586EB7227B5768C3509C1F66493468859E275700EA38BA69064179F6036D7B50BD232B61C9B9659492894C0057DBFB80329A76CDC57B2A89BBB910483301CA0BF6AEC7D5DDF86644FF52F48FF6C7CD00406CACBC09AA251708BAF3276A52BE2C7B42FB6A9036C318529CA98940769A67DCD532C0000AFB5FC63AD2303E94E09D2CB40CCBE47FAA1DD22ECF528179AD40FD4BFD43717864149243D61CA255344C52743200ED8385A7CA6CCA24CF967D23D07DC2A3F9AD5F3240F4F022A6C6CD281B6C492E8D144A2F4641957ECC65B32C9F74BB468524FF58F0F3DA2F5A56742896CC8F99088574264F857DC67CF04C4B63C6A08FC534229CA8BA616CD504F969EA6E3C98A517355F98A9E884062805B77623239074206E01AD2F3FC9FE9FF8254A5D3525C3B2F0A692803500C967A2E18511EF5B8845DC4B0DEE9338C38C4B1B8B84EE63923250EB6F9E9C272617C7895BD538A6F34D3557812BBBFAB2B8FA6EB5E95B9BCE33AD3185CD90DD536A68639022C079B5CA7748864D37D45FA6780A45AA991F28BC0D3BF371EE2FF0C913CEA6DB38E4A278A4840EA1F255F8E83B6B6C5E260A49D727AA42095A88CB8120B51DAFD764E690102F7FA07CEA2EB86AC613E7BE2F498F5767B622D04E8A6F272976FB058C3334CF8CAAD1D180E3456C210763C974E431CBC3E25EAD8B9FF9243628D5B08D92CBF1D5DF29A85B1A04D2999B3C669227B33610121D543CF4A978F8D9365C0FF8AFFA92B07FC8C8604A0F357F3C669445685B6A29898301A5AFBE10ACE8D64A47009C8741D7CE82E9900643900A3B92A26FE5F24886C06AE0918C3F2523C320699C799CBF72F0DDB08A0F1F63D6DC2F021C78A9D44503209190EE4BE654663679CFD292292D71FC4BA6233A196EF9E95CB965852773404B2622B565BD91FCA6747AAF7F4EADED7BD3BB53645381B687AE04B8D8A9BEF1095EEB39A0BEB4EA89BADB4655A1AFC7EECB7DA0D670C192297CCE0B31BBEFEBFE94C84603BA8C0B7CC73159FF59C01A037CF2C866DC40D88432CD6C2F1989351A4E41343CACF7BF2C2B395C863709D6EC1DBAB2AF514CC771DF14DF095DEA8284BE2B65097D8E6F72EF3936595384AFC0026956E819F1657C901B92644E9D6D32D0D95549729B2CB3D5EFAC9C42A5F284ABC3BF5CCA5B08161B09D9A48FFB2996C3D4383D65B8D1F7FC3248CBE84B9C05464F4A76EFA005FEC342EDD56959CD26CB0DAE1B61B0493A4B68EB3D6335BBC280508F09D84E0C5F4EF520D92CD34D69E5BAB76DF5D2B72CB41A298D370EBEEFCD6C1904B956458BDA581EFA6B3654BE402AC3A971603F23F2B543C5BEEDA5F018543B72C146CF04680BCEA31B4A238460329E2BC12F14C804FDA3494C15452223D2477C9C8A497D04EAAE7DE09D7D7A879D3A5DBA565AE1A38F15E69C18838C487C0FBAD44A068C42EFB7D3F5EF488F91C42F25AC564751F0EFE0ECE7D98BB1B3D0FC42C9756F4B8F9DAF1FD0D414391155285C8DAEAAF380BD07E43570F14E9A47A87BC733F1E676233F17BFB71AAE464AED68487392D339AE064AE27BD57F8695F493AE56CA96C0615BDA8DA37133DD13C2B21DA189A7329773FD8D51381BC118645440B28FA4F402EF84C4091D3A0BC4D206BDCF9007F5DE9AA1E6CF7F6058AC6B69FBC703E908C4221F9065147766E48F54BE4B076406E2F9ED19C1BE982E636FD02DC26267C3ED989E6AD1CCE62E7B988FA7C1831E5126111A4C3C29C38A1F96CCB3A04132175FA46F73C634AC6EC741B135645ABF1DCEA18571CF9A539F5CC935BC6D32BEB1C7B8B3B5A141146EBC12DBBCC17BB4900CF0B95EBFAA52190AFC6D8933CAFC9 + +count = 70 +seed = DCC58DFC13B035323ED44BE50A7096F697C9C143518FED50A59181160960203831A9904847BA20B85E99FFA63E4AB0B2 +mlen = 2343 +msg = 954511394B9D10E1BA162861802A717E24EE42A346C9ED280C88E267A41EC09D6D73B6076E7E30257BF265B71A0B6E0CF408F02BA9078811BE94D0F38559E9985463FC9671D182286CC4F18CABCAEE1A3E5ABDBC384FB27911168B54A387171C0524489FDF512E4D8D2F65050CFE7405D8DF63A79C6E42A76F4538907EFF4DC5870095241523F56FE8E389EBF1A1CC47DDB9F0188513D5259BE257BDA5BE7381F22392CDC2406E0F2448A80F3824F2670F61920C667499DE899F0F6B397381A2DE66255E061AB92CD864DE75C9DB7CBAB9FE76AC38E0AB3389530B4004055268B289B40D79B32E5EBCC74353510BD1627E2D5DD0BE7D3DFD04138F6E3EE7526133DC70490612EAA5024BE6FBEFAB24E1E83D8941A113D8B871F3DBC3011869174888CB7A265D7DE9AB99B999C19AF9B442EBDC904FEDAB52CF40B787AAB35626417C5291F2EB892F43E698A8C65CBB6442A4832F33920FB2DBFC50B8E996FB227F2FF294C385A330957D2FADA9F86839235EA79ECDE6D9D94FBE7C79A38D40B9A8F241F53B921107FF1C72624C9600EC04DFA1160F1FA9E5D986A5A363E9CE8627276DA73F5DB47E4B90328884CFE93194CFFA6FA680F77886E4A7A0FDAF13A7DDFF6984B8855E1F58235BABFD5106338FE2B075D4F10A9FB3D3C5F829B7C61B02B34E9BDE6E62CBCC3AC9F467A6CA170EB43E632EBDBF6847F781E2469B4740FDB83DA34CE34A286E3B363A72CBB13EB66CE1DE35D8FD77DBEDBF45C44DCD16E6B58A1699694D9006947C8C20810E85E3EBF8FB2C68B967743642D86556AB6958E545AB83EC24B96F2B4BB99CC8890C3C1E0FECCE26CE09B6D99000694F870AF9F642374FF0BBF61EFC7CD5AAF5667FC3FE5745DFAF7F13FED70FE070EA4C09CB1A92D8B7F0DFD4B4A4B7DCF4CA6A97043BCEF6346F1570F37B0EB48DB8D15C8A82ED69B0C7833D6C830414C111C987471E84D2CEB5BD973DCA34ACD3A65D7B1A502368941935435B78B8F2B74C2BEF127D96651247BDBE68EB7E466B9EA2A64A13C375103D7C8F7D30A13CBE184BD1EBB19F3274E645F5C7B82EFDF09233D8AD146DC0715266963FD3CCE6F8CDEC20743BF1B7F57C101AC24C64D568923203E1A6AF03A700F5A401EC4572BBA528E284C151F1D108F7563858011FAB32B3776CF2B910D7B21180DBE75742032791018258F4D1407C9A213755C5C91205352DF919B6F14BE056243DF6AC2909E52C9A79F6917440667719185F1C5F1AAF40D873BA22956FA0BBAD9C35360853333A10A0841D9D2E758A0B1BC187F6BBD31C41B74F9EEEF1F7A28BDB7AC3D52FDC6FCB3EF0383A06A61188548963E552716D2BFBD6C2DCDE496D06615E86A5CDB76A03BCA2822ABA85EC6807EBB6918AD2948D193CCF74F4BDAF7090CD4294C1785DCEDB6B55886A848284A6A4A88A496800053E84A9F2DBF6B334AACE11A5A540626716302E259A64C6316ED543806B3BBFE37563897E83BBEFA570312DF908C1786DF0FCF55069EDC336501A5AE9D4BF212D56A9CEE811038656912238AE284575EF8DE1285B763AE54ADF44F91B6DD9E309B7A7A0AB71EC2E4611831B3CE1C9DC85CF907B52DF7406B06367E7A43DECE72DCCC57D268820EA021C27056E3C6B50E7BA7A59B53539A6B7B06B35051E3151C23F3BD3C889B25D0ECE1FD0DF1AEDF657FBB096CA1C861ACB0158501EA1AEFBF6DAD11BDC325AC1CED3739A40B7A83458EF4F3453C0F6EABC1A48037809A90480DF9DC4FF07DADDC58DF2733D49A4FA53C2A41E55A4A0167C6D33BA6E752AED3A125DFD6A0322CD235254505D7B3CED7A0DEE7EB662ACFD30F8B79D1A872998CBCF15CD86E26809E0D2DA0324DDC90FD12CAF9D8E4EDA437FE4E658D47D67C95927C4B5DEE965B940CE93E6743917296E10820A7101F8F633C93069E8B569F4625AFD4EC61BFE4549FDD06C2290A91AC0FB40CB1F55DC8BC1FE695C73AF603840AC0351F5256E00555C984E79A09E58C566D1A117B7E569BEB5850FB491FD9B982442B55BDF53832AA65180DCDDC2F768B1A1361994DE8C25F3608EC853D5982E0AFD1F9FA70170FC3589DDAF958DD840B4B502F8E2697D01AD7AC2233F6A16D540EF8D232887D2B4FA727AE2F038A69AF3DAE69EDA8EF6BF1E0B67D811160B75231543EC5A4D0778B7B42FC1DD6732385AA4400450B3CAEEFDFFCF147635CFA4AAA53DE4EE3035BC40CE8670016384BB877A86A15B59F3DF0C5D624D3D2B23EC46913618C745330A96C715C6F0BD096487E89B917384CC30B3D20A332F1B4056462227E98AF9874FF1D18DF2A6BF84AE822EE737F9E34EE8C69F23EEB9BF38ED056F499545F405759355C104284A6D08A9EFAD8FE28288B2084336A6479A6D42404F3E6FF3AD1DFC63C8AAE971AF11F2699F32F57AD29188492CE07BC1A271035B4D13A686EFDE5572353283A0F3138F6DC05CC35E5E5057C5C8B9E12B0164C0915ADEDF40A6E23848FA59ADC0E65BDD2120486942F232315FC94B4676751A35AAED2828889864C4CB7DD95A662A475733C2CA8F6997A9C822C6C8B9DC95A8B4C367E613E97D3EC6D6DDC2F81022EC21B3A93244E3BC8C2737A7724A3CBD480B26819EEB2676FD383601D79FA266ED3F9BAC2A98FF0109AD7E43E33E108D88C09BA82AFCCCFE98F50F789109D99DCD0A2C61947544F3666EDC621B5D5ECB7088B2430A611BEA52BE7F5EDFC6E2649F5E81F6DF72FA9A748BFF06AF766A60D2B751B23A8AA95CBF733359F7C0CD19B1482A6E6572D1570349C688D78CF8B8C7DD37576DC47A193A2C2797D0AF7504DEE303823A8B77204AE7B6E91D431979798A7EDF435056251D0E3F26B2CA16BFE3422CEA0398D30F0A0DC06DC8A93D27D13650E5BFB6BA04C93FAF0D7D06F99FE4F1F52A059FBE808179515FDA48ECA714F0947FE9A98F02D66FB0D80952411CDFCEAEF6ABA16D92B8F1B82DB151D7DCD7FB7781EC55F4A86C86011FBB9C5570EE76897E7803036E2FE3CDC2D5EA7A613897F3C69A6EA734E3811BFD15E90D7256A0C0C88CEB54EC6AAC151B435CD2A870E4A02087C2B847C75B00B44BB3CA6D4404C3052BD308B8D5F595277592D26F6D5A2193CD4D650BF931FEFB9DEEE61032B29EC0412F38E1CBE025B2891C59574C1450D9E3D8EF27940EF712143F06F38DDB86341A7FC781E0FA8971DAD13AA7E93F1858C70A71A40164211EA9F6A41AE90D19032C2EA52C23375CE3C4E59599ECD6855213AEA83F8DFC5CC70F58A62E4DCA17C09705C0C099B29056592986C03CF5D67074735F2BEA +pk = C2EC3391F39A55EB2CF1B8C3FE856F54732F10A9A7B10F97A5A84A28025271F4D5287CFEB9B0316D0AA40312B334E6020F8E1BDD8E08AA0BAC948B2BBFCBE5001A704665FA704EB927473D420C3A55F2FA457B5105C0775B8E4045A1DB954CB799C52406F95F7CC3A1C4DC32AE0A1A0D5712605CFCD529902718262FB8D3A90002 +sk = C2EC3391F39A55EB2CF1B8C3FE856F54732F10A9A7B10F97A5A84A28025271F4D5287CFEB9B0316D0AA40312B334E6020F8E1BDD8E08AA0BAC948B2BBFCBE5001A704665FA704EB927473D420C3A55F2FA457B5105C0775B8E4045A1DB954CB799C52406F95F7CC3A1C4DC32AE0A1A0D5712605CFCD529902718262FB8D3A90002A55E1BC6C918A16197A792CE9A680B808A1F145B86137E181F72974EDEAA8288630000000000000000000000000000000000000000000000000000000000000042D53E8DF24AFC400E1D7089ABE6E746F32EF3DD4E3BFBD8CC6D322509871EF475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9767FA21790BD78924DF5B0ECEA6454DA2757DB274DD34754E5390578D942672B3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026156E8AC156135CD3ED60EEF3D9BFF32E346F96A91D02FE69D4FC5CB43FB0B9BDECA6ECEE47C42F0E70A9A8251A946038445134AEDD53C110C6860F7D2103DFBA0FC917AF92A2185F697B619E3C2AC46D5D00DD99D345EE142EC8FD9230272EBD5DB28A9A2EF64D2801AF860F123AE4427AAEAA428E1B007AB73E63670A0B8A28379013BF9333B17FA29F0E0B4AE32CAB2563FD3C3822611DBE35FE2C58F7CC237695C4CE56B1466B5856B98043582E4977A5F654DB736A69401A4A094A9D7DE06817B4828E7020068FE722C6F7B17A5F9B662A08AAFC0E4C79C6CCBF379902EC2DC36CFE9302F053D7E59459AC466DD0783F5DA76855CC45E1C904 +smlen = 2635 +sm = 9A01CD0166471A026121EA4B71024A5E5D04154C9A123AE56F9516666F6168258D44256161BF6B4EF69F74774A5816855428C9290100CD8DC770C391941DA5001FC0C84058974B756767B71B74043770512E980545D6B82D47E47194BD84C891B15F15BC9573CFA241AA1F345D627987720FFD2DB511F666730C524FBA981D0100012BE3D3E1316D3D6E940E6F851B463BDC03505B05973ACA8983EE9E59665899571194703357974DDAE41596CB55A6AC07276850220495539DDDF9284E7D3F3008FBEFC21C58A428B9ECBAD394494FF5EB4F275E437042D356D5C68DB190948645DB3FE330F7594E68C9A6CCB188CD9E81577960C28A7A90B6EA119A3F6CE1D059564C82418A7604BC10A70537AD8335F6C4258AB00C9038EBC92DB02B32E01F000411954511394B9D10E1BA162861802A717E24EE42A346C9ED280C88E267A41EC09D6D73B6076E7E30257BF265B71A0B6E0CF408F02BA9078811BE94D0F38559E9985463FC9671D182286CC4F18CABCAEE1A3E5ABDBC384FB27911168B54A387171C0524489FDF512E4D8D2F65050CFE7405D8DF63A79C6E42A76F4538907EFF4DC5870095241523F56FE8E389EBF1A1CC47DDB9F0188513D5259BE257BDA5BE7381F22392CDC2406E0F2448A80F3824F2670F61920C667499DE899F0F6B397381A2DE66255E061AB92CD864DE75C9DB7CBAB9FE76AC38E0AB3389530B4004055268B289B40D79B32E5EBCC74353510BD1627E2D5DD0BE7D3DFD04138F6E3EE7526133DC70490612EAA5024BE6FBEFAB24E1E83D8941A113D8B871F3DBC3011869174888CB7A265D7DE9AB99B999C19AF9B442EBDC904FEDAB52CF40B787AAB35626417C5291F2EB892F43E698A8C65CBB6442A4832F33920FB2DBFC50B8E996FB227F2FF294C385A330957D2FADA9F86839235EA79ECDE6D9D94FBE7C79A38D40B9A8F241F53B921107FF1C72624C9600EC04DFA1160F1FA9E5D986A5A363E9CE8627276DA73F5DB47E4B90328884CFE93194CFFA6FA680F77886E4A7A0FDAF13A7DDFF6984B8855E1F58235BABFD5106338FE2B075D4F10A9FB3D3C5F829B7C61B02B34E9BDE6E62CBCC3AC9F467A6CA170EB43E632EBDBF6847F781E2469B4740FDB83DA34CE34A286E3B363A72CBB13EB66CE1DE35D8FD77DBEDBF45C44DCD16E6B58A1699694D9006947C8C20810E85E3EBF8FB2C68B967743642D86556AB6958E545AB83EC24B96F2B4BB99CC8890C3C1E0FECCE26CE09B6D99000694F870AF9F642374FF0BBF61EFC7CD5AAF5667FC3FE5745DFAF7F13FED70FE070EA4C09CB1A92D8B7F0DFD4B4A4B7DCF4CA6A97043BCEF6346F1570F37B0EB48DB8D15C8A82ED69B0C7833D6C830414C111C987471E84D2CEB5BD973DCA34ACD3A65D7B1A502368941935435B78B8F2B74C2BEF127D96651247BDBE68EB7E466B9EA2A64A13C375103D7C8F7D30A13CBE184BD1EBB19F3274E645F5C7B82EFDF09233D8AD146DC0715266963FD3CCE6F8CDEC20743BF1B7F57C101AC24C64D568923203E1A6AF03A700F5A401EC4572BBA528E284C151F1D108F7563858011FAB32B3776CF2B910D7B21180DBE75742032791018258F4D1407C9A213755C5C91205352DF919B6F14BE056243DF6AC2909E52C9A79F6917440667719185F1C5F1AAF40D873BA22956FA0BBAD9C35360853333A10A0841D9D2E758A0B1BC187F6BBD31C41B74F9EEEF1F7A28BDB7AC3D52FDC6FCB3EF0383A06A61188548963E552716D2BFBD6C2DCDE496D06615E86A5CDB76A03BCA2822ABA85EC6807EBB6918AD2948D193CCF74F4BDAF7090CD4294C1785DCEDB6B55886A848284A6A4A88A496800053E84A9F2DBF6B334AACE11A5A540626716302E259A64C6316ED543806B3BBFE37563897E83BBEFA570312DF908C1786DF0FCF55069EDC336501A5AE9D4BF212D56A9CEE811038656912238AE284575EF8DE1285B763AE54ADF44F91B6DD9E309B7A7A0AB71EC2E4611831B3CE1C9DC85CF907B52DF7406B06367E7A43DECE72DCCC57D268820EA021C27056E3C6B50E7BA7A59B53539A6B7B06B35051E3151C23F3BD3C889B25D0ECE1FD0DF1AEDF657FBB096CA1C861ACB0158501EA1AEFBF6DAD11BDC325AC1CED3739A40B7A83458EF4F3453C0F6EABC1A48037809A90480DF9DC4FF07DADDC58DF2733D49A4FA53C2A41E55A4A0167C6D33BA6E752AED3A125DFD6A0322CD235254505D7B3CED7A0DEE7EB662ACFD30F8B79D1A872998CBCF15CD86E26809E0D2DA0324DDC90FD12CAF9D8E4EDA437FE4E658D47D67C95927C4B5DEE965B940CE93E6743917296E10820A7101F8F633C93069E8B569F4625AFD4EC61BFE4549FDD06C2290A91AC0FB40CB1F55DC8BC1FE695C73AF603840AC0351F5256E00555C984E79A09E58C566D1A117B7E569BEB5850FB491FD9B982442B55BDF53832AA65180DCDDC2F768B1A1361994DE8C25F3608EC853D5982E0AFD1F9FA70170FC3589DDAF958DD840B4B502F8E2697D01AD7AC2233F6A16D540EF8D232887D2B4FA727AE2F038A69AF3DAE69EDA8EF6BF1E0B67D811160B75231543EC5A4D0778B7B42FC1DD6732385AA4400450B3CAEEFDFFCF147635CFA4AAA53DE4EE3035BC40CE8670016384BB877A86A15B59F3DF0C5D624D3D2B23EC46913618C745330A96C715C6F0BD096487E89B917384CC30B3D20A332F1B4056462227E98AF9874FF1D18DF2A6BF84AE822EE737F9E34EE8C69F23EEB9BF38ED056F499545F405759355C104284A6D08A9EFAD8FE28288B2084336A6479A6D42404F3E6FF3AD1DFC63C8AAE971AF11F2699F32F57AD29188492CE07BC1A271035B4D13A686EFDE5572353283A0F3138F6DC05CC35E5E5057C5C8B9E12B0164C0915ADEDF40A6E23848FA59ADC0E65BDD2120486942F232315FC94B4676751A35AAED2828889864C4CB7DD95A662A475733C2CA8F6997A9C822C6C8B9DC95A8B4C367E613E97D3EC6D6DDC2F81022EC21B3A93244E3BC8C2737A7724A3CBD480B26819EEB2676FD383601D79FA266ED3F9BAC2A98FF0109AD7E43E33E108D88C09BA82AFCCCFE98F50F789109D99DCD0A2C61947544F3666EDC621B5D5ECB7088B2430A611BEA52BE7F5EDFC6E2649F5E81F6DF72FA9A748BFF06AF766A60D2B751B23A8AA95CBF733359F7C0CD19B1482A6E6572D1570349C688D78CF8B8C7DD37576DC47A193A2C2797D0AF7504DEE303823A8B77204AE7B6E91D431979798A7EDF435056251D0E3F26B2CA16BFE3422CEA0398D30F0A0DC06DC8A93D27D13650E5BFB6BA04C93FAF0D7D06F99FE4F1F52A059FBE808179515FDA48ECA714F0947FE9A98F02D66FB0D80952411CDFCEAEF6ABA16D92B8F1B82DB151D7DCD7FB7781EC55F4A86C86011FBB9C5570EE76897E7803036E2FE3CDC2D5EA7A613897F3C69A6EA734E3811BFD15E90D7256A0C0C88CEB54EC6AAC151B435CD2A870E4A02087C2B847C75B00B44BB3CA6D4404C3052BD308B8D5F595277592D26F6D5A2193CD4D650BF931FEFB9DEEE61032B29EC0412F38E1CBE025B2891C59574C1450D9E3D8EF27940EF712143F06F38DDB86341A7FC781E0FA8971DAD13AA7E93F1858C70A71A40164211EA9F6A41AE90D19032C2EA52C23375CE3C4E59599ECD6855213AEA83F8DFC5CC70F58A62E4DCA17C09705C0C099B29056592986C03CF5D67074735F2BEA + +count = 71 +seed = 270BEDAA7BCD43990FD8B4F44FFB63A3AE8E991BB2BF84DA7BC2CCD1A079C579AEBE2082ACBAB7FF286DE795F31973B4 +mlen = 2376 +msg = 326A4FE723BE9363ACFC000705A10B6CD8A7B25E99A34B4A354CBD6F50550BED30F6C4208490B4194AB79B24B093FBE132C299DF924F2FFCC2CDC6C2C9019EEDF4B72D7F0817825BD787135927102E1DA041E9A78B501B42DCE777A79ACE604E57DF11775D7B87E75E5B00ADAC90D1ADD78CC5AD348C7472EEC6E6E06F737E77115A9509A6AE6570F738DC2F21314A7CCB9D44ADD6E1434CDFE3614BC73A6B468F6691B60F4F2DB103289A90C4FB2BF5AAF87826D2BEB0880FA64E07E9BD30D4EDA00D6BDA01D1EB22BCF14EE797A859C9A0D9034E8C5316201AF91388C47E1DDF061C9F45E067A5F60B355C98F8734559B8F1B82F47BD9CEE0224A1D67D40706333523C34F3582B6C8CB47BF7D0E4FBC7D7CF3DBF21077E664FD59998338F4DD4A423C3A145EE1E994AACC1A48F81A7E9FE106008DB93A6626B8C8505043AB864D93AE3972675E69C3825304086AA3419216CCAE7F7D5117739E99D8F4A0B658148DE33FDAAEB9967EF56677D2028C3B584C5CC1C096F4DA16799408B2EE2FC3482AD2F49293CF4097A78492470099BDB90BCB4FE3B245AC8B3C53E05D7609E34770ADCC147033A8FADE81359FF63C3FB90C5A498C98B7A0E5EE9CF4D287759ACDA4BFA3965CA85E1D1C1019E7FE6D82E5E66A717F94890277E6DB1EAA6F3291FE1BCD7D437094749FF5574B8728E0DC21A143A14E382937EFB7EC1B0FB3F6F9C0F547F470E3B436DFC7986F923BEAA89583D8978C433E0CB0C4E98516AF1AC797C778662455A57FEF45BA2C7865C1DF5C502EDB01C8CC729468091BB96BE9DA9C298528187867EEE9A06141DAA15F60CF719DE2BD15010550B92A41F12D8F38B54692589AFF51A9D5E6047A0D9B707369992251DF31341A45B01B05FFED8ADEE5810824F903EA59F14FD500AEDAE797F8BAEB470C0B14C4EDA5C687E4848A85B30A8E8F59C45D4C9F0C65FCCB15F4D4209A55722C29B6CB09AECB4E53FA3AA602C56EE3BA6900CC12889E7B87D5EF283AF1586764519A30CF60833C82F0ED15E39A8BCAD5C6AEE9999E63D399C5CEA10AE1F53B04858EF7896AA29FA541451FDB685734C39470250545193CAF26C9891F7F965904AE10E8566BFF9B2F465BBE13D6EA4A79586E68844B9FA68B2F992565C8B0EF5FFDEB5878CC12A0571CA3AEA50ADD29DD06E13741A1AB215BF487BE7735D1634332F47E037253054A21E0AD8D8F011334CB5951F833D4D344D632BCAB7C373CB7DAFE8F3D79E7E13BDB1C6CFFA474A9FBB46F5736D55F3466534596EBD22B29107A8FA50C1D0E62F0533E343FEE038FC0C3040A6DF2D318BBC8420019B1B148D6D1DD2FE428C2FD617CA73F224EF9AF9BF6F83CF1006616235471B69DD4EAF9F32529EF3E1DFE6765E61E246B519C702351C9CD66C57065EC78993D793B082E3685EB06F2530B07862277D339A52813C99EBE16C06C4C8F547D9705850E770982E8FA0275A52F430FF2422A115ECE46A9202CAA0195789532B1444F1507AAB2E4303464E499989F21C7D881328F18DBC77D4B9B467CAE244A93053C0321DFBF815DA28B6EBF483EAFBE634E9947BB5383FEE3A31BC03A63FCDDA5E3E46D5D3184718C348A83975728714351DF43BAF91787CACA346DBB819602F18A4C4FE90C4CE307984BCDED89CD2E4AEB66318C10D95AFA5BE53393FEB981C21BB1411BB9C58818BCC141223D66ED5F35F90C05FD4848617220DD72F5E892292CE20AA9A0F9AD54022CBE94D2C86DAF3FC66949AC35D8E122B02E2D155E73F4CE24D7E85A5C301DCC173CA8EC090AF9DC7F443C983280DDA27ED4B9BC71F86E84F7AEE39E6A7E9BF5E43920AAC858F0F49A06216D9D3984CD2E3575C0FA6CE8A5E28B0F481CCBAAB450FABCE8A1084EF458DBE257CF09D8116136C2CF1EDFA6CCE31AED0F1F8278C1C8D9C79846886D48E3FD311C015BF2373F7CAA71AA26B011D0DF5A843AB53D7E7F0466CCF49C5D4DE872CA87B8895101EE0147A3DBD391BEED75FC16F65814D56CB29273A5F4E5400FCABF85040505C31D001DF0023726E9C1F7C29A37039FDDA73B9B99ACEC3A029F7C0DD61ADE7D5E835E1CD605AA8E583BF8DC99285E86CF91F4B4827A0E8956EFDE2B495A86F85E78B954341CF3AFEBE8DB71C26B9B1BA27B47284AA84E55B1C2AFEE733AC596A10186D9AB504F33E34A06CA931D7633462B04B9B2B0D4751B0343503BCB2A1893D944FBDB4BE63DE167348A1588E6551FD9CF2101B0B4CB61422655FBEB50D64CB9E87A23007A39821EC3ABA391485347624EFC3DFDA4A133C537D7CD8C3A549BB6BEF9A52D2EDF0A8892C6FC3EEC3EFC3C18741C85BF24CD3B36CA04EE77F654ED5595A0E4B9316CCFE4D2AA6B4A66B06F309337E363C9E39829C8838729F19811093DFBE962246473B7A19FAEDFDB0193F63EB85EF308CD3BE5831F35CED36D9448D0EA8306044F78946079210CF89FF78104BCB2964CE2AF9954D53885D7914E4FFA4AC7E9B3D103922FD1AD68C0A4592F885C5FEE51D52214E17035E8681086203B79B5EB176679EB3263B44EA7287262DD84BB98F6639B9657AC04E397D69C634A0C1181ECA485E467D62631AD2D9AFD5AC5B86ED4005FDBB7404B65BBB826F1A2334A481B9CD46E0CE9C414A162E84368089F24149D7D05EA6ADF40B25A708357AAA5A28801FF100F69252810188CFC6087507BB5BDE1CD43BF72B1B3207CE4F7E65A18E5276613D4BEDDAF21AF7B964FF69965C47CB03846F7CEDDD2C5133080FC632A4F0B3495B2D2751727CF7681F28675552DF2A0994E425A922BBFCF84189B8C9F43058D691DB3166C596F6BC480EFDE06BDAE7B9C2985A1F2F6441520620E193D7B94AB46DBA2A1ADE44E2B006734E6770F34B0E2122DD7F4EAF045164DEA8C2FECE7758630384C00A6B528A6ECF07045B2DC0281C936A540904733149BC65B0F57ACD9A5E41C2ADF83FD6A760B169BEEBF04644DB1314270ADF86D01CC2CD580C609E78BBCD9D2694A89F9CB6DD36B9AA2AA5581FF561B5417BE2B52F3EF2581E461CB0690782F33862C52590643BECE0A6141DC805D8F56C4F64C1BBC49A3ECF1E8827926796E5F9335DF47DA6D3E4C14795B547116FD1F3351FC55C28B543183FEAD8DF7DA4DFBCC38E224901FF7BD83B16631064CAC4A37FA632F53F004374AA19861FDCA515AF91E66186EF804366D5A1B3B4FAAA60A0C4B36B972A9579548B4CDACE7EB85F1F68A4E4255FD994C1786975E7F6F0BA87D0295DE72876BCE37146A09EDEBC0164B9C4911CE41EF4D48130A27651BD0DC315FD622CB6D03759D35756806332658B5B33E768860C1946569AA45130486AD49B +pk = B7DC0AAA9BEBD78AC4E5B404C52442BB4C1189A89C2EED0BDC87DD05AFEF4A8BE95552B1E13B8C10800B5CA339EA77D96E5427EB5115C4697D2874FDA39473002A9EA343F3DD38797D32B57E1734158ACA6AD80AD8A9763C3058A230126675334E769B43841E15FECDFDACFD5E4E0B68BEB3E8B67026309445280E42F49CD8000B +sk = B7DC0AAA9BEBD78AC4E5B404C52442BB4C1189A89C2EED0BDC87DD05AFEF4A8BE95552B1E13B8C10800B5CA339EA77D96E5427EB5115C4697D2874FDA39473002A9EA343F3DD38797D32B57E1734158ACA6AD80AD8A9763C3058A230126675334E769B43841E15FECDFDACFD5E4E0B68BEB3E8B67026309445280E42F49CD8000B599F6B77391E43061B37FF89D203E70A987A98FD2952DCD4CF1F27D09E9B9382AE030000000000000000000000000000000000000000000000000000000000005A442713C9A31938DF3520010581C63254BF20C15FCFF57A4BCCFBE0FFA678E93AFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5474B2A87F817E73DEBF1B7E437D0DFBE86021660E78662CD37AC00813DC26691FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008B2361AA2D7A9564889760C938B98855779174E12DBF39B69ED9CB923F7689626550FE7FA951A6578B0E5AC6B87A266E02C44D42A7F487E471540A7C517407890C3FA1309E95C9DA4BB5E43ABB1344E3A1956666D9ACA9545BF7B824800A4DD5838842C21C80C0883AE19077823CF2E42E75FF52D1FC5502A62BFDEE6D01B3ED5E7E6DC504EBA6ECEC7E69754BB2D05AE8AD7D8F07E31ACA2CBCC5983EB4819018CB3D8158979D75E47A248498EE1DDF7CBB84C0AE58802275D7A5E30B9EB5445456274858930A0F1A3C4DBC6413DBB8A2265CE5EB312DE17881A748DD3ED2BD043ECEA27A79B6CDE999D62746EE85D7AF7075853BBD17BAC70BF506 +smlen = 2668 +sm = 9DE20B3488719A9D40A54EEF13D74562647F17D001ADB341D557390F0AE55F866EB5DC107F27C7D7230BFFDDAF236039E752CAA516E1B141FD0D7304BF316601C89A363D90F5FEDFDB6C3CA73AE05036E09ED664DF8E9E905BEF1F3E0D7A684C2724E49CD4B297FB5A2F8A32AD9DF00DBC89381BEF9DE11971FADC12284BAF000003F9038B4A985536413AB8658E00AE937B7C9612BC99C43780F379AAC28978D2081A209DA588FD990BF97DCEB558AEE6F3CB1A87458CD2E70A883C213DAE36B536E8ABBA13F25C225E92DC4EC03862D428997C86C765F76E84E623A4A89E6AE700781B1959ABCFB7879E8A95691DAEC4049E898DA95098E21E12F11C5DA1F4F7264C4B78F6739A70F5DE207808B284CAA44C695F6E417BC72174B27A41CDF00500090B326A4FE723BE9363ACFC000705A10B6CD8A7B25E99A34B4A354CBD6F50550BED30F6C4208490B4194AB79B24B093FBE132C299DF924F2FFCC2CDC6C2C9019EEDF4B72D7F0817825BD787135927102E1DA041E9A78B501B42DCE777A79ACE604E57DF11775D7B87E75E5B00ADAC90D1ADD78CC5AD348C7472EEC6E6E06F737E77115A9509A6AE6570F738DC2F21314A7CCB9D44ADD6E1434CDFE3614BC73A6B468F6691B60F4F2DB103289A90C4FB2BF5AAF87826D2BEB0880FA64E07E9BD30D4EDA00D6BDA01D1EB22BCF14EE797A859C9A0D9034E8C5316201AF91388C47E1DDF061C9F45E067A5F60B355C98F8734559B8F1B82F47BD9CEE0224A1D67D40706333523C34F3582B6C8CB47BF7D0E4FBC7D7CF3DBF21077E664FD59998338F4DD4A423C3A145EE1E994AACC1A48F81A7E9FE106008DB93A6626B8C8505043AB864D93AE3972675E69C3825304086AA3419216CCAE7F7D5117739E99D8F4A0B658148DE33FDAAEB9967EF56677D2028C3B584C5CC1C096F4DA16799408B2EE2FC3482AD2F49293CF4097A78492470099BDB90BCB4FE3B245AC8B3C53E05D7609E34770ADCC147033A8FADE81359FF63C3FB90C5A498C98B7A0E5EE9CF4D287759ACDA4BFA3965CA85E1D1C1019E7FE6D82E5E66A717F94890277E6DB1EAA6F3291FE1BCD7D437094749FF5574B8728E0DC21A143A14E382937EFB7EC1B0FB3F6F9C0F547F470E3B436DFC7986F923BEAA89583D8978C433E0CB0C4E98516AF1AC797C778662455A57FEF45BA2C7865C1DF5C502EDB01C8CC729468091BB96BE9DA9C298528187867EEE9A06141DAA15F60CF719DE2BD15010550B92A41F12D8F38B54692589AFF51A9D5E6047A0D9B707369992251DF31341A45B01B05FFED8ADEE5810824F903EA59F14FD500AEDAE797F8BAEB470C0B14C4EDA5C687E4848A85B30A8E8F59C45D4C9F0C65FCCB15F4D4209A55722C29B6CB09AECB4E53FA3AA602C56EE3BA6900CC12889E7B87D5EF283AF1586764519A30CF60833C82F0ED15E39A8BCAD5C6AEE9999E63D399C5CEA10AE1F53B04858EF7896AA29FA541451FDB685734C39470250545193CAF26C9891F7F965904AE10E8566BFF9B2F465BBE13D6EA4A79586E68844B9FA68B2F992565C8B0EF5FFDEB5878CC12A0571CA3AEA50ADD29DD06E13741A1AB215BF487BE7735D1634332F47E037253054A21E0AD8D8F011334CB5951F833D4D344D632BCAB7C373CB7DAFE8F3D79E7E13BDB1C6CFFA474A9FBB46F5736D55F3466534596EBD22B29107A8FA50C1D0E62F0533E343FEE038FC0C3040A6DF2D318BBC8420019B1B148D6D1DD2FE428C2FD617CA73F224EF9AF9BF6F83CF1006616235471B69DD4EAF9F32529EF3E1DFE6765E61E246B519C702351C9CD66C57065EC78993D793B082E3685EB06F2530B07862277D339A52813C99EBE16C06C4C8F547D9705850E770982E8FA0275A52F430FF2422A115ECE46A9202CAA0195789532B1444F1507AAB2E4303464E499989F21C7D881328F18DBC77D4B9B467CAE244A93053C0321DFBF815DA28B6EBF483EAFBE634E9947BB5383FEE3A31BC03A63FCDDA5E3E46D5D3184718C348A83975728714351DF43BAF91787CACA346DBB819602F18A4C4FE90C4CE307984BCDED89CD2E4AEB66318C10D95AFA5BE53393FEB981C21BB1411BB9C58818BCC141223D66ED5F35F90C05FD4848617220DD72F5E892292CE20AA9A0F9AD54022CBE94D2C86DAF3FC66949AC35D8E122B02E2D155E73F4CE24D7E85A5C301DCC173CA8EC090AF9DC7F443C983280DDA27ED4B9BC71F86E84F7AEE39E6A7E9BF5E43920AAC858F0F49A06216D9D3984CD2E3575C0FA6CE8A5E28B0F481CCBAAB450FABCE8A1084EF458DBE257CF09D8116136C2CF1EDFA6CCE31AED0F1F8278C1C8D9C79846886D48E3FD311C015BF2373F7CAA71AA26B011D0DF5A843AB53D7E7F0466CCF49C5D4DE872CA87B8895101EE0147A3DBD391BEED75FC16F65814D56CB29273A5F4E5400FCABF85040505C31D001DF0023726E9C1F7C29A37039FDDA73B9B99ACEC3A029F7C0DD61ADE7D5E835E1CD605AA8E583BF8DC99285E86CF91F4B4827A0E8956EFDE2B495A86F85E78B954341CF3AFEBE8DB71C26B9B1BA27B47284AA84E55B1C2AFEE733AC596A10186D9AB504F33E34A06CA931D7633462B04B9B2B0D4751B0343503BCB2A1893D944FBDB4BE63DE167348A1588E6551FD9CF2101B0B4CB61422655FBEB50D64CB9E87A23007A39821EC3ABA391485347624EFC3DFDA4A133C537D7CD8C3A549BB6BEF9A52D2EDF0A8892C6FC3EEC3EFC3C18741C85BF24CD3B36CA04EE77F654ED5595A0E4B9316CCFE4D2AA6B4A66B06F309337E363C9E39829C8838729F19811093DFBE962246473B7A19FAEDFDB0193F63EB85EF308CD3BE5831F35CED36D9448D0EA8306044F78946079210CF89FF78104BCB2964CE2AF9954D53885D7914E4FFA4AC7E9B3D103922FD1AD68C0A4592F885C5FEE51D52214E17035E8681086203B79B5EB176679EB3263B44EA7287262DD84BB98F6639B9657AC04E397D69C634A0C1181ECA485E467D62631AD2D9AFD5AC5B86ED4005FDBB7404B65BBB826F1A2334A481B9CD46E0CE9C414A162E84368089F24149D7D05EA6ADF40B25A708357AAA5A28801FF100F69252810188CFC6087507BB5BDE1CD43BF72B1B3207CE4F7E65A18E5276613D4BEDDAF21AF7B964FF69965C47CB03846F7CEDDD2C5133080FC632A4F0B3495B2D2751727CF7681F28675552DF2A0994E425A922BBFCF84189B8C9F43058D691DB3166C596F6BC480EFDE06BDAE7B9C2985A1F2F6441520620E193D7B94AB46DBA2A1ADE44E2B006734E6770F34B0E2122DD7F4EAF045164DEA8C2FECE7758630384C00A6B528A6ECF07045B2DC0281C936A540904733149BC65B0F57ACD9A5E41C2ADF83FD6A760B169BEEBF04644DB1314270ADF86D01CC2CD580C609E78BBCD9D2694A89F9CB6DD36B9AA2AA5581FF561B5417BE2B52F3EF2581E461CB0690782F33862C52590643BECE0A6141DC805D8F56C4F64C1BBC49A3ECF1E8827926796E5F9335DF47DA6D3E4C14795B547116FD1F3351FC55C28B543183FEAD8DF7DA4DFBCC38E224901FF7BD83B16631064CAC4A37FA632F53F004374AA19861FDCA515AF91E66186EF804366D5A1B3B4FAAA60A0C4B36B972A9579548B4CDACE7EB85F1F68A4E4255FD994C1786975E7F6F0BA87D0295DE72876BCE37146A09EDEBC0164B9C4911CE41EF4D48130A27651BD0DC315FD622CB6D03759D35756806332658B5B33E768860C1946569AA45130486AD49B + +count = 72 +seed = F151196F55A9ED88F1663AF6BD24B2CB9DCAF3C9B313CD8F0A27639D3CDAE72EA90D60ED5C7C6AB697A06185E5A2E215 +mlen = 2409 +msg = EFC63DD588A7230CE08EFCFEEA534F5A0EB005480AD1D169C386E476715238526E936FEA7136E2D8AED60DE31CC91DAE4E764CE5F93624FA7F72B87562FB6AD8996B5E41FD478AF0AF8338A7FD9AA250EFD2F2D20364E8A88A8642E8E38F38583ABF8D3BE97F14C3EDE66EBF8EBC84385CAE646CDED8C5CE8F06910BA7FEC05D828446D558D6FED766FBA347DA2E84DA247C34266AA31C328804F4E3AAF6ACBB0AD50FEECCEC00D20B3610785B9F1BA06A0BADFB42A8F43DE3F7BAC36057EE0B4D2A15DB040A8903F767F7352995C8FC3E06ED1B1322587EEE5B31806192E04B09A7B433D08CB2A340942CB75C51E0F8409F907F69C5F8DC316A227942EDF7A458974FDA76C255FF4F1A85A352CD2CD2A21507E0F37451060D31D0847528B3ED5DA3E7168CBD0302F1B03842E63B3DEC6FB37357E37FC3CC26721F290726A47AB3D4DD8FD1778FE5133726C240E7B3E398F3D809C6C469680B9EFD25DBE890D6936B76A52F97AEF3F93872B76506A95685EECDCBCE203400D182252471B99B7F4C6CED4CAC8FACA7682D0DF07BC5904AAE042479855098CBC41534F0EF17F38F1BC8C272CF72C1AC4A5564DD132130EE676E7D7EC3CABB4E85AC81945C87DE08EC60CED3FA0AB3E83C18AE493A851434BFA2C4968B42ACCCF3609539C62A4E01F8BC159362E15EE91D8AA399D8BD8D67BA1E8FD646EEBB4583812293406B05BA5BE2B1DF9620E6FE3DAF8CEBD9652BB04494B899F407C7D9ED1C4E77FFADE24ABE56AD597BD438928E05B0363D6D2685D34D6B51D71012844415C46F13181B146A3AF25AE4E8853CC7C7EF6387306C45180A6EF9E97ABE1E7D5E10115752C3071B6A213367E8B1A3D1C3703CC1840735315623901D772C61D55EF8C47DB10F0EB7582D7A043018DC1363E93F315DD984B8002EA7BF5BED38D3F273276CA577CF99A635CB6ED9D6525520793405BE27C86E6EFFEABB1E5F84A0076BD151CAFC59853424DE4B3460C673B0820D76E15EE47B6505D2D5C179DB92A44042F3631C646D350EA9721B8984660A76018DCA5C6BB1223CD03CC844DC9371D32549D9D645F75D2683FDAD1DF6434BBE43200E506ED2A815FAB511172C70F99A85FA3970433E8955B2F9389F23C10141B5779A23B8671EAE8B91991B78F635FBE8E627D3E79D91FD1E6E90699640BA3AE8D7E4CF5145F1259CC76AE50B1FA150D8338A9450A5B6B90EEC9C94318BC78C9C7715A3EB215AEE6443540D211A0556813529023E5A581623CD6D19BEF0705A5F69AAD4833A57C308144E92899AC5683147CDBD279D5C3A55BBC5E8F8E26A158A3E42F8C5B858909B024B4BA4069E26DE66460FF4A7DC92BD54AC244007B6AC6CE07A31A2AF3323CB55F07B8F480D279308FE10F2DDB001DA6C4AA132B988AD03FB63E0EB06544571F5505CF377A81153D6FBD4FA2B7562074CFAF587CCF28DAC84AFA58809C0B296E0D2594D3582C28596F5AF7500E143BE7B49C63D04F49BBFBDF60B024DABA5533F945BA90659758E06984921EFEEF79604059EB808C9FE1BF9BC5351A406FBBA7F5D8FC9F891488E537DB14B216A0535C9FF7BF8D5C68A2453A8A48E58FA7BF6EB76448D6D0BD05BD4628C4B852A236A11BEC0F67118F1267CA42647F6F2303509094C9A7F3A07B2724ABD2D9B56B71FA7AC6CDDE456EC209BE76C419855A5151EC9EBF0E0CF1B86F4E8E81B8173960F8D1C8AFFED1AC7B818AF8E3BC092E2B209D693E80B11EC7DA39CA93223E1B47C6127E8AD40A78BDB0ECBFA1F39C84CB9ECDF960ABB39884627BC4105C53EE7BCA4802B92AF60241420CBB36C407F46CC2E953D7E3503CC82287A8D68D0E673E212173D80A12257ADD5256652188C00590DADCFB7DBB6B35507B853EA5FAD4F52E02230CB3D3BBDFC43EB74780583E8DBB851E0257117F4A39A6676586216220C1CA21DE16CDFE6E1CC99EA7C989916AD2FED4A8373CFCFF02207529BFFCB7B7601317450BF430BAC9CE111B0FBA8D7DE6627F863078D8E6286B2D34856426EA90FFD58705444D0DC12D4FEEAD0FFE543811E1EF306F40939922563832D06E6DEA7109087AC051A361EA9E755856FD4E51388BC7C40C63E0953C8413AB0CBFF70C466E15DE5B089D095E8EE8A64E929D26CA3B71EF0B2360AECDFA89284CCE08C666F4E0146362F0BB84B87A49FCF2324EBB96DD941F00E2586F7246436EB66B1E04AF84482D8ECD2BC8EF9955CBEC62AFDD754A7F235C7F3C41CD0B36A9024D426B7388D3C33A5A6E858846C0FB0D88BA5798C923F9B43D14A6661C65092D5C5EC0F97D84784FA336AE6EF57C7A5D04804B96D19849FF9074724A5FACA538E32C6EFAA5209317543159272CE50454FE1E7D068C8F5FF3797A66D5F87758627AB5D40EBE1FB7CE9D69287AE7A5F349A5DAABD8A8E7778BAA26DA0EB237034A3366448280237A165CBB303BE6B33C0F11C1E56C50A84384A0F6878F2A99B14CD3B6820ABD27D2011E0C37F8439BEDE65747038A5FF7F00DAEDA094331523CDB7E10F1063B64A584D3E9F0655268F89DBEF3EA3FA4C6E54FEEBF8F0046C6C811F0767CF6FCC9B3497DB05582774047A8DCFF6A0C1B5188076E64A9D5693195075F2A05E507A5A523EEE4537079F9E5E79210E4AF056D6624D45A0EBA553CA9BC92171451970102CAB57DCD89ACEBBD7025008325C61145264F42E4D14A76E5C2F1C129D4C054DA00501081617D1A27012A6E160750DBA73BECB5DC05105BFDE1F1D0CDC837355844B291B09015FD610628513C1C86EAD373730B99FCD4A552FBA07163CE9CF6A3D3AC0525593F0648256E8B33FBCF92AF58CE26D0F036E11230879DBB789507BCEEFD2960EA320236A224EA74DD2AAAC541664FA3EA9430D4FB09C878169A8AF1E7FD4BE5E7926CB0B6A352B25F452454474107286EDAA145C0A0573361522EACB618DD9C8B32BD1A8A5923F4C698CCA0139DC640C1D5D557CE889BB69CE32D85853DFBB0F34DA2CF18CC79472906B67F6BACBF287F31DE0B9E7A01A356EC9B64653CB922501EA1EDA940089BA0F293B667F482E92438805CD6851776CEA0920CDEFC4062C9B4E51F5AA1D7FF909CC2608B6F28CCF28D574BF67CE80D4DDCCE28F2ADE0162CB66894B5B2DA0EB975CD95EE7FE72FDA2736616C8B571FAC94BF8C64ACD1642D9431118F08A62328D99B2B9D90BBC915DB764C4935951A59C369C72060CD9F4273BDCA0C295294008C0AC3A149E8CA5E8BF21042F5F21C067147F3BB52B13975026A9DF7246AFB1D053670982AB316509F2850342913E1322758ED89DA02DD79126726B1C5566C1831CCB1D62B3E271875E62CDE0DF0715D404F95F580B63923F362D416F83FE5AD98EED584717FBC2CB7D1B00101200F4EB4CA5 +pk = FF341A164747518C6241B33555318E06D5E686703E89F47AE283E72927D95FBC16A83E4A249C5EDF0ABD7FC9412CB8FE07A69872EB00E06782937F9B86984501B91BCB2C16EBF592E4DB81DE6181D896DAF06161D6CED7207984091E082AB229C2B1E60D07C8DDA12A51DBAE076A0513C5E7C107872D2CBFD261AB84EC59350113 +sk = FF341A164747518C6241B33555318E06D5E686703E89F47AE283E72927D95FBC16A83E4A249C5EDF0ABD7FC9412CB8FE07A69872EB00E06782937F9B86984501B91BCB2C16EBF592E4DB81DE6181D896DAF06161D6CED7207984091E082AB229C2B1E60D07C8DDA12A51DBAE076A0513C5E7C107872D2CBFD261AB84EC593501132D96229CA6B724AE014D303ECF93D9D97BAB424EE7E9D5B0A72F1096E02123731901000000000000000000000000000000000000000000000000000000000000B66E137A7B11295253E45304A4F878788AC166DE729908C41EFD55FA4D5B305876FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBC51B19F0B20C9D949219482BD42694D23AF92BF112BF24C6D68C2AE30B35DCFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005F6CD4C689FC79EF48EB7686DD8CA84DB538141F10457AB953E5ABB1FFE200037124AB2037924BD6F0AB24789098BFC74EF8E1768DBAE6F3CD806060C9D008EDB089F2B1C193A17297089FD9F23DC57399E182E7CBFEACD58AF582205917D3D847FF81F4EDA6FD8C3E386264D588F63EF2262717ACD9836711BE0FB1370A9AB4EDE97DE86D73292849DE6760E4245AD9590BD2A33D4E08A0CCB587C8CC4C482611500B4EF0F43D1BD63DAA8AC86C4E8573EFF8828BDD503EE61538220CF526A6B237F4471C028CC28404FE64C4C88F75FB13872589B9A81701EB3FF20715507582FC682E95A977C15C970B7A4D21E0ABE0D36F2203C0F162DBF01F08 +smlen = 2701 +sm = 45C08FB2F9EF270556B72845F43E1C7A24F350391572E3F3055943F112E2045C31F3C64E454F9410C478863C15DAF96E10FC320F6DD31D27DF2619F45E48DB0010FA67F720BE48E16034754F3DB74C2EC881489E5E2AC3FDAF4847E18366FC05799CBB61E10FB0AAF0B9D5F5478A3DF54AB928A8BAE099E3923725CB632867000000FAB49E2DEE6D6CB3469A678AAF9D91A128B3AF595BEEA11E1A5FB7623826441C45E2CEE83FB2EABC1C69EBBBEFCDE3741FF72693DE9326C22858ED3E73B3FD1E5FD55180211F441C288C0AC8AC03E2317467FE7D04E162BC41E9301111C2B31057EA3943F62C7B6070BBC613F3308B87B33A8C3B54D398F2010326965D68AE351119BA1682314E0E03D9EFE94F04D85BFD33849CE643BF5337FB27CDE58B32000813EFC63DD588A7230CE08EFCFEEA534F5A0EB005480AD1D169C386E476715238526E936FEA7136E2D8AED60DE31CC91DAE4E764CE5F93624FA7F72B87562FB6AD8996B5E41FD478AF0AF8338A7FD9AA250EFD2F2D20364E8A88A8642E8E38F38583ABF8D3BE97F14C3EDE66EBF8EBC84385CAE646CDED8C5CE8F06910BA7FEC05D828446D558D6FED766FBA347DA2E84DA247C34266AA31C328804F4E3AAF6ACBB0AD50FEECCEC00D20B3610785B9F1BA06A0BADFB42A8F43DE3F7BAC36057EE0B4D2A15DB040A8903F767F7352995C8FC3E06ED1B1322587EEE5B31806192E04B09A7B433D08CB2A340942CB75C51E0F8409F907F69C5F8DC316A227942EDF7A458974FDA76C255FF4F1A85A352CD2CD2A21507E0F37451060D31D0847528B3ED5DA3E7168CBD0302F1B03842E63B3DEC6FB37357E37FC3CC26721F290726A47AB3D4DD8FD1778FE5133726C240E7B3E398F3D809C6C469680B9EFD25DBE890D6936B76A52F97AEF3F93872B76506A95685EECDCBCE203400D182252471B99B7F4C6CED4CAC8FACA7682D0DF07BC5904AAE042479855098CBC41534F0EF17F38F1BC8C272CF72C1AC4A5564DD132130EE676E7D7EC3CABB4E85AC81945C87DE08EC60CED3FA0AB3E83C18AE493A851434BFA2C4968B42ACCCF3609539C62A4E01F8BC159362E15EE91D8AA399D8BD8D67BA1E8FD646EEBB4583812293406B05BA5BE2B1DF9620E6FE3DAF8CEBD9652BB04494B899F407C7D9ED1C4E77FFADE24ABE56AD597BD438928E05B0363D6D2685D34D6B51D71012844415C46F13181B146A3AF25AE4E8853CC7C7EF6387306C45180A6EF9E97ABE1E7D5E10115752C3071B6A213367E8B1A3D1C3703CC1840735315623901D772C61D55EF8C47DB10F0EB7582D7A043018DC1363E93F315DD984B8002EA7BF5BED38D3F273276CA577CF99A635CB6ED9D6525520793405BE27C86E6EFFEABB1E5F84A0076BD151CAFC59853424DE4B3460C673B0820D76E15EE47B6505D2D5C179DB92A44042F3631C646D350EA9721B8984660A76018DCA5C6BB1223CD03CC844DC9371D32549D9D645F75D2683FDAD1DF6434BBE43200E506ED2A815FAB511172C70F99A85FA3970433E8955B2F9389F23C10141B5779A23B8671EAE8B91991B78F635FBE8E627D3E79D91FD1E6E90699640BA3AE8D7E4CF5145F1259CC76AE50B1FA150D8338A9450A5B6B90EEC9C94318BC78C9C7715A3EB215AEE6443540D211A0556813529023E5A581623CD6D19BEF0705A5F69AAD4833A57C308144E92899AC5683147CDBD279D5C3A55BBC5E8F8E26A158A3E42F8C5B858909B024B4BA4069E26DE66460FF4A7DC92BD54AC244007B6AC6CE07A31A2AF3323CB55F07B8F480D279308FE10F2DDB001DA6C4AA132B988AD03FB63E0EB06544571F5505CF377A81153D6FBD4FA2B7562074CFAF587CCF28DAC84AFA58809C0B296E0D2594D3582C28596F5AF7500E143BE7B49C63D04F49BBFBDF60B024DABA5533F945BA90659758E06984921EFEEF79604059EB808C9FE1BF9BC5351A406FBBA7F5D8FC9F891488E537DB14B216A0535C9FF7BF8D5C68A2453A8A48E58FA7BF6EB76448D6D0BD05BD4628C4B852A236A11BEC0F67118F1267CA42647F6F2303509094C9A7F3A07B2724ABD2D9B56B71FA7AC6CDDE456EC209BE76C419855A5151EC9EBF0E0CF1B86F4E8E81B8173960F8D1C8AFFED1AC7B818AF8E3BC092E2B209D693E80B11EC7DA39CA93223E1B47C6127E8AD40A78BDB0ECBFA1F39C84CB9ECDF960ABB39884627BC4105C53EE7BCA4802B92AF60241420CBB36C407F46CC2E953D7E3503CC82287A8D68D0E673E212173D80A12257ADD5256652188C00590DADCFB7DBB6B35507B853EA5FAD4F52E02230CB3D3BBDFC43EB74780583E8DBB851E0257117F4A39A6676586216220C1CA21DE16CDFE6E1CC99EA7C989916AD2FED4A8373CFCFF02207529BFFCB7B7601317450BF430BAC9CE111B0FBA8D7DE6627F863078D8E6286B2D34856426EA90FFD58705444D0DC12D4FEEAD0FFE543811E1EF306F40939922563832D06E6DEA7109087AC051A361EA9E755856FD4E51388BC7C40C63E0953C8413AB0CBFF70C466E15DE5B089D095E8EE8A64E929D26CA3B71EF0B2360AECDFA89284CCE08C666F4E0146362F0BB84B87A49FCF2324EBB96DD941F00E2586F7246436EB66B1E04AF84482D8ECD2BC8EF9955CBEC62AFDD754A7F235C7F3C41CD0B36A9024D426B7388D3C33A5A6E858846C0FB0D88BA5798C923F9B43D14A6661C65092D5C5EC0F97D84784FA336AE6EF57C7A5D04804B96D19849FF9074724A5FACA538E32C6EFAA5209317543159272CE50454FE1E7D068C8F5FF3797A66D5F87758627AB5D40EBE1FB7CE9D69287AE7A5F349A5DAABD8A8E7778BAA26DA0EB237034A3366448280237A165CBB303BE6B33C0F11C1E56C50A84384A0F6878F2A99B14CD3B6820ABD27D2011E0C37F8439BEDE65747038A5FF7F00DAEDA094331523CDB7E10F1063B64A584D3E9F0655268F89DBEF3EA3FA4C6E54FEEBF8F0046C6C811F0767CF6FCC9B3497DB05582774047A8DCFF6A0C1B5188076E64A9D5693195075F2A05E507A5A523EEE4537079F9E5E79210E4AF056D6624D45A0EBA553CA9BC92171451970102CAB57DCD89ACEBBD7025008325C61145264F42E4D14A76E5C2F1C129D4C054DA00501081617D1A27012A6E160750DBA73BECB5DC05105BFDE1F1D0CDC837355844B291B09015FD610628513C1C86EAD373730B99FCD4A552FBA07163CE9CF6A3D3AC0525593F0648256E8B33FBCF92AF58CE26D0F036E11230879DBB789507BCEEFD2960EA320236A224EA74DD2AAAC541664FA3EA9430D4FB09C878169A8AF1E7FD4BE5E7926CB0B6A352B25F452454474107286EDAA145C0A0573361522EACB618DD9C8B32BD1A8A5923F4C698CCA0139DC640C1D5D557CE889BB69CE32D85853DFBB0F34DA2CF18CC79472906B67F6BACBF287F31DE0B9E7A01A356EC9B64653CB922501EA1EDA940089BA0F293B667F482E92438805CD6851776CEA0920CDEFC4062C9B4E51F5AA1D7FF909CC2608B6F28CCF28D574BF67CE80D4DDCCE28F2ADE0162CB66894B5B2DA0EB975CD95EE7FE72FDA2736616C8B571FAC94BF8C64ACD1642D9431118F08A62328D99B2B9D90BBC915DB764C4935951A59C369C72060CD9F4273BDCA0C295294008C0AC3A149E8CA5E8BF21042F5F21C067147F3BB52B13975026A9DF7246AFB1D053670982AB316509F2850342913E1322758ED89DA02DD79126726B1C5566C1831CCB1D62B3E271875E62CDE0DF0715D404F95F580B63923F362D416F83FE5AD98EED584717FBC2CB7D1B00101200F4EB4CA5 + +count = 73 +seed = C7ECD1EC1A3D83F5116C0AA4345FB3ADB4D9F81BD79896BC4932EE2F9D2D1F179BAF7A002D88F4F69071A7931E7F7FAE +mlen = 2442 +msg = ACB414EB55AE5E49107BD0AC5975544F83104F7264495AE0BF0A6D9594C422C16B99469ECCDFE8B8000875B469309891EA42586A615D146DE64FE59277A61631B2C7F7379CD52FAB3871BADE120EE9558D1479A91925634578CF14D35DF3B5672F8B5F9F956FA9F7489D6E37E207FE556017736F6B147A8CF664D0E0521D94737E18188A1B7C30296CCC9067E7B55D6E0F2FBD875F42FEFECAC49510E324968B07372DEB10A31C585457E0C48879CE44BC78898ECEFAC7BCEE90D0F8925DF2B52D5AC81692E0160F8FD5808645498428260F592E29BB90FCB07D0424EC79FB081840CB827CAA4A9D562183D10EE41D281E26CE3EC0069C83E1E446EF82E2E30DEBE3F409E0A9E6D1550E224DB15DBDDA44341E4ED6F8B8984716CA87233197528547D090058607CA141424A13145F1E896555288C5E2877AB3B51C7F9248D2D56A8521975BC4EAE3D009988CBD73C66931BADA0725FB8A3448D43E0C7364E9494FC4E295A700E79972E1FFD626D1CBE0199917851638B192EF9F5C03223F2BBD67EB59A5E8BAEC3DB40616938274201DEA1AE640F6EE7E047CC4C13F80DC65E3FCB5C62386015F4EF1BFEC561E121F9BFA9B2075BC1C4730503FDD5DEBCE8A535ECA01B9D5B021C290854B5F3D49EFFB263DDA34C4E96AEAE9E71A686C009B205994B46CFDF1F76727CA67D415B9D21D54312CDC6A8ED0AEAB96B580D0B419E2058E5D843C17C96D156549962F81C266233ED2B795FAC40B1992B626457F211F08106AD86F5702B9DEB9323A0970AD86125ECA836E0A3D6CCBC380D474049BD96EA246B8BD9542793A66E15B319AECE6BEE17ADBBA7DB337D25F8F642774030A2FF969CB5671F59901CB109E661E55FD5E75EB2A96DC37FEC76A82EB89D020B4916271CFB0CB3342494FDB62EA0D253FB8FF2E91357B33D96D41530B8B5E9550FE9B3F9F34FD5A2A1A6A8BEB93CCC322622F3B5E8487DE19AF57CBD1481ACE02779AD928B17A9B05CBEB722C783B088B5912C2D67CE5073F1801C23170DEB1EB6DDFFC4C33DD25F94F4FBE59D704E478FB49DD2142801C37ED8F539EC1782EBD2F3253BBE19C5A048B9EF41824A811119F3A6AD2A0D4B77338E001358C61A9794572B0C46EB1E0E575D4DA141A415829BA8712B791B625B1B0EA840EE745D9FFE1E99EFD782BA25859351F443654995102CBEFAD7E59D03C9A502ED7B77144D0566E4BFAC086A7DEA356CB9E5AC02DBF7E81D6CEED4A33DA8D801D61BAB5C01F259EE3A99FF7F6D7BF8F2160C4BC3F890736074B000C4C58FA4615880F93FAD43D5657C76045D7C414E6B85F63AAC91F04A616184E04FF9AAD513BA767215FB0331A369D36C0AE9B1EC1268F1D0B43C42B786DB23DD66465B3AF17FFC68C67964C2FC9E41EABC45DB68CD2C3D95B8BEC787D994BB8E9CF1DD7D4C563FCA5D80B3F1FE8E3C7BFB7D171F5B9023BFBCC0CF4371B63C856EDBDA154B4313C47983F4027F9E61E86DA1E8CD787E3E6B50E1DFC9201B9AB92059F8B6D1BF7856CD55C5B1D6C4E6EBF818D481C56F66C79444F5A6544A64A7D78EAD33EB805A6AC4310CD46A2331E707B9B0950CA12092402D68C1CC5C3F269DFDB13AB34B97EAB50B0745BE72BB0FD2D73BEA5DD37802393B635E42A0DEF8544A96E7F40A8D9D06B64E38DC406BD59AC5C4E218591D20B8DBA2125978096517EC5C03F9BC6F96CB255E216EF82D7C7C873029F9E1D98EBC0D8E1312B84B8D02E8D680AA56A506C8668B5B9C56D04CF68E37C7CB1B9377C867240CD42FC7FBDE0AC44E3DCCFD3F877C9923AE9CECE0CBDAB00CA530F434A33F1C939FB88ADEF4D12ACBD8B2B5A139A3FB776D8223A9846465C0372B8C3233FB5280E936BBE9FD49058961463A4419D939F4F1FEA705EB63114F0A3533638DC4D3EFD620147770AD877E2354299CEC6E5C18924E78DD661697ADF89A77C7365522D3E8FC0855187139F7E43E9A0629EE321B2CBD9F007B05C22EFF56FE48045686B36C5BAC2267F37A2E3D4E03E19B1E422ACEA31C2E9F3E7541976D4E2FA03119DF9C4CC2D5418F0FC7A467CD98E290695B9530B91D5DF8C626C7236A5C0FBA73578B9A47491CA0AD26A144B0F23EC23D2C5B2DAA03BF40130F14B9A427CDFF1F232C9CF02426228C570CF1FA7C00A773BC0D70858588542BBF8F581540870897BFAC8387CBBA3416A846CF9F4F5D3F9DCEDD080CC0DE9F71B93828B835430898E82896CD3F30FE2AF8349DB294FB2A8FFC0848692A0B9E8A66EBBFC0F896F8D03E3C6A0C27E0F2177B85A2F6FE31E8AAF14EA5C1FDC54E80CDE47AE27A161264680107023CFFA961E913C4E6AF96C0BE37AD859C334CDB8BBEECB5443662739D027EF1B9535A5A46E2169933E419454025623FD6779F54C622EF81AB9289B50758EA34F868EC85AEE589B08962B85CF537BC733F62AAFA95FD81A60D5C2E38D6EA0DF7D1390BC5050E2463E3E2E3A769DE2A94ABDEDFA0ED67CC0FFAFC5A05A3B0FD37BBE6967BED8DEBF02A42CDC80BDC62158E184FDB6672F7947505E2C0A6C7762B1145C4BAF30E3D32434D22707044DC99D2CF2D38F15C43ABC8632382BBBC9E0F106565906F7D4948D30FB19EDCC3748100397F71E1548E58A5A01876D0A12DCC80000224221C4ABD98A5022506D24BF4D9B9108991AD3421D4AB9CC393DCB8D744F97822F95CBB2640E73E401F044FE20253ACB8B32A75FEDA640E190454BAB695A23B14AE3EF60B00491AB22F622DAA89B6B2E6D18E735672FE0EB2DE269E4E386C926E23B865E1BA22DDA688293DE144102F7030FDE6DF653E4106C08C2467AD7C54D1DF0DC5981004876C6BAA8720F70942700A154A376C8D45DAE1BE74910148EE3F2733E591E1965FE763B58C8B28AF25E9B3C633ABD83F1C0A4F68DA2E0B85083BF97D4E919340C0437A604416C4F629B33039BBF2A1F561548321780411D2E8AC0EDAE76FC3A19F3C84C3BE902A1E84FDF69B11A12DC8B78EF257B5FBB5D923FFD548451A52C6A3AF31C70266AE8A957B2BD72A51A034A2921B8E19321108AC303B0D2E269D032C3DB13F21D558C82BA4158962F2210E1C5FDD96C98D6639AA844F34E40C1B9C909CC6AF1E97A8DC83B78C72B30B7AE400F44CA60AF37770B3D9147F7D6F5A327F34DF7CB8891E71D41D723CB18E0DD324E5CD22AE0D9F2B1D2BFCED0288B7AA73AF4FE0A8181BA1AA7EAE966D0A240E10FE5735D98326A106D16DC49F3FDB19D3A8449C56A74153655600E4C9E38D302C6D4080017D93C628388DF94860329BAA289EFA4587F079C6F03FA03C54540A0AB4B067EE46A5A346F2FBBFF6570ED0166A55C258EABD62AD90F060FADE84E8FAC799F7928285F58557A72E055B535D00BD9A4880D10C05C07CFE7A6FEADFCDED880521803E339F6EAE3FF28A0A471A003358F952320F41A0AEF9D28 +pk = 8199BF0B4BDD84EE48D25073F6E8CBA8911C996AD0E007B1F8B838557534185EA65E5149DC81D69A760621A00786D77D7294F089A8344DAF02B8B291AE3ECB0052BD2318905263C552D851E3635413610292C5D3EDE0043BBE890742E2A95575F1322CFED16C8CE47B8324268DF2A16C4F610BD45DFC6AED670C954968A1640002 +sk = 8199BF0B4BDD84EE48D25073F6E8CBA8911C996AD0E007B1F8B838557534185EA65E5149DC81D69A760621A00786D77D7294F089A8344DAF02B8B291AE3ECB0052BD2318905263C552D851E3635413610292C5D3EDE0043BBE890742E2A95575F1322CFED16C8CE47B8324268DF2A16C4F610BD45DFC6AED670C954968A1640002BD2244A867C7380043D410EEA77B514F1FAA6A62F3E13F6DE3470D25BE1A1627D301000000000000000000000000000000000000000000000000000000000000E0E469E7BC4B05A407A8B9EE9E2C7BF7E3A284FC0CE810A7FABA0B12CF623E0B6DFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF358B22AC84C2871C23B7868B407898E3186D83442E0602CD273758FECCCC8A3A09FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004654E97011AD386DEAC328988DDAED9DA3FA2E3F96781B7608351E4F8D34EE3F3A6F29E7EAC07338CF3FC3D9D5743A9A2EA852846D9AEE2CA02D2DF247CC0595C00180C3781ECD89923D080B7FE3ED18C5330D574CAB994DBF87B904AFB22D880753ED57DF8D3FFF09F9200E213E982238A8B2EB939A72F12104A2947F0723E42BDE8A8113B0121008A17EDBE742E2CDA9AB6AEAE210247B17001A3BC7A1C1383542F799D9D4063AD768AB5F4F5084690BD01219D698780977287FB60F949B2CEFC110B55F816AA14ABB812BB4E04EF7BFCF7E5708B2821F46155B0F4A57412A3CEDF3586F2BF6840C7E3D679837AA2E391B4D46841AD4B67FA7D204 +smlen = 2734 +sm = B45700221AC48776950138D9AE23BB2DD548E6E845DEB24A4F82DCFE04AAA00590C984AAD78A1DEB70E8E6D86C7D03141C9F92431246560F3523254A1DB10101E0B7D22A3BDDED84713ECA006255F21216961C5C177D93F75041340F9CA06F3C2CB1E528CF17ED619102D631C3F8254723DCD77D0DF32D18FC1F471AF96A980101022AF00AA3D5C28EA62C063982FCAC077A33DC6E25CCCCADC676DE4DFE415FE437AF9E2A73DD4FA84929E514B2A3279B400418BFD32E550F20105A21025C00FB3E36A7ECCF99415D99911C3BC110133E863DA58D0672E0367C944CC6E365507C0FFBE9EF9D7BF98A984D89F6F6859733066012E89FDFED85A58C6D80963D10AF1675624FD92490D849B48CBEDB60BEE50F1BC2678F8BA3C3E686141C22D1443D000906ACB414EB55AE5E49107BD0AC5975544F83104F7264495AE0BF0A6D9594C422C16B99469ECCDFE8B8000875B469309891EA42586A615D146DE64FE59277A61631B2C7F7379CD52FAB3871BADE120EE9558D1479A91925634578CF14D35DF3B5672F8B5F9F956FA9F7489D6E37E207FE556017736F6B147A8CF664D0E0521D94737E18188A1B7C30296CCC9067E7B55D6E0F2FBD875F42FEFECAC49510E324968B07372DEB10A31C585457E0C48879CE44BC78898ECEFAC7BCEE90D0F8925DF2B52D5AC81692E0160F8FD5808645498428260F592E29BB90FCB07D0424EC79FB081840CB827CAA4A9D562183D10EE41D281E26CE3EC0069C83E1E446EF82E2E30DEBE3F409E0A9E6D1550E224DB15DBDDA44341E4ED6F8B8984716CA87233197528547D090058607CA141424A13145F1E896555288C5E2877AB3B51C7F9248D2D56A8521975BC4EAE3D009988CBD73C66931BADA0725FB8A3448D43E0C7364E9494FC4E295A700E79972E1FFD626D1CBE0199917851638B192EF9F5C03223F2BBD67EB59A5E8BAEC3DB40616938274201DEA1AE640F6EE7E047CC4C13F80DC65E3FCB5C62386015F4EF1BFEC561E121F9BFA9B2075BC1C4730503FDD5DEBCE8A535ECA01B9D5B021C290854B5F3D49EFFB263DDA34C4E96AEAE9E71A686C009B205994B46CFDF1F76727CA67D415B9D21D54312CDC6A8ED0AEAB96B580D0B419E2058E5D843C17C96D156549962F81C266233ED2B795FAC40B1992B626457F211F08106AD86F5702B9DEB9323A0970AD86125ECA836E0A3D6CCBC380D474049BD96EA246B8BD9542793A66E15B319AECE6BEE17ADBBA7DB337D25F8F642774030A2FF969CB5671F59901CB109E661E55FD5E75EB2A96DC37FEC76A82EB89D020B4916271CFB0CB3342494FDB62EA0D253FB8FF2E91357B33D96D41530B8B5E9550FE9B3F9F34FD5A2A1A6A8BEB93CCC322622F3B5E8487DE19AF57CBD1481ACE02779AD928B17A9B05CBEB722C783B088B5912C2D67CE5073F1801C23170DEB1EB6DDFFC4C33DD25F94F4FBE59D704E478FB49DD2142801C37ED8F539EC1782EBD2F3253BBE19C5A048B9EF41824A811119F3A6AD2A0D4B77338E001358C61A9794572B0C46EB1E0E575D4DA141A415829BA8712B791B625B1B0EA840EE745D9FFE1E99EFD782BA25859351F443654995102CBEFAD7E59D03C9A502ED7B77144D0566E4BFAC086A7DEA356CB9E5AC02DBF7E81D6CEED4A33DA8D801D61BAB5C01F259EE3A99FF7F6D7BF8F2160C4BC3F890736074B000C4C58FA4615880F93FAD43D5657C76045D7C414E6B85F63AAC91F04A616184E04FF9AAD513BA767215FB0331A369D36C0AE9B1EC1268F1D0B43C42B786DB23DD66465B3AF17FFC68C67964C2FC9E41EABC45DB68CD2C3D95B8BEC787D994BB8E9CF1DD7D4C563FCA5D80B3F1FE8E3C7BFB7D171F5B9023BFBCC0CF4371B63C856EDBDA154B4313C47983F4027F9E61E86DA1E8CD787E3E6B50E1DFC9201B9AB92059F8B6D1BF7856CD55C5B1D6C4E6EBF818D481C56F66C79444F5A6544A64A7D78EAD33EB805A6AC4310CD46A2331E707B9B0950CA12092402D68C1CC5C3F269DFDB13AB34B97EAB50B0745BE72BB0FD2D73BEA5DD37802393B635E42A0DEF8544A96E7F40A8D9D06B64E38DC406BD59AC5C4E218591D20B8DBA2125978096517EC5C03F9BC6F96CB255E216EF82D7C7C873029F9E1D98EBC0D8E1312B84B8D02E8D680AA56A506C8668B5B9C56D04CF68E37C7CB1B9377C867240CD42FC7FBDE0AC44E3DCCFD3F877C9923AE9CECE0CBDAB00CA530F434A33F1C939FB88ADEF4D12ACBD8B2B5A139A3FB776D8223A9846465C0372B8C3233FB5280E936BBE9FD49058961463A4419D939F4F1FEA705EB63114F0A3533638DC4D3EFD620147770AD877E2354299CEC6E5C18924E78DD661697ADF89A77C7365522D3E8FC0855187139F7E43E9A0629EE321B2CBD9F007B05C22EFF56FE48045686B36C5BAC2267F37A2E3D4E03E19B1E422ACEA31C2E9F3E7541976D4E2FA03119DF9C4CC2D5418F0FC7A467CD98E290695B9530B91D5DF8C626C7236A5C0FBA73578B9A47491CA0AD26A144B0F23EC23D2C5B2DAA03BF40130F14B9A427CDFF1F232C9CF02426228C570CF1FA7C00A773BC0D70858588542BBF8F581540870897BFAC8387CBBA3416A846CF9F4F5D3F9DCEDD080CC0DE9F71B93828B835430898E82896CD3F30FE2AF8349DB294FB2A8FFC0848692A0B9E8A66EBBFC0F896F8D03E3C6A0C27E0F2177B85A2F6FE31E8AAF14EA5C1FDC54E80CDE47AE27A161264680107023CFFA961E913C4E6AF96C0BE37AD859C334CDB8BBEECB5443662739D027EF1B9535A5A46E2169933E419454025623FD6779F54C622EF81AB9289B50758EA34F868EC85AEE589B08962B85CF537BC733F62AAFA95FD81A60D5C2E38D6EA0DF7D1390BC5050E2463E3E2E3A769DE2A94ABDEDFA0ED67CC0FFAFC5A05A3B0FD37BBE6967BED8DEBF02A42CDC80BDC62158E184FDB6672F7947505E2C0A6C7762B1145C4BAF30E3D32434D22707044DC99D2CF2D38F15C43ABC8632382BBBC9E0F106565906F7D4948D30FB19EDCC3748100397F71E1548E58A5A01876D0A12DCC80000224221C4ABD98A5022506D24BF4D9B9108991AD3421D4AB9CC393DCB8D744F97822F95CBB2640E73E401F044FE20253ACB8B32A75FEDA640E190454BAB695A23B14AE3EF60B00491AB22F622DAA89B6B2E6D18E735672FE0EB2DE269E4E386C926E23B865E1BA22DDA688293DE144102F7030FDE6DF653E4106C08C2467AD7C54D1DF0DC5981004876C6BAA8720F70942700A154A376C8D45DAE1BE74910148EE3F2733E591E1965FE763B58C8B28AF25E9B3C633ABD83F1C0A4F68DA2E0B85083BF97D4E919340C0437A604416C4F629B33039BBF2A1F561548321780411D2E8AC0EDAE76FC3A19F3C84C3BE902A1E84FDF69B11A12DC8B78EF257B5FBB5D923FFD548451A52C6A3AF31C70266AE8A957B2BD72A51A034A2921B8E19321108AC303B0D2E269D032C3DB13F21D558C82BA4158962F2210E1C5FDD96C98D6639AA844F34E40C1B9C909CC6AF1E97A8DC83B78C72B30B7AE400F44CA60AF37770B3D9147F7D6F5A327F34DF7CB8891E71D41D723CB18E0DD324E5CD22AE0D9F2B1D2BFCED0288B7AA73AF4FE0A8181BA1AA7EAE966D0A240E10FE5735D98326A106D16DC49F3FDB19D3A8449C56A74153655600E4C9E38D302C6D4080017D93C628388DF94860329BAA289EFA4587F079C6F03FA03C54540A0AB4B067EE46A5A346F2FBBFF6570ED0166A55C258EABD62AD90F060FADE84E8FAC799F7928285F58557A72E055B535D00BD9A4880D10C05C07CFE7A6FEADFCDED880521803E339F6EAE3FF28A0A471A003358F952320F41A0AEF9D28 + +count = 74 +seed = 5DE03CAB3CBD81B8805A17E0FFC2105C3BCDC8D782EAAB161A15AAA543FED59353C1FBE03E7F36B955FC51C9B30F0C93 +mlen = 2475 +msg = 5F7522CE6BD0CE6321C27B9EAA6F572616201F283C5EC171D0BA47662C2320897805E1551ED438F3FCBDAF9DE6F3A19DC16FE9C167A65B6E52BCF512C919561B548496A4A80AF7CE25458A62EAE92EBF677872482D8647C30C12BB1F080C6B9A56560D64FAB73DB17487BBB007C66661EA9DDA14601AB27A100EF4CF4B7447E51418651C03211F8FB884BE91F3980FE13E00EA4ECFE6D54882059A436C90BCAD80E4101CC6C0754417545F2D167629F80A3C5FFE45C00AB2BAF0494D6C065872B03A987A5EE818B3EF11E47FE1747F49E2DB6A14410F0B1F9610A2D6114395EF6EBB231FDF71D595CC1171DB9C89D6CF202E42D4FB968AB8105FDDB2AACB15FAB8014B534CF468D77ECDE2072623B7002620B7AC3E78B62AD673FEEF9F8E97E91ACDAB171FD415B2D15605DDE00D074A770E36F2218F7130F13E91FA4C88DEEA7E854BCAA01B8458D40625A33E982F0955B83080A926EC240E31F0D9BF477EE3A016E146A3909683410D4D09ECDF32EAEF580402F0D416DFC082CF1362E8B79158BD57739AEE56DC41A549E534C7CCF3620C7D7D95B92994A747D5EFB8EC43CFA8189BAA9B75FD54694E512FCA388B71A5B9EA591AE9CFA34183DE59D284AB16B2EFFA4B26A24A0E615B38B83088A9827EEB5C29B419BC061B033E0E3FC809AFDD3DE948412677E0BB5136854532639F3CCB176D54EA1961B5C527EF66F4B3286A583E86208AEEB8ED07D9E6BF1BEB33995F76CA480039A6130775895F19E3CD4873ABE3BF2FA9DE81BF0CB04575DD6AE282720B152CF0EC6A4A04016DB0F3543D8272AE56B1152B02EAF22131420CB194021F97060D5CE52EB21B57CC93964DD21344786E3888617152D2ABD829799CE47D20158AA93F7DA85CA6146C5BB94B512DA053C35BFA8840CA43F6509A1477603FD50F5E4F9A7CF8D2369156989AD638D35D345BDC859C52688211BF7EF3F4AD4944657289406BF01DCBB49D560A11840EF35DBC0C7F9C96DBEA76300CF61997A87D70F5FF8C51AECA2CF0680B6FE8C4025E1E25B62103D248CDEE335F4FCD67597103362003206C507970EA6D78CFF4B68B44244019152DBF812675CF667E5E13C8596EB6FEA3903BFB25ED08F902722A37F8E460E37A03A2D6ADBDF79DA20052DE658390484B83BBAB28D039A303D7376BF555181680B7966C798A1C6CB215257E37739DE7B9706CD1CF3AB031F68C82D6ECFA507C104115040744D74A40C49245215639D0CF4A5A7A10098E9CE3564AC3C44F0683AE9D3094784D354DB1AF439BDDF63D5CCA668D8180264EFECEEAC0BE1B8E1C6418E45F9ED6C779ECF169143B034CD9F332989D445C83A8786398C507B9171B4D95728575539CBB29C5B804268D88F2B39AF1F9572B8DAA9FEEEF69C4A77DC64BF2DBB5E57F8B33AB151769B2D00010D67A2D6F188D6D5B35E5E1873FE2B327E42AFB8885A842D26C246F7C18E6BCDD6FA49B300C65A3822121E95004928104017CBCE2AB95ACADB9802BF4BB049B8E96468353D649654C6F69D774380A5A387D6414DC3000540BAB6ECCBAA088C1068CCEF20036E5C8342FD512F55E6794BF85FE15721D99A1BFEEDC218617A940C8C25D4DFAFEC677D2A719B2CDDCD302294B7FA41AEAB5606F859CC0D638AC94B99AC3EA48C687D278EEBEB396DC5BF2D2E89E880F76B533FA54EFD30D8EE38B34DC5F8AE62C637E9A7E85D99E011F62D261AB4D3DCEB98A8972D3482CF817EFF476B873AC56963BD60183B359713385BA82F6E24BE2D6CFEA6DBB4AD2E1B5B790EE54D23F64E740502E887629B346FC8FCCC3338D0F2921131B84590B32C7CB82CBA8BB3B81EF7BC5CB12F0AA0B3C6A5B2878DC4F868057C68460C71D40D4263AC5C8B8317D2D0B63403C7549439A9EF227268372EC3A54CF8EE97714BC4B55007F92B1A32238659EC1EE27D6F2987AB06FEE84C3AFDFA73240963F076A955BF3C19410E1DA6A19B3EA3AE2DD8766082D3295D35436597783DAFDADB905465D05FC21FA8AC2737A52FA8AAEFBD2ED83F12545C1FA3198FF225D37070694C9392738E89467EDB2DA3CD1734CE398E32BCB1FEA2E4FE1260A2D9F9EDC3607A8AC8A51D5DA36E99B31903025E0CB157FD2FF5B51C9191CC16A9CCB870B4060CFB0FD900AEF62738A58C5726F5164417F084EF14FC0953E3C6036B818C21CA3476B8CC5F8EBAACE257A0315031A03E64E7F749B9DF99BB56CEEBBAA4333BC7270EDEE90FA2715BDDC38D44898A41998B2374B6EE3B8524D3A385C03868EE9479355092C4D20EC32DEB51497F4FF34AE7E7EA4828C288F46E5148DE28A8C660EE132E5B5489833DC66205EC968B60DAB96C2A4452A7019BBA9FE3D19D5829129E2A9C75C39416AC8695145F2B62EB9468198CBD48D7670DDC6AF2F99F77E7ACD01A34EA8E0E974206FBC22656867D09807B980563E06A559B0C3A7E6F43CF8DB75B18C0F90C12FF3BD43ABCE7DF75D17E631C08C974322010648FE2E2BC940E6510FB8835DF8384EFF3FE6A264687256C6BC0A5F9D2DDF208171DB55C4446B03CF27796BC77E3C68D8F1252BE21877D7C53747404420302CA5AE1AB57E43B158BE8B707360A2F59D6A473F98B816FDE2CCEDD92385202C419278E8B840DBA4C05E9BB65F68AE2A635A29110329E8C0C02F6FB5EEE41ED225051EE975F92DA52F93EB1FD7C0A098F6D1421701537298651313514AD31CB333E9C5DA719BBA95E73878BA41F9E2512862A80602AA2DE1E1D086576531330CC7BB8F0CEC38050B3CFAE5C8B1D6CB849A579F2294F8CE80FDE5405BFA3E6ECB01D5117203A4523591AC4030397DE9FF81D5CC91AF3002590F5854E852B88667638B2D052F2A7852425C8EC026E48D9EF5E73D1993D7F3FD7F704760562C36D2278C9CE131EC6AA444D7B2EACA3EE888D9B2AE122688DCB35455E7DE31562BA618F1183308B30D07A5C34020546218101AD42AC5054D4703587FF60E860A60375FAB12734912058D5B0B06430FABBFE0C0B43C22814F56DAE9E2713325A31C682C13F008B9A3D4FFA8A454F0F64A9213FF2D557A4CBC64EC6E4ECA0A976CD9F27497BA544DBAA3E2ECA0F54C2634C719B9C3A2CE37BCC8158A880BAA72780F8B1D3494F589E2AF3044B4FDD86F4DB2DF0843EBD9F3518870F55488F41E234CE94E907A69D28BD83347702750DB1AE2EB1454CDCA37A8B5FC90091F548BABF489E57C8919646E977274FC972088A522FFF9F9306D2F0ED6C01FF92CAE8440D7F3526B8C186D5B96942CB08032886051DA2A9FE77E38BEB18F4FB25F1152EDF9D61347A00A844929976A327BE46FFD3E2EE0B6AB1014294EC5D40CF7071C36B11127FF90720596C1B3065E7DE8010AEA469BB4F4AC5A6EFD20591CEFB7B94B2006D85CA475FEE556F24CC41237C631B75EB594F8342DEB4F976D73AA46563C1AA6D0B605A16152315626BA08807DAA6025CF62B29176F3A85E4BCA483EFFEA7E5939 +pk = 315E3B59E0CAE5E5A5185A1A31F4F7C1F203B4B08F5CE0B0D0553A802FAB20B8CD18D3AB3B60367D3F74CB061A91F60EEEFE8E4721F9529CF96423CCD68655006606F7C1B15CBABCDD1707D61609FAE571C48D9A2EA0A574130A898D07CBE7687508DB6EDAAB4113D73DCE681AE30F496A85976C43C6C4E920050C668249030004 +sk = 315E3B59E0CAE5E5A5185A1A31F4F7C1F203B4B08F5CE0B0D0553A802FAB20B8CD18D3AB3B60367D3F74CB061A91F60EEEFE8E4721F9529CF96423CCD68655006606F7C1B15CBABCDD1707D61609FAE571C48D9A2EA0A574130A898D07CBE7687508DB6EDAAB4113D73DCE681AE30F496A85976C43C6C4E920050C668249030004A373FEA16D6384323D6D0E039D333A7D57ED3DDCADA9D14FD5C31896E96087189E00000000000000000000000000000000000000000000000000000000000000D4F74B21A57D6F33A01C09F9EC1FA3320C886A33ACC06108028AE9CD54547E8C52FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B9F3AEEEAB445BAC7F8DA71271B9B97F5C7E43E9B7D051F8475D059CBBF22302AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CA702570A889E34AE21244B5C6684461969D45DFF68C5D98D3E509A40102CB23CB3D65FE5C5ABBCBE87871928A8931A9D55198CA8A0B67C144DDA1BC3EC00E31B98F1EE75ED1CA9668093A402717A3C67A968B040184807FA60FB1F63DB34F38809F3993507F136F10E406C658D263C6F5EFCE122224983979C5CF9F300305E9E6C5C95577E36E29F1CE8F71EDF310881DAE0CFEDE4A06BE668CE46D65BBAB0E0BB681F9DF98DEACAEC811E9E8882A37DB12B1E480E0252652D5CD24015528F1D7593B67A5897A2F7DC82D3CC3ECD29040A45686B0A0F705EE518C8864C39747CB6E28D8BCE0D7C28A644340BE6BA9D7F1801BCCFF305D2F8D28CE01 +smlen = 2767 +sm = 8492447458900DFB5F39F686455F55290B0CB444A7C2EDC8D359AABBA89990249AB46C26B17CC819445B3504C8CB152B5BC54E05CC5575BC12D13B8D0891DE00088BD97AD063EA9090B83455F2E0440D974B4A69335F2FEB54DF54B113B0C2EA0B916A86E0F7D00E34836493DD3B8F9E07B7E1A625920B60912C347B52D9A2010000D5CD5D455A63BE4B71EF8952EC5C80BE2AE5E6BE9FD4B677A5CA731A78D64515FAE83D4542946F1FED07C31049ACEF07DA96696B3480A11ACC106DE79C77BC5C66F46B119B67A9D9FCAB03C973E3FB3287365AAC4B38913F7A58F3DB9C10E37269D5540BBED8AC2BEB4F6838FFBE7E5929CB61208B39F5AA106B211F831FC66BF4B41548970611C085F7F3EA310D1C336DC197241DCCE4C08EF6F4E4EFF26C0006095F7522CE6BD0CE6321C27B9EAA6F572616201F283C5EC171D0BA47662C2320897805E1551ED438F3FCBDAF9DE6F3A19DC16FE9C167A65B6E52BCF512C919561B548496A4A80AF7CE25458A62EAE92EBF677872482D8647C30C12BB1F080C6B9A56560D64FAB73DB17487BBB007C66661EA9DDA14601AB27A100EF4CF4B7447E51418651C03211F8FB884BE91F3980FE13E00EA4ECFE6D54882059A436C90BCAD80E4101CC6C0754417545F2D167629F80A3C5FFE45C00AB2BAF0494D6C065872B03A987A5EE818B3EF11E47FE1747F49E2DB6A14410F0B1F9610A2D6114395EF6EBB231FDF71D595CC1171DB9C89D6CF202E42D4FB968AB8105FDDB2AACB15FAB8014B534CF468D77ECDE2072623B7002620B7AC3E78B62AD673FEEF9F8E97E91ACDAB171FD415B2D15605DDE00D074A770E36F2218F7130F13E91FA4C88DEEA7E854BCAA01B8458D40625A33E982F0955B83080A926EC240E31F0D9BF477EE3A016E146A3909683410D4D09ECDF32EAEF580402F0D416DFC082CF1362E8B79158BD57739AEE56DC41A549E534C7CCF3620C7D7D95B92994A747D5EFB8EC43CFA8189BAA9B75FD54694E512FCA388B71A5B9EA591AE9CFA34183DE59D284AB16B2EFFA4B26A24A0E615B38B83088A9827EEB5C29B419BC061B033E0E3FC809AFDD3DE948412677E0BB5136854532639F3CCB176D54EA1961B5C527EF66F4B3286A583E86208AEEB8ED07D9E6BF1BEB33995F76CA480039A6130775895F19E3CD4873ABE3BF2FA9DE81BF0CB04575DD6AE282720B152CF0EC6A4A04016DB0F3543D8272AE56B1152B02EAF22131420CB194021F97060D5CE52EB21B57CC93964DD21344786E3888617152D2ABD829799CE47D20158AA93F7DA85CA6146C5BB94B512DA053C35BFA8840CA43F6509A1477603FD50F5E4F9A7CF8D2369156989AD638D35D345BDC859C52688211BF7EF3F4AD4944657289406BF01DCBB49D560A11840EF35DBC0C7F9C96DBEA76300CF61997A87D70F5FF8C51AECA2CF0680B6FE8C4025E1E25B62103D248CDEE335F4FCD67597103362003206C507970EA6D78CFF4B68B44244019152DBF812675CF667E5E13C8596EB6FEA3903BFB25ED08F902722A37F8E460E37A03A2D6ADBDF79DA20052DE658390484B83BBAB28D039A303D7376BF555181680B7966C798A1C6CB215257E37739DE7B9706CD1CF3AB031F68C82D6ECFA507C104115040744D74A40C49245215639D0CF4A5A7A10098E9CE3564AC3C44F0683AE9D3094784D354DB1AF439BDDF63D5CCA668D8180264EFECEEAC0BE1B8E1C6418E45F9ED6C779ECF169143B034CD9F332989D445C83A8786398C507B9171B4D95728575539CBB29C5B804268D88F2B39AF1F9572B8DAA9FEEEF69C4A77DC64BF2DBB5E57F8B33AB151769B2D00010D67A2D6F188D6D5B35E5E1873FE2B327E42AFB8885A842D26C246F7C18E6BCDD6FA49B300C65A3822121E95004928104017CBCE2AB95ACADB9802BF4BB049B8E96468353D649654C6F69D774380A5A387D6414DC3000540BAB6ECCBAA088C1068CCEF20036E5C8342FD512F55E6794BF85FE15721D99A1BFEEDC218617A940C8C25D4DFAFEC677D2A719B2CDDCD302294B7FA41AEAB5606F859CC0D638AC94B99AC3EA48C687D278EEBEB396DC5BF2D2E89E880F76B533FA54EFD30D8EE38B34DC5F8AE62C637E9A7E85D99E011F62D261AB4D3DCEB98A8972D3482CF817EFF476B873AC56963BD60183B359713385BA82F6E24BE2D6CFEA6DBB4AD2E1B5B790EE54D23F64E740502E887629B346FC8FCCC3338D0F2921131B84590B32C7CB82CBA8BB3B81EF7BC5CB12F0AA0B3C6A5B2878DC4F868057C68460C71D40D4263AC5C8B8317D2D0B63403C7549439A9EF227268372EC3A54CF8EE97714BC4B55007F92B1A32238659EC1EE27D6F2987AB06FEE84C3AFDFA73240963F076A955BF3C19410E1DA6A19B3EA3AE2DD8766082D3295D35436597783DAFDADB905465D05FC21FA8AC2737A52FA8AAEFBD2ED83F12545C1FA3198FF225D37070694C9392738E89467EDB2DA3CD1734CE398E32BCB1FEA2E4FE1260A2D9F9EDC3607A8AC8A51D5DA36E99B31903025E0CB157FD2FF5B51C9191CC16A9CCB870B4060CFB0FD900AEF62738A58C5726F5164417F084EF14FC0953E3C6036B818C21CA3476B8CC5F8EBAACE257A0315031A03E64E7F749B9DF99BB56CEEBBAA4333BC7270EDEE90FA2715BDDC38D44898A41998B2374B6EE3B8524D3A385C03868EE9479355092C4D20EC32DEB51497F4FF34AE7E7EA4828C288F46E5148DE28A8C660EE132E5B5489833DC66205EC968B60DAB96C2A4452A7019BBA9FE3D19D5829129E2A9C75C39416AC8695145F2B62EB9468198CBD48D7670DDC6AF2F99F77E7ACD01A34EA8E0E974206FBC22656867D09807B980563E06A559B0C3A7E6F43CF8DB75B18C0F90C12FF3BD43ABCE7DF75D17E631C08C974322010648FE2E2BC940E6510FB8835DF8384EFF3FE6A264687256C6BC0A5F9D2DDF208171DB55C4446B03CF27796BC77E3C68D8F1252BE21877D7C53747404420302CA5AE1AB57E43B158BE8B707360A2F59D6A473F98B816FDE2CCEDD92385202C419278E8B840DBA4C05E9BB65F68AE2A635A29110329E8C0C02F6FB5EEE41ED225051EE975F92DA52F93EB1FD7C0A098F6D1421701537298651313514AD31CB333E9C5DA719BBA95E73878BA41F9E2512862A80602AA2DE1E1D086576531330CC7BB8F0CEC38050B3CFAE5C8B1D6CB849A579F2294F8CE80FDE5405BFA3E6ECB01D5117203A4523591AC4030397DE9FF81D5CC91AF3002590F5854E852B88667638B2D052F2A7852425C8EC026E48D9EF5E73D1993D7F3FD7F704760562C36D2278C9CE131EC6AA444D7B2EACA3EE888D9B2AE122688DCB35455E7DE31562BA618F1183308B30D07A5C34020546218101AD42AC5054D4703587FF60E860A60375FAB12734912058D5B0B06430FABBFE0C0B43C22814F56DAE9E2713325A31C682C13F008B9A3D4FFA8A454F0F64A9213FF2D557A4CBC64EC6E4ECA0A976CD9F27497BA544DBAA3E2ECA0F54C2634C719B9C3A2CE37BCC8158A880BAA72780F8B1D3494F589E2AF3044B4FDD86F4DB2DF0843EBD9F3518870F55488F41E234CE94E907A69D28BD83347702750DB1AE2EB1454CDCA37A8B5FC90091F548BABF489E57C8919646E977274FC972088A522FFF9F9306D2F0ED6C01FF92CAE8440D7F3526B8C186D5B96942CB08032886051DA2A9FE77E38BEB18F4FB25F1152EDF9D61347A00A844929976A327BE46FFD3E2EE0B6AB1014294EC5D40CF7071C36B11127FF90720596C1B3065E7DE8010AEA469BB4F4AC5A6EFD20591CEFB7B94B2006D85CA475FEE556F24CC41237C631B75EB594F8342DEB4F976D73AA46563C1AA6D0B605A16152315626BA08807DAA6025CF62B29176F3A85E4BCA483EFFEA7E5939 + +count = 75 +seed = 63742CEFAE9868C3C0B31DDE0F9D378FD5D71BE7CC3F0B6ECD393DB55FB043CF00264852C45D1836CC12B9C872A20251 +mlen = 2508 +msg = 9FFA507328B2129C9F05A22B81A597FD1B8C27D554B36FD3EB150BC5FA0C6ED967EC5BE6F1E52D3BED1508DC3C841360020CFC2CA1B0713076251F2935EFA8500573CB4634C78A1D0F87D994E8E2B0BD265A877023B54D9A33282C12397DC74CAAB07AC2EFD140DF907651BCD1B37CAB2D03F77CC28872291F1CB28FD4BBB5331C2A18E02120BFD2D9EC0C8938A6D43681DC03527FC2BF59703B5160D8E25D08534EB5AA5CC9C10572257D9E4DB29235683BFE1776A2D9EDACFBA1ADAF66587BC451D32C524C7934556F94776F91CDDA96D2E5CAF91A39503D3A742DC5A0EFEF7C1A13666E200C5E3FD7652D200ADEF51FC5136281570B7832E0C6E7552972E43291F202E6F916C916DC3FA48858F3D92B1B7EFD42DE140D43648AEDD7C7379D7A4B71751A3348B6BBA3B0DB71B4C99C41E085E5536A3F0D2BDDAA88069249E21E2D9906191BBB5C8B45353DE72E00270431847AEB4FF6230CEBD1969A0FB68D6E302B78DA39ADF6C0E681117C8432E24820B9EBF38838545E95CF7AEFCF1E9436CF48E87B6C5181CB418132C7BC050B9498720D7D534792E0585F05DA2735B7E68FE35DEC358DA1BF1681F7F62329BEDFEA3D12BFB26AD9403F3AC1DB96D828050F39DCE4017B45C5DAE4D7DE9E9F687A9D7FAD1AE0E7197184142F6818A63D5617BE9D8D82334A12E68F2EEF88A0DA3A915DE63629550D8A64DF591EECDBD1B89EB40AE9F9D65815271693C85F2CA41BF45E4FA16EF8B17D945EC61E757C6C609D8AFAEE32B3CA628842DB255B619F6562E656F6125FB27195EC82FBEB9C14330DAB649CDB74F523F5A98244194581503356B5B7EC51E2B35AE889452D3457EAD713C0715AA7382DCC510B16E771B3A5A91949FAF5E29223C8F1F861BC3B4E77E095BB61ABA00EB29C065D6F9DA9B4413D61B2202547FB6E34671930EBCDCE4C541B3E2DC90073867A47197E08C96F74ED81DE5F10C37C062E8D82364D67EB185CD098CAC1BC3C522E4FABDF2FBEFB66B9EC6E848F732A737FA7B935EF2848C29B1FB94044996EEF006E251BCEB5BE356F286F0FC85E5CBA627B67398CBFD6C0F520C6F896353FE75BA323D8ECD9D3ED2997580E7E1E49EECD91982C5DA650D6B128068B8D3D72C1EC4BF1FBF121BA96E1CF5F247F9FDA7018CB609329B1C95E59E112C393C45EF7138905902227CD21A39CE30397FF017495BC98A968FB497E03DE5843E64923683F2E402DA63CC25AD0BA13B85E3E379B08DEB39542C06A268BBF44990447190A1F8ADF0D3ED9ED9917886210864CAD84E7C4D1282C4D3BFF9DC23E4FA68EF6B0480E76459D1B5E0A7CC0CFC17F59531C4C1CB1D416B7D009AB50173F706289DBB68201C305E39FEFAD87929EF933006598CE0F0242A2C60955AE487115B4C367A7E49488491A6F044FA8B7AFD81F6DA09D29D4BEFE1B3C9EAFDA4F17D22EAAE0B2D1646906D1CEE65614640B53479E23831C56EBE12B92997D5FEA725D78CA75F4509EEBD3DF4F741D6B2770521BE2AE63CA365FE1518CFDCD5088D58CDFB8D3DBA76731F74760A47C9D619A31B7E318E957194AC5ACC6867CF8C9C235043D5C09240F346FEA840AE0BB16094883FC801DA0BEFAC64A021F6F871413249E9C7F5CCA92F4EAB5713B0F2CD6C950F34BA6FB1CFAAD541BD5FAEA45EA5FB37258301A49D7BC4657E3E986D707213C0F836B030C21593F11518EAE3A8A95A2EFC8B9839E79CD8CB0E6DE59D5A43FF8F81FD35392F0C0659B7679542136782D559897FBCC0129C22F43A30CFB27E899A8CA52453F5459A281D0CC21F902403A596C7F69CBF9A64D97B935AB384FBEA5851D831E8420066826D7E11E34047D18CF08283BE8F29A8A79B0F477C27BC41B8EA4AA010ECF8ECE0D37389FF13E235A4526070F96F415D41AF2E053FD4440DDFFD69799456E7335CC6D9F4370008803F7BABB6C58B6996DC5A52649E25463B5267C188E2DC39B3258636ED8689E5C02E00574988B3AF881D30E9EB38AC51C1E00E1C0A411ECF37E314276221D7D8713F7A449E38371854EA26520ADDB58082287FAA1F77FC04095499A3C3A331A38852A287B24040C1CCC054086964FB1EE2B328F3DE21A986507CD20B4DE4898DFD15045324B93FDF85E5392DE0F32C3BADD04784012E97CB9BA19472B0C20EB0A71C89149EBB601ABAA4A853F2C75DD2622235AC30D97B9D7B1216089B9CC8E879660E40EBCD15203404A8DECADC42114715F4D8A6A10511BACC4DDC23520445A95FA3945BC95878BFF18728E64DE8B7767CFBBAA21F3EF2D92F3D7DFDA792BBE4E5B3381077658BFBEF8DB95B64F9F2A44917B38DF6F9391118978544369C882B218E7A7A31AFC3EB9A75A28095C4478DC81F9CFA127BB749CC53898409365170823D65A0B46BCFBA0E47CC0C5F6ECBEE09131F134EDD254F4F58B50C486DADA13195B1A35739420A45BE6558401F64C3B6AC94B73397925C20545621C7ECDC7DA9F71A755F84D27F2C6D8415D37F2BF1966A76845216E41764AB96DC2E14C12DF3684F7683FDAF5EC771DB7050F81A4B3E516C7D5C955201A18F436962476C1284531764A9397E0EDBFFA8C3699929DAEAF968B4524BD98EE62F9A0DB9CBF99FDA80CC6C57A5EE1099B1EB29799A5B5BF5593CDA26CE2C66DEA3D40545465C1D21F5B9373556B9ED0AE30E90B836003CA83F78E29BD8D49550286DC2DE6407860E9A9CC5EAF3E1B1C73FC2D248B81B1CC8F59DABFB5DAADE6F2A0B38E76D9E6D0125955D08DE7F334A56A8F362CC5D883D56BF7BABAE6D9E425376D34A05AB863A0D9ADF7C6FDA574FA8DC60965E021532C25ED4D568412D4143FBF2C4EC2F230D08337A4E546E01F7C1BFF4C97F2F27AF400CAA57BCF398AA5BFFE155B0F29A085D5053DFBEDC3423818DE8FC597EEAB2C1663D8C81C71CB876F73AC854286063A2E8BD8614D06B80F3BF56381179342143F4C89B8CEFE9168B6A96F416DC617B9F544F9DF65CA6F4F7A84A327909666B70CFFE889C86ACA706A0A1365E248D6B341A004A27D4EE344F03CE6E85D3573E272D48210DF7C3178EFB7BFBEF7765D24754673C9EEC14C7513FD8DE6386B0829EF0980B826EC9C77C81D1E3B8CAA65992DB9C2F8DD691C520FA6F233AFAAEDBF287A57A9A66D2330F4636F02EA3148C4BCD2C8B114D48A1027FB3BD5008D732C427ADEDEC9969AEAD451E166954FDC207C1A4EC409CAC60E42383385187AF44F136F91A8461E62EAFE6FCADD1E491162E46CFBBADDDB72E5B54B7C655CB9489E7F4F7E55C93D3AD50CF84E1F47A706FEDF818A5246BC755D6D18EF18702F5A90CE51812A67227C5E5A051133576E9EBC18AFA18C1B05C854D343727B25BB10E3B9A3645D789287858FA43734D66AD831E8646FE604286544238DC99ACFE3C8285230FC784BB73360F72ED34795B1C46EDBE32A346BFA7F534B500C6C9D3EC26AD7ED20D1500E3DEDF141DF3C2F92E981472F0010A48F25429329AE92CBBB918246F5A53212703C75DFA15D014801A830DEB75BAA36 +pk = CA329CF9EFBFCDA21138B326705A59310AD9076B9A14C997C8D8323B2D973F6CD67139A3FA8EE377FCCB864EDFE437B4A11618CE479ED50FC6FF0B9A480D8300D1E92BBF05D9E663A814FEB85503C8B62D459ECEA2B3ED7834365BE5EC25AB545F04A0F28346C66ED0C3AAED02B60589CCC62B32BC4A7C6815A135E99E1B050104 +sk = CA329CF9EFBFCDA21138B326705A59310AD9076B9A14C997C8D8323B2D973F6CD67139A3FA8EE377FCCB864EDFE437B4A11618CE479ED50FC6FF0B9A480D8300D1E92BBF05D9E663A814FEB85503C8B62D459ECEA2B3ED7834365BE5EC25AB545F04A0F28346C66ED0C3AAED02B60589CCC62B32BC4A7C6815A135E99E1B050104FF812EF2BEAA282DD18A6997CC7D4E4A8D7204D9462F2130762DF17DDC0DA159EF000000000000000000000000000000000000000000000000000000000000005222AD9FA2B0B0702D92AE2C73DCC0882F1EC699EA1690CBC6CA567B2AA8446DD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF758ECCB2162C91E7D481FE4B37DF08CB773ACFA8A099637271535375A949DC1C42FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002320676D65007ED2485364B3877292E26BEC1C1941FEB20BDCCAD3AC54AA467A0C455E4DB071E871AE0EBD0CBFD34D7F58F90E5CD6E62430EE3CFB2F8A9E08F92E6CFC6D7FE90B75E49FCDAFA753C8F820AEA0124994E59853875BA5C4E310AB69718E7FC45003C07A59CD140D1396D8BCEC35BB2429414A60F8E2936E0CBB047F4A31F656213BF793A1AAAAA5CE60E7EA7424FAAFDA180FD6DB39D9B1797D63EC01A3658FB64F3AC4FBB75741CEA62EBC7854C1502DA23C727B5A700004B135F210FD8530D868588958B758D562EB0DB397A0AFE2584C0873C2CAF2CA3A4E95E6727DF6812C8F4FB37984BAB55950356218263466527F8FC2BEE30D +smlen = 2800 +sm = 89B53A2B3496E0F7DC21AC587649275EFCBCC8CBE25B1BCE6654294D52B44A680A365E9BA61F102438EBF8E7F50D50A1F94957165B98AF87EC9417C8F90CC10087F585FE8D7D0ABC853E6A4AC994F20DC61E5CD2721F462026E05C50AE5F1DCCB5028997DE3F6F6EF390F48FB570082CA2BD342402E950B66E93738613EAFA000001E671B7366743D78933E0F6F562874F6C0FD3242F9EE610FFA8FEBB81A393CB0A9992DEB514D6DFE2B5A9F61F1F7205CEF67F00E731A113A6A5C51CECFE3AC11DC4188FCC71654CA423AF4B92C6DC43F73461D66661C0829F7D8A1D91EA164A047582C41FB9DAFBDBF5BAAD02BBDAE1D647105C0B59D2C4C3A00D97FFA8F458790CEC0DC41315329CEFB69F82E559F3B652D5A69F06F3F73066AA5080644D5C00040B9FFA507328B2129C9F05A22B81A597FD1B8C27D554B36FD3EB150BC5FA0C6ED967EC5BE6F1E52D3BED1508DC3C841360020CFC2CA1B0713076251F2935EFA8500573CB4634C78A1D0F87D994E8E2B0BD265A877023B54D9A33282C12397DC74CAAB07AC2EFD140DF907651BCD1B37CAB2D03F77CC28872291F1CB28FD4BBB5331C2A18E02120BFD2D9EC0C8938A6D43681DC03527FC2BF59703B5160D8E25D08534EB5AA5CC9C10572257D9E4DB29235683BFE1776A2D9EDACFBA1ADAF66587BC451D32C524C7934556F94776F91CDDA96D2E5CAF91A39503D3A742DC5A0EFEF7C1A13666E200C5E3FD7652D200ADEF51FC5136281570B7832E0C6E7552972E43291F202E6F916C916DC3FA48858F3D92B1B7EFD42DE140D43648AEDD7C7379D7A4B71751A3348B6BBA3B0DB71B4C99C41E085E5536A3F0D2BDDAA88069249E21E2D9906191BBB5C8B45353DE72E00270431847AEB4FF6230CEBD1969A0FB68D6E302B78DA39ADF6C0E681117C8432E24820B9EBF38838545E95CF7AEFCF1E9436CF48E87B6C5181CB418132C7BC050B9498720D7D534792E0585F05DA2735B7E68FE35DEC358DA1BF1681F7F62329BEDFEA3D12BFB26AD9403F3AC1DB96D828050F39DCE4017B45C5DAE4D7DE9E9F687A9D7FAD1AE0E7197184142F6818A63D5617BE9D8D82334A12E68F2EEF88A0DA3A915DE63629550D8A64DF591EECDBD1B89EB40AE9F9D65815271693C85F2CA41BF45E4FA16EF8B17D945EC61E757C6C609D8AFAEE32B3CA628842DB255B619F6562E656F6125FB27195EC82FBEB9C14330DAB649CDB74F523F5A98244194581503356B5B7EC51E2B35AE889452D3457EAD713C0715AA7382DCC510B16E771B3A5A91949FAF5E29223C8F1F861BC3B4E77E095BB61ABA00EB29C065D6F9DA9B4413D61B2202547FB6E34671930EBCDCE4C541B3E2DC90073867A47197E08C96F74ED81DE5F10C37C062E8D82364D67EB185CD098CAC1BC3C522E4FABDF2FBEFB66B9EC6E848F732A737FA7B935EF2848C29B1FB94044996EEF006E251BCEB5BE356F286F0FC85E5CBA627B67398CBFD6C0F520C6F896353FE75BA323D8ECD9D3ED2997580E7E1E49EECD91982C5DA650D6B128068B8D3D72C1EC4BF1FBF121BA96E1CF5F247F9FDA7018CB609329B1C95E59E112C393C45EF7138905902227CD21A39CE30397FF017495BC98A968FB497E03DE5843E64923683F2E402DA63CC25AD0BA13B85E3E379B08DEB39542C06A268BBF44990447190A1F8ADF0D3ED9ED9917886210864CAD84E7C4D1282C4D3BFF9DC23E4FA68EF6B0480E76459D1B5E0A7CC0CFC17F59531C4C1CB1D416B7D009AB50173F706289DBB68201C305E39FEFAD87929EF933006598CE0F0242A2C60955AE487115B4C367A7E49488491A6F044FA8B7AFD81F6DA09D29D4BEFE1B3C9EAFDA4F17D22EAAE0B2D1646906D1CEE65614640B53479E23831C56EBE12B92997D5FEA725D78CA75F4509EEBD3DF4F741D6B2770521BE2AE63CA365FE1518CFDCD5088D58CDFB8D3DBA76731F74760A47C9D619A31B7E318E957194AC5ACC6867CF8C9C235043D5C09240F346FEA840AE0BB16094883FC801DA0BEFAC64A021F6F871413249E9C7F5CCA92F4EAB5713B0F2CD6C950F34BA6FB1CFAAD541BD5FAEA45EA5FB37258301A49D7BC4657E3E986D707213C0F836B030C21593F11518EAE3A8A95A2EFC8B9839E79CD8CB0E6DE59D5A43FF8F81FD35392F0C0659B7679542136782D559897FBCC0129C22F43A30CFB27E899A8CA52453F5459A281D0CC21F902403A596C7F69CBF9A64D97B935AB384FBEA5851D831E8420066826D7E11E34047D18CF08283BE8F29A8A79B0F477C27BC41B8EA4AA010ECF8ECE0D37389FF13E235A4526070F96F415D41AF2E053FD4440DDFFD69799456E7335CC6D9F4370008803F7BABB6C58B6996DC5A52649E25463B5267C188E2DC39B3258636ED8689E5C02E00574988B3AF881D30E9EB38AC51C1E00E1C0A411ECF37E314276221D7D8713F7A449E38371854EA26520ADDB58082287FAA1F77FC04095499A3C3A331A38852A287B24040C1CCC054086964FB1EE2B328F3DE21A986507CD20B4DE4898DFD15045324B93FDF85E5392DE0F32C3BADD04784012E97CB9BA19472B0C20EB0A71C89149EBB601ABAA4A853F2C75DD2622235AC30D97B9D7B1216089B9CC8E879660E40EBCD15203404A8DECADC42114715F4D8A6A10511BACC4DDC23520445A95FA3945BC95878BFF18728E64DE8B7767CFBBAA21F3EF2D92F3D7DFDA792BBE4E5B3381077658BFBEF8DB95B64F9F2A44917B38DF6F9391118978544369C882B218E7A7A31AFC3EB9A75A28095C4478DC81F9CFA127BB749CC53898409365170823D65A0B46BCFBA0E47CC0C5F6ECBEE09131F134EDD254F4F58B50C486DADA13195B1A35739420A45BE6558401F64C3B6AC94B73397925C20545621C7ECDC7DA9F71A755F84D27F2C6D8415D37F2BF1966A76845216E41764AB96DC2E14C12DF3684F7683FDAF5EC771DB7050F81A4B3E516C7D5C955201A18F436962476C1284531764A9397E0EDBFFA8C3699929DAEAF968B4524BD98EE62F9A0DB9CBF99FDA80CC6C57A5EE1099B1EB29799A5B5BF5593CDA26CE2C66DEA3D40545465C1D21F5B9373556B9ED0AE30E90B836003CA83F78E29BD8D49550286DC2DE6407860E9A9CC5EAF3E1B1C73FC2D248B81B1CC8F59DABFB5DAADE6F2A0B38E76D9E6D0125955D08DE7F334A56A8F362CC5D883D56BF7BABAE6D9E425376D34A05AB863A0D9ADF7C6FDA574FA8DC60965E021532C25ED4D568412D4143FBF2C4EC2F230D08337A4E546E01F7C1BFF4C97F2F27AF400CAA57BCF398AA5BFFE155B0F29A085D5053DFBEDC3423818DE8FC597EEAB2C1663D8C81C71CB876F73AC854286063A2E8BD8614D06B80F3BF56381179342143F4C89B8CEFE9168B6A96F416DC617B9F544F9DF65CA6F4F7A84A327909666B70CFFE889C86ACA706A0A1365E248D6B341A004A27D4EE344F03CE6E85D3573E272D48210DF7C3178EFB7BFBEF7765D24754673C9EEC14C7513FD8DE6386B0829EF0980B826EC9C77C81D1E3B8CAA65992DB9C2F8DD691C520FA6F233AFAAEDBF287A57A9A66D2330F4636F02EA3148C4BCD2C8B114D48A1027FB3BD5008D732C427ADEDEC9969AEAD451E166954FDC207C1A4EC409CAC60E42383385187AF44F136F91A8461E62EAFE6FCADD1E491162E46CFBBADDDB72E5B54B7C655CB9489E7F4F7E55C93D3AD50CF84E1F47A706FEDF818A5246BC755D6D18EF18702F5A90CE51812A67227C5E5A051133576E9EBC18AFA18C1B05C854D343727B25BB10E3B9A3645D789287858FA43734D66AD831E8646FE604286544238DC99ACFE3C8285230FC784BB73360F72ED34795B1C46EDBE32A346BFA7F534B500C6C9D3EC26AD7ED20D1500E3DEDF141DF3C2F92E981472F0010A48F25429329AE92CBBB918246F5A53212703C75DFA15D014801A830DEB75BAA36 + +count = 76 +seed = B887F07DB5358C3FDC2402947BBC87ABD064B02A859FE8DB37B5BCBB916020443DABA5534A0778FD0B1C05EF3ABE6269 +mlen = 2541 +msg = E7E845902E852B331EF9923416E492C1641236E4E72408D800FD70774BA32B6B4BE04B6E82237A247D26F9A33AFC4745C16CE0554774C68B33CFC6E67AE34E42038FC6C324972642338DAEA75982C71720F1EC9542DF94B38434DA34A2003FABD9DAEA1950B7751DA6C81AFF7D03390F5D63455D417F5D12A510337A16197EBAF921B6A7A9A9A58F9696418ECED6B27CB8EFC8ECBD9B68714F721561AF8553A0D84E30E009A8985D011CB994EEAAF88C76F7F3261B47FC174155C138DB2EADB09A06073B211FC0D27113E8FEA0DA56E181CF532BA8207F5D80D6A30D8BACBA540D49A81A0763A0467DBA7883766ED6358E809261AA3D8B757C839B532F272C5767671A3A8BF3391B14F5E97BF2668A4E98847F1ABFA21E2370870DDF24504F89B3DB71E210C46D66EA7296D65C926E2C955D899AC830CD9D06808A68E9B3722B86E878CF21A5E5D41D7F3CD95D23A6344C259859735AE1A953ADE13CA103692B33AF90ED0345C7B038D938F8F494D90CBD3933B2A80FEDC2BE57960DB23AD018BAC63017A04FCC510553226CD86C74AB90E13C72A1BE12E4D751DC670A98EC4F81E9F8954A693FC7175BA7E50D340FF7F15D568D0ABDED0BB1FC557B1E55971B4C4CE8CC1B4D9E239C73B1133C9E1672DEE36A2D9527F315C21764648643D866B0E2AB6D2DEE61D838BC5DAC183FC511C4501B6E535ECC54F3EDAD6E8EDBF0DE7CB70BEE861B2BFF0D41BB87FFC0EBCAEE9A6DFB98D31D35CFB6DC0442FC285AD0879E7B218B6E66453FE04207FE814C5F72E49406B48FCB1DB145753DC2A2D3E9793594F7EF1A1A6339619E1040CDE605648234A51B2F6774B31C7F9A77C2CE3B98819132BB725D288C65901F7001E05FE5326B6F701C337D41C8CF8748FF9C276ECD398C725C36C11857605F58C0B154DD9F3C1B4649AE677533EB0338B7475254E273B786C2FE7DB4C13468CAF0AA2AECD55DC1A5F868C8EDFFD8BE8DEEC20A9FAA621C4680F3EEF4DFE4A79794FCBC5F8C56EEDCC3E1963569A36525D4F6A5BDBBA5D12966FD8A0FCC70783FD9F61613842F80D000C9281CBDF28C01C6F6AEAC10DF1DDCD0322E00C4E3CC801EF091D9C1B01E84DCE725D57C800D38990251AA1D1206AD93A7DDA40F27726D6A03D973150F7A88703724E314C0953D56DA6EAC442A70C2A08BC66BFA2B0EE11E185131E352D10DD714DDE502097AF0AD155AEEEC2A6B93B149B75DBB898B2B3A7C5FEF2F48D9B12A580F54C4EEF3FF83A4F13F2F194AF551D4800AE86AAD6EFC82CE460D325CBCFEE3400AE939431AB4070D7A7CC005F270896051E32B1051E58941530E250F05AF19FF416E65CE40655FDA31D2E7A6158E07DA08FA61AFD5319B682DE44AFAE146129A8B769C1708A5D3479B6C910B2FF0FC872A4A41AA8BF3EE16F80011D163B599D18501335A2BE10CF117DDA094FE01596C404C14580A7075D04CEEF68BD8F813D7DE6599F478F3DE9CE60B294CB7CE5284A61E078939D08F3D4FD998ADD3B92532AA54E0C31087CF14BF4EC964EBAAD53BD15D04E37948E94917DDE181EE3BB2346335FFB403B000F5669019C5281D88A0E771176E49DD0BA22E719C0B731EC2AAE9C898E74B2967BCBDCE0D7D73057E004BD62269F4E7F3823DCC18CD6C551104B9B896B0AD138DDE7C3D761138641BD3EFF3DF1552659FD97BDADFC59A05CBC622A4492A1B22CFF72AC197D61A4C5A949AA9AC09D4C1112F4C1B1CAE353C70278A21663E11F27E9EC66ECD4AD56F2179A3FCEC37AC3A3F4B33C06BBBD4C8CE8E74825BBDA3E58A2E2D928C2C6E6D886274BC0E2175AB03D8721C664FBD6455DB2960E3AEF0BB25AFD3CB0BAFB71A2BD18A89ADAEE00AADBC7E4AE70ED4B534AEEAB88559194755F9656B43BC83E3952000D9E2295BF3391904218A015C786DE0144868EE4AED203B261FE743B7168788A0680F7484792A3F64782B2B1ED9217B09AE9845DD71ED363F18E8AAECD51A4F5913AAB33FEA3FC5F1E37E0CD6333D2A8347CF45EB7C4AD967FE6FCFFF3565743435EF09A646E75C7E968ECF4202A9B2C23AA8118A1683219B1155C2CABC95C696704F5B270C6D213332649363AE13EC811E9A1090D1603EFF745E2FA83379DFC6DA5EFECED556E46A8A5FF1F2A5C0D911B95C20EC2465AD0C96AE7E16FC36143762BBC0734CF4D6134DCB0D739F7822470E0ABF66A0AB15CE0D6096D3ABBA2CA4C81C1C68BDC252A8A4BA609B7C05CCD913EA56126F418FC0B06DE8F76EF651F8085604C16E5910F3B8651AB78296B56B78326E41AC15774E442017FE5B291E5227EF5A4B78CCFA96D6921C8542A8A984BC87E2678903869C52C2568FEE4E23EF3CC466CE270614E6472244A4294B31F9438F7E43437FC9C9C5F3EFB0F4F0AF2110A613661DC24A1C7F7A7F8CD14A943821F16F94BD874F1A32E305DB4776CDF6633446724CCBB2488B1B06F0177819D53885127E6EB717C0D6718366A8B8A089AA6AB17CB2581A75EC748123B7D0383F3900EFCFF77D2E022E90AA41491117758221A0B149C8EBC23CC01C17B9FD39118DAD413A391CFA0A5C614208060A61646C7CF1DFAD4ABC3A9CC5CD566DB2AC8FAF392C9D8E7DA0F84B941D792A8493FBEBAD30D0DAA0D683DCC1583F0C9019622EB6C92FBC475BABC8B626319BE2264ED873AC063F84B7F83688AC99D732A1E3FC12281BFB1E1E63D48BFBFCA619BF4B95F899C50AD0F5FE4673347DF2BBF2CA21BEF49C7F8440D95A83299960F1E42B457ADDCCCE236946DE80FD4862BAF36387E041DEAAC3C9751AE345512BB1F423A3B4CA8D3A5E3796D289641D3424FF22670A46552EC68D7D095E8636441D777DBE2E9DBF6B5FEDE5318516C3886B943F6ADF17D8B7CD40B20A48233C9FD981145B45A5CB8F6A88EAA36C270E93E1D876D7781BB92A1FD99727D8E0AE34C73398AB8781BB342F5AACF4081459EA5EC20C30CBB6122344C457F92B20448F78E1A2A291202003781EBDA1747061C6CE1F8BF882FEA4FB50BFE638685CD638EEC15BC24252567025FC5C16ED1F5D98DD90C76E720EF7B4E25A20D262E339C5E5BB5A9CF051BF5FD1F63E93452A179277B57956821CDD901F1C01E634AE18485708A6ED8F592AE2EF3A9D54C9734FFBADC6F0B86D0398AECE9374F9ACAFEF38D4B97BE9B932B9852F97AEEC435311A67AE344AC1985738C72F52B3D8B71F64A916240477FDDC5FAF02F8224EB35D310FEA03FD2C5933047355A438676D92EADF70DF662D97C2F5E00CB293053699D51D302B78145C77AB03F34EAF170EDA5215436FAF0238A4B0D41D29F36052A5278C7D8AF9A6FFC6E2B6FFC4C5D524F7640A7170957F3DE2451AC75589CE328B61EA7179FD990DA1698F5C73BB8639A4DA2AD67D364DB04771CA118C4055C25F1120A0643158C07CD22B375D5C1DFA26FFCDA44921F41D4A504B2279DFF03421CAD19960F87C6B6DD8C29981CB66C9731F931E43B0D97C6AC9862E2CF711DF0DED8E4D06F3957FFF9085A95D9FCC95610FDE22856B229A3121D8B81EE83DEE4A6A9FA3FE8C75351574CB000BF7F3746CA1CC5414AEB23A2 +pk = 58B57560DCEFC455436D23225E2278B8FA38A1E549E78615C3E538D06575260FD3E37454DBCC8D587AA19A7278D4BD0488379F445565BCD8F1D4C4EAAA06F4007912410A4B691BD0A487DF3EC49CB63616D86CD222164912BCA7A22B765CD30643536EA220DEBB29A372E315FAA9BC867581483CE03D6C0CA5C3BC36834BF10002 +sk = 58B57560DCEFC455436D23225E2278B8FA38A1E549E78615C3E538D06575260FD3E37454DBCC8D587AA19A7278D4BD0488379F445565BCD8F1D4C4EAAA06F4007912410A4B691BD0A487DF3EC49CB63616D86CD222164912BCA7A22B765CD30643536EA220DEBB29A372E315FAA9BC867581483CE03D6C0CA5C3BC36834BF100020391E53B55CB3D17EECB2792EA72F30CB29153850F1CD5997CABDB84ECA3D66D3500000000000000000000000000000000000000000000000000000000000000B22EE3A57FD891EF098AF93BA0A569E2D79F19D9344C5D292B7B927B9D03ED99A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4169554E36F3709333A629CE087887B6C5A7EED3D65EDF3CE369BF1CDA50B095EAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005159FF984F42D37B20F2A523E9553EB4759006A909EA4CA41AEA62AF1061A8885F775CEE8293741E6C60C1F7BB9852C34326F5067C4F18E8DC62A174A4770B15A02A4F546CCE9A523158C5092FE3D120ED797C4CAA0841DADB85871D0BF8E3FD092142F6260C74D12FE146D656362C9EF5E521531FBFA5EC0DEEFF5DB7018122C560C0E9711A783DA964D2720363CA1A7176DD0B090D5584222B525268049369EDCC0FBAB0B51DCE11CFB404C6CF7A445FDC0F46453EE7B075AAF46D07B85445213DB6A106F05F17274FB89A116C88137BB10B553AA00E50802A43DD301D5E15B474FC935AACE7C15EF028AF786E8F64AAD9A62E57C12613409FCC01 +smlen = 2833 +sm = 53DDFE1FF27EA3FE6016D45614829AA6A8933BCD528A483FBA4A4A0ECE52499FA8AE11677278CFB6EBC0CF06EC48CB04A4BF175BC867B21A7F63043DE086AD00167FFD1276A25D46F486CC5B26DFDBB0539441DE17FD2D124AF98E7EC7DF33679C14C55EED92F6807C692FF9B10AF63568A9ED3D0ED9B2A229AC04D8E1CB850002008F8CB2FD42C318808307ADC98C00603FDBD3B346E0AC399502F7ACD16462FB114D50DC0CF88007D3B9390D29CCC5DA16D1A6910884FE33A636AE3A1416988007D13354FA1612BE3C53C548C6E08BB73C179550C33FF3085C7506FD8100B0211A201609CCD5C3647E74452E5F56F2E7CC86F5B09B1D4042AB03CDE326DEDE3A19ED2FC918FA22F60DCD4E4F09004F1F05C963484A765D778DF8731D6756080400090BE7E845902E852B331EF9923416E492C1641236E4E72408D800FD70774BA32B6B4BE04B6E82237A247D26F9A33AFC4745C16CE0554774C68B33CFC6E67AE34E42038FC6C324972642338DAEA75982C71720F1EC9542DF94B38434DA34A2003FABD9DAEA1950B7751DA6C81AFF7D03390F5D63455D417F5D12A510337A16197EBAF921B6A7A9A9A58F9696418ECED6B27CB8EFC8ECBD9B68714F721561AF8553A0D84E30E009A8985D011CB994EEAAF88C76F7F3261B47FC174155C138DB2EADB09A06073B211FC0D27113E8FEA0DA56E181CF532BA8207F5D80D6A30D8BACBA540D49A81A0763A0467DBA7883766ED6358E809261AA3D8B757C839B532F272C5767671A3A8BF3391B14F5E97BF2668A4E98847F1ABFA21E2370870DDF24504F89B3DB71E210C46D66EA7296D65C926E2C955D899AC830CD9D06808A68E9B3722B86E878CF21A5E5D41D7F3CD95D23A6344C259859735AE1A953ADE13CA103692B33AF90ED0345C7B038D938F8F494D90CBD3933B2A80FEDC2BE57960DB23AD018BAC63017A04FCC510553226CD86C74AB90E13C72A1BE12E4D751DC670A98EC4F81E9F8954A693FC7175BA7E50D340FF7F15D568D0ABDED0BB1FC557B1E55971B4C4CE8CC1B4D9E239C73B1133C9E1672DEE36A2D9527F315C21764648643D866B0E2AB6D2DEE61D838BC5DAC183FC511C4501B6E535ECC54F3EDAD6E8EDBF0DE7CB70BEE861B2BFF0D41BB87FFC0EBCAEE9A6DFB98D31D35CFB6DC0442FC285AD0879E7B218B6E66453FE04207FE814C5F72E49406B48FCB1DB145753DC2A2D3E9793594F7EF1A1A6339619E1040CDE605648234A51B2F6774B31C7F9A77C2CE3B98819132BB725D288C65901F7001E05FE5326B6F701C337D41C8CF8748FF9C276ECD398C725C36C11857605F58C0B154DD9F3C1B4649AE677533EB0338B7475254E273B786C2FE7DB4C13468CAF0AA2AECD55DC1A5F868C8EDFFD8BE8DEEC20A9FAA621C4680F3EEF4DFE4A79794FCBC5F8C56EEDCC3E1963569A36525D4F6A5BDBBA5D12966FD8A0FCC70783FD9F61613842F80D000C9281CBDF28C01C6F6AEAC10DF1DDCD0322E00C4E3CC801EF091D9C1B01E84DCE725D57C800D38990251AA1D1206AD93A7DDA40F27726D6A03D973150F7A88703724E314C0953D56DA6EAC442A70C2A08BC66BFA2B0EE11E185131E352D10DD714DDE502097AF0AD155AEEEC2A6B93B149B75DBB898B2B3A7C5FEF2F48D9B12A580F54C4EEF3FF83A4F13F2F194AF551D4800AE86AAD6EFC82CE460D325CBCFEE3400AE939431AB4070D7A7CC005F270896051E32B1051E58941530E250F05AF19FF416E65CE40655FDA31D2E7A6158E07DA08FA61AFD5319B682DE44AFAE146129A8B769C1708A5D3479B6C910B2FF0FC872A4A41AA8BF3EE16F80011D163B599D18501335A2BE10CF117DDA094FE01596C404C14580A7075D04CEEF68BD8F813D7DE6599F478F3DE9CE60B294CB7CE5284A61E078939D08F3D4FD998ADD3B92532AA54E0C31087CF14BF4EC964EBAAD53BD15D04E37948E94917DDE181EE3BB2346335FFB403B000F5669019C5281D88A0E771176E49DD0BA22E719C0B731EC2AAE9C898E74B2967BCBDCE0D7D73057E004BD62269F4E7F3823DCC18CD6C551104B9B896B0AD138DDE7C3D761138641BD3EFF3DF1552659FD97BDADFC59A05CBC622A4492A1B22CFF72AC197D61A4C5A949AA9AC09D4C1112F4C1B1CAE353C70278A21663E11F27E9EC66ECD4AD56F2179A3FCEC37AC3A3F4B33C06BBBD4C8CE8E74825BBDA3E58A2E2D928C2C6E6D886274BC0E2175AB03D8721C664FBD6455DB2960E3AEF0BB25AFD3CB0BAFB71A2BD18A89ADAEE00AADBC7E4AE70ED4B534AEEAB88559194755F9656B43BC83E3952000D9E2295BF3391904218A015C786DE0144868EE4AED203B261FE743B7168788A0680F7484792A3F64782B2B1ED9217B09AE9845DD71ED363F18E8AAECD51A4F5913AAB33FEA3FC5F1E37E0CD6333D2A8347CF45EB7C4AD967FE6FCFFF3565743435EF09A646E75C7E968ECF4202A9B2C23AA8118A1683219B1155C2CABC95C696704F5B270C6D213332649363AE13EC811E9A1090D1603EFF745E2FA83379DFC6DA5EFECED556E46A8A5FF1F2A5C0D911B95C20EC2465AD0C96AE7E16FC36143762BBC0734CF4D6134DCB0D739F7822470E0ABF66A0AB15CE0D6096D3ABBA2CA4C81C1C68BDC252A8A4BA609B7C05CCD913EA56126F418FC0B06DE8F76EF651F8085604C16E5910F3B8651AB78296B56B78326E41AC15774E442017FE5B291E5227EF5A4B78CCFA96D6921C8542A8A984BC87E2678903869C52C2568FEE4E23EF3CC466CE270614E6472244A4294B31F9438F7E43437FC9C9C5F3EFB0F4F0AF2110A613661DC24A1C7F7A7F8CD14A943821F16F94BD874F1A32E305DB4776CDF6633446724CCBB2488B1B06F0177819D53885127E6EB717C0D6718366A8B8A089AA6AB17CB2581A75EC748123B7D0383F3900EFCFF77D2E022E90AA41491117758221A0B149C8EBC23CC01C17B9FD39118DAD413A391CFA0A5C614208060A61646C7CF1DFAD4ABC3A9CC5CD566DB2AC8FAF392C9D8E7DA0F84B941D792A8493FBEBAD30D0DAA0D683DCC1583F0C9019622EB6C92FBC475BABC8B626319BE2264ED873AC063F84B7F83688AC99D732A1E3FC12281BFB1E1E63D48BFBFCA619BF4B95F899C50AD0F5FE4673347DF2BBF2CA21BEF49C7F8440D95A83299960F1E42B457ADDCCCE236946DE80FD4862BAF36387E041DEAAC3C9751AE345512BB1F423A3B4CA8D3A5E3796D289641D3424FF22670A46552EC68D7D095E8636441D777DBE2E9DBF6B5FEDE5318516C3886B943F6ADF17D8B7CD40B20A48233C9FD981145B45A5CB8F6A88EAA36C270E93E1D876D7781BB92A1FD99727D8E0AE34C73398AB8781BB342F5AACF4081459EA5EC20C30CBB6122344C457F92B20448F78E1A2A291202003781EBDA1747061C6CE1F8BF882FEA4FB50BFE638685CD638EEC15BC24252567025FC5C16ED1F5D98DD90C76E720EF7B4E25A20D262E339C5E5BB5A9CF051BF5FD1F63E93452A179277B57956821CDD901F1C01E634AE18485708A6ED8F592AE2EF3A9D54C9734FFBADC6F0B86D0398AECE9374F9ACAFEF38D4B97BE9B932B9852F97AEEC435311A67AE344AC1985738C72F52B3D8B71F64A916240477FDDC5FAF02F8224EB35D310FEA03FD2C5933047355A438676D92EADF70DF662D97C2F5E00CB293053699D51D302B78145C77AB03F34EAF170EDA5215436FAF0238A4B0D41D29F36052A5278C7D8AF9A6FFC6E2B6FFC4C5D524F7640A7170957F3DE2451AC75589CE328B61EA7179FD990DA1698F5C73BB8639A4DA2AD67D364DB04771CA118C4055C25F1120A0643158C07CD22B375D5C1DFA26FFCDA44921F41D4A504B2279DFF03421CAD19960F87C6B6DD8C29981CB66C9731F931E43B0D97C6AC9862E2CF711DF0DED8E4D06F3957FFF9085A95D9FCC95610FDE22856B229A3121D8B81EE83DEE4A6A9FA3FE8C75351574CB000BF7F3746CA1CC5414AEB23A2 + +count = 77 +seed = D08A139CC7147ECAF4B1D1E434EB2EFA2B2607B0033D8BA989133E496DC9F3654944C7AF91CBB79866443E8C4E8217ED +mlen = 2574 +msg = 34FCF4626248B979A7A8D306CB9ED69C4CCB5CC3729D2692E0BA679D5C2FEAAC54A4E06D4EFCEDF78E19357DAE263E1B5D107FB09618A9C34F54F19A738A66B95E6F88E20E01F879F53E8F4C371B571E1438FF70E0A8CD00D608976E24501B2DDD323EFE6C1302A318CAD821C6FFE641672BB80AC62286C69FCFFD93422911C46D43DC9A1F00A73E19EBE6CC09A9801F2A1DA708F0F1F98E7F1A18529010823230279F487911CEF1E784A229D9E311BCE5E2D368E6D613F791DDD617D0F37F604B786CA2BAB754E8BC4BD3DA37E66A54DF1D3B268A5A80379A30A52B1532E8CFABE24168D83CBFD61E2346F901C361F771E0BE3E03DAE8CC30614C10FB8DCCDCAA5B9A25DDD8D61E61F60F22308E12ADC137D3D8C53CF7B31984CB813758BAA19AC178F2F0CD2155ED674A7509A3CFA7FF66D2D9B1E60BE50FE7FB79591C500F66BB1D35EDB80263F4B696A3DDA0B9B2911D01E76E9070D99DB93D1D0C3874CFFA776BA24424A6B453526F7C44EAFABE13C0750F9DF33E82105930139E70B5CF1B09DC3913D6BF4A4859F67FE814FF038F0FDAB93522A35E7F81002A395989D68B8B7E4235A09837CC6402A5338DA08E7C73DC63C43BAC42054C694F4931B80140D6B104EDEC995CEBCC5629F85D09DED8257626F9FA4079ADEF81D044C18BF2277DAAA41931B62A6028F89F95F06D8A8FDEB95EB2EB1E90C0D8523E0B476B158E3040F212390AB2503021E8D6FC0733B963CC6188FB2532829925B59C8255D89F10B657053D0FA1D8E76C84826A4609284503D3A101EBFE7AF93EDC423EF5303CD946C8B570511E38EB04BEE0060E678D03E4134F84F279A570AAD0332417FB2099E3F1F279CE7D6DDB080C5D83064D107BB560B21183AE165CBB54CC75313DE72D40D1CF5173455AA55C5C356D7C40A2A7023DD95D3F89B515D7598F800DCB7BF68B707978ECAF55B794A17559BD1E913F4472B1830783BBBAB5F23A760C78C46157FD1B429C445494CDF92FEC8BF9FC217D3CE2697BB6C671BAA793CD0C1C84F579F0DAEC400BEADA799A9F417FE4744145F21C6F8559AFA7A514A0E951F03E5E68C17A8E5816F3FCF41774D26BE2EDC11FC3A42CFCF00F817C3D0FBF474FD7F30C9C3C6BE7F74FCC79FA6AB07CAB037EEA7D83866673A74C087B5F7542804071D53CE348D2E836749E35AF0FB884D5D53ABB195AE1EE6E9AE35DC91BE359BCD510A7801FC243C07DEE92373918AA4F8A89EDA3895A52456F7244D1FF007CC7B1A52CBEF4C1ADE1C2C0AC189AB24B3F260475E1D08E7C5BFA30A1CDD71DE5ACE80D5FBD1D0F17198B79C8EEA0365D139F2AE73CAB6FBC9A79786896DE0CE7FC747D68FA4ABAB662A09E0E409F7E652153352BB92F5DA1836B0E92B0B644C821B2DD2BD0AF193AC0F8CF5B8D88432F0248DAB09B46FBEF2EF1899B5981E9B33DE4E9927AE50890FEFC35F681E075D8B0169A2E16FEDA6392AB9858DB87ED18ACBA25575AFD1FEDA9FB3FD01ECAC13C245DF6972F65087513F505187C4E8EA54B6433FA092B6CD3AF13F4718693904435C55D273060FBB5FDA76074691269493E86F287922D074E54EFF04209B2FDD3417D8436D1395E638D57DB75D68F4F819141B6DAF4D13A9A18629CF5F84B0CD02E7A397715DDE5476BDC467218D11AACD6CE399D9D54645BB27CA43076B7E4E57FB4F7C4F4B8D0AA949719D731C3A927FDEF1533D773CF1BB562D5EA43817A5ACEFE9EB7E51029DEA143E8A1D5F76F9BFD74A26C6D38F54194319A1AAABC4DAF45EFBAE770B9E9D834C09FE45C15D4BBC0251D3DF2F2F23387DCABCE6CA7A59625E18FD997770D164C338D0692AF97C749FB746C0D3944CA4B2DA6D3AD7B8C3AA922FC029CF9AC5580CFEAFF50CB2E9044211EA522BB5769BEB7A7BBA0743F345FEEA9AA9DA6EC5F0579CF7A5AA4DEDC832FE3F65185A31FD49C0D259E3B7F8FA96E110D130F588CDEC30D0FD4860CA6673C46D961FC68A4020FB03AE24B1AE12967EC1ED19ABEC0808A7EF89521152033F70F406A7005819D28DFC556C79DE18584088F40BE40A555EAEFA78E3FA3D9360A7CEBD963555CF208DC408A07CCC1369F98BD840F5C940721064E6C7CB241ED0697AF0FACF36F05632A504870ABF90134A01AF00D340F7A5D548A8078C2049600EE454D15EB8CE58C26B3C8185CF9DFCDCA7D4B6DCDEB82230F993D51E701D8387B06BD45B4B61DC9DA6D3B4356F50C1D4AD2B467D36AC092442FA90D1DEB014475AC7CE90C974063459DC951DECFA30D2DE4C70FBA39A8B6931217D0924FFA783C8C3DAF048908E4AAEAAA3B7C98846278AFDD1753252F39CAED7D334D8575CE3ECFB2EDEC31AFEB2BBE67FA929A267376293C2B2F295CD8DBD66106E1D9518BE1798949F3315E0454D018C2B706FE836FB37AB908D9D698AF495BD285A74E4CFC7612D42121F43FDAA7DCF44DA82897B820514D66B92983A3EC819D2CE208D688B6F0AACADC0CDD619D815CD231AD8DD9B6DBAD9C47E16FAC098D0F4279AB52055D2FF765AF6E3618C4509FAE6AB00FA23980EFB19A26E0A6EA4C9A7DC699121388748449C429B28AD2779F5642F05FF58B68BA3E289F90EB27CE06392616C080D659338CAF274D46A90D58F2BFED25E8D4A8C62030A5E89F6B1A5F6112A38661E2F2B5A37BCBF050812DCDCE9C0A939ADF929C921E7DA0C30815DA318EB2F350F286441CC92060C970077623EEE68B8C6FEC9FFFE780A6FC85FD7AF90172951337AF57339E98049132A4CF58874A7418FB7ABA0628B6192BB2C43102EE6B1D7E824725D9C75D34A8B69DF4A6BCB1F96B57767046C99EC6352751E2FE1075BB4092672379B3518DDC884FEAD5BD062B0336EA88BCBE0D22E066566347FEB617A322BEC561E9AA9D2177EEF0DFEEAF6231AD56D0CD9E300709C9317B3D334D8D2AC97F96CF2F45B8582C4128D95DA8CA207AE34D3DAACCDB128C11694EEE6D3E8E6AB767B6886B1F7235D85A4D9C7C831C5DB8AD8323F63927A638E19497CFB308285A03CA2C1FE2AC4D919AD11511ECC6F28E7D0E0A614FE21B57BCCDF83535C7E2C40840BA0014247190C580378454751EB3F2361D7193E160B9516F7EE1D683B336B873C8BA22E97480A61F002A73844C78309C0A3B31BE30A192A62BDCC3D33A7A5BA1F6AE0404A8558740CAE46E5FD15971B41C0BC39665A9B92EEB3328C328B073ED5B3720D37A1C097AF8A6FDDC3B2B067680E6CAA760368B0E1C052E804E9F80F26B52596202FF2E0AF7215999EAF7D3EE3E8916744E40AA1154322DD068AA15960DC38671A4F5889FBE709CE1DECCFA80B9D33AD2FD963FE0581A2ED7718A27CA62819D05BAA3212EC7CC1C5472BCF579AD52D5E1B2BEE637D9827851C419A4CB91DB57B2A6CB4433C1BD209648F1FE170ABB964B272BCF0A263CE28CFA3A9D1449CFFDF643E37AD97182F0031CB334A1EEAD23D63A5C2D0A675D0ED000F37FD2153E1AFC4AC01692701014927601203ED2B8A477CCEC45C1F43190E4FBAF2295E32A9383FC7915AA76950A301ABE47BFFAA9C294292126934CCFC173115A6CA96F3945FD5F924A5017125AD5AAC705106EB852EF3190A24420196ECD37F7C67B57162CBEB97DFA +pk = DBD1FBA53884AB2B7F3916FE7B07836B6BAC99911CD152A02BE14B6CAA02161038DEBB63A9789CEBB7D1C42A1353CC8E1D96EB0EE872A149C027253C8F53C800BFFA76F7C7E94FDF7D3D6A5E40473DE48837938A08BB618B89E600EA2B0EFA15733A746F5DCC14CC426E4601B2651EA5D99B8D5A9550B567B10368C3D7474A0009 +sk = DBD1FBA53884AB2B7F3916FE7B07836B6BAC99911CD152A02BE14B6CAA02161038DEBB63A9789CEBB7D1C42A1353CC8E1D96EB0EE872A149C027253C8F53C800BFFA76F7C7E94FDF7D3D6A5E40473DE48837938A08BB618B89E600EA2B0EFA15733A746F5DCC14CC426E4601B2651EA5D99B8D5A9550B567B10368C3D7474A0009DF1B921C712FAED1D2FF1AD9DE6761148A6BB1288D2F9D6E8E0A353836999E26740000000000000000000000000000000000000000000000000000000000000012BBFFDF0BF74815ACD118C644F918101A250984DEA472A14D8D13E20FF2BB0134FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF094850D3BF3B02B13F32017885B1B80A65E4DFC75D09ACA9C6CD12A9F6EC256C7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002317FA52F245B0129AE2F71BBB8E498ED9B3EF437A0947781ECF21E5CB42C2A2420D4EAFF6965B39D88D91DF5F5534717C8623522B1BA315485E70AF879A0AFAADFA507858DC5A3705ED32FAAD25D78E2FCB0A9289891F5AD24F83B9937C54BA6EE11467791138F8E776257D8EC7A5753EE91C74C014F96CB1C34693310F33F40AC4A87A4EFFCA4A71FBF84C5D58F53B1AF4361E5D2AA950BBF7EEAFE98C8F914D9FEBF4D263C68692BEE50098C45DDB55E57F13F72E5F5CFF2C1F4E01B30CA98990C878AC4DC3A66140B639ECE75F8AB665A631460CD5AC9F6E4E70487D62D9DF898DB89CC2D0F39EE1306C04635C8713592849F668043ED894B60D +smlen = 2866 +sm = 5040254973F89D966C6EAE6311977FA8717542C2D53F8009AA1687499FA884757BA9FDD6AFEAF2AF6332415DC7CE5A6684DF500650B9AF24EB6263087847CF006FEC82CC11A16597DA1721BFB6487E4C52C4287A06AF34A9D2D18C2CD5FBB8C19746DB693BCD28116E74B8FA6CEC143D4E09B112550C61AB18D0893EE14F3E000202852AC67BC44400FDBE66DE3131D709AF570A9E6D93802C057E8E4000E966F90C4720CFA7D237C8F75B8AF26C8D9A8D865B3E75416F62AA567881D0FA7BD26904B946C2A85DCAAD677B45C97975A9AAEFDE30ECB9D25560BE8B7746AF5C27F800EF6FD2B259643807E50AAC3995E8B0875B0178BF4DECFD32C32E8984C365ED155C4E37771A98866FB840BD0C1401A778B162665BB101DF1CA1CC929283F57E00020E34FCF4626248B979A7A8D306CB9ED69C4CCB5CC3729D2692E0BA679D5C2FEAAC54A4E06D4EFCEDF78E19357DAE263E1B5D107FB09618A9C34F54F19A738A66B95E6F88E20E01F879F53E8F4C371B571E1438FF70E0A8CD00D608976E24501B2DDD323EFE6C1302A318CAD821C6FFE641672BB80AC62286C69FCFFD93422911C46D43DC9A1F00A73E19EBE6CC09A9801F2A1DA708F0F1F98E7F1A18529010823230279F487911CEF1E784A229D9E311BCE5E2D368E6D613F791DDD617D0F37F604B786CA2BAB754E8BC4BD3DA37E66A54DF1D3B268A5A80379A30A52B1532E8CFABE24168D83CBFD61E2346F901C361F771E0BE3E03DAE8CC30614C10FB8DCCDCAA5B9A25DDD8D61E61F60F22308E12ADC137D3D8C53CF7B31984CB813758BAA19AC178F2F0CD2155ED674A7509A3CFA7FF66D2D9B1E60BE50FE7FB79591C500F66BB1D35EDB80263F4B696A3DDA0B9B2911D01E76E9070D99DB93D1D0C3874CFFA776BA24424A6B453526F7C44EAFABE13C0750F9DF33E82105930139E70B5CF1B09DC3913D6BF4A4859F67FE814FF038F0FDAB93522A35E7F81002A395989D68B8B7E4235A09837CC6402A5338DA08E7C73DC63C43BAC42054C694F4931B80140D6B104EDEC995CEBCC5629F85D09DED8257626F9FA4079ADEF81D044C18BF2277DAAA41931B62A6028F89F95F06D8A8FDEB95EB2EB1E90C0D8523E0B476B158E3040F212390AB2503021E8D6FC0733B963CC6188FB2532829925B59C8255D89F10B657053D0FA1D8E76C84826A4609284503D3A101EBFE7AF93EDC423EF5303CD946C8B570511E38EB04BEE0060E678D03E4134F84F279A570AAD0332417FB2099E3F1F279CE7D6DDB080C5D83064D107BB560B21183AE165CBB54CC75313DE72D40D1CF5173455AA55C5C356D7C40A2A7023DD95D3F89B515D7598F800DCB7BF68B707978ECAF55B794A17559BD1E913F4472B1830783BBBAB5F23A760C78C46157FD1B429C445494CDF92FEC8BF9FC217D3CE2697BB6C671BAA793CD0C1C84F579F0DAEC400BEADA799A9F417FE4744145F21C6F8559AFA7A514A0E951F03E5E68C17A8E5816F3FCF41774D26BE2EDC11FC3A42CFCF00F817C3D0FBF474FD7F30C9C3C6BE7F74FCC79FA6AB07CAB037EEA7D83866673A74C087B5F7542804071D53CE348D2E836749E35AF0FB884D5D53ABB195AE1EE6E9AE35DC91BE359BCD510A7801FC243C07DEE92373918AA4F8A89EDA3895A52456F7244D1FF007CC7B1A52CBEF4C1ADE1C2C0AC189AB24B3F260475E1D08E7C5BFA30A1CDD71DE5ACE80D5FBD1D0F17198B79C8EEA0365D139F2AE73CAB6FBC9A79786896DE0CE7FC747D68FA4ABAB662A09E0E409F7E652153352BB92F5DA1836B0E92B0B644C821B2DD2BD0AF193AC0F8CF5B8D88432F0248DAB09B46FBEF2EF1899B5981E9B33DE4E9927AE50890FEFC35F681E075D8B0169A2E16FEDA6392AB9858DB87ED18ACBA25575AFD1FEDA9FB3FD01ECAC13C245DF6972F65087513F505187C4E8EA54B6433FA092B6CD3AF13F4718693904435C55D273060FBB5FDA76074691269493E86F287922D074E54EFF04209B2FDD3417D8436D1395E638D57DB75D68F4F819141B6DAF4D13A9A18629CF5F84B0CD02E7A397715DDE5476BDC467218D11AACD6CE399D9D54645BB27CA43076B7E4E57FB4F7C4F4B8D0AA949719D731C3A927FDEF1533D773CF1BB562D5EA43817A5ACEFE9EB7E51029DEA143E8A1D5F76F9BFD74A26C6D38F54194319A1AAABC4DAF45EFBAE770B9E9D834C09FE45C15D4BBC0251D3DF2F2F23387DCABCE6CA7A59625E18FD997770D164C338D0692AF97C749FB746C0D3944CA4B2DA6D3AD7B8C3AA922FC029CF9AC5580CFEAFF50CB2E9044211EA522BB5769BEB7A7BBA0743F345FEEA9AA9DA6EC5F0579CF7A5AA4DEDC832FE3F65185A31FD49C0D259E3B7F8FA96E110D130F588CDEC30D0FD4860CA6673C46D961FC68A4020FB03AE24B1AE12967EC1ED19ABEC0808A7EF89521152033F70F406A7005819D28DFC556C79DE18584088F40BE40A555EAEFA78E3FA3D9360A7CEBD963555CF208DC408A07CCC1369F98BD840F5C940721064E6C7CB241ED0697AF0FACF36F05632A504870ABF90134A01AF00D340F7A5D548A8078C2049600EE454D15EB8CE58C26B3C8185CF9DFCDCA7D4B6DCDEB82230F993D51E701D8387B06BD45B4B61DC9DA6D3B4356F50C1D4AD2B467D36AC092442FA90D1DEB014475AC7CE90C974063459DC951DECFA30D2DE4C70FBA39A8B6931217D0924FFA783C8C3DAF048908E4AAEAAA3B7C98846278AFDD1753252F39CAED7D334D8575CE3ECFB2EDEC31AFEB2BBE67FA929A267376293C2B2F295CD8DBD66106E1D9518BE1798949F3315E0454D018C2B706FE836FB37AB908D9D698AF495BD285A74E4CFC7612D42121F43FDAA7DCF44DA82897B820514D66B92983A3EC819D2CE208D688B6F0AACADC0CDD619D815CD231AD8DD9B6DBAD9C47E16FAC098D0F4279AB52055D2FF765AF6E3618C4509FAE6AB00FA23980EFB19A26E0A6EA4C9A7DC699121388748449C429B28AD2779F5642F05FF58B68BA3E289F90EB27CE06392616C080D659338CAF274D46A90D58F2BFED25E8D4A8C62030A5E89F6B1A5F6112A38661E2F2B5A37BCBF050812DCDCE9C0A939ADF929C921E7DA0C30815DA318EB2F350F286441CC92060C970077623EEE68B8C6FEC9FFFE780A6FC85FD7AF90172951337AF57339E98049132A4CF58874A7418FB7ABA0628B6192BB2C43102EE6B1D7E824725D9C75D34A8B69DF4A6BCB1F96B57767046C99EC6352751E2FE1075BB4092672379B3518DDC884FEAD5BD062B0336EA88BCBE0D22E066566347FEB617A322BEC561E9AA9D2177EEF0DFEEAF6231AD56D0CD9E300709C9317B3D334D8D2AC97F96CF2F45B8582C4128D95DA8CA207AE34D3DAACCDB128C11694EEE6D3E8E6AB767B6886B1F7235D85A4D9C7C831C5DB8AD8323F63927A638E19497CFB308285A03CA2C1FE2AC4D919AD11511ECC6F28E7D0E0A614FE21B57BCCDF83535C7E2C40840BA0014247190C580378454751EB3F2361D7193E160B9516F7EE1D683B336B873C8BA22E97480A61F002A73844C78309C0A3B31BE30A192A62BDCC3D33A7A5BA1F6AE0404A8558740CAE46E5FD15971B41C0BC39665A9B92EEB3328C328B073ED5B3720D37A1C097AF8A6FDDC3B2B067680E6CAA760368B0E1C052E804E9F80F26B52596202FF2E0AF7215999EAF7D3EE3E8916744E40AA1154322DD068AA15960DC38671A4F5889FBE709CE1DECCFA80B9D33AD2FD963FE0581A2ED7718A27CA62819D05BAA3212EC7CC1C5472BCF579AD52D5E1B2BEE637D9827851C419A4CB91DB57B2A6CB4433C1BD209648F1FE170ABB964B272BCF0A263CE28CFA3A9D1449CFFDF643E37AD97182F0031CB334A1EEAD23D63A5C2D0A675D0ED000F37FD2153E1AFC4AC01692701014927601203ED2B8A477CCEC45C1F43190E4FBAF2295E32A9383FC7915AA76950A301ABE47BFFAA9C294292126934CCFC173115A6CA96F3945FD5F924A5017125AD5AAC705106EB852EF3190A24420196ECD37F7C67B57162CBEB97DFA + +count = 78 +seed = A315BCF0E6835892ADFA07C034BFCD39F80B62925A95490B20170BD29378E11559C7F1CD296377FF1E01284EC727FFCD +mlen = 2607 +msg = 96AD5FAEF409B8A4C21ACB1ACB596BADF387D26656BE3EB17987AF59737E324B7BF8412A306B0E706AEF73D79AF753D9B0064BA9CED8DCEA966543FE748E2611709ECD1CE6E4DD8FA812D485E91809A225936675369574B0D104A258E3353EE0E021683615CA5C7C531FB29A5025CC7F7323860443DC19C9858F741EB9D24A9F6F04FC839B67153214116E8B7FA982F338445830F915F7C85C88C23BA2A3CE8E2020A9D8DD7B18EFE95563E3924D2A341826AF51A8584CD026B1C433EF0221145BA8BDC8F73A467B33A9EB3E8CD2A4D671C17D7C28AAA539D1C5BF2F4138639AFB89CE791DAF0EF0281D52598F4C13D210974CFA1F099A0FC70B1DC120E5C00C33A2BD360BED57CCE069060D6380BE2204852D8BCFFF4918BA0B70B0BD1E1D55DC1D68DB1D20AE713B0093EAEFA1E33D40D9BD95CFF17568393E9BBF5CC1287325D2668F65DFCF44ACE2F6C6CEBB62F1433E69CD19E6C6532EA93682B22C4C4A62C6ABCFAED08EE64F32723E56205222E4AE0831AB8FCA8C265FEA0CFC66AAB1E367201752AEC11F752B963792C071E42A8A1AB80658A0C6960147ED740CD07F307CF6A644A98E1D2E56C625ACF458D0BDF6216A4F1B9C78EC3F14850C803A4207C894E61A8AA88840A27F2B439FA7CBAABBC789102A95323E06E2C324859DB92C6CEAEFDCA389F677082180FE3D6202FF60DAB9F87E3B84841C0A4EB5974D893333F7F1513E54EA4AE0731EC409F69B77089FAFB121300042880EA59B7927E9435EABFDCC1019A96E145D5D157998D620E7BC6945DBD6CD78E94C2D89589F8DC8A01CF1B295A26B091847F034937F764ADFD811F52B3AA187F3F49273EAE5949FF34B64BC86FF11EEFE378825D526509483E7191B33333E5465FFB025B269F898CE1F83EA549F1864B556C729F510118921B69594F67B8C229236AD3AEE55BD7082E027B5D342C976A549E01618288944DE0B2C77473A25201B61034B334968178AFAB7F8CD1FEB6A25CF8DCE3586FFAAA861471E2EE7F0C22538FB3C95D2145965C4673E6489764AE24B4F048DED77FE3487AE175F6D4898F69F9FFF276470A93DAF986A75F685919D98C9C609C795D4785AE941C782B551EF382F47209AADEA19066AE5D3EBA7BBD99E91943F1E62754A42FFC8048F7B87F128CCF6C96BD760B45F07F740E94491874B06CC3450AAF55BC664B407C57369CABD2708A9C478DFF64D292D96AB71EB997F8B71CDD6BA02F52C5035EC26E8111EBF8268CB00DF9ECD63BC0D557E2D2E77A6363B00DAF25237E77DAD03F929E5E9B39447A70D4E5F4B90958F312C80D594E1B1F3D0D23F2B0D9753BF3544061CF0C0F841C440319E74F9B9D15B91EBA1E680ED6AAB7D63A97B48C0A4AAF314E8E77E2EA6BE9DCFC7B5557FEC1B996A37C86CF6941325EC356EE75671726BCED7D2157BE8D4C62CF4BD0420BAF2C4223597C0EF75F7A7C9533D14BE0D21C37F06FAA53ED5EE0DDB025862417F98D2F188895395CF2FE72185ACBEA952F55CAD7EC2D684A5AB94B1257D7ABB565B8C07B88C6335FFB9D2FC6F6779CC24FC3CDF92BB3B12EC54360A7CF3579632A2A65C518E57015DF1C616C857F83F5F1AAFF693ACFF210DD1E95CE04CCA9A0BF385ED6EA2AED894E79D5133799393469B666209371E708D4D279E1AC5ACE28985D0DB2765D547C2902B715BAED5A4FA3E7AA42645F3BBE1E9F3CDB87B1DD8DBB5AAB08626591921CB49E552F8EBAFCBCF428470719AE40B9CA847F31848F39E4D42049C5D40B0BFF036E5409A6A12E7924148E60B64BB83386079B54486FFC8187302893B8BF826578D9CA03A1291983F21DE7F6E65458F8942DC1B135C6C8C1FEF4F3863A58DB17112419590AE57B9425592FF22E596191E5BA7C513EC315EC3476C95A149F6A5EC1CF24870400FDF46217A23F42E0B61157C3CEE23E7916B4475A94B96B917C171B1A34DB13AD98833E457343F94A76EE226FA5B9F3066C2FD69F14D3AAED1B31F5114780442EBBC88D0DE5F689CD910E7464D73423B9D4E03718C5C51871250D11E27E28DF1268166E3AF328A80D9D335F2D27D2E91DC61CDDC7F733E345D56C11B6130875D93D527F93542FB352407185E7AC07051AF7F642E34FA06B1376BA15A35D837C1BFE090BA67A89FC1E307DFF3F02A988ECD48FD229733F641F2609EC8DB14B1A5AC170B104F03C2509D2EE6844C716766D06A6A25D957530FD68A8DE6F1753F83EC19EA2DEB1A4F9C7986F20FF60A7508DED6547A85BABA70577062E8144BA0496777A5218595E021937FEBAD4BFDECAC29E3FFF2EFE7D598FCB86F93A734E4C573E1496A6282A3B40E817DD3C9D631939AAB350ADC703899EE3BCB1B5EAF6EA8420DD6EB2D4F64A1818AAFA97B73C75610B6005F1EDC1EC7D8F8DB1E5D3E9666C1292515105037D26F2C8D83FEE1F4EF5DEEB287CD7C1E11960218C1B8BB50453488BAB019435065AEDFECD8D218BD1E751FE736442E8D09CE7176A71C06415A30B070693A68BDAA5CDF62351AE665F37FEFDA9481E62EC181ED24F0D0649AD01C89AC422F1B7E27895E55DCC2FD817346D361FA559094B37894C0B478C68A1D7564D089D9D4417D5C7372A33BA475A81FC129F3259C5407BC7435825B415782CC84D85E69D9B44B32D78FA255A895CFD55319DAE677FF89D93A3884CE9401775563FF1788CF3AC11CF96DAA199E7F4579A0264378A323FDA64FAD2349C09465FB23BA09069C7FBC79E7288A82F9165268F6842E0AFF0E250C21BBAEEFB4347D4EF1CD51161DFD29BFAFFBEDF71DEC93F4157A5C18995379ADE8D15DB59EC4A8B308C2EADE1B7DDAB55CE2220F3B3AE8CBA7C8211CCCB3846A225B438F4B37DF54363A987C5C4E6B9D20EC3C0096317D11F982184B75D8EFFD168B7B41317D40F903A23A2649999DB36CAAE31BA5D91998A684D30AAADBD3B1EC154BB6C92513BFC0C47C673254F42B1FA36B995CB737668CBDC2A0D1BA838E74E0E50B22FC22DD048F48B6D1E89E1CCCE5A226F63AC7B8E6E9E8CE27050BF3DCD7D0F35F47BBEC1CAABD4D619CD77302AB4FF6F56DFBE9F5821AFF2D72EE6A628DAAAE4440EDCC070473BDAA54CCD775331AC2812FC5B9884915DA582EB36F85C7923F06D961594753802EFC5883CA484FC64FACE42DE6C3105E23CB90663A3B381D0C6A7265B740BFF0A1A017058F06E39A74BB07B63F883CF914FE675E7E5AD5AD44C9F90DDBE23A125D9BE02264EDC13972FF22BA48ECE8890A223EC13ADDBE055A8B4E03882677FC0D94C9053DA6CED34E132FD83810A793350446D60AE5DD0D174B534A3B6F5BC1B497F9406B5CDD414401B6DD881CEABAB12CC51425E88A81BD9E14BDA18273583CCE0849AA48DBA1CFC49CDF29242C73C99C87F063B8B739AA787570459C098405DCCEF78D6D97C21545F2959DF9CD62F9C38AD9A849507C23A51714565642DD76C9103154327985F7DCC701B795A7AF8625F06367ADC11A7FD7B6ABBDA5B2FF6A825DD43B64A48EDE4EFF8603A82159A6011F9E626171E4593C0E963595A6E068AD05FEB12378C71AE515A82C293EB7D2B01B333CBC7991B44685AA7513B3A58342BA5D094B773E6A27F8582F3DABF54DEF59974CB8A2499369B5B64C7AC08D32D75FE37371C578073DC83B82A828DFC325976FF282D3F6 +pk = FF169F4A219A6749CADD0E286FFCEE4C715FA18B0B2D5887B224AC2FE72AFC2A8F807B7A0B5FEE2A413E14DBFBB372395DF01927714C3DA484288E929F5882003545D4C30FF3FB817F2736274BF8910C9EB42D29741132517C201C35D5ED6D5FF8470DDC90FBCB3EF5BF7F7E94916FB75B6D03F41AC2E779EE4278111BFC7C0002 +sk = FF169F4A219A6749CADD0E286FFCEE4C715FA18B0B2D5887B224AC2FE72AFC2A8F807B7A0B5FEE2A413E14DBFBB372395DF01927714C3DA484288E929F5882003545D4C30FF3FB817F2736274BF8910C9EB42D29741132517C201C35D5ED6D5FF8470DDC90FBCB3EF5BF7F7E94916FB75B6D03F41AC2E779EE4278111BFC7C000235C2555845B6A3BC3C801F56A5AE7085CB4AF8D1A7D3451B170CD9820ECF88168100000000000000000000000000000000000000000000000000000000000000F45A3C04B770D4E0D3A1B72B49782EE82F328B33DFCBF61CE4259F722F0D0384C4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57243CB7DD58F5F1CD9F120D4CDAAE06F63EB4349B3E213688FCFB53E9B2DC4C00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091699B6AE2DB42F39A6E70A685CD229A6DE3A3BCD05058FD723887973112D4268B465AF5EB405785A72B8784BB2E1A2C58A2CF9264BF5BE53BF6E1CA0F210B5FFBBD9E193F38CB8C2451F1A739A72EEEE6D43144084BA1861473ACE0295A3AF21E441C672CCA932AE0F73F9AC301F4DF343DDCDEC67618C136426A4A8905E1D501C25D5609E4D2AE6ED82B8DDB16EDEF0A46E9580278276D195C2B4950BB17293561472D145EC57F777107AF647DF78C4768326DE991C1CE2A1DAD85046455877DAD1F451B17B8701FEEEF352B2642A3CD88DE14D07E7ADFF7252CCE7B69E66924AFD06BE892726FDB4FEB9510219E927B4B8E1F6B079FBC8EA1320C +smlen = 2899 +sm = 556334C112FC4E931FA6F62FCF1C8A33770FB724D78A579EA9651D42ECFD9D75DE42DB7023A7B26A3AA59C158C40D6D590C97708997B030947FCF72D8D99A001F0DF57FAFDEA2D8962B1135B53A590C0DCBB8684C6D85CD06952F44F6BA7CCFC0F58CD42B5B5235461D794219F18B65EB2A76E97E3820F469A8C9F5AA55DA1000000ECEF8D4A0F1D16D4850AEBC2C8B130DEC24B0C8CDE2A7C9326B2CCCE2C6E6A5303C6B2142DBF2A9EB45DFA37FC9AC3E3353CDD772381300E43136770FF349670A11CAB31ADF23DB88175BD3FE78561BCC7533E08EF79C211B8203B01D84A1C50033E7CF11199D2D6339EBB4D37615DBACD4E9CE476427E79E86B2744AC8C9A29A16D58D150EF407BBCBC02188108F344C72409D0EEB2B13E955FBD9C3EDC0000020B96AD5FAEF409B8A4C21ACB1ACB596BADF387D26656BE3EB17987AF59737E324B7BF8412A306B0E706AEF73D79AF753D9B0064BA9CED8DCEA966543FE748E2611709ECD1CE6E4DD8FA812D485E91809A225936675369574B0D104A258E3353EE0E021683615CA5C7C531FB29A5025CC7F7323860443DC19C9858F741EB9D24A9F6F04FC839B67153214116E8B7FA982F338445830F915F7C85C88C23BA2A3CE8E2020A9D8DD7B18EFE95563E3924D2A341826AF51A8584CD026B1C433EF0221145BA8BDC8F73A467B33A9EB3E8CD2A4D671C17D7C28AAA539D1C5BF2F4138639AFB89CE791DAF0EF0281D52598F4C13D210974CFA1F099A0FC70B1DC120E5C00C33A2BD360BED57CCE069060D6380BE2204852D8BCFFF4918BA0B70B0BD1E1D55DC1D68DB1D20AE713B0093EAEFA1E33D40D9BD95CFF17568393E9BBF5CC1287325D2668F65DFCF44ACE2F6C6CEBB62F1433E69CD19E6C6532EA93682B22C4C4A62C6ABCFAED08EE64F32723E56205222E4AE0831AB8FCA8C265FEA0CFC66AAB1E367201752AEC11F752B963792C071E42A8A1AB80658A0C6960147ED740CD07F307CF6A644A98E1D2E56C625ACF458D0BDF6216A4F1B9C78EC3F14850C803A4207C894E61A8AA88840A27F2B439FA7CBAABBC789102A95323E06E2C324859DB92C6CEAEFDCA389F677082180FE3D6202FF60DAB9F87E3B84841C0A4EB5974D893333F7F1513E54EA4AE0731EC409F69B77089FAFB121300042880EA59B7927E9435EABFDCC1019A96E145D5D157998D620E7BC6945DBD6CD78E94C2D89589F8DC8A01CF1B295A26B091847F034937F764ADFD811F52B3AA187F3F49273EAE5949FF34B64BC86FF11EEFE378825D526509483E7191B33333E5465FFB025B269F898CE1F83EA549F1864B556C729F510118921B69594F67B8C229236AD3AEE55BD7082E027B5D342C976A549E01618288944DE0B2C77473A25201B61034B334968178AFAB7F8CD1FEB6A25CF8DCE3586FFAAA861471E2EE7F0C22538FB3C95D2145965C4673E6489764AE24B4F048DED77FE3487AE175F6D4898F69F9FFF276470A93DAF986A75F685919D98C9C609C795D4785AE941C782B551EF382F47209AADEA19066AE5D3EBA7BBD99E91943F1E62754A42FFC8048F7B87F128CCF6C96BD760B45F07F740E94491874B06CC3450AAF55BC664B407C57369CABD2708A9C478DFF64D292D96AB71EB997F8B71CDD6BA02F52C5035EC26E8111EBF8268CB00DF9ECD63BC0D557E2D2E77A6363B00DAF25237E77DAD03F929E5E9B39447A70D4E5F4B90958F312C80D594E1B1F3D0D23F2B0D9753BF3544061CF0C0F841C440319E74F9B9D15B91EBA1E680ED6AAB7D63A97B48C0A4AAF314E8E77E2EA6BE9DCFC7B5557FEC1B996A37C86CF6941325EC356EE75671726BCED7D2157BE8D4C62CF4BD0420BAF2C4223597C0EF75F7A7C9533D14BE0D21C37F06FAA53ED5EE0DDB025862417F98D2F188895395CF2FE72185ACBEA952F55CAD7EC2D684A5AB94B1257D7ABB565B8C07B88C6335FFB9D2FC6F6779CC24FC3CDF92BB3B12EC54360A7CF3579632A2A65C518E57015DF1C616C857F83F5F1AAFF693ACFF210DD1E95CE04CCA9A0BF385ED6EA2AED894E79D5133799393469B666209371E708D4D279E1AC5ACE28985D0DB2765D547C2902B715BAED5A4FA3E7AA42645F3BBE1E9F3CDB87B1DD8DBB5AAB08626591921CB49E552F8EBAFCBCF428470719AE40B9CA847F31848F39E4D42049C5D40B0BFF036E5409A6A12E7924148E60B64BB83386079B54486FFC8187302893B8BF826578D9CA03A1291983F21DE7F6E65458F8942DC1B135C6C8C1FEF4F3863A58DB17112419590AE57B9425592FF22E596191E5BA7C513EC315EC3476C95A149F6A5EC1CF24870400FDF46217A23F42E0B61157C3CEE23E7916B4475A94B96B917C171B1A34DB13AD98833E457343F94A76EE226FA5B9F3066C2FD69F14D3AAED1B31F5114780442EBBC88D0DE5F689CD910E7464D73423B9D4E03718C5C51871250D11E27E28DF1268166E3AF328A80D9D335F2D27D2E91DC61CDDC7F733E345D56C11B6130875D93D527F93542FB352407185E7AC07051AF7F642E34FA06B1376BA15A35D837C1BFE090BA67A89FC1E307DFF3F02A988ECD48FD229733F641F2609EC8DB14B1A5AC170B104F03C2509D2EE6844C716766D06A6A25D957530FD68A8DE6F1753F83EC19EA2DEB1A4F9C7986F20FF60A7508DED6547A85BABA70577062E8144BA0496777A5218595E021937FEBAD4BFDECAC29E3FFF2EFE7D598FCB86F93A734E4C573E1496A6282A3B40E817DD3C9D631939AAB350ADC703899EE3BCB1B5EAF6EA8420DD6EB2D4F64A1818AAFA97B73C75610B6005F1EDC1EC7D8F8DB1E5D3E9666C1292515105037D26F2C8D83FEE1F4EF5DEEB287CD7C1E11960218C1B8BB50453488BAB019435065AEDFECD8D218BD1E751FE736442E8D09CE7176A71C06415A30B070693A68BDAA5CDF62351AE665F37FEFDA9481E62EC181ED24F0D0649AD01C89AC422F1B7E27895E55DCC2FD817346D361FA559094B37894C0B478C68A1D7564D089D9D4417D5C7372A33BA475A81FC129F3259C5407BC7435825B415782CC84D85E69D9B44B32D78FA255A895CFD55319DAE677FF89D93A3884CE9401775563FF1788CF3AC11CF96DAA199E7F4579A0264378A323FDA64FAD2349C09465FB23BA09069C7FBC79E7288A82F9165268F6842E0AFF0E250C21BBAEEFB4347D4EF1CD51161DFD29BFAFFBEDF71DEC93F4157A5C18995379ADE8D15DB59EC4A8B308C2EADE1B7DDAB55CE2220F3B3AE8CBA7C8211CCCB3846A225B438F4B37DF54363A987C5C4E6B9D20EC3C0096317D11F982184B75D8EFFD168B7B41317D40F903A23A2649999DB36CAAE31BA5D91998A684D30AAADBD3B1EC154BB6C92513BFC0C47C673254F42B1FA36B995CB737668CBDC2A0D1BA838E74E0E50B22FC22DD048F48B6D1E89E1CCCE5A226F63AC7B8E6E9E8CE27050BF3DCD7D0F35F47BBEC1CAABD4D619CD77302AB4FF6F56DFBE9F5821AFF2D72EE6A628DAAAE4440EDCC070473BDAA54CCD775331AC2812FC5B9884915DA582EB36F85C7923F06D961594753802EFC5883CA484FC64FACE42DE6C3105E23CB90663A3B381D0C6A7265B740BFF0A1A017058F06E39A74BB07B63F883CF914FE675E7E5AD5AD44C9F90DDBE23A125D9BE02264EDC13972FF22BA48ECE8890A223EC13ADDBE055A8B4E03882677FC0D94C9053DA6CED34E132FD83810A793350446D60AE5DD0D174B534A3B6F5BC1B497F9406B5CDD414401B6DD881CEABAB12CC51425E88A81BD9E14BDA18273583CCE0849AA48DBA1CFC49CDF29242C73C99C87F063B8B739AA787570459C098405DCCEF78D6D97C21545F2959DF9CD62F9C38AD9A849507C23A51714565642DD76C9103154327985F7DCC701B795A7AF8625F06367ADC11A7FD7B6ABBDA5B2FF6A825DD43B64A48EDE4EFF8603A82159A6011F9E626171E4593C0E963595A6E068AD05FEB12378C71AE515A82C293EB7D2B01B333CBC7991B44685AA7513B3A58342BA5D094B773E6A27F8582F3DABF54DEF59974CB8A2499369B5B64C7AC08D32D75FE37371C578073DC83B82A828DFC325976FF282D3F6 + +count = 79 +seed = 8B47E0EBE786914C9A52D547106CEB4A3D3DE938B3244E02E5F9660954C4C95A23F2476FCCB487673AAD0513820905DF +mlen = 2640 +msg = 2447D338BF1A375B66B77FB96CBE7742508B57DFF4D33A368EBB8451C2C67B980D3576E6588D8678B285EF288A8B5C9C2726C4A550E764E47FFFA2A128533A7653E480288447509E10013AE1944FFFAFBD9E2BACA0B3C7069C07A4186C056FD3857CADDADD5F891512DAEEB26865F5C89FFA63A64C85A08E41EBE7BD8786A8ADD571A4267D5A9E426840A0B988E197A09F3770B5B0D80D65515CD4D8390AF40E6150062DC4B8661A8238F232692C152C97B8CD5BFE7B5AD863DC92D99744D769087B3EDD81D2E475F5CF0224B10CDE6FAE8DFC3519EFDBE66805AD4468D84D3DD93430363677360DA8F56CB58A6B775FF6417C1F324380B15C9BA668EB0F25FC2A690B483E856F3327B2D79FA6259E30D7F76199CFD21152B7C6FFC3FC113F70D3930C08B3C1EB1BF25C100C5A930EEC2C52664F092B89614943D9D85ED86A2EF666A94F9826C3D116A2BBE49443E2C11748C977716381D9463DA8D09612B80A6760E5A6FC5F59425EAAAD6C8342C1EA4BEEDD5D73151CE213C0B155286FF22CD28E3BB88E0CEE39CB859900D1E0FC19F6A7237BDA8E51476F4844A316752FB347492A928EEB07AA39ABDCC0164D1921B61352ED4AC94B82C410A56505633BAD53A3E649ACAF64C43C1ACFCD4715FC594AF6FB9E85B0B7DDD6E8621BD12A2BEE48223A97EC8502C16B550B03087B6E87C1A860D36322064F8FEBC52F2B7C31DAE7430870259BDAA5889852E3AE6F61013F5AD0D38727CF9D90C67BD7BB3B82D303C6C35383ED86FD5B7DDEC824EA198EF780BE830A1F2679D24EA6E2FEEFB979563F511D188F409F0CFD0050FD418414D01E46DB3D23B3A90B24F4E96EDD4F863BFB333D6A826D29EED167738BBE22C516C59FDF81B032BB55473A5EA2A1DEFE71C95A1EEB5C028435AD0379896CBBC76877501B054CF1FD2F6D7A9DECCD70D0C07111147EF568DCE514DE96EED61600029C8D103B31C8B344A700DE630276BA2C5633419C59E66577659538A6381E45584C7E1D6ED978AB0AF89067AC83BB70DEB6F2C58E339A5A66176A54D985DA6E02002948C62BE6F12314240FE18B09AACBCE82EA462586B8316C3E0AEA00F9998922F8D956120E53B4178223F4D2934A20976FD5A72027C8F4CB33E9BBCC0ABD15395151266B6CD5B4A9E2FC1725D8E9AB2CBDA47B507BB25AC995EDD51EBDA5FD19CAF68FAD8EAC57CB5EF0C6FC861A73E64648EE3255DB4C3394438F49377CC4AC2FCE1B6BC812E5D282F122678713C6C6D452A33C632C0AA47686588752D72B0586FE5EC2464A6DB40662FD2106A19F67DCCC45692FCA03685251D512642B0CEE436C78D94C6F5F25BBCB41FC7E5B1AECD52B846A0B70EAC93579603E9870F942AD4C1CFC9D49B1132777C6F1C184C1537178E5029067257A2DA2827A2EC44D323D13DC6E4E1B9EDF5949D4324228687FD54F02CCC3C4DDA635FA546A5A6783959B1C48AA9D9C9F6381EBCCD979253460857D3CB1C70893EE6F04709E35923883EE3C71C7F33B8CC28B9136B3EBE5F52B9A76817F2F74FDC2F12B459DFF32D5A295BE374B3FE507A0995BCACF1E7B24F4501B29F1E8B4F2A8CB394B3E459A4296F6439BA59EC88305AB045FF40B1DAB4F672F878DE1F9E46B9326CB3E2F3457B83EAD8DEC28DD079AF0E984A69ED882E1CF21036578485DFC2DEBC9CFE82FCE0383B4039D147C4C7E31E315FB57B9093DAA811F4EE4568E32E5625ABE76C5A1AE42A03441DBE766D0EF4DF607406F7D489275E8C5D4470866F9049A4AD5C428B843DEC3702E86E177E4B60181D2B5F099BEBCB25F04C93D087C72436E87A9B3AFCE78FA31E2B892400B5C1071F8AE0F78EF6F7D71859A97C17EC0912D5EA27AFEACE739FCF66F489EC6355A3318F79649881CD6C7E96A881ECC4FF6934C3D10D99F1DFD00592CB037749B025BD4BC2832E206C1407E600FC2170C0BB57E5C7AF0756830C2A6913E2B9C60575CD4A394F2A65C50E40A43CF5EBCA6A8A32335707DDF4633BAC7375DD53E24DF20AF30203B514D3793392E38FA8429B050F58B28CAD0146F385809CC7FAEFF8B71B2BC93D2C6F72E31AE2D07CBB3CB7F43540894E01654EDC71CCF4F361A847EC5B1D23C2D4680E29F0E1F992EDA3AC41ECFE614FC010A2EED1BAD87A7D17468D6FA5356EDB25E9008A9BB328225F85202246816E1A542E1DD746A5FD3E064FAA1248579D31CD3D65F8FFF36F782622402DB328C7850D82D8D8A52B897353A2F8B95624D2D958FC1C3AE6466EACCA2A6A5E6ADD4A582D27E07633CCF697FA02E243A4FBB3DC727B718B5AC0FA6AAB217E241627E69CA46F05ED6B496A739A29EDAEEF76992A507130715BE555C68A7EEAD6E8FF3A378D8F4B7BAFDEE3EDB9EC094440E31BBA717A9C82A117D05EDCA2370003DFABFB2EFB29510466F74E76CECCFC41709FAC4CD8EAA998357170A7A293209EB0BB83DFE5E2F6D73C28D5409C55E95068D647BEC42DB8098F0089EF8A5FC5976BAC421C37DDA6C4227BC1AE5AE229F067515CEA3D794C8D85564AF208AE0FCF836B6C0AF41477F99C8773D9DD1923C5C07E1FD508C7436EA93383797F372EF3103546A5278A4F59614A5D182344F0431D065C35620D63D4D001D7F626993241362E67D1BF41419858EECC2626537D44E2E23619381E96CFA91B3D8054681D298509D9B99E7AA99CF8742E37637B24136F8E1B487E9571E4C24AE5DF307E4C7C62E55C47132AE404B33E5367C6F24D6680BE32D20BC58370145486FD5EACBCF98EB7E7FB6293044067AF11879E91444025FE52E24617269BE192BB71BD9F95356EDBED9DF352AB56A854F9F531889A88689D3F161FE6155C6C1E8011D60A46F59C7D08C477FA652B559A80567076B4EAC29A85D54C66B35D6960DFF75A696CDB17EC9A7B74DC6C3652DAE866E8758170D055C4BF60FA1238448CC9E29160DF50160C4B0DFB36BCA40AF0BC5F7D490E7DBCA49535742EECB90098A0A0FBBBBC7AF25C0CA9BC039DFB555DD8431AF188F7C1D0FF786D627C058A0B9A15F26B58AA2A5992BC8FC5AA14025FF95F294203B45EA081E28F094D0D4AD671C885E67B2E9E800F10048158698D56648F67BFA8CC73DD5AFA15C1E48936B2596DEE34459B484336C20CD77E58BF682479F9AEF2FCDA86E4F3A2FED7046E5A3828A9B3C0DBFFC25FE699F25629A2045A51242E310CB369B730A5E81167758D7FE843261A598E4541B02D0DB4BF5616BA07A440665F7FEA6213114B6B1B38BC033D70E845445DCD18E23D34D3D6F4A52F5F904AC5D8FECA5AF1123658D09613209EE19954174A1AC7A8C7F9EA288BBE5A0705F3CE38F30ED5EE69CF5208D461EFAD51C456507C3729EB338CE15C4C253BE21E81F082B0847C6871CA0FC8B3E80115FE2BB8CD8AFAE69A3C1429D21F149B7446888BB4DCB639819EFEE665B6D6F69E61452B9328B4887A7C04E9949390980A2609A667267035B11BF862C1131533DDAFA518221627E0EE7E4009CD48E4AA9D0753A9AE82AA0257B69D569B4C53F05A75A521B327322C60398DB0947D205D2A33AE51CF2CEA8C9162DD604F8EDBE91F5199D19EFBF9896A46389E7BCBA54B4AA57CBA0D4F9DA117F288133AD01A9A9B2A824D54F74D4172BE2B1E5F0D3DE60C13AA5B668EE6A45397C2E39573EBFABAABA48D1DDB2AB6453FBBAC8DCC05349404889C7DE23A16EAFAC8D5E541457C32CDCE80CBC +pk = DFB503A0402DC5F85567C95DEC6A57685D2B72FAFA8B2D930E4E88A22F2FA9837AFDBE2D1EEAEF0C4E061792B03D91CA662AED44D3D89718EB47AD4DB7D6A30077B7A171D4FE465A396E9710FF088BE9F93494EB99D334D29A640B3675F6487C0DA1D48477E47044D243637EF1A876C0C401FCFB4BDE4E374A6081C0C4D0290009 +sk = DFB503A0402DC5F85567C95DEC6A57685D2B72FAFA8B2D930E4E88A22F2FA9837AFDBE2D1EEAEF0C4E061792B03D91CA662AED44D3D89718EB47AD4DB7D6A30077B7A171D4FE465A396E9710FF088BE9F93494EB99D334D29A640B3675F6487C0DA1D48477E47044D243637EF1A876C0C401FCFB4BDE4E374A6081C0C4D029000943178A6FDAE58B5AC815ED138DB50CDAE7942C37F4A716F2A8AB702F6B3CA116DB00000000000000000000000000000000000000000000000000000000000000FC081224EF108F335DB27BFFB5DE978CC46FCAAFE8B8CEC01EC76598E8F3E2F769FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B3A9DFEA28EC09298BE5742AD922C6CA52CAAC64E72D84003CDA06C2D154E633AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C12AA404097423B7023F08808C81DCCC4AB303EE053591BD8F4B4DCBE343BF99EF7E38BEE2F95595E93506831F17094CAF67165DFDDCC8A3DB1DA6B235C30BD075755DF51945A8DF4406FBC913B6671DC5413377D47A4BAAAB206A8C208CAAAAF51233305AC396CBCBB5C3D2B6C3E55EF37CEB8774EF3A77AAD903E84504212227ED06B1428E354A4DA65ACA1739F45CA5F766755C511DAC59C1FEE524A1B1EEB5F22EECA72F0EBFC09D9573F907D2DFD7BEBE8C482F942C62849B810EBD619EA68096CEDF480F598FB0AB409F707571D5444B769DA45BA4534B000BF9C079313E3695851D4868F92A1229A5EC00061C9AEF158CD818668B67703002 +smlen = 2932 +sm = 27A23A4FF1C669491F0E7D8B7A33748D126A76494D83F218E138D0293D1360A663678894306A13E96B58A94719C338A8EEF859FED728B0D6AD0E2AB5C1319300A16F6EB7CAEE5A4CC7D4A544F193BE944BDBB28298DEAE18F27E0A2B9BBEB78A11246446E7384260527AA6D257B3A9EC9C2AD603084F8B33452A71A10C223D000001B7592728DB95E4D84D1064C441849CAF7049A86386E1AAB237ED38F3BFD4477DCCAEA43569C39527C2A87B62982D443D24F66B081937EAE3DE9455D6CD6198228E6499582C05BB49C602469E01FD94D1FBAABDD69543DAD7280EE2BBC4FE11788ABFC09EB112399183D189C71F63992075A88CB3FE883306C07CD08553F44559DED30696E373D0D4C2A07F020DCBE312DF6FCAF6983A2FEADC4F108FD61173000A022447D338BF1A375B66B77FB96CBE7742508B57DFF4D33A368EBB8451C2C67B980D3576E6588D8678B285EF288A8B5C9C2726C4A550E764E47FFFA2A128533A7653E480288447509E10013AE1944FFFAFBD9E2BACA0B3C7069C07A4186C056FD3857CADDADD5F891512DAEEB26865F5C89FFA63A64C85A08E41EBE7BD8786A8ADD571A4267D5A9E426840A0B988E197A09F3770B5B0D80D65515CD4D8390AF40E6150062DC4B8661A8238F232692C152C97B8CD5BFE7B5AD863DC92D99744D769087B3EDD81D2E475F5CF0224B10CDE6FAE8DFC3519EFDBE66805AD4468D84D3DD93430363677360DA8F56CB58A6B775FF6417C1F324380B15C9BA668EB0F25FC2A690B483E856F3327B2D79FA6259E30D7F76199CFD21152B7C6FFC3FC113F70D3930C08B3C1EB1BF25C100C5A930EEC2C52664F092B89614943D9D85ED86A2EF666A94F9826C3D116A2BBE49443E2C11748C977716381D9463DA8D09612B80A6760E5A6FC5F59425EAAAD6C8342C1EA4BEEDD5D73151CE213C0B155286FF22CD28E3BB88E0CEE39CB859900D1E0FC19F6A7237BDA8E51476F4844A316752FB347492A928EEB07AA39ABDCC0164D1921B61352ED4AC94B82C410A56505633BAD53A3E649ACAF64C43C1ACFCD4715FC594AF6FB9E85B0B7DDD6E8621BD12A2BEE48223A97EC8502C16B550B03087B6E87C1A860D36322064F8FEBC52F2B7C31DAE7430870259BDAA5889852E3AE6F61013F5AD0D38727CF9D90C67BD7BB3B82D303C6C35383ED86FD5B7DDEC824EA198EF780BE830A1F2679D24EA6E2FEEFB979563F511D188F409F0CFD0050FD418414D01E46DB3D23B3A90B24F4E96EDD4F863BFB333D6A826D29EED167738BBE22C516C59FDF81B032BB55473A5EA2A1DEFE71C95A1EEB5C028435AD0379896CBBC76877501B054CF1FD2F6D7A9DECCD70D0C07111147EF568DCE514DE96EED61600029C8D103B31C8B344A700DE630276BA2C5633419C59E66577659538A6381E45584C7E1D6ED978AB0AF89067AC83BB70DEB6F2C58E339A5A66176A54D985DA6E02002948C62BE6F12314240FE18B09AACBCE82EA462586B8316C3E0AEA00F9998922F8D956120E53B4178223F4D2934A20976FD5A72027C8F4CB33E9BBCC0ABD15395151266B6CD5B4A9E2FC1725D8E9AB2CBDA47B507BB25AC995EDD51EBDA5FD19CAF68FAD8EAC57CB5EF0C6FC861A73E64648EE3255DB4C3394438F49377CC4AC2FCE1B6BC812E5D282F122678713C6C6D452A33C632C0AA47686588752D72B0586FE5EC2464A6DB40662FD2106A19F67DCCC45692FCA03685251D512642B0CEE436C78D94C6F5F25BBCB41FC7E5B1AECD52B846A0B70EAC93579603E9870F942AD4C1CFC9D49B1132777C6F1C184C1537178E5029067257A2DA2827A2EC44D323D13DC6E4E1B9EDF5949D4324228687FD54F02CCC3C4DDA635FA546A5A6783959B1C48AA9D9C9F6381EBCCD979253460857D3CB1C70893EE6F04709E35923883EE3C71C7F33B8CC28B9136B3EBE5F52B9A76817F2F74FDC2F12B459DFF32D5A295BE374B3FE507A0995BCACF1E7B24F4501B29F1E8B4F2A8CB394B3E459A4296F6439BA59EC88305AB045FF40B1DAB4F672F878DE1F9E46B9326CB3E2F3457B83EAD8DEC28DD079AF0E984A69ED882E1CF21036578485DFC2DEBC9CFE82FCE0383B4039D147C4C7E31E315FB57B9093DAA811F4EE4568E32E5625ABE76C5A1AE42A03441DBE766D0EF4DF607406F7D489275E8C5D4470866F9049A4AD5C428B843DEC3702E86E177E4B60181D2B5F099BEBCB25F04C93D087C72436E87A9B3AFCE78FA31E2B892400B5C1071F8AE0F78EF6F7D71859A97C17EC0912D5EA27AFEACE739FCF66F489EC6355A3318F79649881CD6C7E96A881ECC4FF6934C3D10D99F1DFD00592CB037749B025BD4BC2832E206C1407E600FC2170C0BB57E5C7AF0756830C2A6913E2B9C60575CD4A394F2A65C50E40A43CF5EBCA6A8A32335707DDF4633BAC7375DD53E24DF20AF30203B514D3793392E38FA8429B050F58B28CAD0146F385809CC7FAEFF8B71B2BC93D2C6F72E31AE2D07CBB3CB7F43540894E01654EDC71CCF4F361A847EC5B1D23C2D4680E29F0E1F992EDA3AC41ECFE614FC010A2EED1BAD87A7D17468D6FA5356EDB25E9008A9BB328225F85202246816E1A542E1DD746A5FD3E064FAA1248579D31CD3D65F8FFF36F782622402DB328C7850D82D8D8A52B897353A2F8B95624D2D958FC1C3AE6466EACCA2A6A5E6ADD4A582D27E07633CCF697FA02E243A4FBB3DC727B718B5AC0FA6AAB217E241627E69CA46F05ED6B496A739A29EDAEEF76992A507130715BE555C68A7EEAD6E8FF3A378D8F4B7BAFDEE3EDB9EC094440E31BBA717A9C82A117D05EDCA2370003DFABFB2EFB29510466F74E76CECCFC41709FAC4CD8EAA998357170A7A293209EB0BB83DFE5E2F6D73C28D5409C55E95068D647BEC42DB8098F0089EF8A5FC5976BAC421C37DDA6C4227BC1AE5AE229F067515CEA3D794C8D85564AF208AE0FCF836B6C0AF41477F99C8773D9DD1923C5C07E1FD508C7436EA93383797F372EF3103546A5278A4F59614A5D182344F0431D065C35620D63D4D001D7F626993241362E67D1BF41419858EECC2626537D44E2E23619381E96CFA91B3D8054681D298509D9B99E7AA99CF8742E37637B24136F8E1B487E9571E4C24AE5DF307E4C7C62E55C47132AE404B33E5367C6F24D6680BE32D20BC58370145486FD5EACBCF98EB7E7FB6293044067AF11879E91444025FE52E24617269BE192BB71BD9F95356EDBED9DF352AB56A854F9F531889A88689D3F161FE6155C6C1E8011D60A46F59C7D08C477FA652B559A80567076B4EAC29A85D54C66B35D6960DFF75A696CDB17EC9A7B74DC6C3652DAE866E8758170D055C4BF60FA1238448CC9E29160DF50160C4B0DFB36BCA40AF0BC5F7D490E7DBCA49535742EECB90098A0A0FBBBBC7AF25C0CA9BC039DFB555DD8431AF188F7C1D0FF786D627C058A0B9A15F26B58AA2A5992BC8FC5AA14025FF95F294203B45EA081E28F094D0D4AD671C885E67B2E9E800F10048158698D56648F67BFA8CC73DD5AFA15C1E48936B2596DEE34459B484336C20CD77E58BF682479F9AEF2FCDA86E4F3A2FED7046E5A3828A9B3C0DBFFC25FE699F25629A2045A51242E310CB369B730A5E81167758D7FE843261A598E4541B02D0DB4BF5616BA07A440665F7FEA6213114B6B1B38BC033D70E845445DCD18E23D34D3D6F4A52F5F904AC5D8FECA5AF1123658D09613209EE19954174A1AC7A8C7F9EA288BBE5A0705F3CE38F30ED5EE69CF5208D461EFAD51C456507C3729EB338CE15C4C253BE21E81F082B0847C6871CA0FC8B3E80115FE2BB8CD8AFAE69A3C1429D21F149B7446888BB4DCB639819EFEE665B6D6F69E61452B9328B4887A7C04E9949390980A2609A667267035B11BF862C1131533DDAFA518221627E0EE7E4009CD48E4AA9D0753A9AE82AA0257B69D569B4C53F05A75A521B327322C60398DB0947D205D2A33AE51CF2CEA8C9162DD604F8EDBE91F5199D19EFBF9896A46389E7BCBA54B4AA57CBA0D4F9DA117F288133AD01A9A9B2A824D54F74D4172BE2B1E5F0D3DE60C13AA5B668EE6A45397C2E39573EBFABAABA48D1DDB2AB6453FBBAC8DCC05349404889C7DE23A16EAFAC8D5E541457C32CDCE80CBC + +count = 80 +seed = 07CD8F8AB7CD12EA7CC94103B8623D6F0FEA2BAFD2325BF6089DF5351BDBB9A94525C3C6B72D3820F2E4D5F9E7C849F8 +mlen = 2673 +msg = AAFA792BFF719A3B794B2F8198EBD1556889C8C61EE6A51470AC9B274CB162AF44A26E2BA5EA7663C4C78B4B66B322ECACA8F2EBB6A610B51D7C4399F4A64A870C038797CAC80F709CA5C3C9FAFF7D797963E60983B584130C1B99328AADB2D261217CB95A535B8518A78A6D2F6CB8400C2AAA2DAF451391F7B8AB0277A3AF88E1CE6F1D3DBC386CBAFF15308F073D29838692E645F566D4B3DB4186C259BC84606855EA88938CEC4F7211BC9B461E39DFBB9E44CBC273E02D4314A037E0A26D60985EF5A35F069D8B51F86E9B6801CA067AB75565D73581EBBBBD98ECB5AF47509C8729D82EA0B35F0A376EBE6D90108CD61FBD0CEC966C17264F6A87864457F41162FF7210049E6CE2B5354F8F19161E0866D6BC3935815D9267C600DC529521FD092B126EC440D49B8E3A166587657B52AE9E2923644F72876EE94A61D2DB0EF4DAB33ABEC0C47A6A725D4CDABD06D4F6A30BD7C90DB3778C17B7D8CE82A5123B798D8B47C7F3E968C9E9F82A6EB3C2BDD8FC06D282F5CBF3050F6FF71E2EDF7A109F23AB47F427BD75163162C37722BF70A6BBEBEBE8FD9C39152AFEB78C37D718014F739F20BAAD1597B1F9C4E0B59FD82B834D83DAFFC935DE4A3272D7C2454508C07502943E90FDB56128D6E6009ED09CE80A9B60D51AA2E4E162F7F0C362F6886BBCABE29EF6C7F38B742000B9D152FF709082FAFE809C5DC9BCBC6F300B0A7840D0D36F39567D14D8227E7145F7CA670EFE917E0F18B0570DA3E05DDE56883FF12BC0C76C2A1E9FEFFBB728D991769B7D0B0D34853C76FC0655AE200501C28755F57934BB9F46A3C6AB1DD8E0161C698133F4F2D7CAF3392576B4BD2B6F8735D80BCF60656E132442BB7FCFDAE160A2DFE3F3FB8209B5C933201785A7E8206096B84A222A68E62501846273F6A9145820F87F450D12C64FF79A843E897C8394AD54AAF4F3B886FB00A6C37B2EFD0F6D4DD639C9989E7CA30E4F12EEF440946B61D7A28904E1D74009B6D1AEDF2FDA8B5991CB37795A8EE51BBDAAEA34A4C7040944761B9B4B4C12F455C536992A0852F7F07A9AEDA8E522591CB4831B0C79FA977AB6BC49C9730186855986035D2C6E5A6D93DA43E8825753721978AAEB433CE2F2A7D67C1FFEBFEA6F6059474D3022817A7329D9DD0E4A292302E4A57174B9C5346E4B6D75D65882CA7339A48C6E7AF776A8515014A20E4390F6B4F4A19990FA725F5A69B9C3BD4E8BBAEAE49979AC19600A3CEC6DE154985E236C3D0684269974BFC82301AC7196675F618182D7CF15EE5CE3B7ABEE0DEEA5C72F54CAFEF203D556B31327089A0C0DE94F74458CFECB481ADFE3CBB5DA422BD3626B00C4572B4C2BD7584ACD9129A76C616AAE51F944BECC4682AACAFB8E3BB1A42A6A8E5FE7BDEB43305A34A98308EF2D49EDE4F41361446A9AE4DFC1EE13D12821BE0B01E55B865B563633E5A19DFB6425CB60159C147B18A6419F5085C5D0882656ED533EEDF97674D0BABB6CF32F696DEC0F9921CB3DC9E6021FA198D554B1D83C42A0BF214FE4C0431547384F45AED9190CBCF98ED8278E8A03D551FA284C8A26218F0B0B58D99879DB98449CC99B6B399DDDAD9924E6A7EB20A0F1FDAD2F8138BDC7B445BC01503C509066B1603CDA76FE41727AB5E027DCB15032E8F66BFA84544D22C501AA6F62B02C0F8764387163CCADBF1ED7238E7F16C80E6C37AFEC2E10FFB95AB0A39784F9FCCD8AE263758ABE392727E9AD442A44738D77CB61A6B1540ADE751130489015AE5917C927232EED27BBF88481F3CA0C5ED2C31DFA943B2EAD4A8C80B4946E3C138A61BAF43A72C7A25E16874CBAE254D3F14C154F7C60CCF665B566799A01E0F769B60F73C17C840E0018C6FBC10EEDA3E35A77586B3A5936B363B2D5CB25C78A3E3AABBB84F1E64DF47F97AE1645650FE1751A724EA9BF80744D0F33DA6F313A3CC17D8F261585B62A75C167126D899219A26210DC55AB6DB2B94E6993849B4986F988EFB07478D6621CBF4B8ED772E61B0246A5582242FA20339B2D6CB89BA1B9210A318EB4697FD21EFCFD230DE9680514A442A13B29D8CB2627A6970BB97BF09C79C6ED7A27247662B25F39C8D675B0747F1A6D9EBBF7CFA7BC51A7EA3A7307EA4FA2A463BF53A645FE701FBF26628731CBC18636567AE633A49E59F6F049447803FA3D4F1F79F38026DE9B07D8610C9F01BEFB7054AA46E523E001C1EC3A4E7084DE0CCE596DC63D9C1F1DC03F35F9B1918E62ACB2640102E1D520E900969D53E83D2DBDDC80D1DC54BEE99531FAA5A8D2DBF8346C7ED123587353DD63823453DE350545C176446845BB3522A862F5D675419DA901CF7D2D1F7050ABFA3237D42753203BE251B0364379232D2D9D8642D52A60F6F4CB09EF29FA1E6069F97A1175F8447FE98A813CC182E33FFD8B8CAD93BF32A60F1A9E63A79A7F7FB9162783B89BB57F3E73155CED1D0084D5BA967F76C89C61C1A3E944F3B6F78D6CD3D1139A315C5276493481F3FFF9B6A6B40C920EEED9EFC74108C6BBA5A15DA736680A23DB5672C5A32ABDA24B49F2011F44FA8FF9C73609EC195025F0456D753C848DC6296920FC32DDE2174D37BFBCB86CF618AA0D486EE46C5E1EA14A3BAE4952AF5D4837F9B8122A19D1E59B909ACEBA6C849C8B452CD6CEF877A65FD83E6D0C6EE35886688F1D877612CB8E671D83216A1F76693D6A4D6A2EC13EB6CA2005328B3C91F51B352A707EF8180F320D6E1685C1EF4D87E3CB77FA549BC12727E59C11BDF8A9631CC272998253028CECEE8A2914182B90F586D80E7ECE370979BDE683F37123090012AB9243A4C145D6349C2791DC44E54956C5E9B59FAD017D3EA27D85B48A896671A0AC14A73B5AB9145D8BA6AEBF9EA25AC2E8E2C4D16C5009A83D0E84CEB80E95DF2CEC4CBEFC7F5B90A84D408E8C4855F9AA2987D9FC9D8A451F32B367BB1DE5271ED35EA153B5D400A6D8050EE82F519BD930245A96C9727FD24D8B94DC53D4B4F00D03172CD6B7F2BE163B6D16FD6247B01988A6EE6CE7BFEAFF78E983B8DDFBA4242730E52B57876E3719D1F9F6CBCC81620F848D23C31E3FFF7EBF2AFE5011E6466B1889E7EF6281FAF8B18A012CEB96796FCA9B28E78335DFCB85BBEAFAEBB0FA75EE2D0D391CA97E05F0FE43475135B13613206A0D88438F17EC8E604B007AFDCB9FA1378B7CB96675E0B19DC6FB02508E05A7FDAAF09297A3884AA051B6389A52F921F8FF31970FB082DF554226C2613B80CC1ADFF770024D6BF011C0F028A012597AE56F36EB6B3E864D79639810B8BA7258B18192B5CAA80DEA4B140D3C6F1D707ACD2256D676AE90980BA80E10B44109211ABA830EE96E1BBD248315C804D391A86AB7D4B3A4A37FED90D9867DA4B93FC32E79403E5D78AE99AF1CD2ACCE65D4F3384D9CEAB71B1E93B99704C64CAF17B999234361E378B9362D14BE3FD9E6C268013CB1FA2EA8361749D635C0429F796EB15A685E31DFE7A76AE870EBA120331AC830F8C486F6C0C4F07B658EBB9274A463E0EEA101481DD6B58835A303ACE802AE79EBEF51ADD98A67B7FF7968815ACF4504B9D360F7C0120A00ABA1FC558E6CBD8324EC35E0985294563A8D7ECCCCD9E3D1557A09885770836ECCC7AEE0F18B81E30F85D695440B5BCE29945CBF60FF402B281942D38EA33A4B03E9FCBBBEFAAC2C455E8A03FF3F35154132C538EA16F0605EFB788C3CA8435F6D595F776433585094ABC75BA581EC59AF701F66DD6091623E4676D167 +pk = 0F61E40D63BB2E41EC2E480BCC7C0FA0E3C4EE7545BFE89C178CA5B74193D3E5AA565848C7F2E33D872CA375343A6CC97AC8E5FA424484E9F47E05B3C9EA6700C26D063619ABEAF88F9B45D07FF19CE9A3C7444444594AA92A30832D440B5EA17F57AF7414EE30E64C145AF8EC57EB0550D01CB7388A9B587819503EBC73510109 +sk = 0F61E40D63BB2E41EC2E480BCC7C0FA0E3C4EE7545BFE89C178CA5B74193D3E5AA565848C7F2E33D872CA375343A6CC97AC8E5FA424484E9F47E05B3C9EA6700C26D063619ABEAF88F9B45D07FF19CE9A3C7444444594AA92A30832D440B5EA17F57AF7414EE30E64C145AF8EC57EB0550D01CB7388A9B587819503EBC73510109C32FE7D33245CE2686F9535E4ABC4C5E54C0243FB09E4CCDFA0DD37310A14BFB9600000000000000000000000000000000000000000000000000000000000000F686AAA4B5EF730451A998D395D7D8748D0C28AD91BF7FF5D8597E4D3CE07EA62FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF998AF141C36B51491D232AA878C72A1211F86989E24ACB71E77454300CA77F965AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C52277E4F1DBD7AF540DF86F50572813357E604AF6C3A16F263B99096F185CFA0E5C23ED5B2BA1EEB8DD4CA53A49FA9633207ACC49559362D46A375D3F0905BD6AC594FFC8631AC55A42F3C160625F205FFC2D4340C80F0D840224E3A2E9BD19423ED016BDACB5AC3D3FCFAD135CE4F4F1D654259E1F94BE10D752F63D02517756E62336BC8CB3706B7C2FF92CAC79E8718CE342D51DE16487E0F1D590C46EF4E8F9BACC0C4C0B4E852D3701F7697AA949DD527755E8DF560CDA4BED0094A3862D252E106C477F49DF1085DA344FA0436FF0177FD47B0FEE3527288767FC0981EBE6267AD245717010B8A4777943DEF796899701AFFBEE156F37A603 +smlen = 2965 +sm = 5B04BAD7AA1BD8FD00F1E6B2BCA5EE42B8BBB5E47BB77189551240A7C2AACBD54CBC358E909A767252206C450A5631AFD652B4F1C43C4B80AE1EE8B9162110002B8DD5C38533333DCD9E389A278D0B0666897408920E4A7C9ECA36E5C3B7C45ECAA5A055ACF69CE70CC236A7C880652B6806FFCA2AB93A586528235B171358000000FC76DF88676F6EE69F826A3E9AA4790E08B62A5C39B96345D0736CA40A5A9819CF3C3833CCA0FFD7BBD91D9E492B4B82EB47FE4D0AF885352266C9AF5BB2BB008B21ACBE6C4F7DB5CE4170C4B03210FDF92EDAA958F5AF58DF6702511F9028297CD23AAFF193F485E628AAE2CFB228A74F5110411EF36805BB637EB4E27F89162A8612FA5C598AD290AF1AC19DCE6B57910545515853DD480C1B5BC0287D4F000B02AAFA792BFF719A3B794B2F8198EBD1556889C8C61EE6A51470AC9B274CB162AF44A26E2BA5EA7663C4C78B4B66B322ECACA8F2EBB6A610B51D7C4399F4A64A870C038797CAC80F709CA5C3C9FAFF7D797963E60983B584130C1B99328AADB2D261217CB95A535B8518A78A6D2F6CB8400C2AAA2DAF451391F7B8AB0277A3AF88E1CE6F1D3DBC386CBAFF15308F073D29838692E645F566D4B3DB4186C259BC84606855EA88938CEC4F7211BC9B461E39DFBB9E44CBC273E02D4314A037E0A26D60985EF5A35F069D8B51F86E9B6801CA067AB75565D73581EBBBBD98ECB5AF47509C8729D82EA0B35F0A376EBE6D90108CD61FBD0CEC966C17264F6A87864457F41162FF7210049E6CE2B5354F8F19161E0866D6BC3935815D9267C600DC529521FD092B126EC440D49B8E3A166587657B52AE9E2923644F72876EE94A61D2DB0EF4DAB33ABEC0C47A6A725D4CDABD06D4F6A30BD7C90DB3778C17B7D8CE82A5123B798D8B47C7F3E968C9E9F82A6EB3C2BDD8FC06D282F5CBF3050F6FF71E2EDF7A109F23AB47F427BD75163162C37722BF70A6BBEBEBE8FD9C39152AFEB78C37D718014F739F20BAAD1597B1F9C4E0B59FD82B834D83DAFFC935DE4A3272D7C2454508C07502943E90FDB56128D6E6009ED09CE80A9B60D51AA2E4E162F7F0C362F6886BBCABE29EF6C7F38B742000B9D152FF709082FAFE809C5DC9BCBC6F300B0A7840D0D36F39567D14D8227E7145F7CA670EFE917E0F18B0570DA3E05DDE56883FF12BC0C76C2A1E9FEFFBB728D991769B7D0B0D34853C76FC0655AE200501C28755F57934BB9F46A3C6AB1DD8E0161C698133F4F2D7CAF3392576B4BD2B6F8735D80BCF60656E132442BB7FCFDAE160A2DFE3F3FB8209B5C933201785A7E8206096B84A222A68E62501846273F6A9145820F87F450D12C64FF79A843E897C8394AD54AAF4F3B886FB00A6C37B2EFD0F6D4DD639C9989E7CA30E4F12EEF440946B61D7A28904E1D74009B6D1AEDF2FDA8B5991CB37795A8EE51BBDAAEA34A4C7040944761B9B4B4C12F455C536992A0852F7F07A9AEDA8E522591CB4831B0C79FA977AB6BC49C9730186855986035D2C6E5A6D93DA43E8825753721978AAEB433CE2F2A7D67C1FFEBFEA6F6059474D3022817A7329D9DD0E4A292302E4A57174B9C5346E4B6D75D65882CA7339A48C6E7AF776A8515014A20E4390F6B4F4A19990FA725F5A69B9C3BD4E8BBAEAE49979AC19600A3CEC6DE154985E236C3D0684269974BFC82301AC7196675F618182D7CF15EE5CE3B7ABEE0DEEA5C72F54CAFEF203D556B31327089A0C0DE94F74458CFECB481ADFE3CBB5DA422BD3626B00C4572B4C2BD7584ACD9129A76C616AAE51F944BECC4682AACAFB8E3BB1A42A6A8E5FE7BDEB43305A34A98308EF2D49EDE4F41361446A9AE4DFC1EE13D12821BE0B01E55B865B563633E5A19DFB6425CB60159C147B18A6419F5085C5D0882656ED533EEDF97674D0BABB6CF32F696DEC0F9921CB3DC9E6021FA198D554B1D83C42A0BF214FE4C0431547384F45AED9190CBCF98ED8278E8A03D551FA284C8A26218F0B0B58D99879DB98449CC99B6B399DDDAD9924E6A7EB20A0F1FDAD2F8138BDC7B445BC01503C509066B1603CDA76FE41727AB5E027DCB15032E8F66BFA84544D22C501AA6F62B02C0F8764387163CCADBF1ED7238E7F16C80E6C37AFEC2E10FFB95AB0A39784F9FCCD8AE263758ABE392727E9AD442A44738D77CB61A6B1540ADE751130489015AE5917C927232EED27BBF88481F3CA0C5ED2C31DFA943B2EAD4A8C80B4946E3C138A61BAF43A72C7A25E16874CBAE254D3F14C154F7C60CCF665B566799A01E0F769B60F73C17C840E0018C6FBC10EEDA3E35A77586B3A5936B363B2D5CB25C78A3E3AABBB84F1E64DF47F97AE1645650FE1751A724EA9BF80744D0F33DA6F313A3CC17D8F261585B62A75C167126D899219A26210DC55AB6DB2B94E6993849B4986F988EFB07478D6621CBF4B8ED772E61B0246A5582242FA20339B2D6CB89BA1B9210A318EB4697FD21EFCFD230DE9680514A442A13B29D8CB2627A6970BB97BF09C79C6ED7A27247662B25F39C8D675B0747F1A6D9EBBF7CFA7BC51A7EA3A7307EA4FA2A463BF53A645FE701FBF26628731CBC18636567AE633A49E59F6F049447803FA3D4F1F79F38026DE9B07D8610C9F01BEFB7054AA46E523E001C1EC3A4E7084DE0CCE596DC63D9C1F1DC03F35F9B1918E62ACB2640102E1D520E900969D53E83D2DBDDC80D1DC54BEE99531FAA5A8D2DBF8346C7ED123587353DD63823453DE350545C176446845BB3522A862F5D675419DA901CF7D2D1F7050ABFA3237D42753203BE251B0364379232D2D9D8642D52A60F6F4CB09EF29FA1E6069F97A1175F8447FE98A813CC182E33FFD8B8CAD93BF32A60F1A9E63A79A7F7FB9162783B89BB57F3E73155CED1D0084D5BA967F76C89C61C1A3E944F3B6F78D6CD3D1139A315C5276493481F3FFF9B6A6B40C920EEED9EFC74108C6BBA5A15DA736680A23DB5672C5A32ABDA24B49F2011F44FA8FF9C73609EC195025F0456D753C848DC6296920FC32DDE2174D37BFBCB86CF618AA0D486EE46C5E1EA14A3BAE4952AF5D4837F9B8122A19D1E59B909ACEBA6C849C8B452CD6CEF877A65FD83E6D0C6EE35886688F1D877612CB8E671D83216A1F76693D6A4D6A2EC13EB6CA2005328B3C91F51B352A707EF8180F320D6E1685C1EF4D87E3CB77FA549BC12727E59C11BDF8A9631CC272998253028CECEE8A2914182B90F586D80E7ECE370979BDE683F37123090012AB9243A4C145D6349C2791DC44E54956C5E9B59FAD017D3EA27D85B48A896671A0AC14A73B5AB9145D8BA6AEBF9EA25AC2E8E2C4D16C5009A83D0E84CEB80E95DF2CEC4CBEFC7F5B90A84D408E8C4855F9AA2987D9FC9D8A451F32B367BB1DE5271ED35EA153B5D400A6D8050EE82F519BD930245A96C9727FD24D8B94DC53D4B4F00D03172CD6B7F2BE163B6D16FD6247B01988A6EE6CE7BFEAFF78E983B8DDFBA4242730E52B57876E3719D1F9F6CBCC81620F848D23C31E3FFF7EBF2AFE5011E6466B1889E7EF6281FAF8B18A012CEB96796FCA9B28E78335DFCB85BBEAFAEBB0FA75EE2D0D391CA97E05F0FE43475135B13613206A0D88438F17EC8E604B007AFDCB9FA1378B7CB96675E0B19DC6FB02508E05A7FDAAF09297A3884AA051B6389A52F921F8FF31970FB082DF554226C2613B80CC1ADFF770024D6BF011C0F028A012597AE56F36EB6B3E864D79639810B8BA7258B18192B5CAA80DEA4B140D3C6F1D707ACD2256D676AE90980BA80E10B44109211ABA830EE96E1BBD248315C804D391A86AB7D4B3A4A37FED90D9867DA4B93FC32E79403E5D78AE99AF1CD2ACCE65D4F3384D9CEAB71B1E93B99704C64CAF17B999234361E378B9362D14BE3FD9E6C268013CB1FA2EA8361749D635C0429F796EB15A685E31DFE7A76AE870EBA120331AC830F8C486F6C0C4F07B658EBB9274A463E0EEA101481DD6B58835A303ACE802AE79EBEF51ADD98A67B7FF7968815ACF4504B9D360F7C0120A00ABA1FC558E6CBD8324EC35E0985294563A8D7ECCCCD9E3D1557A09885770836ECCC7AEE0F18B81E30F85D695440B5BCE29945CBF60FF402B281942D38EA33A4B03E9FCBBBEFAAC2C455E8A03FF3F35154132C538EA16F0605EFB788C3CA8435F6D595F776433585094ABC75BA581EC59AF701F66DD6091623E4676D167 + +count = 81 +seed = 3D598F7C498D8A1095C40945975380554BEF6142578638A7627E2C0A21C59C579F8E8CDA309348FC54C764C899FB93E9 +mlen = 2706 +msg = 63EC08B711DDF5C66036A13F574BB7BE76445A1D1F83C7732B9F4C25FB9E799D4AFA55817BCB39B974AF92F3730767CE7D863B6A3406450DCBC5E0145D10B7D532DA6E80196157C38D1B6D3C173F74D67AD8DF24ECAD4D9B59921418863A38270B982C4392225EDD1845AED2199E2C38B36C7E0E5D2F3CC7F6803926D977C59ECDAC67CA290658E72BAD633358FCDDE2A4B9C40169A0C7CCCFDD93E4DA3C3838E9308533BD468A9128C5A141C4842840E45BC8E4610A7C5E7535834C5EC73312A50197C76AE984B3521883F549BE04E27D97580E6D85D0EE84CD0B8C65BFB1AA005C607DE82DA70021F8F90B7912C67DC5657E1882CFA6DA3DE1BA4ED823789C052649DEBC9085C74528162243133A6AE5C1C6BCA3F730525B167D816485E40C208AFFA8706E3D74631EB4413032730A7647548B77579323EB03D36C2EC37D2389D4A17305F607C78F3073A2F4B4395BBC94AF163ACBE3C990306BA3F89AF9AFFE785C3F6D102FB2BD55F0C1044034D6A871293B31A1B38E383CB926BAF3AB4B5F79A47E9FA7B77BCD58AA35A7F16DDD11FF642069A8A327DFA800049BABAAB4AFBEEC9FA98ADB9796FBEE925BB70EE9E96540436E1473E3AE4C56D7099D8DBDDE755A7E101BCCEB596B9415F52374C8A3A73EC66B229DFD8CD7EE7D2CF1C5E7F490C7D9381D9321B15F84F640017851ECED1DC80D32DA3A0A57ADC3EF37E021031866E278C7D51FF5CA8E9ECEA1082423B41D772C5ADC61A8C71C3D4CAAAA3433928D7931EE715875BDE2BFACAA0A7F799B45241C21BD2ECE4A5944FB6890BF24908DE58DD3C76173373254A36B0B2AC7D67926948CC0136DD9A5079D776C297FB6A585C290D5DAE1C45E91153299EEDB731E527F0F62E83C1E93C75FC74F9C7E63311562B0A55459A0D41E034C3AF637EB29BC789E5920DAADF265F42F2707DD1AD490B5F8A8D24A9968BFF11A0C364A779EC385A9A33EDB9CFC7DBC672BA60CE5F421B40634270B982D619F8E7960D32E1B8A76CECD13A3B0214DD34214CB5BB7FD530058D5DE1FB9E4E88ADCA05926CE1F5597100F55DCBF64D47FC177FF87C4BD9F6ED7670FA7B7D339EDCCE6FC1EAE069E0C303138689DDFD23396C145B79AFCF68125989C8477BFC318CDBD69D1AA6D3EE41F4B1F9BE4BE9FA58A072412078CB9196556EE56FB7B2A2761DD04120FCD9AE9736F599C8B96BF8F964B305530A6DF1F94874F36F07962F87ACC0B285EDA64D2E4857E26BED40E9A5DC0327F1D91259292C608D6C6D59804DC23A34D1F9F1B69331D68771E41542FC5D669CBC3CD7F8310F87E8FE8F6201E57B475DE2318EA6EF9F7D32A728A44334CC9DF28DF77038C37CBA62EA8CC5EE80E571879AD111F35B6A154FDF8D40FC93360D547D02F0743A37EBC4AF178C6CE36C92CE6B80B6350202D2978621684A19AFE1474155BB962014587B1F5A477092F42BC446D7811C0EB439A6829E538077ABBBF03F515F1E6AC018EFB05AF79069C2569D2CD7140C4B1B47886064DAC695D59FDE2D8FDDB35318D33EDAD94AD4FD988095B1156FD59551F0658EE666186369BFA84E30672E4659BFBF7963C377F0039E08DE2C2D9803FC12D97B5E67CE9536AF12DAEB3B9903D8D95F336FF53286284BFE8D7AD13EC21C2A9BA93C9A97BD7F6148DE7C8CB41CA75A9ECC8F9CC68D888FAF6B3E75376B5B16F41E7E6B76A686EB365365E2074FB1D7EFB1B285A2357B020FD3E47B89943FBC1596F3FA8289AD844386A691F33DAED4B7A6A6729526160F2D32BA7F68AE6678564FCA05BD811F208A8FA62F6731F23D46027008246FD4BF3C454A39EE225245E74DA5910E7937B36661548A55A2270A9D27114DDC94DD9B9D4122289DF0A5700222A977F15FD8E36AFA1C4870BD3CE9B658E2D83882AAC5F3DB814346240FF8C8FBA3F36E52AC9B441C76B6F104A0931BC45E202ADDCACCFB93A486A7734A6D82B9F6CA911448F988626846D413D987C5AC860FCC0D5F734269AEF88D41A055794DCE832BABB7E306F622E5EAEFDBE1CF195E320A1ACEB4834B3E70061EC2D624C12EB35B16E5AAE73053A3290D4BB1F51FFDF48C1A7218D365DB7FEC15BF0F710954CDEC54917600014BDE3A901DAB1DEC0844D7FF148EDED9788CC85C0CFF26E5895D91C56BA6950C0BA8FC6C773AB4A6091A5DE3AC335DDC2110EB0144FD89B3D815EF4A26F718C1ACB5723AF1DA5515442A03CFB9D90623FB21D78DAF441000E285E9E7C235C0F31E258E6B3FEAC048DB652B83E07848D2E9357649372B1A55975B2EC7FCFED19D0B6613BFDBB4B5B01A9AA3128AE137BDC1D8FFC3A38B597578042CF183BA8383C289C3D92F6B70AA9B3364E9FC5D43F3CD3F310D229912E91D5806C2A11E0BDD208A2AF438BE77B43680E2DE67918FD414338A763910E1316965BF96BBF7DF639266D075E90EE9C073011F6783750764FBE4906ECDD94EE9FB7E4AEDB23EE88EBFB018C44FC8BAFC66E6B454A3D0E332C7A6B34C2E8D1D26416FF43D768CC36CA9D3168355F1A281A6B2EAAEAC7B64AABBAD2156A1D781A78A896248C56F3491A5DDA8C22C231AA7AE14BD558F66E6280FA65F20B246D815BFF1D3C6CEE6DF9B4AA7F750307A7BF73850E6BCD22CA0AD74B4AFC13CD4AA2FB7E7B588ADB3A46A23EC88A34F13214B261A283AE8FBCE8007C6EF6BE255C33218AEBECD3EC27EDAFD252994B70BD67407620D26E8567F4C7F6D636803B6A27EACC3B853706A8D57ADBF7F7E142FF149C35119A6172D5884EDE7C71E6C34D1B485A684DD56C9D670576B75CACB870A68EA7FF2BB461D9E2FDBF500B2F200110265A3CF24370A3F480DA66F98FB5327B4CD796EAF0E559A5519F3C643B59E3B89D05D2A9F9DA6732CDC2996408B7FAB5A734310FCD73FA3FA5CACAF31AB04EC0B9734407C6DC575350212239AC9092DA5812137BFC40F7735BFDF9827F768FC0363FC8C5739C7DF828075EA2BBE6321D5A8EA2EB7E397C3D58A953C7F0BAA69A96AC8110B125EE2E9701F43EEB87FDF58A6E6266BE1136437599E26E8E6E853DBB6ED9DF3931C5F402FD09B7E203AB36EAA6EEAE72E908BD2B9CFD379BC9B407F0C882807BBD2E91F920EB24137002A48F1AAA0CBDF89FDE5C51079F1D8CF7A014207F1B40773321AD952D77CE18EC7B48F2CA054E65420C1132AB67C832EE22FFD8672803CCE3DE7E9FD0690E55FA1AF5F11611E3E2C71CED55E3E347F4CBEB9C93BEC2B98E48495585392471AF0AE589257ED8D01792112C798BCA5107030F207CE567594B8433490D8FF1811F21B03A42AD0678927183321355E3D6908DC1125CDCE038CD0469D72458B6CC5E67EB0D78C20819C6F3C4518B15CC63754FF8679915E329DD46FEAEFDA5249ED7E754E7BD55C75CB764B6CC36BC06267B2479CAFBB3F0BAE32A93558190B65C85DCDC080CD56D51D4105C5B0717691D4DB1893EF8AD550F55855B4123A38D18FD67B588A3A4C2A6604E874D721359352B235C17AB1DA2758712AF8179FF433211B93078735F909F985F557D0DE52CB9203DDC67BF9DC8632ACD8D4F90196AF6BD2E79834371C5E9FDF5992ADB04AEA186AF36F56271F763ACFFBF94DF4B0512CA6B7CA8FF486504E565BDA367E044FCD0F25FBC2A6C720867F95BFD92109780D2E6DD60CE90A4CA8EEB8C4CAB289DCF99E687B017B37695C3B99B4FE97D7E5D52BB9813C04D03C9AD71770FE0986C7F3A3FFD3A261AC771DE88C7ACDEF253E5CE2B50BC5C576D132B68CCC694BA883770B80F5ED7D527CEE816527F69CA2C101747A0088879C3663037DB5B +pk = 40F105B446B1C03D04987AAB26577806A477D41FED3EE8F2CE11492B768FB4DAEC54A577E56DE6E5EC311CAED532F2261A314E9BF09E18C64A851AF9F9170500E444BEF0A4101AEF46041BEF52C2DBF2D687B2EA91DA16629C468664476B16697FFCA15CB46E574308ECAD8B9349F82E528C13401873BD395D08359274A6870004 +sk = 40F105B446B1C03D04987AAB26577806A477D41FED3EE8F2CE11492B768FB4DAEC54A577E56DE6E5EC311CAED532F2261A314E9BF09E18C64A851AF9F9170500E444BEF0A4101AEF46041BEF52C2DBF2D687B2EA91DA16629C468664476B16697FFCA15CB46E574308ECAD8B9349F82E528C13401873BD395D08359274A6870004CF14418F19ACED5B71B91D2AC10E2AAE7EC2FCE672D1122948E4279E7A9EB1003A01000000000000000000000000000000000000000000000000000000000000FA113360DCCA67357B088EB90A0370018ED90340C16582B70B59CFD2D22201C712FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B1DF89A7D5C0700E734A56073C0D26BB14EAB025F3B79CD074E8406B5DBDA2F0BFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004B0018D60BBCE03A044F6E9B369DF1708D6CBFEAACB8080DAA753B105A1C5E61F5E0E5AC1E52E3DB8FB4E9F66C21A6BB7BBDF08545E1974477D777B497808D75C6445A22C9399EFC8F13593BBDD78481F5A4A330B91F35D22799643D1A49EF421319AC7693A330373169009FC02AA903478FF61B6EBBA46E1C2D015B600FF4F62AD46AC95C332BCE7B3607C40628F7BCB9108F478F2465C6391C1E6403AF4073E7CB38BBDCC1A634FB3115C2C43D8D64709CE3CDEA422BF9CA251070811737F1CE6942218EBFB3E4952E2621A8C617FF41D3373EE75A0F6697F4BA72594FE426BB24B6C1CDB06BCBE3E84270BCA993F52016AEB60CF9747A724FB00 +smlen = 2998 +sm = 8195080F15E00FD447AE32E238A0B7D491C3761DCFB0FDF2272A825848A48D7B1A5788B916789E2136FFC7FC1E9D38EEF8A28F1B5071698A89B313053939D800B23C4AA307950667EFE022848040A9A6814B1C5A8D0B68D61EDC7BD923503DDA2046D6D06BB2104EE982E0374E189E1C51654446C15B4D93B8763AED9B594800000081FE2A6D36E79360CEE5BB9FB261BDF9AE5CB0EF466972ABB0863FCD7A9482468A287CA03CD32D61C388ED4E796DC80F62026B9CFEE5DB830C4492C369142C19718EF4E76EE9A58FEF0140300AF371BB99AAF84B2907E6914F79C24323C36B26C19AA106A58F5057A3733F4074824E648305AB1343D28DD55C0993DD8189097148D2DBC381980A84A89BDBD973A381E888DDDD429921171180A7E28AB16B2C000A0663EC08B711DDF5C66036A13F574BB7BE76445A1D1F83C7732B9F4C25FB9E799D4AFA55817BCB39B974AF92F3730767CE7D863B6A3406450DCBC5E0145D10B7D532DA6E80196157C38D1B6D3C173F74D67AD8DF24ECAD4D9B59921418863A38270B982C4392225EDD1845AED2199E2C38B36C7E0E5D2F3CC7F6803926D977C59ECDAC67CA290658E72BAD633358FCDDE2A4B9C40169A0C7CCCFDD93E4DA3C3838E9308533BD468A9128C5A141C4842840E45BC8E4610A7C5E7535834C5EC73312A50197C76AE984B3521883F549BE04E27D97580E6D85D0EE84CD0B8C65BFB1AA005C607DE82DA70021F8F90B7912C67DC5657E1882CFA6DA3DE1BA4ED823789C052649DEBC9085C74528162243133A6AE5C1C6BCA3F730525B167D816485E40C208AFFA8706E3D74631EB4413032730A7647548B77579323EB03D36C2EC37D2389D4A17305F607C78F3073A2F4B4395BBC94AF163ACBE3C990306BA3F89AF9AFFE785C3F6D102FB2BD55F0C1044034D6A871293B31A1B38E383CB926BAF3AB4B5F79A47E9FA7B77BCD58AA35A7F16DDD11FF642069A8A327DFA800049BABAAB4AFBEEC9FA98ADB9796FBEE925BB70EE9E96540436E1473E3AE4C56D7099D8DBDDE755A7E101BCCEB596B9415F52374C8A3A73EC66B229DFD8CD7EE7D2CF1C5E7F490C7D9381D9321B15F84F640017851ECED1DC80D32DA3A0A57ADC3EF37E021031866E278C7D51FF5CA8E9ECEA1082423B41D772C5ADC61A8C71C3D4CAAAA3433928D7931EE715875BDE2BFACAA0A7F799B45241C21BD2ECE4A5944FB6890BF24908DE58DD3C76173373254A36B0B2AC7D67926948CC0136DD9A5079D776C297FB6A585C290D5DAE1C45E91153299EEDB731E527F0F62E83C1E93C75FC74F9C7E63311562B0A55459A0D41E034C3AF637EB29BC789E5920DAADF265F42F2707DD1AD490B5F8A8D24A9968BFF11A0C364A779EC385A9A33EDB9CFC7DBC672BA60CE5F421B40634270B982D619F8E7960D32E1B8A76CECD13A3B0214DD34214CB5BB7FD530058D5DE1FB9E4E88ADCA05926CE1F5597100F55DCBF64D47FC177FF87C4BD9F6ED7670FA7B7D339EDCCE6FC1EAE069E0C303138689DDFD23396C145B79AFCF68125989C8477BFC318CDBD69D1AA6D3EE41F4B1F9BE4BE9FA58A072412078CB9196556EE56FB7B2A2761DD04120FCD9AE9736F599C8B96BF8F964B305530A6DF1F94874F36F07962F87ACC0B285EDA64D2E4857E26BED40E9A5DC0327F1D91259292C608D6C6D59804DC23A34D1F9F1B69331D68771E41542FC5D669CBC3CD7F8310F87E8FE8F6201E57B475DE2318EA6EF9F7D32A728A44334CC9DF28DF77038C37CBA62EA8CC5EE80E571879AD111F35B6A154FDF8D40FC93360D547D02F0743A37EBC4AF178C6CE36C92CE6B80B6350202D2978621684A19AFE1474155BB962014587B1F5A477092F42BC446D7811C0EB439A6829E538077ABBBF03F515F1E6AC018EFB05AF79069C2569D2CD7140C4B1B47886064DAC695D59FDE2D8FDDB35318D33EDAD94AD4FD988095B1156FD59551F0658EE666186369BFA84E30672E4659BFBF7963C377F0039E08DE2C2D9803FC12D97B5E67CE9536AF12DAEB3B9903D8D95F336FF53286284BFE8D7AD13EC21C2A9BA93C9A97BD7F6148DE7C8CB41CA75A9ECC8F9CC68D888FAF6B3E75376B5B16F41E7E6B76A686EB365365E2074FB1D7EFB1B285A2357B020FD3E47B89943FBC1596F3FA8289AD844386A691F33DAED4B7A6A6729526160F2D32BA7F68AE6678564FCA05BD811F208A8FA62F6731F23D46027008246FD4BF3C454A39EE225245E74DA5910E7937B36661548A55A2270A9D27114DDC94DD9B9D4122289DF0A5700222A977F15FD8E36AFA1C4870BD3CE9B658E2D83882AAC5F3DB814346240FF8C8FBA3F36E52AC9B441C76B6F104A0931BC45E202ADDCACCFB93A486A7734A6D82B9F6CA911448F988626846D413D987C5AC860FCC0D5F734269AEF88D41A055794DCE832BABB7E306F622E5EAEFDBE1CF195E320A1ACEB4834B3E70061EC2D624C12EB35B16E5AAE73053A3290D4BB1F51FFDF48C1A7218D365DB7FEC15BF0F710954CDEC54917600014BDE3A901DAB1DEC0844D7FF148EDED9788CC85C0CFF26E5895D91C56BA6950C0BA8FC6C773AB4A6091A5DE3AC335DDC2110EB0144FD89B3D815EF4A26F718C1ACB5723AF1DA5515442A03CFB9D90623FB21D78DAF441000E285E9E7C235C0F31E258E6B3FEAC048DB652B83E07848D2E9357649372B1A55975B2EC7FCFED19D0B6613BFDBB4B5B01A9AA3128AE137BDC1D8FFC3A38B597578042CF183BA8383C289C3D92F6B70AA9B3364E9FC5D43F3CD3F310D229912E91D5806C2A11E0BDD208A2AF438BE77B43680E2DE67918FD414338A763910E1316965BF96BBF7DF639266D075E90EE9C073011F6783750764FBE4906ECDD94EE9FB7E4AEDB23EE88EBFB018C44FC8BAFC66E6B454A3D0E332C7A6B34C2E8D1D26416FF43D768CC36CA9D3168355F1A281A6B2EAAEAC7B64AABBAD2156A1D781A78A896248C56F3491A5DDA8C22C231AA7AE14BD558F66E6280FA65F20B246D815BFF1D3C6CEE6DF9B4AA7F750307A7BF73850E6BCD22CA0AD74B4AFC13CD4AA2FB7E7B588ADB3A46A23EC88A34F13214B261A283AE8FBCE8007C6EF6BE255C33218AEBECD3EC27EDAFD252994B70BD67407620D26E8567F4C7F6D636803B6A27EACC3B853706A8D57ADBF7F7E142FF149C35119A6172D5884EDE7C71E6C34D1B485A684DD56C9D670576B75CACB870A68EA7FF2BB461D9E2FDBF500B2F200110265A3CF24370A3F480DA66F98FB5327B4CD796EAF0E559A5519F3C643B59E3B89D05D2A9F9DA6732CDC2996408B7FAB5A734310FCD73FA3FA5CACAF31AB04EC0B9734407C6DC575350212239AC9092DA5812137BFC40F7735BFDF9827F768FC0363FC8C5739C7DF828075EA2BBE6321D5A8EA2EB7E397C3D58A953C7F0BAA69A96AC8110B125EE2E9701F43EEB87FDF58A6E6266BE1136437599E26E8E6E853DBB6ED9DF3931C5F402FD09B7E203AB36EAA6EEAE72E908BD2B9CFD379BC9B407F0C882807BBD2E91F920EB24137002A48F1AAA0CBDF89FDE5C51079F1D8CF7A014207F1B40773321AD952D77CE18EC7B48F2CA054E65420C1132AB67C832EE22FFD8672803CCE3DE7E9FD0690E55FA1AF5F11611E3E2C71CED55E3E347F4CBEB9C93BEC2B98E48495585392471AF0AE589257ED8D01792112C798BCA5107030F207CE567594B8433490D8FF1811F21B03A42AD0678927183321355E3D6908DC1125CDCE038CD0469D72458B6CC5E67EB0D78C20819C6F3C4518B15CC63754FF8679915E329DD46FEAEFDA5249ED7E754E7BD55C75CB764B6CC36BC06267B2479CAFBB3F0BAE32A93558190B65C85DCDC080CD56D51D4105C5B0717691D4DB1893EF8AD550F55855B4123A38D18FD67B588A3A4C2A6604E874D721359352B235C17AB1DA2758712AF8179FF433211B93078735F909F985F557D0DE52CB9203DDC67BF9DC8632ACD8D4F90196AF6BD2E79834371C5E9FDF5992ADB04AEA186AF36F56271F763ACFFBF94DF4B0512CA6B7CA8FF486504E565BDA367E044FCD0F25FBC2A6C720867F95BFD92109780D2E6DD60CE90A4CA8EEB8C4CAB289DCF99E687B017B37695C3B99B4FE97D7E5D52BB9813C04D03C9AD71770FE0986C7F3A3FFD3A261AC771DE88C7ACDEF253E5CE2B50BC5C576D132B68CCC694BA883770B80F5ED7D527CEE816527F69CA2C101747A0088879C3663037DB5B + +count = 82 +seed = 6CDB757AD36DF99E52F535C2680431D5FF36C812D8EA19399F666F2FDD66D3A842A7A5AE1038359AB618FA58A0A6E840 +mlen = 2739 +msg = 7785A08A3892C97D5EBFE52475298BA444674086D63E17E1FAEC96F6B10723447FC1B8CC758D1724A33E26518798183A4B3C99A7DA54038B86473DFAB8E626EB3BF54DE5581E04450B2821F5020C466505990B173DB9F030CFCFA505AA04B37CF0A063876843A042F17AEB1728787187428F8D1010D532C94C7AB2E1193994BFF0CB56415FCD2A96BE7F7FC2C57C8313E795367A22B6A17CE3B803083A74FDBCF030D91C957128099D6199686F2BEA618CEE111AA9D55A6F9E8966C102D849ADE596A1B576924DE0E92DD91FBB01CD93E24AA71EEF219A78430D84965672FE6AF091D46DCFA9AB906F6240913C1286EE0A152666ECFE2C154CD3FB14DC0F9C173E30FC9958A75AA6DD74822AF7ACAD243FDFB743E47E48280990C2870904EF1C902261D0BD6BCFDA91412BDEE9A28C628F218E7648AA0027D918B48EF30A9B18390331805C6739BF6A2CB69A0DE8766A7B3A448910D181F6449565A363430BA1C0FA8B11E1A151F6CEFA3870C3B1D8CD800983EBD41B48C5624269EFB440DF23FF9BCB31A4B02F6505DC862B2103F76137FC6560F893577BC3FCE92ADA27F291305F2345AC82A846854F172131B042735D4B76C6AB2DCFD32BB6258B23AC790AF2AF7624451172FA7A29E0C5FDB3DC3B719B274B2838FF7A8B25F272AC8EA90FA3C8010AC7F65633EB43FF7A0A95CE99717F35D3C416B0E0DA30470B5AA20EB9E2B66315B9407A4753DF8BF505B8066C5D57EC4CCDD2236B9C58BD7337925191ED7B75B92C9CEE626F13EADDECB07173C8160540FB9F6A4D43A1E9AB263B300C08966C247514647DFAB3B420202529E963A51F8D23BD0F689BBC4D67D5A603B876E8CD3EC0770F0D9694DFC30083991CF3989DB1812B4AC5452358075534190F012F7C0E47734C3BA748E04910783C0B845484461DCEA67A1EC731354B902557486B484F67183FC711D10F906C68CD01F46481D040F084271DD784E5B958AE05B65BF5D207EFBB5FDEB25366D6FF4161CA3A1CB71B2B9F90F86A315D800935AC0086D85D907A036C4333EA347000A0755550B68FE3DD7686E416483781B563680146697D6FAE8333C24ADC8A2436852DDADF6061E2B16FD3829C0B55C2E9C2C89F64CB8DA02A6706498CF0330742083E9AC4593A1762D32DC4E6CC2D9F4310014FB15DEBBEA324EBC2EA1E1660782559B9B39FBCF34C85FDA9AD350D195AD7587AAB621EF7FFB63277CE35AB43B01977C9F8DD6C2AE7B34FA7B35D5FA37D8B3719E736F18734CB3A2468BE9CA0832DDE0B958925A377FE6751C4EB8FF1AD295355302F0A5ED4E8F8C33FD5162542B8ED7CD985DBE3C84401830F6A7EB9D955EC74C7F98B02388B4E1353317CDB5EADAAC9025038CC01F8655C7FB9AEE940FC4B282748B39D277A7FEF462038833A9A8EB50A8719F68B3E858825911F294A80FAEDE9D4C1815844C2632DD20387950003DAB80B1A58E541A5E6658AF7D4CDD91FD1C08735B584F5C69C5CA94F6B7F97A4761B127DB394AC72E902DB9EB4B3E0B884C448FF2763FF9ADD530753263688CF92BB746181C17294BFFC2A0B3969A7BBA429A481C425B24745CEAD66286F5DF04F1E4421C56ACAA668E87BA58E3B07A062D1DA60CC6B411667BDE6F466B72C9169965BC7781DA78A818F779A9B3D7A577F71A1DF49AAC865A0D6F2668CFD2C77CFA8D306A14DBBDE4D3A3818B07DC89D5F51E117F7BFD007D60F32BB1B6BB01E76862398371FB91E0A3D4B39FD9146C47F627A066618CF83C32E5C82592B418BD2F5DCD8D42234625974F988A6F729C60BA5EAF18C77B611DFB187A581E3A10268A965F650FE242CE2FE08AA71515B59A6EDFC9CBDAE22DF3AEB22E773CC2EB373619E9CDA23C236CA3F7845C2136E93849D9F6AA1477F4513358CD8CB4E21444C9E5709818801EADFCA23F2C23DDFD5B4EBB6089DAEDD14A21EBF3F7A8C1C80BBF7D37973BD156AC5C4462D29DCCB7EEFFA22A8B6CE433B600532F33999ADC39196F01230614767285089FB262D8469DC66D24AE0B77FD05C3EC02FBC5EE328319409B8E2D7B0AC6801C1C8BA86F793C2037C71E2A25F114E9EE0EDB3B83076EABFDAFEDEFA0548DAE91E62CB7C29C03413235B8C6EB9F46BE29DE8F5D30E8D97DB6F45687DC4719B1024E48B7DFFD0D2B474B2032B4E69B6382E603D4777F3450E2E467C6D9AB2782C0AE266C320D36BF67BD6B86EA9721B22741684D9C0CCC774335430071A5410C1E34B4BC1A823A93A38F5AB4781CC593B13A593867FB634C0C705107CD278C6CCEE6D842748BFBD2FFD205C6BDFB3AC87F693C25C832C86D96B00BBA0AF88DCFBC8CA4328765DE27FBF1389C4EDE28317BD0EE447F030990E957D223A5EC66CED9D16400AF6DA8663C4E4111B4584F8F0066CDF8258D90C5D7B439503E3AB3FCC55FDF933E06D704416187AAF86E6C39695DEA8B8189EC1299670BE03B6A636889CB7F10F04CCD67278E77886CF3F6E2A05BA8D25AB8664EA817642ACF5DB4D9B3EF80E169463EDB6BFDF67172E88D233609B091BBD085B970DB8AE0DAA5048CA42D6A54042F42445BAB03F9BF1ACCEF341B7349109BA0073D3715A9073AD9BED258268AEE9DD5202E0EDFA5720A317EA5CB41706C0D235465BECDC8E3FF0D628EE5EEA6AAF1BBD3E18FE9217516893DF115E979C4CFFEC494988B6F9B86026610898C44AB1547C5F8ED5CBF3C3A837DDB6A444BD3E803E1824E6AB931310FE86B36587F1B34B0B48D358F4B97E9774213DE7D92571380BE2199E703119C5B9836DADFC826B71D588250AC37DE0EC05C5823573C102BCE44C9F044507671C4E1723950A3C0E14968CBABBFEEB049EB723DB9B23CDF0273525C29CC5165530A1F1CF830D3551DD6BDED53954947D5C334DC9C71907CDBFA109EBC52D6305477C14159257AF8C51C6F09D76FC0085C3D969EC60FB09145E66A8A7489611DB3FDEFC35202B8AAE82D3CDF666034BEFF49FE49A45C5EC438F4118F338545532CED916DE78E3BF82B4E55907474386B9C172F393EFE895334F7323CBB2AA7CE7718BEF5E7A23AF734BD4963FBC7889AA5C50F3955B904B5E577D71B21A293D766865E3F8C212DE5EA084A9D22748A8009A7D1858328A1BDF7BA0F4E3B83BE9707629252B3339CEF796696855A574B4A4896CA68C3D6A6824E3F593069EC0A571E61282F8A29BEB8BD788F7B351A8939CDAD9E257587A77804F2704F49DB3305514B85B449AEE56EE40CB2A75D51690194284AACD0855B02893F8DCD3091629DC548705A1085E5CC33DE7726A0F521C149003DF380ABDAE96BCDA55C44BF9BFA1103150F049563E848A8750625DCFDD9BFE02E1E57489B5B3AA28BEAA80F4DAA562DEABB4BB6A27125369415885020D237A92CCC3A23593FE2183225BFA2FF39B0BEF9CB0425375E256BCD572175483F713BD38F937F2B3D4C1F686C5AF60061E0B05CC3EBAAB0AE8BA21E47A8318BEE4A01516046363D152936A1344E17A65E08030522EC667233145A56001B8D065DC2FED0D2A9F02C981A8962F984916314805DAB644A5112CAA1564895121D8B1FD046F547BE282CF979752883EC79AF70CF59A88D960F3336F0AE61357877AAAA34699A876144B65CA5B77A684D850D09B3D42CDBFC4539EA103F8377CFE5F9E5432403FAB416662C4C83226191EEB7F82B01E0819C081FC40E7B978669C7856067E8B582832DD0B92588103C2616BA2C7774C46840318CA2B1A3798FF7ED9FEC087F01798EA2445B92E67E2446126A7406E82FF8D3711311BE16E9171531A95C966E6BEFEA34938E6F5FA660F7C7CB533A119377F1D26AE6AE51D805AB96A64C8B80D6EE137F634B384C2E377 +pk = 458BDBD88AF5B2CD9922C20348FD30D1E75E0ABB80FDE2C65CC0315B7CD038BB3A170D377E1F577A4559DED9AB67393969EA47879F13942DB1DF62AAC28677012A18B06C3CF9649A26D526E0E22CB5F0C8A4FB9C12D7365227DAD0125CEC96871C93FDA8851ED6EBECFB399C229D151557F21DA332B87943FB1E01FF94B2120104 +sk = 458BDBD88AF5B2CD9922C20348FD30D1E75E0ABB80FDE2C65CC0315B7CD038BB3A170D377E1F577A4559DED9AB67393969EA47879F13942DB1DF62AAC28677012A18B06C3CF9649A26D526E0E22CB5F0C8A4FB9C12D7365227DAD0125CEC96871C93FDA8851ED6EBECFB399C229D151557F21DA332B87943FB1E01FF94B21201047D9B3CF6A8B4C7A62A7C3854C6CF49F65F90BB98D47D0D993A457F2A654D9699D400000000000000000000000000000000000000000000000000000000000000D2499A8957F07E30CF3762BBE7EB6E32C7136C384830244270FAF464C1903213FEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D1CDC7F8ECBE41E6E1B1BFE27881EB807FC0659697F23FED9EFFBC9241EE5DCA3FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D265704AF2A6EED24DF811B40443253072951D8332E3ED6152EA0DB143E2C5AC2658F038245467DB5BCC3A7D77FA062247478E9F4057DC1403F3BF96C3870AA7B3956BBAC4D41340978A9113C12BDDA64483ECE1F0B26E8FB6CE34809F3D7F1969DBE8D25AD9E4617E0FB430EDC5D82AF2E595E38767426FC2E9AA7D060B336E63121706F2D820AE0FA71CBF20A5782FE48FAB27B4769E37E0A06A4EBF767F90DF0FC24BAF944B61A1ABB86C6C5EEB47681189E43200931A57B277EA02688AC74B854D91B46BCEF103A792EAD733478E40E226CC7E65F72B149BE987A4A65D2D1614A3E9AE98C797A6E7AE4ED5737EAB5D473399E5C68E1C66895800 +smlen = 3031 +sm = 50E43C695914A161AAB7F4AB24BE8F954D2EA41BB0CF489A32F73535D67CBBDA3C4380C5E538BAB71E836469375A2CD189B2AF3E3C163AB175D5AD1FCA0B1000FC33BAF392F5FEE42D23FFD2FF63744AE66631EC27AD0CC850166629A9485778E5CB016F458C3FCB2FD0E8877F351329F96F244AC6B932B34DC3F6B12A3B8201000023E018E41E61AF4C9EA40495E116B82AB5A79A345A603C11F04B67A584793074781820AF2F4529C457624C59791D184626B81DAAF906238FC9A5823F14BA2E0B0E346A170B159B6A38FB85A6B05077820E914C45A815FA6D6A2729CABBCF3C55D71B9FF7819C79F10D8DB6BDCE25ADCEDE7DE97293CE45EB852F3C008EC08E5C858E420866BA0A97054207067A55FF4825DB3754C5840F04B76EE1F0961D470009027785A08A3892C97D5EBFE52475298BA444674086D63E17E1FAEC96F6B10723447FC1B8CC758D1724A33E26518798183A4B3C99A7DA54038B86473DFAB8E626EB3BF54DE5581E04450B2821F5020C466505990B173DB9F030CFCFA505AA04B37CF0A063876843A042F17AEB1728787187428F8D1010D532C94C7AB2E1193994BFF0CB56415FCD2A96BE7F7FC2C57C8313E795367A22B6A17CE3B803083A74FDBCF030D91C957128099D6199686F2BEA618CEE111AA9D55A6F9E8966C102D849ADE596A1B576924DE0E92DD91FBB01CD93E24AA71EEF219A78430D84965672FE6AF091D46DCFA9AB906F6240913C1286EE0A152666ECFE2C154CD3FB14DC0F9C173E30FC9958A75AA6DD74822AF7ACAD243FDFB743E47E48280990C2870904EF1C902261D0BD6BCFDA91412BDEE9A28C628F218E7648AA0027D918B48EF30A9B18390331805C6739BF6A2CB69A0DE8766A7B3A448910D181F6449565A363430BA1C0FA8B11E1A151F6CEFA3870C3B1D8CD800983EBD41B48C5624269EFB440DF23FF9BCB31A4B02F6505DC862B2103F76137FC6560F893577BC3FCE92ADA27F291305F2345AC82A846854F172131B042735D4B76C6AB2DCFD32BB6258B23AC790AF2AF7624451172FA7A29E0C5FDB3DC3B719B274B2838FF7A8B25F272AC8EA90FA3C8010AC7F65633EB43FF7A0A95CE99717F35D3C416B0E0DA30470B5AA20EB9E2B66315B9407A4753DF8BF505B8066C5D57EC4CCDD2236B9C58BD7337925191ED7B75B92C9CEE626F13EADDECB07173C8160540FB9F6A4D43A1E9AB263B300C08966C247514647DFAB3B420202529E963A51F8D23BD0F689BBC4D67D5A603B876E8CD3EC0770F0D9694DFC30083991CF3989DB1812B4AC5452358075534190F012F7C0E47734C3BA748E04910783C0B845484461DCEA67A1EC731354B902557486B484F67183FC711D10F906C68CD01F46481D040F084271DD784E5B958AE05B65BF5D207EFBB5FDEB25366D6FF4161CA3A1CB71B2B9F90F86A315D800935AC0086D85D907A036C4333EA347000A0755550B68FE3DD7686E416483781B563680146697D6FAE8333C24ADC8A2436852DDADF6061E2B16FD3829C0B55C2E9C2C89F64CB8DA02A6706498CF0330742083E9AC4593A1762D32DC4E6CC2D9F4310014FB15DEBBEA324EBC2EA1E1660782559B9B39FBCF34C85FDA9AD350D195AD7587AAB621EF7FFB63277CE35AB43B01977C9F8DD6C2AE7B34FA7B35D5FA37D8B3719E736F18734CB3A2468BE9CA0832DDE0B958925A377FE6751C4EB8FF1AD295355302F0A5ED4E8F8C33FD5162542B8ED7CD985DBE3C84401830F6A7EB9D955EC74C7F98B02388B4E1353317CDB5EADAAC9025038CC01F8655C7FB9AEE940FC4B282748B39D277A7FEF462038833A9A8EB50A8719F68B3E858825911F294A80FAEDE9D4C1815844C2632DD20387950003DAB80B1A58E541A5E6658AF7D4CDD91FD1C08735B584F5C69C5CA94F6B7F97A4761B127DB394AC72E902DB9EB4B3E0B884C448FF2763FF9ADD530753263688CF92BB746181C17294BFFC2A0B3969A7BBA429A481C425B24745CEAD66286F5DF04F1E4421C56ACAA668E87BA58E3B07A062D1DA60CC6B411667BDE6F466B72C9169965BC7781DA78A818F779A9B3D7A577F71A1DF49AAC865A0D6F2668CFD2C77CFA8D306A14DBBDE4D3A3818B07DC89D5F51E117F7BFD007D60F32BB1B6BB01E76862398371FB91E0A3D4B39FD9146C47F627A066618CF83C32E5C82592B418BD2F5DCD8D42234625974F988A6F729C60BA5EAF18C77B611DFB187A581E3A10268A965F650FE242CE2FE08AA71515B59A6EDFC9CBDAE22DF3AEB22E773CC2EB373619E9CDA23C236CA3F7845C2136E93849D9F6AA1477F4513358CD8CB4E21444C9E5709818801EADFCA23F2C23DDFD5B4EBB6089DAEDD14A21EBF3F7A8C1C80BBF7D37973BD156AC5C4462D29DCCB7EEFFA22A8B6CE433B600532F33999ADC39196F01230614767285089FB262D8469DC66D24AE0B77FD05C3EC02FBC5EE328319409B8E2D7B0AC6801C1C8BA86F793C2037C71E2A25F114E9EE0EDB3B83076EABFDAFEDEFA0548DAE91E62CB7C29C03413235B8C6EB9F46BE29DE8F5D30E8D97DB6F45687DC4719B1024E48B7DFFD0D2B474B2032B4E69B6382E603D4777F3450E2E467C6D9AB2782C0AE266C320D36BF67BD6B86EA9721B22741684D9C0CCC774335430071A5410C1E34B4BC1A823A93A38F5AB4781CC593B13A593867FB634C0C705107CD278C6CCEE6D842748BFBD2FFD205C6BDFB3AC87F693C25C832C86D96B00BBA0AF88DCFBC8CA4328765DE27FBF1389C4EDE28317BD0EE447F030990E957D223A5EC66CED9D16400AF6DA8663C4E4111B4584F8F0066CDF8258D90C5D7B439503E3AB3FCC55FDF933E06D704416187AAF86E6C39695DEA8B8189EC1299670BE03B6A636889CB7F10F04CCD67278E77886CF3F6E2A05BA8D25AB8664EA817642ACF5DB4D9B3EF80E169463EDB6BFDF67172E88D233609B091BBD085B970DB8AE0DAA5048CA42D6A54042F42445BAB03F9BF1ACCEF341B7349109BA0073D3715A9073AD9BED258268AEE9DD5202E0EDFA5720A317EA5CB41706C0D235465BECDC8E3FF0D628EE5EEA6AAF1BBD3E18FE9217516893DF115E979C4CFFEC494988B6F9B86026610898C44AB1547C5F8ED5CBF3C3A837DDB6A444BD3E803E1824E6AB931310FE86B36587F1B34B0B48D358F4B97E9774213DE7D92571380BE2199E703119C5B9836DADFC826B71D588250AC37DE0EC05C5823573C102BCE44C9F044507671C4E1723950A3C0E14968CBABBFEEB049EB723DB9B23CDF0273525C29CC5165530A1F1CF830D3551DD6BDED53954947D5C334DC9C71907CDBFA109EBC52D6305477C14159257AF8C51C6F09D76FC0085C3D969EC60FB09145E66A8A7489611DB3FDEFC35202B8AAE82D3CDF666034BEFF49FE49A45C5EC438F4118F338545532CED916DE78E3BF82B4E55907474386B9C172F393EFE895334F7323CBB2AA7CE7718BEF5E7A23AF734BD4963FBC7889AA5C50F3955B904B5E577D71B21A293D766865E3F8C212DE5EA084A9D22748A8009A7D1858328A1BDF7BA0F4E3B83BE9707629252B3339CEF796696855A574B4A4896CA68C3D6A6824E3F593069EC0A571E61282F8A29BEB8BD788F7B351A8939CDAD9E257587A77804F2704F49DB3305514B85B449AEE56EE40CB2A75D51690194284AACD0855B02893F8DCD3091629DC548705A1085E5CC33DE7726A0F521C149003DF380ABDAE96BCDA55C44BF9BFA1103150F049563E848A8750625DCFDD9BFE02E1E57489B5B3AA28BEAA80F4DAA562DEABB4BB6A27125369415885020D237A92CCC3A23593FE2183225BFA2FF39B0BEF9CB0425375E256BCD572175483F713BD38F937F2B3D4C1F686C5AF60061E0B05CC3EBAAB0AE8BA21E47A8318BEE4A01516046363D152936A1344E17A65E08030522EC667233145A56001B8D065DC2FED0D2A9F02C981A8962F984916314805DAB644A5112CAA1564895121D8B1FD046F547BE282CF979752883EC79AF70CF59A88D960F3336F0AE61357877AAAA34699A876144B65CA5B77A684D850D09B3D42CDBFC4539EA103F8377CFE5F9E5432403FAB416662C4C83226191EEB7F82B01E0819C081FC40E7B978669C7856067E8B582832DD0B92588103C2616BA2C7774C46840318CA2B1A3798FF7ED9FEC087F01798EA2445B92E67E2446126A7406E82FF8D3711311BE16E9171531A95C966E6BEFEA34938E6F5FA660F7C7CB533A119377F1D26AE6AE51D805AB96A64C8B80D6EE137F634B384C2E377 + +count = 83 +seed = A97269579EB70D268C58D94FF744329B197F722A8A407B788510DDCACA34C8CD4C72FFC14B76300C86AEA1E4CFA66BA4 +mlen = 2772 +msg = AE3DDE9E33719040345DF8EA7E4C0B5E2CBC5CB80B34FDDB959E2DA1D67D74D2FBE5AAB07C6357A9F3E5F6EF5379B4C75008E9077A1EB025F9023FE32FCD9076C8D2B291D0BECF2DC624F9E752B1EEA2CF0755FC9D4B2E4320DFD042C68577D58E61DAD075BC1C3931ABA78B473C0726ED495150D6A11A81DBBD1C840F5F1FAACD54E3470E0D994DEACA7E6E324A9FB4E581AB447A4EA026DA3DC3C7E6AD55E88CB841E069ECA63404CACE0E3D4C8B9CEC33BFF6AA6341AA1EB69AD799C6CCE358CA94555287D01B0192B1B49EB6F705E54FBC86465C4BA70134AFC9A53C1C3A732E21B010002B49B7CC6F5237B794BC1D1F1E30A7F1EB95D195D5F26B46A704F77F80B092117EDE1C340622FF32302DCA7E7E43C2A4D8852CB508403B1AA8ACA27A86936350264811550DFEF05D72542C74D6243AB9D259202295A63F54C836CBF610E40EB85E9704041A51BF68578B10F7985C752DC35788E7B7754358082AFEC9E4B271D36974EB90A46F7D703B0CCE941C3CD072A88F931A4FFD098634BE0921D089E46637F88F9625B7DF900A276B4BB75FC75921C8A8B6668DF9946290E11FCE4565A76D39D8FA55F324253FFBBF81536581621DEE664A9E9E4F4FCD3A9765706B8EA833125A825B1CB30314B7C6C78B301638EAD4311932FD4611D78572180EE441648F8BFAB869874611C153FEEFF88A45F7A98206D0B2D97CB7EC2144F045225AF5A9925AE7FD3DB017E37259B7A2FF6C66820DDAAC5651B2EC2E5767DDBBE18256B1D0D0F96CF5EE04266B8ADB29B0AC5D55B73E1ECA8FE724EE174B76EA1C0A54896E2BB565075F1669D3CCA171657B66F343A634F4250287F853B52182B9BE50DF29021673DB1841ACA45E7263DCE653F0DD84338E49FF5C6E3BB42F1A3C7164704A2A000149114D36BB9231606EDA06C712A904C1E323C4AA3EEE0BCE6062A9CB956E004407014ADB58EEABF486B38570955C30F2B5C28179F86CD5FFD603CD441A1FB06519368886BFF9C2C127ABD079346D762E51C311F196D5F825B45EDDD4A48C7C2123E10A3D369D772750987EDB96968C59441FB2F47F8E33FA4CED3006766C06BB6B339ED94B8FE57B20D96F1A27A61966289D8FF5072FD11D7EE53DEFE0014A11667D0A6C988BD16629FB53F269130B22A13AABA2E9F70DCC93D3BF6E611EFB006BA585FB8E8720357E25DF69C6DF388FAC792F87CCE801FA49A8CBEAD1698C11B82C4F85FDB4D52A2A808483DCA7334295BB3B2658AAC18857878730831622124F5A254A464DE459F3528C5194220E5BB1779C8F5E3866B0D60931A1A47502D99E2B186785658DEF57ABA676626F9CCAAAF449609B07AF7B57C78FA5BD06B2AD2927AB491EE461A94AC37A079D9BFA02203B09F7EF180C1C1C430518FF2D3F2A3582EAEB6668060A2B544E973E8A2B88733A902A0A80F8E4F30AC5D0223C1076482EB2CA5AE67039597514A4866061D5FBDD99694A060D0D0EE43A1B7290FFD7D796A9F1A2142DB6E0F154ABA8720396B6DE939E668447C81CC828FF9D2A014FE001CA718C1D6ACF4C08BC7796D344A29FD8913E4CE71E986C46BB66C2610FA797C9E1639DF423C338D7192638F621D83A6802E72E38BEE3AAB064FB606962329997FE908597E7407CEF098D4591E5E6011CACA701994E4ACF572F7C91057D3DA06058A7DFFD3248EE3333208BFF27473E6F1EA3914C5B2056AECD7AEE07F8DD26B3C2B8B9656EA4260D38E8D5F23C925A4476754240D0702C5859AEC2329E1CC3E426BD7665B2A4EE2E75B41B561FCE79690F64D1068DD35A294A8E8CB43A6AAA901109F0E09D985B6E323C30A017E75BF01D0AAA739102C1A6667ED48E60DD4499EAB862851558DFD17229878F5BEF0CC29FD19F59835579F3CDD4F85684E0D46D9618A205DE3B29B0BFA5FBB36745B989211E2BA711527D32CBB5E35830DF4549FEA652377EBBAC6D52787F9EBC3CB687EBB641BF51D3E22E98FCA48F99584FB1F3BED3F97F33EBF656C5795055268F49985CEA00819A07B8F4B0ECD7BEDA95EAF11E3498FA7AA414C54C38A08A841B012AE91763BE911DAEF803E2CA385C9D4CDC642A0B343DB6534C10D9E1755B7B2DE543AFE1D3C90981A7BD907E9CB14367243D9FDCAA8776AEE5F65ED6DC02F633BCF9F57DAE39E8E8261DC10029DF7B7124BEB67DD753B36892481EA7CC54DDC3A60EF8D4DCEC4D5796DDE0E7453BBF0FD93FCACE97CE5048D75ED1F34B69A392E1734E262B2B2A1E246331A373B5CF1FEE7BB46096C76349B0F19BE63FE539DCD33A8450BE894C2DC21BEFF0DE6A841A533F4C9949289037D161BB97DCE31CDFF4C1E0AE36B4192594DEC3B021E8F3D5B500C244CB122974F8CADF125DE0CF832A920DEC3A6F7150585D0209651B0FAAE0F74A36FC8779115B96136805DDD4F6F3A69C06AF472F369F481359FF834A0FD2F9AE899EA36B9B061B63D07C1D4ED7A373ACC40EAD808564B05FB0C6E656A80FA3865AABE483848D14D1DFD66D7AB1F353642EE3417869DA21622F6AF551659D07E6C827C18EA36E2C5E806A9571A7B05BBC1BA283A8984BFABC555AACAEAB2453573F782A4087F0F903AF34596E83282A2E54773AC33543BD353A3F855BC46810930C3635A9B70BA7FFBEEA95A129CCF9E9538EB11E119A072F806130D831AF7E57D332AC889D7D9E6BBD1C65D64E089722F6954F126E64EA939D98084D434EE74B55C549BED21D11264F8B5E023277DB52B03D7B8A8E75B12B11D62052E474E435707272D72D00D92288CEDDCD1ABF8E63A8A9963A48B54F492487B309F69CD90C9FF54B9C5A55CD2BAD4A2E0A6B00B188FD6C527A8184BB63670BF626A995815810CC0F280131F5F652EC20609C7D3B910E4168FE273626BF0E2CBF05BC9CCD178AD91BC25CDF178B387DFF0B6B40A46FDB6C975349B6CD8AD103CDC5DAB8D09D9A5B55622E74564C1E789C5C185CAC04FA0ED6065B9CCADB1D5DC80E90AB244CE1AAC516B346ADAEBAF7A030D66FB90FD070ED062A41E0B70BEE3B07F1C03887DE5F79D70F9955B25B8C8201602784EF8A60147260D1BDE8E152E8D3F992CB8255ADACE9D5DD2E9C856C47537742094190AA867459D20989DB11841AE44824979C0A2093D7EDCAA13C9DE25E6EECBC5124055F17466467E123E39034502BA966CEA873997EE25E52DE2DBBA874DC9AC222B49967B7BEDB5C81BE09827CAB782F458795B2903D72AB16F4423964F82DC69C138EEFA3273BC10376939E544964150D9DF09E14BE08CFCA06C10BB2C315B1B676C40762F8209C0EF13CFE5FAD76CFC17FE462D8330F78BAB072C5465F7A26D047FEC4BD3B918C9C761B91B02D820ED7EF345E79A66FBA61AE13D3050A27488CBDBE693B800F1E76C188EBD8118C9432EB9E7124D35A1A038D237918F1DB83304D10AB5DEDF58C6951A92AAB1A1A40E180254E730EB43B566A83CC71FB6B9749BFCD3A90B964966CAE90FAD7406A8A89B1E48C885BFE2DB41C1996F20DC9A8DFCBA1A6F2F307EF8FBA5EEAE9631C2D6328D90F17679DD9E8E9660D6BD4C8A1D79C47A5FD46BD2ACCACA2D5C6407B0F7F31D093CEEF0342C67DDE3F1BA5067ED1500DC45161B8636255924BF007C4C870990C5DCE098C5A26386AD84D0F0CE4860349A147A4E7AB80151FA63882590B91C6AD3E70A68E6FEC1A2CF65881A6DC38048FC14DE71C702C934C5D3C4CF4C474F906C3400364BC400A7DA087F94F1ACCB68439A9A6FFA8C6439B2CC5C0B17A7D649033798429F211D9DE12B24D117583E1C425C2C0348C625CC44E9B976D319E72D4E09D5D6F36EE243F5FBCB190E84DE56EB680DEC8566F5A2C7D5F595116C628CA09401D561BD78356C634419225FB01CB637C46A627F6026D39EC1C62E9A3E85FAE +pk = 28907D368F2FB8AECB829BCAAFE72DE1C21DE46F1DF2393182CD278E44DE7413F5948B5ED5839825DD80752A20D5A83C8B80A36BD4547755FF2C474EE9A10401FA1BC1FB8ED86231710625D72934164E47FBA4DC05E4DD68D0E6DA302EA1021CC4A92241329BECBFC357ECA4C1EE65E57F25686C6FEDDF5156B7BB62996BC30009 +sk = 28907D368F2FB8AECB829BCAAFE72DE1C21DE46F1DF2393182CD278E44DE7413F5948B5ED5839825DD80752A20D5A83C8B80A36BD4547755FF2C474EE9A10401FA1BC1FB8ED86231710625D72934164E47FBA4DC05E4DD68D0E6DA302EA1021CC4A92241329BECBFC357ECA4C1EE65E57F25686C6FEDDF5156B7BB62996BC30009535234451EAFD6472C7CECE5FC22449D46149E6E34A6A29B8128BD668A15FDAE84000000000000000000000000000000000000000000000000000000000000009EF8A28F96BD3843743E53B37E0E8442B9B90524CAE861EC5EB596D6E35C68409DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1FB6ED563EA675C636FBAA06A23FF539327F74E1B58279179659CE22A9287981FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F2D1EDA8D53F8A696D7EB1A9508D18915A5A3BC41302F278E2767A728DEF64DBF83E29E005E7DD030FC91566CB1C3233D350C6ED9051D2EA18FC2193E6107B0A301FC4A9E5FB2CE45B216556D35A55ED8EFD8AF10DCC744497FC27CD85274905C8779AD4BB43B0A1AB8CEF0334F2F0B17F6C177A02ED96B7ECB70523E0A3A1C18370546D2FAEBF32358CC7F6B1DFF8C7301BF701D19DD904C93A9CE78C142BDBACDD8DF797235DD7D6ADB17260FE82D51C23BC9E9BA0B7EB15EB965094793B1C1EA0327EEB775D4616B6667A89C584302546088B28C22F64990BB16428051B786FCA86E69A7BC5C1CFCDF398C00EA33C42A8C2843C9760784DB6305 +smlen = 3064 +sm = FAF8986E74D432925CBBC34AEA6FF2491E2697FD3E0E1C9AF02094450FA866A18387B01794D71C87BACDE0CB046F4C690B29AB0583594132DD7665A4C38888004D293B95114C439A2FEFABC1FEB2DE929E88F2D3EA9784C51492D14247412371BD2BBE0E643174A0AC574F3D7FF14CE9E170980F955141039281856B1F50440000005F532EF850CEEAC2DC6BE67D4D3A6B0FAB775643E601AFEF0509E4FF1C2C2A1BE0F70E6F2C49AB78B3E7129226C4DED25A7B5976F52B853C2262A6BAA030887EF88CE9C2DDAD3D43B0C02CF6E2EBAB7314750960F1C4FAAAAF2487C0585B6E2C5BC2C42C6F9FEE4405BDABBF47DB1B481FAE83550377FAE26FA8629635BE6B1CD515B5926B3E15B7AAA11B41FD08E6B83E37B3756095D950CF106417DA0B7C001102AE3DDE9E33719040345DF8EA7E4C0B5E2CBC5CB80B34FDDB959E2DA1D67D74D2FBE5AAB07C6357A9F3E5F6EF5379B4C75008E9077A1EB025F9023FE32FCD9076C8D2B291D0BECF2DC624F9E752B1EEA2CF0755FC9D4B2E4320DFD042C68577D58E61DAD075BC1C3931ABA78B473C0726ED495150D6A11A81DBBD1C840F5F1FAACD54E3470E0D994DEACA7E6E324A9FB4E581AB447A4EA026DA3DC3C7E6AD55E88CB841E069ECA63404CACE0E3D4C8B9CEC33BFF6AA6341AA1EB69AD799C6CCE358CA94555287D01B0192B1B49EB6F705E54FBC86465C4BA70134AFC9A53C1C3A732E21B010002B49B7CC6F5237B794BC1D1F1E30A7F1EB95D195D5F26B46A704F77F80B092117EDE1C340622FF32302DCA7E7E43C2A4D8852CB508403B1AA8ACA27A86936350264811550DFEF05D72542C74D6243AB9D259202295A63F54C836CBF610E40EB85E9704041A51BF68578B10F7985C752DC35788E7B7754358082AFEC9E4B271D36974EB90A46F7D703B0CCE941C3CD072A88F931A4FFD098634BE0921D089E46637F88F9625B7DF900A276B4BB75FC75921C8A8B6668DF9946290E11FCE4565A76D39D8FA55F324253FFBBF81536581621DEE664A9E9E4F4FCD3A9765706B8EA833125A825B1CB30314B7C6C78B301638EAD4311932FD4611D78572180EE441648F8BFAB869874611C153FEEFF88A45F7A98206D0B2D97CB7EC2144F045225AF5A9925AE7FD3DB017E37259B7A2FF6C66820DDAAC5651B2EC2E5767DDBBE18256B1D0D0F96CF5EE04266B8ADB29B0AC5D55B73E1ECA8FE724EE174B76EA1C0A54896E2BB565075F1669D3CCA171657B66F343A634F4250287F853B52182B9BE50DF29021673DB1841ACA45E7263DCE653F0DD84338E49FF5C6E3BB42F1A3C7164704A2A000149114D36BB9231606EDA06C712A904C1E323C4AA3EEE0BCE6062A9CB956E004407014ADB58EEABF486B38570955C30F2B5C28179F86CD5FFD603CD441A1FB06519368886BFF9C2C127ABD079346D762E51C311F196D5F825B45EDDD4A48C7C2123E10A3D369D772750987EDB96968C59441FB2F47F8E33FA4CED3006766C06BB6B339ED94B8FE57B20D96F1A27A61966289D8FF5072FD11D7EE53DEFE0014A11667D0A6C988BD16629FB53F269130B22A13AABA2E9F70DCC93D3BF6E611EFB006BA585FB8E8720357E25DF69C6DF388FAC792F87CCE801FA49A8CBEAD1698C11B82C4F85FDB4D52A2A808483DCA7334295BB3B2658AAC18857878730831622124F5A254A464DE459F3528C5194220E5BB1779C8F5E3866B0D60931A1A47502D99E2B186785658DEF57ABA676626F9CCAAAF449609B07AF7B57C78FA5BD06B2AD2927AB491EE461A94AC37A079D9BFA02203B09F7EF180C1C1C430518FF2D3F2A3582EAEB6668060A2B544E973E8A2B88733A902A0A80F8E4F30AC5D0223C1076482EB2CA5AE67039597514A4866061D5FBDD99694A060D0D0EE43A1B7290FFD7D796A9F1A2142DB6E0F154ABA8720396B6DE939E668447C81CC828FF9D2A014FE001CA718C1D6ACF4C08BC7796D344A29FD8913E4CE71E986C46BB66C2610FA797C9E1639DF423C338D7192638F621D83A6802E72E38BEE3AAB064FB606962329997FE908597E7407CEF098D4591E5E6011CACA701994E4ACF572F7C91057D3DA06058A7DFFD3248EE3333208BFF27473E6F1EA3914C5B2056AECD7AEE07F8DD26B3C2B8B9656EA4260D38E8D5F23C925A4476754240D0702C5859AEC2329E1CC3E426BD7665B2A4EE2E75B41B561FCE79690F64D1068DD35A294A8E8CB43A6AAA901109F0E09D985B6E323C30A017E75BF01D0AAA739102C1A6667ED48E60DD4499EAB862851558DFD17229878F5BEF0CC29FD19F59835579F3CDD4F85684E0D46D9618A205DE3B29B0BFA5FBB36745B989211E2BA711527D32CBB5E35830DF4549FEA652377EBBAC6D52787F9EBC3CB687EBB641BF51D3E22E98FCA48F99584FB1F3BED3F97F33EBF656C5795055268F49985CEA00819A07B8F4B0ECD7BEDA95EAF11E3498FA7AA414C54C38A08A841B012AE91763BE911DAEF803E2CA385C9D4CDC642A0B343DB6534C10D9E1755B7B2DE543AFE1D3C90981A7BD907E9CB14367243D9FDCAA8776AEE5F65ED6DC02F633BCF9F57DAE39E8E8261DC10029DF7B7124BEB67DD753B36892481EA7CC54DDC3A60EF8D4DCEC4D5796DDE0E7453BBF0FD93FCACE97CE5048D75ED1F34B69A392E1734E262B2B2A1E246331A373B5CF1FEE7BB46096C76349B0F19BE63FE539DCD33A8450BE894C2DC21BEFF0DE6A841A533F4C9949289037D161BB97DCE31CDFF4C1E0AE36B4192594DEC3B021E8F3D5B500C244CB122974F8CADF125DE0CF832A920DEC3A6F7150585D0209651B0FAAE0F74A36FC8779115B96136805DDD4F6F3A69C06AF472F369F481359FF834A0FD2F9AE899EA36B9B061B63D07C1D4ED7A373ACC40EAD808564B05FB0C6E656A80FA3865AABE483848D14D1DFD66D7AB1F353642EE3417869DA21622F6AF551659D07E6C827C18EA36E2C5E806A9571A7B05BBC1BA283A8984BFABC555AACAEAB2453573F782A4087F0F903AF34596E83282A2E54773AC33543BD353A3F855BC46810930C3635A9B70BA7FFBEEA95A129CCF9E9538EB11E119A072F806130D831AF7E57D332AC889D7D9E6BBD1C65D64E089722F6954F126E64EA939D98084D434EE74B55C549BED21D11264F8B5E023277DB52B03D7B8A8E75B12B11D62052E474E435707272D72D00D92288CEDDCD1ABF8E63A8A9963A48B54F492487B309F69CD90C9FF54B9C5A55CD2BAD4A2E0A6B00B188FD6C527A8184BB63670BF626A995815810CC0F280131F5F652EC20609C7D3B910E4168FE273626BF0E2CBF05BC9CCD178AD91BC25CDF178B387DFF0B6B40A46FDB6C975349B6CD8AD103CDC5DAB8D09D9A5B55622E74564C1E789C5C185CAC04FA0ED6065B9CCADB1D5DC80E90AB244CE1AAC516B346ADAEBAF7A030D66FB90FD070ED062A41E0B70BEE3B07F1C03887DE5F79D70F9955B25B8C8201602784EF8A60147260D1BDE8E152E8D3F992CB8255ADACE9D5DD2E9C856C47537742094190AA867459D20989DB11841AE44824979C0A2093D7EDCAA13C9DE25E6EECBC5124055F17466467E123E39034502BA966CEA873997EE25E52DE2DBBA874DC9AC222B49967B7BEDB5C81BE09827CAB782F458795B2903D72AB16F4423964F82DC69C138EEFA3273BC10376939E544964150D9DF09E14BE08CFCA06C10BB2C315B1B676C40762F8209C0EF13CFE5FAD76CFC17FE462D8330F78BAB072C5465F7A26D047FEC4BD3B918C9C761B91B02D820ED7EF345E79A66FBA61AE13D3050A27488CBDBE693B800F1E76C188EBD8118C9432EB9E7124D35A1A038D237918F1DB83304D10AB5DEDF58C6951A92AAB1A1A40E180254E730EB43B566A83CC71FB6B9749BFCD3A90B964966CAE90FAD7406A8A89B1E48C885BFE2DB41C1996F20DC9A8DFCBA1A6F2F307EF8FBA5EEAE9631C2D6328D90F17679DD9E8E9660D6BD4C8A1D79C47A5FD46BD2ACCACA2D5C6407B0F7F31D093CEEF0342C67DDE3F1BA5067ED1500DC45161B8636255924BF007C4C870990C5DCE098C5A26386AD84D0F0CE4860349A147A4E7AB80151FA63882590B91C6AD3E70A68E6FEC1A2CF65881A6DC38048FC14DE71C702C934C5D3C4CF4C474F906C3400364BC400A7DA087F94F1ACCB68439A9A6FFA8C6439B2CC5C0B17A7D649033798429F211D9DE12B24D117583E1C425C2C0348C625CC44E9B976D319E72D4E09D5D6F36EE243F5FBCB190E84DE56EB680DEC8566F5A2C7D5F595116C628CA09401D561BD78356C634419225FB01CB637C46A627F6026D39EC1C62E9A3E85FAE + +count = 84 +seed = 483A81716F91A43ACA6764C4BD2A57C9156B762E9174EA49730A6BEB9CB19A0B3755E37BA47EC524BBE2FA25B9FEF687 +mlen = 2805 +msg = A7E941D3C14E2DDB4F971C9955868ACA753A73E8EC6845ED6E9D3B444C826480F03AC771F92E94380BCA7E50303FB79CBA608E351A1A67BF217B9816E2AF9F89BE8A79F661470CA16BFB2C99EFDE97859AD1D217848289EAF543005F5C231599FF74299EC2A7C737FF94B7465DE11F80E17D4FDA264DE568D8767CE822B3AB9642D95BC89533CE05FB331B86E3C5A296E4EA4C637EA458BCED1F89355C0270D083D4920E72112CA1ED486191748B4F730ED52F9803D05A0F2F065BE03B2603D6CDB154DD7765847D656B919B08969E41B23F9D376135BD5D924529410392ACEB004849550E6CF2903181C9A395FD469B7DE2C5060ED22922AA4D7C782A33330714A0AF206B29B4FCBE0F12C18948F6634FFD7F2710138020E273CB0DFA735BDCDE9BD6CEC898C5E564EC71AA7880D97CC711412F28603DE293CD5E904E9156D4F6BFE2BE15347B9FF7848EB51CD0785D6A649EA3514E02695C7E3C4F021A9992D67BEA1D68E5B17DB2E0DC061CCB5ABABA49D110055467F9DEE61ABA8F3E5C713E94A8A96C3A8AFB698887C1FA4ABC5157CED33A834DBF0F5AF9EECBB5F2AD7B63B4C2CA94A117C2B92F3D51900926E26B101FBE6207AB0884CBFCB15F9F98F95B0D08E29390977F4D3DC710EEA3AE7433D5EA87A5F710F1FCEAB26D516FC19FD272F6B0F01EE167F06E6C33273481F280CA64FDA0549C8DB884FDD467B93998360766D4CAC4C8DE783752FB6C6D7B1E47DF23CEECA572F2AD3E2B628E31984B9054448ED1D90658BC658A9CAEC0485512CE084A535E7C8196B8BBCA5D26C105C41E083F8D56F1530A8C1B36A7F3E41FCCBAC7F342B2D026064B304444192D4873FC57978E44151896EA6C0F13D017F683B203BA1DE677ED00F2B737C4C69E53ECF16AB918939E120E9FE14B2243EFF0116B24C6654BE09C582F1E62E75EFD8593E62E45AC36F717815B854B47A4DDCFC91FC533FA85BCECB6E560CF11E46D2F334B396D68B275E7404A70F2A805A64CD458A8E5F114A89124BA1866F917749FF32E59EE71948BD97F2D4128BEAB8BB0B6B06D84C6D466BFA30FD8100E48D951D0B3E787EF9611A56FFD64D970DBACFB1B4DF064B1CB5DA9918F5C58A10F0903B64286B1C1AE5CBD00EB8B363BDD7A7AAF2111C0C6E86E15ABF6C1E761FBF027425968CDC19522B44FF3F56335C59760FAE6D9028E76B284330F7510F2B55B6F46ADF90311CC785D35C2BB49272BE514CFBBD7A2B7B2E8C0B6DC28CB683D3D581F547F83BBD3B8C7B76925E44E6DA89D5EEF17AB0BF4213EF9C05B7B473901D483C647F416B98478C7100919C28515B617A27321841BAA174C1A2D3494395294CEBD48EEA14BC3106CA9C69D9F6485D6ABF1C2B1111A8BC602454685CA61AB4EE4DB9F413CAF8F0F204F04D40CD36FA5DAB629CB53876DB3E16372E626B6BC892C63C6B6C503C9D22EFE113927395206BDAA4B83D4FEF4FEB42FA7A71F7CE2197FE282A02D0FE50F96B1F917A67E50EB79CD3FFEF064542F7BEB51AB05B56AFD7AEA5F4164CC9BA37D8FDB35A3DEACF0CFB555161E7E41EB798160798BE9D01E3DE0C4288E0BAB19AE398E94353ADBE9A43524ACE35830B82FCFD4B1DC2800CA4C38A56B7CD28BC3E2F69A0AC4655CD79B5789A2B72EAF93B018D4D6F4C983D08932B22C85AF6FB07DF0A786D98820E1B06BC17F62D6E39739790A13049252F1B9102DC692CEB20C270FFE9B902AB7EC5A4EAAF47F7E2D31B2195F5F48AD18D099C33384141DA14E151BA57F6B1BB97901457202CDB83B5C713BD8A13F6E3E276C7D6C130AE287CA8931D9EECE06AB7CCA124D6D02D497D55EA9151A95E8A4DCCDA72D3F51A7DB3F2879918753683B01BA1B154DA83E6D84DDC9492F2DD8C128A30C75174ED1A6B8D93D08645270BDE247782E882418EA158B2A2153B2D8F75C09932F324EC199D26E9F3C4C4CECD807367E3981E137858B98BD1268D2C894541EC99BBBAD19A6856EA16A1E56B7B193BAF79AB89D4E76327405658C4ECB5A8626302B3A4618AEAC7E11A1199C4BB08C60AD78FEA4827B59CC883B2CA7038D7845106DE9174B2B8C17267273D23418AF560265000543ED9886884912B4160FBD372FCDF706EF642CF1829493884B6CFE946ECF6140106DCBE11B3746E33FBD4B5852B732230B9047004F4FAFA0D4BD7043C7D6595ACCD1B2771AAA76FE05A0C80B7B221DBEF79950FC69147816CAD0E52C05E72CECCF55FB4DABD81ECDB476417DBFDAF3B555CC90573CBED9474266C89FC55FF0BCC55602A51A1B5F91E425A1A58DCD4ABD09BBC63933FB4279B9E21298F9FE0CF1A93C4A19695240E8978D604047ABC7239F5053EA650D781307C50DEC4D5E2360ADEB9AA02C0F6FEC5784784A271169CE456E1C32BF984C3323656CCC588C97E0ECE5A40FC7B4DDBDDDB764EDC512DE63270F07891BD160F78B8ECD3A4D11EC4C68EA0A0FBD0F23AF9AB261A110F431F926C4995B05462E0DABF29D9660ABBC660C9A675628270CEA7EC5AE9B6F298B17B2392263700B8EAD9C845AD29CCF109A2ED66ED5BAF9C935754AAA1B84BE2B5339F9BF3CF5E80AF16967863FA8DCA64F5FE873DA4A6D33E39A592749B721FEC203C0CAC527CA96DE7A96CE9A540F5DA1902C97F960A05EBF0C32934F9B81244C945A60FD3F176DD8C261690D8EC98D19607129A50EDD51135FFBAEBC04A0961ACC5A32FD058FFDF2C6866BF90A3E177787E7061BD2011EC08EC118EF0451CAD010B53C68D0BDDC701D10920D697EA3439B1A0F96E6256B7712F59C746D1C74C20B17D461C3DF635EEC83E3B8E098034F119B9D9A79ADA735158EAC3F434E805444D5EA2EC85CC8ED8F5BCCAB7DBB6ECFC2E385781579AF1263D9FD32BEE32E01DB94703B5C756B894DEF19783B12BCE2A1A8D29D96F329CB0791D697BE7E0F05DD5C9DADA52E1B8C1E5F75A0FC90ED8C05BDFF86644B1EE61989CAAA271061D4222818C894AE9ECA2DA7326E5C24CA1EEEBE3720D2127BA997B0C572AE30615F8BC4278057F4762D46A39B934DDB2A0903FE1568C1BCC6C37E1F7C145EB7CB20A6A4B3466A7ABA58B48BE94F7E14CD20C87B2768358D06E3F607FE5E9DD1AAA8477975660F1E379B9EA26CC00CEA8CFD6420F2FDC7EE6393AA17CEF88645B821F8F42FC7DD97B0E16C04631F86ECF1CB76A6502FD1C13917CEB26A83596B117D5336387DDBEA56162E8A5BF2FA35E697245BC7210CEC13BFA694AE884582924168BF8EE2F61A734E37876F363225E5AE19B7C65CA6AFC31C8B37BCCB308A9C27F3E9902DE365E288E6CC46E329E78BE914B85EB980C0BAD932C164671ED395D5D8317C133E2E000A10E0D20D0F408019B33D9A87ED7725EA4C5ABAD67E0CAFBFF31DD236E59DEFAB7FF2CB40F479B56B261A32656F016DECA5302A336CA15D10E0AFCD168A4B922B79C11CB21881220374492D64DF21453B41346A85174A0A4A3C1E973845C856CA70D6D25BB854D0C6BD3C75CD73998C7F64E35A58DCF593C85C2440A6ABA4E470F87E6F9B4ABE127B30F8992D8AAD0BE38F008D9D937582EB3AAFC68F516D5AAF2503ACC96E59A151D2D4B072AB6B38C54928D6656441C709F1C1B770CE6EFCECE11F8B3602EAB63E0C629BBD8A79A96BE4CDB072780F3D287B091FC94FF2C0D347FE280BBAC308644BDB15A3C653863EDD945AF0AE725507507B82C283DC9909CCACBCF357D7A19703401B6E4474B94A6CBAE575B942501A281B8166FDC70E6B4B60C2F57A4D66FE1197D301D0E0C7BEC12CEDF9496BCA2183D04632711A79C8374B6DE35C2EECB0239391C2019C720894BC7A635DF18FCEEB9AAE16B3CE92717E2C56903D20D0712EF80131B8C48635163E97EFB1FABD1500D061C93AD935BE9A65A45A92E4A4E885268E712EFBE5337214701BAAD4C73E81E73BFF19AF131F0ABA105BAABE849F +pk = AAA590C66A7DE94C5E03B201795BF22B9BA65C636630FE9014C7005F6760A0EBF68452677A64898B8393FD827D3B341A64ABD9F05F0D0324CCA632553B217701D94A869B5C1D87ECF06A7A96F6155451B02F568364F039E357C4FF5C8AAFCE9CC2DFA6218201401BC5CCD0AD8641A034093FA2C91DE17B51698C5C08CC216B0006 +sk = AAA590C66A7DE94C5E03B201795BF22B9BA65C636630FE9014C7005F6760A0EBF68452677A64898B8393FD827D3B341A64ABD9F05F0D0324CCA632553B217701D94A869B5C1D87ECF06A7A96F6155451B02F568364F039E357C4FF5C8AAFCE9CC2DFA6218201401BC5CCD0AD8641A034093FA2C91DE17B51698C5C08CC216B000609FD0153BEC1A8431125AF0EEFC437178BFB257A7E6A6A706DE0D37F864377E2AC00000000000000000000000000000000000000000000000000000000000000349D7B6D18CB0C448724526DE74DB65E845BE7FFBBEA80B1640D04B77521519CD8FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD304279FD3D267DF4A4178D7C5B3387B4845447ADE61C0B90B7A131683F44DD6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022B3349A9614071C4DF7BDF0112F9B31B9FC54BD3DA4804BEE7A38EB1DFC17128BF487E922E4EDA2027D804F2F5171682D6D2C72EBDBFEB835D9921FA62A0D4BC857AB339FE6B7E6BADF6B283634D48795E35E276AE53DB1F51A80D6FB606DBAE842F261BC87544B43C2D086B13AAF01BAB8B3FDAA5247C0161C4EADA30571D5F0143E69D205023B86A1EDB612BBF9F19BC559A1586B6EA5E05FFED25305B0CE12E0E86023EB67D18D2D9D67167FAA1E871A63C84FA65BEA01AC8764069997018F8EA4022FD1DF186735F2D833C60DBEBEA4580C271492FFD541513AB2E4497DBF4E57ED9CF2108186A603FEEB2B911C836D125B48643C625C06B005 +smlen = 3097 +sm = 3AD36A6E22AF730526A36EF97A08E28D4B160A5E56B848288857E2DEA42FECB1FDB92490449661C76576A7AB43F4FF47059B292A9758E82E07CABB44B91F8800BC09536075C905F0D6FA58FA5AD8485F1E57677AA0EF6D598889E7BC06427D8918AB9F68A83B5FC1FEDBB23B7223D6F1C6F9C7F9E66377E976F694ACB5FA030000046912DCC5918F6BA14A91D19E58E09E757BE2C81C44D8B4D00E9C301413CFDE3D697B7C85C4F455BA280A28EED059CB836108A4286A791F75B528FA9952733826B85704E0BFA9C8B5533F155FD3A50C07DB9F9F7111A31E6B790CA69665D76242E8D90983D37666CE6893BCCFEFD0A7BEAA696CB3B54FEE1CC94D96A3FB7EFA4E6DBD71DD6156D7414B3965CFB6A488CB905D134E041506BCB0B859407DE434000909A7E941D3C14E2DDB4F971C9955868ACA753A73E8EC6845ED6E9D3B444C826480F03AC771F92E94380BCA7E50303FB79CBA608E351A1A67BF217B9816E2AF9F89BE8A79F661470CA16BFB2C99EFDE97859AD1D217848289EAF543005F5C231599FF74299EC2A7C737FF94B7465DE11F80E17D4FDA264DE568D8767CE822B3AB9642D95BC89533CE05FB331B86E3C5A296E4EA4C637EA458BCED1F89355C0270D083D4920E72112CA1ED486191748B4F730ED52F9803D05A0F2F065BE03B2603D6CDB154DD7765847D656B919B08969E41B23F9D376135BD5D924529410392ACEB004849550E6CF2903181C9A395FD469B7DE2C5060ED22922AA4D7C782A33330714A0AF206B29B4FCBE0F12C18948F6634FFD7F2710138020E273CB0DFA735BDCDE9BD6CEC898C5E564EC71AA7880D97CC711412F28603DE293CD5E904E9156D4F6BFE2BE15347B9FF7848EB51CD0785D6A649EA3514E02695C7E3C4F021A9992D67BEA1D68E5B17DB2E0DC061CCB5ABABA49D110055467F9DEE61ABA8F3E5C713E94A8A96C3A8AFB698887C1FA4ABC5157CED33A834DBF0F5AF9EECBB5F2AD7B63B4C2CA94A117C2B92F3D51900926E26B101FBE6207AB0884CBFCB15F9F98F95B0D08E29390977F4D3DC710EEA3AE7433D5EA87A5F710F1FCEAB26D516FC19FD272F6B0F01EE167F06E6C33273481F280CA64FDA0549C8DB884FDD467B93998360766D4CAC4C8DE783752FB6C6D7B1E47DF23CEECA572F2AD3E2B628E31984B9054448ED1D90658BC658A9CAEC0485512CE084A535E7C8196B8BBCA5D26C105C41E083F8D56F1530A8C1B36A7F3E41FCCBAC7F342B2D026064B304444192D4873FC57978E44151896EA6C0F13D017F683B203BA1DE677ED00F2B737C4C69E53ECF16AB918939E120E9FE14B2243EFF0116B24C6654BE09C582F1E62E75EFD8593E62E45AC36F717815B854B47A4DDCFC91FC533FA85BCECB6E560CF11E46D2F334B396D68B275E7404A70F2A805A64CD458A8E5F114A89124BA1866F917749FF32E59EE71948BD97F2D4128BEAB8BB0B6B06D84C6D466BFA30FD8100E48D951D0B3E787EF9611A56FFD64D970DBACFB1B4DF064B1CB5DA9918F5C58A10F0903B64286B1C1AE5CBD00EB8B363BDD7A7AAF2111C0C6E86E15ABF6C1E761FBF027425968CDC19522B44FF3F56335C59760FAE6D9028E76B284330F7510F2B55B6F46ADF90311CC785D35C2BB49272BE514CFBBD7A2B7B2E8C0B6DC28CB683D3D581F547F83BBD3B8C7B76925E44E6DA89D5EEF17AB0BF4213EF9C05B7B473901D483C647F416B98478C7100919C28515B617A27321841BAA174C1A2D3494395294CEBD48EEA14BC3106CA9C69D9F6485D6ABF1C2B1111A8BC602454685CA61AB4EE4DB9F413CAF8F0F204F04D40CD36FA5DAB629CB53876DB3E16372E626B6BC892C63C6B6C503C9D22EFE113927395206BDAA4B83D4FEF4FEB42FA7A71F7CE2197FE282A02D0FE50F96B1F917A67E50EB79CD3FFEF064542F7BEB51AB05B56AFD7AEA5F4164CC9BA37D8FDB35A3DEACF0CFB555161E7E41EB798160798BE9D01E3DE0C4288E0BAB19AE398E94353ADBE9A43524ACE35830B82FCFD4B1DC2800CA4C38A56B7CD28BC3E2F69A0AC4655CD79B5789A2B72EAF93B018D4D6F4C983D08932B22C85AF6FB07DF0A786D98820E1B06BC17F62D6E39739790A13049252F1B9102DC692CEB20C270FFE9B902AB7EC5A4EAAF47F7E2D31B2195F5F48AD18D099C33384141DA14E151BA57F6B1BB97901457202CDB83B5C713BD8A13F6E3E276C7D6C130AE287CA8931D9EECE06AB7CCA124D6D02D497D55EA9151A95E8A4DCCDA72D3F51A7DB3F2879918753683B01BA1B154DA83E6D84DDC9492F2DD8C128A30C75174ED1A6B8D93D08645270BDE247782E882418EA158B2A2153B2D8F75C09932F324EC199D26E9F3C4C4CECD807367E3981E137858B98BD1268D2C894541EC99BBBAD19A6856EA16A1E56B7B193BAF79AB89D4E76327405658C4ECB5A8626302B3A4618AEAC7E11A1199C4BB08C60AD78FEA4827B59CC883B2CA7038D7845106DE9174B2B8C17267273D23418AF560265000543ED9886884912B4160FBD372FCDF706EF642CF1829493884B6CFE946ECF6140106DCBE11B3746E33FBD4B5852B732230B9047004F4FAFA0D4BD7043C7D6595ACCD1B2771AAA76FE05A0C80B7B221DBEF79950FC69147816CAD0E52C05E72CECCF55FB4DABD81ECDB476417DBFDAF3B555CC90573CBED9474266C89FC55FF0BCC55602A51A1B5F91E425A1A58DCD4ABD09BBC63933FB4279B9E21298F9FE0CF1A93C4A19695240E8978D604047ABC7239F5053EA650D781307C50DEC4D5E2360ADEB9AA02C0F6FEC5784784A271169CE456E1C32BF984C3323656CCC588C97E0ECE5A40FC7B4DDBDDDB764EDC512DE63270F07891BD160F78B8ECD3A4D11EC4C68EA0A0FBD0F23AF9AB261A110F431F926C4995B05462E0DABF29D9660ABBC660C9A675628270CEA7EC5AE9B6F298B17B2392263700B8EAD9C845AD29CCF109A2ED66ED5BAF9C935754AAA1B84BE2B5339F9BF3CF5E80AF16967863FA8DCA64F5FE873DA4A6D33E39A592749B721FEC203C0CAC527CA96DE7A96CE9A540F5DA1902C97F960A05EBF0C32934F9B81244C945A60FD3F176DD8C261690D8EC98D19607129A50EDD51135FFBAEBC04A0961ACC5A32FD058FFDF2C6866BF90A3E177787E7061BD2011EC08EC118EF0451CAD010B53C68D0BDDC701D10920D697EA3439B1A0F96E6256B7712F59C746D1C74C20B17D461C3DF635EEC83E3B8E098034F119B9D9A79ADA735158EAC3F434E805444D5EA2EC85CC8ED8F5BCCAB7DBB6ECFC2E385781579AF1263D9FD32BEE32E01DB94703B5C756B894DEF19783B12BCE2A1A8D29D96F329CB0791D697BE7E0F05DD5C9DADA52E1B8C1E5F75A0FC90ED8C05BDFF86644B1EE61989CAAA271061D4222818C894AE9ECA2DA7326E5C24CA1EEEBE3720D2127BA997B0C572AE30615F8BC4278057F4762D46A39B934DDB2A0903FE1568C1BCC6C37E1F7C145EB7CB20A6A4B3466A7ABA58B48BE94F7E14CD20C87B2768358D06E3F607FE5E9DD1AAA8477975660F1E379B9EA26CC00CEA8CFD6420F2FDC7EE6393AA17CEF88645B821F8F42FC7DD97B0E16C04631F86ECF1CB76A6502FD1C13917CEB26A83596B117D5336387DDBEA56162E8A5BF2FA35E697245BC7210CEC13BFA694AE884582924168BF8EE2F61A734E37876F363225E5AE19B7C65CA6AFC31C8B37BCCB308A9C27F3E9902DE365E288E6CC46E329E78BE914B85EB980C0BAD932C164671ED395D5D8317C133E2E000A10E0D20D0F408019B33D9A87ED7725EA4C5ABAD67E0CAFBFF31DD236E59DEFAB7FF2CB40F479B56B261A32656F016DECA5302A336CA15D10E0AFCD168A4B922B79C11CB21881220374492D64DF21453B41346A85174A0A4A3C1E973845C856CA70D6D25BB854D0C6BD3C75CD73998C7F64E35A58DCF593C85C2440A6ABA4E470F87E6F9B4ABE127B30F8992D8AAD0BE38F008D9D937582EB3AAFC68F516D5AAF2503ACC96E59A151D2D4B072AB6B38C54928D6656441C709F1C1B770CE6EFCECE11F8B3602EAB63E0C629BBD8A79A96BE4CDB072780F3D287B091FC94FF2C0D347FE280BBAC308644BDB15A3C653863EDD945AF0AE725507507B82C283DC9909CCACBCF357D7A19703401B6E4474B94A6CBAE575B942501A281B8166FDC70E6B4B60C2F57A4D66FE1197D301D0E0C7BEC12CEDF9496BCA2183D04632711A79C8374B6DE35C2EECB0239391C2019C720894BC7A635DF18FCEEB9AAE16B3CE92717E2C56903D20D0712EF80131B8C48635163E97EFB1FABD1500D061C93AD935BE9A65A45A92E4A4E885268E712EFBE5337214701BAAD4C73E81E73BFF19AF131F0ABA105BAABE849F + +count = 85 +seed = 30F0E117513AAF27AB2516BCEADD1188B4BBDE76E57DFAF43CBF2D70723D941E8F875C5EBF02BD7D67AE81ABCC54440A +mlen = 2838 +msg = E43EEBE157E43D9F54130C668A153907D65BB19856A1B7C2FD5E2C770FD6BACB13BAEF951EB758485C128ECE4F3E9377A58A45EBA1C3A9CA5C94B50714088700D6FDA933ECE3A6989EE77A824A9E99674748A90B7F227B589250C9E156A8E50B74A7F49DE036FCED86CA0D4C02E217EEFCAEF7234F651CE4380B86389D7331C7657AC283F58C781F904405ACBB68661310EC6921C1FB7483E74116378086D4A0C9A52AF9847BB3CE0FE97F5A7C2CF588DB3B6FD725CA83391656CB38FCB6D79531E56F5D42FC0CC20D04AD7BBF57001BF2F8E6B335CC57CA2DB23C247EF9B75BBBA3159030975D65B9AA7C10E0FA4F615F77126D5271129D8839A3F8DA30C79174373C4BA643E4C4F0CB26BD5B8B9F7EA56DE459EDA15037D8772478FD9F7F7E06F3B422DF0B425DBF1E91D3893CE20F78CDF1910C5D4674EFADF122F41D6C7D6290DF59FA029BD82E792E758AD4388F9D352E9D2FBE3E58810C380D1CC5768865D24BDD92145DBD1EE0D4724C769EF5CEE12DB2AE2708B4C8C7865E70CA31386388D991D46C4DC4DAFC5CE66CB24D455BEE01488A7C764A308C7054572FCA0CC74A01A2B1F191C54146FB1AAF55B834F998B50909F3D003271E6504985DC836B5C44655B938769639799F2575BCFA92F13D32B283A5BDA11177CE1F66D6B30788415BEF598773E87B4C8C41F0CE6633B6C945A3B4C46B74F30945EFD99CF3709FDAFAEB4BD4C6BF605F89C7A9B4EEA1A6599F0A32CE3F2C58587EA8BB3FE6495D92F2FEEC52BEA3DE2047F5EEA7EA1453C762201FF1291AFA87923107F7FF586E00D07824EE021649ABD2D6E9EF11A1D31726EA9277134341EC57D790949590A963D25D6FADFA9CA21E43ACB7E5ED4CB6E8BB36377C2618997943CD100A927D395376871ACB9619BDE9B1FFD5E48E271952613875FA3ACD3E1F2E872F1D672AAE6E2A575A4FDC4FAE2DC6A7196E7EBA94AE5B49BE41E7295433ADF49A6D2D945F43699D444A726423CD9164B9E28B0AA4485B0C767A9398DF5DC5F23D27889C14B1ABE98880E7BD5DF9AB3D1321D5493A0A8B91EA4827627A9B59308CB0104CD8DA7D9DEF2D47B27074BA007401415E900DF03F251C8AA425F0FA59D74C41BA7A9288C8E280141CAAF6C6932DDC4184F81F5C33F0FDA005BF3FB6A0A9169A709875AE475302D57CE96D3DB332188202597FF29D1F9EBAD2B0FFA27C14CE9CCA58C923283BA10E9FA1689D6C2B8804225D706E09FF97AE9CEDC27D256E8736DAA54382040648F2F6BFBECD6C3A9BFAF5D1ED23EAD00EAB351F1E0BB4C719AE6A1F5D12E7F09ECEA62A2F554B18397FE1400DA1EB6694635D7C9C626E0FC82CF8DF6AA4CA88B69F78CD065C53F929BAA58507FD3E3D8124C4BF287D452AF47AF9F4D926DFDB529A8ABB8BB57C5C7611A97053A0CB0B01C754CB479C6CD3A3E867BAC33E45EA0BB6BF77E0B2EC2F136DAC0E259FA309FB5F6D8E7005E1696CE203C5D054E5927A87A1B4E81E73F22FAFE61D7D64CBFBE519D39E716BDCBB37657E71B9390FF04B3C01C6F6842684115CD7F5AAC208EEA48906890248E58D1615634CC1263CD3ADC14B67F1A1A8ED2626E7237AF5488F5D269973F11458E3E4FC2EE35A4BF49C2F5F2361939FA243FA8F33B54EEEBA9B0453701E367A7BF4D698C62DA64732652C68C20A956522826F8E29A764BA93DBC98FCC87E59A1423886694057E131333C5DCDFF3BE7A1F0D344A2DEBB90051721E0226178DEED353A136F69481F83651BE3281C562D6127914CD24C38FFB327786086B08EBE89D03A33BF7B5DCCF90DE9C4D907D308E08A616C5343C116A098786383009DC70787AAFB4529CD27CF85F946B8B238AD2F00DF109FC84CDB48BB52B73E1DE066636176E8C6C76216105486C553511DF1F0664EC1E04EE0B0BD74A08070207486B7F326C3EE73188AB5BB7F8F5643093916491D62F0DB18675BA4CE90B2AB310BBA4705B65A581FBC5E76842A99D4926AE5BF7B8EABCE5FA30CB98C1BCF0E0708DA970096234D47BFE23A4F9ADE29BE5A8B6BBB748EA1C13D00388AC90B65EE10BE6A9AC422EBDDAF5482422AECE19E702F6D26ED954D4E489CC48B2E39A6F168E98E11C1DFCB4A843354F1AFD447962E5090CCF51DDF6643CE0AFAFCF3E4363187E69C31AB796132EEB04F2D4976A576B9BC8D9B1D491B74613C1AF32E3D2DEF408ABEBCC27E4A915C983E10B6090FB2DE6FF9E60C96CF4F940B09AEC048E7A174711798FD76DB15DCAE0E570BE3AC147E2F8777A522555B0898BCD7B04ABBF060FA72B04604C9A583FEFD02B2AF9FA035F97DE4DAA4EE777F9D6985149DB6C2F0A33EE1A1436B38DFDFF87F831E83399C6A884273E612433EE3958F37C99A748DF151E3EA011F4DF5F0050597685E0230DA1B1C7095E1203EA7099BA5C43E58AB0EDA60AF65291C3CC9A07257D71CA6C9EAB93CEF41294853A67A5B11F9192C96A36C701F142DC36B046218BEBAD9904FB765550598F8E2F49F5F0AD2608117196751E7E4C5CC4C3EF425A921C1EE15F37A1F80DF1E24163CA145EDB0FC4D988B8C7167ACF9CD94F919AC96E5469859FDAEC54E1970007EB9699342A9AA044A8EE478A3ECF8B59B0109EA7640C218ECC1E8CBC5E2FB61A1748B7C038EFDADC2D096BC29D95B1BE770D097AFD8B0FE02173A1B3D7110F80D6C849F1AFD1B01A60894B16140F9B34D96071A753545159C4FFA4DBAA938BDEC287C6B83751C5E699724AB355D1FA0E081DB286EC83343877C520E856C4ADC65322AEB39CD87B7D8E4FF9222E085ED84C58B7FF513AD77F8A9EFF2760A03F69AE5DD14DD92DD3F2D3D98E97B1987086B3EEF2F2E822C851B7ADD83903786C050F30C4A4F4BA9361E49ACAD503E2A07EA119752E12D4FA09DC83F7A48EE3DCC1F09475960B6839CA736E498A128F78E58279063D839ABA88AC9E5BC24BC07BBD2DE1CF2E1CCC5987E63F83780D0ECF07EAE21C8C752529735B37C980EB320DC949468C69B17DA8AD612825A84D0529EB97FF8C4CD225FDFD1563BB6C5360ABDCB3339434A298DDCF5F36188F3AB501E505828E8D2FD6DDA062AD415C56414FD7557170F0F57BC5A401FA648699F3C7F7FD8F1F058849B817FADDDC24726DF851D3644414F55CADE30A5764914675D574EAD4D4DB8725866A6C51BF0EB23B12FBA1E101A6F3BDB98A2884D0F2B8DEB3F279E9C38EBD0209DD05C0FCC6EA715257355D0D6BE2C8BC7835187CDAEA43A8EF9C59E88AF6AA667A697A3DF8BDE250EAF4341A835B5EF93CFF97656133B49E13213949A3F368D985E0D6C793319F4284DFADA383137DC5B000B7FDD85F27865DC633562949BBE4FBFF75417AB109F03015BD0F67728969435EFAE791AC72C6AEF99A385A3E8B4C35F58380149C653FD78391A7C3B26A3550D37F9639164979288BEEE99E36AC6F44D0FCBAF0D210839D563A6249059A30CE6F047F5D541FC8A90A18610A8BEFB9493C5AC804D34D40881CA82E673788870705BCD585044B11F1D9BBD6B17D8B82B7CCC0554D1E3AA7F2762FE01385571C9FA7A103D07C1A209504876189DE4B3C5910C26C5F33EA725A7D57CC30A6EC8F3EECF2409F1234A094556C0F7941CFB30FE86F208FEB73C8E8EA8623640AFBDB1CC589768A714CF945731DEBF4519B70870FB3A50F1FB368ADA3FB217704A5D46D879CEFF9BB72667ACC673CB196AFAA0DB1160CC2CD7B260DEB791A94D0988ED54B7E45F33E7CDBA0FA105F3AF3CB1521EA382B1266DF304C900BF53E195CED03871A22C50DA166BB9441CEC83607083195D6CFA17297B678ABB5E03950160130B47E25713B0829F64D2552EFCF404F65798A86D5899B72150A91BA00F7DFBFFE82531497B60C31C28992377A2DFD5FAC8A9C16C835CE4DC24D0389277E6355C655C8A33C89BD48F55C13EDE24B9BB348DEC89612F0905719743C95C0E8B5653855676CE171F812ECA405B6F96F2212D1A5369A11379282AC0C5AC41D +pk = 9CBFD2A145FCA5968BB33C171794A2074B637E751FABD95D469D7D259C3A89390C24D6FDFB8982B8F8CF0B59A2E71B1B42A41C4457647A8CBBDD6BF297EBC500048B2C80D1D1D9F4DF27E510810477A0838F90F331DF36171297DCD5DF665DDBF34D20E63D20AE18F9C2D2255ECBB11D7AFBC4BA4BCAF1D6C67C8AB26986190109 +sk = 9CBFD2A145FCA5968BB33C171794A2074B637E751FABD95D469D7D259C3A89390C24D6FDFB8982B8F8CF0B59A2E71B1B42A41C4457647A8CBBDD6BF297EBC500048B2C80D1D1D9F4DF27E510810477A0838F90F331DF36171297DCD5DF665DDBF34D20E63D20AE18F9C2D2255ECBB11D7AFBC4BA4BCAF1D6C67C8AB26986190109C9DB83D4035D1E9AFB698F4FC4F1EB1C3071C4AF4919DB0823BCA513A46216A5F200000000000000000000000000000000000000000000000000000000000000F099A6F0135E4A82C7560D270F026935665493E82ED7B06E95B6A67137CCEED544FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6FFAAB7836C20E254FA17BFAFCD39DA7ACA12664768FBC4342275C29EE6761A285FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092CF9D6C0F49046063F1C1AD92D8B54EE2E1D7961351F9E44B7FDF59CDCD8B3E994B850D390AA87FCFE6E2F2890A440B693F78AA8F3412C3C66C8BD6D8A301090B9514B87B2485EAE21219D0722B679F647AC5AAB253371D841AEC13D15BE812780B106A0D746A43CB0267B3A0853DE90581AA891EBA67DC536D9E0F690C830D22D0D8BE5493CF0E34E0CD9CD3310FFA0C58346092089F7E3DEFC0829CBCD1B3FAA1468B83BC326FCB5C2E0744E8D33188309824D5F029228575787001D31E6C3F105DC029F471B477CCBC86A1167869223D3586093E5AB24593B007C72667B1E7B8D3661704B1772EA4CE9B79D7195F257AE92FF0DA635F7CB08E06 +smlen = 3130 +sm = B1A1C2277531C35C7EEEDB647C7A20199AF8B47BFF0DAAF6D878C7A3F7C1F85A4253D754B8043626AE0987999A688D64CFC7C42BB3B2239BFD3E988B32F31100DF139631CEDAD6886916832051C2D64231DD9152EC4B0CC5BCB127EE656CE539B2EB5F73CE85D1E0B94147CB9FA5853DDC697E1E74E32174AF144A61BEB8AC0100000A80D6BD0CAD2B1611982BB3A27B3B53FA748DD8499D032FE4740CA9073F6C3D1515F9A4F5DE1E9E21B9F73367934B31D74A06EB6D1B53318EA2FEF42411F73A6D37C4A598DF5D9C15ACB32804A0B246A401003502B1DCB9F3034C28DF3A1F72BAACBB3C567450854DDB2B00130417A7DC92EE37EB196096E68E67046D040670A9C48BD44F5BFEE914BB673476F3047873F8AA409F5A87FC62A938683EC768000B09E43EEBE157E43D9F54130C668A153907D65BB19856A1B7C2FD5E2C770FD6BACB13BAEF951EB758485C128ECE4F3E9377A58A45EBA1C3A9CA5C94B50714088700D6FDA933ECE3A6989EE77A824A9E99674748A90B7F227B589250C9E156A8E50B74A7F49DE036FCED86CA0D4C02E217EEFCAEF7234F651CE4380B86389D7331C7657AC283F58C781F904405ACBB68661310EC6921C1FB7483E74116378086D4A0C9A52AF9847BB3CE0FE97F5A7C2CF588DB3B6FD725CA83391656CB38FCB6D79531E56F5D42FC0CC20D04AD7BBF57001BF2F8E6B335CC57CA2DB23C247EF9B75BBBA3159030975D65B9AA7C10E0FA4F615F77126D5271129D8839A3F8DA30C79174373C4BA643E4C4F0CB26BD5B8B9F7EA56DE459EDA15037D8772478FD9F7F7E06F3B422DF0B425DBF1E91D3893CE20F78CDF1910C5D4674EFADF122F41D6C7D6290DF59FA029BD82E792E758AD4388F9D352E9D2FBE3E58810C380D1CC5768865D24BDD92145DBD1EE0D4724C769EF5CEE12DB2AE2708B4C8C7865E70CA31386388D991D46C4DC4DAFC5CE66CB24D455BEE01488A7C764A308C7054572FCA0CC74A01A2B1F191C54146FB1AAF55B834F998B50909F3D003271E6504985DC836B5C44655B938769639799F2575BCFA92F13D32B283A5BDA11177CE1F66D6B30788415BEF598773E87B4C8C41F0CE6633B6C945A3B4C46B74F30945EFD99CF3709FDAFAEB4BD4C6BF605F89C7A9B4EEA1A6599F0A32CE3F2C58587EA8BB3FE6495D92F2FEEC52BEA3DE2047F5EEA7EA1453C762201FF1291AFA87923107F7FF586E00D07824EE021649ABD2D6E9EF11A1D31726EA9277134341EC57D790949590A963D25D6FADFA9CA21E43ACB7E5ED4CB6E8BB36377C2618997943CD100A927D395376871ACB9619BDE9B1FFD5E48E271952613875FA3ACD3E1F2E872F1D672AAE6E2A575A4FDC4FAE2DC6A7196E7EBA94AE5B49BE41E7295433ADF49A6D2D945F43699D444A726423CD9164B9E28B0AA4485B0C767A9398DF5DC5F23D27889C14B1ABE98880E7BD5DF9AB3D1321D5493A0A8B91EA4827627A9B59308CB0104CD8DA7D9DEF2D47B27074BA007401415E900DF03F251C8AA425F0FA59D74C41BA7A9288C8E280141CAAF6C6932DDC4184F81F5C33F0FDA005BF3FB6A0A9169A709875AE475302D57CE96D3DB332188202597FF29D1F9EBAD2B0FFA27C14CE9CCA58C923283BA10E9FA1689D6C2B8804225D706E09FF97AE9CEDC27D256E8736DAA54382040648F2F6BFBECD6C3A9BFAF5D1ED23EAD00EAB351F1E0BB4C719AE6A1F5D12E7F09ECEA62A2F554B18397FE1400DA1EB6694635D7C9C626E0FC82CF8DF6AA4CA88B69F78CD065C53F929BAA58507FD3E3D8124C4BF287D452AF47AF9F4D926DFDB529A8ABB8BB57C5C7611A97053A0CB0B01C754CB479C6CD3A3E867BAC33E45EA0BB6BF77E0B2EC2F136DAC0E259FA309FB5F6D8E7005E1696CE203C5D054E5927A87A1B4E81E73F22FAFE61D7D64CBFBE519D39E716BDCBB37657E71B9390FF04B3C01C6F6842684115CD7F5AAC208EEA48906890248E58D1615634CC1263CD3ADC14B67F1A1A8ED2626E7237AF5488F5D269973F11458E3E4FC2EE35A4BF49C2F5F2361939FA243FA8F33B54EEEBA9B0453701E367A7BF4D698C62DA64732652C68C20A956522826F8E29A764BA93DBC98FCC87E59A1423886694057E131333C5DCDFF3BE7A1F0D344A2DEBB90051721E0226178DEED353A136F69481F83651BE3281C562D6127914CD24C38FFB327786086B08EBE89D03A33BF7B5DCCF90DE9C4D907D308E08A616C5343C116A098786383009DC70787AAFB4529CD27CF85F946B8B238AD2F00DF109FC84CDB48BB52B73E1DE066636176E8C6C76216105486C553511DF1F0664EC1E04EE0B0BD74A08070207486B7F326C3EE73188AB5BB7F8F5643093916491D62F0DB18675BA4CE90B2AB310BBA4705B65A581FBC5E76842A99D4926AE5BF7B8EABCE5FA30CB98C1BCF0E0708DA970096234D47BFE23A4F9ADE29BE5A8B6BBB748EA1C13D00388AC90B65EE10BE6A9AC422EBDDAF5482422AECE19E702F6D26ED954D4E489CC48B2E39A6F168E98E11C1DFCB4A843354F1AFD447962E5090CCF51DDF6643CE0AFAFCF3E4363187E69C31AB796132EEB04F2D4976A576B9BC8D9B1D491B74613C1AF32E3D2DEF408ABEBCC27E4A915C983E10B6090FB2DE6FF9E60C96CF4F940B09AEC048E7A174711798FD76DB15DCAE0E570BE3AC147E2F8777A522555B0898BCD7B04ABBF060FA72B04604C9A583FEFD02B2AF9FA035F97DE4DAA4EE777F9D6985149DB6C2F0A33EE1A1436B38DFDFF87F831E83399C6A884273E612433EE3958F37C99A748DF151E3EA011F4DF5F0050597685E0230DA1B1C7095E1203EA7099BA5C43E58AB0EDA60AF65291C3CC9A07257D71CA6C9EAB93CEF41294853A67A5B11F9192C96A36C701F142DC36B046218BEBAD9904FB765550598F8E2F49F5F0AD2608117196751E7E4C5CC4C3EF425A921C1EE15F37A1F80DF1E24163CA145EDB0FC4D988B8C7167ACF9CD94F919AC96E5469859FDAEC54E1970007EB9699342A9AA044A8EE478A3ECF8B59B0109EA7640C218ECC1E8CBC5E2FB61A1748B7C038EFDADC2D096BC29D95B1BE770D097AFD8B0FE02173A1B3D7110F80D6C849F1AFD1B01A60894B16140F9B34D96071A753545159C4FFA4DBAA938BDEC287C6B83751C5E699724AB355D1FA0E081DB286EC83343877C520E856C4ADC65322AEB39CD87B7D8E4FF9222E085ED84C58B7FF513AD77F8A9EFF2760A03F69AE5DD14DD92DD3F2D3D98E97B1987086B3EEF2F2E822C851B7ADD83903786C050F30C4A4F4BA9361E49ACAD503E2A07EA119752E12D4FA09DC83F7A48EE3DCC1F09475960B6839CA736E498A128F78E58279063D839ABA88AC9E5BC24BC07BBD2DE1CF2E1CCC5987E63F83780D0ECF07EAE21C8C752529735B37C980EB320DC949468C69B17DA8AD612825A84D0529EB97FF8C4CD225FDFD1563BB6C5360ABDCB3339434A298DDCF5F36188F3AB501E505828E8D2FD6DDA062AD415C56414FD7557170F0F57BC5A401FA648699F3C7F7FD8F1F058849B817FADDDC24726DF851D3644414F55CADE30A5764914675D574EAD4D4DB8725866A6C51BF0EB23B12FBA1E101A6F3BDB98A2884D0F2B8DEB3F279E9C38EBD0209DD05C0FCC6EA715257355D0D6BE2C8BC7835187CDAEA43A8EF9C59E88AF6AA667A697A3DF8BDE250EAF4341A835B5EF93CFF97656133B49E13213949A3F368D985E0D6C793319F4284DFADA383137DC5B000B7FDD85F27865DC633562949BBE4FBFF75417AB109F03015BD0F67728969435EFAE791AC72C6AEF99A385A3E8B4C35F58380149C653FD78391A7C3B26A3550D37F9639164979288BEEE99E36AC6F44D0FCBAF0D210839D563A6249059A30CE6F047F5D541FC8A90A18610A8BEFB9493C5AC804D34D40881CA82E673788870705BCD585044B11F1D9BBD6B17D8B82B7CCC0554D1E3AA7F2762FE01385571C9FA7A103D07C1A209504876189DE4B3C5910C26C5F33EA725A7D57CC30A6EC8F3EECF2409F1234A094556C0F7941CFB30FE86F208FEB73C8E8EA8623640AFBDB1CC589768A714CF945731DEBF4519B70870FB3A50F1FB368ADA3FB217704A5D46D879CEFF9BB72667ACC673CB196AFAA0DB1160CC2CD7B260DEB791A94D0988ED54B7E45F33E7CDBA0FA105F3AF3CB1521EA382B1266DF304C900BF53E195CED03871A22C50DA166BB9441CEC83607083195D6CFA17297B678ABB5E03950160130B47E25713B0829F64D2552EFCF404F65798A86D5899B72150A91BA00F7DFBFFE82531497B60C31C28992377A2DFD5FAC8A9C16C835CE4DC24D0389277E6355C655C8A33C89BD48F55C13EDE24B9BB348DEC89612F0905719743C95C0E8B5653855676CE171F812ECA405B6F96F2212D1A5369A11379282AC0C5AC41D + +count = 86 +seed = 070FFB907EE8AB7152A9D380DEA2C4C4796780FCFD80906C5E489B917A45D5E7EDFE6F37C4420E5480E8BB599FE36451 +mlen = 2871 +msg = C07185E0343DF2A4201649AD5DE4CFFA20BAF5DD43F5E4A6C81CD5143FE72865A7C036A2DFD617D96626995C12EFAD019FF44E0EDD7028F29E3657EE3C0D02E9CE83EF0A648FD7CF183A7BF7C15095E0F9278B14FDF6C983CDCF2987DD0CC085400906DCD0D14ABA60124F4B7494ADBBAE3A8D6052122575F99792F7240EB17864DC6D231721140E43F1110E73EB2E3C05049783B33AAC4E4CA0A248775BAF81FDB03D114508928BEC3169A810296B5A4DAC27E7C7F8D01CF5943CF4D8CF6EE6F9042BB300E50EEA3224D35C9628E38C368EC3B42393FC820371DB6557216A2C2D5A230FE3A7C6BCBDD89A2BE5CDBE7F783BA379B6A4237DB051E6256DCE14DCF641190A956E8E85EB2638736B899ED045636DDB7A351F5A4F4108D9D6E0413F92B9D392495299128A5F4ACCE8C7747C675EFE05ED7182DB51C515B345029440AB61A904D2A390122680C951ED4575515144C5CA80D6F14D1CFDBB5373B78E09D04D0544151CFA1240790CD31165048D1484DC4D11D05057071DB3433DF071B367E00FD38C386DAB689E4DFF6FB421B2A95FF54DC29375C9D1C18A76C79ACAE3D3F35D4CFC385199A4CCAF6C9F0421BCF58D296EC7E0D1B95A6C4BCBAC1271F94E438360A71A6440275591E41389B30CAF2626A865B9E59552CB198A1D4453EBA6D0F6FC491A8A7783B4A8BAEB81E54F9189CE493EFC1C5D830A4F637F2BF43CD86B91637611415C95685FE79966174312FDFBF33A646625F97521B5CB1F008135B824F1D6D8373006C7158E62B1F794AE34548A0C6DAC8B60C559D81580AC0D84034A501516EE36CB4082732918365A5AB787FACE591AB02BE6957AE4BB96B58E2B173DA019D3E0CABEBEBA0AF775779F14BFBA8F595697731522DF3C80CBDEC16F6ACC32659CF5DAF193178307887EF1BE1B48B5806D0FA9868A7FB853708B26873857786B974709C687D6597BCF6C7E476C1E47CAFDBF30B6311ED434C0F998C4065399C59073C1F2BAB1D46104E74EA6C976D416E58BDFD24CCD957CB431870DE5DA8763992EF68BB18075926B0E4E826095EB3B8CAE086FB1759C94B873A1F4DF477E0EE9EED8DFD7C77508B3F0C67F69BE04355ABA9344960639F6DD6B3A956DCD66370338617A365579C5993986B4F748CB7C990344B209785E22A40FDCF8F83061D37C9F1351B4473D6C74ABE6B3EB2A7D62CA0F0C88A0AA8A46973F781DF0126E8D55D3E9C41C2E3884F84FB0A06C484CFA0C9A0DFB8CFD573749C711C7C236B0F2F144E1BA4DB2525C093DEED29434FE43CB3040C5A374CFEF33214FDD2D660398E91BF070A4F5F9746C2F08C41256FD5E955891146FFD38B155987E6A0FC47AC2A5950509B9E2C86B9DD9929378F43EF3935F1562672498C5640A22315BE15B001D4B01418DF8EB41DFE5C570E850582D8916C2E7FC2B728048E24BB9D1E8283615E039C16A2FC61011631BBD8F2BEB24ADF9552CF5797CE05D9D1A7E7F3F5455017B127D9BACD32BAD0CDBD3991BBCAEA5FC988EE7AEC0B1003732F25489EDB0A1F9897247CBC40E60F1DD276259CE19DECCB90067F7293A68B683FB5232ACD2217B8929859109D6852A43892098630A67D72B1CF4BD5D58E20C5C18B85D69DF74EE8CC69BAAC7DA48EB71A160F03B68C6BE87A4919736F14363F004EA3F41DD37FD8E621BF433BCA71E17565E060F3C0F889515D0A8C17FE0D6D734FF756256B0A62058B95422257780DE000557DF289F47910CC272A14BEC737C0715F204C49F03150082DC904A5D170F7383F04F1E355F50F80D5461CBA53490BB2E9484806D369D61FD00ED1EE5BE518D04A24503B1C4C08C7CA084902A3942C04143807203287A985EB3FCAE3C5309410CD9B9A548F54DED44321CE8C2A04679841DAEF7FBB6AA11091D240AFBB467D9969C31C1CBF6B24F8CBFA20CB4CFA404B1310400271664763E9C1CD1B6FE5FF2A0FAE22AB14EFC016CCBB19C5DD5D047750DB4ADDEA3E7A193128A5F4D7BB6358F21B39A44259695904DE3440BB28CF9466B562065C387189EAC2F7522C9385DC2A607F6F9335FF8ADD47C7BA932659AFF69B1F26EC8655BEE4F97FBC846E48111CBE25524873D1DB2F2282D0472A2AAA3CF491C26DDC5E1BE77866A3B692E417E6717A4F4454C56F97F063B9E598865B6F71136D65DDB0F3CDEC57DECD5A57366BA96E4315A88B4EA3479321468FFFF508D23B0701A62CE0CBC0FA37C91CFF5C5A0433FD61AE11A922575F5BAA714DE46A58D6EFC79BDB10C9AF7E9950A61D44B3E17E3B5298501146485B562B1570FF5798B47641D67091CDF90902B2D762E3EFE94C540DE4A28269CC416EDBDDD4D43AC2FA82D638DD9BF11F3BF22FD81CC4BD4759D7D864EEA0E8E8AB71796254B278CF9B650D1FEF38B8437362B2D69ED84C54498331C6899E20C596FEE7CAD9ED8D83D86774AFA6E56A4ED34B0B0842B21CCB67035406DEDFF0CECB0CD089929ED5FFA0CE210822444808BAD99AF603082BFE5C98EE4653349F8A43DB64CF90190C96B0446CC9CD23E0D75B47F54A731E8BCB0A4C67401DEE87876011033D2A526067FB73786FBC1CE696130FCE5D5379CDAC6788875D27C04783B1E2EF41063D57E3D6560D1FF48882C39131C95BAE5A9C9392DAB6CD17EEFBCF61C464A4DBC08447443CBBF3FA80481F3BC1A5806042C07F7A7AD435875DDB1001565EB6B7B872CC6C853F771C1DD5D9C16BC27ACEB3C7690125C1907C7CE904852108CAFE76351269A3D3EA8812FAE4FAE35F0DAEC8E8B186F760005524998BB5DE475E4DF85209DA915BDC972218AE7DB7E2EFA05A7D752AE61CF2F3DC26CA2D282C8E32B4838524BE460971E077348290FA0043FB7616D821A71DDA3A5FB76BFCE0DC84AAEA432DF32B05133A26B46165297EBC45024777A868B8B1B0DD6F97658BE799BD366CFDF99861E916F7CF06C034E4F79594F1BB6ECD9B7347911488928E1E473C4B8C73297F7ED845B9EC59020373EDA57A436C1C9D1459C6114BB6258543D8F4F97B10AAEF5A2E082EA173EE69702D83711FEE6AEE8F6B260D03AB74C3B5D8FDDB81B208E16458511270DD1DA295F25CDE7E44A8349B60BF0C59D4B425C1FBA60D2BCBA47B906D2830D8D5C091DBA756E61620D78B2DFF28407FDC9DA9113CBE82219BB2CC05E11C70D040BDE821AA17B3E981558961CA571E5D5041F7DE047A1727D9C904DEEBE561DC6DBD8876BC77C27322F512D6171BC03871EB0FDECE70F119BACB41D1852220CFF26110EB0EB78E39AA1B2A4C2E78679F53683520C5A57FEA71A8E96E0AED33118DC4BDD035FD88F535B011D9C7DEB6F406A072AE6C091016ED10A5A4EE9827882EE27C535262D1D745AA5231736F2DEEC8A6017BF0DA36B416C98AB71C6824A6EEFF3564665007C9E850FD02A1F5E201B534627B92D21A493DF293DB9F24DE70C7B49A6E07ACF2DB6C90B448681666DCDA318C08AAD08D3E257AF7E774C75DEBE3B3C07AF683735E87F205B0FDE07351849C5AFD07D5722C6AA17B6AC2CC3551C305E6AC31E3601A236961F6618CD3A0F7DCF6F65B8EC82E27E44C8518CDC16ECF79374F796A3DAABE2D5005B25576B35B021497C5A8F9B98DA68D80E56A1CC1044C04DFB11D36CB147EABFDAAFBA0A93FCED8675D7D6A9F999785C0E7346F4C68EB17C0A2409E2F5BD4AC5551FF66A9857C66F642F2A385131377B6372884C417E01BFBBE1CA748AC8969BF2C0BD8944767746D1D57D862795E8ECF9E8A5CA122D0259FFBA822588C5ECCD14CC6FF4B7354CB572F5BD695ED9D85DE131FDD97DD5D6CE7844DDF9F3D112028B5125AE7A77A4AEB2EBB554682A26F457C43FE96D67C90BE7E49FF443478E82D3A48680D737D1260B8210BBE962EFAE6505E496B1B6D4F1042A7B971605E2DC50BE3BDFECC3010B9F5618D3A1B2C1F48888B859E4D6B63CA9D29990B6D502FC22B738B203A83D597B48D73C41860E4E99C57181F5B02F108CA193451025F3B368CF2741244F42B27CB9E57260D2E127CA166B32E0B9C927B247B31619B1D4 +pk = CFE1800B2C38C3676FDB008D38798E271D3517AC38B74329C131027A7411AD1D67CF3F0B2F1C288767982DBCE99C46B0130F4F4C54F5E317A0F68103E63E300137772E215A2AD88FA9BDEE6BF14D46690BE00157A5B883A6509978E29D9A34F1CECE3BA39A61DED3826E1E3D27D009C033ACC6DE09F1B3B85885FB904A6E11000A +sk = CFE1800B2C38C3676FDB008D38798E271D3517AC38B74329C131027A7411AD1D67CF3F0B2F1C288767982DBCE99C46B0130F4F4C54F5E317A0F68103E63E300137772E215A2AD88FA9BDEE6BF14D46690BE00157A5B883A6509978E29D9A34F1CECE3BA39A61DED3826E1E3D27D009C033ACC6DE09F1B3B85885FB904A6E11000A134266CBAB3AED02B12E02F788090E5A74521ACABF787F1D2150ED8FE5D305492101000000000000000000000000000000000000000000000000000000000000B033D54190E84E22B8CE19D02ADB43EBB7FBFB9CBD97F1B456777928A77BBDE1EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB30B8AC0E8B00E8D18AEC308754C25819B18FC7E3C9B1A001644D6D2F70CA5ACBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C3C88DF2E819C5295A5963ADF248EB9C9FF5D571CDA3C1BD7B1C9D72B8E8D119BF12826BC81CCAD3AAB39E2B2FE4749972BB28EF915E6E34422F49EDCFC10E1FDDE1A6F4886A04D23D3698C83B0E8D09A236F0A3DD7E8CBF08AAE3241EB2286EA0C0065ECB2F4A0C4610D2B324471D0E9BE58D611013CDEBECC195B369021213D0659E0CB9A3F39BCF17594F60BBDE06C545ABF9C90A4BF79ABD280550C0033F53899A81162DEEB6B630BB16738BD57B508166DB13EFC35D0EDAB58C0DDFF7332ED31D017FD3A3A8323F8133ED3618E3C05D24E9CC2918C835505BFD39BECC5EA35CBFD5295759125AC082FDA63A8916BD0E3F92EF68166BDD973900 +smlen = 3163 +sm = 3628A235679076549147DE001B5859C0C51677803A5EC48D4BFDFE06F281FFF5384D17991F0C2104DE024DABEA58BD4B18E7C8C0D3BD8E8DE31957B5D6E28E008FB318F5AE96DEA4EF8787AB78C55C851FBFB23961D88ACC655E9F95A6A2F51B6791D5313D733EDE16976A98216F73615EDAFEDF6972FDF9EC0096F4E83F69000103BBEA45518DB0B4426ACA5D73012F05EA3BD9ADA1985897CDF1BC5DAB1B08770EDC4943E32F56FD44D5F55C495626F114B882DDE20B4183A6547BA3BDBDDB8931839FB48F824A38772ADBE919FF391FC1F19717613B3F6157DA501BBAFBAFCC3B84441A9593CCFC2CF894514D6EC32D18F9FBC9AACED4AA8D7DD631730A1BB138B40E16EE71B6015200124206E520E2F7CB9E807D990CBD4ACD5617D2C6A941000409C07185E0343DF2A4201649AD5DE4CFFA20BAF5DD43F5E4A6C81CD5143FE72865A7C036A2DFD617D96626995C12EFAD019FF44E0EDD7028F29E3657EE3C0D02E9CE83EF0A648FD7CF183A7BF7C15095E0F9278B14FDF6C983CDCF2987DD0CC085400906DCD0D14ABA60124F4B7494ADBBAE3A8D6052122575F99792F7240EB17864DC6D231721140E43F1110E73EB2E3C05049783B33AAC4E4CA0A248775BAF81FDB03D114508928BEC3169A810296B5A4DAC27E7C7F8D01CF5943CF4D8CF6EE6F9042BB300E50EEA3224D35C9628E38C368EC3B42393FC820371DB6557216A2C2D5A230FE3A7C6BCBDD89A2BE5CDBE7F783BA379B6A4237DB051E6256DCE14DCF641190A956E8E85EB2638736B899ED045636DDB7A351F5A4F4108D9D6E0413F92B9D392495299128A5F4ACCE8C7747C675EFE05ED7182DB51C515B345029440AB61A904D2A390122680C951ED4575515144C5CA80D6F14D1CFDBB5373B78E09D04D0544151CFA1240790CD31165048D1484DC4D11D05057071DB3433DF071B367E00FD38C386DAB689E4DFF6FB421B2A95FF54DC29375C9D1C18A76C79ACAE3D3F35D4CFC385199A4CCAF6C9F0421BCF58D296EC7E0D1B95A6C4BCBAC1271F94E438360A71A6440275591E41389B30CAF2626A865B9E59552CB198A1D4453EBA6D0F6FC491A8A7783B4A8BAEB81E54F9189CE493EFC1C5D830A4F637F2BF43CD86B91637611415C95685FE79966174312FDFBF33A646625F97521B5CB1F008135B824F1D6D8373006C7158E62B1F794AE34548A0C6DAC8B60C559D81580AC0D84034A501516EE36CB4082732918365A5AB787FACE591AB02BE6957AE4BB96B58E2B173DA019D3E0CABEBEBA0AF775779F14BFBA8F595697731522DF3C80CBDEC16F6ACC32659CF5DAF193178307887EF1BE1B48B5806D0FA9868A7FB853708B26873857786B974709C687D6597BCF6C7E476C1E47CAFDBF30B6311ED434C0F998C4065399C59073C1F2BAB1D46104E74EA6C976D416E58BDFD24CCD957CB431870DE5DA8763992EF68BB18075926B0E4E826095EB3B8CAE086FB1759C94B873A1F4DF477E0EE9EED8DFD7C77508B3F0C67F69BE04355ABA9344960639F6DD6B3A956DCD66370338617A365579C5993986B4F748CB7C990344B209785E22A40FDCF8F83061D37C9F1351B4473D6C74ABE6B3EB2A7D62CA0F0C88A0AA8A46973F781DF0126E8D55D3E9C41C2E3884F84FB0A06C484CFA0C9A0DFB8CFD573749C711C7C236B0F2F144E1BA4DB2525C093DEED29434FE43CB3040C5A374CFEF33214FDD2D660398E91BF070A4F5F9746C2F08C41256FD5E955891146FFD38B155987E6A0FC47AC2A5950509B9E2C86B9DD9929378F43EF3935F1562672498C5640A22315BE15B001D4B01418DF8EB41DFE5C570E850582D8916C2E7FC2B728048E24BB9D1E8283615E039C16A2FC61011631BBD8F2BEB24ADF9552CF5797CE05D9D1A7E7F3F5455017B127D9BACD32BAD0CDBD3991BBCAEA5FC988EE7AEC0B1003732F25489EDB0A1F9897247CBC40E60F1DD276259CE19DECCB90067F7293A68B683FB5232ACD2217B8929859109D6852A43892098630A67D72B1CF4BD5D58E20C5C18B85D69DF74EE8CC69BAAC7DA48EB71A160F03B68C6BE87A4919736F14363F004EA3F41DD37FD8E621BF433BCA71E17565E060F3C0F889515D0A8C17FE0D6D734FF756256B0A62058B95422257780DE000557DF289F47910CC272A14BEC737C0715F204C49F03150082DC904A5D170F7383F04F1E355F50F80D5461CBA53490BB2E9484806D369D61FD00ED1EE5BE518D04A24503B1C4C08C7CA084902A3942C04143807203287A985EB3FCAE3C5309410CD9B9A548F54DED44321CE8C2A04679841DAEF7FBB6AA11091D240AFBB467D9969C31C1CBF6B24F8CBFA20CB4CFA404B1310400271664763E9C1CD1B6FE5FF2A0FAE22AB14EFC016CCBB19C5DD5D047750DB4ADDEA3E7A193128A5F4D7BB6358F21B39A44259695904DE3440BB28CF9466B562065C387189EAC2F7522C9385DC2A607F6F9335FF8ADD47C7BA932659AFF69B1F26EC8655BEE4F97FBC846E48111CBE25524873D1DB2F2282D0472A2AAA3CF491C26DDC5E1BE77866A3B692E417E6717A4F4454C56F97F063B9E598865B6F71136D65DDB0F3CDEC57DECD5A57366BA96E4315A88B4EA3479321468FFFF508D23B0701A62CE0CBC0FA37C91CFF5C5A0433FD61AE11A922575F5BAA714DE46A58D6EFC79BDB10C9AF7E9950A61D44B3E17E3B5298501146485B562B1570FF5798B47641D67091CDF90902B2D762E3EFE94C540DE4A28269CC416EDBDDD4D43AC2FA82D638DD9BF11F3BF22FD81CC4BD4759D7D864EEA0E8E8AB71796254B278CF9B650D1FEF38B8437362B2D69ED84C54498331C6899E20C596FEE7CAD9ED8D83D86774AFA6E56A4ED34B0B0842B21CCB67035406DEDFF0CECB0CD089929ED5FFA0CE210822444808BAD99AF603082BFE5C98EE4653349F8A43DB64CF90190C96B0446CC9CD23E0D75B47F54A731E8BCB0A4C67401DEE87876011033D2A526067FB73786FBC1CE696130FCE5D5379CDAC6788875D27C04783B1E2EF41063D57E3D6560D1FF48882C39131C95BAE5A9C9392DAB6CD17EEFBCF61C464A4DBC08447443CBBF3FA80481F3BC1A5806042C07F7A7AD435875DDB1001565EB6B7B872CC6C853F771C1DD5D9C16BC27ACEB3C7690125C1907C7CE904852108CAFE76351269A3D3EA8812FAE4FAE35F0DAEC8E8B186F760005524998BB5DE475E4DF85209DA915BDC972218AE7DB7E2EFA05A7D752AE61CF2F3DC26CA2D282C8E32B4838524BE460971E077348290FA0043FB7616D821A71DDA3A5FB76BFCE0DC84AAEA432DF32B05133A26B46165297EBC45024777A868B8B1B0DD6F97658BE799BD366CFDF99861E916F7CF06C034E4F79594F1BB6ECD9B7347911488928E1E473C4B8C73297F7ED845B9EC59020373EDA57A436C1C9D1459C6114BB6258543D8F4F97B10AAEF5A2E082EA173EE69702D83711FEE6AEE8F6B260D03AB74C3B5D8FDDB81B208E16458511270DD1DA295F25CDE7E44A8349B60BF0C59D4B425C1FBA60D2BCBA47B906D2830D8D5C091DBA756E61620D78B2DFF28407FDC9DA9113CBE82219BB2CC05E11C70D040BDE821AA17B3E981558961CA571E5D5041F7DE047A1727D9C904DEEBE561DC6DBD8876BC77C27322F512D6171BC03871EB0FDECE70F119BACB41D1852220CFF26110EB0EB78E39AA1B2A4C2E78679F53683520C5A57FEA71A8E96E0AED33118DC4BDD035FD88F535B011D9C7DEB6F406A072AE6C091016ED10A5A4EE9827882EE27C535262D1D745AA5231736F2DEEC8A6017BF0DA36B416C98AB71C6824A6EEFF3564665007C9E850FD02A1F5E201B534627B92D21A493DF293DB9F24DE70C7B49A6E07ACF2DB6C90B448681666DCDA318C08AAD08D3E257AF7E774C75DEBE3B3C07AF683735E87F205B0FDE07351849C5AFD07D5722C6AA17B6AC2CC3551C305E6AC31E3601A236961F6618CD3A0F7DCF6F65B8EC82E27E44C8518CDC16ECF79374F796A3DAABE2D5005B25576B35B021497C5A8F9B98DA68D80E56A1CC1044C04DFB11D36CB147EABFDAAFBA0A93FCED8675D7D6A9F999785C0E7346F4C68EB17C0A2409E2F5BD4AC5551FF66A9857C66F642F2A385131377B6372884C417E01BFBBE1CA748AC8969BF2C0BD8944767746D1D57D862795E8ECF9E8A5CA122D0259FFBA822588C5ECCD14CC6FF4B7354CB572F5BD695ED9D85DE131FDD97DD5D6CE7844DDF9F3D112028B5125AE7A77A4AEB2EBB554682A26F457C43FE96D67C90BE7E49FF443478E82D3A48680D737D1260B8210BBE962EFAE6505E496B1B6D4F1042A7B971605E2DC50BE3BDFECC3010B9F5618D3A1B2C1F48888B859E4D6B63CA9D29990B6D502FC22B738B203A83D597B48D73C41860E4E99C57181F5B02F108CA193451025F3B368CF2741244F42B27CB9E57260D2E127CA166B32E0B9C927B247B31619B1D4 + +count = 87 +seed = EDBCC4F6AD0F30066947D678A368B960CCD164889D77730516B444ED2DF10B49C101902F5FA227377C3163A0045B34E4 +mlen = 2904 +msg = 836254422C7D13F1120012FB9CC7CDAA1D8B72F6FA3943AA7DE75263D3DF814BBF2E80C3A204BC0F9AE33E4FA82CE893D35C57E41C7147602BE12455B00B7949A3195264A3281CECC3FDE34802B28C6E1F2B505AB6087D453BD6AA067B2370124840BCAC4605EE4F14EDFC4B4FF19A4D7A828E60156B49B4027AC18DCCD20294F89CCF03D0CF47BB2F22D3749EEE69EE17AB5D8E4DFCCF36824D23E3F95E959D0494FFBC712CE3975E3A661B3F9E149A0234F691C2D820000DE97CC016C43EFE958DA469F740610FD22B64D4BD2E30075E22BCFD4AB41D952D2394FC629F016EE1CD61AAB4581F62A7B8648F8F8CF02462C81023CBE2755C91195A5917FE5A8B5058ECB8DAFF91DD3F73FE38665666DBF79CF6F203FAF94A5CA3F3AFFAA2C2BD5F5DBC011DAF46FD7CEB74B5875E4B5D80B6EDB9817106B91865267E78731662218C8EDE73E588256FB1AD57232AA5533D25BFC54452612F0C2AECAE6DE19355E1D508B888D18FF9F6D7D68199755CF5C210172F65342269ED96C77D80AF8A244B43A99DEB49B97A6F358AADFCFF6AFF72AB39540D375165185F31E0F1A6F97722EE365620BC5D642F8CDC59F7E84FD8615F4A336ED340BE6ED8451997D87B7904C1B9A3A0BD1F8A01AFD6A2D9F5B995E3FD0D44DF8FBC8389B6CBB5537816C91F0EFC3D2349F15EEE747B254C5BBF9418BB979294423DD6DE4D13484408362582A86D082350CC79EBCDCC05B70110A038736034CE4F3DC1D17E5D11C9C7620D40730B61437906933193D1272F7C89C701D495ED682F1335B7E1C42C994E090A67D932A8E825F4B9EDA8F2A94B9A1F11F10E91396908A9D436DD01BAE1D1DE2C6ACF458C0880E3F81ADC2240A99E6083C9C188982713DB243028AB07DF407218CA6B3C4C93989AC96D92375834B915B724F2A105D6240E52B9D7003C67FF76F7A325D84ABBC229266BB40D1DC8784CE1A4A6BD17972CDB26C274B06337D525F61B5BF952D23FA13757460B7B8A3B99EB023831F4FBEF72D62931348622041FFD12634947579BC6E16BD1EAA8E8B2DFD54D74EFCED79EF4FF31AD42036DEBD0FDA3B7F3F8E7A3F45955F82936A67122CD42E38AF646CF565E294F422FAC1E7D274185896F58E9D0FA1FCD3F4D379ECF5B566586246216556939BDF86D6A417C3BF77C64F95D7DE8197EE25B44EEF00209D33159710DF001372C3E3D09F24B9B08B8938C522690674A7588933E1CA37D2C14DF50777806EF6FD2285771A44F6DE90475C6CC314DF140C3962DD9D70C54E58CC5FA3302D69C80C6511D9D42A51B7CB7FD7FEA8D8BD65A66FDB2AC80D945FB7EC72E138F5566CEB570968D84B60068DF20C6CDA2AD48372DC97424793FEA8D2136923070C25F47C3D10839D1747B613B93530968D5E97A3FC0F563BFFCDE7B42C839EFE66C3A8655D0CEB5AF7A37D23DBBB52D05CF6FCBFFA7C7491703349819AD94CE218912557D6C87937B2E7B0473856EC78713C29A02CF7B2B38E0DFE16804AF6C2BA8607026892138011E06B4AF179D63DBD97CB917B6507B798E58D74F485D3F063C044211E428FBFFD5AF2D7941900299602D3B15D5D600B435D9A21948B8D87A35205A3AF9AA9BA491D56573A93C35AF6683655E04A7A17F1B9709ED83E70D82A3DF59A2FB7C051ABE508601F322FFEC089C49DC666BA04366C038AD59D397022F0F6344255F4D98BBB17120441CC75107005A74DB35459C63770547A4AFE59F2703894DEB67612448BA7C4F6FEADC1717F6ACE410C6BE62AC319CD33AF285D17D55F500E364A0ABE71D357AE0802AF464B6D2732F3FB94BDB3BAA497F2E44727BDCCA5A4B65AE9DF189FF1AC640940FF4D479A8072D34ECC523DC8FC7C87FC89A540485AE7BB3F29B041446CA427C0B48CA7515A1E31788E8B53E1122D372B6557F8D2A97CDE893B20E60283954E2934AF340A358A4376DD0CFCBFE305A2CE7B72DCFE2DE105CF44833F548D1BCE88D34B60BD29B69309DD87F4B91DE10EBDD7D7F87D6231307D0AC784E0496DB725AB97656C34E60B34B230F37E30FE326296C4E1BB88C0BAC261DF0E5F45E6E126103EED6B1CA146D58140A8893D847E92D9F3A0A883E8BF830147CEDBDC7DD42C1A58A826A8A827F9AB26ECCF64F68E9CA6B68261260B659B47E0DEDBF5B077982B24ED9B36E8466DCB21EE69B5E2BCCC49A163B4860EC2CCBD65032776DAE601E18ECDAB8E35C2760D5758592F6CC074298A97FC5E82E7DA84036FD10E0725A0E4E58CC4DB30499ABEC0C7D95D88BAC2C58EB093312779BC1B8619FF2762FD1FF009273456D829394664C31FF6D7848B27174B36E59FB65D6BEF6D974D5038A28F49AD465B28857CC12BAAFFABF3652C2E22B46B040E579FB040A0FB4B1DAF0C157D35407C0B78E305CEEB232E7B7426C95639B1CF7B079E80521FAA538E51E69255576650C3A16E143D0F815D2CC89EB00AA13AF20394AA23CC6AA99A9F297D886AB9AF2655D53816E066A02CF21C277DADDEF3D7D0825D094FD8FBD5386139757EFD0B7F8501829725A4B70FF1DABF2958E07ED21DB76266A88483EE7C51A7D215E1B41D2464911ABBB1DC71F9613ED5446E4B0C97BDD47F22B372FB7662956FDCF3B108E0107F74301A054FB004925B041AF354C04C20FD370CE1A014EBEBD8311F3265A2F78B48124521A4AAE240D3BA9F94FD33CA4A92D24A029E0754831869B58F670435A44DCDD7BF75ED9FF06DBA52980DCE49C1C26BA0965DE3623F459E36127AC6AFAD4D5598FC45A95173D039CBBE2CDC7DAB2865FB6BC0FA8DFD33C4A826CFC77BB7F45CB5AA73377A27271AE41630DD3D4E2722581537FCFB233E5AF8F04CA824012B5C429EA498F4AD44AFC249DE2229FD7266FE84173A5CE44632B3650D6E1F278625D564B374C10C1AFA3F17432CBE4B65327C6B6E0CD2F99B68AB043C5C6C99D7FE7FCF940F4887D309D7BC0FFAA5DC4B90C79266514F46CA2D5477F2B84B04E30DCAFD0224170FA6D4BA9AD2A6DFA8ED73DFF9D5D40D43F02610032719A7C5646CCD453CEF409B4325F3FB6D9B9201FB115E4DFAA0B4D29959A44518774E94B2D4D6D06C7F065973BECD203F5CF6CB59F869340EC6BAF0121049DB3E1146234CEE4657C1B821AF817DA27BD4C9B1103C81F5B5161E6A9329D83D6E4DAE1F3299858CD201222D34A85E2991BDCF32E9771F3E701897F647D62729C9805CBF118C9FA727B056A7271A23181B92F033DE1EF113A856A884AD527B8DEB92085AF3DB509FDB0265FBA3376B31BF753DFA477DD5E247D939109F31CD430A692BCEC4D9FC7C5B4630CAB90C64B75496BC7CA54D5621FE3315AD03EBF1AFD6D436BD2DBCBE707B35F916CFC147BBB5B8AD2E80ABD692834E42E0724C8B901F5924212C4129F7451B9DD860A85855D1AC59F0B6B87A66B6A395DD81990AA3DEBF64C91CEA6862B5793BAFFF81677FA2928E950D94A6333B0E77A15AE461E710BE70AFCB9FE6E0C21C5AD188E439A6E5138A2C5AD17126E759D48491E3F3F93F81EEB77B7B3A6ADD96917CF0BEEA202EEA5ADB3D5593A3DC9FF1F8F05DBF5A2707EDBB6640EFF5B65A0003CCED2EB480942A13C1F1CCDF9994F1D11DBEF0D3BA7C3801AA508C17BCF287A928B635F475195D88ADF9F4C1CA7D3D1462DFD0F6939B89E5ED95F177BBB12253391876492BC01AFF1C1DAAF0A1C7821C2A4E33F52BADF51987E010B391FC984328E020206EE98E9C8E6763120055F99725E48356FD800E11CE973D00C800C353A5DF8B028E1E42F817C7433084C440E47532FC639172533DF35F0FF43257841C3E4EC7DD7F601EAA81E9886FA3253844C195A62F89FA5D292536BE8CACD80C94BBCD1A83C985936353C9233E512431A8863D7D8340E89307547BD10B16BF2C7E0BB01AB8093C70E4F4C8FD30608FA14FF072D81048391C07DDD82475A280D4EDF81F739AD1A13BC6483C3C37BF52ED52CE8D568AA81864ACABE225BC6467C79FBF43781F29B0C508E6825D4E56D25E45A8C0C6298765069FDCC66B2C5492FDDFFF69D6F5975FCD81041F30FFD7813BA3219B3139583EB588DDC57851E581FBD5E20127EBD +pk = 008A867B6A0BF5D3DCED05501B913EBC188E0F44B627B6E37677FA1C6895A16244CDF34CE7AB7DAA430BE98A07D15761EF7C3A228737FFC6F514ADB8E59D35011EEEB2324EDFCCE35C3CD3FD7ED4782F47649DE3E97E7A763CA51E7E4EF47FF8460AE64EA7CB2C309B3F8F80AC839EC03E244A1B53BCEF89BD5979AB015CE5000B +sk = 008A867B6A0BF5D3DCED05501B913EBC188E0F44B627B6E37677FA1C6895A16244CDF34CE7AB7DAA430BE98A07D15761EF7C3A228737FFC6F514ADB8E59D35011EEEB2324EDFCCE35C3CD3FD7ED4782F47649DE3E97E7A763CA51E7E4EF47FF8460AE64EA7CB2C309B3F8F80AC839EC03E244A1B53BCEF89BD5979AB015CE5000BC708ACBF671024843C5795B2909D729A2C0A6F38E75F94018593D1CD6728481F53000000000000000000000000000000000000000000000000000000000000008ED8B1B881237FC5375CE7C2F2060DF2983B653A90C3A79CA5B9F9711C90D5B4BBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11DCD2E4FA3945EC28140D976C44F74CF842991DF0780E6C1796405FA96BD042C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006C9FBBFF6C8DBEC4E5C2568B6F760FF42B779B42B7A30B4D00CFBF95B056E47981CFE1D3DE613DAD9F97F24550D402E12C8EBBCB217ED111B0746799C8960F97898A04399538D991D714A7212CC754C7DE8F67E88091B2A3790D8D5A651E6EA1424551CFEDF332CE9E6F64771FC65D137BA788567C2A6E7E558B4267D605F9B570CB75200A27E3DD2103BD9CC6CEF4AF45EFA87E2AC6D1761E10996E7263061B5853EAD2E1CE5C8413F89E5BC2F30EDD8FB38EC0D1C3EBAA640E19F70C6979D524392F006BA0BE161F2A17AD0B294A2A9C99FF27485F79F6931C111915B0C6B7FC9BA4E7A29988125B51FF13FAE822FDBAE1F953B88098763ABDCF0C +smlen = 3196 +sm = 7BE38A848673B3F7CED7CD73A9A8768B585710F8799A73FB3FB3B1341B805623F0397C34BF4E15D630AFDD6967F0B2218670BAEDD2A4D9E6B6B1F1C35D2370006B3E62B447AA78AFA0A5D09DB5615384D77C019FCD797F9476537F05D13B20A47EA5A07445A600DEA6E11B6A05029A3BEF03D2B96F8DD30EB11987E713C5DB000002F6ACFCA4F1B42193FCFB888FF7E0C6EC98174C82BC560352BE333CB53D96160EB93427AB97BEB1B75E30DB63EE7809BBE95C23FA0F817CBB6F3CAD172EC54B51D8C594C78349F7EC759D5709357B35253D3780FB073795F2466D9FBE6D150D2E36A26C381F9A289E0EB50CDA6A07A49DD0DAF5DC4D46CEC8E6452D5E3C261B06EC4A82199C541C38588A0FA65C96493B06E72B1B636E592EAE72A77297D924001309836254422C7D13F1120012FB9CC7CDAA1D8B72F6FA3943AA7DE75263D3DF814BBF2E80C3A204BC0F9AE33E4FA82CE893D35C57E41C7147602BE12455B00B7949A3195264A3281CECC3FDE34802B28C6E1F2B505AB6087D453BD6AA067B2370124840BCAC4605EE4F14EDFC4B4FF19A4D7A828E60156B49B4027AC18DCCD20294F89CCF03D0CF47BB2F22D3749EEE69EE17AB5D8E4DFCCF36824D23E3F95E959D0494FFBC712CE3975E3A661B3F9E149A0234F691C2D820000DE97CC016C43EFE958DA469F740610FD22B64D4BD2E30075E22BCFD4AB41D952D2394FC629F016EE1CD61AAB4581F62A7B8648F8F8CF02462C81023CBE2755C91195A5917FE5A8B5058ECB8DAFF91DD3F73FE38665666DBF79CF6F203FAF94A5CA3F3AFFAA2C2BD5F5DBC011DAF46FD7CEB74B5875E4B5D80B6EDB9817106B91865267E78731662218C8EDE73E588256FB1AD57232AA5533D25BFC54452612F0C2AECAE6DE19355E1D508B888D18FF9F6D7D68199755CF5C210172F65342269ED96C77D80AF8A244B43A99DEB49B97A6F358AADFCFF6AFF72AB39540D375165185F31E0F1A6F97722EE365620BC5D642F8CDC59F7E84FD8615F4A336ED340BE6ED8451997D87B7904C1B9A3A0BD1F8A01AFD6A2D9F5B995E3FD0D44DF8FBC8389B6CBB5537816C91F0EFC3D2349F15EEE747B254C5BBF9418BB979294423DD6DE4D13484408362582A86D082350CC79EBCDCC05B70110A038736034CE4F3DC1D17E5D11C9C7620D40730B61437906933193D1272F7C89C701D495ED682F1335B7E1C42C994E090A67D932A8E825F4B9EDA8F2A94B9A1F11F10E91396908A9D436DD01BAE1D1DE2C6ACF458C0880E3F81ADC2240A99E6083C9C188982713DB243028AB07DF407218CA6B3C4C93989AC96D92375834B915B724F2A105D6240E52B9D7003C67FF76F7A325D84ABBC229266BB40D1DC8784CE1A4A6BD17972CDB26C274B06337D525F61B5BF952D23FA13757460B7B8A3B99EB023831F4FBEF72D62931348622041FFD12634947579BC6E16BD1EAA8E8B2DFD54D74EFCED79EF4FF31AD42036DEBD0FDA3B7F3F8E7A3F45955F82936A67122CD42E38AF646CF565E294F422FAC1E7D274185896F58E9D0FA1FCD3F4D379ECF5B566586246216556939BDF86D6A417C3BF77C64F95D7DE8197EE25B44EEF00209D33159710DF001372C3E3D09F24B9B08B8938C522690674A7588933E1CA37D2C14DF50777806EF6FD2285771A44F6DE90475C6CC314DF140C3962DD9D70C54E58CC5FA3302D69C80C6511D9D42A51B7CB7FD7FEA8D8BD65A66FDB2AC80D945FB7EC72E138F5566CEB570968D84B60068DF20C6CDA2AD48372DC97424793FEA8D2136923070C25F47C3D10839D1747B613B93530968D5E97A3FC0F563BFFCDE7B42C839EFE66C3A8655D0CEB5AF7A37D23DBBB52D05CF6FCBFFA7C7491703349819AD94CE218912557D6C87937B2E7B0473856EC78713C29A02CF7B2B38E0DFE16804AF6C2BA8607026892138011E06B4AF179D63DBD97CB917B6507B798E58D74F485D3F063C044211E428FBFFD5AF2D7941900299602D3B15D5D600B435D9A21948B8D87A35205A3AF9AA9BA491D56573A93C35AF6683655E04A7A17F1B9709ED83E70D82A3DF59A2FB7C051ABE508601F322FFEC089C49DC666BA04366C038AD59D397022F0F6344255F4D98BBB17120441CC75107005A74DB35459C63770547A4AFE59F2703894DEB67612448BA7C4F6FEADC1717F6ACE410C6BE62AC319CD33AF285D17D55F500E364A0ABE71D357AE0802AF464B6D2732F3FB94BDB3BAA497F2E44727BDCCA5A4B65AE9DF189FF1AC640940FF4D479A8072D34ECC523DC8FC7C87FC89A540485AE7BB3F29B041446CA427C0B48CA7515A1E31788E8B53E1122D372B6557F8D2A97CDE893B20E60283954E2934AF340A358A4376DD0CFCBFE305A2CE7B72DCFE2DE105CF44833F548D1BCE88D34B60BD29B69309DD87F4B91DE10EBDD7D7F87D6231307D0AC784E0496DB725AB97656C34E60B34B230F37E30FE326296C4E1BB88C0BAC261DF0E5F45E6E126103EED6B1CA146D58140A8893D847E92D9F3A0A883E8BF830147CEDBDC7DD42C1A58A826A8A827F9AB26ECCF64F68E9CA6B68261260B659B47E0DEDBF5B077982B24ED9B36E8466DCB21EE69B5E2BCCC49A163B4860EC2CCBD65032776DAE601E18ECDAB8E35C2760D5758592F6CC074298A97FC5E82E7DA84036FD10E0725A0E4E58CC4DB30499ABEC0C7D95D88BAC2C58EB093312779BC1B8619FF2762FD1FF009273456D829394664C31FF6D7848B27174B36E59FB65D6BEF6D974D5038A28F49AD465B28857CC12BAAFFABF3652C2E22B46B040E579FB040A0FB4B1DAF0C157D35407C0B78E305CEEB232E7B7426C95639B1CF7B079E80521FAA538E51E69255576650C3A16E143D0F815D2CC89EB00AA13AF20394AA23CC6AA99A9F297D886AB9AF2655D53816E066A02CF21C277DADDEF3D7D0825D094FD8FBD5386139757EFD0B7F8501829725A4B70FF1DABF2958E07ED21DB76266A88483EE7C51A7D215E1B41D2464911ABBB1DC71F9613ED5446E4B0C97BDD47F22B372FB7662956FDCF3B108E0107F74301A054FB004925B041AF354C04C20FD370CE1A014EBEBD8311F3265A2F78B48124521A4AAE240D3BA9F94FD33CA4A92D24A029E0754831869B58F670435A44DCDD7BF75ED9FF06DBA52980DCE49C1C26BA0965DE3623F459E36127AC6AFAD4D5598FC45A95173D039CBBE2CDC7DAB2865FB6BC0FA8DFD33C4A826CFC77BB7F45CB5AA73377A27271AE41630DD3D4E2722581537FCFB233E5AF8F04CA824012B5C429EA498F4AD44AFC249DE2229FD7266FE84173A5CE44632B3650D6E1F278625D564B374C10C1AFA3F17432CBE4B65327C6B6E0CD2F99B68AB043C5C6C99D7FE7FCF940F4887D309D7BC0FFAA5DC4B90C79266514F46CA2D5477F2B84B04E30DCAFD0224170FA6D4BA9AD2A6DFA8ED73DFF9D5D40D43F02610032719A7C5646CCD453CEF409B4325F3FB6D9B9201FB115E4DFAA0B4D29959A44518774E94B2D4D6D06C7F065973BECD203F5CF6CB59F869340EC6BAF0121049DB3E1146234CEE4657C1B821AF817DA27BD4C9B1103C81F5B5161E6A9329D83D6E4DAE1F3299858CD201222D34A85E2991BDCF32E9771F3E701897F647D62729C9805CBF118C9FA727B056A7271A23181B92F033DE1EF113A856A884AD527B8DEB92085AF3DB509FDB0265FBA3376B31BF753DFA477DD5E247D939109F31CD430A692BCEC4D9FC7C5B4630CAB90C64B75496BC7CA54D5621FE3315AD03EBF1AFD6D436BD2DBCBE707B35F916CFC147BBB5B8AD2E80ABD692834E42E0724C8B901F5924212C4129F7451B9DD860A85855D1AC59F0B6B87A66B6A395DD81990AA3DEBF64C91CEA6862B5793BAFFF81677FA2928E950D94A6333B0E77A15AE461E710BE70AFCB9FE6E0C21C5AD188E439A6E5138A2C5AD17126E759D48491E3F3F93F81EEB77B7B3A6ADD96917CF0BEEA202EEA5ADB3D5593A3DC9FF1F8F05DBF5A2707EDBB6640EFF5B65A0003CCED2EB480942A13C1F1CCDF9994F1D11DBEF0D3BA7C3801AA508C17BCF287A928B635F475195D88ADF9F4C1CA7D3D1462DFD0F6939B89E5ED95F177BBB12253391876492BC01AFF1C1DAAF0A1C7821C2A4E33F52BADF51987E010B391FC984328E020206EE98E9C8E6763120055F99725E48356FD800E11CE973D00C800C353A5DF8B028E1E42F817C7433084C440E47532FC639172533DF35F0FF43257841C3E4EC7DD7F601EAA81E9886FA3253844C195A62F89FA5D292536BE8CACD80C94BBCD1A83C985936353C9233E512431A8863D7D8340E89307547BD10B16BF2C7E0BB01AB8093C70E4F4C8FD30608FA14FF072D81048391C07DDD82475A280D4EDF81F739AD1A13BC6483C3C37BF52ED52CE8D568AA81864ACABE225BC6467C79FBF43781F29B0C508E6825D4E56D25E45A8C0C6298765069FDCC66B2C5492FDDFFF69D6F5975FCD81041F30FFD7813BA3219B3139583EB588DDC57851E581FBD5E20127EBD + +count = 88 +seed = DEEE61A2FAC04E4D6B7A250124DFD91518D9B90A71FA02665E3088760BF69CB3CD7B6977F860A7026819D178623C9676 +mlen = 2937 +msg = BD2B4058218A15C008A4BBBA29592079583F684FEAD3E6B3F09ABFF0DBCA23670AE4496077D47945E5F1AC3CD4ADD5763581285D80DFB43BBA9C0730858293FF6A15915AB203FBE65C118B87EA37DFA1E06CBC0F24EBA3F43A8BE17FF1DAF4277CDA2CAE8AA924E852C9D60524B98306927746C4EB26DC9475E8A0D0F920F33E1AFF9D07EA5561E70865B2D8161B86FDD7638E7A72345DD72EE95BAE1EBD2C24D2A5510ABE3FC2CED397A067D215F6088D63FA63F2247427917E5C4FBA14F0A22A04FD0AC1D948507751F3523BE2B0A0CF2F96DC61F8187ADF646D6914667759D49A6DF9A327830EFFC9470CEC6C82EA127A8B0C6510203879FAAC4323145931E146D962846BB1A6E84CB2C31BC686E388C853413EA7D3EBF7C752C6AEC774637EE01F2817A5AF133928AF35F23FC3541FE7FA749A863A048EFED2F8CC2BA86520B97FDE0324C68D1DDDE1E430C30DED0B25664EA676AAC6B1F22925A40B319CAA37DD5DEDB99DE4D963630A6FB0E8B00AD8F2A2B9BCC497A00099A70A9DC190A2AB2A058930E63FD6DF342A625E9A095EE79137CAEB8885117C7A9FB8DF7A35D5A300D6F7EEE40578A7507EDC38A0D6522474E672F156FEDE7E1690C3BBDFF40342F1F3AD3C34325BCDBFF0A68249858C777551683A9F3AF225163C9323A4AD5E666E0A9F44C6496269038AAC5DC2767966C1560C5A09207406F3C47157D2FE5909346D8ACBFDDF3E3D19FE48B7C60E1C8CFB2EAAB19E736B2595D33A0AA034726CB6146A01EBF5CC72EB1182B9A4BCEF90A1AAF74079862CD775F8F773BCC490F6015B4D5469EE0BD95C1A32A1FBF283FCE1FBF6F8CDCFC1884F4D2A899F3E7A95414DE419D56462F502EE703CDBA007C3BB78F20243C35B882C90CB7DE3CAE3F0468079C546645977347BC183FB0A6CD24481391CBDF9372E2D6765B6CAF8EB0145BB269A47A1B4E2CDF9901D6AA284D919BA57163AB9929E715341BACD81F35BDBFF36D59A1EDABFF3CAD2C122386A6335348A3170337B94E4336B2B74E791981656CB5234A6F84DB4142D3F323000FA98BE61527F7548DAB6E83928E9DD2E461F08A5BB52F241BB42254E5746FCCE0F3620ABC69A6E275B5E06A333360F9B809562ED116AA6CC2334694AAA4169310ED6AF695678DE22D3E551DAF61C0A6C5F6C0F36FD3469A3B977F6D295E75ABB804A43E1E7AC4708208A94E8368DCA40856F1D43C9865D98F69F1C0BA9C8B33AC9CCD18D400D2559B1CDD82A0C875B5E136B97C02126C81A81EB5D1E421221564100450531DBD97BDA77C1B0186527ECF526CE6BCD0ADD5668382D984AF9277A21D40C06EB4BBBB0CCD6F64E90272FD632D47A388D301377EE745FBC9CB4C02E1F096DDF303BCA4E1FB4B6DF867676080CDFA6A29CEDD15003EE636DB8C74E7E293A087B1A5F62334585369D12D9876ED0F334C6711146643FD598F0D69BB3475D219D1F89066644897A9CC5630BC84C0CB5844087216038C8FB6750D0968D3D3E2D29D93639486C76DC045900AE1A13529E74BECEB3338684402BBC3EB36870E0B37584E9F309BFB0DD9B966F0BE1298DFE55D1A94A6767CAE5EB3120133B7D7B71C9F2A538A97F8548FB176B0E8923B14AF28AE26306214F1D392AE63C3736B9F9374CA10EBE93370C11BEBEB45D066477F374866C8A7208CE6DCEC404194BB1F833DE0AA4700CA29681FA0F72D98679DC3E1E142852347B01DAA08E5CBBFD242F7223600804E066FB5C98C8358370F5D390898FA44023A30F824F1C6A95B8E23308B4BE474D03E34CF72BE65F90D698DFE0D2828A797BBF8397EC87AB9EE00C76A1C7B3CED0100D3A1030136CAB9A69F05CBE58A4A56A9C700BC591B87783DE59369F2E62D5B885DA09F25835A6DC06F954C19B347724244FDA69E3356A4EF60F6A41CFF3BB7CB22ECB128415CD1B89A9AEC12B66F1EC23B14E7D7FD601EF7B000A0C96F386216F75710EB2C12817DABA1D1295E7535331CB90A9B0D8F7542E73DE2D93FE554063F57274DF27BFB39BC4B78B72A88473408086D8DF531E53B5BE018E076032D1F8EF86D7AFB8E8867B9D7728A25ACFB6856D83592CADA4494977678A9F4D134F49A8598A8E0F23D3B7A09B5308243410CA6F47E0BF8C43871600817460BDEB74E7D32C2FF7C40EA4BF924E795516FF7C7BC8E5FD5D64CC489F1894C6BCF0E9C312B1EE7E2BC68739372E7402E6AA2ECDCA39C18D7441F0FF373946559C475E37D4ADA64B98283E5A64BE7BC2D1A1C148D2CDB4EDA35F591D3A7E7CE15162F50FF1B025F87CBB82289FBE7F9C32DB8F23012CCCB87ACA7D758D42019B9A8C15F508CAC9284928F46F0DC1C1B6C6B4DA030DB9286FF8D3762EA4A83D096AE04F98E9416D3DAC59E04F9E4E4359AD76926BBD9570A3D5811F69A1C4345B646BD946D0168ED62A7A431D920D707D8CC7E840BB9CF13D8ABAE8196D9177E8C28CE0DD9EF647EAAF0D3C97E52CB31B560EA7067B45AEFB5EC2B7C7BDFA3996D1C7E467636BFA1BBE11D1CCF86B64ADE9FAF9287A23502E9FF711CA97D6CC09DE814A67BA6123A8E4E67CF6E8CB6F7B36621BC6192ECEE94D61860703AC8411B16E19644A6AB01813402629AF52301C9D76A94CEE22B1DCA49F13B130028991C8AB383C8461433383DA92AB34F1EBB4124B24C6C391EA44EE6E736BBC7A2D4660A878A600AE39B7DCCAA51ADBE90BD705EA51AD13C05E611749D43DE336D396352CB0673ABCE7473DECB0FC708EF28DCBE18C85EE0068FEF64685ACC3A7D0DA9A21DD0AFB10B95D81F6AE437022218B6094CE35D01248EA85A9EC6FB56A7A2A8453EB03E6CCBEA0F2EADB015D8BE3D09739EAC07AD9E3F17D13E5F71CADFA220ECAE90EA50BEA87B19CA6FC5DF31874D51723BECC80C8845C9EA718454D2817EF8AFD99B63090CBA6C8089AFA78770222FADEE3B3B829CF36A8153EFAF2CF28DC4651FF37A8921E402EF81A0F457FC1802AB06A759BF4071F082BFDC100AB612A4584B5AE19354854101AB0173D7D6A5A0637CCB58AE58978A8BEFD5A2C51D3D53150C336C0C0C2A27B442E2BCE120C4CCF8D97EA4584434A6F48C0245B63B2255BC52ADAD4EDA9279412D70BE457F7DCAC492FE53C06EDEED766B46EBC3419E6DA2A2847251F75C62A5FE7AE74F0DD5AF50A447DA6356DCC828C5F1A2C0C873E57041EB1158296C038B91F2E13D3D4B2887B284384A9ECB8BB378BB311F4ABB19E1B90EB3A399C03BFB4CCB29AAD80C55C1636559FC79A6C894B5BAD8D529BF680631541A45EB0E57BA5B458A05F456C60FBB593DAE90AE549416AF96642A486F10843482AFC3989BBD1E8E4DDF0791204F4B720ABD2D8995C87C8A388ECB14860CF83B7A4406FB6C8C9393475082D24E516C5F1AF91CEBA444D8E460D0695746BE057EA8D76F8C0C80358F3DB2AE5B996272737516EF5E4EF5A1FE5967304CB6D00090C9623D29F0D4BCE8CA3CBD54A30F9597E01E5845C1CDD8777E18C5D5D86492FDD0606F623D11A28DD9F02032E3A378C71B757B52021DCE6CEEC63792CEA24D6DD7150AC8FCFCA6554F7B08A5529D59628D0F35122504DD1542F6291BEDBEE09F81AA744A0F6C6DFCA6207FBFAB6B9E17E8A4040741F6508471E72D227D0FDC50C13F444310245AD17BF819FFBBC4E0485FA68CF1F0A4423F251538F25DA989ABCD008C803D368F626438432569F12D1612370E4C6C971079371081B37D8DF7EE709198AAA2FCBD443B96732AAA4E6924A461B60CA4F4CB13E88D539AAD709A3DB84D2D6D26671A9F3877125B7A358389BBEEA846A32E949DB9A7853DBC7D5ADD92729CE1B5C00680974F3DDC6A8235C7319B6CD1CE5E0B66FE7C2F1115206C42B4C02990D79EFA8BE94927543C19EE93D0EC8811F9330693696C878CFADAA2D56E877D42A3680AB2F6A576FDA7BF7957F781655CC664A0A4A0D16CE34D04D7C98A9E0C93D2E6D42870FE66864660B564ED4F881693D466BD68B6470AF03A5A6E703DBB40515AF5DCA7142C4C8D79F5BE4BB01A1B56BE9D0936396A7EED9A84DA86A4F00DCF676B4942D5DF6E1378EA26D9118A54E17FC623B83AADB417EC82F9AFCACEABBDCFE2F0B6AD4BC1601B4E24F547D61D1C1737ADBCB46D98287372C +pk = 821B7B150CD6E32BDB7AE113E1361066BAC0F25E5BA052A9F7638CC9B75D0580109665ED8F70C570E8B15759742D0C5B4A971EE5250AACB565160411F468E400D2F7EE40FD6DDD7A61A4BA50CD444CDE9411903EAD268A6C33CAF6A16F53DD93153C84A6A65305568A937BAE58BA2DFBDBEE1B0F8A884FA54E04F19BC3A9F60013 +sk = 821B7B150CD6E32BDB7AE113E1361066BAC0F25E5BA052A9F7638CC9B75D0580109665ED8F70C570E8B15759742D0C5B4A971EE5250AACB565160411F468E400D2F7EE40FD6DDD7A61A4BA50CD444CDE9411903EAD268A6C33CAF6A16F53DD93153C84A6A65305568A937BAE58BA2DFBDBEE1B0F8A884FA54E04F19BC3A9F60013D1E8234BABB731B7AD92CEDED0C08669B5D27B2BA709611F4E582F99C64D9DF13502000000000000000000000000000000000000000000000000000000000000785E4BFD7D0F8B710F0F8067F6BC5E5DB8BEECC2932FC5F34D21B9429A47BDF345FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF035EA602ED2CCB5B95501E154126C58102319C38F5CD2B73268E58EAA7EBBD480CFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000885007B94052CDA59E95669A3A15C097C6BE000CB8ACB365826D8DB874571891FC577C554365ADE8C2110CEC5062F3B8431A02664C2911B64F072C9055850E25863A38AECF8A9334FE544B7E616CFD2ED7AB45CCDA2EEFFCBF1C6F8E5435935CB1C3381303DF128B13300C47145FC23AE734846518FA88446D1DDA3D3F0477EB7917FFAF443389130D2F81E90B196C168F86BC58C856DB3ACA00445C457AD3D3F95C72F17556A7F4369925EDB1FC816C5433CCBA19C587AA8F07B34303002FDF662872022DD687B3B8A65434FA0EC376657CF75B0A01C986756F7B3246F04550A8A07435201E3FCB87CEF68C17EC0B81D6712CF8C017BA6F11C7DC01 +smlen = 3229 +sm = 693F3095677650E3F22243DF8ECDF0C8009B15AF431B9A898540BA2F293BB5F382377B1B08E3926C3DFD8278BC019FFE41131053C0FF3339206EC99AD7E16A0168929A621339B6AC08F1DCF0782BF639C6A84B889147D0D1E92B099727991412F9B332C583BBA69B2A2FF190C4A1DBF7CBDE019F8C991B1C9FC6603EFCB948010002D174B4845503EFFC4AEE16B92B9BD47615B792ADA73B674676FEBEBF248ACB4DB84A5E26B807B4AEEF3C549E3B1743BB8A478FB77CDA0F0F5B4FEEC5A82E267192BBB3FCA06333601353933BB270CA8F0EDA4C48BFA6EC7A45E21932E5A45467A4C110AA66253852AFA6C5C9FB84BA95B2DC43D297AE02DF9CFDF333A3FD4804799969C619192AA0EA8E214CE7BCC14E1AB72965A47221144264E5FAB38630000B06BD2B4058218A15C008A4BBBA29592079583F684FEAD3E6B3F09ABFF0DBCA23670AE4496077D47945E5F1AC3CD4ADD5763581285D80DFB43BBA9C0730858293FF6A15915AB203FBE65C118B87EA37DFA1E06CBC0F24EBA3F43A8BE17FF1DAF4277CDA2CAE8AA924E852C9D60524B98306927746C4EB26DC9475E8A0D0F920F33E1AFF9D07EA5561E70865B2D8161B86FDD7638E7A72345DD72EE95BAE1EBD2C24D2A5510ABE3FC2CED397A067D215F6088D63FA63F2247427917E5C4FBA14F0A22A04FD0AC1D948507751F3523BE2B0A0CF2F96DC61F8187ADF646D6914667759D49A6DF9A327830EFFC9470CEC6C82EA127A8B0C6510203879FAAC4323145931E146D962846BB1A6E84CB2C31BC686E388C853413EA7D3EBF7C752C6AEC774637EE01F2817A5AF133928AF35F23FC3541FE7FA749A863A048EFED2F8CC2BA86520B97FDE0324C68D1DDDE1E430C30DED0B25664EA676AAC6B1F22925A40B319CAA37DD5DEDB99DE4D963630A6FB0E8B00AD8F2A2B9BCC497A00099A70A9DC190A2AB2A058930E63FD6DF342A625E9A095EE79137CAEB8885117C7A9FB8DF7A35D5A300D6F7EEE40578A7507EDC38A0D6522474E672F156FEDE7E1690C3BBDFF40342F1F3AD3C34325BCDBFF0A68249858C777551683A9F3AF225163C9323A4AD5E666E0A9F44C6496269038AAC5DC2767966C1560C5A09207406F3C47157D2FE5909346D8ACBFDDF3E3D19FE48B7C60E1C8CFB2EAAB19E736B2595D33A0AA034726CB6146A01EBF5CC72EB1182B9A4BCEF90A1AAF74079862CD775F8F773BCC490F6015B4D5469EE0BD95C1A32A1FBF283FCE1FBF6F8CDCFC1884F4D2A899F3E7A95414DE419D56462F502EE703CDBA007C3BB78F20243C35B882C90CB7DE3CAE3F0468079C546645977347BC183FB0A6CD24481391CBDF9372E2D6765B6CAF8EB0145BB269A47A1B4E2CDF9901D6AA284D919BA57163AB9929E715341BACD81F35BDBFF36D59A1EDABFF3CAD2C122386A6335348A3170337B94E4336B2B74E791981656CB5234A6F84DB4142D3F323000FA98BE61527F7548DAB6E83928E9DD2E461F08A5BB52F241BB42254E5746FCCE0F3620ABC69A6E275B5E06A333360F9B809562ED116AA6CC2334694AAA4169310ED6AF695678DE22D3E551DAF61C0A6C5F6C0F36FD3469A3B977F6D295E75ABB804A43E1E7AC4708208A94E8368DCA40856F1D43C9865D98F69F1C0BA9C8B33AC9CCD18D400D2559B1CDD82A0C875B5E136B97C02126C81A81EB5D1E421221564100450531DBD97BDA77C1B0186527ECF526CE6BCD0ADD5668382D984AF9277A21D40C06EB4BBBB0CCD6F64E90272FD632D47A388D301377EE745FBC9CB4C02E1F096DDF303BCA4E1FB4B6DF867676080CDFA6A29CEDD15003EE636DB8C74E7E293A087B1A5F62334585369D12D9876ED0F334C6711146643FD598F0D69BB3475D219D1F89066644897A9CC5630BC84C0CB5844087216038C8FB6750D0968D3D3E2D29D93639486C76DC045900AE1A13529E74BECEB3338684402BBC3EB36870E0B37584E9F309BFB0DD9B966F0BE1298DFE55D1A94A6767CAE5EB3120133B7D7B71C9F2A538A97F8548FB176B0E8923B14AF28AE26306214F1D392AE63C3736B9F9374CA10EBE93370C11BEBEB45D066477F374866C8A7208CE6DCEC404194BB1F833DE0AA4700CA29681FA0F72D98679DC3E1E142852347B01DAA08E5CBBFD242F7223600804E066FB5C98C8358370F5D390898FA44023A30F824F1C6A95B8E23308B4BE474D03E34CF72BE65F90D698DFE0D2828A797BBF8397EC87AB9EE00C76A1C7B3CED0100D3A1030136CAB9A69F05CBE58A4A56A9C700BC591B87783DE59369F2E62D5B885DA09F25835A6DC06F954C19B347724244FDA69E3356A4EF60F6A41CFF3BB7CB22ECB128415CD1B89A9AEC12B66F1EC23B14E7D7FD601EF7B000A0C96F386216F75710EB2C12817DABA1D1295E7535331CB90A9B0D8F7542E73DE2D93FE554063F57274DF27BFB39BC4B78B72A88473408086D8DF531E53B5BE018E076032D1F8EF86D7AFB8E8867B9D7728A25ACFB6856D83592CADA4494977678A9F4D134F49A8598A8E0F23D3B7A09B5308243410CA6F47E0BF8C43871600817460BDEB74E7D32C2FF7C40EA4BF924E795516FF7C7BC8E5FD5D64CC489F1894C6BCF0E9C312B1EE7E2BC68739372E7402E6AA2ECDCA39C18D7441F0FF373946559C475E37D4ADA64B98283E5A64BE7BC2D1A1C148D2CDB4EDA35F591D3A7E7CE15162F50FF1B025F87CBB82289FBE7F9C32DB8F23012CCCB87ACA7D758D42019B9A8C15F508CAC9284928F46F0DC1C1B6C6B4DA030DB9286FF8D3762EA4A83D096AE04F98E9416D3DAC59E04F9E4E4359AD76926BBD9570A3D5811F69A1C4345B646BD946D0168ED62A7A431D920D707D8CC7E840BB9CF13D8ABAE8196D9177E8C28CE0DD9EF647EAAF0D3C97E52CB31B560EA7067B45AEFB5EC2B7C7BDFA3996D1C7E467636BFA1BBE11D1CCF86B64ADE9FAF9287A23502E9FF711CA97D6CC09DE814A67BA6123A8E4E67CF6E8CB6F7B36621BC6192ECEE94D61860703AC8411B16E19644A6AB01813402629AF52301C9D76A94CEE22B1DCA49F13B130028991C8AB383C8461433383DA92AB34F1EBB4124B24C6C391EA44EE6E736BBC7A2D4660A878A600AE39B7DCCAA51ADBE90BD705EA51AD13C05E611749D43DE336D396352CB0673ABCE7473DECB0FC708EF28DCBE18C85EE0068FEF64685ACC3A7D0DA9A21DD0AFB10B95D81F6AE437022218B6094CE35D01248EA85A9EC6FB56A7A2A8453EB03E6CCBEA0F2EADB015D8BE3D09739EAC07AD9E3F17D13E5F71CADFA220ECAE90EA50BEA87B19CA6FC5DF31874D51723BECC80C8845C9EA718454D2817EF8AFD99B63090CBA6C8089AFA78770222FADEE3B3B829CF36A8153EFAF2CF28DC4651FF37A8921E402EF81A0F457FC1802AB06A759BF4071F082BFDC100AB612A4584B5AE19354854101AB0173D7D6A5A0637CCB58AE58978A8BEFD5A2C51D3D53150C336C0C0C2A27B442E2BCE120C4CCF8D97EA4584434A6F48C0245B63B2255BC52ADAD4EDA9279412D70BE457F7DCAC492FE53C06EDEED766B46EBC3419E6DA2A2847251F75C62A5FE7AE74F0DD5AF50A447DA6356DCC828C5F1A2C0C873E57041EB1158296C038B91F2E13D3D4B2887B284384A9ECB8BB378BB311F4ABB19E1B90EB3A399C03BFB4CCB29AAD80C55C1636559FC79A6C894B5BAD8D529BF680631541A45EB0E57BA5B458A05F456C60FBB593DAE90AE549416AF96642A486F10843482AFC3989BBD1E8E4DDF0791204F4B720ABD2D8995C87C8A388ECB14860CF83B7A4406FB6C8C9393475082D24E516C5F1AF91CEBA444D8E460D0695746BE057EA8D76F8C0C80358F3DB2AE5B996272737516EF5E4EF5A1FE5967304CB6D00090C9623D29F0D4BCE8CA3CBD54A30F9597E01E5845C1CDD8777E18C5D5D86492FDD0606F623D11A28DD9F02032E3A378C71B757B52021DCE6CEEC63792CEA24D6DD7150AC8FCFCA6554F7B08A5529D59628D0F35122504DD1542F6291BEDBEE09F81AA744A0F6C6DFCA6207FBFAB6B9E17E8A4040741F6508471E72D227D0FDC50C13F444310245AD17BF819FFBBC4E0485FA68CF1F0A4423F251538F25DA989ABCD008C803D368F626438432569F12D1612370E4C6C971079371081B37D8DF7EE709198AAA2FCBD443B96732AAA4E6924A461B60CA4F4CB13E88D539AAD709A3DB84D2D6D26671A9F3877125B7A358389BBEEA846A32E949DB9A7853DBC7D5ADD92729CE1B5C00680974F3DDC6A8235C7319B6CD1CE5E0B66FE7C2F1115206C42B4C02990D79EFA8BE94927543C19EE93D0EC8811F9330693696C878CFADAA2D56E877D42A3680AB2F6A576FDA7BF7957F781655CC664A0A4A0D16CE34D04D7C98A9E0C93D2E6D42870FE66864660B564ED4F881693D466BD68B6470AF03A5A6E703DBB40515AF5DCA7142C4C8D79F5BE4BB01A1B56BE9D0936396A7EED9A84DA86A4F00DCF676B4942D5DF6E1378EA26D9118A54E17FC623B83AADB417EC82F9AFCACEABBDCFE2F0B6AD4BC1601B4E24F547D61D1C1737ADBCB46D98287372C + +count = 89 +seed = DAB6C05E29342106CC34769BF419ADCC88010C05B57E673A503E63AE7A4EE55B72AB2CA86C4EF57FC8C02D2E0C8694A1 +mlen = 2970 +msg = 4D83349DD620DC2CC0E9ADA524B9BE9B195973A839A042F4342D69E6B38918507A9747FCDD8B751D7C75ABCE2B482B3313D4C74EA4E7A4A91F2E08A059536B651508307B7F4C3AFF5CF1579F90F32BA1E847778673E3956713C14661AFA2D11CCF61FD8F9BC914D4B6E6D09C52AFF7FEFAE325C180147153C9AE1924C9A2B8DE4900BFBBC6797558B000C5ADB9A8DC4CAFB458AD328F19A2C55D5434BBFA7BE5057E56511529709992BD6527E913B46ABE38DBFF90D4AB3C024A66FC0F8FB34AFB96E22535A0EA8F313A087AA65355D7D5989C486E103FD526A7A6D812C0E4D8C081BCCE4DCFBC64B68436739451BE0C4B67BFCA71BE955BA9F9A23C223C7D0FFB1B2196C9C9845B6AF341A363951E2008BDC4F3296DD0E1E3F480F2E4B0EC77A002ECCFDABCC58D24CB0BAA26EACE96DECAA0F6BF1CDE0175AFA65AD5C23C5E71B50DF778208EDBE426AA6E876C12440D7C4FCCB42D039A14509092784BAAD37D9B8EDF186CD4FCB3D9F8B0397E951777D602B8AF613060FDAB6B358302B3FD28437A06694F36CE12A035F09D677E48D077CEFD1676D8FE51541BC19E3A6D6A5D879C4F9EB4713B7C0F3A652F3A05D74DABFF79A302FDAF147531FDD57924F49E52B298219B03D6DF166B481F232FC85C7CF52838969CED2DCFC18DD8C95891C498FB49289D1A982922A0FC02C849AC3BB7FA92CF43A64464D5BD919F75ADA287FE657BF61DC07B3808C0FD0D71EA24DE5353268B2C17C989C29465BA49111CC479F51A8CC623CFB6FF68149E52C77A7D85B5ECCE66C05900AB9957BC7ED39E03649A103B5B6BFEEB168B7C1F30DCA84AEA509FEC2B215DD95558A2708839396552F517A8FDA28C3ED61F84E1B2E0DCDFA708DE50D44BFC65BD4E70260C437C8B5B7158EC7E2301D9C7AAA68E0ADEF89FDB601711AD2998379145B29CE3681B513DC3BA9B2EB668C1B53697833670466E21E767361C0A4362E5B8DDC38EE6A9C4DC5205EB808B93C72FFAFB635B4254E4F4496BACC753C8ED0BCAA88DB683CE77C8165E8DDDE665392CCCD57BC07573D83CB3AA10648281EFB08F92AACD8AB6F9B5D7FC66D29526BD57E421220FFE375B26C61A0DDBD9807022EB3B4B681A43E7719F5EC255C1E19AE6C542D6DEEF3B94B6960C18D0D7C8110B88F995826073B874042FAF97F1FF034B8257418CA269F5CA588223393B0179F9817E08E7212D0D410EA259EA66BC4A00E7FB1190A732BFDBF7ADEA0E4550BE90C3E37BF33BAF436955742A2632AEDE259235702EA2E079D99A22C9755ED34C1E3CCBE746E728A932B1852F692B103112B303033AD3CE1172AA066860DF570D21EBBA51FAB72D5AFC4AE8995F532AE384CCCC3C4A295AF76A803FE076CCC920A80D82A9B614760EC43208579EF5DEE164356D62EA33953E55195EEE9B2E2018E6FD9D19A9F49258702DBAF6EDBFD093919917B1B6734F012E2BEB4F758DD481FB8A8D7796E755C6647501E28862B9F5B16FFA1C5D80DCB07141806FC348881A5A8891BB632A4AE4292A102D71504D0FC12C79D15BCD0799D30C7B9E72625A7DF7DBC7ECF9EACC627CA9AE5D71E264F2F2A9D5DB8593F3A90F3915CE480ADF800C99FC2C8692F2B57B492BF9D84171F8C29AF8D5549F82D3730927096CA18FF0B0C0C0B8B800508C44D5749B92D7D48F7FBD5C86E408ECE0EAE639AF475073DF5CA2CD5083BC4FF8852DDF5C399946A6B21B0841D137F583E0DDA3A6046F082872B783ECA3E14B21A2AF61BB150847026F2371812B1A2BE72024226F4613DA860AC2FFC578DCB171DC27B896EEFE49F885F9BE4CC8766F37038E01CF20DBB661F507B2ECF2B023203A6259B0A018FC00B2CA9B3107B605F04388D5493AE7CC4BDD093CE761A92847C2A167739E0750B427B2ACEB3ABC5FF751A5F32D36B589787D4DA509C85EAD751353AB2C68A9C14B8B2C8166AEB6F27C7F101221C306AAC74AAB6B4E795525FE12038725D7AF3D2A6D60E1EA85F2B94EA24F1B72FED9DDAD4C8E5DA484E80A2150DE22E6ADEF41153D7B4331E8F011A3CD48DAB02876B067312D0DC736E465F99AC3C9C56321507E79ACCF652E3857C749AD92DAD15350A6B4B67229A3905DB18AB2053E2D4F92F156A1D76D0AA891364002C991E632B53FA217AAC1709F37F3402F43B0753361EB2F595F9FAE3D7D96FF050DCA0B9657F4C3AB49EBDBFE8816051C4E0AFF32C5137749D53B062CB61F7201171B5DD716E9CCB38D00E50955596845DFF602200B30D375A854CA4E9A7276CA1A1D9EE92A04BCD78854BE251F7080ABA6D8325D40B37054596AD80211A50AFCC1DBC177600A70E648D8BEB4FCB8919214894CDDAA6D63B6F6C445469A6866721D4BF1117F25DFF9D65FC8FBE5B0ACC8B9039C7F94B2A5CC6068A0489E2E13A731DBE1094FA8558A601ADDB9E4DAB04FA744CD5B95A9D57C52C8124AD950A5944DEE2C55E5C8540DBEE5823DAA624F57FD5BE994BAB3AD4E74EA9443F8B6024BD6B49ADF3972442D88E61E04FE8478FF28916584CCB65FB15686991D5781CB7EDA067745258EA671E0A2665F94FEA1B5490669D1EE8711518BB911094957586C8075E3BBEDC47BE059053A7658ADFA0ACEABDD46E0DD9647B34EBA32E56B6305653ED386C50E79E15084F00F003B1D12504FDD8E47D03D9F7572276047BD22B82B8E81F87C86E6F20D2A756B16F291179A97B010F993C0F839C9A1238CFC9BDE8074405CF1B35DF423C7566CE965681F21C969E4F3F8FDCA72A18D5DAA80287F53B5F8429FEA81612CF63CCF1B7A13512DB4D1DD2678FE1189398032EAEB4368332972C728AD726B7290302C3C5ACAB6E73432E825B9046F846ADCA9D93780A36095AA5C51E354CC6E9A910CABBE59130E98F4ACB3CB6D4EFDA9E2F78748ED58465937FC81C548AD038FDC32AEC46B078CC5A7207658A9706F1C9653359DE6C4457DBFA71D300F98F9BC5DAA14DBDD5EF20DCEDE7E9D3F7DA5C932AC3338BA40E46B17D89FE38F725129991983D4A81321B394F2D7B20D66E3DEAAEB6FEFC8CFF0B68A766E27CCFBA66DEDDB1F541DEB3C1892ED2AD5D073162F0DD06B82E8878477BC96E03101C9B5D9D0ADA10EC060B45E144B31E6B4DE283FD43538B47178398FDD15B01ED421EE2C65847F7A4E9AECE2F1D13971FFC0157040782AD4B591DEA0906370820DDE1000490AB1C27C03D02A0F4B4BFAB0E56D7257288441CEA63175CD6BD11382E6C873154332E627CE82E37C63889EFBD8537AC35C21AD7A09C986CFEBF13B19D5677C1104B373F3B55198D075AAC608145FF9D0C4C12C83BB41036AB32227629EEB4922F172281A66C23C35B8A3E92DE0A10D5E8C18B9A54D6C30230F3A8263986AC535B6BF63EDDAF6A02C9100B712EC4BD49851A22AF0E647F259C2E19B9ACAEB6147C476C90745A353F6252ADE8212A9F7C215C0B3053BF2B4E0AD225E8B344EC14C1B839877349C3743E8337D9C1EB128B06939C5A08F60A46FA700723EB6652FC26440D9BDA3C99C10AD0742C2F039BE6B66749B77E14F8223509365053E87ED870FE3906A16DA6C62945DD2112C96A23942B1E14431AECA7DFCE3FD4D6633E0B661FB34B0BF05C4D21E689CAC9B6ABD9F507F08E4AAB94BBEF1C629C0E1CF344E66D3A3E100B615BF762DFF0CEFC5E4CCE0DD908F46C94E7411A151E713FE0C18ED33C4C03E55E12C0AC366DA5C757C7090E0F94E2C34D93EA3B226ADB2979D23E071F18C2EFF33BCF41BAAF52F4B44E38675DDDEC89C7BFE858BFD1AE70D96D0487972D70F8D8681982656FF734BB6323AA91EA14C6330C71783D235D9F094CB111ABC4990319BBF163891535AA5F870164DA65FFF395DB68B390084D4F2448B98CD56103E49CAAEB6CD040C3ABA8290284E9B2BC423117F4104D89B1B1607C6D34AC30AA9E79D8753B97CAE90ECADA6CAFC6100D3D6D91E20393E0DC95B981FE0EDBCF88E046F74184A96705AC226FD26089468E432D525643293BDA781B64BACBDFD6C7301AC42AED7DBBCE7ABB9D67AF315BCC3509CF03523FC887E27EDCBD7C74DADFD0F126CDB49E28ECAD38080F18A775E6D824C18359935D921744EA72FE293F299B530D9DC9285EF174EE60E2DDFFCCFFE89960BABA90D955CD2C96672513C758142D29A1AD79CA9291BC6782B64717F11A71E6D65A1A71D +pk = 09011E5F0041EFC3BA9C542053B27B8EB2A85C7F2D1FC6FBB04FA31C10E3DC70259E65D4DE2B616E8DAE4CD0D8F727658EA5971EEBE696B2B1A6DBA23A7D4D01B745A0CD7D6F5443F214979FAB466B009EBD1F7C16E2A27FC70D3B38A9D53F0A7A4B0474810CEC9CDC0789D3ED456D66B0E634996868788A46E96E163C22520111 +sk = 09011E5F0041EFC3BA9C542053B27B8EB2A85C7F2D1FC6FBB04FA31C10E3DC70259E65D4DE2B616E8DAE4CD0D8F727658EA5971EEBE696B2B1A6DBA23A7D4D01B745A0CD7D6F5443F214979FAB466B009EBD1F7C16E2A27FC70D3B38A9D53F0A7A4B0474810CEC9CDC0789D3ED456D66B0E634996868788A46E96E163C22520111B71FC6ECF630F26160018F35568F98C6E69CD44AA8D97577A6C8800D7DBB80C1B0010000000000000000000000000000000000000000000000000000000000003635EEECA3172FBDBC6E10AE70D7D0138D50D80C568289ACE4FF3AB6317AE129BEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D59FDA60155E00457763350136FDEDC746E70B0B14B0DE04D4B552D895627F27EFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A7CCFA8E1B2462B0F31E9F80D67FEC6D89B647197BA927CF7BC943B8E6EDBA6F6095A86BCF2EA3E3C13F2C69B96F02EFC3DBF3E0496148D0A233F80FE35D094742682ACFF88184424F9882D6CE8B037AA9342954C5ADE7327CD31B72632337FDEC09700F01EE761B83C01C4DF20BE22158EA4054AFF457CB6859C7928A012A43BD16691A4E61E329342E998F49AFFCC7C463E5F87CE33CA0E84AFC33E1F21E2B7713CF911D007A9FA91D173B450C8824FF5D485A75CC86F579EEACEF05FF3BD034540937830C60BC9BC8287DDAB549685AE5E2D4129576133261F7A2FD78A7292BD047D063F2D2C017005AE8F80F7BABE768BADCFD6103EA77587000 +smlen = 3262 +sm = 73CDB9409D42318620A9E5506B12D826C25D0DE32764B1896B3729909C67E12EA73FD37734B25E113F3B722216F1FEFDB404A2AE23D2D2E31B6E190ADEA7980031D99FA10004D60C88447B0299DF100D8B3DA2B19608E68ED7D0A8DC60DE9678DAA9F8C19E1D9214929141451817E0243AD7D5978D2FC410EDB515062D780E0000017BEC1CB7A960F80B9C4A69690982BF185B41CABEED7FB7E5B7F2FD773C48237CB95CD2CDB062031EEBEE657AD867B9B8306F63C948A57E4736F05F67CC18C736A06F015AE336144FBC61963A447769C9DF8AC1D1DEFBB715309F558E0B34576D4A8DB217E6D1DAC7C2D0C7C221E88433CEDAAC205166EFAEDD46A76F9149CE56E2D9B8DFE1B4C7074089238006853208851368A4906DE91D38F84B213ED61500020B4D83349DD620DC2CC0E9ADA524B9BE9B195973A839A042F4342D69E6B38918507A9747FCDD8B751D7C75ABCE2B482B3313D4C74EA4E7A4A91F2E08A059536B651508307B7F4C3AFF5CF1579F90F32BA1E847778673E3956713C14661AFA2D11CCF61FD8F9BC914D4B6E6D09C52AFF7FEFAE325C180147153C9AE1924C9A2B8DE4900BFBBC6797558B000C5ADB9A8DC4CAFB458AD328F19A2C55D5434BBFA7BE5057E56511529709992BD6527E913B46ABE38DBFF90D4AB3C024A66FC0F8FB34AFB96E22535A0EA8F313A087AA65355D7D5989C486E103FD526A7A6D812C0E4D8C081BCCE4DCFBC64B68436739451BE0C4B67BFCA71BE955BA9F9A23C223C7D0FFB1B2196C9C9845B6AF341A363951E2008BDC4F3296DD0E1E3F480F2E4B0EC77A002ECCFDABCC58D24CB0BAA26EACE96DECAA0F6BF1CDE0175AFA65AD5C23C5E71B50DF778208EDBE426AA6E876C12440D7C4FCCB42D039A14509092784BAAD37D9B8EDF186CD4FCB3D9F8B0397E951777D602B8AF613060FDAB6B358302B3FD28437A06694F36CE12A035F09D677E48D077CEFD1676D8FE51541BC19E3A6D6A5D879C4F9EB4713B7C0F3A652F3A05D74DABFF79A302FDAF147531FDD57924F49E52B298219B03D6DF166B481F232FC85C7CF52838969CED2DCFC18DD8C95891C498FB49289D1A982922A0FC02C849AC3BB7FA92CF43A64464D5BD919F75ADA287FE657BF61DC07B3808C0FD0D71EA24DE5353268B2C17C989C29465BA49111CC479F51A8CC623CFB6FF68149E52C77A7D85B5ECCE66C05900AB9957BC7ED39E03649A103B5B6BFEEB168B7C1F30DCA84AEA509FEC2B215DD95558A2708839396552F517A8FDA28C3ED61F84E1B2E0DCDFA708DE50D44BFC65BD4E70260C437C8B5B7158EC7E2301D9C7AAA68E0ADEF89FDB601711AD2998379145B29CE3681B513DC3BA9B2EB668C1B53697833670466E21E767361C0A4362E5B8DDC38EE6A9C4DC5205EB808B93C72FFAFB635B4254E4F4496BACC753C8ED0BCAA88DB683CE77C8165E8DDDE665392CCCD57BC07573D83CB3AA10648281EFB08F92AACD8AB6F9B5D7FC66D29526BD57E421220FFE375B26C61A0DDBD9807022EB3B4B681A43E7719F5EC255C1E19AE6C542D6DEEF3B94B6960C18D0D7C8110B88F995826073B874042FAF97F1FF034B8257418CA269F5CA588223393B0179F9817E08E7212D0D410EA259EA66BC4A00E7FB1190A732BFDBF7ADEA0E4550BE90C3E37BF33BAF436955742A2632AEDE259235702EA2E079D99A22C9755ED34C1E3CCBE746E728A932B1852F692B103112B303033AD3CE1172AA066860DF570D21EBBA51FAB72D5AFC4AE8995F532AE384CCCC3C4A295AF76A803FE076CCC920A80D82A9B614760EC43208579EF5DEE164356D62EA33953E55195EEE9B2E2018E6FD9D19A9F49258702DBAF6EDBFD093919917B1B6734F012E2BEB4F758DD481FB8A8D7796E755C6647501E28862B9F5B16FFA1C5D80DCB07141806FC348881A5A8891BB632A4AE4292A102D71504D0FC12C79D15BCD0799D30C7B9E72625A7DF7DBC7ECF9EACC627CA9AE5D71E264F2F2A9D5DB8593F3A90F3915CE480ADF800C99FC2C8692F2B57B492BF9D84171F8C29AF8D5549F82D3730927096CA18FF0B0C0C0B8B800508C44D5749B92D7D48F7FBD5C86E408ECE0EAE639AF475073DF5CA2CD5083BC4FF8852DDF5C399946A6B21B0841D137F583E0DDA3A6046F082872B783ECA3E14B21A2AF61BB150847026F2371812B1A2BE72024226F4613DA860AC2FFC578DCB171DC27B896EEFE49F885F9BE4CC8766F37038E01CF20DBB661F507B2ECF2B023203A6259B0A018FC00B2CA9B3107B605F04388D5493AE7CC4BDD093CE761A92847C2A167739E0750B427B2ACEB3ABC5FF751A5F32D36B589787D4DA509C85EAD751353AB2C68A9C14B8B2C8166AEB6F27C7F101221C306AAC74AAB6B4E795525FE12038725D7AF3D2A6D60E1EA85F2B94EA24F1B72FED9DDAD4C8E5DA484E80A2150DE22E6ADEF41153D7B4331E8F011A3CD48DAB02876B067312D0DC736E465F99AC3C9C56321507E79ACCF652E3857C749AD92DAD15350A6B4B67229A3905DB18AB2053E2D4F92F156A1D76D0AA891364002C991E632B53FA217AAC1709F37F3402F43B0753361EB2F595F9FAE3D7D96FF050DCA0B9657F4C3AB49EBDBFE8816051C4E0AFF32C5137749D53B062CB61F7201171B5DD716E9CCB38D00E50955596845DFF602200B30D375A854CA4E9A7276CA1A1D9EE92A04BCD78854BE251F7080ABA6D8325D40B37054596AD80211A50AFCC1DBC177600A70E648D8BEB4FCB8919214894CDDAA6D63B6F6C445469A6866721D4BF1117F25DFF9D65FC8FBE5B0ACC8B9039C7F94B2A5CC6068A0489E2E13A731DBE1094FA8558A601ADDB9E4DAB04FA744CD5B95A9D57C52C8124AD950A5944DEE2C55E5C8540DBEE5823DAA624F57FD5BE994BAB3AD4E74EA9443F8B6024BD6B49ADF3972442D88E61E04FE8478FF28916584CCB65FB15686991D5781CB7EDA067745258EA671E0A2665F94FEA1B5490669D1EE8711518BB911094957586C8075E3BBEDC47BE059053A7658ADFA0ACEABDD46E0DD9647B34EBA32E56B6305653ED386C50E79E15084F00F003B1D12504FDD8E47D03D9F7572276047BD22B82B8E81F87C86E6F20D2A756B16F291179A97B010F993C0F839C9A1238CFC9BDE8074405CF1B35DF423C7566CE965681F21C969E4F3F8FDCA72A18D5DAA80287F53B5F8429FEA81612CF63CCF1B7A13512DB4D1DD2678FE1189398032EAEB4368332972C728AD726B7290302C3C5ACAB6E73432E825B9046F846ADCA9D93780A36095AA5C51E354CC6E9A910CABBE59130E98F4ACB3CB6D4EFDA9E2F78748ED58465937FC81C548AD038FDC32AEC46B078CC5A7207658A9706F1C9653359DE6C4457DBFA71D300F98F9BC5DAA14DBDD5EF20DCEDE7E9D3F7DA5C932AC3338BA40E46B17D89FE38F725129991983D4A81321B394F2D7B20D66E3DEAAEB6FEFC8CFF0B68A766E27CCFBA66DEDDB1F541DEB3C1892ED2AD5D073162F0DD06B82E8878477BC96E03101C9B5D9D0ADA10EC060B45E144B31E6B4DE283FD43538B47178398FDD15B01ED421EE2C65847F7A4E9AECE2F1D13971FFC0157040782AD4B591DEA0906370820DDE1000490AB1C27C03D02A0F4B4BFAB0E56D7257288441CEA63175CD6BD11382E6C873154332E627CE82E37C63889EFBD8537AC35C21AD7A09C986CFEBF13B19D5677C1104B373F3B55198D075AAC608145FF9D0C4C12C83BB41036AB32227629EEB4922F172281A66C23C35B8A3E92DE0A10D5E8C18B9A54D6C30230F3A8263986AC535B6BF63EDDAF6A02C9100B712EC4BD49851A22AF0E647F259C2E19B9ACAEB6147C476C90745A353F6252ADE8212A9F7C215C0B3053BF2B4E0AD225E8B344EC14C1B839877349C3743E8337D9C1EB128B06939C5A08F60A46FA700723EB6652FC26440D9BDA3C99C10AD0742C2F039BE6B66749B77E14F8223509365053E87ED870FE3906A16DA6C62945DD2112C96A23942B1E14431AECA7DFCE3FD4D6633E0B661FB34B0BF05C4D21E689CAC9B6ABD9F507F08E4AAB94BBEF1C629C0E1CF344E66D3A3E100B615BF762DFF0CEFC5E4CCE0DD908F46C94E7411A151E713FE0C18ED33C4C03E55E12C0AC366DA5C757C7090E0F94E2C34D93EA3B226ADB2979D23E071F18C2EFF33BCF41BAAF52F4B44E38675DDDEC89C7BFE858BFD1AE70D96D0487972D70F8D8681982656FF734BB6323AA91EA14C6330C71783D235D9F094CB111ABC4990319BBF163891535AA5F870164DA65FFF395DB68B390084D4F2448B98CD56103E49CAAEB6CD040C3ABA8290284E9B2BC423117F4104D89B1B1607C6D34AC30AA9E79D8753B97CAE90ECADA6CAFC6100D3D6D91E20393E0DC95B981FE0EDBCF88E046F74184A96705AC226FD26089468E432D525643293BDA781B64BACBDFD6C7301AC42AED7DBBCE7ABB9D67AF315BCC3509CF03523FC887E27EDCBD7C74DADFD0F126CDB49E28ECAD38080F18A775E6D824C18359935D921744EA72FE293F299B530D9DC9285EF174EE60E2DDFFCCFFE89960BABA90D955CD2C96672513C758142D29A1AD79CA9291BC6782B64717F11A71E6D65A1A71D + +count = 90 +seed = 0CAF47BD9AABD7D09FFAD404449BBAB2E1D48E80AC78550831A365BED8765420DBBE9A566EFDF20D4E5233D7848582E4 +mlen = 3003 +msg = E0F434DFA04EC225FF6B6DB802A047E221BC064E5BE89A5FC13937AE9D3F22B4439BB1C1BBA01547A64AB3E810BBB09706D01959E2E906A69FFDDF0C56726BDB58FB039D66AC5D77C7F0E9A8617B0C69176770DA328D38171F39B5220279186250139922C0DD0F7C3F96D48615FC66DB7568810931D257B230258FFE9CB35F87859E08139EBF7432E948EE3F962BB9015CACB8499BC69597ABAE4B841B606657E2E3C51FF5A8961AD42177A9E73950E3FA150439E2063B6555624A6D8E3AF4FD5710FBE722B8C6267BA5DF56846A085C56444573D692D5412CB70E443761751E58C41953BB9FAA3CE1F4564C825A02F0E1339CD659AB1480804DD2E90E3086AAA292DB39C6E2AAF1B001B47A21CC721C0C502C46EF0479BB7D8CBDF8E9C136397FEBC2D83C0FDBB3ED4FA6868068477206A26D2B7E0D20507AECB2756B888FCF5B446217DE14EE6A20CF7E7B732FAB22CA3ABBE81B2BE18463ACAA3132773ACD7476460536111CDCAC98B1CC9B2C36AEB3FB318340F7397B4B4AD6AA87EAC94AB7D98CC12EA5606162877465FA2CAD276CBB5D36C40A0B014C53D2D3A96825E237342DFEFAA6B9456B5FF1DCA859C5976F77C3D3CBC9DF355237EE9B4B4C90A9DD941294431DB76DBB539DC48669E7AAD21808332C8A4FE98B8F043FB756B526890452FA3C3527FCD584CD33E38FF9FF783538D39A184B7B3EB649E1C04C289FB65998F6CF5D5BBB0609FC3403D85C6DF269017032CD24AC540E1B294BDD3C3A0C7117CAB02B1A0063A174FF26FCDA687433A667322320C0DEC1EA3963F3B14375882B3478AED43C2C74DEBFE3A734F8B1A5CF92007F8FB627CC3AAD5C6AE4C31846B72E7573041270FF40E762C0F8DBCEB7512D44DC260A97D5CA7D60699981ED8476D8651C35C8ED498FC2961D1E38AF46F3653630773209A63838A9222B813C23DB0CF4196D6654126BA2B1840A7180E653B3D6E10C4C7AC3CEE93B0399D918A52E59F0215B09A119E634E6E8A9886C877F157BF7B7DD827ADEDBAF03C718AE037C0B262588171839E952721DE72180F8EED00B01F53E098B82165199C53129576036FC753A3D33AEC92060DD19AA078A496A2B214B1BFBB747A1EC64071B0A078D74D0212E6203C9698C7449326A42BCBBE8D9501DB916C64307D5F1083BCC36C0FFA18C0E4410B0B17D443481C3673D17BBD7A366A5FD1C3C5B3391A02EDA7596B4F869A91A32B5A02A05611371231BE035EDC716F534724B5225E1A72A2B2CD357F4C326F1DEE963FAB680721D40DD70B750A019E70885515F43946A0DD3DD042969139F61ECA0E9EE3107D3D28AC606AD53F236303E1FE986C38825318B7C4597B14E1A83B81295FEF49FD0F2C1E14A0B146540D853DB9706CD224B376343317BF7330B0C2721A409B856304FFFE60C24C441D5E2797D4696C0FE046D305AEE93CC6A2D89A81EB19643636A8B424B310034612105DF16516CE9607CC0A2BAC5835642C6FF9572191BC45E44D9B40DA36B607F570AE8C39D490342786F31CE6764F3F7A764665B6CB93E54922C6D89DB566F494E0EE069811AC82E8132F2F388D68490CB1C2172D2979FCE3659D7076B4F457232EB839172963F8C342E2CD18969F086F451D33BB774F3D00E6FA2BE02292F2E5CAD3ADF5DEC28932BD784801E69364962BF39E25455303E1F289052D2F0CD4964E0FFCDE29E7C074E5D57E43739DFA42AAD636C352D363E3A23BDD134BAABC7CD1621CA638DED7DB7051F0456641CA872ECDB4D3C2603DDBBCE16637010E782C4BD5230992E2EE7DD904F8A83EBAA7B4C3CEE15B10794ACE894118304BCDA9E9B1376331D2248B802557AABCF913E95F783715BB5E90A4436E4BDE7D651397A70A24257C39E0516BB1F548DA36C1F1F92A416DC1114107CD863F3BFCB360286E774B21296259756EA6040CB61738EEFE29A67895AC69797C640E03F0E9E731647C2DA93373920341FDFBD50EB6B737BB0D9FDA8EC8784920407D4F41486D8FC616430768D6431CCD789DEFF332B239FFD1900800CEDD9661A55D6D96089007E9089A117F03D7858EB4C3FE2D07E91D8CAB88D2BA5421846069FA6D4E5C9161A140CC3A288100BFBE61C3B0F0E820AB12D8FC54B054A0F4C777052495B45A7D1A883E67663DCF50C2230CA5319AB31CD76435DAE41CE1EE25ECD3FA0C7E83B0168852B2CAB674127CD7BC9DDF9DD4B57EB40128988C7C8994DC6A5FC939FF957F06C70A4056E63331F9AAD254EBF2B8FCCD580285BEA486D91A0C2DBD5823AC8F6846DDABCDE25A2252F8DA1AEB32E6969276BD2A7F94CD7DD3143F3181489272B1589FD385BA844F90E35982B53141DAEAED413054CDB935F3412E31D99C1147079CB487FEEE85E3906DAED18106B8C407BBCB7716EF9D4D34E2FF04709C7457997AD6FADC55A8FA70BC907815805578A11A012C521A1325754CAE2E3F7C9E1FFFDBD4BE31DC534961C318D1A894838E0C33806735DD11E408E500995B86B6ECD20D325347F792A3381D2A45587D9B6AE0AA27533732A6C421CA621AAC42335848D9C0DD89F14EADF2F92EC532756CD5697AD752B6260C598EC9F0E9976A950B22DAEA8B74FCC87F28B5E9ED83C0339E566259ECF06E5CE209065DE87FEEE5D1E9C466004B34583D6AE89B590EAD6A96CD2951705AC764F329E28C996AD6DB05F6C69AD2A39D3EE230F6501F1760AA41FFD936C9DBF20DE3996917322D32B946062A3C27D8BF35ECDA22403AB684CDC680DD166562D018D943369CAEFB9133A4BC4515CD5F9C08E7C22D153F0A7733EB4EB2CD8A74A4C85E40DADEF6858C5927B6EEB2B01E9B7AB02F7048C8869991068B00FC19B9545AB42181DD5CB5488222A402E827F60A8D87B09ECC88350032F998E3C10A88D4733227334812EC97C5E5FA85FAEE1A1E28A58641531B139AA58BEF49780DCEAA408986CF3C40E226C60531945A20F91E5DC31EC86C9F9A0545E5FCB79A13B9AFE9B133867BA7A38152ABC6D9F8EE10090BB71E6ADC6A6C2513B066F2565138BADA60B0BD339F9BE1AADDFC90DD272B4146D0F5830C6A53E295C849C15D001176E7774FCD7619D6EF1A30BA93CFE278AB4806BBF25CE4A4E94163F614E81DFF7EFCB015997F5138E22B80B2B00AD7579CD84DB5D1C7FB16E9E8C5D9A5BA0AD0E0A7DE79C18839D673632F3D2C7DA2062EAE844FACCAF23590B2FBF1861405AC347EB9D723ECBDE54CC96BC4D8EE2178F353310E5D69230C5DB2841D2A06A3A4E03E054D99DEFC6004A6E405FA89B198A901EA1AE9F3112A29F3AEC5698A42794E04D74D761E4AA5AD23DE271969BAF124450F4796DA1EB1C01480436AB0F5D0B1B2E6717DD87EEBF137420961F978896077E40B2D2EBB5664FD8AD89BB9333FDF46C33EF3BED21BCB5B4697451BDACF364F85462F5CB9F546657B4744EDF757DAAA4D3A9A2A6F281184C3576B1DB0B540F3B36310020BC6AC0C6454A7CC8EC1182422B17BDA202729C270194CD6044210D2B98731565812339EDFE5A0DAD79BA826D8C566C7D25DEA9BFF0BADF1E4E5DA2B884966E03FADC51C6D9BCFE877511157201DAB48AED1AB038999E5CC3FE58CCD37D40050DEE92E0BD5332413A7F0118724084EE5545FB51942DF1EF399F734FB9592555B5F32290C53D7E5017EFA2B61E29FDCE90CC3E7C1B0E545425B1D3E1ACB9089DAA786CB0122DB3FF27EA0367751A5462230F0F248147EBCCBA2E16D214E9A0BAEBE989BBA020F95B623CB14ACAF2BE6F157DFDB1E32627133F0D26C7B65A189F39955EE31D9B507B43126B06B9E4524732C8621D2274438DB7ECAF736AB7257CED950EB68BB868581649232793EC83379A16F40781E76F5CC57C48C3F5C2989BEA803E1B63768436D39AD19BB77DB46AAE6E8473ED5DFEC983F49E4B8E7CA6BF476AB2F0272C0C2DBEF1BCB064D7400BFE1B9ECCE13578A20B1D5B48133A74C5C59CAE0115BC3B50574580BFA99D58BCAD336EE2CCA5B7994C784BB90CC8F1B9A0E21B39D5EBA464DE34D46AC0BBE436C2F419D60D8AB13786F9A841B52710D1B49BEC290DE317B66B6855ABE156C07619A4B998CC582E3F54A7F457F1D2839BC3EBAC937AD3EBC6A9E6E845379CF1D66D7C59000E3F6CF6823B005728A95BFB0ACD044EB35D5ADBE8933A3637887CF91EE74BB910FDCBE797B0C6B1B056500542BD39781BDF13EBFBFE949D7BA0B7F31102E63BFC6E22693F97 +pk = 4D03481EE77BC0AE3E42B2B7A69A2D8A3FD516495B76EC82D71B1B7F478D559C1A33FC4874A1486B9F5213CB6AF92F3CF2C1AB0793AD9B795BA1A08298B40200F698121919A54AEFF896F98300EA3D7CEA4A7EA04199F768CA692AFF60A480AEFAAD3FF6B6EB6587E6B13F0D2DF1531D0D143E5AE040992090BC1DD435C8B40009 +sk = 4D03481EE77BC0AE3E42B2B7A69A2D8A3FD516495B76EC82D71B1B7F478D559C1A33FC4874A1486B9F5213CB6AF92F3CF2C1AB0793AD9B795BA1A08298B40200F698121919A54AEFF896F98300EA3D7CEA4A7EA04199F768CA692AFF60A480AEFAAD3FF6B6EB6587E6B13F0D2DF1531D0D143E5AE040992090BC1DD435C8B400097968E1E2913586C35AD41B388DA8FB83B303410521521D2E1BD3757A4AFF409CC80000000000000000000000000000000000000000000000000000000000000002CEE80139B7CB70C195C93ED78DD3E095F9332E0DECCCF421323F6DDE576BBCCAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF236A4F48E21D61936007E88787AFF630DA178C3B7750A832D32E998B2E02863A97FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EA6DDB9C25C3C98B89CF31B3CC86F9A157B71C028E79C4DCD4B37A795DE9ABE0125207DFA7DD28B81A4124963921FA10CD5635AA12ABBA9A4FA48FB78D5104A7625B8A98D89A152ADF73541ABF0122C655DF2549CF3742D28BFF5D88F5EE372076EF980870965180DB1FADBC36A1BE2997F87ECAF4A4100A0E03B3995B07D97E2B454C125F8F74D7053E3B2E2F6BAE3CD5A1D01B0744FF20785ECDF114AB74960F8F3B5AD0CCDE3D03389772A1A2590E08B0D7FC563F0D627CF688FF088368333FE0F1A4639E03A86B790FC9F357FA0ED40480295C454CA7B52C6F93BACC70622A7A7468DF10669EE4B60C5A6B5E19C227491E08C7473777661F5405 +smlen = 3295 +sm = F768E5969E00D134024EC9B0CC9D941DF374454A14A9BFB91768BB8442967DB62D767434CBE2696105AF786CFE19D21608B3A1D54981F487F1D2B4950A384701E4DD5020F681E892AEE74B0FDC2F9973B5AD346A361410E3E00FEF39C23E23877039F7B523C8EF331511511FD953DEC218503231916017B296440975FFBB8A0100006EC339408ECE4941B90C81660B43D2867DFC54D32ECFA79C9E672213FC3B406AB9C7E999412E3ED3E00095CA046D5AF9AD6C1D2C9BB33530EB228B2CFAE2616185BD7F06C9D877259BF569BB700601F86F7640D776FB3EAA8696ECD269A6356558D38AC0D991B577941E9CDB58C5EB66DD636DFCD5F8B6E00368F99CB7FE680CD91C17858021F530AE83C5BD55A563C40C318B3A76941054CC9AC2F17CAB7B000904E0F434DFA04EC225FF6B6DB802A047E221BC064E5BE89A5FC13937AE9D3F22B4439BB1C1BBA01547A64AB3E810BBB09706D01959E2E906A69FFDDF0C56726BDB58FB039D66AC5D77C7F0E9A8617B0C69176770DA328D38171F39B5220279186250139922C0DD0F7C3F96D48615FC66DB7568810931D257B230258FFE9CB35F87859E08139EBF7432E948EE3F962BB9015CACB8499BC69597ABAE4B841B606657E2E3C51FF5A8961AD42177A9E73950E3FA150439E2063B6555624A6D8E3AF4FD5710FBE722B8C6267BA5DF56846A085C56444573D692D5412CB70E443761751E58C41953BB9FAA3CE1F4564C825A02F0E1339CD659AB1480804DD2E90E3086AAA292DB39C6E2AAF1B001B47A21CC721C0C502C46EF0479BB7D8CBDF8E9C136397FEBC2D83C0FDBB3ED4FA6868068477206A26D2B7E0D20507AECB2756B888FCF5B446217DE14EE6A20CF7E7B732FAB22CA3ABBE81B2BE18463ACAA3132773ACD7476460536111CDCAC98B1CC9B2C36AEB3FB318340F7397B4B4AD6AA87EAC94AB7D98CC12EA5606162877465FA2CAD276CBB5D36C40A0B014C53D2D3A96825E237342DFEFAA6B9456B5FF1DCA859C5976F77C3D3CBC9DF355237EE9B4B4C90A9DD941294431DB76DBB539DC48669E7AAD21808332C8A4FE98B8F043FB756B526890452FA3C3527FCD584CD33E38FF9FF783538D39A184B7B3EB649E1C04C289FB65998F6CF5D5BBB0609FC3403D85C6DF269017032CD24AC540E1B294BDD3C3A0C7117CAB02B1A0063A174FF26FCDA687433A667322320C0DEC1EA3963F3B14375882B3478AED43C2C74DEBFE3A734F8B1A5CF92007F8FB627CC3AAD5C6AE4C31846B72E7573041270FF40E762C0F8DBCEB7512D44DC260A97D5CA7D60699981ED8476D8651C35C8ED498FC2961D1E38AF46F3653630773209A63838A9222B813C23DB0CF4196D6654126BA2B1840A7180E653B3D6E10C4C7AC3CEE93B0399D918A52E59F0215B09A119E634E6E8A9886C877F157BF7B7DD827ADEDBAF03C718AE037C0B262588171839E952721DE72180F8EED00B01F53E098B82165199C53129576036FC753A3D33AEC92060DD19AA078A496A2B214B1BFBB747A1EC64071B0A078D74D0212E6203C9698C7449326A42BCBBE8D9501DB916C64307D5F1083BCC36C0FFA18C0E4410B0B17D443481C3673D17BBD7A366A5FD1C3C5B3391A02EDA7596B4F869A91A32B5A02A05611371231BE035EDC716F534724B5225E1A72A2B2CD357F4C326F1DEE963FAB680721D40DD70B750A019E70885515F43946A0DD3DD042969139F61ECA0E9EE3107D3D28AC606AD53F236303E1FE986C38825318B7C4597B14E1A83B81295FEF49FD0F2C1E14A0B146540D853DB9706CD224B376343317BF7330B0C2721A409B856304FFFE60C24C441D5E2797D4696C0FE046D305AEE93CC6A2D89A81EB19643636A8B424B310034612105DF16516CE9607CC0A2BAC5835642C6FF9572191BC45E44D9B40DA36B607F570AE8C39D490342786F31CE6764F3F7A764665B6CB93E54922C6D89DB566F494E0EE069811AC82E8132F2F388D68490CB1C2172D2979FCE3659D7076B4F457232EB839172963F8C342E2CD18969F086F451D33BB774F3D00E6FA2BE02292F2E5CAD3ADF5DEC28932BD784801E69364962BF39E25455303E1F289052D2F0CD4964E0FFCDE29E7C074E5D57E43739DFA42AAD636C352D363E3A23BDD134BAABC7CD1621CA638DED7DB7051F0456641CA872ECDB4D3C2603DDBBCE16637010E782C4BD5230992E2EE7DD904F8A83EBAA7B4C3CEE15B10794ACE894118304BCDA9E9B1376331D2248B802557AABCF913E95F783715BB5E90A4436E4BDE7D651397A70A24257C39E0516BB1F548DA36C1F1F92A416DC1114107CD863F3BFCB360286E774B21296259756EA6040CB61738EEFE29A67895AC69797C640E03F0E9E731647C2DA93373920341FDFBD50EB6B737BB0D9FDA8EC8784920407D4F41486D8FC616430768D6431CCD789DEFF332B239FFD1900800CEDD9661A55D6D96089007E9089A117F03D7858EB4C3FE2D07E91D8CAB88D2BA5421846069FA6D4E5C9161A140CC3A288100BFBE61C3B0F0E820AB12D8FC54B054A0F4C777052495B45A7D1A883E67663DCF50C2230CA5319AB31CD76435DAE41CE1EE25ECD3FA0C7E83B0168852B2CAB674127CD7BC9DDF9DD4B57EB40128988C7C8994DC6A5FC939FF957F06C70A4056E63331F9AAD254EBF2B8FCCD580285BEA486D91A0C2DBD5823AC8F6846DDABCDE25A2252F8DA1AEB32E6969276BD2A7F94CD7DD3143F3181489272B1589FD385BA844F90E35982B53141DAEAED413054CDB935F3412E31D99C1147079CB487FEEE85E3906DAED18106B8C407BBCB7716EF9D4D34E2FF04709C7457997AD6FADC55A8FA70BC907815805578A11A012C521A1325754CAE2E3F7C9E1FFFDBD4BE31DC534961C318D1A894838E0C33806735DD11E408E500995B86B6ECD20D325347F792A3381D2A45587D9B6AE0AA27533732A6C421CA621AAC42335848D9C0DD89F14EADF2F92EC532756CD5697AD752B6260C598EC9F0E9976A950B22DAEA8B74FCC87F28B5E9ED83C0339E566259ECF06E5CE209065DE87FEEE5D1E9C466004B34583D6AE89B590EAD6A96CD2951705AC764F329E28C996AD6DB05F6C69AD2A39D3EE230F6501F1760AA41FFD936C9DBF20DE3996917322D32B946062A3C27D8BF35ECDA22403AB684CDC680DD166562D018D943369CAEFB9133A4BC4515CD5F9C08E7C22D153F0A7733EB4EB2CD8A74A4C85E40DADEF6858C5927B6EEB2B01E9B7AB02F7048C8869991068B00FC19B9545AB42181DD5CB5488222A402E827F60A8D87B09ECC88350032F998E3C10A88D4733227334812EC97C5E5FA85FAEE1A1E28A58641531B139AA58BEF49780DCEAA408986CF3C40E226C60531945A20F91E5DC31EC86C9F9A0545E5FCB79A13B9AFE9B133867BA7A38152ABC6D9F8EE10090BB71E6ADC6A6C2513B066F2565138BADA60B0BD339F9BE1AADDFC90DD272B4146D0F5830C6A53E295C849C15D001176E7774FCD7619D6EF1A30BA93CFE278AB4806BBF25CE4A4E94163F614E81DFF7EFCB015997F5138E22B80B2B00AD7579CD84DB5D1C7FB16E9E8C5D9A5BA0AD0E0A7DE79C18839D673632F3D2C7DA2062EAE844FACCAF23590B2FBF1861405AC347EB9D723ECBDE54CC96BC4D8EE2178F353310E5D69230C5DB2841D2A06A3A4E03E054D99DEFC6004A6E405FA89B198A901EA1AE9F3112A29F3AEC5698A42794E04D74D761E4AA5AD23DE271969BAF124450F4796DA1EB1C01480436AB0F5D0B1B2E6717DD87EEBF137420961F978896077E40B2D2EBB5664FD8AD89BB9333FDF46C33EF3BED21BCB5B4697451BDACF364F85462F5CB9F546657B4744EDF757DAAA4D3A9A2A6F281184C3576B1DB0B540F3B36310020BC6AC0C6454A7CC8EC1182422B17BDA202729C270194CD6044210D2B98731565812339EDFE5A0DAD79BA826D8C566C7D25DEA9BFF0BADF1E4E5DA2B884966E03FADC51C6D9BCFE877511157201DAB48AED1AB038999E5CC3FE58CCD37D40050DEE92E0BD5332413A7F0118724084EE5545FB51942DF1EF399F734FB9592555B5F32290C53D7E5017EFA2B61E29FDCE90CC3E7C1B0E545425B1D3E1ACB9089DAA786CB0122DB3FF27EA0367751A5462230F0F248147EBCCBA2E16D214E9A0BAEBE989BBA020F95B623CB14ACAF2BE6F157DFDB1E32627133F0D26C7B65A189F39955EE31D9B507B43126B06B9E4524732C8621D2274438DB7ECAF736AB7257CED950EB68BB868581649232793EC83379A16F40781E76F5CC57C48C3F5C2989BEA803E1B63768436D39AD19BB77DB46AAE6E8473ED5DFEC983F49E4B8E7CA6BF476AB2F0272C0C2DBEF1BCB064D7400BFE1B9ECCE13578A20B1D5B48133A74C5C59CAE0115BC3B50574580BFA99D58BCAD336EE2CCA5B7994C784BB90CC8F1B9A0E21B39D5EBA464DE34D46AC0BBE436C2F419D60D8AB13786F9A841B52710D1B49BEC290DE317B66B6855ABE156C07619A4B998CC582E3F54A7F457F1D2839BC3EBAC937AD3EBC6A9E6E845379CF1D66D7C59000E3F6CF6823B005728A95BFB0ACD044EB35D5ADBE8933A3637887CF91EE74BB910FDCBE797B0C6B1B056500542BD39781BDF13EBFBFE949D7BA0B7F31102E63BFC6E22693F97 + +count = 91 +seed = 9564E88F336C091EAD50C893F3EAA8351FA388682F433F7A72A34731020B9C96DFCF75EF5EAE47E12684AFA51EFB49B7 +mlen = 3036 +msg = 2601A39B6D7D91DE539EF11C3B67AE3EB1607716F587BAD5F60D311A9F4FE7F04350CA085EDA6D41C4BB6C6E13E376BF8A314DDF791AE18BE2EC0544AFD3CC27BDF270C4550E9E78D497B92349AC07755BF9167B2958BDE919123439D6F49C3408E8D88021E668A0A5FB6799330188E35EC5939B77097E3737C4F664D01D85FAAD0F583B3E95EDE125587E2A79991750D5CF804325C72DC8DDF3471EE8FDE02519D2D0CA7EDD651EEE30B3BE335CCF7FB02059BC3A47EE3C056D4929EAD4FCD82C8CF49625D5DA460DAA299718556BF0F77CC5CBADB99B64C8EAD4474601FD5C79309D4E63AAC392853072619EFD7B958F0EBDE5CBD40ACD57DF269A8810776D6DFF2E637EA57ADBFAA08DF8D2581C38CB262DBB4D1F3C65A4FA068539D2056E08DCF03BAFF006EDC688023A20728B227A99FED3B8F2BCBED2E3E6ECD8B8665A2E4D233B78D7C33F6E3BD9D0A24D13C8EACCCB53A21DDA9E7A34F9A0F031091E65F749C9EBCCF3DDC4097A121D8C68EB7883405EE34F6A8B0208EA8D5A3FAB53FE2CAD1110BFA6E094F78D5314880BB67BFDFBC2DF8AA250F1D7200FF9A3247C4976DBD1BBE99DF02A3F246E5D466F85ED2F68E0B2DE06B0F2448A7B98FBCBF5872BCAE71BF0DB4E70105B020FF130141E8DE86DBE05B7D2A234CE2EA83A38E23A262E46FFBC837E8A71F657E443052E9A49DEA4E344D497DD2DE2AFB4009D681F232BFF4FEEB173546CBCC4C80C9F85B1CE125BE678E5EC62EF04433D55D4B8829B01AC165A440FCD6594F2C0CB456C8A47444AB05A0F0717B8185930D9738E885D24DAB98E11ECFF7D7A48A4527F94FC4C9D1B9D71F5E6BB39CF92B1A6D0509FFFD42E77AC9AD6F50F8FC649B96B8AC08673F78AE8D0BA2B7243452B33AAC44B06A2B9BE1AD6A12583D3590A3F9AF0E0DC35DA88A257170D315F32F3A889601D6729433B7ADE0F719386723EB2A008634749F5253CB7D9B2FC99A1AE1BBBE7F00A536CD38F8A7237D3992C3897DF412F5B1D45E1EF5B5DC974D49CF8DBF785160BC527543458FD9378B3D4D3124214AE5676185794209AD0EE73B063CBD5B7830D00F817CA0D5CBB597C44D28E4885D935B7BF426C1339C500DAF4F2033FA6A27A4196F233256650472F205D2C5E00E7087FB73027B0C6C9AC5C1D928CCD190B8A6BB33F512CA8E2369DAE6111156DE47A24469683F4721A25652FF87474DFD92A028B3EC5BCFC244CE442752A7DA1DA6C33FC22573BF0B13E371CA9FCC86C76FCF7A1654EEF4442E47399835A06336E62952770C6E61C573CFD07B3AB631B8831FE3F5DD2C6DF68EBF2F8E02EC9F6B90A371ED5E62C8463780AC453AB6F72D38C8F5212C8B650F63B98E3C0886B6A85AE8E7256C1EFB30969532CDBF72184AECBDE2A17B9811DD4222D080049C5D36C532CC0E910779D64AF93D750EE96BDA87562EBD3830FEAD07A3960CD6DE7146603199563693392D3CCE1332DF35C2C8A2C251911D38E95815CE5A4CE5596E2D77711D87CDD54D22E8F0AB431BF8B24CE9C7BD6D077E436543C70B02F338841AF0FB86B5EA4B6A47E27C1D83E1AB06801044F546ADADA437F3CE7D788A1C92A74BA540664658E70D4F2711979153FF1589792859C3BF122628479C7C35EEE951DAB8CDB0D4D150C2DA338346988D34F8C5E589B231B5E00849611BA09711BD3A0516FD515E6C4AE1E8A3657C282C8120C97AA7A2E3BAA22B6EABB8D8212A9A48E7759A9DAAA51B538F662A05FB897067B7CF9D2CEB47A1897214CCFC225CE47CD60E86F7DEA49E220F7DDD6894B30B66460DECBBCB2E42B31F4ADF0AACDDE544B9124EA5ECB04B03C448B17E8094D489F516D23164D2317D3A1332E0500F1423136C8535D69065E880AF34CF7E36DB5FF2C18122E41880585B4D188411E86B370A024BD6E28143EA2EAE52EB46BE334A21A02E21C6755C0182B9A055A7D4C7B056E4930CE63EDC79C9FB4E2FBFFC58F776086F3487F02F8D1E7C8519C7F452E75CE5686A037B3642B95D7526ACD4A81A47112CF96A8DA7548016A22E9359198E871DBCC5852FBE14EECF3CCC5EB2FB5EC31D10474DF7D63482A03E11F4AAA2EAEDB714786E21D03AF1CD644D06BB05FF7B3959601580BF50E5F7F82FF42E9CF2FFCA0C67FFC52CEDC53C7A5C9EFB6C21092DDA374D1CCCBC78BBD9F5EE0FDF6DA6AC60C95F7C2E96F17E3C379A52D5DBD1A92DD76D1F5DFA19EA0408E0E7F7867445445CFA60BCEFC016E68872FBAC9098FD6A8E84731C285570B1BEACCA6F4728958E7924F7A7B7730B9BDC9AAEBD9E045F464071843C650D06C96D487CF8397286F81D93D0CC2008A62EE32421E5231998140909474F6D98541D899EA53714AEFE652A3D792E4C72533332C3133707A49293E3B2E06AE18F2F81D601AADDAF2FD09EC59350E0979A5AE2B721771682A1BFB5748D000F9736031CA971288F34993DF10FC06A16A6DBEED8CDAAA8127F3B71432E723558F0281459820A0F4A75A3B2716F976BDEB88BE9C73F31623050D7C1A96C84988B01D847309E1B6D7B815883F83C9BDB7FCDAEFA8BA69E25B824812B7D54530A3ECC96611897661158DAE1B4AAC112E9AC13D07FDC03DC7D5AF23C08C5E4BBFF737238FD3F1C06F94215BF2351DCE9CAE14B4DD4745AC0CD626054469C6A5286FF821BA192706D47CCEBC443DD67FDDB76797A8B78DD0DAF850CB5D181C82298616E1D3A92F7FC82FD256857915773C7AD97CBB9710373299AE8516B8A1D647A13C7BE848E0269ED6C8A91DC50D0CAD21430A3BC9E718A13D1966A0182D9A24FFF7ECBC7876C868AF2BAF2D8B782172C6719CF140E8CB877FE6D78779E1BB31C70C6C9A6A77529C51CF78A5E4FBD7FF6153B5195817F80603E5C5810C38CF43CA812ECA52F73F045E33DF4E3D04EC8C5F8B4A7399F6CBBF0D39DC951C476B9BCC002720CE89F09C3885673BBA9C90D20DCCCA4A82CE5BEB38BCD60AFE2BA65FCFB01C8793B7ECC0F0B17A9DA74F2E0FEF4C90B5132FD6BAF8C010FCB5E8E7FAEAD7F2E0DB29BFDD1811072623CEE274EF2EFB0F7D4191F332AAF20CF36FF89A2EDF15F7B284CABBBEF46901271D8C1B180F736125C8A44FE164AC7E687E9A58C3B1775238BF1A11F99BCB583D0E3C44BF4F76DCF9496A06F80CA52E24D55B54AB849D3040B4798BF5292B0574672E9F844016A52A4D4E4DAD2053207BC97215BCC1BB93271C03C9AD2DFC7485EE2ED399236AA06CF9A12972E21AFDC587A6334CD1D71A7539362D714BA26214664E3B4BC39CDB1DB847583DB8E002A2AAB451B4E5BD6FE200730BFB2745D03C82B640F4CCF58701708F724EFFDF98CB04C78DF36B7A866CFD596BF5EA18445EEA0E34ED514D0DC2625039049A0CC82711DBBEDCE339C77F9FA1DC60EDDD8D58C8F144B0F3D00227AFD8710BDC66D29809728D7FBE85F08AA38AEBE5605DA29A09CC0526FEE84691EAA54DC3744BF5A95275037FA2F600B1F91E502D5D81AF48F8EC4C1834FE625FCDF2364067048727559047E07062B4D8A7D3851853BF28BE9D2C511451E5FDD9459270328A2612DBFF42E1DD34005A3DA1226A023162F454923C0337E6C74B44BB27A3B1AC82DFD68B0A6DAF93473D97A9E4591EC01A51CB6B47E2C7A85C1FFA73C35E5CE3003BC4534A2D9B16EBF9FED6464CB1E0CC665A451616A62B6A8481E4506A73883198C144A06331224D358196C815C811B103959EDCA35B26BCF86F41D9C7638547496787885EE62B14AF431CAB2AD4E0224D33476C58B8B0833BF13B50BE2B1D682CA7DD194B793AD2C6E4EE25AAF95459302F0B4DAED907A317BCC6A5F8D76CA9AA0D799F8EA39F330D6244BFB9F35E6223A0F665A65F55EAB9BCBAB446D7FCD424DCE87F234864D2C27EE84600ED9193AFEFB6E7681BC94F514FE0748EB32D32262CAB880D79CD4FE5CC963A4F688D448F2DB2DCC5B0CA87AC26DD8506512C100273B8D4D902FC054D48D8BF9EE818AD9619F68A8904B613256DB78C881CEA3373F0CBBAC336A78CD91AD9D60126E05CB8C16E9AA8482CF1B806B2F9C57BC8D63BF008AB2E49EDE8E788BF96B9F1DB2918DC5063F3F1D5B9B1C0327141ACC0B4B248FFDCB8BCC127050D27C805E154A4825DEE6BE9C8D4E42B1F5EFC1EECC6A45DBC119AFB15CCAD19789EAAFA8B1715111AE32E2ACED2278803B60E2FD63A43317498244A7CF7342342B60462510E19D83240DFF5D58E762C093DF326EA503FD347D2A92A5A4680D5E13B305671C729179FA21BE83B0D83144E63 +pk = B4B7FFD1FB04D359F1483162745DF70EB6322895920F66A2F4332BE1F3E1FA87BAA4158DC1057405D0236D805999DC48A2101AAF10BBB9A9F581FC3027785500E957DF0E95D3511288CFAEB99266E456225AA11E5A47B4690CADC10199AE3C8C6A9FC0DC958463884EF5CE43FBF4E9FF72292A24E83BCD35C6ECF1A042895B010E +sk = B4B7FFD1FB04D359F1483162745DF70EB6322895920F66A2F4332BE1F3E1FA87BAA4158DC1057405D0236D805999DC48A2101AAF10BBB9A9F581FC3027785500E957DF0E95D3511288CFAEB99266E456225AA11E5A47B4690CADC10199AE3C8C6A9FC0DC958463884EF5CE43FBF4E9FF72292A24E83BCD35C6ECF1A042895B010EF996B033EB010C9C77C950BAB148E9A7775E9D886044817513DE90E06840685EFA00000000000000000000000000000000000000000000000000000000000000CED0F810D025BAB7F79B56AB5CDF0305CF9052E4554BC5A56E88D4A05174E960B7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9383CDC10957CD38B8BC222A23B376D3BFC92782957DD64A2AFC1FEB58C384FB3EFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000053F90EACD2C221C3D8F6D717F1FFC07E2B33052D4F6D607E4AC257BD6180F4CC72B38906AFA445B7531FD28F9A25CB3EBEF30CA72AD7AFF4489D722A5FD06769BBD3BD186FFE886878C25A5B95CFDF59A28164473A9D9FBBBBDBA0664C34BBB63B247CE29CD621F2CC07A5262307AAB6FB07A9EFD71928455E75185320AFCB50890D36121D65FB89AA3349778DCC0A1336E38D31B4C36EEC487AEEFFCDE3642FD4A9BDE7F2C6F30AF027039768A1556B3AFDCB38208F9C2DD58E53E0F47F912A8047F134A7FA52382F6CD57633DF5D1B8A660E6CB192831A438AE526954A18305BF60B04AEFA58ED4EE4C032F6E123772B02596C1D9A6B5926FC608 +smlen = 3328 +sm = 6BDA4F8172AE6F3469EE167072FEF4FEE840BB273A3809FA13514E1CCB4164C8DF97988666A1C2EF7EB262C257966497EA1EF2811D3D1F278DC1047F0725A40147A28F934DB95ADC094607A03607BCEB95252857369D4295689A9B1D9D443FFC14BABCA1856DC6F0F0CD2D26EFF72B920146D7DAC7C3890A2AF494F3C21DD3000001E564018CF78104D69C6E1D834EB4606DEC23D9D48DCFC480A1D3A6838F5C4668CC20530521B90D4E83EBCC89CDB428B5E9A76ED113496AFDA3BA6FF6F0F3A421A7BC250A1E3DF8196ABAD9932607E53140A3F740534A987B4820ADE481D034364EB44490BE3C5DD918947D0E118D5E8D7F78BB1A5BF2F2A0841220CEA37419257E104EDD1C2CB0AC844D236BD99CFE8FB4D547B08E3402CBA2B5F290E4155D00060B2601A39B6D7D91DE539EF11C3B67AE3EB1607716F587BAD5F60D311A9F4FE7F04350CA085EDA6D41C4BB6C6E13E376BF8A314DDF791AE18BE2EC0544AFD3CC27BDF270C4550E9E78D497B92349AC07755BF9167B2958BDE919123439D6F49C3408E8D88021E668A0A5FB6799330188E35EC5939B77097E3737C4F664D01D85FAAD0F583B3E95EDE125587E2A79991750D5CF804325C72DC8DDF3471EE8FDE02519D2D0CA7EDD651EEE30B3BE335CCF7FB02059BC3A47EE3C056D4929EAD4FCD82C8CF49625D5DA460DAA299718556BF0F77CC5CBADB99B64C8EAD4474601FD5C79309D4E63AAC392853072619EFD7B958F0EBDE5CBD40ACD57DF269A8810776D6DFF2E637EA57ADBFAA08DF8D2581C38CB262DBB4D1F3C65A4FA068539D2056E08DCF03BAFF006EDC688023A20728B227A99FED3B8F2BCBED2E3E6ECD8B8665A2E4D233B78D7C33F6E3BD9D0A24D13C8EACCCB53A21DDA9E7A34F9A0F031091E65F749C9EBCCF3DDC4097A121D8C68EB7883405EE34F6A8B0208EA8D5A3FAB53FE2CAD1110BFA6E094F78D5314880BB67BFDFBC2DF8AA250F1D7200FF9A3247C4976DBD1BBE99DF02A3F246E5D466F85ED2F68E0B2DE06B0F2448A7B98FBCBF5872BCAE71BF0DB4E70105B020FF130141E8DE86DBE05B7D2A234CE2EA83A38E23A262E46FFBC837E8A71F657E443052E9A49DEA4E344D497DD2DE2AFB4009D681F232BFF4FEEB173546CBCC4C80C9F85B1CE125BE678E5EC62EF04433D55D4B8829B01AC165A440FCD6594F2C0CB456C8A47444AB05A0F0717B8185930D9738E885D24DAB98E11ECFF7D7A48A4527F94FC4C9D1B9D71F5E6BB39CF92B1A6D0509FFFD42E77AC9AD6F50F8FC649B96B8AC08673F78AE8D0BA2B7243452B33AAC44B06A2B9BE1AD6A12583D3590A3F9AF0E0DC35DA88A257170D315F32F3A889601D6729433B7ADE0F719386723EB2A008634749F5253CB7D9B2FC99A1AE1BBBE7F00A536CD38F8A7237D3992C3897DF412F5B1D45E1EF5B5DC974D49CF8DBF785160BC527543458FD9378B3D4D3124214AE5676185794209AD0EE73B063CBD5B7830D00F817CA0D5CBB597C44D28E4885D935B7BF426C1339C500DAF4F2033FA6A27A4196F233256650472F205D2C5E00E7087FB73027B0C6C9AC5C1D928CCD190B8A6BB33F512CA8E2369DAE6111156DE47A24469683F4721A25652FF87474DFD92A028B3EC5BCFC244CE442752A7DA1DA6C33FC22573BF0B13E371CA9FCC86C76FCF7A1654EEF4442E47399835A06336E62952770C6E61C573CFD07B3AB631B8831FE3F5DD2C6DF68EBF2F8E02EC9F6B90A371ED5E62C8463780AC453AB6F72D38C8F5212C8B650F63B98E3C0886B6A85AE8E7256C1EFB30969532CDBF72184AECBDE2A17B9811DD4222D080049C5D36C532CC0E910779D64AF93D750EE96BDA87562EBD3830FEAD07A3960CD6DE7146603199563693392D3CCE1332DF35C2C8A2C251911D38E95815CE5A4CE5596E2D77711D87CDD54D22E8F0AB431BF8B24CE9C7BD6D077E436543C70B02F338841AF0FB86B5EA4B6A47E27C1D83E1AB06801044F546ADADA437F3CE7D788A1C92A74BA540664658E70D4F2711979153FF1589792859C3BF122628479C7C35EEE951DAB8CDB0D4D150C2DA338346988D34F8C5E589B231B5E00849611BA09711BD3A0516FD515E6C4AE1E8A3657C282C8120C97AA7A2E3BAA22B6EABB8D8212A9A48E7759A9DAAA51B538F662A05FB897067B7CF9D2CEB47A1897214CCFC225CE47CD60E86F7DEA49E220F7DDD6894B30B66460DECBBCB2E42B31F4ADF0AACDDE544B9124EA5ECB04B03C448B17E8094D489F516D23164D2317D3A1332E0500F1423136C8535D69065E880AF34CF7E36DB5FF2C18122E41880585B4D188411E86B370A024BD6E28143EA2EAE52EB46BE334A21A02E21C6755C0182B9A055A7D4C7B056E4930CE63EDC79C9FB4E2FBFFC58F776086F3487F02F8D1E7C8519C7F452E75CE5686A037B3642B95D7526ACD4A81A47112CF96A8DA7548016A22E9359198E871DBCC5852FBE14EECF3CCC5EB2FB5EC31D10474DF7D63482A03E11F4AAA2EAEDB714786E21D03AF1CD644D06BB05FF7B3959601580BF50E5F7F82FF42E9CF2FFCA0C67FFC52CEDC53C7A5C9EFB6C21092DDA374D1CCCBC78BBD9F5EE0FDF6DA6AC60C95F7C2E96F17E3C379A52D5DBD1A92DD76D1F5DFA19EA0408E0E7F7867445445CFA60BCEFC016E68872FBAC9098FD6A8E84731C285570B1BEACCA6F4728958E7924F7A7B7730B9BDC9AAEBD9E045F464071843C650D06C96D487CF8397286F81D93D0CC2008A62EE32421E5231998140909474F6D98541D899EA53714AEFE652A3D792E4C72533332C3133707A49293E3B2E06AE18F2F81D601AADDAF2FD09EC59350E0979A5AE2B721771682A1BFB5748D000F9736031CA971288F34993DF10FC06A16A6DBEED8CDAAA8127F3B71432E723558F0281459820A0F4A75A3B2716F976BDEB88BE9C73F31623050D7C1A96C84988B01D847309E1B6D7B815883F83C9BDB7FCDAEFA8BA69E25B824812B7D54530A3ECC96611897661158DAE1B4AAC112E9AC13D07FDC03DC7D5AF23C08C5E4BBFF737238FD3F1C06F94215BF2351DCE9CAE14B4DD4745AC0CD626054469C6A5286FF821BA192706D47CCEBC443DD67FDDB76797A8B78DD0DAF850CB5D181C82298616E1D3A92F7FC82FD256857915773C7AD97CBB9710373299AE8516B8A1D647A13C7BE848E0269ED6C8A91DC50D0CAD21430A3BC9E718A13D1966A0182D9A24FFF7ECBC7876C868AF2BAF2D8B782172C6719CF140E8CB877FE6D78779E1BB31C70C6C9A6A77529C51CF78A5E4FBD7FF6153B5195817F80603E5C5810C38CF43CA812ECA52F73F045E33DF4E3D04EC8C5F8B4A7399F6CBBF0D39DC951C476B9BCC002720CE89F09C3885673BBA9C90D20DCCCA4A82CE5BEB38BCD60AFE2BA65FCFB01C8793B7ECC0F0B17A9DA74F2E0FEF4C90B5132FD6BAF8C010FCB5E8E7FAEAD7F2E0DB29BFDD1811072623CEE274EF2EFB0F7D4191F332AAF20CF36FF89A2EDF15F7B284CABBBEF46901271D8C1B180F736125C8A44FE164AC7E687E9A58C3B1775238BF1A11F99BCB583D0E3C44BF4F76DCF9496A06F80CA52E24D55B54AB849D3040B4798BF5292B0574672E9F844016A52A4D4E4DAD2053207BC97215BCC1BB93271C03C9AD2DFC7485EE2ED399236AA06CF9A12972E21AFDC587A6334CD1D71A7539362D714BA26214664E3B4BC39CDB1DB847583DB8E002A2AAB451B4E5BD6FE200730BFB2745D03C82B640F4CCF58701708F724EFFDF98CB04C78DF36B7A866CFD596BF5EA18445EEA0E34ED514D0DC2625039049A0CC82711DBBEDCE339C77F9FA1DC60EDDD8D58C8F144B0F3D00227AFD8710BDC66D29809728D7FBE85F08AA38AEBE5605DA29A09CC0526FEE84691EAA54DC3744BF5A95275037FA2F600B1F91E502D5D81AF48F8EC4C1834FE625FCDF2364067048727559047E07062B4D8A7D3851853BF28BE9D2C511451E5FDD9459270328A2612DBFF42E1DD34005A3DA1226A023162F454923C0337E6C74B44BB27A3B1AC82DFD68B0A6DAF93473D97A9E4591EC01A51CB6B47E2C7A85C1FFA73C35E5CE3003BC4534A2D9B16EBF9FED6464CB1E0CC665A451616A62B6A8481E4506A73883198C144A06331224D358196C815C811B103959EDCA35B26BCF86F41D9C7638547496787885EE62B14AF431CAB2AD4E0224D33476C58B8B0833BF13B50BE2B1D682CA7DD194B793AD2C6E4EE25AAF95459302F0B4DAED907A317BCC6A5F8D76CA9AA0D799F8EA39F330D6244BFB9F35E6223A0F665A65F55EAB9BCBAB446D7FCD424DCE87F234864D2C27EE84600ED9193AFEFB6E7681BC94F514FE0748EB32D32262CAB880D79CD4FE5CC963A4F688D448F2DB2DCC5B0CA87AC26DD8506512C100273B8D4D902FC054D48D8BF9EE818AD9619F68A8904B613256DB78C881CEA3373F0CBBAC336A78CD91AD9D60126E05CB8C16E9AA8482CF1B806B2F9C57BC8D63BF008AB2E49EDE8E788BF96B9F1DB2918DC5063F3F1D5B9B1C0327141ACC0B4B248FFDCB8BCC127050D27C805E154A4825DEE6BE9C8D4E42B1F5EFC1EECC6A45DBC119AFB15CCAD19789EAAFA8B1715111AE32E2ACED2278803B60E2FD63A43317498244A7CF7342342B60462510E19D83240DFF5D58E762C093DF326EA503FD347D2A92A5A4680D5E13B305671C729179FA21BE83B0D83144E63 + +count = 92 +seed = 4D0788DE958A707899D5DCC02F756A10DEA2EFE0214F5E01B3281DF4E013CA75523ECEC64723D6C8BEC0B92C4F821D8F +mlen = 3069 +msg = 9163116C86E64D90D35CB216FED71BDBE6A0797A48CB915F5A40FC8D31AD340767058B28CFF0C240720327E12E653C1F98B5755D8000BC01324DB2820781B94C4434FDA76223845E0613E2526A95F28FB4A768B1487AA34DADB28CBE8DF4FDB510DFFE672FF004F37C7AC32072A24C0F12A050BB396AD56346F4E0BA75C0EFAC162288A7EE8A63255DBA5CF451A0932FD56B05E40EDD491293E045A6081F6586BDCA10B41A6970D8F9A7B3B6B58AA772EEFA9ED22C9A24A384D6947770862BE4FE45C5E0E56FA4D116B79699ACE41E5D9F2E4C245059CD798DD986A3763F527E0C9D5A88A09C4D76D447348509FA7D9BFBF3DEA59EA57711A3B1A9352123D4A74DF273FA24A89BCAB42A6D455B5FE3C503F1FF638280F87C740B9E4C5FF20133CBDFB8D08CAEB7DE9F26811D437E6EC8C3143C0419C2F5135D25C7F40C7908C03F295FD26F1A03FBC7285196BE40ADC6FBDDDC912B3BC94B0BCE08DBC2185EE3CB766325068DB55C31FFEBE4B1F6848AD4FC201A5FD056916A397ABE6A66FF9BB03B037B50AC509E46CA441ED45812E3334FD7036D190A7991E55CB817EC2A63CD800F293277E7D15F086618B55AD395C614D168FCEDFB274FDF4FCD50CB976F68A266C5365E02A1ED0221BA4E13E70304824F94251249CA23C089B4D54E02EA03FB7C9841DD30404428AAB2519D68CF564D75D18530C7D062496C120A8F5305AAB23AE52255EC919EB0CD875422B144BF47F7472349558E746B0EB5493F1FC40ABDADD2ED84A8B31221A485052369FD0B552972C9FAEB1A78E826BA4DFB9E91E301DB589E9D7C256E7051692C48534C6A5E2BF0F45B78ACA66D5F53E549827E15D64E2F294F93D43B9F36BEDCE6CEBC05E56CED3F846635AE3C384C3FD55B969CA31E8C625103C2B24E7EE45E92984CA23A331C5B14281B20116069C619D82D6080C6FE35C3A3FB2E73B695CAD9C5D3300814FD65738DCC3EAFCEFCD24361AAD13A25B3570D2D509FA449612BDB5B49E0605D7EB78449D1DB40660AF0F3D8BCD4869B6F175CD28AD72FE2668C3DFC1D4963D0EAB309DD50B74B9D2947F86FBE9864AE5D0DC69B55B182AC1D914B11F631193F5F1F897CE52CEE97D7AE95631FC2F2A1AE9B672165432EB2E5633B55185AFA5E883268D8503AEC10774D25D39C800B74405414FB06C55B8C48835577884D6B4F2F128246563066F8F34D76213E0720E899FC1F11A3B0A591885D82C688E40D6B44B54D6C7C6973156E2DD50C40A28D2EBBA60F5117D64646CAEF72974F4B8362E4820EC04F2F373DA8D883AF27518567688146F16BF4E10969E70BE8ACE5D2FF6A135DB1DD738907EA355FB6D243904F6427D11592672060DA14443B55A9089167FC9D5EFB2C64B0069795C341F90DAFF684E566611EA87BC40A4C45F22C23AB6888A754B89E4C95BB54629CE74EC999889C82714B5AEC703DE7BC080B0D2E622ED53B645688CE164ECDFF4ED66C86049B2F9077F2A94CD685294F8EA9CBC1DE29A48D39F6B308288DFDB47731E39644B576A298646752F5C53D7943A5D0F7DBBC9604902B61B8EDEFEB5AB7E5BFDBC1E6723E6047894547E440E918038CC13B47424CCFE1A207E08A40524B553C750683F5F6C960F05836FB9B28C59E1B471FD5331F1811DDF3EAFF73798B7FFD6C9714978988C440CA906B4782A410372D70EE65A0A803061708003688F576E2D3A22580B706149A24B93A162BE9F1B546680A1DB2A8E54A576C28B4772C50A55161B2994514369C2192B2C90017CC8282F41D28099F38B2F1F0D2C0E46B444417A2078755591F00F01DF0CE72B1D1BD255A14D2BF67AB3E630F95A5DA9BD9E10F08EFBF6FE722CF000C32460FA3271F18B39EAA4487C1DDF828B6BEDF4523837BB3425BA1C1606E8D5D1E6182AA6A74F068F3E90B42641347CA755779216AFBC99603391FCEF4E8E5AA202BDCA24B83FF42F4F01232D3F2831CDA2DB76FB93A4CF6E9EFB71B5438A4B74C3190A8901D73566C50727559BA9BF6317D116E8F5536BACF064D3F86282E0F88DD40B63E75519C6A8E5664AF8E1029FAE87930F523E4DC7C2DD6DC3296A42A59F178D438866D929A70951BED05533EB1D818B7C7C595971C26B1D436D26897D6A6EB036A13511AC4A3BD724F2CA57FEF07D2C0730800D35683D745125F4237ADD64B538B7DAB0D0F258DAF7DE1A74F74A2FD010CDEE810F514FCF6045F0CC84E2054B5F4EC2772718FFB4CCA9C9BE77F8F007333860180D60EE4DD8CE976E63FF49AA11DD42FE6946515E59DA3E602B1861BD3F63C89362BCFE8438BC71959A617D8D63331A3D903BC5734B777FB14F7A2B063D79EA8637AC52C758EF88DF217B95FA8FDF1009AB28D8A4F318F78772568CC7AA9E3B3E001C0111B1751B698EF1B66383D6B3CA942FE4F66FC97613CFBBC03EEC9D0B7E08F80939D9A2EA1F72BDA7B0D655AC3A94B4C699D3EB1BBD6076E63EF5C1FE9CE258B55D21164CA7EE03BB53D8BA4306F695E648093542D769DA95A35FF3A2C071DD8ABD5A82E217D82317065D50A87B689AE3A2EC7887957BB243373CF986490961220EA61EBE12AC0287B185070E124FC518C300620B4B6D4F29402B18C2462A7985C00E2A87691053B1FDECB7AA264F33E27C6B201CA6065EF79E5266513AEA92E8D3E646453C089B5EBA66D14BC45844D0240D2E7737C16668FD53E38A93D6003146019777C03644C300D06927EF6994AC794914EFC5BE0CA81680CA8C9752908FBD2D56D7FD1FC1C76EED755408F1D7802F0D3D0F347D82B162EE6F0A2A890E083C20B822FA6C4AD627F4AB5D1526D83D897C244D6ED4A427B23B4A0C19F4E8889257C1373764AB7063B5DB8ED9C2443CB012381A2B3365EB568649D7CCD52271F25FD22FDC397E4C9C536EBB452CD2CD10DC5010BF433F88CB58D2B9EDF2BCBFA83B782FFD4388F1BCE3F8F9AF5AE6BE590BDCECB1BFEA846D2F0199ECCDB0C7E4D419F69B6A428EAEB462B67AA40340417BDFEBB6039AAB8242E39F6C11EC136D73FB315CF71414A2A1203AF08FDEE34ED0072C27462395815F7779012A41EC526BE53DA954E1F7A7EBBB68FEB15CBAEA8ADD6CD0F2FE3D3615991AB54F4C7884E8A80A9535F13BE2ED944B3BB315DE8AF2A70439294CD53F041F41D3562BE840C78EFCB08661B1731FEEC46A9091ECEDE3A9FBC2DAE42C72EBDD84308E95644373595DB62157DBA7DBF124BB45DE6C2837B0066673BFD215FF915A8D41637EEB029C345E444251ECBBCDF79E246A80AA4591976A00DA06C759C6160ED1986F8E15A562417DA55109174628E7B11D49586882851205755B4F99A875AB3599FDCC094E4A2164E1764D24DE805FD7B20EFEF2A8E23FEA4E206DFA1FD9C31D90C1FECF745D3EB886190827D952703AA6A99B5000D8EE9D51DE94A82DD053B6AA89CD7E94E92D4AA93A9224D3F688B5C834A53F2993638166A3DE78ABA7CB930CC5845F9915E6523683715A187E940FA2A978B5CA4C3B80DB62E96A600F1864BF0B1AAC23B1330B13EADD3A2F07CE7181D0A9497C455D228278E5CC3E4C00A2EA3EB8E5B9CE2799256302B0F8F1F829D3A3AE8AA7CC4EA229C5AF476C01B8D48A9F6987DF57C3469B6EF6DFCB488A3D5B91FE17B5798FE154AB8399A2E75F0D15B2A6AA91302056266B22A38A604EDC374E2D2155ABCA119C11DC6827A47E3CEE7032F6E0F59708DFACE221E47041CFFC59CE0334D9B7C5E91C2C320A70EC2F32906624128363C893909F47BD970DF652D5E6C2324033F32B1653A039F8C051D9DC8F839C50F5696E9E08F7F1CDAC4750B429AF03176FF6E643ECA1D8FC710C6CDB0D26074D85316F4C9084D5F453F6D36C1CEA0E389F3462E1478E2503C1DB99FC46F3F0627F173672C21F3CC3B483998192E81EFA689819D0007762ADBD141A058587E030A3568E412D25662C40ACDAFC3C6EE30C10CC23E3DDEDB6C73085C90C89B1218D67A328F06C3637A786D4715CB9F9D8B0B22D920B68B0557CC80A56FCE0B6E2D6627DE576E308757A8F37821898E96785AE323E413D3572205B0A5710143A2621C258C76C7C3FF7100A2FCAE99C84D1AB1CECF7FC5B1E4698BFA3BA2A0856A65F2D4F291A4A164C0381D70D1213F7E40FC4BA42C43EA8E70043E27C5AB0827559B7CF7F2587D0D2F93C6382CF54E92764D815280D68C554E5B6FBB351BD18635786299DDE39FCAF3EFA708A3F18701EDA1579BFB0BEE4FA1F1ED6E09D450D427E4B91F4552F87F31F06F109E74AF4BF301481452AAFA2146F6375DA467EA008BAFC3C8408AADD61B07C28C55249EC0C8BFDB00EA +pk = 8817CF0B031E55E105B2E2E368E4526759435E23FB9C6E34CD4E5F5F2C0BB651A42DC7FD91BC1E0CD9CA21158BBB2F3E7C41F0E6BA10E73110987E63BC374F006301AE082CAB9F78875501509848BB4972AA5C5F91A7FAF33663602AE78A75F292769E0BB66A9033BC24DBA9FDE54F0CD276C6F814B07060D53A128C2902490004 +sk = 8817CF0B031E55E105B2E2E368E4526759435E23FB9C6E34CD4E5F5F2C0BB651A42DC7FD91BC1E0CD9CA21158BBB2F3E7C41F0E6BA10E73110987E63BC374F006301AE082CAB9F78875501509848BB4972AA5C5F91A7FAF33663602AE78A75F292769E0BB66A9033BC24DBA9FDE54F0CD276C6F814B07060D53A128C2902490004DD6681345EE93EB8C524DABAEA6328F312703B20D141C21CEA4D9C215997409182000000000000000000000000000000000000000000000000000000000000008A99540BF764C262808B636136C60739687324E0E5E2F7400401D6416DFC7B9E1DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2FFE27F2E10324EC00C223564DB318C99AF3FA5A1F325FA4BE484342B91738893EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F9E1BC180A6127966A11015058CE0D9D00544B1B0B70CE377F61E34E37BF0FA7ADE0D8652E92229F4F4F8717C8AD5494256900EAD22997A7F87637498949058ED180A019D8F2CE2D3AD3260F19ED23579971F0A27CA58B48D049B2361CA1ACAC5D4098AAEA016A1B4621FEC1B5C20BE38CD59D0112666BC5B58BA46A01017D5F488649CC7B7B227F6F30E439F86F438C2896AC6F6AE60D868C2AAF8BBB8593648D6360529737C9B63EA88D65CE4540D5A6566645287716F7CD199C9507E9F228A9070EFA5D67E8F85EF1CC251292F44C67205D88602707E0FECE0E9E7C740C8A7CD12DA64857FE6EF4760BC2C9763258824C2339F2E89B13614B5304 +smlen = 3361 +sm = DCCD45F5E653A884B0101713B937C7257DA31C1C8FCE92F7E374811620D434266396D784E3E1A86567254B75D6E5BDEA780F3808D2A2BEC1CEE291304665D5003BE63F35BED0DEF9772718782EF15713540D6342CF0336B837362491E8B62916ABBA6CF01979CBD9EFB945C6BD2380F84EDE19434EED6F5B13B7773370BD54010003182E2D7036BFC5A49F338A793DE577A3D3AD8163AE1D3644785852BBA7DD47439D8C6763BCBC32F0CEA50837BC2F43164283BFA077DBBA54F18D811390A43A1408EA666D3CEF4014C5BC9F40AFBAE4774BC984AD27A08EEEA820D5A3DDD8CE51460A4D406E92795FCC3EED89CD99F75495011F0F8D670AE81784998CCD49372726F9F034849BD4899BF5111618CDD14DB530C936B6CC4BA3DA519EFF55167B0002099163116C86E64D90D35CB216FED71BDBE6A0797A48CB915F5A40FC8D31AD340767058B28CFF0C240720327E12E653C1F98B5755D8000BC01324DB2820781B94C4434FDA76223845E0613E2526A95F28FB4A768B1487AA34DADB28CBE8DF4FDB510DFFE672FF004F37C7AC32072A24C0F12A050BB396AD56346F4E0BA75C0EFAC162288A7EE8A63255DBA5CF451A0932FD56B05E40EDD491293E045A6081F6586BDCA10B41A6970D8F9A7B3B6B58AA772EEFA9ED22C9A24A384D6947770862BE4FE45C5E0E56FA4D116B79699ACE41E5D9F2E4C245059CD798DD986A3763F527E0C9D5A88A09C4D76D447348509FA7D9BFBF3DEA59EA57711A3B1A9352123D4A74DF273FA24A89BCAB42A6D455B5FE3C503F1FF638280F87C740B9E4C5FF20133CBDFB8D08CAEB7DE9F26811D437E6EC8C3143C0419C2F5135D25C7F40C7908C03F295FD26F1A03FBC7285196BE40ADC6FBDDDC912B3BC94B0BCE08DBC2185EE3CB766325068DB55C31FFEBE4B1F6848AD4FC201A5FD056916A397ABE6A66FF9BB03B037B50AC509E46CA441ED45812E3334FD7036D190A7991E55CB817EC2A63CD800F293277E7D15F086618B55AD395C614D168FCEDFB274FDF4FCD50CB976F68A266C5365E02A1ED0221BA4E13E70304824F94251249CA23C089B4D54E02EA03FB7C9841DD30404428AAB2519D68CF564D75D18530C7D062496C120A8F5305AAB23AE52255EC919EB0CD875422B144BF47F7472349558E746B0EB5493F1FC40ABDADD2ED84A8B31221A485052369FD0B552972C9FAEB1A78E826BA4DFB9E91E301DB589E9D7C256E7051692C48534C6A5E2BF0F45B78ACA66D5F53E549827E15D64E2F294F93D43B9F36BEDCE6CEBC05E56CED3F846635AE3C384C3FD55B969CA31E8C625103C2B24E7EE45E92984CA23A331C5B14281B20116069C619D82D6080C6FE35C3A3FB2E73B695CAD9C5D3300814FD65738DCC3EAFCEFCD24361AAD13A25B3570D2D509FA449612BDB5B49E0605D7EB78449D1DB40660AF0F3D8BCD4869B6F175CD28AD72FE2668C3DFC1D4963D0EAB309DD50B74B9D2947F86FBE9864AE5D0DC69B55B182AC1D914B11F631193F5F1F897CE52CEE97D7AE95631FC2F2A1AE9B672165432EB2E5633B55185AFA5E883268D8503AEC10774D25D39C800B74405414FB06C55B8C48835577884D6B4F2F128246563066F8F34D76213E0720E899FC1F11A3B0A591885D82C688E40D6B44B54D6C7C6973156E2DD50C40A28D2EBBA60F5117D64646CAEF72974F4B8362E4820EC04F2F373DA8D883AF27518567688146F16BF4E10969E70BE8ACE5D2FF6A135DB1DD738907EA355FB6D243904F6427D11592672060DA14443B55A9089167FC9D5EFB2C64B0069795C341F90DAFF684E566611EA87BC40A4C45F22C23AB6888A754B89E4C95BB54629CE74EC999889C82714B5AEC703DE7BC080B0D2E622ED53B645688CE164ECDFF4ED66C86049B2F9077F2A94CD685294F8EA9CBC1DE29A48D39F6B308288DFDB47731E39644B576A298646752F5C53D7943A5D0F7DBBC9604902B61B8EDEFEB5AB7E5BFDBC1E6723E6047894547E440E918038CC13B47424CCFE1A207E08A40524B553C750683F5F6C960F05836FB9B28C59E1B471FD5331F1811DDF3EAFF73798B7FFD6C9714978988C440CA906B4782A410372D70EE65A0A803061708003688F576E2D3A22580B706149A24B93A162BE9F1B546680A1DB2A8E54A576C28B4772C50A55161B2994514369C2192B2C90017CC8282F41D28099F38B2F1F0D2C0E46B444417A2078755591F00F01DF0CE72B1D1BD255A14D2BF67AB3E630F95A5DA9BD9E10F08EFBF6FE722CF000C32460FA3271F18B39EAA4487C1DDF828B6BEDF4523837BB3425BA1C1606E8D5D1E6182AA6A74F068F3E90B42641347CA755779216AFBC99603391FCEF4E8E5AA202BDCA24B83FF42F4F01232D3F2831CDA2DB76FB93A4CF6E9EFB71B5438A4B74C3190A8901D73566C50727559BA9BF6317D116E8F5536BACF064D3F86282E0F88DD40B63E75519C6A8E5664AF8E1029FAE87930F523E4DC7C2DD6DC3296A42A59F178D438866D929A70951BED05533EB1D818B7C7C595971C26B1D436D26897D6A6EB036A13511AC4A3BD724F2CA57FEF07D2C0730800D35683D745125F4237ADD64B538B7DAB0D0F258DAF7DE1A74F74A2FD010CDEE810F514FCF6045F0CC84E2054B5F4EC2772718FFB4CCA9C9BE77F8F007333860180D60EE4DD8CE976E63FF49AA11DD42FE6946515E59DA3E602B1861BD3F63C89362BCFE8438BC71959A617D8D63331A3D903BC5734B777FB14F7A2B063D79EA8637AC52C758EF88DF217B95FA8FDF1009AB28D8A4F318F78772568CC7AA9E3B3E001C0111B1751B698EF1B66383D6B3CA942FE4F66FC97613CFBBC03EEC9D0B7E08F80939D9A2EA1F72BDA7B0D655AC3A94B4C699D3EB1BBD6076E63EF5C1FE9CE258B55D21164CA7EE03BB53D8BA4306F695E648093542D769DA95A35FF3A2C071DD8ABD5A82E217D82317065D50A87B689AE3A2EC7887957BB243373CF986490961220EA61EBE12AC0287B185070E124FC518C300620B4B6D4F29402B18C2462A7985C00E2A87691053B1FDECB7AA264F33E27C6B201CA6065EF79E5266513AEA92E8D3E646453C089B5EBA66D14BC45844D0240D2E7737C16668FD53E38A93D6003146019777C03644C300D06927EF6994AC794914EFC5BE0CA81680CA8C9752908FBD2D56D7FD1FC1C76EED755408F1D7802F0D3D0F347D82B162EE6F0A2A890E083C20B822FA6C4AD627F4AB5D1526D83D897C244D6ED4A427B23B4A0C19F4E8889257C1373764AB7063B5DB8ED9C2443CB012381A2B3365EB568649D7CCD52271F25FD22FDC397E4C9C536EBB452CD2CD10DC5010BF433F88CB58D2B9EDF2BCBFA83B782FFD4388F1BCE3F8F9AF5AE6BE590BDCECB1BFEA846D2F0199ECCDB0C7E4D419F69B6A428EAEB462B67AA40340417BDFEBB6039AAB8242E39F6C11EC136D73FB315CF71414A2A1203AF08FDEE34ED0072C27462395815F7779012A41EC526BE53DA954E1F7A7EBBB68FEB15CBAEA8ADD6CD0F2FE3D3615991AB54F4C7884E8A80A9535F13BE2ED944B3BB315DE8AF2A70439294CD53F041F41D3562BE840C78EFCB08661B1731FEEC46A9091ECEDE3A9FBC2DAE42C72EBDD84308E95644373595DB62157DBA7DBF124BB45DE6C2837B0066673BFD215FF915A8D41637EEB029C345E444251ECBBCDF79E246A80AA4591976A00DA06C759C6160ED1986F8E15A562417DA55109174628E7B11D49586882851205755B4F99A875AB3599FDCC094E4A2164E1764D24DE805FD7B20EFEF2A8E23FEA4E206DFA1FD9C31D90C1FECF745D3EB886190827D952703AA6A99B5000D8EE9D51DE94A82DD053B6AA89CD7E94E92D4AA93A9224D3F688B5C834A53F2993638166A3DE78ABA7CB930CC5845F9915E6523683715A187E940FA2A978B5CA4C3B80DB62E96A600F1864BF0B1AAC23B1330B13EADD3A2F07CE7181D0A9497C455D228278E5CC3E4C00A2EA3EB8E5B9CE2799256302B0F8F1F829D3A3AE8AA7CC4EA229C5AF476C01B8D48A9F6987DF57C3469B6EF6DFCB488A3D5B91FE17B5798FE154AB8399A2E75F0D15B2A6AA91302056266B22A38A604EDC374E2D2155ABCA119C11DC6827A47E3CEE7032F6E0F59708DFACE221E47041CFFC59CE0334D9B7C5E91C2C320A70EC2F32906624128363C893909F47BD970DF652D5E6C2324033F32B1653A039F8C051D9DC8F839C50F5696E9E08F7F1CDAC4750B429AF03176FF6E643ECA1D8FC710C6CDB0D26074D85316F4C9084D5F453F6D36C1CEA0E389F3462E1478E2503C1DB99FC46F3F0627F173672C21F3CC3B483998192E81EFA689819D0007762ADBD141A058587E030A3568E412D25662C40ACDAFC3C6EE30C10CC23E3DDEDB6C73085C90C89B1218D67A328F06C3637A786D4715CB9F9D8B0B22D920B68B0557CC80A56FCE0B6E2D6627DE576E308757A8F37821898E96785AE323E413D3572205B0A5710143A2621C258C76C7C3FF7100A2FCAE99C84D1AB1CECF7FC5B1E4698BFA3BA2A0856A65F2D4F291A4A164C0381D70D1213F7E40FC4BA42C43EA8E70043E27C5AB0827559B7CF7F2587D0D2F93C6382CF54E92764D815280D68C554E5B6FBB351BD18635786299DDE39FCAF3EFA708A3F18701EDA1579BFB0BEE4FA1F1ED6E09D450D427E4B91F4552F87F31F06F109E74AF4BF301481452AAFA2146F6375DA467EA008BAFC3C8408AADD61B07C28C55249EC0C8BFDB00EA + +count = 93 +seed = 55A9C7A0B49706090BC0702ECFC070AB060427FFC820C3FE05B499B59AEB125F2DB4787A5910B88C6F8FAF0A69BE0AE5 +mlen = 3102 +msg = 02C7C4451DA90503C43FDED1CCB3DEE468A6A8D9E56670CD8F6A58E7941F1BC5EFA6E2AFDC0141A2F7E8F781D79E70B4813263A9DBC8D8A67F89371CFBD90977EC96461B28BEE4C644F2C91E96257B1909B84ECB25CF438A3FD6B835E20D5CDA56A1FB7995FCAA0EE1B5327FB1288E3C57CBEF0554CA5AD6FCD1F1865C6AEC6CBDB24495700AB5AAF078D8516CA4FA3A231A97C77BD150B127CDBFB42C03702C9027B2A5F6594B022EF55B63BF3EEC27EB0E9529ECCDC82BC6AD1F011F167D602EF1F175DA5DB4028BF08A053AF2C728ADE93B37EDC2A75B7B6C6CF38CD1C07F359C73B131B13DF76139DEE6795F1D85B47F29AE97D0E40CF5DBB67360044F78940A1E80D9D99FD5AB0185210D8769911BC471650DF0FCB9C3AF038F7882F677790E146E612FCDD6FB89F90B7E5E46CD648F4BF8F736D69F8A91E4806346B4366FD48D1481C0B47ADD82003310B0A99B779D63EDE1771F50221651B2D8AF40F48B92EE1327C85A1D2EF2D86378076BEB58556FCAEC6029649A0EA5FDE517A85D87704210E071FCB6F63317AEAC3EB3E9746018E1028C50C790A45B1BEDA6EEA2D646DCE401AD5D7850A5F69CD85301920DE77AB0D01B1361EFA3E70AC05881BC02190720ACC75A691D6064F9D24C79DC72476309E58CDDF5FB2A253D857A79C8E898AB6ADC300EAAF208820CB02F5F2CD317F4052D40DE28E52C55A0349DD855D64E8DA8296D4F572281E221A3D27EF76FEE67FBE5484E6460C99950763B801FCE828E93D2A633A1CA5D7EC582D7C463DA5A9AA8056BB2173306F3820BD0A3273742789B61AF89CCC42B81CC68745800D2A59231D5D28E832F443A871DE5B6B10B58A8AA7CC9816014D7F3545DDF1F481B7F0C9DD41B4D96E5DB767B74776C2253FA230DF65F3E0B944B95ECD4138E2847418B084D9F9E0798CB5247238EC12B88C10A5C0C645E1D09D09059C72E33C28A472FDD8B88EAA93C63BE7D980A12195C2EC3105DF2BB81CC9C3009F7771B6B813CD12303E3A9961D6731AF55ECFE5127BAC68D06F835DD5F2D584FC0E648C3A4256E2A3D4B81966010964657F33D1FE0400724C488D5AACF9F2C0B802CD812C8452E5B8E2B17FF4A1289D33FC405F5DB4ECAB4A73FCA3634756DFBF9012C413B6F64788FD0F68F8AB7620477ACD3C14009377F3DD54B9EAF2784433D63341323F54D113FD63D7456AFEF885F13C13172A37A5DC82336B9515F8F7F4903EF6DBE9CB34930743B6ED11265CF94AAF406DEA9802D17BCB369AD0D9964792F74D338DAFE47EE88B3B74EBA8E70774EDC1F16FA876FD62B0BFF880CE252EE4435B1DEBF36F0A06A4FB406F01D618C135E6103E2A39F4C9CF41EC93702BA76BA753AB49B5836C20F67D05943EDDDF47AB8C5B81F4BC22D773305076F7E5B697A7B25B016190072F756F19F397884E0521595326CA591672684A3BE17C9F5CC8E8F4848F7136762178FBDCC7BC6A6C6A31345FEE687B0505F72BF1AB7EB87BFE5F896CFD42DD67A239C70648B39BC0C84DA33CA17838FB4213C38B68F22914FEC3DC50194E883720719E9B5F8D037DEBB726DBD899ABD97853C54B0BC347A322BFAF961C6CD6209C98AA81B8E2595FC151B1375BF4FCA2DFF49DF40A3D1C694EDFF6E9687E73EF62DD42AD7A05195A7F206F097196AA0E4D68F8132D4A00CEDED940C4F6AE02E6D3763073462C7A4BB11778290E744471EC554A05917E52C5263FF02C07BEE055234EEE10B79175DC164AB2051B03598DF1D4311E87ACF4AEC45C55B1A58B0F05EBDABE248A27C0187643CB8F9529D31FE0AC4A28D780196DA00DACFF5F2DD64FB04E7C159DBBCDD3343BCB7AE188DE15D923D2AC0AF232C5389DC9C949FCE554F7A0425D4F9B28DF2EE4B81740C2B5A5B93F0F7AB75EBD360CBC78B11C28608B5BAFC970CF3D4455A20A198392D876EDCF89E2639B50CD84AE21BD50FB077050EBFFB210BE711D8EA807CA66493650E909911FD3CAD99AB94B2AB2EDFF192D9D75257818272E147A9C54E06C53210FC091BF4175F2F44423669716FD9A6C4F96A0C4BE17839769A806453E55D7357FBFB3D7A458E70957D524C0E896398E135BFA68A0CC136FB93EE7D30AD463E32E152FC32CB8E7F0B05A30EB13C0DF98BC187EC0A54856D2EFCDA10A82B89DC8CD21C67D9B6DF3D7005EF3B2BC9DCD5D55B64DB40B74FD322CDF9D9911A00B5A02E1AD5CA9BF65D90DB709FC1E5FC84BE97574B09C83B49963A51228A667BBD84BFD8E0D90EC161FE5CA73BCB8D95FD7AFD982AB7EBAB51BD2B24CD6D356EB850D2C65593313D8EBB97E7DFA450AE982918582F86A356F538EB05AFD460566D79F040D36C93D3C645B636560007D51B121DE3FAFB3ED70B475AFF9617DA4B52937C628678B109C3B76BC15BD02B766A394893D8EC966DFD8033D12A8D98AC5BE201134325E32CB6786F4FAECD7DCD05AEF5F3739122B817824A672E71DEB312CB7DD6A77116B30715076384297B1962EFDFEE6D6D2B2ED2EA4DD802F4784872D825DB828557D4D927B7232682AD91CEC3E508854F529853A8797B7BF7BFF8E3C180980DDF4081E96A12A495ACDE0C73282AC78617C68A55A94573E5A37B859858D1E19ADC82821B316B9D346ECFC6DBFFB3779F692A62D20D1BC4E730FDE2AEE826E76638ADE3DFAA11057B0BC8A80E8905B15E41D9A4105109F18E7E1362149AE9C568D1D642D65B94253BE2B13E7230F8BCF34DC87241D1DE72A65BBA111C111CBF5BD618CD02E0A06E37F60B3736631073A6BE004C1AD5F0091A82C87B276F7C5AAF6938C886A6039DF23482E2064F6AF05636B4C6BA6B24A29AAF2174AF4BD959177203AE9B160F81CA6764948AFCDACF6BEC0B987C6DBE178DCF47C137C64809483019C5F2072D0301C19C500C60B5CA913C24A8F28F50E1578D806FF9F9B810CA14BF5F2268FA18DEC67D973EB1D975AAF871ABC980D06222493D900CEBD8811FA20D5DB8F8036430F8BD7F9554F7CB47F9EBF389F66C3CCF9F42DB57AFFEE074FFEE4EB3E11612FD8A8FE02CC4E9D2F8BB36C505CECE9DC87512AEB5D8EBE33328C5217CCAF2E1AF1E38BFA84C0035DECD8D8C250FB4D964E8F0AE448AAB740D9EE9D794390686FE9A95183F0D5166D479C51014F1F29D8FEC616E1A4E7A9C86E2AF790BC7BD7BB6F746A2266332E04AFFBE6B9512E6620681C3317DC846E4FD7974E8AE87E370ECF9DFED574E339CD7E8A663ECD1A7BF5842391913D98686F7F2145BBC420F2F58B89131D5F3BE41C85752E13504BCC549A8F690CD2B0E1E29E4DFA3CC76BD398BBF28F33A00C3915DD719F7CB985E9A0A7CC8190BFFC8BF47310C71418D7A6C629C491EB8E455148BD4438BA6B7014608B0CE6A1BC5B035BC174C9BFFD966D8305FE9E5619BCA3FE4B39E6732DC652531819AC828F86EA11360678E786EAA741382D713AE26A608D582A3E4583D45744ACEDD32670B5AD4A1310301B28A174DC9858A55F0C1B7486CD66CB0635083B0C63016E40DFC533AB80C9CFAF1378D00769DCBAD56B09DA3A4E6CDBFD8F3FCB951680020DCA58647665462E42F42DC14E7B20F262D3CEB0B1A2BA807B98D66232AD7D3839C298564BC36A134CC2447B1B9FE69271960459C0A6F897C1878140690DA7D41FD8AAA05A679FDC3037EB2885AD3C82374F4BB991745351292DFD8E54F565E0093776B7EA65DDCD500BEB4D15AF6029F2630A0062F2D4FB331B47B6A5E139D385016E1FA490EAA209636B1383B7D7DC1148F07ED2CC2C03FA7FEE09305F34C57B3CE899C18462B4F1EF88C1AC5259440AAB48C5849652AAD9D3CF3D31F36C7F64F918868182D36345BA5BB7A4EE088D8B081EB78FE977F5A5295177AA427215BB26D1DE33AD4B2D610A47F8C672EEDA703A04D0FAE4C5961F13AD6FCA81863D8A394135565D8B27904A511FD0621A532F84A47CCF4FCC2114D4C369B7A76822959F8CAA25A6495081CA9EC3AC3348A981618592C090B6439CDA2FBC932C8697B3709323E3388AF8EFA1B9CDBD65A65C8F0C302330DDBD10E0235F8030562452EDE447EE5A5A9A636AF6F615B1210AA7CBE69572B3467B643BC5F5EC3F9AD15B3AD918993355E209ACBD0F1393076DA3B0950803295B6571E476ACAA04D48A4627367CB7FAA83796C4178CA9071DCCB8D3EA70381B61F0C56D515E0A765E266DACB13056317AD8737A1AD541AACCEA1641946E331229F19BB54C20BD51E63D63BFFA13110A552FD0A95AB984EF53BD639EFA0568C6875B2798E3A0578C940C0C4197D3587BCB1CC45A99F5D37B1612DC1A4178A3E288FBD79DDACD049159D6A5416F9EF3F38C74449BFB2E6A894566C5C17B4555E154F29A93241463690 +pk = CCA1C3A188097F2A4F67AD963EAE9D595A6F1EDC56C3C1258C0F2739AA0C1EB3F8E0238C8CB0094319D9FCB1837375A46874E3FA49008C3E86A4A28B6B74B80022D15CB01C571E14700A31F0CD909940BCA75CAFE08386218AAB57A48F4D4E9688CA1B944D1742EBB8C15F3E83A9BC5D54648A6E02DAE02B0C287095C0955A000B +sk = CCA1C3A188097F2A4F67AD963EAE9D595A6F1EDC56C3C1258C0F2739AA0C1EB3F8E0238C8CB0094319D9FCB1837375A46874E3FA49008C3E86A4A28B6B74B80022D15CB01C571E14700A31F0CD909940BCA75CAFE08386218AAB57A48F4D4E9688CA1B944D1742EBB8C15F3E83A9BC5D54648A6E02DAE02B0C287095C0955A000B071A661E11B7E9ED6054601CAA81B0E9D871A17BAF6A47FF6D57F9F3F64950A84D00000000000000000000000000000000000000000000000000000000000000366A8C762652408E43AD91934E1051C43EA32A79825833FC314626BC16C2C9C4D2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5356342BB1C1C3215B8864BD3C26C6BC2AEDF04367D510F1EDA5ED19F80C0A7CE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F07335B6ED624397F5D0342175EFA85FD5CC2B79FB4627127D69F6BD0E28F03AAD5AA0DB63B4786E2D81D1A25AF8E2DD2AFE982EB2E02476C1FDDCA69999012BF299045852C986D79766828C6F3C0F260A7D7EB66C96FAC85498CBE49F717213EA203FD8A0027199A44567362682A41C7F5DCA5131FB9DBB0DC2AF199605E33552243C916DD14E585B4F1993F4EA479EEB8DF5D357ED32CA8736AC87D8DF96C9F85D0FE0AEB4BD38FD32A373D1CACBC15D079CD7843B7EACC03599E30122A3F114798708A0CC81797B8A81A09193DABA3A6598E7AA27445B5E32E057723BAB7F2030EBD673E58A518870B8E886B3D1EC2FEF678649DB8BA6BDB63C04 +smlen = 3394 +sm = E55BAF22D47DE81B66EA8C0EE3054A55EF2C4BBB25C9AF99D2BA6B08EA79113AB999FA1BFDD610129F8E434FD903BCF11AEBBE04F896D3DD970D5F49DBF25801B3FF4BB67E1E7CD785B38B3259F674333A81683B69B298749AB3C5373034E3F1823857F0867229467C930BAD63A87A84949C85B480F05B45E77339FCC13D65010001ADA45FB232917ECC2E396F2C38F7F60F295F86EF918A82D3CD5C9DBBED94446753EC28CA9FDD0CA597389F047379439E34291A2B8E8F7AE64F97A56EB25DE06DF47562B145FAD19BDCF5EE590A4EA46E3FD4E2F5427A025F43CAD8622260370B4A972496FF5046718A70DA66FAD303C3CE327FD895A4980F935A8D9F9EDB206D418A34B383FB57BD95CB4EAD0DF5C6EE7C56B284B4B2C24ED05C79F6BB084700020202C7C4451DA90503C43FDED1CCB3DEE468A6A8D9E56670CD8F6A58E7941F1BC5EFA6E2AFDC0141A2F7E8F781D79E70B4813263A9DBC8D8A67F89371CFBD90977EC96461B28BEE4C644F2C91E96257B1909B84ECB25CF438A3FD6B835E20D5CDA56A1FB7995FCAA0EE1B5327FB1288E3C57CBEF0554CA5AD6FCD1F1865C6AEC6CBDB24495700AB5AAF078D8516CA4FA3A231A97C77BD150B127CDBFB42C03702C9027B2A5F6594B022EF55B63BF3EEC27EB0E9529ECCDC82BC6AD1F011F167D602EF1F175DA5DB4028BF08A053AF2C728ADE93B37EDC2A75B7B6C6CF38CD1C07F359C73B131B13DF76139DEE6795F1D85B47F29AE97D0E40CF5DBB67360044F78940A1E80D9D99FD5AB0185210D8769911BC471650DF0FCB9C3AF038F7882F677790E146E612FCDD6FB89F90B7E5E46CD648F4BF8F736D69F8A91E4806346B4366FD48D1481C0B47ADD82003310B0A99B779D63EDE1771F50221651B2D8AF40F48B92EE1327C85A1D2EF2D86378076BEB58556FCAEC6029649A0EA5FDE517A85D87704210E071FCB6F63317AEAC3EB3E9746018E1028C50C790A45B1BEDA6EEA2D646DCE401AD5D7850A5F69CD85301920DE77AB0D01B1361EFA3E70AC05881BC02190720ACC75A691D6064F9D24C79DC72476309E58CDDF5FB2A253D857A79C8E898AB6ADC300EAAF208820CB02F5F2CD317F4052D40DE28E52C55A0349DD855D64E8DA8296D4F572281E221A3D27EF76FEE67FBE5484E6460C99950763B801FCE828E93D2A633A1CA5D7EC582D7C463DA5A9AA8056BB2173306F3820BD0A3273742789B61AF89CCC42B81CC68745800D2A59231D5D28E832F443A871DE5B6B10B58A8AA7CC9816014D7F3545DDF1F481B7F0C9DD41B4D96E5DB767B74776C2253FA230DF65F3E0B944B95ECD4138E2847418B084D9F9E0798CB5247238EC12B88C10A5C0C645E1D09D09059C72E33C28A472FDD8B88EAA93C63BE7D980A12195C2EC3105DF2BB81CC9C3009F7771B6B813CD12303E3A9961D6731AF55ECFE5127BAC68D06F835DD5F2D584FC0E648C3A4256E2A3D4B81966010964657F33D1FE0400724C488D5AACF9F2C0B802CD812C8452E5B8E2B17FF4A1289D33FC405F5DB4ECAB4A73FCA3634756DFBF9012C413B6F64788FD0F68F8AB7620477ACD3C14009377F3DD54B9EAF2784433D63341323F54D113FD63D7456AFEF885F13C13172A37A5DC82336B9515F8F7F4903EF6DBE9CB34930743B6ED11265CF94AAF406DEA9802D17BCB369AD0D9964792F74D338DAFE47EE88B3B74EBA8E70774EDC1F16FA876FD62B0BFF880CE252EE4435B1DEBF36F0A06A4FB406F01D618C135E6103E2A39F4C9CF41EC93702BA76BA753AB49B5836C20F67D05943EDDDF47AB8C5B81F4BC22D773305076F7E5B697A7B25B016190072F756F19F397884E0521595326CA591672684A3BE17C9F5CC8E8F4848F7136762178FBDCC7BC6A6C6A31345FEE687B0505F72BF1AB7EB87BFE5F896CFD42DD67A239C70648B39BC0C84DA33CA17838FB4213C38B68F22914FEC3DC50194E883720719E9B5F8D037DEBB726DBD899ABD97853C54B0BC347A322BFAF961C6CD6209C98AA81B8E2595FC151B1375BF4FCA2DFF49DF40A3D1C694EDFF6E9687E73EF62DD42AD7A05195A7F206F097196AA0E4D68F8132D4A00CEDED940C4F6AE02E6D3763073462C7A4BB11778290E744471EC554A05917E52C5263FF02C07BEE055234EEE10B79175DC164AB2051B03598DF1D4311E87ACF4AEC45C55B1A58B0F05EBDABE248A27C0187643CB8F9529D31FE0AC4A28D780196DA00DACFF5F2DD64FB04E7C159DBBCDD3343BCB7AE188DE15D923D2AC0AF232C5389DC9C949FCE554F7A0425D4F9B28DF2EE4B81740C2B5A5B93F0F7AB75EBD360CBC78B11C28608B5BAFC970CF3D4455A20A198392D876EDCF89E2639B50CD84AE21BD50FB077050EBFFB210BE711D8EA807CA66493650E909911FD3CAD99AB94B2AB2EDFF192D9D75257818272E147A9C54E06C53210FC091BF4175F2F44423669716FD9A6C4F96A0C4BE17839769A806453E55D7357FBFB3D7A458E70957D524C0E896398E135BFA68A0CC136FB93EE7D30AD463E32E152FC32CB8E7F0B05A30EB13C0DF98BC187EC0A54856D2EFCDA10A82B89DC8CD21C67D9B6DF3D7005EF3B2BC9DCD5D55B64DB40B74FD322CDF9D9911A00B5A02E1AD5CA9BF65D90DB709FC1E5FC84BE97574B09C83B49963A51228A667BBD84BFD8E0D90EC161FE5CA73BCB8D95FD7AFD982AB7EBAB51BD2B24CD6D356EB850D2C65593313D8EBB97E7DFA450AE982918582F86A356F538EB05AFD460566D79F040D36C93D3C645B636560007D51B121DE3FAFB3ED70B475AFF9617DA4B52937C628678B109C3B76BC15BD02B766A394893D8EC966DFD8033D12A8D98AC5BE201134325E32CB6786F4FAECD7DCD05AEF5F3739122B817824A672E71DEB312CB7DD6A77116B30715076384297B1962EFDFEE6D6D2B2ED2EA4DD802F4784872D825DB828557D4D927B7232682AD91CEC3E508854F529853A8797B7BF7BFF8E3C180980DDF4081E96A12A495ACDE0C73282AC78617C68A55A94573E5A37B859858D1E19ADC82821B316B9D346ECFC6DBFFB3779F692A62D20D1BC4E730FDE2AEE826E76638ADE3DFAA11057B0BC8A80E8905B15E41D9A4105109F18E7E1362149AE9C568D1D642D65B94253BE2B13E7230F8BCF34DC87241D1DE72A65BBA111C111CBF5BD618CD02E0A06E37F60B3736631073A6BE004C1AD5F0091A82C87B276F7C5AAF6938C886A6039DF23482E2064F6AF05636B4C6BA6B24A29AAF2174AF4BD959177203AE9B160F81CA6764948AFCDACF6BEC0B987C6DBE178DCF47C137C64809483019C5F2072D0301C19C500C60B5CA913C24A8F28F50E1578D806FF9F9B810CA14BF5F2268FA18DEC67D973EB1D975AAF871ABC980D06222493D900CEBD8811FA20D5DB8F8036430F8BD7F9554F7CB47F9EBF389F66C3CCF9F42DB57AFFEE074FFEE4EB3E11612FD8A8FE02CC4E9D2F8BB36C505CECE9DC87512AEB5D8EBE33328C5217CCAF2E1AF1E38BFA84C0035DECD8D8C250FB4D964E8F0AE448AAB740D9EE9D794390686FE9A95183F0D5166D479C51014F1F29D8FEC616E1A4E7A9C86E2AF790BC7BD7BB6F746A2266332E04AFFBE6B9512E6620681C3317DC846E4FD7974E8AE87E370ECF9DFED574E339CD7E8A663ECD1A7BF5842391913D98686F7F2145BBC420F2F58B89131D5F3BE41C85752E13504BCC549A8F690CD2B0E1E29E4DFA3CC76BD398BBF28F33A00C3915DD719F7CB985E9A0A7CC8190BFFC8BF47310C71418D7A6C629C491EB8E455148BD4438BA6B7014608B0CE6A1BC5B035BC174C9BFFD966D8305FE9E5619BCA3FE4B39E6732DC652531819AC828F86EA11360678E786EAA741382D713AE26A608D582A3E4583D45744ACEDD32670B5AD4A1310301B28A174DC9858A55F0C1B7486CD66CB0635083B0C63016E40DFC533AB80C9CFAF1378D00769DCBAD56B09DA3A4E6CDBFD8F3FCB951680020DCA58647665462E42F42DC14E7B20F262D3CEB0B1A2BA807B98D66232AD7D3839C298564BC36A134CC2447B1B9FE69271960459C0A6F897C1878140690DA7D41FD8AAA05A679FDC3037EB2885AD3C82374F4BB991745351292DFD8E54F565E0093776B7EA65DDCD500BEB4D15AF6029F2630A0062F2D4FB331B47B6A5E139D385016E1FA490EAA209636B1383B7D7DC1148F07ED2CC2C03FA7FEE09305F34C57B3CE899C18462B4F1EF88C1AC5259440AAB48C5849652AAD9D3CF3D31F36C7F64F918868182D36345BA5BB7A4EE088D8B081EB78FE977F5A5295177AA427215BB26D1DE33AD4B2D610A47F8C672EEDA703A04D0FAE4C5961F13AD6FCA81863D8A394135565D8B27904A511FD0621A532F84A47CCF4FCC2114D4C369B7A76822959F8CAA25A6495081CA9EC3AC3348A981618592C090B6439CDA2FBC932C8697B3709323E3388AF8EFA1B9CDBD65A65C8F0C302330DDBD10E0235F8030562452EDE447EE5A5A9A636AF6F615B1210AA7CBE69572B3467B643BC5F5EC3F9AD15B3AD918993355E209ACBD0F1393076DA3B0950803295B6571E476ACAA04D48A4627367CB7FAA83796C4178CA9071DCCB8D3EA70381B61F0C56D515E0A765E266DACB13056317AD8737A1AD541AACCEA1641946E331229F19BB54C20BD51E63D63BFFA13110A552FD0A95AB984EF53BD639EFA0568C6875B2798E3A0578C940C0C4197D3587BCB1CC45A99F5D37B1612DC1A4178A3E288FBD79DDACD049159D6A5416F9EF3F38C74449BFB2E6A894566C5C17B4555E154F29A93241463690 + +count = 94 +seed = CEECCCD3F7BB922650E3F6E8F20C47AF17C1C1053EA8FE08226F167D67C3B0781BD774C4C7AAD23C6AB0B9F3E3F96F97 +mlen = 3135 +msg = E13692E3CC06EBE8FF9A292D890F0A34DFE9A4F968F196B475AC4DF553A30E2FD5DF008DF4D7508302AAF6389B6A5A9135E9BC8A5ACCD2BD2DF98FF662B763101D31E24E8F182FA50840BE27F76BA5ED645BB4D3F7F2F6CE25179A47FD7B6441A9B3A28783CEEDB425B2912734A75D7D03811172188253BD8F0F52EAEE84A9FB025F95EA1B566C53297A6A090F7FD8B21639523E073ADAA750D63DA61631F933FEDFFB2819E0EB3074E9E11E10B102AC88E2C8D6CF408FD241AD301F9B8E18A88B74CB4B0DAC76347635DFBB3EECFDF84229BABCC003C6E4EFB7394E25667DD7FA47D36E027559F53E98789E6E732E6AA23A71607677FB975C2852367C5BA5E3D10B3017AD26F9A38CE803929D08A43646FFBC3980B359D8BC2E9615636D4E5DE8DE6FB2465A983EB1696E98DD33FAEB7AF8C2D30506B22390D7F9FC21C7A016FDF22D21ED2EA4175FE9F5F44598EC26452700DC9A495675431E1236865F2F4AA5BC9C9A10EEE9E29B1FC4FEFCF8F24BF94342FC7E19AA6534C3B771D910AA419EA2BF70E2C1915891CC630A3397551E4F34BD2192B70EB210EA67CF152A35A3F5D0878E153579B42AFAFE5068B2BE2B48127FFB54553B7A9B6F845E7D72C43938AE42BC03E33B836AB212909510AAE7DBE8EE6D0EB8AD84D60832F3151273A1E09C514C3AA4CACD15564643F4255F36059022B91BA4137ECD97B34BE3308D40EF06BCF4F45EC625B54C7347F52A21815508199C8B7A6212779CD171894DA9FC3DE2A6EF5D76BFE03B8199ED1DC92B2A403E4DA009CBC0FB597C5952BE32579EB8E781EB12D935848C051029C528CBB68CBC1DE0102B42561E21F48E72E028C2CD8816A9027914571B49D2F94C9189E1A7F18D7D3D0A09B3A36EDB8A084ACE5FCCC77E3E42EDA0FBAB8C81EAF170103CA757981839C9448362BCAAAA3F20C8DC653AEF36953559F3597E1915F02A8D33D0E46201FC794EE055E6D9955B91FC7ABA1F136C280367404725CB355FC2F129413581401F98236D2A6F8BED7FDD7EA99060DABE3F0E8CE20B0E98EA80994D1673E8CCC6A0BA4A9D544F3D31BD95C9D3847527A978C1F155EFD84B6A7BECFB749628CE82E80285FC7272EA05F953404E437AD557F38FD9BBF77A69B81E4441605B23F2AAEDB00C7519D8E9CB4CAE5F8C3FA74FAABF6C12595BA045F647ABA7168C65C8A6006733D1341435495C7088C3361B50C43787EC24C24F57323466B5C088E8097B44666453010DA38AD65B426E72140AF78A5448B2F93DF3820F013FB9DCAC49604C86F2B2E4EA565463917285F148E8BFA9E11943AD3B86B14ED59A190CAE097DB26DAF8FD2A642676A37DD90C23B52C82CE028B80A805D9BA05457F7B6CBAECBA4094822E16C14D6E2291B731D581B12FB16802653360AAA6A7989D61C80DEBFCCE81A36D9ECC84039C4F086A5579D36FF5D0CBE61292E4FC3D14277AF380A9C1DBF36C2D61F59CFC0D62524E042710BFF5BA719E56BA367FFE849D660B9F7F3B638E113BF2E1A4DB1B8F65A0FD680BB2A168A4FD5B4E0EDF3208AD47F1FF4AFBAA726E38763CB5C84C03DA3D1E32CBA873B9A0C750922CD3D0A10A4877EAFEF602F5C875FBF0EE2F4F0AF7F308EF934F7E8E74FDA62A860BB594FD061D1B2BB32BA613339042FD90E749ACEF450D204072ACF58B18C365E4F4B815F1E837453C4255D53BB68D50F3677E7173FCC23D2B592149A9F3DD615868AF91F705387547862D34553FD45B8DF643F596DFDB7ABA47BD5D91445826C86FD4D30365A2F9A3CC0913DE19707D072F27A09EAB906304008875B5BE3526210D6B8BC8663975A1F78EAB9CD7F7305CDD4C00D6277622E50606E1CADD639730101D088BC2BAB295AD86BA8E26F5EBCB3E9C7C543E533A7B3C20F0F89001775F714825DC8547BAB06F5B99C5305EF18372A184569323FE269D45B669B9A222C9DEFBB0B2C84F42A57EF343A5C12F5712EEC33985DF8F0C566D471A9403FC103A3EEED42829D8E3E5C517BDE29447841CE96C8AC587DF3E4B6227FAB386140DB0112ED0D2846355C4A45E94F3A0718CEEC13FD3CAAEEFDF0B7F89F502AACF8C9D96D01B5549157B7DF2BE65BC30C889E69971700286C561DF91C8CB923001E5F0E21D2C7A3DFE8D1AF07FECE1EDA20C031B29A4389F265D2C7BE64EC37B2884849EF30FC8A82D2F766ACE68C72F0A4B72F3B50884749814387893DB2370A3410F794C64CD24BF0D13E44AD500BA9816F9BAED72F7593F758592C2E974D1207A664B869130BAA1FA71DBC55875134E7CFA276E36568F79483886099A1070C14C6E4EB87523E04C0154A2250624261211723453CFAD185298DE06D08CC25FA18BC58B34ECDF5D9DBB02541BAB4A2AF110AE09130E12439F1CECC34F9AB5D7BE36C827A6F2F6708B543D4AD2E424805E2A74895742B0A5DA30CABE4AB45F40CBFCCBEEBDAB9B8EB8F78781168B5BC79E04EFFE1757AB0547B9BD0D2625673CE528D2B4874D46DF0E09C24FC413EF9AB4C3D2E803C1E316D77FF5DE3368BB925B2B1F6FFC340525663931F5595C8AAAF9FB0DCCDFA4793519A66D4FDE38BD2044C60FD1DE15D60BA878FDA570E7AEF6DB69D2527A1F1481A9D05FF2F6F621238939ACF5D2C37B2BC3A194A9E65E7441764A5EE37B1FEF3B8C9C425BE1B5FF0D05BCB6A3B91876EC04ED89A31749FD443C2B85F8F388E7070D77DEE37E2B666628CC9A961236DD24AF2769C1F613B4E77F8E82D1F410ED59F63F1DF19BC53A448106DE4F8EFB8CC37E40144B0F658A4135E25A3CF36D8692DEF2677E4BEA3A9770F19E44D55080625421D5BADEBEF3B39BE71C08650B5718A9B2FCEFC4BECB26C4B63C43F6557DD66517D103907F82F9C2B965B7C5E36059D2159183F5ACB8B5FF5E6B92E94D53AB25AE955424E80EDEC4650BE293E836DA6148392C500FF4B7672932E90E068569B81AE335B2E5013CCC95F571948D58127EB1269A08D6E897D2D9B60F3E49847C05D0B3AC230A67EB6D38FFDBD4B8D82D7B9EC803429C701F080BE86FAA165C0111131712DB4957FD84A8936AB55558C69D33D5890CADD08D7F0D4962CF9E2F69C7517E79DB14B76E6E188F5ED95169A2A7E4C0EBC2175EC2DD44ABCF239CEB3E22F955ED25DA41768CA5FD9A9AE15FAAAFEB431958A679249AB8BF879185E8FBF9986B96A92972153B4CD0D1BE001E5AFAE3AD1F0B1191F1483738E728D4AD240538E5EF7BC9BA4D5903929D74CB64241306FDBAAAE17B1C3134AED2CC394D3EF9653CC62A29C4B0B9BE04E95E072EC98F7A80A7B575DED4A1993AA884C1EDFFE056EC475D934B4EB0EBF418975728C6E9CB3919B2B67D2C71228A4DF1FE2C8388E3A2BDD75549417FE795F1947F857B1C0C9CA021515FD4D79E691493B988080943C394BF29E4190082A94F224AFDE5853323EA51C06B41547EEC0DA5CC202A048D77C7B91E794C51E72B02EA7C14578C11D9DF48E099465783E496029EBB6D42D9CAA52902A4694355DB01DD7F5D7C113AE06E3F712FA577E937CD4FB817659F93964E194FE7D509A81C258C69C3415A8F11D35B414339FD1CC1D4F50665D9111592D1C3A3D69FCF6A971C285A94F5FFBFE8D2FD2746DCEB3B218D970D670D10135126E479D92000D41EABDEEA4C04D1748A4908DD39C60A52AA5FE29C8ACED50DC1295B5C2C4A98E3C62EE4F370F4D3E500FE27B66F65BAE604FD558D66B7F09CE36C36C8B5B4FED193EF56D1D8DF0FE6FE0031466A1C633203966FE83D6BFF843657DC0AF176AA8D5CB7312CB4E072BCFF24D5F3828E29B2037E8D1FB63537C70C27011E9A97E3F04895F4E84AC69C55D450B46D5792A5D790557BE64F765FA243AFA98527B976783E7ACDF76A7E1DCBDA72431FC30D7B05197478D8D74077626FF7409F95B24A1F1BB6B803B9F1B9AD5B06883FAE6C4B587C309A63F3B2FC9619032157B98C1DA9608107E87F4FEE0DAE995AB86AC9869446CDE92441F0B9F8240E6F7F7AA9189D92B7FAA3280FA749BA8C7729F8974049C5CBCB8C6650CF1C16B8194C7AE1A82B40B8B04488FCC69E674362FE4821D4C1846CD9BC49234BCC464013F5F9A082FB83D63098C331D4B1C9129F52259CCAF4A9237F8EC5BCCF06F230C08DDAF1D0C21C5930F55D3D5F60CBFC447E7FCBC75CD199733F8D17BD043B67B0C138CB0C9C8F2E477728F27DEE573796F71B013689B537AEAD4991E67F2F5EB94BFAD9509D7C235C9E55F68F26B9CE8AA90834D170F8B700A40AE9A817D5D17B1644D25BCF1172A5CF0C755A6EC04FAFC39DB06AAA05F5988E187B9E110EEDEA9C84B99AD29A4B31950F2C870A1F91DAA6A5817FAEAE516FA42660FCF56000F7365D8C6CC11D4784C6FC02E4D0C727806E9D43B957BBA124C980C31F81FACC6D46F6C38D227EEF8F0 +pk = 7AFE52CB1E1364ACE004442CEA86362995860AA77122ED732D4861DA41E32BB3FA2ACEA9966050A84C54C773992B8EB91FE214D73ED5838B2F540270EDE69001827B7610328EDA052562F780D64D1A1331A672FCB37EB1088E5941EA67CE44DCFF8FD5E812055E58CB0230FE2414F72AB9491F4F47EAA22B79EBB3DB96B2550109 +sk = 7AFE52CB1E1364ACE004442CEA86362995860AA77122ED732D4861DA41E32BB3FA2ACEA9966050A84C54C773992B8EB91FE214D73ED5838B2F540270EDE69001827B7610328EDA052562F780D64D1A1331A672FCB37EB1088E5941EA67CE44DCFF8FD5E812055E58CB0230FE2414F72AB9491F4F47EAA22B79EBB3DB96B255010901F641A120EECA7C4058D2D9534FEA426E0F1E7CEB0A0184F58CC984C7E063D8BC000000000000000000000000000000000000000000000000000000000000002CE6456592BB5D13017DFFA95077B48F773E99C6E8FA98476B9D58CE4AA00872B7FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B7EAC44F1DF9CCFFC428F1C3BB91B7D102ED3635DAA577778A255598677BE27ACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ADFCA5BC2D2448E118DEEDACA8FF001838F0B22F9DD1FB90FEEB634BAE7045CAE1D21FE8FA50EB33DF6DF4A20686E65AA1AF2D42B8101A28BA917886C6650DCEF510399B4B54918ECE7912FE23DBD72372AC1BBB7986D9815C7301C2330A75AE6E605CE2F0DF440BEF7D1EFBEC8718A94E2EAB40FB001A81EB2AD45A4302CD25518826C8C995FEA5DBDCC17EA459E37816C9CAE84478F7B59CA38AF99B51A388E2ED818E49B5C72E0BE89698DCBEA803DF3D2F1F37CDB0382255F72C09294A91B52D74A92D99DF870DDF3DC80268B049F49C92FEF6AEAC0D69834830CF5FC6159D4A0CC0E44A97E5B9D36BA930C4EFD2D16C7A42C96395DD127BB40B +smlen = 3427 +sm = 72DEAD3D0AEF359A67B42F9A57667DE26591B0BEF1C5586D39C694FC07C5324DDF691B6C1CA41A2C9B9E0E884034E5AA572331325D857728AF4806211B88A00155B04904D408826896D20AE30B002BB7A7ACB52005F28CD9FCBFC8A78041D52614A368E452EF4D3C9DE03D4DE29AD964FDDAB6BD833AF787103E94B6D88EC3000000C284DD0720E89AD14646F52B61D031A4A6A37E9336F61D18D3D0AFB12DFA5B262FA0F7B8BAAC6C6EE8D48CD30501ACB38631D96A50F0725C0A3DE27EFBC5687BEFB6062F024AB5E39BD57AE2BAFC0232D241B56DB1E9AA352924F4728EA13F0EBE023373C9B804B6E86F4346AE945803A1020E5ED4C1A58032F8722DB8F42F78C7F84A5ECC7C045E1448ECB36839B80640209ECA7A61195C4E1DA0571C6275000902E13692E3CC06EBE8FF9A292D890F0A34DFE9A4F968F196B475AC4DF553A30E2FD5DF008DF4D7508302AAF6389B6A5A9135E9BC8A5ACCD2BD2DF98FF662B763101D31E24E8F182FA50840BE27F76BA5ED645BB4D3F7F2F6CE25179A47FD7B6441A9B3A28783CEEDB425B2912734A75D7D03811172188253BD8F0F52EAEE84A9FB025F95EA1B566C53297A6A090F7FD8B21639523E073ADAA750D63DA61631F933FEDFFB2819E0EB3074E9E11E10B102AC88E2C8D6CF408FD241AD301F9B8E18A88B74CB4B0DAC76347635DFBB3EECFDF84229BABCC003C6E4EFB7394E25667DD7FA47D36E027559F53E98789E6E732E6AA23A71607677FB975C2852367C5BA5E3D10B3017AD26F9A38CE803929D08A43646FFBC3980B359D8BC2E9615636D4E5DE8DE6FB2465A983EB1696E98DD33FAEB7AF8C2D30506B22390D7F9FC21C7A016FDF22D21ED2EA4175FE9F5F44598EC26452700DC9A495675431E1236865F2F4AA5BC9C9A10EEE9E29B1FC4FEFCF8F24BF94342FC7E19AA6534C3B771D910AA419EA2BF70E2C1915891CC630A3397551E4F34BD2192B70EB210EA67CF152A35A3F5D0878E153579B42AFAFE5068B2BE2B48127FFB54553B7A9B6F845E7D72C43938AE42BC03E33B836AB212909510AAE7DBE8EE6D0EB8AD84D60832F3151273A1E09C514C3AA4CACD15564643F4255F36059022B91BA4137ECD97B34BE3308D40EF06BCF4F45EC625B54C7347F52A21815508199C8B7A6212779CD171894DA9FC3DE2A6EF5D76BFE03B8199ED1DC92B2A403E4DA009CBC0FB597C5952BE32579EB8E781EB12D935848C051029C528CBB68CBC1DE0102B42561E21F48E72E028C2CD8816A9027914571B49D2F94C9189E1A7F18D7D3D0A09B3A36EDB8A084ACE5FCCC77E3E42EDA0FBAB8C81EAF170103CA757981839C9448362BCAAAA3F20C8DC653AEF36953559F3597E1915F02A8D33D0E46201FC794EE055E6D9955B91FC7ABA1F136C280367404725CB355FC2F129413581401F98236D2A6F8BED7FDD7EA99060DABE3F0E8CE20B0E98EA80994D1673E8CCC6A0BA4A9D544F3D31BD95C9D3847527A978C1F155EFD84B6A7BECFB749628CE82E80285FC7272EA05F953404E437AD557F38FD9BBF77A69B81E4441605B23F2AAEDB00C7519D8E9CB4CAE5F8C3FA74FAABF6C12595BA045F647ABA7168C65C8A6006733D1341435495C7088C3361B50C43787EC24C24F57323466B5C088E8097B44666453010DA38AD65B426E72140AF78A5448B2F93DF3820F013FB9DCAC49604C86F2B2E4EA565463917285F148E8BFA9E11943AD3B86B14ED59A190CAE097DB26DAF8FD2A642676A37DD90C23B52C82CE028B80A805D9BA05457F7B6CBAECBA4094822E16C14D6E2291B731D581B12FB16802653360AAA6A7989D61C80DEBFCCE81A36D9ECC84039C4F086A5579D36FF5D0CBE61292E4FC3D14277AF380A9C1DBF36C2D61F59CFC0D62524E042710BFF5BA719E56BA367FFE849D660B9F7F3B638E113BF2E1A4DB1B8F65A0FD680BB2A168A4FD5B4E0EDF3208AD47F1FF4AFBAA726E38763CB5C84C03DA3D1E32CBA873B9A0C750922CD3D0A10A4877EAFEF602F5C875FBF0EE2F4F0AF7F308EF934F7E8E74FDA62A860BB594FD061D1B2BB32BA613339042FD90E749ACEF450D204072ACF58B18C365E4F4B815F1E837453C4255D53BB68D50F3677E7173FCC23D2B592149A9F3DD615868AF91F705387547862D34553FD45B8DF643F596DFDB7ABA47BD5D91445826C86FD4D30365A2F9A3CC0913DE19707D072F27A09EAB906304008875B5BE3526210D6B8BC8663975A1F78EAB9CD7F7305CDD4C00D6277622E50606E1CADD639730101D088BC2BAB295AD86BA8E26F5EBCB3E9C7C543E533A7B3C20F0F89001775F714825DC8547BAB06F5B99C5305EF18372A184569323FE269D45B669B9A222C9DEFBB0B2C84F42A57EF343A5C12F5712EEC33985DF8F0C566D471A9403FC103A3EEED42829D8E3E5C517BDE29447841CE96C8AC587DF3E4B6227FAB386140DB0112ED0D2846355C4A45E94F3A0718CEEC13FD3CAAEEFDF0B7F89F502AACF8C9D96D01B5549157B7DF2BE65BC30C889E69971700286C561DF91C8CB923001E5F0E21D2C7A3DFE8D1AF07FECE1EDA20C031B29A4389F265D2C7BE64EC37B2884849EF30FC8A82D2F766ACE68C72F0A4B72F3B50884749814387893DB2370A3410F794C64CD24BF0D13E44AD500BA9816F9BAED72F7593F758592C2E974D1207A664B869130BAA1FA71DBC55875134E7CFA276E36568F79483886099A1070C14C6E4EB87523E04C0154A2250624261211723453CFAD185298DE06D08CC25FA18BC58B34ECDF5D9DBB02541BAB4A2AF110AE09130E12439F1CECC34F9AB5D7BE36C827A6F2F6708B543D4AD2E424805E2A74895742B0A5DA30CABE4AB45F40CBFCCBEEBDAB9B8EB8F78781168B5BC79E04EFFE1757AB0547B9BD0D2625673CE528D2B4874D46DF0E09C24FC413EF9AB4C3D2E803C1E316D77FF5DE3368BB925B2B1F6FFC340525663931F5595C8AAAF9FB0DCCDFA4793519A66D4FDE38BD2044C60FD1DE15D60BA878FDA570E7AEF6DB69D2527A1F1481A9D05FF2F6F621238939ACF5D2C37B2BC3A194A9E65E7441764A5EE37B1FEF3B8C9C425BE1B5FF0D05BCB6A3B91876EC04ED89A31749FD443C2B85F8F388E7070D77DEE37E2B666628CC9A961236DD24AF2769C1F613B4E77F8E82D1F410ED59F63F1DF19BC53A448106DE4F8EFB8CC37E40144B0F658A4135E25A3CF36D8692DEF2677E4BEA3A9770F19E44D55080625421D5BADEBEF3B39BE71C08650B5718A9B2FCEFC4BECB26C4B63C43F6557DD66517D103907F82F9C2B965B7C5E36059D2159183F5ACB8B5FF5E6B92E94D53AB25AE955424E80EDEC4650BE293E836DA6148392C500FF4B7672932E90E068569B81AE335B2E5013CCC95F571948D58127EB1269A08D6E897D2D9B60F3E49847C05D0B3AC230A67EB6D38FFDBD4B8D82D7B9EC803429C701F080BE86FAA165C0111131712DB4957FD84A8936AB55558C69D33D5890CADD08D7F0D4962CF9E2F69C7517E79DB14B76E6E188F5ED95169A2A7E4C0EBC2175EC2DD44ABCF239CEB3E22F955ED25DA41768CA5FD9A9AE15FAAAFEB431958A679249AB8BF879185E8FBF9986B96A92972153B4CD0D1BE001E5AFAE3AD1F0B1191F1483738E728D4AD240538E5EF7BC9BA4D5903929D74CB64241306FDBAAAE17B1C3134AED2CC394D3EF9653CC62A29C4B0B9BE04E95E072EC98F7A80A7B575DED4A1993AA884C1EDFFE056EC475D934B4EB0EBF418975728C6E9CB3919B2B67D2C71228A4DF1FE2C8388E3A2BDD75549417FE795F1947F857B1C0C9CA021515FD4D79E691493B988080943C394BF29E4190082A94F224AFDE5853323EA51C06B41547EEC0DA5CC202A048D77C7B91E794C51E72B02EA7C14578C11D9DF48E099465783E496029EBB6D42D9CAA52902A4694355DB01DD7F5D7C113AE06E3F712FA577E937CD4FB817659F93964E194FE7D509A81C258C69C3415A8F11D35B414339FD1CC1D4F50665D9111592D1C3A3D69FCF6A971C285A94F5FFBFE8D2FD2746DCEB3B218D970D670D10135126E479D92000D41EABDEEA4C04D1748A4908DD39C60A52AA5FE29C8ACED50DC1295B5C2C4A98E3C62EE4F370F4D3E500FE27B66F65BAE604FD558D66B7F09CE36C36C8B5B4FED193EF56D1D8DF0FE6FE0031466A1C633203966FE83D6BFF843657DC0AF176AA8D5CB7312CB4E072BCFF24D5F3828E29B2037E8D1FB63537C70C27011E9A97E3F04895F4E84AC69C55D450B46D5792A5D790557BE64F765FA243AFA98527B976783E7ACDF76A7E1DCBDA72431FC30D7B05197478D8D74077626FF7409F95B24A1F1BB6B803B9F1B9AD5B06883FAE6C4B587C309A63F3B2FC9619032157B98C1DA9608107E87F4FEE0DAE995AB86AC9869446CDE92441F0B9F8240E6F7F7AA9189D92B7FAA3280FA749BA8C7729F8974049C5CBCB8C6650CF1C16B8194C7AE1A82B40B8B04488FCC69E674362FE4821D4C1846CD9BC49234BCC464013F5F9A082FB83D63098C331D4B1C9129F52259CCAF4A9237F8EC5BCCF06F230C08DDAF1D0C21C5930F55D3D5F60CBFC447E7FCBC75CD199733F8D17BD043B67B0C138CB0C9C8F2E477728F27DEE573796F71B013689B537AEAD4991E67F2F5EB94BFAD9509D7C235C9E55F68F26B9CE8AA90834D170F8B700A40AE9A817D5D17B1644D25BCF1172A5CF0C755A6EC04FAFC39DB06AAA05F5988E187B9E110EEDEA9C84B99AD29A4B31950F2C870A1F91DAA6A5817FAEAE516FA42660FCF56000F7365D8C6CC11D4784C6FC02E4D0C727806E9D43B957BBA124C980C31F81FACC6D46F6C38D227EEF8F0 + +count = 95 +seed = 2489C04BA57D149A60F446670C13C29998B52F3BAD548A751D7134B694DB25ABFA034FB4BA45E105AE27D575CBD02B99 +mlen = 3168 +msg = 1F7AB96E8C14D1A5094672D7034FA8F81703A2CC18983C972CC66736CD98B031AC8A479CED21A1F634938DF85F3E83161646DB81B9AC3EA22F80980B8E2EBA4E9975714E5A98985817F426C41F3968349686B69AF917564A2648401B8FA127FC3200DC16A9E663D1D345EA83131E21229DD39E70D7270DE7577A7E9635602FD2C30EFAF204A9234F0A73D21375658B0B0B04927E67F3F5534614EDF5137BADFED914A49AA301000092DA93B3FA4A0FF592CC3A53F4A75B54FEE775EFA421EEFCD6E0D32FB5CDC096886076DA940B26C6E07F12F6E08FA7B3E2DC42055308E5607A2732717AE592A6909C6E084252A5B08685FE8C6C1DA387B0AA9800B67CDB3EE2FB21B9BE5E6B79AB545563068441C0C9C1E68CEF6028A5CEDF27D3CA47D95094C9E1E68B8449758BE3FF8FDE148ABC420295DC76E3EBA8E11433217FDC3136551A5A41C1C7E7D6EF43601946897FDA54842D8F73FAA7EB7ED0DE544FEF2A95C6FECB13C8C0F14B5B22493F54374184B73D5BD47383BBC5DD7BC1BEAC0CB8E66D2F413A9DCEB7E1D0EE2D63B9EB28DB232C33A95B792AE67D2591F5AF59DDC45771A0E7195C4D25E7F4079359597678B0C0A87DF3D66A686A9215DD566D4722C212AD05A23E1377E37E18A6AB3AB8BF5CD47BF1BAF06EB05E4C150CA67D7E52BD297A08CFC97B575752E686B83575F425F3A450BB0F596A60E41F7183F463007FD019EE255BDEF1D98B7A0A12EC33B3E2BC9BF0CC8F4860DEBCFBBD5E40B2ADC2CD10EC35A341BE7A49F8D204FDAE86921B7DE5BA700A61E2B041A8EA7040ACEE844892E5CF025FFEC5322FF6D765BFF1107C967A12ECCB0489F64F8C13BD7057DF76485446641AA7A560C7E73008C46572628E1A225A8D3F6D68DDC9759A952FC07CD43DE4434BD3391089E900275E9EBC92563AC1403BB7DFDD182092130E3E6AEB7B666F4BA66C38BBE1F726F40A07DF6C42079A6054399519E26D765CA065F4DDFD27A29CBA292699CD826FA9D3E7EE31B0D76813879DB5EC5C7F454095DC3BD27323DABD2DFF949AC760D6137334507816330FA67D886021661ADC69AEBD882A07E01B4B6E5492399ECDEA99222EE785C810B30409DFAF2A3CE5A05D699C2368249C9588D86FEAA778B4860D6DD442088A21D2D9D0B49B15EC579776812AF8AD582F1C44BB6432D7472300B5440A382ED87AB64B20373A0ABDBCE391D0BFFC9C543EC686449FCA9D04B7141836A416720BDFF250A06D7651A1F98EABE4B340B2303591D0847AED6FFE423B6DD8C0C03459C381DB506F531343F82C116323899DF1E5D8DB8997BEC12EB70103F0BF2B3D53C4D4694052606EE32BE4F5B35450358D7D85062DCF7F0BDB51364700BAF92CD6ACE4E2C10E6CD9A332716F5F4BF7598466A99238357798A499C9B8BE77690635C57E7D87A904B3F2278C0B1B23E5860B0532F152E1626C86FD855F656B5D070BC81CE4634A87C8EA6D6A433C02DD2E6D6561B25968B149A6F3BBA40B749F188B84314B5778A000CAE91A53D59860EE6F7DF38CA0935CD64C08A34BF19981C17951B9C39A847D0637441452E38CE5E1D9B99BED51B86705CEBB8D3244C40BB8D70F846936A2BE29C21604A7E6BD3E655022B929954F6C9A5743F5FC2127B49956D80128DD582CEAA06FC174813E5F5E6A0A4D7D26756FB28A6588E9410722591CCE2A6C6ED0976B98E1FB0C642D5DF8F08E96BAE1FE10375FA1D7C70806101570FEF1EBC8F58664281E2B61DF2081B655013AEF54616308504F5F4A1E8F156680163489D3FE7BB0A514F1D2D57EE6302853D7D03C767C7BDFB79E2B8C80403F26F6EDBDD6A890A0A0B9B76D334E0F729FF9C47BFE960A1C3FAF77E81B9AC156367423DBB4D766A1F3B1E67595EFFD76287F22BC37DA4F0204633E804002EB7C1AD0836FA4D01E2FCDEAB8457DFC3D8B7F1151BEF3574F8F4653AA3780003787B8891901ABC8250A974C15F2DDDF9E1BE6798647EED710D06CC3FB4C276BFFA585680FC632D8EFD1614745BC3C72B82C53FEAE935EA5014E2B321F69BADF570FAD878C9590FD20FB7BF1B31E373DA93D1A8C63EA45E698CE060FE70ABA0FA84F37E836F2AD2998F07101D3FC7CA2B08B1398E1687ED5A8CE860EF9B4889FF436B74D13281D1F6A7EDF1DBE8989BFAEEFE6A475E65217643E757006871E664099F5B3846553603CD9EEF8FC195807361FBFDEB8DEE6A0B79F009C10DF397FFB865F4EBD0473D458D553358029C6B5A95D6FFEE9B645311D10A8F479B7E5249AA87E3DED08311B4DDF3A458FE61AE294A22643861826ACBBC9B0EA8B73157CE15D1FF35098AE67159B07CA7499398C26776DD9884B5D3786C87D48E864D8BBE2B73E2890F217E135BFDFC4DC5E805D9CEFEF5268E33DB611ABA6A5D57EC82B7246A63DCF3EAF3A51CF503D65C206D2362421DE774158AEAFFEE45A6B5AD5CC0B1DE0E2EA74E97913729A69E9C00A309DDCEB7738BAF4757EA9CC96E055BBDF692B12D8B01B92CE5ECF3D52187402CB7FD961A2672DC1875B6EA22AD7F5F42B1B52BA2D780F2E6C5B25FC7E30B1B663E3A09C8FF0B5C302E0E7F984DDCC62DDA65FD996E17DA72F02A16C354BBDAD44C5B5044759BD53789B98BC58CC25FCDF10A9CBBF0FD6ABD58A4CEDD92C5D85EF22B3C5EE5D9440CE42995517D2F7352CE997F51A36B9FA5703B4C6491AD01F406FD1B5BF85321026D28B51354DADEDF057B37743499A986469F908A01F3C1B74DEF5D8E2F57ED25A80720B540333109A0A65E7984B557F65429F3D3BD7EC3732A10D7AF36DD5D2414A09949A0F57F37BD9021D2C482E61437CC15E9DFDD92D4C212C4FC6C22C54591E5AFD48210FDC88040135E433F50E45874E0D5EE2BBC857F2C80E2FA4FC7ACFEC8EEC0CAB351F677C790787C715945C21BF923EDC0A58878AE09ACF5FB5A003C9C0B6E30A450CE6DAD4B626108B88E89F1E6A7BB3843E1EC8AEE35AF69E81773CFF71190F819CCF24142D60AC51B80B61019EC7ED2EFB6C5F18B499FC9727BED2E3324F8B94A522092E0A98241E29F8F14C6561DF3FEA0824F9CB0FE10BB497E427EE62085E7AABB2900FA47BF27C1638BD116C5555C076DEEFE9754E8ED333D72CE9423E27EF640FD5199C0CAFBCF2DA1C5C34121A69E7E0DEB3C268FE60C6797056383DA43E6F472D225116F63124498271D3D43AADCC5871F2349CE040BE068D72EB57B7827A7D9AA01405BA0AB07E684B91EF05418948F6713AEF1F4948399E0E6130740CAE3E481A6366295422BE3EE2E892AA9FEE86A6E23E2EBCBE654989FD93D1C4E7D62910E1223BD66B7C54F8DD7D373986E5D4141BF0BDE98DD13AAB7D598D698660F11FA4BFB0AD09D5C27B65386C8673E6C4AE9E8E30F8DD1A5A3FE557A3C29DCF99A7C376200AB595C49445E740E3DAEC07BC047FD6EA4FC6CFDC23D7449F9D1170FE635CA36D3DE5B57F1CFB182DE240CD4C1E480600C449D1A8596D8315906A53954201929E7665DD2E27D590D481DD394CF2E8AE19217F1FF0CB511DEF7460DC9E49C21607247857BA744B1384344B4C2D8CE987512376F66F1A279509281242A7A2A58ED500395418138ABDB9C5572A258D157F4D3E88ED216BBE9CEE3BD054FE61F94C59A4AD19AA62E456B86CADE61622A6FEA877575EEAEA20C76AE8A89E7B44396BAE0EEEAB1C23F221A3DF2B2CC683256A4E5C8207EDA0B235562AD3B510F9D3FBE0B51CD8F238A0ABD2EC182681606C8FD111D8CE1EC1CDA6DB4572303DDEB925AC1FFFD75E321468266790DEE6BC0E85070CEE749D9E46795936324DD1388E1B11AA617500534B8DAF2DE12B035F73111B770F5F56F5C6A4152C45CE0E112E650FAA9F3C7E59E3410745C29FA59CAE5CC37FE4C6594990E50DF1576B69B2B292AFC58A804743F49DD7C98C1768FD19AB4213AE4FB197492AF5BF7FBC6C8B507673539D8515DD527FAFDD8CA3EFF629CAA720AA11E65922678447AD4DDF5FF943873DF5203AFEA4130CA5F633E104AB083EC690CF092D208A98006E91BC7E33731D18E592869E564E6D3FF8BBBBB9837FFC1F1B92DE0F5DD4A029C51E3F64592CAC3DE1B4CA5414F894B7B0B7D73D6BF1DA4B908ACEAB47771DA56A8B0536301FC5FD270CAA55CE171332F7DB2EB4619C4B2C1971EBC0AB8B0B11FD54C24285DA8428AB9E0150D8897216B133ED554DE8CEE532024DF8B8D9314D7C9A3EC60464F9C7BCA8C3D4FBA23A7B543AC111ABA8C8F1BD54A243D565DC062F84CCCEDB0A03375FDFBCEF8AD8CAFC440D3E6F988DC607ECB947673DEC4AD48724C91A6BE22A0027E42AF6D94D26D188D0B7B3A5AF012880FC0105DD2F11171742321DD41A0401415C58AD4DC445642A2CBB466788F54D270BD8DF25602B298B62B6D0FA3ADA97008A99B73A807092F8957F17EEAD9D53B1128FBEF1DEFCBC607EA92AFBD353E95F52D33AB7C1EBE2 +pk = C222C9A0C160E739A876FEAC51437BD7D78AB6552A3BC241DF53773171A1B1114FF99359A44A50762D3A12FFBB76E7A84CC99AFD4A79BA195C411A434F78A4015E30EDB272753DE7130DCD81C3A7FF8FB116DE99DE432F574C654B0C0365A9C44E3360A3EAB99174897B426967DF2828CC88542CE87CF97EF5C0D3A739D10A0009 +sk = C222C9A0C160E739A876FEAC51437BD7D78AB6552A3BC241DF53773171A1B1114FF99359A44A50762D3A12FFBB76E7A84CC99AFD4A79BA195C411A434F78A4015E30EDB272753DE7130DCD81C3A7FF8FB116DE99DE432F574C654B0C0365A9C44E3360A3EAB99174897B426967DF2828CC88542CE87CF97EF5C0D3A739D10A0009FDDD578DC47027D201BBB2D6DE30370FC24581A05D38304FF5C7043F787017882E0300000000000000000000000000000000000000000000000000000000000086D174F1102B69F0C5BE7D86CC59794C46C2842E3D453A56C560581F71D7495DDEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01AF1F45A956908CA9B28435F30E86F5A7CC78E2F996DDA4B51BAE6E8299776638FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B18FEF43EA497C2F542A5B454DCE57A30F64EB19ECBBCB404631AE21471C982494319F2CB5BC216601781052ECF620E15E6874A2210C761D0E42AFAD5BB30C44EECEE5A7CBF9843FA3C8E983C08390B0298A1B04CCDB48BD1DB173E655B3BD193C8EAA5DFD52A33BCCCA38AB50CD455AFB837764C6124E0299599921B407DCBE2D6FFE574672916AC54F8B209919DBE6A062C22644B62FDCD6085EBCB6426EB3E03B2B523439BE3C43B1164BAA32D92FBD3E3E469E6CDC225AFCFCC40E5B568E32A9E5F3B6BE2E21BAD079A574A7BC640A3AE50EAE8CA967AB419E0BA677525BD418888AD16FB672959113C710F677F857712B03452FF3951F86EF03 +smlen = 3460 +sm = 42DF0DFF44D5EB5CF5D6BEC46EFA4478EDDE1827AE1E63D2B33B77781B36EDEFEF5B5964E99F83E99366EDC66F2C2FC3020AA17C0459252FECE3F5A4C5B7D80030688357F7D5C6229EC43EBA8ED567F755B868222278D65F7DB4B7A71A13DB66E891421C5BFA66A9279F08062BF87CFAB9867E493519672507A4A17AB64F44000001A54DA1239711ECE047E65B9738F10D1C6DABB170EB7BCFF4DD9A6009CE0D5777877F944860EE3CB6A9F1166D2E4E1F68CC7CED9035A17630B73CD0E2E3D8E313DBB3A908BED16E2396CDBA34850D6B573F89AEE6F32F580B57D0AA0E55AA6E1D1F66B060CD4D6B32E4D5E70C0ACB2B6EC35DF0B379B510338F8A03E6D3DF627246D264BB494811F812690460DAE26C7EA22023C1726479ECDFE35BFE1D1F6D0002021F7AB96E8C14D1A5094672D7034FA8F81703A2CC18983C972CC66736CD98B031AC8A479CED21A1F634938DF85F3E83161646DB81B9AC3EA22F80980B8E2EBA4E9975714E5A98985817F426C41F3968349686B69AF917564A2648401B8FA127FC3200DC16A9E663D1D345EA83131E21229DD39E70D7270DE7577A7E9635602FD2C30EFAF204A9234F0A73D21375658B0B0B04927E67F3F5534614EDF5137BADFED914A49AA301000092DA93B3FA4A0FF592CC3A53F4A75B54FEE775EFA421EEFCD6E0D32FB5CDC096886076DA940B26C6E07F12F6E08FA7B3E2DC42055308E5607A2732717AE592A6909C6E084252A5B08685FE8C6C1DA387B0AA9800B67CDB3EE2FB21B9BE5E6B79AB545563068441C0C9C1E68CEF6028A5CEDF27D3CA47D95094C9E1E68B8449758BE3FF8FDE148ABC420295DC76E3EBA8E11433217FDC3136551A5A41C1C7E7D6EF43601946897FDA54842D8F73FAA7EB7ED0DE544FEF2A95C6FECB13C8C0F14B5B22493F54374184B73D5BD47383BBC5DD7BC1BEAC0CB8E66D2F413A9DCEB7E1D0EE2D63B9EB28DB232C33A95B792AE67D2591F5AF59DDC45771A0E7195C4D25E7F4079359597678B0C0A87DF3D66A686A9215DD566D4722C212AD05A23E1377E37E18A6AB3AB8BF5CD47BF1BAF06EB05E4C150CA67D7E52BD297A08CFC97B575752E686B83575F425F3A450BB0F596A60E41F7183F463007FD019EE255BDEF1D98B7A0A12EC33B3E2BC9BF0CC8F4860DEBCFBBD5E40B2ADC2CD10EC35A341BE7A49F8D204FDAE86921B7DE5BA700A61E2B041A8EA7040ACEE844892E5CF025FFEC5322FF6D765BFF1107C967A12ECCB0489F64F8C13BD7057DF76485446641AA7A560C7E73008C46572628E1A225A8D3F6D68DDC9759A952FC07CD43DE4434BD3391089E900275E9EBC92563AC1403BB7DFDD182092130E3E6AEB7B666F4BA66C38BBE1F726F40A07DF6C42079A6054399519E26D765CA065F4DDFD27A29CBA292699CD826FA9D3E7EE31B0D76813879DB5EC5C7F454095DC3BD27323DABD2DFF949AC760D6137334507816330FA67D886021661ADC69AEBD882A07E01B4B6E5492399ECDEA99222EE785C810B30409DFAF2A3CE5A05D699C2368249C9588D86FEAA778B4860D6DD442088A21D2D9D0B49B15EC579776812AF8AD582F1C44BB6432D7472300B5440A382ED87AB64B20373A0ABDBCE391D0BFFC9C543EC686449FCA9D04B7141836A416720BDFF250A06D7651A1F98EABE4B340B2303591D0847AED6FFE423B6DD8C0C03459C381DB506F531343F82C116323899DF1E5D8DB8997BEC12EB70103F0BF2B3D53C4D4694052606EE32BE4F5B35450358D7D85062DCF7F0BDB51364700BAF92CD6ACE4E2C10E6CD9A332716F5F4BF7598466A99238357798A499C9B8BE77690635C57E7D87A904B3F2278C0B1B23E5860B0532F152E1626C86FD855F656B5D070BC81CE4634A87C8EA6D6A433C02DD2E6D6561B25968B149A6F3BBA40B749F188B84314B5778A000CAE91A53D59860EE6F7DF38CA0935CD64C08A34BF19981C17951B9C39A847D0637441452E38CE5E1D9B99BED51B86705CEBB8D3244C40BB8D70F846936A2BE29C21604A7E6BD3E655022B929954F6C9A5743F5FC2127B49956D80128DD582CEAA06FC174813E5F5E6A0A4D7D26756FB28A6588E9410722591CCE2A6C6ED0976B98E1FB0C642D5DF8F08E96BAE1FE10375FA1D7C70806101570FEF1EBC8F58664281E2B61DF2081B655013AEF54616308504F5F4A1E8F156680163489D3FE7BB0A514F1D2D57EE6302853D7D03C767C7BDFB79E2B8C80403F26F6EDBDD6A890A0A0B9B76D334E0F729FF9C47BFE960A1C3FAF77E81B9AC156367423DBB4D766A1F3B1E67595EFFD76287F22BC37DA4F0204633E804002EB7C1AD0836FA4D01E2FCDEAB8457DFC3D8B7F1151BEF3574F8F4653AA3780003787B8891901ABC8250A974C15F2DDDF9E1BE6798647EED710D06CC3FB4C276BFFA585680FC632D8EFD1614745BC3C72B82C53FEAE935EA5014E2B321F69BADF570FAD878C9590FD20FB7BF1B31E373DA93D1A8C63EA45E698CE060FE70ABA0FA84F37E836F2AD2998F07101D3FC7CA2B08B1398E1687ED5A8CE860EF9B4889FF436B74D13281D1F6A7EDF1DBE8989BFAEEFE6A475E65217643E757006871E664099F5B3846553603CD9EEF8FC195807361FBFDEB8DEE6A0B79F009C10DF397FFB865F4EBD0473D458D553358029C6B5A95D6FFEE9B645311D10A8F479B7E5249AA87E3DED08311B4DDF3A458FE61AE294A22643861826ACBBC9B0EA8B73157CE15D1FF35098AE67159B07CA7499398C26776DD9884B5D3786C87D48E864D8BBE2B73E2890F217E135BFDFC4DC5E805D9CEFEF5268E33DB611ABA6A5D57EC82B7246A63DCF3EAF3A51CF503D65C206D2362421DE774158AEAFFEE45A6B5AD5CC0B1DE0E2EA74E97913729A69E9C00A309DDCEB7738BAF4757EA9CC96E055BBDF692B12D8B01B92CE5ECF3D52187402CB7FD961A2672DC1875B6EA22AD7F5F42B1B52BA2D780F2E6C5B25FC7E30B1B663E3A09C8FF0B5C302E0E7F984DDCC62DDA65FD996E17DA72F02A16C354BBDAD44C5B5044759BD53789B98BC58CC25FCDF10A9CBBF0FD6ABD58A4CEDD92C5D85EF22B3C5EE5D9440CE42995517D2F7352CE997F51A36B9FA5703B4C6491AD01F406FD1B5BF85321026D28B51354DADEDF057B37743499A986469F908A01F3C1B74DEF5D8E2F57ED25A80720B540333109A0A65E7984B557F65429F3D3BD7EC3732A10D7AF36DD5D2414A09949A0F57F37BD9021D2C482E61437CC15E9DFDD92D4C212C4FC6C22C54591E5AFD48210FDC88040135E433F50E45874E0D5EE2BBC857F2C80E2FA4FC7ACFEC8EEC0CAB351F677C790787C715945C21BF923EDC0A58878AE09ACF5FB5A003C9C0B6E30A450CE6DAD4B626108B88E89F1E6A7BB3843E1EC8AEE35AF69E81773CFF71190F819CCF24142D60AC51B80B61019EC7ED2EFB6C5F18B499FC9727BED2E3324F8B94A522092E0A98241E29F8F14C6561DF3FEA0824F9CB0FE10BB497E427EE62085E7AABB2900FA47BF27C1638BD116C5555C076DEEFE9754E8ED333D72CE9423E27EF640FD5199C0CAFBCF2DA1C5C34121A69E7E0DEB3C268FE60C6797056383DA43E6F472D225116F63124498271D3D43AADCC5871F2349CE040BE068D72EB57B7827A7D9AA01405BA0AB07E684B91EF05418948F6713AEF1F4948399E0E6130740CAE3E481A6366295422BE3EE2E892AA9FEE86A6E23E2EBCBE654989FD93D1C4E7D62910E1223BD66B7C54F8DD7D373986E5D4141BF0BDE98DD13AAB7D598D698660F11FA4BFB0AD09D5C27B65386C8673E6C4AE9E8E30F8DD1A5A3FE557A3C29DCF99A7C376200AB595C49445E740E3DAEC07BC047FD6EA4FC6CFDC23D7449F9D1170FE635CA36D3DE5B57F1CFB182DE240CD4C1E480600C449D1A8596D8315906A53954201929E7665DD2E27D590D481DD394CF2E8AE19217F1FF0CB511DEF7460DC9E49C21607247857BA744B1384344B4C2D8CE987512376F66F1A279509281242A7A2A58ED500395418138ABDB9C5572A258D157F4D3E88ED216BBE9CEE3BD054FE61F94C59A4AD19AA62E456B86CADE61622A6FEA877575EEAEA20C76AE8A89E7B44396BAE0EEEAB1C23F221A3DF2B2CC683256A4E5C8207EDA0B235562AD3B510F9D3FBE0B51CD8F238A0ABD2EC182681606C8FD111D8CE1EC1CDA6DB4572303DDEB925AC1FFFD75E321468266790DEE6BC0E85070CEE749D9E46795936324DD1388E1B11AA617500534B8DAF2DE12B035F73111B770F5F56F5C6A4152C45CE0E112E650FAA9F3C7E59E3410745C29FA59CAE5CC37FE4C6594990E50DF1576B69B2B292AFC58A804743F49DD7C98C1768FD19AB4213AE4FB197492AF5BF7FBC6C8B507673539D8515DD527FAFDD8CA3EFF629CAA720AA11E65922678447AD4DDF5FF943873DF5203AFEA4130CA5F633E104AB083EC690CF092D208A98006E91BC7E33731D18E592869E564E6D3FF8BBBBB9837FFC1F1B92DE0F5DD4A029C51E3F64592CAC3DE1B4CA5414F894B7B0B7D73D6BF1DA4B908ACEAB47771DA56A8B0536301FC5FD270CAA55CE171332F7DB2EB4619C4B2C1971EBC0AB8B0B11FD54C24285DA8428AB9E0150D8897216B133ED554DE8CEE532024DF8B8D9314D7C9A3EC60464F9C7BCA8C3D4FBA23A7B543AC111ABA8C8F1BD54A243D565DC062F84CCCEDB0A03375FDFBCEF8AD8CAFC440D3E6F988DC607ECB947673DEC4AD48724C91A6BE22A0027E42AF6D94D26D188D0B7B3A5AF012880FC0105DD2F11171742321DD41A0401415C58AD4DC445642A2CBB466788F54D270BD8DF25602B298B62B6D0FA3ADA97008A99B73A807092F8957F17EEAD9D53B1128FBEF1DEFCBC607EA92AFBD353E95F52D33AB7C1EBE2 + +count = 96 +seed = 26CF860726D4DFA38AE07399838BB336F1BEE59E9F23AE4C81E73D49964997EF21CB5F5412F9A70A1EC39FC6228C36CA +mlen = 3201 +msg = DE897F02AE7292ABAFA6A0CAD52929113410F2BA972B4184E894C4D31081420751560956F49CE2B772635625AFC3CA6698FBFDE4D0A05EF243DF190BA1CE780EB572590E01E6E283E1963F2B0722B0CEB365552F65BD405F1A284DDBED07BA61C4453D30CC28C83E41590E09D7BB6932D231285205D61332FA9263B8A2D3D7F7FA20F521CA4B49F249896780E08C2DC41669BF0777278F87BB1F72CDDF4B998062B1642791F81AD474D6D8F963DCB4458CE11108544C41CDF19145B77038C7E8ADCD6501508C53B25BE6E787313018620D1BA647CCA4A5A8399E11815EAECEC6AE66DBC576699BB0AB44DE111AB6F252256389EFDC0546E641DE87FD6A3A724716257A9174F39542539A593864441EB79D499FCDF2F1D053CEBB3A1FCC09419D2C553C2265B3DC3943E0341BB49130E9981EC59945FA0B23E9DBDBF352ABA0D925C4333F2EE1F2C83C847EFA78BB13263B893D7CAE029BF08CEA2A5D1B5B997E403A489C6D9A124FB8386FE58C2476894E7754B8E5A162102A119482B5E59F8D89C8B1DEA70B6C80641C77BFD12D45C5B3CE0021EE500A1665ABCF740794E0D3E7E8CB5804A1E0D0C81A107DEE80BF63BFF8CE2EE2DD602DF279DE39C579B417A758356D2B48B41E83495DEE9ADFE4506E03F19DD096E81405264D408B2FBCDBF41DB5CED6FBDC2645DBEFE5BD038382993970C7686DBA3FEDC24E1F91BA4B6CF70B2E832B97BE24B6393273A519DB0B4446E98D77E86CCACFBECCB18939013C66F7A29B10DE2E88FCFAEF656B858B7DFACC4F21EF5F328C0EF604FEDD993510BA40530B79525FE8D336DEF0E5C303539E664A9360EDAD7268F70DF4DE199AB3F70EB2BA65E2752BF5FDB1E853E6F4EFCAFBB31D8CC23155413BE31082DA958B01682894A9057CAB66D4D64A6F3B1D81C5B75815A3E0CAF6486B17339174276A84E11C117B060302DC2EE06A03C0E15395C0DD32661638F059A385578C1B792349A41C511D12AC7185B060A831EE296E6626459C2750FAF3AFB579F6F6836D566C00C979B5130E8E50431E914834CBB3D26F6E5BA50BCF05D50F699FAF10767AA2831C3557A53AF14BFD9F23C00F76C2680C7DBF4A9B2A425E34C943228C3EBE55A0960ACC757D7878F7943E2E8A1CBC8C0D2139A6A6459D3492A1A7757F71E90A58A78E0FF9B04D059C5D131F6E3C30742FDE5506AE7860045A4C903DE96DC43AC6A69273BF8EDAB7E7FAFBAAD9EFA8FA609961502EFACCDE63A6D98D8D017075487C608FF701A7E3381D7A2ACB134B198950ECC6970A75AF5625FAA4EAF968CCE48FFB673F4F365802A984C609C33BA312140A60A6F0924E945D11BAACFCD643C874D352A90367EA4C59B63665364832B1A9A9A01EDA92C64F393C357158973FA7C6047B8B5E27EEDB28E26359402B63032F8B230F5AA968272819CA486A8BAFD3D66799AE951CABF04EA81E1E7E4632B915D4E8387C7D1F4FAFE1C1FC8666FE0318403EA0027487E947D844A7FA28C0523A64EBD95D2A8ABF6A71FEFB5BC059B2CBEECD4375F3A3F109DEAD98539244DDCFEE9E42DB3ABDAF943C445712EBF19508A1FFA6133C5078C1DA69A32CBE729A8876C4C73CB232024A87D87FD5F9456D3D4A936CB4CE2E00EF415406D66D344000A4A95CC9651425A16021336C4BEFF310210324C754BBE13CD0066C507413671C80CF492B4655D898A18A2F4DB5A393400C6AD821580B0712D6C919C62E87FE212260EAEF6876C409FCA1047A67B223E0766144F3F676F051FBE912C4CE4A9F7B85459DA031EC47C621F6EF06CD1621421FA52B047B51C944DFA94807083B4ED40D533B19813477193D1E4E96C8D76A5AF3100FA44A985A6513060B08A7F3848159B3CC551D43370B223037753B824A099A7C7DF59305BE09E2E79618C83818BD542F39380126A927190EA5536DFA63B664AA7601C6D82CDDF4CE4006E1AF2601EC453971828CD09C29D2F3EA6392B58D38BCF40BF6B6497F6B848CB853B187610CD23880CB09787C76087356C66565C0399BE746A81753442E4AAA54E84F1D8C2CCB2D00A551E960203D61E71A72E131ED1967DD06E72C99264EF2EE5BD156FC869B5031BA23A6D354D7CEC58F339F6BC2DD1C547F07AA733994860197DCE5BCE6024A74668ED89A2C9CAFE1F78B31638C3225D96009C260FBD28C1F0423E75C9C01A0F9E62B7F265FA3817F441F56AE79BA54A0C107FD7946A2DDDA60D0EAE428715FE2B4FF93BEF83CD10E5E17760FE028F1AAC8084A43EDCC12BFD3265D13FA94D9704809A50881D48F0080A976C5BF31B353B9043C0F0B69AE6F2B8BADD056752F2FC9E90C4B35850C2D45B9F354B41ED7826B976528875547A0C389B83725E26C006CC8240E380E3EB554DBF2133A131743539B1D174CCA6B135C59F81D499631BDA4CF90DED836E8C24C074A0BCD83271309FFEF320791C9030FC2B1F53FD2DE870E54EBA20CE9930C279B48B39CB481737F012F65933650374BA39E2222191B0E3C7DB9632CE9CB077322CEF97ED832DDD8AAEE53C52C03D2AAF8EB5597D8D6467A406BF428E2F16462E0C0D486A1C1C7348CBBF92633EC4FFA75945025A3C92095317E32290D4CBAA6CA40F3F201975F3FC8B733D1467C094E075E8415352E3AE51A6C5169A4AA430BCD66FF39B184F5B7174042DFCC6840EEF60CCDCAC12D012AE4F24F7184A038D8D9964AB405366740600B98CFE2E4737C8D846FD4E9B22B5047110D85B37BDB9E7E3BAF5298BBDC1050AA20F14E34DEC283830F5FA9C570C22CA659C1276BE8FFBC0AC3551DB8488855AE7EC21E239E88A0F68227D17DD87FFA3B3D0535F9E57807755DE56A65C0DE9F4A79F8746B20908BF9416A86F62EE2C2545BCA2D55CD4D45DCDF06DC879E1B6270A80778D0274AA658395D800EAEF367DF4F4D838EEE0A66093E0F419B9EDC5F003E31CF0EB7E1CEE9ACCDA7A2DFC920A4B5222389DBF12AD17392850C434A9B3C260159B0F52E78E7A66D28DD5B3C77662CFED2CB3DD5BC3CC26A34293EBF1FB3A9BC59BB0C104C5A9387F3893A65D145D424CE741A375F9C65E733A024E78FE274B29FF4B0EB6F21FAFC31453EAF7E48FABEC5711D3898B876F59952C73123281A8E85148CEF5A166BF45DF36053D57AE6F29D3E334BB2395FA236D4DAA8A4FDF99D80A9BCDBED36154BF4FA3D463D51974032D7B88B2504317E14165B1C3FE3D8FE366FC8284321D80F9CF512F418C63F73B7C29C07870332387BBD1A870AC39485F64086006CFD68C8299347615A423736C01FAEF2DA56CFB6FC966948649324E22D4551B9F50654EE505547F7D0B8481ADF6AAC3977F49D7E6AE5C4248DF7B43BDA7F082AACFCDCF1C1BC04F2D45F5E028498ECBCA47EC4D1DDEB03A2AB27BE9E4B80585145676F8AE7A5017BC5EFA317A576ED6E423D5A0495B8DC619712A2C3E6162B04B9BBC7DE4BE6532F6C1C019E702C014C60189A2612594BCB18317804C630264D07B7396DB562777BC305B885E00706FF6D0208737BD229BC7AEEFF5FB770A4C057B347601F1F6C16F60D4A53A0B32631AD2D41FA307F6630228E1807D22475D5E331A50A680896DC606F3941AC08F8BA46DE5A49F5ED6A94965334FDFD69C4A6C7973D9615B3FE576B15AACB9B98D9E498D2A3A89B4F8EEE715ED5F29F13DDE7629BB386F7CC800F16F3B5BA8BD0E14CD8D9BB0F0AA615BE9D7557F6EFD00F7BBEF9989E7F463279408E6AD77E100AE4457D57424F2B1CAEF43052C5B25C896BAA1C2FE67D1D6F669311F17D39460F0B176A7727F53257A36FAACBF3DFE623D8F882F8EE41BA1CE387E1D1860F4BABE26ED678395B9979D84DEA5C7B38905D4C7FD867ED7722D066BFF3A833D3282BB40D1CD310DC8DAC9270A49B65B5181EB30F166CAF0832A8DC56B9D135550B506D98D036BE7876836AAE669507990DE6D03E78A38139CF64F65FB410F192E30B045C93FE259C10E0C5B56A2B5F0605DA0851104C4BEEB4E3B30135CAE5A6C68403C63121B0993832834A3B5EBDD345C41B26DD219560B624024B8B945A10D385B3CE4E0BD54E10A64ACA59D283302028A9592120D142CCEB1CC30E1F96AD041F1E17BCDC3C68C2EA2E0D65D6BA3696166CB365CC461ABC4D67D504E8290EB452ECB77F6D5FAA5053D01317646242384C5C510BD43C5780BBD01EBC3AF33D29D8A09EF39AC85E70398D2A64DFFA72B3EFD8D6D57AA2F9DAC0CC6EEAB27B69FDF2403A5FEDE0BFAF441619BE03FDE44C49FF0A34E9C37D2B9AEB726D56EB646A67BF349323F397DB056D71DE72A2597D780942554C8F8273E307DBA6BD02E944E0559509E1F28B511BD709D03EA2451EF234DF6F077E06AA01E2806D5BDF89DF29F1B3D8C6D8014496AD83857F7465F1072E88709D0194733E1FC8C9F092DF5B9802FD2DDDA8B142217B9532D8604E2F32D06F6400025930DA2BE9B25529788E6BF4EB7F84C272DF455CE2ADA291CFDB5FE815129E4AED59625C879E99B3E3C1B6C5D7 +pk = 4E9C384C66402776D1F26C99005CBC096CEE17C80BD17601C6AC77BBB94BC923ECAB3C86BC5B7031BBB7C4501DCE5636C8FAF545DE86A706F02BF57081E20100D8F1BAC3F8D252C463706CA5F3D1444784791B3C135A015AA75FC0915E22CFFD2278F6DF5967EDD74C1DD932BDEC5670DA0801D0408014FF13CA9E11F28630010B +sk = 4E9C384C66402776D1F26C99005CBC096CEE17C80BD17601C6AC77BBB94BC923ECAB3C86BC5B7031BBB7C4501DCE5636C8FAF545DE86A706F02BF57081E20100D8F1BAC3F8D252C463706CA5F3D1444784791B3C135A015AA75FC0915E22CFFD2278F6DF5967EDD74C1DD932BDEC5670DA0801D0408014FF13CA9E11F28630010B65D414B8C3631EA754143B4C4B0367B775B8500EFC2C0061F5D25D21B4D395D8BA000000000000000000000000000000000000000000000000000000000000002EE2826325537658152B6E29CF2027EB9CAF84182868169B019661B1C57DA0ED4DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99A5FFA2AD0AF8D13C5639EC9D291FC8689795B20736D8CC20997062AAE2DF59B3FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033ED6154985C2F341ACED83054CA6AD639093573C75DD0E41989234EB6101AB0F91C373EA902AF34DBB73736A26FFAECCC00381996F5BE5657A0BEEF5A8407112BA385418C738244C1EDD51418FAA6CCD0F167E539155A93F14663DAFA52DCE5C638796550604A42EC61C75E10257232CAE11EFFB8170D9E7E4763C6DC014A2011E5BA442FEEDE09144F2672EEE77C67CEAA40AA4C73F376DC9A832AC05EB9D2EF8EF29D3ADCCC630960BFAE8546A7A74EA3A74F0ED276280A1E08C7098BCD5C354A6FEB122C6B19C7D41535391AA29473384CB0C1593A7E3B1DA9D3A2515CF15C7FFB113EB7CE8C9656EE68D5B5A926DBDBB7864B5B0C11B9F31901 +smlen = 3493 +sm = 0BFA785A12181E572395C21FD4CFB62C6A6F4DB80154EB528C950ABF49F9D18D6C9F5056D55446E3E2D6D157491317640CDA545CB5281687D4C688217CE6720096AF242A2C491B22DE39C8B25BD1E406E12C4F228DF10B68868845F401BE37F5DA011639683C1B6E888A8F27CAA4CFBD8200B8E246140E88AEB10E5E61A7160103016DFBBBF41C2367F97897A02D7DACDA6B22418855B693FCD3A1583977E93712063C86520B97ED08EA101B65748D8CB31B05BFE36D4665F85B03E2EC8C4825EC00ADD63D03AA1656C947FC9C436A8421D6A5C890955F53310E7AB4F3C537BAFA008A0260F993E94A824ED5106EAF3E612EFCC2CA6AA9E639495B1854C1B508DE0270D6C87D123E24784AAC0E6172330B6BBE2B37276B85F9B417B0FF8AB9232A000209DE897F02AE7292ABAFA6A0CAD52929113410F2BA972B4184E894C4D31081420751560956F49CE2B772635625AFC3CA6698FBFDE4D0A05EF243DF190BA1CE780EB572590E01E6E283E1963F2B0722B0CEB365552F65BD405F1A284DDBED07BA61C4453D30CC28C83E41590E09D7BB6932D231285205D61332FA9263B8A2D3D7F7FA20F521CA4B49F249896780E08C2DC41669BF0777278F87BB1F72CDDF4B998062B1642791F81AD474D6D8F963DCB4458CE11108544C41CDF19145B77038C7E8ADCD6501508C53B25BE6E787313018620D1BA647CCA4A5A8399E11815EAECEC6AE66DBC576699BB0AB44DE111AB6F252256389EFDC0546E641DE87FD6A3A724716257A9174F39542539A593864441EB79D499FCDF2F1D053CEBB3A1FCC09419D2C553C2265B3DC3943E0341BB49130E9981EC59945FA0B23E9DBDBF352ABA0D925C4333F2EE1F2C83C847EFA78BB13263B893D7CAE029BF08CEA2A5D1B5B997E403A489C6D9A124FB8386FE58C2476894E7754B8E5A162102A119482B5E59F8D89C8B1DEA70B6C80641C77BFD12D45C5B3CE0021EE500A1665ABCF740794E0D3E7E8CB5804A1E0D0C81A107DEE80BF63BFF8CE2EE2DD602DF279DE39C579B417A758356D2B48B41E83495DEE9ADFE4506E03F19DD096E81405264D408B2FBCDBF41DB5CED6FBDC2645DBEFE5BD038382993970C7686DBA3FEDC24E1F91BA4B6CF70B2E832B97BE24B6393273A519DB0B4446E98D77E86CCACFBECCB18939013C66F7A29B10DE2E88FCFAEF656B858B7DFACC4F21EF5F328C0EF604FEDD993510BA40530B79525FE8D336DEF0E5C303539E664A9360EDAD7268F70DF4DE199AB3F70EB2BA65E2752BF5FDB1E853E6F4EFCAFBB31D8CC23155413BE31082DA958B01682894A9057CAB66D4D64A6F3B1D81C5B75815A3E0CAF6486B17339174276A84E11C117B060302DC2EE06A03C0E15395C0DD32661638F059A385578C1B792349A41C511D12AC7185B060A831EE296E6626459C2750FAF3AFB579F6F6836D566C00C979B5130E8E50431E914834CBB3D26F6E5BA50BCF05D50F699FAF10767AA2831C3557A53AF14BFD9F23C00F76C2680C7DBF4A9B2A425E34C943228C3EBE55A0960ACC757D7878F7943E2E8A1CBC8C0D2139A6A6459D3492A1A7757F71E90A58A78E0FF9B04D059C5D131F6E3C30742FDE5506AE7860045A4C903DE96DC43AC6A69273BF8EDAB7E7FAFBAAD9EFA8FA609961502EFACCDE63A6D98D8D017075487C608FF701A7E3381D7A2ACB134B198950ECC6970A75AF5625FAA4EAF968CCE48FFB673F4F365802A984C609C33BA312140A60A6F0924E945D11BAACFCD643C874D352A90367EA4C59B63665364832B1A9A9A01EDA92C64F393C357158973FA7C6047B8B5E27EEDB28E26359402B63032F8B230F5AA968272819CA486A8BAFD3D66799AE951CABF04EA81E1E7E4632B915D4E8387C7D1F4FAFE1C1FC8666FE0318403EA0027487E947D844A7FA28C0523A64EBD95D2A8ABF6A71FEFB5BC059B2CBEECD4375F3A3F109DEAD98539244DDCFEE9E42DB3ABDAF943C445712EBF19508A1FFA6133C5078C1DA69A32CBE729A8876C4C73CB232024A87D87FD5F9456D3D4A936CB4CE2E00EF415406D66D344000A4A95CC9651425A16021336C4BEFF310210324C754BBE13CD0066C507413671C80CF492B4655D898A18A2F4DB5A393400C6AD821580B0712D6C919C62E87FE212260EAEF6876C409FCA1047A67B223E0766144F3F676F051FBE912C4CE4A9F7B85459DA031EC47C621F6EF06CD1621421FA52B047B51C944DFA94807083B4ED40D533B19813477193D1E4E96C8D76A5AF3100FA44A985A6513060B08A7F3848159B3CC551D43370B223037753B824A099A7C7DF59305BE09E2E79618C83818BD542F39380126A927190EA5536DFA63B664AA7601C6D82CDDF4CE4006E1AF2601EC453971828CD09C29D2F3EA6392B58D38BCF40BF6B6497F6B848CB853B187610CD23880CB09787C76087356C66565C0399BE746A81753442E4AAA54E84F1D8C2CCB2D00A551E960203D61E71A72E131ED1967DD06E72C99264EF2EE5BD156FC869B5031BA23A6D354D7CEC58F339F6BC2DD1C547F07AA733994860197DCE5BCE6024A74668ED89A2C9CAFE1F78B31638C3225D96009C260FBD28C1F0423E75C9C01A0F9E62B7F265FA3817F441F56AE79BA54A0C107FD7946A2DDDA60D0EAE428715FE2B4FF93BEF83CD10E5E17760FE028F1AAC8084A43EDCC12BFD3265D13FA94D9704809A50881D48F0080A976C5BF31B353B9043C0F0B69AE6F2B8BADD056752F2FC9E90C4B35850C2D45B9F354B41ED7826B976528875547A0C389B83725E26C006CC8240E380E3EB554DBF2133A131743539B1D174CCA6B135C59F81D499631BDA4CF90DED836E8C24C074A0BCD83271309FFEF320791C9030FC2B1F53FD2DE870E54EBA20CE9930C279B48B39CB481737F012F65933650374BA39E2222191B0E3C7DB9632CE9CB077322CEF97ED832DDD8AAEE53C52C03D2AAF8EB5597D8D6467A406BF428E2F16462E0C0D486A1C1C7348CBBF92633EC4FFA75945025A3C92095317E32290D4CBAA6CA40F3F201975F3FC8B733D1467C094E075E8415352E3AE51A6C5169A4AA430BCD66FF39B184F5B7174042DFCC6840EEF60CCDCAC12D012AE4F24F7184A038D8D9964AB405366740600B98CFE2E4737C8D846FD4E9B22B5047110D85B37BDB9E7E3BAF5298BBDC1050AA20F14E34DEC283830F5FA9C570C22CA659C1276BE8FFBC0AC3551DB8488855AE7EC21E239E88A0F68227D17DD87FFA3B3D0535F9E57807755DE56A65C0DE9F4A79F8746B20908BF9416A86F62EE2C2545BCA2D55CD4D45DCDF06DC879E1B6270A80778D0274AA658395D800EAEF367DF4F4D838EEE0A66093E0F419B9EDC5F003E31CF0EB7E1CEE9ACCDA7A2DFC920A4B5222389DBF12AD17392850C434A9B3C260159B0F52E78E7A66D28DD5B3C77662CFED2CB3DD5BC3CC26A34293EBF1FB3A9BC59BB0C104C5A9387F3893A65D145D424CE741A375F9C65E733A024E78FE274B29FF4B0EB6F21FAFC31453EAF7E48FABEC5711D3898B876F59952C73123281A8E85148CEF5A166BF45DF36053D57AE6F29D3E334BB2395FA236D4DAA8A4FDF99D80A9BCDBED36154BF4FA3D463D51974032D7B88B2504317E14165B1C3FE3D8FE366FC8284321D80F9CF512F418C63F73B7C29C07870332387BBD1A870AC39485F64086006CFD68C8299347615A423736C01FAEF2DA56CFB6FC966948649324E22D4551B9F50654EE505547F7D0B8481ADF6AAC3977F49D7E6AE5C4248DF7B43BDA7F082AACFCDCF1C1BC04F2D45F5E028498ECBCA47EC4D1DDEB03A2AB27BE9E4B80585145676F8AE7A5017BC5EFA317A576ED6E423D5A0495B8DC619712A2C3E6162B04B9BBC7DE4BE6532F6C1C019E702C014C60189A2612594BCB18317804C630264D07B7396DB562777BC305B885E00706FF6D0208737BD229BC7AEEFF5FB770A4C057B347601F1F6C16F60D4A53A0B32631AD2D41FA307F6630228E1807D22475D5E331A50A680896DC606F3941AC08F8BA46DE5A49F5ED6A94965334FDFD69C4A6C7973D9615B3FE576B15AACB9B98D9E498D2A3A89B4F8EEE715ED5F29F13DDE7629BB386F7CC800F16F3B5BA8BD0E14CD8D9BB0F0AA615BE9D7557F6EFD00F7BBEF9989E7F463279408E6AD77E100AE4457D57424F2B1CAEF43052C5B25C896BAA1C2FE67D1D6F669311F17D39460F0B176A7727F53257A36FAACBF3DFE623D8F882F8EE41BA1CE387E1D1860F4BABE26ED678395B9979D84DEA5C7B38905D4C7FD867ED7722D066BFF3A833D3282BB40D1CD310DC8DAC9270A49B65B5181EB30F166CAF0832A8DC56B9D135550B506D98D036BE7876836AAE669507990DE6D03E78A38139CF64F65FB410F192E30B045C93FE259C10E0C5B56A2B5F0605DA0851104C4BEEB4E3B30135CAE5A6C68403C63121B0993832834A3B5EBDD345C41B26DD219560B624024B8B945A10D385B3CE4E0BD54E10A64ACA59D283302028A9592120D142CCEB1CC30E1F96AD041F1E17BCDC3C68C2EA2E0D65D6BA3696166CB365CC461ABC4D67D504E8290EB452ECB77F6D5FAA5053D01317646242384C5C510BD43C5780BBD01EBC3AF33D29D8A09EF39AC85E70398D2A64DFFA72B3EFD8D6D57AA2F9DAC0CC6EEAB27B69FDF2403A5FEDE0BFAF441619BE03FDE44C49FF0A34E9C37D2B9AEB726D56EB646A67BF349323F397DB056D71DE72A2597D780942554C8F8273E307DBA6BD02E944E0559509E1F28B511BD709D03EA2451EF234DF6F077E06AA01E2806D5BDF89DF29F1B3D8C6D8014496AD83857F7465F1072E88709D0194733E1FC8C9F092DF5B9802FD2DDDA8B142217B9532D8604E2F32D06F6400025930DA2BE9B25529788E6BF4EB7F84C272DF455CE2ADA291CFDB5FE815129E4AED59625C879E99B3E3C1B6C5D7 + +count = 97 +seed = 13F1F446D9AA5AC853278BF74C9E6447A6CE4294C037867F43DF554370EE261D05C7260EEBF46D6694D0850B8343FBE5 +mlen = 3234 +msg = 525E8B98C55864849FFC71EBC953F7A0ECA6298F6AA15A83BF6923BD5921B1C86DBBFC544A39C364EF6D9281481E946C994F96829D6639727A5345560D8641E9A510F913F7FE5592C2A40CB278F5AFD8D4504B5387C20945654F08168247A98F56A43A5020955F882D2D93781F4A83676B08F50341E953A5D1B67DE7F6D1BE3D78D5D060AA85B5EE4271763C437CCD595890DBC8FCFAF2754AE9349BA2FDF89847A15188716C0EC672887A4B9A15176AE0C5138819CA232D012BE1DCFFD29F677442083087C127CBD80B0D9CC0962BC8318E734910D1E2653BBF700C84BB0919E12DF331CCDC7128B41F0666F6419AFBADAF673BE16C9177D3CF113C6488504DE088149BFB83EACBBC400309B7AD753F7B2F5AA89F070C9D14C084C32DF91C5F7CB6A7D869D64F4A05AF80A98BE7517ED784C17B0D7DF96B9987B7EA7A398CE018AE6E13E1C0F7AA040AC3FFD273BB9687AD6FEFDB211061A6228967E9DFEF69BCC1C5D02EE56D49A93C8AAD46D08322A2CA246AE8C3EDC071D063AD605A97B8AE94D58E897A4A6310BCBF55B0CAE1AA81769D30B46F883EAF29D4B5FEA32F2DBDE49360CB6235754BDC305ABB5E5395360097378656E2BACE675448889B0149D6086C51E9C3AF07A76563164864F131CF9C0CD475CD4A58726AD237CFB76ACA68032351FB24711DA635871386B4BFC94B0DB6D35F07D0196F75CEDB92EFBE7D653E0FF9326A596F9166FF6CAB73125DAD27F361D6122CA531D86910187E75F849EDB52DB26C96FDF05925DCCA232480D3F979EAB07CCA68FC9069965D12BB666A180989AD1FBEE3FE65E746C5A8F64DAB2E370F0487D001121EDD0D0D760531AF46DA65C75DE11688EBF31DD2AC95C188BCFA07EA798609F3EA8E6364A43742A2825144FAFC05ABD17476480812EB2483734B13D075B3EE3AD510B67CF7057014351B2CE5357E3F12F43BA74CED614BE3A9AC0E26763E9AC596F87AE98F72ABE0DE213A81A9A03E2B82F2312C1A186DFCFC3DB346FEB132931C793ECF837F57D8E326101F59705B77A3083E712CE347C2C29C23468B0C5857EFA410197833987C61ECBC2A855EF78B3D7B1B697AB9844AAD07C4B8EF666BD80DABA5FCAC900C5D358A11676FFC89DFF4F36F29F14D9F9B854DCED41FFC4B36381449D22801C19BF8E8BA1F07A1B38FFB527A34D009C4064A1E606FF2AB90AB2E05C156150EC14D7DC792578A16F46650D0ABB61175D1817E2C38F109EBC01A3ABB358673561691185DA32EEEF566C1BA1C72C1F08CD1B427B552425501B8783116F2EB0CFF73C5D2DEF18D291C106980135821A77428FAB20A935AC8B6DD8EDD1A936225344EB103DE0D5879CCA09359B5B882291C0FB1FCCF167C30DBECFC324AC315713CD10F35B72F0D4871A7CBAA2B4CC2BC2598F23DA607C94A063C9E2013B0EDA5F3BD5AADB2C429177A4BFD7B6181ED5F9A55C1F043DA8155C9E7BEBDA7EA07DEA49938FE07743DF2295C220EB53348310842B1000B7A02AC025C3A94FA82D46ED7E2712DE71B149742731EBE62E225D21A7F29D5F3A8A62B71FE16258570DA412C07CECF82B2064AB5D98761C69FC5E899A8E174875B3179DEAA0BF4A0261DA9BF39148440DCBEB0C887E41FDF751505DE79AA1F8593F45482B659F5B5F4CC3E7BFEE59DEF49458DB195A1A692B8AF4AA44CCFB00B753AC761181B8AAB39DB82385AE776CFC585F7873613B62DE55BB10A6B2F27E631CE41436C3FE390163E6F4EBD6B501519C96C06FADCAC8F75920FE1435542FDF535EAD6C0E3F41345996063B95A208DEFB6F110CC861580979BF4422ED395CA218CFC3B22C0BA8B31CB9EEEB51C3DF35FECE92795CAFB8440F522B44E21B3A18D5CDBC296B887A4B927F36715E4AC2CAB043D8B69A8704D6BE24C725B0C2E814BCA7B040C27FE8F4C14911051039AF13F44E0485EB767F5404CFB6FD19DA24D82FE24B53033C83DD8634E2E28AA330A81F14BAC1C57DEAD7FFE39994D9D094383E14322E146A3DF27A776E2F09A11EC9014C809F8E543594D6B4814918A129B36FD25015A044E04D3F081D4D201DF86A0FCAFBBFC695088170B8246776B6A28E59449C646D1E706CEA96B12683CD3A7C60459D42989CA46694B0089CF88E9AEC5E110F69FE0E3FE20D18309D1BA72A83A34813B771484505B08548FE5D376AAA0C414260EA4BCE5EB81F6545CD5203026264938905BE1E252574F4B4E71C6E12F99F6EFD35EFFD64183CD0665FE89D6A357B1908E083511DCE2CDF792A608044C31418C433F86719E156AF3FF98D0F54EBEB9F9FBF24588A5557D310EF9D7CF5DD8A68512D8CB15114773C69D7B40C927858AFC049F7C6A89841020E1C313C5C38B988EF505EBE6C15FC1D6CCD8B472F90ED64DA895D06AC01BB99F455A195A670D22DBD5E3F03AC84A08831E9842A566E9785A0FD4C460C5CAC154D705DCE1E7FD1C45BAEB23976AF881CF5628F3CD92AB19BAE8D45A03A859518E4A1E558FAC2B48A432E46CF274E6496B63874CA4E4571132568AA43EEC3D2A3948F40D327976A6D28CD816CFBEAF8FE126913384061D219F51179F679081503371EA0B6BD7E9524B0ECE2573304ECB4A16EB471CA0817C0C6EDE751F283ACEEC5A60C2796C6261FFC6226E4813241619F465DCE67B38E1D5A647B079503144907307C7D6EB6E6EC1936B5C94FCC08A882B4555B19B33A9BF22384DB38473A313966D157DAF8AAD41EF67D3A5FE723559096AB1768FF69773EB9D5C88D6F35F00DFA4473DF71C7E9E35393638DED05D05C105CBF37711D38E3EEE35E8CC0029B3761241FD1E56969E09E949690D4FE25735D774E777A2CA17FE058E14AE6806F611FB1E9FCD516E20499A704B67990716703A4287B50AB45D155D40EDC0AAF97F5B87551C236CEBE9CADD562B27957EAD251F79CAAC6433F228B50167FB1A753306FFF08B53A8A3CECC226857A321700EBE23AB4D6C35415CA79B682D6CFEF6B1341E7CE00CB9870F432B63A2D9A9A43C87D28A95C514582812DA37738BDA6CC76142E08F69EBAA5ACD0403100C2343E2FA088441E9A55C720BB509BC3600C27C1D39157E049650D1749751EFE55A72349E2A5B714556CE2188CE972287BE2152C7E58D3FCAD43A214A4095DE55CAE9F627D8B9018DAA01547842FA1AD14D67327CD47EB9B90CD94AFDF5244DE57E527F17894A410FB4210E06632E88A398400B0AA48CB3FEB9A90ACC668615D193D5A98158092FBB59AD2D6D4FFEE433A2A6A971A228685AE5BBAFB3AB28242C630AF4656C5071C545618A0A765FCE41B19970C2152D44C349D0CDFB29673D1A42FFEC139D1C9958B0962F7B57F80CB8FE6331553B0DF93DA9BFC722B1C001F48FF9C0FEF032610A1118AC9EBAF9202DFFEA605272A50A90768F031C72D570C0AA5B0D4FEE4AD568895274388104C0BF88D03FADC3159D6CF28AC6A7E3E5CF6FE5C6658128CBF81456DB8C29A76F9C75230F3837F1A94CB83C3AAABDF4B29C9045B45AB9552BBB6C0844BF2926267C0D74D3337249D5C9610E0F6FFD0278F12F39C48650C048D61A3FDB8E1A2E08CCCA68803A55B39BD39160B0420CBEAC7D8A55F571F490F694A7AA8B725BA84238EE1E711864AA1F74AFF252C088E36B79B09C80278DD442EAEA8C7D5833CD1BAA18BDD866689E663EADD0EAA6E0C78A3E09DFFE5F6F1F4003DE24336586B25DC5EE45D56F31D8BB2DE31B24E87172F3F1B26D400B08D50FF624E456183F269CBF06B3707260383174FDA152E4D0C528A90C54114C4F278D0FB35B74DD3ECDA14EE89D38E3227A7E18B068F134B22154348867A61719C926EA3320D1BE0B9ED78466B2DED728CA04C15AC144185FB2F5084511A38CFD765659351AC1AC3E5F327D9F3DE9B2B003758DA78DFD08FAEF3625CEDD87C8A55A3CD0257AA71B3788FD2449EFD1F48948CB304468E3CA07EA7044FA185A2B91F9761C6532B9273DB74C66B2DE95AB19E5102CB90C719EC85671E2829B182BB6D09323248D6584F0CA67D422BCDA65A0146D8DF27AB4AE651706D5FA33B5BB88ADC2A1A95105D55CCA8439A5060D110760DEE8B855D0839053BE595278EAE66542736D25C93D8544C6E55ED51AD6E7029C2E6D32CFA8844BC14972809E31754AF84BB479C504EE77CB65CEDDB6BDA613FEAA2AE6598D1F4975D0FCF9D9DC787EEB5C03F8B0BF438E83C38E2195EF1D35D40F5A14E194BC1BCC64D02CA722E7DA28334E91FB6654D708C5B07946CDF58747086EB3CA59D095EB27F1B7E6806D3A35335B2265031A1120F28EED8B4C5D9AF268502727C5D23152149C98E6970D4DCC4B9D0FECFA6A79FEF82CB233E71FC8AA999DF66EBF5A1DB2ED1583C65803FA8958F49890D13BC05C6A991F26C31766BDEF9BAC601A47C8C3C5E395FD8F47E56F04439E9BC8E9B1901A529395F2D57495D70D0712881D298A60E3E013326CD56BF9F1319EA8D6A6511EEFF373F081478A51E14F0AA4A33C6C5EA7816380C8984F7A5DA45B0C4B6B550644E65A5B2DF059ED050936FE6F073B4E8056ACCD3EB65A0B +pk = 32AED15B55B865168B7299A24D4097DD2D58CC448836523D4EE62AF13994F44257C5B6BEE3DCAFC15F79663F99319A9FE88F3F0540AFA4809BF08E9E16C03C00735A85D78EE2E65116F86CC95C9634A430BBA009F8141A9CD47B26EECB93BB885E87889D9C56DF06B805199104BDE23ED41304785FF366A3FD0FB42231449B0106 +sk = 32AED15B55B865168B7299A24D4097DD2D58CC448836523D4EE62AF13994F44257C5B6BEE3DCAFC15F79663F99319A9FE88F3F0540AFA4809BF08E9E16C03C00735A85D78EE2E65116F86CC95C9634A430BBA009F8141A9CD47B26EECB93BB885E87889D9C56DF06B805199104BDE23ED41304785FF366A3FD0FB42231449B0106E54B60B727568B78C006383DF1E786F8F3CB41E114412D0D72327AB88B07D3442B000000000000000000000000000000000000000000000000000000000000004877285063324773E8E02E70D9ABA9132A4F74868838C400883900F70C7DB55DE4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1139548EC3C39C12AC8F6E5F69076BD727377D634C1E9A61502DB71F7A26B592F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F534C70B654B872ADCC57B6B90E6C6E0AB8745F7B1B17D9AB8A27649C643CF9C08FE4C874FC611FA8A56350ACB833868159642F9A57A2637853A09ADEF90D5E08D865FA15D721E914FA7B09C945E8AFE5CE38CE1723D354140376CF7C03B8AE4E74F2BC537CD8043537989230850CEE1F267C76FB49E02F5E32BC64E60E43A870706F274521286A53DFEA9CA39E8E671611ADFE5A7EBC8E67B38F2EC0270D99BB8A6D7155DBA664938A9218E7FAFF62E444B98127BD5077ECCA14FA0B8D304242550BCD854AAAD49B559D927E6F6ACAAD9E05DF7E9AFB6608E687EAA2CEEA909F3C42DEDD42CCC1B6AEB6C190CE4C5B3EF8BB3D34A3BABC62347201 +smlen = 3526 +sm = DE0B89A68691DE10250D6C9AE703436167E64DDD75E7A8A9605FAE07E5F06B4D6F93DCA8C8170F29252D3ECE877086C8A5B3CE0450EA4D9EB3F3DAB86394F600592BEF86D47FB6A4438398122B91A847044CF0EC43866125B8AC0CAFD66851B55C88B7D38E4DB817C1B30B143ADFFE3AD3658D4E3FD4FDCD055D146809DBF6000202CB45BE6C0DCF8AABD6FA6FCB9C6A078A4305F5958BD8E2781A8B69A2DF80FC0323894B0F6C2F564B72252E0C03483D8601C669A646613C28623657A127F1B406CE1533FD3770875F3BB0077DB9A8D7146D65212444FDC540BEDA678924703D089A92D746846EE6B0FACAD2041B5EFD7650B416EBF5D17F65DCA19404AB99B10F2D078EB9C63EC8477A7293219F4E7E71D7BCB4D339F7179451B534E4E69E0C000206525E8B98C55864849FFC71EBC953F7A0ECA6298F6AA15A83BF6923BD5921B1C86DBBFC544A39C364EF6D9281481E946C994F96829D6639727A5345560D8641E9A510F913F7FE5592C2A40CB278F5AFD8D4504B5387C20945654F08168247A98F56A43A5020955F882D2D93781F4A83676B08F50341E953A5D1B67DE7F6D1BE3D78D5D060AA85B5EE4271763C437CCD595890DBC8FCFAF2754AE9349BA2FDF89847A15188716C0EC672887A4B9A15176AE0C5138819CA232D012BE1DCFFD29F677442083087C127CBD80B0D9CC0962BC8318E734910D1E2653BBF700C84BB0919E12DF331CCDC7128B41F0666F6419AFBADAF673BE16C9177D3CF113C6488504DE088149BFB83EACBBC400309B7AD753F7B2F5AA89F070C9D14C084C32DF91C5F7CB6A7D869D64F4A05AF80A98BE7517ED784C17B0D7DF96B9987B7EA7A398CE018AE6E13E1C0F7AA040AC3FFD273BB9687AD6FEFDB211061A6228967E9DFEF69BCC1C5D02EE56D49A93C8AAD46D08322A2CA246AE8C3EDC071D063AD605A97B8AE94D58E897A4A6310BCBF55B0CAE1AA81769D30B46F883EAF29D4B5FEA32F2DBDE49360CB6235754BDC305ABB5E5395360097378656E2BACE675448889B0149D6086C51E9C3AF07A76563164864F131CF9C0CD475CD4A58726AD237CFB76ACA68032351FB24711DA635871386B4BFC94B0DB6D35F07D0196F75CEDB92EFBE7D653E0FF9326A596F9166FF6CAB73125DAD27F361D6122CA531D86910187E75F849EDB52DB26C96FDF05925DCCA232480D3F979EAB07CCA68FC9069965D12BB666A180989AD1FBEE3FE65E746C5A8F64DAB2E370F0487D001121EDD0D0D760531AF46DA65C75DE11688EBF31DD2AC95C188BCFA07EA798609F3EA8E6364A43742A2825144FAFC05ABD17476480812EB2483734B13D075B3EE3AD510B67CF7057014351B2CE5357E3F12F43BA74CED614BE3A9AC0E26763E9AC596F87AE98F72ABE0DE213A81A9A03E2B82F2312C1A186DFCFC3DB346FEB132931C793ECF837F57D8E326101F59705B77A3083E712CE347C2C29C23468B0C5857EFA410197833987C61ECBC2A855EF78B3D7B1B697AB9844AAD07C4B8EF666BD80DABA5FCAC900C5D358A11676FFC89DFF4F36F29F14D9F9B854DCED41FFC4B36381449D22801C19BF8E8BA1F07A1B38FFB527A34D009C4064A1E606FF2AB90AB2E05C156150EC14D7DC792578A16F46650D0ABB61175D1817E2C38F109EBC01A3ABB358673561691185DA32EEEF566C1BA1C72C1F08CD1B427B552425501B8783116F2EB0CFF73C5D2DEF18D291C106980135821A77428FAB20A935AC8B6DD8EDD1A936225344EB103DE0D5879CCA09359B5B882291C0FB1FCCF167C30DBECFC324AC315713CD10F35B72F0D4871A7CBAA2B4CC2BC2598F23DA607C94A063C9E2013B0EDA5F3BD5AADB2C429177A4BFD7B6181ED5F9A55C1F043DA8155C9E7BEBDA7EA07DEA49938FE07743DF2295C220EB53348310842B1000B7A02AC025C3A94FA82D46ED7E2712DE71B149742731EBE62E225D21A7F29D5F3A8A62B71FE16258570DA412C07CECF82B2064AB5D98761C69FC5E899A8E174875B3179DEAA0BF4A0261DA9BF39148440DCBEB0C887E41FDF751505DE79AA1F8593F45482B659F5B5F4CC3E7BFEE59DEF49458DB195A1A692B8AF4AA44CCFB00B753AC761181B8AAB39DB82385AE776CFC585F7873613B62DE55BB10A6B2F27E631CE41436C3FE390163E6F4EBD6B501519C96C06FADCAC8F75920FE1435542FDF535EAD6C0E3F41345996063B95A208DEFB6F110CC861580979BF4422ED395CA218CFC3B22C0BA8B31CB9EEEB51C3DF35FECE92795CAFB8440F522B44E21B3A18D5CDBC296B887A4B927F36715E4AC2CAB043D8B69A8704D6BE24C725B0C2E814BCA7B040C27FE8F4C14911051039AF13F44E0485EB767F5404CFB6FD19DA24D82FE24B53033C83DD8634E2E28AA330A81F14BAC1C57DEAD7FFE39994D9D094383E14322E146A3DF27A776E2F09A11EC9014C809F8E543594D6B4814918A129B36FD25015A044E04D3F081D4D201DF86A0FCAFBBFC695088170B8246776B6A28E59449C646D1E706CEA96B12683CD3A7C60459D42989CA46694B0089CF88E9AEC5E110F69FE0E3FE20D18309D1BA72A83A34813B771484505B08548FE5D376AAA0C414260EA4BCE5EB81F6545CD5203026264938905BE1E252574F4B4E71C6E12F99F6EFD35EFFD64183CD0665FE89D6A357B1908E083511DCE2CDF792A608044C31418C433F86719E156AF3FF98D0F54EBEB9F9FBF24588A5557D310EF9D7CF5DD8A68512D8CB15114773C69D7B40C927858AFC049F7C6A89841020E1C313C5C38B988EF505EBE6C15FC1D6CCD8B472F90ED64DA895D06AC01BB99F455A195A670D22DBD5E3F03AC84A08831E9842A566E9785A0FD4C460C5CAC154D705DCE1E7FD1C45BAEB23976AF881CF5628F3CD92AB19BAE8D45A03A859518E4A1E558FAC2B48A432E46CF274E6496B63874CA4E4571132568AA43EEC3D2A3948F40D327976A6D28CD816CFBEAF8FE126913384061D219F51179F679081503371EA0B6BD7E9524B0ECE2573304ECB4A16EB471CA0817C0C6EDE751F283ACEEC5A60C2796C6261FFC6226E4813241619F465DCE67B38E1D5A647B079503144907307C7D6EB6E6EC1936B5C94FCC08A882B4555B19B33A9BF22384DB38473A313966D157DAF8AAD41EF67D3A5FE723559096AB1768FF69773EB9D5C88D6F35F00DFA4473DF71C7E9E35393638DED05D05C105CBF37711D38E3EEE35E8CC0029B3761241FD1E56969E09E949690D4FE25735D774E777A2CA17FE058E14AE6806F611FB1E9FCD516E20499A704B67990716703A4287B50AB45D155D40EDC0AAF97F5B87551C236CEBE9CADD562B27957EAD251F79CAAC6433F228B50167FB1A753306FFF08B53A8A3CECC226857A321700EBE23AB4D6C35415CA79B682D6CFEF6B1341E7CE00CB9870F432B63A2D9A9A43C87D28A95C514582812DA37738BDA6CC76142E08F69EBAA5ACD0403100C2343E2FA088441E9A55C720BB509BC3600C27C1D39157E049650D1749751EFE55A72349E2A5B714556CE2188CE972287BE2152C7E58D3FCAD43A214A4095DE55CAE9F627D8B9018DAA01547842FA1AD14D67327CD47EB9B90CD94AFDF5244DE57E527F17894A410FB4210E06632E88A398400B0AA48CB3FEB9A90ACC668615D193D5A98158092FBB59AD2D6D4FFEE433A2A6A971A228685AE5BBAFB3AB28242C630AF4656C5071C545618A0A765FCE41B19970C2152D44C349D0CDFB29673D1A42FFEC139D1C9958B0962F7B57F80CB8FE6331553B0DF93DA9BFC722B1C001F48FF9C0FEF032610A1118AC9EBAF9202DFFEA605272A50A90768F031C72D570C0AA5B0D4FEE4AD568895274388104C0BF88D03FADC3159D6CF28AC6A7E3E5CF6FE5C6658128CBF81456DB8C29A76F9C75230F3837F1A94CB83C3AAABDF4B29C9045B45AB9552BBB6C0844BF2926267C0D74D3337249D5C9610E0F6FFD0278F12F39C48650C048D61A3FDB8E1A2E08CCCA68803A55B39BD39160B0420CBEAC7D8A55F571F490F694A7AA8B725BA84238EE1E711864AA1F74AFF252C088E36B79B09C80278DD442EAEA8C7D5833CD1BAA18BDD866689E663EADD0EAA6E0C78A3E09DFFE5F6F1F4003DE24336586B25DC5EE45D56F31D8BB2DE31B24E87172F3F1B26D400B08D50FF624E456183F269CBF06B3707260383174FDA152E4D0C528A90C54114C4F278D0FB35B74DD3ECDA14EE89D38E3227A7E18B068F134B22154348867A61719C926EA3320D1BE0B9ED78466B2DED728CA04C15AC144185FB2F5084511A38CFD765659351AC1AC3E5F327D9F3DE9B2B003758DA78DFD08FAEF3625CEDD87C8A55A3CD0257AA71B3788FD2449EFD1F48948CB304468E3CA07EA7044FA185A2B91F9761C6532B9273DB74C66B2DE95AB19E5102CB90C719EC85671E2829B182BB6D09323248D6584F0CA67D422BCDA65A0146D8DF27AB4AE651706D5FA33B5BB88ADC2A1A95105D55CCA8439A5060D110760DEE8B855D0839053BE595278EAE66542736D25C93D8544C6E55ED51AD6E7029C2E6D32CFA8844BC14972809E31754AF84BB479C504EE77CB65CEDDB6BDA613FEAA2AE6598D1F4975D0FCF9D9DC787EEB5C03F8B0BF438E83C38E2195EF1D35D40F5A14E194BC1BCC64D02CA722E7DA28334E91FB6654D708C5B07946CDF58747086EB3CA59D095EB27F1B7E6806D3A35335B2265031A1120F28EED8B4C5D9AF268502727C5D23152149C98E6970D4DCC4B9D0FECFA6A79FEF82CB233E71FC8AA999DF66EBF5A1DB2ED1583C65803FA8958F49890D13BC05C6A991F26C31766BDEF9BAC601A47C8C3C5E395FD8F47E56F04439E9BC8E9B1901A529395F2D57495D70D0712881D298A60E3E013326CD56BF9F1319EA8D6A6511EEFF373F081478A51E14F0AA4A33C6C5EA7816380C8984F7A5DA45B0C4B6B550644E65A5B2DF059ED050936FE6F073B4E8056ACCD3EB65A0B + +count = 98 +seed = 6F6E47E8336ADEE99B2C52CF2DC8D461E0A54C3DF2F08199A9F0816AF8455381054CE47A7766726D3AFC2E2F2BEAF8E8 +mlen = 3267 +msg = 00769683FE7BFD74B3ACD21AF3898B74CA73DD126C8315538937CAC4EF0AD4588765A26DCCE1C90C559CE691E7EB3E0A497D357E1AB583C761439C0A66D1164518F01B6894067925753CC2866A91552FCD0EF029C2284C620CAF364DE6C56EB41EE0E4431D9BE22B76451D132A3F9AD91A53449BE820A7ACF56F6ADBC7107C7C729EC8A64FFF6A24B4CF83FF4E945DEF336DBFEA6067FCCBD1CD6B5698ADB1AD6DF03FD0A553457B8E9FEB4A1243FEEFC2DF7F66AE3ECA5BF169F7891ADAEA8D5C59012C7AA00A5A86B0A33D0006F8AD5A01C60ABBDA6D249D3FAC7EBFB85103A3A747A45D0ADB7DEF52ED3A5F1A620EE383A9C0CCE1900E413FC74A7A97646111D54783928B15BCA783D01EFC67F49CE6F781E82D25D3F30561F507E3831CB4EA5B4A08D5489830017270B63D8298BEEBF48EB56BDA5685D5E1E06404EB9A6C3790E9B29C99168B10BADF8FDB03F3C568672773EEC96428149CA272EA5A8083F8208BDCE361E7D40BC4DA75029D4A18B0B6AD615DBF849935D4755CFFD270A52FA290811CD55BDCA38ED89F0066ADB9BA7F58366379FFE1CAF3A9127E147C3AF3DC27279391E0C09537E81E20E7B9FE4FE3DA970FE50BFC96555233CC9E61D3C356AAA8EED5A8AEA2327D7036EE03E7EE40AA35E9DA4544B121514C261EC1CB0B2D75B1D5CE129E47F89825F69BA8254163179FC1331A917AE9C5A18556A10C5F983871B1258CB6FC8AD207F97A220C5598860B6C56F1EFF09DE6000241E901A89E107FEEC15833D34D6EB12DB6B188FAA0B858A5B9E32F84F783B43B6F8A3B2E4B044CFF8902E1EB0C527BB4E29C92ACC9DC7E0D9AC6B3A021415768B21DD9695983EE89C871C0EADE0BCE4FB72E682DFB5A2BB7498BF4D2C01240F67D1B62BAA4E587069C16E3032114B14A1C4288FEBAEBB4C75C3C05924A358C4BB7DF95ECF81D67147FAE3F605EDE61B7BA164EBA1AB36ECE97DB0ECB32A673E899B24557D8987AF3ADC57A9DA609914C9B2D6D8AC58E5954E0DB5AA9E75B444700B8F704E15A6A7BBA81809FA8801C6CEB5747A44CEB8F99CFE6D8A2A03C03451E5F3D392725207F3DD28B2C00004425B7AE05FA3769183AB60857B27AB08BCC4321D293C93D1D850D4E7A81B14564D7B15AC0E3BC1BFE0561622C6AA06923EEFE163629EDE8BA1732DBFCAD52D3BAA6E11E569EA790B36A8472B2CA37BD5C0EDD37D8F164B874952D00D592FB705C6B3110A12B03829C157191D33C579593E7828CDA5C24A284BA2F5A42F0BFA601A8F6D3DB1CA6D703ECBD261629C9F96EBC0458737B9951219E5B1F86192E2A85B47D80610A0ACC8B1A70DB2916F89CDB2C7F8943471DDBABD2A3536C5DC8A73CDEDDEAAEDC86FA148D2EE479F8465558852FCBEA0DD8017F1B976281A5014319C2C3CACCBF571D9550215B24134F6DAEF32716802E7945CB3F97AFC1AB1DA17D0C41B545A750EF345A6F88AD5FF52D512AFA6558335B5EB8979D8E6DC1DA562BB997E7D152D9FA3EAA09119C3474E11218230D8A56C19AD87FDE483FBD6DDDE9ACBA813BEBC8505A323C601E5B5251650DAE9334562E3DCC38A28BD7DED6942D0CC2014235C1B66CF4A57BA3010B83CC7050309F57A27207512D195D070DB3D10FFCBACDB47E4231142BAE588F92C5B0A71ABD67CA9390C2E05FD2CF7A1FABB14C5A7AE3773C66DB1F055214479E388B5E6ABF0DF8FD1B0E4F90828ACC397643CBC274143FB4331262A20634877BE4C7489C1AE9EAF90BB2A177A6B5AC15CBDA27DA0616E5F87461554F5686A7BD6D047AD0B98C8CDEA3DB78DD2970C78FB861F2A92DDC277876791C4A30F525659557831F4377065D19ACB384CC68340152A6DE6D84CDB58F433923D1FB8CC6B10BACD95B9AB1B45563998620D192032269FA8301C09A29C4B5B20CA0A3D63A4F5984B7DB0F5B17417DC7B939B9B177BF423E2F3D57DFF296E6E4FF0FB1744B13731206EAD54EF0AA1DA09BEA8B0AC0EF71B73D009D30531DE9FDE90D86BF5F20D8E5A9E324E657A98F8C0031ADAC4385157BA4E28B48AED957A5B36C3B49057F8ECA7F56808F794014DAD170601070607010E004F42D01CC63B2A1761126BA045F1165E25FDD05901FAC6B76E777FAAAEE6F5ED94302E2DA28046B4BC60228E1B9E194F364E377F84681B3011583554B76FBF8D7456DBDEA665ADAD6AA0556C8CC714F217A518A98615C4C1CFC8ADBBD4D12C5BC23AD7A0F849E32FE2005334B55D7BCB43D1C95D4793E7C3882740CDE8DD24B367294496A3E2F3251A66CDAECE9E0A73D853F8D4E3A4637836DED68CB28BA4FCAB02D61FB5CFA581792E636217F3238D78912EA0863816FFB2F388823174B19433C2B14BAB69E12C3B791FE683744D4519455A52555AF0D7E12749F6094AFDBA00FC6A609C7578C531FC4C3C3065EBF78414F112014726EC2230F9BCD9C15E36283144CCBE0D1785B65CF49BA8FEFE92EB6907C0330BC98AC172EA9E8DD4DF8974DD6B6772BBC6CA8E8562C5EC0B6592DE7440AC915C35E0AC8087F22EBA110CA3037B469B1D5BC92636D81881E38D8BBED01A29B3EBCF0C19EB95BF999EB848022592AEAAB649CE19824ED9D3A32D75FBA556EE07606A306D1FCEC2E24B38274C361B7BC96CE37B7F4FE434EBA17AC2A097051A92E4EC32E4C678F7762E8B96EBFD2600C0F224B04B2CD7E9F4AD327D53603828015E9CF45969800F02FA5E0BA26B8C844BA1FDFFDE44303AD0389C1B31D582877CA6BFAD4973BA35FBB90ECDD95F430078BC39AA89434130A5FB8321E51F9624090D0277A9F112EE8FF65D3DBA999C7C08727D0F08DCF00CE22F62C955D6A822F247C8065AB94AC442E1CB5F31254816794CC2556891A523B8AEF09D3B9E07AA8B67B3B87567ADEBDBDFB93BA9A082F72052572C97E73AF16CFC42D2A51A3683F84748A338AAB56264753BA4083D356A27C71F47221ED8340C50AFD46CD207C4F9634AB5A44888A4234770C46232C35EFF83FA950B0A6879137DCE209D5A1F26809B411F046F51FF084F15BFE03292EE845D3044235ADBC299925235462E67F803DAA1426F0E116B93F4532DD2784F7F87AE360281CE21F70D230C242E1A98DE8FE1D6147AD71EDEC89E24A5980C45FD91E23516758AF71DF8E0DD96929D4DA61A3BAEABB96C9378986DEB4C9101175E3AF1E102B52A8DA27D916EE4A28263CA485CFE87EE5436249C1A2F933669F6E3274E9BD93092F4A798AE85D6592EBB54DC65C28BA08582E275972B0A12C22A7792CCFD4A398E504C6FB2CF5EF1F9C268540B4FD7D07D59C49A559D86A56A009C4C18A3FCECA109FC7A45C6E842ABC22053E84878C4805D96AC96BA00FA40FC3B50407141105845055447CA94BD27F234183C2B8BF37F5CD249ED0705AFAEAE59C8BE8F6B38069D67FB23F74284E8185C176B58B482900A3E09774383C7ECACF4FE5E580DF99DB102AD4018DB73C73A635D3FCDC833B000C948D846AACC92ED54FFB3ACAE1BFE205D6B2312658F15DECFA085D13BC3757C754C5704D8089563E0CCF52B04A49DF293CAFBBC2FED5D9551B5A3897EC7BEAA56A4034BEDCEB4840A9BDFBB8BF47D66DD3A4E3EB1666372C6B2C39A48D52761BD36403CB130A087685E2EABB8711C11005EA09F90AC49665415C56CAB6FD2719C45B6800DF914F8FF327EED29D9B9A5BBD6B80B8BB31AD1522803B2C8D89166D5C6B2ED47BC5BBBC4ABE6709D46B856AB81DDF15F098A9AB76A8257E7E5C2E7DAE53FBD691736F0D6BAFE0BB939172614E99C7D7E37754AF6C3C637D076A43DBD70E5EAE910C8170CECFF1621E382D2977635B67F4FAC555419F8A0BB76CCAEAEF4C7385D293C9595AE10E5201C4A31B4C3ECB9F3B304EFB1886F9C58A4EF04E73341B95D9BDB85D706B2A8D3FDD153743A8BB7B3289D0FE79F6A3B9E0FE160DD6700FD64FC87D9AC96858A6D395FEF6F3D2193EBAE7C3A92E18746A7F12B244FBC5B1DF0086CC7045036519D9D7BF8E92B850EA0D3D1E775DEA362362462DEA2D3501D39203E2879070D1F7AC92FA1576F6D12886D5B979E3C788C09A769EF4EE45E14CD8E7553EBEEFCD31FF3D43D4988DB08F6630BA8AE8C7250AC42A3D78EDB967D59310A4A224567D8797C42370CBD2302A3F49ABEAF85FAD9455F98B61EF2B5E34A5C552583872145E191BBFFCAA526F5E38E497A1A1E1220A0F283A935ECD366A9069D5A2A80BABA3A22FA85A2557DB72D7E29EB4E33E8ED8BB4EC2EC7C2E9CEDEF46EA955834ACF8C9AB23B78052446FD73C9D61683D7FA0088DB97D07CC350AF0B6B2AD7E66A493AF814C11F8C0F2FDF0DF40AAFD0D218C00319C367E98D7F10C74EA06D31276F3F216E1CB2F12033915008CC83B00AC60FC9C2FB7F97D6E8CD79650D0F9D82BFD9CAFEF668021D3D165F3FE84221998BC8C29AEA0B5B7E0F1F25A0D7447E806CC3FC39E6038BE3DF9AC01F46222D3A609F8A026744AB4F58A734E3782BEC301EA91F2D8E2242D04A11E82474002143223F29656B1A7675AA5AD181004C4F1381DF6A0F95A0186E82C04B4DE881209E9CCCA3EE5B1DEF0B02353738D92A07314403A1A2721C256121FBA8B8CE9B460 +pk = 80B0DC9151DCC6100784C6A67BA5F6D96FF2BD9D74AD42AE6E2A5A9C2552752548EE414102075D8682CF3F4135ABFADF3BCB903F63CF3EDA35F65A5EC95D7C0047CC38045B2BFB17F32B075716E578891557C6306F4CC34F2D1BDDCE660F445A47E6ED5160BD85A6C6B34DC783FB9F4D3DF5277C9BC4CC7ED4F59BD6404B7D0011 +sk = 80B0DC9151DCC6100784C6A67BA5F6D96FF2BD9D74AD42AE6E2A5A9C2552752548EE414102075D8682CF3F4135ABFADF3BCB903F63CF3EDA35F65A5EC95D7C0047CC38045B2BFB17F32B075716E578891557C6306F4CC34F2D1BDDCE660F445A47E6ED5160BD85A6C6B34DC783FB9F4D3DF5277C9BC4CC7ED4F59BD6404B7D00115160210CAC4BE8B9E766A3E57490D51037FE9790715E617BC0896E002C6AE29E6001000000000000000000000000000000000000000000000000000000000000AE150518ED40A5A2BA70F274A0E61234153D4C370F094C6DC846582974590A1BC4FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDC3458AB9A74F86458E5045EBF5356403A585160FEB8DF9AF05F5D950166135D3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024328D9D48861045E69E278DCF9768C8E37484EA31EF0BCC1B0E3AE8FAF34560ABC6CDCA392969CB3E0EE61C3ACAB6DD1A1F50360DC921AAB4DB8C028A3403FF5A594FD68FB119A1EA8FE44384CEFF72DCDC51F77DB98D255296F4CE4EBCC1BB97B647BE0585CB50A4CE609FA00C95F21A90921E0B365A05B7851672BB01EFE2B8B332F90A7990278DD8B32F21CE49C2C927EBF6763B5A309F48B33E27D64994A681341178CCDA2CA7C732F00C3D56EDDCDC08A019016071F3D004E70CDE3FC90E8E14CAA0AA2CE2994933BADD4BF6DCC965043E171A49CA2ED4E1A7CCD5AD4C6F39C8C6E3457DF1355886B741378DCE36B0804FBAB2638F36E43309 +smlen = 3559 +sm = 965A7065AF6DFCCC603866579CE7B79C15B97F81A37D57D8C196DAE17DAA6D132B614EF12C741BA34250F3E9D199ED92B7344DB19150EA7FF2027D137ECA7501A6CF491B3E6D8161DFBB472CBFA5F99E81BA0023D16C6A53D54496E3571CFA17208AC1EC89550F353D99A3481950AC6DBBA7AFB81C5CDA1C4C5E76B58C393701000007718F74225CC164DF5B1641D471902891DAA472F578B7E2A421D4686C5ADF41FAB7FDA3A5B7CE02AE413D8C71A21DB90F115C14B5A59B2C163FB84A45B6C02A0CB895498302B4734F148EBE0265AB0291570B1A519C0242BC901E421790561FE5C809BED987F28BE61216C88775F1FC0C2639162BDCBF718243CF2BC60A9F101071FEDADC727DA69426382DC4AFBE2099CA8A95C4036999CB20C310D2E84700080200769683FE7BFD74B3ACD21AF3898B74CA73DD126C8315538937CAC4EF0AD4588765A26DCCE1C90C559CE691E7EB3E0A497D357E1AB583C761439C0A66D1164518F01B6894067925753CC2866A91552FCD0EF029C2284C620CAF364DE6C56EB41EE0E4431D9BE22B76451D132A3F9AD91A53449BE820A7ACF56F6ADBC7107C7C729EC8A64FFF6A24B4CF83FF4E945DEF336DBFEA6067FCCBD1CD6B5698ADB1AD6DF03FD0A553457B8E9FEB4A1243FEEFC2DF7F66AE3ECA5BF169F7891ADAEA8D5C59012C7AA00A5A86B0A33D0006F8AD5A01C60ABBDA6D249D3FAC7EBFB85103A3A747A45D0ADB7DEF52ED3A5F1A620EE383A9C0CCE1900E413FC74A7A97646111D54783928B15BCA783D01EFC67F49CE6F781E82D25D3F30561F507E3831CB4EA5B4A08D5489830017270B63D8298BEEBF48EB56BDA5685D5E1E06404EB9A6C3790E9B29C99168B10BADF8FDB03F3C568672773EEC96428149CA272EA5A8083F8208BDCE361E7D40BC4DA75029D4A18B0B6AD615DBF849935D4755CFFD270A52FA290811CD55BDCA38ED89F0066ADB9BA7F58366379FFE1CAF3A9127E147C3AF3DC27279391E0C09537E81E20E7B9FE4FE3DA970FE50BFC96555233CC9E61D3C356AAA8EED5A8AEA2327D7036EE03E7EE40AA35E9DA4544B121514C261EC1CB0B2D75B1D5CE129E47F89825F69BA8254163179FC1331A917AE9C5A18556A10C5F983871B1258CB6FC8AD207F97A220C5598860B6C56F1EFF09DE6000241E901A89E107FEEC15833D34D6EB12DB6B188FAA0B858A5B9E32F84F783B43B6F8A3B2E4B044CFF8902E1EB0C527BB4E29C92ACC9DC7E0D9AC6B3A021415768B21DD9695983EE89C871C0EADE0BCE4FB72E682DFB5A2BB7498BF4D2C01240F67D1B62BAA4E587069C16E3032114B14A1C4288FEBAEBB4C75C3C05924A358C4BB7DF95ECF81D67147FAE3F605EDE61B7BA164EBA1AB36ECE97DB0ECB32A673E899B24557D8987AF3ADC57A9DA609914C9B2D6D8AC58E5954E0DB5AA9E75B444700B8F704E15A6A7BBA81809FA8801C6CEB5747A44CEB8F99CFE6D8A2A03C03451E5F3D392725207F3DD28B2C00004425B7AE05FA3769183AB60857B27AB08BCC4321D293C93D1D850D4E7A81B14564D7B15AC0E3BC1BFE0561622C6AA06923EEFE163629EDE8BA1732DBFCAD52D3BAA6E11E569EA790B36A8472B2CA37BD5C0EDD37D8F164B874952D00D592FB705C6B3110A12B03829C157191D33C579593E7828CDA5C24A284BA2F5A42F0BFA601A8F6D3DB1CA6D703ECBD261629C9F96EBC0458737B9951219E5B1F86192E2A85B47D80610A0ACC8B1A70DB2916F89CDB2C7F8943471DDBABD2A3536C5DC8A73CDEDDEAAEDC86FA148D2EE479F8465558852FCBEA0DD8017F1B976281A5014319C2C3CACCBF571D9550215B24134F6DAEF32716802E7945CB3F97AFC1AB1DA17D0C41B545A750EF345A6F88AD5FF52D512AFA6558335B5EB8979D8E6DC1DA562BB997E7D152D9FA3EAA09119C3474E11218230D8A56C19AD87FDE483FBD6DDDE9ACBA813BEBC8505A323C601E5B5251650DAE9334562E3DCC38A28BD7DED6942D0CC2014235C1B66CF4A57BA3010B83CC7050309F57A27207512D195D070DB3D10FFCBACDB47E4231142BAE588F92C5B0A71ABD67CA9390C2E05FD2CF7A1FABB14C5A7AE3773C66DB1F055214479E388B5E6ABF0DF8FD1B0E4F90828ACC397643CBC274143FB4331262A20634877BE4C7489C1AE9EAF90BB2A177A6B5AC15CBDA27DA0616E5F87461554F5686A7BD6D047AD0B98C8CDEA3DB78DD2970C78FB861F2A92DDC277876791C4A30F525659557831F4377065D19ACB384CC68340152A6DE6D84CDB58F433923D1FB8CC6B10BACD95B9AB1B45563998620D192032269FA8301C09A29C4B5B20CA0A3D63A4F5984B7DB0F5B17417DC7B939B9B177BF423E2F3D57DFF296E6E4FF0FB1744B13731206EAD54EF0AA1DA09BEA8B0AC0EF71B73D009D30531DE9FDE90D86BF5F20D8E5A9E324E657A98F8C0031ADAC4385157BA4E28B48AED957A5B36C3B49057F8ECA7F56808F794014DAD170601070607010E004F42D01CC63B2A1761126BA045F1165E25FDD05901FAC6B76E777FAAAEE6F5ED94302E2DA28046B4BC60228E1B9E194F364E377F84681B3011583554B76FBF8D7456DBDEA665ADAD6AA0556C8CC714F217A518A98615C4C1CFC8ADBBD4D12C5BC23AD7A0F849E32FE2005334B55D7BCB43D1C95D4793E7C3882740CDE8DD24B367294496A3E2F3251A66CDAECE9E0A73D853F8D4E3A4637836DED68CB28BA4FCAB02D61FB5CFA581792E636217F3238D78912EA0863816FFB2F388823174B19433C2B14BAB69E12C3B791FE683744D4519455A52555AF0D7E12749F6094AFDBA00FC6A609C7578C531FC4C3C3065EBF78414F112014726EC2230F9BCD9C15E36283144CCBE0D1785B65CF49BA8FEFE92EB6907C0330BC98AC172EA9E8DD4DF8974DD6B6772BBC6CA8E8562C5EC0B6592DE7440AC915C35E0AC8087F22EBA110CA3037B469B1D5BC92636D81881E38D8BBED01A29B3EBCF0C19EB95BF999EB848022592AEAAB649CE19824ED9D3A32D75FBA556EE07606A306D1FCEC2E24B38274C361B7BC96CE37B7F4FE434EBA17AC2A097051A92E4EC32E4C678F7762E8B96EBFD2600C0F224B04B2CD7E9F4AD327D53603828015E9CF45969800F02FA5E0BA26B8C844BA1FDFFDE44303AD0389C1B31D582877CA6BFAD4973BA35FBB90ECDD95F430078BC39AA89434130A5FB8321E51F9624090D0277A9F112EE8FF65D3DBA999C7C08727D0F08DCF00CE22F62C955D6A822F247C8065AB94AC442E1CB5F31254816794CC2556891A523B8AEF09D3B9E07AA8B67B3B87567ADEBDBDFB93BA9A082F72052572C97E73AF16CFC42D2A51A3683F84748A338AAB56264753BA4083D356A27C71F47221ED8340C50AFD46CD207C4F9634AB5A44888A4234770C46232C35EFF83FA950B0A6879137DCE209D5A1F26809B411F046F51FF084F15BFE03292EE845D3044235ADBC299925235462E67F803DAA1426F0E116B93F4532DD2784F7F87AE360281CE21F70D230C242E1A98DE8FE1D6147AD71EDEC89E24A5980C45FD91E23516758AF71DF8E0DD96929D4DA61A3BAEABB96C9378986DEB4C9101175E3AF1E102B52A8DA27D916EE4A28263CA485CFE87EE5436249C1A2F933669F6E3274E9BD93092F4A798AE85D6592EBB54DC65C28BA08582E275972B0A12C22A7792CCFD4A398E504C6FB2CF5EF1F9C268540B4FD7D07D59C49A559D86A56A009C4C18A3FCECA109FC7A45C6E842ABC22053E84878C4805D96AC96BA00FA40FC3B50407141105845055447CA94BD27F234183C2B8BF37F5CD249ED0705AFAEAE59C8BE8F6B38069D67FB23F74284E8185C176B58B482900A3E09774383C7ECACF4FE5E580DF99DB102AD4018DB73C73A635D3FCDC833B000C948D846AACC92ED54FFB3ACAE1BFE205D6B2312658F15DECFA085D13BC3757C754C5704D8089563E0CCF52B04A49DF293CAFBBC2FED5D9551B5A3897EC7BEAA56A4034BEDCEB4840A9BDFBB8BF47D66DD3A4E3EB1666372C6B2C39A48D52761BD36403CB130A087685E2EABB8711C11005EA09F90AC49665415C56CAB6FD2719C45B6800DF914F8FF327EED29D9B9A5BBD6B80B8BB31AD1522803B2C8D89166D5C6B2ED47BC5BBBC4ABE6709D46B856AB81DDF15F098A9AB76A8257E7E5C2E7DAE53FBD691736F0D6BAFE0BB939172614E99C7D7E37754AF6C3C637D076A43DBD70E5EAE910C8170CECFF1621E382D2977635B67F4FAC555419F8A0BB76CCAEAEF4C7385D293C9595AE10E5201C4A31B4C3ECB9F3B304EFB1886F9C58A4EF04E73341B95D9BDB85D706B2A8D3FDD153743A8BB7B3289D0FE79F6A3B9E0FE160DD6700FD64FC87D9AC96858A6D395FEF6F3D2193EBAE7C3A92E18746A7F12B244FBC5B1DF0086CC7045036519D9D7BF8E92B850EA0D3D1E775DEA362362462DEA2D3501D39203E2879070D1F7AC92FA1576F6D12886D5B979E3C788C09A769EF4EE45E14CD8E7553EBEEFCD31FF3D43D4988DB08F6630BA8AE8C7250AC42A3D78EDB967D59310A4A224567D8797C42370CBD2302A3F49ABEAF85FAD9455F98B61EF2B5E34A5C552583872145E191BBFFCAA526F5E38E497A1A1E1220A0F283A935ECD366A9069D5A2A80BABA3A22FA85A2557DB72D7E29EB4E33E8ED8BB4EC2EC7C2E9CEDEF46EA955834ACF8C9AB23B78052446FD73C9D61683D7FA0088DB97D07CC350AF0B6B2AD7E66A493AF814C11F8C0F2FDF0DF40AAFD0D218C00319C367E98D7F10C74EA06D31276F3F216E1CB2F12033915008CC83B00AC60FC9C2FB7F97D6E8CD79650D0F9D82BFD9CAFEF668021D3D165F3FE84221998BC8C29AEA0B5B7E0F1F25A0D7447E806CC3FC39E6038BE3DF9AC01F46222D3A609F8A026744AB4F58A734E3782BEC301EA91F2D8E2242D04A11E82474002143223F29656B1A7675AA5AD181004C4F1381DF6A0F95A0186E82C04B4DE881209E9CCCA3EE5B1DEF0B02353738D92A07314403A1A2721C256121FBA8B8CE9B460 + +count = 99 +seed = CB2E6226615393FC3BD4AB3A412AAA030AAD40E8648EE6B56D2C1591D8B97915D88F2D22F7221377B4B04CF2AE9ECC4E +mlen = 3300 +msg = D21A6BB3A2356805E678673C45FB055FC5266E3F692AF9935AEA307F14A5C41B979966A5DFE42EBFED1487E4822B74AB5AF28995E085EC8007ECA4977C63EE5299FEC63DCCBC42EEACAB488E574249E9D856146750AD97C8A443485EC1C5820BEB0964640010F6407140791E74684DBB91052E2D8BEF7BDCD78B2EC03C97A53295D683BDBE32A70DC19A2F75B8613AEA9616AE0E280179492820F73FB7FA4121E673FB5C328F41B67FF8FFA7AEE6564ADABA046D6E1D6AA13FB24965390F829246DFA8763851405075F76CF94C66FFC3308214DF0960C649AAEDC22926CE9357D3875F8B71D68D75999AA3663C30A9EDF07228BF7DFF49EC1E6C7A33D2053597003B82392E826EBD701B4C981AAAC9951C79E08F592C2C0637C8E5A7F9DCDA599E859C317D4888B4098992E0E2D979E41C703686D577E5BA6001EC4F587140711293D664963632F87EA0461E0E0C5E9D8D292FB409F9F9AB172EE17FC8AFABAD06E42B437CE22924EB5DBD3A80A06962F3B37946259F9C75A233CB2B4ABDC5CD1B648FAEB1BE8630DB40D151B8FBA693DF2C5BDCAA14DC4783F450B6BC407515CEEBC5C9A47BD1A141384F0B596CAB1135C075651CBA989C190F3171DC1D72330EDAA01656813C4B7811715060B023FC426745C301B2A91E0D08ED3BDED438C4CE6799C35F3981C882A0BDE4A2FEEB1A52CAFA47B0C48558FC43F98FE08F03A71128362BB6FB9DA6A22249F4D4352AE7D3DAE85DE497E2411EADCFE5BF1A3C075C45811E0097ECEA255FE15BD8321FE8B546A8CACFB899EECF5419DB363C7567C2FE7360B36DE14674F500A31D3EEC71451A7C0D5576A8939C0F6D4D9F2F03F3C516CE25CE73ABB35C73AA94F6AEFAE6AD87052D6B195FA43586817F5BB974AAE7F1B8608922411AA5B0D7D574016CBD3DED13395623470A108FA0E1D3F9FAA7E1E5031843F2A23DBCE8B196315290DEA5795E4115D53DC570A444064CFA3C9457DBF3EE323B1966ECD2270C32910F8F430522471258A1F1955A6E1DD8C84ED9A566499BF85628615351ABE84B401421DA2CFAF575E2644C9304C075ECFC374066CEC713FA4C0D89043689FBC59FF54B8F97EE0A3B0989BC5E4EF83CC9833E75BC8B67BB5EE3C06EA156611CDA95A6702416807530EA206ED89835D20805EA988B1958569CDF7F809996214DADAB4E20BD44917E3410EC6BEAC98FEA07F764E85B66AED5E17CF675D2ED8E63DB728FE75158CB31779E31379648B43D68CCFF3780854CF03535C57122019456E73CF06769BF1FBF558542241CE665BD10F921828553585E0CF664CDC6160F9C47FA5330591B74194F4716056CA83993EFEC4A52DB9A1FBD3B2F504AC19667325167407375B6D7DE739F07947B511C8D475744E5C29D6E286A37F1FF8317BD0178F0E306A38FA6E75F4A80427FEB2C91235D3E7F20D8101CFC03BB73F44EF59AF3526E9AFC580027A1DADE37654238B8EC7AF0105248FE30784A88B72E11FC1BD807E47A349BD29075BEFBB29730EF8E85E3ABD5105559BACEE74AA27D90D360A8D629DBEC95EB34C7F7CA20096FF7B521E40D3944A975436896F372EEAB6B8615EB91697965BBF955779DD3047F7E3BF029E3509A5780247445D6223D085AFB4291D976EFADC41E42DC2C0728D18F6155654A332FEC72EB6AEF8B92C1D177E3DC28C31971BCAFF76DDEBFD9588BC244B116D409E58DC5ADA1648663D603C47FAEB814AAA7EB9B6264356F926C18B9357BF426B89DDC8EB9177ECEB5C6CDC64DD8FEB7B326BC1BA89BD9035235DA0E644EF959C58DD97B88D5C749B36931AC2694C67151DB0894652E99254222D37CEFE9E27B3DD663A152DBE29A3639AFE42F4578937076180563AAD6AD739255EA012A17D2A56627D84C44FBAB261D392A966CFE19278799CF1634D42384323C496190D4B9FB662694E3887EA66AB9E8B195488C8DCA47C8BC0424247759137CFBF86DEDC3641904CB6FACBB30A9FA84ACF69A67B4AFDF4C2AA420FC0D90CEFA0DFBBCD3072D9F772FD6058E2BF0E251BE93B00DC43765B53DB51B22F12D3ED0CC5655E4AEBD9D923F99A43E4461DCF5992030E66A1CDC3A65558D9BB3A39788D92328387D144850DD3706FD7A079E3D2398F542F91A8AAABF0C5068DBAF1FCC5160398ABECF74884BEB04F3A3EA38BBB80D798F5981B3F2DB6C7B33F867B7DC06A4417E30F94CDB4F523AEEA0BE12BD75AAED57520DB0D4B4F013BE3A1DC7AE5C58FD1DE9637F7D82F697B7E92DA427A78FEEC6A5C0255EB57A43DEA6CEBC8805BC04E04FE789E222B1E2642D26EDC14FB36ECC6092B3060E45EED6C5B35DE8741F72933930ECBD7338CF39474122357365700CB50C5EB176FB92814FA7F4032570CCEE6B859236AD5DA5F1730129EDC7BE218BA9874620F6F0EBC45E0BD622F8FD1AE6974994AF95C6519EC1C46650C073D194FA6EBC62F405F63A3416782A47872C7D77D648D0A1C802FFDFDE5FDC112C94CFC68F401889EFC522FE488FDB5384C0D93147AB6587659D936F98ECFBCDCFBF8B352D605F18C855E2559743ED97991C5D50DF44A7B929303835654A3955ABC5BEE6327400A7CCCE460B318D8B5ECE5B12F606ADB3D7B5ED59563B8E675E78029AABC234442C2463256FE02B04F556DA35C4615D14A9F4EFF17DB0DB81DE4BDD894F6628A120BE2D4CF3E1F46D53817899657035A76137E23C0B0E8DDD29465D7F15628FD435E6CAACA4194FDBF85FDCC31D5DAFCB52568B7C0CFBE713BC85FA424BA3ABE149E4035FC86807A8B876D2163B447CAD5EC0E6EF38A1D591AFB46267F9DBF142CAB1CAC1F73BEBA212992FC6D4647EC17848D1ADBB1901277A5078DD72D9C9184E893C0806E9B4AFF0A824670D438620F2A7E8D2965B619D291E5824C014FC888A36FBBE17356431F0039038F9B497902AED969F9C488390B7087763638E976801127BAF1F53803C4DC9649F0EE85D67B239E2BDAFB2BD75F1D1DA22A56FB3AF10A9DDE7AD306C4AF8681029316C0E1949228E6BF5ADF942F1C0EF92B2BCBC0C70D49E5808851444240A78B14D21B54F66271482F49B85F5180B268050327368496CFA8B54ECB97EE6D28EB74A3742F68583DA046809002C22F7B31FBC0566969F9A15CDCA892C4BEB101A2AC3526C76E9D30982C9B4893450FDEC4001D2431828D24D8B1A67DF80E2E10ED2EA8D723227055C48006665F7DA8E032EFDC70BC7EEB2B369B551FAC542AD6DF1A23107E2B3C0E3CCACC25F26404C085CBF56E52D35D7948DB9FDA6DFC24709994719D8CED41A2CC9B3C4B2BEF0967CB71861CF0E6AEA9BEC9395726AA0E2F1A7247ED0F6038E3DF4BF566786073590DCF97F8F0A99658D8F630A2D130C46CF4D26C669360D0F70B75F904C9F923AB285D5DB129F6C25AD21F9E26AC844D07A8EED86C4E224EBFC5B3F720D6F94B0A01B1433C46B40CF84E80F7A6AFA7BB8F9ACF818AD3CAB2DDD6904C067BEA4F1FE79B83CB0AA8FC75B6B096BAD6FE94ABFD48F8EFC0F2B9A02EBDA8FDBDBE1C77F1854EDBA18AAE7F31CED9CD34C1B355108DF18A8953932F7554AF05B203A96A9BB93E0EFF51D7F93B56E351562CF85A2D35EAE2C2427B89A8662A1C723D4F14E6EAFDBD636C2BB7ADE29C1A6BC8A463734C808BEC68B1E9A31AF6E29B412F1CB8C90A9911AC5C3EA71E46113D2D7B1AE2D8802B06A770FD0E9E4652895E42181AD09BB541E9493F258711BB7BEDD3E7CA8B8CE875669CF80A6880ECA3F13800DE7011EA67F443E505C4FB455608AE586F922B3C83FD33B306BDEDB86223C33E3AA65EDC93CBCF3A03ADAF9F328997951D59A9200C0BA2618E3596AF176B43122CEDC52B1E006EA6D12DC236A6FCD7CC46825F2EF7ED71683A731D746FFF2FE54E0B392A8CBFA38873196BB2B835DCA7CB7C3ED9A004C7A329B9734A111744BDACDB669E69E9DF1E52F07C513E3752A0CCD81D7DDC4A64868B7BB2BBBD2095373480522BE10615248A179DCB61DAC90F7FA5FA9B84F190A9C62B5FF9CD473A940F03E7107157D7EB60AF1E3E384FFE8A67DCB2389B3B0FAB7C789CF100CA95CD6A85442CB9A2C243FB9D454B20BAE5762D72B8FE79B4DF81163D61DE4578CF976992D8B9989FC68089F811F53DB1E1092B60220552876B818BEA981571898CD6AB7B5F13C46B0A076526E3241D65014F855EFD7BDE08AD91F259DCB64E94EC3DAD97811EB024EE1D341521DC92AE5E93C73422088976F2D27D64E1D193B955E6736AD2BCCF3C1A53D590576434ACBC0B687F27F255FEF354E68ACA47160EFA7126F908E08E4548C11546D9C412D685FA84D2EB4DCB2BDFC48E2FA8023548198EBB072A48044F4391143E3BEF4FF9066A4B0D03ADC826819D67588BA84F99DA27424103652ACC039DDD3B567851CD78E4117A8B93AFE01FC8EEBDAA1ACB8BA9D095789E76B9D5AB9EE177A15D666EF171FE1D4BDCCFE2E58CE669B561F63028C6CE26DB5C8182FE048680B175C7AB407215FF3A7801C950D509867AB1B0BEF89B3E38A387915225EDE76F91AAD15A85D8C46EFD588BB3BAACBC52C036211512473420F3F061F5F53E9353DE0780425745A76439B3811511C86CA503251F24113384E1A24A9367536E796CE08B896F572489A2339E82A856C +pk = 1740ED04F1FFEBA0C76FF93F193B4CEC5A6E320E14A741A8C3A53D6783984E1AAB37F3DEA54ABB7F2872CF7B5BB53B1C92171CBB6DF13831620D7798A7C94E00A38C466A38584F474830DB11C0E6397C5878A232ECBF4E969C0309B03027AD9A74D8C70A15639DF50BFDF0A7A95C409D5E9F6B5B5B7B7B9B5276D97EA795180102 +sk = 1740ED04F1FFEBA0C76FF93F193B4CEC5A6E320E14A741A8C3A53D6783984E1AAB37F3DEA54ABB7F2872CF7B5BB53B1C92171CBB6DF13831620D7798A7C94E00A38C466A38584F474830DB11C0E6397C5878A232ECBF4E969C0309B03027AD9A74D8C70A15639DF50BFDF0A7A95C409D5E9F6B5B5B7B7B9B5276D97EA795180102D523CCCB5C5ACECB3F4B741D2F7FB2379E024A682E1A08268FFCCA2920FD7B93430000000000000000000000000000000000000000000000000000000000000046D65DB2CD6D6D2F27A050ECD6DB7BD647B5CA50FD9A3445EE10B2A1AF4EA9A8F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1B80F113DC97D57F3BA72D02C034BDCCA563F96C1C8F933ADBE370E2AF9CC92CCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022DB311DB284B8E8C9CE5CAFD84A7375A6CBF122034115FE4CBAD2BF22AAC010BEF1811C21764CA0C8AF031805BFA3A7A3DB4F8BB322CFA5BA712A45CCA9057B1FB8C586701F281E1016A91200F0EE60BAD04E080DA7187720199334EDBFA1A80750BD9A37EA762A2B7BB2E08CD482DA3B786C5C298230458A2AF5E5490F878B2A0CA4DD8B0E1B5D7EB3465DE1D3E531B678CC9399B30B8CE8BABCBF8F2A0DB6599B8BE5537CEF2B7FC8D6C24EFCBBE15137B1E00733624A9780719A0888DD3D1AFB9C0B02661E608111D5F6D1DF8C75F5D711985FECCC1E43729F92A15A197A4D4C70D6C15AD880CC6874FA5E263E47ADE6FBDEF671F3F6A8ABCA04 +smlen = 3592 +sm = FE19C1B5CC41F9F0BB396534001C2E254BFB5C7EBC336AF736BC9AAA640D3B60A77FC92C3D532509F6D993D0501C98F6EDD3B8206F6ED3889F69066F8B0E04000CE57B6110DF235284419EC77E98925273FE1ACCFAE63FC1A3479382BF7CC97CE7363E1942B06BC0F4C6A5B4DA015472C9EEF37CA9BDA12AC3B0BA3BB6106A010200DBF13106F1C5F82595BEF2C1AB27CDF25E435022E814B806E51026835AAAA4158F3884A4D12E127954109261DF940171AF5CD0741D069A2E8A283CED3E63C21E2EF1D31FF6BFAE29F9472DA2008776E9F6C6BB9079F29418CF65E278ABF0520F8122AF4D721739A0860DA3DB8F7815657F9A5029411B1DFA0B9651B8AF0DCC11D9AA0C1F05D2C4DE07106DC9394B355BA947FFE5B6CA14410638DC95AEC671001104D21A6BB3A2356805E678673C45FB055FC5266E3F692AF9935AEA307F14A5C41B979966A5DFE42EBFED1487E4822B74AB5AF28995E085EC8007ECA4977C63EE5299FEC63DCCBC42EEACAB488E574249E9D856146750AD97C8A443485EC1C5820BEB0964640010F6407140791E74684DBB91052E2D8BEF7BDCD78B2EC03C97A53295D683BDBE32A70DC19A2F75B8613AEA9616AE0E280179492820F73FB7FA4121E673FB5C328F41B67FF8FFA7AEE6564ADABA046D6E1D6AA13FB24965390F829246DFA8763851405075F76CF94C66FFC3308214DF0960C649AAEDC22926CE9357D3875F8B71D68D75999AA3663C30A9EDF07228BF7DFF49EC1E6C7A33D2053597003B82392E826EBD701B4C981AAAC9951C79E08F592C2C0637C8E5A7F9DCDA599E859C317D4888B4098992E0E2D979E41C703686D577E5BA6001EC4F587140711293D664963632F87EA0461E0E0C5E9D8D292FB409F9F9AB172EE17FC8AFABAD06E42B437CE22924EB5DBD3A80A06962F3B37946259F9C75A233CB2B4ABDC5CD1B648FAEB1BE8630DB40D151B8FBA693DF2C5BDCAA14DC4783F450B6BC407515CEEBC5C9A47BD1A141384F0B596CAB1135C075651CBA989C190F3171DC1D72330EDAA01656813C4B7811715060B023FC426745C301B2A91E0D08ED3BDED438C4CE6799C35F3981C882A0BDE4A2FEEB1A52CAFA47B0C48558FC43F98FE08F03A71128362BB6FB9DA6A22249F4D4352AE7D3DAE85DE497E2411EADCFE5BF1A3C075C45811E0097ECEA255FE15BD8321FE8B546A8CACFB899EECF5419DB363C7567C2FE7360B36DE14674F500A31D3EEC71451A7C0D5576A8939C0F6D4D9F2F03F3C516CE25CE73ABB35C73AA94F6AEFAE6AD87052D6B195FA43586817F5BB974AAE7F1B8608922411AA5B0D7D574016CBD3DED13395623470A108FA0E1D3F9FAA7E1E5031843F2A23DBCE8B196315290DEA5795E4115D53DC570A444064CFA3C9457DBF3EE323B1966ECD2270C32910F8F430522471258A1F1955A6E1DD8C84ED9A566499BF85628615351ABE84B401421DA2CFAF575E2644C9304C075ECFC374066CEC713FA4C0D89043689FBC59FF54B8F97EE0A3B0989BC5E4EF83CC9833E75BC8B67BB5EE3C06EA156611CDA95A6702416807530EA206ED89835D20805EA988B1958569CDF7F809996214DADAB4E20BD44917E3410EC6BEAC98FEA07F764E85B66AED5E17CF675D2ED8E63DB728FE75158CB31779E31379648B43D68CCFF3780854CF03535C57122019456E73CF06769BF1FBF558542241CE665BD10F921828553585E0CF664CDC6160F9C47FA5330591B74194F4716056CA83993EFEC4A52DB9A1FBD3B2F504AC19667325167407375B6D7DE739F07947B511C8D475744E5C29D6E286A37F1FF8317BD0178F0E306A38FA6E75F4A80427FEB2C91235D3E7F20D8101CFC03BB73F44EF59AF3526E9AFC580027A1DADE37654238B8EC7AF0105248FE30784A88B72E11FC1BD807E47A349BD29075BEFBB29730EF8E85E3ABD5105559BACEE74AA27D90D360A8D629DBEC95EB34C7F7CA20096FF7B521E40D3944A975436896F372EEAB6B8615EB91697965BBF955779DD3047F7E3BF029E3509A5780247445D6223D085AFB4291D976EFADC41E42DC2C0728D18F6155654A332FEC72EB6AEF8B92C1D177E3DC28C31971BCAFF76DDEBFD9588BC244B116D409E58DC5ADA1648663D603C47FAEB814AAA7EB9B6264356F926C18B9357BF426B89DDC8EB9177ECEB5C6CDC64DD8FEB7B326BC1BA89BD9035235DA0E644EF959C58DD97B88D5C749B36931AC2694C67151DB0894652E99254222D37CEFE9E27B3DD663A152DBE29A3639AFE42F4578937076180563AAD6AD739255EA012A17D2A56627D84C44FBAB261D392A966CFE19278799CF1634D42384323C496190D4B9FB662694E3887EA66AB9E8B195488C8DCA47C8BC0424247759137CFBF86DEDC3641904CB6FACBB30A9FA84ACF69A67B4AFDF4C2AA420FC0D90CEFA0DFBBCD3072D9F772FD6058E2BF0E251BE93B00DC43765B53DB51B22F12D3ED0CC5655E4AEBD9D923F99A43E4461DCF5992030E66A1CDC3A65558D9BB3A39788D92328387D144850DD3706FD7A079E3D2398F542F91A8AAABF0C5068DBAF1FCC5160398ABECF74884BEB04F3A3EA38BBB80D798F5981B3F2DB6C7B33F867B7DC06A4417E30F94CDB4F523AEEA0BE12BD75AAED57520DB0D4B4F013BE3A1DC7AE5C58FD1DE9637F7D82F697B7E92DA427A78FEEC6A5C0255EB57A43DEA6CEBC8805BC04E04FE789E222B1E2642D26EDC14FB36ECC6092B3060E45EED6C5B35DE8741F72933930ECBD7338CF39474122357365700CB50C5EB176FB92814FA7F4032570CCEE6B859236AD5DA5F1730129EDC7BE218BA9874620F6F0EBC45E0BD622F8FD1AE6974994AF95C6519EC1C46650C073D194FA6EBC62F405F63A3416782A47872C7D77D648D0A1C802FFDFDE5FDC112C94CFC68F401889EFC522FE488FDB5384C0D93147AB6587659D936F98ECFBCDCFBF8B352D605F18C855E2559743ED97991C5D50DF44A7B929303835654A3955ABC5BEE6327400A7CCCE460B318D8B5ECE5B12F606ADB3D7B5ED59563B8E675E78029AABC234442C2463256FE02B04F556DA35C4615D14A9F4EFF17DB0DB81DE4BDD894F6628A120BE2D4CF3E1F46D53817899657035A76137E23C0B0E8DDD29465D7F15628FD435E6CAACA4194FDBF85FDCC31D5DAFCB52568B7C0CFBE713BC85FA424BA3ABE149E4035FC86807A8B876D2163B447CAD5EC0E6EF38A1D591AFB46267F9DBF142CAB1CAC1F73BEBA212992FC6D4647EC17848D1ADBB1901277A5078DD72D9C9184E893C0806E9B4AFF0A824670D438620F2A7E8D2965B619D291E5824C014FC888A36FBBE17356431F0039038F9B497902AED969F9C488390B7087763638E976801127BAF1F53803C4DC9649F0EE85D67B239E2BDAFB2BD75F1D1DA22A56FB3AF10A9DDE7AD306C4AF8681029316C0E1949228E6BF5ADF942F1C0EF92B2BCBC0C70D49E5808851444240A78B14D21B54F66271482F49B85F5180B268050327368496CFA8B54ECB97EE6D28EB74A3742F68583DA046809002C22F7B31FBC0566969F9A15CDCA892C4BEB101A2AC3526C76E9D30982C9B4893450FDEC4001D2431828D24D8B1A67DF80E2E10ED2EA8D723227055C48006665F7DA8E032EFDC70BC7EEB2B369B551FAC542AD6DF1A23107E2B3C0E3CCACC25F26404C085CBF56E52D35D7948DB9FDA6DFC24709994719D8CED41A2CC9B3C4B2BEF0967CB71861CF0E6AEA9BEC9395726AA0E2F1A7247ED0F6038E3DF4BF566786073590DCF97F8F0A99658D8F630A2D130C46CF4D26C669360D0F70B75F904C9F923AB285D5DB129F6C25AD21F9E26AC844D07A8EED86C4E224EBFC5B3F720D6F94B0A01B1433C46B40CF84E80F7A6AFA7BB8F9ACF818AD3CAB2DDD6904C067BEA4F1FE79B83CB0AA8FC75B6B096BAD6FE94ABFD48F8EFC0F2B9A02EBDA8FDBDBE1C77F1854EDBA18AAE7F31CED9CD34C1B355108DF18A8953932F7554AF05B203A96A9BB93E0EFF51D7F93B56E351562CF85A2D35EAE2C2427B89A8662A1C723D4F14E6EAFDBD636C2BB7ADE29C1A6BC8A463734C808BEC68B1E9A31AF6E29B412F1CB8C90A9911AC5C3EA71E46113D2D7B1AE2D8802B06A770FD0E9E4652895E42181AD09BB541E9493F258711BB7BEDD3E7CA8B8CE875669CF80A6880ECA3F13800DE7011EA67F443E505C4FB455608AE586F922B3C83FD33B306BDEDB86223C33E3AA65EDC93CBCF3A03ADAF9F328997951D59A9200C0BA2618E3596AF176B43122CEDC52B1E006EA6D12DC236A6FCD7CC46825F2EF7ED71683A731D746FFF2FE54E0B392A8CBFA38873196BB2B835DCA7CB7C3ED9A004C7A329B9734A111744BDACDB669E69E9DF1E52F07C513E3752A0CCD81D7DDC4A64868B7BB2BBBD2095373480522BE10615248A179DCB61DAC90F7FA5FA9B84F190A9C62B5FF9CD473A940F03E7107157D7EB60AF1E3E384FFE8A67DCB2389B3B0FAB7C789CF100CA95CD6A85442CB9A2C243FB9D454B20BAE5762D72B8FE79B4DF81163D61DE4578CF976992D8B9989FC68089F811F53DB1E1092B60220552876B818BEA981571898CD6AB7B5F13C46B0A076526E3241D65014F855EFD7BDE08AD91F259DCB64E94EC3DAD97811EB024EE1D341521DC92AE5E93C73422088976F2D27D64E1D193B955E6736AD2BCCF3C1A53D590576434ACBC0B687F27F255FEF354E68ACA47160EFA7126F908E08E4548C11546D9C412D685FA84D2EB4DCB2BDFC48E2FA8023548198EBB072A48044F4391143E3BEF4FF9066A4B0D03ADC826819D67588BA84F99DA27424103652ACC039DDD3B567851CD78E4117A8B93AFE01FC8EEBDAA1ACB8BA9D095789E76B9D5AB9EE177A15D666EF171FE1D4BDCCFE2E58CE669B561F63028C6CE26DB5C8182FE048680B175C7AB407215FF3A7801C950D509867AB1B0BEF89B3E38A387915225EDE76F91AAD15A85D8C46EFD588BB3BAACBC52C036211512473420F3F061F5F53E9353DE0780425745A76439B3811511C86CA503251F24113384E1A24A9367536E796CE08B896F572489A2339E82A856C + diff --git a/KAT/PQCsignKAT_782_lvl1.rsp b/KAT/PQCsignKAT_782_lvl1.rsp deleted file mode 100644 index 7b90b8e..0000000 --- a/KAT/PQCsignKAT_782_lvl1.rsp +++ /dev/null @@ -1,902 +0,0 @@ -# lvl1 - -count = 0 -seed = 061550234D158C5EC95595FE04EF7A25767F2E24CC2BC479D09D86DC9ABCFDE7056A8C266F9EF97ED08541DBD2E1FFA1 -mlen = 33 -msg = D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8 -pk = 9CD11509551D641707A4D8965860CD0FD782CC1C8725B542C4DC785DEECA56242EC67D9245CD464B838554D3A7FA4F1D90C14736F8244E211D6E31BDB98D500C -sk = 9CD11509551D641707A4D8965860CD0FD782CC1C8725B542C4DC785DEECA56242EC67D9245CD464B838554D3A7FA4F1D90C14736F8244E211D6E31BDB98D500C020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AF7187CDA313F37FF9F3FDABC62548F969F25CAB3BF9AD2C7907227CA6AD10F3649AD7F368B6CD97D76FF56729E90300000000000000FAB343C80EF416B8BE874E2F6D2DA738008124173844DB6019B7B823C49EB7D11B466C99DCCDF9BD341F730E9232FEFFFFFFFFFFFFFFEE8D38C11FF3B50E8BED000948C0604D63CBC8943CAD5A0FCD1ABF813081FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFC92E582CC35079FA93643B1F12B3F08643F6BBAA1BB43EBB601D254D030C00000000000000000000000000000000000000000000008EF4D10A6D336B5F52CD549A2E3848D1DAE6DF6D25781D0F22062325D7B5CA1700F2DCC37B1C212B003DD8586636BE3A8789A405116793CABE12D7E5B26BCC217C1D15748036C18065AD551620EFA234F65476EE48C3A50481189663363D4411E7EDD0B9BAC2C93BD5B3494096B7D0EFF8F1F3E3481F3869BBBB51E24B161C242012F79E4A6250FE4CD6699D7E3824D35E4847E743A07B091404A6BD71D75D2D7D0962C9F51B1CFE300AA1FAD4C0131E69066D832E3D5E462030DD90E7D25A281907475E62A3DE1571CA2157C71EE37FC1945A840408E6C6DB4C4D506A27EB24EF8E239666A663F633A6F766DFE127B32780AFC06E2E5A86D86FB9A253DDD531A38E6416E4FD5F12399957CC8729246CB1D5D57219A5AA35BE69A821338D0D14E5AA83E63F843C0E5C4FAB40FBAB315D019ADC0D29A27BB5D98E3977C516310AE21D41BD0DACCC9940A4CF2A3633E53AF534A7A46EA39A2D75ABBB4170A3990FCDA5F7979185252AAB38A927086DFD3C0C96040FA6A8C87769D6DFD4BC47BE0D38372CE59BCD4CDDE324DA731765EB430F8584D74D8398C73CB8754E918C37076128C2C89262A1A2BE4362CFF195D4A276BE747E5727FF58A7FEB0B4CF247F1B -smlen = 210 -sm = B29CA17640DD8D78A001D6F99D80699D24DBB104DFD7056DA56F2DBFD704F75618FC796BEA040E0612450CB588553B9365021A3E7BC1D5CB83C825056CC7E8B20385B169BA0479A158DB7F6FE2292800AEBEED83CC6F775C9D02FE2F3CFCFE3A789E89051BBE86D0E294A2E3AE04F0AE5AE4818C5FEA17026FC904C8707B078CD5062CBFB0019E5139B8E3070073641AF4203639A9E635DD312C169C5B0A00C6223BC74DE28D76F104064E2800A8ACF700D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8 - -count = 1 -seed = 64335BF29E5DE62842C941766BA129B0643B5E7121CA26CFC190EC7DC3543830557FDD5C03CF123A456D48EFEA43C868 -mlen = 66 -msg = 225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1AB2568209E46DBA961869C6F83983B17DCD49 -pk = F8089F1E4CDEC1114D05242799C95A33EFF7A619154C72B638D0CDEEC96F7C10095044E16160DA2E4685CA344E8686BB1845D37C41EC742F65A4AD2B95B4FA28 -sk = F8089F1E4CDEC1114D05242799C95A33EFF7A619154C72B638D0CDEEC96F7C10095044E16160DA2E4685CA344E8686BB1845D37C41EC742F65A4AD2B95B4FA28020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000441D5C11A8AA5C5467D8B0AB25D9D9860E8B6739EDA0E89293BF033B3886FD929F7EBFA53CE32ABB9B731B32BF21030000000000000087680C8DEC0D588EEF306C300F766450BCFCC4BF62C4ACB2CDA05AD3591BEA80E887C81C4CF5CE437700B9C700F4F8FFFFFFFFFFFFFFC78EB69DDD146BDAF3F602875C57E927C607CE7084E21F1680671F3E5DE7FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC3A5538CA053C2DC420CAF749B36D98D38EFADD5AFDE7DF3605CD284014030000000000000000000000000000000000000000000000505FE21BA1936E52AA6EA708F9E19D69DECA2E81381C277063C5895FE8DA090649543FD0AF132FF623924532129E3DC34EB757C67C12945F0441EDD4D6D5F111F4297AAE2C611B301DA8EB865FE9B5F207677726E85C76D6BE66AE498ABA140D52F6E7070915604FCB741ADE7830E2D2DF152E19FE48F75024FCA5358FD0DE13AD74B4F6C4B532672E04661C0A7A5E2634B4C72DBE4787725E3B49345FF4861EA3840E2DF4D519D90103A5294EDDD64AA491C3BC643C0A479ED6D05614140D13042C9925552C4C24264B04E5C30371064BBB97A1B2C4893E705C6C9F7D4828209FFD12F8D8A624AF0F670C7E8417A2524E2F9FCEE3E48FBBC1181B7ED726B5162044454FA3A5DDFD899273AE0B991909F9F99F2042BF71B6F9F16BB9B556B11873B9497DAC176BA2EC3679AB9C5AA6F55943EE3651E86CDB419586BC14552F01523E9B7CB1FAAFF881AB2DFAB4E02EF193FBCA22181B77CB44025042EEE03815075469A60B4F2CCDF1C4ED4ECA2DB5B313086D1964778C95C6BDC60695909B2CD541A1B3BB81AFFA34FB2EB4361DFD3B07AF0ECE10E78622A83A3A89EDC0E1167551A453BA5EFD957E3136FC4EFEEE0AB234E6B1D8DF278F631EA05C96545816 -smlen = 243 -sm = 7270463CCA0C47A6D702D5E0CE6C520B9D690A07C4C19915432CB1D1A105B12BA0EE811702E68B02BCB7F4FB194B3598EB00077909B007AB3C962D03C5C82A879A05E854F9055AB156535578DB19890226C45B0019A633540802710D0DB0777065412003A1A9191E3D3ED2F33705AC20A61E53695FE1F30017313AC4C96ACF026802F9C408C887E9A5D2300500234C3AB93DECCDF0CA82CA753C45F4F1040258291C34BA8B9F4A930286F8DD4148452300225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1AB2568209E46DBA961869C6F83983B17DCD49 - -count = 2 -seed = BFF58FDA9DB4C2D8BD02E4647868D4A2FA12500A65CA4C9F918B505707FA775951018D9149C97D443EA16B07DD68435B -mlen = 99 -msg = 2B8C4B0F29363EAEE469A7E33524538AA066AE98980EAA19D1F10593203DA2143B9E9E1973F7FF0E6C6AAA3C0B900E50D003412EFE96DEECE3046D8C46BC7709228789775ABDF56AED6416C90033780CB7A4984815DA1B14660DCF34AA34BF82CEBBCF -pk = CE9AEFAE606B0850CF021526889558DAE582A7B6B276FF7A2190849D7327EE2A54D63A2AAE32C9EAEE4C40769E634D52EEC8A780947BA2A3472DDD40B04FB020 -sk = CE9AEFAE606B0850CF021526889558DAE582A7B6B276FF7A2190849D7327EE2A54D63A2AAE32C9EAEE4C40769E634D52EEC8A780947BA2A3472DDD40B04FB020020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B3F9A5CBE6C5A8CA309943E4A546897422178BC0FB20EFDA65D15A93CC5F6D37F8856AC880B6F80C3BBC41CECCFA0000000000000000EA94CA45C9A4C8961F022F2CD07D90AF0D39E429C16562FE45F090B2984220F15C218627DFB1CDB0F39CED4C2440FEFFFFFFFFFFFFFF62CE14E0BAEC58421FF768278B060AE55236F4F143F7CD4134B17FC4F358FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD38C3C8404873AFBCE757687066E597509C6AF8AAAD0A48689DFC2875920B0000000000000000000000000000000000000000000000E10E61CB13D8C482405C95C86006C8E86E259477AF6C2EDD803D6B822DABD6128A4E0EAC79D7D28EEECBC55FFBC88396DCB677DF9F838FB0D3117497E9EC9A0E6114CDDAC53DE79DA74C720C7A810BACD312A555A7CD4C2765BC377DBA70CE0F453CEF85FDCE0D330C7BEFBAF074EFA74ED5C8EFF88BE0F5DADA38B81AE3E10ACB3D28BF30A01BD7B9F4DDBE75C759D56078DC099BF26FC5A73AB95D6B40DE1DF3906CC4316D2043C5183D94D2542079466EBA006479A30E61754A7F8C2B601A537EF629EDD84C0C8AA6B5C0DC362C3544D715C37A9FCCDC441F3B013EFD282B8A2FD82028470C247C57500AE0067E7D65B6D3E72258312C7167F4E0A4AB8F0D7CEA9234BA7C85C659A5CD75957667538D753E3ADD55F4A436C4BFAA37C402041058D3855CE4CC639FDB59760D2978DD915524E1CE04A63A68BD7E42C9BFFF0654540975E66DABD952DBC8EAC271A12AD57DCC89D107C31449B313D0DDC7B70C865983369C65C5BBDDAEB982B6F17DFA17C7313E38F9E8E08746D454F4D2B6150FC09C3D95B7CBCFD2E463DAF53DC9B2B565A0E577583103C1165AD291276D31FEAB951E35D1F33FFB71068CB51E12EA1F7D0BBD70CC34C759277F4172E34B27 -smlen = 276 -sm = 56A10E3D7683EECC9107762E263BC0DE81EEF0036778BF39B6F80595C80389722236DC225F39940334FCA90DD1ADE8ACEB01A1D42F9751C45A3F9301358DB5C8916508CBF805FB25097C9D65799B7105426445F1485841332805C784D5633784DF4F57030A7BC349E347B1844C06E4CAFD8EEBD783351904AC878061EACAC2D72E01880EDA53CC6EE4EB4B05008BCC4456563440766C945661B3148BE007038F89C4804794DC6A1206294EBCFA787D56002B8C4B0F29363EAEE469A7E33524538AA066AE98980EAA19D1F10593203DA2143B9E9E1973F7FF0E6C6AAA3C0B900E50D003412EFE96DEECE3046D8C46BC7709228789775ABDF56AED6416C90033780CB7A4984815DA1B14660DCF34AA34BF82CEBBCF - -count = 3 -seed = 58C094D217BC13EDFDBEA57EDBF3A536F8F69FED1D54648CE3D0CCB4847A5C9917C2E2BC4D5F620E937F0D329FCF8A16 -mlen = 132 -msg = 2F7AF5B52A046471EFCD720C9384919BE05A61CDE8E8B01251C5AB885E820FD36ED9FF6FDF45783EC81A86728CBB74B426ADFF96123C08FAC2BC6C58A9C0DD71761292262C65F20DF47751F0831770A6BB7B3760BB7F5EFFFB6E11AC35F353A6F24400B80B287834E92C9CF0D3C949D6DCA31B0B94E0E3312E8BD02174B170C2CA9355FE -pk = B30CDE6EA9B9AE3BE4AD3F104C7B2A15D15CA08CEC592389F74BB0E9829DB126CA2FEFE93D1FE9106C91D8B5F1123C049FE98ADF548B05F8D8935C9A5780AE24 -sk = B30CDE6EA9B9AE3BE4AD3F104C7B2A15D15CA08CEC592389F74BB0E9829DB126CA2FEFE93D1FE9106C91D8B5F1123C049FE98ADF548B05F8D8935C9A5780AE240200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007EC39805DA4E4EC3AB0A41BF1743B79190DD0129C48B49636390BE037343E94DEA451F5251918965D85113DDC2820000000000000000499A8854F01A015FFA640408A2ED0F94A7FB4C80E9A74DF17B3F96407C0D0741D13D6C2D4BC0412C9CCE028F053FFEFFFFFFFFFFFFFF19AAAA56B4EDD38C572E094AA6C284EC102C04BF1539191A43910E0FA262F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A2518631D9FF185F3566C3B3EDDF3A7DE123C951E5363C145FF7BD367800B00000000000000000000000000000000000000000000000A1EBA2775A35300FDCE3ECF11A51DD7927A43B7DE7538AB1E37338EFFF59120DDBCD823472D08286B42ABC71E93C71120EA19260F80706789469436B890EE317CBD9F7020C18FA1E657B24615A995CAEAD85C3B93726883DC44245988FF980A7038CD9B63706B08ACD28F7266CCAB7067F3D93314F9A73CEC72343DC8A6F90040F7900C2AFFCAE2DEAC87F579F98A2A4599F4DA0841E7901056FB4471D51F17D8638D1B91BC4F3E1C1B90780F573BB5C426343E59A18F4DED8C7FE2ACC7052DEE548634CBB4444EB7698DE9FD41494645288AC08FC7700DC549A1DB24941104AF5278F382F3C7F5FD1271D0203939018CD2B383EE94428DC62DA6900A51A71FF48545107487D05FC9ED3AD33748FECE943F08D624E903902BE862861950E02A87C92118AE3235FD127DE5F36B295E4313EED17B744296450FFE7EE9F29CCE1296F92546B88B190A9A72E9C66958CBE8B1EB2874A6D91355EC7E9716EC5A610D63DC2DB790329FC88DBAB8422D71C6556C7A2C101F230BA4F3EF743F2DBBEE0BA1B90FF644E036CF882D1483E9D57CF671DC9D70E5608EBA3C6B3B9D3B3E2903BB009CCAFBFF97D37B3F96A040CB6D086B8894D581C6B834047CF5F077319830 -smlen = 309 -sm = 52C9D739B0C4D1559A03CE2978F3ADF34639570706444B4A68E0F86C390595862A8BD291F4AAD705BBE7034DB78FEB6670022278197157404F71BF061591A6984C33FA4AD704AE5DEB4E71D4EE476B00C54B410549D83283A401553C11CF5B9C00906A006EEC63E3D9C1455C720774F2E88EA1C828C9E6071F975E74AD9D4C0A0C0151AADFC98156770673050021C848A2F64F596E84E5694FD5D8C4920502BE5972089252525A6D054708A67E864CA0012F7AF5B52A046471EFCD720C9384919BE05A61CDE8E8B01251C5AB885E820FD36ED9FF6FDF45783EC81A86728CBB74B426ADFF96123C08FAC2BC6C58A9C0DD71761292262C65F20DF47751F0831770A6BB7B3760BB7F5EFFFB6E11AC35F353A6F24400B80B287834E92C9CF0D3C949D6DCA31B0B94E0E3312E8BD02174B170C2CA9355FE - -count = 4 -seed = F1902A7815F37BC7F5802D8CBCE5B48D82EB85691718062BFB84D8C06AA41D6E9039B0A107245DAFA4EC109A57332914 -mlen = 165 -msg = 1CDF0AE1124780A8FF00318F779A3B86B3504D059CA7AB3FE4D6EAE9FD46428D1DABB704C0735A8FE8708F409741017B723D9A304E54FDC5789A7B0748C2464B7308AC9665115644C569AE253D5205751342574C03346DDDC1950A6273546616B96D0C5ECE0A044AF0EDEFBE445F9AE37DA5AFB8D22A56D9FD1801425A0A276F48431D7AF039521E549551481391FE5F4EBFB7644D9F9782D83A95137E84EA3AEB3C2F8099 -pk = ED1863C3DEE98DD2F4E6F4387E2A4D1A399F850E6B728A6A8D7C40B935465B2643E27CA92CC88E5375A9C85B935BDBB87310C064EB8B28AED1F459CA9B05CA27 -sk = ED1863C3DEE98DD2F4E6F4387E2A4D1A399F850E6B728A6A8D7C40B935465B2643E27CA92CC88E5375A9C85B935BDBB87310C064EB8B28AED1F459CA9B05CA270200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004CAE8E03B2D1A3D26894F7EFD98C24EAAA3D0E568542DEB106D570A360A4424D19F2E3A33958042CA3A2C21C99B80000000000000000DD2B2D038FA938B37CD6CC81700B4683502A8BDE48774AF2D634853715B7688B42248A443ADC372FC085F777E30EFEFFFFFFFFFFFFFF1D9124A39423481FB8676A3F6B2C0ED71DC7F5356B60A51CA6161DA78A77050000000000000000000000000000000000000000000000C4BEF4CF75541CD7CAE82996469DE7C69CC2F8AEA384BC8341B6B6CAF0640B000000000000000000000000000000000000000000000021984C49AEA08F61C027FA94332C47FECE0DEDB36B463DC00834419BFC664134A81D897592F0AEF4F4DEB928FEE7B0AC4EAE3E7493F9C593E6A5086CAE4E4E1E977F55FD029C49FEFA33116BB44BEB6489912355108D4BB89657B5DB759C822ED4972B2EB6D64B8470E7A1D7CE2AF61BE1ED15E5BD57287179E18125E3DAA40681C8DC2B44E3E38A42E8DA295EB5CA362A77C68F75F84A1A0A919FBEC4B2F00A43ECB0C586707B7022644E2A0D485E127FF1254A7B826408356D1B2AECE47D01C413A56854B6C13B368CA6052D869DCFAE0AC3B7F8D3AD3547CBE45D071DA11F722975E26535B170EA55334FFA661FCC9047EE922E070336E29D5BA3FEADBB126588D36CCD0E1A72F2E83BCB2B7A9ECDC565C0DC7B39CFC39A96E6CD7DB8AE0FE03AE0382FAC79A2E82B9ADB434D48FA79AB0653AE0BFC5AC7D79A6501ACEF2C02802AA8798FB5FD584226346585FD142CB5A6B50193EDCF558995F145F5A616BFE54994A46B6E4B090D4B222BB5A321E7BB1B6995091D44EB23732F67575326307CFF447C6F873C3D025CA9C8617A221D24329B9C8F9330C3FF7FECCBD45808F378DABD0FCBA472461AC3043BF408C208C4BB0AF03A0E15D4217EB52598620B -smlen = 342 -sm = 28D3F1A71FC8A6A329036C804CCD42E360E0B50184BAF0BCACE126B0FD042DFEB14B6D7B5173EA0764FD7DDC0AD3CD521D04BE9B6E8F69177582D902483DDCD6DF130500F8075454D5A3D79818D9A0048421B662B763E9498804558B700208874A955B037D044A100ECB6133D300158DD212C4DB0771C6045AABA10D0DD233DEF001BA681FAB1B268524900001E31BBCE616CD1609A35351EFBCB71D140301816103E30C633821D10268FF167994531F011CDF0AE1124780A8FF00318F779A3B86B3504D059CA7AB3FE4D6EAE9FD46428D1DABB704C0735A8FE8708F409741017B723D9A304E54FDC5789A7B0748C2464B7308AC9665115644C569AE253D5205751342574C03346DDDC1950A6273546616B96D0C5ECE0A044AF0EDEFBE445F9AE37DA5AFB8D22A56D9FD1801425A0A276F48431D7AF039521E549551481391FE5F4EBFB7644D9F9782D83A95137E84EA3AEB3C2F8099 - -count = 5 -seed = 75224ECC026C18159FF92256844D0ADF953F0A4DD8D74D4EBF1DC5EE8F5630B011A447FD4DC34A2404D620CA0E1F273E -mlen = 198 -msg = DBE5B6C299B44F8D60FA972A336DF789EF4534EC9BA90DF92AD401D1907951EB6285EDA8F134277AB0A1145001C34E392187122506AA2DBB8617D7943A129EB5C07DF133D7CCDE94A7CB7F1795C62493ED375353D1F044257DA799F7D112C174FBC35687E2F87FEFBE2D83D29D7314B30A749FE41B1B81095638F112BC4563420AF235280E466FFBE7050C4937C60FC18D1A6025BCBD489F0C538E088E906ABE8597E2C8EBB64F01D225C847AAE4B77BAE6EBA9269962C4B94A9732CEAA2CB4093D442FFBCDD -pk = 0437684BA946B89FB8B7DDB2EE606E891EF01841C4B29D16C89C8DA36C340E0F825E3E9683A173D6B7EB7EF7016545F9CF982059EB509B38A02A33FAD9129204 -sk = 0437684BA946B89FB8B7DDB2EE606E891EF01841C4B29D16C89C8DA36C340E0F825E3E9683A173D6B7EB7EF7016545F9CF982059EB509B38A02A33FAD9129204020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A77DD78242FDA900E3E0DA1830EADD012633F28A9D27F41E5B2F19BE375BFDC17854EC3B5B3C8AAA57E6EC43C606010000000000000028537CFB7E231E7897C8728BAF1A7A6DBAB6353A5CDCD4803E5AC1BDD72066013CD701792D0C4989A858C83B2441FCFFFFFFFFFFFFFF6C551E70BD282098A4D96A9C1EAC6B23B8D1BB759378F0858A77E0E0A938F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF522A0E6539FA644BCB6FD52CB0E7CFC0A41DB6532EF5D2A1DB02342A850C0000000000000000000000000000000000000000000000BF3BDF89E40EC05CB9EFFD4078CD83E1D7516A3939E96FDC470E3B022560A409F70551DD1655C6B2A32BEA80AD92E6B8240F8BA24F5FB932B0CE0E7C414A650700BF08CFADF32DD61F0C06C8F7CE5B056E30B0B38DA93D99EC23AD6A7A4F381FD38BC86176AA5BCA543ED5BD6CEFE65F6BA9963D9788A99DAB9151627704121C1295BD5EB9DD57194FA549F0D8BA98F11BF69875E608D6AC1287B1EC7E4BE11A01014D5C34E925A3D972214F9A9F83A64BEAEF7675377E8FC3184E9DB75CCC0B4034A721D09933CDD155509A6A62F65F22CC21FB5A5A651F85977A926F59212D1A4FBE4D70C9C1CC0E001452FD9F4FD609E32CD78CE77A7BDC79F271FE703431E22AA79676F354C2702CFA69EDD9F1137C1D77E9023C120A909986548E8E3C2E9FD8671E6750DCB99FCB4B40C62C9211B110438CE6C64A6CDE62C1CBF1E9BA175ACFAF567132576C4F71E861552E31D3A21ABEFDDAA61E2C5B247CF567D35203B47B683CEA89E85883BFD99326233F814A6C66DFADB5497A43A20642AC0A311546DFB82C82D9E8BF962829CD93CF055B8DB9EDDC3A8FCCC8D3DC097D7D11D926E14664899000AAA94498ED0C180B1C11920E8767ADE1CCB4039031AA14B0692E -smlen = 375 -sm = D73CB109DE05202C0A064DB1E3FDE4E1BF8D9107ACB0293BF9F752B39E06C5340975C4653DF6F404A7E2F1CFE674B2D57A051C765CE0CE21C94C49047FDAF6705513E0BF8904D9AD20FBD90BB36F5105F1F7C8599248585B2A035B25F79B796F4B6471038573C08DC99AF7259204F8E031C12287D72F8A05092EB8CDD50101A0C30645965EA7BBF7B183830101FD8D380D9196789F2B218330F904163A0F01AD51F3EE553A6C1A2602201F79B2C505C201DBE5B6C299B44F8D60FA972A336DF789EF4534EC9BA90DF92AD401D1907951EB6285EDA8F134277AB0A1145001C34E392187122506AA2DBB8617D7943A129EB5C07DF133D7CCDE94A7CB7F1795C62493ED375353D1F044257DA799F7D112C174FBC35687E2F87FEFBE2D83D29D7314B30A749FE41B1B81095638F112BC4563420AF235280E466FFBE7050C4937C60FC18D1A6025BCBD489F0C538E088E906ABE8597E2C8EBB64F01D225C847AAE4B77BAE6EBA9269962C4B94A9732CEAA2CB4093D442FFBCDD - -count = 6 -seed = 447F03C8CD27EDAA1FA0436DA492812F57AC946479A9F1F90EC4F5E913A05F8AB0DD7645026A96510F6D40AF05D85B07 -mlen = 231 -msg = 0073BEE97FC97C0FBC750D474AEB93189F061E1A5CF6600C04FB0464338EC7E85252F94FCBC7B2BD00E438480D9AF3ADD92A92E3E2E8ACB55077C3278FC7503988A76E9B6062996B20889AA55B343D5A003C8A8852D738F955799FA3426BE5CCD3AA6B6EDA04D4884941FFC0B69C5ACF12B347A74D0580CC3335BA816200F87674A4C1D98097C70F2F27C74E94A661850610ECF4847AB5B58344F958C5719E06BA396225BBE21ACB0FDC512B885D391E11B0C0ED5CE6B5DD8FAFF91F50025C69D43072F7706D80D9FD786E1104125D79A5F4B5FD838815D44FC8B1AB678078CC174DDE970D448B -pk = E10C9D02125DF952B69AF450F6510E5811707F58EBF2C3580BD86F9ADC97DE24F789423EB58D698C78B5C166CEE5E1064C5856CAB21B5004300C7C5DE7B68C27 -sk = E10C9D02125DF952B69AF450F6510E5811707F58EBF2C3580BD86F9ADC97DE24F789423EB58D698C78B5C166CEE5E1064C5856CAB21B5004300C7C5DE7B68C270200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007835C9D892BB5827A99DC2965CA1E360AFFF1ADB98E42F327307E50E3A7305615382684BA3C58E8691751B5E192203000000000000004FCEF1DC83A41D2078020C8DC5584EE8620D14DA91BC063772E0726BB6F37CE05B4642EC2E7B60512A8DD95B5D90FCFFFFFFFFFFFFFFAF427EC99B962DFF995A032872FF653F78B5E67C2A6FF12EBE07BB21C6C2F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90792A160246F7755F8500E4915CD43C2B9E2C6666F7B6CDFC8B16BE46C90A0000000000000000000000000000000000000000000000DDAB3F4485B0845173133844521894485AAA6DF43607B0205F147FEA8277690FBC6C1E6A2C7383231F88FFCF0D8073F197E770E0875CAE86E9E40EF89500F50AD88D8A682A30BCAF656731B05D7F90002D5708DF6E9197A50A9D1997782D6A11E31930D0E39B6DBC96630D9D6DDE9AD36380CA79361A8D522234D19B97920913AF8B490D5FAC142C6D32B734BFFAA41A5E51089DC0713EA47F8112D72455A020D58912E0CB4CCBBCD33F44FA59DE07A0677C8AA5D95522F647669D6B0F4FDA15999766C9F9BFF19E0ECED4889BBE3236C147366F6BE1AF6697C93A60C784C5207BD8BFC58125D6965D26062BC2FA452495B40B32DDEE0175163598483A6D3F1998BADB0B10A0351314B1064B5D18C7C15D3C8882772B8B5CBEB7161F5879B21A2DBD9C2DB06C51BEA7997A34FE8D20D6356F9E9348183F544A040DF9E450083445DA17C91C07E01566000622016679B82541DF70C86BED225C01D75179DE2F0C06BFBC279A8D248177136CE83C227835857F708498E18692EFDAC528A99C7D1E770013506DC16903A2D1524C10DDCD34EFD6D2011C37784D6513023DD9B4B60A7E4750D0E47AE46CDC9E456FAD6CC33ECBDD89D3268F6251C186446D9E574D07 -smlen = 408 -sm = 9AC0987BCFEECEDAC20224A445419D9624C3D9069A1AA688F944AF0FBC004683E607823FA8B44304D1A70FE0A22BAAFBBD005948F8CF35C9B205FC009E0C15575AB8CC86FA0265ED04AA5B69C6457E05E7018A57C678E0FD7805045E8D12D0A1C13C79000E48C07A8A3FAE0BF6002BE689C3587E5F224905DE2A96CE935DEA3215019831999D54DB042A430100AF464BEBBC03B2A6D9CA19C7AC6728720F004EB9F4E3745D3752A5029B33A818379D11000073BEE97FC97C0FBC750D474AEB93189F061E1A5CF6600C04FB0464338EC7E85252F94FCBC7B2BD00E438480D9AF3ADD92A92E3E2E8ACB55077C3278FC7503988A76E9B6062996B20889AA55B343D5A003C8A8852D738F955799FA3426BE5CCD3AA6B6EDA04D4884941FFC0B69C5ACF12B347A74D0580CC3335BA816200F87674A4C1D98097C70F2F27C74E94A661850610ECF4847AB5B58344F958C5719E06BA396225BBE21ACB0FDC512B885D391E11B0C0ED5CE6B5DD8FAFF91F50025C69D43072F7706D80D9FD786E1104125D79A5F4B5FD838815D44FC8B1AB678078CC174DDE970D448B - -count = 7 -seed = 8C151C556DA912A82DEB32144C8A8C9090CFAF5C12AB822AC3C72618837A41C2453B715EEFF3724CAFE69B1ADCAE9DDA -mlen = 264 -msg = A1586245D81F96BD8EE81AA30F10C0ADB343D74CF72C4DFF71550C12873AF89FA1874D4731C996243C3749AF3F6188FFE9FA45430549045134EB29EF3CEC37E72904AA082B1C6161E6B52361E49AF4933A8D8C0734F21CAFD7467B0C02876F43211D6122E3E735FE36064DF7A0C91449237C2BC7C3A78AC7BB0F9567F2576F05802C872ADF183A87AA3B8217188F2F3535F877724F35B29E545DE4BCF258F13BBC7EDD8C6587F733C9691F74B4151CF8C060C3AE9E8D49FE7C77BF477DC9F23FD0F0B67320275529034B84F94176730923C03AA50F9584D9C2D60B8DCCF85A13F243F30A51ABEFBBF2CDA602BF3D75E849EB92422B808416C7E56B046CE38E4677AD24D23D7237A9 -pk = 73CFB56391B385480C57041FF188A62A3BAED10497358A818BA3EE2AC91F9727A48CE7B29E0A89E99404AB2930FB67F61FDFB922EACC0E365B87D3C0B2BCF010 -sk = 73CFB56391B385480C57041FF188A62A3BAED10497358A818BA3EE2AC91F9727A48CE7B29E0A89E99404AB2930FB67F61FDFB922EACC0E365B87D3C0B2BCF010020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E86A54EC5F6ABD1FAE2C92C4874E24FFF508C5296A40710729915C9F8A96F5EEF73A5FF65BD903968BD83A4D8CF402000000000000005FDF2B4F1AA9B715547800DF7515E02BF72532B09B01B47FA60330D612D262C96ECACB992B1CA362387B1543602BFFFFFFFFFFFFFFFFA14D85890CB05CCC5D4C490831460FB67117705786F08B5764ECA54225E2F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88F1D0B1EB38178AC962969C68D05A5780988ED43BDC4570C1356BAF537B040000000000000000000000000000000000000000000000E18A3D34D245E7B371843B9815A98117458428BF00C75108F0F490F797B479013209C9D0DE3F9D4C92E004653FCA5441E2D9EE0463B1A5C6FEBC86F2DC1DEB31BBB40BB131633E329B26683FD87067A53B82B04DE49679E40D6107851106C634284EC1A07CADA9D767379D1F40B24F23668363E3BA97C76B223FC2931D666F29C9C6377018C65C2FE78C2A326409AE06FE647DF1D391B44680AF476431A24A20485037A916C57B0F96DA3F4EB75DEC1550182D5EB02857420F6DD4655CEA970FF8A5C02CC5B0C261458F6F63960CC63A91870166AAE568D0CFA81E1BB969EE2E12FF0AC23BAC424FA937B2F1F3070DA0FE002874223469E6F0E0EADA04DA042593A177A525204464BC126FA859C42BD443D9BBA279D27836A6C2EDD001D51913A659EB74337DC7B6FA09521BB6F08D5F4FAD2DE135443D5F207081B7487944100DA143F484F027B7FEAE23D3238AAFA8458CBDCAEE2F971E56F7A51304EC4D1264F53979ACF7C3651CF6F85C2E4E5A3427DB8BC92C065C9222246E184822081C0643C46AA141C0A9A76B00EAE3A38D7F00E7B2AC588B280767F3F3BE4E7C0A126911BE05E10B525EF242FB9B00BFB8332091417639442E87B559C6499050860C -smlen = 441 -sm = 8E822C360F4B798B010405611808BA98AB809E04D6C1721B4314E96EE6023C972CB26548145D6604A999770DD63CAE333B0507C4842D3D91A6A41803F351D6F5E4A17B09DF00A85D4ACF8977201A080054BA8ADAC61C0D1DA606AD0CDBE881CBA54B0202A22E2AE77630C25F4701D1D013371DC775687402EF122BC62442BED4A107D98F701E9A052053E00400D3612AB652624938E370A748F1BE88E40403580E4B777217FC9B1B0042F421146AE30101A1586245D81F96BD8EE81AA30F10C0ADB343D74CF72C4DFF71550C12873AF89FA1874D4731C996243C3749AF3F6188FFE9FA45430549045134EB29EF3CEC37E72904AA082B1C6161E6B52361E49AF4933A8D8C0734F21CAFD7467B0C02876F43211D6122E3E735FE36064DF7A0C91449237C2BC7C3A78AC7BB0F9567F2576F05802C872ADF183A87AA3B8217188F2F3535F877724F35B29E545DE4BCF258F13BBC7EDD8C6587F733C9691F74B4151CF8C060C3AE9E8D49FE7C77BF477DC9F23FD0F0B67320275529034B84F94176730923C03AA50F9584D9C2D60B8DCCF85A13F243F30A51ABEFBBF2CDA602BF3D75E849EB92422B808416C7E56B046CE38E4677AD24D23D7237A9 - -count = 8 -seed = 9B42F41492530EAC81992F17613EFDF155F407D7E67F18AE193EDCE714D65D1031E7AD10839AAB46D0850EAF5997AB4D -mlen = 297 -msg = 9366ED7B3B623C411448B634446F1A3FAABDD163A6CC1E2BCAE4A98703CD8CEE441405892FBA051BE2A586A6950A5EF73A255E5F86B0D7212E0C51C3BC79BE4B88E76ED6F043FEF3204FAF044BFB1ED722D61EB5D0B74C66A257E8AC3A2206273C80D2EC2123A4DBB715D60118D99ED7322E38F1562F82379138DA3DDB8BAA7CE61AB729AFC3748C0134633CF45A9973C05C75D04E82F631845427626B5799DC07DDF830BA01E8BC6236BB6D03B37D949DBB29EEC7DFE60FBC17EA590956D251539792016E2A8B01E70476961BC9ADA43CDA682D0CAA4FCC58810BBA1A673EF8F6BC90BAEE701E8E4F7C04A346CA56C7B2862FF57756CE6CD1EE22D677BCDAA896EAE96F87870E032C18B6C6A0C1A191FAE2ED487CE55296CC4B6339EAC9E8A742BD0A44C3525CC750 -pk = E203B4632248E761633778FAD4AF27F48704B13D84CD0855EF81316EB0793906CF1DD0B396D09348794294E26A914260AB7811168F591D92A906F51CADED3532 -sk = E203B4632248E761633778FAD4AF27F48704B13D84CD0855EF81316EB0793906CF1DD0B396D09348794294E26A914260AB7811168F591D92A906F51CADED3532020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C56299AC3E57CD99C520858E6BAA500CF5892F54072AE4554D6F94D37E4212F966A70F739ACEA0A6C3C1060D57E5010000000000000076DB82653E7AE1BB2E15667FC220948A4B86BC2B648007554598D40A10DC01F68DEBF36F6B5367E706E534E6E608FCFFFFFFFFFFFFFF8E95E4A3F29ACA64FF3B8E134FF313B9CA1F91FA9B65CCB0928614D28EBE050000000000000000000000000000000000000000000000D5295EF9298B1EE86D5B6E0C44C92492710DABD89F213FF4507D716F0B360C0000000000000000000000000000000000000000000000FC78F06CFEDEB1E4428D11A58E53FA43AEF3D8687CBCF46D1E3FD0B1551CDF3158658785F48F2AFAF49C8E523D209ECF673737BF6ABC13FB6F1FB7F6B5C08F2556BF4796435E997095E55905CA711C47B1262C03A9278B7F21DB32623C3B832842AF81DDDC8E706D02AF4CC41E4B6FE18EAFD3B382B9C670A073E322B4093326A50EB6B7C7025A763984A980025A7BCE249B0CC0C6B9CE9718460AACEC2ED9193579536B19C31258E8163973E1165572D5254A22CEDBE18B2021FAADF1EE432A67E4B12EFFB97B5926BFB73ECEF262BE1608283616FF46F430D5ECBC667BFA27202D310308CE6B40F92C3E123992975800FAB4EE89910AA98316082119C3EF232862F6B85CF0E088474FCD009F18BD4ADBEEC1621545D0D8DB57B60BA260062515766D5D1D20AA5B1E32332F0893D7C7C0AA990E914DBA594373C63C4763EF2A001B219231FCC6AE6ABC3A597DBE68693860101CA0601918E94081B3B188D032EDFBA85B1C9E87146FE2F80339FCE61AEE913CF7D6F1D65077862E7C2A159422D8F8AC7FC0E17C1489B27C29C4AC1BECD85556C146DB7CF70A3D649AA8EB69055B40DEC6D770851DC6F6D78FFCA0F019136BBF2EF0DEA2906BD922206614E913 -smlen = 474 -sm = 6FE75F13B32005D2E5075FE6A364927D241A4B03D6B9A2CD3BD6BEF28400AA17C0EF8E7ED4D86C03D795803B30B14D7C7B01426918CB381419EDC904EEE79CD38CFF63E231027C0A885EF3857C269307C256F37A5D1AC3E9650372D50FDE570249145501A0A2AD03E22B3ED9DA040520997394139BF50605C1F07433AD5CD5920F0783CF713FB6671B228D07014D3A3238B586DD5F1E42CA53D600764A080336996045919143B611006BAB9CF3FBE5A2019366ED7B3B623C411448B634446F1A3FAABDD163A6CC1E2BCAE4A98703CD8CEE441405892FBA051BE2A586A6950A5EF73A255E5F86B0D7212E0C51C3BC79BE4B88E76ED6F043FEF3204FAF044BFB1ED722D61EB5D0B74C66A257E8AC3A2206273C80D2EC2123A4DBB715D60118D99ED7322E38F1562F82379138DA3DDB8BAA7CE61AB729AFC3748C0134633CF45A9973C05C75D04E82F631845427626B5799DC07DDF830BA01E8BC6236BB6D03B37D949DBB29EEC7DFE60FBC17EA590956D251539792016E2A8B01E70476961BC9ADA43CDA682D0CAA4FCC58810BBA1A673EF8F6BC90BAEE701E8E4F7C04A346CA56C7B2862FF57756CE6CD1EE22D677BCDAA896EAE96F87870E032C18B6C6A0C1A191FAE2ED487CE55296CC4B6339EAC9E8A742BD0A44C3525CC750 - -count = 9 -seed = 11134936880F5A11ED3504CF7B273E55A351FCCB10943BBBD186623EE6C7A13A6565C3080D1F536BFDB018F99C4E46CD -mlen = 330 -msg = 0998114C84F84080E7EEBB47D248980FAC9D28F1ABB6DBAB3DD59A5CFD2C7CFF7F308372874DD5447C7B02E30165501C0C673128E4C543A414222BDF47E7F4E8DCA757B0F4A3281C0D10C4F02AB52AAF5B9A715E012607BA310947A60A5F62D6B8CFA96386D27CFA709189202421C078934AA2D955468E550AD4D0D4ACDD98B168A9568E232192E92789830317FBC959087FFFE353B6C168F3EFBE7164444F1D6CBA5246E31658C65440A841DBA78257E78502843EC1A6E9710229C8EEB85D6CDDC7D543285624AA1F756A5DD4F1A5D4FA52DB8C5C34880ED448FBB6D254509FBEEA0FA022F276B6A66BEF7ABFEA6049FF74291BABE781F718683397077B29FA9E2B46BC6B09251E587CC5B182195DD4060CC4A319BFBE251A5B660A739DFE5D0E5B93F3CB7E440194F1C8BDA922CB1A3EE3D27EDFD61C1D31A7F4534E84889EC83B51F1641892766434 -pk = 1823FC1E531869108472942BCD6CD8D099A085F182EF8DC0B2CCAC825469BB0088D2BE088E5D0F750AE5CA15653EFC7B08985436A1463B5DBCF920B2455F4608 -sk = 1823FC1E531869108472942BCD6CD8D099A085F182EF8DC0B2CCAC825469BB0088D2BE088E5D0F750AE5CA15653EFC7B08985436A1463B5DBCF920B2455F460802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055FE89BE50369F64455EFD55C7F15BA0126C5AF0D61F73C0E9532EA1A5B97EB05833E1A62DDD41187F7AD7D695F70300000000000000A88C95EC7B13DE047FA1B8E529EF01A371CA2F540803BA75FBC925B0EE64462F0D22A2F45E592450ABADAB9B853AFDFFFFFFFFFFFFFF9804950EAB01C5B7658871DE8642052A95F4A200F8E60CCF6738D2EBD867F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB9FD6478AE36E16A7C487F2AD4013DF15C87031F1BEC0D8F7353BBC1C67010000000000000000000000000000000000000000000000E9182B9D2C7F3E91949FDD1C206E631548F20E84E96051BE6FB40E2F228BC130ADED405B6975204C35F7F6D938C692F087A5E01A1D38A5CFEFEEC510B34A511EADE6BB822C059A6943247A77B00C68B5FBE87A3C3479B019520D9F468268D9205636CA492EDCC59863DFE2C766655784C008803B87692CD7BBE5AB590F2FD929365C9159D74CB40CACB1F642BEE1F01FF9EBCABC80E6A61D38B861C795BC2814FDBAC6F5E9F9733BBAC7180FD0073D99C95D23B7A8B787ABF23962EC1D8F6F1B2E76FFCB8DD6303B4660332FEF35D80F0C108AA36F59F237B328C24D5434872BB6AC640E832B56D7521E8DB834524CBB033F2F7833652A5A06621FC925069310DADD0215D818AE6B1CDF5A3D63E5A5FB484B4E8A4E94C6095B9B5DE8125B5510B44B804DB91997864F2102F57F6EF36E04007DA1A401BAAC1D5ABF6C43AD2A1BB5C33E22D1773566B5FEB20DB8ADB92EF63139A6557038EEF05B7739700E6A00D8A410E538D9519525CF9D91B4CDA57FEE522D069DEC56E2C2DE72CAFC609C1AAC0B64D4F0749D5EE421DC9F9753EBD3417CC8DAD1BA436C0C2A672A2240E027A1053D55BA83A01FCC7F5588197D0ECBA256DA6A5D619F8C9003046AE2DB2631 -smlen = 507 -sm = 34E655D8808F477B110143D2944341BD761BB1079FE7115356DF64D056043AB39E211F68EA1557003C524BD664660158D804934C5D4C2615480BC600796506A6660D51D2B905AE5EB7C4B82A3FCBD702E8F75BEB69CFC3412706A57EB8339B1291A155064A9B023EC921C41AD504856837D2459FCB68B004E03C779AA7C69B588C0275B91F7D29EBAB1D0F0701A56533353D05921DD545719A3B5D8AF4050080A0290AC8A0681E3004FBC53EF177007B000998114C84F84080E7EEBB47D248980FAC9D28F1ABB6DBAB3DD59A5CFD2C7CFF7F308372874DD5447C7B02E30165501C0C673128E4C543A414222BDF47E7F4E8DCA757B0F4A3281C0D10C4F02AB52AAF5B9A715E012607BA310947A60A5F62D6B8CFA96386D27CFA709189202421C078934AA2D955468E550AD4D0D4ACDD98B168A9568E232192E92789830317FBC959087FFFE353B6C168F3EFBE7164444F1D6CBA5246E31658C65440A841DBA78257E78502843EC1A6E9710229C8EEB85D6CDDC7D543285624AA1F756A5DD4F1A5D4FA52DB8C5C34880ED448FBB6D254509FBEEA0FA022F276B6A66BEF7ABFEA6049FF74291BABE781F718683397077B29FA9E2B46BC6B09251E587CC5B182195DD4060CC4A319BFBE251A5B660A739DFE5D0E5B93F3CB7E440194F1C8BDA922CB1A3EE3D27EDFD61C1D31A7F4534E84889EC83B51F1641892766434 - -count = 10 -seed = 98DDA6B97E89A479D5EE214E660DD6B5D8F6CC638A1CD4F462A0EC545F5B0B0A1A403AADF566F7B1C0C5FFCA29B36FCB -mlen = 363 -msg = 4CCA95CB9F254C2EAA7DCFFEF662EE03320D5FC626A6484304BF62FC20F341FBE26E1537D7BD20E95440F7CC95EE84E1297C807A0BC9006DFCD5C22A5C1FC0865F5D70E5D63AD677FFFDEA52BF85D1A4F159F7ED16A745B4D971B620048B5F518EB2DC672CA35022578059E1ADAD7C07FE910A5D566B8321D9A12F34C250BE35CE964DDDEA23C90EA77C9C1BBE3532FEEFDA3637157786EC7D37775AE5CB0BB92EAB45A0FB1E833E8A6F3D06B85946E31A79B64A02B31FA640ED514A85882C89F693A06354DFDDB0B5E23E7792134C69C1D3908882DF3A7694A05B241B87FB2DBD1A4D9F26943B69F3CDF730301663089D1EBFC23299DA21300F735CEDF7B109F3E0BBE273776E6AAFA7054A6CD9682B967EB7903DE549E9558E62DCF3AC444DD7042FEA362EFB555BB97FB464AD7FAEABA3197C14A6740477DB50CE3FB8B762F48F880381D510FCC836E5880B48F08BD6333202E838AB73F2E106CFBFB218AAB802DA8A00F13F78FFB70C -pk = 04E8C226A2F87357E58E21F4B2C482A2140A4131DABD55691E66EF87EFB3F7077BB00BCA07D07ACC8C6FF8A3787B56631F921841AEEF0A82F27CC74122B7D01F -sk = 04E8C226A2F87357E58E21F4B2C482A2140A4131DABD55691E66EF87EFB3F7077BB00BCA07D07ACC8C6FF8A3787B56631F921841AEEF0A82F27CC74122B7D01F02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EB65F1DCA7C04CABE17F955388D20FD59E9D2D959820AEE995D4B4F43DF8668ECF497A28155A47202B3A8C0D8D01000000000000006BC0FAA922D617669A512ABC825A45795DE43AAED0694B53E1B39B1C388E3B99F4AC80645221BBC64101D88E917FFEFFFFFFFFFFFFFFEB8ED29236E9134F7827518543BEB1A0F5C78C73108630EEF27B6FB578CD040000000000000000000000000000000000000000000000107996B0B7E6BA6F25566F3C2A1BCDB9725DD3319005EAAB2DFCE853AD321000000000000000000000000000000000000000000000001C01EC0518155195DF7E322216798C2541C16FBA61F091FADC0DFA2E4C030E21066DEA7579C483AD0C31FEA39DA6789D8127C2C1F7A7F5303BCE3CE38CF65119A871FC5E2E99CC03981C3239284E0BF438A575505A558C5AE0470D061574FD16E57C2E7281DA45D14902A3C123A5D1E2757A99225670C68C588302CFB970CF2AB408C46AAB273E6613B9A350704FB084AF1C70CC96335BEB30E79A85EFFB0F0B9FF105498E115BCDE6A0DFBCBC55E8F8C75464EEC53107CA60BD4C43FAD91C1642CAF68BCBCACA62DE5E1A64676C27593821D0BA5A0D95AEF94B9985ED271E0664BB4F2AAC31204B4876BCDF371DA2BD81B1F4CE7B09F30AFF2E0BE9338C5A3213C95569BB32A386847B9E68D11DF2FEF869611B9DDA1370665EA26E92BB6F166E61974B1E2A8FAF2162C1797E3C3D39E582DD5F7A9532834B1EA1E42CFC73232BB77D3760937248E6D3F6ED20167FAAC3D89307F83839F8332097227DA0CD1E7CEA086F2A842046C39A653630C7B0D7759DCFEDC807CAEFA9BF1879161CA521950FF2FF959960B8DD95EA10C91DA4CF766B337CC4F7FA8715CE6E04E23C2F2D6E8AAB7990DEF6FC1E3A13F1B64C22F20E5D7C1DF82CA04DC46BFDC69078DA2C -smlen = 540 -sm = B8373FA5A5E13826DE04997C77F5C17F4144C301B1CD22C72C40DB95C1030B689510EEADDD6ECF04712AD5638A5C13491D03C2D5F0D04F90D80F55019D1A48A30190E61246077B6EBADAD27383DFAB05AAA359C44836BB4BEA017B428846662CCB3681069E0BED84E3D8675B4006766DF51FA05391E8B605BA1D1F3F464AFA98600797DD8F33BBBE2088770400A320B262A7ECD3FDCF598D1E3E8414260C03572DECA102320195F80166D0B0B70311FF004CCA95CB9F254C2EAA7DCFFEF662EE03320D5FC626A6484304BF62FC20F341FBE26E1537D7BD20E95440F7CC95EE84E1297C807A0BC9006DFCD5C22A5C1FC0865F5D70E5D63AD677FFFDEA52BF85D1A4F159F7ED16A745B4D971B620048B5F518EB2DC672CA35022578059E1ADAD7C07FE910A5D566B8321D9A12F34C250BE35CE964DDDEA23C90EA77C9C1BBE3532FEEFDA3637157786EC7D37775AE5CB0BB92EAB45A0FB1E833E8A6F3D06B85946E31A79B64A02B31FA640ED514A85882C89F693A06354DFDDB0B5E23E7792134C69C1D3908882DF3A7694A05B241B87FB2DBD1A4D9F26943B69F3CDF730301663089D1EBFC23299DA21300F735CEDF7B109F3E0BBE273776E6AAFA7054A6CD9682B967EB7903DE549E9558E62DCF3AC444DD7042FEA362EFB555BB97FB464AD7FAEABA3197C14A6740477DB50CE3FB8B762F48F880381D510FCC836E5880B48F08BD6333202E838AB73F2E106CFBFB218AAB802DA8A00F13F78FFB70C - -count = 11 -seed = D34A0AAD27ECAD31A5E08E9A2D7901A9B85F864D9B1B46F40CDCA0B3615B2CBA04EF82AD7BD8CF627C3E861477030BE2 -mlen = 396 -msg = 5C4B2E1A344DA1418B0F4BE3FD99505FC30F2A1E5B696E943BEE2451D7B268F722E04F8E00FDD9E1A470F8C977A6D45A5F621B8815E352FA14F64977D1FA08082A48AF495719EA6AC1C0B3D898603B4CF7EC88E68DD7190884382896D953D612CC21ABECFB01A04A1BB1BBE8986D34625756396CCD84BD1A6B5454DDA98824CD4844D98F356AB485EEB19F9196ABB1C3088C0C3C5846C88760B696D91A232D6F4CFFC85BFF33DE1A3433A27A209A461FCF37F2289F98BEA7CCF183DB1FC42A7EDF958E7913F8711DC375E43F09BE7C7A2C2B1318AE2A9CF5988FBC2CE0735A2CD9FB6C8496C34406C538C01BD494193240BFF947FED47B7CCE99A1747973F1FAA5223AC564BBA0CA8973D1310B5BFA1452CACE9110BC22A8D4080A8BAAA8ADFA3CFB6685679B648484E3A43F9B1B2531949BBB8FAE1846F6D45D9272FC2CAA2913B5D9F8D322E9B18A685122D74634C60730C101578BEF2480711FEFFE02123E76D6C846559E2EA99A98923EF095630102A5573EF027E0AB6E52555A9EDE0D15A73C8B2FEF87CA6FD9F903F0 -pk = 0C9587EF316610E1CF51FBAFB2DB4EB8988A7E94F58B16877893A603CDC27206ECCC43481ACA7D92ABFDA0D5AA69F21C5A3E28C83F52844DAF3B7D1B20074930 -sk = 0C9587EF316610E1CF51FBAFB2DB4EB8988A7E94F58B16877893A603CDC27206ECCC43481ACA7D92ABFDA0D5AA69F21C5A3E28C83F52844DAF3B7D1B2007493002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003495BCB9DF00ECCC61E1292BB7F3C384C5605279102C622F59DF8CC4915383B4119BED9334950463AD72B354B6A01000000000000002407FEC41BFD4C788FA3DD85D87B867DD5F2FFEF5A88A16115648F8367C2DE94AF09207674F77A64B9B5135A784CF9FFFFFFFFFFFFFF94B9DC638C23A498CAC955AFCBD3705D424AA741F577CA224538617BD172000000000000000000000000000000000000000000000000BD1911E4997DDA5405B9DD4E89D4B62635F4074CD9CFA6F0DF9A573399DA00000000000000000000000000000000000000000000000067FF795C0DBA7DB4E3F30824C5A9052B4DD4F276F32404CFED9E1ACB20423C2C30C7283126293984F4620E56D03C28A85D61C13685B71DB748F177EBD08471329B422C3A4E776E894E2C5213BF422424ACD7BDA8287D46E9F58D29431A1F3B1BC7D95754CECE26D042F4512968445DEC867EE3F3D82B591B5DA1153F8E676730B18F2B092CF8B6B0D0767CCF46E91FC6E7589F0D4D68C5863B8394CC7386000BE479ED2801B40E02132A8B6C43864FB5E0FEEC238658BB49C9955A64BA5EE30EABB2F14B14B3FEFBD216D2D99AB179C4110182FCEF89376241A9B253501571057C98CC57C745DE97C377F30A5F2812C5AE689F3BE9C9A1E72CEBD9BA3CE5632B3682885D11B6FB3EA3AD8C0CEC5AEA943A0E2B7C9FA0C4419B61B3DC1EB5921B3138F89118B58352B91262393B2C660E42004C15ADC7BCB0A51EC34CB5B18205090C32170C580D7B8A40939EB85963C859E5C68CFA94A8D344EA2B9EEDAAB425EB4D7C79F71A96123511E9F51970C604829EE44790BA8ED026E9823C5AB24100B04E51CB4EA809097DAB9534976AA7159A4FB2A1EB539D624ED3BC99A580560B84610DAED2A552A7D84E60F6DCE662987A85FA5A9DB658B2AC372F132B14AF32 -smlen = 573 -sm = 691B90632D377369B0039784E6C7C77AA0CB35024436BAC62935328A2C00A623FEB844A5DEF42B05B4DDBE59DA795E039902DC5DF1E89BADCAC158075426C3BC63FF8BCF1103D7624D652A6C2950EC074F0F33D4B30C98596500F4024AD213BADD237B0666F3D880A3E7619C9701003FE266EFDE3C621603A5FF3DEC0F9C168A20029A753CE5FF4FB7AC410101E310ECF2816DC9EEA2BDD79FDDD817500C03AC27C58DE7C6740A9200DAE0020CF159BD005C4B2E1A344DA1418B0F4BE3FD99505FC30F2A1E5B696E943BEE2451D7B268F722E04F8E00FDD9E1A470F8C977A6D45A5F621B8815E352FA14F64977D1FA08082A48AF495719EA6AC1C0B3D898603B4CF7EC88E68DD7190884382896D953D612CC21ABECFB01A04A1BB1BBE8986D34625756396CCD84BD1A6B5454DDA98824CD4844D98F356AB485EEB19F9196ABB1C3088C0C3C5846C88760B696D91A232D6F4CFFC85BFF33DE1A3433A27A209A461FCF37F2289F98BEA7CCF183DB1FC42A7EDF958E7913F8711DC375E43F09BE7C7A2C2B1318AE2A9CF5988FBC2CE0735A2CD9FB6C8496C34406C538C01BD494193240BFF947FED47B7CCE99A1747973F1FAA5223AC564BBA0CA8973D1310B5BFA1452CACE9110BC22A8D4080A8BAAA8ADFA3CFB6685679B648484E3A43F9B1B2531949BBB8FAE1846F6D45D9272FC2CAA2913B5D9F8D322E9B18A685122D74634C60730C101578BEF2480711FEFFE02123E76D6C846559E2EA99A98923EF095630102A5573EF027E0AB6E52555A9EDE0D15A73C8B2FEF87CA6FD9F903F0 - -count = 12 -seed = 4FDA9FB6929E3F391901D69FA0AA2F25A9657D249A620F1B9E305A5965676BA76794CAD3355EB632579C3958CA7D443D -mlen = 429 -msg = 49755A7B1A7CDC5C9BDF5149968061D3C95EE67BFBAF02750C45094303A9D9CD23A08F19B9C768ADC63FFD1527186D09CA4E0356BB882E263BF015CBE3716C05B31A69DDDB790BA82C341AC9B6BE68A81B8BEF8D882304BAF0020D761A0DB04412033DC369961A5213B04E81736A580F1162780599CC029E262D67F31B2773AFB457A1ADAAA292163144F17DE384234F3303111FCD89BCB30333C6C6486F775ED099043C34E6C86450B650F1A02D03781B1D20691B767D166DADF1DCC4D8604D976EFDC9168373A7316DDA9B9FB02A4A321218D9F54E287B7167A08BC0153843BD6355AEA1310824DD5D5EC458BE694AF176119D9E588A29C650FF5500293659EA478B39A62149F819CDB7E7CB32E1D7B1284F159E2AB1B1EA41AF4D0AC94FF3111FC1CCD818F9B2CC7A259701405FDF6A51D2D3EF62789297BD16A659F14968EF902C4A23DA409BF13A4913467B5C991854B2CA6CC006D3F4197A6AA58BD5DD95C36928DA9583332C3FB134FA3890FE7E299F1C17205366C4F4230724C43E4803912E72B816658BBB1B63780865A1F66A2A49B96E93711B1BE97B827D12173402828B1A065B94310D5BD6098D -pk = 708BBD331F4267CD5FFD69F77BD997229264EA3920D49305C152F493E7A19022DB59EB8E46516F3AC73D6B16D72EAF21998B40B76031FE60B95871CD80711300 -sk = 708BBD331F4267CD5FFD69F77BD997229264EA3920D49305C152F493E7A19022DB59EB8E46516F3AC73D6B16D72EAF21998B40B76031FE60B95871CD80711300020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AAC7E9720A0190B71FD111F84C4F27FB1903144BEAD7A2FBDD518F454DC451B6515795590D34A6697DC0770C71C9020000000000000019FBB6C1CF42C1A381279772877A480D9054E0B3568D7F2FF20DF4DE7B4220C3419D81C4686CD5D6BC3DBE67870FFDFFFFFFFFFFFFFF792B76C44B1F52E944067FB6F54FD6B5D8EC5AC415C3D575A834D4B51327F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8678722FEA9225CF275C3217B8824848733BE549B42349F8312633BB7F0A070000000000000000000000000000000000000000000000B6B67388564D089B3FBD94EEAFD8E70666F7D3E59CB3A3E33806162B46332F02A8495BE6D2CD1A319749D56FF9FD4C313F3581163DFE01A84EFBDF4A08534524AFC8A9859C6A4B8CD76B34DA6AC48F89D0FCCC08728958A64F18A3EE981B68048F3EF5EA267366BE9C03A592FAF4916E4E5D88137B63E8CEF8121E24BE7B980AC6425680FFEBB748BDC9674046F0EFF0301EE0ED06620C03EE5B690D4D9AF8277EF42D1AE60241DDDA8B4102A7313854524A1B11965178982D58B595EED1AD0B719EF8CDBE0ED72620B7961AD8F5DE3C3E7901DDCF3D9F16F0D52408257BD91BE9B60FA517D377729A6609D391443A0460F35B459FC196E1A2675153D2EF660D081F6352DB23C9AF4FDA6B2D06295F4F8100DB560E867CBF1C2AE82A05B826042578EEF41BCAFAB6DBA633BB8B144C3EAF09B76F0F776ADDCAEAE95CA7013C21BB462A0A770AD0110E1B66F8FBFED4B75FCECFABBBFD4B912B936EE0A90B4A1DA9D6B9FC2FBFC09835D3F4964AC59070BEBE136B941A6D01C63DF76487795B00F42A531AB26B108D51C88388359CF933D87F891006A3DBB3E040832C2A79E81CAC2E54FF6EC179F8CE83B84A9C4AA035B06FF066D0023D5548F49F6B7DBA2A1C -smlen = 606 -sm = D6E743946346F8BC3D016FBE22547597F307FF07482E3B6FFC5B107EBA00FE81C29FB940EB49DC02990B49C290A5D998B5024AAE894FCE385016CC0773FD237F5A2B39BD5002540C88F51CC48ABEB6052139B22A925EA2C94F0751F5F5877F82A94889078F80DF4FE3CB249CE002A42DCC3307815C891B03D7102350DBDA70DF2903337A7EDAFE1352F3AC0701317BF11DA167E40F149CBC45FA6A8071060145E8D5FA80BF95EAB105D4C33B60663EE10049755A7B1A7CDC5C9BDF5149968061D3C95EE67BFBAF02750C45094303A9D9CD23A08F19B9C768ADC63FFD1527186D09CA4E0356BB882E263BF015CBE3716C05B31A69DDDB790BA82C341AC9B6BE68A81B8BEF8D882304BAF0020D761A0DB04412033DC369961A5213B04E81736A580F1162780599CC029E262D67F31B2773AFB457A1ADAAA292163144F17DE384234F3303111FCD89BCB30333C6C6486F775ED099043C34E6C86450B650F1A02D03781B1D20691B767D166DADF1DCC4D8604D976EFDC9168373A7316DDA9B9FB02A4A321218D9F54E287B7167A08BC0153843BD6355AEA1310824DD5D5EC458BE694AF176119D9E588A29C650FF5500293659EA478B39A62149F819CDB7E7CB32E1D7B1284F159E2AB1B1EA41AF4D0AC94FF3111FC1CCD818F9B2CC7A259701405FDF6A51D2D3EF62789297BD16A659F14968EF902C4A23DA409BF13A4913467B5C991854B2CA6CC006D3F4197A6AA58BD5DD95C36928DA9583332C3FB134FA3890FE7E299F1C17205366C4F4230724C43E4803912E72B816658BBB1B63780865A1F66A2A49B96E93711B1BE97B827D12173402828B1A065B94310D5BD6098D - -count = 13 -seed = B0E6A23FAB10A7A333E3720BE00D31507917F39C5EFE1C98CA18BEB5C3101FB4479B478A1558C4C00398C55C9822FC44 -mlen = 462 -msg = 439529DF1864297E33956AFEE00A60099B658A67830A6A6ABDDC329E87831D9F9B647917FEDF1AE182A40402143285516FCAB83F447354C72FAE81AC26E7005C2AA561763C152E66BD80F14565F47DEFA440DBB491E7994AB9FE35995D5FBB3800CA030B43DF611141637A5246AB9D9CAC02EFE14AF60736B6BDB2BABB97CF21E831E5D04D41C00F090B154977900EFADD3A9313389A3F84CB3AC38E8B57B70A43DD08A8243F8154013FD5CF29DE5A8DF0B197C12B17E0610FCFE3625CC94067E01E23D23A243AD1C1F805CC50E1447D1DF93C25B8D76396BB7199E64129522462C5FC8B30C132D4EE9E0BF6F52961FCE7ECF650647E7064AA5A6574649A323E144D7C5491DE4C0A1A76D08F93F87A2FC7F6955FEF86991E62E2CB42908E83B0C0A8BC180B7453CED293F1E20F300431EC1D395E8A537F0BC36A673D491F14381DEA90D8F176D06031B0A7AFB40EA8F76D37FA82E2572B9799A5FC7CF4C49BC20AD78EFA8CD989A84D72ED680AC3C0F64155C56ACBFD7C7D628B418A489F961357F77BD62204ADB079DD3106485A37FEE535C9CF82E832D8AADCBF686976B806B02AE733DB46DB0BF162E973931C3E338CC86DB38C66262D1B2EBC7691B8281E0B20BF36305FBA996D20ECFDC695 -pk = E867FB07534CBCAB37895D2B31DE4FA91EF637E26FA1031058B9E8B2FC47052F015F9B96D9D5FAFFF284E062112CC67E48E55D1E4EDD4AEC091102B456453F21 -sk = E867FB07534CBCAB37895D2B31DE4FA91EF637E26FA1031058B9E8B2FC47052F015F9B96D9D5FAFFF284E062112CC67E48E55D1E4EDD4AEC091102B456453F21020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F5A3BCF1CFB87658D3C1AE9D27C09DFDF40B241149D7CC8386F0B9966EE7909E58E8A64ED8693C7FEA929AC7844B01000000000000000461432A1F94C6B3FEA71F8A846E7BF2C671806423B85AB064501702E68063FDBBFC5649C22559C0A15BC95C4BD5FCFFFFFFFFFFFFFF0898979C7197EF59D00C1B44F383613EC86002B76D767B0A4B7509CD453E0000000000000000000000000000000000000000000000009DA823152258C0A1275F914CC417D4345EA4099A42906A6687F984B7D8670A000000000000000000000000000000000000000000000025B7C5743642B0AA6739B104E27F4BE20FB3FCADD7D10081E9349D790352CB2C5B5AAAF90BCD6C96C9D17B7C0F86BEE7645C6CF27965D93CB9E1711908204F2B58C2C943FD04CA399BDCFD0E83B3F4DC3D471741D328EF02BEC64450EFF9A626E940FBDF03323E4A0EFF4E9C63FB5CE359F51EC0A6AF2B4D23F73A7F4F8F52314C4BB8A70CA6112961471D413F005F86AA91073D5954E215AF1C3F6F50B52A04B920C73AF7C105395625E4FFC3455E995843F696017D6481182ACFC11A7D701E9F8D8C7B386BD20C0041B32F956209A378E8D429DC318816B5B58B0BC0D7ED129DD494DB8E8494516A161D681FC91178852CDAFFF7E411101AAC0BBEBCB6B606C80AAA79031B620754DC333E9D27AA57DFD70EC7292E293C82FF0018EB789F05DF857DBC1CE65E24A23FA6028D9ED12350A255E24A09600C58A4BC0C4453971B4B7861E7F1FE900511280F9DCA24E19980F7877D92658932082EB975566D9823F460D32FB546D02FED7AD2A9F9D95332D639BC95CA18DC5FAD142B0A6B2E2A1558B08C65D7E8A5EB1911B005DED9D14AE115F76D08A2EA457ED508DFF5738C2E1F17B71C870D99326A003B1FF31ABC1E13849259D70304DCE8AFAEE3A046A30A -smlen = 639 -sm = DEDE3FDEA7FC043F56062AEF883C5C591A102E0571972F3A9FEAD7514700B566B90602A13C0B7901F52306C7A05AB20232033A9422AC14BC15685002F682206AE86FE4EFD10222049B269CF11BBB7602B5D139B61A3CCA287603531F0DAFED83E623AA04F9FF8C464CE3A0DB55011194F3CC36054EDF0705903D20B4FB1D4BE06401BC2F37047C718EFEC40300759E40D25735443E22BA5EA86D8BAD9F0A00580AD38C15CE74B4A800F0A36E3CE073A500439529DF1864297E33956AFEE00A60099B658A67830A6A6ABDDC329E87831D9F9B647917FEDF1AE182A40402143285516FCAB83F447354C72FAE81AC26E7005C2AA561763C152E66BD80F14565F47DEFA440DBB491E7994AB9FE35995D5FBB3800CA030B43DF611141637A5246AB9D9CAC02EFE14AF60736B6BDB2BABB97CF21E831E5D04D41C00F090B154977900EFADD3A9313389A3F84CB3AC38E8B57B70A43DD08A8243F8154013FD5CF29DE5A8DF0B197C12B17E0610FCFE3625CC94067E01E23D23A243AD1C1F805CC50E1447D1DF93C25B8D76396BB7199E64129522462C5FC8B30C132D4EE9E0BF6F52961FCE7ECF650647E7064AA5A6574649A323E144D7C5491DE4C0A1A76D08F93F87A2FC7F6955FEF86991E62E2CB42908E83B0C0A8BC180B7453CED293F1E20F300431EC1D395E8A537F0BC36A673D491F14381DEA90D8F176D06031B0A7AFB40EA8F76D37FA82E2572B9799A5FC7CF4C49BC20AD78EFA8CD989A84D72ED680AC3C0F64155C56ACBFD7C7D628B418A489F961357F77BD62204ADB079DD3106485A37FEE535C9CF82E832D8AADCBF686976B806B02AE733DB46DB0BF162E973931C3E338CC86DB38C66262D1B2EBC7691B8281E0B20BF36305FBA996D20ECFDC695 - -count = 14 -seed = 0A98A2BD2B9FF42CFC18D3396BAD052E1D0F3372854DA69A318B142F7A1AAC609C3861263BD8FB0549DA7266784DB8B4 -mlen = 495 -msg = 8CB18850E27D8416B88A9A71F4A66BDF447814DB6C82098C371B53F61600EF5DFD88E4FB34200207C3F6F55166AF4878D38FCA7E2DC18FE662E3EA491B58A86246CAE16090FB7ADA53B9A67B3D0E3787D3323EA921274C60CFFB19A889BCF0300FE10E242AAE025F374DD83FBE9D007C8B9D9D75574C74146331DDEC6F0E49C10DBAF15654897E33E2B4780DBA484224AA6FAC79015D5792FAA2D532BB7D239B11D91420B98690B1FBDE9632223927E0804BFB284368A426C414C3DB8EA82F0D246413861475ED2DCA9E80FB4F3C34FEF7528069AE1975AFC52AC5AD2CDBCA1459E140F655556093210D7905A1A1E6CEEAEF0194A0B2EAB2C1EE853484E715D2A1DB551FDC620D5331164C74CA4848B61D408D2F2A943FA09EFEB63D524691C99DCC0B22CC61B98E6FB8039E5E0B2D7DE2CAAA900A44184BD56C9F02141A3AE8AFC661E3E898ECD3004FDB0704272BA780CD5DE35153B6FE223843024273642DCF8E4B58BE2AB1F61668680084AA0B75A32E766C8AE5EB30D4E02A12E6798DEA40F80D8DDFAD2041A52922701C689F46F49F84CFC05ECA6D7D4C356D50B6A0BA61966245D45134D6A1F5197540A1C39C36BB0B78831AF3F5156E669FD9213B64E0CF1C5A31E88AE79AD61757EC67B551B9F0A760F646BF81F6B92403A62840CC29FA4F3949B3A9F0A9A4286EE7808A -pk = F519DEC5C20A272B7599F3D9A0F3763B4915BCCC554AEE0BCFB2A04A14419F26A02E6FB6BA8175BD3AF433CB519D9A076EE102FFD68B685490F6A184BB228A27 -sk = F519DEC5C20A272B7599F3D9A0F3763B4915BCCC554AEE0BCFB2A04A14419F26A02E6FB6BA8175BD3AF433CB519D9A076EE102FFD68B685490F6A184BB228A2702000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072FDB4FC557EB1FEDFD124E63961C0B7910536327580134085523E96EC98273CCD057C74A583F853E018AFEA518DFDFFFFFFFFFFFFFFA3E3B4AE47386D4FFD14AF5FCC349C35E3D4A571E2D5991C522D038B8182D829D519B38F24BA0B8C64F0F3792A22FDFFFFFFFFFFFFFF73FA2310C18DF335237F20DD6C8AD4BF8872130DAF5BC70DEC61916DF040070000000000000000000000000000000000000000000000AAB0A3370626B7F6C8116FE2C42D281F7A508B8E19DA6D1C654239E09AE80C0000000000000000000000000000000000000000000000BDFAE0DEC1DAF3EF1691CCE02CF14D7F3D50C00A9F3492F7E5EA479CA7CD171070471D5C67FE5EB0FD947FA9FF6A9A558A67BB4DE65ED17F7236E798689F9408C5F5FC2FB3B7C2B85B1DDCC444F5B040C500E3EBFE1E9B28F6BE843AB028A404F1C218B822DEFB02ECB6BD617360710327C95F2E0A518249FE517BB3954D6629FC7CD2C84BEC84071057907C133C9D0C60C475D4E702A2897A591266F471A81BAEB54942E9E35BEBD28A8066A2AAEE68BE5C4852425278A28D5B5E2080A8F8269CD8AF3376CD94CE1FB48EFE3A1EE626C804D3DAFCE997A3AD26413C2C09A202589B57F7178A9BB6E850BE5EE4FE434312CA82A8D042F05EC087B09D51FE14033479F5FBB15C552C7662E92DA78A392A7C1BE0DCD79551B6112201195A321C0AF35B930765F22DA52FCEEBE64CA61E465CBEADBAA00EE3607B521AA114BF7F2A2EEB4B29849E7FB5412BD4C0E7ED37E6AB0C529592B701C086D0B37E328E8C1241355354A574E179051DB2311C21E70CF52863D36B606C50DC514E7F44BB800BEDEF5BECB35BF5870409F91A8873F019F664ADC81BA4AD4AF08B2417A98A872CD4D4D68D2AA3C13A00158BA4B03D56AE13816C92A7C7AD64E965293E71E85120 -smlen = 672 -sm = 066995AA5866E0AB4505A7AA95232C6EC0361303FB1B13FD4692B8B0C905223720179AB1065CEE04D3F3E9A0C2DEBEC68005FCF7F572A7FDAF343200111649A71184C322A104EF24D7E6DFDF59312D02432A12D6B7C003455201120D922E3D5819C41A0059120689A992EAEAB106E1E63298B0319B4B7B070A1BD1B681FCBB0FE70659497DDC5F0136C93D060001A94AA0B76F384E649FEA9F1D1DB0E70501180AFBF94BBFA93E6F01B06948E4A81279008CB18850E27D8416B88A9A71F4A66BDF447814DB6C82098C371B53F61600EF5DFD88E4FB34200207C3F6F55166AF4878D38FCA7E2DC18FE662E3EA491B58A86246CAE16090FB7ADA53B9A67B3D0E3787D3323EA921274C60CFFB19A889BCF0300FE10E242AAE025F374DD83FBE9D007C8B9D9D75574C74146331DDEC6F0E49C10DBAF15654897E33E2B4780DBA484224AA6FAC79015D5792FAA2D532BB7D239B11D91420B98690B1FBDE9632223927E0804BFB284368A426C414C3DB8EA82F0D246413861475ED2DCA9E80FB4F3C34FEF7528069AE1975AFC52AC5AD2CDBCA1459E140F655556093210D7905A1A1E6CEEAEF0194A0B2EAB2C1EE853484E715D2A1DB551FDC620D5331164C74CA4848B61D408D2F2A943FA09EFEB63D524691C99DCC0B22CC61B98E6FB8039E5E0B2D7DE2CAAA900A44184BD56C9F02141A3AE8AFC661E3E898ECD3004FDB0704272BA780CD5DE35153B6FE223843024273642DCF8E4B58BE2AB1F61668680084AA0B75A32E766C8AE5EB30D4E02A12E6798DEA40F80D8DDFAD2041A52922701C689F46F49F84CFC05ECA6D7D4C356D50B6A0BA61966245D45134D6A1F5197540A1C39C36BB0B78831AF3F5156E669FD9213B64E0CF1C5A31E88AE79AD61757EC67B551B9F0A760F646BF81F6B92403A62840CC29FA4F3949B3A9F0A9A4286EE7808A - -count = 15 -seed = 9887F1FD854241A301EE0120645CD8E119B43F7BEE11F77A835E9ADF518C3A51CB76D86653FBE73AA716264C146797EE -mlen = 528 -msg = 9B64813C058F07A09A796FD764604EAF58CE144363702896DF0AB5FF26D5DE000D14BB8FD358FF5532D3B909AB62C18AC30F1900F84EBD3F4F18BD532D16C7B3470F0F8BDF72938C916DB18BCF1429DC1635B1C152C5F89A9EDB17116C11815A6C06273A889132923DA908FF39F4940A840D3CB575DC4D637AAFD37968EC61FC4EA04B4C320491A73ECFBDD8E10F1DFE902FCCEF93DD287ED872F67146BB8CA5A6ADCF0350E8BBA7F2F9762C4AA748FCE19748EB17334146C152FD63FAE3DFBB1A2C2B3C78960369551FDAC5D54643BEEAA59C1FEB0C21DBBB19977D848CD82A7AE0005F45956E0FE4700F14FBAA0C12FB8C65A6AEC95C5A5C8E79A6DA9C4E446872575C06AE49A31B82245E1757C7CE84D6D5DF3F642D3434B7E1A15A8B8A9DB460826B6CDCA69022DBF87595B582DDBB90A81E09A13C2AB1C125E4435FF30ABC9C56A00EDFA979F79D9C895E800D2DD6372FAE5FAACD83ADF8A6D55279D52DF547E9BAB39D99076AD7D297371344D35BD584E0FB5932F92FD5183B9250CD180FC645BEF6028C405B0EF35DAF783428173F1F2482AA1363640F66AF0FE8ECACC0DAB84ABD2A1FB53AF44445698CF1DDF4C2EA214DD339BE004E75BF76E95CA5C16981ABA5540689C1C1F1DAF4D0F89D62CCB3496340D61E7D5F5156FD3EDD02EDFEC8FCDD0B231697B0E66F4A3AAF46117532F5EE2CB4D2B3B82B0BEAE0A45A482CE9A976CC99AA82BEB0FE08CB68C4 -pk = 7A701B7A7920BE50188CE451DE75CE1C02DA3F11D48139AF7B010A8F5FB7EB0069AD072C0C7A4E064504AD311C57E657D2B7D74FB63BE485FAE40B8E046E8127 -sk = 7A701B7A7920BE50188CE451DE75CE1C02DA3F11D48139AF7B010A8F5FB7EB0069AD072C0C7A4E064504AD311C57E657D2B7D74FB63BE485FAE40B8E046E812702000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068D773CEC81C0CFBE64B1032EB967FF34C0647BE894F3446E4978F94C662FCCF38FAA63FECD39806E79C8A2B7B9903000000000000006BB10BFC4B5FE333DDB9DCE367B33D69C2088151D55B39D8B5433DFB9B935091BECB0613EBEF56CD7830A1E64F9CFDFFFFFFFFFFFFFFCB72A38580343763685440417FABE28368518D397C8A3D63E1D2EB783652FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC07AB8B624574046823BB9D8139D72A81EB713C52A98FF181D6ED1ECA77E0D0000000000000000000000000000000000000000000000169B09A96B6A50089800E35E5F582B08B04E796F5D9E3F53D67299DCDBE46C2336842E5DA22A63A63369439171FB7D28E353BB37C63260DC3D487E322264441AC31B7A7C1C977DF0813551549C02D4CF5B3516A8807109041C2B5979D8A70F133D28C81A5F7ED2352529BB0FC48470BA9A19FA60CA121884A95E283263093D019CB0708E5CC5873B56B171030B899C625AE5A33AC67B8D253FC8F203CF056D02647E5366734F2E13028876E45B47606B40134F71D9FF7BC0362DDDE4D60BDB1B7E1CF943E3388490D7478EB0FAD251263F9D2A65B3BCEE961D1C64E96037D60C372CA13872070DF8D6437B0159F0EA270E3250D794E027E6A07870BF590D9713F79C5642D2F52EA9263287DCE77B164DDF0BA19B1DAC04CD415062203D24C72E5B43C056E3144214DE986051D98FDDF0683E0D8EB97720B3ED1D5772B948CD2DFB0D4462A355588645B4B543A5ADB419CE2011C4AD511CC545B203BD95842B1A7E81C1F2DC461C912BEDDB39B085B08ACD77B83B540DB2F06975A22C71753D1AE5F0824EF8E95F4D6CC98E42F8F0386EC92F208DC0338FC59E041CE81B2959064909169B1502964A11CA95F286EDDE2EA19D5859DB7B4F721A5013B1C8374B16 -smlen = 705 -sm = 88C5A38A16C1744BB800AFAC617593A057CB1E0327EF0D3B9168C249590203FA21487C049DFCD102D5B581EA7B1ECB8C890540D4CD5BCD5CACE5CD0652B563BA11B9B86DE504683C1D91226D13385707EB106500B47DA7E30506B1B546150C037294190602EE52D3A4352F55130788CA732C135DAFED1B024066F65BC280D5271400F1EA6124567874AEA40100798C2A988F4C6979ECE36CFC6177E27B0200DAF589C67A216C6A6000FB113B2F6FF345019B64813C058F07A09A796FD764604EAF58CE144363702896DF0AB5FF26D5DE000D14BB8FD358FF5532D3B909AB62C18AC30F1900F84EBD3F4F18BD532D16C7B3470F0F8BDF72938C916DB18BCF1429DC1635B1C152C5F89A9EDB17116C11815A6C06273A889132923DA908FF39F4940A840D3CB575DC4D637AAFD37968EC61FC4EA04B4C320491A73ECFBDD8E10F1DFE902FCCEF93DD287ED872F67146BB8CA5A6ADCF0350E8BBA7F2F9762C4AA748FCE19748EB17334146C152FD63FAE3DFBB1A2C2B3C78960369551FDAC5D54643BEEAA59C1FEB0C21DBBB19977D848CD82A7AE0005F45956E0FE4700F14FBAA0C12FB8C65A6AEC95C5A5C8E79A6DA9C4E446872575C06AE49A31B82245E1757C7CE84D6D5DF3F642D3434B7E1A15A8B8A9DB460826B6CDCA69022DBF87595B582DDBB90A81E09A13C2AB1C125E4435FF30ABC9C56A00EDFA979F79D9C895E800D2DD6372FAE5FAACD83ADF8A6D55279D52DF547E9BAB39D99076AD7D297371344D35BD584E0FB5932F92FD5183B9250CD180FC645BEF6028C405B0EF35DAF783428173F1F2482AA1363640F66AF0FE8ECACC0DAB84ABD2A1FB53AF44445698CF1DDF4C2EA214DD339BE004E75BF76E95CA5C16981ABA5540689C1C1F1DAF4D0F89D62CCB3496340D61E7D5F5156FD3EDD02EDFEC8FCDD0B231697B0E66F4A3AAF46117532F5EE2CB4D2B3B82B0BEAE0A45A482CE9A976CC99AA82BEB0FE08CB68C4 - -count = 16 -seed = 5B485527C3B9A5E5B7579950049CD357975D4BCFEF83FE33C087ACBFCC10A0BE4225E7F8A5F77203B5FC7C0B5FC0E78B -mlen = 561 -msg = 922320F7439E492F13C272A5738FF7122DD7A6B2832632E1F7A653FEF3B8639BCB9E84F482F22A948EA17DDE6958489593D2CB268BB52DF8ED612F2317BD6847D1622CF0532CB499ADC432233B93B6F7B1866B38975AC87859AC49F91E8D235846775F9E6E6D052339C741EF6178016EDB3D0B1E3F3536667B3EA2D489F88D254B8582421A31461374F465D7AD62E896BE0857134707A70477FABC09FE0A5CC3B3F32911F5FF3806B878205525AF69007F50535DF05C33AF3B0D00E297AC7EAA012E1D863DD5DD5FA47FB09467DBAD8BC42EDBAB42A9625BFDB9FE578343297506A3B71CDC8D5919955AF4605FCB0C7164D96A187AFF65D0F6210FEF2D11BA08D90C4458542BE72E084577BE9E451B8B6F4909884BCC5D25316ADCCD0925664D4D91C2E56433C1B68C632B0CA56D856DF1EDD5E113D1F026B30DAC4FD648A504F8F6809C701C97BCAC2B99286CEF5C1C923200B1BF6141EE1CFC51C5E14554BC02D7E058970254D2C02948360ABC4DFB439E66946A8AD615147BD8A6CB0886211E8B15DFF3C72B6F8908CE56BBC1B40E838103202E9F188D98E07555DB61778F895F76FBD838B6D14209D28EB393668924AC0E61072CBD9F93B864904FF4302DCEA131B2CA16BB04959ACEE096B1963CE07F59AB505FCC8D89FE08FC58751965F2F5CA753D76D58705652D3B1505E0F720EDE3142DE9776FFE4AA0C8A25E76C7A04843377C59F1002844E89189E22F621467B813A98BF07540A1649264F14A6844D65692617F7A4D93FA9A23829E256626 -pk = 39A93626ED82550288FEF226B179AF5C16F00CA5EF0A528CB1750C18B80122316D1E7E2A7CC157E98141B72D386295F2F29676E77C75A19049278DEBAE9B2334 -sk = 39A93626ED82550288FEF226B179AF5C16F00CA5EF0A528CB1750C18B80122316D1E7E2A7CC157E98141B72D386295F2F29676E77C75A19049278DEBAE9B23340200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008DFDE57016DEDBF4BAC2EAAF61B2B3EC00473260CECF2665988231180FFD5F61AD8767FC4C7109DB0508897501040400000000000000A05B3BEE0B93C0D00164E44F83E573E87990F0C1E33267082FC6F3778AFD4B3DE743F464B7088C7924043B03468BFAFFFFFFFFFFFFFFA8434F536571FBEA77DA7A3D0E9C75A6F4AA430B5F49AC01EFB46E0D1F8500000000000000000000000000000000000000000000000013D624B77B8B7084BEF2F1BA9133D82D88E3AC633F43C5ABA6E620BA7BE2080000000000000000000000000000000000000000000000D0FA8145506098C3BD1BF7BA8F26D42932ECF46082FFEC229C48FE4A07C91401FA36337B9F49C45135F3ED46B4836CE23F155CABA66F238A6970D64083FA511BF5F92A2B32E230ECFE7E7A373D8C5CD7EE527048176943206A652E3CC905C632ECFC28267E8BB7764CE310F7D1951250D992E3051F610B79BF595B05493EB90FB9555D1D8ABC4E0BB9C689D22380DDDD4152D53FE143CDABA6C99CAA618A0333DF9223975F3BBCC8C1FECCC1C245B8CBD6775D7ACBABD8FAFBDC0F8ADCF87E1858B77A1F5B355A8D2EB863E1379F1CE721A9D9A05FF5F71294741AB5BE141C2DCB87D8BB3B492B3DB343D5DDDAA1381B267DB41E1246E61E070CFD140D773903EFB84DCA2627D5400C73DF1C7D3D4CBD49197AA820F192EFFD7E38AE2D4C0C1A070AEBC800F8BA89EB7339715D23DEFAFCE3D1176E3D76CAD9FC3B954525F72A6DDCA9D30CB4FF518DAC878E34B671E874E117D139513FE151C31C167116E02179B7B15AD0F8437A82EB0CFBE3BA99D28E0608C2C52A8DFFCBBCF64028E4A129E5BA60148F69394D7B79B08300661652E0FA8F246EE654E411A02F40836382109D00DA02065389C14B1BC05A8CB41445F26FA0FCF1FFF479CE2EF15270EA702E -smlen = 738 -sm = 0E2C85AECE7C3A93CB0691CEEC20434C64125003D1DE9E9C11A906BD1D05BF5B77B96137E2379401941B33781F71B8B31F043A737330495A14F1990683E8A16F833670F2DC0361FEDC691E1FAD929300F5ED442333CB48B1FF03A6A6F3478A7E15700707BA4B06CDFF1A1AC07707D0991F28A2BD1BC43C00B5B6D74324C52FC5A80531A2B659ACEA796F0E060177CB183A81AF79C641762C29B2BE9E7C1002166F1D7967092CF5CD008C9A0573CEEB9000922320F7439E492F13C272A5738FF7122DD7A6B2832632E1F7A653FEF3B8639BCB9E84F482F22A948EA17DDE6958489593D2CB268BB52DF8ED612F2317BD6847D1622CF0532CB499ADC432233B93B6F7B1866B38975AC87859AC49F91E8D235846775F9E6E6D052339C741EF6178016EDB3D0B1E3F3536667B3EA2D489F88D254B8582421A31461374F465D7AD62E896BE0857134707A70477FABC09FE0A5CC3B3F32911F5FF3806B878205525AF69007F50535DF05C33AF3B0D00E297AC7EAA012E1D863DD5DD5FA47FB09467DBAD8BC42EDBAB42A9625BFDB9FE578343297506A3B71CDC8D5919955AF4605FCB0C7164D96A187AFF65D0F6210FEF2D11BA08D90C4458542BE72E084577BE9E451B8B6F4909884BCC5D25316ADCCD0925664D4D91C2E56433C1B68C632B0CA56D856DF1EDD5E113D1F026B30DAC4FD648A504F8F6809C701C97BCAC2B99286CEF5C1C923200B1BF6141EE1CFC51C5E14554BC02D7E058970254D2C02948360ABC4DFB439E66946A8AD615147BD8A6CB0886211E8B15DFF3C72B6F8908CE56BBC1B40E838103202E9F188D98E07555DB61778F895F76FBD838B6D14209D28EB393668924AC0E61072CBD9F93B864904FF4302DCEA131B2CA16BB04959ACEE096B1963CE07F59AB505FCC8D89FE08FC58751965F2F5CA753D76D58705652D3B1505E0F720EDE3142DE9776FFE4AA0C8A25E76C7A04843377C59F1002844E89189E22F621467B813A98BF07540A1649264F14A6844D65692617F7A4D93FA9A23829E256626 - -count = 17 -seed = 327CE565CFF6CD9A25EDD84F482FA0758B78CBC246567DAE98B818314AE28CD438E339043EB3FF16E1C2B4B104A717B8 -mlen = 594 -msg = 576289D10AB03D5699EAC322D349F55C547101E4424BFA43BBBA3747B79F075AE1153A7A0AC8BB51D24FC46B7604E42EFE4343FA34AA4EB16D918F25E8A4D67C860CCA3F7480E1221ED3AE13A138F079FC252C6D7BEBC55CB81B86E74F339614BEBCF7E8F4440DF8678B01A4A41B3AFB1D112FE1C4C8D8C6BFE9D3EE2A335D477C60FBF43B2E5FFFE1546F5172EF51CFFB2A772E1575EAC79B24D49FD77F0BE351233E57EE6DCC7E2E29994873ABD434D34ACE83400C026E27E27888EA0BDD1BDE5A3E55AA8B5F2FEB57B8B0A96CD831906297C8169D04F15843A3249C50523CF56A4E19492EA16927DBA8759B88A99E0D20820E51FC9B6A6863115CF05C5BC3F4C869EB5A87124DF5DB102D737F3899CFAA5FEA4DD62DC4FEDB1AAFF67906ADAF8968020EFA5B10190F70E5F2C0F0457E4341BD449201D3A80AEB791254EC1C46DDCEBC3896C6DF702509BA62CD446D275806438EB4C03132B2E6BD01BD2F832D1D3C053C48C5A9DB1C4A22B130C4C9E96A2BF4C2A8F7DE0217A52D9AA5AEEE5E6A49708237EAB60B4019A51390C3EF10572A73D436875BB8D7D78543F96376E4BF3BCAABB92F89215E8D1093F3B287945708B5514BD7E62654D3BDF34B29009C64829A0CBF33C54D7AB0E81B81BDDA93028B341AB1DFF3D752DC4A1E5F9636A5C46E137EA35919D99E6571C5370C6E804BD2E2ABF566F035D65CF8F97E3E8F2ECAFA153BC6D8EC2831667A37FC96D1C2DA40BA84D0FB041DEF32AADAEF3F98CAFA957F6552F79D28A36B8BA20A9452671DE1BE8AF5D66714232507EDB9FF657F3D7E5FA7320FC0359A5F99280D446283BC -pk = 77E092A063E34A9F3644ACCF8CFFFA9040E314CADEFFFEDA2D33E2B36EE01C2EBA7E71419C1CC19ECBA856B0994FB5342D7B52CA532983DFF76F19D9EEFF9701 -sk = 77E092A063E34A9F3644ACCF8CFFFA9040E314CADEFFFEDA2D33E2B36EE01C2EBA7E71419C1CC19ECBA856B0994FB5342D7B52CA532983DFF76F19D9EEFF9701020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EC89D937FFE33B12FAB08E7E79C20A504A0780C1FE6521E48D3E8483D74830020638BC39924207014C61BD11F6E603000000000000001FAF5B304F7C1F78C9EFE3F63D835D203BB02080F9D0BBAAB00B83F4AAFCEA3F227A43BE3900BF45398CF4577BB4FEFFFFFFFFFFFFFFA158B94D859FAB91A4978283693AB6C3F16D4A105C48C1B5499C5FA355A2FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC8968753F10A237658CC40C684C87356643EB6CCBA9AF872E5323B64B980A0000000000000000000000000000000000000000000000B8F44910A0970354C25FCFED9570657DEDB76EEE87F0A70DE86C8C42A163FE0855AD94BF1C82151648B0D0BB010D77D81BBC4A2F5287123127639CBFDC2C030C90C708E60393E9857370762AE117B79E519EC5575CEF4BB966773103F0517926F454AE71CE5471CEA00755154E6D89B2493A25EED1FF3FB9CEA174DFBB7C6F23B82EE8BB0A4229004ABDD09D0F25F85EAD3079BE6357BDDAE0F6102F04061F090328F2392A5FE1F660E90BAEEE6A9E731FF9ACA9E0596FF8892D079F4F4D140AFD8B70BB07C31A6811746DF55B65A08DF310D3AC2487668D4D836A95BAB4192574C3CEBFB02FDDF82F1391DBC7923F349DEE05C229346F2E3D4F2FE02527BC0616C2FF905664186A5F662DD49FBA4363097030A92DC469509E407A0A56CDBC07F128F4E7A3299F60BB67A02D2AD12F5F2C464045D4D2DBD6E2A9769C36B1152A357BA894EB73F74C74421DF29DA835ED8BCE325E4F27C40344D792C1B1D2F61DCF4D8300786D336F841EDB344D0A2EB9AF9A45C1EA09A44B5FDA4C63EEE9630463E86EA7264429634430239D481D5564FB4636C68F9897BBA9BD739D37C1FF0DF8701652A1AC8212513FC23D897392B9696C33D9D609EAACFE3920347DA6512C -smlen = 771 -sm = 6FD29100790E618832061A2927498062FCEEBA07BB12CE3D93CF09EFEA060A4169D965741A5BFC00DEC9FE2FC3F33A34FA01CB646982BF626BDA56061189A55372A99D8C16069E7B1FA0CB3A2B58AC05218539C8A3721C046001254C0C0492F1A7DCBF04A2DC2E083DBEC206D106D486438924A2B3D3AC073B5F498DBD4ECA673901A35682CF0E6BF2940602011DA5046A69048A6B5D99980DA7170A63020176CE9347F925FE35A306A1E215526ED11B01576289D10AB03D5699EAC322D349F55C547101E4424BFA43BBBA3747B79F075AE1153A7A0AC8BB51D24FC46B7604E42EFE4343FA34AA4EB16D918F25E8A4D67C860CCA3F7480E1221ED3AE13A138F079FC252C6D7BEBC55CB81B86E74F339614BEBCF7E8F4440DF8678B01A4A41B3AFB1D112FE1C4C8D8C6BFE9D3EE2A335D477C60FBF43B2E5FFFE1546F5172EF51CFFB2A772E1575EAC79B24D49FD77F0BE351233E57EE6DCC7E2E29994873ABD434D34ACE83400C026E27E27888EA0BDD1BDE5A3E55AA8B5F2FEB57B8B0A96CD831906297C8169D04F15843A3249C50523CF56A4E19492EA16927DBA8759B88A99E0D20820E51FC9B6A6863115CF05C5BC3F4C869EB5A87124DF5DB102D737F3899CFAA5FEA4DD62DC4FEDB1AAFF67906ADAF8968020EFA5B10190F70E5F2C0F0457E4341BD449201D3A80AEB791254EC1C46DDCEBC3896C6DF702509BA62CD446D275806438EB4C03132B2E6BD01BD2F832D1D3C053C48C5A9DB1C4A22B130C4C9E96A2BF4C2A8F7DE0217A52D9AA5AEEE5E6A49708237EAB60B4019A51390C3EF10572A73D436875BB8D7D78543F96376E4BF3BCAABB92F89215E8D1093F3B287945708B5514BD7E62654D3BDF34B29009C64829A0CBF33C54D7AB0E81B81BDDA93028B341AB1DFF3D752DC4A1E5F9636A5C46E137EA35919D99E6571C5370C6E804BD2E2ABF566F035D65CF8F97E3E8F2ECAFA153BC6D8EC2831667A37FC96D1C2DA40BA84D0FB041DEF32AADAEF3F98CAFA957F6552F79D28A36B8BA20A9452671DE1BE8AF5D66714232507EDB9FF657F3D7E5FA7320FC0359A5F99280D446283BC - -count = 18 -seed = 790FC03F956D1301A735504075B67A05944A762E0A4BDA77BB8C036C5CF911E2B561EC1CA6AA355D5CEC919AED42A1D2 -mlen = 627 -msg = 021E9C06A2E4EF63D1A61958620C40016783879080D44311E04F2A446BCAEE5A486D17FF0F356BA70FF1C2B55BF957A59202903AE349878CB822E04275E0AFAABC0803BB6CDE3741E0BF9FCE0C5D5C814977474533DC63F9ED4F32AC3477A3EC9893EF55186728C85B03F4C2E61CA7733E1706766AEB8FEA80E233E8761B57FD5A3CEF700196674B34A3A55F68B3368B688FB1DDC976FF48BA6A98E2D66023F291A3C617A56CCBDB8732B8C34369ED11F4CCEA8FC8F673AD9FA0FD8990BEF70AF44C617FDFA096695D0C94EA8E17554F4461DC776DB2F416448B17680FE4D29B09E57603D8EBF55771AF84D8D4B9097302901C25CB6D73932E67C323D12C8ACB0E74CB89755F7EB3999D4EAB5E1B775E6B5C29D9733697030A26F3B93B3F286DB0F2DBDA71E1F103878063E77919D8892EB6A34F821B603ED4A898A9F30D00FEEF20985FEF1A7B7AF70DD29C269E88687F005D551EF05EB0603FD38745AED4F5BF4C2FC09F0604C98AE3A89E46BBFE907B87A1672DE547D651F035F392A8D4DB5E7260F43953028E312B95B9F25FFF2C0C579218390411D13D9A25F22DE4C7AA05FD11781DB08977160D48E02372C7D826F5CAC37D1A9B4230BE99A2D13CC2E9B2B17F0A1044EB9E0A2FBA376D35CDD2BC05F57DCE4BBC3BF07A09BCDE369929E6250EFDC61689466B040AEA376B09453A2C16813BBB685B54A225C49008BA6811E8BB5B3627F8C281244FDF5533216D126ED0E64FDABEC533424BFF77FE722CC438CA7587C19D965F0BF085D8692C27C5C84A9DEE53256D978948D89ABDF9842E0B765BE6A507D8630CBC5CA7FA0FBCA1CECC78D2E536AA7B2B902C4379777AC0920D69C57CC4E6032252BDE99E1A555E80D4 -pk = 3C4F0922CDE5443842D3EE0E546F376B06FE93ABA177D3639F5EA346868A5D06450A9398ADC8D4B33AC8F61F224EFD7755B10D26431A2391DC8A49F498B18D1E -sk = 3C4F0922CDE5443842D3EE0E546F376B06FE93ABA177D3639F5EA346868A5D06450A9398ADC8D4B33AC8F61F224EFD7755B10D26431A2391DC8A49F498B18D1E0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005C3BE0244B076F80B79D83E22F002F6D9AE0A1752840888B1D568135AB5B299C1B1E65E16E24A7C9D4A4AB814726FFFFFFFFFFFFFFFFB57C26FAEB77FE0E7C52959F75F874E578D07CA933B95019AF907FC9D8F9D16C50BD394DA29410F212129FE020E5FBFFFFFFFFFFFFFF23F1393028C2307C95F18865D832D64AF99B0190EA959A63DDCE606426B7090000000000000000000000000000000000000000000000D8D4FB163A097010AE15DE62F547B159DFE5B33217B2E045BDB651F2979A06000000000000000000000000000000000000000000000034DE6B5CB57CBCE0C810A8E518EDF0C82E7898775528491DA81C4FE783070A01798294870C6978680FE41F3B3DA6AB643F642A59BFE702F82515201E55FF8025874A5EBB3F5D7133DBDDC980EB998F3B9780DDFDB2E3BB69D4207937B487E9181A7FB49F0798DD93206AC31E542E9F40AE2A7D3B28BAF1A7E6140C10CFEABA2C2CBC968879A8E6F55BA375AD83BC15CCEF727CB72E7052BCD003BE17C87BB40EEB4201E24670166AA2E2EB8736556BD2F2C255D6756E3FABAF40775AE531C312BBA12E9364FC15B32C93988B9549CDB3DBC583467CA675DF7AD124630CB3F4006D9119B986077F57025493F799CC17937251491F7430735B3E29A74E55584305D633D3F51D3441C50FAF3E7F859B965379F55DA391EDBA1E9EE7D59F113F4A2679A285D0C5B1464B4D6CBC81DEBB23E880E561CD2667D64A90BBB81258C47302B939A871A2EAC3EB92A808CE55D715E43F3E53F5B625DB0E643A39E9E3FA5D298BA57103B00EE5FCD8BEED95D7F4C75A8F89919C991BCB35FD17018E962D551C580252E2D856656E91332628B0D77D7E5C1CB7E99B7F94F321BB63E8C4F4F81AE1C81DDB34B52AA2AAC03E56C85ADC3563429D99005DA5166F373E4B32DAC033 -smlen = 804 -sm = 2BD5985AD72134D09C04EBCBA4FE4A6D6EA60305D3467287CCC8B59E8405C3E77D733629E7036807D7FD9C31D96E11C7D606A64898FCB0D9A8D74102151DFA7D8621321BDD07D7CC8A3A2E0F1E9E47025369CC4906C5E685FD073957B66039ED86F38A054BE81E696ED0FDC54105A9BF7454B04A3C9774062FF76FF9405478EBBA0787A253EAAC2867F2C4000147157F93BC49071044CA62A417E95B3200003A4E64E811D429A276009338671244CCD801021E9C06A2E4EF63D1A61958620C40016783879080D44311E04F2A446BCAEE5A486D17FF0F356BA70FF1C2B55BF957A59202903AE349878CB822E04275E0AFAABC0803BB6CDE3741E0BF9FCE0C5D5C814977474533DC63F9ED4F32AC3477A3EC9893EF55186728C85B03F4C2E61CA7733E1706766AEB8FEA80E233E8761B57FD5A3CEF700196674B34A3A55F68B3368B688FB1DDC976FF48BA6A98E2D66023F291A3C617A56CCBDB8732B8C34369ED11F4CCEA8FC8F673AD9FA0FD8990BEF70AF44C617FDFA096695D0C94EA8E17554F4461DC776DB2F416448B17680FE4D29B09E57603D8EBF55771AF84D8D4B9097302901C25CB6D73932E67C323D12C8ACB0E74CB89755F7EB3999D4EAB5E1B775E6B5C29D9733697030A26F3B93B3F286DB0F2DBDA71E1F103878063E77919D8892EB6A34F821B603ED4A898A9F30D00FEEF20985FEF1A7B7AF70DD29C269E88687F005D551EF05EB0603FD38745AED4F5BF4C2FC09F0604C98AE3A89E46BBFE907B87A1672DE547D651F035F392A8D4DB5E7260F43953028E312B95B9F25FFF2C0C579218390411D13D9A25F22DE4C7AA05FD11781DB08977160D48E02372C7D826F5CAC37D1A9B4230BE99A2D13CC2E9B2B17F0A1044EB9E0A2FBA376D35CDD2BC05F57DCE4BBC3BF07A09BCDE369929E6250EFDC61689466B040AEA376B09453A2C16813BBB685B54A225C49008BA6811E8BB5B3627F8C281244FDF5533216D126ED0E64FDABEC533424BFF77FE722CC438CA7587C19D965F0BF085D8692C27C5C84A9DEE53256D978948D89ABDF9842E0B765BE6A507D8630CBC5CA7FA0FBCA1CECC78D2E536AA7B2B902C4379777AC0920D69C57CC4E6032252BDE99E1A555E80D4 - -count = 19 -seed = 716354F7DEAE272CD26929C0932CA257AED1DD23D67260726B5213D82E61466FA99BB6A7D81DEE9D0EBE03DEEE4DBFC7 -mlen = 660 -msg = 7BEDAFEBABBBFB863CE496475F54E69A905AFA45899C3D7C16CFC73E31597D2404AE7014612E4CBFA238EFAF5B396B0B7435ADA5DE817E013188C280423C68924E1FA2A33CA56E6B85B7CCA7F00D3A6151F0629C1B92A13573320E0025863BBA7F3EEB987EE1B1A6230B10765DFC1FEEA498AE4B83521188E7503B506259103CEFB370E3651B06DD4F08013FF3AB9E2430626B0BD584232948462D85C0F82DA07B96FC65F62A43CD2F132D1A1D691C085980DAD8796CCE2FA0B268395EAC3DA2CC400F30F75BE87316216980CE213B48651DDB9E294F8CDB2CA05D3F2A507E4A03E2849AA8062918AFB5BCE9E4C3ABF2FFD4751DDDCF08AB09E36A29B830F3BAC6FEEBEA084575472E6F4B239AF89965A72954769A83E391DE467934237B07D8884A6B14CAD034FBF9BD7531D50D742E234E227E1A2DAF77A2FFACC579525134B15186D81AE6E5538871024BD2897475D6EE5B11BC51EDBB928D98475073785A75B331BF3D2297165AE6CF95C3A05F06DF747498462054F58A5AC736F96014B1A8CDB319D030D06DAD9CAB2B913F35FC392E1FC4B027CDBE775D64B04F1076A7C8F44C360745F98E87B84C18AB76F84F373F635AF4C8A87DF08DD4507899BAD892FF8CC1EE534D3277B5B82095628B84A7D5582149CF46C50AA963B56B4B91966B106B4B2EAA45D83A10993E8F933370AB29C6606B7CCFC41B21C6B99F2B9AC643E24300B350FA199EC10E64E4AF19181F78E8C43B2FA796241DC42CC8992BDFCDC39E7BC41BE68CDCE4FBC47C996DB42E8249EEDC146C216B514430C705FC939B9EEF677AD87F9CEE3398551FA0DAF774302324A410F4A4F4FC035CFBE960B38C390441E92D9E5624A8745976BC88FA538E398712361B77AD4CA5FF038D9F6CE157EB8A6137420D4E57018275DCEEBC4E480A5D -pk = AF96783909E1409902D38B8BD134BEB3B9E89728957970F53B945B6310B47617811D2A1DC4DD2FC425D7E4EB1BAEE96B1676D5431E8343CB0CA42978D3195109 -sk = AF96783909E1409902D38B8BD134BEB3B9E89728957970F53B945B6310B47617811D2A1DC4DD2FC425D7E4EB1BAEE96B1676D5431E8343CB0CA42978D3195109020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C5ED1C3EB84F8CE8DDEF1191A2AC02A82DC76F0A56AB58759C7E76488DDCF62560F9C4D60CBE40EE7D73E1636C16000000000000000042AA7D69DABD19E0CBD860302ACB0D97DD8AF36ECF29A45D98947E53F4C34C043498C62D59A33FC16566790C1ED1FEFFFFFFFFFFFFFFE24373B42DC827CDEBDEC8A84F4E4EA98A84E92199DB17BB59994617F215FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85F9A342FD2C14F77342CF55AB5B23484734C846BFCCDAFB99E9432151440B0000000000000000000000000000000000000000000000355A3949527A67127F0DC8156AA924ABCF59C9A1470894EB05291379FD665A12C9A8DF842B40BC29610F8FED0B2C88BA498F37408743BD97381EA7530F735C08A007953E6B183A2CCBACA120AF21E367C458DF737A04F31C4A204E0BA949EA0BD1438AA71D2A95A5737668EDDFA61A1A7BB30176CB68D36AEC214260E4E8281D02C0716D54CC341776A82ED8DFFBDEC12AE16160E3A30357A7C5B231508FB3023E372F10C20B628350850600BF570FCC1704DC4686B50BA3626255C430B4E82B979557E18490E50A4C5BF48C748E7939FC17CE1728A2275F101607D07A709208F8CC3E5A0829D5384E9F9C84DABA4185DD6CA4A874D7458D5AA33F78BA01EF0E6156790E517A3BC259BFF2C75B79C733F142AEC81A0BCD18271AA6D0B33E982F075A0975CB1ABABAF9F75F474BA65C3F9B7DEAA0D18E63D3B6D1BF1D9E8A45138D4F1B61EBA5E896D769E1F2D3D71AF8ABAC3A766367DAD96F9386A81596DB19C130EE5AC5D9F3501C10D3C87BCDD843830C19CF887BD273EAE3C7B3EE7AAA273D36D27CB4B5483CB02C3EA83E7E42B9F4DCAA52866801C946AC20C119A1801413B781F018E59BBAA23E152DB29C158D6DD569CF893F3F5C3EF10B50A897A130 -smlen = 837 -sm = F26128916BA30BBC0004024C4F32201854E03F0697CAB1DCDE7261C607045803754BF9BD4FD14A05CDD6F3718AF7ECB5E70076B052D34E68B638E3051F6F3DF4ECBDAA4F4F06434DC0E6E63DCE7A7700377A21FC36F49091CC011D94BD455B2D204D8805C8F03572B0DF85780A069410A5B1316B6A10A600E8C7363BBDFCF5915F039BF3D776B143D2EE830000AD9A715C227A57004354DB57C0EB6F0A0103E8DF29D9AF7606199101EE9602B2883301017BEDAFEBABBBFB863CE496475F54E69A905AFA45899C3D7C16CFC73E31597D2404AE7014612E4CBFA238EFAF5B396B0B7435ADA5DE817E013188C280423C68924E1FA2A33CA56E6B85B7CCA7F00D3A6151F0629C1B92A13573320E0025863BBA7F3EEB987EE1B1A6230B10765DFC1FEEA498AE4B83521188E7503B506259103CEFB370E3651B06DD4F08013FF3AB9E2430626B0BD584232948462D85C0F82DA07B96FC65F62A43CD2F132D1A1D691C085980DAD8796CCE2FA0B268395EAC3DA2CC400F30F75BE87316216980CE213B48651DDB9E294F8CDB2CA05D3F2A507E4A03E2849AA8062918AFB5BCE9E4C3ABF2FFD4751DDDCF08AB09E36A29B830F3BAC6FEEBEA084575472E6F4B239AF89965A72954769A83E391DE467934237B07D8884A6B14CAD034FBF9BD7531D50D742E234E227E1A2DAF77A2FFACC579525134B15186D81AE6E5538871024BD2897475D6EE5B11BC51EDBB928D98475073785A75B331BF3D2297165AE6CF95C3A05F06DF747498462054F58A5AC736F96014B1A8CDB319D030D06DAD9CAB2B913F35FC392E1FC4B027CDBE775D64B04F1076A7C8F44C360745F98E87B84C18AB76F84F373F635AF4C8A87DF08DD4507899BAD892FF8CC1EE534D3277B5B82095628B84A7D5582149CF46C50AA963B56B4B91966B106B4B2EAA45D83A10993E8F933370AB29C6606B7CCFC41B21C6B99F2B9AC643E24300B350FA199EC10E64E4AF19181F78E8C43B2FA796241DC42CC8992BDFCDC39E7BC41BE68CDCE4FBC47C996DB42E8249EEDC146C216B514430C705FC939B9EEF677AD87F9CEE3398551FA0DAF774302324A410F4A4F4FC035CFBE960B38C390441E92D9E5624A8745976BC88FA538E398712361B77AD4CA5FF038D9F6CE157EB8A6137420D4E57018275DCEEBC4E480A5D - -count = 20 -seed = A32E6FF879EC8866A5F5E4F6318DA8FE6743812ED2CF5FB94F5C3AA3EDF953CBC32665810B71B2CFEBF343A571CBC570 -mlen = 693 -msg = A86EE95388DF139F9C5A84108D1E63F7A7842909B818E9A0425C257649ABF125386FB5286031E7E6D0EEB85C452E254DA39BBDA51F0D2167EC0A51992753DDFA76874AA80804E705CF8BBADF3B82B6D7FBA3D1CAD130ABCC0B44D6D893356F3E94BF8E82AC532EF8C5E5F4200207BCF6B754F14E57A889FFB753F516EF8DE2A647FAD8E449264F0BBB4CF48BD01501736DA49509C3426A3D4108B98E6A4AA6C4430E8EE76540051FBD1DFBFC01750E26547F8718EF7D897A0342BB000FB99AA63B781C9A4B831DA798C014E58725E03D2F8B1A029C3337F4099239244AA320965B2CB5075052D901B6077A18C1ECFA5F272850A475B5F6BBC83F3C09A27072F80743B23EC6A9870913EE2805B4D296B2F81A9D733E5C8D5C0B477E51F9328AF3AF8ABED960408AFECD27FBDD08FEF50F4B07959646E0A02104A69674294A79DE0B25B65F4DBFA797E5FA56D66E8BC07D5E2E7C7D2E845699ACEA3BFAC60B2C0B988CBAB949A5B598D8E2F1AEC66196E115AD7F237A1C7FCFB95A1BBD6939A250E7BB0F4A02C23CB1BD81090CB770E3A70CB081D121BD0BD5ED1DC06D61282B98BF2DD7B13D2C6CF833891C67951D7D0F429EBDE3F1DA943ADB8AD285E6F13F798D6CD9A0A06BCD6125EBAA48F8F3BD5100A122F617817E3C42EBC3C3B154258FA26B9FD886EBFAD42DEDC6A2C4F9986BAD88A2A79D7EE603554E9CFC5FE33A3A171CF7BA94FD43228019B2F6FF96A8ABBC58D2098AD95A95442F6858EB69E131D7BCADAD81B9BB69D7682A978279B631E22927DECFFBEFBE8FB2E51D46A3FCA66225D30451CEF9953EF94F30B99F2B26EA75B84935EA4FB257DBE5734454B8087B3A4E115C6D31E72709303E9F0BB8C86FC6B11B93B53F9781BB92851A5CB5DC00D0B4E15683DBE4EDBE986966FE1F711F24DE9A0E1BEAEA8E835C70CDDC589773D31191B74AF780EB69867829ABED6D3FFA94D577 -pk = E8CC75C89663914D7A2CD8F89618D8E0C63E6D44B30942C811449E0D2A507A2C4B2C247AA2CE94282198AA6ADFFFCBE57FC3C02F0D01D8C4D251FF65A6B3E82A -sk = E8CC75C89663914D7A2CD8F89618D8E0C63E6D44B30942C811449E0D2A507A2C4B2C247AA2CE94282198AA6ADFFFCBE57FC3C02F0D01D8C4D251FF65A6B3E82A02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084004C20D552D676991942E569D1065B2B0EC2F117D3F56DFDA09605CF3BEA5C369DF1776215BA8D663D5EF4C4E70000000000000000958C53F10935B228FF789D312CB436069C80E412F9AF888E2F20D036B03E0F4B2BC99EC1E9818FACB64A99309E0DFEFFFFFFFFFFFFFF238D85A00FE1562606BE829A3DBA120B4D6E87098801EFD18520BC28635DF1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF007EE998B8E37B96CDDABCDC4A5FEF2F13BF084F9BED73143A52DA291D22050000000000000000000000000000000000000000000000922184C4213422E17E2F4CDC00F6C3591A3658B0353B4A92C2E685195B5AFB1CA1B669CCA0C1BF001F2299DC1C2CDAB4FF7EC74C179825208A2CEA4D1174DC30B2FBA4F3D000F80FB8B3460CE70E60BDEF3F477FC08D71E4814E36413DD8010C6E5DC7D13576D61880A1551DCE9E8B17E777844440639A79E9F967189D5E2023A83350071A3212A20CA22D3C52D5F24FE9F781890BE23F89E0CDC41C95815003ADA92500F1958610FEFC042E8D11D579C650C874C99366541D49BAA8F8918F2FC6CF65B348A8EB6C388A7CE3A2B7C899FB6985F0E13E174E187E9B050CBA2F0A5673C11CEAAB9CCED6A0D0A74879D6EDA08F496A95FD4FA24F59B62265A6D926A3F4580F9ECB5B59F12E0237A3B759283EC9E1F0320A6AA99C7D09DC5E17BD13DA61A968E09BB7CB2FF142E1BA64A96AA152331767390DAA3F57223463FC590F406DA903E88D9AD41F3C235D75EA63F3378E74D1A12829EBDADC0E4EB7388F059EC03AA6E39B7C37B09D19FCC36FDF3A7127D8CD1093C6DFA4287E0BE25C3A0BDBE5230DA53D6E99A2DCD6C22546188B0C7BAC8075CA4C9A4C63FC8E9BD0BD2BA49477F23AF56E68A3D08147146200B8B6157C1E3622524246FBB34C8E273005 -smlen = 870 -sm = F89924CD46AD23C2080589003A4E28F3A6E79105DB9A086721D2DE4C550035479644333A235F8A02208F86B7D5B0EC9AC3008F6B43437D29327B4305B859879C823569D3090231EDFBE881132AD164053C45F761B4BF3DB56E070122544AC2CEFD6A09011089195B551FE2302E07D0545AD9878FE839B5013D16E6A4503EB36A620060A5A2C919944BA9B603008155389B8E880E17FB5FF63F183E6C650D02CC6FD44E48EEB07DBF07277C85D0952E8500A86EE95388DF139F9C5A84108D1E63F7A7842909B818E9A0425C257649ABF125386FB5286031E7E6D0EEB85C452E254DA39BBDA51F0D2167EC0A51992753DDFA76874AA80804E705CF8BBADF3B82B6D7FBA3D1CAD130ABCC0B44D6D893356F3E94BF8E82AC532EF8C5E5F4200207BCF6B754F14E57A889FFB753F516EF8DE2A647FAD8E449264F0BBB4CF48BD01501736DA49509C3426A3D4108B98E6A4AA6C4430E8EE76540051FBD1DFBFC01750E26547F8718EF7D897A0342BB000FB99AA63B781C9A4B831DA798C014E58725E03D2F8B1A029C3337F4099239244AA320965B2CB5075052D901B6077A18C1ECFA5F272850A475B5F6BBC83F3C09A27072F80743B23EC6A9870913EE2805B4D296B2F81A9D733E5C8D5C0B477E51F9328AF3AF8ABED960408AFECD27FBDD08FEF50F4B07959646E0A02104A69674294A79DE0B25B65F4DBFA797E5FA56D66E8BC07D5E2E7C7D2E845699ACEA3BFAC60B2C0B988CBAB949A5B598D8E2F1AEC66196E115AD7F237A1C7FCFB95A1BBD6939A250E7BB0F4A02C23CB1BD81090CB770E3A70CB081D121BD0BD5ED1DC06D61282B98BF2DD7B13D2C6CF833891C67951D7D0F429EBDE3F1DA943ADB8AD285E6F13F798D6CD9A0A06BCD6125EBAA48F8F3BD5100A122F617817E3C42EBC3C3B154258FA26B9FD886EBFAD42DEDC6A2C4F9986BAD88A2A79D7EE603554E9CFC5FE33A3A171CF7BA94FD43228019B2F6FF96A8ABBC58D2098AD95A95442F6858EB69E131D7BCADAD81B9BB69D7682A978279B631E22927DECFFBEFBE8FB2E51D46A3FCA66225D30451CEF9953EF94F30B99F2B26EA75B84935EA4FB257DBE5734454B8087B3A4E115C6D31E72709303E9F0BB8C86FC6B11B93B53F9781BB92851A5CB5DC00D0B4E15683DBE4EDBE986966FE1F711F24DE9A0E1BEAEA8E835C70CDDC589773D31191B74AF780EB69867829ABED6D3FFA94D577 - -count = 21 -seed = 5A64401EF8E63AEE18E8CC0162845DC7AF388230E86728ECB330007F2546F949764273EA05B397FE71F567E1527FA445 -mlen = 726 -msg = F5ABE373CE1F6FB14F2014F5BC0071B17AB2C84E8845FCBF4B15C79FBF2E5E06CFFE6CAD9A283014A975F81C9216B261CBC79EDCD58D0E20C586D7C641E0EE97221BEFE54DBCC56A594DF103EC24B52DDBB6052D1644972640F39DEB98997FEE7A252A65070798B7E46707FA440375B1BA705B3ECC7EAC56D9C45297E585299C7D747B430F0D01E82081C70B4A87846F90267D5163181DED63E089A00AFD33B0E2B3ACE91182D8CC899223CE65A5D84B86BB3E8B34B13949BC800F2145468BA5411EACD6A6C331C340D4442D28EFA0DA959A2797C7181BD4BBE6E6DFFD134CEF373ECB0EC08590F06BE0CE292D3718E2C0EFC7CB40F1DB26F5F38FDC82A72F81AFBBC16591EE02DC818D63CAE69FF0A28F942F7E07F6B0A741F3F0EBE3D0EA5859024AA408462D3D268C23F95D717C0A685A4CA73AD90EE923DB57CD6CDD828B7AB0D4AFA6A9AD7E32D407A44D7515C0A6AF52A66AD72119BA1DAEC6514DE3F8B462EC473072226AAD61135B0F5EC646BA9A127C9894E51FDD1B2D38011A2A6D7497A55283133695D0AF9B3FF7C5A8FD667231F9E511E3B8C4C3ADC44D02DE08C47B2382DE67B32826754C6BE5231CE0FC657341E20247CC6CE574F3D1A9376AC8237B49E5030E877A4E33CDE25D838EAD659EB1678706C759707FC66CE84CC968A8334C18F1632348824A6985A0331A93B59497B70C1A03A6848F18F5992972BC79F07F4222D2612797F495463836AE6CD3858D5B9BDF744A1CF361B5D454D41AC899A4FA61081B937CBABBF0FFEC1B31C162224EA36CA2CD7FCE54EC1A504932ACC5BD0B17A156DA7488F7017E4916A687FDE7FCEBB2901813B07964084AB0447A94DAC3A0D3FDA05B9F497CC1555A8C74838E29CB8CE89D304DEBE419D26BA7F3DC6E9526BD895495A5FF1D7EC83F70D045E306E7C2487A52CD7553F062D31888EF7FD27F667FCFFA984AFE0B9A4C4E85CA943812CDC157C5486B0B5EA6DA05E4BB8697113190321A976D1806DA129101E60A28B7 -pk = D0A42AB3EDF8452B043EFD136121219ED014CBD1FD8B78EF90FB4932B2CFC31776A57BA5BF994E176F72BF61D56F30B861D70AB122B84413523762769C334E08 -sk = D0A42AB3EDF8452B043EFD136121219ED014CBD1FD8B78EF90FB4932B2CFC31776A57BA5BF994E176F72BF61D56F30B861D70AB122B84413523762769C334E08020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B21F70F76666AAD732C840648FEF618669C0DA25881161BD3BCF6D3CC650E005456EBA4FBFE34BF8F65971288F120100000000000000B51A335A7F79DD39521A8B3B4E2F1C43731A70F27BDD7994E99B7FE0D0E1ED57021758D4C7BEB9684D0BF1A9DB3BFEFFFFFFFFFFFFFF65DBF2815845D67350963EB3B2AB9AA15A1D85C364AE48B4853473A09C34040000000000000000000000000000000000000000000000EAB4B0317D206FE071A0F1121F45AD277A717AE682BA3A2DDDE3087D8FFF0D0000000000000000000000000000000000000000000000F72968950212BCB3059B7FDAE720BB436FF8F9946E885545A5EC8728FCE86C27FED7C3FA3699CBA2B99808415F594500412EBFBE72AAE0755E965FE595F7C02CEC089D68610D969E62ABA728936A3F85D19B4E752572533711BF3A0C548A160B11C35B3ED5F0F0274D1EA98471FC833D46A6A1B39BD3B140717040606089E1318FD03768BCE548BA4DA9D9D650977C3BC6C75E93C7D4E95BCF389E82B3E4A7155632ABD0534A79F0AEE5811A6F94C0B47A31B08190A6F051C07D31CECB00F51EDABD278F3AB4D762738572168AA197CE9C3576D4AA124985A8FA445769E0CB27D6298A1D5BB35E182757C83E406DD3BE9D06A4DA514048EB90A76C6E04AA5F2AE5B29655ED3F0028D80C9F5B52DEA0C23B5CC5A005C5E7CC2918178246DB6E12260296C58B32F8A7DC9A9AE8853C5EA281EFCE1E65FEDDE82C00F2DD41ABB1297D49951E9E29CBA5120AB2DA15FE4AB204D2C767D0C99C778E46051B7249A61D7DC6481AA9E311752CFB81B35017A26BD070F9914A0037B09824161D74BDC4155A757640320BBE0E09A5F3D8456C067BD5CC9FF98C7216EE159B14852C41E822F78BC07BED8A207D42EF77C0AC231FB89D24B4A22CCD37270330B25D6F0E8103 -smlen = 903 -sm = E20118912E280B3528064220D17A03AFCD391D05B12459933555123CE401644A79F41F1698D81905C322512164DE2DCC4804C953EA6B2B0D780BEC040288F633ADAD73C7B10296263529D8CA9B36AE01A43E24AD9534AC397F06A1DFE02BBF3770ECD1072E5DB7A70DF351B0520796B6E2AE31A90C3426018BBCD557940CFFEF3F0272F72941820C9C254100009F7C25809BC3FE602107FCA87AD35E480C005CCE0DBE585BB646E105317CB48CB60A7901F5ABE373CE1F6FB14F2014F5BC0071B17AB2C84E8845FCBF4B15C79FBF2E5E06CFFE6CAD9A283014A975F81C9216B261CBC79EDCD58D0E20C586D7C641E0EE97221BEFE54DBCC56A594DF103EC24B52DDBB6052D1644972640F39DEB98997FEE7A252A65070798B7E46707FA440375B1BA705B3ECC7EAC56D9C45297E585299C7D747B430F0D01E82081C70B4A87846F90267D5163181DED63E089A00AFD33B0E2B3ACE91182D8CC899223CE65A5D84B86BB3E8B34B13949BC800F2145468BA5411EACD6A6C331C340D4442D28EFA0DA959A2797C7181BD4BBE6E6DFFD134CEF373ECB0EC08590F06BE0CE292D3718E2C0EFC7CB40F1DB26F5F38FDC82A72F81AFBBC16591EE02DC818D63CAE69FF0A28F942F7E07F6B0A741F3F0EBE3D0EA5859024AA408462D3D268C23F95D717C0A685A4CA73AD90EE923DB57CD6CDD828B7AB0D4AFA6A9AD7E32D407A44D7515C0A6AF52A66AD72119BA1DAEC6514DE3F8B462EC473072226AAD61135B0F5EC646BA9A127C9894E51FDD1B2D38011A2A6D7497A55283133695D0AF9B3FF7C5A8FD667231F9E511E3B8C4C3ADC44D02DE08C47B2382DE67B32826754C6BE5231CE0FC657341E20247CC6CE574F3D1A9376AC8237B49E5030E877A4E33CDE25D838EAD659EB1678706C759707FC66CE84CC968A8334C18F1632348824A6985A0331A93B59497B70C1A03A6848F18F5992972BC79F07F4222D2612797F495463836AE6CD3858D5B9BDF744A1CF361B5D454D41AC899A4FA61081B937CBABBF0FFEC1B31C162224EA36CA2CD7FCE54EC1A504932ACC5BD0B17A156DA7488F7017E4916A687FDE7FCEBB2901813B07964084AB0447A94DAC3A0D3FDA05B9F497CC1555A8C74838E29CB8CE89D304DEBE419D26BA7F3DC6E9526BD895495A5FF1D7EC83F70D045E306E7C2487A52CD7553F062D31888EF7FD27F667FCFFA984AFE0B9A4C4E85CA943812CDC157C5486B0B5EA6DA05E4BB8697113190321A976D1806DA129101E60A28B7 - -count = 22 -seed = 3222E4B55D6767E300FDE03DB3D8227E19FB8B08EA9B923FEDE18D699DC3694EFFA7C4DAE2AF57E4A0162B7C564199BD -mlen = 759 -msg = 4C4697A7D8195BC7D4B8F2FCF3A7E9419E8FC9AC6BAFC5D658260511C697286BFE44E2CE98C21C98BE42E5AF0FCEEF8AA54C5770AF287A81C7481FE3391A6111AE6243D545B2A651599B45931D7640579F8659A8BD6F77260F235F71476ED64714FDDB70C549CBE089322130F7B0A21F530508970D55CBA55BAEACBEDF684C7979078102ECFFC2C3F182F710280CABC2DECD3D3B5D3CE908CB2307B00FCC0C5412A12AECD041B5F70CC0149390312B9C81592BB0E2ECE83D4495944E29AA798DE67FD69E2BD0695DC573F78D8BB48E6B8679E1C50D1E6E58E218B77EE51597EB43ECF7301D86F457353D60E98CEDC95B4A76844E889BF7E9D03503757569E40D55AB43D63293EDDBB579FE981FFD4DAB056F85006FFB5E759B9C16F5F6B235D7DD78458A73EF37118EDF599AA504E9DB9AB5DBC90B8E478F3DC1F35A7C4604A383BBBB410CFB2C5F746F83EF94BDB2F244D421818C26827D5B7D665B8A802181EB7A9CE95B6633E24D914FECA7E969F64038ACC3009B15168426EDB67AF2CCF4E859F5C616891D355F7910ACFA599C396BBB2D2782CBF1432E6259FAA77730B6B86FE0D67730152CD2AE0F9B0314048CCD25772C01FC9773EBF06618A8CE1E940F48663427775990CDC41C4DD3E9AC6EDA1EA50E04F1D329E64C8532A7AE32238C131753D60A25810A5FFBEAA9007A6984EF69EED92B777E079CE0FF48C2AEE9C18D1DB9F49B5419EC6C0E2212DDD2E2FDEAF0FE9F2B84D9C50DDE86A70FC28BBF8918A973CC67A36E97CE3027D73891E7AEB24BAF4B12A9DC8AAB5D6AFA380BFAC3703D2D32F1E40FBB532FD6D7D710DC0741DFC7EABFE55BA5C311A00E3BE55C2EE74155E3A06685071A962D7532AC76D59FC187EFF01F8D339F74323732168FA5D14F4B2A72C9164A04A6EF14BF5DEB1833E4BAA19A55AE590F542D4448E0EAFF0E0AFD2FB30FD671631B9325F4A0BAC9A43DCD2840185A2F601117A625B0DAD5503578537BE2A535D2F556F371536BCF68C0E01C96301F08E1567DBF9D8504096A8FD89C086DB695DA191099FD1E8EA94035276D1D -pk = 214B8BFE6BA0393AC4514D496AEC99A0274D220DED192812B36267FF6795CB2419949C0639E3ADE3E2445874EFDA7C5C75306018E5F012DA882C6F7DF3233D10 -sk = 214B8BFE6BA0393AC4514D496AEC99A0274D220DED192812B36267FF6795CB2419949C0639E3ADE3E2445874EFDA7C5C75306018E5F012DA882C6F7DF3233D1002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055A45A06A1EF64BA0BFD4834AB4CE48595326DC13679B85474EF81EDE46D8B9EB08E70FD6479FDF9CFF8C644008505000000000000007484F6F9AC2E761F51F1A473DC80B3E6DDF3AE106BA2A4E1ECE1F86D80289195D59C1030FF19D21D68C871CDFED7FEFFFFFFFFFFFFFF141BCD675F0E90F90CA4FAFA7B90AAC3324EB22ACAA38BCB621E6B5B661DFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B6473B58697E2FBD1377DC802F82BBA8B4214527AA6055A82B79DCD75EC0400000000000000000000000000000000000000000000000A23BB626DF8205C46B0DA5214A160FC28AC637BCED7053AA105E667A409B715680D7446CF49BAEE2BE6C96F92CE45094C1A8E825B54A8C60FB607403B701E23A5FA132C97D4C0D83486F83556D10A01942EFC04270263ECE120EF5E2975D52AD3D58BD8C424611818EB828B5BC19C69F9F20CB4915E80AD37BFFA7B0C5BF419AB6C3D5202B66FA428AAD5A98621192EC9D007678D7AC37176DFE98A6422A9007C5384E97B233818861840F0DFC0A53CB5EF445597FDE5E6B6416EB7D4E49E217C9730BFF7D30D1AE063CB99A4AD3491E69064567C1683665BE860121FF05E076BD8F7041DA41A4BCCDB7C128A4789A1EFE7E150D3CA2B39F42D37EBE4BC6833F678B35BA55BA0B69FEF42051B37BAEF7929F36D539B4B6F87150B48771DBA0E88B49BC47C76E7D843F5D167B1FE395F9538178B5546B5C2584E654BA87C210EBB8809329D8E3606318FF310FABCC6D6583CC8B27CF7473C99C9186862B56B069F89DE7EA170006075CFC43E969596D0B73884EB6DE1D525830B05B4338E8B191975B0851543D6702E5B86175EA5FD7950C048A95A329575CD4543EFB767991133B87DB2FD0C376302F4F87F4932CB885D7DE4D119E36FEA7BA7EC80064F0309 -smlen = 936 -sm = 3481E337344EA7BE660051501A5F928EB8EF1904BA8142F8E0A34BBFC00505D0E64CC67C75C18006BB18FCC3E9C44CD5E806237814DEC66784FD7705B22471AAD67A410A46007290F58EBBD7AF44FF02734ADD6BB2E70D536C03A3D0330F08023DEC1E05B13B5B651076C0AF280594ECFC0624C382E497071278D68270E54EE26E07F944396643BED0B33301002F52A0CE6157F1C63363738F3AB3B8350C03BAD6AF0712F2FEAAE001D59D60C6817DA0014C4697A7D8195BC7D4B8F2FCF3A7E9419E8FC9AC6BAFC5D658260511C697286BFE44E2CE98C21C98BE42E5AF0FCEEF8AA54C5770AF287A81C7481FE3391A6111AE6243D545B2A651599B45931D7640579F8659A8BD6F77260F235F71476ED64714FDDB70C549CBE089322130F7B0A21F530508970D55CBA55BAEACBEDF684C7979078102ECFFC2C3F182F710280CABC2DECD3D3B5D3CE908CB2307B00FCC0C5412A12AECD041B5F70CC0149390312B9C81592BB0E2ECE83D4495944E29AA798DE67FD69E2BD0695DC573F78D8BB48E6B8679E1C50D1E6E58E218B77EE51597EB43ECF7301D86F457353D60E98CEDC95B4A76844E889BF7E9D03503757569E40D55AB43D63293EDDBB579FE981FFD4DAB056F85006FFB5E759B9C16F5F6B235D7DD78458A73EF37118EDF599AA504E9DB9AB5DBC90B8E478F3DC1F35A7C4604A383BBBB410CFB2C5F746F83EF94BDB2F244D421818C26827D5B7D665B8A802181EB7A9CE95B6633E24D914FECA7E969F64038ACC3009B15168426EDB67AF2CCF4E859F5C616891D355F7910ACFA599C396BBB2D2782CBF1432E6259FAA77730B6B86FE0D67730152CD2AE0F9B0314048CCD25772C01FC9773EBF06618A8CE1E940F48663427775990CDC41C4DD3E9AC6EDA1EA50E04F1D329E64C8532A7AE32238C131753D60A25810A5FFBEAA9007A6984EF69EED92B777E079CE0FF48C2AEE9C18D1DB9F49B5419EC6C0E2212DDD2E2FDEAF0FE9F2B84D9C50DDE86A70FC28BBF8918A973CC67A36E97CE3027D73891E7AEB24BAF4B12A9DC8AAB5D6AFA380BFAC3703D2D32F1E40FBB532FD6D7D710DC0741DFC7EABFE55BA5C311A00E3BE55C2EE74155E3A06685071A962D7532AC76D59FC187EFF01F8D339F74323732168FA5D14F4B2A72C9164A04A6EF14BF5DEB1833E4BAA19A55AE590F542D4448E0EAFF0E0AFD2FB30FD671631B9325F4A0BAC9A43DCD2840185A2F601117A625B0DAD5503578537BE2A535D2F556F371536BCF68C0E01C96301F08E1567DBF9D8504096A8FD89C086DB695DA191099FD1E8EA94035276D1D - -count = 23 -seed = F41B3C6225245C06455272A6A073F363E5F19F09A0B146AFCDFC2B3B0EA64BAA3F90359F32B2D1017608B03064E90AB2 -mlen = 792 -msg = 72713EA55F1E5CCD5787F172657C6F6C74081DE2D70816E8531497965DF02DAC04D91C4D09DCF8904CB152E2138F829386F4351015DA253A5B5EB92D96E537DAE3CE809443EA90332D9C754EB11F4DE586A83B5DEE7B1B9BD547EE7107530249B14279BAA04683D74B69D7BFC8BBCD447FE7706593C01188FE6AD8D0E2572D49F83E93986B380D4169BDD94E3311941DD2B041DFABC5AEA1297C65BB5C8352C99FF838D46B93B3E5F79E3CC5BE5408FE5E59A10D488DD65A997B086FDD96CEFB0247B2BAF7B490317E34330A879D04E374C92ADA33EE243D84DA015FDDEC243B00BD7488AEFE373E8AB1890273A7A2285988E9DAF9C4E7C5A17F54AD6195EDE2C79657E1BCCED0641E20F7EE26EAF53DD8C82827F2D2783D44FB030C95791F41653E628062267A5CF534DF00116C1ED1DE9F360B97555C65CDD80724104FB1BD4DA5785B5D9C24438557E48AEE58D57A03E06D553B05B67E1C8D10085C2F153647F174F7922FB8D2210454F7014BDDBC627756EB7CDEF99B6E3A2779F82088E3F2DA14C2DCB5B185AEB5D6ACBFAD43E286AAE8F84A58E8DF6ABC64E4A8EFD69FEA18DBFA6808F25FD418DE8BA923500B74E34DDA3CA6AD8DC208102DC4A876D8B8CD2926AEA4B3AE11A546F6235ABEA152DBDF43E0BCDFCDC83299207F294A707C8B4D1F56AA64A205C718ACA69B862AFE7489F11B324E7AF6BE68380D2CA6E0AF0E2E20F890F2CF98907A9D43135C03E85E86C9EE417140EFEE9054B46C110A84F1841AE3CFAFE5B4A95D6B2B606D8D0A70BAEA85C9412BC2D54146E9F866800E8E8615A0D64D1D595677E8C88699E3CA6097D47E9FE64050FB55033FAD4D5F226DA8EB5DDF99369ACC7552927ED3AC7368B9EFEA2443926DF26D1C172858FD8A5D4E1D7D39E7F7DF047385D39131184087CDC45B299BD1F7048E918223DA3F960608E853EE49EA667465DBBD889CBDA20FFBB540C9EBBA5C2CD16A22A57B561E01331D6EA6BDADBD6A5D2BD1441EF4E1D9DD11CC62A0FA5BBFFCBED0D27B6ACAF0889EAA5863DD9BB35920707B71A0805630D1769FEA320516E71CB2B125AC274F16F7A6876F4B922C7C006F38AE1F7183CA768715D2AF -pk = A945B2017FBED8EEB058DF751B6832C33FE6EBF0295261B0E7977A39D4527C1599A6F5A7132CF216A59CE4C591F3433C7608980CF23EE635B8699614ACBB801D -sk = A945B2017FBED8EEB058DF751B6832C33FE6EBF0295261B0E7977A39D4527C1599A6F5A7132CF216A59CE4C591F3433C7608980CF23EE635B8699614ACBB801D0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D5B94D658563B5C3B039D3D343919EAAAB53795FA0010E4545CAE9AFF8910C2C0D27059526D3CBA8E9C61B6E2AA00000000000000006A15C666E391188981FB140725B761D51E7AC7882C9D296F4D6188F913529CA48CFCBDD5854CF56DB1A96E1A23E2FCFFFFFFFFFFFFFF5A073F230FE7F72D7D4900B7738509FD217706B20F102111FD1DB0F029ECFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53DCA272620A27DE392260ABAF41DD5AF84D1145273CABC4C75E9483B8FC0D000000000000000000000000000000000000000000000083F8A52CA0C508661580D56B687125ED18D6CFC13B1D882A229591AB90510E22AECF0808D68EBF79DDCEE1A4B5B32796DABA4F767171E40BB3633861D8AE143054D23797000D1360297259E98E0511CB329C697B1C95088DBB44407AF8C4B92449C02231D4BA26A45A8916640BD81AC354F9F3439660B42EE1DB198E83BAD6317D2931A95438D41A6694D15E63E8089465750AB30CAD476B21F1753828892D17787F2E3DDB2E3F944800E518FEA7DC1A81BD08A1EE567C9B9C23E9EF359B1133F2F1DD5A12710B2F1F58FBA9F1C46ED865391A2D7422CFA56564FA961D388F1CB11BB2D83D0EA4BFBD18D4C319C5C705E28ED3352E0B7778EEAE3C4C1FA6E115D4BE9D6FED067B6E69D286DA86CD47C3BAA6591B583D478F02DA6B3132D7FC0F3C206B737DBA5C6EE98A7DA290F964CB799C04052A39882C4AED3A443AE0722CEAA3725C70994450415394E4032FAEF978F2234E37CC5DD420879844CB662C0500ACD31B7C4904EB93918AC2AB468D129270CA901E8373143BC5EC47362CF43182AA4C27D20868C4F53AF0116F05F9B2DB4192F74D5FEB791DF569D819228E09FDFF528C6C2909347E6BC86537D261900AFD4F45B5F93C1E07DBAE8E54DB9026 -smlen = 969 -sm = 1E7DA14BBB8761E1D7077D29E20E75F72E68FC0774F30EB7CF1ACAEB5506FF47418B2AE8B025EA07A8E2FE82DF86DB4D910635EA9B59C65FABD1AA0107800EEE9E55BBCAFF013FE85FD2CB0DAE2E2602E51C62B07EEEBA6098027FEA27667E2724C35804292FFFE386BC06987204DCA43A95519F29C24701963A5B970913544AE604F2A65775FD186C63A20701A5C938AAD4106E485F94F1E212337EDE0F01E4B231FE9100724C2C04E196AB24B5A2260072713EA55F1E5CCD5787F172657C6F6C74081DE2D70816E8531497965DF02DAC04D91C4D09DCF8904CB152E2138F829386F4351015DA253A5B5EB92D96E537DAE3CE809443EA90332D9C754EB11F4DE586A83B5DEE7B1B9BD547EE7107530249B14279BAA04683D74B69D7BFC8BBCD447FE7706593C01188FE6AD8D0E2572D49F83E93986B380D4169BDD94E3311941DD2B041DFABC5AEA1297C65BB5C8352C99FF838D46B93B3E5F79E3CC5BE5408FE5E59A10D488DD65A997B086FDD96CEFB0247B2BAF7B490317E34330A879D04E374C92ADA33EE243D84DA015FDDEC243B00BD7488AEFE373E8AB1890273A7A2285988E9DAF9C4E7C5A17F54AD6195EDE2C79657E1BCCED0641E20F7EE26EAF53DD8C82827F2D2783D44FB030C95791F41653E628062267A5CF534DF00116C1ED1DE9F360B97555C65CDD80724104FB1BD4DA5785B5D9C24438557E48AEE58D57A03E06D553B05B67E1C8D10085C2F153647F174F7922FB8D2210454F7014BDDBC627756EB7CDEF99B6E3A2779F82088E3F2DA14C2DCB5B185AEB5D6ACBFAD43E286AAE8F84A58E8DF6ABC64E4A8EFD69FEA18DBFA6808F25FD418DE8BA923500B74E34DDA3CA6AD8DC208102DC4A876D8B8CD2926AEA4B3AE11A546F6235ABEA152DBDF43E0BCDFCDC83299207F294A707C8B4D1F56AA64A205C718ACA69B862AFE7489F11B324E7AF6BE68380D2CA6E0AF0E2E20F890F2CF98907A9D43135C03E85E86C9EE417140EFEE9054B46C110A84F1841AE3CFAFE5B4A95D6B2B606D8D0A70BAEA85C9412BC2D54146E9F866800E8E8615A0D64D1D595677E8C88699E3CA6097D47E9FE64050FB55033FAD4D5F226DA8EB5DDF99369ACC7552927ED3AC7368B9EFEA2443926DF26D1C172858FD8A5D4E1D7D39E7F7DF047385D39131184087CDC45B299BD1F7048E918223DA3F960608E853EE49EA667465DBBD889CBDA20FFBB540C9EBBA5C2CD16A22A57B561E01331D6EA6BDADBD6A5D2BD1441EF4E1D9DD11CC62A0FA5BBFFCBED0D27B6ACAF0889EAA5863DD9BB35920707B71A0805630D1769FEA320516E71CB2B125AC274F16F7A6876F4B922C7C006F38AE1F7183CA768715D2AF - -count = 24 -seed = A08AD391E0FC57A83B74CA8CF44DB67F8178262ED9B20AA0163CDD8274AC2BE05F558B112B094244370C1AAAB75077E6 -mlen = 825 -msg = 209658CD1D801079FFE8E950BAFD70A028CFCC35B9FB00D232C5603A1D51BA13E5DE59E0277962C4474E9F3F60FCD99C9B79665B3839D5C037B921A4DE8E144FA1D38182FBDEECDA6934E814D9186591F01C5E23349B34F4439B4D402C4072CB4D702966AB473D2C39443F41FBDD0C48E566D33E076422EE72FB47B2FFD661F367E9EFDDC988BCA02382EF93590D4FE3ECE8B1D9D8B3A653219C7D131B43E2FDE2851541F467C31129E6F9B9D124221CD52610B9F138EAC1D01F193148FA0415B29F5C86D15067EB1E26C9D51F05655E8545F734F8F244854AD76C6B04C230898BEA33EFDCEEF100D79F8E3B894BA583466749B82007067806E3A7B3BA954F6FC5ABFF0E099A24D14D865F6F4538736124ACC5EAD4169DDF2144AD558DA3C74CDABEC147D2AFA113EDFD1E2280766B18792310FB6B4FE5D0D9F65906B1CC43655BB3D6178EF9093AC9C8F1A91BF49008179394EEE79E1D8E3228F567770C1BA1E30BA4BCE2465AB68F53CE21C0D8AB2F6E535828F211D4DB957DC3AF8B7E00DABD8F1F74C959B2AFF45121C5B5ABD3136C6F55D5F5FFDBCEBC3CD7A430FF3813D23BCDC1254FE6949DA4E7694028B7FCB876099E91B92C65D85C39D4BE9325AFE81703E5B18CBD7BD9EB59A9BB9408ABD966ADE9A60303807AD1B2C14C04CDF8FAE6950A55B21C9EBB5E94713BF8C2890215C5DA94B59CB31EDC671093B15FF5014DB4CD3EA8060260DC1612E9FD6E5AB40F0656121F689C8E94212269A7B24305C83BF0583418755CE690913CB081F2893FB42BC4750F2C053C48C1552430793CDDE1A49AC9E21913210D727C4BEB5640AB9B7505EA4E59AF417A085394181784BF1BB0BC32BD71CC57CE77541581F14B8BA4B758500694796262B561A38C72893C77B548D779A3833EEB064CDDBA5471CBFFBC769E139946155BF376A56415AB743DE568CD21895ED6951B5BFE1B1629DD6510DCD4483F206954964E0517546DD96900A2540A51835818D1730B0C9123E7FD8B28E6843BFFB659945A273CEA944FF6E83C234B3E43DB4630614E0B67778EA760EE341FE68C525E90475A1560821AE6B2A85015292C36EAA2E041AC04FB55922C48204525187C7E0476A9FED04EFBBA96F369D8AE709506620127FD399613A9796C4FF96D7E -pk = F96BB0E92DEDB51E0205881C3BA093EBB285AD362F6D24A75F11B2D42C16A2055D6291DB5E026A2F8EB2B384CA410CFB33F573EBDB3D784556C2D69C2DCD9409 -sk = F96BB0E92DEDB51E0205881C3BA093EBB285AD362F6D24A75F11B2D42C16A2055D6291DB5E026A2F8EB2B384CA410CFB33F573EBDB3D784556C2D69C2DCD9409020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BD45C0773DC9795E7C25A0854AC47EC4441C2996307E4731F57C7424723D1D7A42355AC44BAF68A6BD866C161947010000000000000060E89B91C0F883D3839D62F706DDBCD7E2912ECE6F4E6B174F14BC257332C32CA0DB66AEE3EC7BDC51FE2286C34CFDFFFFFFFFFFFFFF8C791BE3018E511B7A8F0EC21288B3F76D1A85A6C014A2C4F22E4A3D02ABF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB32CA46E2E3AB9BEA66CB0E8A40E4A9AEE6DA9B87B63C15D427384872190E000000000000000000000000000000000000000000000012E90AA417B4F649CF646511A817DEA52AB953BA8BD57CCEAF8BD4A9CBCB3605EF051CFC1EB440B687C99F649BBDCDD70E60EC09EA59998B60A0704B083AEF2DD23929384717AA6011590B40A941111D72BD8A1D4FB39AE879BD9D259FE9A225F3EB86FDD46248E37E177DDE90DA7033A82A9E6E511CC048AB02C34A78A1B812B498776805EAB7056F19651FDC5B55BE323CD4E9FA3DBD9137F77833D426591BC8FEDF231683B80E4577ADAE623628D101FDB9B364B5B5AF53A4E0A22E36EE17059C3AAB1A0D693BF3B8AF0A9DBCC59322E268CEC7B781E9595B2CAE412B631655DDDB6D78FD7646754912850438444B21368BCB996BD05317C8EAEA7AD3F92B3346B9BB63C400344E9AD233005C72E0AC2E3F09E91850F2D404F23523FF4E14D84987791364BFFA733D2A7449D4AEBFCA8DB446B9794929C957A9B2F337761C406A0E33E2A1EC896057B136B53CA675BAAE7EB5E27B4C16119EBB4B943A5327CF38A3346974F3AD6C9E17A1C24E4D8935555571A0066D69AE3DFD678679D021CF83C023F48364828D80F913A8B27D451555527DAEEA5CA15D25EFFC67C8EC0293BC4469889B80BF27ABAE038A0563B2ADEDB3945C8644B406ABFC5931204E10 -smlen = 1002 -sm = 5D456B09F3641E9252047CE48238A6C41B8B0401E21191FD23B23E982701DEF40F65BDFC1647E704DC91A879CA4FC9EE0B022F2C97B259FE15AA3207FC645C23EE2111482007442C1914E65598D77101575ED0673CD60F395A045FD38F5874166969A10471D04537BE6C9D30B006892E947CCB23BA1B34048386E64DF7D0B2DEEB04F8B8B8D4668C7E2DBF0401BB70490DF57A720CA40B0B483623BD540C02E6B6C8565952021F0C07D5D4B3443CE70F01209658CD1D801079FFE8E950BAFD70A028CFCC35B9FB00D232C5603A1D51BA13E5DE59E0277962C4474E9F3F60FCD99C9B79665B3839D5C037B921A4DE8E144FA1D38182FBDEECDA6934E814D9186591F01C5E23349B34F4439B4D402C4072CB4D702966AB473D2C39443F41FBDD0C48E566D33E076422EE72FB47B2FFD661F367E9EFDDC988BCA02382EF93590D4FE3ECE8B1D9D8B3A653219C7D131B43E2FDE2851541F467C31129E6F9B9D124221CD52610B9F138EAC1D01F193148FA0415B29F5C86D15067EB1E26C9D51F05655E8545F734F8F244854AD76C6B04C230898BEA33EFDCEEF100D79F8E3B894BA583466749B82007067806E3A7B3BA954F6FC5ABFF0E099A24D14D865F6F4538736124ACC5EAD4169DDF2144AD558DA3C74CDABEC147D2AFA113EDFD1E2280766B18792310FB6B4FE5D0D9F65906B1CC43655BB3D6178EF9093AC9C8F1A91BF49008179394EEE79E1D8E3228F567770C1BA1E30BA4BCE2465AB68F53CE21C0D8AB2F6E535828F211D4DB957DC3AF8B7E00DABD8F1F74C959B2AFF45121C5B5ABD3136C6F55D5F5FFDBCEBC3CD7A430FF3813D23BCDC1254FE6949DA4E7694028B7FCB876099E91B92C65D85C39D4BE9325AFE81703E5B18CBD7BD9EB59A9BB9408ABD966ADE9A60303807AD1B2C14C04CDF8FAE6950A55B21C9EBB5E94713BF8C2890215C5DA94B59CB31EDC671093B15FF5014DB4CD3EA8060260DC1612E9FD6E5AB40F0656121F689C8E94212269A7B24305C83BF0583418755CE690913CB081F2893FB42BC4750F2C053C48C1552430793CDDE1A49AC9E21913210D727C4BEB5640AB9B7505EA4E59AF417A085394181784BF1BB0BC32BD71CC57CE77541581F14B8BA4B758500694796262B561A38C72893C77B548D779A3833EEB064CDDBA5471CBFFBC769E139946155BF376A56415AB743DE568CD21895ED6951B5BFE1B1629DD6510DCD4483F206954964E0517546DD96900A2540A51835818D1730B0C9123E7FD8B28E6843BFFB659945A273CEA944FF6E83C234B3E43DB4630614E0B67778EA760EE341FE68C525E90475A1560821AE6B2A85015292C36EAA2E041AC04FB55922C48204525187C7E0476A9FED04EFBBA96F369D8AE709506620127FD399613A9796C4FF96D7E - -count = 25 -seed = 6E0A8EF5156D693FD0140BC4A31084E79773A83F42C8D133AC8A9D62DE3CD74511F893DCB26041E6B35E2B175408FCE7 -mlen = 858 -msg = 8F37A065DD696AD437EC82909261B842EC0A3E66F8AC574105A3C82EC8B4926F2466FA550F8EA1B6A9A142C00AFA44BE6512A85350930DFFC99B95AA21012057051B68C48581AE439B9290A163AA4B6AFCF80FFB91A3321C7B9ABAD56D5DC1BE4E67E5576C9F3A7DB96071859B94EB22A73DD96C66AE67AB11D1AB62A86D826C682DFB8CCA3259DCB5B34BE635421CD4206E7D92147F14C36424EAA407B441F58E5C187E58A26B2AE144888A3CC1387AC7D0A681EEDDC3B7781AB282E8185CCF33FB27500CFD119E0415DB1E45237520A868C8457C88A1D3EE97EC9451DA35D7E74924F8902949E7EB14BA87C8AC672D7E4F3BEC1B2814DFA67A8DD2E2D4FF4661D64BC4C6D6A78D4E489689B6063CDFF5A3F1554501B424284A9F4B8FE777FE4E6AFB83A85E36200A9AB40B9C18678454B2A3F50A4862BA1E36F0C57AD004FF90192B5619614E37DBB38A1B8A65AC613F7796C70772128377065B84F122540106D1B4F9123C4E009B4C0A85D59B35F72DEBDDD154ABEC7F3FB25FD1FA04367386098DE610B26FA3ECB031A6072D14607E92FFBE195ABFF71E586A984131AF24E18AE94DBAB0544FD2AD217960F337111BFBD4046809EA03C7C47B7177757A4A43E1FD0134859BA735A8FC17597E593BB58322136602954D3A21096B0D1DEE5CF0AD17A5FCF561FFA21CAA70D33998840E4CFA18BA481704A8B82D2CC1C110FC9A6704751365AE9F338AFE4CF9C811697DDDFA8635A2F3CD02DD1845251014BF2F2D6C02A907BD783207C4773A937048A07C500D7C424B5F65A2C376523740DF9A0B60437CB8AE17D64DD51DD4E433AF83B20C4B6B890B97976DF09E3A86AC19006C229D59FC7A2923245B7B1F0ACF7C42E486D41CA1AC1D7051AEEF6003CE94182F97D099C74317F61EB47AE18C2BED6A3CB253C21EC835E435123E0A657ED926F880CE8E5DE3155272328A467278F52AC50A1121AE818A3EA3A2E1F7401CE23AAF66A4AC289748A7E98A5124C586D8957BB4EDD3F091492BB1A64D75EFCD45AD51CA420F15DA848B20DC6BB765E7B71359B3A9E95E121266AE4A40DC2E9A3D81EA1B1A643594B3D4E6ABB7D1202201DE92BDF0CC1ED977E2D5851822A01F48A6F23180822888CE345AC9BE0CC69BC448D41CA20B79C35B1DAD73E6C683E70C4439B404CBF07FCC39B0E5A1D33F3717A6BAD28A6DA4F091BC7A -pk = 4BC4B8372F14C29566F6CB023EBEF5929849E241E761CAA03E222CF28CB2D807399235F2AD83CA3A86F893856FD4F18453FB8118E3E6B234721B12CEFB7EAD1F -sk = 4BC4B8372F14C29566F6CB023EBEF5929849E241E761CAA03E222CF28CB2D807399235F2AD83CA3A86F893856FD4F18453FB8118E3E6B234721B12CEFB7EAD1F020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000902330E7A9675E614986792B4AB0B008208B7020F0CC92F5579684A53723BDE65E3EC6DD0D3346A94993B76B558CFFFFFFFFFFFFFFFF9390AD14BB9B1BD2ADB8E893FFB2FAA1C42704AB66C48451701996774F80CFF4115641E5A9DCB720E65360858044F9FFFFFFFFFFFFFFDB6AA48642BC3154CF795B138443EDC8421156EE942F0E5FCA0C897D543E0600000000000000000000000000000000000000000000003C38D9DAB3C2EEB9D13E046F271ADB7CED69B83BBFE3BCC0854252EED625050000000000000000000000000000000000000000000000C5043D742507A39DB4550F6FECB287757858995E6696D753F7A791F3840639069750759441D9792DD3543AA79B4A313C0D3454278AF45707F67C78D25F4F410CCF27F017D02BC45D72B6F12EAED812CFD6999F62FE5A0559C418A64625EAEE2F05D2D95EC0516E975B22753CB1DD76893817B4242CF668384A44044281FA530717C86171148BCBD2E57D49F0384815F697B1825FE5FB3031124AAD1AD87C5A1338348F430DBB2F2ECBB78C074E342A1B60B632199BA713D6A54ECC6CE9EA2423A1FFC79FD3F566FC58DAEA6940AF5CD663D101C36E501A856FC033C3E0C6020339A282AEE86EAB9F0BD40D3E280F9A06969C394C8667041DC73DD3240E62A520083668C578171CB337479C010017D42E6F1362F45E3DAC30A0D98301543A551323B7F136C9B82E60F767D7363BBD31D1E7BD9B5561F71B3EB7D25B69F43CED1260F1D9587CB0459B524D8218BAE004D1042F09513B7FCD1A28F4DD4A449CF00E129429D0589AD49251CAEDEB4B65BB573F8FB3B381FEEA87E370C5C6F7E1C71021D82DBA532A0075EF5ACAADB51D5A958DA14169126FF5A443BC1CE5EC1FE62B5A03595959AA242A24B8EA8685062FD9E8D0D544FE73DE4CC3CE7A17F36DD91A -smlen = 1035 -sm = A494DFA78BABE79F2B01FE00B5AFFE05A9112604DC8368284681D64F7A03B6E30522767F7202CD05FEC17D9519740632FA00794C2BFBCD9662120705142CCC0BCB99E4EB1C04E49CDC32FA4191C2D804D4BC06CCE753A4B31301DD9112FA1A1E8E8FAB0003BC377BA05A4A74F0046B2D70DB45F103FE8D0111B8C49EA63BF2DF130475ED404C2AF188D96D03018B59EBE657486630B0AA3BAD01222F900203DE5D8D2C0E600C8EB6039342B6A11D089D008F37A065DD696AD437EC82909261B842EC0A3E66F8AC574105A3C82EC8B4926F2466FA550F8EA1B6A9A142C00AFA44BE6512A85350930DFFC99B95AA21012057051B68C48581AE439B9290A163AA4B6AFCF80FFB91A3321C7B9ABAD56D5DC1BE4E67E5576C9F3A7DB96071859B94EB22A73DD96C66AE67AB11D1AB62A86D826C682DFB8CCA3259DCB5B34BE635421CD4206E7D92147F14C36424EAA407B441F58E5C187E58A26B2AE144888A3CC1387AC7D0A681EEDDC3B7781AB282E8185CCF33FB27500CFD119E0415DB1E45237520A868C8457C88A1D3EE97EC9451DA35D7E74924F8902949E7EB14BA87C8AC672D7E4F3BEC1B2814DFA67A8DD2E2D4FF4661D64BC4C6D6A78D4E489689B6063CDFF5A3F1554501B424284A9F4B8FE777FE4E6AFB83A85E36200A9AB40B9C18678454B2A3F50A4862BA1E36F0C57AD004FF90192B5619614E37DBB38A1B8A65AC613F7796C70772128377065B84F122540106D1B4F9123C4E009B4C0A85D59B35F72DEBDDD154ABEC7F3FB25FD1FA04367386098DE610B26FA3ECB031A6072D14607E92FFBE195ABFF71E586A984131AF24E18AE94DBAB0544FD2AD217960F337111BFBD4046809EA03C7C47B7177757A4A43E1FD0134859BA735A8FC17597E593BB58322136602954D3A21096B0D1DEE5CF0AD17A5FCF561FFA21CAA70D33998840E4CFA18BA481704A8B82D2CC1C110FC9A6704751365AE9F338AFE4CF9C811697DDDFA8635A2F3CD02DD1845251014BF2F2D6C02A907BD783207C4773A937048A07C500D7C424B5F65A2C376523740DF9A0B60437CB8AE17D64DD51DD4E433AF83B20C4B6B890B97976DF09E3A86AC19006C229D59FC7A2923245B7B1F0ACF7C42E486D41CA1AC1D7051AEEF6003CE94182F97D099C74317F61EB47AE18C2BED6A3CB253C21EC835E435123E0A657ED926F880CE8E5DE3155272328A467278F52AC50A1121AE818A3EA3A2E1F7401CE23AAF66A4AC289748A7E98A5124C586D8957BB4EDD3F091492BB1A64D75EFCD45AD51CA420F15DA848B20DC6BB765E7B71359B3A9E95E121266AE4A40DC2E9A3D81EA1B1A643594B3D4E6ABB7D1202201DE92BDF0CC1ED977E2D5851822A01F48A6F23180822888CE345AC9BE0CC69BC448D41CA20B79C35B1DAD73E6C683E70C4439B404CBF07FCC39B0E5A1D33F3717A6BAD28A6DA4F091BC7A - -count = 26 -seed = 49CC05312D1DBE216FF03B60575017A6A1464C06D2C5A4A6F973AD9F275F7C66163A29A803BE759B117043862D277C27 -mlen = 891 -msg = 30D61C6FBD64113FCED8C5205026EBAC0D9F3522182617CB00B6E70C8DA62ECC1BBC8E1FDAF17CC61DD01CE85A9072CC1D9D34FDADBA5B93E0AAB4C9C4C9E26D3F7F145FCB23673B6E0B373C0FD1A58F52486B72624EF91A539519EE5305772A006E49521744912BCF3CDBAD424F00428AA96CCC21D000EFB09DA5CE652E361A6FB649A060835E3B9DC9CBEC660C7531620115EC905DCA6EE2A1CE36554C0FC1D6DD6863B8F3843508ED5C214B6923E7F5C0304E9B0D5E5E433BD029116A33A60CB980737AC950577D0594BFE0AD2225CB8D3FA42F192B0EC05A49391632A32FA931C0FBD83A7B6EA24301AD0906E7911F9D900D19AE1247ABABB1C0E9B9BD165185D9D7413EA068FE8824CCE5B3AD51FE8E2BB2C4022C61B002C1DF4852E4910F38613787CA12371038B6364D920E07B4B417401253451DDC25624B5D038B2DFE29B8494EC960F87803CAA256A95C9868AF819747E4BF26FAABA6DDBAED93A7815C795AD5EB7FB4592DF678AC1375388CC7ED3A6230CBE80ABBB113C80B70C789CF0C66B943E67CE814F12D3D83F3B90A4320FEB7FB81DC93B05D7FE2D36584399214D3D7C71AEF322A5D04B5470703B3660BF86B0B17BA9FF23E45F7BEFEC3758786D2111C81BA4D81B83FEEA35A0668E5EB3694963BB4DB3ACCE4FCBA6F3F6FED9627580DD2D2DC103EF7E52BB9745BD42A7FBDB459B5C8AAEBA67686EB899E3177FAF0897C61B008ACE3304C41B4C79E2EF9C865E9958D8716BDDB69154FB33187D927B5296C1589FB1AE3D553F116FF6CAE56910CE6717C446B9947AB2A981A8F5999C1C6E517EB3FE584F5D10059910E22F40FBDDB709C9F686F51ABF7D7206A8BAB4A346B51523C362D749238D7EF6671A89CD86A8540604F134D760267E91EB92FC0FC275CAB69C776EF81DBAD35027E5307F1D34EBF5D6E4DF424D709666A1E649C044C4930098B2E6E3782A93976B55073C504563C7E052B6816C07F0FD54A759D2BC189FAC3FF54549FC4DE192EFB58A9E301863A77380967735910F63D35EF5FDBD8751DE4BC6BF2E3095628DC7F67C1F5571D17AA342593B2C7F953C3F0F22DA1862122031BBEAF0D00A029C043304E3E2609C4FED8A7404FA10E2EC846A70EB0E37C5BE61E698CF2296EC1FBE6FED75F6FE3113C23B29AFB5A6D7E3A9E46E2D89D8C06450CEA11492C1A97F7D6BE8FF6C014930043022B264FD32593952BC606F779598631E48EED86EC2A013D8EB866F311A400 -pk = 536C25D655FE3BCFA9102EAFDBDF9C44AA066821BCC9DDE80871F2FFCC0AF224751531A0DF145B5AB63E54B23E94EDAD07E0384DA27D0BCA954FE140A5474321 -sk = 536C25D655FE3BCFA9102EAFDBDF9C44AA066821BCC9DDE80871F2FFCC0AF224751531A0DF145B5AB63E54B23E94EDAD07E0384DA27D0BCA954FE140A5474321020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B5FB7765F463863F624771EEE8794D5BE82FDC4A67286DFFEEB6158A8EEE8C3FE09BDEEE2ADB2FE5C305BEF159330100000000000000D083D4012E0B24CC86DD4896202255B571B27062F8D4FB04B51D4F49A074ED0B5C9389EF5019F7993DFAFBC0010EFBFFFFFFFFFFFFFFA84C001A69EFDACF0B410BE8AE462A7B31E4AE63031A3B937EA05D8B7C4DFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B6A68F9619A49D51E33090BE7E3299BAB3ACB0CDFF63C06197EE257C64D090000000000000000000000000000000000000000000000DF8787CD2384079ADA73669C4FD8C7CD4D2F855DD9BC9643079B19E5B7965E051A85599DD6D88F68D3954405F3E40E8D1A0E8FA6364116EF65B3856B9E1E7A2F191BFACDA5F559B66FF0317685C288BAD1A123D5FF2C06701D14E530B618E32F70245D202159954D824F2FFAD8AD2EAFE87062F7614984594A9ADD9888A9EC0A0491B50AA4D81999D2A85675B2B9434945B35EFAD4EBA6F2547E668F2F57531433B1653A60C6186EE3247A52B0FFE8B2025D95A4CC9079676A4491185730E32E43C1F7F78DBBB979841D9BFDC6E2E28DC4A7F128A860B9DA73964B61EC1C0F108CCC12DBFB3A40024DD6C73CD6F906B7319BC5313DDD71598FC2580780DD7D2118E4CA1AAC61E1B774D70C7C4382089112CDB3CDF261F7E1E8A27E464C936A294AC9C500327DB4E398972D8E1C8863F2CBC0C0BD59DDF15ED242DE61132EDC2CD810C139F6472D06DCADD894C0AEAB02F543A8ADEE15660EE9C965A26401DF0C09B8C4E28DB94F1737728A15F3638BA5ABC348F65EEB69B7668BB756083AB51E40FB5CD34977178A23305E388109E7A1594F266311C9E2E8E979F429736E2E26B837088D71FB29F421000A9BDD81FC10D02B86A4B3DE26E40EB7055C2929E904 -smlen = 1068 -sm = 039A0AE331048E5B400042369159581BA6A40C00DA0455E55F8C844B2707B76DECCC2329C339EA06CE239BB638F1EBC1CD075BE731CF7C15D3363701CEAC5B324F273E5C0F03D44B6C7C6FF91CFAAF065F9E04FA9537B30C6D005A6E5A577E53D78B5C01AE8BD15A583EA745D40666B5731060C57E550B02CE857EEF2E26EC914B0333C26E6A7AF31C7525070195BC0108F6C7E129BFE25EE1D4E64770050320CF4A6CF01EAECFBA048DB48ACB796E9E0030D61C6FBD64113FCED8C5205026EBAC0D9F3522182617CB00B6E70C8DA62ECC1BBC8E1FDAF17CC61DD01CE85A9072CC1D9D34FDADBA5B93E0AAB4C9C4C9E26D3F7F145FCB23673B6E0B373C0FD1A58F52486B72624EF91A539519EE5305772A006E49521744912BCF3CDBAD424F00428AA96CCC21D000EFB09DA5CE652E361A6FB649A060835E3B9DC9CBEC660C7531620115EC905DCA6EE2A1CE36554C0FC1D6DD6863B8F3843508ED5C214B6923E7F5C0304E9B0D5E5E433BD029116A33A60CB980737AC950577D0594BFE0AD2225CB8D3FA42F192B0EC05A49391632A32FA931C0FBD83A7B6EA24301AD0906E7911F9D900D19AE1247ABABB1C0E9B9BD165185D9D7413EA068FE8824CCE5B3AD51FE8E2BB2C4022C61B002C1DF4852E4910F38613787CA12371038B6364D920E07B4B417401253451DDC25624B5D038B2DFE29B8494EC960F87803CAA256A95C9868AF819747E4BF26FAABA6DDBAED93A7815C795AD5EB7FB4592DF678AC1375388CC7ED3A6230CBE80ABBB113C80B70C789CF0C66B943E67CE814F12D3D83F3B90A4320FEB7FB81DC93B05D7FE2D36584399214D3D7C71AEF322A5D04B5470703B3660BF86B0B17BA9FF23E45F7BEFEC3758786D2111C81BA4D81B83FEEA35A0668E5EB3694963BB4DB3ACCE4FCBA6F3F6FED9627580DD2D2DC103EF7E52BB9745BD42A7FBDB459B5C8AAEBA67686EB899E3177FAF0897C61B008ACE3304C41B4C79E2EF9C865E9958D8716BDDB69154FB33187D927B5296C1589FB1AE3D553F116FF6CAE56910CE6717C446B9947AB2A981A8F5999C1C6E517EB3FE584F5D10059910E22F40FBDDB709C9F686F51ABF7D7206A8BAB4A346B51523C362D749238D7EF6671A89CD86A8540604F134D760267E91EB92FC0FC275CAB69C776EF81DBAD35027E5307F1D34EBF5D6E4DF424D709666A1E649C044C4930098B2E6E3782A93976B55073C504563C7E052B6816C07F0FD54A759D2BC189FAC3FF54549FC4DE192EFB58A9E301863A77380967735910F63D35EF5FDBD8751DE4BC6BF2E3095628DC7F67C1F5571D17AA342593B2C7F953C3F0F22DA1862122031BBEAF0D00A029C043304E3E2609C4FED8A7404FA10E2EC846A70EB0E37C5BE61E698CF2296EC1FBE6FED75F6FE3113C23B29AFB5A6D7E3A9E46E2D89D8C06450CEA11492C1A97F7D6BE8FF6C014930043022B264FD32593952BC606F779598631E48EED86EC2A013D8EB866F311A400 - -count = 27 -seed = C33EE43A9CBB4347BFAF71147B7FBDD88D212462CB06FBE695A35402C503CD15732B7D0E8BF829A555B9167BCFA2F2BF -mlen = 924 -msg = C83441B16B39BD7993766E7260D07751AF2F19A41E70689B0EEED0C118D9EF109866AAEF31B2D2962A25A3D1CA999214CDF0EB54598382EEAD64435B7122D275EA8879BD47B41EB64EA908867FD78ECFBE8E992A2636AA7477DE5058179565D3A2CEB8ACE5C0302018043C411D89975A64927B48CB622A13F1ED85CC1113897A68488161AFA1E636EC786A0AA37B928BA88A50164A9EC372523AA9EC8885AA9C95B29F7CA1BBF0652BAC195BA94E976D336B69A9F5346B4C7C81457F802DC9757C7A2435A617317340F764C1A2AE131A716318F00AF0EFA89D3B57D8F31E155598B3944D950D6A1D6485B509358EFB3745B95EDC30DCFF02574F54DFB2D31B259D132D18897DF868115679F06D41102CD4EED4EA290F711148B99B647B8555A4C0DCA1D2D0871C59AB1382A2D6417E6236D71E2BFA1A75CDA54F93E6C087D611878AC7670A04FD7D8CB0993F456E3BC1C3B5898076E22D2D9E0EEBC7D7BB8D142BD2B5F6FA42B40BF676FB69C532D7520A4A105EF0C1337F53D6E9B4BA17F1E76AF4CFDF08F794752D2BF71E8777E2A209F8891B1A53D7BF2A5786B00B9A0CD0FCE79408F26BEFA2535BE188A68201B1514074CD70660971F86E8D3E92790AE7AC591AA7A996149BCDF060C615209FFAB82E6000F41B2A5606FDAF4CD08CAB0C2F1103B2436B1FD7DEC477C6233FBCA3B07A0CA01BF3476BFE5334E32AAA2ED35D5747D673E7BB622E1AA7901C77F28A3AB2197C8B8253A1D28C969EEE73D17AD71C7919E7F217BA2BADBD1EBF986CFE981024FC347028C1109CD4204C7D53535A9B677E39A43193E054D0FD68104D88934DC7BA6CB3E942AEC744B935CDCFEEF4221784F96798E650FFB0FEBF2715D75339D0CB6C2E57C1E9D10F13E6786B7F041AB307B8CFA51A2F10B622995230FBA54B70D94AE278EC224D9D0950BA97BEBA7EEB0E2FBC4093E548D9EC09CA1A08E5F0483024D7C1927FF8DC270900D42D31B81B13A29839BD746CBB3591BC33817741A31DEA308F549A74F3A4E5478844183B8D7363AC1F4D4A5E907D9ED98AFD08FB8BAA84C324563495387A4F12C239FB63F0810447131311B2D2CA302C7DA2DA57C94C3B5E844F537886FB766EC0E977254DBCA8FC84AD77430428F0692E55D8E2CAB294B857AB51A2CE4A725433DF28D9CABA86C770743AD987BBA58C0565BD18590931E283292889294B607A5F19D9E905AA3940836E2A74A2E94FF3062E85A5C6C978B5EB2B254BBCDE128280E6CF02C11A0C2066F349E3C6C083965D5B8A9C000E15FF36C5BF3A6D42 -pk = 66D5FEE2F267478778663A6C1A1E56373893B76EB805ED259AC974B6F448BB29731650D8D7659E3F7C82B0584A3983245644B0F0EA67517EF616867B19A6DF2F -sk = 66D5FEE2F267478778663A6C1A1E56373893B76EB805ED259AC974B6F448BB29731650D8D7659E3F7C82B0584A3983245644B0F0EA67517EF616867B19A6DF2F020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D12DD80A8959C15F435AE36143F4EC3B8A18B96B7B89E178AE88CE0CC6E156F15D009163400B74A9C47377A96E2503000000000000003A2358D9F97158D9FD3FB4856C287E458BDF0B08A4206039BBB3D51F19D60B3F42346A39B89E572162E13FE7C887FAFFFFFFFFFFFFFF324A3055A057EA272F4BC540F59C3DBCB9105A2B71041BC0FDB085BBFE3BFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71B4B00C7309BC110D4A3C58700C77115D5EB67FA25E4A91E441911DB90100000000000000000000000000000000000000000000003A620DDFA841FE44A58CA1561FCD81A8030AB11652EF4A431E4D55C43AFA0F21AF257EB67F0075FC36F584E8DDED0394092EA08C6567A4C4AF75C135782179324A53835D789AC541EADFC16F3A2FD57B14900B97BC5816F2D8D0B5D2A6F21B058F508F3959D63A4600DD74D5F72F2352CCFC506ACBD8FF5514E1EC1FAAB09602CAF6B299A095953D56D6162AFBA7919AD1FBB36D97F2DE0074E84D036215210C1D34514FB7F0D43AFDC49C778FD01A21FCA921A0239549FE521D7BD8FFD65609313EFA9964B71D5D01C7A1E81F80DC8FFA0391DF92D1034E513D3C0149790B107BF5CB2B7C3C8A6EE2BF53050A809A8DF9294D3C8BDB15E55F8AF95A2097EC260E98E615CDC5FAF9486E94B9245740899477109BDCF9F515481B4DEED133B115C3F577725BED7BCE42614DA70CF7FA5F0B0288B822212796D9BD269F99AAF532D30F1E18AE4F1DFC8E75410CCB0734ABA511F4122F2FE6D32CC6A1F087AF92137D256580D85442F7E63D7079AE6AC7E2F59C3874A9C340420947CDD13C5F7415223D6CC2A57E159C329C5F6F117BB74E4D19A148CF555FED0C82AE8EFEA3D414AA962AAB4DEB15EC290ABA0220F37D7C71E2CB07CD64303C0FDBC087ED70A22D -smlen = 1101 -sm = 859E9F6E83E5D83B7D035F3DDAB73625CEA779047B43D47CD1CA12DE19036CE9E8B8D240D60405048321E0E4BB513B599900BDC22361A79B0838E7075CFD6CE6EA16FAABD6026C32135E26DEDDC84A03CD9E90E2DE96BB835F0511D370E849F6A1286F04B1EEBC4A127552B6D902B87486EA7DEA509A46037DEA259A6A0D2C62EA0544E78E60D42B1AFFC70001E1E47B84D7E8CA4083EF7412D1B331010C03B41FBF61BA9ADAA18A072384C7AB0480EA00C83441B16B39BD7993766E7260D07751AF2F19A41E70689B0EEED0C118D9EF109866AAEF31B2D2962A25A3D1CA999214CDF0EB54598382EEAD64435B7122D275EA8879BD47B41EB64EA908867FD78ECFBE8E992A2636AA7477DE5058179565D3A2CEB8ACE5C0302018043C411D89975A64927B48CB622A13F1ED85CC1113897A68488161AFA1E636EC786A0AA37B928BA88A50164A9EC372523AA9EC8885AA9C95B29F7CA1BBF0652BAC195BA94E976D336B69A9F5346B4C7C81457F802DC9757C7A2435A617317340F764C1A2AE131A716318F00AF0EFA89D3B57D8F31E155598B3944D950D6A1D6485B509358EFB3745B95EDC30DCFF02574F54DFB2D31B259D132D18897DF868115679F06D41102CD4EED4EA290F711148B99B647B8555A4C0DCA1D2D0871C59AB1382A2D6417E6236D71E2BFA1A75CDA54F93E6C087D611878AC7670A04FD7D8CB0993F456E3BC1C3B5898076E22D2D9E0EEBC7D7BB8D142BD2B5F6FA42B40BF676FB69C532D7520A4A105EF0C1337F53D6E9B4BA17F1E76AF4CFDF08F794752D2BF71E8777E2A209F8891B1A53D7BF2A5786B00B9A0CD0FCE79408F26BEFA2535BE188A68201B1514074CD70660971F86E8D3E92790AE7AC591AA7A996149BCDF060C615209FFAB82E6000F41B2A5606FDAF4CD08CAB0C2F1103B2436B1FD7DEC477C6233FBCA3B07A0CA01BF3476BFE5334E32AAA2ED35D5747D673E7BB622E1AA7901C77F28A3AB2197C8B8253A1D28C969EEE73D17AD71C7919E7F217BA2BADBD1EBF986CFE981024FC347028C1109CD4204C7D53535A9B677E39A43193E054D0FD68104D88934DC7BA6CB3E942AEC744B935CDCFEEF4221784F96798E650FFB0FEBF2715D75339D0CB6C2E57C1E9D10F13E6786B7F041AB307B8CFA51A2F10B622995230FBA54B70D94AE278EC224D9D0950BA97BEBA7EEB0E2FBC4093E548D9EC09CA1A08E5F0483024D7C1927FF8DC270900D42D31B81B13A29839BD746CBB3591BC33817741A31DEA308F549A74F3A4E5478844183B8D7363AC1F4D4A5E907D9ED98AFD08FB8BAA84C324563495387A4F12C239FB63F0810447131311B2D2CA302C7DA2DA57C94C3B5E844F537886FB766EC0E977254DBCA8FC84AD77430428F0692E55D8E2CAB294B857AB51A2CE4A725433DF28D9CABA86C770743AD987BBA58C0565BD18590931E283292889294B607A5F19D9E905AA3940836E2A74A2E94FF3062E85A5C6C978B5EB2B254BBCDE128280E6CF02C11A0C2066F349E3C6C083965D5B8A9C000E15FF36C5BF3A6D42 - -count = 28 -seed = 19CB4BE2332F7FF0C078BC001FAB3C5FD8569A76EBCE373D1ED4FC8EB5D744C6464E2B5EECB9EE836CD5D87BEDA78BA7 -mlen = 957 -msg = 86D27C1FCDB8164F8909073F590D0A280E5EF193B0C42863BA518BC8A51E625658DBE2184C3353FAEB674C991EED3F1B0FE3BBE50A21EC70E9F57B97C38D6E436D3DD577D7056B07A401FF0EBBBEFAF8212B993A39281190E309ED0C50B269E4852DEA85432A5941269FDF63766B21D25D8816DE5E87FFA051009D232D6B258C5F43F45F2D48BE09B2CCD8FC963FAD81FB368502057AFA7C865D62D932F652802A299295B29411439DCF832E8367A749B4D7ADF7E8ABDE3EBFB844A9B1D32F77B2BF96B5D29FC15DAE83EA80A990AEF6590776CE1CB81587ADA80B9A7B45ACA3BBC54DBE67DF090104FA196701280B97607A333A9B56A728710CC1CBB7569B79FF034572495181A92D2380A7EE5E9CD1B0F758C2BFBCC4E11464F1CC7D91F117319C30CCBF4C11E60B5DEC724225B8D77B71AA58F5FBD498A3F49115687D58393BE648805BA1737BB921A08D738243920C3834F8782A8256B7DD22CCD5F4ECE86B8A0860BFF21C5C8F0BE987F2D510ED4DF9CF94BF698680B7CFA22A575A3D1B5B431734B59A4B31913019C1F42DCB76A9FF32BFBC6E16D2FADE26E3C17BAE49CC415E4B370D1FB43FF652BE62D18B0AFFDF286765F4F30FC8D6F2C4A58CD17B3BDFA013BB2DAA075BE5F522EF9BFC2E1506CC1C4D381B3342EDC19C955A5FE48A712AF5ACE66A028D03FC859711C9D33231E48D41E58A2C2AD81DA77529AD5E6B73E1AC96F0C8E53F153FAEA7903F917492A1D2B1203174A08551FF0F9F91E32BD0F31D606C80A505D5EB55265542DB3653C2621E7EB3FD677F49534F261205F834EEF1645AF419EF6BE5CFC16D54C7EEEA12D2EB9458831F77FA558E4D5C7FE446DDAAC3E1D502C941C95F572AD545ECC7CAD21F0DD50845CBDEDF589505FD34CD8C00D57243C3AA3615D84C39B0A72C28F40AC72DA25EBC6987DF5A7E390399463786E75D524FFB6C961BBC9301264BFE3C699101D18ADA4A72D193971D54089E6FFFA684CD3D77570CE0BB9179A156D3E2DCF266358499BFC158AC9A6913F622CA861C968EBBA0A59A12674BFE39389A2125A02563B082259483E80C89A3763C0A9C3DB485AEBF22C844539EDAA28A3FBC0053EEC475679B741D9AFC16B5FA109399FDD1FC3574DF8A1292B8D7401AAC1BE452D38F97D531813369EE4C50F36736B95AE9C3E4F91AE85E2D664337DAA40F75CCED2F4A4D210BB4EE25A56DC217DD176DB5ACA43C002AFD63ED8712D89E266674D9736FE4A9F202A81D177970411DCCD289B25798272D2647CE6451906A4F7D46E87A46CF6CD048B6BDB62488A24F48D1EBD61FFA474321B929E0A7B6F9D0F6D777ACC14815F343E1 -pk = 50681F2E925FF5ECC548E9D6CF04638EDBB14D297EDD1D78F80C11FF977FB70F0007F6C2286801C1C5543B6CF0AFE3CB9D666D20A2EA9152B4801292AB1E1215 -sk = 50681F2E925FF5ECC548E9D6CF04638EDBB14D297EDD1D78F80C11FF977FB70F0007F6C2286801C1C5543B6CF0AFE3CB9D666D20A2EA9152B4801292AB1E1215020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000399EE08B177DB690EBAF0B1D119DB24E842446E91E61ADFE1DDE44B98786564288954AE321BAE117E3A10BBCC63200000000000000001A115DAA6ABF4CFCDEAA6D464F27FE9D91434D7E0B130A00B1CAFFD49D8D0AD22B346D49ABCE724E621B362F9FA2FCFFFFFFFFFFFFFFBA6C4E41C49B1460F9600073463C9F861285FED070C416C2D006B361022EFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07AC761654BD9A4C0B377287AFE0C92BE73B310EDCB47342250EC4E8099D090000000000000000000000000000000000000000000000B6F450812ADC4DE3104B2594242C45027124CD684A9ECF867BF9E81287C78F04678F9556FE9C58938AB89D3E0B3235FC9B43F3A83332B0E709459BB119ED6B052B6F0C91B9FC2CCFFADA2F4D189F91579A762F1AAE7C348FEC5D7CAF6E24E913055E55987E2A76D98CFFDB97ADD0E3089DAA38EBA61A8B06E14A9BE75209822FD94C2972D9A0607D02A0A24E5D6E4A0893D49AB065D86D5E2D675B2CF7FF8A341230A56908E250749AC8B2EA9FAB6CD854F05B2773712F6CEC157F538C12F30A60AB429199E13FD0BCC9F3826E7D4359948B3C8F060870AFED7F75B89FF7570914ABDDB8E3A8FB9BE3EF1F6C09BA91673A0A6C98A1FA548D62CD1F4EDEBD2B2C5EC35A11F032AB692E377CBFF63D893A88C2442B210F0C4DE86088D850AE941ADFB720C835A74C549E74B457B9FD432167FC44D3E32FF855F7BC6008C703C51681F6554E112D1A9CCF28EA6DE0F34024B5F42194FDA7D2A3E4DF4847C35E4E11079344CDAF8244EF85F4FED777FEF84F6812A2DF6E21949B454C4F9B22B7DA0DB5451803C39FD88D7AAACBE39E01FA25052FEF4F1E411BAAF7820249E3FF1D1DCDC36B877DC4AF90048C7DC4EDD90A6018A294111DA5443C4329AD541F159101 -smlen = 1134 -sm = F0677E86BBEBA232140187B66C4AE55AA71FE407D72700D515837946A503514971F0C027B0848F07D068D1CAB7CC086DB407DE09878F0AC21F88240721738518B3A01E753607AC393E94CB33C973F305CD48D736E070E1D8DA00393CEC3B8DACD0DDD8053A041AB65A8E1BD81F0121D246A511E9F81F90073EE4ECB3156E71C523000B5A03A7188A75FB620001EDAE30EE00324246447C613934433A850E02689898D18E3F4AB91E0411B4F01D9246820086D27C1FCDB8164F8909073F590D0A280E5EF193B0C42863BA518BC8A51E625658DBE2184C3353FAEB674C991EED3F1B0FE3BBE50A21EC70E9F57B97C38D6E436D3DD577D7056B07A401FF0EBBBEFAF8212B993A39281190E309ED0C50B269E4852DEA85432A5941269FDF63766B21D25D8816DE5E87FFA051009D232D6B258C5F43F45F2D48BE09B2CCD8FC963FAD81FB368502057AFA7C865D62D932F652802A299295B29411439DCF832E8367A749B4D7ADF7E8ABDE3EBFB844A9B1D32F77B2BF96B5D29FC15DAE83EA80A990AEF6590776CE1CB81587ADA80B9A7B45ACA3BBC54DBE67DF090104FA196701280B97607A333A9B56A728710CC1CBB7569B79FF034572495181A92D2380A7EE5E9CD1B0F758C2BFBCC4E11464F1CC7D91F117319C30CCBF4C11E60B5DEC724225B8D77B71AA58F5FBD498A3F49115687D58393BE648805BA1737BB921A08D738243920C3834F8782A8256B7DD22CCD5F4ECE86B8A0860BFF21C5C8F0BE987F2D510ED4DF9CF94BF698680B7CFA22A575A3D1B5B431734B59A4B31913019C1F42DCB76A9FF32BFBC6E16D2FADE26E3C17BAE49CC415E4B370D1FB43FF652BE62D18B0AFFDF286765F4F30FC8D6F2C4A58CD17B3BDFA013BB2DAA075BE5F522EF9BFC2E1506CC1C4D381B3342EDC19C955A5FE48A712AF5ACE66A028D03FC859711C9D33231E48D41E58A2C2AD81DA77529AD5E6B73E1AC96F0C8E53F153FAEA7903F917492A1D2B1203174A08551FF0F9F91E32BD0F31D606C80A505D5EB55265542DB3653C2621E7EB3FD677F49534F261205F834EEF1645AF419EF6BE5CFC16D54C7EEEA12D2EB9458831F77FA558E4D5C7FE446DDAAC3E1D502C941C95F572AD545ECC7CAD21F0DD50845CBDEDF589505FD34CD8C00D57243C3AA3615D84C39B0A72C28F40AC72DA25EBC6987DF5A7E390399463786E75D524FFB6C961BBC9301264BFE3C699101D18ADA4A72D193971D54089E6FFFA684CD3D77570CE0BB9179A156D3E2DCF266358499BFC158AC9A6913F622CA861C968EBBA0A59A12674BFE39389A2125A02563B082259483E80C89A3763C0A9C3DB485AEBF22C844539EDAA28A3FBC0053EEC475679B741D9AFC16B5FA109399FDD1FC3574DF8A1292B8D7401AAC1BE452D38F97D531813369EE4C50F36736B95AE9C3E4F91AE85E2D664337DAA40F75CCED2F4A4D210BB4EE25A56DC217DD176DB5ACA43C002AFD63ED8712D89E266674D9736FE4A9F202A81D177970411DCCD289B25798272D2647CE6451906A4F7D46E87A46CF6CD048B6BDB62488A24F48D1EBD61FFA474321B929E0A7B6F9D0F6D777ACC14815F343E1 - -count = 29 -seed = 6BD93FD13C0299B3EC7403638673F3DBC449F3A617B691DDF73C072B62BF028913375D7460BED2CF9FDCA517690CBAC3 -mlen = 990 -msg = 56ED7708F98432FBC623424C2A3634780470A01784BECFF01BEA5BA192D02C33675084263C4315420A009579EF80DD15ECCBB812652421872A9577EF7D07896A727A64141BAE7173426DD5A3925159BFA927FF1039E70F729847B48365B4D3551476206AA049BA5AE8F605847AA03965F058FCFD478961EBEED06530ABE900042321059C297DACFE76CC12D52311B2FF8EE1231C77049E232D9FDB751FB27EB7EB6A373B4B1C06BD0FF46B1B208072C873E6F938E689839079E48C6D18F678769F5F28A903467F2FF2A8B02CB19DF675A8FC7560A7D38A918AB8BE083EC4E0EA148517AB90F38394833304F245BFFC47F9ECA771FB80B9C71CCD05FC3B0D66EB06D24B914B63D9F16AD2F2BC454B591D01ECFC527277AE71E3DC683161A53F129743F3428FB82A89DBD5D42F3EED237CD2F8D76DE2E56A2143AC6B2BA811F745CC72132028EECD4412B76FDD87A2E396ADCE72DC69B8FE053042E798B220974587AF96BA419DA6888B13FFE217C9D01434347F4162FD554B760883E8EB1AEE46C4C26B990C6BA10D2D939F513BF0EECADE8B5DEB8DE2BC8C8894ACA51E65AA696E390C11689F1C2CFBB70BC5F72C1872D99BABE8DE8FE2DBB446A8129AF0AB8D9613F0CBF3CFA6EA3CC409F4A97581D5012707756994B6C8D4FE7F64E0F0B85A85D0A5FE23224DFD7ABEBA8E3FB2E97AD87FA8DD477ADF48F64FAF486D0DF11AE9C3BD3A04ABC962C5B02CDA02D48F0B52D84D4920C116C22455DF291A96E6ADFF91E3CD35CB8B5B4E70E3DA8B87CDC969643A32B1F97131C5E0BAE7F6DFBFAC32218EAA596D444574EE85EF7C9998DC1088E5813D50A4377D29506817E4234F68B32AD68E00ADBF6462F8D4E215F15A19DFDE452F0A65360F7C1F20E11C42EEC55565CCB23CE248BD62E9DBE8A7D6639028A92B422AB444C5688B5D191A4BA8956F358D131E2FF6DFC607ACCC5D31AF9678F1A226530078FF9A73D681DEB697670DDC3E9096AB0FEDAB664473DCFFEDF9BE62A5C7C54FA2EB5059E9A1D38413B1A4FE6D531B799453BC7185ABAF78CABCF65F365B00827CEC5F29C4737047E3B2932A78757E9626A958486D1740ECF1EC17A01AAE6ADEC5104EB934F432207CE31D7096ACB3A0FE2F5DD7890C021892FE7D3F34596CF20B6B12FD55911ACB46D7386F99A9E9EE067A45C6A1FBB463E63D69CB582DA6EBD6330F4F80A1FA72F2ED24CE9BBCD967118CFC7E21F6BFB68A905F532BCF8B8BEFA03295D362B41D25CDCCFC9B41767858F651BC56AB2BB4A8675513C5D6F1C943A20A27DD29F941AD141DEBAAD219E056510BC984063FA0F389090D434157438BB1759690C453A2F55F72C033797A4B0C534EA2EA084B3B6F8966AC56B106FCC11EF08902F2ED -pk = ABFEDD9A63633BFCBFCDA05BF2ED4B19234FDE4C2F5A974D8DC3C774718C162E491844E83FA9A22A135BCC86233160CD4413982172578ABE73D6672FFC9C9F2F -sk = ABFEDD9A63633BFCBFCDA05BF2ED4B19234FDE4C2F5A974D8DC3C774718C162E491844E83FA9A22A135BCC86233160CD4413982172578ABE73D6672FFC9C9F2F020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000320D76498878B225C45FD8739BCCA720540D464B9DE59F4BDB82A0067F3505BD6766676D107A79D43597801C7FFF0200000000000000F1C3B0DEA1A8DE8ADC7540438C508E94C5E73BC161922FABAC16A55E17650EE5EAA0DD45633C6475887B72C39C48FBFFFFFFFFFFFFFF2FE1BEEAF7A5135F1938CB11595D932142A27DBC6DB7A49636888FB8C98A000000000000000000000000000000000000000000000000FE1FEE7224D432DE2FB54A5C62755D4713E613EDC65DF5A87EDCA53165AE030000000000000000000000000000000000000000000000FDCF99E4FF2B9F4D3FC19F728F6F12F0DDBD376A7B835A0D143319462D4B342BA6F47CC2AB60025C4B4E0A27D32E2D93E4CA34E4A12805394BDB7CD50C32BC24F25953A76B550DF8798C55B799B8ADE466523E81AEEB85152AFD1AFA69BFF60ADC2C7021A003B8C1E71A51C7B138E669B94CEE6FAB29BC56E30E587FBBEE102B41D418A89B3F6A3A5724AF944D4CFAC54E4773D512BEE74D0E09DB85F6B7CA093B1360DF9549963B6BD72F349CAA2EDDD914702FBFF8159227AD684B814924110D2F4D0B9573B9C4795ED0D070FD79880223E15C5C54C0FEC750E36B6605140692E31C8456E1ECB62B559DC5F7BE03EE79C02F860A448B7D23205F1B2A443424560FFA120ADB06D1EC14C25CD44465DBCE9152FC8B6AD12ACC2DD1A1934656049FC692DD3E7252571FD217B930DE7C4829178A31030594E5E0E3B676FB4B9D1A62DB054AC699DB131C1E2AF6DFBD98A20F945A88C7F96AA0FE69609BED9E4B294E257280E6661CA1B4C4872287D1E25C7ED283D75D76A6FE0708662EF2334A23CF7EDD262E7CFA11BC7E88B4B6BA340684D5E01C55264B4ADC04D04387AC4C0E09ACDA3C7627A54B44D56672A6C596BB35BCA4C74D7976D681D331E94AF5261A -smlen = 1167 -sm = F60E3EFAF1B484C85102E7A22D4D4465476EBA00B48DE0732B054F489E06FF0A933FF6D1E4D0650045C5DE2E8F4BA15BCC026F8F959B420DF26D4503E78C63FF906EE144CF057FB944D5B4CE7EFF5202F190E39223C17D758D0557D13199A9B8B39FB6066F8761F02E040733B8048BEDB74D01E047772801DBD209E87A130105E10406AC846A9E7DE8022A050097D409E24E280EA6857665FF01FBF9EE03036AF5BB052BA0F9F9E400FA35C7533CBA600156ED7708F98432FBC623424C2A3634780470A01784BECFF01BEA5BA192D02C33675084263C4315420A009579EF80DD15ECCBB812652421872A9577EF7D07896A727A64141BAE7173426DD5A3925159BFA927FF1039E70F729847B48365B4D3551476206AA049BA5AE8F605847AA03965F058FCFD478961EBEED06530ABE900042321059C297DACFE76CC12D52311B2FF8EE1231C77049E232D9FDB751FB27EB7EB6A373B4B1C06BD0FF46B1B208072C873E6F938E689839079E48C6D18F678769F5F28A903467F2FF2A8B02CB19DF675A8FC7560A7D38A918AB8BE083EC4E0EA148517AB90F38394833304F245BFFC47F9ECA771FB80B9C71CCD05FC3B0D66EB06D24B914B63D9F16AD2F2BC454B591D01ECFC527277AE71E3DC683161A53F129743F3428FB82A89DBD5D42F3EED237CD2F8D76DE2E56A2143AC6B2BA811F745CC72132028EECD4412B76FDD87A2E396ADCE72DC69B8FE053042E798B220974587AF96BA419DA6888B13FFE217C9D01434347F4162FD554B760883E8EB1AEE46C4C26B990C6BA10D2D939F513BF0EECADE8B5DEB8DE2BC8C8894ACA51E65AA696E390C11689F1C2CFBB70BC5F72C1872D99BABE8DE8FE2DBB446A8129AF0AB8D9613F0CBF3CFA6EA3CC409F4A97581D5012707756994B6C8D4FE7F64E0F0B85A85D0A5FE23224DFD7ABEBA8E3FB2E97AD87FA8DD477ADF48F64FAF486D0DF11AE9C3BD3A04ABC962C5B02CDA02D48F0B52D84D4920C116C22455DF291A96E6ADFF91E3CD35CB8B5B4E70E3DA8B87CDC969643A32B1F97131C5E0BAE7F6DFBFAC32218EAA596D444574EE85EF7C9998DC1088E5813D50A4377D29506817E4234F68B32AD68E00ADBF6462F8D4E215F15A19DFDE452F0A65360F7C1F20E11C42EEC55565CCB23CE248BD62E9DBE8A7D6639028A92B422AB444C5688B5D191A4BA8956F358D131E2FF6DFC607ACCC5D31AF9678F1A226530078FF9A73D681DEB697670DDC3E9096AB0FEDAB664473DCFFEDF9BE62A5C7C54FA2EB5059E9A1D38413B1A4FE6D531B799453BC7185ABAF78CABCF65F365B00827CEC5F29C4737047E3B2932A78757E9626A958486D1740ECF1EC17A01AAE6ADEC5104EB934F432207CE31D7096ACB3A0FE2F5DD7890C021892FE7D3F34596CF20B6B12FD55911ACB46D7386F99A9E9EE067A45C6A1FBB463E63D69CB582DA6EBD6330F4F80A1FA72F2ED24CE9BBCD967118CFC7E21F6BFB68A905F532BCF8B8BEFA03295D362B41D25CDCCFC9B41767858F651BC56AB2BB4A8675513C5D6F1C943A20A27DD29F941AD141DEBAAD219E056510BC984063FA0F389090D434157438BB1759690C453A2F55F72C033797A4B0C534EA2EA084B3B6F8966AC56B106FCC11EF08902F2ED - -count = 30 -seed = 1787C82DA9F2E6CA9ACF7D6CCA70116A1724902C81EDC1439F332C74807AF2BCCCCDC7AC1788BA798520B2999F39DC3B -mlen = 1023 -msg = E42C006F144B0B4E188FEBC82D63D3D37096DEEC9D3DFC3B421635DDDB73C76F6260FF1C53222A50D30B26E2DE3D16E3AA64C78604E1191BBC0E2553117A441159B2A35FC8889499A2EFBDD2F30B8B4C6CEA38EB5B2575926E6F22AB96DDB4B0C5C6D78C3754A1B6DEBA49FFBCFA7477BE9A0F74EC379D1C9AA59247C091611573AF765AE698D78152187B291717A9F03FE767BCBB12F52311215579352E7CEAA8654B5403F18CE82E0A73BFD5FEC1063B506F44EB1C9C5A03697D03DCB2AE15C5095F292B4BCB130B55C19AB728B3232EF77D1594611573CC6BDAA254F05934A329DC27CFA6CD8C02CB51C3C295C964C40502FE2B1A81A51C866F7C7380BFBE339B39C8F51F73722A05B5D1E9CB6313557B3656863803C9DC99BB1905D7F729B2DB8DA23D88200032F36FFD04DA11FFDF6277ACC69C5407289D00FDC3C56B32D54877F4A8DC70ABD37EC532B8617D9F3C535B8E962FB389E976B4D1AA12DE5C1C2FFACD50ACFFF65201104648E0C04CF7C1F880E8BDA1D68404BA67C4BF64C9D2ACEEF81B35FABCE58645E0F2F61EB4CCFEFDE7239BE408710D349987D849D40B3AD294B9D815A91848F9ED53B69F78D9E955F6D1FD7E38EC291664D54C2BC359FBA241BA6ABCBF5FC2502D93760D9F6B1F7FB766040E98BDC23A6047134A35327FE128AE24B4C7D0CDCF1801947A1821DDD7424892DF50E2DD5C1E2E6C5BFB4467524FB45C7D977604E7E0F1F98EB8C03EEE1D9A5796C8A801F082678940F076BF44D3496730C9A640FEFCE385865899FC33B5DD34D036F2FD5D07FDC0A40FB725E84CE403B46DE712B4B44CA8801A1CCF58233C5DA06719769823B5945849DDABCA56B0B4EF9327C8B5E5A445E6853E5B66B8D590759D6B2DB722C22F8C741CF3C6325A76D93F4FDE5872D5732FB19AAADEB7C18094727ED43B305B87AE2DBAAD67F90FEB86498CF65CC57EA635340F27AE5C5CD60AD3C763223AF877E65A005C488AA4AF9309E1AA02002B01DF8865FD481EA254015796985969997A53B06DF0355A6AB3C8219B652B09E1F86A6CA12D27C4BCB9E8D35E6889198C8FED71AD5642F5F9F7CE1DF270D68AA05467EF9ACD9A51347AF1EE9CA7C4A5D78189042900C6D561F68D410A77E79726DC123B196C78829F02CAE7D0623BFE9E7B0D8BF84033086295992B77ACF027489D51BC7FF006A8D4AB8079D494413A565E7F687AF40DD18B86AA4274EDB8845DF114C0146DE3199CB55F773A87FFB126B3A4D00D38835CFD2D6652C07F572F39D0397FCD62ACF6ED9F3E8951348AE7E52A669FA4E2BFCDA548ABB1989A1D74A27B73103770290E6ECAC87029359354EE4C87A77BCB5CEB10162DD54499905AC8ED442C173CACDE068BC546720D1284015ACB90CA19147694B53899395DC663D6683908F3CBA29AD37F15CD3903C4C7F4BD73 -pk = 35F372E13ECE4F496B7647038835DF7B9853C8BECA8364092DF55D412AADF90EE77B24E784255B123F21F4AB2EC1DD382526B651A742BD2AEF8CF889E871F133 -sk = 35F372E13ECE4F496B7647038835DF7B9853C8BECA8364092DF55D412AADF90EE77B24E784255B123F21F4AB2EC1DD382526B651A742BD2AEF8CF889E871F133020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000997E94F6BCEC1DCCAD84804C5A484F248261B74B64064084B4D449D1B6CB238E4736F2C31201B8B85B4514C2B7780300000000000000EC42A46D1B3C065D308C6CC3C71B671FE846EF47BE39FC3E7A2133C86E8C03C71CEDFADBED3E54A827B4A28BB9D0FCFFFFFFFFFFFFFF78962684B8304D447DB655BF40D03A549A248E822E1F0BBBD93A51C8F063FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61829554DB736549AC19D49E21F734766B3DD3E0AD05C5A8B29AA3CF54C4060000000000000000000000000000000000000000000000DB604675174B3298E467B10E68F274DD80118E89B6B684F90BAEC059A8C2CA012B38BFAB9B48D8BBD4A8D4C10E6EBD21ECC778C8D426A7360CBEC3E6AA8F7233C71AFFF30C742CB6DEFE3C666EC544426FC888E326CC47BE880424C99A0FAB0BD0BB87B43FC75CAC8E1E4A4476BB279898FC7DD2A91435154289E9FDC953FD2E97EC609C11C3AD60F49DCBA0217F6BB749CC1281D492B05223D892796418742549C2EC8AACB4872C3F39F8E0CF53A4B8581C4377237A45C3FB1A1F28F9B60C06C5801B2757C84AA93F54C9CA8D9D2C2AF57E34B92B1471A7CDD3BBEBB7835D072530333A191140A40568A79CEA4146F2883F65551E00D8720B5063E8C770C307514124E64BB96D970F80499834B9F97797A40B4C1D3205AAC9ABD6D60E9626027CD57B3944703EC97C89CF7EDBD6A8487E551C4533E351841EF5AAC740485934BBB5097FFCF03290FAF2F178FA02F6D04355B762C9B807056EF4F749BE8AC0107D6C2E032EABB9DDD373D2A60D976E70D77F3C46287E1C7E7BEB82975F082B06FB3CDF989418C071D24E08101CDBF3FAA10DE7A8B1C7C18E5A4D403698238419F64EABDD9A0424941BD9D100B672C954843E9C6CFAC577BB0AAE12AEDAF88815 -smlen = 1200 -sm = D575A64D9382B7BAD6045476D97B10785E9E6E07C6AEB21105205D0E130493980A681FF7E8E93F02B56AD2F732A6313B20033F9EBE78560C43399102B98F1DEB32F83CC0FE047D047D06F580075E30068D35AB7278A153105200DACAB6985053FEC9F800FFFCB9D8D177805EA400DD691CF376A1EF94FD0057E8AB09F818CF2F8F0342AE6463D1E1D9351E070193203AE7844FC9072DCB2F93B152F0EA0A03F69E3D25CA06604846068779B71DB9F72700E42C006F144B0B4E188FEBC82D63D3D37096DEEC9D3DFC3B421635DDDB73C76F6260FF1C53222A50D30B26E2DE3D16E3AA64C78604E1191BBC0E2553117A441159B2A35FC8889499A2EFBDD2F30B8B4C6CEA38EB5B2575926E6F22AB96DDB4B0C5C6D78C3754A1B6DEBA49FFBCFA7477BE9A0F74EC379D1C9AA59247C091611573AF765AE698D78152187B291717A9F03FE767BCBB12F52311215579352E7CEAA8654B5403F18CE82E0A73BFD5FEC1063B506F44EB1C9C5A03697D03DCB2AE15C5095F292B4BCB130B55C19AB728B3232EF77D1594611573CC6BDAA254F05934A329DC27CFA6CD8C02CB51C3C295C964C40502FE2B1A81A51C866F7C7380BFBE339B39C8F51F73722A05B5D1E9CB6313557B3656863803C9DC99BB1905D7F729B2DB8DA23D88200032F36FFD04DA11FFDF6277ACC69C5407289D00FDC3C56B32D54877F4A8DC70ABD37EC532B8617D9F3C535B8E962FB389E976B4D1AA12DE5C1C2FFACD50ACFFF65201104648E0C04CF7C1F880E8BDA1D68404BA67C4BF64C9D2ACEEF81B35FABCE58645E0F2F61EB4CCFEFDE7239BE408710D349987D849D40B3AD294B9D815A91848F9ED53B69F78D9E955F6D1FD7E38EC291664D54C2BC359FBA241BA6ABCBF5FC2502D93760D9F6B1F7FB766040E98BDC23A6047134A35327FE128AE24B4C7D0CDCF1801947A1821DDD7424892DF50E2DD5C1E2E6C5BFB4467524FB45C7D977604E7E0F1F98EB8C03EEE1D9A5796C8A801F082678940F076BF44D3496730C9A640FEFCE385865899FC33B5DD34D036F2FD5D07FDC0A40FB725E84CE403B46DE712B4B44CA8801A1CCF58233C5DA06719769823B5945849DDABCA56B0B4EF9327C8B5E5A445E6853E5B66B8D590759D6B2DB722C22F8C741CF3C6325A76D93F4FDE5872D5732FB19AAADEB7C18094727ED43B305B87AE2DBAAD67F90FEB86498CF65CC57EA635340F27AE5C5CD60AD3C763223AF877E65A005C488AA4AF9309E1AA02002B01DF8865FD481EA254015796985969997A53B06DF0355A6AB3C8219B652B09E1F86A6CA12D27C4BCB9E8D35E6889198C8FED71AD5642F5F9F7CE1DF270D68AA05467EF9ACD9A51347AF1EE9CA7C4A5D78189042900C6D561F68D410A77E79726DC123B196C78829F02CAE7D0623BFE9E7B0D8BF84033086295992B77ACF027489D51BC7FF006A8D4AB8079D494413A565E7F687AF40DD18B86AA4274EDB8845DF114C0146DE3199CB55F773A87FFB126B3A4D00D38835CFD2D6652C07F572F39D0397FCD62ACF6ED9F3E8951348AE7E52A669FA4E2BFCDA548ABB1989A1D74A27B73103770290E6ECAC87029359354EE4C87A77BCB5CEB10162DD54499905AC8ED442C173CACDE068BC546720D1284015ACB90CA19147694B53899395DC663D6683908F3CBA29AD37F15CD3903C4C7F4BD73 - -count = 31 -seed = 9E6E12F025B2A57B0F5A3A9FA70396FC332E1802608E5CA07CC4FBA922F1FE5DEA6721B96F1BA2BFB97825A19F08FF2F -mlen = 1056 -msg = 9C311FF20F574CD9B7BCE1DF705AE7DCE6E7A621C935A6E57A59EB31FC443AB1E014AD332FA784583260AA6153C464565C4568108D60CC126F6E8EC3BC9120E5659C86CDA8A31A7131936DE7B3DB39A4692808DC3D2BEE8A99880FF9D1D5EFF1E825A0F043D908D62A99779E013845AC0C21ABE8E4DF0EE901E4C6BEB8BB36B30228B7756D617A8F30C16351D8FF91786F7406F75D9FB648830F88EA4537F42EAD62E8790E9CF11F72C31D718221049C9AA35376AD8FB065F4809F4383A23C2B29425836C2DBCE4680450896EEADEE6B83539ADFDF59AA4FCE709D601640EB9A22DC3B41108A8EE1FCCDE9945EBB1D3F676EC8395255E125E62A32149C73451F597E1C32AD979E5BE914FFC7C548D6AE92ED08501831E9007770A0233E5778F22ADF7F1AAADF9C9A7C82D2F42989BF21627D3EF8BD0377A5BE5C9F5A585A246A73DE4340E6B43B36DB775B34033962646C16F26A2B7179C40A721FEA54805B9EC42177B42160B1A67341235B5AF9F30B2703BFF8CDEEE5BD7CE506B0707A69F84225B6E5A92E80EDFA235803DBE2CEC47CFEF0D9FAC95C3379816A39F4550BDBFB45609C76D0351DDF8D61724BD5E8BE94673B3013EEBE172CACE247D79925B12B5DBA2F6FB72E797B2DA849B79DEE3DB76775F5F1DD4595678671C7B18BB3749FBB0C6A7135D639F16B3864B5A251114DE7E9F8CB02B4CC69902EC8D7D544D98E24A05F8ACCB182E2EB44BDE868B077B1FAC4726E8B01CDD0D024405665F7ADB60A23FDBACF421246354E824CB74DFB35E57902794E459493905400D0A0BAD51D8EB94EFAD55C67CD0C7CEFE7A1B055F06371AEC7F490FA685C611D553D8430992EE7B1855A9CB305B5CE53154345D7DEF6110DDBDB5CB59559EB664C6439E057DC022F8686F2AA0CA81552428437B0CEB5FBB5DF254036BD2BAE7290D947C963046771A39D2656312236569E775E7D2A041B7EECCEC99C1B9D2757C7370E474012AE707AE00AC37B73ED9C8E1A2774E54BACEB42E8B31BEA734463CC15576BD4F7A33430B1987D62E47473391938312F2481838F286C4DFAF701ECBC6EAB1A9F074C1F8D8963457DFAAC9A9A8EEA70C50CE70D1BA1006760AD3887605EC38861DC1A777D21E46EA169537057CDFE256CC08699D73B1AC4FBC62F863353581CAD358B9C573D77585DF6544E5D55048D66A352828CD1ADF5F42310FFAC022A25824430F741371027B2DC14717DC87342A74F0038674187E478D8ECEFFC16474A4AA8BDA0C8D41962EF2A4B64A036C888CCF4EA628E1CB9EE0F9A918FB1B22B9367FEEEE0218C83CC7E27C5CB2AC64DC7E111E3C85CA0E6BD4F685E5DDD428E028D192142CCEE3F0C8337BDF43CE4B62704AA53C703EC334FB56FFDFB81D7D4419535D17E5FCC0E6F558AD82149C591FE0357DA15660F61544B4041128218B6DE2B75D3801510669A3977E2983BCAF957EE2942E504C29890A81542EA208E1CEC -pk = 9F0E16E8E82B12B366309738AD0BD677E42D2FB2719BE2A6C75C74FE2291D222F982311E860010DE69197888CE56445CB69BAFE07BA5C92454811952877C5F24 -sk = 9F0E16E8E82B12B366309738AD0BD677E42D2FB2719BE2A6C75C74FE2291D222F982311E860010DE69197888CE56445CB69BAFE07BA5C92454811952877C5F2402000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069F137DBF6885D811761EA0F570E6DC48FDA762913A54F5DABBBA4EA5EEB09EB27D2075D9153BB13B3B8C1A67C90FEFFFFFFFFFFFFFFAC8FBFED0BDF80B81F5556AC7DBB47E2D525EF3B1FA39D7466E49FA49DBECBA6BAD70A78FD94CBE3B04C1BC592AAF9FFFFFFFFFFFFFF784DA02B0C4CE473F96851735D669180E3EDC92F1ADCF1F18D5B43AC505EFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB13B29F33B6B11F64B76E9B1F62E0B7F0FBB977C09A778841A7D7F7645640700000000000000000000000000000000000000000000001F64AF574DA5B6001AF36542B1EFD71A7115EB0AF7CB4273692D92B73307A333E6773A202DE4A8406387520DFF7CEA28F0DE96C60B56B07E9B6CDCB7BDA7EF1C351D78A1CD0440F0A6C2EBBD497DD908063DCE573F95190410441BF44FDDED0FFB7A4A723FC035B7649A0ED621C17E3AAC75AB72647B47552724537BACF4341A201A45E21D1CF558AC288411729636872A3CA8BE39A3B349D1DFD88C8D855E30922A032F8EFDDF6E887D27FBC15D550FEFD56CF44256B798220B140D0641E3056CA9AD8AE6BC3B92BAE4BC8EF152E383C5743252743E17D79695E732D2EC8C21C2537B4967B63601A275849A865A0F9759D37C333E5FD7DFAB3BC8AA93AFD014A32EFCF7652CE8C95994345B2A5EF4B455600F9F8C6E8B1A434FBD9744C9D431E533B8E3D0E76C86D07426FE9DD5B4CBE0672E898422A74889AF7D032F6AAF126E4B840AAA443E16C6D2025CD71BBAB5EF5AA8609F3D8B31B7B342D7127B90052D84CE6A811E253907A9D401C3F2E36FFE25C2C55E107B156F8675B93669CD337F2A1D62C55A61CB050CE9906B99893F6CA2A7A72655D0AC2C979F6BE5D63B05FB2F5C249DEA1A27B45552090D9B00C07D56186C0BA3EE042E10188697D3CE05 -smlen = 1233 -sm = E87E6DCCD858D7C27A00A817A04237D417F3F607B8611A2554F388742C071C4CE239C9E8C12AE403CF124D17A0C5C3616C01141267F563A7E850AD00E63B0AE79F3D86522D004F524EEE2A3C013DB007263883A118FB3EFED901C8A5D934647FC414B403BEDA6AA142830D5F000765E05325C6FBDB1A7106FA58E99F16B337FD8B002683C0E3E3DE9ACCA60101B10053D4D73CE813066C010C989AF5F40E0166091AE8C4569C6A9E0498C028B4EF1948009C311FF20F574CD9B7BCE1DF705AE7DCE6E7A621C935A6E57A59EB31FC443AB1E014AD332FA784583260AA6153C464565C4568108D60CC126F6E8EC3BC9120E5659C86CDA8A31A7131936DE7B3DB39A4692808DC3D2BEE8A99880FF9D1D5EFF1E825A0F043D908D62A99779E013845AC0C21ABE8E4DF0EE901E4C6BEB8BB36B30228B7756D617A8F30C16351D8FF91786F7406F75D9FB648830F88EA4537F42EAD62E8790E9CF11F72C31D718221049C9AA35376AD8FB065F4809F4383A23C2B29425836C2DBCE4680450896EEADEE6B83539ADFDF59AA4FCE709D601640EB9A22DC3B41108A8EE1FCCDE9945EBB1D3F676EC8395255E125E62A32149C73451F597E1C32AD979E5BE914FFC7C548D6AE92ED08501831E9007770A0233E5778F22ADF7F1AAADF9C9A7C82D2F42989BF21627D3EF8BD0377A5BE5C9F5A585A246A73DE4340E6B43B36DB775B34033962646C16F26A2B7179C40A721FEA54805B9EC42177B42160B1A67341235B5AF9F30B2703BFF8CDEEE5BD7CE506B0707A69F84225B6E5A92E80EDFA235803DBE2CEC47CFEF0D9FAC95C3379816A39F4550BDBFB45609C76D0351DDF8D61724BD5E8BE94673B3013EEBE172CACE247D79925B12B5DBA2F6FB72E797B2DA849B79DEE3DB76775F5F1DD4595678671C7B18BB3749FBB0C6A7135D639F16B3864B5A251114DE7E9F8CB02B4CC69902EC8D7D544D98E24A05F8ACCB182E2EB44BDE868B077B1FAC4726E8B01CDD0D024405665F7ADB60A23FDBACF421246354E824CB74DFB35E57902794E459493905400D0A0BAD51D8EB94EFAD55C67CD0C7CEFE7A1B055F06371AEC7F490FA685C611D553D8430992EE7B1855A9CB305B5CE53154345D7DEF6110DDBDB5CB59559EB664C6439E057DC022F8686F2AA0CA81552428437B0CEB5FBB5DF254036BD2BAE7290D947C963046771A39D2656312236569E775E7D2A041B7EECCEC99C1B9D2757C7370E474012AE707AE00AC37B73ED9C8E1A2774E54BACEB42E8B31BEA734463CC15576BD4F7A33430B1987D62E47473391938312F2481838F286C4DFAF701ECBC6EAB1A9F074C1F8D8963457DFAAC9A9A8EEA70C50CE70D1BA1006760AD3887605EC38861DC1A777D21E46EA169537057CDFE256CC08699D73B1AC4FBC62F863353581CAD358B9C573D77585DF6544E5D55048D66A352828CD1ADF5F42310FFAC022A25824430F741371027B2DC14717DC87342A74F0038674187E478D8ECEFFC16474A4AA8BDA0C8D41962EF2A4B64A036C888CCF4EA628E1CB9EE0F9A918FB1B22B9367FEEEE0218C83CC7E27C5CB2AC64DC7E111E3C85CA0E6BD4F685E5DDD428E028D192142CCEE3F0C8337BDF43CE4B62704AA53C703EC334FB56FFDFB81D7D4419535D17E5FCC0E6F558AD82149C591FE0357DA15660F61544B4041128218B6DE2B75D3801510669A3977E2983BCAF957EE2942E504C29890A81542EA208E1CEC - -count = 32 -seed = 569B8B9BDB707B19CD6F9BEB29F304D603C1509B9CF25987C280C342E870B1E13EFC7DD7E41DC85BF4F42D0493B84B0F -mlen = 1089 -msg = 7FF38725F35312D75E58845FBC33E112DD95D5C1CF78119CB413AC839377C7051BF5F17ADD1484F5EE12F42B0587AB41DF487BA5E4D8836777B614A9931A5FEFDC4AC451662B342D675C940061C4FF01F747B69CFF585FC5317636E2A830140C0007F73C76FCAB96195C86DB98E5E65C733825DB0325407E5BB059490F2E9133F9B4AA328976256EAAED2FBC59D00288D4830D99731A3AEF36E5BF5239F2899C500F942B80B00C3B33307450FF0C105BEDB7DF84231C5D24C3C3475AE2F46336582DE93AADBFD385C824F21362C19B1C6A75F56B69297FB3084B6164204E2348CB1D7CD3AB494BFA7EC8FE346251C874085F803BD7F4DDE1995F0D3D17033C461D06B49ECCEEE0D5312C3A435AF5BEC9808ACC524599668AACD95ECEA7EF07C4CA3FAB1CF964FDBA987C345046E6507AC3D372BF07D72CAB816BA627C2BD452AB8DC3044A7F0A01D8C0EA47904A5DD66C6B7EF9130D628A4F2CEA5A0D05AEAB7DAF2729C1041FBDB3C2D17BD66AE293C03E77A0837419471C29691EDFB20CF69BC6260975089AA437628F140A44FA2E2967357AC1BF1345E4208C33CFFEDE6CD634B371E7745143FF848F77E5130D1E0F51868585509F9CD3B906EE0A5072CA2E908D6765C74D9B5C35B6BA784A3EA59D808ACBB1C24D6C088CA6C9E17BCEB18337A4DA0C1DAEB5D51EFB35712A475D6C5A2EA51E93FD79F7DEB127F3418F354DF06489E10B42BC1F20651660CAEA17F67F306F48E15DB7E67A1B56578BA7BE6C229FED9567E128D48551E6EEFA17AF5B95A716555571F44FBC41AB29208DB7C1846E130866D5C9BE6F73E601C55610DFD0F67D98933D252059DAA1DEC20AE0E5BED6568A6322322D8A40E6835FA66E317733E1B465434532EEA8FA76886B600E06EFC1DA41F8DCEC0A5E8BA8419F0B7879CC0A93BD14D99608B5BEA931D8971DA8D2D89053E1DE40209E257E741BEF48C17FA15467F1312A368D4A061BFC76C2B7BBD900B4A34DA51B7CB5BD6E2FB08806A53C0D60273167D822FB6982785F2C3B0EC7D893B615724D0193928D0EA8EA2A1DEC5ABDCAA904C754CB7747449E87221B3D86BD5DF26E11DA753E768A8B481C306E485EC91074377DFC68BE74A444906E420C2D8BCCD84BE13AA5CCD11115B669C89E9C0CE374BC4059C696E5F8344FEE467AC8C8ADE37DAF614992914C763D971327B60946943847FB6B82672CC376B780953B6F4433DF69AC61E110FBF1A35F6272561193D8652EBCE3291333FDD4D84B9CFBC60A57E1F8B817E84EA15D440D4A4B4F7E19C08DDFC5949FE8CBDDCD0296A62F12F53D48B1288B80E24C756FC38E2FAE9C7A3315D1C6DA42AE838AFBBF5569F633A68289EB7073BABCB210F4E08856FA65057BFABC70AD3B58C2C870DFB5E1B0D11B6FA6D5BBB68285D8F9C21BD89669781C9F4DC32EB1EF58B80B1D371334D36FA66A2B3DD4B3E4DEDBA7AA9FB7E0245F5FDBB66CDA653C5232A131EC1F0C21DB1C47B990A64A24DC8C4DA951F419F57C03FF506E0147C22E99461 -pk = 638346019196807A6E27912AEAB1FE30DA44501B020B7082B6035C1A400F223189974A605B85AD00EC7EF230DFCA479A6F0B9792AAC7167CA2803ED098C61E2A -sk = 638346019196807A6E27912AEAB1FE30DA44501B020B7082B6035C1A400F223189974A605B85AD00EC7EF230DFCA479A6F0B9792AAC7167CA2803ED098C61E2A020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E12A448CE46075878B7935115B1F9937B8643572680C412A1D97D94460C855853852B3B085DA0F14DF7963E7BE010100000000000000D827DA011FDAE33AD92F5D1DB4B29BDD5E8A5590DEFFC7902A33D412922D6B91BADD8B6960FE5DB3EACC34602E50FFFFFFFFFFFFFFFF30CF9C10ED024A1A7B695C3D0DDEECF419FAF4C4C993875F0FF970EBD9DDF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F646CD29E59967F0BB30B9952902378A8502A20CC8314C5F7284786690F0300000000000000000000000000000000000000000000004989AAA88BB59AFFB3203248BBC15294FB313E41CF95391E19B8CBCBA900AE0E0121732D9BDB22734BE8A003CB84067C5DCEF55D4D1F0E35D2D077B53A10D124E9BA619DC8532F95848E14A75C6ABBF24532A2966CC9DCFD76D7019B884899342D61279DD212006E5E658AA6C2E35B098A9805C6BD31C6172E3BFE297D87922040D1F0C8F14D591A32F2CF9BA79AE6BD02C08772B03DC0E6501FE0BDFC266E2F6EA658902CD878884EA26A1E98F03227E752542B6CDD6DC5378AE431DC728E01A711831939B4FEEAC38BEA8948DEBF9F1D08A27CD62EE0B73BF8349707126C2C00A0FDCDDEEE897922396E7A6ACFA3118210ADB18D88499CA9A8BA466379853055E907FE7DD3AC6B222294C6535947201460F611F3CFFCF58106548D8A1955349672866177040B323054C120C973A1ECE927027D7B90A5028E62D870257C5A0110AA570046CD0B9544B322D62D24F26A9D5366E23DE575DF5E2C9D2C48419825A70D779986F40C8BC4762C02095E700154627D9D9B4253F0F5A42C12F20BD131DE8992D7E3824B1BA745D782A08318DD7A51898DC49C47FFA4F722F867D1EC28BF28561BF905F0949E9D0ED01E701CB8F64A6887C072F8B4AD195A124384092B -smlen = 1266 -sm = 8ABD8DE41B124F65D20753DF1D7A69159CA123011700F859986025C5FE003A362B46EFFFEDF0ED053D5797C890F10C2BC602441CB3B248BD40C17E05D5A7CDF51C84FFD3E606A487201365E84C115A0687336DD3E3946BEE1C0323F4BCCC35911D539504ECF4B5A2A0A6D29BA805C6A5751538F4907EE10727ABAAF39AAB3A43E9076449CE2D5121A209D50001E3B7E412B830EA09823D73EF0F0F81920602E0878AB1C4B56B864D056A31DB04D7142E017FF38725F35312D75E58845FBC33E112DD95D5C1CF78119CB413AC839377C7051BF5F17ADD1484F5EE12F42B0587AB41DF487BA5E4D8836777B614A9931A5FEFDC4AC451662B342D675C940061C4FF01F747B69CFF585FC5317636E2A830140C0007F73C76FCAB96195C86DB98E5E65C733825DB0325407E5BB059490F2E9133F9B4AA328976256EAAED2FBC59D00288D4830D99731A3AEF36E5BF5239F2899C500F942B80B00C3B33307450FF0C105BEDB7DF84231C5D24C3C3475AE2F46336582DE93AADBFD385C824F21362C19B1C6A75F56B69297FB3084B6164204E2348CB1D7CD3AB494BFA7EC8FE346251C874085F803BD7F4DDE1995F0D3D17033C461D06B49ECCEEE0D5312C3A435AF5BEC9808ACC524599668AACD95ECEA7EF07C4CA3FAB1CF964FDBA987C345046E6507AC3D372BF07D72CAB816BA627C2BD452AB8DC3044A7F0A01D8C0EA47904A5DD66C6B7EF9130D628A4F2CEA5A0D05AEAB7DAF2729C1041FBDB3C2D17BD66AE293C03E77A0837419471C29691EDFB20CF69BC6260975089AA437628F140A44FA2E2967357AC1BF1345E4208C33CFFEDE6CD634B371E7745143FF848F77E5130D1E0F51868585509F9CD3B906EE0A5072CA2E908D6765C74D9B5C35B6BA784A3EA59D808ACBB1C24D6C088CA6C9E17BCEB18337A4DA0C1DAEB5D51EFB35712A475D6C5A2EA51E93FD79F7DEB127F3418F354DF06489E10B42BC1F20651660CAEA17F67F306F48E15DB7E67A1B56578BA7BE6C229FED9567E128D48551E6EEFA17AF5B95A716555571F44FBC41AB29208DB7C1846E130866D5C9BE6F73E601C55610DFD0F67D98933D252059DAA1DEC20AE0E5BED6568A6322322D8A40E6835FA66E317733E1B465434532EEA8FA76886B600E06EFC1DA41F8DCEC0A5E8BA8419F0B7879CC0A93BD14D99608B5BEA931D8971DA8D2D89053E1DE40209E257E741BEF48C17FA15467F1312A368D4A061BFC76C2B7BBD900B4A34DA51B7CB5BD6E2FB08806A53C0D60273167D822FB6982785F2C3B0EC7D893B615724D0193928D0EA8EA2A1DEC5ABDCAA904C754CB7747449E87221B3D86BD5DF26E11DA753E768A8B481C306E485EC91074377DFC68BE74A444906E420C2D8BCCD84BE13AA5CCD11115B669C89E9C0CE374BC4059C696E5F8344FEE467AC8C8ADE37DAF614992914C763D971327B60946943847FB6B82672CC376B780953B6F4433DF69AC61E110FBF1A35F6272561193D8652EBCE3291333FDD4D84B9CFBC60A57E1F8B817E84EA15D440D4A4B4F7E19C08DDFC5949FE8CBDDCD0296A62F12F53D48B1288B80E24C756FC38E2FAE9C7A3315D1C6DA42AE838AFBBF5569F633A68289EB7073BABCB210F4E08856FA65057BFABC70AD3B58C2C870DFB5E1B0D11B6FA6D5BBB68285D8F9C21BD89669781C9F4DC32EB1EF58B80B1D371334D36FA66A2B3DD4B3E4DEDBA7AA9FB7E0245F5FDBB66CDA653C5232A131EC1F0C21DB1C47B990A64A24DC8C4DA951F419F57C03FF506E0147C22E99461 - -count = 33 -seed = F32C3715B0BA8C1D0BD59F0645E9697DFCF9AEAF761A71ECDF9672215B9F138C0502D7214F6B1BB4D6612432F9FBED5E -mlen = 1122 -msg = 789518EE21DC99CAC94DD5298B2F3EB8F6AB8D0705D24D9AA3012F217464E7F203E08E5CEA9E44F54A6F73E88D81592826E243B7F0B2A1B3A06E5AFDE23A2985183A0E430E01C3FA90E9F1DB7E69DD8E7DC6FB802933E04A18834C091ECD46F0DD423F532668CEE8A12A06BBC7E5FF3B9488B8F4A87A92BB8D6F313269AD95C574245E06563BB58BFF6169B8F4C333033BC128B91CB81DD41B831DF5103B295F744EDE95FC3A0C72F1134A9321836AFCFD563192C343040B943F69C0E98E8D740C06CCF840CBFC6BF777C9561065916F13D116D758A151E8FF4C355363AAE8E4F49D2A2E062A2BB213AFF25662D95549B4B025E70AA3363B50D25AF84A3E5B0FFA598CE074733AD191C86C351592299C26C0A4933573EF436B73DFD0C4EACF93D361AFE5F824B91BC178EE8381B9EFD52302AB8CAD6C08C7E090393B9B8ABC78AF374FAC6E60BD104BAABA524E68D75A759B94176105A9CFF2E5B9C3984FF61C5AFBF22B8E1B9E4F9BDFFEC0B19C2A5C8DB3B8B2C02115D101805C1BD6652F738F02600E38998CA41BA8955094FAD5BDC34133D4B523EDE66CF483F1CD5ACD9EFAA69703807410939974D6DC033BC696541357DA9881A4FD1385671B6E4BB889C68B544175C1E2EC1395DFF4CC87E037087C615CAF40804D5F44A2DE301961A59818173730A45CF4C2DF172614AFF7199A40C9FFB9957242A89FF86B36A4F4D60F15DB569C2FEFAF677B35FE5F12AD5A323397714286E338FF6B9080FCA50B657DB477A52A93B243BF28CE2743794C361F443AD81EBAAEAB2B237EBBC572D8586C3EAB1F42BAEC1C985D28BC58B296A11D96A04B0E1F7F6790B92E450248804F3F62B5865941BFD444A910F31E1D6B79D8906E7E9828618F960EC14124FBEED28E1F58A8BC9D31773442FEDC5A220F3912D0B41267D427C0C15BB76F9200C54B5F050307E13F1EB3DE92B864C994A3DF4CEBD1BCA634710FA342E23D7C8A5BAC1B58AA321E215E4418428206F05232E2BCD1B5EE1BB7E34E7D4C93088991EE9DD643FD08B0185A2F0AEFFB0EF0EEA3ACB4CE234BD5479A4F4296001305826F23083CC9DC99011864F250E77E42A0DE26AB09FF6E3F32552F6F913256729B357CBF5DFC825E91BB5D3FAC1F729803D431D339955960EAD69B1E54536CFD774341CDFDE1D1F527DA4E738B2E292BDC884687D1016DC193EDF34A37D284D026D33698295E864196E0BF16FA83A35F65FF2B38B7030E9E63EAAF594F272E07941313D538546BC84671739AF822391CA4DBE6A579A81F45FF51FA5B7EF49BEEE7BEBA4AE07452C13366668F02752923EA3653043B26C883799FE6352F95144283D946CA87143B74C8A009C024D073BAAB9BC4DA6C87D35FFFD753E1EEC7F01944639E566FE17A6F715F4197D1CBA58D3D153BDA37D7D2D5E19620FF0842527D109333FA2BA8BFC491689F4551BEE6C9D13BB9E69EE4F44B782BB05D1E48D293BC15B9FC706D52B021C7159FF7DF80E55627DD7555795F1FC616830A4BA2C02FE1A19DABE088E460BF3C5A88313C443179C593458467FAA468791CA74E9B1E759847B6939F -pk = 16A8584AA07FBDEDFA504F2FC00F9BE99A8A162BAB6262607CB12D26599C4311EAF61D8E45885119ABB449A1FB956C5C89EB3185CAC45C029067222CA4691F28 -sk = 16A8584AA07FBDEDFA504F2FC00F9BE99A8A162BAB6262607CB12D26599C4311EAF61D8E45885119ABB449A1FB956C5C89EB3185CAC45C029067222CA4691F280200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006C5EB0ABC712628931341A139CDF3E3415D377B369ABA6FFBCB047D314667EB77FE42C674ECE56F510F38B091FE10100000000000000E7CCF0D1D7D17FBD73BF1CCA82891A6FE716FF5C98930C4C63827A5481EEAB29F9408BEAB6B5ABAB06AB23A42A66FBFFFFFFFFFFFFFF1F531BFF128B8080B8C45217FABE705A0013AE1A699B82D90C035D50617DFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF784E52A8EBD8CD8CF0455F109CA50B531E322D4939420EC9A8E4692501200A00000000000000000000000000000000000000000000001CD82507690FD0CBA435D9C83A35BE352A530565C82889F899C5176ADA0608080462311193871DFC5BB10A15BC0265F5C2A3BD32242887F0305E360C05F71527122928908FDC7E55F63B36B48AA98EB7CF922DC68FD5B6E87FD65A1DC974A00725957BFA6EFD88955EAD10CE0AF8E2205E97D048C107DE2D9E7170D0EA00A42202C96E1A0A709F55060C16E0CFB42B4E651738A9736C3A3AF47CB9348263DF10FB8D95A17530E185F750610AAE0E94251E71AF3E9332D9BD661E1E579A150D2F71EDC99F4C7B4FC73A8267CDE225EDB9F138E6119ECB56FFE17103D11E441A331B1A5BE624AC84DFA6D4BB96EC488DA5E31C1D0B4793F353C17268829D57B32E95655A56257A9E03608E5BB5F7709F328A8C67E933FC8477ABE777FD0F9DBB00B4C085929D4C19F32C6A61FD9296CE1C5C5839B878BAFBA4C6397366DED97F1226C84DBE961DE9EA8F14E381B9C208E249AEF01AF52DBC1D44C209511EA18C21A03C7440964E8EDEAB0D454EAF545BDBE202A2B8633982F40657E705BB2C7800DBB58F38C02B414579218EF851AE6F7B45B9079D27E7EDD11D03FD813760BC1CAE351632789618DAA0D0CD4EA46D0ED350612B656ADBA5C10104998E74840906 -smlen = 1299 -sm = 6FEAABD67AAC94F51F022A199C02E92152652F039D3A76773A5D57621C00A2BB745D671564481F02EF324398192E39DFEF05BFFD015B2221651BEE047BAC6568BC2C46508007D8132A84766E7AE38305923027A294423C6305009512920A47CFAD2AEA0740F0E0DE58067DBEA6011F13AE86D5CCF8B1D8016CEE08687E49C32EE801889FCD6E3C1B6938A7030101A8A592E993AB10C5BAD64BDD036C0F09032799800402928FEFE606503DDBF3673CC201789518EE21DC99CAC94DD5298B2F3EB8F6AB8D0705D24D9AA3012F217464E7F203E08E5CEA9E44F54A6F73E88D81592826E243B7F0B2A1B3A06E5AFDE23A2985183A0E430E01C3FA90E9F1DB7E69DD8E7DC6FB802933E04A18834C091ECD46F0DD423F532668CEE8A12A06BBC7E5FF3B9488B8F4A87A92BB8D6F313269AD95C574245E06563BB58BFF6169B8F4C333033BC128B91CB81DD41B831DF5103B295F744EDE95FC3A0C72F1134A9321836AFCFD563192C343040B943F69C0E98E8D740C06CCF840CBFC6BF777C9561065916F13D116D758A151E8FF4C355363AAE8E4F49D2A2E062A2BB213AFF25662D95549B4B025E70AA3363B50D25AF84A3E5B0FFA598CE074733AD191C86C351592299C26C0A4933573EF436B73DFD0C4EACF93D361AFE5F824B91BC178EE8381B9EFD52302AB8CAD6C08C7E090393B9B8ABC78AF374FAC6E60BD104BAABA524E68D75A759B94176105A9CFF2E5B9C3984FF61C5AFBF22B8E1B9E4F9BDFFEC0B19C2A5C8DB3B8B2C02115D101805C1BD6652F738F02600E38998CA41BA8955094FAD5BDC34133D4B523EDE66CF483F1CD5ACD9EFAA69703807410939974D6DC033BC696541357DA9881A4FD1385671B6E4BB889C68B544175C1E2EC1395DFF4CC87E037087C615CAF40804D5F44A2DE301961A59818173730A45CF4C2DF172614AFF7199A40C9FFB9957242A89FF86B36A4F4D60F15DB569C2FEFAF677B35FE5F12AD5A323397714286E338FF6B9080FCA50B657DB477A52A93B243BF28CE2743794C361F443AD81EBAAEAB2B237EBBC572D8586C3EAB1F42BAEC1C985D28BC58B296A11D96A04B0E1F7F6790B92E450248804F3F62B5865941BFD444A910F31E1D6B79D8906E7E9828618F960EC14124FBEED28E1F58A8BC9D31773442FEDC5A220F3912D0B41267D427C0C15BB76F9200C54B5F050307E13F1EB3DE92B864C994A3DF4CEBD1BCA634710FA342E23D7C8A5BAC1B58AA321E215E4418428206F05232E2BCD1B5EE1BB7E34E7D4C93088991EE9DD643FD08B0185A2F0AEFFB0EF0EEA3ACB4CE234BD5479A4F4296001305826F23083CC9DC99011864F250E77E42A0DE26AB09FF6E3F32552F6F913256729B357CBF5DFC825E91BB5D3FAC1F729803D431D339955960EAD69B1E54536CFD774341CDFDE1D1F527DA4E738B2E292BDC884687D1016DC193EDF34A37D284D026D33698295E864196E0BF16FA83A35F65FF2B38B7030E9E63EAAF594F272E07941313D538546BC84671739AF822391CA4DBE6A579A81F45FF51FA5B7EF49BEEE7BEBA4AE07452C13366668F02752923EA3653043B26C883799FE6352F95144283D946CA87143B74C8A009C024D073BAAB9BC4DA6C87D35FFFD753E1EEC7F01944639E566FE17A6F715F4197D1CBA58D3D153BDA37D7D2D5E19620FF0842527D109333FA2BA8BFC491689F4551BEE6C9D13BB9E69EE4F44B782BB05D1E48D293BC15B9FC706D52B021C7159FF7DF80E55627DD7555795F1FC616830A4BA2C02FE1A19DABE088E460BF3C5A88313C443179C593458467FAA468791CA74E9B1E759847B6939F - -count = 34 -seed = B0C7530A52AC9F561C2C14548D3A5F5053396B738EA1C7A5190F5AB01C9C38719C4DBE856E42D37A114FA24FD5DF5081 -mlen = 1155 -msg = A4117808D9D05B702483924E99623E778E7A3B7623739AB7AC488ED93E711EBDDEC383BFB7E06086FD0C374F4668AB744AD99B8AF1C75309B60F55DC03FF7BE6F23187FFD5CB224068568CE2D06ABE441557B04A5A0C2858C416F6F7AA89A96ADFC2AFC54E0F31416CEED005B7B140B342652DAC7BF401FED4D94D475784936FCEB4B4F334BB14BA55B1EA9A36E2B0591287EAF4ACED997162691A96E7F59853E609ECA9A225F615A49A12763D80B5DFE6F8638923C39BD652936B19B944D5116F790E866A61947EB60CD1F3A1F319710D0F40E487EFBEF51FB4D00F5DBB94810128215F72B1AEDD74A1B1D237088DE3098417714EEB67D6A3E6BB647B6B0AC6D0BA3089D4CF6252B69C414E2BD6614429B6FCEABEBA50A4B53C7394652ACF7DD9403AE14436ED5FD4D1C9E238A8399A763806FEF5C3742C55B7159EBF5A13B271428F91229C191D617808A26AF9190F9D445BFD3B273702BC3E7F610854C8E86066BE7757960A880CB6727CEF19DC7B464C464A7DAC9AE85B799747B8488A4123B6BC7F0F7C2A8E53FD4F8687075B4E25660F5107ACF22CA688057DAE0496FF15A3EB9379A9F6E22FA43C932F137E389478C05DB86060686AFEAFBCB9ED79AE194C4146A48CE5E07EAF585279313851CB864A50075AE46C1AAB3B3CB920DEE2652F5AFA0138051C7C980946E8D5E18C16789CD184DC5598F65875EF43418DD56E11DEFB5A4A6AFBCE041BB292E0E2EC563296BA4EA6CBFDCCA32A18C8AA395515A83D0FB7819413E5AE056FF0EC2F63F1D52A8BE0B334A628D00995BEC7E46A34BCD2DCA0E9C5A88E0FC8C43843D6AE074C699276293FD8DB2BE48885155688428C2F5A6C6C91BD4A03CDE2126205F9EBAFE319D1B4F80277FE99211A09628AD840046EB9AA568EC71252CE9F69827B677D9C0D99546DF5A48A8D253AC0036DDAF4D045A70F94EC54BF5F06296B2C2617F2B0EC0B8374DD28DE269FAF739B1E55AE1846F548FB6C0403C5ECEE3CF9D1927E317F0D07E11AEBA01C240FE17C6660F7CB32305AF1EB6DE4312FDEA6990DA4E9135DBC0B88AD0AE0847E1576F3C2711B785B846C7A4B823688E4218596CAED583A90DC46BB9B27E00E4C1110B65F77E602F043A8441563667691C07162E52A53CD76E2D74DCAAA2983BF2E8F02CC30B05BD4F9AC731931C59F9EBC038FAFB09FBC886F4C4191352206BB49ADAEF9D74BD08A5B780FF0FA301343F5EA81D36912ECCB0FF24BBF0BE6A8283EBDECA79CFB22639DA38C9C639C4BD66FE5A75F0414FCC1455702856E6FC58344BF02998E17E967183AE920B7E04F58AA09145D6DA79B65EFCD18EC55BB9CFD53914F80D73C2B08BB754AC63E4C82D44B72376A544D97394B7C99678758B15CB94E71F9FCCF674B29ED5AFDCE452959BE5AF510D57F9E5395A576EAA1FA7BA9AA4122A779727071FA485C005B447760410DEE20B7C2299B4A0D5D9E5E4E038A19C87806C3FB875EA5BD7F47D034D7D5FEC4BF132B04E47574172D392EA7B371516190AB81C67B45FEF6332848A51B6C7DBA90C410A44E9A88AC082FE296A7435E7D2DDFC645D5AEBBC29620525757DAD1B0222159D658C7225D02374EE6AF479FCF1AA28CD91B -pk = 8B53B0DC5ABBCA917C618E8C32B2EFCD604D29BE8124BE90C49601D389CEAA1DDBE280155167EAAF89A93385BABC4DCB58C524E8A4113E108CABAA696819E11D -sk = 8B53B0DC5ABBCA917C618E8C32B2EFCD604D29BE8124BE90C49601D389CEAA1DDBE280155167EAAF89A93385BABC4DCB58C524E8A4113E108CABAA696819E11D020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CF34E3B26765CAD7019AF031328604DB15D3D8E37552B6DA6AA8A23BE2BC17FDA96F332678FF24D75C813B32B0D805000000000000002CFDC2AF1B5F5177B6FD0C4342660117C52E4DB43EC374E578E08D65010F793B14216A51489C6C3BBBF0D153AA1FFFFFFFFFFFFFFFFFB8407A2F6165640B39C6E1596C37FFFC3B8503E1F8A33C802C6988DCE429F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7B0605C11FD99ED7C33AEC7990072B9DB78AFF677DC56F779143386ACFC0200000000000000000000000000000000000000000000006A952DC30F03738331E99D631B98CAEA8949F7CEFB439623EADDC9118E4B56047A5497137CAA3EF283256E73AC311216C34F5E155B47765CEEF6F8E5AD829F1EDDA000095A24242AD602027B476E6ED58EC99BDEB33A8C86855DE9AFB0F542230ADF8127B532B4273E71C9943762646444A4934ACE6F0290C009F23264627F00FFBB12EB40C22E171EF375FE9198F84C66F607F8ECF7DE52FB70C107B4A0BF1788791298988EAE6604ED889388379F522F52E346E2C6D8807652614B27E5D52681083F484518C3A83F491569A454A9BB31D570966566F213B8EFB5420831CE2C2BABEDA5E4BE452DE16EE3D11E7A427C267C3CA23039BC8B9A37F2AA2BB1EF0B7969AF00E041FA069C4D0EEC3CC315D1296976C960A1FAF927901E7F23A541158025995DFFFC74CDB8B18ECE22D6D17CD38010875EACE17883F69C1718C88E1769577EF38FFEC633A25DAD9F7662130D71F0578DDCF33D7BD2651C39792D681534E20D448F095C6F1BD2F6A8BD54D7824D8568DC7B821905BC17B74E3F6E5F08F1D5EB73A3236F74ADEAB9503DEC07DA1CE1A5B86CFAA2CE8121E436B2E7B60D7302F4B7546443F6C6270168A84D80CB02EEC99DCF6312B35D327E85685E641C -smlen = 1332 -sm = E1207BA34BFC0CCC5F07CE1FE9D404D2FE045F023B555C2490C023262005D724D726EA29F222FA052BE8B242AD032E264D079A9C9DDA6E643C1502076B886F91392DFBA4A0062CD310F881292308EF06E58CEE1D517E5DD9000339D54B63022643DC3103763BC1A4A8F50812E304B011E73A4A77B616A80382A11A31D97C74028D06347383408FA7D7BA8807019534EAD88BE7D62CDD43EF7AF14AC4B20F0312E028B9CD04E073BF016F6F098E46805E01A4117808D9D05B702483924E99623E778E7A3B7623739AB7AC488ED93E711EBDDEC383BFB7E06086FD0C374F4668AB744AD99B8AF1C75309B60F55DC03FF7BE6F23187FFD5CB224068568CE2D06ABE441557B04A5A0C2858C416F6F7AA89A96ADFC2AFC54E0F31416CEED005B7B140B342652DAC7BF401FED4D94D475784936FCEB4B4F334BB14BA55B1EA9A36E2B0591287EAF4ACED997162691A96E7F59853E609ECA9A225F615A49A12763D80B5DFE6F8638923C39BD652936B19B944D5116F790E866A61947EB60CD1F3A1F319710D0F40E487EFBEF51FB4D00F5DBB94810128215F72B1AEDD74A1B1D237088DE3098417714EEB67D6A3E6BB647B6B0AC6D0BA3089D4CF6252B69C414E2BD6614429B6FCEABEBA50A4B53C7394652ACF7DD9403AE14436ED5FD4D1C9E238A8399A763806FEF5C3742C55B7159EBF5A13B271428F91229C191D617808A26AF9190F9D445BFD3B273702BC3E7F610854C8E86066BE7757960A880CB6727CEF19DC7B464C464A7DAC9AE85B799747B8488A4123B6BC7F0F7C2A8E53FD4F8687075B4E25660F5107ACF22CA688057DAE0496FF15A3EB9379A9F6E22FA43C932F137E389478C05DB86060686AFEAFBCB9ED79AE194C4146A48CE5E07EAF585279313851CB864A50075AE46C1AAB3B3CB920DEE2652F5AFA0138051C7C980946E8D5E18C16789CD184DC5598F65875EF43418DD56E11DEFB5A4A6AFBCE041BB292E0E2EC563296BA4EA6CBFDCCA32A18C8AA395515A83D0FB7819413E5AE056FF0EC2F63F1D52A8BE0B334A628D00995BEC7E46A34BCD2DCA0E9C5A88E0FC8C43843D6AE074C699276293FD8DB2BE48885155688428C2F5A6C6C91BD4A03CDE2126205F9EBAFE319D1B4F80277FE99211A09628AD840046EB9AA568EC71252CE9F69827B677D9C0D99546DF5A48A8D253AC0036DDAF4D045A70F94EC54BF5F06296B2C2617F2B0EC0B8374DD28DE269FAF739B1E55AE1846F548FB6C0403C5ECEE3CF9D1927E317F0D07E11AEBA01C240FE17C6660F7CB32305AF1EB6DE4312FDEA6990DA4E9135DBC0B88AD0AE0847E1576F3C2711B785B846C7A4B823688E4218596CAED583A90DC46BB9B27E00E4C1110B65F77E602F043A8441563667691C07162E52A53CD76E2D74DCAAA2983BF2E8F02CC30B05BD4F9AC731931C59F9EBC038FAFB09FBC886F4C4191352206BB49ADAEF9D74BD08A5B780FF0FA301343F5EA81D36912ECCB0FF24BBF0BE6A8283EBDECA79CFB22639DA38C9C639C4BD66FE5A75F0414FCC1455702856E6FC58344BF02998E17E967183AE920B7E04F58AA09145D6DA79B65EFCD18EC55BB9CFD53914F80D73C2B08BB754AC63E4C82D44B72376A544D97394B7C99678758B15CB94E71F9FCCF674B29ED5AFDCE452959BE5AF510D57F9E5395A576EAA1FA7BA9AA4122A779727071FA485C005B447760410DEE20B7C2299B4A0D5D9E5E4E038A19C87806C3FB875EA5BD7F47D034D7D5FEC4BF132B04E47574172D392EA7B371516190AB81C67B45FEF6332848A51B6C7DBA90C410A44E9A88AC082FE296A7435E7D2DDFC645D5AEBBC29620525757DAD1B0222159D658C7225D02374EE6AF479FCF1AA28CD91B - -count = 35 -seed = B2FD7BFAAFB667C9DABE5915C3BC271EF41F18588666A6F4990C09D098E62DB590110DF6A56F08C5E0DE65B00F91D60F -mlen = 1188 -msg = E82F5ACC7C1A326D430475357629D568EA3D0DBE131114781D5BF8DAA32FDE9F3CECD288ACD14445678C5EA6D3AFAFCE48EA3957A6AF8D8F23F78D84130FB6419F706EADD430CC85AFF48283F15602265059ABB075E011E3941834EBE70787CDD55F1E604C6B86F761D94C4F5E525791333DF6D43869D6F36B212A8F35583D38A21D0947CBE26FBE6A36E189C73137F2F2D89F48566D04D2DD9125D2EA4E0B2A7E5C1E9D2EA036CFADCF7BB28F6DF3B7D6395230C9D39D1E7558EA25340252708BE23EC6C0C9A0946C5C5AF0FE037C254D1A5B2B70B8F916CF37945BEF76BDFDFB19A0DAAC5A83A6357E986B3155CFF31024121634C3700CA99E5ECEF1F2E411C6621FED6092C1AB59860271AC7F431E568075D59F71AA18096195F30BBEB1A6BAC20E034F83C72BE0536315879F1D1B7F31D38C12DD8E97819B4803D02BECD436B61D1296CEB78EBF857E34087EC8AE8395269B5B0770B3423B39638910D2A3DDFEC8502389FD8B5B09FFD10CAAD1A5C86E7E39629AB09A4ABCDD00FBB9821F92E7DD24DDA83D1D9762F52A89BED6C20648EA04FBAD4233E5920AE83FFEC28FDB5E432929A41DB782B2CEA8FEB40CAD0B27903050B650477E5D9443A536ECDFDAC673952810596F1985427359D9E4797CABCCD2FA0C0A2394D853B4E6F8E150B3E3AB5136CF476605FF5FFA9067C0FE58A143B50B18B09256657CF091132D449A6E7EE79AA870E9DBE46BF840EDCB983F585EC2856C059808E72B8C901A25D6AFD5372F168D533052A6D26418E035D87D0BF818ADEA19915047C8D824A425A8C7915756673E0F5FCCB1B4FE7C1FDFCE505F7E18F023FDD32A605906EC48E0FA755B6D87E47711E158D672C5FB4CD3B8D1D13FE9EECE58453987CFCDD87B621B870F3AA27E73B6FB7FC0A6757893B978C63B7723C49D1005A1E5B1A4D60C4A2FEF392DF7EF97F149B499164455633FA485BDF92F804A47C8703D124522D73887A2B032F10F45343993FFB009D69E80FB54B6999A5BDB2760F8BCCA648F3C52BFA1D887AE49862DB4CBCCC7213ACBFDC48A57C3DA1F1EBBEA828182432AA1C593C3E5591C825E5706A5F9503311E91EC3D8F4A9554C3DF915B5FBE0516A7A5597ECF8862A8DF286ADA96C90C9F2783F7F947A18EBBC64C1BAF24B29F77521A9EBE09BECFFDB902EFCD024046FD3E6182BF0C84BD3A0A5410EEDBABFC60114E5DB28B0943D79F58F766E2EDB16759850D4CC3A9A57AE073CF6F3B24D36A4365E2BC64674259170B6D11DFF63D0DEED085B6321C45F218E09351AA0D4155189CC98DE5627A03396A067AB3FEA2C133062E3823FB1CAFA5D592070C8E82ABE812979DBDCB6D2E595F33830AD0E8E2F9E6CDC4D9C74B8026EAD1815DE36772769C4E00806F79950A40C979C14A4BDBFDB79DF1DE01FDFCAAEBC93DDBAD62BA166843A121D2B144559064E9DE9E310DFC93D624C1061BAD3195D6C9F46DB64C65A31E90371F9B644E2A15E01C262395269A9AE83F50776F852903F86E5518BD008CF1B35E78F910D48C0B7BBAAAD5DFF2375C55D56B8F65B922229D5F494EDCCD2D676361619FEDFE6BF0BFD7E4C77FC459F181120C4430C409BA89D2E5A8C36CC6200497611D9D705DA6AE1ACA4E16B389D632A982E017E1DAD95DFFBC7A7D7191E7B8FA1C0ED -pk = 54AA740AFC26815E681D45343D0FA48EED3AAAF7D19DF7F9F880DF7844EA4018841A41B46032DA09FCFC38A615DE4129EC6261082EC6949F6779DAA385654D29 -sk = 54AA740AFC26815E681D45343D0FA48EED3AAAF7D19DF7F9F880DF7844EA4018841A41B46032DA09FCFC38A615DE4129EC6261082EC6949F6779DAA385654D29020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DAA4C93EF60A909CD74076084606CE5B50DF911D5E1A9AC27F9BD2CBDC69B5728D3C5C6CA41C6DB223CE1F01C0E70400000000000000C73B6859D53852C772F7E29FC1CA943A3DC37198E9FA33DAE13C6C4A3A70F0E97B2806B7484E5959F5B6B03AE7CAFAFFFFFFFFFFFFFF67E0C0DE8FAB3964B5FF4F0D55D568B260841A12F446B8B52B1DB3E38D8E02000000000000000000000000000000000000000000000056A27DB1CF94DD8C8F0610DA0D7E5C053AA5985166D86760274901B141750600000000000000000000000000000000000000000000008DD29F22F0C07E6AD6417CC5BF5D0E3DDC970B59EBE80815E726492485225B2D6E41C4112D7E621284DFA6BB476B5A84736D74785F62612AD54F0F948E7AEE09FCC693C21A662673056771207F35B11E077B534FF696D28E2320CE256E3275289B76D82E38447119891624BE496E683AEFD53BBE49F93B456D64CA99063D5A306260A696A74D69F7259F8FF0399BC257648269E233A53E34C91DF52B9D1B092B00FD1D8B9D54084317C12904A11B72B8012F5E8AA3287E099183AE6E92B55C06FE62F407B6F1883581A019B9120212761769535FD944BDE7D21BF411A64BB20EC4B5FFB6D474A44D51F8EAE3254823D05C8135F058248053DF962EB631E1D11C98D9F9BA914FAE5AA4E3EA7E6EC53F66A23AE264C421580B2F4A91C46A1F9C1E9E963A3A74E2EA4C77F017A2F98D0B73CCAD25B5371C8772A2CBC3092FE50C10C5211ADBAA29CCDD9EEA8D3BFDB52097D492D4FAB918366AED61F5C810787A0FA042D643805305C7BC40157D8B4FC869DE29839FBF37BC0A146034A8E5ADAD2EB79261F4DBE844CBFCBAD80815FD1C9267288EFBBA13C37BCBF62205C78FC8085585F5C03831DED1E1A3E02593D8655EF45F7590837220EA15C84E901FE7F132 -smlen = 1365 -sm = 88DA789F2A7387E95E05F84B983499DD07793F031FF25F1D9779D9B14302BD8E15AE46232D8087007B7ECBA16793AEFAF704808F1AAFB51D0D828E017EFC0FF6AB7EFDA94007A3B7AC2259DA0A22AE06BBF32A7C54ABB0DE3D016A72D6D028699575C1032BA1415D6D74D494780313CDC071C7DA17503100E0A0D461FC5877FCAE06D1803C625CE0A351D4070029B0FB08C5A15A90063A57E51D3032EA0A03A54ABFAC47A5A730870290EE10F75FD2BA01E82F5ACC7C1A326D430475357629D568EA3D0DBE131114781D5BF8DAA32FDE9F3CECD288ACD14445678C5EA6D3AFAFCE48EA3957A6AF8D8F23F78D84130FB6419F706EADD430CC85AFF48283F15602265059ABB075E011E3941834EBE70787CDD55F1E604C6B86F761D94C4F5E525791333DF6D43869D6F36B212A8F35583D38A21D0947CBE26FBE6A36E189C73137F2F2D89F48566D04D2DD9125D2EA4E0B2A7E5C1E9D2EA036CFADCF7BB28F6DF3B7D6395230C9D39D1E7558EA25340252708BE23EC6C0C9A0946C5C5AF0FE037C254D1A5B2B70B8F916CF37945BEF76BDFDFB19A0DAAC5A83A6357E986B3155CFF31024121634C3700CA99E5ECEF1F2E411C6621FED6092C1AB59860271AC7F431E568075D59F71AA18096195F30BBEB1A6BAC20E034F83C72BE0536315879F1D1B7F31D38C12DD8E97819B4803D02BECD436B61D1296CEB78EBF857E34087EC8AE8395269B5B0770B3423B39638910D2A3DDFEC8502389FD8B5B09FFD10CAAD1A5C86E7E39629AB09A4ABCDD00FBB9821F92E7DD24DDA83D1D9762F52A89BED6C20648EA04FBAD4233E5920AE83FFEC28FDB5E432929A41DB782B2CEA8FEB40CAD0B27903050B650477E5D9443A536ECDFDAC673952810596F1985427359D9E4797CABCCD2FA0C0A2394D853B4E6F8E150B3E3AB5136CF476605FF5FFA9067C0FE58A143B50B18B09256657CF091132D449A6E7EE79AA870E9DBE46BF840EDCB983F585EC2856C059808E72B8C901A25D6AFD5372F168D533052A6D26418E035D87D0BF818ADEA19915047C8D824A425A8C7915756673E0F5FCCB1B4FE7C1FDFCE505F7E18F023FDD32A605906EC48E0FA755B6D87E47711E158D672C5FB4CD3B8D1D13FE9EECE58453987CFCDD87B621B870F3AA27E73B6FB7FC0A6757893B978C63B7723C49D1005A1E5B1A4D60C4A2FEF392DF7EF97F149B499164455633FA485BDF92F804A47C8703D124522D73887A2B032F10F45343993FFB009D69E80FB54B6999A5BDB2760F8BCCA648F3C52BFA1D887AE49862DB4CBCCC7213ACBFDC48A57C3DA1F1EBBEA828182432AA1C593C3E5591C825E5706A5F9503311E91EC3D8F4A9554C3DF915B5FBE0516A7A5597ECF8862A8DF286ADA96C90C9F2783F7F947A18EBBC64C1BAF24B29F77521A9EBE09BECFFDB902EFCD024046FD3E6182BF0C84BD3A0A5410EEDBABFC60114E5DB28B0943D79F58F766E2EDB16759850D4CC3A9A57AE073CF6F3B24D36A4365E2BC64674259170B6D11DFF63D0DEED085B6321C45F218E09351AA0D4155189CC98DE5627A03396A067AB3FEA2C133062E3823FB1CAFA5D592070C8E82ABE812979DBDCB6D2E595F33830AD0E8E2F9E6CDC4D9C74B8026EAD1815DE36772769C4E00806F79950A40C979C14A4BDBFDB79DF1DE01FDFCAAEBC93DDBAD62BA166843A121D2B144559064E9DE9E310DFC93D624C1061BAD3195D6C9F46DB64C65A31E90371F9B644E2A15E01C262395269A9AE83F50776F852903F86E5518BD008CF1B35E78F910D48C0B7BBAAAD5DFF2375C55D56B8F65B922229D5F494EDCCD2D676361619FEDFE6BF0BFD7E4C77FC459F181120C4430C409BA89D2E5A8C36CC6200497611D9D705DA6AE1ACA4E16B389D632A982E017E1DAD95DFFBC7A7D7191E7B8FA1C0ED - -count = 36 -seed = C08E846A8E039C8655651919A8433D475F494899FB617DC3B4715DEF0C992C195CE38158B7FF40E0684B30FD7E623265 -mlen = 1221 -msg = 743E5D96B9B4C1469E7AD2B3703F711FAF60CA335358FF3EFC8FCFF02CD020A443243B4169F9123351B6C36762B85BE5E5EDDF8D4B43D82CAA615788406A31CDF4F7087D42DB21AE48A069AA23A8F6D20A1C0762F973E526F011DEC737E986CC324724BC5336D0362525757410E21046A12AC54F2237E68DA036A5C1389E46A53ED8C21774906948D4C9E14F40519C54DBD02B7A4ACAABD24FFD7F6CA4D6D582EF48940296D2893415E811FE7EF0801B35F1C594E6FEA2C293869BBD45618B6F04FC26B55D55A0AE99445AEA12F851B7E58A49CC6A0044F28E3EB838CFA6BAC5DF53B0DB78BE2CA2BEA1BF2DEFFEBD673A783C91A6C9EE710B12042EC2863A9B52EADA5B0D32101BBA8338F7C75CDAE7B7FD6797B25F96ABD53A24A7647A1C91610306FFC72A8DA4D46B1778146A98BD59CEA3173D41D5A53F9A7F9E282B5FDA1AFB062D8AFB63CB19B0E76DF782FEB9F7FD50902133529CFDD7C51AF297895EF6E1871AFD4C3DE93DEFA8FCF1FE67BD27B7EEB0CF37A6A8E09AF1203922BD9B62672D4756519CD09DD9271ECD0285F92030A9FC81C09BF2FAE86F5F50596C628E0BE673571CBC2FD76C563E113004529B234FB50E9E3D6D1F814CB8E5B5CC3EA365D0BC7602B146CC0361397D9BEE9246FBA3A724C462E177D27836093EC009741ABFA28379AEBCF5EF09BBCE00CE449FEC3A3302FB9AD0F010CA338363539DA545F159FBCD3D6A0482454023587A324F5132FB6F4CA602FAB2CF6CD59104427264CC9EDE8D10CD9DD7FA6133E65693DBF744443AE920994226E21D98634BC7F0710DBC37C18203EFA5ADB467B523322E21E4E686B6B85B00CB501ED84153BAECD4D6CAC9D1183E38B510F7B1DBBE5995BCB717529B83FBBE969DFD8DE21183762FCDED692B16502834FE8E7A7C46F84ACDCD2C9975098CF0CDE8AC0EFAFA449DC26840180DCD9353A2F1B06962677C808B07345E8ABE95B8D24F21D751A4EDCFA0E02FF077DE64E6B992E8C8822682DCC7F03CA7582FE7C74E0A9822A02D888FDDE1FC9E73C2EDEDDF32001E918771E5F511EF8F88AC19B76FAC0C812F56938F814D712D99269D7802E47634E541B54E00F9EAF78A421506A88B4BF7332DFC7D79E8C41835031FB449507D19D5A8A512A5C527C95B6F21EE3E41FA43591DD9BD2E4293701BDAFB624E0EA290DA4B7A173003867C4CC3FD814E117B4EEE283C58F5FB33D653E410F68C8962155B8C4FBC13BB750A0343737D1FAB36EBC618A6A7C8E6F93855CB24937B01C438FA713D334DF335D0745582F680627D8B94CBC25F0D12E3B1C27A3ED72E2558B800C19DC6B719B961E0FEE43BFC34E999027CA1969ABA4C45FDAB9AF01B955E948DE951F5A1088BEDA43AC930FE99D8CBB3473475C444F43E928E1A44966265B38FADF9B1183700A95A81F85EA43E5C61DD9B2D67701C95583E8E3F15083717E1722D764B6E624505347C30E5E70163ED9A046C504FF534956E911294D2B9097BBEEF8740377EF0D6C4CC8086422902BF63556CE6DA8E33E68FCFB42707C00693A995D17680B76293194DB217EB5A928303DCF1814E4A881B057BAF2553AC4FAAC8E4BF23FD4074154CD4AE189FF7E204EEDB8EDD594CDC21B5B7D73A712B511D068F4D217C0F91F9D84C524D973D67AA741EB13FE922AFABF79CD2396181143783030FD2D0CFEFC877934D8037A4C32AE8E15B50A6FA4269 -pk = 3CEC01E8079754024D5DF0EE948930ED1F9CEECC82BC8CC9DB984B7FA340671749BF0335DB325A006A67D276DC79818EE2C90CABFB58A31ADAB54AF049B1FA17 -sk = 3CEC01E8079754024D5DF0EE948930ED1F9CEECC82BC8CC9DB984B7FA340671749BF0335DB325A006A67D276DC79818EE2C90CABFB58A31ADAB54AF049B1FA17020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B5D61283BA31772B1376F21AF4BE7B5405ACED42DCCEBDA8825DEE26C7DDC9E27CEDC297C607263E87E7732AAC61020000000000000066FD58C6BAD6CEBED977CDE360B5A2059CCF381C7D3260CCD9FBC0A16A7084E87770D869BC6A56124F8D19CBDA74FEFFFFFFFFFFFFFFA6E5207CBE723D777AB221A492F8678AA5EDAB3E2010C103165F1B1D2C5CF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF353B77C62E8B3FA2B63DE831782C663FED67077EC2B83E0E9C87AD106394050000000000000000000000000000000000000000000000DDCD004E419EAD9B410D0ABBA3CB8203BA5C9546FE9CBCEB612200BA2FEECF28FEA574A597E70F2F5C67B4C8CA0CE2901557D77CEAF063B26657E4B95E5D4C1B766FF27E8DC738605637B26132A60CBF7E27ECE990E676C46F7678EE89468A01D4BCA4CDA58C289C6A0EB88DFAB69F06FDF43C5BCE69A3CCF63BA85073D5852CA335EAD6F09711B69C1DD072D2F6DB607BE7B5F4418ABBD35B4B0954BD3A800EC2E7E0AE6383B31C90A71DDDA120CF9F5D92E299868D68B53B1F2FA1603C3A241D56CA524626BB9A89103827B2E0AD0C40AB57009EF9D6771591CC622F015F0B6C5FC749B1723572A0FD2030AAB61BDC7677828610985CF754A5715D81BE49010231C0C7640B0A898AA4D05C99659AB5220086A7B24A18A2359E1AE83821C026A12BE0C7A704604F39600F342D588D0E3AAB0E77721324ACB92BC1DFC46E29300134AD93511C0B797A92DDECA95D2A03C939073E5FBA01ACB62B425E4914912C93C827FAD7A4A999B0542297BCF62E266908E5BEA6C1EA9FD33173BB95A013168F9C0DA9DEC0A45CD92D7247DAAA940C0FC8E5B8811D47933B627865F34E700EC91B9AE26E1658DA5DC3F8C21BEE127107E6A6050F9D1A1154C0171305DCFD17 -smlen = 1398 -sm = F6EE252B413EE990BC07D4AFB440913BC5AAD200ACC066807E2B1ACC6601D3337B2A0460593C9F0408747C364A65A0135A05C4AFCD3D2EA0B5324B000E1220625BFB10A3840431363FF000FA8F49CD0588B44863F99F754C92029AAE52D02E44680856075CD8BA2911CD671384049ADEB94A5360CA7BFB058E5CBABAF8A3225801056572CB96A0F0A41F720401FD6705B52DEACD3564ECB269F42A09ED0401D409C8B5F114E2DD2702DF83E3637E879400743E5D96B9B4C1469E7AD2B3703F711FAF60CA335358FF3EFC8FCFF02CD020A443243B4169F9123351B6C36762B85BE5E5EDDF8D4B43D82CAA615788406A31CDF4F7087D42DB21AE48A069AA23A8F6D20A1C0762F973E526F011DEC737E986CC324724BC5336D0362525757410E21046A12AC54F2237E68DA036A5C1389E46A53ED8C21774906948D4C9E14F40519C54DBD02B7A4ACAABD24FFD7F6CA4D6D582EF48940296D2893415E811FE7EF0801B35F1C594E6FEA2C293869BBD45618B6F04FC26B55D55A0AE99445AEA12F851B7E58A49CC6A0044F28E3EB838CFA6BAC5DF53B0DB78BE2CA2BEA1BF2DEFFEBD673A783C91A6C9EE710B12042EC2863A9B52EADA5B0D32101BBA8338F7C75CDAE7B7FD6797B25F96ABD53A24A7647A1C91610306FFC72A8DA4D46B1778146A98BD59CEA3173D41D5A53F9A7F9E282B5FDA1AFB062D8AFB63CB19B0E76DF782FEB9F7FD50902133529CFDD7C51AF297895EF6E1871AFD4C3DE93DEFA8FCF1FE67BD27B7EEB0CF37A6A8E09AF1203922BD9B62672D4756519CD09DD9271ECD0285F92030A9FC81C09BF2FAE86F5F50596C628E0BE673571CBC2FD76C563E113004529B234FB50E9E3D6D1F814CB8E5B5CC3EA365D0BC7602B146CC0361397D9BEE9246FBA3A724C462E177D27836093EC009741ABFA28379AEBCF5EF09BBCE00CE449FEC3A3302FB9AD0F010CA338363539DA545F159FBCD3D6A0482454023587A324F5132FB6F4CA602FAB2CF6CD59104427264CC9EDE8D10CD9DD7FA6133E65693DBF744443AE920994226E21D98634BC7F0710DBC37C18203EFA5ADB467B523322E21E4E686B6B85B00CB501ED84153BAECD4D6CAC9D1183E38B510F7B1DBBE5995BCB717529B83FBBE969DFD8DE21183762FCDED692B16502834FE8E7A7C46F84ACDCD2C9975098CF0CDE8AC0EFAFA449DC26840180DCD9353A2F1B06962677C808B07345E8ABE95B8D24F21D751A4EDCFA0E02FF077DE64E6B992E8C8822682DCC7F03CA7582FE7C74E0A9822A02D888FDDE1FC9E73C2EDEDDF32001E918771E5F511EF8F88AC19B76FAC0C812F56938F814D712D99269D7802E47634E541B54E00F9EAF78A421506A88B4BF7332DFC7D79E8C41835031FB449507D19D5A8A512A5C527C95B6F21EE3E41FA43591DD9BD2E4293701BDAFB624E0EA290DA4B7A173003867C4CC3FD814E117B4EEE283C58F5FB33D653E410F68C8962155B8C4FBC13BB750A0343737D1FAB36EBC618A6A7C8E6F93855CB24937B01C438FA713D334DF335D0745582F680627D8B94CBC25F0D12E3B1C27A3ED72E2558B800C19DC6B719B961E0FEE43BFC34E999027CA1969ABA4C45FDAB9AF01B955E948DE951F5A1088BEDA43AC930FE99D8CBB3473475C444F43E928E1A44966265B38FADF9B1183700A95A81F85EA43E5C61DD9B2D67701C95583E8E3F15083717E1722D764B6E624505347C30E5E70163ED9A046C504FF534956E911294D2B9097BBEEF8740377EF0D6C4CC8086422902BF63556CE6DA8E33E68FCFB42707C00693A995D17680B76293194DB217EB5A928303DCF1814E4A881B057BAF2553AC4FAAC8E4BF23FD4074154CD4AE189FF7E204EEDB8EDD594CDC21B5B7D73A712B511D068F4D217C0F91F9D84C524D973D67AA741EB13FE922AFABF79CD2396181143783030FD2D0CFEFC877934D8037A4C32AE8E15B50A6FA4269 - -count = 37 -seed = 1D9C060EA0408A068BD982D9694D39D02BA5A473378F6F9F09349F686566F331E767263FAFF5DC0E823BB6F648843876 -mlen = 1254 -msg = 3382E87BA70EA986A044B0CBA2EAFC3316C1AC95A5F16F6368C210DBEADFAE6CF2382DDF5078AD594CDE3BD1A837C517B1A20A2099D938DF6AA02B6C0E62FE6147C904BCF3EDE51DDDA60DE7887DFEB2866DB402D23E5934A74C9CE4852D4B2F53CC9BCDDA312964A548F6F7C8320AF1D1BDBA7FD32EC6C86BC3FCB4205ED3DB092FDCAD9AC4D2B8575883E13F69D8C16CB18D1B9284B31823ECE917C905C5C8B9D180C1BD87975871014F773FB57D402B8FE16EE312692665824CF0BCE4509326A31957319364CD421E9B21BBC1DFF663ED850858A2450C2FFE64B65E009A3999CE4504BA5313BA0EE4A8843349C30FA6E59FD3ACECA130A37C04F9B64722608768973996112684B64D0C87BF95E5DD60661935831A6A1A9575EBCB2F64A15296BE788C775D80523D6BB4267D91B0C71BA5F90DDF1933DE898E79FC7E39D0A3D146F185214468DA50AEB47402AB542E52CEB768A70CB1F749E4164CF20E549B674CE965FFBB98D874D34B5B7851E575E6C1E4DE9C170A10DAB84940AF055A951260B0119F5ACBA320B55CDCE4F16346905A2073CD9FEFBA95734E4F4DFDB7A33F292D45698831F1D3E9FBF56D9692C14A8F9887265CBB4441AB331D977E3A68A1BC9F406AE0FB1C6E91205670641B9868E2A987BACEEE2364FDB089A63B53976D600BD7A8AE88A02872E46927269D281CEFA385C98CCDFA6609394943FAC32237368C6203AAFABDE072054AB5A14A91391D5A943F4ED4A4407F275CCFD15FD28F1AE0EB6EDCC6612E3436572919E4DFB57C049BD77B344D8E04152863EFD4FAE8FE3A7230AEAAAF82870820085F4B3EB5215111B6B8952CF2FF468B3D10F3AF849F16E190E9560F40B05E6E2204591B58A850E2710F7043AEE2A44A6D4A108CEEDEB2D216E51102DD08751925DE6A7F67BCA1980F0789B34E2F86729621F2285C5D3A036CD87C76102E9D607C37CCDAC8062CEB961053F3195B5ABD88BC64FC65F8BE34166841683F1EED291938F75DFDB3AF4FD2AA98CE95382ACFB5D5DFE6EF243C8A0B19B80584FC0CD533E38BD485D1C52E0EB5BFF90C0A947D9B9095AC1C0CE9754EABFC860990206B981235C7B612DB61C9FDEFC0F14DBF68A8A0EA4986CDC4AABAD6C218559E11CCEECD804EB98446FB33EAE47C0388BD8972DDAC02CE807B707D6D188CB31A1D76D44323E93DAC4F8ECF77E7896C052EF16009CE4D1147DF84FD5785D95D77310783F9AEFF1DDA693F4BED26457ED82A1CEA19D9C4919257E3050B25A7D1CE7561740DDAC3FD93A607C79875E050E40498BFBCCA95BDB3D0FE639DC7CEA80E3DAB3AD73A4265F012451C1BCC2FDA1E1AEBB7FB18407F31E7496E2A18D2C686B47120688240A2FB134A3C314D4CB422811E850524684EC485E061F7365494A6403AF170DA461A3BC32FFAF9143D5E9B17B2285C56977AECAF880CDD34F26120DAC4C950198233A50654EFACA6EA97333D2BBC024A5E668821D20333DF0B712510100AECAB6B484CCB7814178F851A3E6BA0B76F16C4685D5AC8BA48558D382ABECBDCF0B919C1ACAE46EBEB5011DD0B3C22B539810720CFBE4CBADB111E100C09C811E724A67C66A1B89EED1E7218861F55A4DC55E236C6E3521DCB374437A14E8000DBEBF0F7F9BF409AF952888675C11326D9E3E8A8828BF50CAECFF96075CF29446CADA373529D310660CBD60C042C143E1736FE7AFAF6FBE42791A8DB01EC0475145257FE2DF766D4EA972B14AE5110B8F8F42D659383E9BD76 -pk = 96F96A9524E070B71CA37BC00B63AF4E47B7B4A2A2D273B62508C30E4C226327BB5BB065BA13BED9EB58B4C2B9E1BDD7A468F580B0742F256B8682F48179EA16 -sk = 96F96A9524E070B71CA37BC00B63AF4E47B7B4A2A2D273B62508C30E4C226327BB5BB065BA13BED9EB58B4C2B9E1BDD7A468F580B0742F256B8682F48179EA160200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009C077E081CB36D7034411B86968042D8F1C4936EA31728E2B9B1AF8834A724C2F8EE885AD172FB8AF00AD9E9C68B0100000000000000C34876E10C0E3572168E24517BF963629220AFE059C472DB68F98465066CF2260ABA4DC4D789215DC8FAD6B01122FEFFFFFFFFFFFFFFDB0D05B1DB8D0C4A1BE91FA5A4DEE39B4994FFF3881B5CF03393B6393B3601000000000000000000000000000000000000000000000018F16A0C4CC5A9FEF2DEB49EC1F02DE18D06EB6865169EF68E6A1579EF2A1000000000000000000000000000000000000000000000002B23DA37D00CE33A072F45BD0703D77243177CBDB67DDC61D2FAF54B9AA43C0E6F875250B99E2AA9B55868F7E82AEB16CC9F6D782B60B9EC2B32982B32E4EE1A73D36ED5C1804D915A458FCE9A600A7FF2A24DF291F843CB19B06174661D57254BF57A3D99162EA7E0D0E26BA786FE2B07D51AEF011F3FDF1071129B189EA025DA4D1244990F362AFA792DDE5502995EE747E29D3A927F9516CECB6E4D574A0DDC3DDDCE9798CA83A232AC89E44D586EABCEF6FC5A874F76F86F21A083AC7D139E2600FEF2586757DDCD464193E9783CE196CB5A86A7B02DF7829DF44619F529A2AF840136E3ABE1CBCE62722348C020DAD782C927151E85C077505EDEE6AF2610AE07C65ECF1D6E83C0614DA4702E7586C57B5CAC91D986A5CE83CC4504B112202E7598D3C54922CBFA3863955C912AD0FDE0FCA9D583ED7CDAD90BA105890002FFC0AF1C6AA4D3C20F7B72CCBAC0BD5B344C05B69C2A08EE4A03053F3F97094FFDDD31FE312C5513F81E00C4D4F3695AF1791421A93EC515209753BEDF6A2C3773C69F20C748C551AE120B81607CE0E0520167813B43BC504A3F08A86B7332F033E9AED3D69C434FEFB4820B4DA980305A14F66BE53986F5E2E593413DC224 -smlen = 1431 -sm = CCFA66F4B26DC6B89C00D5D6A4F2EB4F4D921B0166615852BF3F1A68E807347EBA9EC551FFEA5A0120A7739E668C1D330B00819A9DBF2AD4D9BC6D01194F0F44CC76240FEF00A196936012F1BDD7D406CD2C11E174E038026B014AA597C21B7ADE35D7001AA7B87E64BB776E67045EC90610599639391802E00962BC98BDCE3CB20748B32C8FD6A0E24F3902007990E7F917E6E6AB586A78520E5CA35A0E03EBDE253C3DEEB25FA9035FA07786E844A7003382E87BA70EA986A044B0CBA2EAFC3316C1AC95A5F16F6368C210DBEADFAE6CF2382DDF5078AD594CDE3BD1A837C517B1A20A2099D938DF6AA02B6C0E62FE6147C904BCF3EDE51DDDA60DE7887DFEB2866DB402D23E5934A74C9CE4852D4B2F53CC9BCDDA312964A548F6F7C8320AF1D1BDBA7FD32EC6C86BC3FCB4205ED3DB092FDCAD9AC4D2B8575883E13F69D8C16CB18D1B9284B31823ECE917C905C5C8B9D180C1BD87975871014F773FB57D402B8FE16EE312692665824CF0BCE4509326A31957319364CD421E9B21BBC1DFF663ED850858A2450C2FFE64B65E009A3999CE4504BA5313BA0EE4A8843349C30FA6E59FD3ACECA130A37C04F9B64722608768973996112684B64D0C87BF95E5DD60661935831A6A1A9575EBCB2F64A15296BE788C775D80523D6BB4267D91B0C71BA5F90DDF1933DE898E79FC7E39D0A3D146F185214468DA50AEB47402AB542E52CEB768A70CB1F749E4164CF20E549B674CE965FFBB98D874D34B5B7851E575E6C1E4DE9C170A10DAB84940AF055A951260B0119F5ACBA320B55CDCE4F16346905A2073CD9FEFBA95734E4F4DFDB7A33F292D45698831F1D3E9FBF56D9692C14A8F9887265CBB4441AB331D977E3A68A1BC9F406AE0FB1C6E91205670641B9868E2A987BACEEE2364FDB089A63B53976D600BD7A8AE88A02872E46927269D281CEFA385C98CCDFA6609394943FAC32237368C6203AAFABDE072054AB5A14A91391D5A943F4ED4A4407F275CCFD15FD28F1AE0EB6EDCC6612E3436572919E4DFB57C049BD77B344D8E04152863EFD4FAE8FE3A7230AEAAAF82870820085F4B3EB5215111B6B8952CF2FF468B3D10F3AF849F16E190E9560F40B05E6E2204591B58A850E2710F7043AEE2A44A6D4A108CEEDEB2D216E51102DD08751925DE6A7F67BCA1980F0789B34E2F86729621F2285C5D3A036CD87C76102E9D607C37CCDAC8062CEB961053F3195B5ABD88BC64FC65F8BE34166841683F1EED291938F75DFDB3AF4FD2AA98CE95382ACFB5D5DFE6EF243C8A0B19B80584FC0CD533E38BD485D1C52E0EB5BFF90C0A947D9B9095AC1C0CE9754EABFC860990206B981235C7B612DB61C9FDEFC0F14DBF68A8A0EA4986CDC4AABAD6C218559E11CCEECD804EB98446FB33EAE47C0388BD8972DDAC02CE807B707D6D188CB31A1D76D44323E93DAC4F8ECF77E7896C052EF16009CE4D1147DF84FD5785D95D77310783F9AEFF1DDA693F4BED26457ED82A1CEA19D9C4919257E3050B25A7D1CE7561740DDAC3FD93A607C79875E050E40498BFBCCA95BDB3D0FE639DC7CEA80E3DAB3AD73A4265F012451C1BCC2FDA1E1AEBB7FB18407F31E7496E2A18D2C686B47120688240A2FB134A3C314D4CB422811E850524684EC485E061F7365494A6403AF170DA461A3BC32FFAF9143D5E9B17B2285C56977AECAF880CDD34F26120DAC4C950198233A50654EFACA6EA97333D2BBC024A5E668821D20333DF0B712510100AECAB6B484CCB7814178F851A3E6BA0B76F16C4685D5AC8BA48558D382ABECBDCF0B919C1ACAE46EBEB5011DD0B3C22B539810720CFBE4CBADB111E100C09C811E724A67C66A1B89EED1E7218861F55A4DC55E236C6E3521DCB374437A14E8000DBEBF0F7F9BF409AF952888675C11326D9E3E8A8828BF50CAECFF96075CF29446CADA373529D310660CBD60C042C143E1736FE7AFAF6FBE42791A8DB01EC0475145257FE2DF766D4EA972B14AE5110B8F8F42D659383E9BD76 - -count = 38 -seed = A4563D09AD21D3916BF4636301F2E64183A8F003DA186753D7F2DC3BE0089BA09C62B8A52B72C2C8451213606801FB29 -mlen = 1287 -msg = 67109894C579974373CA0054ED5F7C373B7AEB810721C3D9CEFA02EB244EF6B17507300370ADB24AE0173C6D114C51E05F822A770318033C082B6502F70012283EDA2A9DC0A1381F145470E5D3729D201773D2AA63C18885A92C962BCD3628835391D70DC36273DFAA4966F65AD40EB51FB4B416A8D0B1DDF39CB932EC4503BEA23E3D9D3B4501DB426C6AD99C28D415FB565F62EB5C22BB043C8CAFC42EBD1C7190DD32A5B14B571644471453740C081F3E3305F9AE70A5BD505874382EC0F6E2188563E763BB8D1BB8B16587AE25A6252F51E4AD02D0483C4A6E8AA2849C44629CF4B7C6DD6A5FECDAB0F9B2F0B35E306C7532B64BD5A3CE67A0247D97024AAFE5CBC13E375AA69B8287BBA9DDC9AAAC2BCF41A71E373EE36B13DF9F829BBEE8F48802DD9E03BE42A5E290251BB130E0E2ABCC4E096DD0F264E5D29F8C2388A0C3010E78F2A03F5BA1BE13AA5E50F2BA67A031CE3F787754B8276EA1AF62BC5FB4DD9A9B9BB84217A37EB9FC7AAFB517337B30454200D6AAE491E50D5007EAC2150F60F640A5C4624CE6D8112119413731322BAD9762BCF72349EE38E2A41102BC5461D72033072A90E82D105E6FCDAED9C223A4142CD55920196D7B1B9278C84B67A2E35BDE3C9CEEBB8E9007BA8758BD35C875DD5FA0A8FDAAAA9A09629B9DF69AFAAB456E105DABF2AC5834B8D223B0A406E0D1295C876C447E8E09C93FB09ED1B3EF6E1F3B7FCB029F576A45A12620567E05F218BC3753109DD29AE0ADE1370C0F871AB5AD8A9DBAA277FB869EE552E8733E73886D6DFEACE6B35E481F37A516EBE191DAA6F83E4FF453CF9CC9DDEA8EE507AF0E62EF3CB8C22949CB828E21C6AAF3FA9AC301E2257B0A054FF0A237F527D53EB757820AF637FFC9F983A2B5AFF0B4CC493E610314432C9C2F0FF73C4240D520D1D73721B429CE41807B7424B14F5EB1CD23D5562263FE1D58CB1D52E5175414800CB090242E240C3A7ACAD4C84DBD8ABC2731FA2B1D9820DA60FDB6BAA7EA849B6A146E07AF7FC201B3A98E5194BB5826945FACA3690209E5726F070A71EE07AE76ADB7E6199FCCC81C8AF7A463633A58873B4F7E65F522FDA409979DE41CF54F659E66CD5950A3A3E01570526C46417A00EC2E8821DC380ABFA21384D141D259CBB9722F267E46272ADC5CC4BCE382B554226996F4A6A1605287276C18A48C8FF1A92ECD2815CA5452FD6157FC27532680022993535549BF9AB064052E6DB4E9F83B5D0D885B94A90F59E67B9DF0C321EB0F95AC07007E4EE33BA89AABEEEEA01FD1172ECA4E31FB02C507FFE43CD0D6C8570769A180E68A70BD344B4C992E7D3A6BFB96AC4D69C2D4F5EFACA1D348DC1988DE44B30DA76BABC307A88124F96F26737A85FE6047E7E485C7E4B6B99B575FAEDC9BACA3E080E2B074CFFCE1F716C6A1D08234C45706D2883C6E5A001D02596CFE5B260DE6134C75DF3AC8BCF1919759E15576CA147CEBE041D04E369BDE70CC64157AEDA311C8DA520EAE907C33E30DD89013E24B7B02E66C9F285BF7D5C3FD65BAE24AB20D40ADDB451AB4BC4B9772D0B9039461BCA8D3D2A4D71A2E6BFBE7F02325FD571FCAE1FB47F855612F382188A5FA3D61C3E8E59EF016DB0149C52E1C7DC84030E6C93C4F32DA6CE5F3B8196AFFDE834D2ADC26CFA05940055401891519386BCD33D85584D74B2F16D8E19556C272AEE8397A1741EFFC283DBAD317740C1B67F8F4B7D2D1EDD68D6615EAC3F8E3CD26AC4F8058667FB388B19C654711B5B2EDA75A9AB55174157CBE08C186A3D0963BB3011A9567BD499AD2A8 -pk = B3B6D9AAD81BFB1206C0086CEC20DED59A8DA47D256202B0BDA3D6A4B15F221C1E7BAA2233ECDD25452B2A2325C9F9D7B0F4D21D2A34D7E852E286617DC51928 -sk = B3B6D9AAD81BFB1206C0086CEC20DED59A8DA47D256202B0BDA3D6A4B15F221C1E7BAA2233ECDD25452B2A2325C9F9D7B0F4D21D2A34D7E852E286617DC51928020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DDFBA6EDF9A8B8591EF70D8B86F124CF406AB7F62A9194F60DAB5D943A107DBA64BBC5B32C185B47B413CF1F5439FFFFFFFFFFFFFFFFEA4282EA9C7BC68F4CC2A4BE65D58074AEDD94D69B84675A08399A072E881A4A762ED3511B46C3BC33385753C4C2FEFFFFFFFFFFFFFF3223F1BC4A16528B797994953A947C2488C4257380E1126148CA60768839F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5367F55EFA0A919752E28EB96AC5A85FEEEA6D8DF164462F7DE10C306F530D0000000000000000000000000000000000000000000000096524A16B10FB6D482BE7DB041EE347CF375CAE7D01389B436ACDC9C7444A301F139172DCB03638C1852BD4C0AB497B72CD83F3AC66C582EAC3BFAD6FABEB28DE517186819519F5EE7BB4AB108CB3B01ED931FC7B22AFAA19F6C0BA0EB8F52DD088742688B21BA8FFE7CA1F42C0FF5F758453A13189D6D003D6A19A655E1B0C3D037597F2D64765A7CFAFC6B27BDA7F267A601027440B42DD812F4BAEEEF81066B6ADBF962BF5B946F9DFCBAA6A763E1B417310740E35BB9B16CF245CA48523FAA8AE83071105D217C3C17F6C9D6E96C5CC264B2CA8AA363BC7381759FD9B19064478F2610E90481E614693790DF84BDFEA3F496D4E5366D0634E4551EC460DBBE70015E16B867F730C6D17E6BDC967FEFD68A96ADED69C5A0CE172BADBB30FB323F0489E6448F5CC34AA9E0E84EA289076F1DDC1AE537864D1AED1BA025E299533C16A53EB4F95BDAC9E8A2732E1E509EEE0482B4B73A26057291F44693D24315AC3BC9D7750212A9FC5208AFD52F433EFDDB6CDAB44E718725391E39E0912E2B0CEC8B8B7AB55F34613626E649B4A7E5EF3B418D757FA92375CEFDBE09308028B09031DB858F59BF1299B8563247664833B0AB30759D48DE6EF5CBD7EC213 -smlen = 1464 -sm = 45CBC564765F1C73AC062AA8B43434B959B75300FE26D38D715E4FB94C07CBBE3ED216128DF32906289D67B66E24AFAB2604D5DBC9913DFFD744E20624D950DAA6B418C6FB030407466E431E99535F025300B36A5390BDAEBD07F746D64D523808D5BA038C676789FBAAD4DF9101ABD5B38E106DB0E930069577AE4505A412370303FCAFC0644091CDAE6F0001DBDFE202DD49DFFFB766E47A6DBF52370403982D0B44F49634F30905074BB47466F2630167109894C579974373CA0054ED5F7C373B7AEB810721C3D9CEFA02EB244EF6B17507300370ADB24AE0173C6D114C51E05F822A770318033C082B6502F70012283EDA2A9DC0A1381F145470E5D3729D201773D2AA63C18885A92C962BCD3628835391D70DC36273DFAA4966F65AD40EB51FB4B416A8D0B1DDF39CB932EC4503BEA23E3D9D3B4501DB426C6AD99C28D415FB565F62EB5C22BB043C8CAFC42EBD1C7190DD32A5B14B571644471453740C081F3E3305F9AE70A5BD505874382EC0F6E2188563E763BB8D1BB8B16587AE25A6252F51E4AD02D0483C4A6E8AA2849C44629CF4B7C6DD6A5FECDAB0F9B2F0B35E306C7532B64BD5A3CE67A0247D97024AAFE5CBC13E375AA69B8287BBA9DDC9AAAC2BCF41A71E373EE36B13DF9F829BBEE8F48802DD9E03BE42A5E290251BB130E0E2ABCC4E096DD0F264E5D29F8C2388A0C3010E78F2A03F5BA1BE13AA5E50F2BA67A031CE3F787754B8276EA1AF62BC5FB4DD9A9B9BB84217A37EB9FC7AAFB517337B30454200D6AAE491E50D5007EAC2150F60F640A5C4624CE6D8112119413731322BAD9762BCF72349EE38E2A41102BC5461D72033072A90E82D105E6FCDAED9C223A4142CD55920196D7B1B9278C84B67A2E35BDE3C9CEEBB8E9007BA8758BD35C875DD5FA0A8FDAAAA9A09629B9DF69AFAAB456E105DABF2AC5834B8D223B0A406E0D1295C876C447E8E09C93FB09ED1B3EF6E1F3B7FCB029F576A45A12620567E05F218BC3753109DD29AE0ADE1370C0F871AB5AD8A9DBAA277FB869EE552E8733E73886D6DFEACE6B35E481F37A516EBE191DAA6F83E4FF453CF9CC9DDEA8EE507AF0E62EF3CB8C22949CB828E21C6AAF3FA9AC301E2257B0A054FF0A237F527D53EB757820AF637FFC9F983A2B5AFF0B4CC493E610314432C9C2F0FF73C4240D520D1D73721B429CE41807B7424B14F5EB1CD23D5562263FE1D58CB1D52E5175414800CB090242E240C3A7ACAD4C84DBD8ABC2731FA2B1D9820DA60FDB6BAA7EA849B6A146E07AF7FC201B3A98E5194BB5826945FACA3690209E5726F070A71EE07AE76ADB7E6199FCCC81C8AF7A463633A58873B4F7E65F522FDA409979DE41CF54F659E66CD5950A3A3E01570526C46417A00EC2E8821DC380ABFA21384D141D259CBB9722F267E46272ADC5CC4BCE382B554226996F4A6A1605287276C18A48C8FF1A92ECD2815CA5452FD6157FC27532680022993535549BF9AB064052E6DB4E9F83B5D0D885B94A90F59E67B9DF0C321EB0F95AC07007E4EE33BA89AABEEEEA01FD1172ECA4E31FB02C507FFE43CD0D6C8570769A180E68A70BD344B4C992E7D3A6BFB96AC4D69C2D4F5EFACA1D348DC1988DE44B30DA76BABC307A88124F96F26737A85FE6047E7E485C7E4B6B99B575FAEDC9BACA3E080E2B074CFFCE1F716C6A1D08234C45706D2883C6E5A001D02596CFE5B260DE6134C75DF3AC8BCF1919759E15576CA147CEBE041D04E369BDE70CC64157AEDA311C8DA520EAE907C33E30DD89013E24B7B02E66C9F285BF7D5C3FD65BAE24AB20D40ADDB451AB4BC4B9772D0B9039461BCA8D3D2A4D71A2E6BFBE7F02325FD571FCAE1FB47F855612F382188A5FA3D61C3E8E59EF016DB0149C52E1C7DC84030E6C93C4F32DA6CE5F3B8196AFFDE834D2ADC26CFA05940055401891519386BCD33D85584D74B2F16D8E19556C272AEE8397A1741EFFC283DBAD317740C1B67F8F4B7D2D1EDD68D6615EAC3F8E3CD26AC4F8058667FB388B19C654711B5B2EDA75A9AB55174157CBE08C186A3D0963BB3011A9567BD499AD2A8 - -count = 39 -seed = 811A8A2ED2917CC616FAF246C5F9BB902E5FBF5430AB078AD6CE871CF8C160512A748216EFAB3A4CE1271AAFEA12C11B -mlen = 1320 -msg = 061934748C6758ECDEDDF3A2DF78574A470621496CE3F12E5E4555FEBCCC1A46A772FCBADEBA8B2EB5231B5B15DEDA5A38076C737E5D091A8CA8482F84EC4A20A51DDDA391088F2C3926F8E1D8B77DD0ABD606E9AC25A17A86A5C75ADC215C5030355C4A1B307C1CC80A3BC4A7D4B4044FD35D173A2C7C081318F707828A3438DABE0836C2D6C14E1643F05EF8405531D5594411AE4DAC6F3992279CAE379D7C1762B122037301D3FFE8EFD1BEB4E027E055527D485D0871F2013E7B25CC26531C2CA6DDB98B31F0AC2C3BDF400A0BAE942C9D4C4003F9952B67AF67E85F572EDC3345A84B6DC3CEBBAADB7E3C876AB2DA16ED0EACF4858033BF5A4F739F9E083A345C2BB5D8611DAE90D25AC45D8B3D39B4DE584CBEACCC6F5B6E61524349B50E818BB6B03C7E5B86795D49324CE6B1603791F20B3500A1B8ADE82359263470D777B35DBA38276096445842BA5D5E960FB2AB58730F970A15AA42D9737C33BE700127A7CE7CADE024D3ABCA59CA49F9A7EDF44DB62CCC07A595016868AA97A140178DC92530EFF864C24954464BA886DB7D74BE7B540BAAF807F1AEBD014680FF4A51E16E1391E32069EE823F3D23DB72244D657233578CB7D29A33E6EC31DF1FDD43B51742CC30EFC54BE83149177E7BCDE4450DCD142EB2CB745F8865DFD99DC84AB92750F1CFB0F3944E4E4EAA41261A1E8C58D9B230ADD792DCE20D2612823C0FF9F82E04B61E48DBB83F1A6DD5CC7F92BCD0A37AB3053803D1188029AA1FED9BA04F4C961588C9AD2BA7EF1CFBC50FA69B799898EB0DFE9668260CA5680F91A10D2BEF8F108AB28FCAB693ECDB942070D2B9B8BBB22609C8395C23D7482C31B69B0F555B7C079D3DEFAA5FB302ED92619C058ADF334E845EB1C6EDD903C0DE2AEDD3D9830943F8BCC5954B65DF37C901A17EF13FA75B0F2C8C1D2E38681874AEBFE90B463F2CC7831958FDC0DE0446991EB3C3612CC00188DFC1078FE458D2E5B80EFA7BFCE800C6B4CA0E570FA5858859633551DA28F36F1FF418A9B7AD18AA89B4612F9D676D5FD98BCE6F144CD7458CA9F2BC732A36A4D186EA290A009A870DA3C1F60617D56EA7554062367121F3E5E569503AA573B172C6278DDE5AA4CCDA79D9D8FAF41C6C9040C1D1D3CB78B41FFA8A0180395439F0D1B72E42471A9100973AB3BC7AEC559D94D2D6402374BA5A584DE168395A156324E1E4149ABD35C72AE0F79863CB59EE6BA22145E36E0D85D3CAF8A427D38C96CE489CD0AEA20D7960608C074CE3CD0494B6D6D5EC8895F0F03CE78982AD8FD6784BCF16825286C51325662F34726BA66D3A91EEB598124D6755DA090EF863FA31CCD5B08909A3279A35CFDCE24D2BA16F42AD280B029A0E27137A671C862B0E6F73FF4A1DE320C4DAFFB5CD4AC3522EF1C10E8A918005535F355CE6366B43A757938594366831DBF7EE72F311BE4953EDD1EA1C598960745D3DBB7F1E2D882CC063BC0791D18C6376A8497F2F91389A13AA96DAB78FECA081D761479848A5B4CC2E3D015F343B9000583E95E785A45A06842D7C6C0FE9AC4D70F085503D7AC954516953C497635AC8B7698BB784F73FE6E7F9D0AB9473E828168DF4EC142CC1FE18FA067525915ADF0764E44292A0316EF3C0A443683C92C4661409589EABD7B4DBD43F54317AE0E3D1C69C35A7868991FA0BC2F83430D89821B91A08DDC2D314A717F5BC6F3D89DAF163AF73E10C61630139E3FEDA723FEB2EDFFE6C7F364FBA22E6AAB75E267065B5E7575946C56265743816B2CF12A106AE21921E3E92BFB7FF80E105468F8409D6698E8660B5B05F3F4BB19A0BD4BE3569D24F51795752BE74C429AECA5BE737DE8C01 -pk = 58C76A8DC0410CAB12B3623020F5749994D462F6B665F0BCF73E41644838E10FAD4BED3DD5D12A2079F9227B5CC3B2F60DD122A403BB78BCA78C5BB5CD465109 -sk = 58C76A8DC0410CAB12B3623020F5749994D462F6B665F0BCF73E41644838E10FAD4BED3DD5D12A2079F9227B5CC3B2F60DD122A403BB78BCA78C5BB5CD4651090200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007F738155EC9EB2DB0D6FEF6C6778546441D86DEEB877E60B5E08E76463040A6460AC53A34BB0B9EC193A5193F023040000000000000080B12AE62B4AEDCF150928591D7004954A928E9E2875920DCCFF04C6A472A49011D3C2F37A0FC442CC9DE5C567BBFCFFFFFFFFFFFFFF584CD12A4A30361FF19CD700BC16762A79E4EA2F04C0CF050310808EF2AFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61EBE620399B07DBBE9AB7D757632B5319764F7AFAD8D00C79D191D6F7EE0800000000000000000000000000000000000000000000000E4B7E766624D28C49DD82D16B8E85B49F20DE65924868A06BB6BA389B0C710203B1CD1EDA3588E8931DBFFBBC209C8A584C6395C1D4C1988DD4B6865D95DF209DA14629D5FA4EAB66F13C837A148009F0ED761538CE8B507AB0F737C0CDEF2657C54095BA92F232187262601774115C58D04193D866DDAC6C7E5B12FB879818EC3DA106E8286CE340F4D0D600F2DA1D081001E4F40F6017BA3EC32A4DF7D0110647F8ED1A61A373E50F5C9FA1213B1A13641A48358AFB7703E922EBC8959626AF01313872F58D9D3280A385838583B99A6672DC8FAA5EF1272E43FAF219411E44CCA096DA854E43D30C1D0AE746B8E21CB3B91A12A337333718D71E2C19EE1F16B7BA96AEECA8B700120D4C4D6E344BD9915FD0EA15A8E6192B0C9DCC035A0EE7092EE07002FD6A3C50D3D534E9F82DEBFBFAE13D194BCEA34478DA82D5BA225425D5ACBE60C18D817869AAD41BE5BA2A85837FF683B76E18EDDBE64D686813F7EA6BD1FC94E131546EB364181213055011A947C5FE17F0B18C8439061858316834D0E416FE51C59CBB6244FA153013927B2E723BC51D3B6899E252F367D5022C689067D183865AC16CB57AC7FE4466852307267AE6EFFEE44980202A3F7134 -smlen = 1497 -sm = CFF6B0EBFF32C91F71077FCCC5984EEB717DC606E853AC54D936CE899207F57D428AA47785650506399F1BD56648776AB204E98D7536792A859E1C0769575F80E79C753C5202AA81D3479AF0B4564C04BAF7391E4632DB301605B195B1CA17459601F20487C595900FD915F365025D46DE8B888DC64AF503ADC2F457935EE9D5DC045F0A05AB9BEE13628105017D6A3F429BA0E341F85D42C560CB09090003AF406C8AE1E01888AA0510E454E0DE3B0801061934748C6758ECDEDDF3A2DF78574A470621496CE3F12E5E4555FEBCCC1A46A772FCBADEBA8B2EB5231B5B15DEDA5A38076C737E5D091A8CA8482F84EC4A20A51DDDA391088F2C3926F8E1D8B77DD0ABD606E9AC25A17A86A5C75ADC215C5030355C4A1B307C1CC80A3BC4A7D4B4044FD35D173A2C7C081318F707828A3438DABE0836C2D6C14E1643F05EF8405531D5594411AE4DAC6F3992279CAE379D7C1762B122037301D3FFE8EFD1BEB4E027E055527D485D0871F2013E7B25CC26531C2CA6DDB98B31F0AC2C3BDF400A0BAE942C9D4C4003F9952B67AF67E85F572EDC3345A84B6DC3CEBBAADB7E3C876AB2DA16ED0EACF4858033BF5A4F739F9E083A345C2BB5D8611DAE90D25AC45D8B3D39B4DE584CBEACCC6F5B6E61524349B50E818BB6B03C7E5B86795D49324CE6B1603791F20B3500A1B8ADE82359263470D777B35DBA38276096445842BA5D5E960FB2AB58730F970A15AA42D9737C33BE700127A7CE7CADE024D3ABCA59CA49F9A7EDF44DB62CCC07A595016868AA97A140178DC92530EFF864C24954464BA886DB7D74BE7B540BAAF807F1AEBD014680FF4A51E16E1391E32069EE823F3D23DB72244D657233578CB7D29A33E6EC31DF1FDD43B51742CC30EFC54BE83149177E7BCDE4450DCD142EB2CB745F8865DFD99DC84AB92750F1CFB0F3944E4E4EAA41261A1E8C58D9B230ADD792DCE20D2612823C0FF9F82E04B61E48DBB83F1A6DD5CC7F92BCD0A37AB3053803D1188029AA1FED9BA04F4C961588C9AD2BA7EF1CFBC50FA69B799898EB0DFE9668260CA5680F91A10D2BEF8F108AB28FCAB693ECDB942070D2B9B8BBB22609C8395C23D7482C31B69B0F555B7C079D3DEFAA5FB302ED92619C058ADF334E845EB1C6EDD903C0DE2AEDD3D9830943F8BCC5954B65DF37C901A17EF13FA75B0F2C8C1D2E38681874AEBFE90B463F2CC7831958FDC0DE0446991EB3C3612CC00188DFC1078FE458D2E5B80EFA7BFCE800C6B4CA0E570FA5858859633551DA28F36F1FF418A9B7AD18AA89B4612F9D676D5FD98BCE6F144CD7458CA9F2BC732A36A4D186EA290A009A870DA3C1F60617D56EA7554062367121F3E5E569503AA573B172C6278DDE5AA4CCDA79D9D8FAF41C6C9040C1D1D3CB78B41FFA8A0180395439F0D1B72E42471A9100973AB3BC7AEC559D94D2D6402374BA5A584DE168395A156324E1E4149ABD35C72AE0F79863CB59EE6BA22145E36E0D85D3CAF8A427D38C96CE489CD0AEA20D7960608C074CE3CD0494B6D6D5EC8895F0F03CE78982AD8FD6784BCF16825286C51325662F34726BA66D3A91EEB598124D6755DA090EF863FA31CCD5B08909A3279A35CFDCE24D2BA16F42AD280B029A0E27137A671C862B0E6F73FF4A1DE320C4DAFFB5CD4AC3522EF1C10E8A918005535F355CE6366B43A757938594366831DBF7EE72F311BE4953EDD1EA1C598960745D3DBB7F1E2D882CC063BC0791D18C6376A8497F2F91389A13AA96DAB78FECA081D761479848A5B4CC2E3D015F343B9000583E95E785A45A06842D7C6C0FE9AC4D70F085503D7AC954516953C497635AC8B7698BB784F73FE6E7F9D0AB9473E828168DF4EC142CC1FE18FA067525915ADF0764E44292A0316EF3C0A443683C92C4661409589EABD7B4DBD43F54317AE0E3D1C69C35A7868991FA0BC2F83430D89821B91A08DDC2D314A717F5BC6F3D89DAF163AF73E10C61630139E3FEDA723FEB2EDFFE6C7F364FBA22E6AAB75E267065B5E7575946C56265743816B2CF12A106AE21921E3E92BFB7FF80E105468F8409D6698E8660B5B05F3F4BB19A0BD4BE3569D24F51795752BE74C429AECA5BE737DE8C01 - -count = 40 -seed = 41CC9DB2E90239AB5158A2628E7478D0B3512FDF84CD27A4CA5FE3119A455C22045F198C3C5C39F491FB975BD1CFF7F8 -mlen = 1353 -msg = AE2638D944822298959F47B2173DE7D1E58AAA622296AD4A4CB67EC7EAD8220AC2F171605BA2D08AF3D6FF5849566EAF96209E9E00CC28EB9A517CF5061545AAD24CCE143A2EE1AB7CFA259AD9C01860B33B0036F2CB3A5086861212F408C5F055D226CCC77CC884452B2670D89548EC1C6E98FB311DF03979CABF725E78956AF185447287BCA2517F554E9F25E19D93790318EFC5D2602FABF262E5C7FC307E5A991E0122E332A803AC4A91B318B30D79394248521190D2BE326037A89FE918D139F763DC8DAA2C3BBCE53F04809F0D97303F2F1B88B572B3086ACAF38EEF36B4C0791B4918204B0E1E923BCE9E3BB1E7BAA07135B176E266AF174D5DF26C44842CEAC4AE4C1CFF05557DA3DB8651261BE78D766699B1891CB825FA9A418C45BB9F7F2D347F3F92F9529CA6DB94E2FFCC69337FB3690F556C5A44CBBD9D79F60AFF063DE68B14BD2F4B7E8CDF94F6C2F40219D27F71E8AB3D4D6872A5D4B82EAF8E3943A6D425ED04FBC5C7596AE929AD680B245E3D6A7C5CCD7FDFA1D14EF0F72B9BAAEF05B7B84ADC02913DDBC76D5FE80DE30527FFAD1825CCBA34F8587C5B0291471D6957AD99C5FBCF3669B4AE5930C8AF68305C2D3E84E714CB9049A9560A3C94AEB95A252F69B68F755DC0E0AAB52DD054B670A275BD2BAD7FF8EC0CDE6224E9A0EB537E95DAB992C382D6B03FA045DA402CE7C5B55138FB400D9E86AFE30923AFEE82C4528D1B38CE16D33BEB47A96C18428D919BA98C9782806D6F4A40B52F7F0989337C724BE24E9A5430CFEA470D02EA36CA479FAEAD94A74049898D1F1BE53D5AB8CC0CDD5438A7C55827131DE264AECD18E5F5F2F9FD60E8D2D6F55BEB27EB77AEEAC2A15432A5F1467483BE6073243D0165A6C242FE1BD7B7AA701A0827F286ECB51E4C2626DCBE95466BC94A7E2A09AB334FEE3959CA31974B6286E2A2051653341623CF3ACA65637DF657280B6025DB0C0377EC09E6E32010F0F59711A30496695D23728319DFD0AB5F3AA69025276E68808130659D912A53693584188E310B1CACC41AF4B19FAD8DA95D4B35E2569053F553A9DFCBB8FDEE1455DFA0E4F5E94324C86A24288AE27F3576AE15FBC8BED49BFD8521D77A61FB523BADF0E3CEE53799016C6EE4E1E5DEFC19C7717A5C41ED8FA6BF0E5811BAEA76676DE03767A607735C2A48BEDE511012EAF1F79E4D2C3566042FF2C63BB82FBB399CE20E1F268D3844BB473AD7366EF86D064C5BA080FC0C01BDD2AD343C5367D80D2A058CF40725268CD34123C219D9109780335611B008EE3F8848EA9D174D7B96BD2FD9A04FA2B550DCF0B301D64C0764299D317DCD0CA05718A1AC008D86FEA330095E81567E83BDE31A0D635098D7B86176CE6CC4025E8628C73B394D9A45B09B64BFD3A424162B16E1ADAA1AB60006847C6D5CA5733237A330147CFE6B9170D7B88834BB79F1FDDEFCC0EBB1D4FEF326E28C41C919607BF12AD112807BF8582933DDB096F1F3E2BCD6BCBD844DA317CEA2A7688A5FBBA14D84C537814EC2B171ADE28ACF83EA481631B968C26F8D2BF2C5AF7D61A93378E1E23FC756E2F0EE79199475AB4BA1FBC55D9ADC2B05888B2910049BCA98DEFEFE96CDCB67CA9D4AA5BBFC6CA0ECBB78BF29035D158DE2A1708D98BEB85C70AD1C64B39B387516073E2FE85BD9EFA25CB048C224E0EF76547DCA67FD66485A97EB5E56C06C78FFA08EC1C9C6F2380912A2585CBCBA2CD702CD2B51022F63EC920412989BD743A8A8BEB07241E3E8EB38CA14CD400C83DBFA6FC8E04F58529007A1477E9613291AF877692E4CA9AE118A1902AE7B4AE7DC2E992A6495CD19DF32CE64131A8D8C41969A8BAE1D870DD5F1360BA9278D5B76E746FAF99D526199E87A4B1D3A5C48A33989F103CFB2 -pk = 16D7202A6149138CF42FC07A4ED0AF0F5A2DCD63E0141A13CD5C9DFD2B65590D2B4BDBC74DE72732D12E15A624E5985A7434A46B085A6C0DCDE597509337C010 -sk = 16D7202A6149138CF42FC07A4ED0AF0F5A2DCD63E0141A13CD5C9DFD2B65590D2B4BDBC74DE72732D12E15A624E5985A7434A46B085A6C0DCDE597509337C0100200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006D3C5FE448D6D2CE633866F94415BA13E6D9CF4EE6F5E49D69A1E7711B4A66D039654F1D08E78FB1E3208AA28D8004000000000000009482B4B3DB7733F9E152F398FB1EFB6CF0244580DCD2FED7D8F1FA85135DE61DCD0F7BEFB45060285BE237DA9D3CFDFFFFFFFFFFFFFFF0473640AD89C0E299E3EF97C5909C92D5A3BD4D4777552777580874029602000000000000000000000000000000000000000000000035B08A91CD11B70D0F1DF17EB0F6D03713190283CF5B67CAEA11A70B2C0807000000000000000000000000000000000000000000000044AF099A89633C7F5F685C87844CCACEF950C462E348ADA8FE218111D12F4B186A9ABA9A9E438BBCB19DE60118B6DDD044431FD6BB1756BC608772445B5FF3308783AD33DEC51E94961808398D9A62C589B5A3EA26DF8765F5E407A950443007EE6E2B338620CCFECB26D8C6C8AA530A676F2781A90FDC3B35E022DF0084D41B1D58E2A48A0193FD166E36BE25056F77E342BA2C56A9BD21A077FDDD75F095155421845868D3E2E1A2BC0CEF494783625268F0F4E815DAFFF4F1B4DFD8B621294CFB2C8FF64550E7E7999556505EC9263258831697BB7DA29CE90D2F79D7E304A83D93E65EE27DD7510EB689E548821F2956D723A3C742623E6462216104082B21EB41D223818FD420533CC5A4A88751407D1950FF8E81A2E30841000074552A9C3372E22D3CCDC06C4127E4405EAD580BC060CF067A9E1C96BD33AF7ADE150F79B7F0B3376DBCDB81809F7C2553D0EC2A0662052C59ED5F5914BB16C387231324BE93C58392A4CE4E2809E701433A67D093128914AAAF2DD89DE98D721EA30001ECB305354ADF704BBFE59645A46ECA974BB07362BA36A6B230B1EC4BFC8D221657093EF979971540FD50FCF0CFECAB39A1FB67EFAA9464BBACBB9BE7A2F217 -smlen = 1530 -sm = ECB444F05851B2DCC500D761F9D786E3CE5CA9063B0F8C8C4F68C6086D0451C653D3ED7CB5A91D03EA8D5A44982B441AC5003E4E5A7D7F6F2C84F005CE90CBA2173949DF2706F773C02013AFB8FE510065EAFB5547DC08AFF10642807F2A6DB9920BBD066B67B72144BB51B124013ED175D23A2ECDAC8104ABC7E8A5C6E330A9F8073202724A3785E9DB9400017DB47F20674CDAD8E2E91310B779B2AE0C035EC66BB781F86DF13A0230548286938FCE00AE2638D944822298959F47B2173DE7D1E58AAA622296AD4A4CB67EC7EAD8220AC2F171605BA2D08AF3D6FF5849566EAF96209E9E00CC28EB9A517CF5061545AAD24CCE143A2EE1AB7CFA259AD9C01860B33B0036F2CB3A5086861212F408C5F055D226CCC77CC884452B2670D89548EC1C6E98FB311DF03979CABF725E78956AF185447287BCA2517F554E9F25E19D93790318EFC5D2602FABF262E5C7FC307E5A991E0122E332A803AC4A91B318B30D79394248521190D2BE326037A89FE918D139F763DC8DAA2C3BBCE53F04809F0D97303F2F1B88B572B3086ACAF38EEF36B4C0791B4918204B0E1E923BCE9E3BB1E7BAA07135B176E266AF174D5DF26C44842CEAC4AE4C1CFF05557DA3DB8651261BE78D766699B1891CB825FA9A418C45BB9F7F2D347F3F92F9529CA6DB94E2FFCC69337FB3690F556C5A44CBBD9D79F60AFF063DE68B14BD2F4B7E8CDF94F6C2F40219D27F71E8AB3D4D6872A5D4B82EAF8E3943A6D425ED04FBC5C7596AE929AD680B245E3D6A7C5CCD7FDFA1D14EF0F72B9BAAEF05B7B84ADC02913DDBC76D5FE80DE30527FFAD1825CCBA34F8587C5B0291471D6957AD99C5FBCF3669B4AE5930C8AF68305C2D3E84E714CB9049A9560A3C94AEB95A252F69B68F755DC0E0AAB52DD054B670A275BD2BAD7FF8EC0CDE6224E9A0EB537E95DAB992C382D6B03FA045DA402CE7C5B55138FB400D9E86AFE30923AFEE82C4528D1B38CE16D33BEB47A96C18428D919BA98C9782806D6F4A40B52F7F0989337C724BE24E9A5430CFEA470D02EA36CA479FAEAD94A74049898D1F1BE53D5AB8CC0CDD5438A7C55827131DE264AECD18E5F5F2F9FD60E8D2D6F55BEB27EB77AEEAC2A15432A5F1467483BE6073243D0165A6C242FE1BD7B7AA701A0827F286ECB51E4C2626DCBE95466BC94A7E2A09AB334FEE3959CA31974B6286E2A2051653341623CF3ACA65637DF657280B6025DB0C0377EC09E6E32010F0F59711A30496695D23728319DFD0AB5F3AA69025276E68808130659D912A53693584188E310B1CACC41AF4B19FAD8DA95D4B35E2569053F553A9DFCBB8FDEE1455DFA0E4F5E94324C86A24288AE27F3576AE15FBC8BED49BFD8521D77A61FB523BADF0E3CEE53799016C6EE4E1E5DEFC19C7717A5C41ED8FA6BF0E5811BAEA76676DE03767A607735C2A48BEDE511012EAF1F79E4D2C3566042FF2C63BB82FBB399CE20E1F268D3844BB473AD7366EF86D064C5BA080FC0C01BDD2AD343C5367D80D2A058CF40725268CD34123C219D9109780335611B008EE3F8848EA9D174D7B96BD2FD9A04FA2B550DCF0B301D64C0764299D317DCD0CA05718A1AC008D86FEA330095E81567E83BDE31A0D635098D7B86176CE6CC4025E8628C73B394D9A45B09B64BFD3A424162B16E1ADAA1AB60006847C6D5CA5733237A330147CFE6B9170D7B88834BB79F1FDDEFCC0EBB1D4FEF326E28C41C919607BF12AD112807BF8582933DDB096F1F3E2BCD6BCBD844DA317CEA2A7688A5FBBA14D84C537814EC2B171ADE28ACF83EA481631B968C26F8D2BF2C5AF7D61A93378E1E23FC756E2F0EE79199475AB4BA1FBC55D9ADC2B05888B2910049BCA98DEFEFE96CDCB67CA9D4AA5BBFC6CA0ECBB78BF29035D158DE2A1708D98BEB85C70AD1C64B39B387516073E2FE85BD9EFA25CB048C224E0EF76547DCA67FD66485A97EB5E56C06C78FFA08EC1C9C6F2380912A2585CBCBA2CD702CD2B51022F63EC920412989BD743A8A8BEB07241E3E8EB38CA14CD400C83DBFA6FC8E04F58529007A1477E9613291AF877692E4CA9AE118A1902AE7B4AE7DC2E992A6495CD19DF32CE64131A8D8C41969A8BAE1D870DD5F1360BA9278D5B76E746FAF99D526199E87A4B1D3A5C48A33989F103CFB2 - -count = 41 -seed = 1C13369824A3FDD41B1065E17297574715D9BD9CE5BB733D36D22C31B62BB1033989A604D78BFB1A0746BD4A2271FC0C -mlen = 1386 -msg = 9D84E1DD28C513987D5587A4427853762B7D7AF668FF9EC2E90211D6CF5C0DE6C7E54B298C1A6C67EA9A693CEDC4FCA1A6ADC2C6DD0E5BBCEE7266B9C6AC8FA8AF5E50078A6151F938161F1FEACDE4D8079B5A9D563423258CF3AE9E47D8E75740314F2FFA63865A8B30743F773A53E1AEDEAC45CAAE01993B75C8116FB0B431631AC001AA8BD02E5B83DE627AF0CCB3A3D86F66A7E5FB658F9226DF31095780A6E8262A247D70F4E7C971D108567FFBD7FED0E16B7FFDDD93F5764C3E02A61998C32146564D46589538B2E071AF86A26321A3523354F4F0C396B863FC8E9E2E3A173901D0D178A9D2828D0E0974B72CEDFB17937D6054F185A81D4F853787E6C3681A74FE25FAA6C256A9F9E9A9253F98B9AE4B8FA0068DC28BC7E8D5785CFAD20F7DDD643DAE6A2DDB02713C9CAFC2EB2FD18EFDECED05CC24913061BDC38E932DB5E8181FC0D3DE26A94E2138800B3C01E07E83B3B0BE187EDC75DA576AF1CC7B7122367EFFD6EBF05F4C2EEB0AB6E9F91201A4237910A87DE9FEF777981D48FBA28AB8D64D76380911F2A6621335DFA96B331AE8B3242EA1F2A260260244196B0B9596C411218A17D0A58D3B5735B9AD7B6259655CF6E2D0FE5B37D0A0B02E67951F5D3FB277B6E1EC87528B08229AB0EBD895CBA2D075A47CC8100E9DD17DE7D951BF0A68D710AAC21C8226D8CA95AC49FCBE9D493A8D3C7F93FA61685BE57FF422FAD036304F317A3DBCFEE7A4610C8C1DDAA79E37C19D6414F47230E01EF1CD5C7C2FFC319A29AE6A9C95B06C603F2CFC1D1FC914B036CDA6CF9A876946983B06123C2E5C7D09BC190647CDC0512F35DB9E214C77D3D7D0234C3F2590941236A367700F9C04D3AFB949DCA2067571BF28E78ED35FC026BD801C4AFEE9BF31C97580953950D2E81EE6426E78D6F8134ED19707473F0874367C86C9BE170BE63405A9BF7C46A420724B6CCFF9C21B015E21BB02C5A7AEABCA873B46571530DE56E47288C3424DA398517ABB6502A9A6A65D4983D97E479941C44CF0136D225991226F70837E2A7D1E9CB1226F40BF59D52C66549BF8E360096954F5875C466160A0C75A252E5FE6B8F1841FE210BF08520CE74D77B69692086EF50BB64732F19D1A49E5800F077700553290635D418168A6B9E3AE980112AFB9D58A18B94F972845C309E86FEC7E456191D8760A1C2106036E44C5C9A5F2CFBC67D741E8E937E99ED7820AB0787E39C385356EF0F05CD3E31C44115A8892224197B1D1F554D5098B72058FAD49C665F716A266CB4DB6204666E1DC07B6CFDE0EA00345661E0F94A5025D2EC98483CF482058D2EDDB018CEC11D91EB46B63971AB29367DB46137CD7690D5782E3A3DDC8CABD545FC1AAD8A9A0A39542AEC55CC3D58A5BB5E4A559DB1FCD2932EFF6E81C8B8E5AD5B4E0424A444BC55D96DF63C8971A5890310FE19DFF8ACBA72D96FD3F32D67D41A2F3D0B343489C7FDEE7556012C2D88E2BA9D512B71E7D04F92E6BE3A9386565271D755BED752C853E4539F95C3287A275004F76B9A93837C6EFC6760BE4A39B8AA92C7605AC369472FB29E11ACAD98FC91B1B9BB3505638D4D46A3AE3C10C8DC115C35725F06649BFB00BA1EF214B9F2FE98BE2DA99AB23E7B9F014F5C5D0248A9E0E088AC175C8048C6BEB5108DA59DC234E9EDFBE603BA912BEA22505C2A9EAAE766FF55AAC8392AEA5C722DF25BC6C9FCF9B0275DF71206A4E5290FC5E71D79928E357400DCB04EFD7CC9BD0B86E04BFED9BDBCE5787E40FCD6041ADDA615B5ECF03C30AB9B2809E3514E9AC87226C55F259C5F157945B0073431715E1740DCB319EDDDD1B5F2763F0439CC0D6ED5867D9D98C227CA3008F30D1B2AEA40DC73FF8289E4A21586EFF519520F888E7E2F6D29A269C12607D13D398F437CD7F0A07C94EE1E1E3D8518D0C97BE1E250D79C5AE1709AD8A638F55 -pk = B15D4CFA9052B7C8F191A49A272EBACE0511A38947E3050977B585A172B7711D9B7F5BB67E661E97940062F7955570674A76F21E19143F0B4938BC20581ADE05 -sk = B15D4CFA9052B7C8F191A49A272EBACE0511A38947E3050977B585A172B7711D9B7F5BB67E661E97940062F7955570674A76F21E19143F0B4938BC20581ADE050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009594E9019421B63F6A8F2AC5EBA8D16A78A8B89BB568075869164B0530B6DADFF069203533AD254411E56BC7C26EFCFFFFFFFFFFFFFF5C01486B21B4AD4D55EC37D9D80454D11D657887BF515F5969D1E79DB230C3DB0DE15AEE726425E8350A362F1FEDFBFFFFFFFFFFFFFFD0BA0C3C180FA646FB3E336DDC4363214E38BC7C037AA9D371B87361D77B070000000000000000000000000000000000000000000000DD8841D3077990BD94C1508616E8B2D682CE315958F109AFAD5C438E8CF0050000000000000000000000000000000000000000000000F32E5FF1CD2B1505B3FEBBF9D2B7770FBA522DD6617519A72A4EAE77E931331778F61ED00EDE5370A666FF4B8B39A14C6D4F70FE036C841937F4BF5334F95D23ACA9C7347951C104942B667D531A91D09AC59E5CBB7EBBC78D82E1ADADECD73110C401B7C3B116CFF204B6A845054EAF2C25A4C57CFFA789FEA4B5FF2D1326303E4306EFF618C1236506D9532EAC37097D260C9F4E4FC69C2B90BC3402AD4C1252FD3B20ACBAA53672184CE2CCBE7B0E10A495B051D7D59950C4F1E11F72E4280A3186AA1FADFE2FA4999C5BC11EA54309A6CFE7B9326F5A0B51EA9FED688E338AD11EB9566994BDF1F64E33C86772A9FC93BFC2AE0D42CF768120551C7D041FB54F46A0438989D274D130AA4D04BBA6B1F428762939FD9AEE34AB81759B8F1350A838DA409C81D2311FB901007F789241A97EBBA25CF744C1FCB65BA5E8051FABB6EB0F934F53686271C4340F0A656CFEF82B9F843F4460EEF497FAA0BF36307842E17329F4CE38A47D8D4444A082991E043C36A9CDE0A6E3DC2A605FD8580CB1A6BA2EA8B8D1A9E8CC66D9D2AA8DB1792002EF86196784B4DDB5CDE235DC0C93D61EB00B655596B47AA43FCC7F019ED138ED6891C5531375130AD78D58791E -smlen = 1563 -sm = 10B120FBD9FD0780FF00827CD7C2ECE8CE93B1075D4781D8AD446CDFE0004803FFC110B6ECDE6204BE70B2DA7CACD77B6101C13850D45E24F63E4406C0197A4AD234E4AF610637A3C7492B39D7740901A0D98A3370BC3371B907F6CE199E6A5A1FA9FE0428E99586F221A6CFFC039E4A100EB53563C77200FF4CC1F7E6BB7A783703CCB3EAA65968C611F105001FC4301CEB4037A33DF9D98D5BDCDA3D0803396FF627F972AD4523062F0B3A30A7BD6C009D84E1DD28C513987D5587A4427853762B7D7AF668FF9EC2E90211D6CF5C0DE6C7E54B298C1A6C67EA9A693CEDC4FCA1A6ADC2C6DD0E5BBCEE7266B9C6AC8FA8AF5E50078A6151F938161F1FEACDE4D8079B5A9D563423258CF3AE9E47D8E75740314F2FFA63865A8B30743F773A53E1AEDEAC45CAAE01993B75C8116FB0B431631AC001AA8BD02E5B83DE627AF0CCB3A3D86F66A7E5FB658F9226DF31095780A6E8262A247D70F4E7C971D108567FFBD7FED0E16B7FFDDD93F5764C3E02A61998C32146564D46589538B2E071AF86A26321A3523354F4F0C396B863FC8E9E2E3A173901D0D178A9D2828D0E0974B72CEDFB17937D6054F185A81D4F853787E6C3681A74FE25FAA6C256A9F9E9A9253F98B9AE4B8FA0068DC28BC7E8D5785CFAD20F7DDD643DAE6A2DDB02713C9CAFC2EB2FD18EFDECED05CC24913061BDC38E932DB5E8181FC0D3DE26A94E2138800B3C01E07E83B3B0BE187EDC75DA576AF1CC7B7122367EFFD6EBF05F4C2EEB0AB6E9F91201A4237910A87DE9FEF777981D48FBA28AB8D64D76380911F2A6621335DFA96B331AE8B3242EA1F2A260260244196B0B9596C411218A17D0A58D3B5735B9AD7B6259655CF6E2D0FE5B37D0A0B02E67951F5D3FB277B6E1EC87528B08229AB0EBD895CBA2D075A47CC8100E9DD17DE7D951BF0A68D710AAC21C8226D8CA95AC49FCBE9D493A8D3C7F93FA61685BE57FF422FAD036304F317A3DBCFEE7A4610C8C1DDAA79E37C19D6414F47230E01EF1CD5C7C2FFC319A29AE6A9C95B06C603F2CFC1D1FC914B036CDA6CF9A876946983B06123C2E5C7D09BC190647CDC0512F35DB9E214C77D3D7D0234C3F2590941236A367700F9C04D3AFB949DCA2067571BF28E78ED35FC026BD801C4AFEE9BF31C97580953950D2E81EE6426E78D6F8134ED19707473F0874367C86C9BE170BE63405A9BF7C46A420724B6CCFF9C21B015E21BB02C5A7AEABCA873B46571530DE56E47288C3424DA398517ABB6502A9A6A65D4983D97E479941C44CF0136D225991226F70837E2A7D1E9CB1226F40BF59D52C66549BF8E360096954F5875C466160A0C75A252E5FE6B8F1841FE210BF08520CE74D77B69692086EF50BB64732F19D1A49E5800F077700553290635D418168A6B9E3AE980112AFB9D58A18B94F972845C309E86FEC7E456191D8760A1C2106036E44C5C9A5F2CFBC67D741E8E937E99ED7820AB0787E39C385356EF0F05CD3E31C44115A8892224197B1D1F554D5098B72058FAD49C665F716A266CB4DB6204666E1DC07B6CFDE0EA00345661E0F94A5025D2EC98483CF482058D2EDDB018CEC11D91EB46B63971AB29367DB46137CD7690D5782E3A3DDC8CABD545FC1AAD8A9A0A39542AEC55CC3D58A5BB5E4A559DB1FCD2932EFF6E81C8B8E5AD5B4E0424A444BC55D96DF63C8971A5890310FE19DFF8ACBA72D96FD3F32D67D41A2F3D0B343489C7FDEE7556012C2D88E2BA9D512B71E7D04F92E6BE3A9386565271D755BED752C853E4539F95C3287A275004F76B9A93837C6EFC6760BE4A39B8AA92C7605AC369472FB29E11ACAD98FC91B1B9BB3505638D4D46A3AE3C10C8DC115C35725F06649BFB00BA1EF214B9F2FE98BE2DA99AB23E7B9F014F5C5D0248A9E0E088AC175C8048C6BEB5108DA59DC234E9EDFBE603BA912BEA22505C2A9EAAE766FF55AAC8392AEA5C722DF25BC6C9FCF9B0275DF71206A4E5290FC5E71D79928E357400DCB04EFD7CC9BD0B86E04BFED9BDBCE5787E40FCD6041ADDA615B5ECF03C30AB9B2809E3514E9AC87226C55F259C5F157945B0073431715E1740DCB319EDDDD1B5F2763F0439CC0D6ED5867D9D98C227CA3008F30D1B2AEA40DC73FF8289E4A21586EFF519520F888E7E2F6D29A269C12607D13D398F437CD7F0A07C94EE1E1E3D8518D0C97BE1E250D79C5AE1709AD8A638F55 - -count = 42 -seed = 7AD6C7DF00C9E52A75290D28DA946305D83CCF6DE2515C19A8E26850C34C8C2E545E2E32108F13B9C97F87AB68D10131 -mlen = 1419 -msg = AF2860129C08A1A9C7A7BB3120B3E40AFA1A4A09050C8483E7511FABF3285544D4CE3F41401DAB8C17DA547F6777A72519F6EEAAC83016FA0E0FB0B33329DD02AB8EB1F291758074EBB5B7C4C102B75BA422821E6755B37B914D689D84808A89CF88F69A446F489A260BA03CA52A4AA14E8BCF4BFE5134DD2918A88D67329B9BADC6ADA4A3071FD21CFC45235FA0A1B82D91C5877F10AE087464251C8899732AA7FC8F6C0A5BEAF4FA41E64CA97932925A06E218272500249577705804C6DD9F0F61DEE6AAE096BE0AE5E67923137933FE4D61E9A88DFD5B3BD75AEEAF5018A5153985E2837AD1AAD5EED91620D935EB9982DD2364B5413F490BF251FC783503FA146300E6ADAE0682E0597C3839C645DBE855919BB1CB80C3DC6E233909017BB31F5ADAEE05CE442EEF594FC15FEC3A2B4B81ECAAD1340B0677F27009290AB3AB8788556389047F63C2CE9390658E151CA85BAAE45ED2FE12B6667967F6B772EE683AC2E7347C7B0EFA332B3354B5043CB86200F8E4249F68030844D00A86FAA7B79A4129AD676D1E9D58828A1AF4C6BD68C29CC23002E0A0313500BA717B8756D4A18E41E381DF8D7A999A153876DB876CA4A508486A4F331CAC9CB3E7C416C6329713CAB76E1C8B63A8CAD46F8EB1E65116F89A3B4EB8FAA14A73097CA71AEA3220BE7FB7FE64919893930445D962C309E23332E4B3ED8CA768EF0ED46EAAB199827AD628A1BC20CCD9F61BEF67F7FCB017300EBC7493A7CCDAEDBFCA5F91E80B80DECBFD9EAD9BF22FE16B563512C7383D34801C504202D7A0E19821EC8495016362EDAC165904D2BBAC484DE1D4112C3A3E6EA56A78785B7CAF2A44B5BC8BECBC50BF4B521C1D086086FEB009C06ACB8FA0F53E7654FB02AD7898E35E5F3A7DCFC50124BA1F30178C707F4D36E4E7758C4CF82747753CC30A836311794A6A9017F53ABD17A1C9647AB38BA56AAC83C1812DEE8A5A75C5CC958780A3E9C3C1F39729BD365948F7FCD8104CF09660060FBAD2BE9B8D8E5BDD22286EB0BFD4010681AE7928D0FC008E21C8F877D97B5B9C7A06C02530FBC6A9D6FCEDFEDF68A9682177757CDDDFFA6CB9086B8330E61851E2761D84DA37635EA8441E3B23FD165CCEA562B0A3616B30EE5FAE00F76D6801B22F2215D80829E01DB2C0743E3074CF26C96B0EDDF97D79FB9C7FFE9B5CDB891F9E61FEFE7E1CBD28FE25B7858921C8C99C45A84B50A8233037DACC20BEEEBB9B22089DDAF2EBF0698498DA694F75ED2463D09BA2C757A986B8CA556CDF46CBCDF288C078041D497242F66411F47F35A21918855F105F24686076FA21BC1283F17245A7122A848B4BC10D996B2C5161FCE0336B2EC747A4A07FA9851AC5423D1EFC4B524E795B2E4BFFD1C5CD21F5FEC954824DCC53BC3883A7F571A9323DFDD2682C4A4C54E8862F347C9A8897779170B257AD26D90121DDE722A3F214A44CF6C5A5DDB2452A2471EBE7FC8D0EF7F1EDC7920CB42A71E4DB49A0168D51843F47D17BADE50DCB340E5F7B7E5B6A6C3AFE0FB26B5EA172A4011EEE838E5634E521483C6EDBE9994B0658406ED8F4998C7B4E869845CD16CC4368DA3BC1B025A6FFAFBF540133C372D452DD831DCAD39D61CCED0A0AD193FA9886EAC749001E3BEAD5A7962275FC62298A1BD054F4BD97ACAB2BBFDC355C73509D98B6DE5B4CD774BDCAF1398532BB3DB56524CC047ABDE6880C3B282FCE0FB2AD7E4C5F7BC138B48D194E8C8036DF4B9F3949E912AFE5D2734662F27583193D0FBA2B73C1A0D012DB853BBBE4383F6C391F3220E1B5761C337A054FC9FDF09C01864B87324A90C776EFBF5D34A68DEE38EBAACCBB61B4C79A58CC848184F605D43CF9D40BE90C1FBCF6735270132B59A636B16ED28111246270AF32EA2CB7A42A084005AEBB6161002E65B37217361BC269F5ED12F7D50613C82934A6D1D98D1308AC82827B7504F3FD351E0ACA1C62843C9219023FD092692BA4B83BE198EA -pk = 50BC12E5F180ED07640A9288432EA8C6F3D23C1B73E06BE75DC1E659FB022031D3F1B6D6E7D70FED728953467D4EAB749279C5FE111156211239BE442A7EE404 -sk = 50BC12E5F180ED07640A9288432EA8C6F3D23C1B73E06BE75DC1E659FB022031D3F1B6D6E7D70FED728953467D4EAB749279C5FE111156211239BE442A7EE404020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BE3A307A207D530C57489C487F2148D615756E0FD835611C76CEEB9D376A8B226B968EA156D25BDA6A308E5C30B300000000000000001911364DF5A1BA743BCA24B2AD8811C3D2FA11BFEBD5FF00A389232E4BB595D74B9011D2254ADEEAAF628AE4C57FFBFFFFFFFFFFFFFF170C8ACC5C0AC80B5296D8CF9A4C8E937AB207BC25F8EBA39DB97CA089EEFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1C64A321280C9E481ACBB43A23E82CF94585632E940184CC2FC9B6AC230B0000000000000000000000000000000000000000000000CEE953514274AF37062BDD1808ED7EED5A8C7366FBBDD972FB32DB162BFD6605FF1D6E59853DF0920C2D965549D1623EB52E1B7D1A57FB1366B794FCCE8ECA1FBF4C4FFFFDFD06BBCE722BD4FB16686D029CDCBB889F21CC5E797D8D4A8BA911F6E263770AA3663675F1AF01C8F4E5D9432CFB8C602EBA9C0635237F4EDD030728053360FBF5B9E5E6D52EFB31489FBDF068397AB916C5B1B04E73D82F78D827030ED8A2572B3B6F3BC6C543313A516F41AE4C46EB6203444D80FAE3D8251C0B40E0F23FB5D0B3D1B1091793EE622F14510A172CBCAB07A6496842C8DFD4E62F582F72DAE9074341D42606B05A47D3864D02C582A83AE2CE51CF0BF4D41016241EA8BBE35807AB76809E304D0EEC09F2B7667E866BBFA9629328FCA3AFD685275648EE1081CE6DBBB0BAFA5D35CA5178310A4F967717E679B513386DAD478C09627B9F717A4F03EF4461696C3F4E6E3166FBAE1A70E7C84CDF7DFA16D8C4DC1933304C4B6BDCAAFA84EB8F908529A9E66860A9502E686072644F73B3AB420523E160094017ACBDBFE02AF45EC88065FB38A18F5F3E63A7FCE289A263CA16C4041E7DEF893B843CD34588CE1B73C0B04F436239781BE23A2C7EF7D54BCB0A4E09 -smlen = 1596 -sm = 2B40784671F51D25C3076EC2C39DBAB6DC6C0707DD76939FC5CD732C8A05F49290B13C188291EF0433DBC1B673A69C8ACB0695F76069937D1657A1021AF15B5F65118278AB01F56742806F6B828821054EC2C3B2AEE45AAD8D0204D8CEAB131FC2A07505A3BB98581F7F35C36404D6F249FE13A2F92E620483523CDD16F14D748901C6BAC26053B03F954D0201393811864CB0F999B92C96D1E6B2B8E20201052EF8E33ED12E23E90237512709397DFF00AF2860129C08A1A9C7A7BB3120B3E40AFA1A4A09050C8483E7511FABF3285544D4CE3F41401DAB8C17DA547F6777A72519F6EEAAC83016FA0E0FB0B33329DD02AB8EB1F291758074EBB5B7C4C102B75BA422821E6755B37B914D689D84808A89CF88F69A446F489A260BA03CA52A4AA14E8BCF4BFE5134DD2918A88D67329B9BADC6ADA4A3071FD21CFC45235FA0A1B82D91C5877F10AE087464251C8899732AA7FC8F6C0A5BEAF4FA41E64CA97932925A06E218272500249577705804C6DD9F0F61DEE6AAE096BE0AE5E67923137933FE4D61E9A88DFD5B3BD75AEEAF5018A5153985E2837AD1AAD5EED91620D935EB9982DD2364B5413F490BF251FC783503FA146300E6ADAE0682E0597C3839C645DBE855919BB1CB80C3DC6E233909017BB31F5ADAEE05CE442EEF594FC15FEC3A2B4B81ECAAD1340B0677F27009290AB3AB8788556389047F63C2CE9390658E151CA85BAAE45ED2FE12B6667967F6B772EE683AC2E7347C7B0EFA332B3354B5043CB86200F8E4249F68030844D00A86FAA7B79A4129AD676D1E9D58828A1AF4C6BD68C29CC23002E0A0313500BA717B8756D4A18E41E381DF8D7A999A153876DB876CA4A508486A4F331CAC9CB3E7C416C6329713CAB76E1C8B63A8CAD46F8EB1E65116F89A3B4EB8FAA14A73097CA71AEA3220BE7FB7FE64919893930445D962C309E23332E4B3ED8CA768EF0ED46EAAB199827AD628A1BC20CCD9F61BEF67F7FCB017300EBC7493A7CCDAEDBFCA5F91E80B80DECBFD9EAD9BF22FE16B563512C7383D34801C504202D7A0E19821EC8495016362EDAC165904D2BBAC484DE1D4112C3A3E6EA56A78785B7CAF2A44B5BC8BECBC50BF4B521C1D086086FEB009C06ACB8FA0F53E7654FB02AD7898E35E5F3A7DCFC50124BA1F30178C707F4D36E4E7758C4CF82747753CC30A836311794A6A9017F53ABD17A1C9647AB38BA56AAC83C1812DEE8A5A75C5CC958780A3E9C3C1F39729BD365948F7FCD8104CF09660060FBAD2BE9B8D8E5BDD22286EB0BFD4010681AE7928D0FC008E21C8F877D97B5B9C7A06C02530FBC6A9D6FCEDFEDF68A9682177757CDDDFFA6CB9086B8330E61851E2761D84DA37635EA8441E3B23FD165CCEA562B0A3616B30EE5FAE00F76D6801B22F2215D80829E01DB2C0743E3074CF26C96B0EDDF97D79FB9C7FFE9B5CDB891F9E61FEFE7E1CBD28FE25B7858921C8C99C45A84B50A8233037DACC20BEEEBB9B22089DDAF2EBF0698498DA694F75ED2463D09BA2C757A986B8CA556CDF46CBCDF288C078041D497242F66411F47F35A21918855F105F24686076FA21BC1283F17245A7122A848B4BC10D996B2C5161FCE0336B2EC747A4A07FA9851AC5423D1EFC4B524E795B2E4BFFD1C5CD21F5FEC954824DCC53BC3883A7F571A9323DFDD2682C4A4C54E8862F347C9A8897779170B257AD26D90121DDE722A3F214A44CF6C5A5DDB2452A2471EBE7FC8D0EF7F1EDC7920CB42A71E4DB49A0168D51843F47D17BADE50DCB340E5F7B7E5B6A6C3AFE0FB26B5EA172A4011EEE838E5634E521483C6EDBE9994B0658406ED8F4998C7B4E869845CD16CC4368DA3BC1B025A6FFAFBF540133C372D452DD831DCAD39D61CCED0A0AD193FA9886EAC749001E3BEAD5A7962275FC62298A1BD054F4BD97ACAB2BBFDC355C73509D98B6DE5B4CD774BDCAF1398532BB3DB56524CC047ABDE6880C3B282FCE0FB2AD7E4C5F7BC138B48D194E8C8036DF4B9F3949E912AFE5D2734662F27583193D0FBA2B73C1A0D012DB853BBBE4383F6C391F3220E1B5761C337A054FC9FDF09C01864B87324A90C776EFBF5D34A68DEE38EBAACCBB61B4C79A58CC848184F605D43CF9D40BE90C1FBCF6735270132B59A636B16ED28111246270AF32EA2CB7A42A084005AEBB6161002E65B37217361BC269F5ED12F7D50613C82934A6D1D98D1308AC82827B7504F3FD351E0ACA1C62843C9219023FD092692BA4B83BE198EA - -count = 43 -seed = 38FFDE9B60DEDB5BBFAD6C52AA02EF6D49369BF276C99E588D796A4F260E0FF0A65C96C35863BAACFFD9B212EC305E7F -mlen = 1452 -msg = ECA4505D43235F274D902464F4E763312BD11060F908621A063409EB42FAA6BB5E20FACD87B8FF41767C20F69B1F7E05D5F3A957F48DEA57DCC91824FA48DA6DDBDE7E3327A0A8D46A47606EDA01E67CEA1F29BDC5FBA446DE60541DBED6F73D1FC5F49BD77D45285D3D8CA93F6DF25AEEF9324BEDB40E800ACB49794AB05E6D0AEB11A5994FBA36DABB9559CD93CF522174061C116CF31874A18C46689FB8C075079DFAF73EA0EA7FAADD47AD8EF68C06AF9738B41BE771020FEDB79CA3D0165427B58E547105FCF82A12B67579D1D3AAB29968817068732CDBC5A2E9E8D55D17468D03F38D564F5AC6EFE1538E4A680E9E15E35AB54D07B6B58EC9EA7815CCF29F4F880CBF1946F39556BDC2BBC78A5134FA7A086DDC146AD9D503A4CA837E0823BF0728453F6B053788C69EFF8D11ACDF5F07282A75CBD17F2AED58E39D862FF056DF17178625234CA7E03D22AAAFC4C07E3FB08F4297B511B10579934D2761FBB600C9454AC05FFF80CFB93DE3B9E0DDD0AB1E494DE477DA2B5635E48D5BED5CE359E66A3AC845826BE2B4BBFA6D825373BB2A4E93AA417648D1CEA755AA4978784D6D9489F6738B4DA03FAEDC659408D9395C934AF774749A498B1406522351F86838865F53CB0157247484FD37EA59BA72FF3226AFF1EEE353ABD34DDD63FCC89387B947027E04A6F4ECCA1EE5F6BD1CA758AA4F796FE839338164B58D8E5D71E6D5CDEEF6B279EF15A7BAD873B12F7C5B3E2817C37BF00802D2534D425D52D0BD5935BF8658E5BD39B5268CC45D0F27CEE5A57300F497E77AF5268970782030E6928281379CB14BB56D2ACD963D189C078C7A60E98A782F9483ECE7B4871A061277186A01E878087381704BD72C63C32CBF2470A561C22A5DD3A1988B7ED0D274182E1B075AF277920B362D612DC7ED82057EBFE51A3CA5A9A9A45DE015C460BE6A48CF67C820813048A1CEA0FC3D7307F802B4FB7E523E7C8555FA56DCF66237F176D3D973C47F55AF93FC4BC92B98B7DE89829B1471DFF53B649CB03B719DB58DAF824DAA2DE570DF6314DCAF5B705557F9D783559277A754F3CD5B783D5A577EBE4A065D320284B01F71540F1986BCD443CF4FD480DBE06EF7710387CB5185DEACB5C2A612BCA275950B8988F247C4B773D8983D87F47D60F5BF80E6E7BAEDEB14B5FFBC46893A81C63F99F511D3E24FA8F7B1BA66A7DB0C1D9ACC6B5010AD725BDC2282D8A24018C975C8B12ED3326F48194D4FF93EBF051204CD224EA39F27D63FE07CFD0162358B412DBFD4715AD049EE5A31638D3111AF2DB7952F3A973646612712A607EA35826249D14CBDE4380D8BC986067B1CC27503449FB128767986A406585C3D40DACA75C27BD36117D2487BAE82CF639ED1FA016ADD279D109B8CDAE59EB31E1F006CB7AF000A267E8582E55375CF6F06D1A47BE9BFA21C8428045B9DF96808AD74D054820A4D0873257EB318A3DC9B6D9585D973E26D435345B4D699A952C3092EEDDD975FB59474212080D03EC489C695F19CBA4D1CAB1AE8D2E2C730B06E657D33722D24222FF7B613B6E8608E8A6003E11C80239FF431B5D8FA52B84B867A581798833590524C7B84EAF6CDA9CA94C5AB8EF55A1262EEC5C37467807C89FF7D075606A3902E7247E9C6646839C18493584D33DB65D6DFC0F23E68C9D13FD57FAF4836C28926693DC3EE372DE27A9D3E4AB4229425EF48CC410F1792A51C9F6FA5316A1D9A7C99979884EF350B4882F6045921CA88D4E44B435C69C1AAC11660971C2A3F6480C79E6E146C0B5CD2371BF5E7486AD7D0BE88D62A2AE8F0D73C17CBAC86FF6BDA55A880B182A5237498E9CB343A9CD82D7784B72473D222E688D13CB81B2908BBA854B9624A11DBE8CEE9C3825C1BFBA476B4D23D0B0C325F1C498A65A3589EA8E8DF8DD9030B279EDE30443CF80367CEEA4A122DC8329E5AD42491CF57EF47AE2B15F9C54120966B95ACD727A4A2B686B00626BC808F43D82D20DEEBCA79B074A7BFF38D2531AB2F726AC7087236EB3FB4BEC8A2D4207DC84C -pk = 924036157FED5C2EA6E25FCCCF7B885663D1B7DFC82D0E88D4B1699B644DDE01ABB63F772676A0764103D96DAB4CACFCD585ED119550D93ACCC96E1A15032A29 -sk = 924036157FED5C2EA6E25FCCCF7B885663D1B7DFC82D0E88D4B1699B644DDE01ABB63F772676A0764103D96DAB4CACFCD585ED119550D93ACCC96E1A15032A29020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000138B5B17B33133F0785273C892CAA9F24ED162F06B857549BE755CBE1027DDADEEF9ACCB7D5B63059BA537D5879E0100000000000000261A8AFCA61229375DB8C934306DCA99B04146071CF4DCC506BECFC0FB6492E27567119DEA8CA8D366C412DFEF8FF9FFFFFFFFFFFFFF1EA6E9E8A5398E62163047ADF1EFFFCBBEC45CEFBFC0D0A3142D29AE74DA01000000000000000000000000000000000000000000000043E688FE278FB16F2797B6B043A327B35B495998A3877084D58B7E8EF115080000000000000000000000000000000000000000000000CD6D446B1FE9745796AF63DE84E60A74D26859FE911742ACC574E8A9AC985A3324A096EC979D60D3FB4475008B75D09A2550080F34F27FD7C77479A94C04DD200281597783261B8FD0A52D2A7A8FB49DA2B5C15934B1BD8FDC5EF25D05D7E03043C4B94EE55AC60F1AF51F06F1FD7D1E2E597CE9CE56E35F2EFA3A1B62320F2B75F727539E65C06AA601D15CB24221762C88143976B80C6D4E8676B090387A3071A9131A75C9954E6F0F9DDE1E1A82E10A13BC1C1EBFE9DAC648FC8FA0757830A7027323176AE6E5ABA06DABC1691D15D6A535EDCB8D833CCADAB2F5F5590333D78BBF210FAAD54FC47BD80F0ED3BD5D70FD10F7921074E877D07E04CB121D0DEF8793E8F9AE5E4A8F00D1637DF4E4FC6755E5A1A48AC2662F3930A50C1EDA06C0B67DB0E7973E5A0EA9CC537AA551CD0715A318AC9030F75009351E9EE2E119A6CE8271B9F37A27DA4C5C7FDD1710FBA3EDCCDC15626520A80CA34621C9AE026F3AEAF5E6B07C85CE6E4532AF503676091830130FA8E0EA625BD101BFD9B924A4A127FA280374C8BBF4CC99E7438E3CC06DB1C3F702E6DF19F166E128E76E2EDE8F4A8F489AF2B049FBDAB41FBB37E7EBED32BFAEDD8CEF402D198DF032A60F -smlen = 1629 -sm = 2D9B41EEA5400A72D300D20B841796A156F20D0267B5A4D5CDEBAB019D0794269A0D09D435D829007D455D4A53E39DE15A004CBE1941CEDAA67837048984008049CC8FBF5E0564E81E351E85001AC704D6CAEC72038267833502EC39E8E09E4A5BF52D008C1F2465AB20C1273907914AFDBA873A5BC23202E64E669582AA11E413063575A9577E6EE5043E0001D1F1D3715149E8EF7182C37A231F2BF80703F9343FA453C915B22902B116A11EB896F101ECA4505D43235F274D902464F4E763312BD11060F908621A063409EB42FAA6BB5E20FACD87B8FF41767C20F69B1F7E05D5F3A957F48DEA57DCC91824FA48DA6DDBDE7E3327A0A8D46A47606EDA01E67CEA1F29BDC5FBA446DE60541DBED6F73D1FC5F49BD77D45285D3D8CA93F6DF25AEEF9324BEDB40E800ACB49794AB05E6D0AEB11A5994FBA36DABB9559CD93CF522174061C116CF31874A18C46689FB8C075079DFAF73EA0EA7FAADD47AD8EF68C06AF9738B41BE771020FEDB79CA3D0165427B58E547105FCF82A12B67579D1D3AAB29968817068732CDBC5A2E9E8D55D17468D03F38D564F5AC6EFE1538E4A680E9E15E35AB54D07B6B58EC9EA7815CCF29F4F880CBF1946F39556BDC2BBC78A5134FA7A086DDC146AD9D503A4CA837E0823BF0728453F6B053788C69EFF8D11ACDF5F07282A75CBD17F2AED58E39D862FF056DF17178625234CA7E03D22AAAFC4C07E3FB08F4297B511B10579934D2761FBB600C9454AC05FFF80CFB93DE3B9E0DDD0AB1E494DE477DA2B5635E48D5BED5CE359E66A3AC845826BE2B4BBFA6D825373BB2A4E93AA417648D1CEA755AA4978784D6D9489F6738B4DA03FAEDC659408D9395C934AF774749A498B1406522351F86838865F53CB0157247484FD37EA59BA72FF3226AFF1EEE353ABD34DDD63FCC89387B947027E04A6F4ECCA1EE5F6BD1CA758AA4F796FE839338164B58D8E5D71E6D5CDEEF6B279EF15A7BAD873B12F7C5B3E2817C37BF00802D2534D425D52D0BD5935BF8658E5BD39B5268CC45D0F27CEE5A57300F497E77AF5268970782030E6928281379CB14BB56D2ACD963D189C078C7A60E98A782F9483ECE7B4871A061277186A01E878087381704BD72C63C32CBF2470A561C22A5DD3A1988B7ED0D274182E1B075AF277920B362D612DC7ED82057EBFE51A3CA5A9A9A45DE015C460BE6A48CF67C820813048A1CEA0FC3D7307F802B4FB7E523E7C8555FA56DCF66237F176D3D973C47F55AF93FC4BC92B98B7DE89829B1471DFF53B649CB03B719DB58DAF824DAA2DE570DF6314DCAF5B705557F9D783559277A754F3CD5B783D5A577EBE4A065D320284B01F71540F1986BCD443CF4FD480DBE06EF7710387CB5185DEACB5C2A612BCA275950B8988F247C4B773D8983D87F47D60F5BF80E6E7BAEDEB14B5FFBC46893A81C63F99F511D3E24FA8F7B1BA66A7DB0C1D9ACC6B5010AD725BDC2282D8A24018C975C8B12ED3326F48194D4FF93EBF051204CD224EA39F27D63FE07CFD0162358B412DBFD4715AD049EE5A31638D3111AF2DB7952F3A973646612712A607EA35826249D14CBDE4380D8BC986067B1CC27503449FB128767986A406585C3D40DACA75C27BD36117D2487BAE82CF639ED1FA016ADD279D109B8CDAE59EB31E1F006CB7AF000A267E8582E55375CF6F06D1A47BE9BFA21C8428045B9DF96808AD74D054820A4D0873257EB318A3DC9B6D9585D973E26D435345B4D699A952C3092EEDDD975FB59474212080D03EC489C695F19CBA4D1CAB1AE8D2E2C730B06E657D33722D24222FF7B613B6E8608E8A6003E11C80239FF431B5D8FA52B84B867A581798833590524C7B84EAF6CDA9CA94C5AB8EF55A1262EEC5C37467807C89FF7D075606A3902E7247E9C6646839C18493584D33DB65D6DFC0F23E68C9D13FD57FAF4836C28926693DC3EE372DE27A9D3E4AB4229425EF48CC410F1792A51C9F6FA5316A1D9A7C99979884EF350B4882F6045921CA88D4E44B435C69C1AAC11660971C2A3F6480C79E6E146C0B5CD2371BF5E7486AD7D0BE88D62A2AE8F0D73C17CBAC86FF6BDA55A880B182A5237498E9CB343A9CD82D7784B72473D222E688D13CB81B2908BBA854B9624A11DBE8CEE9C3825C1BFBA476B4D23D0B0C325F1C498A65A3589EA8E8DF8DD9030B279EDE30443CF80367CEEA4A122DC8329E5AD42491CF57EF47AE2B15F9C54120966B95ACD727A4A2B686B00626BC808F43D82D20DEEBCA79B074A7BFF38D2531AB2F726AC7087236EB3FB4BEC8A2D4207DC84C - -count = 44 -seed = ACC98B16DCC9A50EF57F332D66255CA56C2BB679CAE705B4297F1418DA845861448DA6CC5CC458DE6C6E96128EEB2898 -mlen = 1485 -msg = 96E2865A0E602EA4E3C5657A7F761A6F771007989FF885261F5638C14C1BF80AADE34CB956D2B5FA1CE38FDE831423201D3692E8E6F40E68A68C085DBE3C4CD8E35394F74072F44DE98A74E42C9176A86AC06BED8C0CA937DB4C3BF92371106B7A68EA8FDE1D1E082CCF522A397401AD0F8DA6C82BF76EAB8AFE101C7FF023A0FCF015B40ADA0073363E7CB25260C18662D651222A4CCF1B290EE6F7B111B9A963211D67D7674B499449F760352FEEB9FB7265A5F2F7F20C0174802C7F48226D92620D3E009E85B104230C21BA2FB0012DAC4BDF9FD184E09CB3E593EB1F3EEB418A8BF3173E6CB91FD8080C7E80DBE6730833A4A9F22C52716731C7CEA4F70CDE0F81D2D9AAFB6B60820598A7F6AA1B963B7686528E6E7885AE085C3D26C4ACBF9FC15080D972CA841175B343E59FED79AE3CB4DBB4F0D7D463BD3E0C4B2090139145B8D7DB5DB10ABFA51DC909C5CF7809030D72A5090CDC765EECADE2B365F719127548CA601AE0D21E402E18050ACAED30EE13CDDADACC9373A87A218787B585319A7E66FBB13851F7AD0D2BBC1EFE6EFE4F7ED248D844F58B6A5A21FA9295E0044982AF6286DE296550F72B5E416373F1DAC006687DED1E7D40961E5177C207579F25E77BE808A6BA33DCE8A2A6F88E97AE98ECFBEE5296D4A170E3574D9BA592A384CB0545BCFC32B3831C0B736AB77440722299F192DCAD519523995F71F2983BA87AAD2261E6E01C19DCCAE00F8D6914501D1AC3D4AFF0C12FA125ECDCA34DCDD8407F0045F8E8BE0763E19EB007ED4DAE36E30AFB07F8DAA7431B72F4A0A8017B3FDE27123AC3E8EE575F8BE310F68F81B696DB1FE63CCB8D32B899B209B2205956D209BD6E48166BBB4372A607E83C47698DB5AC8F9B40D05F38EFC4A4A1309D999D5CE1E1A5828D56EDA4666995897C8E6362D0B5054F04BCCF79D03852D1003C80CCD55E9F4578D8BB2C8E220A4D7A4E2190024C85C718654CCF174AC96C1BC50EA49F961EE7697C88E6BB718679F1D1F1118376B31A4B8C0471F6D7AEFC5AB426515D1B2CF0EAE66246B3C4132A63C63D7E33EB9DF8D8807215D58F46EE832AD3EC893D74E00C73510B9625F62D4EB5B500EECDBC7D088D3D318077A4A0F7D64ADB13220232C08DA75D23CA7B20CB109C972B7C159863991C32508339558B9383DDFE7E7DDA740E5BED0EBD14ED300C634DB01F359F81A7133669183EB187C17A2C8AB855BFCE73E34A1F59ADB0EC39EC0C7573AD3620A819333EE79D5E09CB8449F91923EF4C5E21549EB7F56075C014E1C3AD2805E682F07BA8AA265745CB600A460069678745FB9638F6709D62D2DAD8DEFDD5A4D0C2AE7401292BD1DA5F40D4CF5D59A403932FFB677237AD74691CAE29FA31B955172EFC5E83C225F2DC0430AB0C909A97BFB468AE182ECF91E9026DE819F3440FBE69B9DE26F812FF3F3CE8037F124AB368B1153C1CC127D140F754C525D4799E1A19D93B90460E6518F0B6936DC6310B7E9E6534B595E00225978214EE5AEB12A6F45B5C73FE86771818843FF7A6B88379C37165D9DAD48AFFD6FBABD11B1FB90AA5A78918B317C5F9B2CED6B9647F130DA9F91E1B1CEB84F6E1618248F06D654E159F71033072F1517064BD96A5C138402771ABE7F39F53A798C2423B748EB7F310485D6376722E204FA33B9740E7FA68364289A677C5C78A19A7707D2549BF9329334478C64351FEA1634388ACD4BE57E4ABE9374A0E999B770CD81B1BF4A8FF300C297B116CEDA1A4A1C1BD5A2275581A0589A46142139FC596A1406D16293076527CDF9AEA2D0919F9678423B7D95B153DD1D9D62B72A12F6491A36604D19E7BB83C476D232769425557D3480623D40B7AC27C0F67D4ED5CA4D487BE915A68352DCB03A3929A4BB795248EBE2FBE0612833D9305A0A31D195718BAC193FC59B880042A7F61358104A919C7E7C210F02A856B8B1057DD8527FD4AE1EA81F9E1BF7C614ED8A312C95154873F86632CBD60C65176F13CAC695BB4C23675331058397D6E96E4F9DEEB859E3937553D94BEDE3C2B9A5EBF00964A49AB294BCCEE09E5A97381D2375941AA775A47F726E9 -pk = 57FB3B4F429480D4B3F3F73A7A7E012516DE22F524E50AF7EE53369363CCCE2ADA0DB41A2AF39E3FE324D197C30ADC389FE9C55389AC618A43A9024E5AC83325 -sk = 57FB3B4F429480D4B3F3F73A7A7E012516DE22F524E50AF7EE53369363CCCE2ADA0DB41A2AF39E3FE324D197C30ADC389FE9C55389AC618A43A9024E5AC8332502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045AECC2DC915372FB9F13F1D467E22DB193D453575577CF752473C4737E3D950B7AA966B10CA2FBAD71C85516241060000000000000068D52F9F70A953FED59696E0BC040D46519AF61281BDB990FC2AFD7F5B86F643C731A2B8086BA77E361C3387EDDEFBFFFFFFFFFFFFFFB0B1E5213DAE8B99B4FEAECCA8616C1F5F53948360756A97E6064E4AD9ECFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B63E772CF56EB3A5213C55758A5D2EE298A434FF6098C26E9C3F74578060500000000000000000000000000000000000000000000002F424E58AA4CBEB226F5BD9A7E3843C40689BFE79D6D0CEBF1D19CD165B78924CE63A83F7907540005F47F8FE3E9FA5EF50445096ACFA62990AD16160DE271028DC2B6E70F1AC805BF6636D1A8F318E9075EA5F0783EFEC9010D80F182E02628B6C150AC555DB84472ACB06DFFC41F07532D725A9FA12F45144DA214E4119A0E9A37B3B73966894264F0752DB53E8F035BDCDC428B0698B03493E1145AD9CC063F396DC8FA31466AE28ED70D66845204AE9E8C12CE417FF42163ECA947EBD013D1DB7A7E6FC4BA46D7B2578E835217FD57EAF85F35830A7997023227EFB4911D39F43F879E5BA8BE3AE0509329D37271065E1EDB3FFECED34F06DFB7DA8C6026E3F6BF77D91ED73C304D077AB27207B4C578B21D0C3443471D01C4C3B838D712C8B39F15295728727D57A12538AA64F1ACB52F587ABAC67374ACBEB6E858DB1951D96855FD52425212DEA233214CB9852D3778B9EEDCD3092A5CF5686C642812BB0AE24E60BC613277D0A581483B912E98D20619902C919FBFA00DA34ED7B32C2AD6B0CEEF7C20852D694584DD27C03BF0BF7B25BE89E9639F3C638FCA9F410EA5997DFCB9690564CCBB7A03F2719E4CFDB9528449002C328141B35A3F394933 -smlen = 1662 -sm = 867D48F39A8477C40E07F41A020A583B730E140732556A19026A02198B06DD9E3AA52785781583024DAD89615044C73868029D218D887148661340074DC1D7600904A59798054A5A08F961F6AFC95A06D9C636B09CE422017D04616001382D72C0B5DF05873CC642D60A673AD800D16FDBEBC7E237709200CD4CB8726246854ABA010DF7DC0CDDE5C898C607000971CE0D035539357A91A0478082AEB30F03F8C6C720142ECA883703AFABD69794B8050296E2865A0E602EA4E3C5657A7F761A6F771007989FF885261F5638C14C1BF80AADE34CB956D2B5FA1CE38FDE831423201D3692E8E6F40E68A68C085DBE3C4CD8E35394F74072F44DE98A74E42C9176A86AC06BED8C0CA937DB4C3BF92371106B7A68EA8FDE1D1E082CCF522A397401AD0F8DA6C82BF76EAB8AFE101C7FF023A0FCF015B40ADA0073363E7CB25260C18662D651222A4CCF1B290EE6F7B111B9A963211D67D7674B499449F760352FEEB9FB7265A5F2F7F20C0174802C7F48226D92620D3E009E85B104230C21BA2FB0012DAC4BDF9FD184E09CB3E593EB1F3EEB418A8BF3173E6CB91FD8080C7E80DBE6730833A4A9F22C52716731C7CEA4F70CDE0F81D2D9AAFB6B60820598A7F6AA1B963B7686528E6E7885AE085C3D26C4ACBF9FC15080D972CA841175B343E59FED79AE3CB4DBB4F0D7D463BD3E0C4B2090139145B8D7DB5DB10ABFA51DC909C5CF7809030D72A5090CDC765EECADE2B365F719127548CA601AE0D21E402E18050ACAED30EE13CDDADACC9373A87A218787B585319A7E66FBB13851F7AD0D2BBC1EFE6EFE4F7ED248D844F58B6A5A21FA9295E0044982AF6286DE296550F72B5E416373F1DAC006687DED1E7D40961E5177C207579F25E77BE808A6BA33DCE8A2A6F88E97AE98ECFBEE5296D4A170E3574D9BA592A384CB0545BCFC32B3831C0B736AB77440722299F192DCAD519523995F71F2983BA87AAD2261E6E01C19DCCAE00F8D6914501D1AC3D4AFF0C12FA125ECDCA34DCDD8407F0045F8E8BE0763E19EB007ED4DAE36E30AFB07F8DAA7431B72F4A0A8017B3FDE27123AC3E8EE575F8BE310F68F81B696DB1FE63CCB8D32B899B209B2205956D209BD6E48166BBB4372A607E83C47698DB5AC8F9B40D05F38EFC4A4A1309D999D5CE1E1A5828D56EDA4666995897C8E6362D0B5054F04BCCF79D03852D1003C80CCD55E9F4578D8BB2C8E220A4D7A4E2190024C85C718654CCF174AC96C1BC50EA49F961EE7697C88E6BB718679F1D1F1118376B31A4B8C0471F6D7AEFC5AB426515D1B2CF0EAE66246B3C4132A63C63D7E33EB9DF8D8807215D58F46EE832AD3EC893D74E00C73510B9625F62D4EB5B500EECDBC7D088D3D318077A4A0F7D64ADB13220232C08DA75D23CA7B20CB109C972B7C159863991C32508339558B9383DDFE7E7DDA740E5BED0EBD14ED300C634DB01F359F81A7133669183EB187C17A2C8AB855BFCE73E34A1F59ADB0EC39EC0C7573AD3620A819333EE79D5E09CB8449F91923EF4C5E21549EB7F56075C014E1C3AD2805E682F07BA8AA265745CB600A460069678745FB9638F6709D62D2DAD8DEFDD5A4D0C2AE7401292BD1DA5F40D4CF5D59A403932FFB677237AD74691CAE29FA31B955172EFC5E83C225F2DC0430AB0C909A97BFB468AE182ECF91E9026DE819F3440FBE69B9DE26F812FF3F3CE8037F124AB368B1153C1CC127D140F754C525D4799E1A19D93B90460E6518F0B6936DC6310B7E9E6534B595E00225978214EE5AEB12A6F45B5C73FE86771818843FF7A6B88379C37165D9DAD48AFFD6FBABD11B1FB90AA5A78918B317C5F9B2CED6B9647F130DA9F91E1B1CEB84F6E1618248F06D654E159F71033072F1517064BD96A5C138402771ABE7F39F53A798C2423B748EB7F310485D6376722E204FA33B9740E7FA68364289A677C5C78A19A7707D2549BF9329334478C64351FEA1634388ACD4BE57E4ABE9374A0E999B770CD81B1BF4A8FF300C297B116CEDA1A4A1C1BD5A2275581A0589A46142139FC596A1406D16293076527CDF9AEA2D0919F9678423B7D95B153DD1D9D62B72A12F6491A36604D19E7BB83C476D232769425557D3480623D40B7AC27C0F67D4ED5CA4D487BE915A68352DCB03A3929A4BB795248EBE2FBE0612833D9305A0A31D195718BAC193FC59B880042A7F61358104A919C7E7C210F02A856B8B1057DD8527FD4AE1EA81F9E1BF7C614ED8A312C95154873F86632CBD60C65176F13CAC695BB4C23675331058397D6E96E4F9DEEB859E3937553D94BEDE3C2B9A5EBF00964A49AB294BCCEE09E5A97381D2375941AA775A47F726E9 - -count = 45 -seed = 8BEA4E384E73C7E0B47381B3063334291A0F06D28DB61B5BF65B01D0A747722E0AA62B81AD46C00C8A5C31494E513836 -mlen = 1518 -msg = 047E2D484D798B3829CA6037D6C1588A2349DE09C5DDFBEC987652CFDA01454ED791DBFFA3D9DA13A35230ADBE1B39B042E3C70589658A03F75447C1CF3970DC10FE5A4A9E980F2A33B642B42E5E66E9AC4E7A56888FCD72913A79489B5B163BD37B8C3C8D242FFEB37D0C1ECE21034BE9E3685798C2EBC6B809DEFC02C6F0C2A3AD70EC0BAD12D57ADD63EC3584CA98E680267FA514B34DE4147C9D901B59914D49CE9E0F885855ED0CE7973F3307B675408F90B51C6A4D38A414D970EEC989CC7900D7723E19ACC4EF743F6D39EB1B563B8C13D42C0056B6C49732854925B606467F7BC662D17B924FC65E9C3CDC2AE73FF73040011A152B05ED7F96B2FF4CC39A22484AF72812EF02B08EF4DCB64C8936E74549AFDD5D876027FE2B431E61E52E8793888473F4C1E5C1BED2C4AEF8E5E300A735B302474FC6F54869984F1A62DAE29C7C9A0CCDECAA55FE137BA14B5C5C121E0C5EB33B035E01F3415529E0826B27498D7A71B0C086BACD140C02A5948AA54799D0DD0FFD384C7E68578247FA28D205B18ADAC94F7D3C8ACB7DAF71AEE347B577D97EE8E7E865CF4FC1C16640AD1E9D0192AA13AE81A71118408E145B6121ABB75B4BFFD1D403057D4AD5CC730452475A7F067690BB81E81E17BA8DBC31059969B20D387BA59CA8CE499E59A65C8583F29CD539F4F75DDCC68C7BBBC43C849802D8347143E2FE78C1AB6D7AB6BA9917301C88386B294AAC995C24AD680A8C3BDD7AEBEF21E84F5A1909A2D83A8DFE46A75F4B2B47614CD39BF3CA3460DE9BB5C37EB7349A17AB32214D031CE927806FA394470F407673B0CDC3D9A7E3749F09CA895D464A4269682CE6DDCB8FA0EC2F05372C73DC3D06FA6F58090EFBBC6D619A7A565D4EFE441AD7E018A7F5E1384B88EB4506FC54E0AB0A8B9EE3641760FFC08F6BDA78C12396473D1243BAAF6AE10316213115441C0B65C7E475B4E1578D066A47D9C6E92FA32D0F2C365FD15F5A2E88A81691F039DC642ECEDB6652D08ACBE64625B46083CE758FA96C142EB34477E065AEA04A45FF4FCC3E3D146ACD7041F5F7E4C6B26C8205BE7B66DB46DA55556CE02B48AF55A4710BB28B8CE102CB15C1A4AF59D9A17A2DDA6E2D1E96987F6AA9F4216D8D5E5CBFF7E2CB775E83A776063A4AAF937BF0EC84149EC1A7EE21F735D21625E85831B80DC11EBF04F30B13E3A7E4D4784C5F8C61C679E0B6863958F42ED31DEAFFB4C272A3731C1407445CA7673D225EB6509469DC6C1F0AF43EB00F18B3A210AA57D51169F2A9FC251BB338ED4E9DDB19282DCE871211D26482E13A8D533DEE00D36FF5CEA98DEA72D9F0B32DC398A3D5537A3373058FAAA3926C127A1EC739FAF3D57CC1A05D578074A3A72C3F2B1692C2BA1F1FFED943E7BFCBF1E664C4F52F7BF8D86174CA8910C290C06804A7748DB21008AC43E653D7FD7E0C982EDA9356F68DDEC26473956DFF281F7B767010C57F4AD09A05063A6B3CE078DD32F3DE1F40526C06A2D60E36E2C70502D5BEBFD2F3BFCACF8720CDE1657B9892406BAA3DF01E59313EB655B6A545331EBA01BCDB9C99E4AD7FEF7438AE8715FBE589A2F99CB9CA34B9610B3CE5BE38FCF979240698174348417420AAB069B8AD5F646F82958A136DC9F2F81E601056BB4AB5E10F4EBC4A00E18924C51D0FD104078471C6805C49D92C78C832EC3F10D8966E19ADD3D3B4516E12DAF4F63FE6BBD228062DB743D1F867800854F7BB7FFC2CAA0D01A0BB683E368673A8E664BBAA17A8C0C04BCFF05246F9C4F3020510A992EF26FD0933BBFDE9D042862DFFD33A6465F590A2287D8154777A89724FC3DF9F2F1B1ED8765E7C7B761CA4781006822065703ADE07A6E874E70928E1ABA29EE490690D24F6E73D96B85FB53ABFD1C1FDE439279E08FA232043B2344B267CFE5901C60E7CA14B0C85EDCFA2AB90F341821D2B4E25FE23129F2432DB932F23B5957706A433B308FB918D1C8D81EEB399BABE95E7229AD41F30460CF28671A4508B0BD1C61F48CDC23587BB9BDC6F565E76C86547CB71396661BEC8C7FC2223751F765C91C45C674C36B49AEDEF3DF2537F888904B507EDCD89155D40CB81DDA74376BC9CDCAFF8A368F1086C99EDE25526BC53F95F4017 -pk = 88D9D0A16C5EBF7A0B6E40F55950417EAFB27884437B3B90773C33BF0C4E0312C82ECEF91D1215AC28244DC09AEB91804D3B688964A1BA9371417E61D9989726 -sk = 88D9D0A16C5EBF7A0B6E40F55950417EAFB27884437B3B90773C33BF0C4E0312C82ECEF91D1215AC28244DC09AEB91804D3B688964A1BA9371417E61D99897260200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004E44CAF10A16CBF7D188A4AB251EDEEDFBBFE3FA14A2481E7F01170235654AFD027DC9CAC2E9913C8DD665E5424003000000000000006790A634270655AFB5CD078F16312DA8AF61EA2D6FC8433AAB010945140AF11560619D51EF6266E0810897344B42FDFFFFFFFFFFFFFFD78C206AEEF292004067297043B19FFDE071E87243DDA7E96AAC4D507993F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF665175A2FDFF04D6581874A033E624946BED769F9AE1BB897EDC713380DB020000000000000000000000000000000000000000000000DC3C4DA9125A385E6F966DA9B23DA112693AB94EFD8A462F0A62BF78F1F9C330732BD1DAE45EB236647A72BD80997986F327687C1957CB168CC0E4CD73C6D02C3E45E0C47F2E9F46CD141FEF41DE9E9CB45CABDEBE08AE85FC3E9F2BCA170C1E2DEEBEC49C324381E09942052B2EC3EE4B9386C994E401A3E168E0797142370981B0C6F83DD0EE2F3BD002262B82FCB30028A3CA1E4705A97580A9EAD1A8DD3062E4F7DA230AE4EC0019356F5353EC3C676CFCF76462ECA85FCEE28F49AB23176C83470AC76696FC138559A7D4D689116DD293A3210A8F2E75C2211D936A640D61E9D890D36F55383B35706D7C00CD2473C633C2E27F1F5244F887A6C212F2331B46D029FE3A746D17D79EEC072A5EFC4661BD254763EF86C949C4F166FC4824271B03F456A8A8159DFE6BE95397D3FFFF3A397AF13888EB0E63550E3F0D0617F862ACCEA7E0E801C280C7ABBEAFCFAFBC28F1A91C4FC5768F8154C28DAEB905A41D6424D77B089438D20C9D3637EFCAB16CA38C6B09F0F72B026FF62747D126E4478F730CF30A3113FD43DADD64108E308EC0C248ED6D12695C180FA071A11E2102A8A112F4B0CC3FABB4187EA5E595BDAFCC777FE0E627602C4F033806BB28 -smlen = 1695 -sm = 406E109C1F01F2ED9802600FE270D42170F62E07B3CA9B11DCC1628F6F01BE804860A7D20D621207C0FEEF310C3622B6C6046586F7E7B4144E06F7043F83E81A889250C23C067364C2C98A0C2AC703074E02CA40168F23923005F3BC48E02453FC2145039311F1BCA57E8372DA03933E772C9B64AE65BB07BB23398B95B5A78A520569E7A63F6D17BC0A6F030115CA3D19E98C1815B514A98174632CB80103B8819069AF8EF9D3ED06F06A160136AFBD00047E2D484D798B3829CA6037D6C1588A2349DE09C5DDFBEC987652CFDA01454ED791DBFFA3D9DA13A35230ADBE1B39B042E3C70589658A03F75447C1CF3970DC10FE5A4A9E980F2A33B642B42E5E66E9AC4E7A56888FCD72913A79489B5B163BD37B8C3C8D242FFEB37D0C1ECE21034BE9E3685798C2EBC6B809DEFC02C6F0C2A3AD70EC0BAD12D57ADD63EC3584CA98E680267FA514B34DE4147C9D901B59914D49CE9E0F885855ED0CE7973F3307B675408F90B51C6A4D38A414D970EEC989CC7900D7723E19ACC4EF743F6D39EB1B563B8C13D42C0056B6C49732854925B606467F7BC662D17B924FC65E9C3CDC2AE73FF73040011A152B05ED7F96B2FF4CC39A22484AF72812EF02B08EF4DCB64C8936E74549AFDD5D876027FE2B431E61E52E8793888473F4C1E5C1BED2C4AEF8E5E300A735B302474FC6F54869984F1A62DAE29C7C9A0CCDECAA55FE137BA14B5C5C121E0C5EB33B035E01F3415529E0826B27498D7A71B0C086BACD140C02A5948AA54799D0DD0FFD384C7E68578247FA28D205B18ADAC94F7D3C8ACB7DAF71AEE347B577D97EE8E7E865CF4FC1C16640AD1E9D0192AA13AE81A71118408E145B6121ABB75B4BFFD1D403057D4AD5CC730452475A7F067690BB81E81E17BA8DBC31059969B20D387BA59CA8CE499E59A65C8583F29CD539F4F75DDCC68C7BBBC43C849802D8347143E2FE78C1AB6D7AB6BA9917301C88386B294AAC995C24AD680A8C3BDD7AEBEF21E84F5A1909A2D83A8DFE46A75F4B2B47614CD39BF3CA3460DE9BB5C37EB7349A17AB32214D031CE927806FA394470F407673B0CDC3D9A7E3749F09CA895D464A4269682CE6DDCB8FA0EC2F05372C73DC3D06FA6F58090EFBBC6D619A7A565D4EFE441AD7E018A7F5E1384B88EB4506FC54E0AB0A8B9EE3641760FFC08F6BDA78C12396473D1243BAAF6AE10316213115441C0B65C7E475B4E1578D066A47D9C6E92FA32D0F2C365FD15F5A2E88A81691F039DC642ECEDB6652D08ACBE64625B46083CE758FA96C142EB34477E065AEA04A45FF4FCC3E3D146ACD7041F5F7E4C6B26C8205BE7B66DB46DA55556CE02B48AF55A4710BB28B8CE102CB15C1A4AF59D9A17A2DDA6E2D1E96987F6AA9F4216D8D5E5CBFF7E2CB775E83A776063A4AAF937BF0EC84149EC1A7EE21F735D21625E85831B80DC11EBF04F30B13E3A7E4D4784C5F8C61C679E0B6863958F42ED31DEAFFB4C272A3731C1407445CA7673D225EB6509469DC6C1F0AF43EB00F18B3A210AA57D51169F2A9FC251BB338ED4E9DDB19282DCE871211D26482E13A8D533DEE00D36FF5CEA98DEA72D9F0B32DC398A3D5537A3373058FAAA3926C127A1EC739FAF3D57CC1A05D578074A3A72C3F2B1692C2BA1F1FFED943E7BFCBF1E664C4F52F7BF8D86174CA8910C290C06804A7748DB21008AC43E653D7FD7E0C982EDA9356F68DDEC26473956DFF281F7B767010C57F4AD09A05063A6B3CE078DD32F3DE1F40526C06A2D60E36E2C70502D5BEBFD2F3BFCACF8720CDE1657B9892406BAA3DF01E59313EB655B6A545331EBA01BCDB9C99E4AD7FEF7438AE8715FBE589A2F99CB9CA34B9610B3CE5BE38FCF979240698174348417420AAB069B8AD5F646F82958A136DC9F2F81E601056BB4AB5E10F4EBC4A00E18924C51D0FD104078471C6805C49D92C78C832EC3F10D8966E19ADD3D3B4516E12DAF4F63FE6BBD228062DB743D1F867800854F7BB7FFC2CAA0D01A0BB683E368673A8E664BBAA17A8C0C04BCFF05246F9C4F3020510A992EF26FD0933BBFDE9D042862DFFD33A6465F590A2287D8154777A89724FC3DF9F2F1B1ED8765E7C7B761CA4781006822065703ADE07A6E874E70928E1ABA29EE490690D24F6E73D96B85FB53ABFD1C1FDE439279E08FA232043B2344B267CFE5901C60E7CA14B0C85EDCFA2AB90F341821D2B4E25FE23129F2432DB932F23B5957706A433B308FB918D1C8D81EEB399BABE95E7229AD41F30460CF28671A4508B0BD1C61F48CDC23587BB9BDC6F565E76C86547CB71396661BEC8C7FC2223751F765C91C45C674C36B49AEDEF3DF2537F888904B507EDCD89155D40CB81DDA74376BC9CDCAFF8A368F1086C99EDE25526BC53F95F4017 - -count = 46 -seed = CFA713E4A63A6FFBA43BFB898956DC400507F68AD164C3D24A67B5F8D7548C9DB44DAA43E5E4A0990325A4233089318A -mlen = 1551 -msg = 6A58AA820275A2F43D0F05DD0EE484AF42B665FFB8F21DB322ABD256A5C753BC8FF6A2C71467922E09726655F1A7218E736752065C871221C0B9DEE6A9D56B78A1C3B7357774396F6980226DCA1F91BA828E06BBF324D5CCE8D584D9D298261C7149899FC9F74D501E920F22AA34706A79213E35914DBF57B9642A42EF0D8226E31ADF89D18C5F3163ADECC79172C95650D764E3729EDAA08C207D930C26DF8EE1291C1CF889283B70AF00C0489175F799273C837B281A5D1284E4447ED72598EFAE23B523274644DA19BC0359BA59E5BE9E5828FF587C335E136C1D789257864D2648EF9C03D1C4B9809DD07CEABD865254D3D8D597587D71E374FC2DDE89C22C2330E8904F6B53F637348434A21ACEAB9892D5DF8FF84CC58229782BED739BFB13448896F7B1064B499087F7547CFC0A49272C2A670A9431B1B5A07284B6749EF834510A3EC0C61A43D5D0EB48C8F487947C4FCCEFCC49DECCB6111D617407C76A1B4A849C9A190310711B102F142F9E9CBB29F46447265E2C8DDB9174B780EB4A51003FB68483A265F2475D5BF6ECE18AF0CF31BF24CDD56583E777C4340086917B78068DFD380466F43D020E285CEED97A467DB96BFAEC22D80B4A6EC0DBB98CFC44436A41CADC85A90B214F00990D7B7010BBE4AC94809A0450C9ABEE5AA4037A44B0B4DEBD264120E762086B8D6F17AFD37086C93A8A368BE97E0F7546AF16D731C21878063E38DF3DCF3ADE6DD2DAA43C198F49B5D9FF5362333F29EC2F13CBB90DBE4E703EDAE9A4F7334A1C5AC60D5972C4AF2BA61B63C93BF719854E615D16BA4F704C55260A8838679815FA59BE08C4243CACC1A584CC1B4E777FCDC6E5A167C4CC9093749ACE4836AE058BE89CCA3221A3F63F07089006E4C44E40653BF262945A640D8C2A24E7CC3529E4BE76286C86CA2089CB8D4684508D1FAB81EAE7D8C731B65A22700BF9009A3190F5ED837EC22F9112383422027AED838F16A7740CF79EC101865D320E380D4ABA745ACC8EED376DC5B3AABE58DEBC35F8E983C92906AA2E3D8FBBE237325302E2A23CB1312EA7F532D64E79B9815996D28E0183EB728A37E19CB219987576C142F4B2F66AC6C7C77028ED59A8DF27F78ACD3910DDFCEB88888B4A604E5D07AE1B53EA6DF6EC2163DDC4BAB422D2438FFA543B22441E50E4087FDE4BEE6D79D90A2F72548DDC41C5AE07DCC87666EA3C4B89A0B14AFE03B585E7CA507E5F29997F2368B0C68C6AB6E344C082BD06AE922CD8089634918D9132DF9CBD665A4149C59BF76B0E94F66481766FD79054AA80C02E0AE04A6E2BE090582171B2A9AF455CD9FC302CA9D1EC837EE26E0E4D0AC8F0692CB9ABAC979B58CA92E5194EBE46B520125BD0B3ED1AC2BD817D3510E33CFD17058F865DBC64E9B99352B6CAF10F0A5A47449BF927A8EBA06D34C80D77A0B00B88B25A4C8747AADBB11BA15ADF9C959B05C4371CD8439FE5028E004A2E1D2F21190466FC7FD56E9BA0599A0EEDD98246AEB4B85994787B7604CB52F5515B42C2FBD4B5E9E372A36CC4E66483DD884DFE42AAA5EE7FAB200D8EC6E3556DDE0F9E9C7346F9967F8F3CEBE1E4D1CD8E6046E5E94BBC74AD3D51DB0DC704F4A4025383F0391B9DA37BCA8EC59E807593A4F040FBB186607280967E5048CAB92215DC783D9045F7A0922008628C771778661E97E9F88EA84BDAA8BA61126F71D193A2A564E3ACDE7ADF2C0B3D5B022EB6E0C629782B0025C9079D4545D88AA2BA27D10C5DCBCFB7CF648939155066518878CC54A4F611AAC21BD3A1EC628D3352F049915FCA55234B9146ECE5F78FBE7CFFB35695363202EDB9EC3501A93B4B6FC81B3DFDB5245FEEC8AA54195262C2467E15506B7D42A7FF61D75998722D0208BBFEA05CE7D2E66900A9B34F44C2A21257C220C03F9D6D7F0312A36F5C12DA20FB5290D5CFBC1DEC7D05C44820885C479063CA88783C5AA128829417EC4DD41CF83A1D991DF2EFDFEFE375E93F0371695E353EF737F4A75106211A5F70C82B4F360ABCD078C9E829C82A6B7A36D22B8D1F6E3101BA009C759FC83999D52E29B387A8DC1658A43EC4C4D9330A4ED2138E035EBEAE6343A76A82849E37141FCE34E9A41EB5EF88BBB9257017AD8696C3847FD77AE103A082ED1A05DE9420984C147AFF927E1950244912079BDBE5CC07 -pk = 628CB55F3A3D469C2A5E163856C256C0BEB61775F240D5F3750D2EBE5800DA1CA586BDDE31186C8FD07E1FCDB5AAD66D9D7DE458C6BB39FA9DA46766B477F22F -sk = 628CB55F3A3D469C2A5E163856C256C0BEB61775F240D5F3750D2EBE5800DA1CA586BDDE31186C8FD07E1FCDB5AAD66D9D7DE458C6BB39FA9DA46766B477F22F020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000276675AE5B40C10BAB0227BD11676134C4D5F3B540DA9F35953CDC15EB627C565E1BAE4EB08A01264FC3F04D7AADFFFFFFFFFFFFFFFFC029EEE4164BB2CBCD55DF730DD5B0186A637992EB48438EE3CD8C961E6B1A08F921ADA283996E34033B32B1CB43FCFFFFFFFFFFFFFFE85B1E77D25E742C1317D27D7C2FB8F9D56A88CD0C7F488F49C4BF3BAB8CFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47065F286D79CCC27D779CF5BE2D55E1BB536930AC05DF90E83758DF18C30900000000000000000000000000000000000000000000007085026D451FEA1BA9E6F870355C9DF9CDD3411C0B9674ACB86A82B4C8B65A23FBB367890F7A57F9131C1E1C27B4B536724BC5E634D8C98B921A7228539FA71BBD1FBEF7D1A7C5CDBD2C23F8439CFE50379727E1FDFF5BCC372B8D91A8582D104DCFFD23CD5FF690D22832171BA040D8E2BE9406666324FC7DF4A20D52F6DD0DCB0D8522AD6322E2BB20DCC4BD6F9DD70D01695526FE2674F0704B4450AB9B1828B26C12D7517D3A746EB1B451FF2CD0F6D7E6CF081F5D7682069A9C731D15022581F3560B12A23C6FD9D0E1EE2B1D75A961BE96616790060DBA54688B0B7F29C69E7677B0B303560A609814D69C0D498BBB98F8F84C4F159212DF27372C9C2C4E47C0974E126140695880D08B2C92E2EEAC6516E856DC1ED9FCA7D3C2061F183F9388ED48B23380E642F9FF501D7540E7DC905A30795787B809CE500D05942FBBF39AAC34F5D88993E199B8574B5A4B0CC46FB3CE9A5A60B54C1C62028BC9082C6510E7292ECF701471AF09640F81A4112A51AB694DDD2E2F046737C2BFC809ED40FE3F08BADCB4DDB8087B4CBA73E6890480DCD5D5351A3DF6B54277C78A18AB5958FFB7C750D5FE0E2BF347F875974DACBA7CFD5B9A7259FD63383C5DEC29 -smlen = 1728 -sm = D061779D7012571E13058E19C9EE139A4A99FC03C09FC1D5FF68A7CB66015A846A67668EE3AE8A07DCD1EF88CAB5CB3D66003937C643EE5E17E22002AFFA36DD51574E27D304CB672C47A00A1625A0059690D3F2AFBDC8842A0270E434F81242F72E6405B099EA6997B6B00FC502E28ECFED79F4EA2CE005AACF90ADD862A9411D0087AF8383F391CC7C3407008984277E2BD8ACDC3B12F71F977839C10E0308320AFB926FB70C84006F0CACA351E4F5016A58AA820275A2F43D0F05DD0EE484AF42B665FFB8F21DB322ABD256A5C753BC8FF6A2C71467922E09726655F1A7218E736752065C871221C0B9DEE6A9D56B78A1C3B7357774396F6980226DCA1F91BA828E06BBF324D5CCE8D584D9D298261C7149899FC9F74D501E920F22AA34706A79213E35914DBF57B9642A42EF0D8226E31ADF89D18C5F3163ADECC79172C95650D764E3729EDAA08C207D930C26DF8EE1291C1CF889283B70AF00C0489175F799273C837B281A5D1284E4447ED72598EFAE23B523274644DA19BC0359BA59E5BE9E5828FF587C335E136C1D789257864D2648EF9C03D1C4B9809DD07CEABD865254D3D8D597587D71E374FC2DDE89C22C2330E8904F6B53F637348434A21ACEAB9892D5DF8FF84CC58229782BED739BFB13448896F7B1064B499087F7547CFC0A49272C2A670A9431B1B5A07284B6749EF834510A3EC0C61A43D5D0EB48C8F487947C4FCCEFCC49DECCB6111D617407C76A1B4A849C9A190310711B102F142F9E9CBB29F46447265E2C8DDB9174B780EB4A51003FB68483A265F2475D5BF6ECE18AF0CF31BF24CDD56583E777C4340086917B78068DFD380466F43D020E285CEED97A467DB96BFAEC22D80B4A6EC0DBB98CFC44436A41CADC85A90B214F00990D7B7010BBE4AC94809A0450C9ABEE5AA4037A44B0B4DEBD264120E762086B8D6F17AFD37086C93A8A368BE97E0F7546AF16D731C21878063E38DF3DCF3ADE6DD2DAA43C198F49B5D9FF5362333F29EC2F13CBB90DBE4E703EDAE9A4F7334A1C5AC60D5972C4AF2BA61B63C93BF719854E615D16BA4F704C55260A8838679815FA59BE08C4243CACC1A584CC1B4E777FCDC6E5A167C4CC9093749ACE4836AE058BE89CCA3221A3F63F07089006E4C44E40653BF262945A640D8C2A24E7CC3529E4BE76286C86CA2089CB8D4684508D1FAB81EAE7D8C731B65A22700BF9009A3190F5ED837EC22F9112383422027AED838F16A7740CF79EC101865D320E380D4ABA745ACC8EED376DC5B3AABE58DEBC35F8E983C92906AA2E3D8FBBE237325302E2A23CB1312EA7F532D64E79B9815996D28E0183EB728A37E19CB219987576C142F4B2F66AC6C7C77028ED59A8DF27F78ACD3910DDFCEB88888B4A604E5D07AE1B53EA6DF6EC2163DDC4BAB422D2438FFA543B22441E50E4087FDE4BEE6D79D90A2F72548DDC41C5AE07DCC87666EA3C4B89A0B14AFE03B585E7CA507E5F29997F2368B0C68C6AB6E344C082BD06AE922CD8089634918D9132DF9CBD665A4149C59BF76B0E94F66481766FD79054AA80C02E0AE04A6E2BE090582171B2A9AF455CD9FC302CA9D1EC837EE26E0E4D0AC8F0692CB9ABAC979B58CA92E5194EBE46B520125BD0B3ED1AC2BD817D3510E33CFD17058F865DBC64E9B99352B6CAF10F0A5A47449BF927A8EBA06D34C80D77A0B00B88B25A4C8747AADBB11BA15ADF9C959B05C4371CD8439FE5028E004A2E1D2F21190466FC7FD56E9BA0599A0EEDD98246AEB4B85994787B7604CB52F5515B42C2FBD4B5E9E372A36CC4E66483DD884DFE42AAA5EE7FAB200D8EC6E3556DDE0F9E9C7346F9967F8F3CEBE1E4D1CD8E6046E5E94BBC74AD3D51DB0DC704F4A4025383F0391B9DA37BCA8EC59E807593A4F040FBB186607280967E5048CAB92215DC783D9045F7A0922008628C771778661E97E9F88EA84BDAA8BA61126F71D193A2A564E3ACDE7ADF2C0B3D5B022EB6E0C629782B0025C9079D4545D88AA2BA27D10C5DCBCFB7CF648939155066518878CC54A4F611AAC21BD3A1EC628D3352F049915FCA55234B9146ECE5F78FBE7CFFB35695363202EDB9EC3501A93B4B6FC81B3DFDB5245FEEC8AA54195262C2467E15506B7D42A7FF61D75998722D0208BBFEA05CE7D2E66900A9B34F44C2A21257C220C03F9D6D7F0312A36F5C12DA20FB5290D5CFBC1DEC7D05C44820885C479063CA88783C5AA128829417EC4DD41CF83A1D991DF2EFDFEFE375E93F0371695E353EF737F4A75106211A5F70C82B4F360ABCD078C9E829C82A6B7A36D22B8D1F6E3101BA009C759FC83999D52E29B387A8DC1658A43EC4C4D9330A4ED2138E035EBEAE6343A76A82849E37141FCE34E9A41EB5EF88BBB9257017AD8696C3847FD77AE103A082ED1A05DE9420984C147AFF927E1950244912079BDBE5CC07 - -count = 47 -seed = 1F3193EBC58EF65E9E396D69220ADB8ADC729BB388A72CEC9028A094F1CBDED21CFB0C41356AF31E0CF66A3B0D843666 -mlen = 1584 -msg = 139BA17ED7B476DBB1CDFE3C42B3A57AF5BBCB3BE19ED04D6C3072FDFE917ECB9272D59EE89EF83522531D83AFF8B9934A8423315C350D1481A4B02980DC29E1CB83B76623869649AC40EF297B153B679C327BB251C6E6BC169C48ABA2A439F9EA24EF94656A415C3E86D7BCB43CB3717D54D773F1937DC8B0E02D4E6ABBB1C83FE73F1B221C9A359E454C19DE5E71EA4CB8C560EABF1DA133FF20D81785D2ECD935B99F24840761446C324DF81484C5C05045C0949DF8D0F10F942E1B5B79074B358C25B6EC2B0B42DF65D998B666CF1BC568E7D737F22FF541807BE95ED85A9980E940E24D2C506BB0F9BEE32EFFD85A2017DE694F61BCC2B292595C97FF4C2145E48AF8F0F3D71763B4DB433ED7BDB8DBF8643475FB2B9155F0CC6A0048C5546900792BC01EBA4B06C83A0C447EA0CF05410DE55ACB8E5521829C89BFBC084CD86E7CA3D701283B70F78E1CE9C3888AD2689E0EF5593D656285066F319E155F86C0A71256484F42A0C40E7CF13AF0CF77C6D1CC7231A48538E9060A7863B774C9CC65E321E45AACC002C0170EDDD18CC1424159D46BF99D08A28D2DEA8917D28D91A1D6C409D945A5EEA19413A1ADCA40DE9458FA6BDF1E5308EF9E67E1E90E9D92BF19B5351FC49DFF0A31E035038AAEC651C0F20F276E4EF0EE35C14BB625EB34205516D95ABEAA06A7A3BB3AF2F12236406689BFAB11E65FC63EBC5B944818DD1D53C0E7B88CE7AEBAE581D995AE7D8423778DFE20D6CEA7AC0B1B4EFE2B9D571DE77BD8F71E89D9F6A2DC89103B73625887AB376BD12CE89A65E6280515A44A80D6C32799669260167DA0A214AD0FB803930AB1952D93360B54433CE8220B29339DCF2702581E88952A5A1549DBA11F4CCDB6FEFD6D24522F3207796C8D5BA9D1582F888F2500964F2B975AED5D5AF83409FF9720EDCF5CE3FE9B6B586B08DE21956E7970D8DC28F6208A80F5378ECBC506333A1D98C58EB0E2EB0CDECE0F5D16A069FFD742D1E589F546C4F2EA3DA0A56F984CFD93F5F2912FB1D068F2BD7C1B5E979ABCC62E3A0164445398F5C0208E82B99AED1200D36289B1FDBBF03E43995341AED3AD712CC7C7530C751B40B765073EE4E4CDD411AE543AD5E2793F294320E9791AB35AE1697F23EBFA0280B8041859909B0089C101D7CC429408FABD2E073FCA7F2C2886031E9F6A32F2B596A799967BA8A47E87DCC8854D45DDB6DE39160600EB4235F4E3424D75DDC8CCF041AA05B25B5A3811540EA5B77CD8D7D611A63BEF5C26D57475B28E961645AEE0B9C8D47954FAF634017787A21A671493E7C5F1A4C553E0A68DDD726DB1DED4321DC735332FEFDF2A84C22097AB3552F878E304598EC40EB349E1C1AE416F94112A2CF8E8702A4C3BDE2F58245166550FC238E153D10F90652518B1D84CCD3ED836F150F1FF103976E743137DA5A97A61276DFB0C11D071B240069582265A9CAE4987B6C6B017DCD1594024D7B1336FF141E59936EC4CE5410E1B73BA6FB42D35F8999225CB1A135260967F4F6EF2172D53FA6AB6D1A2E3174B46C24BC103BAF69C2128F093AECEEBE8753EB352E2804EE64AE5140DF1ACDACD8F225B3C9A61264245B8E5CF759CDDD75E25E2D790FFAE8421515E0CD6F279D0080A3F80BB2E0729C0D2626B6ACE31CE20BCDA490C7660D04D1D82E6403000578926C52D8F9A4BE7103D64E0F03E8F148BB2236781EC30F6D8BC827C107FCC40F26DDAD485E6135BDC3BB331BE139A07891717B692E23312D0E5B1C41F30C3B4B4700EFFB481A835AB54340269FFF365FF87F58245621ACFD83B7FCC6FF108132D8966F9836544354F7E216FBBB851F390DCE8A72362F0454730B90D35AB3859763AEE35668310FD501C7501F4599563006AAEE9B636B676F3DBB6787317885B0F4A64171BF19CBF2EA7A625E1563032C196E1292D82C7484817DBF78D8E9E478FDC4C92CBEF48D4CB4F0E6DCDCA6682DC0A56C3E45EA0350D9FF88073748305FD7DF3A3BE8C055CB1C55167560D5C99345BA80C21CE791C4A511E384A02833B78E8AA02B1B877A9B8D806978519D716C611DF54AE8EA2691540E87C6E79EB006569E02745021BDC7852E1FA4177E2C3EC89257618B38719CB07B0BA68F600236167F019694959C2AB6FB39D5890CB176F6ACC3B9656E495C07027E3D4DE781F48C1F1A8AA1B41449689E191E495FF3F263DDAAA8DE0DF6F1A4AA3EF1F5EDFE437BB74BA -pk = 7C9D2320FA733C5DE28666BE3CF624B8B3CD0701973A4EB4AF8469E728E1201574D4C91450BE2971D9CBF85441855B6B2B98F17C86F7853637FD791C3B254206 -sk = 7C9D2320FA733C5DE28666BE3CF624B8B3CD0701973A4EB4AF8469E728E1201574D4C91450BE2971D9CBF85441855B6B2B98F17C86F7853637FD791C3B2542060200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004FC3877FEFCB64258931EF33C9403652230FE43A4AECC3C5C20127F06155652A126BC677F091F2B0B4EA0F461BF6FFFFFFFFFFFFFFFFD832F81535142B398B4B2CAA01E57FF1FF00CDE85FC0EE3BE2FC0DDFED13FC0D31CB50A6F956D786902B49A8D724FEFFFFFFFFFFFFFF8C1E14B62AEE15D9D5D746C461E8D75019A8155D389639DDB41EF0C6F8B3F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE96CA186111EB2F6E95F956C67D116A11F7E51017749651CAD90B4E07E6B0B0000000000000000000000000000000000000000000000069B6BD6394E1DCA71A1DC8A4A34894EA03BE1D9768AB03E8CDAA7C20FA6910B329FE44008DCD86DDC194F0A775D0161ED5F4B4668257270C3861CB16CFAB423133FCA35448B88BDA1693D4FBEECBFFE93A33F42B3222B44C8DB49550A7B9702A004D38AD804F9636EF37E9648BAF269508FF6FCDEB8C8DA4C6FF503A3E6A819ED2CDB0D2BDA74FAEFED1701EE784A3458D6D75D1983A905DCCFCC97A368EF2BBD8634831D92D08F31ACBC07F6AADCA12826957DB4CC9613F9B103387D6F0621B4F40A0B6B5408C1258F69E83B880F7240489EDA48CCCA68C14F4F954F8A7C22C4AE3CD8CD25E7BBD0E1EDC7888DD2F4060BF2117A11A07EADED40AE3CBFF132AB484D6C1F4C44FF241048210CB3C57B59D61F2F1E5CCBA25FB2E50F35005126C5DC6BEE41F50A5D20DB6AEB96E3AFC3BF6C05788DF5E228948312CB67C2091AB4CF29F2A6B468B4B430D43596829E0660D8BDAA985746483C06F39B9AB3DB2D58D66BE59BC93D9E2A3F5130DD30C89E1ABB1640502B22BB65250EE7FA164F1EE7FEE6FA8DF0C69C70BB5556BB0AF744FE49F484DAE8138ED3B29C0FA07E7407F69F6285F56DEC420C05DB71944F42C8EBD9652EE1151D01C32E68B1CE2E5C29 -smlen = 1761 -sm = 512297114E9ACF2AB300AA4B18050E42707C050135D8A2A528D3B24B57055197D5191E3B68B650003DA36A4AE208D396D506783813EE4299FAA242051CFEF7D62570BDFABE00B028CCC42D6F6484A70068BD0F5958B2783AA401EA1977B135703B48B30482144E39B29CE3D0C60590113EA1F5B3911C5004C4CD1E5391DEA2CE8F07FE993E3B4DDE80490904013BF5E77FC6E366AD368126D6A6E4E5370103270F92F60EF2ED54E0064A2BF6A147FC9F01139BA17ED7B476DBB1CDFE3C42B3A57AF5BBCB3BE19ED04D6C3072FDFE917ECB9272D59EE89EF83522531D83AFF8B9934A8423315C350D1481A4B02980DC29E1CB83B76623869649AC40EF297B153B679C327BB251C6E6BC169C48ABA2A439F9EA24EF94656A415C3E86D7BCB43CB3717D54D773F1937DC8B0E02D4E6ABBB1C83FE73F1B221C9A359E454C19DE5E71EA4CB8C560EABF1DA133FF20D81785D2ECD935B99F24840761446C324DF81484C5C05045C0949DF8D0F10F942E1B5B79074B358C25B6EC2B0B42DF65D998B666CF1BC568E7D737F22FF541807BE95ED85A9980E940E24D2C506BB0F9BEE32EFFD85A2017DE694F61BCC2B292595C97FF4C2145E48AF8F0F3D71763B4DB433ED7BDB8DBF8643475FB2B9155F0CC6A0048C5546900792BC01EBA4B06C83A0C447EA0CF05410DE55ACB8E5521829C89BFBC084CD86E7CA3D701283B70F78E1CE9C3888AD2689E0EF5593D656285066F319E155F86C0A71256484F42A0C40E7CF13AF0CF77C6D1CC7231A48538E9060A7863B774C9CC65E321E45AACC002C0170EDDD18CC1424159D46BF99D08A28D2DEA8917D28D91A1D6C409D945A5EEA19413A1ADCA40DE9458FA6BDF1E5308EF9E67E1E90E9D92BF19B5351FC49DFF0A31E035038AAEC651C0F20F276E4EF0EE35C14BB625EB34205516D95ABEAA06A7A3BB3AF2F12236406689BFAB11E65FC63EBC5B944818DD1D53C0E7B88CE7AEBAE581D995AE7D8423778DFE20D6CEA7AC0B1B4EFE2B9D571DE77BD8F71E89D9F6A2DC89103B73625887AB376BD12CE89A65E6280515A44A80D6C32799669260167DA0A214AD0FB803930AB1952D93360B54433CE8220B29339DCF2702581E88952A5A1549DBA11F4CCDB6FEFD6D24522F3207796C8D5BA9D1582F888F2500964F2B975AED5D5AF83409FF9720EDCF5CE3FE9B6B586B08DE21956E7970D8DC28F6208A80F5378ECBC506333A1D98C58EB0E2EB0CDECE0F5D16A069FFD742D1E589F546C4F2EA3DA0A56F984CFD93F5F2912FB1D068F2BD7C1B5E979ABCC62E3A0164445398F5C0208E82B99AED1200D36289B1FDBBF03E43995341AED3AD712CC7C7530C751B40B765073EE4E4CDD411AE543AD5E2793F294320E9791AB35AE1697F23EBFA0280B8041859909B0089C101D7CC429408FABD2E073FCA7F2C2886031E9F6A32F2B596A799967BA8A47E87DCC8854D45DDB6DE39160600EB4235F4E3424D75DDC8CCF041AA05B25B5A3811540EA5B77CD8D7D611A63BEF5C26D57475B28E961645AEE0B9C8D47954FAF634017787A21A671493E7C5F1A4C553E0A68DDD726DB1DED4321DC735332FEFDF2A84C22097AB3552F878E304598EC40EB349E1C1AE416F94112A2CF8E8702A4C3BDE2F58245166550FC238E153D10F90652518B1D84CCD3ED836F150F1FF103976E743137DA5A97A61276DFB0C11D071B240069582265A9CAE4987B6C6B017DCD1594024D7B1336FF141E59936EC4CE5410E1B73BA6FB42D35F8999225CB1A135260967F4F6EF2172D53FA6AB6D1A2E3174B46C24BC103BAF69C2128F093AECEEBE8753EB352E2804EE64AE5140DF1ACDACD8F225B3C9A61264245B8E5CF759CDDD75E25E2D790FFAE8421515E0CD6F279D0080A3F80BB2E0729C0D2626B6ACE31CE20BCDA490C7660D04D1D82E6403000578926C52D8F9A4BE7103D64E0F03E8F148BB2236781EC30F6D8BC827C107FCC40F26DDAD485E6135BDC3BB331BE139A07891717B692E23312D0E5B1C41F30C3B4B4700EFFB481A835AB54340269FFF365FF87F58245621ACFD83B7FCC6FF108132D8966F9836544354F7E216FBBB851F390DCE8A72362F0454730B90D35AB3859763AEE35668310FD501C7501F4599563006AAEE9B636B676F3DBB6787317885B0F4A64171BF19CBF2EA7A625E1563032C196E1292D82C7484817DBF78D8E9E478FDC4C92CBEF48D4CB4F0E6DCDCA6682DC0A56C3E45EA0350D9FF88073748305FD7DF3A3BE8C055CB1C55167560D5C99345BA80C21CE791C4A511E384A02833B78E8AA02B1B877A9B8D806978519D716C611DF54AE8EA2691540E87C6E79EB006569E02745021BDC7852E1FA4177E2C3EC89257618B38719CB07B0BA68F600236167F019694959C2AB6FB39D5890CB176F6ACC3B9656E495C07027E3D4DE781F48C1F1A8AA1B41449689E191E495FF3F263DDAAA8DE0DF6F1A4AA3EF1F5EDFE437BB74BA - -count = 48 -seed = CF5A04DDB5EBC45328F703D486D24443A7692D65AA55F054E3078DB76A7939590A3F35CF1A21E82A845445DD1B64A85A -mlen = 1617 -msg = EDD4DA833528B0511534F77857FFD16EAFB1A2AC87E6844612DBB104B9F32025B7F54E993D65CE85A061B6AC6D70A15BB42BBBBB6E2E21AEA55BB8A556120EB15EF35FD9774FC7B5C2894B747D3E4965B77DD8D5B26F38D413662783DCD332765B4DE534D08D6514CA9DC6ED7F2BDB4B5C437178710B04491708836CF2CCA08F28582107D27AC305EDE6030B1F8AADC4A1D29AD16CB4D739D8F813D47DA715CAD6B5CDE24EA95DFF4415B527DD900442D9ED1CA712C58B206D6E79F8AEFB882013358BC578638225BE79B58FB677277F072AEBCF8CCD6AB61A9D98A3B260E60AA625D78058FAE6028E4C5562A0F3473C3AD530BC4471228F27502A8F8FE2D1F72022103C3A2DEA363E68248ED8693B3B066B495561CF4468E8EBF32B454E54DF1766468AD3831D56EF7EB9C231E999C4CC3A6B0EBBF2C4F22820E256F67497427F53AD22D42C9293DC8682D0BE3517B63C6E871910ADBB3406B6B3B1CAD980AAE47BF9686E80B6E5DF2DACCCEAF9506B4667271779D00B4C1065951E21F2ACF6CF3CCCB8A633D1114CE9D531D94420E4AE496086638F031C0BAAB5722A41A66788D3885EFC7FE1C3DB54BC69E35B7489A0237A37AFE5194B5F424F792CC1D696098BCF327D87EBC50429A95ED82105C4328D0095A9775589FDB6C262FA51FFEE4D99C6D1A68FA661D1B6A0A2E0693D73B39218A6895BD83FC1D54831B7DF146FE7BD2A91B979018787B9904285A35922E22A7F1761BEA541EAF21D74E3A2F3C6F2247B042379CA4C553FD9256DD0C63E4C9DEA60912D02FBE4CE7762069A86CDE02A4E1E311B2AFDE435DA0816ACA659BD8C0650C1F118C0EA3622D72A5E96132F8B0FF8458C757648BD46E58195FAA0FC4FF8FA44238E35A25C9807B6229000EE560D8E085F27375C2F659BAA5FDE302B9529BF4699505C28DE33AB5DC2B8C02967947CD24C6A599ACB5C2D1E7D6BF3BCCEA0253FBE11D8043FED532AAFC9EE1151243BB80B92BE239BC4FD1D1CAFF502951205F2E6393B704E67141E1218963F664FE0759C15E6C0A1B40602A73990F040502867A9EDDBD4DB0E554AEA4BB9597949D5FB32C2E3AF92CF7816BEDAD5EDE1B769C823CABDEFCA1D1B85213C79EB03E065146B58E3BFBE80B4D4683B65AD1E0611372729B99A0B93934D52DDE40C19FED5A2B3DC3030E0B5F26B66474A5CCA6D741AB294BBBA6BE516105C08BDBABC97BDEC2141D035BF6C3A71553D6F6350229CA2626B8B0B56A24F2D6EECE436ECB77A70D747B6A6F830578B4792DE533879B174353424E7D0EADF6BD5A74B36A4E6EA7E39A4215559557BCE7A00FAAF0D1F81016F913A10F3C9F406C7CB53282CA8FD5FE4F5FABB96F891583E0507912BA02709764694296A5248C340A1B9EC3DB0F926F438CA96FECD40C4AD8DAED9B8A29691601835FE14283762236EF2135443307E5F0082D1C2180AE96ED0DD99A6E9172088E8B94AA2952BA5E128B202B2CBC1966E69B6E6384820D9AB624BC71788EA84B4ADFCFAA2EFA1DDAA8855D1DB3F58EEF2D54FE11A8A5D78ED46B58460E6F2FBA6CB70640700A4520AA1A2A9B336AEFB17CDE8AC78D67F194662642A0107CE38B74D731380A72AD4A0A068F09E0878E521F15CE8134780C3FD0CAB2DC2473448654F88BF1FE2020901B90C0ED670866B1BC337881292FBA885FE2BFEF6FE74765CA12372C8CBD698AC41A4C337374587DB15AFFB511D8C224F1743498D7173897FF5B8D070B89592BEBE053D5C10DCE67CA8542781AE749F3A42FAD7E4A2004A565F81D5FAECF11115C270155FB8AF6AEDA138B9C71458D6D2FF63441130EE9107C39260469521E020D2B42CB5A51098027F23890DAE8B28BF722AF9ABA6224E02FEB47E40112CCB164E8CF174BC9AC4C11AF9B482DF9C9F7F5F1B826428C21BE395EB1F07DE511E8258C84F5F035F4787ACE18C190808EFE99FCB455A54D366DDE2E230B575ED5A4A75D57C9A38DDE3D91D0D1A1C4DE7F277CAF23E0C5DD8E3B693DBC66B6BF1679B0AF74A2B9065B64CF0978115CC456AF685B22D85135727A8AAD96338611DC109B36C85A92E4A0180AADD1D25C5B3D4C681A44BACB953E50F994FCF5281366CDEC0CC50976074D91840B5079180CF643184ADCF9E4CCB44328E7BB9EB2BD06DBB7A757C35EC3DCF795A5E05ED250159EC453A1692426F624CC0737F691E475804F155E44293151E42D3C0F115ECEE53C6EEEF69788F7E8E5C422BB102237499F2638244C0C080B3639A49FFC1730EBB0CFD8A46 -pk = AD16DA18A2CDF25A3BB358AFE7E683A0DADEE401CC77161EC5A6967F32BB7C01CBB10B2F62394A451F88C43625A977630C1EC18E173C81C7437B8BDB28A23210 -sk = AD16DA18A2CDF25A3BB358AFE7E683A0DADEE401CC77161EC5A6967F32BB7C01CBB10B2F62394A451F88C43625A977630C1EC18E173C81C7437B8BDB28A23210020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000354C3C19025158921B718E5D2CC929C495CA15D8A3C5FBC8EB1688B18BF3120243758B0FA7D0563380B6F86311330100000000000000C048132E9F1AC6D2311E95FF81E2EA6BD6F0B20CF6FF9AD869A423A5C03D184E1C0E792AECCC447552B1E092F307FEFFFFFFFFFFFFFF40EF537F513D407737291FFFF370F8FA950255047DC5B21E61EB52668789030000000000000000000000000000000000000000000000354C5EE9C47906B19BD148C00E6706131BEB48FD8E854A6C7E8B3F5303D80A00000000000000000000000000000000000000000000004925EB0DD41854D03C4397F0925BF199BC7895822CFCADB92C59E3CA90C1931B4BADE5DEB568D68E230A580D7EABF197BF3553BB1A2071B01C15A0BB9D257D245B2813402820BE628D3FF5B21EF306B19827DF328F758C693F5B4D7EA26B982724A8B6FEDDA1A98C75018D10748D4E618B41295CD773B95D14A3305C3C1C600A6AFB17C8FB2987B66AFF8265606BECC600BF2DE73F6C4DBC52B6163BC880C428013897612FF2F71667B10689BF76AA6C833B8352A72ABF038C90A09254A0F7000C8DDA3868B3695B7F353291C182248EC32A84BCAE06F9E68F2BA05934CCA315B72B5805B7D50D2BD0666105D1C8344C9E7D81245FBA1D4E3A7A294F7B7D0113286C48AC4F78C279FF57547DA6163749AA68A942ADE47AAB17BA547908DE6201FC92D1E8801DCCE100A7BBF0B59B90D09984858C3A4C7C8EB66C965C25D0A80EA9C5D5087541EB2859596CC2A6E9B13115F41328F238D15EFF575D8828D0F92CAC6A9B3C68EB606687CFB6E94715C20A1C06060C8BBD000C0778C8F6A44AE31C06018E06CD502F75685C32317FC700F8D11420F539520A255B591FA706E88E007B219CEAD42BFF908F62B9762FC25B7ADC733D012FDD1400C0F9C7E63CAAE82E -smlen = 1794 -sm = D0B4AA821183F5041801DB83F04AC297F7CF64045F2D2E6646101084C100498A7D2DE0DA05202C019BA639BDAC933FA4E3058F5200A1BC348E51C90188A4D8CF24D9F05A7D039A1FBBEF8CB03AE52501C22A048275823F6BBB00DA50E9C253EB24E4AC018376287BDF1BD0E7F407021A4FE9142506E690066172AE32180D3D83E5067E7AFF8A657B21AE340700FB7DE0930D70BE087F2D26E0B99E4EFA0102E65639AD14FEBEA00604F370693B29AC3E00EDD4DA833528B0511534F77857FFD16EAFB1A2AC87E6844612DBB104B9F32025B7F54E993D65CE85A061B6AC6D70A15BB42BBBBB6E2E21AEA55BB8A556120EB15EF35FD9774FC7B5C2894B747D3E4965B77DD8D5B26F38D413662783DCD332765B4DE534D08D6514CA9DC6ED7F2BDB4B5C437178710B04491708836CF2CCA08F28582107D27AC305EDE6030B1F8AADC4A1D29AD16CB4D739D8F813D47DA715CAD6B5CDE24EA95DFF4415B527DD900442D9ED1CA712C58B206D6E79F8AEFB882013358BC578638225BE79B58FB677277F072AEBCF8CCD6AB61A9D98A3B260E60AA625D78058FAE6028E4C5562A0F3473C3AD530BC4471228F27502A8F8FE2D1F72022103C3A2DEA363E68248ED8693B3B066B495561CF4468E8EBF32B454E54DF1766468AD3831D56EF7EB9C231E999C4CC3A6B0EBBF2C4F22820E256F67497427F53AD22D42C9293DC8682D0BE3517B63C6E871910ADBB3406B6B3B1CAD980AAE47BF9686E80B6E5DF2DACCCEAF9506B4667271779D00B4C1065951E21F2ACF6CF3CCCB8A633D1114CE9D531D94420E4AE496086638F031C0BAAB5722A41A66788D3885EFC7FE1C3DB54BC69E35B7489A0237A37AFE5194B5F424F792CC1D696098BCF327D87EBC50429A95ED82105C4328D0095A9775589FDB6C262FA51FFEE4D99C6D1A68FA661D1B6A0A2E0693D73B39218A6895BD83FC1D54831B7DF146FE7BD2A91B979018787B9904285A35922E22A7F1761BEA541EAF21D74E3A2F3C6F2247B042379CA4C553FD9256DD0C63E4C9DEA60912D02FBE4CE7762069A86CDE02A4E1E311B2AFDE435DA0816ACA659BD8C0650C1F118C0EA3622D72A5E96132F8B0FF8458C757648BD46E58195FAA0FC4FF8FA44238E35A25C9807B6229000EE560D8E085F27375C2F659BAA5FDE302B9529BF4699505C28DE33AB5DC2B8C02967947CD24C6A599ACB5C2D1E7D6BF3BCCEA0253FBE11D8043FED532AAFC9EE1151243BB80B92BE239BC4FD1D1CAFF502951205F2E6393B704E67141E1218963F664FE0759C15E6C0A1B40602A73990F040502867A9EDDBD4DB0E554AEA4BB9597949D5FB32C2E3AF92CF7816BEDAD5EDE1B769C823CABDEFCA1D1B85213C79EB03E065146B58E3BFBE80B4D4683B65AD1E0611372729B99A0B93934D52DDE40C19FED5A2B3DC3030E0B5F26B66474A5CCA6D741AB294BBBA6BE516105C08BDBABC97BDEC2141D035BF6C3A71553D6F6350229CA2626B8B0B56A24F2D6EECE436ECB77A70D747B6A6F830578B4792DE533879B174353424E7D0EADF6BD5A74B36A4E6EA7E39A4215559557BCE7A00FAAF0D1F81016F913A10F3C9F406C7CB53282CA8FD5FE4F5FABB96F891583E0507912BA02709764694296A5248C340A1B9EC3DB0F926F438CA96FECD40C4AD8DAED9B8A29691601835FE14283762236EF2135443307E5F0082D1C2180AE96ED0DD99A6E9172088E8B94AA2952BA5E128B202B2CBC1966E69B6E6384820D9AB624BC71788EA84B4ADFCFAA2EFA1DDAA8855D1DB3F58EEF2D54FE11A8A5D78ED46B58460E6F2FBA6CB70640700A4520AA1A2A9B336AEFB17CDE8AC78D67F194662642A0107CE38B74D731380A72AD4A0A068F09E0878E521F15CE8134780C3FD0CAB2DC2473448654F88BF1FE2020901B90C0ED670866B1BC337881292FBA885FE2BFEF6FE74765CA12372C8CBD698AC41A4C337374587DB15AFFB511D8C224F1743498D7173897FF5B8D070B89592BEBE053D5C10DCE67CA8542781AE749F3A42FAD7E4A2004A565F81D5FAECF11115C270155FB8AF6AEDA138B9C71458D6D2FF63441130EE9107C39260469521E020D2B42CB5A51098027F23890DAE8B28BF722AF9ABA6224E02FEB47E40112CCB164E8CF174BC9AC4C11AF9B482DF9C9F7F5F1B826428C21BE395EB1F07DE511E8258C84F5F035F4787ACE18C190808EFE99FCB455A54D366DDE2E230B575ED5A4A75D57C9A38DDE3D91D0D1A1C4DE7F277CAF23E0C5DD8E3B693DBC66B6BF1679B0AF74A2B9065B64CF0978115CC456AF685B22D85135727A8AAD96338611DC109B36C85A92E4A0180AADD1D25C5B3D4C681A44BACB953E50F994FCF5281366CDEC0CC50976074D91840B5079180CF643184ADCF9E4CCB44328E7BB9EB2BD06DBB7A757C35EC3DCF795A5E05ED250159EC453A1692426F624CC0737F691E475804F155E44293151E42D3C0F115ECEE53C6EEEF69788F7E8E5C422BB102237499F2638244C0C080B3639A49FFC1730EBB0CFD8A46 - -count = 49 -seed = 8C3D2FBBE0D39E293AF2D2CC5A9BEDEAAE3752DFD19CDC1E186D41E717A0412AA429CBDF005445AFDE684656B5D17690 -mlen = 1650 -msg = D868EC985F946F3C31B6CFE4811BA530EACD0ED061EC383C203B2481AC697B8B88BC0F72B635027E443AB1F54478440DE16E596D30A0F1252E0AF54C0F382BBF5655BEA8C6B9A2F6382D003CC7E4D4F223F8E35EC87CC543EAD52E0E1ED956CFB32E8075715C07CA4817C4B8DACE68C8B0DA459271746BE41D6102B3FA5E49AEE8D443E78AD3246D0B9BCCF6AB7CB7CF72B8A847CA16B435F0618594400037179441F3BF524231F747D920E86506E84C61D4D038D42E82D52D97ABFF896C1DB1C646807156324F7B68DB620EE435C7B8C9AC8B193B7C892565C3631E297495BD3B59293F9A9CEA5E29E23A242B81DD05C8DC9DD669424573298C85870B109C7B593BF864B56895D81386466CA5CB6071005781FB214F1EAE9672D0D16351A627A3FAAC49BE4E13D552340328323CDCB4703BBE07C2A39D75D7737D5C1BD04355B8694432DFB7CB4F1901550C7D6F41080C0F6A2CC49D63A69243D137A78260C06E7A53AAF4F4B086E0220EBC5361A6A78C9B2EC09C2EA4EC45A41065B4B2DAA866D9BABD71C8E6CB378595F068EDB258B2AD1F420B304E5924EBE273AD6D00684F75B6A31DC5290A37D0F9A848B1FC4A67DD9A4FB1F9B4C6CD45E87FAB4A09129C9AB95C44703B75B54C9EF9E825928ACA56527D79B338C5AC639D0265010F3C085D2B09AEF0E4F55D080FB5FF79F13E8E4E8DB020F4C095140D46A93F2E4811BFBC1393EC24F6B7EF31F13623DF0360B1E335FC42098CA1EFCD0306C5FECCE942F6E299AC9ED81054FE452D3F63991DA42D5680EEF749C02FCBA78DB5F4F7C734C6B4D99AF79711A0BAB723C24364AC85700242878CCA93465F286D5F7ADAD7F68F1D38CD6C6E0575A36F1E5521E420D348D947E745C2355FB5FB0F12DC6FB5E9435CF8E552C174A617151AF8D5E7D469AD5CD741E16EB88EA6D7C5806B08571697D22A525C2E30DFF608C921B955D2A990D9466829385DE0A81875BE564942AE740D15AC0AF46A876426EBBE481738BE19BE06F174D975AE8DFB52A94AF9A77E56267C0BB62169165ACE155041406CAF507146A02FB760629CC4C0E7D29108CB7C779455A3EF359BB6198AC75E16148998C16C9410DFF2DAE5F3C79DA61D371992D4A151BA91DAE8814C81EEA4F78D23871326BAFAA349C8EB57231B590F1AC13F599DF5B39DF36455F05E53CDC4D025410E8F8F8BB74854FEFE0C4F790F58434309D36C1E7F3935D4F896368C91AF95EC2DF292AE3166B83976ABD95089B05B461D4E9171CBB4747F3CD9BAB04E5A3B98095754021229B4B820EBDE63E463F2EE479FBFD83CACC61878773B129CD4B3E9AFBAEDB27C7FEDEC2F2D405B99933FE2C203D9949C567A7752AEF8A7788D2375900E70315823DACCD4F2A674196835C35EF813826B310346ABB16B0145CD70FD0A04611ED5AD0B8DDFCA6EBA6B93445038C3DD23D3D15E8899F9C889AF417E5662D538E466447E514A8897C21FE0BE2EF18948B66EB04051C0BC961FA485422A66D649DFA86D4B3DD504A89919A9928EF96FD467713DCCC1F19EE69CE3935F0416D9C5752B7DCF9272D2DB86C3EB6F4897D94DDBEF7C483FCC66232E535A8B0A5AA4BD443493FE539A32D433D9E89F7758DB5B0606A96455B39F92AA788FBBE43CEC8F1D36FEA3ADFD0353EA5532B49A7286381D985E018E6534005F605BF67AB4AAAFDCC499AC0882FCD9D90BD88053CFDADAF466E536F2FFA7F18B3DC254E42FFFC777E0339181473E2B7FC844B687ECCC0EB543A54211084B1EC06B0D9EB0A0C96B88D6585F414873C13EF7002AF2D47D5859A23D12A7D401FFD4BCF642DB96C70FDAD0CB03A6098437795BC9C7C6C804A26225EAA53F52747F01DB4E62471A21DBC1DED9C4DE2508812AB11F61F6364FCFEED445FFBA549E45E641A80FB4B58EE20677C7D6CF0526DBF4E26D9E5AFAC5429B4474DFFE709D09D766542D65E668D59C836BDFD0F78B846BC412F29DA00291871D94BB5E6557D833C8DB3D9BEB37888C3A70684ADC6B063FEC3D847C42E0CE20E05482DB165FFAC5D1F2C661B9DB6D19FB3E8909587351B25F2C225CB26BB137BC52D04AD8157F7D634F29A3623B4EB53B4EF9A78945280BCA8C5E1882FAE373EAC69EA366E2F13A9FEA75A6B7EB5CD4D9EB14F68A231BAC780F84200146CE7795282952382E2393F0C2A99DE830D3AA517DAC4AC97F2AAD3F7F8E3B49B22B078E3708C9CDD1B2A2A129656066C0030D747EDD646384611D4ECCC5B0B9DF4852AF7BFA94F6DD7584F6285CA2EA7ED3F8DECB534E6D31D7165C609FD9AD235F5AF8E4E8E58FD3D248D822C202 -pk = 1B0E43F7CF7209AD67C1C3C76AB3C341213559B7A40A2320AE242B5E35DC0D095E4F846D1C0FDDEA8F90096FBF42C1DDC6A5B0E2495435B2149DCBE2105DF628 -sk = 1B0E43F7CF7209AD67C1C3C76AB3C341213559B7A40A2320AE242B5E35DC0D095E4F846D1C0FDDEA8F90096FBF42C1DDC6A5B0E2495435B2149DCBE2105DF6280200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007166CBDC6E778FC88439E4DE1D708340BA167CD05B9735ACF10D13808A619D18DA543BD833735F476EAAB024BACD00000000000000008A62F4782287F2F24B2FFDA7880A8DA5EB5645949A6B8DDBC9BDAC3549D3B0BFB5F3D63831349483C840E096D549FBFFFFFFFFFFFFFF3A99F5590DA11B17994071F775CDC1245D1796F2A6CC57ECBCAB0A36456D060000000000000000000000000000000000000000000000EF082CBB572AD0FE5175EF5A96163ED6414F6426C221270A59BB8023D6D40B00000000000000000000000000000000000000000000006275E18D0CC6DB0A5AC15B2738F6FB007733A1570BAC9A1FC1EC81361947CD278EE2DBF44E41566E64377CCFD4E229EDA148282F3FB96C21D5986173F79767306A4902943D301CB70CA8F6F7315EF86A75E06EEED4E444BF828876B21E2A7D04D820EFF1E8A4E3B45A0FF30F5977FC07815110D17AC1067BBE0B776C6F134027A2B33286F147E6A160C855B179923CBDE289D7488F62FB853EB733760834442A6DF6BEC75A8820E0DA071039F2C924F0BCE3543A708977F3622002202C9B800F48510267101CE42C618434C620A1F4C1CF0B20BC7DDABD465C20881142664A29885AB9C0515E57FCEC43AF15D8B51D185F4CC9F2CD4743FD518CE4917683E501CA24B56C357BA236670209CBD3A5563BA2ABFC47C06225F2908D4E29DA1EC31D1CB4835D1532A6D597116C567FDAFEF46BC689BC06583AA532961D2199E5850A3BB68FDCEF17A125FD0E54D625414E00BB0A97CBA1AA919FAAD81BDF671E732D18906C8C2CD8902C5065F0B6EFBF74883A914FF2E22B822CBF9A34756252E9042BE604FAAB7CCEC571728DC3EFF0E6097F5DDE9B5F4C92D96B756254D6C5D21F7BF6D5D7AE77088C13DDAA82097C734F14370F5FA1D86905823C6827EB38A20F -smlen = 1827 -sm = 4CD62BB2639C5E8C3305001C8DE7725401BAE603D74541D5AD3B57909B00C3DC53576CADCF71DA079BBF6A2BC6BD0B172905BD800CB88A43A109A907079D0A5517CC05A7510421FBE6966AC291751F03FFDD023FE251B3041C037EB401B13598044F6A06060D86C3272C3B6620063281D7B395BD2BBE9401996AD2BF5A8C8ADACA040E36519B9F243C832D02013FD7AEBA09F84CD7EF53D8CEB8574E7E0E0107A12E1EF6B14480DB055ABADE52B95C3A00D868EC985F946F3C31B6CFE4811BA530EACD0ED061EC383C203B2481AC697B8B88BC0F72B635027E443AB1F54478440DE16E596D30A0F1252E0AF54C0F382BBF5655BEA8C6B9A2F6382D003CC7E4D4F223F8E35EC87CC543EAD52E0E1ED956CFB32E8075715C07CA4817C4B8DACE68C8B0DA459271746BE41D6102B3FA5E49AEE8D443E78AD3246D0B9BCCF6AB7CB7CF72B8A847CA16B435F0618594400037179441F3BF524231F747D920E86506E84C61D4D038D42E82D52D97ABFF896C1DB1C646807156324F7B68DB620EE435C7B8C9AC8B193B7C892565C3631E297495BD3B59293F9A9CEA5E29E23A242B81DD05C8DC9DD669424573298C85870B109C7B593BF864B56895D81386466CA5CB6071005781FB214F1EAE9672D0D16351A627A3FAAC49BE4E13D552340328323CDCB4703BBE07C2A39D75D7737D5C1BD04355B8694432DFB7CB4F1901550C7D6F41080C0F6A2CC49D63A69243D137A78260C06E7A53AAF4F4B086E0220EBC5361A6A78C9B2EC09C2EA4EC45A41065B4B2DAA866D9BABD71C8E6CB378595F068EDB258B2AD1F420B304E5924EBE273AD6D00684F75B6A31DC5290A37D0F9A848B1FC4A67DD9A4FB1F9B4C6CD45E87FAB4A09129C9AB95C44703B75B54C9EF9E825928ACA56527D79B338C5AC639D0265010F3C085D2B09AEF0E4F55D080FB5FF79F13E8E4E8DB020F4C095140D46A93F2E4811BFBC1393EC24F6B7EF31F13623DF0360B1E335FC42098CA1EFCD0306C5FECCE942F6E299AC9ED81054FE452D3F63991DA42D5680EEF749C02FCBA78DB5F4F7C734C6B4D99AF79711A0BAB723C24364AC85700242878CCA93465F286D5F7ADAD7F68F1D38CD6C6E0575A36F1E5521E420D348D947E745C2355FB5FB0F12DC6FB5E9435CF8E552C174A617151AF8D5E7D469AD5CD741E16EB88EA6D7C5806B08571697D22A525C2E30DFF608C921B955D2A990D9466829385DE0A81875BE564942AE740D15AC0AF46A876426EBBE481738BE19BE06F174D975AE8DFB52A94AF9A77E56267C0BB62169165ACE155041406CAF507146A02FB760629CC4C0E7D29108CB7C779455A3EF359BB6198AC75E16148998C16C9410DFF2DAE5F3C79DA61D371992D4A151BA91DAE8814C81EEA4F78D23871326BAFAA349C8EB57231B590F1AC13F599DF5B39DF36455F05E53CDC4D025410E8F8F8BB74854FEFE0C4F790F58434309D36C1E7F3935D4F896368C91AF95EC2DF292AE3166B83976ABD95089B05B461D4E9171CBB4747F3CD9BAB04E5A3B98095754021229B4B820EBDE63E463F2EE479FBFD83CACC61878773B129CD4B3E9AFBAEDB27C7FEDEC2F2D405B99933FE2C203D9949C567A7752AEF8A7788D2375900E70315823DACCD4F2A674196835C35EF813826B310346ABB16B0145CD70FD0A04611ED5AD0B8DDFCA6EBA6B93445038C3DD23D3D15E8899F9C889AF417E5662D538E466447E514A8897C21FE0BE2EF18948B66EB04051C0BC961FA485422A66D649DFA86D4B3DD504A89919A9928EF96FD467713DCCC1F19EE69CE3935F0416D9C5752B7DCF9272D2DB86C3EB6F4897D94DDBEF7C483FCC66232E535A8B0A5AA4BD443493FE539A32D433D9E89F7758DB5B0606A96455B39F92AA788FBBE43CEC8F1D36FEA3ADFD0353EA5532B49A7286381D985E018E6534005F605BF67AB4AAAFDCC499AC0882FCD9D90BD88053CFDADAF466E536F2FFA7F18B3DC254E42FFFC777E0339181473E2B7FC844B687ECCC0EB543A54211084B1EC06B0D9EB0A0C96B88D6585F414873C13EF7002AF2D47D5859A23D12A7D401FFD4BCF642DB96C70FDAD0CB03A6098437795BC9C7C6C804A26225EAA53F52747F01DB4E62471A21DBC1DED9C4DE2508812AB11F61F6364FCFEED445FFBA549E45E641A80FB4B58EE20677C7D6CF0526DBF4E26D9E5AFAC5429B4474DFFE709D09D766542D65E668D59C836BDFD0F78B846BC412F29DA00291871D94BB5E6557D833C8DB3D9BEB37888C3A70684ADC6B063FEC3D847C42E0CE20E05482DB165FFAC5D1F2C661B9DB6D19FB3E8909587351B25F2C225CB26BB137BC52D04AD8157F7D634F29A3623B4EB53B4EF9A78945280BCA8C5E1882FAE373EAC69EA366E2F13A9FEA75A6B7EB5CD4D9EB14F68A231BAC780F84200146CE7795282952382E2393F0C2A99DE830D3AA517DAC4AC97F2AAD3F7F8E3B49B22B078E3708C9CDD1B2A2A129656066C0030D747EDD646384611D4ECCC5B0B9DF4852AF7BFA94F6DD7584F6285CA2EA7ED3F8DECB534E6D31D7165C609FD9AD235F5AF8E4E8E58FD3D248D822C202 - -count = 50 -seed = C10427EF0B26328163F85D45E22EC5215415326F013FF31EDD58BD3E97B1A72FF07D275D4C1B517F4661B0638F75640C -mlen = 1683 -msg = 4BEAF8CC3A7C393932CD37A2CD8ED790F05E4038ADF1287E2ACDCC0BED9BDBF92CE44AAE95CAF4EB142B858E1421610EAFC47DE566182835BDACD4C836F19BD686D53C3834EFD928487A2AB3402C2E3AB3AF97AA802B05223CA6927722C3BD1FE3F8C20F93C3951F907314896CD21CB99306FD7E5B6176945C2898B10C1DF62FBB2680752CABC8980B5A0430BE39D34BB7DE9544BCCCBFABAB709C11BFFF5C958C8763D8D5830235B49EAD26C834E63C3F3F2D6BA944FD2688F6350EC99DAF4CCCC42C6BE1CB19DD46514D71CB6E887DBA80EDB580B27F1142A20EA0D497E0336D55F1FFD4BB3D4B3521F0A01C7BB09258971D1ED4A98EC052B24776623D7B9A83C818795E3989EAEBA8C9142A97AFCE855CC6AC0ABA15F0546684AB5C2F48B23BB72A88B6AF2BA9C73881103CB6FA99E3B03119EAB03BC3B9BC365EFCD7B9F49A8BAB6A34A00AA8F2C88D7BEBBA808BD97111EBB192D82AD244E18BCA732FE6F72FDE5BD533E4BCCD3F50332DAD3A4169EA85C324D165413F10888AC3B21B91DE09FCBB9B636ED00FAAA669ABF6429B78C3C04F239722F31FB0B1A20CB1A6B553908070AC13521DF66772A6036E6695CF66B9A90E2111E499BCBF5DCD19744F43DEB943445248A5E84F168E7BFEA2DC4E1D0A87FB4140EB7C72D2DFCC27923206054CEC870888A79938DACBAACF1F122B22AB5C9701D777BCF9809CEBC9B7AAC52468134FC4A92C2BAA9B8C0F6249130A50337F460A42CB5364A5E7408CAEF8D12BA6934AB645DE9832818F9DB71F5EB0B158DE6A76619E75245B56020E1664D8FAF1C1782DE4A688D4055E07D842410600E9454E28676D44357853FFA7740200C91EAFA16BCA21D0006F47FE8159A733E0E91549DF434EF316E1DF9BB97DA6A2C2E2F20A65B3C00041A903270CBB55AE2432AEE25C71CE73BC2322CCB8E5BD0E24820616A890B0851D825D79411C14948DCDF48776D72565422056FE75765E50736C82F71270BBCF229A7B7A45DC88AADF4F84238C896DAB889E16C17DB7BE551AB24873FDA82F102D0FCFC139C9FEBE9FA99819CEF0E2684DFC5C843A6D496D8A595D33C51E1FDE9A84059C7BC596D32D53E2FE046F23FEFA51D13F9C28E227F5E24429B851ADDBF578922AEB0C5A61BBB666D11D127BA45C9E6378C70D75643DE776483582E034E81FAE0A3F029C47FB192CFA018CE1F68261D77CFC9E05EF19438E47F3DE9A68C8DC09D07B1BDC6CED69592623750F72EC2FB8C5CA981DFB84B4BF0734377EE9DD8EF5DDCD96F438D30AB78F402EBFF2163D43345EE8CA119F3208E21AA3A2185DE967B475B9ABFBC86465275F9A634FC22015E94A298E9C204E9786CB1FF14A5E99F942D42AB5DF51AD09654083DF0259AA1C26A760CCFDF4A276600C5FD3A54F210B20731941EB48A79435F1F86C45F8181D9758A1835721B87D36C725878375FEBCB8D48ED2CE8892DB50965753A98F4E7110281DB40ED64DD8EB51AB9CE41042589152D8CD5876FF30536F8955172A7A8F5C3F5FFD22C9954903136F781F0574F45F909BDF1657FC1CDCB9C4689F41E462C8D39108B10D78B6892C8775FDEB139258F8130BD1D2A1C72B5026506409F9862AA8729B35C652074494FEB84A553CEFBEED19D6EE94758E800F5FCBCAEC19B6A00F33EB237AAA6FC0B3A08C1D8829C180BF95E7D05F919A929933B7A032CD20ACE82AA5A45E5B2FB09812F36974B5EDA1B387FEB13BD49AC374F821341282C8FE2FB0CC5C075356833FF8CC6B648729A4298ECD73BD0EC73957077AC65722D0BE23C1536B8DB7B0506DAE47C0070564E7D7F9444F47B22C679EB8ACA4826F974A42043863E498E5301EA162C4E96684ACC5CA26CCD083541BC4C1D2FD690E51F07FB08337450A204B0F4F2C17785E037424FD6E78746764584D5F19255496DF1E524BFF0AAC31BDE9254429565278A39ECE4627C023EDF18BC21BB523D44EFC259742DEE9FF7159D5F700D957CCBB505A88C2037629402C2A322D17647E430777B184FF7B4E8D6B94724ABC36A5CCFAC08E2479E8310BCB7A617A25FAC6EFD10D0A07248F7D4597F14309B8064FE3BC4A4479F905E832210D49363D1E5D58176DEC9ABCC0C5132FD6ECCEAD2B05B56C96ECBBEB0B803E43DB2F982AD9EFE1E2A49649ED8E42707970C93615D54A3E673559B996E48A3B73143BA0884E918888156CA78F793DFF990FD721DE0C0B7916A5CED736E31292C5AF062D7CCD83FE653294FAC8C50CF6BA37B37D5A9BFD1E3B92D1825C1BE0795F9B257CDAB91CE99C0C51BDFCD6C0AB5A3BC6E30F884ECB4F1F61A3259CD279205B2C21CDDB196360061758E67B1C3724F5CB6311EB4FB92E6C0D71E6D1EA45 -pk = B9A851C48D07613AF466BE5C507F40C15AC251545AEF8FFD61090F01DBD9D8243FFA3AE2BEBC2ABEE43F650D35551229AB480E2BBD6ACC2CAFBBD9C965DE2809 -sk = B9A851C48D07613AF466BE5C507F40C15AC251545AEF8FFD61090F01DBD9D8243FFA3AE2BEBC2ABEE43F650D35551229AB480E2BBD6ACC2CAFBBD9C965DE28090200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003E0CB51419094CC1A785D4DB05AF34B24C142D74873EB7121E2721E3BDF3250D4AA85771A47A8A7201214795AFB402000000000000007D38B3DC2EF74B42F640A2AAC11ABDC80D78371042035F9DB1DF14CA8BEB8DEAEEA067E422DC00134434CC98F4DEF8FFFFFFFFFFFFFF2D969FA106506CCD38F61E0E817EB208C21C6829D883ABEDF35A5F3942610100000000000000000000000000000000000000000000000656B83864A9D8B7C829C1DD38255C8633659126233174F886B5F8577A770400000000000000000000000000000000000000000000002DF324876C8E98960E0A425537BFF3D663BF1D7AB7CDBABFAA7030FAC75CA80A649C00D1CD70802950B771BB5E582CFC95FE4C790F16F8113D8BF66B5D0C0325851515E4A0EF2E5AF19983426C0FACD92955FD1E8BDF5078B23AC6F93454CD15ACE2ECB4C6B42E32567B769329EA62C32DC78C1F4884218E12A20B44F23D5430993D4334F46F5FEFCE695D90A3129B3204A4BC3FD50835F03A0A83809D8885191C4DFC1D0B29B81620B049301ADF0499CAC3012D1972A9B3260CBC5AA1CA4C099CC7A92F40BFB89C2F4E4883268C0A2111F3CB7935382C600AC285816004350A971AC2F2F4B8536E8ADADAECE2F84ED0A2505F0FCBEB7D66A9AC63E84DF0281A1044103AEB6B96AB1956FA80A29D85AFE9A122F7CADAF8AC2090B93A690D932EE40B307D3870136004EC97C07A53743DB20195EBD636DF1A1A7AAC9205C9D71590D0C9A317ADA627B66E14F354EFB8A6A03955C5F6B22BEA87B40436ED4D5004B096F03FA989E5A85751E3A54A188A942AD4EE70354ADED58631C490A537290305D54A597FFBA9CD0F59C31189455D5518D5A7E6E9FE1E52C52AC865F6D1722EA1D5F24DCC56A5BA4406A3D2BB112D4CBFCCBE384226E8A9958125F951479613 -smlen = 1860 -sm = B02E48E0C233A02C07008630654894E4475F3704900515C9E0ACD7779C052114A86BFB3448B29C04FECF8FF0CA4229D30F009E8D93DA604897141C057DBCEFB62C17B811B20081ED895BC3B203A5E407EEA058E0B2D9F551D907FD582E54901D7B5A9B0415DDDBB9FA7423DB55004897BD8B7D7B3C76E606066217D9569B3609BD06730CBDE488D0AEB04B04004136A161878AB3CC7AE4EE1044D77FBF0A0314426F7DB90E46AC6506A279DB111117AB004BEAF8CC3A7C393932CD37A2CD8ED790F05E4038ADF1287E2ACDCC0BED9BDBF92CE44AAE95CAF4EB142B858E1421610EAFC47DE566182835BDACD4C836F19BD686D53C3834EFD928487A2AB3402C2E3AB3AF97AA802B05223CA6927722C3BD1FE3F8C20F93C3951F907314896CD21CB99306FD7E5B6176945C2898B10C1DF62FBB2680752CABC8980B5A0430BE39D34BB7DE9544BCCCBFABAB709C11BFFF5C958C8763D8D5830235B49EAD26C834E63C3F3F2D6BA944FD2688F6350EC99DAF4CCCC42C6BE1CB19DD46514D71CB6E887DBA80EDB580B27F1142A20EA0D497E0336D55F1FFD4BB3D4B3521F0A01C7BB09258971D1ED4A98EC052B24776623D7B9A83C818795E3989EAEBA8C9142A97AFCE855CC6AC0ABA15F0546684AB5C2F48B23BB72A88B6AF2BA9C73881103CB6FA99E3B03119EAB03BC3B9BC365EFCD7B9F49A8BAB6A34A00AA8F2C88D7BEBBA808BD97111EBB192D82AD244E18BCA732FE6F72FDE5BD533E4BCCD3F50332DAD3A4169EA85C324D165413F10888AC3B21B91DE09FCBB9B636ED00FAAA669ABF6429B78C3C04F239722F31FB0B1A20CB1A6B553908070AC13521DF66772A6036E6695CF66B9A90E2111E499BCBF5DCD19744F43DEB943445248A5E84F168E7BFEA2DC4E1D0A87FB4140EB7C72D2DFCC27923206054CEC870888A79938DACBAACF1F122B22AB5C9701D777BCF9809CEBC9B7AAC52468134FC4A92C2BAA9B8C0F6249130A50337F460A42CB5364A5E7408CAEF8D12BA6934AB645DE9832818F9DB71F5EB0B158DE6A76619E75245B56020E1664D8FAF1C1782DE4A688D4055E07D842410600E9454E28676D44357853FFA7740200C91EAFA16BCA21D0006F47FE8159A733E0E91549DF434EF316E1DF9BB97DA6A2C2E2F20A65B3C00041A903270CBB55AE2432AEE25C71CE73BC2322CCB8E5BD0E24820616A890B0851D825D79411C14948DCDF48776D72565422056FE75765E50736C82F71270BBCF229A7B7A45DC88AADF4F84238C896DAB889E16C17DB7BE551AB24873FDA82F102D0FCFC139C9FEBE9FA99819CEF0E2684DFC5C843A6D496D8A595D33C51E1FDE9A84059C7BC596D32D53E2FE046F23FEFA51D13F9C28E227F5E24429B851ADDBF578922AEB0C5A61BBB666D11D127BA45C9E6378C70D75643DE776483582E034E81FAE0A3F029C47FB192CFA018CE1F68261D77CFC9E05EF19438E47F3DE9A68C8DC09D07B1BDC6CED69592623750F72EC2FB8C5CA981DFB84B4BF0734377EE9DD8EF5DDCD96F438D30AB78F402EBFF2163D43345EE8CA119F3208E21AA3A2185DE967B475B9ABFBC86465275F9A634FC22015E94A298E9C204E9786CB1FF14A5E99F942D42AB5DF51AD09654083DF0259AA1C26A760CCFDF4A276600C5FD3A54F210B20731941EB48A79435F1F86C45F8181D9758A1835721B87D36C725878375FEBCB8D48ED2CE8892DB50965753A98F4E7110281DB40ED64DD8EB51AB9CE41042589152D8CD5876FF30536F8955172A7A8F5C3F5FFD22C9954903136F781F0574F45F909BDF1657FC1CDCB9C4689F41E462C8D39108B10D78B6892C8775FDEB139258F8130BD1D2A1C72B5026506409F9862AA8729B35C652074494FEB84A553CEFBEED19D6EE94758E800F5FCBCAEC19B6A00F33EB237AAA6FC0B3A08C1D8829C180BF95E7D05F919A929933B7A032CD20ACE82AA5A45E5B2FB09812F36974B5EDA1B387FEB13BD49AC374F821341282C8FE2FB0CC5C075356833FF8CC6B648729A4298ECD73BD0EC73957077AC65722D0BE23C1536B8DB7B0506DAE47C0070564E7D7F9444F47B22C679EB8ACA4826F974A42043863E498E5301EA162C4E96684ACC5CA26CCD083541BC4C1D2FD690E51F07FB08337450A204B0F4F2C17785E037424FD6E78746764584D5F19255496DF1E524BFF0AAC31BDE9254429565278A39ECE4627C023EDF18BC21BB523D44EFC259742DEE9FF7159D5F700D957CCBB505A88C2037629402C2A322D17647E430777B184FF7B4E8D6B94724ABC36A5CCFAC08E2479E8310BCB7A617A25FAC6EFD10D0A07248F7D4597F14309B8064FE3BC4A4479F905E832210D49363D1E5D58176DEC9ABCC0C5132FD6ECCEAD2B05B56C96ECBBEB0B803E43DB2F982AD9EFE1E2A49649ED8E42707970C93615D54A3E673559B996E48A3B73143BA0884E918888156CA78F793DFF990FD721DE0C0B7916A5CED736E31292C5AF062D7CCD83FE653294FAC8C50CF6BA37B37D5A9BFD1E3B92D1825C1BE0795F9B257CDAB91CE99C0C51BDFCD6C0AB5A3BC6E30F884ECB4F1F61A3259CD279205B2C21CDDB196360061758E67B1C3724F5CB6311EB4FB92E6C0D71E6D1EA45 - -count = 51 -seed = 4B6B73E042CE76DBE39535E45D3BB2F3B9F8B2BDA170E76CC88666844703E32B2367460A0F6A0A2E3F4E7A6CD32BE998 -mlen = 1716 -msg = 0BF9A7C0F63CDCF3F850ED7C5DB6191EEEFE29E498A19F9D89BE4698821ABD72EDC34317B4F8EC2736DC83C24AC195BD55AFF00E797A83DFFADC7970FE53304F16F5DD92E6EC362B9E283E41EBF121FB2FA2A3F60124EF3EBF836AE51FDD55CA9F59B085DDD660724C072B86041B50A3A446CDB20A45BA65380ADF007E005DF2D9AA16A9D22B11DCF6F0B1964F04F45441A923691A15D80DC85003B9AE281F2B5983DD1A04D80A4D9C4372D9820BBFAE3AF7735E7C71E9F085C0A6E4BC107D9E4BA222B38FB236B2CC3A19DD6067BEAC460383FF2BCC771A7F1AAF092FC72C292FC1D5C6FC6B9715F1E1272EB22F8E0B33A2830E31BD6C531677902F6A95CABC3E9C1AE36F77037A785FEA355137A581FC14E6BD5F1F7AD1A5DD19DEDD448B47B558C22DD0FCBF296A812A726E7D1B57F4688D3F577104CFB15FC63C27F7B6051C7AED7D645186FCA63AD9C2D68BFF442466EFF76BCF0E398D2BF54C2CA4CC614839E9BCA48AB2CC53865803710A98D313AFF1DDD06A65680EB83C640052DB807EB2F38ED0CC211128044D331FEC3E6B0B2F3B675C631FDADE62C16D1719278413EA3F8E54BA34EDE7E73F3D94802D2F9CB9794D257C46679A3F00015945903190B97071F8FB55F8696253AA3F39B3FAD344FB88224F5313B43889B768171895F7AABEFF25E21E525EA01A996C764A3ACF12BFFED08F3F751F5CC094B50B325F8B62C7A5B3256964D48543690538E634E5730354358534B65EDDD44A526BB4B15E2042B6210F503EEE06D00D615CCAD10D73CDCBF5264B526674D85C0ED31BA5EE584F21FE6D13F883ACE4B094768865E43099E54671240E8E2AF8A7D7D22335B3974CE860E7238A7C1CA8A009EB51C8636F0659189AC8EF01C871E9008957CECE0A367B63BD2852BDE8690BD74C6D956435D0AB82F94A90CD00FC840DFC7036B84D51F1FF5076CA0974DB6CF25AF42EF7DC8C30C2B04CEB2510E86FFC510BF4C931639478FD1520AD571FA17958CCF8E37F5F6360030300EDE3A33871E9582808BDA2233996C5005FD0C23D99261F570AD9027767F6FC96D18BA98E8DDFC2B79AC12CDA5F2367B4BB6B99A3E07B59882E49A92AECE85339BBB18AB9644D20A3B2A795240492CE4EAF09D9EF728FB82B1DE7B64B5D391251FFB0699335CED8C7CE642FF1A79F04C3EA0DC37EA101188361AFAD236EB218CFBD1D0EBD784CE27DCBA0266DDEB87B59B66A4F75BB44665643FA358DD3D0B69B49F45A752B5C410E2299A62BE4B57B32B0924A069A8E8C15D754CC34DEBB0D967E70693A6FFA58CF7099C2C2458B437C7B205CC7E815F6CB494080F9EAF3017E5FF918558DDE415FF72E954EBC2ED4C20C8ECE38CC916060D22E582D54F74C6C181C2601400110A683F4A365E45FF1387BCE4E152A740136BB762B03A99FB68F6AB42620B2E3C00FA8D150944230A6330409B27E4AAD1693E2C3DD12216C4E2DDBC5E9CBA68B8B5417A7B2EDAE7EB67D25F4EDECBB087F93DC9C927C33076B1C71A2B83B33870D602562ED378805A690DD2A427D86C2C46BA4741F3DEFEB91A05EACE975C836E52868CFFE52CA92F97DE94768161A3E953BAB6A28016782909EC53C02F35184AA9CCBD5B793B525204B72DEB63E104376893B9452C3F2C492F423CBEF1EC87C85788CF3073FFBBCD67FF79BD038672943AE4BC68DA131DBA8D7B41C83B4E9CFB6931987B270C74919BBD40612F823114E4BB148671F1AA62BD2BDFCC8B0B24010EC112E883AEC9746D0F5DE467ADDAF51F8C070A359108B1F91643071438F098233AD9A94D0FAA665A39291A98D14A861905ECDE4755D00E690429C57580DCB6D51BB6186CE72EBB1FA8413892CAFB8713E89775013E546FDA30AEB8AF9F7155C08B25810C80CCAA5E700C124CFF59FA32E0293ADADBCC7B1A99F67E66B28DA614C5A4CCD706AFD05388C65EBCE07A543D3DC1E5A5D1F307F675728D4C629A04E9E455B4DA35236C677F26EDC622C1FBF29568D509EA0690AF4CB5DBB4E418B6162888E43B458774A31324BFD5EE8D2152E4AD43A3007D7D4AF5FDA172C2779837AD3A09E135DE953CE966727A7183BF77ADFC76430666B526692991D3C9DB5BB377552A7801C548AA63F6931D3EE91B875CDBCBB7441A4FF81F86762332D7192FBC2F7B69A58DB6CCD3558047F1940A1CACD6FA28A000B9795A2860394BF05F0120E6D85F96B1FE9DE14E3ED66A31D747924B6FF2620778E0714AEB34B79A5D935A0306E55C36506A292C5DC568403551907E49A43A6263D2915108916F1E27CF3529D1B7BD1544AF83A7CBE58547F192A93CE5C5BC6D652405FFCB95345F522B2D34E8EE0960BB85537A46121BD9A408D283A125EAA745BBAB04E2231C19AE95E13901C69E5C9C4D70B104478F4A70D64F81269A8 -pk = 914D5996263BFDE0CC9844D98487316FF66F5E1040D8BC1DF95E6C0E9F9F020A7DD96CA3925C3E71DA3EBA2B5735FDA117F81FD2B6748F5A5C00F55BE2704432 -sk = 914D5996263BFDE0CC9844D98487316FF66F5E1040D8BC1DF95E6C0E9F9F020A7DD96CA3925C3E71DA3EBA2B5735FDA117F81FD2B6748F5A5C00F55BE2704432020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F8539F7785BAF5DAD6F8155A3EC03BF57FCBE73C4FCA7AB870551F011BD8B988464473B81FEA7E737056F2D2C80C0400000000000000DF7F9B7CD6D25786D08A9DD9347A51A5FEA7BA65D39531BFF6ED8E1862B269C3691A60F9663D5F2E43FC70A90853FEFFFFFFFFFFFFFFA70675A7A4B0D1831524131031AAF788C361A250A5EEF839FC7244245F7BFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5419EE3D1973C7BA2DBA19A0F3DC3AFF9EE49A5B909310E6C70CA513CB0807000000000000000000000000000000000000000000000064A85AB5A9AF7AEACC3E316710DAF70CF6D4C1215C34CD1249C01A7955069901BFCC0D2C01323604F5C205DD5BF3CBB3EC6221AD0D60BFD6091C0E639A8D3220B71900648122B6089E1DA5DDA3D2A4487E78875CAD30B169818DD48EDEECD12D854D09D963F89B3E1B46577020273BA3BAEB9A8A086C83ACCD06989E3CEEC530D462D412D5A8C1BA3F5CA6EE338729B3B679E9B0591D9AACA79E05DE7C37D902FDFD2A6AC87A247198B933F2F3DC7F93343D942B7B28D077EFC418D151D4892D786F3D913E8C76FF39B4A78BCF1B2DACEC995C87B90621A4F618B345C9FC2600A1D1829B1E7FCC67A1575DF0731260D0FBEA32137C588649E8BB06E7AB3B7D17C85F6E8D885447A9889AA9F18AF18EE9B849D7104E94CB34C0720BC5578C0D30916BC2BDC1FE6FE760DF22992CDFAE971F2E9D90E1CEE33DE5136709D218D40F2FF33FED3236F915651D9D33E097B2B6F5D1F6B6BB8ADBDF4BD677280FF582099DDE07B57A3D03A1E594F29B63DA2ECE4FC30D06D436AE2C6CA01E99C531E323E64DC33215330FA3C8F931D5AEF464A1530C5F409CBE25C98A98624DF89BF302BC3F4FB9B77E64658448FD9FEF9FC7D0F8C67EE60816220CFE1C648619B0891E -smlen = 1893 -sm = A69CD77C5D80902E8203C859E1A8C039DF5FCC07F910DE9D34958B09C907E40FE7AEFF02122F1801E6EB865C910E64008F011B88C9C8EC5F5F405406878866CE2C2F17F6B3029F536B17DA4D8DF87A078E373E96F4AE716F11052FC3C28E9A2892D50C07DBC48F4583AD8F8C9E012175F644BDAFB571A404C48736AA501CD0EBF2042099F4DA6574CD6E40040059136A4B91242E45C3184D835926074D0803D4A2020D9449E6134D028E8A2BC2AE0EF1010BF9A7C0F63CDCF3F850ED7C5DB6191EEEFE29E498A19F9D89BE4698821ABD72EDC34317B4F8EC2736DC83C24AC195BD55AFF00E797A83DFFADC7970FE53304F16F5DD92E6EC362B9E283E41EBF121FB2FA2A3F60124EF3EBF836AE51FDD55CA9F59B085DDD660724C072B86041B50A3A446CDB20A45BA65380ADF007E005DF2D9AA16A9D22B11DCF6F0B1964F04F45441A923691A15D80DC85003B9AE281F2B5983DD1A04D80A4D9C4372D9820BBFAE3AF7735E7C71E9F085C0A6E4BC107D9E4BA222B38FB236B2CC3A19DD6067BEAC460383FF2BCC771A7F1AAF092FC72C292FC1D5C6FC6B9715F1E1272EB22F8E0B33A2830E31BD6C531677902F6A95CABC3E9C1AE36F77037A785FEA355137A581FC14E6BD5F1F7AD1A5DD19DEDD448B47B558C22DD0FCBF296A812A726E7D1B57F4688D3F577104CFB15FC63C27F7B6051C7AED7D645186FCA63AD9C2D68BFF442466EFF76BCF0E398D2BF54C2CA4CC614839E9BCA48AB2CC53865803710A98D313AFF1DDD06A65680EB83C640052DB807EB2F38ED0CC211128044D331FEC3E6B0B2F3B675C631FDADE62C16D1719278413EA3F8E54BA34EDE7E73F3D94802D2F9CB9794D257C46679A3F00015945903190B97071F8FB55F8696253AA3F39B3FAD344FB88224F5313B43889B768171895F7AABEFF25E21E525EA01A996C764A3ACF12BFFED08F3F751F5CC094B50B325F8B62C7A5B3256964D48543690538E634E5730354358534B65EDDD44A526BB4B15E2042B6210F503EEE06D00D615CCAD10D73CDCBF5264B526674D85C0ED31BA5EE584F21FE6D13F883ACE4B094768865E43099E54671240E8E2AF8A7D7D22335B3974CE860E7238A7C1CA8A009EB51C8636F0659189AC8EF01C871E9008957CECE0A367B63BD2852BDE8690BD74C6D956435D0AB82F94A90CD00FC840DFC7036B84D51F1FF5076CA0974DB6CF25AF42EF7DC8C30C2B04CEB2510E86FFC510BF4C931639478FD1520AD571FA17958CCF8E37F5F6360030300EDE3A33871E9582808BDA2233996C5005FD0C23D99261F570AD9027767F6FC96D18BA98E8DDFC2B79AC12CDA5F2367B4BB6B99A3E07B59882E49A92AECE85339BBB18AB9644D20A3B2A795240492CE4EAF09D9EF728FB82B1DE7B64B5D391251FFB0699335CED8C7CE642FF1A79F04C3EA0DC37EA101188361AFAD236EB218CFBD1D0EBD784CE27DCBA0266DDEB87B59B66A4F75BB44665643FA358DD3D0B69B49F45A752B5C410E2299A62BE4B57B32B0924A069A8E8C15D754CC34DEBB0D967E70693A6FFA58CF7099C2C2458B437C7B205CC7E815F6CB494080F9EAF3017E5FF918558DDE415FF72E954EBC2ED4C20C8ECE38CC916060D22E582D54F74C6C181C2601400110A683F4A365E45FF1387BCE4E152A740136BB762B03A99FB68F6AB42620B2E3C00FA8D150944230A6330409B27E4AAD1693E2C3DD12216C4E2DDBC5E9CBA68B8B5417A7B2EDAE7EB67D25F4EDECBB087F93DC9C927C33076B1C71A2B83B33870D602562ED378805A690DD2A427D86C2C46BA4741F3DEFEB91A05EACE975C836E52868CFFE52CA92F97DE94768161A3E953BAB6A28016782909EC53C02F35184AA9CCBD5B793B525204B72DEB63E104376893B9452C3F2C492F423CBEF1EC87C85788CF3073FFBBCD67FF79BD038672943AE4BC68DA131DBA8D7B41C83B4E9CFB6931987B270C74919BBD40612F823114E4BB148671F1AA62BD2BDFCC8B0B24010EC112E883AEC9746D0F5DE467ADDAF51F8C070A359108B1F91643071438F098233AD9A94D0FAA665A39291A98D14A861905ECDE4755D00E690429C57580DCB6D51BB6186CE72EBB1FA8413892CAFB8713E89775013E546FDA30AEB8AF9F7155C08B25810C80CCAA5E700C124CFF59FA32E0293ADADBCC7B1A99F67E66B28DA614C5A4CCD706AFD05388C65EBCE07A543D3DC1E5A5D1F307F675728D4C629A04E9E455B4DA35236C677F26EDC622C1FBF29568D509EA0690AF4CB5DBB4E418B6162888E43B458774A31324BFD5EE8D2152E4AD43A3007D7D4AF5FDA172C2779837AD3A09E135DE953CE966727A7183BF77ADFC76430666B526692991D3C9DB5BB377552A7801C548AA63F6931D3EE91B875CDBCBB7441A4FF81F86762332D7192FBC2F7B69A58DB6CCD3558047F1940A1CACD6FA28A000B9795A2860394BF05F0120E6D85F96B1FE9DE14E3ED66A31D747924B6FF2620778E0714AEB34B79A5D935A0306E55C36506A292C5DC568403551907E49A43A6263D2915108916F1E27CF3529D1B7BD1544AF83A7CBE58547F192A93CE5C5BC6D652405FFCB95345F522B2D34E8EE0960BB85537A46121BD9A408D283A125EAA745BBAB04E2231C19AE95E13901C69E5C9C4D70B104478F4A70D64F81269A8 - -count = 52 -seed = 3D4607399F6FCBE074FD2BEAB1A7571239D6BE6308617866B65B892EE65399E14DC7FA612CDBC5F7E23116FA86C3133D -mlen = 1749 -msg = DBFC582AE98D8FD326FAE96A1849EFE729A1173339D90C48C3A2B867135F1DFF5B497D05FD55130694B5F9C62D136647D767AE682A0F05C670CEECC03475FFD39E0BD4E45B720D9D7E8DD04E69C969627682AD83F48609F6E66D0BE99064988E4654E3913B7CAF1475622E211BC247B98E5BABA1B804E2BF651713197D8A610CC111BA5FD98A053408AD155DCB756D28A283BF3B20E6F3785DD5F105F8D7D9F2956064860B097C675630EDEE1F17E2EB0B26B6C20E260F9A5915D63F1BE2C74FB0B37013244481A2D0C581C4EE12516E0FD4701E9835C8526A490CB39E99FAE07C40236808F9605A63A5106C19517C3711CA4B9E8EDDC77B242575D904DBE64223CF14A8E39FEEDA9D6C5F9CD0D0719A7EB5EFA71453636F78CAB8262636FF1E136C787E38A43FAF02699C1F260EC45B068EDBEEBBB8A0E08CE282BF47D27A33216856F0C59E743DEB13397656FF17FC4B3C694B189C35E516BE719CDA6542260D1301DF93A5D93EE118F7CB0AC94D0364C9EA66718A4BC7F3D7ACFFA60AFB7100F7D97E98DFFE167D1D8E46C912D41EA057362C13B078CB1D9C443C1A57AC18C4566F5F5388F47A40CA49CDAAF34BD4C9A597FFBF7AB20D7CE88DD76A639E09ADA323C588B08140E9350268C1FF76079093A05CCF5E1613A70E6E37CD257875049A767332E5F7420F319F9AC78F97C0C4FA40B1EEF8C8B48045C78F73584590FE41F9F274DEA838DE75DADE66D04E9D9308CB0A9948320D28D9CA8F1F51E39FF3DE20FD5A2A267D127C317ACD51FB779E597A8DC7359D920548B8BCAD761C6B8012304E12628A2652D12A8161E538C20D582BF567E9C2B46B4CFE2D2DA31120C6DF50DF45C80513AA9EEE9F2613A221AA1D23F861C7F26AAC7813B7ED7278EB420A5C44F2A5879A2F1F9F11E14602762E3389B152C014EA9DDC9DDDE9ED1D6F74E7526F690EF37E71D448342C012E032C00E480A699ADE617434C12DA0E69139D0D9036743B9E2B9134B5086FCB96B193330ACE8E4F77148AD0F532E72E1792795080B54D7172FB9AF1972D00AE24D0B3D86528675B3BC8C7B80598D855B95A77667AD0F671F00039C08CC99F5644BB006BA9356B9C02BC935212C43490C741B0845CD7B4247592374AEAA1B589E670AC62777293870963B5132DCC27088F5DA5B831FA570766FA81C2A07B88BBD45B81992EDFD2A7FE934219B1F648DD8A414FA03EAFCD39E72BDF7D4F6B9C1F31A0A67DF03F6709F2BE0E7D1B1690C92CE7B8C6B1054270D796B16D6E445D24CB11229CB0F92DD81190A37838951AD28BE2AEEE6C5F63DA60A911AE0A24B1D05EF2F814FB30AAE8CA3BD9F01D4FABE5B279142AF948B0E6BBCCF7560107C161C816A0D8E61DD908445079BAAFB78C14F68B8B2BB241FB03C237A4CB250911142D0B460ACC75E6B0F58BF28546A4779EA7342238826F636A510CC9CFFEE8BB0292A58A07694C05672B560B26158A8566D01D0EEA0773E81F3F84376B29CE375FC56A0689A7CA5CE94B91814B62CBB61EA2EFCA0CE6712A941D612B0F700C56B46D464C2AAAB3F64A89CAA8561A1DAB2869D79DA1720274D031946C4C7715FB9C243DC95CCA7AECFF55EBA4044467EB922E93F57E3E39B93876A03936DFFDD2AF48D055C6C188F2F229812EC94F3FBDF7D7DB62E4274DC91718710EEC2CE034AEF266207C5CCBA21552D6FB8DDBEE8E931067010594A9E0CB37250F67281C0A369965367424D454CDD05D3C8F35A15F76B4C8C3FEE42F4C9CAD68849837DED3BE58730B94AE3A5F9146F90E03B4C0836381B3F9CCB5DE6BD2455D241BE9132EB6D4937FF27663F4CADAA9CDA193919F4CB0D0F727F6C7B26E831C3AC8DECC234D79D1B3BD28305E3012A3733AD718FDAB7DD1A6400BC47F47D20F627D2449DBFF10E37A62299E22E408A28A806D403CBEE19AFF6FA9B1814B35B9573ADC86F829A08893CFAE4A0212293447D3086E21BBA28049F3ED383519917B169E8A1B7DD64CEFE0DA643A97950A205CBFF6BD9334180556E84199F0B60738715CD69AAD7C882430578F6FBA4579D908F863CA54D0B9862EEA6ABED31301D183CF465B1A256CBD597A629307A8A890F11C23DBFF895B932E9CD2F5F06A4183D6F2D61117126FCD2CE2B86BB44A9A5B402E3EEDBE4ED1DF11716E91A2302CB72D8F0DAE132E16311C80DCA041694AF1EF63F659959FCAA133D9E5668F94D0489311AF3BAD379DE17793BB3EE8A284529A72CDEC474B3A82D92C6CB21C63017F262E0D7DD47AA5C58F5E23F8A37F00D5438717F05BB974F18A5D3E1CA054EA053C30B34FBFAEE88BC0195F061AC32F5B71B2A8A3ED4B8BC4EDAB40A6396C052DCE72E10768526C00610E96DF38AA70938CF844CF445D8E2BF73C4F32A742812D8C1DB53AFC6B6C0A4BC67C3CF7579702312D6C89BF14E9585D2C624D07FEB4B5B57F8E4C5CFDA69A5E922CC1E9 -pk = 806FA65D23671D28E92E1379D067FB9FB87741745DF778AEFA7ADC67EDA16C135B272297B5374C7471535B6FD42D3219979FB92B766E71B8C5D33C1C1646BE10 -sk = 806FA65D23671D28E92E1379D067FB9FB87741745DF778AEFA7ADC67EDA16C135B272297B5374C7471535B6FD42D3219979FB92B766E71B8C5D33C1C1646BE100200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F1ACDDFB45DC65DC9B940B56363EFC8080A20522177C372B8DAD2D032CB27A7A48FB1043FA468CF03A5DC918DA6020000000000000090D76A2557C55628E1703965AE80582BA86844481FEC5DF9FDBBBE7D20181F099AD508AE1355AD646BFD574B23E9FBFFFFFFFFFFFFFF14F5AB41782CA857BCF6610757F289C240CFCB1A448E4B28E63F639B8B5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D5EE76D82862B86D04D207319F055DB9D7A2BBA1E777E73025071D8BA6060000000000000000000000000000000000000000000000023B42CAC5921B9978BE1241F9C4A9D2E9DE70C82DC55DB5C4B933BB46D8692C4227407861E0EC2D3FDBB5820F0F6F0B95021B51499160ABE25F2E636986781BB503BD91F771BC64D9CBB39BE871E1ECCDAAE79A1CB694E131D488E5C303E031C8337DC49A265E0E0ABE177BFAA8AC23C691376AE1FDCDE40C6F3E30A0C1312155F8BF42C4064620331378DE1BBF1AF95AF08B425742FFD2CE440C7C7387530EAB18379743F1242A275E89281ECC60A24A5AFA9DF9D4A794F6077F3FDB3DC50F9CAA75A7D42AFE41328270FBF1E23A1BAEAFB317C19B7D2B92946642F5B8470C2450F6226E650264103DD63C78A50ED68D41EC61066E95A284F5EEE3E8312C1267E06036308F9F2824497475D73A28A8DC14FE332E4C965A8274B2B9FC60900BB6C520B441B22F3CEB1B63098A50E58349E51F3B7EA1C98C547DCB6E0271E41FE04064C2358A1854397DADF32E17AC89E41C968D2725C9593903E70739634A2C5E45EC4971F896C23D9561EC3167BF085CBCFFC9E3D79915A2AE89E2A748EE0801CBE5DEDFC04161DD2D0F66340678DBA35A0E68A65E8205F9798C26998C460558A6C82CA4B8C43E2D9A243333D1475455E57D71BCB55C26E2EC91C922D6BF0E -smlen = 1926 -sm = 672EC475C2CE820E0A04791AF71F707E8F0EAA0300FE7390A6D4597627039C20AA581DA33DA1A104E7546724C4A08FAACC06283A6A4187A6D6EF3B0525D8A05526103EFAE00605E9461C367FF8817007D6E00CFCD82B51D58E00FE34C513F79F45FE4202C32E0618302C204B8207E2804854EADDA12BD80486591D713AF0CE0AAB074783AEE9B453AD8A7B0501E3F518FF9232DCFC0038FD8CFFF7A3C50D0012E2DD022EF8C1C5FC00DF9B4C0202198D00DBFC582AE98D8FD326FAE96A1849EFE729A1173339D90C48C3A2B867135F1DFF5B497D05FD55130694B5F9C62D136647D767AE682A0F05C670CEECC03475FFD39E0BD4E45B720D9D7E8DD04E69C969627682AD83F48609F6E66D0BE99064988E4654E3913B7CAF1475622E211BC247B98E5BABA1B804E2BF651713197D8A610CC111BA5FD98A053408AD155DCB756D28A283BF3B20E6F3785DD5F105F8D7D9F2956064860B097C675630EDEE1F17E2EB0B26B6C20E260F9A5915D63F1BE2C74FB0B37013244481A2D0C581C4EE12516E0FD4701E9835C8526A490CB39E99FAE07C40236808F9605A63A5106C19517C3711CA4B9E8EDDC77B242575D904DBE64223CF14A8E39FEEDA9D6C5F9CD0D0719A7EB5EFA71453636F78CAB8262636FF1E136C787E38A43FAF02699C1F260EC45B068EDBEEBBB8A0E08CE282BF47D27A33216856F0C59E743DEB13397656FF17FC4B3C694B189C35E516BE719CDA6542260D1301DF93A5D93EE118F7CB0AC94D0364C9EA66718A4BC7F3D7ACFFA60AFB7100F7D97E98DFFE167D1D8E46C912D41EA057362C13B078CB1D9C443C1A57AC18C4566F5F5388F47A40CA49CDAAF34BD4C9A597FFBF7AB20D7CE88DD76A639E09ADA323C588B08140E9350268C1FF76079093A05CCF5E1613A70E6E37CD257875049A767332E5F7420F319F9AC78F97C0C4FA40B1EEF8C8B48045C78F73584590FE41F9F274DEA838DE75DADE66D04E9D9308CB0A9948320D28D9CA8F1F51E39FF3DE20FD5A2A267D127C317ACD51FB779E597A8DC7359D920548B8BCAD761C6B8012304E12628A2652D12A8161E538C20D582BF567E9C2B46B4CFE2D2DA31120C6DF50DF45C80513AA9EEE9F2613A221AA1D23F861C7F26AAC7813B7ED7278EB420A5C44F2A5879A2F1F9F11E14602762E3389B152C014EA9DDC9DDDE9ED1D6F74E7526F690EF37E71D448342C012E032C00E480A699ADE617434C12DA0E69139D0D9036743B9E2B9134B5086FCB96B193330ACE8E4F77148AD0F532E72E1792795080B54D7172FB9AF1972D00AE24D0B3D86528675B3BC8C7B80598D855B95A77667AD0F671F00039C08CC99F5644BB006BA9356B9C02BC935212C43490C741B0845CD7B4247592374AEAA1B589E670AC62777293870963B5132DCC27088F5DA5B831FA570766FA81C2A07B88BBD45B81992EDFD2A7FE934219B1F648DD8A414FA03EAFCD39E72BDF7D4F6B9C1F31A0A67DF03F6709F2BE0E7D1B1690C92CE7B8C6B1054270D796B16D6E445D24CB11229CB0F92DD81190A37838951AD28BE2AEEE6C5F63DA60A911AE0A24B1D05EF2F814FB30AAE8CA3BD9F01D4FABE5B279142AF948B0E6BBCCF7560107C161C816A0D8E61DD908445079BAAFB78C14F68B8B2BB241FB03C237A4CB250911142D0B460ACC75E6B0F58BF28546A4779EA7342238826F636A510CC9CFFEE8BB0292A58A07694C05672B560B26158A8566D01D0EEA0773E81F3F84376B29CE375FC56A0689A7CA5CE94B91814B62CBB61EA2EFCA0CE6712A941D612B0F700C56B46D464C2AAAB3F64A89CAA8561A1DAB2869D79DA1720274D031946C4C7715FB9C243DC95CCA7AECFF55EBA4044467EB922E93F57E3E39B93876A03936DFFDD2AF48D055C6C188F2F229812EC94F3FBDF7D7DB62E4274DC91718710EEC2CE034AEF266207C5CCBA21552D6FB8DDBEE8E931067010594A9E0CB37250F67281C0A369965367424D454CDD05D3C8F35A15F76B4C8C3FEE42F4C9CAD68849837DED3BE58730B94AE3A5F9146F90E03B4C0836381B3F9CCB5DE6BD2455D241BE9132EB6D4937FF27663F4CADAA9CDA193919F4CB0D0F727F6C7B26E831C3AC8DECC234D79D1B3BD28305E3012A3733AD718FDAB7DD1A6400BC47F47D20F627D2449DBFF10E37A62299E22E408A28A806D403CBEE19AFF6FA9B1814B35B9573ADC86F829A08893CFAE4A0212293447D3086E21BBA28049F3ED383519917B169E8A1B7DD64CEFE0DA643A97950A205CBFF6BD9334180556E84199F0B60738715CD69AAD7C882430578F6FBA4579D908F863CA54D0B9862EEA6ABED31301D183CF465B1A256CBD597A629307A8A890F11C23DBFF895B932E9CD2F5F06A4183D6F2D61117126FCD2CE2B86BB44A9A5B402E3EEDBE4ED1DF11716E91A2302CB72D8F0DAE132E16311C80DCA041694AF1EF63F659959FCAA133D9E5668F94D0489311AF3BAD379DE17793BB3EE8A284529A72CDEC474B3A82D92C6CB21C63017F262E0D7DD47AA5C58F5E23F8A37F00D5438717F05BB974F18A5D3E1CA054EA053C30B34FBFAEE88BC0195F061AC32F5B71B2A8A3ED4B8BC4EDAB40A6396C052DCE72E10768526C00610E96DF38AA70938CF844CF445D8E2BF73C4F32A742812D8C1DB53AFC6B6C0A4BC67C3CF7579702312D6C89BF14E9585D2C624D07FEB4B5B57F8E4C5CFDA69A5E922CC1E9 - -count = 53 -seed = 7031BA806F4D8BC28529163B239E0EE836871C51D2D62B601B71D6F2B69B203C81440F8FFC09C3AAD94DB1D880160671 -mlen = 1782 -msg = 6103E5B22F934203B5CA87337095C9A19267AFB9695D309BEB8A557BB7CC90332C4A03E1D416D397B945B607268F545928104CFFD71B02864E010B666CFCB68B762FA5EC839B5AEFD0407419441B38E6D881BD5218DF73C675DF101BF2C53D90FF86D4A3C7DB19EC9CAC044E0467A36337AAEEC32217FAF86CBD7BC2B663421754CFF1200A8A66E18F812868BC8D1C8CA495E6462DA4B8B96D4167F040F04927A7C27AD35CF174D42684ED55AC80D14CBE4CC2570642DDEC4F44880D967E9AF77EE27D0D3DBAEC9067FB6FC957AC4A136C1D564E17F59AC4938D43FB9050D810989907125C47FCEA6C162C723E79F68339CD1B3BF596988BD6E215271385CD50616868C6BF40FDC34BD30E5A00773E2C039723F2AC3A3FA45F4CE870841762D7435BD6CCC5FD3D58FE059EE455A806FDE89155C84797FBB73691A1FC6921859E99066A3239E31F28D1A46100DB1917621D9E61473CF1E71F9850B584B459D5690941E676A7DD56796313ED9ABDBE03DC75AFC1430DBA27FE0F8DF48EF7C339F462AF1A6D30A5F8B480DFBBE860C4C0BC136393C8FA0875AF454273C3CFDBA7EEA44EEF1A4060136948CD98B9D2C19AEA4934F3455F31DD15BE6545134F17A195B6BC409159C0975E592A15E86CA4943CCACF4B46719A072DB8C629B67768F1956F8158F179A0B645320489DEE404C8D0C4E786CFF39B324053F102C118E7D51173CEC0FDD017F213B2B07AC6B2C7DEC04172DD5396A020EDFB74ED86FC31952D241A7C3D139DEF543D90976AA70599792E73CF73AD0BD4A359BF60DFB2CE96A784D8DE5E23A95E831CA6FFBA6B187BC5F29A7757185EC06AC882572EC6283A1875B54FE4F295E1970BF311DBABAF9F894D3364D68F529C4EF9030AB934BCB09459D5AAC61919946FD28DF1AC85876F979E8B8528E9BBE69F03DEEF136EEA6A8FC86F31BD64285C8C9F49ADF53A8BAA7867CE52E72DC4A63929DF3BA2662DC77D71F88D8AF42B8D67AD54884EE11F5A6B3B794F7D5610909B0B740937587CF475DA903159994A262B6F32A3D1723FDAAE65E636B71CB0EF0A744F359BF08AC8231ED2970CE8C451266F703DA3B57F85ACEED4C1C174C50D9C226F028E972AC124FAA6F60518699CB4C499220EA51A538F9EDE67D0E98E1BF8FB4B24B1D8EF50A28A93E20076F8FB812CDAB04871D331FF434BA66DD4577B18DC3F471B3E96A174B58A7AC2470EB8463A71FFCBA2D064470FD2D4E15F9491DB09DF3E3BA376A3DDCC437312BE5848DB3B9079F2AE046798473BB970D725E1D7C6FDF405AE387DD7CC1735A7FC27D1A476592A514B87C9017E1E5D37E338F37916F3C72C5F2AF75185B88694D4E8E0A93FBF20CE81A7A0C10D55737B6473FBD92BBB39FEBC6167336BEB9C235997796B9C0DC18C353E80305175BB412ACC29E647813D0003F727ED0577A7C14BCF67173DA569320E887BDC8F5AD27FD8864261E802A6753C6F9BAC844B5900ED0D4274C0E6EDE42367079188B10BED5999501164FA4C5A818ED6EE229C3E0E0F7804B19EAF5D1132BE1D7FC18BE834C842B21F8DDB11F8CFAAC10D2E124981ED698EE7CACA211C5624F09C62E1D451429048B55ED0F8A714BB77A0D4B40F0A446EDDFB27602B7BF894805C4AAD9252658F6B21A05DC0CF6A3ACDC227FA867A4E5B1DB63A14DE26A79AACF1900A7B7D867C15CFD1DAA712F2A1E2A6C7B31B121465539CD0164E3CCF79A978B543AE9602996448C6F68069D044FC958911EF40B0B9AFC78ED014D94571F6771EA5E2306A7CAC32C135FEC0BBF1DCA3CB0B57DAA239C01671718017C907048E0D19515CBF430D4B3B4FF4FC9A391D15A38B39C4E528FAC04EBD3DC69144C98AFA75102D21FF961BAD2E1F25562AF92554814405C4EC08DAE4A0CD28BE592C9C9BF997CC0FE31502DD541000D4640D59654D26CA2A17BA4CAB0518EE097C05B2984FFC56E8182368E216768E0D07E17FB64003E95194D04C6E00E08386084FEBB6CBC841E8F3FE2A069C45554BC502C27591CA3C1DC9E6B1694BA2C1BC0713C1CF738DB22FFEEB7443D72D5BDB975D192976A58AB33DB58F5DAE497A0B24011E15E3256FF124DD99AF6FC300D1FECDCEE18DD4FBF25E901125D4E80EFA8E2A211701B74FD992E63376996994E054CC00E7E1DE7DB8E7D2898A735EC4920DBEFAAEA66B456CF6A12324C5D56762313A627B3523AB1E2C1C82E4FBAB136AE4395FCF2672A58011D96BBDCF2A7478305756D66B30A4AC44E48B18A5964AA89F14187EA114084D52B4BA77755BA04C34777409BDB782B7B645E93B4DB284525E2F9C9C38D73B475DDE2251277A2E6C3183D5DEA78414E22CC8FB4B2C7EFA797CD4A87AC81D3242EC8D2C2EFD6BCFD69C39F14B0B365F3151A96F75454A3A1400C76A4390FE9F2E7A22A0CFA687A5BEF1C905D3A893B0DFD35BDA184F25E62FDDC2A52B6A67E76F550ABE4CC8D1D63CC8631E4CC315E46D3015C3B8636B92B8D07075D401C654FB4A -pk = CB469F194097C0186196D092999712B7B71EEA101F1457A96AF6EC52D459231C4CC268D247CE44DA3221D1D60307B91ABB21807FC453305D024EF7C10E73EC0F -sk = CB469F194097C0186196D092999712B7B71EEA101F1457A96AF6EC52D459231C4CC268D247CE44DA3221D1D60307B91ABB21807FC453305D024EF7C10E73EC0F020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000444A72EB67DA32BE0C904C9AEE8A3E63D04BE7AED433E1E212C3460B311C2EC8AF3D4F3E6AF2488E0590E23BADBAFEFFFFFFFFFFFFFF87ACB24A919257A8F794A40D18E648C79FBCFC65DEC8EB538102C99305109A8E21041DE7395CBCE179B5035CB02AF9FFFFFFFFFFFFFF07967DCC4A7256D93CCB45DF4CBF0BDE51AA5CD620CA7A88AAD321FF07D8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDCDC363EF92A8156480B5DB1C8ACC4FC0AE860E1642B0DC8234FDEA8215C000000000000000000000000000000000000000000000000F7690F10574AA05A783E64FCC350EE544077BA831FCE576A957A3FF2E6DB940FA9165CE3476105B066ADB2821635F2D6D164DE9856F7FEEF3D78D30A55E6D2067C39B69F46851D1D2A701671BDA8CB286445BD5E85A20D42EAC11CD3730C76176340762D97683EC97638667B39C3651985D232E36620893F221144BC72574D2EFF99F942986EC06787CB09BC102F248B3E465A73186585B88422361514181818411DA136DF19BC363BECE9EE3BA28FA2782E20FDA2ADE7B524C6C41A52793B2A59689344B222A01AFF85BEF52E0B6558A49D86A682369D3895EC47C113812C091FE69F064E769A3E6D5ACCD044D77A8341D9ED8657C23FC064FF4124A1CA55257CD25DCA2E872CFE82C252117F0A5AE379686D69CD19E3B3A6471A6C63F5962F1FDCDF59BB8999AE4C3C52BD24804EF0F966194695F76C5FF0A4FCDD317607233E8EA0857E0B02BB57A7545479DAA6460D55924975AD0F5815509FF2F9D06A19108B2DEA06ABC5CF9E1A7C1D90E5A9468BE662E3C613644675B0A1B95A43213068B2E57E32015EC3C87FE8F8BB0A85478199A72AD8C93413B3F429D6E0724107DEFBC54ED24FDBAB84A8EA74B924677492407AB684BF52DFD53ED1038B8B2A07 -smlen = 1959 -sm = 3A8641A09DA196BC5C06725AE2C4C4082B81F101443B4266CEDDF4E30F04BABBF9BFB0478CD87701A46AF7883EC9798491069CB08A361814D5B08B04872E576BA94C39D67D01B929C71DCE4F38554E061E9DC2B4C65F275B890261270570FA49DD00DB069A652168EF7AF367290637C187AD75F0DC57BD0687C76D24F3CC76923D0362112AA0ADFE8EDDA10200E3BEB74F445402D6CD089082DE33F5250903089EDFB6C3CBD3B7CD0738F74670CCE8DA006103E5B22F934203B5CA87337095C9A19267AFB9695D309BEB8A557BB7CC90332C4A03E1D416D397B945B607268F545928104CFFD71B02864E010B666CFCB68B762FA5EC839B5AEFD0407419441B38E6D881BD5218DF73C675DF101BF2C53D90FF86D4A3C7DB19EC9CAC044E0467A36337AAEEC32217FAF86CBD7BC2B663421754CFF1200A8A66E18F812868BC8D1C8CA495E6462DA4B8B96D4167F040F04927A7C27AD35CF174D42684ED55AC80D14CBE4CC2570642DDEC4F44880D967E9AF77EE27D0D3DBAEC9067FB6FC957AC4A136C1D564E17F59AC4938D43FB9050D810989907125C47FCEA6C162C723E79F68339CD1B3BF596988BD6E215271385CD50616868C6BF40FDC34BD30E5A00773E2C039723F2AC3A3FA45F4CE870841762D7435BD6CCC5FD3D58FE059EE455A806FDE89155C84797FBB73691A1FC6921859E99066A3239E31F28D1A46100DB1917621D9E61473CF1E71F9850B584B459D5690941E676A7DD56796313ED9ABDBE03DC75AFC1430DBA27FE0F8DF48EF7C339F462AF1A6D30A5F8B480DFBBE860C4C0BC136393C8FA0875AF454273C3CFDBA7EEA44EEF1A4060136948CD98B9D2C19AEA4934F3455F31DD15BE6545134F17A195B6BC409159C0975E592A15E86CA4943CCACF4B46719A072DB8C629B67768F1956F8158F179A0B645320489DEE404C8D0C4E786CFF39B324053F102C118E7D51173CEC0FDD017F213B2B07AC6B2C7DEC04172DD5396A020EDFB74ED86FC31952D241A7C3D139DEF543D90976AA70599792E73CF73AD0BD4A359BF60DFB2CE96A784D8DE5E23A95E831CA6FFBA6B187BC5F29A7757185EC06AC882572EC6283A1875B54FE4F295E1970BF311DBABAF9F894D3364D68F529C4EF9030AB934BCB09459D5AAC61919946FD28DF1AC85876F979E8B8528E9BBE69F03DEEF136EEA6A8FC86F31BD64285C8C9F49ADF53A8BAA7867CE52E72DC4A63929DF3BA2662DC77D71F88D8AF42B8D67AD54884EE11F5A6B3B794F7D5610909B0B740937587CF475DA903159994A262B6F32A3D1723FDAAE65E636B71CB0EF0A744F359BF08AC8231ED2970CE8C451266F703DA3B57F85ACEED4C1C174C50D9C226F028E972AC124FAA6F60518699CB4C499220EA51A538F9EDE67D0E98E1BF8FB4B24B1D8EF50A28A93E20076F8FB812CDAB04871D331FF434BA66DD4577B18DC3F471B3E96A174B58A7AC2470EB8463A71FFCBA2D064470FD2D4E15F9491DB09DF3E3BA376A3DDCC437312BE5848DB3B9079F2AE046798473BB970D725E1D7C6FDF405AE387DD7CC1735A7FC27D1A476592A514B87C9017E1E5D37E338F37916F3C72C5F2AF75185B88694D4E8E0A93FBF20CE81A7A0C10D55737B6473FBD92BBB39FEBC6167336BEB9C235997796B9C0DC18C353E80305175BB412ACC29E647813D0003F727ED0577A7C14BCF67173DA569320E887BDC8F5AD27FD8864261E802A6753C6F9BAC844B5900ED0D4274C0E6EDE42367079188B10BED5999501164FA4C5A818ED6EE229C3E0E0F7804B19EAF5D1132BE1D7FC18BE834C842B21F8DDB11F8CFAAC10D2E124981ED698EE7CACA211C5624F09C62E1D451429048B55ED0F8A714BB77A0D4B40F0A446EDDFB27602B7BF894805C4AAD9252658F6B21A05DC0CF6A3ACDC227FA867A4E5B1DB63A14DE26A79AACF1900A7B7D867C15CFD1DAA712F2A1E2A6C7B31B121465539CD0164E3CCF79A978B543AE9602996448C6F68069D044FC958911EF40B0B9AFC78ED014D94571F6771EA5E2306A7CAC32C135FEC0BBF1DCA3CB0B57DAA239C01671718017C907048E0D19515CBF430D4B3B4FF4FC9A391D15A38B39C4E528FAC04EBD3DC69144C98AFA75102D21FF961BAD2E1F25562AF92554814405C4EC08DAE4A0CD28BE592C9C9BF997CC0FE31502DD541000D4640D59654D26CA2A17BA4CAB0518EE097C05B2984FFC56E8182368E216768E0D07E17FB64003E95194D04C6E00E08386084FEBB6CBC841E8F3FE2A069C45554BC502C27591CA3C1DC9E6B1694BA2C1BC0713C1CF738DB22FFEEB7443D72D5BDB975D192976A58AB33DB58F5DAE497A0B24011E15E3256FF124DD99AF6FC300D1FECDCEE18DD4FBF25E901125D4E80EFA8E2A211701B74FD992E63376996994E054CC00E7E1DE7DB8E7D2898A735EC4920DBEFAAEA66B456CF6A12324C5D56762313A627B3523AB1E2C1C82E4FBAB136AE4395FCF2672A58011D96BBDCF2A7478305756D66B30A4AC44E48B18A5964AA89F14187EA114084D52B4BA77755BA04C34777409BDB782B7B645E93B4DB284525E2F9C9C38D73B475DDE2251277A2E6C3183D5DEA78414E22CC8FB4B2C7EFA797CD4A87AC81D3242EC8D2C2EFD6BCFD69C39F14B0B365F3151A96F75454A3A1400C76A4390FE9F2E7A22A0CFA687A5BEF1C905D3A893B0DFD35BDA184F25E62FDDC2A52B6A67E76F550ABE4CC8D1D63CC8631E4CC315E46D3015C3B8636B92B8D07075D401C654FB4A - -count = 54 -seed = C8671A5D752CC6DDF075C899797603A625C142485EAC3D57CAF14F2244D7F84D116B28F959912A758E519D588A6A07EB -mlen = 1815 -msg = 3EAC87B3D642CEAA3DC904AC3C4245CB2A260E4B74D0394D33D4B71024144180A727F80B092305F31B2526998EDF6F98E46933FDAF0E8709E98D54F13C2701C58BBE35292FD3334C5E03D345A9A2EA1E01B2C4573567FF1FF3BA7406A16F5A5805EDD760AC78A3AB8602E415F67C7CEA5B36421C79F83CBB14FA775448A832A4B28851CE215C11DCBAEE652CDD7342B6B1204727479E6208FB556CF08BF7EE230F32659E829CE4FBCE0955D01D36624BBAC18C1D25A3E187722F8F74C88B56E518CF0E78B3B0EAC56D8F13C4AFC4DA3613A41CCC2B0B0E2EBBFE5799E479F81335360D483596E9AE926751EC9B956555F271C2CCD85F0F6C1BBB2C326C29B5DDF6B5C4C11F8EED15C0143993FEB626543E92CE4D66C0BD28C79ED1ECB793A3091D6B9AB510B0D41AA42D70C2D8F26EA0B826C8C375E1DD89B3E2A48FE5D88A462DEAC33BAC35AA32EBC010AF7E47B77AD23653D747760914E0CA12864CD401787EFD96F30D82D8907DC68578067703DD19B2377DF319EB540E8AE78B2BE86BEE1C915FF3B2F4B25C0AC22CCF89BD85371961944D8A4E6D20E2D3E9DF3A07D3BF6986898786F0667545275FAC3EB0F069B457D8EBBE5F60125F94756DB04EA203451A0DE160CBCE2A34650D92F200448B097691A61361AC487FBC3C82B2BD7C1ACCA02031311971C3CF69BA459A0B640A702DB4467973713A6F2466560FFAC0592D64FF1D4A935220826EB559CFE0144EA4B8E54EAF67DDF91988DD4B3749C865008C0C1CF98BBF76D929B85C8C426C15FA56706984E0F2E90658FA3CC33EC9FC700976870C94035ECF9A0534B18D07F55923663835416E40235CC2550BD9822F0912CF101F86039830AD9102AA4A3B6777EDEC5EBE621082FCF81A1C6A528F0324EC9D39FA80B6E87D6366E7EDAA0E14337D6708F7C3D2FB1978F4F5CD594FD35B267F9CD09370D3366DCE286CCB9647A1944F8D8BE63E5EF8F6108CC5E9AFE9127DA84E1913439EC35A4E17F7782DF042DC2F7C5CAD8A659DB282E61763539B56C2AFA0F2B507D549EC8C9E76C7DB306380CD7B46C9699B6DB8BE06CCA15E8E83763137B06BFF02DE2738A46C61B70EDF4F394D54D0453DABF689FB6BA41616BC589CB9847224E74F919B6E03672EC6A52584FE81456D6E648DD6F0F9B068EB72241F067BF6B891A498A9A59356C735E10EFB37B3ECF47CC5620A35442DD81E25D2C6DB0E9E871301ADD193D628B30E3B4345751BC17E0B5B05AF758A653DE7BED3763303FFE1AF05E407F296C736CA6F4C348B25718C7A814BD0730AFFC057842AF3D9B9ADB12FCCD740ADD16218AA57E43835821A2BCD70F1027F3042D4A92F10D0A1FB8323E87869BFA8DA24DA75F8743FA3038C24FEDC0C987065421BF4B300BE3ED3F6D6D590968D3EE32A8F5E20EA6168756AA18BB78B6AA48C299C36D0E78B6F84CACAB5946C69179E461F4C2DD201D8032A29EC6C52942AC37D9C76AB4A401C9AFF96284E1E9E39BFF6D912CA33B6118067605EA65D7F611DD963F4F75F97346FFFD1DF84C79CCBA06804B3017775D8C0BF614FCF4D824709557937B22E1805A0A961ECF226F26E3706362BF6D8D1DD30BE7EEDA481A64961641DC57B9F0211F8EE43578E4C2B6507114DFFF3C3F884586BFD1278D117F7C6014FD5980CDF1E2FD1F34CCAD170842B9E819C22FAB9890AE265C3BB6946FCCFE218544D00A6BA5BEF5224EAE24002B6E83E0B35E98C2322BE2EB3D8234BE8B048C54E40782C9A24D7A8B461EC05F38A94AAEF3DA3B46D0D85B0D949CF1089408189FF97C56C7DEE50A004AEAD82C15C7C0D0965F3C65A9A715A65D29CD3614954EBD91EEB4E74F862FBC944C56F2EDEC4D344F92E8154708AD0F5575880503EF0F107A9A9DB99BAE82357C16578F3E6CBDF9B427DA88DC322D11C6AB2A6AE6F5179C94454E09DF5CAA6A519A4C1903C8F2925639E12AF793695F256BF0E55E0D45B73880358F09719ED89A4A1A07868BFBF16095A20035D5D4F99FDA19DDAE3E21CB98308F4508B5CEE706C27898F03A2BF14F29ACBF055E4AB0713A7B6FC1A7853EFD36E1290E69587FEC15D492A66B9A4FEA6E2BCDE61E02FE18E06F59A2F4E06F177B14CE4C1CF1A8D1F49C554A8A4C68B9937B4C230320C80753D4B071BAB2DEDA89C9181820336F1E766E447EA1C44E15CBB7C002C1813D2C1726DB0E4DE289466077DA9610E5F3AA313B1B01DD79A4056A8BBE9D843CE5B0439325FFDFE91FDADDEC6CB86D5CEBB68D8F9C0ED237A4648C412780ACFF48FD9CE817EA70D950DCB989EA6B11FD87EA4F30347A27488C5C15BE7FD6D1280FEA3A7C022F8D9881FAC93176DB2025B4C7914A51099893A791BF5BE851F325347484CA6ED51B2BA71548A6046EA7EC85B31A9967E7D119D2CA3A51C1E14D5A3EEF0D41BDD615DA01D45979007A1997DE281BC340C3203D5BC0075B1AA38873A9DBB9D18E6E26971E70B54E41E2C8C91D2E60FBF85435C1EBC4893C45A201B1D2391549F52A1CA3E0440ADFB746FBBF0D9933F9FA0220B3E04EBEBB29D2A9AC1 -pk = BA157721324B37434409945CC18CA52E584FA99014E15603F72AEB9A3726EE1F2246DE7895B250F048F1626A7C0D9E12CECC2D878AA577C52BFD8AE7BF53751F -sk = BA157721324B37434409945CC18CA52E584FA99014E15603F72AEB9A3726EE1F2246DE7895B250F048F1626A7C0D9E12CECC2D878AA577C52BFD8AE7BF53751F02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083FB4BB2330909244ACB38EF44D3B0424C01E601DD0746136DB9AFA7C65A85A3841C6D87D5A52BBB539F29256AB6FFFFFFFFFFFFFFFFCCF8675267962BD7FE85EF39FD36CA0324D3B37A686045E52DECF72427C276D3F661C779C315CE792B50D04D3875FDFFFFFFFFFFFFFFA01ACE459639A18F25648BFBD4BA7EB30279529196B2D98CA4E0A0AC783D0C0000000000000000000000000000000000000000000000C58E7E7D40A14F124A34537622FA8EE8666CBDE702DBF41F775F41A6DC2804000000000000000000000000000000000000000000000063547110592618B5CB3246DA1B969DB662866FB5C08EAF61EDF7E8BC4310C303C8665520FDE223098828ABA15BAC6734B2EC061454BC403F6463362F0D30631ED66A0F471B3622CB00A83A3824DB06B64AF0AF7535D2BB2B4C79533C3C87D313DCFF0406C4995F254C4102F697FD54A5A909D69D2C19AF886AA91390A068662E7DB66174D42BF36E1B506CDAF34CFCBEAACA35258AAD9CE65A5F9FC85206972F7AED5B6FDF34BB7A60FFEC9BCEEAA814235A59BD649503FF604123979D2A69166FCF2A92E76DC0FED377B2701343B30FA43D21ACF6832B480C29C2B2CD7C761275BA0408707A67998FDF49CCFFC0E17AB150CEEBB3548D34835D20E77E36B6009D1A5582CFB7116D9D0731FEA2A19F9DEC01792C1E2FF6C705372DAF32303710749D30A1F22DADDA4DE3C986FA092C3AAC18F569419F71071D8A992B6E077F0CBC2409226CB8D103720FF1369549D56F2B1F642B820B8C2843612191E8173B327383DC05CCBC10FA4F2EC728C122D9E85D31DC6FB887790E6642FE44F8CA622A5062BC10937C59EFFB2C3E0DE34746C281F1154871718E49A5DAAAC3D944560E9CFAB7C3F533D019064ABDF4E4F477FD2AA3F9C0082970533CCB60AA96A47C21 -smlen = 1992 -sm = 1257C4E2BB380D4ACD04C4A9EB59D8EEF345F0025918A9EA28B9FF9B9302B268FF1534A18D8A73036BDA6C1D7E74394EB6067D33B4FB0C121D2126045D05687B03DF6F00CD006F362896BB96B6937C062F750073D136600B5201A906CCBD026490A61F07EFCAE6A553C65550DA0173AB6A4C0789BFBE4D03ACD5F0E9D8A8E1B89201D54E4076CA57C1A46B0400D7EC3312F529F96E727A7C0249FD8FD408036999B4433DFED8BE1B0397464BA2AD061F003EAC87B3D642CEAA3DC904AC3C4245CB2A260E4B74D0394D33D4B71024144180A727F80B092305F31B2526998EDF6F98E46933FDAF0E8709E98D54F13C2701C58BBE35292FD3334C5E03D345A9A2EA1E01B2C4573567FF1FF3BA7406A16F5A5805EDD760AC78A3AB8602E415F67C7CEA5B36421C79F83CBB14FA775448A832A4B28851CE215C11DCBAEE652CDD7342B6B1204727479E6208FB556CF08BF7EE230F32659E829CE4FBCE0955D01D36624BBAC18C1D25A3E187722F8F74C88B56E518CF0E78B3B0EAC56D8F13C4AFC4DA3613A41CCC2B0B0E2EBBFE5799E479F81335360D483596E9AE926751EC9B956555F271C2CCD85F0F6C1BBB2C326C29B5DDF6B5C4C11F8EED15C0143993FEB626543E92CE4D66C0BD28C79ED1ECB793A3091D6B9AB510B0D41AA42D70C2D8F26EA0B826C8C375E1DD89B3E2A48FE5D88A462DEAC33BAC35AA32EBC010AF7E47B77AD23653D747760914E0CA12864CD401787EFD96F30D82D8907DC68578067703DD19B2377DF319EB540E8AE78B2BE86BEE1C915FF3B2F4B25C0AC22CCF89BD85371961944D8A4E6D20E2D3E9DF3A07D3BF6986898786F0667545275FAC3EB0F069B457D8EBBE5F60125F94756DB04EA203451A0DE160CBCE2A34650D92F200448B097691A61361AC487FBC3C82B2BD7C1ACCA02031311971C3CF69BA459A0B640A702DB4467973713A6F2466560FFAC0592D64FF1D4A935220826EB559CFE0144EA4B8E54EAF67DDF91988DD4B3749C865008C0C1CF98BBF76D929B85C8C426C15FA56706984E0F2E90658FA3CC33EC9FC700976870C94035ECF9A0534B18D07F55923663835416E40235CC2550BD9822F0912CF101F86039830AD9102AA4A3B6777EDEC5EBE621082FCF81A1C6A528F0324EC9D39FA80B6E87D6366E7EDAA0E14337D6708F7C3D2FB1978F4F5CD594FD35B267F9CD09370D3366DCE286CCB9647A1944F8D8BE63E5EF8F6108CC5E9AFE9127DA84E1913439EC35A4E17F7782DF042DC2F7C5CAD8A659DB282E61763539B56C2AFA0F2B507D549EC8C9E76C7DB306380CD7B46C9699B6DB8BE06CCA15E8E83763137B06BFF02DE2738A46C61B70EDF4F394D54D0453DABF689FB6BA41616BC589CB9847224E74F919B6E03672EC6A52584FE81456D6E648DD6F0F9B068EB72241F067BF6B891A498A9A59356C735E10EFB37B3ECF47CC5620A35442DD81E25D2C6DB0E9E871301ADD193D628B30E3B4345751BC17E0B5B05AF758A653DE7BED3763303FFE1AF05E407F296C736CA6F4C348B25718C7A814BD0730AFFC057842AF3D9B9ADB12FCCD740ADD16218AA57E43835821A2BCD70F1027F3042D4A92F10D0A1FB8323E87869BFA8DA24DA75F8743FA3038C24FEDC0C987065421BF4B300BE3ED3F6D6D590968D3EE32A8F5E20EA6168756AA18BB78B6AA48C299C36D0E78B6F84CACAB5946C69179E461F4C2DD201D8032A29EC6C52942AC37D9C76AB4A401C9AFF96284E1E9E39BFF6D912CA33B6118067605EA65D7F611DD963F4F75F97346FFFD1DF84C79CCBA06804B3017775D8C0BF614FCF4D824709557937B22E1805A0A961ECF226F26E3706362BF6D8D1DD30BE7EEDA481A64961641DC57B9F0211F8EE43578E4C2B6507114DFFF3C3F884586BFD1278D117F7C6014FD5980CDF1E2FD1F34CCAD170842B9E819C22FAB9890AE265C3BB6946FCCFE218544D00A6BA5BEF5224EAE24002B6E83E0B35E98C2322BE2EB3D8234BE8B048C54E40782C9A24D7A8B461EC05F38A94AAEF3DA3B46D0D85B0D949CF1089408189FF97C56C7DEE50A004AEAD82C15C7C0D0965F3C65A9A715A65D29CD3614954EBD91EEB4E74F862FBC944C56F2EDEC4D344F92E8154708AD0F5575880503EF0F107A9A9DB99BAE82357C16578F3E6CBDF9B427DA88DC322D11C6AB2A6AE6F5179C94454E09DF5CAA6A519A4C1903C8F2925639E12AF793695F256BF0E55E0D45B73880358F09719ED89A4A1A07868BFBF16095A20035D5D4F99FDA19DDAE3E21CB98308F4508B5CEE706C27898F03A2BF14F29ACBF055E4AB0713A7B6FC1A7853EFD36E1290E69587FEC15D492A66B9A4FEA6E2BCDE61E02FE18E06F59A2F4E06F177B14CE4C1CF1A8D1F49C554A8A4C68B9937B4C230320C80753D4B071BAB2DEDA89C9181820336F1E766E447EA1C44E15CBB7C002C1813D2C1726DB0E4DE289466077DA9610E5F3AA313B1B01DD79A4056A8BBE9D843CE5B0439325FFDFE91FDADDEC6CB86D5CEBB68D8F9C0ED237A4648C412780ACFF48FD9CE817EA70D950DCB989EA6B11FD87EA4F30347A27488C5C15BE7FD6D1280FEA3A7C022F8D9881FAC93176DB2025B4C7914A51099893A791BF5BE851F325347484CA6ED51B2BA71548A6046EA7EC85B31A9967E7D119D2CA3A51C1E14D5A3EEF0D41BDD615DA01D45979007A1997DE281BC340C3203D5BC0075B1AA38873A9DBB9D18E6E26971E70B54E41E2C8C91D2E60FBF85435C1EBC4893C45A201B1D2391549F52A1CA3E0440ADFB746FBBF0D9933F9FA0220B3E04EBEBB29D2A9AC1 - -count = 55 -seed = D780D7688AF364949A196657A066BD48FFA8DC45B4885279B6DEF362E5957F398CDCE1D20FC3F8F63A275C325FCCE654 -mlen = 1848 -msg = BAA4A41E4B68FE333FFA5EE97FD3DE18F0EECE8EB83E46A8E3505E2EF8AEA2C4040BA3809A764B681EC7449F41A2463651A8CC6DEF0E4A058EB843EF016E5CBA8D55F925E66524BE55CB98FC3169082E52E0D6CC3600C4E8A560B6D448A72CCC95620101323F98B43E28D6357414185ECB0263C7BB94E7F86146661FC897844CF52873114D39123260893DEF13516F982783B927864B61B56D3A8E5B4705DA3A95F6D12A6637C9CED02F07B4AA0B08B4924103036C2A93B31C91EBB6C5B77DE090EBF60A04191EB6CE9CC9B550F5B0C9104B74D15358854181C0C5640FC74CAEE14FED6577FD75EECA14070B6D02A9A421247A5BB262D6E62B04649E75BBD3ED8E72752289FA7C1A68096DD96A4BAC8A2DC27C44881DD2416387D74A005680A3D229D562D3DAAF8DC37B4C87CC86A8C991E9327CDD43BA930CDD8D1E44AEFB084B51111965C5DFB0EE2F09112B070CBFC545119ABA823EB3F65F26BCC025B39F79BE42C0396C5FC9FC924EF1B7EE9DDB71B6E69B579C0A64C5B020206CD3515B8D5F4FF29378B9580D282F7E5ECEEB5CE9C09A7B334E62151100CD658DFFFA66F4091231BEA6C9DE8129EC4F5FBE8BE0FF4BC93367DC69D9E38C177B23AFBA5C27FEE3E2B73C0037DD7C419C854DF7C2412349BAB43869469E80527C3AD3A7103152F9E0B03353A596002FF54ABA8B14AC393EE52EB5564D63BC2738D571FA3C255ABD20102BB299441B00EB988F3A5CFB238EF8C49963B4AE8877E6B317E208821510BF446CE6B06C33717C91C460924248382159198F09D0F5A25C1611B2D39CC6D2ED149FDF0E09A0B0B2BB77067182E386F5F6A55B68808DAD98E5CEB0FDFAE6A0315845ACC7B9C172B0E82190A5EB7C58DE4F86D883292A883045C62D6A1B3C886C345AA6158276EFA6B93AB2188E47ABDD25D332146E980E1B1E043CF63EE35A5AA01AB6CC62F77699DCA16FA30E3632DC5CCD3253D01E547746C78021AC307F0EF1A0119AD11504803EDAD933150981C4D9FD181835C507651DC92A86737E3AFD0EB4DDEF6182872FBD31BFC6D8427C2F4D3A39BCBE6B5120B8CF2AF5DC59949C92D10B1C6A96810564DD335E0755F9DE25EC26C102355688C38250DF8F96E105136855C8DE4BDCD86DF03F92977DA16908CAEEB4056F4A5F751A57BA057AC0309F1C107E594CF3C31544E4F1D93FB9AE7E1A2451E7082CF0C850990EE71ADE0498F6A3852DC4FC128BFDB8ABDDA3D759C8D4F83FED8509CDE5EED38410FB9F0A5F30EA45C9270BA2395DF645AAEE03F56158685A0BA65DE3D2C5209A7EF4BDD4BBE0CDC966DD1BDF1FE0BE06C7115F7CCD80F8012E5D17955AE0C9E4220076882F30DC5E391295994B9F809C09DBED8CCDFC89669F40492944FF20948080A4ED66AD8166B613AB2F4414762AE493EA6661950E8E56B3758A77CDBCFBF24FBBBF20EACD5CBF8815899A1C3FD20B1D04920025885388012D9C58EA842DB9530B7ADA901AB9CE46A12700687BDE07FB99BF66D0C775218B8454C936F03558B899B59361A0C664081CE8A7858DDBC5E7C5480280411C9ACF4D1EC45035D97524E9E44F963532CA5067609540C1BCB5627F99D5C61CB9A6D400F0BA0A74E45DDAB5A4E8A765DCF2F3684E3A2661A78AC069FA38163AD9F9713EB45C841C6617697CF8A72C54B550DBE9C22B04D579B09AAB0EF4EE8B70CA563F81EF9700C07761C944926F9A76A8C3EEE1CF7E7524D65908C47C35B0453DC10DB5B75123A5B26B9612C0AE18816A71F34638798DFCA21F5073CE771500034F9A71FEB8B621356C430B4D47CB1B59AD4677B5C679188D8861BEAF52558165F691F65A692E8CB8D24ABB74B8885EDEBBE52FB13DAC16E3A8EBC4EF192FD10D71898E93547C7A09F8642AA3B4FAAE23E48BFA809C5989D3462AA50FD4E5C4095542C45E5600926C2DECB4D18BB43B7274239A8DFA3D9DE1BB9CA099DFE56DEDFC9E120867EFCDA10B48F7E630506AA606D76E4537036127FA05FFFB8B8703CDC8DE70A78D014872111A431F393345D74E8866D9A9A633923072E93DBF47C54C4B205C60E67D5155B76F51AB49ACC7435525605DD43A10C88A03E08E257C68937BF2984BE63D40F8A60589D909F8F09688A77DA15DC7B4853339F235B1BD60AA845B4DB6B699325885C49DF9C40781CC56FABEA6201E2F8A9352C28CE321B9441422807E9C81C8F1EC85D240C9F1C8ECC4FF06D6E3682DEA3E6CF92F2B74C2165AF247CE0F5AB84460693254B523498A57E7442977F51F1C2F649BDF756E7F43AE543F5D8E692820F8A06322667A7FA9C1A5B10199A69CCEA22C74E172FED43E550C68C337ECC5E6AAD9F7EB997A7E619D47DF73CB917A705C3CDE5FF344F6FBCFAECCE6B734E09A385FE54B224A880704D774581074C59EB0A3B42C59B8BA4518E764C5A532F6655DD839862AF716903A118433CE0809376A88E88FA847B4D1C63EE393267B15C1E42A91DC6107CDE990EC9ECC7C1066E9480E90A22907C51AF47DA837438A90CC07DE8121691BD73802D5D09D18A2D8B38A28948735110891D1B559A73445838F359A6FB90A3CAB887486CC9D95CBA35B55693C890830D2 -pk = 220635857658CCE6CBB03F469AD8A3570166C81096502587206F7D0331E2581EF7C2E53647FEECDD2B4C360C462B050D9594DDA28DDF47C2DCE5037F49651524 -sk = 220635857658CCE6CBB03F469AD8A3570166C81096502587206F7D0331E2581EF7C2E53647FEECDD2B4C360C462B050D9594DDA28DDF47C2DCE5037F4965152402000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069CAD17F618C9DDF1A6B04E7274DCFE21C9CB59F10B0242EBD6E61CFC4755088DD5B99FB601D1CDC62449D4E8CDCFCFFFFFFFFFFFFFF16E614DC480D33EAB6F15354D5C15A83C92B549CC9040963BD17939E97D953CA849C51E308964B6DDC09BF9F91FCF9FFFFFFFFFFFFFF86A617EA25946C0CD1A2FB7F47E0330F4D3223366C8E8DAD0E1D3FC6D4D2020000000000000000000000000000000000000000000000B7F4DE442D4D0F9FBB33AB77573DE3FCB8EF4F6D885DF454AAF9D835AE8E08000000000000000000000000000000000000000000000047515A8F05156F2C2718D9AFA64816A1F1BBC72086F92AA4546DBD27235474019BF99829789BCBBE52C9FA81D34B5896B4A2E09258E8EE5FD58E773DE2F3A31D7290167C56041B3DA8DB4B6B53170C5D1411A7CC1B1346341A4B6E1AA6695A2AA6E1E0D31CC43A1C46DE963C0C32FD9775E654073E3E6F2D897F6257853204088CD36A1B36AB05D0154E41599B5221B8EAC8F2FA3BBA11BBD3216ACFB8B3F61AE25F6993C00A3937F9AD053E700F43434AAFD8D0CA50E1BC9E189049F4E6882C83653CF67FF590F563A14771C51A0FCEB15C7706930D684B970964B0A4773D1F2A77E1A0611AD29E7058312C4F54778CC613D30D60A48EDD76982E0A1930382F41514A0704E63F4AD01CA803CC3C0F4163EB7212E6631E6FF5AE7C45FDE61B33E5C83C948811EBBA24A999CC9598CA47637DABEBABB6C56C294DFEF5D27F1011988C19655D086B96710300A43D90708D919F4B329D1D6CCD28AE759A9EBA090DB9564C00D1B3553CDE64A0D14BAD694AC877C29A21A428C7D0A8DCC2BDECB817FCDB0ACB84AF05C0EF2C6832DCF83F03F9F5ED087E2561EBC51039B288CE680AE6D378102624F2C5E4DFDAB92F3B4BCC8715D83919AF5905C1B3FAAF19D2E202 -smlen = 2025 -sm = 9AC667A6395F48487D07B6BE2198E338430E5007C53212727F8DC2EBD405005001E43987444272009DC056FD60ED867C22028C55DE72923429F60B01C5CCBE37137033E1600203DE0E1443DF4CB3DD04CA49D6A2E020BD514C009D8F919C5A73BDE1180306E79E8F8CCB549AA3027FB122CA72449E8878013BBB5445FB80EB9D7707AAEFCFF250FBEFABA801010508419A2EBEDD534D1F18E913C326880C034FCA4615A78C298FE5076B0B3A1BA6E5F800BAA4A41E4B68FE333FFA5EE97FD3DE18F0EECE8EB83E46A8E3505E2EF8AEA2C4040BA3809A764B681EC7449F41A2463651A8CC6DEF0E4A058EB843EF016E5CBA8D55F925E66524BE55CB98FC3169082E52E0D6CC3600C4E8A560B6D448A72CCC95620101323F98B43E28D6357414185ECB0263C7BB94E7F86146661FC897844CF52873114D39123260893DEF13516F982783B927864B61B56D3A8E5B4705DA3A95F6D12A6637C9CED02F07B4AA0B08B4924103036C2A93B31C91EBB6C5B77DE090EBF60A04191EB6CE9CC9B550F5B0C9104B74D15358854181C0C5640FC74CAEE14FED6577FD75EECA14070B6D02A9A421247A5BB262D6E62B04649E75BBD3ED8E72752289FA7C1A68096DD96A4BAC8A2DC27C44881DD2416387D74A005680A3D229D562D3DAAF8DC37B4C87CC86A8C991E9327CDD43BA930CDD8D1E44AEFB084B51111965C5DFB0EE2F09112B070CBFC545119ABA823EB3F65F26BCC025B39F79BE42C0396C5FC9FC924EF1B7EE9DDB71B6E69B579C0A64C5B020206CD3515B8D5F4FF29378B9580D282F7E5ECEEB5CE9C09A7B334E62151100CD658DFFFA66F4091231BEA6C9DE8129EC4F5FBE8BE0FF4BC93367DC69D9E38C177B23AFBA5C27FEE3E2B73C0037DD7C419C854DF7C2412349BAB43869469E80527C3AD3A7103152F9E0B03353A596002FF54ABA8B14AC393EE52EB5564D63BC2738D571FA3C255ABD20102BB299441B00EB988F3A5CFB238EF8C49963B4AE8877E6B317E208821510BF446CE6B06C33717C91C460924248382159198F09D0F5A25C1611B2D39CC6D2ED149FDF0E09A0B0B2BB77067182E386F5F6A55B68808DAD98E5CEB0FDFAE6A0315845ACC7B9C172B0E82190A5EB7C58DE4F86D883292A883045C62D6A1B3C886C345AA6158276EFA6B93AB2188E47ABDD25D332146E980E1B1E043CF63EE35A5AA01AB6CC62F77699DCA16FA30E3632DC5CCD3253D01E547746C78021AC307F0EF1A0119AD11504803EDAD933150981C4D9FD181835C507651DC92A86737E3AFD0EB4DDEF6182872FBD31BFC6D8427C2F4D3A39BCBE6B5120B8CF2AF5DC59949C92D10B1C6A96810564DD335E0755F9DE25EC26C102355688C38250DF8F96E105136855C8DE4BDCD86DF03F92977DA16908CAEEB4056F4A5F751A57BA057AC0309F1C107E594CF3C31544E4F1D93FB9AE7E1A2451E7082CF0C850990EE71ADE0498F6A3852DC4FC128BFDB8ABDDA3D759C8D4F83FED8509CDE5EED38410FB9F0A5F30EA45C9270BA2395DF645AAEE03F56158685A0BA65DE3D2C5209A7EF4BDD4BBE0CDC966DD1BDF1FE0BE06C7115F7CCD80F8012E5D17955AE0C9E4220076882F30DC5E391295994B9F809C09DBED8CCDFC89669F40492944FF20948080A4ED66AD8166B613AB2F4414762AE493EA6661950E8E56B3758A77CDBCFBF24FBBBF20EACD5CBF8815899A1C3FD20B1D04920025885388012D9C58EA842DB9530B7ADA901AB9CE46A12700687BDE07FB99BF66D0C775218B8454C936F03558B899B59361A0C664081CE8A7858DDBC5E7C5480280411C9ACF4D1EC45035D97524E9E44F963532CA5067609540C1BCB5627F99D5C61CB9A6D400F0BA0A74E45DDAB5A4E8A765DCF2F3684E3A2661A78AC069FA38163AD9F9713EB45C841C6617697CF8A72C54B550DBE9C22B04D579B09AAB0EF4EE8B70CA563F81EF9700C07761C944926F9A76A8C3EEE1CF7E7524D65908C47C35B0453DC10DB5B75123A5B26B9612C0AE18816A71F34638798DFCA21F5073CE771500034F9A71FEB8B621356C430B4D47CB1B59AD4677B5C679188D8861BEAF52558165F691F65A692E8CB8D24ABB74B8885EDEBBE52FB13DAC16E3A8EBC4EF192FD10D71898E93547C7A09F8642AA3B4FAAE23E48BFA809C5989D3462AA50FD4E5C4095542C45E5600926C2DECB4D18BB43B7274239A8DFA3D9DE1BB9CA099DFE56DEDFC9E120867EFCDA10B48F7E630506AA606D76E4537036127FA05FFFB8B8703CDC8DE70A78D014872111A431F393345D74E8866D9A9A633923072E93DBF47C54C4B205C60E67D5155B76F51AB49ACC7435525605DD43A10C88A03E08E257C68937BF2984BE63D40F8A60589D909F8F09688A77DA15DC7B4853339F235B1BD60AA845B4DB6B699325885C49DF9C40781CC56FABEA6201E2F8A9352C28CE321B9441422807E9C81C8F1EC85D240C9F1C8ECC4FF06D6E3682DEA3E6CF92F2B74C2165AF247CE0F5AB84460693254B523498A57E7442977F51F1C2F649BDF756E7F43AE543F5D8E692820F8A06322667A7FA9C1A5B10199A69CCEA22C74E172FED43E550C68C337ECC5E6AAD9F7EB997A7E619D47DF73CB917A705C3CDE5FF344F6FBCFAECCE6B734E09A385FE54B224A880704D774581074C59EB0A3B42C59B8BA4518E764C5A532F6655DD839862AF716903A118433CE0809376A88E88FA847B4D1C63EE393267B15C1E42A91DC6107CDE990EC9ECC7C1066E9480E90A22907C51AF47DA837438A90CC07DE8121691BD73802D5D09D18A2D8B38A28948735110891D1B559A73445838F359A6FB90A3CAB887486CC9D95CBA35B55693C890830D2 - -count = 56 -seed = 36AB8588F5233D15674677535A682382C29968FF824031AF646F58FCAF0E83C1C486B1E75479149FD6F4D9E8397CAF73 -mlen = 1881 -msg = 0707EA05515798829F42A4CBDDB4A95C5750879E0A584AB503F778015F83BEBF6D63C3B48A4F478EF01091403DDC5A9662E39707DBC8502ACF50F3E06ED0199CC647EA155FEEF503BE045BEA4035C07C4CCEDA306B8187185BD06C14220F2B7401229969C1CFF8C36D499D5A725FA1CE7B44D71E6C0E4E750766183883D838DAE4F00B140E0AFCCB0E72F935018A6314232DC632C5AD3C26919D1A7925BF0F665CA0223439518143486CE92650DD145FDB2E97E0D5BC9D6806F442FE90C9C1F52992E670DB2603AD885FA42B3D8BEA4E470B7F76A367AAA506E931890B6E4607F59E87A7A5FBF3991EEAEE47CFBBFE3CBE028E67BB645D37A7BE5E7CBA6D7955CD62D1D8DB0D9772EA0185C25BC1AD40A09D3E7E9CABA72BDC3A6EF3C40C7ED6208854157914A80B5C66A6DEC2317FB5A529421C03CCA6FC0A3B3D51556E8DEE7C1EBFBA924FE2EBCE8A46BE96E761AA6749C0A9A2B2FC49B42CA47663EA3395DF22DE20947DB14FC1FAD03805955D67F8473BAEFE2C1E22BDCC7BB988DB0DDE4E83E26A16F10B93BD9CFDBA77B9302EDBA0C9AFBA7369A023EF763C55484F7425F842111CAE27E07A511A725F25D422D933F2EC201BFFE3291411AC3CD6E91018C95074C18FC780A73945B148154987854CFA1CF1199BCD03519C8F34774453DF90B71FEA6734DEA7191EE2A5735F7A191F527642D53C844B087E9346B07EDD0B78C36F83445825E60A13C424F72530E05F75DA8D33957FAFF004DEB549985790956A0E7D9B256298D56BC6206F1E4E1E958FE298641A277A2C8B6B9B7660DBF689AD7E1A19CBD965CBEAA4A0D30741586290576996AE668ECBAB4F06F2A1D542E32C5D3F042E7E29A41BF86BAE29E7029D997876CFB23B10986A45CA029739B2446A29C55561AEE8FFB187961E6E7401D726AF6D8A5C816B2CEAA9A1C9B780DDCC4F0E4003542B193AE26EC687F8C51451D2D5387D9C3B9EB95981DF2DE069FE741CD5C15F6D1B12C5B9B94230ABA33BF46DCE8AC7E26896EDCB4F87272C32D19E72C313738855C02C6F46F1162BE0A3ED2E76704B16169689BF532EAD7AE7F2B26F4D9B22712662BEEA1F46748FA4C27D1D825D3FE493B5B3B513617C81D21A0912D329C5A4E3A90EF5A29A4E3137D1CE3EEE99C42D034E61593A4076EF124BD6BCF8FC911FC9F6077D82C2980C2ADB955939441BC9E81BDF9D6996CE578114C01F9BA096D6EA40F4E0FBB18B3E3D25E7F6D6CB670AD26F604368ACB6190667B7B7ED3C1A1DA04E42AE0087852834B91AA072AD51C0193E5299481221BC9083118F7B5503559F1E2D9E22A8D57932CD0B59509E7D7F459E20EBF4C1D0DF71472340E64992C0485D593714D6B469547616DFEAFC95089689931E79944204A6D0A47A565DC325F3BE19FD44BB6CD4BF2B1D4A78C883154D70705E121B833A4A7E7E80FCDCA03F52C1F831AB0D989AC5DBB5CD83BABCB3EE74B69681818DC05E33234775123F552CFC7C7BB0B98C937957A2C4E86E3D775468A7CB8D33756ED7489D04DBE52EAA2737EFBC4C4D0F55B5A841E1453763E611BAC358FAD0B5778C6015D97CC42CA9FECC66CF844DFE55587C200DA5250B3A419791F57D3A4F672551BE885DFE2AA8637D6C890EE8E1063E782FD7E2CB356BF47B6EB93A155D8D64C9F6CCA3971C5A7FACC3C052A2AA9FB286750F76933261AFF5CE408BDA8382AF8535145F432F78B3B25A768B5DA2A211D1D07AB557CABC7A139F66EDBB744AA76E0FBF22092E31C92CAFC624EE1DC6732F27E8E7632C6EEE2D1F5C85B52D712C884B36C91DA383F0DE9E06E5EF63D7B7A692E5E91BA1A1D9298E26694FAAD9EF262F117DF8115E2E877197A8069A96210CE65D45E6AA7011654ACFAFDA810CCCC20C1985D54483DAE12B29D7ECF66376968B52FBD727CBAE7C9E3DBFEE7391D985228ACA9EB8EF98FAE32BD24552A6B34BAA581DBB03676A3A4546E10EFCEF269B18E1172F560FA0F0344149543551E079C1745BC0425B5233B7D7DC32F751D321638EDB1CEE56DF0359EB6D9863CF3E341A56060C8EF8486014F956C39B751AE239A493A017B2FA5210D374BA83DF5D799B7CD92987FEBB0B2CDB3EE42A61381304C5EAE2ADD4777011C3279BBCD1EDD6F91FF72B3C353AC35DA8FA843DC5561D3CDB507730E8BEF20CF09B0DDC36D47F4C10D82652DC2937D889F83B1DDC30E52B244250D19EEA9CF7A3B5D931E2E25B64A0A81B2C4FE933A17BEAC2E10FD888D07F994E4F2583D204DA126533F5E36B62486A00CCC317C4381A8FE11D36C43E71BE108E22A98F53729F05A5E0AA38D512423DB4BC1D6BFAE9117383ACF94AE2A737F6B8070858BEAF08E365CA84925F8BEBAEEF5AF77EB73A9D3648AAA6493CEBDDB95149F0DAFACF129FC321E558084A44CCA4B429D664D90DD90F2A04818B48D135952746CECA76F99B947A33A3BF7C535B187C1971AF4FCB1EAC841BE7E96F429DD38127B52FACC2DD6512D8D019E0080CADBF7078FC67E9AF170A2A00F70F407B0A7FF469E2F6EA165F8B43EEF1779A115089DE9ABE6B78C93E4B8E3B018686D16CE8EBC88CBC1D571372A3996C9E5967C035F9DA6E200E7ECFD1CF7158563F36A3AAC3CD8ACF52A4EEE29DCEB03FA3272A671CFC9B -pk = DDF22D737A6699EE8F2ECCE9C0FED8463B108D8D77404262D8C8B11925008014792200BE34448CCAB8DFABFFC1CF4249EE5193ABB7CAD762FA2631DE71CBC92C -sk = DDF22D737A6699EE8F2ECCE9C0FED8463B108D8D77404262D8C8B11925008014792200BE34448CCAB8DFABFFC1CF4249EE5193ABB7CAD762FA2631DE71CBC92C020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B25CD2E87D2E612F8412073F51A06AC3DC737219B3D8CBE8852FD7B2B6F8F045ED2C1B7664D9AA3C60AE8DBA78800100000000000000DF01C89B9D21C44D5062C038011224FF8F135ADCDCE654ADBC8DFD483FFA906212626D1003EB23DF869509E5E03FFAFFFFFFFFFFFFFFD17C0D8B20A78F3F68AE36926AE9CA97801ABEB8F1845A49FDDEE770A2C70000000000000000000000000000000000000000000000004AA92D263E5F709F9A4005CD560B5CDF0C0BA9D84D47A02665F26DFD0E46070000000000000000000000000000000000000000000000D5F1E4740159D3B3C5FFFABB86B0245592B32E2CBE4E9936BAD1F6D7D985362A957F2712D0510B71F1F17A5848C49D2E3EA95A9DD3BD599E39FDC9C1F3FE3607BAAB7545795FA0B3D94FF69F059AD37F5224FCF8334AB8A32C3719EFDE76621CFE32802C64829A3524E1EDF37FC5FFC22A6F4629092A3EDFBF99304998949A1607712E98F514A58663496B12CDB416DF81D7914803DA000120B1C15CE612B021A6868619149F696BB9E8DF85245A34122ECB37E95346464E673FF3AC34BF6D0F13D420A178DD3B08425CCBAB588B442F9350F434BA538C8BC87A8D89AA387300BBC3B2094ECE124F5FF1628E781F5CA116DF4ED1235FBEFC9B3550934B1D340232E6DD635A0CAD9523371289FFB486CB6094AB4C808863C3629F98A844F1EC2CFE6A951591D58B3E6E1B77275D9B337130D35FFBAD5025729C990E5F773F111F00BF6E4807F370069A2A8C2C7B067539558EEEAD2C31FFBC876955177E82E42A3E81F5EE7235325E7E9025B7168E34D3567D17DD422C553476E0E1F26BA7FC192C561E01F96B2363FFAEE7843E36EDB58CC7E9D7331B306A023B0783396ABC1CAB325AF8F0F6E9A788AEC3058BDFE47A79A267CB0CF2E8760B41F0F421423A27 -smlen = 2058 -sm = 6D0686DA81AFDCA74505D56B1E377F88540E9603A9FDD375DCCB0CC89E003358D69050C672A735028291FCCF4FE75295D6016B3EC4F0C514B29AC4005108562DF7F3F09CDA011F49CCC279B74123260032BC920511CB6B5F33075D1CD968DB0C9465AD05B035CB1F660373431105A3465C36B6233BF35800239FF4945AFDCA814006119BF0201104FEEA1A00019DB52E504FD2B7D545444B2B009D85701002B0B2687B8C2B554CB304BEFD85D39F8CA7010707EA05515798829F42A4CBDDB4A95C5750879E0A584AB503F778015F83BEBF6D63C3B48A4F478EF01091403DDC5A9662E39707DBC8502ACF50F3E06ED0199CC647EA155FEEF503BE045BEA4035C07C4CCEDA306B8187185BD06C14220F2B7401229969C1CFF8C36D499D5A725FA1CE7B44D71E6C0E4E750766183883D838DAE4F00B140E0AFCCB0E72F935018A6314232DC632C5AD3C26919D1A7925BF0F665CA0223439518143486CE92650DD145FDB2E97E0D5BC9D6806F442FE90C9C1F52992E670DB2603AD885FA42B3D8BEA4E470B7F76A367AAA506E931890B6E4607F59E87A7A5FBF3991EEAEE47CFBBFE3CBE028E67BB645D37A7BE5E7CBA6D7955CD62D1D8DB0D9772EA0185C25BC1AD40A09D3E7E9CABA72BDC3A6EF3C40C7ED6208854157914A80B5C66A6DEC2317FB5A529421C03CCA6FC0A3B3D51556E8DEE7C1EBFBA924FE2EBCE8A46BE96E761AA6749C0A9A2B2FC49B42CA47663EA3395DF22DE20947DB14FC1FAD03805955D67F8473BAEFE2C1E22BDCC7BB988DB0DDE4E83E26A16F10B93BD9CFDBA77B9302EDBA0C9AFBA7369A023EF763C55484F7425F842111CAE27E07A511A725F25D422D933F2EC201BFFE3291411AC3CD6E91018C95074C18FC780A73945B148154987854CFA1CF1199BCD03519C8F34774453DF90B71FEA6734DEA7191EE2A5735F7A191F527642D53C844B087E9346B07EDD0B78C36F83445825E60A13C424F72530E05F75DA8D33957FAFF004DEB549985790956A0E7D9B256298D56BC6206F1E4E1E958FE298641A277A2C8B6B9B7660DBF689AD7E1A19CBD965CBEAA4A0D30741586290576996AE668ECBAB4F06F2A1D542E32C5D3F042E7E29A41BF86BAE29E7029D997876CFB23B10986A45CA029739B2446A29C55561AEE8FFB187961E6E7401D726AF6D8A5C816B2CEAA9A1C9B780DDCC4F0E4003542B193AE26EC687F8C51451D2D5387D9C3B9EB95981DF2DE069FE741CD5C15F6D1B12C5B9B94230ABA33BF46DCE8AC7E26896EDCB4F87272C32D19E72C313738855C02C6F46F1162BE0A3ED2E76704B16169689BF532EAD7AE7F2B26F4D9B22712662BEEA1F46748FA4C27D1D825D3FE493B5B3B513617C81D21A0912D329C5A4E3A90EF5A29A4E3137D1CE3EEE99C42D034E61593A4076EF124BD6BCF8FC911FC9F6077D82C2980C2ADB955939441BC9E81BDF9D6996CE578114C01F9BA096D6EA40F4E0FBB18B3E3D25E7F6D6CB670AD26F604368ACB6190667B7B7ED3C1A1DA04E42AE0087852834B91AA072AD51C0193E5299481221BC9083118F7B5503559F1E2D9E22A8D57932CD0B59509E7D7F459E20EBF4C1D0DF71472340E64992C0485D593714D6B469547616DFEAFC95089689931E79944204A6D0A47A565DC325F3BE19FD44BB6CD4BF2B1D4A78C883154D70705E121B833A4A7E7E80FCDCA03F52C1F831AB0D989AC5DBB5CD83BABCB3EE74B69681818DC05E33234775123F552CFC7C7BB0B98C937957A2C4E86E3D775468A7CB8D33756ED7489D04DBE52EAA2737EFBC4C4D0F55B5A841E1453763E611BAC358FAD0B5778C6015D97CC42CA9FECC66CF844DFE55587C200DA5250B3A419791F57D3A4F672551BE885DFE2AA8637D6C890EE8E1063E782FD7E2CB356BF47B6EB93A155D8D64C9F6CCA3971C5A7FACC3C052A2AA9FB286750F76933261AFF5CE408BDA8382AF8535145F432F78B3B25A768B5DA2A211D1D07AB557CABC7A139F66EDBB744AA76E0FBF22092E31C92CAFC624EE1DC6732F27E8E7632C6EEE2D1F5C85B52D712C884B36C91DA383F0DE9E06E5EF63D7B7A692E5E91BA1A1D9298E26694FAAD9EF262F117DF8115E2E877197A8069A96210CE65D45E6AA7011654ACFAFDA810CCCC20C1985D54483DAE12B29D7ECF66376968B52FBD727CBAE7C9E3DBFEE7391D985228ACA9EB8EF98FAE32BD24552A6B34BAA581DBB03676A3A4546E10EFCEF269B18E1172F560FA0F0344149543551E079C1745BC0425B5233B7D7DC32F751D321638EDB1CEE56DF0359EB6D9863CF3E341A56060C8EF8486014F956C39B751AE239A493A017B2FA5210D374BA83DF5D799B7CD92987FEBB0B2CDB3EE42A61381304C5EAE2ADD4777011C3279BBCD1EDD6F91FF72B3C353AC35DA8FA843DC5561D3CDB507730E8BEF20CF09B0DDC36D47F4C10D82652DC2937D889F83B1DDC30E52B244250D19EEA9CF7A3B5D931E2E25B64A0A81B2C4FE933A17BEAC2E10FD888D07F994E4F2583D204DA126533F5E36B62486A00CCC317C4381A8FE11D36C43E71BE108E22A98F53729F05A5E0AA38D512423DB4BC1D6BFAE9117383ACF94AE2A737F6B8070858BEAF08E365CA84925F8BEBAEEF5AF77EB73A9D3648AAA6493CEBDDB95149F0DAFACF129FC321E558084A44CCA4B429D664D90DD90F2A04818B48D135952746CECA76F99B947A33A3BF7C535B187C1971AF4FCB1EAC841BE7E96F429DD38127B52FACC2DD6512D8D019E0080CADBF7078FC67E9AF170A2A00F70F407B0A7FF469E2F6EA165F8B43EEF1779A115089DE9ABE6B78C93E4B8E3B018686D16CE8EBC88CBC1D571372A3996C9E5967C035F9DA6E200E7ECFD1CF7158563F36A3AAC3CD8ACF52A4EEE29DCEB03FA3272A671CFC9B - -count = 57 -seed = 4E94DD734A371A7C6AD4A567038CF93BAACE2B9D30F3862198DC55D2F21F8FDC9A7AE5DCA1541712179E3AB1FFA3F792 -mlen = 1914 -msg = F3EA695264936D537D86E545E132131442C2973D19B37F8C911E3ECEF4A13A8B1EDF5E5968A6198D26205FFE6B76CB14E353B5E2C9DE1BD44AB9BD55862BA1A479833335725EF52601810C778DA4A32C497CCFA43F91C72A1499E8D295AE7CDB43F1CA05F0D4A31B30D9A69CAB8288640F3F9E081E2C98CC8351C7EB9954D428DA4BB374B346A83EFF5AA3F455F2BB3FC922F901BBE5695E3AB9892A93BEEF90FC150B3BB47F6965C229F7DCC3100A4101840417A0E2547F9D42AB27216254A2898368BFC60E7D407271C213233B6913C8E48DF10967757BFAF5B5E2A284B8F67C70537C97583786B5185B45E2E36BD8B5443E98601F772829176C4D66F44A81AAE7C13F539490640BFC40B83E1C75305B06BE60E18A0AB568859435B715E15BA1EE4DE73E04E1B09DD15350AE423C131706F057255E9FA8FA3F9E3ADE7435A6451F7A2AAD0C0FE0F444C4A247DCBAA49E7C926DD52A33D3737B4439C1D40F861720E37BD25366EB5F34BF4B552160F3EB80CA8FB19304E1E4143090F8E965DAEFF17551A3931905B5CD991C6BC5AF5BE808073893A47FBFEEC0940EF5E7D2F2EE199847E1A4BEA447BEC40F86F6FDAEBECE6FF0F66E04193355C9576DD4AAB2D796CFEE5D432B1D32E13B8903A06FFD3AECB00C169A3AF8389848CEC724F647C6BA8DC3134CA18586DB3E4138601A16DF8873A490F23C4D27FD9C3D4FABF2BDCBA4AF3F0793E7B591198100EC97602D9BA572409EA49D7C8EDC646335FD4494577720EA7CDF3B4266FC201DE4BC204C0D35CFB55010BFAC68CA0DF3AC936C9FD2A9C532B8E3461D25362EFA37DA159B64670060CAB833ECA799FCF1342C7EE1B80BDE05ABAD08B9EE8908D50CD0D433DDA0B120D1980F690ACAD9C072502AB537EF71B691917A76D3098C27FDC6FAD1F1B29E307E17C87D9FA6A06CF8CEF6568D9E4E005FEEFCB5F41A46D91E31B41268367D636C4478921E690D5D57E99DA3448773D51B673109CFD3A58CC50C127F34F4963FCED6C216E60EA0952317FBFE88807BFF4223624F6126104CB46C8D39EE228BB4FC0002287E346E5ACE43E2CAEC07A22203FE3C4AA9008A94F7075F6E449FB89905BB955FA0023608C494F7B73D2AA4E2B0A8A7E3CAA889B6B6A6640F7222EF969D46FF6794BD97C5363921461BACDA17F2781E14419436E37610E52E3B7B7BF9C1A4B1D80876030F9A8981DAA4F06A432DBA739DB988BED5DE7F38378EC1F7D8A46B305896CA0CAA5D8AD74002863C6FF91EF25AE96450936509EFA93F94718E895A82B4616A965AF004038E0897A6563DBC91EB5A6172ADBA052250D06D210BCF5A250246FC3482E57FCD9901104C5AD58EEFFAC2860A4DA9D2C308552EFBDA2D4275F3F3651E9935A0E42869B9263FC7EA71079E604A4EC6DC61CEF6AC6CC06194DEF432C1F7CD9EDFB0C4B448DAE3C2A685BC818B2A90E17A4C1CAAA5FC2632F720E764E2B8DA314224498119A0D94CF5DCE24176421C2736575672B361119EC7C766265768CD9FF1957A17779C11244C1CC82D72D4E3C87107885F71C56DA2BC41008B0BC1375C12B3B2A80071EC03E377A93BFB227BD560EDD5E5D88F46F7FF9831F05BF262F01F62278D3DC13F4F0CECA0509091C25D20666D8D3527975CA3495F6843B46B5D5B6F5C650E981DEFB3943963E14F00A0F78CE785A21634C46B531B4F2AC5AD0F03D92372C334CE963E514A1891716EB5D5BB1B67834994EDA492719032E2A4F961DDD6D2002D8F52798C45A9DA8145BFD191E97D1FBA1B395858B0FC7D5F5A54E69FB3780635F70A763E44075075580778676E6B9705B40F40210E597B5AA1AA77BCC3BE5005159A4B68CBDC6AD8674495E0DF65A6DECABAFB993CC49C082D358DB1E5B3A8AF2FCB0049A15BF521986AD84148135CDB185FDDCA6802C2ADE9EA2E82047725D73F51E072CCD799D696D7530F61B16E9B4727C58CB0F552B188F9B451BE543BD809B63D66BCDBAEB7AA917BE6AEF05DF559B3AEAF65D5EA12E852D1370EFD6197F970F52292F27923A10D01AEB652A9A44573C137257B49D130F1DA48E532B3E33D4854B995534380B4549511B39A99145AF5ABE0CCD3A9DBAF673EFC115CB75A9A5A806679907BB525A2BD4507977329EB4C985B3575DE6533FC5D62358C21AF3DBDD20DEEFD7C417C77D37DC2A098A8FA48F7944B7EC6F929387BA11E3516C9EA681238650416FFB97EA343D5F227BADFDD509B94C1451C54F85E4539A8F70DBB5EFBB10B2D82A16FD0C997C603B8983CEB840A7C3B61918D8A97766BB8442C3B9EF2D324E28DC19748417D32F642874A8927688C74BF4F6F6724015C4DD50EB83B85F613FA20938F5C895F88830A40C9799C212B2DFB453BA0BC534F75CEDAF7A016F6744CB4F5269FBF0284EB90CF1023918078024C3B125CD9C7501224050B4D20B585472B42A0F494513ED131BCD8F75E223317F56B37CA48780750DE0BC81C74A3388C94D93A65719122E9D533274811B76965265D7B2F91EBE3C5924ED2D4DD5E327A6E7546AA2605E4C78D0208DB7A7F678CAADFB32E6BCF8C77FC7810F7D1D5D50E26D1A0DA03B8AFCF99904B2B3198670462451925381F0BC404C51F2F18FA7E2C1E8B0C6CF97A9A65E575373996C3E9DA15A18D15C93548377677DD713C9828DC4E4EE823A241377C65A2948BD29447BFBE -pk = 0BCF3C6B243A8F200A41BA2B24764AC252D4C2FA4E79767CDDC422A0D90FAC1997543C93F2B6914AAFF22CFC29FFA3D90FAB19CC1D91453F7B51BB3265B6E72A -sk = 0BCF3C6B243A8F200A41BA2B24764AC252D4C2FA4E79767CDDC422A0D90FAC1997543C93F2B6914AAFF22CFC29FFA3D90FAB19CC1D91453F7B51BB3265B6E72A020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C943315289206B33597C4C25AA82C0A812832BAA9E3BA4D9D39CE6FA7D275D549B4AA73BEF27E74DE2E325D3D25C03000000000000007A02A59A4B5DC3F8C0873311E58DFDF41524DF42146C396085126C46C5FA5F8584BEBDA7E376D2F4A783052DA481FBFFFFFFFFFFFFFFD67968015AA7DD417972F362C7399ABBE677E07D17159922E2C41152055BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6976AF12224EA8CB4EF0F5FDB3621C77D61B74A0DFAAACDA0501DB16A53A060000000000000000000000000000000000000000000000FCA60AB1787EA3D75176FF738CA06A45B09AC5B50FC1A7651B95F0E92943250AF0E34381DFB2B7133815EFDDE8C20B2F6861818331CE3CAB38FC2415D8D7EF1AE0924EEE39C803819080047750EAC4C82A75AC6A0726BA80311C7F5524CDE816A676E6D3037C8833149F7E71CF1966B1AFB0403F4CA2E07293E132506BE689297929CEEFB5CFEC9471C19BE75CA1B4AFFE745CEC3238686FEF45D2F6F8DC582C300E8580BBC441A5FD5D515FDC03180C3C269770F1EB882DA8073E0921B1602F5BF270B9568ACE7E936DFE48C03C2EB4B73A36DA21F477B6F7C74096CCB2463461CB8402722FAC932836D6F533C41D664CCA1534787AE0446A24B5801B790F30A41DB950234105545A7B8CCD9F7A1B3D5B1739DCCBCCEFE213EA3D12521DA62D8FE7DC18538A54823B8D4F7A76A0990301F1EA44B545E841CFEA0132B53A0E2712AD443E98D0B0C0728D60F78D316F214CB32EE9CAF88037DF90B994CB11F028EDC11DB0BBBD810031DEEB37B153D26D26209E35952FDA67668B14806FB8571D536532D71157C1A433CD5FE01AE10AC8BF2A42E4791230EC7E7C992168445A2AC66EEBDEC5774E02C3FE2AD7EBBC8B7D1BBA75394900D86936EC2117EFACEE2A -smlen = 2091 -sm = 10E1F328F6E3BFCAFB04966565577FEAFCB2FC033A202CF442C8F6DAE704DF61AF86051B073B1707596EAA4AC4463103AC0630D1C8133CD19E4F1704996E8C3A76E9839ECE0383AB397781BC3B3F020357B7D76CB56605EB1903038A8630BC6CF61FF0055C6655B5C1250993F6009D46B8D07587B8448D017AFD512212986A766104A3DE17C6820295969C0400EFAE7AFEF070EC1B1D02AF0CE826704A020364951AA04871CC361D05267CEACA9991F200F3EA695264936D537D86E545E132131442C2973D19B37F8C911E3ECEF4A13A8B1EDF5E5968A6198D26205FFE6B76CB14E353B5E2C9DE1BD44AB9BD55862BA1A479833335725EF52601810C778DA4A32C497CCFA43F91C72A1499E8D295AE7CDB43F1CA05F0D4A31B30D9A69CAB8288640F3F9E081E2C98CC8351C7EB9954D428DA4BB374B346A83EFF5AA3F455F2BB3FC922F901BBE5695E3AB9892A93BEEF90FC150B3BB47F6965C229F7DCC3100A4101840417A0E2547F9D42AB27216254A2898368BFC60E7D407271C213233B6913C8E48DF10967757BFAF5B5E2A284B8F67C70537C97583786B5185B45E2E36BD8B5443E98601F772829176C4D66F44A81AAE7C13F539490640BFC40B83E1C75305B06BE60E18A0AB568859435B715E15BA1EE4DE73E04E1B09DD15350AE423C131706F057255E9FA8FA3F9E3ADE7435A6451F7A2AAD0C0FE0F444C4A247DCBAA49E7C926DD52A33D3737B4439C1D40F861720E37BD25366EB5F34BF4B552160F3EB80CA8FB19304E1E4143090F8E965DAEFF17551A3931905B5CD991C6BC5AF5BE808073893A47FBFEEC0940EF5E7D2F2EE199847E1A4BEA447BEC40F86F6FDAEBECE6FF0F66E04193355C9576DD4AAB2D796CFEE5D432B1D32E13B8903A06FFD3AECB00C169A3AF8389848CEC724F647C6BA8DC3134CA18586DB3E4138601A16DF8873A490F23C4D27FD9C3D4FABF2BDCBA4AF3F0793E7B591198100EC97602D9BA572409EA49D7C8EDC646335FD4494577720EA7CDF3B4266FC201DE4BC204C0D35CFB55010BFAC68CA0DF3AC936C9FD2A9C532B8E3461D25362EFA37DA159B64670060CAB833ECA799FCF1342C7EE1B80BDE05ABAD08B9EE8908D50CD0D433DDA0B120D1980F690ACAD9C072502AB537EF71B691917A76D3098C27FDC6FAD1F1B29E307E17C87D9FA6A06CF8CEF6568D9E4E005FEEFCB5F41A46D91E31B41268367D636C4478921E690D5D57E99DA3448773D51B673109CFD3A58CC50C127F34F4963FCED6C216E60EA0952317FBFE88807BFF4223624F6126104CB46C8D39EE228BB4FC0002287E346E5ACE43E2CAEC07A22203FE3C4AA9008A94F7075F6E449FB89905BB955FA0023608C494F7B73D2AA4E2B0A8A7E3CAA889B6B6A6640F7222EF969D46FF6794BD97C5363921461BACDA17F2781E14419436E37610E52E3B7B7BF9C1A4B1D80876030F9A8981DAA4F06A432DBA739DB988BED5DE7F38378EC1F7D8A46B305896CA0CAA5D8AD74002863C6FF91EF25AE96450936509EFA93F94718E895A82B4616A965AF004038E0897A6563DBC91EB5A6172ADBA052250D06D210BCF5A250246FC3482E57FCD9901104C5AD58EEFFAC2860A4DA9D2C308552EFBDA2D4275F3F3651E9935A0E42869B9263FC7EA71079E604A4EC6DC61CEF6AC6CC06194DEF432C1F7CD9EDFB0C4B448DAE3C2A685BC818B2A90E17A4C1CAAA5FC2632F720E764E2B8DA314224498119A0D94CF5DCE24176421C2736575672B361119EC7C766265768CD9FF1957A17779C11244C1CC82D72D4E3C87107885F71C56DA2BC41008B0BC1375C12B3B2A80071EC03E377A93BFB227BD560EDD5E5D88F46F7FF9831F05BF262F01F62278D3DC13F4F0CECA0509091C25D20666D8D3527975CA3495F6843B46B5D5B6F5C650E981DEFB3943963E14F00A0F78CE785A21634C46B531B4F2AC5AD0F03D92372C334CE963E514A1891716EB5D5BB1B67834994EDA492719032E2A4F961DDD6D2002D8F52798C45A9DA8145BFD191E97D1FBA1B395858B0FC7D5F5A54E69FB3780635F70A763E44075075580778676E6B9705B40F40210E597B5AA1AA77BCC3BE5005159A4B68CBDC6AD8674495E0DF65A6DECABAFB993CC49C082D358DB1E5B3A8AF2FCB0049A15BF521986AD84148135CDB185FDDCA6802C2ADE9EA2E82047725D73F51E072CCD799D696D7530F61B16E9B4727C58CB0F552B188F9B451BE543BD809B63D66BCDBAEB7AA917BE6AEF05DF559B3AEAF65D5EA12E852D1370EFD6197F970F52292F27923A10D01AEB652A9A44573C137257B49D130F1DA48E532B3E33D4854B995534380B4549511B39A99145AF5ABE0CCD3A9DBAF673EFC115CB75A9A5A806679907BB525A2BD4507977329EB4C985B3575DE6533FC5D62358C21AF3DBDD20DEEFD7C417C77D37DC2A098A8FA48F7944B7EC6F929387BA11E3516C9EA681238650416FFB97EA343D5F227BADFDD509B94C1451C54F85E4539A8F70DBB5EFBB10B2D82A16FD0C997C603B8983CEB840A7C3B61918D8A97766BB8442C3B9EF2D324E28DC19748417D32F642874A8927688C74BF4F6F6724015C4DD50EB83B85F613FA20938F5C895F88830A40C9799C212B2DFB453BA0BC534F75CEDAF7A016F6744CB4F5269FBF0284EB90CF1023918078024C3B125CD9C7501224050B4D20B585472B42A0F494513ED131BCD8F75E223317F56B37CA48780750DE0BC81C74A3388C94D93A65719122E9D533274811B76965265D7B2F91EBE3C5924ED2D4DD5E327A6E7546AA2605E4C78D0208DB7A7F678CAADFB32E6BCF8C77FC7810F7D1D5D50E26D1A0DA03B8AFCF99904B2B3198670462451925381F0BC404C51F2F18FA7E2C1E8B0C6CF97A9A65E575373996C3E9DA15A18D15C93548377677DD713C9828DC4E4EE823A241377C65A2948BD29447BFBE - -count = 58 -seed = D9281003AC5F7673E0E9A7BC29C4ED75E6B0F228DF49D11A2599BFF2DA9E887163BB26DBA4F071FBCE02891540EC6F1C -mlen = 1947 -msg = 437E0F77BD0E14D704BE86135119F39A0A65650C762852E2694AD9BF2EA45C7EE59DF915F5AAC128309847E944127294566FFB193D0361DD7111D32B06DBA60A12E053F424DDD70674E902E409BC6F5891CB9A76108322CDEC1491D3D89A74CEDD855BB0791DD6DA371A75AE979593B5159FBE9DDACF88506E6A184547E2A7395A46FBAAAF286EB7780B789FED86F257E5036A3555E777B909243695CE89957DF492C80050457AFD84AAD9F8918099AB00FD7AD3528A3D0AFE5B52300053575B839572D4D7CE43C255BBF5F16948D40BCC2E63714487AFD3638601ADF47A324482ECC99FB88574538809227F8C0A5FA7F20A0B2FEFDA38E6A665550E44B8D5630290A4815621A5DD74A2108CA946241C48661EB087240788808BF676B145442B2DE4C35E1A6B8CB1E97E54CB729202D8827A0D4994C6D7F3F406ED273B00B6590006AF069D69173B5EA8237B87705F362288AC3A50BBE7E70EB15DF6ED820D66290F57A87E51B2C5777C9C95C2A76ECF2E296A7C295BFE029BBE681B32A6D9F16D11C7CA2750E2F8877AF5DDB616D8A820DE998B0B2AF5B0C2C5641F498C99971932327EC2C73C0EF4058D9F33683F60553AD2962370AFC6725743C86E591D7D7C20944479DACA5E92D66A33CA0C862DC60DFEB5EC3C6E7DE356F6E43F06B1431358285398F8885176D60CBA218217DC7AFE4AD876D0890648052A56812BC3F8A9E6C49F9D70B0A032924B891A9410BBE2F214C842BBF0511EF9017744A0DBDBD500A4189B471930E25216D2588CF8BA39AAE7623966CC62D6C4ECC8B00B0613D912E60ADF613C8F55B778EFB93A513A776C64E8DC943E6272C0EAB4004B4B05CE9BCE9CE2F2B86FD8429E9A72CB16EC3DED285339EDFCD122150F4E7310F669B1DD4CD7E76D282D10314E8ABF61D53BF343F3EBF9968E1BE8F3785581F675BFC28C893729CF67345D0F7C11D6E7D6DA0BFF255BF706C986704A3B9C6FA0602C6DC108A59CCA70F624B08E4F5393E597459BEA4AAAA463A3B08DE147E10DE6B75A0D87BB79BA9A71E7F5999C8972BA992228B60912AA2D7A32703BA8BC02F774430A2B590911D48D3866396F1D71F19CA90EBD5277743A984E2156CB57DE88EBE91BCC09CCB5C687CBCD4E48E4EE110F4075A21F9A051700B0C2698FCD6A5A73372CA366A230A9ABD153E4DCAB7A33A8226F8458C5892098BC0A95619880156548F300C40BDEF81E8C1D8BD03031C690B7C3C000CE99675ADB4B94752EA22BC9E0278D0A53A2A19363A9388BB8D6C24A45B5DEDD8F7482E9C29603FF182F25856FBEEE2B41B88B352F99DB5F33D8EAB1A1A1FEDE60EA6CFB7478DB7540D3A286E88117503C4D0A2C13D32AFE3F1A31D1AF9EE60EAB8FE06248CFFFC7BB438B77D94B5644805CC276F19268DD1FFEFBAB3C796923288638DA1C15E014723A84F8C2DD9F55F7ADC2ADC13FA7CDC29BAF48CA438C882DA5F7CAA792B7CD984BB11EC4B681B332EDFD4AB4C132B08BFB688F81BAA3FEC5A079E2182C282A3EBE2AD5E4C59090BBB989E6A07D85D604F5FFDE0587ADD29A5175CE65D29FB9FDE3E8B49EDA1D88EE8DD64FA1498D33EBAF4A847EE9FEDD3376AF46C1552A150014C11DDFC5047929E2415D3F9D81186A685A1CAF2F004DE777760F0567E880866320A7B42E61CC994719DDC81E28525E50195FFE4E0467D9A9182B75EF57DFEE926D7744485A55E07D1BCD1C9B9B12A60460BFF016E9834848665F132E2FF87805E00154C7D9853DBCA43D005BB197EEDA3D2D9249A621EFC4177415BB103893C82EEB0AEEA056B40E98B5FE65527432FF33CE3E09FE1288A6E2641011721279253800ABC4B73F65B15B434BD34A573E77A94729A78C92F0E791570A416A0876DB39A8FDA8696FB12E7FA3BB11E7838054E4195164B9676DD03327810CCFF9586217AA3D50E7D3EBDB1AE1BF6889DF316047CBB278CE8C9741798452A38E48A7138E1FBA286B497FDB8B1E7BF6145C5F29ECF6D5430F8E550314DB3CF48F27897F312C6D9D6357A880B721E5148DA7F789238CE411F952695F4A878756BDE311BB4E62F10C2F9939B8530EF70D3FB431655AECA2AD36BB5DF0582A07F53F1DF8E0325E635D5A5E795C130106502A081F2FC52A9D97C5DAAF174F13D2DE1EA0F8860F08F4FD5B571E1AB1E84437F3C82BF19B96E46513C316BDCF994BC26FB8461F90594E08E6D4A032C1DA38481A1AD7BFB7D5270255BFF23CE035535CF478216E6D2E62E147AD93357D62636B1AE42C4E8433BB94CA91D0F8EC265F2793514543AA86B786D9760BE5C77AAD5A8449A7DBE92391EAAFC305C1267A68E6ACF0F044FC144D82C917992748B9232DEC4E33EC97534F2BF60B56EDBFF675F0343C9C78E8A8D0529A78E2EED9F998B360360352009F01905C1A4815A36B111CAD8E5B34688B99216171D4F57283CD669DC05995BB8D94ECBD3E7B662C4A603BD85251F2BA35FB6CA492C2B3E996FE66A1EB904CCD61B0900E7DEDCF136F50E4C3AD5FC312A2DE4B3E51F355D01763692C0722C700A544E681A316A1D261FAD727E557398E500F15DF33883ABE9D1BA645936891F5A91FF6C8A7B9B6FE5062718542DF4FC4BA50D7F513945482381ADC42D5A9D444CA211232615306D7241FC49F08912BACBAFBB056C018AD4D6021D99FD720ED6548A5A29DAEFDCE868D71A1BA72D9F998A3F89FCFE526493582C4C8AF5C1BE065EA29F6155428DBC955B745DF -pk = 24D22F03612C543B96A5F21A7D5E3757105D213BC5EA45A13E9296451F4FBB0393C8E1D4E9567BF6FE807DC27E58CACB2FF43D0DC25FAE3E074E6836476D7322 -sk = 24D22F03612C543B96A5F21A7D5E3757105D213BC5EA45A13E9296451F4FBB0393C8E1D4E9567BF6FE807DC27E58CACB2FF43D0DC25FAE3E074E6836476D732202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057801B390B7FE1845951D31FB57F4CF7790209860793AA0E57F634D2EFB7FDE97D4773ACB5F5ED7186A0D2C93EDA01000000000000003C680993100D130712B4200EC1F51D8B1EF693AA3CE4A573AF4E6185001206A3E0B3BDDCBC0291FAB10A2B0DFC4AFBFFFFFFFFFFFFFF347E7E622FFB18EC8092C8C20A9ED28F271FC3CAB8F7CE70FE72240821D6F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF694B2EA7F46A96F9FE153C2CB880EF5AFB5ECE214A900252D460AB22C143070000000000000000000000000000000000000000000000B8FE2AF5DC336D6D835C5F28C18E64099F9B204B73DC42E02A8A208B2990330872D22682AD4E0B08BF1B44ADB930A8B86339F55F85300212F8926CB581E4770D452FC5A91258671C6EFA6C610F2A42A2939E328FB75F62BDE32DD258FE7C14233295A3B871C95A8563B69607F8AE9E6DA66A666102249DC85F18E0F6513D1D28DFD3191581FAE20E697A6A534F5F6C46B36C9342FEE3E6F2183E8B02EB32642420E2832A6848673257973458C37086A15A9DC401F2C3FE83A0D26E0430B5E2045B318649CA200DBD72CD515BF82877475A6AC0DC2BF398AB8D9980698A05080F80FF4481E3BFB4AD1264C8A683001075E062015F712394829BD07686900B522539F90D16FE0698C1898ABAD823EC082E40EF20DEDEEF0986844111519D3AF51CB6DF26548152169980B61F317FF83AB7ACDC5B847C9791E6BA207BE2B5D4C918A4C20CD34D8AB99DF02F771B6B6495184B104EB0D45BBB3E6EE64E5876F932088DC8A5086F5B897A5B70B8D18647A2CA6AFFA95772A5E4E0791BA9FA43EBB62714B5E9297F84FA2CDFA2C9A3E9FE419797F1812E1CB8CFB665AAFB6D4DE807179156771F5F64932C5D995597996886EB8A691F53C7D391E1E3931B2A533B4634 -smlen = 2124 -sm = 7047C61B24146F797E0746F84265FE53EF297C077B9BAA430325EDCCE806201EF72A9CEDEB18FC01ED284F91A4314948A503E20F3CB4E400DBC35A00313E6E69A77F60AF74055606D34B688BE712AB01921532B29BCFF64BED07DE219B3ADD77143BC300FB39944FC79D84FCA001990056789685783DDE0359B427C707B59D7DAD03F7BD9A77DC932EBDF201001768F705368A281027C43ABB5FC2826609031145FDDB94283FBD9F031CCB28422A9DC401437E0F77BD0E14D704BE86135119F39A0A65650C762852E2694AD9BF2EA45C7EE59DF915F5AAC128309847E944127294566FFB193D0361DD7111D32B06DBA60A12E053F424DDD70674E902E409BC6F5891CB9A76108322CDEC1491D3D89A74CEDD855BB0791DD6DA371A75AE979593B5159FBE9DDACF88506E6A184547E2A7395A46FBAAAF286EB7780B789FED86F257E5036A3555E777B909243695CE89957DF492C80050457AFD84AAD9F8918099AB00FD7AD3528A3D0AFE5B52300053575B839572D4D7CE43C255BBF5F16948D40BCC2E63714487AFD3638601ADF47A324482ECC99FB88574538809227F8C0A5FA7F20A0B2FEFDA38E6A665550E44B8D5630290A4815621A5DD74A2108CA946241C48661EB087240788808BF676B145442B2DE4C35E1A6B8CB1E97E54CB729202D8827A0D4994C6D7F3F406ED273B00B6590006AF069D69173B5EA8237B87705F362288AC3A50BBE7E70EB15DF6ED820D66290F57A87E51B2C5777C9C95C2A76ECF2E296A7C295BFE029BBE681B32A6D9F16D11C7CA2750E2F8877AF5DDB616D8A820DE998B0B2AF5B0C2C5641F498C99971932327EC2C73C0EF4058D9F33683F60553AD2962370AFC6725743C86E591D7D7C20944479DACA5E92D66A33CA0C862DC60DFEB5EC3C6E7DE356F6E43F06B1431358285398F8885176D60CBA218217DC7AFE4AD876D0890648052A56812BC3F8A9E6C49F9D70B0A032924B891A9410BBE2F214C842BBF0511EF9017744A0DBDBD500A4189B471930E25216D2588CF8BA39AAE7623966CC62D6C4ECC8B00B0613D912E60ADF613C8F55B778EFB93A513A776C64E8DC943E6272C0EAB4004B4B05CE9BCE9CE2F2B86FD8429E9A72CB16EC3DED285339EDFCD122150F4E7310F669B1DD4CD7E76D282D10314E8ABF61D53BF343F3EBF9968E1BE8F3785581F675BFC28C893729CF67345D0F7C11D6E7D6DA0BFF255BF706C986704A3B9C6FA0602C6DC108A59CCA70F624B08E4F5393E597459BEA4AAAA463A3B08DE147E10DE6B75A0D87BB79BA9A71E7F5999C8972BA992228B60912AA2D7A32703BA8BC02F774430A2B590911D48D3866396F1D71F19CA90EBD5277743A984E2156CB57DE88EBE91BCC09CCB5C687CBCD4E48E4EE110F4075A21F9A051700B0C2698FCD6A5A73372CA366A230A9ABD153E4DCAB7A33A8226F8458C5892098BC0A95619880156548F300C40BDEF81E8C1D8BD03031C690B7C3C000CE99675ADB4B94752EA22BC9E0278D0A53A2A19363A9388BB8D6C24A45B5DEDD8F7482E9C29603FF182F25856FBEEE2B41B88B352F99DB5F33D8EAB1A1A1FEDE60EA6CFB7478DB7540D3A286E88117503C4D0A2C13D32AFE3F1A31D1AF9EE60EAB8FE06248CFFFC7BB438B77D94B5644805CC276F19268DD1FFEFBAB3C796923288638DA1C15E014723A84F8C2DD9F55F7ADC2ADC13FA7CDC29BAF48CA438C882DA5F7CAA792B7CD984BB11EC4B681B332EDFD4AB4C132B08BFB688F81BAA3FEC5A079E2182C282A3EBE2AD5E4C59090BBB989E6A07D85D604F5FFDE0587ADD29A5175CE65D29FB9FDE3E8B49EDA1D88EE8DD64FA1498D33EBAF4A847EE9FEDD3376AF46C1552A150014C11DDFC5047929E2415D3F9D81186A685A1CAF2F004DE777760F0567E880866320A7B42E61CC994719DDC81E28525E50195FFE4E0467D9A9182B75EF57DFEE926D7744485A55E07D1BCD1C9B9B12A60460BFF016E9834848665F132E2FF87805E00154C7D9853DBCA43D005BB197EEDA3D2D9249A621EFC4177415BB103893C82EEB0AEEA056B40E98B5FE65527432FF33CE3E09FE1288A6E2641011721279253800ABC4B73F65B15B434BD34A573E77A94729A78C92F0E791570A416A0876DB39A8FDA8696FB12E7FA3BB11E7838054E4195164B9676DD03327810CCFF9586217AA3D50E7D3EBDB1AE1BF6889DF316047CBB278CE8C9741798452A38E48A7138E1FBA286B497FDB8B1E7BF6145C5F29ECF6D5430F8E550314DB3CF48F27897F312C6D9D6357A880B721E5148DA7F789238CE411F952695F4A878756BDE311BB4E62F10C2F9939B8530EF70D3FB431655AECA2AD36BB5DF0582A07F53F1DF8E0325E635D5A5E795C130106502A081F2FC52A9D97C5DAAF174F13D2DE1EA0F8860F08F4FD5B571E1AB1E84437F3C82BF19B96E46513C316BDCF994BC26FB8461F90594E08E6D4A032C1DA38481A1AD7BFB7D5270255BFF23CE035535CF478216E6D2E62E147AD93357D62636B1AE42C4E8433BB94CA91D0F8EC265F2793514543AA86B786D9760BE5C77AAD5A8449A7DBE92391EAAFC305C1267A68E6ACF0F044FC144D82C917992748B9232DEC4E33EC97534F2BF60B56EDBFF675F0343C9C78E8A8D0529A78E2EED9F998B360360352009F01905C1A4815A36B111CAD8E5B34688B99216171D4F57283CD669DC05995BB8D94ECBD3E7B662C4A603BD85251F2BA35FB6CA492C2B3E996FE66A1EB904CCD61B0900E7DEDCF136F50E4C3AD5FC312A2DE4B3E51F355D01763692C0722C700A544E681A316A1D261FAD727E557398E500F15DF33883ABE9D1BA645936891F5A91FF6C8A7B9B6FE5062718542DF4FC4BA50D7F513945482381ADC42D5A9D444CA211232615306D7241FC49F08912BACBAFBB056C018AD4D6021D99FD720ED6548A5A29DAEFDCE868D71A1BA72D9F998A3F89FCFE526493582C4C8AF5C1BE065EA29F6155428DBC955B745DF - -count = 59 -seed = 750A74866BE8DF4E60BC14BF36E6D83ABF6DCBB86792D125CF0980007C5435F40F87BA96498A88252D9C5C6710807652 -mlen = 1980 -msg = E4E3EDCD70C4BBED033F402CEEDC2C265DCA10B2DE0DB00D454C3AE1A0D00C97E1DC8C6804B1777ED21DDF5145B9F9348A931C128A8FB03827F653C37CD95859868DDE356ACE682F627FB69FCD97757BBE8BD5A260A293D2ACF0BFA2C0A3548FE25A2BA1A21F95123D592B40C20A927FDB615E69878E8D7C98D261DC01958A088599D3F9BB5E14002192FC7DE417B1074B3F7B52CD2A699091FD9DC3C5929E51CC0259D2255CAF0E444EC11257B759978BD4A7C8E2CE8473325B7498681102DE6FFE9764334D862E379D9F2EBF9B312FA75D7A50E08B94BD43EEF78722D423928FB8E26FDA85A345EEED0326A5D694E4729154A9997B269407B7D03818025EEB2BA96580626DFDB3BFBFCE100C508170D8150E4980D5D386761F4E8311339B47852ACC2A0A01DAD90D3978DE6536547D4F203CEFFAA652E4F2F28639BC3FF83C485C28EDC0BBE21D17B8ECAF3794D64C36FFE7F07E8A906CAB8E7FC9067CA4BF9B074C7FB01EF99A05D7C0F35D889A63AFE5FF18023BF77F8A3DA0C3CECEA0E538A6DAB5C54F3A0D83151595AD3EC4C45132EC2F22F652EA5DD930E692A7C0D7C23DE84314CAA7C017AD50D430FEF42DE557073DDBA6CAA4A787C92E6E28368943CAD0974EDAEB7ADDF991CCE20BF51C5A898CF0A2104ABB810BD4937D23E5D43490A3194B8A109B745E0A365EFA59199B43835682E996794F16C5CB874C88D9697B189AC54A1BA1F459623C1563CBA7689EBB32DC4FA0BF30E064D119D40C36301A653A4F959C97873003CFF7E8E030A137BAFE0A60AD08E4F692DC107E68AB40EDD0C384875B8525AA0A5EC3ACEAFE557EC76DB5283672F9751AFE1166D53542D216186A3DEF4DFA94E57BFFBEBD6F4AFEC3C0F3F40F651A1251A9AB39C262D42313E9F22879645589EA54FE894AC005115A43DD806B2C8BE6222DD9F02189D4221A9DDE99ECB8C3EF4171776268C12ADC37E4CA92EEF09D2D1803DB1FE917521662BA7EC0C07292C7E2130ECA4EEFFE53EE0CEAAAFF6F4CCFD42186611AFEE79BC651B1ADBAD08458592D69FBEEC708C7537925658BABBE7E9867915C6A728EAF41B0AF2EFFE55207C01652891C373F7A14409D05FE9E26C2E72D688047DE9A0954516B85ED6A3230B6B0EA9C5F086720C26EFBF8B7F5C5D14651D54C4EA181A707C562239CFC08B2E09A2941D04D587B90134D8F670F734578534138CD9CB7EC04437A768FE65FC5B3FBE818DB423A2208E485669082B422AB1257C2529CBF7BA4CB30FA27B7F702418C2EF9C3BF7CDE53661DF716449C6337C54542EADC5209A0E030AD6577DEEACC6BE1813DB24BEC035CEE6AEE93749D524222535A0277600F8E4F4BEB473093C5A00B6666CB319DFF131AE4F004EEB1BF71E5D274E3DFBFA246DADA9D6F548907091045FCCF79B363E695AD54C2F791861CE04874EE8C3375612DE820CEDE04E4472BC3DC19ABBB91C42A1C3D7B467837570E7D20A2CA6405DECCFF1AEC03E0558076E988619CB0CDA9CC87A12367BD486B676A4F71D40B88AB4E7FA750350DADD1A8F12B70864792D3CC1804BE8B7CB9DDA532182C32582015C1788B43054B7010229F46BD39000440E7F5D22E4D52EED85B204B344680426AEF51F0CE0551FEB9672DBF391A9AD363ED090837CAC1E721878E65AF9BA92A0EE7C7979925FBA9F4E452EB4FE3AF03B9EFF0526FF0A331AC0B8CD27A0C49E5019B7025C3C9870C900A7FB31FF834E04B87DB77C4D6DAE4C3FEE741E923704EE5F294D8F881833E9137158D1EE0FBFCB4637ACB814A2A5346607BBCD6BC916235F7875334F2B75A7EA7B8B8DDCDF46C0B8007C9B3A014EC6E634D4173CAFB1DD09CB9ED4A123151F4F2631D4BEE1520C10C15AFEB17198009C2B254C1FF0BECAFBF69BE8C7DBBFC7E8F3F1EF05FF6A7945FF79ED6C317609B9238670DEA26D56D481F87CA171CCFD726CC0728C965D9BC38D376D707E6979908B19FDF7E74ECD2D0671EC338FD54AD6CC5F789E96018521882588F888D7D715104D65954DBA8907C0B7CE3F2ACB802ED49DDF1416C29E8D685C5AD879464819E1D53FDAC741F71E31AC0C17B6C8932A4A00E7164CF8BBFEC36EBBD30392145B292D355FB304A88A638F991F6F89A398B09F1DE4F0B29866029BEE75A12D724A52736F2B9F49937F0E51B0F2E1BD2C1BC9325BBD1061E0F7685ACA02DA735D8FC39646E0B2453BB9690ED1C4853A757EA9DC2F4EB4B5ADBCFCBFB0CD2587F61A24B77CA0D6CFCFF47A98C7098B986D4FBD0E46EF0D1F9DF842F4473C43912AB49F4117C8214A42F3083936C7E8A38B294BA081296A393DCAADDCD0D340AC62511E47DA6591836553EEDB466DA6285359EE831A952E6C7AE3B943636124E43224D527B7D394511CF31C50EC1D3E7A20E49850905D504F1AAE477830E3BDA50430EBD47FDBB0BF537D8D479CB799B0429C3F6591328299A09F45CF9C6D30D5C1C9203B9521D807875D7FB2C2CFAA688414497122161B1B4F159B66C0834E111DA4F82D5252367FD2DBFDC079333FC51AB0D34ECEBBE786F984852A596BE620EC6CF84ED596425B90316A13B39E5EBFA19B319BF0FD1D6C812F29970FB1FFE948BC0D2E057B1DEA15445D71B5F728C72DD0C69E277C58F031F90932994AC5A177926DCC1C570AC1B4B099ED66ABF7DDE5A5D77D08EF1AD7C6FFE018F56EFB07C737F33038846247EEEE147E4A5995BDC3352B73F15FCE5140410AAE3F0AF1764E5AD996D01608C5E6C6C96A20274EA7781B41FC532B01B52134FEE28F501EFD9CF -pk = 9E9ED6D1E63D4C48AC767517C3FED8921C82117E0CDB4AD051E594A209EA4909BB0223472B411F73612D8125AC9949A1A749AD07104E867A30872D14FEB10F20 -sk = 9E9ED6D1E63D4C48AC767517C3FED8921C82117E0CDB4AD051E594A209EA4909BB0223472B411F73612D8125AC9949A1A749AD07104E867A30872D14FEB10F20020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D0026A5AA9BF3E51F3EC8717A0F79B427050B721D92CA371993CE19E420D41D0E3C8682F83369687D29EAE95941A010000000000000099010FD0710D2A2843B45678B2A5A515905E53E4006D0C25E9338788F0A95517C36352E40C0DCABD80D49E68AF6DFBFFFFFFFFFFFFFF99899119E7524F1182EF81D3346622D77B2E5F093AE9BA08E96B85A9E32BFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50E23B72B62BF90A15ED316D9B054271696E736B111E5C78B9BDB4C7271C0B0000000000000000000000000000000000000000000000F04EA13D79C69F6634BC458F1D98C3794DB75742DE6839586456541B11D4B831D1320899F125801DFC1EB3123BAA210272AADF5B8D1929FEBF5B90B518883B1DCDFAF41FB4E282B71BF713FDEB3E7E6041D0E8696A3C8CF8EB22053AD78F85152050F76113E2685CFB5BB501B00B4B36A197A8F7BD96743138C4552B6425D32766DE957DE66A8F191100FB9C93FC9F837248CC7E40BBD80BFE41D8DB56081829DDBC91F2F750481F202F68909170B06018680611CE9224ADB4577534E8C139070B8958D24D43E524210AA0F727C3B67B3C01ED9E04F9B7334E76810133141611BE90D77826163424F704BCF4736A4BD61F02D5760B148AFB3FE2EDA4EF450600D4E4E076D085394F0F5632E58DD1119DD684460D61DC23D8D6587216624BF530502AB05362EA58D9ACF4856F5C26FBE4F421C2DCE4D662E50268B4EFC5043C0AE5D28EC2AF4FC40C394CB4FA70971D6EFA3FAA149EF30CCB3C45AC7C29AA43159AEA3668A1D0676B14D4676AD277E0E4A10ACC11FE82C564EFA1DD831D65FE2915249DDF5F0FCB3009BE348285CA043DFCAC3CC24697F25E3475294B788EFE053E513C0E15C60CDF4B854946787DBF1757B5A4DB49A84365C577D4B5A9790524 -smlen = 2157 -sm = 74C7F29370CA1E646004B382D4D79EF823DA9A0487C7D7807068864A740535EF6BB3CCD46B3F9304C735612BE631AA574F00B6D963D4C37D5750F704A269DB6753C6B5871E01EE16E71ACEF9E5D65500C958BCCA4D391213FF01B3B5B99EE129D56D5C0783647452B5B98389F806855074DBEBDFADAC570509F2CC5BCB6C3573BE05FB53B89553A65CE53E06014F3F2AF1097DEBBE477A276F59650D2A0201F49AFA7346818F8E7E031A3F49CB2CA10102E4E3EDCD70C4BBED033F402CEEDC2C265DCA10B2DE0DB00D454C3AE1A0D00C97E1DC8C6804B1777ED21DDF5145B9F9348A931C128A8FB03827F653C37CD95859868DDE356ACE682F627FB69FCD97757BBE8BD5A260A293D2ACF0BFA2C0A3548FE25A2BA1A21F95123D592B40C20A927FDB615E69878E8D7C98D261DC01958A088599D3F9BB5E14002192FC7DE417B1074B3F7B52CD2A699091FD9DC3C5929E51CC0259D2255CAF0E444EC11257B759978BD4A7C8E2CE8473325B7498681102DE6FFE9764334D862E379D9F2EBF9B312FA75D7A50E08B94BD43EEF78722D423928FB8E26FDA85A345EEED0326A5D694E4729154A9997B269407B7D03818025EEB2BA96580626DFDB3BFBFCE100C508170D8150E4980D5D386761F4E8311339B47852ACC2A0A01DAD90D3978DE6536547D4F203CEFFAA652E4F2F28639BC3FF83C485C28EDC0BBE21D17B8ECAF3794D64C36FFE7F07E8A906CAB8E7FC9067CA4BF9B074C7FB01EF99A05D7C0F35D889A63AFE5FF18023BF77F8A3DA0C3CECEA0E538A6DAB5C54F3A0D83151595AD3EC4C45132EC2F22F652EA5DD930E692A7C0D7C23DE84314CAA7C017AD50D430FEF42DE557073DDBA6CAA4A787C92E6E28368943CAD0974EDAEB7ADDF991CCE20BF51C5A898CF0A2104ABB810BD4937D23E5D43490A3194B8A109B745E0A365EFA59199B43835682E996794F16C5CB874C88D9697B189AC54A1BA1F459623C1563CBA7689EBB32DC4FA0BF30E064D119D40C36301A653A4F959C97873003CFF7E8E030A137BAFE0A60AD08E4F692DC107E68AB40EDD0C384875B8525AA0A5EC3ACEAFE557EC76DB5283672F9751AFE1166D53542D216186A3DEF4DFA94E57BFFBEBD6F4AFEC3C0F3F40F651A1251A9AB39C262D42313E9F22879645589EA54FE894AC005115A43DD806B2C8BE6222DD9F02189D4221A9DDE99ECB8C3EF4171776268C12ADC37E4CA92EEF09D2D1803DB1FE917521662BA7EC0C07292C7E2130ECA4EEFFE53EE0CEAAAFF6F4CCFD42186611AFEE79BC651B1ADBAD08458592D69FBEEC708C7537925658BABBE7E9867915C6A728EAF41B0AF2EFFE55207C01652891C373F7A14409D05FE9E26C2E72D688047DE9A0954516B85ED6A3230B6B0EA9C5F086720C26EFBF8B7F5C5D14651D54C4EA181A707C562239CFC08B2E09A2941D04D587B90134D8F670F734578534138CD9CB7EC04437A768FE65FC5B3FBE818DB423A2208E485669082B422AB1257C2529CBF7BA4CB30FA27B7F702418C2EF9C3BF7CDE53661DF716449C6337C54542EADC5209A0E030AD6577DEEACC6BE1813DB24BEC035CEE6AEE93749D524222535A0277600F8E4F4BEB473093C5A00B6666CB319DFF131AE4F004EEB1BF71E5D274E3DFBFA246DADA9D6F548907091045FCCF79B363E695AD54C2F791861CE04874EE8C3375612DE820CEDE04E4472BC3DC19ABBB91C42A1C3D7B467837570E7D20A2CA6405DECCFF1AEC03E0558076E988619CB0CDA9CC87A12367BD486B676A4F71D40B88AB4E7FA750350DADD1A8F12B70864792D3CC1804BE8B7CB9DDA532182C32582015C1788B43054B7010229F46BD39000440E7F5D22E4D52EED85B204B344680426AEF51F0CE0551FEB9672DBF391A9AD363ED090837CAC1E721878E65AF9BA92A0EE7C7979925FBA9F4E452EB4FE3AF03B9EFF0526FF0A331AC0B8CD27A0C49E5019B7025C3C9870C900A7FB31FF834E04B87DB77C4D6DAE4C3FEE741E923704EE5F294D8F881833E9137158D1EE0FBFCB4637ACB814A2A5346607BBCD6BC916235F7875334F2B75A7EA7B8B8DDCDF46C0B8007C9B3A014EC6E634D4173CAFB1DD09CB9ED4A123151F4F2631D4BEE1520C10C15AFEB17198009C2B254C1FF0BECAFBF69BE8C7DBBFC7E8F3F1EF05FF6A7945FF79ED6C317609B9238670DEA26D56D481F87CA171CCFD726CC0728C965D9BC38D376D707E6979908B19FDF7E74ECD2D0671EC338FD54AD6CC5F789E96018521882588F888D7D715104D65954DBA8907C0B7CE3F2ACB802ED49DDF1416C29E8D685C5AD879464819E1D53FDAC741F71E31AC0C17B6C8932A4A00E7164CF8BBFEC36EBBD30392145B292D355FB304A88A638F991F6F89A398B09F1DE4F0B29866029BEE75A12D724A52736F2B9F49937F0E51B0F2E1BD2C1BC9325BBD1061E0F7685ACA02DA735D8FC39646E0B2453BB9690ED1C4853A757EA9DC2F4EB4B5ADBCFCBFB0CD2587F61A24B77CA0D6CFCFF47A98C7098B986D4FBD0E46EF0D1F9DF842F4473C43912AB49F4117C8214A42F3083936C7E8A38B294BA081296A393DCAADDCD0D340AC62511E47DA6591836553EEDB466DA6285359EE831A952E6C7AE3B943636124E43224D527B7D394511CF31C50EC1D3E7A20E49850905D504F1AAE477830E3BDA50430EBD47FDBB0BF537D8D479CB799B0429C3F6591328299A09F45CF9C6D30D5C1C9203B9521D807875D7FB2C2CFAA688414497122161B1B4F159B66C0834E111DA4F82D5252367FD2DBFDC079333FC51AB0D34ECEBBE786F984852A596BE620EC6CF84ED596425B90316A13B39E5EBFA19B319BF0FD1D6C812F29970FB1FFE948BC0D2E057B1DEA15445D71B5F728C72DD0C69E277C58F031F90932994AC5A177926DCC1C570AC1B4B099ED66ABF7DDE5A5D77D08EF1AD7C6FFE018F56EFB07C737F33038846247EEEE147E4A5995BDC3352B73F15FCE5140410AAE3F0AF1764E5AD996D01608C5E6C6C96A20274EA7781B41FC532B01B52134FEE28F501EFD9CF - -count = 60 -seed = A832D4AAE8076C4EFE8319A74CE315928AB765BB629075254CBC63EAAE691C220F4B5E1839E9A99D8747AACD7C2F1EE3 -mlen = 2013 -msg = 84C603D1B5549C46964FF2987A1F533B4CED94E67D576A3B0BF1C8BD87A74AC7DB640FC9F7ADE44FF79B820846EB83367153F5DDDDF9DFB7848A13D59436916EFABB82DD61291447491D2CA04166FA8680E8E0E0DC98E79344534CA1CBDDB531797A61C291606200107002091ADFA927A763CF98CBBD631CFE890B0ED257AFD34AC0C5280AA7C70BD0C945D78E6FDA284CBB7B3AB636BDF17342F2BA28D707147F14D15173D9BC0B6D65FD1663C86971BE1FA59DA8325E1F3773BACC5B8D4158EF525FDE6E96631C51AD142250252A8E5786CD621210DF3E24CC0B4B60AC2F013D76DB0C73DF40EFAA05A65383A8892276B3D69DD511937D55D914C3222A2386D1BEC0A268E683716AF4AB709D2D225B86229095E87FE70D69E6A34BB214529CA3F082C0F2709E77B86B00B4A04BCCD343C862333B7C9163857B77E30551710CCC3A803323F5CD4EB5317CD2E6A24BFB77727E1C64D0AC47BEEA1CB35E5F2FF6024C06F2F391FEE76F2E69537673FC0124E48E4E2242E84D8AFFEE6803CE6EDF3A954D2C54562B8B76A4EDD91E24A8640AFE67255605849053B60F558B43DDB9F8A04E987D15F6292962D10AD8F7B47188D12D1C9090C0FE8710DC3937C6939496884BDE0BEA979839837C61BE4DF5662C724610C7FCB4631A0A2083417BE6A20F4EED094E2145BC72A83A6E147A655C481DCC906E63ADC0244D95B6085FC096FBCCE81EEB0497F48BB5EF827C0893E331795E3B301DC9F3A91DBA9FBC838E044E2AD9859F1DC67E9BCC375442B4EB59714B5EBBA87AC9A79C99CE74F8BC75740DDCCE46C4B408B91DD7D4AD26B0FB1A4AB874F5504C40E7363838D22AEC45C10D3CC2E233124A5CD8344249EDF388E37BA43598F2C2CF56D444BCEE04A335B154DFA3CA694DB481CBAA59514098CE6E0E4138C0A543EFAFEDA4AECC022C824259A06C3D57A70EA15A5DFC822449A27F58F9EF842DCBB636CE293684E1B331CD821594A12634E5594410B6C5E2306DC8BBE62C8B0F49F2F699A59EFB14D3CAD399F74ED893E1EB43FD770FD61E0C58E5D8CBC9435F4AD0892681A30DF4885927130432186AD4BE41F6FB7CFE660E23C5E55F60789B3E97C3B622599938B36BD1C0BCF6FDB7E4EE44C92B6A86CA2470BCDB8BAB8DF6079382CA314BF3A8B3C4286518C356018FD6F6FCDD9BE9AD9C228F29135544E723A898F483E9D9EE843E75ACB3FEAC447973D12461FEE3D984F3B4F31645FAEA56852D356C96CD73A6F185E8CD56731E83FEA145A2BF0C15ADC634DD9E2FFC799B59A0712EB4D2618680C7493F50A9BBF3F7BDE1025CD44AFDAF4A8C42C9254B1B34AA8559E1CEE9BDE7B4DA0FB3CB2289418110620E505B793B91F422FCF53ADDA8F7C96D55E26244E075D9A70004642712EAC377CE18F88F2C8581694B8F621707DAB6D292179B2A95AEC5AD6E409D78253DCC05ECCDB45683DFFFB9C629AFCFB0654725D650E4A283FD98E47F37AA9309E2933CC0393625DD81D4A02F9D5082644DE02B6472D5D3AAE110747E4F756973FDFCE8EA5F997E30B11EBD50B45F6889D227D87D9184CBC6ED40E96DEF8B9236763C9999E21BFC1A74457FFE5E0DC2B16876FE04C2E0F0F47012A767A7AC18D71A7FD65F8647A7E1AE2D4D255492A18AA81D17D390E381B1722BC3C38BCCEA9D5E73231D0C6E1A96CCB47079E36C994E94AF9A318D67B6408BB602A91D8E9EC6499DEED0B51A9AE31D9774A1BEF4C1DE0E7A324545B2AF9870CD733C2195C5ECDE386D298C33D492937497EA5F0E05C377A4D755DEA9D96C61FE82CF6299EB34B857217A2C6733FED64F5DAC5F95A0EF2294ECA844B96CEB5163363A31C58C88428152663AB0A2B310B1A9E9027CA8CC0DB6DFF528F9A421FA826A86ACB4FD1D79C1AE6123C9E685BA66F5FF109FDFF2497B1A50C2E4E7B4662FA11FBAA305A960CA70FF98E5290A8C3A27B4A3CF1705C6DF4290FA64F3259FDEDE7A81CFDE4214230DFB9EFB20049E905833B5D48923C8CE2F8A104946FB3356154519D950998677C56C8B2C80471A6117B142E26C0345CDF0634E356D80C3BE12F4AB89EB41DDDCF98188EAD2FF420EED3FD9287322F24C62B21F430D5F9B8592CE1CDC946616111C91C667006E47992FE2D5A2AAD82F8DD1AF3C1B8BA5326220645885CC94E8B2B76CBFF7E161E994C0CB9E489B8A5662E9D420913AF34433F5BAB10AC72C5EEB9249F3C102E1762E862C13CC882D20BE16834E54DCC323EA89A133F451B70087A8DCDC5B518EEF087A571B570A7966F1C49BFCDC70AC05034D1DCC56EDC2C0F57D1AAF16718C67D162BA330AA61A2875F90E2935752BFF1EC28A79EAD1AC18E70A833946CA6A15D8765E1A62AEF46BED232EAE89DBEC278297B396CF611448C5FD4B36B95CDC54E3394C63B9B0969D6488FF1C700B390E7226F99A945306C6504958CD43CD3D63910A4324BB662A0E5DB1622D90CE00E50CE7112193872AAB5CEE0B8D6FD42F26C2FB87FDF99062169C0BE75C85109D4E209DC8A640FED3EC71EF3DE8878B3D1729FF118F50F8A33361C6F707F6011454C5D744989EC1BEB644FCF99CB2E7C3CD20E6F1656E07C3566C4DE68593BCBA0EE9F7BD2E272C3D47A3E03985456F18CAFBEBBC1DE74964BECABDF3E9BBB9A10B29BF3B458FD50F19D63A6231CB51CDE3DF46E4BB6318E81E10AD1674A053C8CFE1E72853FD60E6E642642CB825644D6734AFB00329839F22CED734FA1421C4334E20F2ECC8BBC2652004203B3B639FBDCF5FDA1423F08C3A1100655E4763B8D8356A151D702124D30FDD87B34EC4D34BBB3639464E44A693690E193329 -pk = DB1E47FD52D8B35DECB94A108397D842FA1E45A5ECD18906D9E39F4CE60EAF046AC58C82B08DA3D4BEAAC0797C2746284ED3EC2EC56F7108A9C9E093DAB6DF20 -sk = DB1E47FD52D8B35DECB94A108397D842FA1E45A5ECD18906D9E39F4CE60EAF046AC58C82B08DA3D4BEAAC0797C2746284ED3EC2EC56F7108A9C9E093DAB6DF20020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D1F0E4863946418E7B5B2E37C1B9CED094200D3261B5B6EFD89BC487145DD53B1E55269813BAEC67E0ED4C4CAA0A0100000000000000B0560A88A920A09A009A67C335344925114D0A26EFEAA50D9D5ACFBAFEDD75BABA51F53CE4E0CB6B7660467F1C45FFFFFFFFFFFFFFFF9C567AD674D225ED944D98A8C4CDCA0FD48565BF7949B229534493245C78F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7D07894E83F5B60F95DAF92CCB21A76589F67123A190559758CF039951C0400000000000000000000000000000000000000000000005ABCE65C10AA2520F608739352DFC3E714A191EA1249F1F8EFB1407EC90E411FA4C633F7F926D7028D0215798AEA6C9298DC5697426E6EDCD9446276D50C0B28FB773F0F0C2BF8002629895A22D1825FA746E1F5896305EDBE564533EA96942C800069FF879D74A4C8AFE302198E2E46DCC04340750B7ED32A9D82752278341AF7611A326BBEC8482A49C6529462F1C152F6969ECB5F1754C125B7A890B8C32721EF6133917BDB04D08B7E2E6C9F7ACBD9D03100056D50713CE793B2746362250B14E4A707421BC6634185DCF4DECB92CFC38FF073515AA87C3CD9AF9B2E8D277D61A1DDAF0D2525EDEA666563F8DBA1FF1CA8ADE37DDC64EF9A3B776FEA7A099B6A142EE8C2467C2AC910F1EB5312D10E864D2E96EDB22331B8BE2F6726521EF66A5B6E5E653C43D61E05E3C69B8DB37B4AD701A7A2F8ABFE7860A63FF2692EB4F425978C20D9E2D8EEA3481D293BCEE6B675EC4CA05424B60D2B8DDF8B022D789C9E62316C451F369D34D388D3D920FCC02ED341D63D469C739E44CB53F819A81A19A4E610535C39196DE9EE213AB87DF2E78E131FC238F11DBCBB4A97772905DB0C16FF8E44B26D8B1988A1646A90C41AEBD0D9C9679D0BD3CC8433C9192D -smlen = 2190 -sm = 845D34D59DAD230594018A55EC61AD0A328DA202FA2D62001EA05C1A180653D6C8E5A5647F5617037434CA270EF5058AE1004135405D3B76B1052B02C1F3E4D647F73DB5B603987314B650F034A3D500EA4E4E1A298AEB9F9501052FBBA9B74B15A8D906B086C551F9A5463B1A05D760D3D6E1B6CDBD7C045DE58CA7F4D672243407F359024797A6FB775C0101A30EB49F96838498FE9C1A46CD6DBEB704033515950C2473C9C5E80453D195E79A78850084C603D1B5549C46964FF2987A1F533B4CED94E67D576A3B0BF1C8BD87A74AC7DB640FC9F7ADE44FF79B820846EB83367153F5DDDDF9DFB7848A13D59436916EFABB82DD61291447491D2CA04166FA8680E8E0E0DC98E79344534CA1CBDDB531797A61C291606200107002091ADFA927A763CF98CBBD631CFE890B0ED257AFD34AC0C5280AA7C70BD0C945D78E6FDA284CBB7B3AB636BDF17342F2BA28D707147F14D15173D9BC0B6D65FD1663C86971BE1FA59DA8325E1F3773BACC5B8D4158EF525FDE6E96631C51AD142250252A8E5786CD621210DF3E24CC0B4B60AC2F013D76DB0C73DF40EFAA05A65383A8892276B3D69DD511937D55D914C3222A2386D1BEC0A268E683716AF4AB709D2D225B86229095E87FE70D69E6A34BB214529CA3F082C0F2709E77B86B00B4A04BCCD343C862333B7C9163857B77E30551710CCC3A803323F5CD4EB5317CD2E6A24BFB77727E1C64D0AC47BEEA1CB35E5F2FF6024C06F2F391FEE76F2E69537673FC0124E48E4E2242E84D8AFFEE6803CE6EDF3A954D2C54562B8B76A4EDD91E24A8640AFE67255605849053B60F558B43DDB9F8A04E987D15F6292962D10AD8F7B47188D12D1C9090C0FE8710DC3937C6939496884BDE0BEA979839837C61BE4DF5662C724610C7FCB4631A0A2083417BE6A20F4EED094E2145BC72A83A6E147A655C481DCC906E63ADC0244D95B6085FC096FBCCE81EEB0497F48BB5EF827C0893E331795E3B301DC9F3A91DBA9FBC838E044E2AD9859F1DC67E9BCC375442B4EB59714B5EBBA87AC9A79C99CE74F8BC75740DDCCE46C4B408B91DD7D4AD26B0FB1A4AB874F5504C40E7363838D22AEC45C10D3CC2E233124A5CD8344249EDF388E37BA43598F2C2CF56D444BCEE04A335B154DFA3CA694DB481CBAA59514098CE6E0E4138C0A543EFAFEDA4AECC022C824259A06C3D57A70EA15A5DFC822449A27F58F9EF842DCBB636CE293684E1B331CD821594A12634E5594410B6C5E2306DC8BBE62C8B0F49F2F699A59EFB14D3CAD399F74ED893E1EB43FD770FD61E0C58E5D8CBC9435F4AD0892681A30DF4885927130432186AD4BE41F6FB7CFE660E23C5E55F60789B3E97C3B622599938B36BD1C0BCF6FDB7E4EE44C92B6A86CA2470BCDB8BAB8DF6079382CA314BF3A8B3C4286518C356018FD6F6FCDD9BE9AD9C228F29135544E723A898F483E9D9EE843E75ACB3FEAC447973D12461FEE3D984F3B4F31645FAEA56852D356C96CD73A6F185E8CD56731E83FEA145A2BF0C15ADC634DD9E2FFC799B59A0712EB4D2618680C7493F50A9BBF3F7BDE1025CD44AFDAF4A8C42C9254B1B34AA8559E1CEE9BDE7B4DA0FB3CB2289418110620E505B793B91F422FCF53ADDA8F7C96D55E26244E075D9A70004642712EAC377CE18F88F2C8581694B8F621707DAB6D292179B2A95AEC5AD6E409D78253DCC05ECCDB45683DFFFB9C629AFCFB0654725D650E4A283FD98E47F37AA9309E2933CC0393625DD81D4A02F9D5082644DE02B6472D5D3AAE110747E4F756973FDFCE8EA5F997E30B11EBD50B45F6889D227D87D9184CBC6ED40E96DEF8B9236763C9999E21BFC1A74457FFE5E0DC2B16876FE04C2E0F0F47012A767A7AC18D71A7FD65F8647A7E1AE2D4D255492A18AA81D17D390E381B1722BC3C38BCCEA9D5E73231D0C6E1A96CCB47079E36C994E94AF9A318D67B6408BB602A91D8E9EC6499DEED0B51A9AE31D9774A1BEF4C1DE0E7A324545B2AF9870CD733C2195C5ECDE386D298C33D492937497EA5F0E05C377A4D755DEA9D96C61FE82CF6299EB34B857217A2C6733FED64F5DAC5F95A0EF2294ECA844B96CEB5163363A31C58C88428152663AB0A2B310B1A9E9027CA8CC0DB6DFF528F9A421FA826A86ACB4FD1D79C1AE6123C9E685BA66F5FF109FDFF2497B1A50C2E4E7B4662FA11FBAA305A960CA70FF98E5290A8C3A27B4A3CF1705C6DF4290FA64F3259FDEDE7A81CFDE4214230DFB9EFB20049E905833B5D48923C8CE2F8A104946FB3356154519D950998677C56C8B2C80471A6117B142E26C0345CDF0634E356D80C3BE12F4AB89EB41DDDCF98188EAD2FF420EED3FD9287322F24C62B21F430D5F9B8592CE1CDC946616111C91C667006E47992FE2D5A2AAD82F8DD1AF3C1B8BA5326220645885CC94E8B2B76CBFF7E161E994C0CB9E489B8A5662E9D420913AF34433F5BAB10AC72C5EEB9249F3C102E1762E862C13CC882D20BE16834E54DCC323EA89A133F451B70087A8DCDC5B518EEF087A571B570A7966F1C49BFCDC70AC05034D1DCC56EDC2C0F57D1AAF16718C67D162BA330AA61A2875F90E2935752BFF1EC28A79EAD1AC18E70A833946CA6A15D8765E1A62AEF46BED232EAE89DBEC278297B396CF611448C5FD4B36B95CDC54E3394C63B9B0969D6488FF1C700B390E7226F99A945306C6504958CD43CD3D63910A4324BB662A0E5DB1622D90CE00E50CE7112193872AAB5CEE0B8D6FD42F26C2FB87FDF99062169C0BE75C85109D4E209DC8A640FED3EC71EF3DE8878B3D1729FF118F50F8A33361C6F707F6011454C5D744989EC1BEB644FCF99CB2E7C3CD20E6F1656E07C3566C4DE68593BCBA0EE9F7BD2E272C3D47A3E03985456F18CAFBEBBC1DE74964BECABDF3E9BBB9A10B29BF3B458FD50F19D63A6231CB51CDE3DF46E4BB6318E81E10AD1674A053C8CFE1E72853FD60E6E642642CB825644D6734AFB00329839F22CED734FA1421C4334E20F2ECC8BBC2652004203B3B639FBDCF5FDA1423F08C3A1100655E4763B8D8356A151D702124D30FDD87B34EC4D34BBB3639464E44A693690E193329 - -count = 61 -seed = 09B8441F47235EFC82D71933A0037FA4F69124C3BAD4EF6A3A7178B417A3FDA874081B7EEFD7EF1BF234C752458FBBAD -mlen = 2046 -msg = 92D5FEEF68737ECE61C6E0078D77FBAE97B0B9235F40B97099C114B1586E107B5ED1308A8A2D20BE41AF129DA2E0B38EAF02FAEF733C7A1D1A387BC55EF008530ABC22697D0465AA3EB71F41EE72ADD236CEA9A25995F3689C5A451E2F03915D96ABEA10D356D549D68048977587326523CCD71C05FD57BFB3C7A853F535BEDDEADFB84118F6548860F6BA536277DDD7AB42123E93381A385FA3E6CC023C1458A9F94822D93248F36C48FDDC972B5D6494B26658440FFBC23B57363F3D82CCE69FEE4747A889E85343288D55D30FC54D2D0744744DBA9977720E8EDD2C0ACA1FC51B0C6A3C68BB9BB8DA0385DB1CA4E9CE660CF7EB2382E5E95D2AE19DEF904A8651DFAE53A4D0DC4D057AB1A506C3BD7E1D1EA3FC4623E7D7B410DCB312F037B7A5FDE5E0E604FC33270FAF1FFB6ECB3125DDFA5C49F25BBC98238C8AB1B903537CD67238995E81B814280A4CED61513D69A2178086D505F8DD1DF7E11CE66AE33D4C982F94231957031A258E0EC745672A57A5CE76D1170111B8882A9EB5388094EBBD53EE9EA1FCE4A275F9D7060C8DA79018487B452817280C63B01B05EFBF897387592E2BB3BB486FAE0AB09F46D9F2E176DE96C59992C10A14EC16EAC36102B1D15541607075E67C842A888C87B268E9809148A323C423220DC31566B62F45CCE1E2BC1B3BF43B87C998F00023890BCE517271BEC16EFAA33F11611FDE87F197852BC2E7A2B44F8C72A6F79B22F73BE0611B81EFE09253931545D2453939C46B6797CC5DC5A8F1AA3BD8456EEEB84EE76DBF2EBF32598750ED10670DF422C7D7993ACC55F657E6E1B3DFA1BD6C1CD55FAE97E69D2F8F5AF368F7DA0A63B4065EB6D8F02B19A34600252FDFFDF4ED8DE2EA9CD2E74D63A6CEF29BF02F92D346ECB9A61081EE5AC811F33AA5792F6A1AF570A8B0846F3E6EF38452346DD637B19ECA37BD1A6C42B20A5BEDE9A5DE3C9F169D04D8C6CF5376D3404F0C21DEAD53DA6C169F390EED7B5B54DBE47CCE0B2AD1179EA8FC80FDDC7281BD4FE31B9A26A00444AF0B4D40A1B72BE37501308906149DC6FC5CF02B6F60AFF82B975FC8F146961EBCCB4D126ADD524A9B33BB16F6A83C6F3727A72EFA2BAC116E493E07B2CA718A63FCAC8E9D52A1B61479B4EE52A5ED30FABCEA4D01A792A92676721286814F3B0F4E15E23CE0C5D59A0C3EB8573C0A2F66C25F2EB2FCFF787324721004979BE5EAC505DFD39F5538E2C1B2CC12D20C1C5CD87299766361AEDDBFFF743693081842378744879E6E6371B3FFA9DDF34966FBF8DEE91B7EDF6EEC3E4E2F410CB5351F847646C22AB594046DED63347D04A008FBF6EE9696C638ECE73B39A269DB239DF36443868AD44D26A5C40FC92DFFB008E436E5C18907F5B18B5E6C5900B41A9801DB070D2DB651187A4DA7E2647ED3E9B6E9781627EB576BEE8334374468760DD3B32985D42945D953D434BFD80D7F7BA537265FFCF27DB0DA1ABDAE89BBE94D98BC9CA197E41C0839728F964FE4CE30B8CC43CBDCDD9CCBE06FE99DEBC6F4024F3F00D43FEBCD62A1822A6D507337EE79D4517AA486870602D4F1C5368B0EAA1FF6C011A9A953AAE58C75BBD3DC78D263A578C75CDB1AB324D71B9A065A9AF3DAB854189585C68D499AE8DB887745E20AD9738705B9D2F5D429F12D6462E5E2EF9FFBA53CE2F4E75449D2A7DBC3C818E61DC546175A6E0C10AE631DF6B1EAE6D134C08466EBF6EB5F8257AA10EF8C6F27F4295F7EBFD450629F3EB4E0F4BE247AD7F5E80703B1247A4FC277311D69E5D62E0B0201A805CC4F1F807DE99420D563A703493AD35A56B2B2DC237112F5EC21C70BF139A9EAD8F7E921F086E001B4C449E42A0E3AFCD5BC757040A2865D0E5ADAF98E37E6F8A501FF39CEF0BC364EECDFFD03069B81F5E1978C397862FD56362835C059FCBE4D8E2A957FADD7D05BB195E21AD67B429621E1D6872DE2D8BFDC91544F9E6AE8C164A23255AD0E00BCB21456F8FA6AE018F49605736C81A5AC0945E2D965F1493ED5BEFCE512AE93AD91DAF6F5A151D6C9856DFDDD1F877945D932261DED67AC8231DC3CCD0B04DC1B02079C897601E363FFB9A3BCBBBDB0B0A375E69EE4A7135C094ABDC237FAA2E5F82D2556290ADCF82ADBA8402C4FC9D0724F15BB87CD7A75A1A7BF826896D8EF63C7A2A3C371756AF638706270652C376100EC42FA55196DF332820D377760448D3E7ADC42E9F5D8A7074BD0FA97433B0E2C501252DE6939AB948552663A17DD7FF05430FA76E29F0519D650B86FBB19FBED097143FC242573E3E6FA4BD4A2EF6D9CE6932A066B4F9FF935BA9BC26FC2E5031C20AE30A52970A2DF3504576108D5F26517F8577BE61E6AA9D192ED62CF36AA641DA0D274B1ED5EE864B549154EB4115658E6C60219CC5B2E22C49CE3BA76A85EFB549117E1207F6DF081D0761421262E352182239F1E34EDBEA4BCD8FA0027543824DD58A20324FD4CFE943AAE5E361C367B22F587E2F9BEE841E11875B026F12B9571512F72985F98F6D0C212DF36A60975429173E317F6ACF72E621F30654A6DEAEF9E9E455524BF07FFDF44642A1826F734D69F3EEF4D52F26C06376C8F71DFB65A24A4C57D74B5976950AF3A57B4248909524BEC47D858C69041EED34E0ED3B111BBC117AB112BBF947D646AB3B7172F5FB726DBC53AE37956E29F5B6B1E3C90BAF4E4FA544FF63815FDF4AC9A2A80CA0E8722383437B9A02F3AC538FEDA7A6D6C1635D3624A385D846E79E956DCE483B89C346C1287A1A7293168D8A885FEB6569EBDF3F47F8BBB50AA43941EB20001959AF1B9B358ABA13FD9BBC596EA42A9774A120AF091D544E79C50686C26B4FEA396BF1E4C25B8EE4929D75569A5FAC521C77B -pk = E9B1B8AAD851EB684D54F7E28379EA7221B601705FE2859FD1A63A3F7687EE2BD29D99CB93E36E4A47B972225EA9ECC866A7E34C4514B63D1159F1BA2D38F729 -sk = E9B1B8AAD851EB684D54F7E28379EA7221B601705FE2859FD1A63A3F7687EE2BD29D99CB93E36E4A47B972225EA9ECC866A7E34C4514B63D1159F1BA2D38F729020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CBAE5CA5CE079EEB2A4459A7CE4F79B9DFFF62588313C47FFE29E2D488737529CE7E3D1F3D6372FC55C9482A33DBFFFFFFFFFFFFFFFFF0DF75613952816DAB26E512E814FD54676DEA2682B667BB2D8D0690D8DD620EAB3151C338085796AC061A5ECD1BFFFFFFFFFFFFFFFF5C1CC9A06BEDFD57F902A32A4CF2B9FF7ECF05BAC37BF34A5B78B0034462000000000000000000000000000000000000000000000000ADB01190E140F200C5B04FB483383756AB155DF25354F4E21EFB4529928D0F000000000000000000000000000000000000000000000043968A85303E53ACCE677813C072F49587C3ABF0160C00CDE8D2069D005626127F14024925D9F624C99E5B44B0F7E54DDEFEB2C9D5DEA2D791B01915A9DFDD1D26206679D85004F62C0E866C548E90916A53D6F9186C751885E45C3A3FB11C23BE3196BFFB9B85AB0A26DBB9AE29B1DEC4F483133C89C6B9C50C2EFBFE60EA0D17F7180EAC749F19BA3917ABB174F97D6C5BA0FC8D1D3BF060CC8555A32B5C3250DFFCE716F592AB9B707BE080D4F44A8EC4C8778F2FD9D71E751E6CC99EDD1EFCADF70CFC34D7DD757F1462CCFFF52EDAAE73743FF330FAA30C76F9E8FBAD00E17B8319221372D1822CA87E9F82D4DE217BB46F35611C875E9FB9D8897AC602DC12177F23EF6E283724224A755D0C782ECCD44908DB81C78950A08D7BF75A1AEB20D1BC99E14B318FB0CF1132B95FDDD3D9B34BE82EA144AF6D774C925E9A12215EE34A7A8CB57A57A482EEEE6C67BD4FBBB7405D961982E0BD3EDC0018A727B72AF2F112128C07E269221F950841B367D13CF0A89FF404BE9D19CC8ECCFB1EACE2478F3E233EFF64FB54E0178CD336B48FDE9DD7A20E2BDF591DAF17D80C1C62DEC0DBF384AB2CE3314CEC3C45CE2D1121ED66DE534A7A8CFAB76D71E61828 -smlen = 2223 -sm = ACF27E458CF10004CB050F17E0BA670857D2B100B9F4EDD4601FF969D502B70F6FB43B021B3DB303D888283BA542288366074979690CE1E1FBB325076A590916C36FCD701E0085F3A3C83AC0B0BAF504E763B7DF55D2AD198906B3497B7A8C67457FF001878FDAD8C2415840F0040DCF56C1DF9F978E5B059F864745B2B497C30B07E83AADBBA73AABCB9A01018575EF12E0FA74C06AF142FAAD39CE0E0F0350449D27BBF26AB65605D0F9E5B397B4060192D5FEEF68737ECE61C6E0078D77FBAE97B0B9235F40B97099C114B1586E107B5ED1308A8A2D20BE41AF129DA2E0B38EAF02FAEF733C7A1D1A387BC55EF008530ABC22697D0465AA3EB71F41EE72ADD236CEA9A25995F3689C5A451E2F03915D96ABEA10D356D549D68048977587326523CCD71C05FD57BFB3C7A853F535BEDDEADFB84118F6548860F6BA536277DDD7AB42123E93381A385FA3E6CC023C1458A9F94822D93248F36C48FDDC972B5D6494B26658440FFBC23B57363F3D82CCE69FEE4747A889E85343288D55D30FC54D2D0744744DBA9977720E8EDD2C0ACA1FC51B0C6A3C68BB9BB8DA0385DB1CA4E9CE660CF7EB2382E5E95D2AE19DEF904A8651DFAE53A4D0DC4D057AB1A506C3BD7E1D1EA3FC4623E7D7B410DCB312F037B7A5FDE5E0E604FC33270FAF1FFB6ECB3125DDFA5C49F25BBC98238C8AB1B903537CD67238995E81B814280A4CED61513D69A2178086D505F8DD1DF7E11CE66AE33D4C982F94231957031A258E0EC745672A57A5CE76D1170111B8882A9EB5388094EBBD53EE9EA1FCE4A275F9D7060C8DA79018487B452817280C63B01B05EFBF897387592E2BB3BB486FAE0AB09F46D9F2E176DE96C59992C10A14EC16EAC36102B1D15541607075E67C842A888C87B268E9809148A323C423220DC31566B62F45CCE1E2BC1B3BF43B87C998F00023890BCE517271BEC16EFAA33F11611FDE87F197852BC2E7A2B44F8C72A6F79B22F73BE0611B81EFE09253931545D2453939C46B6797CC5DC5A8F1AA3BD8456EEEB84EE76DBF2EBF32598750ED10670DF422C7D7993ACC55F657E6E1B3DFA1BD6C1CD55FAE97E69D2F8F5AF368F7DA0A63B4065EB6D8F02B19A34600252FDFFDF4ED8DE2EA9CD2E74D63A6CEF29BF02F92D346ECB9A61081EE5AC811F33AA5792F6A1AF570A8B0846F3E6EF38452346DD637B19ECA37BD1A6C42B20A5BEDE9A5DE3C9F169D04D8C6CF5376D3404F0C21DEAD53DA6C169F390EED7B5B54DBE47CCE0B2AD1179EA8FC80FDDC7281BD4FE31B9A26A00444AF0B4D40A1B72BE37501308906149DC6FC5CF02B6F60AFF82B975FC8F146961EBCCB4D126ADD524A9B33BB16F6A83C6F3727A72EFA2BAC116E493E07B2CA718A63FCAC8E9D52A1B61479B4EE52A5ED30FABCEA4D01A792A92676721286814F3B0F4E15E23CE0C5D59A0C3EB8573C0A2F66C25F2EB2FCFF787324721004979BE5EAC505DFD39F5538E2C1B2CC12D20C1C5CD87299766361AEDDBFFF743693081842378744879E6E6371B3FFA9DDF34966FBF8DEE91B7EDF6EEC3E4E2F410CB5351F847646C22AB594046DED63347D04A008FBF6EE9696C638ECE73B39A269DB239DF36443868AD44D26A5C40FC92DFFB008E436E5C18907F5B18B5E6C5900B41A9801DB070D2DB651187A4DA7E2647ED3E9B6E9781627EB576BEE8334374468760DD3B32985D42945D953D434BFD80D7F7BA537265FFCF27DB0DA1ABDAE89BBE94D98BC9CA197E41C0839728F964FE4CE30B8CC43CBDCDD9CCBE06FE99DEBC6F4024F3F00D43FEBCD62A1822A6D507337EE79D4517AA486870602D4F1C5368B0EAA1FF6C011A9A953AAE58C75BBD3DC78D263A578C75CDB1AB324D71B9A065A9AF3DAB854189585C68D499AE8DB887745E20AD9738705B9D2F5D429F12D6462E5E2EF9FFBA53CE2F4E75449D2A7DBC3C818E61DC546175A6E0C10AE631DF6B1EAE6D134C08466EBF6EB5F8257AA10EF8C6F27F4295F7EBFD450629F3EB4E0F4BE247AD7F5E80703B1247A4FC277311D69E5D62E0B0201A805CC4F1F807DE99420D563A703493AD35A56B2B2DC237112F5EC21C70BF139A9EAD8F7E921F086E001B4C449E42A0E3AFCD5BC757040A2865D0E5ADAF98E37E6F8A501FF39CEF0BC364EECDFFD03069B81F5E1978C397862FD56362835C059FCBE4D8E2A957FADD7D05BB195E21AD67B429621E1D6872DE2D8BFDC91544F9E6AE8C164A23255AD0E00BCB21456F8FA6AE018F49605736C81A5AC0945E2D965F1493ED5BEFCE512AE93AD91DAF6F5A151D6C9856DFDDD1F877945D932261DED67AC8231DC3CCD0B04DC1B02079C897601E363FFB9A3BCBBBDB0B0A375E69EE4A7135C094ABDC237FAA2E5F82D2556290ADCF82ADBA8402C4FC9D0724F15BB87CD7A75A1A7BF826896D8EF63C7A2A3C371756AF638706270652C376100EC42FA55196DF332820D377760448D3E7ADC42E9F5D8A7074BD0FA97433B0E2C501252DE6939AB948552663A17DD7FF05430FA76E29F0519D650B86FBB19FBED097143FC242573E3E6FA4BD4A2EF6D9CE6932A066B4F9FF935BA9BC26FC2E5031C20AE30A52970A2DF3504576108D5F26517F8577BE61E6AA9D192ED62CF36AA641DA0D274B1ED5EE864B549154EB4115658E6C60219CC5B2E22C49CE3BA76A85EFB549117E1207F6DF081D0761421262E352182239F1E34EDBEA4BCD8FA0027543824DD58A20324FD4CFE943AAE5E361C367B22F587E2F9BEE841E11875B026F12B9571512F72985F98F6D0C212DF36A60975429173E317F6ACF72E621F30654A6DEAEF9E9E455524BF07FFDF44642A1826F734D69F3EEF4D52F26C06376C8F71DFB65A24A4C57D74B5976950AF3A57B4248909524BEC47D858C69041EED34E0ED3B111BBC117AB112BBF947D646AB3B7172F5FB726DBC53AE37956E29F5B6B1E3C90BAF4E4FA544FF63815FDF4AC9A2A80CA0E8722383437B9A02F3AC538FEDA7A6D6C1635D3624A385D846E79E956DCE483B89C346C1287A1A7293168D8A885FEB6569EBDF3F47F8BBB50AA43941EB20001959AF1B9B358ABA13FD9BBC596EA42A9774A120AF091D544E79C50686C26B4FEA396BF1E4C25B8EE4929D75569A5FAC521C77B - -count = 62 -seed = D2629CEEAE5C95D3C34C1FFCC2338B4A97782BDFCD39111E18540B69DB035B352D012857111F816F03550BFE5F56ABEE -mlen = 2079 -msg = 7F704CEF1C510BC2CAE9B70FD248C656226BD5686D366528F0D0BEFC0A8761EC640CD2DA7979DE5EEBDF6127F29ABB8607F8A3D3BE05BE25AACE7FEF3063DF28E22A522FFF0B6FF6A0C61F79B02A408E8E1C775AB80BE6841E9F8A9D030AE5518E3EA8A4E31E416E087D47919593598FD58122A9E601A57EF02DE183D56921811AE2253628125C24F93C84361C5EC99E7B16962BD96CA190C68F3AA9DD60CE3AA7610589813B4FB77A4688308D9BC72CBE918583E298E03AB95FC500209C14ABEB3A43BAA92DCB11CB523C4D17EB9C6697B56C8B61EDA05BF5789166F839291CFE2997B7DD462EDA69B0615F2AD82AAC0A32F4B30FE8725849C144A9C07799D6CE9D293C25D8302161757B8C8C8D07032D914EA7DAC275919A1DFA0D3348EC07FDC70266975722763EF85EC4AF9E14288C9659907526566BB3F2DD5DAFC0D422568CA3AE52486D3F2C18B667E5622BA7E52C56BF00F82AF2108CB4949A09179544F30758B7FB98C49EA160720991B14E2858D648F0585AD1BB1D08294F029BFE936154E9D328DF2E054004FC5C29070DF9EE50DCD0981D2BFB3AA7D6F637C4CE457C0C66D27E2670107A2B85D1F026BD970EF3FB7E32C60218D5E43A06D9CD26289A937B4FBAD2A831425728F3D0D30C6C602AF4B14411E9B3C7CF0B4D630614A9E03AC30BA2B024D496DA984D08854F1366012C2400A5C8268C2B126DEA5AEBA0DE7C92BE0AF08CA22E02604A753702BDCD642BBFA0CC91BD8375657A957306A76B6F139621481B6F15CB57BEE128954D30F552661F906D8AB42CF260F30F88993BB40C9679385F5C4639888973361216DF3C60C57D9B250F64B7634C94DDA3FD122713FD2405A7B71F476C263A781DCE271E7D0665E45DCB27F7293DE57312396C58C40E268F57ED856F536C8FEB4B0060488DE3C25949D2B7E64207576641B34920D04B46766AA2978D9352C2769D49F8599F3D0439C928532E0EE428A3773FA4D68E6052335C6D93368E321D750D296799FAF87B82C640A6E995D18DDA002887F141DB8ECE2584DA2FDDF848D38357D585CD619B1625A70A5D333561D6DE856ED9908D1E377EF7BE03B326594808BE58F7FB3939E939B73F11DAB3E572DBA41D43A046B8D2BB521728222D5A77DC886AC6F328D9A531118156D791D64F5DF8FF8BE8DCA32EABC3CB259B0F72B021CEB4DB36A6CD2FD149437B251F81F7588AE921456BEF1A79FE83447D80CADDBF20895667CA0E493A4731EEC901E03F66DE284400A5558922AD53D4E0FF7BC6C61640ADE0274C63D94E96BF6C642B790823109F53C3C27130A1EE38D448239187F5009373BE328AF866A9B8DD1BB735E8002296043C6FF641A432709148C707B900ECF46555D77644565D5998C096756F79B6F0E20850B8BF0528E78BF5FB4859BD655227873D289CCE47FEDA8414D09ED7E8D380FC4D580C7F44B01521E829E7B0CB2D2F345C517B65E2D476687EC9A4C160A3AC0B01CBAA588644D799B125910812790F06C1ECB1F1E64D5CCF92AE5E8147C98B0CFAD5626BAB5115844198E8C2AC1DF9A208FCD2D2891F4A29009F5B36D8E31383811A9493CF8E143B5AC8A14D48119CC16D2C6BF6826FC47D4B782FFC76B64401B8249777E32C1298606553DACF386A22809B599924A635796A1AEC3CD8568064852E54C95AD887D7AFE837F6FF676F69EE6288879F6D96193AD94A0418BBBA2EED5355876F2C3497448A5F8F3F83B136703D9A38FBB62784CC233DF448A5E88EB5F81A0BE97A16FD4CABA1D87A4BFB08E002EBA548F662D496A1478BB7C26C69CA4C100AA6872A4945D703CA812BDBA53AC86010AA1D2C53F29E46AD095936FF50DB8805DF4B08C9580AEECE3A6DDD828E7B5D4DABCAF112A6E35AB3C28A6DDC4D98AD1063C2ED72CAA50086E6B72090CC1F2AFEBEC6751F27EF51DD8557E53D928535D82A220F62BA0645E3C2618F3424EA1A339A138C9B8E26B14BC32D1736A4193C0C72CC402C3EAB58817335C1424BD6F38CFE16338611118B4100E4038D07DCA041C72E485C5290F0DDE601565DAE9CDF657A4C7839D3ADE72986AF396E767430125786E219BC5736F16FEF66B4014E5961CFB4CFEC4CB2A32205A92DBF1399E2710395BA1240D48277C120526CD9E2352F7D04D89CC2754379CE80A2CD1AC765718B8BA61EBB8BC6D0D407022E7AC672065FC8503BF5BC4138520CAE233EA997463D7C9E00BBD852F12EC17C6F1DB1914446AA21E156D210094B699B4117B31EAE6386DC0DE1F55CCEC09AA1EB38CDE4602598D452732C5EF8B07C477E3E2DD470737EAA7357E2E8B74C31A117B519BDCEF79B6B044148A10468E38B5A6B7B10D74C6130A60A268ED73DC9A25ED68AF354758FA3F57ED3558DA654CACA7150A8E4449D0EF640184A7A33D00BA765B01C442E88D9B4257B93904ACE04375679BFD8271A03073E34C4A1C0437C4009A9590CB98D0B5581DC83407F04A22C9B0246DE38E1A13F9B1191493818783950548BE562F940240CDECD4A50C94E406B1BAE04B50A3A19E7923183E3FD356238C45AE6559193E0E846DF0FC6878BE6C963AA8C3508DC31F766A4B29C78D749C89985AB8F580DBDF7993A2261CC4BBE489C3BBB38C46739BD2516D3C64A93F10CF559DB6A0EA3BAFEE8B43F696A5288C66509A57C642BBEAFB40F4CD0649B4CE25B6FB2EF5529B73556051213BB39CC4F1DC8004B1588C8DE836699C66CED567998523AD3AC303D9E13617CE6C1D2FC4C35B22A24504C51F64155F24D91D0E8785B40912B3DCEDEDE71A6933B36BB514FDD1D3D843AAACF2C1E79A5216622C20036C9C999DAC3A5A2D43FAC3B23119927806F497B4048F561A2276FDA0302423147D35579DD4411416F0F59273429AC0464AC49B230E29DC124115D18A045663D228BFDAC9F57B0C5B4 -pk = 4762D187C409164FCE8D288E42605813E5F8912763FE2C4DFC0A67066E93131CFA8D5D5AC498F95CB1934E517F20111C72D1E5D4B844B36227C65871A8991127 -sk = 4762D187C409164FCE8D288E42605813E5F8912763FE2C4DFC0A67066E93131CFA8D5D5AC498F95CB1934E517F20111C72D1E5D4B844B36227C65871A89911270200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FCE18BDC2B73DA3F08CC08DEB38FB207ADEC5E2E8DAD3CDDCD49369BF83C460BFA30242A1CDA430E7D7081A1CEEFFFFFFFFFFFFFFFFDA16287EE72644AF6AAA52E8E82F4BC2831AF7DEF9F1DCF5EF414AB44A8E345854AD5AB25622E4FFF5146396F0A2FAFFFFFFFFFFFFFF7A84CC8EBDDCC8A82E905147129DA2FD75858AC5162CFF28FD977FEDAAA1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4FC6D3D9B53F7E5990ACDB718F16277600B183C1F4A05AD99FE45245C9540800000000000000000000000000000000000000000000007C41D06360170F11815CE0949D57D44BB94132A7E1872837C7DE55D50A4D7006479C0C87B9B52FA583466C0E190E35B3994418DF517049FE00E0BA7AB9B96A12D69EC4AF545BFF09F4DD7CD5423A9835DF482F5E752FEBBCCC4B5445A67A5F2CBDBABB2776482B6B84E65575944264E23721C270D46AB98F2452B28BFC3516135B540FAB48B00A85693DA6F13718C8BC4CABED90D9C76FAC87E9CB165B414D130DAA896C2C1CE295912DBE9E63D830A8F1E0F912D78C3FB377B37801F52CAD33F3BC213F6507744D3AE0308CE65D941F1631BBBDACEFFAC1DF858B4D5063CF238512D04942FED8DB0E9F7A23CA2D6FD1DF2BDD553464D070F9344457B25E5A08F6B4D4189BEE146E4143424A71EF72446168484C5F298D62FD3EA72BBB0732241888DF438227D4B20D284F168A41E56C5B30A81F1DF3CE9336ED73EB73A3E029843C84112802D9247691B1727B09B952471DD0C69D89CDC9DC41F8B33E32E002B0BB59E0E59A802EA553C049D436027E20561C94EC9BCB31CCA0816CBC50921A0A09332D748E1185735DB88554F15FD4E29B857AE2CE26B61E04EF96767D9A0E0B6D345C8FAA7C1C196E188665258491E1A4216F7A28F06EFA3A4D8D541E7D2F -smlen = 2256 -sm = D7DA0CA78295F2FBBB0650BB7CD908AFD4168407076EFFF4BAF53E86EC06FD7E6757F4ABA431F7017565257CCB6462BD2B0058F68F159C54CA01970319538B90E2D05752F5061BEA2F4E7C6F8BEEFC0474D0E6E101D6061D8E04078983674B64741BEC052D20AAFDBEE6E56F7E00A1359916B2060567AC012ABFB9BFBE07B4EDC70337C3DFB8E48104635704011529C0ADC78276214DFE6BD8F75F91730D03C5D1C5C874F79ED1CE0039BC10C23287FA007F704CEF1C510BC2CAE9B70FD248C656226BD5686D366528F0D0BEFC0A8761EC640CD2DA7979DE5EEBDF6127F29ABB8607F8A3D3BE05BE25AACE7FEF3063DF28E22A522FFF0B6FF6A0C61F79B02A408E8E1C775AB80BE6841E9F8A9D030AE5518E3EA8A4E31E416E087D47919593598FD58122A9E601A57EF02DE183D56921811AE2253628125C24F93C84361C5EC99E7B16962BD96CA190C68F3AA9DD60CE3AA7610589813B4FB77A4688308D9BC72CBE918583E298E03AB95FC500209C14ABEB3A43BAA92DCB11CB523C4D17EB9C6697B56C8B61EDA05BF5789166F839291CFE2997B7DD462EDA69B0615F2AD82AAC0A32F4B30FE8725849C144A9C07799D6CE9D293C25D8302161757B8C8C8D07032D914EA7DAC275919A1DFA0D3348EC07FDC70266975722763EF85EC4AF9E14288C9659907526566BB3F2DD5DAFC0D422568CA3AE52486D3F2C18B667E5622BA7E52C56BF00F82AF2108CB4949A09179544F30758B7FB98C49EA160720991B14E2858D648F0585AD1BB1D08294F029BFE936154E9D328DF2E054004FC5C29070DF9EE50DCD0981D2BFB3AA7D6F637C4CE457C0C66D27E2670107A2B85D1F026BD970EF3FB7E32C60218D5E43A06D9CD26289A937B4FBAD2A831425728F3D0D30C6C602AF4B14411E9B3C7CF0B4D630614A9E03AC30BA2B024D496DA984D08854F1366012C2400A5C8268C2B126DEA5AEBA0DE7C92BE0AF08CA22E02604A753702BDCD642BBFA0CC91BD8375657A957306A76B6F139621481B6F15CB57BEE128954D30F552661F906D8AB42CF260F30F88993BB40C9679385F5C4639888973361216DF3C60C57D9B250F64B7634C94DDA3FD122713FD2405A7B71F476C263A781DCE271E7D0665E45DCB27F7293DE57312396C58C40E268F57ED856F536C8FEB4B0060488DE3C25949D2B7E64207576641B34920D04B46766AA2978D9352C2769D49F8599F3D0439C928532E0EE428A3773FA4D68E6052335C6D93368E321D750D296799FAF87B82C640A6E995D18DDA002887F141DB8ECE2584DA2FDDF848D38357D585CD619B1625A70A5D333561D6DE856ED9908D1E377EF7BE03B326594808BE58F7FB3939E939B73F11DAB3E572DBA41D43A046B8D2BB521728222D5A77DC886AC6F328D9A531118156D791D64F5DF8FF8BE8DCA32EABC3CB259B0F72B021CEB4DB36A6CD2FD149437B251F81F7588AE921456BEF1A79FE83447D80CADDBF20895667CA0E493A4731EEC901E03F66DE284400A5558922AD53D4E0FF7BC6C61640ADE0274C63D94E96BF6C642B790823109F53C3C27130A1EE38D448239187F5009373BE328AF866A9B8DD1BB735E8002296043C6FF641A432709148C707B900ECF46555D77644565D5998C096756F79B6F0E20850B8BF0528E78BF5FB4859BD655227873D289CCE47FEDA8414D09ED7E8D380FC4D580C7F44B01521E829E7B0CB2D2F345C517B65E2D476687EC9A4C160A3AC0B01CBAA588644D799B125910812790F06C1ECB1F1E64D5CCF92AE5E8147C98B0CFAD5626BAB5115844198E8C2AC1DF9A208FCD2D2891F4A29009F5B36D8E31383811A9493CF8E143B5AC8A14D48119CC16D2C6BF6826FC47D4B782FFC76B64401B8249777E32C1298606553DACF386A22809B599924A635796A1AEC3CD8568064852E54C95AD887D7AFE837F6FF676F69EE6288879F6D96193AD94A0418BBBA2EED5355876F2C3497448A5F8F3F83B136703D9A38FBB62784CC233DF448A5E88EB5F81A0BE97A16FD4CABA1D87A4BFB08E002EBA548F662D496A1478BB7C26C69CA4C100AA6872A4945D703CA812BDBA53AC86010AA1D2C53F29E46AD095936FF50DB8805DF4B08C9580AEECE3A6DDD828E7B5D4DABCAF112A6E35AB3C28A6DDC4D98AD1063C2ED72CAA50086E6B72090CC1F2AFEBEC6751F27EF51DD8557E53D928535D82A220F62BA0645E3C2618F3424EA1A339A138C9B8E26B14BC32D1736A4193C0C72CC402C3EAB58817335C1424BD6F38CFE16338611118B4100E4038D07DCA041C72E485C5290F0DDE601565DAE9CDF657A4C7839D3ADE72986AF396E767430125786E219BC5736F16FEF66B4014E5961CFB4CFEC4CB2A32205A92DBF1399E2710395BA1240D48277C120526CD9E2352F7D04D89CC2754379CE80A2CD1AC765718B8BA61EBB8BC6D0D407022E7AC672065FC8503BF5BC4138520CAE233EA997463D7C9E00BBD852F12EC17C6F1DB1914446AA21E156D210094B699B4117B31EAE6386DC0DE1F55CCEC09AA1EB38CDE4602598D452732C5EF8B07C477E3E2DD470737EAA7357E2E8B74C31A117B519BDCEF79B6B044148A10468E38B5A6B7B10D74C6130A60A268ED73DC9A25ED68AF354758FA3F57ED3558DA654CACA7150A8E4449D0EF640184A7A33D00BA765B01C442E88D9B4257B93904ACE04375679BFD8271A03073E34C4A1C0437C4009A9590CB98D0B5581DC83407F04A22C9B0246DE38E1A13F9B1191493818783950548BE562F940240CDECD4A50C94E406B1BAE04B50A3A19E7923183E3FD356238C45AE6559193E0E846DF0FC6878BE6C963AA8C3508DC31F766A4B29C78D749C89985AB8F580DBDF7993A2261CC4BBE489C3BBB38C46739BD2516D3C64A93F10CF559DB6A0EA3BAFEE8B43F696A5288C66509A57C642BBEAFB40F4CD0649B4CE25B6FB2EF5529B73556051213BB39CC4F1DC8004B1588C8DE836699C66CED567998523AD3AC303D9E13617CE6C1D2FC4C35B22A24504C51F64155F24D91D0E8785B40912B3DCEDEDE71A6933B36BB514FDD1D3D843AAACF2C1E79A5216622C20036C9C999DAC3A5A2D43FAC3B23119927806F497B4048F561A2276FDA0302423147D35579DD4411416F0F59273429AC0464AC49B230E29DC124115D18A045663D228BFDAC9F57B0C5B4 - -count = 63 -seed = EAA4FB8EF0290A499A1D92EE398A8D7E71CD3CBF01A36750DA4B7EFF175DA26D17AC4ECE49A84C88D1D2C2493563C26D -mlen = 2112 -msg = 2E086FA0C4582E0C6CCB020F86A6107475985160BED201760D6489CB05B8D21452C81BD5D317F8857703DABA24E968F3164C82A4A9751DD88742B72141734DC0B4A77CBE2AE1C287A396A2F5804519456CF1EAE273A5C6361F52C35EDCE5ED7388D61D01AC040676522C9FD7B02A7DEAFDCB4169867EFB69792210A7069287C5DC958D0953C36F84D9A26989DD3B726BE8B94B41DCBA1B5374123F55A6DBD6360698551C27D16BAAFBB0ECBE116B44F11425DA45D7FE8ABA91697D83B6896A06A7888C97A91406B81B3A5BC8B68A984750893114B4011B9C8BEBA6F5C2D7D9F2C7A27030555633A0F90E30753A04B1958141AF7C1B95BA208DA36F729673D20DA0A83F913BEC8049F8CD032D9F9DD94B2086C61643AB2CFFDDB2B9BE0AF996D642B7A0A31CE0EEC8C61B343ABA980FCDACE9CED7BE4C9048B356D41002EEE0433428846BA4220EFB7F493FF57B0C706282EEE448CF7DA9B17B32D0EB0016983175469AA5BBA53489EC56BA3A92A70FDA2390E3A5D8C038F496E7C3180C6971A39491EAC10D828D44B3DE2BE64569B907005783E62710B9AD8EB8C9AF4B04993D40D1EBF165EFDEC748FE9F6B334DA6A30C568BCBAD095998A47242CA16803FE1720FCAB85233AD76EBDE102A5D93AB98460494BC886BB04C05AE89E157967747F8C050B33CCA52ED5E59050965523EC5C4EAF94CF2F2EE80C35AEEDD14E65D937C92855D03FC76ABAAD57A21A42420819EBB9AEB65F031F9C4BA0AC2EA27289E941DB89669A0620797091AEA3EBFC2AC354E94D27894F444FF9E604C8BDF7D6C00DF0E7FE9827171010445E737D0A5867636E3488EAACCCFCBAC1030C0DFAB639AB45C5AC5435E2C5B8244E58C3A6BAC81EEA408020BFEC66EF55FDDC618083ED737F4DD3BB65474487CADDF3AA2720A6931FC69533B6491DFC7E6E5FABF8103D05F870BFEFDDEFA20822A68A710B517065BD2478CE080E5DEA09EFFBA3A136C1BC9D7D8088F736C363B30E2AF2A6F2395EA8161CB64079340FA642C7763E3BF0623C968A16263CDFDF1B8334E427955E20C1EBCE8C8CB136DA8D002D8A9E5DA3B1F56668C1C59E20DC3BE026A43F40910D3A2B601D9D3EA2BF6D2C2781F976BA840FC986C8AF0DF84B8B0FB291D1310039D6914F8F7CC6B26CC33AF94150253E8EB410344A64344A5A0C06E0F3AA23C68617C6F4659DF79285782C89BEA3091083A069EF8F048371CFA054DE45E32C19A44DB5D435BC8FEF5570B68D80D5BF5DC06DA13C36E3AEA341CA9FE20047AC30683AA9D862306534EC93E79EFF79FE22E3BA15E2BA3F59F7B8B9314DCE31095D3015710C2927B54BA6F46D3981975229EED16C9B17813801C7D3CB3604DE9B7A4F18C2F91B2B50C1F43E87198AFBAC718935DB9CB96D9FE048D969635CB9F4DCA659AB1612A698CE45336B8D9FF5468301BF05D04B3558D66E88DE88427FE87E65D36D3C29FA3FB126F1F294E9BB391EE427001C34126C6622905514CE153682754D7FB1C985AE4DA600AADA1593A0A214332B310620B1B4E95BCBFD6EB8A241CBE848BAB37462224994E0D2F3F4B521DCA4A9A5AB10BEE741C5919907AFD2552D4AA300ADDF67CEC2862420C8D1D8DFFF60FDBE2D4A8D03C92E23BDB3400F5390EE4B141C5843B1E2C07C9AFDBC70E3FC08E2840EBF3B0E5296E1EE44D12E68240FDF063C07BEBF01C08586E8153068C1ADC744A7B54F53B0FEC3C752DA9F6F989A1AFEA4ADF1AD6AE926CABE4E0CB2CD864412DAEE377DE559A38047F31E834A6CE56D4041BA709945F07E514F96D783F32B0EFCC8B889FAF2B6D217246BA7C07B687E028F23D2409BBC12D6EC0D94AD9697BAB6395B7070B6FEB2E907A119209C9B7D86AF953BA7D2EA63982BCD794A5BAC69407BB7CEC5E027833B17420F146AE08F4B753BEF6CA0922F3294CD2A670127F9D2A2CA78A30F62056A425CBB7074C9A55135BD06CE677ABDF33B420F66CFDBE9461BFDF385A97439B3431CD29DECD9B5E59EC3ADAAE879A4E8D5E28CA13E73FCDBA51C828DE271207A5DEAB373B1B6677A29ACB87CBB01F10CD2C090EE66D472E8DB61615A5ECB84A7FF0988DD0DF9831BF43D732A12EC8CD50A86ADD12A5A2EA765744B05F73725AB8704ECCB08BD74517F21054E58903481E7A724F7FF24C43D6CD23DE84CD69C9E464E67003903C3858A6724247EB929716E170E2D2739AAE10B88BC3FB8FFA849E385B4113E78C24DE1673FC7E7285E6E3744F3843AC7BE7EC16BF74215694CE467A2E859DD4FACAB86250FECE28E0A6A31DD529D08566A6389B85C310C28A8DABBCCA9CD6A631EF0473ABFD6846D8326561CC9CB8181C1593D0F15EFB8129AF9E838AF518477CE361640169D9731FC139881D452773F21A3E79E514DDAA513D7B9F3399C0C57D21EAA00D44A7F031B79CAC9FC304E936E75A0CF8D204A6CC3C0FA7D037DD8ACC3A33CF5718061FCD57EBD06A607FE0BB0204E687B2A17B1FF47DA357B51A753076CB89422098D4F880F831842957E648C54ADBFCC0E488A95581E709B5A5A129DA7EC5B00AC9B18B80533F2DD1BD0F475A61DB18FC0C4EA655F602B207B572234230C831B26CECB7BC3284797C4BED5A977C3BFBEAFEA3DBFC4257D4C2C5BB8689830EE157F3B5AA1EAC09CFCE0555880A074AEB86062A8ACE19ACDC1A25F8D0E454F50F119D12E707D103F3C1A502D4E358D563E53554395B5D386AD49363978AFBCA2F8B673A693ACEF70D1DB4CEAA8FA580160924D4F18119BE46C71E09FDEE45EFB14A74DB1C688E99E24CB6025E73A3E7F0F7EA9C485274D2B6CF9784CBE39E388F9CCF1E2E8DBFA6DB43355391A369DEF645F815424253ABD0B6DE9C0A0AF156D9A4EB7474A2E5937F008134DEBC9FC7E54812967FCF5BCE28FB5CD43F1AA240BA2E9CEDD6F350D556DB1658868091E6034D7E1EE5C6645D0A345D46C42E23C6821C360F5ACD13F589 -pk = D5529FA557C1CCFFE3473FE3E78089FB84A0072EE72D0F4398142C4A60226C0E8B974D701D0A5864C8B25CD4AED4F8ED6751F17EF554382DCB0310C64CC2FA32 -sk = D5529FA557C1CCFFE3473FE3E78089FB84A0072EE72D0F4398142C4A60226C0E8B974D701D0A5864C8B25CD4AED4F8ED6751F17EF554382DCB0310C64CC2FA32020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D0F2A2ABEB551AA4B239F52FC5C49E4624F694B83EE27B45A7AC88DBBAE93BCECA43395192DEA64BBB17CB0962470000000000000000E97491987F700EEEAA9EBCB34303FA88937FCB6A3F31F671B6595F8D97599C985ED5191AEF9813BFA6E41F451504FFFFFFFFFFFFFFFF01B68F9C1FCB5C885732A483D415D551FF420B0CB07A999BF5BAF94236DB0400000000000000000000000000000000000000000000005C4D60B8C968D955BF0797AE3191B1074C55BD5516686FE7C318C08BACC70E00000000000000000000000000000000000000000000003C49049DB258FE5FA0D0BFEC931AEAAE954C3E046E96F289677ADC224824CC3312AD274FA9D60AEAF15E8C402A4E6F78FF2DF58CF2B6277D64E81AE0924433214323F227E12E3901B7A9891140603801E38304539E3C7EE4354CF1D35789D7065871B280BE3B257AD8DE80525D77DD1D32DF8F3099DDC5450C859E63AC25D4242ACBE031130B5466809BB0CE1AB51E0A613F9F4A00E217B03BA3B6ECCB0A4030A4C7889AA31C81D8EB5F151DB8EAF161BA7BBE83DE14070109D0A2D870E8D1113E0DDCE0CF95E492A33307C0AD842921912FF710A22E0D25CF8E6817E7FEB712E59495B7CD730255C51E8B12A659C2C1D43898C73CC22F657850000EC4E33412CD4AC7B6F0ACE53F63D065877C2A00E876AC9EF6E05EF8D9BD8755DB52F9F41500EF3CC71DDE15097C653DFB4F297B2D355C6B8D7598784A3098BFBA7E20552E34754DFEF99A2572D70EC87826171D2DE7FBF21E7D55C5F8E840A7403FCE2430E0FDF02F627DAD79539ED688B8E09DE7E1968521AE047F1B07BD1DEC79F5F603D64C830900AFE5E0B05CEEF5F0FF0B5BF18E30E31B1B85957F5D75C0F046AE0410956BD03720298D3D2E250911A50E565E73C73F7FD099F4F9D9FE21BFFC6A15 -smlen = 2289 -sm = 04CC9069EA516BC99305862D5AEEC49E411B4F02A3A90DB10CACC2F3D6034BBAC3715C1787BE7801F287D9920B65E6810C02517EEB34FD586581EF00D222A3F27575F3F0080152FE07863D54DB583A0290564F1E0B0662C577009C3FB47E06DD5F539D047681C05C5F2033901C07D5048F3295AC4FDB79074F92F3A7D27E145C2A05D096DF5AE481EE2AF006007B92666DA4793093062D709B85B9305B0900E84FA03E094D53601E046CF79612257A68002E086FA0C4582E0C6CCB020F86A6107475985160BED201760D6489CB05B8D21452C81BD5D317F8857703DABA24E968F3164C82A4A9751DD88742B72141734DC0B4A77CBE2AE1C287A396A2F5804519456CF1EAE273A5C6361F52C35EDCE5ED7388D61D01AC040676522C9FD7B02A7DEAFDCB4169867EFB69792210A7069287C5DC958D0953C36F84D9A26989DD3B726BE8B94B41DCBA1B5374123F55A6DBD6360698551C27D16BAAFBB0ECBE116B44F11425DA45D7FE8ABA91697D83B6896A06A7888C97A91406B81B3A5BC8B68A984750893114B4011B9C8BEBA6F5C2D7D9F2C7A27030555633A0F90E30753A04B1958141AF7C1B95BA208DA36F729673D20DA0A83F913BEC8049F8CD032D9F9DD94B2086C61643AB2CFFDDB2B9BE0AF996D642B7A0A31CE0EEC8C61B343ABA980FCDACE9CED7BE4C9048B356D41002EEE0433428846BA4220EFB7F493FF57B0C706282EEE448CF7DA9B17B32D0EB0016983175469AA5BBA53489EC56BA3A92A70FDA2390E3A5D8C038F496E7C3180C6971A39491EAC10D828D44B3DE2BE64569B907005783E62710B9AD8EB8C9AF4B04993D40D1EBF165EFDEC748FE9F6B334DA6A30C568BCBAD095998A47242CA16803FE1720FCAB85233AD76EBDE102A5D93AB98460494BC886BB04C05AE89E157967747F8C050B33CCA52ED5E59050965523EC5C4EAF94CF2F2EE80C35AEEDD14E65D937C92855D03FC76ABAAD57A21A42420819EBB9AEB65F031F9C4BA0AC2EA27289E941DB89669A0620797091AEA3EBFC2AC354E94D27894F444FF9E604C8BDF7D6C00DF0E7FE9827171010445E737D0A5867636E3488EAACCCFCBAC1030C0DFAB639AB45C5AC5435E2C5B8244E58C3A6BAC81EEA408020BFEC66EF55FDDC618083ED737F4DD3BB65474487CADDF3AA2720A6931FC69533B6491DFC7E6E5FABF8103D05F870BFEFDDEFA20822A68A710B517065BD2478CE080E5DEA09EFFBA3A136C1BC9D7D8088F736C363B30E2AF2A6F2395EA8161CB64079340FA642C7763E3BF0623C968A16263CDFDF1B8334E427955E20C1EBCE8C8CB136DA8D002D8A9E5DA3B1F56668C1C59E20DC3BE026A43F40910D3A2B601D9D3EA2BF6D2C2781F976BA840FC986C8AF0DF84B8B0FB291D1310039D6914F8F7CC6B26CC33AF94150253E8EB410344A64344A5A0C06E0F3AA23C68617C6F4659DF79285782C89BEA3091083A069EF8F048371CFA054DE45E32C19A44DB5D435BC8FEF5570B68D80D5BF5DC06DA13C36E3AEA341CA9FE20047AC30683AA9D862306534EC93E79EFF79FE22E3BA15E2BA3F59F7B8B9314DCE31095D3015710C2927B54BA6F46D3981975229EED16C9B17813801C7D3CB3604DE9B7A4F18C2F91B2B50C1F43E87198AFBAC718935DB9CB96D9FE048D969635CB9F4DCA659AB1612A698CE45336B8D9FF5468301BF05D04B3558D66E88DE88427FE87E65D36D3C29FA3FB126F1F294E9BB391EE427001C34126C6622905514CE153682754D7FB1C985AE4DA600AADA1593A0A214332B310620B1B4E95BCBFD6EB8A241CBE848BAB37462224994E0D2F3F4B521DCA4A9A5AB10BEE741C5919907AFD2552D4AA300ADDF67CEC2862420C8D1D8DFFF60FDBE2D4A8D03C92E23BDB3400F5390EE4B141C5843B1E2C07C9AFDBC70E3FC08E2840EBF3B0E5296E1EE44D12E68240FDF063C07BEBF01C08586E8153068C1ADC744A7B54F53B0FEC3C752DA9F6F989A1AFEA4ADF1AD6AE926CABE4E0CB2CD864412DAEE377DE559A38047F31E834A6CE56D4041BA709945F07E514F96D783F32B0EFCC8B889FAF2B6D217246BA7C07B687E028F23D2409BBC12D6EC0D94AD9697BAB6395B7070B6FEB2E907A119209C9B7D86AF953BA7D2EA63982BCD794A5BAC69407BB7CEC5E027833B17420F146AE08F4B753BEF6CA0922F3294CD2A670127F9D2A2CA78A30F62056A425CBB7074C9A55135BD06CE677ABDF33B420F66CFDBE9461BFDF385A97439B3431CD29DECD9B5E59EC3ADAAE879A4E8D5E28CA13E73FCDBA51C828DE271207A5DEAB373B1B6677A29ACB87CBB01F10CD2C090EE66D472E8DB61615A5ECB84A7FF0988DD0DF9831BF43D732A12EC8CD50A86ADD12A5A2EA765744B05F73725AB8704ECCB08BD74517F21054E58903481E7A724F7FF24C43D6CD23DE84CD69C9E464E67003903C3858A6724247EB929716E170E2D2739AAE10B88BC3FB8FFA849E385B4113E78C24DE1673FC7E7285E6E3744F3843AC7BE7EC16BF74215694CE467A2E859DD4FACAB86250FECE28E0A6A31DD529D08566A6389B85C310C28A8DABBCCA9CD6A631EF0473ABFD6846D8326561CC9CB8181C1593D0F15EFB8129AF9E838AF518477CE361640169D9731FC139881D452773F21A3E79E514DDAA513D7B9F3399C0C57D21EAA00D44A7F031B79CAC9FC304E936E75A0CF8D204A6CC3C0FA7D037DD8ACC3A33CF5718061FCD57EBD06A607FE0BB0204E687B2A17B1FF47DA357B51A753076CB89422098D4F880F831842957E648C54ADBFCC0E488A95581E709B5A5A129DA7EC5B00AC9B18B80533F2DD1BD0F475A61DB18FC0C4EA655F602B207B572234230C831B26CECB7BC3284797C4BED5A977C3BFBEAFEA3DBFC4257D4C2C5BB8689830EE157F3B5AA1EAC09CFCE0555880A074AEB86062A8ACE19ACDC1A25F8D0E454F50F119D12E707D103F3C1A502D4E358D563E53554395B5D386AD49363978AFBCA2F8B673A693ACEF70D1DB4CEAA8FA580160924D4F18119BE46C71E09FDEE45EFB14A74DB1C688E99E24CB6025E73A3E7F0F7EA9C485274D2B6CF9784CBE39E388F9CCF1E2E8DBFA6DB43355391A369DEF645F815424253ABD0B6DE9C0A0AF156D9A4EB7474A2E5937F008134DEBC9FC7E54812967FCF5BCE28FB5CD43F1AA240BA2E9CEDD6F350D556DB1658868091E6034D7E1EE5C6645D0A345D46C42E23C6821C360F5ACD13F589 - -count = 64 -seed = 5909111F333F3E939105DFF8532548927EBF289F31A72F4C1B0C66816D8B68F64622F36A9BC85E63601BEE8EE7CB3DC5 -mlen = 2145 -msg = 5180B7DE9A84F651DA10D334009B3D65582F3912D329FBAD4AE39A9EEC78943338C29DB4F49EF41E3C50DABBB530E99113440383F20D5A3A8AE279A6201A0C84B003F6717C709C21AE893B6E412D87F8E0CEE5A89E60A14CE975A4D42E4F43F4710FC9FA29E9B2AFA93441EF5570123AA88AFF009E2507A3E60A79CDA25652E3AC3AC0C10A816BC04739B6FC758FF9AC467879BB67F270E4EAB43F10A633E5932B8D6DCF23814DE8643407B17B5E2A91B340F7BF6882DB694DE4DEE4C480CE037B9F9A220ACDCE84B03746F307A6026531D712C0630E7DE3ADD3A8516BA602D2463E3478008B3252B658FEA54DE41265B5C81E4E913EA0E2A63309497ABF961EC40AC374ADC0FF3C6FAE9BFAC5CC2DF475885B0BC636702828489183CDE1A2934F2D63828AD1F2B8CFAFFA53151B0FFAE6224DF54C2AC47CC8844B76222C2A3B6E132071150049B6E46AA75DEA28C13477980315FB64CE500BF0C6F633AE621D65B331BA96CFAC162DD7897B8505257E228CB621BBA9176A7AFB3A2CC20D7804DDB3AAE4B87FFAFD3C8DC541D05624DB02BD62491067EC1CDF73147014FEBCFA5B561756D5E7A13B88D1E7B2C0375E1D0DE71ED20CA9CC4E6DACDC579F1AB024AAE2A0BEC9004E5DD81C046F00A2A4CB767C4EB240D205278CB863D1A61DEF16635C6A84C2406288410FA4B73B21077D8F7A4075A1DDCA3D0D334725151E434BDA80D3E73593338B07958D27337E32CDE0010DFE5E58B99EB27A97DBD1C5E6F9A552A02726AAD5A4AA63EDC336D83E5870DBD514193367AF2274804628B4EEDFDA3B2A155694E89F5A6798C5D6E036159C1F00D8DFB03D41940E775974B11C3FE4456E07B127CCB44E6FD6B2918F57A6523D7F77F32478D9F1BB539846793D4284E2907830E5EA76054802A266C85B122A389EAF4700629036716E2869C0FC9440856D562711E903A1853BC68582A95344B612E5CBC7C5B2AEE23CCE4161A75829B2048742FBD65ABFE2397CC7D66023DE34DF4F2DF8540CCE9781ED6482D29CA4E906716C8CC9596B158EB51BAB8C2E00253D6589A99B3D20FB494834B42BBFFB80E7B0441E356B541F83877736985F6330EA459C007CE8BF18D84E78E36482D581DC7DF97528CE15F68E604B4DE62422B3AA76F3E7E5B33A49CBA9D89FCF50DEB65EE45173795393A50FD4C60CF6BECBA7E733513537D13F89FCF1C4D6437DE0EAE608FB11D68B9ADC0C3A19A3565F6D62BA81A326EC334B239B212B87320C03A75C58DC8F828C4195ED9D7ACDDCE493123E235D098E9DC60F5D3A625E1FF66F245E9977F9630A40D26E3AFB6676F5122A88CE5507BD825757D9CCD53FE574FD0E6E728DA355403AD664FFDEAAF636256FADC3283D6F15B297F79216833CF2C745C4C5E17D03260A69178F2216168BF8F00C9889E1E35540254F150C587A884CDFC9E5F7D379BE474356C06943E416EB0697A1AE989AB4872D0BDF436D9FFAAFEC1631C9939FCECB84DB2846F12CA395F506687B4A5638085BC6EF58FE8E2ABE9F8D51F272EE855E2DB84A89D348DD66950B8F43939DB897C519FA302594FD1FBD6B6E94CA8FF63A7949432DC2D35C60803A570B1DAC95EE0A60C62FD18B3319601AD29A156400D392DC9A14FF50AF6752C1F6EDC2ACB7ECCA71097B6E82227DE429F1A29C5E38ABEA1C74DE06E6788CB1790AE9F0E8AB35AFE60B001F45971D42949263AA62519B0D630281A4C5788D5591B1EF5A003C58987E8665701E5B1C6063F93533094E96820F918C354903775CEB6675C4CE9CF940C4BEB8845B4F5E1F642BF505821E5A23122E2D1ADB82A63AD18CD1E4775A96CA9EF9493D75FF784A2D4A99F54DC3F87828BDFF4B3A3D98FA5A29B62A85CAAFFBACE4592A81BFAA5B8BAE6606AD25A92A43140690A6003AA2D617FC707A53EC9D868E33596E098773942D798263F58FE5A1B23046CFA136EA35203B90BEA2C5F0AAEB5EA8C24B8B8CBA14CDEE28F45D0278F193228484BCC7E08A75D0064D605D674ACA9019A0A9AAECD6AC672CB8410FEE4192E6DCA7855FBB1C584CF288BACB40707D7E6F8BA2956F6D099F52BC7B0AD72B5A3FFC03C7B47086330244EA5D393C6B9F256FD82D5CB9436A469ACC3F8FC237146895BE148749F82D39B7BA4CE47715BB393A96AB471665529AB9E9958B12396C1BA7529DBF289184FF0F635C2BA9DF301036C869D52D993463222B70BA778E81C8DC668DE41C0356EEF5C39F1BD42398BFF30F959E115C6B386E73F0FE28A2665BD463C781DA1C46D6D4EA284B152C8C12426DC9CC467809BFDA6FBFBC0BB4793BABBF6AD564D57AE9F5E2B7F651D6ED980F8B1174A126CC58B23C32BA73F5031B3FCABFE7BC360AAE412D799CC14D8B252D9F9EC9005B7FCA04A88CC8AE9F7AEFCA94137003D5764FAA3C7C45670585C84F74C4EBD1F5AD1F97EA093595592FB90E3CAB01F98F06E114F13DE67CDC36F3FFB01C3D51EA643C25A3F6AA2C57690E42B98583D925AC7B06A349782A1D33C06BD05A82A7AA3DD679326D948D74A1861926B45DB78D36070D3087AA9C5F4F42CA57EE9CE7035BD88A85CE1107C8E07E5BA3A62ECF012BC75FBF97C4C72331B55AB9A6EFFD78869F1CD3F330526F262F7DFCFA2B084B61E90772D5FCE8F038C0F72554467192CC8A27F1F53C8714DA1864815974B00991F466648478C5F9BF036DC4083D72E8D144AB10FD32408DA7677729347FEBC79E48E7B87388D9B59AEFC84B5B3B589FD91863811A6436ED76B43E657F7EE03EB796285A4D93BE9AAAD1E1A1E81687E42EC83F3DD059B78BB7F8EC70E6C831DB5E90C6B3AA511F36507DBC8E7A77DF0F5B9EF03BFEFE9471DE7C7FBE67B9922260D3703D95A5BFCBCB62D830E20C23C6CFDDC210E47CB575957D8C3514A2ED4561C738928F210057896EAEB1499D4DDC70F44E30661E780AAF5C0A20C8553F40D7D3FF6D120511C1073510D04F2DE544121AB851E98F666906367C21302EEFB1AAA723F6A531C454EEA0BE7D50 -pk = D4F8587E96BDADB95988DD432D828F314B513B9903B4F65276E8B53B237F7714E4E4F8F93580FC151ECCF5F185DAB6711D595361CA8EBDB7FE2FC263FEAED111 -sk = D4F8587E96BDADB95988DD432D828F314B513B9903B4F65276E8B53B237F7714E4E4F8F93580FC151ECCF5F185DAB6711D595361CA8EBDB7FE2FC263FEAED1110200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005C14D6929FDF29EE12C4E203C06CE7A942A5DBB13465AF58073385F1F67DFA44848D3EAC8F629CF5C1EA7E48862F00000000000000002FBAF36CFB9677257A0FF6E12253DD3003CFA6F071A29BA8DA3DFDC48F9F923C6C414EB28E29B810D28C9C935E24FFFFFFFFFFFFFFFFD1935C30EC8054FF358E8A995FAFBF46C6CF9E6F3BA541B54BA542DD9917F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC3BB0C6B300D6E1469DF06D0ADA95FE51C67E6C7C0E3FF5749A01AB378B080000000000000000000000000000000000000000000000680232DE2D25EA04DC29EC8F8EB28047C32B0FC262B8A2735E2E94BC57B97C12503DAA0D6962376BEA89A1603C6462CCA26B666EFE0BF15A373F421FFFF21F0AF7CE3FD4CE0179ECEB0DCBCCC3783FCDBA9C1FA6D104001E36AB681ADE232F074299B0A283BF3390F218551CC4EC7731BB915B1A41816728EE2EDFCFE840F3204FD1E0DCDF4CE18A65CD9DEA37EB07E1BF1F11318E9CC546020085A8CABE1B024B6E81B9129D4F28D7C15F47B0E6D6DEAA8C5A834ECB36D42E99F475BB067A0B1779A214ABB1F6838D352046EC3590B36367A6A199C726A58F39B2F2FB270B1A28C1AE1668A572ECEE2F0FAC437B86A551537B500925C1C69196EB21C1BD5021E3008D4D75B32140A71DA171B5AEC6B2E0558069E096EEB305947191B67814107490F7E31C5C66F7D9796AE45984AAD109E750442BF5FEC155A5BC9C921EE23090DC9A4BF067BBC173304122170783722041351368445241A4BAB80AE271581CF4EA84C4435007C61396D08EC7430D00A7CFF55ECF78A9CD8DE14294323F530D8E3E870ADB66517DDDD5B5333D6CD4C446BC0CFA34BE9F8B092EC5136E20F233A1C46BCE87C8BE6C92FFD8BA11C1DF093DF06292FC901D6D994831583C666517 -smlen = 2322 -sm = 5CD864F1074BCF832E074548E2AABB6024EE480491EC0FF2B589BC9FA00642E88A5D27C33949E0035515CD2DF46F0D18AB0306B9F04953610A95F007AE4BC22599A91CFA3E0000A8C91776611C8C9501A0B153077A4B06093002BB9F5CC102B88D6024042221323EEB34FB9F8707E75ED98A32D8A2E06F07285AF37A7417738C690629CA079DF87C1A991A0000E1A17A6F2B92FBBCC7EB189AE52AE90603038479F2FC16600A66E204FF716D3DC83412025180B7DE9A84F651DA10D334009B3D65582F3912D329FBAD4AE39A9EEC78943338C29DB4F49EF41E3C50DABBB530E99113440383F20D5A3A8AE279A6201A0C84B003F6717C709C21AE893B6E412D87F8E0CEE5A89E60A14CE975A4D42E4F43F4710FC9FA29E9B2AFA93441EF5570123AA88AFF009E2507A3E60A79CDA25652E3AC3AC0C10A816BC04739B6FC758FF9AC467879BB67F270E4EAB43F10A633E5932B8D6DCF23814DE8643407B17B5E2A91B340F7BF6882DB694DE4DEE4C480CE037B9F9A220ACDCE84B03746F307A6026531D712C0630E7DE3ADD3A8516BA602D2463E3478008B3252B658FEA54DE41265B5C81E4E913EA0E2A63309497ABF961EC40AC374ADC0FF3C6FAE9BFAC5CC2DF475885B0BC636702828489183CDE1A2934F2D63828AD1F2B8CFAFFA53151B0FFAE6224DF54C2AC47CC8844B76222C2A3B6E132071150049B6E46AA75DEA28C13477980315FB64CE500BF0C6F633AE621D65B331BA96CFAC162DD7897B8505257E228CB621BBA9176A7AFB3A2CC20D7804DDB3AAE4B87FFAFD3C8DC541D05624DB02BD62491067EC1CDF73147014FEBCFA5B561756D5E7A13B88D1E7B2C0375E1D0DE71ED20CA9CC4E6DACDC579F1AB024AAE2A0BEC9004E5DD81C046F00A2A4CB767C4EB240D205278CB863D1A61DEF16635C6A84C2406288410FA4B73B21077D8F7A4075A1DDCA3D0D334725151E434BDA80D3E73593338B07958D27337E32CDE0010DFE5E58B99EB27A97DBD1C5E6F9A552A02726AAD5A4AA63EDC336D83E5870DBD514193367AF2274804628B4EEDFDA3B2A155694E89F5A6798C5D6E036159C1F00D8DFB03D41940E775974B11C3FE4456E07B127CCB44E6FD6B2918F57A6523D7F77F32478D9F1BB539846793D4284E2907830E5EA76054802A266C85B122A389EAF4700629036716E2869C0FC9440856D562711E903A1853BC68582A95344B612E5CBC7C5B2AEE23CCE4161A75829B2048742FBD65ABFE2397CC7D66023DE34DF4F2DF8540CCE9781ED6482D29CA4E906716C8CC9596B158EB51BAB8C2E00253D6589A99B3D20FB494834B42BBFFB80E7B0441E356B541F83877736985F6330EA459C007CE8BF18D84E78E36482D581DC7DF97528CE15F68E604B4DE62422B3AA76F3E7E5B33A49CBA9D89FCF50DEB65EE45173795393A50FD4C60CF6BECBA7E733513537D13F89FCF1C4D6437DE0EAE608FB11D68B9ADC0C3A19A3565F6D62BA81A326EC334B239B212B87320C03A75C58DC8F828C4195ED9D7ACDDCE493123E235D098E9DC60F5D3A625E1FF66F245E9977F9630A40D26E3AFB6676F5122A88CE5507BD825757D9CCD53FE574FD0E6E728DA355403AD664FFDEAAF636256FADC3283D6F15B297F79216833CF2C745C4C5E17D03260A69178F2216168BF8F00C9889E1E35540254F150C587A884CDFC9E5F7D379BE474356C06943E416EB0697A1AE989AB4872D0BDF436D9FFAAFEC1631C9939FCECB84DB2846F12CA395F506687B4A5638085BC6EF58FE8E2ABE9F8D51F272EE855E2DB84A89D348DD66950B8F43939DB897C519FA302594FD1FBD6B6E94CA8FF63A7949432DC2D35C60803A570B1DAC95EE0A60C62FD18B3319601AD29A156400D392DC9A14FF50AF6752C1F6EDC2ACB7ECCA71097B6E82227DE429F1A29C5E38ABEA1C74DE06E6788CB1790AE9F0E8AB35AFE60B001F45971D42949263AA62519B0D630281A4C5788D5591B1EF5A003C58987E8665701E5B1C6063F93533094E96820F918C354903775CEB6675C4CE9CF940C4BEB8845B4F5E1F642BF505821E5A23122E2D1ADB82A63AD18CD1E4775A96CA9EF9493D75FF784A2D4A99F54DC3F87828BDFF4B3A3D98FA5A29B62A85CAAFFBACE4592A81BFAA5B8BAE6606AD25A92A43140690A6003AA2D617FC707A53EC9D868E33596E098773942D798263F58FE5A1B23046CFA136EA35203B90BEA2C5F0AAEB5EA8C24B8B8CBA14CDEE28F45D0278F193228484BCC7E08A75D0064D605D674ACA9019A0A9AAECD6AC672CB8410FEE4192E6DCA7855FBB1C584CF288BACB40707D7E6F8BA2956F6D099F52BC7B0AD72B5A3FFC03C7B47086330244EA5D393C6B9F256FD82D5CB9436A469ACC3F8FC237146895BE148749F82D39B7BA4CE47715BB393A96AB471665529AB9E9958B12396C1BA7529DBF289184FF0F635C2BA9DF301036C869D52D993463222B70BA778E81C8DC668DE41C0356EEF5C39F1BD42398BFF30F959E115C6B386E73F0FE28A2665BD463C781DA1C46D6D4EA284B152C8C12426DC9CC467809BFDA6FBFBC0BB4793BABBF6AD564D57AE9F5E2B7F651D6ED980F8B1174A126CC58B23C32BA73F5031B3FCABFE7BC360AAE412D799CC14D8B252D9F9EC9005B7FCA04A88CC8AE9F7AEFCA94137003D5764FAA3C7C45670585C84F74C4EBD1F5AD1F97EA093595592FB90E3CAB01F98F06E114F13DE67CDC36F3FFB01C3D51EA643C25A3F6AA2C57690E42B98583D925AC7B06A349782A1D33C06BD05A82A7AA3DD679326D948D74A1861926B45DB78D36070D3087AA9C5F4F42CA57EE9CE7035BD88A85CE1107C8E07E5BA3A62ECF012BC75FBF97C4C72331B55AB9A6EFFD78869F1CD3F330526F262F7DFCFA2B084B61E90772D5FCE8F038C0F72554467192CC8A27F1F53C8714DA1864815974B00991F466648478C5F9BF036DC4083D72E8D144AB10FD32408DA7677729347FEBC79E48E7B87388D9B59AEFC84B5B3B589FD91863811A6436ED76B43E657F7EE03EB796285A4D93BE9AAAD1E1A1E81687E42EC83F3DD059B78BB7F8EC70E6C831DB5E90C6B3AA511F36507DBC8E7A77DF0F5B9EF03BFEFE9471DE7C7FBE67B9922260D3703D95A5BFCBCB62D830E20C23C6CFDDC210E47CB575957D8C3514A2ED4561C738928F210057896EAEB1499D4DDC70F44E30661E780AAF5C0A20C8553F40D7D3FF6D120511C1073510D04F2DE544121AB851E98F666906367C21302EEFB1AAA723F6A531C454EEA0BE7D50 - -count = 65 -seed = 238461A224ABEECCF709AB6CACF4EDD372D45E5F4274095273A49AFE614F2BF713134ABF68B4DD058E6D7B612C3658C3 -mlen = 2178 -msg = 99B5B6FECDB52897A1958C5C3D1FC2F20B7D045F551856EA3CB441BAD9089C64CB9489DB6B63E0655AFC4C2FA73C7417FF1B80B9C7A1D659687D2C415B3A909CA30E96849D4BCEC6A9A6A4311204936BA972086B2394D86E840770D01550CAA6AD85ADC0EC851D2B3808E4A0E9830B99A70F6204ED4DBCB6759F6228126039607AD7ED8EAFEEA28D1C3E25A46BC18AF7E01F55FAD8244F15DE36F890416AA09548554338972C5F88FD9357792819E51A63D0B872B0A4D21EA3597405B52793D50C6CD70B52841D53484BCD3EAD004CEF0A6BC16CE74CB8AD0848000D8C5158DC16625112D1D85D17A3C1C8BBDAEA42C3A43E9930724655592116C4C6D0B8B223337EE4E754541A09D898F7FED71C3785B7F8721653986C525BC00F15590616437D11F9722824DFDE7E9615F1FB8488E5327E4D8BAF5F79D1FF5E808D154951AD87638910607B03FAAC3A61FE9916BA65FFD16986DEB4169BD24A72B1C8168FE569F3C81F93F3EBDD21D4E806F79FB28550912E9AFFFB52E97860C4DC0D042C56E1BB71C28B68E416874EC7043306A29BD1F4B9A3E612A6778315E2C2B850D6EAB9FF1905030FADA250CAF308735393C191134F3C493D00B5695775D82ADB9F2ABDAD17FC41FBD7A1DEFE337C2F8ADF69154CC0862FBD43035295B1A9C80B88FA8CF75B36CA08868F881966B41FB3E239EB1DB9CB51606A0A9EBCD552B2F4E819E2C30ABDECCDDE88D2D2F82F3585B5143943C929591D20CEF559CD2BAF2DC7FE03C9E4E084E8890FCE64A4AA9F13D5EB945AD7E3CC53E01FCDC192B97ADC1F98D9E773A0177E8D97405808EBF48BF17B689BFC15F4C515E38A855A9266230C9085ADC9A6DDAED93D80C3F38BC516695D202B4E89DA5B4EBC43788C848F8C4A72F79F37F857EDC105F13E4ECECFD09302711BC1993F5308B8F32AB96FB8EC3F5EA0531DAFD0AB3451F81F47E62C593C8D3E3BEEE79DB06909576BF876145856F5F716CAA436C98EAB28C5B85BC2E4D7E1653ECBB8BB6B5BD6981DC72D7F63BA06CAC8197ECCDC72C1481DB44724A3C21F7FC60661F11FDDE8122DA5D0B1D72A29952618B373423A892875E6AD24D0916109ED8E9A9A8D9A68ACEC4BB5EEB0D00EAEA72D8D5A76C2A42F18CBDB3D336B71C70AC73D39D7EB04533453779A1F210BB4FC056B4728AFDFCF46675C6AC76F750626D642E3AB117E5D6740154759A46C27D51306587650E1039054B876849882E7DFD807BD03E69021E337DD69D9B097722C6D2AEB517D773D2F7D84D69DABE1A1D6422EA1766C0FE7B8DD4D7283F2985D96D91A132B8BA03AD85F7D56095773222D0AFDC5A192D29F3BB0C2539A1C99DB4E711B6ACE3FEBD58E45E99C9F5A04CECBB309D50397F28C48BB9CC9F9CF75A52253B634EC47216A1FD6358AF26501821864569879BE1736B0AD242AB5B8ED16A7EA0989ED4CAE3567AFE1F8209A028DB46DB0270B3BC06668A9BF5E1BC1061BABBA00EC4EC37280379139D19BC6072CC6B7D260A816CB82F9BC90897BE3025475AF12191690F9F400A914789A860155EFD2D606A15895378C827F2A4FF700303962FD96DB2DCD2D213EEBB2460F0B753BC6902DA81D44C983DD027F1171D40A2039997241E09AE5B6165B4D55A8E4C79671A8B8BDEFEF2C21F81C541A5719DEB939F866B61BE250AF371CEA7B7525094C904698D412737F7781BD779365F122EE627D9CD4A68DA9D5BE1B0431998AACF824CDD864C7365C01CD5A5F480B6AC1E5FEAD8FFE40D87C1F9FCE81867157242285C5E76CF9667919C29A67CA0C0A61D7819D9EE6B792250A358F5691CCD80578F15288F3D5D6D7DD6DFA351FCF8DF0223F7D1DA1B76711FBE0E7FABD30377660ACE7B23ACF03ABC1D973248CDD0897773FB74E20481EBD3E52657C9296B980905AD29271EC128513284F1B78F38634BF84CB80791A0C5649177791CDAB87769D57B626F78A03435C758A207F52BD2A1F31E34B6A122B8701CD9FE478C57CF3535B6D51EB46CAF794BD69363D5A56ADDE6945E9788F1E1DFD045BFBD0A68834B13D6B9EC4EA9C860EEA0E9AC19C2DE14FFBD6B57E5992B08943EA0283813F3F15E4F928B8D0F13DE6863990F5C77F130C97D8BE12571EDCEC7DEEC4B6EF4835F136DA45DA70A11F9192478FD8B4846C507410FD11668365B05252E68CB2C972ACF50156E369B83BB85E62E4BD4D84C2E9FF41A5844D5D88AAAE7DED852DAA0AE5C14A5DCE64C7E236E9B7B60F5B5AD4D953A2D842A52929491BE3555AB8DF534CAD56DBBB86B28A8A86B7BD9AD1C58C87B8A089324E00FDE32F8186B2B74523A22904C18ADE02C3E965F94624F8DF57E750EA6335E3EBA705294B76CD6ADA33D90FEC1F48DE7BA9DC7D8D60A53D2563964188874810C45736C57EFBC3A3CEEE7238AEE5281882A554F2143BDF89ED4BD819C08239C187C12A8B6E763434B92C26FDD658B350F51775C60CBAB7A2CB120DB8CE8AE9AAF6AF559F8CADE84C4820209CBD27CC09230B22F013A0E4CF8041E4A789A5D20BE9914A624AB957318848ADDB39C9748C8922C54327048A2E46523BFB22487538363459035BA49858F85A469957DF1F4831BB7FFA0564C53233B99B596F5356089949306DEDD6B904433D25C4854A80590B964DF6B0703B4F9628D6B9A4D3F0A4096E9A0B46D6B32F66D563BAF688ADD18DE001DA62E33C503A4387CE0920BA5D1E8B69C38E3745B19F8D8B6CA5E1AC6DE90EDB25FC32DF04F0849D769FBED3F8169EA1D2252619A2304E055370B4443CD23E56D4934F9F3FC92F1C1EEC626657E6A89C1394E56061AF8ECE3E2A17FBAAA4D579A99A7998632A6AE2683DDFFFFD27A27C8815511855F09ADFF7BC627A7A5C95FE57FA3EF81F494FA7EA6E6CA2D14775A25BEAF1B5A3E35ECD4A306545D597E4E44301C3D1648F0A7D841F2F76FE59C6EAFA3F5B58907FC4E642ECD28D16A71EE3D295F1DE12DE1485B9CEBEB2CC6C9AC051D3D42B6A1A068533A7680A98D015B09C5B819FFC61688D441C1B7FD71180C4423E64EE940917C7DFAA19F3F51CB5B38D1B2B7C81D10E7C -pk = 7C5169BFBD87266C73D0823CD1913C38ACA58DB8D408EED86736FB0B7D26C12990E3A26F83B435EB4502BA6A38E6F4F1441F1D1A434DE6C0AD6630D7EAB4AC01 -sk = 7C5169BFBD87266C73D0823CD1913C38ACA58DB8D408EED86736FB0B7D26C12990E3A26F83B435EB4502BA6A38E6F4F1441F1D1A434DE6C0AD6630D7EAB4AC010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004C486EA41F6BFBAB396DC96B8F3138CE0680135DA4DAEB23692AD4BAE07540ED3DE52CB6083573A6BADCA3F85BA304000000000000006117690EEDA4586E7578BB9FD31F0B0EF24109B66DD01A0988279F7BC2E4E203DCC9502F7A796CBB69B877F56FA7FEFFFFFFFFFFFFFFE196A6AA0EA15BE3B5375361E3D7315073CAE34F0EE045BD0DACBE442C51F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2CDAAB0144B400E0CF33457676C657352366C3B3DBDF1CC526E80CF318FC040000000000000000000000000000000000000000000000DBC19642FACC6A6F7FE9847866715EC2A11780B3E4840C00FD42C63B744A4C32E88810FE355ED0DC74BFFD27D8688F3E610CD0D1E9A16D0740AF80FD53278F046DAF03BA35A7869CF710FF4A3588E1EDEC7F0831C30F040354F44B3C001E832D0CD3CE0168982DAAB4827B07E0654B8C139DAAFC251647F95A848A06A2FA1F1C5CC2886ABBA3A0A01979FB500885DBACA405283BE732D2FD926D5AD06E574134073B6436BA5E278459854CC3444EA428B3BB288EE62E59A5F0BC531BEAF5C81BEFF4920B17B68D09E8DE0CE5A2E3D61451256A55C6AC034126E8B4159F7EE810A07FEFE72140FA3B12E5B5B08A8D31E82B527F595404F2AB454FC82270E0A50DBC97C0D87CB447A0C96DD690E175CED4F53788C1F29F9779F1DFE9AC88FCEE27A1EF9EDC3224B9945E2FAD384A7920B87253587371C8A4433005A37F0D48A20472186847623B03D022AECC0E23A499767E6E89BEC37CC7677D9B4C652D05040B4C0A17C200EAE29ABE85DC93BCA7818FF20B2F76509A088077954A8958AB3900A72588FDDD06844112A3CDCE0EFCBE9D5AA44D4F60C2E5302A79BE2358F14F2F4CEAC2008DCFE40982725DB4AABE7A3472133FA66822BC7BA7FB514D8186D226 -smlen = 2355 -sm = 76513B191B1ECDB59D07B0D45E8C6578FF188B047017213D747FA3A13B003B59983797F878AD7A05B38EFD918106D135E503CE33B333BDD81F707C078D7C5C1052CEFF28080739DA931B75172505F906AA940AB13848C6FBC5026495929085D247E68E0797211545C291C9B6EC031D689AB30E635A2B940473D4CC5746058897AE067EBD31BD709E293BE6040125182B32A837A38689B0A8A9F7E32D4105034120E519304454DC6805167E2F6398C8000299B5B6FECDB52897A1958C5C3D1FC2F20B7D045F551856EA3CB441BAD9089C64CB9489DB6B63E0655AFC4C2FA73C7417FF1B80B9C7A1D659687D2C415B3A909CA30E96849D4BCEC6A9A6A4311204936BA972086B2394D86E840770D01550CAA6AD85ADC0EC851D2B3808E4A0E9830B99A70F6204ED4DBCB6759F6228126039607AD7ED8EAFEEA28D1C3E25A46BC18AF7E01F55FAD8244F15DE36F890416AA09548554338972C5F88FD9357792819E51A63D0B872B0A4D21EA3597405B52793D50C6CD70B52841D53484BCD3EAD004CEF0A6BC16CE74CB8AD0848000D8C5158DC16625112D1D85D17A3C1C8BBDAEA42C3A43E9930724655592116C4C6D0B8B223337EE4E754541A09D898F7FED71C3785B7F8721653986C525BC00F15590616437D11F9722824DFDE7E9615F1FB8488E5327E4D8BAF5F79D1FF5E808D154951AD87638910607B03FAAC3A61FE9916BA65FFD16986DEB4169BD24A72B1C8168FE569F3C81F93F3EBDD21D4E806F79FB28550912E9AFFFB52E97860C4DC0D042C56E1BB71C28B68E416874EC7043306A29BD1F4B9A3E612A6778315E2C2B850D6EAB9FF1905030FADA250CAF308735393C191134F3C493D00B5695775D82ADB9F2ABDAD17FC41FBD7A1DEFE337C2F8ADF69154CC0862FBD43035295B1A9C80B88FA8CF75B36CA08868F881966B41FB3E239EB1DB9CB51606A0A9EBCD552B2F4E819E2C30ABDECCDDE88D2D2F82F3585B5143943C929591D20CEF559CD2BAF2DC7FE03C9E4E084E8890FCE64A4AA9F13D5EB945AD7E3CC53E01FCDC192B97ADC1F98D9E773A0177E8D97405808EBF48BF17B689BFC15F4C515E38A855A9266230C9085ADC9A6DDAED93D80C3F38BC516695D202B4E89DA5B4EBC43788C848F8C4A72F79F37F857EDC105F13E4ECECFD09302711BC1993F5308B8F32AB96FB8EC3F5EA0531DAFD0AB3451F81F47E62C593C8D3E3BEEE79DB06909576BF876145856F5F716CAA436C98EAB28C5B85BC2E4D7E1653ECBB8BB6B5BD6981DC72D7F63BA06CAC8197ECCDC72C1481DB44724A3C21F7FC60661F11FDDE8122DA5D0B1D72A29952618B373423A892875E6AD24D0916109ED8E9A9A8D9A68ACEC4BB5EEB0D00EAEA72D8D5A76C2A42F18CBDB3D336B71C70AC73D39D7EB04533453779A1F210BB4FC056B4728AFDFCF46675C6AC76F750626D642E3AB117E5D6740154759A46C27D51306587650E1039054B876849882E7DFD807BD03E69021E337DD69D9B097722C6D2AEB517D773D2F7D84D69DABE1A1D6422EA1766C0FE7B8DD4D7283F2985D96D91A132B8BA03AD85F7D56095773222D0AFDC5A192D29F3BB0C2539A1C99DB4E711B6ACE3FEBD58E45E99C9F5A04CECBB309D50397F28C48BB9CC9F9CF75A52253B634EC47216A1FD6358AF26501821864569879BE1736B0AD242AB5B8ED16A7EA0989ED4CAE3567AFE1F8209A028DB46DB0270B3BC06668A9BF5E1BC1061BABBA00EC4EC37280379139D19BC6072CC6B7D260A816CB82F9BC90897BE3025475AF12191690F9F400A914789A860155EFD2D606A15895378C827F2A4FF700303962FD96DB2DCD2D213EEBB2460F0B753BC6902DA81D44C983DD027F1171D40A2039997241E09AE5B6165B4D55A8E4C79671A8B8BDEFEF2C21F81C541A5719DEB939F866B61BE250AF371CEA7B7525094C904698D412737F7781BD779365F122EE627D9CD4A68DA9D5BE1B0431998AACF824CDD864C7365C01CD5A5F480B6AC1E5FEAD8FFE40D87C1F9FCE81867157242285C5E76CF9667919C29A67CA0C0A61D7819D9EE6B792250A358F5691CCD80578F15288F3D5D6D7DD6DFA351FCF8DF0223F7D1DA1B76711FBE0E7FABD30377660ACE7B23ACF03ABC1D973248CDD0897773FB74E20481EBD3E52657C9296B980905AD29271EC128513284F1B78F38634BF84CB80791A0C5649177791CDAB87769D57B626F78A03435C758A207F52BD2A1F31E34B6A122B8701CD9FE478C57CF3535B6D51EB46CAF794BD69363D5A56ADDE6945E9788F1E1DFD045BFBD0A68834B13D6B9EC4EA9C860EEA0E9AC19C2DE14FFBD6B57E5992B08943EA0283813F3F15E4F928B8D0F13DE6863990F5C77F130C97D8BE12571EDCEC7DEEC4B6EF4835F136DA45DA70A11F9192478FD8B4846C507410FD11668365B05252E68CB2C972ACF50156E369B83BB85E62E4BD4D84C2E9FF41A5844D5D88AAAE7DED852DAA0AE5C14A5DCE64C7E236E9B7B60F5B5AD4D953A2D842A52929491BE3555AB8DF534CAD56DBBB86B28A8A86B7BD9AD1C58C87B8A089324E00FDE32F8186B2B74523A22904C18ADE02C3E965F94624F8DF57E750EA6335E3EBA705294B76CD6ADA33D90FEC1F48DE7BA9DC7D8D60A53D2563964188874810C45736C57EFBC3A3CEEE7238AEE5281882A554F2143BDF89ED4BD819C08239C187C12A8B6E763434B92C26FDD658B350F51775C60CBAB7A2CB120DB8CE8AE9AAF6AF559F8CADE84C4820209CBD27CC09230B22F013A0E4CF8041E4A789A5D20BE9914A624AB957318848ADDB39C9748C8922C54327048A2E46523BFB22487538363459035BA49858F85A469957DF1F4831BB7FFA0564C53233B99B596F5356089949306DEDD6B904433D25C4854A80590B964DF6B0703B4F9628D6B9A4D3F0A4096E9A0B46D6B32F66D563BAF688ADD18DE001DA62E33C503A4387CE0920BA5D1E8B69C38E3745B19F8D8B6CA5E1AC6DE90EDB25FC32DF04F0849D769FBED3F8169EA1D2252619A2304E055370B4443CD23E56D4934F9F3FC92F1C1EEC626657E6A89C1394E56061AF8ECE3E2A17FBAAA4D579A99A7998632A6AE2683DDFFFFD27A27C8815511855F09ADFF7BC627A7A5C95FE57FA3EF81F494FA7EA6E6CA2D14775A25BEAF1B5A3E35ECD4A306545D597E4E44301C3D1648F0A7D841F2F76FE59C6EAFA3F5B58907FC4E642ECD28D16A71EE3D295F1DE12DE1485B9CEBEB2CC6C9AC051D3D42B6A1A068533A7680A98D015B09C5B819FFC61688D441C1B7FD71180C4423E64EE940917C7DFAA19F3F51CB5B38D1B2B7C81D10E7C - -count = 66 -seed = 83C653708FAF3E5F6FBC9DFBE6FB5E83E572A7688645D75D2C4835B28695DEA4BD7093740D0FF43237354EAD1C978BC2 -mlen = 2211 -msg = E3B57B208352A820F622A694B7C3F6F297239EF0A069615DC664C02F1822BBA48E11E37BD9749C98FACEFFFB0FE1792A386BE10CA7B98CC874C68C36F5096D3718DC93E0734D6D6F913E3B958DC1FD1424818C9437B0FD59728ED46A79FB52C737A1D1D26F04EBAC279A7FF6A971E2B69576B712D9224EA18FB9BF4E613A8935F3B36A073B01F37BDC0B77981C8F2804E93C395419352B85C8A32DD77D41DA9BF3ECB914173E80DD1FC06E8FF5BF0E4F7424849A15EB7FAF7DE77456EBB64D10DC10FEC6254070C7DF387397137372EA3A53DFDA7DA13414AF2DF16C1E38C5C70A5F5F44F725D622049256BB15DC04A8D846A1A0DAE7E765A7F00C498F1D0B2893B8405BE4A43FB7E97881069A49134A2A847184B82EB5A690D87BAF2F579619EE19A3D7A7C7EEA72D6E3FCCF0A8092BB8D3C6B551F27E63E762A30B4A4DF2DBC4D119139AE1B135D06FF827846901577700935E0011B65461C2EF9A7B71EEA33C8CA4519C7BCFB557C5E1D42D9243F2DC34057F5E0CCB9A457FC34DCB10D9B47F6EC3B9550D3AE4FD593DFA3E28C6CCA1FF1EBC9D98DA8DB869F8C80BDBF8AD4684ACB6A779CA9D0A106F26DA17043773862681C5DD2DEB1BCA2CA48D4FBB4BB7C1F765DCA3A1D991D890B9A8751CEAFF543997FAE5B128AB2EF22B3BE94499DFD9D8E78FB4C82CA8D296B0415E84CA8B5F2024455B5DECC8B4CCDC7BC4EE06B4F0C66E6748FBD07E3A3BC5B4B6889C40DC4A97AE3EB43C3914DEF976EFE3BFD84A093BD69102D7B37C89B458A55B98A1974A13A7685D26E9D816C79585BCFC1042C2AF88534A9FE8B0A6C8C44355A6D606F902DB40D5490264BF0F352C27355633CB095268D5B8BEC985A62D84B2323FE814053F05DEDC22029D2998BD0BCB255C162C4BC03F60E3580AC3AE86C37850110E9A1BCBD75F64A0DD60B941E2F57DA9D72498B3EA8324EEA53DA3895585ED2942B9140F260895DC6A1131A4C3AD2B64028BB8C0FD67E1BE4C07F808B47DAEF306FD9578025F9C639660075837B2C95473F7F860D6EA2C53F4BA677A2345CF212C7757BB94F1A4F76D4E96625F6FE051B8246D1B7611BF6FE325FFFF8514D2F9A3453F0E77AE8B958AB5B567E541F156C6F4D315B4C3C547D59BBD0D7403E2E6A49B9E7D3FDBA338ADA41875CEB03830A846A1FB266C0F1228AAD2B76A2E3404278DBE482907206FA66487AD2C999867F870C8CB7A70B83437E14B9E893BF6B391DAD75E84588E882246D161799ADEA63ADF1AD706C0A3B76BAE595D84B21AE9DA30BBC0856987F2C2C543D977747B8CBD5A613B92804ECC5284ED23650E9DAFB4B76D63F069710897334F18EA6B0CBF99CD590A78E3B050E1BB24C86D6323A17106F0CAE3F30B01E4EB3DB1B5F3A4771A880C8AC06BCD5A82D4103D0452FD7B54834C1CF8595DD77F82D4AD9EBC1CFD0C9A8CC787E10AA4D1688474208B69FF7AD4DA6986E5F62A34AC3093E0FB1EFE8AE3A96F6AAE09B0E8F6E7A2B65C7387999CECCA43CC33F026DC19BBFD867C48127CFF579D1D71AFF0C4A0E20F9FDFD599A6169DF1B85F6051E02290DF6F5EDE4F29BB6F0C8F806D6850C6534ECDDCCD75BB8E4A097C70445585740F822E5CEBB0E19EAC82BB78EBDE2CA60A810AC6C54119FD6427DA8A0155EF48653515A919B299A306FD3C62B505A6911DB2B56CA2F296E487BA02C546ECA2783ADE8E46A8C78EB1F3D7C04BB24548F92383E475CE6E572D8DE1BFA9B3E35D9BD6C79547B592C95693750010A3D22CBB31AA5A4ABE94897831B1ED9287631F006A735C36BC84A8C87497EEA4873801A733F35B328C7D2CCBE4A41C193D22F972571BA7630B33080793498CC85E6EEA1C412914459DA175A6DB8658D0BD7A823FAB286EDC20C785C40BFD539924A24AF4E3D37BD781353677C76D4672098F5BDD17017012571D9AFDA05A40AB56998E40F5E359C43DFE32CA10A45BF08F67D128C24B1ACC03CBAC46BA6CA5A532C105E91E0C77ED59FB534AEECD68735A4978177BB5A656B9F83B202BB604D61A24574C16656E512C0A4CC6F597B3268573E10539D1BA775ED83BB680BB9115011C6AD43FBB66FB37C467249060A1586DF27B2CEFA65265CCB9051E468000CCAE24F08BA941A8180A64BB624F146C8EC562363B32C369F62997C4B1375DD7DE64725A598529244273CAF8398913C6FC01522683CF1F9F965C491ABE7A554F0019514ED98D75EB8BB8565F77C195F629F98163494B4AA2674F92A41DCB67EDD1D818A5B98993D0B1198BB6BEDABBB486BC6FDE039433E842BAC568A5B4EACC028CC2544B57D8883848DDDEE2E967EA85A6102BD0ABDDA41C3D78447BEE1D4949449ABAA9B3377E8CEDCF04A500FD1A6916E26983E64B5E96FEF87B32A060444D374409262453CB1376C349A8B5D1767B1E2991A1A6044E0F58831BD11F12159675D215D7EAA74807C995FE22017E30482DB8A4B09CA7800822C75C92FF649FC0728F5A1D44EFE7D0FF147274152D5F2F60342C8F5F951D8C95F83C1D54613A182D9DCA68F54FD55047F1F90CFECC04D733DFA82CFF2618F29A4DB4F7E1E59DEAD58CA65D07CC90C25F804A895D6A82F9375451CC55506D276FBF783F7D4D53B9BFB83DBE4A8771AFE21AC543983D68034BADC980F9434527F9EDAA2E228646FDF75B44899E749CF4C9E5B345222385A4424382603AD6EFC24C56E769028F4394F2F6220A9B390D395E412498E57A08BAD927B8BD5D76E18E8FEB457FCBD3248D218236B07783E57FBFA03C292A9F5719E6AEF2EEA3FAB2CAEED5442E89BFFB236CB13DB2CF9C35A38C338C377C475DAF45F8EA822F9AAAC13425FBD43D3DD9229367F0B3687D7E82AC5EC2FC7CDB69C99A4EB1B8E45465C6A53F16AC0C4E0C970B8C732AF515C09EAF25596F64A04AE4621037B8841FD2B1BBCB310EA23E122B0B9AB96D8F7702952D0E96E4CF79C2A30DF0091ACDA91479EE2979B0054997C48F6A0E909BC52A943459AF25553969EB31CE7685369A7FB014561B4697B8BCE220983136E5EB2303CCA4EADD4C6CC74EA2FE69D448AE6ED953A80363DDED5591B27A1EA956DF081CE99AA59DFC789D9D8FAE952B0737099D467D -pk = 2F43B584ECC591871205314C879D1021242FEE2DCA586A392FC51C69B60079268358726589D2B5776B9F53043C86C59C0BB93EA30A1F3BD823D8D8C746B12422 -sk = 2F43B584ECC591871205314C879D1021242FEE2DCA586A392FC51C69B60079268358726589D2B5776B9F53043C86C59C0BB93EA30A1F3BD823D8D8C746B12422020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EC87086203C6E5B0DD67C6F0CDA899802CB489A07E6A33341CE3680E666BA3B35D5654A5B2141C1BC63A230A7DE5010000000000000097A834C555F17312F48C391E0270DA4A55BD0E71058EDAFEA53DE212BD955F6B482B6B4CAD884BC9FEC3D0A27192FAFFFFFFFFFFFFFF177A87ED12B8B6BDC4D61E6CC6896C3A7F042DABC078362F768B239640250000000000000000000000000000000000000000000000007489E0DC1D76FC78930DBDFFC1F89CAC00B0E2D4B3840F85948615C96BAC060000000000000000000000000000000000000000000000E4F3EA1FD23D4375E48ED46D3A7DA5612CDA6713C83E561F8CDC226E8C958B03F4D3459F117FBA48E9C588B9DB8F2F7546204047B6C37B0C612468A555F5D50605AF355A3FD79B7F24CF17E0C96E66F51B78DEE78837619BCD00B0C32A0CB90B63F9B25F53CECAD1293FCF04D681ED8D8C0EB2CA620A6A954BE5E0F0E5761D20B8E8862BB16AF082FEFA36E7D27C6802AB0963BCEAA14ADEEC79C325FD4A46113B4EC5168EF2286852AE0E066CDB2FA2032FC032759FD31DAF8FD8885A8DFA2651F30234069D2D9CA5EBB7C9380EDF0FE4FAF8940A20C233F9D76FF61742C41F2C6B04B869F3C5FE91EFD6D665075ABAD093500CF7A6CE6BC0549C0A92D4783436749A877C341C276DDADD85B9ECCE48EC59BB4A7957CF06F0DB386D5BCF752220AA7C6C279344B1CC0CF8C60D591840CB36DB66F9E903B6232697F1F684BE0C75747B56599F20E06DD4CCB900C7993A50D68FC3CAB45217BBB5DACDEC0A69149C252C7EDB59BF6491EC45D9328BE80B8E997000F0BED7ED9D56D10CFDCB892A6C7581522DCD6E993F5336BEFFCD39388BC46710C8C90CDE8CB1D63E5257031B2871D7470ACCBB95612BD253B1B8CAA1D891533F8F0BEAFBA3B3A03178DDE309 -smlen = 2388 -sm = BCC51A90D548A003F805BC831DBC1B2398B14E06C7C6A1757B9FA6FADF042E53BE643B0A51907E020C6D596FDFAA15B45603FF7910EAEADAB5CD9B0627A60856F4DCAA46E300DBAAE59BFEAB74F9A704C8CD5A4864195548E3061269D125F3FFD091F506FDC00E5F8A981734D5015D92076C00D5336EB0077E892ADA687B2C9CAA04737557863C774E7EFB0300055F25956B9FB2FCA193317D886766C00C03558EC07B83A6A1D78D000E72B008DACAC700E3B57B208352A820F622A694B7C3F6F297239EF0A069615DC664C02F1822BBA48E11E37BD9749C98FACEFFFB0FE1792A386BE10CA7B98CC874C68C36F5096D3718DC93E0734D6D6F913E3B958DC1FD1424818C9437B0FD59728ED46A79FB52C737A1D1D26F04EBAC279A7FF6A971E2B69576B712D9224EA18FB9BF4E613A8935F3B36A073B01F37BDC0B77981C8F2804E93C395419352B85C8A32DD77D41DA9BF3ECB914173E80DD1FC06E8FF5BF0E4F7424849A15EB7FAF7DE77456EBB64D10DC10FEC6254070C7DF387397137372EA3A53DFDA7DA13414AF2DF16C1E38C5C70A5F5F44F725D622049256BB15DC04A8D846A1A0DAE7E765A7F00C498F1D0B2893B8405BE4A43FB7E97881069A49134A2A847184B82EB5A690D87BAF2F579619EE19A3D7A7C7EEA72D6E3FCCF0A8092BB8D3C6B551F27E63E762A30B4A4DF2DBC4D119139AE1B135D06FF827846901577700935E0011B65461C2EF9A7B71EEA33C8CA4519C7BCFB557C5E1D42D9243F2DC34057F5E0CCB9A457FC34DCB10D9B47F6EC3B9550D3AE4FD593DFA3E28C6CCA1FF1EBC9D98DA8DB869F8C80BDBF8AD4684ACB6A779CA9D0A106F26DA17043773862681C5DD2DEB1BCA2CA48D4FBB4BB7C1F765DCA3A1D991D890B9A8751CEAFF543997FAE5B128AB2EF22B3BE94499DFD9D8E78FB4C82CA8D296B0415E84CA8B5F2024455B5DECC8B4CCDC7BC4EE06B4F0C66E6748FBD07E3A3BC5B4B6889C40DC4A97AE3EB43C3914DEF976EFE3BFD84A093BD69102D7B37C89B458A55B98A1974A13A7685D26E9D816C79585BCFC1042C2AF88534A9FE8B0A6C8C44355A6D606F902DB40D5490264BF0F352C27355633CB095268D5B8BEC985A62D84B2323FE814053F05DEDC22029D2998BD0BCB255C162C4BC03F60E3580AC3AE86C37850110E9A1BCBD75F64A0DD60B941E2F57DA9D72498B3EA8324EEA53DA3895585ED2942B9140F260895DC6A1131A4C3AD2B64028BB8C0FD67E1BE4C07F808B47DAEF306FD9578025F9C639660075837B2C95473F7F860D6EA2C53F4BA677A2345CF212C7757BB94F1A4F76D4E96625F6FE051B8246D1B7611BF6FE325FFFF8514D2F9A3453F0E77AE8B958AB5B567E541F156C6F4D315B4C3C547D59BBD0D7403E2E6A49B9E7D3FDBA338ADA41875CEB03830A846A1FB266C0F1228AAD2B76A2E3404278DBE482907206FA66487AD2C999867F870C8CB7A70B83437E14B9E893BF6B391DAD75E84588E882246D161799ADEA63ADF1AD706C0A3B76BAE595D84B21AE9DA30BBC0856987F2C2C543D977747B8CBD5A613B92804ECC5284ED23650E9DAFB4B76D63F069710897334F18EA6B0CBF99CD590A78E3B050E1BB24C86D6323A17106F0CAE3F30B01E4EB3DB1B5F3A4771A880C8AC06BCD5A82D4103D0452FD7B54834C1CF8595DD77F82D4AD9EBC1CFD0C9A8CC787E10AA4D1688474208B69FF7AD4DA6986E5F62A34AC3093E0FB1EFE8AE3A96F6AAE09B0E8F6E7A2B65C7387999CECCA43CC33F026DC19BBFD867C48127CFF579D1D71AFF0C4A0E20F9FDFD599A6169DF1B85F6051E02290DF6F5EDE4F29BB6F0C8F806D6850C6534ECDDCCD75BB8E4A097C70445585740F822E5CEBB0E19EAC82BB78EBDE2CA60A810AC6C54119FD6427DA8A0155EF48653515A919B299A306FD3C62B505A6911DB2B56CA2F296E487BA02C546ECA2783ADE8E46A8C78EB1F3D7C04BB24548F92383E475CE6E572D8DE1BFA9B3E35D9BD6C79547B592C95693750010A3D22CBB31AA5A4ABE94897831B1ED9287631F006A735C36BC84A8C87497EEA4873801A733F35B328C7D2CCBE4A41C193D22F972571BA7630B33080793498CC85E6EEA1C412914459DA175A6DB8658D0BD7A823FAB286EDC20C785C40BFD539924A24AF4E3D37BD781353677C76D4672098F5BDD17017012571D9AFDA05A40AB56998E40F5E359C43DFE32CA10A45BF08F67D128C24B1ACC03CBAC46BA6CA5A532C105E91E0C77ED59FB534AEECD68735A4978177BB5A656B9F83B202BB604D61A24574C16656E512C0A4CC6F597B3268573E10539D1BA775ED83BB680BB9115011C6AD43FBB66FB37C467249060A1586DF27B2CEFA65265CCB9051E468000CCAE24F08BA941A8180A64BB624F146C8EC562363B32C369F62997C4B1375DD7DE64725A598529244273CAF8398913C6FC01522683CF1F9F965C491ABE7A554F0019514ED98D75EB8BB8565F77C195F629F98163494B4AA2674F92A41DCB67EDD1D818A5B98993D0B1198BB6BEDABBB486BC6FDE039433E842BAC568A5B4EACC028CC2544B57D8883848DDDEE2E967EA85A6102BD0ABDDA41C3D78447BEE1D4949449ABAA9B3377E8CEDCF04A500FD1A6916E26983E64B5E96FEF87B32A060444D374409262453CB1376C349A8B5D1767B1E2991A1A6044E0F58831BD11F12159675D215D7EAA74807C995FE22017E30482DB8A4B09CA7800822C75C92FF649FC0728F5A1D44EFE7D0FF147274152D5F2F60342C8F5F951D8C95F83C1D54613A182D9DCA68F54FD55047F1F90CFECC04D733DFA82CFF2618F29A4DB4F7E1E59DEAD58CA65D07CC90C25F804A895D6A82F9375451CC55506D276FBF783F7D4D53B9BFB83DBE4A8771AFE21AC543983D68034BADC980F9434527F9EDAA2E228646FDF75B44899E749CF4C9E5B345222385A4424382603AD6EFC24C56E769028F4394F2F6220A9B390D395E412498E57A08BAD927B8BD5D76E18E8FEB457FCBD3248D218236B07783E57FBFA03C292A9F5719E6AEF2EEA3FAB2CAEED5442E89BFFB236CB13DB2CF9C35A38C338C377C475DAF45F8EA822F9AAAC13425FBD43D3DD9229367F0B3687D7E82AC5EC2FC7CDB69C99A4EB1B8E45465C6A53F16AC0C4E0C970B8C732AF515C09EAF25596F64A04AE4621037B8841FD2B1BBCB310EA23E122B0B9AB96D8F7702952D0E96E4CF79C2A30DF0091ACDA91479EE2979B0054997C48F6A0E909BC52A943459AF25553969EB31CE7685369A7FB014561B4697B8BCE220983136E5EB2303CCA4EADD4C6CC74EA2FE69D448AE6ED953A80363DDED5591B27A1EA956DF081CE99AA59DFC789D9D8FAE952B0737099D467D - -count = 67 -seed = BC81485EE93AAD8B464B5199FFEF9FEFC06EA97645BDFE0B4E915B812E606A77F93917ED925E882161CBB909747AC4C8 -mlen = 2244 -msg = 89D960D04A3DF6984276A3D17D59AF9E72B25418C8797170FA701A672C5835CEAA22DC35470D038C6ACC5082D2AE329F36697C91CBB1F9E42DA59A654462BF19E04352192778CB050DB6F4A656F6AB0BD9641CA8CE6C1EF8B020A3D9FD9DFF772F38926458BDA6E6072456E506AE464785399AD7B498AFD4C211F09D0C722FBD9E20890CDDC8C6EB9EE75390E6D76D0672FA64D8B97C65CCA46DD1F542B6D6014F035D2817C4B9430AC8DC318CF8642AB34F4C8D71FC0E3B1FC961E94B6A84622876250FDC21987777360784D9A58F35E1C9B71F30561ED6854EE9B112E7B20CE064272213BD1A46D0D19E5EFAFAAC7ADDF4D7B7A519D689398EAF1E67E64ACE8E5E89756377E1FE458D04E3DF7F6680F8B69815680276ACDBEE6C8E1AA909EC56994F3EF3B65FBEFDBC29AEB0EA906274E838CAC36A0607716FBC2B8DA6150A4EF39E1CD9CCA72915007723C5D2442F7133258234D18A257DA2C13E53B47DC6ABC2D607B98E351FCECEE8BA8886821985BB3A7BD02429ECDC5A27EB04D01DADCE88A324AE44F567593FBF730C284414056FA33CE90A6D6F146DBB1635BD26B4F883D4948DA47216C70D2AA58CEB3979523C6A4F2F7EA455A97C7ADB6C43685D63BD4C51D7DDCB81A06B9BAC31A7B255B94052D686128D234BCB63CE713028451B18B981B83DA1246281FC3BD2B06C741CF71979DAEFDFA0FD06FBA3722FF7BCB2821FBA964FBE9F6467FE583C06D3889A40360A7AA03358175EE75EB8FD1D3368C30B5691776C163764DB924FBA2362CC9572F642CDD2B11B40FA2683A529EC2100DEDEDEAA70A1E639A71D6A96AD31F70A00FB63875D0FD5C21E56AE57B6E74EECD2EF34BB3E20BE5A1F9F1F54955A18B4E4E4B9119973DEB76A2A603FB6410A350667ECE5C1C147DD00B07A88A7D0E86AA2D747A867AD90BA6660C7A0432E20849EF642A20CF5A20AF7E34D139B39DD65C65B36750F17F0B9F1DB06CC6E16F10EB289F567B647454A581604F381D66371238AB785585A4DA2D00810EF6851A6009025FCADFB77FF7996BA6B091FE4130733466B29FED46554FEBC2AD291DD966BEF4D79A9E04014D3003C95696E8BC39892AD32DB6D6AD22D33E931BC87F78114BBBD97B334BCEA676F9E9DB23C0485EC06D8F37F070C143117B1BEA49F06E1A2423D98C12883D32D29103F7699646E7091D393B21A260703E17380A1BD85452702C3AF7DF73AE7856A1C066013014DE62C3C817DD74C44AA436A71490E7BDC6B8B74BF61711FDCC541AD7DC49CF4C3EC154879E048FF30DF25065B5641367CBD3BBA19606A9A27A64055D5D3B538FC88EDA66FF9F26E619DCBA696866DE54A8DC8580B5B28144F952FFC6DC543E98CC9FD7F4538135C0F4DEB4BF892266DCC48A4D1DDCF407BE4FDF2A5AFE4A0105A20CE2B3D9F48D608DE2315240875F1FED696C49CD8D4A78AD26F51B3C804949C536CE35C3963DC1D238516B3F2D297F5C9939A946A0170E185C75087F37ACF907F9E3F87A2B15CF81C7ECBF2165F0F3962D11E9C6A7845ECEF432CE9E1FBE74C77EA1057D79CB595D47A8DDC1D911C6B97AF76D91F3515081B95CED16275DECDEDCED9AC790D73739E35973834503133510DBE39201F9B5C618231184B9DBAFAA7ED6623E8BC492170812444DB62D4F01925DC4F821C0896A746B4453E93EE51844B311B0A0A51601477BFF651EB5EE331227A2E9E49F593EB2988E449E750E990A8A89906EFAB00E0955C81B6AEB160313007B481C40908130597626935389E47AFCB0A20146F0C7B29B567E95D59CED7FA8023A2D69C89443A11E7150A03D09EE6B0F74358141D48E9BCAA3EE081C7D8F8C223F4D48EFB3DF8A4E287FC5B90B4FD251CB616687ED09AB1A06C42EB9D6A578D72E99D499882D216DDB3F35B0A33D9F2D3D4A700161A5C3B5A6729F197479E78009794AA1BE3C25E0B9142613AD2EA508ACAEF5EEE33DACF60CB7A16AB38D9F3CAFD2150081B63A3A6CA0163A25FE81206A37A0874FD55FA3068B4C1B25E6325FA56646EE5F3431D33D0BC691C134AB306B0BD2D1087F4D898A529DAE08B97683FE2EB8ABC9095D67B79CFF0E77404C1F7FF316C3CECBAB77C710FBF961008047AF22805D77EFF79F815B21D142F517DA2199F6627AD9FD85AA24E9B7F40C7796207A82901C7B5A3A42369A9BCEBC24ECE13A3ED064E4E748BEE2890BB21B8E4845362BE9AEE46E25418F7CA38ED087E46E24F12012A1312BC623AABA6ED227CEF116A3C2130B4B837AC77D86F8CA3553BA0CF5AD45E9B4E4E55059F1D4675291581D7CC9E5839212AFCFA897E90CB601CB33A4D2241A5ED5925F6416BE5A43D4767FA04F701076AD5ED5ECE2D09B8DAF11B00FEDD2AA2E748CBCBE365031394EF823951EBC52B3E4C79D79234C16575910C29A35EB67C624F7504EECA3921F461D7F95EEE39638C402481DF7B59310C4554450789DFB28ED1E485C0018512EB05F14DC7A3DB5C0606F9E28420D76B8F8534D2AE31AA01E90A20E248A7FB3B72EA859031C67F7B2B043D38F7183165A42AB28C6308608C530A9CA98F82C133BBC313FDDD2109838E970DC9989EC14DF781A518F6CB56DBEDFC1E381250C64F95D0BE5F37515437673425374D44811F4406EE2B5130334BA555839E61AE623D283C77247D2EF8B22ED138A526F7E41DFD41FC69A2839B77B51C6FD96D97D3EF8359E8725BA1AFA80278FB3BA9C697F7E2BBCC5D3F0F2E61BFCF542D3160EDE02CD6295FCC55865E7890342572499347DF80EC073A91E00193BAF804B884E9CF5C43269824D4CAF7EEF49FABD8BDC5496D190263C96DBCD287681C19B90C34635FFBDFEAFE0601BBB7514FD84896A22895E9B21FAEEA372696E350F13959FC23533F3E8C34B17B595F3C935E37220AAF644F3A565114C34C7B85F1A3E465470166A62B13ADB00A2BCD5A9A3ECD59FB772F09DD6A6E2AD12FD54EC62CFACE0022F2FFE3EB62DB0F4D0F0F9D1FD6F3F11D76DA868D2C1C4124915DE19EACFFCDB31F7CA018B6976260CA1BB2C4FCD6B9958F096313B608E208D875EA5A1FA89916D0367EDC4F8890E93F1E660AFF16EA79D1E583007E693BF06C172105B3DC24117DD921FB60D3AC0D2E5C89FEF17087D885A0794E496E3CBEA333CF72A507788EFE -pk = 148455AA3A626ADB8B384574E7FF465DA0D8D5E8BE54FD6C25A519329782EA03D74185BEAC0421D19DBF5B99C0AFF765949A9EE1DAA15FA4C3DEEB3C9FD1542B -sk = 148455AA3A626ADB8B384574E7FF465DA0D8D5E8BE54FD6C25A519329782EA03D74185BEAC0421D19DBF5B99C0AFF765949A9EE1DAA15FA4C3DEEB3C9FD1542B0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007B06F7EB2BC45BAED686EE01C6A5E1B56CFBA8CD213EB4A92C372E18009A71D8393D446BBB4EF8DDF7036BC1308C020000000000000082E1F049DEE5AC3C60F90239C7EF4365EA2188BA9950C92E6ADA83F83BBD3263B2C16C2D57399CB234DFEAE9D0B3FCFFFFFFFFFFFFFF5E78CBBDCECA4FDDCE001F6D37EECB72FCB20600D933826AEADF52552811FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBA7C436133700180CE94D1FA8ED43607F959383A4B5F8A033A9208CC8E70A000000000000000000000000000000000000000000000026F5EEA0A874D304DC4F918FA4B9A89508B86E4D7510E1E5BF1FA167F5CEF20402B7AEEA3CE22D6D85A2A735F13F954802A6D9C14DC24C3564AE74208E8B27030E50F8527E2B24D0C29FA64C7B7078962C1E1B6133F31F4A1751820730ED7A1497B444BFF291386DCAF3C3BA6046873AF16E9822172E5B2ACF3B59FD6F19A924BCD6D40AECD2F1FA10C393251BF99976DDE8B0FFF2A601B2FBF5BC611857B022CE3671EC958745D3A509733825ECCE2882E27BCCC9CF81D1AB9EA13C2256F51293018168B37C973A7AFBA5A61101295F4C1AF50CC9D26660EEA8B5C74F028829A853B7B245EE5CF82EA6B2E3E855C1120B8D506AB01E2B48274540363E2AA918EB101A59573E7ADAA125E0C7BC6930DC28A610839FC042326DBF5260D3BF141805F6FAC5842E22FC45CD9EF8D9D012B4EA6EA16E7974422C478AE59B53B97328715EE3DDBAC3DDE6F26195CC195148661A792E628EB3FB74A043B8837D1D8921F086AE60EB7129616CAFB3909D12E65B80E281B8EBEC7208D5465C2AA9265822CB30DCB8BE1DFC55EBBA452083E74F387626E59747E6725F2BAD34B137C45D1643AEE80C3ED9ABBF8221B73F6320EA9B568E210875F0D053F387F4D3F9AE362D -smlen = 2421 -sm = BB161D6A381DE63896017008C7703D8FA6F633015F42633D2E5EBE571D00856E1652285BECB9CD018CA345C5D575A2092A01B871F900DEB7108E2C03A9A5878EB260188C8302B7CD5816ADE61AECE00457D2D1BC53BAC7A3AE0055028F5A7F97D4D30B053622E3BED51F4E77C00140F2BE901D540BCB070798068F463011298534027F0B72B6C2A07CAFC30501EB2AEF1B69F6CB74E8AE6F5A6F3A1A831003D30D8F97CAB5D1271E042AAEDD0202FCD10089D960D04A3DF6984276A3D17D59AF9E72B25418C8797170FA701A672C5835CEAA22DC35470D038C6ACC5082D2AE329F36697C91CBB1F9E42DA59A654462BF19E04352192778CB050DB6F4A656F6AB0BD9641CA8CE6C1EF8B020A3D9FD9DFF772F38926458BDA6E6072456E506AE464785399AD7B498AFD4C211F09D0C722FBD9E20890CDDC8C6EB9EE75390E6D76D0672FA64D8B97C65CCA46DD1F542B6D6014F035D2817C4B9430AC8DC318CF8642AB34F4C8D71FC0E3B1FC961E94B6A84622876250FDC21987777360784D9A58F35E1C9B71F30561ED6854EE9B112E7B20CE064272213BD1A46D0D19E5EFAFAAC7ADDF4D7B7A519D689398EAF1E67E64ACE8E5E89756377E1FE458D04E3DF7F6680F8B69815680276ACDBEE6C8E1AA909EC56994F3EF3B65FBEFDBC29AEB0EA906274E838CAC36A0607716FBC2B8DA6150A4EF39E1CD9CCA72915007723C5D2442F7133258234D18A257DA2C13E53B47DC6ABC2D607B98E351FCECEE8BA8886821985BB3A7BD02429ECDC5A27EB04D01DADCE88A324AE44F567593FBF730C284414056FA33CE90A6D6F146DBB1635BD26B4F883D4948DA47216C70D2AA58CEB3979523C6A4F2F7EA455A97C7ADB6C43685D63BD4C51D7DDCB81A06B9BAC31A7B255B94052D686128D234BCB63CE713028451B18B981B83DA1246281FC3BD2B06C741CF71979DAEFDFA0FD06FBA3722FF7BCB2821FBA964FBE9F6467FE583C06D3889A40360A7AA03358175EE75EB8FD1D3368C30B5691776C163764DB924FBA2362CC9572F642CDD2B11B40FA2683A529EC2100DEDEDEAA70A1E639A71D6A96AD31F70A00FB63875D0FD5C21E56AE57B6E74EECD2EF34BB3E20BE5A1F9F1F54955A18B4E4E4B9119973DEB76A2A603FB6410A350667ECE5C1C147DD00B07A88A7D0E86AA2D747A867AD90BA6660C7A0432E20849EF642A20CF5A20AF7E34D139B39DD65C65B36750F17F0B9F1DB06CC6E16F10EB289F567B647454A581604F381D66371238AB785585A4DA2D00810EF6851A6009025FCADFB77FF7996BA6B091FE4130733466B29FED46554FEBC2AD291DD966BEF4D79A9E04014D3003C95696E8BC39892AD32DB6D6AD22D33E931BC87F78114BBBD97B334BCEA676F9E9DB23C0485EC06D8F37F070C143117B1BEA49F06E1A2423D98C12883D32D29103F7699646E7091D393B21A260703E17380A1BD85452702C3AF7DF73AE7856A1C066013014DE62C3C817DD74C44AA436A71490E7BDC6B8B74BF61711FDCC541AD7DC49CF4C3EC154879E048FF30DF25065B5641367CBD3BBA19606A9A27A64055D5D3B538FC88EDA66FF9F26E619DCBA696866DE54A8DC8580B5B28144F952FFC6DC543E98CC9FD7F4538135C0F4DEB4BF892266DCC48A4D1DDCF407BE4FDF2A5AFE4A0105A20CE2B3D9F48D608DE2315240875F1FED696C49CD8D4A78AD26F51B3C804949C536CE35C3963DC1D238516B3F2D297F5C9939A946A0170E185C75087F37ACF907F9E3F87A2B15CF81C7ECBF2165F0F3962D11E9C6A7845ECEF432CE9E1FBE74C77EA1057D79CB595D47A8DDC1D911C6B97AF76D91F3515081B95CED16275DECDEDCED9AC790D73739E35973834503133510DBE39201F9B5C618231184B9DBAFAA7ED6623E8BC492170812444DB62D4F01925DC4F821C0896A746B4453E93EE51844B311B0A0A51601477BFF651EB5EE331227A2E9E49F593EB2988E449E750E990A8A89906EFAB00E0955C81B6AEB160313007B481C40908130597626935389E47AFCB0A20146F0C7B29B567E95D59CED7FA8023A2D69C89443A11E7150A03D09EE6B0F74358141D48E9BCAA3EE081C7D8F8C223F4D48EFB3DF8A4E287FC5B90B4FD251CB616687ED09AB1A06C42EB9D6A578D72E99D499882D216DDB3F35B0A33D9F2D3D4A700161A5C3B5A6729F197479E78009794AA1BE3C25E0B9142613AD2EA508ACAEF5EEE33DACF60CB7A16AB38D9F3CAFD2150081B63A3A6CA0163A25FE81206A37A0874FD55FA3068B4C1B25E6325FA56646EE5F3431D33D0BC691C134AB306B0BD2D1087F4D898A529DAE08B97683FE2EB8ABC9095D67B79CFF0E77404C1F7FF316C3CECBAB77C710FBF961008047AF22805D77EFF79F815B21D142F517DA2199F6627AD9FD85AA24E9B7F40C7796207A82901C7B5A3A42369A9BCEBC24ECE13A3ED064E4E748BEE2890BB21B8E4845362BE9AEE46E25418F7CA38ED087E46E24F12012A1312BC623AABA6ED227CEF116A3C2130B4B837AC77D86F8CA3553BA0CF5AD45E9B4E4E55059F1D4675291581D7CC9E5839212AFCFA897E90CB601CB33A4D2241A5ED5925F6416BE5A43D4767FA04F701076AD5ED5ECE2D09B8DAF11B00FEDD2AA2E748CBCBE365031394EF823951EBC52B3E4C79D79234C16575910C29A35EB67C624F7504EECA3921F461D7F95EEE39638C402481DF7B59310C4554450789DFB28ED1E485C0018512EB05F14DC7A3DB5C0606F9E28420D76B8F8534D2AE31AA01E90A20E248A7FB3B72EA859031C67F7B2B043D38F7183165A42AB28C6308608C530A9CA98F82C133BBC313FDDD2109838E970DC9989EC14DF781A518F6CB56DBEDFC1E381250C64F95D0BE5F37515437673425374D44811F4406EE2B5130334BA555839E61AE623D283C77247D2EF8B22ED138A526F7E41DFD41FC69A2839B77B51C6FD96D97D3EF8359E8725BA1AFA80278FB3BA9C697F7E2BBCC5D3F0F2E61BFCF542D3160EDE02CD6295FCC55865E7890342572499347DF80EC073A91E00193BAF804B884E9CF5C43269824D4CAF7EEF49FABD8BDC5496D190263C96DBCD287681C19B90C34635FFBDFEAFE0601BBB7514FD84896A22895E9B21FAEEA372696E350F13959FC23533F3E8C34B17B595F3C935E37220AAF644F3A565114C34C7B85F1A3E465470166A62B13ADB00A2BCD5A9A3ECD59FB772F09DD6A6E2AD12FD54EC62CFACE0022F2FFE3EB62DB0F4D0F0F9D1FD6F3F11D76DA868D2C1C4124915DE19EACFFCDB31F7CA018B6976260CA1BB2C4FCD6B9958F096313B608E208D875EA5A1FA89916D0367EDC4F8890E93F1E660AFF16EA79D1E583007E693BF06C172105B3DC24117DD921FB60D3AC0D2E5C89FEF17087D885A0794E496E3CBEA333CF72A507788EFE - -count = 68 -seed = DE9E2742591A5AF6A6153DA85A510C39FD31A2ACD8A8511F190A9A5E5753E63D9801A8019508E67DEB1E9219CC18BA3A -mlen = 2277 -msg = 8337940EE74590EB25E52E78E8563A09CD2D45F650F48775E3E61F9E3509CC8EB7E983310D0185359F66BD80E0DA1E45A6BEB53ACEBB9030E310E81A576D0F80C64FCE1D1FD77DCA27B7C6E02B0CC26EDBF496AD2E3CE8484E988E56BB28153587D7ECB02FD8882545E7BF79CC9966A7FEDE93F7E9451BC48FDBB481673D1C4135F95D68F40F4B4F847345A320FB4D736BF5F9FD347435462DD3A238E4C799E7CEE081107E11682C7B558B19177522427F1D269FAD81B565BE538E8FF2D7193579AEE51E50974BDC0B66331B59BF496C87E4F6E143754076DB516C9C538410FB38A930CB5BA1E6610441126D01C8EB5F34E2E58424B8B218D9E68C5D8B4F5258EEF07EE0AA5475A72CCF363D47D825FA524C16C7B7587C44864DA9E4B267F738B87F7E5701147F550CD38774B17DE48E6969A0DEDF334FA67470419059C4D1607880CB12FA9C0ED23032C7E0F325169EACE7DACCDD4C2E5097FBBA859970D7EAC4522C1FEA043C9278C1C89FCCE95203033B4CEA4F9F24B55BA6B79EF88F275310C6E48189EFC1EEEDAB66B56B6BB028726BC463D93D742492841E85D5C837948978D0FADD1C172F8859C802C6BE8394A05DADA7546EE1CC5BB909D3189088F4FA6D07C573ED7263C081720E701D5D4B027AE54BE175536F3BD5E91993CC040311A7D352AA26414CAE30D10408DDB44E8C9513F4619E99EDC894F963489876B24BB0B91BDC3EE5B78AC0D4046B2E864789C0C779E5AF97F8F84F09A26FF74B8BCDE66C007970830B70C2A1122DC9845905C3AA7810B40641E8BBB398A23BBEF52BEDABEC7BB54823E64177A73786992DD67D5C007D770938402EFBCB3A60281C5706920A9EEE4C26C0B251C32B9E1936FDEC2928110959E99255508250FD5BA84B4FB314187124072D30FBF2163D36F1480ECC08F7FB8093BFAA72F1914C63533EBB3A57420DC38DC93DD6AE4D197FAB790C1EFC1B7A2234522E0B408D0648C7AE782F2F08CB70B96CD76B5089AF1EF4BA3A4C2FAAC363A4DC1C6C421F6AE1E9B67461EB02F36C25E763F1A2B73CEED4DCEDDCE619CB313D124CE6F7AC986D6BC344E630F22CB654C1286FBC0EE01C968DADD1EDAD744C8BC828CF5F316336A5883166ED000FF98D6CE2CEAE7D3E40BBC5714F71BA9E25E1506D644FB2DE2FE190D327ACCCA79D9B6D9DB505CF1853E98F30E9BA5E568ED83E2567C936A64420C5D8F07AC4F65F38C28E88DD7B5209A600AEB81A6D2AFA4FAAEFDAFD9B7FD3AD7F49462CD577204184F9D44A45E2A909373CED24EC0EE56BF2E6675C506EDA67B1E6DAB75CBF1822E20E7A8A81A7729B42A6D67A1DD457FCD19B62F048AB97B3D694254E5C051FD2DAF3D12AD627EC37C22117BDEE9EAA290D11D56BAFF0DE1037EBA908FA03E2F869FA2B27936669306E8E70A0A4910A123F202797BF1C8FE47178BB1E8E8D7AB1C01F30F5E779B2BC99902DF15185FED4C865997AB72254162D00858E0908EA95A9ACD0FCE72E571C7A381CC33E06A27FE6A5922775EE82C973CC3CA8A05717608F8703946C9A89854D627744DA475DEFC1390DC44FCC3A23C47AA8AF17240EB1A1A00A062D258D471F31333D0356243DC1CECFC559378B4395F01A970EA4074D5666B44D49EF291ED15930DADA66765B165CB8331CFE549C38CD0672F534BE60F4D9B4C125FFE747670513B5744676899B256B992E15106B99B794DB3950582816612144649210751F3D0DFD5B25CD393E724F7FDEF00756D0C8540E8891E592507599B06EDFA6EBFE543084AC81858F5EB02D8F5EB8A72184851E8589A3AC6DFE1CDCF286723FC4C1202765FA4F783EE58C627ED494C7149BCA6A4DDB420827CDCA82DC42515BEAF46CE9D9ED524BD00EBD3094F770B1E1DD09FC431E4C244D2305619DAE208E65EF385EA92F5A79F12B99AFDAEA79C9D8D319944AC6CBBE3F1290EC6B87D97785E059E6871FDF239BC404021CB52064B88EB4CB3FB6A871B0F76C12D7B8C5E8FE0A65024AB5B25F4C67B6D15C22B0005B754CF7CBEC898B49F4326F1AE4034E5F5A446A96CE08083D48525A3661E10C996DD22DC34FE570A4C8817D10D750FC5C2ED0C24C7CBCBA5CD1B2680DBAA3315FBF2BA7457ABEEDC96B5D111110D4678EA5C7851D25F258926B0B028365799E940A6E17BB03CB332FBC6D713DEA7108FC6268C8D33E7A578C94FF75BE808C15FF7884F092C0E309F1AF99B1A7314FA0F32C8D8E32B3E9D92C9C8FF6B8FBB99111529C4BE3A2A4F62884373D0903180B4DEABE613DE5CF19415DFBA7F9A46297AE2F21D7EA420B41F628FD8DEBA55207606539D11791623CB325F1E18C98AAC27283BFAB2408F4FD6CC58EC9E306643BA1C0C77D84B3930263E5A76A1CE94F3D7721F0098D54E6C990C3AFF69B6A0D82C853EA2AF2D3D2B3E96DAD59FF873171B55D16CA9A7C68DAD2E918174D264919DDCB4B9D01CE622D56C599BF60711C74315C918A7BB97B9513937AFB6A652DA68B6B0B34E316D7BE9F5C282A5E8773C892782EFF220667A6A54069C37B88EB1CE676AAECF2015E59FB7AF4D30C4625DD8DE4805F505E83C877CD61D2A0BA65B32B0DBDFBACFC88CA43E4DDF7A1A4517DCE83B7B8ACF8DCAAD28284039747935865DAF8DCFCA29FB676CE2EBA2C509CD75588FA5E58CEFD0694626C9BB31C3AFC372ED313C9BB3ADC398E89DBDB108DDA63F9380EBF9DA17B378451634682F9823E209BF10E39F884ED270413152025CDBF4875C121B1E83E12C044453FFDA6D8CA2C240AD522577C6898AB6F2ABE1FE77F860939408CD193E605F87FF2248FA163AC2FC0F39BFC38503B23F5441E0E364CAAAB890073266B3B51217661F5DF41C0BA925BB425AB3DD7B6A3675B7D60D0290131EAD53A4EAB0C66BAA83F2FB77E74C3C123ABA7731A3F62FAB8EAB2A96E8BBC911E501CD23A088E7887A469284E0B5C27B5CBC1DE2B6938CF1AF58A47FE78141306CB76E8F2B73620BC4549DB6826D2D72873885F6C5311EB5B9462BB4631D314DFB9C836C6F4D9EEC6818940C04689CC4D8D11ED9869355617861340E722B2BE78197746E2759AAA8D68D1965888E89B6B0F5BF51F94E586B2CB8708F4CDB520BF31DDCCFB7CB69E29A7AE8AAB12C11F431DE40FB9E82EB5F2B6BA1F9757F1487B63255FA69A755601C2FE17CD1892D5A6799C35D05098DC133BDD71318667D47C4671 -pk = DBFBF4019CC9127785712828808C0E71D2BD1FC78746697A8BDA94EBEF44D4120F4FC192165ECE444EEA802EF058C4ABCB2E627052592D7883EA0B9A6DF64A09 -sk = DBFBF4019CC9127785712828808C0E71D2BD1FC78746697A8BDA94EBEF44D4120F4FC192165ECE444EEA802EF058C4ABCB2E627052592D7883EA0B9A6DF64A09020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A49CCD185634267C23B62DC2535035FC464B763A1E1586892709B07CD190641694A5BA3B86A725CB3A56021B6CE803000000000000008FE56F415DDED50C87DF92CF8EC81DA523AFE4236F79CE8AE0A33E99F9EFC3C6AD8862C1ABB2D9739DFCDCC8E9D0FDFFFFFFFFFFFFFF4F38FA50AFFBAD05263ED7F359707B197FFEBBDF210E4CE28530720B59AEF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C525D62131984A7F22FBCA0A29F954445D1784FF1801A5DF5A6042623450600000000000000000000000000000000000000000000003882D4AE73D6BCD0BDEAC35A675010F1869892467D980B71FEA833ADF039C92E8394BB51BCC704611869FF621FC08A5018D77B346B0D1DD8C9F98742BB8AE907882505D30E5A41B438431C16B747891C3EB9B4427D47A0090CB057B63BB356169D24741AEEA0CE893CBFFE01E83C7FB67C220ECC1A9CDAF22C065AFF2750A430AD077AF807AD67881C427EBEAFC6C33C80B4B708971DB1977404700562A9571AF5E835830C989995F5EC0DE20B46C1F7EC0C61F07A68CF267924BAFFD90F790DF15007732EFC575341DC1DB50DD8FF0320113FE70264793BF843A274D0746A0065C29909A37FC5470D1A68DBC0B135D66AFDD23EFA6EFF52A9EF4ECB5F600130D021420F0A3F406B2BE4094CCCC3DD711C867CAEE09EF6AE89BEBFEACA048B06733E11A1ED0F44F97233C1760BF6CB58D43722C1310C4527C8703C7C81F8C81A58B725F78108D6DBE1FB48B9474475B9FB761A1D670D9E98C86CF61DEFC4BB09CF2EDEDE4F602C6BBE624D401DDE1B8CE82A62A497E648586F4FB69015CE110446332C2081521C96474CA23AC1D013566E2C2DBD62FFF0C3FDAF0CC0D3A34030F5C9FFDED0AA95EC373BFA80A52F5EDEFFE3D2BA69EBB022A9E2C6F210093611 -smlen = 2454 -sm = 1DA0DC96DECF104612069F0477A8613A3D43DE05D281B16E178A74E3280039EB9A90F3BA48FB4B044E419C5DA5E9EB45D80285F3D8DDC5D66ED71B070966C39FDFCD58B38F032C7744E0165FCEF42D04212522FC8051D815D60781D74524F4C40053C7062E6A8AD52E8205FC9E06BCFC96AE7A0AC2EB84010C51CE0AAA6BC5078102CAF1B43BB610B78DFB0101FF50AA4A613A6301896D497E92DBDA9B0003C96CE287909850D3FE004EBBA7727E4C1E008337940EE74590EB25E52E78E8563A09CD2D45F650F48775E3E61F9E3509CC8EB7E983310D0185359F66BD80E0DA1E45A6BEB53ACEBB9030E310E81A576D0F80C64FCE1D1FD77DCA27B7C6E02B0CC26EDBF496AD2E3CE8484E988E56BB28153587D7ECB02FD8882545E7BF79CC9966A7FEDE93F7E9451BC48FDBB481673D1C4135F95D68F40F4B4F847345A320FB4D736BF5F9FD347435462DD3A238E4C799E7CEE081107E11682C7B558B19177522427F1D269FAD81B565BE538E8FF2D7193579AEE51E50974BDC0B66331B59BF496C87E4F6E143754076DB516C9C538410FB38A930CB5BA1E6610441126D01C8EB5F34E2E58424B8B218D9E68C5D8B4F5258EEF07EE0AA5475A72CCF363D47D825FA524C16C7B7587C44864DA9E4B267F738B87F7E5701147F550CD38774B17DE48E6969A0DEDF334FA67470419059C4D1607880CB12FA9C0ED23032C7E0F325169EACE7DACCDD4C2E5097FBBA859970D7EAC4522C1FEA043C9278C1C89FCCE95203033B4CEA4F9F24B55BA6B79EF88F275310C6E48189EFC1EEEDAB66B56B6BB028726BC463D93D742492841E85D5C837948978D0FADD1C172F8859C802C6BE8394A05DADA7546EE1CC5BB909D3189088F4FA6D07C573ED7263C081720E701D5D4B027AE54BE175536F3BD5E91993CC040311A7D352AA26414CAE30D10408DDB44E8C9513F4619E99EDC894F963489876B24BB0B91BDC3EE5B78AC0D4046B2E864789C0C779E5AF97F8F84F09A26FF74B8BCDE66C007970830B70C2A1122DC9845905C3AA7810B40641E8BBB398A23BBEF52BEDABEC7BB54823E64177A73786992DD67D5C007D770938402EFBCB3A60281C5706920A9EEE4C26C0B251C32B9E1936FDEC2928110959E99255508250FD5BA84B4FB314187124072D30FBF2163D36F1480ECC08F7FB8093BFAA72F1914C63533EBB3A57420DC38DC93DD6AE4D197FAB790C1EFC1B7A2234522E0B408D0648C7AE782F2F08CB70B96CD76B5089AF1EF4BA3A4C2FAAC363A4DC1C6C421F6AE1E9B67461EB02F36C25E763F1A2B73CEED4DCEDDCE619CB313D124CE6F7AC986D6BC344E630F22CB654C1286FBC0EE01C968DADD1EDAD744C8BC828CF5F316336A5883166ED000FF98D6CE2CEAE7D3E40BBC5714F71BA9E25E1506D644FB2DE2FE190D327ACCCA79D9B6D9DB505CF1853E98F30E9BA5E568ED83E2567C936A64420C5D8F07AC4F65F38C28E88DD7B5209A600AEB81A6D2AFA4FAAEFDAFD9B7FD3AD7F49462CD577204184F9D44A45E2A909373CED24EC0EE56BF2E6675C506EDA67B1E6DAB75CBF1822E20E7A8A81A7729B42A6D67A1DD457FCD19B62F048AB97B3D694254E5C051FD2DAF3D12AD627EC37C22117BDEE9EAA290D11D56BAFF0DE1037EBA908FA03E2F869FA2B27936669306E8E70A0A4910A123F202797BF1C8FE47178BB1E8E8D7AB1C01F30F5E779B2BC99902DF15185FED4C865997AB72254162D00858E0908EA95A9ACD0FCE72E571C7A381CC33E06A27FE6A5922775EE82C973CC3CA8A05717608F8703946C9A89854D627744DA475DEFC1390DC44FCC3A23C47AA8AF17240EB1A1A00A062D258D471F31333D0356243DC1CECFC559378B4395F01A970EA4074D5666B44D49EF291ED15930DADA66765B165CB8331CFE549C38CD0672F534BE60F4D9B4C125FFE747670513B5744676899B256B992E15106B99B794DB3950582816612144649210751F3D0DFD5B25CD393E724F7FDEF00756D0C8540E8891E592507599B06EDFA6EBFE543084AC81858F5EB02D8F5EB8A72184851E8589A3AC6DFE1CDCF286723FC4C1202765FA4F783EE58C627ED494C7149BCA6A4DDB420827CDCA82DC42515BEAF46CE9D9ED524BD00EBD3094F770B1E1DD09FC431E4C244D2305619DAE208E65EF385EA92F5A79F12B99AFDAEA79C9D8D319944AC6CBBE3F1290EC6B87D97785E059E6871FDF239BC404021CB52064B88EB4CB3FB6A871B0F76C12D7B8C5E8FE0A65024AB5B25F4C67B6D15C22B0005B754CF7CBEC898B49F4326F1AE4034E5F5A446A96CE08083D48525A3661E10C996DD22DC34FE570A4C8817D10D750FC5C2ED0C24C7CBCBA5CD1B2680DBAA3315FBF2BA7457ABEEDC96B5D111110D4678EA5C7851D25F258926B0B028365799E940A6E17BB03CB332FBC6D713DEA7108FC6268C8D33E7A578C94FF75BE808C15FF7884F092C0E309F1AF99B1A7314FA0F32C8D8E32B3E9D92C9C8FF6B8FBB99111529C4BE3A2A4F62884373D0903180B4DEABE613DE5CF19415DFBA7F9A46297AE2F21D7EA420B41F628FD8DEBA55207606539D11791623CB325F1E18C98AAC27283BFAB2408F4FD6CC58EC9E306643BA1C0C77D84B3930263E5A76A1CE94F3D7721F0098D54E6C990C3AFF69B6A0D82C853EA2AF2D3D2B3E96DAD59FF873171B55D16CA9A7C68DAD2E918174D264919DDCB4B9D01CE622D56C599BF60711C74315C918A7BB97B9513937AFB6A652DA68B6B0B34E316D7BE9F5C282A5E8773C892782EFF220667A6A54069C37B88EB1CE676AAECF2015E59FB7AF4D30C4625DD8DE4805F505E83C877CD61D2A0BA65B32B0DBDFBACFC88CA43E4DDF7A1A4517DCE83B7B8ACF8DCAAD28284039747935865DAF8DCFCA29FB676CE2EBA2C509CD75588FA5E58CEFD0694626C9BB31C3AFC372ED313C9BB3ADC398E89DBDB108DDA63F9380EBF9DA17B378451634682F9823E209BF10E39F884ED270413152025CDBF4875C121B1E83E12C044453FFDA6D8CA2C240AD522577C6898AB6F2ABE1FE77F860939408CD193E605F87FF2248FA163AC2FC0F39BFC38503B23F5441E0E364CAAAB890073266B3B51217661F5DF41C0BA925BB425AB3DD7B6A3675B7D60D0290131EAD53A4EAB0C66BAA83F2FB77E74C3C123ABA7731A3F62FAB8EAB2A96E8BBC911E501CD23A088E7887A469284E0B5C27B5CBC1DE2B6938CF1AF58A47FE78141306CB76E8F2B73620BC4549DB6826D2D72873885F6C5311EB5B9462BB4631D314DFB9C836C6F4D9EEC6818940C04689CC4D8D11ED9869355617861340E722B2BE78197746E2759AAA8D68D1965888E89B6B0F5BF51F94E586B2CB8708F4CDB520BF31DDCCFB7CB69E29A7AE8AAB12C11F431DE40FB9E82EB5F2B6BA1F9757F1487B63255FA69A755601C2FE17CD1892D5A6799C35D05098DC133BDD71318667D47C4671 - -count = 69 -seed = 272E459EAB6A0BDF720E4C5B79E641C95BAB66C3CEE261D0E3596BB04D232ACE0A1CE24BACCAAE9037665A962C711B08 -mlen = 2310 -msg = 62215248E1F3AFB19849F758D742F8AFAB595040C4DC520D603C9A80FA9CF2E97E4F4BD7350551FB667D606BDC31A45D88836CD376785C01F9007D47DF95C1F4D1E30A927A13525409D91C9F5145C0B86D3B44E933CA81E4ED9559AC17940C61EB85B2D26D2C47924AB80ACBAA3D9B1C8855C13EE45F5C8047C161AAA5321839A01783B21A5EE90CF91B8285C4779465B7A89DE3D74D482080F68EB2D8B47429D5475356C50A92B3ACBDEA5786F4D6C2A304AB500490F84FD1D0F21ACBEA325D62D2657F3889B6F591A7F63D8633C061CB14B8266A7FE17642DEDF1D08D9FFE369126CD780D9F99FC6262B5BEFCFEF35D33498CB2CFFE55F2F8D567EA8687DFC6E7D49A61FDBFE768C1D11BF5B3B18CA52225B096490C97CB9A0B3B2CA0762DCC36B60F7D26FCAA4E38B1F3A6279D889323010D9CB0A97FC488E09B06237E6EB0166465C2CBC2B9CD06F155759B6C93CA0CD3178845E0F3A2D20A68757AAF3C4E74545494462CCF28F6F51EC0FDFF4F1E6D98FC5B63BFF068FA7BE1764BCF14497E71E424C9389C5DCF8C5CE1DCD40B82F1D75C3C3970DA433A92A04DE958766AC5EB3645F4D21882F7071383AF8DFFD6CDD91B549F143DCF59FED6674441EEB03D5013E90ADCCBD7E3DA115535AC855DBAAB7F51D70630DC00009E726A16DEADB12047D85906CFF315C73EE7D4E24C9067E3B772F3DCC44C25C7CB8622FDD7B8ECF5E9C877838D71D500F864A662619B1478F8AB4DB2DD09A111ACC99ABE737DDBCA06E88926C4E73B5F5D21EAFC4B11938FEEEA5F8D5A4C616A342B54C9CE371817AA2409A55A3237BE85A50F05B33D35AA86A62E85A01CF34EE7DC840A26FA1B8C6B307817C062D9A2E7163A3B036874D2ABF6531A772D4031FDCD59CA79FBF442CB9155F90148DC3B723778E699C6985634185C3FFDB966ADB80A3D1308150B12964142498466506BC0742783C27BD3472A5CB45021DE066C28143FFBC82B5742BE51E93BCFDE1A61E661B730D8760E108B80C859E4B3A07D483A6A8967E5F01B03EC8B63A20C6A03755C75F419558878A5EB8BB0B2120F183E4BECD4A104EB4DB62CACF5F9964583815334A25BDB75724E549211699AC3BC9B2B5F58F1FB33429905DF81C9422F8B84E95A7C36DEC6AE9B48D4F502D8AB59B69E9D112693578D143A3F111EF00844303950F65DDEEA6E30F1286DE16546F90C4364A5C09755AF3FECB13983C418B2FE4AC17BDDA57E4D597E8BDCCBFBE4082C446FC920E5145BBAFC67FADD9799CD8C7714510DA579516ED39B3E22DE319977FC77A9CA61AE8252795D11724AAA866C1FFDBCBC1FF91AF1B8713248864A4E8B9C59DD12863245F5048110DEDE7FE31FF9836715886C37E9642DBD6C668BA7AB8C2B706CDD58586EB7227B5768C3509C1F66493468859E275700EA38BA69064179F6036D7B50BD232B61C9B9659492894C0057DBFB80329A76CDC57B2A89BBB910483301CA0BF6AEC7D5DDF86644FF52F48FF6C7CD00406CACBC09AA251708BAF3276A52BE2C7B42FB6A9036C318529CA98940769A67DCD532C0000AFB5FC63AD2303E94E09D2CB40CCBE47FAA1DD22ECF528179AD40FD4BFD43717864149243D61CA255344C52743200ED8385A7CA6CCA24CF967D23D07DC2A3F9AD5F3240F4F022A6C6CD281B6C492E8D144A2F4641957ECC65B32C9F74BB468524FF58F0F3DA2F5A56742896CC8F99088574264F857DC67CF04C4B63C6A08FC534229CA8BA616CD504F969EA6E3C98A517355F98A9E884062805B77623239074206E01AD2F3FC9FE9FF8254A5D3525C3B2F0A692803500C967A2E18511EF5B8845DC4B0DEE9338C38C4B1B8B84EE63923250EB6F9E9C272617C7895BD538A6F34D3557812BBBFAB2B8FA6EB5E95B9BCE33AD3185CD90DD536A68639022C079B5CA7748864D37D45FA6780A45AA991F28BC0D3BF371EE2FF0C913CEA6DB38E4A278A4840EA1F255F8E83B6B6C5E260A49D727AA42095A88CB8120B51DAFD764E690102F7FA07CEA2EB86AC613E7BE2F498F5767B622D04E8A6F272976FB058C3334CF8CAAD1D180E3456C210763C974E431CBC3E25EAD8B9FF9243628D5B08D92CBF1D5DF29A85B1A04D2999B3C669227B33610121D543CF4A978F8D9365C0FF8AFFA92B07FC8C8604A0F357F3C669445685B6A29898301A5AFBE10ACE8D64A47009C8741D7CE82E9900643900A3B92A26FE5F24886C06AE0918C3F2523C320699C799CBF72F0DDB08A0F1F63D6DC2F021C78A9D44503209190EE4BE654663679CFD292292D71FC4BA6233A196EF9E95CB965852773404B2622B565BD91FCA6747AAF7F4EADED7BD3BB53645381B687AE04B8D8A9BEF1095EEB39A0BEB4EA89BADB4655A1AFC7EECB7DA0D670C192297CCE0B31BBEFEBFE94C84603BA8C0B7CC73159FF59C01A037CF2C866DC40D88432CD6C2F1989351A4E41343CACF7BF2C2B395C863709D6EC1DBAB2AF514CC771DF14DF095DEA8284BE2B65097D8E6F72EF3936595384AFC0026956E819F1657C901B92644E9D6D32D0D95549729B2CB3D5EFAC9C42A5F284ABC3BF5CCA5B08161B09D9A48FFB2996C3D4383D65B8D1F7FC3248CBE84B9C05464F4A76EFA005FEC342EDD56959CD26CB0DAE1B61B0493A4B68EB3D6335BBC280508F09D84E0C5F4EF520D92CD34D69E5BAB76DF5D2B72CB41A298D370EBEEFCD6C1904B956458BDA581EFA6B3654BE402AC3A971603F23F2B543C5BEEDA5F018543B72C146CF04680BCEA31B4A238460329E2BC12F14C804FDA3494C15452223D2477C9C8A497D04EAAE7DE09D7D7A879D3A5DBA565AE1A38F15E69C18838C487C0FBAD44A068C42EFB7D3F5EF488F91C42F25AC564751F0EFE0ECE7D98BB1B3D0FC42C9756F4B8F9DAF1FD0D414391155285C8DAEAAF380BD07E43570F14E9A47A87BC733F1E676233F17BFB71AAE464AED68487392D339AE064AE27BD57F8695F493AE56CA96C0615BDA8DA37133DD13C2B21DA189A7329773FD8D51381BC118645440B28FA4F402EF84C4091D3A0BC4D206BDCF9007F5DE9AA1E6CF7F6058AC6B69FBC703E908C4221F9065147766E48F54BE4B076406E2F9ED19C1BE982E636FD02DC26267C3ED989E6AD1CCE62E7B988FA7C1831E5126111A4C3C29C38A1F96CCB3A04132175FA46F73C634AC6EC741B135645ABF1DCEA18571CF9A539F5CC935BC6D32BEB1C7B8B3B5A141146EBC12DBBCC17BB4900CF0B95EBFAA52190AFC6D8933CAFC9 -pk = BBC5C585BD5BE0849C1822BB967B6D9EE03D19BEAA7EEDC2A8EFEAC959CB3C19E9F897D459EFAD0943939C6E2D0D358ABFF5EB950E2D8304AA26E5B9B7B5122A -sk = BBC5C585BD5BE0849C1822BB967B6D9EE03D19BEAA7EEDC2A8EFEAC959CB3C19E9F897D459EFAD0943939C6E2D0D358ABFF5EB950E2D8304AA26E5B9B7B5122A020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C0228089EE56BFD1875A24506FBC94A5A3F67099A2C572B0BBD83FFF23C79C504F352DAFAE3AC386AAB51C25007902000000000000003F64461C47F0F683B5C98823B37B2E20DE469BEF69FD791408BCD060DDDA965BC0A92E9DC29DDFF7836DE5CC35FEFBFFFFFFFFFFFFFFA77E62C69D7B50E183FAC8DBD7C919143F198B664D9A98D231BABCC3368BFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4B516989422A99D57EAE78214DAC173A5B1D752E220CFE8388B765B961908000000000000000000000000000000000000000000000020617BB72AAC7DDF437667DF8261E06EA4DA0EA26D54A9D101F20B9D771EF505B1E7E7ECAA45A8DFFD92FA69C04EE1065919775E61F1EC68C238734E30EC5D1C2AA36D01708EF37A6627A90BADF8D6F11842DFC9295232CF52F8A10128B57A0FC9E83ED504B9481DD2B13E61E437CE0DCEBF60B9A624BC931F7C4A765E2394100C279CD245AFF4904B86CBD48E163898A7BB844455C3214C140C0A175D18111793B36506349B071803F894B991A41F98C27EC5BD041E770B61ABFB9AD55ECD2D93420A5E82627EEFADD08C4B77F4E838A100B09EF0CA307EC22F23803EF189275038836A38726FD8CBD280AB7714066399F0E50D480407D19DAE06E921249915D9FD17A8CD57839AA8388F9244691082A068C51F1FD6E8FBD077692317343A2D23426AD5DD567AAB3A32A25B0DFC1A3D446C20BC6E7F558A5724A5755403CA13B5CA3A9EEC1125C34271BBDECF6AE1696C926CB7588EC4F7228DB241705E3624B1AC023C207FF4757C21B1163E17F930BF4A055E692D04F9C8BF186C9EE6840F7C205BBE56174E95274B2A65505C19FB349667DB4AEA26BB9372647CE181FE19729F4311DB877B904082FA6F719FDFDD28B31C7B556BA885EF19A64410A21A1C -smlen = 2487 -sm = 6E82EDC348A43E7B7805E08FCD6C92C2D33197057F671057B89E53C4C90212618AA66E30E2F27B03A07C4CDEE389C2A0E90249B1FFE44FE441C11806FC40F1026A8624C3B3055ABA703F27EADF0869020E23962CF520E39D1F014E34C8B11F5D429028004B7AECF765518C7717046217DC8986AA5C4D1002BA63EDC0CFAB0342F9050767E6A9EDD795DB4200008BBA5F75E94EEB9C11DD95D0B4C8118810035FE3EE933FEB67F62E05ED2231F1DA82920162215248E1F3AFB19849F758D742F8AFAB595040C4DC520D603C9A80FA9CF2E97E4F4BD7350551FB667D606BDC31A45D88836CD376785C01F9007D47DF95C1F4D1E30A927A13525409D91C9F5145C0B86D3B44E933CA81E4ED9559AC17940C61EB85B2D26D2C47924AB80ACBAA3D9B1C8855C13EE45F5C8047C161AAA5321839A01783B21A5EE90CF91B8285C4779465B7A89DE3D74D482080F68EB2D8B47429D5475356C50A92B3ACBDEA5786F4D6C2A304AB500490F84FD1D0F21ACBEA325D62D2657F3889B6F591A7F63D8633C061CB14B8266A7FE17642DEDF1D08D9FFE369126CD780D9F99FC6262B5BEFCFEF35D33498CB2CFFE55F2F8D567EA8687DFC6E7D49A61FDBFE768C1D11BF5B3B18CA52225B096490C97CB9A0B3B2CA0762DCC36B60F7D26FCAA4E38B1F3A6279D889323010D9CB0A97FC488E09B06237E6EB0166465C2CBC2B9CD06F155759B6C93CA0CD3178845E0F3A2D20A68757AAF3C4E74545494462CCF28F6F51EC0FDFF4F1E6D98FC5B63BFF068FA7BE1764BCF14497E71E424C9389C5DCF8C5CE1DCD40B82F1D75C3C3970DA433A92A04DE958766AC5EB3645F4D21882F7071383AF8DFFD6CDD91B549F143DCF59FED6674441EEB03D5013E90ADCCBD7E3DA115535AC855DBAAB7F51D70630DC00009E726A16DEADB12047D85906CFF315C73EE7D4E24C9067E3B772F3DCC44C25C7CB8622FDD7B8ECF5E9C877838D71D500F864A662619B1478F8AB4DB2DD09A111ACC99ABE737DDBCA06E88926C4E73B5F5D21EAFC4B11938FEEEA5F8D5A4C616A342B54C9CE371817AA2409A55A3237BE85A50F05B33D35AA86A62E85A01CF34EE7DC840A26FA1B8C6B307817C062D9A2E7163A3B036874D2ABF6531A772D4031FDCD59CA79FBF442CB9155F90148DC3B723778E699C6985634185C3FFDB966ADB80A3D1308150B12964142498466506BC0742783C27BD3472A5CB45021DE066C28143FFBC82B5742BE51E93BCFDE1A61E661B730D8760E108B80C859E4B3A07D483A6A8967E5F01B03EC8B63A20C6A03755C75F419558878A5EB8BB0B2120F183E4BECD4A104EB4DB62CACF5F9964583815334A25BDB75724E549211699AC3BC9B2B5F58F1FB33429905DF81C9422F8B84E95A7C36DEC6AE9B48D4F502D8AB59B69E9D112693578D143A3F111EF00844303950F65DDEEA6E30F1286DE16546F90C4364A5C09755AF3FECB13983C418B2FE4AC17BDDA57E4D597E8BDCCBFBE4082C446FC920E5145BBAFC67FADD9799CD8C7714510DA579516ED39B3E22DE319977FC77A9CA61AE8252795D11724AAA866C1FFDBCBC1FF91AF1B8713248864A4E8B9C59DD12863245F5048110DEDE7FE31FF9836715886C37E9642DBD6C668BA7AB8C2B706CDD58586EB7227B5768C3509C1F66493468859E275700EA38BA69064179F6036D7B50BD232B61C9B9659492894C0057DBFB80329A76CDC57B2A89BBB910483301CA0BF6AEC7D5DDF86644FF52F48FF6C7CD00406CACBC09AA251708BAF3276A52BE2C7B42FB6A9036C318529CA98940769A67DCD532C0000AFB5FC63AD2303E94E09D2CB40CCBE47FAA1DD22ECF528179AD40FD4BFD43717864149243D61CA255344C52743200ED8385A7CA6CCA24CF967D23D07DC2A3F9AD5F3240F4F022A6C6CD281B6C492E8D144A2F4641957ECC65B32C9F74BB468524FF58F0F3DA2F5A56742896CC8F99088574264F857DC67CF04C4B63C6A08FC534229CA8BA616CD504F969EA6E3C98A517355F98A9E884062805B77623239074206E01AD2F3FC9FE9FF8254A5D3525C3B2F0A692803500C967A2E18511EF5B8845DC4B0DEE9338C38C4B1B8B84EE63923250EB6F9E9C272617C7895BD538A6F34D3557812BBBFAB2B8FA6EB5E95B9BCE33AD3185CD90DD536A68639022C079B5CA7748864D37D45FA6780A45AA991F28BC0D3BF371EE2FF0C913CEA6DB38E4A278A4840EA1F255F8E83B6B6C5E260A49D727AA42095A88CB8120B51DAFD764E690102F7FA07CEA2EB86AC613E7BE2F498F5767B622D04E8A6F272976FB058C3334CF8CAAD1D180E3456C210763C974E431CBC3E25EAD8B9FF9243628D5B08D92CBF1D5DF29A85B1A04D2999B3C669227B33610121D543CF4A978F8D9365C0FF8AFFA92B07FC8C8604A0F357F3C669445685B6A29898301A5AFBE10ACE8D64A47009C8741D7CE82E9900643900A3B92A26FE5F24886C06AE0918C3F2523C320699C799CBF72F0DDB08A0F1F63D6DC2F021C78A9D44503209190EE4BE654663679CFD292292D71FC4BA6233A196EF9E95CB965852773404B2622B565BD91FCA6747AAF7F4EADED7BD3BB53645381B687AE04B8D8A9BEF1095EEB39A0BEB4EA89BADB4655A1AFC7EECB7DA0D670C192297CCE0B31BBEFEBFE94C84603BA8C0B7CC73159FF59C01A037CF2C866DC40D88432CD6C2F1989351A4E41343CACF7BF2C2B395C863709D6EC1DBAB2AF514CC771DF14DF095DEA8284BE2B65097D8E6F72EF3936595384AFC0026956E819F1657C901B92644E9D6D32D0D95549729B2CB3D5EFAC9C42A5F284ABC3BF5CCA5B08161B09D9A48FFB2996C3D4383D65B8D1F7FC3248CBE84B9C05464F4A76EFA005FEC342EDD56959CD26CB0DAE1B61B0493A4B68EB3D6335BBC280508F09D84E0C5F4EF520D92CD34D69E5BAB76DF5D2B72CB41A298D370EBEEFCD6C1904B956458BDA581EFA6B3654BE402AC3A971603F23F2B543C5BEEDA5F018543B72C146CF04680BCEA31B4A238460329E2BC12F14C804FDA3494C15452223D2477C9C8A497D04EAAE7DE09D7D7A879D3A5DBA565AE1A38F15E69C18838C487C0FBAD44A068C42EFB7D3F5EF488F91C42F25AC564751F0EFE0ECE7D98BB1B3D0FC42C9756F4B8F9DAF1FD0D414391155285C8DAEAAF380BD07E43570F14E9A47A87BC733F1E676233F17BFB71AAE464AED68487392D339AE064AE27BD57F8695F493AE56CA96C0615BDA8DA37133DD13C2B21DA189A7329773FD8D51381BC118645440B28FA4F402EF84C4091D3A0BC4D206BDCF9007F5DE9AA1E6CF7F6058AC6B69FBC703E908C4221F9065147766E48F54BE4B076406E2F9ED19C1BE982E636FD02DC26267C3ED989E6AD1CCE62E7B988FA7C1831E5126111A4C3C29C38A1F96CCB3A04132175FA46F73C634AC6EC741B135645ABF1DCEA18571CF9A539F5CC935BC6D32BEB1C7B8B3B5A141146EBC12DBBCC17BB4900CF0B95EBFAA52190AFC6D8933CAFC9 - -count = 70 -seed = DCC58DFC13B035323ED44BE50A7096F697C9C143518FED50A59181160960203831A9904847BA20B85E99FFA63E4AB0B2 -mlen = 2343 -msg = 954511394B9D10E1BA162861802A717E24EE42A346C9ED280C88E267A41EC09D6D73B6076E7E30257BF265B71A0B6E0CF408F02BA9078811BE94D0F38559E9985463FC9671D182286CC4F18CABCAEE1A3E5ABDBC384FB27911168B54A387171C0524489FDF512E4D8D2F65050CFE7405D8DF63A79C6E42A76F4538907EFF4DC5870095241523F56FE8E389EBF1A1CC47DDB9F0188513D5259BE257BDA5BE7381F22392CDC2406E0F2448A80F3824F2670F61920C667499DE899F0F6B397381A2DE66255E061AB92CD864DE75C9DB7CBAB9FE76AC38E0AB3389530B4004055268B289B40D79B32E5EBCC74353510BD1627E2D5DD0BE7D3DFD04138F6E3EE7526133DC70490612EAA5024BE6FBEFAB24E1E83D8941A113D8B871F3DBC3011869174888CB7A265D7DE9AB99B999C19AF9B442EBDC904FEDAB52CF40B787AAB35626417C5291F2EB892F43E698A8C65CBB6442A4832F33920FB2DBFC50B8E996FB227F2FF294C385A330957D2FADA9F86839235EA79ECDE6D9D94FBE7C79A38D40B9A8F241F53B921107FF1C72624C9600EC04DFA1160F1FA9E5D986A5A363E9CE8627276DA73F5DB47E4B90328884CFE93194CFFA6FA680F77886E4A7A0FDAF13A7DDFF6984B8855E1F58235BABFD5106338FE2B075D4F10A9FB3D3C5F829B7C61B02B34E9BDE6E62CBCC3AC9F467A6CA170EB43E632EBDBF6847F781E2469B4740FDB83DA34CE34A286E3B363A72CBB13EB66CE1DE35D8FD77DBEDBF45C44DCD16E6B58A1699694D9006947C8C20810E85E3EBF8FB2C68B967743642D86556AB6958E545AB83EC24B96F2B4BB99CC8890C3C1E0FECCE26CE09B6D99000694F870AF9F642374FF0BBF61EFC7CD5AAF5667FC3FE5745DFAF7F13FED70FE070EA4C09CB1A92D8B7F0DFD4B4A4B7DCF4CA6A97043BCEF6346F1570F37B0EB48DB8D15C8A82ED69B0C7833D6C830414C111C987471E84D2CEB5BD973DCA34ACD3A65D7B1A502368941935435B78B8F2B74C2BEF127D96651247BDBE68EB7E466B9EA2A64A13C375103D7C8F7D30A13CBE184BD1EBB19F3274E645F5C7B82EFDF09233D8AD146DC0715266963FD3CCE6F8CDEC20743BF1B7F57C101AC24C64D568923203E1A6AF03A700F5A401EC4572BBA528E284C151F1D108F7563858011FAB32B3776CF2B910D7B21180DBE75742032791018258F4D1407C9A213755C5C91205352DF919B6F14BE056243DF6AC2909E52C9A79F6917440667719185F1C5F1AAF40D873BA22956FA0BBAD9C35360853333A10A0841D9D2E758A0B1BC187F6BBD31C41B74F9EEEF1F7A28BDB7AC3D52FDC6FCB3EF0383A06A61188548963E552716D2BFBD6C2DCDE496D06615E86A5CDB76A03BCA2822ABA85EC6807EBB6918AD2948D193CCF74F4BDAF7090CD4294C1785DCEDB6B55886A848284A6A4A88A496800053E84A9F2DBF6B334AACE11A5A540626716302E259A64C6316ED543806B3BBFE37563897E83BBEFA570312DF908C1786DF0FCF55069EDC336501A5AE9D4BF212D56A9CEE811038656912238AE284575EF8DE1285B763AE54ADF44F91B6DD9E309B7A7A0AB71EC2E4611831B3CE1C9DC85CF907B52DF7406B06367E7A43DECE72DCCC57D268820EA021C27056E3C6B50E7BA7A59B53539A6B7B06B35051E3151C23F3BD3C889B25D0ECE1FD0DF1AEDF657FBB096CA1C861ACB0158501EA1AEFBF6DAD11BDC325AC1CED3739A40B7A83458EF4F3453C0F6EABC1A48037809A90480DF9DC4FF07DADDC58DF2733D49A4FA53C2A41E55A4A0167C6D33BA6E752AED3A125DFD6A0322CD235254505D7B3CED7A0DEE7EB662ACFD30F8B79D1A872998CBCF15CD86E26809E0D2DA0324DDC90FD12CAF9D8E4EDA437FE4E658D47D67C95927C4B5DEE965B940CE93E6743917296E10820A7101F8F633C93069E8B569F4625AFD4EC61BFE4549FDD06C2290A91AC0FB40CB1F55DC8BC1FE695C73AF603840AC0351F5256E00555C984E79A09E58C566D1A117B7E569BEB5850FB491FD9B982442B55BDF53832AA65180DCDDC2F768B1A1361994DE8C25F3608EC853D5982E0AFD1F9FA70170FC3589DDAF958DD840B4B502F8E2697D01AD7AC2233F6A16D540EF8D232887D2B4FA727AE2F038A69AF3DAE69EDA8EF6BF1E0B67D811160B75231543EC5A4D0778B7B42FC1DD6732385AA4400450B3CAEEFDFFCF147635CFA4AAA53DE4EE3035BC40CE8670016384BB877A86A15B59F3DF0C5D624D3D2B23EC46913618C745330A96C715C6F0BD096487E89B917384CC30B3D20A332F1B4056462227E98AF9874FF1D18DF2A6BF84AE822EE737F9E34EE8C69F23EEB9BF38ED056F499545F405759355C104284A6D08A9EFAD8FE28288B2084336A6479A6D42404F3E6FF3AD1DFC63C8AAE971AF11F2699F32F57AD29188492CE07BC1A271035B4D13A686EFDE5572353283A0F3138F6DC05CC35E5E5057C5C8B9E12B0164C0915ADEDF40A6E23848FA59ADC0E65BDD2120486942F232315FC94B4676751A35AAED2828889864C4CB7DD95A662A475733C2CA8F6997A9C822C6C8B9DC95A8B4C367E613E97D3EC6D6DDC2F81022EC21B3A93244E3BC8C2737A7724A3CBD480B26819EEB2676FD383601D79FA266ED3F9BAC2A98FF0109AD7E43E33E108D88C09BA82AFCCCFE98F50F789109D99DCD0A2C61947544F3666EDC621B5D5ECB7088B2430A611BEA52BE7F5EDFC6E2649F5E81F6DF72FA9A748BFF06AF766A60D2B751B23A8AA95CBF733359F7C0CD19B1482A6E6572D1570349C688D78CF8B8C7DD37576DC47A193A2C2797D0AF7504DEE303823A8B77204AE7B6E91D431979798A7EDF435056251D0E3F26B2CA16BFE3422CEA0398D30F0A0DC06DC8A93D27D13650E5BFB6BA04C93FAF0D7D06F99FE4F1F52A059FBE808179515FDA48ECA714F0947FE9A98F02D66FB0D80952411CDFCEAEF6ABA16D92B8F1B82DB151D7DCD7FB7781EC55F4A86C86011FBB9C5570EE76897E7803036E2FE3CDC2D5EA7A613897F3C69A6EA734E3811BFD15E90D7256A0C0C88CEB54EC6AAC151B435CD2A870E4A02087C2B847C75B00B44BB3CA6D4404C3052BD308B8D5F595277592D26F6D5A2193CD4D650BF931FEFB9DEEE61032B29EC0412F38E1CBE025B2891C59574C1450D9E3D8EF27940EF712143F06F38DDB86341A7FC781E0FA8971DAD13AA7E93F1858C70A71A40164211EA9F6A41AE90D19032C2EA52C23375CE3C4E59599ECD6855213AEA83F8DFC5CC70F58A62E4DCA17C09705C0C099B29056592986C03CF5D67074735F2BEA -pk = AF82447CC0ADDB1A14449FB2DA7C5A59023A56A06B190737D384D3012E36441DF79755CE72016906D688DD7628DF37B80EB899EE1744537072FF1CC019928723 -sk = AF82447CC0ADDB1A14449FB2DA7C5A59023A56A06B190737D384D3012E36441DF79755CE72016906D688DD7628DF37B80EB899EE1744537072FF1CC0199287230200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005346E17998E2FDF8548ADC13A15C02174AAC8C87C3BDA5A5E6D5FF44A8491F29A6B1123D7566AC29A416DF7B0DD500000000000000003A173B60211D2EABD338EA9D33B88683D1ECF6722B237E64DC7E5AED116D0C6DB50375C753A4275DF3700D55628FFCFFFFFFFFFFFFFF3EDA6EA0AD118FD546014D3A4464E5E53F8614D32F0F840A1652655E3AA9F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF832D9B93BA45C11C18A29C93AEB60DD49D573405D19F3A4F322A9FE303B00C0000000000000000000000000000000000000000000000C0D8BCE2A2670AAEBAFA05A86718F1EF34EDFD79BB1B796A55C6679AEFD20D1DB138362E2C825FE6070E444649B5DB86ED95015F75486AC618B778B1FA8DA51D99715657039785B58A39478345516EA2A82FF78EE47EEF9A389E452DB6AE250EDB8AFD88E398855829C9378492B287DE32FC97ADAF93D480830790C16B24B81479055E60018321758E0EB2756DDE0E1E8F82630229239D793807B6981E3D6F2FCA3F6F561B516691EADF19AC12F3E457B594E126A2D5EFA6BA37EC8CAB0F462BB5015995823E4BA51C55B5EB333C38C0B3877AB1527CD5D90215EA416FF4232E5A74AD7BBB3E1F3148A2DE36FD8162A1D603950B2A497CDE3BC77AC784D52C1A26DD4C94C4E48348A3662570169424B8B4D3B40E5D2AC3C330E0E6E92559AE2B84EEBD817989721193165C298FCF4E585D7910E4634F1950302FAB927A56AF25CDD5CD8B8B18634E4254283E5B6DC330460BF978C49E328BB8C258F63A9686251C276FAB0B4C94AC128ADA29F3EA33CCDDB609268B6E9026CC103C34C74DFA29C6083173F15F113032B595648055594DC3E521BF4971D969329AB8361A2AE02266C7F240CF9F9C2D72AD7AD81782AE6A9A93F9C91FC7C4C9106D22B11342320C -smlen = 2520 -sm = B6F43D6ADE48EDD98A05336BB37935CF60D09B04E368F48046E137AD0204CC446174BFAB2CDECB0337399B85A738E611FF02FBD3CEF1D0EEF9104D03736F2CCC95441D11DA076C59E089171FF347BD0335FF412F07AA8FB2DE0258C433B8D9A2BA4B92071BBD03926AE6EBFFCC0268FEEAB89C7CE491F407F65381E6092C7C279105CCD388C068C64A61210500B1D0D04382352DA52E26C0AD354776A504010D9ECC25BC1B73CF3705FD4FE0283DD00602954511394B9D10E1BA162861802A717E24EE42A346C9ED280C88E267A41EC09D6D73B6076E7E30257BF265B71A0B6E0CF408F02BA9078811BE94D0F38559E9985463FC9671D182286CC4F18CABCAEE1A3E5ABDBC384FB27911168B54A387171C0524489FDF512E4D8D2F65050CFE7405D8DF63A79C6E42A76F4538907EFF4DC5870095241523F56FE8E389EBF1A1CC47DDB9F0188513D5259BE257BDA5BE7381F22392CDC2406E0F2448A80F3824F2670F61920C667499DE899F0F6B397381A2DE66255E061AB92CD864DE75C9DB7CBAB9FE76AC38E0AB3389530B4004055268B289B40D79B32E5EBCC74353510BD1627E2D5DD0BE7D3DFD04138F6E3EE7526133DC70490612EAA5024BE6FBEFAB24E1E83D8941A113D8B871F3DBC3011869174888CB7A265D7DE9AB99B999C19AF9B442EBDC904FEDAB52CF40B787AAB35626417C5291F2EB892F43E698A8C65CBB6442A4832F33920FB2DBFC50B8E996FB227F2FF294C385A330957D2FADA9F86839235EA79ECDE6D9D94FBE7C79A38D40B9A8F241F53B921107FF1C72624C9600EC04DFA1160F1FA9E5D986A5A363E9CE8627276DA73F5DB47E4B90328884CFE93194CFFA6FA680F77886E4A7A0FDAF13A7DDFF6984B8855E1F58235BABFD5106338FE2B075D4F10A9FB3D3C5F829B7C61B02B34E9BDE6E62CBCC3AC9F467A6CA170EB43E632EBDBF6847F781E2469B4740FDB83DA34CE34A286E3B363A72CBB13EB66CE1DE35D8FD77DBEDBF45C44DCD16E6B58A1699694D9006947C8C20810E85E3EBF8FB2C68B967743642D86556AB6958E545AB83EC24B96F2B4BB99CC8890C3C1E0FECCE26CE09B6D99000694F870AF9F642374FF0BBF61EFC7CD5AAF5667FC3FE5745DFAF7F13FED70FE070EA4C09CB1A92D8B7F0DFD4B4A4B7DCF4CA6A97043BCEF6346F1570F37B0EB48DB8D15C8A82ED69B0C7833D6C830414C111C987471E84D2CEB5BD973DCA34ACD3A65D7B1A502368941935435B78B8F2B74C2BEF127D96651247BDBE68EB7E466B9EA2A64A13C375103D7C8F7D30A13CBE184BD1EBB19F3274E645F5C7B82EFDF09233D8AD146DC0715266963FD3CCE6F8CDEC20743BF1B7F57C101AC24C64D568923203E1A6AF03A700F5A401EC4572BBA528E284C151F1D108F7563858011FAB32B3776CF2B910D7B21180DBE75742032791018258F4D1407C9A213755C5C91205352DF919B6F14BE056243DF6AC2909E52C9A79F6917440667719185F1C5F1AAF40D873BA22956FA0BBAD9C35360853333A10A0841D9D2E758A0B1BC187F6BBD31C41B74F9EEEF1F7A28BDB7AC3D52FDC6FCB3EF0383A06A61188548963E552716D2BFBD6C2DCDE496D06615E86A5CDB76A03BCA2822ABA85EC6807EBB6918AD2948D193CCF74F4BDAF7090CD4294C1785DCEDB6B55886A848284A6A4A88A496800053E84A9F2DBF6B334AACE11A5A540626716302E259A64C6316ED543806B3BBFE37563897E83BBEFA570312DF908C1786DF0FCF55069EDC336501A5AE9D4BF212D56A9CEE811038656912238AE284575EF8DE1285B763AE54ADF44F91B6DD9E309B7A7A0AB71EC2E4611831B3CE1C9DC85CF907B52DF7406B06367E7A43DECE72DCCC57D268820EA021C27056E3C6B50E7BA7A59B53539A6B7B06B35051E3151C23F3BD3C889B25D0ECE1FD0DF1AEDF657FBB096CA1C861ACB0158501EA1AEFBF6DAD11BDC325AC1CED3739A40B7A83458EF4F3453C0F6EABC1A48037809A90480DF9DC4FF07DADDC58DF2733D49A4FA53C2A41E55A4A0167C6D33BA6E752AED3A125DFD6A0322CD235254505D7B3CED7A0DEE7EB662ACFD30F8B79D1A872998CBCF15CD86E26809E0D2DA0324DDC90FD12CAF9D8E4EDA437FE4E658D47D67C95927C4B5DEE965B940CE93E6743917296E10820A7101F8F633C93069E8B569F4625AFD4EC61BFE4549FDD06C2290A91AC0FB40CB1F55DC8BC1FE695C73AF603840AC0351F5256E00555C984E79A09E58C566D1A117B7E569BEB5850FB491FD9B982442B55BDF53832AA65180DCDDC2F768B1A1361994DE8C25F3608EC853D5982E0AFD1F9FA70170FC3589DDAF958DD840B4B502F8E2697D01AD7AC2233F6A16D540EF8D232887D2B4FA727AE2F038A69AF3DAE69EDA8EF6BF1E0B67D811160B75231543EC5A4D0778B7B42FC1DD6732385AA4400450B3CAEEFDFFCF147635CFA4AAA53DE4EE3035BC40CE8670016384BB877A86A15B59F3DF0C5D624D3D2B23EC46913618C745330A96C715C6F0BD096487E89B917384CC30B3D20A332F1B4056462227E98AF9874FF1D18DF2A6BF84AE822EE737F9E34EE8C69F23EEB9BF38ED056F499545F405759355C104284A6D08A9EFAD8FE28288B2084336A6479A6D42404F3E6FF3AD1DFC63C8AAE971AF11F2699F32F57AD29188492CE07BC1A271035B4D13A686EFDE5572353283A0F3138F6DC05CC35E5E5057C5C8B9E12B0164C0915ADEDF40A6E23848FA59ADC0E65BDD2120486942F232315FC94B4676751A35AAED2828889864C4CB7DD95A662A475733C2CA8F6997A9C822C6C8B9DC95A8B4C367E613E97D3EC6D6DDC2F81022EC21B3A93244E3BC8C2737A7724A3CBD480B26819EEB2676FD383601D79FA266ED3F9BAC2A98FF0109AD7E43E33E108D88C09BA82AFCCCFE98F50F789109D99DCD0A2C61947544F3666EDC621B5D5ECB7088B2430A611BEA52BE7F5EDFC6E2649F5E81F6DF72FA9A748BFF06AF766A60D2B751B23A8AA95CBF733359F7C0CD19B1482A6E6572D1570349C688D78CF8B8C7DD37576DC47A193A2C2797D0AF7504DEE303823A8B77204AE7B6E91D431979798A7EDF435056251D0E3F26B2CA16BFE3422CEA0398D30F0A0DC06DC8A93D27D13650E5BFB6BA04C93FAF0D7D06F99FE4F1F52A059FBE808179515FDA48ECA714F0947FE9A98F02D66FB0D80952411CDFCEAEF6ABA16D92B8F1B82DB151D7DCD7FB7781EC55F4A86C86011FBB9C5570EE76897E7803036E2FE3CDC2D5EA7A613897F3C69A6EA734E3811BFD15E90D7256A0C0C88CEB54EC6AAC151B435CD2A870E4A02087C2B847C75B00B44BB3CA6D4404C3052BD308B8D5F595277592D26F6D5A2193CD4D650BF931FEFB9DEEE61032B29EC0412F38E1CBE025B2891C59574C1450D9E3D8EF27940EF712143F06F38DDB86341A7FC781E0FA8971DAD13AA7E93F1858C70A71A40164211EA9F6A41AE90D19032C2EA52C23375CE3C4E59599ECD6855213AEA83F8DFC5CC70F58A62E4DCA17C09705C0C099B29056592986C03CF5D67074735F2BEA - -count = 71 -seed = 270BEDAA7BCD43990FD8B4F44FFB63A3AE8E991BB2BF84DA7BC2CCD1A079C579AEBE2082ACBAB7FF286DE795F31973B4 -mlen = 2376 -msg = 326A4FE723BE9363ACFC000705A10B6CD8A7B25E99A34B4A354CBD6F50550BED30F6C4208490B4194AB79B24B093FBE132C299DF924F2FFCC2CDC6C2C9019EEDF4B72D7F0817825BD787135927102E1DA041E9A78B501B42DCE777A79ACE604E57DF11775D7B87E75E5B00ADAC90D1ADD78CC5AD348C7472EEC6E6E06F737E77115A9509A6AE6570F738DC2F21314A7CCB9D44ADD6E1434CDFE3614BC73A6B468F6691B60F4F2DB103289A90C4FB2BF5AAF87826D2BEB0880FA64E07E9BD30D4EDA00D6BDA01D1EB22BCF14EE797A859C9A0D9034E8C5316201AF91388C47E1DDF061C9F45E067A5F60B355C98F8734559B8F1B82F47BD9CEE0224A1D67D40706333523C34F3582B6C8CB47BF7D0E4FBC7D7CF3DBF21077E664FD59998338F4DD4A423C3A145EE1E994AACC1A48F81A7E9FE106008DB93A6626B8C8505043AB864D93AE3972675E69C3825304086AA3419216CCAE7F7D5117739E99D8F4A0B658148DE33FDAAEB9967EF56677D2028C3B584C5CC1C096F4DA16799408B2EE2FC3482AD2F49293CF4097A78492470099BDB90BCB4FE3B245AC8B3C53E05D7609E34770ADCC147033A8FADE81359FF63C3FB90C5A498C98B7A0E5EE9CF4D287759ACDA4BFA3965CA85E1D1C1019E7FE6D82E5E66A717F94890277E6DB1EAA6F3291FE1BCD7D437094749FF5574B8728E0DC21A143A14E382937EFB7EC1B0FB3F6F9C0F547F470E3B436DFC7986F923BEAA89583D8978C433E0CB0C4E98516AF1AC797C778662455A57FEF45BA2C7865C1DF5C502EDB01C8CC729468091BB96BE9DA9C298528187867EEE9A06141DAA15F60CF719DE2BD15010550B92A41F12D8F38B54692589AFF51A9D5E6047A0D9B707369992251DF31341A45B01B05FFED8ADEE5810824F903EA59F14FD500AEDAE797F8BAEB470C0B14C4EDA5C687E4848A85B30A8E8F59C45D4C9F0C65FCCB15F4D4209A55722C29B6CB09AECB4E53FA3AA602C56EE3BA6900CC12889E7B87D5EF283AF1586764519A30CF60833C82F0ED15E39A8BCAD5C6AEE9999E63D399C5CEA10AE1F53B04858EF7896AA29FA541451FDB685734C39470250545193CAF26C9891F7F965904AE10E8566BFF9B2F465BBE13D6EA4A79586E68844B9FA68B2F992565C8B0EF5FFDEB5878CC12A0571CA3AEA50ADD29DD06E13741A1AB215BF487BE7735D1634332F47E037253054A21E0AD8D8F011334CB5951F833D4D344D632BCAB7C373CB7DAFE8F3D79E7E13BDB1C6CFFA474A9FBB46F5736D55F3466534596EBD22B29107A8FA50C1D0E62F0533E343FEE038FC0C3040A6DF2D318BBC8420019B1B148D6D1DD2FE428C2FD617CA73F224EF9AF9BF6F83CF1006616235471B69DD4EAF9F32529EF3E1DFE6765E61E246B519C702351C9CD66C57065EC78993D793B082E3685EB06F2530B07862277D339A52813C99EBE16C06C4C8F547D9705850E770982E8FA0275A52F430FF2422A115ECE46A9202CAA0195789532B1444F1507AAB2E4303464E499989F21C7D881328F18DBC77D4B9B467CAE244A93053C0321DFBF815DA28B6EBF483EAFBE634E9947BB5383FEE3A31BC03A63FCDDA5E3E46D5D3184718C348A83975728714351DF43BAF91787CACA346DBB819602F18A4C4FE90C4CE307984BCDED89CD2E4AEB66318C10D95AFA5BE53393FEB981C21BB1411BB9C58818BCC141223D66ED5F35F90C05FD4848617220DD72F5E892292CE20AA9A0F9AD54022CBE94D2C86DAF3FC66949AC35D8E122B02E2D155E73F4CE24D7E85A5C301DCC173CA8EC090AF9DC7F443C983280DDA27ED4B9BC71F86E84F7AEE39E6A7E9BF5E43920AAC858F0F49A06216D9D3984CD2E3575C0FA6CE8A5E28B0F481CCBAAB450FABCE8A1084EF458DBE257CF09D8116136C2CF1EDFA6CCE31AED0F1F8278C1C8D9C79846886D48E3FD311C015BF2373F7CAA71AA26B011D0DF5A843AB53D7E7F0466CCF49C5D4DE872CA87B8895101EE0147A3DBD391BEED75FC16F65814D56CB29273A5F4E5400FCABF85040505C31D001DF0023726E9C1F7C29A37039FDDA73B9B99ACEC3A029F7C0DD61ADE7D5E835E1CD605AA8E583BF8DC99285E86CF91F4B4827A0E8956EFDE2B495A86F85E78B954341CF3AFEBE8DB71C26B9B1BA27B47284AA84E55B1C2AFEE733AC596A10186D9AB504F33E34A06CA931D7633462B04B9B2B0D4751B0343503BCB2A1893D944FBDB4BE63DE167348A1588E6551FD9CF2101B0B4CB61422655FBEB50D64CB9E87A23007A39821EC3ABA391485347624EFC3DFDA4A133C537D7CD8C3A549BB6BEF9A52D2EDF0A8892C6FC3EEC3EFC3C18741C85BF24CD3B36CA04EE77F654ED5595A0E4B9316CCFE4D2AA6B4A66B06F309337E363C9E39829C8838729F19811093DFBE962246473B7A19FAEDFDB0193F63EB85EF308CD3BE5831F35CED36D9448D0EA8306044F78946079210CF89FF78104BCB2964CE2AF9954D53885D7914E4FFA4AC7E9B3D103922FD1AD68C0A4592F885C5FEE51D52214E17035E8681086203B79B5EB176679EB3263B44EA7287262DD84BB98F6639B9657AC04E397D69C634A0C1181ECA485E467D62631AD2D9AFD5AC5B86ED4005FDBB7404B65BBB826F1A2334A481B9CD46E0CE9C414A162E84368089F24149D7D05EA6ADF40B25A708357AAA5A28801FF100F69252810188CFC6087507BB5BDE1CD43BF72B1B3207CE4F7E65A18E5276613D4BEDDAF21AF7B964FF69965C47CB03846F7CEDDD2C5133080FC632A4F0B3495B2D2751727CF7681F28675552DF2A0994E425A922BBFCF84189B8C9F43058D691DB3166C596F6BC480EFDE06BDAE7B9C2985A1F2F6441520620E193D7B94AB46DBA2A1ADE44E2B006734E6770F34B0E2122DD7F4EAF045164DEA8C2FECE7758630384C00A6B528A6ECF07045B2DC0281C936A540904733149BC65B0F57ACD9A5E41C2ADF83FD6A760B169BEEBF04644DB1314270ADF86D01CC2CD580C609E78BBCD9D2694A89F9CB6DD36B9AA2AA5581FF561B5417BE2B52F3EF2581E461CB0690782F33862C52590643BECE0A6141DC805D8F56C4F64C1BBC49A3ECF1E8827926796E5F9335DF47DA6D3E4C14795B547116FD1F3351FC55C28B543183FEAD8DF7DA4DFBCC38E224901FF7BD83B16631064CAC4A37FA632F53F004374AA19861FDCA515AF91E66186EF804366D5A1B3B4FAAA60A0C4B36B972A9579548B4CDACE7EB85F1F68A4E4255FD994C1786975E7F6F0BA87D0295DE72876BCE37146A09EDEBC0164B9C4911CE41EF4D48130A27651BD0DC315FD622CB6D03759D35756806332658B5B33E768860C1946569AA45130486AD49B -pk = 2D8C194138B3CB1DD49659525266989E96EF4B516573D33DD21A0801F1DBB9120DAD38F4945C6E32119D1CF5DACE8065E2AE392A9EDAB4C67238102711438606 -sk = 2D8C194138B3CB1DD49659525266989E96EF4B516573D33DD21A0801F1DBB9120DAD38F4945C6E32119D1CF5DACE8065E2AE392A9EDAB4C67238102711438606020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CE0B0E0E9497ED547F7C9FDBFE04F84BA9C3322C04774F21B7BA216C23DF91997086A486BE10EAD65304DD867E5C0100000000000000813B2A461EBBE2D4E7DF535B984D139325F7F13CC8D2D44CE58560EDF976C2C2065AB1000479D3DA89B595D33059FDFFFFFFFFFFFFFF7196918ABD0343331800EEA539FBC22F2338906C61D561FC89BA1BA16C41F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A6F570BB3110090C24DA83242811A2431A93E2C414013FC57C46E218C2F0B00000000000000000000000000000000000000000000001887A5588DD6CFC5977C4CD2DC8D863A79B17C9F5A38380166DE1D8A6769A022D7EE7F52F4B16AF690DCDDD03E825BCEDA8DA1767F6852036573B750E61CA101EDFB9203585DF166507029C4C522A41E526E2D73049298B21BB57B10641F622A8945A611AFC1FB69D9B4FA2A33FEA059FDDA9D6283EF06B75A863EBDD330D31FB19E48FEFF450CA1A18510A038DD1BD07564FE5C59552606D40D040302A53314387BDD0A3B199D005A1C207A790204FDBBE997BA9F4A2D56A2A979600D321314654396FD722AF95C317FC0FD3C19338AB4755AA5C476CBCC7FE63F686EE74E0C51EF1E00A624467A9A4EE29684BD98EDDE637904EFB2FB7727CB0A79D0200C28CD80A9EF0E5A8B7FAEE8421FBB080C13E113BE507CB5FCC9FDD0EA3259AF9C18E3F4E850FE2E624DB28D01CD69B94AD4997956DEFAB8FEE49D89484A650B672967F08B8626467B97B7E767C8CD5C8FDACC172F607F9512F34FAA1970F8E30B2E37F320BAB7F6B0C7C4E87E7E371DDC4C8473C031945422D0BE5801BF4620832233AF8D8F34070001082AD99390C8B03C57E00DF8EEDA1EFDAEDA7548A3DFDB2B8D0C1D29EC33FCC1AC035D091C012B499A2ADFAC86927C67E92B5E04C993C707 -smlen = 2553 -sm = 2227D70D041D807B120546D2FAF05B30BFC0AF014D4835145D2928A1320103531F7C558702FAD400ED40D280556FBDCFF701C455E3DDB48CABF2D1047441F663E62923758807945EC47B52DDE5F1A202BBE58EEF87B3AF22D701ADEDA36B941BD8051C0603BF7064DDF3F17E060759D2C9A6285D2E60C10260964B6BACB214D63107823D5B79349C3A960C040137DD13EBEE5E84D9B105B6AFA78D98820D03012ED986BF0DD05CAF01ED86EEDEAD900102326A4FE723BE9363ACFC000705A10B6CD8A7B25E99A34B4A354CBD6F50550BED30F6C4208490B4194AB79B24B093FBE132C299DF924F2FFCC2CDC6C2C9019EEDF4B72D7F0817825BD787135927102E1DA041E9A78B501B42DCE777A79ACE604E57DF11775D7B87E75E5B00ADAC90D1ADD78CC5AD348C7472EEC6E6E06F737E77115A9509A6AE6570F738DC2F21314A7CCB9D44ADD6E1434CDFE3614BC73A6B468F6691B60F4F2DB103289A90C4FB2BF5AAF87826D2BEB0880FA64E07E9BD30D4EDA00D6BDA01D1EB22BCF14EE797A859C9A0D9034E8C5316201AF91388C47E1DDF061C9F45E067A5F60B355C98F8734559B8F1B82F47BD9CEE0224A1D67D40706333523C34F3582B6C8CB47BF7D0E4FBC7D7CF3DBF21077E664FD59998338F4DD4A423C3A145EE1E994AACC1A48F81A7E9FE106008DB93A6626B8C8505043AB864D93AE3972675E69C3825304086AA3419216CCAE7F7D5117739E99D8F4A0B658148DE33FDAAEB9967EF56677D2028C3B584C5CC1C096F4DA16799408B2EE2FC3482AD2F49293CF4097A78492470099BDB90BCB4FE3B245AC8B3C53E05D7609E34770ADCC147033A8FADE81359FF63C3FB90C5A498C98B7A0E5EE9CF4D287759ACDA4BFA3965CA85E1D1C1019E7FE6D82E5E66A717F94890277E6DB1EAA6F3291FE1BCD7D437094749FF5574B8728E0DC21A143A14E382937EFB7EC1B0FB3F6F9C0F547F470E3B436DFC7986F923BEAA89583D8978C433E0CB0C4E98516AF1AC797C778662455A57FEF45BA2C7865C1DF5C502EDB01C8CC729468091BB96BE9DA9C298528187867EEE9A06141DAA15F60CF719DE2BD15010550B92A41F12D8F38B54692589AFF51A9D5E6047A0D9B707369992251DF31341A45B01B05FFED8ADEE5810824F903EA59F14FD500AEDAE797F8BAEB470C0B14C4EDA5C687E4848A85B30A8E8F59C45D4C9F0C65FCCB15F4D4209A55722C29B6CB09AECB4E53FA3AA602C56EE3BA6900CC12889E7B87D5EF283AF1586764519A30CF60833C82F0ED15E39A8BCAD5C6AEE9999E63D399C5CEA10AE1F53B04858EF7896AA29FA541451FDB685734C39470250545193CAF26C9891F7F965904AE10E8566BFF9B2F465BBE13D6EA4A79586E68844B9FA68B2F992565C8B0EF5FFDEB5878CC12A0571CA3AEA50ADD29DD06E13741A1AB215BF487BE7735D1634332F47E037253054A21E0AD8D8F011334CB5951F833D4D344D632BCAB7C373CB7DAFE8F3D79E7E13BDB1C6CFFA474A9FBB46F5736D55F3466534596EBD22B29107A8FA50C1D0E62F0533E343FEE038FC0C3040A6DF2D318BBC8420019B1B148D6D1DD2FE428C2FD617CA73F224EF9AF9BF6F83CF1006616235471B69DD4EAF9F32529EF3E1DFE6765E61E246B519C702351C9CD66C57065EC78993D793B082E3685EB06F2530B07862277D339A52813C99EBE16C06C4C8F547D9705850E770982E8FA0275A52F430FF2422A115ECE46A9202CAA0195789532B1444F1507AAB2E4303464E499989F21C7D881328F18DBC77D4B9B467CAE244A93053C0321DFBF815DA28B6EBF483EAFBE634E9947BB5383FEE3A31BC03A63FCDDA5E3E46D5D3184718C348A83975728714351DF43BAF91787CACA346DBB819602F18A4C4FE90C4CE307984BCDED89CD2E4AEB66318C10D95AFA5BE53393FEB981C21BB1411BB9C58818BCC141223D66ED5F35F90C05FD4848617220DD72F5E892292CE20AA9A0F9AD54022CBE94D2C86DAF3FC66949AC35D8E122B02E2D155E73F4CE24D7E85A5C301DCC173CA8EC090AF9DC7F443C983280DDA27ED4B9BC71F86E84F7AEE39E6A7E9BF5E43920AAC858F0F49A06216D9D3984CD2E3575C0FA6CE8A5E28B0F481CCBAAB450FABCE8A1084EF458DBE257CF09D8116136C2CF1EDFA6CCE31AED0F1F8278C1C8D9C79846886D48E3FD311C015BF2373F7CAA71AA26B011D0DF5A843AB53D7E7F0466CCF49C5D4DE872CA87B8895101EE0147A3DBD391BEED75FC16F65814D56CB29273A5F4E5400FCABF85040505C31D001DF0023726E9C1F7C29A37039FDDA73B9B99ACEC3A029F7C0DD61ADE7D5E835E1CD605AA8E583BF8DC99285E86CF91F4B4827A0E8956EFDE2B495A86F85E78B954341CF3AFEBE8DB71C26B9B1BA27B47284AA84E55B1C2AFEE733AC596A10186D9AB504F33E34A06CA931D7633462B04B9B2B0D4751B0343503BCB2A1893D944FBDB4BE63DE167348A1588E6551FD9CF2101B0B4CB61422655FBEB50D64CB9E87A23007A39821EC3ABA391485347624EFC3DFDA4A133C537D7CD8C3A549BB6BEF9A52D2EDF0A8892C6FC3EEC3EFC3C18741C85BF24CD3B36CA04EE77F654ED5595A0E4B9316CCFE4D2AA6B4A66B06F309337E363C9E39829C8838729F19811093DFBE962246473B7A19FAEDFDB0193F63EB85EF308CD3BE5831F35CED36D9448D0EA8306044F78946079210CF89FF78104BCB2964CE2AF9954D53885D7914E4FFA4AC7E9B3D103922FD1AD68C0A4592F885C5FEE51D52214E17035E8681086203B79B5EB176679EB3263B44EA7287262DD84BB98F6639B9657AC04E397D69C634A0C1181ECA485E467D62631AD2D9AFD5AC5B86ED4005FDBB7404B65BBB826F1A2334A481B9CD46E0CE9C414A162E84368089F24149D7D05EA6ADF40B25A708357AAA5A28801FF100F69252810188CFC6087507BB5BDE1CD43BF72B1B3207CE4F7E65A18E5276613D4BEDDAF21AF7B964FF69965C47CB03846F7CEDDD2C5133080FC632A4F0B3495B2D2751727CF7681F28675552DF2A0994E425A922BBFCF84189B8C9F43058D691DB3166C596F6BC480EFDE06BDAE7B9C2985A1F2F6441520620E193D7B94AB46DBA2A1ADE44E2B006734E6770F34B0E2122DD7F4EAF045164DEA8C2FECE7758630384C00A6B528A6ECF07045B2DC0281C936A540904733149BC65B0F57ACD9A5E41C2ADF83FD6A760B169BEEBF04644DB1314270ADF86D01CC2CD580C609E78BBCD9D2694A89F9CB6DD36B9AA2AA5581FF561B5417BE2B52F3EF2581E461CB0690782F33862C52590643BECE0A6141DC805D8F56C4F64C1BBC49A3ECF1E8827926796E5F9335DF47DA6D3E4C14795B547116FD1F3351FC55C28B543183FEAD8DF7DA4DFBCC38E224901FF7BD83B16631064CAC4A37FA632F53F004374AA19861FDCA515AF91E66186EF804366D5A1B3B4FAAA60A0C4B36B972A9579548B4CDACE7EB85F1F68A4E4255FD994C1786975E7F6F0BA87D0295DE72876BCE37146A09EDEBC0164B9C4911CE41EF4D48130A27651BD0DC315FD622CB6D03759D35756806332658B5B33E768860C1946569AA45130486AD49B - -count = 72 -seed = F151196F55A9ED88F1663AF6BD24B2CB9DCAF3C9B313CD8F0A27639D3CDAE72EA90D60ED5C7C6AB697A06185E5A2E215 -mlen = 2409 -msg = EFC63DD588A7230CE08EFCFEEA534F5A0EB005480AD1D169C386E476715238526E936FEA7136E2D8AED60DE31CC91DAE4E764CE5F93624FA7F72B87562FB6AD8996B5E41FD478AF0AF8338A7FD9AA250EFD2F2D20364E8A88A8642E8E38F38583ABF8D3BE97F14C3EDE66EBF8EBC84385CAE646CDED8C5CE8F06910BA7FEC05D828446D558D6FED766FBA347DA2E84DA247C34266AA31C328804F4E3AAF6ACBB0AD50FEECCEC00D20B3610785B9F1BA06A0BADFB42A8F43DE3F7BAC36057EE0B4D2A15DB040A8903F767F7352995C8FC3E06ED1B1322587EEE5B31806192E04B09A7B433D08CB2A340942CB75C51E0F8409F907F69C5F8DC316A227942EDF7A458974FDA76C255FF4F1A85A352CD2CD2A21507E0F37451060D31D0847528B3ED5DA3E7168CBD0302F1B03842E63B3DEC6FB37357E37FC3CC26721F290726A47AB3D4DD8FD1778FE5133726C240E7B3E398F3D809C6C469680B9EFD25DBE890D6936B76A52F97AEF3F93872B76506A95685EECDCBCE203400D182252471B99B7F4C6CED4CAC8FACA7682D0DF07BC5904AAE042479855098CBC41534F0EF17F38F1BC8C272CF72C1AC4A5564DD132130EE676E7D7EC3CABB4E85AC81945C87DE08EC60CED3FA0AB3E83C18AE493A851434BFA2C4968B42ACCCF3609539C62A4E01F8BC159362E15EE91D8AA399D8BD8D67BA1E8FD646EEBB4583812293406B05BA5BE2B1DF9620E6FE3DAF8CEBD9652BB04494B899F407C7D9ED1C4E77FFADE24ABE56AD597BD438928E05B0363D6D2685D34D6B51D71012844415C46F13181B146A3AF25AE4E8853CC7C7EF6387306C45180A6EF9E97ABE1E7D5E10115752C3071B6A213367E8B1A3D1C3703CC1840735315623901D772C61D55EF8C47DB10F0EB7582D7A043018DC1363E93F315DD984B8002EA7BF5BED38D3F273276CA577CF99A635CB6ED9D6525520793405BE27C86E6EFFEABB1E5F84A0076BD151CAFC59853424DE4B3460C673B0820D76E15EE47B6505D2D5C179DB92A44042F3631C646D350EA9721B8984660A76018DCA5C6BB1223CD03CC844DC9371D32549D9D645F75D2683FDAD1DF6434BBE43200E506ED2A815FAB511172C70F99A85FA3970433E8955B2F9389F23C10141B5779A23B8671EAE8B91991B78F635FBE8E627D3E79D91FD1E6E90699640BA3AE8D7E4CF5145F1259CC76AE50B1FA150D8338A9450A5B6B90EEC9C94318BC78C9C7715A3EB215AEE6443540D211A0556813529023E5A581623CD6D19BEF0705A5F69AAD4833A57C308144E92899AC5683147CDBD279D5C3A55BBC5E8F8E26A158A3E42F8C5B858909B024B4BA4069E26DE66460FF4A7DC92BD54AC244007B6AC6CE07A31A2AF3323CB55F07B8F480D279308FE10F2DDB001DA6C4AA132B988AD03FB63E0EB06544571F5505CF377A81153D6FBD4FA2B7562074CFAF587CCF28DAC84AFA58809C0B296E0D2594D3582C28596F5AF7500E143BE7B49C63D04F49BBFBDF60B024DABA5533F945BA90659758E06984921EFEEF79604059EB808C9FE1BF9BC5351A406FBBA7F5D8FC9F891488E537DB14B216A0535C9FF7BF8D5C68A2453A8A48E58FA7BF6EB76448D6D0BD05BD4628C4B852A236A11BEC0F67118F1267CA42647F6F2303509094C9A7F3A07B2724ABD2D9B56B71FA7AC6CDDE456EC209BE76C419855A5151EC9EBF0E0CF1B86F4E8E81B8173960F8D1C8AFFED1AC7B818AF8E3BC092E2B209D693E80B11EC7DA39CA93223E1B47C6127E8AD40A78BDB0ECBFA1F39C84CB9ECDF960ABB39884627BC4105C53EE7BCA4802B92AF60241420CBB36C407F46CC2E953D7E3503CC82287A8D68D0E673E212173D80A12257ADD5256652188C00590DADCFB7DBB6B35507B853EA5FAD4F52E02230CB3D3BBDFC43EB74780583E8DBB851E0257117F4A39A6676586216220C1CA21DE16CDFE6E1CC99EA7C989916AD2FED4A8373CFCFF02207529BFFCB7B7601317450BF430BAC9CE111B0FBA8D7DE6627F863078D8E6286B2D34856426EA90FFD58705444D0DC12D4FEEAD0FFE543811E1EF306F40939922563832D06E6DEA7109087AC051A361EA9E755856FD4E51388BC7C40C63E0953C8413AB0CBFF70C466E15DE5B089D095E8EE8A64E929D26CA3B71EF0B2360AECDFA89284CCE08C666F4E0146362F0BB84B87A49FCF2324EBB96DD941F00E2586F7246436EB66B1E04AF84482D8ECD2BC8EF9955CBEC62AFDD754A7F235C7F3C41CD0B36A9024D426B7388D3C33A5A6E858846C0FB0D88BA5798C923F9B43D14A6661C65092D5C5EC0F97D84784FA336AE6EF57C7A5D04804B96D19849FF9074724A5FACA538E32C6EFAA5209317543159272CE50454FE1E7D068C8F5FF3797A66D5F87758627AB5D40EBE1FB7CE9D69287AE7A5F349A5DAABD8A8E7778BAA26DA0EB237034A3366448280237A165CBB303BE6B33C0F11C1E56C50A84384A0F6878F2A99B14CD3B6820ABD27D2011E0C37F8439BEDE65747038A5FF7F00DAEDA094331523CDB7E10F1063B64A584D3E9F0655268F89DBEF3EA3FA4C6E54FEEBF8F0046C6C811F0767CF6FCC9B3497DB05582774047A8DCFF6A0C1B5188076E64A9D5693195075F2A05E507A5A523EEE4537079F9E5E79210E4AF056D6624D45A0EBA553CA9BC92171451970102CAB57DCD89ACEBBD7025008325C61145264F42E4D14A76E5C2F1C129D4C054DA00501081617D1A27012A6E160750DBA73BECB5DC05105BFDE1F1D0CDC837355844B291B09015FD610628513C1C86EAD373730B99FCD4A552FBA07163CE9CF6A3D3AC0525593F0648256E8B33FBCF92AF58CE26D0F036E11230879DBB789507BCEEFD2960EA320236A224EA74DD2AAAC541664FA3EA9430D4FB09C878169A8AF1E7FD4BE5E7926CB0B6A352B25F452454474107286EDAA145C0A0573361522EACB618DD9C8B32BD1A8A5923F4C698CCA0139DC640C1D5D557CE889BB69CE32D85853DFBB0F34DA2CF18CC79472906B67F6BACBF287F31DE0B9E7A01A356EC9B64653CB922501EA1EDA940089BA0F293B667F482E92438805CD6851776CEA0920CDEFC4062C9B4E51F5AA1D7FF909CC2608B6F28CCF28D574BF67CE80D4DDCCE28F2ADE0162CB66894B5B2DA0EB975CD95EE7FE72FDA2736616C8B571FAC94BF8C64ACD1642D9431118F08A62328D99B2B9D90BBC915DB764C4935951A59C369C72060CD9F4273BDCA0C295294008C0AC3A149E8CA5E8BF21042F5F21C067147F3BB52B13975026A9DF7246AFB1D053670982AB316509F2850342913E1322758ED89DA02DD79126726B1C5566C1831CCB1D62B3E271875E62CDE0DF0715D404F95F580B63923F362D416F83FE5AD98EED584717FBC2CB7D1B00101200F4EB4CA5 -pk = 8751EB75B62E46920A9CA05B112C24835E886F0F7C59188799EFA139A2237902A266AC22F5B9FA664BD2A1612E602FE9C42BD4E859E3214A295412B132CFE21F -sk = 8751EB75B62E46920A9CA05B112C24835E886F0F7C59188799EFA139A2237902A266AC22F5B9FA664BD2A1612E602FE9C42BD4E859E3214A295412B132CFE21F020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000413E9416E2A408D8A9A5552F490E685B89693FB7B576CADFC16AB2EC19E94F2D3C439D379C549746C6F2C9F365EB0000000000000000D4C7B58E772CF8F73D546535C37271AC985AA4113C938AA790004BCD9F85C5AFD9D73934F749C348FDE36E5A50E7FEFFFFFFFFFFFFFF1451443033D2234DC8DDAE3D2BDDD771A281048C238C7A20619C9ED2F59EF5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41CD9803C68BB8C3B7D7188969DB8C065928FF59C1BF192B0A1D702889DC0900000000000000000000000000000000000000000000007933C9219ECF638F6B5331140F3C5B176194BBFC3EFC8A0E910597A16C36F92353AB4664B46C46FA8060EF3DADCD90AEA12DFD6BD6F20FD21CC4316C06684D17A6B488EE8BDD111B186F28924435F4CAB768A4A0AFEE2CE6124B7B1FB3495026FAEBD96ECF9968E080625AD54611E35D4DF3AD383D17328057087E862154370966B6283D4D16E294CC8E634704877D1DE53D8B77054321D4C9BBFD7655596C047686D11AC6B680A271112C75F2AF70A091BD5D27AF5146D37DAD96FACA031B014AD18681356DD5FAC6B431045FCE83594D8F473DB8D5C6FB598511D212D9781FB68BA428023B3CDA72B915D0C467EB1F90714A25B7A5F191CE915E4BD995CA02481539E7A228695F7A0A48F5DEBCF1D240C725C71E5D93A0ED89E5F2DE917A05E9FC0C0448C0480701ACF4E1BFFEB4A09DC11F4E94FAD5B694661340A63EC0217B2A43EFD97AEE62F8B2733BF3A970F8EC5A3EFCFD6FB4BC376B7A012D4E4C277F34AC30DDAE1B3927F1C5BF2ABC7D99EC74B78163D4DA19346C13288A9A6A2B58532976D6D0DCAED327EC30A47928E45245EEC8378FBD25A19CDE261898412A4F79F9B435CD79282EE4A22C9539872604A0B824C78686BB5AB2AD634CA2160B -smlen = 2586 -sm = 3E3328F1AB7BED5D31024C0D66555301D7785E02A88DA63BD2959D0B1E04939E467524B38C26FB01CE31364DA7CB5AAB7B0503441EB8204876093303DE59C60FC7DDD6A4B501ED992F3EFB9A3E79020785E99C9FE310555B73053F611CEDB149F7F9970224125D9E33A1DFDE6A077720FCB2B8A6E1F35704C556EBF0FF2705B916043E23F1C7A269233C900300AF895A73B5CB20F8029CD322E0159BC60403D630A6396A5BA5404C04AE2ECEECBA169100EFC63DD588A7230CE08EFCFEEA534F5A0EB005480AD1D169C386E476715238526E936FEA7136E2D8AED60DE31CC91DAE4E764CE5F93624FA7F72B87562FB6AD8996B5E41FD478AF0AF8338A7FD9AA250EFD2F2D20364E8A88A8642E8E38F38583ABF8D3BE97F14C3EDE66EBF8EBC84385CAE646CDED8C5CE8F06910BA7FEC05D828446D558D6FED766FBA347DA2E84DA247C34266AA31C328804F4E3AAF6ACBB0AD50FEECCEC00D20B3610785B9F1BA06A0BADFB42A8F43DE3F7BAC36057EE0B4D2A15DB040A8903F767F7352995C8FC3E06ED1B1322587EEE5B31806192E04B09A7B433D08CB2A340942CB75C51E0F8409F907F69C5F8DC316A227942EDF7A458974FDA76C255FF4F1A85A352CD2CD2A21507E0F37451060D31D0847528B3ED5DA3E7168CBD0302F1B03842E63B3DEC6FB37357E37FC3CC26721F290726A47AB3D4DD8FD1778FE5133726C240E7B3E398F3D809C6C469680B9EFD25DBE890D6936B76A52F97AEF3F93872B76506A95685EECDCBCE203400D182252471B99B7F4C6CED4CAC8FACA7682D0DF07BC5904AAE042479855098CBC41534F0EF17F38F1BC8C272CF72C1AC4A5564DD132130EE676E7D7EC3CABB4E85AC81945C87DE08EC60CED3FA0AB3E83C18AE493A851434BFA2C4968B42ACCCF3609539C62A4E01F8BC159362E15EE91D8AA399D8BD8D67BA1E8FD646EEBB4583812293406B05BA5BE2B1DF9620E6FE3DAF8CEBD9652BB04494B899F407C7D9ED1C4E77FFADE24ABE56AD597BD438928E05B0363D6D2685D34D6B51D71012844415C46F13181B146A3AF25AE4E8853CC7C7EF6387306C45180A6EF9E97ABE1E7D5E10115752C3071B6A213367E8B1A3D1C3703CC1840735315623901D772C61D55EF8C47DB10F0EB7582D7A043018DC1363E93F315DD984B8002EA7BF5BED38D3F273276CA577CF99A635CB6ED9D6525520793405BE27C86E6EFFEABB1E5F84A0076BD151CAFC59853424DE4B3460C673B0820D76E15EE47B6505D2D5C179DB92A44042F3631C646D350EA9721B8984660A76018DCA5C6BB1223CD03CC844DC9371D32549D9D645F75D2683FDAD1DF6434BBE43200E506ED2A815FAB511172C70F99A85FA3970433E8955B2F9389F23C10141B5779A23B8671EAE8B91991B78F635FBE8E627D3E79D91FD1E6E90699640BA3AE8D7E4CF5145F1259CC76AE50B1FA150D8338A9450A5B6B90EEC9C94318BC78C9C7715A3EB215AEE6443540D211A0556813529023E5A581623CD6D19BEF0705A5F69AAD4833A57C308144E92899AC5683147CDBD279D5C3A55BBC5E8F8E26A158A3E42F8C5B858909B024B4BA4069E26DE66460FF4A7DC92BD54AC244007B6AC6CE07A31A2AF3323CB55F07B8F480D279308FE10F2DDB001DA6C4AA132B988AD03FB63E0EB06544571F5505CF377A81153D6FBD4FA2B7562074CFAF587CCF28DAC84AFA58809C0B296E0D2594D3582C28596F5AF7500E143BE7B49C63D04F49BBFBDF60B024DABA5533F945BA90659758E06984921EFEEF79604059EB808C9FE1BF9BC5351A406FBBA7F5D8FC9F891488E537DB14B216A0535C9FF7BF8D5C68A2453A8A48E58FA7BF6EB76448D6D0BD05BD4628C4B852A236A11BEC0F67118F1267CA42647F6F2303509094C9A7F3A07B2724ABD2D9B56B71FA7AC6CDDE456EC209BE76C419855A5151EC9EBF0E0CF1B86F4E8E81B8173960F8D1C8AFFED1AC7B818AF8E3BC092E2B209D693E80B11EC7DA39CA93223E1B47C6127E8AD40A78BDB0ECBFA1F39C84CB9ECDF960ABB39884627BC4105C53EE7BCA4802B92AF60241420CBB36C407F46CC2E953D7E3503CC82287A8D68D0E673E212173D80A12257ADD5256652188C00590DADCFB7DBB6B35507B853EA5FAD4F52E02230CB3D3BBDFC43EB74780583E8DBB851E0257117F4A39A6676586216220C1CA21DE16CDFE6E1CC99EA7C989916AD2FED4A8373CFCFF02207529BFFCB7B7601317450BF430BAC9CE111B0FBA8D7DE6627F863078D8E6286B2D34856426EA90FFD58705444D0DC12D4FEEAD0FFE543811E1EF306F40939922563832D06E6DEA7109087AC051A361EA9E755856FD4E51388BC7C40C63E0953C8413AB0CBFF70C466E15DE5B089D095E8EE8A64E929D26CA3B71EF0B2360AECDFA89284CCE08C666F4E0146362F0BB84B87A49FCF2324EBB96DD941F00E2586F7246436EB66B1E04AF84482D8ECD2BC8EF9955CBEC62AFDD754A7F235C7F3C41CD0B36A9024D426B7388D3C33A5A6E858846C0FB0D88BA5798C923F9B43D14A6661C65092D5C5EC0F97D84784FA336AE6EF57C7A5D04804B96D19849FF9074724A5FACA538E32C6EFAA5209317543159272CE50454FE1E7D068C8F5FF3797A66D5F87758627AB5D40EBE1FB7CE9D69287AE7A5F349A5DAABD8A8E7778BAA26DA0EB237034A3366448280237A165CBB303BE6B33C0F11C1E56C50A84384A0F6878F2A99B14CD3B6820ABD27D2011E0C37F8439BEDE65747038A5FF7F00DAEDA094331523CDB7E10F1063B64A584D3E9F0655268F89DBEF3EA3FA4C6E54FEEBF8F0046C6C811F0767CF6FCC9B3497DB05582774047A8DCFF6A0C1B5188076E64A9D5693195075F2A05E507A5A523EEE4537079F9E5E79210E4AF056D6624D45A0EBA553CA9BC92171451970102CAB57DCD89ACEBBD7025008325C61145264F42E4D14A76E5C2F1C129D4C054DA00501081617D1A27012A6E160750DBA73BECB5DC05105BFDE1F1D0CDC837355844B291B09015FD610628513C1C86EAD373730B99FCD4A552FBA07163CE9CF6A3D3AC0525593F0648256E8B33FBCF92AF58CE26D0F036E11230879DBB789507BCEEFD2960EA320236A224EA74DD2AAAC541664FA3EA9430D4FB09C878169A8AF1E7FD4BE5E7926CB0B6A352B25F452454474107286EDAA145C0A0573361522EACB618DD9C8B32BD1A8A5923F4C698CCA0139DC640C1D5D557CE889BB69CE32D85853DFBB0F34DA2CF18CC79472906B67F6BACBF287F31DE0B9E7A01A356EC9B64653CB922501EA1EDA940089BA0F293B667F482E92438805CD6851776CEA0920CDEFC4062C9B4E51F5AA1D7FF909CC2608B6F28CCF28D574BF67CE80D4DDCCE28F2ADE0162CB66894B5B2DA0EB975CD95EE7FE72FDA2736616C8B571FAC94BF8C64ACD1642D9431118F08A62328D99B2B9D90BBC915DB764C4935951A59C369C72060CD9F4273BDCA0C295294008C0AC3A149E8CA5E8BF21042F5F21C067147F3BB52B13975026A9DF7246AFB1D053670982AB316509F2850342913E1322758ED89DA02DD79126726B1C5566C1831CCB1D62B3E271875E62CDE0DF0715D404F95F580B63923F362D416F83FE5AD98EED584717FBC2CB7D1B00101200F4EB4CA5 - -count = 73 -seed = C7ECD1EC1A3D83F5116C0AA4345FB3ADB4D9F81BD79896BC4932EE2F9D2D1F179BAF7A002D88F4F69071A7931E7F7FAE -mlen = 2442 -msg = ACB414EB55AE5E49107BD0AC5975544F83104F7264495AE0BF0A6D9594C422C16B99469ECCDFE8B8000875B469309891EA42586A615D146DE64FE59277A61631B2C7F7379CD52FAB3871BADE120EE9558D1479A91925634578CF14D35DF3B5672F8B5F9F956FA9F7489D6E37E207FE556017736F6B147A8CF664D0E0521D94737E18188A1B7C30296CCC9067E7B55D6E0F2FBD875F42FEFECAC49510E324968B07372DEB10A31C585457E0C48879CE44BC78898ECEFAC7BCEE90D0F8925DF2B52D5AC81692E0160F8FD5808645498428260F592E29BB90FCB07D0424EC79FB081840CB827CAA4A9D562183D10EE41D281E26CE3EC0069C83E1E446EF82E2E30DEBE3F409E0A9E6D1550E224DB15DBDDA44341E4ED6F8B8984716CA87233197528547D090058607CA141424A13145F1E896555288C5E2877AB3B51C7F9248D2D56A8521975BC4EAE3D009988CBD73C66931BADA0725FB8A3448D43E0C7364E9494FC4E295A700E79972E1FFD626D1CBE0199917851638B192EF9F5C03223F2BBD67EB59A5E8BAEC3DB40616938274201DEA1AE640F6EE7E047CC4C13F80DC65E3FCB5C62386015F4EF1BFEC561E121F9BFA9B2075BC1C4730503FDD5DEBCE8A535ECA01B9D5B021C290854B5F3D49EFFB263DDA34C4E96AEAE9E71A686C009B205994B46CFDF1F76727CA67D415B9D21D54312CDC6A8ED0AEAB96B580D0B419E2058E5D843C17C96D156549962F81C266233ED2B795FAC40B1992B626457F211F08106AD86F5702B9DEB9323A0970AD86125ECA836E0A3D6CCBC380D474049BD96EA246B8BD9542793A66E15B319AECE6BEE17ADBBA7DB337D25F8F642774030A2FF969CB5671F59901CB109E661E55FD5E75EB2A96DC37FEC76A82EB89D020B4916271CFB0CB3342494FDB62EA0D253FB8FF2E91357B33D96D41530B8B5E9550FE9B3F9F34FD5A2A1A6A8BEB93CCC322622F3B5E8487DE19AF57CBD1481ACE02779AD928B17A9B05CBEB722C783B088B5912C2D67CE5073F1801C23170DEB1EB6DDFFC4C33DD25F94F4FBE59D704E478FB49DD2142801C37ED8F539EC1782EBD2F3253BBE19C5A048B9EF41824A811119F3A6AD2A0D4B77338E001358C61A9794572B0C46EB1E0E575D4DA141A415829BA8712B791B625B1B0EA840EE745D9FFE1E99EFD782BA25859351F443654995102CBEFAD7E59D03C9A502ED7B77144D0566E4BFAC086A7DEA356CB9E5AC02DBF7E81D6CEED4A33DA8D801D61BAB5C01F259EE3A99FF7F6D7BF8F2160C4BC3F890736074B000C4C58FA4615880F93FAD43D5657C76045D7C414E6B85F63AAC91F04A616184E04FF9AAD513BA767215FB0331A369D36C0AE9B1EC1268F1D0B43C42B786DB23DD66465B3AF17FFC68C67964C2FC9E41EABC45DB68CD2C3D95B8BEC787D994BB8E9CF1DD7D4C563FCA5D80B3F1FE8E3C7BFB7D171F5B9023BFBCC0CF4371B63C856EDBDA154B4313C47983F4027F9E61E86DA1E8CD787E3E6B50E1DFC9201B9AB92059F8B6D1BF7856CD55C5B1D6C4E6EBF818D481C56F66C79444F5A6544A64A7D78EAD33EB805A6AC4310CD46A2331E707B9B0950CA12092402D68C1CC5C3F269DFDB13AB34B97EAB50B0745BE72BB0FD2D73BEA5DD37802393B635E42A0DEF8544A96E7F40A8D9D06B64E38DC406BD59AC5C4E218591D20B8DBA2125978096517EC5C03F9BC6F96CB255E216EF82D7C7C873029F9E1D98EBC0D8E1312B84B8D02E8D680AA56A506C8668B5B9C56D04CF68E37C7CB1B9377C867240CD42FC7FBDE0AC44E3DCCFD3F877C9923AE9CECE0CBDAB00CA530F434A33F1C939FB88ADEF4D12ACBD8B2B5A139A3FB776D8223A9846465C0372B8C3233FB5280E936BBE9FD49058961463A4419D939F4F1FEA705EB63114F0A3533638DC4D3EFD620147770AD877E2354299CEC6E5C18924E78DD661697ADF89A77C7365522D3E8FC0855187139F7E43E9A0629EE321B2CBD9F007B05C22EFF56FE48045686B36C5BAC2267F37A2E3D4E03E19B1E422ACEA31C2E9F3E7541976D4E2FA03119DF9C4CC2D5418F0FC7A467CD98E290695B9530B91D5DF8C626C7236A5C0FBA73578B9A47491CA0AD26A144B0F23EC23D2C5B2DAA03BF40130F14B9A427CDFF1F232C9CF02426228C570CF1FA7C00A773BC0D70858588542BBF8F581540870897BFAC8387CBBA3416A846CF9F4F5D3F9DCEDD080CC0DE9F71B93828B835430898E82896CD3F30FE2AF8349DB294FB2A8FFC0848692A0B9E8A66EBBFC0F896F8D03E3C6A0C27E0F2177B85A2F6FE31E8AAF14EA5C1FDC54E80CDE47AE27A161264680107023CFFA961E913C4E6AF96C0BE37AD859C334CDB8BBEECB5443662739D027EF1B9535A5A46E2169933E419454025623FD6779F54C622EF81AB9289B50758EA34F868EC85AEE589B08962B85CF537BC733F62AAFA95FD81A60D5C2E38D6EA0DF7D1390BC5050E2463E3E2E3A769DE2A94ABDEDFA0ED67CC0FFAFC5A05A3B0FD37BBE6967BED8DEBF02A42CDC80BDC62158E184FDB6672F7947505E2C0A6C7762B1145C4BAF30E3D32434D22707044DC99D2CF2D38F15C43ABC8632382BBBC9E0F106565906F7D4948D30FB19EDCC3748100397F71E1548E58A5A01876D0A12DCC80000224221C4ABD98A5022506D24BF4D9B9108991AD3421D4AB9CC393DCB8D744F97822F95CBB2640E73E401F044FE20253ACB8B32A75FEDA640E190454BAB695A23B14AE3EF60B00491AB22F622DAA89B6B2E6D18E735672FE0EB2DE269E4E386C926E23B865E1BA22DDA688293DE144102F7030FDE6DF653E4106C08C2467AD7C54D1DF0DC5981004876C6BAA8720F70942700A154A376C8D45DAE1BE74910148EE3F2733E591E1965FE763B58C8B28AF25E9B3C633ABD83F1C0A4F68DA2E0B85083BF97D4E919340C0437A604416C4F629B33039BBF2A1F561548321780411D2E8AC0EDAE76FC3A19F3C84C3BE902A1E84FDF69B11A12DC8B78EF257B5FBB5D923FFD548451A52C6A3AF31C70266AE8A957B2BD72A51A034A2921B8E19321108AC303B0D2E269D032C3DB13F21D558C82BA4158962F2210E1C5FDD96C98D6639AA844F34E40C1B9C909CC6AF1E97A8DC83B78C72B30B7AE400F44CA60AF37770B3D9147F7D6F5A327F34DF7CB8891E71D41D723CB18E0DD324E5CD22AE0D9F2B1D2BFCED0288B7AA73AF4FE0A8181BA1AA7EAE966D0A240E10FE5735D98326A106D16DC49F3FDB19D3A8449C56A74153655600E4C9E38D302C6D4080017D93C628388DF94860329BAA289EFA4587F079C6F03FA03C54540A0AB4B067EE46A5A346F2FBBFF6570ED0166A55C258EABD62AD90F060FADE84E8FAC799F7928285F58557A72E055B535D00BD9A4880D10C05C07CFE7A6FEADFCDED880521803E339F6EAE3FF28A0A471A003358F952320F41A0AEF9D28 -pk = FFE4882B6A2A0F91F36096D9A22DFCB0EFEF99580F4456BC48110CBFF2942730FD175C9D76AD572A4AB2BDD1F8A62C85CF5DABF0EA2716BCFF69132A3D49841D -sk = FFE4882B6A2A0F91F36096D9A22DFCB0EFEF99580F4456BC48110CBFF2942730FD175C9D76AD572A4AB2BDD1F8A62C85CF5DABF0EA2716BCFF69132A3D49841D020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A8383C3815B22C5A87216017802AA8B748B24A09217E3F2AE052B8B9FFCB2AD36506D31C3744E58FF634DA04859F0300000000000000512806B43B33D58178D89A322F7FF970F07B0640CAED484B6075672EFA40194B0FD4C41AA7B6A3FC64A7842B7D3DFBFFFFFFFFFFFFFF51018CBA1F1BC6707209DB94C13A0C1D144229A94F8385D70E61D8BDB323FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF382FAE4F1928777E753AD60702B0E62558E6B3C99A918CB5C2F5D4D604F4020000000000000000000000000000000000000000000000D5A4C79B122BF78CC2B121EB58AB52CFC809A95771BE3240A473B568A7B3EC0650E320053D82E4B1200E70755B065AEE234B82586578A397ACBC18F3F2DB270FD5276E4B5E266DEE0222CA1A4E7C9631FDA3893425B066DD4D0FE28E72A5802C33600D9577EBA56632140830563209984568C29817FDC7451D39C7E62BDDDB0BC1BA33936BE9CCD8FD72288C41FFE283F695300EC50B9F36FB7BFA7C22D0232ABB7A2B01D088480E0807C661B55D3C83347F8FF5F74311F61E63EC543C02CB2A437B82E98A2E767574E0B4DF7E1B2F0A0B361AF2883B504D6B30A2060A8C5D2176BF72A6368E725EE6F78841E034872215DF8D250D968A74F75FA7C45C92AC0C6F8CA7B8A7DC931FB64FDE5E315135D40AAC0982F46F280CA9D35B016DDB4D0FF2D1CD946C248ADEEA3DEE044A27A19A93682BAF08D366F04F13B6AEB276A0086DDF5D5D3120B3CA6B5087299942B8F2388E5E8A53E16C22640176CBA837A32A004105A3C69F89A43D1581DB1A3C5BA9EA78CF960A7ECE4D4F3B1917862B9917F9177C8B53282D5E63D036F8BF9DF7F256036033C09D252BC972C2C95895BB1463154F0D3FF17615054BF132F7226F5F58CCEFB182739AF615BA2D0A4B5CAE31 -smlen = 2619 -sm = A2408D2C859A3DD9B2002AA602C0155B45913E0523FB02CB9701CB4A6403B1BAC8B964EF0558EB07B9684D9B56B75661DE038F23BB2D4641400F7800F38C8D941753CCE59106896DD73B44579D5D92019354AAEF420594DD6705404C393FA4038A39E4011F32CB20EF42F00ECB027DB58F2A8955A8A08A06B222C4F188C605A2640103A4B21924D16F65BF05015D7798A51ED88F50E52591B433A35150080191D5F3C376A53BFC3504651C7E1F736D1701ACB414EB55AE5E49107BD0AC5975544F83104F7264495AE0BF0A6D9594C422C16B99469ECCDFE8B8000875B469309891EA42586A615D146DE64FE59277A61631B2C7F7379CD52FAB3871BADE120EE9558D1479A91925634578CF14D35DF3B5672F8B5F9F956FA9F7489D6E37E207FE556017736F6B147A8CF664D0E0521D94737E18188A1B7C30296CCC9067E7B55D6E0F2FBD875F42FEFECAC49510E324968B07372DEB10A31C585457E0C48879CE44BC78898ECEFAC7BCEE90D0F8925DF2B52D5AC81692E0160F8FD5808645498428260F592E29BB90FCB07D0424EC79FB081840CB827CAA4A9D562183D10EE41D281E26CE3EC0069C83E1E446EF82E2E30DEBE3F409E0A9E6D1550E224DB15DBDDA44341E4ED6F8B8984716CA87233197528547D090058607CA141424A13145F1E896555288C5E2877AB3B51C7F9248D2D56A8521975BC4EAE3D009988CBD73C66931BADA0725FB8A3448D43E0C7364E9494FC4E295A700E79972E1FFD626D1CBE0199917851638B192EF9F5C03223F2BBD67EB59A5E8BAEC3DB40616938274201DEA1AE640F6EE7E047CC4C13F80DC65E3FCB5C62386015F4EF1BFEC561E121F9BFA9B2075BC1C4730503FDD5DEBCE8A535ECA01B9D5B021C290854B5F3D49EFFB263DDA34C4E96AEAE9E71A686C009B205994B46CFDF1F76727CA67D415B9D21D54312CDC6A8ED0AEAB96B580D0B419E2058E5D843C17C96D156549962F81C266233ED2B795FAC40B1992B626457F211F08106AD86F5702B9DEB9323A0970AD86125ECA836E0A3D6CCBC380D474049BD96EA246B8BD9542793A66E15B319AECE6BEE17ADBBA7DB337D25F8F642774030A2FF969CB5671F59901CB109E661E55FD5E75EB2A96DC37FEC76A82EB89D020B4916271CFB0CB3342494FDB62EA0D253FB8FF2E91357B33D96D41530B8B5E9550FE9B3F9F34FD5A2A1A6A8BEB93CCC322622F3B5E8487DE19AF57CBD1481ACE02779AD928B17A9B05CBEB722C783B088B5912C2D67CE5073F1801C23170DEB1EB6DDFFC4C33DD25F94F4FBE59D704E478FB49DD2142801C37ED8F539EC1782EBD2F3253BBE19C5A048B9EF41824A811119F3A6AD2A0D4B77338E001358C61A9794572B0C46EB1E0E575D4DA141A415829BA8712B791B625B1B0EA840EE745D9FFE1E99EFD782BA25859351F443654995102CBEFAD7E59D03C9A502ED7B77144D0566E4BFAC086A7DEA356CB9E5AC02DBF7E81D6CEED4A33DA8D801D61BAB5C01F259EE3A99FF7F6D7BF8F2160C4BC3F890736074B000C4C58FA4615880F93FAD43D5657C76045D7C414E6B85F63AAC91F04A616184E04FF9AAD513BA767215FB0331A369D36C0AE9B1EC1268F1D0B43C42B786DB23DD66465B3AF17FFC68C67964C2FC9E41EABC45DB68CD2C3D95B8BEC787D994BB8E9CF1DD7D4C563FCA5D80B3F1FE8E3C7BFB7D171F5B9023BFBCC0CF4371B63C856EDBDA154B4313C47983F4027F9E61E86DA1E8CD787E3E6B50E1DFC9201B9AB92059F8B6D1BF7856CD55C5B1D6C4E6EBF818D481C56F66C79444F5A6544A64A7D78EAD33EB805A6AC4310CD46A2331E707B9B0950CA12092402D68C1CC5C3F269DFDB13AB34B97EAB50B0745BE72BB0FD2D73BEA5DD37802393B635E42A0DEF8544A96E7F40A8D9D06B64E38DC406BD59AC5C4E218591D20B8DBA2125978096517EC5C03F9BC6F96CB255E216EF82D7C7C873029F9E1D98EBC0D8E1312B84B8D02E8D680AA56A506C8668B5B9C56D04CF68E37C7CB1B9377C867240CD42FC7FBDE0AC44E3DCCFD3F877C9923AE9CECE0CBDAB00CA530F434A33F1C939FB88ADEF4D12ACBD8B2B5A139A3FB776D8223A9846465C0372B8C3233FB5280E936BBE9FD49058961463A4419D939F4F1FEA705EB63114F0A3533638DC4D3EFD620147770AD877E2354299CEC6E5C18924E78DD661697ADF89A77C7365522D3E8FC0855187139F7E43E9A0629EE321B2CBD9F007B05C22EFF56FE48045686B36C5BAC2267F37A2E3D4E03E19B1E422ACEA31C2E9F3E7541976D4E2FA03119DF9C4CC2D5418F0FC7A467CD98E290695B9530B91D5DF8C626C7236A5C0FBA73578B9A47491CA0AD26A144B0F23EC23D2C5B2DAA03BF40130F14B9A427CDFF1F232C9CF02426228C570CF1FA7C00A773BC0D70858588542BBF8F581540870897BFAC8387CBBA3416A846CF9F4F5D3F9DCEDD080CC0DE9F71B93828B835430898E82896CD3F30FE2AF8349DB294FB2A8FFC0848692A0B9E8A66EBBFC0F896F8D03E3C6A0C27E0F2177B85A2F6FE31E8AAF14EA5C1FDC54E80CDE47AE27A161264680107023CFFA961E913C4E6AF96C0BE37AD859C334CDB8BBEECB5443662739D027EF1B9535A5A46E2169933E419454025623FD6779F54C622EF81AB9289B50758EA34F868EC85AEE589B08962B85CF537BC733F62AAFA95FD81A60D5C2E38D6EA0DF7D1390BC5050E2463E3E2E3A769DE2A94ABDEDFA0ED67CC0FFAFC5A05A3B0FD37BBE6967BED8DEBF02A42CDC80BDC62158E184FDB6672F7947505E2C0A6C7762B1145C4BAF30E3D32434D22707044DC99D2CF2D38F15C43ABC8632382BBBC9E0F106565906F7D4948D30FB19EDCC3748100397F71E1548E58A5A01876D0A12DCC80000224221C4ABD98A5022506D24BF4D9B9108991AD3421D4AB9CC393DCB8D744F97822F95CBB2640E73E401F044FE20253ACB8B32A75FEDA640E190454BAB695A23B14AE3EF60B00491AB22F622DAA89B6B2E6D18E735672FE0EB2DE269E4E386C926E23B865E1BA22DDA688293DE144102F7030FDE6DF653E4106C08C2467AD7C54D1DF0DC5981004876C6BAA8720F70942700A154A376C8D45DAE1BE74910148EE3F2733E591E1965FE763B58C8B28AF25E9B3C633ABD83F1C0A4F68DA2E0B85083BF97D4E919340C0437A604416C4F629B33039BBF2A1F561548321780411D2E8AC0EDAE76FC3A19F3C84C3BE902A1E84FDF69B11A12DC8B78EF257B5FBB5D923FFD548451A52C6A3AF31C70266AE8A957B2BD72A51A034A2921B8E19321108AC303B0D2E269D032C3DB13F21D558C82BA4158962F2210E1C5FDD96C98D6639AA844F34E40C1B9C909CC6AF1E97A8DC83B78C72B30B7AE400F44CA60AF37770B3D9147F7D6F5A327F34DF7CB8891E71D41D723CB18E0DD324E5CD22AE0D9F2B1D2BFCED0288B7AA73AF4FE0A8181BA1AA7EAE966D0A240E10FE5735D98326A106D16DC49F3FDB19D3A8449C56A74153655600E4C9E38D302C6D4080017D93C628388DF94860329BAA289EFA4587F079C6F03FA03C54540A0AB4B067EE46A5A346F2FBBFF6570ED0166A55C258EABD62AD90F060FADE84E8FAC799F7928285F58557A72E055B535D00BD9A4880D10C05C07CFE7A6FEADFCDED880521803E339F6EAE3FF28A0A471A003358F952320F41A0AEF9D28 - -count = 74 -seed = 5DE03CAB3CBD81B8805A17E0FFC2105C3BCDC8D782EAAB161A15AAA543FED59353C1FBE03E7F36B955FC51C9B30F0C93 -mlen = 2475 -msg = 5F7522CE6BD0CE6321C27B9EAA6F572616201F283C5EC171D0BA47662C2320897805E1551ED438F3FCBDAF9DE6F3A19DC16FE9C167A65B6E52BCF512C919561B548496A4A80AF7CE25458A62EAE92EBF677872482D8647C30C12BB1F080C6B9A56560D64FAB73DB17487BBB007C66661EA9DDA14601AB27A100EF4CF4B7447E51418651C03211F8FB884BE91F3980FE13E00EA4ECFE6D54882059A436C90BCAD80E4101CC6C0754417545F2D167629F80A3C5FFE45C00AB2BAF0494D6C065872B03A987A5EE818B3EF11E47FE1747F49E2DB6A14410F0B1F9610A2D6114395EF6EBB231FDF71D595CC1171DB9C89D6CF202E42D4FB968AB8105FDDB2AACB15FAB8014B534CF468D77ECDE2072623B7002620B7AC3E78B62AD673FEEF9F8E97E91ACDAB171FD415B2D15605DDE00D074A770E36F2218F7130F13E91FA4C88DEEA7E854BCAA01B8458D40625A33E982F0955B83080A926EC240E31F0D9BF477EE3A016E146A3909683410D4D09ECDF32EAEF580402F0D416DFC082CF1362E8B79158BD57739AEE56DC41A549E534C7CCF3620C7D7D95B92994A747D5EFB8EC43CFA8189BAA9B75FD54694E512FCA388B71A5B9EA591AE9CFA34183DE59D284AB16B2EFFA4B26A24A0E615B38B83088A9827EEB5C29B419BC061B033E0E3FC809AFDD3DE948412677E0BB5136854532639F3CCB176D54EA1961B5C527EF66F4B3286A583E86208AEEB8ED07D9E6BF1BEB33995F76CA480039A6130775895F19E3CD4873ABE3BF2FA9DE81BF0CB04575DD6AE282720B152CF0EC6A4A04016DB0F3543D8272AE56B1152B02EAF22131420CB194021F97060D5CE52EB21B57CC93964DD21344786E3888617152D2ABD829799CE47D20158AA93F7DA85CA6146C5BB94B512DA053C35BFA8840CA43F6509A1477603FD50F5E4F9A7CF8D2369156989AD638D35D345BDC859C52688211BF7EF3F4AD4944657289406BF01DCBB49D560A11840EF35DBC0C7F9C96DBEA76300CF61997A87D70F5FF8C51AECA2CF0680B6FE8C4025E1E25B62103D248CDEE335F4FCD67597103362003206C507970EA6D78CFF4B68B44244019152DBF812675CF667E5E13C8596EB6FEA3903BFB25ED08F902722A37F8E460E37A03A2D6ADBDF79DA20052DE658390484B83BBAB28D039A303D7376BF555181680B7966C798A1C6CB215257E37739DE7B9706CD1CF3AB031F68C82D6ECFA507C104115040744D74A40C49245215639D0CF4A5A7A10098E9CE3564AC3C44F0683AE9D3094784D354DB1AF439BDDF63D5CCA668D8180264EFECEEAC0BE1B8E1C6418E45F9ED6C779ECF169143B034CD9F332989D445C83A8786398C507B9171B4D95728575539CBB29C5B804268D88F2B39AF1F9572B8DAA9FEEEF69C4A77DC64BF2DBB5E57F8B33AB151769B2D00010D67A2D6F188D6D5B35E5E1873FE2B327E42AFB8885A842D26C246F7C18E6BCDD6FA49B300C65A3822121E95004928104017CBCE2AB95ACADB9802BF4BB049B8E96468353D649654C6F69D774380A5A387D6414DC3000540BAB6ECCBAA088C1068CCEF20036E5C8342FD512F55E6794BF85FE15721D99A1BFEEDC218617A940C8C25D4DFAFEC677D2A719B2CDDCD302294B7FA41AEAB5606F859CC0D638AC94B99AC3EA48C687D278EEBEB396DC5BF2D2E89E880F76B533FA54EFD30D8EE38B34DC5F8AE62C637E9A7E85D99E011F62D261AB4D3DCEB98A8972D3482CF817EFF476B873AC56963BD60183B359713385BA82F6E24BE2D6CFEA6DBB4AD2E1B5B790EE54D23F64E740502E887629B346FC8FCCC3338D0F2921131B84590B32C7CB82CBA8BB3B81EF7BC5CB12F0AA0B3C6A5B2878DC4F868057C68460C71D40D4263AC5C8B8317D2D0B63403C7549439A9EF227268372EC3A54CF8EE97714BC4B55007F92B1A32238659EC1EE27D6F2987AB06FEE84C3AFDFA73240963F076A955BF3C19410E1DA6A19B3EA3AE2DD8766082D3295D35436597783DAFDADB905465D05FC21FA8AC2737A52FA8AAEFBD2ED83F12545C1FA3198FF225D37070694C9392738E89467EDB2DA3CD1734CE398E32BCB1FEA2E4FE1260A2D9F9EDC3607A8AC8A51D5DA36E99B31903025E0CB157FD2FF5B51C9191CC16A9CCB870B4060CFB0FD900AEF62738A58C5726F5164417F084EF14FC0953E3C6036B818C21CA3476B8CC5F8EBAACE257A0315031A03E64E7F749B9DF99BB56CEEBBAA4333BC7270EDEE90FA2715BDDC38D44898A41998B2374B6EE3B8524D3A385C03868EE9479355092C4D20EC32DEB51497F4FF34AE7E7EA4828C288F46E5148DE28A8C660EE132E5B5489833DC66205EC968B60DAB96C2A4452A7019BBA9FE3D19D5829129E2A9C75C39416AC8695145F2B62EB9468198CBD48D7670DDC6AF2F99F77E7ACD01A34EA8E0E974206FBC22656867D09807B980563E06A559B0C3A7E6F43CF8DB75B18C0F90C12FF3BD43ABCE7DF75D17E631C08C974322010648FE2E2BC940E6510FB8835DF8384EFF3FE6A264687256C6BC0A5F9D2DDF208171DB55C4446B03CF27796BC77E3C68D8F1252BE21877D7C53747404420302CA5AE1AB57E43B158BE8B707360A2F59D6A473F98B816FDE2CCEDD92385202C419278E8B840DBA4C05E9BB65F68AE2A635A29110329E8C0C02F6FB5EEE41ED225051EE975F92DA52F93EB1FD7C0A098F6D1421701537298651313514AD31CB333E9C5DA719BBA95E73878BA41F9E2512862A80602AA2DE1E1D086576531330CC7BB8F0CEC38050B3CFAE5C8B1D6CB849A579F2294F8CE80FDE5405BFA3E6ECB01D5117203A4523591AC4030397DE9FF81D5CC91AF3002590F5854E852B88667638B2D052F2A7852425C8EC026E48D9EF5E73D1993D7F3FD7F704760562C36D2278C9CE131EC6AA444D7B2EACA3EE888D9B2AE122688DCB35455E7DE31562BA618F1183308B30D07A5C34020546218101AD42AC5054D4703587FF60E860A60375FAB12734912058D5B0B06430FABBFE0C0B43C22814F56DAE9E2713325A31C682C13F008B9A3D4FFA8A454F0F64A9213FF2D557A4CBC64EC6E4ECA0A976CD9F27497BA544DBAA3E2ECA0F54C2634C719B9C3A2CE37BCC8158A880BAA72780F8B1D3494F589E2AF3044B4FDD86F4DB2DF0843EBD9F3518870F55488F41E234CE94E907A69D28BD83347702750DB1AE2EB1454CDCA37A8B5FC90091F548BABF489E57C8919646E977274FC972088A522FFF9F9306D2F0ED6C01FF92CAE8440D7F3526B8C186D5B96942CB08032886051DA2A9FE77E38BEB18F4FB25F1152EDF9D61347A00A844929976A327BE46FFD3E2EE0B6AB1014294EC5D40CF7071C36B11127FF90720596C1B3065E7DE8010AEA469BB4F4AC5A6EFD20591CEFB7B94B2006D85CA475FEE556F24CC41237C631B75EB594F8342DEB4F976D73AA46563C1AA6D0B605A16152315626BA08807DAA6025CF62B29176F3A85E4BCA483EFFEA7E5939 -pk = B02813B861876C64814429B3930D445CC28625BECCF3C60C969F5AEABCB01F035F2D9B09ECF9AF702F495D81048AA52F9F759F2CCD2E9504388D188E51156928 -sk = B02813B861876C64814429B3930D445CC28625BECCF3C60C969F5AEABCB01F035F2D9B09ECF9AF702F495D81048AA52F9F759F2CCD2E9504388D188E511569280200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003BC50A1177C94523FEC429520719F8DFA5D14369718A9E9890A25E9C5D2C6F8C9FE520E66B14568BAA7DB42956740000000000000000D80CE6FD8FB5F24F065531263F01865D47D946D2D0981C2DC551423FB733A49AB43F390D551B0E74EE7014DEC96EFBFFFFFFFFFFFFFFD416FBAB0295E9C29CBEBF0A34B0477196C026CC37B2676FC1E0AC9D6ACCF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DFDB2E239E05389A52C12A169B30111344A584AA70E9A089BECA0EABC690700000000000000000000000000000000000000000000003673AAFAEBFDDB1812280FB7A937ABA9DB28753465241ACAC89DB666932B63124AE88CDC7D6B45E135D4751BF25276F350AEBBA04BC02296B5014083D45209050B970B396C0B5568AC3B59EC07B7DAA98B12D817AD7D4B898C13AA9E6998D63076DAD566F1F24379681FAABA6F979DBD90A8C25BB1E7B89D5B7E54A5E5679A1314A6B4F777008218D5220884AF571B30BB8DC48311575A70CA63D331F40E2D0DAAF8610659B1716220A5D1945A70E0B459E9C083FB6DE8C2E0433F3B90DF851FF42541E55BD1BF234FABBC3199CCD225A4647B7DEDB083AD4843BB9FF997741808A7AE07E4EBBC31A19081D652689CA8128EC90681F7D9D7E2C025ED1994200E856738C6E7C3D32B81BBEE2B94CCD89A362DD9BA6E5F6766EE5D8990D019990E0B51C8507E567E4DA0CE12690553929B3AFC8DB325548CD5EDB0F5E9784E450B8B547F1863D0843AE4DFDBB91F885CED33D8AFD4F660D030D58D4064280F110055345E146A1A04CB524A6CB8AD7BCD56F672431359EF2F947B1DD67F7124D61C83DA7F0C4FFE8F3CA6040327D36C2B62DC8DF637DA3E919414E6BCF7AFF5720DCEE62605E574AA1A11165FE47024AA256CA693BBBEC0AFCE54A85F03B1841309 -smlen = 2652 -sm = 61418EDC9E6A2AF1BF0134C9A489DF79791154042A8498E148848EA4A2010740DF1E64B3E1898C04E446CA7EB4CA13EF2D0004F8A1F602B3BA877F0473D15D68C4CD3B086905BDD948807BB6DA4E3D0179AD4E32C85383C2860791EFFE0AEF08961FD907FED665BAC1A3AB6C7F02A119C7B2866E8954CC034A1EBCF9D17AB21FDE0716D26988157C1ABD3806011FA4E87F4050AC74CEDED27A784725330E0339AB462EFCF6F346F705FCA82A7C6D138A015F7522CE6BD0CE6321C27B9EAA6F572616201F283C5EC171D0BA47662C2320897805E1551ED438F3FCBDAF9DE6F3A19DC16FE9C167A65B6E52BCF512C919561B548496A4A80AF7CE25458A62EAE92EBF677872482D8647C30C12BB1F080C6B9A56560D64FAB73DB17487BBB007C66661EA9DDA14601AB27A100EF4CF4B7447E51418651C03211F8FB884BE91F3980FE13E00EA4ECFE6D54882059A436C90BCAD80E4101CC6C0754417545F2D167629F80A3C5FFE45C00AB2BAF0494D6C065872B03A987A5EE818B3EF11E47FE1747F49E2DB6A14410F0B1F9610A2D6114395EF6EBB231FDF71D595CC1171DB9C89D6CF202E42D4FB968AB8105FDDB2AACB15FAB8014B534CF468D77ECDE2072623B7002620B7AC3E78B62AD673FEEF9F8E97E91ACDAB171FD415B2D15605DDE00D074A770E36F2218F7130F13E91FA4C88DEEA7E854BCAA01B8458D40625A33E982F0955B83080A926EC240E31F0D9BF477EE3A016E146A3909683410D4D09ECDF32EAEF580402F0D416DFC082CF1362E8B79158BD57739AEE56DC41A549E534C7CCF3620C7D7D95B92994A747D5EFB8EC43CFA8189BAA9B75FD54694E512FCA388B71A5B9EA591AE9CFA34183DE59D284AB16B2EFFA4B26A24A0E615B38B83088A9827EEB5C29B419BC061B033E0E3FC809AFDD3DE948412677E0BB5136854532639F3CCB176D54EA1961B5C527EF66F4B3286A583E86208AEEB8ED07D9E6BF1BEB33995F76CA480039A6130775895F19E3CD4873ABE3BF2FA9DE81BF0CB04575DD6AE282720B152CF0EC6A4A04016DB0F3543D8272AE56B1152B02EAF22131420CB194021F97060D5CE52EB21B57CC93964DD21344786E3888617152D2ABD829799CE47D20158AA93F7DA85CA6146C5BB94B512DA053C35BFA8840CA43F6509A1477603FD50F5E4F9A7CF8D2369156989AD638D35D345BDC859C52688211BF7EF3F4AD4944657289406BF01DCBB49D560A11840EF35DBC0C7F9C96DBEA76300CF61997A87D70F5FF8C51AECA2CF0680B6FE8C4025E1E25B62103D248CDEE335F4FCD67597103362003206C507970EA6D78CFF4B68B44244019152DBF812675CF667E5E13C8596EB6FEA3903BFB25ED08F902722A37F8E460E37A03A2D6ADBDF79DA20052DE658390484B83BBAB28D039A303D7376BF555181680B7966C798A1C6CB215257E37739DE7B9706CD1CF3AB031F68C82D6ECFA507C104115040744D74A40C49245215639D0CF4A5A7A10098E9CE3564AC3C44F0683AE9D3094784D354DB1AF439BDDF63D5CCA668D8180264EFECEEAC0BE1B8E1C6418E45F9ED6C779ECF169143B034CD9F332989D445C83A8786398C507B9171B4D95728575539CBB29C5B804268D88F2B39AF1F9572B8DAA9FEEEF69C4A77DC64BF2DBB5E57F8B33AB151769B2D00010D67A2D6F188D6D5B35E5E1873FE2B327E42AFB8885A842D26C246F7C18E6BCDD6FA49B300C65A3822121E95004928104017CBCE2AB95ACADB9802BF4BB049B8E96468353D649654C6F69D774380A5A387D6414DC3000540BAB6ECCBAA088C1068CCEF20036E5C8342FD512F55E6794BF85FE15721D99A1BFEEDC218617A940C8C25D4DFAFEC677D2A719B2CDDCD302294B7FA41AEAB5606F859CC0D638AC94B99AC3EA48C687D278EEBEB396DC5BF2D2E89E880F76B533FA54EFD30D8EE38B34DC5F8AE62C637E9A7E85D99E011F62D261AB4D3DCEB98A8972D3482CF817EFF476B873AC56963BD60183B359713385BA82F6E24BE2D6CFEA6DBB4AD2E1B5B790EE54D23F64E740502E887629B346FC8FCCC3338D0F2921131B84590B32C7CB82CBA8BB3B81EF7BC5CB12F0AA0B3C6A5B2878DC4F868057C68460C71D40D4263AC5C8B8317D2D0B63403C7549439A9EF227268372EC3A54CF8EE97714BC4B55007F92B1A32238659EC1EE27D6F2987AB06FEE84C3AFDFA73240963F076A955BF3C19410E1DA6A19B3EA3AE2DD8766082D3295D35436597783DAFDADB905465D05FC21FA8AC2737A52FA8AAEFBD2ED83F12545C1FA3198FF225D37070694C9392738E89467EDB2DA3CD1734CE398E32BCB1FEA2E4FE1260A2D9F9EDC3607A8AC8A51D5DA36E99B31903025E0CB157FD2FF5B51C9191CC16A9CCB870B4060CFB0FD900AEF62738A58C5726F5164417F084EF14FC0953E3C6036B818C21CA3476B8CC5F8EBAACE257A0315031A03E64E7F749B9DF99BB56CEEBBAA4333BC7270EDEE90FA2715BDDC38D44898A41998B2374B6EE3B8524D3A385C03868EE9479355092C4D20EC32DEB51497F4FF34AE7E7EA4828C288F46E5148DE28A8C660EE132E5B5489833DC66205EC968B60DAB96C2A4452A7019BBA9FE3D19D5829129E2A9C75C39416AC8695145F2B62EB9468198CBD48D7670DDC6AF2F99F77E7ACD01A34EA8E0E974206FBC22656867D09807B980563E06A559B0C3A7E6F43CF8DB75B18C0F90C12FF3BD43ABCE7DF75D17E631C08C974322010648FE2E2BC940E6510FB8835DF8384EFF3FE6A264687256C6BC0A5F9D2DDF208171DB55C4446B03CF27796BC77E3C68D8F1252BE21877D7C53747404420302CA5AE1AB57E43B158BE8B707360A2F59D6A473F98B816FDE2CCEDD92385202C419278E8B840DBA4C05E9BB65F68AE2A635A29110329E8C0C02F6FB5EEE41ED225051EE975F92DA52F93EB1FD7C0A098F6D1421701537298651313514AD31CB333E9C5DA719BBA95E73878BA41F9E2512862A80602AA2DE1E1D086576531330CC7BB8F0CEC38050B3CFAE5C8B1D6CB849A579F2294F8CE80FDE5405BFA3E6ECB01D5117203A4523591AC4030397DE9FF81D5CC91AF3002590F5854E852B88667638B2D052F2A7852425C8EC026E48D9EF5E73D1993D7F3FD7F704760562C36D2278C9CE131EC6AA444D7B2EACA3EE888D9B2AE122688DCB35455E7DE31562BA618F1183308B30D07A5C34020546218101AD42AC5054D4703587FF60E860A60375FAB12734912058D5B0B06430FABBFE0C0B43C22814F56DAE9E2713325A31C682C13F008B9A3D4FFA8A454F0F64A9213FF2D557A4CBC64EC6E4ECA0A976CD9F27497BA544DBAA3E2ECA0F54C2634C719B9C3A2CE37BCC8158A880BAA72780F8B1D3494F589E2AF3044B4FDD86F4DB2DF0843EBD9F3518870F55488F41E234CE94E907A69D28BD83347702750DB1AE2EB1454CDCA37A8B5FC90091F548BABF489E57C8919646E977274FC972088A522FFF9F9306D2F0ED6C01FF92CAE8440D7F3526B8C186D5B96942CB08032886051DA2A9FE77E38BEB18F4FB25F1152EDF9D61347A00A844929976A327BE46FFD3E2EE0B6AB1014294EC5D40CF7071C36B11127FF90720596C1B3065E7DE8010AEA469BB4F4AC5A6EFD20591CEFB7B94B2006D85CA475FEE556F24CC41237C631B75EB594F8342DEB4F976D73AA46563C1AA6D0B605A16152315626BA08807DAA6025CF62B29176F3A85E4BCA483EFFEA7E5939 - -count = 75 -seed = 63742CEFAE9868C3C0B31DDE0F9D378FD5D71BE7CC3F0B6ECD393DB55FB043CF00264852C45D1836CC12B9C872A20251 -mlen = 2508 -msg = 9FFA507328B2129C9F05A22B81A597FD1B8C27D554B36FD3EB150BC5FA0C6ED967EC5BE6F1E52D3BED1508DC3C841360020CFC2CA1B0713076251F2935EFA8500573CB4634C78A1D0F87D994E8E2B0BD265A877023B54D9A33282C12397DC74CAAB07AC2EFD140DF907651BCD1B37CAB2D03F77CC28872291F1CB28FD4BBB5331C2A18E02120BFD2D9EC0C8938A6D43681DC03527FC2BF59703B5160D8E25D08534EB5AA5CC9C10572257D9E4DB29235683BFE1776A2D9EDACFBA1ADAF66587BC451D32C524C7934556F94776F91CDDA96D2E5CAF91A39503D3A742DC5A0EFEF7C1A13666E200C5E3FD7652D200ADEF51FC5136281570B7832E0C6E7552972E43291F202E6F916C916DC3FA48858F3D92B1B7EFD42DE140D43648AEDD7C7379D7A4B71751A3348B6BBA3B0DB71B4C99C41E085E5536A3F0D2BDDAA88069249E21E2D9906191BBB5C8B45353DE72E00270431847AEB4FF6230CEBD1969A0FB68D6E302B78DA39ADF6C0E681117C8432E24820B9EBF38838545E95CF7AEFCF1E9436CF48E87B6C5181CB418132C7BC050B9498720D7D534792E0585F05DA2735B7E68FE35DEC358DA1BF1681F7F62329BEDFEA3D12BFB26AD9403F3AC1DB96D828050F39DCE4017B45C5DAE4D7DE9E9F687A9D7FAD1AE0E7197184142F6818A63D5617BE9D8D82334A12E68F2EEF88A0DA3A915DE63629550D8A64DF591EECDBD1B89EB40AE9F9D65815271693C85F2CA41BF45E4FA16EF8B17D945EC61E757C6C609D8AFAEE32B3CA628842DB255B619F6562E656F6125FB27195EC82FBEB9C14330DAB649CDB74F523F5A98244194581503356B5B7EC51E2B35AE889452D3457EAD713C0715AA7382DCC510B16E771B3A5A91949FAF5E29223C8F1F861BC3B4E77E095BB61ABA00EB29C065D6F9DA9B4413D61B2202547FB6E34671930EBCDCE4C541B3E2DC90073867A47197E08C96F74ED81DE5F10C37C062E8D82364D67EB185CD098CAC1BC3C522E4FABDF2FBEFB66B9EC6E848F732A737FA7B935EF2848C29B1FB94044996EEF006E251BCEB5BE356F286F0FC85E5CBA627B67398CBFD6C0F520C6F896353FE75BA323D8ECD9D3ED2997580E7E1E49EECD91982C5DA650D6B128068B8D3D72C1EC4BF1FBF121BA96E1CF5F247F9FDA7018CB609329B1C95E59E112C393C45EF7138905902227CD21A39CE30397FF017495BC98A968FB497E03DE5843E64923683F2E402DA63CC25AD0BA13B85E3E379B08DEB39542C06A268BBF44990447190A1F8ADF0D3ED9ED9917886210864CAD84E7C4D1282C4D3BFF9DC23E4FA68EF6B0480E76459D1B5E0A7CC0CFC17F59531C4C1CB1D416B7D009AB50173F706289DBB68201C305E39FEFAD87929EF933006598CE0F0242A2C60955AE487115B4C367A7E49488491A6F044FA8B7AFD81F6DA09D29D4BEFE1B3C9EAFDA4F17D22EAAE0B2D1646906D1CEE65614640B53479E23831C56EBE12B92997D5FEA725D78CA75F4509EEBD3DF4F741D6B2770521BE2AE63CA365FE1518CFDCD5088D58CDFB8D3DBA76731F74760A47C9D619A31B7E318E957194AC5ACC6867CF8C9C235043D5C09240F346FEA840AE0BB16094883FC801DA0BEFAC64A021F6F871413249E9C7F5CCA92F4EAB5713B0F2CD6C950F34BA6FB1CFAAD541BD5FAEA45EA5FB37258301A49D7BC4657E3E986D707213C0F836B030C21593F11518EAE3A8A95A2EFC8B9839E79CD8CB0E6DE59D5A43FF8F81FD35392F0C0659B7679542136782D559897FBCC0129C22F43A30CFB27E899A8CA52453F5459A281D0CC21F902403A596C7F69CBF9A64D97B935AB384FBEA5851D831E8420066826D7E11E34047D18CF08283BE8F29A8A79B0F477C27BC41B8EA4AA010ECF8ECE0D37389FF13E235A4526070F96F415D41AF2E053FD4440DDFFD69799456E7335CC6D9F4370008803F7BABB6C58B6996DC5A52649E25463B5267C188E2DC39B3258636ED8689E5C02E00574988B3AF881D30E9EB38AC51C1E00E1C0A411ECF37E314276221D7D8713F7A449E38371854EA26520ADDB58082287FAA1F77FC04095499A3C3A331A38852A287B24040C1CCC054086964FB1EE2B328F3DE21A986507CD20B4DE4898DFD15045324B93FDF85E5392DE0F32C3BADD04784012E97CB9BA19472B0C20EB0A71C89149EBB601ABAA4A853F2C75DD2622235AC30D97B9D7B1216089B9CC8E879660E40EBCD15203404A8DECADC42114715F4D8A6A10511BACC4DDC23520445A95FA3945BC95878BFF18728E64DE8B7767CFBBAA21F3EF2D92F3D7DFDA792BBE4E5B3381077658BFBEF8DB95B64F9F2A44917B38DF6F9391118978544369C882B218E7A7A31AFC3EB9A75A28095C4478DC81F9CFA127BB749CC53898409365170823D65A0B46BCFBA0E47CC0C5F6ECBEE09131F134EDD254F4F58B50C486DADA13195B1A35739420A45BE6558401F64C3B6AC94B73397925C20545621C7ECDC7DA9F71A755F84D27F2C6D8415D37F2BF1966A76845216E41764AB96DC2E14C12DF3684F7683FDAF5EC771DB7050F81A4B3E516C7D5C955201A18F436962476C1284531764A9397E0EDBFFA8C3699929DAEAF968B4524BD98EE62F9A0DB9CBF99FDA80CC6C57A5EE1099B1EB29799A5B5BF5593CDA26CE2C66DEA3D40545465C1D21F5B9373556B9ED0AE30E90B836003CA83F78E29BD8D49550286DC2DE6407860E9A9CC5EAF3E1B1C73FC2D248B81B1CC8F59DABFB5DAADE6F2A0B38E76D9E6D0125955D08DE7F334A56A8F362CC5D883D56BF7BABAE6D9E425376D34A05AB863A0D9ADF7C6FDA574FA8DC60965E021532C25ED4D568412D4143FBF2C4EC2F230D08337A4E546E01F7C1BFF4C97F2F27AF400CAA57BCF398AA5BFFE155B0F29A085D5053DFBEDC3423818DE8FC597EEAB2C1663D8C81C71CB876F73AC854286063A2E8BD8614D06B80F3BF56381179342143F4C89B8CEFE9168B6A96F416DC617B9F544F9DF65CA6F4F7A84A327909666B70CFFE889C86ACA706A0A1365E248D6B341A004A27D4EE344F03CE6E85D3573E272D48210DF7C3178EFB7BFBEF7765D24754673C9EEC14C7513FD8DE6386B0829EF0980B826EC9C77C81D1E3B8CAA65992DB9C2F8DD691C520FA6F233AFAAEDBF287A57A9A66D2330F4636F02EA3148C4BCD2C8B114D48A1027FB3BD5008D732C427ADEDEC9969AEAD451E166954FDC207C1A4EC409CAC60E42383385187AF44F136F91A8461E62EAFE6FCADD1E491162E46CFBBADDDB72E5B54B7C655CB9489E7F4F7E55C93D3AD50CF84E1F47A706FEDF818A5246BC755D6D18EF18702F5A90CE51812A67227C5E5A051133576E9EBC18AFA18C1B05C854D343727B25BB10E3B9A3645D789287858FA43734D66AD831E8646FE604286544238DC99ACFE3C8285230FC784BB73360F72ED34795B1C46EDBE32A346BFA7F534B500C6C9D3EC26AD7ED20D1500E3DEDF141DF3C2F92E981472F0010A48F25429329AE92CBBB918246F5A53212703C75DFA15D014801A830DEB75BAA36 -pk = EB6437FEB7351929BB7BE1D4427EED328ABC3B14F6059AD2F14E8A24164EC6343695D786C2B8ADA098524B5F2BD94FCFB60D519F2230668FD91159F7E73FF42C -sk = EB6437FEB7351929BB7BE1D4427EED328ABC3B14F6059AD2F14E8A24164EC6343695D786C2B8ADA098524B5F2BD94FCFB60D519F2230668FD91159F7E73FF42C020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000792571280CB6516FDE85C72A5ADE2C3EA2245955BB50603C172EC7AA8F08EA278418D0F5E8DE6656586AE2B5A2AA0100000000000000CA32213ABE2A437C3579D84BDCFCC0809A98025F95ECD7EFCDE5A5EDFF87592082766C7F61BFB3335C0C9101AE25FEFFFFFFFFFFFFFF52EE4A7652A2A002C4E96528E447D1F705C9F1C9DCC576885BAA0BC6A1BB05000000000000000000000000000000000000000000000009F4089F5E62B5FC176BB066DF44FF118EBF4BC178EA27B8F72BB9CAF2DE0C00000000000000000000000000000000000000000000009EFBB093129943F1843C0C1A9CCD3D64BBE7CF2DA894293FDD0FD1B50EC7301EF81EBAD035C14E0EA70BDD563232B6A893287D29117D648F8B75F2315DFA02102321B072756A1397DDBA1900965572166CEEC581302597261CE102EF094A9B32FF22765CD8A7C0C76B75AA6C4F4E67AAC4911DDE4EE8CA0E4A95B648DB0D8D02908E3BDBAA92A86A27FD01FD002428C1D8ED7A2C5FE4A41F8F5BB394700096281DA2295CF14BA02BEDE7E762B43907257F5E5F58BB44CE616EF4055F58D55E343FEF3E5A23EC16E2C6952B4D9F2FEEE725C36AA08F49049D932D7D3CD8E9CF2A44BAA87B901ABD2AEB9DB08358AEB83FF16321BD4D5DF7DAFC9D71424A759F3011197CB8CC524FB1615A07B615D017E8E8194CE1F49FCA9FCD59AC7B630BDE019C4D96497383E4368B2D3D9BA019441E3DFC920DDFD25AC3487A8A09C85F8D1F52EEB996E8E95FFABED3D99EB6031040B9BED3F5E3D6D51C6F9C96EB8A9B9A1FDD3086781B479C772219988C05A02E51478FA4D049046722AF6B56C9114A873175C6566F89E5D8EED86B045958C9DBB436321633F9D93203B050EE44C5B20220072F52ADB318FFC0E3AEAEC07FB6224D16F5B25B4C63426E0FFE921FEC4B5000 -smlen = 2685 -sm = ECFF9BD23611A28BAF044216D0713D20CDFFE40711FC2F5FCAFBA44A1003C667D4376F812742C103A4D401DC5E9A50167E023A4A778C93BB95135803D9467F5F25AD7A074F05D50D27B15AE499E43F010198E652EA0324D2D100181395233A1640A0A0010E50EA3FD00F7F77FF06B8DC8277E649119203070BC3D60C3FFA8E39D101CE4AF11FBA0B39C9C90700770A45B6AC320A4AC98A649B4478B5970701AE96390D8295D748A50625816913170FA0019FFA507328B2129C9F05A22B81A597FD1B8C27D554B36FD3EB150BC5FA0C6ED967EC5BE6F1E52D3BED1508DC3C841360020CFC2CA1B0713076251F2935EFA8500573CB4634C78A1D0F87D994E8E2B0BD265A877023B54D9A33282C12397DC74CAAB07AC2EFD140DF907651BCD1B37CAB2D03F77CC28872291F1CB28FD4BBB5331C2A18E02120BFD2D9EC0C8938A6D43681DC03527FC2BF59703B5160D8E25D08534EB5AA5CC9C10572257D9E4DB29235683BFE1776A2D9EDACFBA1ADAF66587BC451D32C524C7934556F94776F91CDDA96D2E5CAF91A39503D3A742DC5A0EFEF7C1A13666E200C5E3FD7652D200ADEF51FC5136281570B7832E0C6E7552972E43291F202E6F916C916DC3FA48858F3D92B1B7EFD42DE140D43648AEDD7C7379D7A4B71751A3348B6BBA3B0DB71B4C99C41E085E5536A3F0D2BDDAA88069249E21E2D9906191BBB5C8B45353DE72E00270431847AEB4FF6230CEBD1969A0FB68D6E302B78DA39ADF6C0E681117C8432E24820B9EBF38838545E95CF7AEFCF1E9436CF48E87B6C5181CB418132C7BC050B9498720D7D534792E0585F05DA2735B7E68FE35DEC358DA1BF1681F7F62329BEDFEA3D12BFB26AD9403F3AC1DB96D828050F39DCE4017B45C5DAE4D7DE9E9F687A9D7FAD1AE0E7197184142F6818A63D5617BE9D8D82334A12E68F2EEF88A0DA3A915DE63629550D8A64DF591EECDBD1B89EB40AE9F9D65815271693C85F2CA41BF45E4FA16EF8B17D945EC61E757C6C609D8AFAEE32B3CA628842DB255B619F6562E656F6125FB27195EC82FBEB9C14330DAB649CDB74F523F5A98244194581503356B5B7EC51E2B35AE889452D3457EAD713C0715AA7382DCC510B16E771B3A5A91949FAF5E29223C8F1F861BC3B4E77E095BB61ABA00EB29C065D6F9DA9B4413D61B2202547FB6E34671930EBCDCE4C541B3E2DC90073867A47197E08C96F74ED81DE5F10C37C062E8D82364D67EB185CD098CAC1BC3C522E4FABDF2FBEFB66B9EC6E848F732A737FA7B935EF2848C29B1FB94044996EEF006E251BCEB5BE356F286F0FC85E5CBA627B67398CBFD6C0F520C6F896353FE75BA323D8ECD9D3ED2997580E7E1E49EECD91982C5DA650D6B128068B8D3D72C1EC4BF1FBF121BA96E1CF5F247F9FDA7018CB609329B1C95E59E112C393C45EF7138905902227CD21A39CE30397FF017495BC98A968FB497E03DE5843E64923683F2E402DA63CC25AD0BA13B85E3E379B08DEB39542C06A268BBF44990447190A1F8ADF0D3ED9ED9917886210864CAD84E7C4D1282C4D3BFF9DC23E4FA68EF6B0480E76459D1B5E0A7CC0CFC17F59531C4C1CB1D416B7D009AB50173F706289DBB68201C305E39FEFAD87929EF933006598CE0F0242A2C60955AE487115B4C367A7E49488491A6F044FA8B7AFD81F6DA09D29D4BEFE1B3C9EAFDA4F17D22EAAE0B2D1646906D1CEE65614640B53479E23831C56EBE12B92997D5FEA725D78CA75F4509EEBD3DF4F741D6B2770521BE2AE63CA365FE1518CFDCD5088D58CDFB8D3DBA76731F74760A47C9D619A31B7E318E957194AC5ACC6867CF8C9C235043D5C09240F346FEA840AE0BB16094883FC801DA0BEFAC64A021F6F871413249E9C7F5CCA92F4EAB5713B0F2CD6C950F34BA6FB1CFAAD541BD5FAEA45EA5FB37258301A49D7BC4657E3E986D707213C0F836B030C21593F11518EAE3A8A95A2EFC8B9839E79CD8CB0E6DE59D5A43FF8F81FD35392F0C0659B7679542136782D559897FBCC0129C22F43A30CFB27E899A8CA52453F5459A281D0CC21F902403A596C7F69CBF9A64D97B935AB384FBEA5851D831E8420066826D7E11E34047D18CF08283BE8F29A8A79B0F477C27BC41B8EA4AA010ECF8ECE0D37389FF13E235A4526070F96F415D41AF2E053FD4440DDFFD69799456E7335CC6D9F4370008803F7BABB6C58B6996DC5A52649E25463B5267C188E2DC39B3258636ED8689E5C02E00574988B3AF881D30E9EB38AC51C1E00E1C0A411ECF37E314276221D7D8713F7A449E38371854EA26520ADDB58082287FAA1F77FC04095499A3C3A331A38852A287B24040C1CCC054086964FB1EE2B328F3DE21A986507CD20B4DE4898DFD15045324B93FDF85E5392DE0F32C3BADD04784012E97CB9BA19472B0C20EB0A71C89149EBB601ABAA4A853F2C75DD2622235AC30D97B9D7B1216089B9CC8E879660E40EBCD15203404A8DECADC42114715F4D8A6A10511BACC4DDC23520445A95FA3945BC95878BFF18728E64DE8B7767CFBBAA21F3EF2D92F3D7DFDA792BBE4E5B3381077658BFBEF8DB95B64F9F2A44917B38DF6F9391118978544369C882B218E7A7A31AFC3EB9A75A28095C4478DC81F9CFA127BB749CC53898409365170823D65A0B46BCFBA0E47CC0C5F6ECBEE09131F134EDD254F4F58B50C486DADA13195B1A35739420A45BE6558401F64C3B6AC94B73397925C20545621C7ECDC7DA9F71A755F84D27F2C6D8415D37F2BF1966A76845216E41764AB96DC2E14C12DF3684F7683FDAF5EC771DB7050F81A4B3E516C7D5C955201A18F436962476C1284531764A9397E0EDBFFA8C3699929DAEAF968B4524BD98EE62F9A0DB9CBF99FDA80CC6C57A5EE1099B1EB29799A5B5BF5593CDA26CE2C66DEA3D40545465C1D21F5B9373556B9ED0AE30E90B836003CA83F78E29BD8D49550286DC2DE6407860E9A9CC5EAF3E1B1C73FC2D248B81B1CC8F59DABFB5DAADE6F2A0B38E76D9E6D0125955D08DE7F334A56A8F362CC5D883D56BF7BABAE6D9E425376D34A05AB863A0D9ADF7C6FDA574FA8DC60965E021532C25ED4D568412D4143FBF2C4EC2F230D08337A4E546E01F7C1BFF4C97F2F27AF400CAA57BCF398AA5BFFE155B0F29A085D5053DFBEDC3423818DE8FC597EEAB2C1663D8C81C71CB876F73AC854286063A2E8BD8614D06B80F3BF56381179342143F4C89B8CEFE9168B6A96F416DC617B9F544F9DF65CA6F4F7A84A327909666B70CFFE889C86ACA706A0A1365E248D6B341A004A27D4EE344F03CE6E85D3573E272D48210DF7C3178EFB7BFBEF7765D24754673C9EEC14C7513FD8DE6386B0829EF0980B826EC9C77C81D1E3B8CAA65992DB9C2F8DD691C520FA6F233AFAAEDBF287A57A9A66D2330F4636F02EA3148C4BCD2C8B114D48A1027FB3BD5008D732C427ADEDEC9969AEAD451E166954FDC207C1A4EC409CAC60E42383385187AF44F136F91A8461E62EAFE6FCADD1E491162E46CFBBADDDB72E5B54B7C655CB9489E7F4F7E55C93D3AD50CF84E1F47A706FEDF818A5246BC755D6D18EF18702F5A90CE51812A67227C5E5A051133576E9EBC18AFA18C1B05C854D343727B25BB10E3B9A3645D789287858FA43734D66AD831E8646FE604286544238DC99ACFE3C8285230FC784BB73360F72ED34795B1C46EDBE32A346BFA7F534B500C6C9D3EC26AD7ED20D1500E3DEDF141DF3C2F92E981472F0010A48F25429329AE92CBBB918246F5A53212703C75DFA15D014801A830DEB75BAA36 - -count = 76 -seed = B887F07DB5358C3FDC2402947BBC87ABD064B02A859FE8DB37B5BCBB916020443DABA5534A0778FD0B1C05EF3ABE6269 -mlen = 2541 -msg = E7E845902E852B331EF9923416E492C1641236E4E72408D800FD70774BA32B6B4BE04B6E82237A247D26F9A33AFC4745C16CE0554774C68B33CFC6E67AE34E42038FC6C324972642338DAEA75982C71720F1EC9542DF94B38434DA34A2003FABD9DAEA1950B7751DA6C81AFF7D03390F5D63455D417F5D12A510337A16197EBAF921B6A7A9A9A58F9696418ECED6B27CB8EFC8ECBD9B68714F721561AF8553A0D84E30E009A8985D011CB994EEAAF88C76F7F3261B47FC174155C138DB2EADB09A06073B211FC0D27113E8FEA0DA56E181CF532BA8207F5D80D6A30D8BACBA540D49A81A0763A0467DBA7883766ED6358E809261AA3D8B757C839B532F272C5767671A3A8BF3391B14F5E97BF2668A4E98847F1ABFA21E2370870DDF24504F89B3DB71E210C46D66EA7296D65C926E2C955D899AC830CD9D06808A68E9B3722B86E878CF21A5E5D41D7F3CD95D23A6344C259859735AE1A953ADE13CA103692B33AF90ED0345C7B038D938F8F494D90CBD3933B2A80FEDC2BE57960DB23AD018BAC63017A04FCC510553226CD86C74AB90E13C72A1BE12E4D751DC670A98EC4F81E9F8954A693FC7175BA7E50D340FF7F15D568D0ABDED0BB1FC557B1E55971B4C4CE8CC1B4D9E239C73B1133C9E1672DEE36A2D9527F315C21764648643D866B0E2AB6D2DEE61D838BC5DAC183FC511C4501B6E535ECC54F3EDAD6E8EDBF0DE7CB70BEE861B2BFF0D41BB87FFC0EBCAEE9A6DFB98D31D35CFB6DC0442FC285AD0879E7B218B6E66453FE04207FE814C5F72E49406B48FCB1DB145753DC2A2D3E9793594F7EF1A1A6339619E1040CDE605648234A51B2F6774B31C7F9A77C2CE3B98819132BB725D288C65901F7001E05FE5326B6F701C337D41C8CF8748FF9C276ECD398C725C36C11857605F58C0B154DD9F3C1B4649AE677533EB0338B7475254E273B786C2FE7DB4C13468CAF0AA2AECD55DC1A5F868C8EDFFD8BE8DEEC20A9FAA621C4680F3EEF4DFE4A79794FCBC5F8C56EEDCC3E1963569A36525D4F6A5BDBBA5D12966FD8A0FCC70783FD9F61613842F80D000C9281CBDF28C01C6F6AEAC10DF1DDCD0322E00C4E3CC801EF091D9C1B01E84DCE725D57C800D38990251AA1D1206AD93A7DDA40F27726D6A03D973150F7A88703724E314C0953D56DA6EAC442A70C2A08BC66BFA2B0EE11E185131E352D10DD714DDE502097AF0AD155AEEEC2A6B93B149B75DBB898B2B3A7C5FEF2F48D9B12A580F54C4EEF3FF83A4F13F2F194AF551D4800AE86AAD6EFC82CE460D325CBCFEE3400AE939431AB4070D7A7CC005F270896051E32B1051E58941530E250F05AF19FF416E65CE40655FDA31D2E7A6158E07DA08FA61AFD5319B682DE44AFAE146129A8B769C1708A5D3479B6C910B2FF0FC872A4A41AA8BF3EE16F80011D163B599D18501335A2BE10CF117DDA094FE01596C404C14580A7075D04CEEF68BD8F813D7DE6599F478F3DE9CE60B294CB7CE5284A61E078939D08F3D4FD998ADD3B92532AA54E0C31087CF14BF4EC964EBAAD53BD15D04E37948E94917DDE181EE3BB2346335FFB403B000F5669019C5281D88A0E771176E49DD0BA22E719C0B731EC2AAE9C898E74B2967BCBDCE0D7D73057E004BD62269F4E7F3823DCC18CD6C551104B9B896B0AD138DDE7C3D761138641BD3EFF3DF1552659FD97BDADFC59A05CBC622A4492A1B22CFF72AC197D61A4C5A949AA9AC09D4C1112F4C1B1CAE353C70278A21663E11F27E9EC66ECD4AD56F2179A3FCEC37AC3A3F4B33C06BBBD4C8CE8E74825BBDA3E58A2E2D928C2C6E6D886274BC0E2175AB03D8721C664FBD6455DB2960E3AEF0BB25AFD3CB0BAFB71A2BD18A89ADAEE00AADBC7E4AE70ED4B534AEEAB88559194755F9656B43BC83E3952000D9E2295BF3391904218A015C786DE0144868EE4AED203B261FE743B7168788A0680F7484792A3F64782B2B1ED9217B09AE9845DD71ED363F18E8AAECD51A4F5913AAB33FEA3FC5F1E37E0CD6333D2A8347CF45EB7C4AD967FE6FCFFF3565743435EF09A646E75C7E968ECF4202A9B2C23AA8118A1683219B1155C2CABC95C696704F5B270C6D213332649363AE13EC811E9A1090D1603EFF745E2FA83379DFC6DA5EFECED556E46A8A5FF1F2A5C0D911B95C20EC2465AD0C96AE7E16FC36143762BBC0734CF4D6134DCB0D739F7822470E0ABF66A0AB15CE0D6096D3ABBA2CA4C81C1C68BDC252A8A4BA609B7C05CCD913EA56126F418FC0B06DE8F76EF651F8085604C16E5910F3B8651AB78296B56B78326E41AC15774E442017FE5B291E5227EF5A4B78CCFA96D6921C8542A8A984BC87E2678903869C52C2568FEE4E23EF3CC466CE270614E6472244A4294B31F9438F7E43437FC9C9C5F3EFB0F4F0AF2110A613661DC24A1C7F7A7F8CD14A943821F16F94BD874F1A32E305DB4776CDF6633446724CCBB2488B1B06F0177819D53885127E6EB717C0D6718366A8B8A089AA6AB17CB2581A75EC748123B7D0383F3900EFCFF77D2E022E90AA41491117758221A0B149C8EBC23CC01C17B9FD39118DAD413A391CFA0A5C614208060A61646C7CF1DFAD4ABC3A9CC5CD566DB2AC8FAF392C9D8E7DA0F84B941D792A8493FBEBAD30D0DAA0D683DCC1583F0C9019622EB6C92FBC475BABC8B626319BE2264ED873AC063F84B7F83688AC99D732A1E3FC12281BFB1E1E63D48BFBFCA619BF4B95F899C50AD0F5FE4673347DF2BBF2CA21BEF49C7F8440D95A83299960F1E42B457ADDCCCE236946DE80FD4862BAF36387E041DEAAC3C9751AE345512BB1F423A3B4CA8D3A5E3796D289641D3424FF22670A46552EC68D7D095E8636441D777DBE2E9DBF6B5FEDE5318516C3886B943F6ADF17D8B7CD40B20A48233C9FD981145B45A5CB8F6A88EAA36C270E93E1D876D7781BB92A1FD99727D8E0AE34C73398AB8781BB342F5AACF4081459EA5EC20C30CBB6122344C457F92B20448F78E1A2A291202003781EBDA1747061C6CE1F8BF882FEA4FB50BFE638685CD638EEC15BC24252567025FC5C16ED1F5D98DD90C76E720EF7B4E25A20D262E339C5E5BB5A9CF051BF5FD1F63E93452A179277B57956821CDD901F1C01E634AE18485708A6ED8F592AE2EF3A9D54C9734FFBADC6F0B86D0398AECE9374F9ACAFEF38D4B97BE9B932B9852F97AEEC435311A67AE344AC1985738C72F52B3D8B71F64A916240477FDDC5FAF02F8224EB35D310FEA03FD2C5933047355A438676D92EADF70DF662D97C2F5E00CB293053699D51D302B78145C77AB03F34EAF170EDA5215436FAF0238A4B0D41D29F36052A5278C7D8AF9A6FFC6E2B6FFC4C5D524F7640A7170957F3DE2451AC75589CE328B61EA7179FD990DA1698F5C73BB8639A4DA2AD67D364DB04771CA118C4055C25F1120A0643158C07CD22B375D5C1DFA26FFCDA44921F41D4A504B2279DFF03421CAD19960F87C6B6DD8C29981CB66C9731F931E43B0D97C6AC9862E2CF711DF0DED8E4D06F3957FFF9085A95D9FCC95610FDE22856B229A3121D8B81EE83DEE4A6A9FA3FE8C75351574CB000BF7F3746CA1CC5414AEB23A2 -pk = F9A9A81E4AAE9A0E24D60C67B6996AF0F29037E4973A8A4BDAF3D31C9F531C1994A15F55558BAF4FD5AC2700F51FB1B61B8B1A043CBB7047BBEAF090D98DA21C -sk = F9A9A81E4AAE9A0E24D60C67B6996AF0F29037E4973A8A4BDAF3D31C9F531C1994A15F55558BAF4FD5AC2700F51FB1B61B8B1A043CBB7047BBEAF090D98DA21C020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A499C710EB7B1E1DDA2330D9E2A0DC9F0D203A9E5A8B20FC538B90E4D9733CE95C3689BE59177C204D69A683E3EC0000000000000000D73F31C5B33768A5D6C941A358C0109CF534059FC69FD5F2C084A2BC143C1DBDB869C75E7F436E416D5060AC5929FDFFFFFFFFFFFFFF6904DBE6C1AC607EC644B33F01EFE88E3608EC628A5DCB93B1BDD1840BE0FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C4DC2A36510C7B5CA2F61830CFCBFE86148A4F4A1733E071152F5A5D5FB0E00000000000000000000000000000000000000000000008262B54B2B682E7DC981B78F92309337CF1299CF3C7835CEF4355A879A368D0DB5F397742D482EEDC0946103C2EC620F167D9F9CC5E0C9E52809232BE8799E339575F860004A251FE1ACE64CADFA344B484B23B57B75BDF1074DF617C43E8F0C59CB1ADC07564B700A12C096677CB0F74B724E159E4105891CD3A7E15D34F22F2399444194195EAF511CA7C60975B2AEFCFFA1767133FAA059541C29885FF62DA482201091BD4FB17350B4D1A00E54686789823AC9669FA227697057011AAE1A14D890AAA5B2224992E257693C0B921BA2B33D5C586CAA59D53FD8FF5B096E0AF0490D4CD9E5E4D89B08F04CCDD3542B96F112096E72AC8F05714973D76BC91392B4F7CA117B4A144C5C2F56477DFEF52B48550FEEB94039C7575278DCE2260F93CC68EE14E9DABBA9255557C1DAEEC6B0CE849211574009E90E911D0C8CE323A9B2BE5BAC9D7BA269CC0433DE18A6408E5BEE1B6B32898D08D44C25225BC92D21A4AFC8089F5F4A9C36C27AC0A1DBC3E58225F58AAE039332BE3760A1C26E1260A4A60616AFC70D31BAF07E86814E6BEEFB712C7B8BA0E5E1DD90CFAAFBE812527A5B973F325E27048DFA6B7A8FC029D1B3AA08F398BB3DB7A8994DD2D0641E -smlen = 2718 -sm = 0519028729E6B61B97063B8EB76820C7ABA735017B72759F6790F834DD00C53C1CDB5B0653653207D8751F04E40CBF8C2D046F2840217F7F863BF20638321FB2B52428149505C456A8A97745FA746707A9196BE07E7960B4F80649DD6619AF744CBE1101B332BCE9DD17BA216F00E29246B6C7944F973104AFB9CDC5CA88E93853042E715A3BD2CB981D310101A12957A7475E47ABA7D8EF8771100E120301EFCCB036898FD0E7DA048759270BE8BC1301E7E845902E852B331EF9923416E492C1641236E4E72408D800FD70774BA32B6B4BE04B6E82237A247D26F9A33AFC4745C16CE0554774C68B33CFC6E67AE34E42038FC6C324972642338DAEA75982C71720F1EC9542DF94B38434DA34A2003FABD9DAEA1950B7751DA6C81AFF7D03390F5D63455D417F5D12A510337A16197EBAF921B6A7A9A9A58F9696418ECED6B27CB8EFC8ECBD9B68714F721561AF8553A0D84E30E009A8985D011CB994EEAAF88C76F7F3261B47FC174155C138DB2EADB09A06073B211FC0D27113E8FEA0DA56E181CF532BA8207F5D80D6A30D8BACBA540D49A81A0763A0467DBA7883766ED6358E809261AA3D8B757C839B532F272C5767671A3A8BF3391B14F5E97BF2668A4E98847F1ABFA21E2370870DDF24504F89B3DB71E210C46D66EA7296D65C926E2C955D899AC830CD9D06808A68E9B3722B86E878CF21A5E5D41D7F3CD95D23A6344C259859735AE1A953ADE13CA103692B33AF90ED0345C7B038D938F8F494D90CBD3933B2A80FEDC2BE57960DB23AD018BAC63017A04FCC510553226CD86C74AB90E13C72A1BE12E4D751DC670A98EC4F81E9F8954A693FC7175BA7E50D340FF7F15D568D0ABDED0BB1FC557B1E55971B4C4CE8CC1B4D9E239C73B1133C9E1672DEE36A2D9527F315C21764648643D866B0E2AB6D2DEE61D838BC5DAC183FC511C4501B6E535ECC54F3EDAD6E8EDBF0DE7CB70BEE861B2BFF0D41BB87FFC0EBCAEE9A6DFB98D31D35CFB6DC0442FC285AD0879E7B218B6E66453FE04207FE814C5F72E49406B48FCB1DB145753DC2A2D3E9793594F7EF1A1A6339619E1040CDE605648234A51B2F6774B31C7F9A77C2CE3B98819132BB725D288C65901F7001E05FE5326B6F701C337D41C8CF8748FF9C276ECD398C725C36C11857605F58C0B154DD9F3C1B4649AE677533EB0338B7475254E273B786C2FE7DB4C13468CAF0AA2AECD55DC1A5F868C8EDFFD8BE8DEEC20A9FAA621C4680F3EEF4DFE4A79794FCBC5F8C56EEDCC3E1963569A36525D4F6A5BDBBA5D12966FD8A0FCC70783FD9F61613842F80D000C9281CBDF28C01C6F6AEAC10DF1DDCD0322E00C4E3CC801EF091D9C1B01E84DCE725D57C800D38990251AA1D1206AD93A7DDA40F27726D6A03D973150F7A88703724E314C0953D56DA6EAC442A70C2A08BC66BFA2B0EE11E185131E352D10DD714DDE502097AF0AD155AEEEC2A6B93B149B75DBB898B2B3A7C5FEF2F48D9B12A580F54C4EEF3FF83A4F13F2F194AF551D4800AE86AAD6EFC82CE460D325CBCFEE3400AE939431AB4070D7A7CC005F270896051E32B1051E58941530E250F05AF19FF416E65CE40655FDA31D2E7A6158E07DA08FA61AFD5319B682DE44AFAE146129A8B769C1708A5D3479B6C910B2FF0FC872A4A41AA8BF3EE16F80011D163B599D18501335A2BE10CF117DDA094FE01596C404C14580A7075D04CEEF68BD8F813D7DE6599F478F3DE9CE60B294CB7CE5284A61E078939D08F3D4FD998ADD3B92532AA54E0C31087CF14BF4EC964EBAAD53BD15D04E37948E94917DDE181EE3BB2346335FFB403B000F5669019C5281D88A0E771176E49DD0BA22E719C0B731EC2AAE9C898E74B2967BCBDCE0D7D73057E004BD62269F4E7F3823DCC18CD6C551104B9B896B0AD138DDE7C3D761138641BD3EFF3DF1552659FD97BDADFC59A05CBC622A4492A1B22CFF72AC197D61A4C5A949AA9AC09D4C1112F4C1B1CAE353C70278A21663E11F27E9EC66ECD4AD56F2179A3FCEC37AC3A3F4B33C06BBBD4C8CE8E74825BBDA3E58A2E2D928C2C6E6D886274BC0E2175AB03D8721C664FBD6455DB2960E3AEF0BB25AFD3CB0BAFB71A2BD18A89ADAEE00AADBC7E4AE70ED4B534AEEAB88559194755F9656B43BC83E3952000D9E2295BF3391904218A015C786DE0144868EE4AED203B261FE743B7168788A0680F7484792A3F64782B2B1ED9217B09AE9845DD71ED363F18E8AAECD51A4F5913AAB33FEA3FC5F1E37E0CD6333D2A8347CF45EB7C4AD967FE6FCFFF3565743435EF09A646E75C7E968ECF4202A9B2C23AA8118A1683219B1155C2CABC95C696704F5B270C6D213332649363AE13EC811E9A1090D1603EFF745E2FA83379DFC6DA5EFECED556E46A8A5FF1F2A5C0D911B95C20EC2465AD0C96AE7E16FC36143762BBC0734CF4D6134DCB0D739F7822470E0ABF66A0AB15CE0D6096D3ABBA2CA4C81C1C68BDC252A8A4BA609B7C05CCD913EA56126F418FC0B06DE8F76EF651F8085604C16E5910F3B8651AB78296B56B78326E41AC15774E442017FE5B291E5227EF5A4B78CCFA96D6921C8542A8A984BC87E2678903869C52C2568FEE4E23EF3CC466CE270614E6472244A4294B31F9438F7E43437FC9C9C5F3EFB0F4F0AF2110A613661DC24A1C7F7A7F8CD14A943821F16F94BD874F1A32E305DB4776CDF6633446724CCBB2488B1B06F0177819D53885127E6EB717C0D6718366A8B8A089AA6AB17CB2581A75EC748123B7D0383F3900EFCFF77D2E022E90AA41491117758221A0B149C8EBC23CC01C17B9FD39118DAD413A391CFA0A5C614208060A61646C7CF1DFAD4ABC3A9CC5CD566DB2AC8FAF392C9D8E7DA0F84B941D792A8493FBEBAD30D0DAA0D683DCC1583F0C9019622EB6C92FBC475BABC8B626319BE2264ED873AC063F84B7F83688AC99D732A1E3FC12281BFB1E1E63D48BFBFCA619BF4B95F899C50AD0F5FE4673347DF2BBF2CA21BEF49C7F8440D95A83299960F1E42B457ADDCCCE236946DE80FD4862BAF36387E041DEAAC3C9751AE345512BB1F423A3B4CA8D3A5E3796D289641D3424FF22670A46552EC68D7D095E8636441D777DBE2E9DBF6B5FEDE5318516C3886B943F6ADF17D8B7CD40B20A48233C9FD981145B45A5CB8F6A88EAA36C270E93E1D876D7781BB92A1FD99727D8E0AE34C73398AB8781BB342F5AACF4081459EA5EC20C30CBB6122344C457F92B20448F78E1A2A291202003781EBDA1747061C6CE1F8BF882FEA4FB50BFE638685CD638EEC15BC24252567025FC5C16ED1F5D98DD90C76E720EF7B4E25A20D262E339C5E5BB5A9CF051BF5FD1F63E93452A179277B57956821CDD901F1C01E634AE18485708A6ED8F592AE2EF3A9D54C9734FFBADC6F0B86D0398AECE9374F9ACAFEF38D4B97BE9B932B9852F97AEEC435311A67AE344AC1985738C72F52B3D8B71F64A916240477FDDC5FAF02F8224EB35D310FEA03FD2C5933047355A438676D92EADF70DF662D97C2F5E00CB293053699D51D302B78145C77AB03F34EAF170EDA5215436FAF0238A4B0D41D29F36052A5278C7D8AF9A6FFC6E2B6FFC4C5D524F7640A7170957F3DE2451AC75589CE328B61EA7179FD990DA1698F5C73BB8639A4DA2AD67D364DB04771CA118C4055C25F1120A0643158C07CD22B375D5C1DFA26FFCDA44921F41D4A504B2279DFF03421CAD19960F87C6B6DD8C29981CB66C9731F931E43B0D97C6AC9862E2CF711DF0DED8E4D06F3957FFF9085A95D9FCC95610FDE22856B229A3121D8B81EE83DEE4A6A9FA3FE8C75351574CB000BF7F3746CA1CC5414AEB23A2 - -count = 77 -seed = D08A139CC7147ECAF4B1D1E434EB2EFA2B2607B0033D8BA989133E496DC9F3654944C7AF91CBB79866443E8C4E8217ED -mlen = 2574 -msg = 34FCF4626248B979A7A8D306CB9ED69C4CCB5CC3729D2692E0BA679D5C2FEAAC54A4E06D4EFCEDF78E19357DAE263E1B5D107FB09618A9C34F54F19A738A66B95E6F88E20E01F879F53E8F4C371B571E1438FF70E0A8CD00D608976E24501B2DDD323EFE6C1302A318CAD821C6FFE641672BB80AC62286C69FCFFD93422911C46D43DC9A1F00A73E19EBE6CC09A9801F2A1DA708F0F1F98E7F1A18529010823230279F487911CEF1E784A229D9E311BCE5E2D368E6D613F791DDD617D0F37F604B786CA2BAB754E8BC4BD3DA37E66A54DF1D3B268A5A80379A30A52B1532E8CFABE24168D83CBFD61E2346F901C361F771E0BE3E03DAE8CC30614C10FB8DCCDCAA5B9A25DDD8D61E61F60F22308E12ADC137D3D8C53CF7B31984CB813758BAA19AC178F2F0CD2155ED674A7509A3CFA7FF66D2D9B1E60BE50FE7FB79591C500F66BB1D35EDB80263F4B696A3DDA0B9B2911D01E76E9070D99DB93D1D0C3874CFFA776BA24424A6B453526F7C44EAFABE13C0750F9DF33E82105930139E70B5CF1B09DC3913D6BF4A4859F67FE814FF038F0FDAB93522A35E7F81002A395989D68B8B7E4235A09837CC6402A5338DA08E7C73DC63C43BAC42054C694F4931B80140D6B104EDEC995CEBCC5629F85D09DED8257626F9FA4079ADEF81D044C18BF2277DAAA41931B62A6028F89F95F06D8A8FDEB95EB2EB1E90C0D8523E0B476B158E3040F212390AB2503021E8D6FC0733B963CC6188FB2532829925B59C8255D89F10B657053D0FA1D8E76C84826A4609284503D3A101EBFE7AF93EDC423EF5303CD946C8B570511E38EB04BEE0060E678D03E4134F84F279A570AAD0332417FB2099E3F1F279CE7D6DDB080C5D83064D107BB560B21183AE165CBB54CC75313DE72D40D1CF5173455AA55C5C356D7C40A2A7023DD95D3F89B515D7598F800DCB7BF68B707978ECAF55B794A17559BD1E913F4472B1830783BBBAB5F23A760C78C46157FD1B429C445494CDF92FEC8BF9FC217D3CE2697BB6C671BAA793CD0C1C84F579F0DAEC400BEADA799A9F417FE4744145F21C6F8559AFA7A514A0E951F03E5E68C17A8E5816F3FCF41774D26BE2EDC11FC3A42CFCF00F817C3D0FBF474FD7F30C9C3C6BE7F74FCC79FA6AB07CAB037EEA7D83866673A74C087B5F7542804071D53CE348D2E836749E35AF0FB884D5D53ABB195AE1EE6E9AE35DC91BE359BCD510A7801FC243C07DEE92373918AA4F8A89EDA3895A52456F7244D1FF007CC7B1A52CBEF4C1ADE1C2C0AC189AB24B3F260475E1D08E7C5BFA30A1CDD71DE5ACE80D5FBD1D0F17198B79C8EEA0365D139F2AE73CAB6FBC9A79786896DE0CE7FC747D68FA4ABAB662A09E0E409F7E652153352BB92F5DA1836B0E92B0B644C821B2DD2BD0AF193AC0F8CF5B8D88432F0248DAB09B46FBEF2EF1899B5981E9B33DE4E9927AE50890FEFC35F681E075D8B0169A2E16FEDA6392AB9858DB87ED18ACBA25575AFD1FEDA9FB3FD01ECAC13C245DF6972F65087513F505187C4E8EA54B6433FA092B6CD3AF13F4718693904435C55D273060FBB5FDA76074691269493E86F287922D074E54EFF04209B2FDD3417D8436D1395E638D57DB75D68F4F819141B6DAF4D13A9A18629CF5F84B0CD02E7A397715DDE5476BDC467218D11AACD6CE399D9D54645BB27CA43076B7E4E57FB4F7C4F4B8D0AA949719D731C3A927FDEF1533D773CF1BB562D5EA43817A5ACEFE9EB7E51029DEA143E8A1D5F76F9BFD74A26C6D38F54194319A1AAABC4DAF45EFBAE770B9E9D834C09FE45C15D4BBC0251D3DF2F2F23387DCABCE6CA7A59625E18FD997770D164C338D0692AF97C749FB746C0D3944CA4B2DA6D3AD7B8C3AA922FC029CF9AC5580CFEAFF50CB2E9044211EA522BB5769BEB7A7BBA0743F345FEEA9AA9DA6EC5F0579CF7A5AA4DEDC832FE3F65185A31FD49C0D259E3B7F8FA96E110D130F588CDEC30D0FD4860CA6673C46D961FC68A4020FB03AE24B1AE12967EC1ED19ABEC0808A7EF89521152033F70F406A7005819D28DFC556C79DE18584088F40BE40A555EAEFA78E3FA3D9360A7CEBD963555CF208DC408A07CCC1369F98BD840F5C940721064E6C7CB241ED0697AF0FACF36F05632A504870ABF90134A01AF00D340F7A5D548A8078C2049600EE454D15EB8CE58C26B3C8185CF9DFCDCA7D4B6DCDEB82230F993D51E701D8387B06BD45B4B61DC9DA6D3B4356F50C1D4AD2B467D36AC092442FA90D1DEB014475AC7CE90C974063459DC951DECFA30D2DE4C70FBA39A8B6931217D0924FFA783C8C3DAF048908E4AAEAAA3B7C98846278AFDD1753252F39CAED7D334D8575CE3ECFB2EDEC31AFEB2BBE67FA929A267376293C2B2F295CD8DBD66106E1D9518BE1798949F3315E0454D018C2B706FE836FB37AB908D9D698AF495BD285A74E4CFC7612D42121F43FDAA7DCF44DA82897B820514D66B92983A3EC819D2CE208D688B6F0AACADC0CDD619D815CD231AD8DD9B6DBAD9C47E16FAC098D0F4279AB52055D2FF765AF6E3618C4509FAE6AB00FA23980EFB19A26E0A6EA4C9A7DC699121388748449C429B28AD2779F5642F05FF58B68BA3E289F90EB27CE06392616C080D659338CAF274D46A90D58F2BFED25E8D4A8C62030A5E89F6B1A5F6112A38661E2F2B5A37BCBF050812DCDCE9C0A939ADF929C921E7DA0C30815DA318EB2F350F286441CC92060C970077623EEE68B8C6FEC9FFFE780A6FC85FD7AF90172951337AF57339E98049132A4CF58874A7418FB7ABA0628B6192BB2C43102EE6B1D7E824725D9C75D34A8B69DF4A6BCB1F96B57767046C99EC6352751E2FE1075BB4092672379B3518DDC884FEAD5BD062B0336EA88BCBE0D22E066566347FEB617A322BEC561E9AA9D2177EEF0DFEEAF6231AD56D0CD9E300709C9317B3D334D8D2AC97F96CF2F45B8582C4128D95DA8CA207AE34D3DAACCDB128C11694EEE6D3E8E6AB767B6886B1F7235D85A4D9C7C831C5DB8AD8323F63927A638E19497CFB308285A03CA2C1FE2AC4D919AD11511ECC6F28E7D0E0A614FE21B57BCCDF83535C7E2C40840BA0014247190C580378454751EB3F2361D7193E160B9516F7EE1D683B336B873C8BA22E97480A61F002A73844C78309C0A3B31BE30A192A62BDCC3D33A7A5BA1F6AE0404A8558740CAE46E5FD15971B41C0BC39665A9B92EEB3328C328B073ED5B3720D37A1C097AF8A6FDDC3B2B067680E6CAA760368B0E1C052E804E9F80F26B52596202FF2E0AF7215999EAF7D3EE3E8916744E40AA1154322DD068AA15960DC38671A4F5889FBE709CE1DECCFA80B9D33AD2FD963FE0581A2ED7718A27CA62819D05BAA3212EC7CC1C5472BCF579AD52D5E1B2BEE637D9827851C419A4CB91DB57B2A6CB4433C1BD209648F1FE170ABB964B272BCF0A263CE28CFA3A9D1449CFFDF643E37AD97182F0031CB334A1EEAD23D63A5C2D0A675D0ED000F37FD2153E1AFC4AC01692701014927601203ED2B8A477CCEC45C1F43190E4FBAF2295E32A9383FC7915AA76950A301ABE47BFFAA9C294292126934CCFC173115A6CA96F3945FD5F924A5017125AD5AAC705106EB852EF3190A24420196ECD37F7C67B57162CBEB97DFA -pk = 8DE7FF8D49E5A799C6936E126C1690C17419EDEF1D8AAF1CE435842C6E7F0B22673E972BF3190F3028F5666E7D58906A57F3F51C4D7D5E0FECF530F36CF6BB1B -sk = 8DE7FF8D49E5A799C6936E126C1690C17419EDEF1D8AAF1CE435842C6E7F0B22673E972BF3190F3028F5666E7D58906A57F3F51C4D7D5E0FECF530F36CF6BB1B020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BE0DDBAB0AA740AFC2BC22842C4B090A4D46DB8DCAC84FB41E733C7133B3BD851A15ECA4CF2D066857A5B0CC1E4800000000000000005D9C7CD55C8852F91CF5652037F64CE3738FC5D1A55F6379AB9DD595C38702B4E3741D420C3342B91D23390928C0FEFFFFFFFFFFFFFF5D43254816B13CFB3E51D5B273BD82DF57E553A16A8437DD37D89486FD64F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2FCD03978D2051FF249850B31782668B020EB22CDAE830C1D348BC82F84070000000000000000000000000000000000000000000000AA148ABEB3427A7E5B153858079483CE557DC9181A93C00E521D93E6A9A64B0F3099398077F45C5655B10016FC2441154380B2109BA06F8CE620935107791C31255641B7432DA9E39C8A6FEB5268EBD14F384A8D4408F4DABA70ABB4513E291BE0B0CC4B4D535C268305918D94F3A41403CF7737471CE0529E770896A262B10FAE42EF1174D8DB9D5D9BFE95FF23F07AEB33CC0D6F0F7EB1D0D746D6E1035701A3B884D37FC4022BD9DB0A2D92D486A72722216E442266D670913AAAB442ED0C6F3E8EE196B8AC51A6E2D2446C31D3FB567802956F9D4F9965FD2199B98619256D274AA03101DB4458884D8C5BA610CB7D061175945B5E6DE98A094D0624FC1F15CB70E2C06B5DCD2DC470EB3AF1B0DE69B14A3F19CD313DFA3270CF24D15816716812767CD5E498757911B788CCD17A42EACDA60FC6C976E5EB2CBFC4CA381BF1B2181673E714353813EC51BDD3E980AD2E81E6054970A1E4B946CA66DC9D2A8B3D431109B459BEAD8C944CEBC5B96CF7AB208014C869B43372D84DBD43FB2E8CF12BFB9B965F6AABE57DA2CC10A21DEDA5AF8D62F5C36F202661E086D3E22DFE7F7DAB696EAE955E737C03F6E1B26A6D06CEB3C5FACA7EC6F75A2C296FA804 -smlen = 2751 -sm = D4F735A1A8E34BE70C037B33F37698107257A5050BE547CB1A395FD291005C6FF271DDA782539006AF5D6B781A5AB10E010407EA96F586406B65570719408EE318632B4AE2053D3F5A415755EEE255036590F36B5748613D2204DD5B008C7A11111EAB04388836422958C337EC047C24B3635FDE9364DC05E50A9EFC17F79E5BEF028E0FACC0853D18B89A040005CA1A1159A76CDCCC8C9F6B9D4F28B60403AD01E3632E6FAE5D6106D353E56E171FBF0034FCF4626248B979A7A8D306CB9ED69C4CCB5CC3729D2692E0BA679D5C2FEAAC54A4E06D4EFCEDF78E19357DAE263E1B5D107FB09618A9C34F54F19A738A66B95E6F88E20E01F879F53E8F4C371B571E1438FF70E0A8CD00D608976E24501B2DDD323EFE6C1302A318CAD821C6FFE641672BB80AC62286C69FCFFD93422911C46D43DC9A1F00A73E19EBE6CC09A9801F2A1DA708F0F1F98E7F1A18529010823230279F487911CEF1E784A229D9E311BCE5E2D368E6D613F791DDD617D0F37F604B786CA2BAB754E8BC4BD3DA37E66A54DF1D3B268A5A80379A30A52B1532E8CFABE24168D83CBFD61E2346F901C361F771E0BE3E03DAE8CC30614C10FB8DCCDCAA5B9A25DDD8D61E61F60F22308E12ADC137D3D8C53CF7B31984CB813758BAA19AC178F2F0CD2155ED674A7509A3CFA7FF66D2D9B1E60BE50FE7FB79591C500F66BB1D35EDB80263F4B696A3DDA0B9B2911D01E76E9070D99DB93D1D0C3874CFFA776BA24424A6B453526F7C44EAFABE13C0750F9DF33E82105930139E70B5CF1B09DC3913D6BF4A4859F67FE814FF038F0FDAB93522A35E7F81002A395989D68B8B7E4235A09837CC6402A5338DA08E7C73DC63C43BAC42054C694F4931B80140D6B104EDEC995CEBCC5629F85D09DED8257626F9FA4079ADEF81D044C18BF2277DAAA41931B62A6028F89F95F06D8A8FDEB95EB2EB1E90C0D8523E0B476B158E3040F212390AB2503021E8D6FC0733B963CC6188FB2532829925B59C8255D89F10B657053D0FA1D8E76C84826A4609284503D3A101EBFE7AF93EDC423EF5303CD946C8B570511E38EB04BEE0060E678D03E4134F84F279A570AAD0332417FB2099E3F1F279CE7D6DDB080C5D83064D107BB560B21183AE165CBB54CC75313DE72D40D1CF5173455AA55C5C356D7C40A2A7023DD95D3F89B515D7598F800DCB7BF68B707978ECAF55B794A17559BD1E913F4472B1830783BBBAB5F23A760C78C46157FD1B429C445494CDF92FEC8BF9FC217D3CE2697BB6C671BAA793CD0C1C84F579F0DAEC400BEADA799A9F417FE4744145F21C6F8559AFA7A514A0E951F03E5E68C17A8E5816F3FCF41774D26BE2EDC11FC3A42CFCF00F817C3D0FBF474FD7F30C9C3C6BE7F74FCC79FA6AB07CAB037EEA7D83866673A74C087B5F7542804071D53CE348D2E836749E35AF0FB884D5D53ABB195AE1EE6E9AE35DC91BE359BCD510A7801FC243C07DEE92373918AA4F8A89EDA3895A52456F7244D1FF007CC7B1A52CBEF4C1ADE1C2C0AC189AB24B3F260475E1D08E7C5BFA30A1CDD71DE5ACE80D5FBD1D0F17198B79C8EEA0365D139F2AE73CAB6FBC9A79786896DE0CE7FC747D68FA4ABAB662A09E0E409F7E652153352BB92F5DA1836B0E92B0B644C821B2DD2BD0AF193AC0F8CF5B8D88432F0248DAB09B46FBEF2EF1899B5981E9B33DE4E9927AE50890FEFC35F681E075D8B0169A2E16FEDA6392AB9858DB87ED18ACBA25575AFD1FEDA9FB3FD01ECAC13C245DF6972F65087513F505187C4E8EA54B6433FA092B6CD3AF13F4718693904435C55D273060FBB5FDA76074691269493E86F287922D074E54EFF04209B2FDD3417D8436D1395E638D57DB75D68F4F819141B6DAF4D13A9A18629CF5F84B0CD02E7A397715DDE5476BDC467218D11AACD6CE399D9D54645BB27CA43076B7E4E57FB4F7C4F4B8D0AA949719D731C3A927FDEF1533D773CF1BB562D5EA43817A5ACEFE9EB7E51029DEA143E8A1D5F76F9BFD74A26C6D38F54194319A1AAABC4DAF45EFBAE770B9E9D834C09FE45C15D4BBC0251D3DF2F2F23387DCABCE6CA7A59625E18FD997770D164C338D0692AF97C749FB746C0D3944CA4B2DA6D3AD7B8C3AA922FC029CF9AC5580CFEAFF50CB2E9044211EA522BB5769BEB7A7BBA0743F345FEEA9AA9DA6EC5F0579CF7A5AA4DEDC832FE3F65185A31FD49C0D259E3B7F8FA96E110D130F588CDEC30D0FD4860CA6673C46D961FC68A4020FB03AE24B1AE12967EC1ED19ABEC0808A7EF89521152033F70F406A7005819D28DFC556C79DE18584088F40BE40A555EAEFA78E3FA3D9360A7CEBD963555CF208DC408A07CCC1369F98BD840F5C940721064E6C7CB241ED0697AF0FACF36F05632A504870ABF90134A01AF00D340F7A5D548A8078C2049600EE454D15EB8CE58C26B3C8185CF9DFCDCA7D4B6DCDEB82230F993D51E701D8387B06BD45B4B61DC9DA6D3B4356F50C1D4AD2B467D36AC092442FA90D1DEB014475AC7CE90C974063459DC951DECFA30D2DE4C70FBA39A8B6931217D0924FFA783C8C3DAF048908E4AAEAAA3B7C98846278AFDD1753252F39CAED7D334D8575CE3ECFB2EDEC31AFEB2BBE67FA929A267376293C2B2F295CD8DBD66106E1D9518BE1798949F3315E0454D018C2B706FE836FB37AB908D9D698AF495BD285A74E4CFC7612D42121F43FDAA7DCF44DA82897B820514D66B92983A3EC819D2CE208D688B6F0AACADC0CDD619D815CD231AD8DD9B6DBAD9C47E16FAC098D0F4279AB52055D2FF765AF6E3618C4509FAE6AB00FA23980EFB19A26E0A6EA4C9A7DC699121388748449C429B28AD2779F5642F05FF58B68BA3E289F90EB27CE06392616C080D659338CAF274D46A90D58F2BFED25E8D4A8C62030A5E89F6B1A5F6112A38661E2F2B5A37BCBF050812DCDCE9C0A939ADF929C921E7DA0C30815DA318EB2F350F286441CC92060C970077623EEE68B8C6FEC9FFFE780A6FC85FD7AF90172951337AF57339E98049132A4CF58874A7418FB7ABA0628B6192BB2C43102EE6B1D7E824725D9C75D34A8B69DF4A6BCB1F96B57767046C99EC6352751E2FE1075BB4092672379B3518DDC884FEAD5BD062B0336EA88BCBE0D22E066566347FEB617A322BEC561E9AA9D2177EEF0DFEEAF6231AD56D0CD9E300709C9317B3D334D8D2AC97F96CF2F45B8582C4128D95DA8CA207AE34D3DAACCDB128C11694EEE6D3E8E6AB767B6886B1F7235D85A4D9C7C831C5DB8AD8323F63927A638E19497CFB308285A03CA2C1FE2AC4D919AD11511ECC6F28E7D0E0A614FE21B57BCCDF83535C7E2C40840BA0014247190C580378454751EB3F2361D7193E160B9516F7EE1D683B336B873C8BA22E97480A61F002A73844C78309C0A3B31BE30A192A62BDCC3D33A7A5BA1F6AE0404A8558740CAE46E5FD15971B41C0BC39665A9B92EEB3328C328B073ED5B3720D37A1C097AF8A6FDDC3B2B067680E6CAA760368B0E1C052E804E9F80F26B52596202FF2E0AF7215999EAF7D3EE3E8916744E40AA1154322DD068AA15960DC38671A4F5889FBE709CE1DECCFA80B9D33AD2FD963FE0581A2ED7718A27CA62819D05BAA3212EC7CC1C5472BCF579AD52D5E1B2BEE637D9827851C419A4CB91DB57B2A6CB4433C1BD209648F1FE170ABB964B272BCF0A263CE28CFA3A9D1449CFFDF643E37AD97182F0031CB334A1EEAD23D63A5C2D0A675D0ED000F37FD2153E1AFC4AC01692701014927601203ED2B8A477CCEC45C1F43190E4FBAF2295E32A9383FC7915AA76950A301ABE47BFFAA9C294292126934CCFC173115A6CA96F3945FD5F924A5017125AD5AAC705106EB852EF3190A24420196ECD37F7C67B57162CBEB97DFA - -count = 78 -seed = A315BCF0E6835892ADFA07C034BFCD39F80B62925A95490B20170BD29378E11559C7F1CD296377FF1E01284EC727FFCD -mlen = 2607 -msg = 96AD5FAEF409B8A4C21ACB1ACB596BADF387D26656BE3EB17987AF59737E324B7BF8412A306B0E706AEF73D79AF753D9B0064BA9CED8DCEA966543FE748E2611709ECD1CE6E4DD8FA812D485E91809A225936675369574B0D104A258E3353EE0E021683615CA5C7C531FB29A5025CC7F7323860443DC19C9858F741EB9D24A9F6F04FC839B67153214116E8B7FA982F338445830F915F7C85C88C23BA2A3CE8E2020A9D8DD7B18EFE95563E3924D2A341826AF51A8584CD026B1C433EF0221145BA8BDC8F73A467B33A9EB3E8CD2A4D671C17D7C28AAA539D1C5BF2F4138639AFB89CE791DAF0EF0281D52598F4C13D210974CFA1F099A0FC70B1DC120E5C00C33A2BD360BED57CCE069060D6380BE2204852D8BCFFF4918BA0B70B0BD1E1D55DC1D68DB1D20AE713B0093EAEFA1E33D40D9BD95CFF17568393E9BBF5CC1287325D2668F65DFCF44ACE2F6C6CEBB62F1433E69CD19E6C6532EA93682B22C4C4A62C6ABCFAED08EE64F32723E56205222E4AE0831AB8FCA8C265FEA0CFC66AAB1E367201752AEC11F752B963792C071E42A8A1AB80658A0C6960147ED740CD07F307CF6A644A98E1D2E56C625ACF458D0BDF6216A4F1B9C78EC3F14850C803A4207C894E61A8AA88840A27F2B439FA7CBAABBC789102A95323E06E2C324859DB92C6CEAEFDCA389F677082180FE3D6202FF60DAB9F87E3B84841C0A4EB5974D893333F7F1513E54EA4AE0731EC409F69B77089FAFB121300042880EA59B7927E9435EABFDCC1019A96E145D5D157998D620E7BC6945DBD6CD78E94C2D89589F8DC8A01CF1B295A26B091847F034937F764ADFD811F52B3AA187F3F49273EAE5949FF34B64BC86FF11EEFE378825D526509483E7191B33333E5465FFB025B269F898CE1F83EA549F1864B556C729F510118921B69594F67B8C229236AD3AEE55BD7082E027B5D342C976A549E01618288944DE0B2C77473A25201B61034B334968178AFAB7F8CD1FEB6A25CF8DCE3586FFAAA861471E2EE7F0C22538FB3C95D2145965C4673E6489764AE24B4F048DED77FE3487AE175F6D4898F69F9FFF276470A93DAF986A75F685919D98C9C609C795D4785AE941C782B551EF382F47209AADEA19066AE5D3EBA7BBD99E91943F1E62754A42FFC8048F7B87F128CCF6C96BD760B45F07F740E94491874B06CC3450AAF55BC664B407C57369CABD2708A9C478DFF64D292D96AB71EB997F8B71CDD6BA02F52C5035EC26E8111EBF8268CB00DF9ECD63BC0D557E2D2E77A6363B00DAF25237E77DAD03F929E5E9B39447A70D4E5F4B90958F312C80D594E1B1F3D0D23F2B0D9753BF3544061CF0C0F841C440319E74F9B9D15B91EBA1E680ED6AAB7D63A97B48C0A4AAF314E8E77E2EA6BE9DCFC7B5557FEC1B996A37C86CF6941325EC356EE75671726BCED7D2157BE8D4C62CF4BD0420BAF2C4223597C0EF75F7A7C9533D14BE0D21C37F06FAA53ED5EE0DDB025862417F98D2F188895395CF2FE72185ACBEA952F55CAD7EC2D684A5AB94B1257D7ABB565B8C07B88C6335FFB9D2FC6F6779CC24FC3CDF92BB3B12EC54360A7CF3579632A2A65C518E57015DF1C616C857F83F5F1AAFF693ACFF210DD1E95CE04CCA9A0BF385ED6EA2AED894E79D5133799393469B666209371E708D4D279E1AC5ACE28985D0DB2765D547C2902B715BAED5A4FA3E7AA42645F3BBE1E9F3CDB87B1DD8DBB5AAB08626591921CB49E552F8EBAFCBCF428470719AE40B9CA847F31848F39E4D42049C5D40B0BFF036E5409A6A12E7924148E60B64BB83386079B54486FFC8187302893B8BF826578D9CA03A1291983F21DE7F6E65458F8942DC1B135C6C8C1FEF4F3863A58DB17112419590AE57B9425592FF22E596191E5BA7C513EC315EC3476C95A149F6A5EC1CF24870400FDF46217A23F42E0B61157C3CEE23E7916B4475A94B96B917C171B1A34DB13AD98833E457343F94A76EE226FA5B9F3066C2FD69F14D3AAED1B31F5114780442EBBC88D0DE5F689CD910E7464D73423B9D4E03718C5C51871250D11E27E28DF1268166E3AF328A80D9D335F2D27D2E91DC61CDDC7F733E345D56C11B6130875D93D527F93542FB352407185E7AC07051AF7F642E34FA06B1376BA15A35D837C1BFE090BA67A89FC1E307DFF3F02A988ECD48FD229733F641F2609EC8DB14B1A5AC170B104F03C2509D2EE6844C716766D06A6A25D957530FD68A8DE6F1753F83EC19EA2DEB1A4F9C7986F20FF60A7508DED6547A85BABA70577062E8144BA0496777A5218595E021937FEBAD4BFDECAC29E3FFF2EFE7D598FCB86F93A734E4C573E1496A6282A3B40E817DD3C9D631939AAB350ADC703899EE3BCB1B5EAF6EA8420DD6EB2D4F64A1818AAFA97B73C75610B6005F1EDC1EC7D8F8DB1E5D3E9666C1292515105037D26F2C8D83FEE1F4EF5DEEB287CD7C1E11960218C1B8BB50453488BAB019435065AEDFECD8D218BD1E751FE736442E8D09CE7176A71C06415A30B070693A68BDAA5CDF62351AE665F37FEFDA9481E62EC181ED24F0D0649AD01C89AC422F1B7E27895E55DCC2FD817346D361FA559094B37894C0B478C68A1D7564D089D9D4417D5C7372A33BA475A81FC129F3259C5407BC7435825B415782CC84D85E69D9B44B32D78FA255A895CFD55319DAE677FF89D93A3884CE9401775563FF1788CF3AC11CF96DAA199E7F4579A0264378A323FDA64FAD2349C09465FB23BA09069C7FBC79E7288A82F9165268F6842E0AFF0E250C21BBAEEFB4347D4EF1CD51161DFD29BFAFFBEDF71DEC93F4157A5C18995379ADE8D15DB59EC4A8B308C2EADE1B7DDAB55CE2220F3B3AE8CBA7C8211CCCB3846A225B438F4B37DF54363A987C5C4E6B9D20EC3C0096317D11F982184B75D8EFFD168B7B41317D40F903A23A2649999DB36CAAE31BA5D91998A684D30AAADBD3B1EC154BB6C92513BFC0C47C673254F42B1FA36B995CB737668CBDC2A0D1BA838E74E0E50B22FC22DD048F48B6D1E89E1CCCE5A226F63AC7B8E6E9E8CE27050BF3DCD7D0F35F47BBEC1CAABD4D619CD77302AB4FF6F56DFBE9F5821AFF2D72EE6A628DAAAE4440EDCC070473BDAA54CCD775331AC2812FC5B9884915DA582EB36F85C7923F06D961594753802EFC5883CA484FC64FACE42DE6C3105E23CB90663A3B381D0C6A7265B740BFF0A1A017058F06E39A74BB07B63F883CF914FE675E7E5AD5AD44C9F90DDBE23A125D9BE02264EDC13972FF22BA48ECE8890A223EC13ADDBE055A8B4E03882677FC0D94C9053DA6CED34E132FD83810A793350446D60AE5DD0D174B534A3B6F5BC1B497F9406B5CDD414401B6DD881CEABAB12CC51425E88A81BD9E14BDA18273583CCE0849AA48DBA1CFC49CDF29242C73C99C87F063B8B739AA787570459C098405DCCEF78D6D97C21545F2959DF9CD62F9C38AD9A849507C23A51714565642DD76C9103154327985F7DCC701B795A7AF8625F06367ADC11A7FD7B6ABBDA5B2FF6A825DD43B64A48EDE4EFF8603A82159A6011F9E626171E4593C0E963595A6E068AD05FEB12378C71AE515A82C293EB7D2B01B333CBC7991B44685AA7513B3A58342BA5D094B773E6A27F8582F3DABF54DEF59974CB8A2499369B5B64C7AC08D32D75FE37371C578073DC83B82A828DFC325976FF282D3F6 -pk = 027CB5C2B4BA4FCDB8CB2929E97F2A28E4BDEF33C7F7AE2C6D8F7ADD19CECA115D46F52A87CF73AFE74071E569332FDDE88AC42E8B766B635879C1A64DAE142A -sk = 027CB5C2B4BA4FCDB8CB2929E97F2A28E4BDEF33C7F7AE2C6D8F7ADD19CECA115D46F52A87CF73AFE74071E569332FDDE88AC42E8B766B635879C1A64DAE142A020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CC26F33680ABBF21E17FEB77B87E14AC0101E405806E2123581BE5B69D7565137BE0F7D75EAEFE04E5DF7A7DAD1102000000000000008DC724F313B2B79F6674AABC3A1D9DEDDB1CE00B10276FDB7BC36E2D03B88FD39059E18C83276294D02DC193326BFFFFFFFFFFFFFFFFF305AED33C8B78DEF918DDA2BC43762AD5DFB59C04B0BD2A44C8ED293A31F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14429FAF4607F748565C332C8F8B2396764D047A9CB32C36E40E31A78093010000000000000000000000000000000000000000000000C14C0EA2AA5E9CE7C1BD07CCFC543C7EF7C0B517C8B8CC42019AED7774F438291924FB3BBF5FC6A5D637BE7D0305077978CB34757D7ACD34BD0871AF3EAB35202331D28DE547A2C1E45841F73A9283AA45CA52375EBDC6F9646FD8F208DF052D02C5F30EFB3973B78961971266031D0526BD9D7C204613C814D3A0A0F3F3CB0C26A955A0DDB71230C167E9913F04AAF10CBF592E6686A6A2FE25ED94513CC12230FC1A768283FD54A6AAACA60C55F8604EBFF55D632767F7F9BEC1D4DD71F2278195C91DC4E0D3B085B73EAF4B07563297ADE3C5133A35DFD790EC891E98E90E8CD8FD6B08C64A0049B7007C1C888A6C60E1EB9377FA9EC320FAAE7CA29F100F47403DC1336E621CDBBB2935391B7CE4AAF08F46F6A29A4D73E5EE2E5B39A4060D6DDE84DE6EEB3A595C400B0894D8F00F93B166E0C75EB634E80A83D33E57102BD1009F1C3C1338BC0F72ABE472BC63B618146CB4D6BD80EAEF62280F9ED20EFC5C46D6CE78DE3C8CBA921B66BB073E78192055D12E93049DCD7A5CF684682BCF60BDEDD92C37D6EBF8340A180E7A61F2664F6D31805B5FF45094D2CA75260B334C87E03783F97B0EEC2DE84CD38C2FA6A84CA4117D6ED4A27EF1A757198517 -smlen = 2784 -sm = 68F304F6C7CC60775D00DDDC0D980FEB2DF44C05B0ACF52B2613127AA001D6CCA67F72C267EA0202D3143E86C4B34A9C8707F967C2A20F11A50180052F78AB74DF72F8938B056308C3E6C981E5E0A90253315FD315C833641B02F6CD8DC45ABEC03B51031CE629402ECF7875E506B9CC0C510C0A12260F05106F0DE6FCC87D2A1F008C93AD3782D2295EB90401957A1B7768F7CD47B55E05809EC31F5608038EEC1A95D8D1E5FD6F054C8C44C8073D210096AD5FAEF409B8A4C21ACB1ACB596BADF387D26656BE3EB17987AF59737E324B7BF8412A306B0E706AEF73D79AF753D9B0064BA9CED8DCEA966543FE748E2611709ECD1CE6E4DD8FA812D485E91809A225936675369574B0D104A258E3353EE0E021683615CA5C7C531FB29A5025CC7F7323860443DC19C9858F741EB9D24A9F6F04FC839B67153214116E8B7FA982F338445830F915F7C85C88C23BA2A3CE8E2020A9D8DD7B18EFE95563E3924D2A341826AF51A8584CD026B1C433EF0221145BA8BDC8F73A467B33A9EB3E8CD2A4D671C17D7C28AAA539D1C5BF2F4138639AFB89CE791DAF0EF0281D52598F4C13D210974CFA1F099A0FC70B1DC120E5C00C33A2BD360BED57CCE069060D6380BE2204852D8BCFFF4918BA0B70B0BD1E1D55DC1D68DB1D20AE713B0093EAEFA1E33D40D9BD95CFF17568393E9BBF5CC1287325D2668F65DFCF44ACE2F6C6CEBB62F1433E69CD19E6C6532EA93682B22C4C4A62C6ABCFAED08EE64F32723E56205222E4AE0831AB8FCA8C265FEA0CFC66AAB1E367201752AEC11F752B963792C071E42A8A1AB80658A0C6960147ED740CD07F307CF6A644A98E1D2E56C625ACF458D0BDF6216A4F1B9C78EC3F14850C803A4207C894E61A8AA88840A27F2B439FA7CBAABBC789102A95323E06E2C324859DB92C6CEAEFDCA389F677082180FE3D6202FF60DAB9F87E3B84841C0A4EB5974D893333F7F1513E54EA4AE0731EC409F69B77089FAFB121300042880EA59B7927E9435EABFDCC1019A96E145D5D157998D620E7BC6945DBD6CD78E94C2D89589F8DC8A01CF1B295A26B091847F034937F764ADFD811F52B3AA187F3F49273EAE5949FF34B64BC86FF11EEFE378825D526509483E7191B33333E5465FFB025B269F898CE1F83EA549F1864B556C729F510118921B69594F67B8C229236AD3AEE55BD7082E027B5D342C976A549E01618288944DE0B2C77473A25201B61034B334968178AFAB7F8CD1FEB6A25CF8DCE3586FFAAA861471E2EE7F0C22538FB3C95D2145965C4673E6489764AE24B4F048DED77FE3487AE175F6D4898F69F9FFF276470A93DAF986A75F685919D98C9C609C795D4785AE941C782B551EF382F47209AADEA19066AE5D3EBA7BBD99E91943F1E62754A42FFC8048F7B87F128CCF6C96BD760B45F07F740E94491874B06CC3450AAF55BC664B407C57369CABD2708A9C478DFF64D292D96AB71EB997F8B71CDD6BA02F52C5035EC26E8111EBF8268CB00DF9ECD63BC0D557E2D2E77A6363B00DAF25237E77DAD03F929E5E9B39447A70D4E5F4B90958F312C80D594E1B1F3D0D23F2B0D9753BF3544061CF0C0F841C440319E74F9B9D15B91EBA1E680ED6AAB7D63A97B48C0A4AAF314E8E77E2EA6BE9DCFC7B5557FEC1B996A37C86CF6941325EC356EE75671726BCED7D2157BE8D4C62CF4BD0420BAF2C4223597C0EF75F7A7C9533D14BE0D21C37F06FAA53ED5EE0DDB025862417F98D2F188895395CF2FE72185ACBEA952F55CAD7EC2D684A5AB94B1257D7ABB565B8C07B88C6335FFB9D2FC6F6779CC24FC3CDF92BB3B12EC54360A7CF3579632A2A65C518E57015DF1C616C857F83F5F1AAFF693ACFF210DD1E95CE04CCA9A0BF385ED6EA2AED894E79D5133799393469B666209371E708D4D279E1AC5ACE28985D0DB2765D547C2902B715BAED5A4FA3E7AA42645F3BBE1E9F3CDB87B1DD8DBB5AAB08626591921CB49E552F8EBAFCBCF428470719AE40B9CA847F31848F39E4D42049C5D40B0BFF036E5409A6A12E7924148E60B64BB83386079B54486FFC8187302893B8BF826578D9CA03A1291983F21DE7F6E65458F8942DC1B135C6C8C1FEF4F3863A58DB17112419590AE57B9425592FF22E596191E5BA7C513EC315EC3476C95A149F6A5EC1CF24870400FDF46217A23F42E0B61157C3CEE23E7916B4475A94B96B917C171B1A34DB13AD98833E457343F94A76EE226FA5B9F3066C2FD69F14D3AAED1B31F5114780442EBBC88D0DE5F689CD910E7464D73423B9D4E03718C5C51871250D11E27E28DF1268166E3AF328A80D9D335F2D27D2E91DC61CDDC7F733E345D56C11B6130875D93D527F93542FB352407185E7AC07051AF7F642E34FA06B1376BA15A35D837C1BFE090BA67A89FC1E307DFF3F02A988ECD48FD229733F641F2609EC8DB14B1A5AC170B104F03C2509D2EE6844C716766D06A6A25D957530FD68A8DE6F1753F83EC19EA2DEB1A4F9C7986F20FF60A7508DED6547A85BABA70577062E8144BA0496777A5218595E021937FEBAD4BFDECAC29E3FFF2EFE7D598FCB86F93A734E4C573E1496A6282A3B40E817DD3C9D631939AAB350ADC703899EE3BCB1B5EAF6EA8420DD6EB2D4F64A1818AAFA97B73C75610B6005F1EDC1EC7D8F8DB1E5D3E9666C1292515105037D26F2C8D83FEE1F4EF5DEEB287CD7C1E11960218C1B8BB50453488BAB019435065AEDFECD8D218BD1E751FE736442E8D09CE7176A71C06415A30B070693A68BDAA5CDF62351AE665F37FEFDA9481E62EC181ED24F0D0649AD01C89AC422F1B7E27895E55DCC2FD817346D361FA559094B37894C0B478C68A1D7564D089D9D4417D5C7372A33BA475A81FC129F3259C5407BC7435825B415782CC84D85E69D9B44B32D78FA255A895CFD55319DAE677FF89D93A3884CE9401775563FF1788CF3AC11CF96DAA199E7F4579A0264378A323FDA64FAD2349C09465FB23BA09069C7FBC79E7288A82F9165268F6842E0AFF0E250C21BBAEEFB4347D4EF1CD51161DFD29BFAFFBEDF71DEC93F4157A5C18995379ADE8D15DB59EC4A8B308C2EADE1B7DDAB55CE2220F3B3AE8CBA7C8211CCCB3846A225B438F4B37DF54363A987C5C4E6B9D20EC3C0096317D11F982184B75D8EFFD168B7B41317D40F903A23A2649999DB36CAAE31BA5D91998A684D30AAADBD3B1EC154BB6C92513BFC0C47C673254F42B1FA36B995CB737668CBDC2A0D1BA838E74E0E50B22FC22DD048F48B6D1E89E1CCCE5A226F63AC7B8E6E9E8CE27050BF3DCD7D0F35F47BBEC1CAABD4D619CD77302AB4FF6F56DFBE9F5821AFF2D72EE6A628DAAAE4440EDCC070473BDAA54CCD775331AC2812FC5B9884915DA582EB36F85C7923F06D961594753802EFC5883CA484FC64FACE42DE6C3105E23CB90663A3B381D0C6A7265B740BFF0A1A017058F06E39A74BB07B63F883CF914FE675E7E5AD5AD44C9F90DDBE23A125D9BE02264EDC13972FF22BA48ECE8890A223EC13ADDBE055A8B4E03882677FC0D94C9053DA6CED34E132FD83810A793350446D60AE5DD0D174B534A3B6F5BC1B497F9406B5CDD414401B6DD881CEABAB12CC51425E88A81BD9E14BDA18273583CCE0849AA48DBA1CFC49CDF29242C73C99C87F063B8B739AA787570459C098405DCCEF78D6D97C21545F2959DF9CD62F9C38AD9A849507C23A51714565642DD76C9103154327985F7DCC701B795A7AF8625F06367ADC11A7FD7B6ABBDA5B2FF6A825DD43B64A48EDE4EFF8603A82159A6011F9E626171E4593C0E963595A6E068AD05FEB12378C71AE515A82C293EB7D2B01B333CBC7991B44685AA7513B3A58342BA5D094B773E6A27F8582F3DABF54DEF59974CB8A2499369B5B64C7AC08D32D75FE37371C578073DC83B82A828DFC325976FF282D3F6 - -count = 79 -seed = 8B47E0EBE786914C9A52D547106CEB4A3D3DE938B3244E02E5F9660954C4C95A23F2476FCCB487673AAD0513820905DF -mlen = 2640 -msg = 2447D338BF1A375B66B77FB96CBE7742508B57DFF4D33A368EBB8451C2C67B980D3576E6588D8678B285EF288A8B5C9C2726C4A550E764E47FFFA2A128533A7653E480288447509E10013AE1944FFFAFBD9E2BACA0B3C7069C07A4186C056FD3857CADDADD5F891512DAEEB26865F5C89FFA63A64C85A08E41EBE7BD8786A8ADD571A4267D5A9E426840A0B988E197A09F3770B5B0D80D65515CD4D8390AF40E6150062DC4B8661A8238F232692C152C97B8CD5BFE7B5AD863DC92D99744D769087B3EDD81D2E475F5CF0224B10CDE6FAE8DFC3519EFDBE66805AD4468D84D3DD93430363677360DA8F56CB58A6B775FF6417C1F324380B15C9BA668EB0F25FC2A690B483E856F3327B2D79FA6259E30D7F76199CFD21152B7C6FFC3FC113F70D3930C08B3C1EB1BF25C100C5A930EEC2C52664F092B89614943D9D85ED86A2EF666A94F9826C3D116A2BBE49443E2C11748C977716381D9463DA8D09612B80A6760E5A6FC5F59425EAAAD6C8342C1EA4BEEDD5D73151CE213C0B155286FF22CD28E3BB88E0CEE39CB859900D1E0FC19F6A7237BDA8E51476F4844A316752FB347492A928EEB07AA39ABDCC0164D1921B61352ED4AC94B82C410A56505633BAD53A3E649ACAF64C43C1ACFCD4715FC594AF6FB9E85B0B7DDD6E8621BD12A2BEE48223A97EC8502C16B550B03087B6E87C1A860D36322064F8FEBC52F2B7C31DAE7430870259BDAA5889852E3AE6F61013F5AD0D38727CF9D90C67BD7BB3B82D303C6C35383ED86FD5B7DDEC824EA198EF780BE830A1F2679D24EA6E2FEEFB979563F511D188F409F0CFD0050FD418414D01E46DB3D23B3A90B24F4E96EDD4F863BFB333D6A826D29EED167738BBE22C516C59FDF81B032BB55473A5EA2A1DEFE71C95A1EEB5C028435AD0379896CBBC76877501B054CF1FD2F6D7A9DECCD70D0C07111147EF568DCE514DE96EED61600029C8D103B31C8B344A700DE630276BA2C5633419C59E66577659538A6381E45584C7E1D6ED978AB0AF89067AC83BB70DEB6F2C58E339A5A66176A54D985DA6E02002948C62BE6F12314240FE18B09AACBCE82EA462586B8316C3E0AEA00F9998922F8D956120E53B4178223F4D2934A20976FD5A72027C8F4CB33E9BBCC0ABD15395151266B6CD5B4A9E2FC1725D8E9AB2CBDA47B507BB25AC995EDD51EBDA5FD19CAF68FAD8EAC57CB5EF0C6FC861A73E64648EE3255DB4C3394438F49377CC4AC2FCE1B6BC812E5D282F122678713C6C6D452A33C632C0AA47686588752D72B0586FE5EC2464A6DB40662FD2106A19F67DCCC45692FCA03685251D512642B0CEE436C78D94C6F5F25BBCB41FC7E5B1AECD52B846A0B70EAC93579603E9870F942AD4C1CFC9D49B1132777C6F1C184C1537178E5029067257A2DA2827A2EC44D323D13DC6E4E1B9EDF5949D4324228687FD54F02CCC3C4DDA635FA546A5A6783959B1C48AA9D9C9F6381EBCCD979253460857D3CB1C70893EE6F04709E35923883EE3C71C7F33B8CC28B9136B3EBE5F52B9A76817F2F74FDC2F12B459DFF32D5A295BE374B3FE507A0995BCACF1E7B24F4501B29F1E8B4F2A8CB394B3E459A4296F6439BA59EC88305AB045FF40B1DAB4F672F878DE1F9E46B9326CB3E2F3457B83EAD8DEC28DD079AF0E984A69ED882E1CF21036578485DFC2DEBC9CFE82FCE0383B4039D147C4C7E31E315FB57B9093DAA811F4EE4568E32E5625ABE76C5A1AE42A03441DBE766D0EF4DF607406F7D489275E8C5D4470866F9049A4AD5C428B843DEC3702E86E177E4B60181D2B5F099BEBCB25F04C93D087C72436E87A9B3AFCE78FA31E2B892400B5C1071F8AE0F78EF6F7D71859A97C17EC0912D5EA27AFEACE739FCF66F489EC6355A3318F79649881CD6C7E96A881ECC4FF6934C3D10D99F1DFD00592CB037749B025BD4BC2832E206C1407E600FC2170C0BB57E5C7AF0756830C2A6913E2B9C60575CD4A394F2A65C50E40A43CF5EBCA6A8A32335707DDF4633BAC7375DD53E24DF20AF30203B514D3793392E38FA8429B050F58B28CAD0146F385809CC7FAEFF8B71B2BC93D2C6F72E31AE2D07CBB3CB7F43540894E01654EDC71CCF4F361A847EC5B1D23C2D4680E29F0E1F992EDA3AC41ECFE614FC010A2EED1BAD87A7D17468D6FA5356EDB25E9008A9BB328225F85202246816E1A542E1DD746A5FD3E064FAA1248579D31CD3D65F8FFF36F782622402DB328C7850D82D8D8A52B897353A2F8B95624D2D958FC1C3AE6466EACCA2A6A5E6ADD4A582D27E07633CCF697FA02E243A4FBB3DC727B718B5AC0FA6AAB217E241627E69CA46F05ED6B496A739A29EDAEEF76992A507130715BE555C68A7EEAD6E8FF3A378D8F4B7BAFDEE3EDB9EC094440E31BBA717A9C82A117D05EDCA2370003DFABFB2EFB29510466F74E76CECCFC41709FAC4CD8EAA998357170A7A293209EB0BB83DFE5E2F6D73C28D5409C55E95068D647BEC42DB8098F0089EF8A5FC5976BAC421C37DDA6C4227BC1AE5AE229F067515CEA3D794C8D85564AF208AE0FCF836B6C0AF41477F99C8773D9DD1923C5C07E1FD508C7436EA93383797F372EF3103546A5278A4F59614A5D182344F0431D065C35620D63D4D001D7F626993241362E67D1BF41419858EECC2626537D44E2E23619381E96CFA91B3D8054681D298509D9B99E7AA99CF8742E37637B24136F8E1B487E9571E4C24AE5DF307E4C7C62E55C47132AE404B33E5367C6F24D6680BE32D20BC58370145486FD5EACBCF98EB7E7FB6293044067AF11879E91444025FE52E24617269BE192BB71BD9F95356EDBED9DF352AB56A854F9F531889A88689D3F161FE6155C6C1E8011D60A46F59C7D08C477FA652B559A80567076B4EAC29A85D54C66B35D6960DFF75A696CDB17EC9A7B74DC6C3652DAE866E8758170D055C4BF60FA1238448CC9E29160DF50160C4B0DFB36BCA40AF0BC5F7D490E7DBCA49535742EECB90098A0A0FBBBBC7AF25C0CA9BC039DFB555DD8431AF188F7C1D0FF786D627C058A0B9A15F26B58AA2A5992BC8FC5AA14025FF95F294203B45EA081E28F094D0D4AD671C885E67B2E9E800F10048158698D56648F67BFA8CC73DD5AFA15C1E48936B2596DEE34459B484336C20CD77E58BF682479F9AEF2FCDA86E4F3A2FED7046E5A3828A9B3C0DBFFC25FE699F25629A2045A51242E310CB369B730A5E81167758D7FE843261A598E4541B02D0DB4BF5616BA07A440665F7FEA6213114B6B1B38BC033D70E845445DCD18E23D34D3D6F4A52F5F904AC5D8FECA5AF1123658D09613209EE19954174A1AC7A8C7F9EA288BBE5A0705F3CE38F30ED5EE69CF5208D461EFAD51C456507C3729EB338CE15C4C253BE21E81F082B0847C6871CA0FC8B3E80115FE2BB8CD8AFAE69A3C1429D21F149B7446888BB4DCB639819EFEE665B6D6F69E61452B9328B4887A7C04E9949390980A2609A667267035B11BF862C1131533DDAFA518221627E0EE7E4009CD48E4AA9D0753A9AE82AA0257B69D569B4C53F05A75A521B327322C60398DB0947D205D2A33AE51CF2CEA8C9162DD604F8EDBE91F5199D19EFBF9896A46389E7BCBA54B4AA57CBA0D4F9DA117F288133AD01A9A9B2A824D54F74D4172BE2B1E5F0D3DE60C13AA5B668EE6A45397C2E39573EBFABAABA48D1DDB2AB6453FBBAC8DCC05349404889C7DE23A16EAFAC8D5E541457C32CDCE80CBC -pk = 3FA9E7DC950EABD66F7438D81DCF88F9D74A8649A982B15256FF89690911CD0B1BCFD5F1EC2B6564E62DD985A8C23D900667C82AAF6A4214F0EB1DBCCE784824 -sk = 3FA9E7DC950EABD66F7438D81DCF88F9D74A8649A982B15256FF89690911CD0B1BCFD5F1EC2B6564E62DD985A8C23D900667C82AAF6A4214F0EB1DBCCE78482402000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014FCC2C4DB9B648AA202AE2CB56E14ABA2C574754AE48C54E9137092BEA7DD06F19CEAACE439560C38479F2515960100000000000000AD423D43D4D96429055CB23D4A1CBB4F0336EF43E5E9A71539A5E2C64C33C6EC1704D93DDEC3AF7D1F6E2937330EFAFFFFFFFFFFFFFF8B31E50EB23FC01D355C3A6F86EDF6F2D956C85DEB45EA631C056EAF3AF3000000000000000000000000000000000000000000000000305CDD1571CDDFED7E604E1A4FADF905F2DD6CDCB6C8897A2549626CC2B80900000000000000000000000000000000000000000000007F313A842D9EAEEA135297F31B8C9171FAF54BCED13FED04665959847D5C602CB936D130F4EAF11A0D5E228DB38408C2B603338C28381B23153FBCD2BD8DB2142622060E0FAC5AC940EC565DB368A3F23881884787941C13E8EA7C73CACED7227B0832D440BC85DCE78AA957D149D9329689A430BA079C949D57C51F2FAAD70AAE958A5E1FEF4AAAFBD34A0F38D970A8F83D8CBDA97F60BB0EF2B109ECFC751C8DAD869182EA951E0D4FB62E8E081A17DADE8A16429E729CFA76841047A16D0DD257CEB9BE26A87D7FB3D387F52469101A326E3A2E93A4DFC00FC19C30465B0D2DA621A15EACB1B37A0866A7F960D85F84E3E24B91B78FF07E37483A6C3B1B2347744D0545B49E0BCC9E82E1A11C04CFB492082E96F4CB9F3F904138A92A44155A7BE64463164596CE209E872531161F76D70D14C7B86A09F187A55FC12BAB2A43A66DF9B188BAFD3E92B05461FD7B025E2D983462F61832B800B323327EFC32261D576CC65E40D181FB9C1CEE58CB6D856BF921B1E277C2D0A5D66DFB343628ECC9C00E6072B226AD5F36B2EB34B06EAADB90BEB4B8C28F39AF051EB79B3E00C97355D6338D8641C12B7830FC94F4C5D69DDCD113D4D45384A568C393F9DB29 -smlen = 2817 -sm = EE020CB0B45E9ED61207750D46CD4E8822BD6A07F841B0559C77ACC09403D1A8DDF1DD78CB0435032DA70C4F779E9593A403C156B5F0081C552F150180FA4770795A5D91CC00520CC768CD61132D0F036428981D62D61C874E0028CD03F6246ED8EDD2048502B75E5E2C26DCC104D03EE536A6BD4BCFFB0756F2BC3A557126B1DF02FE5E2C960C79C128E00201D98E56FD9FF73297A0B1131E116D7D4A0D030D626A28B6DD051125030F6982EA3BAC38002447D338BF1A375B66B77FB96CBE7742508B57DFF4D33A368EBB8451C2C67B980D3576E6588D8678B285EF288A8B5C9C2726C4A550E764E47FFFA2A128533A7653E480288447509E10013AE1944FFFAFBD9E2BACA0B3C7069C07A4186C056FD3857CADDADD5F891512DAEEB26865F5C89FFA63A64C85A08E41EBE7BD8786A8ADD571A4267D5A9E426840A0B988E197A09F3770B5B0D80D65515CD4D8390AF40E6150062DC4B8661A8238F232692C152C97B8CD5BFE7B5AD863DC92D99744D769087B3EDD81D2E475F5CF0224B10CDE6FAE8DFC3519EFDBE66805AD4468D84D3DD93430363677360DA8F56CB58A6B775FF6417C1F324380B15C9BA668EB0F25FC2A690B483E856F3327B2D79FA6259E30D7F76199CFD21152B7C6FFC3FC113F70D3930C08B3C1EB1BF25C100C5A930EEC2C52664F092B89614943D9D85ED86A2EF666A94F9826C3D116A2BBE49443E2C11748C977716381D9463DA8D09612B80A6760E5A6FC5F59425EAAAD6C8342C1EA4BEEDD5D73151CE213C0B155286FF22CD28E3BB88E0CEE39CB859900D1E0FC19F6A7237BDA8E51476F4844A316752FB347492A928EEB07AA39ABDCC0164D1921B61352ED4AC94B82C410A56505633BAD53A3E649ACAF64C43C1ACFCD4715FC594AF6FB9E85B0B7DDD6E8621BD12A2BEE48223A97EC8502C16B550B03087B6E87C1A860D36322064F8FEBC52F2B7C31DAE7430870259BDAA5889852E3AE6F61013F5AD0D38727CF9D90C67BD7BB3B82D303C6C35383ED86FD5B7DDEC824EA198EF780BE830A1F2679D24EA6E2FEEFB979563F511D188F409F0CFD0050FD418414D01E46DB3D23B3A90B24F4E96EDD4F863BFB333D6A826D29EED167738BBE22C516C59FDF81B032BB55473A5EA2A1DEFE71C95A1EEB5C028435AD0379896CBBC76877501B054CF1FD2F6D7A9DECCD70D0C07111147EF568DCE514DE96EED61600029C8D103B31C8B344A700DE630276BA2C5633419C59E66577659538A6381E45584C7E1D6ED978AB0AF89067AC83BB70DEB6F2C58E339A5A66176A54D985DA6E02002948C62BE6F12314240FE18B09AACBCE82EA462586B8316C3E0AEA00F9998922F8D956120E53B4178223F4D2934A20976FD5A72027C8F4CB33E9BBCC0ABD15395151266B6CD5B4A9E2FC1725D8E9AB2CBDA47B507BB25AC995EDD51EBDA5FD19CAF68FAD8EAC57CB5EF0C6FC861A73E64648EE3255DB4C3394438F49377CC4AC2FCE1B6BC812E5D282F122678713C6C6D452A33C632C0AA47686588752D72B0586FE5EC2464A6DB40662FD2106A19F67DCCC45692FCA03685251D512642B0CEE436C78D94C6F5F25BBCB41FC7E5B1AECD52B846A0B70EAC93579603E9870F942AD4C1CFC9D49B1132777C6F1C184C1537178E5029067257A2DA2827A2EC44D323D13DC6E4E1B9EDF5949D4324228687FD54F02CCC3C4DDA635FA546A5A6783959B1C48AA9D9C9F6381EBCCD979253460857D3CB1C70893EE6F04709E35923883EE3C71C7F33B8CC28B9136B3EBE5F52B9A76817F2F74FDC2F12B459DFF32D5A295BE374B3FE507A0995BCACF1E7B24F4501B29F1E8B4F2A8CB394B3E459A4296F6439BA59EC88305AB045FF40B1DAB4F672F878DE1F9E46B9326CB3E2F3457B83EAD8DEC28DD079AF0E984A69ED882E1CF21036578485DFC2DEBC9CFE82FCE0383B4039D147C4C7E31E315FB57B9093DAA811F4EE4568E32E5625ABE76C5A1AE42A03441DBE766D0EF4DF607406F7D489275E8C5D4470866F9049A4AD5C428B843DEC3702E86E177E4B60181D2B5F099BEBCB25F04C93D087C72436E87A9B3AFCE78FA31E2B892400B5C1071F8AE0F78EF6F7D71859A97C17EC0912D5EA27AFEACE739FCF66F489EC6355A3318F79649881CD6C7E96A881ECC4FF6934C3D10D99F1DFD00592CB037749B025BD4BC2832E206C1407E600FC2170C0BB57E5C7AF0756830C2A6913E2B9C60575CD4A394F2A65C50E40A43CF5EBCA6A8A32335707DDF4633BAC7375DD53E24DF20AF30203B514D3793392E38FA8429B050F58B28CAD0146F385809CC7FAEFF8B71B2BC93D2C6F72E31AE2D07CBB3CB7F43540894E01654EDC71CCF4F361A847EC5B1D23C2D4680E29F0E1F992EDA3AC41ECFE614FC010A2EED1BAD87A7D17468D6FA5356EDB25E9008A9BB328225F85202246816E1A542E1DD746A5FD3E064FAA1248579D31CD3D65F8FFF36F782622402DB328C7850D82D8D8A52B897353A2F8B95624D2D958FC1C3AE6466EACCA2A6A5E6ADD4A582D27E07633CCF697FA02E243A4FBB3DC727B718B5AC0FA6AAB217E241627E69CA46F05ED6B496A739A29EDAEEF76992A507130715BE555C68A7EEAD6E8FF3A378D8F4B7BAFDEE3EDB9EC094440E31BBA717A9C82A117D05EDCA2370003DFABFB2EFB29510466F74E76CECCFC41709FAC4CD8EAA998357170A7A293209EB0BB83DFE5E2F6D73C28D5409C55E95068D647BEC42DB8098F0089EF8A5FC5976BAC421C37DDA6C4227BC1AE5AE229F067515CEA3D794C8D85564AF208AE0FCF836B6C0AF41477F99C8773D9DD1923C5C07E1FD508C7436EA93383797F372EF3103546A5278A4F59614A5D182344F0431D065C35620D63D4D001D7F626993241362E67D1BF41419858EECC2626537D44E2E23619381E96CFA91B3D8054681D298509D9B99E7AA99CF8742E37637B24136F8E1B487E9571E4C24AE5DF307E4C7C62E55C47132AE404B33E5367C6F24D6680BE32D20BC58370145486FD5EACBCF98EB7E7FB6293044067AF11879E91444025FE52E24617269BE192BB71BD9F95356EDBED9DF352AB56A854F9F531889A88689D3F161FE6155C6C1E8011D60A46F59C7D08C477FA652B559A80567076B4EAC29A85D54C66B35D6960DFF75A696CDB17EC9A7B74DC6C3652DAE866E8758170D055C4BF60FA1238448CC9E29160DF50160C4B0DFB36BCA40AF0BC5F7D490E7DBCA49535742EECB90098A0A0FBBBBC7AF25C0CA9BC039DFB555DD8431AF188F7C1D0FF786D627C058A0B9A15F26B58AA2A5992BC8FC5AA14025FF95F294203B45EA081E28F094D0D4AD671C885E67B2E9E800F10048158698D56648F67BFA8CC73DD5AFA15C1E48936B2596DEE34459B484336C20CD77E58BF682479F9AEF2FCDA86E4F3A2FED7046E5A3828A9B3C0DBFFC25FE699F25629A2045A51242E310CB369B730A5E81167758D7FE843261A598E4541B02D0DB4BF5616BA07A440665F7FEA6213114B6B1B38BC033D70E845445DCD18E23D34D3D6F4A52F5F904AC5D8FECA5AF1123658D09613209EE19954174A1AC7A8C7F9EA288BBE5A0705F3CE38F30ED5EE69CF5208D461EFAD51C456507C3729EB338CE15C4C253BE21E81F082B0847C6871CA0FC8B3E80115FE2BB8CD8AFAE69A3C1429D21F149B7446888BB4DCB639819EFEE665B6D6F69E61452B9328B4887A7C04E9949390980A2609A667267035B11BF862C1131533DDAFA518221627E0EE7E4009CD48E4AA9D0753A9AE82AA0257B69D569B4C53F05A75A521B327322C60398DB0947D205D2A33AE51CF2CEA8C9162DD604F8EDBE91F5199D19EFBF9896A46389E7BCBA54B4AA57CBA0D4F9DA117F288133AD01A9A9B2A824D54F74D4172BE2B1E5F0D3DE60C13AA5B668EE6A45397C2E39573EBFABAABA48D1DDB2AB6453FBBAC8DCC05349404889C7DE23A16EAFAC8D5E541457C32CDCE80CBC - -count = 80 -seed = 07CD8F8AB7CD12EA7CC94103B8623D6F0FEA2BAFD2325BF6089DF5351BDBB9A94525C3C6B72D3820F2E4D5F9E7C849F8 -mlen = 2673 -msg = AAFA792BFF719A3B794B2F8198EBD1556889C8C61EE6A51470AC9B274CB162AF44A26E2BA5EA7663C4C78B4B66B322ECACA8F2EBB6A610B51D7C4399F4A64A870C038797CAC80F709CA5C3C9FAFF7D797963E60983B584130C1B99328AADB2D261217CB95A535B8518A78A6D2F6CB8400C2AAA2DAF451391F7B8AB0277A3AF88E1CE6F1D3DBC386CBAFF15308F073D29838692E645F566D4B3DB4186C259BC84606855EA88938CEC4F7211BC9B461E39DFBB9E44CBC273E02D4314A037E0A26D60985EF5A35F069D8B51F86E9B6801CA067AB75565D73581EBBBBD98ECB5AF47509C8729D82EA0B35F0A376EBE6D90108CD61FBD0CEC966C17264F6A87864457F41162FF7210049E6CE2B5354F8F19161E0866D6BC3935815D9267C600DC529521FD092B126EC440D49B8E3A166587657B52AE9E2923644F72876EE94A61D2DB0EF4DAB33ABEC0C47A6A725D4CDABD06D4F6A30BD7C90DB3778C17B7D8CE82A5123B798D8B47C7F3E968C9E9F82A6EB3C2BDD8FC06D282F5CBF3050F6FF71E2EDF7A109F23AB47F427BD75163162C37722BF70A6BBEBEBE8FD9C39152AFEB78C37D718014F739F20BAAD1597B1F9C4E0B59FD82B834D83DAFFC935DE4A3272D7C2454508C07502943E90FDB56128D6E6009ED09CE80A9B60D51AA2E4E162F7F0C362F6886BBCABE29EF6C7F38B742000B9D152FF709082FAFE809C5DC9BCBC6F300B0A7840D0D36F39567D14D8227E7145F7CA670EFE917E0F18B0570DA3E05DDE56883FF12BC0C76C2A1E9FEFFBB728D991769B7D0B0D34853C76FC0655AE200501C28755F57934BB9F46A3C6AB1DD8E0161C698133F4F2D7CAF3392576B4BD2B6F8735D80BCF60656E132442BB7FCFDAE160A2DFE3F3FB8209B5C933201785A7E8206096B84A222A68E62501846273F6A9145820F87F450D12C64FF79A843E897C8394AD54AAF4F3B886FB00A6C37B2EFD0F6D4DD639C9989E7CA30E4F12EEF440946B61D7A28904E1D74009B6D1AEDF2FDA8B5991CB37795A8EE51BBDAAEA34A4C7040944761B9B4B4C12F455C536992A0852F7F07A9AEDA8E522591CB4831B0C79FA977AB6BC49C9730186855986035D2C6E5A6D93DA43E8825753721978AAEB433CE2F2A7D67C1FFEBFEA6F6059474D3022817A7329D9DD0E4A292302E4A57174B9C5346E4B6D75D65882CA7339A48C6E7AF776A8515014A20E4390F6B4F4A19990FA725F5A69B9C3BD4E8BBAEAE49979AC19600A3CEC6DE154985E236C3D0684269974BFC82301AC7196675F618182D7CF15EE5CE3B7ABEE0DEEA5C72F54CAFEF203D556B31327089A0C0DE94F74458CFECB481ADFE3CBB5DA422BD3626B00C4572B4C2BD7584ACD9129A76C616AAE51F944BECC4682AACAFB8E3BB1A42A6A8E5FE7BDEB43305A34A98308EF2D49EDE4F41361446A9AE4DFC1EE13D12821BE0B01E55B865B563633E5A19DFB6425CB60159C147B18A6419F5085C5D0882656ED533EEDF97674D0BABB6CF32F696DEC0F9921CB3DC9E6021FA198D554B1D83C42A0BF214FE4C0431547384F45AED9190CBCF98ED8278E8A03D551FA284C8A26218F0B0B58D99879DB98449CC99B6B399DDDAD9924E6A7EB20A0F1FDAD2F8138BDC7B445BC01503C509066B1603CDA76FE41727AB5E027DCB15032E8F66BFA84544D22C501AA6F62B02C0F8764387163CCADBF1ED7238E7F16C80E6C37AFEC2E10FFB95AB0A39784F9FCCD8AE263758ABE392727E9AD442A44738D77CB61A6B1540ADE751130489015AE5917C927232EED27BBF88481F3CA0C5ED2C31DFA943B2EAD4A8C80B4946E3C138A61BAF43A72C7A25E16874CBAE254D3F14C154F7C60CCF665B566799A01E0F769B60F73C17C840E0018C6FBC10EEDA3E35A77586B3A5936B363B2D5CB25C78A3E3AABBB84F1E64DF47F97AE1645650FE1751A724EA9BF80744D0F33DA6F313A3CC17D8F261585B62A75C167126D899219A26210DC55AB6DB2B94E6993849B4986F988EFB07478D6621CBF4B8ED772E61B0246A5582242FA20339B2D6CB89BA1B9210A318EB4697FD21EFCFD230DE9680514A442A13B29D8CB2627A6970BB97BF09C79C6ED7A27247662B25F39C8D675B0747F1A6D9EBBF7CFA7BC51A7EA3A7307EA4FA2A463BF53A645FE701FBF26628731CBC18636567AE633A49E59F6F049447803FA3D4F1F79F38026DE9B07D8610C9F01BEFB7054AA46E523E001C1EC3A4E7084DE0CCE596DC63D9C1F1DC03F35F9B1918E62ACB2640102E1D520E900969D53E83D2DBDDC80D1DC54BEE99531FAA5A8D2DBF8346C7ED123587353DD63823453DE350545C176446845BB3522A862F5D675419DA901CF7D2D1F7050ABFA3237D42753203BE251B0364379232D2D9D8642D52A60F6F4CB09EF29FA1E6069F97A1175F8447FE98A813CC182E33FFD8B8CAD93BF32A60F1A9E63A79A7F7FB9162783B89BB57F3E73155CED1D0084D5BA967F76C89C61C1A3E944F3B6F78D6CD3D1139A315C5276493481F3FFF9B6A6B40C920EEED9EFC74108C6BBA5A15DA736680A23DB5672C5A32ABDA24B49F2011F44FA8FF9C73609EC195025F0456D753C848DC6296920FC32DDE2174D37BFBCB86CF618AA0D486EE46C5E1EA14A3BAE4952AF5D4837F9B8122A19D1E59B909ACEBA6C849C8B452CD6CEF877A65FD83E6D0C6EE35886688F1D877612CB8E671D83216A1F76693D6A4D6A2EC13EB6CA2005328B3C91F51B352A707EF8180F320D6E1685C1EF4D87E3CB77FA549BC12727E59C11BDF8A9631CC272998253028CECEE8A2914182B90F586D80E7ECE370979BDE683F37123090012AB9243A4C145D6349C2791DC44E54956C5E9B59FAD017D3EA27D85B48A896671A0AC14A73B5AB9145D8BA6AEBF9EA25AC2E8E2C4D16C5009A83D0E84CEB80E95DF2CEC4CBEFC7F5B90A84D408E8C4855F9AA2987D9FC9D8A451F32B367BB1DE5271ED35EA153B5D400A6D8050EE82F519BD930245A96C9727FD24D8B94DC53D4B4F00D03172CD6B7F2BE163B6D16FD6247B01988A6EE6CE7BFEAFF78E983B8DDFBA4242730E52B57876E3719D1F9F6CBCC81620F848D23C31E3FFF7EBF2AFE5011E6466B1889E7EF6281FAF8B18A012CEB96796FCA9B28E78335DFCB85BBEAFAEBB0FA75EE2D0D391CA97E05F0FE43475135B13613206A0D88438F17EC8E604B007AFDCB9FA1378B7CB96675E0B19DC6FB02508E05A7FDAAF09297A3884AA051B6389A52F921F8FF31970FB082DF554226C2613B80CC1ADFF770024D6BF011C0F028A012597AE56F36EB6B3E864D79639810B8BA7258B18192B5CAA80DEA4B140D3C6F1D707ACD2256D676AE90980BA80E10B44109211ABA830EE96E1BBD248315C804D391A86AB7D4B3A4A37FED90D9867DA4B93FC32E79403E5D78AE99AF1CD2ACCE65D4F3384D9CEAB71B1E93B99704C64CAF17B999234361E378B9362D14BE3FD9E6C268013CB1FA2EA8361749D635C0429F796EB15A685E31DFE7A76AE870EBA120331AC830F8C486F6C0C4F07B658EBB9274A463E0EEA101481DD6B58835A303ACE802AE79EBEF51ADD98A67B7FF7968815ACF4504B9D360F7C0120A00ABA1FC558E6CBD8324EC35E0985294563A8D7ECCCCD9E3D1557A09885770836ECCC7AEE0F18B81E30F85D695440B5BCE29945CBF60FF402B281942D38EA33A4B03E9FCBBBEFAAC2C455E8A03FF3F35154132C538EA16F0605EFB788C3CA8435F6D595F776433585094ABC75BA581EC59AF701F66DD6091623E4676D167 -pk = 3FAC9EBA2C25A42ED51CC80F5FED8E83AB72D03AAB947FBDA13BA8B3444DE12AB96E2E87A15AA8002D3C6094C52910CE222715D280380363E01D9F06E6A13D0D -sk = 3FAC9EBA2C25A42ED51CC80F5FED8E83AB72D03AAB947FBDA13BA8B3444DE12AB96E2E87A15AA8002D3C6094C52910CE222715D280380363E01D9F06E6A13D0D0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006AC3F3C8094803908FA6C885BAD4315970387756205D49F3D3D239C1DBCBE6BC393E56E4E0D112065ACB36B5B20BFFFFFFFFFFFFFFFFDD4D9ABA1F51904283F8D275EDDD95C9DE3190006C65D078922FF7CC81A3CCB65EFD1CEA2F2FCE72B6ACC762B287FEFFFFFFFFFFFFFF63FB436AF90A2F1F9AED42CE6A72520DD309A0047F728C37D16DE09AC8FF0D0000000000000000000000000000000000000000000000F6CBA9ABDE0916E7998612B3434C0D436A2DBB9F0E993FABB30607E98A90FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6DB27A30C42AF53AEA973516BD5E4DDF2FD4CBE15F62244335C0DF411805080B7C95227D39BEE6B4E61C36DBEE96421927CB26C45F3BB9ABCA7679522A9AAD04C95C4AF670219E0A2DF8F2B7550EFD7F20F3020801D3F0FB0E54C6322EEC7B3325BCE9289A42E0DDC0C2F131C6D06CDE28DE066BCD8B8B2EA6D9DE9A67C43E327A6F6F43605AA7FE74A0C53D1A21F7F141AAEAD7DAF8B6672054D6F6E291A01595D4D28427350EE9E7E2D3FBFBC4EAB1BF28FD263103E1EAD58E0D042219351CEA863C088224F46EF813700C6A3DC47209332ABACB781A4166265C5E60367105802FD9085A923ED6BBCB8CBB6F5711C16BCC4241FBF30F3400F7A3F0F1852A2C358CECEA4EFB98EDCB21431C91739B25C5783A1C7FB43F6E6CF623FCAF5B9D01BD73A3658BA22DE369B324487C53BABB7E256DBDB43FDEB702C5C2B054846C1C5F4F3D12AD6345950BCF1AA87E2A42D860F9B6A85EF16DF6BECBDB92FF9F9615F11813E1EEBDDE7737523F9D6D34C0A136D837DFC9D7B2B39DF6BCD3D9B9440E5664E80C326899915B3B1E8BE942FFAFD3C274539AF384F14F52F672DCA087250F817A338716674DF5AE57D47A366AA11FAE4D90D015FA36CCA021F0B46D8414 -smlen = 2850 -sm = 02BF9E0A63822E26CC03C3965FA7D1C0655B6B06FF6800019B0E1F3D20073FCE7F7ECF25A7D3460517494B00746FB53BD9076D85301E6D1ECDF6D805E7B7566794E64EE82D0625A10F10F286986178073D27EEC636534AE8240485D78A8890762525250299B08590D2E68CC26F00B64669CA0C7E8C4BE4026C14FD00A004FDBF0D03868B8E70A84F6D47A90401C3E86E3D45C0CA1D4D6B58753A5B22730A008EA3AEFFF7C76EFB7C03F52FDD8FFCAE3F01AAFA792BFF719A3B794B2F8198EBD1556889C8C61EE6A51470AC9B274CB162AF44A26E2BA5EA7663C4C78B4B66B322ECACA8F2EBB6A610B51D7C4399F4A64A870C038797CAC80F709CA5C3C9FAFF7D797963E60983B584130C1B99328AADB2D261217CB95A535B8518A78A6D2F6CB8400C2AAA2DAF451391F7B8AB0277A3AF88E1CE6F1D3DBC386CBAFF15308F073D29838692E645F566D4B3DB4186C259BC84606855EA88938CEC4F7211BC9B461E39DFBB9E44CBC273E02D4314A037E0A26D60985EF5A35F069D8B51F86E9B6801CA067AB75565D73581EBBBBD98ECB5AF47509C8729D82EA0B35F0A376EBE6D90108CD61FBD0CEC966C17264F6A87864457F41162FF7210049E6CE2B5354F8F19161E0866D6BC3935815D9267C600DC529521FD092B126EC440D49B8E3A166587657B52AE9E2923644F72876EE94A61D2DB0EF4DAB33ABEC0C47A6A725D4CDABD06D4F6A30BD7C90DB3778C17B7D8CE82A5123B798D8B47C7F3E968C9E9F82A6EB3C2BDD8FC06D282F5CBF3050F6FF71E2EDF7A109F23AB47F427BD75163162C37722BF70A6BBEBEBE8FD9C39152AFEB78C37D718014F739F20BAAD1597B1F9C4E0B59FD82B834D83DAFFC935DE4A3272D7C2454508C07502943E90FDB56128D6E6009ED09CE80A9B60D51AA2E4E162F7F0C362F6886BBCABE29EF6C7F38B742000B9D152FF709082FAFE809C5DC9BCBC6F300B0A7840D0D36F39567D14D8227E7145F7CA670EFE917E0F18B0570DA3E05DDE56883FF12BC0C76C2A1E9FEFFBB728D991769B7D0B0D34853C76FC0655AE200501C28755F57934BB9F46A3C6AB1DD8E0161C698133F4F2D7CAF3392576B4BD2B6F8735D80BCF60656E132442BB7FCFDAE160A2DFE3F3FB8209B5C933201785A7E8206096B84A222A68E62501846273F6A9145820F87F450D12C64FF79A843E897C8394AD54AAF4F3B886FB00A6C37B2EFD0F6D4DD639C9989E7CA30E4F12EEF440946B61D7A28904E1D74009B6D1AEDF2FDA8B5991CB37795A8EE51BBDAAEA34A4C7040944761B9B4B4C12F455C536992A0852F7F07A9AEDA8E522591CB4831B0C79FA977AB6BC49C9730186855986035D2C6E5A6D93DA43E8825753721978AAEB433CE2F2A7D67C1FFEBFEA6F6059474D3022817A7329D9DD0E4A292302E4A57174B9C5346E4B6D75D65882CA7339A48C6E7AF776A8515014A20E4390F6B4F4A19990FA725F5A69B9C3BD4E8BBAEAE49979AC19600A3CEC6DE154985E236C3D0684269974BFC82301AC7196675F618182D7CF15EE5CE3B7ABEE0DEEA5C72F54CAFEF203D556B31327089A0C0DE94F74458CFECB481ADFE3CBB5DA422BD3626B00C4572B4C2BD7584ACD9129A76C616AAE51F944BECC4682AACAFB8E3BB1A42A6A8E5FE7BDEB43305A34A98308EF2D49EDE4F41361446A9AE4DFC1EE13D12821BE0B01E55B865B563633E5A19DFB6425CB60159C147B18A6419F5085C5D0882656ED533EEDF97674D0BABB6CF32F696DEC0F9921CB3DC9E6021FA198D554B1D83C42A0BF214FE4C0431547384F45AED9190CBCF98ED8278E8A03D551FA284C8A26218F0B0B58D99879DB98449CC99B6B399DDDAD9924E6A7EB20A0F1FDAD2F8138BDC7B445BC01503C509066B1603CDA76FE41727AB5E027DCB15032E8F66BFA84544D22C501AA6F62B02C0F8764387163CCADBF1ED7238E7F16C80E6C37AFEC2E10FFB95AB0A39784F9FCCD8AE263758ABE392727E9AD442A44738D77CB61A6B1540ADE751130489015AE5917C927232EED27BBF88481F3CA0C5ED2C31DFA943B2EAD4A8C80B4946E3C138A61BAF43A72C7A25E16874CBAE254D3F14C154F7C60CCF665B566799A01E0F769B60F73C17C840E0018C6FBC10EEDA3E35A77586B3A5936B363B2D5CB25C78A3E3AABBB84F1E64DF47F97AE1645650FE1751A724EA9BF80744D0F33DA6F313A3CC17D8F261585B62A75C167126D899219A26210DC55AB6DB2B94E6993849B4986F988EFB07478D6621CBF4B8ED772E61B0246A5582242FA20339B2D6CB89BA1B9210A318EB4697FD21EFCFD230DE9680514A442A13B29D8CB2627A6970BB97BF09C79C6ED7A27247662B25F39C8D675B0747F1A6D9EBBF7CFA7BC51A7EA3A7307EA4FA2A463BF53A645FE701FBF26628731CBC18636567AE633A49E59F6F049447803FA3D4F1F79F38026DE9B07D8610C9F01BEFB7054AA46E523E001C1EC3A4E7084DE0CCE596DC63D9C1F1DC03F35F9B1918E62ACB2640102E1D520E900969D53E83D2DBDDC80D1DC54BEE99531FAA5A8D2DBF8346C7ED123587353DD63823453DE350545C176446845BB3522A862F5D675419DA901CF7D2D1F7050ABFA3237D42753203BE251B0364379232D2D9D8642D52A60F6F4CB09EF29FA1E6069F97A1175F8447FE98A813CC182E33FFD8B8CAD93BF32A60F1A9E63A79A7F7FB9162783B89BB57F3E73155CED1D0084D5BA967F76C89C61C1A3E944F3B6F78D6CD3D1139A315C5276493481F3FFF9B6A6B40C920EEED9EFC74108C6BBA5A15DA736680A23DB5672C5A32ABDA24B49F2011F44FA8FF9C73609EC195025F0456D753C848DC6296920FC32DDE2174D37BFBCB86CF618AA0D486EE46C5E1EA14A3BAE4952AF5D4837F9B8122A19D1E59B909ACEBA6C849C8B452CD6CEF877A65FD83E6D0C6EE35886688F1D877612CB8E671D83216A1F76693D6A4D6A2EC13EB6CA2005328B3C91F51B352A707EF8180F320D6E1685C1EF4D87E3CB77FA549BC12727E59C11BDF8A9631CC272998253028CECEE8A2914182B90F586D80E7ECE370979BDE683F37123090012AB9243A4C145D6349C2791DC44E54956C5E9B59FAD017D3EA27D85B48A896671A0AC14A73B5AB9145D8BA6AEBF9EA25AC2E8E2C4D16C5009A83D0E84CEB80E95DF2CEC4CBEFC7F5B90A84D408E8C4855F9AA2987D9FC9D8A451F32B367BB1DE5271ED35EA153B5D400A6D8050EE82F519BD930245A96C9727FD24D8B94DC53D4B4F00D03172CD6B7F2BE163B6D16FD6247B01988A6EE6CE7BFEAFF78E983B8DDFBA4242730E52B57876E3719D1F9F6CBCC81620F848D23C31E3FFF7EBF2AFE5011E6466B1889E7EF6281FAF8B18A012CEB96796FCA9B28E78335DFCB85BBEAFAEBB0FA75EE2D0D391CA97E05F0FE43475135B13613206A0D88438F17EC8E604B007AFDCB9FA1378B7CB96675E0B19DC6FB02508E05A7FDAAF09297A3884AA051B6389A52F921F8FF31970FB082DF554226C2613B80CC1ADFF770024D6BF011C0F028A012597AE56F36EB6B3E864D79639810B8BA7258B18192B5CAA80DEA4B140D3C6F1D707ACD2256D676AE90980BA80E10B44109211ABA830EE96E1BBD248315C804D391A86AB7D4B3A4A37FED90D9867DA4B93FC32E79403E5D78AE99AF1CD2ACCE65D4F3384D9CEAB71B1E93B99704C64CAF17B999234361E378B9362D14BE3FD9E6C268013CB1FA2EA8361749D635C0429F796EB15A685E31DFE7A76AE870EBA120331AC830F8C486F6C0C4F07B658EBB9274A463E0EEA101481DD6B58835A303ACE802AE79EBEF51ADD98A67B7FF7968815ACF4504B9D360F7C0120A00ABA1FC558E6CBD8324EC35E0985294563A8D7ECCCCD9E3D1557A09885770836ECCC7AEE0F18B81E30F85D695440B5BCE29945CBF60FF402B281942D38EA33A4B03E9FCBBBEFAAC2C455E8A03FF3F35154132C538EA16F0605EFB788C3CA8435F6D595F776433585094ABC75BA581EC59AF701F66DD6091623E4676D167 - -count = 81 -seed = 3D598F7C498D8A1095C40945975380554BEF6142578638A7627E2C0A21C59C579F8E8CDA309348FC54C764C899FB93E9 -mlen = 2706 -msg = 63EC08B711DDF5C66036A13F574BB7BE76445A1D1F83C7732B9F4C25FB9E799D4AFA55817BCB39B974AF92F3730767CE7D863B6A3406450DCBC5E0145D10B7D532DA6E80196157C38D1B6D3C173F74D67AD8DF24ECAD4D9B59921418863A38270B982C4392225EDD1845AED2199E2C38B36C7E0E5D2F3CC7F6803926D977C59ECDAC67CA290658E72BAD633358FCDDE2A4B9C40169A0C7CCCFDD93E4DA3C3838E9308533BD468A9128C5A141C4842840E45BC8E4610A7C5E7535834C5EC73312A50197C76AE984B3521883F549BE04E27D97580E6D85D0EE84CD0B8C65BFB1AA005C607DE82DA70021F8F90B7912C67DC5657E1882CFA6DA3DE1BA4ED823789C052649DEBC9085C74528162243133A6AE5C1C6BCA3F730525B167D816485E40C208AFFA8706E3D74631EB4413032730A7647548B77579323EB03D36C2EC37D2389D4A17305F607C78F3073A2F4B4395BBC94AF163ACBE3C990306BA3F89AF9AFFE785C3F6D102FB2BD55F0C1044034D6A871293B31A1B38E383CB926BAF3AB4B5F79A47E9FA7B77BCD58AA35A7F16DDD11FF642069A8A327DFA800049BABAAB4AFBEEC9FA98ADB9796FBEE925BB70EE9E96540436E1473E3AE4C56D7099D8DBDDE755A7E101BCCEB596B9415F52374C8A3A73EC66B229DFD8CD7EE7D2CF1C5E7F490C7D9381D9321B15F84F640017851ECED1DC80D32DA3A0A57ADC3EF37E021031866E278C7D51FF5CA8E9ECEA1082423B41D772C5ADC61A8C71C3D4CAAAA3433928D7931EE715875BDE2BFACAA0A7F799B45241C21BD2ECE4A5944FB6890BF24908DE58DD3C76173373254A36B0B2AC7D67926948CC0136DD9A5079D776C297FB6A585C290D5DAE1C45E91153299EEDB731E527F0F62E83C1E93C75FC74F9C7E63311562B0A55459A0D41E034C3AF637EB29BC789E5920DAADF265F42F2707DD1AD490B5F8A8D24A9968BFF11A0C364A779EC385A9A33EDB9CFC7DBC672BA60CE5F421B40634270B982D619F8E7960D32E1B8A76CECD13A3B0214DD34214CB5BB7FD530058D5DE1FB9E4E88ADCA05926CE1F5597100F55DCBF64D47FC177FF87C4BD9F6ED7670FA7B7D339EDCCE6FC1EAE069E0C303138689DDFD23396C145B79AFCF68125989C8477BFC318CDBD69D1AA6D3EE41F4B1F9BE4BE9FA58A072412078CB9196556EE56FB7B2A2761DD04120FCD9AE9736F599C8B96BF8F964B305530A6DF1F94874F36F07962F87ACC0B285EDA64D2E4857E26BED40E9A5DC0327F1D91259292C608D6C6D59804DC23A34D1F9F1B69331D68771E41542FC5D669CBC3CD7F8310F87E8FE8F6201E57B475DE2318EA6EF9F7D32A728A44334CC9DF28DF77038C37CBA62EA8CC5EE80E571879AD111F35B6A154FDF8D40FC93360D547D02F0743A37EBC4AF178C6CE36C92CE6B80B6350202D2978621684A19AFE1474155BB962014587B1F5A477092F42BC446D7811C0EB439A6829E538077ABBBF03F515F1E6AC018EFB05AF79069C2569D2CD7140C4B1B47886064DAC695D59FDE2D8FDDB35318D33EDAD94AD4FD988095B1156FD59551F0658EE666186369BFA84E30672E4659BFBF7963C377F0039E08DE2C2D9803FC12D97B5E67CE9536AF12DAEB3B9903D8D95F336FF53286284BFE8D7AD13EC21C2A9BA93C9A97BD7F6148DE7C8CB41CA75A9ECC8F9CC68D888FAF6B3E75376B5B16F41E7E6B76A686EB365365E2074FB1D7EFB1B285A2357B020FD3E47B89943FBC1596F3FA8289AD844386A691F33DAED4B7A6A6729526160F2D32BA7F68AE6678564FCA05BD811F208A8FA62F6731F23D46027008246FD4BF3C454A39EE225245E74DA5910E7937B36661548A55A2270A9D27114DDC94DD9B9D4122289DF0A5700222A977F15FD8E36AFA1C4870BD3CE9B658E2D83882AAC5F3DB814346240FF8C8FBA3F36E52AC9B441C76B6F104A0931BC45E202ADDCACCFB93A486A7734A6D82B9F6CA911448F988626846D413D987C5AC860FCC0D5F734269AEF88D41A055794DCE832BABB7E306F622E5EAEFDBE1CF195E320A1ACEB4834B3E70061EC2D624C12EB35B16E5AAE73053A3290D4BB1F51FFDF48C1A7218D365DB7FEC15BF0F710954CDEC54917600014BDE3A901DAB1DEC0844D7FF148EDED9788CC85C0CFF26E5895D91C56BA6950C0BA8FC6C773AB4A6091A5DE3AC335DDC2110EB0144FD89B3D815EF4A26F718C1ACB5723AF1DA5515442A03CFB9D90623FB21D78DAF441000E285E9E7C235C0F31E258E6B3FEAC048DB652B83E07848D2E9357649372B1A55975B2EC7FCFED19D0B6613BFDBB4B5B01A9AA3128AE137BDC1D8FFC3A38B597578042CF183BA8383C289C3D92F6B70AA9B3364E9FC5D43F3CD3F310D229912E91D5806C2A11E0BDD208A2AF438BE77B43680E2DE67918FD414338A763910E1316965BF96BBF7DF639266D075E90EE9C073011F6783750764FBE4906ECDD94EE9FB7E4AEDB23EE88EBFB018C44FC8BAFC66E6B454A3D0E332C7A6B34C2E8D1D26416FF43D768CC36CA9D3168355F1A281A6B2EAAEAC7B64AABBAD2156A1D781A78A896248C56F3491A5DDA8C22C231AA7AE14BD558F66E6280FA65F20B246D815BFF1D3C6CEE6DF9B4AA7F750307A7BF73850E6BCD22CA0AD74B4AFC13CD4AA2FB7E7B588ADB3A46A23EC88A34F13214B261A283AE8FBCE8007C6EF6BE255C33218AEBECD3EC27EDAFD252994B70BD67407620D26E8567F4C7F6D636803B6A27EACC3B853706A8D57ADBF7F7E142FF149C35119A6172D5884EDE7C71E6C34D1B485A684DD56C9D670576B75CACB870A68EA7FF2BB461D9E2FDBF500B2F200110265A3CF24370A3F480DA66F98FB5327B4CD796EAF0E559A5519F3C643B59E3B89D05D2A9F9DA6732CDC2996408B7FAB5A734310FCD73FA3FA5CACAF31AB04EC0B9734407C6DC575350212239AC9092DA5812137BFC40F7735BFDF9827F768FC0363FC8C5739C7DF828075EA2BBE6321D5A8EA2EB7E397C3D58A953C7F0BAA69A96AC8110B125EE2E9701F43EEB87FDF58A6E6266BE1136437599E26E8E6E853DBB6ED9DF3931C5F402FD09B7E203AB36EAA6EEAE72E908BD2B9CFD379BC9B407F0C882807BBD2E91F920EB24137002A48F1AAA0CBDF89FDE5C51079F1D8CF7A014207F1B40773321AD952D77CE18EC7B48F2CA054E65420C1132AB67C832EE22FFD8672803CCE3DE7E9FD0690E55FA1AF5F11611E3E2C71CED55E3E347F4CBEB9C93BEC2B98E48495585392471AF0AE589257ED8D01792112C798BCA5107030F207CE567594B8433490D8FF1811F21B03A42AD0678927183321355E3D6908DC1125CDCE038CD0469D72458B6CC5E67EB0D78C20819C6F3C4518B15CC63754FF8679915E329DD46FEAEFDA5249ED7E754E7BD55C75CB764B6CC36BC06267B2479CAFBB3F0BAE32A93558190B65C85DCDC080CD56D51D4105C5B0717691D4DB1893EF8AD550F55855B4123A38D18FD67B588A3A4C2A6604E874D721359352B235C17AB1DA2758712AF8179FF433211B93078735F909F985F557D0DE52CB9203DDC67BF9DC8632ACD8D4F90196AF6BD2E79834371C5E9FDF5992ADB04AEA186AF36F56271F763ACFFBF94DF4B0512CA6B7CA8FF486504E565BDA367E044FCD0F25FBC2A6C720867F95BFD92109780D2E6DD60CE90A4CA8EEB8C4CAB289DCF99E687B017B37695C3B99B4FE97D7E5D52BB9813C04D03C9AD71770FE0986C7F3A3FFD3A261AC771DE88C7ACDEF253E5CE2B50BC5C576D132B68CCC694BA883770B80F5ED7D527CEE816527F69CA2C101747A0088879C3663037DB5B -pk = D6C7906687488E70D5704A0789692C20DF07032DA52EFB15E12ADEA8E0970D204C7D08AF01ADE16B4C14B5BE078DC8091D63FEA7FB41933D4DC8BCD10C460427 -sk = D6C7906687488E70D5704A0789692C20DF07032DA52EFB15E12ADEA8E0970D204C7D08AF01ADE16B4C14B5BE078DC8091D63FEA7FB41933D4DC8BCD10C46042702000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015B18137A5ABF6E51BC89C474E1F118FB307997926702527A2FD5BF109A5E3723AE02A9EFD43DBAFF7CD8F67BAF703000000000000008E6F80D0976E24D89628AC5206D28436B9BB8651B3BA379FA255810634ADED863E1D981EB0D159B1B6893F7704E7FAFFFFFFFFFFFFFFDE72A66B55E90B26D51EBCF57BD01DD34A40485466B4622EFEDA68578279FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4BE8EF3C31080B9DBCD4BF30524F416DC041452D7CEB903DDFB4F1D3FB880500000000000000000000000000000000000000000000004AA018CE6A608DFB3037748B3D25A4769EF983B28160E51463D81B0C11CB90319E5AD5AB3614C73EB086FCD04E67F6DAE4284D97F2212DA793BDDB975704FD044DB9BFBD090E1903E3A5EFE31851355D2B0BCE46BBDC3EEE5696699588647D02018E1F5A3C58BA94B83E15BBA7C4C4BD2CE665EC6DA894A49A62345B88277000180AD93DDB6A90E31981431ED70FA8FC847E423C89DFA1AB692A56FF8E07331ACBDC9CB6EF8B2F275D4EA5BD8516FC86088F4EB68D3EBCE6515EF3EE871A0D0EBFE1F0DED11E26C2958FA43A80D910C87E6060AD3CB43E5BA642C19271A0E70CAAA95E31C9174DE120169F8455230AC9E5393613CFDF1EEB37808CA07350BB05B8FE98238820EC1BE17EDC7074D1796DDA065338D01287F3CA3628E4801CAB0B9702396BD341537A2675ACE76E28D0A88C84EE2D0C11837828A38B1840BF0B0637A8BDA449F4809E1EFEBF087AACA4F4F492BB6358849CA55857522A0DBC630A4265F4A0C2C370A61DF5354F60FD009B04FF0B919678FDC1D336BEB42230380B413D17C21596FD4DFE023B21A2616E442A1FB0B185E93E61B3884C216507D8238081BACA596EC0DC3CAA18CB862829006EAAFC352FE5F12228CBADDDD9952829 -smlen = 2883 -sm = EB688ABE2E2179773902DC347260FD7CBFE41905E36F8E996AE387938A07FC9CBCDC724A8BE07907476E4EC293C340714004990B6D31200C14DF370213FA6ED2D35CA01467011BF00B94DA3D6786E7073ED8CDC31D8E4787AE019C3E60CB5F111870CE03391F5077ED0A4CDCBF0244D7712967E3931D8606D2323A4DC02CE5ECC3053A26D297522CAADF620101F96618B86051FBB4B2EB8D5BC60AE2F30B025C0774A207BD4E52F305D80E48E17522120063EC08B711DDF5C66036A13F574BB7BE76445A1D1F83C7732B9F4C25FB9E799D4AFA55817BCB39B974AF92F3730767CE7D863B6A3406450DCBC5E0145D10B7D532DA6E80196157C38D1B6D3C173F74D67AD8DF24ECAD4D9B59921418863A38270B982C4392225EDD1845AED2199E2C38B36C7E0E5D2F3CC7F6803926D977C59ECDAC67CA290658E72BAD633358FCDDE2A4B9C40169A0C7CCCFDD93E4DA3C3838E9308533BD468A9128C5A141C4842840E45BC8E4610A7C5E7535834C5EC73312A50197C76AE984B3521883F549BE04E27D97580E6D85D0EE84CD0B8C65BFB1AA005C607DE82DA70021F8F90B7912C67DC5657E1882CFA6DA3DE1BA4ED823789C052649DEBC9085C74528162243133A6AE5C1C6BCA3F730525B167D816485E40C208AFFA8706E3D74631EB4413032730A7647548B77579323EB03D36C2EC37D2389D4A17305F607C78F3073A2F4B4395BBC94AF163ACBE3C990306BA3F89AF9AFFE785C3F6D102FB2BD55F0C1044034D6A871293B31A1B38E383CB926BAF3AB4B5F79A47E9FA7B77BCD58AA35A7F16DDD11FF642069A8A327DFA800049BABAAB4AFBEEC9FA98ADB9796FBEE925BB70EE9E96540436E1473E3AE4C56D7099D8DBDDE755A7E101BCCEB596B9415F52374C8A3A73EC66B229DFD8CD7EE7D2CF1C5E7F490C7D9381D9321B15F84F640017851ECED1DC80D32DA3A0A57ADC3EF37E021031866E278C7D51FF5CA8E9ECEA1082423B41D772C5ADC61A8C71C3D4CAAAA3433928D7931EE715875BDE2BFACAA0A7F799B45241C21BD2ECE4A5944FB6890BF24908DE58DD3C76173373254A36B0B2AC7D67926948CC0136DD9A5079D776C297FB6A585C290D5DAE1C45E91153299EEDB731E527F0F62E83C1E93C75FC74F9C7E63311562B0A55459A0D41E034C3AF637EB29BC789E5920DAADF265F42F2707DD1AD490B5F8A8D24A9968BFF11A0C364A779EC385A9A33EDB9CFC7DBC672BA60CE5F421B40634270B982D619F8E7960D32E1B8A76CECD13A3B0214DD34214CB5BB7FD530058D5DE1FB9E4E88ADCA05926CE1F5597100F55DCBF64D47FC177FF87C4BD9F6ED7670FA7B7D339EDCCE6FC1EAE069E0C303138689DDFD23396C145B79AFCF68125989C8477BFC318CDBD69D1AA6D3EE41F4B1F9BE4BE9FA58A072412078CB9196556EE56FB7B2A2761DD04120FCD9AE9736F599C8B96BF8F964B305530A6DF1F94874F36F07962F87ACC0B285EDA64D2E4857E26BED40E9A5DC0327F1D91259292C608D6C6D59804DC23A34D1F9F1B69331D68771E41542FC5D669CBC3CD7F8310F87E8FE8F6201E57B475DE2318EA6EF9F7D32A728A44334CC9DF28DF77038C37CBA62EA8CC5EE80E571879AD111F35B6A154FDF8D40FC93360D547D02F0743A37EBC4AF178C6CE36C92CE6B80B6350202D2978621684A19AFE1474155BB962014587B1F5A477092F42BC446D7811C0EB439A6829E538077ABBBF03F515F1E6AC018EFB05AF79069C2569D2CD7140C4B1B47886064DAC695D59FDE2D8FDDB35318D33EDAD94AD4FD988095B1156FD59551F0658EE666186369BFA84E30672E4659BFBF7963C377F0039E08DE2C2D9803FC12D97B5E67CE9536AF12DAEB3B9903D8D95F336FF53286284BFE8D7AD13EC21C2A9BA93C9A97BD7F6148DE7C8CB41CA75A9ECC8F9CC68D888FAF6B3E75376B5B16F41E7E6B76A686EB365365E2074FB1D7EFB1B285A2357B020FD3E47B89943FBC1596F3FA8289AD844386A691F33DAED4B7A6A6729526160F2D32BA7F68AE6678564FCA05BD811F208A8FA62F6731F23D46027008246FD4BF3C454A39EE225245E74DA5910E7937B36661548A55A2270A9D27114DDC94DD9B9D4122289DF0A5700222A977F15FD8E36AFA1C4870BD3CE9B658E2D83882AAC5F3DB814346240FF8C8FBA3F36E52AC9B441C76B6F104A0931BC45E202ADDCACCFB93A486A7734A6D82B9F6CA911448F988626846D413D987C5AC860FCC0D5F734269AEF88D41A055794DCE832BABB7E306F622E5EAEFDBE1CF195E320A1ACEB4834B3E70061EC2D624C12EB35B16E5AAE73053A3290D4BB1F51FFDF48C1A7218D365DB7FEC15BF0F710954CDEC54917600014BDE3A901DAB1DEC0844D7FF148EDED9788CC85C0CFF26E5895D91C56BA6950C0BA8FC6C773AB4A6091A5DE3AC335DDC2110EB0144FD89B3D815EF4A26F718C1ACB5723AF1DA5515442A03CFB9D90623FB21D78DAF441000E285E9E7C235C0F31E258E6B3FEAC048DB652B83E07848D2E9357649372B1A55975B2EC7FCFED19D0B6613BFDBB4B5B01A9AA3128AE137BDC1D8FFC3A38B597578042CF183BA8383C289C3D92F6B70AA9B3364E9FC5D43F3CD3F310D229912E91D5806C2A11E0BDD208A2AF438BE77B43680E2DE67918FD414338A763910E1316965BF96BBF7DF639266D075E90EE9C073011F6783750764FBE4906ECDD94EE9FB7E4AEDB23EE88EBFB018C44FC8BAFC66E6B454A3D0E332C7A6B34C2E8D1D26416FF43D768CC36CA9D3168355F1A281A6B2EAAEAC7B64AABBAD2156A1D781A78A896248C56F3491A5DDA8C22C231AA7AE14BD558F66E6280FA65F20B246D815BFF1D3C6CEE6DF9B4AA7F750307A7BF73850E6BCD22CA0AD74B4AFC13CD4AA2FB7E7B588ADB3A46A23EC88A34F13214B261A283AE8FBCE8007C6EF6BE255C33218AEBECD3EC27EDAFD252994B70BD67407620D26E8567F4C7F6D636803B6A27EACC3B853706A8D57ADBF7F7E142FF149C35119A6172D5884EDE7C71E6C34D1B485A684DD56C9D670576B75CACB870A68EA7FF2BB461D9E2FDBF500B2F200110265A3CF24370A3F480DA66F98FB5327B4CD796EAF0E559A5519F3C643B59E3B89D05D2A9F9DA6732CDC2996408B7FAB5A734310FCD73FA3FA5CACAF31AB04EC0B9734407C6DC575350212239AC9092DA5812137BFC40F7735BFDF9827F768FC0363FC8C5739C7DF828075EA2BBE6321D5A8EA2EB7E397C3D58A953C7F0BAA69A96AC8110B125EE2E9701F43EEB87FDF58A6E6266BE1136437599E26E8E6E853DBB6ED9DF3931C5F402FD09B7E203AB36EAA6EEAE72E908BD2B9CFD379BC9B407F0C882807BBD2E91F920EB24137002A48F1AAA0CBDF89FDE5C51079F1D8CF7A014207F1B40773321AD952D77CE18EC7B48F2CA054E65420C1132AB67C832EE22FFD8672803CCE3DE7E9FD0690E55FA1AF5F11611E3E2C71CED55E3E347F4CBEB9C93BEC2B98E48495585392471AF0AE589257ED8D01792112C798BCA5107030F207CE567594B8433490D8FF1811F21B03A42AD0678927183321355E3D6908DC1125CDCE038CD0469D72458B6CC5E67EB0D78C20819C6F3C4518B15CC63754FF8679915E329DD46FEAEFDA5249ED7E754E7BD55C75CB764B6CC36BC06267B2479CAFBB3F0BAE32A93558190B65C85DCDC080CD56D51D4105C5B0717691D4DB1893EF8AD550F55855B4123A38D18FD67B588A3A4C2A6604E874D721359352B235C17AB1DA2758712AF8179FF433211B93078735F909F985F557D0DE52CB9203DDC67BF9DC8632ACD8D4F90196AF6BD2E79834371C5E9FDF5992ADB04AEA186AF36F56271F763ACFFBF94DF4B0512CA6B7CA8FF486504E565BDA367E044FCD0F25FBC2A6C720867F95BFD92109780D2E6DD60CE90A4CA8EEB8C4CAB289DCF99E687B017B37695C3B99B4FE97D7E5D52BB9813C04D03C9AD71770FE0986C7F3A3FFD3A261AC771DE88C7ACDEF253E5CE2B50BC5C576D132B68CCC694BA883770B80F5ED7D527CEE816527F69CA2C101747A0088879C3663037DB5B - -count = 82 -seed = 6CDB757AD36DF99E52F535C2680431D5FF36C812D8EA19399F666F2FDD66D3A842A7A5AE1038359AB618FA58A0A6E840 -mlen = 2739 -msg = 7785A08A3892C97D5EBFE52475298BA444674086D63E17E1FAEC96F6B10723447FC1B8CC758D1724A33E26518798183A4B3C99A7DA54038B86473DFAB8E626EB3BF54DE5581E04450B2821F5020C466505990B173DB9F030CFCFA505AA04B37CF0A063876843A042F17AEB1728787187428F8D1010D532C94C7AB2E1193994BFF0CB56415FCD2A96BE7F7FC2C57C8313E795367A22B6A17CE3B803083A74FDBCF030D91C957128099D6199686F2BEA618CEE111AA9D55A6F9E8966C102D849ADE596A1B576924DE0E92DD91FBB01CD93E24AA71EEF219A78430D84965672FE6AF091D46DCFA9AB906F6240913C1286EE0A152666ECFE2C154CD3FB14DC0F9C173E30FC9958A75AA6DD74822AF7ACAD243FDFB743E47E48280990C2870904EF1C902261D0BD6BCFDA91412BDEE9A28C628F218E7648AA0027D918B48EF30A9B18390331805C6739BF6A2CB69A0DE8766A7B3A448910D181F6449565A363430BA1C0FA8B11E1A151F6CEFA3870C3B1D8CD800983EBD41B48C5624269EFB440DF23FF9BCB31A4B02F6505DC862B2103F76137FC6560F893577BC3FCE92ADA27F291305F2345AC82A846854F172131B042735D4B76C6AB2DCFD32BB6258B23AC790AF2AF7624451172FA7A29E0C5FDB3DC3B719B274B2838FF7A8B25F272AC8EA90FA3C8010AC7F65633EB43FF7A0A95CE99717F35D3C416B0E0DA30470B5AA20EB9E2B66315B9407A4753DF8BF505B8066C5D57EC4CCDD2236B9C58BD7337925191ED7B75B92C9CEE626F13EADDECB07173C8160540FB9F6A4D43A1E9AB263B300C08966C247514647DFAB3B420202529E963A51F8D23BD0F689BBC4D67D5A603B876E8CD3EC0770F0D9694DFC30083991CF3989DB1812B4AC5452358075534190F012F7C0E47734C3BA748E04910783C0B845484461DCEA67A1EC731354B902557486B484F67183FC711D10F906C68CD01F46481D040F084271DD784E5B958AE05B65BF5D207EFBB5FDEB25366D6FF4161CA3A1CB71B2B9F90F86A315D800935AC0086D85D907A036C4333EA347000A0755550B68FE3DD7686E416483781B563680146697D6FAE8333C24ADC8A2436852DDADF6061E2B16FD3829C0B55C2E9C2C89F64CB8DA02A6706498CF0330742083E9AC4593A1762D32DC4E6CC2D9F4310014FB15DEBBEA324EBC2EA1E1660782559B9B39FBCF34C85FDA9AD350D195AD7587AAB621EF7FFB63277CE35AB43B01977C9F8DD6C2AE7B34FA7B35D5FA37D8B3719E736F18734CB3A2468BE9CA0832DDE0B958925A377FE6751C4EB8FF1AD295355302F0A5ED4E8F8C33FD5162542B8ED7CD985DBE3C84401830F6A7EB9D955EC74C7F98B02388B4E1353317CDB5EADAAC9025038CC01F8655C7FB9AEE940FC4B282748B39D277A7FEF462038833A9A8EB50A8719F68B3E858825911F294A80FAEDE9D4C1815844C2632DD20387950003DAB80B1A58E541A5E6658AF7D4CDD91FD1C08735B584F5C69C5CA94F6B7F97A4761B127DB394AC72E902DB9EB4B3E0B884C448FF2763FF9ADD530753263688CF92BB746181C17294BFFC2A0B3969A7BBA429A481C425B24745CEAD66286F5DF04F1E4421C56ACAA668E87BA58E3B07A062D1DA60CC6B411667BDE6F466B72C9169965BC7781DA78A818F779A9B3D7A577F71A1DF49AAC865A0D6F2668CFD2C77CFA8D306A14DBBDE4D3A3818B07DC89D5F51E117F7BFD007D60F32BB1B6BB01E76862398371FB91E0A3D4B39FD9146C47F627A066618CF83C32E5C82592B418BD2F5DCD8D42234625974F988A6F729C60BA5EAF18C77B611DFB187A581E3A10268A965F650FE242CE2FE08AA71515B59A6EDFC9CBDAE22DF3AEB22E773CC2EB373619E9CDA23C236CA3F7845C2136E93849D9F6AA1477F4513358CD8CB4E21444C9E5709818801EADFCA23F2C23DDFD5B4EBB6089DAEDD14A21EBF3F7A8C1C80BBF7D37973BD156AC5C4462D29DCCB7EEFFA22A8B6CE433B600532F33999ADC39196F01230614767285089FB262D8469DC66D24AE0B77FD05C3EC02FBC5EE328319409B8E2D7B0AC6801C1C8BA86F793C2037C71E2A25F114E9EE0EDB3B83076EABFDAFEDEFA0548DAE91E62CB7C29C03413235B8C6EB9F46BE29DE8F5D30E8D97DB6F45687DC4719B1024E48B7DFFD0D2B474B2032B4E69B6382E603D4777F3450E2E467C6D9AB2782C0AE266C320D36BF67BD6B86EA9721B22741684D9C0CCC774335430071A5410C1E34B4BC1A823A93A38F5AB4781CC593B13A593867FB634C0C705107CD278C6CCEE6D842748BFBD2FFD205C6BDFB3AC87F693C25C832C86D96B00BBA0AF88DCFBC8CA4328765DE27FBF1389C4EDE28317BD0EE447F030990E957D223A5EC66CED9D16400AF6DA8663C4E4111B4584F8F0066CDF8258D90C5D7B439503E3AB3FCC55FDF933E06D704416187AAF86E6C39695DEA8B8189EC1299670BE03B6A636889CB7F10F04CCD67278E77886CF3F6E2A05BA8D25AB8664EA817642ACF5DB4D9B3EF80E169463EDB6BFDF67172E88D233609B091BBD085B970DB8AE0DAA5048CA42D6A54042F42445BAB03F9BF1ACCEF341B7349109BA0073D3715A9073AD9BED258268AEE9DD5202E0EDFA5720A317EA5CB41706C0D235465BECDC8E3FF0D628EE5EEA6AAF1BBD3E18FE9217516893DF115E979C4CFFEC494988B6F9B86026610898C44AB1547C5F8ED5CBF3C3A837DDB6A444BD3E803E1824E6AB931310FE86B36587F1B34B0B48D358F4B97E9774213DE7D92571380BE2199E703119C5B9836DADFC826B71D588250AC37DE0EC05C5823573C102BCE44C9F044507671C4E1723950A3C0E14968CBABBFEEB049EB723DB9B23CDF0273525C29CC5165530A1F1CF830D3551DD6BDED53954947D5C334DC9C71907CDBFA109EBC52D6305477C14159257AF8C51C6F09D76FC0085C3D969EC60FB09145E66A8A7489611DB3FDEFC35202B8AAE82D3CDF666034BEFF49FE49A45C5EC438F4118F338545532CED916DE78E3BF82B4E55907474386B9C172F393EFE895334F7323CBB2AA7CE7718BEF5E7A23AF734BD4963FBC7889AA5C50F3955B904B5E577D71B21A293D766865E3F8C212DE5EA084A9D22748A8009A7D1858328A1BDF7BA0F4E3B83BE9707629252B3339CEF796696855A574B4A4896CA68C3D6A6824E3F593069EC0A571E61282F8A29BEB8BD788F7B351A8939CDAD9E257587A77804F2704F49DB3305514B85B449AEE56EE40CB2A75D51690194284AACD0855B02893F8DCD3091629DC548705A1085E5CC33DE7726A0F521C149003DF380ABDAE96BCDA55C44BF9BFA1103150F049563E848A8750625DCFDD9BFE02E1E57489B5B3AA28BEAA80F4DAA562DEABB4BB6A27125369415885020D237A92CCC3A23593FE2183225BFA2FF39B0BEF9CB0425375E256BCD572175483F713BD38F937F2B3D4C1F686C5AF60061E0B05CC3EBAAB0AE8BA21E47A8318BEE4A01516046363D152936A1344E17A65E08030522EC667233145A56001B8D065DC2FED0D2A9F02C981A8962F984916314805DAB644A5112CAA1564895121D8B1FD046F547BE282CF979752883EC79AF70CF59A88D960F3336F0AE61357877AAAA34699A876144B65CA5B77A684D850D09B3D42CDBFC4539EA103F8377CFE5F9E5432403FAB416662C4C83226191EEB7F82B01E0819C081FC40E7B978669C7856067E8B582832DD0B92588103C2616BA2C7774C46840318CA2B1A3798FF7ED9FEC087F01798EA2445B92E67E2446126A7406E82FF8D3711311BE16E9171531A95C966E6BEFEA34938E6F5FA660F7C7CB533A119377F1D26AE6AE51D805AB96A64C8B80D6EE137F634B384C2E377 -pk = C6F55DB0BAA8CB71251826E51451C951A140BC5CD107568F7D00425A1A8F0F0E9DFAFCE2225531B6F2F252E20B7953E8DEAA21D2A36E5563DFACB9AA7D87AB17 -sk = C6F55DB0BAA8CB71251826E51451C951A140BC5CD107568F7D00425A1A8F0F0E9DFAFCE2225531B6F2F252E20B7953E8DEAA21D2A36E5563DFACB9AA7D87AB170200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001592713BC24E82CB684E6D6833916456FE15D2CDB02FFB9813963BC8910AD5363B1671D080651D13EF088425A85002000000000000008A6E8BC775B8EB8FF8D7C65AFF3DD2DEC5F24BD804F038178A4EBA930A09C6658CBEABBAED268326053A7D776A76FBFFFFFFFFFFFFFF7E99A39CFF45E0FC20D3050C27E35AC59BAB4D6EFCB69313D08A3F3BAA03F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0533AFA866444420BB7F67A217666479C55B8EF6E1CCA77DA9E69C9DACB20A0000000000000000000000000000000000000000000000048E54DCE6082405C8157D8ED7FAEC2C9BA44FF701F775EC9BE566512F61BF246034D891E1E90D89EFCE0BE72624A64C9B688E34F7818206EC463C41EC9D5C16C463464BA2D752862B72D2E35501041E57053AE1340ECAC8D5BAD922F69C8F2CB5D3F331EF2C28FA6D2F7D759F5B05F4A26466E1877FAD47EDB8AF618D41DE2B1E7B85978071A3F522EF5857F5F08CB101B5405F6F0AB20E9B5F5B338555440DB42634EE6FEEA14A1B7B9978B77C705B862BD0BCE79532BA70CFC1F398EA4D2FE14E0EDABEC2528B3F6C2F8106EDDA47D47CA84D1F22C84ED2F677214850A934A74F5991DFDD9480D7782BB5DB67556271F9D0969FA13DFE08DFBC2A5B119D10088302B7F20F2ED5F80CD0D6681DE8F77D94B209F244BA58308007DEE2AE8631F1772B1A1F4E050613AB7690F6D32304C18A9D0214D8E6500C4A0EF61697D7346E82763A05431054D8B0D41F0450BC0A02EA46E83A692FD6C35CBC868F439D2181FEB423C9253981F623E9E80A534EE40EAB64C16DF81A06033250EC7DAE3C077C0FF4AFC13DC122480737422DBD2B2F716F83F7BCFF665B425AC7F74488422F201E67364732BF3AE0607C35DB670D457DD99FB518D29AAF24A8A577A9E6A214 -smlen = 2916 -sm = FA9AECC5C4E35272DF0715AC29730724AC4C4B03F616EA77EE05B031F003E1C7514E5857564C2D02C1275D26DDB2B078EF06465FB447A14E7D45DA053DCCE313D2C68F95E905E1BD829AD7257CF059009BCD62AC31EDB2850202E7E61E412594416320008F02E807DCB869F9F3011C818BE47EF85FB10D059FCCE2E470DAFE47C504D9B25259EDCCD39E0E07014B2D60EA86BC3A966A9A39C6469C749E0A034EBD9C153B6108393C05E08E4BE36486A5017785A08A3892C97D5EBFE52475298BA444674086D63E17E1FAEC96F6B10723447FC1B8CC758D1724A33E26518798183A4B3C99A7DA54038B86473DFAB8E626EB3BF54DE5581E04450B2821F5020C466505990B173DB9F030CFCFA505AA04B37CF0A063876843A042F17AEB1728787187428F8D1010D532C94C7AB2E1193994BFF0CB56415FCD2A96BE7F7FC2C57C8313E795367A22B6A17CE3B803083A74FDBCF030D91C957128099D6199686F2BEA618CEE111AA9D55A6F9E8966C102D849ADE596A1B576924DE0E92DD91FBB01CD93E24AA71EEF219A78430D84965672FE6AF091D46DCFA9AB906F6240913C1286EE0A152666ECFE2C154CD3FB14DC0F9C173E30FC9958A75AA6DD74822AF7ACAD243FDFB743E47E48280990C2870904EF1C902261D0BD6BCFDA91412BDEE9A28C628F218E7648AA0027D918B48EF30A9B18390331805C6739BF6A2CB69A0DE8766A7B3A448910D181F6449565A363430BA1C0FA8B11E1A151F6CEFA3870C3B1D8CD800983EBD41B48C5624269EFB440DF23FF9BCB31A4B02F6505DC862B2103F76137FC6560F893577BC3FCE92ADA27F291305F2345AC82A846854F172131B042735D4B76C6AB2DCFD32BB6258B23AC790AF2AF7624451172FA7A29E0C5FDB3DC3B719B274B2838FF7A8B25F272AC8EA90FA3C8010AC7F65633EB43FF7A0A95CE99717F35D3C416B0E0DA30470B5AA20EB9E2B66315B9407A4753DF8BF505B8066C5D57EC4CCDD2236B9C58BD7337925191ED7B75B92C9CEE626F13EADDECB07173C8160540FB9F6A4D43A1E9AB263B300C08966C247514647DFAB3B420202529E963A51F8D23BD0F689BBC4D67D5A603B876E8CD3EC0770F0D9694DFC30083991CF3989DB1812B4AC5452358075534190F012F7C0E47734C3BA748E04910783C0B845484461DCEA67A1EC731354B902557486B484F67183FC711D10F906C68CD01F46481D040F084271DD784E5B958AE05B65BF5D207EFBB5FDEB25366D6FF4161CA3A1CB71B2B9F90F86A315D800935AC0086D85D907A036C4333EA347000A0755550B68FE3DD7686E416483781B563680146697D6FAE8333C24ADC8A2436852DDADF6061E2B16FD3829C0B55C2E9C2C89F64CB8DA02A6706498CF0330742083E9AC4593A1762D32DC4E6CC2D9F4310014FB15DEBBEA324EBC2EA1E1660782559B9B39FBCF34C85FDA9AD350D195AD7587AAB621EF7FFB63277CE35AB43B01977C9F8DD6C2AE7B34FA7B35D5FA37D8B3719E736F18734CB3A2468BE9CA0832DDE0B958925A377FE6751C4EB8FF1AD295355302F0A5ED4E8F8C33FD5162542B8ED7CD985DBE3C84401830F6A7EB9D955EC74C7F98B02388B4E1353317CDB5EADAAC9025038CC01F8655C7FB9AEE940FC4B282748B39D277A7FEF462038833A9A8EB50A8719F68B3E858825911F294A80FAEDE9D4C1815844C2632DD20387950003DAB80B1A58E541A5E6658AF7D4CDD91FD1C08735B584F5C69C5CA94F6B7F97A4761B127DB394AC72E902DB9EB4B3E0B884C448FF2763FF9ADD530753263688CF92BB746181C17294BFFC2A0B3969A7BBA429A481C425B24745CEAD66286F5DF04F1E4421C56ACAA668E87BA58E3B07A062D1DA60CC6B411667BDE6F466B72C9169965BC7781DA78A818F779A9B3D7A577F71A1DF49AAC865A0D6F2668CFD2C77CFA8D306A14DBBDE4D3A3818B07DC89D5F51E117F7BFD007D60F32BB1B6BB01E76862398371FB91E0A3D4B39FD9146C47F627A066618CF83C32E5C82592B418BD2F5DCD8D42234625974F988A6F729C60BA5EAF18C77B611DFB187A581E3A10268A965F650FE242CE2FE08AA71515B59A6EDFC9CBDAE22DF3AEB22E773CC2EB373619E9CDA23C236CA3F7845C2136E93849D9F6AA1477F4513358CD8CB4E21444C9E5709818801EADFCA23F2C23DDFD5B4EBB6089DAEDD14A21EBF3F7A8C1C80BBF7D37973BD156AC5C4462D29DCCB7EEFFA22A8B6CE433B600532F33999ADC39196F01230614767285089FB262D8469DC66D24AE0B77FD05C3EC02FBC5EE328319409B8E2D7B0AC6801C1C8BA86F793C2037C71E2A25F114E9EE0EDB3B83076EABFDAFEDEFA0548DAE91E62CB7C29C03413235B8C6EB9F46BE29DE8F5D30E8D97DB6F45687DC4719B1024E48B7DFFD0D2B474B2032B4E69B6382E603D4777F3450E2E467C6D9AB2782C0AE266C320D36BF67BD6B86EA9721B22741684D9C0CCC774335430071A5410C1E34B4BC1A823A93A38F5AB4781CC593B13A593867FB634C0C705107CD278C6CCEE6D842748BFBD2FFD205C6BDFB3AC87F693C25C832C86D96B00BBA0AF88DCFBC8CA4328765DE27FBF1389C4EDE28317BD0EE447F030990E957D223A5EC66CED9D16400AF6DA8663C4E4111B4584F8F0066CDF8258D90C5D7B439503E3AB3FCC55FDF933E06D704416187AAF86E6C39695DEA8B8189EC1299670BE03B6A636889CB7F10F04CCD67278E77886CF3F6E2A05BA8D25AB8664EA817642ACF5DB4D9B3EF80E169463EDB6BFDF67172E88D233609B091BBD085B970DB8AE0DAA5048CA42D6A54042F42445BAB03F9BF1ACCEF341B7349109BA0073D3715A9073AD9BED258268AEE9DD5202E0EDFA5720A317EA5CB41706C0D235465BECDC8E3FF0D628EE5EEA6AAF1BBD3E18FE9217516893DF115E979C4CFFEC494988B6F9B86026610898C44AB1547C5F8ED5CBF3C3A837DDB6A444BD3E803E1824E6AB931310FE86B36587F1B34B0B48D358F4B97E9774213DE7D92571380BE2199E703119C5B9836DADFC826B71D588250AC37DE0EC05C5823573C102BCE44C9F044507671C4E1723950A3C0E14968CBABBFEEB049EB723DB9B23CDF0273525C29CC5165530A1F1CF830D3551DD6BDED53954947D5C334DC9C71907CDBFA109EBC52D6305477C14159257AF8C51C6F09D76FC0085C3D969EC60FB09145E66A8A7489611DB3FDEFC35202B8AAE82D3CDF666034BEFF49FE49A45C5EC438F4118F338545532CED916DE78E3BF82B4E55907474386B9C172F393EFE895334F7323CBB2AA7CE7718BEF5E7A23AF734BD4963FBC7889AA5C50F3955B904B5E577D71B21A293D766865E3F8C212DE5EA084A9D22748A8009A7D1858328A1BDF7BA0F4E3B83BE9707629252B3339CEF796696855A574B4A4896CA68C3D6A6824E3F593069EC0A571E61282F8A29BEB8BD788F7B351A8939CDAD9E257587A77804F2704F49DB3305514B85B449AEE56EE40CB2A75D51690194284AACD0855B02893F8DCD3091629DC548705A1085E5CC33DE7726A0F521C149003DF380ABDAE96BCDA55C44BF9BFA1103150F049563E848A8750625DCFDD9BFE02E1E57489B5B3AA28BEAA80F4DAA562DEABB4BB6A27125369415885020D237A92CCC3A23593FE2183225BFA2FF39B0BEF9CB0425375E256BCD572175483F713BD38F937F2B3D4C1F686C5AF60061E0B05CC3EBAAB0AE8BA21E47A8318BEE4A01516046363D152936A1344E17A65E08030522EC667233145A56001B8D065DC2FED0D2A9F02C981A8962F984916314805DAB644A5112CAA1564895121D8B1FD046F547BE282CF979752883EC79AF70CF59A88D960F3336F0AE61357877AAAA34699A876144B65CA5B77A684D850D09B3D42CDBFC4539EA103F8377CFE5F9E5432403FAB416662C4C83226191EEB7F82B01E0819C081FC40E7B978669C7856067E8B582832DD0B92588103C2616BA2C7774C46840318CA2B1A3798FF7ED9FEC087F01798EA2445B92E67E2446126A7406E82FF8D3711311BE16E9171531A95C966E6BEFEA34938E6F5FA660F7C7CB533A119377F1D26AE6AE51D805AB96A64C8B80D6EE137F634B384C2E377 - -count = 83 -seed = A97269579EB70D268C58D94FF744329B197F722A8A407B788510DDCACA34C8CD4C72FFC14B76300C86AEA1E4CFA66BA4 -mlen = 2772 -msg = AE3DDE9E33719040345DF8EA7E4C0B5E2CBC5CB80B34FDDB959E2DA1D67D74D2FBE5AAB07C6357A9F3E5F6EF5379B4C75008E9077A1EB025F9023FE32FCD9076C8D2B291D0BECF2DC624F9E752B1EEA2CF0755FC9D4B2E4320DFD042C68577D58E61DAD075BC1C3931ABA78B473C0726ED495150D6A11A81DBBD1C840F5F1FAACD54E3470E0D994DEACA7E6E324A9FB4E581AB447A4EA026DA3DC3C7E6AD55E88CB841E069ECA63404CACE0E3D4C8B9CEC33BFF6AA6341AA1EB69AD799C6CCE358CA94555287D01B0192B1B49EB6F705E54FBC86465C4BA70134AFC9A53C1C3A732E21B010002B49B7CC6F5237B794BC1D1F1E30A7F1EB95D195D5F26B46A704F77F80B092117EDE1C340622FF32302DCA7E7E43C2A4D8852CB508403B1AA8ACA27A86936350264811550DFEF05D72542C74D6243AB9D259202295A63F54C836CBF610E40EB85E9704041A51BF68578B10F7985C752DC35788E7B7754358082AFEC9E4B271D36974EB90A46F7D703B0CCE941C3CD072A88F931A4FFD098634BE0921D089E46637F88F9625B7DF900A276B4BB75FC75921C8A8B6668DF9946290E11FCE4565A76D39D8FA55F324253FFBBF81536581621DEE664A9E9E4F4FCD3A9765706B8EA833125A825B1CB30314B7C6C78B301638EAD4311932FD4611D78572180EE441648F8BFAB869874611C153FEEFF88A45F7A98206D0B2D97CB7EC2144F045225AF5A9925AE7FD3DB017E37259B7A2FF6C66820DDAAC5651B2EC2E5767DDBBE18256B1D0D0F96CF5EE04266B8ADB29B0AC5D55B73E1ECA8FE724EE174B76EA1C0A54896E2BB565075F1669D3CCA171657B66F343A634F4250287F853B52182B9BE50DF29021673DB1841ACA45E7263DCE653F0DD84338E49FF5C6E3BB42F1A3C7164704A2A000149114D36BB9231606EDA06C712A904C1E323C4AA3EEE0BCE6062A9CB956E004407014ADB58EEABF486B38570955C30F2B5C28179F86CD5FFD603CD441A1FB06519368886BFF9C2C127ABD079346D762E51C311F196D5F825B45EDDD4A48C7C2123E10A3D369D772750987EDB96968C59441FB2F47F8E33FA4CED3006766C06BB6B339ED94B8FE57B20D96F1A27A61966289D8FF5072FD11D7EE53DEFE0014A11667D0A6C988BD16629FB53F269130B22A13AABA2E9F70DCC93D3BF6E611EFB006BA585FB8E8720357E25DF69C6DF388FAC792F87CCE801FA49A8CBEAD1698C11B82C4F85FDB4D52A2A808483DCA7334295BB3B2658AAC18857878730831622124F5A254A464DE459F3528C5194220E5BB1779C8F5E3866B0D60931A1A47502D99E2B186785658DEF57ABA676626F9CCAAAF449609B07AF7B57C78FA5BD06B2AD2927AB491EE461A94AC37A079D9BFA02203B09F7EF180C1C1C430518FF2D3F2A3582EAEB6668060A2B544E973E8A2B88733A902A0A80F8E4F30AC5D0223C1076482EB2CA5AE67039597514A4866061D5FBDD99694A060D0D0EE43A1B7290FFD7D796A9F1A2142DB6E0F154ABA8720396B6DE939E668447C81CC828FF9D2A014FE001CA718C1D6ACF4C08BC7796D344A29FD8913E4CE71E986C46BB66C2610FA797C9E1639DF423C338D7192638F621D83A6802E72E38BEE3AAB064FB606962329997FE908597E7407CEF098D4591E5E6011CACA701994E4ACF572F7C91057D3DA06058A7DFFD3248EE3333208BFF27473E6F1EA3914C5B2056AECD7AEE07F8DD26B3C2B8B9656EA4260D38E8D5F23C925A4476754240D0702C5859AEC2329E1CC3E426BD7665B2A4EE2E75B41B561FCE79690F64D1068DD35A294A8E8CB43A6AAA901109F0E09D985B6E323C30A017E75BF01D0AAA739102C1A6667ED48E60DD4499EAB862851558DFD17229878F5BEF0CC29FD19F59835579F3CDD4F85684E0D46D9618A205DE3B29B0BFA5FBB36745B989211E2BA711527D32CBB5E35830DF4549FEA652377EBBAC6D52787F9EBC3CB687EBB641BF51D3E22E98FCA48F99584FB1F3BED3F97F33EBF656C5795055268F49985CEA00819A07B8F4B0ECD7BEDA95EAF11E3498FA7AA414C54C38A08A841B012AE91763BE911DAEF803E2CA385C9D4CDC642A0B343DB6534C10D9E1755B7B2DE543AFE1D3C90981A7BD907E9CB14367243D9FDCAA8776AEE5F65ED6DC02F633BCF9F57DAE39E8E8261DC10029DF7B7124BEB67DD753B36892481EA7CC54DDC3A60EF8D4DCEC4D5796DDE0E7453BBF0FD93FCACE97CE5048D75ED1F34B69A392E1734E262B2B2A1E246331A373B5CF1FEE7BB46096C76349B0F19BE63FE539DCD33A8450BE894C2DC21BEFF0DE6A841A533F4C9949289037D161BB97DCE31CDFF4C1E0AE36B4192594DEC3B021E8F3D5B500C244CB122974F8CADF125DE0CF832A920DEC3A6F7150585D0209651B0FAAE0F74A36FC8779115B96136805DDD4F6F3A69C06AF472F369F481359FF834A0FD2F9AE899EA36B9B061B63D07C1D4ED7A373ACC40EAD808564B05FB0C6E656A80FA3865AABE483848D14D1DFD66D7AB1F353642EE3417869DA21622F6AF551659D07E6C827C18EA36E2C5E806A9571A7B05BBC1BA283A8984BFABC555AACAEAB2453573F782A4087F0F903AF34596E83282A2E54773AC33543BD353A3F855BC46810930C3635A9B70BA7FFBEEA95A129CCF9E9538EB11E119A072F806130D831AF7E57D332AC889D7D9E6BBD1C65D64E089722F6954F126E64EA939D98084D434EE74B55C549BED21D11264F8B5E023277DB52B03D7B8A8E75B12B11D62052E474E435707272D72D00D92288CEDDCD1ABF8E63A8A9963A48B54F492487B309F69CD90C9FF54B9C5A55CD2BAD4A2E0A6B00B188FD6C527A8184BB63670BF626A995815810CC0F280131F5F652EC20609C7D3B910E4168FE273626BF0E2CBF05BC9CCD178AD91BC25CDF178B387DFF0B6B40A46FDB6C975349B6CD8AD103CDC5DAB8D09D9A5B55622E74564C1E789C5C185CAC04FA0ED6065B9CCADB1D5DC80E90AB244CE1AAC516B346ADAEBAF7A030D66FB90FD070ED062A41E0B70BEE3B07F1C03887DE5F79D70F9955B25B8C8201602784EF8A60147260D1BDE8E152E8D3F992CB8255ADACE9D5DD2E9C856C47537742094190AA867459D20989DB11841AE44824979C0A2093D7EDCAA13C9DE25E6EECBC5124055F17466467E123E39034502BA966CEA873997EE25E52DE2DBBA874DC9AC222B49967B7BEDB5C81BE09827CAB782F458795B2903D72AB16F4423964F82DC69C138EEFA3273BC10376939E544964150D9DF09E14BE08CFCA06C10BB2C315B1B676C40762F8209C0EF13CFE5FAD76CFC17FE462D8330F78BAB072C5465F7A26D047FEC4BD3B918C9C761B91B02D820ED7EF345E79A66FBA61AE13D3050A27488CBDBE693B800F1E76C188EBD8118C9432EB9E7124D35A1A038D237918F1DB83304D10AB5DEDF58C6951A92AAB1A1A40E180254E730EB43B566A83CC71FB6B9749BFCD3A90B964966CAE90FAD7406A8A89B1E48C885BFE2DB41C1996F20DC9A8DFCBA1A6F2F307EF8FBA5EEAE9631C2D6328D90F17679DD9E8E9660D6BD4C8A1D79C47A5FD46BD2ACCACA2D5C6407B0F7F31D093CEEF0342C67DDE3F1BA5067ED1500DC45161B8636255924BF007C4C870990C5DCE098C5A26386AD84D0F0CE4860349A147A4E7AB80151FA63882590B91C6AD3E70A68E6FEC1A2CF65881A6DC38048FC14DE71C702C934C5D3C4CF4C474F906C3400364BC400A7DA087F94F1ACCB68439A9A6FFA8C6439B2CC5C0B17A7D649033798429F211D9DE12B24D117583E1C425C2C0348C625CC44E9B976D319E72D4E09D5D6F36EE243F5FBCB190E84DE56EB680DEC8566F5A2C7D5F595116C628CA09401D561BD78356C634419225FB01CB637C46A627F6026D39EC1C62E9A3E85FAE -pk = ABF26FE3A4F1B5A9B06626D3C433DB97869638808362A3850D5EED4255FC0301F51299094B8EE4C24AAFDAF55208C881E6D9AA7D13975121A001281A68B4D90C -sk = ABF26FE3A4F1B5A9B06626D3C433DB97869638808362A3850D5EED4255FC0301F51299094B8EE4C24AAFDAF55208C881E6D9AA7D13975121A001281A68B4D90C0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007AEAFB9A3234A039FC24D7A38B69F652F6EF5953412E03814AF2E82653773F3C7A40BA600F7CF17EB005DBC7C2D2000000000000000097D84EC1AE4B1E93D14E835A67E3F91D4EFAE962C401310B1476644E9D1BF68D1DE36B5B1040837B059B3108F98EFEFFFFFFFFFFFFFF89F6D39D73C5F6AB93FA6E7FDA8403F7A0F744B3EFC25C7BFE4A59753325F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA0080BD49A7A01563BD441B6652F69B885E0ECDEDEDCC2EB540E12F62AC0B000000000000000000000000000000000000000000000046440E8EDC05C861EA0D45D1019256E7B206345C2FD78494B6B2E24845E14C18383B53F7017ABCE6DB9DE0261729B5D3CAFE2717611A418195596B2138D301050992A0943554E8B1E940F90AC9648879DD1BDC08F7347BB50836FBBC7B47CF1C1B8A6996CB7A576842881BE849FC50D3306CF068721A3188B99EE942DC6AF22BE053DF7D55907BAE78478A740229DF97801E3F78D42AD0DB34A9CFA3A699A30D28E15AB9DF9FDF4BC682CFF9DAC7F59B871ADDEB3AEC175A74281FA5CD04A32A027AEE5BB8D87A8EA5AE76DD003981189A3D871FEFEFA457A5BE00170146952B6D3CD92E77312D070EB71D58699A17A5D785286BC2345C544C9FD84D0E945F15C72AC9C1E9CB3F85CFAD441A81C44BAEF4C3C25D38A2C403DEFBAA2825AA0221794A97BEFABB6B410098CD7D7006DD8B39869E5F5074056B627F279BD8B9F2245D624B8C738BD934D967600744DA24B79113F4907DA02267FFB42D1B2362D72AA821C4C9228AA069DCEFEFCE2C34AB96DCE49FD0BA348C5781A9181A4BEA38199D99551D70395B020E666B541EB330E86BA78FBA92F48EEBAE835BE68824DD0A4D267FFA7B4359140B4E86D898F936290F5C87701EE4316EFC00B050A0C23E32 -smlen = 2949 -sm = 8C0775EE9D5167A8B00717F36ECB5809BD555D0618BFE41EED14FF07EC0294DDD0A43D8D22495700FC8295E37A53FCC5720177F012C604CBA0F373040042B4EEF1277863370030F3A2B918D188C97500781CFCFC052431B9910136D2351121B621719F0211549CCB0E9B4297B6007DBD9509C11B27DFBB07C3F76E6B0D00B1DA860217EFDB893C255D6DD90101118D70B4883E5AB7CD3130F11090BA720A02DC96FABC8CCB456777037924ED68F6FF1102AE3DDE9E33719040345DF8EA7E4C0B5E2CBC5CB80B34FDDB959E2DA1D67D74D2FBE5AAB07C6357A9F3E5F6EF5379B4C75008E9077A1EB025F9023FE32FCD9076C8D2B291D0BECF2DC624F9E752B1EEA2CF0755FC9D4B2E4320DFD042C68577D58E61DAD075BC1C3931ABA78B473C0726ED495150D6A11A81DBBD1C840F5F1FAACD54E3470E0D994DEACA7E6E324A9FB4E581AB447A4EA026DA3DC3C7E6AD55E88CB841E069ECA63404CACE0E3D4C8B9CEC33BFF6AA6341AA1EB69AD799C6CCE358CA94555287D01B0192B1B49EB6F705E54FBC86465C4BA70134AFC9A53C1C3A732E21B010002B49B7CC6F5237B794BC1D1F1E30A7F1EB95D195D5F26B46A704F77F80B092117EDE1C340622FF32302DCA7E7E43C2A4D8852CB508403B1AA8ACA27A86936350264811550DFEF05D72542C74D6243AB9D259202295A63F54C836CBF610E40EB85E9704041A51BF68578B10F7985C752DC35788E7B7754358082AFEC9E4B271D36974EB90A46F7D703B0CCE941C3CD072A88F931A4FFD098634BE0921D089E46637F88F9625B7DF900A276B4BB75FC75921C8A8B6668DF9946290E11FCE4565A76D39D8FA55F324253FFBBF81536581621DEE664A9E9E4F4FCD3A9765706B8EA833125A825B1CB30314B7C6C78B301638EAD4311932FD4611D78572180EE441648F8BFAB869874611C153FEEFF88A45F7A98206D0B2D97CB7EC2144F045225AF5A9925AE7FD3DB017E37259B7A2FF6C66820DDAAC5651B2EC2E5767DDBBE18256B1D0D0F96CF5EE04266B8ADB29B0AC5D55B73E1ECA8FE724EE174B76EA1C0A54896E2BB565075F1669D3CCA171657B66F343A634F4250287F853B52182B9BE50DF29021673DB1841ACA45E7263DCE653F0DD84338E49FF5C6E3BB42F1A3C7164704A2A000149114D36BB9231606EDA06C712A904C1E323C4AA3EEE0BCE6062A9CB956E004407014ADB58EEABF486B38570955C30F2B5C28179F86CD5FFD603CD441A1FB06519368886BFF9C2C127ABD079346D762E51C311F196D5F825B45EDDD4A48C7C2123E10A3D369D772750987EDB96968C59441FB2F47F8E33FA4CED3006766C06BB6B339ED94B8FE57B20D96F1A27A61966289D8FF5072FD11D7EE53DEFE0014A11667D0A6C988BD16629FB53F269130B22A13AABA2E9F70DCC93D3BF6E611EFB006BA585FB8E8720357E25DF69C6DF388FAC792F87CCE801FA49A8CBEAD1698C11B82C4F85FDB4D52A2A808483DCA7334295BB3B2658AAC18857878730831622124F5A254A464DE459F3528C5194220E5BB1779C8F5E3866B0D60931A1A47502D99E2B186785658DEF57ABA676626F9CCAAAF449609B07AF7B57C78FA5BD06B2AD2927AB491EE461A94AC37A079D9BFA02203B09F7EF180C1C1C430518FF2D3F2A3582EAEB6668060A2B544E973E8A2B88733A902A0A80F8E4F30AC5D0223C1076482EB2CA5AE67039597514A4866061D5FBDD99694A060D0D0EE43A1B7290FFD7D796A9F1A2142DB6E0F154ABA8720396B6DE939E668447C81CC828FF9D2A014FE001CA718C1D6ACF4C08BC7796D344A29FD8913E4CE71E986C46BB66C2610FA797C9E1639DF423C338D7192638F621D83A6802E72E38BEE3AAB064FB606962329997FE908597E7407CEF098D4591E5E6011CACA701994E4ACF572F7C91057D3DA06058A7DFFD3248EE3333208BFF27473E6F1EA3914C5B2056AECD7AEE07F8DD26B3C2B8B9656EA4260D38E8D5F23C925A4476754240D0702C5859AEC2329E1CC3E426BD7665B2A4EE2E75B41B561FCE79690F64D1068DD35A294A8E8CB43A6AAA901109F0E09D985B6E323C30A017E75BF01D0AAA739102C1A6667ED48E60DD4499EAB862851558DFD17229878F5BEF0CC29FD19F59835579F3CDD4F85684E0D46D9618A205DE3B29B0BFA5FBB36745B989211E2BA711527D32CBB5E35830DF4549FEA652377EBBAC6D52787F9EBC3CB687EBB641BF51D3E22E98FCA48F99584FB1F3BED3F97F33EBF656C5795055268F49985CEA00819A07B8F4B0ECD7BEDA95EAF11E3498FA7AA414C54C38A08A841B012AE91763BE911DAEF803E2CA385C9D4CDC642A0B343DB6534C10D9E1755B7B2DE543AFE1D3C90981A7BD907E9CB14367243D9FDCAA8776AEE5F65ED6DC02F633BCF9F57DAE39E8E8261DC10029DF7B7124BEB67DD753B36892481EA7CC54DDC3A60EF8D4DCEC4D5796DDE0E7453BBF0FD93FCACE97CE5048D75ED1F34B69A392E1734E262B2B2A1E246331A373B5CF1FEE7BB46096C76349B0F19BE63FE539DCD33A8450BE894C2DC21BEFF0DE6A841A533F4C9949289037D161BB97DCE31CDFF4C1E0AE36B4192594DEC3B021E8F3D5B500C244CB122974F8CADF125DE0CF832A920DEC3A6F7150585D0209651B0FAAE0F74A36FC8779115B96136805DDD4F6F3A69C06AF472F369F481359FF834A0FD2F9AE899EA36B9B061B63D07C1D4ED7A373ACC40EAD808564B05FB0C6E656A80FA3865AABE483848D14D1DFD66D7AB1F353642EE3417869DA21622F6AF551659D07E6C827C18EA36E2C5E806A9571A7B05BBC1BA283A8984BFABC555AACAEAB2453573F782A4087F0F903AF34596E83282A2E54773AC33543BD353A3F855BC46810930C3635A9B70BA7FFBEEA95A129CCF9E9538EB11E119A072F806130D831AF7E57D332AC889D7D9E6BBD1C65D64E089722F6954F126E64EA939D98084D434EE74B55C549BED21D11264F8B5E023277DB52B03D7B8A8E75B12B11D62052E474E435707272D72D00D92288CEDDCD1ABF8E63A8A9963A48B54F492487B309F69CD90C9FF54B9C5A55CD2BAD4A2E0A6B00B188FD6C527A8184BB63670BF626A995815810CC0F280131F5F652EC20609C7D3B910E4168FE273626BF0E2CBF05BC9CCD178AD91BC25CDF178B387DFF0B6B40A46FDB6C975349B6CD8AD103CDC5DAB8D09D9A5B55622E74564C1E789C5C185CAC04FA0ED6065B9CCADB1D5DC80E90AB244CE1AAC516B346ADAEBAF7A030D66FB90FD070ED062A41E0B70BEE3B07F1C03887DE5F79D70F9955B25B8C8201602784EF8A60147260D1BDE8E152E8D3F992CB8255ADACE9D5DD2E9C856C47537742094190AA867459D20989DB11841AE44824979C0A2093D7EDCAA13C9DE25E6EECBC5124055F17466467E123E39034502BA966CEA873997EE25E52DE2DBBA874DC9AC222B49967B7BEDB5C81BE09827CAB782F458795B2903D72AB16F4423964F82DC69C138EEFA3273BC10376939E544964150D9DF09E14BE08CFCA06C10BB2C315B1B676C40762F8209C0EF13CFE5FAD76CFC17FE462D8330F78BAB072C5465F7A26D047FEC4BD3B918C9C761B91B02D820ED7EF345E79A66FBA61AE13D3050A27488CBDBE693B800F1E76C188EBD8118C9432EB9E7124D35A1A038D237918F1DB83304D10AB5DEDF58C6951A92AAB1A1A40E180254E730EB43B566A83CC71FB6B9749BFCD3A90B964966CAE90FAD7406A8A89B1E48C885BFE2DB41C1996F20DC9A8DFCBA1A6F2F307EF8FBA5EEAE9631C2D6328D90F17679DD9E8E9660D6BD4C8A1D79C47A5FD46BD2ACCACA2D5C6407B0F7F31D093CEEF0342C67DDE3F1BA5067ED1500DC45161B8636255924BF007C4C870990C5DCE098C5A26386AD84D0F0CE4860349A147A4E7AB80151FA63882590B91C6AD3E70A68E6FEC1A2CF65881A6DC38048FC14DE71C702C934C5D3C4CF4C474F906C3400364BC400A7DA087F94F1ACCB68439A9A6FFA8C6439B2CC5C0B17A7D649033798429F211D9DE12B24D117583E1C425C2C0348C625CC44E9B976D319E72D4E09D5D6F36EE243F5FBCB190E84DE56EB680DEC8566F5A2C7D5F595116C628CA09401D561BD78356C634419225FB01CB637C46A627F6026D39EC1C62E9A3E85FAE - -count = 84 -seed = 483A81716F91A43ACA6764C4BD2A57C9156B762E9174EA49730A6BEB9CB19A0B3755E37BA47EC524BBE2FA25B9FEF687 -mlen = 2805 -msg = A7E941D3C14E2DDB4F971C9955868ACA753A73E8EC6845ED6E9D3B444C826480F03AC771F92E94380BCA7E50303FB79CBA608E351A1A67BF217B9816E2AF9F89BE8A79F661470CA16BFB2C99EFDE97859AD1D217848289EAF543005F5C231599FF74299EC2A7C737FF94B7465DE11F80E17D4FDA264DE568D8767CE822B3AB9642D95BC89533CE05FB331B86E3C5A296E4EA4C637EA458BCED1F89355C0270D083D4920E72112CA1ED486191748B4F730ED52F9803D05A0F2F065BE03B2603D6CDB154DD7765847D656B919B08969E41B23F9D376135BD5D924529410392ACEB004849550E6CF2903181C9A395FD469B7DE2C5060ED22922AA4D7C782A33330714A0AF206B29B4FCBE0F12C18948F6634FFD7F2710138020E273CB0DFA735BDCDE9BD6CEC898C5E564EC71AA7880D97CC711412F28603DE293CD5E904E9156D4F6BFE2BE15347B9FF7848EB51CD0785D6A649EA3514E02695C7E3C4F021A9992D67BEA1D68E5B17DB2E0DC061CCB5ABABA49D110055467F9DEE61ABA8F3E5C713E94A8A96C3A8AFB698887C1FA4ABC5157CED33A834DBF0F5AF9EECBB5F2AD7B63B4C2CA94A117C2B92F3D51900926E26B101FBE6207AB0884CBFCB15F9F98F95B0D08E29390977F4D3DC710EEA3AE7433D5EA87A5F710F1FCEAB26D516FC19FD272F6B0F01EE167F06E6C33273481F280CA64FDA0549C8DB884FDD467B93998360766D4CAC4C8DE783752FB6C6D7B1E47DF23CEECA572F2AD3E2B628E31984B9054448ED1D90658BC658A9CAEC0485512CE084A535E7C8196B8BBCA5D26C105C41E083F8D56F1530A8C1B36A7F3E41FCCBAC7F342B2D026064B304444192D4873FC57978E44151896EA6C0F13D017F683B203BA1DE677ED00F2B737C4C69E53ECF16AB918939E120E9FE14B2243EFF0116B24C6654BE09C582F1E62E75EFD8593E62E45AC36F717815B854B47A4DDCFC91FC533FA85BCECB6E560CF11E46D2F334B396D68B275E7404A70F2A805A64CD458A8E5F114A89124BA1866F917749FF32E59EE71948BD97F2D4128BEAB8BB0B6B06D84C6D466BFA30FD8100E48D951D0B3E787EF9611A56FFD64D970DBACFB1B4DF064B1CB5DA9918F5C58A10F0903B64286B1C1AE5CBD00EB8B363BDD7A7AAF2111C0C6E86E15ABF6C1E761FBF027425968CDC19522B44FF3F56335C59760FAE6D9028E76B284330F7510F2B55B6F46ADF90311CC785D35C2BB49272BE514CFBBD7A2B7B2E8C0B6DC28CB683D3D581F547F83BBD3B8C7B76925E44E6DA89D5EEF17AB0BF4213EF9C05B7B473901D483C647F416B98478C7100919C28515B617A27321841BAA174C1A2D3494395294CEBD48EEA14BC3106CA9C69D9F6485D6ABF1C2B1111A8BC602454685CA61AB4EE4DB9F413CAF8F0F204F04D40CD36FA5DAB629CB53876DB3E16372E626B6BC892C63C6B6C503C9D22EFE113927395206BDAA4B83D4FEF4FEB42FA7A71F7CE2197FE282A02D0FE50F96B1F917A67E50EB79CD3FFEF064542F7BEB51AB05B56AFD7AEA5F4164CC9BA37D8FDB35A3DEACF0CFB555161E7E41EB798160798BE9D01E3DE0C4288E0BAB19AE398E94353ADBE9A43524ACE35830B82FCFD4B1DC2800CA4C38A56B7CD28BC3E2F69A0AC4655CD79B5789A2B72EAF93B018D4D6F4C983D08932B22C85AF6FB07DF0A786D98820E1B06BC17F62D6E39739790A13049252F1B9102DC692CEB20C270FFE9B902AB7EC5A4EAAF47F7E2D31B2195F5F48AD18D099C33384141DA14E151BA57F6B1BB97901457202CDB83B5C713BD8A13F6E3E276C7D6C130AE287CA8931D9EECE06AB7CCA124D6D02D497D55EA9151A95E8A4DCCDA72D3F51A7DB3F2879918753683B01BA1B154DA83E6D84DDC9492F2DD8C128A30C75174ED1A6B8D93D08645270BDE247782E882418EA158B2A2153B2D8F75C09932F324EC199D26E9F3C4C4CECD807367E3981E137858B98BD1268D2C894541EC99BBBAD19A6856EA16A1E56B7B193BAF79AB89D4E76327405658C4ECB5A8626302B3A4618AEAC7E11A1199C4BB08C60AD78FEA4827B59CC883B2CA7038D7845106DE9174B2B8C17267273D23418AF560265000543ED9886884912B4160FBD372FCDF706EF642CF1829493884B6CFE946ECF6140106DCBE11B3746E33FBD4B5852B732230B9047004F4FAFA0D4BD7043C7D6595ACCD1B2771AAA76FE05A0C80B7B221DBEF79950FC69147816CAD0E52C05E72CECCF55FB4DABD81ECDB476417DBFDAF3B555CC90573CBED9474266C89FC55FF0BCC55602A51A1B5F91E425A1A58DCD4ABD09BBC63933FB4279B9E21298F9FE0CF1A93C4A19695240E8978D604047ABC7239F5053EA650D781307C50DEC4D5E2360ADEB9AA02C0F6FEC5784784A271169CE456E1C32BF984C3323656CCC588C97E0ECE5A40FC7B4DDBDDDB764EDC512DE63270F07891BD160F78B8ECD3A4D11EC4C68EA0A0FBD0F23AF9AB261A110F431F926C4995B05462E0DABF29D9660ABBC660C9A675628270CEA7EC5AE9B6F298B17B2392263700B8EAD9C845AD29CCF109A2ED66ED5BAF9C935754AAA1B84BE2B5339F9BF3CF5E80AF16967863FA8DCA64F5FE873DA4A6D33E39A592749B721FEC203C0CAC527CA96DE7A96CE9A540F5DA1902C97F960A05EBF0C32934F9B81244C945A60FD3F176DD8C261690D8EC98D19607129A50EDD51135FFBAEBC04A0961ACC5A32FD058FFDF2C6866BF90A3E177787E7061BD2011EC08EC118EF0451CAD010B53C68D0BDDC701D10920D697EA3439B1A0F96E6256B7712F59C746D1C74C20B17D461C3DF635EEC83E3B8E098034F119B9D9A79ADA735158EAC3F434E805444D5EA2EC85CC8ED8F5BCCAB7DBB6ECFC2E385781579AF1263D9FD32BEE32E01DB94703B5C756B894DEF19783B12BCE2A1A8D29D96F329CB0791D697BE7E0F05DD5C9DADA52E1B8C1E5F75A0FC90ED8C05BDFF86644B1EE61989CAAA271061D4222818C894AE9ECA2DA7326E5C24CA1EEEBE3720D2127BA997B0C572AE30615F8BC4278057F4762D46A39B934DDB2A0903FE1568C1BCC6C37E1F7C145EB7CB20A6A4B3466A7ABA58B48BE94F7E14CD20C87B2768358D06E3F607FE5E9DD1AAA8477975660F1E379B9EA26CC00CEA8CFD6420F2FDC7EE6393AA17CEF88645B821F8F42FC7DD97B0E16C04631F86ECF1CB76A6502FD1C13917CEB26A83596B117D5336387DDBEA56162E8A5BF2FA35E697245BC7210CEC13BFA694AE884582924168BF8EE2F61A734E37876F363225E5AE19B7C65CA6AFC31C8B37BCCB308A9C27F3E9902DE365E288E6CC46E329E78BE914B85EB980C0BAD932C164671ED395D5D8317C133E2E000A10E0D20D0F408019B33D9A87ED7725EA4C5ABAD67E0CAFBFF31DD236E59DEFAB7FF2CB40F479B56B261A32656F016DECA5302A336CA15D10E0AFCD168A4B922B79C11CB21881220374492D64DF21453B41346A85174A0A4A3C1E973845C856CA70D6D25BB854D0C6BD3C75CD73998C7F64E35A58DCF593C85C2440A6ABA4E470F87E6F9B4ABE127B30F8992D8AAD0BE38F008D9D937582EB3AAFC68F516D5AAF2503ACC96E59A151D2D4B072AB6B38C54928D6656441C709F1C1B770CE6EFCECE11F8B3602EAB63E0C629BBD8A79A96BE4CDB072780F3D287B091FC94FF2C0D347FE280BBAC308644BDB15A3C653863EDD945AF0AE725507507B82C283DC9909CCACBCF357D7A19703401B6E4474B94A6CBAE575B942501A281B8166FDC70E6B4B60C2F57A4D66FE1197D301D0E0C7BEC12CEDF9496BCA2183D04632711A79C8374B6DE35C2EECB0239391C2019C720894BC7A635DF18FCEEB9AAE16B3CE92717E2C56903D20D0712EF80131B8C48635163E97EFB1FABD1500D061C93AD935BE9A65A45A92E4A4E885268E712EFBE5337214701BAAD4C73E81E73BFF19AF131F0ABA105BAABE849F -pk = 10BD7BEBEF20867BFA68E380E0BC7A5ED222A11279FA990C92DD2A1B1CE78A1A270FF9A104DBD20C76CDA3575DEE0FEFC0EA2BA9AF72DD57809A8C4A5DC54905 -sk = 10BD7BEBEF20867BFA68E380E0BC7A5ED222A11279FA990C92DD2A1B1CE78A1A270FF9A104DBD20C76CDA3575DEE0FEFC0EA2BA9AF72DD57809A8C4A5DC5490502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019B2265E11DA1A693822271FCD7E39FB8CEDAE66BF406FC013A3FC5B259F159A73B5A1776A69D9018969E776528B04000000000000004CF91FD1238A1FE61BA067DCF33CBEC4823471D87FE27277EAA07827C4E2D08BF574C0C0D4638A9B1C0D4E0D7734FCFFFFFFFFFFFFFF70AD84A823D341132C39C90DBEB1C1BDDAD182E1E4BCAA9C6FE742EBBFADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6DE24A8DA862B5765034CA0AA59E690463A3D3C673C76DEF02F3C24A7F060000000000000000000000000000000000000000000000FCCCAF1812F3CF8559DBDA1E041F0B510012CB31DC8EAAAE5F43A5EADC965B2DEE90FABBA551CAF82DFE85072F3B860CD22014F98FFAA1C9D6084C80DEFB381768F5CC64F81C9E3E97D8854979E62BCBEC2A21C388C6948DDF0AC498DF4EDC0890450D62C840DB1D9255E9977F4668AA068365896CAE2EE44A54C80F0E3D8B0ACB1A34B232827AD848EDFD91C6B4A08CE718440F749D2F5AE0D2B7FD35C0E7171319D16C5B8E179061B906C70E6D08255772CF3A2827A38FFCC391A059857B02CC999C87A43C4477396F8E3845DD09749A110E6B937FDEB9A26AB2B61742730792D42E4DF3D2F3262F6B0151E95D64528A5D643385DDEED4689D2E69E20934281AD878C1AF5D95A3F06C1F810919D38976A40C952EF7AACA510D930EB42E9909C8CE179D56C198CCCA31D6AB0093FD94D520E2B16792368589F76D835289CC1BEFF7C62C330A195E0F6818E6CDAC5F52EE691084304FCB7DC1C9791DEEC989205EAD1D7B42D7213941E214712B352E58C843BE55DAA180C3DB892F19F3A0202EB699FB33BBB992869FE3CCF9562F4560A41B78A978FA095C0CBA770E850E1F0CF135D52F4EA1670C2B44B8B5103E9201546FA977320D578017FAB19782D3A21A -smlen = 2982 -sm = 32B24F81ADC4A56FA3002461BD2F32F534BC390129B99F4201F4A7E96B04B048483FD3001897800695452024A422F9464406460E4EC69E2FFD6E9F0767971240B2A1DFF308069490DEEA79AE5A821902AC18869273FFC35EF503D3CF514A15469EA7590068C3792202C9A21E5007C32DF4E1A263DC406B062D0FFB8B44CA411D7C020B4D49E51167A9D4E50601EB4C1BEF0AA1E4D78357FA40AAF0EF540C019746E82967338CD45B05C18637F2819D0902A7E941D3C14E2DDB4F971C9955868ACA753A73E8EC6845ED6E9D3B444C826480F03AC771F92E94380BCA7E50303FB79CBA608E351A1A67BF217B9816E2AF9F89BE8A79F661470CA16BFB2C99EFDE97859AD1D217848289EAF543005F5C231599FF74299EC2A7C737FF94B7465DE11F80E17D4FDA264DE568D8767CE822B3AB9642D95BC89533CE05FB331B86E3C5A296E4EA4C637EA458BCED1F89355C0270D083D4920E72112CA1ED486191748B4F730ED52F9803D05A0F2F065BE03B2603D6CDB154DD7765847D656B919B08969E41B23F9D376135BD5D924529410392ACEB004849550E6CF2903181C9A395FD469B7DE2C5060ED22922AA4D7C782A33330714A0AF206B29B4FCBE0F12C18948F6634FFD7F2710138020E273CB0DFA735BDCDE9BD6CEC898C5E564EC71AA7880D97CC711412F28603DE293CD5E904E9156D4F6BFE2BE15347B9FF7848EB51CD0785D6A649EA3514E02695C7E3C4F021A9992D67BEA1D68E5B17DB2E0DC061CCB5ABABA49D110055467F9DEE61ABA8F3E5C713E94A8A96C3A8AFB698887C1FA4ABC5157CED33A834DBF0F5AF9EECBB5F2AD7B63B4C2CA94A117C2B92F3D51900926E26B101FBE6207AB0884CBFCB15F9F98F95B0D08E29390977F4D3DC710EEA3AE7433D5EA87A5F710F1FCEAB26D516FC19FD272F6B0F01EE167F06E6C33273481F280CA64FDA0549C8DB884FDD467B93998360766D4CAC4C8DE783752FB6C6D7B1E47DF23CEECA572F2AD3E2B628E31984B9054448ED1D90658BC658A9CAEC0485512CE084A535E7C8196B8BBCA5D26C105C41E083F8D56F1530A8C1B36A7F3E41FCCBAC7F342B2D026064B304444192D4873FC57978E44151896EA6C0F13D017F683B203BA1DE677ED00F2B737C4C69E53ECF16AB918939E120E9FE14B2243EFF0116B24C6654BE09C582F1E62E75EFD8593E62E45AC36F717815B854B47A4DDCFC91FC533FA85BCECB6E560CF11E46D2F334B396D68B275E7404A70F2A805A64CD458A8E5F114A89124BA1866F917749FF32E59EE71948BD97F2D4128BEAB8BB0B6B06D84C6D466BFA30FD8100E48D951D0B3E787EF9611A56FFD64D970DBACFB1B4DF064B1CB5DA9918F5C58A10F0903B64286B1C1AE5CBD00EB8B363BDD7A7AAF2111C0C6E86E15ABF6C1E761FBF027425968CDC19522B44FF3F56335C59760FAE6D9028E76B284330F7510F2B55B6F46ADF90311CC785D35C2BB49272BE514CFBBD7A2B7B2E8C0B6DC28CB683D3D581F547F83BBD3B8C7B76925E44E6DA89D5EEF17AB0BF4213EF9C05B7B473901D483C647F416B98478C7100919C28515B617A27321841BAA174C1A2D3494395294CEBD48EEA14BC3106CA9C69D9F6485D6ABF1C2B1111A8BC602454685CA61AB4EE4DB9F413CAF8F0F204F04D40CD36FA5DAB629CB53876DB3E16372E626B6BC892C63C6B6C503C9D22EFE113927395206BDAA4B83D4FEF4FEB42FA7A71F7CE2197FE282A02D0FE50F96B1F917A67E50EB79CD3FFEF064542F7BEB51AB05B56AFD7AEA5F4164CC9BA37D8FDB35A3DEACF0CFB555161E7E41EB798160798BE9D01E3DE0C4288E0BAB19AE398E94353ADBE9A43524ACE35830B82FCFD4B1DC2800CA4C38A56B7CD28BC3E2F69A0AC4655CD79B5789A2B72EAF93B018D4D6F4C983D08932B22C85AF6FB07DF0A786D98820E1B06BC17F62D6E39739790A13049252F1B9102DC692CEB20C270FFE9B902AB7EC5A4EAAF47F7E2D31B2195F5F48AD18D099C33384141DA14E151BA57F6B1BB97901457202CDB83B5C713BD8A13F6E3E276C7D6C130AE287CA8931D9EECE06AB7CCA124D6D02D497D55EA9151A95E8A4DCCDA72D3F51A7DB3F2879918753683B01BA1B154DA83E6D84DDC9492F2DD8C128A30C75174ED1A6B8D93D08645270BDE247782E882418EA158B2A2153B2D8F75C09932F324EC199D26E9F3C4C4CECD807367E3981E137858B98BD1268D2C894541EC99BBBAD19A6856EA16A1E56B7B193BAF79AB89D4E76327405658C4ECB5A8626302B3A4618AEAC7E11A1199C4BB08C60AD78FEA4827B59CC883B2CA7038D7845106DE9174B2B8C17267273D23418AF560265000543ED9886884912B4160FBD372FCDF706EF642CF1829493884B6CFE946ECF6140106DCBE11B3746E33FBD4B5852B732230B9047004F4FAFA0D4BD7043C7D6595ACCD1B2771AAA76FE05A0C80B7B221DBEF79950FC69147816CAD0E52C05E72CECCF55FB4DABD81ECDB476417DBFDAF3B555CC90573CBED9474266C89FC55FF0BCC55602A51A1B5F91E425A1A58DCD4ABD09BBC63933FB4279B9E21298F9FE0CF1A93C4A19695240E8978D604047ABC7239F5053EA650D781307C50DEC4D5E2360ADEB9AA02C0F6FEC5784784A271169CE456E1C32BF984C3323656CCC588C97E0ECE5A40FC7B4DDBDDDB764EDC512DE63270F07891BD160F78B8ECD3A4D11EC4C68EA0A0FBD0F23AF9AB261A110F431F926C4995B05462E0DABF29D9660ABBC660C9A675628270CEA7EC5AE9B6F298B17B2392263700B8EAD9C845AD29CCF109A2ED66ED5BAF9C935754AAA1B84BE2B5339F9BF3CF5E80AF16967863FA8DCA64F5FE873DA4A6D33E39A592749B721FEC203C0CAC527CA96DE7A96CE9A540F5DA1902C97F960A05EBF0C32934F9B81244C945A60FD3F176DD8C261690D8EC98D19607129A50EDD51135FFBAEBC04A0961ACC5A32FD058FFDF2C6866BF90A3E177787E7061BD2011EC08EC118EF0451CAD010B53C68D0BDDC701D10920D697EA3439B1A0F96E6256B7712F59C746D1C74C20B17D461C3DF635EEC83E3B8E098034F119B9D9A79ADA735158EAC3F434E805444D5EA2EC85CC8ED8F5BCCAB7DBB6ECFC2E385781579AF1263D9FD32BEE32E01DB94703B5C756B894DEF19783B12BCE2A1A8D29D96F329CB0791D697BE7E0F05DD5C9DADA52E1B8C1E5F75A0FC90ED8C05BDFF86644B1EE61989CAAA271061D4222818C894AE9ECA2DA7326E5C24CA1EEEBE3720D2127BA997B0C572AE30615F8BC4278057F4762D46A39B934DDB2A0903FE1568C1BCC6C37E1F7C145EB7CB20A6A4B3466A7ABA58B48BE94F7E14CD20C87B2768358D06E3F607FE5E9DD1AAA8477975660F1E379B9EA26CC00CEA8CFD6420F2FDC7EE6393AA17CEF88645B821F8F42FC7DD97B0E16C04631F86ECF1CB76A6502FD1C13917CEB26A83596B117D5336387DDBEA56162E8A5BF2FA35E697245BC7210CEC13BFA694AE884582924168BF8EE2F61A734E37876F363225E5AE19B7C65CA6AFC31C8B37BCCB308A9C27F3E9902DE365E288E6CC46E329E78BE914B85EB980C0BAD932C164671ED395D5D8317C133E2E000A10E0D20D0F408019B33D9A87ED7725EA4C5ABAD67E0CAFBFF31DD236E59DEFAB7FF2CB40F479B56B261A32656F016DECA5302A336CA15D10E0AFCD168A4B922B79C11CB21881220374492D64DF21453B41346A85174A0A4A3C1E973845C856CA70D6D25BB854D0C6BD3C75CD73998C7F64E35A58DCF593C85C2440A6ABA4E470F87E6F9B4ABE127B30F8992D8AAD0BE38F008D9D937582EB3AAFC68F516D5AAF2503ACC96E59A151D2D4B072AB6B38C54928D6656441C709F1C1B770CE6EFCECE11F8B3602EAB63E0C629BBD8A79A96BE4CDB072780F3D287B091FC94FF2C0D347FE280BBAC308644BDB15A3C653863EDD945AF0AE725507507B82C283DC9909CCACBCF357D7A19703401B6E4474B94A6CBAE575B942501A281B8166FDC70E6B4B60C2F57A4D66FE1197D301D0E0C7BEC12CEDF9496BCA2183D04632711A79C8374B6DE35C2EECB0239391C2019C720894BC7A635DF18FCEEB9AAE16B3CE92717E2C56903D20D0712EF80131B8C48635163E97EFB1FABD1500D061C93AD935BE9A65A45A92E4A4E885268E712EFBE5337214701BAAD4C73E81E73BFF19AF131F0ABA105BAABE849F - -count = 85 -seed = 30F0E117513AAF27AB2516BCEADD1188B4BBDE76E57DFAF43CBF2D70723D941E8F875C5EBF02BD7D67AE81ABCC54440A -mlen = 2838 -msg = E43EEBE157E43D9F54130C668A153907D65BB19856A1B7C2FD5E2C770FD6BACB13BAEF951EB758485C128ECE4F3E9377A58A45EBA1C3A9CA5C94B50714088700D6FDA933ECE3A6989EE77A824A9E99674748A90B7F227B589250C9E156A8E50B74A7F49DE036FCED86CA0D4C02E217EEFCAEF7234F651CE4380B86389D7331C7657AC283F58C781F904405ACBB68661310EC6921C1FB7483E74116378086D4A0C9A52AF9847BB3CE0FE97F5A7C2CF588DB3B6FD725CA83391656CB38FCB6D79531E56F5D42FC0CC20D04AD7BBF57001BF2F8E6B335CC57CA2DB23C247EF9B75BBBA3159030975D65B9AA7C10E0FA4F615F77126D5271129D8839A3F8DA30C79174373C4BA643E4C4F0CB26BD5B8B9F7EA56DE459EDA15037D8772478FD9F7F7E06F3B422DF0B425DBF1E91D3893CE20F78CDF1910C5D4674EFADF122F41D6C7D6290DF59FA029BD82E792E758AD4388F9D352E9D2FBE3E58810C380D1CC5768865D24BDD92145DBD1EE0D4724C769EF5CEE12DB2AE2708B4C8C7865E70CA31386388D991D46C4DC4DAFC5CE66CB24D455BEE01488A7C764A308C7054572FCA0CC74A01A2B1F191C54146FB1AAF55B834F998B50909F3D003271E6504985DC836B5C44655B938769639799F2575BCFA92F13D32B283A5BDA11177CE1F66D6B30788415BEF598773E87B4C8C41F0CE6633B6C945A3B4C46B74F30945EFD99CF3709FDAFAEB4BD4C6BF605F89C7A9B4EEA1A6599F0A32CE3F2C58587EA8BB3FE6495D92F2FEEC52BEA3DE2047F5EEA7EA1453C762201FF1291AFA87923107F7FF586E00D07824EE021649ABD2D6E9EF11A1D31726EA9277134341EC57D790949590A963D25D6FADFA9CA21E43ACB7E5ED4CB6E8BB36377C2618997943CD100A927D395376871ACB9619BDE9B1FFD5E48E271952613875FA3ACD3E1F2E872F1D672AAE6E2A575A4FDC4FAE2DC6A7196E7EBA94AE5B49BE41E7295433ADF49A6D2D945F43699D444A726423CD9164B9E28B0AA4485B0C767A9398DF5DC5F23D27889C14B1ABE98880E7BD5DF9AB3D1321D5493A0A8B91EA4827627A9B59308CB0104CD8DA7D9DEF2D47B27074BA007401415E900DF03F251C8AA425F0FA59D74C41BA7A9288C8E280141CAAF6C6932DDC4184F81F5C33F0FDA005BF3FB6A0A9169A709875AE475302D57CE96D3DB332188202597FF29D1F9EBAD2B0FFA27C14CE9CCA58C923283BA10E9FA1689D6C2B8804225D706E09FF97AE9CEDC27D256E8736DAA54382040648F2F6BFBECD6C3A9BFAF5D1ED23EAD00EAB351F1E0BB4C719AE6A1F5D12E7F09ECEA62A2F554B18397FE1400DA1EB6694635D7C9C626E0FC82CF8DF6AA4CA88B69F78CD065C53F929BAA58507FD3E3D8124C4BF287D452AF47AF9F4D926DFDB529A8ABB8BB57C5C7611A97053A0CB0B01C754CB479C6CD3A3E867BAC33E45EA0BB6BF77E0B2EC2F136DAC0E259FA309FB5F6D8E7005E1696CE203C5D054E5927A87A1B4E81E73F22FAFE61D7D64CBFBE519D39E716BDCBB37657E71B9390FF04B3C01C6F6842684115CD7F5AAC208EEA48906890248E58D1615634CC1263CD3ADC14B67F1A1A8ED2626E7237AF5488F5D269973F11458E3E4FC2EE35A4BF49C2F5F2361939FA243FA8F33B54EEEBA9B0453701E367A7BF4D698C62DA64732652C68C20A956522826F8E29A764BA93DBC98FCC87E59A1423886694057E131333C5DCDFF3BE7A1F0D344A2DEBB90051721E0226178DEED353A136F69481F83651BE3281C562D6127914CD24C38FFB327786086B08EBE89D03A33BF7B5DCCF90DE9C4D907D308E08A616C5343C116A098786383009DC70787AAFB4529CD27CF85F946B8B238AD2F00DF109FC84CDB48BB52B73E1DE066636176E8C6C76216105486C553511DF1F0664EC1E04EE0B0BD74A08070207486B7F326C3EE73188AB5BB7F8F5643093916491D62F0DB18675BA4CE90B2AB310BBA4705B65A581FBC5E76842A99D4926AE5BF7B8EABCE5FA30CB98C1BCF0E0708DA970096234D47BFE23A4F9ADE29BE5A8B6BBB748EA1C13D00388AC90B65EE10BE6A9AC422EBDDAF5482422AECE19E702F6D26ED954D4E489CC48B2E39A6F168E98E11C1DFCB4A843354F1AFD447962E5090CCF51DDF6643CE0AFAFCF3E4363187E69C31AB796132EEB04F2D4976A576B9BC8D9B1D491B74613C1AF32E3D2DEF408ABEBCC27E4A915C983E10B6090FB2DE6FF9E60C96CF4F940B09AEC048E7A174711798FD76DB15DCAE0E570BE3AC147E2F8777A522555B0898BCD7B04ABBF060FA72B04604C9A583FEFD02B2AF9FA035F97DE4DAA4EE777F9D6985149DB6C2F0A33EE1A1436B38DFDFF87F831E83399C6A884273E612433EE3958F37C99A748DF151E3EA011F4DF5F0050597685E0230DA1B1C7095E1203EA7099BA5C43E58AB0EDA60AF65291C3CC9A07257D71CA6C9EAB93CEF41294853A67A5B11F9192C96A36C701F142DC36B046218BEBAD9904FB765550598F8E2F49F5F0AD2608117196751E7E4C5CC4C3EF425A921C1EE15F37A1F80DF1E24163CA145EDB0FC4D988B8C7167ACF9CD94F919AC96E5469859FDAEC54E1970007EB9699342A9AA044A8EE478A3ECF8B59B0109EA7640C218ECC1E8CBC5E2FB61A1748B7C038EFDADC2D096BC29D95B1BE770D097AFD8B0FE02173A1B3D7110F80D6C849F1AFD1B01A60894B16140F9B34D96071A753545159C4FFA4DBAA938BDEC287C6B83751C5E699724AB355D1FA0E081DB286EC83343877C520E856C4ADC65322AEB39CD87B7D8E4FF9222E085ED84C58B7FF513AD77F8A9EFF2760A03F69AE5DD14DD92DD3F2D3D98E97B1987086B3EEF2F2E822C851B7ADD83903786C050F30C4A4F4BA9361E49ACAD503E2A07EA119752E12D4FA09DC83F7A48EE3DCC1F09475960B6839CA736E498A128F78E58279063D839ABA88AC9E5BC24BC07BBD2DE1CF2E1CCC5987E63F83780D0ECF07EAE21C8C752529735B37C980EB320DC949468C69B17DA8AD612825A84D0529EB97FF8C4CD225FDFD1563BB6C5360ABDCB3339434A298DDCF5F36188F3AB501E505828E8D2FD6DDA062AD415C56414FD7557170F0F57BC5A401FA648699F3C7F7FD8F1F058849B817FADDDC24726DF851D3644414F55CADE30A5764914675D574EAD4D4DB8725866A6C51BF0EB23B12FBA1E101A6F3BDB98A2884D0F2B8DEB3F279E9C38EBD0209DD05C0FCC6EA715257355D0D6BE2C8BC7835187CDAEA43A8EF9C59E88AF6AA667A697A3DF8BDE250EAF4341A835B5EF93CFF97656133B49E13213949A3F368D985E0D6C793319F4284DFADA383137DC5B000B7FDD85F27865DC633562949BBE4FBFF75417AB109F03015BD0F67728969435EFAE791AC72C6AEF99A385A3E8B4C35F58380149C653FD78391A7C3B26A3550D37F9639164979288BEEE99E36AC6F44D0FCBAF0D210839D563A6249059A30CE6F047F5D541FC8A90A18610A8BEFB9493C5AC804D34D40881CA82E673788870705BCD585044B11F1D9BBD6B17D8B82B7CCC0554D1E3AA7F2762FE01385571C9FA7A103D07C1A209504876189DE4B3C5910C26C5F33EA725A7D57CC30A6EC8F3EECF2409F1234A094556C0F7941CFB30FE86F208FEB73C8E8EA8623640AFBDB1CC589768A714CF945731DEBF4519B70870FB3A50F1FB368ADA3FB217704A5D46D879CEFF9BB72667ACC673CB196AFAA0DB1160CC2CD7B260DEB791A94D0988ED54B7E45F33E7CDBA0FA105F3AF3CB1521EA382B1266DF304C900BF53E195CED03871A22C50DA166BB9441CEC83607083195D6CFA17297B678ABB5E03950160130B47E25713B0829F64D2552EFCF404F65798A86D5899B72150A91BA00F7DFBFFE82531497B60C31C28992377A2DFD5FAC8A9C16C835CE4DC24D0389277E6355C655C8A33C89BD48F55C13EDE24B9BB348DEC89612F0905719743C95C0E8B5653855676CE171F812ECA405B6F96F2212D1A5369A11379282AC0C5AC41D -pk = 72640A8F36A186DD365B937F5BF32ED2FD8D8D1CC7475EE762A3FA890540011BAD98F1327699C8841500AC670EB08A81EC1A11025CBA22A48F666A62574F482D -sk = 72640A8F36A186DD365B937F5BF32ED2FD8D8D1CC7475EE762A3FA890540011BAD98F1327699C8841500AC670EB08A81EC1A11025CBA22A48F666A62574F482D020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E56857CD172A93E2AE650889E6B07624522B1E56DFD476295EA3C33EF20E78427655F79E6C04C0DD7D53D29E3EDF0400000000000000880F5894891090334EF9F5769D8F0EBCD872B70B009D8B4448169A7F36E5D667FD5CAB9AB93FEB8AE9C43255194AFDFFFFFFFFFFFFFFE07DCD2ACF69C17DBB9D85B475E3C2B92D121D28E174E1187673CCE57DCE00000000000000000000000000000000000000000000000085EE85B6CF2F38EC0ACC0D35C3B4078C9A775070933BC014BDF16FD528390800000000000000000000000000000000000000000000001DFD451D69FD45737141B4C5AD92CAF6521AC3F4FE26ED448A12EAB104BBC52FD25EDA6C54330ADDE617555F19E63C9BBA729723294101AB96654C1937D7F00D63EC514ED240AFF60EA82846B7A1000E95A7B50201B04EC4C276FF0D0D9D31152A5A8325D768B69C661BB01D9EA9252B2E7772677079DDB01CBE919E9F3FB008C124FEB584715438ACF88EDAB24A0D3A135FDF6EFB07DFD66E01EADC160D411B141C5CF19D0CA7070350436D1147BC3217F9D389F0134A66B60ECE23299DCE02C115B3216B3CDAECB2B70FB6DBEAF6E3B00D13E6EAD410F82041E1AD927C3D2D304C5CEBAAA0EF7D9786EBDA299B7B8602CA91B7FE8AED1A0F2B66B397FD5F2A87E8A4E130F57FBD1D2EA8010FB4905FEF2969862E722BB0BDB19CCDA90A8E05DF46BB5143A15B403D1B87493C06120BD61937DAF77AFB29F677B60D7FAE2F2D3AFF8C9AFD9BBF05EACD83368AA859F38869AB8DE22F63307251B9FA47255206022A0ACD3BAB3E5B2068C6AB7EF010FC8AAFCDBDBF8DC3C3560D647A86DA5631E2C5C5BAD8C5F9B535C0AB836EFC9D85B92F8EA9BDD7B767B6CA5C28A3F70C29CE49E8CF26180E07C4738D770E4E1113619DC570C8F1481A8837B5F26B752717 -smlen = 3015 -sm = 9AD664040D76841A5700DA94B4E472677CCB3A03DF93B4A5601F1731B5041D2D3899521D2841D306AB3DEAFA3B1677C32803CD231310EEC2CFAE08035799A8199E250F27B40679D0DF7A020EF6DE3A006CDF52D934583BC17603646DC3BC53B5B8E016046790EC3DC2FD218EE807C429D105285EC1A37003A42F16B9501FEB03BD0254CE31A58C432E2FC2020131F07420C26B4AD84A6DB856311016DB0E01D915B64F70EED0EAB602B653EF7D58A95801E43EEBE157E43D9F54130C668A153907D65BB19856A1B7C2FD5E2C770FD6BACB13BAEF951EB758485C128ECE4F3E9377A58A45EBA1C3A9CA5C94B50714088700D6FDA933ECE3A6989EE77A824A9E99674748A90B7F227B589250C9E156A8E50B74A7F49DE036FCED86CA0D4C02E217EEFCAEF7234F651CE4380B86389D7331C7657AC283F58C781F904405ACBB68661310EC6921C1FB7483E74116378086D4A0C9A52AF9847BB3CE0FE97F5A7C2CF588DB3B6FD725CA83391656CB38FCB6D79531E56F5D42FC0CC20D04AD7BBF57001BF2F8E6B335CC57CA2DB23C247EF9B75BBBA3159030975D65B9AA7C10E0FA4F615F77126D5271129D8839A3F8DA30C79174373C4BA643E4C4F0CB26BD5B8B9F7EA56DE459EDA15037D8772478FD9F7F7E06F3B422DF0B425DBF1E91D3893CE20F78CDF1910C5D4674EFADF122F41D6C7D6290DF59FA029BD82E792E758AD4388F9D352E9D2FBE3E58810C380D1CC5768865D24BDD92145DBD1EE0D4724C769EF5CEE12DB2AE2708B4C8C7865E70CA31386388D991D46C4DC4DAFC5CE66CB24D455BEE01488A7C764A308C7054572FCA0CC74A01A2B1F191C54146FB1AAF55B834F998B50909F3D003271E6504985DC836B5C44655B938769639799F2575BCFA92F13D32B283A5BDA11177CE1F66D6B30788415BEF598773E87B4C8C41F0CE6633B6C945A3B4C46B74F30945EFD99CF3709FDAFAEB4BD4C6BF605F89C7A9B4EEA1A6599F0A32CE3F2C58587EA8BB3FE6495D92F2FEEC52BEA3DE2047F5EEA7EA1453C762201FF1291AFA87923107F7FF586E00D07824EE021649ABD2D6E9EF11A1D31726EA9277134341EC57D790949590A963D25D6FADFA9CA21E43ACB7E5ED4CB6E8BB36377C2618997943CD100A927D395376871ACB9619BDE9B1FFD5E48E271952613875FA3ACD3E1F2E872F1D672AAE6E2A575A4FDC4FAE2DC6A7196E7EBA94AE5B49BE41E7295433ADF49A6D2D945F43699D444A726423CD9164B9E28B0AA4485B0C767A9398DF5DC5F23D27889C14B1ABE98880E7BD5DF9AB3D1321D5493A0A8B91EA4827627A9B59308CB0104CD8DA7D9DEF2D47B27074BA007401415E900DF03F251C8AA425F0FA59D74C41BA7A9288C8E280141CAAF6C6932DDC4184F81F5C33F0FDA005BF3FB6A0A9169A709875AE475302D57CE96D3DB332188202597FF29D1F9EBAD2B0FFA27C14CE9CCA58C923283BA10E9FA1689D6C2B8804225D706E09FF97AE9CEDC27D256E8736DAA54382040648F2F6BFBECD6C3A9BFAF5D1ED23EAD00EAB351F1E0BB4C719AE6A1F5D12E7F09ECEA62A2F554B18397FE1400DA1EB6694635D7C9C626E0FC82CF8DF6AA4CA88B69F78CD065C53F929BAA58507FD3E3D8124C4BF287D452AF47AF9F4D926DFDB529A8ABB8BB57C5C7611A97053A0CB0B01C754CB479C6CD3A3E867BAC33E45EA0BB6BF77E0B2EC2F136DAC0E259FA309FB5F6D8E7005E1696CE203C5D054E5927A87A1B4E81E73F22FAFE61D7D64CBFBE519D39E716BDCBB37657E71B9390FF04B3C01C6F6842684115CD7F5AAC208EEA48906890248E58D1615634CC1263CD3ADC14B67F1A1A8ED2626E7237AF5488F5D269973F11458E3E4FC2EE35A4BF49C2F5F2361939FA243FA8F33B54EEEBA9B0453701E367A7BF4D698C62DA64732652C68C20A956522826F8E29A764BA93DBC98FCC87E59A1423886694057E131333C5DCDFF3BE7A1F0D344A2DEBB90051721E0226178DEED353A136F69481F83651BE3281C562D6127914CD24C38FFB327786086B08EBE89D03A33BF7B5DCCF90DE9C4D907D308E08A616C5343C116A098786383009DC70787AAFB4529CD27CF85F946B8B238AD2F00DF109FC84CDB48BB52B73E1DE066636176E8C6C76216105486C553511DF1F0664EC1E04EE0B0BD74A08070207486B7F326C3EE73188AB5BB7F8F5643093916491D62F0DB18675BA4CE90B2AB310BBA4705B65A581FBC5E76842A99D4926AE5BF7B8EABCE5FA30CB98C1BCF0E0708DA970096234D47BFE23A4F9ADE29BE5A8B6BBB748EA1C13D00388AC90B65EE10BE6A9AC422EBDDAF5482422AECE19E702F6D26ED954D4E489CC48B2E39A6F168E98E11C1DFCB4A843354F1AFD447962E5090CCF51DDF6643CE0AFAFCF3E4363187E69C31AB796132EEB04F2D4976A576B9BC8D9B1D491B74613C1AF32E3D2DEF408ABEBCC27E4A915C983E10B6090FB2DE6FF9E60C96CF4F940B09AEC048E7A174711798FD76DB15DCAE0E570BE3AC147E2F8777A522555B0898BCD7B04ABBF060FA72B04604C9A583FEFD02B2AF9FA035F97DE4DAA4EE777F9D6985149DB6C2F0A33EE1A1436B38DFDFF87F831E83399C6A884273E612433EE3958F37C99A748DF151E3EA011F4DF5F0050597685E0230DA1B1C7095E1203EA7099BA5C43E58AB0EDA60AF65291C3CC9A07257D71CA6C9EAB93CEF41294853A67A5B11F9192C96A36C701F142DC36B046218BEBAD9904FB765550598F8E2F49F5F0AD2608117196751E7E4C5CC4C3EF425A921C1EE15F37A1F80DF1E24163CA145EDB0FC4D988B8C7167ACF9CD94F919AC96E5469859FDAEC54E1970007EB9699342A9AA044A8EE478A3ECF8B59B0109EA7640C218ECC1E8CBC5E2FB61A1748B7C038EFDADC2D096BC29D95B1BE770D097AFD8B0FE02173A1B3D7110F80D6C849F1AFD1B01A60894B16140F9B34D96071A753545159C4FFA4DBAA938BDEC287C6B83751C5E699724AB355D1FA0E081DB286EC83343877C520E856C4ADC65322AEB39CD87B7D8E4FF9222E085ED84C58B7FF513AD77F8A9EFF2760A03F69AE5DD14DD92DD3F2D3D98E97B1987086B3EEF2F2E822C851B7ADD83903786C050F30C4A4F4BA9361E49ACAD503E2A07EA119752E12D4FA09DC83F7A48EE3DCC1F09475960B6839CA736E498A128F78E58279063D839ABA88AC9E5BC24BC07BBD2DE1CF2E1CCC5987E63F83780D0ECF07EAE21C8C752529735B37C980EB320DC949468C69B17DA8AD612825A84D0529EB97FF8C4CD225FDFD1563BB6C5360ABDCB3339434A298DDCF5F36188F3AB501E505828E8D2FD6DDA062AD415C56414FD7557170F0F57BC5A401FA648699F3C7F7FD8F1F058849B817FADDDC24726DF851D3644414F55CADE30A5764914675D574EAD4D4DB8725866A6C51BF0EB23B12FBA1E101A6F3BDB98A2884D0F2B8DEB3F279E9C38EBD0209DD05C0FCC6EA715257355D0D6BE2C8BC7835187CDAEA43A8EF9C59E88AF6AA667A697A3DF8BDE250EAF4341A835B5EF93CFF97656133B49E13213949A3F368D985E0D6C793319F4284DFADA383137DC5B000B7FDD85F27865DC633562949BBE4FBFF75417AB109F03015BD0F67728969435EFAE791AC72C6AEF99A385A3E8B4C35F58380149C653FD78391A7C3B26A3550D37F9639164979288BEEE99E36AC6F44D0FCBAF0D210839D563A6249059A30CE6F047F5D541FC8A90A18610A8BEFB9493C5AC804D34D40881CA82E673788870705BCD585044B11F1D9BBD6B17D8B82B7CCC0554D1E3AA7F2762FE01385571C9FA7A103D07C1A209504876189DE4B3C5910C26C5F33EA725A7D57CC30A6EC8F3EECF2409F1234A094556C0F7941CFB30FE86F208FEB73C8E8EA8623640AFBDB1CC589768A714CF945731DEBF4519B70870FB3A50F1FB368ADA3FB217704A5D46D879CEFF9BB72667ACC673CB196AFAA0DB1160CC2CD7B260DEB791A94D0988ED54B7E45F33E7CDBA0FA105F3AF3CB1521EA382B1266DF304C900BF53E195CED03871A22C50DA166BB9441CEC83607083195D6CFA17297B678ABB5E03950160130B47E25713B0829F64D2552EFCF404F65798A86D5899B72150A91BA00F7DFBFFE82531497B60C31C28992377A2DFD5FAC8A9C16C835CE4DC24D0389277E6355C655C8A33C89BD48F55C13EDE24B9BB348DEC89612F0905719743C95C0E8B5653855676CE171F812ECA405B6F96F2212D1A5369A11379282AC0C5AC41D - -count = 86 -seed = 070FFB907EE8AB7152A9D380DEA2C4C4796780FCFD80906C5E489B917A45D5E7EDFE6F37C4420E5480E8BB599FE36451 -mlen = 2871 -msg = C07185E0343DF2A4201649AD5DE4CFFA20BAF5DD43F5E4A6C81CD5143FE72865A7C036A2DFD617D96626995C12EFAD019FF44E0EDD7028F29E3657EE3C0D02E9CE83EF0A648FD7CF183A7BF7C15095E0F9278B14FDF6C983CDCF2987DD0CC085400906DCD0D14ABA60124F4B7494ADBBAE3A8D6052122575F99792F7240EB17864DC6D231721140E43F1110E73EB2E3C05049783B33AAC4E4CA0A248775BAF81FDB03D114508928BEC3169A810296B5A4DAC27E7C7F8D01CF5943CF4D8CF6EE6F9042BB300E50EEA3224D35C9628E38C368EC3B42393FC820371DB6557216A2C2D5A230FE3A7C6BCBDD89A2BE5CDBE7F783BA379B6A4237DB051E6256DCE14DCF641190A956E8E85EB2638736B899ED045636DDB7A351F5A4F4108D9D6E0413F92B9D392495299128A5F4ACCE8C7747C675EFE05ED7182DB51C515B345029440AB61A904D2A390122680C951ED4575515144C5CA80D6F14D1CFDBB5373B78E09D04D0544151CFA1240790CD31165048D1484DC4D11D05057071DB3433DF071B367E00FD38C386DAB689E4DFF6FB421B2A95FF54DC29375C9D1C18A76C79ACAE3D3F35D4CFC385199A4CCAF6C9F0421BCF58D296EC7E0D1B95A6C4BCBAC1271F94E438360A71A6440275591E41389B30CAF2626A865B9E59552CB198A1D4453EBA6D0F6FC491A8A7783B4A8BAEB81E54F9189CE493EFC1C5D830A4F637F2BF43CD86B91637611415C95685FE79966174312FDFBF33A646625F97521B5CB1F008135B824F1D6D8373006C7158E62B1F794AE34548A0C6DAC8B60C559D81580AC0D84034A501516EE36CB4082732918365A5AB787FACE591AB02BE6957AE4BB96B58E2B173DA019D3E0CABEBEBA0AF775779F14BFBA8F595697731522DF3C80CBDEC16F6ACC32659CF5DAF193178307887EF1BE1B48B5806D0FA9868A7FB853708B26873857786B974709C687D6597BCF6C7E476C1E47CAFDBF30B6311ED434C0F998C4065399C59073C1F2BAB1D46104E74EA6C976D416E58BDFD24CCD957CB431870DE5DA8763992EF68BB18075926B0E4E826095EB3B8CAE086FB1759C94B873A1F4DF477E0EE9EED8DFD7C77508B3F0C67F69BE04355ABA9344960639F6DD6B3A956DCD66370338617A365579C5993986B4F748CB7C990344B209785E22A40FDCF8F83061D37C9F1351B4473D6C74ABE6B3EB2A7D62CA0F0C88A0AA8A46973F781DF0126E8D55D3E9C41C2E3884F84FB0A06C484CFA0C9A0DFB8CFD573749C711C7C236B0F2F144E1BA4DB2525C093DEED29434FE43CB3040C5A374CFEF33214FDD2D660398E91BF070A4F5F9746C2F08C41256FD5E955891146FFD38B155987E6A0FC47AC2A5950509B9E2C86B9DD9929378F43EF3935F1562672498C5640A22315BE15B001D4B01418DF8EB41DFE5C570E850582D8916C2E7FC2B728048E24BB9D1E8283615E039C16A2FC61011631BBD8F2BEB24ADF9552CF5797CE05D9D1A7E7F3F5455017B127D9BACD32BAD0CDBD3991BBCAEA5FC988EE7AEC0B1003732F25489EDB0A1F9897247CBC40E60F1DD276259CE19DECCB90067F7293A68B683FB5232ACD2217B8929859109D6852A43892098630A67D72B1CF4BD5D58E20C5C18B85D69DF74EE8CC69BAAC7DA48EB71A160F03B68C6BE87A4919736F14363F004EA3F41DD37FD8E621BF433BCA71E17565E060F3C0F889515D0A8C17FE0D6D734FF756256B0A62058B95422257780DE000557DF289F47910CC272A14BEC737C0715F204C49F03150082DC904A5D170F7383F04F1E355F50F80D5461CBA53490BB2E9484806D369D61FD00ED1EE5BE518D04A24503B1C4C08C7CA084902A3942C04143807203287A985EB3FCAE3C5309410CD9B9A548F54DED44321CE8C2A04679841DAEF7FBB6AA11091D240AFBB467D9969C31C1CBF6B24F8CBFA20CB4CFA404B1310400271664763E9C1CD1B6FE5FF2A0FAE22AB14EFC016CCBB19C5DD5D047750DB4ADDEA3E7A193128A5F4D7BB6358F21B39A44259695904DE3440BB28CF9466B562065C387189EAC2F7522C9385DC2A607F6F9335FF8ADD47C7BA932659AFF69B1F26EC8655BEE4F97FBC846E48111CBE25524873D1DB2F2282D0472A2AAA3CF491C26DDC5E1BE77866A3B692E417E6717A4F4454C56F97F063B9E598865B6F71136D65DDB0F3CDEC57DECD5A57366BA96E4315A88B4EA3479321468FFFF508D23B0701A62CE0CBC0FA37C91CFF5C5A0433FD61AE11A922575F5BAA714DE46A58D6EFC79BDB10C9AF7E9950A61D44B3E17E3B5298501146485B562B1570FF5798B47641D67091CDF90902B2D762E3EFE94C540DE4A28269CC416EDBDDD4D43AC2FA82D638DD9BF11F3BF22FD81CC4BD4759D7D864EEA0E8E8AB71796254B278CF9B650D1FEF38B8437362B2D69ED84C54498331C6899E20C596FEE7CAD9ED8D83D86774AFA6E56A4ED34B0B0842B21CCB67035406DEDFF0CECB0CD089929ED5FFA0CE210822444808BAD99AF603082BFE5C98EE4653349F8A43DB64CF90190C96B0446CC9CD23E0D75B47F54A731E8BCB0A4C67401DEE87876011033D2A526067FB73786FBC1CE696130FCE5D5379CDAC6788875D27C04783B1E2EF41063D57E3D6560D1FF48882C39131C95BAE5A9C9392DAB6CD17EEFBCF61C464A4DBC08447443CBBF3FA80481F3BC1A5806042C07F7A7AD435875DDB1001565EB6B7B872CC6C853F771C1DD5D9C16BC27ACEB3C7690125C1907C7CE904852108CAFE76351269A3D3EA8812FAE4FAE35F0DAEC8E8B186F760005524998BB5DE475E4DF85209DA915BDC972218AE7DB7E2EFA05A7D752AE61CF2F3DC26CA2D282C8E32B4838524BE460971E077348290FA0043FB7616D821A71DDA3A5FB76BFCE0DC84AAEA432DF32B05133A26B46165297EBC45024777A868B8B1B0DD6F97658BE799BD366CFDF99861E916F7CF06C034E4F79594F1BB6ECD9B7347911488928E1E473C4B8C73297F7ED845B9EC59020373EDA57A436C1C9D1459C6114BB6258543D8F4F97B10AAEF5A2E082EA173EE69702D83711FEE6AEE8F6B260D03AB74C3B5D8FDDB81B208E16458511270DD1DA295F25CDE7E44A8349B60BF0C59D4B425C1FBA60D2BCBA47B906D2830D8D5C091DBA756E61620D78B2DFF28407FDC9DA9113CBE82219BB2CC05E11C70D040BDE821AA17B3E981558961CA571E5D5041F7DE047A1727D9C904DEEBE561DC6DBD8876BC77C27322F512D6171BC03871EB0FDECE70F119BACB41D1852220CFF26110EB0EB78E39AA1B2A4C2E78679F53683520C5A57FEA71A8E96E0AED33118DC4BDD035FD88F535B011D9C7DEB6F406A072AE6C091016ED10A5A4EE9827882EE27C535262D1D745AA5231736F2DEEC8A6017BF0DA36B416C98AB71C6824A6EEFF3564665007C9E850FD02A1F5E201B534627B92D21A493DF293DB9F24DE70C7B49A6E07ACF2DB6C90B448681666DCDA318C08AAD08D3E257AF7E774C75DEBE3B3C07AF683735E87F205B0FDE07351849C5AFD07D5722C6AA17B6AC2CC3551C305E6AC31E3601A236961F6618CD3A0F7DCF6F65B8EC82E27E44C8518CDC16ECF79374F796A3DAABE2D5005B25576B35B021497C5A8F9B98DA68D80E56A1CC1044C04DFB11D36CB147EABFDAAFBA0A93FCED8675D7D6A9F999785C0E7346F4C68EB17C0A2409E2F5BD4AC5551FF66A9857C66F642F2A385131377B6372884C417E01BFBBE1CA748AC8969BF2C0BD8944767746D1D57D862795E8ECF9E8A5CA122D0259FFBA822588C5ECCD14CC6FF4B7354CB572F5BD695ED9D85DE131FDD97DD5D6CE7844DDF9F3D112028B5125AE7A77A4AEB2EBB554682A26F457C43FE96D67C90BE7E49FF443478E82D3A48680D737D1260B8210BBE962EFAE6505E496B1B6D4F1042A7B971605E2DC50BE3BDFECC3010B9F5618D3A1B2C1F48888B859E4D6B63CA9D29990B6D502FC22B738B203A83D597B48D73C41860E4E99C57181F5B02F108CA193451025F3B368CF2741244F42B27CB9E57260D2E127CA166B32E0B9C927B247B31619B1D4 -pk = 5301B12CB2300346CB97D6CE354DAF31A057C67C48A9771BC4FF8AFBDCC577168315656A710AB97ED87974D5B7B050DBB6DF9AC175A249EAFCDA2132D78D0D24 -sk = 5301B12CB2300346CB97D6CE354DAF31A057C67C48A9771BC4FF8AFBDCC577168315656A710AB97ED87974D5B7B050DBB6DF9AC175A249EAFCDA2132D78D0D240200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F4A10CC489B8AAD2B0965FEFD96A49FA522F436A7417D2DFBDE245122C9E65D7163D5EBC44662C2D8F0359D13400100000000000000DAD026B272C29F6575E9894C5065235C00FB2D1D162C65AEF5745A804D3DBC56C76A5D7FA0ECDEF69377E0B55F62FAFFFFFFFFFFFFFF5A5B590DBBF8063D2FAD56433E32470F1A1AD8FCCCA7E6D035CE3E2A42870200000000000000000000000000000000000000000000000FEB1D68DA1EE4282EA093FDC6071FA416BECD377FE0E5F53D54E0CE286C0900000000000000000000000000000000000000000000003D90A46CC6F754FDD499565051F36D57A28A88C09EE91DB35E4476A262993A1B0B0F1EABEDCCBB181AC2F2276B37A5686D0D0AB56731D13841DCD6C8B3EA780B7A3210A2650B088CC6C7DE7D2F789F27D07E03DB166AD23BD23DDC87F43DFC1C6A334DECFF3D0564CD4A5EEACC4B58CFB777BDFFFD7007FB99C052E7C5540A32A1B3791F169C5E6852F383F5C88FB6E4561D615BF39894E1FBCB72EF871F1B175B7C613BD57E910F9238B2E1A29AF26E8C388DBF8AD44DB2E893DD40DF62530E0EFF29E376EE4DF999598993550059605F3142190DC5228E77E1C6B2F99DA5217C1E21457B0B6094C55C8DFD4AED7AFEC78936112720DB4CCBCEC11E8239BB03CD1AE3F843741FA7B895531AFB62F4E42FBC3DD3CF1C82F482DE97C68FC52730B68B1C32FBF2C0C72F695FE1ACE124744B12C9CF871FBF073B077D288834DA0C5BDB2FACD9C54E71CCD49F4B1628787082E6B2E110517D21B7FCC12FE7623E1ED36FD4B73D51B4C0395BC8E1AEBC1E14924F44CF2653E779D083BC6D17DB9609E3444B02D546C4729B662BB440F4755E20A87EE86BAE5885D770CB03FEC1991B2AC7DD83C4B2AB235492DA10AA96BFB5F676FA6398E106300B248B4615780514 -smlen = 3048 -sm = E24402BAC7111424260233FF1C534DA55E6DEB0267C7C3B873651354670042E2655B2D19E10CF30353B3F06B84A0F5B71706A6BD8CCD4E3D295D2C0075FC7CB41CDFBCFE3605D764A06E9C2595A3000612670946525CAADB1F067C09C3B498DBA9D827059F1464440B0C58802501560F2F7B61343B8B0A07FD97B63D5463FE6EEF00E6E232C0F42FEC9B840701D133858D15FF2B4638684A66A5F192FC0C03A3486F9CFF78B76109029DDB0CB5D3257C00C07185E0343DF2A4201649AD5DE4CFFA20BAF5DD43F5E4A6C81CD5143FE72865A7C036A2DFD617D96626995C12EFAD019FF44E0EDD7028F29E3657EE3C0D02E9CE83EF0A648FD7CF183A7BF7C15095E0F9278B14FDF6C983CDCF2987DD0CC085400906DCD0D14ABA60124F4B7494ADBBAE3A8D6052122575F99792F7240EB17864DC6D231721140E43F1110E73EB2E3C05049783B33AAC4E4CA0A248775BAF81FDB03D114508928BEC3169A810296B5A4DAC27E7C7F8D01CF5943CF4D8CF6EE6F9042BB300E50EEA3224D35C9628E38C368EC3B42393FC820371DB6557216A2C2D5A230FE3A7C6BCBDD89A2BE5CDBE7F783BA379B6A4237DB051E6256DCE14DCF641190A956E8E85EB2638736B899ED045636DDB7A351F5A4F4108D9D6E0413F92B9D392495299128A5F4ACCE8C7747C675EFE05ED7182DB51C515B345029440AB61A904D2A390122680C951ED4575515144C5CA80D6F14D1CFDBB5373B78E09D04D0544151CFA1240790CD31165048D1484DC4D11D05057071DB3433DF071B367E00FD38C386DAB689E4DFF6FB421B2A95FF54DC29375C9D1C18A76C79ACAE3D3F35D4CFC385199A4CCAF6C9F0421BCF58D296EC7E0D1B95A6C4BCBAC1271F94E438360A71A6440275591E41389B30CAF2626A865B9E59552CB198A1D4453EBA6D0F6FC491A8A7783B4A8BAEB81E54F9189CE493EFC1C5D830A4F637F2BF43CD86B91637611415C95685FE79966174312FDFBF33A646625F97521B5CB1F008135B824F1D6D8373006C7158E62B1F794AE34548A0C6DAC8B60C559D81580AC0D84034A501516EE36CB4082732918365A5AB787FACE591AB02BE6957AE4BB96B58E2B173DA019D3E0CABEBEBA0AF775779F14BFBA8F595697731522DF3C80CBDEC16F6ACC32659CF5DAF193178307887EF1BE1B48B5806D0FA9868A7FB853708B26873857786B974709C687D6597BCF6C7E476C1E47CAFDBF30B6311ED434C0F998C4065399C59073C1F2BAB1D46104E74EA6C976D416E58BDFD24CCD957CB431870DE5DA8763992EF68BB18075926B0E4E826095EB3B8CAE086FB1759C94B873A1F4DF477E0EE9EED8DFD7C77508B3F0C67F69BE04355ABA9344960639F6DD6B3A956DCD66370338617A365579C5993986B4F748CB7C990344B209785E22A40FDCF8F83061D37C9F1351B4473D6C74ABE6B3EB2A7D62CA0F0C88A0AA8A46973F781DF0126E8D55D3E9C41C2E3884F84FB0A06C484CFA0C9A0DFB8CFD573749C711C7C236B0F2F144E1BA4DB2525C093DEED29434FE43CB3040C5A374CFEF33214FDD2D660398E91BF070A4F5F9746C2F08C41256FD5E955891146FFD38B155987E6A0FC47AC2A5950509B9E2C86B9DD9929378F43EF3935F1562672498C5640A22315BE15B001D4B01418DF8EB41DFE5C570E850582D8916C2E7FC2B728048E24BB9D1E8283615E039C16A2FC61011631BBD8F2BEB24ADF9552CF5797CE05D9D1A7E7F3F5455017B127D9BACD32BAD0CDBD3991BBCAEA5FC988EE7AEC0B1003732F25489EDB0A1F9897247CBC40E60F1DD276259CE19DECCB90067F7293A68B683FB5232ACD2217B8929859109D6852A43892098630A67D72B1CF4BD5D58E20C5C18B85D69DF74EE8CC69BAAC7DA48EB71A160F03B68C6BE87A4919736F14363F004EA3F41DD37FD8E621BF433BCA71E17565E060F3C0F889515D0A8C17FE0D6D734FF756256B0A62058B95422257780DE000557DF289F47910CC272A14BEC737C0715F204C49F03150082DC904A5D170F7383F04F1E355F50F80D5461CBA53490BB2E9484806D369D61FD00ED1EE5BE518D04A24503B1C4C08C7CA084902A3942C04143807203287A985EB3FCAE3C5309410CD9B9A548F54DED44321CE8C2A04679841DAEF7FBB6AA11091D240AFBB467D9969C31C1CBF6B24F8CBFA20CB4CFA404B1310400271664763E9C1CD1B6FE5FF2A0FAE22AB14EFC016CCBB19C5DD5D047750DB4ADDEA3E7A193128A5F4D7BB6358F21B39A44259695904DE3440BB28CF9466B562065C387189EAC2F7522C9385DC2A607F6F9335FF8ADD47C7BA932659AFF69B1F26EC8655BEE4F97FBC846E48111CBE25524873D1DB2F2282D0472A2AAA3CF491C26DDC5E1BE77866A3B692E417E6717A4F4454C56F97F063B9E598865B6F71136D65DDB0F3CDEC57DECD5A57366BA96E4315A88B4EA3479321468FFFF508D23B0701A62CE0CBC0FA37C91CFF5C5A0433FD61AE11A922575F5BAA714DE46A58D6EFC79BDB10C9AF7E9950A61D44B3E17E3B5298501146485B562B1570FF5798B47641D67091CDF90902B2D762E3EFE94C540DE4A28269CC416EDBDDD4D43AC2FA82D638DD9BF11F3BF22FD81CC4BD4759D7D864EEA0E8E8AB71796254B278CF9B650D1FEF38B8437362B2D69ED84C54498331C6899E20C596FEE7CAD9ED8D83D86774AFA6E56A4ED34B0B0842B21CCB67035406DEDFF0CECB0CD089929ED5FFA0CE210822444808BAD99AF603082BFE5C98EE4653349F8A43DB64CF90190C96B0446CC9CD23E0D75B47F54A731E8BCB0A4C67401DEE87876011033D2A526067FB73786FBC1CE696130FCE5D5379CDAC6788875D27C04783B1E2EF41063D57E3D6560D1FF48882C39131C95BAE5A9C9392DAB6CD17EEFBCF61C464A4DBC08447443CBBF3FA80481F3BC1A5806042C07F7A7AD435875DDB1001565EB6B7B872CC6C853F771C1DD5D9C16BC27ACEB3C7690125C1907C7CE904852108CAFE76351269A3D3EA8812FAE4FAE35F0DAEC8E8B186F760005524998BB5DE475E4DF85209DA915BDC972218AE7DB7E2EFA05A7D752AE61CF2F3DC26CA2D282C8E32B4838524BE460971E077348290FA0043FB7616D821A71DDA3A5FB76BFCE0DC84AAEA432DF32B05133A26B46165297EBC45024777A868B8B1B0DD6F97658BE799BD366CFDF99861E916F7CF06C034E4F79594F1BB6ECD9B7347911488928E1E473C4B8C73297F7ED845B9EC59020373EDA57A436C1C9D1459C6114BB6258543D8F4F97B10AAEF5A2E082EA173EE69702D83711FEE6AEE8F6B260D03AB74C3B5D8FDDB81B208E16458511270DD1DA295F25CDE7E44A8349B60BF0C59D4B425C1FBA60D2BCBA47B906D2830D8D5C091DBA756E61620D78B2DFF28407FDC9DA9113CBE82219BB2CC05E11C70D040BDE821AA17B3E981558961CA571E5D5041F7DE047A1727D9C904DEEBE561DC6DBD8876BC77C27322F512D6171BC03871EB0FDECE70F119BACB41D1852220CFF26110EB0EB78E39AA1B2A4C2E78679F53683520C5A57FEA71A8E96E0AED33118DC4BDD035FD88F535B011D9C7DEB6F406A072AE6C091016ED10A5A4EE9827882EE27C535262D1D745AA5231736F2DEEC8A6017BF0DA36B416C98AB71C6824A6EEFF3564665007C9E850FD02A1F5E201B534627B92D21A493DF293DB9F24DE70C7B49A6E07ACF2DB6C90B448681666DCDA318C08AAD08D3E257AF7E774C75DEBE3B3C07AF683735E87F205B0FDE07351849C5AFD07D5722C6AA17B6AC2CC3551C305E6AC31E3601A236961F6618CD3A0F7DCF6F65B8EC82E27E44C8518CDC16ECF79374F796A3DAABE2D5005B25576B35B021497C5A8F9B98DA68D80E56A1CC1044C04DFB11D36CB147EABFDAAFBA0A93FCED8675D7D6A9F999785C0E7346F4C68EB17C0A2409E2F5BD4AC5551FF66A9857C66F642F2A385131377B6372884C417E01BFBBE1CA748AC8969BF2C0BD8944767746D1D57D862795E8ECF9E8A5CA122D0259FFBA822588C5ECCD14CC6FF4B7354CB572F5BD695ED9D85DE131FDD97DD5D6CE7844DDF9F3D112028B5125AE7A77A4AEB2EBB554682A26F457C43FE96D67C90BE7E49FF443478E82D3A48680D737D1260B8210BBE962EFAE6505E496B1B6D4F1042A7B971605E2DC50BE3BDFECC3010B9F5618D3A1B2C1F48888B859E4D6B63CA9D29990B6D502FC22B738B203A83D597B48D73C41860E4E99C57181F5B02F108CA193451025F3B368CF2741244F42B27CB9E57260D2E127CA166B32E0B9C927B247B31619B1D4 - -count = 87 -seed = EDBCC4F6AD0F30066947D678A368B960CCD164889D77730516B444ED2DF10B49C101902F5FA227377C3163A0045B34E4 -mlen = 2904 -msg = 836254422C7D13F1120012FB9CC7CDAA1D8B72F6FA3943AA7DE75263D3DF814BBF2E80C3A204BC0F9AE33E4FA82CE893D35C57E41C7147602BE12455B00B7949A3195264A3281CECC3FDE34802B28C6E1F2B505AB6087D453BD6AA067B2370124840BCAC4605EE4F14EDFC4B4FF19A4D7A828E60156B49B4027AC18DCCD20294F89CCF03D0CF47BB2F22D3749EEE69EE17AB5D8E4DFCCF36824D23E3F95E959D0494FFBC712CE3975E3A661B3F9E149A0234F691C2D820000DE97CC016C43EFE958DA469F740610FD22B64D4BD2E30075E22BCFD4AB41D952D2394FC629F016EE1CD61AAB4581F62A7B8648F8F8CF02462C81023CBE2755C91195A5917FE5A8B5058ECB8DAFF91DD3F73FE38665666DBF79CF6F203FAF94A5CA3F3AFFAA2C2BD5F5DBC011DAF46FD7CEB74B5875E4B5D80B6EDB9817106B91865267E78731662218C8EDE73E588256FB1AD57232AA5533D25BFC54452612F0C2AECAE6DE19355E1D508B888D18FF9F6D7D68199755CF5C210172F65342269ED96C77D80AF8A244B43A99DEB49B97A6F358AADFCFF6AFF72AB39540D375165185F31E0F1A6F97722EE365620BC5D642F8CDC59F7E84FD8615F4A336ED340BE6ED8451997D87B7904C1B9A3A0BD1F8A01AFD6A2D9F5B995E3FD0D44DF8FBC8389B6CBB5537816C91F0EFC3D2349F15EEE747B254C5BBF9418BB979294423DD6DE4D13484408362582A86D082350CC79EBCDCC05B70110A038736034CE4F3DC1D17E5D11C9C7620D40730B61437906933193D1272F7C89C701D495ED682F1335B7E1C42C994E090A67D932A8E825F4B9EDA8F2A94B9A1F11F10E91396908A9D436DD01BAE1D1DE2C6ACF458C0880E3F81ADC2240A99E6083C9C188982713DB243028AB07DF407218CA6B3C4C93989AC96D92375834B915B724F2A105D6240E52B9D7003C67FF76F7A325D84ABBC229266BB40D1DC8784CE1A4A6BD17972CDB26C274B06337D525F61B5BF952D23FA13757460B7B8A3B99EB023831F4FBEF72D62931348622041FFD12634947579BC6E16BD1EAA8E8B2DFD54D74EFCED79EF4FF31AD42036DEBD0FDA3B7F3F8E7A3F45955F82936A67122CD42E38AF646CF565E294F422FAC1E7D274185896F58E9D0FA1FCD3F4D379ECF5B566586246216556939BDF86D6A417C3BF77C64F95D7DE8197EE25B44EEF00209D33159710DF001372C3E3D09F24B9B08B8938C522690674A7588933E1CA37D2C14DF50777806EF6FD2285771A44F6DE90475C6CC314DF140C3962DD9D70C54E58CC5FA3302D69C80C6511D9D42A51B7CB7FD7FEA8D8BD65A66FDB2AC80D945FB7EC72E138F5566CEB570968D84B60068DF20C6CDA2AD48372DC97424793FEA8D2136923070C25F47C3D10839D1747B613B93530968D5E97A3FC0F563BFFCDE7B42C839EFE66C3A8655D0CEB5AF7A37D23DBBB52D05CF6FCBFFA7C7491703349819AD94CE218912557D6C87937B2E7B0473856EC78713C29A02CF7B2B38E0DFE16804AF6C2BA8607026892138011E06B4AF179D63DBD97CB917B6507B798E58D74F485D3F063C044211E428FBFFD5AF2D7941900299602D3B15D5D600B435D9A21948B8D87A35205A3AF9AA9BA491D56573A93C35AF6683655E04A7A17F1B9709ED83E70D82A3DF59A2FB7C051ABE508601F322FFEC089C49DC666BA04366C038AD59D397022F0F6344255F4D98BBB17120441CC75107005A74DB35459C63770547A4AFE59F2703894DEB67612448BA7C4F6FEADC1717F6ACE410C6BE62AC319CD33AF285D17D55F500E364A0ABE71D357AE0802AF464B6D2732F3FB94BDB3BAA497F2E44727BDCCA5A4B65AE9DF189FF1AC640940FF4D479A8072D34ECC523DC8FC7C87FC89A540485AE7BB3F29B041446CA427C0B48CA7515A1E31788E8B53E1122D372B6557F8D2A97CDE893B20E60283954E2934AF340A358A4376DD0CFCBFE305A2CE7B72DCFE2DE105CF44833F548D1BCE88D34B60BD29B69309DD87F4B91DE10EBDD7D7F87D6231307D0AC784E0496DB725AB97656C34E60B34B230F37E30FE326296C4E1BB88C0BAC261DF0E5F45E6E126103EED6B1CA146D58140A8893D847E92D9F3A0A883E8BF830147CEDBDC7DD42C1A58A826A8A827F9AB26ECCF64F68E9CA6B68261260B659B47E0DEDBF5B077982B24ED9B36E8466DCB21EE69B5E2BCCC49A163B4860EC2CCBD65032776DAE601E18ECDAB8E35C2760D5758592F6CC074298A97FC5E82E7DA84036FD10E0725A0E4E58CC4DB30499ABEC0C7D95D88BAC2C58EB093312779BC1B8619FF2762FD1FF009273456D829394664C31FF6D7848B27174B36E59FB65D6BEF6D974D5038A28F49AD465B28857CC12BAAFFABF3652C2E22B46B040E579FB040A0FB4B1DAF0C157D35407C0B78E305CEEB232E7B7426C95639B1CF7B079E80521FAA538E51E69255576650C3A16E143D0F815D2CC89EB00AA13AF20394AA23CC6AA99A9F297D886AB9AF2655D53816E066A02CF21C277DADDEF3D7D0825D094FD8FBD5386139757EFD0B7F8501829725A4B70FF1DABF2958E07ED21DB76266A88483EE7C51A7D215E1B41D2464911ABBB1DC71F9613ED5446E4B0C97BDD47F22B372FB7662956FDCF3B108E0107F74301A054FB004925B041AF354C04C20FD370CE1A014EBEBD8311F3265A2F78B48124521A4AAE240D3BA9F94FD33CA4A92D24A029E0754831869B58F670435A44DCDD7BF75ED9FF06DBA52980DCE49C1C26BA0965DE3623F459E36127AC6AFAD4D5598FC45A95173D039CBBE2CDC7DAB2865FB6BC0FA8DFD33C4A826CFC77BB7F45CB5AA73377A27271AE41630DD3D4E2722581537FCFB233E5AF8F04CA824012B5C429EA498F4AD44AFC249DE2229FD7266FE84173A5CE44632B3650D6E1F278625D564B374C10C1AFA3F17432CBE4B65327C6B6E0CD2F99B68AB043C5C6C99D7FE7FCF940F4887D309D7BC0FFAA5DC4B90C79266514F46CA2D5477F2B84B04E30DCAFD0224170FA6D4BA9AD2A6DFA8ED73DFF9D5D40D43F02610032719A7C5646CCD453CEF409B4325F3FB6D9B9201FB115E4DFAA0B4D29959A44518774E94B2D4D6D06C7F065973BECD203F5CF6CB59F869340EC6BAF0121049DB3E1146234CEE4657C1B821AF817DA27BD4C9B1103C81F5B5161E6A9329D83D6E4DAE1F3299858CD201222D34A85E2991BDCF32E9771F3E701897F647D62729C9805CBF118C9FA727B056A7271A23181B92F033DE1EF113A856A884AD527B8DEB92085AF3DB509FDB0265FBA3376B31BF753DFA477DD5E247D939109F31CD430A692BCEC4D9FC7C5B4630CAB90C64B75496BC7CA54D5621FE3315AD03EBF1AFD6D436BD2DBCBE707B35F916CFC147BBB5B8AD2E80ABD692834E42E0724C8B901F5924212C4129F7451B9DD860A85855D1AC59F0B6B87A66B6A395DD81990AA3DEBF64C91CEA6862B5793BAFFF81677FA2928E950D94A6333B0E77A15AE461E710BE70AFCB9FE6E0C21C5AD188E439A6E5138A2C5AD17126E759D48491E3F3F93F81EEB77B7B3A6ADD96917CF0BEEA202EEA5ADB3D5593A3DC9FF1F8F05DBF5A2707EDBB6640EFF5B65A0003CCED2EB480942A13C1F1CCDF9994F1D11DBEF0D3BA7C3801AA508C17BCF287A928B635F475195D88ADF9F4C1CA7D3D1462DFD0F6939B89E5ED95F177BBB12253391876492BC01AFF1C1DAAF0A1C7821C2A4E33F52BADF51987E010B391FC984328E020206EE98E9C8E6763120055F99725E48356FD800E11CE973D00C800C353A5DF8B028E1E42F817C7433084C440E47532FC639172533DF35F0FF43257841C3E4EC7DD7F601EAA81E9886FA3253844C195A62F89FA5D292536BE8CACD80C94BBCD1A83C985936353C9233E512431A8863D7D8340E89307547BD10B16BF2C7E0BB01AB8093C70E4F4C8FD30608FA14FF072D81048391C07DDD82475A280D4EDF81F739AD1A13BC6483C3C37BF52ED52CE8D568AA81864ACABE225BC6467C79FBF43781F29B0C508E6825D4E56D25E45A8C0C6298765069FDCC66B2C5492FDDFFF69D6F5975FCD81041F30FFD7813BA3219B3139583EB588DDC57851E581FBD5E20127EBD -pk = 3FB66CD85D5093AB4B53CC61C17C12BD1BC054578F7ACB54FA95CE3397DB21106DFD896379A1AE130AD1BA0B750FC19CCEB03C1EFC9AAA55EC6731303773801F -sk = 3FB66CD85D5093AB4B53CC61C17C12BD1BC054578F7ACB54FA95CE3397DB21106DFD896379A1AE130AD1BA0B750FC19CCEB03C1EFC9AAA55EC6731303773801F0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001EAC8E66DAB3483340C491EFC63B38EFE66F4CA34F56114857DC0680E1A35710B4087777D54A02BB5A7B2837CDA30400000000000000FBF0BEDABCEF993085FF9DD6890B2411C1804523517EB3327E57679E7E29C71002036B389B18A4D3F7FAB9489AD3FAFFFFFFFFFFFFFFDBAA856BA0F1B8F5F66E86D4D45D7682F695E49F1FD086A2CD28AD5D0711FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE21765739CED5FCE254C3008B970A613FB8853ECB0D8FC92D47EE5BB8EA05000000000000000000000000000000000000000000000060A868EA8FED58FC2A49426BB20035F2D32715300029A858136019DC74848527734006DAB2BCB3EBC7C7FEB6E4922D619A02C2C1AB1575E376789579F7594E1976D1E02AEC0AFC72C0D796337BBCFA53468302873B6B69D11BBE1EBEE5F5F20F2BB721D4FAADB9B0925DECE2438BEB49783964531F209E8E56012A44289174100A9FDF0C494865AE2AF3FA0E1106838D01D4D7286DDE0C30E62B2142A32DE01CFBFA59F81B24EFB7458697F074C50B0E2314EF1F2645ADE9C8CBBD72350226220E6EBD1B19EE7A10676AACF841B59CB528D8D3CB38A205A79342BBDD3CA2BE1BEDD41CAF42A317941FB68B258786BA320B389F994C7177396B6E1DB92A5AD11F2D49D63948CDB4E0A52C8B92D137876E2D7A9976B0270D39BC9DBDE4418950070E485979EDB78D54065A23DF85BBCAEFD6FE8177E05DAE79E6792B431E2F4D34F91AF5B6A9BC0666625323A4F5A510DE07ED0F737AFC43DF068E27E890AEC00956B2522359A6B7857D7DB1AF387EEF5C594CD04F15C746A5A33BEFFCF8DC1219ABB351618EEA3B0EC029A1E04CBF6D4F65954DA4DEE84A77CCBE4F62621BDC2D530EB9F9897D5D12CBE279B63C8DFDEE301BF66BC1E1A9EBD2DFF47F6649B531 -smlen = 3081 -sm = 022EF27699B07B120604272D39E901A2AB061A05CE8C53DAC58FB6025501ADDC67AB2DD34CC536002763214F0F2026D0A10053F4C13A84C3885C0206E0F48F895065FE440207420E1F1E65655893F2064355A0658C5777E08A004C64B84A85F882DF7105111BB5842D48CE7D9206511EEDBF99238F20E6031CF1A99B51B09E362302C40C25F3DAA45EF05405018D91A0A0BC706E0B73AF331F070987EF04023E3461623A6C01243D046E5636A838E80A02836254422C7D13F1120012FB9CC7CDAA1D8B72F6FA3943AA7DE75263D3DF814BBF2E80C3A204BC0F9AE33E4FA82CE893D35C57E41C7147602BE12455B00B7949A3195264A3281CECC3FDE34802B28C6E1F2B505AB6087D453BD6AA067B2370124840BCAC4605EE4F14EDFC4B4FF19A4D7A828E60156B49B4027AC18DCCD20294F89CCF03D0CF47BB2F22D3749EEE69EE17AB5D8E4DFCCF36824D23E3F95E959D0494FFBC712CE3975E3A661B3F9E149A0234F691C2D820000DE97CC016C43EFE958DA469F740610FD22B64D4BD2E30075E22BCFD4AB41D952D2394FC629F016EE1CD61AAB4581F62A7B8648F8F8CF02462C81023CBE2755C91195A5917FE5A8B5058ECB8DAFF91DD3F73FE38665666DBF79CF6F203FAF94A5CA3F3AFFAA2C2BD5F5DBC011DAF46FD7CEB74B5875E4B5D80B6EDB9817106B91865267E78731662218C8EDE73E588256FB1AD57232AA5533D25BFC54452612F0C2AECAE6DE19355E1D508B888D18FF9F6D7D68199755CF5C210172F65342269ED96C77D80AF8A244B43A99DEB49B97A6F358AADFCFF6AFF72AB39540D375165185F31E0F1A6F97722EE365620BC5D642F8CDC59F7E84FD8615F4A336ED340BE6ED8451997D87B7904C1B9A3A0BD1F8A01AFD6A2D9F5B995E3FD0D44DF8FBC8389B6CBB5537816C91F0EFC3D2349F15EEE747B254C5BBF9418BB979294423DD6DE4D13484408362582A86D082350CC79EBCDCC05B70110A038736034CE4F3DC1D17E5D11C9C7620D40730B61437906933193D1272F7C89C701D495ED682F1335B7E1C42C994E090A67D932A8E825F4B9EDA8F2A94B9A1F11F10E91396908A9D436DD01BAE1D1DE2C6ACF458C0880E3F81ADC2240A99E6083C9C188982713DB243028AB07DF407218CA6B3C4C93989AC96D92375834B915B724F2A105D6240E52B9D7003C67FF76F7A325D84ABBC229266BB40D1DC8784CE1A4A6BD17972CDB26C274B06337D525F61B5BF952D23FA13757460B7B8A3B99EB023831F4FBEF72D62931348622041FFD12634947579BC6E16BD1EAA8E8B2DFD54D74EFCED79EF4FF31AD42036DEBD0FDA3B7F3F8E7A3F45955F82936A67122CD42E38AF646CF565E294F422FAC1E7D274185896F58E9D0FA1FCD3F4D379ECF5B566586246216556939BDF86D6A417C3BF77C64F95D7DE8197EE25B44EEF00209D33159710DF001372C3E3D09F24B9B08B8938C522690674A7588933E1CA37D2C14DF50777806EF6FD2285771A44F6DE90475C6CC314DF140C3962DD9D70C54E58CC5FA3302D69C80C6511D9D42A51B7CB7FD7FEA8D8BD65A66FDB2AC80D945FB7EC72E138F5566CEB570968D84B60068DF20C6CDA2AD48372DC97424793FEA8D2136923070C25F47C3D10839D1747B613B93530968D5E97A3FC0F563BFFCDE7B42C839EFE66C3A8655D0CEB5AF7A37D23DBBB52D05CF6FCBFFA7C7491703349819AD94CE218912557D6C87937B2E7B0473856EC78713C29A02CF7B2B38E0DFE16804AF6C2BA8607026892138011E06B4AF179D63DBD97CB917B6507B798E58D74F485D3F063C044211E428FBFFD5AF2D7941900299602D3B15D5D600B435D9A21948B8D87A35205A3AF9AA9BA491D56573A93C35AF6683655E04A7A17F1B9709ED83E70D82A3DF59A2FB7C051ABE508601F322FFEC089C49DC666BA04366C038AD59D397022F0F6344255F4D98BBB17120441CC75107005A74DB35459C63770547A4AFE59F2703894DEB67612448BA7C4F6FEADC1717F6ACE410C6BE62AC319CD33AF285D17D55F500E364A0ABE71D357AE0802AF464B6D2732F3FB94BDB3BAA497F2E44727BDCCA5A4B65AE9DF189FF1AC640940FF4D479A8072D34ECC523DC8FC7C87FC89A540485AE7BB3F29B041446CA427C0B48CA7515A1E31788E8B53E1122D372B6557F8D2A97CDE893B20E60283954E2934AF340A358A4376DD0CFCBFE305A2CE7B72DCFE2DE105CF44833F548D1BCE88D34B60BD29B69309DD87F4B91DE10EBDD7D7F87D6231307D0AC784E0496DB725AB97656C34E60B34B230F37E30FE326296C4E1BB88C0BAC261DF0E5F45E6E126103EED6B1CA146D58140A8893D847E92D9F3A0A883E8BF830147CEDBDC7DD42C1A58A826A8A827F9AB26ECCF64F68E9CA6B68261260B659B47E0DEDBF5B077982B24ED9B36E8466DCB21EE69B5E2BCCC49A163B4860EC2CCBD65032776DAE601E18ECDAB8E35C2760D5758592F6CC074298A97FC5E82E7DA84036FD10E0725A0E4E58CC4DB30499ABEC0C7D95D88BAC2C58EB093312779BC1B8619FF2762FD1FF009273456D829394664C31FF6D7848B27174B36E59FB65D6BEF6D974D5038A28F49AD465B28857CC12BAAFFABF3652C2E22B46B040E579FB040A0FB4B1DAF0C157D35407C0B78E305CEEB232E7B7426C95639B1CF7B079E80521FAA538E51E69255576650C3A16E143D0F815D2CC89EB00AA13AF20394AA23CC6AA99A9F297D886AB9AF2655D53816E066A02CF21C277DADDEF3D7D0825D094FD8FBD5386139757EFD0B7F8501829725A4B70FF1DABF2958E07ED21DB76266A88483EE7C51A7D215E1B41D2464911ABBB1DC71F9613ED5446E4B0C97BDD47F22B372FB7662956FDCF3B108E0107F74301A054FB004925B041AF354C04C20FD370CE1A014EBEBD8311F3265A2F78B48124521A4AAE240D3BA9F94FD33CA4A92D24A029E0754831869B58F670435A44DCDD7BF75ED9FF06DBA52980DCE49C1C26BA0965DE3623F459E36127AC6AFAD4D5598FC45A95173D039CBBE2CDC7DAB2865FB6BC0FA8DFD33C4A826CFC77BB7F45CB5AA73377A27271AE41630DD3D4E2722581537FCFB233E5AF8F04CA824012B5C429EA498F4AD44AFC249DE2229FD7266FE84173A5CE44632B3650D6E1F278625D564B374C10C1AFA3F17432CBE4B65327C6B6E0CD2F99B68AB043C5C6C99D7FE7FCF940F4887D309D7BC0FFAA5DC4B90C79266514F46CA2D5477F2B84B04E30DCAFD0224170FA6D4BA9AD2A6DFA8ED73DFF9D5D40D43F02610032719A7C5646CCD453CEF409B4325F3FB6D9B9201FB115E4DFAA0B4D29959A44518774E94B2D4D6D06C7F065973BECD203F5CF6CB59F869340EC6BAF0121049DB3E1146234CEE4657C1B821AF817DA27BD4C9B1103C81F5B5161E6A9329D83D6E4DAE1F3299858CD201222D34A85E2991BDCF32E9771F3E701897F647D62729C9805CBF118C9FA727B056A7271A23181B92F033DE1EF113A856A884AD527B8DEB92085AF3DB509FDB0265FBA3376B31BF753DFA477DD5E247D939109F31CD430A692BCEC4D9FC7C5B4630CAB90C64B75496BC7CA54D5621FE3315AD03EBF1AFD6D436BD2DBCBE707B35F916CFC147BBB5B8AD2E80ABD692834E42E0724C8B901F5924212C4129F7451B9DD860A85855D1AC59F0B6B87A66B6A395DD81990AA3DEBF64C91CEA6862B5793BAFFF81677FA2928E950D94A6333B0E77A15AE461E710BE70AFCB9FE6E0C21C5AD188E439A6E5138A2C5AD17126E759D48491E3F3F93F81EEB77B7B3A6ADD96917CF0BEEA202EEA5ADB3D5593A3DC9FF1F8F05DBF5A2707EDBB6640EFF5B65A0003CCED2EB480942A13C1F1CCDF9994F1D11DBEF0D3BA7C3801AA508C17BCF287A928B635F475195D88ADF9F4C1CA7D3D1462DFD0F6939B89E5ED95F177BBB12253391876492BC01AFF1C1DAAF0A1C7821C2A4E33F52BADF51987E010B391FC984328E020206EE98E9C8E6763120055F99725E48356FD800E11CE973D00C800C353A5DF8B028E1E42F817C7433084C440E47532FC639172533DF35F0FF43257841C3E4EC7DD7F601EAA81E9886FA3253844C195A62F89FA5D292536BE8CACD80C94BBCD1A83C985936353C9233E512431A8863D7D8340E89307547BD10B16BF2C7E0BB01AB8093C70E4F4C8FD30608FA14FF072D81048391C07DDD82475A280D4EDF81F739AD1A13BC6483C3C37BF52ED52CE8D568AA81864ACABE225BC6467C79FBF43781F29B0C508E6825D4E56D25E45A8C0C6298765069FDCC66B2C5492FDDFFF69D6F5975FCD81041F30FFD7813BA3219B3139583EB588DDC57851E581FBD5E20127EBD - -count = 88 -seed = DEEE61A2FAC04E4D6B7A250124DFD91518D9B90A71FA02665E3088760BF69CB3CD7B6977F860A7026819D178623C9676 -mlen = 2937 -msg = BD2B4058218A15C008A4BBBA29592079583F684FEAD3E6B3F09ABFF0DBCA23670AE4496077D47945E5F1AC3CD4ADD5763581285D80DFB43BBA9C0730858293FF6A15915AB203FBE65C118B87EA37DFA1E06CBC0F24EBA3F43A8BE17FF1DAF4277CDA2CAE8AA924E852C9D60524B98306927746C4EB26DC9475E8A0D0F920F33E1AFF9D07EA5561E70865B2D8161B86FDD7638E7A72345DD72EE95BAE1EBD2C24D2A5510ABE3FC2CED397A067D215F6088D63FA63F2247427917E5C4FBA14F0A22A04FD0AC1D948507751F3523BE2B0A0CF2F96DC61F8187ADF646D6914667759D49A6DF9A327830EFFC9470CEC6C82EA127A8B0C6510203879FAAC4323145931E146D962846BB1A6E84CB2C31BC686E388C853413EA7D3EBF7C752C6AEC774637EE01F2817A5AF133928AF35F23FC3541FE7FA749A863A048EFED2F8CC2BA86520B97FDE0324C68D1DDDE1E430C30DED0B25664EA676AAC6B1F22925A40B319CAA37DD5DEDB99DE4D963630A6FB0E8B00AD8F2A2B9BCC497A00099A70A9DC190A2AB2A058930E63FD6DF342A625E9A095EE79137CAEB8885117C7A9FB8DF7A35D5A300D6F7EEE40578A7507EDC38A0D6522474E672F156FEDE7E1690C3BBDFF40342F1F3AD3C34325BCDBFF0A68249858C777551683A9F3AF225163C9323A4AD5E666E0A9F44C6496269038AAC5DC2767966C1560C5A09207406F3C47157D2FE5909346D8ACBFDDF3E3D19FE48B7C60E1C8CFB2EAAB19E736B2595D33A0AA034726CB6146A01EBF5CC72EB1182B9A4BCEF90A1AAF74079862CD775F8F773BCC490F6015B4D5469EE0BD95C1A32A1FBF283FCE1FBF6F8CDCFC1884F4D2A899F3E7A95414DE419D56462F502EE703CDBA007C3BB78F20243C35B882C90CB7DE3CAE3F0468079C546645977347BC183FB0A6CD24481391CBDF9372E2D6765B6CAF8EB0145BB269A47A1B4E2CDF9901D6AA284D919BA57163AB9929E715341BACD81F35BDBFF36D59A1EDABFF3CAD2C122386A6335348A3170337B94E4336B2B74E791981656CB5234A6F84DB4142D3F323000FA98BE61527F7548DAB6E83928E9DD2E461F08A5BB52F241BB42254E5746FCCE0F3620ABC69A6E275B5E06A333360F9B809562ED116AA6CC2334694AAA4169310ED6AF695678DE22D3E551DAF61C0A6C5F6C0F36FD3469A3B977F6D295E75ABB804A43E1E7AC4708208A94E8368DCA40856F1D43C9865D98F69F1C0BA9C8B33AC9CCD18D400D2559B1CDD82A0C875B5E136B97C02126C81A81EB5D1E421221564100450531DBD97BDA77C1B0186527ECF526CE6BCD0ADD5668382D984AF9277A21D40C06EB4BBBB0CCD6F64E90272FD632D47A388D301377EE745FBC9CB4C02E1F096DDF303BCA4E1FB4B6DF867676080CDFA6A29CEDD15003EE636DB8C74E7E293A087B1A5F62334585369D12D9876ED0F334C6711146643FD598F0D69BB3475D219D1F89066644897A9CC5630BC84C0CB5844087216038C8FB6750D0968D3D3E2D29D93639486C76DC045900AE1A13529E74BECEB3338684402BBC3EB36870E0B37584E9F309BFB0DD9B966F0BE1298DFE55D1A94A6767CAE5EB3120133B7D7B71C9F2A538A97F8548FB176B0E8923B14AF28AE26306214F1D392AE63C3736B9F9374CA10EBE93370C11BEBEB45D066477F374866C8A7208CE6DCEC404194BB1F833DE0AA4700CA29681FA0F72D98679DC3E1E142852347B01DAA08E5CBBFD242F7223600804E066FB5C98C8358370F5D390898FA44023A30F824F1C6A95B8E23308B4BE474D03E34CF72BE65F90D698DFE0D2828A797BBF8397EC87AB9EE00C76A1C7B3CED0100D3A1030136CAB9A69F05CBE58A4A56A9C700BC591B87783DE59369F2E62D5B885DA09F25835A6DC06F954C19B347724244FDA69E3356A4EF60F6A41CFF3BB7CB22ECB128415CD1B89A9AEC12B66F1EC23B14E7D7FD601EF7B000A0C96F386216F75710EB2C12817DABA1D1295E7535331CB90A9B0D8F7542E73DE2D93FE554063F57274DF27BFB39BC4B78B72A88473408086D8DF531E53B5BE018E076032D1F8EF86D7AFB8E8867B9D7728A25ACFB6856D83592CADA4494977678A9F4D134F49A8598A8E0F23D3B7A09B5308243410CA6F47E0BF8C43871600817460BDEB74E7D32C2FF7C40EA4BF924E795516FF7C7BC8E5FD5D64CC489F1894C6BCF0E9C312B1EE7E2BC68739372E7402E6AA2ECDCA39C18D7441F0FF373946559C475E37D4ADA64B98283E5A64BE7BC2D1A1C148D2CDB4EDA35F591D3A7E7CE15162F50FF1B025F87CBB82289FBE7F9C32DB8F23012CCCB87ACA7D758D42019B9A8C15F508CAC9284928F46F0DC1C1B6C6B4DA030DB9286FF8D3762EA4A83D096AE04F98E9416D3DAC59E04F9E4E4359AD76926BBD9570A3D5811F69A1C4345B646BD946D0168ED62A7A431D920D707D8CC7E840BB9CF13D8ABAE8196D9177E8C28CE0DD9EF647EAAF0D3C97E52CB31B560EA7067B45AEFB5EC2B7C7BDFA3996D1C7E467636BFA1BBE11D1CCF86B64ADE9FAF9287A23502E9FF711CA97D6CC09DE814A67BA6123A8E4E67CF6E8CB6F7B36621BC6192ECEE94D61860703AC8411B16E19644A6AB01813402629AF52301C9D76A94CEE22B1DCA49F13B130028991C8AB383C8461433383DA92AB34F1EBB4124B24C6C391EA44EE6E736BBC7A2D4660A878A600AE39B7DCCAA51ADBE90BD705EA51AD13C05E611749D43DE336D396352CB0673ABCE7473DECB0FC708EF28DCBE18C85EE0068FEF64685ACC3A7D0DA9A21DD0AFB10B95D81F6AE437022218B6094CE35D01248EA85A9EC6FB56A7A2A8453EB03E6CCBEA0F2EADB015D8BE3D09739EAC07AD9E3F17D13E5F71CADFA220ECAE90EA50BEA87B19CA6FC5DF31874D51723BECC80C8845C9EA718454D2817EF8AFD99B63090CBA6C8089AFA78770222FADEE3B3B829CF36A8153EFAF2CF28DC4651FF37A8921E402EF81A0F457FC1802AB06A759BF4071F082BFDC100AB612A4584B5AE19354854101AB0173D7D6A5A0637CCB58AE58978A8BEFD5A2C51D3D53150C336C0C0C2A27B442E2BCE120C4CCF8D97EA4584434A6F48C0245B63B2255BC52ADAD4EDA9279412D70BE457F7DCAC492FE53C06EDEED766B46EBC3419E6DA2A2847251F75C62A5FE7AE74F0DD5AF50A447DA6356DCC828C5F1A2C0C873E57041EB1158296C038B91F2E13D3D4B2887B284384A9ECB8BB378BB311F4ABB19E1B90EB3A399C03BFB4CCB29AAD80C55C1636559FC79A6C894B5BAD8D529BF680631541A45EB0E57BA5B458A05F456C60FBB593DAE90AE549416AF96642A486F10843482AFC3989BBD1E8E4DDF0791204F4B720ABD2D8995C87C8A388ECB14860CF83B7A4406FB6C8C9393475082D24E516C5F1AF91CEBA444D8E460D0695746BE057EA8D76F8C0C80358F3DB2AE5B996272737516EF5E4EF5A1FE5967304CB6D00090C9623D29F0D4BCE8CA3CBD54A30F9597E01E5845C1CDD8777E18C5D5D86492FDD0606F623D11A28DD9F02032E3A378C71B757B52021DCE6CEEC63792CEA24D6DD7150AC8FCFCA6554F7B08A5529D59628D0F35122504DD1542F6291BEDBEE09F81AA744A0F6C6DFCA6207FBFAB6B9E17E8A4040741F6508471E72D227D0FDC50C13F444310245AD17BF819FFBBC4E0485FA68CF1F0A4423F251538F25DA989ABCD008C803D368F626438432569F12D1612370E4C6C971079371081B37D8DF7EE709198AAA2FCBD443B96732AAA4E6924A461B60CA4F4CB13E88D539AAD709A3DB84D2D6D26671A9F3877125B7A358389BBEEA846A32E949DB9A7853DBC7D5ADD92729CE1B5C00680974F3DDC6A8235C7319B6CD1CE5E0B66FE7C2F1115206C42B4C02990D79EFA8BE94927543C19EE93D0EC8811F9330693696C878CFADAA2D56E877D42A3680AB2F6A576FDA7BF7957F781655CC664A0A4A0D16CE34D04D7C98A9E0C93D2E6D42870FE66864660B564ED4F881693D466BD68B6470AF03A5A6E703DBB40515AF5DCA7142C4C8D79F5BE4BB01A1B56BE9D0936396A7EED9A84DA86A4F00DCF676B4942D5DF6E1378EA26D9118A54E17FC623B83AADB417EC82F9AFCACEABBDCFE2F0B6AD4BC1601B4E24F547D61D1C1737ADBCB46D98287372C -pk = FCBAD41E0A19FC83B283455BC0898C818C9D037C56E44879F8E936769411862B3BA7FAEC90666597EE2E87427926E81442C48958E74AF7A60D9C1285B7276C30 -sk = FCBAD41E0A19FC83B283455BC0898C818C9D037C56E44879F8E936769411862B3BA7FAEC90666597EE2E87427926E81442C48958E74AF7A60D9C1285B7276C30020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000089A16D61E802A77D6AB7D46126BDF7D4D983D8AE39FECEE75A831C6AA60BF3CE0638F71BE9A40031237F2096B0501000000000000007F40203B85B442A1C2755AD72A4DD013BA473C7CD2AAFF41E6480309D18F44DA0BC6676ACB3A7C0AB3FBA0D1866EFDFFFFFFFFFFFFFF07DFD8B14E2F0110F8F64B11D0F15C3360CD3DEB6D6FC44C03ADF7B71B15F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC026B283CCDDE648A6412085508DB30EF2CDBBC1F8BECEDEB37EF2CD1E90800000000000000000000000000000000000000000000005140177AE06E40051FF59960E2EEE3858689BE977AD9FAD01FCCF2E2081F93225D4F3D95339A9426147D91B0CB311AC4CEB663C35FE26C6294FFEEE8D630D02ED4E6AF22AF9478181105B333BCACFD8CA2BC8A07C562EF151E5D45C3898DF6224C267F739278943B36DBFD11D6023CC253DA024DB128ED6668B78B1BC9989506999E20F523F354DBFE342D3A4DD7DB0115AF5C06DE76DAE61BD6D188D66DB5235AE8F66143DDFF483AA4E6DABDDF49D6B1A818E5C3977ED278EDDDBCDA99BC02414D454808440CB32C4D02A674A5A4F4C19230795ED6E22558B1DF143529CE2406025E03D89F5B64F1FFE56B80A9E70755D4B99AF7ABD43A39379A40DEC652138A795BBB3C940CA49CBB17DBCA513040EE3C2D84C506A7E44E3D9437A9D62E046914A48A3E0417C369F7ADCB03A2AA49F2BF5CDE0B882334AE8ED36C5B609C06A5B8F595E6A454A55A9E7E6F4C2CF7F62ADA7E4B15BA2C9DC49C8A2EA4A23B1A0B65169750FCB5C2E89C2F6E1DACCD0838D4835FB27A05A6AF2D3A78670D860A1948C8EAC7AD79F797361B55C1032EA4C8D2AAFA21109A5368B893542F289831E5129F2F91CE166F6F2C5333C4D8BD02AF96B8C9D78AB5C01C95D242D68E052B -smlen = 3114 -sm = 4710E53CA199AFDC0502694D9F2F175BE45A2403BB7433BA517822ED30016E13B2D9584F67519504CB99379007100DE8BA01CB72F15434FCB7A3D407C0F73DEA33FBE65B0D03FD8E80F96B5980375B047345312BD57B203017015C40AA50D78DB588FA07D22046BEE4F10C0CF8073964D0258F817CFA09010DE5103E0439F0CD8005C38FAC33EB5C7146810401837CE8FF4024797ED2F0D9A6042AA81A0C037582FE055FB3345EFE036C7A368A2DA4D600BD2B4058218A15C008A4BBBA29592079583F684FEAD3E6B3F09ABFF0DBCA23670AE4496077D47945E5F1AC3CD4ADD5763581285D80DFB43BBA9C0730858293FF6A15915AB203FBE65C118B87EA37DFA1E06CBC0F24EBA3F43A8BE17FF1DAF4277CDA2CAE8AA924E852C9D60524B98306927746C4EB26DC9475E8A0D0F920F33E1AFF9D07EA5561E70865B2D8161B86FDD7638E7A72345DD72EE95BAE1EBD2C24D2A5510ABE3FC2CED397A067D215F6088D63FA63F2247427917E5C4FBA14F0A22A04FD0AC1D948507751F3523BE2B0A0CF2F96DC61F8187ADF646D6914667759D49A6DF9A327830EFFC9470CEC6C82EA127A8B0C6510203879FAAC4323145931E146D962846BB1A6E84CB2C31BC686E388C853413EA7D3EBF7C752C6AEC774637EE01F2817A5AF133928AF35F23FC3541FE7FA749A863A048EFED2F8CC2BA86520B97FDE0324C68D1DDDE1E430C30DED0B25664EA676AAC6B1F22925A40B319CAA37DD5DEDB99DE4D963630A6FB0E8B00AD8F2A2B9BCC497A00099A70A9DC190A2AB2A058930E63FD6DF342A625E9A095EE79137CAEB8885117C7A9FB8DF7A35D5A300D6F7EEE40578A7507EDC38A0D6522474E672F156FEDE7E1690C3BBDFF40342F1F3AD3C34325BCDBFF0A68249858C777551683A9F3AF225163C9323A4AD5E666E0A9F44C6496269038AAC5DC2767966C1560C5A09207406F3C47157D2FE5909346D8ACBFDDF3E3D19FE48B7C60E1C8CFB2EAAB19E736B2595D33A0AA034726CB6146A01EBF5CC72EB1182B9A4BCEF90A1AAF74079862CD775F8F773BCC490F6015B4D5469EE0BD95C1A32A1FBF283FCE1FBF6F8CDCFC1884F4D2A899F3E7A95414DE419D56462F502EE703CDBA007C3BB78F20243C35B882C90CB7DE3CAE3F0468079C546645977347BC183FB0A6CD24481391CBDF9372E2D6765B6CAF8EB0145BB269A47A1B4E2CDF9901D6AA284D919BA57163AB9929E715341BACD81F35BDBFF36D59A1EDABFF3CAD2C122386A6335348A3170337B94E4336B2B74E791981656CB5234A6F84DB4142D3F323000FA98BE61527F7548DAB6E83928E9DD2E461F08A5BB52F241BB42254E5746FCCE0F3620ABC69A6E275B5E06A333360F9B809562ED116AA6CC2334694AAA4169310ED6AF695678DE22D3E551DAF61C0A6C5F6C0F36FD3469A3B977F6D295E75ABB804A43E1E7AC4708208A94E8368DCA40856F1D43C9865D98F69F1C0BA9C8B33AC9CCD18D400D2559B1CDD82A0C875B5E136B97C02126C81A81EB5D1E421221564100450531DBD97BDA77C1B0186527ECF526CE6BCD0ADD5668382D984AF9277A21D40C06EB4BBBB0CCD6F64E90272FD632D47A388D301377EE745FBC9CB4C02E1F096DDF303BCA4E1FB4B6DF867676080CDFA6A29CEDD15003EE636DB8C74E7E293A087B1A5F62334585369D12D9876ED0F334C6711146643FD598F0D69BB3475D219D1F89066644897A9CC5630BC84C0CB5844087216038C8FB6750D0968D3D3E2D29D93639486C76DC045900AE1A13529E74BECEB3338684402BBC3EB36870E0B37584E9F309BFB0DD9B966F0BE1298DFE55D1A94A6767CAE5EB3120133B7D7B71C9F2A538A97F8548FB176B0E8923B14AF28AE26306214F1D392AE63C3736B9F9374CA10EBE93370C11BEBEB45D066477F374866C8A7208CE6DCEC404194BB1F833DE0AA4700CA29681FA0F72D98679DC3E1E142852347B01DAA08E5CBBFD242F7223600804E066FB5C98C8358370F5D390898FA44023A30F824F1C6A95B8E23308B4BE474D03E34CF72BE65F90D698DFE0D2828A797BBF8397EC87AB9EE00C76A1C7B3CED0100D3A1030136CAB9A69F05CBE58A4A56A9C700BC591B87783DE59369F2E62D5B885DA09F25835A6DC06F954C19B347724244FDA69E3356A4EF60F6A41CFF3BB7CB22ECB128415CD1B89A9AEC12B66F1EC23B14E7D7FD601EF7B000A0C96F386216F75710EB2C12817DABA1D1295E7535331CB90A9B0D8F7542E73DE2D93FE554063F57274DF27BFB39BC4B78B72A88473408086D8DF531E53B5BE018E076032D1F8EF86D7AFB8E8867B9D7728A25ACFB6856D83592CADA4494977678A9F4D134F49A8598A8E0F23D3B7A09B5308243410CA6F47E0BF8C43871600817460BDEB74E7D32C2FF7C40EA4BF924E795516FF7C7BC8E5FD5D64CC489F1894C6BCF0E9C312B1EE7E2BC68739372E7402E6AA2ECDCA39C18D7441F0FF373946559C475E37D4ADA64B98283E5A64BE7BC2D1A1C148D2CDB4EDA35F591D3A7E7CE15162F50FF1B025F87CBB82289FBE7F9C32DB8F23012CCCB87ACA7D758D42019B9A8C15F508CAC9284928F46F0DC1C1B6C6B4DA030DB9286FF8D3762EA4A83D096AE04F98E9416D3DAC59E04F9E4E4359AD76926BBD9570A3D5811F69A1C4345B646BD946D0168ED62A7A431D920D707D8CC7E840BB9CF13D8ABAE8196D9177E8C28CE0DD9EF647EAAF0D3C97E52CB31B560EA7067B45AEFB5EC2B7C7BDFA3996D1C7E467636BFA1BBE11D1CCF86B64ADE9FAF9287A23502E9FF711CA97D6CC09DE814A67BA6123A8E4E67CF6E8CB6F7B36621BC6192ECEE94D61860703AC8411B16E19644A6AB01813402629AF52301C9D76A94CEE22B1DCA49F13B130028991C8AB383C8461433383DA92AB34F1EBB4124B24C6C391EA44EE6E736BBC7A2D4660A878A600AE39B7DCCAA51ADBE90BD705EA51AD13C05E611749D43DE336D396352CB0673ABCE7473DECB0FC708EF28DCBE18C85EE0068FEF64685ACC3A7D0DA9A21DD0AFB10B95D81F6AE437022218B6094CE35D01248EA85A9EC6FB56A7A2A8453EB03E6CCBEA0F2EADB015D8BE3D09739EAC07AD9E3F17D13E5F71CADFA220ECAE90EA50BEA87B19CA6FC5DF31874D51723BECC80C8845C9EA718454D2817EF8AFD99B63090CBA6C8089AFA78770222FADEE3B3B829CF36A8153EFAF2CF28DC4651FF37A8921E402EF81A0F457FC1802AB06A759BF4071F082BFDC100AB612A4584B5AE19354854101AB0173D7D6A5A0637CCB58AE58978A8BEFD5A2C51D3D53150C336C0C0C2A27B442E2BCE120C4CCF8D97EA4584434A6F48C0245B63B2255BC52ADAD4EDA9279412D70BE457F7DCAC492FE53C06EDEED766B46EBC3419E6DA2A2847251F75C62A5FE7AE74F0DD5AF50A447DA6356DCC828C5F1A2C0C873E57041EB1158296C038B91F2E13D3D4B2887B284384A9ECB8BB378BB311F4ABB19E1B90EB3A399C03BFB4CCB29AAD80C55C1636559FC79A6C894B5BAD8D529BF680631541A45EB0E57BA5B458A05F456C60FBB593DAE90AE549416AF96642A486F10843482AFC3989BBD1E8E4DDF0791204F4B720ABD2D8995C87C8A388ECB14860CF83B7A4406FB6C8C9393475082D24E516C5F1AF91CEBA444D8E460D0695746BE057EA8D76F8C0C80358F3DB2AE5B996272737516EF5E4EF5A1FE5967304CB6D00090C9623D29F0D4BCE8CA3CBD54A30F9597E01E5845C1CDD8777E18C5D5D86492FDD0606F623D11A28DD9F02032E3A378C71B757B52021DCE6CEEC63792CEA24D6DD7150AC8FCFCA6554F7B08A5529D59628D0F35122504DD1542F6291BEDBEE09F81AA744A0F6C6DFCA6207FBFAB6B9E17E8A4040741F6508471E72D227D0FDC50C13F444310245AD17BF819FFBBC4E0485FA68CF1F0A4423F251538F25DA989ABCD008C803D368F626438432569F12D1612370E4C6C971079371081B37D8DF7EE709198AAA2FCBD443B96732AAA4E6924A461B60CA4F4CB13E88D539AAD709A3DB84D2D6D26671A9F3877125B7A358389BBEEA846A32E949DB9A7853DBC7D5ADD92729CE1B5C00680974F3DDC6A8235C7319B6CD1CE5E0B66FE7C2F1115206C42B4C02990D79EFA8BE94927543C19EE93D0EC8811F9330693696C878CFADAA2D56E877D42A3680AB2F6A576FDA7BF7957F781655CC664A0A4A0D16CE34D04D7C98A9E0C93D2E6D42870FE66864660B564ED4F881693D466BD68B6470AF03A5A6E703DBB40515AF5DCA7142C4C8D79F5BE4BB01A1B56BE9D0936396A7EED9A84DA86A4F00DCF676B4942D5DF6E1378EA26D9118A54E17FC623B83AADB417EC82F9AFCACEABBDCFE2F0B6AD4BC1601B4E24F547D61D1C1737ADBCB46D98287372C - -count = 89 -seed = DAB6C05E29342106CC34769BF419ADCC88010C05B57E673A503E63AE7A4EE55B72AB2CA86C4EF57FC8C02D2E0C8694A1 -mlen = 2970 -msg = 4D83349DD620DC2CC0E9ADA524B9BE9B195973A839A042F4342D69E6B38918507A9747FCDD8B751D7C75ABCE2B482B3313D4C74EA4E7A4A91F2E08A059536B651508307B7F4C3AFF5CF1579F90F32BA1E847778673E3956713C14661AFA2D11CCF61FD8F9BC914D4B6E6D09C52AFF7FEFAE325C180147153C9AE1924C9A2B8DE4900BFBBC6797558B000C5ADB9A8DC4CAFB458AD328F19A2C55D5434BBFA7BE5057E56511529709992BD6527E913B46ABE38DBFF90D4AB3C024A66FC0F8FB34AFB96E22535A0EA8F313A087AA65355D7D5989C486E103FD526A7A6D812C0E4D8C081BCCE4DCFBC64B68436739451BE0C4B67BFCA71BE955BA9F9A23C223C7D0FFB1B2196C9C9845B6AF341A363951E2008BDC4F3296DD0E1E3F480F2E4B0EC77A002ECCFDABCC58D24CB0BAA26EACE96DECAA0F6BF1CDE0175AFA65AD5C23C5E71B50DF778208EDBE426AA6E876C12440D7C4FCCB42D039A14509092784BAAD37D9B8EDF186CD4FCB3D9F8B0397E951777D602B8AF613060FDAB6B358302B3FD28437A06694F36CE12A035F09D677E48D077CEFD1676D8FE51541BC19E3A6D6A5D879C4F9EB4713B7C0F3A652F3A05D74DABFF79A302FDAF147531FDD57924F49E52B298219B03D6DF166B481F232FC85C7CF52838969CED2DCFC18DD8C95891C498FB49289D1A982922A0FC02C849AC3BB7FA92CF43A64464D5BD919F75ADA287FE657BF61DC07B3808C0FD0D71EA24DE5353268B2C17C989C29465BA49111CC479F51A8CC623CFB6FF68149E52C77A7D85B5ECCE66C05900AB9957BC7ED39E03649A103B5B6BFEEB168B7C1F30DCA84AEA509FEC2B215DD95558A2708839396552F517A8FDA28C3ED61F84E1B2E0DCDFA708DE50D44BFC65BD4E70260C437C8B5B7158EC7E2301D9C7AAA68E0ADEF89FDB601711AD2998379145B29CE3681B513DC3BA9B2EB668C1B53697833670466E21E767361C0A4362E5B8DDC38EE6A9C4DC5205EB808B93C72FFAFB635B4254E4F4496BACC753C8ED0BCAA88DB683CE77C8165E8DDDE665392CCCD57BC07573D83CB3AA10648281EFB08F92AACD8AB6F9B5D7FC66D29526BD57E421220FFE375B26C61A0DDBD9807022EB3B4B681A43E7719F5EC255C1E19AE6C542D6DEEF3B94B6960C18D0D7C8110B88F995826073B874042FAF97F1FF034B8257418CA269F5CA588223393B0179F9817E08E7212D0D410EA259EA66BC4A00E7FB1190A732BFDBF7ADEA0E4550BE90C3E37BF33BAF436955742A2632AEDE259235702EA2E079D99A22C9755ED34C1E3CCBE746E728A932B1852F692B103112B303033AD3CE1172AA066860DF570D21EBBA51FAB72D5AFC4AE8995F532AE384CCCC3C4A295AF76A803FE076CCC920A80D82A9B614760EC43208579EF5DEE164356D62EA33953E55195EEE9B2E2018E6FD9D19A9F49258702DBAF6EDBFD093919917B1B6734F012E2BEB4F758DD481FB8A8D7796E755C6647501E28862B9F5B16FFA1C5D80DCB07141806FC348881A5A8891BB632A4AE4292A102D71504D0FC12C79D15BCD0799D30C7B9E72625A7DF7DBC7ECF9EACC627CA9AE5D71E264F2F2A9D5DB8593F3A90F3915CE480ADF800C99FC2C8692F2B57B492BF9D84171F8C29AF8D5549F82D3730927096CA18FF0B0C0C0B8B800508C44D5749B92D7D48F7FBD5C86E408ECE0EAE639AF475073DF5CA2CD5083BC4FF8852DDF5C399946A6B21B0841D137F583E0DDA3A6046F082872B783ECA3E14B21A2AF61BB150847026F2371812B1A2BE72024226F4613DA860AC2FFC578DCB171DC27B896EEFE49F885F9BE4CC8766F37038E01CF20DBB661F507B2ECF2B023203A6259B0A018FC00B2CA9B3107B605F04388D5493AE7CC4BDD093CE761A92847C2A167739E0750B427B2ACEB3ABC5FF751A5F32D36B589787D4DA509C85EAD751353AB2C68A9C14B8B2C8166AEB6F27C7F101221C306AAC74AAB6B4E795525FE12038725D7AF3D2A6D60E1EA85F2B94EA24F1B72FED9DDAD4C8E5DA484E80A2150DE22E6ADEF41153D7B4331E8F011A3CD48DAB02876B067312D0DC736E465F99AC3C9C56321507E79ACCF652E3857C749AD92DAD15350A6B4B67229A3905DB18AB2053E2D4F92F156A1D76D0AA891364002C991E632B53FA217AAC1709F37F3402F43B0753361EB2F595F9FAE3D7D96FF050DCA0B9657F4C3AB49EBDBFE8816051C4E0AFF32C5137749D53B062CB61F7201171B5DD716E9CCB38D00E50955596845DFF602200B30D375A854CA4E9A7276CA1A1D9EE92A04BCD78854BE251F7080ABA6D8325D40B37054596AD80211A50AFCC1DBC177600A70E648D8BEB4FCB8919214894CDDAA6D63B6F6C445469A6866721D4BF1117F25DFF9D65FC8FBE5B0ACC8B9039C7F94B2A5CC6068A0489E2E13A731DBE1094FA8558A601ADDB9E4DAB04FA744CD5B95A9D57C52C8124AD950A5944DEE2C55E5C8540DBEE5823DAA624F57FD5BE994BAB3AD4E74EA9443F8B6024BD6B49ADF3972442D88E61E04FE8478FF28916584CCB65FB15686991D5781CB7EDA067745258EA671E0A2665F94FEA1B5490669D1EE8711518BB911094957586C8075E3BBEDC47BE059053A7658ADFA0ACEABDD46E0DD9647B34EBA32E56B6305653ED386C50E79E15084F00F003B1D12504FDD8E47D03D9F7572276047BD22B82B8E81F87C86E6F20D2A756B16F291179A97B010F993C0F839C9A1238CFC9BDE8074405CF1B35DF423C7566CE965681F21C969E4F3F8FDCA72A18D5DAA80287F53B5F8429FEA81612CF63CCF1B7A13512DB4D1DD2678FE1189398032EAEB4368332972C728AD726B7290302C3C5ACAB6E73432E825B9046F846ADCA9D93780A36095AA5C51E354CC6E9A910CABBE59130E98F4ACB3CB6D4EFDA9E2F78748ED58465937FC81C548AD038FDC32AEC46B078CC5A7207658A9706F1C9653359DE6C4457DBFA71D300F98F9BC5DAA14DBDD5EF20DCEDE7E9D3F7DA5C932AC3338BA40E46B17D89FE38F725129991983D4A81321B394F2D7B20D66E3DEAAEB6FEFC8CFF0B68A766E27CCFBA66DEDDB1F541DEB3C1892ED2AD5D073162F0DD06B82E8878477BC96E03101C9B5D9D0ADA10EC060B45E144B31E6B4DE283FD43538B47178398FDD15B01ED421EE2C65847F7A4E9AECE2F1D13971FFC0157040782AD4B591DEA0906370820DDE1000490AB1C27C03D02A0F4B4BFAB0E56D7257288441CEA63175CD6BD11382E6C873154332E627CE82E37C63889EFBD8537AC35C21AD7A09C986CFEBF13B19D5677C1104B373F3B55198D075AAC608145FF9D0C4C12C83BB41036AB32227629EEB4922F172281A66C23C35B8A3E92DE0A10D5E8C18B9A54D6C30230F3A8263986AC535B6BF63EDDAF6A02C9100B712EC4BD49851A22AF0E647F259C2E19B9ACAEB6147C476C90745A353F6252ADE8212A9F7C215C0B3053BF2B4E0AD225E8B344EC14C1B839877349C3743E8337D9C1EB128B06939C5A08F60A46FA700723EB6652FC26440D9BDA3C99C10AD0742C2F039BE6B66749B77E14F8223509365053E87ED870FE3906A16DA6C62945DD2112C96A23942B1E14431AECA7DFCE3FD4D6633E0B661FB34B0BF05C4D21E689CAC9B6ABD9F507F08E4AAB94BBEF1C629C0E1CF344E66D3A3E100B615BF762DFF0CEFC5E4CCE0DD908F46C94E7411A151E713FE0C18ED33C4C03E55E12C0AC366DA5C757C7090E0F94E2C34D93EA3B226ADB2979D23E071F18C2EFF33BCF41BAAF52F4B44E38675DDDEC89C7BFE858BFD1AE70D96D0487972D70F8D8681982656FF734BB6323AA91EA14C6330C71783D235D9F094CB111ABC4990319BBF163891535AA5F870164DA65FFF395DB68B390084D4F2448B98CD56103E49CAAEB6CD040C3ABA8290284E9B2BC423117F4104D89B1B1607C6D34AC30AA9E79D8753B97CAE90ECADA6CAFC6100D3D6D91E20393E0DC95B981FE0EDBCF88E046F74184A96705AC226FD26089468E432D525643293BDA781B64BACBDFD6C7301AC42AED7DBBCE7ABB9D67AF315BCC3509CF03523FC887E27EDCBD7C74DADFD0F126CDB49E28ECAD38080F18A775E6D824C18359935D921744EA72FE293F299B530D9DC9285EF174EE60E2DDFFCCFFE89960BABA90D955CD2C96672513C758142D29A1AD79CA9291BC6782B64717F11A71E6D65A1A71D -pk = 57793F6CAD978E6C0E559ED359E4C288EAB10B68093F4AE41C2B0FC6152B2C081D2DD7961E8D8740E7BD6E97BF6A151F3CDF3384E2C0A5BF9EB0EB0FE3D1C120 -sk = 57793F6CAD978E6C0E559ED359E4C288EAB10B68093F4AE41C2B0FC6152B2C081D2DD7961E8D8740E7BD6E97BF6A151F3CDF3384E2C0A5BF9EB0EB0FE3D1C1200200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004AE0EC3B381EF2043EA373D3770BD995FFAB13B8F05FAE4058940E7942FE5A503805CFF239673EF7AA9755367A8E0500000000000000754B352653E21010224D29D6ACE5F3EE1256112B42983F626E6D669A347452DAC4EE329EC31B0BE741470CBFCE40FBFFFFFFFFFFFFFFEB0C0844AD578348660C7342A8ACDB8C3BA63F8E755A8451A3EC8FB6C7B0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6283144CA099365DA03BB8B57E884DFF5DBB771DC9950742535EEF90A09060000000000000000000000000000000000000000000000137A36CC63B28950C7F15EEACE8945E83B9E7D6E1207AF094B43507F676EB62F5697D1429F286080A12A1B5198F55AEEB6BBE657F55FA5DA8BC213971BC8500DA73A2C8CBC62ABF9495F800323698FCA3702B962201C26064B6E2E093BED21002151050B5B1E4D3FA96122DA5E1AFF34C2E42A47FA652542E951166EFE13B1054B3144E82A8325AC947FEFA73065BCC1C726D7BDC8D557F00398F6379799E4025AE8208767B3A3DBB1B43D465F92D26FE0D6336DCCBBE62A9A1C73736FE70F0AF97073FCE65BA20F361B288DB44526F1092EB8D0718FAA82B62365CED62EBE34F92D18C12F9132738606C975C54C72B710CDC0D021F74C334C55ECBCA20B6E1EA97339C0AC56EDD1225D090097D81E3D7FCAD988F30F72E7052B47EB0DD2041928A054B024A9F299EED0F16DD607370DEEF7CE8B851EAB15D5942F2BEAC85E188C88CB344C5FC145FC2682AFD9EB2FD1E5667EC70E1F40818A8A8B15C663AA1C0E0B72A7E929879E6A2C84064F635267796875676F8B598BC3D316F6C0DDD0200795DD6FFDA2C24B5A8E44439D9118355E9B32D0AD5FF59CA4AD6016E7343A3223ED195000A4ABE3CD0E72D010BC1FD61595E025480BE925392FFF73A7BDCD1A -smlen = 3147 -sm = F94EE7CC9A6FF0836604DF7352DFE3177BE84007018A8A9A4B997FE9FA033EEFF2B2E03E24AD0000B58D381F0D3307919002F4EDF40B96AD27B406011319E2B3CF006E89380152BB0C689F76D2C67D03C6130B5DC6CE379A23040611175F460E495355072A535AAC616B8AC72203ABB868ABC9E0803FDA03C500B16D3EC1865DEF0052F4D20D9E43D2F77203019163A88F02A4DED10E1E7F75BF6F52730D03DC5FFD15F3CBA39DCD0008EBC18AFB17D0014D83349DD620DC2CC0E9ADA524B9BE9B195973A839A042F4342D69E6B38918507A9747FCDD8B751D7C75ABCE2B482B3313D4C74EA4E7A4A91F2E08A059536B651508307B7F4C3AFF5CF1579F90F32BA1E847778673E3956713C14661AFA2D11CCF61FD8F9BC914D4B6E6D09C52AFF7FEFAE325C180147153C9AE1924C9A2B8DE4900BFBBC6797558B000C5ADB9A8DC4CAFB458AD328F19A2C55D5434BBFA7BE5057E56511529709992BD6527E913B46ABE38DBFF90D4AB3C024A66FC0F8FB34AFB96E22535A0EA8F313A087AA65355D7D5989C486E103FD526A7A6D812C0E4D8C081BCCE4DCFBC64B68436739451BE0C4B67BFCA71BE955BA9F9A23C223C7D0FFB1B2196C9C9845B6AF341A363951E2008BDC4F3296DD0E1E3F480F2E4B0EC77A002ECCFDABCC58D24CB0BAA26EACE96DECAA0F6BF1CDE0175AFA65AD5C23C5E71B50DF778208EDBE426AA6E876C12440D7C4FCCB42D039A14509092784BAAD37D9B8EDF186CD4FCB3D9F8B0397E951777D602B8AF613060FDAB6B358302B3FD28437A06694F36CE12A035F09D677E48D077CEFD1676D8FE51541BC19E3A6D6A5D879C4F9EB4713B7C0F3A652F3A05D74DABFF79A302FDAF147531FDD57924F49E52B298219B03D6DF166B481F232FC85C7CF52838969CED2DCFC18DD8C95891C498FB49289D1A982922A0FC02C849AC3BB7FA92CF43A64464D5BD919F75ADA287FE657BF61DC07B3808C0FD0D71EA24DE5353268B2C17C989C29465BA49111CC479F51A8CC623CFB6FF68149E52C77A7D85B5ECCE66C05900AB9957BC7ED39E03649A103B5B6BFEEB168B7C1F30DCA84AEA509FEC2B215DD95558A2708839396552F517A8FDA28C3ED61F84E1B2E0DCDFA708DE50D44BFC65BD4E70260C437C8B5B7158EC7E2301D9C7AAA68E0ADEF89FDB601711AD2998379145B29CE3681B513DC3BA9B2EB668C1B53697833670466E21E767361C0A4362E5B8DDC38EE6A9C4DC5205EB808B93C72FFAFB635B4254E4F4496BACC753C8ED0BCAA88DB683CE77C8165E8DDDE665392CCCD57BC07573D83CB3AA10648281EFB08F92AACD8AB6F9B5D7FC66D29526BD57E421220FFE375B26C61A0DDBD9807022EB3B4B681A43E7719F5EC255C1E19AE6C542D6DEEF3B94B6960C18D0D7C8110B88F995826073B874042FAF97F1FF034B8257418CA269F5CA588223393B0179F9817E08E7212D0D410EA259EA66BC4A00E7FB1190A732BFDBF7ADEA0E4550BE90C3E37BF33BAF436955742A2632AEDE259235702EA2E079D99A22C9755ED34C1E3CCBE746E728A932B1852F692B103112B303033AD3CE1172AA066860DF570D21EBBA51FAB72D5AFC4AE8995F532AE384CCCC3C4A295AF76A803FE076CCC920A80D82A9B614760EC43208579EF5DEE164356D62EA33953E55195EEE9B2E2018E6FD9D19A9F49258702DBAF6EDBFD093919917B1B6734F012E2BEB4F758DD481FB8A8D7796E755C6647501E28862B9F5B16FFA1C5D80DCB07141806FC348881A5A8891BB632A4AE4292A102D71504D0FC12C79D15BCD0799D30C7B9E72625A7DF7DBC7ECF9EACC627CA9AE5D71E264F2F2A9D5DB8593F3A90F3915CE480ADF800C99FC2C8692F2B57B492BF9D84171F8C29AF8D5549F82D3730927096CA18FF0B0C0C0B8B800508C44D5749B92D7D48F7FBD5C86E408ECE0EAE639AF475073DF5CA2CD5083BC4FF8852DDF5C399946A6B21B0841D137F583E0DDA3A6046F082872B783ECA3E14B21A2AF61BB150847026F2371812B1A2BE72024226F4613DA860AC2FFC578DCB171DC27B896EEFE49F885F9BE4CC8766F37038E01CF20DBB661F507B2ECF2B023203A6259B0A018FC00B2CA9B3107B605F04388D5493AE7CC4BDD093CE761A92847C2A167739E0750B427B2ACEB3ABC5FF751A5F32D36B589787D4DA509C85EAD751353AB2C68A9C14B8B2C8166AEB6F27C7F101221C306AAC74AAB6B4E795525FE12038725D7AF3D2A6D60E1EA85F2B94EA24F1B72FED9DDAD4C8E5DA484E80A2150DE22E6ADEF41153D7B4331E8F011A3CD48DAB02876B067312D0DC736E465F99AC3C9C56321507E79ACCF652E3857C749AD92DAD15350A6B4B67229A3905DB18AB2053E2D4F92F156A1D76D0AA891364002C991E632B53FA217AAC1709F37F3402F43B0753361EB2F595F9FAE3D7D96FF050DCA0B9657F4C3AB49EBDBFE8816051C4E0AFF32C5137749D53B062CB61F7201171B5DD716E9CCB38D00E50955596845DFF602200B30D375A854CA4E9A7276CA1A1D9EE92A04BCD78854BE251F7080ABA6D8325D40B37054596AD80211A50AFCC1DBC177600A70E648D8BEB4FCB8919214894CDDAA6D63B6F6C445469A6866721D4BF1117F25DFF9D65FC8FBE5B0ACC8B9039C7F94B2A5CC6068A0489E2E13A731DBE1094FA8558A601ADDB9E4DAB04FA744CD5B95A9D57C52C8124AD950A5944DEE2C55E5C8540DBEE5823DAA624F57FD5BE994BAB3AD4E74EA9443F8B6024BD6B49ADF3972442D88E61E04FE8478FF28916584CCB65FB15686991D5781CB7EDA067745258EA671E0A2665F94FEA1B5490669D1EE8711518BB911094957586C8075E3BBEDC47BE059053A7658ADFA0ACEABDD46E0DD9647B34EBA32E56B6305653ED386C50E79E15084F00F003B1D12504FDD8E47D03D9F7572276047BD22B82B8E81F87C86E6F20D2A756B16F291179A97B010F993C0F839C9A1238CFC9BDE8074405CF1B35DF423C7566CE965681F21C969E4F3F8FDCA72A18D5DAA80287F53B5F8429FEA81612CF63CCF1B7A13512DB4D1DD2678FE1189398032EAEB4368332972C728AD726B7290302C3C5ACAB6E73432E825B9046F846ADCA9D93780A36095AA5C51E354CC6E9A910CABBE59130E98F4ACB3CB6D4EFDA9E2F78748ED58465937FC81C548AD038FDC32AEC46B078CC5A7207658A9706F1C9653359DE6C4457DBFA71D300F98F9BC5DAA14DBDD5EF20DCEDE7E9D3F7DA5C932AC3338BA40E46B17D89FE38F725129991983D4A81321B394F2D7B20D66E3DEAAEB6FEFC8CFF0B68A766E27CCFBA66DEDDB1F541DEB3C1892ED2AD5D073162F0DD06B82E8878477BC96E03101C9B5D9D0ADA10EC060B45E144B31E6B4DE283FD43538B47178398FDD15B01ED421EE2C65847F7A4E9AECE2F1D13971FFC0157040782AD4B591DEA0906370820DDE1000490AB1C27C03D02A0F4B4BFAB0E56D7257288441CEA63175CD6BD11382E6C873154332E627CE82E37C63889EFBD8537AC35C21AD7A09C986CFEBF13B19D5677C1104B373F3B55198D075AAC608145FF9D0C4C12C83BB41036AB32227629EEB4922F172281A66C23C35B8A3E92DE0A10D5E8C18B9A54D6C30230F3A8263986AC535B6BF63EDDAF6A02C9100B712EC4BD49851A22AF0E647F259C2E19B9ACAEB6147C476C90745A353F6252ADE8212A9F7C215C0B3053BF2B4E0AD225E8B344EC14C1B839877349C3743E8337D9C1EB128B06939C5A08F60A46FA700723EB6652FC26440D9BDA3C99C10AD0742C2F039BE6B66749B77E14F8223509365053E87ED870FE3906A16DA6C62945DD2112C96A23942B1E14431AECA7DFCE3FD4D6633E0B661FB34B0BF05C4D21E689CAC9B6ABD9F507F08E4AAB94BBEF1C629C0E1CF344E66D3A3E100B615BF762DFF0CEFC5E4CCE0DD908F46C94E7411A151E713FE0C18ED33C4C03E55E12C0AC366DA5C757C7090E0F94E2C34D93EA3B226ADB2979D23E071F18C2EFF33BCF41BAAF52F4B44E38675DDDEC89C7BFE858BFD1AE70D96D0487972D70F8D8681982656FF734BB6323AA91EA14C6330C71783D235D9F094CB111ABC4990319BBF163891535AA5F870164DA65FFF395DB68B390084D4F2448B98CD56103E49CAAEB6CD040C3ABA8290284E9B2BC423117F4104D89B1B1607C6D34AC30AA9E79D8753B97CAE90ECADA6CAFC6100D3D6D91E20393E0DC95B981FE0EDBCF88E046F74184A96705AC226FD26089468E432D525643293BDA781B64BACBDFD6C7301AC42AED7DBBCE7ABB9D67AF315BCC3509CF03523FC887E27EDCBD7C74DADFD0F126CDB49E28ECAD38080F18A775E6D824C18359935D921744EA72FE293F299B530D9DC9285EF174EE60E2DDFFCCFFE89960BABA90D955CD2C96672513C758142D29A1AD79CA9291BC6782B64717F11A71E6D65A1A71D - -count = 90 -seed = 0CAF47BD9AABD7D09FFAD404449BBAB2E1D48E80AC78550831A365BED8765420DBBE9A566EFDF20D4E5233D7848582E4 -mlen = 3003 -msg = E0F434DFA04EC225FF6B6DB802A047E221BC064E5BE89A5FC13937AE9D3F22B4439BB1C1BBA01547A64AB3E810BBB09706D01959E2E906A69FFDDF0C56726BDB58FB039D66AC5D77C7F0E9A8617B0C69176770DA328D38171F39B5220279186250139922C0DD0F7C3F96D48615FC66DB7568810931D257B230258FFE9CB35F87859E08139EBF7432E948EE3F962BB9015CACB8499BC69597ABAE4B841B606657E2E3C51FF5A8961AD42177A9E73950E3FA150439E2063B6555624A6D8E3AF4FD5710FBE722B8C6267BA5DF56846A085C56444573D692D5412CB70E443761751E58C41953BB9FAA3CE1F4564C825A02F0E1339CD659AB1480804DD2E90E3086AAA292DB39C6E2AAF1B001B47A21CC721C0C502C46EF0479BB7D8CBDF8E9C136397FEBC2D83C0FDBB3ED4FA6868068477206A26D2B7E0D20507AECB2756B888FCF5B446217DE14EE6A20CF7E7B732FAB22CA3ABBE81B2BE18463ACAA3132773ACD7476460536111CDCAC98B1CC9B2C36AEB3FB318340F7397B4B4AD6AA87EAC94AB7D98CC12EA5606162877465FA2CAD276CBB5D36C40A0B014C53D2D3A96825E237342DFEFAA6B9456B5FF1DCA859C5976F77C3D3CBC9DF355237EE9B4B4C90A9DD941294431DB76DBB539DC48669E7AAD21808332C8A4FE98B8F043FB756B526890452FA3C3527FCD584CD33E38FF9FF783538D39A184B7B3EB649E1C04C289FB65998F6CF5D5BBB0609FC3403D85C6DF269017032CD24AC540E1B294BDD3C3A0C7117CAB02B1A0063A174FF26FCDA687433A667322320C0DEC1EA3963F3B14375882B3478AED43C2C74DEBFE3A734F8B1A5CF92007F8FB627CC3AAD5C6AE4C31846B72E7573041270FF40E762C0F8DBCEB7512D44DC260A97D5CA7D60699981ED8476D8651C35C8ED498FC2961D1E38AF46F3653630773209A63838A9222B813C23DB0CF4196D6654126BA2B1840A7180E653B3D6E10C4C7AC3CEE93B0399D918A52E59F0215B09A119E634E6E8A9886C877F157BF7B7DD827ADEDBAF03C718AE037C0B262588171839E952721DE72180F8EED00B01F53E098B82165199C53129576036FC753A3D33AEC92060DD19AA078A496A2B214B1BFBB747A1EC64071B0A078D74D0212E6203C9698C7449326A42BCBBE8D9501DB916C64307D5F1083BCC36C0FFA18C0E4410B0B17D443481C3673D17BBD7A366A5FD1C3C5B3391A02EDA7596B4F869A91A32B5A02A05611371231BE035EDC716F534724B5225E1A72A2B2CD357F4C326F1DEE963FAB680721D40DD70B750A019E70885515F43946A0DD3DD042969139F61ECA0E9EE3107D3D28AC606AD53F236303E1FE986C38825318B7C4597B14E1A83B81295FEF49FD0F2C1E14A0B146540D853DB9706CD224B376343317BF7330B0C2721A409B856304FFFE60C24C441D5E2797D4696C0FE046D305AEE93CC6A2D89A81EB19643636A8B424B310034612105DF16516CE9607CC0A2BAC5835642C6FF9572191BC45E44D9B40DA36B607F570AE8C39D490342786F31CE6764F3F7A764665B6CB93E54922C6D89DB566F494E0EE069811AC82E8132F2F388D68490CB1C2172D2979FCE3659D7076B4F457232EB839172963F8C342E2CD18969F086F451D33BB774F3D00E6FA2BE02292F2E5CAD3ADF5DEC28932BD784801E69364962BF39E25455303E1F289052D2F0CD4964E0FFCDE29E7C074E5D57E43739DFA42AAD636C352D363E3A23BDD134BAABC7CD1621CA638DED7DB7051F0456641CA872ECDB4D3C2603DDBBCE16637010E782C4BD5230992E2EE7DD904F8A83EBAA7B4C3CEE15B10794ACE894118304BCDA9E9B1376331D2248B802557AABCF913E95F783715BB5E90A4436E4BDE7D651397A70A24257C39E0516BB1F548DA36C1F1F92A416DC1114107CD863F3BFCB360286E774B21296259756EA6040CB61738EEFE29A67895AC69797C640E03F0E9E731647C2DA93373920341FDFBD50EB6B737BB0D9FDA8EC8784920407D4F41486D8FC616430768D6431CCD789DEFF332B239FFD1900800CEDD9661A55D6D96089007E9089A117F03D7858EB4C3FE2D07E91D8CAB88D2BA5421846069FA6D4E5C9161A140CC3A288100BFBE61C3B0F0E820AB12D8FC54B054A0F4C777052495B45A7D1A883E67663DCF50C2230CA5319AB31CD76435DAE41CE1EE25ECD3FA0C7E83B0168852B2CAB674127CD7BC9DDF9DD4B57EB40128988C7C8994DC6A5FC939FF957F06C70A4056E63331F9AAD254EBF2B8FCCD580285BEA486D91A0C2DBD5823AC8F6846DDABCDE25A2252F8DA1AEB32E6969276BD2A7F94CD7DD3143F3181489272B1589FD385BA844F90E35982B53141DAEAED413054CDB935F3412E31D99C1147079CB487FEEE85E3906DAED18106B8C407BBCB7716EF9D4D34E2FF04709C7457997AD6FADC55A8FA70BC907815805578A11A012C521A1325754CAE2E3F7C9E1FFFDBD4BE31DC534961C318D1A894838E0C33806735DD11E408E500995B86B6ECD20D325347F792A3381D2A45587D9B6AE0AA27533732A6C421CA621AAC42335848D9C0DD89F14EADF2F92EC532756CD5697AD752B6260C598EC9F0E9976A950B22DAEA8B74FCC87F28B5E9ED83C0339E566259ECF06E5CE209065DE87FEEE5D1E9C466004B34583D6AE89B590EAD6A96CD2951705AC764F329E28C996AD6DB05F6C69AD2A39D3EE230F6501F1760AA41FFD936C9DBF20DE3996917322D32B946062A3C27D8BF35ECDA22403AB684CDC680DD166562D018D943369CAEFB9133A4BC4515CD5F9C08E7C22D153F0A7733EB4EB2CD8A74A4C85E40DADEF6858C5927B6EEB2B01E9B7AB02F7048C8869991068B00FC19B9545AB42181DD5CB5488222A402E827F60A8D87B09ECC88350032F998E3C10A88D4733227334812EC97C5E5FA85FAEE1A1E28A58641531B139AA58BEF49780DCEAA408986CF3C40E226C60531945A20F91E5DC31EC86C9F9A0545E5FCB79A13B9AFE9B133867BA7A38152ABC6D9F8EE10090BB71E6ADC6A6C2513B066F2565138BADA60B0BD339F9BE1AADDFC90DD272B4146D0F5830C6A53E295C849C15D001176E7774FCD7619D6EF1A30BA93CFE278AB4806BBF25CE4A4E94163F614E81DFF7EFCB015997F5138E22B80B2B00AD7579CD84DB5D1C7FB16E9E8C5D9A5BA0AD0E0A7DE79C18839D673632F3D2C7DA2062EAE844FACCAF23590B2FBF1861405AC347EB9D723ECBDE54CC96BC4D8EE2178F353310E5D69230C5DB2841D2A06A3A4E03E054D99DEFC6004A6E405FA89B198A901EA1AE9F3112A29F3AEC5698A42794E04D74D761E4AA5AD23DE271969BAF124450F4796DA1EB1C01480436AB0F5D0B1B2E6717DD87EEBF137420961F978896077E40B2D2EBB5664FD8AD89BB9333FDF46C33EF3BED21BCB5B4697451BDACF364F85462F5CB9F546657B4744EDF757DAAA4D3A9A2A6F281184C3576B1DB0B540F3B36310020BC6AC0C6454A7CC8EC1182422B17BDA202729C270194CD6044210D2B98731565812339EDFE5A0DAD79BA826D8C566C7D25DEA9BFF0BADF1E4E5DA2B884966E03FADC51C6D9BCFE877511157201DAB48AED1AB038999E5CC3FE58CCD37D40050DEE92E0BD5332413A7F0118724084EE5545FB51942DF1EF399F734FB9592555B5F32290C53D7E5017EFA2B61E29FDCE90CC3E7C1B0E545425B1D3E1ACB9089DAA786CB0122DB3FF27EA0367751A5462230F0F248147EBCCBA2E16D214E9A0BAEBE989BBA020F95B623CB14ACAF2BE6F157DFDB1E32627133F0D26C7B65A189F39955EE31D9B507B43126B06B9E4524732C8621D2274438DB7ECAF736AB7257CED950EB68BB868581649232793EC83379A16F40781E76F5CC57C48C3F5C2989BEA803E1B63768436D39AD19BB77DB46AAE6E8473ED5DFEC983F49E4B8E7CA6BF476AB2F0272C0C2DBEF1BCB064D7400BFE1B9ECCE13578A20B1D5B48133A74C5C59CAE0115BC3B50574580BFA99D58BCAD336EE2CCA5B7994C784BB90CC8F1B9A0E21B39D5EBA464DE34D46AC0BBE436C2F419D60D8AB13786F9A841B52710D1B49BEC290DE317B66B6855ABE156C07619A4B998CC582E3F54A7F457F1D2839BC3EBAC937AD3EBC6A9E6E845379CF1D66D7C59000E3F6CF6823B005728A95BFB0ACD044EB35D5ADBE8933A3637887CF91EE74BB910FDCBE797B0C6B1B056500542BD39781BDF13EBFBFE949D7BA0B7F31102E63BFC6E22693F97 -pk = 316C028CBB0D90BC8B28CCC6BE0DC92D18D949F4A33FB9AFC5E4925FFB935F34C35116FBECF1CF3E7B7C56C53794FB1BC1EFF6DB2AB3552324388F264DE48332 -sk = 316C028CBB0D90BC8B28CCC6BE0DC92D18D949F4A33FB9AFC5E4925FFB935F34C35116FBECF1CF3E7B7C56C53794FB1BC1EFF6DB2AB3552324388F264DE483320200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002C090DD65C1F4BF097F333A41DC43C6D24B2065E22E7B6B5F6E1FEAF5F8BDC4BFAF5437FB4CA597D60B5192EC64A0100000000000000FD47246E8A09F7A155A530AA119C600ACCB616A8E72984486C9E01C49E987D80C300C05B4B4EAE314A17E41C04A4F9FFFFFFFFFFFFFFFDF398DE930EB28C052719D7A87B27D1DD436B39C0A34AF898D4A7A4DBBF010000000000000000000000000000000000000000000000D47372D6932A021B28D06BB8266D09CB3F0ACE48A5AB3DD641854774CE260400000000000000000000000000000000000000000000009E83AF56A27539CE66070C66741394E40DA092BBFF6A2D4AC14F0814E367F3112CB828DEA67FAA2EE627DD6D9EBDFC9E3D7A18F786DB152A703AD360E941650628F8A7CFD21ACD9EE274D806DA246FBF678A9CC2235FD23C3B079F9D57476F2C91D7A9B5CB31E87E45F26AB39F164AC0885371FC62C5054BF43D89EFD36FF60F77618AA8943B8A76F32456A907641876B50BFA31F01CF57C82C77EE2CDA7C5065418ECC9DFAD43A4A003CD04ADBF9CD1AF8D63CE8F7AD012DF05DAE010D417187520D983A29E00AEFA4D98A2C9E779C5F6E94614832B1197A26DED810276C1162F6D7B61E0F992A73E09370BC2884E16706E5A871BC9B3DFDB95D9C65523DE2475B07950E46B428C316BD62B8FB240A1F7645CA2A027C00591E61E99FA9883167689F605393156C1958EEE740AA5CD666F1F9CA439CE23976FBC5A1EBAD6312BA31C3ABDC10CA29F1C093A05FA408722A213940BD4821051D2B54E4ACE2F3B2B008BDD4117C07ADC607EAE9CEE2F2C08BCA8A6CFB9A2EBFB920247DD8629E11350D368FF8470F98B8A7ACCB57B77639A9FD839DBED87DA1A1A27E6F2EEF8700DD22EE9B7A951E9A78EF552C0227541480B1FCC7D8D4745836D007DFC98730D16 -smlen = 3180 -sm = 169C7F72B6F5B405D501BCE1006F275EF1EABA05C329AE1823DE51607100F19979A98555E6F02802A6D80A1F3390A39B7C060D6EF38F44674DB41C012ECF3BC5B4BC4EE29F0664021EF47930126E8E05AEE6B0F5F0B87011E606E4D1615D68829E274D014C13E25058743CF5AD03B6B93CFC13E15EF30F0533A595EB6FFCDCE35002C38EB018FBAEEDA0BF010037AD7EE4501E600DD81B0497FDA631A50B01457B5917AD609F6D5C0481C0C71BDC39D000E0F434DFA04EC225FF6B6DB802A047E221BC064E5BE89A5FC13937AE9D3F22B4439BB1C1BBA01547A64AB3E810BBB09706D01959E2E906A69FFDDF0C56726BDB58FB039D66AC5D77C7F0E9A8617B0C69176770DA328D38171F39B5220279186250139922C0DD0F7C3F96D48615FC66DB7568810931D257B230258FFE9CB35F87859E08139EBF7432E948EE3F962BB9015CACB8499BC69597ABAE4B841B606657E2E3C51FF5A8961AD42177A9E73950E3FA150439E2063B6555624A6D8E3AF4FD5710FBE722B8C6267BA5DF56846A085C56444573D692D5412CB70E443761751E58C41953BB9FAA3CE1F4564C825A02F0E1339CD659AB1480804DD2E90E3086AAA292DB39C6E2AAF1B001B47A21CC721C0C502C46EF0479BB7D8CBDF8E9C136397FEBC2D83C0FDBB3ED4FA6868068477206A26D2B7E0D20507AECB2756B888FCF5B446217DE14EE6A20CF7E7B732FAB22CA3ABBE81B2BE18463ACAA3132773ACD7476460536111CDCAC98B1CC9B2C36AEB3FB318340F7397B4B4AD6AA87EAC94AB7D98CC12EA5606162877465FA2CAD276CBB5D36C40A0B014C53D2D3A96825E237342DFEFAA6B9456B5FF1DCA859C5976F77C3D3CBC9DF355237EE9B4B4C90A9DD941294431DB76DBB539DC48669E7AAD21808332C8A4FE98B8F043FB756B526890452FA3C3527FCD584CD33E38FF9FF783538D39A184B7B3EB649E1C04C289FB65998F6CF5D5BBB0609FC3403D85C6DF269017032CD24AC540E1B294BDD3C3A0C7117CAB02B1A0063A174FF26FCDA687433A667322320C0DEC1EA3963F3B14375882B3478AED43C2C74DEBFE3A734F8B1A5CF92007F8FB627CC3AAD5C6AE4C31846B72E7573041270FF40E762C0F8DBCEB7512D44DC260A97D5CA7D60699981ED8476D8651C35C8ED498FC2961D1E38AF46F3653630773209A63838A9222B813C23DB0CF4196D6654126BA2B1840A7180E653B3D6E10C4C7AC3CEE93B0399D918A52E59F0215B09A119E634E6E8A9886C877F157BF7B7DD827ADEDBAF03C718AE037C0B262588171839E952721DE72180F8EED00B01F53E098B82165199C53129576036FC753A3D33AEC92060DD19AA078A496A2B214B1BFBB747A1EC64071B0A078D74D0212E6203C9698C7449326A42BCBBE8D9501DB916C64307D5F1083BCC36C0FFA18C0E4410B0B17D443481C3673D17BBD7A366A5FD1C3C5B3391A02EDA7596B4F869A91A32B5A02A05611371231BE035EDC716F534724B5225E1A72A2B2CD357F4C326F1DEE963FAB680721D40DD70B750A019E70885515F43946A0DD3DD042969139F61ECA0E9EE3107D3D28AC606AD53F236303E1FE986C38825318B7C4597B14E1A83B81295FEF49FD0F2C1E14A0B146540D853DB9706CD224B376343317BF7330B0C2721A409B856304FFFE60C24C441D5E2797D4696C0FE046D305AEE93CC6A2D89A81EB19643636A8B424B310034612105DF16516CE9607CC0A2BAC5835642C6FF9572191BC45E44D9B40DA36B607F570AE8C39D490342786F31CE6764F3F7A764665B6CB93E54922C6D89DB566F494E0EE069811AC82E8132F2F388D68490CB1C2172D2979FCE3659D7076B4F457232EB839172963F8C342E2CD18969F086F451D33BB774F3D00E6FA2BE02292F2E5CAD3ADF5DEC28932BD784801E69364962BF39E25455303E1F289052D2F0CD4964E0FFCDE29E7C074E5D57E43739DFA42AAD636C352D363E3A23BDD134BAABC7CD1621CA638DED7DB7051F0456641CA872ECDB4D3C2603DDBBCE16637010E782C4BD5230992E2EE7DD904F8A83EBAA7B4C3CEE15B10794ACE894118304BCDA9E9B1376331D2248B802557AABCF913E95F783715BB5E90A4436E4BDE7D651397A70A24257C39E0516BB1F548DA36C1F1F92A416DC1114107CD863F3BFCB360286E774B21296259756EA6040CB61738EEFE29A67895AC69797C640E03F0E9E731647C2DA93373920341FDFBD50EB6B737BB0D9FDA8EC8784920407D4F41486D8FC616430768D6431CCD789DEFF332B239FFD1900800CEDD9661A55D6D96089007E9089A117F03D7858EB4C3FE2D07E91D8CAB88D2BA5421846069FA6D4E5C9161A140CC3A288100BFBE61C3B0F0E820AB12D8FC54B054A0F4C777052495B45A7D1A883E67663DCF50C2230CA5319AB31CD76435DAE41CE1EE25ECD3FA0C7E83B0168852B2CAB674127CD7BC9DDF9DD4B57EB40128988C7C8994DC6A5FC939FF957F06C70A4056E63331F9AAD254EBF2B8FCCD580285BEA486D91A0C2DBD5823AC8F6846DDABCDE25A2252F8DA1AEB32E6969276BD2A7F94CD7DD3143F3181489272B1589FD385BA844F90E35982B53141DAEAED413054CDB935F3412E31D99C1147079CB487FEEE85E3906DAED18106B8C407BBCB7716EF9D4D34E2FF04709C7457997AD6FADC55A8FA70BC907815805578A11A012C521A1325754CAE2E3F7C9E1FFFDBD4BE31DC534961C318D1A894838E0C33806735DD11E408E500995B86B6ECD20D325347F792A3381D2A45587D9B6AE0AA27533732A6C421CA621AAC42335848D9C0DD89F14EADF2F92EC532756CD5697AD752B6260C598EC9F0E9976A950B22DAEA8B74FCC87F28B5E9ED83C0339E566259ECF06E5CE209065DE87FEEE5D1E9C466004B34583D6AE89B590EAD6A96CD2951705AC764F329E28C996AD6DB05F6C69AD2A39D3EE230F6501F1760AA41FFD936C9DBF20DE3996917322D32B946062A3C27D8BF35ECDA22403AB684CDC680DD166562D018D943369CAEFB9133A4BC4515CD5F9C08E7C22D153F0A7733EB4EB2CD8A74A4C85E40DADEF6858C5927B6EEB2B01E9B7AB02F7048C8869991068B00FC19B9545AB42181DD5CB5488222A402E827F60A8D87B09ECC88350032F998E3C10A88D4733227334812EC97C5E5FA85FAEE1A1E28A58641531B139AA58BEF49780DCEAA408986CF3C40E226C60531945A20F91E5DC31EC86C9F9A0545E5FCB79A13B9AFE9B133867BA7A38152ABC6D9F8EE10090BB71E6ADC6A6C2513B066F2565138BADA60B0BD339F9BE1AADDFC90DD272B4146D0F5830C6A53E295C849C15D001176E7774FCD7619D6EF1A30BA93CFE278AB4806BBF25CE4A4E94163F614E81DFF7EFCB015997F5138E22B80B2B00AD7579CD84DB5D1C7FB16E9E8C5D9A5BA0AD0E0A7DE79C18839D673632F3D2C7DA2062EAE844FACCAF23590B2FBF1861405AC347EB9D723ECBDE54CC96BC4D8EE2178F353310E5D69230C5DB2841D2A06A3A4E03E054D99DEFC6004A6E405FA89B198A901EA1AE9F3112A29F3AEC5698A42794E04D74D761E4AA5AD23DE271969BAF124450F4796DA1EB1C01480436AB0F5D0B1B2E6717DD87EEBF137420961F978896077E40B2D2EBB5664FD8AD89BB9333FDF46C33EF3BED21BCB5B4697451BDACF364F85462F5CB9F546657B4744EDF757DAAA4D3A9A2A6F281184C3576B1DB0B540F3B36310020BC6AC0C6454A7CC8EC1182422B17BDA202729C270194CD6044210D2B98731565812339EDFE5A0DAD79BA826D8C566C7D25DEA9BFF0BADF1E4E5DA2B884966E03FADC51C6D9BCFE877511157201DAB48AED1AB038999E5CC3FE58CCD37D40050DEE92E0BD5332413A7F0118724084EE5545FB51942DF1EF399F734FB9592555B5F32290C53D7E5017EFA2B61E29FDCE90CC3E7C1B0E545425B1D3E1ACB9089DAA786CB0122DB3FF27EA0367751A5462230F0F248147EBCCBA2E16D214E9A0BAEBE989BBA020F95B623CB14ACAF2BE6F157DFDB1E32627133F0D26C7B65A189F39955EE31D9B507B43126B06B9E4524732C8621D2274438DB7ECAF736AB7257CED950EB68BB868581649232793EC83379A16F40781E76F5CC57C48C3F5C2989BEA803E1B63768436D39AD19BB77DB46AAE6E8473ED5DFEC983F49E4B8E7CA6BF476AB2F0272C0C2DBEF1BCB064D7400BFE1B9ECCE13578A20B1D5B48133A74C5C59CAE0115BC3B50574580BFA99D58BCAD336EE2CCA5B7994C784BB90CC8F1B9A0E21B39D5EBA464DE34D46AC0BBE436C2F419D60D8AB13786F9A841B52710D1B49BEC290DE317B66B6855ABE156C07619A4B998CC582E3F54A7F457F1D2839BC3EBAC937AD3EBC6A9E6E845379CF1D66D7C59000E3F6CF6823B005728A95BFB0ACD044EB35D5ADBE8933A3637887CF91EE74BB910FDCBE797B0C6B1B056500542BD39781BDF13EBFBFE949D7BA0B7F31102E63BFC6E22693F97 - -count = 91 -seed = 9564E88F336C091EAD50C893F3EAA8351FA388682F433F7A72A34731020B9C96DFCF75EF5EAE47E12684AFA51EFB49B7 -mlen = 3036 -msg = 2601A39B6D7D91DE539EF11C3B67AE3EB1607716F587BAD5F60D311A9F4FE7F04350CA085EDA6D41C4BB6C6E13E376BF8A314DDF791AE18BE2EC0544AFD3CC27BDF270C4550E9E78D497B92349AC07755BF9167B2958BDE919123439D6F49C3408E8D88021E668A0A5FB6799330188E35EC5939B77097E3737C4F664D01D85FAAD0F583B3E95EDE125587E2A79991750D5CF804325C72DC8DDF3471EE8FDE02519D2D0CA7EDD651EEE30B3BE335CCF7FB02059BC3A47EE3C056D4929EAD4FCD82C8CF49625D5DA460DAA299718556BF0F77CC5CBADB99B64C8EAD4474601FD5C79309D4E63AAC392853072619EFD7B958F0EBDE5CBD40ACD57DF269A8810776D6DFF2E637EA57ADBFAA08DF8D2581C38CB262DBB4D1F3C65A4FA068539D2056E08DCF03BAFF006EDC688023A20728B227A99FED3B8F2BCBED2E3E6ECD8B8665A2E4D233B78D7C33F6E3BD9D0A24D13C8EACCCB53A21DDA9E7A34F9A0F031091E65F749C9EBCCF3DDC4097A121D8C68EB7883405EE34F6A8B0208EA8D5A3FAB53FE2CAD1110BFA6E094F78D5314880BB67BFDFBC2DF8AA250F1D7200FF9A3247C4976DBD1BBE99DF02A3F246E5D466F85ED2F68E0B2DE06B0F2448A7B98FBCBF5872BCAE71BF0DB4E70105B020FF130141E8DE86DBE05B7D2A234CE2EA83A38E23A262E46FFBC837E8A71F657E443052E9A49DEA4E344D497DD2DE2AFB4009D681F232BFF4FEEB173546CBCC4C80C9F85B1CE125BE678E5EC62EF04433D55D4B8829B01AC165A440FCD6594F2C0CB456C8A47444AB05A0F0717B8185930D9738E885D24DAB98E11ECFF7D7A48A4527F94FC4C9D1B9D71F5E6BB39CF92B1A6D0509FFFD42E77AC9AD6F50F8FC649B96B8AC08673F78AE8D0BA2B7243452B33AAC44B06A2B9BE1AD6A12583D3590A3F9AF0E0DC35DA88A257170D315F32F3A889601D6729433B7ADE0F719386723EB2A008634749F5253CB7D9B2FC99A1AE1BBBE7F00A536CD38F8A7237D3992C3897DF412F5B1D45E1EF5B5DC974D49CF8DBF785160BC527543458FD9378B3D4D3124214AE5676185794209AD0EE73B063CBD5B7830D00F817CA0D5CBB597C44D28E4885D935B7BF426C1339C500DAF4F2033FA6A27A4196F233256650472F205D2C5E00E7087FB73027B0C6C9AC5C1D928CCD190B8A6BB33F512CA8E2369DAE6111156DE47A24469683F4721A25652FF87474DFD92A028B3EC5BCFC244CE442752A7DA1DA6C33FC22573BF0B13E371CA9FCC86C76FCF7A1654EEF4442E47399835A06336E62952770C6E61C573CFD07B3AB631B8831FE3F5DD2C6DF68EBF2F8E02EC9F6B90A371ED5E62C8463780AC453AB6F72D38C8F5212C8B650F63B98E3C0886B6A85AE8E7256C1EFB30969532CDBF72184AECBDE2A17B9811DD4222D080049C5D36C532CC0E910779D64AF93D750EE96BDA87562EBD3830FEAD07A3960CD6DE7146603199563693392D3CCE1332DF35C2C8A2C251911D38E95815CE5A4CE5596E2D77711D87CDD54D22E8F0AB431BF8B24CE9C7BD6D077E436543C70B02F338841AF0FB86B5EA4B6A47E27C1D83E1AB06801044F546ADADA437F3CE7D788A1C92A74BA540664658E70D4F2711979153FF1589792859C3BF122628479C7C35EEE951DAB8CDB0D4D150C2DA338346988D34F8C5E589B231B5E00849611BA09711BD3A0516FD515E6C4AE1E8A3657C282C8120C97AA7A2E3BAA22B6EABB8D8212A9A48E7759A9DAAA51B538F662A05FB897067B7CF9D2CEB47A1897214CCFC225CE47CD60E86F7DEA49E220F7DDD6894B30B66460DECBBCB2E42B31F4ADF0AACDDE544B9124EA5ECB04B03C448B17E8094D489F516D23164D2317D3A1332E0500F1423136C8535D69065E880AF34CF7E36DB5FF2C18122E41880585B4D188411E86B370A024BD6E28143EA2EAE52EB46BE334A21A02E21C6755C0182B9A055A7D4C7B056E4930CE63EDC79C9FB4E2FBFFC58F776086F3487F02F8D1E7C8519C7F452E75CE5686A037B3642B95D7526ACD4A81A47112CF96A8DA7548016A22E9359198E871DBCC5852FBE14EECF3CCC5EB2FB5EC31D10474DF7D63482A03E11F4AAA2EAEDB714786E21D03AF1CD644D06BB05FF7B3959601580BF50E5F7F82FF42E9CF2FFCA0C67FFC52CEDC53C7A5C9EFB6C21092DDA374D1CCCBC78BBD9F5EE0FDF6DA6AC60C95F7C2E96F17E3C379A52D5DBD1A92DD76D1F5DFA19EA0408E0E7F7867445445CFA60BCEFC016E68872FBAC9098FD6A8E84731C285570B1BEACCA6F4728958E7924F7A7B7730B9BDC9AAEBD9E045F464071843C650D06C96D487CF8397286F81D93D0CC2008A62EE32421E5231998140909474F6D98541D899EA53714AEFE652A3D792E4C72533332C3133707A49293E3B2E06AE18F2F81D601AADDAF2FD09EC59350E0979A5AE2B721771682A1BFB5748D000F9736031CA971288F34993DF10FC06A16A6DBEED8CDAAA8127F3B71432E723558F0281459820A0F4A75A3B2716F976BDEB88BE9C73F31623050D7C1A96C84988B01D847309E1B6D7B815883F83C9BDB7FCDAEFA8BA69E25B824812B7D54530A3ECC96611897661158DAE1B4AAC112E9AC13D07FDC03DC7D5AF23C08C5E4BBFF737238FD3F1C06F94215BF2351DCE9CAE14B4DD4745AC0CD626054469C6A5286FF821BA192706D47CCEBC443DD67FDDB76797A8B78DD0DAF850CB5D181C82298616E1D3A92F7FC82FD256857915773C7AD97CBB9710373299AE8516B8A1D647A13C7BE848E0269ED6C8A91DC50D0CAD21430A3BC9E718A13D1966A0182D9A24FFF7ECBC7876C868AF2BAF2D8B782172C6719CF140E8CB877FE6D78779E1BB31C70C6C9A6A77529C51CF78A5E4FBD7FF6153B5195817F80603E5C5810C38CF43CA812ECA52F73F045E33DF4E3D04EC8C5F8B4A7399F6CBBF0D39DC951C476B9BCC002720CE89F09C3885673BBA9C90D20DCCCA4A82CE5BEB38BCD60AFE2BA65FCFB01C8793B7ECC0F0B17A9DA74F2E0FEF4C90B5132FD6BAF8C010FCB5E8E7FAEAD7F2E0DB29BFDD1811072623CEE274EF2EFB0F7D4191F332AAF20CF36FF89A2EDF15F7B284CABBBEF46901271D8C1B180F736125C8A44FE164AC7E687E9A58C3B1775238BF1A11F99BCB583D0E3C44BF4F76DCF9496A06F80CA52E24D55B54AB849D3040B4798BF5292B0574672E9F844016A52A4D4E4DAD2053207BC97215BCC1BB93271C03C9AD2DFC7485EE2ED399236AA06CF9A12972E21AFDC587A6334CD1D71A7539362D714BA26214664E3B4BC39CDB1DB847583DB8E002A2AAB451B4E5BD6FE200730BFB2745D03C82B640F4CCF58701708F724EFFDF98CB04C78DF36B7A866CFD596BF5EA18445EEA0E34ED514D0DC2625039049A0CC82711DBBEDCE339C77F9FA1DC60EDDD8D58C8F144B0F3D00227AFD8710BDC66D29809728D7FBE85F08AA38AEBE5605DA29A09CC0526FEE84691EAA54DC3744BF5A95275037FA2F600B1F91E502D5D81AF48F8EC4C1834FE625FCDF2364067048727559047E07062B4D8A7D3851853BF28BE9D2C511451E5FDD9459270328A2612DBFF42E1DD34005A3DA1226A023162F454923C0337E6C74B44BB27A3B1AC82DFD68B0A6DAF93473D97A9E4591EC01A51CB6B47E2C7A85C1FFA73C35E5CE3003BC4534A2D9B16EBF9FED6464CB1E0CC665A451616A62B6A8481E4506A73883198C144A06331224D358196C815C811B103959EDCA35B26BCF86F41D9C7638547496787885EE62B14AF431CAB2AD4E0224D33476C58B8B0833BF13B50BE2B1D682CA7DD194B793AD2C6E4EE25AAF95459302F0B4DAED907A317BCC6A5F8D76CA9AA0D799F8EA39F330D6244BFB9F35E6223A0F665A65F55EAB9BCBAB446D7FCD424DCE87F234864D2C27EE84600ED9193AFEFB6E7681BC94F514FE0748EB32D32262CAB880D79CD4FE5CC963A4F688D448F2DB2DCC5B0CA87AC26DD8506512C100273B8D4D902FC054D48D8BF9EE818AD9619F68A8904B613256DB78C881CEA3373F0CBBAC336A78CD91AD9D60126E05CB8C16E9AA8482CF1B806B2F9C57BC8D63BF008AB2E49EDE8E788BF96B9F1DB2918DC5063F3F1D5B9B1C0327141ACC0B4B248FFDCB8BCC127050D27C805E154A4825DEE6BE9C8D4E42B1F5EFC1EECC6A45DBC119AFB15CCAD19789EAAFA8B1715111AE32E2ACED2278803B60E2FD63A43317498244A7CF7342342B60462510E19D83240DFF5D58E762C093DF326EA503FD347D2A92A5A4680D5E13B305671C729179FA21BE83B0D83144E63 -pk = AEF4C91C99D59119DD266B40DB4DAAAFD1D228C8EFA5940A531B0287CCDDEB0C14E343A9E444294BA25064E60A2301D3676850570C09C53E865C5CCDEA80F819 -sk = AEF4C91C99D59119DD266B40DB4DAAAFD1D228C8EFA5940A531B0287CCDDEB0C14E343A9E444294BA25064E60A2301D3676850570C09C53E865C5CCDEA80F8190200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008CF45ACCCBFB7990652F53381C41D6171D73BAE6B6583B44C951D7CBDD80E3DA65D5384107CF57B218BBB8403B8206000000000000000D86F1ED0698EB65555F363352F3687EB0AB25FC295D147BCF5FA2167A766BB33DB7885D08CC6207CBA4E4839EEFFCFFFFFFFFFFFFFFAB85E1382A307B4E48CD16154D3BFA85B2C8EAE1F79E68115B870425E292FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD048F1D4BCC7F8CFA3F33D577D69718711096E910441C2118DE37FA2F956000000000000000000000000000000000000000000000000350951F865A18F3CFAD91EF3A7FEAE7F87DB46E88F8275903CF447476AB2242654AC13BB8885F2C71FF9EED5F64B9FB09EEF565FCEEFDDAC648A8B56AEB5A21D7971C6F1AB187CA53F68FA57C605C48A3E9A1C812D47742A22E0AB4A9A2265178BF8223480661CE78FD4CDE35EC79B60B4A34A38D45A01EEC0E8F35B39DEDD13B1C1EB916F595742065B2781C93F7D54A9220DBA67BDBD3573145B6508C98515955AC6E40C1F03C3B5D12ABC69C9B13182C3421F803F0963571430772F725A27EB0C91A4C8289DBF26C7CDE084EAB7AA6A313C6D464D165DAB80BEA4438F4D1B6D2CEA48722212B8AA765C2D02CC05ABEFA25D9F4853B0EAD2300A47DFBF4623C020A957B9F1623B589A74B82A5F178DA0DDC275951BA8B5920EACC3A76717066CFE9EA91CDF28B081FC21FA0F074E34410DD5D80B59812843EAC4F4147CBE0AA2BAA92EE8509C9CE3A60E7872620A8A1FB8654F6E94AF709E4D6EFA9870EF28F35D1C5E9301A50B841E9014C4FD56BCC045165A406431A4832EB86E8819BF1D68F967917CAACA99590716C934A6C3F70E3BBAD2174BB37BE3A78702793D402CA941C3E62348304F3B6B7278A71E3B936D8E7BBB81918371190BA5405AE5AF21 -smlen = 3213 -sm = B437FFECE2B83983C0017F1DE8EA324FF0A071023179ACAF6DC3D85D2106A9D94DE9B55787224805DD612FD70EE25478B302215082C38DD8A17A6200E67ED5808ED0117F020010BFBF3941AED1C1CF03BFC9EEAD35E46CA7F7076D4991A4AB4572180B03A2D4F6F86EFF862A6D023A4B6F11F03D068F8204B517880767D300EC9502DCA755EA22CE22BCEF050173B275E82DF77918B4A9B66223947598050082A1F4AF6D6DB5DF3402ACDA8AA2AFCE63002601A39B6D7D91DE539EF11C3B67AE3EB1607716F587BAD5F60D311A9F4FE7F04350CA085EDA6D41C4BB6C6E13E376BF8A314DDF791AE18BE2EC0544AFD3CC27BDF270C4550E9E78D497B92349AC07755BF9167B2958BDE919123439D6F49C3408E8D88021E668A0A5FB6799330188E35EC5939B77097E3737C4F664D01D85FAAD0F583B3E95EDE125587E2A79991750D5CF804325C72DC8DDF3471EE8FDE02519D2D0CA7EDD651EEE30B3BE335CCF7FB02059BC3A47EE3C056D4929EAD4FCD82C8CF49625D5DA460DAA299718556BF0F77CC5CBADB99B64C8EAD4474601FD5C79309D4E63AAC392853072619EFD7B958F0EBDE5CBD40ACD57DF269A8810776D6DFF2E637EA57ADBFAA08DF8D2581C38CB262DBB4D1F3C65A4FA068539D2056E08DCF03BAFF006EDC688023A20728B227A99FED3B8F2BCBED2E3E6ECD8B8665A2E4D233B78D7C33F6E3BD9D0A24D13C8EACCCB53A21DDA9E7A34F9A0F031091E65F749C9EBCCF3DDC4097A121D8C68EB7883405EE34F6A8B0208EA8D5A3FAB53FE2CAD1110BFA6E094F78D5314880BB67BFDFBC2DF8AA250F1D7200FF9A3247C4976DBD1BBE99DF02A3F246E5D466F85ED2F68E0B2DE06B0F2448A7B98FBCBF5872BCAE71BF0DB4E70105B020FF130141E8DE86DBE05B7D2A234CE2EA83A38E23A262E46FFBC837E8A71F657E443052E9A49DEA4E344D497DD2DE2AFB4009D681F232BFF4FEEB173546CBCC4C80C9F85B1CE125BE678E5EC62EF04433D55D4B8829B01AC165A440FCD6594F2C0CB456C8A47444AB05A0F0717B8185930D9738E885D24DAB98E11ECFF7D7A48A4527F94FC4C9D1B9D71F5E6BB39CF92B1A6D0509FFFD42E77AC9AD6F50F8FC649B96B8AC08673F78AE8D0BA2B7243452B33AAC44B06A2B9BE1AD6A12583D3590A3F9AF0E0DC35DA88A257170D315F32F3A889601D6729433B7ADE0F719386723EB2A008634749F5253CB7D9B2FC99A1AE1BBBE7F00A536CD38F8A7237D3992C3897DF412F5B1D45E1EF5B5DC974D49CF8DBF785160BC527543458FD9378B3D4D3124214AE5676185794209AD0EE73B063CBD5B7830D00F817CA0D5CBB597C44D28E4885D935B7BF426C1339C500DAF4F2033FA6A27A4196F233256650472F205D2C5E00E7087FB73027B0C6C9AC5C1D928CCD190B8A6BB33F512CA8E2369DAE6111156DE47A24469683F4721A25652FF87474DFD92A028B3EC5BCFC244CE442752A7DA1DA6C33FC22573BF0B13E371CA9FCC86C76FCF7A1654EEF4442E47399835A06336E62952770C6E61C573CFD07B3AB631B8831FE3F5DD2C6DF68EBF2F8E02EC9F6B90A371ED5E62C8463780AC453AB6F72D38C8F5212C8B650F63B98E3C0886B6A85AE8E7256C1EFB30969532CDBF72184AECBDE2A17B9811DD4222D080049C5D36C532CC0E910779D64AF93D750EE96BDA87562EBD3830FEAD07A3960CD6DE7146603199563693392D3CCE1332DF35C2C8A2C251911D38E95815CE5A4CE5596E2D77711D87CDD54D22E8F0AB431BF8B24CE9C7BD6D077E436543C70B02F338841AF0FB86B5EA4B6A47E27C1D83E1AB06801044F546ADADA437F3CE7D788A1C92A74BA540664658E70D4F2711979153FF1589792859C3BF122628479C7C35EEE951DAB8CDB0D4D150C2DA338346988D34F8C5E589B231B5E00849611BA09711BD3A0516FD515E6C4AE1E8A3657C282C8120C97AA7A2E3BAA22B6EABB8D8212A9A48E7759A9DAAA51B538F662A05FB897067B7CF9D2CEB47A1897214CCFC225CE47CD60E86F7DEA49E220F7DDD6894B30B66460DECBBCB2E42B31F4ADF0AACDDE544B9124EA5ECB04B03C448B17E8094D489F516D23164D2317D3A1332E0500F1423136C8535D69065E880AF34CF7E36DB5FF2C18122E41880585B4D188411E86B370A024BD6E28143EA2EAE52EB46BE334A21A02E21C6755C0182B9A055A7D4C7B056E4930CE63EDC79C9FB4E2FBFFC58F776086F3487F02F8D1E7C8519C7F452E75CE5686A037B3642B95D7526ACD4A81A47112CF96A8DA7548016A22E9359198E871DBCC5852FBE14EECF3CCC5EB2FB5EC31D10474DF7D63482A03E11F4AAA2EAEDB714786E21D03AF1CD644D06BB05FF7B3959601580BF50E5F7F82FF42E9CF2FFCA0C67FFC52CEDC53C7A5C9EFB6C21092DDA374D1CCCBC78BBD9F5EE0FDF6DA6AC60C95F7C2E96F17E3C379A52D5DBD1A92DD76D1F5DFA19EA0408E0E7F7867445445CFA60BCEFC016E68872FBAC9098FD6A8E84731C285570B1BEACCA6F4728958E7924F7A7B7730B9BDC9AAEBD9E045F464071843C650D06C96D487CF8397286F81D93D0CC2008A62EE32421E5231998140909474F6D98541D899EA53714AEFE652A3D792E4C72533332C3133707A49293E3B2E06AE18F2F81D601AADDAF2FD09EC59350E0979A5AE2B721771682A1BFB5748D000F9736031CA971288F34993DF10FC06A16A6DBEED8CDAAA8127F3B71432E723558F0281459820A0F4A75A3B2716F976BDEB88BE9C73F31623050D7C1A96C84988B01D847309E1B6D7B815883F83C9BDB7FCDAEFA8BA69E25B824812B7D54530A3ECC96611897661158DAE1B4AAC112E9AC13D07FDC03DC7D5AF23C08C5E4BBFF737238FD3F1C06F94215BF2351DCE9CAE14B4DD4745AC0CD626054469C6A5286FF821BA192706D47CCEBC443DD67FDDB76797A8B78DD0DAF850CB5D181C82298616E1D3A92F7FC82FD256857915773C7AD97CBB9710373299AE8516B8A1D647A13C7BE848E0269ED6C8A91DC50D0CAD21430A3BC9E718A13D1966A0182D9A24FFF7ECBC7876C868AF2BAF2D8B782172C6719CF140E8CB877FE6D78779E1BB31C70C6C9A6A77529C51CF78A5E4FBD7FF6153B5195817F80603E5C5810C38CF43CA812ECA52F73F045E33DF4E3D04EC8C5F8B4A7399F6CBBF0D39DC951C476B9BCC002720CE89F09C3885673BBA9C90D20DCCCA4A82CE5BEB38BCD60AFE2BA65FCFB01C8793B7ECC0F0B17A9DA74F2E0FEF4C90B5132FD6BAF8C010FCB5E8E7FAEAD7F2E0DB29BFDD1811072623CEE274EF2EFB0F7D4191F332AAF20CF36FF89A2EDF15F7B284CABBBEF46901271D8C1B180F736125C8A44FE164AC7E687E9A58C3B1775238BF1A11F99BCB583D0E3C44BF4F76DCF9496A06F80CA52E24D55B54AB849D3040B4798BF5292B0574672E9F844016A52A4D4E4DAD2053207BC97215BCC1BB93271C03C9AD2DFC7485EE2ED399236AA06CF9A12972E21AFDC587A6334CD1D71A7539362D714BA26214664E3B4BC39CDB1DB847583DB8E002A2AAB451B4E5BD6FE200730BFB2745D03C82B640F4CCF58701708F724EFFDF98CB04C78DF36B7A866CFD596BF5EA18445EEA0E34ED514D0DC2625039049A0CC82711DBBEDCE339C77F9FA1DC60EDDD8D58C8F144B0F3D00227AFD8710BDC66D29809728D7FBE85F08AA38AEBE5605DA29A09CC0526FEE84691EAA54DC3744BF5A95275037FA2F600B1F91E502D5D81AF48F8EC4C1834FE625FCDF2364067048727559047E07062B4D8A7D3851853BF28BE9D2C511451E5FDD9459270328A2612DBFF42E1DD34005A3DA1226A023162F454923C0337E6C74B44BB27A3B1AC82DFD68B0A6DAF93473D97A9E4591EC01A51CB6B47E2C7A85C1FFA73C35E5CE3003BC4534A2D9B16EBF9FED6464CB1E0CC665A451616A62B6A8481E4506A73883198C144A06331224D358196C815C811B103959EDCA35B26BCF86F41D9C7638547496787885EE62B14AF431CAB2AD4E0224D33476C58B8B0833BF13B50BE2B1D682CA7DD194B793AD2C6E4EE25AAF95459302F0B4DAED907A317BCC6A5F8D76CA9AA0D799F8EA39F330D6244BFB9F35E6223A0F665A65F55EAB9BCBAB446D7FCD424DCE87F234864D2C27EE84600ED9193AFEFB6E7681BC94F514FE0748EB32D32262CAB880D79CD4FE5CC963A4F688D448F2DB2DCC5B0CA87AC26DD8506512C100273B8D4D902FC054D48D8BF9EE818AD9619F68A8904B613256DB78C881CEA3373F0CBBAC336A78CD91AD9D60126E05CB8C16E9AA8482CF1B806B2F9C57BC8D63BF008AB2E49EDE8E788BF96B9F1DB2918DC5063F3F1D5B9B1C0327141ACC0B4B248FFDCB8BCC127050D27C805E154A4825DEE6BE9C8D4E42B1F5EFC1EECC6A45DBC119AFB15CCAD19789EAAFA8B1715111AE32E2ACED2278803B60E2FD63A43317498244A7CF7342342B60462510E19D83240DFF5D58E762C093DF326EA503FD347D2A92A5A4680D5E13B305671C729179FA21BE83B0D83144E63 - -count = 92 -seed = 4D0788DE958A707899D5DCC02F756A10DEA2EFE0214F5E01B3281DF4E013CA75523ECEC64723D6C8BEC0B92C4F821D8F -mlen = 3069 -msg = 9163116C86E64D90D35CB216FED71BDBE6A0797A48CB915F5A40FC8D31AD340767058B28CFF0C240720327E12E653C1F98B5755D8000BC01324DB2820781B94C4434FDA76223845E0613E2526A95F28FB4A768B1487AA34DADB28CBE8DF4FDB510DFFE672FF004F37C7AC32072A24C0F12A050BB396AD56346F4E0BA75C0EFAC162288A7EE8A63255DBA5CF451A0932FD56B05E40EDD491293E045A6081F6586BDCA10B41A6970D8F9A7B3B6B58AA772EEFA9ED22C9A24A384D6947770862BE4FE45C5E0E56FA4D116B79699ACE41E5D9F2E4C245059CD798DD986A3763F527E0C9D5A88A09C4D76D447348509FA7D9BFBF3DEA59EA57711A3B1A9352123D4A74DF273FA24A89BCAB42A6D455B5FE3C503F1FF638280F87C740B9E4C5FF20133CBDFB8D08CAEB7DE9F26811D437E6EC8C3143C0419C2F5135D25C7F40C7908C03F295FD26F1A03FBC7285196BE40ADC6FBDDDC912B3BC94B0BCE08DBC2185EE3CB766325068DB55C31FFEBE4B1F6848AD4FC201A5FD056916A397ABE6A66FF9BB03B037B50AC509E46CA441ED45812E3334FD7036D190A7991E55CB817EC2A63CD800F293277E7D15F086618B55AD395C614D168FCEDFB274FDF4FCD50CB976F68A266C5365E02A1ED0221BA4E13E70304824F94251249CA23C089B4D54E02EA03FB7C9841DD30404428AAB2519D68CF564D75D18530C7D062496C120A8F5305AAB23AE52255EC919EB0CD875422B144BF47F7472349558E746B0EB5493F1FC40ABDADD2ED84A8B31221A485052369FD0B552972C9FAEB1A78E826BA4DFB9E91E301DB589E9D7C256E7051692C48534C6A5E2BF0F45B78ACA66D5F53E549827E15D64E2F294F93D43B9F36BEDCE6CEBC05E56CED3F846635AE3C384C3FD55B969CA31E8C625103C2B24E7EE45E92984CA23A331C5B14281B20116069C619D82D6080C6FE35C3A3FB2E73B695CAD9C5D3300814FD65738DCC3EAFCEFCD24361AAD13A25B3570D2D509FA449612BDB5B49E0605D7EB78449D1DB40660AF0F3D8BCD4869B6F175CD28AD72FE2668C3DFC1D4963D0EAB309DD50B74B9D2947F86FBE9864AE5D0DC69B55B182AC1D914B11F631193F5F1F897CE52CEE97D7AE95631FC2F2A1AE9B672165432EB2E5633B55185AFA5E883268D8503AEC10774D25D39C800B74405414FB06C55B8C48835577884D6B4F2F128246563066F8F34D76213E0720E899FC1F11A3B0A591885D82C688E40D6B44B54D6C7C6973156E2DD50C40A28D2EBBA60F5117D64646CAEF72974F4B8362E4820EC04F2F373DA8D883AF27518567688146F16BF4E10969E70BE8ACE5D2FF6A135DB1DD738907EA355FB6D243904F6427D11592672060DA14443B55A9089167FC9D5EFB2C64B0069795C341F90DAFF684E566611EA87BC40A4C45F22C23AB6888A754B89E4C95BB54629CE74EC999889C82714B5AEC703DE7BC080B0D2E622ED53B645688CE164ECDFF4ED66C86049B2F9077F2A94CD685294F8EA9CBC1DE29A48D39F6B308288DFDB47731E39644B576A298646752F5C53D7943A5D0F7DBBC9604902B61B8EDEFEB5AB7E5BFDBC1E6723E6047894547E440E918038CC13B47424CCFE1A207E08A40524B553C750683F5F6C960F05836FB9B28C59E1B471FD5331F1811DDF3EAFF73798B7FFD6C9714978988C440CA906B4782A410372D70EE65A0A803061708003688F576E2D3A22580B706149A24B93A162BE9F1B546680A1DB2A8E54A576C28B4772C50A55161B2994514369C2192B2C90017CC8282F41D28099F38B2F1F0D2C0E46B444417A2078755591F00F01DF0CE72B1D1BD255A14D2BF67AB3E630F95A5DA9BD9E10F08EFBF6FE722CF000C32460FA3271F18B39EAA4487C1DDF828B6BEDF4523837BB3425BA1C1606E8D5D1E6182AA6A74F068F3E90B42641347CA755779216AFBC99603391FCEF4E8E5AA202BDCA24B83FF42F4F01232D3F2831CDA2DB76FB93A4CF6E9EFB71B5438A4B74C3190A8901D73566C50727559BA9BF6317D116E8F5536BACF064D3F86282E0F88DD40B63E75519C6A8E5664AF8E1029FAE87930F523E4DC7C2DD6DC3296A42A59F178D438866D929A70951BED05533EB1D818B7C7C595971C26B1D436D26897D6A6EB036A13511AC4A3BD724F2CA57FEF07D2C0730800D35683D745125F4237ADD64B538B7DAB0D0F258DAF7DE1A74F74A2FD010CDEE810F514FCF6045F0CC84E2054B5F4EC2772718FFB4CCA9C9BE77F8F007333860180D60EE4DD8CE976E63FF49AA11DD42FE6946515E59DA3E602B1861BD3F63C89362BCFE8438BC71959A617D8D63331A3D903BC5734B777FB14F7A2B063D79EA8637AC52C758EF88DF217B95FA8FDF1009AB28D8A4F318F78772568CC7AA9E3B3E001C0111B1751B698EF1B66383D6B3CA942FE4F66FC97613CFBBC03EEC9D0B7E08F80939D9A2EA1F72BDA7B0D655AC3A94B4C699D3EB1BBD6076E63EF5C1FE9CE258B55D21164CA7EE03BB53D8BA4306F695E648093542D769DA95A35FF3A2C071DD8ABD5A82E217D82317065D50A87B689AE3A2EC7887957BB243373CF986490961220EA61EBE12AC0287B185070E124FC518C300620B4B6D4F29402B18C2462A7985C00E2A87691053B1FDECB7AA264F33E27C6B201CA6065EF79E5266513AEA92E8D3E646453C089B5EBA66D14BC45844D0240D2E7737C16668FD53E38A93D6003146019777C03644C300D06927EF6994AC794914EFC5BE0CA81680CA8C9752908FBD2D56D7FD1FC1C76EED755408F1D7802F0D3D0F347D82B162EE6F0A2A890E083C20B822FA6C4AD627F4AB5D1526D83D897C244D6ED4A427B23B4A0C19F4E8889257C1373764AB7063B5DB8ED9C2443CB012381A2B3365EB568649D7CCD52271F25FD22FDC397E4C9C536EBB452CD2CD10DC5010BF433F88CB58D2B9EDF2BCBFA83B782FFD4388F1BCE3F8F9AF5AE6BE590BDCECB1BFEA846D2F0199ECCDB0C7E4D419F69B6A428EAEB462B67AA40340417BDFEBB6039AAB8242E39F6C11EC136D73FB315CF71414A2A1203AF08FDEE34ED0072C27462395815F7779012A41EC526BE53DA954E1F7A7EBBB68FEB15CBAEA8ADD6CD0F2FE3D3615991AB54F4C7884E8A80A9535F13BE2ED944B3BB315DE8AF2A70439294CD53F041F41D3562BE840C78EFCB08661B1731FEEC46A9091ECEDE3A9FBC2DAE42C72EBDD84308E95644373595DB62157DBA7DBF124BB45DE6C2837B0066673BFD215FF915A8D41637EEB029C345E444251ECBBCDF79E246A80AA4591976A00DA06C759C6160ED1986F8E15A562417DA55109174628E7B11D49586882851205755B4F99A875AB3599FDCC094E4A2164E1764D24DE805FD7B20EFEF2A8E23FEA4E206DFA1FD9C31D90C1FECF745D3EB886190827D952703AA6A99B5000D8EE9D51DE94A82DD053B6AA89CD7E94E92D4AA93A9224D3F688B5C834A53F2993638166A3DE78ABA7CB930CC5845F9915E6523683715A187E940FA2A978B5CA4C3B80DB62E96A600F1864BF0B1AAC23B1330B13EADD3A2F07CE7181D0A9497C455D228278E5CC3E4C00A2EA3EB8E5B9CE2799256302B0F8F1F829D3A3AE8AA7CC4EA229C5AF476C01B8D48A9F6987DF57C3469B6EF6DFCB488A3D5B91FE17B5798FE154AB8399A2E75F0D15B2A6AA91302056266B22A38A604EDC374E2D2155ABCA119C11DC6827A47E3CEE7032F6E0F59708DFACE221E47041CFFC59CE0334D9B7C5E91C2C320A70EC2F32906624128363C893909F47BD970DF652D5E6C2324033F32B1653A039F8C051D9DC8F839C50F5696E9E08F7F1CDAC4750B429AF03176FF6E643ECA1D8FC710C6CDB0D26074D85316F4C9084D5F453F6D36C1CEA0E389F3462E1478E2503C1DB99FC46F3F0627F173672C21F3CC3B483998192E81EFA689819D0007762ADBD141A058587E030A3568E412D25662C40ACDAFC3C6EE30C10CC23E3DDEDB6C73085C90C89B1218D67A328F06C3637A786D4715CB9F9D8B0B22D920B68B0557CC80A56FCE0B6E2D6627DE576E308757A8F37821898E96785AE323E413D3572205B0A5710143A2621C258C76C7C3FF7100A2FCAE99C84D1AB1CECF7FC5B1E4698BFA3BA2A0856A65F2D4F291A4A164C0381D70D1213F7E40FC4BA42C43EA8E70043E27C5AB0827559B7CF7F2587D0D2F93C6382CF54E92764D815280D68C554E5B6FBB351BD18635786299DDE39FCAF3EFA708A3F18701EDA1579BFB0BEE4FA1F1ED6E09D450D427E4B91F4552F87F31F06F109E74AF4BF301481452AAFA2146F6375DA467EA008BAFC3C8408AADD61B07C28C55249EC0C8BFDB00EA -pk = A0DB853AA90B5D5F79B5503EFB7781915E6408475F9AA7F546D1D207FC26E413D7CE99A82979D7AE5D9F8D22A74849583B3E205287C3697347930619AEBFED02 -sk = A0DB853AA90B5D5F79B5503EFB7781915E6408475F9AA7F546D1D207FC26E413D7CE99A82979D7AE5D9F8D22A74849583B3E205287C3697347930619AEBFED02020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000288986B325ECDAB7CC2E0FAD61E4539714887BE4BE2A2111975E131D39D77B038C26A0B5FF4480951F2D703D26BDFFFFFFFFFFFFFFFF652C0B694DE9FB2974909913AB3D0F1C7F1DC194F450CB486D3F54A08D8DA5C10D2EA19DB5DFC456CD2F17B947D4FEFFFFFFFFFFFFFF6502F80BC3904154DFC50DB418B15D38B9696143F7DAFB1A69E51BE78AD7F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF986E6C095917B813377762422749F6A2C00CB434A01C99B1AF95907BA6980F0000000000000000000000000000000000000000000000DFDB9E5B4C6E4070F6DDD36058B371BE1DA2A956E9DF5D579FCED9844793ED2A99C72F86634689A95365B105D05500B69C673DE3E1B7722C27B008CB842199311CE1B94DCC162AC7E394151A0E735B617DA67BE0684F22798954C8BE6B3CB32B7DB9BD4A2A7E544FD6342DA8F9C46F41691B6C51542E0C3C3A85B89C0861F92FEF1586BE20F4A30DDB39F7CC756DC8A6DF57FCCF6535DFE10F678EB7358EDC22B1F04E91478A1C6B7FF255F0ED66B616D52884F044B291DF7787582AB4E0C013CFD557573FFBCE21FC44C3A3D705CF239A385E303378757296319C3504F1A22089133FBC79C57B009EE70BF717B44EFBBBA0D1CD4952C05BD62F3BA0F51A1E1AC882E50439510985E22BA3430F23FB696295BC5016C01204D2CC28D6A6FABB27094565AD99B81AFBDBE8E62C70FEA966057BF3F083EC104AEECB569246E3CC15ABD7242229914F248DD19910DB7663991A3AEC9FC1C617930F0AE6A9C3291A2CB07D6FF46E9F7666E80B9A0E8E909C41E332FFE7F422DEFA7B38E803E6466C09F9E9C04CE70D228E36933443E155C8DE765048A56C09C8C4A45163B3A46A912FF437CD19D2E3C9F31EA18EE9DC90EB4C7B8CF003E237BBD5C6685D53284B4A2A -smlen = 3246 -sm = 0AF6A9FC8C38AC7439072F185ACBFBE04ABB160675199E90BC7648B27B032FC0A4995CDAF6C52B060E843FDB745B6AF61B054D38FEE1FFC56B0A1700FA37A2895657E6586300040EEDC49878B5C2B10688F073073CF483518C043AED257E2051C3FC97034E54A881B71EA5AE66070A38EF1DD08AD1B0C901966A77911627462EF207A24CD89E5AD0451BD500011790BE96C1AEF75874632747F4FB4A1A0F02B8712709981BFA5B890177CF0885AB8B59019163116C86E64D90D35CB216FED71BDBE6A0797A48CB915F5A40FC8D31AD340767058B28CFF0C240720327E12E653C1F98B5755D8000BC01324DB2820781B94C4434FDA76223845E0613E2526A95F28FB4A768B1487AA34DADB28CBE8DF4FDB510DFFE672FF004F37C7AC32072A24C0F12A050BB396AD56346F4E0BA75C0EFAC162288A7EE8A63255DBA5CF451A0932FD56B05E40EDD491293E045A6081F6586BDCA10B41A6970D8F9A7B3B6B58AA772EEFA9ED22C9A24A384D6947770862BE4FE45C5E0E56FA4D116B79699ACE41E5D9F2E4C245059CD798DD986A3763F527E0C9D5A88A09C4D76D447348509FA7D9BFBF3DEA59EA57711A3B1A9352123D4A74DF273FA24A89BCAB42A6D455B5FE3C503F1FF638280F87C740B9E4C5FF20133CBDFB8D08CAEB7DE9F26811D437E6EC8C3143C0419C2F5135D25C7F40C7908C03F295FD26F1A03FBC7285196BE40ADC6FBDDDC912B3BC94B0BCE08DBC2185EE3CB766325068DB55C31FFEBE4B1F6848AD4FC201A5FD056916A397ABE6A66FF9BB03B037B50AC509E46CA441ED45812E3334FD7036D190A7991E55CB817EC2A63CD800F293277E7D15F086618B55AD395C614D168FCEDFB274FDF4FCD50CB976F68A266C5365E02A1ED0221BA4E13E70304824F94251249CA23C089B4D54E02EA03FB7C9841DD30404428AAB2519D68CF564D75D18530C7D062496C120A8F5305AAB23AE52255EC919EB0CD875422B144BF47F7472349558E746B0EB5493F1FC40ABDADD2ED84A8B31221A485052369FD0B552972C9FAEB1A78E826BA4DFB9E91E301DB589E9D7C256E7051692C48534C6A5E2BF0F45B78ACA66D5F53E549827E15D64E2F294F93D43B9F36BEDCE6CEBC05E56CED3F846635AE3C384C3FD55B969CA31E8C625103C2B24E7EE45E92984CA23A331C5B14281B20116069C619D82D6080C6FE35C3A3FB2E73B695CAD9C5D3300814FD65738DCC3EAFCEFCD24361AAD13A25B3570D2D509FA449612BDB5B49E0605D7EB78449D1DB40660AF0F3D8BCD4869B6F175CD28AD72FE2668C3DFC1D4963D0EAB309DD50B74B9D2947F86FBE9864AE5D0DC69B55B182AC1D914B11F631193F5F1F897CE52CEE97D7AE95631FC2F2A1AE9B672165432EB2E5633B55185AFA5E883268D8503AEC10774D25D39C800B74405414FB06C55B8C48835577884D6B4F2F128246563066F8F34D76213E0720E899FC1F11A3B0A591885D82C688E40D6B44B54D6C7C6973156E2DD50C40A28D2EBBA60F5117D64646CAEF72974F4B8362E4820EC04F2F373DA8D883AF27518567688146F16BF4E10969E70BE8ACE5D2FF6A135DB1DD738907EA355FB6D243904F6427D11592672060DA14443B55A9089167FC9D5EFB2C64B0069795C341F90DAFF684E566611EA87BC40A4C45F22C23AB6888A754B89E4C95BB54629CE74EC999889C82714B5AEC703DE7BC080B0D2E622ED53B645688CE164ECDFF4ED66C86049B2F9077F2A94CD685294F8EA9CBC1DE29A48D39F6B308288DFDB47731E39644B576A298646752F5C53D7943A5D0F7DBBC9604902B61B8EDEFEB5AB7E5BFDBC1E6723E6047894547E440E918038CC13B47424CCFE1A207E08A40524B553C750683F5F6C960F05836FB9B28C59E1B471FD5331F1811DDF3EAFF73798B7FFD6C9714978988C440CA906B4782A410372D70EE65A0A803061708003688F576E2D3A22580B706149A24B93A162BE9F1B546680A1DB2A8E54A576C28B4772C50A55161B2994514369C2192B2C90017CC8282F41D28099F38B2F1F0D2C0E46B444417A2078755591F00F01DF0CE72B1D1BD255A14D2BF67AB3E630F95A5DA9BD9E10F08EFBF6FE722CF000C32460FA3271F18B39EAA4487C1DDF828B6BEDF4523837BB3425BA1C1606E8D5D1E6182AA6A74F068F3E90B42641347CA755779216AFBC99603391FCEF4E8E5AA202BDCA24B83FF42F4F01232D3F2831CDA2DB76FB93A4CF6E9EFB71B5438A4B74C3190A8901D73566C50727559BA9BF6317D116E8F5536BACF064D3F86282E0F88DD40B63E75519C6A8E5664AF8E1029FAE87930F523E4DC7C2DD6DC3296A42A59F178D438866D929A70951BED05533EB1D818B7C7C595971C26B1D436D26897D6A6EB036A13511AC4A3BD724F2CA57FEF07D2C0730800D35683D745125F4237ADD64B538B7DAB0D0F258DAF7DE1A74F74A2FD010CDEE810F514FCF6045F0CC84E2054B5F4EC2772718FFB4CCA9C9BE77F8F007333860180D60EE4DD8CE976E63FF49AA11DD42FE6946515E59DA3E602B1861BD3F63C89362BCFE8438BC71959A617D8D63331A3D903BC5734B777FB14F7A2B063D79EA8637AC52C758EF88DF217B95FA8FDF1009AB28D8A4F318F78772568CC7AA9E3B3E001C0111B1751B698EF1B66383D6B3CA942FE4F66FC97613CFBBC03EEC9D0B7E08F80939D9A2EA1F72BDA7B0D655AC3A94B4C699D3EB1BBD6076E63EF5C1FE9CE258B55D21164CA7EE03BB53D8BA4306F695E648093542D769DA95A35FF3A2C071DD8ABD5A82E217D82317065D50A87B689AE3A2EC7887957BB243373CF986490961220EA61EBE12AC0287B185070E124FC518C300620B4B6D4F29402B18C2462A7985C00E2A87691053B1FDECB7AA264F33E27C6B201CA6065EF79E5266513AEA92E8D3E646453C089B5EBA66D14BC45844D0240D2E7737C16668FD53E38A93D6003146019777C03644C300D06927EF6994AC794914EFC5BE0CA81680CA8C9752908FBD2D56D7FD1FC1C76EED755408F1D7802F0D3D0F347D82B162EE6F0A2A890E083C20B822FA6C4AD627F4AB5D1526D83D897C244D6ED4A427B23B4A0C19F4E8889257C1373764AB7063B5DB8ED9C2443CB012381A2B3365EB568649D7CCD52271F25FD22FDC397E4C9C536EBB452CD2CD10DC5010BF433F88CB58D2B9EDF2BCBFA83B782FFD4388F1BCE3F8F9AF5AE6BE590BDCECB1BFEA846D2F0199ECCDB0C7E4D419F69B6A428EAEB462B67AA40340417BDFEBB6039AAB8242E39F6C11EC136D73FB315CF71414A2A1203AF08FDEE34ED0072C27462395815F7779012A41EC526BE53DA954E1F7A7EBBB68FEB15CBAEA8ADD6CD0F2FE3D3615991AB54F4C7884E8A80A9535F13BE2ED944B3BB315DE8AF2A70439294CD53F041F41D3562BE840C78EFCB08661B1731FEEC46A9091ECEDE3A9FBC2DAE42C72EBDD84308E95644373595DB62157DBA7DBF124BB45DE6C2837B0066673BFD215FF915A8D41637EEB029C345E444251ECBBCDF79E246A80AA4591976A00DA06C759C6160ED1986F8E15A562417DA55109174628E7B11D49586882851205755B4F99A875AB3599FDCC094E4A2164E1764D24DE805FD7B20EFEF2A8E23FEA4E206DFA1FD9C31D90C1FECF745D3EB886190827D952703AA6A99B5000D8EE9D51DE94A82DD053B6AA89CD7E94E92D4AA93A9224D3F688B5C834A53F2993638166A3DE78ABA7CB930CC5845F9915E6523683715A187E940FA2A978B5CA4C3B80DB62E96A600F1864BF0B1AAC23B1330B13EADD3A2F07CE7181D0A9497C455D228278E5CC3E4C00A2EA3EB8E5B9CE2799256302B0F8F1F829D3A3AE8AA7CC4EA229C5AF476C01B8D48A9F6987DF57C3469B6EF6DFCB488A3D5B91FE17B5798FE154AB8399A2E75F0D15B2A6AA91302056266B22A38A604EDC374E2D2155ABCA119C11DC6827A47E3CEE7032F6E0F59708DFACE221E47041CFFC59CE0334D9B7C5E91C2C320A70EC2F32906624128363C893909F47BD970DF652D5E6C2324033F32B1653A039F8C051D9DC8F839C50F5696E9E08F7F1CDAC4750B429AF03176FF6E643ECA1D8FC710C6CDB0D26074D85316F4C9084D5F453F6D36C1CEA0E389F3462E1478E2503C1DB99FC46F3F0627F173672C21F3CC3B483998192E81EFA689819D0007762ADBD141A058587E030A3568E412D25662C40ACDAFC3C6EE30C10CC23E3DDEDB6C73085C90C89B1218D67A328F06C3637A786D4715CB9F9D8B0B22D920B68B0557CC80A56FCE0B6E2D6627DE576E308757A8F37821898E96785AE323E413D3572205B0A5710143A2621C258C76C7C3FF7100A2FCAE99C84D1AB1CECF7FC5B1E4698BFA3BA2A0856A65F2D4F291A4A164C0381D70D1213F7E40FC4BA42C43EA8E70043E27C5AB0827559B7CF7F2587D0D2F93C6382CF54E92764D815280D68C554E5B6FBB351BD18635786299DDE39FCAF3EFA708A3F18701EDA1579BFB0BEE4FA1F1ED6E09D450D427E4B91F4552F87F31F06F109E74AF4BF301481452AAFA2146F6375DA467EA008BAFC3C8408AADD61B07C28C55249EC0C8BFDB00EA - -count = 93 -seed = 55A9C7A0B49706090BC0702ECFC070AB060427FFC820C3FE05B499B59AEB125F2DB4787A5910B88C6F8FAF0A69BE0AE5 -mlen = 3102 -msg = 02C7C4451DA90503C43FDED1CCB3DEE468A6A8D9E56670CD8F6A58E7941F1BC5EFA6E2AFDC0141A2F7E8F781D79E70B4813263A9DBC8D8A67F89371CFBD90977EC96461B28BEE4C644F2C91E96257B1909B84ECB25CF438A3FD6B835E20D5CDA56A1FB7995FCAA0EE1B5327FB1288E3C57CBEF0554CA5AD6FCD1F1865C6AEC6CBDB24495700AB5AAF078D8516CA4FA3A231A97C77BD150B127CDBFB42C03702C9027B2A5F6594B022EF55B63BF3EEC27EB0E9529ECCDC82BC6AD1F011F167D602EF1F175DA5DB4028BF08A053AF2C728ADE93B37EDC2A75B7B6C6CF38CD1C07F359C73B131B13DF76139DEE6795F1D85B47F29AE97D0E40CF5DBB67360044F78940A1E80D9D99FD5AB0185210D8769911BC471650DF0FCB9C3AF038F7882F677790E146E612FCDD6FB89F90B7E5E46CD648F4BF8F736D69F8A91E4806346B4366FD48D1481C0B47ADD82003310B0A99B779D63EDE1771F50221651B2D8AF40F48B92EE1327C85A1D2EF2D86378076BEB58556FCAEC6029649A0EA5FDE517A85D87704210E071FCB6F63317AEAC3EB3E9746018E1028C50C790A45B1BEDA6EEA2D646DCE401AD5D7850A5F69CD85301920DE77AB0D01B1361EFA3E70AC05881BC02190720ACC75A691D6064F9D24C79DC72476309E58CDDF5FB2A253D857A79C8E898AB6ADC300EAAF208820CB02F5F2CD317F4052D40DE28E52C55A0349DD855D64E8DA8296D4F572281E221A3D27EF76FEE67FBE5484E6460C99950763B801FCE828E93D2A633A1CA5D7EC582D7C463DA5A9AA8056BB2173306F3820BD0A3273742789B61AF89CCC42B81CC68745800D2A59231D5D28E832F443A871DE5B6B10B58A8AA7CC9816014D7F3545DDF1F481B7F0C9DD41B4D96E5DB767B74776C2253FA230DF65F3E0B944B95ECD4138E2847418B084D9F9E0798CB5247238EC12B88C10A5C0C645E1D09D09059C72E33C28A472FDD8B88EAA93C63BE7D980A12195C2EC3105DF2BB81CC9C3009F7771B6B813CD12303E3A9961D6731AF55ECFE5127BAC68D06F835DD5F2D584FC0E648C3A4256E2A3D4B81966010964657F33D1FE0400724C488D5AACF9F2C0B802CD812C8452E5B8E2B17FF4A1289D33FC405F5DB4ECAB4A73FCA3634756DFBF9012C413B6F64788FD0F68F8AB7620477ACD3C14009377F3DD54B9EAF2784433D63341323F54D113FD63D7456AFEF885F13C13172A37A5DC82336B9515F8F7F4903EF6DBE9CB34930743B6ED11265CF94AAF406DEA9802D17BCB369AD0D9964792F74D338DAFE47EE88B3B74EBA8E70774EDC1F16FA876FD62B0BFF880CE252EE4435B1DEBF36F0A06A4FB406F01D618C135E6103E2A39F4C9CF41EC93702BA76BA753AB49B5836C20F67D05943EDDDF47AB8C5B81F4BC22D773305076F7E5B697A7B25B016190072F756F19F397884E0521595326CA591672684A3BE17C9F5CC8E8F4848F7136762178FBDCC7BC6A6C6A31345FEE687B0505F72BF1AB7EB87BFE5F896CFD42DD67A239C70648B39BC0C84DA33CA17838FB4213C38B68F22914FEC3DC50194E883720719E9B5F8D037DEBB726DBD899ABD97853C54B0BC347A322BFAF961C6CD6209C98AA81B8E2595FC151B1375BF4FCA2DFF49DF40A3D1C694EDFF6E9687E73EF62DD42AD7A05195A7F206F097196AA0E4D68F8132D4A00CEDED940C4F6AE02E6D3763073462C7A4BB11778290E744471EC554A05917E52C5263FF02C07BEE055234EEE10B79175DC164AB2051B03598DF1D4311E87ACF4AEC45C55B1A58B0F05EBDABE248A27C0187643CB8F9529D31FE0AC4A28D780196DA00DACFF5F2DD64FB04E7C159DBBCDD3343BCB7AE188DE15D923D2AC0AF232C5389DC9C949FCE554F7A0425D4F9B28DF2EE4B81740C2B5A5B93F0F7AB75EBD360CBC78B11C28608B5BAFC970CF3D4455A20A198392D876EDCF89E2639B50CD84AE21BD50FB077050EBFFB210BE711D8EA807CA66493650E909911FD3CAD99AB94B2AB2EDFF192D9D75257818272E147A9C54E06C53210FC091BF4175F2F44423669716FD9A6C4F96A0C4BE17839769A806453E55D7357FBFB3D7A458E70957D524C0E896398E135BFA68A0CC136FB93EE7D30AD463E32E152FC32CB8E7F0B05A30EB13C0DF98BC187EC0A54856D2EFCDA10A82B89DC8CD21C67D9B6DF3D7005EF3B2BC9DCD5D55B64DB40B74FD322CDF9D9911A00B5A02E1AD5CA9BF65D90DB709FC1E5FC84BE97574B09C83B49963A51228A667BBD84BFD8E0D90EC161FE5CA73BCB8D95FD7AFD982AB7EBAB51BD2B24CD6D356EB850D2C65593313D8EBB97E7DFA450AE982918582F86A356F538EB05AFD460566D79F040D36C93D3C645B636560007D51B121DE3FAFB3ED70B475AFF9617DA4B52937C628678B109C3B76BC15BD02B766A394893D8EC966DFD8033D12A8D98AC5BE201134325E32CB6786F4FAECD7DCD05AEF5F3739122B817824A672E71DEB312CB7DD6A77116B30715076384297B1962EFDFEE6D6D2B2ED2EA4DD802F4784872D825DB828557D4D927B7232682AD91CEC3E508854F529853A8797B7BF7BFF8E3C180980DDF4081E96A12A495ACDE0C73282AC78617C68A55A94573E5A37B859858D1E19ADC82821B316B9D346ECFC6DBFFB3779F692A62D20D1BC4E730FDE2AEE826E76638ADE3DFAA11057B0BC8A80E8905B15E41D9A4105109F18E7E1362149AE9C568D1D642D65B94253BE2B13E7230F8BCF34DC87241D1DE72A65BBA111C111CBF5BD618CD02E0A06E37F60B3736631073A6BE004C1AD5F0091A82C87B276F7C5AAF6938C886A6039DF23482E2064F6AF05636B4C6BA6B24A29AAF2174AF4BD959177203AE9B160F81CA6764948AFCDACF6BEC0B987C6DBE178DCF47C137C64809483019C5F2072D0301C19C500C60B5CA913C24A8F28F50E1578D806FF9F9B810CA14BF5F2268FA18DEC67D973EB1D975AAF871ABC980D06222493D900CEBD8811FA20D5DB8F8036430F8BD7F9554F7CB47F9EBF389F66C3CCF9F42DB57AFFEE074FFEE4EB3E11612FD8A8FE02CC4E9D2F8BB36C505CECE9DC87512AEB5D8EBE33328C5217CCAF2E1AF1E38BFA84C0035DECD8D8C250FB4D964E8F0AE448AAB740D9EE9D794390686FE9A95183F0D5166D479C51014F1F29D8FEC616E1A4E7A9C86E2AF790BC7BD7BB6F746A2266332E04AFFBE6B9512E6620681C3317DC846E4FD7974E8AE87E370ECF9DFED574E339CD7E8A663ECD1A7BF5842391913D98686F7F2145BBC420F2F58B89131D5F3BE41C85752E13504BCC549A8F690CD2B0E1E29E4DFA3CC76BD398BBF28F33A00C3915DD719F7CB985E9A0A7CC8190BFFC8BF47310C71418D7A6C629C491EB8E455148BD4438BA6B7014608B0CE6A1BC5B035BC174C9BFFD966D8305FE9E5619BCA3FE4B39E6732DC652531819AC828F86EA11360678E786EAA741382D713AE26A608D582A3E4583D45744ACEDD32670B5AD4A1310301B28A174DC9858A55F0C1B7486CD66CB0635083B0C63016E40DFC533AB80C9CFAF1378D00769DCBAD56B09DA3A4E6CDBFD8F3FCB951680020DCA58647665462E42F42DC14E7B20F262D3CEB0B1A2BA807B98D66232AD7D3839C298564BC36A134CC2447B1B9FE69271960459C0A6F897C1878140690DA7D41FD8AAA05A679FDC3037EB2885AD3C82374F4BB991745351292DFD8E54F565E0093776B7EA65DDCD500BEB4D15AF6029F2630A0062F2D4FB331B47B6A5E139D385016E1FA490EAA209636B1383B7D7DC1148F07ED2CC2C03FA7FEE09305F34C57B3CE899C18462B4F1EF88C1AC5259440AAB48C5849652AAD9D3CF3D31F36C7F64F918868182D36345BA5BB7A4EE088D8B081EB78FE977F5A5295177AA427215BB26D1DE33AD4B2D610A47F8C672EEDA703A04D0FAE4C5961F13AD6FCA81863D8A394135565D8B27904A511FD0621A532F84A47CCF4FCC2114D4C369B7A76822959F8CAA25A6495081CA9EC3AC3348A981618592C090B6439CDA2FBC932C8697B3709323E3388AF8EFA1B9CDBD65A65C8F0C302330DDBD10E0235F8030562452EDE447EE5A5A9A636AF6F615B1210AA7CBE69572B3467B643BC5F5EC3F9AD15B3AD918993355E209ACBD0F1393076DA3B0950803295B6571E476ACAA04D48A4627367CB7FAA83796C4178CA9071DCCB8D3EA70381B61F0C56D515E0A765E266DACB13056317AD8737A1AD541AACCEA1641946E331229F19BB54C20BD51E63D63BFFA13110A552FD0A95AB984EF53BD639EFA0568C6875B2798E3A0578C940C0C4197D3587BCB1CC45A99F5D37B1612DC1A4178A3E288FBD79DDACD049159D6A5416F9EF3F38C74449BFB2E6A894566C5C17B4555E154F29A93241463690 -pk = 943345B50185D5A160F66015B9C8946B54FE7FE8686C989C78D4295B35AFBD11151E2DBBF6685345735FF47044719E8AE14BA5ED3BE4B19873835EC8505B8E12 -sk = 943345B50185D5A160F66015B9C8946B54FE7FE8686C989C78D4295B35AFBD11151E2DBBF6685345735FF47044719E8AE14BA5ED3BE4B19873835EC8505B8E12020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DC37128F5DA332E1E63F7D1E3181EB82C9B32AF07E6B21C9137CE8D3951F38CDA03E211406E4EDD36A227D6A2940FFFFFFFFFFFFFFFF3B399E13430FA933C1ED691DCC58EABD13D99AF173A5A940F778FB79C9FFC9AE8CEE3651B3361D3DB8E2E159F12EFEFFFFFFFFFFFFFF0568AFFCF281BB5AF3EE30FD2A9FC9B93BB6D00A6C4BA51D9A0BD851B586FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0CDBADAC14EBEDDDC6CB2521260AEBEBF9135C9B9E1023A8C35945628E690E000000000000000000000000000000000000000000000033E0123BD13C0D3D80BC7C2B05218AD03E3130E360A80BAC41CE6447FC9F53107B9E23BDA72BF1C1EB28A9FFB506E1AB98072DD4ED7E7CB196D8AB5137253E1125FBA99251C58B2D6E6143C83CC5D4EBA772E2DDE38CCB20972EC89DCE853F2E32C6FB3720FE1E1526DFDF179A668DFBADC124FE30877427F7508D269BAA000E06C35ED82E6FAC8C15517FCD6EF83A2DD5689756E5CC0119B708CF64CDDB300EF2F6D15C25DA5867ECEEE6D5B12691871787989F920C17497ABD6A65664131216DF62E073EB551CF9692D7DDCCD743BF165ED24677D4161F6080CC5249C03F017EE3884ECD1C14DD0648F7645E455E7330BBEF9D2A522F9153F527D02A05E718ECECB21AC248A767F89CC85A30438DAF78A1FFB0567CF80E5571ECF9E3C44E08C4CA728E75EA253CC903344687BF23623F8CDA46C6D4D05A73BFC86564E06E06C4CCD704FF0EEBC775271496716681F6F77EAE2B3139B529CEBB40F2FBBF012E78DAD559EE10D1395F0A0AC1B357681B1378419CAF28BDE1792DFDE2E5E52B2A49BEBA94A3002255F82FEEF1B4C3081273B88ED29606CD43D23CDFA6B8125F183A70ECA16B35CF9FCE844CCCDFA042C71D822DFC987D98B2B40DB8E6C41BA101 -smlen = 3279 -sm = A810EEF34CA22AF177032A86ED70E1205E9107064DABDF2FBC73E7DD940050D963325E87476A750422131BFF3E70B5ECAC01C32E274763E59728DA0547C00DBA7424CE0AA5038E132FDE583744C8D801626F2C430AEEBDF09D030B06071CFB752DD0EB01C199A31DD9B9589338051D920004D23E28E03D04C3462A515A054978AB065B9499C2D62C99A75C06018BD780C1FEC13F1C1C7FE9BBEF0319F80E03848925A4B390BF7A7100D96C845734471B0002C7C4451DA90503C43FDED1CCB3DEE468A6A8D9E56670CD8F6A58E7941F1BC5EFA6E2AFDC0141A2F7E8F781D79E70B4813263A9DBC8D8A67F89371CFBD90977EC96461B28BEE4C644F2C91E96257B1909B84ECB25CF438A3FD6B835E20D5CDA56A1FB7995FCAA0EE1B5327FB1288E3C57CBEF0554CA5AD6FCD1F1865C6AEC6CBDB24495700AB5AAF078D8516CA4FA3A231A97C77BD150B127CDBFB42C03702C9027B2A5F6594B022EF55B63BF3EEC27EB0E9529ECCDC82BC6AD1F011F167D602EF1F175DA5DB4028BF08A053AF2C728ADE93B37EDC2A75B7B6C6CF38CD1C07F359C73B131B13DF76139DEE6795F1D85B47F29AE97D0E40CF5DBB67360044F78940A1E80D9D99FD5AB0185210D8769911BC471650DF0FCB9C3AF038F7882F677790E146E612FCDD6FB89F90B7E5E46CD648F4BF8F736D69F8A91E4806346B4366FD48D1481C0B47ADD82003310B0A99B779D63EDE1771F50221651B2D8AF40F48B92EE1327C85A1D2EF2D86378076BEB58556FCAEC6029649A0EA5FDE517A85D87704210E071FCB6F63317AEAC3EB3E9746018E1028C50C790A45B1BEDA6EEA2D646DCE401AD5D7850A5F69CD85301920DE77AB0D01B1361EFA3E70AC05881BC02190720ACC75A691D6064F9D24C79DC72476309E58CDDF5FB2A253D857A79C8E898AB6ADC300EAAF208820CB02F5F2CD317F4052D40DE28E52C55A0349DD855D64E8DA8296D4F572281E221A3D27EF76FEE67FBE5484E6460C99950763B801FCE828E93D2A633A1CA5D7EC582D7C463DA5A9AA8056BB2173306F3820BD0A3273742789B61AF89CCC42B81CC68745800D2A59231D5D28E832F443A871DE5B6B10B58A8AA7CC9816014D7F3545DDF1F481B7F0C9DD41B4D96E5DB767B74776C2253FA230DF65F3E0B944B95ECD4138E2847418B084D9F9E0798CB5247238EC12B88C10A5C0C645E1D09D09059C72E33C28A472FDD8B88EAA93C63BE7D980A12195C2EC3105DF2BB81CC9C3009F7771B6B813CD12303E3A9961D6731AF55ECFE5127BAC68D06F835DD5F2D584FC0E648C3A4256E2A3D4B81966010964657F33D1FE0400724C488D5AACF9F2C0B802CD812C8452E5B8E2B17FF4A1289D33FC405F5DB4ECAB4A73FCA3634756DFBF9012C413B6F64788FD0F68F8AB7620477ACD3C14009377F3DD54B9EAF2784433D63341323F54D113FD63D7456AFEF885F13C13172A37A5DC82336B9515F8F7F4903EF6DBE9CB34930743B6ED11265CF94AAF406DEA9802D17BCB369AD0D9964792F74D338DAFE47EE88B3B74EBA8E70774EDC1F16FA876FD62B0BFF880CE252EE4435B1DEBF36F0A06A4FB406F01D618C135E6103E2A39F4C9CF41EC93702BA76BA753AB49B5836C20F67D05943EDDDF47AB8C5B81F4BC22D773305076F7E5B697A7B25B016190072F756F19F397884E0521595326CA591672684A3BE17C9F5CC8E8F4848F7136762178FBDCC7BC6A6C6A31345FEE687B0505F72BF1AB7EB87BFE5F896CFD42DD67A239C70648B39BC0C84DA33CA17838FB4213C38B68F22914FEC3DC50194E883720719E9B5F8D037DEBB726DBD899ABD97853C54B0BC347A322BFAF961C6CD6209C98AA81B8E2595FC151B1375BF4FCA2DFF49DF40A3D1C694EDFF6E9687E73EF62DD42AD7A05195A7F206F097196AA0E4D68F8132D4A00CEDED940C4F6AE02E6D3763073462C7A4BB11778290E744471EC554A05917E52C5263FF02C07BEE055234EEE10B79175DC164AB2051B03598DF1D4311E87ACF4AEC45C55B1A58B0F05EBDABE248A27C0187643CB8F9529D31FE0AC4A28D780196DA00DACFF5F2DD64FB04E7C159DBBCDD3343BCB7AE188DE15D923D2AC0AF232C5389DC9C949FCE554F7A0425D4F9B28DF2EE4B81740C2B5A5B93F0F7AB75EBD360CBC78B11C28608B5BAFC970CF3D4455A20A198392D876EDCF89E2639B50CD84AE21BD50FB077050EBFFB210BE711D8EA807CA66493650E909911FD3CAD99AB94B2AB2EDFF192D9D75257818272E147A9C54E06C53210FC091BF4175F2F44423669716FD9A6C4F96A0C4BE17839769A806453E55D7357FBFB3D7A458E70957D524C0E896398E135BFA68A0CC136FB93EE7D30AD463E32E152FC32CB8E7F0B05A30EB13C0DF98BC187EC0A54856D2EFCDA10A82B89DC8CD21C67D9B6DF3D7005EF3B2BC9DCD5D55B64DB40B74FD322CDF9D9911A00B5A02E1AD5CA9BF65D90DB709FC1E5FC84BE97574B09C83B49963A51228A667BBD84BFD8E0D90EC161FE5CA73BCB8D95FD7AFD982AB7EBAB51BD2B24CD6D356EB850D2C65593313D8EBB97E7DFA450AE982918582F86A356F538EB05AFD460566D79F040D36C93D3C645B636560007D51B121DE3FAFB3ED70B475AFF9617DA4B52937C628678B109C3B76BC15BD02B766A394893D8EC966DFD8033D12A8D98AC5BE201134325E32CB6786F4FAECD7DCD05AEF5F3739122B817824A672E71DEB312CB7DD6A77116B30715076384297B1962EFDFEE6D6D2B2ED2EA4DD802F4784872D825DB828557D4D927B7232682AD91CEC3E508854F529853A8797B7BF7BFF8E3C180980DDF4081E96A12A495ACDE0C73282AC78617C68A55A94573E5A37B859858D1E19ADC82821B316B9D346ECFC6DBFFB3779F692A62D20D1BC4E730FDE2AEE826E76638ADE3DFAA11057B0BC8A80E8905B15E41D9A4105109F18E7E1362149AE9C568D1D642D65B94253BE2B13E7230F8BCF34DC87241D1DE72A65BBA111C111CBF5BD618CD02E0A06E37F60B3736631073A6BE004C1AD5F0091A82C87B276F7C5AAF6938C886A6039DF23482E2064F6AF05636B4C6BA6B24A29AAF2174AF4BD959177203AE9B160F81CA6764948AFCDACF6BEC0B987C6DBE178DCF47C137C64809483019C5F2072D0301C19C500C60B5CA913C24A8F28F50E1578D806FF9F9B810CA14BF5F2268FA18DEC67D973EB1D975AAF871ABC980D06222493D900CEBD8811FA20D5DB8F8036430F8BD7F9554F7CB47F9EBF389F66C3CCF9F42DB57AFFEE074FFEE4EB3E11612FD8A8FE02CC4E9D2F8BB36C505CECE9DC87512AEB5D8EBE33328C5217CCAF2E1AF1E38BFA84C0035DECD8D8C250FB4D964E8F0AE448AAB740D9EE9D794390686FE9A95183F0D5166D479C51014F1F29D8FEC616E1A4E7A9C86E2AF790BC7BD7BB6F746A2266332E04AFFBE6B9512E6620681C3317DC846E4FD7974E8AE87E370ECF9DFED574E339CD7E8A663ECD1A7BF5842391913D98686F7F2145BBC420F2F58B89131D5F3BE41C85752E13504BCC549A8F690CD2B0E1E29E4DFA3CC76BD398BBF28F33A00C3915DD719F7CB985E9A0A7CC8190BFFC8BF47310C71418D7A6C629C491EB8E455148BD4438BA6B7014608B0CE6A1BC5B035BC174C9BFFD966D8305FE9E5619BCA3FE4B39E6732DC652531819AC828F86EA11360678E786EAA741382D713AE26A608D582A3E4583D45744ACEDD32670B5AD4A1310301B28A174DC9858A55F0C1B7486CD66CB0635083B0C63016E40DFC533AB80C9CFAF1378D00769DCBAD56B09DA3A4E6CDBFD8F3FCB951680020DCA58647665462E42F42DC14E7B20F262D3CEB0B1A2BA807B98D66232AD7D3839C298564BC36A134CC2447B1B9FE69271960459C0A6F897C1878140690DA7D41FD8AAA05A679FDC3037EB2885AD3C82374F4BB991745351292DFD8E54F565E0093776B7EA65DDCD500BEB4D15AF6029F2630A0062F2D4FB331B47B6A5E139D385016E1FA490EAA209636B1383B7D7DC1148F07ED2CC2C03FA7FEE09305F34C57B3CE899C18462B4F1EF88C1AC5259440AAB48C5849652AAD9D3CF3D31F36C7F64F918868182D36345BA5BB7A4EE088D8B081EB78FE977F5A5295177AA427215BB26D1DE33AD4B2D610A47F8C672EEDA703A04D0FAE4C5961F13AD6FCA81863D8A394135565D8B27904A511FD0621A532F84A47CCF4FCC2114D4C369B7A76822959F8CAA25A6495081CA9EC3AC3348A981618592C090B6439CDA2FBC932C8697B3709323E3388AF8EFA1B9CDBD65A65C8F0C302330DDBD10E0235F8030562452EDE447EE5A5A9A636AF6F615B1210AA7CBE69572B3467B643BC5F5EC3F9AD15B3AD918993355E209ACBD0F1393076DA3B0950803295B6571E476ACAA04D48A4627367CB7FAA83796C4178CA9071DCCB8D3EA70381B61F0C56D515E0A765E266DACB13056317AD8737A1AD541AACCEA1641946E331229F19BB54C20BD51E63D63BFFA13110A552FD0A95AB984EF53BD639EFA0568C6875B2798E3A0578C940C0C4197D3587BCB1CC45A99F5D37B1612DC1A4178A3E288FBD79DDACD049159D6A5416F9EF3F38C74449BFB2E6A894566C5C17B4555E154F29A93241463690 - -count = 94 -seed = CEECCCD3F7BB922650E3F6E8F20C47AF17C1C1053EA8FE08226F167D67C3B0781BD774C4C7AAD23C6AB0B9F3E3F96F97 -mlen = 3135 -msg = E13692E3CC06EBE8FF9A292D890F0A34DFE9A4F968F196B475AC4DF553A30E2FD5DF008DF4D7508302AAF6389B6A5A9135E9BC8A5ACCD2BD2DF98FF662B763101D31E24E8F182FA50840BE27F76BA5ED645BB4D3F7F2F6CE25179A47FD7B6441A9B3A28783CEEDB425B2912734A75D7D03811172188253BD8F0F52EAEE84A9FB025F95EA1B566C53297A6A090F7FD8B21639523E073ADAA750D63DA61631F933FEDFFB2819E0EB3074E9E11E10B102AC88E2C8D6CF408FD241AD301F9B8E18A88B74CB4B0DAC76347635DFBB3EECFDF84229BABCC003C6E4EFB7394E25667DD7FA47D36E027559F53E98789E6E732E6AA23A71607677FB975C2852367C5BA5E3D10B3017AD26F9A38CE803929D08A43646FFBC3980B359D8BC2E9615636D4E5DE8DE6FB2465A983EB1696E98DD33FAEB7AF8C2D30506B22390D7F9FC21C7A016FDF22D21ED2EA4175FE9F5F44598EC26452700DC9A495675431E1236865F2F4AA5BC9C9A10EEE9E29B1FC4FEFCF8F24BF94342FC7E19AA6534C3B771D910AA419EA2BF70E2C1915891CC630A3397551E4F34BD2192B70EB210EA67CF152A35A3F5D0878E153579B42AFAFE5068B2BE2B48127FFB54553B7A9B6F845E7D72C43938AE42BC03E33B836AB212909510AAE7DBE8EE6D0EB8AD84D60832F3151273A1E09C514C3AA4CACD15564643F4255F36059022B91BA4137ECD97B34BE3308D40EF06BCF4F45EC625B54C7347F52A21815508199C8B7A6212779CD171894DA9FC3DE2A6EF5D76BFE03B8199ED1DC92B2A403E4DA009CBC0FB597C5952BE32579EB8E781EB12D935848C051029C528CBB68CBC1DE0102B42561E21F48E72E028C2CD8816A9027914571B49D2F94C9189E1A7F18D7D3D0A09B3A36EDB8A084ACE5FCCC77E3E42EDA0FBAB8C81EAF170103CA757981839C9448362BCAAAA3F20C8DC653AEF36953559F3597E1915F02A8D33D0E46201FC794EE055E6D9955B91FC7ABA1F136C280367404725CB355FC2F129413581401F98236D2A6F8BED7FDD7EA99060DABE3F0E8CE20B0E98EA80994D1673E8CCC6A0BA4A9D544F3D31BD95C9D3847527A978C1F155EFD84B6A7BECFB749628CE82E80285FC7272EA05F953404E437AD557F38FD9BBF77A69B81E4441605B23F2AAEDB00C7519D8E9CB4CAE5F8C3FA74FAABF6C12595BA045F647ABA7168C65C8A6006733D1341435495C7088C3361B50C43787EC24C24F57323466B5C088E8097B44666453010DA38AD65B426E72140AF78A5448B2F93DF3820F013FB9DCAC49604C86F2B2E4EA565463917285F148E8BFA9E11943AD3B86B14ED59A190CAE097DB26DAF8FD2A642676A37DD90C23B52C82CE028B80A805D9BA05457F7B6CBAECBA4094822E16C14D6E2291B731D581B12FB16802653360AAA6A7989D61C80DEBFCCE81A36D9ECC84039C4F086A5579D36FF5D0CBE61292E4FC3D14277AF380A9C1DBF36C2D61F59CFC0D62524E042710BFF5BA719E56BA367FFE849D660B9F7F3B638E113BF2E1A4DB1B8F65A0FD680BB2A168A4FD5B4E0EDF3208AD47F1FF4AFBAA726E38763CB5C84C03DA3D1E32CBA873B9A0C750922CD3D0A10A4877EAFEF602F5C875FBF0EE2F4F0AF7F308EF934F7E8E74FDA62A860BB594FD061D1B2BB32BA613339042FD90E749ACEF450D204072ACF58B18C365E4F4B815F1E837453C4255D53BB68D50F3677E7173FCC23D2B592149A9F3DD615868AF91F705387547862D34553FD45B8DF643F596DFDB7ABA47BD5D91445826C86FD4D30365A2F9A3CC0913DE19707D072F27A09EAB906304008875B5BE3526210D6B8BC8663975A1F78EAB9CD7F7305CDD4C00D6277622E50606E1CADD639730101D088BC2BAB295AD86BA8E26F5EBCB3E9C7C543E533A7B3C20F0F89001775F714825DC8547BAB06F5B99C5305EF18372A184569323FE269D45B669B9A222C9DEFBB0B2C84F42A57EF343A5C12F5712EEC33985DF8F0C566D471A9403FC103A3EEED42829D8E3E5C517BDE29447841CE96C8AC587DF3E4B6227FAB386140DB0112ED0D2846355C4A45E94F3A0718CEEC13FD3CAAEEFDF0B7F89F502AACF8C9D96D01B5549157B7DF2BE65BC30C889E69971700286C561DF91C8CB923001E5F0E21D2C7A3DFE8D1AF07FECE1EDA20C031B29A4389F265D2C7BE64EC37B2884849EF30FC8A82D2F766ACE68C72F0A4B72F3B50884749814387893DB2370A3410F794C64CD24BF0D13E44AD500BA9816F9BAED72F7593F758592C2E974D1207A664B869130BAA1FA71DBC55875134E7CFA276E36568F79483886099A1070C14C6E4EB87523E04C0154A2250624261211723453CFAD185298DE06D08CC25FA18BC58B34ECDF5D9DBB02541BAB4A2AF110AE09130E12439F1CECC34F9AB5D7BE36C827A6F2F6708B543D4AD2E424805E2A74895742B0A5DA30CABE4AB45F40CBFCCBEEBDAB9B8EB8F78781168B5BC79E04EFFE1757AB0547B9BD0D2625673CE528D2B4874D46DF0E09C24FC413EF9AB4C3D2E803C1E316D77FF5DE3368BB925B2B1F6FFC340525663931F5595C8AAAF9FB0DCCDFA4793519A66D4FDE38BD2044C60FD1DE15D60BA878FDA570E7AEF6DB69D2527A1F1481A9D05FF2F6F621238939ACF5D2C37B2BC3A194A9E65E7441764A5EE37B1FEF3B8C9C425BE1B5FF0D05BCB6A3B91876EC04ED89A31749FD443C2B85F8F388E7070D77DEE37E2B666628CC9A961236DD24AF2769C1F613B4E77F8E82D1F410ED59F63F1DF19BC53A448106DE4F8EFB8CC37E40144B0F658A4135E25A3CF36D8692DEF2677E4BEA3A9770F19E44D55080625421D5BADEBEF3B39BE71C08650B5718A9B2FCEFC4BECB26C4B63C43F6557DD66517D103907F82F9C2B965B7C5E36059D2159183F5ACB8B5FF5E6B92E94D53AB25AE955424E80EDEC4650BE293E836DA6148392C500FF4B7672932E90E068569B81AE335B2E5013CCC95F571948D58127EB1269A08D6E897D2D9B60F3E49847C05D0B3AC230A67EB6D38FFDBD4B8D82D7B9EC803429C701F080BE86FAA165C0111131712DB4957FD84A8936AB55558C69D33D5890CADD08D7F0D4962CF9E2F69C7517E79DB14B76E6E188F5ED95169A2A7E4C0EBC2175EC2DD44ABCF239CEB3E22F955ED25DA41768CA5FD9A9AE15FAAAFEB431958A679249AB8BF879185E8FBF9986B96A92972153B4CD0D1BE001E5AFAE3AD1F0B1191F1483738E728D4AD240538E5EF7BC9BA4D5903929D74CB64241306FDBAAAE17B1C3134AED2CC394D3EF9653CC62A29C4B0B9BE04E95E072EC98F7A80A7B575DED4A1993AA884C1EDFFE056EC475D934B4EB0EBF418975728C6E9CB3919B2B67D2C71228A4DF1FE2C8388E3A2BDD75549417FE795F1947F857B1C0C9CA021515FD4D79E691493B988080943C394BF29E4190082A94F224AFDE5853323EA51C06B41547EEC0DA5CC202A048D77C7B91E794C51E72B02EA7C14578C11D9DF48E099465783E496029EBB6D42D9CAA52902A4694355DB01DD7F5D7C113AE06E3F712FA577E937CD4FB817659F93964E194FE7D509A81C258C69C3415A8F11D35B414339FD1CC1D4F50665D9111592D1C3A3D69FCF6A971C285A94F5FFBFE8D2FD2746DCEB3B218D970D670D10135126E479D92000D41EABDEEA4C04D1748A4908DD39C60A52AA5FE29C8ACED50DC1295B5C2C4A98E3C62EE4F370F4D3E500FE27B66F65BAE604FD558D66B7F09CE36C36C8B5B4FED193EF56D1D8DF0FE6FE0031466A1C633203966FE83D6BFF843657DC0AF176AA8D5CB7312CB4E072BCFF24D5F3828E29B2037E8D1FB63537C70C27011E9A97E3F04895F4E84AC69C55D450B46D5792A5D790557BE64F765FA243AFA98527B976783E7ACDF76A7E1DCBDA72431FC30D7B05197478D8D74077626FF7409F95B24A1F1BB6B803B9F1B9AD5B06883FAE6C4B587C309A63F3B2FC9619032157B98C1DA9608107E87F4FEE0DAE995AB86AC9869446CDE92441F0B9F8240E6F7F7AA9189D92B7FAA3280FA749BA8C7729F8974049C5CBCB8C6650CF1C16B8194C7AE1A82B40B8B04488FCC69E674362FE4821D4C1846CD9BC49234BCC464013F5F9A082FB83D63098C331D4B1C9129F52259CCAF4A9237F8EC5BCCF06F230C08DDAF1D0C21C5930F55D3D5F60CBFC447E7FCBC75CD199733F8D17BD043B67B0C138CB0C9C8F2E477728F27DEE573796F71B013689B537AEAD4991E67F2F5EB94BFAD9509D7C235C9E55F68F26B9CE8AA90834D170F8B700A40AE9A817D5D17B1644D25BCF1172A5CF0C755A6EC04FAFC39DB06AAA05F5988E187B9E110EEDEA9C84B99AD29A4B31950F2C870A1F91DAA6A5817FAEAE516FA42660FCF56000F7365D8C6CC11D4784C6FC02E4D0C727806E9D43B957BBA124C980C31F81FACC6D46F6C38D227EEF8F0 -pk = 3D3789AAF3C7E4283C5EEB2F3FC53444732EBF3A6D8A448F7262809A7C9454270842E72ECBAE6F57213704D281E2EC873E6FE7D85D99E1DCADAA5777846BA625 -sk = 3D3789AAF3C7E4283C5EEB2F3FC53444732EBF3A6D8A448F7262809A7C9454270842E72ECBAE6F57213704D281E2EC873E6FE7D85D99E1DCADAA5777846BA62502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062822FBFB12210458F166381D233B4C87291D535008B163631278A6DFCA71FCC94B6B97BD4ABD22924BAECAC5A2D0000000000000000F3A7CFFD40F6F57874F6351E4623AE73BFFE272405845F891A7C0F23EB175DBE884243F0AAF75AB736058E64FFC1FFFFFFFFFFFFFFFFFD1BF4BB20A7CAC7E9DA3BF3A11EF6DDCD778F450366D4758DD84D9AAD90F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A3FF6C7B9E6C588E994111DEDAA720153661011472D01E9416D941A10770900000000000000000000000000000000000000000000007352D39317D497883B67C6E696274A04F32DDB516CFCE1B8C38E75C3D40CF702D558CCA7C76063055144B39A7BDFA3E31545D3D1DCC823B41A752C35F617FB30AF320A4A5CBD6C7833315AD7BB668BDFB34A28DA202FD72A8EED6C1399808305892CF91C285350E5951BFA29D6B037AB36438573BA162F4F40611BFD6E537D06F6222521149137D5319F5A5FFB7A1BD0E6A8DF5F40C9B790DDD6A7F1C6C8A405F1C8B7811F512EBB2BDCDF2538DFC22ECB0FB3B8D0123E301E02CEA566AB0918DEBEF115B7322A84D812B6FFB87E896F2F20E2F58423C660BA07EC078FF42313925D3153CF18193326428B7E7B5418008B3CB001829C1E361C3A6B45246C6A1A88ACF02A2EB4D6A1C7212F476CF0DB9A4D1D73578288031F348A9F624F3DF00C6C2AF8BD056AF4C5C14FCA12AAA3B7E62CB4ECE51B5C9477801F942FFF4D410FDC0FB5CB6BC1412CFB151FAD7C9925C60235CD18C6DE908851B2BD91851F260328F7AD3C845AC143DF6B84938E3D96E24A0C04FB811AF302A9A362B81923D52169ADD8EF295E708684E25713B166DA972E6DA5EE309DDFEF8AFC8A1D0E012E07950CE29FF47350E19E01433827DCF0665DC4F159493E037DAF694A0231118D1F -smlen = 3312 -sm = A495C77108E1A48D7A0419FE61C37BB3D84BC9063BCB88FD43AEEBDF98042F62F109BCA9D142C207FEFA2F73A9BF71544A049290EC611EDF7FE39F02DFB8EB45AECC361FF801C20511D34E3DB2A01504DD83F771C7C4D834FE06F00B01A5ECB43C0FFE00FB660698E6B3984030002CE925DB1D1C4C58AC033FA6A27AD381C8E78A03C4F3C3EC4E723F573A020095E94EB3391BB25AB9C86395B067BECB0403C5ED6CF3891FDF169E05218B4B17C3A4F001E13692E3CC06EBE8FF9A292D890F0A34DFE9A4F968F196B475AC4DF553A30E2FD5DF008DF4D7508302AAF6389B6A5A9135E9BC8A5ACCD2BD2DF98FF662B763101D31E24E8F182FA50840BE27F76BA5ED645BB4D3F7F2F6CE25179A47FD7B6441A9B3A28783CEEDB425B2912734A75D7D03811172188253BD8F0F52EAEE84A9FB025F95EA1B566C53297A6A090F7FD8B21639523E073ADAA750D63DA61631F933FEDFFB2819E0EB3074E9E11E10B102AC88E2C8D6CF408FD241AD301F9B8E18A88B74CB4B0DAC76347635DFBB3EECFDF84229BABCC003C6E4EFB7394E25667DD7FA47D36E027559F53E98789E6E732E6AA23A71607677FB975C2852367C5BA5E3D10B3017AD26F9A38CE803929D08A43646FFBC3980B359D8BC2E9615636D4E5DE8DE6FB2465A983EB1696E98DD33FAEB7AF8C2D30506B22390D7F9FC21C7A016FDF22D21ED2EA4175FE9F5F44598EC26452700DC9A495675431E1236865F2F4AA5BC9C9A10EEE9E29B1FC4FEFCF8F24BF94342FC7E19AA6534C3B771D910AA419EA2BF70E2C1915891CC630A3397551E4F34BD2192B70EB210EA67CF152A35A3F5D0878E153579B42AFAFE5068B2BE2B48127FFB54553B7A9B6F845E7D72C43938AE42BC03E33B836AB212909510AAE7DBE8EE6D0EB8AD84D60832F3151273A1E09C514C3AA4CACD15564643F4255F36059022B91BA4137ECD97B34BE3308D40EF06BCF4F45EC625B54C7347F52A21815508199C8B7A6212779CD171894DA9FC3DE2A6EF5D76BFE03B8199ED1DC92B2A403E4DA009CBC0FB597C5952BE32579EB8E781EB12D935848C051029C528CBB68CBC1DE0102B42561E21F48E72E028C2CD8816A9027914571B49D2F94C9189E1A7F18D7D3D0A09B3A36EDB8A084ACE5FCCC77E3E42EDA0FBAB8C81EAF170103CA757981839C9448362BCAAAA3F20C8DC653AEF36953559F3597E1915F02A8D33D0E46201FC794EE055E6D9955B91FC7ABA1F136C280367404725CB355FC2F129413581401F98236D2A6F8BED7FDD7EA99060DABE3F0E8CE20B0E98EA80994D1673E8CCC6A0BA4A9D544F3D31BD95C9D3847527A978C1F155EFD84B6A7BECFB749628CE82E80285FC7272EA05F953404E437AD557F38FD9BBF77A69B81E4441605B23F2AAEDB00C7519D8E9CB4CAE5F8C3FA74FAABF6C12595BA045F647ABA7168C65C8A6006733D1341435495C7088C3361B50C43787EC24C24F57323466B5C088E8097B44666453010DA38AD65B426E72140AF78A5448B2F93DF3820F013FB9DCAC49604C86F2B2E4EA565463917285F148E8BFA9E11943AD3B86B14ED59A190CAE097DB26DAF8FD2A642676A37DD90C23B52C82CE028B80A805D9BA05457F7B6CBAECBA4094822E16C14D6E2291B731D581B12FB16802653360AAA6A7989D61C80DEBFCCE81A36D9ECC84039C4F086A5579D36FF5D0CBE61292E4FC3D14277AF380A9C1DBF36C2D61F59CFC0D62524E042710BFF5BA719E56BA367FFE849D660B9F7F3B638E113BF2E1A4DB1B8F65A0FD680BB2A168A4FD5B4E0EDF3208AD47F1FF4AFBAA726E38763CB5C84C03DA3D1E32CBA873B9A0C750922CD3D0A10A4877EAFEF602F5C875FBF0EE2F4F0AF7F308EF934F7E8E74FDA62A860BB594FD061D1B2BB32BA613339042FD90E749ACEF450D204072ACF58B18C365E4F4B815F1E837453C4255D53BB68D50F3677E7173FCC23D2B592149A9F3DD615868AF91F705387547862D34553FD45B8DF643F596DFDB7ABA47BD5D91445826C86FD4D30365A2F9A3CC0913DE19707D072F27A09EAB906304008875B5BE3526210D6B8BC8663975A1F78EAB9CD7F7305CDD4C00D6277622E50606E1CADD639730101D088BC2BAB295AD86BA8E26F5EBCB3E9C7C543E533A7B3C20F0F89001775F714825DC8547BAB06F5B99C5305EF18372A184569323FE269D45B669B9A222C9DEFBB0B2C84F42A57EF343A5C12F5712EEC33985DF8F0C566D471A9403FC103A3EEED42829D8E3E5C517BDE29447841CE96C8AC587DF3E4B6227FAB386140DB0112ED0D2846355C4A45E94F3A0718CEEC13FD3CAAEEFDF0B7F89F502AACF8C9D96D01B5549157B7DF2BE65BC30C889E69971700286C561DF91C8CB923001E5F0E21D2C7A3DFE8D1AF07FECE1EDA20C031B29A4389F265D2C7BE64EC37B2884849EF30FC8A82D2F766ACE68C72F0A4B72F3B50884749814387893DB2370A3410F794C64CD24BF0D13E44AD500BA9816F9BAED72F7593F758592C2E974D1207A664B869130BAA1FA71DBC55875134E7CFA276E36568F79483886099A1070C14C6E4EB87523E04C0154A2250624261211723453CFAD185298DE06D08CC25FA18BC58B34ECDF5D9DBB02541BAB4A2AF110AE09130E12439F1CECC34F9AB5D7BE36C827A6F2F6708B543D4AD2E424805E2A74895742B0A5DA30CABE4AB45F40CBFCCBEEBDAB9B8EB8F78781168B5BC79E04EFFE1757AB0547B9BD0D2625673CE528D2B4874D46DF0E09C24FC413EF9AB4C3D2E803C1E316D77FF5DE3368BB925B2B1F6FFC340525663931F5595C8AAAF9FB0DCCDFA4793519A66D4FDE38BD2044C60FD1DE15D60BA878FDA570E7AEF6DB69D2527A1F1481A9D05FF2F6F621238939ACF5D2C37B2BC3A194A9E65E7441764A5EE37B1FEF3B8C9C425BE1B5FF0D05BCB6A3B91876EC04ED89A31749FD443C2B85F8F388E7070D77DEE37E2B666628CC9A961236DD24AF2769C1F613B4E77F8E82D1F410ED59F63F1DF19BC53A448106DE4F8EFB8CC37E40144B0F658A4135E25A3CF36D8692DEF2677E4BEA3A9770F19E44D55080625421D5BADEBEF3B39BE71C08650B5718A9B2FCEFC4BECB26C4B63C43F6557DD66517D103907F82F9C2B965B7C5E36059D2159183F5ACB8B5FF5E6B92E94D53AB25AE955424E80EDEC4650BE293E836DA6148392C500FF4B7672932E90E068569B81AE335B2E5013CCC95F571948D58127EB1269A08D6E897D2D9B60F3E49847C05D0B3AC230A67EB6D38FFDBD4B8D82D7B9EC803429C701F080BE86FAA165C0111131712DB4957FD84A8936AB55558C69D33D5890CADD08D7F0D4962CF9E2F69C7517E79DB14B76E6E188F5ED95169A2A7E4C0EBC2175EC2DD44ABCF239CEB3E22F955ED25DA41768CA5FD9A9AE15FAAAFEB431958A679249AB8BF879185E8FBF9986B96A92972153B4CD0D1BE001E5AFAE3AD1F0B1191F1483738E728D4AD240538E5EF7BC9BA4D5903929D74CB64241306FDBAAAE17B1C3134AED2CC394D3EF9653CC62A29C4B0B9BE04E95E072EC98F7A80A7B575DED4A1993AA884C1EDFFE056EC475D934B4EB0EBF418975728C6E9CB3919B2B67D2C71228A4DF1FE2C8388E3A2BDD75549417FE795F1947F857B1C0C9CA021515FD4D79E691493B988080943C394BF29E4190082A94F224AFDE5853323EA51C06B41547EEC0DA5CC202A048D77C7B91E794C51E72B02EA7C14578C11D9DF48E099465783E496029EBB6D42D9CAA52902A4694355DB01DD7F5D7C113AE06E3F712FA577E937CD4FB817659F93964E194FE7D509A81C258C69C3415A8F11D35B414339FD1CC1D4F50665D9111592D1C3A3D69FCF6A971C285A94F5FFBFE8D2FD2746DCEB3B218D970D670D10135126E479D92000D41EABDEEA4C04D1748A4908DD39C60A52AA5FE29C8ACED50DC1295B5C2C4A98E3C62EE4F370F4D3E500FE27B66F65BAE604FD558D66B7F09CE36C36C8B5B4FED193EF56D1D8DF0FE6FE0031466A1C633203966FE83D6BFF843657DC0AF176AA8D5CB7312CB4E072BCFF24D5F3828E29B2037E8D1FB63537C70C27011E9A97E3F04895F4E84AC69C55D450B46D5792A5D790557BE64F765FA243AFA98527B976783E7ACDF76A7E1DCBDA72431FC30D7B05197478D8D74077626FF7409F95B24A1F1BB6B803B9F1B9AD5B06883FAE6C4B587C309A63F3B2FC9619032157B98C1DA9608107E87F4FEE0DAE995AB86AC9869446CDE92441F0B9F8240E6F7F7AA9189D92B7FAA3280FA749BA8C7729F8974049C5CBCB8C6650CF1C16B8194C7AE1A82B40B8B04488FCC69E674362FE4821D4C1846CD9BC49234BCC464013F5F9A082FB83D63098C331D4B1C9129F52259CCAF4A9237F8EC5BCCF06F230C08DDAF1D0C21C5930F55D3D5F60CBFC447E7FCBC75CD199733F8D17BD043B67B0C138CB0C9C8F2E477728F27DEE573796F71B013689B537AEAD4991E67F2F5EB94BFAD9509D7C235C9E55F68F26B9CE8AA90834D170F8B700A40AE9A817D5D17B1644D25BCF1172A5CF0C755A6EC04FAFC39DB06AAA05F5988E187B9E110EEDEA9C84B99AD29A4B31950F2C870A1F91DAA6A5817FAEAE516FA42660FCF56000F7365D8C6CC11D4784C6FC02E4D0C727806E9D43B957BBA124C980C31F81FACC6D46F6C38D227EEF8F0 - -count = 95 -seed = 2489C04BA57D149A60F446670C13C29998B52F3BAD548A751D7134B694DB25ABFA034FB4BA45E105AE27D575CBD02B99 -mlen = 3168 -msg = 1F7AB96E8C14D1A5094672D7034FA8F81703A2CC18983C972CC66736CD98B031AC8A479CED21A1F634938DF85F3E83161646DB81B9AC3EA22F80980B8E2EBA4E9975714E5A98985817F426C41F3968349686B69AF917564A2648401B8FA127FC3200DC16A9E663D1D345EA83131E21229DD39E70D7270DE7577A7E9635602FD2C30EFAF204A9234F0A73D21375658B0B0B04927E67F3F5534614EDF5137BADFED914A49AA301000092DA93B3FA4A0FF592CC3A53F4A75B54FEE775EFA421EEFCD6E0D32FB5CDC096886076DA940B26C6E07F12F6E08FA7B3E2DC42055308E5607A2732717AE592A6909C6E084252A5B08685FE8C6C1DA387B0AA9800B67CDB3EE2FB21B9BE5E6B79AB545563068441C0C9C1E68CEF6028A5CEDF27D3CA47D95094C9E1E68B8449758BE3FF8FDE148ABC420295DC76E3EBA8E11433217FDC3136551A5A41C1C7E7D6EF43601946897FDA54842D8F73FAA7EB7ED0DE544FEF2A95C6FECB13C8C0F14B5B22493F54374184B73D5BD47383BBC5DD7BC1BEAC0CB8E66D2F413A9DCEB7E1D0EE2D63B9EB28DB232C33A95B792AE67D2591F5AF59DDC45771A0E7195C4D25E7F4079359597678B0C0A87DF3D66A686A9215DD566D4722C212AD05A23E1377E37E18A6AB3AB8BF5CD47BF1BAF06EB05E4C150CA67D7E52BD297A08CFC97B575752E686B83575F425F3A450BB0F596A60E41F7183F463007FD019EE255BDEF1D98B7A0A12EC33B3E2BC9BF0CC8F4860DEBCFBBD5E40B2ADC2CD10EC35A341BE7A49F8D204FDAE86921B7DE5BA700A61E2B041A8EA7040ACEE844892E5CF025FFEC5322FF6D765BFF1107C967A12ECCB0489F64F8C13BD7057DF76485446641AA7A560C7E73008C46572628E1A225A8D3F6D68DDC9759A952FC07CD43DE4434BD3391089E900275E9EBC92563AC1403BB7DFDD182092130E3E6AEB7B666F4BA66C38BBE1F726F40A07DF6C42079A6054399519E26D765CA065F4DDFD27A29CBA292699CD826FA9D3E7EE31B0D76813879DB5EC5C7F454095DC3BD27323DABD2DFF949AC760D6137334507816330FA67D886021661ADC69AEBD882A07E01B4B6E5492399ECDEA99222EE785C810B30409DFAF2A3CE5A05D699C2368249C9588D86FEAA778B4860D6DD442088A21D2D9D0B49B15EC579776812AF8AD582F1C44BB6432D7472300B5440A382ED87AB64B20373A0ABDBCE391D0BFFC9C543EC686449FCA9D04B7141836A416720BDFF250A06D7651A1F98EABE4B340B2303591D0847AED6FFE423B6DD8C0C03459C381DB506F531343F82C116323899DF1E5D8DB8997BEC12EB70103F0BF2B3D53C4D4694052606EE32BE4F5B35450358D7D85062DCF7F0BDB51364700BAF92CD6ACE4E2C10E6CD9A332716F5F4BF7598466A99238357798A499C9B8BE77690635C57E7D87A904B3F2278C0B1B23E5860B0532F152E1626C86FD855F656B5D070BC81CE4634A87C8EA6D6A433C02DD2E6D6561B25968B149A6F3BBA40B749F188B84314B5778A000CAE91A53D59860EE6F7DF38CA0935CD64C08A34BF19981C17951B9C39A847D0637441452E38CE5E1D9B99BED51B86705CEBB8D3244C40BB8D70F846936A2BE29C21604A7E6BD3E655022B929954F6C9A5743F5FC2127B49956D80128DD582CEAA06FC174813E5F5E6A0A4D7D26756FB28A6588E9410722591CCE2A6C6ED0976B98E1FB0C642D5DF8F08E96BAE1FE10375FA1D7C70806101570FEF1EBC8F58664281E2B61DF2081B655013AEF54616308504F5F4A1E8F156680163489D3FE7BB0A514F1D2D57EE6302853D7D03C767C7BDFB79E2B8C80403F26F6EDBDD6A890A0A0B9B76D334E0F729FF9C47BFE960A1C3FAF77E81B9AC156367423DBB4D766A1F3B1E67595EFFD76287F22BC37DA4F0204633E804002EB7C1AD0836FA4D01E2FCDEAB8457DFC3D8B7F1151BEF3574F8F4653AA3780003787B8891901ABC8250A974C15F2DDDF9E1BE6798647EED710D06CC3FB4C276BFFA585680FC632D8EFD1614745BC3C72B82C53FEAE935EA5014E2B321F69BADF570FAD878C9590FD20FB7BF1B31E373DA93D1A8C63EA45E698CE060FE70ABA0FA84F37E836F2AD2998F07101D3FC7CA2B08B1398E1687ED5A8CE860EF9B4889FF436B74D13281D1F6A7EDF1DBE8989BFAEEFE6A475E65217643E757006871E664099F5B3846553603CD9EEF8FC195807361FBFDEB8DEE6A0B79F009C10DF397FFB865F4EBD0473D458D553358029C6B5A95D6FFEE9B645311D10A8F479B7E5249AA87E3DED08311B4DDF3A458FE61AE294A22643861826ACBBC9B0EA8B73157CE15D1FF35098AE67159B07CA7499398C26776DD9884B5D3786C87D48E864D8BBE2B73E2890F217E135BFDFC4DC5E805D9CEFEF5268E33DB611ABA6A5D57EC82B7246A63DCF3EAF3A51CF503D65C206D2362421DE774158AEAFFEE45A6B5AD5CC0B1DE0E2EA74E97913729A69E9C00A309DDCEB7738BAF4757EA9CC96E055BBDF692B12D8B01B92CE5ECF3D52187402CB7FD961A2672DC1875B6EA22AD7F5F42B1B52BA2D780F2E6C5B25FC7E30B1B663E3A09C8FF0B5C302E0E7F984DDCC62DDA65FD996E17DA72F02A16C354BBDAD44C5B5044759BD53789B98BC58CC25FCDF10A9CBBF0FD6ABD58A4CEDD92C5D85EF22B3C5EE5D9440CE42995517D2F7352CE997F51A36B9FA5703B4C6491AD01F406FD1B5BF85321026D28B51354DADEDF057B37743499A986469F908A01F3C1B74DEF5D8E2F57ED25A80720B540333109A0A65E7984B557F65429F3D3BD7EC3732A10D7AF36DD5D2414A09949A0F57F37BD9021D2C482E61437CC15E9DFDD92D4C212C4FC6C22C54591E5AFD48210FDC88040135E433F50E45874E0D5EE2BBC857F2C80E2FA4FC7ACFEC8EEC0CAB351F677C790787C715945C21BF923EDC0A58878AE09ACF5FB5A003C9C0B6E30A450CE6DAD4B626108B88E89F1E6A7BB3843E1EC8AEE35AF69E81773CFF71190F819CCF24142D60AC51B80B61019EC7ED2EFB6C5F18B499FC9727BED2E3324F8B94A522092E0A98241E29F8F14C6561DF3FEA0824F9CB0FE10BB497E427EE62085E7AABB2900FA47BF27C1638BD116C5555C076DEEFE9754E8ED333D72CE9423E27EF640FD5199C0CAFBCF2DA1C5C34121A69E7E0DEB3C268FE60C6797056383DA43E6F472D225116F63124498271D3D43AADCC5871F2349CE040BE068D72EB57B7827A7D9AA01405BA0AB07E684B91EF05418948F6713AEF1F4948399E0E6130740CAE3E481A6366295422BE3EE2E892AA9FEE86A6E23E2EBCBE654989FD93D1C4E7D62910E1223BD66B7C54F8DD7D373986E5D4141BF0BDE98DD13AAB7D598D698660F11FA4BFB0AD09D5C27B65386C8673E6C4AE9E8E30F8DD1A5A3FE557A3C29DCF99A7C376200AB595C49445E740E3DAEC07BC047FD6EA4FC6CFDC23D7449F9D1170FE635CA36D3DE5B57F1CFB182DE240CD4C1E480600C449D1A8596D8315906A53954201929E7665DD2E27D590D481DD394CF2E8AE19217F1FF0CB511DEF7460DC9E49C21607247857BA744B1384344B4C2D8CE987512376F66F1A279509281242A7A2A58ED500395418138ABDB9C5572A258D157F4D3E88ED216BBE9CEE3BD054FE61F94C59A4AD19AA62E456B86CADE61622A6FEA877575EEAEA20C76AE8A89E7B44396BAE0EEEAB1C23F221A3DF2B2CC683256A4E5C8207EDA0B235562AD3B510F9D3FBE0B51CD8F238A0ABD2EC182681606C8FD111D8CE1EC1CDA6DB4572303DDEB925AC1FFFD75E321468266790DEE6BC0E85070CEE749D9E46795936324DD1388E1B11AA617500534B8DAF2DE12B035F73111B770F5F56F5C6A4152C45CE0E112E650FAA9F3C7E59E3410745C29FA59CAE5CC37FE4C6594990E50DF1576B69B2B292AFC58A804743F49DD7C98C1768FD19AB4213AE4FB197492AF5BF7FBC6C8B507673539D8515DD527FAFDD8CA3EFF629CAA720AA11E65922678447AD4DDF5FF943873DF5203AFEA4130CA5F633E104AB083EC690CF092D208A98006E91BC7E33731D18E592869E564E6D3FF8BBBBB9837FFC1F1B92DE0F5DD4A029C51E3F64592CAC3DE1B4CA5414F894B7B0B7D73D6BF1DA4B908ACEAB47771DA56A8B0536301FC5FD270CAA55CE171332F7DB2EB4619C4B2C1971EBC0AB8B0B11FD54C24285DA8428AB9E0150D8897216B133ED554DE8CEE532024DF8B8D9314D7C9A3EC60464F9C7BCA8C3D4FBA23A7B543AC111ABA8C8F1BD54A243D565DC062F84CCCEDB0A03375FDFBCEF8AD8CAFC440D3E6F988DC607ECB947673DEC4AD48724C91A6BE22A0027E42AF6D94D26D188D0B7B3A5AF012880FC0105DD2F11171742321DD41A0401415C58AD4DC445642A2CBB466788F54D270BD8DF25602B298B62B6D0FA3ADA97008A99B73A807092F8957F17EEAD9D53B1128FBEF1DEFCBC607EA92AFBD353E95F52D33AB7C1EBE2 -pk = 8E6621EFC75A3D0C63BF6A1E1733FF0E5C352FCA60941205B84AC9F7A70675265DF557514E0861C334DEB68CBDD677C8083DA516D86772B3C33B3708F3642328 -sk = 8E6621EFC75A3D0C63BF6A1E1733FF0E5C352FCA60941205B84AC9F7A70675265DF557514E0861C334DEB68CBDD677C8083DA516D86772B3C33B3708F364232802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060D3F7E879E477EFC8E11716EE22874736BCAD3629B0BE01548FC9257A4D1E10200115C5D55F2FE08123E0558EDFFFFFFFFFFFFFFFFF7BBEFA4AA4CB6419454F025408DC7915B9FC8A0EC8C4A246EE6CB676D67CB21227F8BD92FFB7A16C6307FF3D1D36FAFFFFFFFFFFFFFFC33005324DF32AA8083D7D57F33D0CAF842E0ED7DEF13D49E52B3BECC8680800000000000000000000000000000000000000000000004C3FC20743B1260B2900154A49D225941BEC964ABDC9B3D75618C7B2B5B4040000000000000000000000000000000000000000000000037FB7F2C4272A55790E860E88342817B3282C27AF55F973D115F9D3C79AE90D0916DEC492634FA14E377928D85A688B99DE6463B6C494FF40C2D8B9B6D96D21158D0608FABACDB628BD872A63DF6126CF83B3FBBD052D9DAE40264CEB066B0095115AF17BF65D3E93FF9030CD4F57501DEC9928A04DC456C39D5E2074218823EC035A7A562192E25290C548B9B10E87477C15609EB411DF2DE6A122C2F4650BCDCCEF466941944D4C323F2FBCDB3AB72BDC6E1AE8CBFF933C40CA9A3AE8472D415531F42D31C401010B7AF1841408A6BF168C91A933DAA9AF1A072C98C1F51426F91913532146840D4591BEF67789440132D1400E79E065A4AC9B7484C8F30AAB72B4B36F9959E8033F0ED8D981AB29ABAAE0C7FB58E339B3B45B4392F6AB1B2B0E76AF7F031A055F93BF59DFB0CDEF1727E4DDFEB71A12766F7690A8962002EDFC8FAE278EB7DF31F0EE554255A26DCB2BB81556222AB7553879634E37902918FC7BBA7C515773EB13E518C2DB4C99E01B880288CDE8D513AAC735C20DFB1BDA94DFB9E74D8699AE94F0E00141E57F8A7B92BDB9FB8E8ED7766E441E400F19D451D0FA4677FDE110ACD1AF5ED65887564733F7548BD2D4BCB62DBE86CCAD07 -smlen = 3345 -sm = 16AB1FC5CDFD799255042E017EA8694DE2B5280331397B38157BC2770604558F9710F56E65F40904341DE409B1B4E1A8C0010F819491226C44065501EBEBCB47C1A2A0614402A365A6AD7842402AAB01FBF779AA34BA47895A0078AA36514E3F849BE0023F9E6AA2655F20A9C9002469C424641563223100989A238C73AB331603012735F1740395F791530500AB96EEFDFFECA278C3ECBB953BD928D90502E0511F8717B62D72DD05E59A84E35D91B4011F7AB96E8C14D1A5094672D7034FA8F81703A2CC18983C972CC66736CD98B031AC8A479CED21A1F634938DF85F3E83161646DB81B9AC3EA22F80980B8E2EBA4E9975714E5A98985817F426C41F3968349686B69AF917564A2648401B8FA127FC3200DC16A9E663D1D345EA83131E21229DD39E70D7270DE7577A7E9635602FD2C30EFAF204A9234F0A73D21375658B0B0B04927E67F3F5534614EDF5137BADFED914A49AA301000092DA93B3FA4A0FF592CC3A53F4A75B54FEE775EFA421EEFCD6E0D32FB5CDC096886076DA940B26C6E07F12F6E08FA7B3E2DC42055308E5607A2732717AE592A6909C6E084252A5B08685FE8C6C1DA387B0AA9800B67CDB3EE2FB21B9BE5E6B79AB545563068441C0C9C1E68CEF6028A5CEDF27D3CA47D95094C9E1E68B8449758BE3FF8FDE148ABC420295DC76E3EBA8E11433217FDC3136551A5A41C1C7E7D6EF43601946897FDA54842D8F73FAA7EB7ED0DE544FEF2A95C6FECB13C8C0F14B5B22493F54374184B73D5BD47383BBC5DD7BC1BEAC0CB8E66D2F413A9DCEB7E1D0EE2D63B9EB28DB232C33A95B792AE67D2591F5AF59DDC45771A0E7195C4D25E7F4079359597678B0C0A87DF3D66A686A9215DD566D4722C212AD05A23E1377E37E18A6AB3AB8BF5CD47BF1BAF06EB05E4C150CA67D7E52BD297A08CFC97B575752E686B83575F425F3A450BB0F596A60E41F7183F463007FD019EE255BDEF1D98B7A0A12EC33B3E2BC9BF0CC8F4860DEBCFBBD5E40B2ADC2CD10EC35A341BE7A49F8D204FDAE86921B7DE5BA700A61E2B041A8EA7040ACEE844892E5CF025FFEC5322FF6D765BFF1107C967A12ECCB0489F64F8C13BD7057DF76485446641AA7A560C7E73008C46572628E1A225A8D3F6D68DDC9759A952FC07CD43DE4434BD3391089E900275E9EBC92563AC1403BB7DFDD182092130E3E6AEB7B666F4BA66C38BBE1F726F40A07DF6C42079A6054399519E26D765CA065F4DDFD27A29CBA292699CD826FA9D3E7EE31B0D76813879DB5EC5C7F454095DC3BD27323DABD2DFF949AC760D6137334507816330FA67D886021661ADC69AEBD882A07E01B4B6E5492399ECDEA99222EE785C810B30409DFAF2A3CE5A05D699C2368249C9588D86FEAA778B4860D6DD442088A21D2D9D0B49B15EC579776812AF8AD582F1C44BB6432D7472300B5440A382ED87AB64B20373A0ABDBCE391D0BFFC9C543EC686449FCA9D04B7141836A416720BDFF250A06D7651A1F98EABE4B340B2303591D0847AED6FFE423B6DD8C0C03459C381DB506F531343F82C116323899DF1E5D8DB8997BEC12EB70103F0BF2B3D53C4D4694052606EE32BE4F5B35450358D7D85062DCF7F0BDB51364700BAF92CD6ACE4E2C10E6CD9A332716F5F4BF7598466A99238357798A499C9B8BE77690635C57E7D87A904B3F2278C0B1B23E5860B0532F152E1626C86FD855F656B5D070BC81CE4634A87C8EA6D6A433C02DD2E6D6561B25968B149A6F3BBA40B749F188B84314B5778A000CAE91A53D59860EE6F7DF38CA0935CD64C08A34BF19981C17951B9C39A847D0637441452E38CE5E1D9B99BED51B86705CEBB8D3244C40BB8D70F846936A2BE29C21604A7E6BD3E655022B929954F6C9A5743F5FC2127B49956D80128DD582CEAA06FC174813E5F5E6A0A4D7D26756FB28A6588E9410722591CCE2A6C6ED0976B98E1FB0C642D5DF8F08E96BAE1FE10375FA1D7C70806101570FEF1EBC8F58664281E2B61DF2081B655013AEF54616308504F5F4A1E8F156680163489D3FE7BB0A514F1D2D57EE6302853D7D03C767C7BDFB79E2B8C80403F26F6EDBDD6A890A0A0B9B76D334E0F729FF9C47BFE960A1C3FAF77E81B9AC156367423DBB4D766A1F3B1E67595EFFD76287F22BC37DA4F0204633E804002EB7C1AD0836FA4D01E2FCDEAB8457DFC3D8B7F1151BEF3574F8F4653AA3780003787B8891901ABC8250A974C15F2DDDF9E1BE6798647EED710D06CC3FB4C276BFFA585680FC632D8EFD1614745BC3C72B82C53FEAE935EA5014E2B321F69BADF570FAD878C9590FD20FB7BF1B31E373DA93D1A8C63EA45E698CE060FE70ABA0FA84F37E836F2AD2998F07101D3FC7CA2B08B1398E1687ED5A8CE860EF9B4889FF436B74D13281D1F6A7EDF1DBE8989BFAEEFE6A475E65217643E757006871E664099F5B3846553603CD9EEF8FC195807361FBFDEB8DEE6A0B79F009C10DF397FFB865F4EBD0473D458D553358029C6B5A95D6FFEE9B645311D10A8F479B7E5249AA87E3DED08311B4DDF3A458FE61AE294A22643861826ACBBC9B0EA8B73157CE15D1FF35098AE67159B07CA7499398C26776DD9884B5D3786C87D48E864D8BBE2B73E2890F217E135BFDFC4DC5E805D9CEFEF5268E33DB611ABA6A5D57EC82B7246A63DCF3EAF3A51CF503D65C206D2362421DE774158AEAFFEE45A6B5AD5CC0B1DE0E2EA74E97913729A69E9C00A309DDCEB7738BAF4757EA9CC96E055BBDF692B12D8B01B92CE5ECF3D52187402CB7FD961A2672DC1875B6EA22AD7F5F42B1B52BA2D780F2E6C5B25FC7E30B1B663E3A09C8FF0B5C302E0E7F984DDCC62DDA65FD996E17DA72F02A16C354BBDAD44C5B5044759BD53789B98BC58CC25FCDF10A9CBBF0FD6ABD58A4CEDD92C5D85EF22B3C5EE5D9440CE42995517D2F7352CE997F51A36B9FA5703B4C6491AD01F406FD1B5BF85321026D28B51354DADEDF057B37743499A986469F908A01F3C1B74DEF5D8E2F57ED25A80720B540333109A0A65E7984B557F65429F3D3BD7EC3732A10D7AF36DD5D2414A09949A0F57F37BD9021D2C482E61437CC15E9DFDD92D4C212C4FC6C22C54591E5AFD48210FDC88040135E433F50E45874E0D5EE2BBC857F2C80E2FA4FC7ACFEC8EEC0CAB351F677C790787C715945C21BF923EDC0A58878AE09ACF5FB5A003C9C0B6E30A450CE6DAD4B626108B88E89F1E6A7BB3843E1EC8AEE35AF69E81773CFF71190F819CCF24142D60AC51B80B61019EC7ED2EFB6C5F18B499FC9727BED2E3324F8B94A522092E0A98241E29F8F14C6561DF3FEA0824F9CB0FE10BB497E427EE62085E7AABB2900FA47BF27C1638BD116C5555C076DEEFE9754E8ED333D72CE9423E27EF640FD5199C0CAFBCF2DA1C5C34121A69E7E0DEB3C268FE60C6797056383DA43E6F472D225116F63124498271D3D43AADCC5871F2349CE040BE068D72EB57B7827A7D9AA01405BA0AB07E684B91EF05418948F6713AEF1F4948399E0E6130740CAE3E481A6366295422BE3EE2E892AA9FEE86A6E23E2EBCBE654989FD93D1C4E7D62910E1223BD66B7C54F8DD7D373986E5D4141BF0BDE98DD13AAB7D598D698660F11FA4BFB0AD09D5C27B65386C8673E6C4AE9E8E30F8DD1A5A3FE557A3C29DCF99A7C376200AB595C49445E740E3DAEC07BC047FD6EA4FC6CFDC23D7449F9D1170FE635CA36D3DE5B57F1CFB182DE240CD4C1E480600C449D1A8596D8315906A53954201929E7665DD2E27D590D481DD394CF2E8AE19217F1FF0CB511DEF7460DC9E49C21607247857BA744B1384344B4C2D8CE987512376F66F1A279509281242A7A2A58ED500395418138ABDB9C5572A258D157F4D3E88ED216BBE9CEE3BD054FE61F94C59A4AD19AA62E456B86CADE61622A6FEA877575EEAEA20C76AE8A89E7B44396BAE0EEEAB1C23F221A3DF2B2CC683256A4E5C8207EDA0B235562AD3B510F9D3FBE0B51CD8F238A0ABD2EC182681606C8FD111D8CE1EC1CDA6DB4572303DDEB925AC1FFFD75E321468266790DEE6BC0E85070CEE749D9E46795936324DD1388E1B11AA617500534B8DAF2DE12B035F73111B770F5F56F5C6A4152C45CE0E112E650FAA9F3C7E59E3410745C29FA59CAE5CC37FE4C6594990E50DF1576B69B2B292AFC58A804743F49DD7C98C1768FD19AB4213AE4FB197492AF5BF7FBC6C8B507673539D8515DD527FAFDD8CA3EFF629CAA720AA11E65922678447AD4DDF5FF943873DF5203AFEA4130CA5F633E104AB083EC690CF092D208A98006E91BC7E33731D18E592869E564E6D3FF8BBBBB9837FFC1F1B92DE0F5DD4A029C51E3F64592CAC3DE1B4CA5414F894B7B0B7D73D6BF1DA4B908ACEAB47771DA56A8B0536301FC5FD270CAA55CE171332F7DB2EB4619C4B2C1971EBC0AB8B0B11FD54C24285DA8428AB9E0150D8897216B133ED554DE8CEE532024DF8B8D9314D7C9A3EC60464F9C7BCA8C3D4FBA23A7B543AC111ABA8C8F1BD54A243D565DC062F84CCCEDB0A03375FDFBCEF8AD8CAFC440D3E6F988DC607ECB947673DEC4AD48724C91A6BE22A0027E42AF6D94D26D188D0B7B3A5AF012880FC0105DD2F11171742321DD41A0401415C58AD4DC445642A2CBB466788F54D270BD8DF25602B298B62B6D0FA3ADA97008A99B73A807092F8957F17EEAD9D53B1128FBEF1DEFCBC607EA92AFBD353E95F52D33AB7C1EBE2 - -count = 96 -seed = 26CF860726D4DFA38AE07399838BB336F1BEE59E9F23AE4C81E73D49964997EF21CB5F5412F9A70A1EC39FC6228C36CA -mlen = 3201 -msg = DE897F02AE7292ABAFA6A0CAD52929113410F2BA972B4184E894C4D31081420751560956F49CE2B772635625AFC3CA6698FBFDE4D0A05EF243DF190BA1CE780EB572590E01E6E283E1963F2B0722B0CEB365552F65BD405F1A284DDBED07BA61C4453D30CC28C83E41590E09D7BB6932D231285205D61332FA9263B8A2D3D7F7FA20F521CA4B49F249896780E08C2DC41669BF0777278F87BB1F72CDDF4B998062B1642791F81AD474D6D8F963DCB4458CE11108544C41CDF19145B77038C7E8ADCD6501508C53B25BE6E787313018620D1BA647CCA4A5A8399E11815EAECEC6AE66DBC576699BB0AB44DE111AB6F252256389EFDC0546E641DE87FD6A3A724716257A9174F39542539A593864441EB79D499FCDF2F1D053CEBB3A1FCC09419D2C553C2265B3DC3943E0341BB49130E9981EC59945FA0B23E9DBDBF352ABA0D925C4333F2EE1F2C83C847EFA78BB13263B893D7CAE029BF08CEA2A5D1B5B997E403A489C6D9A124FB8386FE58C2476894E7754B8E5A162102A119482B5E59F8D89C8B1DEA70B6C80641C77BFD12D45C5B3CE0021EE500A1665ABCF740794E0D3E7E8CB5804A1E0D0C81A107DEE80BF63BFF8CE2EE2DD602DF279DE39C579B417A758356D2B48B41E83495DEE9ADFE4506E03F19DD096E81405264D408B2FBCDBF41DB5CED6FBDC2645DBEFE5BD038382993970C7686DBA3FEDC24E1F91BA4B6CF70B2E832B97BE24B6393273A519DB0B4446E98D77E86CCACFBECCB18939013C66F7A29B10DE2E88FCFAEF656B858B7DFACC4F21EF5F328C0EF604FEDD993510BA40530B79525FE8D336DEF0E5C303539E664A9360EDAD7268F70DF4DE199AB3F70EB2BA65E2752BF5FDB1E853E6F4EFCAFBB31D8CC23155413BE31082DA958B01682894A9057CAB66D4D64A6F3B1D81C5B75815A3E0CAF6486B17339174276A84E11C117B060302DC2EE06A03C0E15395C0DD32661638F059A385578C1B792349A41C511D12AC7185B060A831EE296E6626459C2750FAF3AFB579F6F6836D566C00C979B5130E8E50431E914834CBB3D26F6E5BA50BCF05D50F699FAF10767AA2831C3557A53AF14BFD9F23C00F76C2680C7DBF4A9B2A425E34C943228C3EBE55A0960ACC757D7878F7943E2E8A1CBC8C0D2139A6A6459D3492A1A7757F71E90A58A78E0FF9B04D059C5D131F6E3C30742FDE5506AE7860045A4C903DE96DC43AC6A69273BF8EDAB7E7FAFBAAD9EFA8FA609961502EFACCDE63A6D98D8D017075487C608FF701A7E3381D7A2ACB134B198950ECC6970A75AF5625FAA4EAF968CCE48FFB673F4F365802A984C609C33BA312140A60A6F0924E945D11BAACFCD643C874D352A90367EA4C59B63665364832B1A9A9A01EDA92C64F393C357158973FA7C6047B8B5E27EEDB28E26359402B63032F8B230F5AA968272819CA486A8BAFD3D66799AE951CABF04EA81E1E7E4632B915D4E8387C7D1F4FAFE1C1FC8666FE0318403EA0027487E947D844A7FA28C0523A64EBD95D2A8ABF6A71FEFB5BC059B2CBEECD4375F3A3F109DEAD98539244DDCFEE9E42DB3ABDAF943C445712EBF19508A1FFA6133C5078C1DA69A32CBE729A8876C4C73CB232024A87D87FD5F9456D3D4A936CB4CE2E00EF415406D66D344000A4A95CC9651425A16021336C4BEFF310210324C754BBE13CD0066C507413671C80CF492B4655D898A18A2F4DB5A393400C6AD821580B0712D6C919C62E87FE212260EAEF6876C409FCA1047A67B223E0766144F3F676F051FBE912C4CE4A9F7B85459DA031EC47C621F6EF06CD1621421FA52B047B51C944DFA94807083B4ED40D533B19813477193D1E4E96C8D76A5AF3100FA44A985A6513060B08A7F3848159B3CC551D43370B223037753B824A099A7C7DF59305BE09E2E79618C83818BD542F39380126A927190EA5536DFA63B664AA7601C6D82CDDF4CE4006E1AF2601EC453971828CD09C29D2F3EA6392B58D38BCF40BF6B6497F6B848CB853B187610CD23880CB09787C76087356C66565C0399BE746A81753442E4AAA54E84F1D8C2CCB2D00A551E960203D61E71A72E131ED1967DD06E72C99264EF2EE5BD156FC869B5031BA23A6D354D7CEC58F339F6BC2DD1C547F07AA733994860197DCE5BCE6024A74668ED89A2C9CAFE1F78B31638C3225D96009C260FBD28C1F0423E75C9C01A0F9E62B7F265FA3817F441F56AE79BA54A0C107FD7946A2DDDA60D0EAE428715FE2B4FF93BEF83CD10E5E17760FE028F1AAC8084A43EDCC12BFD3265D13FA94D9704809A50881D48F0080A976C5BF31B353B9043C0F0B69AE6F2B8BADD056752F2FC9E90C4B35850C2D45B9F354B41ED7826B976528875547A0C389B83725E26C006CC8240E380E3EB554DBF2133A131743539B1D174CCA6B135C59F81D499631BDA4CF90DED836E8C24C074A0BCD83271309FFEF320791C9030FC2B1F53FD2DE870E54EBA20CE9930C279B48B39CB481737F012F65933650374BA39E2222191B0E3C7DB9632CE9CB077322CEF97ED832DDD8AAEE53C52C03D2AAF8EB5597D8D6467A406BF428E2F16462E0C0D486A1C1C7348CBBF92633EC4FFA75945025A3C92095317E32290D4CBAA6CA40F3F201975F3FC8B733D1467C094E075E8415352E3AE51A6C5169A4AA430BCD66FF39B184F5B7174042DFCC6840EEF60CCDCAC12D012AE4F24F7184A038D8D9964AB405366740600B98CFE2E4737C8D846FD4E9B22B5047110D85B37BDB9E7E3BAF5298BBDC1050AA20F14E34DEC283830F5FA9C570C22CA659C1276BE8FFBC0AC3551DB8488855AE7EC21E239E88A0F68227D17DD87FFA3B3D0535F9E57807755DE56A65C0DE9F4A79F8746B20908BF9416A86F62EE2C2545BCA2D55CD4D45DCDF06DC879E1B6270A80778D0274AA658395D800EAEF367DF4F4D838EEE0A66093E0F419B9EDC5F003E31CF0EB7E1CEE9ACCDA7A2DFC920A4B5222389DBF12AD17392850C434A9B3C260159B0F52E78E7A66D28DD5B3C77662CFED2CB3DD5BC3CC26A34293EBF1FB3A9BC59BB0C104C5A9387F3893A65D145D424CE741A375F9C65E733A024E78FE274B29FF4B0EB6F21FAFC31453EAF7E48FABEC5711D3898B876F59952C73123281A8E85148CEF5A166BF45DF36053D57AE6F29D3E334BB2395FA236D4DAA8A4FDF99D80A9BCDBED36154BF4FA3D463D51974032D7B88B2504317E14165B1C3FE3D8FE366FC8284321D80F9CF512F418C63F73B7C29C07870332387BBD1A870AC39485F64086006CFD68C8299347615A423736C01FAEF2DA56CFB6FC966948649324E22D4551B9F50654EE505547F7D0B8481ADF6AAC3977F49D7E6AE5C4248DF7B43BDA7F082AACFCDCF1C1BC04F2D45F5E028498ECBCA47EC4D1DDEB03A2AB27BE9E4B80585145676F8AE7A5017BC5EFA317A576ED6E423D5A0495B8DC619712A2C3E6162B04B9BBC7DE4BE6532F6C1C019E702C014C60189A2612594BCB18317804C630264D07B7396DB562777BC305B885E00706FF6D0208737BD229BC7AEEFF5FB770A4C057B347601F1F6C16F60D4A53A0B32631AD2D41FA307F6630228E1807D22475D5E331A50A680896DC606F3941AC08F8BA46DE5A49F5ED6A94965334FDFD69C4A6C7973D9615B3FE576B15AACB9B98D9E498D2A3A89B4F8EEE715ED5F29F13DDE7629BB386F7CC800F16F3B5BA8BD0E14CD8D9BB0F0AA615BE9D7557F6EFD00F7BBEF9989E7F463279408E6AD77E100AE4457D57424F2B1CAEF43052C5B25C896BAA1C2FE67D1D6F669311F17D39460F0B176A7727F53257A36FAACBF3DFE623D8F882F8EE41BA1CE387E1D1860F4BABE26ED678395B9979D84DEA5C7B38905D4C7FD867ED7722D066BFF3A833D3282BB40D1CD310DC8DAC9270A49B65B5181EB30F166CAF0832A8DC56B9D135550B506D98D036BE7876836AAE669507990DE6D03E78A38139CF64F65FB410F192E30B045C93FE259C10E0C5B56A2B5F0605DA0851104C4BEEB4E3B30135CAE5A6C68403C63121B0993832834A3B5EBDD345C41B26DD219560B624024B8B945A10D385B3CE4E0BD54E10A64ACA59D283302028A9592120D142CCEB1CC30E1F96AD041F1E17BCDC3C68C2EA2E0D65D6BA3696166CB365CC461ABC4D67D504E8290EB452ECB77F6D5FAA5053D01317646242384C5C510BD43C5780BBD01EBC3AF33D29D8A09EF39AC85E70398D2A64DFFA72B3EFD8D6D57AA2F9DAC0CC6EEAB27B69FDF2403A5FEDE0BFAF441619BE03FDE44C49FF0A34E9C37D2B9AEB726D56EB646A67BF349323F397DB056D71DE72A2597D780942554C8F8273E307DBA6BD02E944E0559509E1F28B511BD709D03EA2451EF234DF6F077E06AA01E2806D5BDF89DF29F1B3D8C6D8014496AD83857F7465F1072E88709D0194733E1FC8C9F092DF5B9802FD2DDDA8B142217B9532D8604E2F32D06F6400025930DA2BE9B25529788E6BF4EB7F84C272DF455CE2ADA291CFDB5FE815129E4AED59625C879E99B3E3C1B6C5D7 -pk = FA4232262E658FDA29CA03BB3C71263C89A15BDE5774A119BDDF05D5D450422381A04FAC303F1EA8A12BED8496AD3CA31338C42EAF1AB2413191451284AC0F29 -sk = FA4232262E658FDA29CA03BB3C71263C89A15BDE5774A119BDDF05D5D450422381A04FAC303F1EA8A12BED8496AD3CA31338C42EAF1AB2413191451284AC0F29020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050FB26312F9C2BAEE6CFAC5A0C7974B2E5FAB26DE56F12E7109AF9DD9BC13E9E50962662C3E321E980A9AF300C60400000000000000926E8FCA59065A6A82120292049FBE65B06A597D67B0AEC7DB530C2B78644D5AAFC3C5CC0B3729CAE476E8526D8CFBFFFFFFFFFFFFFFF6C23B3D812B934C344FFC8A014383F1C1513A8ED005A839A46C07D5DA4BF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3545D0A15A0604FA750833AEF42205C8178CC8FE613879B2B9858D0AEFD004000000000000000000000000000000000000000000000070A48024A8344C8BC8BD4F8BCC3807A8E9058B57D43E51B2F9543DC6817983051609F9A860AC213B2B2133B1E55A93AD7CBA3EC7F2BACAA65B1027F70B10281864CA7C61E7BCEFE7FE0AA872C7D399AABE123B151CAC483AE01D470EB612231A44390AE8CF31E800EC4E581AC15829DE4A7E041AA9992102C38D77E76BFFAF22FDB29BCCD892AF7B718EEDD3B8D8B956A9E7F654FAE9CC712E20B135DFE2FF282E92252ED4BEA00A21300953AE18BA5249A004642C212C68EFD2A79795C0B423A2B0E5DD767C88F236D3B3D79C761B00CF5C044E1851B2C8C4BAE908A8A5A505399D3B503DAAB8527371E2A2E4E37E50C377C6951D24C8679EE937491A8D7E3147EB5B46AF8C7F648D846AC875BFD2EC2C735EF0DFECEDC67CD6C008C30B801EC0910800CAA7027055ADDA49AE1CE649C1FF197372B9FB51CAE72C44D715CE2A2A19F71EF3B7823911F464E9AB2A77AB51885A59DEE25F5578502BD85BFBB415F3AC58C6C1309431EB69B483CB2890F6E42CC40B87A78961836018A5A61BA209DEF586F31B169CD3FFC0D52313628488BD80D3F2284F32D3016488BECE1AA62420EBA7998EFCE95F47CBA22475F62A01416806D16C277D9A73B5B8B900C43E00 -smlen = 3378 -sm = 0BD8ED298A5F96A5C300E5AEDFC40FB6768B52064C2DC81723D82E887F05851C092F498AFD88FD06CB50171925DCDAFA92023E9B4232FAA1D67DE407D0895C20CFB42433FD04076F5FB8FDB806A83F0544AFD2602AECC0C40D02B7458A1380BF1DF21403CAEC976696A1D780F4006754A5D908B31450F500B7C1CD3EF17BC3143F06049A647891A9325F1201011BFC209E0A7B0A929B50D70E1AC380230F029232DA266CBFFC3D110506C7964686E7B500DE897F02AE7292ABAFA6A0CAD52929113410F2BA972B4184E894C4D31081420751560956F49CE2B772635625AFC3CA6698FBFDE4D0A05EF243DF190BA1CE780EB572590E01E6E283E1963F2B0722B0CEB365552F65BD405F1A284DDBED07BA61C4453D30CC28C83E41590E09D7BB6932D231285205D61332FA9263B8A2D3D7F7FA20F521CA4B49F249896780E08C2DC41669BF0777278F87BB1F72CDDF4B998062B1642791F81AD474D6D8F963DCB4458CE11108544C41CDF19145B77038C7E8ADCD6501508C53B25BE6E787313018620D1BA647CCA4A5A8399E11815EAECEC6AE66DBC576699BB0AB44DE111AB6F252256389EFDC0546E641DE87FD6A3A724716257A9174F39542539A593864441EB79D499FCDF2F1D053CEBB3A1FCC09419D2C553C2265B3DC3943E0341BB49130E9981EC59945FA0B23E9DBDBF352ABA0D925C4333F2EE1F2C83C847EFA78BB13263B893D7CAE029BF08CEA2A5D1B5B997E403A489C6D9A124FB8386FE58C2476894E7754B8E5A162102A119482B5E59F8D89C8B1DEA70B6C80641C77BFD12D45C5B3CE0021EE500A1665ABCF740794E0D3E7E8CB5804A1E0D0C81A107DEE80BF63BFF8CE2EE2DD602DF279DE39C579B417A758356D2B48B41E83495DEE9ADFE4506E03F19DD096E81405264D408B2FBCDBF41DB5CED6FBDC2645DBEFE5BD038382993970C7686DBA3FEDC24E1F91BA4B6CF70B2E832B97BE24B6393273A519DB0B4446E98D77E86CCACFBECCB18939013C66F7A29B10DE2E88FCFAEF656B858B7DFACC4F21EF5F328C0EF604FEDD993510BA40530B79525FE8D336DEF0E5C303539E664A9360EDAD7268F70DF4DE199AB3F70EB2BA65E2752BF5FDB1E853E6F4EFCAFBB31D8CC23155413BE31082DA958B01682894A9057CAB66D4D64A6F3B1D81C5B75815A3E0CAF6486B17339174276A84E11C117B060302DC2EE06A03C0E15395C0DD32661638F059A385578C1B792349A41C511D12AC7185B060A831EE296E6626459C2750FAF3AFB579F6F6836D566C00C979B5130E8E50431E914834CBB3D26F6E5BA50BCF05D50F699FAF10767AA2831C3557A53AF14BFD9F23C00F76C2680C7DBF4A9B2A425E34C943228C3EBE55A0960ACC757D7878F7943E2E8A1CBC8C0D2139A6A6459D3492A1A7757F71E90A58A78E0FF9B04D059C5D131F6E3C30742FDE5506AE7860045A4C903DE96DC43AC6A69273BF8EDAB7E7FAFBAAD9EFA8FA609961502EFACCDE63A6D98D8D017075487C608FF701A7E3381D7A2ACB134B198950ECC6970A75AF5625FAA4EAF968CCE48FFB673F4F365802A984C609C33BA312140A60A6F0924E945D11BAACFCD643C874D352A90367EA4C59B63665364832B1A9A9A01EDA92C64F393C357158973FA7C6047B8B5E27EEDB28E26359402B63032F8B230F5AA968272819CA486A8BAFD3D66799AE951CABF04EA81E1E7E4632B915D4E8387C7D1F4FAFE1C1FC8666FE0318403EA0027487E947D844A7FA28C0523A64EBD95D2A8ABF6A71FEFB5BC059B2CBEECD4375F3A3F109DEAD98539244DDCFEE9E42DB3ABDAF943C445712EBF19508A1FFA6133C5078C1DA69A32CBE729A8876C4C73CB232024A87D87FD5F9456D3D4A936CB4CE2E00EF415406D66D344000A4A95CC9651425A16021336C4BEFF310210324C754BBE13CD0066C507413671C80CF492B4655D898A18A2F4DB5A393400C6AD821580B0712D6C919C62E87FE212260EAEF6876C409FCA1047A67B223E0766144F3F676F051FBE912C4CE4A9F7B85459DA031EC47C621F6EF06CD1621421FA52B047B51C944DFA94807083B4ED40D533B19813477193D1E4E96C8D76A5AF3100FA44A985A6513060B08A7F3848159B3CC551D43370B223037753B824A099A7C7DF59305BE09E2E79618C83818BD542F39380126A927190EA5536DFA63B664AA7601C6D82CDDF4CE4006E1AF2601EC453971828CD09C29D2F3EA6392B58D38BCF40BF6B6497F6B848CB853B187610CD23880CB09787C76087356C66565C0399BE746A81753442E4AAA54E84F1D8C2CCB2D00A551E960203D61E71A72E131ED1967DD06E72C99264EF2EE5BD156FC869B5031BA23A6D354D7CEC58F339F6BC2DD1C547F07AA733994860197DCE5BCE6024A74668ED89A2C9CAFE1F78B31638C3225D96009C260FBD28C1F0423E75C9C01A0F9E62B7F265FA3817F441F56AE79BA54A0C107FD7946A2DDDA60D0EAE428715FE2B4FF93BEF83CD10E5E17760FE028F1AAC8084A43EDCC12BFD3265D13FA94D9704809A50881D48F0080A976C5BF31B353B9043C0F0B69AE6F2B8BADD056752F2FC9E90C4B35850C2D45B9F354B41ED7826B976528875547A0C389B83725E26C006CC8240E380E3EB554DBF2133A131743539B1D174CCA6B135C59F81D499631BDA4CF90DED836E8C24C074A0BCD83271309FFEF320791C9030FC2B1F53FD2DE870E54EBA20CE9930C279B48B39CB481737F012F65933650374BA39E2222191B0E3C7DB9632CE9CB077322CEF97ED832DDD8AAEE53C52C03D2AAF8EB5597D8D6467A406BF428E2F16462E0C0D486A1C1C7348CBBF92633EC4FFA75945025A3C92095317E32290D4CBAA6CA40F3F201975F3FC8B733D1467C094E075E8415352E3AE51A6C5169A4AA430BCD66FF39B184F5B7174042DFCC6840EEF60CCDCAC12D012AE4F24F7184A038D8D9964AB405366740600B98CFE2E4737C8D846FD4E9B22B5047110D85B37BDB9E7E3BAF5298BBDC1050AA20F14E34DEC283830F5FA9C570C22CA659C1276BE8FFBC0AC3551DB8488855AE7EC21E239E88A0F68227D17DD87FFA3B3D0535F9E57807755DE56A65C0DE9F4A79F8746B20908BF9416A86F62EE2C2545BCA2D55CD4D45DCDF06DC879E1B6270A80778D0274AA658395D800EAEF367DF4F4D838EEE0A66093E0F419B9EDC5F003E31CF0EB7E1CEE9ACCDA7A2DFC920A4B5222389DBF12AD17392850C434A9B3C260159B0F52E78E7A66D28DD5B3C77662CFED2CB3DD5BC3CC26A34293EBF1FB3A9BC59BB0C104C5A9387F3893A65D145D424CE741A375F9C65E733A024E78FE274B29FF4B0EB6F21FAFC31453EAF7E48FABEC5711D3898B876F59952C73123281A8E85148CEF5A166BF45DF36053D57AE6F29D3E334BB2395FA236D4DAA8A4FDF99D80A9BCDBED36154BF4FA3D463D51974032D7B88B2504317E14165B1C3FE3D8FE366FC8284321D80F9CF512F418C63F73B7C29C07870332387BBD1A870AC39485F64086006CFD68C8299347615A423736C01FAEF2DA56CFB6FC966948649324E22D4551B9F50654EE505547F7D0B8481ADF6AAC3977F49D7E6AE5C4248DF7B43BDA7F082AACFCDCF1C1BC04F2D45F5E028498ECBCA47EC4D1DDEB03A2AB27BE9E4B80585145676F8AE7A5017BC5EFA317A576ED6E423D5A0495B8DC619712A2C3E6162B04B9BBC7DE4BE6532F6C1C019E702C014C60189A2612594BCB18317804C630264D07B7396DB562777BC305B885E00706FF6D0208737BD229BC7AEEFF5FB770A4C057B347601F1F6C16F60D4A53A0B32631AD2D41FA307F6630228E1807D22475D5E331A50A680896DC606F3941AC08F8BA46DE5A49F5ED6A94965334FDFD69C4A6C7973D9615B3FE576B15AACB9B98D9E498D2A3A89B4F8EEE715ED5F29F13DDE7629BB386F7CC800F16F3B5BA8BD0E14CD8D9BB0F0AA615BE9D7557F6EFD00F7BBEF9989E7F463279408E6AD77E100AE4457D57424F2B1CAEF43052C5B25C896BAA1C2FE67D1D6F669311F17D39460F0B176A7727F53257A36FAACBF3DFE623D8F882F8EE41BA1CE387E1D1860F4BABE26ED678395B9979D84DEA5C7B38905D4C7FD867ED7722D066BFF3A833D3282BB40D1CD310DC8DAC9270A49B65B5181EB30F166CAF0832A8DC56B9D135550B506D98D036BE7876836AAE669507990DE6D03E78A38139CF64F65FB410F192E30B045C93FE259C10E0C5B56A2B5F0605DA0851104C4BEEB4E3B30135CAE5A6C68403C63121B0993832834A3B5EBDD345C41B26DD219560B624024B8B945A10D385B3CE4E0BD54E10A64ACA59D283302028A9592120D142CCEB1CC30E1F96AD041F1E17BCDC3C68C2EA2E0D65D6BA3696166CB365CC461ABC4D67D504E8290EB452ECB77F6D5FAA5053D01317646242384C5C510BD43C5780BBD01EBC3AF33D29D8A09EF39AC85E70398D2A64DFFA72B3EFD8D6D57AA2F9DAC0CC6EEAB27B69FDF2403A5FEDE0BFAF441619BE03FDE44C49FF0A34E9C37D2B9AEB726D56EB646A67BF349323F397DB056D71DE72A2597D780942554C8F8273E307DBA6BD02E944E0559509E1F28B511BD709D03EA2451EF234DF6F077E06AA01E2806D5BDF89DF29F1B3D8C6D8014496AD83857F7465F1072E88709D0194733E1FC8C9F092DF5B9802FD2DDDA8B142217B9532D8604E2F32D06F6400025930DA2BE9B25529788E6BF4EB7F84C272DF455CE2ADA291CFDB5FE815129E4AED59625C879E99B3E3C1B6C5D7 - -count = 97 -seed = 13F1F446D9AA5AC853278BF74C9E6447A6CE4294C037867F43DF554370EE261D05C7260EEBF46D6694D0850B8343FBE5 -mlen = 3234 -msg = 525E8B98C55864849FFC71EBC953F7A0ECA6298F6AA15A83BF6923BD5921B1C86DBBFC544A39C364EF6D9281481E946C994F96829D6639727A5345560D8641E9A510F913F7FE5592C2A40CB278F5AFD8D4504B5387C20945654F08168247A98F56A43A5020955F882D2D93781F4A83676B08F50341E953A5D1B67DE7F6D1BE3D78D5D060AA85B5EE4271763C437CCD595890DBC8FCFAF2754AE9349BA2FDF89847A15188716C0EC672887A4B9A15176AE0C5138819CA232D012BE1DCFFD29F677442083087C127CBD80B0D9CC0962BC8318E734910D1E2653BBF700C84BB0919E12DF331CCDC7128B41F0666F6419AFBADAF673BE16C9177D3CF113C6488504DE088149BFB83EACBBC400309B7AD753F7B2F5AA89F070C9D14C084C32DF91C5F7CB6A7D869D64F4A05AF80A98BE7517ED784C17B0D7DF96B9987B7EA7A398CE018AE6E13E1C0F7AA040AC3FFD273BB9687AD6FEFDB211061A6228967E9DFEF69BCC1C5D02EE56D49A93C8AAD46D08322A2CA246AE8C3EDC071D063AD605A97B8AE94D58E897A4A6310BCBF55B0CAE1AA81769D30B46F883EAF29D4B5FEA32F2DBDE49360CB6235754BDC305ABB5E5395360097378656E2BACE675448889B0149D6086C51E9C3AF07A76563164864F131CF9C0CD475CD4A58726AD237CFB76ACA68032351FB24711DA635871386B4BFC94B0DB6D35F07D0196F75CEDB92EFBE7D653E0FF9326A596F9166FF6CAB73125DAD27F361D6122CA531D86910187E75F849EDB52DB26C96FDF05925DCCA232480D3F979EAB07CCA68FC9069965D12BB666A180989AD1FBEE3FE65E746C5A8F64DAB2E370F0487D001121EDD0D0D760531AF46DA65C75DE11688EBF31DD2AC95C188BCFA07EA798609F3EA8E6364A43742A2825144FAFC05ABD17476480812EB2483734B13D075B3EE3AD510B67CF7057014351B2CE5357E3F12F43BA74CED614BE3A9AC0E26763E9AC596F87AE98F72ABE0DE213A81A9A03E2B82F2312C1A186DFCFC3DB346FEB132931C793ECF837F57D8E326101F59705B77A3083E712CE347C2C29C23468B0C5857EFA410197833987C61ECBC2A855EF78B3D7B1B697AB9844AAD07C4B8EF666BD80DABA5FCAC900C5D358A11676FFC89DFF4F36F29F14D9F9B854DCED41FFC4B36381449D22801C19BF8E8BA1F07A1B38FFB527A34D009C4064A1E606FF2AB90AB2E05C156150EC14D7DC792578A16F46650D0ABB61175D1817E2C38F109EBC01A3ABB358673561691185DA32EEEF566C1BA1C72C1F08CD1B427B552425501B8783116F2EB0CFF73C5D2DEF18D291C106980135821A77428FAB20A935AC8B6DD8EDD1A936225344EB103DE0D5879CCA09359B5B882291C0FB1FCCF167C30DBECFC324AC315713CD10F35B72F0D4871A7CBAA2B4CC2BC2598F23DA607C94A063C9E2013B0EDA5F3BD5AADB2C429177A4BFD7B6181ED5F9A55C1F043DA8155C9E7BEBDA7EA07DEA49938FE07743DF2295C220EB53348310842B1000B7A02AC025C3A94FA82D46ED7E2712DE71B149742731EBE62E225D21A7F29D5F3A8A62B71FE16258570DA412C07CECF82B2064AB5D98761C69FC5E899A8E174875B3179DEAA0BF4A0261DA9BF39148440DCBEB0C887E41FDF751505DE79AA1F8593F45482B659F5B5F4CC3E7BFEE59DEF49458DB195A1A692B8AF4AA44CCFB00B753AC761181B8AAB39DB82385AE776CFC585F7873613B62DE55BB10A6B2F27E631CE41436C3FE390163E6F4EBD6B501519C96C06FADCAC8F75920FE1435542FDF535EAD6C0E3F41345996063B95A208DEFB6F110CC861580979BF4422ED395CA218CFC3B22C0BA8B31CB9EEEB51C3DF35FECE92795CAFB8440F522B44E21B3A18D5CDBC296B887A4B927F36715E4AC2CAB043D8B69A8704D6BE24C725B0C2E814BCA7B040C27FE8F4C14911051039AF13F44E0485EB767F5404CFB6FD19DA24D82FE24B53033C83DD8634E2E28AA330A81F14BAC1C57DEAD7FFE39994D9D094383E14322E146A3DF27A776E2F09A11EC9014C809F8E543594D6B4814918A129B36FD25015A044E04D3F081D4D201DF86A0FCAFBBFC695088170B8246776B6A28E59449C646D1E706CEA96B12683CD3A7C60459D42989CA46694B0089CF88E9AEC5E110F69FE0E3FE20D18309D1BA72A83A34813B771484505B08548FE5D376AAA0C414260EA4BCE5EB81F6545CD5203026264938905BE1E252574F4B4E71C6E12F99F6EFD35EFFD64183CD0665FE89D6A357B1908E083511DCE2CDF792A608044C31418C433F86719E156AF3FF98D0F54EBEB9F9FBF24588A5557D310EF9D7CF5DD8A68512D8CB15114773C69D7B40C927858AFC049F7C6A89841020E1C313C5C38B988EF505EBE6C15FC1D6CCD8B472F90ED64DA895D06AC01BB99F455A195A670D22DBD5E3F03AC84A08831E9842A566E9785A0FD4C460C5CAC154D705DCE1E7FD1C45BAEB23976AF881CF5628F3CD92AB19BAE8D45A03A859518E4A1E558FAC2B48A432E46CF274E6496B63874CA4E4571132568AA43EEC3D2A3948F40D327976A6D28CD816CFBEAF8FE126913384061D219F51179F679081503371EA0B6BD7E9524B0ECE2573304ECB4A16EB471CA0817C0C6EDE751F283ACEEC5A60C2796C6261FFC6226E4813241619F465DCE67B38E1D5A647B079503144907307C7D6EB6E6EC1936B5C94FCC08A882B4555B19B33A9BF22384DB38473A313966D157DAF8AAD41EF67D3A5FE723559096AB1768FF69773EB9D5C88D6F35F00DFA4473DF71C7E9E35393638DED05D05C105CBF37711D38E3EEE35E8CC0029B3761241FD1E56969E09E949690D4FE25735D774E777A2CA17FE058E14AE6806F611FB1E9FCD516E20499A704B67990716703A4287B50AB45D155D40EDC0AAF97F5B87551C236CEBE9CADD562B27957EAD251F79CAAC6433F228B50167FB1A753306FFF08B53A8A3CECC226857A321700EBE23AB4D6C35415CA79B682D6CFEF6B1341E7CE00CB9870F432B63A2D9A9A43C87D28A95C514582812DA37738BDA6CC76142E08F69EBAA5ACD0403100C2343E2FA088441E9A55C720BB509BC3600C27C1D39157E049650D1749751EFE55A72349E2A5B714556CE2188CE972287BE2152C7E58D3FCAD43A214A4095DE55CAE9F627D8B9018DAA01547842FA1AD14D67327CD47EB9B90CD94AFDF5244DE57E527F17894A410FB4210E06632E88A398400B0AA48CB3FEB9A90ACC668615D193D5A98158092FBB59AD2D6D4FFEE433A2A6A971A228685AE5BBAFB3AB28242C630AF4656C5071C545618A0A765FCE41B19970C2152D44C349D0CDFB29673D1A42FFEC139D1C9958B0962F7B57F80CB8FE6331553B0DF93DA9BFC722B1C001F48FF9C0FEF032610A1118AC9EBAF9202DFFEA605272A50A90768F031C72D570C0AA5B0D4FEE4AD568895274388104C0BF88D03FADC3159D6CF28AC6A7E3E5CF6FE5C6658128CBF81456DB8C29A76F9C75230F3837F1A94CB83C3AAABDF4B29C9045B45AB9552BBB6C0844BF2926267C0D74D3337249D5C9610E0F6FFD0278F12F39C48650C048D61A3FDB8E1A2E08CCCA68803A55B39BD39160B0420CBEAC7D8A55F571F490F694A7AA8B725BA84238EE1E711864AA1F74AFF252C088E36B79B09C80278DD442EAEA8C7D5833CD1BAA18BDD866689E663EADD0EAA6E0C78A3E09DFFE5F6F1F4003DE24336586B25DC5EE45D56F31D8BB2DE31B24E87172F3F1B26D400B08D50FF624E456183F269CBF06B3707260383174FDA152E4D0C528A90C54114C4F278D0FB35B74DD3ECDA14EE89D38E3227A7E18B068F134B22154348867A61719C926EA3320D1BE0B9ED78466B2DED728CA04C15AC144185FB2F5084511A38CFD765659351AC1AC3E5F327D9F3DE9B2B003758DA78DFD08FAEF3625CEDD87C8A55A3CD0257AA71B3788FD2449EFD1F48948CB304468E3CA07EA7044FA185A2B91F9761C6532B9273DB74C66B2DE95AB19E5102CB90C719EC85671E2829B182BB6D09323248D6584F0CA67D422BCDA65A0146D8DF27AB4AE651706D5FA33B5BB88ADC2A1A95105D55CCA8439A5060D110760DEE8B855D0839053BE595278EAE66542736D25C93D8544C6E55ED51AD6E7029C2E6D32CFA8844BC14972809E31754AF84BB479C504EE77CB65CEDDB6BDA613FEAA2AE6598D1F4975D0FCF9D9DC787EEB5C03F8B0BF438E83C38E2195EF1D35D40F5A14E194BC1BCC64D02CA722E7DA28334E91FB6654D708C5B07946CDF58747086EB3CA59D095EB27F1B7E6806D3A35335B2265031A1120F28EED8B4C5D9AF268502727C5D23152149C98E6970D4DCC4B9D0FECFA6A79FEF82CB233E71FC8AA999DF66EBF5A1DB2ED1583C65803FA8958F49890D13BC05C6A991F26C31766BDEF9BAC601A47C8C3C5E395FD8F47E56F04439E9BC8E9B1901A529395F2D57495D70D0712881D298A60E3E013326CD56BF9F1319EA8D6A6511EEFF373F081478A51E14F0AA4A33C6C5EA7816380C8984F7A5DA45B0C4B6B550644E65A5B2DF059ED050936FE6F073B4E8056ACCD3EB65A0B -pk = 4FEE08D6436A83982B066BF804A065FDAECB14D815CB7C21392E9746A72F893409FF12473E43553D034D86818D41EED8E3724E9BA01FBDA35CEF1CA5DAFFD029 -sk = 4FEE08D6436A83982B066BF804A065FDAECB14D815CB7C21392E9746A72F893409FF12473E43553D034D86818D41EED8E3724E9BA01FBDA35CEF1CA5DAFFD029020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B65D65B40BC377DED53A4F1458E2EF78BDE7D59F8CF16D6881187D77DEC830E8E746AF52355CBC9C24BD43B2007E01000000000000004B9D696EB8B1B67C220BDDB3CC689E6FBF9A9971FA382DD711538BCFD9CCF5BE9C170CC576830CDA308F8AB7D17EF9FFFFFFFFFFFFFF3B6E9C816CFDE42221FC907573DB6C77A512712A3772E2B94768EB1C4484FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E527027F53DF727CC619750BBDAAF1054A9D8EC926FD0F68F2D19958F6105000000000000000000000000000000000000000000000040D36B0C04CA54E146DCEA99890D3F2DCCED09282B284BEE4727BC72EB39F62A2B3B9584746AF58B8C0F4E6C062E6F49936F62E48CAE012EFEA09BE41D7098037C4FF6F3A90CE7D560C1C7764503E870E9DAF14CC9EBFC2B3A0F6D2F1BF81A226633E02792770B280884699A9CB3404770850692B6EAB6FC5CEC04005522C423A3DF9B7C8D0520F67ECA94C63CD930229B88F38DA0DDED1C1C95787161147D0CDC7351BECB33778DCB4528976BBA33F48383D760606839E9AAF4219AA9BA46121E101D0928B00475DB60DF055BB399898229BD95EE70CC6CE47C28DD15A2B0188B8570C6FABD04B88A767295493F2A5486EE44E05CE8CABEFD1F73D03FD2432BE6D8FB5130AB6D8BB2DB0E5DB2671885A6441A521E9851875C329A0B1EC2491BB311F01DF5E747D42713292E1E8D117441B5D99F2B1BFCE85A4AB8E0BCED4731FB4BDB00F92FC4FF91C19FBC30D98D710D2DACB9027A50C80780C656559BA129471FA7430C02C6E7A82E29F3609520A056E7F1DC293B2F4F526EF613D61A711B14E8DED577D36E6B3564EEC74972A7C7822567F2CD8C6C227A28592C2F695F1BE26FA766AB601BD178AB7C72C558DCC55D35C59EDD121A4A4F6D42B90AD4FD08 -smlen = 3411 -sm = 4CCBD42A388AE0220805230B0695CB151BAE640119BA9752A82358FD03072402CF548E435456C30095F9C8252EF3A47FD407E8C34C2E6E45457600009584F6D501C0EFC00E04810DD459DC57538C5A067FD5B01A3B8581CB2B062B4AC12E665507253B018E6FAB8E57C2AFB763074BE28F65389653F3D0027A7DED650ECBCA1399032D504A7B8FC063B636000175F70ECCF37B792A7B13FAFB5B20D48A090387A44976AE33DF66DA021921F759A8532A00525E8B98C55864849FFC71EBC953F7A0ECA6298F6AA15A83BF6923BD5921B1C86DBBFC544A39C364EF6D9281481E946C994F96829D6639727A5345560D8641E9A510F913F7FE5592C2A40CB278F5AFD8D4504B5387C20945654F08168247A98F56A43A5020955F882D2D93781F4A83676B08F50341E953A5D1B67DE7F6D1BE3D78D5D060AA85B5EE4271763C437CCD595890DBC8FCFAF2754AE9349BA2FDF89847A15188716C0EC672887A4B9A15176AE0C5138819CA232D012BE1DCFFD29F677442083087C127CBD80B0D9CC0962BC8318E734910D1E2653BBF700C84BB0919E12DF331CCDC7128B41F0666F6419AFBADAF673BE16C9177D3CF113C6488504DE088149BFB83EACBBC400309B7AD753F7B2F5AA89F070C9D14C084C32DF91C5F7CB6A7D869D64F4A05AF80A98BE7517ED784C17B0D7DF96B9987B7EA7A398CE018AE6E13E1C0F7AA040AC3FFD273BB9687AD6FEFDB211061A6228967E9DFEF69BCC1C5D02EE56D49A93C8AAD46D08322A2CA246AE8C3EDC071D063AD605A97B8AE94D58E897A4A6310BCBF55B0CAE1AA81769D30B46F883EAF29D4B5FEA32F2DBDE49360CB6235754BDC305ABB5E5395360097378656E2BACE675448889B0149D6086C51E9C3AF07A76563164864F131CF9C0CD475CD4A58726AD237CFB76ACA68032351FB24711DA635871386B4BFC94B0DB6D35F07D0196F75CEDB92EFBE7D653E0FF9326A596F9166FF6CAB73125DAD27F361D6122CA531D86910187E75F849EDB52DB26C96FDF05925DCCA232480D3F979EAB07CCA68FC9069965D12BB666A180989AD1FBEE3FE65E746C5A8F64DAB2E370F0487D001121EDD0D0D760531AF46DA65C75DE11688EBF31DD2AC95C188BCFA07EA798609F3EA8E6364A43742A2825144FAFC05ABD17476480812EB2483734B13D075B3EE3AD510B67CF7057014351B2CE5357E3F12F43BA74CED614BE3A9AC0E26763E9AC596F87AE98F72ABE0DE213A81A9A03E2B82F2312C1A186DFCFC3DB346FEB132931C793ECF837F57D8E326101F59705B77A3083E712CE347C2C29C23468B0C5857EFA410197833987C61ECBC2A855EF78B3D7B1B697AB9844AAD07C4B8EF666BD80DABA5FCAC900C5D358A11676FFC89DFF4F36F29F14D9F9B854DCED41FFC4B36381449D22801C19BF8E8BA1F07A1B38FFB527A34D009C4064A1E606FF2AB90AB2E05C156150EC14D7DC792578A16F46650D0ABB61175D1817E2C38F109EBC01A3ABB358673561691185DA32EEEF566C1BA1C72C1F08CD1B427B552425501B8783116F2EB0CFF73C5D2DEF18D291C106980135821A77428FAB20A935AC8B6DD8EDD1A936225344EB103DE0D5879CCA09359B5B882291C0FB1FCCF167C30DBECFC324AC315713CD10F35B72F0D4871A7CBAA2B4CC2BC2598F23DA607C94A063C9E2013B0EDA5F3BD5AADB2C429177A4BFD7B6181ED5F9A55C1F043DA8155C9E7BEBDA7EA07DEA49938FE07743DF2295C220EB53348310842B1000B7A02AC025C3A94FA82D46ED7E2712DE71B149742731EBE62E225D21A7F29D5F3A8A62B71FE16258570DA412C07CECF82B2064AB5D98761C69FC5E899A8E174875B3179DEAA0BF4A0261DA9BF39148440DCBEB0C887E41FDF751505DE79AA1F8593F45482B659F5B5F4CC3E7BFEE59DEF49458DB195A1A692B8AF4AA44CCFB00B753AC761181B8AAB39DB82385AE776CFC585F7873613B62DE55BB10A6B2F27E631CE41436C3FE390163E6F4EBD6B501519C96C06FADCAC8F75920FE1435542FDF535EAD6C0E3F41345996063B95A208DEFB6F110CC861580979BF4422ED395CA218CFC3B22C0BA8B31CB9EEEB51C3DF35FECE92795CAFB8440F522B44E21B3A18D5CDBC296B887A4B927F36715E4AC2CAB043D8B69A8704D6BE24C725B0C2E814BCA7B040C27FE8F4C14911051039AF13F44E0485EB767F5404CFB6FD19DA24D82FE24B53033C83DD8634E2E28AA330A81F14BAC1C57DEAD7FFE39994D9D094383E14322E146A3DF27A776E2F09A11EC9014C809F8E543594D6B4814918A129B36FD25015A044E04D3F081D4D201DF86A0FCAFBBFC695088170B8246776B6A28E59449C646D1E706CEA96B12683CD3A7C60459D42989CA46694B0089CF88E9AEC5E110F69FE0E3FE20D18309D1BA72A83A34813B771484505B08548FE5D376AAA0C414260EA4BCE5EB81F6545CD5203026264938905BE1E252574F4B4E71C6E12F99F6EFD35EFFD64183CD0665FE89D6A357B1908E083511DCE2CDF792A608044C31418C433F86719E156AF3FF98D0F54EBEB9F9FBF24588A5557D310EF9D7CF5DD8A68512D8CB15114773C69D7B40C927858AFC049F7C6A89841020E1C313C5C38B988EF505EBE6C15FC1D6CCD8B472F90ED64DA895D06AC01BB99F455A195A670D22DBD5E3F03AC84A08831E9842A566E9785A0FD4C460C5CAC154D705DCE1E7FD1C45BAEB23976AF881CF5628F3CD92AB19BAE8D45A03A859518E4A1E558FAC2B48A432E46CF274E6496B63874CA4E4571132568AA43EEC3D2A3948F40D327976A6D28CD816CFBEAF8FE126913384061D219F51179F679081503371EA0B6BD7E9524B0ECE2573304ECB4A16EB471CA0817C0C6EDE751F283ACEEC5A60C2796C6261FFC6226E4813241619F465DCE67B38E1D5A647B079503144907307C7D6EB6E6EC1936B5C94FCC08A882B4555B19B33A9BF22384DB38473A313966D157DAF8AAD41EF67D3A5FE723559096AB1768FF69773EB9D5C88D6F35F00DFA4473DF71C7E9E35393638DED05D05C105CBF37711D38E3EEE35E8CC0029B3761241FD1E56969E09E949690D4FE25735D774E777A2CA17FE058E14AE6806F611FB1E9FCD516E20499A704B67990716703A4287B50AB45D155D40EDC0AAF97F5B87551C236CEBE9CADD562B27957EAD251F79CAAC6433F228B50167FB1A753306FFF08B53A8A3CECC226857A321700EBE23AB4D6C35415CA79B682D6CFEF6B1341E7CE00CB9870F432B63A2D9A9A43C87D28A95C514582812DA37738BDA6CC76142E08F69EBAA5ACD0403100C2343E2FA088441E9A55C720BB509BC3600C27C1D39157E049650D1749751EFE55A72349E2A5B714556CE2188CE972287BE2152C7E58D3FCAD43A214A4095DE55CAE9F627D8B9018DAA01547842FA1AD14D67327CD47EB9B90CD94AFDF5244DE57E527F17894A410FB4210E06632E88A398400B0AA48CB3FEB9A90ACC668615D193D5A98158092FBB59AD2D6D4FFEE433A2A6A971A228685AE5BBAFB3AB28242C630AF4656C5071C545618A0A765FCE41B19970C2152D44C349D0CDFB29673D1A42FFEC139D1C9958B0962F7B57F80CB8FE6331553B0DF93DA9BFC722B1C001F48FF9C0FEF032610A1118AC9EBAF9202DFFEA605272A50A90768F031C72D570C0AA5B0D4FEE4AD568895274388104C0BF88D03FADC3159D6CF28AC6A7E3E5CF6FE5C6658128CBF81456DB8C29A76F9C75230F3837F1A94CB83C3AAABDF4B29C9045B45AB9552BBB6C0844BF2926267C0D74D3337249D5C9610E0F6FFD0278F12F39C48650C048D61A3FDB8E1A2E08CCCA68803A55B39BD39160B0420CBEAC7D8A55F571F490F694A7AA8B725BA84238EE1E711864AA1F74AFF252C088E36B79B09C80278DD442EAEA8C7D5833CD1BAA18BDD866689E663EADD0EAA6E0C78A3E09DFFE5F6F1F4003DE24336586B25DC5EE45D56F31D8BB2DE31B24E87172F3F1B26D400B08D50FF624E456183F269CBF06B3707260383174FDA152E4D0C528A90C54114C4F278D0FB35B74DD3ECDA14EE89D38E3227A7E18B068F134B22154348867A61719C926EA3320D1BE0B9ED78466B2DED728CA04C15AC144185FB2F5084511A38CFD765659351AC1AC3E5F327D9F3DE9B2B003758DA78DFD08FAEF3625CEDD87C8A55A3CD0257AA71B3788FD2449EFD1F48948CB304468E3CA07EA7044FA185A2B91F9761C6532B9273DB74C66B2DE95AB19E5102CB90C719EC85671E2829B182BB6D09323248D6584F0CA67D422BCDA65A0146D8DF27AB4AE651706D5FA33B5BB88ADC2A1A95105D55CCA8439A5060D110760DEE8B855D0839053BE595278EAE66542736D25C93D8544C6E55ED51AD6E7029C2E6D32CFA8844BC14972809E31754AF84BB479C504EE77CB65CEDDB6BDA613FEAA2AE6598D1F4975D0FCF9D9DC787EEB5C03F8B0BF438E83C38E2195EF1D35D40F5A14E194BC1BCC64D02CA722E7DA28334E91FB6654D708C5B07946CDF58747086EB3CA59D095EB27F1B7E6806D3A35335B2265031A1120F28EED8B4C5D9AF268502727C5D23152149C98E6970D4DCC4B9D0FECFA6A79FEF82CB233E71FC8AA999DF66EBF5A1DB2ED1583C65803FA8958F49890D13BC05C6A991F26C31766BDEF9BAC601A47C8C3C5E395FD8F47E56F04439E9BC8E9B1901A529395F2D57495D70D0712881D298A60E3E013326CD56BF9F1319EA8D6A6511EEFF373F081478A51E14F0AA4A33C6C5EA7816380C8984F7A5DA45B0C4B6B550644E65A5B2DF059ED050936FE6F073B4E8056ACCD3EB65A0B - -count = 98 -seed = 6F6E47E8336ADEE99B2C52CF2DC8D461E0A54C3DF2F08199A9F0816AF8455381054CE47A7766726D3AFC2E2F2BEAF8E8 -mlen = 3267 -msg = 00769683FE7BFD74B3ACD21AF3898B74CA73DD126C8315538937CAC4EF0AD4588765A26DCCE1C90C559CE691E7EB3E0A497D357E1AB583C761439C0A66D1164518F01B6894067925753CC2866A91552FCD0EF029C2284C620CAF364DE6C56EB41EE0E4431D9BE22B76451D132A3F9AD91A53449BE820A7ACF56F6ADBC7107C7C729EC8A64FFF6A24B4CF83FF4E945DEF336DBFEA6067FCCBD1CD6B5698ADB1AD6DF03FD0A553457B8E9FEB4A1243FEEFC2DF7F66AE3ECA5BF169F7891ADAEA8D5C59012C7AA00A5A86B0A33D0006F8AD5A01C60ABBDA6D249D3FAC7EBFB85103A3A747A45D0ADB7DEF52ED3A5F1A620EE383A9C0CCE1900E413FC74A7A97646111D54783928B15BCA783D01EFC67F49CE6F781E82D25D3F30561F507E3831CB4EA5B4A08D5489830017270B63D8298BEEBF48EB56BDA5685D5E1E06404EB9A6C3790E9B29C99168B10BADF8FDB03F3C568672773EEC96428149CA272EA5A8083F8208BDCE361E7D40BC4DA75029D4A18B0B6AD615DBF849935D4755CFFD270A52FA290811CD55BDCA38ED89F0066ADB9BA7F58366379FFE1CAF3A9127E147C3AF3DC27279391E0C09537E81E20E7B9FE4FE3DA970FE50BFC96555233CC9E61D3C356AAA8EED5A8AEA2327D7036EE03E7EE40AA35E9DA4544B121514C261EC1CB0B2D75B1D5CE129E47F89825F69BA8254163179FC1331A917AE9C5A18556A10C5F983871B1258CB6FC8AD207F97A220C5598860B6C56F1EFF09DE6000241E901A89E107FEEC15833D34D6EB12DB6B188FAA0B858A5B9E32F84F783B43B6F8A3B2E4B044CFF8902E1EB0C527BB4E29C92ACC9DC7E0D9AC6B3A021415768B21DD9695983EE89C871C0EADE0BCE4FB72E682DFB5A2BB7498BF4D2C01240F67D1B62BAA4E587069C16E3032114B14A1C4288FEBAEBB4C75C3C05924A358C4BB7DF95ECF81D67147FAE3F605EDE61B7BA164EBA1AB36ECE97DB0ECB32A673E899B24557D8987AF3ADC57A9DA609914C9B2D6D8AC58E5954E0DB5AA9E75B444700B8F704E15A6A7BBA81809FA8801C6CEB5747A44CEB8F99CFE6D8A2A03C03451E5F3D392725207F3DD28B2C00004425B7AE05FA3769183AB60857B27AB08BCC4321D293C93D1D850D4E7A81B14564D7B15AC0E3BC1BFE0561622C6AA06923EEFE163629EDE8BA1732DBFCAD52D3BAA6E11E569EA790B36A8472B2CA37BD5C0EDD37D8F164B874952D00D592FB705C6B3110A12B03829C157191D33C579593E7828CDA5C24A284BA2F5A42F0BFA601A8F6D3DB1CA6D703ECBD261629C9F96EBC0458737B9951219E5B1F86192E2A85B47D80610A0ACC8B1A70DB2916F89CDB2C7F8943471DDBABD2A3536C5DC8A73CDEDDEAAEDC86FA148D2EE479F8465558852FCBEA0DD8017F1B976281A5014319C2C3CACCBF571D9550215B24134F6DAEF32716802E7945CB3F97AFC1AB1DA17D0C41B545A750EF345A6F88AD5FF52D512AFA6558335B5EB8979D8E6DC1DA562BB997E7D152D9FA3EAA09119C3474E11218230D8A56C19AD87FDE483FBD6DDDE9ACBA813BEBC8505A323C601E5B5251650DAE9334562E3DCC38A28BD7DED6942D0CC2014235C1B66CF4A57BA3010B83CC7050309F57A27207512D195D070DB3D10FFCBACDB47E4231142BAE588F92C5B0A71ABD67CA9390C2E05FD2CF7A1FABB14C5A7AE3773C66DB1F055214479E388B5E6ABF0DF8FD1B0E4F90828ACC397643CBC274143FB4331262A20634877BE4C7489C1AE9EAF90BB2A177A6B5AC15CBDA27DA0616E5F87461554F5686A7BD6D047AD0B98C8CDEA3DB78DD2970C78FB861F2A92DDC277876791C4A30F525659557831F4377065D19ACB384CC68340152A6DE6D84CDB58F433923D1FB8CC6B10BACD95B9AB1B45563998620D192032269FA8301C09A29C4B5B20CA0A3D63A4F5984B7DB0F5B17417DC7B939B9B177BF423E2F3D57DFF296E6E4FF0FB1744B13731206EAD54EF0AA1DA09BEA8B0AC0EF71B73D009D30531DE9FDE90D86BF5F20D8E5A9E324E657A98F8C0031ADAC4385157BA4E28B48AED957A5B36C3B49057F8ECA7F56808F794014DAD170601070607010E004F42D01CC63B2A1761126BA045F1165E25FDD05901FAC6B76E777FAAAEE6F5ED94302E2DA28046B4BC60228E1B9E194F364E377F84681B3011583554B76FBF8D7456DBDEA665ADAD6AA0556C8CC714F217A518A98615C4C1CFC8ADBBD4D12C5BC23AD7A0F849E32FE2005334B55D7BCB43D1C95D4793E7C3882740CDE8DD24B367294496A3E2F3251A66CDAECE9E0A73D853F8D4E3A4637836DED68CB28BA4FCAB02D61FB5CFA581792E636217F3238D78912EA0863816FFB2F388823174B19433C2B14BAB69E12C3B791FE683744D4519455A52555AF0D7E12749F6094AFDBA00FC6A609C7578C531FC4C3C3065EBF78414F112014726EC2230F9BCD9C15E36283144CCBE0D1785B65CF49BA8FEFE92EB6907C0330BC98AC172EA9E8DD4DF8974DD6B6772BBC6CA8E8562C5EC0B6592DE7440AC915C35E0AC8087F22EBA110CA3037B469B1D5BC92636D81881E38D8BBED01A29B3EBCF0C19EB95BF999EB848022592AEAAB649CE19824ED9D3A32D75FBA556EE07606A306D1FCEC2E24B38274C361B7BC96CE37B7F4FE434EBA17AC2A097051A92E4EC32E4C678F7762E8B96EBFD2600C0F224B04B2CD7E9F4AD327D53603828015E9CF45969800F02FA5E0BA26B8C844BA1FDFFDE44303AD0389C1B31D582877CA6BFAD4973BA35FBB90ECDD95F430078BC39AA89434130A5FB8321E51F9624090D0277A9F112EE8FF65D3DBA999C7C08727D0F08DCF00CE22F62C955D6A822F247C8065AB94AC442E1CB5F31254816794CC2556891A523B8AEF09D3B9E07AA8B67B3B87567ADEBDBDFB93BA9A082F72052572C97E73AF16CFC42D2A51A3683F84748A338AAB56264753BA4083D356A27C71F47221ED8340C50AFD46CD207C4F9634AB5A44888A4234770C46232C35EFF83FA950B0A6879137DCE209D5A1F26809B411F046F51FF084F15BFE03292EE845D3044235ADBC299925235462E67F803DAA1426F0E116B93F4532DD2784F7F87AE360281CE21F70D230C242E1A98DE8FE1D6147AD71EDEC89E24A5980C45FD91E23516758AF71DF8E0DD96929D4DA61A3BAEABB96C9378986DEB4C9101175E3AF1E102B52A8DA27D916EE4A28263CA485CFE87EE5436249C1A2F933669F6E3274E9BD93092F4A798AE85D6592EBB54DC65C28BA08582E275972B0A12C22A7792CCFD4A398E504C6FB2CF5EF1F9C268540B4FD7D07D59C49A559D86A56A009C4C18A3FCECA109FC7A45C6E842ABC22053E84878C4805D96AC96BA00FA40FC3B50407141105845055447CA94BD27F234183C2B8BF37F5CD249ED0705AFAEAE59C8BE8F6B38069D67FB23F74284E8185C176B58B482900A3E09774383C7ECACF4FE5E580DF99DB102AD4018DB73C73A635D3FCDC833B000C948D846AACC92ED54FFB3ACAE1BFE205D6B2312658F15DECFA085D13BC3757C754C5704D8089563E0CCF52B04A49DF293CAFBBC2FED5D9551B5A3897EC7BEAA56A4034BEDCEB4840A9BDFBB8BF47D66DD3A4E3EB1666372C6B2C39A48D52761BD36403CB130A087685E2EABB8711C11005EA09F90AC49665415C56CAB6FD2719C45B6800DF914F8FF327EED29D9B9A5BBD6B80B8BB31AD1522803B2C8D89166D5C6B2ED47BC5BBBC4ABE6709D46B856AB81DDF15F098A9AB76A8257E7E5C2E7DAE53FBD691736F0D6BAFE0BB939172614E99C7D7E37754AF6C3C637D076A43DBD70E5EAE910C8170CECFF1621E382D2977635B67F4FAC555419F8A0BB76CCAEAEF4C7385D293C9595AE10E5201C4A31B4C3ECB9F3B304EFB1886F9C58A4EF04E73341B95D9BDB85D706B2A8D3FDD153743A8BB7B3289D0FE79F6A3B9E0FE160DD6700FD64FC87D9AC96858A6D395FEF6F3D2193EBAE7C3A92E18746A7F12B244FBC5B1DF0086CC7045036519D9D7BF8E92B850EA0D3D1E775DEA362362462DEA2D3501D39203E2879070D1F7AC92FA1576F6D12886D5B979E3C788C09A769EF4EE45E14CD8E7553EBEEFCD31FF3D43D4988DB08F6630BA8AE8C7250AC42A3D78EDB967D59310A4A224567D8797C42370CBD2302A3F49ABEAF85FAD9455F98B61EF2B5E34A5C552583872145E191BBFFCAA526F5E38E497A1A1E1220A0F283A935ECD366A9069D5A2A80BABA3A22FA85A2557DB72D7E29EB4E33E8ED8BB4EC2EC7C2E9CEDEF46EA955834ACF8C9AB23B78052446FD73C9D61683D7FA0088DB97D07CC350AF0B6B2AD7E66A493AF814C11F8C0F2FDF0DF40AAFD0D218C00319C367E98D7F10C74EA06D31276F3F216E1CB2F12033915008CC83B00AC60FC9C2FB7F97D6E8CD79650D0F9D82BFD9CAFEF668021D3D165F3FE84221998BC8C29AEA0B5B7E0F1F25A0D7447E806CC3FC39E6038BE3DF9AC01F46222D3A609F8A026744AB4F58A734E3782BEC301EA91F2D8E2242D04A11E82474002143223F29656B1A7675AA5AD181004C4F1381DF6A0F95A0186E82C04B4DE881209E9CCCA3EE5B1DEF0B02353738D92A07314403A1A2721C256121FBA8B8CE9B460 -pk = 5F54361DB8F3CC9EA17B8F4C0EE209A364EA149D84E9FEACA918D4A4B9BDB02DFC8B0F81819AD6391C03C8D3D6DCEDC2EF9565BC92420B632FEC93937D61BE07 -sk = 5F54361DB8F3CC9EA17B8F4C0EE209A364EA149D84E9FEACA918D4A4B9BDB02DFC8B0F81819AD6391C03C8D3D6DCEDC2EF9565BC92420B632FEC93937D61BE0702000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001DEF273E62D94E770F727726781CB931709F4FCE1068CD6711BA090F4F9AFCC3E083AAAF29CCBD1DAC0C669AA490200000000000000BE0825C0876705DD2227229EF1B7DD66F6F2401B8DC82B1C785A66C5C0FDD2199177F001607C348916DE4EBC625AFBFFFFFFFFFFFFFF56B788480CEF5F061BCCFF4182D05519D1F05AD2A268FE532DA61633B56BF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91B3F132AD4C34CD7E09FD3F521BED6B4F83324AF43E2D285CCEA2A1B73B05000000000000000000000000000000000000000000000098513ACBEF217A30DF0AD76B0506A85C384C473006805EAC211C0C96889EAC30BF13174640FCFBBCFD004216503A29E3BD1C26EE26082AE95804AD47D172992E257CB17D5AF43E187CCB856CFA016A4F98F6D24FC4489012354B6F1E8894AF01CCE0DD91E21E75E7682C273FAD048CC6A90856617097B1CC80EFFFD4B969DE19A7C93C3E64E6AB2184B05656B4F94EB5D12DD877C6341C9AEC3121FE3B261208484CF4F4A55813F4E14C9488D85BE1D442B193DEF0E99D821A114AB4099C9C05D1791E85A3C0FDA832C7117A9298A80307383E30E999343BE12CC087277E242C103FC2086A8306D99B654340B5A0A200EB0245EA08176799EFEC8A1E0BAC041FA6608D037F033561120CD9001D5943C248BC5B2C0D34B7F2438C05BEC58FDD21AE91B9868E781313B74422B1450F3C4062DFC8C9EDE45540C2B3F8CF567C3C22F157F77AC7EEAA637E406DB088359E17DB6B0673A017C7197572A9917B975108D6D217B65477E03C68E679B3E4EDE0C9F0E605B513C1C75B9850683B85049303BE06543633180DA9C20910C0EF1F692F9BB461F702B76394BF139AD15B4DE62AF139C63C7B16EF29724EF45222AAADA07958CC7FB5D13323FEB449D17F12EA1F -smlen = 3444 -sm = D73884A8DEB46282FB04CEAEFD8E86555A504E014EC71D1F2E3E0DF09500E126E7EE13B8CDE4EF079AC804F4E61A557590003DB614D2DB6A16B8E50078566102F231FB79B2069FE6F5FF37890E6DE203572D48EA94D60C36260456719205258CBCE35D005D8BD1D5024ED1F040075256FFBA16B1DAB0AC02CE63FDA4B92E2DCB310200ED608399A225B6960601AB59CFEF4C7B970D755F32B50EA5584F040335D96E346F02B89BA0062AC9B69A2E2DBA0000769683FE7BFD74B3ACD21AF3898B74CA73DD126C8315538937CAC4EF0AD4588765A26DCCE1C90C559CE691E7EB3E0A497D357E1AB583C761439C0A66D1164518F01B6894067925753CC2866A91552FCD0EF029C2284C620CAF364DE6C56EB41EE0E4431D9BE22B76451D132A3F9AD91A53449BE820A7ACF56F6ADBC7107C7C729EC8A64FFF6A24B4CF83FF4E945DEF336DBFEA6067FCCBD1CD6B5698ADB1AD6DF03FD0A553457B8E9FEB4A1243FEEFC2DF7F66AE3ECA5BF169F7891ADAEA8D5C59012C7AA00A5A86B0A33D0006F8AD5A01C60ABBDA6D249D3FAC7EBFB85103A3A747A45D0ADB7DEF52ED3A5F1A620EE383A9C0CCE1900E413FC74A7A97646111D54783928B15BCA783D01EFC67F49CE6F781E82D25D3F30561F507E3831CB4EA5B4A08D5489830017270B63D8298BEEBF48EB56BDA5685D5E1E06404EB9A6C3790E9B29C99168B10BADF8FDB03F3C568672773EEC96428149CA272EA5A8083F8208BDCE361E7D40BC4DA75029D4A18B0B6AD615DBF849935D4755CFFD270A52FA290811CD55BDCA38ED89F0066ADB9BA7F58366379FFE1CAF3A9127E147C3AF3DC27279391E0C09537E81E20E7B9FE4FE3DA970FE50BFC96555233CC9E61D3C356AAA8EED5A8AEA2327D7036EE03E7EE40AA35E9DA4544B121514C261EC1CB0B2D75B1D5CE129E47F89825F69BA8254163179FC1331A917AE9C5A18556A10C5F983871B1258CB6FC8AD207F97A220C5598860B6C56F1EFF09DE6000241E901A89E107FEEC15833D34D6EB12DB6B188FAA0B858A5B9E32F84F783B43B6F8A3B2E4B044CFF8902E1EB0C527BB4E29C92ACC9DC7E0D9AC6B3A021415768B21DD9695983EE89C871C0EADE0BCE4FB72E682DFB5A2BB7498BF4D2C01240F67D1B62BAA4E587069C16E3032114B14A1C4288FEBAEBB4C75C3C05924A358C4BB7DF95ECF81D67147FAE3F605EDE61B7BA164EBA1AB36ECE97DB0ECB32A673E899B24557D8987AF3ADC57A9DA609914C9B2D6D8AC58E5954E0DB5AA9E75B444700B8F704E15A6A7BBA81809FA8801C6CEB5747A44CEB8F99CFE6D8A2A03C03451E5F3D392725207F3DD28B2C00004425B7AE05FA3769183AB60857B27AB08BCC4321D293C93D1D850D4E7A81B14564D7B15AC0E3BC1BFE0561622C6AA06923EEFE163629EDE8BA1732DBFCAD52D3BAA6E11E569EA790B36A8472B2CA37BD5C0EDD37D8F164B874952D00D592FB705C6B3110A12B03829C157191D33C579593E7828CDA5C24A284BA2F5A42F0BFA601A8F6D3DB1CA6D703ECBD261629C9F96EBC0458737B9951219E5B1F86192E2A85B47D80610A0ACC8B1A70DB2916F89CDB2C7F8943471DDBABD2A3536C5DC8A73CDEDDEAAEDC86FA148D2EE479F8465558852FCBEA0DD8017F1B976281A5014319C2C3CACCBF571D9550215B24134F6DAEF32716802E7945CB3F97AFC1AB1DA17D0C41B545A750EF345A6F88AD5FF52D512AFA6558335B5EB8979D8E6DC1DA562BB997E7D152D9FA3EAA09119C3474E11218230D8A56C19AD87FDE483FBD6DDDE9ACBA813BEBC8505A323C601E5B5251650DAE9334562E3DCC38A28BD7DED6942D0CC2014235C1B66CF4A57BA3010B83CC7050309F57A27207512D195D070DB3D10FFCBACDB47E4231142BAE588F92C5B0A71ABD67CA9390C2E05FD2CF7A1FABB14C5A7AE3773C66DB1F055214479E388B5E6ABF0DF8FD1B0E4F90828ACC397643CBC274143FB4331262A20634877BE4C7489C1AE9EAF90BB2A177A6B5AC15CBDA27DA0616E5F87461554F5686A7BD6D047AD0B98C8CDEA3DB78DD2970C78FB861F2A92DDC277876791C4A30F525659557831F4377065D19ACB384CC68340152A6DE6D84CDB58F433923D1FB8CC6B10BACD95B9AB1B45563998620D192032269FA8301C09A29C4B5B20CA0A3D63A4F5984B7DB0F5B17417DC7B939B9B177BF423E2F3D57DFF296E6E4FF0FB1744B13731206EAD54EF0AA1DA09BEA8B0AC0EF71B73D009D30531DE9FDE90D86BF5F20D8E5A9E324E657A98F8C0031ADAC4385157BA4E28B48AED957A5B36C3B49057F8ECA7F56808F794014DAD170601070607010E004F42D01CC63B2A1761126BA045F1165E25FDD05901FAC6B76E777FAAAEE6F5ED94302E2DA28046B4BC60228E1B9E194F364E377F84681B3011583554B76FBF8D7456DBDEA665ADAD6AA0556C8CC714F217A518A98615C4C1CFC8ADBBD4D12C5BC23AD7A0F849E32FE2005334B55D7BCB43D1C95D4793E7C3882740CDE8DD24B367294496A3E2F3251A66CDAECE9E0A73D853F8D4E3A4637836DED68CB28BA4FCAB02D61FB5CFA581792E636217F3238D78912EA0863816FFB2F388823174B19433C2B14BAB69E12C3B791FE683744D4519455A52555AF0D7E12749F6094AFDBA00FC6A609C7578C531FC4C3C3065EBF78414F112014726EC2230F9BCD9C15E36283144CCBE0D1785B65CF49BA8FEFE92EB6907C0330BC98AC172EA9E8DD4DF8974DD6B6772BBC6CA8E8562C5EC0B6592DE7440AC915C35E0AC8087F22EBA110CA3037B469B1D5BC92636D81881E38D8BBED01A29B3EBCF0C19EB95BF999EB848022592AEAAB649CE19824ED9D3A32D75FBA556EE07606A306D1FCEC2E24B38274C361B7BC96CE37B7F4FE434EBA17AC2A097051A92E4EC32E4C678F7762E8B96EBFD2600C0F224B04B2CD7E9F4AD327D53603828015E9CF45969800F02FA5E0BA26B8C844BA1FDFFDE44303AD0389C1B31D582877CA6BFAD4973BA35FBB90ECDD95F430078BC39AA89434130A5FB8321E51F9624090D0277A9F112EE8FF65D3DBA999C7C08727D0F08DCF00CE22F62C955D6A822F247C8065AB94AC442E1CB5F31254816794CC2556891A523B8AEF09D3B9E07AA8B67B3B87567ADEBDBDFB93BA9A082F72052572C97E73AF16CFC42D2A51A3683F84748A338AAB56264753BA4083D356A27C71F47221ED8340C50AFD46CD207C4F9634AB5A44888A4234770C46232C35EFF83FA950B0A6879137DCE209D5A1F26809B411F046F51FF084F15BFE03292EE845D3044235ADBC299925235462E67F803DAA1426F0E116B93F4532DD2784F7F87AE360281CE21F70D230C242E1A98DE8FE1D6147AD71EDEC89E24A5980C45FD91E23516758AF71DF8E0DD96929D4DA61A3BAEABB96C9378986DEB4C9101175E3AF1E102B52A8DA27D916EE4A28263CA485CFE87EE5436249C1A2F933669F6E3274E9BD93092F4A798AE85D6592EBB54DC65C28BA08582E275972B0A12C22A7792CCFD4A398E504C6FB2CF5EF1F9C268540B4FD7D07D59C49A559D86A56A009C4C18A3FCECA109FC7A45C6E842ABC22053E84878C4805D96AC96BA00FA40FC3B50407141105845055447CA94BD27F234183C2B8BF37F5CD249ED0705AFAEAE59C8BE8F6B38069D67FB23F74284E8185C176B58B482900A3E09774383C7ECACF4FE5E580DF99DB102AD4018DB73C73A635D3FCDC833B000C948D846AACC92ED54FFB3ACAE1BFE205D6B2312658F15DECFA085D13BC3757C754C5704D8089563E0CCF52B04A49DF293CAFBBC2FED5D9551B5A3897EC7BEAA56A4034BEDCEB4840A9BDFBB8BF47D66DD3A4E3EB1666372C6B2C39A48D52761BD36403CB130A087685E2EABB8711C11005EA09F90AC49665415C56CAB6FD2719C45B6800DF914F8FF327EED29D9B9A5BBD6B80B8BB31AD1522803B2C8D89166D5C6B2ED47BC5BBBC4ABE6709D46B856AB81DDF15F098A9AB76A8257E7E5C2E7DAE53FBD691736F0D6BAFE0BB939172614E99C7D7E37754AF6C3C637D076A43DBD70E5EAE910C8170CECFF1621E382D2977635B67F4FAC555419F8A0BB76CCAEAEF4C7385D293C9595AE10E5201C4A31B4C3ECB9F3B304EFB1886F9C58A4EF04E73341B95D9BDB85D706B2A8D3FDD153743A8BB7B3289D0FE79F6A3B9E0FE160DD6700FD64FC87D9AC96858A6D395FEF6F3D2193EBAE7C3A92E18746A7F12B244FBC5B1DF0086CC7045036519D9D7BF8E92B850EA0D3D1E775DEA362362462DEA2D3501D39203E2879070D1F7AC92FA1576F6D12886D5B979E3C788C09A769EF4EE45E14CD8E7553EBEEFCD31FF3D43D4988DB08F6630BA8AE8C7250AC42A3D78EDB967D59310A4A224567D8797C42370CBD2302A3F49ABEAF85FAD9455F98B61EF2B5E34A5C552583872145E191BBFFCAA526F5E38E497A1A1E1220A0F283A935ECD366A9069D5A2A80BABA3A22FA85A2557DB72D7E29EB4E33E8ED8BB4EC2EC7C2E9CEDEF46EA955834ACF8C9AB23B78052446FD73C9D61683D7FA0088DB97D07CC350AF0B6B2AD7E66A493AF814C11F8C0F2FDF0DF40AAFD0D218C00319C367E98D7F10C74EA06D31276F3F216E1CB2F12033915008CC83B00AC60FC9C2FB7F97D6E8CD79650D0F9D82BFD9CAFEF668021D3D165F3FE84221998BC8C29AEA0B5B7E0F1F25A0D7447E806CC3FC39E6038BE3DF9AC01F46222D3A609F8A026744AB4F58A734E3782BEC301EA91F2D8E2242D04A11E82474002143223F29656B1A7675AA5AD181004C4F1381DF6A0F95A0186E82C04B4DE881209E9CCCA3EE5B1DEF0B02353738D92A07314403A1A2721C256121FBA8B8CE9B460 - -count = 99 -seed = CB2E6226615393FC3BD4AB3A412AAA030AAD40E8648EE6B56D2C1591D8B97915D88F2D22F7221377B4B04CF2AE9ECC4E -mlen = 3300 -msg = D21A6BB3A2356805E678673C45FB055FC5266E3F692AF9935AEA307F14A5C41B979966A5DFE42EBFED1487E4822B74AB5AF28995E085EC8007ECA4977C63EE5299FEC63DCCBC42EEACAB488E574249E9D856146750AD97C8A443485EC1C5820BEB0964640010F6407140791E74684DBB91052E2D8BEF7BDCD78B2EC03C97A53295D683BDBE32A70DC19A2F75B8613AEA9616AE0E280179492820F73FB7FA4121E673FB5C328F41B67FF8FFA7AEE6564ADABA046D6E1D6AA13FB24965390F829246DFA8763851405075F76CF94C66FFC3308214DF0960C649AAEDC22926CE9357D3875F8B71D68D75999AA3663C30A9EDF07228BF7DFF49EC1E6C7A33D2053597003B82392E826EBD701B4C981AAAC9951C79E08F592C2C0637C8E5A7F9DCDA599E859C317D4888B4098992E0E2D979E41C703686D577E5BA6001EC4F587140711293D664963632F87EA0461E0E0C5E9D8D292FB409F9F9AB172EE17FC8AFABAD06E42B437CE22924EB5DBD3A80A06962F3B37946259F9C75A233CB2B4ABDC5CD1B648FAEB1BE8630DB40D151B8FBA693DF2C5BDCAA14DC4783F450B6BC407515CEEBC5C9A47BD1A141384F0B596CAB1135C075651CBA989C190F3171DC1D72330EDAA01656813C4B7811715060B023FC426745C301B2A91E0D08ED3BDED438C4CE6799C35F3981C882A0BDE4A2FEEB1A52CAFA47B0C48558FC43F98FE08F03A71128362BB6FB9DA6A22249F4D4352AE7D3DAE85DE497E2411EADCFE5BF1A3C075C45811E0097ECEA255FE15BD8321FE8B546A8CACFB899EECF5419DB363C7567C2FE7360B36DE14674F500A31D3EEC71451A7C0D5576A8939C0F6D4D9F2F03F3C516CE25CE73ABB35C73AA94F6AEFAE6AD87052D6B195FA43586817F5BB974AAE7F1B8608922411AA5B0D7D574016CBD3DED13395623470A108FA0E1D3F9FAA7E1E5031843F2A23DBCE8B196315290DEA5795E4115D53DC570A444064CFA3C9457DBF3EE323B1966ECD2270C32910F8F430522471258A1F1955A6E1DD8C84ED9A566499BF85628615351ABE84B401421DA2CFAF575E2644C9304C075ECFC374066CEC713FA4C0D89043689FBC59FF54B8F97EE0A3B0989BC5E4EF83CC9833E75BC8B67BB5EE3C06EA156611CDA95A6702416807530EA206ED89835D20805EA988B1958569CDF7F809996214DADAB4E20BD44917E3410EC6BEAC98FEA07F764E85B66AED5E17CF675D2ED8E63DB728FE75158CB31779E31379648B43D68CCFF3780854CF03535C57122019456E73CF06769BF1FBF558542241CE665BD10F921828553585E0CF664CDC6160F9C47FA5330591B74194F4716056CA83993EFEC4A52DB9A1FBD3B2F504AC19667325167407375B6D7DE739F07947B511C8D475744E5C29D6E286A37F1FF8317BD0178F0E306A38FA6E75F4A80427FEB2C91235D3E7F20D8101CFC03BB73F44EF59AF3526E9AFC580027A1DADE37654238B8EC7AF0105248FE30784A88B72E11FC1BD807E47A349BD29075BEFBB29730EF8E85E3ABD5105559BACEE74AA27D90D360A8D629DBEC95EB34C7F7CA20096FF7B521E40D3944A975436896F372EEAB6B8615EB91697965BBF955779DD3047F7E3BF029E3509A5780247445D6223D085AFB4291D976EFADC41E42DC2C0728D18F6155654A332FEC72EB6AEF8B92C1D177E3DC28C31971BCAFF76DDEBFD9588BC244B116D409E58DC5ADA1648663D603C47FAEB814AAA7EB9B6264356F926C18B9357BF426B89DDC8EB9177ECEB5C6CDC64DD8FEB7B326BC1BA89BD9035235DA0E644EF959C58DD97B88D5C749B36931AC2694C67151DB0894652E99254222D37CEFE9E27B3DD663A152DBE29A3639AFE42F4578937076180563AAD6AD739255EA012A17D2A56627D84C44FBAB261D392A966CFE19278799CF1634D42384323C496190D4B9FB662694E3887EA66AB9E8B195488C8DCA47C8BC0424247759137CFBF86DEDC3641904CB6FACBB30A9FA84ACF69A67B4AFDF4C2AA420FC0D90CEFA0DFBBCD3072D9F772FD6058E2BF0E251BE93B00DC43765B53DB51B22F12D3ED0CC5655E4AEBD9D923F99A43E4461DCF5992030E66A1CDC3A65558D9BB3A39788D92328387D144850DD3706FD7A079E3D2398F542F91A8AAABF0C5068DBAF1FCC5160398ABECF74884BEB04F3A3EA38BBB80D798F5981B3F2DB6C7B33F867B7DC06A4417E30F94CDB4F523AEEA0BE12BD75AAED57520DB0D4B4F013BE3A1DC7AE5C58FD1DE9637F7D82F697B7E92DA427A78FEEC6A5C0255EB57A43DEA6CEBC8805BC04E04FE789E222B1E2642D26EDC14FB36ECC6092B3060E45EED6C5B35DE8741F72933930ECBD7338CF39474122357365700CB50C5EB176FB92814FA7F4032570CCEE6B859236AD5DA5F1730129EDC7BE218BA9874620F6F0EBC45E0BD622F8FD1AE6974994AF95C6519EC1C46650C073D194FA6EBC62F405F63A3416782A47872C7D77D648D0A1C802FFDFDE5FDC112C94CFC68F401889EFC522FE488FDB5384C0D93147AB6587659D936F98ECFBCDCFBF8B352D605F18C855E2559743ED97991C5D50DF44A7B929303835654A3955ABC5BEE6327400A7CCCE460B318D8B5ECE5B12F606ADB3D7B5ED59563B8E675E78029AABC234442C2463256FE02B04F556DA35C4615D14A9F4EFF17DB0DB81DE4BDD894F6628A120BE2D4CF3E1F46D53817899657035A76137E23C0B0E8DDD29465D7F15628FD435E6CAACA4194FDBF85FDCC31D5DAFCB52568B7C0CFBE713BC85FA424BA3ABE149E4035FC86807A8B876D2163B447CAD5EC0E6EF38A1D591AFB46267F9DBF142CAB1CAC1F73BEBA212992FC6D4647EC17848D1ADBB1901277A5078DD72D9C9184E893C0806E9B4AFF0A824670D438620F2A7E8D2965B619D291E5824C014FC888A36FBBE17356431F0039038F9B497902AED969F9C488390B7087763638E976801127BAF1F53803C4DC9649F0EE85D67B239E2BDAFB2BD75F1D1DA22A56FB3AF10A9DDE7AD306C4AF8681029316C0E1949228E6BF5ADF942F1C0EF92B2BCBC0C70D49E5808851444240A78B14D21B54F66271482F49B85F5180B268050327368496CFA8B54ECB97EE6D28EB74A3742F68583DA046809002C22F7B31FBC0566969F9A15CDCA892C4BEB101A2AC3526C76E9D30982C9B4893450FDEC4001D2431828D24D8B1A67DF80E2E10ED2EA8D723227055C48006665F7DA8E032EFDC70BC7EEB2B369B551FAC542AD6DF1A23107E2B3C0E3CCACC25F26404C085CBF56E52D35D7948DB9FDA6DFC24709994719D8CED41A2CC9B3C4B2BEF0967CB71861CF0E6AEA9BEC9395726AA0E2F1A7247ED0F6038E3DF4BF566786073590DCF97F8F0A99658D8F630A2D130C46CF4D26C669360D0F70B75F904C9F923AB285D5DB129F6C25AD21F9E26AC844D07A8EED86C4E224EBFC5B3F720D6F94B0A01B1433C46B40CF84E80F7A6AFA7BB8F9ACF818AD3CAB2DDD6904C067BEA4F1FE79B83CB0AA8FC75B6B096BAD6FE94ABFD48F8EFC0F2B9A02EBDA8FDBDBE1C77F1854EDBA18AAE7F31CED9CD34C1B355108DF18A8953932F7554AF05B203A96A9BB93E0EFF51D7F93B56E351562CF85A2D35EAE2C2427B89A8662A1C723D4F14E6EAFDBD636C2BB7ADE29C1A6BC8A463734C808BEC68B1E9A31AF6E29B412F1CB8C90A9911AC5C3EA71E46113D2D7B1AE2D8802B06A770FD0E9E4652895E42181AD09BB541E9493F258711BB7BEDD3E7CA8B8CE875669CF80A6880ECA3F13800DE7011EA67F443E505C4FB455608AE586F922B3C83FD33B306BDEDB86223C33E3AA65EDC93CBCF3A03ADAF9F328997951D59A9200C0BA2618E3596AF176B43122CEDC52B1E006EA6D12DC236A6FCD7CC46825F2EF7ED71683A731D746FFF2FE54E0B392A8CBFA38873196BB2B835DCA7CB7C3ED9A004C7A329B9734A111744BDACDB669E69E9DF1E52F07C513E3752A0CCD81D7DDC4A64868B7BB2BBBD2095373480522BE10615248A179DCB61DAC90F7FA5FA9B84F190A9C62B5FF9CD473A940F03E7107157D7EB60AF1E3E384FFE8A67DCB2389B3B0FAB7C789CF100CA95CD6A85442CB9A2C243FB9D454B20BAE5762D72B8FE79B4DF81163D61DE4578CF976992D8B9989FC68089F811F53DB1E1092B60220552876B818BEA981571898CD6AB7B5F13C46B0A076526E3241D65014F855EFD7BDE08AD91F259DCB64E94EC3DAD97811EB024EE1D341521DC92AE5E93C73422088976F2D27D64E1D193B955E6736AD2BCCF3C1A53D590576434ACBC0B687F27F255FEF354E68ACA47160EFA7126F908E08E4548C11546D9C412D685FA84D2EB4DCB2BDFC48E2FA8023548198EBB072A48044F4391143E3BEF4FF9066A4B0D03ADC826819D67588BA84F99DA27424103652ACC039DDD3B567851CD78E4117A8B93AFE01FC8EEBDAA1ACB8BA9D095789E76B9D5AB9EE177A15D666EF171FE1D4BDCCFE2E58CE669B561F63028C6CE26DB5C8182FE048680B175C7AB407215FF3A7801C950D509867AB1B0BEF89B3E38A387915225EDE76F91AAD15A85D8C46EFD588BB3BAACBC52C036211512473420F3F061F5F53E9353DE0780425745A76439B3811511C86CA503251F24113384E1A24A9367536E796CE08B896F572489A2339E82A856C -pk = 485E9B357C331DC26E628DC67FA265D52732434597DC5F88A975485224EA3D34AEBE3B9C941AA468CA22B6DA957B8931F6B0025AF827019EDD1EA9147F14CC1A -sk = 485E9B357C331DC26E628DC67FA265D52732434597DC5F88A975485224EA3D34AEBE3B9C941AA468CA22B6DA957B8931F6B0025AF827019EDD1EA9147F14CC1A0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004DB7C119AAFB5A8BCF7930FAC70E82CA9C9D45638C4797BD77A7FA9F0D37077C1CBC70DBC1EEE3447DB802A6D1840000000000000000227767F57B7615DBFED6C4860896AB2B6EB3BFC0E43CB36E2601EF1F2037DA9D094CF1B34779A25560A7DFFB6345FDFFFFFFFFFFFFFFD656364AACCD496835992541CD5AB60F1AC8A08D1B5F8E78DFC06BBA4656030000000000000000000000000000000000000000000000DDD28198856C57B51DBF66369B7E3AEEF4B5CBB04FC0D7130AAEC2A68A190B00000000000000000000000000000000000000000000001587A540D84674CC0F57AE57936778D0C1BEAD85FEEB624C78EDE74A66222F1A674E5D5BF18F0E3F3BFDC9DED076F3B4690428401FF6A1C1B4E57FAE76AA5325ADA89D301C59F736F820EB109F924FC9F92A1F4709CA0C1A7C19A9C699A68C16E7F0CAA2333E8CCB27E11BE040DA07244397CD5C6CEC918BEFCB418ADB40741A9FFFC341AA81BEC8B23AD8D3771DC81A20FE95C62DD9B1A44977ED0AF0F32D2A5CC9AEAB1B3425CBDA0A3C1C49E1192B1A87CC756A33EBCCF25C862B3A0AF632765A42D56B72CAFE1006A5A3E6CF7A8D747B86814B5FFB4EF5A4A52F93E3AC0DF22F7CBD1C85EA75E164EBBD088B9419496072F6554905A5A2791432D0EB5525AF8AF1BBD5AB78E941B9F6C6C3BEDF82E2B76C1B3666AC14928E48DF25588B1E142A2E148C04929C10028F43778AE11EBB652B8A913DF5A377D386A7F2A6AA312B22703610A9569A3AD49A56271DDB7BC278292B82B6EC3D9DE3E891C739702B5DBE96A34641F8BD98BE8B2354B52B435267D4512AA342772640DFB5204A10248855740F35CD4D7535E40E0B610C105D39B8D9907C0534412382A98AA22FA318670446C5CB2BAAF6CC55F467B529B04AF2B834C390C65146BDA205AEC4382200 -smlen = 3477 -sm = F2514F68B591C38E54054DA19687915DCAA97D032ECEC0DE2155C16C7A02A931981481FCCA8C150253AFF1C179D6446A740107B321352DA0CAB1B6068CCB630C85C797A8E505D074E4F7C38D9CCAF60354667F49B935CC2B48066AEA928C41CA559677072101A8C43F44B899D4019CA3BA3EA74ED0701A0199D6967579FEBF3D0A044D946E717C1251652A050027327ABA02D5B7890E24CC57A0515158020026F9E7B0968F5033D9052A20CB8DECD4E500D21A6BB3A2356805E678673C45FB055FC5266E3F692AF9935AEA307F14A5C41B979966A5DFE42EBFED1487E4822B74AB5AF28995E085EC8007ECA4977C63EE5299FEC63DCCBC42EEACAB488E574249E9D856146750AD97C8A443485EC1C5820BEB0964640010F6407140791E74684DBB91052E2D8BEF7BDCD78B2EC03C97A53295D683BDBE32A70DC19A2F75B8613AEA9616AE0E280179492820F73FB7FA4121E673FB5C328F41B67FF8FFA7AEE6564ADABA046D6E1D6AA13FB24965390F829246DFA8763851405075F76CF94C66FFC3308214DF0960C649AAEDC22926CE9357D3875F8B71D68D75999AA3663C30A9EDF07228BF7DFF49EC1E6C7A33D2053597003B82392E826EBD701B4C981AAAC9951C79E08F592C2C0637C8E5A7F9DCDA599E859C317D4888B4098992E0E2D979E41C703686D577E5BA6001EC4F587140711293D664963632F87EA0461E0E0C5E9D8D292FB409F9F9AB172EE17FC8AFABAD06E42B437CE22924EB5DBD3A80A06962F3B37946259F9C75A233CB2B4ABDC5CD1B648FAEB1BE8630DB40D151B8FBA693DF2C5BDCAA14DC4783F450B6BC407515CEEBC5C9A47BD1A141384F0B596CAB1135C075651CBA989C190F3171DC1D72330EDAA01656813C4B7811715060B023FC426745C301B2A91E0D08ED3BDED438C4CE6799C35F3981C882A0BDE4A2FEEB1A52CAFA47B0C48558FC43F98FE08F03A71128362BB6FB9DA6A22249F4D4352AE7D3DAE85DE497E2411EADCFE5BF1A3C075C45811E0097ECEA255FE15BD8321FE8B546A8CACFB899EECF5419DB363C7567C2FE7360B36DE14674F500A31D3EEC71451A7C0D5576A8939C0F6D4D9F2F03F3C516CE25CE73ABB35C73AA94F6AEFAE6AD87052D6B195FA43586817F5BB974AAE7F1B8608922411AA5B0D7D574016CBD3DED13395623470A108FA0E1D3F9FAA7E1E5031843F2A23DBCE8B196315290DEA5795E4115D53DC570A444064CFA3C9457DBF3EE323B1966ECD2270C32910F8F430522471258A1F1955A6E1DD8C84ED9A566499BF85628615351ABE84B401421DA2CFAF575E2644C9304C075ECFC374066CEC713FA4C0D89043689FBC59FF54B8F97EE0A3B0989BC5E4EF83CC9833E75BC8B67BB5EE3C06EA156611CDA95A6702416807530EA206ED89835D20805EA988B1958569CDF7F809996214DADAB4E20BD44917E3410EC6BEAC98FEA07F764E85B66AED5E17CF675D2ED8E63DB728FE75158CB31779E31379648B43D68CCFF3780854CF03535C57122019456E73CF06769BF1FBF558542241CE665BD10F921828553585E0CF664CDC6160F9C47FA5330591B74194F4716056CA83993EFEC4A52DB9A1FBD3B2F504AC19667325167407375B6D7DE739F07947B511C8D475744E5C29D6E286A37F1FF8317BD0178F0E306A38FA6E75F4A80427FEB2C91235D3E7F20D8101CFC03BB73F44EF59AF3526E9AFC580027A1DADE37654238B8EC7AF0105248FE30784A88B72E11FC1BD807E47A349BD29075BEFBB29730EF8E85E3ABD5105559BACEE74AA27D90D360A8D629DBEC95EB34C7F7CA20096FF7B521E40D3944A975436896F372EEAB6B8615EB91697965BBF955779DD3047F7E3BF029E3509A5780247445D6223D085AFB4291D976EFADC41E42DC2C0728D18F6155654A332FEC72EB6AEF8B92C1D177E3DC28C31971BCAFF76DDEBFD9588BC244B116D409E58DC5ADA1648663D603C47FAEB814AAA7EB9B6264356F926C18B9357BF426B89DDC8EB9177ECEB5C6CDC64DD8FEB7B326BC1BA89BD9035235DA0E644EF959C58DD97B88D5C749B36931AC2694C67151DB0894652E99254222D37CEFE9E27B3DD663A152DBE29A3639AFE42F4578937076180563AAD6AD739255EA012A17D2A56627D84C44FBAB261D392A966CFE19278799CF1634D42384323C496190D4B9FB662694E3887EA66AB9E8B195488C8DCA47C8BC0424247759137CFBF86DEDC3641904CB6FACBB30A9FA84ACF69A67B4AFDF4C2AA420FC0D90CEFA0DFBBCD3072D9F772FD6058E2BF0E251BE93B00DC43765B53DB51B22F12D3ED0CC5655E4AEBD9D923F99A43E4461DCF5992030E66A1CDC3A65558D9BB3A39788D92328387D144850DD3706FD7A079E3D2398F542F91A8AAABF0C5068DBAF1FCC5160398ABECF74884BEB04F3A3EA38BBB80D798F5981B3F2DB6C7B33F867B7DC06A4417E30F94CDB4F523AEEA0BE12BD75AAED57520DB0D4B4F013BE3A1DC7AE5C58FD1DE9637F7D82F697B7E92DA427A78FEEC6A5C0255EB57A43DEA6CEBC8805BC04E04FE789E222B1E2642D26EDC14FB36ECC6092B3060E45EED6C5B35DE8741F72933930ECBD7338CF39474122357365700CB50C5EB176FB92814FA7F4032570CCEE6B859236AD5DA5F1730129EDC7BE218BA9874620F6F0EBC45E0BD622F8FD1AE6974994AF95C6519EC1C46650C073D194FA6EBC62F405F63A3416782A47872C7D77D648D0A1C802FFDFDE5FDC112C94CFC68F401889EFC522FE488FDB5384C0D93147AB6587659D936F98ECFBCDCFBF8B352D605F18C855E2559743ED97991C5D50DF44A7B929303835654A3955ABC5BEE6327400A7CCCE460B318D8B5ECE5B12F606ADB3D7B5ED59563B8E675E78029AABC234442C2463256FE02B04F556DA35C4615D14A9F4EFF17DB0DB81DE4BDD894F6628A120BE2D4CF3E1F46D53817899657035A76137E23C0B0E8DDD29465D7F15628FD435E6CAACA4194FDBF85FDCC31D5DAFCB52568B7C0CFBE713BC85FA424BA3ABE149E4035FC86807A8B876D2163B447CAD5EC0E6EF38A1D591AFB46267F9DBF142CAB1CAC1F73BEBA212992FC6D4647EC17848D1ADBB1901277A5078DD72D9C9184E893C0806E9B4AFF0A824670D438620F2A7E8D2965B619D291E5824C014FC888A36FBBE17356431F0039038F9B497902AED969F9C488390B7087763638E976801127BAF1F53803C4DC9649F0EE85D67B239E2BDAFB2BD75F1D1DA22A56FB3AF10A9DDE7AD306C4AF8681029316C0E1949228E6BF5ADF942F1C0EF92B2BCBC0C70D49E5808851444240A78B14D21B54F66271482F49B85F5180B268050327368496CFA8B54ECB97EE6D28EB74A3742F68583DA046809002C22F7B31FBC0566969F9A15CDCA892C4BEB101A2AC3526C76E9D30982C9B4893450FDEC4001D2431828D24D8B1A67DF80E2E10ED2EA8D723227055C48006665F7DA8E032EFDC70BC7EEB2B369B551FAC542AD6DF1A23107E2B3C0E3CCACC25F26404C085CBF56E52D35D7948DB9FDA6DFC24709994719D8CED41A2CC9B3C4B2BEF0967CB71861CF0E6AEA9BEC9395726AA0E2F1A7247ED0F6038E3DF4BF566786073590DCF97F8F0A99658D8F630A2D130C46CF4D26C669360D0F70B75F904C9F923AB285D5DB129F6C25AD21F9E26AC844D07A8EED86C4E224EBFC5B3F720D6F94B0A01B1433C46B40CF84E80F7A6AFA7BB8F9ACF818AD3CAB2DDD6904C067BEA4F1FE79B83CB0AA8FC75B6B096BAD6FE94ABFD48F8EFC0F2B9A02EBDA8FDBDBE1C77F1854EDBA18AAE7F31CED9CD34C1B355108DF18A8953932F7554AF05B203A96A9BB93E0EFF51D7F93B56E351562CF85A2D35EAE2C2427B89A8662A1C723D4F14E6EAFDBD636C2BB7ADE29C1A6BC8A463734C808BEC68B1E9A31AF6E29B412F1CB8C90A9911AC5C3EA71E46113D2D7B1AE2D8802B06A770FD0E9E4652895E42181AD09BB541E9493F258711BB7BEDD3E7CA8B8CE875669CF80A6880ECA3F13800DE7011EA67F443E505C4FB455608AE586F922B3C83FD33B306BDEDB86223C33E3AA65EDC93CBCF3A03ADAF9F328997951D59A9200C0BA2618E3596AF176B43122CEDC52B1E006EA6D12DC236A6FCD7CC46825F2EF7ED71683A731D746FFF2FE54E0B392A8CBFA38873196BB2B835DCA7CB7C3ED9A004C7A329B9734A111744BDACDB669E69E9DF1E52F07C513E3752A0CCD81D7DDC4A64868B7BB2BBBD2095373480522BE10615248A179DCB61DAC90F7FA5FA9B84F190A9C62B5FF9CD473A940F03E7107157D7EB60AF1E3E384FFE8A67DCB2389B3B0FAB7C789CF100CA95CD6A85442CB9A2C243FB9D454B20BAE5762D72B8FE79B4DF81163D61DE4578CF976992D8B9989FC68089F811F53DB1E1092B60220552876B818BEA981571898CD6AB7B5F13C46B0A076526E3241D65014F855EFD7BDE08AD91F259DCB64E94EC3DAD97811EB024EE1D341521DC92AE5E93C73422088976F2D27D64E1D193B955E6736AD2BCCF3C1A53D590576434ACBC0B687F27F255FEF354E68ACA47160EFA7126F908E08E4548C11546D9C412D685FA84D2EB4DCB2BDFC48E2FA8023548198EBB072A48044F4391143E3BEF4FF9066A4B0D03ADC826819D67588BA84F99DA27424103652ACC039DDD3B567851CD78E4117A8B93AFE01FC8EEBDAA1ACB8BA9D095789E76B9D5AB9EE177A15D666EF171FE1D4BDCCFE2E58CE669B561F63028C6CE26DB5C8182FE048680B175C7AB407215FF3A7801C950D509867AB1B0BEF89B3E38A387915225EDE76F91AAD15A85D8C46EFD588BB3BAACBC52C036211512473420F3F061F5F53E9353DE0780425745A76439B3811511C86CA503251F24113384E1A24A9367536E796CE08B896F572489A2339E82A856C - diff --git a/NOTICE b/NOTICE index 355ca6d..6eccf39 100644 --- a/NOTICE +++ b/NOTICE @@ -1,4 +1,4 @@ -Copyright 2023 the SQIsign team. All rights reserved. +Copyright 2023-2025 the SQIsign team. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -11,3 +11,11 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + +The DPE Library is (C) 2004-2024 Patrick Pelissier, Paul Zimmermann, +LORIA/INRIA, and licensed under the GNU Lesser General Public License, +version 3. You may obtain a copy of the License at + + https://www.gnu.org/licenses/lgpl-3.0.en.html + +or in the file COPYING.LGPL. diff --git a/README.md b/README.md index d37cb51..b6ae56b 100644 --- a/README.md +++ b/README.md @@ -1,57 +1,70 @@ # SQIsign -This library is a C implementation of SQIsign, short for Short Quaternion and Isogeny Signature (from isogeny graphs of supersingular elliptic curves). +This library is a C implementation of SQIsign. ## Requirements -- CMake (version 3.5 or later) -- C99-compatible compiler -- Valgrind (for dynamic testing) -- Clang static analyzer (version 10 or later, for static analysis) -- GMP (version 6.1.2 or later) +- CMake (version 3.13 or later) +- C11-compatible compiler +- GMP (version 6.0.0 or later) + +### Pre-computation + +The constant values in the `src/precomp` directory were generated using the +pre-computation scripts in the `scripts/precomp` directory. It is not necessary +to execute these scripts to compile the project. The scripts have the following +requirements: +- [two-isogenies](https://github.com/ThetaIsogenies/two-isogenies) + (`Theta-SageMath` version). +- [deuring-2D](https://github.com/Jonathke/deuring-2D) ## Build -- `mkdir -p build` -- `cd build` -- `cmake -DSQISIGN_BUILD_TYPE= ..` -- `make` +For a generic build +``` +$ mkdir -p build +$ cd build +$ cmake -DSQISIGN_BUILD_TYPE=ref .. +$ make +$ make test +``` + +An optimized executable with debug code and assertions disabled can be built +replacing the `cmake` command above by +``` +cmake -DSQISIGN_BUILD_TYPE= -DCMAKE_BUILD_TYPE=Release .. +``` ## Build options CMake build options can be specified with `-D=`. -### ENABLE_TESTS +### SQISIGN_BUILD_TYPE -Builds a test harness for the library, the default value is `ON`. +Specifies the build type for which SQIsign is built. The currently supported values are: +- `ref`: builds the plain reference implementation. +- `opt`: builds the optimized implementation which is the same as the reference + implementation. +- `broadwell`: builds an additional optimized implementation targeting the Intel + Broadwell architecture (and later). The optimizations are applied to the + finite field arithmetic. -### ENABLE_CT_TESTING +### GMP_LIBRARY -Builds the library with instrumentation for constant-time behavior testing, the default value is `OFF`. Valgrind development files are used for this build option. +If set to `SYSTEM` (by default), the gmp library on the system is dynamically linked. -### ENABLE_GMP_BUILD - -If set to `OFF` (by default), the gmp library on the system is dynamically linked. -If set to `ON`, a custom gmp library is linked, which is built as part of the overall build process. - -In the latter case, the following further options are available: +If set to `BUILD`, a custom gmp library is linked, which is built as part of the overall build process. +In this case, the following further options are available: - `ENABLE_GMP_STATIC`: Does static linking against gmp. The default is `OFF`. - `GMP_BUILD_CONFIG_ARGS`: Provides additional config arguments for the gmp build (for example `--disable-assembly`). By default, no config arguments are provided. -### ENABLE_DOC_TARGET -If set to `ON`, a doc target is available that builds API documentation. Note that a doxygen installation is required if set to `ON`. +If set to `MINI`, the mini-gmp library is used, whose sources are included in the repository, in the folder `src/mini-gmp`. In this case, no copies of the full gmp library (system or custom-built) are required. -The default is `OFF`. +### ENABLE_SIGN -### SQISIGN_BUILD_TYPE - -Specifies the build type for which SQIsign is built. The currently supported flags are: -- `ref`, which builds the plain C reference implementation. -- `broadwell`, which builds an additional implementation with GF assembly optimized code for the Intel Broadwell architecture. - -### SQISIGN_TEST_REPS - -Specifies and overrides the number of (self-)test repetitions to be run. +If set to `ON` (default), SQIsign is built with signature and verification functionality. +If set to `OFF`, SQIsign is built with verification functionality only. +In the latter case, GMP is no longer a dependency. ### CMAKE_BUILD_TYPE @@ -66,183 +79,138 @@ Can be used to specify special build types. The options are: The default build type uses the flags `-O3 -Wstrict-prototypes -Wno-error=strict-prototypes -fvisibility=hidden -Wno-error=implicit-function-declaration -Wno-error=attributes`. (Notice that assertions remain enabled in this configuration, which harms performance.) - -## Build artifacts - -The following libraries are built: - -- `libsqisign_common_sys.a`: library with common crypto - AES, Keccak and system random number generator. -- `libsqisign_common_test.a`: library with common crypto for deterministic tests - AES, Keccak and CTR-DRBG PRNG. -- `libsqisign_.a`: library for `SQIsign_`. -- `libsqisign__test`: library for `SQIsign_`, only for test, using the deterministic CTR-DRBG as backend. -- `libsqisign__nistapi.a`: library for `SQIsign_` against the NIST API. -- `libsqisign__nistapi_test.a`: library for `SQIsign_` against the NIST API. Only for test, using the deterministic CTR-DRBG as backend. -- `libsqisign_gf_.a`: gf sub-library, generic or for `` -- `libsqisign_ec_.a`: ec sub-library, generic or for `` -- `libsqisign_klpt_.a`: klpt sub-library, generic or for `` -- `libsqisign_intbig_generic.a`: intbig sub-library, generic -- `libsqisign_quaternion_generic.a`: quaternion sub-library, generic -- `libsqisign_id2iso_.a`: id2iso sub-library, generic or for `` - -The following test apps are built: -- `sqisign_bench_`: Benchmarking suites. -- `sqisign_test_kat_`: KAT test suites. -- `sqisign_test_scheme_`: Self-test suites. -- `sqisign_test_prof_`: Profiling suites. - -More apps are built in folder `build/apps`: - -- `PQCgenKAT_sign_`: App for generating NIST KAT. -- `example_nistapi_`: Example app using the NIST API. - ## Test -In the build directory, run: `make test` or `ctest`. +In the build directory, run `make test` or `ctest`. The test harness consists of the following units: -- KAT test: tests against the KAT files in the `KAT` folder - `SQIsign__KAT` -- Self-tests: runs random self-tests (key-generation, signing and verifying) - `SQIsign__SELFTEST` +- KAT test: `SQIsign__KAT`- tests against the KAT files in the `KAT` + directory. +- Self-tests: `SQIsign__SELFTEST` - runs random self-tests + (key generation, signature and verification). - Sub-library specific unit-tests. -Note that, ctest has a default timeout of 1500s, which is applied to all tests except the KAT tests. To override the default timeout, run `ctest --timeout `. +Note that, `ctest` has a default timeout of 1500s, which is applied to all tests +except the KAT tests. To override the default timeout, run +`ctest --timeout `. ## Known Answer Tests (KAT) -KAT are available in folder `KAT`. They can be generated by running the apps built in the `apps` folder: - -- `apps/PQCgenKAT_sign_` +KAT are available in the `KAT` directory. They can be generated by running the +apps built in the `apps` directory: +``` +apps/PQCgenKAT_sign_ +``` A successful execution will generate the `.req` and `.rsp` files. -A full KAT test is done as part of the test harness (see previous section). +A full KAT test is done as part of the test harness (see the [Test](#test) +section). ## Benchmarks -A benchmarking suite is built and runs with the following command: +A benchmarking suite is built and can be executed with the following command: +``` +apps/benchmark_ [--iterations=] +``` +where `` specifies the SQIsign parameter set and `` is the +number of iterations used for benchmarking; if the `--iterations` option is +omitted, a default of 10 iterations is used. -- `test/sqisign_bench_ `, where params specifies the SQIsign parameter set and runs the number of benchmark runs. - -The benchmarks profile the `KeyGen`, `Sign` and `Verify` functions. The results are reported in CPU cycles if available on the host platform, and timing in nanoseconds otherwise. +The benchmarks profile the key generation, signature and verification functions. The results are reported in CPU cycles if available on the host platform, and timing in nanoseconds otherwise. ## Examples -Example code that demonstrates how to use SQIsign are available in the `apps` folder: - -- `apps/example_nistapi.c`: Example with the NIST API. +Example code that demonstrates how to use SQIsign with the NIST API is available +in `apps/example_nistapi.c`. ## Project Structure -The SQIsign library consists of a number of sub-libraries used to implement the final SQIsign library. +The source code consists of a number of sub-libraries used to implement the +final SQIsign library: +- `common`: common code for hash function, seed expansion, PRNG, memory handling. +- `mp`: code for saturated-representation multiprecision arithmetic. +- `gf`: GF(p^2) and GF(p) arithmetic. +- `ec`: elliptic curves, isogenies and pairings. Everything that is purely + finite-fieldy. +- `precomp`: constants and precomputed values. +- `quaternion`: quaternion orders and ideals. +- `hd`: code to compute (2,2)-isogenies in the theta model. +- `id2iso`: code for Ideal <-> Iso. +- `verification`: code for the verification protocol. +- `signature`: code for the key generation and signature protocols. The dependencies are depicted below. ``` - ┌─┬──────┬─┐ ┌─┬────┬─┐ ┌─┬──────┬─┐ - │ ├──────┤ │ │ ├────┤ │ │ ├──────┤ │ - │ │Keygen│ │ │ │Sign│ │ │ │Verify│ │ - │ ├──────┤ │ │ ├────┤ │ │ ├──────┤ │ - └─┴───┬──┴─┘ └─┴─┬──┴─┘ └─┴───┬──┴─┘ - │ │ │ - │ │ │ - ├────────────────────┼─────────────────┐ │ - │ │ │ │ - │ │ │ │ - ┌───▼──┐ ┌──────▼────────┐ ┌────▼─────▼───────────┐ - │ PRNG ◄────┬─────┤ Iso <-> Ideal ├───► Elliptic Curves, │ - └───▲──┘ │ └──────┬────────┘ │ Pairings & Isogenies │ - │ │ │ └───▲──────┬───────────┘ - │ │ │ │ │ - ┌───┴──┐ │ │ │ │ - │ KLPT ◄────┘ │ ┌──────────┘ │ - └───┬──┘ │ │ │ - │ │ │ │ -┌─────────▼─────────┐ │ │ │ -│ Quaternion orders │ │ │ ┌────▼───┐ -│ and ideals │ │ │ │ GF(p²) │ -└─────────┬─────────┘ │ │ └────┬───┘ - │ ┌─┬──────▼─────┴──┬─┐ │ - ┌─────▼─────┐ │ ├───────────────┤ │ ┌─────▼─────┐ - │ MP BigInt │ │ │Precomputations│ │ │ FP BigInt │ - └───────────┘ │ ├───────────────┤ │ └───────────┘ - └─┴───────────────┴─┘ + ┌─┬──────────┬─┐ ┌─┬──────────┬─┐ ┌─┬──────────┬─┐ + │ ├──────────┤ │ │ ├──────────┤ │ │ ├──────────┤ │ + │ │ Keygen │ │ │ │ Sign │ │ │ │ Verify │ │ + │ ├──────────┤ │ │ ├──────────┤ │ │ ├──────────┤ │ + └─┴────┬─────┴─┘ └─┴────┬─────┴─┘ └─┴────┬─────┴─┘ + │ │ │ + └──────────────────┐ │ │ + │ │ │ +┌─────────────────┐ ┌───▼────▼────────┐ │ +│ │ │ │ │ +│ Quaternions ◄────┤ Ideal <-> Iso ├────────┐ │ +│ │ │ │ │ │ +└────────┬────────┘ └────────┬────────┘ │ │ + │ │ │ │ + │ │ ┌───────────────┘ + │ │ │ │ +┌────────▼────────┐ ┌────────▼─────▼──┐ ┌───▼────────────┐ +│ │ │ │ │ │ +│ Multiprecision │ │ 2D ├────► Precomputation │ +│ integers (GMP) │ │ Isogenies │ │ │ +│ │ │ │ │ │ +└─────────────────┘ └────────┬────────┘ └───▲────────────┘ + │ │ + │ │ + │ │ + ┌────────▼────────┐ │ + │ │ │ + │ Elliptic curves ├────────┘ + │ & isogenies │ + │ │ + └──┬───────────┬──┘ + │ │ + │ │ + │ │ + ┌───────────▼───┐ ┌───▼───────────┐ + │ GF(p) │ │ Fixed │ + │ & │ │ precision │ + │ GF(p^2) │ │ integers │ + └───────────────┘ └───────────────┘ ``` -There are the following sub-libraries: +## Cortex-M4 implementation -- `common`: common code for AES, SHAKE, (P)RNG, memory handling -- `ec`: elliptic curves, isogenies and pairings -- `gf`: GF(p^2) and GF(p) arithmetic, including FP BigInt -- `id2iso`: code for Iso <-> Ideal -- `klpt`: implementation of KLPT -- `quaternion`: quaternion orders and ideals -- `intbig`: multi-precision big integers -- `precomp`: precomputed constants -- `protocols`: protocol implementation +Verification routines are supported in 32-bit embedded architectures running on bare metal environments such as the ARM Cortex-M4, but they are not directly supported by the build system of the present repository. The [pqm4 project](https://github.com/mupq/pqm4) is supported for evaluating SQIsign verification in the ARM Cortex-M4. +pqm4 assumes that the full NIST API (keypair generation, signing and verification) is available. Since only verification is supported, the remaining routines are mocked and must meet certain constraints, such as sharing the public key, signing a prespecified message and being of a specific size used by the testing and benchmarking binaries of pqm4. Therefore, additional KATs must be generated specifically for pqm4, which is done by a dedicated KAT generator for pqm4, found in `apps/PQCgenKAT_sign_pqm4.c`. -### Folder structure +A copy of the most recent version of pqm4 as of the round 2 submission deadline, including an implementation of SQIsign verification generated directly from this repository using the procedure explained next, is made available [here](https://github.com/SQISign/the-sqisign-pqm4), in the `sqisign` branch. -Folder levels after `src`: -``` -SQIsign -└── src - ├── lib_1 - │ ├── broadwell - │ │ ├── generic - │ │ └── lvl1 - │ ├── opt - │ │ ├── generic - │ │ └── lvl1 - │ └── ref - │ └── generic - ├── lib_2 - │ ├── broadwell - │ │ └── generic - │ ├── opt - │ │ └── generic - │ └── ref - │ └── generic - └── lib_n - ├── broadwell - │ └── generic - ├── opt - │ └── generic - └── ref - └── generic -``` +If changes are made to the library, the `scripts/gen_pqm4_sources.sh` shell script can be run, from the root folder of the repository, to generate a pqm4-compatible folder structure in `src/pqm4/sqisign_lvl{1,3,5}`, which can then be copied to the `crypto_sign` folder of pqm4. Note that the pqm4 KAT generator is automatically run by this script. -Level 1: Library (e.g. quaternion). A `CMakeLists.txt` file with entry `include(${SELECT_IMPL_TYPE})` takes care of including the implementation Level 2. +## Acknowledgements -Level 2: Implementation type: reference C (ref), optimized C (opt), ASM-optimized (e.g. broadwell, neon, m4). A `CMakeLists.txt` file entry with `include(${SELECT_SQISIGN_VARIANT})` takes care of including the SQIsign variant. - -Level 3: SQIsign variant -> generic code or code for a specific parameter set (e.g. lvl1). - - -Other folders: -- `apps`: Applications: KAT generation application, examples -- `include`: SQIsign public header files -- `KAT`: Known Answer Test files -- `test`: SQIsign test code - -### Sub-library headers - -Sub-libraries can define their own headers, which may be different between the implementation types. These header files are used sub-library-internally and by other dependent sub-libraries. The convention is to put the headers in an `include` folder of the sub-library src directory. For example, `src/intbig/ref/generic/include/intbig.h`. - -### Sub-library unit tests - -Sub-libraries can implement their own, self-contained unit tests. The convention is to put the unit tests in a `test` folder of the sub-library `src` directory. For example, `src/intbig/ref/generic/test/test_intbig.c`. - -### Shared implementation types - -It is possible to share implementations between implementation types. For example, the broadwell optimized implementation might use the same code as the reference implementation except in the GF module. +The reference implementation for finite field arithemtic (i.e., `src/gf/ref`) +was generated using [modarith](https://github.com/mcarrickscott/modarith) by +Michael Scott. ## License SQIsign is licensed under Apache-2.0. See [LICENSE](LICENSE) and [NOTICE](NOTICE). -Third party code is used in some test and common code files: +Third party code is used in some files: - `src/common/aes_c.c`; MIT: "Copyright (c) 2016 Thomas Pornin " -- `src/common/fips202.c`: Public Domain +- `src/common/fips202.c`: CC0: Copyright (c) 2023, the PQClean team - `src/common/randombytes_system.c`: MIT: Copyright (c) 2017 Daan Sprenkels -- `apps/PQCgenKAT_sign.c`, `common/randombytes_ctrdrbg.c`, `test/test_kat.c`: by NIST (Public Domain) +- `src/common/broadwell/{aes_ni.c, vaes256_key_expansion.S}`: Apache-2.0: Copyright 2019 Amazon.com, Inc. +- `src/common/broadwell/ctr_drbg.c`: ISC: Copyright (c) 2017, Google Inc. +- `src/mini-gmp/mini-gmp.c` and `src/mini-gmp/mini-gmp.h`: LGPLv3: Copyright 1991-1997, 1999-2022 Free Software Foundation, Inc. +- `src/quaternion/ref/generic/dpe.h`: LGPLv3: Copyright (C) 2004-2024 Patrick Pelissier, Paul Zimmermann, LORIA/INRIA +- `apps/PQCgenKAT_sign.c`, `apps/PQCgenKAT_sign_pqm4.c`, `src/common/ref/randombytes_ctrdrbg.c`, `test/test_kat.c`: by NIST (Public Domain) diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt index cdfbd09..bd6b941 100644 --- a/apps/CMakeLists.txt +++ b/apps/CMakeLists.txt @@ -1,15 +1,58 @@ -# NIST KAT generation apps -foreach(SVARIANT ${SVARIANT_S}) - string(TOLOWER ${SVARIANT} SVARIANT_LOWER) - add_executable(PQCgenKAT_sign_${SVARIANT_LOWER} PQCgenKAT_sign.c) - target_link_libraries(PQCgenKAT_sign_${SVARIANT_LOWER} PRIVATE sqisign_${SVARIANT_LOWER}_test_nistapi) - target_include_directories(PQCgenKAT_sign_${SVARIANT_LOWER} PRIVATE ../include) -endforeach() +if (ENABLE_SIGN) -# Examples with NIST API + # NIST KAT generation apps + foreach(SVARIANT ${SVARIANT_S}) + string(TOLOWER ${SVARIANT} SVARIANT_LOWER) + add_executable(PQCgenKAT_sign_${SVARIANT_LOWER} PQCgenKAT_sign.c) + target_link_libraries(PQCgenKAT_sign_${SVARIANT_LOWER} PRIVATE sqisign_${SVARIANT_LOWER}_test_nistapi) + target_include_directories(PQCgenKAT_sign_${SVARIANT_LOWER} PRIVATE ../include) + target_compile_definitions(PQCgenKAT_sign_${SVARIANT_LOWER} PUBLIC SQISIGN_VARIANT=${SVARIANT_LOWER}) + endforeach() + + # pqm4 KAT generation apps + foreach(SVARIANT ${SVARIANT_S}) + string(TOLOWER ${SVARIANT} SVARIANT_LOWER) + add_executable(PQCgenKAT_sign_pqm4_${SVARIANT_LOWER} PQCgenKAT_sign_pqm4.c) + target_link_libraries(PQCgenKAT_sign_pqm4_${SVARIANT_LOWER} PRIVATE sqisign_${SVARIANT_LOWER}_test_nistapi) + target_include_directories(PQCgenKAT_sign_pqm4_${SVARIANT_LOWER} PRIVATE ../include) + target_compile_definitions(PQCgenKAT_sign_pqm4_${SVARIANT_LOWER} PUBLIC SQISIGN_VARIANT=${SVARIANT_LOWER}) + endforeach() + + # Examples with NIST API + foreach(SVARIANT ${SVARIANT_S}) + string(TOLOWER ${SVARIANT} SVARIANT_LOWER) + add_executable(example_nistapi_${SVARIANT_LOWER} example_nistapi.c) + target_link_libraries(example_nistapi_${SVARIANT_LOWER} PRIVATE sqisign_${SVARIANT_LOWER}_nistapi) + target_include_directories(example_nistapi_${SVARIANT_LOWER} PRIVATE ../include ../src/${SVARIANT_LOWER}) + target_compile_definitions(example_nistapi_${SVARIANT_LOWER} PUBLIC SQISIGN_VARIANT=${SVARIANT_LOWER}) + add_test(sqisign_test_nistapi_${SVARIANT_LOWER} example_nistapi_${SVARIANT_LOWER}) + endforeach() + + # Benchmarking tool + foreach(SVARIANT ${SVARIANT_S}) + string(TOLOWER ${SVARIANT} SVARIANT_LOWER) + add_executable(benchmark_${SVARIANT_LOWER} benchmark.c) + target_link_libraries(benchmark_${SVARIANT_LOWER} PRIVATE sqisign_${SVARIANT_LOWER}_nistapi) + target_include_directories(benchmark_${SVARIANT_LOWER} PRIVATE ../include ../src/common/generic/include) + target_compile_definitions(benchmark_${SVARIANT_LOWER} PUBLIC SQISIGN_VARIANT=${SVARIANT_LOWER}) + endforeach() + + # Fuzzing tool -- signature generation + foreach(SVARIANT ${SVARIANT_S}) + string(TOLOWER ${SVARIANT} SVARIANT_LOWER) + add_executable(fuzz_sign_${SVARIANT_LOWER} fuzz_sign.c) + target_link_libraries(fuzz_sign_${SVARIANT_LOWER} PRIVATE sqisign_${SVARIANT_LOWER}_nistapi) + target_include_directories(fuzz_sign_${SVARIANT_LOWER} PRIVATE ../include) + target_compile_definitions(fuzz_sign_${SVARIANT_LOWER} PUBLIC SQISIGN_VARIANT=${SVARIANT_LOWER}) + endforeach() + +endif() + +# Fuzzing tool -- signature verification foreach(SVARIANT ${SVARIANT_S}) string(TOLOWER ${SVARIANT} SVARIANT_LOWER) - add_executable(example_nistapi_${SVARIANT_LOWER} example_nistapi.c) - target_link_libraries(example_nistapi_${SVARIANT_LOWER} PRIVATE sqisign_${SVARIANT_LOWER}_nistapi) - target_include_directories(example_nistapi_${SVARIANT_LOWER} PRIVATE ../include ../src/${SVARIANT_LOWER}) + add_executable(fuzz_verify_${SVARIANT_LOWER} fuzz_verify.c) + target_link_libraries(fuzz_verify_${SVARIANT_LOWER} PRIVATE sqisign_${SVARIANT_LOWER}_nistapi) + target_include_directories(fuzz_verify_${SVARIANT_LOWER} PRIVATE ../include ../src/precomp/ref/${SVARIANT_LOWER}/include) + target_compile_definitions(fuzz_verify_${SVARIANT_LOWER} PUBLIC SQISIGN_VARIANT=${SVARIANT_LOWER}) endforeach() diff --git a/apps/PQCgenKAT_sign_pqm4.c b/apps/PQCgenKAT_sign_pqm4.c new file mode 100644 index 0000000..2352de5 --- /dev/null +++ b/apps/PQCgenKAT_sign_pqm4.c @@ -0,0 +1,297 @@ +// pqm4 KAT generator + +// SPDX-License-Identifier: Apache-2.0 and Unknown + +/* +NIST-developed software is provided by NIST as a public service. You may use, +copy, and distribute copies of the software in any medium, provided that you +keep intact this entire notice. You may improve, modify, and create derivative +works of the software or any portion of the software, and you may copy and +distribute such modifications or works. Modified works should carry a notice +stating that you changed the software and should note the date and nature of any +such change. Please explicitly acknowledge the National Institute of Standards +and Technology as the source of the software. + +NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY OF +ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, INCLUDING, +WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST NEITHER REPRESENTS +NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR +ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES NOT WARRANT OR MAKE +ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR THE RESULTS THEREOF, +INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, RELIABILITY, OR +USEFULNESS OF THE SOFTWARE. + +You are solely responsible for determining the appropriateness of using and +distributing the software and you assume all risks associated with its use, +including but not limited to the risks and costs of program errors, compliance +with applicable laws, damage to or loss of data, programs or equipment, and the +unavailability or interruption of operation. This software is not intended to be +used in any situation where a failure could cause risk of injury or damage to +property. The software developed by NIST employees is not subject to copyright +protection within the United States. +*/ + +#include "api.h" +#include "rng.h" +#include +#include +#include +#include + +#define STRINGIFY2(x) #x +#define STRINGIFY(x) STRINGIFY2(x) + +#define MAX_MARKER_LEN 50 + +#define KAT_SUCCESS 0 +#define KAT_FILE_OPEN_ERROR -1 +#define KAT_DATA_ERROR -3 +#define KAT_CRYPTO_FAILURE -4 + +#define NUM_KATS 2 +#define MAX_MSG_LEN 59 + +void output_header(FILE *fp) { + const char header[] = + "// SPDX-License-Identifier: Apache-2.0\n" + "\n" + "#ifndef api_h\n" + "#define api_h\n" + "\n" + "#include \n" + "#include \n" + "\n" + "#define CRYPTO_SECRETKEYBYTES " STRINGIFY(CRYPTO_SECRETKEYBYTES) "\n" + "#define CRYPTO_PUBLICKEYBYTES " STRINGIFY(CRYPTO_PUBLICKEYBYTES) "\n" + "#define CRYPTO_BYTES " STRINGIFY(CRYPTO_BYTES) "\n" + "\n" + "#define CRYPTO_ALGNAME \"SQIsign_" STRINGIFY(SQISIGN_VARIANT) "\"\n" + "\n" + "SQISIGN_API\n" + "int\n" + "crypto_sign_keypair(unsigned char *pk, unsigned char *sk);\n" + "\n" + "SQISIGN_API\n" + "int\n" + "crypto_sign(unsigned char *sm, size_t *smlen,\n" + " const unsigned char *m, size_t mlen,\n" + " const unsigned char *sk);\n" + "\n" + "SQISIGN_API\n" + "int\n" + "crypto_sign_open(unsigned char *m, size_t *mlen,\n" + " const unsigned char *sm, size_t smlen,\n" + " const unsigned char *pk);\n" + "\n" + "#endif /* api_h */\n"; + + fputs(header, fp); +} + +void output_rng(FILE *fp) { + const char rng[] = + "// SPDX-License-Identifier: Apache-2.0\n" + "\n" + "#ifndef rng_h\n" + "#define rng_h\n" + "\n" + "#include \"randombytes.h\"\n" + "\n" + "#endif /* rng_h */\n"; + + fputs(rng, fp); +} + +void output_preamble(FILE *fp) { + const char preamble[] = + "// SPDX-License-Identifier: Apache-2.0\n" + "\n" + "#include \n" + "#include \n" + "#include \n" + "\n" + "typedef struct {\n" + " size_t mlen;\n" + " char msg[" STRINGIFY(MAX_MSG_LEN) "];\n" + " size_t smlen;\n" + " char sm[" STRINGIFY(MAX_MSG_LEN) " + CRYPTO_BYTES];\n" + "} SQISign_KAT_t;\n" + "\n"; + + fputs(preamble, fp); +} + +void output_pk(FILE *fp, const unsigned char *pk) { + fprintf(fp, "const char kat_" STRINGIFY(SQISIGN_VARIANT) "_pk[CRYPTO_PUBLICKEYBYTES] = {\n "); + for (int i = 0; i < CRYPTO_PUBLICKEYBYTES; i++) { + fprintf(fp, "0x%02X, ", pk[i]); + } + fprintf(fp, "\n};\n\n"); +} + +void output_message_signature(FILE *fp, const unsigned char *m, unsigned long long mlen, const unsigned char *sm, unsigned long long smlen) { + fprintf(fp, " {\n" + " .mlen = %llu,\n" + " .msg = { ", mlen); + for (unsigned long long i = 0; i < mlen; i++) { + fprintf(fp, "0x%02X, ", m[i]); + } + fprintf(fp, "},\n" + " .smlen = %llu + CRYPTO_BYTES,\n" + " .sm = { ", mlen); + for (unsigned long long i = 0; i < smlen; i++) { + fprintf(fp, "0x%02X, ", sm[i]); + } + fprintf(fp, "},\n" + " },\n"); +} + +void output_implementation(FILE *fp) { + const char api[] = + "int crypto_sign_keypair(unsigned char *pk, unsigned char *sk) {\n" + " memcpy(pk, kat_" STRINGIFY(SQISIGN_VARIANT) "_pk, CRYPTO_PUBLICKEYBYTES);\n" + " // We don't need the secret key\n" + " memset(sk, 0, CRYPTO_SECRETKEYBYTES);\n" + "}\n" + "\n" + "int crypto_sign(unsigned char *sm, size_t *smlen, const unsigned char *m,\n" + " size_t mlen, const unsigned char *sk) {\n" + " for (size_t i = 0; i < sizeof(kat_" STRINGIFY(SQISIGN_VARIANT) ") / sizeof(kat_" STRINGIFY(SQISIGN_VARIANT) "[0]); i++) {\n" + " if (mlen == kat_" STRINGIFY(SQISIGN_VARIANT) "[i].mlen) {\n" + " memcpy(sm, kat_" STRINGIFY(SQISIGN_VARIANT) "[i].sm, kat_" STRINGIFY(SQISIGN_VARIANT) "[i].smlen);\n" + " *smlen = kat_" STRINGIFY(SQISIGN_VARIANT) "[i].smlen;\n" + " return 0;\n" + " }\n" + " }\n" + "\n" + " return 1;\n" + "}\n" + "\n" + "int crypto_sign_open(unsigned char *m, size_t *mlen, const unsigned char *sm,\n" + " size_t smlen, const unsigned char *pk) {\n" + " unsigned long long mlen_ull = *mlen;\n" + " int ret = sqisign_open(m, &mlen_ull, sm, smlen, pk);\n" + " if (mlen) {\n" + " *mlen = mlen_ull;\n" + " }\n" + " return ret;\n" + "}\n"; + + fputs(api, fp); +} + +int main(void) { + // pqm4 KATs use only all-zeros messages, one of length 32 and another of length 59; + // arrays whose dimension are the length of the message are declared the size of the + // largest of the two, but for the former, only 32 out of 59 bytes are actually used + unsigned char seed[NUM_KATS][48]; + unsigned char entropy_input[48]; + const unsigned char m[NUM_KATS][MAX_MSG_LEN] = { { 0 }, { 0 } }; + unsigned char sm[NUM_KATS][MAX_MSG_LEN + CRYPTO_BYTES] = { { 0 }, { 0 } }; + unsigned char m1[MAX_MSG_LEN]; + const unsigned long long mlen[2] = { 32, 59 }; + unsigned long long smlen[2], mlen1; + unsigned char pk[CRYPTO_PUBLICKEYBYTES], sk[CRYPTO_SECRETKEYBYTES]; + int ret_val; + + for (int i = 0; i < 48; i++) + entropy_input[i] = i; + + randombytes_init(entropy_input, NULL, 256); + + // Generate the keypair, shared between both KATs, as required for pqm4 + if ((ret_val = crypto_sign_keypair(pk, sk)) != 0) { + printf("crypto_sign_keypair returned <%d>\n", ret_val); + return KAT_CRYPTO_FAILURE; + } + + // Choose two seeds (for the 32-byte and 59-byte KATs) + for (int i = 0; i < NUM_KATS; i++) + randombytes(seed[i], 48); + + // Fill m1 with random bytes. Note that the memcmp check below for a valid signature + // compares m1 with m[i], but since the KATs use all-zero messages, the comparison + // may suceed even if m was untouched from a previous iteration. This ensures that + // memcmp will fail in that case. + randombytes(m1, MAX_MSG_LEN); + + for (int i = 0; i < NUM_KATS; i++) { + randombytes_init(seed[i], NULL, 256); + + if ((ret_val = crypto_sign(sm[i], &smlen[i], m[i], mlen[i], sk)) != 0) { + printf("crypto_sign returned <%d>\n", ret_val); + return KAT_CRYPTO_FAILURE; + } + + if ((ret_val = crypto_sign_open(m1, &mlen1, sm[i], smlen[i], pk)) != 0) { + printf("crypto_sign_open returned <%d>\n", ret_val); + return KAT_CRYPTO_FAILURE; + } + + if (mlen[i] != mlen1) { + printf( + "crypto_sign_open returned bad 'mlen': Got <%llu>, expected <%llu>\n", + mlen1, mlen[i]); + return KAT_CRYPTO_FAILURE; + } + + if (memcmp(m, m1, mlen[i])) { + printf("crypto_sign_open returned bad 'm' value\n"); + return KAT_CRYPTO_FAILURE; + } + + // Fill m1 with random bytes for the next iteration + randombytes(m1, MAX_MSG_LEN); + } + + // Output rng.h + FILE *fp = fopen("src/pqm4/sqisign_" STRINGIFY(SQISIGN_VARIANT) "/ref/rng.h", "w"); + + if (!fp) { + printf("Couldn't open rng.h file for writing. Are you in the correct folder?\n"); + return KAT_FILE_OPEN_ERROR; + } + + output_rng(fp); + + fclose(fp); + + // Output the header file + fp = fopen("src/pqm4/sqisign_" STRINGIFY(SQISIGN_VARIANT) "/ref/api.h", "w"); + + if (!fp) { + printf("Couldn't open api.h file for writing. Are you in the correct folder?\n"); + return KAT_FILE_OPEN_ERROR; + } + + output_header(fp); + + fclose(fp); + + // Output the implementation + fp = fopen("src/pqm4/sqisign_" STRINGIFY(SQISIGN_VARIANT) "/ref/pqm4_api.c", "w"); + + if (!fp) { + printf("Couldn't open pqm4_api.c file for writing. Are you in the correct folder?\n"); + return KAT_FILE_OPEN_ERROR; + } + + output_preamble(fp); + + output_pk(fp, pk); + + fprintf(fp, "const SQISign_KAT_t kat_" STRINGIFY(SQISIGN_VARIANT) "[%d] = {\n", NUM_KATS); + + for (int i = 0; i < NUM_KATS; i++) { + output_message_signature(fp, m[i], mlen[i], sm[i], smlen[i]); + } + + fprintf(fp, "};\n\n"); + + output_implementation(fp); + + fclose(fp); + + return KAT_SUCCESS; +} diff --git a/apps/benchmark.c b/apps/benchmark.c new file mode 100644 index 0000000..dd8542a --- /dev/null +++ b/apps/benchmark.c @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: Apache-2.0 + +#include +#include +#include +#include + +#include +#include +#include +#include +#if defined(TARGET_BIG_ENDIAN) +#include +#endif + +void +bench(size_t runs) +{ + const size_t m_len = 32; + const size_t sm_len = CRYPTO_BYTES + m_len; + + unsigned char *pkbuf = calloc(runs, CRYPTO_PUBLICKEYBYTES); + unsigned char *skbuf = calloc(runs, CRYPTO_SECRETKEYBYTES); + unsigned char *smbuf = calloc(runs, sm_len); + unsigned char *mbuf = calloc(runs, m_len); + + unsigned char *pk[runs], *sk[runs], *sm[runs], *m[runs]; + for (size_t i = 0; i < runs; ++i) { + pk[i] = pkbuf + i * CRYPTO_PUBLICKEYBYTES; + sk[i] = skbuf + i * CRYPTO_SECRETKEYBYTES; + sm[i] = smbuf + i * sm_len; + m[i] = mbuf + i * m_len; + if (randombytes(m[i], m_len)) + abort(); + } + + unsigned long long len; + + printf("%s (%zu iterations)\n", CRYPTO_ALGNAME, runs); + + BENCH_CODE_1(runs); + crypto_sign_keypair(pk[i], sk[i]); + BENCH_CODE_2("keypair"); + + BENCH_CODE_1(runs); + len = sm_len; + crypto_sign(sm[i], &len, m[i], m_len, sk[i]); + if (len != sm_len) + abort(); + BENCH_CODE_2("sign"); + + int ret; + BENCH_CODE_1(runs); + len = m_len; + ret = crypto_sign_open(m[i], &len, sm[i], sm_len, pk[i]); + if (ret) + abort(); + BENCH_CODE_2("verify"); + + free(pkbuf); + free(skbuf); + free(smbuf); + free(mbuf); +} + +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int iterations = SQISIGN_TEST_REPS; + int help = 0; + int seed_set = 0; + +#ifndef NDEBUG + fprintf(stderr, + "\x1b[31mIt looks like SQIsign was compiled with assertions enabled.\n" + "This will severely impact performance measurements.\x1b[0m\n"); +#endif + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + } + + if (help || iterations <= 0) { + printf("Usage: %s [--iterations=] [--seed=]\n", argv[0]); + printf("Where is the number of iterations used for benchmarking; if not " + "present, uses the default: %d)\n", + iterations); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + cpucycles_init(); + + bench(iterations); + + return 0; +} diff --git a/apps/example_nistapi.c b/apps/example_nistapi.c index b11571b..4daae3e 100644 --- a/apps/example_nistapi.c +++ b/apps/example_nistapi.c @@ -4,32 +4,53 @@ * An example to demonstrate how to use SQIsign with the NIST API. */ -#include +#include #include #include #include #include +#include +#include + +#include +#include +#include +#if defined(TARGET_BIG_ENDIAN) +#include +#endif + +static uint32_t rand_u32() +{ + unsigned char buf[4]; + if (randombytes(buf, sizeof(buf))) + abort(); + return ((uint32_t) buf[3] << 24) + | ((uint32_t) buf[2] << 16) + | ((uint32_t) buf[1] << 8) + | ((uint32_t) buf[0] << 0); +} /** * Example for SQIsign variant: * - crypto_sign_keypair * - crypto_sign * - crypto_sign_open - * + * * @return int return code */ -static int example_sqisign(void) { +static int +example_sqisign(void) +{ - unsigned long long msglen = 32; + unsigned long long msglen = rand_u32() % 100; unsigned long long smlen = CRYPTO_BYTES + msglen; - unsigned char *pk = calloc(CRYPTO_PUBLICKEYBYTES, 1); - unsigned char *sk = calloc(CRYPTO_SECRETKEYBYTES, 1); + unsigned char *sk = calloc(CRYPTO_SECRETKEYBYTES, 1); + unsigned char *pk = calloc(CRYPTO_PUBLICKEYBYTES, 1); - unsigned char *sig = calloc(smlen, 1); + unsigned char *sm = calloc(smlen, 1); - unsigned char msg[32] = { 0xe }; - unsigned char msg2[32] = { 0 }; + unsigned char msg[msglen], msg2[msglen]; printf("Example with %s\n", CRYPTO_ALGNAME); @@ -37,53 +58,111 @@ static int example_sqisign(void) { int res = crypto_sign_keypair(pk, sk); if (res) { printf("FAIL\n"); - res = -1; goto err; } else { printf("OK\n"); } + // choose a random message + for (size_t i = 0; i < msglen; ++i) + msg[i] = rand_u32(); + printf("crypto_sign -> "); - res = crypto_sign(sig, &smlen, msg, msglen, sk); + res = crypto_sign(sm, &smlen, msg, msglen, sk); if (res) { printf("FAIL\n"); - res = -1; goto err; } else { printf("OK\n"); } printf("crypto_sign_open (with correct signature) -> "); - res = crypto_sign_open(msg2, &msglen, sig, smlen, pk); - if (res || memcmp(msg, msg2, msglen)) { - printf("FAIL\n"); - res = -1; + res = crypto_sign_open(msg2, &msglen, sm, smlen, pk); + if (res || msglen != sizeof(msg) || memcmp(msg, msg2, msglen)) { + printf("FAIL\n"); // signature was not accepted!? goto err; } else { - res = 0; printf("OK\n"); } + + // fill with random bytes + for (size_t i = 0; i < msglen; ++i) + msg2[i] = rand_u32(); + + // let's try a single bit flip + size_t pos = rand_u32() % smlen; + sm[pos / 8] ^= 1 << pos % 8; + + res = crypto_sign_open(msg2, &msglen, sm, smlen, pk); + printf("crypto_sign_open (with altered signature) -> "); - sig[0] = ~sig[0]; - memset(msg2, 0, msglen); - res = crypto_sign_open(msg2, &msglen, sig, smlen, pk); - if (!res || !memcmp(msg, msg2, msglen)) { - printf("FAIL\n"); + if (!res) { + printf("FAIL\n"); // signature was accepted anyway!? res = -1; goto err; - } else { - res = 0; + } + else { printf("OK\n"); + res = 0; + + if (msglen) + printf("WARNING: verification failed but the message length was returned nonzero; misuse-prone API\n"); + + unsigned char any = 0; + for (size_t i = 0; i < msglen; ++i) + any |= msg2[i]; + if (any) + printf("WARNING: verification failed but the message buffer was not zeroed out; misuse-prone API\n"); } err: - free(pk); sqisign_secure_free(sk, CRYPTO_SECRETKEYBYTES); - free(sig); + free(pk); + free(sm); + return res; } -int main(void) { +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int help = 0; + int seed_set = 0; + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + } + + if (help) { + printf("Usage: %s [--seed=]\n", argv[0]); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + return example_sqisign(); } diff --git a/apps/fuzz_sign.c b/apps/fuzz_sign.c new file mode 100644 index 0000000..6c7a8e7 --- /dev/null +++ b/apps/fuzz_sign.c @@ -0,0 +1,151 @@ +// SPDX-License-Identifier: Apache-2.0 + +#include +#include +#include +#include +#include + +#include +#include + +/** + * Example for SQIsign variant: + * - crypto_sign_keypair + * - crypto_sign + * - crypto_sign_open + * + * @return int return code + */ +static int example_sqisign(int iter) { + int ret = 0; + + unsigned long long msglen = 64; + unsigned long long smlen = CRYPTO_BYTES + msglen; + + unsigned char *sk = calloc(CRYPTO_SECRETKEYBYTES, 1); + unsigned char *pk = calloc(CRYPTO_PUBLICKEYBYTES, 1); + + unsigned char *sm = calloc(smlen, 1); + + unsigned char msg[msglen]; + + FILE *f = NULL; + + int res = crypto_sign_keypair(pk, sk); + if (res) { + fprintf(stderr, "crypto_sign_keypair -> FAIL\n"); + ret = 1; + goto end; + } + + // choose a random message + randombytes(msg, msglen); + + res = crypto_sign(sm, &smlen, msg, msglen, sk); + if (res) { + fprintf(stderr, "crypto_sign -> FAIL\n"); + ret = 1; + goto end; + } + + // This string is larger than necessary, but gcc is not smart enough + // to detect that iter < 1000000 in the snprintf call below + char filename[sizeof("testcases/SQIsign_lvl1/signature4294967296.bin") + 1]; + if (iter > 999999) { + fprintf(stderr, "Too many iterations: %d\n", iter); + ret = 1; + goto end; + } + snprintf(filename, sizeof(filename), "testcases/%s/signature%06d.bin", + CRYPTO_ALGNAME, iter); + f = fopen(filename, "wb"); + if (!f) { + fprintf(stderr, + "Can't open file: %s (have you created the testcases/%s folder?)\n", + filename, CRYPTO_ALGNAME); + ret = 1; + goto end; + } + + if (fwrite(pk, CRYPTO_PUBLICKEYBYTES, 1, f) != 1) { + fprintf(stderr, "Error writing public key to file\n"); + ret = 1; + goto end; + } + if (fwrite(sm, smlen, 1, f) != 1) { + fprintf(stderr, "Error writing signature to file\n"); + ret = 1; + goto end; + } + +end: + if (f) + fclose(f); + + free(sk); + free(pk); + free(sm); + + return ret; +} + +// Brief fuzzing tutorial (assumes level 1, but works for other levels) +// Assumes an Intel Linux system +// +// 0. Some OS configurations required for AFL to work: +// echo core | sudo tee /proc/sys/kernel/core_pattern +// echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor +// +// 1. Install AFL++ (https://aflplus.plus) -- on Ubuntu, install packages +// afl++, clang, lld, tmux +// +// 2. Configure CMake using AFL's compilers: +// AFL_HARDEN=1 cmake -DCMAKE_C_COMPILER=afl-clang-lto +// +// 3. Build +// +// 4. cd to the build/apps folder +// +// 5. Create required folders: +// mkdir -p testcases/SQIsign_lvl{1,3,5} +// +// 6. Run ./fuzz_sign_lvl1 to create some initial testcases +// +// 7. Run: +// tmux new-session -s afl1 afl-fuzz -i testcases/SQIsign_lvl1/ -o syncdir/ -D -M fuzz1 -- ./fuzz_verify_lvl1 +// +// 8. Optionally run using other cores in the machine (e.g. for 24 cores), +// for i in $(seq 2 24) +// do +// tmux new-session -s afl$i -d afl-fuzz -d -i testcases/SQIsign_lvl1/ -o syncdir/ -S fuzz$i -- ./fuzz_verify_lvl1 +// done +// +// 9. Attach to a specific instance by running: +// tmux attach -t afl$i +// +// 10. To get summary statistics for all runs, run: +// afl-whatsup syncdir/ +// +// 11. "Interesting" signatures, in a binary format understood by +// fuzz_verify_lvl1, will be found in syncdir/fuzz$i/crashes; to +// reproduce the crash, pipe one of these files to fuzz_verify_lvl1 + +int +main(int argc, char *argv[]) { + int testcases = 10; + + unsigned char seed[48]; + randombytes_select(seed, sizeof(seed)); + randombytes_init(seed, NULL, 256); + + if (argc == 2) { + sscanf(argv[1], "--testcases=%d", &testcases); + } + + for (int i = 0; i < testcases; ++i) { + example_sqisign(i); + } + + return 0; +} diff --git a/apps/fuzz_verify.c b/apps/fuzz_verify.c new file mode 100644 index 0000000..376a867 --- /dev/null +++ b/apps/fuzz_verify.c @@ -0,0 +1,117 @@ +// SPDX-License-Identifier: Apache-2.0 + +#include +#include +#include +#include +#include + +#include +#include + +#include "encoded_sizes.h" + +typedef struct { + unsigned char pk[CRYPTO_PUBLICKEYBYTES]; + unsigned char sm[CRYPTO_BYTES + 64]; +} signature_t; + +static void crash() { + int *p = 0; + *p = 0; +} + +static int load_signature(signature_t *sig, int iter) { + char filename[sizeof("testcases/SQIsign_lvl1/signature000000.bin")]; + snprintf(filename, sizeof(filename), "testcases/%s/signature%06d.bin", CRYPTO_ALGNAME, iter); + FILE *f = fopen(filename, "rb"); + + if (!f) { + fprintf(stderr, "Can't open file: %s\n", filename); + return 1; + } + + if (fread(sig->pk, CRYPTO_PUBLICKEYBYTES, 1, f) != 1) { + fprintf(stderr, "Can't read public key from file: %s\n", filename); + fclose(f); + return 1; + } + + if (fread(sig->sm, CRYPTO_BYTES + 64, 1, f) != 1) { + fprintf(stderr, "Can't read signature from file: %s\n", filename); + fclose(f); + return 1; + } + + fclose(f); + + return 0; +} + +static void verify_signature(signature_t corpus[], int testcases) { + unsigned long long msglen = 64; + unsigned long long smlen = CRYPTO_BYTES + msglen; + + unsigned char *pk = calloc(CRYPTO_PUBLICKEYBYTES, 1); + unsigned char *sm = calloc(smlen, 1); + + unsigned char msg[msglen]; + + if (fread(pk, CRYPTO_PUBLICKEYBYTES, 1, stdin) != 1) { + fprintf(stderr, "Error reading public key from stdin\n"); + free(pk); + free(sm); + return; + } + if (fread(sm, smlen, 1, stdin) != 1) { + fprintf(stderr, "Error reading signature from stdin\n"); + free(pk); + free(sm); + return; + } + + int res = crypto_sign_open(msg, &msglen, sm, smlen, pk); + if (res || msglen != sizeof(msg) || memcmp(msg, sm + SIGNATURE_BYTES, msglen)) { + // Signature was not accepted -- check if it was in the corpus and, in that case, crash + for (int i = 0; i < testcases; ++i) + if (!memcmp(pk, corpus[i].pk, CRYPTO_PUBLICKEYBYTES) || !memcmp(sm, corpus[i].sm, smlen)) + crash(); + } else { + // Signature was accepted -- check if it was not in the corpus and, in that case, crash + int in_corpus = 0; + for (int i = 0; i < testcases; ++i) + if (!memcmp(pk, corpus[i].pk, CRYPTO_PUBLICKEYBYTES) || !memcmp(sm, corpus[i].sm, smlen)) { + in_corpus = 1; + break; + } + + if (!in_corpus) + crash(); + } + + free(pk); + free(sm); +} + +int +main(int argc, char *argv[]) { + int testcases = 10; + + if (argc == 2) { + sscanf(argv[1], "--testcases=%d", &testcases); + } + + signature_t corpus[testcases]; + for (int i = 0; i < testcases; ++i) + if (!load_signature(&corpus[i], i)) + return 1; + +#ifdef __AFL_LOOP + while (__AFL_LOOP(1000)) + verify_signature(corpus, testcases); +#else + verify_signature(corpus, testcases); +#endif + + return 0; +} diff --git a/include/mem.h b/include/mem.h index 0c138a4..ab8f6c6 100644 --- a/include/mem.h +++ b/include/mem.h @@ -3,10 +3,11 @@ #ifndef MEM_H #define MEM_H #include +#include /** * Clears and frees allocated memory. - * + * * @param[out] mem Memory to be cleared and freed. * @param size Size of memory to be cleared and freed. */ @@ -14,10 +15,10 @@ void sqisign_secure_free(void *mem, size_t size); /** * Clears memory. - * + * * @param[out] mem Memory to be cleared. * @param size Size of memory to be cleared. */ void sqisign_secure_clear(void *mem, size_t size); -#endif \ No newline at end of file +#endif diff --git a/include/rng.h b/include/rng.h index 7bf4efa..0a9ca0e 100644 --- a/include/rng.h +++ b/include/rng.h @@ -3,6 +3,8 @@ #ifndef rng_h #define rng_h +#include + /** * Randombytes initialization. * Initialization may be needed for some random number generators (e.g. CTR-DRBG). @@ -11,10 +13,22 @@ * @param[in] personalization_string Personalization string * @param[in] security_strength Security string */ +SQISIGN_API void randombytes_init(unsigned char *entropy_input, unsigned char *personalization_string, int security_strength); +/** + * Random byte generation using /dev/urandom. + * The caller is responsible to allocate sufficient memory to hold x. + * + * @param[out] x Memory to hold the random bytes. + * @param[in] xlen Number of random bytes to be generated + * @return int 0 on success, -1 otherwise + */ +SQISIGN_API +int randombytes_select(unsigned char *x, unsigned long long xlen); + /** * Random byte generation. * The caller is responsible to allocate sufficient memory to hold x. @@ -23,6 +37,7 @@ void randombytes_init(unsigned char *entropy_input, * @param[in] xlen Number of random bytes to be generated * @return int 0 on success, -1 otherwise */ +SQISIGN_API int randombytes(unsigned char *x, unsigned long long xlen); #endif /* rng_h */ diff --git a/include/sig.h b/include/sig.h index 1a61316..4c33510 100644 --- a/include/sig.h +++ b/include/sig.h @@ -4,7 +4,9 @@ #define SQISIGN_H #include +#include +#if defined(ENABLE_SIGN) /** * SQIsign keypair generation. * @@ -15,6 +17,7 @@ * @param[out] sk SQIsign secret key * @return int status code */ +SQISIGN_API int sqisign_keypair(unsigned char *pk, unsigned char *sk); /** @@ -31,16 +34,20 @@ int sqisign_keypair(unsigned char *pk, unsigned char *sk); * @param[in] sk Compacted secret key * @return int status code */ +SQISIGN_API int sqisign_sign(unsigned char *sm, - unsigned long long *smlen, const unsigned char *m, - unsigned long long mlen, const unsigned char *sk); + unsigned long long *smlen, + const unsigned char *m, + unsigned long long mlen, + const unsigned char *sk); +#endif /** * SQIsign open signature. * - * The implementation performs SQIsign.verify(). If the signature verification succeeded, the original message is stored in m. - * Keys provided is a compact public key. - * The caller is responsible to allocate sufficient memory to hold m. + * The implementation performs SQIsign.verify(). If the signature verification succeeded, the + * original message is stored in m. Keys provided is a compact public key. The caller is responsible + * to allocate sufficient memory to hold m. * * @param[out] m Message stored if verification succeeds * @param[out] mlen Pointer to the length of m @@ -49,10 +56,12 @@ int sqisign_sign(unsigned char *sm, * @param[in] pk Compacted public key * @return int status code */ +SQISIGN_API int sqisign_open(unsigned char *m, - unsigned long long *mlen, const unsigned char *sm, - unsigned long long smlen, const unsigned char *pk); - + unsigned long long *mlen, + const unsigned char *sm, + unsigned long long smlen, + const unsigned char *pk); /** * SQIsign verify signature. @@ -66,8 +75,11 @@ int sqisign_open(unsigned char *m, * @param[in] pk Compacted public key * @return int 0 if verification succeeded, 1 otherwise. */ +SQISIGN_API int sqisign_verify(const unsigned char *m, - unsigned long long mlen, const unsigned char *sig, - unsigned long long siglen, const unsigned char *pk); + unsigned long long mlen, + const unsigned char *sig, + unsigned long long siglen, + const unsigned char *pk); #endif diff --git a/include/sqisign_namespace.h b/include/sqisign_namespace.h new file mode 100644 index 0000000..14fd51d --- /dev/null +++ b/include/sqisign_namespace.h @@ -0,0 +1,1022 @@ + +#ifndef SQISIGN_NAMESPACE_H +#define SQISIGN_NAMESPACE_H + +//#define DISABLE_NAMESPACING + +#if defined(_WIN32) +#define SQISIGN_API __declspec(dllexport) +#else +#define SQISIGN_API __attribute__((visibility("default"))) +#endif + +#define PARAM_JOIN3_(a, b, c) sqisign_##a##_##b##_##c +#define PARAM_JOIN3(a, b, c) PARAM_JOIN3_(a, b, c) +#define PARAM_NAME3(end, s) PARAM_JOIN3(SQISIGN_VARIANT, end, s) + +#define PARAM_JOIN2_(a, b) sqisign_##a##_##b +#define PARAM_JOIN2(a, b) PARAM_JOIN2_(a, b) +#define PARAM_NAME2(end, s) PARAM_JOIN2(end, s) + +#ifndef DISABLE_NAMESPACING +#define SQISIGN_NAMESPACE_GENERIC(s) PARAM_NAME2(gen, s) +#else +#define SQISIGN_NAMESPACE_GENERIC(s) s +#endif + +#if defined(SQISIGN_VARIANT) && !defined(DISABLE_NAMESPACING) +#if defined(SQISIGN_BUILD_TYPE_REF) +#define SQISIGN_NAMESPACE(s) PARAM_NAME3(ref, s) +#elif defined(SQISIGN_BUILD_TYPE_OPT) +#define SQISIGN_NAMESPACE(s) PARAM_NAME3(opt, s) +#elif defined(SQISIGN_BUILD_TYPE_BROADWELL) +#define SQISIGN_NAMESPACE(s) PARAM_NAME3(broadwell, s) +#elif defined(SQISIGN_BUILD_TYPE_ARM64CRYPTO) +#define SQISIGN_NAMESPACE(s) PARAM_NAME3(arm64crypto, s) +#else +#error "Build type not known" +#endif + +#else +#define SQISIGN_NAMESPACE(s) s +#endif + +// Namespacing symbols exported from algebra.c: +#undef quat_alg_add +#undef quat_alg_conj +#undef quat_alg_coord_mul +#undef quat_alg_elem_copy +#undef quat_alg_elem_copy_ibz +#undef quat_alg_elem_equal +#undef quat_alg_elem_is_zero +#undef quat_alg_elem_mul_by_scalar +#undef quat_alg_elem_set +#undef quat_alg_equal_denom +#undef quat_alg_init_set_ui +#undef quat_alg_make_primitive +#undef quat_alg_mul +#undef quat_alg_norm +#undef quat_alg_normalize +#undef quat_alg_scalar +#undef quat_alg_sub + +#define quat_alg_add SQISIGN_NAMESPACE_GENERIC(quat_alg_add) +#define quat_alg_conj SQISIGN_NAMESPACE_GENERIC(quat_alg_conj) +#define quat_alg_coord_mul SQISIGN_NAMESPACE_GENERIC(quat_alg_coord_mul) +#define quat_alg_elem_copy SQISIGN_NAMESPACE_GENERIC(quat_alg_elem_copy) +#define quat_alg_elem_copy_ibz SQISIGN_NAMESPACE_GENERIC(quat_alg_elem_copy_ibz) +#define quat_alg_elem_equal SQISIGN_NAMESPACE_GENERIC(quat_alg_elem_equal) +#define quat_alg_elem_is_zero SQISIGN_NAMESPACE_GENERIC(quat_alg_elem_is_zero) +#define quat_alg_elem_mul_by_scalar SQISIGN_NAMESPACE_GENERIC(quat_alg_elem_mul_by_scalar) +#define quat_alg_elem_set SQISIGN_NAMESPACE_GENERIC(quat_alg_elem_set) +#define quat_alg_equal_denom SQISIGN_NAMESPACE_GENERIC(quat_alg_equal_denom) +#define quat_alg_init_set_ui SQISIGN_NAMESPACE_GENERIC(quat_alg_init_set_ui) +#define quat_alg_make_primitive SQISIGN_NAMESPACE_GENERIC(quat_alg_make_primitive) +#define quat_alg_mul SQISIGN_NAMESPACE_GENERIC(quat_alg_mul) +#define quat_alg_norm SQISIGN_NAMESPACE_GENERIC(quat_alg_norm) +#define quat_alg_normalize SQISIGN_NAMESPACE_GENERIC(quat_alg_normalize) +#define quat_alg_scalar SQISIGN_NAMESPACE_GENERIC(quat_alg_scalar) +#define quat_alg_sub SQISIGN_NAMESPACE_GENERIC(quat_alg_sub) + +// Namespacing symbols exported from api.c: +#undef crypto_sign +#undef crypto_sign_keypair +#undef crypto_sign_open + +#define crypto_sign SQISIGN_NAMESPACE(crypto_sign) +#define crypto_sign_keypair SQISIGN_NAMESPACE(crypto_sign_keypair) +#define crypto_sign_open SQISIGN_NAMESPACE(crypto_sign_open) + +// Namespacing symbols exported from basis.c: +#undef ec_curve_to_basis_2f_from_hint +#undef ec_curve_to_basis_2f_to_hint +#undef ec_recover_y +#undef lift_basis +#undef lift_basis_normalized + +#define ec_curve_to_basis_2f_from_hint SQISIGN_NAMESPACE(ec_curve_to_basis_2f_from_hint) +#define ec_curve_to_basis_2f_to_hint SQISIGN_NAMESPACE(ec_curve_to_basis_2f_to_hint) +#define ec_recover_y SQISIGN_NAMESPACE(ec_recover_y) +#define lift_basis SQISIGN_NAMESPACE(lift_basis) +#define lift_basis_normalized SQISIGN_NAMESPACE(lift_basis_normalized) + +// Namespacing symbols exported from biextension.c: +#undef clear_cofac +#undef ec_dlog_2_tate +#undef ec_dlog_2_weil +#undef fp2_frob +#undef reduced_tate +#undef weil + +#define clear_cofac SQISIGN_NAMESPACE(clear_cofac) +#define ec_dlog_2_tate SQISIGN_NAMESPACE(ec_dlog_2_tate) +#define ec_dlog_2_weil SQISIGN_NAMESPACE(ec_dlog_2_weil) +#define fp2_frob SQISIGN_NAMESPACE(fp2_frob) +#define reduced_tate SQISIGN_NAMESPACE(reduced_tate) +#define weil SQISIGN_NAMESPACE(weil) + +// Namespacing symbols exported from common.c: +#undef hash_to_challenge +#undef public_key_finalize +#undef public_key_init + +#define hash_to_challenge SQISIGN_NAMESPACE(hash_to_challenge) +#define public_key_finalize SQISIGN_NAMESPACE(public_key_finalize) +#define public_key_init SQISIGN_NAMESPACE(public_key_init) + +// Namespacing symbols exported from dim2.c: +#undef ibz_2x2_mul_mod +#undef ibz_mat_2x2_add +#undef ibz_mat_2x2_copy +#undef ibz_mat_2x2_det_from_ibz +#undef ibz_mat_2x2_eval +#undef ibz_mat_2x2_inv_mod +#undef ibz_mat_2x2_set +#undef ibz_vec_2_set + +#define ibz_2x2_mul_mod SQISIGN_NAMESPACE_GENERIC(ibz_2x2_mul_mod) +#define ibz_mat_2x2_add SQISIGN_NAMESPACE_GENERIC(ibz_mat_2x2_add) +#define ibz_mat_2x2_copy SQISIGN_NAMESPACE_GENERIC(ibz_mat_2x2_copy) +#define ibz_mat_2x2_det_from_ibz SQISIGN_NAMESPACE_GENERIC(ibz_mat_2x2_det_from_ibz) +#define ibz_mat_2x2_eval SQISIGN_NAMESPACE_GENERIC(ibz_mat_2x2_eval) +#define ibz_mat_2x2_inv_mod SQISIGN_NAMESPACE_GENERIC(ibz_mat_2x2_inv_mod) +#define ibz_mat_2x2_set SQISIGN_NAMESPACE_GENERIC(ibz_mat_2x2_set) +#define ibz_vec_2_set SQISIGN_NAMESPACE_GENERIC(ibz_vec_2_set) + +// Namespacing symbols exported from dim2id2iso.c: +#undef dim2id2iso_arbitrary_isogeny_evaluation +#undef dim2id2iso_ideal_to_isogeny_clapotis +#undef find_uv +#undef fixed_degree_isogeny_and_eval + +#define dim2id2iso_arbitrary_isogeny_evaluation SQISIGN_NAMESPACE(dim2id2iso_arbitrary_isogeny_evaluation) +#define dim2id2iso_ideal_to_isogeny_clapotis SQISIGN_NAMESPACE(dim2id2iso_ideal_to_isogeny_clapotis) +#define find_uv SQISIGN_NAMESPACE(find_uv) +#define fixed_degree_isogeny_and_eval SQISIGN_NAMESPACE(fixed_degree_isogeny_and_eval) + +// Namespacing symbols exported from dim4.c: +#undef ibz_inv_dim4_make_coeff_mpm +#undef ibz_inv_dim4_make_coeff_pmp +#undef ibz_mat_4x4_copy +#undef ibz_mat_4x4_equal +#undef ibz_mat_4x4_eval +#undef ibz_mat_4x4_eval_t +#undef ibz_mat_4x4_gcd +#undef ibz_mat_4x4_identity +#undef ibz_mat_4x4_inv_with_det_as_denom +#undef ibz_mat_4x4_is_identity +#undef ibz_mat_4x4_mul +#undef ibz_mat_4x4_negate +#undef ibz_mat_4x4_scalar_div +#undef ibz_mat_4x4_scalar_mul +#undef ibz_mat_4x4_transpose +#undef ibz_mat_4x4_zero +#undef ibz_vec_4_add +#undef ibz_vec_4_content +#undef ibz_vec_4_copy +#undef ibz_vec_4_copy_ibz +#undef ibz_vec_4_is_zero +#undef ibz_vec_4_linear_combination +#undef ibz_vec_4_negate +#undef ibz_vec_4_scalar_div +#undef ibz_vec_4_scalar_mul +#undef ibz_vec_4_set +#undef ibz_vec_4_sub +#undef quat_qf_eval + +#define ibz_inv_dim4_make_coeff_mpm SQISIGN_NAMESPACE_GENERIC(ibz_inv_dim4_make_coeff_mpm) +#define ibz_inv_dim4_make_coeff_pmp SQISIGN_NAMESPACE_GENERIC(ibz_inv_dim4_make_coeff_pmp) +#define ibz_mat_4x4_copy SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_copy) +#define ibz_mat_4x4_equal SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_equal) +#define ibz_mat_4x4_eval SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_eval) +#define ibz_mat_4x4_eval_t SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_eval_t) +#define ibz_mat_4x4_gcd SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_gcd) +#define ibz_mat_4x4_identity SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_identity) +#define ibz_mat_4x4_inv_with_det_as_denom SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_inv_with_det_as_denom) +#define ibz_mat_4x4_is_identity SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_is_identity) +#define ibz_mat_4x4_mul SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_mul) +#define ibz_mat_4x4_negate SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_negate) +#define ibz_mat_4x4_scalar_div SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_scalar_div) +#define ibz_mat_4x4_scalar_mul SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_scalar_mul) +#define ibz_mat_4x4_transpose SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_transpose) +#define ibz_mat_4x4_zero SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_zero) +#define ibz_vec_4_add SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_add) +#define ibz_vec_4_content SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_content) +#define ibz_vec_4_copy SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_copy) +#define ibz_vec_4_copy_ibz SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_copy_ibz) +#define ibz_vec_4_is_zero SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_is_zero) +#define ibz_vec_4_linear_combination SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_linear_combination) +#define ibz_vec_4_negate SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_negate) +#define ibz_vec_4_scalar_div SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_scalar_div) +#define ibz_vec_4_scalar_mul SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_scalar_mul) +#define ibz_vec_4_set SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_set) +#define ibz_vec_4_sub SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_sub) +#define quat_qf_eval SQISIGN_NAMESPACE_GENERIC(quat_qf_eval) + +// Namespacing symbols exported from ec.c: +#undef cswap_points +#undef ec_biscalar_mul +#undef ec_curve_init +#undef ec_curve_init_from_A +#undef ec_curve_normalize_A24 +#undef ec_curve_verify_A +#undef ec_dbl +#undef ec_dbl_iter +#undef ec_dbl_iter_basis +#undef ec_has_zero_coordinate +#undef ec_is_basis_four_torsion +#undef ec_is_equal +#undef ec_is_four_torsion +#undef ec_is_two_torsion +#undef ec_is_zero +#undef ec_j_inv +#undef ec_ladder3pt +#undef ec_mul +#undef ec_normalize_curve +#undef ec_normalize_curve_and_A24 +#undef ec_normalize_point +#undef ec_point_init +#undef select_point +#undef xADD +#undef xDBL +#undef xDBLADD +#undef xDBLMUL +#undef xDBL_A24 +#undef xDBL_E0 +#undef xMUL + +#define cswap_points SQISIGN_NAMESPACE(cswap_points) +#define ec_biscalar_mul SQISIGN_NAMESPACE(ec_biscalar_mul) +#define ec_curve_init SQISIGN_NAMESPACE(ec_curve_init) +#define ec_curve_init_from_A SQISIGN_NAMESPACE(ec_curve_init_from_A) +#define ec_curve_normalize_A24 SQISIGN_NAMESPACE(ec_curve_normalize_A24) +#define ec_curve_verify_A SQISIGN_NAMESPACE(ec_curve_verify_A) +#define ec_dbl SQISIGN_NAMESPACE(ec_dbl) +#define ec_dbl_iter SQISIGN_NAMESPACE(ec_dbl_iter) +#define ec_dbl_iter_basis SQISIGN_NAMESPACE(ec_dbl_iter_basis) +#define ec_has_zero_coordinate SQISIGN_NAMESPACE(ec_has_zero_coordinate) +#define ec_is_basis_four_torsion SQISIGN_NAMESPACE(ec_is_basis_four_torsion) +#define ec_is_equal SQISIGN_NAMESPACE(ec_is_equal) +#define ec_is_four_torsion SQISIGN_NAMESPACE(ec_is_four_torsion) +#define ec_is_two_torsion SQISIGN_NAMESPACE(ec_is_two_torsion) +#define ec_is_zero SQISIGN_NAMESPACE(ec_is_zero) +#define ec_j_inv SQISIGN_NAMESPACE(ec_j_inv) +#define ec_ladder3pt SQISIGN_NAMESPACE(ec_ladder3pt) +#define ec_mul SQISIGN_NAMESPACE(ec_mul) +#define ec_normalize_curve SQISIGN_NAMESPACE(ec_normalize_curve) +#define ec_normalize_curve_and_A24 SQISIGN_NAMESPACE(ec_normalize_curve_and_A24) +#define ec_normalize_point SQISIGN_NAMESPACE(ec_normalize_point) +#define ec_point_init SQISIGN_NAMESPACE(ec_point_init) +#define select_point SQISIGN_NAMESPACE(select_point) +#define xADD SQISIGN_NAMESPACE(xADD) +#define xDBL SQISIGN_NAMESPACE(xDBL) +#define xDBLADD SQISIGN_NAMESPACE(xDBLADD) +#define xDBLMUL SQISIGN_NAMESPACE(xDBLMUL) +#define xDBL_A24 SQISIGN_NAMESPACE(xDBL_A24) +#define xDBL_E0 SQISIGN_NAMESPACE(xDBL_E0) +#define xMUL SQISIGN_NAMESPACE(xMUL) + +// Namespacing symbols exported from ec_jac.c: +#undef ADD +#undef DBL +#undef DBLW +#undef copy_jac_point +#undef jac_from_ws +#undef jac_init +#undef jac_is_equal +#undef jac_neg +#undef jac_to_ws +#undef jac_to_xz +#undef jac_to_xz_add_components +#undef select_jac_point + +#define ADD SQISIGN_NAMESPACE(ADD) +#define DBL SQISIGN_NAMESPACE(DBL) +#define DBLW SQISIGN_NAMESPACE(DBLW) +#define copy_jac_point SQISIGN_NAMESPACE(copy_jac_point) +#define jac_from_ws SQISIGN_NAMESPACE(jac_from_ws) +#define jac_init SQISIGN_NAMESPACE(jac_init) +#define jac_is_equal SQISIGN_NAMESPACE(jac_is_equal) +#define jac_neg SQISIGN_NAMESPACE(jac_neg) +#define jac_to_ws SQISIGN_NAMESPACE(jac_to_ws) +#define jac_to_xz SQISIGN_NAMESPACE(jac_to_xz) +#define jac_to_xz_add_components SQISIGN_NAMESPACE(jac_to_xz_add_components) +#define select_jac_point SQISIGN_NAMESPACE(select_jac_point) + +// Namespacing symbols exported from encode_signature.c: +#undef secret_key_from_bytes +#undef secret_key_to_bytes + +#define secret_key_from_bytes SQISIGN_NAMESPACE(secret_key_from_bytes) +#define secret_key_to_bytes SQISIGN_NAMESPACE(secret_key_to_bytes) + +// Namespacing symbols exported from encode_verification.c: +#undef public_key_from_bytes +#undef public_key_to_bytes +#undef signature_from_bytes +#undef signature_to_bytes + +#define public_key_from_bytes SQISIGN_NAMESPACE(public_key_from_bytes) +#define public_key_to_bytes SQISIGN_NAMESPACE(public_key_to_bytes) +#define signature_from_bytes SQISIGN_NAMESPACE(signature_from_bytes) +#define signature_to_bytes SQISIGN_NAMESPACE(signature_to_bytes) + +// Namespacing symbols exported from finit.c: +#undef ibz_mat_2x2_finalize +#undef ibz_mat_2x2_init +#undef ibz_mat_4x4_finalize +#undef ibz_mat_4x4_init +#undef ibz_vec_2_finalize +#undef ibz_vec_2_init +#undef ibz_vec_4_finalize +#undef ibz_vec_4_init +#undef quat_alg_elem_finalize +#undef quat_alg_elem_init +#undef quat_alg_finalize +#undef quat_alg_init_set +#undef quat_lattice_finalize +#undef quat_lattice_init +#undef quat_left_ideal_finalize +#undef quat_left_ideal_init + +#define ibz_mat_2x2_finalize SQISIGN_NAMESPACE_GENERIC(ibz_mat_2x2_finalize) +#define ibz_mat_2x2_init SQISIGN_NAMESPACE_GENERIC(ibz_mat_2x2_init) +#define ibz_mat_4x4_finalize SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_finalize) +#define ibz_mat_4x4_init SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_init) +#define ibz_vec_2_finalize SQISIGN_NAMESPACE_GENERIC(ibz_vec_2_finalize) +#define ibz_vec_2_init SQISIGN_NAMESPACE_GENERIC(ibz_vec_2_init) +#define ibz_vec_4_finalize SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_finalize) +#define ibz_vec_4_init SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_init) +#define quat_alg_elem_finalize SQISIGN_NAMESPACE_GENERIC(quat_alg_elem_finalize) +#define quat_alg_elem_init SQISIGN_NAMESPACE_GENERIC(quat_alg_elem_init) +#define quat_alg_finalize SQISIGN_NAMESPACE_GENERIC(quat_alg_finalize) +#define quat_alg_init_set SQISIGN_NAMESPACE_GENERIC(quat_alg_init_set) +#define quat_lattice_finalize SQISIGN_NAMESPACE_GENERIC(quat_lattice_finalize) +#define quat_lattice_init SQISIGN_NAMESPACE_GENERIC(quat_lattice_init) +#define quat_left_ideal_finalize SQISIGN_NAMESPACE_GENERIC(quat_left_ideal_finalize) +#define quat_left_ideal_init SQISIGN_NAMESPACE_GENERIC(quat_left_ideal_init) + +// Namespacing symbols exported from fp.c: +#undef fp_select + +#define fp_select SQISIGN_NAMESPACE(fp_select) + +// Namespacing symbols exported from fp.c, fp_p27500_64.c, fp_p5248_64.c, fp_p65376_64.c: +#undef fp_exp3div4 +#undef fp_inv +#undef fp_is_square +#undef fp_sqrt + +#define fp_exp3div4 SQISIGN_NAMESPACE(fp_exp3div4) +#define fp_inv SQISIGN_NAMESPACE(fp_inv) +#define fp_is_square SQISIGN_NAMESPACE(fp_is_square) +#define fp_sqrt SQISIGN_NAMESPACE(fp_sqrt) + +// Namespacing symbols exported from fp2.c: +#undef fp2_add +#undef fp2_add_one +#undef fp2_batched_inv +#undef fp2_copy +#undef fp2_cswap +#undef fp2_decode +#undef fp2_encode +#undef fp2_half +#undef fp2_inv +#undef fp2_is_equal +#undef fp2_is_one +#undef fp2_is_square +#undef fp2_is_zero +#undef fp2_mul +#undef fp2_mul_small +#undef fp2_neg +#undef fp2_pow_vartime +#undef fp2_print +#undef fp2_select +#undef fp2_set_one +#undef fp2_set_small +#undef fp2_set_zero +#undef fp2_sqr +#undef fp2_sqrt +#undef fp2_sqrt_verify +#undef fp2_sub + +#define fp2_add SQISIGN_NAMESPACE(fp2_add) +#define fp2_add_one SQISIGN_NAMESPACE(fp2_add_one) +#define fp2_batched_inv SQISIGN_NAMESPACE(fp2_batched_inv) +#define fp2_copy SQISIGN_NAMESPACE(fp2_copy) +#define fp2_cswap SQISIGN_NAMESPACE(fp2_cswap) +#define fp2_decode SQISIGN_NAMESPACE(fp2_decode) +#define fp2_encode SQISIGN_NAMESPACE(fp2_encode) +#define fp2_half SQISIGN_NAMESPACE(fp2_half) +#define fp2_inv SQISIGN_NAMESPACE(fp2_inv) +#define fp2_is_equal SQISIGN_NAMESPACE(fp2_is_equal) +#define fp2_is_one SQISIGN_NAMESPACE(fp2_is_one) +#define fp2_is_square SQISIGN_NAMESPACE(fp2_is_square) +#define fp2_is_zero SQISIGN_NAMESPACE(fp2_is_zero) +#define fp2_mul SQISIGN_NAMESPACE(fp2_mul) +#define fp2_mul_small SQISIGN_NAMESPACE(fp2_mul_small) +#define fp2_neg SQISIGN_NAMESPACE(fp2_neg) +#define fp2_pow_vartime SQISIGN_NAMESPACE(fp2_pow_vartime) +#define fp2_print SQISIGN_NAMESPACE(fp2_print) +#define fp2_select SQISIGN_NAMESPACE(fp2_select) +#define fp2_set_one SQISIGN_NAMESPACE(fp2_set_one) +#define fp2_set_small SQISIGN_NAMESPACE(fp2_set_small) +#define fp2_set_zero SQISIGN_NAMESPACE(fp2_set_zero) +#define fp2_sqr SQISIGN_NAMESPACE(fp2_sqr) +#define fp2_sqrt SQISIGN_NAMESPACE(fp2_sqrt) +#define fp2_sqrt_verify SQISIGN_NAMESPACE(fp2_sqrt_verify) +#define fp2_sub SQISIGN_NAMESPACE(fp2_sub) + +// Namespacing symbols exported from fp_p27500_64.c, fp_p5248_64.c, fp_p65376_64.c: +#undef fp_copy +#undef fp_cswap +#undef fp_decode +#undef fp_decode_reduce +#undef fp_div3 +#undef fp_encode +#undef fp_half +#undef fp_is_equal +#undef fp_is_zero +#undef fp_mul_small +#undef fp_neg +#undef fp_set_one +#undef fp_set_small +#undef fp_set_zero + +#define fp_copy SQISIGN_NAMESPACE(fp_copy) +#define fp_cswap SQISIGN_NAMESPACE(fp_cswap) +#define fp_decode SQISIGN_NAMESPACE(fp_decode) +#define fp_decode_reduce SQISIGN_NAMESPACE(fp_decode_reduce) +#define fp_div3 SQISIGN_NAMESPACE(fp_div3) +#define fp_encode SQISIGN_NAMESPACE(fp_encode) +#define fp_half SQISIGN_NAMESPACE(fp_half) +#define fp_is_equal SQISIGN_NAMESPACE(fp_is_equal) +#define fp_is_zero SQISIGN_NAMESPACE(fp_is_zero) +#define fp_mul_small SQISIGN_NAMESPACE(fp_mul_small) +#define fp_neg SQISIGN_NAMESPACE(fp_neg) +#define fp_set_one SQISIGN_NAMESPACE(fp_set_one) +#define fp_set_small SQISIGN_NAMESPACE(fp_set_small) +#define fp_set_zero SQISIGN_NAMESPACE(fp_set_zero) + +// Namespacing symbols exported from fp_p27500_64.c, fp_p5248_64.c, fp_p65376_64.c, gf27500.c, gf5248.c, gf65376.c: +#undef fp_add +#undef fp_mul +#undef fp_sqr +#undef fp_sub + +#define fp_add SQISIGN_NAMESPACE(fp_add) +#define fp_mul SQISIGN_NAMESPACE(fp_mul) +#define fp_sqr SQISIGN_NAMESPACE(fp_sqr) +#define fp_sub SQISIGN_NAMESPACE(fp_sub) + +// Namespacing symbols exported from gf27500.c: +#undef gf27500_decode +#undef gf27500_decode_reduce +#undef gf27500_div +#undef gf27500_div3 +#undef gf27500_encode +#undef gf27500_invert +#undef gf27500_legendre +#undef gf27500_sqrt + +#define gf27500_decode SQISIGN_NAMESPACE(gf27500_decode) +#define gf27500_decode_reduce SQISIGN_NAMESPACE(gf27500_decode_reduce) +#define gf27500_div SQISIGN_NAMESPACE(gf27500_div) +#define gf27500_div3 SQISIGN_NAMESPACE(gf27500_div3) +#define gf27500_encode SQISIGN_NAMESPACE(gf27500_encode) +#define gf27500_invert SQISIGN_NAMESPACE(gf27500_invert) +#define gf27500_legendre SQISIGN_NAMESPACE(gf27500_legendre) +#define gf27500_sqrt SQISIGN_NAMESPACE(gf27500_sqrt) + +// Namespacing symbols exported from gf27500.c, gf5248.c, gf65376.c: +#undef fp2_mul_c0 +#undef fp2_mul_c1 +#undef fp2_sq_c0 +#undef fp2_sq_c1 + +#define fp2_mul_c0 SQISIGN_NAMESPACE(fp2_mul_c0) +#define fp2_mul_c1 SQISIGN_NAMESPACE(fp2_mul_c1) +#define fp2_sq_c0 SQISIGN_NAMESPACE(fp2_sq_c0) +#define fp2_sq_c1 SQISIGN_NAMESPACE(fp2_sq_c1) + +// Namespacing symbols exported from gf5248.c: +#undef gf5248_decode +#undef gf5248_decode_reduce +#undef gf5248_div +#undef gf5248_div3 +#undef gf5248_encode +#undef gf5248_invert +#undef gf5248_legendre +#undef gf5248_sqrt + +#define gf5248_decode SQISIGN_NAMESPACE(gf5248_decode) +#define gf5248_decode_reduce SQISIGN_NAMESPACE(gf5248_decode_reduce) +#define gf5248_div SQISIGN_NAMESPACE(gf5248_div) +#define gf5248_div3 SQISIGN_NAMESPACE(gf5248_div3) +#define gf5248_encode SQISIGN_NAMESPACE(gf5248_encode) +#define gf5248_invert SQISIGN_NAMESPACE(gf5248_invert) +#define gf5248_legendre SQISIGN_NAMESPACE(gf5248_legendre) +#define gf5248_sqrt SQISIGN_NAMESPACE(gf5248_sqrt) + +// Namespacing symbols exported from gf65376.c: +#undef gf65376_decode +#undef gf65376_decode_reduce +#undef gf65376_div +#undef gf65376_div3 +#undef gf65376_encode +#undef gf65376_invert +#undef gf65376_legendre +#undef gf65376_sqrt + +#define gf65376_decode SQISIGN_NAMESPACE(gf65376_decode) +#define gf65376_decode_reduce SQISIGN_NAMESPACE(gf65376_decode_reduce) +#define gf65376_div SQISIGN_NAMESPACE(gf65376_div) +#define gf65376_div3 SQISIGN_NAMESPACE(gf65376_div3) +#define gf65376_encode SQISIGN_NAMESPACE(gf65376_encode) +#define gf65376_invert SQISIGN_NAMESPACE(gf65376_invert) +#define gf65376_legendre SQISIGN_NAMESPACE(gf65376_legendre) +#define gf65376_sqrt SQISIGN_NAMESPACE(gf65376_sqrt) + +// Namespacing symbols exported from hd.c: +#undef add_couple_jac_points +#undef copy_bases_to_kernel +#undef couple_jac_to_xz +#undef double_couple_jac_point +#undef double_couple_jac_point_iter +#undef double_couple_point +#undef double_couple_point_iter + +#define add_couple_jac_points SQISIGN_NAMESPACE(add_couple_jac_points) +#define copy_bases_to_kernel SQISIGN_NAMESPACE(copy_bases_to_kernel) +#define couple_jac_to_xz SQISIGN_NAMESPACE(couple_jac_to_xz) +#define double_couple_jac_point SQISIGN_NAMESPACE(double_couple_jac_point) +#define double_couple_jac_point_iter SQISIGN_NAMESPACE(double_couple_jac_point_iter) +#define double_couple_point SQISIGN_NAMESPACE(double_couple_point) +#define double_couple_point_iter SQISIGN_NAMESPACE(double_couple_point_iter) + +// Namespacing symbols exported from hnf.c: +#undef ibz_mat_4x4_is_hnf +#undef ibz_mat_4xn_hnf_mod_core +#undef ibz_vec_4_copy_mod +#undef ibz_vec_4_linear_combination_mod +#undef ibz_vec_4_scalar_mul_mod + +#define ibz_mat_4x4_is_hnf SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_is_hnf) +#define ibz_mat_4xn_hnf_mod_core SQISIGN_NAMESPACE_GENERIC(ibz_mat_4xn_hnf_mod_core) +#define ibz_vec_4_copy_mod SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_copy_mod) +#define ibz_vec_4_linear_combination_mod SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_linear_combination_mod) +#define ibz_vec_4_scalar_mul_mod SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_scalar_mul_mod) + +// Namespacing symbols exported from hnf_internal.c: +#undef ibz_centered_mod +#undef ibz_conditional_assign +#undef ibz_mod_not_zero +#undef ibz_xgcd_with_u_not_0 + +#define ibz_centered_mod SQISIGN_NAMESPACE_GENERIC(ibz_centered_mod) +#define ibz_conditional_assign SQISIGN_NAMESPACE_GENERIC(ibz_conditional_assign) +#define ibz_mod_not_zero SQISIGN_NAMESPACE_GENERIC(ibz_mod_not_zero) +#define ibz_xgcd_with_u_not_0 SQISIGN_NAMESPACE_GENERIC(ibz_xgcd_with_u_not_0) + +// Namespacing symbols exported from ibz_division.c: +#undef ibz_xgcd + +#define ibz_xgcd SQISIGN_NAMESPACE_GENERIC(ibz_xgcd) + +// Namespacing symbols exported from id2iso.c: +#undef change_of_basis_matrix_tate +#undef change_of_basis_matrix_tate_invert +#undef ec_biscalar_mul_ibz_vec +#undef endomorphism_application_even_basis +#undef id2iso_ideal_to_kernel_dlogs_even +#undef id2iso_kernel_dlogs_to_ideal_even +#undef matrix_application_even_basis + +#define change_of_basis_matrix_tate SQISIGN_NAMESPACE(change_of_basis_matrix_tate) +#define change_of_basis_matrix_tate_invert SQISIGN_NAMESPACE(change_of_basis_matrix_tate_invert) +#define ec_biscalar_mul_ibz_vec SQISIGN_NAMESPACE(ec_biscalar_mul_ibz_vec) +#define endomorphism_application_even_basis SQISIGN_NAMESPACE(endomorphism_application_even_basis) +#define id2iso_ideal_to_kernel_dlogs_even SQISIGN_NAMESPACE(id2iso_ideal_to_kernel_dlogs_even) +#define id2iso_kernel_dlogs_to_ideal_even SQISIGN_NAMESPACE(id2iso_kernel_dlogs_to_ideal_even) +#define matrix_application_even_basis SQISIGN_NAMESPACE(matrix_application_even_basis) + +// Namespacing symbols exported from ideal.c: +#undef quat_lideal_add +#undef quat_lideal_class_gram +#undef quat_lideal_conjugate_without_hnf +#undef quat_lideal_copy +#undef quat_lideal_create +#undef quat_lideal_create_principal +#undef quat_lideal_equals +#undef quat_lideal_generator +#undef quat_lideal_inter +#undef quat_lideal_inverse_lattice_without_hnf +#undef quat_lideal_mul +#undef quat_lideal_norm +#undef quat_lideal_right_order +#undef quat_lideal_right_transporter +#undef quat_order_discriminant +#undef quat_order_is_maximal + +#define quat_lideal_add SQISIGN_NAMESPACE_GENERIC(quat_lideal_add) +#define quat_lideal_class_gram SQISIGN_NAMESPACE_GENERIC(quat_lideal_class_gram) +#define quat_lideal_conjugate_without_hnf SQISIGN_NAMESPACE_GENERIC(quat_lideal_conjugate_without_hnf) +#define quat_lideal_copy SQISIGN_NAMESPACE_GENERIC(quat_lideal_copy) +#define quat_lideal_create SQISIGN_NAMESPACE_GENERIC(quat_lideal_create) +#define quat_lideal_create_principal SQISIGN_NAMESPACE_GENERIC(quat_lideal_create_principal) +#define quat_lideal_equals SQISIGN_NAMESPACE_GENERIC(quat_lideal_equals) +#define quat_lideal_generator SQISIGN_NAMESPACE_GENERIC(quat_lideal_generator) +#define quat_lideal_inter SQISIGN_NAMESPACE_GENERIC(quat_lideal_inter) +#define quat_lideal_inverse_lattice_without_hnf SQISIGN_NAMESPACE_GENERIC(quat_lideal_inverse_lattice_without_hnf) +#define quat_lideal_mul SQISIGN_NAMESPACE_GENERIC(quat_lideal_mul) +#define quat_lideal_norm SQISIGN_NAMESPACE_GENERIC(quat_lideal_norm) +#define quat_lideal_right_order SQISIGN_NAMESPACE_GENERIC(quat_lideal_right_order) +#define quat_lideal_right_transporter SQISIGN_NAMESPACE_GENERIC(quat_lideal_right_transporter) +#define quat_order_discriminant SQISIGN_NAMESPACE_GENERIC(quat_order_discriminant) +#define quat_order_is_maximal SQISIGN_NAMESPACE_GENERIC(quat_order_is_maximal) + +// Namespacing symbols exported from intbig.c: +#undef ibz_abs +#undef ibz_add +#undef ibz_bitsize +#undef ibz_cmp +#undef ibz_cmp_int32 +#undef ibz_convert_to_str +#undef ibz_copy +#undef ibz_copy_digits +#undef ibz_div +#undef ibz_div_2exp +#undef ibz_div_floor +#undef ibz_divides +#undef ibz_finalize +#undef ibz_gcd +#undef ibz_get +#undef ibz_init +#undef ibz_invmod +#undef ibz_is_even +#undef ibz_is_odd +#undef ibz_is_one +#undef ibz_is_zero +#undef ibz_legendre +#undef ibz_mod +#undef ibz_mod_ui +#undef ibz_mul +#undef ibz_neg +#undef ibz_pow +#undef ibz_pow_mod +#undef ibz_print +#undef ibz_probab_prime +#undef ibz_rand_interval +#undef ibz_rand_interval_bits +#undef ibz_rand_interval_i +#undef ibz_rand_interval_minm_m +#undef ibz_set +#undef ibz_set_from_str +#undef ibz_size_in_base +#undef ibz_sqrt +#undef ibz_sqrt_floor +#undef ibz_sqrt_mod_p +#undef ibz_sub +#undef ibz_swap +#undef ibz_to_digits +#undef ibz_two_adic + +#define ibz_abs SQISIGN_NAMESPACE_GENERIC(ibz_abs) +#define ibz_add SQISIGN_NAMESPACE_GENERIC(ibz_add) +#define ibz_bitsize SQISIGN_NAMESPACE_GENERIC(ibz_bitsize) +#define ibz_cmp SQISIGN_NAMESPACE_GENERIC(ibz_cmp) +#define ibz_cmp_int32 SQISIGN_NAMESPACE_GENERIC(ibz_cmp_int32) +#define ibz_convert_to_str SQISIGN_NAMESPACE_GENERIC(ibz_convert_to_str) +#define ibz_copy SQISIGN_NAMESPACE_GENERIC(ibz_copy) +#define ibz_copy_digits SQISIGN_NAMESPACE_GENERIC(ibz_copy_digits) +#define ibz_div SQISIGN_NAMESPACE_GENERIC(ibz_div) +#define ibz_div_2exp SQISIGN_NAMESPACE_GENERIC(ibz_div_2exp) +#define ibz_div_floor SQISIGN_NAMESPACE_GENERIC(ibz_div_floor) +#define ibz_divides SQISIGN_NAMESPACE_GENERIC(ibz_divides) +#define ibz_finalize SQISIGN_NAMESPACE_GENERIC(ibz_finalize) +#define ibz_gcd SQISIGN_NAMESPACE_GENERIC(ibz_gcd) +#define ibz_get SQISIGN_NAMESPACE_GENERIC(ibz_get) +#define ibz_init SQISIGN_NAMESPACE_GENERIC(ibz_init) +#define ibz_invmod SQISIGN_NAMESPACE_GENERIC(ibz_invmod) +#define ibz_is_even SQISIGN_NAMESPACE_GENERIC(ibz_is_even) +#define ibz_is_odd SQISIGN_NAMESPACE_GENERIC(ibz_is_odd) +#define ibz_is_one SQISIGN_NAMESPACE_GENERIC(ibz_is_one) +#define ibz_is_zero SQISIGN_NAMESPACE_GENERIC(ibz_is_zero) +#define ibz_legendre SQISIGN_NAMESPACE_GENERIC(ibz_legendre) +#define ibz_mod SQISIGN_NAMESPACE_GENERIC(ibz_mod) +#define ibz_mod_ui SQISIGN_NAMESPACE_GENERIC(ibz_mod_ui) +#define ibz_mul SQISIGN_NAMESPACE_GENERIC(ibz_mul) +#define ibz_neg SQISIGN_NAMESPACE_GENERIC(ibz_neg) +#define ibz_pow SQISIGN_NAMESPACE_GENERIC(ibz_pow) +#define ibz_pow_mod SQISIGN_NAMESPACE_GENERIC(ibz_pow_mod) +#define ibz_print SQISIGN_NAMESPACE_GENERIC(ibz_print) +#define ibz_probab_prime SQISIGN_NAMESPACE_GENERIC(ibz_probab_prime) +#define ibz_rand_interval SQISIGN_NAMESPACE_GENERIC(ibz_rand_interval) +#define ibz_rand_interval_bits SQISIGN_NAMESPACE_GENERIC(ibz_rand_interval_bits) +#define ibz_rand_interval_i SQISIGN_NAMESPACE_GENERIC(ibz_rand_interval_i) +#define ibz_rand_interval_minm_m SQISIGN_NAMESPACE_GENERIC(ibz_rand_interval_minm_m) +#define ibz_set SQISIGN_NAMESPACE_GENERIC(ibz_set) +#define ibz_set_from_str SQISIGN_NAMESPACE_GENERIC(ibz_set_from_str) +#define ibz_size_in_base SQISIGN_NAMESPACE_GENERIC(ibz_size_in_base) +#define ibz_sqrt SQISIGN_NAMESPACE_GENERIC(ibz_sqrt) +#define ibz_sqrt_floor SQISIGN_NAMESPACE_GENERIC(ibz_sqrt_floor) +#define ibz_sqrt_mod_p SQISIGN_NAMESPACE_GENERIC(ibz_sqrt_mod_p) +#define ibz_sub SQISIGN_NAMESPACE_GENERIC(ibz_sub) +#define ibz_swap SQISIGN_NAMESPACE_GENERIC(ibz_swap) +#define ibz_to_digits SQISIGN_NAMESPACE_GENERIC(ibz_to_digits) +#define ibz_two_adic SQISIGN_NAMESPACE_GENERIC(ibz_two_adic) + +// Namespacing symbols exported from integers.c: +#undef ibz_cornacchia_prime +#undef ibz_generate_random_prime + +#define ibz_cornacchia_prime SQISIGN_NAMESPACE_GENERIC(ibz_cornacchia_prime) +#define ibz_generate_random_prime SQISIGN_NAMESPACE_GENERIC(ibz_generate_random_prime) + +// Namespacing symbols exported from isog_chains.c: +#undef ec_eval_even +#undef ec_eval_small_chain +#undef ec_iso_eval +#undef ec_isomorphism + +#define ec_eval_even SQISIGN_NAMESPACE(ec_eval_even) +#define ec_eval_small_chain SQISIGN_NAMESPACE(ec_eval_small_chain) +#define ec_iso_eval SQISIGN_NAMESPACE(ec_iso_eval) +#define ec_isomorphism SQISIGN_NAMESPACE(ec_isomorphism) + +// Namespacing symbols exported from keygen.c: +#undef protocols_keygen +#undef secret_key_finalize +#undef secret_key_init + +#define protocols_keygen SQISIGN_NAMESPACE(protocols_keygen) +#define secret_key_finalize SQISIGN_NAMESPACE(secret_key_finalize) +#define secret_key_init SQISIGN_NAMESPACE(secret_key_init) + +// Namespacing symbols exported from l2.c: +#undef quat_lattice_lll +#undef quat_lll_core + +#define quat_lattice_lll SQISIGN_NAMESPACE_GENERIC(quat_lattice_lll) +#define quat_lll_core SQISIGN_NAMESPACE_GENERIC(quat_lll_core) + +// Namespacing symbols exported from lat_ball.c: +#undef quat_lattice_bound_parallelogram +#undef quat_lattice_sample_from_ball + +#define quat_lattice_bound_parallelogram SQISIGN_NAMESPACE_GENERIC(quat_lattice_bound_parallelogram) +#define quat_lattice_sample_from_ball SQISIGN_NAMESPACE_GENERIC(quat_lattice_sample_from_ball) + +// Namespacing symbols exported from lattice.c: +#undef quat_lattice_add +#undef quat_lattice_alg_elem_mul +#undef quat_lattice_conjugate_without_hnf +#undef quat_lattice_contains +#undef quat_lattice_dual_without_hnf +#undef quat_lattice_equal +#undef quat_lattice_gram +#undef quat_lattice_hnf +#undef quat_lattice_inclusion +#undef quat_lattice_index +#undef quat_lattice_intersect +#undef quat_lattice_mat_alg_coord_mul_without_hnf +#undef quat_lattice_mul +#undef quat_lattice_reduce_denom + +#define quat_lattice_add SQISIGN_NAMESPACE_GENERIC(quat_lattice_add) +#define quat_lattice_alg_elem_mul SQISIGN_NAMESPACE_GENERIC(quat_lattice_alg_elem_mul) +#define quat_lattice_conjugate_without_hnf SQISIGN_NAMESPACE_GENERIC(quat_lattice_conjugate_without_hnf) +#define quat_lattice_contains SQISIGN_NAMESPACE_GENERIC(quat_lattice_contains) +#define quat_lattice_dual_without_hnf SQISIGN_NAMESPACE_GENERIC(quat_lattice_dual_without_hnf) +#define quat_lattice_equal SQISIGN_NAMESPACE_GENERIC(quat_lattice_equal) +#define quat_lattice_gram SQISIGN_NAMESPACE_GENERIC(quat_lattice_gram) +#define quat_lattice_hnf SQISIGN_NAMESPACE_GENERIC(quat_lattice_hnf) +#define quat_lattice_inclusion SQISIGN_NAMESPACE_GENERIC(quat_lattice_inclusion) +#define quat_lattice_index SQISIGN_NAMESPACE_GENERIC(quat_lattice_index) +#define quat_lattice_intersect SQISIGN_NAMESPACE_GENERIC(quat_lattice_intersect) +#define quat_lattice_mat_alg_coord_mul_without_hnf SQISIGN_NAMESPACE_GENERIC(quat_lattice_mat_alg_coord_mul_without_hnf) +#define quat_lattice_mul SQISIGN_NAMESPACE_GENERIC(quat_lattice_mul) +#define quat_lattice_reduce_denom SQISIGN_NAMESPACE_GENERIC(quat_lattice_reduce_denom) + +// Namespacing symbols exported from lll_applications.c: +#undef quat_lideal_lideal_mul_reduced +#undef quat_lideal_prime_norm_reduced_equivalent +#undef quat_lideal_reduce_basis + +#define quat_lideal_lideal_mul_reduced SQISIGN_NAMESPACE_GENERIC(quat_lideal_lideal_mul_reduced) +#define quat_lideal_prime_norm_reduced_equivalent SQISIGN_NAMESPACE_GENERIC(quat_lideal_prime_norm_reduced_equivalent) +#define quat_lideal_reduce_basis SQISIGN_NAMESPACE_GENERIC(quat_lideal_reduce_basis) + +// Namespacing symbols exported from lll_verification.c: +#undef ibq_vec_4_copy_ibz +#undef quat_lll_bilinear +#undef quat_lll_gram_schmidt_transposed_with_ibq +#undef quat_lll_set_ibq_parameters +#undef quat_lll_verify + +#define ibq_vec_4_copy_ibz SQISIGN_NAMESPACE_GENERIC(ibq_vec_4_copy_ibz) +#define quat_lll_bilinear SQISIGN_NAMESPACE_GENERIC(quat_lll_bilinear) +#define quat_lll_gram_schmidt_transposed_with_ibq SQISIGN_NAMESPACE_GENERIC(quat_lll_gram_schmidt_transposed_with_ibq) +#define quat_lll_set_ibq_parameters SQISIGN_NAMESPACE_GENERIC(quat_lll_set_ibq_parameters) +#define quat_lll_verify SQISIGN_NAMESPACE_GENERIC(quat_lll_verify) + +// Namespacing symbols exported from mem.c: +#undef sqisign_secure_clear +#undef sqisign_secure_free + +#define sqisign_secure_clear SQISIGN_NAMESPACE_GENERIC(sqisign_secure_clear) +#define sqisign_secure_free SQISIGN_NAMESPACE_GENERIC(sqisign_secure_free) + +// Namespacing symbols exported from mp.c: +#undef MUL +#undef mp_add +#undef mp_compare +#undef mp_copy +#undef mp_inv_2e +#undef mp_invert_matrix +#undef mp_is_one +#undef mp_is_zero +#undef mp_mod_2exp +#undef mp_mul +#undef mp_mul2 +#undef mp_neg +#undef mp_print +#undef mp_shiftl +#undef mp_shiftr +#undef mp_sub +#undef multiple_mp_shiftl +#undef select_ct +#undef swap_ct + +#define MUL SQISIGN_NAMESPACE_GENERIC(MUL) +#define mp_add SQISIGN_NAMESPACE_GENERIC(mp_add) +#define mp_compare SQISIGN_NAMESPACE_GENERIC(mp_compare) +#define mp_copy SQISIGN_NAMESPACE_GENERIC(mp_copy) +#define mp_inv_2e SQISIGN_NAMESPACE_GENERIC(mp_inv_2e) +#define mp_invert_matrix SQISIGN_NAMESPACE_GENERIC(mp_invert_matrix) +#define mp_is_one SQISIGN_NAMESPACE_GENERIC(mp_is_one) +#define mp_is_zero SQISIGN_NAMESPACE_GENERIC(mp_is_zero) +#define mp_mod_2exp SQISIGN_NAMESPACE_GENERIC(mp_mod_2exp) +#define mp_mul SQISIGN_NAMESPACE_GENERIC(mp_mul) +#define mp_mul2 SQISIGN_NAMESPACE_GENERIC(mp_mul2) +#define mp_neg SQISIGN_NAMESPACE_GENERIC(mp_neg) +#define mp_print SQISIGN_NAMESPACE_GENERIC(mp_print) +#define mp_shiftl SQISIGN_NAMESPACE_GENERIC(mp_shiftl) +#define mp_shiftr SQISIGN_NAMESPACE_GENERIC(mp_shiftr) +#define mp_sub SQISIGN_NAMESPACE_GENERIC(mp_sub) +#define multiple_mp_shiftl SQISIGN_NAMESPACE_GENERIC(multiple_mp_shiftl) +#define select_ct SQISIGN_NAMESPACE_GENERIC(select_ct) +#define swap_ct SQISIGN_NAMESPACE_GENERIC(swap_ct) + +// Namespacing symbols exported from normeq.c: +#undef quat_change_to_O0_basis +#undef quat_lattice_O0_set +#undef quat_lattice_O0_set_extremal +#undef quat_order_elem_create +#undef quat_represent_integer +#undef quat_sampling_random_ideal_O0_given_norm + +#define quat_change_to_O0_basis SQISIGN_NAMESPACE_GENERIC(quat_change_to_O0_basis) +#define quat_lattice_O0_set SQISIGN_NAMESPACE_GENERIC(quat_lattice_O0_set) +#define quat_lattice_O0_set_extremal SQISIGN_NAMESPACE_GENERIC(quat_lattice_O0_set_extremal) +#define quat_order_elem_create SQISIGN_NAMESPACE_GENERIC(quat_order_elem_create) +#define quat_represent_integer SQISIGN_NAMESPACE_GENERIC(quat_represent_integer) +#define quat_sampling_random_ideal_O0_given_norm SQISIGN_NAMESPACE_GENERIC(quat_sampling_random_ideal_O0_given_norm) + +// Namespacing symbols exported from printer.c: +#undef ibz_mat_2x2_print +#undef ibz_mat_4x4_print +#undef ibz_vec_2_print +#undef ibz_vec_4_print +#undef quat_alg_elem_print +#undef quat_alg_print +#undef quat_lattice_print +#undef quat_left_ideal_print + +#define ibz_mat_2x2_print SQISIGN_NAMESPACE_GENERIC(ibz_mat_2x2_print) +#define ibz_mat_4x4_print SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_print) +#define ibz_vec_2_print SQISIGN_NAMESPACE_GENERIC(ibz_vec_2_print) +#define ibz_vec_4_print SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_print) +#define quat_alg_elem_print SQISIGN_NAMESPACE_GENERIC(quat_alg_elem_print) +#define quat_alg_print SQISIGN_NAMESPACE_GENERIC(quat_alg_print) +#define quat_lattice_print SQISIGN_NAMESPACE_GENERIC(quat_lattice_print) +#define quat_left_ideal_print SQISIGN_NAMESPACE_GENERIC(quat_left_ideal_print) + +// Namespacing symbols exported from random_input_generation.c: +#undef quat_test_input_random_ideal_generation +#undef quat_test_input_random_ideal_lattice_generation +#undef quat_test_input_random_lattice_generation + +#define quat_test_input_random_ideal_generation SQISIGN_NAMESPACE_GENERIC(quat_test_input_random_ideal_generation) +#define quat_test_input_random_ideal_lattice_generation SQISIGN_NAMESPACE_GENERIC(quat_test_input_random_ideal_lattice_generation) +#define quat_test_input_random_lattice_generation SQISIGN_NAMESPACE_GENERIC(quat_test_input_random_lattice_generation) + +// Namespacing symbols exported from rationals.c: +#undef ibq_abs +#undef ibq_add +#undef ibq_cmp +#undef ibq_copy +#undef ibq_finalize +#undef ibq_init +#undef ibq_inv +#undef ibq_is_ibz +#undef ibq_is_one +#undef ibq_is_zero +#undef ibq_mat_4x4_finalize +#undef ibq_mat_4x4_init +#undef ibq_mat_4x4_print +#undef ibq_mul +#undef ibq_neg +#undef ibq_reduce +#undef ibq_set +#undef ibq_sub +#undef ibq_to_ibz +#undef ibq_vec_4_finalize +#undef ibq_vec_4_init +#undef ibq_vec_4_print + +#define ibq_abs SQISIGN_NAMESPACE_GENERIC(ibq_abs) +#define ibq_add SQISIGN_NAMESPACE_GENERIC(ibq_add) +#define ibq_cmp SQISIGN_NAMESPACE_GENERIC(ibq_cmp) +#define ibq_copy SQISIGN_NAMESPACE_GENERIC(ibq_copy) +#define ibq_finalize SQISIGN_NAMESPACE_GENERIC(ibq_finalize) +#define ibq_init SQISIGN_NAMESPACE_GENERIC(ibq_init) +#define ibq_inv SQISIGN_NAMESPACE_GENERIC(ibq_inv) +#define ibq_is_ibz SQISIGN_NAMESPACE_GENERIC(ibq_is_ibz) +#define ibq_is_one SQISIGN_NAMESPACE_GENERIC(ibq_is_one) +#define ibq_is_zero SQISIGN_NAMESPACE_GENERIC(ibq_is_zero) +#define ibq_mat_4x4_finalize SQISIGN_NAMESPACE_GENERIC(ibq_mat_4x4_finalize) +#define ibq_mat_4x4_init SQISIGN_NAMESPACE_GENERIC(ibq_mat_4x4_init) +#define ibq_mat_4x4_print SQISIGN_NAMESPACE_GENERIC(ibq_mat_4x4_print) +#define ibq_mul SQISIGN_NAMESPACE_GENERIC(ibq_mul) +#define ibq_neg SQISIGN_NAMESPACE_GENERIC(ibq_neg) +#define ibq_reduce SQISIGN_NAMESPACE_GENERIC(ibq_reduce) +#define ibq_set SQISIGN_NAMESPACE_GENERIC(ibq_set) +#define ibq_sub SQISIGN_NAMESPACE_GENERIC(ibq_sub) +#define ibq_to_ibz SQISIGN_NAMESPACE_GENERIC(ibq_to_ibz) +#define ibq_vec_4_finalize SQISIGN_NAMESPACE_GENERIC(ibq_vec_4_finalize) +#define ibq_vec_4_init SQISIGN_NAMESPACE_GENERIC(ibq_vec_4_init) +#define ibq_vec_4_print SQISIGN_NAMESPACE_GENERIC(ibq_vec_4_print) + +// Namespacing symbols exported from sign.c: +#undef protocols_sign + +#define protocols_sign SQISIGN_NAMESPACE(protocols_sign) + +// Namespacing symbols exported from sqisign.c: +#undef sqisign_keypair +#undef sqisign_open +#undef sqisign_sign +#undef sqisign_verify + +#define sqisign_keypair SQISIGN_NAMESPACE(sqisign_keypair) +#define sqisign_open SQISIGN_NAMESPACE(sqisign_open) +#define sqisign_sign SQISIGN_NAMESPACE(sqisign_sign) +#define sqisign_verify SQISIGN_NAMESPACE(sqisign_verify) + +// Namespacing symbols exported from theta_isogenies.c: +#undef theta_chain_compute_and_eval +#undef theta_chain_compute_and_eval_randomized +#undef theta_chain_compute_and_eval_verify + +#define theta_chain_compute_and_eval SQISIGN_NAMESPACE(theta_chain_compute_and_eval) +#define theta_chain_compute_and_eval_randomized SQISIGN_NAMESPACE(theta_chain_compute_and_eval_randomized) +#define theta_chain_compute_and_eval_verify SQISIGN_NAMESPACE(theta_chain_compute_and_eval_verify) + +// Namespacing symbols exported from theta_structure.c: +#undef double_iter +#undef double_point +#undef is_product_theta_point +#undef theta_precomputation + +#define double_iter SQISIGN_NAMESPACE(double_iter) +#define double_point SQISIGN_NAMESPACE(double_point) +#define is_product_theta_point SQISIGN_NAMESPACE(is_product_theta_point) +#define theta_precomputation SQISIGN_NAMESPACE(theta_precomputation) + +// Namespacing symbols exported from verify.c: +#undef protocols_verify + +#define protocols_verify SQISIGN_NAMESPACE(protocols_verify) + +// Namespacing symbols exported from xeval.c: +#undef xeval_2 +#undef xeval_2_singular +#undef xeval_4 + +#define xeval_2 SQISIGN_NAMESPACE(xeval_2) +#define xeval_2_singular SQISIGN_NAMESPACE(xeval_2_singular) +#define xeval_4 SQISIGN_NAMESPACE(xeval_4) + +// Namespacing symbols exported from xisog.c: +#undef xisog_2 +#undef xisog_2_singular +#undef xisog_4 + +#define xisog_2 SQISIGN_NAMESPACE(xisog_2) +#define xisog_2_singular SQISIGN_NAMESPACE(xisog_2_singular) +#define xisog_4 SQISIGN_NAMESPACE(xisog_4) + + +#endif + diff --git a/scripts/Namespace.scala b/scripts/Namespace.scala new file mode 100644 index 0000000..129b1cc --- /dev/null +++ b/scripts/Namespace.scala @@ -0,0 +1,148 @@ +import io.StdIn.readLine + +// 1. #define DISABLE_NAMESPACING in sqisign_namespace.h +// 2. build (cmake and make) +// 3. find . -name '*.a' -exec nm {} \; | grep '.c.o:\|T ' | scala ../scripts/Namespace.scala > sqisign_namespace.h +// 4. cp sqisign_namespace.h $SQISIGN_DIR/include + +object Namespace extends App { + + val PREAMBLE = """ +#ifndef SQISIGN_NAMESPACE_H +#define SQISIGN_NAMESPACE_H + +//#define DISABLE_NAMESPACING + +#if defined(_WIN32) +#define SQISIGN_API __declspec(dllexport) +#else +#define SQISIGN_API __attribute__((visibility("default"))) +#endif + +#define PARAM_JOIN3_(a, b, c) sqisign_##a##_##b##_##c +#define PARAM_JOIN3(a, b, c) PARAM_JOIN3_(a, b, c) +#define PARAM_NAME3(end, s) PARAM_JOIN3(SQISIGN_VARIANT, end, s) + +#define PARAM_JOIN2_(a, b) sqisign_##a##_##b +#define PARAM_JOIN2(a, b) PARAM_JOIN2_(a, b) +#define PARAM_NAME2(end, s) PARAM_JOIN2(end, s) + +#ifndef DISABLE_NAMESPACING +#define SQISIGN_NAMESPACE_GENERIC(s) PARAM_NAME2(gen, s) +#else +#define SQISIGN_NAMESPACE_GENERIC(s) s +#endif + +#if defined(SQISIGN_VARIANT) && !defined(DISABLE_NAMESPACING) +#if defined(SQISIGN_BUILD_TYPE_REF) +#define SQISIGN_NAMESPACE(s) PARAM_NAME3(ref, s) +#elif defined(SQISIGN_BUILD_TYPE_OPT) +#define SQISIGN_NAMESPACE(s) PARAM_NAME3(opt, s) +#elif defined(SQISIGN_BUILD_TYPE_BROADWELL) +#define SQISIGN_NAMESPACE(s) PARAM_NAME3(broadwell, s) +#elif defined(SQISIGN_BUILD_TYPE_ARM64CRYPTO) +#define SQISIGN_NAMESPACE(s) PARAM_NAME3(arm64crypto, s) +#else +#error "Build type not known" +#endif + +#else +#define SQISIGN_NAMESPACE(s) s +#endif +""" + + val EPILOGUE = """ +#endif +""" + + val x = Iterator + .continually(readLine) + .takeWhile(_ != null).toList + + var scfile = "" + val allFuns: List[(String, String)] = x.flatMap { + case i if i.contains(".c.o:") => + scfile = i + None + case i => + i.split(" ").last match { + case j if j.startsWith("_") => + Some((j.substring(1), scfile)) + case j => + Some((j, scfile)) + } + + }. // removing duplicates.. + groupBy(_._1).mapValues(k => k.distinct.toList.sortBy(_._2).reduceLeft((i,j) => ((i._1, s"${i._2}, ${j._2}")))).values.toList + + val maxFunLen = allFuns.map(i => i._1.length).max + + val filterFiles = List( + "fips202.c", + "tools.c", + "randombytes_system.c", + "randombytes_ctrdrbg.c", + "randombytes_ctrdrbg_aesni.c", + "foo.c", + "aes_c.c", + "aes_ni.c", + "ctr_drbg.c" + ) + + val genericFiles = List( + // quaternion module + "intbig.c", + "algebra.c", + "ideal.c", + "dim4.c", + "dim2.c", + "integers.c", + "lattice.c", + "lat_ball.c", + "finit.c", + "printer.c", + "rationals.c", + "l2.c", + "lll_verification.c", + "lll_applications.c", + "rationals.c", + "normeq.c", + "ibz_division.c", + "hnf_internal.c", + "hnf.c", + "random_input_generation.c", + "mem.c", + // mp module + "mp.c" + ).map(i => s"$i.o:") + + val groupedByFile = + allFuns. + groupBy(_._2). + map(i => (i._1, i._2.distinct.sorted)). + filter(i => filterFiles.forall(j => !i._1.contains(j))).toList.sortBy(_._1) + + println(PREAMBLE) + + + + groupedByFile.foreach(i => { + println(s"// Namespacing symbols exported from ${i._1.replaceAll("\\.o:", "")}:") + i._2.foreach(j => + println(s"#undef ${j._1}") + ) + println + i._2.foreach(j => { + val padded = j._1.padTo(maxFunLen, " ").mkString + if (genericFiles.contains(j._2)) { + println(s"#define $padded SQISIGN_NAMESPACE_GENERIC(${j._1})") + } else { + println(s"#define $padded SQISIGN_NAMESPACE(${j._1})") + } + } + ) + println + }) + + println(EPILOGUE) +} \ No newline at end of file diff --git a/scripts/cformat.py b/scripts/cformat.py deleted file mode 100644 index 21e8dfd..0000000 --- a/scripts/cformat.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env python3 -import sys, itertools -from math import floor, log -import sage.all - -class Ibz: - def __init__(self, v): - self.v = int(v) - def _literal(self, sz): - val = int(self.v) - sgn = val < 0 - num_limbs = (abs(val).bit_length() + sz-1) // sz if val else 0 - limbs = [(abs(val) >> sz*i) & (2**sz-1) for i in range(num_limbs or 1)] - data = { - '._mp_alloc': 0, - '._mp_size': (-1)**sgn * num_limbs, - '._mp_d': '(mp_limb_t[]) {' + ','.join(map(hex,limbs)) + '}', - } - return '{{' + ', '.join(f'{k} = {v}' for k,v in data.items()) + '}}' - -class Object: - def __init__(self, ty, name, obj): - if '[' in ty: - idx = ty.index('[') - depth = ty.count('[]') - def rec(os, d): - assert d >= 0 - if not d: - return () - assert isinstance(os,list) or isinstance(os,tuple) - r, = {rec(o, d-1) for o in os} - return (len(os),) + r - dims = rec(obj, depth) - self.ty = ty[:idx], ''.join(f'[{d}]' for d in dims) - else: - self.ty = ty, '' - self.name = name - self.obj = obj - - def _declaration(self): - return f'extern const {self.ty[0]} {self.name}{self.ty[1]};' - - def _literal(self, mp_limb_t_bits): - def rec(obj): - if isinstance(obj, int): - return hex(obj) - if isinstance(obj, sage.all.Integer): - return hex(obj) - if isinstance(obj, Ibz): - return obj._literal(mp_limb_t_bits) - if isinstance(obj, list) or isinstance(obj, tuple): - return '{' + ', '.join(map(rec, obj)) + '}' - raise NotImplementedError(f'unknown type {type(obj)} in Formatter') - return rec(self.obj) - - def _definition(self, mp_limb_t_bits): - return f'const {self.ty[0]} {self.name}{self.ty[1]} = ' + self._literal(mp_limb_t_bits) + ';' - - -class ObjectFormatter: - def __init__(self, objs): - self.objs = objs - - def header(self, file=None): - for obj in self.objs: - assert isinstance(obj, Object) - print(obj._declaration(), file=file) - - def implementation(self, file=None): - print('#if 0', file=file) - for sz in (16, 32, 64): - print(f'#elif 8*DIGIT_LEN == {sz}', file=file) - for obj in self.objs: - assert isinstance(obj, Object) - print(obj._definition(sz), file=file) - print('#endif', file=file) - - - -def field(v, F=None): - if F: - v = F(v) - p = F.characteristic() - l = 1 + floor(log(p,2**64)) - vs = [[(c >> 64*i) & (2**64-1) for i in range(l)] for c in v] - return vs - -def xonly(T, *args): - if not T: raise NotImplementedError('is point at infinity') - x, _ = T.xy() - return field(x, *args) - diff --git a/scripts/check_namespace.sh b/scripts/check_namespace.sh new file mode 100755 index 0000000..cbae335 --- /dev/null +++ b/scripts/check_namespace.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +set -e + +if [ ! -f "include/sqisign_namespace.h" ]; then + echo "Please run script from the sqisign root directory" + exit 1 +fi + +if [[ "$OSTYPE" == "darwin"* ]]; then + sed -i '' 's|//#define DISABLE_NAMESPACING|#define DISABLE_NAMESPACING|' ./include/sqisign_namespace.h +else + sed -i 's|//#define DISABLE_NAMESPACING|#define DISABLE_NAMESPACING|' ./include/sqisign_namespace.h +fi + +mkdir -p build_broadwell && cd build_broadwell && cmake -DSQISIGN_BUILD_TYPE=broadwell .. && make -j8 && cd .. +mkdir -p build && cd build && cmake .. && make -j8 +find . ../build_broadwell -name '*.a' -exec nm {} \; | grep '.c.o:\|T ' | scala -nc ../scripts/Namespace.scala > sqisign_namespace.h + +if [[ "$OSTYPE" == "darwin"* ]]; then + sed -i '' 's|#define DISABLE_NAMESPACING|//#define DISABLE_NAMESPACING|' ../include/sqisign_namespace.h +else + sed -i 's|#define DISABLE_NAMESPACING|//#define DISABLE_NAMESPACING|' ../include/sqisign_namespace.h +fi + +diff sqisign_namespace.h ../include/sqisign_namespace.h + + +# Check the exit code of diff +if [ $? -eq 0 ]; then + echo "No change in namespace." + exit 0 +else + echo "Namespace changed, please update." + exit 1 +fi diff --git a/scripts/gen_kat_files.sh b/scripts/gen_kat_files.sh new file mode 100755 index 0000000..9ee5a5a --- /dev/null +++ b/scripts/gen_kat_files.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +echo 'Running Script for Level 1...' +./build/apps/PQCgenKAT_sign_lvl1 +mv PQCsignKAT_353_SQIsign_lvl1.req ./KAT/PQCsignKAT_353_SQIsign_lvl1.req +mv PQCsignKAT_353_SQIsign_lvl1.rsp ./KAT/PQCsignKAT_353_SQIsign_lvl1.rsp + +echo 'Running Script for Level 3...' +./build/apps/PQCgenKAT_sign_lvl3 +mv PQCsignKAT_529_SQIsign_lvl3.req ./KAT/PQCsignKAT_529_SQIsign_lvl3.req +mv PQCsignKAT_529_SQIsign_lvl3.rsp ./KAT/PQCsignKAT_529_SQIsign_lvl3.rsp + +echo 'Running Script for Level 5...' +./build/apps/PQCgenKAT_sign_lvl5 +mv PQCsignKAT_701_SQIsign_lvl5.req ./KAT/PQCsignKAT_701_SQIsign_lvl5.req +mv PQCsignKAT_701_SQIsign_lvl5.rsp ./KAT/PQCsignKAT_701_SQIsign_lvl5.rsp diff --git a/scripts/gen_pqm4_sources.sh b/scripts/gen_pqm4_sources.sh new file mode 100755 index 0000000..0a95409 --- /dev/null +++ b/scripts/gen_pqm4_sources.sh @@ -0,0 +1,60 @@ +#!/bin/bash + +# This script should be run in the root folder of the repository, and creates pqm4 files in "src/pqm4/sqisign{1,3,5}" + +if [ -d "src/pqm4" ]; then + echo Destination folder src/pqm4 already exists. Delete it before running this script. Aborting. + exit 1 +fi + +for LEVEL in 1 3 5 +do + LVL=lvl${LEVEL} + DST_PATH=src/pqm4/sqisign_${LVL}/ref + + PQCGENKAT_SIGN_PQM4_BINARY=build/apps/PQCgenKAT_sign_pqm4_${LVL} + + if [ ! -f ${PQCGENKAT_SIGN_PQM4_BINARY} ]; then + echo ${PQCGENKAT_SIGN_PQM4_BINARY} not found. Build it before running this script, or change the build folder in the script. Aborting. + exit 1 + fi + + mkdir -p ${DST_PATH} + + # Run API generation script + ${PQCGENKAT_SIGN_PQM4_BINARY} + + CPPFLAGS="-DRADIX_32 -DSQISIGN_BUILD_TYPE_REF -DSQISIGN_GF_IMPL_REF -DSQISIGN_VARIANT=${LVL} -DTARGET_ARM -DTARGET_OS_OTHER -DNDEBUG -DDISABLE_NAMESPACING -DBIG_PUBLIC_KEY_TESTS" + PQM4_NAME="crypto_sign_sqisign_${LVL}_ref" + + echo "elf/${PQM4_NAME}_%.elf: CPPFLAGS+=${CPPFLAGS}" > ${DST_PATH}/config.mk + echo "obj/lib${PQM4_NAME}.a: CPPFLAGS+=${CPPFLAGS}" >> ${DST_PATH}/config.mk + + cp include/{sig,sqisign_namespace}.h ${DST_PATH}/ + + cp src/sqisign.c ${DST_PATH}/ + + cp src/common/generic/include/{tools,tutil}.h ${DST_PATH}/ + + cp src/ec/ref/lvlx/{basis,ec_jac,ec,isog_chains,xeval,xisog}.c ${DST_PATH}/ + cp src/ec/ref/include/{ec,isog}.h ${DST_PATH}/ + + cp src/gf/ref/lvlx/{fp,fp2}.c ${DST_PATH}/ + cp src/gf/ref/include/{fp,fp2}.h ${DST_PATH}/ + + cp src/hd/ref/lvlx/{hd.c,theta_isogenies.c,theta_isogenies.h,theta_structure.c,theta_structure.h} ${DST_PATH}/ + cp src/hd/ref/include/hd.h ${DST_PATH}/ + + cp src/mp/ref/generic/mp.c ${DST_PATH}/ + cp src/mp/ref/generic/include/mp.h ${DST_PATH}/ + + cp src/precomp/ref/${LVL}/include/{e0_basis,ec_params,encoded_sizes,fp_constants,hd_splitting_transforms}.h ${DST_PATH}/ + cp src/precomp/ref/${LVL}/{e0_basis,ec_params,hd_splitting_transforms}.c ${DST_PATH}/ + + cp src/verification/ref/lvlx/{common,encode_verification,verify}.c ${DST_PATH}/ + cp src/verification/ref/include/verification.h ${DST_PATH}/ +done + +cp src/gf/ref/lvl1/fp_p5248_32.c src/pqm4/sqisign_lvl1/ref/ +cp src/gf/ref/lvl3/fp_p65376_32.c src/pqm4/sqisign_lvl3/ref/ +cp src/gf/ref/lvl5/fp_p27500_32.c src/pqm4/sqisign_lvl5/ref/ diff --git a/scripts/parameters.py b/scripts/parameters.py deleted file mode 100644 index 8b7641e..0000000 --- a/scripts/parameters.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env python3 -from sage.all import * -proof.all(False) # faster - -import re -for l in open('sqisign_parameters.txt'): - for k in ('lvl', 'p', 'B'): - m = re.search(rf'^\s*{k}\s*=\s*([x0-9a-f]+)', l) - if m: - v = ZZ(m.groups()[0], 0) - globals()[k] = v - -L = {l for l,_ in (p**2 - 1).factor(limit=B+5) if l <= B} -assert 2 in L -L.remove(2) -f = (p+1).valuation(2) -if (p-1).valuation(2) > f: - raise NotImplementedError('2-power torsion is on twist') -Lpls = {l for l in L if (p+1).valuation(l) >= (p-1).valuation(l)} -Lmin = L - Lpls -Lpls, Lmin = map(sorted, (Lpls, Lmin)) -Epls = [(p+1).valuation(l) for l in Lpls] -Emin = [(p-1).valuation(l) for l in Lmin] -Tpls = prod(l**e for l,e in zip(Lpls,Epls)) -Tmin = prod(l**e for l,e in zip(Lmin,Emin)) - -Dcom = (Tpls*Tmin).prime_to_m_part(2*3) -Dchall = prod(l**(p+1).valuation(l) for l in (2,3)) - -__all__ = ['lvl', 'p', 'B', 'f', 'Tpls', 'Tmin', 'Dcom', 'Dchall'] - diff --git a/scripts/precomp/cformat.py b/scripts/precomp/cformat.py new file mode 100644 index 0000000..36378dc --- /dev/null +++ b/scripts/precomp/cformat.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python3 +import sys, itertools +from math import ceil, floor, log +import sage.all + +class Ibz: + def __init__(self, v): + self.v = int(v) + def _literal(self, sz): + val = int(self.v) + sgn = val < 0 + num_limbs = (abs(val).bit_length() + sz-1) // sz if val else 0 + limbs = [(abs(val) >> sz*i) & (2**sz-1) for i in range(num_limbs or 1)] + data = { + '._mp_alloc': 0, + '._mp_size': (-1)**sgn * num_limbs, + '._mp_d': '(mp_limb_t[]) {' + ','.join(map(hex,limbs)) + '}', + } + return '{{' + ', '.join(f'{k} = {v}' for k,v in data.items()) + '}}' + +class FpEl: + ref_p5248_radix_map = { 16: 13, 32: 29, 64: 51 } + ref_p65376_radix_map = { 16: 13, 32: 28, 64: 55 } + ref_p27500_radix_map = { 16: 13, 32: 29, 64: 57 } + def __init__(self, n, p, montgomery=True): + self.n = n + self.p = p + self.montgomery = montgomery + def __get_radix(self, word_size, arith=None): + if arith == "ref" or arith is None: + # lvl1 + if self.p == 0x4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff: + return self.ref_p5248_radix_map[word_size] + # lvl3 + elif self.p == 0x40ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff: + return self.ref_p65376_radix_map[word_size] + # lvl5 + elif self.p == 0x1afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff: + return self.ref_p27500_radix_map[word_size] + raise ValueError(f'Invalid prime \"{self.p}\"') + elif arith == "broadwell": + return word_size + raise ValueError(f'Invalid arithmetic implementation type \"{arith}\"') + def _literal(self, sz, arith=None): + radix = self.__get_radix(sz, arith=arith) + l = 1 + floor(log(self.p, 2**radix)) + # If we're using Montgomery representation, we need to multiply + # by the Montgomery factor R = 2^nw (n = limb number, w = radix) + if self.montgomery: + R = 2**(radix * ceil(log(self.p, 2**radix))) + else: + R = 1 + el = (self.n * R) % self.p + vs = [(int(el) >> radix*i) % 2**radix for i in range(l)] + return '{' + ', '.join(map(hex, vs)) + '}' + +class Object: + def __init__(self, ty, name, obj): + if '[' in ty: + idx = ty.index('[') + depth = ty.count('[]') + def rec(os, d): + assert d >= 0 + if not d: + return () + assert isinstance(os,list) or isinstance(os,tuple) + r, = {rec(o, d-1) for o in os} + return (len(os),) + r + dims = rec(obj, depth) + self.ty = ty[:idx], ''.join(f'[{d}]' for d in dims) + else: + self.ty = ty, '' + self.name = name + self.obj = obj + + def _declaration(self): + return f'extern const {self.ty[0]} {self.name}{self.ty[1]};' + + def _literal(self): + def rec(obj): + if isinstance(obj, int): + if obj < 256: return str(obj) + else: return hex(obj) + if isinstance(obj, sage.all.Integer): + if obj < 256: return str(obj) + else: return hex(obj) + if isinstance(obj, Ibz): + literal = "\n#if 0" + for sz in (16, 32, 64): + literal += f"\n#elif GMP_LIMB_BITS == {sz}" + literal += f"\n{obj._literal(sz)}" + return literal + "\n#endif\n" + if isinstance(obj, FpEl): + literal = "\n#if 0" + for sz in (16, 32, 64): + literal += f"\n#elif RADIX == {sz}" + if sz == 64: + literal += "\n#if defined(SQISIGN_GF_IMPL_BROADWELL)" + literal += f"\n{obj._literal(sz, 'broadwell')}" + literal += "\n#else" + literal += f"\n{obj._literal(sz, 'ref')}" + literal += "\n#endif" + else: + literal += f"\n{obj._literal(sz, 'ref')}" + return literal + "\n#endif\n" + if isinstance(obj, list) or isinstance(obj, tuple): + return '{' + ', '.join(map(rec, obj)) + '}' + if isinstance(obj, str): + return obj + raise NotImplementedError(f'unknown type {type(obj)} in Formatter') + return rec(self.obj) + + def _definition(self): + return f'const {self.ty[0]} {self.name}{self.ty[1]} = ' + self._literal() + ';' + +class ObjectFormatter: + def __init__(self, objs): + self.objs = objs + + def header(self, file=None): + for obj in self.objs: + assert isinstance(obj, Object) + print(obj._declaration(), file=file) + + def implementation(self, file=None): + for obj in self.objs: + assert isinstance(obj, Object) + print(obj._definition(), file=file) \ No newline at end of file diff --git a/scripts/precomp/ec_params.sage b/scripts/precomp/ec_params.sage new file mode 100755 index 0000000..01e3c95 --- /dev/null +++ b/scripts/precomp/ec_params.sage @@ -0,0 +1,41 @@ +#!/usr/bin/env python3 + +from sage.all import * +from parameters import p, f + +if __name__ == '__main__': + + cof = (p+1)//(2**f) + + from cformat import Object, ObjectFormatter + + obj_cof = ObjectFormatter( + [ + Object('digit_t[]', 'p_cofactor_for_2f', [cof]), + ] + ) + + with open("include/ec_params.h", "w") as hfile: + with open("ec_params.c", "w") as cfile: + + hfile.write('#ifndef EC_PARAMS_H\n') + hfile.write('#define EC_PARAMS_H\n') + hfile.write('\n') + + hfile.write('#include \n') + cfile.write('#include \n') + hfile.write('\n') + + hfile.write(f'#define TORSION_EVEN_POWER {f}\n') + hfile.write('\n') + + hfile.write('// p+1 divided by the power of 2\n') + cfile.write('// p+1 divided by the power of 2\n') + obj_cof.header(file=hfile) + obj_cof.implementation(file=cfile) + hfile.write(f'#define P_COFACTOR_FOR_2F_BITLENGTH {((p+1)//(2**f)).bit_length()}\n') + hfile.write('\n') + cfile.write('\n') + + + hfile.write('#endif\n') diff --git a/scripts/precomp/maxorders.py b/scripts/precomp/maxorders.py new file mode 100644 index 0000000..51211e7 --- /dev/null +++ b/scripts/precomp/maxorders.py @@ -0,0 +1,88 @@ +from sage.all import * + +from sage.misc.banner import require_version +if not require_version(10, 5, print_message=True): + exit('') + +from parameters import p, num_orders as num + +################################################################ + +# Underlying theory: +# - Ibukiyama, On maximal orders of division quaternion algebras with certain optimal embeddings +# - https://ia.cr/2023/106 Lemma 10 + +from sage.algebras.quatalg.quaternion_algebra import basis_for_quaternion_lattice +bfql = lambda els: basis_for_quaternion_lattice(els, reverse=True) + +Quat1, (i,j,k) = QuaternionAlgebra(-1, -p).objgens() +assert Quat1.discriminant() == p # ramifies correctly + +O0mat = matrix([list(g) for g in [Quat1(1), i, (i+j)/2, (1+k)/2]]) +O0 = Quat1.quaternion_order(list(O0mat)) + +orders = [ (1, identity_matrix(QQ,4), O0mat, i, O0mat, vector((1,0,0,0))) ] + +q = ZZ(1) +while len(orders) < num: + q = next_prime(q) + if q % 4 != 1: # restricting to q ≡ 1 (mod 4) + continue + + Quatq, (ii,jj,kk) = QuaternionAlgebra(-q, -p).objgens() + if Quatq.discriminant() != p: # ramifies incorrectly + continue + + x, y = QuadraticForm(QQ, 2, [1,0,p]).solve(q) + gamma = x + j*y + assert gamma.reduced_norm() == q + ims1 = [Quat1(1), i*gamma, j, k*gamma] + assert ims1[1]**2 == -q + assert ims1[2]**2 == -p + assert ims1[1]*ims1[2] == ims1[3] + assert ims1[2]*ims1[1] == -ims1[3] + # (1,ii,jj,kk)->ims1 is an isomorphism Quatq->Quat1 + iso1q = ~matrix(map(list, ims1)) + + r = min(map(ZZ, Mod(-p, 4*q).sqrt(all=True))) + + basq = [ + Quatq(1), + ii, + (1 + jj) / 2, + (r + jj) * ii / 2 / q, + ] + + Oq = Quatq.quaternion_order(basq) + assert Oq.discriminant() == p # is maximal + + mat1 = matrix(map(list, basq)) * ~iso1q + O1 = Quat1.quaternion_order(list(mat1)) + assert O1.discriminant() == p # is maximal + assert j in O1 # p-extremal + + # look for an odd connecting ideal + I = O0 * O1 + I *= I.norm().denominator() + assert I.is_integral() + for v in IntegralLattice(I.gram_matrix()).enumerate_short_vectors(): + elt = sum(c*g for c,g in zip(v,I.basis())) + if ZZ(elt.reduced_norm() / I.norm()) % 2: + break + I = I * (elt.conjugate() / I.norm()) + assert I.is_integral() + assert I.norm() % 2 + assert I.left_order() == O0 + + O1_ = I.right_order() + assert O1_.unit_ideal() == elt * O1 * ~elt + idl1 = matrix(map(list, I.basis())) + + # q + # isomorphism from (-1,-p) algebra to (-q,-p) algebra + # basis of maximal order O₁ in (-1,-p) algebra + # element sqrt(-q) in O₁ in (-1,-p) algebra + # basis of connecting ideal I from O₀ in (-1,-p) algebra + # element γ such that I has right order γ O₁ γ^-1 + orders.append((q, iso1q, mat1, ims1[1], idl1, vector(elt))) + diff --git a/scripts/precomp/parameters.py b/scripts/precomp/parameters.py new file mode 100644 index 0000000..c4bb8b2 --- /dev/null +++ b/scripts/precomp/parameters.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 +from sage.all import * +proof.all(False) # faster + +import re +for l in open('sqisign_parameters.txt'): + for k in ('lvl', 'p', 'num_orders'): + m = re.search(rf'^\s*{k}\s*=\s*([x0-9a-f]+)', l) + if m: + v = ZZ(m.groups()[0], 0) + globals()[k] = v + +f = (p+1).valuation(2) + +__all__ = ['lvl', 'p', 'f', 'num_orders'] + diff --git a/scripts/precomp/precompute_E0_basis.sage b/scripts/precomp/precompute_E0_basis.sage new file mode 100755 index 0000000..d403afc --- /dev/null +++ b/scripts/precomp/precompute_E0_basis.sage @@ -0,0 +1,38 @@ +#!/usr/bin/env sage +proof.all(False) # faster + +################################################################ + +from parameters import p, f + +if p % 4 != 3: + raise NotImplementedError('requires p ≡ 3 (mod 4)') + +assert (1 << f).divides(p + 1) +Fp2. = GF((p,2), modulus=[1,0,1]) +E0 = EllipticCurve(Fp2, [1, 0]) + +from torsion_basis import even_torsion_basis_E0 +P, Q = even_torsion_basis_E0(E0, f) + +################################################################ + +from cformat import FpEl, Object, ObjectFormatter + +def Fp2_to_list(el): + return [FpEl(int(c), p, True) for c in Fp2(el)] + +objs = ObjectFormatter([ + Object('fp2_t', 'BASIS_E0_PX', Fp2_to_list(P.x())), + Object('fp2_t', 'BASIS_E0_QX', Fp2_to_list(Q.x())), + ]) + +################################################################ + +with open('include/e0_basis.h','w') as hfile: + with open('e0_basis.c','w') as cfile: + print(f'#include ', file=hfile) + print(f'#include ', file=cfile) + + objs.header(file=hfile) + objs.implementation(file=cfile) diff --git a/scripts/precomp/precompute_endomorphism_action.sage b/scripts/precomp/precompute_endomorphism_action.sage new file mode 100755 index 0000000..5c42a7c --- /dev/null +++ b/scripts/precomp/precompute_endomorphism_action.sage @@ -0,0 +1,303 @@ +#!/usr/bin/env sage +proof.all(False) # faster + +from sage.misc.banner import require_version +if not require_version(10, 0, print_message=True): + exit('') + +################################################################ + +from parameters import p, f +from torsion_basis import even_torsion_basis_E0 + +################################################################ + +from sage.groups.generic import order_from_multiple +pari.allocatemem(1 << 34) # 16G + +if p % 4 != 3: + raise NotImplementedError('requires p ≡ 3 (mod 4)') + +assert (1 << f).divides(p + 1) +Fp2. = GF((p,2), modulus=[1,0,1]) + +sqrtm1 = min(Fp2(-1).sqrt(all=True)) + +def compute(q, mat, idl, iso1q): + print(f'\x1b[33m{q = }\x1b[0m') + E0 = EllipticCurve(Fp2, [1,0]) + E0.set_order((p+1)^2) + + if q == 1: + E1 = E0 + P1, Q1 = even_torsion_basis_E0(E1, f) + print(f'E0 = {E1}') + print(f'P0 = {P1}') + print(f'Q0 = {Q1}') + + else: + Quat. = QuaternionAlgebra(-1, -p) + I = Quat.ideal(map(Quat, idl)) +# print(f'{I = }') + O0 = Quat.quaternion_order(list(map(Quat, orders[0][2]))) +# print(f'{O0 = }') + O1 = I.right_order() +# print(f'{O1 = }') + assert I.left_order() == O0 + assert O0.is_maximal() and O1.is_maximal() + assert I.norm() % 2 + + from deuring2d import Deuring2D + ctx = Deuring2D(p) + assert ctx.O0.order == O0 + assert ctx.E0 == E0 + ctx.sqrtm1 = sqrtm1 + + P0, Q0 = data[0][1] + + for deg in range(1,10): + + print(f'trying {deg = }...') + ctx.e = E0.cardinality(extension_degree=2^deg).sqrt().valuation(2) - 1 + + first = True + for suitable in ctx.SuitableIdeals(I, attempts=10**6, bound=10**3): + + if first: + Fbig. = Fp2.extension(2^deg) + ctx.E0 = E0.change_ring(Fbig) + ctx.P = P0.change_ring(Fbig) + ctx.Q = Q0.change_ring(Fbig) + assert ctx.e == ctx.E0.order().sqrt().valuation(2) - 1 + for _ in range(ctx.e - f): + ctx.P = ctx.P.division_points(2)[0] + ctx.Q = ctx.Q.division_points(2)[0] + ctx.P.set_order(multiple=2^ctx.e) + ctx.Q.set_order(multiple=2^ctx.e) + first = False + + try: + E1, P1, Q1 = ctx.IdealToIsogeny(I, suitable=suitable) + break + except Deuring2D.Failure: + continue + + else: + continue + break + + else: + raise NotImplementedError('Deuring2D failed') + + E1 = E1.change_ring(Fp2) + + j = GF(p)(E1.j_invariant()) + X = polygen(GF(p)) + for A,_ in sorted((256*(X^2-3)^3 - (X^2-4)*j).roots()): + E1_ = EllipticCurve(Fp2, [0,A,0,1,0]) + try: + iso = min(E1.isomorphisms(E1_)) + break + except ValueError: + pass + E1 = iso.codomain() + P1 = iso._eval(P1) + Q1 = iso._eval(Q1) + print(f'{E1 = }') + + P1 *= ctx.P.order() // P0.order() + Q1 *= ctx.Q.order() // Q0.order() + P1 = P1.change_ring(Fp2) + Q1 = Q1.change_ring(Fp2) + print(f'{P1 = }') + print(f'{Q1 = }') + P1.set_order(P0.order()) + Q1.set_order(Q0.order()) + assert P0.order() == Q0.order() == P1.order() == Q1.order() == 2^f + + assert P1.weil_pairing(Q1,2^f) == P0.weil_pairing(Q0,2^f)^I.norm() + + if q == 1: + endo_i, = (a for a in E1.automorphisms() if a.scaling_factor() == sqrtm1) + else: + iso = E1.isomorphism(min(Fp2(-q).sqrt(all=True)), is_codomain=True) + try: + endo_i = iso * E1.isogeny(None, codomain=iso.domain(), degree=q) + except ValueError: + assert False +# assert endo_i^2 == -q + + endo_1 = E1.scalar_multiplication(1) + endo_j = E1.frobenius_isogeny() + endo_k = endo_i * endo_j + + if __debug__: + R = E1.random_point() + assert (endo_i^2)(R) == -q*R + assert (endo_j^2)(R) == -p*R + assert (endo_j*endo_i)(R) == -(endo_i*endo_j)(R) + + denom = mat.denominator() + coprime = denom.prime_to_m_part(lcm(P1.order(), Q1.order())) + P1d, Q1d = (inverse_mod(coprime, T.order()) * T for T in (P1, Q1)) + + denom //= coprime + + extdeg = next(d for d in range(1,denom+1) if ((denom< = Fp2.extension(extdeg) + + P1d, Q1d = (T.change_ring(Fbig) for T in (P1d, Q1d)) + P1d.set_order(multiple=denom<', file=hfile) + print(f'#include ', file=hfile) + print(f'#include ', file=hfile) + print(f'#include ', file=cfile) + print(f'#include ', file=cfile) + print(f'#include ', file=cfile) + + print(''' +/** Type for precomputed endomorphism rings applied to precomputed torsion bases. + * + * Precomputed by the precompute scripts. + * + * @typedef curve_with_endomorphism_ring_t + * + * @struct curve_with_endomorphism_ring + **/ +typedef struct curve_with_endomorphism_ring { + ec_curve_t curve; + ec_basis_t basis_even; + ibz_mat_2x2_t action_i, action_j, action_k; + ibz_mat_2x2_t action_gen2, action_gen3, action_gen4; +} curve_with_endomorphism_ring_t; + '''.strip(), file=hfile) + + print(f'#define CURVE_E0 (CURVES_WITH_ENDOMORPHISMS->curve)', file=hfile) + print(f'#define BASIS_EVEN (CURVES_WITH_ENDOMORPHISMS->basis_even)', file=hfile) + print(f'#define ACTION_I (CURVES_WITH_ENDOMORPHISMS->action_i)', file=hfile) + print(f'#define ACTION_J (CURVES_WITH_ENDOMORPHISMS->action_j)', file=hfile) + print(f'#define ACTION_K (CURVES_WITH_ENDOMORPHISMS->action_k)', file=hfile) + print(f'#define ACTION_GEN2 (CURVES_WITH_ENDOMORPHISMS->action_gen2)', file=hfile) + print(f'#define ACTION_GEN3 (CURVES_WITH_ENDOMORPHISMS->action_gen3)', file=hfile) + print(f'#define ACTION_GEN4 (CURVES_WITH_ENDOMORPHISMS->action_gen4)', file=hfile) + print(f'#define NUM_ALTERNATE_STARTING_CURVES {len(data)-1}', file=hfile) + print(f'#define ALTERNATE_STARTING_CURVES (CURVES_WITH_ENDOMORPHISMS+1)', file=hfile) + + objs.header(file=hfile) + objs.implementation(file=cfile) + + print(f'#endif', file=hfile) diff --git a/scripts/precomp/precompute_hd_splitting.sage b/scripts/precomp/precompute_hd_splitting.sage new file mode 100755 index 0000000..1ecb6e8 --- /dev/null +++ b/scripts/precomp/precompute_hd_splitting.sage @@ -0,0 +1,158 @@ +#!/usr/bin/env sage +proof.all(False) # faster + +################################################################ + +from parameters import p + +# Field +Fp2. = GF((p,2), modulus=[1,0,1]) + +Fp2_constants = [ + [Fp2(0), Fp2(1), Fp2(i), Fp2(-1), Fp2(-i)], + ["FP2_ZERO", "FP2_ONE", "FP2_I", "FP2_MINUS_ONE", "FP2_MINUS_I"] +] + +################################################################ + +from cformat import FpEl + +def Fp2_to_list(el): + return [FpEl(int(c), p, True) for c in Fp2(el)] + +def Fp2_to_name(el): + return Fp2_constants[1][Fp2_constants[0].index(el)] + +################################################################ + +# Splitting Data + +chi_eval = [ + [1,1,1,1], + [1,-1,1,-1], + [1,1,-1,-1], + [1,-1,-1,1] +] + +even_indices = [ + [0, 0], + [0, 1], + [0, 2], + [0, 3], + [1, 0], + [1, 2], + [2, 0], + [2, 1], + [3, 0], + [3, 3], +] + +splitting_map = { + (0, 2): [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1], [0, 0, -1, 0]], + (3, 3): [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]], + (0, 3): [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, -1]], + (2, 1): [[1, 1, 1, 1], [1, -1, 1, -1], [1, -1, -1, 1], [1, 1, -1, -1]], + (0, 1): [[1, 0, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [0, -1, 0, 0]], + (1, 2): [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0]], + (2, 0): [[1, 1, 1, 1], [1, -1, 1, -1], [1, -1, -1, 1], [-1, -1, 1, 1]], + (3, 0): [[1, 1, 1, 1], [1, -1, 1, -1], [1, 1, -1, -1], [-1, 1, 1, -1]], + (1, 0): [[1, 1, 1, 1], [1, -1, -1, 1], [1, 1, -1, -1], [-1, 1, -1, 1]], + (0, 0): [[1, i, 1, i], [1, -i, -1, i], [1, i, -1, -i], [-1, i, -1, i]], +} + +# 24 2x2 maps used for normalization. Applying a uniform matrix to a level 2 +# theta null point ensure that we get a random theta null point in the +# equivalence class of Γ/Γ(2,4) +full_normalization_maps_2d = [ + matrix(2, 2, [1, 0, 0, 1]), + matrix(2, 2, [0, 1, 1, 0]), + matrix(2, 2, [1, 0, 0, -1]), + matrix(2, 2, [0, 1, -1, 0]), + + matrix(2, 2, [1, 1, 1, -1]), + matrix(2, 2, [1, -1, 1, 1]), + matrix(2, 2, [1, 1, -1, 1]), + matrix(2, 2, [-1, 1, 1, 1]), + + matrix(2, 2, [1, 0, 0, i]), + matrix(2, 2, [0, i, 1, 0]), + matrix(2, 2, [1, 0, 0, -i]), + matrix(2, 2, [0, i, -1, 0]), + + matrix(2, 2, [i, 1, 1, i]), + matrix(2, 2, [1, i, i, 1]), + matrix(2, 2, [i, 1, -1, -i]), + matrix(2, 2, [1, i, -i, -1]), + + matrix(2, 2, [1, i, 1, -i]), + matrix(2, 2, [1, -i, 1, i]), + matrix(2, 2, [1, i, -1, i]), + matrix(2, 2, [1, -i, -1, -i]), + + matrix(2, 2, [1, 1, i, -i]), + matrix(2, 2, [i, -i, 1, 1]), + matrix(2, 2, [1, 1, -i, i]), + matrix(2, 2, [i, -i, -1, -1]), +] + +# 6 2x2 maps used for normalisation. A subset of the preceding 24 matrices, +# that are sufficient to ensure uniform normalisation (under Γ/Γ^0(4)) +# when using the Montgomery model +normalization_maps_2d = [ + matrix(2, 2, [1, 0, 0, 1]), + matrix(2, 2, [0, 1, 1, 0]), + matrix(2, 2, [1, 1, 1, -1]), + matrix(2, 2, [-1, 1, 1, 1]), + matrix(2, 2, [i, 1, 1, i]), + matrix(2, 2, [1, i, i, 1]), +] + + +# Format from dictionary to list of lists +splitting_matrices = [] +for ind in even_indices: + # Create a list of all ten matrices (represented as 4x4 matrices) + splitting_matrices.append([[Fp2_to_name(Fp2(x)) for x in row] for row in splitting_map[tuple(ind)]]) + +# 6 4x4 maps constructed from the above +normalization_maps_4d = [] +for m in normalization_maps_2d: + M = m.tensor_product(m, subdivide=False).list() + matrix_elements_list = list(map(Fp2, M)) + # Reshape into matrix + matrix_elements = [ matrix_elements_list[i:i+4] for i in range(0, len(matrix_elements_list), 4) ] + normalization_maps_4d.append([[Fp2_to_name(x) for x in row] for row in matrix_elements]) + +################################################################ + +from cformat import Object, ObjectFormatter + +objs = ObjectFormatter( + [ + Object('int[][]', 'EVEN_INDEX', even_indices), + Object('int[][]', 'CHI_EVAL', chi_eval), + Object('fp2_t[]', 'FP2_CONSTANTS', list(map(Fp2_to_list, Fp2_constants[0]))), + Object('precomp_basis_change_matrix_t[]', 'SPLITTING_TRANSFORMS', [[x] for x in splitting_matrices]), + Object('precomp_basis_change_matrix_t[]', 'NORMALIZATION_TRANSFORMS', [[x] for x in normalization_maps_4d]), + ] +) + +with open("include/hd_splitting_transforms.h", "w") as hfile: + with open("hd_splitting_transforms.c", "w") as cfile: + print("#ifndef HD_SPLITTING_H", file=hfile) + print("#define HD_SPLITTING_H", file=hfile) + print(f"\n#include ", file=hfile) + print(f"#include \n", file=hfile) + print("typedef struct precomp_basis_change_matrix {", file=hfile) + print(" uint8_t m[4][4];", file=hfile) + print("} precomp_basis_change_matrix_t;\n", file=hfile) + + print(f"#include \n", file=cfile) + for i in range(len(Fp2_constants[1])): + print(f"#define {Fp2_constants[1][i]} {i}", file=cfile) + print("", file=cfile) + + objs.header(file=hfile) + objs.implementation(file=cfile) + + print("\n#endif\n", file=hfile) diff --git a/scripts/precomp/precompute_quaternion_constants.sage b/scripts/precomp/precompute_quaternion_constants.sage new file mode 100755 index 0000000..eae696f --- /dev/null +++ b/scripts/precomp/precompute_quaternion_constants.sage @@ -0,0 +1,44 @@ +#!/usr/bin/env sage +proof.all(False) # faster + +################################################################ + +from parameters import p +negl = 2**-64 + +################################################################ + +logp = ceil(log(p, 2)) +loglogp = ceil(log(logp,2)) +tors2val = (p+1).valuation(2) + +defs = dict() + +# RepresentInteger data +small = ceil(log(negl, 2) / -1) +assert 2**-small <= negl + +add_shift = ceil(log(log(negl, 1-1/(64*logp)), 2)) +assert (1 - 1/(64*logp)) ** (2**(add_shift)) <= negl + +defs['QUAT_primality_num_iter'] = ceil(-log(negl, 4)) +defs['QUAT_repres_bound_input'] = add_shift + +# Equivalent ideal data +defs['QUAT_equiv_bound_coeff'] = 2**(1 + add_shift//4) + +# Find_uv constants +m = 2 + floor((logp - tors2val) / 4) +defs['FINDUV_box_size'] = m +defs['FINDUV_cube_size'] = (2 * m + 1)**4 - 1 + +################################################################ + +with open('include/quaternion_constants.h','w') as hfile: + print(f'#include ', file=hfile) + + for k,v in defs.items(): + v = ZZ(v) + print(f'#define {k} {v}', file=hfile) + + diff --git a/scripts/precomp/precompute_quaternion_data.sage b/scripts/precomp/precompute_quaternion_data.sage new file mode 100755 index 0000000..71f7de3 --- /dev/null +++ b/scripts/precomp/precompute_quaternion_data.sage @@ -0,0 +1,91 @@ +#!/usr/bin/env sage +proof.all(False) # faster + + + +from maxorders import p, orders + +from cformat import Ibz, Object, ObjectFormatter + +# Prime of same size than p for random ideal of fixed norm +bitlength_p = int(p).bit_length() +prime_cofactor = next_prime((2^(bitlength_p))) + +algobj = [Ibz(p)] + +objs = \ + [ + [ + # basis (columns) + [ + Ibz(mat.denominator()), + [[Ibz(v) for v in vs] + for vs in mat.transpose()*mat.denominator()], + ], + # sqrt(-q) + [ + Ibz(mat.denominator()), + [Ibz(c) for c in ii*mat.denominator()], + ], + # sqrt(-p) + [ + Ibz(1), + [Ibz(c) for c in (0,0,1,0)] + ], + q + ] + for q,_,mat,ii,_,_ in orders + ] + +idlobjs = \ + [ + [ + # basis (columns) + [ + Ibz(idl.denominator()), + [[Ibz(v) for v in vs] + for vs in idl.transpose()*idl.denominator()], + ], + # norm + Ibz(abs(idl.row_space(ZZ).intersection((ZZ^4).submodule([[1,0,0,0]])).basis()[0][0])), + # left order + '&MAXORD_O0', + ] + for _,_,mat,_,idl,_ in orders + ] + +gammaobjs = \ + [ + [ + Ibz(gamma.denominator()), + list(map(Ibz, gamma * gamma.denominator())), + ] + for _,_,_,_,_,gamma in orders + ] + +objs = ObjectFormatter([ + Object('ibz_t', 'QUAT_prime_cofactor', Ibz(prime_cofactor)), + Object('quat_alg_t', 'QUATALG_PINFTY', algobj), + Object('quat_p_extremal_maximal_order_t[]', 'EXTREMAL_ORDERS', objs), + Object('quat_left_ideal_t[]', 'CONNECTING_IDEALS', idlobjs), # ideal corresponding to an isogeny from E0 which acts as identity w.r.t. the basis_even + Object('quat_alg_elem_t[]', 'CONJUGATING_ELEMENTS', gammaobjs), # elements γ such that each I has right order γ O₁ γ^-1 + ]) + +with open('include/quaternion_data.h','w') as hfile: + with open('quaternion_data.c','w') as cfile: + print(f'#include ', file=hfile) + print(f'#include ', file=cfile) + print(f'#include ', file=cfile) + print(f'#include ', file=cfile) + + #FIXME this should eventually go away? + print(f'#define MAXORD_O0 (EXTREMAL_ORDERS->order)', file=hfile) + print(f'#define STANDARD_EXTREMAL_ORDER (EXTREMAL_ORDERS[0])', file=hfile) + print(f'#define NUM_ALTERNATE_EXTREMAL_ORDERS {len(orders)-1}', file=hfile) + print(f'#define ALTERNATE_EXTREMAL_ORDERS (EXTREMAL_ORDERS+1)', file=hfile) + print(f'#define ALTERNATE_CONNECTING_IDEALS (CONNECTING_IDEALS+1)', file=hfile) + print(f'#define ALTERNATE_CONJUGATING_ELEMENTS (CONJUGATING_ELEMENTS+1)', file=hfile) + + objs.header(file=hfile) + objs.implementation(file=cfile) + diff --git a/scripts/precomp/precompute_sizes.sage b/scripts/precomp/precompute_sizes.sage new file mode 100755 index 0000000..5cda565 --- /dev/null +++ b/scripts/precomp/precompute_sizes.sage @@ -0,0 +1,93 @@ +#!/usr/bin/env sage +proof.all(False) # faster + +from sage.misc.banner import require_version +if not require_version(9, 8, print_message=True): + exit('') + +################################################################ + +from parameters import lvl, f, p + +################################################################ + +logp = ceil(log(p, 2)) +tors2val = (p+1).valuation(2) +tors2part = (p+1).p_primary_part(2) +tors3part = (p+1).p_primary_part(3) + +defs = dict() + +TORSION_2POWER_BYTES = (tors2part.bit_length() + 7) // 8 +SECURITY_BITS = round(p.bit_length() / 128) * 64 +RESPONSE_LENGTH = ceil(p.bit_length()/2) +RESPONSE_BYTES = (RESPONSE_LENGTH + 9) // 8 + +fpsz = (logp + 63)//64*8 +fp2sz = 2 * fpsz +defs['SECURITY_BITS'] = SECURITY_BITS +defs['SQIsign_response_length'] = ceil(logp/2) +defs['HASH_ITERATIONS'] = 2**(32 * ceil( logp/64 ) - (tors2val - ceil(logp/2))) +defs['FP_ENCODED_BYTES'] = fpsz +defs['FP2_ENCODED_BYTES'] = fp2sz +defs['EC_CURVE_ENCODED_BYTES'] = fp2sz # just the A +defs['EC_POINT_ENCODED_BYTES'] = fp2sz # just the x +defs['EC_BASIS_ENCODED_BYTES'] = 3 * defs['EC_POINT_ENCODED_BYTES'] + +defs['PUBLICKEY_BYTES'] = defs['EC_CURVE_ENCODED_BYTES'] + 1 # extra byte for hint +defs['SECRETKEY_BYTES'] = defs['PUBLICKEY_BYTES'] + 5*defs['FP_ENCODED_BYTES'] + 4*TORSION_2POWER_BYTES +defs['SIGNATURE_BYTES'] = defs['EC_CURVE_ENCODED_BYTES'] + 2 + 4*RESPONSE_BYTES + (SECURITY_BITS//8) + 1 + 1 + +size_privkey = defs['SECRETKEY_BYTES'] +size_pubkey = defs['PUBLICKEY_BYTES'] +size_signature = defs['SIGNATURE_BYTES'] + +algname = f'SQIsign_lvl{lvl}' + +################################################################ + +with open('include/encoded_sizes.h','w') as hfile: + for k,v in defs.items(): + v = ZZ(v) + print(f'#define {k} {v}', file=hfile) + +################################################################ + +api = f''' +// SPDX-License-Identifier: Apache-2.0 + +#ifndef api_h +#define api_h + +#include + +#define CRYPTO_SECRETKEYBYTES {size_privkey} +#define CRYPTO_PUBLICKEYBYTES {size_pubkey} +#define CRYPTO_BYTES {size_signature} + +#define CRYPTO_ALGNAME "{algname}" + +#if defined(ENABLE_SIGN) +SQISIGN_API +int +crypto_sign_keypair(unsigned char *pk, unsigned char *sk); + +SQISIGN_API +int +crypto_sign(unsigned char *sm, unsigned long long *smlen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *sk); +#endif + +SQISIGN_API +int +crypto_sign_open(unsigned char *m, unsigned long long *mlen, + const unsigned char *sm, unsigned long long smlen, + const unsigned char *pk); + +#endif /* api_h */ +'''.strip() + +with open(f'../../../nistapi/lvl{lvl}/api.h', 'w') as f: + print(api, file=f) + diff --git a/scripts/precomp/precompute_torsion_constants.sage b/scripts/precomp/precompute_torsion_constants.sage new file mode 100755 index 0000000..92948dd --- /dev/null +++ b/scripts/precomp/precompute_torsion_constants.sage @@ -0,0 +1,40 @@ +#!/usr/bin/env sage +proof.all(False) # faster + +################################################################ + +from parameters import p + +################################################################ + +tors2part = (p+1).p_primary_part(2) +lambda_security = round(p.bit_length() / 128) * 64 +N_sec = next_prime(1 << 4*lambda_security) +N_com = N_sec + +defs = { + 'TORSION_2POWER_BYTES': (tors2part.bit_length() + 7) // 8, + } + +from cformat import Ibz, Object, ObjectFormatter + +objs = ObjectFormatter([ + Object('ibz_t', 'TWO_TO_SECURITY_BITS', Ibz(1 << lambda_security)), # lambda_security = SECURITY_BITS (128, 192, 256) + Object('ibz_t', 'TORSION_PLUS_2POWER', Ibz(tors2part)), + Object('ibz_t', 'SEC_DEGREE', Ibz(N_sec)), + Object('ibz_t', 'COM_DEGREE', Ibz(N_com)), + ]) + +with open('include/torsion_constants.h','w') as hfile: + with open('torsion_constants.c','w') as cfile: + print(f'#include ', file=hfile) + print(f'#include ', file=cfile) + print(f'#include ', file=cfile) + print(f'#include ', file=cfile) + + for k,v in defs.items(): + print(f'#define {k} {v}', file=hfile) + + objs.header(file=hfile) + objs.implementation(file=cfile) + diff --git a/scripts/precomp/torsion_basis.py b/scripts/precomp/torsion_basis.py new file mode 100644 index 0000000..bdbc40c --- /dev/null +++ b/scripts/precomp/torsion_basis.py @@ -0,0 +1,75 @@ +from sage.all import ZZ, GF, EllipticCurve, parallel + +def even_torsion_basis_E0(E0, f): + """ + For the case when A = 0 we can't use the entangled basis algorithm + so we do something "stupid" to simply get something canonical + """ + assert E0.a_invariants() == (0, 0, 0, 1, 0) + + Fp2 = E0.base_ring() + p = Fp2.characteristic() + + def points_order_two_f(): + """ + Compute a point P of order 2^f with x(P) = 1 + i*x_im + """ + x_im = 0 + while True: + x_im += 1 + x = Fp2([1, x_im]) + if not E0.is_x_coord(x): + continue + # compares a+bi <= c+di iff (a,b) <= (c,d) as tuples, where integers + # modulo p are compared via their minimal non-negative representatives + P = min(E0.lift_x(x, all=True), key = lambda pt: list(pt.y())) + P.set_order(multiple=p+1) + if P.order() % (1 << f) == 0: + P *= P.order() // (1 << f) + P.set_order(1 << f) + yield P + + pts = points_order_two_f() + P = next(pts) + for Q in pts: + # Q is picked to be in E[2^f] AND we must ensure that + # form a basis, which is the same as e(P, Q) having + # full order 1 << f. + e = P.weil_pairing(Q, 1 << f) + if e ** (1 << f - 1) == -1: + break + + # Finally we want to make sure Q is above (0, 0) + P2 = (1 << f - 1) * P + Q2 = (1 << f - 1) * Q + if Q2 == E0(0, 0): + pass + elif P2 == E0(0, 0): + P, Q = Q, P + else: + Q += P + + assert P.weil_pairing(Q, 1 << f) ** (1 << f - 1) == -1 + assert (1 << f - 1) * Q == E0(0, 0) + + return P, Q + + +if __name__ == "__main__": + # p, f = 5 * 2**248 - 1, 248 + # p, f = 65 * 2**376 - 1, 376 + p, f = 27 * 2**500 - 1, 500 + print(f"p = {ZZ(p+1).factor()} - 1") + Fp2 = GF(p**2, modulus=[1, 0, 1], names="i") + E = EllipticCurve(Fp2, [1, 0]) + E.set_order((p + 1) ** 2) + + P, Q = even_torsion_basis_E0(E, f) + print(f"{P = }") + print(f"{Q = }") + + assert P.order() == 1 << f + assert Q.order() == 1 << f + e = P.weil_pairing(Q, 1 << f) + assert e ** (1 << f - 1) == -1 + print("all good") diff --git a/scripts/precompute_endomorphism_action.sage b/scripts/precompute_endomorphism_action.sage deleted file mode 100755 index 90a6cc7..0000000 --- a/scripts/precompute_endomorphism_action.sage +++ /dev/null @@ -1,203 +0,0 @@ -#!/usr/bin/env sage -proof.all(False) # faster - -from sage.misc.banner import require_version -if not require_version(10, 0, print_message=True): - exit('') - -################################################################ - -from parameters import p, B, f, Tpls, Tmin, Dcom, Dchall -T = Tpls * Tmin - -################################################################ - -if p % 4 != 3: - raise NotImplementedError('requires p ≡ 3 (mod 4)') - -Fp2. = GF((p,2), modulus=[1,0,1]) -Fp4 = Fp2.extension(2,'u') -E = EllipticCurve(Fp4, [1,0]) -assert E.j_invariant() == 1728 -assert E.is_supersingular() -assert E.change_ring(Fp2).frobenius() == -p -assert E.order() == (p^2-1)^2 - -endo_1 = E.scalar_multiplication(1) -endo_i = E.automorphisms()[-1] -endo_j = E.frobenius_isogeny() -endo_k = endo_i * endo_j - -if 0: # skipped for speed, for now - assert endo_i^2 == E.scalar_multiplication(-1) - assert endo_j^2 == E.scalar_multiplication(-p) - assert endo_j * endo_i == - endo_i * endo_j -else: - R = E.random_point() - assert (endo_i^2)(R) == -1*R - assert (endo_j^2)(R) == -p*R - assert (endo_j*endo_i)(R) == -(endo_i*endo_j)(R) - -def half_endo(summands): - def _eval(P): - E = P.curve() - assert P in E - F = E.base_field() - if (halves := P.division_points(2)): - Q = halves[0] - else: - Q = E.change_ring(F.extension(2,'v'))(P) - R = sum(endo._eval(Q) for endo in summands) - return E(R) - return _eval - -gen1 = endo_1._eval -gen2 = endo_i._eval -gen3 = half_endo([endo_i, endo_j]) -gen4 = half_endo([endo_1, endo_k]) - -################################################################ - -from sage.groups.generic import order_from_multiple - -x = Fp4.gen() -while True: - x += 1 - try: - P = E.lift_x(x) - except ValueError: - continue - o = order_from_multiple(P, p^2-1) - if (T< = QuaternionAlgebra(-1, -p) -O0 = Quat.quaternion_order([1, i, (i+j)/2, (1+k)/2]) - -assert Dcom % 2 == 1 # odd -mat = block_matrix(Zmod(Dcom), [[identity_matrix(2), mati, matj, matk]])[:,::2] -ker = list(map(Quat, mat.right_kernel_matrix())) -idealP = sum((O0*g for g in ker), O0*Dcom) -assert idealP.norm() == Dcom -for b in idealP.basis(): - assert sum(Mod(c,Dcom)*g for c,g in zip(b,(1,mati,matj,matk)))[:,0] == 0 # kills P -for v in (ZZ^4): - idealPgen = sum(c*g for c,g in zip(v, idealP.basis())) - if vector(list(idealPgen)).denominator() == 2: - idealPgen *= 2 - if gcd(idealPgen.reduced_norm(), Dcom^2) == Dcom: - break -assert idealP == O0*Dcom + O0*idealPgen - -mat = mat # still -rhs = vector(Zmod(Dcom), [0,1]) -cs = mat.solve_right(rhs) -distorter = Quat(cs) -assert sum(Mod(c,Dcom)*g for c,g in zip(distorter,(1,mati,matj,matk))).columns()[0] == vector((0,1)) # maps P->Q - -################################################################ - -from cformat import Ibz, Object, ObjectFormatter - -def field2limbs(el): - l = 1 + floor(log(p, 2**64)) - el = Fp2(el) - vs = [[(int(c) >> 64*i) % 2**64 for i in range(l)] for c in el] - return vs - -def fmt_basis(name, P, Q): - vs = [ - [field2limbs(T[0]), field2limbs(T[2])] - for T in (P,Q,P-Q) - ] - return Object('ec_basis_t', name, vs) - -bases = { - 'EVEN': 1<', file=hfile) - print(f'#include ', file=hfile) - print(f'#include ', file=hfile) - print(f'#include ', file=cfile) - print(f'#include ', file=cfile) - print(f'#include ', file=cfile) - - objs.header(file=hfile) - objs.implementation(file=cfile) - diff --git a/scripts/precompute_klpt_constants.sage b/scripts/precompute_klpt_constants.sage deleted file mode 100755 index a6cef10..0000000 --- a/scripts/precompute_klpt_constants.sage +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/env sage -proof.all(False) # faster - -from sage.misc.banner import require_version -if not require_version(9, 8, print_message=True): - exit('') - -################################################################ - -from parameters import f, p, Tpls, Tmin -negl = 2**-64 #TODO optimize - -################################################################ - -logp = ceil(log(p, 2)) -logT = ceil(log(Tpls*Tmin, 2)) -tors2val = (p+1).valuation(2) - -defs = dict() - -# lideal_equiv - -defs['KLPT_equiv_bound_coeff'] = ceil((log(negl, 1-2/logp) ** (1/4) - 1) / 2) + 2 -assert (1 - 2/logp) ** ((2 * defs['KLPT_equiv_bound_coeff'] + 1) ** 4) <= negl - -defs['KLPT_equiv_num_iter'] = (2 * defs['KLPT_equiv_bound_coeff'] + 1) ** 4 - -defs['KLPT_primality_num_iter'] = ceil(-log(negl, 4)) - -# signing KLPT - -defs['KLPT_signing_klpt_length'] = f * ceil (ceil((log(negl, 2) / -2) + 15/4*logp + 25)/f) -assert 2**(-2 * (defs['KLPT_signing_klpt_length'] - 15/4*logp - 25)) <= negl - -defs['KLPT_signing_num_gamma_trial'] = ceil(log(negl, 2) / -1) -assert 2 ** ( - defs['KLPT_signing_num_gamma_trial']) <= negl - -defs['KLPT_gamma_exponent_interval_size'] = 0 - -defs['KLPT_gamma_exponent_center_shift'] = ceil(log(log(negl, 1-1/logp) + defs['KLPT_signing_num_gamma_trial'], 2) + defs['KLPT_gamma_exponent_interval_size']) -assert (1 - 1/logp) ** (2**(defs['KLPT_gamma_exponent_center_shift'] - defs['KLPT_gamma_exponent_interval_size']) - defs['KLPT_signing_num_gamma_trial']) <= negl - -defs['KLPT_repres_num_gamma_trial'] = 2**(defs['KLPT_gamma_exponent_center_shift'] + defs['KLPT_gamma_exponent_interval_size']) - -defs['KLPT_signing_number_strong_approx'] = ceil(log(1/64, 1-4/13/logp)) -assert (1 - 4/13/logp) ** defs['KLPT_signing_number_strong_approx'] <= 1/64 - -# keygen KLPT - -defs['KLPT_random_prime_attempts'] = 64 - -defs['KLPT_secret_key_prime_size'] = ceil(logp / 4) - -defs['KLPT_keygen_length'] = f* ceil ( ceil(log(negl, 2) / -2 + 5/2*logp -25 ) / f) -assert 2 ** (-2 * (defs['KLPT_keygen_length'] - 5/2*logp +25)) <= negl - -defs['KLPT_keygen_num_gamma_trial'] = ceil(log(negl, 2) / -1) - -defs['KLPT_eichler_smallnorm_bitsize'] = ceil(1/2*logp - 4/3*( logT - 5/4*logp)) - -defs['KLPT_keygen_number_strong_approx'] = ceil(log(1/64, 1-2/5/logp)) -assert (1 - 2/5/logp) ** defs['KLPT_keygen_number_strong_approx'] <= 1/64 - -# Eichler - -defs['KLPT_eichler_number_mu_norm'] = ceil((logT - 5/4*logp) / log(3,2)) - -defs['KLPT_eichler_strong_approx_log_margin'] = 2 - -defs['KLPT_eichler_num_equiv_ideal'] = ceil(logp / 10) - -defs['KLPT_eichler_number_strong_approx'] = ceil(10 * logp) - -# signature response - -defs['SQISIGN_response_attempts'] = 64 - -# signature isogeny degrees - -defs['SQISIGN_random_length'] = 0 -defs['SQISIGN_signing_total_length'] = defs['KLPT_signing_klpt_length'] -defs['SQISIGN_signing_length'] = ZZ(defs['SQISIGN_signing_total_length'] / tors2val) -defs['SQISIGN_keygen_length'] = ZZ(defs['KLPT_keygen_length'] / tors2val) - -# prime data for Cornacchia - -primes_1mod4 = [p for p in primes(100) if p%4==1] -prod_primes_3mod4 = prod(p for p in primes(100) if p%4==3) - -################################################################ - -from cformat import Ibz, Object, ObjectFormatter - -objs = ObjectFormatter([ - Object('short[]', 'SMALL_PRIMES_1MOD4', [int(v) for v in primes_1mod4]), - Object('ibz_t', 'PROD_SMALL_PRIMES_3MOD4', Ibz(prod_primes_3mod4)), - ]) - -################################################################ - -with open('include/klpt_constants.h','w') as hfile: - with open('klpt_constants.c','w') as cfile: - print(f'#include ', file=hfile) - print(f'#include ', file=cfile) - print(f'#include ', file=cfile) - print(f'#include ', file=cfile) - - for k,v in defs.items(): - v = ZZ(v) - print(f'#define {k} {v}', file=hfile) - - objs.header(file=hfile) - objs.implementation(file=cfile) - diff --git a/scripts/precompute_quaternion_data.sage b/scripts/precompute_quaternion_data.sage deleted file mode 100755 index 967d3ae..0000000 --- a/scripts/precompute_quaternion_data.sage +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env sage -proof.all(False) # faster - -from sage.misc.banner import require_version -if not require_version(9, 8, print_message=True): - exit('') - -################################################################ - -from parameters import p -num = 7 #TODO how many extra maximal orders to precompute? - -################################################################ - -# Underlying theory: -# - Ibukiyama, On maximal orders of division quaternion algebras with certain optimal embeddings -# - https://ia.cr/2023/106 Lemma 10 - -from sage.algebras.quatalg.quaternion_algebra import basis_for_quaternion_lattice -bfql = lambda els: basis_for_quaternion_lattice(els, reverse=True) - -Quat. = QuaternionAlgebra(-1, -p) -assert Quat.discriminant() == p # ramifies correctly - -orders = [] - -q = 1 -while len(orders) < num: - q = next_prime(q) - - if q == 2: - continue - - Quat2. = QuaternionAlgebra(-q, -p) - if Quat2.discriminant() != p: # ramifies incorrectly - continue - - x, y = QuadraticForm(QQ, 2, [1,0,p]).solve(q) - gamma = x + j*y - assert gamma.reduced_norm() == q - ims = [Quat(1), i*gamma, j, k*gamma] - assert ims[1]^2 == -q - assert ims[2]^2 == -p - assert ims[1]*ims[2] == ims[3] - assert ims[2]*ims[1] == -ims[3] - # (1,ii,jj,kk)->ims is an isomorphism Quat2->Quat - - r = min(map(ZZ, Mod(-p, 4*q).sqrt(all=True))) - - if q % 4 == 3: - bas2 = [ - Quat2(1), - (1 + ii) / 2, - jj * (1 + ii) / 2, - (r + jj) * ii / q, - ] - else: - bas2 = [ - Quat2(1), - ii, - (1 + jj) / 2, - (r + jj) * ii / 2 / q, - ] - O2 = Quat2.quaternion_order(bas2) - assert O2.discriminant() == p # is maximal - - bas = [sum(c*im for c,im in zip(el,ims)) for el in bas2] - bas = bfql(bas) - O = Quat.quaternion_order(bas) - assert O.discriminant() == p # is maximal - assert j in O # p-extremal - - mat = matrix(map(list, bas)) -# print(f'{q = }\nsqrt(-q) = {ims[1]}\n {(chr(10)+" ").join(map(str,bas))}', file=sys.stderr) - assert mat[0] == vector((1,0,0,0)) - orders.append((q, ims[1], mat)) - -################################################################ - -gram = matrix(ZZ, [ - [((gi+gj).reduced_norm() - gi.reduced_norm() - gj.reduced_norm()) / 2 - for gi in Quat.basis()] for gj in Quat.basis()]) - -O0mat = matrix([list(g) for g in [Quat(1), i, (i+j)/2, (1+k)/2]]) - -################################################################ - -from cformat import Ibz, Object, ObjectFormatter - -algobj = [Ibz(p), [[Ibz(v) for v in vs] for vs in gram]] -O0ord = [Ibz(O0mat.denominator()), [[Ibz(v*O0mat.denominator()) for v in vs] for vs in O0mat.transpose()]] -O0obj = [O0ord, [Ibz(1), [Ibz(c) for c in (0,1,0,0)]], [Ibz(1), [Ibz(c) for c in (0,0,1,0)]], 1] - -objs = [[[Ibz(mat.denominator()), [[Ibz(v*mat.denominator()) for v in vs] for vs in mat.transpose()]], [Ibz(mat.denominator()), [Ibz(c*mat.denominator()) for c in ii]], [Ibz(1), [Ibz(c) for c in (0,0,1,0)]], q] for q,ii,mat in orders] - -objs = ObjectFormatter([ - Object('quat_alg_t', 'QUATALG_PINFTY', algobj), - Object('quat_order_t', 'MAXORD_O0', O0ord), - Object('quat_p_extremal_maximal_order_t', 'STANDARD_EXTREMAL_ORDER', O0obj), - Object('quat_p_extremal_maximal_order_t[]', 'ALTERNATE_EXTREMAL_ORDERS', objs), - ]) - -with open('include/quaternion_data.h','w') as hfile: - with open('quaternion_data.c','w') as cfile: - print(f'#include ', file=hfile) - print(f'#include ', file=hfile) - print(f'#include ', file=cfile) - print(f'#include ', file=cfile) - print(f'#include ', file=cfile) - - print(f'#define NUM_ALTERNATE_EXTREMAL_ORDERS {len(orders)}', file=hfile) - - objs.header(file=hfile) - objs.implementation(file=cfile) - diff --git a/scripts/precompute_sizes.sage b/scripts/precompute_sizes.sage deleted file mode 100755 index e7f77ef..0000000 --- a/scripts/precompute_sizes.sage +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env sage -proof.all(False) # faster - -from sage.misc.banner import require_version -if not require_version(9, 8, print_message=True): - exit('') - -################################################################ - -from parameters import lvl, f, p - -################################################################ - -logp = ceil(log(p, 2)) -tors2part = (p+1).p_primary_part(2) -tors3part = (p+1).p_primary_part(3) - -#XXX first load the constants from klpt_constants.h -import re -klpt_consts = dict() -for l in open('include/klpt_constants.h'): - m = re.search(r'#define *([^ ]+) *([x0-9]+)$', l) - if m: - k,v = m.groups() - klpt_consts[k] = int(v, 0) - -defs = dict() - -fp2sz = (logp + 63)//64*8 * 2 -defs['FP2_ENCODED_BYTES'] = fp2sz -defs['EC_CURVE_ENCODED_BYTES'] = fp2sz # just the A -defs['EC_POINT_ENCODED_BYTES'] = fp2sz # just the x -defs['EC_BASIS_ENCODED_BYTES'] = 3 * defs['EC_POINT_ENCODED_BYTES'] - -defs['CHAIN_LENGTH'] = klpt_consts['SQISIGN_keygen_length'] - -defs['QUAT_ALG_ELEM_ENCODED_BITS'] = ceil(((logp/4) + klpt_consts['KLPT_keygen_length'])/2 +55) #TODO FIXME figure this out XXX XXX -defs['QUAT_ALG_ELEM_ENCODED_BYTES'] = (defs['QUAT_ALG_ELEM_ENCODED_BITS'] + 7)//8 -defs['ID2ISO_LONG_TWO_ISOG_ENCODED_BYTES'] = defs['CHAIN_LENGTH'] * (defs['EC_CURVE_ENCODED_BYTES'] + defs['EC_POINT_ENCODED_BYTES'] + 2) - -defs['ZIP_CHAIN_LEN'] = klpt_consts['SQISIGN_signing_length'] -defs['ID2ISO_COMPRESSED_LONG_TWO_ISOG_ZIP_CHAIN_BYTES'] = (f + 7) // 8 -defs['ID2ISO_COMPRESSED_LONG_TWO_ISOG_BYTES'] = defs['ZIP_CHAIN_LEN'] * defs['ID2ISO_COMPRESSED_LONG_TWO_ISOG_ZIP_CHAIN_BYTES'] + 1 - -defs['SIGNATURE_LEN'] = defs['ID2ISO_COMPRESSED_LONG_TWO_ISOG_BYTES'] + ((tors2part*tors3part).bit_length()+7)//8 + 1 + (tors2part.bit_length()+7)//8 + (tors3part.bit_length()+7)//8 -defs['PUBLICKEY_BYTES'] = defs['EC_CURVE_ENCODED_BYTES'] -defs['SECRETKEY_BYTES'] = defs['EC_CURVE_ENCODED_BYTES'] + 5*defs['QUAT_ALG_ELEM_ENCODED_BYTES'] + defs['EC_POINT_ENCODED_BYTES'] + defs['EC_BASIS_ENCODED_BYTES'] + defs['EC_BASIS_ENCODED_BYTES'] - -size_privkey = defs['SECRETKEY_BYTES'] -size_pubkey = defs['PUBLICKEY_BYTES'] -size_signature = defs['SIGNATURE_LEN'] - -algname = f'lvl{lvl}' - -################################################################ - -with open('include/encoded_sizes.h','w') as hfile: - for k,v in defs.items(): - v = ZZ(v) - print(f'#define {k} {v}', file=hfile) - -api = f''' -// SPDX-License-Identifier: Apache-2.0 - -#ifndef api_h -#define api_h - -#define CRYPTO_SECRETKEYBYTES {size_privkey:4} -#define CRYPTO_PUBLICKEYBYTES {size_pubkey:4} -#define CRYPTO_BYTES {size_signature:4} - -#define CRYPTO_ALGNAME "{algname}" - -int -crypto_sign_keypair(unsigned char *pk, unsigned char *sk); - -int -crypto_sign(unsigned char *sm, unsigned long long *smlen, - const unsigned char *m, unsigned long long mlen, - const unsigned char *sk); - -int -crypto_sign_open(unsigned char *m, unsigned long long *mlen, - const unsigned char *sm, unsigned long long smlen, - const unsigned char *pk); - -#endif /* api_h */ -'''.strip() - -with open(f'../../../nistapi/lvl{lvl}/api.h', 'w') as f: - print(api, file=f) - diff --git a/scripts/precompute_torsion_constants.sage b/scripts/precompute_torsion_constants.sage deleted file mode 100755 index e0e7afa..0000000 --- a/scripts/precompute_torsion_constants.sage +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env sage -proof.all(False) # faster - -from sage.misc.banner import require_version -if not require_version(9, 8, print_message=True): - exit('') - -################################################################ - -from parameters import p, B, f, Tpls, Tmin, Dcom, Dchall - -################################################################ - -Lpls = sorted(set(Tpls.prime_factors()) - {2}) -Epls = [Tpls.valuation(l) for l in Lpls] - -Lmin = sorted(set(Tmin.prime_factors()) - {2}) -Emin = [Tmin.valuation(l) for l in Lmin] - -tors2part = (p+1).p_primary_part(2) -tors3part = (p+1).p_primary_part(3) -tors23part = tors2part * tors3part - -defs = { - 'TORSION_2POWER_BYTES': (int(tors2part).bit_length() + 7) // 8, - 'TORSION_3POWER_BYTES': (int(tors3part).bit_length() + 7) // 8, - 'TORSION_23POWER_BYTES': (int(tors23part).bit_length() + 7) // 8, - } - -from cformat import Ibz, Object, ObjectFormatter - -objs = ObjectFormatter([ - Object('uint64_t', 'TORSION_PLUS_EVEN_POWER', int(f)), - Object('uint64_t[]', 'TORSION_ODD_PRIMES', Lpls + Lmin), - Object('uint64_t[]', 'TORSION_ODD_POWERS', Epls + Emin), - Object('uint64_t[]', 'TORSION_PLUS_ODD_PRIMES', Lpls), # TODO deduplicate? - Object('size_t[]', 'TORSION_PLUS_ODD_POWERS', Epls), # TODO deduplicate? - Object('uint64_t[]', 'TORSION_MINUS_ODD_PRIMES', Lmin), # TODO deduplicate? - Object('size_t[]', 'TORSION_MINUS_ODD_POWERS', Emin), # TODO deduplicate? - Object('size_t[]', 'DEGREE_COMMITMENT_POWERS', [Dcom.valuation(l) for l in Lpls+Lmin]), #FIXME should be ec_degree_odd_t - Object('ibz_t', 'CHARACTERISTIC', Ibz(p)), - Object('ibz_t', 'TORSION_ODD', Ibz(Tpls * Tmin)), - Object('ibz_t[]', 'TORSION_ODD_PRIMEPOWERS', [Ibz(l^e) for Tpm in (Tpls,Tmin) for l,e in Tpm.factor()]), - Object('ibz_t', 'TORSION_ODD_PLUS', Ibz(Tpls)), - Object('ibz_t', 'TORSION_ODD_MINUS', Ibz(Tmin)), - Object('ibz_t', 'TORSION_PLUS_2POWER', Ibz(tors2part)), - Object('ibz_t', 'TORSION_PLUS_3POWER', Ibz(tors3part)), - Object('ibz_t', 'TORSION_PLUS_23POWER', Ibz(tors23part)), - Object('ibz_t', 'DEGREE_COMMITMENT', Ibz(Dcom)), - Object('ibz_t', 'DEGREE_COMMITMENT_PLUS', Ibz(gcd(Dcom, Tpls))), - Object('ibz_t', 'DEGREE_COMMITMENT_MINUS', Ibz(gcd(Dcom, Tmin))), - Object('ibz_t', 'DEGREE_CHALLENGE', Ibz(Dchall)), - ]) - -with open('include/torsion_constants.h','w') as hfile: - with open('torsion_constants.c','w') as cfile: - print(f'#include ', file=hfile) - print(f'#include ', file=cfile) - print(f'#include ', file=cfile) - print(f'#include ', file=cfile) - - for k,v in defs.items(): - print(f'#define {k} {v}', file=hfile) - - objs.header(file=hfile) - objs.implementation(file=cfile) - diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fd8d809..70d59ae 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,92 +1,74 @@ -# There are the following dependencies -# ┌─┬──────┬─┐ ┌─┬────┬─┐ ┌─┬──────┬─┐ -# │ ├──────┤ │ │ ├────┤ │ │ ├──────┤ │ -# │ │Keygen│ │ │ │Sign│ │ │ │Verify│ │ -# │ ├──────┤ │ │ ├────┤ │ │ ├──────┤ │ -# └─┴───┬──┴─┘ └─┴─┬──┴─┘ └─┴───┬──┴─┘ -# │ │ │ -# │ │ │ -# ├────────────────────┼─────────────────┐ │ -# │ │ │ │ -# │ │ │ │ -# ┌───▼──┐ ┌──────▼────────┐ ┌────▼─────▼───────────┐ -# │ PRNG ◄────┬─────┤ Iso <-> Ideal ├───► Elliptic Curves, │ -# └───▲──┘ │ └──────┬────────┘ │ Pairings & Isogenies │ -# │ │ │ └───▲──────┬───────────┘ -# │ │ │ │ │ -# ┌───┴──┐ │ │ │ │ -# │ KLPT ◄────┘ │ ┌──────────┘ │ -# └───┬──┘ │ │ │ -# │ │ │ │ -# ┌─────────▼─────────┐ │ │ │ -# │ Quaternion orders │ │ │ ┌────▼───┐ -# │ and ideals │ │ │ │ GF(p²) │ -# └─────────┬─────────┘ │ │ └────┬───┘ -# │ ┌─┬──────▼─────┴──┬─┐ │ -# ┌─────▼─────┐ │ ├───────────────┤ │ ┌─────▼─────┐ -# │ MP BigInt │ │ │Precomputations│ │ │ FP BigInt │ -# └───────────┘ │ ├───────────────┤ │ └───────────┘ -# └─┴───────────────┴─┘ - add_subdirectory(common) -add_subdirectory(intbig) -add_subdirectory(quaternion) -add_subdirectory(precomp) -add_subdirectory(klpt) -add_subdirectory(gf) -add_subdirectory(ec) -add_subdirectory(id2iso) -add_subdirectory(protocols) +if(ENABLE_SIGN) + add_subdirectory(quaternion) +endif() + +add_subdirectory(mp) +add_subdirectory(gf) +add_subdirectory(precomp) +add_subdirectory(ec) +add_subdirectory(hd) +add_subdirectory(verification) + +if(ENABLE_SIGN) + add_subdirectory(id2iso) + add_subdirectory(signature) +endif() FOREACH(SVARIANT ${SVARIANT_S}) string(TOLOWER ${SVARIANT} SVARIANT_LOWER) string(TOUPPER ${SVARIANT} SVARIANT_UPPER) set(SOURCE_FILES_VARIANT sqisign.c) + # Library for SQIsign variant add_library(sqisign_${SVARIANT_LOWER} ${SOURCE_FILES_VARIANT}) - target_link_libraries(sqisign_${SVARIANT_LOWER} PUBLIC - ${LIB_PROTOCOLS_${SVARIANT_UPPER}} - ${LIB_ID2ISO_${SVARIANT_UPPER}} - ${LIB_KLPT_${SVARIANT_UPPER}} - ${LIB_QUATERNION} - ${LIB_PRECOMP_${SVARIANT_UPPER}} - ${LIB_INTBIG} - ${LIB_GF_${SVARIANT_UPPER}} - ${LIB_EC_${SVARIANT_UPPER}} - ${GMP} + target_link_libraries(sqisign_${SVARIANT_LOWER} PUBLIC + $<$:${LIB_SIGNATURE_${SVARIANT_UPPER}}> + ${LIB_VERIFICATION_${SVARIANT_UPPER}} + $<$:${LIB_ID2ISO_${SVARIANT_UPPER}}> + $<$:${LIB_QUATERNION}> + ${LIB_MP} + ${LIB_GF_${SVARIANT_UPPER}} + ${LIB_EC_${SVARIANT_UPPER}} + ${LIB_HD_${SVARIANT_UPPER}} + ${LIB_PRECOMP_${SVARIANT_UPPER}} + $<$:GMP> sqisign_common_sys ) - target_include_directories(sqisign_${SVARIANT_LOWER} PUBLIC ${INC_PROTOCOLS} ${INC_INTBIG} ${INC_QUATERNION} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_EC} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ${INC_KLPT} ${INC_ID2ISO} ../include PRIVATE common/generic internal) + target_include_directories(sqisign_${SVARIANT_LOWER} PUBLIC $<$:${INC_SIGNATURE}> ${INC_VERIFICATION} $<$:${INC_QUATERNION}> ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_MP} ${INC_EC} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ${INC_HD} $<$:${INC_ID2ISO}> ../include PRIVATE common/generic internal) target_compile_definitions(sqisign_${SVARIANT_LOWER} PUBLIC SQISIGN_VARIANT=${SVARIANT}) # Library for SQIsign variant (test) add_library(sqisign_${SVARIANT_LOWER}_test ${SOURCE_FILES_VARIANT}) - target_link_libraries(sqisign_${SVARIANT_LOWER}_test PUBLIC - ${LIB_PROTOCOLS_${SVARIANT_UPPER}} - ${LIB_ID2ISO_${SVARIANT_UPPER}} - ${LIB_KLPT_${SVARIANT_UPPER}} - ${LIB_QUATERNION} - ${LIB_PRECOMP_${SVARIANT_UPPER}} - ${LIB_INTBIG} - ${LIB_GF_${SVARIANT_UPPER}} - ${LIB_EC_${SVARIANT_UPPER}} - ${GMP} + target_link_libraries(sqisign_${SVARIANT_LOWER}_test PUBLIC + $<$:${LIB_SIGNATURE_${SVARIANT_UPPER}}> + ${LIB_VERIFICATION_${SVARIANT_UPPER}} + $<$:${LIB_ID2ISO_${SVARIANT_UPPER}}> + $<$:${LIB_QUATERNION}> + ${LIB_MP} + ${LIB_GF_${SVARIANT_UPPER}} + ${LIB_EC_${SVARIANT_UPPER}} + ${LIB_HD_${SVARIANT_UPPER}} + ${LIB_PRECOMP_${SVARIANT_UPPER}} + $<$:GMP> sqisign_common_test ) - target_include_directories(sqisign_${SVARIANT_LOWER}_test PUBLIC ${INC_PROTOCOLS} ${INC_INTBIG} ${INC_QUATERNION} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_EC} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ${INC_KLPT} ${INC_ID2ISO} ../include PRIVATE common/generic internal) + target_include_directories(sqisign_${SVARIANT_LOWER}_test PUBLIC $<$:${INC_SIGNATURE}> ${INC_VERIFICATION} $<$:${INC_QUATERNION}> ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_MP} ${INC_EC} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ${INC_HD} $<$:${INC_ID2ISO}> ../include PRIVATE common/generic internal) target_compile_definitions(sqisign_${SVARIANT_LOWER}_test PUBLIC SQISIGN_VARIANT=${SVARIANT}) # Library with NIST API set(SOURCE_FILE_NISTAPI nistapi/${SVARIANT_LOWER}/api.c) add_library(sqisign_${SVARIANT_LOWER}_nistapi ${SOURCE_FILE_NISTAPI}) - target_link_libraries(sqisign_${SVARIANT_LOWER}_nistapi PRIVATE sqisign_${SVARIANT_LOWER}) + target_link_libraries(sqisign_${SVARIANT_LOWER}_nistapi PUBLIC sqisign_${SVARIANT_LOWER}) target_include_directories(sqisign_${SVARIANT_LOWER}_nistapi PUBLIC nistapi/${SVARIANT_LOWER} PUBLIC ../include) + target_compile_definitions(sqisign_${SVARIANT_LOWER}_nistapi PUBLIC SQISIGN_VARIANT=${SVARIANT}) # Library with NIST API (test) add_library(sqisign_${SVARIANT_LOWER}_test_nistapi ${SOURCE_FILE_NISTAPI}) - target_link_libraries(sqisign_${SVARIANT_LOWER}_test_nistapi PRIVATE sqisign_${SVARIANT_LOWER}_test) + target_link_libraries(sqisign_${SVARIANT_LOWER}_test_nistapi PUBLIC sqisign_${SVARIANT_LOWER}_test) target_include_directories(sqisign_${SVARIANT_LOWER}_test_nistapi PUBLIC nistapi/${SVARIANT_LOWER}) + target_compile_definitions(sqisign_${SVARIANT_LOWER}_test_nistapi PUBLIC SQISIGN_VARIANT=${SVARIANT}) ENDFOREACH() diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 3338854..a27f0d8 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -1,3 +1,8 @@ +if (POLICY CMP0076) + cmake_policy(SET CMP0076 NEW) +endif() + get_filename_component(CCSD_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) string(TOUPPER ${CCSD_NAME} CCSD_NAME_UPPER) include(${SELECT_SQISIGN_VARIANT}) +include(${SELECT_IMPL_TYPE}) diff --git a/src/common/arm64crypto/CMakeLists.txt b/src/common/arm64crypto/CMakeLists.txt new file mode 100644 index 0000000..771dad0 --- /dev/null +++ b/src/common/arm64crypto/CMakeLists.txt @@ -0,0 +1,40 @@ +if(CMAKE_C_COMPILER_ID MATCHES "Clang") + set(SOURCE_FILES_COMMON_ARM64CRYPTO randombytes_ctrdrbg_inline_asm.c) +else() + set(SOURCE_FILES_COMMON_ARM64CRYPTO randombytes_ctrdrbg.c) + set_source_files_properties(randombytes_ctrdrbg.c PROPERTIES COMPILE_FLAGS -fno-strict-aliasing) +endif() + +foreach(SQISIGN_COMMON_TARGET sqisign_common_test sqisign_common_sys) + target_sources(${SQISIGN_COMMON_TARGET} PRIVATE ${SOURCE_FILES_COMMON_ARM64CRYPTO}) + target_include_directories(${SQISIGN_COMMON_TARGET} PRIVATE include) + target_compile_definitions(${SQISIGN_COMMON_TARGET} PRIVATE RANDOMBYTES_ARM64CRYPTO) + target_compile_options(${SQISIGN_COMMON_TARGET} PRIVATE -march=armv8-a+crypto) +endforeach() + +set(SOURCE_FILES_CTRDRBG_TEST_BENCHMARK + ${SOURCE_FILES_COMMON_ARM64CRYPTO} + ../ref/aes_c.c + ../ref/randombytes_ctrdrbg.c + ../generic/randombytes_system.c +) + +add_executable(sqisign_test_ctrdrbg_arm64crypto ${SOURCE_FILES_CTRDRBG_TEST_BENCHMARK} ../generic/test/test_ctrdrbg.c) +target_include_directories(sqisign_test_ctrdrbg_arm64crypto PRIVATE ${INC_PUBLIC} ${INC_COMMON} include ../ref/include) +target_compile_definitions(sqisign_test_ctrdrbg_arm64crypto PRIVATE + CTRDRBG_TEST_BENCH + RANDOMBYTES_INIT_PLATFORM=randombytes_init_arm64crypto + RANDOMBYTES_PLATFORM=randombytes_arm64crypto) +target_compile_options(sqisign_test_ctrdrbg_arm64crypto PRIVATE -march=armv8-a+crypto) + +add_test(sqisign_test_ctrdrbg_arm64crypto sqisign_test_ctrdrbg_arm64crypto) + +add_executable(sqisign_bench_ctrdrbg_arm64crypto ${SOURCE_FILES_CTRDRBG_TEST_BENCHMARK} ../generic/test/bench_ctrdrbg.c) +target_include_directories(sqisign_bench_ctrdrbg_arm64crypto PRIVATE ${INC_PUBLIC} ${INC_COMMON} include ../ref/include) +target_compile_definitions(sqisign_bench_ctrdrbg_arm64crypto PRIVATE + CTRDRBG_TEST_BENCH + RANDOMBYTES_INIT_PLATFORM=randombytes_init_arm64crypto + RANDOMBYTES_PLATFORM=randombytes_arm64crypto) +target_compile_options(sqisign_bench_ctrdrbg_arm64crypto PRIVATE -march=armv8-a+crypto) + +set(BM_BINS ${BM_BINS} sqisign_bench_ctrdrbg_arm64crypto CACHE INTERNAL "List of benchmark executables") diff --git a/src/common/arm64crypto/include/randombytes_arm64crypto.h b/src/common/arm64crypto/include/randombytes_arm64crypto.h new file mode 100644 index 0000000..88c4bf4 --- /dev/null +++ b/src/common/arm64crypto/include/randombytes_arm64crypto.h @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: Apache-2.0 + +#ifndef RANDOMBYTES_ARM64CRYPTO_H +#define RANDOMBYTES_ARM64CRYPTO_H + +#include + +#define RNG_SUCCESS 0 +#define RNG_BAD_MAXLEN -1 +#define RNG_BAD_OUTBUF -2 +#define RNG_BAD_REQ_LEN -3 + +typedef struct { + unsigned char buffer[16]; + int buffer_pos; + unsigned long length_remaining; + unsigned char key[32]; + unsigned char ctr[16]; +} AES_XOF_struct; + +typedef struct { + unsigned char Key[32]; + unsigned char V[16]; + int reseed_counter; +} AES256_CTR_DRBG_struct; + +#endif /* RANDOMBYTES_ARM64CRYPTO_H */ diff --git a/src/common/arm64crypto/randombytes_ctrdrbg.c b/src/common/arm64crypto/randombytes_ctrdrbg.c new file mode 100644 index 0000000..0f7a986 --- /dev/null +++ b/src/common/arm64crypto/randombytes_ctrdrbg.c @@ -0,0 +1,276 @@ +// SPDX-License-Identifier: Apache-2.0 + +#include "randombytes_arm64crypto.h" + +#include +#include + +static AES256_CTR_DRBG_struct DRBG_ctx; + +static inline uint32_t AES_sbox_x4(uint32_t in) { + uint8x16_t sbox_val = vreinterpretq_u8_u32(vdupq_n_u32(in)); + sbox_val = vaeseq_u8(sbox_val, vdupq_n_u8(0)); + + return vgetq_lane_u32(vreinterpretq_u32_u8(sbox_val), 0); +} + +#define ROTR32(x, n) ((x << (32 - n)) | (x >> n)) + +typedef union { + uint8_t u8[15][16]; + uint32_t u32[15][4]; +} subkeys_t; + +static void AES256_key_schedule(uint8_t subkeys[15][16], const uint8_t *key) { + subkeys_t *sk = (subkeys_t *)subkeys; + uint8_t rcon = 1; + uint32_t s; + int i, j; + + memcpy(&subkeys[0][0], key, 32 * sizeof(uint8_t)); + + for (i = 2; i < 14; i += 2) { + s = AES_sbox_x4(sk->u32[i - 1][3]); + sk->u32[i][0] = ROTR32(s, 8) ^ rcon ^ sk->u32[i - 2][0]; + + for (j = 1; j < 4; j++) { + sk->u32[i][j] = sk->u32[i][j - 1] ^ sk->u32[i - 2][j]; + } + + s = AES_sbox_x4(sk->u32[i][3]); + sk->u32[i + 1][0] = s ^ sk->u32[i - 1][0]; + + for (j = 1; j < 4; j++) { + sk->u32[i + 1][j] = sk->u32[i + 1][j - 1] ^ sk->u32[i - 1][j]; + } + + rcon = (rcon << 1) ^ ((rcon >> 7) * 0x11b); + } + + s = AES_sbox_x4(sk->u32[13][3]); + sk->u32[14][0] = ROTR32(s, 8) ^ rcon ^ sk->u32[12][0]; + + for (j = 1; j < 4; j++) { + sk->u32[14][j] = sk->u32[14][j - 1] ^ sk->u32[12][j]; + } +} + +#define AES256_ECB_XWAYS(ways, vsubkeys, ctr, out) \ + do { \ + uint8x16_t state[ways]; \ + \ + for (int j = 0; j < ways; j++) { \ + state[j] = vaeseq_u8(ctr[j], vsubkeys[0]); \ + state[j] = vaesmcq_u8(state[j]); \ + } \ + \ + for (int i = 1; i < 13; i++) { \ + for (int j = 0; j < ways; j++) { \ + state[j] = vaeseq_u8(state[j], vsubkeys[i]); \ + state[j] = vaesmcq_u8(state[j]); \ + } \ + } \ + \ + for (int j = 0; j < ways; j++) { \ + state[j] = vaeseq_u8(state[j], vsubkeys[13]); \ + state[j] = veorq_u8(state[j], vsubkeys[14]); \ + vst1q_u8(out + j * 16, state[j]); \ + } \ + } while (0); + +// subkeys - subkeys for AES-256 +// ctr - a 128-bit plaintext value +// buffer - a 128-bit ciphertext value +static void AES256_ECB(uint8x16_t vsubkeys[15], uint8x16_t ctr, + unsigned char *buffer) { + AES256_ECB_XWAYS(1, vsubkeys, (&ctr), buffer); +} + +// vsubkeys - subkeys for AES-256 +// ctr - an array of 3 x 128-bit plaintext value +// buffer - an array of 3 x 128-bit ciphertext value +static void AES256_ECB_x3(uint8x16_t vsubkeys[15], uint8x16_t ctr[3], + unsigned char *buffer) { + AES256_ECB_XWAYS(3, vsubkeys, ctr, buffer); +} + +static void bswap128(__uint128_t *x) { + uint64_t *x64 = (uint64_t *)x; + + uint64_t t = x64[0]; + x64[0] = x64[1]; + x64[1] = t; + + x64[0] = __builtin_bswap64(x64[0]); + x64[1] = __builtin_bswap64(x64[1]); +} + +static void add_to_V(unsigned char V[], int incr) { + __uint128_t *V128 = (__uint128_t *)V; + bswap128(V128); + (*V128) += incr; + bswap128(V128); +} + +static void AES256_CTR_DRBG_Update(unsigned char *provided_data, + uint8x16_t vsubkeys[15], unsigned char *Key, + unsigned char *V) { + unsigned char temp[48]; + __uint128_t V128, t; + uint64x2_t vV[3]; + + memcpy(&V128, DRBG_ctx.V, sizeof(V128)); + + bswap128(&V128); + + for (int j = 0; j < 3; j++) { + V128++; + t = V128; + bswap128(&t); + vV[j] = vld1q_u64((uint64_t *)&t); + } + + AES256_ECB_x3(vsubkeys, (uint8x16_t *)vV, temp); + + if (provided_data != NULL) + for (int i = 0; i < 48; i++) + temp[i] ^= provided_data[i]; + memcpy(Key, temp, 32); + memcpy(V, temp + 32, 16); + + add_to_V(DRBG_ctx.V, 1); +} + +void randombytes_init_arm64crypto(unsigned char *entropy_input, + unsigned char *personalization_string, + int security_strength) { + (void)security_strength; + + unsigned char seed_material[48]; + uint8_t subkeys[15][16]; + uint8x16_t vsubkeys[15]; + + memcpy(seed_material, entropy_input, 48); + if (personalization_string) + for (int i = 0; i < 48; i++) + seed_material[i] ^= personalization_string[i]; + memset(DRBG_ctx.Key, 0x00, 32); + memset(DRBG_ctx.V, 0x00, 16); + + AES256_key_schedule(subkeys, DRBG_ctx.Key); + for (int i = 0; i < 15; i++) { + vsubkeys[i] = vld1q_u8(subkeys[i]); + } + + AES256_CTR_DRBG_Update(seed_material, vsubkeys, DRBG_ctx.Key, DRBG_ctx.V); + DRBG_ctx.reseed_counter = 1; +} + +#define WAYS 4 + +int randombytes_arm64crypto(unsigned char *x, unsigned long long xlen) { + uint8_t subkeys[15][16]; + unsigned char block[16]; + __uint128_t V[WAYS], Vle[WAYS]; + uint8x16x4_t vV; + uint8x16_t vsubkeys[15]; + + AES256_key_schedule(subkeys, DRBG_ctx.Key); + + for (int j = 0; j < 15; j++) { + vsubkeys[j] = vld1q_u8(subkeys[j]); + } + + memcpy(&Vle[0], DRBG_ctx.V, sizeof(Vle[0])); + V[0] = Vle[0]; + vV.val[0] = vld1q_u8((uint8_t *)&V[0]); + bswap128(&Vle[0]); + for (int j = 1; j < WAYS; j++) { + Vle[j] = Vle[j - 1] + 1; + V[j] = Vle[j]; + bswap128(&V[j]); + vV.val[j] = vld1q_u8((uint8_t *)&V[j]); + } + + int entered_fast_path = (xlen >= WAYS * 16) ? 1 : 0; + + while (xlen >= WAYS * 16) { + for (int j = 0; j < WAYS; j++) { + Vle[j] += 4; + } + + for (int j = 0; j < WAYS; j++) { + vV.val[j] = vaeseq_u8(vV.val[j], vsubkeys[0]); + vV.val[j] = vaesmcq_u8(vV.val[j]); + } + + for (int i = 1; i < 13; i++) { + for (int j = 0; j < WAYS; j++) { + vV.val[j] = vaeseq_u8(vV.val[j], vsubkeys[i]); + vV.val[j] = vaesmcq_u8(vV.val[j]); + } + } + + for (int j = 0; j < WAYS; j++) { + vV.val[j] = vaeseq_u8(vV.val[j], vsubkeys[13]); + vV.val[j] = veorq_u8(vV.val[j], vsubkeys[14]); + vst1q_u8(x + j * 16, vV.val[j]); + } + + for (int j = 0; j < WAYS; j++) { + V[j] = Vle[j]; + bswap128(&V[j]); + } + + vV = vld1q_u8_x4((uint8_t *)V); + + x += WAYS * 16; + xlen -= WAYS * 16; + } + + if (entered_fast_path && xlen == 0) { + asm volatile("" : "+r,m"(Vle[3]) : : "memory"); + V[0] = Vle[3] - 4; + bswap128(&V[0]); + } + + while (xlen > 0) { + if (xlen > 16) { + AES256_ECB(vsubkeys, vld1q_u8((uint8_t *)&V[0]), x); + x += 16; + xlen -= 16; + + Vle[0]++; + V[0] = Vle[0]; + bswap128(&V[0]); + } else { + AES256_ECB(vsubkeys, vld1q_u8((uint8_t *)&V[0]), block); + memcpy(x, block, xlen); + xlen = 0; + } + } + + memcpy(DRBG_ctx.V, &V[0], sizeof(V[0])); + + AES256_CTR_DRBG_Update(NULL, vsubkeys, DRBG_ctx.Key, DRBG_ctx.V); + DRBG_ctx.reseed_counter++; + + return RNG_SUCCESS; +} + +#ifdef RANDOMBYTES_ARM64CRYPTO +int randombytes(unsigned char *random_array, unsigned long long nbytes) { + int ret = randombytes_arm64crypto(random_array, nbytes); +#ifdef ENABLE_CT_TESTING + VALGRIND_MAKE_MEM_UNDEFINED(random_array, ret); +#endif + return ret; +} + +void randombytes_init(unsigned char *entropy_input, + unsigned char *personalization_string, + int security_strength) { + randombytes_init_arm64crypto(entropy_input, personalization_string, + security_strength); +} +#endif diff --git a/src/common/arm64crypto/randombytes_ctrdrbg_inline_asm.c b/src/common/arm64crypto/randombytes_ctrdrbg_inline_asm.c new file mode 100644 index 0000000..4418c8c --- /dev/null +++ b/src/common/arm64crypto/randombytes_ctrdrbg_inline_asm.c @@ -0,0 +1,422 @@ +// SPDX-License-Identifier: Apache-2.0 + +#include +#include + +#include "randombytes_arm64crypto.h" + +typedef union { + uint8_t u8[16]; + uint64_t u64[2]; + __uint128_t u128; +} u128_t; + +static AES256_CTR_DRBG_struct DRBG_ctx; + +static inline uint32_t AES_sbox_x4(uint32_t in) { + uint8x16_t sbox_val = vreinterpretq_u8_u32(vdupq_n_u32(in)); + sbox_val = vaeseq_u8(sbox_val, vdupq_n_u8(0)); + + return vgetq_lane_u32(vreinterpretq_u32_u8(sbox_val), 0); +} + +#define ROTR32(x, n) ((x << (32 - n)) | (x >> n)) + +typedef union { + uint32_t u32[15][4]; +} subkeys_t; + +static void AES256_key_schedule(uint8_t subkeys[15][16], const uint8_t *key) { + subkeys_t *sk = (subkeys_t *)subkeys; + uint8_t rcon = 1; + uint32_t s; + int i, j; + + memcpy(&subkeys[0][0], key, 32 * sizeof(uint8_t)); + + for (i = 2; i < 14; i += 2) { + s = AES_sbox_x4(sk->u32[i - 1][3]); + sk->u32[i][0] = ROTR32(s, 8) ^ rcon ^ sk->u32[i - 2][0]; + + for (j = 1; j < 4; j++) { + sk->u32[i][j] = sk->u32[i][j - 1] ^ sk->u32[i - 2][j]; + } + + s = AES_sbox_x4(sk->u32[i][3]); + sk->u32[i + 1][0] = s ^ sk->u32[i - 1][0]; + + for (j = 1; j < 4; j++) { + sk->u32[i + 1][j] = sk->u32[i + 1][j - 1] ^ sk->u32[i - 1][j]; + } + + rcon = (rcon << 1) ^ ((rcon >> 7) * 0x11b); + } + + s = AES_sbox_x4(sk->u32[13][3]); + sk->u32[14][0] = ROTR32(s, 8) ^ rcon ^ sk->u32[12][0]; + + for (j = 1; j < 4; j++) { + sk->u32[14][j] = sk->u32[14][j - 1] ^ sk->u32[12][j]; + } +} + +#define AES256_ECB_XWAYS(ways, vsubkeys, ctr, out) \ + do { \ + uint8x16_t state[ways]; \ + \ + for (int j = 0; j < ways; j++) { \ + state[j] = vaeseq_u8(ctr[j], vsubkeys[0]); \ + state[j] = vaesmcq_u8(state[j]); \ + } \ + \ + for (int i = 1; i < 13; i++) { \ + for (int j = 0; j < ways; j++) { \ + state[j] = vaeseq_u8(state[j], vsubkeys[i]); \ + state[j] = vaesmcq_u8(state[j]); \ + } \ + } \ + \ + for (int j = 0; j < ways; j++) { \ + state[j] = vaeseq_u8(state[j], vsubkeys[13]); \ + state[j] = veorq_u8(state[j], vsubkeys[14]); \ + vst1q_u8(out + j * 16, state[j]); \ + } \ + } while (0); + +// subkeys - subkeys for AES-256 +// ctr - a 128-bit plaintext value +// buffer - a 128-bit ciphertext value +static void AES256_ECB(uint8x16_t vsubkeys[15], uint8x16_t ctr, + unsigned char *buffer) { + AES256_ECB_XWAYS(1, vsubkeys, (&ctr), buffer); +} + +// vsubkeys - subkeys for AES-256 +// ctr - an array of 3 x 128-bit plaintext value +// buffer - an array of 3 x 128-bit ciphertext value +static void AES256_ECB_x3(uint8x16_t vsubkeys[15], uint8x16_t ctr[3], + unsigned char *buffer) { + AES256_ECB_XWAYS(3, vsubkeys, ctr, buffer); +} + +static void bswap128(u128_t *x) { + uint64_t t = x->u64[0]; + x->u64[0] = x->u64[1]; + x->u64[1] = t; + + x->u64[0] = __builtin_bswap64(x->u64[0]); + x->u64[1] = __builtin_bswap64(x->u64[1]); +} + +static void incr_V(u128_t *V) { + bswap128(V); + V->u128++; + bswap128(V); +} + +static void AES256_CTR_DRBG_Update(const unsigned char *provided_data, + uint8x16_t vsubkeys[15], unsigned char *Key, + unsigned char *V) { + (void)V; + + unsigned char temp[48]; + u128_t V128, t; + uint64x2_t vV[3]; + + memcpy(&V128, DRBG_ctx.V, sizeof(V128)); + + bswap128(&V128); + + for (int j = 0; j < 3; j++) { + V128.u128++; + t = V128; + bswap128(&t); + vV[j] = vld1q_u64((uint64_t *)&t); + } + + AES256_ECB_x3(vsubkeys, (uint8x16_t *)vV, temp); + + if (provided_data != NULL) + for (int i = 0; i < 48; i++) + temp[i] ^= provided_data[i]; + memcpy(Key, temp, 32); + memcpy(V128.u8, temp + 32, 16); + + incr_V(&V128); + + memcpy(DRBG_ctx.V, V128.u8, 16); +} + +void randombytes_init_arm64crypto(unsigned char *entropy_input, + unsigned char *personalization_string, + int security_strength) { + (void)security_strength; + + unsigned char seed_material[48]; + uint8_t subkeys[15][16]; + uint8x16_t vsubkeys[15]; + + memcpy(seed_material, entropy_input, 48); + if (personalization_string) + for (int i = 0; i < 48; i++) + seed_material[i] ^= personalization_string[i]; + memset(DRBG_ctx.Key, 0x00, 32); + memset(DRBG_ctx.V, 0x00, 16); + + AES256_key_schedule(subkeys, DRBG_ctx.Key); + for (int i = 0; i < 15; i++) { + vsubkeys[i] = vld1q_u8(subkeys[i]); + } + + AES256_CTR_DRBG_Update(seed_material, vsubkeys, DRBG_ctx.Key, DRBG_ctx.V); + DRBG_ctx.reseed_counter = 1; +} + +#define WAYS 4 + +int randombytes_arm64crypto(unsigned char *x, unsigned long long xlen) { + uint8_t subkeys[15][16]; + unsigned char block[16]; + u128_t V[WAYS], Vle[WAYS]; + uint8x16x4_t vV; + uint8x16_t vsubkeys[15]; + + AES256_key_schedule(subkeys, DRBG_ctx.Key); + + for (int j = 0; j < 15; j++) { + vsubkeys[j] = vld1q_u8(subkeys[j]); + } + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Woverlength-strings" + asm("ldp %[V0l], %[V0h], %[DRBG_ctx_V] \n\t" + "stp %[V0l], %[V0h], [%[V] ] \n\t" + "rev %[Vle0h], %[V0l] \n\t" + "rev %[Vle0l], %[V0h] \n\t" + "adds %[Vle1l], %[Vle0l], #1 \n\t" + "adc %[Vle1h], %[Vle0h], xzr \n\t" + "rev %[V1h], %[Vle1l] \n\t" + "rev %[V1l], %[Vle1h] \n\t" + "stp %[V1l], %[V1h], [%[V], #16] \n\t" + "adds %[Vle2l], %[Vle0l], #2 \n\t" + "adc %[Vle2h], %[Vle0h], xzr \n\t" + "rev %[V2h], %[Vle2l] \n\t" + "rev %[V2l], %[Vle2h] \n\t" + "stp %[V2l], %[V2h], [%[V], #32] \n\t" + "adds %[Vle3l], %[Vle0l], #3 \n\t" + "adc %[Vle3h], %[Vle0h], xzr \n\t" + "rev %[V3h], %[Vle3l] \n\t" + "rev %[V3l], %[Vle3h] \n\t" + "stp %[V3l], %[V3h], [%[V], #48] \n\t" + "ld1 { %[vV0].16b, %[vV1].16b, %[vV2].16b, %[vV3].16b }, [%[V]]\n\t" + "cmp %[xlen], #64 \n\t" + "b.lo 2f \n\t" + ".p2align 6 \n\t" + "1: \n\t" + "aese %[vV0].16b, %[vsk0].16b \n\t" + "aesmc %[vV0].16b, %[vV0].16b \n\t" + "aese %[vV1].16b, %[vsk0].16b \n\t" + "aesmc %[vV1].16b, %[vV1].16b \n\t" + "aese %[vV2].16b, %[vsk0].16b \n\t" + "aesmc %[vV2].16b, %[vV2].16b \n\t" + "aese %[vV3].16b, %[vsk0].16b \n\t" + "aesmc %[vV3].16b, %[vV3].16b \n\t" + "aese %[vV0].16b, %[vsk1].16b \n\t" + "aesmc %[vV0].16b, %[vV0].16b \n\t" + "aese %[vV1].16b, %[vsk1].16b \n\t" + "aesmc %[vV1].16b, %[vV1].16b \n\t" + "aese %[vV2].16b, %[vsk1].16b \n\t" + "aesmc %[vV2].16b, %[vV2].16b \n\t" + "aese %[vV3].16b, %[vsk1].16b \n\t" + "aesmc %[vV3].16b, %[vV3].16b \n\t" + "adds %[Vle0l], %[Vle0l], #4 \n\t" + "adc %[Vle0h], %[Vle0h], xzr \n\t" + "adds %[Vle1l], %[Vle1l], #4 \n\t" + "adc %[Vle1h], %[Vle1h], xzr \n\t" + "adds %[Vle2l], %[Vle2l], #4 \n\t" + "adc %[Vle2h], %[Vle2h], xzr \n\t" + "adds %[Vle3l], %[Vle3l], #4 \n\t" + "adc %[Vle3h], %[Vle3h], xzr \n\t" + "aese %[vV0].16b, %[vsk2].16b \n\t" + "aesmc %[vV0].16b, %[vV0].16b \n\t" + "aese %[vV1].16b, %[vsk2].16b \n\t" + "aesmc %[vV1].16b, %[vV1].16b \n\t" + "aese %[vV2].16b, %[vsk2].16b \n\t" + "aesmc %[vV2].16b, %[vV2].16b \n\t" + "aese %[vV3].16b, %[vsk2].16b \n\t" + "aesmc %[vV3].16b, %[vV3].16b \n\t" + "aese %[vV0].16b, %[vsk3].16b \n\t" + "aesmc %[vV0].16b, %[vV0].16b \n\t" + "aese %[vV1].16b, %[vsk3].16b \n\t" + "aesmc %[vV1].16b, %[vV1].16b \n\t" + "aese %[vV2].16b, %[vsk3].16b \n\t" + "aesmc %[vV2].16b, %[vV2].16b \n\t" + "aese %[vV3].16b, %[vsk3].16b \n\t" + "aesmc %[vV3].16b, %[vV3].16b \n\t" + "rev %[V0h], %[Vle0l] \n\t" + "rev %[V0l], %[Vle0h] \n\t" + "rev %[V1h], %[Vle1l] \n\t" + "rev %[V1l], %[Vle1h] \n\t" + "rev %[V2h], %[Vle2l] \n\t" + "rev %[V2l], %[Vle2h] \n\t" + "rev %[V3h], %[Vle3l] \n\t" + "rev %[V3l], %[Vle3h] \n\t" + "aese %[vV0].16b, %[vsk4].16b \n\t" + "aesmc %[vV0].16b, %[vV0].16b \n\t" + "aese %[vV1].16b, %[vsk4].16b \n\t" + "aesmc %[vV1].16b, %[vV1].16b \n\t" + "aese %[vV2].16b, %[vsk4].16b \n\t" + "aesmc %[vV2].16b, %[vV2].16b \n\t" + "aese %[vV3].16b, %[vsk4].16b \n\t" + "aesmc %[vV3].16b, %[vV3].16b \n\t" + "aese %[vV0].16b, %[vsk5].16b \n\t" + "aesmc %[vV0].16b, %[vV0].16b \n\t" + "aese %[vV1].16b, %[vsk5].16b \n\t" + "aesmc %[vV1].16b, %[vV1].16b \n\t" + "aese %[vV2].16b, %[vsk5].16b \n\t" + "aesmc %[vV2].16b, %[vV2].16b \n\t" + "aese %[vV3].16b, %[vsk5].16b \n\t" + "aesmc %[vV3].16b, %[vV3].16b \n\t" + "aese %[vV0].16b, %[vsk6].16b \n\t" + "aesmc %[vV0].16b, %[vV0].16b \n\t" + "aese %[vV1].16b, %[vsk6].16b \n\t" + "aesmc %[vV1].16b, %[vV1].16b \n\t" + "aese %[vV2].16b, %[vsk6].16b \n\t" + "aesmc %[vV2].16b, %[vV2].16b \n\t" + "aese %[vV3].16b, %[vsk6].16b \n\t" + "aesmc %[vV3].16b, %[vV3].16b \n\t" + "aese %[vV0].16b, %[vsk7].16b \n\t" + "aesmc %[vV0].16b, %[vV0].16b \n\t" + "aese %[vV1].16b, %[vsk7].16b \n\t" + "aesmc %[vV1].16b, %[vV1].16b \n\t" + "aese %[vV2].16b, %[vsk7].16b \n\t" + "aesmc %[vV2].16b, %[vV2].16b \n\t" + "aese %[vV3].16b, %[vsk7].16b \n\t" + "aesmc %[vV3].16b, %[vV3].16b \n\t" + "aese %[vV0].16b, %[vsk8].16b \n\t" + "aesmc %[vV0].16b, %[vV0].16b \n\t" + "aese %[vV1].16b, %[vsk8].16b \n\t" + "aesmc %[vV1].16b, %[vV1].16b \n\t" + "aese %[vV2].16b, %[vsk8].16b \n\t" + "aesmc %[vV2].16b, %[vV2].16b \n\t" + "aese %[vV3].16b, %[vsk8].16b \n\t" + "aesmc %[vV3].16b, %[vV3].16b \n\t" + "aese %[vV0].16b, %[vsk9].16b \n\t" + "aesmc %[vV0].16b, %[vV0].16b \n\t" + "aese %[vV1].16b, %[vsk9].16b \n\t" + "aesmc %[vV1].16b, %[vV1].16b \n\t" + "aese %[vV2].16b, %[vsk9].16b \n\t" + "aesmc %[vV2].16b, %[vV2].16b \n\t" + "aese %[vV3].16b, %[vsk9].16b \n\t" + "aesmc %[vV3].16b, %[vV3].16b \n\t" + "stp %[V0l], %[V0h], [%[V]] \n\t" + "stp %[V1l], %[V1h], [%[V], #16] \n\t" + "stp %[V2l], %[V2h], [%[V], #32] \n\t" + "stp %[V3l], %[V3h], [%[V], #48] \n\t" + "aese %[vV0].16b, %[vsk10].16b \n\t" + "aesmc %[vV0].16b, %[vV0].16b \n\t" + "aese %[vV1].16b, %[vsk10].16b \n\t" + "aesmc %[vV1].16b, %[vV1].16b \n\t" + "aese %[vV2].16b, %[vsk10].16b \n\t" + "aesmc %[vV2].16b, %[vV2].16b \n\t" + "aese %[vV3].16b, %[vsk10].16b \n\t" + "aesmc %[vV3].16b, %[vV3].16b \n\t" + "aese %[vV0].16b, %[vsk11].16b \n\t" + "aesmc %[vV0].16b, %[vV0].16b \n\t" + "aese %[vV1].16b, %[vsk11].16b \n\t" + "aesmc %[vV1].16b, %[vV1].16b \n\t" + "aese %[vV2].16b, %[vsk11].16b \n\t" + "aesmc %[vV2].16b, %[vV2].16b \n\t" + "aese %[vV3].16b, %[vsk11].16b \n\t" + "aesmc %[vV3].16b, %[vV3].16b \n\t" + "aese %[vV0].16b, %[vsk12].16b \n\t" + "aesmc %[vV0].16b, %[vV0].16b \n\t" + "aese %[vV1].16b, %[vsk12].16b \n\t" + "aesmc %[vV1].16b, %[vV1].16b \n\t" + "aese %[vV2].16b, %[vsk12].16b \n\t" + "aesmc %[vV2].16b, %[vV2].16b \n\t" + "aese %[vV3].16b, %[vsk12].16b \n\t" + "aesmc %[vV3].16b, %[vV3].16b \n\t" + "aese %[vV0].16b, %[vsk13].16b \n\t" + "eor %[vV0].16b, %[vV0].16b, %[vsk14].16b \n\t" + "aese %[vV1].16b, %[vsk13].16b \n\t" + "eor %[vV1].16b, %[vV1].16b, %[vsk14].16b \n\t" + "stp %q[vV0], %q[vV1], [%[x]], #32\n\t" + "aese %[vV2].16b, %[vsk13].16b \n\t" + "eor %[vV2].16b, %[vV2].16b, %[vsk14].16b \n\t" + "aese %[vV3].16b, %[vsk13].16b \n\t" + "eor %[vV3].16b, %[vV3].16b, %[vsk14].16b \n\t" + "stp %q[vV2], %q[vV3], [%[x]], #32\n\t" + "sub %[xlen], %[xlen], #64 \n\t" + "ld1 { %[vV0].16b, %[vV1].16b, %[vV2].16b, %[vV3].16b }, [%[V]]\n\t" + "cmp %[xlen], #64 \n\t" + "b.hs 1b \n\t" + "cbnz %[xlen], 2f \n\t" + "subs %[V0h], %[Vle3l], #4 \n\t" + "sbc %[V0l], %[Vle3h], xzr \n\t" + "rev %[V0h], %[V0h] \n\t" + "rev %[V0l], %[V0l] \n\t" + "stp %[V0l], %[V0h], [%[V]] \n\t" + "2: \n\t" + : [vV0] "=&w"(vV.val[0]), [vV1] "=&w"(vV.val[1]), [vV2] "=&w"(vV.val[2]), + [vV3] "=&w"(vV.val[3]), [Vle0l] "=&r"(Vle[0].u64[0]), + [Vle0h] "=&r"(Vle[0].u64[1]), [Vle1l] "=&r"(Vle[1].u64[0]), + [Vle1h] "=&r"(Vle[1].u64[1]), [Vle2l] "=&r"(Vle[2].u64[0]), + [Vle2h] "=&r"(Vle[2].u64[1]), [Vle3l] "=&r"(Vle[3].u64[0]), + [Vle3h] "=&r"(Vle[3].u64[1]), [x] "+r"(x), [xlen] "+r"(xlen), + [V0l] "=&r"(V[0].u64[0]), [V0h] "=&r"(V[0].u64[1]), + [V1l] "=&r"(V[1].u64[0]), [V1h] "=&r"(V[1].u64[1]), + [V2l] "=&r"(V[2].u64[0]), [V2h] "=&r"(V[2].u64[1]), + [V3l] "=&r"(V[3].u64[0]), [V3h] "=&r"(V[3].u64[1]), + "=m"(*(unsigned char(*)[64])x), "=m"(*(unsigned char(*)[64])V) + : + [vsk0] "w"(vsubkeys[0]), [vsk1] "w"(vsubkeys[1]), [vsk2] "w"(vsubkeys[2]), + [vsk3] "w"(vsubkeys[3]), [vsk4] "w"(vsubkeys[4]), [vsk5] "w"(vsubkeys[5]), + [vsk6] "w"(vsubkeys[6]), [vsk7] "w"(vsubkeys[7]), [vsk8] "w"(vsubkeys[8]), + [vsk9] "w"(vsubkeys[9]), [vsk10] "w"(vsubkeys[10]), + [vsk11] "w"(vsubkeys[11]), [vsk12] "w"(vsubkeys[12]), + [vsk13] "w"(vsubkeys[13]), [vsk14] "w"(vsubkeys[14]), [V] "r"(V), + [DRBG_ctx_V] "m"(DRBG_ctx.V) + : "cc"); +#pragma GCC diagnostic pop + + while (xlen > 0) { + if (xlen > 16) { + AES256_ECB(vsubkeys, vld1q_u8((uint8_t *)&V[0]), x); + x += 16; + xlen -= 16; + + Vle[0].u128++; + V[0] = Vle[0]; + bswap128(&V[0]); + } else { + AES256_ECB(vsubkeys, vld1q_u8((uint8_t *)&V[0]), block); + memcpy(x, block, xlen); + xlen = 0; + } + } + + memcpy(DRBG_ctx.V, &V[0], sizeof(V[0])); + + AES256_CTR_DRBG_Update(NULL, vsubkeys, DRBG_ctx.Key, DRBG_ctx.V); + DRBG_ctx.reseed_counter++; + + return RNG_SUCCESS; +} + +#ifdef RANDOMBYTES_ARM64CRYPTO +int randombytes(unsigned char *random_array, unsigned long long nbytes) { + int ret = randombytes_arm64crypto(random_array, nbytes); +#ifdef ENABLE_CT_TESTING + VALGRIND_MAKE_MEM_UNDEFINED(random_array, ret); +#endif + return ret; +} + +void randombytes_init(unsigned char *entropy_input, + unsigned char *personalization_string, + int security_strength) { + randombytes_init_arm64crypto(entropy_input, personalization_string, + security_strength); +} +#endif diff --git a/src/common/broadwell/CMakeLists.txt b/src/common/broadwell/CMakeLists.txt new file mode 100644 index 0000000..576c2ab --- /dev/null +++ b/src/common/broadwell/CMakeLists.txt @@ -0,0 +1,43 @@ +set(SOURCE_FILES_COMMON_AESNI + aes_ni.c + ctr_drbg.c + randombytes_ctrdrbg_aesni.c + vaes256_key_expansion.S +) + +foreach(SQISIGN_COMMON_TARGET sqisign_common_test sqisign_common_sys) + target_sources(${SQISIGN_COMMON_TARGET} PRIVATE ${SOURCE_FILES_COMMON_AESNI}) + target_include_directories(${SQISIGN_COMMON_TARGET} PRIVATE include) + target_compile_definitions(${SQISIGN_COMMON_TARGET} PRIVATE RANDOMBYTES_AES_NI) + target_compile_options(${SQISIGN_COMMON_TARGET} PRIVATE -maes -mavx2) +endforeach() + +set(SOURCE_FILES_CTRDRBG_TEST_BENCHMARK + ../ref/aes_c.c + aes_ni.c + ctr_drbg.c + randombytes_ctrdrbg_aesni.c + ../ref/randombytes_ctrdrbg.c + ../generic/randombytes_system.c + vaes256_key_expansion.S +) + +add_executable(sqisign_test_ctrdrbg_intel ${SOURCE_FILES_CTRDRBG_TEST_BENCHMARK} ../generic/test/test_ctrdrbg.c) +target_include_directories(sqisign_test_ctrdrbg_intel PRIVATE ${INC_PUBLIC} ${INC_COMMON} include ../ref/include) +target_compile_definitions(sqisign_test_ctrdrbg_intel PRIVATE + CTRDRBG_TEST_BENCH + RANDOMBYTES_INIT_PLATFORM=randombytes_init_aes_ni + RANDOMBYTES_PLATFORM=randombytes_aes_ni) +target_compile_options(sqisign_test_ctrdrbg_intel PRIVATE -maes -mavx2) + +add_test(sqisign_test_ctrdrbg_intel sqisign_test_ctrdrbg_intel) + +add_executable(sqisign_bench_ctrdrbg_intel ${SOURCE_FILES_CTRDRBG_TEST_BENCHMARK} ../generic/test/bench_ctrdrbg.c) +target_include_directories(sqisign_bench_ctrdrbg_intel PRIVATE ${INC_PUBLIC} ${INC_COMMON} include ../ref/include) +target_compile_definitions(sqisign_bench_ctrdrbg_intel PRIVATE + CTRDRBG_TEST_BENCH + RANDOMBYTES_INIT_PLATFORM=randombytes_init_aes_ni + RANDOMBYTES_PLATFORM=randombytes_aes_ni) +target_compile_options(sqisign_bench_ctrdrbg_intel PRIVATE -maes -mavx2) + +set(BM_BINS ${BM_BINS} sqisign_bench_ctrdrbg_intel CACHE INTERNAL "List of benchmark executables") diff --git a/src/common/broadwell/aes_ni.c b/src/common/broadwell/aes_ni.c new file mode 100644 index 0000000..f87762c --- /dev/null +++ b/src/common/broadwell/aes_ni.c @@ -0,0 +1,258 @@ +/*************************************************************************** +* This implementation is a modified version of the code, +* written by Nir Drucker and Shay Gueron +* AWS Cryptographic Algorithms Group +* (ndrucker@amazon.com, gueron@amazon.com) +* +* Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. +* +* Licensed under the Apache License, Version 2.0 (the "License"). +* You may not use this file except in compliance with the License. +* A copy of the License is located at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* or in the "license" file accompanying this file. This file is distributed +* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +* express or implied. See the License for the specific language governing +* permissions and limitations under the License. +* The license is detailed in the file LICENSE.txt, and applies to this file. +* ***************************************************************************/ + +#include "aes_ni.h" +#include + +#include +#include + +#define AESENC(m, key) _mm_aesenc_si128(m, key) +#define AESENCLAST(m, key) _mm_aesenclast_si128(m, key) +#define XOR(a, b) _mm_xor_si128(a, b) +#define ADD32(a, b) _mm_add_epi32(a, b) +#define SHUF8(a, mask) _mm_shuffle_epi8(a, mask) + +#define ZERO256 _mm256_zeroall + +#define BSWAP_MASK 0x00010203, 0x04050607, 0x08090a0b, 0x0c0d0e0f + +#ifdef VAES256 +#define VAESENC(a, key) _mm256_aesenc_epi128(a, key) +#define VAESENCLAST(a, key) _mm256_aesenclast_epi128(a, key) +#define EXTRACT128(a, imm) _mm256_extracti128_si256(a, imm) +#define XOR256(a, b) _mm256_xor_si256(a,b) +#define ADD32_256(a, b) _mm256_add_epi32(a,b) +#define SHUF8_256(a, mask) _mm256_shuffle_epi8(a, mask) +#endif + +#ifdef VAES512 +#define VAESENC(a, key) _mm512_aesenc_epi128(a, key) +#define VAESENCLAST(a, key) _mm512_aesenclast_epi128(a, key) +#define EXTRACT128(a, imm) _mm512_extracti64x2_epi64(a, imm) +#define XOR512(a, b) _mm512_xor_si512(a,b) +#define ADD32_512(a, b) _mm512_add_epi32(a,b) +#define SHUF8_512(a, mask) _mm512_shuffle_epi8(a, mask) +#endif + +_INLINE_ __m128i load_m128i(IN const uint8_t *ctr) +{ + return _mm_set_epi8(ctr[0], ctr[1], ctr[2], ctr[3], + ctr[4], ctr[5], ctr[6], ctr[7], + ctr[8], ctr[9], ctr[10], ctr[11], + ctr[12], ctr[13], ctr[14], ctr[15]); +} + +_INLINE_ __m128i loadr_m128i(IN const uint8_t *ctr) +{ + return _mm_setr_epi8(ctr[0], ctr[1], ctr[2], ctr[3], + ctr[4], ctr[5], ctr[6], ctr[7], + ctr[8], ctr[9], ctr[10], ctr[11], + ctr[12], ctr[13], ctr[14], ctr[15]); +} + +void aes256_enc(OUT uint8_t *ct, + IN const uint8_t *pt, + IN const aes256_ks_t *ks) { + uint32_t i = 0; + __m128i block = loadr_m128i(pt); + + block = XOR(block, ks->keys[0]); + for (i = 1; i < AES256_ROUNDS; i++) { + block = AESENC(block, ks->keys[i]); + } + block = AESENCLAST(block, ks->keys[AES256_ROUNDS]); + + _mm_storeu_si128((void*)ct, block); + + // Delete secrets from registers if any. + ZERO256(); +} + +void aes256_ctr_enc(OUT uint8_t *ct, + IN const uint8_t *ctr, + IN const uint32_t num_blocks, + IN const aes256_ks_t *ks) +{ + __m128i ctr_block = load_m128i(ctr); + + const __m128i bswap_mask = _mm_set_epi32(BSWAP_MASK); + const __m128i one = _mm_set_epi32(0,0,0,1); + + __m128i block = SHUF8(ctr_block, bswap_mask); + + for (uint32_t bidx = 0; bidx < num_blocks; bidx++) + { + block = XOR(block, ks->keys[0]); + for (uint32_t i = 1; i < AES256_ROUNDS; i++) { + block = AESENC(block, ks->keys[i]); + } + block = AESENCLAST(block, ks->keys[AES256_ROUNDS]); + + //We use memcpy to avoid align casting. + _mm_storeu_si128((void*)&ct[16*bidx], block); + + ctr_block = ADD32(ctr_block, one); + block = SHUF8(ctr_block, bswap_mask); + } + + // Delete secrets from registers if any. + ZERO256(); +} + +#ifdef VAES256 +_INLINE_ void load_ks(OUT __m256i ks256[AES256_ROUNDS + 1], + IN const aes256_ks_t *ks) +{ + for(uint32_t i = 0; i < AES256_ROUNDS + 1; i++) + { + ks256[i] = _mm256_broadcastsi128_si256(ks->keys[i]); + } +} + +// NIST 800-90A Table 3, Section 10.2.1 (no derivation function) states that +// max_number_of_bits_per_request is min((2^ctr_len - 4) x block_len, 2^19) <= 2^19 +// Therefore the maximal number of blocks (16 bytes) is 2^19/128 = 2^19/2^7 = 2^12 < 2^32 +// Here num_blocks is assumed to be less then 2^32. +// It is the caller responsiblity to ensure it. +void aes256_ctr_enc256(OUT uint8_t *ct, + IN const uint8_t *ctr, + IN const uint32_t num_blocks, + IN const aes256_ks_t *ks) +{ + const uint64_t num_par_blocks = num_blocks/2; + const uint64_t blocks_rem = num_blocks - (2*(num_par_blocks)); + + __m256i ks256[AES256_ROUNDS + 1]; + load_ks(ks256, ks); + + __m128i single_block = load_m128i(ctr); + __m256i ctr_blocks = _mm256_broadcastsi128_si256(single_block); + + // Preparing the masks + const __m256i bswap_mask = _mm256_set_epi32(BSWAP_MASK, BSWAP_MASK); + const __m256i two = _mm256_set_epi32(0,0,0,2,0,0,0,2); + const __m256i init = _mm256_set_epi32(0,0,0,1,0,0,0,0); + + // Initialize two parallel counters + ctr_blocks = ADD32_256(ctr_blocks, init); + __m256i p = SHUF8_256(ctr_blocks, bswap_mask); + + for (uint32_t block_idx = 0; block_idx < num_par_blocks; block_idx++) + { + p = XOR256(p, ks256[0]); + for (uint32_t i = 1; i < AES256_ROUNDS; i++) + { + p = VAESENC(p, ks256[i]); + } + p = VAESENCLAST(p, ks256[AES256_ROUNDS]); + + // We use memcpy to avoid align casting. + _mm256_storeu_si256((__m256i *)&ct[PAR_AES_BLOCK_SIZE * block_idx], p); + + // Increase the two counters in parallel + ctr_blocks = ADD32_256(ctr_blocks, two); + p = SHUF8_256(ctr_blocks, bswap_mask); + } + + if(0 != blocks_rem) + { + single_block = EXTRACT128(p, 0); + aes256_ctr_enc(&ct[PAR_AES_BLOCK_SIZE * num_par_blocks], + (const uint8_t*)&single_block, blocks_rem, ks); + } + + // Delete secrets from registers if any. + ZERO256(); +} + +#endif //VAES256 + +#ifdef VAES512 + +_INLINE_ void load_ks(OUT __m512i ks512[AES256_ROUNDS + 1], + IN const aes256_ks_t *ks) +{ + for(uint32_t i = 0; i < AES256_ROUNDS + 1; i++) + { + ks512[i] = _mm512_broadcast_i32x4(ks->keys[i]); + } +} + +// NIST 800-90A Table 3, Section 10.2.1 (no derivation function) states that +// max_number_of_bits_per_request is min((2^ctr_len - 4) x block_len, 2^19) <= 2^19 +// Therefore the maximal number of blocks (16 bytes) is 2^19/128 = 2^19/2^7 = 2^12 < 2^32 +// Here num_blocks is assumed to be less then 2^32. +// It is the caller responsiblity to ensure it. +void aes256_ctr_enc512(OUT uint8_t *ct, + IN const uint8_t *ctr, + IN const uint32_t num_blocks, + IN const aes256_ks_t *ks) +{ + const uint64_t num_par_blocks = num_blocks/4; + const uint64_t blocks_rem = num_blocks - (4*(num_par_blocks)); + + __m512i ks512[AES256_ROUNDS + 1]; + load_ks(ks512, ks); + + __m128i single_block = load_m128i(ctr); + __m512i ctr_blocks = _mm512_broadcast_i32x4(single_block); + + // Preparing the masks + const __m512i bswap_mask = _mm512_set_epi32(BSWAP_MASK, BSWAP_MASK, + BSWAP_MASK, BSWAP_MASK); + const __m512i four = _mm512_set_epi32(0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,4); + const __m512i init = _mm512_set_epi32(0,0,0,3,0,0,0,2,0,0,0,1,0,0,0,0); + + // Initialize four parallel counters + ctr_blocks = ADD32_512(ctr_blocks, init); + __m512i p = SHUF8_512(ctr_blocks, bswap_mask); + + for (uint32_t block_idx = 0; block_idx < num_par_blocks; block_idx++) + { + p = XOR512(p, ks512[0]); + for (uint32_t i = 1; i < AES256_ROUNDS; i++) + { + p = VAESENC(p, ks512[i]); + } + p = VAESENCLAST(p, ks512[AES256_ROUNDS]); + + + // We use memcpy to avoid align casting. + _mm512_storeu_si512(&ct[PAR_AES_BLOCK_SIZE * block_idx], p); + + // Increase the four counters in parallel + ctr_blocks = ADD32_512(ctr_blocks, four); + p = SHUF8_512(ctr_blocks, bswap_mask); + } + + if(0 != blocks_rem) + { + single_block = EXTRACT128(p, 0); + aes256_ctr_enc(&ct[PAR_AES_BLOCK_SIZE * num_par_blocks], + (const uint8_t*)&single_block, blocks_rem, ks); + } + + // Delete secrets from registers if any. + ZERO256(); +} + +#endif //VAES512 diff --git a/src/common/broadwell/ctr_drbg.c b/src/common/broadwell/ctr_drbg.c new file mode 100644 index 0000000..0717075 --- /dev/null +++ b/src/common/broadwell/ctr_drbg.c @@ -0,0 +1,201 @@ +/* Copyright (c) 2017, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ + +/*************************************************************************** + * Small modification by Nir Drucker and Shay Gueron + * AWS Cryptographic Algorithms Group + * (ndrucker@amazon.com, gueron@amazon.com) + * include: + * 1) Use memcpy/memset instead of OPENSSL_memcpy/memset + * 2) Include aes.h as the underlying aes code + * 3) Modifying the drbg structure + * ***************************************************************************/ + +#include "ctr_drbg.h" +#include + + +// Section references in this file refer to SP 800-90Ar1: +// http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-90Ar1.pdf + +int CTR_DRBG_init(CTR_DRBG_STATE *drbg, + const uint8_t entropy[CTR_DRBG_ENTROPY_LEN], + const uint8_t *personalization, size_t personalization_len) { + // Section 10.2.1.3.1 + if (personalization_len > CTR_DRBG_ENTROPY_LEN) { + return 0; + } + + uint8_t seed_material[CTR_DRBG_ENTROPY_LEN]; + memcpy(seed_material, entropy, CTR_DRBG_ENTROPY_LEN); + + for (size_t i = 0; i < personalization_len; i++) { + seed_material[i] ^= personalization[i]; + } + + // Section 10.2.1.2 + // kInitMask is the result of encrypting blocks with big-endian value 1, 2 + // and 3 with the all-zero AES-256 key. + static const uint8_t kInitMask[CTR_DRBG_ENTROPY_LEN] = { + 0x53, 0x0f, 0x8a, 0xfb, 0xc7, 0x45, 0x36, 0xb9, 0xa9, 0x63, 0xb4, 0xf1, + 0xc4, 0xcb, 0x73, 0x8b, 0xce, 0xa7, 0x40, 0x3d, 0x4d, 0x60, 0x6b, 0x6e, + 0x07, 0x4e, 0xc5, 0xd3, 0xba, 0xf3, 0x9d, 0x18, 0x72, 0x60, 0x03, 0xca, + 0x37, 0xa6, 0x2a, 0x74, 0xd1, 0xa2, 0xf5, 0x8e, 0x75, 0x06, 0x35, 0x8e, + }; + + for (size_t i = 0; i < sizeof(kInitMask); i++) { + seed_material[i] ^= kInitMask[i]; + } + + aes256_key_t key; + memcpy(key.raw, seed_material, 32); + memcpy(drbg->counter.bytes, seed_material + 32, 16); + + aes256_key_expansion(&drbg->ks, &key); + drbg->reseed_counter = 1; + + return 1; +} + +// ctr_inc adds |n| to the last four bytes of |drbg->counter|, treated as a +// big-endian number. +static void ctr32_add(CTR_DRBG_STATE *drbg, uint32_t n) { + drbg->counter.words[3] = + CRYPTO_bswap4(CRYPTO_bswap4(drbg->counter.words[3]) + n); +} + +static int ctr_drbg_update(CTR_DRBG_STATE *drbg, const uint8_t *data, + size_t data_len) { + // Per section 10.2.1.2, |data_len| must be |CTR_DRBG_ENTROPY_LEN|. Here, we + // allow shorter inputs and right-pad them with zeros. This is equivalent to + // the specified algorithm but saves a copy in |CTR_DRBG_generate|. + if (data_len > CTR_DRBG_ENTROPY_LEN) { + return 0; + } + + uint8_t temp[CTR_DRBG_ENTROPY_LEN]; + for (size_t i = 0; i < CTR_DRBG_ENTROPY_LEN; i += AES_BLOCK_SIZE) { + ctr32_add(drbg, 1); + aes256_enc(temp + i, drbg->counter.bytes, &drbg->ks); + } + + for (size_t i = 0; i < data_len; i++) { + temp[i] ^= data[i]; + } + + aes256_key_t key; + memcpy(key.raw, temp, 32); + memcpy(drbg->counter.bytes, temp + 32, 16); + aes256_key_expansion(&drbg->ks, &key); + + return 1; +} + +int CTR_DRBG_reseed(CTR_DRBG_STATE *drbg, + const uint8_t entropy[CTR_DRBG_ENTROPY_LEN], + const uint8_t *additional_data, + size_t additional_data_len) { + // Section 10.2.1.4 + uint8_t entropy_copy[CTR_DRBG_ENTROPY_LEN]; + + if (additional_data_len > 0) { + if (additional_data_len > CTR_DRBG_ENTROPY_LEN) { + return 0; + } + + memcpy(entropy_copy, entropy, CTR_DRBG_ENTROPY_LEN); + for (size_t i = 0; i < additional_data_len; i++) { + entropy_copy[i] ^= additional_data[i]; + } + + entropy = entropy_copy; + } + + if (!ctr_drbg_update(drbg, entropy, CTR_DRBG_ENTROPY_LEN)) { + return 0; + } + + drbg->reseed_counter = 1; + + return 1; +} + +int CTR_DRBG_generate(CTR_DRBG_STATE *drbg, uint8_t *out, size_t out_len, + const uint8_t *additional_data, + size_t additional_data_len) { + if (additional_data_len != 0 && + !ctr_drbg_update(drbg, additional_data, additional_data_len)) { + return 0; + } + + // kChunkSize is used to interact better with the cache. Since the AES-CTR + // code assumes that it's encrypting rather than just writing keystream, the + // buffer has to be zeroed first. Without chunking, large reads would zero + // the whole buffer, flushing the L1 cache, and then do another pass (missing + // the cache every time) to “encrypt” it. The code can avoid this by + // chunking. + static const size_t kChunkSize = 8 * 1024; + + while (out_len >= AES_BLOCK_SIZE) { + size_t todo = kChunkSize; + if (todo > out_len) { + todo = out_len; + } + + todo &= ~(AES_BLOCK_SIZE - 1); + + const size_t num_blocks = todo / AES_BLOCK_SIZE; + if (1) { + memset(out, 0, todo); + ctr32_add(drbg, 1); +#ifdef VAES512 + aes256_ctr_enc512(out, drbg->counter.bytes, num_blocks, &drbg->ks); +#elif defined(VAES256) + aes256_ctr_enc256(out, drbg->counter.bytes, num_blocks, &drbg->ks); +#else + aes256_ctr_enc(out, drbg->counter.bytes, num_blocks, &drbg->ks); +#endif + ctr32_add(drbg, num_blocks - 1); + } else { + for (size_t i = 0; i < todo; i += AES_BLOCK_SIZE) { + ctr32_add(drbg, 1); + aes256_enc(&out[i], drbg->counter.bytes, &drbg->ks); + } + } + + out += todo; + out_len -= todo; + } + + if (out_len > 0) { + uint8_t block[AES_BLOCK_SIZE]; + ctr32_add(drbg, 1); + aes256_enc(block, drbg->counter.bytes, &drbg->ks); + + memcpy(out, block, out_len); + } + + // Right-padding |additional_data| in step 2.2 is handled implicitly by + // |ctr_drbg_update|, to save a copy. + if (!ctr_drbg_update(drbg, additional_data, additional_data_len)) { + return 0; + } + + drbg->reseed_counter++; + return 1; +} + +void CTR_DRBG_clear(CTR_DRBG_STATE *drbg) { + secure_clean((uint8_t *)drbg, sizeof(CTR_DRBG_STATE)); +} diff --git a/src/common/broadwell/include/aes_ni.h b/src/common/broadwell/include/aes_ni.h new file mode 100644 index 0000000..3714b8e --- /dev/null +++ b/src/common/broadwell/include/aes_ni.h @@ -0,0 +1,85 @@ +/*************************************************************************** +* Written by Nir Drucker and Shay Gueron +* AWS Cryptographic Algorithms Group +* (ndrucker@amazon.com, gueron@amazon.com) +* +* Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. +* +* Licensed under the Apache License, Version 2.0 (the "License"). +* You may not use this file except in compliance with the License. +* A copy of the License is located at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* or in the "license" file accompanying this file. This file is distributed +* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +* express or implied. See the License for the specific language governing +* permissions and limitations under the License. +* The license is detailed in the file LICENSE.txt, and applies to this file. +* ***************************************************************************/ + +#pragma once + +#include +#include +#include "defs.h" + +#define MAX_AES_INVOKATION (MASK(32)) + +#define AES256_KEY_SIZE (32ULL) +#define AES256_KEY_BITS (AES256_KEY_SIZE * 8) +#define AES_BLOCK_SIZE (16ULL) +#define AES256_ROUNDS (14ULL) + +#ifdef VAES256 +#define PAR_AES_BLOCK_SIZE (AES_BLOCK_SIZE*2) +#elif defined(VAES512) +#define PAR_AES_BLOCK_SIZE (AES_BLOCK_SIZE*4) +#endif + +typedef ALIGN(16) struct aes256_key_s { + uint8_t raw[AES256_KEY_SIZE]; +} aes256_key_t; + +typedef ALIGN(16) struct aes256_ks_s { + __m128i keys[AES256_ROUNDS + 1]; +} aes256_ks_t; + +// The ks parameter must be 16 bytes aligned! +EXTERNC void aes256_key_expansion(OUT aes256_ks_t *ks, + IN const aes256_key_t *key); + +// Encrypt one 128-bit block ct = E(pt,ks) +void aes256_enc(OUT uint8_t *ct, + IN const uint8_t *pt, + IN const aes256_ks_t *ks); + +// Encrypt num_blocks 128-bit blocks +// ct[15:0] = E(pt[15:0],ks) +// ct[31:16] = E(pt[15:0] + 1,ks) +// ... +// ct[16*num_blocks - 1:16*(num_blocks-1)] = E(pt[15:0] + num_blocks,ks) +void aes256_ctr_enc(OUT uint8_t *ct, + IN const uint8_t *pt, + IN const uint32_t num_blocks, + IN const aes256_ks_t *ks); + +// Encrypt num_blocks 128-bit blocks using VAES (AVX-2) +// ct[15:0] = E(pt[15:0],ks) +// ct[31:16] = E(pt[15:0] + 1,ks) +// ... +// ct[16*num_blocks - 1:16*(num_blocks-1)] = E(pt[15:0] + num_blocks,ks) +void aes256_ctr_enc256(OUT uint8_t *ct, + IN const uint8_t *ctr, + IN const uint32_t num_blocks, + IN const aes256_ks_t *ks); + +// Encrypt num_blocks 128-bit blocks using VAES (AVX512) +// ct[15:0] = E(pt[15:0],ks) +// ct[31:16] = E(pt[15:0] + 1,ks) +// ... +// ct[16*num_blocks - 1:16*(num_blocks-1)] = E(pt[15:0] + num_blocks,ks) +void aes256_ctr_enc512(OUT uint8_t *ct, + IN const uint8_t *ctr, + IN const uint32_t num_blocks, + IN const aes256_ks_t *ks); diff --git a/src/common/broadwell/include/ctr_drbg.h b/src/common/broadwell/include/ctr_drbg.h new file mode 100644 index 0000000..70ccd4a --- /dev/null +++ b/src/common/broadwell/include/ctr_drbg.h @@ -0,0 +1,78 @@ +/* Copyright (c) 2017, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ + +/*************************************************************************** +* Small modification by Nir Drucker and Shay Gueron +* AWS Cryptographic Algorithms Group +* (ndrucker@amazon.com, gueron@amazon.com) +* include: +* 1) Use memcpy/memset instead of OPENSSL_memcpy/memset +* 2) Include aes.h as the underlying aes code +* 3) Modifying the drbg structure +* ***************************************************************************/ + +#pragma once + +#if defined(__cplusplus) +extern "C" { +#endif + +#include "aes_ni.h" + +// CTR_DRBG_STATE contains the state of a CTR_DRBG based on AES-256. See SP +// 800-90Ar1. +typedef struct { + aes256_ks_t ks; + union { + uint8_t bytes[16]; + uint32_t words[4]; + } counter; + uint64_t reseed_counter; +} CTR_DRBG_STATE; + +// See SP 800-90Ar1, table 3. +#define CTR_DRBG_ENTROPY_LEN 48 + +// CTR_DRBG_init initialises |*drbg| given |CTR_DRBG_ENTROPY_LEN| bytes of +// entropy in |entropy| and, optionally, a personalization string up to +// |CTR_DRBG_ENTROPY_LEN| bytes in length. It returns one on success and zero +// on error. +int CTR_DRBG_init(CTR_DRBG_STATE *drbg, + const uint8_t entropy[CTR_DRBG_ENTROPY_LEN], + const uint8_t *personalization, + size_t personalization_len); + +// CTR_DRBG_reseed reseeds |drbg| given |CTR_DRBG_ENTROPY_LEN| bytes of entropy +// in |entropy| and, optionally, up to |CTR_DRBG_ENTROPY_LEN| bytes of +// additional data. It returns one on success or zero on error. +int CTR_DRBG_reseed(CTR_DRBG_STATE *drbg, + const uint8_t entropy[CTR_DRBG_ENTROPY_LEN], + const uint8_t *additional_data, + size_t additional_data_len); + +// CTR_DRBG_generate processes to up |CTR_DRBG_ENTROPY_LEN| bytes of additional +// data (if any) and then writes |out_len| random bytes to |out|. It returns one on success or +// zero on error. +int CTR_DRBG_generate(CTR_DRBG_STATE *drbg, uint8_t *out, + size_t out_len, + const uint8_t *additional_data, + size_t additional_data_len); + +// CTR_DRBG_clear zeroises the state of |drbg|. +void CTR_DRBG_clear(CTR_DRBG_STATE *drbg); + + +#if defined(__cplusplus) +} // extern C +#endif diff --git a/src/common/broadwell/include/defs.h b/src/common/broadwell/include/defs.h new file mode 100644 index 0000000..09bb8b5 --- /dev/null +++ b/src/common/broadwell/include/defs.h @@ -0,0 +1,63 @@ +/*************************************************************************** +* Written by Nir Drucker and Shay Gueron +* AWS Cryptographic Algorithms Group +* (ndrucker@amazon.com, gueron@amazon.com) +* +* Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. +* +* Licensed under the Apache License, Version 2.0 (the "License"). +* You may not use this file except in compliance with the License. +* A copy of the License is located at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* or in the "license" file accompanying this file. This file is distributed +* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +* express or implied. See the License for the specific language governing +* permissions and limitations under the License. +* The license is detailed in the file LICENSE.txt, and applies to this file. +* ***************************************************************************/ + +#pragma once + +#include + +#ifdef __cplusplus + #define EXTERNC extern "C" +#else + #define EXTERNC +#endif + +// For code clarity. +#define IN +#define OUT + +#define ALIGN(n) __attribute__((aligned(n))) +#define _INLINE_ static inline + +typedef enum +{ + SUCCESS=0, + ERROR=1 +} status_t; + +#define SUCCESS 0 +#define ERROR 1 +#define GUARD(func) {if(SUCCESS != func) {return ERROR;}} + +#if defined(__GNUC__) && __GNUC__ >= 2 +static inline uint32_t CRYPTO_bswap4(uint32_t x) { + return __builtin_bswap32(x); +} +#endif + +_INLINE_ void secure_clean(OUT uint8_t *p, IN const uint32_t len) +{ +#ifdef _WIN32 + SecureZeroMemory(p, len); +#else + typedef void *(*memset_t)(void *, int, size_t); + static volatile memset_t memset_func = memset; + memset_func(p, 0, len); +#endif +} diff --git a/src/common/broadwell/randombytes_ctrdrbg_aesni.c b/src/common/broadwell/randombytes_ctrdrbg_aesni.c new file mode 100644 index 0000000..3fc67ac --- /dev/null +++ b/src/common/broadwell/randombytes_ctrdrbg_aesni.c @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: Apache-2.0 and Unknown +// +/* +NIST-developed software is provided by NIST as a public service. You may use, +copy, and distribute copies of the software in any medium, provided that you +keep intact this entire notice. You may improve, modify, and create derivative +works of the software or any portion of the software, and you may copy and +distribute such modifications or works. Modified works should carry a notice +stating that you changed the software and should note the date and nature of any +such change. Please explicitly acknowledge the National Institute of Standards +and Technology as the source of the software. + +NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY OF +ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, INCLUDING, +WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST NEITHER REPRESENTS +NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR +ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES NOT WARRANT OR MAKE +ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR THE RESULTS THEREOF, +INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, RELIABILITY, OR +USEFULNESS OF THE SOFTWARE. + +You are solely responsible for determining the appropriateness of using and +distributing the software and you assume all risks associated with its use, +including but not limited to the risks and costs of program errors, compliance +with applicable laws, damage to or loss of data, programs or equipment, and the +unavailability or interruption of operation. This software is not intended to be +used in any situation where a failure could cause risk of injury or damage to +property. The software developed by NIST employees is not subject to copyright +protection within the United States. +*/ + +#include + +#include +#include "ctr_drbg.h" + +#ifdef ENABLE_CT_TESTING +#include +#endif + +#define RNG_SUCCESS 0 +#define RNG_BAD_MAXLEN -1 +#define RNG_BAD_OUTBUF -2 +#define RNG_BAD_REQ_LEN -3 + +CTR_DRBG_STATE drbg; + +#ifndef CTRDRBG_TEST_BENCH +static +#endif +void +randombytes_init_aes_ni(unsigned char *entropy_input, + unsigned char *personalization_string, + int security_strength) { + (void)security_strength; // fixed to 256 + CTR_DRBG_init(&drbg, entropy_input, personalization_string, + (personalization_string == NULL) ? 0 : CTR_DRBG_ENTROPY_LEN); +} + +#ifndef CTRDRBG_TEST_BENCH +static +#endif +int +randombytes_aes_ni(unsigned char *x, size_t xlen) { + CTR_DRBG_generate(&drbg, x, xlen, NULL, 0); + return RNG_SUCCESS; +} + +#ifdef RANDOMBYTES_AES_NI +SQISIGN_API +int randombytes(unsigned char *random_array, unsigned long long nbytes) { + int ret = randombytes_aes_ni(random_array, nbytes); +#ifdef ENABLE_CT_TESTING + VALGRIND_MAKE_MEM_UNDEFINED(random_array, ret); +#endif + return ret; +} + +SQISIGN_API +void randombytes_init(unsigned char *entropy_input, + unsigned char *personalization_string, + int security_strength) { + randombytes_init_aes_ni(entropy_input, personalization_string, + security_strength); +} +#endif diff --git a/src/common/broadwell/vaes256_key_expansion.S b/src/common/broadwell/vaes256_key_expansion.S new file mode 100644 index 0000000..43d8fc2 --- /dev/null +++ b/src/common/broadwell/vaes256_key_expansion.S @@ -0,0 +1,122 @@ +#*************************************************************************** +# This implementation is a modified version of the code, +# written by Nir Drucker and Shay Gueron +# AWS Cryptographic Algorithms Group +# (ndrucker@amazon.com, gueron@amazon.com) +# +# Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"). +# You may not use this file except in compliance with the License. +# A copy of the License is located at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# or in the "license" file accompanying this file. This file is distributed +# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +# express or implied. See the License for the specific language governing +# permissions and limitations under the License. +# The license is detailed in the file LICENSE.txt, and applies to this file. +#*************************************************************************** + +.intel_syntax noprefix +.data + +.p2align 4, 0x90 +MASK1: +.long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d +CON1: +.long 1,1,1,1 + +.set k256_size, 32 + +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",@progbits +#endif +.text + +################################################################################ +# void aes256_key_expansion(OUT aes256_ks_t* ks, IN const uint8_t* key); +# The output parameter must be 16 bytes aligned! +# +#Linux ABI +#define out rdi +#define in rsi + +#define CON xmm0 +#define MASK_REG xmm1 + +#define IN0 xmm2 +#define IN1 xmm3 + +#define TMP1 xmm4 +#define TMP2 xmm5 + +#define ZERO xmm15 + +.macro ROUND1 in0 in1 + add out, k256_size + vpshufb TMP2, \in1, MASK_REG + aesenclast TMP2, CON + vpslld CON, CON, 1 + vpslldq TMP1, \in0, 4 + vpxor \in0, \in0, TMP1 + vpslldq TMP1, TMP1, 4 + vpxor \in0, \in0, TMP1 + vpslldq TMP1, TMP1, 4 + vpxor \in0, \in0, TMP1 + vpxor \in0, \in0, TMP2 + vmovdqa [out], \in0 + +.endm + +.macro ROUND2 + vpshufd TMP2, IN0, 0xff + aesenclast TMP2, ZERO + vpslldq TMP1, IN1, 4 + vpxor IN1, IN1, TMP1 + vpslldq TMP1, TMP1, 4 + vpxor IN1, IN1, TMP1 + vpslldq TMP1, TMP1, 4 + vpxor IN1, IN1, TMP1 + vpxor IN1, IN1, TMP2 + vmovdqa [out+16], IN1 +.endm + +#ifdef __APPLE__ +#define AES256_KEY_EXPANSION _aes256_key_expansion +#else +#define AES256_KEY_EXPANSION aes256_key_expansion +#endif + +#ifndef __APPLE__ +.type AES256_KEY_EXPANSION,@function +.hidden AES256_KEY_EXPANSION +#endif +.globl AES256_KEY_EXPANSION +AES256_KEY_EXPANSION: + vmovdqu IN0, [in] + vmovdqu IN1, [in+16] + vmovdqa [out], IN0 + vmovdqa [out+16], IN1 + + vmovdqa CON, [rip+CON1] + vmovdqa MASK_REG, [rip+MASK1] + + vpxor ZERO, ZERO, ZERO + + mov ax, 6 +.loop256: + + ROUND1 IN0, IN1 + dec ax + ROUND2 + jne .loop256 + + ROUND1 IN0, IN1 + + ret +#ifndef __APPLE__ +.size AES256_KEY_EXPANSION, .-AES256_KEY_EXPANSION +#endif + diff --git a/src/common/generic/CMakeLists.txt b/src/common/generic/CMakeLists.txt index 3c0df05..238bccb 100644 --- a/src/common/generic/CMakeLists.txt +++ b/src/common/generic/CMakeLists.txt @@ -1,26 +1,15 @@ -set(SOURCE_FILES_COMMON_SYS +set(SOURCE_FILES_COMMON_GENERIC randombytes_system.c - aes_c.c fips202.c mem.c + tools.c ) -add_library(sqisign_common_sys ${SOURCE_FILES_COMMON_SYS}) -target_include_directories(sqisign_common_sys PRIVATE include ../../include) -target_compile_options(sqisign_common_sys PUBLIC ${C_OPT_FLAGS}) - -set(SOURCE_FILES_COMMON_TEST - randombytes_ctrdrbg.c - aes_c.c - fips202.c - mem.c -) - -add_library(sqisign_common_test ${SOURCE_FILES_COMMON_TEST}) -target_include_directories(sqisign_common_test PRIVATE include ../include) -target_compile_options(sqisign_common_test PUBLIC ${C_OPT_FLAGS}) - -if (ENABLE_CT_TESTING) - target_compile_definitions(sqisign_common_sys PUBLIC ENABLE_CT_TESTING) - target_compile_definitions(sqisign_common_test PUBLIC ENABLE_CT_TESTING) -endif() +foreach (SQISIGN_COMMON_TARGET sqisign_common_test sqisign_common_sys) + add_library(${SQISIGN_COMMON_TARGET} STATIC ${SOURCE_FILES_COMMON_GENERIC}) + target_include_directories(${SQISIGN_COMMON_TARGET} PRIVATE include ${INC_PUBLIC}) + target_compile_options(${SQISIGN_COMMON_TARGET} PUBLIC ${C_OPT_FLAGS}) + if (ENABLE_CT_TESTING) + target_compile_definitions(${SQISIGN_COMMON_TARGET} PUBLIC ENABLE_CT_TESTING) + endif() +endforeach() diff --git a/src/common/generic/fips202.c b/src/common/generic/fips202.c index cb99162..f2992d8 100644 --- a/src/common/generic/fips202.c +++ b/src/common/generic/fips202.c @@ -13,167 +13,7 @@ #include #include -#include -#include - -#define SHAKE128_RATE 168 -#define SHAKE256_RATE 136 -#define SHA3_256_RATE 136 -#define SHA3_384_RATE 104 -#define SHA3_512_RATE 72 - -#define PQC_SHAKEINCCTX_BYTES (sizeof(uint64_t)*26) -#define PQC_SHAKECTX_BYTES (sizeof(uint64_t)*25) - -// Context for incremental API -typedef struct { - uint64_t *ctx; -} shake128incctx; - -// Context for non-incremental API -typedef struct { - uint64_t *ctx; -} shake128ctx; - -// Context for incremental API -typedef struct { - uint64_t *ctx; -} shake256incctx; - -// Context for non-incremental API -typedef struct { - uint64_t *ctx; -} shake256ctx; - -// Context for incremental API -typedef struct { - uint64_t *ctx; -} sha3_256incctx; - -// Context for incremental API -typedef struct { - uint64_t *ctx; -} sha3_384incctx; - -// Context for incremental API -typedef struct { - uint64_t *ctx; -} sha3_512incctx; - -/* Initialize the state and absorb the provided input. - * - * This function does not support being called multiple times - * with the same state. - */ -void shake128_absorb(shake128ctx *state, const uint8_t *input, size_t inlen); -/* Squeeze output out of the sponge. - * - * Supports being called multiple times - */ -void shake128_squeezeblocks(uint8_t *output, size_t nblocks, shake128ctx *state); -/* Free the state */ -void shake128_ctx_release(shake128ctx *state); -/* Copy the state. */ -void shake128_ctx_clone(shake128ctx *dest, const shake128ctx *src); - -/* Initialize incremental hashing API */ -void shake128_inc_init(shake128incctx *state); -/* Absorb more information into the XOF. - * - * Can be called multiple times. - */ -void shake128_inc_absorb(shake128incctx *state, const uint8_t *input, size_t inlen); -/* Finalize the XOF for squeezing */ -void shake128_inc_finalize(shake128incctx *state); -/* Squeeze output out of the sponge. - * - * Supports being called multiple times - */ -void shake128_inc_squeeze(uint8_t *output, size_t outlen, shake128incctx *state); -/* Copy the context of the SHAKE128 XOF */ -void shake128_inc_ctx_clone(shake128incctx *dest, const shake128incctx *src); -/* Free the context of the SHAKE128 XOF */ -void shake128_inc_ctx_release(shake128incctx *state); - -/* Initialize the state and absorb the provided input. - * - * This function does not support being called multiple times - * with the same state. - */ -void shake256_absorb(shake256ctx *state, const uint8_t *input, size_t inlen); -/* Squeeze output out of the sponge. - * - * Supports being called multiple times - */ -void shake256_squeezeblocks(uint8_t *output, size_t nblocks, shake256ctx *state); -/* Free the context held by this XOF */ -void shake256_ctx_release(shake256ctx *state); -/* Copy the context held by this XOF */ -void shake256_ctx_clone(shake256ctx *dest, const shake256ctx *src); - -/* Initialize incremental hashing API */ -void shake256_inc_init(shake256incctx *state); -void shake256_inc_absorb(shake256incctx *state, const uint8_t *input, size_t inlen); -/* Prepares for squeeze phase */ -void shake256_inc_finalize(shake256incctx *state); -/* Squeeze output out of the sponge. - * - * Supports being called multiple times - */ -void shake256_inc_squeeze(uint8_t *output, size_t outlen, shake256incctx *state); -/* Copy the state */ -void shake256_inc_ctx_clone(shake256incctx *dest, const shake256incctx *src); -/* Free the state */ -void shake256_inc_ctx_release(shake256incctx *state); - -/* One-stop SHAKE128 call */ -void shake128(uint8_t *output, size_t outlen, - const uint8_t *input, size_t inlen); - -/* One-stop SHAKE256 call */ -void shake256(uint8_t *output, size_t outlen, - const uint8_t *input, size_t inlen); - -/* Initialize the incremental hashing state */ -void sha3_256_inc_init(sha3_256incctx *state); -/* Absorb blocks into SHA3 */ -void sha3_256_inc_absorb(sha3_256incctx *state, const uint8_t *input, size_t inlen); -/* Obtain the output of the function and free `state` */ -void sha3_256_inc_finalize(uint8_t *output, sha3_256incctx *state); -/* Copy the context */ -void sha3_256_inc_ctx_clone(sha3_256incctx *dest, const sha3_256incctx *src); -/* Release the state, don't use if `_finalize` has been used */ -void sha3_256_inc_ctx_release(sha3_256incctx *state); - -void sha3_256(uint8_t *output, const uint8_t *input, size_t inlen); - -/* Initialize the incremental hashing state */ -void sha3_384_inc_init(sha3_384incctx *state); -/* Absorb blocks into SHA3 */ -void sha3_384_inc_absorb(sha3_384incctx *state, const uint8_t *input, size_t inlen); -/* Obtain the output of the function and free `state` */ -void sha3_384_inc_finalize(uint8_t *output, sha3_384incctx *state); -/* Copy the context */ -void sha3_384_inc_ctx_clone(sha3_384incctx *dest, const sha3_384incctx *src); -/* Release the state, don't use if `_finalize` has been used */ -void sha3_384_inc_ctx_release(sha3_384incctx *state); - -/* One-stop SHA3-384 shop */ -void sha3_384(uint8_t *output, const uint8_t *input, size_t inlen); - -/* Initialize the incremental hashing state */ -void sha3_512_inc_init(sha3_512incctx *state); -/* Absorb blocks into SHA3 */ -void sha3_512_inc_absorb(sha3_512incctx *state, const uint8_t *input, size_t inlen); -/* Obtain the output of the function and free `state` */ -void sha3_512_inc_finalize(uint8_t *output, sha3_512incctx *state); -/* Copy the context */ -void sha3_512_inc_ctx_clone(sha3_512incctx *dest, const sha3_512incctx *src); -/* Release the state, don't use if `_finalize` has been used */ -void sha3_512_inc_ctx_release(sha3_512incctx *state); - -/* One-stop SHA3-512 shop */ -void sha3_512(uint8_t *output, const uint8_t *input, size_t inlen); +#include "fips202.h" #define NROUNDS 24 #define ROL(a, offset) (((a) << (offset)) ^ ((a) >> (64 - (offset)))) @@ -686,10 +526,6 @@ static void keccak_inc_squeeze(uint8_t *h, size_t outlen, } void shake128_inc_init(shake128incctx *state) { - state->ctx = malloc(PQC_SHAKEINCCTX_BYTES); - if (state->ctx == NULL) { - exit(111); - } keccak_inc_init(state->ctx); } @@ -706,22 +542,14 @@ void shake128_inc_squeeze(uint8_t *output, size_t outlen, shake128incctx *state) } void shake128_inc_ctx_clone(shake128incctx *dest, const shake128incctx *src) { - dest->ctx = malloc(PQC_SHAKEINCCTX_BYTES); - if (dest->ctx == NULL) { - exit(111); - } memcpy(dest->ctx, src->ctx, PQC_SHAKEINCCTX_BYTES); } void shake128_inc_ctx_release(shake128incctx *state) { - free(state->ctx); + (void)state; } void shake256_inc_init(shake256incctx *state) { - state->ctx = malloc(PQC_SHAKEINCCTX_BYTES); - if (state->ctx == NULL) { - exit(111); - } keccak_inc_init(state->ctx); } @@ -738,15 +566,11 @@ void shake256_inc_squeeze(uint8_t *output, size_t outlen, shake256incctx *state) } void shake256_inc_ctx_clone(shake256incctx *dest, const shake256incctx *src) { - dest->ctx = malloc(PQC_SHAKEINCCTX_BYTES); - if (dest->ctx == NULL) { - exit(111); - } memcpy(dest->ctx, src->ctx, PQC_SHAKEINCCTX_BYTES); } void shake256_inc_ctx_release(shake256incctx *state) { - free(state->ctx); + (void)state; } @@ -762,10 +586,6 @@ void shake256_inc_ctx_release(shake256incctx *state) { * - size_t inlen: length of input in bytes **************************************************/ void shake128_absorb(shake128ctx *state, const uint8_t *input, size_t inlen) { - state->ctx = malloc(PQC_SHAKECTX_BYTES); - if (state->ctx == NULL) { - exit(111); - } keccak_absorb(state->ctx, SHAKE128_RATE, input, inlen, 0x1F); } @@ -786,16 +606,12 @@ void shake128_squeezeblocks(uint8_t *output, size_t nblocks, shake128ctx *state) } void shake128_ctx_clone(shake128ctx *dest, const shake128ctx *src) { - dest->ctx = malloc(PQC_SHAKECTX_BYTES); - if (dest->ctx == NULL) { - exit(111); - } memcpy(dest->ctx, src->ctx, PQC_SHAKECTX_BYTES); } /** Release the allocated state. Call only once. */ void shake128_ctx_release(shake128ctx *state) { - free(state->ctx); + (void)state; } /************************************************* @@ -810,10 +626,6 @@ void shake128_ctx_release(shake128ctx *state) { * - size_t inlen: length of input in bytes **************************************************/ void shake256_absorb(shake256ctx *state, const uint8_t *input, size_t inlen) { - state->ctx = malloc(PQC_SHAKECTX_BYTES); - if (state->ctx == NULL) { - exit(111); - } keccak_absorb(state->ctx, SHAKE256_RATE, input, inlen, 0x1F); } @@ -834,16 +646,12 @@ void shake256_squeezeblocks(uint8_t *output, size_t nblocks, shake256ctx *state) } void shake256_ctx_clone(shake256ctx *dest, const shake256ctx *src) { - dest->ctx = malloc(PQC_SHAKECTX_BYTES); - if (dest->ctx == NULL) { - exit(111); - } memcpy(dest->ctx, src->ctx, PQC_SHAKECTX_BYTES); } /** Release the allocated state. Call only once. */ void shake256_ctx_release(shake256ctx *state) { - free(state->ctx); + (void)state; } /************************************************* @@ -909,23 +717,15 @@ void shake256(uint8_t *output, size_t outlen, } void sha3_256_inc_init(sha3_256incctx *state) { - state->ctx = malloc(PQC_SHAKEINCCTX_BYTES); - if (state->ctx == NULL) { - exit(111); - } keccak_inc_init(state->ctx); } void sha3_256_inc_ctx_clone(sha3_256incctx *dest, const sha3_256incctx *src) { - dest->ctx = malloc(PQC_SHAKEINCCTX_BYTES); - if (dest->ctx == NULL) { - exit(111); - } memcpy(dest->ctx, src->ctx, PQC_SHAKEINCCTX_BYTES); } void sha3_256_inc_ctx_release(sha3_256incctx *state) { - free(state->ctx); + (void)state; } void sha3_256_inc_absorb(sha3_256incctx *state, const uint8_t *input, size_t inlen) { @@ -970,18 +770,10 @@ void sha3_256(uint8_t *output, const uint8_t *input, size_t inlen) { } void sha3_384_inc_init(sha3_384incctx *state) { - state->ctx = malloc(PQC_SHAKEINCCTX_BYTES); - if (state->ctx == NULL) { - exit(111); - } keccak_inc_init(state->ctx); } void sha3_384_inc_ctx_clone(sha3_384incctx *dest, const sha3_384incctx *src) { - dest->ctx = malloc(PQC_SHAKEINCCTX_BYTES); - if (dest->ctx == NULL) { - exit(111); - } memcpy(dest->ctx, src->ctx, PQC_SHAKEINCCTX_BYTES); } @@ -990,7 +782,7 @@ void sha3_384_inc_absorb(sha3_384incctx *state, const uint8_t *input, size_t inl } void sha3_384_inc_ctx_release(sha3_384incctx *state) { - free(state->ctx); + (void)state; } void sha3_384_inc_finalize(uint8_t *output, sha3_384incctx *state) { @@ -1031,18 +823,10 @@ void sha3_384(uint8_t *output, const uint8_t *input, size_t inlen) { } void sha3_512_inc_init(sha3_512incctx *state) { - state->ctx = malloc(PQC_SHAKEINCCTX_BYTES); - if (state->ctx == NULL) { - exit(111); - } keccak_inc_init(state->ctx); } void sha3_512_inc_ctx_clone(sha3_512incctx *dest, const sha3_512incctx *src) { - dest->ctx = malloc(PQC_SHAKEINCCTX_BYTES); - if (dest->ctx == NULL) { - exit(111); - } memcpy(dest->ctx, src->ctx, PQC_SHAKEINCCTX_BYTES); } @@ -1051,7 +835,7 @@ void sha3_512_inc_absorb(sha3_512incctx *state, const uint8_t *input, size_t inl } void sha3_512_inc_ctx_release(sha3_512incctx *state) { - free(state->ctx); + (void)state; } void sha3_512_inc_finalize(uint8_t *output, sha3_512incctx *state) { @@ -1090,13 +874,3 @@ void sha3_512(uint8_t *output, const uint8_t *input, size_t inlen) { output[i] = t[i]; } } - -int SHAKE128(unsigned char *output, size_t outputByteLen, const unsigned char *input, size_t inputByteLen) { - shake128(output, outputByteLen, input, inputByteLen); - return 0; -} - -int SHAKE256(unsigned char *output, size_t outputByteLen, const unsigned char *input, size_t inputByteLen) { - shake256(output, outputByteLen, input, inputByteLen); - return 0; -} diff --git a/src/common/generic/include/aes.h b/src/common/generic/include/aes.h deleted file mode 100644 index 2ceb847..0000000 --- a/src/common/generic/include/aes.h +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -#ifndef AES_H -#define AES_H - -#include -#include - -void AES_256_ECB(const uint8_t *input, const uint8_t *key, uint8_t *output); -#define AES_ECB_encrypt AES_256_ECB - -#ifdef ENABLE_AESNI -int AES_128_CTR_NI(unsigned char *output, size_t outputByteLen, - const unsigned char *input, size_t inputByteLen); -int AES_128_CTR_4R_NI(unsigned char *output, size_t outputByteLen, - const unsigned char *input, size_t inputByteLen); -#define AES_128_CTR AES_128_CTR_NI -#else -int AES_128_CTR(unsigned char *output, size_t outputByteLen, - const unsigned char *input, size_t inputByteLen); -#endif - -#endif diff --git a/src/common/generic/include/bench.h b/src/common/generic/include/bench.h index 2ed9a4d..c253825 100644 --- a/src/common/generic/include/bench.h +++ b/src/common/generic/include/bench.h @@ -1,63 +1,126 @@ // SPDX-License-Identifier: Apache-2.0 +#ifndef BENCH_H__ +#define BENCH_H__ #include #include #include #include - - -#if defined(TARGET_OS_UNIX) && (defined(TARGET_ARM) || defined(TARGET_ARM64) || defined(TARGET_OTHER)) #include +#if defined(__APPLE__) +#include "bench_macos.h" #endif -#if (defined(TARGET_ARM) || defined(TARGET_ARM64) || defined(TARGET_S390X) || defined(TARGET_OTHER)) -#define print_bench_unit printf("nsec\n"); + +#if defined(TARGET_ARM) || defined(TARGET_S390X) || defined(NO_CYCLE_COUNTER) +#define BENCH_UNIT0 "nanoseconds" +#define BENCH_UNIT3 "microseconds" +#define BENCH_UNIT6 "milliseconds" +#define BENCH_UNIT9 "seconds" #else -#define print_bench_unit printf("cycles\n"); +#define BENCH_UNIT0 "cycles" +#define BENCH_UNIT3 "kilocycles" +#define BENCH_UNIT6 "megacycles" +#define BENCH_UNIT9 "gigacycles" #endif -#if (defined(TARGET_ARM) || defined(TARGET_ARM64) || defined(TARGET_S390X)) -#define BENCH_UNITS "nsec" -#else -#define BENCH_UNITS "cycles" +static inline void +cpucycles_init(void) { +#if defined(__APPLE__) && defined(TARGET_ARM64) + macos_init_rdtsc(); #endif +} -static inline int64_t cpucycles(void) { -#if (defined(TARGET_AMD64) || defined(TARGET_X86)) - unsigned int hi, lo; +static inline uint64_t +cpucycles(void) +{ +#if defined(TARGET_AMD64) || defined(TARGET_X86) + uint32_t hi, lo; - asm volatile ("rdtsc" : "=a" (lo), "=d"(hi)); - return ((int64_t) lo) | (((int64_t) hi) << 32); -#elif (defined(TARGET_S390X)) + asm volatile("rdtsc" : "=a"(lo), "=d"(hi)); + return ((uint64_t)lo) | ((uint64_t)hi << 32); +#elif defined(TARGET_S390X) uint64_t tod; - asm volatile("stckf %0\n" : "=Q" (tod) : : "cc"); + asm volatile("stckf %0\n" : "=Q"(tod) : : "cc"); return (tod * 1000 / 4096); +#elif defined(TARGET_ARM64) && !defined(NO_CYCLE_COUNTER) +#if defined(__APPLE__) + return macos_rdtsc(); +#else + uint64_t cycles; + asm volatile("mrs %0, PMCCNTR_EL0" : "=r"(cycles)); + return cycles; +#endif // __APPLE__ #else struct timespec time; clock_gettime(CLOCK_REALTIME, &time); - return (int64_t)(time.tv_sec * 1e9 + time.tv_nsec); + return (uint64_t)time.tv_sec * 1000000000 + time.tv_nsec; #endif } -static inline int cmpfunc (const void *a, const void *b) { - return ( *(uint64_t *)a - * (uint64_t *)b ); +static inline int +CMPFUNC(const void *a, const void *b) +{ + uint64_t aa = *(uint64_t *)a, bb = *(uint64_t *)b; + + if (aa > bb) + return +1; + if (aa < bb) + return -1; + return 0; } -#define BENCH_CODE_1(r) \ - cycles = 0; \ - for (i = 0; i < (r); ++i) { \ - cycles1 = cpucycles(); - -#define BENCH_CODE_2(name, csv) \ - cycles2 = cpucycles(); \ - if(i < LIST_SIZE) \ - cycles_list[i] = (cycles2 - cycles1);\ - cycles = cycles + (cycles2 - cycles1); \ - } \ - qsort(cycles_list, (runs < LIST_SIZE)? runs : LIST_SIZE, sizeof(uint64_t), cmpfunc);\ - if (csv) \ - printf("%2" PRId64 ",", cycles_list[(runs < LIST_SIZE)? runs/2 : LIST_SIZE/2]); \ - else { \ - printf(" %-20s-> median: %2" PRId64 ", average: %2" PRId64 " ", name, \ - cycles_list[(runs < LIST_SIZE)? runs/2 : LIST_SIZE/2], (cycles / runs)); \ - printf("%s\n", BENCH_UNITS); \ +static inline uint32_t +ISQRT(uint64_t x) +{ + uint32_t r = 0; + for (ssize_t i = 31; i >= 0; --i) { + uint32_t s = r + (1 << i); + if ((uint64_t)s * s <= x) + r = s; } + return r; +} + +static inline double +_TRUNC(uint64_t x) +{ + return x / 1000 / 1000.; +} +#define _FMT ".3lf" +#define _UNIT BENCH_UNIT6 + +#define BENCH_CODE_1(RUNS) \ + { \ + const size_t count = (RUNS); \ + if (!count) \ + abort(); \ + uint64_t cycles, cycles1, cycles2; \ + uint64_t cycles_list[count]; \ + cycles = 0; \ + for (size_t i = 0; i < count; ++i) { \ + cycles1 = cpucycles(); + +#define BENCH_CODE_2(name) \ + cycles2 = cpucycles(); \ + cycles_list[i] = cycles2 - cycles1; \ + cycles += cycles2 - cycles1; \ + } \ + qsort(cycles_list, count, sizeof(uint64_t), CMPFUNC); \ + uint64_t variance = 0; \ + for (size_t i = 0; i < count; ++i) { \ + int64_t off = cycles_list[i] - cycles / count; \ + variance += off * off; \ + } \ + variance /= count; \ + printf(" %-10s", name); \ + printf(" | average %9" _FMT " | stddev %9" _FMT, \ + _TRUNC(cycles / count), \ + _TRUNC(ISQRT(variance))); \ + printf(" | median %9" _FMT " | min %9" _FMT " | max %9" _FMT, \ + _TRUNC(cycles_list[count / 2]), \ + _TRUNC(cycles_list[0]), \ + _TRUNC(cycles_list[count - 1])); \ + printf(" (%s)\n", _UNIT); \ + } + +#endif diff --git a/src/common/generic/include/bench_macos.h b/src/common/generic/include/bench_macos.h new file mode 100644 index 0000000..0494fc8 --- /dev/null +++ b/src/common/generic/include/bench_macos.h @@ -0,0 +1,143 @@ +// WARNING: must be run as root on an M1 device +// WARNING: fragile, uses private apple APIs +// currently no command line interface, see variables at top of main + +/* +no warranty; use at your own risk - i believe this code needs +some minor changes to work on some later hardware and/or software revisions, +which is unsurprising given the use of undocumented, private APIs. +------------------------------------------------------------------------------ +This code is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2020 Dougall Johnson +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ + +/* + Based on https://github.com/travisdowns/robsize + Henry Wong + http://blog.stuffedcow.net/2013/05/measuring-rob-capacity/ + 2014-10-14 +*/ + +#include +#include +#include +#include + +#define KPERF_LIST \ + /* ret, name, params */ \ + F(int, kpc_force_all_ctrs_set, int) \ + F(int, kpc_set_counting, uint32_t) \ + F(int, kpc_set_thread_counting, uint32_t) \ + F(int, kpc_set_config, uint32_t, void *) \ + F(int, kpc_get_thread_counters, int, unsigned int, void *) + +#define F(ret, name, ...) \ + typedef ret name##proc(__VA_ARGS__); \ + static name##proc *name; +KPERF_LIST +#undef F + +#define CFGWORD_EL0A64EN_MASK (0x20000) + +#define CPMU_CORE_CYCLE 0x02 + +#define KPC_CLASS_FIXED (0) +#define KPC_CLASS_CONFIGURABLE (1) + +#define COUNTERS_COUNT 10 +#define KPC_MASK ((1u << KPC_CLASS_CONFIGURABLE) | (1u << KPC_CLASS_FIXED)) +static uint64_t g_config[COUNTERS_COUNT]; +static uint64_t g_counters[COUNTERS_COUNT]; + +static void +macos_configure_rdtsc() +{ + if (kpc_force_all_ctrs_set(1)) { + printf("kpc_force_all_ctrs_set failed\n"); + return; + } + + if (kpc_set_config(KPC_MASK, g_config)) { + printf("kpc_set_config failed\n"); + return; + } + + if (kpc_set_counting(KPC_MASK)) { + printf("kpc_set_counting failed\n"); + return; + } + + if (kpc_set_thread_counting(KPC_MASK)) { + printf("kpc_set_thread_counting failed\n"); + return; + } +} + +static void +macos_init_rdtsc() +{ + void *kperf = + dlopen("/System/Library/PrivateFrameworks/kperf.framework/Versions/A/kperf", RTLD_LAZY); + if (!kperf) { + printf("kperf = %p\n", kperf); + return; + } +#define F(ret, name, ...) \ + name = (name##proc *)(intptr_t)(dlsym(kperf, #name)); \ + if (!name) { \ + printf("%s = %p\n", #name, (void *)(intptr_t)name); \ + return; \ + } + KPERF_LIST +#undef F + + g_config[0] = CPMU_CORE_CYCLE | CFGWORD_EL0A64EN_MASK; + + macos_configure_rdtsc(); +} + +static uint64_t +macos_rdtsc(void) +{ + if (kpc_get_thread_counters(0, COUNTERS_COUNT, g_counters)) { + printf("kpc_get_thread_counters failed\n"); + return 1; + } + return g_counters[2]; +} diff --git a/src/common/generic/include/bench_test_arguments.h b/src/common/generic/include/bench_test_arguments.h new file mode 100644 index 0000000..17506f1 --- /dev/null +++ b/src/common/generic/include/bench_test_arguments.h @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: Apache-2.0 +#ifndef BENCH_TEST_ARGUMENTS_H__ +#define BENCH_TEST_ARGUMENTS_H__ + +#include +#include +#include + +static int parse_seed(const char *arg, uint32_t *seed) +{ + if (sscanf(arg, "--seed=%u", &seed[0]) == 1) + return 0; + + if (sscanf(arg, "--seed={ " + "0x%" PRIx32 ", 0x%" PRIx32 ", 0x%" PRIx32 ", 0x%" PRIx32 ", 0x%" PRIx32 ", 0x%" PRIx32 ", " + "0x%" PRIx32 ", 0x%" PRIx32 ", 0x%" PRIx32 ", 0x%" PRIx32 ", 0x%" PRIx32 ", 0x%" PRIx32 " }", + &seed[0], &seed[1], &seed[2], &seed[3], &seed[4], &seed[5], + &seed[6], &seed[7], &seed[8], &seed[9], &seed[10], &seed[11]) == 12) + return 0; + + return 1; +} + +static void print_seed(const uint32_t *seed) +{ + printf("Random seed: \"--seed={ "); + for (int i = 0; i < 12; i++) { + printf("0x%08x%s", seed[i], (i < 11) ? ", " : " }\"\n"); + } +} + +#endif \ No newline at end of file diff --git a/src/common/generic/include/fips202.h b/src/common/generic/include/fips202.h index 9f95427..c29ebd8 100644 --- a/src/common/generic/include/fips202.h +++ b/src/common/generic/include/fips202.h @@ -4,8 +4,168 @@ #define FIPS202_H #include +#include -int SHAKE128(unsigned char *output, size_t outputByteLen, const unsigned char *input, size_t inputByteLen); -int SHAKE256(unsigned char *output, size_t outputByteLen, const unsigned char *input, size_t inputByteLen); +#define SHAKE128_RATE 168 +#define SHAKE256_RATE 136 +#define SHA3_256_RATE 136 +#define SHA3_384_RATE 104 +#define SHA3_512_RATE 72 + +#define PQC_SHAKEINCCTX_U64WORDS 26 +#define PQC_SHAKECTX_U64WORDS 25 + +#define PQC_SHAKEINCCTX_BYTES (sizeof(uint64_t) * 26) +#define PQC_SHAKECTX_BYTES (sizeof(uint64_t) * 25) + +// Context for incremental API +typedef struct { + uint64_t ctx[PQC_SHAKEINCCTX_U64WORDS]; +} shake128incctx; + +// Context for non-incremental API +typedef struct { + uint64_t ctx[PQC_SHAKECTX_U64WORDS]; +} shake128ctx; + +// Context for incremental API +typedef struct { + uint64_t ctx[PQC_SHAKEINCCTX_U64WORDS]; +} shake256incctx; + +// Context for non-incremental API +typedef struct { + uint64_t ctx[PQC_SHAKECTX_U64WORDS]; +} shake256ctx; + +// Context for incremental API +typedef struct { + uint64_t ctx[PQC_SHAKEINCCTX_U64WORDS]; +} sha3_256incctx; + +// Context for incremental API +typedef struct { + uint64_t ctx[PQC_SHAKEINCCTX_U64WORDS]; +} sha3_384incctx; + +// Context for incremental API +typedef struct { + uint64_t ctx[PQC_SHAKEINCCTX_U64WORDS]; +} sha3_512incctx; + +/* Initialize the state and absorb the provided input. + * + * This function does not support being called multiple times + * with the same state. + */ +void shake128_absorb(shake128ctx *state, const uint8_t *input, size_t inlen); +/* Squeeze output out of the sponge. + * + * Supports being called multiple times + */ +void shake128_squeezeblocks(uint8_t *output, size_t nblocks, shake128ctx *state); +/* Free the state */ +void shake128_ctx_release(shake128ctx *state); +/* Copy the state. */ +void shake128_ctx_clone(shake128ctx *dest, const shake128ctx *src); + +/* Initialize incremental hashing API */ +void shake128_inc_init(shake128incctx *state); +/* Absorb more information into the XOF. + * + * Can be called multiple times. + */ +void shake128_inc_absorb(shake128incctx *state, const uint8_t *input, size_t inlen); +/* Finalize the XOF for squeezing */ +void shake128_inc_finalize(shake128incctx *state); +/* Squeeze output out of the sponge. + * + * Supports being called multiple times + */ +void shake128_inc_squeeze(uint8_t *output, size_t outlen, shake128incctx *state); +/* Copy the context of the SHAKE128 XOF */ +void shake128_inc_ctx_clone(shake128incctx *dest, const shake128incctx *src); +/* Free the context of the SHAKE128 XOF */ +void shake128_inc_ctx_release(shake128incctx *state); + +/* Initialize the state and absorb the provided input. + * + * This function does not support being called multiple times + * with the same state. + */ +void shake256_absorb(shake256ctx *state, const uint8_t *input, size_t inlen); +/* Squeeze output out of the sponge. + * + * Supports being called multiple times + */ +void shake256_squeezeblocks(uint8_t *output, size_t nblocks, shake256ctx *state); +/* Free the context held by this XOF */ +void shake256_ctx_release(shake256ctx *state); +/* Copy the context held by this XOF */ +void shake256_ctx_clone(shake256ctx *dest, const shake256ctx *src); + +/* Initialize incremental hashing API */ +void shake256_inc_init(shake256incctx *state); +void shake256_inc_absorb(shake256incctx *state, const uint8_t *input, size_t inlen); +/* Prepares for squeeze phase */ +void shake256_inc_finalize(shake256incctx *state); +/* Squeeze output out of the sponge. + * + * Supports being called multiple times + */ +void shake256_inc_squeeze(uint8_t *output, size_t outlen, shake256incctx *state); +/* Copy the state */ +void shake256_inc_ctx_clone(shake256incctx *dest, const shake256incctx *src); +/* Free the state */ +void shake256_inc_ctx_release(shake256incctx *state); + +/* One-stop SHAKE128 call */ +void shake128(uint8_t *output, size_t outlen, + const uint8_t *input, size_t inlen); + +/* One-stop SHAKE256 call */ +void shake256(uint8_t *output, size_t outlen, + const uint8_t *input, size_t inlen); + +/* Initialize the incremental hashing state */ +void sha3_256_inc_init(sha3_256incctx *state); +/* Absorb blocks into SHA3 */ +void sha3_256_inc_absorb(sha3_256incctx *state, const uint8_t *input, size_t inlen); +/* Obtain the output of the function and free `state` */ +void sha3_256_inc_finalize(uint8_t *output, sha3_256incctx *state); +/* Copy the context */ +void sha3_256_inc_ctx_clone(sha3_256incctx *dest, const sha3_256incctx *src); +/* Release the state, don't use if `_finalize` has been used */ +void sha3_256_inc_ctx_release(sha3_256incctx *state); + +void sha3_256(uint8_t *output, const uint8_t *input, size_t inlen); + +/* Initialize the incremental hashing state */ +void sha3_384_inc_init(sha3_384incctx *state); +/* Absorb blocks into SHA3 */ +void sha3_384_inc_absorb(sha3_384incctx *state, const uint8_t *input, size_t inlen); +/* Obtain the output of the function and free `state` */ +void sha3_384_inc_finalize(uint8_t *output, sha3_384incctx *state); +/* Copy the context */ +void sha3_384_inc_ctx_clone(sha3_384incctx *dest, const sha3_384incctx *src); +/* Release the state, don't use if `_finalize` has been used */ +void sha3_384_inc_ctx_release(sha3_384incctx *state); + +/* One-stop SHA3-384 shop */ +void sha3_384(uint8_t *output, const uint8_t *input, size_t inlen); + +/* Initialize the incremental hashing state */ +void sha3_512_inc_init(sha3_512incctx *state); +/* Absorb blocks into SHA3 */ +void sha3_512_inc_absorb(sha3_512incctx *state, const uint8_t *input, size_t inlen); +/* Obtain the output of the function and free `state` */ +void sha3_512_inc_finalize(uint8_t *output, sha3_512incctx *state); +/* Copy the context */ +void sha3_512_inc_ctx_clone(sha3_512incctx *dest, const sha3_512incctx *src); +/* Release the state, don't use if `_finalize` has been used */ +void sha3_512_inc_ctx_release(sha3_512incctx *state); + +/* One-stop SHA3-512 shop */ +void sha3_512(uint8_t *output, const uint8_t *input, size_t inlen); #endif diff --git a/src/common/generic/include/tools.h b/src/common/generic/include/tools.h new file mode 100644 index 0000000..5a6a505 --- /dev/null +++ b/src/common/generic/include/tools.h @@ -0,0 +1,49 @@ + +#ifndef TOOLS_H +#define TOOLS_H + +#include + +// Debug printing: +// https://stackoverflow.com/questions/1644868/define-macro-for-debug-printing-in-c +#ifndef NDEBUG +#define DEBUG_PRINT 1 +#else +#define DEBUG_PRINT 0 +#endif + +#ifndef __FILE_NAME__ +#define __FILE_NAME__ "NA" +#endif + +#ifndef __LINE__ +#define __LINE__ 0 +#endif + +#ifndef __func__ +#define __func__ "NA" +#endif + +#define debug_print(fmt) \ + do { \ + if (DEBUG_PRINT) \ + printf("warning: %s, file %s, line %d, function %s().\n", \ + fmt, \ + __FILE_NAME__, \ + __LINE__, \ + __func__); \ + } while (0) + + +clock_t tic(void); +float tac(void); /* time in ms since last tic */ +float TAC(const char *str); /* same, but prints it with label 'str' */ +float toc(const clock_t t); /* time in ms since t */ +float TOC(const clock_t t, const char *str); /* same, but prints it with label 'str' */ +float TOC_clock(const clock_t t, const char *str); + +clock_t dclock(const clock_t t); // return the clock cycle diff between now and t +float clock_to_time(const clock_t t, + const char *str); // convert the number of clock cycles t to time +float clock_print(const clock_t t, const char *str); +#endif diff --git a/src/common/generic/include/tutil.h b/src/common/generic/include/tutil.h index 6cf7de6..59f1620 100644 --- a/src/common/generic/include/tutil.h +++ b/src/common/generic/include/tutil.h @@ -5,24 +5,27 @@ #include #if defined(__GNUC__) || defined(__clang__) +#define BSWAP16(i) __builtin_bswap16((i)) #define BSWAP32(i) __builtin_bswap32((i)) #define BSWAP64(i) __builtin_bswap64((i)) +#define UNUSED __attribute__((unused)) #else -#define BSWAP32(i) ((((i) >> 24) & 0xff) | (((i) >> 8) & 0xff00) | (((i) & 0xff00) << 8) | ((i) << 24)) +#define BSWAP16(i) ((((i) >> 8) & 0xff) | (((i) & 0xff00) << 8)) +#define BSWAP32(i) \ + ((((i) >> 24) & 0xff) | (((i) >> 8) & 0xff00) | (((i) & 0xff00) << 8) | ((i) << 24)) #define BSWAP64(i) ((BSWAP32((i) >> 32) & 0xffffffff) | (BSWAP32(i) << 32) +#define UNUSED #endif #if defined(RADIX_64) #define digit_t uint64_t #define sdigit_t int64_t -#define DIGIT_LEN 8 #define RADIX 64 #define LOG2RADIX 6 #define BSWAP_DIGIT(i) BSWAP64(i) #elif defined(RADIX_32) #define digit_t uint32_t #define sdigit_t int32_t -#define DIGIT_LEN 4 #define RADIX 32 #define LOG2RADIX 5 #define BSWAP_DIGIT(i) BSWAP32(i) diff --git a/src/common/generic/mem.c b/src/common/generic/mem.c index 891a4bb..4956bed 100644 --- a/src/common/generic/mem.c +++ b/src/common/generic/mem.c @@ -1,9 +1,12 @@ // SPDX-License-Identifier: Apache-2.0 +#include #include #include -void sqisign_secure_free(void *mem, size_t size) { +void +sqisign_secure_free(void *mem, size_t size) +{ if (mem) { typedef void *(*memset_t)(void *, int, size_t); static volatile memset_t memset_func = memset; @@ -11,7 +14,9 @@ void sqisign_secure_free(void *mem, size_t size) { free(mem); } } -void sqisign_secure_clear(void *mem, size_t size) { +void +sqisign_secure_clear(void *mem, size_t size) +{ typedef void *(*memset_t)(void *, int, size_t); static volatile memset_t memset_func = memset; memset_func(mem, 0, size); diff --git a/src/common/generic/randombytes_ctrdrbg.c b/src/common/generic/randombytes_ctrdrbg.c deleted file mode 100644 index 681933e..0000000 --- a/src/common/generic/randombytes_ctrdrbg.c +++ /dev/null @@ -1,140 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 and Unknown -// -/* -NIST-developed software is provided by NIST as a public service. You may use, copy, and distribute copies of the software in any medium, provided that you keep intact this entire notice. You may improve, modify, and create derivative works of the software or any portion of the software, and you may copy and distribute such modifications or works. Modified works should carry a notice stating that you changed the software and should note the date and nature of any such change. Please explicitly acknowledge the National Institute of Standards and Technology as the source of the software. - -NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, RELIABILITY, OR USEFULNESS OF THE SOFTWARE. - -You are solely responsible for determining the appropriateness of using and distributing the software and you assume all risks associated with its use, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and the unavailability or interruption of operation. This software is not intended to be used in any situation where a failure could cause risk of injury or damage to property. The software developed by NIST employees is not subject to copyright protection within the United States. -*/ - -#include - -#include - -#ifdef ENABLE_CT_TESTING -#include -#endif - -#define RNG_SUCCESS 0 -#define RNG_BAD_MAXLEN -1 -#define RNG_BAD_OUTBUF -2 -#define RNG_BAD_REQ_LEN -3 - -static __inline void AES256_ECB(unsigned char *key, unsigned char *ctr, unsigned char *buffer) { - AES_ECB_encrypt(ctr, key, buffer); -} - -typedef struct { - unsigned char buffer[16]; - int buffer_pos; - unsigned long length_remaining; - unsigned char key[32]; - unsigned char ctr[16]; -} AES_XOF_struct; - -typedef struct { - unsigned char Key[32]; - unsigned char V[16]; - int reseed_counter; -} AES256_CTR_DRBG_struct; - - -void -AES256_CTR_DRBG_Update(unsigned char *provided_data, - unsigned char *Key, - unsigned char *V); - -AES256_CTR_DRBG_struct DRBG_ctx; - -static void -randombytes_init_nist(unsigned char *entropy_input, - unsigned char *personalization_string, - int security_strength) { - unsigned char seed_material[48]; - - (void)security_strength; // Unused parameter - memcpy(seed_material, entropy_input, 48); - if (personalization_string) - for (int i = 0; i < 48; i++) { - seed_material[i] ^= personalization_string[i]; - } - memset(DRBG_ctx.Key, 0x00, 32); - memset(DRBG_ctx.V, 0x00, 16); - AES256_CTR_DRBG_Update(seed_material, DRBG_ctx.Key, DRBG_ctx.V); - DRBG_ctx.reseed_counter = 1; -} - -static int -randombytes_nist(unsigned char *x, size_t xlen) { - unsigned char block[16]; - size_t i = 0; - - while ( xlen > 0 ) { - //increment V - for (int j = 15; j >= 0; j--) { - if ( DRBG_ctx.V[j] == 0xff ) { - DRBG_ctx.V[j] = 0x00; - } else { - DRBG_ctx.V[j]++; - break; - } - } - AES256_ECB(DRBG_ctx.Key, DRBG_ctx.V, block); - if ( xlen > 15 ) { - memcpy(x + i, block, 16); - i += 16; - xlen -= 16; - } else { - memcpy(x + i, block, xlen); - i += xlen; - xlen = 0; - } - } - AES256_CTR_DRBG_Update(NULL, DRBG_ctx.Key, DRBG_ctx.V); - DRBG_ctx.reseed_counter++; - - return 0; -} - -void -AES256_CTR_DRBG_Update(unsigned char *provided_data, - unsigned char *Key, - unsigned char *V) { - unsigned char temp[48]; - - for (int i = 0; i < 3; i++) { - //increment V - for (int j = 15; j >= 0; j--) { - if ( V[j] == 0xff ) { - V[j] = 0x00; - } else { - V[j]++; - break; - } - } - - AES256_ECB(Key, V, temp + 16 * i); - } - if ( provided_data != NULL ) - for (int i = 0; i < 48; i++) { - temp[i] ^= provided_data[i]; - } - memcpy(Key, temp, 32); - memcpy(V, temp + 32, 16); -} - -int randombytes(unsigned char *random_array, unsigned long long nbytes) { - int ret = randombytes_nist(random_array, nbytes); -#ifdef ENABLE_CT_TESTING - VALGRIND_MAKE_MEM_UNDEFINED(random_array, ret); -#endif - return ret; -} - -void -randombytes_init(unsigned char *entropy_input, - unsigned char *personalization_string, - int security_strength) { - return randombytes_init_nist(entropy_input, personalization_string, security_strength); -} diff --git a/src/common/generic/randombytes_system.c b/src/common/generic/randombytes_system.c index 7d17b68..689c29b 100644 --- a/src/common/generic/randombytes_system.c +++ b/src/common/generic/randombytes_system.c @@ -20,6 +20,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#include + #ifdef ENABLE_CT_TESTING #include #endif @@ -28,14 +30,14 @@ THE SOFTWARE. // *before* randombytes.h is included. Otherwise SYS_getrandom will not be // declared. #if defined(__linux__) || defined(__GNU__) -# define _GNU_SOURCE +#define _GNU_SOURCE #endif /* defined(__linux__) || defined(__GNU__) */ #if defined(_WIN32) /* Windows */ -# include -# include /* CryptAcquireContext, CryptGenRandom */ -#endif /* defined(_WIN32) */ +#include +#include /* CryptAcquireContext, CryptGenRandom */ +#endif /* defined(_WIN32) */ /* wasi */ #if defined(__wasi__) @@ -44,7 +46,7 @@ THE SOFTWARE. /* kFreeBSD */ #if defined(__FreeBSD_kernel__) && defined(__GLIBC__) -# define GNU_KFREEBSD +#define GNU_KFREEBSD #endif #if defined(__linux__) || defined(__GNU__) || defined(GNU_KFREEBSD) @@ -53,344 +55,377 @@ THE SOFTWARE. // to the linux headers. We only need RNDGETENTCNT, so we instead inline it. // RNDGETENTCNT is originally defined in `include/uapi/linux/random.h` in the // linux repo. -# define RNDGETENTCNT 0x80045200 +#define RNDGETENTCNT 0x80045200 -# include -# include -# include -# include -# include -# include -# include -# if (defined(__linux__) || defined(__GNU__)) && defined(__GLIBC__) && ((__GLIBC__ > 2) || (__GLIBC_MINOR__ > 24)) -# define USE_GLIBC -# include -# endif /* (defined(__linux__) || defined(__GNU__)) && defined(__GLIBC__) && ((__GLIBC__ > 2) || (__GLIBC_MINOR__ > 24)) */ -# include -# include -# include -# include +#include +#include +#include +#include +#include +#include +#include +#if (defined(__linux__) || defined(__GNU__)) && defined(__GLIBC__) && \ + ((__GLIBC__ > 2) || (__GLIBC_MINOR__ > 24)) +#define USE_GLIBC +#include +#endif /* (defined(__linux__) || defined(__GNU__)) && defined(__GLIBC__) && ((__GLIBC__ > 2) || \ + (__GLIBC_MINOR__ > 24)) */ +#include +#include +#include +#include // We need SSIZE_MAX as the maximum read len from /dev/urandom -# if !defined(SSIZE_MAX) -# define SSIZE_MAX (SIZE_MAX / 2 - 1) -# endif /* defined(SSIZE_MAX) */ +#if !defined(SSIZE_MAX) +#define SSIZE_MAX (SIZE_MAX / 2 - 1) +#endif /* defined(SSIZE_MAX) */ #endif /* defined(__linux__) || defined(__GNU__) || defined(GNU_KFREEBSD) */ - #if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) /* Dragonfly, FreeBSD, NetBSD, OpenBSD (has arc4random) */ -# include -# if defined(BSD) -# include -# endif +#include +#if defined(BSD) +#include +#endif /* GNU/Hurd defines BSD in sys/param.h which causes problems later */ -# if defined(__GNU__) -# undef BSD -# endif +#if defined(__GNU__) +#undef BSD +#endif #endif #if defined(__EMSCRIPTEN__) -# include -# include -# include -# include +#include +#include +#include +#include #endif /* defined(__EMSCRIPTEN__) */ - #if defined(_WIN32) -static int randombytes_win32_randombytes(void* buf, size_t n) +static int +randombytes_win32_randombytes(void *buf, size_t n) { - HCRYPTPROV ctx; - BOOL tmp; - DWORD to_read = 0; - const size_t MAX_DWORD = 0xFFFFFFFF; + HCRYPTPROV ctx; + BOOL tmp; + DWORD to_read = 0; + const size_t MAX_DWORD = 0xFFFFFFFF; - tmp = CryptAcquireContext(&ctx, NULL, NULL, PROV_RSA_FULL, - CRYPT_VERIFYCONTEXT); - if (tmp == FALSE) return -1; + tmp = CryptAcquireContext(&ctx, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); + if (tmp == FALSE) + return -1; - while (n > 0) { - to_read = (DWORD)(n < MAX_DWORD ? n : MAX_DWORD); - tmp = CryptGenRandom(ctx, to_read, (BYTE*) buf); - if (tmp == FALSE) return -1; - buf = ((char*)buf) + to_read; - n -= to_read; - } + while (n > 0) { + to_read = (DWORD)(n < MAX_DWORD ? n : MAX_DWORD); + tmp = CryptGenRandom(ctx, to_read, (BYTE *)buf); + if (tmp == FALSE) + return -1; + buf = ((char *)buf) + to_read; + n -= to_read; + } - tmp = CryptReleaseContext(ctx, 0); - if (tmp == FALSE) return -1; + tmp = CryptReleaseContext(ctx, 0); + if (tmp == FALSE) + return -1; - return 0; + return 0; } #endif /* defined(_WIN32) */ #if defined(__wasi__) -static int randombytes_wasi_randombytes(void *buf, size_t n) { - arc4random_buf(buf, n); - return 0; +static int +randombytes_wasi_randombytes(void *buf, size_t n) +{ + arc4random_buf(buf, n); + return 0; } #endif /* defined(__wasi__) */ #if (defined(__linux__) || defined(__GNU__)) && (defined(USE_GLIBC) || defined(SYS_getrandom)) -# if defined(USE_GLIBC) +#if defined(USE_GLIBC) // getrandom is declared in glibc. -# elif defined(SYS_getrandom) -static ssize_t getrandom(void *buf, size_t buflen, unsigned int flags) { - return syscall(SYS_getrandom, buf, buflen, flags); -} -# endif - -static int randombytes_linux_randombytes_getrandom(void *buf, size_t n) +#elif defined(SYS_getrandom) +static ssize_t +getrandom(void *buf, size_t buflen, unsigned int flags) { - /* I have thought about using a separate PRF, seeded by getrandom, but - * it turns out that the performance of getrandom is good enough - * (250 MB/s on my laptop). - */ - size_t offset = 0, chunk; - int ret; - while (n > 0) { - /* getrandom does not allow chunks larger than 33554431 */ - chunk = n <= 33554431 ? n : 33554431; - do { - ret = getrandom((char *)buf + offset, chunk, 0); - } while (ret == -1 && errno == EINTR); - if (ret < 0) return ret; - offset += ret; - n -= ret; - } - assert(n == 0); - return 0; + return syscall(SYS_getrandom, buf, buflen, flags); } -#endif /* (defined(__linux__) || defined(__GNU__)) && (defined(USE_GLIBC) || defined(SYS_getrandom)) */ +#endif + +static int +randombytes_linux_randombytes_getrandom(void *buf, size_t n) +{ + /* I have thought about using a separate PRF, seeded by getrandom, but + * it turns out that the performance of getrandom is good enough + * (250 MB/s on my laptop). + */ + size_t offset = 0, chunk; + int ret; + while (n > 0) { + /* getrandom does not allow chunks larger than 33554431 */ + chunk = n <= 33554431 ? n : 33554431; + do { + ret = getrandom((char *)buf + offset, chunk, 0); + } while (ret == -1 && errno == EINTR); + if (ret < 0) + return ret; + offset += ret; + n -= ret; + } + assert(n == 0); + return 0; +} +#endif /* (defined(__linux__) || defined(__GNU__)) && (defined(USE_GLIBC) || \ + defined(SYS_getrandom)) */ #if (defined(__linux__) || defined(GNU_KFREEBSD)) && !defined(SYS_getrandom) -# if defined(__linux__) -static int randombytes_linux_read_entropy_ioctl(int device, int *entropy) +#if defined(__linux__) +static int +randombytes_linux_read_entropy_ioctl(int device, int *entropy) { - return ioctl(device, RNDGETENTCNT, entropy); + return ioctl(device, RNDGETENTCNT, entropy); } -static int randombytes_linux_read_entropy_proc(FILE *stream, int *entropy) +static int +randombytes_linux_read_entropy_proc(FILE *stream, int *entropy) { - int retcode; - do { - rewind(stream); - retcode = fscanf(stream, "%d", entropy); - } while (retcode != 1 && errno == EINTR); - if (retcode != 1) { - return -1; - } - return 0; + int retcode; + do { + rewind(stream); + retcode = fscanf(stream, "%d", entropy); + } while (retcode != 1 && errno == EINTR); + if (retcode != 1) { + return -1; + } + return 0; } -static int randombytes_linux_wait_for_entropy(int device) +static int +randombytes_linux_wait_for_entropy(int device) { - /* We will block on /dev/random, because any increase in the OS' entropy - * level will unblock the request. I use poll here (as does libsodium), - * because we don't *actually* want to read from the device. */ - enum { IOCTL, PROC } strategy = IOCTL; - const int bits = 128; - struct pollfd pfd; - int fd; - FILE *proc_file; - int retcode, retcode_error = 0; // Used as return codes throughout this function - int entropy = 0; + /* We will block on /dev/random, because any increase in the OS' entropy + * level will unblock the request. I use poll here (as does libsodium), + * because we don't *actually* want to read from the device. */ + enum + { + IOCTL, + PROC + } strategy = IOCTL; + const int bits = 128; + struct pollfd pfd; + int fd; + FILE *proc_file; + int retcode, retcode_error = 0; // Used as return codes throughout this function + int entropy = 0; - /* If the device has enough entropy already, we will want to return early */ - retcode = randombytes_linux_read_entropy_ioctl(device, &entropy); - // printf("errno: %d (%s)\n", errno, strerror(errno)); - if (retcode != 0 && (errno == ENOTTY || errno == ENOSYS)) { - // The ioctl call on /dev/urandom has failed due to a - // - ENOTTY (unsupported action), or - // - ENOSYS (invalid ioctl; this happens on MIPS, see #22). - // - // We will fall back to reading from - // `/proc/sys/kernel/random/entropy_avail`. This less ideal, - // because it allocates a file descriptor, and it may not work - // in a chroot. But at this point it seems we have no better - // options left. - strategy = PROC; - // Open the entropy count file - proc_file = fopen("/proc/sys/kernel/random/entropy_avail", "r"); - if (proc_file == NULL) { - return -1; - } - } else if (retcode != 0) { - // Unrecoverable ioctl error - return -1; - } - if (entropy >= bits) { - return 0; - } + /* If the device has enough entropy already, we will want to return early */ + retcode = randombytes_linux_read_entropy_ioctl(device, &entropy); + // printf("errno: %d (%s)\n", errno, strerror(errno)); + if (retcode != 0 && (errno == ENOTTY || errno == ENOSYS)) { + // The ioctl call on /dev/urandom has failed due to a + // - ENOTTY (unsupported action), or + // - ENOSYS (invalid ioctl; this happens on MIPS, see #22). + // + // We will fall back to reading from + // `/proc/sys/kernel/random/entropy_avail`. This less ideal, + // because it allocates a file descriptor, and it may not work + // in a chroot. But at this point it seems we have no better + // options left. + strategy = PROC; + // Open the entropy count file + proc_file = fopen("/proc/sys/kernel/random/entropy_avail", "r"); + if (proc_file == NULL) { + return -1; + } + } else if (retcode != 0) { + // Unrecoverable ioctl error + return -1; + } + if (entropy >= bits) { + return 0; + } - do { - fd = open("/dev/random", O_RDONLY); - } while (fd == -1 && errno == EINTR); /* EAGAIN will not occur */ - if (fd == -1) { - /* Unrecoverable IO error */ - return -1; - } + do { + fd = open("/dev/random", O_RDONLY); + } while (fd == -1 && errno == EINTR); /* EAGAIN will not occur */ + if (fd == -1) { + /* Unrecoverable IO error */ + return -1; + } - pfd.fd = fd; - pfd.events = POLLIN; - for (;;) { - retcode = poll(&pfd, 1, -1); - if (retcode == -1 && (errno == EINTR || errno == EAGAIN)) { - continue; - } else if (retcode == 1) { - if (strategy == IOCTL) { - retcode = randombytes_linux_read_entropy_ioctl(device, &entropy); - } else if (strategy == PROC) { - retcode = randombytes_linux_read_entropy_proc(proc_file, &entropy); - } else { - return -1; // Unreachable - } + pfd.fd = fd; + pfd.events = POLLIN; + for (;;) { + retcode = poll(&pfd, 1, -1); + if (retcode == -1 && (errno == EINTR || errno == EAGAIN)) { + continue; + } else if (retcode == 1) { + if (strategy == IOCTL) { + retcode = randombytes_linux_read_entropy_ioctl(device, &entropy); + } else if (strategy == PROC) { + retcode = randombytes_linux_read_entropy_proc(proc_file, &entropy); + } else { + return -1; // Unreachable + } - if (retcode != 0) { - // Unrecoverable I/O error - retcode_error = retcode; - break; - } - if (entropy >= bits) { - break; - } - } else { - // Unreachable: poll() should only return -1 or 1 - retcode_error = -1; - break; - } - } - do { - retcode = close(fd); - } while (retcode == -1 && errno == EINTR); - if (strategy == PROC) { - do { - retcode = fclose(proc_file); - } while (retcode == -1 && errno == EINTR); - } - if (retcode_error != 0) { - return retcode_error; - } - return retcode; + if (retcode != 0) { + // Unrecoverable I/O error + retcode_error = retcode; + break; + } + if (entropy >= bits) { + break; + } + } else { + // Unreachable: poll() should only return -1 or 1 + retcode_error = -1; + break; + } + } + do { + retcode = close(fd); + } while (retcode == -1 && errno == EINTR); + if (strategy == PROC) { + do { + retcode = fclose(proc_file); + } while (retcode == -1 && errno == EINTR); + } + if (retcode_error != 0) { + return retcode_error; + } + return retcode; } -# endif /* defined(__linux__) */ +#endif /* defined(__linux__) */ - -static int randombytes_linux_randombytes_urandom(void *buf, size_t n) +static int +randombytes_linux_randombytes_urandom(void *buf, size_t n) { - int fd; - size_t offset = 0, count; - ssize_t tmp; - do { - fd = open("/dev/urandom", O_RDONLY); - } while (fd == -1 && errno == EINTR); - if (fd == -1) return -1; -# if defined(__linux__) - if (randombytes_linux_wait_for_entropy(fd) == -1) return -1; -# endif + int fd; + size_t offset = 0, count; + ssize_t tmp; + do { + fd = open("/dev/urandom", O_RDONLY); + } while (fd == -1 && errno == EINTR); + if (fd == -1) + return -1; +#if defined(__linux__) + if (randombytes_linux_wait_for_entropy(fd) == -1) + return -1; +#endif - while (n > 0) { - count = n <= SSIZE_MAX ? n : SSIZE_MAX; - tmp = read(fd, (char *)buf + offset, count); - if (tmp == -1 && (errno == EAGAIN || errno == EINTR)) { - continue; - } - if (tmp == -1) return -1; /* Unrecoverable IO error */ - offset += tmp; - n -= tmp; - } - close(fd); - assert(n == 0); - return 0; + while (n > 0) { + count = n <= SSIZE_MAX ? n : SSIZE_MAX; + tmp = read(fd, (char *)buf + offset, count); + if (tmp == -1 && (errno == EAGAIN || errno == EINTR)) { + continue; + } + if (tmp == -1) + return -1; /* Unrecoverable IO error */ + offset += tmp; + n -= tmp; + } + close(fd); + assert(n == 0); + return 0; } #endif /* defined(__linux__) && !defined(SYS_getrandom) */ - #if defined(BSD) -static int randombytes_bsd_randombytes(void *buf, size_t n) +static int +randombytes_bsd_randombytes(void *buf, size_t n) { - arc4random_buf(buf, n); - return 0; + arc4random_buf(buf, n); + return 0; } #endif /* defined(BSD) */ - #if defined(__EMSCRIPTEN__) -static int randombytes_js_randombytes_nodejs(void *buf, size_t n) { - const int ret = EM_ASM_INT({ - var crypto; - try { - crypto = require('crypto'); - } catch (error) { - return -2; - } - try { - writeArrayToMemory(crypto.randomBytes($1), $0); - return 0; - } catch (error) { - return -1; - } - }, buf, n); - switch (ret) { - case 0: - return 0; - case -1: - errno = EINVAL; - return -1; - case -2: - errno = ENOSYS; - return -1; - } - assert(false); // Unreachable +static int +randombytes_js_randombytes_nodejs(void *buf, size_t n) +{ + const int ret = EM_ASM_INT( + { + var crypto; + try { + crypto = require('crypto'); + } catch (error) { + return -2; + } + try { + writeArrayToMemory(crypto.randomBytes($1), $0); + return 0; + } catch (error) { + return -1; + } + }, + buf, + n); + switch (ret) { + case 0: + return 0; + case -1: + errno = EINVAL; + return -1; + case -2: + errno = ENOSYS; + return -1; + } + assert(false); // Unreachable } #endif /* defined(__EMSCRIPTEN__) */ - -static int randombytes_select(void *buf, size_t n) +SQISIGN_API +int +randombytes_select(unsigned char *buf, unsigned long long n) { #if defined(__EMSCRIPTEN__) - return randombytes_js_randombytes_nodejs(buf, n); + return randombytes_js_randombytes_nodejs(buf, n); #elif defined(__linux__) || defined(__GNU__) || defined(GNU_KFREEBSD) -# if defined(USE_GLIBC) - /* Use getrandom system call */ - return randombytes_linux_randombytes_getrandom(buf, n); -# elif defined(SYS_getrandom) - /* Use getrandom system call */ - return randombytes_linux_randombytes_getrandom(buf, n); -# else - /* When we have enough entropy, we can read from /dev/urandom */ - return randombytes_linux_randombytes_urandom(buf, n); -# endif -#elif defined(BSD) - /* Use arc4random system call */ - return randombytes_bsd_randombytes(buf, n); -#elif defined(_WIN32) - /* Use windows API */ - return randombytes_win32_randombytes(buf, n); -#elif defined(__wasi__) - /* Use WASI */ - return randombytes_wasi_randombytes(buf, n); +#if defined(USE_GLIBC) + /* Use getrandom system call */ + return randombytes_linux_randombytes_getrandom(buf, n); +#elif defined(SYS_getrandom) + /* Use getrandom system call */ + return randombytes_linux_randombytes_getrandom(buf, n); #else -# error "randombytes(...) is not supported on this platform" + /* When we have enough entropy, we can read from /dev/urandom */ + return randombytes_linux_randombytes_urandom(buf, n); +#endif +#elif defined(BSD) + /* Use arc4random system call */ + return randombytes_bsd_randombytes(buf, n); +#elif defined(_WIN32) + /* Use windows API */ + return randombytes_win32_randombytes(buf, n); +#elif defined(__wasi__) + /* Use WASI */ + return randombytes_wasi_randombytes(buf, n); +#else +#error "randombytes(...) is not supported on this platform" #endif } -int randombytes(unsigned char *x, unsigned long long xlen) { +#ifdef RANDOMBYTES_SYSTEM +SQISIGN_API +int +randombytes(unsigned char *x, unsigned long long xlen) +{ - int ret = randombytes_select(x, (size_t) xlen); + int ret = randombytes_select(x, (size_t)xlen); #ifdef ENABLE_CT_TESTING VALGRIND_MAKE_MEM_UNDEFINED(x, xlen); #endif return ret; } -void randombytes_init(unsigned char *entropy_input, - unsigned char *personalization_string, - int security_strength) { - (void) entropy_input; - (void) personalization_string; - (void) security_strength; +SQISIGN_API +void +randombytes_init(unsigned char *entropy_input, + unsigned char *personalization_string, + int security_strength) +{ + (void)entropy_input; + (void)personalization_string; + (void)security_strength; } +#endif diff --git a/src/common/generic/test/bench_ctrdrbg.c b/src/common/generic/test/bench_ctrdrbg.c new file mode 100644 index 0000000..2dab0c2 --- /dev/null +++ b/src/common/generic/test/bench_ctrdrbg.c @@ -0,0 +1,57 @@ +#include +#include +#include + +#include "bench.h" + +#define RANDOMBYTES_MAX_LENGTH 131072 +#define STRINGIFY2(x) #x +#define STRINGIFY(x) STRINGIFY2(x) + +void +randombytes_init_nist(unsigned char *entropy_input, + unsigned char *personalization_string, + int security_strength); + +int +randombytes_nist(unsigned char *x, size_t xlen); + +void +RANDOMBYTES_INIT_PLATFORM(unsigned char *entropy_input, + unsigned char *personalization_string, + int security_strength); + +int +RANDOMBYTES_PLATFORM(unsigned char *x, size_t xlen); + +int +randombytes_select(void *buf, size_t n); + +// run all tests in module +int main(int argc, char *argv[]) { +#ifndef NDEBUG + fprintf(stderr, + "\x1b[31mIt looks like SQIsign was compiled with assertions enabled.\n" + "This will severely impact performance measurements.\x1b[0m\n"); +#endif + + printf("Running AES-CTR-DRBG benchmarks\n"); + + unsigned char x[RANDOMBYTES_MAX_LENGTH]; + + cpucycles_init(); + + BENCH_CODE_1(1000 * SQISIGN_TEST_REPS); + RANDOMBYTES_PLATFORM(x, RANDOMBYTES_MAX_LENGTH); + BENCH_CODE_2(STRINGIFY(RANDOMBYTES_PLATFORM)); + + BENCH_CODE_1(SQISIGN_TEST_REPS); + randombytes_nist(x, RANDOMBYTES_MAX_LENGTH); + BENCH_CODE_2("randombytes_nist"); + + BENCH_CODE_1(1000 * SQISIGN_TEST_REPS); + randombytes_select(x, RANDOMBYTES_MAX_LENGTH); + BENCH_CODE_2("randombytes_system"); + + return 0; +} diff --git a/src/common/generic/test/test_ctrdrbg.c b/src/common/generic/test/test_ctrdrbg.c new file mode 100644 index 0000000..7be5f0a --- /dev/null +++ b/src/common/generic/test/test_ctrdrbg.c @@ -0,0 +1,68 @@ +#include +#include +#include + +#define RANDOMBYTES_MAX_LENGTH 131072 +#define STRINGIFY2(x) #x +#define STRINGIFY(x) STRINGIFY2(x) + +void +randombytes_init_nist(unsigned char *entropy_input, + unsigned char *personalization_string, + int security_strength); + +int +randombytes_nist(unsigned char *x, size_t xlen); + +void +RANDOMBYTES_INIT_PLATFORM(unsigned char *entropy_input, + unsigned char *personalization_string, + int security_strength); + +int +RANDOMBYTES_PLATFORM(unsigned char *x, size_t xlen); + +int +randombytes_select(void *buf, size_t n); + +// run all tests in module +int main(int argc, char *argv[]) { + int res = 1; + + printf("Running AES-CTR-DRBG unit tests\n"); + + unsigned char seed[48]; + unsigned char x_nist[RANDOMBYTES_MAX_LENGTH], x_platform[RANDOMBYTES_MAX_LENGTH]; + + for (int i = 0; i < 8; i++) { + for (unsigned j = 0; j < sizeof(seed); j++) { + seed[j] = 1 << i; + } + + RANDOMBYTES_INIT_PLATFORM(seed, NULL, 256); + randombytes_init_nist(seed, NULL, 256); + + for (int j = RANDOMBYTES_MAX_LENGTH; j <= RANDOMBYTES_MAX_LENGTH; j *= 2) { + RANDOMBYTES_PLATFORM(x_platform, j); + randombytes_nist(x_nist, j); + + if (memcmp(x_platform, x_nist, j) != 0) { + for (int k = 0; k < j; k++) { + if (x_platform[k] != x_nist[k]) { + printf("Test failed for seed = %d, length = %d bytes: mismatch at index %d: %d != %d\n", i, j, k, x_platform[k], x_nist[k]); + break; + } + } + res = 0; + } + } + } + + if (!res) { + printf("\nSome tests failed!\n"); + } else { + printf("\nAll tests passed!\n"); + } + + return (!res); +} diff --git a/src/common/generic/tools.c b/src/common/generic/tools.c new file mode 100644 index 0000000..242ea08 --- /dev/null +++ b/src/common/generic/tools.c @@ -0,0 +1,75 @@ +#include +#include + +static clock_t global_timer; + +clock_t +tic(void) +{ + global_timer = clock(); + return global_timer; +} + +float +tac(void) +{ + float ms = (1000. * (float)(clock() - global_timer) / CLOCKS_PER_SEC); + return ms; +} + +float +TAC(const char *str) +{ + float ms = (1000. * (float)(clock() - global_timer) / CLOCKS_PER_SEC); +#ifndef NDEBUG + printf("%s [%d ms]\n", str, (int)ms); +#endif + return ms; +} + +float +toc(const clock_t t) +{ + float ms = (1000. * (float)(clock() - t) / CLOCKS_PER_SEC); + return ms; +} + +float +TOC(const clock_t t, const char *str) +{ + float ms = (1000. * (float)(clock() - t) / CLOCKS_PER_SEC); + printf("%s [%d ms]\n", str, (int)ms); + return ms; + // printf("%s [%ld]\n",str,clock()-t); + // return (float) (clock()-t); +} + +float +TOC_clock(const clock_t t, const char *str) +{ + printf("%s [%ld]\n", str, clock() - t); + return (float)(clock() - t); +} + +clock_t +dclock(const clock_t t) +{ + return (clock() - t); +} + +float +clock_to_time(const clock_t t, const char *str) +{ + float ms = (1000. * (float)(t) / CLOCKS_PER_SEC); + printf("%s [%d ms]\n", str, (int)ms); + return ms; + // printf("%s [%ld]\n",str,t); + // return (float) (t); +} + +float +clock_print(const clock_t t, const char *str) +{ + printf("%s [%ld]\n", str, t); + return (float)(t); +} diff --git a/src/common/ref/CMakeLists.txt b/src/common/ref/CMakeLists.txt new file mode 100644 index 0000000..63aa86d --- /dev/null +++ b/src/common/ref/CMakeLists.txt @@ -0,0 +1,10 @@ +set(SOURCE_FILES_COMMON_TEST_REF + randombytes_ctrdrbg.c + aes_c.c +) + +target_sources(sqisign_common_test PRIVATE ${SOURCE_FILES_COMMON_TEST_REF}) +target_include_directories(sqisign_common_test PRIVATE include) +target_compile_definitions(sqisign_common_test PRIVATE RANDOMBYTES_C) + +target_compile_definitions(sqisign_common_sys PRIVATE RANDOMBYTES_SYSTEM) diff --git a/src/common/generic/aes_c.c b/src/common/ref/aes_c.c similarity index 72% rename from src/common/generic/aes_c.c rename to src/common/ref/aes_c.c index 868fcd7..5e2d7d6 100644 --- a/src/common/generic/aes_c.c +++ b/src/common/ref/aes_c.c @@ -39,23 +39,24 @@ #define AESCTR_NONCEBYTES 12 #define AES_BLOCKBYTES 16 -// We've put these states on the heap to make sure ctx_release is used. #define PQC_AES128_STATESIZE 88 -typedef struct { - uint64_t *sk_exp; +typedef struct +{ + uint64_t sk_exp[PQC_AES128_STATESIZE]; } aes128ctx; #define PQC_AES192_STATESIZE 104 -typedef struct { - uint64_t *sk_exp; +typedef struct +{ + uint64_t sk_exp[PQC_AES192_STATESIZE]; } aes192ctx; #define PQC_AES256_STATESIZE 120 -typedef struct { - uint64_t *sk_exp; +typedef struct +{ + uint64_t sk_exp[PQC_AES256_STATESIZE]; } aes256ctx; - /** Initializes the context **/ void aes128_ecb_keyexp(aes128ctx *r, const unsigned char *key); @@ -68,7 +69,6 @@ void aes128_ctr(unsigned char *out, size_t outlen, const unsigned char *iv, cons /** Frees the context **/ void aes128_ctx_release(aes128ctx *r); - /** Initializes the context **/ void aes192_ecb_keyexp(aes192ctx *r, const unsigned char *key); @@ -80,7 +80,6 @@ void aes192_ctr(unsigned char *out, size_t outlen, const unsigned char *iv, cons void aes192_ctx_release(aes192ctx *r); - /** Initializes the context **/ void aes256_ecb_keyexp(aes256ctx *r, const unsigned char *key); @@ -93,46 +92,50 @@ void aes256_ctr(unsigned char *out, size_t outlen, const unsigned char *iv, cons /** Frees the context **/ void aes256_ctx_release(aes256ctx *r); -static inline uint32_t br_dec32le(const unsigned char *src) { - return (uint32_t)src[0] - | ((uint32_t)src[1] << 8) - | ((uint32_t)src[2] << 16) - | ((uint32_t)src[3] << 24); +static inline uint32_t +br_dec32le(const unsigned char *src) +{ + return (uint32_t)src[0] | ((uint32_t)src[1] << 8) | ((uint32_t)src[2] << 16) | + ((uint32_t)src[3] << 24); } - -static void br_range_dec32le(uint32_t *v, size_t num, const unsigned char *src) { +static void +br_range_dec32le(uint32_t *v, size_t num, const unsigned char *src) +{ while (num-- > 0) { - *v ++ = br_dec32le(src); + *v++ = br_dec32le(src); src += 4; } } - -static inline uint32_t br_swap32(uint32_t x) { - x = ((x & (uint32_t)0x00FF00FF) << 8) - | ((x >> 8) & (uint32_t)0x00FF00FF); +static inline uint32_t +br_swap32(uint32_t x) +{ + x = ((x & (uint32_t)0x00FF00FF) << 8) | ((x >> 8) & (uint32_t)0x00FF00FF); return (x << 16) | (x >> 16); } - -static inline void br_enc32le(unsigned char *dst, uint32_t x) { +static inline void +br_enc32le(unsigned char *dst, uint32_t x) +{ dst[0] = (unsigned char)x; dst[1] = (unsigned char)(x >> 8); dst[2] = (unsigned char)(x >> 16); dst[3] = (unsigned char)(x >> 24); } - -static void br_range_enc32le(unsigned char *dst, const uint32_t *v, size_t num) { +static void +br_range_enc32le(unsigned char *dst, const uint32_t *v, size_t num) +{ while (num-- > 0) { - br_enc32le(dst, *v ++); + br_enc32le(dst, *v++); dst += 4; } } - -static void br_aes_ct64_bitslice_Sbox(uint64_t *q) { +static void +br_aes_ct64_bitslice_Sbox(uint64_t *q) +{ /* * This S-box implementation is a straightforward translation of * the circuit described by Boyar and Peralta in "A new @@ -306,18 +309,21 @@ static void br_aes_ct64_bitslice_Sbox(uint64_t *q) { q[0] = s7; } -static void br_aes_ct64_ortho(uint64_t *q) { -#define SWAPN(cl, ch, s, x, y) do { \ - uint64_t a, b; \ - a = (x); \ - b = (y); \ - (x) = (a & (uint64_t)(cl)) | ((b & (uint64_t)(cl)) << (s)); \ - (y) = ((a & (uint64_t)(ch)) >> (s)) | (b & (uint64_t)(ch)); \ +static void +br_aes_ct64_ortho(uint64_t *q) +{ +#define SWAPN(cl, ch, s, x, y) \ + do { \ + uint64_t a, b; \ + a = (x); \ + b = (y); \ + (x) = (a & (uint64_t)(cl)) | ((b & (uint64_t)(cl)) << (s)); \ + (y) = ((a & (uint64_t)(ch)) >> (s)) | (b & (uint64_t)(ch)); \ } while (0) -#define SWAP2(x, y) SWAPN(0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 1, x, y) -#define SWAP4(x, y) SWAPN(0x3333333333333333, 0xCCCCCCCCCCCCCCCC, 2, x, y) -#define SWAP8(x, y) SWAPN(0x0F0F0F0F0F0F0F0F, 0xF0F0F0F0F0F0F0F0, 4, x, y) +#define SWAP2(x, y) SWAPN(0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 1, x, y) +#define SWAP4(x, y) SWAPN(0x3333333333333333, 0xCCCCCCCCCCCCCCCC, 2, x, y) +#define SWAP8(x, y) SWAPN(0x0F0F0F0F0F0F0F0F, 0xF0F0F0F0F0F0F0F0, 4, x, y) SWAP2(q[0], q[1]); SWAP2(q[2], q[3]); @@ -335,8 +341,9 @@ static void br_aes_ct64_ortho(uint64_t *q) { SWAP8(q[3], q[7]); } - -static void br_aes_ct64_interleave_in(uint64_t *q0, uint64_t *q1, const uint32_t *w) { +static void +br_aes_ct64_interleave_in(uint64_t *q0, uint64_t *q1, const uint32_t *w) +{ uint64_t x0, x1, x2, x3; x0 = w[0]; @@ -363,8 +370,9 @@ static void br_aes_ct64_interleave_in(uint64_t *q0, uint64_t *q1, const uint32_t *q1 = x1 | (x3 << 8); } - -static void br_aes_ct64_interleave_out(uint32_t *w, uint64_t q0, uint64_t q1) { +static void +br_aes_ct64_interleave_out(uint32_t *w, uint64_t q0, uint64_t q1) +{ uint64_t x0, x1, x2, x3; x0 = q0 & (uint64_t)0x00FF00FF00FF00FF; @@ -385,11 +393,11 @@ static void br_aes_ct64_interleave_out(uint32_t *w, uint64_t q0, uint64_t q1) { w[3] = (uint32_t)x3 | (uint32_t)(x3 >> 16); } -static const unsigned char Rcon[] = { - 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36 -}; +static const unsigned char Rcon[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36 }; -static uint32_t sub_word(uint32_t x) { +static uint32_t +sub_word(uint32_t x) +{ uint64_t q[8]; memset(q, 0, sizeof q); @@ -400,7 +408,9 @@ static uint32_t sub_word(uint32_t x) { return (uint32_t)q[0]; } -static void br_aes_ct64_keysched(uint64_t *comp_skey, const unsigned char *key, unsigned int key_len) { +static void +br_aes_ct64_keysched(uint64_t *comp_skey, const unsigned char *key, unsigned int key_len) +{ unsigned int i, j, k, nk, nkf; uint32_t tmp; uint32_t skey[60]; @@ -410,7 +420,7 @@ static void br_aes_ct64_keysched(uint64_t *comp_skey, const unsigned char *key, nkf = ((nrounds + 1) << 2); br_range_dec32le(skey, (key_len >> 2), key); tmp = skey[(key_len >> 2) - 1]; - for (i = nk, j = 0, k = 0; i < nkf; i ++) { + for (i = nk, j = 0, k = 0; i < nkf; i++) { if (j == 0) { tmp = (tmp << 24) | (tmp >> 8); tmp = sub_word(tmp) ^ Rcon[k]; @@ -419,9 +429,9 @@ static void br_aes_ct64_keysched(uint64_t *comp_skey, const unsigned char *key, } tmp ^= skey[i - nk]; skey[i] = tmp; - if (++ j == nk) { + if (++j == nk) { j = 0; - k ++; + k++; } } @@ -437,23 +447,21 @@ static void br_aes_ct64_keysched(uint64_t *comp_skey, const unsigned char *key, q[7] = q[4]; br_aes_ct64_ortho(q); comp_skey[j + 0] = - (q[0] & (uint64_t)0x1111111111111111) - | (q[1] & (uint64_t)0x2222222222222222) - | (q[2] & (uint64_t)0x4444444444444444) - | (q[3] & (uint64_t)0x8888888888888888); + (q[0] & (uint64_t)0x1111111111111111) | (q[1] & (uint64_t)0x2222222222222222) | + (q[2] & (uint64_t)0x4444444444444444) | (q[3] & (uint64_t)0x8888888888888888); comp_skey[j + 1] = - (q[4] & (uint64_t)0x1111111111111111) - | (q[5] & (uint64_t)0x2222222222222222) - | (q[6] & (uint64_t)0x4444444444444444) - | (q[7] & (uint64_t)0x8888888888888888); + (q[4] & (uint64_t)0x1111111111111111) | (q[5] & (uint64_t)0x2222222222222222) | + (q[6] & (uint64_t)0x4444444444444444) | (q[7] & (uint64_t)0x8888888888888888); } } -static void br_aes_ct64_skey_expand(uint64_t *skey, const uint64_t *comp_skey, unsigned int nrounds) { +static void +br_aes_ct64_skey_expand(uint64_t *skey, const uint64_t *comp_skey, unsigned int nrounds) +{ unsigned u, v, n; n = (nrounds + 1) << 1; - for (u = 0, v = 0; u < n; u ++, v += 4) { + for (u = 0, v = 0; u < n; u++, v += 4) { uint64_t x0, x1, x2, x3; x0 = x1 = x2 = x3 = comp_skey[u]; @@ -471,8 +479,9 @@ static void br_aes_ct64_skey_expand(uint64_t *skey, const uint64_t *comp_skey, u } } - -static inline void add_round_key(uint64_t *q, const uint64_t *sk) { +static inline void +add_round_key(uint64_t *q, const uint64_t *sk) +{ q[0] ^= sk[0]; q[1] ^= sk[1]; q[2] ^= sk[2]; @@ -483,28 +492,32 @@ static inline void add_round_key(uint64_t *q, const uint64_t *sk) { q[7] ^= sk[7]; } -static inline void shift_rows(uint64_t *q) { +static inline void +shift_rows(uint64_t *q) +{ int i; - for (i = 0; i < 8; i ++) { + for (i = 0; i < 8; i++) { uint64_t x; x = q[i]; - q[i] = (x & (uint64_t)0x000000000000FFFF) - | ((x & (uint64_t)0x00000000FFF00000) >> 4) - | ((x & (uint64_t)0x00000000000F0000) << 12) - | ((x & (uint64_t)0x0000FF0000000000) >> 8) - | ((x & (uint64_t)0x000000FF00000000) << 8) - | ((x & (uint64_t)0xF000000000000000) >> 12) - | ((x & (uint64_t)0x0FFF000000000000) << 4); + q[i] = + (x & (uint64_t)0x000000000000FFFF) | ((x & (uint64_t)0x00000000FFF00000) >> 4) | + ((x & (uint64_t)0x00000000000F0000) << 12) | ((x & (uint64_t)0x0000FF0000000000) >> 8) | + ((x & (uint64_t)0x000000FF00000000) << 8) | ((x & (uint64_t)0xF000000000000000) >> 12) | + ((x & (uint64_t)0x0FFF000000000000) << 4); } } -static inline uint64_t rotr32(uint64_t x) { +static inline uint64_t +rotr32(uint64_t x) +{ return (x << 32) | (x >> 32); } -static inline void mix_columns(uint64_t *q) { +static inline void +mix_columns(uint64_t *q) +{ uint64_t q0, q1, q2, q3, q4, q5, q6, q7; uint64_t r0, r1, r2, r3, r4, r5, r6, r7; @@ -535,14 +548,19 @@ static inline void mix_columns(uint64_t *q) { q[7] = q6 ^ r6 ^ r7 ^ rotr32(q7 ^ r7); } - -static void inc4_be(uint32_t *x) { +static void +inc4_be(uint32_t *x) +{ uint32_t t = br_swap32(*x) + 4; *x = br_swap32(t); } - -static void aes_ecb4x(unsigned char out[64], const uint32_t ivw[16], const uint64_t *sk_exp, unsigned int nrounds) { +static void +aes_ecb4x(unsigned char out[64], + const uint32_t ivw[16], + const uint64_t *sk_exp, + unsigned int nrounds) +{ uint32_t w[16]; uint64_t q[8]; unsigned int i; @@ -553,7 +571,6 @@ static void aes_ecb4x(unsigned char out[64], const uint32_t ivw[16], const uint6 } br_aes_ct64_ortho(q); - add_round_key(q, sk_exp); for (i = 1; i < nrounds; i++) { br_aes_ct64_bitslice_Sbox(q); @@ -566,14 +583,15 @@ static void aes_ecb4x(unsigned char out[64], const uint32_t ivw[16], const uint6 add_round_key(q, sk_exp + 8 * nrounds); br_aes_ct64_ortho(q); - for (i = 0; i < 4; i ++) { + for (i = 0; i < 4; i++) { br_aes_ct64_interleave_out(w + (i << 2), q[i], q[i + 4]); } br_range_enc32le(out, w, 16); } - -static void aes_ctr4x(unsigned char out[64], uint32_t ivw[16], const uint64_t *sk_exp, unsigned int nrounds) { +static void +aes_ctr4x(unsigned char out[64], uint32_t ivw[16], const uint64_t *sk_exp, unsigned int nrounds) +{ aes_ecb4x(out, ivw, sk_exp, nrounds); /* Increase counter for next 4 blocks */ @@ -583,8 +601,13 @@ static void aes_ctr4x(unsigned char out[64], uint32_t ivw[16], const uint64_t *s inc4_be(ivw + 15); } - -static void aes_ecb(unsigned char *out, const unsigned char *in, size_t nblocks, const uint64_t *rkeys, unsigned int nrounds) { +static void +aes_ecb(unsigned char *out, + const unsigned char *in, + size_t nblocks, + const uint64_t *rkeys, + unsigned int nrounds) +{ uint32_t blocks[16]; unsigned char t[64]; @@ -603,18 +626,23 @@ static void aes_ecb(unsigned char *out, const unsigned char *in, size_t nblocks, } } - -static void aes_ctr(unsigned char *out, size_t outlen, const unsigned char *iv, const uint64_t *rkeys, unsigned int nrounds) { +static void +aes_ctr(unsigned char *out, + size_t outlen, + const unsigned char *iv, + const uint64_t *rkeys, + unsigned int nrounds) +{ uint32_t ivw[16]; size_t i; uint32_t cc = 0; br_range_dec32le(ivw, 3, iv); - memcpy(ivw + 4, ivw, 3 * sizeof(uint32_t)); - memcpy(ivw + 8, ivw, 3 * sizeof(uint32_t)); + memcpy(ivw + 4, ivw, 3 * sizeof(uint32_t)); + memcpy(ivw + 8, ivw, 3 * sizeof(uint32_t)); memcpy(ivw + 12, ivw, 3 * sizeof(uint32_t)); - ivw[ 3] = br_swap32(cc); - ivw[ 7] = br_swap32(cc + 1); + ivw[3] = br_swap32(cc); + ivw[7] = br_swap32(cc + 1); ivw[11] = br_swap32(cc + 2); ivw[15] = br_swap32(cc + 3); @@ -632,97 +660,110 @@ static void aes_ctr(unsigned char *out, size_t outlen, const unsigned char *iv, } } -void aes128_ecb_keyexp(aes128ctx *r, const unsigned char *key) { +void +aes128_ecb_keyexp(aes128ctx *r, const unsigned char *key) +{ uint64_t skey[22]; - r->sk_exp = malloc(sizeof(uint64_t) * PQC_AES128_STATESIZE); - if (r->sk_exp == NULL) { - exit(111); - } - br_aes_ct64_keysched(skey, key, 16); br_aes_ct64_skey_expand(r->sk_exp, skey, 10); } -void aes128_ctr_keyexp(aes128ctx *r, const unsigned char *key) { +void +aes128_ctr_keyexp(aes128ctx *r, const unsigned char *key) +{ aes128_ecb_keyexp(r, key); } - -void aes192_ecb_keyexp(aes192ctx *r, const unsigned char *key) { +void +aes192_ecb_keyexp(aes192ctx *r, const unsigned char *key) +{ uint64_t skey[26]; - r->sk_exp = malloc(sizeof(uint64_t) * PQC_AES192_STATESIZE); - if (r->sk_exp == NULL) { - exit(111); - } br_aes_ct64_keysched(skey, key, 24); br_aes_ct64_skey_expand(r->sk_exp, skey, 12); } - -void aes192_ctr_keyexp(aes192ctx *r, const unsigned char *key) { +void +aes192_ctr_keyexp(aes192ctx *r, const unsigned char *key) +{ aes192_ecb_keyexp(r, key); } - -void aes256_ecb_keyexp(aes256ctx *r, const unsigned char *key) { +void +aes256_ecb_keyexp(aes256ctx *r, const unsigned char *key) +{ uint64_t skey[30]; - r->sk_exp = malloc(sizeof(uint64_t) * PQC_AES256_STATESIZE); - if (r->sk_exp == NULL) { - exit(111); - } br_aes_ct64_keysched(skey, key, 32); br_aes_ct64_skey_expand(r->sk_exp, skey, 14); } - -void aes256_ctr_keyexp(aes256ctx *r, const unsigned char *key) { +void +aes256_ctr_keyexp(aes256ctx *r, const unsigned char *key) +{ aes256_ecb_keyexp(r, key); } - -void aes128_ecb(unsigned char *out, const unsigned char *in, size_t nblocks, const aes128ctx *ctx) { +void +aes128_ecb(unsigned char *out, const unsigned char *in, size_t nblocks, const aes128ctx *ctx) +{ aes_ecb(out, in, nblocks, ctx->sk_exp, 10); } -void aes128_ctr(unsigned char *out, size_t outlen, const unsigned char *iv, const aes128ctx *ctx) { +void +aes128_ctr(unsigned char *out, size_t outlen, const unsigned char *iv, const aes128ctx *ctx) +{ aes_ctr(out, outlen, iv, ctx->sk_exp, 10); } -void aes192_ecb(unsigned char *out, const unsigned char *in, size_t nblocks, const aes192ctx *ctx) { +void +aes192_ecb(unsigned char *out, const unsigned char *in, size_t nblocks, const aes192ctx *ctx) +{ aes_ecb(out, in, nblocks, ctx->sk_exp, 12); } -void aes192_ctr(unsigned char *out, size_t outlen, const unsigned char *iv, const aes192ctx *ctx) { +void +aes192_ctr(unsigned char *out, size_t outlen, const unsigned char *iv, const aes192ctx *ctx) +{ aes_ctr(out, outlen, iv, ctx->sk_exp, 12); } -void aes256_ecb(unsigned char *out, const unsigned char *in, size_t nblocks, const aes256ctx *ctx) { +void +aes256_ecb(unsigned char *out, const unsigned char *in, size_t nblocks, const aes256ctx *ctx) +{ aes_ecb(out, in, nblocks, ctx->sk_exp, 14); } -void aes256_ctr(unsigned char *out, size_t outlen, const unsigned char *iv, const aes256ctx *ctx) { +void +aes256_ctr(unsigned char *out, size_t outlen, const unsigned char *iv, const aes256ctx *ctx) +{ aes_ctr(out, outlen, iv, ctx->sk_exp, 14); } -void aes128_ctx_release(aes128ctx *r) { - free(r->sk_exp); +void +aes128_ctx_release(aes128ctx *r) +{ } -void aes192_ctx_release(aes192ctx *r) { - free(r->sk_exp); +void +aes192_ctx_release(aes192ctx *r) +{ } -void aes256_ctx_release(aes256ctx *r) { - free(r->sk_exp); +void +aes256_ctx_release(aes256ctx *r) +{ } -int AES_128_CTR(unsigned char *output, size_t outputByteLen, - const unsigned char *input, size_t inputByteLen) { +int +AES_128_CTR(unsigned char *output, + size_t outputByteLen, + const unsigned char *input, + size_t inputByteLen) +{ aes128ctx ctx; - unsigned char iv[16] = { 0 }; + const unsigned char iv[16] = { 0 }; aes128_ctr_keyexp(&ctx, input); aes128_ctr(output, outputByteLen, iv, &ctx); @@ -731,7 +772,9 @@ int AES_128_CTR(unsigned char *output, size_t outputByteLen, return (int)outputByteLen; } -void AES_256_ECB(const uint8_t *input, const unsigned char *key, unsigned char *output) { +void +AES_256_ECB(const uint8_t *input, const unsigned char *key, unsigned char *output) +{ aes256ctx ctx; aes256_ecb_keyexp(&ctx, key); diff --git a/src/common/ref/include/aes.h b/src/common/ref/include/aes.h new file mode 100644 index 0000000..e35ec37 --- /dev/null +++ b/src/common/ref/include/aes.h @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: Apache-2.0 + +#ifndef AES_H +#define AES_H + +#include +#include + +void AES_256_ECB(const uint8_t *input, const uint8_t *key, uint8_t *output); +#define AES_ECB_encrypt AES_256_ECB + +#ifdef ENABLE_AESNI +int AES_128_CTR_NI(unsigned char *output, + size_t outputByteLen, + const unsigned char *input, + size_t inputByteLen); +int AES_128_CTR_4R_NI(unsigned char *output, + size_t outputByteLen, + const unsigned char *input, + size_t inputByteLen); +#define AES_128_CTR AES_128_CTR_NI +#else +int AES_128_CTR(unsigned char *output, + size_t outputByteLen, + const unsigned char *input, + size_t inputByteLen); +#endif + +#endif diff --git a/src/common/ref/randombytes_ctrdrbg.c b/src/common/ref/randombytes_ctrdrbg.c new file mode 100644 index 0000000..372cc0d --- /dev/null +++ b/src/common/ref/randombytes_ctrdrbg.c @@ -0,0 +1,161 @@ +// SPDX-License-Identifier: Apache-2.0 and Unknown +// +/* +NIST-developed software is provided by NIST as a public service. You may use, +copy, and distribute copies of the software in any medium, provided that you +keep intact this entire notice. You may improve, modify, and create derivative +works of the software or any portion of the software, and you may copy and +distribute such modifications or works. Modified works should carry a notice +stating that you changed the software and should note the date and nature of any +such change. Please explicitly acknowledge the National Institute of Standards +and Technology as the source of the software. + +NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY OF +ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, INCLUDING, +WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST NEITHER REPRESENTS +NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR +ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES NOT WARRANT OR MAKE +ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR THE RESULTS THEREOF, +INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, RELIABILITY, OR +USEFULNESS OF THE SOFTWARE. + +You are solely responsible for determining the appropriateness of using and +distributing the software and you assume all risks associated with its use, +including but not limited to the risks and costs of program errors, compliance +with applicable laws, damage to or loss of data, programs or equipment, and the +unavailability or interruption of operation. This software is not intended to be +used in any situation where a failure could cause risk of injury or damage to +property. The software developed by NIST employees is not subject to copyright +protection within the United States. +*/ + +#include +#include + +#include + +#ifdef ENABLE_CT_TESTING +#include +#endif + +#define RNG_SUCCESS 0 +#define RNG_BAD_MAXLEN -1 +#define RNG_BAD_OUTBUF -2 +#define RNG_BAD_REQ_LEN -3 + +static inline void AES256_ECB(const unsigned char *key, + const unsigned char *ctr, unsigned char *buffer) { + AES_ECB_encrypt(ctr, key, buffer); +} + +typedef struct { + unsigned char Key[32]; + unsigned char V[16]; + int reseed_counter; +} AES256_CTR_DRBG_struct; + +void AES256_CTR_DRBG_Update(const unsigned char *provided_data, + unsigned char *Key, unsigned char *V); + +AES256_CTR_DRBG_struct DRBG_ctx; + +#ifndef CTRDRBG_TEST_BENCH +static +#endif + void + randombytes_init_nist(unsigned char *entropy_input, + unsigned char *personalization_string, + int security_strength) { + unsigned char seed_material[48]; + + (void)security_strength; // Unused parameter + memcpy(seed_material, entropy_input, 48); + if (personalization_string) + for (int i = 0; i < 48; i++) { + seed_material[i] ^= personalization_string[i]; + } + memset(DRBG_ctx.Key, 0x00, 32); + memset(DRBG_ctx.V, 0x00, 16); + AES256_CTR_DRBG_Update(seed_material, DRBG_ctx.Key, DRBG_ctx.V); + DRBG_ctx.reseed_counter = 1; +} + +#ifndef CTRDRBG_TEST_BENCH +static +#endif + int + randombytes_nist(unsigned char *x, size_t xlen) { + unsigned char block[16]; + size_t i = 0; + + while (xlen > 0) { + // increment V + for (int j = 15; j >= 0; j--) { + if (DRBG_ctx.V[j] == 0xff) { + DRBG_ctx.V[j] = 0x00; + } else { + DRBG_ctx.V[j]++; + break; + } + } + AES256_ECB(DRBG_ctx.Key, DRBG_ctx.V, block); + if (xlen > 15) { + memcpy(x + i, block, 16); + i += 16; + xlen -= 16; + } else { + memcpy(x + i, block, xlen); + i += xlen; + xlen = 0; + } + } + AES256_CTR_DRBG_Update(NULL, DRBG_ctx.Key, DRBG_ctx.V); + DRBG_ctx.reseed_counter++; + + return 0; +} + +void AES256_CTR_DRBG_Update(const unsigned char *provided_data, + unsigned char *Key, unsigned char *V) { + unsigned char temp[48]; + + for (int i = 0; i < 3; i++) { + // increment V + for (int j = 15; j >= 0; j--) { + if (V[j] == 0xff) { + V[j] = 0x00; + } else { + V[j]++; + break; + } + } + + AES256_ECB(Key, V, temp + 16 * i); + } + if (provided_data != NULL) + for (int i = 0; i < 48; i++) { + temp[i] ^= provided_data[i]; + } + memcpy(Key, temp, 32); + memcpy(V, temp + 32, 16); +} + +#ifdef RANDOMBYTES_C +SQISIGN_API +int randombytes(unsigned char *random_array, unsigned long long nbytes) { + int ret = randombytes_nist(random_array, nbytes); +#ifdef ENABLE_CT_TESTING + VALGRIND_MAKE_MEM_UNDEFINED(random_array, ret); +#endif + return ret; +} + +SQISIGN_API +void randombytes_init(unsigned char *entropy_input, + unsigned char *personalization_string, + int security_strength) { + randombytes_init_nist(entropy_input, personalization_string, + security_strength); +} +#endif diff --git a/src/ec/ref/CMakeLists.txt b/src/ec/ref/CMakeLists.txt old mode 100755 new mode 100644 index 02f8cd3..d0ba315 --- a/src/ec/ref/CMakeLists.txt +++ b/src/ec/ref/CMakeLists.txt @@ -1,3 +1,3 @@ -set(ECX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/ecx) +set(LVLX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lvlx) include(${SELECT_SQISIGN_VARIANT}) diff --git a/src/ec/ref/ecx/basis.c b/src/ec/ref/ecx/basis.c deleted file mode 100644 index 8e781ad..0000000 --- a/src/ec/ref/ecx/basis.c +++ /dev/null @@ -1,508 +0,0 @@ -#include "isog.h" - - -static void xTPL(ec_point_t* Q, const ec_point_t* P, const ec_point_t* A3) -{ - /* ----------------------------------------------------------------------------- * - * Differential point tripling given the montgomery coefficient A3 = (A+2C:A-2C) - * ----------------------------------------------------------------------------- */ - - fp2_t t0, t1, t2, t3, t4; - fp2_sub(&t0, &P->x, &P->z); - fp2_sqr(&t2, &t0); - fp2_add(&t1, &P->x, &P->z); - fp2_sqr(&t3, &t1); - fp2_add(&t4, &t1, &t0); - fp2_sub(&t0, &t1, &t0); - fp2_sqr(&t1, &t4); - fp2_sub(&t1, &t1, &t3); - fp2_sub(&t1, &t1, &t2); - fp2_mul(&Q->x, &t3, &A3->x); - fp2_mul(&t3, &Q->x, &t3); - fp2_mul(&Q->z, &t2, &A3->z); - fp2_mul(&t2, &t2, &Q->z); - fp2_sub(&t3, &t2, &t3); - fp2_sub(&t2, &Q->x, &Q->z); - fp2_mul(&t1, &t2, &t1); - fp2_add(&t2, &t3, &t1); - fp2_sqr(&t2, &t2); - fp2_mul(&Q->x, &t2, &t4); - fp2_sub(&t1, &t3, &t1); - fp2_sqr(&t1, &t1); - fp2_mul(&Q->z, &t1, &t0); -} - -int ec_is_on_curve(const ec_curve_t* curve, const ec_point_t* P){ - - fp2_t t0, t1, t2; - - // Check if xz*(C^2x^2+zACx+z^2C^2) is a square - fp2_mul(&t0, &curve->C, &P->x); - fp2_mul(&t1, &t0, &P->z); - fp2_mul(&t1, &t1, &curve->A); - fp2_mul(&t2, &curve->C, &P->z); - fp2_sqr(&t0, &t0); - fp2_sqr(&t2, &t2); - fp2_add(&t0, &t0, &t1); - fp2_add(&t0, &t0, &t2); - fp2_mul(&t0, &t0, &P->x); - fp2_mul(&t0, &t0, &P->z); - return fp2_is_square(&t0); -} - -static void difference_point(ec_point_t* PQ, const ec_point_t* P, const ec_point_t* Q, const ec_curve_t* curve){ - // Given P,Q in affine x-only, computes a deterministic choice for (P-Q) - // The points must be normalized to z=1 and the curve to C=1 - - fp2_t t0, t1, t2, t3; - - fp2_sub(&PQ->z, &P->x, &Q->x); // P - Q - fp2_mul(&t2, &P->x, &Q->x); // P*Q - fp_mont_setone(t1.re); - fp_set(t1.im, 0); - fp2_sub(&t3, &t2, &t1); // P*Q-1 - fp2_mul(&t0, &PQ->z, &t3); // (P-Q)*(P*Q-1) - fp2_sqr(&PQ->z, &PQ->z); // (P-Q)^2 - fp2_sqr(&t0, &t0); // (P-Q)^2*(P*Q-1)^2 - fp2_add(&t1, &t2, &t1); // P*Q+1 - fp2_add(&t3, &P->x, &Q->x); // P+Q - fp2_mul(&t1, &t1, &t3); // (P+Q)*(P*Q+1) - fp2_mul(&t2, &t2, &curve->A); // A*P*Q - fp2_add(&t2, &t2, &t2); // 2*A*P*Q - fp2_add(&t1, &t1, &t2); // (P+Q)*(P*Q+1) + 2*A*P*Q - fp2_sqr(&t2, &t1); // ((P+Q)*(P*Q+1) + 2*A*P*Q)^2 - fp2_sub(&t0, &t2, &t0); // ((P+Q)*(P*Q+1) + 2*A*P*Q)^2 - (P-Q)^2*(P*Q-1)^2 - fp2_sqrt(&t0); - fp2_add(&PQ->x, &t0, &t1); -} - -void ec_curve_to_basis_2(ec_basis_t *PQ2, const ec_curve_t *curve){ - fp2_t x, t0, t1, t2; - ec_point_t P, Q, Q2, P2, A24; - - // Curve coefficient in the form A24 = (A+2C:4C) - fp2_add(&A24.z, &curve->C, &curve->C); - fp2_add(&A24.x, &curve->A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - - fp_mont_setone(x.re); - fp_set(x.im, 0); - - // Find P - while(1){ - fp_add(x.im, x.re, x.im); - - // Check if point is rational - fp2_sqr(&t0, &curve->C); - fp2_mul(&t1, &t0, &x); - fp2_mul(&t2, &curve->A, &curve->C); - fp2_add(&t1, &t1, &t2); - fp2_mul(&t1, &t1, &x); - fp2_add(&t1, &t1, &t0); - fp2_mul(&t1, &t1, &x); - if(fp2_is_square(&t1)){ - fp2_copy(&P.x, &x); - fp_mont_setone(P.z.re); - fp_set(P.z.im, 0); - } - else - continue; - - // Clear odd factors from the order - xMULv2(&P, &P, p_cofactor_for_2f, P_COFACTOR_FOR_2F_BITLENGTH, &A24); - - // Check if point has order 2^f - copy_point(&P2, &P); - for(int i = 0; i < POWER_OF_2 - 1; i++) - xDBLv2(&P2, &P2, &A24); - if(ec_is_zero(&P2)) - continue; - else - break; - } - - // Find Q - while(1){ - fp_add(x.im, x.re, x.im); - - // Check if point is rational - fp2_sqr(&t0, &curve->C); - fp2_mul(&t1, &t0, &x); - fp2_mul(&t2, &curve->A, &curve->C); - fp2_add(&t1, &t1, &t2); - fp2_mul(&t1, &t1, &x); - fp2_add(&t1, &t1, &t0); - fp2_mul(&t1, &t1, &x); - if(fp2_is_square(&t1)){ - fp2_copy(&Q.x, &x); - fp_mont_setone(Q.z.re); - fp_set(Q.z.im, 0); - } - else - continue; - - // Clear odd factors from the order - xMULv2(&Q, &Q, p_cofactor_for_2f, P_COFACTOR_FOR_2F_BITLENGTH, &A24); - - // Check if point has order 2^f - copy_point(&Q2, &Q); - for(int i = 0; i < POWER_OF_2 - 1; i++) - xDBLv2(&Q2, &Q2, &A24); - if(ec_is_zero(&Q2)) - continue; - - // Check if point is orthogonal to P - if(is_point_equal(&P2, &Q2)) - continue; - else - break; - } - - // Normalize points - ec_curve_t E; - fp2_mul(&t0, &P.z, &Q.z); - fp2_mul(&t1, &t0, &curve->C); - fp2_inv(&t1); - fp2_mul(&P.x, &P.x, &t1); - fp2_mul(&Q.x, &Q.x, &t1); - fp2_mul(&E.A, &curve->A, &t1); - fp2_mul(&P.x, &P.x, &Q.z); - fp2_mul(&P.x, &P.x, &curve->C); - fp2_mul(&Q.x, &Q.x, &P.z); - fp2_mul(&Q.x, &Q.x, &curve->C); - fp2_mul(&E.A, &E.A, &t0); - fp_mont_setone(P.z.re); - fp_set(P.z.im, 0); - fp2_copy(&Q.z, &P.z); - fp2_copy(&E.C, &P.z); - - // Compute P-Q - difference_point(&PQ2->PmQ, &P, &Q, &E); - copy_point(&PQ2->P, &P); - copy_point(&PQ2->Q, &Q); -} - - -void ec_complete_basis_2(ec_basis_t* PQ2, const ec_curve_t* curve, const ec_point_t* P){ - - fp2_t x, t0, t1, t2; - ec_point_t Q, Q2, P2, A24; - - // Curve coefficient in the form A24 = (A+2C:4C) - fp2_add(&A24.z, &curve->C, &curve->C); - fp2_add(&A24.x, &curve->A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - - // Point of order 2 generated by P - copy_point(&P2, P); - for(int i = 0; i < POWER_OF_2 - 1; i++) - xDBLv2(&P2, &P2, &A24); - - // Find Q - fp_mont_setone(x.re); - fp_set(x.im, 0); - while(1){ - fp_add(x.im, x.re, x.im); - - // Check if point is rational - fp2_sqr(&t0, &curve->C); - fp2_mul(&t1, &t0, &x); - fp2_mul(&t2, &curve->A, &curve->C); - fp2_add(&t1, &t1, &t2); - fp2_mul(&t1, &t1, &x); - fp2_add(&t1, &t1, &t0); - fp2_mul(&t1, &t1, &x); - if(fp2_is_square(&t1)){ - fp2_copy(&Q.x, &x); - fp_mont_setone(Q.z.re); - fp_set(Q.z.im, 0); - } - else - continue; - - // Clear odd factors from the order - xMULv2(&Q, &Q, p_cofactor_for_2f, (int)P_COFACTOR_FOR_2F_BITLENGTH, &A24); - - // Check if point has order 2^f - copy_point(&Q2, &Q); - for(int i = 0; i < POWER_OF_2 - 1; i++) - xDBLv2(&Q2, &Q2, &A24); - if(ec_is_zero(&Q2)) - continue; - - // Check if point is orthogonal to P - if(is_point_equal(&P2, &Q2)) - continue; - else - break; - } - - // Normalize points - ec_curve_t E; - ec_point_t PP; - fp2_mul(&t0, &P->z, &Q.z); - fp2_mul(&t1, &t0, &curve->C); - fp2_inv(&t1); - fp2_mul(&PP.x, &P->x, &t1); - fp2_mul(&Q.x, &Q.x, &t1); - fp2_mul(&E.A, &curve->A, &t1); - fp2_mul(&PP.x, &PP.x, &Q.z); - fp2_mul(&PP.x, &PP.x, &curve->C); - fp2_mul(&Q.x, &Q.x, &P->z); - fp2_mul(&Q.x, &Q.x, &curve->C); - fp2_mul(&E.A, &E.A, &t0); - fp_mont_setone(PP.z.re); - fp_set(PP.z.im, 0); - fp2_copy(&Q.z, &PP.z); - fp2_copy(&E.C, &PP.z); - - // Compute P-Q - difference_point(&PQ2->PmQ, &PP, &Q, &E); - copy_point(&PQ2->P, &PP); - copy_point(&PQ2->Q, &Q); -} - -void ec_curve_to_basis_3(ec_basis_t* PQ3, const ec_curve_t* curve){ - - fp2_t x, t0, t1, t2; - ec_point_t P, Q, Q3, P3, A24, A3; - - // Curve coefficient in the form A24 = (A+2C:4C) - fp2_add(&A24.z, &curve->C, &curve->C); - fp2_add(&A24.x, &curve->A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - - // Curve coefficient in the form A3 = (A+2C:A-2C) - fp2_sub(&A3.z, &A24.x, &A24.z); - fp2_copy(&A3.x, &A24.x); - - fp_mont_setone(x.re); - fp_set(x.im, 0); - - // Find P - while(1){ - fp_add(x.im, x.re, x.im); - - // Check if point is rational - fp2_sqr(&t0, &curve->C); - fp2_mul(&t1, &t0, &x); - fp2_mul(&t2, &curve->A, &curve->C); - fp2_add(&t1, &t1, &t2); - fp2_mul(&t1, &t1, &x); - fp2_add(&t1, &t1, &t0); - fp2_mul(&t1, &t1, &x); - if(fp2_is_square(&t1)){ - fp2_copy(&P.x, &x); - fp_mont_setone(P.z.re); - fp_set(P.z.im, 0); - } - else - continue; - - // Clear non-3 factors from the order - xMULv2(&P, &P, p_cofactor_for_3g, (int)P_COFACTOR_FOR_3G_BITLENGTH, &A24); - - // Check if point has order 3^g - copy_point(&P3, &P); - for(int i = 0; i < POWER_OF_3 - 1; i++) - xTPL(&P3, &P3, &A3); - if(ec_is_zero(&P3)) - continue; - else - break; - } - - // Find Q - while(1){ - fp_add(x.im, x.re, x.im); - - // Check if point is rational - fp2_sqr(&t0, &curve->C); - fp2_mul(&t1, &t0, &x); - fp2_mul(&t2, &curve->A, &curve->C); - fp2_add(&t1, &t1, &t2); - fp2_mul(&t1, &t1, &x); - fp2_add(&t1, &t1, &t0); - fp2_mul(&t1, &t1, &x); - if(fp2_is_square(&t1)){ - fp2_copy(&Q.x, &x); - fp_mont_setone(Q.z.re); - fp_set(Q.z.im, 0); - } - else - continue; - - // Clear non-3 factors from the order - xMULv2(&Q, &Q, p_cofactor_for_3g, (int)P_COFACTOR_FOR_3G_BITLENGTH, &A24); - - // Check if point has order 3^g - copy_point(&Q3, &Q); - for(int i = 0; i < POWER_OF_3 - 1; i++) - xTPL(&Q3, &Q3, &A3); - if(ec_is_zero(&Q3)) - continue; - - // Check if point is orthogonal to P - if(is_point_equal(&P3, &Q3)) - continue; - xDBLv2(&P3, &P3, &A24); - if(is_point_equal(&P3, &Q3)) - continue; - else - break; - } - - // Normalize points - ec_curve_t E; - fp2_mul(&t0, &P.z, &Q.z); - fp2_mul(&t1, &t0, &curve->C); - fp2_inv(&t1); - fp2_mul(&P.x, &P.x, &t1); - fp2_mul(&Q.x, &Q.x, &t1); - fp2_mul(&E.A, &curve->A, &t1); - fp2_mul(&P.x, &P.x, &Q.z); - fp2_mul(&P.x, &P.x, &curve->C); - fp2_mul(&Q.x, &Q.x, &P.z); - fp2_mul(&Q.x, &Q.x, &curve->C); - fp2_mul(&E.A, &E.A, &t0); - fp_mont_setone(P.z.re); - fp_set(P.z.im, 0); - fp2_copy(&Q.z, &P.z); - fp2_copy(&E.C, &P.z); - - // Compute P-Q - difference_point(&PQ3->PmQ, &P, &Q, &E); - copy_point(&PQ3->P, &P); - copy_point(&PQ3->Q, &Q); -} - -void ec_curve_to_basis_6(ec_basis_t* PQ6, const ec_curve_t* curve){ - - fp2_t x, t0, t1, t2; - ec_point_t P, Q, Q6, P6, R, T, A24, A3; - - // Curve coefficient in the form A24 = (A+2C:4C) - fp2_add(&A24.z, &curve->C, &curve->C); - fp2_add(&A24.x, &curve->A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - - // Curve coefficient in the form A3 = (A+2C:A-2C) - fp2_sub(&A3.z, &A24.x, &A24.z); - fp2_copy(&A3.x, &A24.x); - - fp_mont_setone(x.re); - fp_set(x.im, 0); - - // Find P - while(1){ - fp_add(x.im, x.re, x.im); - - // Check if point is rational - fp2_sqr(&t0, &curve->C); - fp2_mul(&t1, &t0, &x); - fp2_mul(&t2, &curve->A, &curve->C); - fp2_add(&t1, &t1, &t2); - fp2_mul(&t1, &t1, &x); - fp2_add(&t1, &t1, &t0); - fp2_mul(&t1, &t1, &x); - if(fp2_is_square(&t1)){ - fp2_copy(&P.x, &x); - fp_mont_setone(P.z.re); - fp_set(P.z.im, 0); - } - else - continue; - - // Clear non-2 factors and non-3 factors from the order - xMULv2(&P, &P, p_cofactor_for_6fg, (int)P_COFACTOR_FOR_6FG_BITLENGTH, &A24); - - // Check if point has order 2^f*3^g - copy_point(&P6, &P); - for(int i = 0; i < POWER_OF_2 - 1; i++) - xDBLv2(&P6, &P6, &A24); - for(int i = 0; i < POWER_OF_3 - 1; i++) - xTPL(&P6, &P6, &A3); - if(ec_is_zero(&P6)) - continue; - xDBLv2(&T, &P6, &A24); - if (ec_is_zero(&T)) - continue; - xTPL(&T, &P6, &A3); - if (ec_is_zero(&T)) - continue; - break; - } - - // Find Q - while(1){ - fp_add(x.im, x.re, x.im); - - // Check if point is rational - fp2_sqr(&t0, &curve->C); - fp2_mul(&t1, &t0, &x); - fp2_mul(&t2, &curve->A, &curve->C); - fp2_add(&t1, &t1, &t2); - fp2_mul(&t1, &t1, &x); - fp2_add(&t1, &t1, &t0); - fp2_mul(&t1, &t1, &x); - if(fp2_is_square(&t1)){ - fp2_copy(&Q.x, &x); - fp_mont_setone(Q.z.re); - fp_set(Q.z.im, 0); - } - else - continue; - - // Clear non-6 factors from the order - xMULv2(&Q, &Q, p_cofactor_for_6fg, (int)P_COFACTOR_FOR_6FG_BITLENGTH, &A24); - - // Check first if point has order 2^f*3^g - copy_point(&Q6, &Q); - for(int i = 0; i < POWER_OF_2 - 1; i++) - xDBLv2(&Q6, &Q6, &A24); - for(int i = 0; i < POWER_OF_3 - 1; i++) - xTPL(&Q6, &Q6, &A3); - if(ec_is_zero(&Q6)) - continue; - xDBLv2(&T, &Q6, &A24); - if (ec_is_zero(&T)) - continue; - xTPL(&T, &Q6, &A3); - if (ec_is_zero(&T)) - continue; - - // Check if point P is independent from point Q - xTPL(&R, &P6, &A3); - xTPL(&T, &Q6, &A3); - if(is_point_equal(&R, &T)) - continue; - xDBLv2(&R, &P6, &A24); - xDBLv2(&T, &Q6, &A24); - if(is_point_equal(&R, &T)) - continue; - break; - } - - // Normalize points - ec_curve_t E; - fp2_mul(&t0, &P.z, &Q.z); - fp2_mul(&t1, &t0, &curve->C); - fp2_inv(&t1); - fp2_mul(&P.x, &P.x, &t1); - fp2_mul(&Q.x, &Q.x, &t1); - fp2_mul(&E.A, &curve->A, &t1); - fp2_mul(&P.x, &P.x, &Q.z); - fp2_mul(&P.x, &P.x, &curve->C); - fp2_mul(&Q.x, &Q.x, &P.z); - fp2_mul(&Q.x, &Q.x, &curve->C); - fp2_mul(&E.A, &E.A, &t0); - fp_mont_setone(P.z.re); - fp_set(P.z.im, 0); - fp2_copy(&Q.z, &P.z); - fp2_copy(&E.C, &P.z); - - // Compute P-Q - difference_point(&PQ6->PmQ, &P, &Q, &E); - copy_point(&PQ6->P, &P); - copy_point(&PQ6->Q, &Q); -} diff --git a/src/ec/ref/ecx/ec.c b/src/ec/ref/ecx/ec.c deleted file mode 100755 index 5ad80f3..0000000 --- a/src/ec/ref/ecx/ec.c +++ /dev/null @@ -1,1461 +0,0 @@ -#include "curve_extras.h" -#include "tedwards.h" -#include -#include - - -bool ec_is_zero(ec_point_t const* P) -{ - return fp2_is_zero(&P->z); -} - -void ec_init(ec_point_t* P) -{ // Initialize point as identity element (1:0) - fp_t one = {0}; - - memset((digit_t*)P, 0, NWORDS_FIELD*RADIX*4/8); - one[0] = 1; - fp_tomont(P->x.re, one); -} - -void xDBL(ec_point_t* Q, ec_point_t const* P, ec_point_t const* AC) -{ - // This version computes the coefficient values A+2C and 4C on-the-fly - // The curve coefficients are passed via AC = (A:C) - fp2_t t0, t1, t2, t3; - - fp2_add(&t0, &P->x, &P->z); - fp2_sqr(&t0, &t0); - fp2_sub(&t1, &P->x, &P->z); - fp2_sqr(&t1, &t1); - fp2_sub(&t2, &t0, &t1); - fp2_add(&t3, &AC->z, &AC->z); - fp2_mul(&t1, &t1, &t3); - fp2_add(&t1, &t1, &t1); - fp2_mul(&Q->x, &t0, &t1); - fp2_add(&t0, &t3, &AC->x); - fp2_mul(&t0, &t0, &t2); - fp2_add(&t0, &t0, &t1); - fp2_mul(&Q->z, &t0, &t2); -} - -void xDBLv2(ec_point_t* Q, ec_point_t const* P, ec_point_t const* A24) -{ - // This version receives the coefficient value A24 = (A+2C:4C) - fp2_t t0, t1, t2; - - fp2_add(&t0, &P->x, &P->z); - fp2_sqr(&t0, &t0); - fp2_sub(&t1, &P->x, &P->z); - fp2_sqr(&t1, &t1); - fp2_sub(&t2, &t0, &t1); - fp2_mul(&t1, &t1, &A24->z); - fp2_mul(&Q->x, &t0, &t1); - fp2_mul(&t0, &t2, &A24->x); - fp2_add(&t0, &t0, &t1); - fp2_mul(&Q->z, &t0, &t2); -} - -void xADD(ec_point_t* R, ec_point_t const* P, ec_point_t const* Q, ec_point_t const* PQ) -{ - fp2_t t0, t1, t2, t3; - - fp2_add(&t0, &P->x, &P->z); - fp2_sub(&t1, &P->x, &P->z); - fp2_add(&t2, &Q->x, &Q->z); - fp2_sub(&t3, &Q->x, &Q->z); - fp2_mul(&t0, &t0, &t3); - fp2_mul(&t1, &t1, &t2); - fp2_add(&t2, &t0, &t1); - fp2_sub(&t3, &t0, &t1); - fp2_sqr(&t2, &t2); - fp2_sqr(&t3, &t3); - fp2_mul(&t2, &PQ->z, &t2); - fp2_mul(&R->z, &PQ->x, &t3); - fp2_copy(&R->x, &t2); -} - -void xDBLADD(ec_point_t* R, ec_point_t* S, ec_point_t const* P, ec_point_t const* Q, ec_point_t const* PQ, ec_point_t const* A24) -{ - // Requires precomputation of A24 = (A+2C:4C) - fp2_t t0, t1, t2; - - fp2_add(&t0, &P->x, &P->z); - fp2_sub(&t1, &P->x, &P->z); - fp2_sqr(&R->x, &t0); - fp2_sub(&t2, &Q->x, &Q->z); - fp2_add(&S->x, &Q->x, &Q->z); - fp2_mul(&t0, &t0, &t2); - fp2_sqr(&R->z, &t1); - fp2_mul(&t1, &t1, &S->x); - fp2_sub(&t2, &R->x, &R->z); - fp2_mul(&R->z, &R->z, &A24->z); - fp2_mul(&R->x, &R->x, &R->z); - fp2_mul(&S->x, &A24->x, &t2); - fp2_sub(&S->z, &t0, &t1); - fp2_add(&R->z, &R->z, &S->x); - fp2_add(&S->x, &t0, &t1); - fp2_mul(&R->z, &R->z, &t2); - fp2_sqr(&S->z, &S->z); - fp2_sqr(&S->x, &S->x); - fp2_mul(&S->z, &S->z, &PQ->x); - fp2_mul(&S->x, &S->x, &PQ->z); -} - -bool is_point_equal(const ec_point_t* P, const ec_point_t* Q) -{ // Evaluate if two points in Montgomery coordinates (X:Z) are equal - // Returns 1 (true) if P=Q, 0 (false) otherwise - fp2_t t0, t1; - - if ((fp2_is_zero(&P->x) && fp2_is_zero(&P->z)) || (fp2_is_zero(&Q->x) && fp2_is_zero(&Q->z))) { - return fp2_is_zero(&P->x) && fp2_is_zero(&P->z) && fp2_is_zero(&Q->x) && fp2_is_zero(&Q->z); - } - - fp2_mul(&t0, &P->x, &Q->z); - fp2_mul(&t1, &Q->x, &P->z); - fp2_sub(&t0, &t0, &t1); - - return fp2_is_zero(&t0); -} - -void swap_points(ec_point_t* P, ec_point_t* Q, const digit_t option) -{ // Swap points - // If option = 0 then P <- P and Q <- Q, else if option = 0xFF...FF then P <- Q and Q <- P - digit_t temp; - - for (int i = 0; i < NWORDS_FIELD; i++) { - temp = option & (P->x.re[i] ^ Q->x.re[i]); - P->x.re[i] = temp ^ P->x.re[i]; - Q->x.re[i] = temp ^ Q->x.re[i]; - temp = option & (P->x.im[i] ^ Q->x.im[i]); - P->x.im[i] = temp ^ P->x.im[i]; - Q->x.im[i] = temp ^ Q->x.im[i]; - temp = option & (P->z.re[i] ^ Q->z.re[i]); - P->z.re[i] = temp ^ P->z.re[i]; - Q->z.re[i] = temp ^ Q->z.re[i]; - temp = option & (P->z.im[i] ^ Q->z.im[i]); - P->z.im[i] = temp ^ P->z.im[i]; - Q->z.im[i] = temp ^ Q->z.im[i]; - } -} - -void copy_point(ec_point_t* P, ec_point_t const* Q) -{ - fp2_copy(&(P->x), &(Q->x)); - fp2_copy(&(P->z), &(Q->z)); -} - -void ec_normalize(ec_point_t* P){ - fp2_inv(&P->z); - fp2_mul(&P->x, &P->x, &P->z); - fp_mont_setone(P->z.re); - fp_set(P->z.im, 0); -} - -void ec_neg(ec_point_t* res, const ec_point_t* P){ - // DOES NOTHING - copy_point(res, P); -} - -void xMUL(ec_point_t* Q, ec_point_t const* P, digit_t const* k, ec_curve_t const* curve) -{ - ec_point_t R0, R1, A24; - digit_t mask; - unsigned int bit = 0, prevbit = 0, swap; - - fp2_add(&A24.x, &curve->C, &curve->C); // Precomputation of A24=(A+2C:4C) - fp2_add(&A24.z, &A24.x, &A24.x); - fp2_add(&A24.x, &A24.x, &curve->A); - - // R0 <- (1:0), R1 <- P - ec_init(&R0); - fp2_copy(&R1.x, &P->x); - fp2_copy(&R1.z, &P->z); - - // Main loop - for (int i = BITS-1; i >= 0; i--) { - bit = (k[i >> LOG2RADIX] >> (i & (RADIX-1))) & 1; - swap = bit ^ prevbit; - prevbit = bit; - mask = 0 - (digit_t)swap; - - swap_points(&R0, &R1, mask); - xDBLADD(&R0, &R1, &R0, &R1, P, &A24); - } - swap = 0 ^ prevbit; - mask = 0 - (digit_t)swap; - swap_points(&R0, &R1, mask); - - fp2_copy(&Q->x, &R0.x); - fp2_copy(&Q->z, &R0.z); -} - -void xMULv2(ec_point_t* Q, ec_point_t const* P, digit_t const* k, const int kbits, ec_point_t const* A24) -{ - // This version receives the coefficient value A24 = (A+2C:4C) - ec_point_t R0, R1; - digit_t mask; - unsigned int bit = 0, prevbit = 0, swap; - - // R0 <- (1:0), R1 <- P - ec_init(&R0); - fp2_copy(&R1.x, &P->x); - fp2_copy(&R1.z, &P->z); - - // Main loop - for (int i = kbits-1; i >= 0; i--) { - bit = (k[i >> LOG2RADIX] >> (i & (RADIX-1))) & 1; - swap = bit ^ prevbit; - prevbit = bit; - mask = 0 - (digit_t)swap; - - swap_points(&R0, &R1, mask); - xDBLADD(&R0, &R1, &R0, &R1, P, A24); - } - swap = 0 ^ prevbit; - mask = 0 - (digit_t)swap; - swap_points(&R0, &R1, mask); - - fp2_copy(&Q->x, &R0.x); - fp2_copy(&Q->z, &R0.z); -} - -static void mp_add(digit_t* c, const digit_t* a, const digit_t* b, const unsigned int nwords) -{ // Multiprecision addition - unsigned int i, carry = 0; - - for (i = 0; i < nwords; i++) { - ADDC(c[i], carry, a[i], b[i], carry); - } -} - -static void mp_sub(digit_t* c, digit_t const* a, digit_t const* b, const unsigned int nwords) -{ // Multiprecision subtraction, assuming a > b - unsigned int i, borrow = 0; - - for (i = 0; i < nwords; i++) { - SUBC(c[i], borrow, a[i], b[i], borrow); - } -} - -void select_ct(digit_t* c, const digit_t* a, const digit_t* b, const digit_t mask, const int nwords) -{ // Select c <- a if mask = 0, select c <- b if mask = 1...1 - - for (int i = 0; i < nwords; i++) { - c[i] = ((a[i] ^ b[i]) & mask) ^ a[i]; - } -} - -void swap_ct(digit_t* a, digit_t* b, const digit_t option, const int nwords) -{ // Swap entries - // If option = 0 then P <- P and Q <- Q, else if option = 0xFF...FF then a <- b and b <- a - digit_t temp; - - for (int i = 0; i < nwords; i++) { - temp = option & (a[i] ^ b[i]); - a[i] = temp ^ a[i]; - b[i] = temp ^ b[i]; - } -} - -// Compute S = k*P + l*Q, with PQ = P+Q -void xDBLMUL(ec_point_t* S, ec_point_t const* P, digit_t const* k, ec_point_t const* Q, digit_t const* l, ec_point_t const* PQ, ec_curve_t const* curve) -{ - int i; - digit_t evens, mevens, bitk0, bitl0, maskk, maskl, temp, bs1_ip1, bs2_ip1, bs1_i, bs2_i, h; - digit_t sigma[2] = {0}, pre_sigma = 0; - digit_t k_t[NWORDS_ORDER], l_t[NWORDS_ORDER], one[NWORDS_ORDER] = {0}, r[2*BITS] = {0}; - ec_point_t A24, DIFF1a, DIFF1b, DIFF2a, DIFF2b, R[3] = {0}, T[3]; - - // Derive sigma according to parity - bitk0 = (k[0] & 1); - bitl0 = (l[0] & 1); - maskk = 0 - bitk0; // Parity masks: 0 if even, otherwise 1...1 - maskl = 0 - bitl0; - sigma[0] = (bitk0 ^ 1); - sigma[1] = (bitl0 ^ 1); - evens = sigma[0] + sigma[1]; // Count number of even scalars - mevens = 0 - (evens & 1); // Mask mevens <- 0 if # even scalars = 0 or 2, otherwise mevens = 1...1 - - // If k and l are both even or both odd, pick sigma = (0,1) - sigma[0] = (sigma[0] & mevens); - sigma[1] = (sigma[1] & mevens) | (1 & ~mevens); - - // Convert even scalars to odd - one[0] = 1; - mp_sub(k_t, k, one, NWORDS_ORDER); - mp_sub(l_t, l, one, NWORDS_ORDER); - select_ct(k_t, k_t, k, maskk, NWORDS_ORDER); - select_ct(l_t, l_t, l, maskl, NWORDS_ORDER); - - // Scalar recoding - for (i = 0; i < BITS; i++) { - // If sigma[0] = 1 swap k_t and l_t - maskk = 0 - (sigma[0] ^ pre_sigma); - swap_ct(k_t, l_t, maskk, NWORDS_ORDER); - - if (i == BITS-1) { - bs1_ip1 = 0; - bs2_ip1 = 0; - } else { - bs1_ip1 = mp_shiftr(k_t, 1, NWORDS_ORDER); - bs2_ip1 = mp_shiftr(l_t, 1, NWORDS_ORDER); - } - bs1_i = k_t[0] & 1; - bs2_i = l_t[0] & 1; - - r[2*i] = bs1_i ^ bs1_ip1; - r[2*i+1] = bs2_i ^ bs2_ip1; - - // Revert sigma if second bit, r_(2i+1), is 1 - pre_sigma = sigma[0]; - maskk = 0 - r[2*i+1]; - select_ct(&temp, &sigma[0], &sigma[1], maskk, 1); - select_ct(&sigma[1], &sigma[1], &sigma[0], maskk, 1); - sigma[0] = temp; - } - - // Point initialization - ec_init(&R[0]); - maskk = 0 - sigma[0]; - select_ct((digit_t*)&R[1], (digit_t*)P, (digit_t*)Q, maskk, 4*NWORDS_FIELD); - select_ct((digit_t*)&R[2], (digit_t*)Q, (digit_t*)P, maskk, 4*NWORDS_FIELD); - fp2_copy(&DIFF1a.x, &R[1].x); - fp2_copy(&DIFF1a.z, &R[1].z); - fp2_copy(&DIFF1b.x, &R[2].x); - fp2_copy(&DIFF1b.z, &R[2].z); - - // Initialize DIFF2a <- P+Q, DIFF2b <- P-Q - xADD(&R[2], &R[1], &R[2], PQ); - fp2_copy(&DIFF2a.x, &R[2].x); - fp2_copy(&DIFF2a.z, &R[2].z); - fp2_copy(&DIFF2b.x, &PQ->x); - fp2_copy(&DIFF2b.z, &PQ->z); - - fp2_add(&A24.x, &curve->C, &curve->C); // Precomputation of A24=(A+2C:4C) - fp2_add(&A24.z, &A24.x, &A24.x); - fp2_add(&A24.x, &A24.x, &curve->A); - - // Main loop - for (i = BITS-1; i>=0; i--) { - h = r[2*i] + r[2*i+1]; // in {0, 1, 2} - maskk = 0 - (h & 1); - select_ct((digit_t*)&T[0], (digit_t*)&R[0], (digit_t*)&R[1], maskk, 4*NWORDS_FIELD); - maskk = 0 - (h >> 1); - select_ct((digit_t*)&T[0], (digit_t*)&T[0], (digit_t*)&R[2], maskk, 4*NWORDS_FIELD); - xDBLv2(&T[0], &T[0], &A24); - - maskk = 0 - r[2*i+1]; // in {0, 1} - select_ct((digit_t*)&T[1], (digit_t*)&R[0], (digit_t*)&R[1], maskk, 4*NWORDS_FIELD); - select_ct((digit_t*)&T[2], (digit_t*)&R[1], (digit_t*)&R[2], maskk, 4*NWORDS_FIELD); - swap_points(&DIFF1a, &DIFF1b, maskk); - xADD(&T[1], &T[1], &T[2], &DIFF1a); - xADD(&T[2], &R[0], &R[2], &DIFF2a); - - // If hw (mod 2) = 1 then swap DIFF2a and DIFF2b - maskk = 0 - (h & 1); - swap_points(&DIFF2a, &DIFF2b, maskk); - - // R <- T - memcpy((digit_t*)&R[0], (digit_t*)&T[0], NWORDS_FIELD*RADIX*4/8); - memcpy((digit_t*)&R[1], (digit_t*)&T[1], NWORDS_FIELD*RADIX*4/8); - memcpy((digit_t*)&R[2], (digit_t*)&T[2], NWORDS_FIELD*RADIX*4/8); - } - - // Output R[evens] - select_ct((digit_t*)S, (digit_t*)&R[0], (digit_t*)&R[1], mevens, 4*NWORDS_FIELD); - maskk = 0 - (bitk0 & bitl0); - select_ct((digit_t*)S, (digit_t*)S, (digit_t*)&R[2], maskk, 4*NWORDS_FIELD); -} - -void ec_ladder3pt(ec_point_t *R, fp_t const m, ec_point_t const *P, ec_point_t const *Q, ec_point_t const *PQ, ec_curve_t const *A) -{ - // Curve constant in the form A24=(A+2C:4C) - ec_point_t A24; - fp2_add(&A24.z, &A->C, &A->C); - fp2_add(&A24.x, &A->A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - - ec_point_t X0, X1, X2; - copy_point(&X0, Q); - copy_point(&X1, P); - copy_point(&X2, PQ); - - int i,j; - uint64_t t; - for (i = 0; i < NWORDS_FIELD; i++) - { - t = 1; - for (j = 0 ; j < 64; j++) - { - swap_points(&X1, &X2, -((t & m[i]) == 0)); - xDBLADD(&X0, &X1, &X0, &X1, &X2, &A24); - swap_points(&X1, &X2, -((t & m[i]) == 0)); - t <<= 1; - }; - }; - copy_point(R, &X1); -} - -void ec_j_inv(fp2_t* j_inv, const ec_curve_t* curve){ - /* j-invariant computation for montgommery coefficient A2=(A+2C:4C) */ - fp2_t t0, t1; - - fp2_sqr(&t1, &curve->C); - fp2_sqr(j_inv, &curve->A); - fp2_add(&t0, &t1, &t1); - fp2_sub(&t0, j_inv, &t0); - fp2_sub(&t0, &t0, &t1); - fp2_sub(j_inv, &t0, &t1); - fp2_sqr(&t1, &t1); - fp2_mul(j_inv, j_inv, &t1); - fp2_add(&t0, &t0, &t0); - fp2_add(&t0, &t0, &t0); - fp2_sqr(&t1, &t0); - fp2_mul(&t0, &t0, &t1); - fp2_add(&t0, &t0, &t0); - fp2_add(&t0, &t0, &t0); - fp2_inv(j_inv); - fp2_mul(j_inv, &t0, j_inv); -} - -static void jac_init(jac_point_t* P) -{ // Initialize Montgomery in Jacobian coordinates as identity element (0:1:0) - fp_t one = {0}; - - memset((digit_t*)P, 0, NWORDS_FIELD*RADIX*6/8); - one[0] = 1; - fp_tomont(P->y.re, one); -} - -static bool is_jac_equal(const jac_point_t* P, const jac_point_t* Q) -{ // Evaluate if two points in Jacobian coordinates (X:Y:Z) are equal - // Returns 1 (true) if P=Q, 0 (false) otherwise - fp2_t t0, t1, t2, t3; - - fp2_sqr(&t0, &Q->z); - fp2_mul(&t2, &P->x, &t0); // x1*z2^2 - fp2_sqr(&t1, &P->z); - fp2_mul(&t3, &Q->x, &t1); // x2*z1^2 - fp2_sub(&t2, &t2, &t3); - - fp2_mul(&t0, &t0, &Q->z); - fp2_mul(&t0, &P->y, &t0); // y1*z2^3 - fp2_mul(&t1, &t1, &P->z); - fp2_mul(&t1, &Q->y, &t1); // y2*z1^3 - fp2_sub(&t0, &t0, &t1); - - return fp2_is_zero(&t0) && fp2_is_zero(&t2); -} - -static bool is_jac_xz_equal(const jac_point_t* P, const ec_point_t* Q) -{ // Evaluate if point P in Jacobian coordinates is equal to Q in homogeneous projective coordinates (X:Z) - // Comparison is up to sign (only compares X and Z coordinates) - // Returns 1 (true) if P=Q, 0 (false) otherwise - fp2_t t0, t1; - - fp2_mul(&t0, &P->x, &Q->z); // x1*z2 - fp2_sqr(&t1, &P->z); - fp2_mul(&t1, &Q->x, &t1); // x2*z1^2 - fp2_sub(&t0, &t0, &t1); - - return fp2_is_zero(&t0); -} - -static void copy_jac_point(jac_point_t* P, jac_point_t const* Q) -{ - fp2_copy(&(P->x), &(Q->x)); - fp2_copy(&(P->y), &(Q->y)); - fp2_copy(&(P->z), &(Q->z)); -} - -static void jac_neg(jac_point_t* Q, jac_point_t const* P) -{ - fp2_copy(&Q->x, &P->x); - fp2_neg(&Q->y, &P->y); - fp2_copy(&Q->z, &P->z); -} - -void DBL(jac_point_t* Q, jac_point_t const* P, ec_curve_t const* AC) -{ // Doubling on a Montgomery curve, representation in Jacobian coordinates (X:Y:Z) corresponding to (X/Z^2,Y/Z^3) - // This version receives the coefficient value A - fp2_t t0, t1, t2, t3; - - if (fp2_is_zero(&P->x) && fp2_is_zero(&P->z)) { - jac_init(Q); - return; - } - - fp2_sqr(&t0, &P->x); // t0 = x1^2 - fp2_add(&t1, &t0, &t0); - fp2_add(&t0, &t0, &t1); // t0 = 3x1^2 - fp2_sqr(&t1, &P->z); // t1 = z1^2 - fp2_mul(&t2, &P->x, &AC->A); - fp2_add(&t2, &t2, &t2); // t2 = 2Ax1 - fp2_add(&t2, &t1, &t2); // t2 = 2Ax1+z1^2 - fp2_mul(&t2, &t1, &t2); // t2 = z1^2(2Ax1+z1^2) - fp2_add(&t2, &t0, &t2); // t2 = alpha = 3x1^2 + z1^2(2Ax1+z1^2) - fp2_mul(&Q->z, &P->y, &P->z); - fp2_add(&Q->z, &Q->z, &Q->z); // z2 = 2y1z1 - fp2_sqr(&t0, &Q->z); - fp2_mul(&t0, &t0, &AC->A); // t0 = 4Ay1^2z1^2 - fp2_sqr(&t1, &P->y); - fp2_add(&t1, &t1, &t1); // t1 = 2y1^2 - fp2_add(&t3, &P->x, &P->x); // t3 = 2x1 - fp2_mul(&t3, &t1, &t3); // t3 = 4x1y1^2 - fp2_sqr(&Q->x, &t2); // x2 = alpha^2 - fp2_sub(&Q->x, &Q->x, &t0); // x2 = alpha^2 - 4Ay1^2z1^2 - fp2_sub(&Q->x, &Q->x, &t3); - fp2_sub(&Q->x, &Q->x, &t3); // x2 = alpha^2 - 4Ay1^2z1^2 - 8x1y1^2 - fp2_sub(&Q->y, &t3, &Q->x); // y2 = 4x1y1^2 - x2 - fp2_mul(&Q->y, &Q->y, &t2); // y2 = alpha(4x1y1^2 - x2) - fp2_sqr(&t1, &t1); // t1 = 4y1^4 - fp2_sub(&Q->y, &Q->y, &t1); - fp2_sub(&Q->y, &Q->y, &t1); // y2 = alpha(4x1y1^2 - x2) - 8y1^4 -} - -void ADD(jac_point_t* R, jac_point_t const* P, jac_point_t const* Q, ec_curve_t const* AC) -{ // Addition on a Montgomery curve, representation in Jacobian coordinates (X:Y:Z) corresponding to (X/Z^2,Y/Z^3) - // This version receives the coefficient value A - fp2_t t0, t1, t2, t3, t4, t5, t6; - jac_point_t T; - - if (is_jac_equal(P, Q)) { - DBL(R, P, AC); - return; - } - jac_neg(&T, P); - if (is_jac_equal(&T, Q)) { - jac_init(R); - return; - } - if (fp2_is_zero(&P->x) && fp2_is_zero(&P->z)) { - copy_jac_point(R, Q); - return; - } else if (fp2_is_zero(&Q->x) && fp2_is_zero(&Q->z)) { - copy_jac_point(R, P); - return; - } - - fp2_sqr(&t0, &P->z); // t0 = z1^2 - fp2_mul(&t1, &t0, &P->z); // t1 = z1^3 - fp2_sqr(&t2, &Q->z); // t2 = z2^2 - fp2_mul(&t3, &t2, &Q->z); // t3 = z2^3 - fp2_mul(&t1, &t1, &Q->y); // t1 = y2z1^3 - fp2_mul(&t3, &t3, &P->y); // t3 = y1z2^3 - fp2_sub(&t1, &t1, &t3); // t1 = lambda1 = y2z1^3 - y1z2^3 - fp2_mul(&t0, &t0, &Q->x); // t0 = x2z1^2 - fp2_mul(&t2, &t2, &P->x); // t2 = x1z2^2 - fp2_sub(&t4, &t0, &t2); // t4 = lambda3 = x2z1^2 - x1z2^2 - fp2_add(&t0, &t0, &t2); // t0 = lambda2 = x2z1^2 + x1z2^2 - fp2_mul(&t5, &P->z, &Q->z); // t5 = z1z2 - fp2_mul(&R->z, &t4, &t5); // z3 = z1z2*lambda3 - fp2_sqr(&t5, &t5); // t5 = z1^2z2^2 - fp2_mul(&t5, &AC->A, &t5); // t5 = Az1^2z2^2 - fp2_add(&t0, &t0, &t5); // t0 = Az1^2z2^2 + lambda2 - fp2_sqr(&t6, &t4); // t6 = lambda3^2 - fp2_mul(&t5, &t0, &t6); // t5 = lambda3^2(Az1^2z2^2 + lambda2) - fp2_sqr(&R->x, &t1); // x3 = lambda1^2 - fp2_sub(&R->x, &R->x, &t5); // x3 = lambda1^2 - lambda3^2(Az1^2z2^2 + lambda2) - fp2_mul(&t3, &t3, &t4); // t3 = y1z2^3*lambda3 - fp2_mul(&t3, &t3, &t6); // t3 = y1z2^3*lambda3^3 - fp2_mul(&t2, &t2, &t6); // t2 = x1z2^2*lambda3^2 - fp2_sub(&R->y, &t2, &R->x); // y3 = x1z2^2*lambda3^2 - x3 - fp2_mul(&R->y, &R->y, &t1); // y3 = lambda1(x1z2^2*lambda3^2 - x3) - fp2_sub(&R->y, &R->y, &t3); // y3 = lambda1(x1z2^2*lambda3^2 - x3) - y1z2^3*lambda3^3 -} - -void TPL(jac_point_t* Q, jac_point_t const* P, ec_curve_t const* AC) -{ // Naive tripling on a Montgomery curve, representation in Jacobian coordinates (X:Y:Z) corresponding to (X/Z^2,Y/Z^3) - // This version receives the coefficient value A - jac_point_t R; - - DBL(&R, P, AC); - ADD(Q, &R, P, AC); -} - -void recover_y(fp2_t* y, fp2_t const* Px, ec_curve_t const* curve) -{ // Recover y-coordinate of a point on the Montgomery curve y^2 = x^3 + Ax^2 + x - fp2_t t0; - - fp2_sqr(&t0, Px); - fp2_mul(y, &t0, &curve->A); // Ax^2 - fp2_add(y, y, Px); // Ax^2 + x - fp2_mul(&t0, &t0, Px); - fp2_add(y, y, &t0); // x^3 + Ax^2 + x - fp2_sqrt(y); - - //fp2_t t0, t1; - - //fp2_sqr(&t0, &P->x); - //fp2_sqr(&t1, &P->z); - //fp2_mul(y, &t0, &t1); - //fp2_mul(y, y, &curve->A); // AX^2Z^2 - //fp2_mul(&t0, &t0, &P->x); - //fp2_add(y, y, &t0); // X^3 + AX^2Z^2 - //fp2_mul(&t0, &t1, &P->z); - //fp2_sqr(&t1, &t0); - //fp2_mul(&t1, &t1, &P->x); - //fp2_add(y, y, &t1); // X^3 + AX^2Z^2 + XZ^6 - //fp2_sqrt(y); -} - - -static int mp_compare(digit_t* a, digit_t* b, unsigned int nwords) -{ // Multiprecision comparison, a=b? : (1) a>b, (0) a=b, (-1) a= 0; i--) { - if (a[i] > b[i]) return 1; - else if (a[i] < b[i]) return -1; - } - return 0; -} - -static bool mp_is_zero(const digit_t* a, unsigned int nwords) -{ // Is a multiprecision element zero? - // Returns 1 (true) if a=0, 0 (false) otherwise - digit_t r = 0; - - for (unsigned int i = 0; i < nwords; i++) - r |= a[i] ^ 0; - - return (bool)is_digit_zero_ct(r); -} - -void DBLMUL(jac_point_t* R, const jac_point_t* P, const digit_t k, const jac_point_t* Q, const digit_t l, const ec_curve_t* curve) -{ // Double-scalar multiplication R <- k*P + l*Q, fixed for 64-bit scalars - digit_t k_t, l_t; - jac_point_t PQ; - - ADD(&PQ, P, Q, curve); - jac_init(R); - - for (int i = 0; i < 64; i++) { - k_t = k >> (63-i); - k_t &= 0x01; - l_t = l >> (63-i); - l_t &= 0x01; - DBL(R, R, curve); - if (k_t == 1 && l_t == 1) { - ADD(R, R, &PQ, curve); - } else if (k_t == 1) { - ADD(R, R, P, curve); - } else if (l_t == 1) { - ADD(R, R, Q, curve); - } - } -} - -#define SCALAR_BITS 128 //// TODO: this could be defined by level - -void DBLMUL2(jac_point_t* R, const jac_point_t* P, const digit_t* k, const jac_point_t* Q, const digit_t* l, const ec_curve_t* curve) -{ // Double-scalar multiplication R <- k*P + l*Q, fixed for 128-bit scalars - digit_t k_t[2], l_t[2]; - jac_point_t PQ; - - ADD(&PQ, P, Q, curve); - jac_init(R); - - for (int i = 0; i < SCALAR_BITS-64; i++) { - k_t[1] = k[1] >> (SCALAR_BITS-64-1-i); - k_t[1] &= 0x01; - l_t[1] = l[1] >> (SCALAR_BITS-64-1-i); - l_t[1] &= 0x01; - DBL(R, R, curve); - if (k_t[1] == 1 && l_t[1] == 1) { - ADD(R, R, &PQ, curve); - } else if (k_t[1] == 1) { - ADD(R, R, P, curve); - } else if (l_t[1] == 1) { - ADD(R, R, Q, curve); - } - } - - for (int i = 0; i < 64; i++) { - k_t[0] = k[0] >> (64-1-i); - k_t[0] &= 0x01; - l_t[0] = l[0] >> (64-1-i); - l_t[0] &= 0x01; - DBL(R, R, curve); - if (k_t[0] == 1 && l_t[0] == 1) { - ADD(R, R, &PQ, curve); - } else if (k_t[0] == 1) { - ADD(R, R, P, curve); - } else if (l_t[0] == 1) { - ADD(R, R, Q, curve); - } - } -} - -static void mp_mul2(digit_t* c, const digit_t* a, const digit_t* b) -{ // Multiprecision multiplication fixed to two-digit operands - unsigned int carry = 0; - digit_t t0[2], t1[2], t2[2]; - - MUL(t0, a[0], b[0]); - MUL(t1, a[0], b[1]); - ADDC(t0[1], carry, t0[1], t1[0], carry); - ADDC(t1[1], carry, 0, t1[1], carry); - MUL(t2, a[1], b[1]); - ADDC(t2[0], carry, t2[0], t1[1], carry); - ADDC(t2[1], carry, 0, t2[1], carry); - c[0] = t0[0]; - c[1] = t0[1]; - c[2] = t2[0]; - c[3] = t2[1]; -} - -static void ec_dlog_2_step(digit_t* x, digit_t* y, const jac_point_t* R, const int f, const int B, const jac_point_t* Pe2, const jac_point_t* Qe2, const jac_point_t* PQe2, const ec_curve_t* curve) -{ // Based on Montgomery formulas using Jacobian coordinates - int i, j; - digit_t value = 1; - jac_point_t P, Q, TT, SS, PQp, T[(POWER_OF_2-1)/2], Re[(POWER_OF_2-1)/2]; // Storage could be reduced to e1 points - - *x = 0; - *y = 0; - - copy_jac_point(&P, &Pe2[f-1]); - copy_jac_point(&Q, &Qe2[f-1]); - copy_jac_point(&Re[f-1], R); - - for (i = 0; i < (f-1); i++) { - DBL(&Re[f-i-2], &Re[f-i-1], curve); - } - ADD(&PQp, &P, &Q, curve); - - // Unrolling the first two iterations - if (is_jac_equal(&Pe2[0], &Re[0])) { - *x += 1; - copy_jac_point(&T[0], &P); - for (j = 3; j <= B; j++) { - copy_jac_point(&T[j-1], &Pe2[j-1]); - } - jac_neg(&TT, &Pe2[1]); - ADD(&Re[0], &Re[1], &TT, curve); - } else if (is_jac_equal(&Qe2[0], &Re[0])) { - *y += 1; - copy_jac_point(&T[0], &Q); - for (j = 3; j <= B; j++) { - copy_jac_point(&T[j-1], &Qe2[j-1]); - } - jac_neg(&TT, &Qe2[1]); - ADD(&Re[0], &Re[1], &TT, curve); - } else if (is_jac_equal(&PQe2[0], &Re[0])) { - *x += 1; - *y += 1; - copy_jac_point(&T[0], &PQp); - for (j = 3; j <= B; j++) { - copy_jac_point(&T[j-1], &PQe2[j-1]); - } - jac_neg(&TT, &PQe2[1]); - ADD(&Re[0], &Re[1], &TT, curve); - } else { - jac_init(&T[0]); - for (j = 3; j <= B; j++) { - jac_init(&T[j-1]); - } - copy_jac_point(&Re[0], &Re[1]); - } - - // Unrolling iterations 3-B - for (i = 3; i <= B; i++) { - value <<= 1; - jac_neg(&TT, &T[i-1]); - ADD(&TT, &Re[i-1], &TT, curve); // TT <- Re[i-1]-T[i-1] - if (is_jac_equal(&Pe2[0], &Re[0])) { - *x += value; - ADD(&T[0], &T[0], &Pe2[f-i+1], curve); - for (j = i+1; j <= B; j++) { - ADD(&T[j-1], &T[j-1], &Pe2[j-i+1], curve); - } - jac_neg(&SS, &Pe2[1]); - ADD(&Re[0], &TT, &SS, curve); - } else if (is_jac_equal(&Qe2[0], &Re[0])) { - *y += value; - ADD(&T[0], &T[0], &Qe2[f-i+1], curve); - for (j = i+1; j <= B; j++) { - ADD(&T[j-1], &T[j-1], &Qe2[j-i+1], curve); - } - jac_neg(&SS, &Qe2[1]); - ADD(&Re[0], &TT, &SS, curve); - } else if (is_jac_equal(&PQe2[0], &Re[0])) { - *x += value; - *y += value; - ADD(&T[0], &T[0], &PQe2[f-i+1], curve); - for (j = i+1; j <= B; j++) { - ADD(&T[j-1], &T[j-1], &PQe2[j-i+1], curve); - } - jac_neg(&SS, &PQe2[1]); - ADD(&Re[0], &TT, &SS, curve); - } else { - copy_jac_point(&Re[0], &TT); - } - } - - // Main Loop - for (i = B; i < f; i++) { - value <<= 1; - if (is_jac_equal(&Pe2[0], &Re[0])) { - *x += value; - ADD(&T[0], &T[0], &Pe2[f-i], curve); - } else if (is_jac_equal(&Qe2[0], &Re[0])) { - *y += value; - ADD(&T[0], &T[0], &Qe2[f-i], curve); - } else if (is_jac_equal(&PQe2[0], &Re[0])) { - *x += value; - *y += value; - ADD(&T[0], &T[0], &PQe2[f-i], curve); - } - jac_neg(&TT, &T[0]); - ADD(&Re[0], R, &TT, curve); // TT <- R-T[0] - for (j = 0; j < (f-i-1); j++) { - DBL(&Re[0], &Re[0], curve); - } - } - value <<= 1; - if (is_jac_equal(&Pe2[0], &Re[0])) { - *x += value; - } else if (is_jac_equal(&Qe2[0], &Re[0])) { - *y += value; - } else if (is_jac_equal(&PQe2[0], &Re[0])) { - *x += value; - *y += value; - } -} - -void ec_dlog_2(digit_t* scalarP, digit_t* scalarQ, const ec_basis_t* PQ2, const ec_point_t* R, const ec_curve_t* curve) -{ // Optimized implementation based on Montgomery formulas using Jacobian coordinates - int i; - digit_t w0 = 0, z0 = 0, x0 = 0, y0 = 0, x1 = 0, y1 = 0, w1 = 0, z1 = 0, e, e1, f, f1, f2, f2div2, f22, w, z; - digit_t fp2[NWORDS_ORDER] = {0}, xx[NWORDS_ORDER] = {0}, yy[NWORDS_ORDER] = {0}, ww[NWORDS_ORDER] = {0}, zz[NWORDS_ORDER] = {0}; - digit_t f22_p[NWORDS_ORDER] = {0}, w_p[NWORDS_ORDER] = {0}, z_p[NWORDS_ORDER] = {0}, x0_p[NWORDS_ORDER] = {0}, y0_p[NWORDS_ORDER] = {0}, w0_p[NWORDS_ORDER] = {0}, z0_p[NWORDS_ORDER] = {0}; - jac_point_t P, Q, RR, TT, R2r0, R2r, R2r1; - jac_point_t Pe2[POWER_OF_2], Qe2[POWER_OF_2], PQe2[POWER_OF_2]; - ec_point_t Rnorm; - ec_curve_t curvenorm; - ec_basis_t PQ2norm; - - f = POWER_OF_2; - memset(scalarP, 0, NWORDS_ORDER*RADIX/8); - memset(scalarQ, 0, NWORDS_ORDER*RADIX/8); - - // Normalize R,PQ2,curve - fp2_t D; - fp2_mul(&D, &PQ2->P.z, &PQ2->Q.z); - fp2_mul(&D, &D, &PQ2->PmQ.z); - fp2_mul(&D, &D, &R->z); - fp2_mul(&D, &D, &curve->C); - fp2_inv(&D); - fp_mont_setone(Rnorm.z.re); - fp_set(Rnorm.z.im, 0); - fp2_copy(&PQ2norm.P.z, &Rnorm.z); - fp2_copy(&PQ2norm.Q.z, &Rnorm.z); - fp2_copy(&PQ2norm.PmQ.z, &Rnorm.z); - fp2_copy(&curvenorm.C, &Rnorm.z); - fp2_mul(&Rnorm.x, &R->x, &D); - fp2_mul(&Rnorm.x, &Rnorm.x, &PQ2->P.z); - fp2_mul(&Rnorm.x, &Rnorm.x, &PQ2->Q.z); - fp2_mul(&Rnorm.x, &Rnorm.x, &PQ2->PmQ.z); - fp2_mul(&Rnorm.x, &Rnorm.x, &curve->C); - fp2_mul(&PQ2norm.P.x, &PQ2->P.x, &D); - fp2_mul(&PQ2norm.P.x, &PQ2norm.P.x, &R->z); - fp2_mul(&PQ2norm.P.x, &PQ2norm.P.x, &PQ2->Q.z); - fp2_mul(&PQ2norm.P.x, &PQ2norm.P.x, &PQ2->PmQ.z); - fp2_mul(&PQ2norm.P.x, &PQ2norm.P.x, &curve->C); - fp2_mul(&PQ2norm.Q.x, &PQ2->Q.x, &D); - fp2_mul(&PQ2norm.Q.x, &PQ2norm.Q.x, &R->z); - fp2_mul(&PQ2norm.Q.x, &PQ2norm.Q.x, &PQ2->P.z); - fp2_mul(&PQ2norm.Q.x, &PQ2norm.Q.x, &PQ2->PmQ.z); - fp2_mul(&PQ2norm.Q.x, &PQ2norm.Q.x, &curve->C); - fp2_mul(&PQ2norm.PmQ.x, &PQ2->PmQ.x, &D); - fp2_mul(&PQ2norm.PmQ.x, &PQ2norm.PmQ.x, &R->z); - fp2_mul(&PQ2norm.PmQ.x, &PQ2norm.PmQ.x, &PQ2->P.z); - fp2_mul(&PQ2norm.PmQ.x, &PQ2norm.PmQ.x, &PQ2->Q.z); - fp2_mul(&PQ2norm.PmQ.x, &PQ2norm.PmQ.x, &curve->C); - fp2_mul(&curvenorm.A, &curve->A, &D); - fp2_mul(&curvenorm.A, &curvenorm.A, &R->z); - fp2_mul(&curvenorm.A, &curvenorm.A, &PQ2->P.z); - fp2_mul(&curvenorm.A, &curvenorm.A, &PQ2->Q.z); - fp2_mul(&curvenorm.A, &curvenorm.A, &PQ2->PmQ.z); - - recover_y(&P.y, &PQ2norm.P.x, &curvenorm); - fp2_copy(&P.x, &PQ2norm.P.x); - fp2_copy(&P.z, &PQ2norm.P.z); - recover_y(&Q.y, &PQ2norm.Q.x, &curvenorm); // TODO: THIS SECOND SQRT CAN BE ELIMINATED - fp2_copy(&Q.x, &PQ2norm.Q.x); - fp2_copy(&Q.z, &PQ2norm.Q.z); - recover_y(&RR.y, &Rnorm.x, &curvenorm); - fp2_copy(&RR.x, &Rnorm.x); - fp2_copy(&RR.z, &Rnorm.z); - - jac_neg(&TT, &Q); - ADD(&TT, &P, &TT, &curvenorm); - if (!is_jac_xz_equal(&TT, &PQ2norm.PmQ)) - jac_neg(&Q, &Q); - - // Computing torsion-2^f points, multiples of P, Q and P+Q - copy_jac_point(&Pe2[POWER_OF_2-1], &P); - copy_jac_point(&Qe2[POWER_OF_2-1], &Q); - ADD(&PQe2[POWER_OF_2-1], &P, &Q, &curvenorm); // P+Q - - for (i = 0; i < (POWER_OF_2-1); i++) { - DBL(&Pe2[POWER_OF_2-i-2], &Pe2[POWER_OF_2-i-1], &curvenorm); - DBL(&Qe2[POWER_OF_2-i-2], &Qe2[POWER_OF_2-i-1], &curvenorm); - DBL(&PQe2[POWER_OF_2-i-2], &PQe2[POWER_OF_2-i-1], &curvenorm); - } - - e = f; - mp_shiftr(&e, 1, 1); - f1 = f-e; - e1 = f1; - mp_shiftr(&e1, 1, 1); - f2 = f1-e1; - - copy_jac_point(&TT, &RR); - for (i = 0; i < (f-f2); i++) { - DBL(&TT, &TT, &curvenorm); - } - // w0, z0 <- dlog2(2^(f-f2)*R, f2, f2 div 2) - f2div2 = f2; - mp_shiftr(&f2div2, 1, 1); - ec_dlog_2_step(&w0, &z0, &TT, (int)f2, (int)f2div2, &Pe2[0], &Qe2[0], &PQe2[0], &curvenorm); - - // R2r0 <- 2^e*R2 - (w0*Pe2[f1-1] + z0*Qe2[f1-1]) - copy_jac_point(&TT, &RR); - for (i = 0; i < e; i++) { - DBL(&TT, &TT, &curvenorm); - } - DBLMUL(&R2r0, &Pe2[f1-1], w0, &Qe2[f1-1], z0, &curvenorm); - jac_neg(&R2r0, &R2r0); - ADD(&R2r0, &TT, &R2r0, &curvenorm); - ec_dlog_2_step(&x0, &y0, &R2r0, (int)e1, (int)f2div2, &Pe2[0], &Qe2[0], &PQe2[0], &curvenorm); - - // w <- w0 + 2^f2 * x0, z <- z0 + 2^f2 * y0 - //f22 = 1; - //mp_shiftl(&f22, (unsigned int)f2, 1); - //w = w0 + f22 * x0; - //z = z0 + f22 * y0; - f22_p[0] = 1; - mp_shiftl(&f22_p[0], (unsigned int)f2, NWORDS_ORDER); - x0_p[0] = x0; - y0_p[0] = y0; - w0_p[0] = w0; - z0_p[0] = z0; - mp_mul2(&x0_p[0], &f22_p[0], &x0_p[0]); - mp_add(&w_p[0], &w0_p[0], &x0_p[0], NWORDS_ORDER); - mp_mul2(&y0_p[0], &f22_p[0], &y0_p[0]); - mp_add(&z_p[0], &z0_p[0], &y0_p[0], NWORDS_ORDER); - - // R2r <- R2 - (w*Pe2[f-1] + z*Qe2[f-1]), R2r has order 2^(f-e) - //DBLMUL(&R2r, &Pe2[f-1], w, &Qe2[f-1], z, &curvenorm); - DBLMUL2(&R2r, &Pe2[f-1], &w_p[0], &Qe2[f-1], &z_p[0], &curvenorm); - jac_neg(&R2r, &R2r); - ADD(&R2r, &RR, &R2r, &curvenorm); - copy_jac_point(&TT, &R2r); - for (i = 0; i < e1; i++) { - DBL(&TT, &TT, &curvenorm); - } - ec_dlog_2_step(&w1, &z1, &TT, (int)f2, (int)f2div2, &Pe2[0], &Qe2[0], &PQe2[0], &curvenorm); - - // R2r1 <- R2r - (w1*Pe2[f1-1] + z1*Qe2[f1-1]) - DBLMUL(&R2r1, &Pe2[f1-1], w1, &Qe2[f1-1], z1, &curvenorm); - jac_neg(&R2r1, &R2r1); - ADD(&R2r1, &R2r, &R2r1, &curvenorm); - ec_dlog_2_step(&x1, &y1, &R2r1, (int)e1, (int)f2div2, &Pe2[0], &Qe2[0], &PQe2[0], &curvenorm); - - xx[0] = x1; - yy[0] = y1; - ww[0] = w1; - zz[0] = z1; - mp_shiftl(&xx[0], (unsigned int)f2, NWORDS_ORDER); - mp_add(&xx[0], &xx[0], &ww[0], NWORDS_ORDER); - mp_shiftl(&yy[0], (unsigned int)f2, NWORDS_ORDER); - mp_add(&yy[0], &yy[0], &zz[0], NWORDS_ORDER); - //ww[0] = w; - //zz[0] = z; - ww[0] = w_p[0]; - zz[0] = z_p[0]; - ww[1] = w_p[1]; - zz[1] = z_p[1]; - if (e < 64) { - mp_shiftl(&xx[0], (unsigned int)e, NWORDS_ORDER); - mp_shiftl(&yy[0], (unsigned int)e, NWORDS_ORDER); - } else { - x0_p[0] = 0; - y0_p[0] = 0; - x0_p[1] = 0x100; - y0_p[1] = 0x100; - mp_mul2(&xx[0], &xx[0], &x0_p[0]); - mp_mul2(&yy[0], &yy[0], &y0_p[0]); - } - mp_add(scalarP, &xx[0], &ww[0], NWORDS_ORDER); - mp_add(scalarQ, &yy[0], &zz[0], NWORDS_ORDER); - - fp_copy(fp2, TWOpFm1); // 2^(f-1) - - // If scalarP > 2^(f-1) or (scalarQ > 2^(f-1) and (scalarP = 0 or scalarP = 2^(f-1))) then output -scalarP mod 2^f, -scalarQ mod 2^f - if (mp_compare(scalarP, fp2, NWORDS_ORDER) == 1 || - (mp_compare(scalarQ, fp2, NWORDS_ORDER) == 1 && (mp_is_zero(scalarP, NWORDS_ORDER) == 1 || mp_compare(scalarP, fp2, NWORDS_ORDER) == 0))) { - mp_shiftl(fp2, 1, NWORDS_ORDER); // Get 2^f - if (mp_is_zero(scalarP, NWORDS_ORDER) != 1) - mp_sub(scalarP, fp2, scalarP, NWORDS_ORDER); - if (mp_is_zero(scalarQ, NWORDS_ORDER) != 1) - mp_sub(scalarQ, fp2, scalarQ, NWORDS_ORDER); - } -} - -static void ec_dlog_3_step(digit_t* x, digit_t* y, const jac_point_t* R, const int f, const int B, const jac_point_t* Pe3, const jac_point_t* Qe3, const jac_point_t* PQe3, const ec_curve_t* curve) -{ // Based on Montgomery formulas using Jacobian coordinates - int i, j; - digit_t value = 1; - jac_point_t P, Q, PQp, PQ2p, P2Qp, P2Q2p, P2p, Q2p, TT, SS, Te[POWER_OF_3/2], Re[POWER_OF_3/2]; // Storage could be reduced to e points - jac_point_t PQep0, PQ2ep0, P2Qep0, P2Q2ep0, P2ep0, Q2ep0, PQep1, PQ2ep1, P2Qep1, P2Q2ep1, P2ep1, Q2ep1; - - *x = 0; - *y = 0; - - copy_jac_point(&P, &Pe3[f-1]); - copy_jac_point(&Q, &Qe3[f-1]); - copy_jac_point(&Re[f-1], R); - - for (i = 0; i < (f-1); i++) { - TPL(&Re[f-i-2], &Re[f-i-1], curve); - } - - ADD(&PQp, &P, &Q, curve); // P+Q - ADD(&PQ2p, &PQp, &Q, curve); // P+2Q - ADD(&P2Qp, &PQp, &P, curve); // P2+Q - DBL(&P2Q2p, &PQp, curve); // 2P+2Q - DBL(&P2p, &P, curve); // 2P - DBL(&Q2p, &Q, curve); // 2Q - ADD(&PQep0, &Pe3[0], &Qe3[0], curve); // Pe3[0] + Qe3[0] - ADD(&PQ2ep0, &PQep0, &Qe3[0], curve); // Pe3[0] + 2Qe3[0] - ADD(&P2Qep0, &PQep0, &Pe3[0], curve); // 2Pe3[0] + Qe3[0] - DBL(&P2Q2ep0, &PQep0, curve); // 2Pe3[0] + 2Qe3[0] - DBL(&P2ep0, &Pe3[0], curve); // 2Pe3[0] - DBL(&Q2ep0, &Qe3[0], curve); // 2Qe3[0] - ADD(&PQep1, &Pe3[1], &Qe3[1], curve); // Pe3[1] + Qe3[1] - ADD(&PQ2ep1, &PQep1, &Qe3[1], curve); // Pe3[1] + 2Qe3[1] - ADD(&P2Qep1, &PQep1, &Pe3[1], curve); // 2Pe3[1] + Qe3[1] - DBL(&P2Q2ep1, &PQep1, curve); // 2Pe3[1] + 2Qe3[1] - DBL(&P2ep1, &Pe3[1], curve); // 2Pe3[1] - DBL(&Q2ep1, &Qe3[1], curve); // 2Qe3[1] - - // Unrolling the first two iterations - if (is_jac_equal(&Pe3[0], &Re[0])) { - *x += 1; - copy_jac_point(&Te[0], &P); - for (j = 3; j <= B; j++) { - copy_jac_point(&Te[j-1], &Pe3[j-1]); - } - jac_neg(&TT, &Pe3[1]); - ADD(&Re[0], &Re[1], &TT, curve); - } else if (is_jac_equal(&PQep0, &Re[0])) { - *x += 1; - *y += 1; - copy_jac_point(&Te[0], &PQp); - for (j = 3; j <= B; j++) { - ADD(&Te[j-1], &Pe3[j-1], &Qe3[j-1], curve); - } - jac_neg(&TT, &PQep1); - ADD(&Re[0], &Re[1], &TT, curve); - } else if (is_jac_equal(&PQ2ep0, &Re[0])) { - *x += 1; - *y += 2; - copy_jac_point(&Te[0], &PQ2p); - for (j = 3; j <= B; j++) { - DBL(&TT, &Qe3[j-1], curve); - ADD(&Te[j-1], &Pe3[j-1], &TT, curve); - } - jac_neg(&TT, &PQ2ep1); - ADD(&Re[0], &Re[1], &TT, curve); - } else if (is_jac_equal(&P2ep0, &Re[0])) { - *x += 2; - copy_jac_point(&Te[0], &P2p); - for (j = 3; j <= B; j++) { - DBL(&Te[j-1], &Pe3[j-1], curve); - } - jac_neg(&TT, &P2ep1); - ADD(&Re[0], &Re[1], &TT, curve); - } else if (is_jac_equal(&P2Qep0, &Re[0])) { - *x += 2; - *y += 1; - copy_jac_point(&Te[0], &P2Qp); - for (j = 3; j <= B; j++) { - DBL(&TT, &Pe3[j-1], curve); - ADD(&Te[j-1], &TT, &Qe3[j-1], curve); - } - jac_neg(&TT, &P2Qep1); - ADD(&Re[0], &Re[1], &TT, curve); - } else if (is_jac_equal(&P2Q2ep0, &Re[0])) { - *x += 2; - *y += 2; - copy_jac_point(&Te[0], &P2Q2p); - for (j = 3; j <= B; j++) { - DBL(&TT, &Pe3[j-1], curve); - DBL(&SS, &Qe3[j-1], curve); - ADD(&Te[j-1], &TT, &SS, curve); - } - jac_neg(&TT, &P2Q2ep1); - ADD(&Re[0], &Re[1], &TT, curve); - } else if (is_jac_equal(&Qe3[0], &Re[0])) { - *y += 1; - copy_jac_point(&Te[0], &Q); - for (j = 3; j <= B; j++) { - copy_jac_point(&Te[j-1], &Qe3[j-1]); - } - jac_neg(&TT, &Qe3[1]); - ADD(&Re[0], &Re[1], &TT, curve); - } else if (is_jac_equal(&Q2ep0, &Re[0])) { - *y += 2; - copy_jac_point(&Te[0], &Q2p); - for (j = 3; j <= B; j++) { - DBL(&Te[j-1], &Qe3[j-1], curve); - } - jac_neg(&TT, &Q2ep1); - ADD(&Re[0], &Re[1], &TT, curve); - } else { - jac_init(&Te[0]); - for (j = 3; j <= B; j++) { - jac_init(&Te[j-1]); - } - copy_jac_point(&Re[0], &Re[1]); - } - - // Unrolling iterations 3-B - for (i = 3; i <= B; i++) { - value *= 3; - jac_neg(&TT, &Te[i-1]); - ADD(&TT, &Re[i-1], &TT, curve); // TT <- Re[i-1]-T[i-1] - if (is_jac_equal(&Pe3[0], &Re[0])) { - *x += value; - ADD(&Te[0], &Te[0], &Pe3[f-i+1], curve); - for (j = i+1; j <= B; j++) { - ADD(&Te[j-1], &Te[j-1], &Pe3[j-i+1], curve); - } - jac_neg(&SS, &Pe3[1]); - ADD(&Re[0], &TT, &SS, curve); - } else if (is_jac_equal(&PQep0, &Re[0])) { - *x += value; - *y += value; - ADD(&Te[0], &Te[0], &Pe3[f-i+1], curve); - ADD(&Te[0], &Te[0], &Qe3[f-i+1], curve); - for (j = i+1; j <= B; j++) { - ADD(&Te[j-1], &Te[j-1], &Pe3[j-i+1], curve); - ADD(&Te[j-1], &Te[j-1], &Qe3[j-i+1], curve); - } - jac_neg(&SS, &PQep1); - ADD(&Re[0], &TT, &SS, curve); - } else if (is_jac_equal(&PQ2ep0, &Re[0])) { - *x += value; - *y += value; - *y += value; - ADD(&Te[0], &Te[0], &Pe3[f-i+1], curve); - ADD(&Te[0], &Te[0], &Qe3[f-i+1], curve); - ADD(&Te[0], &Te[0], &Qe3[f-i+1], curve); - for (j = i+1; j <= B; j++) { - ADD(&Te[j-1], &Te[j-1], &Pe3[j-i+1], curve); - ADD(&Te[j-1], &Te[j-1], &Qe3[j-i+1], curve); - ADD(&Te[j-1], &Te[j-1], &Qe3[j-i+1], curve); - } - jac_neg(&SS, &PQ2ep1); - ADD(&Re[0], &TT, &SS, curve); - } else if (is_jac_equal(&P2ep0, &Re[0])) { - *x += value; - *x += value; - ADD(&Te[0], &Te[0], &Pe3[f-i+1], curve); - ADD(&Te[0], &Te[0], &Pe3[f-i+1], curve); - for (j = i+1; j <= B; j++) { - ADD(&Te[j-1], &Te[j-1], &Pe3[j-i+1], curve); - ADD(&Te[j-1], &Te[j-1], &Pe3[j-i+1], curve); - } - jac_neg(&SS, &P2ep1); - ADD(&Re[0], &TT, &SS, curve); - } else if (is_jac_equal(&P2Qep0, &Re[0])) { - *x += value; - *x += value; - *y += value; - ADD(&Te[0], &Te[0], &Pe3[f-i+1], curve); - ADD(&Te[0], &Te[0], &Pe3[f-i+1], curve); - ADD(&Te[0], &Te[0], &Qe3[f-i+1], curve); - for (j = i+1; j <= B; j++) { - ADD(&Te[j-1], &Te[j-1], &Pe3[j-i+1], curve); - ADD(&Te[j-1], &Te[j-1], &Pe3[j-i+1], curve); - ADD(&Te[j-1], &Te[j-1], &Qe3[j-i+1], curve); - } - jac_neg(&SS, &P2Qep1); - ADD(&Re[0], &TT, &SS, curve); - } else if (is_jac_equal(&P2Q2ep0, &Re[0])) { - *x += value; - *x += value; - *y += value; - *y += value; - ADD(&Te[0], &Te[0], &Pe3[f-i+1], curve); - ADD(&Te[0], &Te[0], &Pe3[f-i+1], curve); - ADD(&Te[0], &Te[0], &Qe3[f-i+1], curve); - ADD(&Te[0], &Te[0], &Qe3[f-i+1], curve); - for (j = i+1; j <= B; j++) { - ADD(&Te[j-1], &Te[j-1], &Pe3[j-i+1], curve); - ADD(&Te[j-1], &Te[j-1], &Pe3[j-i+1], curve); - ADD(&Te[j-1], &Te[j-1], &Qe3[j-i+1], curve); - ADD(&Te[j-1], &Te[j-1], &Qe3[j-i+1], curve); - } - jac_neg(&SS, &P2Q2ep1); - ADD(&Re[0], &TT, &SS, curve); - } else if (is_jac_equal(&Qe3[0], &Re[0])) { - *y += value; - ADD(&Te[0], &Te[0], &Qe3[f-i+1], curve); - for (j = i+1; j <= B; j++) { - ADD(&Te[j-1], &Te[j-1], &Qe3[j-i+1], curve); - } - jac_neg(&SS, &Qe3[1]); - ADD(&Re[0], &TT, &SS, curve); - } else if (is_jac_equal(&Q2ep0, &Re[0])) { - *y += value; - *y += value; - ADD(&Te[0], &Te[0], &Qe3[f-i+1], curve); - ADD(&Te[0], &Te[0], &Qe3[f-i+1], curve); - for (j = i+1; j <= B; j++) { - ADD(&Te[j-1], &Te[j-1], &Qe3[j-i+1], curve); - ADD(&Te[j-1], &Te[j-1], &Qe3[j-i+1], curve); - } - jac_neg(&SS, &Q2ep1); - ADD(&Re[0], &TT, &SS, curve); - } else { - copy_jac_point(&Re[0], &TT); - } - } - - // Main Loop - for (i = B; i < f; i++) { - value *= 3; - if (is_jac_equal(&Pe3[0], &Re[0])) { - *x += value; - copy_jac_point(&TT, &P); - for (j = 0; j < (i-1); j++) { - TPL(&TT, &TT, curve); - } - ADD(&Te[0], &Te[0], &TT, curve); - } else if (is_jac_equal(&PQep0, &Re[0])) { - *x += value; - *y += value; - copy_jac_point(&TT, &PQp); - for (j = 0; j < (i-1); j++) { - TPL(&TT, &TT, curve); - } - ADD(&Te[0], &Te[0], &TT, curve); - } else if (is_jac_equal(&PQ2ep0, &Re[0])) { - *x += value; - *y += value; - *y += value; - copy_jac_point(&TT, &PQ2p); - for (j = 0; j < (i-1); j++) { - TPL(&TT, &TT, curve); - } - ADD(&Te[0], &Te[0], &TT, curve); - } else if (is_jac_equal(&P2ep0, &Re[0])) { - *x += value; - *x += value; - copy_jac_point(&TT, &P2p); - for (j = 0; j < (i-1); j++) { - TPL(&TT, &TT, curve); - } - ADD(&Te[0], &Te[0], &TT, curve); - } else if (is_jac_equal(&P2Qep0, &Re[0])) { - *x += value; - *x += value; - *y += value; - copy_jac_point(&TT, &P2Qp); - for (j = 0; j < (i-1); j++) { - TPL(&TT, &TT, curve); - } - ADD(&Te[0], &Te[0], &TT, curve); - } else if (is_jac_equal(&P2Q2ep0, &Re[0])) { - *x += value; - *x += value; - *y += value; - *y += value; - copy_jac_point(&TT, &P2Q2p); - for (j = 0; j < (i-1); j++) { - TPL(&TT, &TT, curve); - } - ADD(&Te[0], &Te[0], &TT, curve); - } else if (is_jac_equal(&Qe3[0], &Re[0])) { - *y += value; - copy_jac_point(&TT, &Q); - for (j = 0; j < (i-1); j++) { - TPL(&TT, &TT, curve); - } - ADD(&Te[0], &Te[0], &TT, curve); - } else if (is_jac_equal(&Q2ep0, &Re[0])) { - *y += value; - *y += value; - copy_jac_point(&TT, &Q2p); - for (j = 0; j < (i-1); j++) { - TPL(&TT, &TT, curve); - } - ADD(&Te[0], &Te[0], &TT, curve); - } - jac_neg(&TT, &Te[0]); - ADD(&Re[0], R, &TT, curve); - for (j = 0; j < (f-i-1); j++) { - TPL(&Re[0], &Re[0], curve); - } - } - value *= 3; - if (is_jac_equal(&Pe3[0], &Re[0])) { - *x += value; - } else if (is_jac_equal(&PQep0, &Re[0])) { - *x += value; - *y += value; - } else if (is_jac_equal(&PQ2ep0, &Re[0])) { - *x += value; - *y += value; - *y += value; - } else if (is_jac_equal(&P2ep0, &Re[0])) { - *x += value; - *x += value; - } else if (is_jac_equal(&P2Qep0, &Re[0])) { - *x += value; - *x += value; - *y += value; - } else if (is_jac_equal(&P2Q2ep0, &Re[0])) { - *x += value; - *x += value; - *y += value; - *y += value; - } else if (is_jac_equal(&Qe3[0], &Re[0])) { - *y += value; - } else if (is_jac_equal(&Q2ep0, &Re[0])) { - *y += value; - *y += value; - } -} - -void ec_dlog_3(digit_t* scalarP, digit_t* scalarQ, const ec_basis_t* PQ3, const ec_point_t* R, const ec_curve_t* curve) -{ // Optimized implementation based on Montgomery formulas using Jacobian coordinates - int i; - digit_t w0 = 0, z0 = 0, x0 = 0, y0 = 0, x1 = 0, y1 = 0, w1 = 0, z1 = 0, e, f, f1, f1div2; - digit_t fp2[NWORDS_ORDER] = {0}, xx[NWORDS_ORDER] = {0}, yy[NWORDS_ORDER] = {0}, ww[NWORDS_ORDER] = {0}, zz[NWORDS_ORDER] = {0}; - jac_point_t P, Q, RR, TT, R2r0; - jac_point_t Pe3[POWER_OF_3], Qe3[POWER_OF_3], PQe3[POWER_OF_3]; - ec_point_t Rnorm; - ec_curve_t curvenorm; - ec_basis_t PQ3norm; - - f = POWER_OF_3; - memset(scalarP, 0, NWORDS_ORDER*RADIX/8); - memset(scalarQ, 0, NWORDS_ORDER*RADIX/8); - - // Normalize R,PQ3,curve - fp2_t D; - fp2_mul(&D, &PQ3->P.z, &PQ3->Q.z); - fp2_mul(&D, &D, &PQ3->PmQ.z); - fp2_mul(&D, &D, &R->z); - fp2_mul(&D, &D, &curve->C); - fp2_inv(&D); - fp_mont_setone(Rnorm.z.re); - fp_set(Rnorm.z.im, 0); - fp2_copy(&PQ3norm.P.z, &Rnorm.z); - fp2_copy(&PQ3norm.Q.z, &Rnorm.z); - fp2_copy(&PQ3norm.PmQ.z, &Rnorm.z); - fp2_copy(&curvenorm.C, &Rnorm.z); - fp2_mul(&Rnorm.x, &R->x, &D); - fp2_mul(&Rnorm.x, &Rnorm.x, &PQ3->P.z); - fp2_mul(&Rnorm.x, &Rnorm.x, &PQ3->Q.z); - fp2_mul(&Rnorm.x, &Rnorm.x, &PQ3->PmQ.z); - fp2_mul(&Rnorm.x, &Rnorm.x, &curve->C); - fp2_mul(&PQ3norm.P.x, &PQ3->P.x, &D); - fp2_mul(&PQ3norm.P.x, &PQ3norm.P.x, &R->z); - fp2_mul(&PQ3norm.P.x, &PQ3norm.P.x, &PQ3->Q.z); - fp2_mul(&PQ3norm.P.x, &PQ3norm.P.x, &PQ3->PmQ.z); - fp2_mul(&PQ3norm.P.x, &PQ3norm.P.x, &curve->C); - fp2_mul(&PQ3norm.Q.x, &PQ3->Q.x, &D); - fp2_mul(&PQ3norm.Q.x, &PQ3norm.Q.x, &R->z); - fp2_mul(&PQ3norm.Q.x, &PQ3norm.Q.x, &PQ3->P.z); - fp2_mul(&PQ3norm.Q.x, &PQ3norm.Q.x, &PQ3->PmQ.z); - fp2_mul(&PQ3norm.Q.x, &PQ3norm.Q.x, &curve->C); - fp2_mul(&PQ3norm.PmQ.x, &PQ3->PmQ.x, &D); - fp2_mul(&PQ3norm.PmQ.x, &PQ3norm.PmQ.x, &R->z); - fp2_mul(&PQ3norm.PmQ.x, &PQ3norm.PmQ.x, &PQ3->P.z); - fp2_mul(&PQ3norm.PmQ.x, &PQ3norm.PmQ.x, &PQ3->Q.z); - fp2_mul(&PQ3norm.PmQ.x, &PQ3norm.PmQ.x, &curve->C); - fp2_mul(&curvenorm.A, &curve->A, &D); - fp2_mul(&curvenorm.A, &curvenorm.A, &R->z); - fp2_mul(&curvenorm.A, &curvenorm.A, &PQ3->P.z); - fp2_mul(&curvenorm.A, &curvenorm.A, &PQ3->Q.z); - fp2_mul(&curvenorm.A, &curvenorm.A, &PQ3->PmQ.z); - - recover_y(&P.y, &PQ3norm.P.x, &curvenorm); - fp2_copy(&P.x, &PQ3norm.P.x); - fp2_copy(&P.z, &PQ3norm.P.z); - recover_y(&Q.y, &PQ3norm.Q.x, &curvenorm); // TODO: THIS SECOND SQRT CAN BE ELIMINATED - fp2_copy(&Q.x, &PQ3norm.Q.x); - fp2_copy(&Q.z, &PQ3norm.Q.z); - recover_y(&RR.y, &Rnorm.x, &curvenorm); - fp2_copy(&RR.x, &Rnorm.x); - fp2_copy(&RR.z, &Rnorm.z); - - jac_neg(&TT, &Q); - ADD(&TT, &P, &TT, &curvenorm); - if (!is_jac_xz_equal(&TT, &PQ3norm.PmQ)) - jac_neg(&Q, &Q); - - // Computing torsion-2^f points, multiples of P, Q and P+Q - copy_jac_point(&Pe3[POWER_OF_3-1], &P); - copy_jac_point(&Qe3[POWER_OF_3-1], &Q); - ADD(&PQe3[POWER_OF_3-1], &P, &Q, &curvenorm); // P+Q - - for (i = 0; i < (POWER_OF_3-1); i++) { - TPL(&Pe3[POWER_OF_3-i-2], &Pe3[POWER_OF_3-i-1], &curvenorm); - TPL(&Qe3[POWER_OF_3-i-2], &Qe3[POWER_OF_3-i-1], &curvenorm); - TPL(&PQe3[POWER_OF_3-i-2], &PQe3[POWER_OF_3-i-1], &curvenorm); - } - - e = f >> 1; - f1 = f-e; - copy_jac_point(&TT, &RR); - for (i = 0; i < (f-f1); i++) { - TPL(&TT, &TT, &curvenorm); - } - // w0, z0 <- dlog3(3^(f-f1)*R, f1, f1 div 2) - f1div2 = f1 >> 1; - ec_dlog_3_step(&w0, &z0, &TT, (int)f1, (int)f1div2, &Pe3[0], &Qe3[0], &PQe3[0], &curvenorm); - - // R2r0 <- R2 - (w0*Pe3[f-1] + z0*Qe3[f-1]) - DBLMUL(&R2r0, &Pe3[f-1], w0, &Qe3[f-1], z0, &curvenorm); - jac_neg(&R2r0, &R2r0); - ADD(&R2r0, &RR, &R2r0, &curvenorm); - ec_dlog_3_step(&x0, &y0, &R2r0, (int)e, (int)f1div2, &Pe3[0], &Qe3[0], &PQe3[0], &curvenorm); - - xx[0] = x0; - yy[0] = y0; - ww[0] = w0; - zz[0] = z0; - mp_mul2(&xx[0], THREEpE, &xx[0]); - mp_add(scalarP, &xx[0], &ww[0], NWORDS_ORDER); - mp_mul2(&yy[0], THREEpE, &yy[0]); - mp_add(scalarQ, &yy[0], &zz[0], NWORDS_ORDER); - - // If scalarP > Floor(3^f/2) or (scalarQ > Floor(3^f/2) and scalarP = 0) then output -scalarP mod 3^f, -scalarQ mod 3^f - if (mp_compare(scalarP, THREEpFdiv2, NWORDS_ORDER) == 1 || - (mp_compare(scalarQ, THREEpFdiv2, NWORDS_ORDER) == 1 && (mp_is_zero(scalarP, NWORDS_ORDER) == 1))) { - if (mp_is_zero(scalarP, NWORDS_ORDER) != 1) - mp_sub(scalarP, THREEpF, scalarP, NWORDS_ORDER); - if (mp_is_zero(scalarQ, NWORDS_ORDER) != 1) - mp_sub(scalarQ, THREEpF, scalarQ, NWORDS_ORDER); - } -} - - -// WRAPPERS - -void ec_dbl(ec_point_t* res, const ec_curve_t* curve, const ec_point_t* P){ - xDBL(res, P, (ec_point_t const*)curve); -} -void ec_mul(ec_point_t* res, const ec_curve_t* curve, const digit_t* scalar, const ec_point_t* P){ - xMUL(res, P, scalar, curve); -} -void ec_biscalar_mul(ec_point_t* res, const ec_curve_t* curve, const digit_t* scalarP, const digit_t* scalarQ, const ec_basis_t* PQ){ - xDBLMUL(res, &PQ->P, scalarP, &PQ->Q, scalarQ, &PQ->PmQ, curve); -} diff --git a/src/ec/ref/ecx/fp2-test.c b/src/ec/ref/ecx/fp2-test.c deleted file mode 100644 index 95bd487..0000000 --- a/src/ec/ref/ecx/fp2-test.c +++ /dev/null @@ -1,90 +0,0 @@ -#include -#include -#include -#include "../generic/include/fp2_tmp.h" - -int main() -{ - fp2_t fp2_0, fp2_1; - // ------------ - fp2_set0(fp2_0); - fp2_set1(fp2_1); - // ------------ - - int i; - fp2_t a, b, c, d; - fp_t e; - - for (i = 0; i < 1024; i++) - { - printf("[%3d%%] Testing fp2_t arithmetic", 100 * i / (int)1024); - fflush(stdout); - printf("\r\x1b[K"); - - // Random elements of fp - fp2_random(a); - fp2_random(b); - fp2_copy(c, a); - c.re[0] += 1; - fp2_copy(d, b); - d.re[0] -= 1; - - assert(fp2_isequal(a,b) == 0); // different values check --> (a != b) - assert(fp2_isequal(c,c) == 1); // equal values check --> 1 (c == c) - - // Testing neg - fp2_set0(b); - fp2_copy(c, a); - fp2_neg(a, a); - fp2_sub(c, b, c); - assert(fp2_isequal(a,c) == 1); - - fp2_set1(a); // Now a == 1 - fp2_set0(b); // Now b == 0 - - assert(fp2_is_zero(a) == 0); - assert(fp2_is_zero(b) == 1); - - // testing c - c - fp2_sub(d, c, c); - assert(fp2_is_zero(d) == 1); - - // tetsing c * 0 - fp2_mul(d, c, b); - assert(fp2_is_zero(d) == 1); - - // tetsing c * 1 ... recall, in Montgomery domain R mod p plays the role of the 1 - fp2_set1(a); - fp2_mul(d, c, a); - assert(fp2_isequal(d, c) == 1); - - // fp_set(e, 1); // Now e == 1 - // fp2_pow(d, e, c); - // assert(fp2_isequal(d, c) == 1); - - // fp_set(e, 0); // Now e == 0 - // fp2_pow(d, e, c); - // assert(fp2_isone(d) == 1); - - // fp2_set(a, 1); // Now e == R mod p - // fp_random(e); - // fp2_pow(d, e, a); - // assert(fp2_isone(d) == 1); - - // Testing 1/a by computing (1/a) x a - fp2_random(a); - fp2_copy(b, a); - fp2_inv(a); - fp2_mul(c, a, b); - assert(fp2_isone(c) == 1); - - fp2_random(a); - fp2_sqr(b, a); - assert( fp2_issquare(b) ); - - }; - - printf("[%2d%%] Tested fp2_t arithmetic:\tNo errors!\n", 100 * i / (int)1024); - printf("-- All tests passed.\n"); - return 0; -} diff --git a/src/ec/ref/ecx/isog_chains.c b/src/ec/ref/ecx/isog_chains.c deleted file mode 100644 index 7e6f31b..0000000 --- a/src/ec/ref/ecx/isog_chains.c +++ /dev/null @@ -1,298 +0,0 @@ -#include "isog.h" -#include - -static inline void AC_to_A24(ec_point_t *A24, ec_curve_t const *E) -{ - // A24 = (A+2C : 4C) - fp2_add(&A24->z, &E->C, &E->C); - fp2_add(&A24->x, &E->A, &A24->z); - fp2_add(&A24->z, &A24->z, &A24->z); -} - -static inline void A24_to_AC(ec_curve_t *E, ec_point_t const *A24) -{ - // (A:C) = ((A+2C)*2-4C : 4C) - fp2_add(&E->A, &A24->x, &A24->x); - fp2_sub(&E->A, &E->A, &A24->z); - fp2_add(&E->A, &E->A, &E->A); - fp2_copy(&E->C, &A24->z); -} - -void ec_eval_even(ec_curve_t* image, const ec_isog_even_t* phi, - ec_point_t* points, unsigned short length){ - ec_point_t Q4, Q, A24; - copy_point(&Q4, &phi->kernel); - AC_to_A24(&A24, &phi->curve); - for(int i = 0; i < phi->length - 2; i++) - xDBLv2(&Q4, &Q4, &A24); - xDBLv2(&Q, &Q4, &A24); - if(fp2_is_zero(&Q.x)){ - xisog_4_singular(&A24, Q4, A24); - xeval_4_singular(points, points, length, Q4); - xeval_4_singular(&Q, &phi->kernel, 1, Q4); - } - else{ - xisog_4(&A24, Q4); - xeval_4(points, points, length); - xeval_4(&Q, &phi->kernel, 1); - } - ec_eval_even_strategy(image, points, length, &A24, &Q, phi->length-2); - } - -void ec_eval_even_nonzero(ec_curve_t* image, const ec_isog_even_t* phi, - ec_point_t* points, unsigned short length){ - ec_point_t Q4, A24; - copy_point(&Q4, &phi->kernel); - AC_to_A24(&A24, &phi->curve); - for(int i = 0; i < phi->length - 2; i++) - xDBLv2(&Q4, &Q4, &A24); - xisog_4(&A24, Q4); - xeval_4(points, points, length); - xeval_4(&Q4, &phi->kernel, 1); - ec_eval_even_strategy(image, points, length, &A24, &Q4, phi->length-2); - } - -static void ec_eval_even_strategy(ec_curve_t* image, ec_point_t* points, unsigned short points_len, - ec_point_t* A24, const ec_point_t *kernel, const int isog_len){ - - assert(isog_len == POWER_OF_2-2); - - uint8_t log2_of_e, tmp; - fp2_t t0; - digit_t e_half = (isog_len)>>1; - for(tmp = e_half, log2_of_e = 0; tmp > 0; tmp>>=1, ++log2_of_e); - log2_of_e *= 2; // In order to ensure each splits is at most size log2_of_e - - ec_point_t SPLITTING_POINTS[log2_of_e], K2; - copy_point(&SPLITTING_POINTS[0], kernel); - - int strategy = 0, // Current element of the strategy to be used - i, j; - - int BLOCK = 0, // Keeps track of point order - current = 0; // Number of points being carried - int XDBLs[log2_of_e]; // Number of doubles performed - - // If walk length is odd, we start with a 2-isogeny - if(isog_len & 1){ - copy_point(&SPLITTING_POINTS[1], &SPLITTING_POINTS[0]); - for(i = 0; i < isog_len-1; i++) - xDBLv2(&SPLITTING_POINTS[1], &SPLITTING_POINTS[1], A24); - xisog_2(A24, SPLITTING_POINTS[1]); - xeval_2(SPLITTING_POINTS, SPLITTING_POINTS, 1); - xeval_2(points, points, points_len); - } - - // Chain of 4-isogenies - for(j = 0; j < (e_half - 1); j++) - { - // Get the next point of order 4 - while (BLOCK != (e_half - 1 - j) ) - { - // A new split will be added - current += 1; - // We set the seed of the new split to be computed and saved - copy_point(&SPLITTING_POINTS[current], &SPLITTING_POINTS[current - 1]); - for(i = 0; i < 2*STRATEGY4[strategy]; i++) - xDBLv2(&SPLITTING_POINTS[current], &SPLITTING_POINTS[current], A24); - XDBLs[current] = STRATEGY4[strategy]; // The number of doublings performed is saved - BLOCK += STRATEGY4[strategy]; // BLOCK is increased by the number of doublings performed - strategy += 1; // Next, we move to the next element of the strategy - } - - // Evaluate 4-isogeny - xisog_4(A24, SPLITTING_POINTS[current]); - xeval_4(SPLITTING_POINTS, SPLITTING_POINTS, current); - xeval_4(points, points, points_len); - - BLOCK -= XDBLs[current]; - XDBLs[current] = 0; - current -= 1; - } - - // Final 4-isogeny - xisog_4(A24, SPLITTING_POINTS[current]); - xeval_4(points, points, points_len); - - // Output curve in the form (A:C) - A24_to_AC(image, A24); -} - -void ec_eval_odd(ec_curve_t* image, const ec_isog_odd_t* phi, - ec_point_t* points, unsigned short length){ - - ec_point_t ker_plus, ker_minus, P, K, A24, B24; - int i,j,k; - - AC_to_A24(&A24, &phi->curve); - - // Isogenies with kernel in E[p+1] - copy_point(&ker_plus, &phi->ker_plus); - copy_point(&ker_minus, &phi->ker_minus); - for(i = 0; i < P_LEN; i++){ - copy_point(&P, &ker_plus); - for(j = i+1; j < P_LEN; j++){ - for(k = 0; k < phi->degree[j]; k++) - xMULv2(&P, &P, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A24); - } - for(k = 0; k < phi->degree[i]; k++){ - copy_point(&K, &P); - for(j = 0; j < phi->degree[i]-k-1; j++) - xMULv2(&K, &K, &(TORSION_ODD_PRIMES[i]), p_plus_minus_bitlength[i], &A24); - kps(i, K, A24); - xisog(&B24, i, A24); - xeval(&P, i, P, A24); - xeval(&ker_plus, i, ker_plus, A24); - xeval(&ker_minus, i, ker_minus, A24); - for(j = 0; j < length; j++) - xeval(&points[j], i, points[j], A24); - copy_point(&A24, &B24); - kps_clear(i); - } - } - - // Isogenies with kernel in E[p-1] - for(i = P_LEN; i < P_LEN+M_LEN; i++){ - copy_point(&P, &ker_minus); - for(j = i+1; j < P_LEN+M_LEN; j++){ - for(k = 0; k < phi->degree[j]; k++) - xMULv2(&P, &P, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A24); - } - for(k = 0; k < phi->degree[i]; k++){ - copy_point(&K, &P); - for(j = 0; j < phi->degree[i]-k-1; j++) - xMULv2(&K, &K, &(TORSION_ODD_PRIMES[i]), p_plus_minus_bitlength[i], &A24); - kps(i, K, A24); - xisog(&B24, i, A24); - xeval(&P, i, P, A24); - xeval(&ker_minus, i, ker_minus, A24); - for(j = 0; j < length; j++) - xeval(&points[j], i, points[j], A24); - copy_point(&A24, &B24); - kps_clear(i); - } - } - - A24_to_AC(image, &A24); -} - -void ec_curve_normalize(ec_curve_t *new, ec_isom_t *isom, const ec_curve_t *old){ - fp2_t t0, t1, t2, t3, t4, t5; - // Compute the other solutions: - // A'^2 = [ sqrt(A^2-4C^2)*(9C^2-A^2) +- (A^3-3AC^2) ] / [ 2C^2*sqrt(A^2-4C^2) ] - fp2_sqr(&t0, &old->C); //C^2 - fp2_add(&t1, &t0, &t0); //2C^2 - fp2_add(&t2, &t1, &t1); //4C^2 - fp2_sqr(&t3, &old->A); //A^2 - fp2_sub(&t2, &t3, &t2); //A^2-4C^2 - fp2_sqrt(&t2); //sqrt(A^2-4C^2) - fp2_add(&t0, &t0, &t1); //3C^2 - fp2_mul(&t1, &t2, &t1); //2C^2*sqrt(A^2-4C^2) - fp2_sub(&t5, &t3, &t0); //A^2-3C^2 - fp2_mul(&t5, &t5, &old->A); //A^3-3AC^2 - fp2_add(&t4, &t0, &t0); //6C^2 - fp2_add(&t0, &t4, &t0); //9C^2 - fp2_sub(&t0, &t0, &t3); //9C^2-A^2 - fp2_add(&t3, &t3, &t3); //2A^2 - fp2_mul(&t3, &t3, &t2); //2A^2*sqrt(A^2-4C^2) - fp2_mul(&t2, &t2, &t0); //sqrt(A^2-4C^2)*(9C^2-A^2) - fp2_add(&t0, &t2, &t5); //sqrt(A^2-4C^2)*(9C^2-A^2) + (A^3-3AC^2) - fp2_sub(&t2, &t2, &t5); //sqrt(A^2-4C^2)*(9C^2-A^2) - (A^3-3AC^2) - fp2_inv(&t1); //1/2C^2*sqrt(A^2-4C^2) - fp2_mul(&t0, &t0, &t1); // First solution - fp2_mul(&t2, &t2, &t1); // Second solution - fp2_mul(&t1, &t3, &t1); // Original solution - - // Chose the lexicographically first solution - if(fp2_cmp(&t0, &t1)==1) - fp2_copy(&t0, &t1); - if(fp2_cmp(&t0, &t2)==1) - fp2_copy(&t0, &t2); - - // Copy the solution - fp2_sqrt(&t0); - ec_curve_t E; - fp2_copy(&E.A, &t0); - fp_mont_setone(E.C.re); - fp_set(E.C.im, 0); - ec_isomorphism(isom, old, &E); - fp2_copy(&new->A, &E.A); - fp2_copy(&new->C, &E.C); -} - -void ec_isomorphism(ec_isom_t* isom, const ec_curve_t* from, const ec_curve_t* to){ - fp2_t t0, t1, t2, t3, t4; - fp2_mul(&t0, &from->A, &to->C); - fp2_sqr(&t0, &t0); //fromA^2toC^2 - fp2_mul(&t1, &to->A, &from->C); - fp2_sqr(&t1, &t1); //toA^2fromC^2 - fp2_mul(&t2, &to->C, &from->C); - fp2_sqr(&t2, &t2); //toC^2fromC^2 - fp2_add(&t3, &t2, &t2); - fp2_add(&t2, &t3, &t2); //3toC^2fromC^2 - fp2_sub(&t3, &t2, &t0); //3toC^2fromC^2-fromA^2toC^2 - fp2_sub(&t4, &t2, &t1); //3toC^2fromC^2-toA^2fromC^2 - fp2_inv(&t3); - fp2_mul(&t4, &t4, &t3); - fp2_sqrt(&t4); //lambda^2 constant for SW isomorphism - fp2_sqr(&t3, &t4); - fp2_mul(&t3, &t3, &t4); //lambda^6 - - // Check sign of lambda^2, such that lambda^6 has the right sign - fp2_sqr(&t0, &from->C); - fp2_add(&t1, &t0, &t0); - fp2_add(&t1, &t1, &t1); - fp2_add(&t1, &t1, &t1); - fp2_add(&t0, &t0, &t1); // 9fromC^2 - fp2_sqr(&t2, &from->A); - fp2_add(&t2, &t2, &t2); // 2fromA^2 - fp2_sub(&t2, &t2, &t0); - fp2_mul(&t2, &t2, &from->A); // -9fromC^2fromA+2fromA^3 - fp2_sqr(&t0, &to->C); - fp2_mul(&t0, &t0, &to->C); - fp2_mul(&t2, &t2, &t0); //toC^3* [-9fromC^2fromA+2fromA^3] - fp2_mul(&t3, &t3, &t2); //lambda^6*(-9fromA+2fromA^3)*toC^3 - fp2_sqr(&t0, &to->C); - fp2_add(&t1, &t0, &t0); - fp2_add(&t1, &t1, &t1); - fp2_add(&t1, &t1, &t1); - fp2_add(&t0, &t0, &t1); // 9toC^2 - fp2_sqr(&t2, &to->A); - fp2_add(&t2, &t2, &t2); // 2toA^2 - fp2_sub(&t2, &t2, &t0); - fp2_mul(&t2, &t2, &to->A); // -9toC^2toA+2toA^3 - fp2_sqr(&t0, &from->C); - fp2_mul(&t0, &t0, &from->C); - fp2_mul(&t2, &t2, &t0); //fromC^3* [-9toC^2toA+2toA^3] - if(!fp2_is_equal(&t2, &t3)) - fp2_neg(&t4, &t4); - - // Mont -> SW -> SW -> Mont - fp_mont_setone(t0.re); - fp_set(t0.im, 0); - fp2_add(&isom->D, &t0, &t0); - fp2_add(&isom->D, &isom->D, &t0); - fp2_mul(&isom->D, &isom->D, &from->C); - fp2_mul(&isom->D, &isom->D, &to->C); - fp2_mul(&isom->Nx, &isom->D, &t4); - fp2_mul(&t4, &t4, &from->A); - fp2_mul(&t4, &t4, &to->C); - fp2_mul(&t0, &to->A, &from->C); - fp2_sub(&isom->Nz, &t0, &t4); -} - -void ec_iso_inv(ec_isom_t* isom){ - fp2_t tmp; - fp2_copy(&tmp, &isom->D); - fp2_copy(&isom->D, &isom->Nx); - fp2_copy(&isom->Nx, &tmp); - fp2_neg(&isom->Nz, &isom->Nz); -} - -void ec_iso_eval(ec_point_t *P, ec_isom_t* isom){ - fp2_t tmp; - fp2_mul(&P->x, &P->x, &isom->Nx); - fp2_mul(&tmp, &P->z, &isom->Nz); - fp2_sub(&P->x, &P->x, &tmp); - fp2_mul(&P->z, &P->z, &isom->D); -} diff --git a/src/ec/ref/ecx/kps.c b/src/ec/ref/ecx/kps.c deleted file mode 100644 index c36d1cf..0000000 --- a/src/ec/ref/ecx/kps.c +++ /dev/null @@ -1,228 +0,0 @@ -#include "isog.h" -#include "curve_extras.h" -#include - -int sI, sJ, sK; // Sizes of each current I, J, and K - -fp2_t I[sI_max][2], // I plays also as the linear factors of the polynomial h_I(X) - EJ_0[sJ_max][3], EJ_1[sJ_max][3]; // To be used in xisog y xeval - -ec_point_t J[sJ_max], K[sK_max]; // Finite subsets of the kernel -fp2_t XZJ4[sJ_max], // -4* (Xj * Zj) for each j in J, and x([j]P) = (Xj : Zj) - rtree_A[(1 << (ceil_log_sI_max+2)) - 1], // constant multiple of the reciprocal tree computation - A0; // constant multiple of the reciprocal R0 - -poly ptree_hI[(1 << (ceil_log_sI_max+2)) - 1], // product tree of h_I(X) - rtree_hI[(1 << (ceil_log_sI_max+2)) - 1], // reciprocal tree of h_I(X) - ptree_EJ[(1 << (ceil_log_sJ_max+2)) - 1]; // product tree of E_J(X) - -fp2_t R0[2*sJ_max + 1]; // Reciprocal of h_I(X) required in the scaled remainder tree approach - -int deg_ptree_hI[(1 << (ceil_log_sI_max+2)) - 1], // degree of each noed in the product tree of h_I(X) - deg_ptree_EJ[(1 << (ceil_log_sJ_max+2)) - 1]; // degree of each node in the product tree of E_J(X) - -fp2_t leaves[sI_max]; // leaves of the remainder tree, which are required in the Resultant computation - -// ----------------------------------------------------------- -// ----------------------------------------------------------- -// Traditional Kernel Point computation (KPs) - -// Kernel computation required in tye degree-4 isogeny evaluation -void kps_4(ec_point_t const P) -{ - fp2_sub(&K[1].x, &P.x, &P.z); - fp2_add(&K[2].x, &P.x, &P.z); - fp2_sqr(&K[0].x, &P.z); - fp2_add(&K[0].z, &K[0].x, &K[0].x); - fp2_add(&K[0].x, &K[0].z, &K[0].z); -} - -void eds2mont(ec_point_t* P) -{ - fp2_t t; - fp2_add(&t, &(P->z), &(P->x)); - fp2_sub(&(P->z), &(P->z), &(P->x)); - fp2_copy(&(P->x), &t); -} - - -// Differential doubling in Twisted Edwards model -void ydbl(ec_point_t* Q, ec_point_t* const P, ec_point_t const* A) -{ - fp2_t t_0, t_1, X, Z; - - fp2_sqr(&t_0, &(P->x)); - fp2_sqr(&t_1, &(P->z)); - fp2_mul(&Z, &(A->z), &t_0); - fp2_mul(&X, &Z, &t_1); - fp2_sub(&t_1, &t_1, &t_0); - fp2_mul(&t_0, &(A->x), &t_1); - fp2_add(&Z, &Z, &t_0); - fp2_mul(&Z, &Z, &t_1); - - fp2_sub(&(Q->x), &X, &Z); - fp2_add(&(Q->z), &X, &Z); -} - -// Differential addition in Twisted Edwards model -void yadd(ec_point_t* R, ec_point_t* const P, ec_point_t* const Q, ec_point_t* const PQ) -{ - fp2_t a, b, c, d, X, Z; - - fp2_mul(&a, &(P->z), &(Q->x)); - fp2_mul(&b, &(P->x), &(Q->z)); - fp2_add(&c, &a, &b); - fp2_sub(&d, &a, &b); - fp2_sqr(&c, &c); - fp2_sqr(&d, &d); - - fp2_add(&a, &(PQ->z), &(PQ->x)); - fp2_sub(&b, &(PQ->z), &(PQ->x)); - fp2_mul(&X, &b, &c); - fp2_mul(&Z, &a, &d); - - fp2_sub(&(R->x), &X, &Z); - fp2_add(&(R->z), &X, &Z); -} - -// tvelu formulae -void kps_t(uint64_t const i, ec_point_t const P, ec_point_t const A) -{ - int j; - int d = ((int)TORSION_ODD_PRIMES[i] - 1) / 2; - - // Mapping the input point x(P), which belongs to a - // Montogmery curve model, into its Twisted Edwards - // representation y(P) - fp2_sub(&K[0].x, &P.x, &P.z); - fp2_add(&K[0].z, &P.x, &P.z); - ydbl(&K[1], &K[0], &A); // y([2]P) - - for (j = 2; j < d; j++) - yadd(&K[j], &K[j - 1], &K[0], &K[j - 2]); // y([j+1]P) -} - -// ----------------------------------------------------------- -// ----------------------------------------------------------- -// Kernel Point computation (KPs) used in velu SQRT -void kps_s(uint64_t const i, ec_point_t const P, ec_point_t const A) -{ - // ================================================================================= - assert(TORSION_ODD_PRIMES[i] > gap); // Ensuring velusqrt is used for l_i > gap - // The optimal bounds must corresponds to sI, sJ, and sK - - sI = sizeI[i]; // Size of I - sJ = sizeJ[i]; // Size of J - sK = sizeK[i]; // Size of K - assert(sI >= sJ); // Ensuring #I >= #J - assert(sK >= 0); // Recall, it must be that #K >= 0 - assert(sJ > 1); // ensuring sI >= sJ > 1 - // ================================================================================= - - // Now, we can proceed by the general case - - int j; - - // -------------------------------------------------- - // Computing [j]P for each j in {1, 3, ..., 2*sJ - 1} - ec_point_t P2, P4; - copy_point(&J[0], &P); // x(P) - // Next computations are required for allowing the use of the function get_A() - fp2_mul(&XZJ4[0], &J[0].x, &J[0].z); // Xj*Zj - fp2_add(&XZJ4[0], &XZJ4[0], &XZJ4[0]); // 2Xj*Zj - fp2_add(&XZJ4[0], &XZJ4[0], &XZJ4[0]); // 4Xj*Zj - fp2_neg(&XZJ4[0], &XZJ4[0]); // -4Xj*Zj - xDBLv2(&P2, &P, &A); // x([2]P) - xADD(&J[1], &P2, &J[0], &J[0]); // x([3]P) - // Next computations are required for allowing the use of the function get_A() - fp2_mul(&XZJ4[1], &J[1].x, &J[1].z); // Xj*Zj - fp2_add(&XZJ4[1], &XZJ4[1], &XZJ4[1]); // 2Xj*Zj - fp2_add(&XZJ4[1], &XZJ4[1], &XZJ4[1]); // 4Xj*Zj - fp2_neg(&XZJ4[1], &XZJ4[1]); // -4Xj*Zj - for (j = 2; j < sJ; j++) - { - xADD(&J[j], &J[j - 1], &P2, &J[j - 2]); // x([2*j + 1]P) - // Next computations are required for allowing the use of the function get_A() - fp2_mul(&XZJ4[j], &J[j].x, &J[j].z); // Xj*Zj - fp2_add(&XZJ4[j], &XZJ4[j], &XZJ4[j]); // 2Xj*Zj - fp2_add(&XZJ4[j], &XZJ4[j], &XZJ4[j]); // 4Xj*Zj - fp2_neg(&XZJ4[j], &XZJ4[j]); // -4Xj*Zj - }; - - // ---------------------------------------------------------- - // Computing [i]P for i in { (2*sJ) * (2i + 1) : 0 <= i < sI} - // and the linear factors of h_I(W) - ec_point_t Q, Q2, tmp1, tmp2; - int bhalf_floor= sJ >> 1; - int bhalf_ceil = sJ - bhalf_floor; - xDBLv2(&P4, &P2, &A); // x([4]P) - swap_points(&P2, &P4, -(uint64_t)(sJ % 2)); // x([4]P) <--- coditional swap ---> x([2]P) - xADD(&Q, &J[bhalf_ceil], &J[bhalf_floor - 1], &P2); // Q := [2b]P - swap_points(&P2, &P4, -(uint64_t)(sJ % 2)); // x([4]P) <--- coditional swap ---> x([2]P) - - // ............................................. - xDBLv2(&Q2, &Q, &A); // x([2]Q) - xADD(&tmp1, &Q2, &Q, &Q); // x([3]Q) - fp2_neg(&I[0][0], &Q.x); - fp2_copy(&I[0][1], &Q.z); - fp2_neg(&I[1][0], &tmp1.x); - fp2_copy(&I[1][1], &tmp1.z); - copy_point(&tmp2, &Q); - - for (j = 2; j < sI; j++){ - xADD(&tmp2, &tmp1, &Q2, &tmp2); // x([2*j + 1]Q) - fp2_neg(&I[j][0], &tmp2.x); - fp2_copy(&I[j][1], &tmp2.z); - swap_points(&tmp1, &tmp2, -(uint64_t)1); - } - - - // ---------------------------------------------------------------- - // Computing [k]P for k in { 4*sJ*sI + 1, ..., l - 6, l - 4, l - 2} - // In order to avoid BRANCHES we make allways copy in K[0] and K[1] - // by assuming that these entries are only used when sK >= 1 and - // sK >= 2, respectively. - - //if (sK >= 1) - copy_point(&K[0], &P2); // x([l - 2]P) = x([2]P) - //if (sK >= 2) - copy_point(&K[1], &P4); // x([l - 4]P) = x([4]P) - - for (j = 2; j < sK; j++) - xADD(&K[j], &K[j - 1], &P2, &K[j - 2]); // x([l - 2*(j+1)]P) = x([2 * (j+1)]P) - - // ---------------------------------------------------------------- - // ~~~~~~~~ ~~~~~~~~ - // | | | | - // Computing h_I(W) = | | (W - x([i]P)) = | | (Zi * W - Xi) / Zi where x([i]P) = Xi/Zi - // i in I i in I - // In order to avoid costly inverse computations in fp, we are gonna work with projective coordinates - - product_tree_LENFeq2(ptree_hI, deg_ptree_hI, 0, I, sI); // Product tree of hI - if (!scaled) - { - // (unscaled) remainder tree approach - reciprocal_tree(rtree_hI, rtree_A, 2*sJ + 1, ptree_hI, deg_ptree_hI, 0, sI); // Reciprocal tree of hI - } - else - { - // scaled remainder tree approach - fp2_t f_rev[sI_max + 1]; - for (j = 0; j < (sI + 1); j++) - fp2_copy(&f_rev[j], &ptree_hI[0][sI - j]); - - if (sI > (2*sJ - sI + 1)) - reciprocal(R0, &A0, f_rev, sI + 1, sI); - else - reciprocal(R0, &A0, f_rev, sI + 1, 2*sJ - sI + 1); - }; -} - -void kps_clear(int i){ - if (TORSION_ODD_PRIMES[i] > gap) - { - if (!scaled) - clear_tree(rtree_hI, 0, sizeI[i]); - clear_tree(ptree_hI, 0, sizeI[i]); - } -} \ No newline at end of file diff --git a/src/ec/ref/ecx/poly-mul.c b/src/ec/ref/ecx/poly-mul.c deleted file mode 100644 index 67e4dd3..0000000 --- a/src/ec/ref/ecx/poly-mul.c +++ /dev/null @@ -1,1025 +0,0 @@ -#define _POLY_MUL_REDC_H_ -#include -#include - -void poly_mul(poly h, const poly f, const int lenf, const poly g, const int leng) -{ - // Karatsuba multiplication of polynomials h = f*g - // REQUIRES that h have enough space for lenf + leng - 1 terms - // NOT responsible for terms in h beyond h[lenf + leng - 2] - - int i; - const int lenh = lenf + leng - 1; - - if (lenf < leng) - { - poly_mul(h, g, leng, f, lenf); - return; - } - - // Resulting degree is negative - if(lenh <= 0) - return; - - // Multiplication by 0 polynomial - if(leng == 0) - { - for(i = 0; i < lenf-1; i++) - fp2_set(&h[i], 0); - return; - } - - // Multiplication by constant - if(leng == 1) - { - fp2_t fc[lenf], gc; // copy of f and g - for(i = 0; i < lenf; i++) - fp2_copy(&fc[i], &f[i]); - - fp2_copy(&gc, &g[0]); - for (i = 0; i < lenh; i++) - fp2_mul(&h[i], &fc[i], &gc); - - - return; - } - - // At this point we ensure lenf >= leng >= 2 - - // Case when lenf = leng = 2 - if (lenf == 2) - { - fp2_t t0, t1, t2; - fp2_add(&t1, &f[0], &f[1]); - fp2_add(&t2, &g[0], &g[1]); - fp2_mul(&t0, &f[0], &g[0]); - fp2_mul(&h[2], &f[1], &g[1]); - fp2_mul(&t1, &t1, &t2); - fp2_sub(&t1, &t1, &t0); - fp2_sub(&h[1], &t1, &h[2]); - fp2_copy(&h[0], &t0); - return; - } - - // Cases for f cuadratic - if (lenf == 3) - { - // Case when f is cuadratic and g linear - if (leng == 2) - { - fp2_t t0, t1, t2, t3; - fp2_mul(&t0, &f[0], &g[0]); - fp2_mul(&t2, &f[1], &g[1]); - fp2_add(&t3, &f[0], &f[1]); - fp2_add(&t1, &g[0], &g[1]); - fp2_mul(&t1, &t1, &t3); - fp2_sub(&t1, &t1, &t2); - fp2_sub(&t1, &t1, &t0); - fp2_mul(&t3, &f[2], &g[1]); - fp2_mul(&h[2], &f[2], &g[0]); - fp2_add(&h[2], &h[2], &t2); - fp2_copy(&h[0], &t0); - fp2_copy(&h[1], &t1); - fp2_copy(&h[3], &t3); - return; - } - - // Case when f,g both cuadratic - if (leng == 3) - { - fp2_t fg_high[3], t0, t1, t2; - - poly_mul(fg_high, &(f[1]), 2, &(g[1]), 2); - - fp2_add(&t0, &f[0], &f[1]); - fp2_add(&t1, &g[0], &g[1]); - fp2_mul(&t1, &t0, &t1); - fp2_add(&t0, &f[0], &f[2]); - fp2_add(&t2, &g[0], &g[2]); - fp2_mul(&t2, &t0, &t2); - - fp2_mul(&h[0], &f[0], &g[0]); - - fp2_sub(&t1, &t1, &h[0]); - fp2_sub(&h[1], &t1, &fg_high[0]); - fp2_sub(&t2, &t2, &h[0]); - fp2_sub(&t2, &t2, &fg_high[2]); - fp2_add(&h[2], &t2, &fg_high[0]); - fp2_copy(&h[3], &fg_high[1]); - fp2_copy(&h[4], &fg_high[2]); - - return; - } - } - - // At this point we ensure lenf >= 4 and lenf >= leng - - const int nf = lenf >> 1; - const int mf = lenf - nf; - const int mg = leng - nf; - - // Case when g is half the size of f - if (leng <= nf) - { - fp2_t fg_low[nf + leng -1], fg_high[mf + leng -1]; - - poly_mul(fg_low, f, nf, g, leng); - poly_mul(fg_high, &(f[nf]), mf, g, leng); - for(i = 0; i < nf; i++) - fp2_copy(&h[i], &fg_low[i]); - - for(i = nf; i < nf + leng - 1; i++) - fp2_add(&h[i], &fg_high[i-nf], &fg_low[i]); - - for(i = nf + leng - 1; i < lenh; i++) - fp2_copy(&h[i], &fg_high[i - nf]); - - return; - } - - - // All other cases - // Strategy is to spli f and g, into - // f(x) = f0(x) + x^nf*f1(x) and g(x) = g0(x) + x^nf*g1(x) where nf = floor(lenf/2) - // such that f(x)*g(x) = fg_low(x) + x^nf*fg_mid(x) + x^2nf*fg_high(x) where: - // fg_low(x) = f0(x)*g0(x) - // fg_mid(x) = f0(x)*g1(x) + f1(x)*g0(x) - // fg_high(x) = f1(x)*g1(x) - - fp2_t f_mid[mf], g_mid[mf], fg_low[2*nf-1], fg_mid[2*mf-1], fg_high[mf+mg-1]; - - for(i = 0; i < nf; i++) - fp2_add(&f_mid[i], &f[i], &f[i+nf]); - - if(lenf & 1) - fp2_copy(&f_mid[nf], &f[lenf-1]); - - i = 0; - while(i < nf && i < mg) - { - fp2_add(&g_mid[i], &g[i], &g[nf+i]); - i++; - } - while(i < nf) - { - fp2_copy(&g_mid[i], &g[i]); - i++; - } - - poly_mul(fg_low, f, nf, g, nf); - poly_mul(fg_high, &(f[nf]), mf, &(g[nf]), mg); - - if((lenf & 1) && (mg == mf)) - { - fp2_copy(&g_mid[nf], &g[leng - 1]); - poly_mul(fg_mid, f_mid, mf, g_mid, mf); - } - else - { - poly_mul(fg_mid, f_mid, mf, g_mid, nf); - } - - - for(i = 0; i < mf + mg - 1; i++) - fp2_sub(&fg_mid[i], &fg_mid[i], &fg_high[i]); - - for(i = 0; i < 2*nf-1; i++) - fp2_sub(&fg_mid[i], &fg_mid[i], &fg_low[i]); - - for(i = 0; i < nf; i++) - fp2_copy(&h[i], &fg_low[i]); - - for(i = nf; i < 2*nf-1; i++) - fp2_add(&h[i], &fg_low[i], &fg_mid[i-nf]); - - fp2_copy(&h[2*nf-1], &fg_mid[nf-1]); - - for(i = 2*nf; i < 2*nf+mf-1; i++) - fp2_add(&h[i], &fg_mid[i-nf], &fg_high[i-2*nf]); - - for(i = 2*nf+mf-1; i < lenh; i++) - fp2_copy(&h[i], &fg_high[i-2*nf]); - - return; -} - -void poly_mul_low(poly h, const int n, const poly f, const int lenf, const poly g, const int leng) -{ - // Karatsuba multiplication of polynomials h = f*g mod x^n - // REQUIRES that h have enough space for n terms - // NOT responsible for terms in h beyond h[n-1] - - // Ensure f is the one with highest degree - if(leng > lenf) - { - poly_mul_low(h, n, g, leng, f, lenf); - return; - } - - // Cleave g and f are too big - if(leng > n) - { - poly_mul_low(h, n, f, n, g, n); - return; - } - - // Cleave f is too big - if(lenf > n) - { - poly_mul_low(h, n, f, n, g, leng); - return; - } - - // Case when resulting degree is too small - if(n == 0) - return; - - // Multiplication by zero polynomial - if( (leng == 0) || (lenf == 0) ) - { - int i; - for(i = 0; i < n; i++) - fp2_set(&h[i], 0); - - return; - } - - // Multiplication mod x - if(n == 1) - { - fp2_mul(&h[0], &f[0], &g[0]); - return; - } - - // Case when no reduction is necessary - if(n >= lenf + leng - 1) - { - int i; - poly_mul(h, f, lenf, g, leng); - for(i = lenf + leng - 1; i < n; i++) - fp2_set(&h[i], 0); - - return; - } - - // Multiplication by a constant - if(leng == 1) - { - fp2_t fc[n], gc; // Copies for f,g - int i; - for(i = 0; i < n; i++) - fp2_copy(&fc[i], &f[i]); - - fp2_copy(&gc, &g[0]); - for(i = 0; i < n; i++) - fp2_mul(&h[i], &fc[i], &gc); - - return; - } - - - // Multiplication mod x^2 of two linear polynomials - if(n == 2) - { - fp2_t fg[2]; - - fp2_mul(&fg[1], &f[1], &g[0]); - fp2_mul(&fg[0], &f[0], &g[1]); - fp2_add(&fg[1], &fg[1], &fg[0]); - fp2_mul(&h[0], &f[0], &g[0]); - fp2_copy(&h[1], &fg[1]); - return; - } - - // Cases for multiplication mod x^3 - if(n == 3) - { - - // Multiplication mod x^3 of linear by cuadratic or linear - if(leng == 2) - { - fp2_t t0, t1, t2; - fp2_add(&t0, &f[0], &f[1]); - fp2_add(&t1, &g[0], &g[1]); - fp2_mul(&t1, &t0, &t1); - fp2_mul(&t2, &f[0], &g[0]); - fp2_sub(&t1, &t1, &t2); - fp2_mul(&t0, &f[1], &g[1]); - fp2_sub(&t1, &t1, &t0); - fp2_mul(&h[2], &f[2], &g[0]); - fp2_add(&h[2], &t0, &h[2]); - fp2_copy(&h[1], &t1); - fp2_copy(&h[0], &t2); - return; - } - - // Multiplication mod x^3 of two cuadratic polynomials - if(leng == 3) - { - fp2_t t0, t1, t2, t3, t4; - fp2_mul(&t0, &f[0], &g[0]); - fp2_mul(&t1, &f[1], &g[1]); - fp2_add(&t2, &f[0], &f[1]); - fp2_add(&t3, &g[0], &g[1]); - fp2_mul(&t2, &t2, &t3); - fp2_sub(&t2, &t2, &t0); - fp2_sub(&t2, &t2, &t1); - - fp2_add(&t3, &f[0], &f[2]); - fp2_add(&t4, &g[0], &g[2]); - fp2_mul(&t3, &t3, &t4); - fp2_mul(&t4, &f[2], &g[2]); - fp2_sub(&t3, &t3, &t4); - fp2_sub(&t3, &t3, &t0); - fp2_add(&h[2], &t3, &t1); - - fp2_copy(&h[0], &t0); - fp2_copy(&h[1], &t2); - return; - } - } - - // Special case for small values, currently only used for n=4, leng=4 - if((n==4) && (leng==4)) - { - int i, j, k; - int S = n; - const int nf = n >> 1; - const int nc = n - nf; - fp2_t t0, t1; - - for(i = 0; i < nf; i++) - S = S + n - 1 - 2*i; - - fp2_t c[S]; - - for(i = 0; i < n; i++) - fp2_mul(&c[i], &f[i], &g[i]); - - k = n; - for(i = 0; i < nf; i++) - { - for(j = 0; j < n-2*i-1; j++) - { - fp2_add(&t0, &f[i], &f[i+j+1]); - fp2_add(&t1, &g[i], &g[i+j+1]); - fp2_mul(&c[k], &t0, &t1); - fp2_add(&t0, &c[i], &c[i+j+1]); - fp2_sub(&c[k], &c[k], &t0); - k++; - } - } - - fp2_copy(&c[n-1], &c[0]); - for(i = 1; i < nf; i++) - { - for(j = 1; j < n-2*i; j++) - fp2_add(&c[n+2*i-1+j], &c[n+2*i-1+j], &c[(1+i)*n-i*i-1+j]); - } - - for(i = 1; i < nc; i++) - fp2_add(&c[n+2*i-1], &c[n+2*i-1], &c[i]); - - for(i = n-1; i < 2*n-1; i++) - fp2_copy(&h[i-n+1], &c[i]); - - return; - } - - - // All other cases (n >= 4 and reduction is necessary for f*g but not f nor g): - - // Strategy is to split f, g into odd and even powers. E.j. f(x) = f0(x^2) + x*f1(x^2) - // Such that f*g(x) = fg_0(x^2) + x*fg_01(x^2) + x^2*fg_1(x^2) where: - // fg_0(x) = f0(x)*g0(x) mod x^ceil(n/2) - // fg_01(x) = (f0(x)g1(x)+f1(x)g0(x)) mod x^floor(n/2) - // fg_1(x) = f1(x)g1(x) mod x^ceil(n/2-1) - - int i; - const int l1 = n >> 1; - const int l0 = n - l1; - - //Split f - const int lenf1 = lenf >> 1; - const int lenf0 = lenf - lenf1; - fp2_t f0[lenf0], f1[lenf1]; - for(i = 0; i < lenf1; i++) - { - fp2_copy(&f0[i], &f[2*i]); - fp2_copy(&f1[i], &f[2*i+1]); - } - - if(lenf0 > lenf1) - fp2_copy(&f0[lenf0-1], &f[lenf - 1]); - - //Split g - const int leng1 = leng >> 1; - const int leng0 = leng - leng1; - fp2_t g0[leng0], g1[leng1]; - for(i = 0; i < leng1; i++) - { - fp2_copy(&g0[i], &g[2*i]); - fp2_copy(&g1[i], &g[2*i+1]); - } - - if(leng0 > leng1) - fp2_copy(&g0[leng0-1], &g[leng - 1]); - - //Compute f01 = f0 + f1 - fp2_t f01[lenf0]; - for(i = 0; i < lenf1; i++) - fp2_add(&f01[i], &f0[i], &f1[i]); - - if(lenf0 > lenf1) - fp2_copy(&f01[lenf0-1], &f0[lenf0-1]); - - //Compute g01 = g0 + g1 - fp2_t g01[leng0]; - for(i = 0; i < leng1; i++) - fp2_add(&g01[i], &g0[i], &g1[i]); - - if(leng0 > leng1) - fp2_copy(&g01[leng0-1], &g0[leng0-1]); - - //Compute fg_0(x) - int n0 = lenf0 + leng0 - 1; - if(n0 > l0) - n0 = l0; - - fp2_t fg_0[n0]; - poly_mul_low(fg_0, n0, f0, lenf0, g0, leng0); - - //Compute fg_1(x) - int n1 = lenf1 + leng1 - 1; - if(n1 > l1) - n1 = l1; - - fp2_t fg_1[n1]; - poly_mul_low(fg_1, n1, f1, lenf1, g1, leng1); - - //Compute fg_01(x) = f_01(x) * g_01(x) mod x^floor(n/2); - int n01 = lenf0 + leng0 -1; - if(n01 > l1) - n01 = l1; - - fp2_t fg_01[n01]; - poly_mul_low(fg_01, n01, f01, lenf0, g01, leng0); - - //Substractic fg_0 and fg_1 from fg_01 - //Note that the sizes satisfy n1 <= n01 <= n0 - //Result can be stored directly to h already - - i = 0; - while(i < n1) - { - fp2_sub(&fg_01[i], &fg_01[i], &fg_0[i]); - fp2_sub(&h[2*i+1], &fg_01[i], &fg_1[i]); - i++; - } - while(i < n01) - { - fp2_sub(&h[2*i+1], &fg_01[i], &fg_0[i]); - i++; - } - - //Combine the result for fg_1 and fg_0 - fp2_copy(&h[0], &fg_0[0]); - for(i = 1; i < n1; i++) - fp2_add(&h[2*i], &fg_0[i], &fg_1[i-1]); - if(2*n1 < n) - fp2_add(&h[2*n1], &fg_0[n1], &fg_1[n1-1]); - - return; -} - - -// The following two function compute the middle section of a product and are based -// on "The Middle Product Algorithm, I." by G. Hanrot. M. Quercia, and P. Zimmermann -void quasi_poly_mul_middle(poly h, const poly g, const int leng, const poly f, const int lenf) -{ - // Computes the middle part of the product, sepcifically fg[lenf-leng:lenf], - // for the special case of lenf = 2*leng-1 - // REQUIRES that h have space for leng terms and that lenf = 2*leng-1 - // NOT responsible for terms in h beyond h[leng-1] - assert(lenf >= (2*leng - 1)); - - if(leng == 0) - return; - - if(leng == 1) - { - fp2_mul(&h[0], &g[0], &f[0]); - return; - } - - int i; - const int leng0 = leng >> 1; - const int leng1 = leng - leng0; - const int lenF = 2*leng1-1; - fp2_t F[lenF], G[leng1]; - - fp2_t A[leng1]; - for(i = 0; i < lenF; i++) - fp2_add(&F[i], &f[i], &f[i+leng1]); - - quasi_poly_mul_middle(A, &(g[leng0]), leng1, F, lenF); - - fp2_t B[leng1]; - if(leng & 1) - { - fp2_copy(&G[0], &g[leng0]); - for(i = 0; i < leng0; i++) - fp2_sub(&G[i+1], &g[leng1+i], &g[i]); - - } - else - { - for(i = 0; i < leng0; i++) - fp2_sub(&G[i], &g[leng1+i], &g[i]); - - } - - quasi_poly_mul_middle(B, G, leng1, &(f[leng1]), lenF); - - fp2_t C[leng0]; - for(i = 0; i < 2*leng0-1; i++) - fp2_add(&F[i], &f[i+leng1], &f[i+2*leng1]); - - quasi_poly_mul_middle(C, g, leng0, F, 2*leng0-1); - - for(i = 0; i < leng1; i++) - fp2_sub(&h[i], &A[i], &B[i]); - - for(i = 0; i < leng0; i++) - fp2_add(&h[i+leng1], &C[i], &B[i]); - - return; -} - -void poly_mul_middle(poly h, const poly g, const int leng, const poly f, const int lenf) -{ - // Computes the middle part of the product, sepcifically fg[lenf-leng:lenf], for lenf >= leng - // Note that this is equivalent to the highest leng terms of fg mod x^(lenf) - // REQUIRES that h have space for leng terms and that lenf > leng - // NOT responsible for terms in h beyond h[leng-1] - - int i; - - // Case of deg(f) odd and deg(g) = floor(deg(f)/2), ie lengths n and 2n - if ( (leng == lenf >> 1) && !(lenf & 1) ) - { - // f1 = f[1:]+[0] - fp2_t f1[lenf]; - for(i = 0; i < lenf - 1; i++) - fp2_copy(&f1[i], &f[i+1]); - - fp2_set(&f1[lenf-1], 0); - quasi_poly_mul_middle(h, g, leng, f1, lenf); - return; - } - - // Case of deg(f) odd and deg(g) = ceil(deg(f)/2), ie lengths n and 2n-2 - if( (leng == (lenf>>1)+1) && !(lenf & 1) ) - { - // f1 = [0]+f[:] - fp2_t f1[lenf+1]; - fp2_set(&f1[0], 0); - for(i = 0; i < lenf; i++) - fp2_copy(&f1[i+1], &f[i]); - - quasi_poly_mul_middle(h, g, leng, f1, lenf+1); - return; - } - - // Case of deg(f) even and deg(g) = deg(f)/2, ie lengths n and 2n-1 - if( (leng == (lenf>>1)+1) && (lenf & 1) ) - { - quasi_poly_mul_middle(h, g, leng, f, lenf); - return; - } - - - // Unbalanced case, for deg(g) > ceil(deg(f)/2) or deg(g) < floor(deg(f)/2) - - if(leng == 0) - return; - - const int lenF0 = lenf-leng; - fp2_t F0[lenF0], G[leng]; - for(i = 0; i < lenF0; i++) - fp2_copy(&F0[i], &f[lenF0-1-i]); - - for( i = 0; i < leng; i++) - fp2_copy(&G[i], &g[leng-1-i]); - - fp2_t fg_low[leng-1], fg_low_reverse[leng-1]; - poly_mul_low(fg_low, leng-1, F0, lenF0, G, leng); - for(i = 0; i < leng-1; i++) - fp2_copy(&fg_low_reverse[i], &fg_low[leng-2-i]); - - fp2_t fg_high[leng]; - poly_mul_low(fg_high, leng, &(f[lenF0]), leng, g, leng); - - for(i = 0; i < leng-1; i++) - fp2_add(&h[i], &fg_low_reverse[i], &fg_high[i]); - - fp2_copy(&h[leng-1], &fg_high[leng-1]); - return; -} - - -void poly_mul_selfreciprocal(poly h, const poly g, const int leng, const poly f, const int lenf) -{ - // Computes the product h= f*g of self reciprocal polynomials of same length - // Note: a polynomial is self reciprocal if f(x) = x^deg(f) * f(1/x), or equivalently - // if the list of coefficients is a palyndrome. - // REQUIRES that h have space for lenf+leng-1 entries - // NOT responsible for terms in h beyond h[lenf+leng-1] - - // Case for same length - if(lenf==leng) - { - if(lenf == 0) - return; - - if(lenf == 1) - { - fp2_mul(&h[0], &g[0], &f[0]); - return; - } - - if(lenf == 2) - { - fp2_mul(&h[0], &g[0], &f[0]); - fp2_add(&h[1], &h[0], &h[0]); - fp2_copy(&h[2], &h[0]); - return; - } - - if(lenf == 3) - { - fp2_t t0, t1; - fp2_add(&t0, &g[0], &g[1]); - fp2_add(&t1, &f[0], &f[1]); - fp2_mul(&t1, &t0, &t1); - fp2_mul(&t0, &g[0], &f[0]); - fp2_mul(&h[2], &g[1], &f[1]); - fp2_add(&h[2], &h[2], &t0); - fp2_copy(&h[0], &t0); - fp2_sub(&h[1], &t1, &h[2]); - fp2_add(&h[2], &h[2], &h[0]); - fp2_copy(&h[3], &h[1]); - fp2_copy(&h[4], &h[0]); - return; - } - - if(lenf == 4) - { - fp2_t t0, t1; - fp2_add(&t0, &g[0], &g[1]); - fp2_add(&t1, &f[0], &f[1]); - fp2_mul(&t1, &t0, &t1); - fp2_mul(&t0, &g[0], &f[0]); - fp2_mul(&h[3], &g[1], &f[1]); - fp2_copy(&h[2], &t1); - fp2_copy(&h[0], &t0); - fp2_sub(&h[2], &h[2], &h[0]); - fp2_sub(&h[1], &h[2], &h[3]); - fp2_add(&h[3], &h[3], &h[0]); - fp2_add(&h[3], &h[3], &h[3]); - fp2_copy(&h[4], &h[2]); - fp2_copy(&h[5], &h[1]); - fp2_copy(&h[6], &h[0]); - return; - } - - if(lenf == 5) - { - fp2_t t0, t1, t2, t3, t4; - fp2_sub(&t1, &g[1], &g[0]); - fp2_sub(&t0, &f[0], &f[1]); - fp2_mul(&t1, &t1, &t0); - fp2_sub(&t2, &g[2], &g[0]); - fp2_sub(&t0, &f[0], &f[2]); - fp2_mul(&t2, &t0, &t2); - fp2_sub(&t3, &g[2], &g[1]); - fp2_sub(&t0, &f[1], &f[2]); - fp2_mul(&t3, &t3, &t0); - fp2_mul(&t0, &g[1], &f[1]); - fp2_mul(&t4, &g[2], &f[2]); - fp2_mul(&h[0], &g[0], &f[0]); - fp2_copy(&h[1], &t1); - fp2_copy(&h[2], &t2); - fp2_copy(&h[3], &t3); - fp2_add(&h[5], &t0, &h[0]); - fp2_add(&h[1], &h[1], &h[5]); - fp2_add(&h[3], &h[3], &h[1]); - fp2_add(&h[4], &h[5], &t4); - fp2_add(&h[4], &h[4], &h[5]); - fp2_add(&h[2], &h[2], &h[5]); - fp2_add(&h[2], &h[2], &t4); - fp2_add(&h[3], &h[3], &t0); - fp2_add(&h[3], &h[3], &t4); - fp2_copy(&h[5], &h[3]); - fp2_copy(&h[6], &h[2]); - fp2_copy(&h[7], &h[1]); - fp2_copy(&h[8], &h[0]); - return; - } - - // General case for same lengths - if(lenf & 1) - { - // Odd length - // Strategy is to split f, g into odd and even powers. E.j. f(x) = f0(x^2) + x*f1(x^2) - // Such that f*g(x) = h0(x^2) + x*h01(x^2) + x^2*h1(x^2) where: - // h0(x) = f0(x)*g0(x) - // h01(x) = (f0(x)g1(x)+f1(x)g0(x)) - // h1(x) = f1(x)g1(x) - - int i; - const int len1 = lenf >> 1; - const int len0 = len1 + 1; - - fp2_t g0[len0], f0[len0], g1[len1], f1[len1]; - for(i = 0; i < len1; i++) - { - fp2_copy(&g0[i], &g[2*i]); - fp2_copy(&f0[i], &f[2*i]); - fp2_copy(&g1[i], &g[2*i+1]); - fp2_copy(&f1[i], &f[2*i+1]); - } - - fp2_copy(&g0[len1], &g[2*len1]); - fp2_copy(&f0[len1], &f[2*len1]); - - fp2_t h0[2*len0-1]; - poly_mul_selfreciprocal(h0, g0, len0, f0, len0); - - fp2_t h1[2*len1-1]; - poly_mul_selfreciprocal(h1, g1, len1, f1, len1); - - fp2_t h01[2*len0-1]; - for(i = 0; i < len1; i++) - { - fp2_add(&g0[i], &g0[i], &g1[i]); - fp2_add(&f0[i], &f0[i], &f1[i]); - fp2_add(&g0[i+1], &g0[i+1], &g1[i]); - fp2_add(&f0[i+1], &f0[i+1], &f1[i]); - } - poly_mul_selfreciprocal(h01, g0, len0, f0, len0); - - // Mixing results for the odd degree part - for(i = 0; i < 2*len0-1; i++) - fp2_sub(&h01[i], &h01[i], &h0[i]); - - for(i = 0; i < 2*len1-1; i++) - fp2_sub(&h01[i], &h01[i], &h1[i]); - - for(i = 0; i < 2*len1-1; i++) - { - fp2_sub(&h01[i+1], &h01[i+1], &h1[i]); - fp2_sub(&h01[i+1], &h01[i+1], &h1[i]); - } - for(i = 0; i < 2*len1-1; i++) - fp2_sub(&h01[i+2], &h01[i+2], &h1[i]); - - fp2_copy(&h[1], &h01[0]); - for(i = 1; i < 2*len0-2; i++) - fp2_sub(&h[2*i+1], &h01[i], &h[2*i-1]); - - // Mixing results for the even degree parts - fp2_copy(&h[0], &h0[0]); - for(i = 1; i < 2*len1; i++) - fp2_add(&h[2*i], &h0[i], &h1[i-1]); - - fp2_copy(&h[4*len1], &h0[2*len1]); - return; - } - else - { - // Even length - // Strategy is to spli f and g, into - // f(x) = f0(x) + x^nf*f1(x) and g(x) = g0(x) + x^nf*g1(x) where nf = floor(lenf/2) - // such that f(x)*g(x) = fg_low(x) + x^nf*fg_mid(x) + x^2nf*fg_high(x) where: - // fg_low(x) = f0(x)*g0(x) - // fg_mid(x) = f0(x)*g1(x) + f1(x)*g0(x) <-[reverse of f0g1] - // fg_high(x) = f1(x)*g1(x) <-[reverse of fg_low] - - int i; - const int half = leng >> 1; - fp2_t h1[leng-1]; - - poly_mul(h, g, half, f, half); - poly_mul(h1, g, half, &(f[half]), half); - - fp2_set(&h[leng-1], 0); - for(i = 0; i < half; i++) - { - fp2_add(&h[half+i], &h[half+i], &h1[i]); - fp2_add(&h[half+i], &h[half+i], &h1[leng-2-i]); - } - - for(i = 0; i < leng-1; i++) - fp2_copy(&h[2*leng-2-i], &h[i]); - - return; - } - } - else - { - // Case for different lengths - const int m = (lenf+leng) >> 1; - int i; - - poly_mul_low(h, m, g, leng, f, lenf); - for(i = m; i < lenf+leng-1; i++) - fp2_copy(&h[i], &h[lenf+leng-2-i]); - - return; - } -} - - -void product_tree(poly H[], int DEG[], const int root, const poly F[], const int LENF, const int n) -{ - // Given an array F containing n polynomials of the same length LENF, - // Writes the product tree of the polynomials to the tree rooted at H[root]. - // - // The tree is represented by an array where, for node H[i], the left child is H[2*i+1] and - // the right child is H[2*i+2]. The root of the complete tree is intended to be H[0]. - // - // Also writes to DEG the tree containing the degree of the corresponding polynomials. - // - // REQUIRES H and DEG to have enough space for 2^(k+2)-1 terms where k = ceil(log2(n)) - - int i; - if(n == 1) - { - H[root] = malloc(sizeof(fp2_t)*LENF); - for(i = 0; i < LENF; i++) - fp2_copy(&H[root][i], &F[0][i]); - - DEG[root] = LENF-1; - return; - } - - const int n1 = n >> 1; - const int n0 = n - n1; - const int left = 2*root+1; - const int right = left + 1; - product_tree(H, DEG, left, F, LENF, n0); - product_tree(H, DEG, right, &(F[n0]), LENF, n1); - DEG[root] = DEG[left] + DEG[right]; - H[root] = malloc(sizeof(fp2_t)*(DEG[left]+DEG[right]+1)); - poly_mul(H[root], H[left], DEG[left]+1, H[right], DEG[right]+1); - return; -} - - - -void product_tree_LENFeq2(poly H[], int DEG[], const int root, const fp2_t F[][2], const int n) -{ - // Same as product tree but allows F to be given as a double array with LENF fixed to 2 - int i; - if(n == 1) - { - H[root] = malloc(sizeof(fp2_t)*2); - for(i = 0; i < 2; i++) - fp2_copy(&H[root][i], &F[0][i]); - - DEG[root] = 1; - return; - } - - const int n1 = n >> 1; - const int n0 = n - n1; - const int left = 2*root+1; - const int right = left + 1; - product_tree_LENFeq2(H, DEG, left, F, n0); - product_tree_LENFeq2(H, DEG, right, &(F[n0]), n1); - DEG[root] = DEG[left] + DEG[right]; - H[root] = malloc(sizeof(fp2_t)*(DEG[left]+DEG[right]+1)); - poly_mul(H[root], H[left], DEG[left]+1, H[right], DEG[right]+1); - return; -} - - - -void product_tree_LENFeq3(poly H[], int DEG[], const int root, const fp2_t F[][3], const int n) -{ - // Same as product tree but allows F to be given as a double array with LENF fixed to 3 - int i; - if(n == 1) - { - H[root] = malloc(sizeof(fp2_t)*3); - for(i = 0; i < 3; i++) - fp2_copy(&H[root][i], &F[0][i]); - - DEG[root] = 3-1; - return; - } - - const int n1 = n >> 1; - const int n0 = n - n1; - const int left = 2*root+1; - const int right = left + 1; - product_tree_LENFeq3(H, DEG, left, F, n0); - product_tree_LENFeq3(H, DEG, right, &(F[n0]), n1); - DEG[root] = DEG[left] + DEG[right]; - H[root] = malloc(sizeof(fp2_t)*(DEG[left]+DEG[right]+1)); - poly_mul(H[root], H[left], DEG[left]+1, H[right], DEG[right]+1); - return; -} - - -void product_tree_selfreciprocal(poly H[], int DEG[], const int root, const poly F[], const int LENF, const int n) -{ - // Same as product_tree but for selfreciprocal inputs - - int i; - if(n == 1) - { - H[root] = malloc(sizeof(fp2_t)*LENF); - for(i = 0; i < LENF; i++) - fp2_copy(&H[root][i], &F[0][i]); - - DEG[root] = LENF-1; - return; - } - - const int n1 = n >> 1; - const int n0 = n - n1; - const int left = 2*root+1; - const int right = left + 1; - product_tree_selfreciprocal(H, DEG, left, F, LENF, n0); - product_tree_selfreciprocal(H, DEG, right, &(F[n0]), LENF, n1); - DEG[root] = DEG[left] + DEG[right]; - H[root] = malloc(sizeof(fp2_t)*(DEG[left]+DEG[right]+1)); - poly_mul_selfreciprocal(H[root], H[left], DEG[left]+1, H[right], DEG[right]+1); - return; -} - -void product_tree_selfreciprocal_LENFeq3(poly H[], int DEG[], const int root, const fp2_t F[][3], const int n) -{ - // Same as product_tree_selfreciprocal but allows F to be given as a double array with LENF fixed to 3 - - int i; - if(n == 1) - { - H[root] = malloc(sizeof(fp2_t)*3); - for(i = 0; i < 3; i++) - fp2_copy(&H[root][i], &F[0][i]); - - DEG[root] = 3-1; - return; - } - - const int n1 = n >> 1; - const int n0 = n - n1; - const int left = 2*root+1; - const int right = left + 1; - product_tree_selfreciprocal_LENFeq3(H, DEG, left, F, n0); - product_tree_selfreciprocal_LENFeq3(H, DEG, right, &(F[n0]), n1); - DEG[root] = DEG[left] + DEG[right]; - H[root] = malloc(sizeof(fp2_t)*(DEG[left]+DEG[right]+1)); - poly_mul_selfreciprocal(H[root], H[left], DEG[left]+1, H[right], DEG[right]+1); - return; -} - -void clear_tree(poly H[], const int root, const int n) -{ - // Frees all dynamic memory in a polynomial tree rooted at H[root] and generated by n leafs - - if(n == 1) - { - free(H[root]); - return; - } - - clear_tree(H, 2*root+1, n-(n>>1)); - clear_tree(H, 2*root+2, n>>1); - free(H[root]); - return; -} - - - -void product(fp2_t *c, const fp2_t F[], const int n) -{ - // Given an array F of n constant polynomials, writes their product to c - int i; - - fp_mont_setone((*c).re);fp_set((*c).im,0); - - // Empty list must returns 1 - if (n == 0) - return; - - // At this step, we ensure there is at least one element in the list - fp2_copy(&*c, &F[0]); - for(i = 1; i < n; i++) - fp2_mul(&*c, &*c, &F[i]); - - return; -} diff --git a/src/ec/ref/ecx/poly-redc.c b/src/ec/ref/ecx/poly-redc.c deleted file mode 100644 index 393e87f..0000000 --- a/src/ec/ref/ecx/poly-redc.c +++ /dev/null @@ -1,349 +0,0 @@ -#define _POLY_MUL_REDC_H_ -#include "poly.h" -#include - -void reciprocal(poly h, fp2_t *c, const poly f, const int lenf, const int n){ - - // Writes a polynomial to h and a field element to c such that f*h = c mod x^n - // REQUIRES h to have space for n terms - // NOT responsible for terms in h beyond h[n-1] - - int i; - - // Case when f needs to be padded with zeroes - if(n > lenf) - { - fp2_t fpad[n]; - for(i = 0; i < lenf; i++) - fp2_copy(&fpad[i], &f[i]); - for(i = lenf; i < n; i++) - fp2_set(&fpad[i], 0); - reciprocal(h, c, fpad, n, n); - return; - } - - // Trivial case - if(n == 0) - { - fp2_set(&*c, 0); - return; - } - - // Case n = 1 - if(n == 1) - { - fp2_copy(&*c, &f[0]); - fp_mont_setone(h[0].re);fp_set(h[0].im,0); - return; - } - - // Case n = 2 - if(n == 2) - { - fp2_sqr(&*c, &f[0]); - fp2_copy(&h[0], &f[0]); - fp2_neg(&h[1], &f[1]); - return; - } - - // Case n = 3 - if(n == 3) - { - fp2_t t0, t1; - - fp2_sqr(&t0, &f[1]); - fp2_mul(&t1, &f[0], &f[2]); - fp2_sub(&t1, &t1, &t0); - fp2_mul(&t1, &t1, &f[0]); - - reciprocal(h, c, f, 2, 2); - fp2_mul(&h[0], &h[0], &*c); - fp2_mul(&h[1], &h[1], &*c); - fp2_neg(&h[2], &t1); - fp2_sqr(&*c, &*c); - return; - } - - // Case n = 4 - if(n == 4) - { - fp2_t t0, t1, t2, t3, g[2]; - - reciprocal(g, &t3, f, 2, 2); - fp2_sqr(&t0, &f[1]); - fp2_mul(&t1, &g[0], &f[2]); - fp2_mul(&t2, &g[0], &f[3]); - fp2_mul(&h[1], &g[1], &f[2]); - fp2_sub(&t0, &t1, &t0); - fp2_add(&t1, &t2, &h[1]); - fp2_mul(&t2, &t0, &g[0]); - fp2_mul(&h[1], &t0, &g[1]); - fp2_mul(&h[3], &t1, &g[0]); - fp2_add(&h[3], &h[1], &h[3]); - - fp2_mul(&h[0], &g[0], &t3); - fp2_mul(&h[1], &g[1], &t3); - fp2_neg(&h[2], &t2); - fp2_neg(&h[3], &h[3]); - fp2_sqr(&*c, &t3); - return; - } - - - // General case - // Compute the reciprocal g mod x^m for m = ceil(n/2) - // Then f*g-c is multiple of x^m so we only care about terms from m to n-1 - const int m = n - (n>>1); - fp2_t g[m], t[m], t0; - - reciprocal(g, &t0, f, lenf, m); - poly_mul_middle(t, g, m, f, n); - poly_mul_low(t, n-m, g, m, &(t[2*m-n]), n-m); - for(i = 0; i < m; i++) - fp2_mul(&h[i], &g[i], &t0); - for(i = m; i < n; i++) - fp2_neg(&h[i], &t[i-m]); - fp2_sqr(&*c, &t0); - return; -} - - -void poly_redc(poly h, const poly g, const int leng, const poly f, const int lenf,// - const poly f_rev_inv, const fp2_t c) -{ - // Computes h(x) = a * g(x) mod f(x) for some scalar a, writting lenf-1 terms to h. - // REQUIRES an inverse f_rev_inv such that f_rev*f_rev_inv = c mod x^(leng-lenf+1), - // where f_rev is the polynomial with the coefficients of f listed in reverse order. - // The scalar a is equal to c, except for special cases: - // - If leng= DEG[0] and that R,A have enough space for the tree (see product_tree) - - if(n == 0) - return; - - const int parent = (root-1) >> 1; - const int brother = root - 1 + 2*(root & 1); - int lenr; - - if(root > 0) - lenr = DEG[parent] - DEG[root]; - else - lenr = leng - DEG[root]; - - R[root] = malloc(sizeof(fp2_t)*lenr); - - // ---------------------------------- - // base cases determined by poly_redc - if(n == 1) - return; - - - // case for computing g mod f when len(f), len(g) = 3 - if (DEG[root] == 2 && lenr == 1) - { - reciprocal_tree(R, A, lenr-1, H, DEG, 2*root+1, n-(n>>1)); - reciprocal_tree(R, A, lenr-1, H, DEG, 2*root+2, n>>1); - return; - } - - // ---------------------------------- - - int i; - - // When the parent's inverse was calculated to a smaller modulus, need to invert from scratch - if(root == 0 || leng < lenr) - { - for(i = 0; i < lenr && i < DEG[root]+1; i++) - fp2_copy(&R[root][i], &H[root][DEG[root]-i]); - for(i = DEG[root]+1; i < lenr; i++){ - fp2_set(&R[root][i], 0); - } - reciprocal(R[root], &(A[root]), R[root], lenr, lenr); - } - else - { - // When parent's inverse was to a greater/equal modulus, this inverse can be obtained from it - for(i = 0; i < lenr; i++) - fp2_copy(&R[root][i], &H[brother][DEG[brother]-i]); - poly_mul_low(R[root], lenr, R[parent], leng, R[root], lenr); - fp2_copy(&A[root], &A[parent]); - } - - // Now move on to the children - reciprocal_tree(R, A, lenr-1, H, DEG, 2*root+1, n-(n>>1)); - reciprocal_tree(R, A, lenr-1, H, DEG, 2*root+2, n>>1); - return; -} - - -void multieval_unscaled(fp2_t REM[], const poly g, const int leng, const poly R[], const fp2_t A[],// - const poly H[], const int DEG[], const int root, const int n) -{ - // Given the product tree H and reciprocal tree R,A generated by f_0, ... , f_{n-1}, - // with corresponding degrees tree DEG[] and rooted at root, writes the constant term - // of c_i*g mod f_i to REM[i]. The constants c_i are unspecified, but are a function - // only of leng and f_0,...,f_{n-1} so they cancel out when taking the ratios of - // remainders of different g's of the same length. - // - // REQUIRES REM to have space for n terms - - if(n == 0) - return; - - fp2_t g_mod[DEG[root]]; - poly_redc(g_mod, g, leng, H[root], DEG[root]+1, R[root], A[root]); - - if(n == 1) - { - fp2_copy(&REM[0], &g_mod[0]); - return; - } - - multieval_unscaled(REM, g_mod, DEG[root], R, A, H, DEG, 2*root+1, n-(n>>1)); - multieval_unscaled(&(REM[n-(n>>1)]), g_mod, DEG[root], R, A, H, DEG, 2*root+2, n>>1); - return; -} - - -void multieval_scaled(fp2_t REM[], const poly G, const poly H[], // - const int DEG[], const int root, const int n) -{ - // Given the product tree H generated by LINEAR f_0,...,f_{n-1} rooted at root and with - // corresponding degrees tree DEG, writes the constant term of c_i * g mod f_i(x) to REM[i] - // The constants c_i are unspecified but are only a function of leng and f_0,...,f_{n-1}, - // so they cancel out when taking the ratios of remainders of different g's of the same length. - // - // REQUIRES REM to have space for n terms and n > 1 - // Also REQUIRES G = rev((rev(g mod F)) * F_rev_inv mod x^deg(F)-1) where F = H[root] - // and F_rev_inv is its reverse's reciprocal mod x^deg(F) - - if(root == 0) - { - if(n == 1) - { - fp2_copy(&REM[0], &G[DEG[root]-1]); - return; - } - else - { - multieval_scaled(REM, G, H, DEG, 2*root+1, n-(n>>1)); - multieval_scaled(&(REM[n-(n>>1)]), G, H, DEG, 2*root+2, n>>1); - return; - } - } - - const int parent = (root-1) >> 1; - const int brother = root - 1 + 2*(root & 1); - const int uncle = parent - 1 + 2*(parent & 1); - fp2_t fg[DEG[brother]+1]; - - if(root > 2) - poly_mul_middle(fg, H[brother], DEG[brother]+1, G, DEG[uncle]+1); - else - poly_mul_middle(fg, H[brother], DEG[brother]+1, G, DEG[0]); - - - if(n == 1) - { - fp2_copy(&REM[0], &fg[DEG[brother]]); - return; - } - - multieval_scaled(REM, fg, H, DEG, 2*root+1, n-(n>>1)); - multieval_scaled(&(REM[n-(n>>1)]), fg, H, DEG, 2*root+2, n>>1); - return; -} diff --git a/src/ec/ref/ecx/tedwards.c b/src/ec/ref/ecx/tedwards.c deleted file mode 100755 index b9af048..0000000 --- a/src/ec/ref/ecx/tedwards.c +++ /dev/null @@ -1,231 +0,0 @@ -#include -#include - -// a*x^2+y^2=1+d*x^2*y^2 -// a = A.x/A.z + 2, d = A.x/A.z - 2 - -void ted_init(ted_point_t* P) -{ // Initialize point as identity element (X:Y:Z:T) <- (0:1:1:0) - fp_t one = {0}; - - memset((digit_t*)P, 0, NWORDS_FIELD*RADIX*8/8); - one[0] = 1; - fp_tomont(P->x.re, one); -} - -void copy_ted_point(ted_point_t* P, ted_point_t const* Q) -{ - fp2_copy(&(P->x), &(Q->x)); - fp2_copy(&(P->y), &(Q->y)); - fp2_copy(&(P->z), &(Q->z)); - fp2_copy(&(P->t), &(Q->t)); -} - -void ted_dbl(ted_point_t *Q, ted_point_t const *P, ec_curve_t const* E) -{ - // A = X1^2 - // B = Y1^2 - // C = 2*Z1^2 - // D = a*A - // K = (X1+Y1)^2-A-B - // G = D+B - // F = G-C - // H = D-B - // X3 = K*F - // Y3 = G*H - // T3 = K*H - // Z3 = F*G - - // TODO: neutral element - fp2_t A, B, C, D, K, G, F, H; - - fp2_sqr(&A, &P->x); - fp2_sqr(&B, &P->y); - fp2_sqr(&C, &P->z); - fp2_add(&C, &C, &C); - fp2_mul(&D, &A, &E->A); - fp2_add(&K, &P->x, &P->y); - fp2_sqr(&K, &K); - fp2_sub(&K, &K, &A); - fp2_sub(&K, &K, &B); - fp2_add(&G, &D, &B); - fp2_sub(&F, &G, &C); - fp2_sub(&H, &D, &B); - fp2_mul(&Q->x, &K, &F); - fp2_mul(&Q->y, &G, &H); - fp2_mul(&Q->t, &K, &H); - fp2_mul(&Q->z, &F, &G); -} - -void ted_add(ted_point_t* S, ted_point_t const* P, ted_point_t const* Q, ec_curve_t const* E) -{ - // A = X1*X2 - // B = Y1*Y2 - // C = Z1*T2 - // D = T1*Z2 - // K = D+C - // F = (X1-Y1)*(X2+Y2)+B-A - // G = B+a*A - // H = D-C - // X3 = K*F - // Y3 = G*H - // T3 = K*H - // Z3 = F*G - - // TODO: neutral element - - ted_point_t res; - - if (is_ted_equal(P, Q)) { - ted_dbl(S, P, E); - return; - } - //assert(!is_ted_equal(P, Q)); - - ted_neg(&res, P); - if (is_ted_equal(&res, Q)) { - ted_init(S); - return; - } - // assert(!ted_equal(&res,Q)); - fp2_t A, B, C, D, K, F, G, H, tmp; - - fp2_mul(&A, &P->x, &Q->x); - fp2_mul(&B, &P->y, &Q->y); - fp2_mul(&C, &P->z, &Q->t); - fp2_mul(&D, &P->t, &Q->z); - fp2_add(&K, &D, &C); - fp2_add(&F, &Q->x, &Q->y); - fp2_sub(&tmp, &P->x, &P->y); - fp2_mul(&F, &F, &tmp); - fp2_add(&F, &F, &B); - fp2_sub(&F, &F, &A); - fp2_mul(&G, &A, &E->A); - fp2_add(&G, &G, &B); - fp2_sub(&H, &D, &C); - fp2_mul(&res.x, &K, &F); - fp2_mul(&res.y, &G, &H); - fp2_mul(&res.t, &K, &H); - fp2_mul(&res.z, &F, &G); - - if (fp2_is_zero(&res.x) && fp2_is_zero(&res.y) && fp2_is_zero(&res.z)) { - ted_dbl(S, P, E); - } else { - copy_ted_point(S, &res); - } -} - -void ted_neg(ted_point_t* Q, ted_point_t const* P) -{ - fp2_neg(&Q->x, &P->x); - fp2_copy(&Q->y, &P->y); - fp2_copy(&Q->z, &P->z); - fp2_neg(&Q->t, &P->t); -} - -static bool xLIFT(fp2_t* y, const ec_point_t* P, const ec_curve_t* curve) -{ // Returns false if it is on the curve, true if it is on the twist - fp2_t z2, tmp1, tmp2, y2; - - if (fp2_is_zero(&P->z)) return false; - - // (X^2 + Z^2) C - fp2_sqr(&tmp1, &P->x); - fp2_sqr(&z2, &P->z); - fp2_add(&tmp1, &tmp1, &z2); - fp2_mul(&tmp1, &tmp1, &curve->C); - - // X^2C + AXZ + Z^2C - fp2_mul(&tmp2, &P->x, &P->z); - fp2_mul(&tmp2, &tmp2, &curve->A); - fp2_add(&tmp1, &tmp1, &tmp2); - - // X^3C + AX^2Z + XZ^2C = Z^3(Cx^3 + Ax^2 + Cx) = Z^3 C (B*y^2) = Z C (B*Y^2) // x = X/Z - fp2_mul(&tmp1, &tmp1, &P->x); - // (ZC)^(-1) - fp2_mul(&tmp2, &curve->C, &P->z); - - assert(!fp2_is_zero(&tmp2)); - - fp2_inv(&tmp2); - fp2_mul(&y2, &tmp1, &tmp2); // (B*Y^2) - fp2_copy(y, &y2); - - if (fp2_is_square(&y2)) { // on the curve - fp2_sqrt(y); - return false; - } else { // on the twist - fp2_t tmp = fp2_non_residue(); - fp2_mul(y, y, &tmp); - fp2_sqrt(y); - return true; - } -} - -//void mont_to_ted(ec_point_t* E, ec_point_t const* A, bool twist) -void mont_to_ted(ec_curve_t* ted_curve, ec_curve_t const* curve) -{ - fp2_t tmp, two; - - // A : y^2 = x^3 + (a/c)x^2 + x - fp2_copy(&tmp, &curve->C); - fp2_inv(&tmp); // 1/c - fp2_mul(&tmp, &tmp, &curve->A); // a/c - fp2_set(&two, 2); - fp2_tomont(&two, &two); - fp2_add(&ted_curve->A, &tmp, &two); // a/c + 2 - fp2_sub(&ted_curve->C, &tmp, &two); // a/c - 2 - //if (twist) { - // B = Fp2_inv(fp2_non_residue) - // tmp = fp2_non_residue(); - // fp2_mul2(&E->x,&tmp); - // fp2_mul2(&E->z,&tmp); - //} -} - -void mont_to_ted_point(ted_point_t* Q, ec_point_t const* P, ec_curve_t const* curve) -{ - if (fp2_is_zero(&P->z)) { - fp2_set(&Q->x, 0); - fp2_set(&Q->y, 1); - fp2_set(&Q->z, 1); - fp2_set(&Q->t, 0); - fp_tomont(Q->y.re, Q->y.re); - fp_tomont(Q->z.re, Q->z.re); - } else { - fp2_t tmp, y; - - xLIFT(&y, P, curve); - fp2_add(&tmp, &P->x, &P->z); - fp2_mul(&Q->x, &P->x, &tmp); - fp2_sub(&Q->y, &P->x, &P->z); - fp2_mul(&Q->y, &Q->y, &y); - fp2_mul(&Q->z, &tmp, &y); - fp2_copy(&Q->t, &Q->z); - fp2_inv(&Q->t); - fp2_mul(&Q->t, &Q->t, &Q->x); - fp2_mul(&Q->t, &Q->t, &Q->y); - } -} - -void ted_to_mont_point(ec_point_t* Q, ted_point_t const* P) -{ - fp2_add(&Q->x, &P->z, &P->y); - fp2_sub(&Q->z, &P->z, &P->y); -} - -bool is_ted_equal(ted_point_t const* P1, ted_point_t const* P2) -{ - fp2_t x1z2, y1z2; - fp2_t y2z1, x2z1; - fp2_t t1y2, t2y1; - - fp2_mul(&x1z2, &P1->x, &P2->z); - fp2_mul(&y1z2, &P1->y, &P2->z); - fp2_mul(&y2z1, &P2->y, &P1->z); - fp2_mul(&x2z1, &P2->x, &P1->z); - fp2_mul(&t1y2, &P1->t, &P2->y); - fp2_mul(&t2y1, &P2->t, &P1->y); - - return fp2_is_equal(&x1z2, &x2z1) && fp2_is_equal(&y1z2, &y2z1) && fp2_is_equal(&t1y2, &t2y1); -} \ No newline at end of file diff --git a/src/ec/ref/ecx/test/ec-test.c b/src/ec/ref/ecx/test/ec-test.c deleted file mode 100644 index 7a6f98f..0000000 --- a/src/ec/ref/ecx/test/ec-test.c +++ /dev/null @@ -1,18 +0,0 @@ -#include "ec-tests.h" - -int main(int argc, char* argv[]) -{ - if (argc < 3) { - printf("Please enter an argument: 'test' or 'bench' and \n"); - exit(1); - } - if (!strcmp(argv[1], "test")) { - TEST_LOOPS = atoi(argv[2]); - return !(ec_test() & dlog_test()); - } else if (!strcmp(argv[1], "bench")) { - BENCH_LOOPS = atoi(argv[2]); - return !(ec_run() & dlog_run()); - } else { - exit(1); - } -} \ No newline at end of file diff --git a/src/ec/ref/ecx/test/fp2-test.c b/src/ec/ref/ecx/test/fp2-test.c deleted file mode 100644 index 1cae73f..0000000 --- a/src/ec/ref/ecx/test/fp2-test.c +++ /dev/null @@ -1,142 +0,0 @@ -#include -#include -#include -#include -#include - -static int BENCH_LOOPS = 1000; // Number of iterations per bench -static int TEST_LOOPS = 512; // Number of iterations per test - -bool fp2_isequal(fp2_t a, fp2_t b){ - return fp_is_equal(a.re, b.re) && fp_is_equal(a.im, b.im); -} - -bool fp2_isone(fp2_t a){ - fp_t one; - bool res = 1; - fp_mont_setone(one); - for(int i = 0; i < NWORDS_FIELD; i++){ - res = res && (a.re[i] == one[i]); - res = res && (a.im[i] == 0); - } - return res; -} - -void fp2_print(char *name, fp2_t const a){ - fp2_t b; - fp2_set(&b, 1); - fp2_mul(&b, &b, &a); - printf("%s = 0x", name); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.re[i]); - printf(" + i*0x"); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.im[i]); - printf("\n"); -} - -// VERY NOT SECURE (testing only) -void fp2_random(fp2_t *a){ - for(int i = 0; i < NWORDS_FIELD; i++){ - a->re[i] = rand(); - a->im[i] = rand(); - } - // Normalize - fp2_t one; - fp_mont_setone(one.re);fp_set(one.im,0); - fp2_mul(&*a, &*a, &one); - // Update seed - srand((unsigned) a->re[0]); -} - -int main(int argc, char* argv[]) -{ - if (argc > 1) { - TEST_LOOPS = atoi(argv[1]); - } - - fp2_t fp2_0, fp2_1; - // ------------ - fp2_set(&fp2_0, 0); - fp_mont_setone(fp2_1.re);fp_set(fp2_1.im,0); - // ------------ - - int i; - fp2_t a, b, c, d; - fp_t e; - - for (i = 0; i < TEST_LOOPS; i++) - { - printf("[%3d%%] Testing fp2_t arithmetic", 100 * i / (int)TEST_LOOPS); - fflush(stdout); - printf("\r\x1b[K"); - - // Random elements of fp - fp2_random(&a); - fp2_random(&b); - fp2_copy(&c, &a); - c.re[0] += 1; - fp2_copy(&d, &b); - d.re[0] -= 1; - - assert(fp2_isequal(a,b) == 0); // different values check --> (a != b) - assert(fp2_isequal(c,c) == 1); // equal values check --> 1 (c == c) - - // Testing neg - fp2_set(&b, 0); - fp2_copy(&c, &a); - fp2_neg(&a, &a); - fp2_sub(&c, &b, &c); - assert(fp2_isequal(a,c) == 1); - - fp_mont_setone(a.re);fp_set(a.im,0); // Now a == 1 - fp2_set(&b, 0); // Now b == 0 - - assert(fp2_is_zero(&a) == 0); - assert(fp2_is_zero(&b) == 1); - - // testing c - c - fp2_sub(&d, &c, &c); - assert(fp2_is_zero(&d) == 1); - - // tetsing c * 0 - fp2_mul(&d, &c, &b); - assert(fp2_is_zero(&d) == 1); - - // tetsing c * 1 ... recall, in Montgomery domain R mod p plays the role of the 1 - fp_mont_setone(a.re);fp_set(a.im,0); - fp2_mul(&d, &c, &a); - assert(fp2_isequal(d, c) == 1); - - // fp_set(e, 1); // Now e == 1 - // fp2_pow(d, e, c); - // assert(fp2_isequal(d, c) == 1); - - // fp_set(e, 0); // Now e == 0 - // fp2_pow(d, e, c); - // assert(fp2_isone(d) == 1); - - // fp2_set(a, 1); // Now e == R mod p - // fp_random(e); - // fp2_pow(d, e, a); - // assert(fp2_isone(d) == 1); - - // Testing 1/a by computing (1/a) x a - fp2_random(&a); - fp2_copy(&b, &a); - fp2_inv(&a); - fp2_mul(&c, &a, &b); - assert(fp2_isone(c) == 1); - - fp2_random(&a); - fp2_sqr(&b, &a); - assert( fp2_is_square(&b) ); - - }; - - if(TEST_LOOPS){ - printf("[%2d%%] Tested fp2_t arithmetic:\tNo errors!\n", 100 * i /TEST_LOOPS); - } - printf("-- All tests passed.\n"); - return 0; -} diff --git a/src/ec/ref/ecx/test/isog-test.c b/src/ec/ref/ecx/test/isog-test.c deleted file mode 100644 index 193a67d..0000000 --- a/src/ec/ref/ecx/test/isog-test.c +++ /dev/null @@ -1,1067 +0,0 @@ -#include -#include -#include -#include -#include - -#include "isog.h" -#include "test-basis.h" -#include - -static int BENCH_LOOPS = 1000; // Number of iterations per bench -static int TEST_LOOPS = 128; // Number of iterations per test - -bool curve_equal(ec_curve_t* E1, ec_curve_t* E2){ - fp2_t a, b; - fp2_mul(&a, &E1->A, &E2->C); - fp2_mul(&b, &E2->A, &E1->C); - return fp2_is_equal(&a, &b); -} - -void random_scalar(fp_t k) -{ - for(int i = 0; i < NWORDS_FIELD; i++) - k[i] = rand(); -} - -void fp2_print(char *name, fp2_t const a){ - fp2_t b; - fp2_set(&b, 1); - fp2_mul(&b, &b, &a); - printf("%s = 0x", name); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.re[i]); - printf(" + i*0x"); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.im[i]); - printf("\n"); -} - -void point_print(char *name, ec_point_t P){ - fp2_t a; - if(fp2_is_zero(&P.z)){ - printf("%s = INF\n", name); - } - else{ - fp2_copy(&a, &P.z); - fp2_inv(&a); - fp2_mul(&a, &a, &P.x); - fp2_print(name, a); - } -} - -void curve_print(char *name, ec_curve_t E){ - fp2_t a; - fp2_copy(&a, &E.C); - fp2_inv(&a); - fp2_mul(&a, &a, &E.A); - fp2_print(name, a); -} - -// Affine Montgomery coefficient computation (A + 2C : 4C) --> A/C -void coeff(fp2_t *B, ec_curve_t const *E) -{ - fp2_t t; - fp2_add(&t, &E->A, &E->A); // (2 * A24) - fp2_sub(&t, &t, &E->C); // (2 * A24) - C24 - - fp2_copy(&*B, &E->C); - fp2_inv(&*B); // 1 / (C24) - fp2_add(&t, &t, &t); // 4*A = 2[(2 * A24) - C24] - fp2_mul(&*B, &t, &*B); // A/C = 2[(2 * A24) - C24] / C24 -} - -// ladder3pt computes x(P + [m]Q) -void ladder3pt(ec_point_t *R, fp_t const m, ec_point_t const *P, ec_point_t const *Q, ec_point_t const *PQ, ec_point_t const *A) -{ - ec_point_t X0, X1, X2; - copy_point(&X0, Q); - copy_point(&X1, P); - copy_point(&X2, PQ); - - int i,j; - uint64_t t; - for (i = 0; i < NWORDS_FIELD; i++) - { - t = 1; - for (j = 0 ; j < 64; j++) - { - swap_points(&X1, &X2, -((t & m[i]) == 0)); - xDBLADD(&X0, &X1, &X0, &X1, &X2, A); - swap_points(&X1, &X2, -((t & m[i]) == 0)); - t <<= 1; - }; - }; - copy_point(R, &X1); -} - -static void xTPL(ec_point_t* Q, const ec_point_t* P, const ec_point_t* A3) -{ - /* ----------------------------------------------------------------------------- * - * Differential point tripling given the montgomery coefficient A3 = (A+2C:A-2C) - * ----------------------------------------------------------------------------- */ - - fp2_t t0, t1, t2, t3, t4; - fp2_sub(&t0, &P->x, &P->z); - fp2_sqr(&t2, &t0); - fp2_add(&t1, &P->x, &P->z); - fp2_sqr(&t3, &t1); - fp2_add(&t4, &t1, &t0); - fp2_sub(&t0, &t1, &t0); - fp2_sqr(&t1, &t4); - fp2_sub(&t1, &t1, &t3); - fp2_sub(&t1, &t1, &t2); - fp2_mul(&Q->x, &t3, &A3->x); - fp2_mul(&t3, &Q->x, &t3); - fp2_mul(&Q->z, &t2, &A3->z); - fp2_mul(&t2, &t2, &Q->z); - fp2_sub(&t3, &t2, &t3); - fp2_sub(&t2, &Q->x, &Q->z); - fp2_mul(&t1, &t2, &t1); - fp2_add(&t2, &t3, &t1); - fp2_sqr(&t2, &t2); - fp2_mul(&Q->x, &t2, &t4); - fp2_sub(&t1, &t3, &t1); - fp2_sqr(&t1, &t1); - fp2_mul(&Q->z, &t1, &t0); -} - -static void xisog_2_singular(ec_point_t* B24, ec_point_t A24){ - fp2_t t0, four; - fp_mont_setone(four.re); - fp_set(four.im, 0); - fp2_add(&four, &four, &four); - fp2_add(&four, &four, &four); - fp2_add(&t0, &A24.x, &A24.x); - fp2_sub(&t0, &t0, &A24.z); - fp2_add(&t0, &t0, &t0); - fp2_inv(&A24.z); - fp2_mul(&t0, &t0, &A24.z); - fp2_copy(&K[0].x, &t0); - fp2_add(&B24->x, &t0, &t0); - fp2_sqr(&t0, &t0); - fp2_sub(&t0, &t0, &four); - fp2_sqrt(&t0); - fp2_neg(&K[0].z, &t0); - fp2_add(&B24->z, &t0, &t0); - fp2_add(&B24->x, &B24->x, &B24->z); - fp2_add(&B24->z, &B24->z, &B24->z); -} - -static void xeval_2_singular(ec_point_t* R, const ec_point_t* Q, const int lenQ){ - fp2_t t0, t1; - for(int i = 0; i < lenQ; i++){ - fp2_mul(&t0, &Q[i].x, &Q[i].z); - fp2_mul(&t1, &K[0].x, &Q[i].z); - fp2_add(&t1, &t1, &Q[i].x); - fp2_mul(&t1, &t1, &Q[i].x); - fp2_sqr(&R[i].x, &Q[i].z); - fp2_add(&R[i].x, &R[i].x, &t1); - fp2_mul(&R[i].z, &t0, &K[0].z); - } -} - -int main(int argc, char* argv[]) -{ - unsigned long long cycles, cycles1, cycles2; - - // ----------------- TEST FOR BASIS GENERATION ----------------- // - if (argc > 1) { - TEST_LOOPS = atoi(argv[1]); - } - - // Initial curve with A = 0 - ec_curve_t E; - fp2_set(&E.A, 0); - fp_mont_setone(E.C.re); - fp_set(E.C.im, 0); - - - for(int iter = 0; iter < TEST_LOOPS; iter++){ - - printf("[%3d%%] Testing basis generation", 100 * iter / (int)TEST_LOOPS); - fflush(stdout); - printf("\r\x1b[K"); - - // Curve coefficient A24=(A+2C:4C) - ec_point_t A24; - fp2_add(&A24.z, &E.C, &E.C); - fp2_add(&A24.x, &E.A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - - fp2_t j; - ec_j_inv(&j, &E); - - // Construct basis for 2^f torsion - ec_basis_t B2; - ec_curve_to_basis_2(&B2, &E); - - // Check that basis is rational - assert(ec_is_on_curve(&E, &B2.P)); - assert(ec_is_on_curve(&E, &B2.Q)); - assert(ec_is_on_curve(&E, &B2.PmQ)); - - // Compute P+Q - ec_point_t PpQ; - xADD(&PpQ, &B2.P, &B2.Q, &B2.PmQ); - - // Check the order - ec_point_t P2, Q2, PmQ2, PpQ2, R; - copy_point(&P2, &B2.P); - copy_point(&Q2, &B2.Q); - copy_point(&PmQ2, &B2.PmQ); - copy_point(&PpQ2, &PpQ); - for(int i = 0; i < POWER_OF_2 - 1; i++){ - xDBLv2(&P2, &P2, &A24); - assert(!ec_is_zero(&P2)); - xDBLv2(&Q2, &Q2, &A24); - assert(!ec_is_zero(&Q2)); - xDBLv2(&PmQ2, &PmQ2, &A24); - assert(!ec_is_zero(&PmQ2)); - xDBLv2(&PpQ2, &PpQ2, &A24); - assert(!ec_is_zero(&PpQ2)); - } - assert(is_point_equal(&PmQ2, &PpQ2)); - xDBLv2(&P2, &P2, &A24); - assert(ec_is_zero(&P2)); - xDBLv2(&Q2, &Q2, &A24); - assert(ec_is_zero(&Q2)); - xDBLv2(&PmQ2, &PmQ2, &A24); - assert(ec_is_zero(&PmQ2)); - xDBLv2(&PpQ2, &PpQ2, &A24); - assert(ec_is_zero(&PpQ2)); - - // Check the complete_basis function - fp_t k; - random_scalar(k); - ladder3pt(&R, k, &B2.P, &B2.Q, &B2.PmQ, &A24); - ec_complete_basis_2(&B2, &E, &R); - assert(is_point_equal(&R, &B2.P)); - - // Check that basis is rational - assert(ec_is_on_curve(&E, &B2.P)); - assert(ec_is_on_curve(&E, &B2.Q)); - assert(ec_is_on_curve(&E, &B2.PmQ)); - - // Compute P+Q - xADD(&PpQ, &B2.P, &B2.Q, &B2.PmQ); - - // Check the order - copy_point(&P2, &B2.P); - copy_point(&Q2, &B2.Q); - copy_point(&PmQ2, &B2.PmQ); - copy_point(&PpQ2, &PpQ); - for(int i = 0; i < POWER_OF_2 - 1; i++){ - xDBLv2(&P2, &P2, &A24); - assert(!ec_is_zero(&P2)); - xDBLv2(&Q2, &Q2, &A24); - assert(!ec_is_zero(&Q2)); - xDBLv2(&PmQ2, &PmQ2, &A24); - assert(!ec_is_zero(&PmQ2)); - xDBLv2(&PpQ2, &PpQ2, &A24); - assert(!ec_is_zero(&PpQ2)); - } - assert(is_point_equal(&PmQ2, &PpQ2)); - xDBLv2(&P2, &P2, &A24); - assert(ec_is_zero(&P2)); - xDBLv2(&Q2, &Q2, &A24); - assert(ec_is_zero(&Q2)); - xDBLv2(&PmQ2, &PmQ2, &A24); - assert(ec_is_zero(&PmQ2)); - xDBLv2(&PpQ2, &PpQ2, &A24); - assert(ec_is_zero(&PpQ2)); - - // Curve coefficient A3=(A+2C:A-2C) - ec_point_t A3; - fp2_copy(&A3.x, &A24.x); - fp2_sub(&A3.z, &A3.x, &A24.z); - - // Construct basis for 3^g torsion - ec_basis_t B3; - ec_curve_to_basis_3(&B3, &E); - - // Check that basis is rational - assert(ec_is_on_curve(&E, &B3.P)); - assert(ec_is_on_curve(&E, &B3.Q)); - assert(ec_is_on_curve(&E, &B3.PmQ)); - - // Compute P+Q - xADD(&PpQ, &B3.P, &B3.Q, &B3.PmQ); - - // Check the order - ec_point_t P3, Q3, PmQ3, PpQ3; - copy_point(&P3, &B3.P); - copy_point(&Q3, &B3.Q); - copy_point(&PmQ3, &B3.PmQ); - copy_point(&PpQ3, &PpQ); - for(int i = 0; i < POWER_OF_3 - 1; i++){ - xTPL(&P3, &P3, &A3); - assert(!ec_is_zero(&P3)); - xTPL(&Q3, &Q3, &A3); - assert(!ec_is_zero(&Q3)); - xTPL(&PmQ3, &PmQ3, &A3); - assert(!ec_is_zero(&PmQ3)); - xTPL(&PpQ3, &PpQ3, &A3); - assert(!ec_is_zero(&PpQ3)); - } - xADD(&P2, &PpQ3, &Q3, &P3); - assert(is_point_equal(&PmQ3, &P2)); - xTPL(&P3, &P3, &A3); - assert(ec_is_zero(&P3)); - xTPL(&Q3, &Q3, &A3); - assert(ec_is_zero(&Q3)); - xTPL(&PmQ3, &PmQ3, &A3); - assert(ec_is_zero(&PmQ3)); - xTPL(&PpQ3, &PpQ3, &A3); - assert(ec_is_zero(&PpQ3)); - - // Construct basis for 2^f*3^g torsion - ec_basis_t B6; - ec_curve_to_basis_6(&B6, &E); - - // Check that basis is rational - assert(ec_is_on_curve(&E, &B6.P)); - assert(ec_is_on_curve(&E, &B6.Q)); - assert(ec_is_on_curve(&E, &B6.PmQ)); - - // Compute P+Q - xADD(&PpQ, &B6.P, &B6.Q, &B6.PmQ); - - // Check the order - ec_point_t P6, Q6, PmQ6, PpQ6; - copy_point(&P6, &B6.P); - copy_point(&Q6, &B6.Q); - copy_point(&PmQ6, &B6.PmQ); - copy_point(&PpQ6, &PpQ); - - for(int i = 0; i < POWER_OF_2 - 1; i++){ - xDBLv2(&P6, &P6, &A24); - assert(!ec_is_zero(&P6)); - xDBLv2(&Q6, &Q6, &A24); - assert(!ec_is_zero(&Q6)); - xDBLv2(&PmQ6, &PmQ6, &A24); - assert(!ec_is_zero(&PmQ6)); - xDBLv2(&PpQ6, &PpQ6, &A24); - assert(!ec_is_zero(&PpQ6)); - } - - for(int i = 0; i < POWER_OF_3 - 1; i++){ - xTPL(&P6, &P6, &A3); - assert(!ec_is_zero(&P6)); - xTPL(&Q6, &Q6, &A3); - assert(!ec_is_zero(&Q6)); - xTPL(&PmQ6, &PmQ6, &A3); - assert(!ec_is_zero(&PmQ6)); - xTPL(&PpQ6, &PpQ6, &A3); - assert(!ec_is_zero(&PpQ6)); - } - copy_point(&R, &P6); - xDBLv2(&P6, &P6, &A24); - assert(!ec_is_zero(&P6)); - xTPL(&P6, &P6, &A3); - assert(ec_is_zero(&P6)); - xTPL(&R, &R, &A3); - assert(!ec_is_zero(&R)); - xDBLv2(&R, &R, &A24); - assert(ec_is_zero(&R)); - - - copy_point(&R, &Q6); - xDBLv2(&Q6, &Q6, &A24); - assert(!ec_is_zero(&Q6)); - xTPL(&Q6, &Q6, &A3); - assert(ec_is_zero(&Q6)); - xTPL(&R, &R, &A3); - assert(!ec_is_zero(&R)); - xDBLv2(&R, &R, &A24); - assert(ec_is_zero(&R)); - - - copy_point(&R, &PmQ6); - xDBLv2(&PmQ6, &PmQ6, &A24); - assert(!ec_is_zero(&PmQ6)); - xTPL(&PmQ6, &PmQ6, &A3); - assert(ec_is_zero(&PmQ6)); - xTPL(&R, &R, &A3); - assert(!ec_is_zero(&R)); - xDBLv2(&R, &R, &A24); - assert(ec_is_zero(&R)); - - - copy_point(&R, &PpQ6); - xDBLv2(&PpQ6, &PpQ6, &A24); - assert(!ec_is_zero(&PpQ6)); - xTPL(&PpQ6, &PpQ6, &A3); - assert(ec_is_zero(&PpQ6)); - xTPL(&R, &R, &A3); - assert(!ec_is_zero(&R)); - xDBLv2(&R, &R, &A24); - assert(ec_is_zero(&R)); - - - // Compute a 2^e-basis with 2^(e-1)*Q=(0,0) - copy_point(&P2, &B2.P); - copy_point(&Q2, &B2.Q); - copy_point(&PmQ2, &B2.PmQ); - for(int i = 0; i < POWER_OF_2 - 1; i++){ - xDBLv2(&P2, &P2, &A24); - xDBLv2(&Q2, &Q2, &A24); - xDBLv2(&PmQ2, &PmQ2, &A24); - } - if(fp2_is_zero(&P2.x)){ - copy_point(&Q2, &B2.Q); - copy_point(&B2.Q, &B2.P); - copy_point(&B2.P, &Q2); - } - else if(fp2_is_zero(&PmQ2.x)){ - copy_point(&Q2, &B2.Q); - copy_point(&B2.Q, &B2.PmQ); - copy_point(&B2.PmQ, &Q2); - } - - // Compute a 2^e-isogeny - ec_isog_even_t isog; - random_scalar(k); - ladder3pt(&R, k, &B2.P, &B2.Q, &B2.PmQ, &A24); - fp2_copy(&isog.curve.A, &E.A); - fp2_copy(&isog.curve.C, &E.C); - copy_point(&isog.kernel, &R); - isog.length = POWER_OF_2; - ec_eval_even_nonzero(&E, &isog, &B3.P, 1); - } - printf("[%2d%%] Tested basis generation:\t\tNo errors!\n", 100); - - - - // ----------------- TEST FOR NONZERO 2-ISOGENIES VS 4-ISOGENIES----------------- // - - // Initial curve with A = 0 - fp2_set(&E.A, 0); - fp_mont_setone(E.C.re); - fp_set(E.C.im, 0); - - for(int iter = 0; iter < TEST_LOOPS; iter++){ - - printf("[%3d%%] Testing 2-isog vs 4-isog", 100 * iter / (int)TEST_LOOPS); - fflush(stdout); - printf("\r\x1b[K"); - - // Curve coefficient A24=(A+2C:4C) - ec_point_t A24, B24, C24; - fp2_add(&A24.z, &E.C, &E.C); - fp2_add(&A24.x, &E.A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - - // Compute a 2^e-basis with 2^(e-1)*Q=(0,0) - ec_basis_t B0, B1, B2; - ec_point_t P4, Q4, PmQ4, P2, Q2, PmQ2, tmp; - ec_curve_to_basis_2(&B2, &E); - copy_point(&P4, &B2.P); - copy_point(&Q4, &B2.Q); - copy_point(&PmQ4, &B2.PmQ); - for(int i = 0; i < POWER_OF_2 - 2; i++){ - xDBLv2(&P4, &P4, &A24); - xDBLv2(&Q4, &Q4, &A24); - xDBLv2(&PmQ4, &PmQ4, &A24); - } - xDBLv2(&P2, &P4, &A24); - xDBLv2(&Q2, &Q4, &A24); - xDBLv2(&PmQ2, &PmQ4, &A24); - if(fp2_is_zero(&P2.x)){ - copy_point(&tmp, &Q4); - copy_point(&Q4, &P4); - copy_point(&P4, &tmp); - } - else if(fp2_is_zero(&PmQ2.x)){ - copy_point(&tmp, &Q4); - copy_point(&Q4, &PmQ4); - copy_point(&PmQ4, &tmp); - } - - // Non-singular 2-isogenies - xDBLv2(&P2, &P4, &A24); - xisog_2(&B24, P2); - xeval_2((ec_point_t*)&B0, (ec_point_t*)&B2, 3); - xeval_2(&P2, &P4, 1); - xisog_2(&B24, P2); - xeval_2((ec_point_t*)&B0, (ec_point_t*)&B0, 3); - - // Non-singular 4-isogeny - xisog_4(&C24, P4); - xeval_4((ec_point_t*)&B1, (ec_point_t*)&B2, 3); - - // Compare results - assert(ec_is_equal(&B24, &C24)); - assert(ec_is_equal(&B0.P, &B1.P)); - assert(ec_is_equal(&B0.Q, &B1.Q)); - assert(ec_is_equal(&B0.PmQ, &B1.PmQ)); - - // Singular 2-isogenies case 1 - xisog_2_singular(&B24, A24); - xeval_2_singular((ec_point_t*)&B0, (ec_point_t*)&B2, 3); - xeval_2_singular(&Q2, &Q4, 1); - xisog_2(&B24, Q2); - xeval_2((ec_point_t*)&B0, (ec_point_t*)&B0, 3); - - // Singular 4-isogeny case 1 - xisog_4_singular(&C24, Q4, A24); - xeval_4_singular((ec_point_t*)&B1, (ec_point_t*)&B2, 3, Q4); - - // Compare results - assert(ec_is_equal(&B24, &C24)); - assert(ec_is_equal(&B0.P, &B1.P)); - assert(ec_is_equal(&B0.Q, &B1.Q)); - assert(ec_is_equal(&B0.PmQ, &B1.PmQ)); - - // Singular 2-isogenies case 2 - fp2_sub(&A24.x, &A24.z, &A24.x); - fp2_neg(&Q4.x, &Q4.x); - fp2_neg(&P4.x, &P4.x); - fp2_neg(&B2.P.x, &B2.P.x); - fp2_neg(&B2.Q.x, &B2.Q.x); - fp2_neg(&B2.PmQ.x, &B2.PmQ.x); - xisog_2_singular(&B24, A24); - xeval_2_singular((ec_point_t*)&B0, (ec_point_t*)&B2, 3); - xeval_2_singular(&Q2, &Q4, 1); - xisog_2(&B24, Q2); - xeval_2((ec_point_t*)&B0, (ec_point_t*)&B0, 3); - - // Singular 4-isogeny case 2 - xisog_4_singular(&C24, Q4, A24); - xeval_4_singular((ec_point_t*)&B1, (ec_point_t*)&B2, 3, Q4); - - // Compare results - assert(ec_is_equal(&B24, &C24)); - assert(ec_is_equal(&B0.P, &B1.P)); - assert(ec_is_equal(&B0.Q, &B1.Q)); - assert(ec_is_equal(&B0.PmQ, &B1.PmQ)); - - // Move to next curve - xisog_4(&A24, P4); - fp2_add(&E.A, &A24.x, &A24.x); - fp2_sub(&E.A, &E.A, &A24.z); - fp2_sub(&E.A, &E.A, &E.A); - fp2_copy(&E.C, &A24.z); - } - printf("[%2d%%] Tested 2-isog vs 4-isog:\t\tNo errors!\n", 100); - - - - // ----------------- TEST FOR NONZERO 2^f ISOGENIES ----------------- // - - // Initial curve with A = 0 - fp2_set(&E.A, 0); - fp_mont_setone(E.C.re); - fp_set(E.C.im, 0); - - for(int iter = 0; iter < TEST_LOOPS; iter++){ - - printf("[%3d%%] Testing 2^f-isogenies (nonzero)", 100 * iter / (int)TEST_LOOPS); - fflush(stdout); - printf("\r\x1b[K"); - - // Curve coefficient A24=(A+2C:4C) - ec_point_t A24; - fp2_add(&A24.z, &E.C, &E.C); - fp2_add(&A24.x, &E.A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - - // Compute a 2^e-basis with 2^(e-1)*Q=(0,0) - ec_basis_t B2; - ec_point_t P2, Q2, PmQ2; - ec_curve_to_basis_2(&B2, &E); - copy_point(&P2, &B2.P); - copy_point(&Q2, &B2.Q); - copy_point(&PmQ2, &B2.PmQ); - for(int i = 0; i < POWER_OF_2 - 1; i++){ - xDBLv2(&P2, &P2, &A24); - xDBLv2(&Q2, &Q2, &A24); - xDBLv2(&PmQ2, &PmQ2, &A24); - } - if(fp2_is_zero(&P2.x)){ - copy_point(&Q2, &B2.Q); - copy_point(&B2.Q, &B2.P); - copy_point(&B2.P, &Q2); - } - else if(fp2_is_zero(&PmQ2.x)){ - copy_point(&Q2, &B2.Q); - copy_point(&B2.Q, &B2.PmQ); - copy_point(&B2.PmQ, &Q2); - } - - // Generate 3^g-basis and a 2^f-kernel point - ec_basis_t B3; - fp_t k; - ec_point_t R; - ec_curve_to_basis_3(&B3, &E); - random_scalar(k); - ladder3pt(&R, k, &B2.P, &B2.Q, &B2.PmQ, &A24); - - // Evaluate 2^f-isogeny - ec_isog_even_t isog; - fp2_copy(&isog.curve.A, &E.A); - fp2_copy(&isog.curve.C, &E.C); - isog.length = POWER_OF_2; - for(int i = isog.length; i < POWER_OF_2; i++) - xDBLv2(&R, &R, &A24); - copy_point(&isog.kernel, &R); - ec_eval_even_nonzero(&E, &isog, (ec_point_t*)&B3, 3); - - // Curve coefficient A3 = (A+2C:A-2C) - ec_point_t A3; - fp2_add(&A3.z, &E.C, &E.C); - fp2_add(&A3.x, &E.A, &A3.z); - fp2_sub(&A3.z, &E.A, &A3.z); - - // Check order of the pushed 3^g-basis - ec_point_t P3, Q3, PmQ3, PpQ, PpQ3; - xADD(&PpQ, &B3.P, &B3.Q, &B3.PmQ); - copy_point(&P3, &B3.P); - copy_point(&Q3, &B3.Q); - copy_point(&PmQ3, &B3.PmQ); - copy_point(&PpQ3, &PpQ); - for(int i = 0; i < POWER_OF_3 - 1; i++){ - xTPL(&P3, &P3, &A3); - assert(!ec_is_zero(&P3)); - xTPL(&Q3, &Q3, &A3); - assert(!ec_is_zero(&Q3)); - xTPL(&PmQ3, &PmQ3, &A3); - assert(!ec_is_zero(&PmQ3)); - xTPL(&PpQ3, &PpQ3, &A3); - assert(!ec_is_zero(&PpQ3)); - } - xADD(&R, &PpQ3, &Q3, &P3); - assert(is_point_equal(&PmQ3, &R)); - xTPL(&P3, &P3, &A3); - assert(ec_is_zero(&P3)); - xTPL(&Q3, &Q3, &A3); - assert(ec_is_zero(&Q3)); - xTPL(&PmQ3, &PmQ3, &A3); - assert(ec_is_zero(&PmQ3)); - xTPL(&PpQ3, &PpQ3, &A3); - assert(ec_is_zero(&PpQ3)); - } - printf("[%2d%%] Tested 2^f-isogenies (nonzero):\tNo errors!\n", 100); - - - - // ----------------- TEST FOR 2^f ISOGENIES ----------------- // - - // Initial curve with A = 0 - fp2_set(&E.A, 0); - fp_mont_setone(E.C.re); - fp_set(E.C.im, 0); - - cycles = 0; - for(int iter = 0; iter < TEST_LOOPS; iter++){ - - printf("[%3d%%] Testing 2^f-isogenies", 100 * iter / (int)TEST_LOOPS); - fflush(stdout); - printf("\r\x1b[K"); - - // Curve coefficient A24=(A+2C:4C) - ec_point_t A24; - fp2_add(&A24.z, &E.C, &E.C); - fp2_add(&A24.x, &E.A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - - // Compute a 2^e-basis - ec_basis_t B2; - ec_curve_to_basis_2(&B2, &E); - - // Generate 3^g-basis and a 2^f-kernel point - ec_basis_t B3; - fp_t k; - ec_point_t R; - ec_curve_to_basis_3(&B3, &E); - random_scalar(k); - ladder3pt(&R, k, &B2.P, &B2.Q, &B2.PmQ, &A24); - - // Evaluate 2^f-isogeny - ec_isog_even_t isog; - fp2_copy(&isog.curve.A, &E.A); - fp2_copy(&isog.curve.C, &E.C); - isog.length = POWER_OF_2; - for(int i = isog.length; i < POWER_OF_2; i++) - xDBLv2(&R, &R, &A24); - copy_point(&isog.kernel, &R); - cycles1 = cpucycles(); - ec_eval_even_basis(&E, &isog, &B3, 1); - cycles2 = cpucycles(); - cycles = cycles+(cycles2-cycles1); - - // Curve coefficient A3 = (A+2C:A-2C) - ec_point_t A3; - fp2_add(&A3.z, &E.C, &E.C); - fp2_add(&A3.x, &E.A, &A3.z); - fp2_sub(&A3.z, &E.A, &A3.z); - - // Check order of the pushed 3^g-basis - ec_point_t P3, Q3, PmQ3, PpQ, PpQ3; - xADD(&PpQ, &B3.P, &B3.Q, &B3.PmQ); - copy_point(&P3, &B3.P); - copy_point(&Q3, &B3.Q); - copy_point(&PmQ3, &B3.PmQ); - copy_point(&PpQ3, &PpQ); - for(int i = 0; i < POWER_OF_3 - 1; i++){ - xTPL(&P3, &P3, &A3); - assert(!ec_is_zero(&P3)); - xTPL(&Q3, &Q3, &A3); - assert(!ec_is_zero(&Q3)); - xTPL(&PmQ3, &PmQ3, &A3); - assert(!ec_is_zero(&PmQ3)); - xTPL(&PpQ3, &PpQ3, &A3); - assert(!ec_is_zero(&PpQ3)); - } - xADD(&R, &PpQ3, &Q3, &P3); - assert(is_point_equal(&PmQ3, &R)); - xTPL(&P3, &P3, &A3); - assert(ec_is_zero(&P3)); - xTPL(&Q3, &Q3, &A3); - assert(ec_is_zero(&Q3)); - xTPL(&PmQ3, &PmQ3, &A3); - assert(ec_is_zero(&PmQ3)); - xTPL(&PpQ3, &PpQ3, &A3); - assert(ec_is_zero(&PpQ3)); - } - printf("[%2d%%] Tested 2^f-isogenies:\t\tNo errors! (%7lld cycles)\n", 100, cycles/TEST_LOOPS);\ - - // ----------------- TEST FOR 3^g ISOGENIES ----------------- // - - // Initial curve with A = 0 - fp2_set(&E.A, 0); - fp_mont_setone(E.C.re); - fp_set(E.C.im, 0); - - for(int iter = 0; iter < TEST_LOOPS; iter++){ - - printf("[%3d%%] Testing 3^g-isogenies", 100 * iter / (int)TEST_LOOPS); - fflush(stdout); - printf("\r\x1b[K"); - - // Curve coefficient A24=(A+2C:4C) - ec_point_t A24; - fp2_add(&A24.z, &E.C, &E.C); - fp2_add(&A24.x, &E.A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - - // Curve coefficient A3=(A+2C:A-2C) - ec_point_t A3; - fp2_copy(&A3.x, &A24.x); - fp2_sub(&A3.z, &A24.x, &A24.z); - - // Compute bases and a kernel point - ec_basis_t B2, B3; - fp_t k; - ec_point_t R; - ec_curve_to_basis_2(&B2, &E); - ec_curve_to_basis_3(&B3, &E); - random_scalar(k); - ladder3pt(&R, k, &B3.P, &B3.Q, &B3.PmQ, &A24); - - // Evaluate 3^g-isogeny - ec_isog_odd_t isog; - fp2_copy(&isog.curve.A, &E.A); - fp2_copy(&isog.curve.C, &E.C); - for(int i = 0; i < P_LEN+M_LEN; i++) - isog.degree[i] = 0; - isog.degree[0] = rand() % POWER_OF_3 + 1; - for(int i = isog.degree[0]; i < POWER_OF_3; i++) - xTPL(&R, &R, &A3); - copy_point(&isog.ker_plus, &R); - ec_eval_odd_basis(&E, &isog, &B2, 1); - - // Update A24 - fp2_add(&A24.z, &E.C, &E.C); - fp2_add(&A24.x, &E.A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - - // Check order of the pushed 2^f-basis - ec_point_t P2, Q2, PmQ2, PpQ, PpQ2; - xADD(&PpQ, &B2.P, &B2.Q, &B2.PmQ); - copy_point(&P2, &B2.P); - copy_point(&Q2, &B2.Q); - copy_point(&PmQ2, &B2.PmQ); - copy_point(&PpQ2, &PpQ); - for(int i = 0; i < POWER_OF_2 - 1; i++){ - xDBLv2(&P2, &P2, &A24); - assert(!ec_is_zero(&P2)); - xDBLv2(&Q2, &Q2, &A24); - assert(!ec_is_zero(&Q2)); - xDBLv2(&PmQ2, &PmQ2, &A24); - assert(!ec_is_zero(&PmQ2)); - xDBLv2(&PpQ2, &PpQ2, &A24); - assert(!ec_is_zero(&PpQ2)); - } - assert(is_point_equal(&PmQ2, &PpQ2)); - xDBLv2(&P2, &P2, &A24); - assert(ec_is_zero(&P2)); - xDBLv2(&Q2, &Q2, &A24); - assert(ec_is_zero(&Q2)); - xDBLv2(&PmQ2, &PmQ2, &A24); - assert(ec_is_zero(&PmQ2)); - xDBLv2(&PpQ2, &PpQ2, &A24); - assert(ec_is_zero(&PpQ2)); - } - printf("[%2d%%] Tested 3^g-isogenies:\t\tNo errors!\n", 100); - - // ----------------- TEST FOR ODD-DEGREE ISOGENIES ----------------- // - - for(int iter = 0; iter < TEST_LOOPS/10; iter++){ - - printf("[%3d%%] Testing odd-degree isogenies", 100 * iter / ((int)TEST_LOOPS/10)); - fflush(stdout); - printf("\r\x1b[K"); - - // Initial curve with A = 0 - fp2_set(&E.A, 0); - fp_mont_setone(E.C.re); - fp_set(E.C.im, 0); - - // Curve coefficient A24=(A+2C:4C) - ec_point_t A24; - fp2_add(&A24.z, &E.C, &E.C); - fp2_add(&A24.x, &E.A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - - // Compute a 2^f-basis - ec_basis_t B2; - ec_point_t R; - ec_curve_to_basis_2(&B2, &E); - - // Compute kernel points - ec_point_t P, Q, PQ, R_plus, R_minus; - fp_t k; - fp2_tomont(&P.x, &xPA); - fp2_tomont(&Q.x, &xQA); - fp2_tomont(&PQ.x, &xPQA); - fp_mont_setone(P.z.re); - fp_set(P.z.im, 0); - fp2_copy(&Q.z, &P.z); - fp2_copy(&PQ.z, &P.z); - random_scalar(k); - ladder3pt(&R_plus, k, &P, &Q, &PQ, &A24); - fp2_tomont(&P.x, &xPB); - fp2_tomont(&Q.x, &xQB); - fp2_tomont(&PQ.x, &xPQB); - random_scalar(k); - ladder3pt(&R_minus, k, &P, &Q, &PQ, &A24); - - // Evaluate an odd-degree isogeny - ec_isog_odd_t isog; - copy_point(&isog.ker_plus, &R_plus); - copy_point(&isog.ker_minus, &R_minus); - fp2_copy(&isog.curve.A, &E.A); - fp2_copy(&isog.curve.C, &E.C); - for(int i = 0; i < P_LEN; i++){ - isog.degree[i] = rand() % (TORSION_ODD_POWERS[i]+1); - int j = isog.degree[i]; - while(j < TORSION_ODD_POWERS[i]){ - xMULv2(&isog.ker_plus, &isog.ker_plus, &TORSION_ODD_PRIMES[i], p_plus_minus_bitlength[i], &A24); - j++; - } - } - for(int i = P_LEN; i < P_LEN+M_LEN; i++){ - isog.degree[i] = rand() % (TORSION_ODD_POWERS[i]+1); - int j = isog.degree[i]; - while(j < TORSION_ODD_POWERS[i]){ - xMULv2(&isog.ker_minus, &isog.ker_minus, &TORSION_ODD_PRIMES[i], p_plus_minus_bitlength[i], &A24); - j++; - } - } - - ec_eval_odd_basis(&E, &isog, &B2, 1); - ec_eval_odd(&E, &isog, &R_plus, 1); - ec_eval_odd(&E, &isog, &R_minus, 1); - - // Update A24 - fp2_add(&A24.z, &E.C, &E.C); - fp2_add(&A24.x, &E.A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - - // Check order of the pushed 2^f-basis - ec_point_t P2, Q2, PmQ2, PpQ, PpQ2; - xADD(&PpQ, &B2.P, &B2.Q, &B2.PmQ); - copy_point(&P2, &B2.P); - copy_point(&Q2, &B2.Q); - copy_point(&PmQ2, &B2.PmQ); - copy_point(&PpQ2, &PpQ); - for(int i = 0; i < POWER_OF_2 - 1; i++){ - xDBLv2(&P2, &P2, &A24); - assert(!ec_is_zero(&P2)); - xDBLv2(&Q2, &Q2, &A24); - assert(!ec_is_zero(&Q2)); - xDBLv2(&PmQ2, &PmQ2, &A24); - assert(!ec_is_zero(&PmQ2)); - xDBLv2(&PpQ2, &PpQ2, &A24); - assert(!ec_is_zero(&PpQ2)); - } - assert(is_point_equal(&PmQ2, &PpQ2)); - xDBLv2(&P2, &P2, &A24); - assert(ec_is_zero(&P2)); - xDBLv2(&Q2, &Q2, &A24); - assert(ec_is_zero(&Q2)); - xDBLv2(&PmQ2, &PmQ2, &A24); - assert(ec_is_zero(&PmQ2)); - xDBLv2(&PpQ2, &PpQ2, &A24); - assert(ec_is_zero(&PpQ2)); - - // Check order of the pushed R_plus point - int last = -1; - for(int i = 0; i < P_LEN; i++){ - int j = isog.degree[i]; - while(j < TORSION_ODD_POWERS[i]){ - xMULv2(&R_plus, &R_plus, &TORSION_ODD_PRIMES[i], p_plus_minus_bitlength[i], &A24); - if(ec_is_zero(&R_plus)){ - last = i; - break; - } - j++; - } - } - assert(last >= 0); - for(int i = last+1; i < P_LEN; i++) - assert(isog.degree[i] == TORSION_ODD_POWERS[i]); - - // Check order of the pushed R_minus point - last = -1; - for(int i = P_LEN; i < P_LEN+M_LEN; i++){ - int j = isog.degree[i]; - while(j < TORSION_ODD_POWERS[i]){ - xMULv2(&R_minus, &R_minus, &TORSION_ODD_PRIMES[i], p_plus_minus_bitlength[i], &A24); - if(ec_is_zero(&R_minus)){ - last = i; - break; - } - j++; - } - } - assert(last >= 0); - for(int i = last+1; i < P_LEN+M_LEN; i++) - assert(isog.degree[i] == TORSION_ODD_POWERS[i]); - } - printf("[%2d%%] Tested odd-degree isogenies:\tNo errors!\n", 100); - - // ----------------- TEST FOR ISOMORPHISMS ----------------- // - - // Initial curve with A = 0 - fp2_set(&E.A, 0); - fp_mont_setone(E.C.re); - fp_set(E.C.im, 0); - - for(int iter = 0; iter < TEST_LOOPS; iter++){ - - printf("[%3d%%] Testing odd-degree isogenies", 100 * iter / (int)TEST_LOOPS); - fflush(stdout); - printf("\r\x1b[K"); - - // Compute jinv - fp2_t j; - ec_j_inv(&j, &E); - - // Normalize the curve - ec_curve_t Enorm; - ec_isom_t isom; - ec_curve_normalize(&Enorm, &isom, &E); - - // Compare j invariants - fp2_t jnorm; - ec_j_inv(&jnorm, &Enorm); - assert(fp2_is_equal(&j, &jnorm)); - - // Check that normalization is consistent - ec_curve_t Enorm2; - ec_isom_t isom2; - ec_curve_normalize(&Enorm2, &isom2, &Enorm); - assert(curve_equal(&Enorm, &Enorm2)); - - // Compute a basis - ec_basis_t B; - ec_curve_to_basis_2(&B, &E); - - // Push it through isomorphism - ec_basis_t Bnorm; - copy_point(&Bnorm.P, &B.P); - ec_iso_eval(&Bnorm.P, &isom); - copy_point(&Bnorm.Q, &B.Q); - ec_iso_eval(&Bnorm.Q, &isom); - copy_point(&Bnorm.PmQ, &B.PmQ); - ec_iso_eval(&Bnorm.PmQ, &isom); - - // Check that the new basis is rational - assert(ec_is_on_curve(&Enorm, &Bnorm.P)); - assert(ec_is_on_curve(&Enorm, &Bnorm.Q)); - assert(ec_is_on_curve(&Enorm, &Bnorm.PmQ)); - - // Compute P+Q - ec_point_t PpQ; - xADD(&PpQ, &Bnorm.P, &Bnorm.Q, &Bnorm.PmQ); - - // // Check the order - ec_point_t P2, Q2, PmQ2, PpQ2, R, A24; - fp2_add(&A24.z, &Enorm.C, &Enorm.C); - fp2_add(&A24.x, &Enorm.A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - copy_point(&P2, &Bnorm.P); - copy_point(&Q2, &Bnorm.Q); - copy_point(&PmQ2, &Bnorm.PmQ); - copy_point(&PpQ2, &PpQ); - for(int i = 0; i < POWER_OF_2 - 1; i++){ - xDBLv2(&P2, &P2, &A24); - assert(!ec_is_zero(&P2)); - xDBLv2(&Q2, &Q2, &A24); - assert(!ec_is_zero(&Q2)); - xDBLv2(&PmQ2, &PmQ2, &A24); - assert(!ec_is_zero(&PmQ2)); - xDBLv2(&PpQ2, &PpQ2, &A24); - assert(!ec_is_zero(&PpQ2)); - } - assert(is_point_equal(&PmQ2, &PpQ2)); - xDBLv2(&P2, &P2, &A24); - assert(ec_is_zero(&P2)); - xDBLv2(&Q2, &Q2, &A24); - assert(ec_is_zero(&Q2)); - xDBLv2(&PmQ2, &PmQ2, &A24); - assert(ec_is_zero(&PmQ2)); - xDBLv2(&PpQ2, &PpQ2, &A24); - assert(ec_is_zero(&PpQ2)); - - // Compute a 2^e-basis with 2^(e-1)*Q=(0,0) - fp2_add(&A24.z, &E.C, &E.C); - fp2_add(&A24.x, &E.A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - copy_point(&P2, &B.P); - copy_point(&Q2, &B.Q); - copy_point(&PmQ2, &B.PmQ); - for(int i = 0; i < POWER_OF_2 - 1; i++){ - xDBLv2(&P2, &P2, &A24); - xDBLv2(&Q2, &Q2, &A24); - xDBLv2(&PmQ2, &PmQ2, &A24); - } - if(fp2_is_zero(&P2.x)){ - copy_point(&Q2, &B.Q); - copy_point(&B.Q, &B.P); - copy_point(&B.P, &Q2); - } - else if(fp2_is_zero(&PmQ2.x)){ - copy_point(&Q2, &B.Q); - copy_point(&B.Q, &B.PmQ); - copy_point(&B.PmQ, &Q2); - } - - // Compute a 2^e-isogeny - ec_isog_even_t isog; - fp_t k; - random_scalar(k); - ladder3pt(&R, k, &B.P, &B.Q, &B.PmQ, &A24); - fp2_copy(&isog.curve.A, &E.A); - fp2_copy(&isog.curve.C, &E.C); - copy_point(&isog.kernel, &R); - isog.length = POWER_OF_2; - ec_eval_even_nonzero(&E, &isog, &P2, 1); - } - printf("[%2d%%] Tested curve normalization+isom:\tNo errors!\n", 100); - - printf("-- All tests passed!\n"); - return 0; -} diff --git a/src/ec/ref/ecx/test/mont-test.c b/src/ec/ref/ecx/test/mont-test.c deleted file mode 100644 index 3ebf20a..0000000 --- a/src/ec/ref/ecx/test/mont-test.c +++ /dev/null @@ -1,386 +0,0 @@ -#include -#include -#include - -#include "ec.h" -#include "isog.h" -#include "test-basis.h" -#include - -static int BENCH_LOOPS = 1000; // Number of iterations per bench -static int TEST_LOOPS = 128; // Number of iterations per test - -// void random_scalar(fp_t k, const uint8_t j) -// { -// // To implement a better random function (We must use some of the SHAKE family functions) -// do -// { -// randombytes((void *)k, keyspace_bytes[j]); -// } while (fp_issmaller((uint64_t *)k, keyspace_size[j])); -// } - -// VERY NOT SECURE (testing only) -void fp2_random(fp2_t *a){ - for(int i = 0; i < NWORDS_FIELD; i++){ - a->re[i] = rand(); - a->im[i] = rand(); - } - // Normalize - fp2_t one; - fp_mont_setone(one.re);fp_set(one.im,0); - fp2_mul(&*a, &*a, &one); - // Update seed - srand((unsigned) a->re[0]); -} - -// Affine Montgomery coefficient computation (A + 2C : 4C) --> A/C -void coeff(fp2_t *B, ec_point_t const A) -{ - fp2_t t; - fp2_add(&t, &A.x, &A.x); // (2 * A24) - fp2_sub(&t, &t, &A.z); // (2 * A24) - C24 - - fp2_copy(&*B, &A.z); - fp2_inv(&*B); // 1 / (C24) - fp2_add(&t, &t, &t); // 4*A = 2[(2 * A24) - C24] - fp2_mul(&*B, &t, &*B); // A/C = 2[(2 * A24) - C24] / C24 -} - -// Determines if point is fp2-rational (if not, then it must be a zero trace point) -uint8_t isrational(ec_point_t const T, fp2_t const a) -{ - fp2_t XT, tmp, aux, YT_squared; - - fp2_copy(&XT, &T.z); - fp2_inv(&XT); - - fp2_mul(&XT, &XT, &T.x); - - fp2_sqr(&tmp, &XT); - fp2_mul(&aux, &tmp, &XT); - fp2_mul(&tmp, &tmp, &a); - fp2_add(&YT_squared, &tmp, &aux); - fp2_add(&YT_squared, &YT_squared, &XT); - - return fp2_is_square(&YT_squared); -} - -// ladder3pt computes x(P + [m]Q) -void ladder3pt(ec_point_t* R, fp_t const m, ec_point_t const* P, ec_point_t const* Q, ec_point_t const* PQ, ec_point_t const* A) -{ - ec_point_t X0, X1, X2; - copy_point(&X0, Q); - copy_point(&X1, P); - copy_point(&X2, PQ); - - int i,j; - uint64_t t; - for (i = 0; i < NWORDS_FIELD; i++) - { - t = 1; - for (j = 0 ; j < 64; j++) - { - swap_points(&X1, &X2, -((t & m[i]) == 0)); - xDBLADD(&X0, &X1, &X0, &X1, &X2, A); - swap_points(&X1, &X2, -((t & m[i]) == 0)); - t <<= 1; - }; - }; - copy_point(R, &X1); -} - -// For computing [(p + 1) / l_i]P, i:=0, ..., (N - 1) -void cofactor_multiples(ec_point_t P[], ec_point_t const* A, size_t lower, size_t upper) -{ - assert(lower < upper); - if (upper - lower == 1) - return ; - - int i; - size_t mid = lower + (upper - lower + 1) / 2; - copy_point(&(P[mid]), &(P[lower])); - for (i = lower; i < (int)mid; i++) - xMULv2(&(P[mid]), &(P[mid]), &(TORSION_ODD_PRIMES[i]), p_plus_minus_bitlength[i], A); - for (i = (int)mid; i < (int)upper; i++) - xMULv2(&(P[lower]), &(P[lower]), &(TORSION_ODD_PRIMES[i]), p_plus_minus_bitlength[i], A); - - cofactor_multiples(P, A, lower, mid); - cofactor_multiples(P, A, mid, upper); -} - -// The projective x-coordinate point (X : Z) at infinity is such that Z == 0 -static inline int isinfinity(ec_point_t const P) -{ - return fp2_is_zero(&P.z); -} - -int main(int argc, char* argv[]) -{ - if (argc > 1) { - TEST_LOOPS = atoi(argv[1]); - } - - fp2_t fp2_0, fp2_1; - fp2_set(&fp2_0, 0); - fp_mont_setone(fp2_1.re);fp_set(fp2_1.im,0); - - int i, j; - - ec_point_t A; - fp2_set(&A.x, 0); - fp_mont_setone(A.z.re);fp_set(A.z.im,0); - - fp2_add(&A.z, &A.z, &A.z); // 2C - fp2_add(&A.x, &A.x, &A.z); // A' + 2C - fp2_add(&A.z, &A.z, &A.z); // 4C - - // Just to ensure the projective curve coeffientes are different from zero - assert( !fp2_is_zero(&A.x) & !fp2_is_zero(&A.x) ); - - fp2_t a; - coeff(&a, A); - - ec_point_t PA, QA, PQA, PB, QB, PQB; - - // Writing the public projective x-coordinate points into Montogmery domain - fp2_tomont(&(PA.x), &(xPA)); - fp_mont_setone(PA.z.re);fp_set(PA.z.im,0); - fp2_tomont(&(QA.x), &(xQA)); - fp_mont_setone(QA.z.re);fp_set(QA.z.im,0); - fp2_tomont(&(PQA.x), &(xPQA)); - fp_mont_setone(PQA.z.re);fp_set(PQA.z.im,0); - - assert( isrational(PA, a) ); - assert( isrational(QA, a) ); - assert( isrational(PQA, a) ); - - // ====================================================================================================== - // Recall, PA, QA, and PQA are expeted to be N-order points, but we require to ensure they are of order N - for (j = 0; j < P_LEN; j++) - { - for (i = 1; i < TORSION_ODD_POWERS[j]; i++) - { - xMULv2(&PA, &PA, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - xMULv2(&QA, &QA, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - xMULv2(&PQA, &PQA, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - - assert( isrational(PA, a) ); - assert( isrational(QA, a) ); - assert( isrational(PQA, a) ); - }; - }; - assert( !isinfinity(PA) ); - assert( !isinfinity(QA) ); - assert( !isinfinity(PQA) ); - - ec_point_t P[P_LEN + M_LEN], Q[P_LEN + M_LEN], PQ[P_LEN + M_LEN]; - copy_point(&(P[0]), &PA); - cofactor_multiples(P, &A, 0, P_LEN); - copy_point(&(Q[0]), &QA); - cofactor_multiples(Q, &A, 0, P_LEN); - copy_point(&(PQ[0]), &PQA); - cofactor_multiples(PQ, &A, 0, P_LEN); - for (j = 0; j < P_LEN; j++) - { - // x(PA) - assert( !isinfinity(P[j]) ); // It must be different from the point at infinity - assert( isrational(P[j], a) ); - xMULv2(&P[j], &P[j], &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - assert( isinfinity(P[j]) ); // It must be now the point at infinity - // x(QA) - assert( !isinfinity(Q[j]) ); // It must be different from the point at infinity - assert( isrational(Q[j], a) ); - xMULv2(&Q[j], &Q[j], &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - assert( isinfinity(Q[j]) ); // It must be now the point at infinity - // x(PQA) - assert( !isinfinity(PQ[j]) ); // It must be different from the point at infinity - assert( isrational(PQ[j], a) ); - xMULv2(&PQ[j], &PQ[j], &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - assert( isinfinity(PQ[j]) ); // It must be now the point at infinity - }; - // Writing the public projective x-coordinate points into Montogmery domain - fp2_tomont(&(PB.x), &(xPB)); - fp_mont_setone(PB.z.re);fp_set(PB.z.im,0); - fp2_tomont(&(QB.x), &(xQB)); - fp_mont_setone(QB.z.re);fp_set(QB.z.im,0); - fp2_tomont(&(PQB.x), &(xPQB)); - fp_mont_setone(PQB.z.re);fp_set(PQB.z.im,0); - - assert( !isrational(PB, a) ); - assert( !isrational(QB, a) ); - assert( !isrational(PQB, a) ); - // ====================================================================================================== - // Recall, PB, QB, and PQB are expeted to be M-order points, but we require to ensure they are of order M - for (j = P_LEN; j < (P_LEN + M_LEN); j++) - { - for (i = 1; i < TORSION_ODD_POWERS[j]; i++) - { - xMULv2(&PB, &PB, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - xMULv2(&QB, &QB, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - xMULv2(&PQB, &PQB, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - - assert( !isrational(PB, a) ); - assert( !isrational(QB, a) ); - assert( !isrational(PQB, a) ); - }; - }; - assert( !isinfinity(PB) ); - assert( !isinfinity(QB) ); - assert( !isinfinity(PQB) ); - - copy_point(&(P[P_LEN]), &PB); - cofactor_multiples(P, &A, P_LEN, P_LEN + M_LEN); - copy_point(&(Q[P_LEN]), &QB); - cofactor_multiples(Q, &A, P_LEN, P_LEN + M_LEN); - copy_point(&(PQ[P_LEN]), &PQB); - cofactor_multiples(PQ, &A, P_LEN, P_LEN + M_LEN); - for (j = P_LEN; j < (P_LEN+M_LEN); j++) - { - // x(PB) - assert( !isinfinity(P[j]) ); // It must be different from the point at infinity - assert( !isrational(P[j], a) ); - xMULv2(&P[j], &P[j], &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - assert( isinfinity(P[j]) ); // It must be now the point at infinity - // x(QB) - assert( !isinfinity(Q[j]) ); // It must be different from the point at infinity - assert( !isrational(Q[j], a) ); - xMULv2(&Q[j], &Q[j], &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - assert( isinfinity(Q[j]) ); // It must be now the point at infinity - // x(PQB) - assert( !isinfinity(PQ[j]) ); // It must be different from the point at infinity - assert( !isrational(PQ[j], a) ); - xMULv2(&PQ[j], &PQ[j], &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - assert( isinfinity(PQ[j]) ); // It must be now the point at infinity - }; - - fp2_t m; - - // Writing the public projective x-coordinate points into Montogmery domain - fp2_tomont(&(PA.x), &(xPA)); - fp_mont_setone(PA.z.re);fp_set(PA.z.im,0); - fp2_tomont(&(QA.x), &(xQA)); - fp_mont_setone(QA.z.re);fp_set(QA.z.im,0); - fp2_tomont(&(PQA.x), &(xPQA)); - fp_mont_setone(PQA.z.re);fp_set(PQA.z.im,0); - - assert( isrational(PA, a) ); - assert( isrational(QA, a) ); - assert( isrational(PQA, a) ); - - fp2_tomont(&(PB.x), &(xPB)); - fp_mont_setone(PB.z.re);fp_set(PB.z.im,0); - fp2_tomont(&(QB.x), &(xQB)); - fp_mont_setone(QB.z.re);fp_set(QB.z.im,0); - fp2_tomont(&(PQB.x), &(xPQB)); - fp_mont_setone(PQB.z.re);fp_set(PQB.z.im,0); - - assert( !isrational(PB, a) ); - assert( !isrational(QB, a) ); - assert( !isrational(PQB, a) ); - - ec_point_t R[P_LEN + M_LEN]; - int k; - for (j = 0; j < TEST_LOOPS; j++) - { - printf("[%3d%%] Testing EC differential arithmetic", 100 * j / TEST_LOOPS); - fflush(stdout); - printf("\r\x1b[K"); - fp2_random(&m); - ladder3pt(&(R[0]), m.re, &PA, &QA, &PQA, &A); - assert( isrational(R[0], a) ); - for (k = 0; k < P_LEN; k++) - { - for (i = 1; i < TORSION_ODD_POWERS[k]; i++) - { - xMULv2(&R[0], &R[0], &(TORSION_ODD_PRIMES[k]), p_plus_minus_bitlength[k], &A); - assert( isrational(R[0], a) ); - }; - }; - cofactor_multiples(R, &A, 0, P_LEN); - for (i = 0; i < P_LEN; i++) - { - assert( !isinfinity(R[i]) ); // It must be different from the point at infinity - assert( isrational(R[i], a) ); - xMULv2(&R[i], &R[i], &(TORSION_ODD_PRIMES[i]), p_plus_minus_bitlength[i], &A); - assert( isinfinity(R[i]) ); // It must be now the point at infinity - }; - - fp2_random(&m); - ladder3pt(&(R[P_LEN]), m.re, &PB, &QB, &PQB, &A); - assert( !isrational(R[P_LEN], a) ); - for (k = P_LEN; k < (P_LEN+M_LEN); k++) - { - for (i = 1; i < TORSION_ODD_POWERS[k]; i++) - { - xMULv2(&R[P_LEN], &R[P_LEN], &(TORSION_ODD_PRIMES[k]), p_plus_minus_bitlength[k], &A); - assert( !isrational(R[P_LEN], a) ); - }; - }; - cofactor_multiples(R, &A, P_LEN, P_LEN + M_LEN); - for (i = P_LEN; i < (P_LEN+M_LEN); i++) - { - assert( !isinfinity(R[i]) ); // It must be different from the point at infinity - assert( !isrational(R[i], a) ); - xMULv2(&R[i], &R[i], &(TORSION_ODD_PRIMES[i]), p_plus_minus_bitlength[i], &A); - assert( isinfinity(R[i]) ); // It must be now the point at infinity - }; - }; - - if(TEST_LOOPS) - printf("[%3d%%] Tested EC differential arithmetic:\tNo errors!\n", 100 * j / TEST_LOOPS); - printf("-- All tests passed.\n"); - - // BENCHMARK xDBLv2 - unsigned long long cycles, cycles1, cycles2; - cycles = 0; - ec_point_t PP[TEST_LOOPS], EE[TEST_LOOPS]; - for(int i = 0; i < TEST_LOOPS; i++){ - fp2_random(&PP[i].x); - fp2_random(&PP[i].z); - fp2_random(&EE[i].x); - fp2_random(&EE[i].z); - } - cycles1 = cpucycles(); - for(int i = 0; i < TEST_LOOPS; i++){ - xDBLv2(&PP[i], &PP[i], &EE[i]); - } - cycles2 = cpucycles(); - cycles = cycles+(cycles2-cycles1); - - printf("xDBLv2 bench: %7lld cycles\n", cycles/TEST_LOOPS); - - // BENCHMARK xIsog4 - cycles = 0; - ec_point_t KK0[TEST_LOOPS], KK1[TEST_LOOPS], KK2[TEST_LOOPS]; - for(int i = 0; i < TEST_LOOPS; i++){ - fp2_random(&KK0[i].x); - fp2_random(&KK0[i].z); - fp2_random(&KK1[i].x); - fp2_random(&KK1[i].z); - fp2_random(&KK2[i].x); - fp2_random(&KK2[i].z); - } - cycles1 = cpucycles(); - for(int i = 0; i < TEST_LOOPS; i++){ - fp2_t t0, t1; - fp2_add(&t0, &PP[i].x, &PP[i].z); - fp2_sub(&t1, &PP[i].x, &PP[i].z); - fp2_mul(&(EE[i].x), &t0, &KK1[i].x); - fp2_mul(&(EE[i].z), &t1, &KK2[i].x); - fp2_mul(&t0, &t0, &t1); - fp2_mul(&t0, &t0, &KK0[i].x); - fp2_add(&t1, &(EE[i].x), &(EE[i].z)); - fp2_sub(&(EE[i].z), &(EE[i].x), &(EE[i].z)); - fp2_sqr(&t1, &t1); - fp2_sqr(&(EE[i].z), &(EE[i].z)); - fp2_add(&(EE[i].x), &t0, &t1); - fp2_sub(&t0, &(EE[i].z), &t0); - fp2_mul(&(EE[i].x), &(EE[i].x), &t1); - fp2_mul(&(EE[i].z), &(EE[i].z), &t0); - } - cycles2 = cpucycles(); - cycles = cycles+(cycles2-cycles1); - printf("xeval_4 bench: %7lld cycles\n", cycles/TEST_LOOPS); - - return 0; -} diff --git a/src/ec/ref/ecx/test/poly-mul-test.c b/src/ec/ref/ecx/test/poly-mul-test.c deleted file mode 100644 index ba3dd6a..0000000 --- a/src/ec/ref/ecx/test/poly-mul-test.c +++ /dev/null @@ -1,445 +0,0 @@ -#include -#include -#include - -bool fp2_isequal(fp2_t a, fp2_t b){ - return fp_is_equal(a.re, b.re) && fp_is_equal(a.im, b.im); -} - -// VERY NOT SECURE (testing only) -void fp2_random(fp2_t *a){ - for(int i = 0; i < NWORDS_FIELD; i++){ - a->re[i] = rand(); - a->im[i] = rand(); - } - // Normalize - fp2_t one; - fp_mont_setone(one.re);fp_set(one.im,0); - fp2_mul(&*a, &*a, &one); - // Update seed - srand((unsigned) a->re[0]); -} - -void slow_mul(poly h, poly f, int lenf, poly g, int leng){ - // Computes h = f*g by school method - - fp2_t a, b; - int nf, ng, e; - int lenh = lenf + leng - 1; - - if(lenh <= 0){ - return; - } - - fp2_t fg[lenh]; - - if (leng > lenf){ - slow_mul(h, g, leng, f, lenf); - return; - } - - for(e = 0; e < lenh; e++){ - - if (lenf - 1 < e){ - nf = lenf - 1; - } - else{ - nf = e; - } - - ng = e - nf; - fp2_set(&a, 0); - while( (ng < leng) & (nf >= 0) ){ - fp2_mul(&b, &f[nf], &g[ng]); - fp2_add(&a, &a, &b); - nf--; - ng++; - } - fp2_copy(&fg[e], &a); - } - for(e = 0; e < lenh; e++){ - fp2_copy(&h[e], &fg[e]); - } - return; -} - - - -int main(){ - fp2_t fp2_0, fp2_1; - #define nmax 16 - int nf, ng, n, e; - fp2_set(&fp2_0, 0); - fp_mont_setone(fp2_1.re);fp_set(fp2_1.im,0); - - //TEST MULTIPLICATION BY 0 - - for(nf = 2; nf < nmax; nf++){ - fp2_t f[nf], h[nf-1]; - - printf("[%3d%%] Testing multiplication by 0", 100 * nf / nmax); - fflush(stdout); - printf("\r\x1b[K"); - - for(e = 0; e < nf; e++){ - fp2_random(&f[e]); - } - poly_mul(h, f, nf, f, 0); - for(e = 0; e < nf-1; e++){ - assert(fp2_is_zero(&h[e])==1); - } - poly_mul(h, f, 0, f, nf); - for(e = 0; e < nf-1; e++){ - assert(fp2_is_zero(&h[e])==1); - } - } - printf("[%3d%%] Tested multiplication by 0:\t\tNo errors!\n", 100 * nf / nmax); - - - - //TEST FOR f, g, h DISJOINT MEMORY SPACES - - for(nf = 1; nf < nmax; nf++){ - - printf("[%3d%%] Testing multiplication", 100 * nf / nmax); - fflush(stdout); - printf("\r\x1b[K"); - - for(ng = 1; ng < nmax; ng++){ - - fp2_t f[nf]; //Random length nf poly - for(e = 0; e < nf; e++){ - fp2_random(&f[e]); - } - - fp2_t g[ng]; // Random length ng poly - for(e = 0; e < ng; e++){ - fp2_random(&g[e]); - } - - fp2_t h[nf+ng-1];// Compute product - poly_mul(h, f, nf, g, ng); - - fp2_t fg[nf+ng-1]; // Compute the product by school method - slow_mul(fg, f, nf, g, ng); - - for(e = 0; e < nf + ng - 1; e++){ // Verify answer term by term - assert(fp2_isequal(h[e], fg[e])==1); - } - } - } - printf("[%3d%%] Tested multiplication:\t\t\tNo errors!\n", 100 * nf / nmax); - - - - // TEST FOR f, g CONTIGIOUS AND RESULT SAVED OVER THEM - - for(nf = 1; nf < nmax; nf++){ - - printf("[%3d%%] Testing multiplication in place", 100 * nf / nmax); - fflush(stdout); - printf("\r\x1b[K"); - - for(ng = 1; ng < nmax; ng++){ - - fp2_t h[nf+ng]; - - //Random length nf poly - for(e = 0; e < nf; e++){ - fp2_random(&h[e]); - } - - // Random length ng poly - for(e = 0; e < ng; e++){ - fp2_random(&h[e+nf]); - } - - // Compute the product - fp2_t fg[nf+ng-1]; - slow_mul(fg, h, nf, &(h[nf]), ng); // School method - poly_mul(h, h, nf, &(h[nf]), ng); // Karatsuba method - - - for(e = 0; e < nf + ng - 1; e++){ // Verify answer term by term - assert(fp2_isequal(h[e], fg[e])==1); - } - } - } - printf("[%3d%%] Tested multiplication in place:\t\tNo errors!\n", 100 * nf / nmax); - - - - //TEST FOR MULTIPLICATION MOD X^N BY 0 - - for(nf = 2; nf < nmax; nf++){ - fp2_t f[nf]; - - printf("[%3d%%] Testing mul mod x^n by 0", 100 * nf / nmax); - fflush(stdout); - printf("\r\x1b[K"); - - for(e = 0; e < nf; e++){ - fp2_random(&f[e]); - } - - for(n = 1; n < nmax; n++){ - fp2_t h[n]; - poly_mul_low(h, n, f, nf, f, 0); - for(e = 0; e < n; e++){ - assert(fp2_is_zero(&h[e])==1); - } - poly_mul_low(h, n, f, 0, f, nf); - for(e = 0; e < n; e++){ - assert(fp2_is_zero(&h[e])==1); - } - } - } - printf("[%3d%%] Tested mul mod x^n by 0:\t\t\tNo errors!\n", 100 * nf / nmax); - - - - //TEST FOR MULTIPLICATION MOD X^N - - for(nf = 1; nf < nmax; nf++){ - - printf("[%3d%%] Testing mul mod x^n", 100 * nf / nmax); - fflush(stdout); - printf("\r\x1b[K"); - - for(ng = 1; ng < nmax; ng++){ - - fp2_t f[nf], g[ng], fg[nf+ng-1]; - poly h; - - //Get random polynomials - for(e = 0; e < nf; e++){ - fp2_random(&f[e]); - } - for(e = 0; e < ng; e++){ - fp2_random(&g[e]); - } - - //Save regular result to fg - slow_mul(fg, f, nf, g, ng); - - //Compute result mod x^n - for(n = 1; n < 2*nmax; n++){ - h = malloc(sizeof(fp2_t)*n); - poly_mul_low(h, n, f, nf, g, ng); - - //Compare with expected - e = 0; - while(e < nf+ng-1 && e < n){ - assert(fp2_isequal(h[e], fg[e]) == 1); - e++; - } - while(e < n){ - assert(fp2_is_zero(&h[e]) == 1); - e++; - } - free(h); - } - } - } - printf("[%3d%%] Tested mul mod x^n:\t\t\tNo errors!\n", 100 * nf / nmax); - - - - //TEST FOR POLY_MUL_MIDDLE - - for(nf = 1; nf < 2*nmax; nf+=1){ - fp2_t f[nf]; - - printf("[%3d%%] Testing poly_mul_middle", 100 * nf / (2*nmax)); - fflush(stdout); - printf("\r\x1b[K"); - - for(ng = (nf+1)>>1; ng < (nf+1)-((nf+1)>>1); ng++){ - // This runs from floor((nf+1)/2) to ceil((nf+1)/2) - fp2_t g[ng]; - for(e = 0; e < nf; e++){ - fp2_random(&f[e]); - } - for(e = 0; e < ng; e++){ - fp2_random(&g[e]); - } - - fp2_t h[nf+ng-1]; - slow_mul(h, g, ng, f, nf); - poly_mul_middle(g, g, ng, f, nf); - - for(e = 0; e < ng; e++){ - assert(fp2_isequal(h[e+nf-ng], g[e])==1); - } - } - } - printf("[%3d%%] Tested poly_mul_middle:\t\t\tNo errors!\n", 100 * nf / (2*nmax)); - - - // TEST FOR SELF RECIPROCAL MULTIPLICATION - for(nf = 1; nf < nmax; nf++){ - - printf("[%3d%%] Testing self reciprocal mul", 100 * nf / nmax); - fflush(stdout); - printf("\r\x1b[K"); - - for(ng = 1; ng < nmax; ng++){ - - fp2_t f[nf], g[ng], h[nf+ng-1], fg[nf+ng-1]; - - // Get random palyndromes - for(e = 0; e < (nf>>1); e++){ - fp2_random(&f[e]); - fp2_copy(&f[nf-1-e], &f[e]); - } - if(nf & 1){ - fp2_random(&f[nf>>1]); - } - - for(e = 0; e < (ng>>1); e++){ - fp2_random(&g[e]); - fp2_copy(&g[ng-1-e], &g[e]); - } - if(ng & 1){ - fp2_random(&g[ng>>1]); - } - - // Compute products - poly_mul_selfreciprocal(h, g, ng, f, nf); - slow_mul(fg, g, ng, f, nf); - - // Compare - for(e = 0; e < nf+ng-1; e++){ - assert(fp2_isequal(fg[e], h[e])==1); - } - } - } - printf("[%3d%%] Tested self reciprocal mul:\t\tNo errors!\n", 100 * nf / nmax); - - // TEST FOR PRODUCT TREES - int tree_size, iteration, i; - int len, *DEG, LENF; - poly *H, *F, h; - - for(tree_size = 1; tree_size < nmax; tree_size++){ - - printf("[%3d%%] Testing product tree:\t\t\tSize %d out of %d", 100 * tree_size / nmax, tree_size, nmax-1); - fflush(stdout); - printf("\r\x1b[K"); - - i = 0; - while((1<>1); e++){ - fp2_random(&F[i][e]); - fp2_copy(&F[i][LENF-1-e], &F[i][e]); - } - if(LENF & 1){ - fp2_random(&F[i][(LENF>>1)]); - } - } - product_tree_selfreciprocal(H, DEG, 0, F, LENF, tree_size); - - // Build product of all polynomials manually - len = LENF; - for(e = 0; e < LENF; e++){ - fp2_copy(&h[e], &F[0][e]); - } - for(i = 1; i < tree_size; i++){ - poly_mul(h, h, len, F[i], LENF); - len += LENF-1; - } - - // Compare to root - assert (len == DEG[0]+1); - for(e = 0; e < len; e++){ - assert(fp2_isequal(H[0][e], h[e])==1); - } - clear_tree(H, 0, tree_size); - for(i = 0; i < tree_size; i++){ - free(F[i]); - } - - } - free(DEG); - free(H); - free(F); - free(h); - } - printf("[%3d%%] Tested selfreciprocal product tree:\tNo errors!\n", 100 * tree_size / nmax); - - printf("-- All tests passed.\n"); - return 0; -} - diff --git a/src/ec/ref/ecx/test/poly-redc-test.c b/src/ec/ref/ecx/test/poly-redc-test.c deleted file mode 100644 index 3302ff3..0000000 --- a/src/ec/ref/ecx/test/poly-redc-test.c +++ /dev/null @@ -1,461 +0,0 @@ -#include "poly.h" -#include -#include -#define nmax 32 - -bool fp2_isequal(fp2_t a, fp2_t b){ - return fp_is_equal(a.re, b.re) && fp_is_equal(a.im, b.im); -} - -// VERY NOT SECURE (testing only) -void fp2_random(fp2_t *a){ - for(int i = 0; i < NWORDS_FIELD; i++){ - a->re[i] = rand(); - a->im[i] = rand(); - } - // Normalize - fp2_t one; - fp_mont_setone(one.re);fp_set(one.im,0); - fp2_mul(&*a, &*a, &one); - // Update seed - srand((unsigned) a->re[0]); -} - -int main(){ - fp2_t fp2_0, fp2_1; - fp2_set(&fp2_0, 0); - fp_mont_setone(fp2_1.re);fp_set(fp2_1.im,0); - - int lenf, leng, n, e, iteration, array_size, tree_size, i, root, brother, *DEG, LENF; - poly f, g, h, f_rev, f_rev_inv, *F, *H, *R, g1, g2, REM1, REM2, G1, G2, G1_rev, G2_rev, R0; - fp2_t c, *A, *C, ratio, A0; - - f_rev_inv = 0; - -// TEST FOR RECIPROCAL - for(lenf = 1; lenf < nmax; lenf++) - { - printf("[%3d%%] Testing reciprocals", 100 * lenf / nmax); - fflush(stdout); - printf("\r\x1b[K"); - - // Get random poly - f = malloc(sizeof(fp2_t)*lenf); - for(e = 0; e < lenf; e++) - fp2_random(&f[e]); - - for(n = 1; n < nmax; n++) - { - // Get the reciprocal and multiply them - h = malloc(sizeof(fp2_t)*n); - memset(h, 0, sizeof(fp2_t)*n); - reciprocal(h, &c, f, lenf, n); - poly_mul_low(h, n, f, lenf, h, n); - - // Compare with expected - assert(fp2_isequal(h[0],c)); - for(e = 1; e < n; e++) - assert(fp2_is_zero(&h[e])); - free(h); - } - free(f); - } - printf("[%3d%%] Tested reciprocals:\t\tNo errors!\n", 100 * lenf / nmax); - - - - // TEST FOR REDUCTION - for(lenf = 2; lenf < nmax; lenf++) - { - printf("[%3d%%] Testing polynomial reduction", 100 * lenf / nmax); - fflush(stdout); - printf("\r\x1b[K"); - - // Get random poly for the mod - f = malloc(sizeof(fp2_t)*lenf); - f_rev = malloc(sizeof(fp2_t)*lenf); - for(e = 0; e < lenf; e++) - { - fp2_random(&f[e]); - fp2_copy(&f_rev[lenf-1-e], &f[e]); - } - - for(leng = 1; leng < nmax; leng++) - { - // Get random poly to reduce - g = malloc(sizeof(fp2_t)*leng); - for(e = 0; e < leng; e++){ - fp2_random(&g[e]); - } - - // Get reverse-inverse mod x^(leng-lenf+1) - if(leng >= lenf) - { - f_rev_inv = malloc(sizeof(fp2_t)*(leng-lenf+1)); - reciprocal(f_rev_inv, &c, f_rev, lenf, leng-lenf+1); - } - else{ - fp_mont_setone(c.re);fp_set(c.im,0); - } - - // Compute the reduction - h = malloc(sizeof(fp2_t)*(lenf-1)); - poly_redc(h, g, leng, f, lenf, f_rev_inv, c); - - // Reduce manually - int leng_red = leng; - fp2_t scale, f_e; - while(leng_red >= lenf) - { - fp2_copy(&scale, &f[lenf-1]); - fp2_inv(&scale); - fp2_mul(&scale, &scale, &g[leng_red-1]); - for(e = 0; e < lenf; e++) - { - fp2_mul(&f_e, &f[e], &scale); - fp2_sub(&g[e+leng_red-lenf], &g[e+leng_red-lenf], &f_e); - } - leng_red--; - } - - // Rescale manual result - if( leng < lenf){ - fp_mont_setone(scale.re);fp_set(scale.im,0); - } - else - if(lenf == 2 && leng == 3) - { - fp2_sqr(&scale, &f[1]); - fp2_add(&scale, &scale, &scale); - } - else - fp2_copy(&scale, &c); - for(e = 0; e < leng_red; e++) - fp2_mul(&g[e], &g[e], &scale); - - - // Comapre results - for(e = leng_red-1; e >= 0; e--) - assert(fp2_isequal(h[e], g[e])); - for(e = leng_red; e < lenf-1; e++) - assert(fp2_is_zero(&h[e])); - - free(g); - free(h); - if(leng >= lenf) - free(f_rev_inv); - } - free(f); - free(f_rev); - } - printf("[%3d%%] Tested polynomial reduction:\tNo errors!\n", 100 * lenf / nmax); - - - -// TEST FOR RECIPROCAL TREES - - for(tree_size = 3; tree_size < nmax; tree_size++) - { - printf("[%3d%%] Testing reciprocal tree:\t\tTree size %d out of %d", 100 * tree_size / nmax, tree_size, nmax); - fflush(stdout); - printf("\r\x1b[K"); - - // Compute size of arrays - i = 0; - while((1< 1) - { - if(rand() & 1) - { - root = 2*root+1; - n = n - (n>>1); - } - else - { - root = 2*root+2; - n = n>>1; - } - brother = root - 1 + 2*(root & 1); - - // Check current node - if(DEG[root] > 2) - { - lenf = DEG[brother]; - f = malloc(sizeof(fp2_t)*lenf); - for(e = 0; e < DEG[root]+1 && e < lenf; e++){ - fp2_copy(&f[e], &H[root][DEG[root]-e]); - } - for(e = DEG[root]+1; e < lenf; e++){ - fp2_set(&f[e], 0); - } - poly_mul_low(f, lenf, f, lenf, R[root], lenf); - assert(fp2_isequal(f[0], A[root])); - for(e = 1; e < lenf; e++){ - assert(fp2_is_zero(&f[e])); - } - free(f); - } - } - } - // Clean up - for(i = 0; i < tree_size; i++) - free(F[i]); - clear_tree(H, 0, tree_size); - clear_tree(R, 0, tree_size); - free(F); - free(H); - free(R); - free(A); - free(DEG); - } - printf("[%3d%%] Tested reciprocal tree:\t\tNo errors!\n", 100 * tree_size / nmax); - - - - // TEST FOR REMAINDERS - for(tree_size = 2; tree_size < nmax; tree_size++) - { - printf("[%3d%%] Testing batched remainders:\t\tTree size %d out of %d", 100 * tree_size / nmax, tree_size, nmax); - fflush(stdout); - printf("\r\x1b[K"); - - // Compute size of arrays - i = 0; - while((1< leng-DEG[0]) - reciprocal(R0, &A0, f_rev, DEG[0]+1, DEG[0]); - else - reciprocal(R0, &A0, f_rev, DEG[0]+1, leng-DEG[0]); - poly_redc(G1, g1, leng, H[0], DEG[0]+1, R0, A0); - poly_redc(G2, g2, leng, H[0], DEG[0]+1, R0, A0); - for(e = 0; e < DEG[0]; e++) - { - fp2_copy(&G1_rev[e], &G1[DEG[0]-1-e]); - fp2_copy(&G2_rev[e], &G2[DEG[0]-1-e]); - } - poly_mul_middle(G1_rev, G1_rev, DEG[0], R0, DEG[0]); - poly_mul_middle(G2_rev, G2_rev, DEG[0], R0, DEG[0]); - for(e = 0; e < DEG[0]; e++) - { - fp2_copy(&G1[e], &G1_rev[DEG[0]-1-e]); - fp2_copy(&G2[e], &G2_rev[DEG[0]-1-e]); - } - free(G1_rev);free(G2_rev);free(R0);free(f_rev); - - // Compute the scaled remainder trees - multieval_scaled(REM1, G1, H, DEG, 0, tree_size); - multieval_scaled(REM2, G2, H, DEG, 0, tree_size); - - for(i = 0; i < tree_size; i++) - { - // Get ratio of the remainder - fp2_inv(&REM1[i]); - fp2_mul(&ratio, &REM1[i], &REM2[i]); - - // Compute remainders manually - f_rev = malloc(sizeof(fp2_t)*LENF); - f_rev_inv = malloc(sizeof(fp2_t)*(leng-LENF+1)); - h = malloc(sizeof(fp2_t)*(LENF-1)); - for(e = 0; e < LENF; e++) - fp2_copy(&f_rev[e], &F[i][LENF-1-e]); - reciprocal(f_rev_inv, &c, f_rev, LENF, leng-LENF+1); - poly_redc(h, g1, leng, F[i], LENF, f_rev_inv, c); - fp2_copy(&REM1[i], &h[0]); - poly_redc(h, g2, leng, F[i], LENF, f_rev_inv, c); - fp2_copy(&REM2[i], &h[0]); - free(f_rev);free(f_rev_inv);free(h); - - // Compare results - fp2_inv(&REM1[i]); - fp2_mul(&REM1[i], &REM1[i], &REM2[i]); - assert(fp2_isequal(REM1[i], ratio)); - } - - // Clean up - for(i = 0; i < tree_size; i++) - free(F[i]); - free(F);free(g1);free(g2);free(G1);free(G2); - clear_tree(H, 0, tree_size);free(H);free(DEG); - free(REM1);free(REM2); - } - printf("[%3d%%] Tested scaled remainder tree:\tNo errors!\n", 100 * tree_size / nmax); - - printf("-- All tests passed.\n"); -} diff --git a/src/ec/ref/ecx/test/test_extras.c b/src/ec/ref/ecx/test/test_extras.c deleted file mode 100755 index 83921dc..0000000 --- a/src/ec/ref/ecx/test/test_extras.c +++ /dev/null @@ -1,75 +0,0 @@ -#include "test_extras.h" -#include - -// Global constants -extern const digit_t p[NWORDS_FIELD]; -extern const digit_t R2[NWORDS_FIELD]; - - -#if 0 -int64_t cpucycles(void) -{ // Access system counter for benchmarking - unsigned int hi, lo; - - asm volatile ("rdtsc\n\t" : "=a" (lo), "=d"(hi)); - return ((int64_t)lo) | (((int64_t)hi) << 32); -} -#endif - - -int compare_words(digit_t* a, digit_t* b, unsigned int nwords) -{ // Comparing "nword" elements, a=b? : (1) a>b, (0) a=b, (-1) a= 0; i--) - { - if (a[i] > b[i]) return 1; - else if (a[i] < b[i]) return -1; - } - - return 0; -} - - -void sub_test(digit_t* out, digit_t* a, digit_t* b, unsigned int nwords) -{ // Subtraction without borrow, out = a-b where a>b - // SECURITY NOTE: this function does not have constant-time execution. It is for TESTING ONLY. - unsigned int i; - digit_t res, carry, borrow = 0; - - for (i = 0; i < nwords; i++) - { - res = a[i] - b[i]; - carry = (a[i] < b[i]); - out[i] = res - borrow; - borrow = carry || (res < borrow); - } -} - - -void fprandom_test(digit_t* a) -{ // Generating a pseudo-random field element in [0, p-1] - // SECURITY NOTE: distribution is not fully uniform. TO BE USED FOR TESTING ONLY. - unsigned int i, diff = 256-254, nwords = NWORDS_FIELD; - unsigned char* string = NULL; - - string = (unsigned char*)a; - for (i = 0; i < sizeof(digit_t)*nwords; i++) { - *(string + i) = (unsigned char)rand(); // Obtain 256-bit number - } - a[nwords-1] &= (((digit_t)(-1) << diff) >> diff); - - while (compare_words((digit_t*)p, a, nwords) < 1) { // Force it to [0, modulus-1] - sub_test(a, a, (digit_t*)p, nwords); - } -} - - -void fp2random_test(fp2_t* a) -{ // Generating a pseudo-random element in GF(p^2) - // SECURITY NOTE: distribution is not fully uniform. TO BE USED FOR TESTING ONLY. - - fprandom_test(a->re); - fprandom_test(a->im); -} \ No newline at end of file diff --git a/src/ec/ref/ecx/test/test_extras.h b/src/ec/ref/ecx/test/test_extras.h deleted file mode 100755 index 5941865..0000000 --- a/src/ec/ref/ecx/test/test_extras.h +++ /dev/null @@ -1,29 +0,0 @@ - -#ifndef TEST_EXTRAS_H -#define TEST_EXTRAS_H - -#include -#include -#include -#include -#include - -#define PASSED 0 -#define FAILED 1 - -// Access system counter for benchmarking -//int64_t cpucycles(void); - -// Comparing "nword" elements, a=b? : (1) a!=b, (0) a=b -int compare_words(digit_t* a, digit_t* b, unsigned int nwords); - -// Multiprecision subtraction for testing, assumes a > b -void sub_test(digit_t* out, digit_t* a, digit_t* b, unsigned int nwords); - -// Generating a pseudo-random field element in [0, p-1] -void fprandom_test(digit_t* a); - -// Generating a pseudo-random element in GF(p^2) -void fp2random_test(fp2_t* a); - -#endif \ No newline at end of file diff --git a/src/ec/ref/ecx/test/velu-test.c b/src/ec/ref/ecx/test/velu-test.c deleted file mode 100644 index da8bfc6..0000000 --- a/src/ec/ref/ecx/test/velu-test.c +++ /dev/null @@ -1,298 +0,0 @@ -#include -#include -#include -#include - -#include "isog.h" -#include "sdacs.h" -#include "ec.h" -#include "test-basis.h" - -void random_scalar(fp_t k, const uint8_t j) -{ - for(int i = 0; i < NWORDS_FIELD; i++) - k[i] = rand(); -} - -// Affine Montgomery coefficient computation (A + 2C : 4C) --> A/C -void coeff(fp2_t *B, ec_point_t const A) -{ - fp2_t t; - fp2_add(&t, &A.x, &A.x); // (2 * A24) - fp2_sub(&t, &t, &A.z); // (2 * A24) - C24 - - fp2_copy(&*B, &A.z); - fp2_inv(&*B); // 1 / (C24) - fp2_add(&t, &t, &t); // 4*A = 2[(2 * A24) - C24] - fp2_mul(&*B, &t, &*B); // A/C = 2[(2 * A24) - C24] / C24 -} - -// Determines if point is fp2-rational (if not, then it must be a zero trace point) -uint8_t isrational(ec_point_t const T, fp2_t const a) -{ - fp2_t XT, tmp, aux, YT_squared; - - fp2_copy(&XT, &T.z); - fp2_inv(&XT); - - fp2_mul(&XT, &XT, &T.x); - - fp2_sqr(&tmp, &XT); - fp2_mul(&aux, &tmp, &XT); - fp2_mul(&tmp, &tmp, &a); - fp2_add(&YT_squared, &tmp, &aux); - fp2_add(&YT_squared, &YT_squared, &XT); - - return fp2_is_square(&YT_squared); -} - -// ladder3pt computes x(P + [m]Q) -void ladder3pt(ec_point_t *R, fp_t const m, ec_point_t const *P, ec_point_t const *Q, ec_point_t const *PQ, ec_point_t const *A) -{ - ec_point_t X0, X1, X2; - copy_point(&X0, Q); - copy_point(&X1, P); - copy_point(&X2, PQ); - - int i,j; - uint64_t t; - for (i = 0; i < NWORDS_FIELD; i++) - { - t = 1; - for (j = 0 ; j < 64; j++) - { - swap_points(&X1, &X2, -((t & m[i]) == 0)); - xDBLADD(&X0, &X1, &X0, &X1, &X2, A); - swap_points(&X1, &X2, -((t & m[i]) == 0)); - t <<= 1; - }; - }; - copy_point(R, &X1); -} - -// The projective x-coordinate point (X : Z) at infinity is such that Z == 0 -static inline int isinfinity(ec_point_t const P) -{ - return fp2_is_zero(&P.z); -} - -int main() -{ - - fp2_t fp2_0, fp2_1; - fp2_set(&fp2_0, 0); - fp_mont_setone(fp2_1.re);fp_set(fp2_1.im,0); - - int i, j; - - ec_point_t A, B, T; - fp2_set(&A.x, 0); - fp_mont_setone(A.z.re);fp_set(A.z.im,0); - - // fp2_add(&A.x, &A.z, &A.x); // 1 - // fp2_add(&A.x, &A.x, &A.x); // 2 - // fp2_add(&A.x, &A.z, &A.x); // 3 - // fp2_add(&A.x, &A.x, &A.x); // 6 - - fp2_add(&A.z, &A.z, &A.z); // 2C - fp2_add(&A.x, &A.x, &A.z); // A' + 2C - fp2_add(&A.z, &A.z, &A.z); // 4C - - // Just to ensure the projective curve coeffientes are different from zero - assert( !fp2_is_zero(&A.x) & !fp2_is_zero(&A.x) ); - - fp2_t a; - coeff(&a, A); - - ec_point_t PA, QA, PQA, PB, QB, PQB, RA, RB; - - // Writing the public projective x-coordinate points into Montogmery domain - fp2_tomont(&(PA.x), &(xPA)); - fp_mont_setone(PA.z.re);fp_set(PA.z.im,0); - fp2_tomont(&(QA.x), &(xQA)); - fp_mont_setone(QA.z.re);fp_set(QA.z.im,0); - fp2_tomont(&(PQA.x), &(xPQA)); - fp_mont_setone(PQA.z.re);fp_set(PQA.z.im,0); - - assert( isrational(PA, a) ); - assert( isrational(QA, a) ); - assert( isrational(PQA, a) ); - - fp2_tomont(&(PB.x), &(xPB)); - fp_mont_setone(PB.z.re);fp_set(PB.z.im,0); - fp2_tomont(&(QB.x), &(xQB)); - fp_mont_setone(QB.z.re);fp_set(QB.z.im,0); - fp2_tomont(&(PQB.x), &(xPQB)); - fp_mont_setone(PQB.z.re);fp_set(PQB.z.im,0); - - assert( !isrational(PB, a) ); - assert( !isrational(QB, a) ); - assert( !isrational(PQB, a) ); - // ====================================================================================================== - // Recall, PA, QA, and PQA are expeted to be N-order points, but we require to ensure they are of order N - for (j = 0; j < P_LEN; j++) - { - for (i = 1; i < TORSION_ODD_POWERS[j]; i++) - { - xMULv2(&PA, &PA, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - xMULv2(&QA, &QA, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - xMULv2(&PQA, &PQA, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - - assert( isrational(PA, a) ); - assert( isrational(QA, a) ); - assert( isrational(PQA, a) ); - }; - }; - - assert( !isinfinity(PA) ); - assert( !isinfinity(QA) ); - assert( !isinfinity(PQA) ); - - // -------------------------------------------------------------- - fp_t m; - random_scalar(m, 0); - ladder3pt(&RA, m, &PA, &QA, &PQA, &A); - for (i = 0; i < P_LEN; i++) - { - printf("// Processing the %d-th prime:\t", i + 1); - printf("%2d%%", 100 * i / (int)P_LEN); - fflush(stdout); - printf("\r\x1b[K"); - - copy_point(&T, &RA); - for (j = (i+1); j < P_LEN; j++) - xMULv2(&T, &T, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - - assert( !isinfinity(T) ); - - kps(i, T, A); - if (TORSION_ODD_PRIMES[i] > gap) - printf("[\033[0;31m%7" PRId64 "\033[0m] (#I: %3d, #J: %3d, #K: %3d) \n", TORSION_ODD_PRIMES[i], sI, sJ, sK); - else - printf("[\033[0;31m%7" PRId64 "\033[0m] --------------------------- \n", TORSION_ODD_PRIMES[i]); - - xisog(&B, i, A); - - xeval(&PB, i, PB, A); - coeff(&a, B); - assert( !isinfinity(PB) ); - assert( !isrational(PB, a) ); - - xeval(&RA, i, RA, A); - assert( (!isinfinity(RA) && (i < (P_LEN - 1))) || (isinfinity(RA) && (i == (P_LEN - 1))) ); - assert( (isrational(RA, a) && (i < (P_LEN - 1))) || (isinfinity(RA) && (i == (P_LEN - 1))) ); - - copy_point(&A, &B); - // Verifying the order of the image point of PA has been reduced - copy_point(&T, &RA); - for (j = (i+1); j < P_LEN; j++) - xMULv2(&T, &T, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - - assert( isinfinity(T) ); - kps_clear(i); - }; - - fp2_set(&A.x, 0); - fp_mont_setone(A.z.re);fp_set(A.z.im,0); - - // fp2_add(&A.x, &A.z, &A.x); // 1 - // fp2_add(&A.x, &A.x, &A.x); // 2 - // fp2_add(&A.x, &A.z, &A.x); // 3 - // fp2_add(&A.x, &A.x, &A.x); // 6 - - fp2_add(&A.z, &A.z, &A.z); // 2C - fp2_add(&A.x, &A.x, &A.z); // A' + 2C - fp2_add(&A.z, &A.z, &A.z); // 4C - - // Just to ensure the projective curve coeffientes are different from zero - assert( !fp2_is_zero(&A.x) & !fp2_is_zero(&A.x) ); - - coeff(&a, A); - // Writing the public projective x-coordinate points into Montogmery domain - fp2_tomont(&(PA.x), &(xPA)); - fp_mont_setone(PA.z.re);fp_set(PA.z.im,0); - fp2_tomont(&(QA.x), &(xQA)); - fp_mont_setone(QA.z.re);fp_set(QA.z.im,0); - fp2_tomont(&(PQA.x), &(xPQA)); - fp_mont_setone(PQA.z.re);fp_set(PQA.z.im,0); - - assert( isrational(PA, a) ); - assert( isrational(QA, a) ); - assert( isrational(PQA, a) ); - - fp2_tomont(&(PB.x), &(xPB)); - fp_mont_setone(PB.z.re);fp_set(PB.z.im,0); - fp2_tomont(&(QB.x), &(xQB)); - fp_mont_setone(QB.z.re);fp_set(QB.z.im,0); - fp2_tomont(&(PQB.x), &(xPQB)); - fp_mont_setone(PQB.z.re);fp_set(PQB.z.im,0); - - assert( !isrational(PB, a) ); - assert( !isrational(QB, a) ); - assert( !isrational(PQB, a) ); - - // ====================================================================================================== - // Recall, PA, QA, and PQA are expeted to be N-order points, but we require to ensure they are of order N - for (j = P_LEN; j < (P_LEN+M_LEN); j++) - { - for (i = 1; i < TORSION_ODD_POWERS[j]; i++) - { - xMULv2(&PB, &PB, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - xMULv2(&QB, &QB, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - xMULv2(&PQB, &PQB, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - - assert( !isrational(PB, a) ); - assert( !isrational(QB, a) ); - assert( !isrational(PQB, a) ); - }; - }; - - assert( !isinfinity(PB) ); - assert( !isinfinity(QB) ); - assert( !isinfinity(PQB) ); - - random_scalar(m, 1); - ladder3pt(&RB, m, &PB, &QB, &PQB, &A); - for (i = P_LEN; i < (P_LEN+M_LEN); i++) - { - printf("// Processing the %d-th prime:\t", i + 1); - printf("%2d%%", 100 * i / (int)(P_LEN+M_LEN)); - fflush(stdout); - printf("\r\x1b[K"); - - copy_point(&T, &RB); - for (j = (i+1); j < (P_LEN+M_LEN); j++) - xMULv2(&T, &T, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - - assert( !isinfinity(T) ); - - kps(i, T, A); - if (TORSION_ODD_PRIMES[i] > gap) - printf("[\033[0;31m%7" PRId64 "\033[0m] (#I: %3d, #J: %3d, #K: %3d) \n", TORSION_ODD_PRIMES[i], sI, sJ, sK); - else - printf("[\033[0;31m%7" PRId64 "\033[0m] --------------------------- \n", TORSION_ODD_PRIMES[i]); - - xisog(&B, i, A); - - xeval(&PA, i, PA, A); - coeff(&a, B); - assert( !isinfinity(PA) ); - assert( isrational(PA, a) ); - - xeval(&RB, i, RB, A); - assert( (!isinfinity(RB) && (i < (P_LEN + M_LEN - 1))) || (isinfinity(RB) && (i == (P_LEN + M_LEN - 1))) ); - assert( (!isrational(RB, a) && (i < (P_LEN + M_LEN - 1))) || (isinfinity(RB) && (i == (P_LEN + M_LEN - 1))) ); - - copy_point(&A, &B); - // Verifying the order of the image point of PB has been reduced - copy_point(&T, &RB); - for (j = (i+1); j < (P_LEN+M_LEN); j++) - xMULv2(&T, &T, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - - assert( isinfinity(T) ); - kps_clear(i); - }; - - printf("-- All tests passed!\n"); - return 0; -} diff --git a/src/ec/ref/ecx/xeval.c b/src/ec/ref/ecx/xeval.c deleted file mode 100644 index 5bf83a3..0000000 --- a/src/ec/ref/ecx/xeval.c +++ /dev/null @@ -1,299 +0,0 @@ -#include "isog.h" -#include "ec.h" -#include - -// ----------------------------------------------------------------------------------------- -// ----------------------------------------------------------------------------------------- -// Traditional isogeny evaluation (xEVAL) - -// CrissCross procedure as described in Hisil and Costello paper -void CrissCross(fp2_t *r0, fp2_t *r1, fp2_t const alpha, fp2_t const beta, fp2_t const gamma, fp2_t const delta) -{ - fp2_t t_1, t_2; - - fp2_mul(&t_1, &alpha, &delta); - fp2_mul(&t_2, &beta, &gamma); - fp2_add(&*r0, &t_1, &t_2); - fp2_sub(&*r1, &t_1, &t_2); -} - -// Degree-2 isogeny evaluation with kenerl generated by P != (0, 0) -void xeval_2(ec_point_t* R, ec_point_t* const Q, const int lenQ) -{ - fp2_t t0, t1, t2; - for(int j = 0; j < lenQ; j++){ - fp2_add(&t0, &Q[j].x, &Q[j].z); - fp2_sub(&t1, &Q[j].x, &Q[j].z); - fp2_mul(&t2, &K[0].x, &t1); - fp2_mul(&t1, &K[0].z, &t0); - fp2_add(&t0, &t2, &t1); - fp2_sub(&t1, &t2, &t1); - fp2_mul(&R[j].x, &Q[j].x, &t0); - fp2_mul(&R[j].z, &Q[j].z, &t1); - } -} - -// Degree-4 isogeny evaluation with kenerl generated by P such that [2]P != (0, 0) -void xeval_4(ec_point_t* R, const ec_point_t* Q, const int lenQ) -{ - fp2_t t0, t1; - - for(int i = 0; i < lenQ; i++){ - fp2_add(&t0, &Q[i].x, &Q[i].z); - fp2_sub(&t1, &Q[i].x, &Q[i].z); - fp2_mul(&(R[i].x), &t0, &K[1].x); - fp2_mul(&(R[i].z), &t1, &K[2].x); - fp2_mul(&t0, &t0, &t1); - fp2_mul(&t0, &t0, &K[0].x); - fp2_add(&t1, &(R[i].x), &(R[i].z)); - fp2_sub(&(R[i].z), &(R[i].x), &(R[i].z)); - fp2_sqr(&t1, &t1); - fp2_sqr(&(R[i].z), &(R[i].z)); - fp2_add(&(R[i].x), &t0, &t1); - fp2_sub(&t0, &t0, &(R[i].z)); - fp2_mul(&(R[i].x), &(R[i].x), &t1); - fp2_mul(&(R[i].z), &(R[i].z), &t0); - } -} - -// Degree-4 isogeny evaluation with kenerl generated by P such that [2]P = (0, 0) -// Must call after xisog_4_singular -void xeval_4_singular(ec_point_t* R, const ec_point_t* Q, const int lenQ, const ec_point_t P) -{ - fp2_t t0, t1, t2; - for(int i = 0; i < lenQ; i++){ - fp2_add(&t0, &Q[i].x, &Q[i].z); - fp2_sub(&t2, &Q[i].x, &Q[i].z); - fp2_sqr(&t0, &t0); - fp2_sqr(&t2, &t2); - fp2_sub(&R[i].z, &t0, &t2); - if(fp2_is_equal(&P.x, &P.z)){ - // Branch for P = (+1,_) - fp2_copy(&t1, &t2); - } - else{ - // Branch for P = (-1,_) - fp2_copy(&t1, &t0); - fp2_copy(&t0, &t2); - } - fp2_mul(&R[i].x, &R[i].z, &K[0].x); - fp2_mul(&R[i].z, &R[i].z, &K[1].x); - fp2_mul(&R[i].z, &R[i].z, &t1); - fp2_mul(&t1, &t1, &K[0].z); - fp2_add(&R[i].x, &R[i].x, &t1); - fp2_mul(&R[i].x, &R[i].x, &t0); - } -} - -// Isogeny evaluation on Montgomery curves -// Recall: K has been computed in Twisted Edwards model and none extra additions are required. -void xeval_t(ec_point_t* Q, uint64_t const i, ec_point_t const P) -{ - int j; - int d = ((int)TORSION_ODD_PRIMES[i] - 1) / 2; // Here, l = 2d + 1 - - fp2_t R0, R1, S0, S1, T0, T1; - fp2_add(&S0, &P.x, &P.z); - fp2_sub(&S1, &P.x, &P.z); - - CrissCross(&R0, &R1, K[0].z, K[0].x, S0, S1); - for (j = 1; j < d; j++) - { - CrissCross(&T0, &T1, K[j].z, K[j].x, S0, S1); - fp2_mul(&R0, &T0, &R0); - fp2_mul(&R1, &T1, &R1); - }; - - fp2_sqr(&R0, &R0); - fp2_sqr(&R1, &R1); - - fp2_mul(&(Q->x), &P.x, &R0); - fp2_mul(&(Q->z), &P.z, &R1); -} - -// ----------------------------------------------------------------------------------------- -// ----------------------------------------------------------------------------------------- -// Isogeny evaluation (xEVAL) used in velu SQRT - -void xeval_s(ec_point_t* Q, uint64_t const i, ec_point_t const P, ec_point_t const A) -{ - // ================================================================================= - assert(TORSION_ODD_PRIMES[i] > gap); // Ensuring velusqrt is used for l_i > gap - sI = sizeI[i]; // size of I - sJ = sizeJ[i]; // size of J - sK = sizeK[i]; // size of K - - assert(sI >= sJ); // Ensuring #I >= #J - assert(sK >= 0); // Recall, it must be that #K >= 0 - assert(sJ > 1); // ensuring sI >= sJ > 1 - // ================================================================================= - - // We require the curve coefficient A = A'/C ... well, a multiple of these ones - fp2_t Ap; - fp2_add(&Ap, &A.x, &A.x); // 2A' + 4C - fp2_sub(&Ap, &Ap, &A.z); // 2A' - fp2_add(&Ap, &Ap, &Ap); // 4A' - - // -------------------------------------------------------------------------------------------------- - // ~~~~~~~~ - // | | - // Computing E_J(W) = | | [ F0(W, x([j]P)) * alpha^2 + F1(W, x([j]P)) * alpha + F2(W, x([j]P)) ] - // j in J - // In order to avoid costly inverse computations in fp, we are gonna work with projective coordinates - // In particular, for a degree-l isogeny construction, we need alpha = X/Z and alpha = Z/X (i.e., 1/alpha) - - //fp2_t EJ_0[sJ][3]; // EJ_0[j][2] factors of one polynomial to be used in a resultant - - fp2_t XZ_add, XZj_add, - XZ_sub, XZj_sub, - AXZ2, - CXZ2, - CX2Z2, - t1, t2; - - fp2_add(&XZ_add, &P.x, &P.z); // X + Z - fp2_sub(&XZ_sub, &P.x, &P.z); // X - Z - - fp2_mul(&AXZ2, &P.x, &P.z); // X * Z - fp2_sqr(&t1, &P.x); // X ^ 2 - fp2_sqr(&t2, &P.z); // Z ^ 2 - - fp2_add(&CX2Z2, &t1, &t2); // X^2 + Z^2 - fp2_mul(&CX2Z2, &CX2Z2, &A.z); // C * (X^2 + Z^2) - - fp2_add(&AXZ2, &AXZ2, &AXZ2); // 2 * (X * Z) - fp2_mul(&CXZ2, &AXZ2, &A.z); // C * [2 * (X * Z)] - fp2_mul(&AXZ2, &AXZ2, &Ap); // A' * [2 * (X * Z)] - - int j; - for (j = 0; j < sJ; j++) - { - fp2_add(&XZj_add, &J[j].x, &J[j].z); // Xj + Zj - fp2_sub(&XZj_sub, &J[j].x, &J[j].z); // Xj - Zj - - fp2_mul(&t1, &XZ_sub, &XZj_add); // (X - Z) * (Xj + Zj) - fp2_mul(&t2, &XZ_add, &XZj_sub); // (X + Z) * (Xj - Zj) - - // ................................... - // Computing the quadratic coefficient - fp2_sub(&EJ_0[j][2], &t1, &t2); // 2 * [(X*Zj) - (Z*Xj)] - fp2_sqr(&EJ_0[j][2], &EJ_0[j][2]); // ( 2 * [(X*Zj) - (Z*Xj)] )^2 - fp2_mul(&EJ_0[j][2], &A.z, &EJ_0[j][2]); // C * ( 2 * [(X*Zj) - (Z*Xj)] )^2 - - // .................................. - // Computing the constant coefficient - fp2_add(&EJ_0[j][0], &t1, &t2); // 2 * [(X*Xj) - (Z*Zj)] - fp2_sqr(&EJ_0[j][0], &EJ_0[j][0]); // ( 2 * [(X*Xj) - (Z*Zj)] )^2 - fp2_mul(&EJ_0[j][0], &A.z, &EJ_0[j][0]); // C * ( 2 * [(X*Xj) - (Z*Zj)] )^2 - - // ................................ - // Computing the linear coefficient - - // C * [ (-2*Xj*Zj)*(alpha^2 + 1) + (-2*alpha)*(Xj^2 + Zj^2)] + [A' * (-2*Xj*Zj) * (2*X*Z)] where alpha = X/Z - fp2_add(&t1, &J[j].x, &J[j].z); // (Xj + Zj) - fp2_sqr(&t1, &t1); // (Xj + Zj)^2 - fp2_add(&t1, &t1, &t1); // 2 * (Xj + Zj)^2 - fp2_add(&t1, &t1, &XZJ4[j]); // 2 * (Xj + Zj)^2 - (4*Xj*Zj) := 2 * (Xj^2 + Zj^2) - fp2_mul(&t1, &t1, &CXZ2); // [2 * (Xj^2 + Zj^2)] * (2 * [ C * (X * Z)]) - - fp2_mul(&t2, &CX2Z2, &XZJ4[j]); // [C * (X^2 + Z^2)] * (-4 * Xj * Zj) - fp2_sub(&t1, &t2, &t1); // [C * (X^2 + Z^2)] * (-4 * Xj * Zj) - [2 * (Xj^2 + Zj^2)] * (2 * [ C * (X * Z)]) - - fp2_mul(&t2, &AXZ2, &XZJ4[j]); // (2 * [A' * (X * Z)]) * (-4 * Xj * Zj) - fp2_add(&EJ_0[j][1], &t1, &t2); // This is our desired equation but multiplied by 2 - fp2_add(&EJ_0[j][1], &EJ_0[j][1], &EJ_0[j][1]); // This is our desired equation but multiplied by 4 - }; - - // --------------------------------------------------------------------- - // The faster way for multiplying is using a divide-and-conquer approach - - // product tree of EJ_0 (we only require the root) - product_tree_LENFeq3(ptree_EJ, deg_ptree_EJ, 0, EJ_0, sJ); - assert( deg_ptree_EJ[0] == (2*sJ) ); - if (!scaled) - { - // unscaled remainder tree approach - multieval_unscaled(leaves, ptree_EJ[0], 2*sJ + 1, rtree_hI, (const fp2_t*)rtree_A, ptree_hI, deg_ptree_hI, 0, sI); - } - else - { - // scaled remainder tree approach - fp2_t G[sI_max], G_rev[sI_max]; - poly_redc(G, ptree_EJ[0], 2*sJ + 1, ptree_hI[0], sI + 1, R0, A0); - for (j = 0; j < sI; j++) - fp2_copy(&G_rev[j], &G[sI - 1 - j]); - - poly_mul_middle(G_rev, G_rev, sI, R0, sI); - for (j = 0; j < sI; j++) - fp2_copy(&G[j], &G_rev[sI - 1 - j]); - - multieval_scaled(leaves, G, ptree_hI, deg_ptree_hI, 0, sI); - }; - - // Finally, we must multiply the leaves of the outpur of remainders - fp2_t r0; - product(&r0, (const fp2_t*)leaves, sI); - // EJ_1 is just reverting the ordering in the coefficients of EJ_0 - for (j = 0; j < sJ; j++){ - fp2_copy(&t1, &ptree_EJ[0][j]); - fp2_copy(&ptree_EJ[0][j], &ptree_EJ[0][2*sJ - j]); - fp2_copy(&ptree_EJ[0][2*sJ - j], &t1); - } - - if (!scaled) - { - // unscaled remainder tree approach - multieval_unscaled(leaves, ptree_EJ[0], 2*sJ + 1, rtree_hI, (const fp2_t*)rtree_A, ptree_hI, deg_ptree_hI, 0, sI); - } - else - { - // scaled remainder tree approach - fp2_t G[sI_max], G_rev[sI_max]; - poly_redc(G, ptree_EJ[0], 2*sJ + 1, ptree_hI[0], sI + 1, R0, A0); - for (j = 0; j < sI; j++) - fp2_copy(&G_rev[j], &G[sI - 1 - j]); - - poly_mul_middle(G_rev, G_rev, sI, R0, sI); - for (j = 0; j < sI; j++) - fp2_copy(&G[j], &G_rev[sI - 1 - j]); - - multieval_scaled(leaves, G, ptree_hI, deg_ptree_hI, 0, sI); - }; - clear_tree(ptree_EJ, 0, sJ); - // Finally, we must multiply the leaves of the outpur of remainders - fp2_t r1; - product(&r1, (const fp2_t*)leaves, sI); - - // ------------------------------- - // Sometimes the public value sK is equal to zero, - // Thus for avoing runtime error we add one when sK =0 - fp2_t hK_0[sK_max + 1], hK_1[sK_max + 1], hk_0, hk_1; - for (j = 0; j < sK; j++) - { - fp2_add(&XZj_add, &K[j].x, &K[j].z); // Xk + Zk - fp2_sub(&XZj_sub, &K[j].x, &K[j].z); // Xk - Zk - fp2_mul(&t1, &XZ_sub, &XZj_add); // (X - Z) * (Xk + Zk) - fp2_mul(&t2, &XZ_add, &XZj_sub); // (X + Z) * (Xk - Zk) - - // Case alpha = X/Z - fp2_sub(&hK_0[j], &t1, &t2); // 2 * [(X*Zk) - (Z*Xk)] - - // Case 1/alpha = Z/X - fp2_add(&hK_1[j], &t1, &t2); // 2 * [(X*Xk) - (Z*Zk)] - }; - - // hk_0 <- use product to mulitiply all the elements in hK_0 - product(&hk_0, (const fp2_t*)hK_0, sK); - // hk_1 <- use product to mulitiply all the elements in hK_1 - product(&hk_1, (const fp2_t*)hK_1, sK); - - // --------------------------------------------------------------------------------- - // Now, unifying all the computations - fp2_mul(&t1, &hk_1, &r1); // output of algorithm 2 with 1/alpha = Z/X and without the demoninator - fp2_sqr(&t1, &t1); - fp2_mul(&(Q->x), &t1, &P.x); - - fp2_mul(&t2, &hk_0, &r0); // output of algorithm 2 with alpha = X/Z and without the demoninator - fp2_sqr(&t2, &t2); - fp2_mul(&(Q->z), &t2, &P.z); -} diff --git a/src/ec/ref/ecx/xisog.c b/src/ec/ref/ecx/xisog.c deleted file mode 100644 index df07430..0000000 --- a/src/ec/ref/ecx/xisog.c +++ /dev/null @@ -1,295 +0,0 @@ -#include "isog.h" -#include "ec.h" -#include - -// ------------------------------------------------------------------------- -// ------------------------------------------------------------------------- - -// Degree-2 isogeny with kernel generated by P != (0 ,0) -// Outputs the curve coefficient in the form A24=(A+2C:4C) -void xisog_2(ec_point_t* B, ec_point_t const P) -{ - fp2_sqr(&B->x, &P.x); - fp2_sqr(&B->z, &P.z); - fp2_sub(&B->x, &B->z, &B->x); - fp2_add(&K[0].x, &P.x, &P.z); - fp2_sub(&K[0].z, &P.x, &P.z); -} - -// Degree-4 isogeny with kernel generated by P such that [2]P != (0 ,0) -// Outputs the curve coefficient in the form A24=(A+2C:4C) -void xisog_4(ec_point_t* B, ec_point_t const P) -{ - fp2_sqr(&K[0].x, &P.x); - fp2_sqr(&K[0].z, &P.z); - fp2_add(&K[1].x, &K[0].z, &K[0].x); - fp2_sub(&K[1].z, &K[0].z, &K[0].x); - fp2_mul(&B->x, &K[1].x, &K[1].z); - fp2_sqr(&B->z, &K[0].z); - - // Constants for xeval_4 - fp2_add(&K[2].x, &P.x, &P.z); - fp2_sub(&K[1].x, &P.x, &P.z); - fp2_add(&K[0].x, &K[0].z, &K[0].z); - fp2_add(&K[0].x, &K[0].x, &K[0].x); -} - -// Degree-4 isogeny with kernel generated by P such that [2]P = (0 ,0) -void xisog_4_singular(ec_point_t* B24, ec_point_t const P, ec_point_t A24) -{ - fp2_copy(&K[0].z, &A24.z); - if(fp2_is_equal(&P.x, &P.z)){ - // Case for P=(1,_) - fp2_copy(&K[0].x, &A24.x); - fp2_sub(&K[1].x, &A24.x, &A24.z); - fp2_neg(&B24->z, &K[1].x); - } - else{ - // Case for P=(-1,_) - fp2_copy(&K[1].x, &A24.x); - fp2_sub(&K[0].x, &A24.x, &A24.z); - fp2_neg(&B24->z, &K[0].x); - fp2_copy(&B24->z, &K[1].x); - } - fp2_copy(&B24->x, &K[0].z); -} - -// xISOG procedure, which is a hybrid between Montgomery and Twisted Edwards -// This tradition fomulae corresponds with the Twisted Edwards formulae but -// mapping the output into Montgomery form -void xisog_t(ec_point_t* B, uint64_t const i, ec_point_t const A) -{ - int j; - int d = ((int)TORSION_ODD_PRIMES[i] - 1) / 2; // Here, l = 2d + 1 - - fp2_t By, Bz, constant_d_edwards, tmp_a, tmp_d; - - fp2_copy(&By, &K[0].x); - fp2_copy(&Bz, &K[0].z); - - for (j = 1; j < d; j++) - { - fp2_mul(&By, &By, &K[j].x); - fp2_mul(&Bz, &Bz, &K[j].z); - }; - - // Mapping Montgomery curve coefficients into Twisted Edwards form - fp2_sub(&constant_d_edwards, &A.x, &A.z); - fp2_copy(&tmp_a, &A.x); - fp2_copy(&tmp_d, &constant_d_edwards); - - // left-to-right method for computing a^l and d^l - for (j = 1; j < (int)p_plus_minus_bitlength[i]; j++) - { - fp2_sqr(&tmp_a, &tmp_a); - fp2_sqr(&tmp_d, &tmp_d); - if( ( ((int)TORSION_ODD_PRIMES[i] >> ((int)p_plus_minus_bitlength[i] - j - 1)) & 1 ) != 0 ) - { - fp2_mul(&tmp_a, &tmp_a, &A.x); - fp2_mul(&tmp_d, &tmp_d, &constant_d_edwards); - }; - }; - - // raising to 8-th power - for (j = 0; j < 3; j++) - { - fp2_sqr(&By, &By); - fp2_sqr(&Bz, &Bz); - }; - - // Mapping Twisted Edwards curve coefficients into Montgomery form - fp2_mul(&(B->x), &tmp_a, &Bz); - fp2_mul(&(B->z), &tmp_d, &By); - fp2_sub(&(B->z), &(B->x), &(B->z)); -} - -// ------------------------------------------------------------------------- -// ------------------------------------------------------------------------- -// Isogeny construction (xISOG) used in velu SQRT - -void xisog_s(ec_point_t* B, uint64_t const i, ec_point_t const A) -{ - // ================================================================================= - assert(TORSION_ODD_PRIMES[i] > gap); // Ensuring velusqrt is used for l_i > gap - sI = sizeI[i]; // size of I - sJ = sizeJ[i]; // size of J - sK = sizeK[i]; // size of K - - assert(sI >= sJ); // Ensuring #I >= #J - assert(sK >= 0); // Recall, L is a prime and therefore it must be that #K > 0 - assert(sJ > 1); // ensuring sI >= sJ > 1 - // ================================================================================= - - // We require the curve coefficient A = A'/C ... well, a multiple of these ones - fp2_t Ap; - fp2_add(&Ap, &A.x, &A.x); // 2A' + 4C - fp2_sub(&Ap, &Ap, &A.z); // 2A' - fp2_add(&Ap, &Ap, &Ap); // 4A' - - fp2_t ADD_SQUARED[sJ_max], // (Xj + Zj)^2 - SUB_SQUARED[sJ_max]; // (Xj - Zj)^2 - - int j; - // Next loop precompute some variables to be used in the reaminder of xisog - for (j = 0; j < sJ; j++) - { - fp2_sub(&SUB_SQUARED[j], &J[j].x, &J[j].z); // (Xj - Zj) - fp2_sqr(&SUB_SQUARED[j], &SUB_SQUARED[j]); // (Xj - Zj)^2 - fp2_sub(&ADD_SQUARED[j], &SUB_SQUARED[j], &XZJ4[j]); // (Xj + Zj)^2 - }; - - // -------------------------------------------------------------------------------------------------- - // ~~~~~~~~ - // | | - // Computing E_J(W) = | | [ F0(W, x([j]P)) * alpha^2 + F1(W, x([j]P)) * alpha + F2(W, x([j]P)) ] - // j in J - // In order to avoid costly inverse computations in fp, we are gonna work with projective coordinates - // In particular, for a degree-l isogeny construction, we need alpha = 1 and alpha = -1 - - //fp2_t EJ_0[sJ][3], // quadratic factors of one polynomial to be used in a resultant - // EJ_1[sJ][3]; // quadratic factors of one polynomial to be used in a resultant - - // Next loop computes all the quadratic factors of EJ_0 and EJ_1 - fp2_t t1; - for (j = 0; j < sJ; j++) - { - // Each SUB_SQUARED[j] and ADD_SQUARED[j] should be multiplied by C - fp2_mul(&EJ_1[j][0], &ADD_SQUARED[j], &A.z); - fp2_mul(&EJ_0[j][0], &SUB_SQUARED[j], &A.z); - // We require the double of tadd and tsub - fp2_add(&EJ_0[j][1], &EJ_1[j][0], &EJ_1[j][0]); - fp2_add(&EJ_1[j][1], &EJ_0[j][0], &EJ_0[j][0]); - - fp2_mul(&t1, &XZJ4[j], &Ap); // A' *(-4*Xj*Zj) - - // Case alpha = 1 - fp2_sub(&EJ_0[j][1], &t1, &EJ_0[j][1]); - fp2_copy(&EJ_0[j][2], &EJ_0[j][0]); // E_[0,j} is a palindrome - - // Case alpha = -1 - fp2_sub(&EJ_1[j][1], &EJ_1[j][1], &t1); - fp2_copy(&EJ_1[j][2], &EJ_1[j][0]); // E_{1,j} is a palindrome - }; - - // --------------------------------------------------------------------- - // The faster way for multiplying is using a divide-and-conquer approach - - // selfreciprocal product tree of EJ_0 (we only require the root) - product_tree_selfreciprocal_LENFeq3(ptree_EJ, deg_ptree_EJ, 0, EJ_0, sJ); - assert( deg_ptree_EJ[0] == (2*sJ) ); - if (!scaled) - { - // (unscaled) remainder tree approach - multieval_unscaled(leaves, ptree_EJ[0], 2*sJ + 1, rtree_hI, (const fp2_t*)rtree_A, ptree_hI, deg_ptree_hI, 0, sI); - } - else - { - // scaled remainder tree approach - fp2_t G[sI_max], G_rev[sI_max]; - poly_redc(G, ptree_EJ[0], 2*sJ + 1, ptree_hI[0], sI + 1, R0, A0); - for (j = 0; j < sI; j++) - fp2_copy(&G_rev[j], &G[sI - 1 - j]); - - poly_mul_middle(G_rev, G_rev, sI, R0, sI); - for (j = 0; j < sI; j++) - fp2_copy(&G[j], &G_rev[sI - 1 - j]); - - multieval_scaled(leaves, G, ptree_hI, deg_ptree_hI, 0, sI); - }; - clear_tree(ptree_EJ, 0, sJ); - // Finally, we must multiply the leaves of the outpur of remainders - fp2_t r0; - product(&r0, (const fp2_t*)leaves, sI); - - // selfreciprocal product tree of EJ_1 (we only require the root) - product_tree_selfreciprocal_LENFeq3(ptree_EJ, deg_ptree_EJ, 0, EJ_1, sJ); - assert( deg_ptree_EJ[0] == (2*sJ) ); - if (!scaled) - { - // (unscaled) remainder tree approach - multieval_unscaled(leaves, ptree_EJ[0], 2*sJ + 1, rtree_hI, (const fp2_t*)rtree_A, ptree_hI, deg_ptree_hI, 0, sI); - } - else - { - // scaled remainder tree approach - fp2_t G[sI_max], G_rev[sI_max]; - poly_redc(G, ptree_EJ[0], 2*sJ + 1, ptree_hI[0], sI + 1, R0, A0); - for (j = 0; j < sI; j++) - fp2_copy(&G_rev[j], &G[sI - 1 - j]); - - poly_mul_middle(G_rev, G_rev, sI, R0, sI); - for (j = 0; j < sI; j++) - fp2_copy(&G[j], &G_rev[sI - 1 - j]); - - multieval_scaled(leaves, G, ptree_hI, deg_ptree_hI, 0, sI); - }; - clear_tree(ptree_EJ, 0, sJ); - // Finally, we must multiply the leaves of the outpur of remainders - fp2_t r1; - product(&r1, (const fp2_t*)leaves, sI); - - // ------------------------------- - // Sometimes the public value sK is equal to zero, - // Thus for avoing runtime error we add one when sK =0 - fp2_t hK_0[sK_max + 1], hK_1[sK_max + 1], hk_0, hk_1; - for (j = 0; j < sK; j++) - { - fp2_sub(&hK_0[j], &K[j].z, &K[j].x); - fp2_add(&hK_1[j], &K[j].z, &K[j].x); - }; - - // hk_0 <- use product to mulitiply all the elements in hK_0 - product(&hk_0, (const fp2_t*)hK_0, sK); - // hk_1 <- use product to mulitiply all the elements in hK_1 - product(&hk_1, (const fp2_t*)hK_1, sK); - - // -------------------------------------------------------------- - // Now, we have all the ingredients for computing the image curve - fp2_t A24, A24m, - t24, t24m; // <---- JORGE creo que podemos omitir estas variables, se usan cuando ya no se requiren los valores de la entrada A (podemos cambiar estos t's por B[0] y B[1] - - fp2_copy(&A24, &A.x); // A' + 2C - fp2_sub(&A24m, &A.x, &A.z); // A' - 2C - fp2_copy(&Ap, &A24m); - - // left-to-right method for computing (A' + 2C)^l and (A' - 2C)^l - for (j = 1; j < (int)p_plus_minus_bitlength[i]; j++) - { - fp2_sqr(&A24, &A24); - fp2_sqr(&A24m, &A24m); - if( ( ((int)TORSION_ODD_PRIMES[i] >> ((int)p_plus_minus_bitlength[i] - j - 1)) & 1 ) != 0 ) - { - fp2_mul(&A24, &A24, &A.x); - fp2_mul(&A24m, &A24m, &Ap); - }; - }; - - fp2_mul(&t24m, &hk_1, &r1); // output of algorithm 2 with alpha =-1 and without the demoninator - fp2_sqr(&t24m, &t24m); // raised at 2 - fp2_sqr(&t24m, &t24m); // raised at 4 - fp2_sqr(&t24m, &t24m); // raised at 8 - - fp2_mul(&t24, &hk_0, &r0); // output of algorithm 2 with alpha = 1 and without the demoninator - fp2_sqr(&t24, &t24); // raised at 2 - fp2_sqr(&t24, &t24); // raised at 4 - fp2_sqr(&t24, &t24); // raised at 8 - - fp2_mul(&A24, &A24, &t24m); - fp2_mul(&A24m, &A24m, &t24); - - // Now, we have d = (A24m / A24) where the image Montgomery cuve coefficient is - // B' 2*(1 + d) 2*(A24 + A24m) - // B = ---- = --------- = -------------- - // C (1 - d) (A24 - A24m) - // However, we required B' + 2C = 4*A24 and 4C = 4 * (A24 - A24m) - - fp2_sub(&t24m, &A24, &A24m); // (A24 - A24m) - fp2_add(&t24m, &t24m, &t24m); // 2*(A24 - A24m) - fp2_add(&t24m, &t24m, &t24m); // 4*(A24 - A24m) - - fp2_add(&t24, &A24, &A24); // 2 * A24 - fp2_add(&t24, &t24, &t24); // 4 * A24 - - fp2_copy(&(B->x), &t24); - fp2_copy(&(B->z), &t24m); -} diff --git a/src/ec/ref/include/biextension.h b/src/ec/ref/include/biextension.h new file mode 100644 index 0000000..1a50fcc --- /dev/null +++ b/src/ec/ref/include/biextension.h @@ -0,0 +1,82 @@ +#ifndef _BIEXT_H_ +#define _BIEXT_H_ + +#include +#include + +typedef struct pairing_params +{ + uint32_t e; // Points have order 2^e + ec_point_t P; // x(P) + ec_point_t Q; // x(Q) + ec_point_t PQ; // x(P-Q) = (PQX/PQZ : 1) + fp2_t ixP; // PZ/PX + fp2_t ixQ; // QZ/QX + ec_point_t A24; // ((A+2)/4 : 1) +} pairing_params_t; + +// For two bases and store: +// x(P - R), x(P - S), x(R - Q), x(S - Q) +typedef struct pairing_dlog_diff_points +{ + ec_point_t PmR; // x(P - R) + ec_point_t PmS; // x(P - S) + ec_point_t RmQ; // x(R - Q) + ec_point_t SmQ; // x(S - Q) +} pairing_dlog_diff_points_t; + +typedef struct pairing_dlog_params +{ + uint32_t e; // Points have order 2^e + ec_basis_t PQ; // x(P), x(Q), x(P-Q) + ec_basis_t RS; // x(R), x(S), x(R-S) + pairing_dlog_diff_points_t diff; // x(P - R), x(P - S), x(R - Q), x(S - Q) + fp2_t ixP; // PZ/PX + fp2_t ixQ; // QZ/QX + fp2_t ixR; // RZ/RX + fp2_t ixS; // SZ/SX + ec_point_t A24; // ((A+2)/4 : 1) +} pairing_dlog_params_t; + +// Computes e = e_{2^e}(P, Q) using biextension ladder +void weil(fp2_t *r, uint32_t e, const ec_point_t *P, const ec_point_t *Q, const ec_point_t *PQ, ec_curve_t *E); + +// Computes (reduced) z = t_{2^e}(P, Q) using biextension ladder +void reduced_tate(fp2_t *r, uint32_t e, const ec_point_t *P, const ec_point_t *Q, const ec_point_t *PQ, ec_curve_t *E); + +// Given two bases and computes scalars +// such that R = [r1]P + [r2]Q, S = [s1]P + [s2]Q +void ec_dlog_2_weil(digit_t *r1, + digit_t *r2, + digit_t *s1, + digit_t *s2, + ec_basis_t *PQ, + const ec_basis_t *RS, + ec_curve_t *curve, + int e); + +// Given two bases and +// where is a basis for E[2^f] +// the full 2-torsion, and a basis +// for smaller torsion E[2^e] +// computes scalars r1, r2, s1, s2 +// such that R = [r1]P + [r2]Q, S = [s1]P + [s2]Q +void ec_dlog_2_tate(digit_t *r1, + digit_t *r2, + digit_t *s1, + digit_t *s2, + const ec_basis_t *PQ, + const ec_basis_t *RS, + ec_curve_t *curve, + int e); + +void ec_dlog_2_tate_to_full(digit_t *r1, + digit_t *r2, + digit_t *s1, + digit_t *s2, + ec_basis_t *PQ, + ec_basis_t *RS, + ec_curve_t *curve, + int e); + +#endif diff --git a/src/ec/ref/include/curve_extras.h b/src/ec/ref/include/curve_extras.h deleted file mode 100644 index 3bc44d5..0000000 --- a/src/ec/ref/include/curve_extras.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef CURVE_EXTRAS_H -#define CURVE_EXTRAS_H - -#include "ec.h" -#include "torsion_constants.h" - -typedef struct jac_point_t { - fp2_t x; - fp2_t y; - fp2_t z; -} jac_point_t; - -bool ec_is_zero(ec_point_t const* P); -void copy_point(ec_point_t* P, ec_point_t const* Q); -void swap_points(ec_point_t* P, ec_point_t* Q, const digit_t option); -void ec_init(ec_point_t* P); -void xDBLv2(ec_point_t* Q, ec_point_t const* P, ec_point_t const* A24); -void xDBLADD(ec_point_t* R, ec_point_t* S, ec_point_t const* P, ec_point_t const* Q, ec_point_t const* PQ, ec_point_t const* A24); -void xDBLMUL(ec_point_t* S, ec_point_t const* P, digit_t const* k, ec_point_t const* Q, digit_t const* l, ec_point_t const* PQ, ec_curve_t const* curve); -void xDBL(ec_point_t* Q, ec_point_t const* P, ec_point_t const* AC); -void xMUL(ec_point_t* Q, ec_point_t const* P, digit_t const* k, ec_curve_t const* curve); -void xDBLMUL(ec_point_t* S, ec_point_t const* P, digit_t const* k, ec_point_t const* Q, digit_t const* l, ec_point_t const* PQ, ec_curve_t const* curve); - -#define is_point_equal ec_is_equal -#define xADD ec_add - -#endif - diff --git a/src/ec/ref/include/ec.h b/src/ec/ref/include/ec.h index bc47fd3..ee2be38 100644 --- a/src/ec/ref/include/ec.h +++ b/src/ec/ref/include/ec.h @@ -1,776 +1,668 @@ -/** @file - * - * @authors Luca De Feo, Francisco RH - * - * @brief Elliptic curve stuff -*/ - -#ifndef EC_H -#define EC_H - -#include -#include - - -/** @defgroup ec Elliptic curves - * @{ -*/ - -/** @defgroup ec_t Data structures - * @{ -*/ - -/** @brief Projective point - * - * @typedef ec_point_t - * - * @struct ec_point_t - * - * A projective point in (X:Z) or (X:Y:Z) coordinates (tbd). -*/ -typedef struct ec_point_t { - fp2_t x; - fp2_t z; -} ec_point_t; - -/** @brief A basis of a torsion subgroup - * - * @typedef ec_basis_t - * - * @struct ec_basis_t - * - * A pair of points (or a triplet, tbd) forming a basis of a torsion subgroup. -*/ -typedef struct ec_basis_t { - ec_point_t P; - ec_point_t Q; - ec_point_t PmQ; -} ec_basis_t; - -/** @brief An elliptic curve - * - * @typedef ec_curve_t - * - * @struct ec_curve_t - * - * An elliptic curve in projective Montgomery form -*/ -typedef struct ec_curve_t { - fp2_t A; - fp2_t C; ///< cannot be 0 -} ec_curve_t; - -/** @brief An isogeny of degree a power of 2 - * - * @typedef ec_isog_even_t - * - * @struct ec_isog_even_t -*/ -typedef struct ec_isog_even_t { - ec_curve_t curve; ///< The domain curve - ec_point_t kernel; ///< A kernel generator - unsigned short length; ///< The length as a 2-isogeny walk -} ec_isog_even_t; - - -/** @brief An odd divisor of p² - 1 - * - * @typedef ec_isog_odd_t - * - * Given that the list of divisors of p² - 1 is known, this is - * represented as a fixed-length vector of integer exponents. -*/ - -typedef uint8_t ec_degree_odd_t[P_LEN + M_LEN]; - -/** @brief An isogeny of odd degree dividing p² - 1 - * - * @typedef ec_isog_odd_t - * - * @struct ec_isog_odd_t -*/ -typedef struct ec_isog_odd_t { - ec_curve_t curve; - ec_point_t ker_plus; ///< A generator of E[p+1] ∩ ker(φ) - ec_point_t ker_minus; ///< A generator of E[p-1] ∩ ker(φ) - ec_degree_odd_t degree; ///< The degree of the isogeny -} ec_isog_odd_t; - -/** @brief Isomorphism of Montgomery curves - * - * @typedef ec_isom_t - * - * @struct ec_isom_t - * - * The isomorphism is given by the map maps (X:Z) ↦ ( (Nx X - Nz Z) : (D Z) ) -*/ -typedef struct ec_isom_t { - fp2_t Nx; - fp2_t Nz; - fp2_t D; -} ec_isom_t; - -// end ec_t -/** @} -*/ - - -/** @defgroup ec_curve_t Curves and isomorphisms - * @{ -*/ - -/** - * @brief j-invariant. - * - * @param j_inv computed j_invariant - * @param curve input curve - */ -void ec_j_inv(fp2_t* j_inv, const ec_curve_t* curve); - -/** - * @brief Isomorphism of elliptic curve - * - * @param isom computed isomorphism - * @param from domain curve - * @param to image curve - */ -void ec_isomorphism(ec_isom_t* isom, const ec_curve_t* from, const ec_curve_t* to); - -/** - * @brief In-place inversion of an isomorphism - * - * @param isom an isomorphism - */ -void ec_iso_inv(ec_isom_t* isom); - -/** - * @brief In-place evaluation of an isomorphism - * - * @param P a point - * @param isom an isomorphism - */ -void ec_iso_eval(ec_point_t* P, ec_isom_t* isom); - -/** - * @brief Given a Montgomery curve, computes a standard model for it and the isomorphism to it. - * - * @param new computed new curve - * @param isom computed isomorphism from `old` to `new` - * @param old A Montgomery curve - */ -void ec_curve_normalize(ec_curve_t *new, ec_isom_t *isom, const ec_curve_t *old); - -/** @} -*/ -/** @defgroup ec_point_t Point operations - * @{ -*/ - -/** - * @brief Point equality - * - * @param P a point - * @param Q a point - * @return 1 if equal - */ -bool ec_is_equal(const ec_point_t* P, const ec_point_t* Q); - -/** - * @brief Reduce Z-coordinate of point in place - * - * @param P a point - */ -void ec_normalize(ec_point_t* P); - -/** - * @brief Test whether a point is on a curve - * - * @param curve a curve - * @param P a point - * @return 1 if P is on the curve - */ -int ec_is_on_curve(const ec_curve_t* curve, const ec_point_t* P); - -/** - * @brief Point negation - * - * @param res computed opposite of P - * @param P a point - */ -void ec_neg(ec_point_t* res, const ec_point_t* P); - -/** - * @brief Point addition - * - * @param res computed sum of P and Q - * @param P a point - * @param Q a point - * @param PQ the difference P-Q - */ -void ec_add(ec_point_t* res, const ec_point_t* P, const ec_point_t* Q, const ec_point_t* PQ); - -/** - * @brief Point doubling - * - * @param res computed double of P - * @param P a point - */ -void ec_dbl(ec_point_t* res, const ec_curve_t* curve, const ec_point_t* P); - -/** - * @brief Point multiplication - * - * @param res computed scalar * P - * @param curve the curve - * @param scalar an unsigned multi-precision integer - * @param P a point - */ -void ec_mul(ec_point_t* res, const ec_curve_t* curve, const digit_t* scalar, const ec_point_t* P); - -/** - * @brief Point multiplication by a scalar of limited length - * - * @param res computed scalar * P - * @param curve the curve - * @param scalar an unsigned multi-precision integer - * @param kbits the bit size of scalar - * @param P a point - */ -void xMULv2(ec_point_t* Q, ec_point_t const* P, digit_t const* k, const int kbits, ec_point_t const* A24); - -/** - * @brief Combination P+m*Q - * - * @param R computed P + m * Q - * @param curve the curve - * @param m an unsigned multi-precision integer - * @param P a point - * @param Q a point - * @param PQ the difference P-Q - */ -void ec_ladder3pt(ec_point_t *R, fp_t const m, ec_point_t const *P, ec_point_t const *Q, ec_point_t const *PQ, ec_curve_t const *A); - -/** - * @brief Linear combination of points of a basis - * - * @param res computed scalarP * P + scalarQ * Q - * @param curve the curve - * @param scalarP an unsigned multi-precision integer - * @param scalarQ an unsigned multi-precision integer - * @param PQ a torsion basis consisting of points P and Q - */ -void ec_biscalar_mul(ec_point_t* res, const ec_curve_t* curve, - const digit_t* scalarP, const digit_t* scalarQ, - const ec_basis_t* PQ); - -/** @} -*/ - -/** @defgroup ec_dlog_t Discrete logs and bases - * @{ -*/ - -/** - * @brief Generate a Montgomery curve and a 2^f-torsion basis - * - * The algorithm is deterministc - * - * @param PQ2 computed basis of the 2^f-torsion - * @param curve the computed curve - */ -void ec_curve_to_basis_2(ec_basis_t *PQ2, const ec_curve_t *curve); - -/** - * @brief Complete a basis of the 2^f-torsion - * - * The algorithm is deterministic - * - * @param PQ2 a basis of the 2^f-torsion containing P as first generator - * @param curve the curve - * @param P a point of order 2^f - */ -void ec_complete_basis_2(ec_basis_t* PQ2, const ec_curve_t* curve, const ec_point_t* P); - -/** - * @brief Generate a 3^e-torsion basis - * - * The algorithm is deterministic - * - * @param PQ3 the computed 3^e-torsion basis - * @param curve a curve - */ -void ec_curve_to_basis_3(ec_basis_t* PQ3, const ec_curve_t* curve); - -/** - * @brief Generate a 6^e-torsion basis - * - * The algorithm is deterministic - * - * @param PQ6 the computed 2^f*3^g-torsion basis - * @param curve a curve - */ -void ec_curve_to_basis_6(ec_basis_t* PQ6, const ec_curve_t* curve); - - -/** - * @brief Compute the generalized dlog of R wrt the 2^f-basis PQ2 - * - * Ensure that R = scalarP * P + scalarQ * Q - * - * @param scalarP the computed dlog - * @param scalarQ the computed dlog - * @param PQ2 a 2^f-torsion basis - * @param R a point of order dividing 2^f - */ -void ec_dlog_2(digit_t* scalarP, digit_t* scalarQ, - const ec_basis_t* PQ2, const ec_point_t* R, const ec_curve_t* curve); - -/** - * @brief Compute the generalized dlog of R wrt the 3^e-basis PQ3 - * - * Ensure that R = scalarP * P + scalarQ * Q - * - * @param scalarP the computed dlog - * @param scalarQ the computed dlog - * @param PQ3 a 3^e-torsion basis - * @param R a point of order dividing 3^e - */ -void ec_dlog_3(digit_t* scalarP, digit_t* scalarQ, - const ec_basis_t* PQ3, const ec_point_t* R, const ec_curve_t* curve); -/** @} -*/ - -/** @defgroup ec_isog_t Isogenies - * @{ -*/ - -/** - * @brief Evaluate isogeny of even degree on list of points - * - * @param image computed image curve - * @param phi isogeny - * @param points a list of points to evaluate the isogeny on, modified in place - * @param length of the list points - */ -void ec_eval_even(ec_curve_t* image, const ec_isog_even_t* phi, - ec_point_t* points, unsigned short length); - -/** - * @brief Evaluate isogeny of even degree on list of points, assuming the point (0,0) is not in the kernel - * - * @param image computed image curve - * @param phi isogeny - * @param points a list of points to evaluate the isogeny on, modified in place - * @param length of the list points - */ -void ec_eval_even_nonzero(ec_curve_t* image, const ec_isog_even_t* phi, - ec_point_t* points, unsigned short length); - -/** - * @brief Evaluate isogeny of even degree on list of torsion bases - * - * @param image computed image curve - * @param phi isogeny - * @param points a list of bases to evaluate the isogeny on, modified in place - * @param length of the list bases - */ -static inline void ec_eval_even_basis(ec_curve_t* image, const ec_isog_even_t* phi, - ec_basis_t* points, unsigned short length) { - ec_eval_even(image, phi, (ec_point_t*)points, sizeof(ec_basis_t) / sizeof(ec_point_t) * length); -} - -/** - * @brief Evaluate isogeny of odd degree on list of points - * - * @param image computed image curve - * @param phi isogeny - * @param points a list of points to evaluate the isogeny on, modified in place - * @param length of the list points - */ -void ec_eval_odd(ec_curve_t* image, const ec_isog_odd_t* phi, - ec_point_t* points, unsigned short length); - -/** - * @brief Evaluate isogeny of odd degree on list of torsion bases - * - * @param image computed image curve - * @param phi isogeny - * @param points a list of bases to evaluate the isogeny on, modified in place - * @param length of the list bases - */ -static inline void ec_eval_odd_basis(ec_curve_t* image, const ec_isog_odd_t* phi, - ec_basis_t* points, unsigned short length) { - ec_eval_odd(image, phi, (ec_point_t*)points, sizeof(ec_basis_t) / sizeof(ec_point_t) * length); -} - -/** @} -*/ - -// end ec -/** @} -*/ - - - -#endif - - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////// ORIGINAL VERSION - -#if 0 - -/** @file - * - * @authors Luca De Feo, Francisco RH - * - * @brief Elliptic curve stuff -*/ - -#ifndef EC_H -#define EC_H - -#include - -/** @defgroup ec Elliptic curves - * @{ -*/ - -/** @defgroup ec_t Data structures - * @{ -*/ - -/** @brief Projective point - * - * @typedef ec_point_t - * - * @struct ec_point_t - * - * A projective point in (X:Z) or (X:Y:Z) coordinates (tbd). -*/ -typedef struct ec_point_t { - fp2_t X; - //fp2_t Y; - fp2_t Z; -} ec_point_t; - -/** @brief A basis of a torsion subgroup - * - * @typedef ec_basis_t - * - * @struct ec_basis_t - * - * A pair of points (or a triplet, tbd) forming a basis of a torsion subgroup. -*/ -typedef struct ec_basis_t { - ec_point_t P; - ec_point_t Q; - ec_point_t PmQ; // or maybe not -} ec_basis_t; - -/** @brief An elliptic curve - * - * @typedef ec_curve_t - * - * @struct ec_curve_t - * - * An elliptic curve in projective Montgomery form -*/ -typedef struct ec_curve_t { - fp2_t A; - fp2_t C; ///< cannot be 0 -} ec_curve_t; - -/** @brief An isogeny of degree a power of 2 - * - * @typedef ec_isog_even_t - * - * @struct ec_isog_even_t -*/ -typedef struct ec_isog_even_t { - ec_curve_t curve; ///< The domain curve - ec_point_t kernel; ///< A kernel generator - unsigned short length; ///< The length as a 2-isogeny walk -} ec_isog_even_t; - - -/** @brief An odd divisor of p² - 1 - * - * @typedef ec_isog_odd_t - * - * @struct ec_isog_odd_t - * - * Given that the list of divisors of p² - 1 is known, this could be - * represented as a fixed-length vector of integer exponents, possibly - * distinguishing the divisors of p + 1 from those of p - 1. -*/ -typedef struct ec_degree_odd_t { - // todo (basically a ushort vector) -} ec_degree_odd_t; - -/** @brief An isogeny of odd degree dividing p² - 1 - * - * @typedef ec_isog_odd_t - * - * @struct ec_isog_odd_t -*/ -typedef struct ec_isog_odd_t { - ec_point_t ker_plus; ///< A generator of E[p+1] ∩ ker(φ) - ec_point_t ker_minus; ///< A generator of E[p-1] ∩ ker(φ) - ec_degree_odd_t degree; ///< The degree of the isogeny -} ec_isog_odd_t; - -/** @brief Isomorphism of Montgomery curves - * - * @typedef ec_isom_t - * - * @struct ec_isom_t - * - * The isomorphism is given by the map maps (X:Z) ↦ ( (Nx X - Nz Z) : (D Z) ) - * TODO: fix if (X:Y:Z) coordinates. -*/ -typedef struct ec_isom_t { - fp2_t Nx; - fp2_t Nz; - fp2_t D; -} ec_isom_t; - -// end ec_t -/** @} -*/ - - -/** @defgroup ec_curve_t Curves and isomorphisms - * @{ -*/ - -/** - * @brief j-invariant. - * - * @param j_inv computed j_invariant - * @param curve input curve - */ -void ec_j_inv(fp2_t* j_inv, const ec_curve_t* curve); - -/** - * @brief Isomorphism of elliptic curve - * - * @param isom computed isomorphism - * @param from domain curve - * @param to image curve - */ -void ec_isomorphism(ec_isom_t* isom, const ec_curve_t* from, const ec_curve_t* to); - -/** @} -*/ -/** @defgroup ec_point_t Point operations - * @{ -*/ - -/** - * @brief Point equality - * - * @param P a point - * @param Q a point - * @return 1 if equal - */ -int ec_is_equal(const ec_point_t* P, const ec_point_t* Q); - -/** - * @brief Reduce Z-coordinate of point in place - * - * @param P a point - */ -void ec_normalize(ec_point_t* P); - -/** - * @brief Test whether a point is on a curve - * - * @param curve a curve - * @param P a point - * @return 1 if P is on the curve - */ -int ec_is_on_curve(const ec_curve_t* curve, const ec_point_t* P); - -/** - * @brief Point negation - * - * @param res computed opposite of P - * @param P a point - */ -void ec_neg(ec_point_t* res, const ec_point_t* P); - -/** - * @brief Point addition - * - * Needs to be adjusted if (X:Z) arithmetic. - * - * @param res computed sum of P and Q - * @param P a point - * @param Q a point - */ -void ec_add(ec_point_t* res, const ec_point_t* P, const ec_point_t* Q); - -/** - * @brief Point doubling - * - * @param res computed double of P - * @param P a point - */ -void ec_dbl(ec_point_t* res, const ec_curve_t* curve, const ec_point_t* P); - -/** - * @brief Point multiplication - * - * @param res computed scalar * P - * @param curve the curve - * @param scalar an unsigned multi-precision integer - * @param P a point - */ -void ec_mul(ec_point_t* res, const ec_curve_t* curve, const digit_t* scalar, const ec_point_t* P); - -/** - * @brief Linear combination of points of a basis - * - * @param res computed scalarP * P + scalarQ * Q - * @param curve the curve - * @param scalarP an unsigned multi-precision integer - * @param scalarQ an unsigned multi-precision integer - * @param PQ a torsion basis consisting of points P and Q - */ -void ec_biscalar_mul(ec_point_t* res, const ec_curve_t* curve, - const digit_t* scalarP, const digit_t* scalarQ, - const ec_basis_t* PQ); - -/** @} -*/ - -/** @defgroup ec_dlog_t Discrete logs and bases - * @{ -*/ - -/** - * @brief Generate a Montgomery curve and a 2^f-torsion basis - * - * The algorithm is deterministc - * - * @param curve the computed curve - * @param PQ2 a basis of the 2^f-torsion - * @param j_inv a j-invariant - */ -void ec_j_to_basis_2(ec_curve_t* curve, ec_basis_t* PQ2, const fp2_t* j_inv); - -/** - * @brief Complete a basis of the 2^f-torsion - * - * The algorithm is deterministc - * - * @param PQ2 a basis of the 2^f-torsion containing P as first generator - * @param curve the curve - * @param P a point of order 2^f - */ -void ec_complete_basis_2(ec_basis_t* PQ2, const ec_curve_t* curve, const ec_point_t* P); - -/** - * @brief Generate a 3^e-torsion basis - * - * The algorithm is deterministc - * - * @param PQ3 the computed 3^e-torsion basis - * @param curve a curve - */ -void ec_curve_to_basis_3(ec_basis_t* PQ3, const ec_curve_t* curve); - -/** - * @brief Compute the generalized dlog of R wrt the 2^f-basis PQ2 - * - * Ensure that R = scalarP * P + scalarQ * Q - * - * @param scalarP the computed dlog - * @param scalarQ the computed dlog - * @param PQ2 a 2^f-torsion basis - * @param R a point of order dividing 2^f - */ -void ec_dlog_2(digit_t* scalarP, digit_t* scalarQ, - const ec_basis_t* PQ2, const ec_point_t* R); - -/** - * @brief Compute the generalized dlog of R wrt the 3^e-basis PQ3 - * - * Ensure that R = scalarP * P + scalarQ * Q - * - * @param scalarP the computed dlog - * @param scalarQ the computed dlog - * @param PQ3 a 3^e-torsion basis - * @param R a point of order dividing 3^e - */ -void ec_dlog_3(digit_t* scalarP, digit_t* scalarQ, - const ec_basis_t* PQ3, const ec_point_t* R); -/** @} -*/ - -/** @defgroup ec_isog_t Isogenies - * @{ -*/ - -/** - * @brief Evaluate isogeny of even degree on list of points - * - * @param image computed image curve - * @param phi isogeny - * @param points a list of points to evaluate the isogeny on, modified in place - * @param length of the list points - */ -void ec_eval_even(ec_curve_t* image, const ec_isog_even_t* phi, - ec_point_t* points, unsigned short length); - -/** - * @brief Evaluate isogeny of even degree on list of torsion bases - * - * @param image computed image curve - * @param phi isogeny - * @param points a list of bases to evaluate the isogeny on, modified in place - * @param length of the list bases - */ -static inline void ec_eval_even_basis(ec_curve_t* image, const ec_isog_even_t* phi, - ec_basis_t* points, unsigned short length) { - ec_eval_even(image, phi, points, sizeof(ec_basis_t) / sizeof(ec_point_t) * length); -} - -/** - * @brief Evaluate isogeny of odd degree on list of points - * - * @param image computed image curve - * @param phi isogeny - * @param points a list of points to evaluate the isogeny on, modified in place - * @param length of the list points - */ -void ec_eval_odd(ec_curve_t* image, const ec_isog_odd_t* phi, - ec_point_t* points, unsigned short length); - -/** - * @brief Evaluate isogeny of odd degree on list of torsion bases - * - * @param image computed image curve - * @param phi isogeny - * @param points a list of bases to evaluate the isogeny on, modified in place - * @param length of the list bases - */ -static inline void ec_eval_odd_basis(ec_curve_t* image, const ec_isog_odd_t* phi, - ec_basis_t* points, unsigned short length) { - ec_eval_odd(image, phi, points, sizeof(ec_basis_t) / sizeof(ec_point_t) * length); -} - -/** @} -*/ - -// end ec -/** @} -*/ - -#endif - - -#endif +/** @file + * + * @authors Luca De Feo, Francisco RH + * + * @brief Elliptic curve stuff + */ + +#ifndef EC_H +#define EC_H +#include +#include +#include +#include +#include + +/** @defgroup ec Elliptic curves + * @{ + */ + +/** @defgroup ec_t Data structures + * @{ + */ + +/** @brief Projective point on the Kummer line E/pm 1 in Montgomery coordinates + * + * @typedef ec_point_t + * + * @struct ec_point_t + * + * A projective point in (X:Z) or (X:Y:Z) coordinates (tbd). + */ +typedef struct ec_point_t +{ + fp2_t x; + fp2_t z; +} ec_point_t; + +/** @brief Projective point in Montgomery coordinates + * + * @typedef jac_point_t + * + * @struct jac_point_t + * + * A projective point in (X:Y:Z) coordinates + */ +typedef struct jac_point_t +{ + fp2_t x; + fp2_t y; + fp2_t z; +} jac_point_t; + +/** @brief Addition components + * + * @typedef add_components_t + * + * @struct add_components_t + * + * 3 components u,v,w that define the (X:Z) coordinates of both + * addition and substraction of two distinct points with + * P+Q =(u-v:w) and P-Q = (u+v=w) + */ +typedef struct add_components_t +{ + fp2_t u; + fp2_t v; + fp2_t w; +} add_components_t; + +/** @brief A basis of a torsion subgroup + * + * @typedef ec_basis_t + * + * @struct ec_basis_t + * + * A pair of points (or a triplet, tbd) forming a basis of a torsion subgroup. + */ +typedef struct ec_basis_t +{ + ec_point_t P; + ec_point_t Q; + ec_point_t PmQ; +} ec_basis_t; + +/** @brief An elliptic curve + * + * @typedef ec_curve_t + * + * @struct ec_curve_t + * + * An elliptic curve in projective Montgomery form + */ +typedef struct ec_curve_t +{ + fp2_t A; + fp2_t C; ///< cannot be 0 + ec_point_t A24; // the point (A+2 : 4C) + bool is_A24_computed_and_normalized; // says if A24 has been computed and normalized +} ec_curve_t; + +/** @brief An isogeny of degree a power of 2 + * + * @typedef ec_isog_even_t + * + * @struct ec_isog_even_t + */ +typedef struct ec_isog_even_t +{ + ec_curve_t curve; ///< The domain curve + ec_point_t kernel; ///< A kernel generator + unsigned length; ///< The length as a 2-isogeny walk +} ec_isog_even_t; + +/** @brief Isomorphism of Montgomery curves + * + * @typedef ec_isom_t + * + * @struct ec_isom_t + * + * The isomorphism is given by the map maps (X:Z) ↦ ( (Nx X + Nz Z) : (D Z) ) + */ +typedef struct ec_isom_t +{ + fp2_t Nx; + fp2_t Nz; + fp2_t D; +} ec_isom_t; + +// end ec_t +/** @} + */ + +/** @defgroup ec_curve_t Curves and isomorphisms + * @{ + */ + +// Initalisation for curves and points +void ec_curve_init(ec_curve_t *E); +void ec_point_init(ec_point_t *P); + +/** + * @brief Verify that a Montgomery coefficient is valid + * + * @param A an fp2_t + * + * @return 0 if curve is invalid, 1 otherwise + */ +int ec_curve_verify_A(const fp2_t *A); + +/** + * @brief Initialize an elliptic curve from a coefficient + * + * @param A an fp2_t + * @param E the elliptic curve to initialize + * + * @return 0 if curve is invalid, 1 otherwise + */ +int ec_curve_init_from_A(ec_curve_t *E, const fp2_t *A); + +// Copying points, bases and curves +static inline void +copy_point(ec_point_t *P, const ec_point_t *Q) +{ + fp2_copy(&P->x, &Q->x); + fp2_copy(&P->z, &Q->z); +} + +static inline void +copy_basis(ec_basis_t *B1, const ec_basis_t *B0) +{ + copy_point(&B1->P, &B0->P); + copy_point(&B1->Q, &B0->Q); + copy_point(&B1->PmQ, &B0->PmQ); +} + +static inline void +copy_curve(ec_curve_t *E1, const ec_curve_t *E2) +{ + fp2_copy(&(E1->A), &(E2->A)); + fp2_copy(&(E1->C), &(E2->C)); + E1->is_A24_computed_and_normalized = E2->is_A24_computed_and_normalized; + copy_point(&E1->A24, &E2->A24); +} + +// Functions for working with the A24 point and normalisation + +/** + * @brief Reduce (A : C) to (A/C : 1) in place + * + * @param E a curve + */ +void ec_normalize_curve(ec_curve_t *E); + +/** + * @brief Reduce (A + 2 : 4C) to ((A+2)/4C : 1) in place + * + * @param E a curve + */ +void ec_curve_normalize_A24(ec_curve_t *E); + +/** + * @brief Normalise both (A : C) and (A + 2 : 4C) as above, in place + * + * @param E a curve + */ +void ec_normalize_curve_and_A24(ec_curve_t *E); + +/** + * @brief Given a curve E, compute (A+2 : 4C) + * + * @param A24 the value (A+2 : 4C) to return into + * @param E a curve + */ +static inline void +AC_to_A24(ec_point_t *A24, const ec_curve_t *E) +{ + // Maybe we already have this computed + if (E->is_A24_computed_and_normalized) { + copy_point(A24, &E->A24); + return; + } + + // A24 = (A+2C : 4C) + fp2_add(&A24->z, &E->C, &E->C); + fp2_add(&A24->x, &E->A, &A24->z); + fp2_add(&A24->z, &A24->z, &A24->z); +} + +/** + * @brief Given a curve the point (A+2 : 4C) compute the curve coefficients (A : C) + * + * @param E a curve to compute + * @param A24 the value (A+2 : 4C) + */ +static inline void +A24_to_AC(ec_curve_t *E, const ec_point_t *A24) +{ + // (A:C) = ((A+2C)*2-4C : 4C) + fp2_add(&E->A, &A24->x, &A24->x); + fp2_sub(&E->A, &E->A, &A24->z); + fp2_add(&E->A, &E->A, &E->A); + fp2_copy(&E->C, &A24->z); +} + +/** + * @brief j-invariant. + * + * @param j_inv computed j_invariant + * @param curve input curve + */ +void ec_j_inv(fp2_t *j_inv, const ec_curve_t *curve); + +/** + * @brief Isomorphism of elliptic curve + * Takes as input two isomorphic Kummer lines in Montgomery form, and output an isomorphism between + * them + * + * @param isom computed isomorphism + * @param from domain curve + * @param to image curve + * @return 0xFFFFFFFF if there was an error during the computation, zero otherwise + */ +uint32_t ec_isomorphism(ec_isom_t *isom, const ec_curve_t *from, const ec_curve_t *to); + +/** + * @brief In-place evaluation of an isomorphism + * + * @param P a point + * @param isom an isomorphism + */ +void ec_iso_eval(ec_point_t *P, ec_isom_t *isom); + +/** @} + */ +/** @defgroup ec_point_t Point operations + * @{ + */ + +/** + * @brief Point equality + * + * @param P a point + * @param Q a point + * @return 0xFFFFFFFF if equal, zero otherwise + */ +uint32_t ec_is_equal(const ec_point_t *P, const ec_point_t *Q); + +/** + * @brief Point equality + * + * @param P a point + * @return 0xFFFFFFFF if point at infinity, zero otherwise + */ +uint32_t ec_is_zero(const ec_point_t *P); + +/** + * @brief Two torsion test + * + * @param P a point + * @param E the elliptic curve + * @return 0xFFFFFFFF if P is 2-torsion but not zero, zero otherwise + */ +uint32_t ec_is_two_torsion(const ec_point_t *P, const ec_curve_t *E); + +/** + * @brief Four torsion test + * + * @param P a point + * @param E the elliptic curve + * @return 0xFFFFFFFF if P is 2-torsion but not zero, zero otherwise + */ +uint32_t ec_is_four_torsion(const ec_point_t *P, const ec_curve_t *E); + +/** + * @brief Reduce Z-coordinate of point in place + * + * @param P a point + */ +void ec_normalize_point(ec_point_t *P); + +void xDBL_E0(ec_point_t *Q, const ec_point_t *P); +void xADD(ec_point_t *R, const ec_point_t *P, const ec_point_t *Q, const ec_point_t *PQ); +void xDBL_A24(ec_point_t *Q, const ec_point_t *P, const ec_point_t *A24, const bool A24_normalized); + +/** + * @brief Point doubling + * + * @param res computed double of P + * @param P a point + * @param curve an elliptic curve + */ +void ec_dbl(ec_point_t *res, const ec_point_t *P, const ec_curve_t *curve); + +/** + * @brief Point iterated doubling + * + * @param res computed double of P + * @param P a point + * @param n the number of double + * @param curve the curve on which P lays + */ +void ec_dbl_iter(ec_point_t *res, int n, const ec_point_t *P, ec_curve_t *curve); + +/** + * @brief Iterated doubling for a basis P, Q, PmQ + * + * @param res the computed iterated double of basis B + * @param n the number of doubles + * @param B the basis to double + * @param curve the parent curve of the basis + */ +void ec_dbl_iter_basis(ec_basis_t *res, int n, const ec_basis_t *B, ec_curve_t *curve); + +/** + * @brief Point multiplication + * + * @param res computed scalar * P + * @param curve the curve + * @param scalar an unsigned multi-precision integer + * @param P a point + * @param kbits numer of bits of the scalar + */ +void ec_mul(ec_point_t *res, const digit_t *scalar, const int kbits, const ec_point_t *P, ec_curve_t *curve); + +/** + * @brief Combination P+m*Q + * + * @param R computed P + m * Q + * @param curve the curve + * @param m an unsigned multi-precision integer + * @param P a point + * @param Q a point + * @param PQ the difference P-Q + * @return 0 if there was an error, 1 otherwise + */ +int ec_ladder3pt(ec_point_t *R, + const digit_t *m, + const ec_point_t *P, + const ec_point_t *Q, + const ec_point_t *PQ, + const ec_curve_t *curve); + +/** + * @brief Linear combination of points of a basis + * + * @param res computed scalarP * P + scalarQ * Q + * @param scalarP an unsigned multi-precision integer + * @param scalarQ an unsigned multi-precision integer + * @param kbits number of bits of the scalars, or n for points of order 2^n + * @param PQ a torsion basis consisting of points P and Q + * @param curve the curve + * + * @return 0 if there was an error, 1 otherwise + */ +int ec_biscalar_mul(ec_point_t *res, + const digit_t *scalarP, + const digit_t *scalarQ, + const int kbits, + const ec_basis_t *PQ, + const ec_curve_t *curve); + +// end point computations +/** + * @} + */ + +/** @defgroup ec_dlog_t Torsion basis computations + * @{ + */ + +/** + * @brief Generate a 2^f-torsion basis from a Montgomery curve along with a hint + * + * @param PQ2 an ec_basis_t + * @param curve an ec_curve_t + * @param f an integer + * + * @return A hint + * + * The algorithm is deterministc + */ +uint8_t ec_curve_to_basis_2f_to_hint(ec_basis_t *PQ2, ec_curve_t *curve, int f); + +/** + * @brief Generate a 2^f-torsion basis from a Montgomery curve and a given hint + * + * @param PQ2 an ec_basis_t + * @param curve an ec_curve_t + * @param f an integer + * @param hint the hint + * + * @return 1 is the basis is valid, 0 otherwise + * + * The algorithm is deterministc + */ +int ec_curve_to_basis_2f_from_hint(ec_basis_t *PQ2, ec_curve_t *curve, int f, const uint8_t hint); +/** // end basis computations + * @} + */ + +/** @defgroup ec_isog_t Isogenies + * @{ + */ + +/** + * @brief Evaluate isogeny of even degree on list of points. + * Returns 0 if successful and -1 if kernel has the wrong order or includes (0:1). + * + * @param image computed image curve + * @param phi isogeny + * @param points a list of points to evaluate the isogeny on, modified in place + * @param len_points length of the list points + * + * @return 0 if there was no error, 0xFFFFFFFF otherwise + */ +uint32_t ec_eval_even(ec_curve_t *image, ec_isog_even_t *phi, ec_point_t *points, unsigned len_points); + +/** + * @brief Multiplicative strategy for a short isogeny chain. Returns 1 if successfull and -1 + * if kernel has the wrong order or includes (0:1) when special=false. + * + * @param curve domain curve, to be overwritten by the codomain curve. + * @param kernel a kernel generator of order 2^len + * @param len the length of t he 2-isogeny chain + * @param points a list of points to evaluate the isogeny on, modified in place + * @param len_points length of the list points + * @param special if true, allow isogenies with (0:1) in the kernel + * + * @return 0 if there was no error, 0xFFFFFFFF otherwise + */ +uint32_t ec_eval_small_chain(ec_curve_t *curve, + const ec_point_t *kernel, + int len, + ec_point_t *points, + unsigned len_points, + bool special); + +/** + * @brief Recover Y-coordinate from X-coordinate and curve coefficients. + * + * @param y: a y-coordinate + * @param Px: a x-coordinate + * @param curve: the elliptic curve + * + * @return 0xFFFFFFFF if the point was on the curve, 0 otherwise + */ +uint32_t ec_recover_y(fp2_t *y, const fp2_t *Px, const ec_curve_t *curve); + +// Jacobian point init and copying +void jac_init(jac_point_t *P); +void copy_jac_point(jac_point_t *P, const jac_point_t *Q); + +/** + * @brief Test if two Jacobian points are equal + * + * @param P: a point + * @param Q: a point + * + * @return 0xFFFFFFFF if they are equal, 0 otherwise + */ +uint32_t jac_is_equal(const jac_point_t *P, const jac_point_t *Q); + +// Convert from Jacobian to x-only (just drop the Y-coordinate) +void jac_to_xz(ec_point_t *P, const jac_point_t *xyP); +// Convert from Jacobian coordinates in Montgomery model to Weierstrass +void jac_to_ws(jac_point_t *P, fp2_t *t, fp2_t *ao3, const jac_point_t *Q, const ec_curve_t *curve); +void jac_from_ws(jac_point_t *Q, const jac_point_t *P, const fp2_t *ao3, const ec_curve_t *curve); + +// Jacobian arithmetic +void jac_neg(jac_point_t *Q, const jac_point_t *P); +void ADD(jac_point_t *R, const jac_point_t *P, const jac_point_t *Q, const ec_curve_t *AC); +void DBL(jac_point_t *Q, const jac_point_t *P, const ec_curve_t *AC); +void DBLW(jac_point_t *Q, fp2_t *u, const jac_point_t *P, const fp2_t *t); +void jac_to_xz_add_components(add_components_t *uvw, const jac_point_t *P, const jac_point_t *Q, const ec_curve_t *AC); + +/** + * @brief Given a basis in x-only, lift to a pair of Jacobian points + * + * @param P: a point + * @param Q: a point + * @param B: a basis + * @param E: an elliptic curve + * + * @return 0xFFFFFFFF if there was no error, 0 otherwise + * + * + * Lifts a basis x(P), x(Q), x(P-Q) assuming the curve has (A/C : 1) and + * the point P = (X/Z : 1). For generic implementation see lift_basis() + */ +uint32_t lift_basis_normalized(jac_point_t *P, jac_point_t *Q, ec_basis_t *B, ec_curve_t *E); + +/** + * @brief Given a basis in x-only, lift to a pair of Jacobian points + * + * @param P: a point + * @param Q: a point + * @param B: a basis + * @param E: an elliptic curve + * + * @return 0xFFFFFFFF if there was no error, 0 otherwise + */ +uint32_t lift_basis(jac_point_t *P, jac_point_t *Q, ec_basis_t *B, ec_curve_t *E); + +/** + * @brief Check if basis points (P, Q) form a full 4-basis + * + * @param B: a basis + * @param E: an elliptic curve + * + * @return 0xFFFFFFFF if they form a basis, 0 otherwise + */ +uint32_t ec_is_basis_four_torsion(const ec_basis_t *B, const ec_curve_t *E); + +/* + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Test functions for printing and order checking, only used in debug mode + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + */ + +/** + * @brief Check if a point (X : Z) has order exactly 2^t + * + * @param P: a point + * @param E: an elliptic curve + * @param t: an integer + * + * @return 0xFFFFFFFF if the order is correct, 0 otherwise + */ +static int +test_point_order_twof(const ec_point_t *P, const ec_curve_t *E, int t) +{ + ec_point_t test; + ec_curve_t curve; + test = *P; + copy_curve(&curve, E); + + if (ec_is_zero(&test)) + return 0; + // Scale point by 2^(t-1) + ec_dbl_iter(&test, t - 1, &test, &curve); + // If it's zero now, it doesnt have order 2^t + if (ec_is_zero(&test)) + return 0; + // Ensure [2^t] P = 0 + ec_dbl(&test, &test, &curve); + return ec_is_zero(&test); +} + +/** + * @brief Check if basis points (P, Q, PmQ) all have order exactly 2^t + * + * @param B: a basis + * @param E: an elliptic curve + * @param t: an integer + * + * @return 0xFFFFFFFF if the order is correct, 0 otherwise + */ +static int +test_basis_order_twof(const ec_basis_t *B, const ec_curve_t *E, int t) +{ + int check_P = test_point_order_twof(&B->P, E, t); + int check_Q = test_point_order_twof(&B->Q, E, t); + int check_PmQ = test_point_order_twof(&B->PmQ, E, t); + + return check_P & check_Q & check_PmQ; +} + +/** + * @brief Check if a Jacobian point (X : Y : Z) has order exactly 2^f + * + * @param P: a point + * @param E: an elliptic curve + * @param t: an integer + * + * @return 0xFFFFFFFF if the order is correct, 0 otherwise + */ +static int +test_jac_order_twof(const jac_point_t *P, const ec_curve_t *E, int t) +{ + jac_point_t test; + test = *P; + if (fp2_is_zero(&test.z)) + return 0; + for (int i = 0; i < t - 1; i++) { + DBL(&test, &test, E); + } + if (fp2_is_zero(&test.z)) + return 0; + DBL(&test, &test, E); + return (fp2_is_zero(&test.z)); +} + +// Prints the x-coordinate of the point (X : 1) +static void +ec_point_print(const char *name, ec_point_t P) +{ + fp2_t a; + if (fp2_is_zero(&P.z)) { + printf("%s = INF\n", name); + } else { + fp2_copy(&a, &P.z); + fp2_inv(&a); + fp2_mul(&a, &a, &P.x); + fp2_print(name, &a); + } +} + +// Prints the Montgomery coefficient A +static void +ec_curve_print(const char *name, ec_curve_t E) +{ + fp2_t a; + fp2_copy(&a, &E.C); + fp2_inv(&a); + fp2_mul(&a, &a, &E.A); + fp2_print(name, &a); +} + +#endif +// end isogeny computations +/** + * @} + */ + +// end ec +/** + * @} + */ diff --git a/src/ec/ref/include/isog.h b/src/ec/ref/include/isog.h index 0f5f774..b251ca3 100644 --- a/src/ec/ref/include/isog.h +++ b/src/ec/ref/include/isog.h @@ -1,84 +1,28 @@ #ifndef _ISOG_H_ #define _ISOG_H_ +#include +#include -#include "curve_extras.h" -#include "poly.h" - -extern int sI, sJ, sK; // Sizes of each current I, J, and K - -extern fp2_t I[sI_max][2], // I plays also as the linear factors of the polynomial h_I(X) - EJ_0[sJ_max][3], EJ_1[sJ_max][3]; // To be used in xisog y xeval - -extern ec_point_t J[sJ_max], K[sK_max]; // Finite subsets of the kernel -extern fp2_t XZJ4[sJ_max], // -4* (Xj * Zj) for each j in J, and x([j]P) = (Xj : Zj) - rtree_A[(1 << (ceil_log_sI_max+2)) - 1], // constant multiple of the reciprocal tree computation - A0; // constant multiple of the reciprocal R0 - -extern poly ptree_hI[(1 << (ceil_log_sI_max+2)) - 1], // product tree of h_I(X) - rtree_hI[(1 << (ceil_log_sI_max+2)) - 1], // reciprocal tree of h_I(X) - ptree_EJ[(1 << (ceil_log_sJ_max+2)) - 1]; // product tree of E_J(X) - -extern fp2_t R0[2*sJ_max + 1]; // Reciprocal of h_I(X) required in the scaled remainder tree approach - -extern int deg_ptree_hI[(1 << (ceil_log_sI_max+2)) - 1], // degree of each noed in the product tree of h_I(X) - deg_ptree_EJ[(1 << (ceil_log_sJ_max+2)) - 1]; // degree of each node in the product tree of E_J(X) - -extern fp2_t leaves[sI_max]; // leaves of the remainder tree, which are required in the Resultant computation - - -void eds2mont(ec_point_t* P); // mapping from Twisted edwards into Montogmery -void yadd(ec_point_t* R, ec_point_t* const P, ec_point_t* const Q, ec_point_t* const PQ); // differential addition on Twisted edwards model -void CrissCross(fp2_t *r0, fp2_t *r1, fp2_t const alpha, fp2_t const beta, fp2_t const gamma, fp2_t const delta); - -void kps_t(uint64_t const i, ec_point_t const P, ec_point_t const A); // tvelu formulae -void kps_s(uint64_t const i, ec_point_t const P, ec_point_t const A); // svelu formulae - -void xisog_4(ec_point_t* B, ec_point_t const P); // degree-4 isogeny construction -void xisog_4_singular(ec_point_t* B24, ec_point_t const P, ec_point_t A24); -void xisog_2(ec_point_t* B, ec_point_t const P); // degree-2 isogeny construction -void xisog_t(ec_point_t* B, uint64_t const i, ec_point_t const A); // tvelu formulae -void xisog_s(ec_point_t* B, uint64_t const i, ec_point_t const A); // svelu formulae - -void xeval_4(ec_point_t* R, const ec_point_t* Q, const int lenQ); // degree-4 isogeny evaluation -void xeval_4_singular(ec_point_t* R, const ec_point_t* Q, const int lenQ, const ec_point_t P); -void xeval_2(ec_point_t* R, ec_point_t* const Q, const int lenQ); // degree-2 isogeny evaluation -void xeval_t(ec_point_t* Q, uint64_t const i, ec_point_t const P); // tvelu formulae -void xeval_s(ec_point_t* Q, uint64_t const i, ec_point_t const P, ec_point_t const A); // svelu formulae - -// Strategy-based 4-isogeny chain -static void ec_eval_even_strategy(ec_curve_t* image, ec_point_t* points, unsigned short points_len, - ec_point_t* A24, const ec_point_t *kernel, const int isog_len); - -void kps_clear(int i); // Clear memory assigned by KPS - - -// hybrid velu formulae -static inline void kps(uint64_t const i, ec_point_t const P, ec_point_t const A) +/* KPS structure for isogenies of degree 2 or 4 */ +typedef struct { - // Next branch only depends on a fixed public bound (named gap) - if (TORSION_ODD_PRIMES[i] <= gap) - kps_t(i, P, A); - else - kps_s(i, P, A); -} - -static inline void xisog(ec_point_t* B, uint64_t const i, ec_point_t const A) + ec_point_t K; +} ec_kps2_t; +typedef struct { - // Next branch only depends on a fixed public bound (named gap) - if (TORSION_ODD_PRIMES[i] <= gap) - xisog_t(B, i, A); - else - xisog_s(B, i, A); -} + ec_point_t K[3]; +} ec_kps4_t; -static inline void xeval(ec_point_t* Q, uint64_t const i, ec_point_t const P, ec_point_t const A) -{ - // Next branch only depends on a fixed public bound (named gap) - if (TORSION_ODD_PRIMES[i] <= gap) - xeval_t(Q, i, P); - else - xeval_s(Q, i, P, A); -} +void xisog_2(ec_kps2_t *kps, ec_point_t *B, const ec_point_t P); // degree-2 isogeny construction +void xisog_2_singular(ec_kps2_t *kps, ec_point_t *B24, ec_point_t A24); +void xisog_4(ec_kps4_t *kps, ec_point_t *B, const ec_point_t P); // degree-4 isogeny construction +void xisog_4_singular(ec_kps4_t *kps, ec_point_t *B24, const ec_point_t P, ec_point_t A24); + +void xeval_2(ec_point_t *R, ec_point_t *const Q, const int lenQ, const ec_kps2_t *kps); +void xeval_2_singular(ec_point_t *R, const ec_point_t *Q, const int lenQ, const ec_kps2_t *kps); + +void xeval_4(ec_point_t *R, const ec_point_t *Q, const int lenQ, const ec_kps4_t *kps); +void xeval_4_singular(ec_point_t *R, const ec_point_t *Q, const int lenQ, const ec_point_t P, const ec_kps4_t *kps); #endif diff --git a/src/ec/ref/include/poly.h b/src/ec/ref/include/poly.h deleted file mode 100644 index af23777..0000000 --- a/src/ec/ref/include/poly.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef _POLY_H_ -#define _POLY_H_ - -#include - -typedef fp2_t *poly; // Polynomials are arrays of coeffs over Fq, lowest degree first - -void poly_mul(poly h, const poly f, const int lenf, const poly g, const int leng); -void poly_mul_low(poly h, const int n, const poly f, const int lenf, const poly g, const int leng); -void poly_mul_middle(poly h, const poly g, const int leng, const poly f, const int lenf); -void poly_mul_selfreciprocal(poly h, const poly g, const int leng, const poly f, const int lenf); - -void product_tree(poly H[], int DEG[], const int root, const poly F[], const int LENF, const int n); -void product_tree_LENFeq2(poly H[], int DEG[], const int root, const fp2_t F[][2], const int n); -void product_tree_LENFeq3(poly H[], int DEG[], const int root, const fp2_t F[][3], const int n); -void product_tree_selfreciprocal(poly H[], int DEG[], const int root, const poly F[], const int LENF, const int n); -void product_tree_selfreciprocal_LENFeq3(poly H[], int DEG[], const int root, const fp2_t F[][3], const int n); -void clear_tree(poly H[], const int root, const int n); - -void product(fp2_t *c, const fp2_t F[], const int n); - -void reciprocal(poly h, fp2_t *c, const poly f, const int lenf, const int n); -void poly_redc(poly h, const poly g, const int leng, const poly f, const int lenf,const poly f_inv, const fp2_t c); -void reciprocal_tree(poly *R, fp2_t *A, const int leng, const poly H[], const int DEG[], const int root, const int n); -void multieval_unscaled(fp2_t REM[], const poly g, const int leng, const poly R[], const fp2_t A[], const poly H[], const int DEG[], const int root, const int n); -void multieval_scaled(fp2_t REM[], const poly G, const poly H[], const int DEG[], const int root, const int n); - -#endif /* _POLY_H */ diff --git a/src/ec/ref/include/sdacs.h b/src/ec/ref/include/sdacs.h deleted file mode 100644 index f1fed6a..0000000 --- a/src/ec/ref/include/sdacs.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef _SDACS_H_ -#define _SDACS_H_ - -static char SDAC_P_0[] = "0"; -static char SDAC_P_1[] = "10"; -static char SDAC_P_2[] = "100"; -static char SDAC_P_3[] = "0100"; -static char SDAC_P_4[] = "10000"; -static char SDAC_P_5[] = "110000"; -static char SDAC_P_6[] = "100000"; -static char SDAC_P_7[] = "1100010001"; -static char SDAC_P_8[] = "1001010000"; -static char SDAC_P_9[] = "0101001000"; -static char SDAC_P_10[] = "110110010000"; -static char SDAC_P_11[] = "10000000000"; -static char SDAC_P_12[] = "1010100001001000"; - -static char SDAC_M_0[] = ""; -static char SDAC_M_1[] = "000"; -static char SDAC_M_2[] = "1010"; -static char SDAC_M_3[] = "100010"; -static char SDAC_M_4[] = "0010000"; -static char SDAC_M_5[] = "110000000"; -static char SDAC_M_6[] = "1010101010"; -static char SDAC_M_7[] = "1010001000"; -static char SDAC_M_8[] = "1001000000"; -static char SDAC_M_9[] = "0100001000"; -static char SDAC_M_10[] ="101101010000"; -static char SDAC_M_11[] = "100100010010"; -static char SDAC_M_12[] = "010100011000"; -static char SDAC_M_13[] = "101010000001"; -static char SDAC_M_14[] = "010100001000"; -static char SDAC_M_15[] = "1101010010000"; -static char SDAC_M_16[] = "1001010001010"; -static char SDAC_M_17[] = "101001000000101"; - -static char *SDACs[31] = { - SDAC_P_0, SDAC_P_1, SDAC_P_2, SDAC_P_3, SDAC_P_4, - SDAC_P_5, SDAC_P_6, SDAC_P_7, SDAC_P_8, SDAC_P_9, - SDAC_P_10, SDAC_P_11, SDAC_P_12, - SDAC_M_0, SDAC_M_1, SDAC_M_2, SDAC_M_3, SDAC_M_4, - SDAC_M_5, SDAC_M_6, SDAC_M_7, SDAC_M_8, SDAC_M_9, - SDAC_M_10, SDAC_M_11, SDAC_M_12, SDAC_M_13, SDAC_M_14, - SDAC_M_15, SDAC_M_16, SDAC_M_17 - }; - -static int LENGTHS[] = { -1, 2, 3, 4, 5, 6, 6, 10, 10, 10, 12, 11, 16, 0, 3, 4, 6, 7, 9, 10, 10, 10, 10, 12, 12, 12, 12, 12, 13, 13, 15 - }; -#endif \ No newline at end of file diff --git a/src/ec/ref/include/tedwards.h b/src/ec/ref/include/tedwards.h deleted file mode 100755 index 42597b6..0000000 --- a/src/ec/ref/include/tedwards.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef TEDWARDS_H -#define TEDWARDS_H - -#include -#include "ec.h" - -// a*x^2+y^2=1+d*x^2*y^2 - -typedef struct ted_point_t { - fp2_t x; - fp2_t y; - fp2_t z; - fp2_t t; // t = x*y/z -} ted_point_t; - -void ted_init(ted_point_t* P); -bool is_ted_equal(ted_point_t const* P1, ted_point_t const* P2); -void copy_ted_point(ted_point_t* P, ted_point_t const* Q); - -void ted_neg(ted_point_t* Q, ted_point_t const* P); -void ted_dbl(ted_point_t* Q, ted_point_t const* P, ec_curve_t const* E); -void ted_add(ted_point_t* S, ted_point_t const* P, ted_point_t const* Q, ec_curve_t const* E); - -void mont_to_ted(ec_curve_t* E, ec_curve_t const* A); -void mont_to_ted_point(ted_point_t* Q, ec_point_t const* P, ec_curve_t const* A); -void ted_to_mont_point(ec_point_t* Q, ted_point_t const* P); - -#endif diff --git a/src/ec/ref/lvl1/CMakeLists.txt b/src/ec/ref/lvl1/CMakeLists.txt index 6cf6396..8b64577 100644 --- a/src/ec/ref/lvl1/CMakeLists.txt +++ b/src/ec/ref/lvl1/CMakeLists.txt @@ -1,17 +1 @@ -set(SOURCE_FILES_EC_${SVARIANT_UPPER}_REF - ${ECX_DIR}/poly-mul.c - ${ECX_DIR}/poly-redc.c - ${ECX_DIR}/ec.c - ${ECX_DIR}/tedwards.c - ${ECX_DIR}/kps.c - ${ECX_DIR}/xisog.c - ${ECX_DIR}/xeval.c - ${ECX_DIR}/isog_chains.c - ${ECX_DIR}/basis.c -) - -add_library(${LIB_EC_${SVARIANT_UPPER}} ${SOURCE_FILES_EC_${SVARIANT_UPPER}_REF}) -target_include_directories(${LIB_EC_${SVARIANT_UPPER}} PRIVATE ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ${INC_EC}) -target_compile_options(${LIB_EC_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) +include(../lvlx.cmake) \ No newline at end of file diff --git a/src/ec/ref/lvl1/test/CMakeLists.txt b/src/ec/ref/lvl1/test/CMakeLists.txt index 77f176e..316e0a8 100644 --- a/src/ec/ref/lvl1/test/CMakeLists.txt +++ b/src/ec/ref/lvl1/test/CMakeLists.txt @@ -1,36 +1 @@ -add_executable(fp2.test_${SVARIANT_LOWER} ${ECX_DIR}/test/fp2-test.c) - target_include_directories(fp2.test_${SVARIANT_LOWER} PUBLIC ${INC_GF_${SVARIANT_UPPER}} ${INC_PRECOMP_${SVARIANT_UPPER}} ${PROJECT_SOURCE_DIR}/include ../include ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_COMMON}) - target_link_libraries(fp2.test_${SVARIANT_LOWER} ${LIB_GF_${SVARIANT_UPPER}}) - -add_executable(poly-mul.test_${SVARIANT_LOWER} ${ECX_DIR}/test/poly-mul-test.c) - target_include_directories(poly-mul.test_${SVARIANT_LOWER} PUBLIC ${INC_GF_${SVARIANT_UPPER}} ${INC_PRECOMP_${SVARIANT_UPPER}} ${PROJECT_SOURCE_DIR}/include ../include ${INC_EC} ${INC_COMMON}) - target_link_libraries(poly-mul.test_${SVARIANT_LOWER} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}}) - -add_executable(poly-redc.test_${SVARIANT_LOWER} ${ECX_DIR}/test/poly-redc-test.c) - target_include_directories(poly-redc.test_${SVARIANT_LOWER} PUBLIC ${INC_GF_${SVARIANT_UPPER}} ${INC_PRECOMP_${SVARIANT_UPPER}} ${PROJECT_SOURCE_DIR}/include ../include ${INC_EC} ${INC_COMMON}) - target_link_libraries(poly-redc.test_${SVARIANT_LOWER} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}}) - -add_executable(mont.test_${SVARIANT_LOWER} ${ECX_DIR}/test/mont-test.c) - target_include_directories(mont.test_${SVARIANT_LOWER} PUBLIC ${INC_GF_${SVARIANT_UPPER}} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${PROJECT_SOURCE_DIR}/include ../include ${INC_EC} ${INC_COMMON} .) - target_link_libraries(mont.test_${SVARIANT_LOWER} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_INTBIG} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}}) - -add_executable(ec.test_${SVARIANT_LOWER} ${ECX_DIR}/test/ec-test.c ${ECX_DIR}/test/test_extras.c) - target_include_directories(ec.test_${SVARIANT_LOWER} PUBLIC ${ECX_DIR}/test ${INC_GF_${SVARIANT_UPPER}} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${PROJECT_SOURCE_DIR}/include ../include ${INC_EC} ${INC_COMMON} .) - target_link_libraries(ec.test_${SVARIANT_LOWER} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_INTBIG} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}}) - -add_executable(velu.test_${SVARIANT_LOWER} ${ECX_DIR}/test/velu-test.c) - target_include_directories(velu.test_${SVARIANT_LOWER} PUBLIC ${INC_GF_${SVARIANT_UPPER}} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${PROJECT_SOURCE_DIR}/include ../include ${INC_EC} ${INC_COMMON} .) - target_link_libraries(velu.test_${SVARIANT_LOWER} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_INTBIG} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}}) - -add_executable(isog.test_${SVARIANT_LOWER} ${ECX_DIR}/test/isog-test.c) - target_include_directories(isog.test_${SVARIANT_LOWER} PUBLIC ${INC_GF_${SVARIANT_UPPER}} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${PROJECT_SOURCE_DIR}/include ../include ${INC_EC} ${INC_COMMON} .) - target_link_libraries(isog.test_${SVARIANT_LOWER} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_INTBIG} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}}) - - -add_test(ec_fp2.test_${SVARIANT_LOWER} fp2.test_${SVARIANT_LOWER} ${SQISIGN_TEST_REPS}) -add_test(ec_poly-mul.test_${SVARIANT_LOWER} poly-mul.test_${SVARIANT_LOWER} ${SQISIGN_TEST_REPS}) -add_test(ec_poly-redc.test_${SVARIANT_LOWER} poly-redc.test_${SVARIANT_LOWER} ${SQISIGN_TEST_REPS}) -add_test(ec_mont.test_${SVARIANT_LOWER} mont.test_${SVARIANT_LOWER} ${SQISIGN_TEST_REPS}) -add_test(ec_ec.test_${SVARIANT_LOWER} ec.test_${SVARIANT_LOWER} test ${SQISIGN_TEST_REPS}) -add_test(ec_velu.test_${SVARIANT_LOWER} velu.test_${SVARIANT_LOWER} ${SQISIGN_TEST_REPS}) -add_test(ec_isog.test_${SVARIANT_LOWER} isog.test_${SVARIANT_LOWER} ${SQISIGN_TEST_REPS}) \ No newline at end of file +include(../../lvlx_test.cmake) diff --git a/src/ec/ref/lvl1/test/ec-tests.h b/src/ec/ref/lvl1/test/ec-tests.h deleted file mode 100644 index 2e3af05..0000000 --- a/src/ec/ref/lvl1/test/ec-tests.h +++ /dev/null @@ -1,400 +0,0 @@ -#ifndef EC_TESTS_H -#define EC_TESTS_H - -#include "test_extras.h" -#include -#include -#include //////// NOTE: enable later -#include "test-basis.h" -#include "ec_params.h" - -// Global constants -extern const digit_t p[NWORDS_FIELD]; - -// Benchmark and test parameters -static int BENCH_LOOPS = 1000; // Number of iterations per bench -static int TEST_LOOPS = 512; // Number of iterations per test - - -bool ec_test() -{ // Tests for ecc arithmetic - bool OK = true; - int passed; - ec_point_t P = {0}, Q = {0}, R = {0}, S = {0}, SS = {0}, PQ = {0}; - ec_point_t AC = {0}; - digit_t k[NWORDS_ORDER] = {0}, l[NWORDS_ORDER] = {0}; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing ecc functions: \n\n"); - - // Point doubling - passed = 1; - P.x.re[0] = 0xDFD70ED0861BD329; P.x.re[1] = 0x20ACD3758C7F5540; P.x.re[2] = 0x3DCCDC007277F80A; P.x.re[3] = 0x18D6D2A22981DCE1; - P.x.im[0] = 0x3C23730A3F08F38C; P.x.im[1] = 0x98BB973AFD3D954D; P.x.im[2] = 0x8D98ADFC2829AE8A; P.x.im[3] = 0x21A2464D6369AFBA; - P.z.re[0] = 0x01; - - AC.z.re[0] = 0x01; - fp2_tomont(&AC.z, &AC.z); - - fp2_tomont(&R.x, &P.x); - fp2_tomont(&R.z, &P.z); - xDBL(&S, &R, &AC); - fp2_copy(&SS.x, &S.x); // Copy of S = SS <- 2P - fp2_copy(&SS.z, &S.z); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0x5950EE0A4AF90FC8; R.x.re[1] = 0x16488065A0A98B08; R.x.re[2] = 0xCE65322229DA0FD1; R.x.re[3] = 0x270A35FF781EE204; - R.x.im[0] = 0x564447FD9EC57F6B; R.x.im[1] = 0x2EE24E984294F729; R.x.im[2] = 0x53A6C7360E972C71; R.x.im[3] = 0x4FCF4B9928A7C7E; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2)!=0) { passed=0; goto out0; } - - Q.x.re[0] = 0xC46076A670C70053; Q.x.re[1] = 0x97517AFA3AB9ED13; Q.x.re[2] = 0x349644C942EDF993; Q.x.re[3] = 0xBB4A4DB6F29AF9E; - Q.x.im[0] = 0x8B47629FB5A15BB0; Q.x.im[1] = 0x4EC6E809953C1A10; Q.x.im[2] = 0x1F83F0EC6CBB84D6; Q.x.im[3] = 0x1D8417C1D33265D3; - Q.z.re[0] = 0x01; - - PQ.x.re[0] = 0x853F66D11BE5534F; PQ.x.re[1] = 0x27C8FD4E52D03D4A; PQ.x.re[2] = 0xF88EA78D0A0C29D2; PQ.x.re[3] = 0x2F6DFB07D397A067; - PQ.x.im[0] = 0xE8DBC4AA34434BA1; PQ.x.im[1] = 0x7A73AE182636F8A0; PQ.x.im[2] = 0x419EC260137868EB; PQ.x.im[3] = 0x129B3E301703D43F; - PQ.z.re[0] = 0x01; - - fp2_tomont(&S.x, &Q.x); - fp2_tomont(&S.z, &Q.z); - fp2_tomont(&PQ.x, &PQ.x); - fp2_tomont(&PQ.z, &PQ.z); - xADD(&S, &SS, &S, &PQ); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0xED0BEB8F93AB4FF9; R.x.re[1] = 0x27CF508B80CD49BF; R.x.re[2] = 0x38A6134DFA04B2BA; R.x.re[3] = 0x27B4CB15E109EF1F; - R.x.im[0] = 0x6F731BA6FD227BDE; R.x.im[1] = 0x14C12335341167F8; R.x.im[2] = 0xECA7B60F7866E27A; R.x.im[3] = 0x2A7A79A152880457; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2) != 0) { passed = 0; goto out0; } - - fp2_tomont(&R.x, &P.x); - fp2_tomont(&R.z, &P.z); - k[0] = 126; - xMUL(&S, &R, k, (ec_curve_t*)&AC); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0xDE80F87A1203A147; R.x.re[1] = 0xD59E1215928A3B2D; R.x.re[2] = 0xD5A67F83A5A8CE46; R.x.re[3] = 0xA11E162488C9CDF; - R.x.im[0] = 0x9417D0D79A26741B; R.x.im[1] = 0x8B1F47D6F0FE5EEC; R.x.im[2] = 0xE52188DCB054CE36; R.x.im[3] = 0x1A8075A6C3148AB3; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2) != 0) { passed = 0; goto out0; } - - fp2_tomont(&R.x, &P.x); - fp2_tomont(&R.z, &P.z); - k[0] = 0xE77AD6B6C6B2D8CD; - k[1] = 0xDE43A0B600F38D12; - k[2] = 0xA35F4A7897E17CE2; - k[3] = 0x10ACB62E614D1237; - xMUL(&S, &R, k, (ec_curve_t*)&AC); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0xD3938B0A68A3E7C0; R.x.re[1] = 0xE0667113208A0595; R.x.re[2] = 0x258F314C84E9CB60; R.x.re[3] = 0x14984BA7CA59AB71; - R.x.im[0] = 0xFE728423EE3BFEF4; R.x.im[1] = 0xBF68C42FE21AE0E4; R.x.im[2] = 0xA8FAF9C9528609CA; R.x.im[3] = 0x1225EC77A1DC0285; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2) != 0) { passed = 0; goto out0; } - - fp2_tomont(&R.x, &Q.x); - fp2_tomont(&R.z, &Q.z); - k[0] = 0xE77AD6B6C6B2D8CD; - k[1] = 0xDE43A0B600F38D12; - k[2] = 0xA35F4A7897E17CE2; - k[3] = 0x10ACB62E614D1237; - l[0] = 0x34AB78B6C6B2D8C0; - l[1] = 0xDE6B2D8CD00F38D1; - l[2] = 0xA35F4A7897E17CE2; - l[3] = 0x20ACF4A789614D13; - fp2_inv(&SS.z); - fp2_mul(&SS.x, &SS.x, &SS.z); - fp2_copy(&SS.z, &R.z); - xDBLMUL(&S, &R, k, &SS, l, &PQ, (ec_curve_t*)&AC); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0x554E1ADC609B992F; R.x.re[1] = 0xE407D961F8CC4C42; R.x.re[2] = 0x1CF626AFED5A68CE; R.x.re[3] = 0x6D02692EE110483; - R.x.im[0] = 0x16FB094E831C8997; R.x.im[1] = 0xFDE4ECF31DC5F702; R.x.im[2] = 0x89303D868DFAD7B4; R.x.im[3] = 0xC91ACE81346F22D; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2) != 0) { passed = 0; goto out0; } - -out0: - if (passed==1) printf(" ECC arithmetic tests ............................................ PASSED"); - else { printf(" ECC arithmetic tests... FAILED"); printf("\n"); return false; } - printf("\n"); - - return OK; -} - -bool dlog_test() -{ // Tests for dlog - bool OK = true; - int passed; - ec_point_t P = {0}, Q = {0}, R = {0}, S = {0}, SS = {0}, PQ = {0}; - ec_curve_t AC = {0}; - ec_basis_t PQ2; - digit_t scalarP[NWORDS_ORDER], scalarQ[NWORDS_ORDER], k[NWORDS_ORDER] = {0}, l[NWORDS_ORDER] = {0}; - digit_t kt[NWORDS_ORDER], lt[NWORDS_ORDER], f1[NWORDS_ORDER] = {0}, f2[NWORDS_ORDER] = {0}, zero[NWORDS_ORDER] = {0}, tpFdiv2[NWORDS_ORDER] = {0}, tpF[NWORDS_ORDER] = {0}; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing dlog functions: \n\n"); - - // dlog2 testing - passed = 1; - - fp2_tomont(&P.x, &xP2); - fp_mont_setone(P.z.re); - fp_set(P.z.im, 0); - - fp2_tomont(&Q.x, &xQ2); - fp_mont_setone(Q.z.re); - fp_set(Q.z.im, 0); - - fp2_tomont(&PQ.x, &xPQ2); - fp_mont_setone(PQ.z.re); - fp_set(PQ.z.im, 0); - - AC.C.re[0] = 0x01; - fp_copy(f1, TWOpFm1); - fp_copy(f2, TWOpF); - fp2_tomont(&AC.C, &AC.C); - - copy_point(&PQ2.P, &P); - copy_point(&PQ2.Q, &Q); - copy_point(&PQ2.PmQ, &PQ); - k[0] = 0xFFFFFFFFFFFFFFFF; - k[1] = 0x00000000000007FF; - l[0] = 0xFFFFFFFFFFFFFFFE; - l[1] = 0x00000000000007FF; - - for (int n = 0; n < TEST_LOOPS; n++) - { - k[0] -= 1; - l[0] -= 2; - xDBLMUL(&R, &P, k, &Q, l, &PQ, &AC); - ec_dlog_2(scalarP, scalarQ, &PQ2, &R, &AC); - - memcpy(kt, k, NWORDS_ORDER*RADIX/8); - memcpy(lt, l, NWORDS_ORDER*RADIX/8); - if (compare_words(k, f1, NWORDS_ORDER) == 1 || - (compare_words(l, f1, NWORDS_ORDER) == 1 && (compare_words(k, zero, NWORDS_ORDER) == 0 || compare_words(k, f1, NWORDS_ORDER) == 0))) { - if (compare_words(k, zero, NWORDS_ORDER) != 0) { - sub_test(kt, f2, kt, NWORDS_ORDER); - } - if (compare_words(l, zero, NWORDS_ORDER) != 0) { - sub_test(lt, f2, lt, NWORDS_ORDER); - } - } - if (compare_words((digit_t*)scalarP, (digit_t*)kt, NWORDS_ORDER) != 0 || compare_words((digit_t*)scalarQ, (digit_t*)lt, NWORDS_ORDER) != 0) { passed = 0; break; } - } - - if (passed == 1) printf(" dlog2 tests ..................................................... PASSED"); - else { printf(" dlog2 tests... FAILED"); printf("\n"); return false; } - printf("\n"); - - // dlog3 testing - passed = 1; - - fp2_tomont(&P.x, &xP3); - fp_mont_setone(P.z.re); - fp_set(P.z.im, 0); - - fp2_tomont(&Q.x, &xQ3); - fp_mont_setone(Q.z.re); - fp_set(Q.z.im, 0); - - fp2_tomont(&PQ.x, &xPQ3); - fp_mont_setone(PQ.z.re); - fp_set(PQ.z.im, 0); - - AC.C.re[0] = 0x01; - fp_copy(tpFdiv2, THREEpFdiv2); - fp_copy(tpF, THREEpF); - fp2_tomont(&AC.C, &AC.C); - - copy_point(&PQ2.P, &P); - copy_point(&PQ2.Q, &Q); - copy_point(&PQ2.PmQ, &PQ); - k[1] = 0; - l[1] = 0; - k[0] = 0x02153E468B91C6D1; - l[0] = 0x02153E468B91C6D0; - - for (int n = 0; n < TEST_LOOPS; n++) - { - k[0] -= 1; - l[0] -= 2; - xDBLMUL(&R, &P, k, &Q, l, &PQ, &AC); - ec_dlog_3(scalarP, scalarQ, &PQ2, &R, &AC); - - memcpy(kt, k, NWORDS_ORDER*RADIX/8); - memcpy(lt, l, NWORDS_ORDER*RADIX/8); - if (compare_words(k, tpFdiv2, NWORDS_ORDER) == 1 || - (compare_words(l, tpFdiv2, NWORDS_ORDER) == 1 && compare_words(k, zero, NWORDS_ORDER) == 0)) { - if (compare_words(k, zero, NWORDS_ORDER) != 0) { - sub_test(kt, tpF, kt, NWORDS_ORDER); - } - if (compare_words(l, zero, NWORDS_ORDER) != 0) { - sub_test(lt, tpF, lt, NWORDS_ORDER); - } - } - if (compare_words((digit_t*)scalarP, (digit_t*)kt, NWORDS_ORDER) != 0 || compare_words((digit_t*)scalarQ, (digit_t*)lt, NWORDS_ORDER) != 0) { passed = 0; break; } - } - - if (passed == 1) printf(" dlog3 tests ..................................................... PASSED"); - else { printf(" dlog3 tests... FAILED"); printf("\n"); return false; } - printf("\n"); - - return OK; -} - -bool ec_run() -{ - bool OK = true; - int n; - unsigned long long cycles, cycles1, cycles2; - ec_point_t P, Q, R, PQ, AC; - digit_t k[NWORDS_ORDER], l[NWORDS_ORDER]; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Benchmarking ecc arithmetic: \n\n"); - - // Point doubling - cycles = 0; - for (n=0; n -#include -#include //////// NOTE: enable later -#include "test-basis.h" -#include "ec_params.h" - -// Global constants -extern const digit_t p[NWORDS_FIELD]; - -// Benchmark and test parameters -static int BENCH_LOOPS = 1000; // Number of iterations per bench -static int TEST_LOOPS = 512; // Number of iterations per test - - -bool ec_test() -{ // Tests for ecc arithmetic - bool OK = true; - int passed; - ec_point_t P = {0}, Q = {0}, R = {0}, S = {0}, SS = {0}, PQ = {0}; - ec_point_t AC = {0}; - digit_t k[NWORDS_ORDER] = {0}, l[NWORDS_ORDER] = {0}; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing ecc functions: (NOT IMPLEMENTED) \n\n"); -/* - // Point doubling - passed = 1; - P.x.re[0] = 0xDFD70ED0861BD329; P.x.re[1] = 0x20ACD3758C7F5540; P.x.re[2] = 0x3DCCDC007277F80A; P.x.re[3] = 0x18D6D2A22981DCE1; - P.x.im[0] = 0x3C23730A3F08F38C; P.x.im[1] = 0x98BB973AFD3D954D; P.x.im[2] = 0x8D98ADFC2829AE8A; P.x.im[3] = 0x21A2464D6369AFBA; - P.z.re[0] = 0x01; - - AC.z.re[0] = 0x01; - fp2_tomont(&AC.z, &AC.z); - - fp2_tomont(&R.x, &P.x); - fp2_tomont(&R.z, &P.z); - xDBL(&S, &R, &AC); - fp2_copy(&SS.x, &S.x); // Copy of S = SS <- 2P - fp2_copy(&SS.z, &S.z); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0x5950EE0A4AF90FC8; R.x.re[1] = 0x16488065A0A98B08; R.x.re[2] = 0xCE65322229DA0FD1; R.x.re[3] = 0x270A35FF781EE204; - R.x.im[0] = 0x564447FD9EC57F6B; R.x.im[1] = 0x2EE24E984294F729; R.x.im[2] = 0x53A6C7360E972C71; R.x.im[3] = 0x4FCF4B9928A7C7E; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2)!=0) { passed=0; goto out0; } - - Q.x.re[0] = 0xC46076A670C70053; Q.x.re[1] = 0x97517AFA3AB9ED13; Q.x.re[2] = 0x349644C942EDF993; Q.x.re[3] = 0xBB4A4DB6F29AF9E; - Q.x.im[0] = 0x8B47629FB5A15BB0; Q.x.im[1] = 0x4EC6E809953C1A10; Q.x.im[2] = 0x1F83F0EC6CBB84D6; Q.x.im[3] = 0x1D8417C1D33265D3; - Q.z.re[0] = 0x01; - - PQ.x.re[0] = 0x853F66D11BE5534F; PQ.x.re[1] = 0x27C8FD4E52D03D4A; PQ.x.re[2] = 0xF88EA78D0A0C29D2; PQ.x.re[3] = 0x2F6DFB07D397A067; - PQ.x.im[0] = 0xE8DBC4AA34434BA1; PQ.x.im[1] = 0x7A73AE182636F8A0; PQ.x.im[2] = 0x419EC260137868EB; PQ.x.im[3] = 0x129B3E301703D43F; - PQ.z.re[0] = 0x01; - - fp2_tomont(&S.x, &Q.x); - fp2_tomont(&S.z, &Q.z); - fp2_tomont(&PQ.x, &PQ.x); - fp2_tomont(&PQ.z, &PQ.z); - xADD(&S, &SS, &S, &PQ); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0xED0BEB8F93AB4FF9; R.x.re[1] = 0x27CF508B80CD49BF; R.x.re[2] = 0x38A6134DFA04B2BA; R.x.re[3] = 0x27B4CB15E109EF1F; - R.x.im[0] = 0x6F731BA6FD227BDE; R.x.im[1] = 0x14C12335341167F8; R.x.im[2] = 0xECA7B60F7866E27A; R.x.im[3] = 0x2A7A79A152880457; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2) != 0) { passed = 0; goto out0; } - - fp2_tomont(&R.x, &P.x); - fp2_tomont(&R.z, &P.z); - k[0] = 126; - xMUL(&S, &R, k, (ec_curve_t*)&AC); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0xDE80F87A1203A147; R.x.re[1] = 0xD59E1215928A3B2D; R.x.re[2] = 0xD5A67F83A5A8CE46; R.x.re[3] = 0xA11E162488C9CDF; - R.x.im[0] = 0x9417D0D79A26741B; R.x.im[1] = 0x8B1F47D6F0FE5EEC; R.x.im[2] = 0xE52188DCB054CE36; R.x.im[3] = 0x1A8075A6C3148AB3; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2) != 0) { passed = 0; goto out0; } - - fp2_tomont(&R.x, &P.x); - fp2_tomont(&R.z, &P.z); - k[0] = 0xE77AD6B6C6B2D8CD; - k[1] = 0xDE43A0B600F38D12; - k[2] = 0xA35F4A7897E17CE2; - k[3] = 0x10ACB62E614D1237; - xMUL(&S, &R, k, (ec_curve_t*)&AC); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0xD3938B0A68A3E7C0; R.x.re[1] = 0xE0667113208A0595; R.x.re[2] = 0x258F314C84E9CB60; R.x.re[3] = 0x14984BA7CA59AB71; - R.x.im[0] = 0xFE728423EE3BFEF4; R.x.im[1] = 0xBF68C42FE21AE0E4; R.x.im[2] = 0xA8FAF9C9528609CA; R.x.im[3] = 0x1225EC77A1DC0285; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2) != 0) { passed = 0; goto out0; } - - fp2_tomont(&R.x, &Q.x); - fp2_tomont(&R.z, &Q.z); - k[0] = 0xE77AD6B6C6B2D8CD; - k[1] = 0xDE43A0B600F38D12; - k[2] = 0xA35F4A7897E17CE2; - k[3] = 0x10ACB62E614D1237; - l[0] = 0x34AB78B6C6B2D8C0; - l[1] = 0xDE6B2D8CD00F38D1; - l[2] = 0xA35F4A7897E17CE2; - l[3] = 0x20ACF4A789614D13; - fp2_inv(&SS.z); - fp2_mul(&SS.x, &SS.x, &SS.z); - fp2_copy(&SS.z, &R.z); - xDBLMUL(&S, &R, k, &SS, l, &PQ, (ec_curve_t*)&AC); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0x554E1ADC609B992F; R.x.re[1] = 0xE407D961F8CC4C42; R.x.re[2] = 0x1CF626AFED5A68CE; R.x.re[3] = 0x6D02692EE110483; - R.x.im[0] = 0x16FB094E831C8997; R.x.im[1] = 0xFDE4ECF31DC5F702; R.x.im[2] = 0x89303D868DFAD7B4; R.x.im[3] = 0xC91ACE81346F22D; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2) != 0) { passed = 0; goto out0; } - -out0: - if (passed==1) printf(" ECC arithmetic tests ............................................ PASSED"); - else { printf(" ECC arithmetic tests... FAILED"); printf("\n"); return false; } - printf("\n"); - */ - return OK; -} - -bool dlog_test() -{ // Tests for dlog - bool OK = true; - int passed; - ec_point_t P = {0}, Q = {0}, R = {0}, S = {0}, SS = {0}, PQ = {0}; - ec_curve_t AC = {0}; - ec_basis_t PQ2; - digit_t scalarP[NWORDS_ORDER], scalarQ[NWORDS_ORDER], k[NWORDS_ORDER] = {0}, l[NWORDS_ORDER] = {0}; - digit_t kt[NWORDS_ORDER], lt[NWORDS_ORDER], f1[NWORDS_ORDER] = {0}, f2[NWORDS_ORDER] = {0}, zero[NWORDS_ORDER] = {0}, tpFdiv2[NWORDS_ORDER] = {0}, tpF[NWORDS_ORDER] = {0}; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing dlog functions: \n\n"); - - // dlog2 testing - passed = 1; - - fp2_tomont(&P.x, &xP2); - fp_mont_setone(P.z.re); - fp_set(P.z.im, 0); - - fp2_tomont(&Q.x, &xQ2); - fp_mont_setone(Q.z.re); - fp_set(Q.z.im, 0); - - fp2_tomont(&PQ.x, &xPQ2); - fp_mont_setone(PQ.z.re); - fp_set(PQ.z.im, 0); - - AC.C.re[0] = 0x01; - fp_copy(f1, TWOpFm1); - fp_copy(f2, TWOpF); - fp2_tomont(&AC.C, &AC.C); - - copy_point(&PQ2.P, &P); - copy_point(&PQ2.Q, &Q); - copy_point(&PQ2.PmQ, &PQ); - k[0] = 0xFFFFFFFFFFFFFFFF; - k[1] = 0x00000000000007FF; - l[0] = 0xFFFFFFFFFFFFFFFE; - l[1] = 0x00000000000007FF; - - for (int n = 0; n < TEST_LOOPS; n++) - { - k[0] -= 1; - l[0] -= 2; - xDBLMUL(&R, &P, k, &Q, l, &PQ, &AC); - ec_dlog_2(scalarP, scalarQ, &PQ2, &R, &AC); - - memcpy(kt, k, NWORDS_ORDER*RADIX/8); - memcpy(lt, l, NWORDS_ORDER*RADIX/8); - if (compare_words(k, f1, NWORDS_ORDER) == 1 || - (compare_words(l, f1, NWORDS_ORDER) == 1 && (compare_words(k, zero, NWORDS_ORDER) == 0 || compare_words(k, f1, NWORDS_ORDER) == 0))) { - if (compare_words(k, zero, NWORDS_ORDER) != 0) { - sub_test(kt, f2, kt, NWORDS_ORDER); - } - if (compare_words(l, zero, NWORDS_ORDER) != 0) { - sub_test(lt, f2, lt, NWORDS_ORDER); - } - } - if (compare_words((digit_t*)scalarP, (digit_t*)kt, NWORDS_ORDER) != 0 || compare_words((digit_t*)scalarQ, (digit_t*)lt, NWORDS_ORDER) != 0) { passed = 0; break; } - } - - if (passed == 1) printf(" dlog2 tests ..................................................... PASSED"); - else { printf(" dlog2 tests... FAILED"); printf("\n"); return false; } - printf("\n"); - - // dlog3 testing - passed = 1; - - fp2_tomont(&P.x, &xP3); - fp_mont_setone(P.z.re); - fp_set(P.z.im, 0); - - fp2_tomont(&Q.x, &xQ3); - fp_mont_setone(Q.z.re); - fp_set(Q.z.im, 0); - - fp2_tomont(&PQ.x, &xPQ3); - fp_mont_setone(PQ.z.re); - fp_set(PQ.z.im, 0); - - AC.C.re[0] = 0x01; - fp_copy(tpFdiv2, THREEpFdiv2); - fp_copy(tpF, THREEpF); - fp2_tomont(&AC.C, &AC.C); - - copy_point(&PQ2.P, &P); - copy_point(&PQ2.Q, &Q); - copy_point(&PQ2.PmQ, &PQ); - k[1] = 0; - l[1] = 0; - k[0] = 0x02153E468B91C6D1; - l[0] = 0x02153E468B91C6D0; - - for (int n = 0; n < TEST_LOOPS; n++) - { - k[0] -= 1; - l[0] -= 2; - xDBLMUL(&R, &P, k, &Q, l, &PQ, &AC); - ec_dlog_3(scalarP, scalarQ, &PQ2, &R, &AC); - - memcpy(kt, k, NWORDS_ORDER*RADIX/8); - memcpy(lt, l, NWORDS_ORDER*RADIX/8); - if (compare_words(k, tpFdiv2, NWORDS_ORDER) == 1 || - (compare_words(l, tpFdiv2, NWORDS_ORDER) == 1 && compare_words(k, zero, NWORDS_ORDER) == 0)) { - if (compare_words(k, zero, NWORDS_ORDER) != 0) { - sub_test(kt, tpF, kt, NWORDS_ORDER); - } - if (compare_words(l, zero, NWORDS_ORDER) != 0) { - sub_test(lt, tpF, lt, NWORDS_ORDER); - } - } - if (compare_words((digit_t*)scalarP, (digit_t*)kt, NWORDS_ORDER) != 0 || compare_words((digit_t*)scalarQ, (digit_t*)lt, NWORDS_ORDER) != 0) { passed = 0; break; } - } - - if (passed == 1) printf(" dlog3 tests ..................................................... PASSED"); - else { printf(" dlog3 tests... FAILED"); printf("\n"); return false; } - printf("\n"); - - return OK; -} - -bool ec_run() -{ - bool OK = true; - int n; - unsigned long long cycles, cycles1, cycles2; - ec_point_t P, Q, R, PQ, AC; - digit_t k[NWORDS_ORDER], l[NWORDS_ORDER]; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Benchmarking ecc arithmetic: \n\n"); - - // Point doubling - cycles = 0; - for (n=0; n -#include -#include //////// NOTE: enable later -#include "test-basis.h" -#include "ec_params.h" - -// Global constants -extern const digit_t p[NWORDS_FIELD]; - -// Benchmark and test parameters -static int BENCH_LOOPS = 1000; // Number of iterations per bench -static int TEST_LOOPS = 512; // Number of iterations per test - - -bool ec_test() -{ // Tests for ecc arithmetic - bool OK = true; - int passed; - ec_point_t P = {0}, Q = {0}, R = {0}, S = {0}, SS = {0}, PQ = {0}; - ec_point_t AC = {0}; - digit_t k[NWORDS_ORDER] = {0}, l[NWORDS_ORDER] = {0}; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing ecc functions: (NOT IMPLEMENTED) \n\n"); -/* - // Point doubling - passed = 1; - P.x.re[0] = 0xDFD70ED0861BD329; P.x.re[1] = 0x20ACD3758C7F5540; P.x.re[2] = 0x3DCCDC007277F80A; P.x.re[3] = 0x18D6D2A22981DCE1; - P.x.im[0] = 0x3C23730A3F08F38C; P.x.im[1] = 0x98BB973AFD3D954D; P.x.im[2] = 0x8D98ADFC2829AE8A; P.x.im[3] = 0x21A2464D6369AFBA; - P.z.re[0] = 0x01; - - AC.z.re[0] = 0x01; - fp2_tomont(&AC.z, &AC.z); - - fp2_tomont(&R.x, &P.x); - fp2_tomont(&R.z, &P.z); - xDBL(&S, &R, &AC); - fp2_copy(&SS.x, &S.x); // Copy of S = SS <- 2P - fp2_copy(&SS.z, &S.z); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0x5950EE0A4AF90FC8; R.x.re[1] = 0x16488065A0A98B08; R.x.re[2] = 0xCE65322229DA0FD1; R.x.re[3] = 0x270A35FF781EE204; - R.x.im[0] = 0x564447FD9EC57F6B; R.x.im[1] = 0x2EE24E984294F729; R.x.im[2] = 0x53A6C7360E972C71; R.x.im[3] = 0x4FCF4B9928A7C7E; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2)!=0) { passed=0; goto out0; } - - Q.x.re[0] = 0xC46076A670C70053; Q.x.re[1] = 0x97517AFA3AB9ED13; Q.x.re[2] = 0x349644C942EDF993; Q.x.re[3] = 0xBB4A4DB6F29AF9E; - Q.x.im[0] = 0x8B47629FB5A15BB0; Q.x.im[1] = 0x4EC6E809953C1A10; Q.x.im[2] = 0x1F83F0EC6CBB84D6; Q.x.im[3] = 0x1D8417C1D33265D3; - Q.z.re[0] = 0x01; - - PQ.x.re[0] = 0x853F66D11BE5534F; PQ.x.re[1] = 0x27C8FD4E52D03D4A; PQ.x.re[2] = 0xF88EA78D0A0C29D2; PQ.x.re[3] = 0x2F6DFB07D397A067; - PQ.x.im[0] = 0xE8DBC4AA34434BA1; PQ.x.im[1] = 0x7A73AE182636F8A0; PQ.x.im[2] = 0x419EC260137868EB; PQ.x.im[3] = 0x129B3E301703D43F; - PQ.z.re[0] = 0x01; - - fp2_tomont(&S.x, &Q.x); - fp2_tomont(&S.z, &Q.z); - fp2_tomont(&PQ.x, &PQ.x); - fp2_tomont(&PQ.z, &PQ.z); - xADD(&S, &SS, &S, &PQ); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0xED0BEB8F93AB4FF9; R.x.re[1] = 0x27CF508B80CD49BF; R.x.re[2] = 0x38A6134DFA04B2BA; R.x.re[3] = 0x27B4CB15E109EF1F; - R.x.im[0] = 0x6F731BA6FD227BDE; R.x.im[1] = 0x14C12335341167F8; R.x.im[2] = 0xECA7B60F7866E27A; R.x.im[3] = 0x2A7A79A152880457; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2) != 0) { passed = 0; goto out0; } - - fp2_tomont(&R.x, &P.x); - fp2_tomont(&R.z, &P.z); - k[0] = 126; - xMUL(&S, &R, k, (ec_curve_t*)&AC); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0xDE80F87A1203A147; R.x.re[1] = 0xD59E1215928A3B2D; R.x.re[2] = 0xD5A67F83A5A8CE46; R.x.re[3] = 0xA11E162488C9CDF; - R.x.im[0] = 0x9417D0D79A26741B; R.x.im[1] = 0x8B1F47D6F0FE5EEC; R.x.im[2] = 0xE52188DCB054CE36; R.x.im[3] = 0x1A8075A6C3148AB3; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2) != 0) { passed = 0; goto out0; } - - fp2_tomont(&R.x, &P.x); - fp2_tomont(&R.z, &P.z); - k[0] = 0xE77AD6B6C6B2D8CD; - k[1] = 0xDE43A0B600F38D12; - k[2] = 0xA35F4A7897E17CE2; - k[3] = 0x10ACB62E614D1237; - xMUL(&S, &R, k, (ec_curve_t*)&AC); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0xD3938B0A68A3E7C0; R.x.re[1] = 0xE0667113208A0595; R.x.re[2] = 0x258F314C84E9CB60; R.x.re[3] = 0x14984BA7CA59AB71; - R.x.im[0] = 0xFE728423EE3BFEF4; R.x.im[1] = 0xBF68C42FE21AE0E4; R.x.im[2] = 0xA8FAF9C9528609CA; R.x.im[3] = 0x1225EC77A1DC0285; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2) != 0) { passed = 0; goto out0; } - - fp2_tomont(&R.x, &Q.x); - fp2_tomont(&R.z, &Q.z); - k[0] = 0xE77AD6B6C6B2D8CD; - k[1] = 0xDE43A0B600F38D12; - k[2] = 0xA35F4A7897E17CE2; - k[3] = 0x10ACB62E614D1237; - l[0] = 0x34AB78B6C6B2D8C0; - l[1] = 0xDE6B2D8CD00F38D1; - l[2] = 0xA35F4A7897E17CE2; - l[3] = 0x20ACF4A789614D13; - fp2_inv(&SS.z); - fp2_mul(&SS.x, &SS.x, &SS.z); - fp2_copy(&SS.z, &R.z); - xDBLMUL(&S, &R, k, &SS, l, &PQ, (ec_curve_t*)&AC); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0x554E1ADC609B992F; R.x.re[1] = 0xE407D961F8CC4C42; R.x.re[2] = 0x1CF626AFED5A68CE; R.x.re[3] = 0x6D02692EE110483; - R.x.im[0] = 0x16FB094E831C8997; R.x.im[1] = 0xFDE4ECF31DC5F702; R.x.im[2] = 0x89303D868DFAD7B4; R.x.im[3] = 0xC91ACE81346F22D; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2) != 0) { passed = 0; goto out0; } - -out0: - if (passed==1) printf(" ECC arithmetic tests ............................................ PASSED"); - else { printf(" ECC arithmetic tests... FAILED"); printf("\n"); return false; } - printf("\n"); - */ - return OK; -} - -bool dlog_test() -{ // Tests for dlog - bool OK = true; - int passed; - ec_point_t P = {0}, Q = {0}, R = {0}, S = {0}, SS = {0}, PQ = {0}; - ec_curve_t AC = {0}; - ec_basis_t PQ2; - digit_t scalarP[NWORDS_ORDER], scalarQ[NWORDS_ORDER], k[NWORDS_ORDER] = {0}, l[NWORDS_ORDER] = {0}; - digit_t kt[NWORDS_ORDER], lt[NWORDS_ORDER], f1[NWORDS_ORDER] = {0}, f2[NWORDS_ORDER] = {0}, zero[NWORDS_ORDER] = {0}, tpFdiv2[NWORDS_ORDER] = {0}, tpF[NWORDS_ORDER] = {0}; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing dlog functions: \n\n"); - - // dlog2 testing - passed = 1; - - fp2_tomont(&P.x, &xP2); - fp_mont_setone(P.z.re); - fp_set(P.z.im, 0); - - fp2_tomont(&Q.x, &xQ2); - fp_mont_setone(Q.z.re); - fp_set(Q.z.im, 0); - - fp2_tomont(&PQ.x, &xPQ2); - fp_mont_setone(PQ.z.re); - fp_set(PQ.z.im, 0); - - AC.C.re[0] = 0x01; - fp_copy(f1, TWOpFm1); - fp_copy(f2, TWOpF); - fp2_tomont(&AC.C, &AC.C); - - copy_point(&PQ2.P, &P); - copy_point(&PQ2.Q, &Q); - copy_point(&PQ2.PmQ, &PQ); - k[0] = 0xFFFFFFFFFFFFFFFF; - k[1] = 0x00000000000007FF; - l[0] = 0xFFFFFFFFFFFFFFFE; - l[1] = 0x00000000000007FF; - - for (int n = 0; n < TEST_LOOPS; n++) - { - k[0] -= 1; - l[0] -= 2; - xDBLMUL(&R, &P, k, &Q, l, &PQ, &AC); - ec_dlog_2(scalarP, scalarQ, &PQ2, &R, &AC); - - memcpy(kt, k, NWORDS_ORDER*RADIX/8); - memcpy(lt, l, NWORDS_ORDER*RADIX/8); - if (compare_words(k, f1, NWORDS_ORDER) == 1 || - (compare_words(l, f1, NWORDS_ORDER) == 1 && (compare_words(k, zero, NWORDS_ORDER) == 0 || compare_words(k, f1, NWORDS_ORDER) == 0))) { - if (compare_words(k, zero, NWORDS_ORDER) != 0) { - sub_test(kt, f2, kt, NWORDS_ORDER); - } - if (compare_words(l, zero, NWORDS_ORDER) != 0) { - sub_test(lt, f2, lt, NWORDS_ORDER); - } - } - if (compare_words((digit_t*)scalarP, (digit_t*)kt, NWORDS_ORDER) != 0 || compare_words((digit_t*)scalarQ, (digit_t*)lt, NWORDS_ORDER) != 0) { passed = 0; break; } - } - - if (passed == 1) printf(" dlog2 tests ..................................................... PASSED"); - else { printf(" dlog2 tests... FAILED"); printf("\n"); return false; } - printf("\n"); - - // dlog3 testing - passed = 1; - - fp2_tomont(&P.x, &xP3); - fp_mont_setone(P.z.re); - fp_set(P.z.im, 0); - - fp2_tomont(&Q.x, &xQ3); - fp_mont_setone(Q.z.re); - fp_set(Q.z.im, 0); - - fp2_tomont(&PQ.x, &xPQ3); - fp_mont_setone(PQ.z.re); - fp_set(PQ.z.im, 0); - - AC.C.re[0] = 0x01; - fp_copy(tpFdiv2, THREEpFdiv2); - fp_copy(tpF, THREEpF); - fp2_tomont(&AC.C, &AC.C); - - copy_point(&PQ2.P, &P); - copy_point(&PQ2.Q, &Q); - copy_point(&PQ2.PmQ, &PQ); - k[1] = 0; - l[1] = 0; - k[0] = 0x02153E468B91C6D1; - l[0] = 0x02153E468B91C6D0; - - for (int n = 0; n < TEST_LOOPS; n++) - { - k[0] -= 1; - l[0] -= 2; - xDBLMUL(&R, &P, k, &Q, l, &PQ, &AC); - ec_dlog_3(scalarP, scalarQ, &PQ2, &R, &AC); - - memcpy(kt, k, NWORDS_ORDER*RADIX/8); - memcpy(lt, l, NWORDS_ORDER*RADIX/8); - if (compare_words(k, tpFdiv2, NWORDS_ORDER) == 1 || - (compare_words(l, tpFdiv2, NWORDS_ORDER) == 1 && compare_words(k, zero, NWORDS_ORDER) == 0)) { - if (compare_words(k, zero, NWORDS_ORDER) != 0) { - sub_test(kt, tpF, kt, NWORDS_ORDER); - } - if (compare_words(l, zero, NWORDS_ORDER) != 0) { - sub_test(lt, tpF, lt, NWORDS_ORDER); - } - } - if (compare_words((digit_t*)scalarP, (digit_t*)kt, NWORDS_ORDER) != 0 || compare_words((digit_t*)scalarQ, (digit_t*)lt, NWORDS_ORDER) != 0) { passed = 0; break; } - } - - if (passed == 1) printf(" dlog3 tests ..................................................... PASSED"); - else { printf(" dlog3 tests... FAILED"); printf("\n"); return false; } - printf("\n"); - - return OK; -} - -bool ec_run() -{ - bool OK = true; - int n; - unsigned long long cycles, cycles1, cycles2; - ec_point_t P, Q, R, PQ, AC; - digit_t k[NWORDS_ORDER], l[NWORDS_ORDER]; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Benchmarking ecc arithmetic: \n\n"); - - // Point doubling - cycles = 0; - for (n=0; n + +uint32_t +ec_recover_y(fp2_t *y, const fp2_t *Px, const ec_curve_t *curve) +{ // Recover y-coordinate of a point on the Montgomery curve y^2 = x^3 + Ax^2 + x + fp2_t t0; + + fp2_sqr(&t0, Px); + fp2_mul(y, &t0, &curve->A); // Ax^2 + fp2_add(y, y, Px); // Ax^2 + x + fp2_mul(&t0, &t0, Px); + fp2_add(y, y, &t0); // x^3 + Ax^2 + x + // This is required, because we do not yet know that our curves are + // supersingular so our points live on the twist with B = 1. + return fp2_sqrt_verify(y); +} + +static void +difference_point(ec_point_t *PQ, const ec_point_t *P, const ec_point_t *Q, const ec_curve_t *curve) +{ + // Given P,Q in projective x-only, computes a deterministic choice for (P-Q) + // Based on Proposition 3 of https://eprint.iacr.org/2017/518.pdf + + fp2_t Bxx, Bxz, Bzz, t0, t1; + + fp2_mul(&t0, &P->x, &Q->x); + fp2_mul(&t1, &P->z, &Q->z); + fp2_sub(&Bxx, &t0, &t1); + fp2_sqr(&Bxx, &Bxx); + fp2_mul(&Bxx, &Bxx, &curve->C); // C*(P.x*Q.x-P.z*Q.z)^2 + fp2_add(&Bxz, &t0, &t1); + fp2_mul(&t0, &P->x, &Q->z); + fp2_mul(&t1, &P->z, &Q->x); + fp2_add(&Bzz, &t0, &t1); + fp2_mul(&Bxz, &Bxz, &Bzz); // (P.x*Q.x+P.z*Q.z)(P.x*Q.z+P.z*Q.x) + fp2_sub(&Bzz, &t0, &t1); + fp2_sqr(&Bzz, &Bzz); + fp2_mul(&Bzz, &Bzz, &curve->C); // C*(P.x*Q.z-P.z*Q.x)^2 + fp2_mul(&Bxz, &Bxz, &curve->C); // C*(P.x*Q.x+P.z*Q.z)(P.x*Q.z+P.z*Q.x) + fp2_mul(&t0, &t0, &t1); + fp2_mul(&t0, &t0, &curve->A); + fp2_add(&t0, &t0, &t0); + fp2_add(&Bxz, &Bxz, &t0); // C*(P.x*Q.x+P.z*Q.z)(P.x*Q.z+P.z*Q.x) + 2*A*P.x*Q.z*P.z*Q.x + + // To ensure that the denominator is a fourth power in Fp, we normalize by + // C*C_bar^2*(P.z)_bar^2*(Q.z)_bar^2 + fp_copy(&t0.re, &curve->C.re); + fp_neg(&t0.im, &curve->C.im); + fp2_sqr(&t0, &t0); + fp2_mul(&t0, &t0, &curve->C); + fp_copy(&t1.re, &P->z.re); + fp_neg(&t1.im, &P->z.im); + fp2_sqr(&t1, &t1); + fp2_mul(&t0, &t0, &t1); + fp_copy(&t1.re, &Q->z.re); + fp_neg(&t1.im, &Q->z.im); + fp2_sqr(&t1, &t1); + fp2_mul(&t0, &t0, &t1); + fp2_mul(&Bxx, &Bxx, &t0); + fp2_mul(&Bxz, &Bxz, &t0); + fp2_mul(&Bzz, &Bzz, &t0); + + // Solving quadratic equation + fp2_sqr(&t0, &Bxz); + fp2_mul(&t1, &Bxx, &Bzz); + fp2_sub(&t0, &t0, &t1); + // No need to check if t0 is square, as per the entangled basis algorithm. + fp2_sqrt(&t0); + fp2_add(&PQ->x, &Bxz, &t0); + fp2_copy(&PQ->z, &Bzz); +} + +// Lifts a basis x(P), x(Q), x(P-Q) assuming the curve has (A/C : 1) and the point +// P = (X/Z : 1). For generic implementation see lift_basis() +uint32_t +lift_basis_normalized(jac_point_t *P, jac_point_t *Q, ec_basis_t *B, ec_curve_t *E) +{ + assert(fp2_is_one(&B->P.z)); + assert(fp2_is_one(&E->C)); + + fp2_copy(&P->x, &B->P.x); + fp2_copy(&Q->x, &B->Q.x); + fp2_copy(&Q->z, &B->Q.z); + fp2_set_one(&P->z); + uint32_t ret = ec_recover_y(&P->y, &P->x, E); + + // Algorithm of Okeya-Sakurai to recover y.Q in the montgomery model + fp2_t v1, v2, v3, v4; + fp2_mul(&v1, &P->x, &Q->z); + fp2_add(&v2, &Q->x, &v1); + fp2_sub(&v3, &Q->x, &v1); + fp2_sqr(&v3, &v3); + fp2_mul(&v3, &v3, &B->PmQ.x); + fp2_add(&v1, &E->A, &E->A); + fp2_mul(&v1, &v1, &Q->z); + fp2_add(&v2, &v2, &v1); + fp2_mul(&v4, &P->x, &Q->x); + fp2_add(&v4, &v4, &Q->z); + fp2_mul(&v2, &v2, &v4); + fp2_mul(&v1, &v1, &Q->z); + fp2_sub(&v2, &v2, &v1); + fp2_mul(&v2, &v2, &B->PmQ.z); + fp2_sub(&Q->y, &v3, &v2); + fp2_add(&v1, &P->y, &P->y); + fp2_mul(&v1, &v1, &Q->z); + fp2_mul(&v1, &v1, &B->PmQ.z); + fp2_mul(&Q->x, &Q->x, &v1); + fp2_mul(&Q->z, &Q->z, &v1); + + // Transforming to a jacobian coordinate + fp2_sqr(&v1, &Q->z); + fp2_mul(&Q->y, &Q->y, &v1); + fp2_mul(&Q->x, &Q->x, &Q->z); + return ret; +} + +uint32_t +lift_basis(jac_point_t *P, jac_point_t *Q, ec_basis_t *B, ec_curve_t *E) +{ + // Normalise the curve E such that (A : C) is (A/C : 1) + // and the point x(P) = (X/Z : 1). + fp2_t inverses[2]; + fp2_copy(&inverses[0], &B->P.z); + fp2_copy(&inverses[1], &E->C); + + fp2_batched_inv(inverses, 2); + fp2_set_one(&B->P.z); + fp2_set_one(&E->C); + + fp2_mul(&B->P.x, &B->P.x, &inverses[0]); + fp2_mul(&E->A, &E->A, &inverses[1]); + + // Lift the basis to Jacobian points P, Q + return lift_basis_normalized(P, Q, B, E); +} + +// Given an x-coordinate, determines if this is a valid +// point on the curve. Assumes C=1. +static uint32_t +is_on_curve(const fp2_t *x, const ec_curve_t *curve) +{ + assert(fp2_is_one(&curve->C)); + fp2_t t0; + + fp2_add(&t0, x, &curve->A); // x + (A/C) + fp2_mul(&t0, &t0, x); // x^2 + (A/C)*x + fp2_add_one(&t0, &t0); // x^2 + (A/C)*x + 1 + fp2_mul(&t0, &t0, x); // x^3 + (A/C)*x^2 + x + + return fp2_is_square(&t0); +} + +// Helper function which given a point of order k*2^n with n maximal +// and k odd, computes a point of order 2^f +static inline void +clear_cofactor_for_maximal_even_order(ec_point_t *P, ec_curve_t *curve, int f) +{ + // clear out the odd cofactor to get a point of order 2^n + ec_mul(P, p_cofactor_for_2f, P_COFACTOR_FOR_2F_BITLENGTH, P, curve); + + // clear the power of two to get a point of order 2^f + for (int i = 0; i < TORSION_EVEN_POWER - f; i++) { + xDBL_A24(P, P, &curve->A24, curve->is_A24_computed_and_normalized); + } +} + +// Helper function which finds an NQR -1 / (1 + i*b) for entangled basis generation +static uint8_t +find_nqr_factor(fp2_t *x, ec_curve_t *curve, const uint8_t start) +{ + // factor = -1/(1 + i*b) for b in Fp will be NQR whenever 1 + b^2 is NQR + // in Fp, so we find one of these and then invert (1 + i*b). We store b + // as a u8 hint to save time in verification. + + // We return the hint as a u8, but use (uint16_t)n to give 2^16 - 1 + // to make failure cryptographically negligible, with a fallback when + // n > 128 is required. + uint8_t hint; + uint32_t found = 0; + uint16_t n = start; + + bool qr_b = 1; + fp_t b, tmp; + fp2_t z, t0, t1; + + do { + while (qr_b) { + // find b with 1 + b^2 a non-quadratic residue + fp_set_small(&tmp, (uint32_t)n * n + 1); + qr_b = fp_is_square(&tmp); + n++; // keeps track of b = n - 1 + } + + // for Px := -A/(1 + i*b) to be on the curve + // is equivalent to A^2*(z-1) - z^2 NQR for z = 1 + i*b + // thus prevents unnecessary inversion pre-check + + // t0 = z - 1 = i*b + // t1 = z = 1 + i*b + fp_set_small(&b, (uint32_t)n - 1); + fp2_set_zero(&t0); + fp2_set_one(&z); + fp_copy(&z.im, &b); + fp_copy(&t0.im, &b); + + // A^2*(z-1) - z^2 + fp2_sqr(&t1, &curve->A); + fp2_mul(&t0, &t0, &t1); // A^2 * (z - 1) + fp2_sqr(&t1, &z); + fp2_sub(&t0, &t0, &t1); // A^2 * (z - 1) - z^2 + found = !fp2_is_square(&t0); + + qr_b = 1; + } while (!found); + + // set Px to -A/(1 + i*b) + fp2_copy(x, &z); + fp2_inv(x); + fp2_mul(x, x, &curve->A); + fp2_neg(x, x); + + /* + * With very low probability n will not fit in 7 bits. + * We set hint = 0 which signals failure and the need + * to generate a value on the fly during verification + */ + hint = n <= 128 ? n - 1 : 0; + + return hint; +} + +// Helper function which finds a point x(P) = n * A +static uint8_t +find_nA_x_coord(fp2_t *x, ec_curve_t *curve, const uint8_t start) +{ + assert(!fp2_is_square(&curve->A)); // Only to be called when A is a NQR + + // when A is NQR we allow x(P) to be a multiple n*A of A + uint8_t n = start; + if (n == 1) { + fp2_copy(x, &curve->A); + } else { + fp2_mul_small(x, &curve->A, n); + } + + while (!is_on_curve(x, curve)) { + fp2_add(x, x, &curve->A); + n++; + } + + /* + * With very low probability (1/2^128), n will not fit in 7 bits. + * In this case, we set hint = 0 which signals failure and the need + * to generate a value on the fly during verification + */ + uint8_t hint = n < 128 ? n : 0; + return hint; +} + +// The entangled basis generation does not allow A = 0 +// so we simply return the one we have already precomputed +static void +ec_basis_E0_2f(ec_basis_t *PQ2, ec_curve_t *curve, int f) +{ + assert(fp2_is_zero(&curve->A)); + ec_point_t P, Q; + + // Set P, Q to precomputed (X : 1) values + fp2_copy(&P.x, &BASIS_E0_PX); + fp2_copy(&Q.x, &BASIS_E0_QX); + fp2_set_one(&P.z); + fp2_set_one(&Q.z); + + // clear the power of two to get a point of order 2^f + for (int i = 0; i < TORSION_EVEN_POWER - f; i++) { + xDBL_E0(&P, &P); + xDBL_E0(&Q, &Q); + } + + // Set P, Q in the basis and compute x(P - Q) + copy_point(&PQ2->P, &P); + copy_point(&PQ2->Q, &Q); + difference_point(&PQ2->PmQ, &P, &Q, curve); +} + +// Computes a basis E[2^f] = where the point Q is above (0 : 0) +// and stores hints as an array for faster recomputation at a later point +uint8_t +ec_curve_to_basis_2f_to_hint(ec_basis_t *PQ2, ec_curve_t *curve, int f) +{ + // Normalise (A/C : 1) and ((A + 2)/4 : 1) + ec_normalize_curve_and_A24(curve); + + if (fp2_is_zero(&curve->A)) { + ec_basis_E0_2f(PQ2, curve, f); + return 0; + } + + uint8_t hint; + bool hint_A = fp2_is_square(&curve->A); + + // Compute the points P, Q + ec_point_t P, Q; + + if (!hint_A) { + // when A is NQR we allow x(P) to be a multiple n*A of A + hint = find_nA_x_coord(&P.x, curve, 1); + } else { + // when A is QR we instead have to find (1 + b^2) a NQR + // such that x(P) = -A / (1 + i*b) + hint = find_nqr_factor(&P.x, curve, 1); + } + + fp2_set_one(&P.z); + fp2_add(&Q.x, &curve->A, &P.x); + fp2_neg(&Q.x, &Q.x); + fp2_set_one(&Q.z); + + // clear out the odd cofactor to get a point of order 2^f + clear_cofactor_for_maximal_even_order(&P, curve, f); + clear_cofactor_for_maximal_even_order(&Q, curve, f); + + // compute PmQ, set PmQ to Q to ensure Q above (0,0) + difference_point(&PQ2->Q, &P, &Q, curve); + copy_point(&PQ2->P, &P); + copy_point(&PQ2->PmQ, &Q); + + // Finally, we compress hint_A and hint into a single bytes. + // We choose to set the LSB of hint to hint_A + assert(hint < 128); // We expect hint to be 7-bits in size + return (hint << 1) | hint_A; +} + +// Computes a basis E[2^f] = where the point Q is above (0 : 0) +// given the hints as an array for faster basis computation +int +ec_curve_to_basis_2f_from_hint(ec_basis_t *PQ2, ec_curve_t *curve, int f, const uint8_t hint) +{ + // Normalise (A/C : 1) and ((A + 2)/4 : 1) + ec_normalize_curve_and_A24(curve); + + if (fp2_is_zero(&curve->A)) { + ec_basis_E0_2f(PQ2, curve, f); + return 1; + } + + // The LSB of hint encodes whether A is a QR + // The remaining 7-bits are used to find a valid x(P) + bool hint_A = hint & 1; + uint8_t hint_P = hint >> 1; + + // Compute the points P, Q + ec_point_t P, Q; + + if (!hint_P) { + // When hint_P = 0 it means we did not find a point in 128 attempts + // this is very rare and we almost never expect to need this fallback + // In either case, we can start with b = 128 to skip testing the known + // values which will not work + if (!hint_A) { + find_nA_x_coord(&P.x, curve, 128); + } else { + find_nqr_factor(&P.x, curve, 128); + } + } else { + // Otherwise we use the hint to directly find x(P) based on hint_A + if (!hint_A) { + // when A is NQR, we have found n such that x(P) = n*A + fp2_mul_small(&P.x, &curve->A, hint_P); + } else { + // when A is QR we have found b such that (1 + b^2) is a NQR in + // Fp, so we must compute x(P) = -A / (1 + i*b) + fp_set_one(&P.x.re); + fp_set_small(&P.x.im, hint_P); + fp2_inv(&P.x); + fp2_mul(&P.x, &P.x, &curve->A); + fp2_neg(&P.x, &P.x); + } + } + fp2_set_one(&P.z); + +#ifndef NDEBUG + int passed = 1; + passed = is_on_curve(&P.x, curve); + passed &= !fp2_is_square(&P.x); + + if (!passed) + return 0; +#endif + + // set xQ to -xP - A + fp2_add(&Q.x, &curve->A, &P.x); + fp2_neg(&Q.x, &Q.x); + fp2_set_one(&Q.z); + + // clear out the odd cofactor to get a point of order 2^f + clear_cofactor_for_maximal_even_order(&P, curve, f); + clear_cofactor_for_maximal_even_order(&Q, curve, f); + + // compute PmQ, set PmQ to Q to ensure Q above (0,0) + difference_point(&PQ2->Q, &P, &Q, curve); + copy_point(&PQ2->P, &P); + copy_point(&PQ2->PmQ, &Q); + +#ifndef NDEBUG + passed &= test_basis_order_twof(PQ2, curve, f); + + if (!passed) + return 0; +#endif + + return 1; +} diff --git a/src/ec/ref/lvlx/biextension.c b/src/ec/ref/lvlx/biextension.c new file mode 100644 index 0000000..1df7ab9 --- /dev/null +++ b/src/ec/ref/lvlx/biextension.c @@ -0,0 +1,770 @@ +#include +#include +#include +#include + +/* + * We implement the biextension arithmetic by using the cubical torsor + * representation. For now only implement the 2^e-ladder. + * + * Warning: cubicalADD is off by a factor x4 with respect to the correct + * cubical arithmetic. This does not affect the Weil pairing or the Tate + * pairing over F_{p^2} (due to the final exponentiation), but would give + * the wrong result if we compute the Tate pairing over F_p. + */ + +// this would be exactly like xADD if PQ was 'antinormalised' as (1,z) +// Cost: 3M + 2S + 3a + 3s +// Note: if needed, cubicalDBL is simply xDBL_A24 normalized and +// costs 3M + 2S + 2a + 2s + +static void +cubicalADD(ec_point_t *R, const ec_point_t *P, const ec_point_t *Q, const fp2_t *ixPQ) +{ + fp2_t t0, t1, t2, t3; + + fp2_add(&t0, &P->x, &P->z); + fp2_sub(&t1, &P->x, &P->z); + fp2_add(&t2, &Q->x, &Q->z); + fp2_sub(&t3, &Q->x, &Q->z); + fp2_mul(&t0, &t0, &t3); + fp2_mul(&t1, &t1, &t2); + fp2_add(&t2, &t0, &t1); + fp2_sub(&t3, &t0, &t1); + fp2_sqr(&R->z, &t3); + fp2_sqr(&t2, &t2); + fp2_mul(&R->x, ixPQ, &t2); +} + +// Given cubical reps of P, Q and x(P - Q) = (1 : ixPQ) +// compute P + Q, [2]Q +// Cost: 6M + 4S + 4a + 4s +static void +cubicalDBLADD(ec_point_t *PpQ, + ec_point_t *QQ, + const ec_point_t *P, + const ec_point_t *Q, + const fp2_t *ixPQ, + const ec_point_t *A24) +{ + // A24 = (A+2C/4C: 1) + assert(fp2_is_one(&A24->z)); + + fp2_t t0, t1, t2, t3; + + fp2_add(&t0, &P->x, &P->z); + fp2_sub(&t1, &P->x, &P->z); + fp2_add(&PpQ->x, &Q->x, &Q->z); + fp2_sub(&t3, &Q->x, &Q->z); + fp2_sqr(&t2, &PpQ->x); + fp2_sqr(&QQ->z, &t3); + fp2_mul(&t0, &t0, &t3); + fp2_mul(&t1, &t1, &PpQ->x); + fp2_add(&PpQ->x, &t0, &t1); + fp2_sub(&t3, &t0, &t1); + fp2_sqr(&PpQ->z, &t3); + fp2_sqr(&PpQ->x, &PpQ->x); + fp2_mul(&PpQ->x, ixPQ, &PpQ->x); + fp2_sub(&t3, &t2, &QQ->z); + fp2_mul(&QQ->x, &t2, &QQ->z); + fp2_mul(&t0, &t3, &A24->x); + fp2_add(&t0, &t0, &QQ->z); + fp2_mul(&QQ->z, &t0, &t3); +} + +// iterative biextension doubling +static void +biext_ladder_2e(uint32_t e, + ec_point_t *PnQ, + ec_point_t *nQ, + const ec_point_t *PQ, + const ec_point_t *Q, + const fp2_t *ixP, + const ec_point_t *A24) +{ + copy_point(PnQ, PQ); + copy_point(nQ, Q); + for (uint32_t i = 0; i < e; i++) { + cubicalDBLADD(PnQ, nQ, PnQ, nQ, ixP, A24); + } +} + +// Compute the monodromy ratio X/Z above as a (X:Z) point to avoid a division +// We implicitly use (1,0) as a cubical point above 0_E +static void +point_ratio(ec_point_t *R, const ec_point_t *PnQ, const ec_point_t *nQ, const ec_point_t *P) +{ + // Sanity tests + assert(ec_is_zero(nQ)); + assert(ec_is_equal(PnQ, P)); + + fp2_mul(&R->x, &nQ->x, &P->x); + fp2_copy(&R->z, &PnQ->x); +} + +// Compute the cubical translation of P by a point of 2-torsion T +static void +translate(ec_point_t *P, const ec_point_t *T) +{ + // When we translate, the following three things can happen: + // T = (A : 0) then the translation of P should be P + // T = (0 : B) then the translation of P = (X : Z) should be (Z : X) + // Otherwise T = (A : B) and P translates to (AX - BZ : BX - AZ) + // We compute this in constant time by computing the generic case + // and then using constant time swaps. + fp2_t PX_new, PZ_new; + + { + fp2_t t0, t1; + + // PX_new = AX - BZ + fp2_mul(&t0, &T->x, &P->x); + fp2_mul(&t1, &T->z, &P->z); + fp2_sub(&PX_new, &t0, &t1); + + // PZ_new = BX - AZ + fp2_mul(&t0, &T->z, &P->x); + fp2_mul(&t1, &T->x, &P->z); + fp2_sub(&PZ_new, &t0, &t1); + } + + // When we have A zero we should return (Z : X) + uint32_t TA_is_zero = fp2_is_zero(&T->x); + fp2_select(&PX_new, &PX_new, &P->z, TA_is_zero); + fp2_select(&PZ_new, &PZ_new, &P->x, TA_is_zero); + + // When we have B zero we should return (X : Z) + uint32_t TB_is_zero = fp2_is_zero(&T->z); + fp2_select(&PX_new, &PX_new, &P->x, TB_is_zero); + fp2_select(&PZ_new, &PZ_new, &P->z, TB_is_zero); + + // Set the point to the desired result + fp2_copy(&P->x, &PX_new); + fp2_copy(&P->z, &PZ_new); +} + +// Compute the biextension monodromy g_P,Q^{2^g} (in level 1) via the +// cubical arithmetic of P+2^e Q. +// The suffix _i means that we are given 1/x(P) as parameter. Warning: to +// get meaningful result when using the monodromy to compute pairings, we +// need P, Q, PQ, A24 to be normalised (this is not strictly necessary, but +// care need to be taken when they are not normalised. Only handle the +// normalised case for now) +static void +monodromy_i(ec_point_t *R, const pairing_params_t *pairing_data, bool swap_PQ) +{ + fp2_t ixP; + ec_point_t P, Q, PnQ, nQ; + + // When we compute the Weil pairing we need both P + [2^e]Q and + // Q + [2^e]P which we can do easily with biext_ladder_2e() below + // we use a bool to decide wether to use Q, ixP or P, ixQ in the + // ladder and P or Q in translation. + if (!swap_PQ) { + copy_point(&P, &pairing_data->P); + copy_point(&Q, &pairing_data->Q); + fp2_copy(&ixP, &pairing_data->ixP); + } else { + copy_point(&P, &pairing_data->Q); + copy_point(&Q, &pairing_data->P); + fp2_copy(&ixP, &pairing_data->ixQ); + } + + // Compute the biextension ladder P + [2^e]Q + biext_ladder_2e(pairing_data->e - 1, &PnQ, &nQ, &pairing_data->PQ, &Q, &ixP, &pairing_data->A24); + translate(&PnQ, &nQ); + translate(&nQ, &nQ); + point_ratio(R, &PnQ, &nQ, &P); +} + +// Normalize the points and also store 1/x(P), 1/x(Q) +static void +cubical_normalization(pairing_params_t *pairing_data, const ec_point_t *P, const ec_point_t *Q) +{ + fp2_t t[4]; + fp2_copy(&t[0], &P->x); + fp2_copy(&t[1], &P->z); + fp2_copy(&t[2], &Q->x); + fp2_copy(&t[3], &Q->z); + fp2_batched_inv(t, 4); + + // Store PZ / PX and QZ / QX + fp2_mul(&pairing_data->ixP, &P->z, &t[0]); + fp2_mul(&pairing_data->ixQ, &Q->z, &t[2]); + + // Store x(P), x(Q) normalised to (X/Z : 1) + fp2_mul(&pairing_data->P.x, &P->x, &t[1]); + fp2_mul(&pairing_data->Q.x, &Q->x, &t[3]); + fp2_set_one(&pairing_data->P.z); + fp2_set_one(&pairing_data->Q.z); +} + +// Weil pairing, PQ should be P+Q in (X:Z) coordinates +// We assume the points are normalised correctly +static void +weil_n(fp2_t *r, const pairing_params_t *pairing_data) +{ + ec_point_t R0, R1; + monodromy_i(&R0, pairing_data, true); + monodromy_i(&R1, pairing_data, false); + + fp2_mul(r, &R0.x, &R1.z); + fp2_inv(r); + fp2_mul(r, r, &R0.z); + fp2_mul(r, r, &R1.x); +} + +// Weil pairing, PQ should be P+Q in (X:Z) coordinates +// Normalise the points and call the code above +// The code will crash (division by 0) if either P or Q is (0:1) +void +weil(fp2_t *r, uint32_t e, const ec_point_t *P, const ec_point_t *Q, const ec_point_t *PQ, ec_curve_t *E) +{ + pairing_params_t pairing_data; + // Construct the structure for the Weil pairing + // Set (PX/PZ : 1), (QX : QZ : 1), PZ/PX and QZ/QX + pairing_data.e = e; + cubical_normalization(&pairing_data, P, Q); + copy_point(&pairing_data.PQ, PQ); + + // Ensure the input curve has A24 normalised and store + // in a struct + ec_curve_normalize_A24(E); + copy_point(&pairing_data.A24, &E->A24); + + // Compute the Weil pairing e_(2^n)(P, Q) + weil_n(r, &pairing_data); +} + +// two helper functions for reducing the tate pairing +// clear_cofac clears (p + 1) // 2^f for an Fp2 value +void +clear_cofac(fp2_t *r, const fp2_t *a) +{ + digit_t exp = *p_cofactor_for_2f; + exp >>= 1; + + fp2_t x; + fp2_copy(&x, a); + fp2_copy(r, a); + + // removes cofac + while (exp > 0) { + fp2_sqr(r, r); + if (exp & 1) { + fp2_mul(r, r, &x); + } + exp >>= 1; + } +} + +// applies frobenius a + ib --> a - ib to an fp2 element +void +fp2_frob(fp2_t *out, const fp2_t *in) +{ + fp_copy(&(out->re), &(in->re)); + fp_neg(&(out->im), &(in->im)); +} + +// reduced Tate pairing, normalizes the points, assumes PQ is P+Q in (X:Z) +// coordinates. Computes 1/x(P) and 1/x(Q) for efficient cubical ladder +void +reduced_tate(fp2_t *r, uint32_t e, const ec_point_t *P, const ec_point_t *Q, const ec_point_t *PQ, ec_curve_t *E) +{ + uint32_t e_full = TORSION_EVEN_POWER; + uint32_t e_diff = e_full - e; + ec_point_t R; + pairing_params_t pairing_data; + + // Construct the structure for the Weil pairing + // Set (PX/PZ : 1), (QX : QZ : 1), PZ/PX and QZ/QX + pairing_data.e = e; + cubical_normalization(&pairing_data, P, Q); + copy_point(&pairing_data.PQ, PQ); + + // Ensure the input curve has A24 normalised and store + // in a struct + ec_curve_normalize_A24(E); + copy_point(&pairing_data.A24, &E->A24); + + monodromy_i(&R, &pairing_data, true); + + // we get unreduced tate as R.X, R.Z + // reduced tate is -(R.Z/R.X)^((p^2 - 1) div 2^f) + // we reuse R.X and R.Z to split reduction step ^(p-1) into frobenius and ^-1 + fp2_t frob, tmp; + fp2_copy(&tmp, &R.x); + fp2_frob(&frob, &R.x); + fp2_mul(&R.x, &R.z, &frob); + fp2_frob(&frob, &R.z); + fp2_mul(&R.z, &tmp, &frob); + fp2_inv(&R.x); + fp2_mul(r, &R.x, &R.z); + + clear_cofac(r, r); + // clear remaining 2^e_diff + for (uint32_t j = 0; j < e_diff; j++) { + fp2_sqr(r, r); + } +} + +// Functions to compute discrete logs by computing the Weil pairing of points +// followed by computing the dlog in Fp^2 +// (If we work with full order points, it would be faster to use the Tate +// pairings rather than the Weil pairings; this is not implemented yet) + +// recursive dlog function +static bool +fp2_dlog_2e_rec(digit_t *a, long len, fp2_t *pows_f, fp2_t *pows_g, long stacklen) +{ + if (len == 0) { + // *a = 0; + for (int i = 0; i < NWORDS_ORDER; i++) { + a[i] = 0; + } + return true; + } else if (len == 1) { + if (fp2_is_one(&pows_f[stacklen - 1])) { + // a = 0; + for (int i = 0; i < NWORDS_ORDER; i++) { + a[i] = 0; + } + for (int i = 0; i < stacklen - 1; ++i) { + fp2_sqr(&pows_g[i], &pows_g[i]); // new_g = g^2 + } + return true; + } else if (fp2_is_equal(&pows_f[stacklen - 1], &pows_g[stacklen - 1])) { + // a = 1; + a[0] = 1; + for (int i = 1; i < NWORDS_ORDER; i++) { + a[i] = 0; + } + for (int i = 0; i < stacklen - 1; ++i) { + fp2_mul(&pows_f[i], &pows_f[i], &pows_g[i]); // new_f = f*g + fp2_sqr(&pows_g[i], &pows_g[i]); // new_g = g^2 + } + return true; + } else { + return false; + } + } else { + long right = (double)len * 0.5; + long left = len - right; + pows_f[stacklen] = pows_f[stacklen - 1]; + pows_g[stacklen] = pows_g[stacklen - 1]; + for (int i = 0; i < left; i++) { + fp2_sqr(&pows_f[stacklen], &pows_f[stacklen]); + fp2_sqr(&pows_g[stacklen], &pows_g[stacklen]); + } + // uint32_t dlp1 = 0, dlp2 = 0; + digit_t dlp1[NWORDS_ORDER], dlp2[NWORDS_ORDER]; + bool ok; + ok = fp2_dlog_2e_rec(dlp1, right, pows_f, pows_g, stacklen + 1); + if (!ok) + return false; + ok = fp2_dlog_2e_rec(dlp2, left, pows_f, pows_g, stacklen); + if (!ok) + return false; + // a = dlp1 + 2^right * dlp2 + multiple_mp_shiftl(dlp2, right, NWORDS_ORDER); + mp_add(a, dlp2, dlp1, NWORDS_ORDER); + + return true; + } +} + +// compute DLP: compute scal such that f = g^scal with f, 1/g as input +static bool +fp2_dlog_2e(digit_t *scal, const fp2_t *f, const fp2_t *g_inverse, int e) +{ + long log, len = e; + for (log = 0; len > 1; len >>= 1) + log++; + log += 1; + + fp2_t pows_f[log], pows_g[log]; + pows_f[0] = *f; + pows_g[0] = *g_inverse; + + for (int i = 0; i < NWORDS_ORDER; i++) { + scal[i] = 0; + } + + bool ok = fp2_dlog_2e_rec(scal, e, pows_f, pows_g, 1); + assert(ok); + + return ok; +} + +// Normalize the bases (P, Q), (R, S) and store their inverse +// and additionally normalise the curve to (A/C : 1) +static void +cubical_normalization_dlog(pairing_dlog_params_t *pairing_dlog_data, ec_curve_t *curve) +{ + fp2_t t[11]; + ec_basis_t *PQ = &pairing_dlog_data->PQ; + ec_basis_t *RS = &pairing_dlog_data->RS; + fp2_copy(&t[0], &PQ->P.x); + fp2_copy(&t[1], &PQ->P.z); + fp2_copy(&t[2], &PQ->Q.x); + fp2_copy(&t[3], &PQ->Q.z); + fp2_copy(&t[4], &PQ->PmQ.x); + fp2_copy(&t[5], &PQ->PmQ.z); + fp2_copy(&t[6], &RS->P.x); + fp2_copy(&t[7], &RS->P.z); + fp2_copy(&t[8], &RS->Q.x); + fp2_copy(&t[9], &RS->Q.z); + fp2_copy(&t[10], &curve->C); + + fp2_batched_inv(t, 11); + + fp2_mul(&pairing_dlog_data->ixP, &PQ->P.z, &t[0]); + fp2_mul(&PQ->P.x, &PQ->P.x, &t[1]); + fp2_set_one(&PQ->P.z); + + fp2_mul(&pairing_dlog_data->ixQ, &PQ->Q.z, &t[2]); + fp2_mul(&PQ->Q.x, &PQ->Q.x, &t[3]); + fp2_set_one(&PQ->Q.z); + + fp2_mul(&PQ->PmQ.x, &PQ->PmQ.x, &t[5]); + fp2_set_one(&PQ->PmQ.z); + + fp2_mul(&pairing_dlog_data->ixR, &RS->P.z, &t[6]); + fp2_mul(&RS->P.x, &RS->P.x, &t[7]); + fp2_set_one(&RS->P.z); + + fp2_mul(&pairing_dlog_data->ixS, &RS->Q.z, &t[8]); + fp2_mul(&RS->Q.x, &RS->Q.x, &t[9]); + fp2_set_one(&RS->Q.z); + + fp2_mul(&curve->A, &curve->A, &t[10]); + fp2_set_one(&curve->C); +} + +// Given two bases and basis = compute +// x(P - R), x(P - S), x(R - Q), x(S - Q) +static void +compute_difference_points(pairing_dlog_params_t *pairing_dlog_data, ec_curve_t *curve) +{ + jac_point_t xyP, xyQ, xyR, xyS, temp; + + // lifting the two basis points, assumes that x(P) and x(R) + // and the curve itself are normalised to (X : 1) + lift_basis_normalized(&xyP, &xyQ, &pairing_dlog_data->PQ, curve); + lift_basis_normalized(&xyR, &xyS, &pairing_dlog_data->RS, curve); + + // computation of the differences + // x(P - R) + jac_neg(&temp, &xyR); + ADD(&temp, &temp, &xyP, curve); + jac_to_xz(&pairing_dlog_data->diff.PmR, &temp); + + // x(P - S) + jac_neg(&temp, &xyS); + ADD(&temp, &temp, &xyP, curve); + jac_to_xz(&pairing_dlog_data->diff.PmS, &temp); + + // x(R - Q) + jac_neg(&temp, &xyQ); + ADD(&temp, &temp, &xyR, curve); + jac_to_xz(&pairing_dlog_data->diff.RmQ, &temp); + + // x(S - Q) + jac_neg(&temp, &xyQ); + ADD(&temp, &temp, &xyS, curve); + jac_to_xz(&pairing_dlog_data->diff.SmQ, &temp); +} + +// Inline all the Weil pairing computations needed for ec_dlog_2_weil +static void +weil_dlog(digit_t *r1, digit_t *r2, digit_t *s1, digit_t *s2, pairing_dlog_params_t *pairing_dlog_data) +{ + + ec_point_t nP, nQ, nR, nS, nPQ, PnQ, nPR, PnR, nPS, PnS, nRQ, RnQ, nSQ, SnQ; + + copy_point(&nP, &pairing_dlog_data->PQ.P); + copy_point(&nQ, &pairing_dlog_data->PQ.Q); + copy_point(&nR, &pairing_dlog_data->RS.P); + copy_point(&nS, &pairing_dlog_data->RS.Q); + copy_point(&nPQ, &pairing_dlog_data->PQ.PmQ); + copy_point(&PnQ, &pairing_dlog_data->PQ.PmQ); + copy_point(&nPR, &pairing_dlog_data->diff.PmR); + copy_point(&nPS, &pairing_dlog_data->diff.PmS); + copy_point(&PnR, &pairing_dlog_data->diff.PmR); + copy_point(&PnS, &pairing_dlog_data->diff.PmS); + copy_point(&nRQ, &pairing_dlog_data->diff.RmQ); + copy_point(&nSQ, &pairing_dlog_data->diff.SmQ); + copy_point(&RnQ, &pairing_dlog_data->diff.RmQ); + copy_point(&SnQ, &pairing_dlog_data->diff.SmQ); + + for (uint32_t i = 0; i < pairing_dlog_data->e - 1; i++) { + cubicalADD(&nPQ, &nPQ, &nP, &pairing_dlog_data->ixQ); + cubicalADD(&nPR, &nPR, &nP, &pairing_dlog_data->ixR); + cubicalDBLADD(&nPS, &nP, &nPS, &nP, &pairing_dlog_data->ixS, &pairing_dlog_data->A24); + + cubicalADD(&PnQ, &PnQ, &nQ, &pairing_dlog_data->ixP); + cubicalADD(&RnQ, &RnQ, &nQ, &pairing_dlog_data->ixR); + cubicalDBLADD(&SnQ, &nQ, &SnQ, &nQ, &pairing_dlog_data->ixS, &pairing_dlog_data->A24); + + cubicalADD(&PnR, &PnR, &nR, &pairing_dlog_data->ixP); + cubicalDBLADD(&nRQ, &nR, &nRQ, &nR, &pairing_dlog_data->ixQ, &pairing_dlog_data->A24); + + cubicalADD(&PnS, &PnS, &nS, &pairing_dlog_data->ixP); + cubicalDBLADD(&nSQ, &nS, &nSQ, &nS, &pairing_dlog_data->ixQ, &pairing_dlog_data->A24); + } + + // weil(&w0,e,&PQ->P,&PQ->Q,&PQ->PmQ,&A24); + translate(&nPQ, &nP); + translate(&nPR, &nP); + translate(&nPS, &nP); + translate(&PnQ, &nQ); + translate(&RnQ, &nQ); + translate(&SnQ, &nQ); + translate(&PnR, &nR); + translate(&nRQ, &nR); + translate(&PnS, &nS); + translate(&nSQ, &nS); + + translate(&nP, &nP); + translate(&nQ, &nQ); + translate(&nR, &nR); + translate(&nS, &nS); + + // computation of the reference weil pairing + ec_point_t T0, T1; + fp2_t w1[5], w2[5]; + + // e(P, Q) = w0 + point_ratio(&T0, &nPQ, &nP, &pairing_dlog_data->PQ.Q); + point_ratio(&T1, &PnQ, &nQ, &pairing_dlog_data->PQ.P); + // For the first element we need it's inverse for + // fp2_dlog_2e so we swap w1 and w2 here to save inversions + fp2_mul(&w2[0], &T0.x, &T1.z); + fp2_mul(&w1[0], &T1.x, &T0.z); + + // e(P,R) = w0^r2 + point_ratio(&T0, &nPR, &nP, &pairing_dlog_data->RS.P); + point_ratio(&T1, &PnR, &nR, &pairing_dlog_data->PQ.P); + fp2_mul(&w1[1], &T0.x, &T1.z); + fp2_mul(&w2[1], &T1.x, &T0.z); + + // e(R,Q) = w0^r1 + point_ratio(&T0, &nRQ, &nR, &pairing_dlog_data->PQ.Q); + point_ratio(&T1, &RnQ, &nQ, &pairing_dlog_data->RS.P); + fp2_mul(&w1[2], &T0.x, &T1.z); + fp2_mul(&w2[2], &T1.x, &T0.z); + + // e(P,S) = w0^s2 + point_ratio(&T0, &nPS, &nP, &pairing_dlog_data->RS.Q); + point_ratio(&T1, &PnS, &nS, &pairing_dlog_data->PQ.P); + fp2_mul(&w1[3], &T0.x, &T1.z); + fp2_mul(&w2[3], &T1.x, &T0.z); + + // e(S,Q) = w0^s1 + point_ratio(&T0, &nSQ, &nS, &pairing_dlog_data->PQ.Q); + point_ratio(&T1, &SnQ, &nQ, &pairing_dlog_data->RS.Q); + fp2_mul(&w1[4], &T0.x, &T1.z); + fp2_mul(&w2[4], &T1.x, &T0.z); + + fp2_batched_inv(w1, 5); + for (int i = 0; i < 5; i++) { + fp2_mul(&w1[i], &w1[i], &w2[i]); + } + + fp2_dlog_2e(r2, &w1[1], &w1[0], pairing_dlog_data->e); + fp2_dlog_2e(r1, &w1[2], &w1[0], pairing_dlog_data->e); + fp2_dlog_2e(s2, &w1[3], &w1[0], pairing_dlog_data->e); + fp2_dlog_2e(s1, &w1[4], &w1[0], pairing_dlog_data->e); +} + +void +ec_dlog_2_weil(digit_t *r1, + digit_t *r2, + digit_t *s1, + digit_t *s2, + ec_basis_t *PQ, + const ec_basis_t *RS, + ec_curve_t *curve, + int e) +{ + assert(test_point_order_twof(&PQ->Q, curve, e)); + + // precomputing the correct curve data + ec_curve_normalize_A24(curve); + + pairing_dlog_params_t pairing_dlog_data; + pairing_dlog_data.e = e; + pairing_dlog_data.PQ = *PQ; + pairing_dlog_data.RS = *RS; + pairing_dlog_data.A24 = curve->A24; + + cubical_normalization_dlog(&pairing_dlog_data, curve); + compute_difference_points(&pairing_dlog_data, curve); + + weil_dlog(r1, r2, s1, s2, &pairing_dlog_data); + +#ifndef NDEBUG + ec_point_t test; + ec_biscalar_mul(&test, r1, r2, e, PQ, curve); + // R = [r1]P + [r2]Q + assert(ec_is_equal(&test, &RS->P)); + ec_biscalar_mul(&test, s1, s2, e, PQ, curve); + // S = [s1]P + [s2]Q + assert(ec_is_equal(&test, &RS->Q)); +#endif +} + +// Inline all the Tate pairing computations needed for ec_dlog_2_weil +// including reduction, assumes a bases PQ of full E[2^e_full] torsion +// and a bases RS of smaller E[2^e] torsion +static void +tate_dlog_partial(digit_t *r1, digit_t *r2, digit_t *s1, digit_t *s2, pairing_dlog_params_t *pairing_dlog_data) +{ + + uint32_t e_full = TORSION_EVEN_POWER; + uint32_t e_diff = e_full - pairing_dlog_data->e; + + ec_point_t nP, nQ, nR, nS, nPQ, PnR, PnS, nRQ, nSQ; + + copy_point(&nP, &pairing_dlog_data->PQ.P); + copy_point(&nQ, &pairing_dlog_data->PQ.Q); + copy_point(&nR, &pairing_dlog_data->RS.P); + copy_point(&nS, &pairing_dlog_data->RS.Q); + copy_point(&nPQ, &pairing_dlog_data->PQ.PmQ); + copy_point(&PnR, &pairing_dlog_data->diff.PmR); + copy_point(&PnS, &pairing_dlog_data->diff.PmS); + copy_point(&nRQ, &pairing_dlog_data->diff.RmQ); + copy_point(&nSQ, &pairing_dlog_data->diff.SmQ); + + for (uint32_t i = 0; i < e_full - 1; i++) { + cubicalDBLADD(&nPQ, &nP, &nPQ, &nP, &pairing_dlog_data->ixQ, &pairing_dlog_data->A24); + } + + for (uint32_t i = 0; i < pairing_dlog_data->e - 1; i++) { + cubicalADD(&PnR, &PnR, &nR, &pairing_dlog_data->ixP); + cubicalDBLADD(&nRQ, &nR, &nRQ, &nR, &pairing_dlog_data->ixQ, &pairing_dlog_data->A24); + + cubicalADD(&PnS, &PnS, &nS, &pairing_dlog_data->ixP); + cubicalDBLADD(&nSQ, &nS, &nSQ, &nS, &pairing_dlog_data->ixQ, &pairing_dlog_data->A24); + } + + translate(&nPQ, &nP); + translate(&PnR, &nR); + translate(&nRQ, &nR); + translate(&PnS, &nS); + translate(&nSQ, &nS); + + translate(&nP, &nP); + translate(&nQ, &nQ); + translate(&nR, &nR); + translate(&nS, &nS); + + // computation of the reference Tate pairing + ec_point_t T0; + fp2_t w1[5], w2[5]; + + // t(P, Q)^(2^e_diff) = w0 + point_ratio(&T0, &nPQ, &nP, &pairing_dlog_data->PQ.Q); + fp2_copy(&w1[0], &T0.x); + fp2_copy(&w2[0], &T0.z); + + // t(R,P) = w0^r2 + point_ratio(&T0, &PnR, &nR, &pairing_dlog_data->PQ.P); + fp2_copy(&w1[1], &T0.x); + fp2_copy(&w2[1], &T0.z); + + // t(R,Q) = w0^r1 + point_ratio(&T0, &nRQ, &nR, &pairing_dlog_data->PQ.Q); + fp2_copy(&w2[2], &T0.x); + fp2_copy(&w1[2], &T0.z); + + // t(S,P) = w0^s2 + point_ratio(&T0, &PnS, &nS, &pairing_dlog_data->PQ.P); + fp2_copy(&w1[3], &T0.x); + fp2_copy(&w2[3], &T0.z); + + // t(S,Q) = w0^s1 + point_ratio(&T0, &nSQ, &nS, &pairing_dlog_data->PQ.Q); + fp2_copy(&w2[4], &T0.x); + fp2_copy(&w1[4], &T0.z); + + // batched reduction using projective representation + for (int i = 0; i < 5; i++) { + fp2_t frob, tmp; + fp2_copy(&tmp, &w1[i]); + // inline frobenius for ^p + // multiply by inverse to get ^(p-1) + fp2_frob(&frob, &w1[i]); + fp2_mul(&w1[i], &w2[i], &frob); + + // repeat for denom + fp2_frob(&frob, &w2[i]); + fp2_mul(&w2[i], &tmp, &frob); + } + + // batched normalization + fp2_batched_inv(w2, 5); + for (int i = 0; i < 5; i++) { + fp2_mul(&w1[i], &w1[i], &w2[i]); + } + + for (int i = 0; i < 5; i++) { + clear_cofac(&w1[i], &w1[i]); + + // removes 2^e_diff + for (uint32_t j = 0; j < e_diff; j++) { + fp2_sqr(&w1[i], &w1[i]); + } + } + + fp2_dlog_2e(r2, &w1[1], &w1[0], pairing_dlog_data->e); + fp2_dlog_2e(r1, &w1[2], &w1[0], pairing_dlog_data->e); + fp2_dlog_2e(s2, &w1[3], &w1[0], pairing_dlog_data->e); + fp2_dlog_2e(s1, &w1[4], &w1[0], pairing_dlog_data->e); +} + +void +ec_dlog_2_tate(digit_t *r1, + digit_t *r2, + digit_t *s1, + digit_t *s2, + const ec_basis_t *PQ, + const ec_basis_t *RS, + ec_curve_t *curve, + int e) +{ + // assume PQ is a full torsion basis + // returns a, b, c, d such that R = [a]P + [b]Q, S = [c]P + [d]Q + +#ifndef NDEBUG + int e_full = TORSION_EVEN_POWER; + int e_diff = e_full - e; +#endif + assert(test_basis_order_twof(PQ, curve, e_full)); + + // precomputing the correct curve data + ec_curve_normalize_A24(curve); + + pairing_dlog_params_t pairing_dlog_data; + pairing_dlog_data.e = e; + pairing_dlog_data.PQ = *PQ; + pairing_dlog_data.RS = *RS; + pairing_dlog_data.A24 = curve->A24; + + cubical_normalization_dlog(&pairing_dlog_data, curve); + compute_difference_points(&pairing_dlog_data, curve); + tate_dlog_partial(r1, r2, s1, s2, &pairing_dlog_data); + +#ifndef NDEBUG + ec_point_t test; + ec_biscalar_mul(&test, r1, r2, e, PQ, curve); + ec_dbl_iter(&test, e_diff, &test, curve); + // R = [r1]P + [r2]Q + assert(ec_is_equal(&test, &RS->P)); + + ec_biscalar_mul(&test, s1, s2, e, PQ, curve); + ec_dbl_iter(&test, e_diff, &test, curve); + // S = [s1]P + [s2]Q + assert(ec_is_equal(&test, &RS->Q)); +#endif +} diff --git a/src/ec/ref/lvlx/ec.c b/src/ec/ref/lvlx/ec.c new file mode 100644 index 0000000..be4e4e5 --- /dev/null +++ b/src/ec/ref/lvlx/ec.c @@ -0,0 +1,665 @@ +#include +#include +#include +#include + +void +ec_point_init(ec_point_t *P) +{ // Initialize point as identity element (1:0) + fp2_set_one(&(P->x)); + fp2_set_zero(&(P->z)); +} + +void +ec_curve_init(ec_curve_t *E) +{ // Initialize the curve struct + // Initialize the constants + fp2_set_zero(&(E->A)); + fp2_set_one(&(E->C)); + + // Initialize the point (A+2 : 4C) + ec_point_init(&(E->A24)); + + // Set the bool to be false by default + E->is_A24_computed_and_normalized = false; +} + +void +select_point(ec_point_t *Q, const ec_point_t *P1, const ec_point_t *P2, const digit_t option) +{ // Select points in constant time + // If option = 0 then Q <- P1, else if option = 0xFF...FF then Q <- P2 + fp2_select(&(Q->x), &(P1->x), &(P2->x), option); + fp2_select(&(Q->z), &(P1->z), &(P2->z), option); +} + +void +cswap_points(ec_point_t *P, ec_point_t *Q, const digit_t option) +{ // Swap points in constant time + // If option = 0 then P <- P and Q <- Q, else if option = 0xFF...FF then P <- Q and Q <- P + fp2_cswap(&(P->x), &(Q->x), option); + fp2_cswap(&(P->z), &(Q->z), option); +} + +void +ec_normalize_point(ec_point_t *P) +{ + fp2_inv(&P->z); + fp2_mul(&P->x, &P->x, &P->z); + fp2_set_one(&(P->z)); +} + +void +ec_normalize_curve(ec_curve_t *E) +{ + fp2_inv(&E->C); + fp2_mul(&E->A, &E->A, &E->C); + fp2_set_one(&E->C); +} + +void +ec_curve_normalize_A24(ec_curve_t *E) +{ + if (!E->is_A24_computed_and_normalized) { + AC_to_A24(&E->A24, E); + ec_normalize_point(&E->A24); + E->is_A24_computed_and_normalized = true; + } + assert(fp2_is_one(&E->A24.z)); +} + +void +ec_normalize_curve_and_A24(ec_curve_t *E) +{ // Neither the curve or A24 are guaranteed to be normalized. + // First we normalize (A/C : 1) and conditionally compute + if (!fp2_is_one(&E->C)) { + ec_normalize_curve(E); + } + + if (!E->is_A24_computed_and_normalized) { + // Now compute A24 = ((A + 2) / 4 : 1) + fp2_add_one(&E->A24.x, &E->A); // re(A24.x) = re(A) + 1 + fp2_add_one(&E->A24.x, &E->A24.x); // re(A24.x) = re(A) + 2 + fp_copy(&E->A24.x.im, &E->A.im); // im(A24.x) = im(A) + + fp2_half(&E->A24.x, &E->A24.x); // (A + 2) / 2 + fp2_half(&E->A24.x, &E->A24.x); // (A + 2) / 4 + fp2_set_one(&E->A24.z); + + E->is_A24_computed_and_normalized = true; + } +} + +uint32_t +ec_is_zero(const ec_point_t *P) +{ + return fp2_is_zero(&P->z); +} + +uint32_t +ec_has_zero_coordinate(const ec_point_t *P) +{ + return fp2_is_zero(&P->x) | fp2_is_zero(&P->z); +} + +uint32_t +ec_is_equal(const ec_point_t *P, const ec_point_t *Q) +{ // Evaluate if two points in Montgomery coordinates (X:Z) are equal + // Returns 0xFFFFFFFF (true) if P=Q, 0 (false) otherwise + fp2_t t0, t1; + + // Check if P, Q are the points at infinity + uint32_t l_zero = ec_is_zero(P); + uint32_t r_zero = ec_is_zero(Q); + + // Check if PX * QZ = QX * PZ + fp2_mul(&t0, &P->x, &Q->z); + fp2_mul(&t1, &P->z, &Q->x); + uint32_t lr_equal = fp2_is_equal(&t0, &t1); + + // Points are equal if + // - Both are zero, or + // - neither are zero AND PX * QZ = QX * PZ + return (l_zero & r_zero) | (~l_zero & ~r_zero * lr_equal); +} + +uint32_t +ec_is_two_torsion(const ec_point_t *P, const ec_curve_t *E) +{ + if (ec_is_zero(P)) + return 0; + + uint32_t x_is_zero, tmp_is_zero; + fp2_t t0, t1, t2; + fp2_add(&t0, &P->x, &P->z); + fp2_sqr(&t0, &t0); + fp2_sub(&t1, &P->x, &P->z); + fp2_sqr(&t1, &t1); + fp2_sub(&t2, &t0, &t1); + fp2_add(&t1, &t0, &t1); + fp2_mul(&t2, &t2, &E->A); + fp2_mul(&t1, &t1, &E->C); + fp2_add(&t1, &t1, &t1); + fp2_add(&t0, &t1, &t2); // 4 (CX^2+CZ^2+AXZ) + + x_is_zero = fp2_is_zero(&P->x); + tmp_is_zero = fp2_is_zero(&t0); + + // two torsion if x or x^2 + Ax + 1 is zero + return x_is_zero | tmp_is_zero; +} + +uint32_t +ec_is_four_torsion(const ec_point_t *P, const ec_curve_t *E) +{ + ec_point_t test; + xDBL_A24(&test, P, &E->A24, E->is_A24_computed_and_normalized); + return ec_is_two_torsion(&test, E); +} + +uint32_t +ec_is_basis_four_torsion(const ec_basis_t *B, const ec_curve_t *E) +{ // Check if basis points (P, Q) form a full 2^t-basis + ec_point_t P2, Q2; + xDBL_A24(&P2, &B->P, &E->A24, E->is_A24_computed_and_normalized); + xDBL_A24(&Q2, &B->Q, &E->A24, E->is_A24_computed_and_normalized); + return (ec_is_two_torsion(&P2, E) & ec_is_two_torsion(&Q2, E) & ~ec_is_equal(&P2, &Q2)); +} + +int +ec_curve_verify_A(const fp2_t *A) +{ // Verify the Montgomery coefficient A is valid (A^2-4 \ne 0) + // Return 1 if curve is valid, 0 otherwise + fp2_t t; + fp2_set_one(&t); + fp_add(&t.re, &t.re, &t.re); // t=2 + if (fp2_is_equal(A, &t)) + return 0; + fp_neg(&t.re, &t.re); // t=-2 + if (fp2_is_equal(A, &t)) + return 0; + return 1; +} + +int +ec_curve_init_from_A(ec_curve_t *E, const fp2_t *A) +{ // Initialize the curve from the A coefficient and check it is valid + // Return 1 if curve is valid, 0 otherwise + ec_curve_init(E); + fp2_copy(&E->A, A); // Set A + return ec_curve_verify_A(A); +} + +void +ec_j_inv(fp2_t *j_inv, const ec_curve_t *curve) +{ // j-invariant computation for Montgommery coefficient A2=(A+2C:4C) + fp2_t t0, t1; + + fp2_sqr(&t1, &curve->C); + fp2_sqr(j_inv, &curve->A); + fp2_add(&t0, &t1, &t1); + fp2_sub(&t0, j_inv, &t0); + fp2_sub(&t0, &t0, &t1); + fp2_sub(j_inv, &t0, &t1); + fp2_sqr(&t1, &t1); + fp2_mul(j_inv, j_inv, &t1); + fp2_add(&t0, &t0, &t0); + fp2_add(&t0, &t0, &t0); + fp2_sqr(&t1, &t0); + fp2_mul(&t0, &t0, &t1); + fp2_add(&t0, &t0, &t0); + fp2_add(&t0, &t0, &t0); + fp2_inv(j_inv); + fp2_mul(j_inv, &t0, j_inv); +} + +void +xDBL_E0(ec_point_t *Q, const ec_point_t *P) +{ // Doubling of a Montgomery point in projective coordinates (X:Z) on the curve E0 with (A:C) = (0:1). + // Input: projective Montgomery x-coordinates P = (XP:ZP), where xP=XP/ZP, and Montgomery curve constants (A:C) = (0:1). + // Output: projective Montgomery x-coordinates Q <- 2*P = (XQ:ZQ) such that x(2P)=XQ/ZQ. + fp2_t t0, t1, t2; + + fp2_add(&t0, &P->x, &P->z); + fp2_sqr(&t0, &t0); + fp2_sub(&t1, &P->x, &P->z); + fp2_sqr(&t1, &t1); + fp2_sub(&t2, &t0, &t1); + fp2_add(&t1, &t1, &t1); + fp2_mul(&Q->x, &t0, &t1); + fp2_add(&Q->z, &t1, &t2); + fp2_mul(&Q->z, &Q->z, &t2); +} + +void +xDBL(ec_point_t *Q, const ec_point_t *P, const ec_point_t *AC) +{ // Doubling of a Montgomery point in projective coordinates (X:Z). Computation of coefficient values A+2C and 4C + // on-the-fly. + // Input: projective Montgomery x-coordinates P = (XP:ZP), where xP=XP/ZP, and Montgomery curve constants (A:C). + // Output: projective Montgomery x-coordinates Q <- 2*P = (XQ:ZQ) such that x(2P)=XQ/ZQ. + fp2_t t0, t1, t2, t3; + + fp2_add(&t0, &P->x, &P->z); + fp2_sqr(&t0, &t0); + fp2_sub(&t1, &P->x, &P->z); + fp2_sqr(&t1, &t1); + fp2_sub(&t2, &t0, &t1); + fp2_add(&t3, &AC->z, &AC->z); + fp2_mul(&t1, &t1, &t3); + fp2_add(&t1, &t1, &t1); + fp2_mul(&Q->x, &t0, &t1); + fp2_add(&t0, &t3, &AC->x); + fp2_mul(&t0, &t0, &t2); + fp2_add(&t0, &t0, &t1); + fp2_mul(&Q->z, &t0, &t2); +} + +void +xDBL_A24(ec_point_t *Q, const ec_point_t *P, const ec_point_t *A24, const bool A24_normalized) +{ // Doubling of a Montgomery point in projective coordinates (X:Z). + // Input: projective Montgomery x-coordinates P = (XP:ZP), where xP=XP/ZP, and + // the Montgomery curve constants A24 = (A+2C:4C) (or A24 = (A+2C/4C:1) if normalized). + // Output: projective Montgomery x-coordinates Q <- 2*P = (XQ:ZQ) such that x(2P)=XQ/ZQ. + fp2_t t0, t1, t2; + + fp2_add(&t0, &P->x, &P->z); + fp2_sqr(&t0, &t0); + fp2_sub(&t1, &P->x, &P->z); + fp2_sqr(&t1, &t1); + fp2_sub(&t2, &t0, &t1); + if (!A24_normalized) + fp2_mul(&t1, &t1, &A24->z); + fp2_mul(&Q->x, &t0, &t1); + fp2_mul(&t0, &t2, &A24->x); + fp2_add(&t0, &t0, &t1); + fp2_mul(&Q->z, &t0, &t2); +} + +void +xADD(ec_point_t *R, const ec_point_t *P, const ec_point_t *Q, const ec_point_t *PQ) +{ // Differential addition of Montgomery points in projective coordinates (X:Z). + // Input: projective Montgomery points P=(XP:ZP) and Q=(XQ:ZQ) such that xP=XP/ZP and xQ=XQ/ZQ, and difference + // PQ=P-Q=(XPQ:ZPQ). + // Output: projective Montgomery point R <- P+Q = (XR:ZR) such that x(P+Q)=XR/ZR. + fp2_t t0, t1, t2, t3; + + fp2_add(&t0, &P->x, &P->z); + fp2_sub(&t1, &P->x, &P->z); + fp2_add(&t2, &Q->x, &Q->z); + fp2_sub(&t3, &Q->x, &Q->z); + fp2_mul(&t0, &t0, &t3); + fp2_mul(&t1, &t1, &t2); + fp2_add(&t2, &t0, &t1); + fp2_sub(&t3, &t0, &t1); + fp2_sqr(&t2, &t2); + fp2_sqr(&t3, &t3); + fp2_mul(&t2, &PQ->z, &t2); + fp2_mul(&R->z, &PQ->x, &t3); + fp2_copy(&R->x, &t2); +} + +void +xDBLADD(ec_point_t *R, + ec_point_t *S, + const ec_point_t *P, + const ec_point_t *Q, + const ec_point_t *PQ, + const ec_point_t *A24, + const bool A24_normalized) +{ // Simultaneous doubling and differential addition. + // Input: projective Montgomery points P=(XP:ZP) and Q=(XQ:ZQ) such that xP=XP/ZP and xQ=XQ/ZQ, the difference + // PQ=P-Q=(XPQ:ZPQ), and the Montgomery curve constants A24 = (A+2C:4C) (or A24 = (A+2C/4C:1) if normalized). + // Output: projective Montgomery points R <- 2*P = (XR:ZR) such that x(2P)=XR/ZR, and S <- P+Q = (XS:ZS) such that = + // x(Q+P)=XS/ZS. + fp2_t t0, t1, t2; + + fp2_add(&t0, &P->x, &P->z); + fp2_sub(&t1, &P->x, &P->z); + fp2_sqr(&R->x, &t0); + fp2_sub(&t2, &Q->x, &Q->z); + fp2_add(&S->x, &Q->x, &Q->z); + fp2_mul(&t0, &t0, &t2); + fp2_sqr(&R->z, &t1); + fp2_mul(&t1, &t1, &S->x); + fp2_sub(&t2, &R->x, &R->z); + if (!A24_normalized) + fp2_mul(&R->z, &R->z, &A24->z); + fp2_mul(&R->x, &R->x, &R->z); + fp2_mul(&S->x, &A24->x, &t2); + fp2_sub(&S->z, &t0, &t1); + fp2_add(&R->z, &R->z, &S->x); + fp2_add(&S->x, &t0, &t1); + fp2_mul(&R->z, &R->z, &t2); + fp2_sqr(&S->z, &S->z); + fp2_sqr(&S->x, &S->x); + fp2_mul(&S->z, &S->z, &PQ->x); + fp2_mul(&S->x, &S->x, &PQ->z); +} + +void +xMUL(ec_point_t *Q, const ec_point_t *P, const digit_t *k, const int kbits, const ec_curve_t *curve) +{ // The Montgomery ladder + // Input: projective Montgomery point P=(XP:ZP) such that xP=XP/ZP, a scalar k of bitlength kbits, and + // the Montgomery curve constants (A:C) (or A24 = (A+2C/4C:1) if normalized). + // Output: projective Montgomery points Q <- k*P = (XQ:ZQ) such that x(k*P)=XQ/ZQ. + ec_point_t R0, R1, A24; + digit_t mask; + unsigned int bit, prevbit = 0, swap; + + if (!curve->is_A24_computed_and_normalized) { + // Computation of A24=(A+2C:4C) + fp2_add(&A24.x, &curve->C, &curve->C); + fp2_add(&A24.z, &A24.x, &A24.x); + fp2_add(&A24.x, &A24.x, &curve->A); + } else { + fp2_copy(&A24.x, &curve->A24.x); + fp2_copy(&A24.z, &curve->A24.z); + // Assert A24 has been normalised + assert(fp2_is_one(&A24.z)); + } + + // R0 <- (1:0), R1 <- P + ec_point_init(&R0); + fp2_copy(&R1.x, &P->x); + fp2_copy(&R1.z, &P->z); + + // Main loop + for (int i = kbits - 1; i >= 0; i--) { + bit = (k[i >> LOG2RADIX] >> (i & (RADIX - 1))) & 1; + swap = bit ^ prevbit; + prevbit = bit; + mask = 0 - (digit_t)swap; + + cswap_points(&R0, &R1, mask); + xDBLADD(&R0, &R1, &R0, &R1, P, &A24, true); + } + swap = 0 ^ prevbit; + mask = 0 - (digit_t)swap; + cswap_points(&R0, &R1, mask); + + fp2_copy(&Q->x, &R0.x); + fp2_copy(&Q->z, &R0.z); +} + +int +xDBLMUL(ec_point_t *S, + const ec_point_t *P, + const digit_t *k, + const ec_point_t *Q, + const digit_t *l, + const ec_point_t *PQ, + const int kbits, + const ec_curve_t *curve) +{ // The Montgomery biladder + // Input: projective Montgomery points P=(XP:ZP) and Q=(XQ:ZQ) such that xP=XP/ZP and xQ=XQ/ZQ, scalars k and l of + // bitlength kbits, the difference PQ=P-Q=(XPQ:ZPQ), and the Montgomery curve constants (A:C). + // Output: projective Montgomery point S <- k*P + l*Q = (XS:ZS) such that x(k*P + l*Q)=XS/ZS. + + int i, A_is_zero; + digit_t evens, mevens, bitk0, bitl0, maskk, maskl, temp, bs1_ip1, bs2_ip1, bs1_i, bs2_i, h; + digit_t sigma[2] = { 0 }, pre_sigma = 0; + digit_t k_t[NWORDS_ORDER], l_t[NWORDS_ORDER], one[NWORDS_ORDER] = { 0 }, r[2 * BITS] = { 0 }; + ec_point_t DIFF1a, DIFF1b, DIFF2a, DIFF2b, R[3] = { 0 }, T[3]; + + // differential additions formulas are invalid in this case + if (ec_has_zero_coordinate(P) | ec_has_zero_coordinate(Q) | ec_has_zero_coordinate(PQ)) + return 0; + + // Derive sigma according to parity + bitk0 = (k[0] & 1); + bitl0 = (l[0] & 1); + maskk = 0 - bitk0; // Parity masks: 0 if even, otherwise 1...1 + maskl = 0 - bitl0; + sigma[0] = (bitk0 ^ 1); + sigma[1] = (bitl0 ^ 1); + evens = sigma[0] + sigma[1]; // Count number of even scalars + mevens = 0 - (evens & 1); // Mask mevens <- 0 if # even of scalars = 0 or 2, otherwise mevens = 1...1 + + // If k and l are both even or both odd, pick sigma = (0,1) + sigma[0] = (sigma[0] & mevens); + sigma[1] = (sigma[1] & mevens) | (1 & ~mevens); + + // Convert even scalars to odd + one[0] = 1; + mp_sub(k_t, k, one, NWORDS_ORDER); + mp_sub(l_t, l, one, NWORDS_ORDER); + select_ct(k_t, k_t, k, maskk, NWORDS_ORDER); + select_ct(l_t, l_t, l, maskl, NWORDS_ORDER); + + // Scalar recoding + for (i = 0; i < kbits; i++) { + // If sigma[0] = 1 swap k_t and l_t + maskk = 0 - (sigma[0] ^ pre_sigma); + swap_ct(k_t, l_t, maskk, NWORDS_ORDER); + + if (i == kbits - 1) { + bs1_ip1 = 0; + bs2_ip1 = 0; + } else { + bs1_ip1 = mp_shiftr(k_t, 1, NWORDS_ORDER); + bs2_ip1 = mp_shiftr(l_t, 1, NWORDS_ORDER); + } + bs1_i = k_t[0] & 1; + bs2_i = l_t[0] & 1; + + r[2 * i] = bs1_i ^ bs1_ip1; + r[2 * i + 1] = bs2_i ^ bs2_ip1; + + // Revert sigma if second bit, r_(2i+1), is 1 + pre_sigma = sigma[0]; + maskk = 0 - r[2 * i + 1]; + select_ct(&temp, &sigma[0], &sigma[1], maskk, 1); + select_ct(&sigma[1], &sigma[1], &sigma[0], maskk, 1); + sigma[0] = temp; + } + + // Point initialization + ec_point_init(&R[0]); + maskk = 0 - sigma[0]; + select_point(&R[1], P, Q, maskk); + select_point(&R[2], Q, P, maskk); + + fp2_copy(&DIFF1a.x, &R[1].x); + fp2_copy(&DIFF1a.z, &R[1].z); + fp2_copy(&DIFF1b.x, &R[2].x); + fp2_copy(&DIFF1b.z, &R[2].z); + + // Initialize DIFF2a <- P+Q, DIFF2b <- P-Q + xADD(&R[2], &R[1], &R[2], PQ); + if (ec_has_zero_coordinate(&R[2])) + return 0; // non valid formulas + + fp2_copy(&DIFF2a.x, &R[2].x); + fp2_copy(&DIFF2a.z, &R[2].z); + fp2_copy(&DIFF2b.x, &PQ->x); + fp2_copy(&DIFF2b.z, &PQ->z); + + A_is_zero = fp2_is_zero(&curve->A); + + // Main loop + for (i = kbits - 1; i >= 0; i--) { + h = r[2 * i] + r[2 * i + 1]; // in {0, 1, 2} + maskk = 0 - (h & 1); + select_point(&T[0], &R[0], &R[1], maskk); + maskk = 0 - (h >> 1); + select_point(&T[0], &T[0], &R[2], maskk); + if (A_is_zero) { + xDBL_E0(&T[0], &T[0]); + } else { + assert(fp2_is_one(&curve->A24.z)); + xDBL_A24(&T[0], &T[0], &curve->A24, true); + } + + maskk = 0 - r[2 * i + 1]; // in {0, 1} + select_point(&T[1], &R[0], &R[1], maskk); + select_point(&T[2], &R[1], &R[2], maskk); + + cswap_points(&DIFF1a, &DIFF1b, maskk); + xADD(&T[1], &T[1], &T[2], &DIFF1a); + xADD(&T[2], &R[0], &R[2], &DIFF2a); + + // If hw (mod 2) = 1 then swap DIFF2a and DIFF2b + maskk = 0 - (h & 1); + cswap_points(&DIFF2a, &DIFF2b, maskk); + + // R <- T + copy_point(&R[0], &T[0]); + copy_point(&R[1], &T[1]); + copy_point(&R[2], &T[2]); + } + + // Output R[evens] + select_point(S, &R[0], &R[1], mevens); + + maskk = 0 - (bitk0 & bitl0); + select_point(S, S, &R[2], maskk); + return 1; +} + +int +ec_ladder3pt(ec_point_t *R, + const digit_t *m, + const ec_point_t *P, + const ec_point_t *Q, + const ec_point_t *PQ, + const ec_curve_t *E) +{ // The 3-point Montgomery ladder + // Input: projective Montgomery points P=(XP:ZP) and Q=(XQ:ZQ) such that xP=XP/ZP and xQ=XQ/ZQ, a scalar k of + // bitlength kbits, the difference PQ=P-Q=(XPQ:ZPQ), and the Montgomery curve constants A24 = (A+2C/4C:1). + // Output: projective Montgomery point R <- P + m*Q = (XR:ZR) such that x(P + m*Q)=XR/ZR. + assert(E->is_A24_computed_and_normalized); + if (!fp2_is_one(&E->A24.z)) { + return 0; + } + // Formulas are not valid in that case + if (ec_has_zero_coordinate(PQ)) { + return 0; + } + + ec_point_t X0, X1, X2; + copy_point(&X0, Q); + copy_point(&X1, P); + copy_point(&X2, PQ); + + int i, j; + digit_t t; + for (i = 0; i < NWORDS_ORDER; i++) { + t = 1; + for (j = 0; j < RADIX; j++) { + cswap_points(&X1, &X2, -((t & m[i]) == 0)); + xDBLADD(&X0, &X1, &X0, &X1, &X2, &E->A24, true); + cswap_points(&X1, &X2, -((t & m[i]) == 0)); + t <<= 1; + }; + }; + copy_point(R, &X1); + return 1; +} + +// WRAPPERS to export + +void +ec_dbl(ec_point_t *res, const ec_point_t *P, const ec_curve_t *curve) +{ + // If A24 = ((A+2)/4 : 1) we save multiplications + if (curve->is_A24_computed_and_normalized) { + assert(fp2_is_one(&curve->A24.z)); + xDBL_A24(res, P, &curve->A24, true); + } else { + // Otherwise we compute A24 on the fly for doubling + xDBL(res, P, (const ec_point_t *)curve); + } +} + +void +ec_dbl_iter(ec_point_t *res, int n, const ec_point_t *P, ec_curve_t *curve) +{ + if (n == 0) { + copy_point(res, P); + return; + } + + // When the chain is long enough, we should normalise A24 + if (n > 50) { + ec_curve_normalize_A24(curve); + } + + // When A24 is normalized we can save some multiplications + if (curve->is_A24_computed_and_normalized) { + assert(fp2_is_one(&curve->A24.z)); + xDBL_A24(res, P, &curve->A24, true); + for (int i = 0; i < n - 1; i++) { + assert(fp2_is_one(&curve->A24.z)); + xDBL_A24(res, res, &curve->A24, true); + } + } else { + // Otherwise we do normal doubling + xDBL(res, P, (const ec_point_t *)curve); + for (int i = 0; i < n - 1; i++) { + xDBL(res, res, (const ec_point_t *)curve); + } + } +} + +void +ec_dbl_iter_basis(ec_basis_t *res, int n, const ec_basis_t *B, ec_curve_t *curve) +{ + ec_dbl_iter(&res->P, n, &B->P, curve); + ec_dbl_iter(&res->Q, n, &B->Q, curve); + ec_dbl_iter(&res->PmQ, n, &B->PmQ, curve); +} + +void +ec_mul(ec_point_t *res, const digit_t *scalar, const int kbits, const ec_point_t *P, ec_curve_t *curve) +{ + // For large scalars it's worth normalising anyway + if (kbits > 50) { + ec_curve_normalize_A24(curve); + } + + // When A24 is computed and normalized we save some Fp2 multiplications + xMUL(res, P, scalar, kbits, curve); +} + +int +ec_biscalar_mul(ec_point_t *res, + const digit_t *scalarP, + const digit_t *scalarQ, + const int kbits, + const ec_basis_t *PQ, + const ec_curve_t *curve) +{ + if (fp2_is_zero(&PQ->PmQ.z)) + return 0; + + /* Differential additions behave badly when PmQ = (0:1), so we need to + * treat this case specifically. Since we assume P, Q are a basis, this + * can happen only if kbits==1 */ + if (kbits == 1) { + // Sanity check: our basis should be given by 2-torsion points + if (!ec_is_two_torsion(&PQ->P, curve) || !ec_is_two_torsion(&PQ->Q, curve) || + !ec_is_two_torsion(&PQ->PmQ, curve)) + return 0; + digit_t bP, bQ; + bP = (scalarP[0] & 1); + bQ = (scalarQ[0] & 1); + if (bP == 0 && bQ == 0) + ec_point_init(res); //(1: 0) + else if (bP == 1 && bQ == 0) + copy_point(res, &PQ->P); + else if (bP == 0 && bQ == 1) + copy_point(res, &PQ->Q); + else if (bP == 1 && bQ == 1) + copy_point(res, &PQ->PmQ); + else // should never happen + assert(0); + return 1; + } else { + ec_curve_t E; + copy_curve(&E, curve); + + if (!fp2_is_zero(&curve->A)) { // If A is not zero normalize + ec_curve_normalize_A24(&E); + } + return xDBLMUL(res, &PQ->P, scalarP, &PQ->Q, scalarQ, &PQ->PmQ, kbits, (const ec_curve_t *)&E); + } +} diff --git a/src/ec/ref/lvlx/ec_jac.c b/src/ec/ref/lvlx/ec_jac.c new file mode 100644 index 0000000..20ca68c --- /dev/null +++ b/src/ec/ref/lvlx/ec_jac.c @@ -0,0 +1,335 @@ +#include +#include + +void +jac_init(jac_point_t *P) +{ // Initialize Montgomery in Jacobian coordinates as identity element (0:1:0) + fp2_set_zero(&P->x); + fp2_set_one(&P->y); + fp2_set_zero(&P->z); +} + +uint32_t +jac_is_equal(const jac_point_t *P, const jac_point_t *Q) +{ // Evaluate if two points in Jacobian coordinates (X:Y:Z) are equal + // Returns 1 (true) if P=Q, 0 (false) otherwise + fp2_t t0, t1, t2, t3; + + fp2_sqr(&t0, &Q->z); + fp2_mul(&t2, &P->x, &t0); // x1*z2^2 + fp2_sqr(&t1, &P->z); + fp2_mul(&t3, &Q->x, &t1); // x2*z1^2 + fp2_sub(&t2, &t2, &t3); + + fp2_mul(&t0, &t0, &Q->z); + fp2_mul(&t0, &P->y, &t0); // y1*z2^3 + fp2_mul(&t1, &t1, &P->z); + fp2_mul(&t1, &Q->y, &t1); // y2*z1^3 + fp2_sub(&t0, &t0, &t1); + + return fp2_is_zero(&t0) & fp2_is_zero(&t2); +} + +void +jac_to_xz(ec_point_t *P, const jac_point_t *xyP) +{ + fp2_copy(&P->x, &xyP->x); + fp2_copy(&P->z, &xyP->z); + fp2_sqr(&P->z, &P->z); + + // If xyP = (0:1:0), we currently have P=(0 : 0) but we want to set P=(1:0) + uint32_t c1, c2; + fp2_t one; + fp2_set_one(&one); + + c1 = fp2_is_zero(&P->x); + c2 = fp2_is_zero(&P->z); + fp2_select(&P->x, &P->x, &one, c1 & c2); +} + +void +jac_to_ws(jac_point_t *Q, fp2_t *t, fp2_t *ao3, const jac_point_t *P, const ec_curve_t *curve) +{ + // Cost of 3M + 2S when A != 0. + fp_t one; + fp2_t a; + /* a = 1 - A^2/3, U = X + (A*Z^2)/3, V = Y, W = Z, T = a*Z^4*/ + fp_set_one(&one); + if (!fp2_is_zero(&(curve->A))) { + fp_div3(&(ao3->re), &(curve->A.re)); + fp_div3(&(ao3->im), &(curve->A.im)); + fp2_sqr(t, &P->z); + fp2_mul(&Q->x, ao3, t); + fp2_add(&Q->x, &Q->x, &P->x); + fp2_sqr(t, t); + fp2_mul(&a, ao3, &(curve->A)); + fp_sub(&(a.re), &one, &(a.re)); + fp_neg(&(a.im), &(a.im)); + fp2_mul(t, t, &a); + } else { + fp2_copy(&Q->x, &P->x); + fp2_sqr(t, &P->z); + fp2_sqr(t, t); + } + fp2_copy(&Q->y, &P->y); + fp2_copy(&Q->z, &P->z); +} + +void +jac_from_ws(jac_point_t *Q, const jac_point_t *P, const fp2_t *ao3, const ec_curve_t *curve) +{ + // Cost of 1M + 1S when A != 0. + fp2_t t; + /* X = U - (A*W^2)/3, Y = V, Z = W. */ + if (!fp2_is_zero(&(curve->A))) { + fp2_sqr(&t, &P->z); + fp2_mul(&t, &t, ao3); + fp2_sub(&Q->x, &P->x, &t); + } + fp2_copy(&Q->y, &P->y); + fp2_copy(&Q->z, &P->z); +} + +void +copy_jac_point(jac_point_t *P, const jac_point_t *Q) +{ + fp2_copy(&(P->x), &(Q->x)); + fp2_copy(&(P->y), &(Q->y)); + fp2_copy(&(P->z), &(Q->z)); +} + +void +jac_neg(jac_point_t *Q, const jac_point_t *P) +{ + fp2_copy(&Q->x, &P->x); + fp2_neg(&Q->y, &P->y); + fp2_copy(&Q->z, &P->z); +} + +void +DBL(jac_point_t *Q, const jac_point_t *P, const ec_curve_t *AC) +{ // Cost of 6M + 6S. + // Doubling on a Montgomery curve, representation in Jacobian coordinates (X:Y:Z) corresponding to + // (X/Z^2,Y/Z^3) This version receives the coefficient value A + fp2_t t0, t1, t2, t3; + + uint32_t flag = fp2_is_zero(&P->x) & fp2_is_zero(&P->z); + + fp2_sqr(&t0, &P->x); // t0 = x1^2 + fp2_add(&t1, &t0, &t0); + fp2_add(&t0, &t0, &t1); // t0 = 3x1^2 + fp2_sqr(&t1, &P->z); // t1 = z1^2 + fp2_mul(&t2, &P->x, &AC->A); + fp2_add(&t2, &t2, &t2); // t2 = 2Ax1 + fp2_add(&t2, &t1, &t2); // t2 = 2Ax1+z1^2 + fp2_mul(&t2, &t1, &t2); // t2 = z1^2(2Ax1+z1^2) + fp2_add(&t2, &t0, &t2); // t2 = alpha = 3x1^2 + z1^2(2Ax1+z1^2) + fp2_mul(&Q->z, &P->y, &P->z); + fp2_add(&Q->z, &Q->z, &Q->z); // z2 = 2y1z1 + fp2_sqr(&t0, &Q->z); + fp2_mul(&t0, &t0, &AC->A); // t0 = 4Ay1^2z1^2 + fp2_sqr(&t1, &P->y); + fp2_add(&t1, &t1, &t1); // t1 = 2y1^2 + fp2_add(&t3, &P->x, &P->x); // t3 = 2x1 + fp2_mul(&t3, &t1, &t3); // t3 = 4x1y1^2 + fp2_sqr(&Q->x, &t2); // x2 = alpha^2 + fp2_sub(&Q->x, &Q->x, &t0); // x2 = alpha^2 - 4Ay1^2z1^2 + fp2_sub(&Q->x, &Q->x, &t3); + fp2_sub(&Q->x, &Q->x, &t3); // x2 = alpha^2 - 4Ay1^2z1^2 - 8x1y1^2 + fp2_sub(&Q->y, &t3, &Q->x); // y2 = 4x1y1^2 - x2 + fp2_mul(&Q->y, &Q->y, &t2); // y2 = alpha(4x1y1^2 - x2) + fp2_sqr(&t1, &t1); // t1 = 4y1^4 + fp2_sub(&Q->y, &Q->y, &t1); + fp2_sub(&Q->y, &Q->y, &t1); // y2 = alpha(4x1y1^2 - x2) - 8y1^4 + + fp2_select(&Q->x, &Q->x, &P->x, -flag); + fp2_select(&Q->z, &Q->z, &P->z, -flag); +} + +void +DBLW(jac_point_t *Q, fp2_t *u, const jac_point_t *P, const fp2_t *t) +{ // Cost of 3M + 5S. + // Doubling on a Weierstrass curve, representation in modified Jacobian coordinates + // (X:Y:Z:T=a*Z^4) corresponding to (X/Z^2,Y/Z^3), where a is the curve coefficient. + // Formula from https://hyperelliptic.org/EFD/g1p/auto-shortw-modified.html + + uint32_t flag = fp2_is_zero(&P->x) & fp2_is_zero(&P->z); + + fp2_t xx, c, cc, r, s, m; + // XX = X^2 + fp2_sqr(&xx, &P->x); + // A = 2*Y^2 + fp2_sqr(&c, &P->y); + fp2_add(&c, &c, &c); + // AA = A^2 + fp2_sqr(&cc, &c); + // R = 2*AA + fp2_add(&r, &cc, &cc); + // S = (X+A)^2-XX-AA + fp2_add(&s, &P->x, &c); + fp2_sqr(&s, &s); + fp2_sub(&s, &s, &xx); + fp2_sub(&s, &s, &cc); + // M = 3*XX+T1 + fp2_add(&m, &xx, &xx); + fp2_add(&m, &m, &xx); + fp2_add(&m, &m, t); + // X3 = M^2-2*S + fp2_sqr(&Q->x, &m); + fp2_sub(&Q->x, &Q->x, &s); + fp2_sub(&Q->x, &Q->x, &s); + // Z3 = 2*Y*Z + fp2_mul(&Q->z, &P->y, &P->z); + fp2_add(&Q->z, &Q->z, &Q->z); + // Y3 = M*(S-X3)-R + fp2_sub(&Q->y, &s, &Q->x); + fp2_mul(&Q->y, &Q->y, &m); + fp2_sub(&Q->y, &Q->y, &r); + // T3 = 2*R*T1 + fp2_mul(u, t, &r); + fp2_add(u, u, u); + + fp2_select(&Q->x, &Q->x, &P->x, -flag); + fp2_select(&Q->z, &Q->z, &P->z, -flag); +} + +void +select_jac_point(jac_point_t *Q, const jac_point_t *P1, const jac_point_t *P2, const digit_t option) +{ // Select points + // If option = 0 then Q <- P1, else if option = 0xFF...FF then Q <- P2 + fp2_select(&(Q->x), &(P1->x), &(P2->x), option); + fp2_select(&(Q->y), &(P1->y), &(P2->y), option); + fp2_select(&(Q->z), &(P1->z), &(P2->z), option); +} + +void +ADD(jac_point_t *R, const jac_point_t *P, const jac_point_t *Q, const ec_curve_t *AC) +{ + // Addition on a Montgomery curve, representation in Jacobian coordinates (X:Y:Z) corresponding + // to (x,y) = (X/Z^2,Y/Z^3) This version receives the coefficient value A + // + // Complete routine, to handle all edge cases: + // if ZP == 0: # P == inf + // return Q + // if ZQ == 0: # Q == inf + // return P + // dy <- YQ*ZP**3 - YP*ZQ**3 + // dx <- XQ*ZP**2 - XP*ZQ**2 + // if dx == 0: # x1 == x2 + // if dy == 0: # ... and y1 == y2: doubling case + // dy <- ZP*ZQ * (3*XP^2 + ZP^2 * (2*A*XP + ZP^2)) + // dx <- 2*YP*ZP + // else: # ... but y1 != y2, thus P = -Q + // return inf + // XR <- dy**2 - dx**2 * (A*ZP^2*ZQ^2 + XP*ZQ^2 + XQ*ZP^2) + // YR <- dy * (XP*ZQ^2 * dx^2 - XR) - YP*ZQ^3 * dx^3 + // ZR <- dx * ZP * ZQ + + // Constant time processing: + // - The case for P == 0 or Q == 0 is handled at the end with conditional select + // - dy and dx are computed for both the normal and doubling cases, we switch when + // dx == dy == 0 for the normal case. + // - If we have that P = -Q then dx = 0 and so ZR will be zero, giving us the point + // at infinity for "free". + // + // These current formula are expensive and I'm probably missing some tricks... + // Thought I'd get the ball rolling. + // Cost 17M + 6S + 13a + fp2_t t0, t1, t2, t3, u1, u2, v1, dx, dy; + + /* If P is zero or Q is zero we will conditionally swap before returning. */ + uint32_t ctl1 = fp2_is_zero(&P->z); + uint32_t ctl2 = fp2_is_zero(&Q->z); + + /* Precompute some values */ + fp2_sqr(&t0, &P->z); // t0 = z1^2 + fp2_sqr(&t1, &Q->z); // t1 = z2^2 + + /* Compute dy and dx for ordinary case */ + fp2_mul(&v1, &t1, &Q->z); // v1 = z2^3 + fp2_mul(&t2, &t0, &P->z); // t2 = z1^3 + fp2_mul(&v1, &v1, &P->y); // v1 = y1z2^3 + fp2_mul(&t2, &t2, &Q->y); // t2 = y2z1^3 + fp2_sub(&dy, &t2, &v1); // dy = y2z1^3 - y1z2^3 + fp2_mul(&u2, &t0, &Q->x); // u2 = x2z1^2 + fp2_mul(&u1, &t1, &P->x); // u1 = x1z2^2 + fp2_sub(&dx, &u2, &u1); // dx = x2z1^2 - x1z2^2 + + /* Compute dy and dx for doubling case */ + fp2_add(&t1, &P->y, &P->y); // dx_dbl = t1 = 2y1 + fp2_add(&t2, &AC->A, &AC->A); // t2 = 2A + fp2_mul(&t2, &t2, &P->x); // t2 = 2Ax1 + fp2_add(&t2, &t2, &t0); // t2 = 2Ax1 + z1^2 + fp2_mul(&t2, &t2, &t0); // t2 = z1^2 * (2Ax1 + z1^2) + fp2_sqr(&t0, &P->x); // t0 = x1^2 + fp2_add(&t2, &t2, &t0); // t2 = x1^2 + z1^2 * (2Ax1 + z1^2) + fp2_add(&t2, &t2, &t0); // t2 = 2*x1^2 + z1^2 * (2Ax1 + z1^2) + fp2_add(&t2, &t2, &t0); // t2 = 3*x1^2 + z1^2 * (2Ax1 + z1^2) + fp2_mul(&t2, &t2, &Q->z); // dy_dbl = t2 = z2 * (3*x1^2 + z1^2 * (2Ax1 + z1^2)) + + /* If dx is zero and dy is zero swap with double variables */ + uint32_t ctl = fp2_is_zero(&dx) & fp2_is_zero(&dy); + fp2_select(&dx, &dx, &t1, ctl); + fp2_select(&dy, &dy, &t2, ctl); + + /* Some more precomputations */ + fp2_mul(&t0, &P->z, &Q->z); // t0 = z1z2 + fp2_sqr(&t1, &t0); // t1 = z1z2^2 + fp2_sqr(&t2, &dx); // t2 = dx^2 + fp2_sqr(&t3, &dy); // t3 = dy^2 + + /* Compute x3 = dy**2 - dx**2 * (A*ZP^2*ZQ^2 + XP*ZQ^2 + XQ*ZP^2) */ + fp2_mul(&R->x, &AC->A, &t1); // x3 = A*(z1z2)^2 + fp2_add(&R->x, &R->x, &u1); // x3 = A*(z1z2)^2 + u1 + fp2_add(&R->x, &R->x, &u2); // x3 = A*(z1z2)^2 + u1 + u2 + fp2_mul(&R->x, &R->x, &t2); // x3 = dx^2 * (A*(z1z2)^2 + u1 + u2) + fp2_sub(&R->x, &t3, &R->x); // x3 = dy^2 - dx^2 * (A*(z1z2)^2 + u1 + u2) + + /* Compute y3 = dy * (XP*ZQ^2 * dx^2 - XR) - YP*ZQ^3 * dx^3*/ + fp2_mul(&R->y, &u1, &t2); // y3 = u1 * dx^2 + fp2_sub(&R->y, &R->y, &R->x); // y3 = u1 * dx^2 - x3 + fp2_mul(&R->y, &R->y, &dy); // y3 = dy * (u1 * dx^2 - x3) + fp2_mul(&t3, &t2, &dx); // t3 = dx^3 + fp2_mul(&t3, &t3, &v1); // t3 = v1 * dx^3 + fp2_sub(&R->y, &R->y, &t3); // y3 = dy * (u1 * dx^2 - x3) - v1 * dx^3 + + /* Compute z3 = dx * z1 * z2 */ + fp2_mul(&R->z, &dx, &t0); + + /* Finally, we need to set R = P is Q.Z = 0 and R = Q if P.Z = 0 */ + select_jac_point(R, R, Q, ctl1); + select_jac_point(R, R, P, ctl2); +} + +void +jac_to_xz_add_components(add_components_t *add_comp, const jac_point_t *P, const jac_point_t *Q, const ec_curve_t *AC) +{ + // Take P and Q in E distinct, two jac_point_t, return three components u,v and w in Fp2 such + // that the xz coordinates of P+Q are (u-v:w) and of P-Q are (u+v:w) + + fp2_t t0, t1, t2, t3, t4, t5, t6; + + fp2_sqr(&t0, &P->z); // t0 = z1^2 + fp2_sqr(&t1, &Q->z); // t1 = z2^2 + fp2_mul(&t2, &P->x, &t1); // t2 = x1z2^2 + fp2_mul(&t3, &t0, &Q->x); // t3 = z1^2x2 + fp2_mul(&t4, &P->y, &Q->z); // t4 = y1z2 + fp2_mul(&t4, &t4, &t1); // t4 = y1z2^3 + fp2_mul(&t5, &P->z, &Q->y); // t5 = z1y2 + fp2_mul(&t5, &t5, &t0); // t5 = z1^3y2 + fp2_mul(&t0, &t0, &t1); // t0 = (z1z2)^2 + fp2_mul(&t6, &t4, &t5); // t6 = (z1z_2)^3y1y2 + fp2_add(&add_comp->v, &t6, &t6); // v = 2(z1z_2)^3y1y2 + fp2_sqr(&t4, &t4); // t4 = y1^2z2^6 + fp2_sqr(&t5, &t5); // t5 = z1^6y_2^2 + fp2_add(&t4, &t4, &t5); // t4 = z1^6y_2^2 + y1^2z2^6 + fp2_add(&t5, &t2, &t3); // t5 = x1z2^2 +z_1^2x2 + fp2_add(&t6, &t3, &t3); // t6 = 2z_1^2x2 + fp2_sub(&t6, &t5, &t6); // t6 = lambda = x1z2^2 - z_1^2x2 + fp2_sqr(&t6, &t6); // t6 = lambda^2 = (x1z2^2 - z_1^2x2)^2 + fp2_mul(&t1, &AC->A, &t0); // t1 = A*(z1z2)^2 + fp2_add(&t1, &t5, &t1); // t1 = gamma =A*(z1z2)^2 + x1z2^2 +z_1^2x2 + fp2_mul(&t1, &t1, &t6); // t1 = gamma*lambda^2 + fp2_sub(&add_comp->u, &t4, &t1); // u = z1^6y_2^2 + y1^2z2^6 - gamma*lambda^2 + fp2_mul(&add_comp->w, &t6, &t0); // w = (z1z2)^2(lambda)^2 +} diff --git a/src/ec/ref/lvlx/isog_chains.c b/src/ec/ref/lvlx/isog_chains.c new file mode 100644 index 0000000..abc9808 --- /dev/null +++ b/src/ec/ref/lvlx/isog_chains.c @@ -0,0 +1,241 @@ +#include "isog.h" +#include + +// since we use degree 4 isogeny steps, we need to handle the odd case with care +static uint32_t +ec_eval_even_strategy(ec_curve_t *curve, + ec_point_t *points, + unsigned len_points, + const ec_point_t *kernel, + const int isog_len) +{ + ec_curve_normalize_A24(curve); + ec_point_t A24; + copy_point(&A24, &curve->A24); + + int space = 1; + for (int i = 1; i < isog_len; i *= 2) + ++space; + + // Stack of remaining kernel points and their associated orders + ec_point_t splits[space]; + uint16_t todo[space]; + splits[0] = *kernel; + todo[0] = isog_len; + + int current = 0; // Pointer to current top of stack + + // Chain of 4-isogenies + for (int j = 0; j < isog_len / 2; ++j) { + assert(current >= 0); + assert(todo[current] >= 1); + // Get the next point of order 4 + while (todo[current] != 2) { + assert(todo[current] >= 3); + // A new split will be added + ++current; + assert(current < space); + // We set the seed of the new split to be computed and saved + copy_point(&splits[current], &splits[current - 1]); + // if we copied from the very first element, then we perform one additional doubling + unsigned num_dbls = todo[current - 1] / 4 * 2 + todo[current - 1] % 2; + todo[current] = todo[current - 1] - num_dbls; + while (num_dbls--) + xDBL_A24(&splits[current], &splits[current], &A24, false); + } + + if (j == 0) { + assert(fp2_is_one(&A24.z)); + if (!ec_is_four_torsion(&splits[current], curve)) + return -1; + + ec_point_t T; + xDBL_A24(&T, &splits[current], &A24, false); + if (fp2_is_zero(&T.x)) + return -1; // special isogenies not allowed + } else { + assert(todo[current] == 2); +#ifndef NDEBUG + if (fp2_is_zero(&splits[current].z)) + debug_print("splitting point z coordinate is unexpectedly zero"); + + ec_point_t test; + xDBL_A24(&test, &splits[current], &A24, false); + if (fp2_is_zero(&test.z)) + debug_print("z coordinate is unexpectedly zero before doubling"); + xDBL_A24(&test, &test, &A24, false); + if (!fp2_is_zero(&test.z)) + debug_print("z coordinate is unexpectedly not zero after doubling"); +#endif + } + + // Evaluate 4-isogeny + ec_kps4_t kps4; + xisog_4(&kps4, &A24, splits[current]); + xeval_4(splits, splits, current, &kps4); + for (int i = 0; i < current; ++i) + todo[i] -= 2; + xeval_4(points, points, len_points, &kps4); + + --current; + } + assert(isog_len % 2 ? !current : current == -1); + + // Final 2-isogeny + if (isog_len % 2) { +#ifndef NDEBUG + if (fp2_is_zero(&splits[0].z)) + debug_print("splitting point z coordinate is unexpectedly zero"); + ec_point_t test; + copy_point(&test, &splits[0]); + xDBL_A24(&test, &test, &A24, false); + if (!fp2_is_zero(&test.z)) + debug_print("z coordinate is unexpectedly not zero after doubling"); +#endif + + // We need to check the order of this point in case there were no 4-isogenies + if (isog_len == 1 && !ec_is_two_torsion(&splits[0], curve)) + return -1; + if (fp2_is_zero(&splits[0].x)) { + // special isogenies not allowed + // this case can only happen if isog_len == 1; otherwise the + // previous 4-isogenies we computed ensure that $T=(0:1)$ is put + // as the kernel of the dual isogeny + return -1; + } + + ec_kps2_t kps2; + xisog_2(&kps2, &A24, splits[0]); + xeval_2(points, points, len_points, &kps2); + } + + // Output curve in the form (A:C) + A24_to_AC(curve, &A24); + + curve->is_A24_computed_and_normalized = false; + + return 0; +} + +uint32_t +ec_eval_even(ec_curve_t *image, ec_isog_even_t *phi, ec_point_t *points, unsigned len_points) +{ + copy_curve(image, &phi->curve); + return ec_eval_even_strategy(image, points, len_points, &phi->kernel, phi->length); +} + +// naive implementation +uint32_t +ec_eval_small_chain(ec_curve_t *curve, + const ec_point_t *kernel, + int len, + ec_point_t *points, + unsigned len_points, + bool special) // do we allow special isogenies? +{ + + ec_point_t A24; + AC_to_A24(&A24, curve); + + ec_kps2_t kps; + ec_point_t small_K, big_K; + copy_point(&big_K, kernel); + + for (int i = 0; i < len; i++) { + copy_point(&small_K, &big_K); + // small_K = big_K; + for (int j = 0; j < len - i - 1; j++) { + xDBL_A24(&small_K, &small_K, &A24, false); + } + // Check the order of the point before the first isogeny step + if (i == 0 && !ec_is_two_torsion(&small_K, curve)) + return (uint32_t)-1; + // Perform isogeny step + if (fp2_is_zero(&small_K.x)) { + if (special) { + ec_point_t B24; + xisog_2_singular(&kps, &B24, A24); + xeval_2_singular(&big_K, &big_K, 1, &kps); + xeval_2_singular(points, points, len_points, &kps); + copy_point(&A24, &B24); + } else { + return (uint32_t)-1; + } + } else { + xisog_2(&kps, &A24, small_K); + xeval_2(&big_K, &big_K, 1, &kps); + xeval_2(points, points, len_points, &kps); + } + } + A24_to_AC(curve, &A24); + + curve->is_A24_computed_and_normalized = false; + return 0; +} + +uint32_t +ec_isomorphism(ec_isom_t *isom, const ec_curve_t *from, const ec_curve_t *to) +{ + fp2_t t0, t1, t2, t3, t4; + + fp2_mul(&t0, &from->A, &from->C); + fp2_mul(&t1, &to->A, &to->C); + + fp2_mul(&t2, &t1, &to->C); // toA*toC^2 + fp2_add(&t3, &t2, &t2); + fp2_add(&t3, &t3, &t3); + fp2_add(&t3, &t3, &t3); + fp2_add(&t2, &t2, &t3); // 9*toA*toC^2 + fp2_sqr(&t3, &to->A); + fp2_mul(&t3, &t3, &to->A); // toA^3 + fp2_add(&t3, &t3, &t3); + fp2_sub(&isom->Nx, &t3, &t2); // 2*toA^3-9*toA*toC^2 + fp2_mul(&t2, &t0, &from->A); // fromA^2*fromC + fp2_sqr(&t3, &from->C); + fp2_mul(&t3, &t3, &from->C); // fromC^3 + fp2_add(&t4, &t3, &t3); + fp2_add(&t3, &t4, &t3); // 3*fromC^3 + fp2_sub(&t3, &t3, &t2); // 3*fromC^3-fromA^2*fromC + fp2_mul(&isom->Nx, &isom->Nx, &t3); // lambda_x = (2*toA^3-9*toA*toC^2)*(3*fromC^3-fromA^2*fromC) + + fp2_mul(&t2, &t0, &from->C); // fromA*fromC^2 + fp2_add(&t3, &t2, &t2); + fp2_add(&t3, &t3, &t3); + fp2_add(&t3, &t3, &t3); + fp2_add(&t2, &t2, &t3); // 9*fromA*fromC^2 + fp2_sqr(&t3, &from->A); + fp2_mul(&t3, &t3, &from->A); // fromA^3 + fp2_add(&t3, &t3, &t3); + fp2_sub(&isom->D, &t3, &t2); // 2*fromA^3-9*fromA*fromC^2 + fp2_mul(&t2, &t1, &to->A); // toA^2*toC + fp2_sqr(&t3, &to->C); + fp2_mul(&t3, &t3, &to->C); // toC^3 + fp2_add(&t4, &t3, &t3); + fp2_add(&t3, &t4, &t3); // 3*toC^3 + fp2_sub(&t3, &t3, &t2); // 3*toC^3-toA^2*toC + fp2_mul(&isom->D, &isom->D, &t3); // lambda_z = (2*fromA^3-9*fromA*fromC^2)*(3*toC^3-toA^2*toC) + + // Mont -> SW -> SW -> Mont + fp2_mul(&t0, &to->C, &from->A); + fp2_mul(&t0, &t0, &isom->Nx); // lambda_x*toC*fromA + fp2_mul(&t1, &from->C, &to->A); + fp2_mul(&t1, &t1, &isom->D); // lambda_z*fromC*toA + fp2_sub(&isom->Nz, &t0, &t1); // lambda_x*toC*fromA - lambda_z*fromC*toA + fp2_mul(&t0, &from->C, &to->C); + fp2_add(&t1, &t0, &t0); + fp2_add(&t0, &t0, &t1); // 3*fromC*toC + fp2_mul(&isom->D, &isom->D, &t0); // 3*lambda_z*fromC*toC + fp2_mul(&isom->Nx, &isom->Nx, &t0); // 3*lambda_x*fromC*toC + + return (fp2_is_zero(&isom->Nx) | fp2_is_zero(&isom->D)); +} + +void +ec_iso_eval(ec_point_t *P, ec_isom_t *isom) +{ + fp2_t tmp; + fp2_mul(&P->x, &P->x, &isom->Nx); + fp2_mul(&tmp, &P->z, &isom->Nz); + fp2_add(&P->x, &P->x, &tmp); + fp2_mul(&P->z, &P->z, &isom->D); +} diff --git a/src/ec/ref/lvlx/test/basis-gen-bench.c b/src/ec/ref/lvlx/test/basis-gen-bench.c new file mode 100644 index 0000000..6d65265 --- /dev/null +++ b/src/ec/ref/lvlx/test/basis-gen-bench.c @@ -0,0 +1,143 @@ +#include +#include +#include +#include +#include + +#define STRINGIFY2(x) #x +#define STRINGIFY(x) STRINGIFY2(x) + +/****************************** +Util functions +******************************/ + +int +cmp_u64(const void *v1, const void *v2) +{ + uint64_t x1 = *(const uint64_t *)v1; + uint64_t x2 = *(const uint64_t *)v2; + if (x1 < x2) { + return -1; + } else if (x1 == x2) { + return 0; + } else { + return 1; + } +} + +void +bench_basis_generation(unsigned int n, int iterations) +{ + int i, j; + uint64_t cycles1, cycles2; + uint64_t cycle_runs[20]; + + ec_basis_t basis; + ec_curve_t curve; + ec_curve_init(&curve); + + // Set a supersingular elliptic curve + // E : y^2 = x^3 + 6*x^2 + x + fp2_set_small(&(curve.A), 6); + fp2_set_one(&(curve.C)); + ec_curve_normalize_A24(&curve); + + // Full even torsion generation without hints + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (j = 0; j < iterations; j++) { + (void)ec_curve_to_basis_2f_to_hint(&basis, &curve, n); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" 2^%d torsion generation takes .................................... %" PRIu64 " cycles\n", + n, + cycle_runs[4] / (iterations)); +} + +void +bench_basis_generation_from_hint(unsigned int n, int iterations) +{ + int i, j; + uint64_t cycles1, cycles2; + uint64_t cycle_runs[20]; + + ec_basis_t basis; + ec_curve_t curve; + ec_curve_init(&curve); + + // Set a supersingular elliptic curve + // E : y^2 = x^3 + 6*x^2 + x + fp2_set_small(&(curve.A), 6); + fp2_set_one(&(curve.C)); + ec_curve_normalize_A24(&curve); + + uint8_t hint = ec_curve_to_basis_2f_to_hint(&basis, &curve, n); + + // Full even torsion generation without hints + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (j = 0; j < iterations; j++) { + ec_curve_to_basis_2f_from_hint(&basis, &curve, n, hint); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" 2^%d torsion generation takes .................................... %" PRIu64 " cycles\n", + n, + cycle_runs[4] / (iterations)); +} + +void +bench_basis(int iterations) +{ + printf("\n-------------------------------------------------------------------------------------" + "-------------------\n\n"); + printf("Benchmarking E[2^n] basis generation for " STRINGIFY(SQISIGN_VARIANT) ": \n\n"); + bench_basis_generation(TORSION_EVEN_POWER, iterations); + bench_basis_generation(128, iterations); + + printf("\nBenchmarking E[2^n] basis generation with hint for " STRINGIFY(SQISIGN_VARIANT) ": \n\n"); + bench_basis_generation_from_hint(TORSION_EVEN_POWER, iterations); + bench_basis_generation_from_hint(128, iterations); +} + +int +main(int argc, char *argv[]) +{ + int iterations = 100 * SQISIGN_TEST_REPS; + int help = 0; + +#ifndef NDEBUG + fprintf(stderr, + "\x1b[31mIt looks like SQIsign was compiled with assertions enabled.\n" + "This will severely impact performance measurements.\x1b[0m\n"); +#endif + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + } + + if (help || iterations <= 0) { + printf("Usage: %s [--iterations=]\n", argv[0]); + printf("Where is the number of iterations used for benchmarking; if not " + "present, uses the default: %d)\n", + iterations); + return 1; + } + + cpucycles_init(); + + bench_basis(iterations); + return 0; +} diff --git a/src/ec/ref/lvlx/test/basis-gen-test.c b/src/ec/ref/lvlx/test/basis-gen-test.c new file mode 100644 index 0000000..a067fa3 --- /dev/null +++ b/src/ec/ref/lvlx/test/basis-gen-test.c @@ -0,0 +1,195 @@ +#include +#include +#include +#include + +/****************************** +Test functions +******************************/ + +int +inner_test_generated_basis(ec_basis_t *basis, ec_curve_t *curve, unsigned int n) +{ + unsigned int i; + int PASSED = 1; + + ec_point_t P, Q; + copy_point(&P, &basis->P); + copy_point(&Q, &basis->Q); + + // Double points to get point of order 2 + for (i = 0; i < n - 1; i++) { + xDBL_A24(&P, &P, &curve->A24, curve->is_A24_computed_and_normalized); + xDBL_A24(&Q, &Q, &curve->A24, curve->is_A24_computed_and_normalized); + } + if (ec_is_zero(&P)) { + printf("Point P generated does not have full order\n"); + PASSED = 0; + } + if (ec_is_zero(&Q)) { + printf("Point Q generated does not have full order\n"); + PASSED = 0; + } + if (ec_is_equal(&P, &Q)) { + printf("Points P, Q are linearly dependent\n"); + PASSED = 0; + } + + if (!fp2_is_zero(&Q.x)) { + printf("Points Q is not above the Montgomery point\n"); + PASSED = 0; + } + + // This should give the identity + xDBL_A24(&P, &P, &curve->A24, curve->is_A24_computed_and_normalized); + xDBL_A24(&Q, &Q, &curve->A24, curve->is_A24_computed_and_normalized); + if (!ec_is_zero(&P)) { + printf("Point P generated does not have order exactly 2^n\n"); + PASSED = 0; + } + if (!ec_is_zero(&Q)) { + printf("Point Q generated does not have order exactly 2^n\n"); + PASSED = 0; + } + + if (PASSED == 0) { + printf("Test failed with n = %u\n", n); + } + + return PASSED; +} + +int +inner_test_hint_basis(ec_basis_t *basis, ec_basis_t *basis_hint) +{ + int PASSED = 1; + + if (!ec_is_equal(&basis->P, &basis_hint->P)) { + printf("The points P do not match using the hint\n"); + PASSED = 0; + } + + if (!ec_is_equal(&basis->Q, &basis_hint->Q)) { + printf("The points Q do not match using the hint\n"); + PASSED = 0; + } + + if (!ec_is_equal(&basis->PmQ, &basis_hint->PmQ)) { + printf("The points PmQ do not match using the hint\n"); + PASSED = 0; + } + + if (PASSED == 0) { + printf("Test failed\n"); + } + + return PASSED; +} + +/****************************** +Test wrapper functions +******************************/ + +int +test_basis_generation_E0(unsigned int n) +{ + ec_basis_t basis; + ec_curve_t curve; + + ec_curve_init(&curve); + + // Set a supersingular elliptic curve + // E : y^2 = x^3 + 6*x^2 + x + fp2_set_small(&(curve.A), 0); + fp2_set_one(&(curve.C)); + ec_curve_normalize_A24(&curve); + + // Generate a basis + (void)ec_curve_to_basis_2f_to_hint(&basis, &curve, n); + + // Test result + return inner_test_generated_basis(&basis, &curve, n); +} + +int +test_basis_generation(unsigned int n) +{ + ec_basis_t basis; + ec_curve_t curve; + + ec_curve_init(&curve); + + // Set a supersingular elliptic curve + // E : y^2 = x^3 + 6*x^2 + x + fp2_set_small(&(curve.A), 6); + fp2_set_one(&(curve.C)); + ec_curve_normalize_A24(&curve); + + // Generate a basis + (void)ec_curve_to_basis_2f_to_hint(&basis, &curve, n); + + // Test result + return inner_test_generated_basis(&basis, &curve, n); +} + +int +test_basis_generation_with_hints(unsigned int n) +{ + int check_1, check_2; + ec_basis_t basis, basis_hint; + ec_curve_t curve; + ec_curve_init(&curve); + + // Set a supersingular elliptic curve + // E : y^2 = x^3 + 6*x^2 + x + fp2_set_small(&(curve.A), 6); + fp2_set_one(&(curve.C)); + ec_curve_normalize_A24(&curve); + + // Generate a basis with hints + uint8_t hint = ec_curve_to_basis_2f_to_hint(&basis, &curve, n); + + // Ensure the basis from the hint is good + check_1 = inner_test_generated_basis(&basis, &curve, n); + + // Generate a basis using hints + ec_curve_to_basis_2f_from_hint(&basis_hint, &curve, n, hint); + + // These two bases should be the same + check_2 = inner_test_hint_basis(&basis, &basis_hint); + + return check_1 && check_2; +} + +int +test_basis(void) +{ + int passed; + + // Test full order + passed = test_basis_generation(TORSION_EVEN_POWER); + passed &= test_basis_generation_with_hints(TORSION_EVEN_POWER); + + // Test partial order + passed &= test_basis_generation(128); + passed &= test_basis_generation_with_hints(128); + + // Special case when we have A = 0 + passed &= test_basis_generation_E0(TORSION_EVEN_POWER); + passed &= test_basis_generation_E0(128); + + return passed; +} + +int +main(void) +{ + bool ok; + ok = test_basis(); + if (!ok) { + printf("Tests failed!\n"); + } else { + printf("All basis generation tests passed.\n"); + } + return !ok; +} diff --git a/src/ec/ref/lvlx/test/biextension-bench.c b/src/ec/ref/lvlx/test/biextension-bench.c new file mode 100644 index 0000000..d7f94e3 --- /dev/null +++ b/src/ec/ref/lvlx/test/biextension-bench.c @@ -0,0 +1,113 @@ +#include +#include +#include +#include +#include +#include +#include "biextension.h" +#include +#include "bench.h" + +#define STRINGIFY2(x) #x +#define STRINGIFY(x) STRINGIFY2(x) + +void +biextension_bench(uint64_t bench) +{ + uint64_t t0, t1; + uint32_t e = TORSION_EVEN_POWER; + + fp2_t r1; + ec_curve_t curve; + ec_point_t tmp; + + digit_t scal_r1[NWORDS_ORDER]; + digit_t scal_r2[NWORDS_ORDER]; + digit_t scal_s1[NWORDS_ORDER]; + digit_t scal_s2[NWORDS_ORDER]; + + ec_basis_t BPQ, BRS; + + // Get constants form curve E6 : y^2 = x^3 + 6*x^2 + x + ec_curve_init(&curve); + fp2_set_small(&(curve.A), 6); + fp2_set_one(&(curve.C)); + ec_curve_normalize_A24(&curve); + + // Compute 2^e torsion on curve and copy to a second basis + (void)ec_curve_to_basis_2f_to_hint(&BPQ, &curve, e); + copy_basis(&BRS, &BPQ); + + // Benchmark doubling on the curve + printf("\n\nBenchmarking doublings\n"); + t0 = cpucycles(); + for (uint64_t i = 0; i < bench; ++i) { + ec_dbl_iter(&tmp, e, &BPQ.P, &curve); + } + t1 = cpucycles(); + printf("\x1b[34mAvg doubling: %'" PRIu64 " cycles\x1b[0m\n", (t1 - t0) / bench); + + printf("\n\nBenchmarking (Weil) pairings\n"); + t0 = cpucycles(); + for (uint64_t i = 0; i < bench; ++i) { + weil(&r1, e, &BPQ.P, &BPQ.Q, &BPQ.PmQ, &curve); + } + t1 = cpucycles(); + printf("\x1b[34mAvg pairing: %'" PRIu64 " cycles\x1b[0m\n", (t1 - t0) / bench); + + printf("\n\nBenchmarking (Weil) dlogs\n"); + t0 = cpucycles(); + for (uint64_t i = 0; i < bench; ++i) { + ec_dlog_2_weil(scal_r1, scal_r2, scal_s1, scal_s2, &BPQ, &BRS, &curve, e); + } + t1 = cpucycles(); + printf("\x1b[34mAvg pairing dlog: %'" PRIu64 " cycles\x1b[0m\n", (t1 - t0) / bench); + + printf("\n\nBenchmarking (Tate) dlogs\n"); + t0 = cpucycles(); + for (uint64_t i = 0; i < bench; ++i) { + ec_dlog_2_tate(scal_r1, scal_r2, scal_s1, scal_s2, &BPQ, &BRS, &curve, e); + } + t1 = cpucycles(); + printf("\x1b[34mAvg Tate dlog: %'" PRIu64 " cycles\x1b[0m\n", (t1 - t0) / bench); +} + +int +main(int argc, char *argv[]) +{ + int iterations = 1000 * SQISIGN_TEST_REPS; + int help = 0; + +#ifndef NDEBUG + fprintf(stderr, + "\x1b[31mIt looks like SQIsign was compiled with assertions enabled.\n" + "This will severely impact performance measurements.\x1b[0m\n"); +#endif + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + } + + if (help || iterations <= 0) { + printf("Usage: %s [--iterations=]\n", argv[0]); + printf("Where is the number of iterations used for benchmarking; if not " + "present, uses the default: %d)\n", + iterations); + return 1; + } + + cpucycles_init(); + + printf("Running biextension benchmarks for " STRINGIFY(SQISIGN_VARIANT) ":\n\n"); + + biextension_bench(iterations); + + return 0; +} diff --git a/src/ec/ref/lvlx/test/biextension-test.c b/src/ec/ref/lvlx/test/biextension-test.c new file mode 100644 index 0000000..40321e7 --- /dev/null +++ b/src/ec/ref/lvlx/test/biextension-test.c @@ -0,0 +1,259 @@ +#include +#include +#include +#include +#include +#include +#include "biextension.h" +#include +#include + +void +fp2_exp_2e(fp2_t *r, uint32_t e, const fp2_t *x) +{ + fp2_copy(r, x); + for (uint32_t i = 0; i < e; i++) { + fp2_sqr(r, r); + } +} + +void +biextension_test() +{ + clock_t t; + ec_curve_t curve; + ec_basis_t even_torsion; + uint32_t e = TORSION_EVEN_POWER; + fp2_t one, r1, rr1, rrr1, r2, r3, tp; + ec_point_t P, Q, PmQ, A24; + ec_point_t tmp, tmp2, PQ, PP, QQ, PPQ, PQQ, PPP, QQQ, PPPQ, PQQQ; + + // Get constants form curve E6 : y^2 = x^3 + 6*x^2 + x + ec_curve_init(&curve); + fp2_set_small(&(curve.A), 6); + fp2_set_one(&(curve.C)); + ec_curve_normalize_A24(&curve); + copy_point(&A24, &curve.A24); + + // Compute 2^e torsion on curve + (void)ec_curve_to_basis_2f_to_hint(&even_torsion, &curve, e); + copy_point(&P, &even_torsion.P); + copy_point(&Q, &even_torsion.Q); + copy_point(&PmQ, &even_torsion.PmQ); + + printf("Testing order of points\n"); + t = tic(); + ec_dbl_iter(&tmp, e, &P, &curve); + TOC_clock(t, "Doublings"); + assert(ec_is_zero(&tmp)); + ec_dbl_iter(&tmp, e, &Q, &curve); + assert(ec_is_zero(&tmp)); + ec_dbl_iter(&tmp, e, &PmQ, &curve); + assert(ec_is_zero(&tmp)); + + printf("Computing Weil pairing\n"); + xADD(&PQ, &P, &Q, &PmQ); + t = tic(); + + weil(&r1, e, &P, &Q, &PQ, &curve); + TOC_clock(t, "Weil pairing"); + + printf("Computing Tate pairing\n"); + t = tic(); + + reduced_tate(&tp, e, &P, &Q, &PQ, &curve); + TOC_clock(t, "Tate pairing"); + + printf("Testing order of Weil pairing\n"); + fp2_set_one(&one); + fp2_exp_2e(&r2, e - 1, &r1); + assert(!fp2_is_equal(&r2, &one)); + fp2_exp_2e(&r2, e, &r1); + assert(fp2_is_equal(&r2, &one)); + + printf("Testing order of Tate pairing\n"); + fp2_set_one(&one); + fp2_exp_2e(&r2, e - 1, &tp); + assert(!fp2_is_equal(&r2, &one)); + fp2_exp_2e(&r2, e, &tp); + assert(fp2_is_equal(&r2, &one)); + + printf("Bilinearity tests\n"); + weil(&r2, e, &P, &Q, &PmQ, &curve); + fp2_inv(&r2); + assert(fp2_is_equal(&r1, &r2)); + + xDBL_A24(&PP, &P, &A24, false); + xDBL_A24(&QQ, &Q, &A24, false); + xADD(&PPQ, &PQ, &P, &Q); + xADD(&PQQ, &PQ, &Q, &P); + + weil(&r2, e, &PP, &Q, &PPQ, &curve); + weil(&r3, e, &P, &QQ, &PQQ, &curve); + assert(fp2_is_equal(&r2, &r3)); + fp2_sqr(&rr1, &r1); + assert(fp2_is_equal(&rr1, &r2)); + + xADD(&PPP, &PP, &P, &P); + xADD(&QQQ, &QQ, &Q, &Q); + xADD(&PPPQ, &PPQ, &P, &PQ); + xADD(&PQQQ, &PQQ, &Q, &PQ); + weil(&r2, e, &PPP, &Q, &PPPQ, &curve); + weil(&r3, e, &P, &QQQ, &PQQQ, &curve); + assert(fp2_is_equal(&r2, &r3)); + fp2_mul(&rrr1, &rr1, &r1); + assert(fp2_is_equal(&rrr1, &r2)); + + printf("dlog tests\n"); + ec_basis_t BPQ, BRS; + digit_t scal_r1[NWORDS_ORDER] = { 0 }; + digit_t scal_r2[NWORDS_ORDER] = { 0 }; + digit_t scal_s1[NWORDS_ORDER] = { 0 }; + digit_t scal_s2[NWORDS_ORDER] = { 0 }; + digit_t scal_d1[NWORDS_ORDER] = { 0 }; + digit_t scal_d2[NWORDS_ORDER] = { 0 }; + + // original even torsion + BPQ = even_torsion; + BRS = even_torsion; + + // alternative torsion, just mix the points up a little... + // not filling top word so the addition below can overflow into it + // so the scalars are "random enough" but we still keep the difference + // scal_d1 and scal_d2 required to compute the right multiple of RmS + randombytes((unsigned char *)scal_d1, (NWORDS_ORDER - 1) * sizeof(digit_t)); + randombytes((unsigned char *)scal_d2, (NWORDS_ORDER - 1) * sizeof(digit_t)); + randombytes((unsigned char *)scal_s1, (NWORDS_ORDER - 1) * sizeof(digit_t)); + randombytes((unsigned char *)scal_s2, (NWORDS_ORDER - 1) * sizeof(digit_t)); + + // Ensure that r1*s2 - r2*s1 is odd such that the matrix + // [[r1, r2], [s1, s2]] is invertible + scal_s1[0] = (scal_s1[0] & ((digit_t)(-1) - 1)) + 1; // s1 needs to be odd + scal_d1[0] = (scal_d1[0] & ((digit_t)(-1) - 1)); // d1 needs to be even to make r1 odd + scal_s2[0] = (scal_s2[0] & ((digit_t)(-1) - 1)) + 1; // s2 needs to be odd + scal_d2[0] = (scal_d2[0] & ((digit_t)(-1) - 1)) + 1; // d2 needs to be odd to make r2 even + + // Compute r1 and r2 from the difference di = ri - si + mp_add(scal_r1, scal_d1, scal_s1, NWORDS_ORDER); + mp_add(scal_r2, scal_d2, scal_s2, NWORDS_ORDER); + + ec_biscalar_mul(&BRS.P, scal_r1, scal_r2, e, &BPQ, &curve); + ec_biscalar_mul(&BRS.Q, scal_s1, scal_s2, e, &BPQ, &curve); + ec_biscalar_mul(&BRS.PmQ, scal_d1, scal_d2, e, &BPQ, &curve); + + printf("mixed\n"); + + // Now solve the discrete log + ec_dlog_2_weil(scal_r1, scal_r2, scal_s1, scal_s2, &BPQ, &BRS, &curve, e); + + // assert everything matches + // R = [r1]P + [r2]Q + ec_biscalar_mul(&tmp, scal_r1, scal_r2, e, &BPQ, &curve); + assert(ec_is_equal(&tmp, &BRS.P)); + + // S = [s1]P + [s2]Q + ec_biscalar_mul(&tmp, scal_s1, scal_s2, e, &BPQ, &curve); + assert(ec_is_equal(&tmp, &BRS.Q)); + + printf("weil solved\n"); + + // now repeat using the tate pairing + ec_dlog_2_tate(scal_r1, scal_r2, scal_s1, scal_s2, &BPQ, &BRS, &curve, e); + + // assert everything matches + // R = [r1]P + [r2]Q + ec_biscalar_mul(&tmp, scal_r1, scal_r2, e, &BPQ, &curve); + assert(ec_is_equal(&tmp, &BRS.P)); + + // S = [s1]P + [s2]Q + ec_biscalar_mul(&tmp, scal_s1, scal_s2, e, &BPQ, &curve); + assert(ec_is_equal(&tmp, &BRS.Q)); + + printf("tate solved\n"); + + // now we try with bases for partial torsion E[2^e] with e < e_full + int e_full = TORSION_EVEN_POWER; + int e_partial = 126; + + ec_dbl_iter(&BRS.P, e_full - e_partial, &BRS.P, &curve); + ec_dbl_iter(&BRS.Q, e_full - e_partial, &BRS.Q, &curve); + ec_dbl_iter(&BRS.PmQ, e_full - e_partial, &BRS.PmQ, &curve); + + ec_dlog_2_tate(scal_r1, scal_r2, scal_s1, scal_s2, &BPQ, &BRS, &curve, e_partial); + + ec_biscalar_mul(&tmp, scal_r1, scal_r2, e, &BPQ, &curve); + ec_dbl_iter(&tmp, e_full - e_partial, &tmp, &curve); + assert(ec_is_equal(&tmp, &BRS.P)); + + // S = [s1]P + [s2]Q + // then S = [2^e_diff] S + ec_biscalar_mul(&tmp, scal_s1, scal_s2, e, &BPQ, &curve); + ec_dbl_iter(&tmp, e_full - e_partial, &tmp, &curve); + assert(ec_is_equal(&tmp, &BRS.Q)); + + printf("tate from full basis solved\n"); + + ec_dlog_2_tate(scal_r1, scal_r2, scal_s1, scal_s2, &BPQ, &BRS, &curve, e_partial); + mp_invert_matrix(scal_r1, scal_r2, scal_s1, scal_s2, e_partial, NWORDS_ORDER); + + // assert everything matches + ec_biscalar_mul(&tmp, scal_r1, scal_r2, e, &BRS, &curve); + ec_dbl_iter(&tmp2, e_full - e_partial, &BPQ.P, &curve); + assert(ec_is_equal(&tmp, &tmp2)); + + ec_biscalar_mul(&tmp, scal_s1, scal_s2, e, &BRS, &curve); + ec_dbl_iter(&tmp2, e_full - e_partial, &BPQ.Q, &curve); + assert(ec_is_equal(&tmp, &tmp2)); + + printf("tate to full basis solved\n"); +} + +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int help = 0; + int seed_set = 0; + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + } + + if (help) { + printf("Usage: %s [--seed=]\n", argv[0]); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + + printf("Running biextension unit tests\n"); + + biextension_test(); + + // Failures will be caught by asserts in biextension_test + printf("\nAll tests passed!\n"); + + return 0; +} diff --git a/src/ec/ref/lvlx/test/curve-arith-bench.c b/src/ec/ref/lvlx/test/curve-arith-bench.c new file mode 100644 index 0000000..3dc3158 --- /dev/null +++ b/src/ec/ref/lvlx/test/curve-arith-bench.c @@ -0,0 +1,163 @@ +#include +#include +#include +#include +#include + +#include "test_extras.h" +#include +#include +#include + +#define STRINGIFY2(x) #x +#define STRINGIFY(x) STRINGIFY2(x) + +uint64_t +bench_xDBL(unsigned int Nbench) +{ + uint64_t cycles0, cycles1; + unsigned int i; + ec_point_t P[Nbench], A24[Nbench]; + for (i = 0; i < Nbench; i++) { + fp2_random_test(&(P[i].x)); + fp2_random_test(&(P[i].z)); + fp2_random_test(&(A24[i].x)); + fp2_random_test(&(A24[i].z)); + } + cycles0 = cpucycles(); + for (i = 0; i < Nbench; i++) { + xDBL(&P[i], &P[i], &A24[i]); + } + cycles1 = cpucycles(); + return cycles1 - cycles0; +} + +uint64_t +bench_xEVAL4(unsigned int Nbench) +{ + uint64_t cycles0, cycles1; + unsigned int i; + ec_point_t P[Nbench]; + ec_kps4_t KPS[Nbench]; + for (i = 0; i < Nbench; i++) { + fp2_random_test(&(P[i].x)); + fp2_random_test(&(P[i].z)); + for (int j = 0; j < 3; j++) { + fp2_random_test(&(KPS[i].K[j].x)); + fp2_random_test(&(KPS[i].K[j].z)); + } + } + cycles0 = cpucycles(); + for (i = 0; i < Nbench; i++) { + xeval_4(&P[i], &P[i], 1, &KPS[i]); + } + cycles1 = cpucycles(); + return cycles1 - cycles0; +} + +uint64_t +bench_isog_strategy(unsigned int Nbench) +{ + uint64_t cycles0, cycles1; + unsigned int i; + ec_curve_t E0; + ec_isog_even_t phi[Nbench]; + ec_basis_t basis2; + ec_curve_init(&E0); + fp2_set_small(&(E0.A), 6); + fp2_set_one(&(E0.C)); + (void)ec_curve_to_basis_2f_to_hint(&basis2, &E0, TORSION_EVEN_POWER); + for (i = 0; i < Nbench; i++) { + copy_curve(&phi[i].curve, &E0); + phi[i].length = TORSION_EVEN_POWER; + if (i == 0) { + xADD(&phi[i].kernel, &basis2.P, &basis2.Q, &basis2.PmQ); + } + if (i == 1) { + xADD(&phi[i].kernel, &phi[i - 1].kernel, &basis2.Q, &basis2.P); + } + if (i > 1) { + xADD(&phi[i].kernel, &phi[i - 1].kernel, &basis2.Q, &phi[i - 2].kernel); + } + } + cycles0 = cpucycles(); + for (i = 2; i < Nbench; i++) { + if (ec_eval_even(&phi[i].curve, &phi[i], NULL, 0)) { + printf("Failed isogeny strategy\n"); + return 0; + } + } + cycles1 = cpucycles(); + return cycles1 - cycles0; +} + +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int iterations = 100 * SQISIGN_TEST_REPS; + int help = 0; + int seed_set = 0; + +#ifndef NDEBUG + fprintf(stderr, + "\x1b[31mIt looks like SQIsign was compiled with assertions enabled.\n" + "This will severely impact performance measurements.\x1b[0m\n"); +#endif + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + } + + if (help || iterations <= 0) { + printf("Usage: %s [--iterations=] [--seed=]\n", argv[0]); + printf("Where is the number of iterations used for benchmarking; if not " + "present, uses the default: %d)\n", + iterations); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + cpucycles_init(); + + printf("Benchmarking elliptic curve arithmetic for " STRINGIFY(SQISIGN_VARIANT) ":\n\n"); + + uint64_t cycles; + + cycles = bench_xDBL(10 * iterations); + printf("Bench xDBL_A24:\t%" PRIu64 " cycles\n", cycles / (10 * iterations)); + + cycles = bench_xEVAL4(iterations); + printf("Bench xEVAL4:\t%" PRIu64 " cycles\n", cycles / iterations); + + cycles = bench_isog_strategy(iterations); + printf("Bench isog strategy:\t%" PRIu64 " cycles\n", cycles / iterations); + + return 0; +} diff --git a/src/ec/ref/lvlx/test/curve-arith-test.c b/src/ec/ref/lvlx/test/curve-arith-test.c new file mode 100644 index 0000000..b895342 --- /dev/null +++ b/src/ec/ref/lvlx/test/curve-arith-test.c @@ -0,0 +1,404 @@ +#include +#include +#include + +#include "test_extras.h" +#include +#include +#include +#include + +/****************************** +Test functions +******************************/ + +int +test_xDBL_xADD(const ec_curve_t *curve, unsigned int Ntest) +{ + unsigned int i; + + ec_point_t P, Q, PQ, R1, R2; + + for (i = 0; i < Ntest; i++) { + ec_random_test(&P, curve); + ec_random_test(&Q, curve); + projective_difference_point(&PQ, &P, &Q, curve); + + // 2(P + Q) = 2P + 2Q + xADD(&R1, &P, &Q, &PQ); + ec_dbl(&R1, &R1, curve); + ec_dbl(&P, &P, curve); + ec_dbl(&Q, &Q, curve); + ec_dbl(&PQ, &PQ, curve); + xADD(&R2, &P, &Q, &PQ); + if (!ec_is_equal(&R1, &R2)) { + printf("Failed 2(P + Q) = 2P + 2Q\n"); + return 1; + } + + // (P+Q) + (P-Q) = 2P + xADD(&R1, &P, &Q, &PQ); + ec_dbl(&Q, &Q, curve); + xADD(&R1, &R1, &PQ, &Q); + ec_dbl(&P, &P, curve); + ec_dbl(&PQ, &PQ, curve); + if (!ec_is_equal(&R1, &P)) { + printf("Failed (P+Q) + (P-Q) = 2P\n"); + return 1; + } + } + + return 0; +} + +int +test_xDBLADD(const ec_curve_t *curve, unsigned int Ntest) +{ + unsigned int i; + + ec_point_t P, Q, PQ, R1, R2; + + ec_point_t A24; + AC_to_A24(&A24, curve); + + for (i = 0; i < Ntest; i++) { + ec_random_test(&P, curve); + ec_random_test(&Q, curve); + projective_difference_point(&PQ, &P, &Q, curve); + + xDBLADD(&R1, &R2, &P, &Q, &PQ, &A24, false); + xADD(&PQ, &P, &Q, &PQ); + if (!ec_is_equal(&R2, &PQ)) { + printf("Failed addition in xDBLADD\n"); + return 1; + } + ec_dbl(&P, &P, curve); + if (!ec_is_equal(&R1, &P)) { + printf("Failed doubling in xDBLADD\n"); + return 1; + } + } + return 0; +} + +int +test_xDBL_variants(ec_curve_t *curve, unsigned int Ntest) +{ + unsigned int i; + ec_curve_t E; + ec_point_t P, R1, R2, R3, R4; + ec_point_t A24, A24norm; + fp2_t z; + + AC_to_A24(&A24, curve); + copy_point(&A24norm, &A24); + ec_normalize_point(&A24norm); + + // Randomize projective representation + copy_curve(&E, curve); + fp2_random_test(&z); + fp2_mul(&(E.A24.x), &(A24.x), &z); + fp2_mul(&(E.A24.z), &(A24.z), &z); + E.is_A24_computed_and_normalized = false; + + for (i = 0; i < Ntest; i++) { + ec_random_test(&P, curve); + xDBL(&R1, &P, (const ec_point_t *)curve); + xDBL_A24(&R2, &P, &(E.A24), false); + xDBL_A24(&R3, &P, &A24norm, true); + xDBL_E0(&R4, &P); + if (!ec_is_equal(&R1, &R2)) { + printf("xDBL and xDBL_A24 dont match\n"); + return 1; + } + if (!ec_is_equal(&R1, &R3)) { + printf("xDBL and xDBL_A24 normalized dont match\n"); + return 1; + } + if (!ec_is_equal(&R1, &R4)) { + printf("xDBL and xDBL_E0 dont match\n"); + return 1; + } + } + return 0; +} + +int +test_zero_identities(ec_curve_t *curve, unsigned int Ntest) +{ + unsigned int i; + + ec_point_t P, Q, R, ec_zero; + + fp2_set_one(&(P.x)); + fp2_set_zero(&(P.z)); + + fp2_set_one(&(ec_zero.x)); + fp2_set_zero(&(ec_zero.z)); + + assert(ec_is_zero(&P)); + + for (i = 0; i < Ntest; i++) { + ec_random_test(&P, curve); + + xADD(&R, &ec_zero, &ec_zero, &ec_zero); + if (!ec_is_zero(&R)) { + printf("Failed 0 + 0 = 0\n"); + return 1; + } + + ec_dbl(&R, &P, curve); + xADD(&R, &P, &P, &R); + if (!ec_is_zero(&R)) { + printf("Failed P - P = 0\n"); + return 1; + } + + ec_dbl(&R, &ec_zero, curve); + if (!ec_is_zero(&R)) { + printf("Failed 2*0 = 0\n"); + return 1; + } + + xADD(&R, &P, &ec_zero, &P); + if (!ec_is_equal(&R, &P)) { + printf("Failed P + 0 = P\n"); + return 1; + } + xADD(&R, &ec_zero, &P, &P); + if (!ec_is_equal(&R, &P)) { + printf("Failed P + 0 = P\n"); + return 1; + } + + xDBLADD(&R, &Q, &P, &ec_zero, &P, &curve->A24, false); + if (!ec_is_equal(&Q, &P)) { + printf("Failed P + 0 = P in xDBLADD\n"); + return 1; + } + xDBLADD(&R, &Q, &ec_zero, &P, &P, &curve->A24, false); + if (!ec_is_equal(&Q, &P)) { + printf("Failed P + 0 = P in xDBLADD\n"); + return 1; + } + if (!ec_is_zero(&R)) { + printf("Failed 2*0 = 0 in xDBLADD\n"); + return 1; + } + } + return 0; +} + +int +test_jacobian(const ec_curve_t *curve, unsigned int Ntest) +{ + unsigned int i; + + ec_point_t P, Q; + jac_point_t R, S, T, U, jac_zero; + fp2_t t0, t1; + + jac_init(&jac_zero); + + for (i = 0; i < Ntest; i++) { + ec_random_test(&P, curve); + ec_normalize_point(&P); + ec_random_test(&Q, curve); + ec_normalize_point(&Q); + + /* Convert to Jacobian coordinates. */ + fp2_copy(&(S.x), &(P.x)); + ec_recover_y(&(S.y), &(S.x), curve); + fp2_set_one(&(S.z)); + fp2_copy(&(T.x), &(Q.x)); + ec_recover_y(&(T.y), &(T.x), curve); + fp2_set_one(&(T.z)); + + ADD(&R, &jac_zero, &jac_zero, curve); + if (!jac_is_equal(&R, &jac_zero)) { + printf("Failed 0 + 0 = 0 in jac\n"); + return 1; + } + + DBL(&R, &jac_zero, curve); + if (!jac_is_equal(&R, &jac_zero)) { + printf("Failed 2*0 = 0 in jac\n"); + return 1; + } + + jac_neg(&R, &S); + ADD(&R, &S, &R, curve); + if (!jac_is_equal(&R, &jac_zero)) { + printf("Failed P - P = 0 in jac\n"); + return 1; + } + + ADD(&R, &S, &jac_zero, curve); + if (!jac_is_equal(&R, &S)) { + printf("Failed P + 0 = P in jac\n"); + return 1; + } + ADD(&R, &jac_zero, &S, curve); + if (!jac_is_equal(&R, &S)) { + printf("Failed P + 0 = P in jac\n"); + return 1; + } + ADD(&R, &S, &jac_zero, curve); + if (!jac_is_equal(&R, &S)) { + printf("Failed 0 + P = P in jac\n"); + return 1; + } + + DBL(&R, &S, curve); + ADD(&U, &S, &S, curve); + if (!jac_is_equal(&R, &U)) { + printf("Failed P + P = 2*P in jac\n"); + return 1; + } + + ADD(&R, &T, &S, curve); + ADD(&T, &S, &T, curve); + if (!jac_is_equal(&R, &T)) { + printf("Failed P + Q = Q + P in jac\n"); + return 1; + } + ADD(&R, &T, &S, curve); + ADD(&U, &S, &T, curve); + if (!jac_is_equal(&R, &U)) { + printf("Failed P + Q = Q + P in jac\n"); + return 1; + } + + // Double R to make it different than (T + S). + DBL(&R, &R, curve); + ADD(&U, &S, &T, curve); + ADD(&U, &U, &R, curve); + ADD(&R, &R, &T, curve); + ADD(&R, &R, &S, curve); + if (!jac_is_equal(&R, &U)) { + printf("Failed (P + Q) + R = P + (Q + R) in jac\n"); + return 1; + } + + jac_to_ws(&R, &t0, &t1, &jac_zero, curve); + jac_from_ws(&R, &R, &t1, curve); + if (!jac_is_equal(&R, &jac_zero)) { + printf("Failed converting to Weierstrass\n"); + return 1; + } + + jac_to_ws(&R, &t0, &t1, &S, curve); + jac_from_ws(&R, &R, &t1, curve); + if (!jac_is_equal(&S, &R)) { + printf("Failed converting to Weierstrass\n"); + return 1; + } + DBL(&S, &S, curve); + jac_to_ws(&R, &t0, &t1, &S, curve); + jac_from_ws(&R, &R, &t1, curve); + if (!jac_is_equal(&S, &R)) { + printf("Failed converting to Weierstrass\n"); + return 1; + } + + jac_to_ws(&R, &t0, &t1, &jac_zero, curve); + DBLW(&R, &t0, &R, &t0); + jac_from_ws(&R, &R, &t1, curve); + if (!jac_is_equal(&R, &jac_zero)) { + printf("Failed 2*0 = 0 in Weierstrass\n"); + return 1; + } + jac_to_ws(&R, &t0, &t1, &S, curve); + DBLW(&R, &t0, &R, &t0); + jac_from_ws(&R, &R, &t1, curve); + DBL(&S, &S, curve); + if (!jac_is_equal(&S, &R)) { + printf("Failed doubling in Weierstrass\n"); + return 1; + } + } + return 0; +} + +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int iterations = 100 * SQISIGN_TEST_REPS; + int help = 0; + int seed_set = 0; + int res = 0; + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + } + + if (help || iterations <= 0) { + printf("Usage: %s [--iterations=] [--seed=]\n", argv[0]); + printf("Where is the number of iterations used for testing; if not " + "present, uses the default: %d)\n", + iterations); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + + // Curve A=6 + ec_curve_t curve; + ec_curve_init(&curve); + fp2_set_small(&(curve.A), 0); + fp2_set_small(&(curve.C), 1); + // fp2_random_test(&(curve.C)); + // fp2_mul(&(curve.A), &(curve.A), &(curve.C)); + ec_curve_normalize_A24(&curve); + + res |= test_xDBL_xADD(&curve, iterations); + res |= test_xDBLADD(&curve, iterations); + res |= test_xDBL_variants(&curve, iterations); + res |= test_zero_identities(&curve, iterations); + res |= test_jacobian(&curve, iterations); + + fp2_random_test(&(curve.C)); + fp2_mul(&(curve.A), &(curve.A), &(curve.C)); + ec_curve_normalize_A24(&curve); + + res |= test_xDBL_xADD(&curve, iterations); + res |= test_xDBLADD(&curve, iterations); + res |= test_xDBL_variants(&curve, iterations); + res |= test_zero_identities(&curve, iterations); + res |= test_jacobian(&curve, iterations); + + if (res) { + printf("Tests failed!\n"); + } else { + printf("All ec arithmetic tests passed.\n"); + } + + return res; +} diff --git a/src/ec/ref/lvlx/test/test_extras.c b/src/ec/ref/lvlx/test/test_extras.c new file mode 100644 index 0000000..f2be495 --- /dev/null +++ b/src/ec/ref/lvlx/test/test_extras.c @@ -0,0 +1,116 @@ +#include "test_extras.h" +#include "rng.h" + +// Make n random-ish field elements (for tests only!). +void +fp_random_test(fp_t *a) +{ + uint8_t tmp[FP_ENCODED_BYTES]; + + randombytes(tmp, sizeof(tmp)); + + fp_decode_reduce(a, tmp, sizeof(tmp)); +} + +void +fp2_random_test(fp2_t *a) +{ + fp_random_test(&(a->re)); + fp_random_test(&(a->im)); +} + +// Given an x-coordinate, determines if this is a valid +// point on the curve. Assumes C=1. +static uint32_t +projective_is_on_curve(const ec_point_t *P, const ec_curve_t *curve) +{ + + fp2_t t0, t1, t2; + + // Check if xz*(C^2x^2+zACx+z^2C^2) is a square + fp2_mul(&t0, &curve->C, &P->x); + fp2_mul(&t1, &t0, &P->z); + fp2_mul(&t1, &t1, &curve->A); + fp2_mul(&t2, &curve->C, &P->z); + fp2_sqr(&t0, &t0); + fp2_sqr(&t2, &t2); + fp2_add(&t0, &t0, &t1); + fp2_add(&t0, &t0, &t2); + fp2_mul(&t0, &t0, &P->x); + fp2_mul(&t0, &t0, &P->z); + return fp2_is_square(&t0) || fp2_is_zero(&t0); +} + +void +ec_random_normalized_test(ec_point_t *P, const ec_curve_t *curve) +{ + fp2_set_one(&P->z); + while (1) { + fp2_random_test(&P->x); + if (projective_is_on_curve(P, curve)) { + break; + } + } +} + +void +ec_random_test(ec_point_t *P, const ec_curve_t *curve) +{ + ec_random_normalized_test(P, curve); + fp2_random_test(&P->z); + fp2_mul(&P->x, &P->x, &P->z); +} + +void +projective_difference_point(ec_point_t *PQ, const ec_point_t *P, const ec_point_t *Q, const ec_curve_t *curve) +{ + // Given P,Q in projective x-only, computes a deterministic choice for (P-Q) + // Based on Proposition 3 of https://eprint.iacr.org/2017/518.pdf + + fp2_t Bxx, Bxz, Bzz, t0, t1; + + fp2_mul(&t0, &P->x, &Q->x); + fp2_mul(&t1, &P->z, &Q->z); + fp2_sub(&Bxx, &t0, &t1); + fp2_sqr(&Bxx, &Bxx); + fp2_mul(&Bxx, &Bxx, &curve->C); // C*(P.x*Q.x-P.z*Q.z)^2 + fp2_add(&Bxz, &t0, &t1); + fp2_mul(&t0, &P->x, &Q->z); + fp2_mul(&t1, &P->z, &Q->x); + fp2_add(&Bzz, &t0, &t1); + fp2_mul(&Bxz, &Bxz, &Bzz); // (P.x*Q.x+P.z*Q.z)(P.x*Q.z+P.z*Q.x) + fp2_sub(&Bzz, &t0, &t1); + fp2_sqr(&Bzz, &Bzz); + fp2_mul(&Bzz, &Bzz, &curve->C); // C*(P.x*Q.z-P.z*Q.x)^2 + fp2_mul(&Bxz, &Bxz, &curve->C); // C*(P.x*Q.x+P.z*Q.z)(P.x*Q.z+P.z*Q.x) + fp2_mul(&t0, &t0, &t1); + fp2_mul(&t0, &t0, &curve->A); + fp2_add(&t0, &t0, &t0); + fp2_add(&Bxz, &Bxz, &t0); // C*(P.x*Q.x+P.z*Q.z)(P.x*Q.z+P.z*Q.x) + 2*A*P.x*Q.z*P.z*Q.x + + // Normalization: our squareroot always has the same sign as long as P.z, Q.z, and C + // are in Fp and C is a square, so the B's should be scaled by C*C_bar^2*P.z_bar^2*Q.Z_bar^2 + fp_copy(&t0.re, &curve->C.re); + fp_neg(&t0.im, &curve->C.im); + fp2_sqr(&t0, &t0); + fp2_mul(&t0, &t0, &curve->C); + fp_copy(&t1.re, &P->z.re); + fp_neg(&t1.im, &P->z.im); + fp2_sqr(&t1, &t1); + fp2_mul(&t0, &t0, &t1); + fp_copy(&t1.re, &Q->z.re); + fp_neg(&t1.im, &Q->z.im); + fp2_sqr(&t1, &t1); + fp2_mul(&t0, &t0, &t1); + fp2_mul(&Bxx, &Bxx, &t0); + fp2_mul(&Bxz, &Bxz, &t0); + fp2_mul(&Bzz, &Bzz, &t0); + + // Solving quadratic equation + fp2_sqr(&t0, &Bxz); + fp2_mul(&t1, &Bxx, &Bzz); + fp2_sub(&t0, &t0, &t1); + fp2_sqrt(&t0); + fp2_add(&PQ->x, &Bxz, &t0); + fp2_copy(&PQ->z, &Bzz); +} diff --git a/src/ec/ref/lvlx/test/test_extras.h b/src/ec/ref/lvlx/test/test_extras.h new file mode 100644 index 0000000..fb3d896 --- /dev/null +++ b/src/ec/ref/lvlx/test/test_extras.h @@ -0,0 +1,43 @@ + +#ifndef TEST_EXTRAS_H +#define TEST_EXTRAS_H + +#include +#include +#include +#include +#include +#include +#include + +#define PASSED 0 +#define FAILED 1 + +// Generating a pseudo-random field element in [0, p-1] +void fp_random_test(fp_t *a); + +// Generating a pseudo-random element in GF(p^2) +void fp2_random_test(fp2_t *a); + +// Generating a random projective x-only point +void ec_random_test(ec_point_t *P, const ec_curve_t *curve); + +// Generating a random projective x-only point and normalizing it +void ec_random_normalized_test(ec_point_t *P, const ec_curve_t *curve); + +// Point difference +void projective_difference_point(ec_point_t *PQ, const ec_point_t *P, const ec_point_t *Q, const ec_curve_t *curve); + +// xDBL +void xDBL(ec_point_t *Q, const ec_point_t *P, const ec_point_t *AC); + +// Double-and-add +extern void xDBLADD(ec_point_t *R, + ec_point_t *S, + const ec_point_t *P, + const ec_point_t *Q, + const ec_point_t *PQ, + const ec_point_t *A24, + const bool A24_normalized); + +#endif diff --git a/src/ec/ref/lvlx/xeval.c b/src/ec/ref/lvlx/xeval.c new file mode 100644 index 0000000..7fc7170 --- /dev/null +++ b/src/ec/ref/lvlx/xeval.c @@ -0,0 +1,64 @@ +#include "isog.h" +#include "ec.h" +#include + +// ----------------------------------------------------------------------------------------- +// ----------------------------------------------------------------------------------------- + +// Degree-2 isogeny evaluation with kenerl generated by P != (0, 0) +void +xeval_2(ec_point_t *R, ec_point_t *const Q, const int lenQ, const ec_kps2_t *kps) +{ + fp2_t t0, t1, t2; + for (int j = 0; j < lenQ; j++) { + fp2_add(&t0, &Q[j].x, &Q[j].z); + fp2_sub(&t1, &Q[j].x, &Q[j].z); + fp2_mul(&t2, &kps->K.x, &t1); + fp2_mul(&t1, &kps->K.z, &t0); + fp2_add(&t0, &t2, &t1); + fp2_sub(&t1, &t2, &t1); + fp2_mul(&R[j].x, &Q[j].x, &t0); + fp2_mul(&R[j].z, &Q[j].z, &t1); + } +} + +void +xeval_2_singular(ec_point_t *R, const ec_point_t *Q, const int lenQ, const ec_kps2_t *kps) +{ + fp2_t t0, t1; + for (int i = 0; i < lenQ; i++) { + fp2_mul(&t0, &Q[i].x, &Q[i].z); + fp2_mul(&t1, &kps->K.x, &Q[i].z); + fp2_add(&t1, &t1, &Q[i].x); + fp2_mul(&t1, &t1, &Q[i].x); + fp2_sqr(&R[i].x, &Q[i].z); + fp2_add(&R[i].x, &R[i].x, &t1); + fp2_mul(&R[i].z, &t0, &kps->K.z); + } +} + +// Degree-4 isogeny evaluation with kenerl generated by P such that [2]P != (0, 0) +void +xeval_4(ec_point_t *R, const ec_point_t *Q, const int lenQ, const ec_kps4_t *kps) +{ + const ec_point_t *K = kps->K; + + fp2_t t0, t1; + + for (int i = 0; i < lenQ; i++) { + fp2_add(&t0, &Q[i].x, &Q[i].z); + fp2_sub(&t1, &Q[i].x, &Q[i].z); + fp2_mul(&(R[i].x), &t0, &K[1].x); + fp2_mul(&(R[i].z), &t1, &K[2].x); + fp2_mul(&t0, &t0, &t1); + fp2_mul(&t0, &t0, &K[0].x); + fp2_add(&t1, &(R[i].x), &(R[i].z)); + fp2_sub(&(R[i].z), &(R[i].x), &(R[i].z)); + fp2_sqr(&t1, &t1); + fp2_sqr(&(R[i].z), &(R[i].z)); + fp2_add(&(R[i].x), &t0, &t1); + fp2_sub(&t0, &t0, &(R[i].z)); + fp2_mul(&(R[i].x), &(R[i].x), &t1); + fp2_mul(&(R[i].z), &(R[i].z), &t0); + } +} diff --git a/src/ec/ref/lvlx/xisog.c b/src/ec/ref/lvlx/xisog.c new file mode 100644 index 0000000..7242d29 --- /dev/null +++ b/src/ec/ref/lvlx/xisog.c @@ -0,0 +1,61 @@ +#include "isog.h" +#include "ec.h" +#include + +// ------------------------------------------------------------------------- +// ------------------------------------------------------------------------- + +// Degree-2 isogeny with kernel generated by P != (0 ,0) +// Outputs the curve coefficient in the form A24=(A+2C:4C) +void +xisog_2(ec_kps2_t *kps, ec_point_t *B, const ec_point_t P) +{ + fp2_sqr(&B->x, &P.x); + fp2_sqr(&B->z, &P.z); + fp2_sub(&B->x, &B->z, &B->x); + fp2_add(&kps->K.x, &P.x, &P.z); + fp2_sub(&kps->K.z, &P.x, &P.z); +} + +void +xisog_2_singular(ec_kps2_t *kps, ec_point_t *B24, ec_point_t A24) +{ + // No need to check the square root, only used for signing. + fp2_t t0, four; + fp2_set_small(&four, 4); + fp2_add(&t0, &A24.x, &A24.x); + fp2_sub(&t0, &t0, &A24.z); + fp2_add(&t0, &t0, &t0); + fp2_inv(&A24.z); + fp2_mul(&t0, &t0, &A24.z); + fp2_copy(&kps->K.x, &t0); + fp2_add(&B24->x, &t0, &t0); + fp2_sqr(&t0, &t0); + fp2_sub(&t0, &t0, &four); + fp2_sqrt(&t0); + fp2_neg(&kps->K.z, &t0); + fp2_add(&B24->z, &t0, &t0); + fp2_add(&B24->x, &B24->x, &B24->z); + fp2_add(&B24->z, &B24->z, &B24->z); +} + +// Degree-4 isogeny with kernel generated by P such that [2]P != (0 ,0) +// Outputs the curve coefficient in the form A24=(A+2C:4C) +void +xisog_4(ec_kps4_t *kps, ec_point_t *B, const ec_point_t P) +{ + ec_point_t *K = kps->K; + + fp2_sqr(&K[0].x, &P.x); + fp2_sqr(&K[0].z, &P.z); + fp2_add(&K[1].x, &K[0].z, &K[0].x); + fp2_sub(&K[1].z, &K[0].z, &K[0].x); + fp2_mul(&B->x, &K[1].x, &K[1].z); + fp2_sqr(&B->z, &K[0].z); + + // Constants for xeval_4 + fp2_add(&K[2].x, &P.x, &P.z); + fp2_sub(&K[1].x, &P.x, &P.z); + fp2_add(&K[0].x, &K[0].z, &K[0].z); + fp2_add(&K[0].x, &K[0].x, &K[0].x); +} diff --git a/src/ec/ref/lvlx_test.cmake b/src/ec/ref/lvlx_test.cmake new file mode 100644 index 0000000..c553d40 --- /dev/null +++ b/src/ec/ref/lvlx_test.cmake @@ -0,0 +1,32 @@ +add_executable(curve-arith.test_${SVARIANT_LOWER} ${LVLX_DIR}/test/curve-arith-test.c ${LVLX_DIR}/test/test_extras.c) +target_include_directories(curve-arith.test_${SVARIANT_LOWER} PUBLIC ${INC_COMMON} ${INC_MP} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC} ../include ${INC_EC} .) +target_link_libraries(curve-arith.test_${SVARIANT_LOWER} ${LIB_EC_${SVARIANT_UPPER}} sqisign_common_test) + +add_executable(biextension.test_${SVARIANT_LOWER} ${LVLX_DIR}/test/biextension-test.c) +target_include_directories(biextension.test_${SVARIANT_LOWER} PUBLIC ${INC_COMMON} ${INC_MP} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC} ../include ${INC_EC} .) +target_link_libraries(biextension.test_${SVARIANT_LOWER} ${LIB_EC_${SVARIANT_UPPER}} sqisign_common_test) + +add_executable(basis-gen.test_${SVARIANT_LOWER} ${LVLX_DIR}/test/basis-gen-test.c) +target_include_directories(basis-gen.test_${SVARIANT_LOWER} PUBLIC ${INC_COMMON} ${INC_MP} ${LVLX_DIR}/test ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC} ../include ${INC_EC} .) +target_link_libraries(basis-gen.test_${SVARIANT_LOWER} ${LIB_EC_${SVARIANT_UPPER}}) + +add_test(curve_arith.test_${SVARIANT_LOWER} curve-arith.test_${SVARIANT_LOWER}) +add_test(ec_biextension.test_${SVARIANT_LOWER} biextension.test_${SVARIANT_LOWER}) +add_test(ec_basis_gen.test_${SVARIANT_LOWER} basis-gen.test_${SVARIANT_LOWER}) + +add_executable(curve-arith.bench_${SVARIANT_LOWER} ${LVLX_DIR}/test/curve-arith-bench.c ${LVLX_DIR}/test/test_extras.c) +target_include_directories(curve-arith.bench_${SVARIANT_LOWER} PUBLIC ${INC_COMMON} ${INC_MP} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC} ../include ${INC_EC} .) +target_link_libraries(curve-arith.bench_${SVARIANT_LOWER} ${LIB_EC_${SVARIANT_UPPER}} sqisign_common_sys) + +add_executable(biextension.bench_${SVARIANT_LOWER} ${LVLX_DIR}/test/biextension-bench.c) +target_include_directories(biextension.bench_${SVARIANT_LOWER} PUBLIC ${INC_COMMON} ${INC_MP} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC} ../include ${INC_EC} .) +target_link_libraries(biextension.bench_${SVARIANT_LOWER} ${LIB_EC_${SVARIANT_UPPER}} sqisign_common_sys) + +add_executable(basis-gen.bench_${SVARIANT_LOWER} ${LVLX_DIR}/test/basis-gen-bench.c) +target_include_directories(basis-gen.bench_${SVARIANT_LOWER} PUBLIC ${INC_COMMON} ${INC_MP} ${LVLX_DIR}/test ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC} ../include ${INC_EC} .) +target_link_libraries(basis-gen.bench_${SVARIANT_LOWER} ${LIB_EC_${SVARIANT_UPPER}}) + +set(BM_BINS ${BM_BINS} + curve-arith.bench_${SVARIANT_LOWER} basis-gen.bench_${SVARIANT_LOWER} biextension.bench_${SVARIANT_LOWER} + CACHE INTERNAL "List of benchmark executables") + diff --git a/src/gf/broadwell/CMakeLists.txt b/src/gf/broadwell/CMakeLists.txt index 3b414f0..d0ba315 100644 --- a/src/gf/broadwell/CMakeLists.txt +++ b/src/gf/broadwell/CMakeLists.txt @@ -1 +1,3 @@ +set(LVLX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lvlx) + include(${SELECT_SQISIGN_VARIANT}) diff --git a/src/gf/broadwell/include/asm_preamble.h b/src/gf/broadwell/include/asm_preamble.h new file mode 100644 index 0000000..3ef7927 --- /dev/null +++ b/src/gf/broadwell/include/asm_preamble.h @@ -0,0 +1,22 @@ +#ifdef __APPLE__ +#define CAT(A, B) _CAT(A, B) +#define _CAT(A, B) A##B +#undef fp_add +#undef fp_sub +#undef fp_mul +#undef fp_sqr +#undef fp2_mul_c0 +#undef fp2_mul_c1 +#undef fp2_sq_c0 +#undef fp2_sq_c1 +#define p2 CAT(_, p2) +#define p CAT(_, p) +#define fp_add CAT(_, SQISIGN_NAMESPACE(fp_add)) +#define fp_sub CAT(_, SQISIGN_NAMESPACE(fp_sub)) +#define fp_mul CAT(_, SQISIGN_NAMESPACE(fp_mul)) +#define fp_sqr CAT(_, SQISIGN_NAMESPACE(fp_sqr)) +#define fp2_mul_c0 CAT(_, SQISIGN_NAMESPACE(fp2_mul_c0)) +#define fp2_mul_c1 CAT(_, SQISIGN_NAMESPACE(fp2_mul_c1)) +#define fp2_sq_c0 CAT(_, SQISIGN_NAMESPACE(fp2_sq_c0)) +#define fp2_sq_c1 CAT(_, SQISIGN_NAMESPACE(fp2_sq_c1)) +#endif diff --git a/src/gf/broadwell/include/fp2x.h b/src/gf/broadwell/include/fp2x.h new file mode 100644 index 0000000..44cf103 --- /dev/null +++ b/src/gf/broadwell/include/fp2x.h @@ -0,0 +1,162 @@ +#ifndef FP2X_H +#define FP2X_H + +#include +#include "fp.h" +#include + +// Structure for representing elements in GF(p^2) +typedef struct fp2_t +{ + fp_t re, im; +} fp2_t; + +static inline void +fp2_set_small(fp2_t *x, const uint32_t val) +{ + fp_set_small(&(x->re), val); + fp_set_zero(&(x->im)); +} + +static inline void +fp2_mul_small(fp2_t *x, const fp2_t *y, uint32_t n) +{ + fp_mul_small(&x->re, &y->re, n); + fp_mul_small(&x->im, &y->im, n); +} + +static inline void +fp2_set_zero(fp2_t *x) +{ + fp_set_zero(&(x->re)); + fp_set_zero(&(x->im)); +} + +static inline void +fp2_set_one(fp2_t *x) +{ + fp_set_one(&(x->re)); + fp_set_zero(&(x->im)); +} + +static inline uint32_t +fp2_is_equal(const fp2_t *a, const fp2_t *b) +{ // Compare two GF(p^2) elements in constant time + // Returns 1 (true) if a=b, 0 (false) otherwise + + return fp_is_equal(&(a->re), &(b->re)) & fp_is_equal(&(a->im), &(b->im)); +} + +static inline uint32_t +fp2_is_zero(const fp2_t *a) +{ // Is a GF(p^2) element zero? + // Returns 1 (true) if a=0, 0 (false) otherwise + + return fp_is_zero(&(a->re)) & fp_is_zero(&(a->im)); +} + +static inline uint32_t +fp2_is_one(const fp2_t *a) +{ // Is a GF(p^2) element one? + // Returns 1 (true) if a=0, 0 (false) otherwise + return fp_is_equal(&(a->re), &ONE) & fp_is_zero(&(a->im)); +} + +static inline void +fp2_half(fp2_t *x, const fp2_t *y) +{ + fp_half(&(x->re), &(y->re)); + fp_half(&(x->im), &(y->im)); +} + +static inline void +fp2_add(fp2_t *x, const fp2_t *y, const fp2_t *z) +{ + fp_add(&(x->re), &(y->re), &(z->re)); + fp_add(&(x->im), &(y->im), &(z->im)); +} + +static inline void +fp2_add_one(fp2_t *x, const fp2_t *y) +{ + fp_add(&x->re, &y->re, &ONE); + fp_copy(&x->im, &y->im); +} + +static inline void +fp2_sub(fp2_t *x, const fp2_t *y, const fp2_t *z) +{ + fp_sub(&(x->re), &(y->re), &(z->re)); + fp_sub(&(x->im), &(y->im), &(z->im)); +} + +static inline void +fp2_neg(fp2_t *x, const fp2_t *y) +{ + fp_neg(&(x->re), &(y->re)); + fp_neg(&(x->im), &(y->im)); +} + +#ifndef NO_FP2X_MUL +static inline void +fp2_mul(fp2_t *x, const fp2_t *y, const fp2_t *z) +{ + fp_t t0, t1; + + fp_add(&t0, &(y->re), &(y->im)); + fp_add(&t1, &(z->re), &(z->im)); + fp_mul(&t0, &t0, &t1); + fp_mul(&t1, &(y->im), &(z->im)); + fp_mul(&(x->re), &(y->re), &(z->re)); + fp_sub(&(x->im), &t0, &t1); + fp_sub(&(x->im), &(x->im), &(x->re)); + fp_sub(&(x->re), &(x->re), &t1); +} +#endif + +#ifndef NO_FP2X_SQR +static inline void +fp2_sqr(fp2_t *x, const fp2_t *y) +{ + fp_t sum, diff; + + fp_add(&sum, &(y->re), &(y->im)); + fp_sub(&diff, &(y->re), &(y->im)); + fp_mul(&(x->im), &(y->re), &(y->im)); + fp_add(&(x->im), &(x->im), &(x->im)); + fp_mul(&(x->re), &sum, &diff); +} +#endif + +static inline void +fp2_select(fp2_t *d, const fp2_t *a0, const fp2_t *a1, uint32_t ctl) +{ + fp_select(&(d->re), &(a0->re), &(a1->re), ctl); + fp_select(&(d->im), &(a0->im), &(a1->im), ctl); +} + +static inline void +fp2_cswap(fp2_t *a, fp2_t *b, uint32_t ctl) +{ + fp_cswap(&(a->re), &(b->re), ctl); + fp_cswap(&(a->im), &(b->im), ctl); +} + +static inline void +fp2_copy(fp2_t *x, const fp2_t *y) +{ + *x = *y; +} + +// New functions +void fp2_encode(void *dst, const fp2_t *a); +uint32_t fp2_decode(fp2_t *d, const void *src); +void fp2_inv(fp2_t *x); +uint32_t fp2_is_square(const fp2_t *x); +void fp2_sqrt(fp2_t *x); +uint32_t fp2_sqrt_verify(fp2_t *a); +void fp2_batched_inv(fp2_t *x, int len); +void fp2_pow_vartime(fp2_t *out, const fp2_t *x, const uint64_t *exp, const int size); +void fp2_print(const char *name, const fp2_t *a); + +#endif diff --git a/src/gf/broadwell/lvl1/CMakeLists.txt b/src/gf/broadwell/lvl1/CMakeLists.txt index 5c6b64f..61da9a8 100644 --- a/src/gf/broadwell/lvl1/CMakeLists.txt +++ b/src/gf/broadwell/lvl1/CMakeLists.txt @@ -1,10 +1,6 @@ - -set(SOURCE_FILES_GF_${SVARIANT_UPPER}_BROADWELL - fp_asm.S fp.c fp2.c +set(SOURCE_FILES_GF_SPECIFIC + gf5248.c + fp_asm.S ) -add_library(${LIB_GF_${SVARIANT_UPPER}} ${SOURCE_FILES_GF_${SVARIANT_UPPER}_BROADWELL}) -target_include_directories(${LIB_GF_${SVARIANT_UPPER}} PRIVATE common ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} include ${PROJECT_SOURCE_DIR}/include ${INC_COMMON}) -target_compile_options(${LIB_GF_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) +include(../lvlx.cmake) diff --git a/src/gf/broadwell/lvl1/Makefile b/src/gf/broadwell/lvl1/Makefile deleted file mode 100644 index d9aa6e3..0000000 --- a/src/gf/broadwell/lvl1/Makefile +++ /dev/null @@ -1,46 +0,0 @@ - -CC=gcc -CFLAGS= -O3 -std=gnu11 -Wall -march=native -Wno-missing-braces -Wno-logical-not-parentheses -LDFLAGS=-lm -AR=ar rcs -RANLIB=ranlib - -OBJECTS=objs/fp_p1913.o objs/fp.o objs/fp2.o objs/fp_asm.o objs/random.o - -all: lib tests - -objs/fp_p1913.o: fp_p1913.c - @mkdir -p $(@D) - $(CC) -c $(CFLAGS) fp_p1913.c -o objs/fp_p1913.o - -objs/fp.o: fp.c - @mkdir -p $(@D) - $(CC) -c $(CFLAGS) fp.c -o objs/fp.o - -objs/fp2.o: fp2.c - @mkdir -p $(@D) - $(CC) -c $(CFLAGS) fp2.c -o objs/fp2.o - -objs/fp_asm.o: fp_asm.S - $(CC) -c $(CFLAGS) fp_asm.S -o objs/fp_asm.o - -objs/random.o: ../../../common/generic/randombytes_system.c - $(CC) -c $(CFLAGS) ../../../common/generic/randombytes_system.c -o objs/random.o - -lib: $(OBJECTS) - rm -rf lib - mkdir lib - $(AR) lib/libtest.a $^ - $(RANLIB) lib/libtest.a - -tests: lib - $(CC) $(CFLAGS) -L./lib test/test_fp.c test/test_extras.c -ltest $(LDFLAGS) -o test_fp -lgmp - $(CC) $(CFLAGS) -L./lib test/test_fp2.c test/test_extras.c -ltest $(LDFLAGS) -o test_fp2 -lgmp - -check: tests - -.PHONY: clean - -clean: - rm -rf *.req objs lib test_fp* - diff --git a/src/gf/broadwell/lvl1/fp.c b/src/gf/broadwell/lvl1/fp.c index 59ca87f..f7c7456 100644 --- a/src/gf/broadwell/lvl1/fp.c +++ b/src/gf/broadwell/lvl1/fp.c @@ -1,192 +1,95 @@ -#include "include/fp.h" +#include +#include "fp.h" -const uint64_t p[NWORDS_FIELD] = { 0xffffffffffffffff, 0x252C9E49355147FF, 0x33A6A86587407437, 0x34E29E286B95D98C }; -const uint64_t R2[NWORDS_FIELD] = { 0x233625AE400674D4, 0x20AFD6C1025A1C2E, 0x30A841AB0920655D, 0x0D72E7D67C30CD3D }; -const uint64_t pp[NWORDS_FIELD] = { 0x01, 0x00, 0x00, 0x00 }; +const digit_t p[NWORDS_FIELD] = { 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0x04ffffffffffffff }; +const digit_t p2[NWORDS_FIELD] = { 0xfffffffffffffffe, 0xffffffffffffffff, 0xffffffffffffffff, 0x09ffffffffffffff }; - -void fp_set(digit_t* x, const digit_t val) -{ // Set field element x = val, where val has wordsize - - x[0] = val; - for (unsigned int i = 1; i < NWORDS_FIELD; i++) { - x[i] = 0; - } -} - -void fp_mont_setone(digit_t* out1) { - out1[0] = 0x4; - out1[1] = UINT64_C(0x6b4d86db2abae000); - out1[2] = UINT64_C(0x31655e69e2fe2f23); - out1[3] = UINT64_C(0x2c75875e51a899cf); -} - -bool fp_is_equal(const digit_t* a, const digit_t* b) -{ // Compare two field elements in constant time - // Returns 1 (true) if a=b, 0 (false) otherwise - digit_t r = 0; - - for (unsigned int i = 0; i < NWORDS_FIELD; i++) - r |= a[i] ^ b[i]; - - return (bool)is_digit_zero_ct(r); -} - -bool fp_is_zero(const digit_t* a) -{ // Is a field element zero? - // Returns 1 (true) if a=0, 0 (false) otherwise - digit_t r = 0; - - for (unsigned int i = 0; i < NWORDS_FIELD; i++) - r |= a[i] ^ 0; - - return (bool)is_digit_zero_ct(r); -} - -void fp_copy(digit_t* out, const digit_t* a) +void +fp_sqrt(fp_t *x) { - memcpy(out, a, NWORDS_FIELD*RADIX/8); + (void)gf5248_sqrt(x, x); } -void fp_neg(digit_t* out, const digit_t* a) -{ // Modular negation, out = -a mod p - // Input: a in [0, p-1] - // Output: out in [0, p-1] - unsigned int i, borrow = 0; - - for (i = 0; i < NWORDS_FIELD; i++) { - SUBC(out[i], borrow, ((digit_t*)p)[i], a[i], borrow); - } - fp_sub(out, out, (digit_t*)p); +uint32_t +fp_is_square(const fp_t *a) +{ + // ls is (0, 1, -1) and we want fp_is_square + // to return 0xFF..FF when ls is 1 or 0 and 0x00..00 otherwise + int32_t ls = gf5248_legendre(a); + return ~(uint32_t)(ls >> 1); } -void fp_tomont(digit_t* out, const digit_t* a) -{ // Conversion to Montgomery representation - // out = a*R^2*R^(-1) mod p = a*R mod p, where a in [0, p-1]. - - fp_mul(out, a, (digit_t*)&R2); +void +fp_inv(fp_t *x) +{ + (void)gf5248_invert(x, x); } -void fp_frommont(digit_t* out, const digit_t* a) -{ // Conversion from Montgomery representation to standard representation - // out = a*R^(-1) mod p, where a in [0, p-1]. - digit_t one[NWORDS_FIELD] = {0}; - - one[0] = 1; - fp_mul(out, a, one); +void +fp_exp3div4(fp_t *a) +{ + // + // We optimise this by using the shape of the prime + // to avoid almost all multiplications: + // + // We write: + // (p - 3) / 4 = (5*2^248 - 4) / 4 + // = 5*2^246 - 1 + // = 5*(2^246 - 1) + 4 + // Then we first compute: + // a246 = a**(2^246 - 1) + // Then from this we get the desired result as: + // a**((p-3)/4) = a246**5 * a**4 + // We can compute this with 12 multiplications and 247 squares. + fp_t z4, t3, t6, tmp; + // Compute a**3 and a**4 + fp_sqr(&z4, a); + fp_mul(&tmp, a, &z4); + fp_sqr(&z4, &z4); + // Compute a**(2^3 - 1) = a**7 + fp_mul(&t3, &tmp, &z4); + // Compute a**(2^6 - 1) + fp_sqr(&t6, &t3); + for (int i = 1; i < 3; i++) + fp_sqr(&t6, &t6); + fp_mul(&t6, &t6, &t3); + // Compute a**(2^12 - 1) + fp_sqr(a, &t6); + for (int i = 1; i < 6; i++) + fp_sqr(a, a); + fp_mul(a, a, &t6); + // Compute a**(2^15 - 1) + for (int i = 0; i < 3; i++) + fp_sqr(a, a); + fp_mul(a, a, &t3); + // Compute a**(2^30 - 1) + fp_sqr(&tmp, a); + for (int i = 1; i < 15; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(2^60 - 1) + fp_sqr(&tmp, a); + for (int i = 1; i < 30; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(2^120 - 1) + fp_sqr(&tmp, a); + for (int i = 1; i < 60; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(2^123 - 1) + for (int i = 0; i < 3; i++) + fp_sqr(a, a); + fp_mul(a, a, &t3); + // Compute a**(2^246 - 1) + fp_sqr(&tmp, a); + for (int i = 1; i < 123; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(5*(2^246 - 1)) + fp_sqr(&tmp, a); + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(5*(2^246 - 1) + 4) + fp_mul(a, a, &z4); } - -void MUL(digit_t* out, const digit_t a, const digit_t b) -{ // Digit multiplication, digit*digit -> 2-digit result - // Inputs: a, b in [0, 2^w-1], where w is the computer wordsize - // Output: 0 < out < 2^(2w)-1 - register digit_t al, ah, bl, bh, temp; - digit_t albl, albh, ahbl, ahbh, res1, res2, res3, carry; - digit_t mask_low = (digit_t)(-1) >> (sizeof(digit_t)*4), mask_high = (digit_t)(-1) << (sizeof(digit_t)*4); - - al = a & mask_low; // Low part - ah = a >> (sizeof(digit_t)*4); // High part - bl = b & mask_low; - bh = b >> (sizeof(digit_t)*4); - - albl = al * bl; - albh = al * bh; - ahbl = ah * bl; - ahbh = ah * bh; - out[0] = albl & mask_low; // out00 - - res1 = albl >> (sizeof(digit_t)*4); - res2 = ahbl & mask_low; - res3 = albh & mask_low; - temp = res1 + res2 + res3; - carry = temp >> (sizeof(digit_t)*4); - out[0] ^= temp << (sizeof(digit_t)*4); // out01 - - res1 = ahbl >> (sizeof(digit_t)*4); - res2 = albh >> (sizeof(digit_t)*4); - res3 = ahbh & mask_low; - temp = res1 + res2 + res3 + carry; - out[1] = temp & mask_low; // out10 - carry = temp & mask_high; - out[1] ^= (ahbh & mask_high) + carry; // out11 -} - -digit_t mp_shiftr(digit_t* x, const unsigned int shift, const unsigned int nwords) -{ // Multiprecision right shift - digit_t bit_out = x[0] & 1; - - for (unsigned int i = 0; i < nwords-1; i++) { - SHIFTR(x[i+1], x[i], shift, x[i], RADIX); - } - x[nwords-1] >>= shift; - return bit_out; -} - -void mp_shiftl(digit_t* x, const unsigned int shift, const unsigned int nwords) -{ // Multiprecision left shift - - for (int i = nwords-1; i > 0; i--) { - SHIFTL(x[i], x[i-1], shift, x[i], RADIX); - } - x[0] <<= shift; -} - -static void fp_exp3div4(digit_t* out, const digit_t* a) -{ // Fixed exponentiation out = a^((p-3)/4) mod p - // Input: a in [0, p-1] - // Output: out in [0, p-1] - // Requirement: p = 3(mod 4) - fp_t p_t, acc; - digit_t bit; - - memcpy((digit_t*)p_t, (digit_t*)p, NWORDS_FIELD*RADIX/8); - memcpy((digit_t*)acc, (digit_t*)a, NWORDS_FIELD*RADIX/8); - mp_shiftr(p_t, 1, NWORDS_FIELD); - mp_shiftr(p_t, 1, NWORDS_FIELD); - fp_set(out, 1); - fp_tomont(out, out); - - for (int i = 0; i < NWORDS_FIELD*RADIX-2; i++) { - bit = p_t[0] & 1; - mp_shiftr(p_t, 1, NWORDS_FIELD); - if (bit == 1) { - fp_mul(out, out, acc); - } - fp_sqr(acc, acc); - } -} - -void fp_inv(digit_t* a) -{ // Modular inversion, out = x^-1*R mod p, where R = 2^(w*nwords), w is the computer wordsize and nwords is the number of words to represent p - // Input: a=xR in [0, p-1] - // Output: out in [0, p-1]. It outputs 0 if the input does not have an inverse - // Requirement: Ceiling(Log(p)) < w*nwords - fp_t t; - - fp_exp3div4(t, a); - fp_sqr(t, t); - fp_sqr(t, t); - fp_mul(a, t, a); // a^(p-2) -} - -bool fp_is_square(const digit_t* a) -{ // Is field element a square? - // Output: out = 0 (false), 1 (true) - fp_t t, one; - - fp_exp3div4(t, a); - fp_sqr(t, t); - fp_mul(t, t, a); // a^((p-1)/2) - fp_frommont(t, t); - fp_set(one, 1); - - return fp_is_equal(t, one); -} - -void fp_sqrt(digit_t* a) -{ // Square root computation, out = a^((p+1)/4) mod p - fp_t t; - - fp_exp3div4(t, a); - fp_mul(a, t, a); // a^((p+1)/4) -} \ No newline at end of file diff --git a/src/gf/broadwell/lvl1/fp2.c b/src/gf/broadwell/lvl1/fp2.c deleted file mode 100644 index 01f30cb..0000000 --- a/src/gf/broadwell/lvl1/fp2.c +++ /dev/null @@ -1,190 +0,0 @@ -#include - -extern const digit_t R[NWORDS_FIELD]; - -extern void fp2_sq_c0(fp2_t *out, const fp2_t *in); -extern void fp2_sq_c1(fp_t *out, const fp2_t *in); - -extern void fp2_mul_c0(fp_t *out, const fp2_t *in0, const fp2_t *in1); -extern void fp2_mul_c1(fp_t *out, const fp2_t *in0, const fp2_t *in1); - -/* Arithmetic modulo X^2 + 1 */ - -void fp2_set(fp2_t* x, const digit_t val) -{ - fp_set(x->re, val); - fp_set(x->im, 0); -} - -bool fp2_is_zero(const fp2_t* a) -{ // Is a GF(p^2) element zero? - // Returns 1 (true) if a=0, 0 (false) otherwise - - return fp_is_zero(a->re) & fp_is_zero(a->im); -} - -bool fp2_is_equal(const fp2_t* a, const fp2_t* b) -{ // Compare two GF(p^2) elements in constant time - // Returns 1 (true) if a=b, 0 (false) otherwise - - return fp_is_equal(a->re, b->re) & fp_is_equal(a->im, b->im); -} - -void fp2_copy(fp2_t* x, const fp2_t* y) -{ - fp_copy(x->re, y->re); - fp_copy(x->im, y->im); -} - -fp2_t fp2_non_residue() -{ // 2 + i is a quadratic non-residue for p1913 - fp_t one = {0}; - fp2_t res; - - one[0] = 1; - fp_tomont(one, one); - fp_add(res.re, one, one); - fp_copy(res.im, one); - return res; -} - -void fp2_add(fp2_t* x, const fp2_t* y, const fp2_t* z) -{ - fp_add(x->re, y->re, z->re); - fp_add(x->im, y->im, z->im); -} - -void fp2_sub(fp2_t* x, const fp2_t* y, const fp2_t* z) -{ - fp_sub(x->re, y->re, z->re); - fp_sub(x->im, y->im, z->im); -} - -void fp2_neg(fp2_t* x, const fp2_t* y) -{ - fp_neg(x->re, y->re); - fp_neg(x->im, y->im); -} - -void fp2_mul(fp2_t* x, const fp2_t* y, const fp2_t* z) -{ - fp_t t; - - fp2_mul_c0(&t, y, z); // c0 = a0*b0 - a1*b1 - fp2_mul_c1(&x->im, y, z); // c1 = a0*b1 + a1*b0 - x->re[0] = t[0]; x->re[1] = t[1]; x->re[2] = t[2]; x->re[3] = t[3]; -} - -void fp2_sqr(fp2_t* x, const fp2_t* y) { - fp2_t t; - - fp2_sq_c0(&t, y); // c0 = (a0+a1)(a0-a1) - fp2_sq_c1(&x->im, y); // c1 = 2a0*a1 - x->re[0] = t.re[0]; x->re[1] = t.re[1]; x->re[2] = t.re[2]; x->re[3] = t.re[3]; -} - -void fp2_inv(fp2_t* x) -{ - fp_t t0, t1; - - fp_sqr(t0, x->re); - fp_sqr(t1, x->im); - fp_add(t0, t0, t1); - fp_inv(t0); - fp_mul(x->re, x->re, t0); - fp_mul(x->im, x->im, t0); - fp_neg(x->im, x->im); -} - -bool fp2_is_square(const fp2_t* x) -{ - fp_t t0, t1; - - fp_sqr(t0, x->re); - fp_sqr(t1, x->im); - fp_add(t0, t0, t1); - - return fp_is_square(t0); -} - -void fp2_frob(fp2_t* x, const fp2_t* y) -{ - memcpy((digit_t*)x->re, (digit_t*)y->re, NWORDS_FIELD*RADIX/8); - fp_neg(x->im, y->im); -} - -void fp2_tomont(fp2_t* x, const fp2_t* y) -{ - fp_tomont(x->re, y->re); - fp_tomont(x->im, y->im); -} - -void fp2_frommont(fp2_t* x, const fp2_t* y) -{ - fp_frommont(x->re, y->re); - fp_frommont(x->im, y->im); -} - -// NOTE: old, non-constant-time implementation. Could be optimized -void fp2_sqrt(fp2_t* x) -{ - fp_t sdelta, re, tmp1, tmp2, inv2, im; - - if (fp_is_zero(x->im)) { - if (fp_is_square(x->re)) { - fp_sqrt(x->re); - return; - } else { - fp_neg(x->im, x->re); - fp_sqrt(x->im); - fp_set(x->re, 0); - return; - } - } - - // sdelta = sqrt(re^2 + im^2) - fp_sqr(sdelta, x->re); - fp_sqr(tmp1, x->im); - fp_add(sdelta, sdelta, tmp1); - fp_sqrt(sdelta); - - fp_set(inv2, 2); - fp_tomont(inv2, inv2); // inv2 <- 2 - fp_inv(inv2); - fp_add(re, x->re, sdelta); - fp_mul(re, re, inv2); - memcpy((digit_t*)tmp2, (digit_t*)re, NWORDS_FIELD*RADIX/8); - - if (!fp_is_square(tmp2)) { - fp_sub(re, x->re, sdelta); - fp_mul(re, re, inv2); - } - - fp_sqrt(re); - memcpy((digit_t*)im, (digit_t*)re, NWORDS_FIELD*RADIX/8); - - fp_inv(im); - fp_mul(im, im, inv2); - fp_mul(x->im, im, x->im); - memcpy((digit_t*)x->re, (digit_t*)re, NWORDS_FIELD*RADIX/8); -} - -// Lexicographic comparison of two field elements. Returns +1 if x > y, -1 if x < y, 0 if x = y -int fp2_cmp(fp2_t* x, fp2_t* y){ - fp2_t a, b; - fp2_frommont(&a, x); - fp2_frommont(&b, y); - for(int i = NWORDS_FIELD-1; i >= 0; i--){ - if(a.re[i] > b.re[i]) - return 1; - if(a.re[i] < b.re[i]) - return -1; - } - for(int i = NWORDS_FIELD-1; i >= 0; i--){ - if(a.im[i] > b.im[i]) - return 1; - if(a.im[i] < b.im[i]) - return -1; - } - return 0; -} \ No newline at end of file diff --git a/src/gf/broadwell/lvl1/fp_asm.S b/src/gf/broadwell/lvl1/fp_asm.S old mode 100644 new mode 100755 index c30123d..6da7ff7 --- a/src/gf/broadwell/lvl1/fp_asm.S +++ b/src/gf/broadwell/lvl1/fp_asm.S @@ -1,17 +1,27 @@ +#include .intel_syntax noprefix .set pbytes,32 .set plimbs,4 -.global p_plus_1 -p_plus_1: .quad 0x0000000000000000, 0x252C9E4935514800, 0x33A6A86587407437, 0x34E29E286B95D98C +#ifdef __APPLE__ +.section __TEXT,__const +#else +.section .rodata +#endif +p_plus_1: .quad 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0500000000000000 + +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",@progbits +#endif + +#include .text .p2align 4,,15 .global fp_add fp_add: - push r12 xor rax, rax mov r8, [rsi] mov r9, [rsi+8] @@ -20,36 +30,34 @@ fp_add: add r8, [rdx] adc r9, [rdx+8] adc r10, [rdx+16] - adc r11, [rdx+24] - mov r12, [rip+p] - sub r8, r12 - mov rcx, [rip+p+8] - sbb r9, rcx - mov rsi, [rip+p+16] - sbb r10, rsi + adc r11, [rdx+24] + mov rax, r11 + shr rax, 59 + neg rax mov rdx, [rip+p+24] - sbb r11, rdx - sbb rax, 0 - - and r12, rax - and rcx, rax - and rsi, rax and rdx, rax + sub r8, rax + sbb r9, rax + sbb r10, rax + sbb r11, rdx - add r8, r12 - adc r9, rcx - adc r10, rsi - adc r11, rdx + mov rax, r11 + shr rax, 59 + neg rax + mov rdx, [rip+p+24] + and rdx, rax + sub r8, rax + sbb r9, rax + sbb r10, rax + sbb r11, rdx mov [rdi], r8 mov [rdi+8], r9 mov [rdi+16], r10 mov [rdi+24], r11 - pop r12 ret .global fp_sub fp_sub: - push r12 xor rax, rax mov r8, [rsi] mov r9, [rsi+8] @@ -61,23 +69,26 @@ fp_sub: sbb r11, [rdx+24] sbb rax, 0 - mov r12, [rip+p] - mov rcx, [rip+p+8] - mov rsi, [rip+p+16] mov rdx, [rip+p+24] - and r12, rax - and rcx, rax - and rsi, rax and rdx, rax - add r8, r12 - adc r9, rcx - adc r10, rsi + add r8, rax + adc r9, rax + adc r10, rax adc r11, rdx + + mov rax, r11 + sar rax, 59 + mov rdx, [rip+p+24] + and rdx, rax + add r8, rax + adc r9, rax + adc r10, rax + adc r11, rdx + mov [rdi], r8 mov [rdi+8], r9 mov [rdi+16], r10 mov [rdi+24], r11 - pop r12 ret ///////////////////////////////////////////////////////////////// MACROS @@ -105,18 +116,11 @@ fp_sub: adc \Z4, 0 .endm -.macro MULADD64x192 M1, Z0, Z1, Z2, Z3, T0, T1 +.macro MULADD64x64 M1, Z0, Z1, Z2, Z3, T0, T1 mulx \T0, \T1, \M1 // A0*B0 xor rax, rax - adox \Z0, \T1 - adox \Z1, \T0 - mulx \T0, \T1, 8\M1 // A0*B1 - adcx \Z1, \T1 - adox \Z2, \T0 - mulx \T0, \T1, 16\M1 // A0*B2 - adcx \Z2, \T1 + adox \Z2, \T1 adox \Z3, \T0 - adc \Z3, 0 .endm //*********************************************************************** @@ -133,13 +137,13 @@ fp2_mul_c0: push r14 mov rcx, rdx - // [rdi0:3] <- p - b1 - mov r8, [rip+p] - mov r9, [rip+p+8] - mov r10, [rip+p+16] - mov r11, [rip+p+24] + // [rdi0:3] <- 2p - b1 + mov r8, [rip+p2] + mov r9, [rip+p2+8] + mov r10, r9 + mov r11, [rip+p2+24] mov rax, [rcx+32] - mov rdx, [rcx+40] + mov rdx, [rcx+40] sub r8, rax sbb r9, rdx mov rax, [rcx+48] @@ -167,7 +171,7 @@ fp2_mul_c0: MULADD64x256 [rsi+32], r8, r9, r10, r11, r12, r13, r14, rax // [r9:r12] <- z = (z0 x p_plus_1 + z)/2^64 mov rdx, r8 // rdx <- z0 - MULADD64x192 [rip+p_plus_1+8], r9, r10, r11, r12, r13, r14 + MULADD64x64 [rip+p_plus_1+24], r9, r10, r11, r12, r13, r14 // [r9:r12, r8] <- z = a0 x b01 - a1 x b11 + z mov rdx, [rcx+8] @@ -176,7 +180,7 @@ fp2_mul_c0: MULADD64x256 [rsi+32], r9, r10, r11, r12, r8, r13, r14, rax // [r10:r12, r8] <- z = (z0 x p_plus_1 + z)/2^64 mov rdx, r9 // rdx <- z0 - MULADD64x192 [rip+p_plus_1+8], r10, r11, r12, r8, r13, r14 + MULADD64x64 [rip+p_plus_1+24], r10, r11, r12, r8, r13, r14 // [r10:r12, r8:r9] <- z = a0 x b02 - a1 x b12 + z mov rdx, [rcx+16] @@ -185,7 +189,7 @@ fp2_mul_c0: MULADD64x256 [rsi+32], r10, r11, r12, r8, r9, r13, r14, rax // [r11:r12, r8:r9] <- z = (z0 x p_plus_1 + z)/2^64 mov rdx, r10 // rdx <- z0 - MULADD64x192 [rip+p_plus_1+8], r11, r12, r8, r9, r13, r14 + MULADD64x64 [rip+p_plus_1+24], r11, r12, r8, r9, r13, r14 // [r11:r12, r8:r10] <- z = a0 x b03 - a1 x b13 + z mov rdx, [rcx+24] @@ -194,27 +198,8 @@ fp2_mul_c0: MULADD64x256 [rsi+32], r11, r12, r8, r9, r10, r13, r14, rax // [r12, r8:r10] <- z = (z0 x p_plus_1 + z)/2^64 mov rdx, r11 // rdx <- z0 - MULADD64x192 [rip+p_plus_1+8], r12, r8, r9, r10, r13, r14 + MULADD64x64 [rip+p_plus_1+24], r12, r8, r9, r10, r13, r14 - // Final correction - mov rsi, [rip+p] - mov rcx, [rip+p+8] - mov rdx, [rip+p+16] - mov r11, [rip+p+24] - sub r12, rsi - sbb r8, rcx - sbb r9, rdx - sbb r10, r11 - sbb rax, 0 - and rsi, rax - and rcx, rax - and rdx, rax - and r11, rax - add r12, rsi - adc r8, rcx - adc r9, rdx - adc r10, r11 - mov [rdi], r12 mov [rdi+8], r8 mov [rdi+16], r9 @@ -254,7 +239,7 @@ fp2_mul_c1: MULADD64x256 [rsi+32], r8, r9, r10, r11, r12, r13, r14, rax // [r9:r12] <- z = (z0 x p_plus_1 + z)/2^64 mov rdx, r8 // rdx <- z0 - MULADD64x192 [rip+p_plus_1+8], r9, r10, r11, r12, r13, r14 + MULADD64x64 [rip+p_plus_1+24], r9, r10, r11, r12, r13, r14 // [r9:r12, r8] <- z = a0 x b01 - a1 x b11 + z mov rdx, [rcx+40] @@ -263,7 +248,7 @@ fp2_mul_c1: MULADD64x256 [rsi+32], r9, r10, r11, r12, r8, r13, r14, rax // [r10:r12, r8] <- z = (z0 x p_plus_1 + z)/2^64 mov rdx, r9 // rdx <- z0 - MULADD64x192 [rip+p_plus_1+8], r10, r11, r12, r8, r13, r14 + MULADD64x64 [rip+p_plus_1+24], r10, r11, r12, r8, r13, r14 // [r10:r12, r8:r9] <- z = a0 x b02 - a1 x b12 + z mov rdx, [rcx+48] @@ -272,7 +257,7 @@ fp2_mul_c1: MULADD64x256 [rsi+32], r10, r11, r12, r8, r9, r13, r14, rax // [r11:r12, r8:r9] <- z = (z0 x p_plus_1 + z)/2^64 mov rdx, r10 // rdx <- z0 - MULADD64x192 [rip+p_plus_1+8], r11, r12, r8, r9, r13, r14 + MULADD64x64 [rip+p_plus_1+24], r11, r12, r8, r9, r13, r14 // [r11:r12, r8:r10] <- z = a0 x b03 - a1 x b13 + z mov rdx, [rcx+56] @@ -281,27 +266,8 @@ fp2_mul_c1: MULADD64x256 [rsi+32], r11, r12, r8, r9, r10, r13, r14, rax // [r12, r8:r10] <- z = (z0 x p_plus_1 + z)/2^64 mov rdx, r11 // rdx <- z0 - MULADD64x192 [rip+p_plus_1+8], r12, r8, r9, r10, r13, r14 + MULADD64x64 [rip+p_plus_1+24], r12, r8, r9, r10, r13, r14 - // Final correction - mov rsi, [rip+p] - mov rcx, [rip+p+8] - mov rdx, [rip+p+16] - mov r11, [rip+p+24] - sub r12, rsi - sbb r8, rcx - sbb r9, rdx - sbb r10, r11 - sbb rax, 0 - and rsi, rax - and rcx, rax - and rdx, rax - and r11, rax - add r12, rsi - adc r8, rcx - adc r9, rdx - adc r10, r11 - mov [rdi], r12 mov [rdi+8], r8 mov [rdi+16], r9 @@ -322,28 +288,28 @@ fp2_mul_c1: .macro FPMUL256x256 M0, M1, Z0, Z1, Z2, Z3, Z4, T0, T1 // [Z1:Z4] <- z = (z0 x p_plus_1 + z)/2^64 mov rdx, \Z0 // rdx <- z0 - MULADD64x192 [rip+p_plus_1+8], \Z1, \Z2, \Z3, \Z4, \T0, \T1 + MULADD64x64 [rip+p_plus_1+24], \Z1, \Z2, \Z3, \Z4, \T0, \T1 // [Z1:Z4, Z0] <- z = a01 x a1 + z mov rdx, 8\M0 MULADD64x256 \M1, \Z1, \Z2, \Z3, \Z4, \Z0, \T0, \T1, \Z0 // [Z2:Z4, Z0] <- z = (z0 x p_plus_1 + z)/2^64 mov rdx, \Z1 // rdx <- z0 - MULADD64x192 [rip+p_plus_1+8], \Z2, \Z3, \Z4, \Z0, \T0, \T1 + MULADD64x64 [rip+p_plus_1+24], \Z2, \Z3, \Z4, \Z0, \T0, \T1 // [Z2:Z4, Z0:Z1] <- z = a02 x a1 + z mov rdx, 16\M0 MULADD64x256 \M1, \Z2, \Z3, \Z4, \Z0, \Z1, \T0, \T1, \Z1 // [Z3:Z4, Z0:Z1] <- z = (z0 x p_plus_1 + z)/2^64 mov rdx, \Z2 // rdx <- z0 - MULADD64x192 [rip+p_plus_1+8], \Z3, \Z4, \Z0, \Z1, \T0, \T1 + MULADD64x64 [rip+p_plus_1+24], \Z3, \Z4, \Z0, \Z1, \T0, \T1 // [Z3:Z4, Z0:Z2] <- z = a03 x a1 + z mov rdx, 24\M0 MULADD64x256 \M1, \Z3, \Z4, \Z0, \Z1, \Z2, \T0, \T1, \Z2 // [Z4, Z0:Z2] <- z = (z0 x p_plus_1 + z)/2^64 mov rdx, \Z3 // rdx <- z0 - MULADD64x192 [rip+p_plus_1+8], \Z4, \Z0, \Z1, \Z2, \T0, \T1 + MULADD64x64 [rip+p_plus_1+24], \Z4, \Z0, \Z1, \Z2, \T0, \T1 .endm //*********************************************************************** @@ -371,19 +337,21 @@ fp2_sq_c0: mov [rdi+16], r10 mov [rdi+24], r11 - // a0 - a1 + p + // a0 - a1 + 2p mov r8, [rsi] mov r10, [rsi+8] mov r12, [rsi+16] mov r13, [rsi+24] sub r8, [rsi+32] sbb r10, [rsi+40] - sbb r12, [rsi+48] + sbb r12, [rsi+48] sbb r13, [rsi+56] - add r8, [rip+p] - adc r10, [rip+p+8] - adc r12, [rip+p+16] - adc r13, [rip+p+24] + mov rax, [rip+p2] + add r8, rax + mov rax, [rip+p2+8] + adc r10, rax + adc r12, rax + adc r13, [rip+p2+24] mov [rdi+32], r8 mov [rdi+40], r10 mov [rdi+48], r12 @@ -402,25 +370,6 @@ fp2_sq_c0: FPMUL256x256 [rdi], [rdi+32], r8, r9, r10, r11, r12, r13, rcx - // Final correction - mov rsi, [rip+p] - mov rcx, [rip+p+8] - mov rdx, [rip+p+16] - mov r11, [rip+p+24] - sub r12, rsi - sbb r8, rcx - sbb r9, rdx - sbb r10, r11 - sbb rax, 0 - and rsi, rax - and rcx, rax - and rdx, rax - and r11, rax - add r12, rsi - adc r8, rcx - adc r9, rdx - adc r10, r11 - mov [rdi], r12 mov [rdi+8], r8 mov [rdi+16], r9 @@ -465,27 +414,8 @@ fp2_sq_c1: adox r12, rax FPMUL256x256 [rsp], [rsi+32], r8, r9, r10, r11, r12, r13, rcx - add rsp, 32 + add rsp, 32 - // Final correction - mov rsi, [rip+p] - mov rcx, [rip+p+8] - mov rdx, [rip+p+16] - mov r11, [rip+p+24] - sub r12, rsi - sbb r8, rcx - sbb r9, rdx - sbb r10, r11 - sbb rax, 0 - and rsi, rax - and rcx, rax - and rdx, rax - and r11, rax - add r12, rsi - adc r8, rcx - adc r9, rdx - adc r10, r11 - mov [rdi], r12 mov [rdi+8], r8 mov [rdi+16], r9 @@ -521,26 +451,7 @@ fp_mul: FPMUL256x256 [rcx], [rsi], r8, r9, r10, r11, r12, r13, r14 - // Final correction - mov rsi, [rip+p] - mov rcx, [rip+p+8] - mov rdx, [rip+p+16] - mov r11, [rip+p+24] - sub r12, rsi - sbb r8, rcx - sbb r9, rdx - sbb r10, r11 - sbb rax, 0 - and rsi, rax - and rcx, rax - and rdx, rax - and r11, rax - add r12, rsi - adc r8, rcx - adc r9, rdx - adc r10, r11 - - mov [rdi], r12 + mov [rdi], r12 mov [rdi+8], r8 mov [rdi+16], r9 mov [rdi+24], r10 @@ -552,4 +463,4 @@ fp_mul: .global fp_sqr fp_sqr: mov rdx, rsi - jmp fp_mul \ No newline at end of file + jmp fp_mul diff --git a/src/gf/broadwell/lvl1/gf5248.c b/src/gf/broadwell/lvl1/gf5248.c new file mode 100644 index 0000000..a5afc69 --- /dev/null +++ b/src/gf/broadwell/lvl1/gf5248.c @@ -0,0 +1,767 @@ +/* + * This code is derived from discussions with Thomas Pornin + */ + +#include "gf5248.h" + +// see gf5248.h +const gf5248 gf5248_ZERO = { 0, 0, 0, 0 }; + +// see gf5248.h +const gf5248 gf5248_ONE = { 0x0000000000000033, 0x0000000000000000, 0x0000000000000000, 0x0100000000000000 }; + +// see gf5248.h +const gf5248 gf5248_MINUS_ONE = { 0xFFFFFFFFFFFFFFCC, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x03FFFFFFFFFFFFFF }; + +// Montgomery representation of 2^256. +static const gf5248 R2 = { 0x3333333333333d70, 0x3333333333333333, 0x3333333333333333, 0x0333333333333333 }; + +// The modulus itself (this is also a valid representation of zero). +static const gf5248 MODULUS = { 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x04FFFFFFFFFFFFFF }; + +// 1/2^244 (in Montgomery representation). +static const gf5248 INVT244 = { 0x0000000000001000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 }; + +static const gf5248 PM1O3 = { 0xaaaaaaaaaaaaaaaa, 0xaaaaaaaaaaaaaaaa, 0xaaaaaaaaaaaaaaaa, 0x01aaaaaaaaaaaaaa }; + +// Normalize value *a into *d. +static inline void +inner_gf5248_normalize(gf5248 *d, const gf5248 *a) +{ + uint64_t d0, d1, d2, d3, m; + unsigned char cc; + + // Subtract q. + cc = inner_gf5248_sbb(0, a->v0, 0xFFFFFFFFFFFFFFFF, &d0); + cc = inner_gf5248_sbb(cc, a->v1, 0xFFFFFFFFFFFFFFFF, &d1); + cc = inner_gf5248_sbb(cc, a->v2, 0xFFFFFFFFFFFFFFFF, &d2); + cc = inner_gf5248_sbb(cc, a->v3, 0x04FFFFFFFFFFFFFF, &d3); + + // Add back q if the result is negative. + (void)inner_gf5248_sbb(cc, 0, 0, &m); + cc = inner_gf5248_adc(0, d0, m, &d0); + cc = inner_gf5248_adc(cc, d1, m, &d1); + cc = inner_gf5248_adc(cc, d2, m, &d2); + (void)inner_gf5248_adc(cc, d3, m & 0x04FFFFFFFFFFFFFF, &d3); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; +} + +// Expand the most significant bit of x into a full-width 64-bit word +// (0x0000000000000000 or 0xFFFFFFFFFFFFFFFF). +static inline uint64_t +sgnw(uint64_t x) +{ + return (uint64_t)(*(int64_t *)&x >> 63); +} + +// d <- u*f + v*g (in the field) +// Coefficients f and g are provided as unsigned integers, but they +// really are signed values which must be less than 2^62 (in absolute value). +static void +gf5248_lin(gf5248 *d, const gf5248 *u, const gf5248 *v, uint64_t f, uint64_t g) +{ + // f <- abs(f), keeping the sign in sf, and negating u accordingly + uint64_t sf = sgnw(f); + f = (f ^ sf) - sf; + gf5248 tu; + gf5248_neg(&tu, u); + gf5248_select(&tu, u, &tu, (uint32_t)sf); + + // g <- abs(g), keeping the sign in sg, and negating v accordingly + uint64_t sg = sgnw(g); + g = (g ^ sg) - sg; + gf5248 tv; + gf5248_neg(&tv, v); + gf5248_select(&tv, v, &tv, (uint32_t)sg); + + // Linear combination over plain integers. + uint64_t d0, d1, d2, d3, t; + inner_gf5248_umul_x2(d0, t, tu.v0, f, tv.v0, g); + inner_gf5248_umul_x2_add(d1, t, tu.v1, f, tv.v1, g, t); + inner_gf5248_umul_x2_add(d2, t, tu.v2, f, tv.v2, g, t); + inner_gf5248_umul_x2_add(d3, t, tu.v3, f, tv.v3, g, t); + + // Reduction: split into low part (248 bits) and high part + // (71 bits, since t can be up to 63 bits). If the high + // part is h, then: + // h*2^248 = (h mod 5)*2^248 + floor(h/5) mod q + uint64_t h0 = (d3 >> 56) | (t << 8); + uint64_t h1 = t >> 56; + d3 &= 0x00FFFFFFFFFFFFFF; + uint64_t z0, z1, quo0, rem0, quo1, rem1; + inner_gf5248_umul(z0, z1, h0, 0xCCCCCCCCCCCCCCCD); + (void)z0; + quo0 = z1 >> 2; + rem0 = h0 - (5 * quo0); + quo1 = (h1 * 0xCD) >> 10; + rem1 = h1 - (5 * quo1); + + // h = rem0 + 5*quo0 + (rem1 + 5*quo1)*2^64 + // = rem0 + rem1 + 5*(quo0 + quo1*2^64 + rem1*((2^64 - 1)/5)) + // We add rem0 and rem1 modulo 5, with an extra carry that + // goes into the folded part (multiple of 5). + uint64_t e, f0, f1; + unsigned char cc; + cc = inner_gf5248_adc(0, rem0 + 0xFFFFFFFFFFFFFFFA, rem1, &e); + cc = inner_gf5248_adc(cc, quo0, rem1 * 0x3333333333333333, &f0); + (void)inner_gf5248_adc(cc, quo1, 0, &f1); + e -= 0xFFFFFFFFFFFFFFFA; + + // Now we only have to add e*2^248 + f0:f1 to the low part. + cc = inner_gf5248_adc(0, d0, f0, &d0); + cc = inner_gf5248_adc(cc, d1, f1, &d1); + cc = inner_gf5248_adc(cc, d2, 0, &d2); + (void)inner_gf5248_adc(cc, d3, e << 56, &d3); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; +} + +// d <- abs(floor((a*f + b*g) / 2^31)) +// Coefficients f and g are provided as unsigned integer, but they really +// are signed values, which MUST be at most 2^31 in absolute value. +// The computation is performed over the integers, not modulo q. The low +// 31 bits are dropped (in practice, callers provided appropriate coefficients +// f and g such that a*f + b*g is a multiple of 2^31. +// +// If a*f + b*g is negative, then the absolute value is computed, and the +// function returns 0xFFFFFFFFFFFFFFFF; otherwise, the function returns +// 0x0000000000000000. +static uint64_t +lindiv31abs(gf5248 *d, const gf5248 *a, const gf5248 *b, uint64_t f, uint64_t g) +{ + // f <- abs(f), keeping the sign in sf + uint64_t sf = sgnw(f); + f = (f ^ sf) - sf; + + // g <- abs(g), keeping the sign in sg + uint64_t sg = sgnw(g); + g = (g ^ sg) - sg; + + // Apply the signs of f and g to the source operands. + uint64_t a0, a1, a2, a3, a4; + uint64_t b0, b1, b2, b3, b4; + unsigned char cc; + + cc = inner_gf5248_sbb(0, a->v0 ^ sf, sf, &a0); + cc = inner_gf5248_sbb(cc, a->v1 ^ sf, sf, &a1); + cc = inner_gf5248_sbb(cc, a->v2 ^ sf, sf, &a2); + cc = inner_gf5248_sbb(cc, a->v3 ^ sf, sf, &a3); + (void)inner_gf5248_sbb(cc, 0, 0, &a4); + + cc = inner_gf5248_sbb(0, b->v0 ^ sg, sg, &b0); + cc = inner_gf5248_sbb(cc, b->v1 ^ sg, sg, &b1); + cc = inner_gf5248_sbb(cc, b->v2 ^ sg, sg, &b2); + cc = inner_gf5248_sbb(cc, b->v3 ^ sg, sg, &b3); + (void)inner_gf5248_sbb(cc, 0, 0, &b4); + + // Compute a*f + b*g into d0:d1:d2:d3:d4. Since f and g are at + // most 2^31, we can add two 128-bit products with no overflow. + // Note: a4 and b4 are both in {0, -1}. + uint64_t d0, d1, d2, d3, d4, t; + inner_gf5248_umul_x2(d0, t, a0, f, b0, g); + inner_gf5248_umul_x2_add(d1, t, a1, f, b1, g, t); + inner_gf5248_umul_x2_add(d2, t, a2, f, b2, g, t); + inner_gf5248_umul_x2_add(d3, t, a3, f, b3, g, t); + d4 = t - (a4 & f) - (b4 & g); + + // Right-shift the value by 31 bits. + d0 = (d0 >> 31) | (d1 << 33); + d1 = (d1 >> 31) | (d2 << 33); + d2 = (d2 >> 31) | (d3 << 33); + d3 = (d3 >> 31) | (d4 << 33); + + // If the result is negative, negate it. + t = sgnw(d4); + cc = inner_gf5248_sbb(0, d0 ^ t, t, &d0); + cc = inner_gf5248_sbb(cc, d1 ^ t, t, &d1); + cc = inner_gf5248_sbb(cc, d2 ^ t, t, &d2); + (void)inner_gf5248_sbb(cc, d3 ^ t, t, &d3); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + return t; +} + +// lzcnt(x) returns the number of leading bits of value 0 in x. It supports +// x == 0 (in which case the function returns 64). +#if defined __LZCNT__ +static inline uint64_t +lzcnt(uint64_t x) +{ + return _lzcnt_u64(x); +} +#else +static inline uint64_t +lzcnt(uint64_t x) +{ + uint64_t m, s; + m = sgnw((x >> 32) - 1); + s = m & 32; + x = (x >> 32) ^ (m & (x ^ (x >> 32))); + m = sgnw((x >> 16) - 1); + s |= m & 16; + x = (x >> 16) ^ (m & (x ^ (x >> 16))); + m = sgnw((x >> 8) - 1); + s |= m & 8; + x = (x >> 8) ^ (m & (x ^ (x >> 8))); + m = sgnw((x >> 4) - 1); + s |= m & 4; + x = (x >> 4) ^ (m & (x ^ (x >> 4))); + m = sgnw((x >> 2) - 1); + s |= m & 2; + x = (x >> 2) ^ (m & (x ^ (x >> 2))); + + // At this point, x fits on 2 bits. Count of extra zeros: + // x = 0 -> 2 + // x = 1 -> 1 + // x = 2 -> 0 + // x = 3 -> 0 + s += (2 - x) & ((x - 3) >> 2); + return s; +} +#endif + +// see gf5248.h +uint32_t +gf5248_div(gf5248 *d, const gf5248 *x, const gf5248 *y) +{ + // Extended binary GCD: + // + // a <- y + // b <- q (modulus) + // u <- x (self) + // v <- 0 + // + // Value a is normalized (in the 0..q-1 range). Values a and b are + // then considered as (signed) integers. Values u and v are field + // elements. + // + // Invariants: + // a*x = y*u mod q + // b*x = y*v mod q + // b is always odd + // + // At each step: + // if a is even, then: + // a <- a/2, u <- u/2 mod q + // else: + // if a < b: + // (a, u, b, v) <- (b, v, a, u) + // a <- (a-b)/2, u <- (u-v)/2 mod q + // + // What we implement below is the optimized version of this + // algorithm, as described in https://eprint.iacr.org/2020/972 + + gf5248 a, b, u, v; + uint64_t xa, xb, f0, g0, f1, g1; + uint32_t r; + + r = ~gf5248_iszero(y); + inner_gf5248_normalize(&a, y); + b = MODULUS; + u = *x; + v = gf5248_ZERO; + + // Generic loop does 15*31 = 465 inner iterations. + for (int i = 0; i < 15; i++) { + // Get approximations of a and b over 64 bits: + // - If len(a) <= 64 and len(b) <= 64, then we just use + // their values (low limbs). + // - Otherwise, with n = max(len(a), len(b)), we use: + // (a mod 2^31) + 2^31*floor(a / 2^(n - 33)) + // (b mod 2^31) + 2^31*floor(b / 2^(n - 33)) + uint64_t m3 = a.v3 | b.v3; + uint64_t m2 = a.v2 | b.v2; + uint64_t m1 = a.v1 | b.v1; + uint64_t tnz3 = sgnw(m3 | -m3); + uint64_t tnz2 = sgnw(m2 | -m2) & ~tnz3; + uint64_t tnz1 = sgnw(m1 | -m1) & ~tnz3 & ~tnz2; + uint64_t tnzm = (m3 & tnz3) | (m2 & tnz2) | (m1 & tnz1); + uint64_t tnza = (a.v3 & tnz3) | (a.v2 & tnz2) | (a.v1 & tnz1); + uint64_t tnzb = (b.v3 & tnz3) | (b.v2 & tnz2) | (b.v1 & tnz1); + uint64_t snza = (a.v2 & tnz3) | (a.v1 & tnz2) | (a.v0 & tnz1); + uint64_t snzb = (b.v2 & tnz3) | (b.v1 & tnz2) | (b.v0 & tnz1); + + // If both len(a) <= 64 and len(b) <= 64, then: + // tnzm = 0 + // tnza = 0, snza = 0, tnzb = 0, snzb = 0 + // Otherwise: + // tnzm != 0 + // tnza contains the top non-zero limb of a + // snza contains the limb right below tnza + // tnzb contains the top non-zero limb of a + // snzb contains the limb right below tnzb + // + // We count the number of leading zero bits in tnzm: + // - If s <= 31, then the top 31 bits can be extracted from + // tnza and tnzb alone. + // - If 32 <= s <= 63, then we need some bits from snza and + // snzb as well. + int64_t s = lzcnt(tnzm); + uint64_t sm = (uint64_t)((31 - s) >> 63); + tnza ^= sm & (tnza ^ ((tnza << 32) | (snza >> 32))); + tnzb ^= sm & (tnzb ^ ((tnzb << 32) | (snzb >> 32))); + s -= 32 & sm; + tnza <<= s; + tnzb <<= s; + + // At this point: + // - If len(a) <= 64 and len(b) <= 64, then: + // tnza = 0 + // tnzb = 0 + // tnz1 = tnz2 = tnz3 = 0 + // we want to use the entire low words of a and b + // - Otherwise, we want to use the top 33 bits of tnza and + // tnzb, and the low 31 bits of the low words of a and b. + uint64_t tzx = ~(tnz1 | tnz2 | tnz3); + tnza |= a.v0 & tzx; + tnzb |= b.v0 & tzx; + xa = (a.v0 & 0x7FFFFFFF) | (tnza & 0xFFFFFFFF80000000); + xb = (b.v0 & 0x7FFFFFFF) | (tnzb & 0xFFFFFFFF80000000); + + // Compute the 31 inner iterations on xa and xb. + uint64_t fg0 = (uint64_t)1; + uint64_t fg1 = (uint64_t)1 << 32; + for (int j = 0; j < 31; j++) { + uint64_t a_odd, swap, t0, t1, t2; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf5248_sbb(0, xa, xb, &t0); + (void)inner_gf5248_sbb(cc, 0, 0, &swap); + swap &= a_odd; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + t2 = swap & (fg0 ^ fg1); + fg0 ^= t2; + fg1 ^= t2; + xa -= a_odd & xb; + fg0 -= a_odd & fg1; + xa >>= 1; + fg1 <<= 1; + } + fg0 += 0x7FFFFFFF7FFFFFFF; + fg1 += 0x7FFFFFFF7FFFFFFF; + f0 = (fg0 & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g0 = (fg0 >> 32) - (uint64_t)0x7FFFFFFF; + f1 = (fg1 & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g1 = (fg1 >> 32) - (uint64_t)0x7FFFFFFF; + + // Propagate updates to a, b, u and v. + gf5248 na, nb, nu, nv; + uint64_t nega = lindiv31abs(&na, &a, &b, f0, g0); + uint64_t negb = lindiv31abs(&nb, &a, &b, f1, g1); + f0 = (f0 ^ nega) - nega; + g0 = (g0 ^ nega) - nega; + f1 = (f1 ^ negb) - negb; + g1 = (g1 ^ negb) - negb; + gf5248_lin(&nu, &u, &v, f0, g0); + gf5248_lin(&nv, &u, &v, f1, g1); + a = na; + b = nb; + u = nu; + v = nv; + } + + // If y is invertible, then the final GCD is 1, and + // len(a) + len(b) <= 37, so we can end the computation with + // the low words directly. We only need 35 iterations to reach + // the point where b = 1. + // + // If y is zero, then v is unchanged (hence zero) and none of + // the subsequent iterations will change it either, so we get + // 0 on output, which is what we want. + xa = a.v0; + xb = b.v0; + f0 = 1; + g0 = 0; + f1 = 0; + g1 = 1; + for (int j = 0; j < 35; j++) { + uint64_t a_odd, swap, t0, t1, t2, t3; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf5248_sbb(0, xa, xb, &t0); + (void)inner_gf5248_sbb(cc, 0, 0, &swap); + swap &= a_odd; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + t2 = swap & (f0 ^ f1); + f0 ^= t2; + f1 ^= t2; + t3 = swap & (g0 ^ g1); + g0 ^= t3; + g1 ^= t3; + xa -= a_odd & xb; + f0 -= a_odd & f1; + g0 -= a_odd & g1; + xa >>= 1; + f1 <<= 1; + g1 <<= 1; + } + gf5248_lin(d, &u, &v, f1, g1); + + // At the point: + // - Numerator and denominator were both in Montgomery representation, + // but the two factors R canceled each other. + // - We have injected 31*15+35 = 500 extra factors of 2, hence we + // must divide the result by 2^500. + // - However, we also want to obtain the result in Montgomery + // representation, i.e. multiply by 2^256. We thus want to + // divide the current result by 2^(500 - 256) = 2^244. + // - We do this division by using a Montgomery multiplication with + // the Montgomery representation of 1/2^244, i.e. the integer + // 2^256/2^244 = 4096. + gf5248_mul(d, d, &INVT244); + return r; +} + +// see gf5248.h +uint32_t +gf5248_invert(gf5248 *d, const gf5248 *a) +{ + return gf5248_div(d, &gf5248_ONE, a); +} + +// see gf5248.h +int32_t +gf5248_legendre(const gf5248 *x) +{ + // Same algorithm as the binary GCD in gf5248_div(), with + // a few differences: + // - We do not keep track of the Bézout coefficients u and v. + // - In each inner iteration we adjust the running symbol value, + // which uses the low 3 bits of the values. + // - Since we need two extra bits of look-ahead, we can only run + // 29 inner iterations, and then need an extra recomputation + // for the last 2. + + gf5248 a, b; + uint64_t xa, xb, f0, g0, f1, g1, ls; + + inner_gf5248_normalize(&a, x); + b = MODULUS; + ls = 0; // running symbol information in bit 1. + + // Outer loop + for (int i = 0; i < 15; i++) { + // Get approximations of a and b over 64 bits. + uint64_t m3 = a.v3 | b.v3; + uint64_t m2 = a.v2 | b.v2; + uint64_t m1 = a.v1 | b.v1; + uint64_t tnz3 = sgnw(m3 | -m3); + uint64_t tnz2 = sgnw(m2 | -m2) & ~tnz3; + uint64_t tnz1 = sgnw(m1 | -m1) & ~tnz3 & ~tnz2; + uint64_t tnzm = (m3 & tnz3) | (m2 & tnz2) | (m1 & tnz1); + uint64_t tnza = (a.v3 & tnz3) | (a.v2 & tnz2) | (a.v1 & tnz1); + uint64_t tnzb = (b.v3 & tnz3) | (b.v2 & tnz2) | (b.v1 & tnz1); + uint64_t snza = (a.v2 & tnz3) | (a.v1 & tnz2) | (a.v0 & tnz1); + uint64_t snzb = (b.v2 & tnz3) | (b.v1 & tnz2) | (b.v0 & tnz1); + + int64_t s = lzcnt(tnzm); + uint64_t sm = (uint64_t)((31 - s) >> 63); + tnza ^= sm & (tnza ^ ((tnza << 32) | (snza >> 32))); + tnzb ^= sm & (tnzb ^ ((tnzb << 32) | (snzb >> 32))); + s -= 32 & sm; + tnza <<= s; + tnzb <<= s; + + uint64_t tzx = ~(tnz1 | tnz2 | tnz3); + tnza |= a.v0 & tzx; + tnzb |= b.v0 & tzx; + xa = (a.v0 & 0x7FFFFFFF) | (tnza & 0xFFFFFFFF80000000); + xb = (b.v0 & 0x7FFFFFFF) | (tnzb & 0xFFFFFFFF80000000); + + // First 290 inner iterations. + uint64_t fg0 = (uint64_t)1; + uint64_t fg1 = (uint64_t)1 << 32; + for (int j = 0; j < 29; j++) { + uint64_t a_odd, swap, t0, t1, t2; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf5248_sbb(0, xa, xb, &t0); + (void)inner_gf5248_sbb(cc, 0, 0, &swap); + swap &= a_odd; + ls ^= swap & xa & xb; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + t2 = swap & (fg0 ^ fg1); + fg0 ^= t2; + fg1 ^= t2; + xa -= a_odd & xb; + fg0 -= a_odd & fg1; + xa >>= 1; + fg1 <<= 1; + ls ^= (xb + 2) >> 1; + } + + // Compute the updated a and b (low words only) to get + // enough bits for the next two iterations. + uint64_t fg0z = fg0 + 0x7FFFFFFF7FFFFFFF; + uint64_t fg1z = fg1 + 0x7FFFFFFF7FFFFFFF; + f0 = (fg0z & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g0 = (fg0z >> 32) - (uint64_t)0x7FFFFFFF; + f1 = (fg1z & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g1 = (fg1z >> 32) - (uint64_t)0x7FFFFFFF; + uint64_t a0 = (a.v0 * f0 + b.v0 * g0) >> 29; + uint64_t b0 = (a.v0 * f1 + b.v0 * g1) >> 29; + for (int j = 0; j < 2; j++) { + uint64_t a_odd, swap, t0, t1, t2, t3; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf5248_sbb(0, xa, xb, &t0); + (void)inner_gf5248_sbb(cc, 0, 0, &swap); + swap &= a_odd; + ls ^= swap & a0 & b0; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + t2 = swap & (fg0 ^ fg1); + fg0 ^= t2; + fg1 ^= t2; + t3 = swap & (a0 ^ b0); + a0 ^= t3; + b0 ^= t3; + xa -= a_odd & xb; + fg0 -= a_odd & fg1; + a0 -= a_odd & b0; + xa >>= 1; + fg1 <<= 1; + a0 >>= 1; + ls ^= (b0 + 2) >> 1; + } + + // Propagate updates to a and b. + fg0 += 0x7FFFFFFF7FFFFFFF; + fg1 += 0x7FFFFFFF7FFFFFFF; + f0 = (fg0 & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g0 = (fg0 >> 32) - (uint64_t)0x7FFFFFFF; + f1 = (fg1 & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g1 = (fg1 >> 32) - (uint64_t)0x7FFFFFFF; + gf5248 na, nb; + uint64_t nega = lindiv31abs(&na, &a, &b, f0, g0); + (void)lindiv31abs(&nb, &a, &b, f1, g1); + ls ^= nega & nb.v0; + a = na; + b = nb; + } + + // Final iterations: values are at most 37 bits now. We do not + // need to keep track of update coefficients. Just like the GCD, + // we need only 35 iterations, because after 35 iterations, + // value a is 0 or 1, and b is 1, and no further modification to + // the Legendre symbol may happen. + xa = a.v0; + xb = b.v0; + for (int j = 0; j < 35; j++) { + uint64_t a_odd, swap, t0, t1; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf5248_sbb(0, xa, xb, &t0); + (void)inner_gf5248_sbb(cc, 0, 0, &swap); + swap &= a_odd; + ls ^= swap & xa & xb; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + xa -= a_odd & xb; + xa >>= 1; + ls ^= (xb + 2) >> 1; + } + + // At this point, if the source value was not zero, then the low + // bit of ls contains the QR status (0 = square, 1 = non-square), + // which we need to convert to the expected value (+1 or -1). + // If y == 0, then we return 0, per the API. + uint32_t r = 1 - ((uint32_t)ls & 2); + r &= ~gf5248_iszero(x); + return *(int32_t *)&r; +} + +// see gf5248.h +uint32_t +gf5248_sqrt(gf5248 *d, const gf5248 *a) +{ + // Candidate root is a^((q+1)/4), with (q+1)/4 = 5*2^246 + gf5248 y; + gf5248_xsquare(&y, a, 2); + gf5248_mul(&y, &y, a); + gf5248_xsquare(&y, &y, 246); + + // Normalize y and negate if necessary, to set the low bit to 0. + // The low bit check must be on the normal representation, + // not the Montgomery representation. + gf5248 yn; + inner_gf5248_montgomery_reduce(&yn, &y); + uint32_t ctl = -((uint32_t)yn.v0 & 1); + gf5248_neg(&yn, &y); + gf5248_select(&y, &y, &yn, ctl); + + // Check whether the candidate is indeed a square root. + gf5248_square(&yn, &y); + uint32_t r = gf5248_equals(&yn, a); + *d = y; + return r; +} + +// Little-endian encoding of a 64-bit integer. +static inline void +enc64le(void *dst, uint64_t x) +{ + uint8_t *buf = dst; + buf[0] = (uint8_t)x; + buf[1] = (uint8_t)(x >> 8); + buf[2] = (uint8_t)(x >> 16); + buf[3] = (uint8_t)(x >> 24); + buf[4] = (uint8_t)(x >> 32); + buf[5] = (uint8_t)(x >> 40); + buf[6] = (uint8_t)(x >> 48); + buf[7] = (uint8_t)(x >> 56); +} + +// Little-endian decoding of a 64-bit integer. +static inline uint64_t +dec64le(const void *src) +{ + const uint8_t *buf = src; + return (uint64_t)buf[0] | ((uint64_t)buf[1] << 8) | ((uint64_t)buf[2] << 16) | ((uint64_t)buf[3] << 24) | + ((uint64_t)buf[4] << 32) | ((uint64_t)buf[5] << 40) | ((uint64_t)buf[6] << 48) | ((uint64_t)buf[7] << 56); +} + +// see gf5248.h +void +gf5248_encode(void *dst, const gf5248 *a) +{ + uint8_t *buf = dst; + gf5248 x; + + inner_gf5248_montgomery_reduce(&x, a); + enc64le(buf, x.v0); + enc64le(buf + 8, x.v1); + enc64le(buf + 16, x.v2); + enc64le(buf + 24, x.v3); +} + +// see gf5248.h +uint32_t +gf5248_decode(gf5248 *d, const void *src) +{ + const uint8_t *buf = src; + uint64_t d0, d1, d2, d3, t; + unsigned char cc; + + d0 = dec64le(buf); + d1 = dec64le(buf + 8); + d2 = dec64le(buf + 16); + d3 = dec64le(buf + 24); + cc = inner_gf5248_sbb(0, d0, MODULUS.v0, &t); + cc = inner_gf5248_sbb(cc, d1, MODULUS.v1, &t); + cc = inner_gf5248_sbb(cc, d2, MODULUS.v2, &t); + cc = inner_gf5248_sbb(cc, d3, MODULUS.v3, &t); + (void)inner_gf5248_sbb(cc, 0, 0, &t); + + // If the value was not canonical then t = 0; otherwise, t = -1. + d->v0 = d0 & t; + d->v1 = d1 & t; + d->v2 = d2 & t; + d->v3 = d3 & t; + + // Convert to Montgomery representation. + gf5248_mul(d, d, &R2); + + return (uint32_t)t; +} + +// see gf5248.h +void +gf5248_decode_reduce(gf5248 *d, const void *src, size_t len) +{ + const uint8_t *buf = src; + + *d = gf5248_ZERO; + if (len == 0) { + return; + } + + if ((len & 31) != 0) { + // Input size is not a multiple of 32, we decode a partial + // block, which is already less than 2^248. + uint8_t tmp[32]; + size_t k; + + k = len & ~(size_t)31; + memcpy(tmp, buf + k, len - k); + memset(tmp + len - k, 0, (sizeof tmp) - (len - k)); + d->v0 = dec64le(&tmp[0]); + d->v1 = dec64le(&tmp[8]); + d->v2 = dec64le(&tmp[16]); + d->v3 = dec64le(&tmp[24]); + len = k; + } else { + // Input size is a multiple of 32, we decode a full block, + // and a reduction is needed. + len -= 32; + uint64_t d0 = dec64le(buf + len); + uint64_t d1 = dec64le(buf + len + 8); + uint64_t d2 = dec64le(buf + len + 16); + uint64_t d3 = dec64le(buf + len + 24); + inner_gf5248_partial_reduce(d, d0, d1, d2, d3); + } + + // Process all remaining blocks, in descending address order. + while (len > 0) { + gf5248_mul(d, d, &R2); + len -= 32; + uint64_t t0 = dec64le(buf + len); + uint64_t t1 = dec64le(buf + len + 8); + uint64_t t2 = dec64le(buf + len + 16); + uint64_t t3 = dec64le(buf + len + 24); + gf5248 t; + inner_gf5248_partial_reduce(&t, t0, t1, t2, t3); + gf5248_add(d, d, &t); + } + + // Final conversion to Montgomery representation. + gf5248_mul(d, d, &R2); +} + +void +gf5248_div3(gf5248 *d, const gf5248 *a) +{ + const digit_t MAGIC = 0xAAAAAAAAAAAAAAAB; // 3^-1 mod 2^64 + uint64_t c0, c1, f0, f1; + gf5248 t; + + inner_gf5248_umul(f0, f1, a->arr[3], MAGIC); + t.arr[3] = f1 >> 1; + c1 = a->arr[3] - 3 * t.arr[3]; + + for (int32_t i = 2; i >= 0; i--) { + c0 = c1; + inner_gf5248_umul(f0, f1, a->arr[i], MAGIC); + t.arr[i] = f1 >> 1; + c1 = c0 + a->arr[i] - 3 * t.arr[i]; + t.arr[i] += c0 * ((MAGIC - 1) >> 1); + f0 = ((c1 >> 1) & c1); /* c1 == 3 */ + f1 = ((c1 >> 2) & !(c1 & 0x11)); /* c1 == 4 */ + f0 |= f1; + t.arr[i] += f0; + c1 = c1 - 3 * f0; + } + *d = t; + gf5248_sub(&t, d, &PM1O3); + gf5248_select(d, d, &t, -((c1 & 1) | (c1 >> 1))); // c1 >= 1 + gf5248_sub(&t, d, &PM1O3); + gf5248_select(d, d, &t, -(c1 == 2)); +} \ No newline at end of file diff --git a/src/gf/broadwell/lvl1/include/fp.h b/src/gf/broadwell/lvl1/include/fp.h index 7fb11af..8564b9c 100644 --- a/src/gf/broadwell/lvl1/include/fp.h +++ b/src/gf/broadwell/lvl1/include/fp.h @@ -1,7 +1,8 @@ #ifndef FP_H #define FP_H -//////////////////////////////////////////////// NOTE: this is placed here for now +// Include statements +#include #include #include #include @@ -10,67 +11,129 @@ #include #include -typedef digit_t fp_t[NWORDS_FIELD]; // Datatype for representing field elements +#include "gf5248.h" -void fp_set(digit_t* x, const digit_t val); -bool fp_is_equal(const digit_t* a, const digit_t* b); -bool fp_is_zero(const digit_t* a); -void fp_copy(digit_t* out, const digit_t* a); -digit_t mp_shiftr(digit_t* x, const unsigned int shift, const unsigned int nwords); -void mp_shiftl(digit_t* x, const unsigned int shift, const unsigned int nwords); -void fp_add(digit_t* out, const digit_t* a, const digit_t* b); -void fp_sub(digit_t* out, const digit_t* a, const digit_t* b); -void fp_neg(digit_t* out, const digit_t* a); -void fp_sqr(digit_t* out, const digit_t* a); -void fp_mul(digit_t* out, const digit_t* a, const digit_t* b); -void MUL(digit_t* out, const digit_t a, const digit_t b); -void fp_inv(digit_t* x); -bool fp_is_square(const digit_t* a); -void fp_sqrt(digit_t* a); -void fp_tomont(digit_t* out, const digit_t* a); -void fp_frommont(digit_t* out, const digit_t* a); -void fp_mont_setone(digit_t* out); +// Type for elements of GF(p) +#define fp_t gf5248 -/********************** Constant-time unsigned comparisons ***********************/ +// Constants (Assumed to be in Montgomery form) +#define ZERO gf5248_ZERO +#define ONE gf5248_ONE -// The following functions return 1 (TRUE) if condition is true, 0 (FALSE) otherwise - -static inline unsigned int is_digit_nonzero_ct(digit_t x) -{ // Is x != 0? - return (unsigned int)((x | (0 - x)) >> (RADIX - 1)); +// Operations in fp +static inline void +fp_neg(fp_t *d, const fp_t *a) +{ + gf5248_neg(d, a); } -static inline unsigned int is_digit_zero_ct(digit_t x) -{ // Is x = 0? - return (unsigned int)(1 ^ is_digit_nonzero_ct(x)); +void fp_add(fp_t *out, const fp_t *a, const fp_t *b); // implemented in fp_asm.S +void fp_sub(fp_t *out, const fp_t *a, const fp_t *b); // implemented in fp_asm.S +void fp_sqr(fp_t *out, const fp_t *a); // implemented in fp_asm.S +void fp_mul(fp_t *out, const fp_t *a, const fp_t *b); // implemented in fp_asm.S + +static inline void +fp_mul_small(fp_t *d, const fp_t *a, uint32_t n) +{ + gf5248_mul_small(d, a, n); } -static inline unsigned int is_digit_lessthan_ct(digit_t x, digit_t y) -{ // Is x < y? - return (unsigned int)((x ^ ((x ^ y) | ((x - y) ^ y))) >> (RADIX - 1)); +static inline void +fp_half(fp_t *d, const fp_t *a) +{ + gf5248_half(d, a); +} +// #define fp_half gf5248_half + +static inline void +fp_div3(fp_t *d, const fp_t *a) +{ + gf5248_div3(d, a); +} +// #define fp_div3 gf5248_div3 + +// Constant time selection and swapping +static inline void +fp_select(fp_t *d, const fp_t *a0, const fp_t *a1, uint32_t ctl) +{ + gf5248_select(d, a0, a1, ctl); +} +// #define fp_select gf5248_select +static inline void +fp_cswap(fp_t *a, fp_t *b, uint32_t ctl) +{ + gf5248_cswap(a, b, ctl); +} +// #define fp_cswap gf5248_cswap + +// Comparisons for fp elements +static inline uint32_t +fp_is_zero(const fp_t *a) +{ + return gf5248_iszero(a); +} +// #define fp_is_zero gf5248_iszero + +static inline uint32_t +fp_is_equal(const fp_t *a, const fp_t *b) +{ + return gf5248_equals(a, b); +} +// #define fp_is_equal gf5248_equals + +// Set a uint32 to an Fp value +static inline void +fp_set_small(fp_t *d, uint32_t x) +{ + gf5248_set_small(d, x); +} +// #define fp_set_small gf5248_set_small + +// Encoding and decoding of bytes +static inline void +fp_encode(void *dst, const fp_t *a) +{ + gf5248_encode(dst, a); +} +// #define fp_encode gf5248_encode +static inline uint32_t +fp_decode(fp_t *d, const void *src) +{ + return gf5248_decode(d, src); +} +// #define fp_decode gf5248_decode +static inline void +fp_decode_reduce(fp_t *d, const void *src, size_t len) +{ + gf5248_decode_reduce(d, src, len); +} +// #define fp_decode_reduce gf5248_decode_reduce + +// These functions are essentially useless because we can just +// use = for the shallow copies we need, but they're here for +// now until we do a larger refactoring +static inline void +fp_copy(fp_t *out, const fp_t *a) +{ + memcpy(out, a, sizeof(fp_t)); } -/********************** Platform-independent macros for digit-size operations **********************/ +static inline void +fp_set_zero(fp_t *a) +{ + memcpy(a, &ZERO, sizeof(fp_t)); +} -// Digit addition with carry -#define ADDC(sumOut, carryOut, addend1, addend2, carryIn) \ - { digit_t tempReg = (addend1) + (digit_t)(carryIn); \ - (sumOut) = (addend2) + tempReg; \ - (carryOut) = (is_digit_lessthan_ct(tempReg, (digit_t)(carryIn)) | is_digit_lessthan_ct((sumOut), tempReg)); } +static inline void +fp_set_one(fp_t *a) +{ + memcpy(a, &ONE, sizeof(fp_t)); +} -// Digit subtraction with borrow -#define SUBC(differenceOut, borrowOut, minuend, subtrahend, borrowIn) \ - { digit_t tempReg = (minuend) - (subtrahend); \ - unsigned int borrowReg = (is_digit_lessthan_ct((minuend), (subtrahend)) | ((borrowIn) & is_digit_zero_ct(tempReg))); \ - (differenceOut) = tempReg - (digit_t)(borrowIn); \ - (borrowOut) = borrowReg; } +// Functions defined in low level code but with different API +void fp_inv(fp_t *a); +void fp_sqrt(fp_t *a); +void fp_exp3div4(fp_t *a); +uint32_t fp_is_square(const fp_t *a); -// Shift right with flexible datatype -#define SHIFTR(highIn, lowIn, shift, shiftOut, DigitSize) \ - (shiftOut) = ((lowIn) >> (shift)) ^ ((highIn) << (DigitSize - (shift))); - -// Digit shift left -#define SHIFTL(highIn, lowIn, shift, shiftOut, DigitSize) \ - (shiftOut) = ((highIn) << (shift)) ^ ((lowIn) >> (RADIX - (shift))); - -#endif \ No newline at end of file +#endif diff --git a/src/gf/broadwell/lvl1/include/fp2.h b/src/gf/broadwell/lvl1/include/fp2.h index 8015de0..5f84fdf 100644 --- a/src/gf/broadwell/lvl1/include/fp2.h +++ b/src/gf/broadwell/lvl1/include/fp2.h @@ -1,29 +1,41 @@ #ifndef FP2_H #define FP2_H -#include "fp.h" +#define NO_FP2X_MUL +#define NO_FP2X_SQR -// Structure for representing elements in GF(p^2) -typedef struct fp2_t { - fp_t re, im; -} fp2_t; +#include -void fp2_set(fp2_t* x, const digit_t val); -bool fp2_is_zero(const fp2_t* a); -bool fp2_is_equal(const fp2_t* a, const fp2_t* b); -void fp2_copy(fp2_t* x, const fp2_t* y); -fp2_t fp2_non_residue(); -void fp2_add(fp2_t* x, const fp2_t* y, const fp2_t* z); -void fp2_sub(fp2_t* x, const fp2_t* y, const fp2_t* z); -void fp2_neg(fp2_t* x, const fp2_t* y); -void fp2_mul(fp2_t* x, const fp2_t* y, const fp2_t* z); -void fp2_sqr(fp2_t* x, const fp2_t* y); -void fp2_inv(fp2_t* x); -bool fp2_is_square(const fp2_t* x); -void fp2_frob(fp2_t* x, const fp2_t* y); -void fp2_sqrt(fp2_t* x); -void fp2_tomont(fp2_t* x, const fp2_t* y); -void fp2_frommont(fp2_t* x, const fp2_t* y); -int fp2_cmp(fp2_t* x, fp2_t* y); +extern void fp2_sq_c0(fp2_t *out, const fp2_t *in); +extern void fp2_sq_c1(fp_t *out, const fp2_t *in); -#endif +extern void fp2_mul_c0(fp_t *out, const fp2_t *in0, const fp2_t *in1); +extern void fp2_mul_c1(fp_t *out, const fp2_t *in0, const fp2_t *in1); + +static inline void +fp2_mul(fp2_t *x, const fp2_t *y, const fp2_t *z) +{ + fp_t t; + + fp2_mul_c0(&t, y, z); // c0 = a0*b0 - a1*b1 + fp2_mul_c1(&x->im, y, z); // c1 = a0*b1 + a1*b0 + x->re.arr[0] = t.arr[0]; + x->re.arr[1] = t.arr[1]; + x->re.arr[2] = t.arr[2]; + x->re.arr[3] = t.arr[3]; +} + +static inline void +fp2_sqr(fp2_t *x, const fp2_t *y) +{ + fp2_t t; + + fp2_sq_c0(&t, y); // c0 = (a0+a1)(a0-a1) + fp2_sq_c1(&x->im, y); // c1 = 2a0*a1 + x->re.arr[0] = t.re.arr[0]; + x->re.arr[1] = t.re.arr[1]; + x->re.arr[2] = t.re.arr[2]; + x->re.arr[3] = t.re.arr[3]; +} + +#endif \ No newline at end of file diff --git a/src/gf/broadwell/lvl1/include/gf5248.h b/src/gf/broadwell/lvl1/include/gf5248.h new file mode 100644 index 0000000..45686b6 --- /dev/null +++ b/src/gf/broadwell/lvl1/include/gf5248.h @@ -0,0 +1,912 @@ +/* + * This code is derived from discussions with Thomas Pornin + */ + +#ifndef gf5248_h__ +#define gf5248_h__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include +#include +#include +#include + + typedef uint64_t digit_t; // Datatype for representing field elements + + /* + * A gf5248 instance represents an integer modulo q. + * This is a structure; it can be copied with a simple assignment, and + * passed around as a value (though exchanging pointers is possibly more + * efficient). + * The contents are opaque. No calling code should make any assumption + * about the contents. + */ + + typedef union + { + // Contents are opaque. + // Implementation note: this encodes the value in Montgomery + // representation, with R = 2^256, and partially reduced (value + // is less than 2^251, but not necessarily less than q). + struct + { + uint64_t v0; + uint64_t v1; + uint64_t v2; + uint64_t v3; + }; + digit_t arr[4]; + } gf5248; + + /* + * Constant zero (in the field). + */ + extern const gf5248 gf5248_ZERO; + + /* + * Constant one (in the field). + */ + extern const gf5248 gf5248_ONE; + + /* + * Constant -1 (in the field). + */ + extern const gf5248 gf5248_MINUS_ONE; + + /* + * API RULES: + * ========== + * + * Elementary operations on field elements are implemented by functions + * which take as parameter pointers to the operands. The first parameter + * is the pointer to the destination. Thus: + * gf5248 a = ...; + * gf5248 b = ...; + * gf5248 d; + * gf5248_sub(&d, &a, &b) + * sets field element d to a - b (implicitly modulo q). + * + * Operands may be used several times: it is always valid to use as + * output a gf5248 structure which is also used as input. + * + * Boolean values are represented by 32-bit integer (uint32_t) which have + * value exactly 0xFFFFFFFF (for "true") or 0x00000000 (for "false"). This + * convention minimizes the risk that a "smart" compiler breaks the + * constant-time property of the code through unfortunated optimizations. + * When a function expects such a Boolean, the caller MUST take care never + * to provide any value other than 0x00000000 or 0xFFFFFFFF. + * + * Values are encoded into exactly 32 bytes: value x modulo q is mapped to + * its unique integer representant in the [0..q-1] range, which is then + * encoded over 32 bytes with little-endian convention. Encoding is canonical + * and checked: when decoding (with gf5248_decode()), the input value is + * verified to be in the [0..q-1] range; for an out-of-range value, + * gf5248_decode() fills the output structure with zero, and returns + * 0x00000000. + * + * For most operations, the implementation is an inline function, defined + * below; the compiler can thus efficiently include it in the calling code. + * A few expensive operations (e.g. divisions) use non-inline functions, + * declared below but defined in gf5248.c + * + * All functions and macro whose name starts with "inner_gf5248_" are + * internal to this implementation and visible here only in order to + * support the API inline functions; they MUST NOT be used directly. + */ + +#if (defined _MSC_VER && defined _M_X64) || (defined __x86_64__ && (defined __GNUC__ || defined __clang__)) +#include +#define inner_gf5248_adc(cc, a, b, d) _addcarry_u64(cc, a, b, (unsigned long long *)(void *)d) +#define inner_gf5248_sbb(cc, a, b, d) _subborrow_u64(cc, a, b, (unsigned long long *)(void *)d) +#else +static inline unsigned char +inner_gf5248_adc(unsigned char cc, uint64_t a, uint64_t b, uint64_t *d) +{ + unsigned __int128 t = (unsigned __int128)a + (unsigned __int128)b + cc; + *d = (uint64_t)t; + return (unsigned char)(t >> 64); +} +static inline unsigned char +inner_gf5248_sbb(unsigned char cc, uint64_t a, uint64_t b, uint64_t *d) +{ + unsigned __int128 t = (unsigned __int128)a - (unsigned __int128)b - cc; + *d = (uint64_t)t; + return (unsigned char)(-(uint64_t)(t >> 64)); +} +#endif + +#if defined _MSC_VER +#define inner_gf5248_umul(lo, hi, x, y) \ + do { \ + uint64_t umul_hi; \ + (lo) = _umul128((x), (y), &umul_hi); \ + (hi) = umul_hi; \ + } while (0) +#define inner_gf5248_umul_add(lo, hi, x, y, z) \ + do { \ + uint64_t umul_lo, umul_hi; \ + umul_lo = _umul128((x), (y), &umul_hi); \ + unsigned char umul_cc; \ + umul_cc = inner_gf5248_adc(0, umul_lo, (z), &umul_lo); \ + (void)inner_gf5248_adc(umul_cc, umul_hi, 0, &umul_hi); \ + (lo) = umul_lo; \ + (hi) = umul_hi; \ + } while (0) +#define inner_gf5248_umul_x2(lo, hi, x1, y1, x2, y2) \ + do { \ + uint64_t umul_lo, umul_hi; \ + umul_lo = _umul128((x1), (y1), &umul_hi); \ + uint64_t umul_lo2, umul_hi2; \ + umul_lo2 = _umul128((x2), (y2), &umul_hi2); \ + unsigned char umul_cc; \ + umul_cc = inner_gf5248_adc(0, umul_lo, umul_lo2, &umul_lo); \ + (void)inner_gf5248_adc(umul_cc, umul_hi, umul_hi2, &umul_hi); \ + (lo) = umul_lo; \ + (hi) = umul_hi; \ + } while (0) +#define inner_gf5248_umul_x2_add(lo, hi, x1, y1, x2, y2, z) \ + do { \ + uint64_t umul_lo, umul_hi; \ + umul_lo = _umul128((x1), (y1), &umul_hi); \ + uint64_t umul_lo2, umul_hi2; \ + umul_lo2 = _umul128((x2), (y2), &umul_hi2); \ + unsigned char umul_cc; \ + umul_cc = inner_gf5248_adc(0, umul_lo, umul_lo2, &umul_lo); \ + (void)inner_gf5248_adc(umul_cc, umul_hi, umul_hi2, &umul_hi); \ + umul_cc = inner_gf5248_adc(0, umul_lo, (z), &umul_lo); \ + (void)inner_gf5248_adc(umul_cc, umul_hi, 0, &umul_hi); \ + (lo) = umul_lo; \ + (hi) = umul_hi; \ + } while (0) +#else +#define inner_gf5248_umul(lo, hi, x, y) \ + do { \ + unsigned __int128 umul_tmp; \ + umul_tmp = (unsigned __int128)(x) * (unsigned __int128)(y); \ + (lo) = (uint64_t)umul_tmp; \ + (hi) = (uint64_t)(umul_tmp >> 64); \ + } while (0) +#define inner_gf5248_umul_add(lo, hi, x, y, z) \ + do { \ + unsigned __int128 umul_tmp; \ + umul_tmp = (unsigned __int128)(x) * (unsigned __int128)(y) + (unsigned __int128)(uint64_t)(z); \ + (lo) = (uint64_t)umul_tmp; \ + (hi) = (uint64_t)(umul_tmp >> 64); \ + } while (0) +#define inner_gf5248_umul_x2(lo, hi, x1, y1, x2, y2) \ + do { \ + unsigned __int128 umul_tmp; \ + umul_tmp = \ + (unsigned __int128)(x1) * (unsigned __int128)(y1) + (unsigned __int128)(x2) * (unsigned __int128)(y2); \ + (lo) = (uint64_t)umul_tmp; \ + (hi) = (uint64_t)(umul_tmp >> 64); \ + } while (0) +#define inner_gf5248_umul_x2_add(lo, hi, x1, y1, x2, y2, z) \ + do { \ + unsigned __int128 umul_tmp; \ + umul_tmp = (unsigned __int128)(x1) * (unsigned __int128)(y1) + \ + (unsigned __int128)(x2) * (unsigned __int128)(y2) + (unsigned __int128)(uint64_t)(z); \ + (lo) = (uint64_t)umul_tmp; \ + (hi) = (uint64_t)(umul_tmp >> 64); \ + } while (0) +#endif + + /* + * d <- a + b + */ + static inline void + gf5248_add(gf5248 *d, const gf5248 *a, const gf5248 *b) + { + uint64_t d0, d1, d2, d3, f; + unsigned char cc; + + // Raw addition. + cc = inner_gf5248_adc(0, a->v0, b->v0, &d0); + cc = inner_gf5248_adc(cc, a->v1, b->v1, &d1); + cc = inner_gf5248_adc(cc, a->v2, b->v2, &d2); + (void)inner_gf5248_adc(cc, a->v3, b->v3, &d3); + + // Sum is up to 2^252 - 2. Subtract q if the value is not lower + // than 2^251 (we subtract q by adding -q). + f = d3 >> 59; + cc = inner_gf5248_adc(0, d0, f, &d0); + cc = inner_gf5248_adc(cc, d1, 0, &d1); + cc = inner_gf5248_adc(cc, d2, 0, &d2); + (void)inner_gf5248_adc(cc, d3, ((uint64_t)0xFB << 56) & -f, &d3); + + // One subtraction of q might not be enough. + f = d3 >> 59; + cc = inner_gf5248_adc(0, d0, f, &d0); + cc = inner_gf5248_adc(cc, d1, 0, &d1); + cc = inner_gf5248_adc(cc, d2, 0, &d2); + (void)inner_gf5248_adc(cc, d3, ((uint64_t)0xFB << 56) & -f, &d3); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + } + + /* + * d <- a - b + */ + static inline void + gf5248_sub(gf5248 *d, const gf5248 *a, const gf5248 *b) + { + uint64_t d0, d1, d2, d3, m, f; + unsigned char cc; + + // Raw subtraction. + cc = inner_gf5248_sbb(0, a->v0, b->v0, &d0); + cc = inner_gf5248_sbb(cc, a->v1, b->v1, &d1); + cc = inner_gf5248_sbb(cc, a->v2, b->v2, &d2); + cc = inner_gf5248_sbb(cc, a->v3, b->v3, &d3); + + // Add 2*q if the result is negative. + (void)inner_gf5248_sbb(cc, 0, 0, &m); + cc = inner_gf5248_sbb(0, d0, m & 2, &d0); + cc = inner_gf5248_sbb(cc, d1, 0, &d1); + cc = inner_gf5248_sbb(cc, d2, 0, &d2); + (void)inner_gf5248_sbb(cc, d3, ((uint64_t)0xF6 << 56) & m, &d3); + + // We might have overdone it; subtract q if necessary. + f = d3 >> 59; + cc = inner_gf5248_adc(0, d0, f, &d0); + cc = inner_gf5248_adc(cc, d1, 0, &d1); + cc = inner_gf5248_adc(cc, d2, 0, &d2); + (void)inner_gf5248_adc(cc, d3, ((uint64_t)0xFB << 56) & -f, &d3); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + } + + /* + * d <- -a + */ + static inline void + gf5248_neg(gf5248 *d, const gf5248 *a) + { + uint64_t d0, d1, d2, d3, f; + unsigned char cc; + + // 2*q - a + cc = inner_gf5248_sbb(0, (uint64_t)0xFFFFFFFFFFFFFFFE, a->v0, &d0); + cc = inner_gf5248_sbb(cc, (uint64_t)0xFFFFFFFFFFFFFFFF, a->v1, &d1); + cc = inner_gf5248_sbb(cc, (uint64_t)0xFFFFFFFFFFFFFFFF, a->v2, &d2); + (void)inner_gf5248_sbb(cc, (uint64_t)0x09FFFFFFFFFFFFFF, a->v3, &d3); + + // Subtract q if the value is not lower than 2^251. + f = d3 >> 59; + cc = inner_gf5248_adc(0, d0, f, &d0); + cc = inner_gf5248_adc(cc, d1, 0, &d1); + cc = inner_gf5248_adc(cc, d2, 0, &d2); + (void)inner_gf5248_adc(cc, d3, ((uint64_t)0xFB << 56) & -f, &d3); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + } + + /* + * If ctl == 0x00000000, then *a0 is copied into *d. + * If ctl == 0xFFFFFFFF, then *a1 is copied into *d. + * ctl MUST be either 0x00000000 or 0xFFFFFFFF. + */ + static inline void + gf5248_select(gf5248 *d, const gf5248 *a0, const gf5248 *a1, uint32_t ctl) + { + uint64_t cw = (uint64_t)*(int32_t *)&ctl; + d->v0 = a0->v0 ^ (cw & (a0->v0 ^ a1->v0)); + d->v1 = a0->v1 ^ (cw & (a0->v1 ^ a1->v1)); + d->v2 = a0->v2 ^ (cw & (a0->v2 ^ a1->v2)); + d->v3 = a0->v3 ^ (cw & (a0->v3 ^ a1->v3)); + } + + /* + * If ctl == 0x00000000, then *a and *b are unchanged. + * If ctl == 0xFFFFFFFF, then the contents of *a and *b are swapped. + * ctl MUST be either 0x00000000 or 0xFFFFFFFF. + */ + static inline void + gf5248_cswap(gf5248 *a, gf5248 *b, uint32_t ctl) + { + uint64_t cw = (uint64_t)*(int32_t *)&ctl; + uint64_t t; + t = cw & (a->v0 ^ b->v0); + a->v0 ^= t; + b->v0 ^= t; + t = cw & (a->v1 ^ b->v1); + a->v1 ^= t; + b->v1 ^= t; + t = cw & (a->v2 ^ b->v2); + a->v2 ^= t; + b->v2 ^= t; + t = cw & (a->v3 ^ b->v3); + a->v3 ^= t; + b->v3 ^= t; + } + + /* + * d <- a/2 + */ + static inline void + gf5248_half(gf5248 *d, const gf5248 *a) + { + uint64_t d0, d1, d2, d3; + + d0 = (a->v0 >> 1) | (a->v1 << 63); + d1 = (a->v1 >> 1) | (a->v2 << 63); + d2 = (a->v2 >> 1) | (a->v3 << 63); + d3 = a->v3 >> 1; + d3 += ((uint64_t)5 << 55) & -(a->v0 & 1); + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + } + + // Inner function: 256-bit to 251-bit reduction + static inline void + inner_gf5248_partial_reduce(gf5248 *d, uint64_t a0, uint64_t a1, uint64_t a2, uint64_t a3) + { + uint64_t d0, d1, d2, d3, h, quo, rem; + unsigned char cc; + + // Split value in high (8 bits) and low (248 bits) parts. + h = a3 >> 56; + a3 &= 0x00FFFFFFFFFFFFFF; + + // 5*2^248 = 1 mod q; hence, we add floor(h/5) + (h mod 5)*2^248 + // to the low part. + quo = (h * 0xCD) >> 10; + rem = h - (5 * quo); + cc = inner_gf5248_adc(0, a0, quo, &d0); + cc = inner_gf5248_adc(cc, a1, 0, &d1); + cc = inner_gf5248_adc(cc, a2, 0, &d2); + (void)inner_gf5248_adc(cc, a3, rem << 56, &d3); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + } + + /* + * d <- 2*a + */ + static inline void + gf5248_mul2(gf5248 *d, const gf5248 *a) + { + gf5248_add(d, a, a); + } + + /* + * d <- 4*a + */ + static inline void + gf5248_mul4(gf5248 *d, const gf5248 *a) + { + uint64_t d0, d1, d2, d3; + d0 = a->v0 << 2; + d1 = (a->v0 >> 62) | (a->v1 << 2); + d2 = (a->v1 >> 62) | (a->v2 << 2); + d3 = (a->v2 >> 62) | (a->v3 << 2); + inner_gf5248_partial_reduce(d, d0, d1, d2, d3); + } + + /* + * d <- 8*a + */ + static inline void + gf5248_mul8(gf5248 *d, const gf5248 *a) + { + uint64_t d0, d1, d2, d3; + d0 = a->v0 << 3; + d1 = (a->v0 >> 61) | (a->v1 << 3); + d2 = (a->v1 >> 61) | (a->v2 << 3); + d3 = (a->v2 >> 61) | (a->v3 << 3); + inner_gf5248_partial_reduce(d, d0, d1, d2, d3); + } + + /* + * d <- 16*a + */ + static inline void + gf5248_mul16(gf5248 *d, const gf5248 *a) + { + uint64_t d0, d1, d2, d3; + d0 = a->v0 << 4; + d1 = (a->v0 >> 60) | (a->v1 << 4); + d2 = (a->v1 >> 60) | (a->v2 << 4); + d3 = (a->v2 >> 60) | (a->v3 << 4); + inner_gf5248_partial_reduce(d, d0, d1, d2, d3); + } + + /* + * d <- 32*a + */ + static inline void + gf5248_mul32(gf5248 *d, const gf5248 *a) + { + uint64_t d0, d1, d2, d3; + d0 = a->v0 << 5; + d1 = (a->v0 >> 59) | (a->v1 << 5); + d2 = (a->v1 >> 59) | (a->v2 << 5); + d3 = (a->v2 >> 59) | (a->v3 << 5); + inner_gf5248_partial_reduce(d, d0, d1, d2, d3); + } + + /* + * d <- a*x + * (multiplication by a 32-bit integer) + */ + static inline void + gf5248_mul_small(gf5248 *d, const gf5248 *a, uint32_t x) + { + uint64_t d0, d1, d2, d3, d4, lo, hi, b, h, quo, rem; + unsigned char cc; + + // Product over the integers. Top output word (d4) is at most 27 bits. + b = (uint64_t)x; + inner_gf5248_umul(d0, d1, a->v0, b); + inner_gf5248_umul(d2, d3, a->v2, b); + inner_gf5248_umul(lo, hi, a->v1, b); + cc = inner_gf5248_adc(0, d1, lo, &d1); + cc = inner_gf5248_adc(cc, d2, hi, &d2); + inner_gf5248_umul(lo, d4, a->v3, b); + cc = inner_gf5248_adc(cc, d3, lo, &d3); + (void)inner_gf5248_adc(cc, d4, 0, &d4); + + // Extract low 248-bit part, and the high part (at most 35 bits). + h = (d4 << 8) | (d3 >> 56); + d3 &= 0x00FFFFFFFFFFFFFF; + + // Fold h by adding floor(h/5) + (h mod 5)*2^248 to the low part. + inner_gf5248_umul(lo, hi, h, 0xCCCCCCCCCCCCCCCD); + quo = hi >> 2; + rem = h - (5 * quo); + cc = inner_gf5248_adc(cc, d0, quo, &d0); + cc = inner_gf5248_adc(cc, d1, 0, &d1); + cc = inner_gf5248_adc(cc, d2, 0, &d2); + (void)inner_gf5248_adc(cc, d3, rem << 56, &d3); + + // Max value is now 5*2^248 + 6871947672 + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + } + + /* + * d <- x + * Input value x (32-bit integer) is converted to field element x mod q. + */ + static inline void + gf5248_set_small(gf5248 *d, uint32_t x) + { + // We want Montgomery representation, i.e. x*2^256 mod q. + // We set h = x*2^8; then: + // x*2^256 = h*2^248 + // = (h mod 5)*2^248 + floor(h/5)*5*2^248 + // = (h mod 5)*2^248 + floor(h/5) mod q + // by using the fact that 5*2^248 = 1 mod q. + uint64_t h, lo, hi, quo, rem; + + h = (uint64_t)x << 8; + inner_gf5248_umul(lo, hi, h, 0xCCCCCCCCCCCCCCCD); + (void)lo; + quo = hi >> 2; + rem = h - (5 * quo); + d->v0 = quo; + d->v1 = 0; + d->v2 = 0; + d->v3 = rem << 56; + } + + // Inner function: d <- a/2^256, with normalization to [0..q-1]. + static inline void + inner_gf5248_montgomery_reduce(gf5248 *d, const gf5248 *a) + { + uint64_t x0, x1, x2, x3, f0, f1, f2, f3; + uint64_t g0, g1, g2, g3, g4, g5, g6, g7; + uint64_t d0, d1, d2, d3; + uint64_t hi, t, w; + unsigned char cc; + + // Let m = -1/q mod 2^256 = 5*2^248 + 1 + // For input x, we compute f = x*m mod 2^256, then + // h = x + f*q, which is a multiple of 2^256. The output + // is then h/2^256. + // Since x < 2^256, we have: + // h <= 2^256 - 1 + (2^256 - 1)*q + // h <= q*2^256 + 2^256 - q - 1 + // Since h = 0 mod 2^256, this implies that h <= q*2^256. + // The output h/2^256 is therefore between 0 and q (inclusive). + + x0 = a->v0; + x1 = a->v1; + x2 = a->v2; + x3 = a->v3; + + // f = x*(-1/q) mod 2^256 + f0 = x0; + f1 = x1; + f2 = x2; + f3 = x3 + ((x0 * 5) << 56); + + // g = f*q + inner_gf5248_umul(g3, hi, f0, (uint64_t)5 << 56); + inner_gf5248_umul_add(g4, hi, f1, (uint64_t)5 << 56, hi); + inner_gf5248_umul_add(g5, hi, f2, (uint64_t)5 << 56, hi); + inner_gf5248_umul_add(g6, g7, f3, (uint64_t)5 << 56, hi); + cc = inner_gf5248_sbb(0, 0, f0, &g0); + cc = inner_gf5248_sbb(cc, 0, f1, &g1); + cc = inner_gf5248_sbb(cc, 0, f2, &g2); + cc = inner_gf5248_sbb(cc, g3, f3, &g3); + cc = inner_gf5248_sbb(cc, g4, 0, &g4); + cc = inner_gf5248_sbb(cc, g5, 0, &g5); + cc = inner_gf5248_sbb(cc, g6, 0, &g6); + (void)inner_gf5248_sbb(cc, g7, 0, &g7); + + // h = x + f*q (we drop the low 256 bits). + cc = inner_gf5248_adc(0, g0, x0, &x0); + cc = inner_gf5248_adc(cc, g1, x1, &x1); + cc = inner_gf5248_adc(cc, g2, x2, &x2); + cc = inner_gf5248_adc(cc, g3, x3, &x3); + cc = inner_gf5248_adc(cc, g4, 0, &d0); + cc = inner_gf5248_adc(cc, g5, 0, &d1); + cc = inner_gf5248_adc(cc, g6, 0, &d2); + (void)inner_gf5248_adc(cc, g7, 0, &d3); + + // Normalize: if h = q, replace it with zero. + t = d0 & d1 & d2 & (d3 ^ ~(uint64_t)0x04FFFFFFFFFFFFFF); + cc = inner_gf5248_adc(0, t, 1, &t); + (void)inner_gf5248_sbb(cc, 0, 0, &w); + w = ~w; + d->v0 = d0 & w; + d->v1 = d1 & w; + d->v2 = d2 & w; + d->v3 = d3 & w; + } + + /* + * d <- a*b + */ + static inline void + gf5248_mul(gf5248 *d, const gf5248 *a, const gf5248 *b) + { + uint64_t e0, e1, e2, e3, e4, e5, e6, e7; + uint64_t f0, f1, f2, f3, lo, hi, lo2, hi2; + uint64_t g0, g1, g2, g3, g4, g5, g6, g7; + unsigned char cc; + + // Multiplication over integers. + inner_gf5248_umul(e0, e1, a->v0, b->v0); + inner_gf5248_umul(e2, e3, a->v1, b->v1); + inner_gf5248_umul(e4, e5, a->v2, b->v2); + inner_gf5248_umul(e6, e7, a->v3, b->v3); + + inner_gf5248_umul(lo, hi, a->v0, b->v1); + cc = inner_gf5248_adc(0, e1, lo, &e1); + cc = inner_gf5248_adc(cc, e2, hi, &e2); + inner_gf5248_umul(lo, hi, a->v0, b->v3); + cc = inner_gf5248_adc(cc, e3, lo, &e3); + cc = inner_gf5248_adc(cc, e4, hi, &e4); + inner_gf5248_umul(lo, hi, a->v2, b->v3); + cc = inner_gf5248_adc(cc, e5, lo, &e5); + cc = inner_gf5248_adc(cc, e6, hi, &e6); + (void)inner_gf5248_adc(cc, e7, 0, &e7); + + inner_gf5248_umul(lo, hi, a->v1, b->v0); + cc = inner_gf5248_adc(0, e1, lo, &e1); + cc = inner_gf5248_adc(cc, e2, hi, &e2); + inner_gf5248_umul(lo, hi, a->v3, b->v0); + cc = inner_gf5248_adc(cc, e3, lo, &e3); + cc = inner_gf5248_adc(cc, e4, hi, &e4); + inner_gf5248_umul(lo, hi, a->v3, b->v2); + cc = inner_gf5248_adc(cc, e5, lo, &e5); + cc = inner_gf5248_adc(cc, e6, hi, &e6); + (void)inner_gf5248_adc(cc, e7, 0, &e7); + + inner_gf5248_umul(lo, hi, a->v0, b->v2); + cc = inner_gf5248_adc(0, e2, lo, &e2); + cc = inner_gf5248_adc(cc, e3, hi, &e3); + inner_gf5248_umul(lo, hi, a->v1, b->v3); + cc = inner_gf5248_adc(cc, e4, lo, &e4); + cc = inner_gf5248_adc(cc, e5, hi, &e5); + cc = inner_gf5248_adc(cc, e6, 0, &e6); + (void)inner_gf5248_adc(cc, e7, 0, &e7); + + inner_gf5248_umul(lo, hi, a->v2, b->v0); + cc = inner_gf5248_adc(0, e2, lo, &e2); + cc = inner_gf5248_adc(cc, e3, hi, &e3); + inner_gf5248_umul(lo, hi, a->v3, b->v1); + cc = inner_gf5248_adc(cc, e4, lo, &e4); + cc = inner_gf5248_adc(cc, e5, hi, &e5); + cc = inner_gf5248_adc(cc, e6, 0, &e6); + (void)inner_gf5248_adc(cc, e7, 0, &e7); + + inner_gf5248_umul(lo, hi, a->v1, b->v2); + inner_gf5248_umul(lo2, hi2, a->v2, b->v1); + cc = inner_gf5248_adc(0, lo, lo2, &lo); + cc = inner_gf5248_adc(cc, hi, hi2, &hi); + (void)inner_gf5248_adc(cc, 0, 0, &hi2); + cc = inner_gf5248_adc(0, e3, lo, &e3); + cc = inner_gf5248_adc(cc, e4, hi, &e4); + cc = inner_gf5248_adc(cc, e5, hi2, &e5); + cc = inner_gf5248_adc(cc, e6, 0, &e6); + (void)inner_gf5248_adc(cc, e7, 0, &e7); + + // Montgomery reduction. + // + // Low part is lo(e) = e0..e3 (256 bits). + // Let m = -1/q mod 2^256; we add (lo(e)*m mod 2^256)*q to the + // high part g = e4..e7 (246 bits). + // + // We have m = 5*2^248 + 1. + f0 = e0; + f1 = e1; + f2 = e2; + f3 = e3 + ((e0 * 5) << 56); + + // g = f*q + inner_gf5248_umul(g3, hi, f0, (uint64_t)5 << 56); + inner_gf5248_umul_add(g4, hi, f1, (uint64_t)5 << 56, hi); + inner_gf5248_umul_add(g5, hi, f2, (uint64_t)5 << 56, hi); + inner_gf5248_umul_add(g6, g7, f3, (uint64_t)5 << 56, hi); + cc = inner_gf5248_sbb(0, 0, f0, &g0); + cc = inner_gf5248_sbb(cc, 0, f1, &g1); + cc = inner_gf5248_sbb(cc, 0, f2, &g2); + cc = inner_gf5248_sbb(cc, g3, f3, &g3); + cc = inner_gf5248_sbb(cc, g4, 0, &g4); + cc = inner_gf5248_sbb(cc, g5, 0, &g5); + cc = inner_gf5248_sbb(cc, g6, 0, &g6); + (void)inner_gf5248_sbb(cc, g7, 0, &g7); + + // Add g = f*q to e0..e7. + // Since e0..e7 < 2^502 and f < 2^256, we know that the result + // is less than 2^502 + 2^256*5*2^248, which is less than 6*2^504. + // This is also a multiple of 2^256. We divide by 2^256 by simply + // dropping the low 256 bits (which are all equal to zero), and + // the result is less than 6*2^248, which is already in our + // acceptable value range. + cc = inner_gf5248_adc(0, g0, e0, &e0); + cc = inner_gf5248_adc(cc, g1, e1, &e1); + cc = inner_gf5248_adc(cc, g2, e2, &e2); + cc = inner_gf5248_adc(cc, g3, e3, &e3); + cc = inner_gf5248_adc(cc, g4, e4, &e4); + cc = inner_gf5248_adc(cc, g5, e5, &e5); + cc = inner_gf5248_adc(cc, g6, e6, &e6); + (void)inner_gf5248_adc(cc, g7, e7, &e7); + + d->v0 = e4; + d->v1 = e5; + d->v2 = e6; + d->v3 = e7; + } + + /* + * d <- a^2 + */ + static inline void + gf5248_square(gf5248 *d, const gf5248 *a) + { + uint64_t e0, e1, e2, e3, e4, e5, e6, e7; + uint64_t f0, f1, f2, f3, lo, hi; + uint64_t g0, g1, g2, g3, g4, g5, g6, g7; + unsigned char cc; + + // Squaring over integers. + inner_gf5248_umul(e1, e2, a->v0, a->v1); + inner_gf5248_umul(e3, e4, a->v0, a->v3); + inner_gf5248_umul(e5, e6, a->v2, a->v3); + inner_gf5248_umul(lo, hi, a->v0, a->v2); + cc = inner_gf5248_adc(0, e2, lo, &e2); + cc = inner_gf5248_adc(cc, e3, hi, &e3); + inner_gf5248_umul(lo, hi, a->v1, a->v3); + cc = inner_gf5248_adc(cc, e4, lo, &e4); + cc = inner_gf5248_adc(cc, e5, hi, &e5); + (void)inner_gf5248_adc(cc, e6, 0, &e6); + inner_gf5248_umul(lo, hi, a->v1, a->v2); + cc = inner_gf5248_adc(0, e3, lo, &e3); + cc = inner_gf5248_adc(cc, e4, hi, &e4); + cc = inner_gf5248_adc(cc, e5, 0, &e5); + (void)inner_gf5248_adc(cc, e6, 0, &e6); + + // There cannot be extra carry here because the partial sum is + // necessarily lower than 2^448 at this point. + + e7 = e6 >> 63; + e6 = (e6 << 1) | (e5 >> 63); + e5 = (e5 << 1) | (e4 >> 63); + e4 = (e4 << 1) | (e3 >> 63); + e3 = (e3 << 1) | (e2 >> 63); + e2 = (e2 << 1) | (e1 >> 63); + e1 = e1 << 1; + + inner_gf5248_umul(e0, hi, a->v0, a->v0); + cc = inner_gf5248_adc(0, e1, hi, &e1); + inner_gf5248_umul(lo, hi, a->v1, a->v1); + cc = inner_gf5248_adc(cc, e2, lo, &e2); + cc = inner_gf5248_adc(cc, e3, hi, &e3); + inner_gf5248_umul(lo, hi, a->v2, a->v2); + cc = inner_gf5248_adc(cc, e4, lo, &e4); + cc = inner_gf5248_adc(cc, e5, hi, &e5); + inner_gf5248_umul(lo, hi, a->v3, a->v3); + cc = inner_gf5248_adc(cc, e6, lo, &e6); + (void)inner_gf5248_adc(cc, e7, hi, &e7); + + // Montgomery reduction. + // + // Low part is lo(e) = e0..e3 (256 bits). + // Let m = -1/q mod 2^256; we add (lo(e)*m mod 2^256)*q to the + // high part g = e4..e7 (246 bits). + // + // We have m = 5*2^248 + 1. + f0 = e0; + f1 = e1; + f2 = e2; + f3 = e3 + ((e0 * 5) << 56); + + // g = f*q + inner_gf5248_umul(g3, hi, f0, (uint64_t)5 << 56); + inner_gf5248_umul_add(g4, hi, f1, (uint64_t)5 << 56, hi); + inner_gf5248_umul_add(g5, hi, f2, (uint64_t)5 << 56, hi); + inner_gf5248_umul_add(g6, g7, f3, (uint64_t)5 << 56, hi); + cc = inner_gf5248_sbb(0, 0, f0, &g0); + cc = inner_gf5248_sbb(cc, 0, f1, &g1); + cc = inner_gf5248_sbb(cc, 0, f2, &g2); + cc = inner_gf5248_sbb(cc, g3, f3, &g3); + cc = inner_gf5248_sbb(cc, g4, 0, &g4); + cc = inner_gf5248_sbb(cc, g5, 0, &g5); + cc = inner_gf5248_sbb(cc, g6, 0, &g6); + (void)inner_gf5248_sbb(cc, g7, 0, &g7); + + // Add g = f*q to e0..e7. + // Since e0..e7 < 2^502 and f < 2^256, we know that the result + // is less than 2^502 + 2^256*5*2^248, which is less than 6*2^504. + // This is also a multiple of 2^256. We divide by 2^256 by simply + // dropping the low 256 bits (which are all equal to zero), and + // the result is less than 6*2^248, which is already in our + // acceptable value range. + cc = inner_gf5248_adc(0, g0, e0, &e0); + cc = inner_gf5248_adc(cc, g1, e1, &e1); + cc = inner_gf5248_adc(cc, g2, e2, &e2); + cc = inner_gf5248_adc(cc, g3, e3, &e3); + cc = inner_gf5248_adc(cc, g4, e4, &e4); + cc = inner_gf5248_adc(cc, g5, e5, &e5); + cc = inner_gf5248_adc(cc, g6, e6, &e6); + (void)inner_gf5248_adc(cc, g7, e7, &e7); + + d->v0 = e4; + d->v1 = e5; + d->v2 = e6; + d->v3 = e7; + } + + /* + * d <- a^(2^n) + * This computes n successive squarings of value a, with result in d. + * n == 0 is a valid input (in that case, *a is copied into *d). + * This function is not constant-time with regard to n: the number of + * successive squarings may be observable through timing-based side channels. + */ + static inline void + gf5248_xsquare(gf5248 *d, const gf5248 *a, unsigned n) + { + if (n == 0) { + *d = *a; + return; + } + gf5248_square(d, a); + while (n-- > 1) { + gf5248_square(d, d); + } + } + + /* + * Returns 0xFFFFFFFF if *a is zero; otherwise, 0x00000000 is returned. + */ + static inline uint32_t + gf5248_iszero(const gf5248 *a) + { + uint64_t a0, a1, a2, a3, t0, t1, r; + + // Zero can be represented by 0 or by q. + a0 = a->v0; + a1 = a->v1; + a2 = a->v2; + a3 = a->v3; + t0 = a0 | a1 | a2 | a3; + t1 = ~a0 | ~a1 | ~a2 | (a3 ^ 0x04FFFFFFFFFFFFFF); + + // Top bit of r is 0 if and only if one of t0 or t1 is zero. + r = (t0 | -t0) & (t1 | -t1); + return (uint32_t)(r >> 63) - 1; + } + + /* + * Returns 0xFFFFFFFF if *a and *b represent the same field element; + * otherwise, 0x00000000 is returned. + */ + static inline uint32_t + gf5248_equals(const gf5248 *a, const gf5248 *b) + { + gf5248 d; + gf5248_sub(&d, a, b); + return gf5248_iszero(&d); + } + + /* + * d <- 1/a + * If *a is not zero, then the inverse is well-defined and written into *d, + * and the function returns 0xFFFFFFFF. If *a is zero, then this function + * sets *d to zero and returns 0x00000000. + */ + uint32_t gf5248_invert(gf5248 *d, const gf5248 *a); + + /* + * d <- a/b + * If *b is not zero, then this functions writes a/b into *d, and returns + * 0xFFFFFFFF. If *b is zero, then this function sets *d to zero (regardless + * of the value of *a) and returns 0x00000000. + */ + uint32_t gf5248_div(gf5248 *d, const gf5248 *a, const gf5248 *b); + + /* + * d <- a/3 + * Divides by 3 in the field by implementing the algorithm proposed in + * "Efficient Multiplication in Finite Field Extensions of Degree 5" + * by El Mrabet, Guillevic and Ionica at ASIACRYPT 2011. + */ + void gf5248_div3(gf5248 *out, const gf5248 *a); + + /* + * Get the Legendre symbol of *a (0 for zero, +1 for a non-zero square, + * -1 for a non-square). + */ + int32_t gf5248_legendre(const gf5248 *a); + + /* + * If *a is a square, then this function sets *d to a square root of a, + * and returns 0xFFFFFFFF. If *a is not a square, then this function + * sets *d to a square root of -a, and returns 0x00000000. + * In all cases, the value written into *d is such that the least significant + * bit of its integer representation (in [0..q-1]) is zero. + */ + uint32_t gf5248_sqrt(gf5248 *d, const gf5248 *a); + + /* + * Encode field element *a into buffer dst (exactly 32 bytes are written). + */ + void gf5248_encode(void *dst, const gf5248 *a); + + /* + * Decode source buffer src (exactly 32 bytes) into a field element *d. + * If the source value is not a valid canonical encoding, then *d is zero + * and the function returns 0x00000000; otherwise, the function returns + * 0xFFFFFFFF. + */ + uint32_t gf5248_decode(gf5248 *d, const void *src); + + /* + * Interpret the source buffer (of size len bytes) as an unsigned integer + * (little-endian convention) and reduce it modulo q, yielding a field + * element which is written into *d. Since reduction is applied, this + * function cannot fail. + */ + void gf5248_decode_reduce(gf5248 *d, const void *src, size_t len); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/gf/broadwell/lvl1/test/CMakeLists.txt b/src/gf/broadwell/lvl1/test/CMakeLists.txt index 2f769a7..316e0a8 100644 --- a/src/gf/broadwell/lvl1/test/CMakeLists.txt +++ b/src/gf/broadwell/lvl1/test/CMakeLists.txt @@ -1,9 +1 @@ -add_executable(sqisign_test_gf_${SVARIANT_LOWER}_fp test_fp.c test_extras.c) -target_link_libraries(sqisign_test_gf_${SVARIANT_LOWER}_fp ${LIB_GF_${SVARIANT_UPPER}}) -target_include_directories(sqisign_test_gf_${SVARIANT_LOWER}_fp PRIVATE ../include ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC}) -add_test(sqisign_test_gf_${SVARIANT_LOWER}_fp sqisign_test_gf_${SVARIANT_LOWER}_fp test ${SQISIGN_TEST_REPS}) - -add_executable(sqisign_test_gf_${SVARIANT_LOWER}_fp2 test_fp2.c test_extras.c) -target_link_libraries(sqisign_test_gf_${SVARIANT_LOWER}_fp2 ${LIB_GF_${SVARIANT_UPPER}}) -target_include_directories(sqisign_test_gf_${SVARIANT_LOWER}_fp2 PRIVATE ../include ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC}) -add_test(sqisign_test_gf_${SVARIANT_LOWER}_fp2 sqisign_test_gf_${SVARIANT_LOWER}_fp2 test ${SQISIGN_TEST_REPS}) \ No newline at end of file +include(../../lvlx_test.cmake) diff --git a/src/gf/broadwell/lvl1/test/test_extras.c b/src/gf/broadwell/lvl1/test/test_extras.c deleted file mode 100644 index d0689c6..0000000 --- a/src/gf/broadwell/lvl1/test/test_extras.c +++ /dev/null @@ -1,74 +0,0 @@ -#include "test_extras.h" -#include - -// Global constants -extern const digit_t p[NWORDS_FIELD]; -extern const digit_t R2[NWORDS_FIELD]; - -#if 0 -int64_t cpucycles(void) -{ // Access system counter for benchmarking - unsigned int hi, lo; - - asm volatile ("rdtsc\n\t" : "=a" (lo), "=d"(hi)); - return ((int64_t)lo) | (((int64_t)hi) << 32); -} -#endif - - -int compare_words(digit_t* a, digit_t* b, unsigned int nwords) -{ // Comparing "nword" elements, a=b? : (1) a>b, (0) a=b, (-1) a= 0; i--) - { - if (a[i] > b[i]) return 1; - else if (a[i] < b[i]) return -1; - } - - return 0; -} - - -static void sub_test(digit_t* out, digit_t* a, digit_t* b, unsigned int nwords) -{ // Subtraction without borrow, out = a-b where a>b - // SECURITY NOTE: this function does not have constant-time execution. It is for TESTING ONLY. - unsigned int i; - digit_t res, carry, borrow = 0; - - for (i = 0; i < nwords; i++) - { - res = a[i] - b[i]; - carry = (a[i] < b[i]); - out[i] = res - borrow; - borrow = carry || (res < borrow); - } -} - - -void fprandom_test(digit_t* a) -{ // Generating a pseudo-random field element in [0, p-1] - // SECURITY NOTE: distribution is not fully uniform. TO BE USED FOR TESTING ONLY. - unsigned int i, diff = 256-254, nwords = NWORDS_FIELD; - unsigned char* string = NULL; - - string = (unsigned char*)a; - for (i = 0; i < sizeof(digit_t)*nwords; i++) { - *(string + i) = (unsigned char)rand(); // Obtain 256-bit number - } - a[nwords-1] &= (((digit_t)(-1) << diff) >> diff); - - while (compare_words((digit_t*)p, a, nwords) < 1) { // Force it to [0, modulus-1] - sub_test(a, a, (digit_t*)p, nwords); - } -} - - -void fp2random_test(fp2_t* a) -{ // Generating a pseudo-random element in GF(p^2) - // SECURITY NOTE: distribution is not fully uniform. TO BE USED FOR TESTING ONLY. - - fprandom_test(a->re); - fprandom_test(a->im); -} \ No newline at end of file diff --git a/src/gf/broadwell/lvl1/test/test_extras.h b/src/gf/broadwell/lvl1/test/test_extras.h deleted file mode 100644 index 3de524d..0000000 --- a/src/gf/broadwell/lvl1/test/test_extras.h +++ /dev/null @@ -1,25 +0,0 @@ - -#ifndef TEST_EXTRAS_H -#define TEST_EXTRAS_H - -#include -#include -#include "../include/fp.h" -#include "../include/fp2.h" - -#define PASSED 0 -#define FAILED 1 - -// Access system counter for benchmarking -//int64_t cpucycles(void); - -// Comparing "nword" elements, a=b? : (1) a!=b, (0) a=b -int compare_words(digit_t* a, digit_t* b, unsigned int nwords); - -// Generating a pseudo-random field element in [0, p-1] -void fprandom_test(digit_t* a); - -// Generating a pseudo-random element in GF(p^2) -void fp2random_test(fp2_t* a); - -#endif \ No newline at end of file diff --git a/src/gf/broadwell/lvl1/test/test_fp.c b/src/gf/broadwell/lvl1/test/test_fp.c deleted file mode 100644 index 033c570..0000000 --- a/src/gf/broadwell/lvl1/test/test_fp.c +++ /dev/null @@ -1,295 +0,0 @@ -#include "test_extras.h" -#include -#include -#include - -// Global constants -extern const digit_t p[NWORDS_FIELD]; - -// Benchmark and test parameters -static int BENCH_LOOPS = 100000; // Number of iterations per bench -static int TEST_LOOPS = 100000; // Number of iterations per test - - -bool fp_test() -{ // Tests for the field arithmetic - bool OK = true; - int n, passed; - fp_t a, b, c, d, e, f, ma, mb, mc, md, me, mf; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing field arithmetic over GF(p): \n\n"); - - // Field addition - passed = 1; - for (n=0; n\n"); - exit(1); - } - if (!strcmp(argv[1], "test")) { - TEST_LOOPS = atoi(argv[2]); - return !fp_test(); - } else if (!strcmp(argv[1], "bench")) { - BENCH_LOOPS = atoi(argv[2]); - return !fp_run(); - } else { - exit(1); - } -} \ No newline at end of file diff --git a/src/gf/broadwell/lvl1/test/test_fp2.c b/src/gf/broadwell/lvl1/test/test_fp2.c deleted file mode 100644 index 48b08c7..0000000 --- a/src/gf/broadwell/lvl1/test/test_fp2.c +++ /dev/null @@ -1,307 +0,0 @@ -#include "test_extras.h" -#include -#include -#include - -// Global constants -extern const digit_t p[NWORDS_FIELD]; - -// Benchmark and test parameters -static int BENCH_LOOPS = 100000; // Number of iterations per bench -static int TEST_LOOPS = 100000; // Number of iterations per test - - -bool fp2_test() -{ // Tests for the GF(p^2) arithmetic - bool OK = true; - int n, passed; - fp2_t a, b, c, d, e, f, ma, mb, mc, md, me, mf; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing arithmetic over GF(p^2): \n\n"); - - // Addition in GF(p^2) - passed = 1; - for (n=0; n\n"); - exit(1); - } - if (!strcmp(argv[1], "test")) { - TEST_LOOPS = atoi(argv[2]); - return !fp2_test(); - } else if (!strcmp(argv[1], "bench")) { - BENCH_LOOPS = atoi(argv[2]); - return !fp2_run(); - } else { - exit(1); - } -} \ No newline at end of file diff --git a/src/gf/broadwell/lvl3/CMakeLists.txt b/src/gf/broadwell/lvl3/CMakeLists.txt new file mode 100644 index 0000000..33a06b2 --- /dev/null +++ b/src/gf/broadwell/lvl3/CMakeLists.txt @@ -0,0 +1,6 @@ +set(SOURCE_FILES_GF_SPECIFIC + gf65376.c + fp_asm.S +) + +include(../lvlx.cmake) diff --git a/src/gf/broadwell/lvl3/fp.c b/src/gf/broadwell/lvl3/fp.c new file mode 100644 index 0000000..1ac3a49 --- /dev/null +++ b/src/gf/broadwell/lvl3/fp.c @@ -0,0 +1,108 @@ +#include +#include "fp.h" + +const digit_t p[NWORDS_FIELD] = { 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, + 0xffffffffffffffff, 0xffffffffffffffff, 0x40ffffffffffffff }; +const digit_t p2[NWORDS_FIELD] = { 0xfffffffffffffffe, 0xffffffffffffffff, 0xffffffffffffffff, + 0xffffffffffffffff, 0xffffffffffffffff, 0x81ffffffffffffff }; + +void +fp_sqrt(fp_t *x) +{ + (void)gf65376_sqrt(x, x); +} + +uint32_t +fp_is_square(const fp_t *a) +{ + // ls is (0, 1, -1) and we want fp_is_square + // to return 0xFF..FF when ls is 1 or 0 and 0x00..00 otherwise + int32_t ls = gf65376_legendre(a); + return ~(uint32_t)(ls >> 1); +} + +void +fp_inv(fp_t *x) +{ + (void)gf65376_invert(x, x); +} + +void +fp_exp3div4(fp_t *a) +{ + // + // We optimise this by using the shape of the prime + // to avoid almost all multiplications: + // + // We write: + // (p - 3) / 4 = (65*2^376 - 4) / 4 + // = 65*2^374 - 1 + // = 65*(2^374 - 1) + 64 + // Then we first compute: + // a374 = a**(2^374 - 1) + // Then from this we get the desired result as: + // a**((p-3)/4) = a374**65 * a**64 + // We can compute this with 13 multiplications and 383 squares. + fp_t z3, z64, t11, tmp; + // Compute a**3, a**4 and a**64 + fp_sqr(&z64, a); + fp_mul(&z3, a, &z64); + fp_sqr(&z64, &z64); + // Compute t11 = a^3 * a^4 = a**(2^3 - 1) = a**7 + fp_mul(&t11, &z3, &z64); + fp_sqr(&z64, &z64); + fp_sqr(&z64, &z64); + fp_sqr(&z64, &z64); + fp_sqr(&z64, &z64); + // Compute a**(2^4 - 1) = a**15 + fp_sqr(&tmp, &t11); + fp_mul(a, a, &tmp); + // Compute a**(2^8 - 1) + fp_sqr(&tmp, a); + for (int i = 1; i < 4; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(2^11 - 1) + for (int i = 0; i < 3; i++) + fp_sqr(a, a); + fp_mul(&t11, &t11, a); + // Compute a**(2^22 - 1) + fp_sqr(&tmp, &t11); + for (int i = 1; i < 11; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, &t11, &tmp); + // Compute a**(2^44 - 1) + fp_sqr(&tmp, a); + for (int i = 1; i < 22; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(2^88 - 1) + fp_sqr(&tmp, a); + for (int i = 1; i < 44; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(2^176 - 1)' + fp_sqr(&tmp, a); + for (int i = 1; i < 88; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(2^187 - 1) + for (int i = 0; i < 11; i++) + fp_sqr(a, a); + fp_mul(a, a, &t11); + // Compute a**(2^374 - 1) + fp_sqr(&tmp, a); + for (int i = 1; i < 187; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(65*(2^374 - 1)) + fp_sqr(&tmp, a); + fp_sqr(&tmp, &tmp); + fp_sqr(&tmp, &tmp); + fp_sqr(&tmp, &tmp); + fp_sqr(&tmp, &tmp); + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(65*(2^374 - 1) + 64) + fp_mul(a, a, &z64); +} diff --git a/src/gf/broadwell/lvl3/fp_asm.S b/src/gf/broadwell/lvl3/fp_asm.S new file mode 100755 index 0000000..45b12dc --- /dev/null +++ b/src/gf/broadwell/lvl3/fp_asm.S @@ -0,0 +1,825 @@ +#include +.intel_syntax noprefix + +.set pbytes,32 +.set plimbs,4 + +#ifdef __APPLE__ +.section __TEXT,__const +#else +.section .rodata +#endif +p_plus_1: .quad 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x4100000000000000 + +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",@progbits +#endif + +#include + +.text +.p2align 4,,15 + +.global fp_add +fp_add: + push r12 + push r13 + xor rax, rax + mov r8, [rsi] + mov r9, [rsi+8] + mov r10, [rsi+16] + mov r11, [rsi+24] + mov r12, [rsi+32] + mov r13, [rsi+40] + add r8, [rdx] + adc r9, [rdx+8] + adc r10, [rdx+16] + adc r11, [rdx+24] + adc r12, [rdx+32] + adc r13, [rdx+40] + mov rax, r13 + sar rax, 63 + mov rdx, [rip+p+40] + and rdx, rax + sub r8, rax + sbb r9, rax + sbb r10, rax + sbb r11, rax + sbb r12, rax + sbb r13, rdx + + mov rax, r13 + sar rax, 63 + mov rdx, [rip+p+40] + and rdx, rax + sub r8, rax + sbb r9, rax + sbb r10, rax + sbb r11, rax + sbb r12, rax + sbb r13, rdx + mov [rdi], r8 + mov [rdi+8], r9 + mov [rdi+16], r10 + mov [rdi+24], r11 + mov [rdi+32], r12 + mov [rdi+40], r13 + pop r13 + pop r12 + ret + +.global fp_sub +fp_sub: + push r12 + push r13 + xor rax, rax + mov r8, [rsi] + mov r9, [rsi+8] + mov r10, [rsi+16] + mov r11, [rsi+24] + mov r12, [rsi+32] + mov r13, [rsi+40] + sub r8, [rdx] + sbb r9, [rdx+8] + sbb r10, [rdx+16] + sbb r11, [rdx+24] + sbb r12, [rdx+32] + sbb r13, [rdx+40] + sbb rax, 0 + + mov rdx, [rip+p+40] + and rdx, rax + add r8, rax + adc r9, rax + adc r10, rax + adc r11, rax + adc r12, rax + adc r13, rdx + + mov rax, r13 + sar rax, 63 + mov rdx, [rip+p+40] + and rdx, rax + add r8, rax + adc r9, rax + adc r10, rax + adc r11, rax + adc r12, rax + adc r13, rdx + + mov [rdi], r8 + mov [rdi+8], r9 + mov [rdi+16], r10 + mov [rdi+24], r11 + mov [rdi+32], r12 + mov [rdi+40], r13 + pop r13 + pop r12 + ret + +///////////////////////////////////////////////////////////////// MACROS +// z = a x bi + z +// Inputs: base memory pointer M1 (a), +// bi pre-stored in rdx, +// accumulator z in [Z0:Z6] +// Output: [Z0:Z6] +// Temps: regs T0:T1 +///////////////////////////////////////////////////////////////// +.macro MULADD64x384 M1, Z0, Z1, Z2, Z3, Z4, Z5, Z6, T0, T1, C + mulx \T0, \T1, \M1 // A0*B0 + xor \C, \C + adox \Z0, \T1 + adox \Z1, \T0 + mulx \T0, \T1, 8\M1 // A0*B1 + adcx \Z1, \T1 + adox \Z2, \T0 + mulx \T0, \T1, 16\M1 // A0*B2 + adcx \Z2, \T1 + adox \Z3, \T0 + mulx \T0, \T1, 24\M1 // A0*B3 + adcx \Z3, \T1 + adox \Z4, \T0 + mulx \T0, \T1, 32\M1 // A0*B4 + adcx \Z4, \T1 + adox \Z5, \T0 + mulx \T0, \T1, 40\M1 // A0*B5 + adcx \Z5, \T1 + adox \Z6, \T0 + adc \Z6, 0 +.endm + +.macro MULADD64x64 M1, Z0, Z1, Z2, Z3, Z4, Z5, T0, T1 + mulx \T0, \T1, \M1 // A0*B0 + xor rax, rax + adox \Z4, \T1 + adox \Z5, \T0 +.endm + +//*********************************************************************** +// Multiplication in GF(p^2), non-complex part +// Operation: c [rdi] = a0 x b0 - a1 x b1 +// Inputs: a = [a1, a0] stored in [rsi] +// b = [b1, b0] stored in [rdx] +// Output: c stored in [rdi] +//*********************************************************************** +.global fp2_mul_c0 +fp2_mul_c0: + push r12 + push r13 + push r14 + push r15 + push rbx + mov rcx, rdx + sub rsp, 96 + + // [rdi0:5] <- 2p - b1 + mov r8, [rip+p2] + mov r9, [rip+p2+8] + mov r10, r9 + mov r11, r9 + mov r12, r9 + mov r13, [rip+p2+40] + mov rax, [rcx+48] + mov rdx, [rcx+56] + sub r8, rax + sbb r9, rdx + mov rax, [rcx+64] + mov rdx, [rcx+72] + sbb r10, rax + sbb r11, rdx + mov rax, [rcx+80] + mov rdx, [rcx+88] + sbb r12, rax + sbb r13, rdx + mov [rdi], r8 + mov [rdi+8], r9 + mov [rdi+16], r10 + mov [rdi+24], r11 + mov [rdi+32], r12 + mov [rdi+40], r13 + + // Correcting a to [0,p) + xor rax, rax + mov r8, [rsi+48] + mov r9, [rsi+56] + mov r10, [rsi+64] + mov r11, [rsi+72] + mov r12, [rsi+80] + mov r13, [rsi+88] + mov rbx, [rip+p] + mov rdx, [rip+p+40] + sub r8, rbx + sbb r9, rbx + sbb r10, rbx + sbb r11, rbx + sbb r12, rbx + sbb r13, rdx + sbb rax, 0 + and rdx, rax + add r8, rax + adc r9, rax + adc r10, rax + adc r11, rax + adc r12, rax + adc r13, rdx + mov [rsp+48], r8 + mov [rsp+56], r9 + mov [rsp+64], r10 + mov [rsp+72], r11 + mov [rsp+80], r12 + mov [rsp+88], r13 + + xor rax, rax + mov r8, [rsi] + mov r10, [rsi+8] + mov r12, [rsi+16] + mov r13, [rsi+24] + mov r14, [rsi+32] + mov r15, [rsi+40] + mov rdx, [rip+p+40] + sub r8, rbx + sbb r10, rbx + sbb r12, rbx + sbb r13, rbx + sbb r14, rbx + sbb r15, rdx + sbb rax, 0 + and rdx, rax + add r8, rax + adc r10, rax + adc r12, rax + adc r13, rax + adc r14, rax + adc r15, rdx + mov [rsp], r8 + mov [rsp+8], r10 + mov [rsp+16], r12 + mov [rsp+24], r13 + mov [rsp+32], r14 + mov [rsp+40], r15 + + // [r8:r14] <- z = a0 x b00 - a1 x b10 + mov rdx, [rcx] + mulx r9, r8, r8 + xor rax, rax + mulx r10, r11, r10 + adox r9, r11 + mulx r11, r12, r12 + adox r10, r12 + mulx r12, r13, r13 + adox r11, r13 + mulx r13, r14, r14 + adox r12, r14 + mulx r14, r15, r15 + adox r13, r15 + adox r14, rax + + mov rdx, [rdi] + MULADD64x384 [rsp+48], r8, r9, r10, r11, r12, r13, r14, r15, rbx, rax + // [r9:r14] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r8 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], r9, r10, r11, r12, r13, r14, r15, rbx + + // [r9:r14, r8] <- z = a0 x b01 - a1 x b11 + z + mov rdx, [rcx+8] + MULADD64x384 [rsp], r9, r10, r11, r12, r13, r14, r8, r15, rbx, r8 + mov rdx, [rdi+8] + MULADD64x384 [rsp+48], r9, r10, r11, r12, r13, r14, r8, r15, rbx, rax + // [r10:r14, r8] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r9 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], r10, r11, r12, r13, r14, r8, r15, rbx + + // [r10:r14, r8:r9] <- z = a0 x b02 - a1 x b12 + z + mov rdx, [rcx+16] + MULADD64x384 [rsp], r10, r11, r12, r13, r14, r8, r9, r15, rbx, r9 + mov rdx, [rdi+16] + MULADD64x384 [rsp+48], r10, r11, r12, r13, r14, r8, r9, r15, rbx, rax + // [r11:r14, r8:r9] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r10 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], r11, r12, r13, r14, r8, r9, r15, rbx + + // [r11:r14, r8:r10] <- z = a0 x b03 - a1 x b13 + z + mov rdx, [rcx+24] + MULADD64x384 [rsp], r11, r12, r13, r14, r8, r9, r10, r15, rbx, r10 + mov rdx, [rdi+24] + MULADD64x384 [rsp+48], r11, r12, r13, r14, r8, r9, r10, r15, rbx, rax + // [r14, r8:r10] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r11 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], r12, r13, r14, r8, r9, r10, r15, rbx + + // [r12:r14, r8:r11] <- z = a0 x b04 - a1 x b14 + z + mov rdx, [rcx+32] + MULADD64x384 [rsp], r12, r13, r14, r8, r9, r10, r11, r15, rbx, r11 + mov rdx, [rdi+32] + MULADD64x384 [rsp+48], r12, r13, r14, r8, r9, r10, r11, r15, rbx, rax + // [r14, r8:r11] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r12 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], r13, r14, r8, r9, r10, r11, r15, rbx + + // [r13:r14, r8:r12] <- z = a0 x b05 - a1 x b15 + z + mov rdx, [rcx+40] + MULADD64x384 [rsp], r13, r14, r8, r9, r10, r11, r12, r15, rbx, r12 + mov rdx, [rdi+40] + MULADD64x384 [rsp+48], r13, r14, r8, r9, r10, r11, r12, r15, rbx, rax + // [r14, r8:r12] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r13 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], r14, r8, r9, r10, r11, r12, r15, rbx + + // Final correction + mov rax, r12 + sar rax, 63 + mov rdx, [rip+p+40] + and rdx, rax + sub r14, rax + sbb r8, rax + sbb r9, rax + sbb r10, rax + sbb r11, rax + sbb r12, rdx + + mov [rdi], r14 + mov [rdi+8], r8 + mov [rdi+16], r9 + mov [rdi+24], r10 + mov [rdi+32], r11 + mov [rdi+40], r12 + add rsp, 96 + pop rbx + pop r15 + pop r14 + pop r13 + pop r12 + ret + +//*********************************************************************** +// Multiplication in GF(p^2), complex part +// Operation: c [rdi] = a0 x b1 + a1 x b0 +// Inputs: a = [a1, a0] stored in [rsi] +// b = [b1, b0] stored in [rdx] +// Output: c stored in [rdi] +//*********************************************************************** +.global fp2_mul_c1 +fp2_mul_c1: + push r12 + push r13 + push r14 + push r15 + push rbx + mov rcx, rdx + sub rsp, 96 + + // Correcting a to [0,p) + xor rax, rax + mov r8, [rsi+48] + mov r9, [rsi+56] + mov r10, [rsi+64] + mov r11, [rsi+72] + mov r12, [rsi+80] + mov r13, [rsi+88] + mov rbx, [rip+p] + mov rdx, [rip+p+40] + sub r8, rbx + sbb r9, rbx + sbb r10, rbx + sbb r11, rbx + sbb r12, rbx + sbb r13, rdx + sbb rax, 0 + and rdx, rax + add r8, rax + adc r9, rax + adc r10, rax + adc r11, rax + adc r12, rax + adc r13, rdx + mov [rsp+48], r8 + mov [rsp+56], r9 + mov [rsp+64], r10 + mov [rsp+72], r11 + mov [rsp+80], r12 + mov [rsp+88], r13 + + xor rax, rax + mov r8, [rsi] + mov r10, [rsi+8] + mov r12, [rsi+16] + mov r13, [rsi+24] + mov r14, [rsi+32] + mov r15, [rsi+40] + mov rdx, [rip+p+40] + sub r8, rbx + sbb r10, rbx + sbb r12, rbx + sbb r13, rbx + sbb r14, rbx + sbb r15, rdx + sbb rax, 0 + and rdx, rax + add r8, rax + adc r10, rax + adc r12, rax + adc r13, rax + adc r14, rax + adc r15, rdx + mov [rsp], r8 + mov [rsp+8], r10 + mov [rsp+16], r12 + mov [rsp+24], r13 + mov [rsp+32], r14 + mov [rsp+40], r15 + + // [r8:r14] <- z = a0 x b10 + a1 x b00 + mov rdx, [rcx+48] + mulx r9, r8, r8 + xor rax, rax + mulx r10, r11, r10 + adox r9, r11 + mulx r11, r12, r12 + adox r10, r12 + mulx r12, r13, r13 + adox r11, r13 + mulx r13, r14, r14 + adox r12, r14 + mulx r14, r15, r15 + adox r13, r15 + adox r14, rax + + mov rdx, [rcx] + MULADD64x384 [rsp+48], r8, r9, r10, r11, r12, r13, r14, r15, rbx, rax + // [r9:r14] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r8 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], r9, r10, r11, r12, r13, r14, r15, rbx + + // [r9:r14, r8] <- z = a0 x b01 - a1 x b11 + z + mov rdx, [rcx+56] + MULADD64x384 [rsi], r9, r10, r11, r12, r13, r14, r8, r15, rbx, r8 + mov rdx, [rcx+8] + MULADD64x384 [rsp+48], r9, r10, r11, r12, r13, r14, r8, r15, rbx, rax + // [r10:r14, r8] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r9 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], r10, r11, r12, r13, r14, r8, r15, rbx + + // [r10:r14, r8:r9] <- z = a0 x b02 - a1 x b12 + z + mov rdx, [rcx+64] + MULADD64x384 [rsp], r10, r11, r12, r13, r14, r8, r9, r15, rbx, r9 + mov rdx, [rcx+16] + MULADD64x384 [rsp+48], r10, r11, r12, r13, r14, r8, r9, r15, rbx, rax + // [r11:r14, r8:r9] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r10 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], r11, r12, r13, r14, r8, r9, r15, rbx + + // [r11:r14, r8:r10] <- z = a0 x b03 - a1 x b13 + z + mov rdx, [rcx+72] + MULADD64x384 [rsp], r11, r12, r13, r14, r8, r9, r10, r15, rbx, r10 + mov rdx, [rcx+24] + MULADD64x384 [rsp+48], r11, r12, r13, r14, r8, r9, r10, r15, rbx, rax + // [r14, r8:r10] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r11 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], r12, r13, r14, r8, r9, r10, r15, rbx + + // [r12:r14, r8:r11] <- z = a0 x b04 - a1 x b14 + z + mov rdx, [rcx+80] + MULADD64x384 [rsp], r12, r13, r14, r8, r9, r10, r11, r15, rbx, r11 + mov rdx, [rcx+32] + MULADD64x384 [rsp+48], r12, r13, r14, r8, r9, r10, r11, r15, rbx, rax + // [r14, r8:r11] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r12 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], r13, r14, r8, r9, r10, r11, r15, rbx + + // [r13:r14, r8:r12] <- z = a0 x b05 - a1 x b15 + z + mov rdx, [rcx+88] + MULADD64x384 [rsp], r13, r14, r8, r9, r10, r11, r12, r15, rbx, r12 + mov rdx, [rcx+40] + MULADD64x384 [rsp+48], r13, r14, r8, r9, r10, r11, r12, r15, rbx, rax + // [r14, r8:r12] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r13 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], r14, r8, r9, r10, r11, r12, r15, rbx + + // Final correction + mov rax, r12 + sar rax, 63 + mov rdx, [rip+p+40] + and rdx, rax + sub r14, rax + sbb r8, rax + sbb r9, rax + sbb r10, rax + sbb r11, rax + sbb r12, rdx + + mov [rdi], r14 + mov [rdi+8], r8 + mov [rdi+16], r9 + mov [rdi+24], r10 + mov [rdi+32], r11 + mov [rdi+40], r12 + add rsp, 96 + pop rbx + pop r15 + pop r14 + pop r13 + pop r12 + ret + +///////////////////////////////////////////////////////////////// MACRO +// z = a x b (mod p) +// Inputs: base memory pointers M0 (a), M1 (b) +// bi pre-stored in rdx, +// accumulator z in [Z0:Z6], pre-stores a0 x b +// Output: [Z0:Z6] +// Temps: regs T0:T1 +///////////////////////////////////////////////////////////////// +.macro FPMUL384x384 M0, M1, Z0, Z1, Z2, Z3, Z4, Z5, Z6, T0, T1 + // [Z1:Z6] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z0 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], \Z1, \Z2, \Z3, \Z4, \Z5, \Z6, \T0, \T1 + + // [Z1:Z6, Z0] <- z = a01 x a1 + z + mov rdx, 8\M0 + MULADD64x384 \M1, \Z1, \Z2, \Z3, \Z4, \Z5, \Z6, \Z0, \T0, \T1, \Z0 + // [Z2:Z6, Z0] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z1 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], \Z2, \Z3, \Z4, \Z5, \Z6, \Z0, \T0, \T1 + + // [Z2:Z6, Z0:Z1] <- z = a02 x a1 + z + mov rdx, 16\M0 + MULADD64x384 \M1, \Z2, \Z3, \Z4, \Z5, \Z6, \Z0, \Z1, \T0, \T1, \Z1 + // [Z3:Z6, Z0:Z1] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z2 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], \Z3, \Z4, \Z5, \Z6, \Z0, \Z1, \T0, \T1 + + // [Z3:Z6, Z0:Z2] <- z = a03 x a1 + z + mov rdx, 24\M0 + MULADD64x384 \M1, \Z3, \Z4, \Z5, \Z6, \Z0, \Z1, \Z2, \T0, \T1, \Z2 + // [Z4:Z6, Z0:Z2] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z3 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], \Z4, \Z5, \Z6, \Z0, \Z1, \Z2, \T0, \T1 + + // [Z4:Z6, Z0:Z3] <- z = a04 x a1 + z + mov rdx, 32\M0 + MULADD64x384 \M1, \Z4, \Z5, \Z6, \Z0, \Z1, \Z2, \Z3, \T0, \T1, \Z3 + // [Z5:Z6, Z0:Z3] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z4 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], \Z5, \Z6, \Z0, \Z1, \Z2, \Z3, \T0, \T1 + + // [Z5:Z6, Z0:Z4] <- z = a05 x a1 + z + mov rdx, 40\M0 + MULADD64x384 \M1, \Z5, \Z6, \Z0, \Z1, \Z2, \Z3, \Z4, \T0, \T1, \Z4 + // [Z6, Z0:Z4] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z5 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], \Z6, \Z0, \Z1, \Z2, \Z3, \Z4, \T0, \T1 +.endm + +//*********************************************************************** +// Squaring in GF(p^2), non-complex part +// Operation: c [rdi] = (a0+a1) x (a0-a1) +// Inputs: a = [a1, a0] stored in [rsi] +// Output: c stored in [rdi] +//*********************************************************************** +.global fp2_sq_c0 +fp2_sq_c0: + push r12 + push r13 + push r14 + push r15 + + // a0 + a1 + mov rdx, [rsi] + mov r9, [rsi+8] + mov r10, [rsi+16] + mov r11, [rsi+24] + mov r12, [rsi+32] + mov r13, [rsi+40] + add rdx, [rsi+48] + adc r9, [rsi+56] + adc r10, [rsi+64] + adc r11, [rsi+72] + adc r12, [rsi+80] + adc r13, [rsi+88] + mov [rdi], rdx + mov [rdi+8], r9 + mov [rdi+16], r10 + mov [rdi+24], r11 + mov [rdi+32], r12 + mov [rdi+40], r13 + + // a0 - a1 + mov r8, [rsi] + mov r10, [rsi+8] + mov r12, [rsi+16] + mov r13, [rsi+24] + mov r14, [rsi+32] + mov r15, [rsi+40] + xor rax, rax + sub r8, [rsi+48] + sbb r10, [rsi+56] + sbb r12, [rsi+64] + sbb r13, [rsi+72] + sbb r14, [rsi+80] + sbb r15, [rsi+88] + sbb rax, 0 + + mov rcx, [rip+p+40] + and rcx, rax + add r8, rax + adc r10, rax + adc r12, rax + adc r13, rax + adc r14, rax + adc r15, rcx + + mov rax, r15 + sar rax, 63 + mov rcx, [rip+p+40] + and rcx, rax + add r8, rax + adc r10, rax + adc r12, rax + adc r13, rax + adc r14, rax + adc r15, rcx + + mov [rdi+48], r8 + mov [rdi+56], r10 + mov [rdi+64], r12 + mov [rdi+72], r13 + mov [rdi+80], r14 + mov [rdi+88], r15 + + // [r8:r14] <- z = a00 x a1 + mulx r9, r8, r8 + xor rax, rax + mulx r10, r11, r10 + adox r9, r11 + mulx r11, r12, r12 + adox r10, r12 + mulx r12, r13, r13 + adox r11, r13 + mulx r13, r14, r14 + adox r12, r14 + mulx r14, r15, r15 + adox r13, r15 + adox r14, rax + + FPMUL384x384 [rdi], [rdi+48], r8, r9, r10, r11, r12, r13, r14, r15, rcx + + // Final correction + mov rax, r12 + sar rax, 63 + mov rdx, [rip+p+40] + and rdx, rax + sub r14, rax + sbb r8, rax + sbb r9, rax + sbb r10, rax + sbb r11, rax + sbb r12, rdx + + mov [rdi], r14 + mov [rdi+8], r8 + mov [rdi+16], r9 + mov [rdi+24], r10 + mov [rdi+32], r11 + mov [rdi+40], r12 + pop r15 + pop r14 + pop r13 + pop r12 + ret + +//*********************************************************************** +// Squaring in GF(p^2), complex part +// Operation: c [rdi] = 2a0 x a1 +// Inputs: a = [a1, a0] stored in [reg_p1] +// Output: c stored in [rdi] +//*********************************************************************** +.global fp2_sq_c1 +fp2_sq_c1: + push r12 + push r13 + push r14 + push r15 + + mov rdx, [rsi] + mov r9, [rsi+8] + mov r10, [rsi+16] + mov r11, [rsi+24] + mov r12, [rsi+32] + mov r13, [rsi+40] + add rdx, rdx + adc r9, r9 + adc r10, r10 + adc r11, r11 + adc r12, r12 + adc r13, r13 + sub rsp, 48 + mov [rsp+8], r9 + mov [rsp+16], r10 + mov [rsp+24], r11 + mov [rsp+32], r12 + mov [rsp+40], r13 + + // [r8:r12] <- z = a00 x a1 + mulx r9, r8, [rsi+48] + xor rax, rax + mulx r10, r11, [rsi+56] + adox r9, r11 + mulx r11, r12, [rsi+64] + adox r10, r12 + mulx r12, r13, [rsi+72] + adox r11, r13 + mulx r13, r14, [rsi+80] + adox r12, r14 + mulx r14, r15, [rsi+88] + adox r13, r15 + adox r14, rax + + FPMUL384x384 [rsp], [rsi+48], r8, r9, r10, r11, r12, r13, r14, r15, rcx + add rsp, 48 + + // Final correction + mov rax, r12 + sar rax, 63 + mov rdx, [rip+p+40] + and rdx, rax + sub r14, rax + sbb r8, rax + sbb r9, rax + sbb r10, rax + sbb r11, rax + sbb r12, rdx + + mov [rdi], r14 + mov [rdi+8], r8 + mov [rdi+16], r9 + mov [rdi+24], r10 + mov [rdi+32], r11 + mov [rdi+40], r12 + pop r15 + pop r14 + pop r13 + pop r12 + ret + +//*********************************************************************** +// Field multiplication in GF(p) +// Operation: c = a x b mod p +// Inputs: a stored in [rsi], b stored in [rdx] +// Output: c stored in [rdi] +//*********************************************************************** +.global fp_mul +fp_mul: + push r12 + push r13 + push r14 + push r15 + push rbx + mov rcx, rdx + + // [r8:r14] <- z = a x b0 + mov rdx, [rcx] + mulx r9, r8, [rsi] + xor rax, rax + mulx r10, r11, [rsi+8] + adox r9, r11 + mulx r11, r12, [rsi+16] + adox r10, r12 + mulx r12, r13, [rsi+24] + adox r11, r13 + mulx r13, r14, [rsi+32] + adox r12, r14 + mulx r14, r15, [rsi+40] + adox r13, r15 + adox r14, rax + + FPMUL384x384 [rcx], [rsi], r8, r9, r10, r11, r12, r13, r14, r15, rbx + + // Final correction + mov rax, r12 + sar rax, 63 + mov rdx, [rip+p+40] + and rdx, rax + sub r14, rax + sbb r8, rax + sbb r9, rax + sbb r10, rax + sbb r11, rax + sbb r12, rdx + + mov [rdi], r14 + mov [rdi+8], r8 + mov [rdi+16], r9 + mov [rdi+24], r10 + mov [rdi+32], r11 + mov [rdi+40], r12 + pop rbx + pop r15 + pop r14 + pop r13 + pop r12 + ret + +.global fp_sqr +fp_sqr: + mov rdx, rsi + jmp fp_mul diff --git a/src/gf/broadwell/lvl3/gf65376.c b/src/gf/broadwell/lvl3/gf65376.c new file mode 100644 index 0000000..367e32b --- /dev/null +++ b/src/gf/broadwell/lvl3/gf65376.c @@ -0,0 +1,792 @@ +#include "gf65376.h" + +// see gf65376.h +const gf65376 gf65376_ZERO = { 0, 0, 0, 0, 0, 0 }; + +// see gf65376.h +const gf65376 gf65376_ONE = { 0x0000000000000003, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x3D00000000000000 }; + +// see gf65376.h +const gf65376 gf65376_MINUS_ONE = { 0xFFFFFFFFFFFFFFFC, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x03FFFFFFFFFFFFFF }; + +// Montgomery representation of 2^256. +static const gf65376 R2 = { 0x3F03F03F03F03F13, 0x03F03F03F03F03F0, 0xF03F03F03F03F03F, + 0x3F03F03F03F03F03, 0x03F03F03F03F03F0, 0x1D3F03F03F03F03F }; + +// The modulus itself (this is also a valid representation of zero). +static const gf65376 MODULUS = { 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x40FFFFFFFFFFFFFF }; + +// 1/2^380 (in Montgomery representation). +static const gf65376 INVT380 = { 0x0000000000000010, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 }; + +static const gf65376 PM1O3 = { 0xaaaaaaaaaaaaaaaa, 0xaaaaaaaaaaaaaaaa, 0xaaaaaaaaaaaaaaaa, + 0xaaaaaaaaaaaaaaaa, 0xaaaaaaaaaaaaaaaa, 0x15aaaaaaaaaaaaaa }; + +// Expand the most significant bit of x into a full-width 64-bit word +// (0x0000000000000000 or 0xFFFFFFFFFFFFFFFF). +static inline uint64_t +sgnw(uint64_t x) +{ + return (uint64_t)(*(int64_t *)&x >> 63); +} + +// d <- u*f + v*g (in the field) +// Coefficients f and g are provided as unsigned integers, but they +// really are signed values which must be less than 2^62 (in absolute value). +static void +gf65376_lin(gf65376 *d, const gf65376 *u, const gf65376 *v, uint64_t f, uint64_t g) +{ + // f <- abs(f), keeping the sign in sf, and negating u accordingly + uint64_t sf = sgnw(f); + f = (f ^ sf) - sf; + gf65376 tu; + gf65376_neg(&tu, u); + gf65376_select(&tu, u, &tu, (uint32_t)sf); + + // g <- abs(g), keeping the sign in sg, and negating v accordingly + uint64_t sg = sgnw(g); + g = (g ^ sg) - sg; + gf65376 tv; + gf65376_neg(&tv, v); + gf65376_select(&tv, v, &tv, (uint32_t)sg); + + // Linear combination over plain integers. + uint64_t d0, d1, d2, d3, d4, d5, t; + inner_gf65376_umul_x2(d0, t, tu.v0, f, tv.v0, g); + inner_gf65376_umul_x2_add(d1, t, tu.v1, f, tv.v1, g, t); + inner_gf65376_umul_x2_add(d2, t, tu.v2, f, tv.v2, g, t); + inner_gf65376_umul_x2_add(d3, t, tu.v3, f, tv.v3, g, t); + inner_gf65376_umul_x2_add(d4, t, tu.v4, f, tv.v4, g, t); + inner_gf65376_umul_x2_add(d5, t, tu.v5, f, tv.v5, g, t); + + // Reduction: split into low part (376 bits) and high part + // (71 bits, since t can be up to 63 bits). If the high + // part is h, then: + // h*2^376 = (h mod 65)*2^376 + floor(h/65) mod q + uint64_t h0 = (d5 >> 56) | (t << 8); + uint64_t h1 = t >> 56; + d5 &= 0x00FFFFFFFFFFFFFF; + + // NOTE: 0xFC0FC0FC0FC0FC1 = 65^-1 % 2^64 + // NOTE: 0xFC1 = 65^-1 % 2^12 + uint64_t z0, z1, quo0, rem0, quo1, rem1; + inner_gf65376_umul(z0, z1, h0, 0xFC0FC0FC0FC0FC1); + (void)z0; + quo0 = z1 >> 2; + rem0 = h0 - (65 * quo0); + quo1 = (h1 * 0xFC1) >> 18; // Only keep bottom two bits + rem1 = h1 - (65 * quo1); + + // h = rem0 + 65*quo0 + (rem1 + 65*quo1)*2^64 + // = rem0 + rem1 + 65*(quo0 + quo1*2^64 + rem1*((2^64 - 1)/65)) + // We add rem0 and rem1 modulo 65, with an extra carry that + // goes into the folded part (multiple of 65). + uint64_t e, f0, f1; + unsigned char cc; + cc = inner_gf65376_adc(0, rem0 + 0xFFFFFFFFFFFFFFBE, rem1, &e); + cc = inner_gf65376_adc(cc, quo0, rem1 * 0x3F03F03F03F03F0, &f0); + cc = inner_gf65376_adc(cc, quo1, 0, &f1); + assert(cc == 0); + e -= 0xFFFFFFFFFFFFFFBE; + + // Now we only have to add e*2^384 + f0:f1 to the low part. + cc = inner_gf65376_adc(0, d0, f0, &d0); + cc = inner_gf65376_adc(cc, d1, f1, &d1); + cc = inner_gf65376_adc(cc, d2, 0, &d2); + cc = inner_gf65376_adc(cc, d3, 0, &d3); + cc = inner_gf65376_adc(cc, d4, 0, &d4); + (void)inner_gf65376_adc(cc, d5, e << 56, &d5); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; +} + +// d <- abs(floor((a*f + b*g) / 2^31)) +// Coefficients f and g are provided as unsigned integer, but they really +// are signed values, which MUST be at most 2^31 in absolute value. +// The computation is performed over the integers, not modulo q. The low +// 31 bits are dropped (in practice, callers provided appropriate coefficients +// f and g such that a*f + b*g is a multiple of 2^31. +// +// If a*f + b*g is negative, then the absolute value is computed, and the +// function returns 0xFFFFFFFFFFFFFFFF; otherwise, the function returns +// 0x0000000000000000. +static uint64_t +lindiv31abs(gf65376 *d, const gf65376 *a, const gf65376 *b, uint64_t f, uint64_t g) +{ + // f <- abs(f), keeping the sign in sf + uint64_t sf = sgnw(f); + f = (f ^ sf) - sf; + + // g <- abs(g), keeping the sign in sg + uint64_t sg = sgnw(g); + g = (g ^ sg) - sg; + + // Apply the signs of f and g to the source operands. + uint64_t a0, a1, a2, a3, a4, a5, a6; + uint64_t b0, b1, b2, b3, b4, b5, b6; + unsigned char cc; + + cc = inner_gf65376_sbb(0, a->v0 ^ sf, sf, &a0); + cc = inner_gf65376_sbb(cc, a->v1 ^ sf, sf, &a1); + cc = inner_gf65376_sbb(cc, a->v2 ^ sf, sf, &a2); + cc = inner_gf65376_sbb(cc, a->v3 ^ sf, sf, &a3); + cc = inner_gf65376_sbb(cc, a->v4 ^ sf, sf, &a4); + cc = inner_gf65376_sbb(cc, a->v5 ^ sf, sf, &a5); + (void)inner_gf65376_sbb(cc, 0, 0, &a6); + + cc = inner_gf65376_sbb(0, b->v0 ^ sg, sg, &b0); + cc = inner_gf65376_sbb(cc, b->v1 ^ sg, sg, &b1); + cc = inner_gf65376_sbb(cc, b->v2 ^ sg, sg, &b2); + cc = inner_gf65376_sbb(cc, b->v3 ^ sg, sg, &b3); + cc = inner_gf65376_sbb(cc, b->v4 ^ sg, sg, &b4); + cc = inner_gf65376_sbb(cc, b->v5 ^ sg, sg, &b5); + (void)inner_gf65376_sbb(cc, 0, 0, &b6); + + // Compute a*f + b*g into d0:d1:d2:d3:d4. Since f and g are at + // most 2^31, we can add two 128-bit products with no overflow. + // Note: a4 and b4 are both in {0, -1}. + uint64_t d0, d1, d2, d3, d4, d5, d6, t; + inner_gf65376_umul_x2(d0, t, a0, f, b0, g); + inner_gf65376_umul_x2_add(d1, t, a1, f, b1, g, t); + inner_gf65376_umul_x2_add(d2, t, a2, f, b2, g, t); + inner_gf65376_umul_x2_add(d3, t, a3, f, b3, g, t); + inner_gf65376_umul_x2_add(d4, t, a4, f, b4, g, t); + inner_gf65376_umul_x2_add(d5, t, a5, f, b5, g, t); + d6 = t - (a6 & f) - (b6 & g); + + // Right-shift the value by 31 bits. + d0 = (d0 >> 31) | (d1 << 33); + d1 = (d1 >> 31) | (d2 << 33); + d2 = (d2 >> 31) | (d3 << 33); + d3 = (d3 >> 31) | (d4 << 33); + d4 = (d4 >> 31) | (d5 << 33); + d5 = (d5 >> 31) | (d6 << 33); + + // If the result is negative, negate it. + t = sgnw(d6); + cc = inner_gf65376_sbb(0, d0 ^ t, t, &d0); + cc = inner_gf65376_sbb(cc, d1 ^ t, t, &d1); + cc = inner_gf65376_sbb(cc, d2 ^ t, t, &d2); + cc = inner_gf65376_sbb(cc, d3 ^ t, t, &d3); + cc = inner_gf65376_sbb(cc, d4 ^ t, t, &d4); + (void)inner_gf65376_sbb(cc, d5 ^ t, t, &d5); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + return t; +} + +// lzcnt(x) returns the number of leading bits of value 0 in x. It supports +// x == 0 (in which case the function returns 64). +#if defined __LZCNT__ +static inline uint64_t +lzcnt(uint64_t x) +{ + return _lzcnt_u64(x); +} +#else +static inline uint64_t +lzcnt(uint64_t x) +{ + uint64_t m, s; + m = sgnw((x >> 32) - 1); + s = m & 32; + x = (x >> 32) ^ (m & (x ^ (x >> 32))); + m = sgnw((x >> 16) - 1); + s |= m & 16; + x = (x >> 16) ^ (m & (x ^ (x >> 16))); + m = sgnw((x >> 8) - 1); + s |= m & 8; + x = (x >> 8) ^ (m & (x ^ (x >> 8))); + m = sgnw((x >> 4) - 1); + s |= m & 4; + x = (x >> 4) ^ (m & (x ^ (x >> 4))); + m = sgnw((x >> 2) - 1); + s |= m & 2; + x = (x >> 2) ^ (m & (x ^ (x >> 2))); + + // At this point, x fits on 2 bits. Count of extra zeros: + // x = 0 -> 2 + // x = 1 -> 1 + // x = 2 -> 0 + // x = 3 -> 0 + s += (2 - x) & ((x - 3) >> 2); + return s; +} +#endif + +// see gf65376.h +uint32_t +gf65376_div(gf65376 *d, const gf65376 *x, const gf65376 *y) +{ + // Extended binary GCD: + // + // a <- y + // b <- q (modulus) + // u <- x (self) + // v <- 0 + // + // Value a is normalized (in the 0..q-1 range). Values a and b are + // then considered as (signed) integers. Values u and v are field + // elements. + // + // Invariants: + // a*x = y*u mod q + // b*x = y*v mod q + // b is always odd + // + // At each step: + // if a is even, then: + // a <- a/2, u <- u/2 mod q + // else: + // if a < b: + // (a, u, b, v) <- (b, v, a, u) + // a <- (a-b)/2, u <- (u-v)/2 mod q + // + // What we implement below is the optimized version of this + // algorithm, as described in https://eprint.iacr.org/2020/972 + + gf65376 a, b, u, v; + uint64_t xa, xb, f0, g0, f1, g1; + uint32_t r; + + r = ~gf65376_iszero(y); + inner_gf65376_normalize(&a, y); + b = MODULUS; + u = *x; + v = gf65376_ZERO; + + // Generic loop does 23*31 = 713 inner iterations. + for (int i = 0; i < 23; i++) { + // Get approximations of a and b over 64 bits: + // - If len(a) <= 64 and len(b) <= 64, then we just use + // their values (low limbs). + // - Otherwise, with n = max(len(a), len(b)), we use: + // (a mod 2^31) + 2^31*floor(a / 2^(n - 33)) + // (b mod 2^31) + 2^31*floor(b / 2^(n - 33)) + uint64_t m5 = a.v5 | b.v5; + uint64_t m4 = a.v4 | b.v4; + uint64_t m3 = a.v3 | b.v3; + uint64_t m2 = a.v2 | b.v2; + uint64_t m1 = a.v1 | b.v1; + uint64_t tnz5 = sgnw(m5 | -m5); + uint64_t tnz4 = sgnw(m4 | -m4) & ~tnz5; + uint64_t tnz3 = sgnw(m3 | -m3) & ~tnz5 & ~tnz4; + uint64_t tnz2 = sgnw(m2 | -m2) & ~tnz5 & ~tnz4 & ~tnz3; + uint64_t tnz1 = sgnw(m1 | -m1) & ~tnz5 & ~tnz4 & ~tnz3 & ~tnz2; + uint64_t tnzm = (m5 & tnz5) | (m4 & tnz4) | (m3 & tnz3) | (m2 & tnz2) | (m1 & tnz1); + uint64_t tnza = (a.v5 & tnz5) | (a.v4 & tnz4) | (a.v3 & tnz3) | (a.v2 & tnz2) | (a.v1 & tnz1); + uint64_t tnzb = (b.v5 & tnz5) | (b.v4 & tnz4) | (b.v3 & tnz3) | (b.v2 & tnz2) | (b.v1 & tnz1); + uint64_t snza = (a.v4 & tnz5) | (a.v3 & tnz4) | (a.v2 & tnz3) | (a.v1 & tnz2) | (a.v0 & tnz1); + uint64_t snzb = (b.v4 & tnz5) | (b.v3 & tnz4) | (b.v2 & tnz3) | (b.v1 & tnz2) | (b.v0 & tnz1); + + // If both len(a) <= 64 and len(b) <= 64, then: + // tnzm = 0 + // tnza = 0, snza = 0, tnzb = 0, snzb = 0 + // Otherwise: + // tnzm != 0 + // tnza contains the top non-zero limb of a + // snza contains the limb right below tnza + // tnzb contains the top non-zero limb of a + // snzb contains the limb right below tnzb + // + // We count the number of leading zero bits in tnzm: + // - If s <= 31, then the top 31 bits can be extracted from + // tnza and tnzb alone. + // - If 32 <= s <= 63, then we need some bits from snza and + // snzb as well. + int64_t s = lzcnt(tnzm); + uint64_t sm = (uint64_t)((31 - s) >> 63); + tnza ^= sm & (tnza ^ ((tnza << 32) | (snza >> 32))); + tnzb ^= sm & (tnzb ^ ((tnzb << 32) | (snzb >> 32))); + s -= 32 & sm; + tnza <<= s; + tnzb <<= s; + + // At this point: + // - If len(a) <= 64 and len(b) <= 64, then: + // tnza = 0 + // tnzb = 0 + // tnz1 = tnz2 = tnz3 = tnz4 = tnz5 = 0 + // we want to use the entire low words of a and b + // - Otherwise, we want to use the top 33 bits of tnza and + // tnzb, and the low 31 bits of the low words of a and b. + uint64_t tzx = ~(tnz1 | tnz2 | tnz3 | tnz4 | tnz5); + tnza |= a.v0 & tzx; + tnzb |= b.v0 & tzx; + xa = (a.v0 & 0x7FFFFFFF) | (tnza & 0xFFFFFFFF80000000); + xb = (b.v0 & 0x7FFFFFFF) | (tnzb & 0xFFFFFFFF80000000); + + // Compute the 31 inner iterations on xa and xb. + uint64_t fg0 = (uint64_t)1; + uint64_t fg1 = (uint64_t)1 << 32; + for (int j = 0; j < 31; j++) { + uint64_t a_odd, swap, t0, t1, t2; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf65376_sbb(0, xa, xb, &t0); + (void)inner_gf65376_sbb(cc, 0, 0, &swap); + swap &= a_odd; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + t2 = swap & (fg0 ^ fg1); + fg0 ^= t2; + fg1 ^= t2; + xa -= a_odd & xb; + fg0 -= a_odd & fg1; + xa >>= 1; + fg1 <<= 1; + } + fg0 += 0x7FFFFFFF7FFFFFFF; + fg1 += 0x7FFFFFFF7FFFFFFF; + f0 = (fg0 & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g0 = (fg0 >> 32) - (uint64_t)0x7FFFFFFF; + f1 = (fg1 & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g1 = (fg1 >> 32) - (uint64_t)0x7FFFFFFF; + + // Propagate updates to a, b, u and v. + gf65376 na, nb, nu, nv; + uint64_t nega = lindiv31abs(&na, &a, &b, f0, g0); + uint64_t negb = lindiv31abs(&nb, &a, &b, f1, g1); + f0 = (f0 ^ nega) - nega; + g0 = (g0 ^ nega) - nega; + f1 = (f1 ^ negb) - negb; + g1 = (g1 ^ negb) - negb; + gf65376_lin(&nu, &u, &v, f0, g0); + gf65376_lin(&nv, &u, &v, f1, g1); + a = na; + b = nb; + u = nu; + v = nv; + } + + // If y is invertible, then the final GCD is 1, and + // len(a) + len(b) <= 53, so we can end the computation with + // the low words directly. We only need 51 iterations to reach + // the point where b = 1. + // + // If y is zero, then v is unchanged (hence zero) and none of + // the subsequent iterations will change it either, so we get + // 0 on output, which is what we want. + xa = a.v0; + xb = b.v0; + f0 = 1; + g0 = 0; + f1 = 0; + g1 = 1; + for (int j = 0; j < 51; j++) { + uint64_t a_odd, swap, t0, t1, t2, t3; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf65376_sbb(0, xa, xb, &t0); + (void)inner_gf65376_sbb(cc, 0, 0, &swap); + swap &= a_odd; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + t2 = swap & (f0 ^ f1); + f0 ^= t2; + f1 ^= t2; + t3 = swap & (g0 ^ g1); + g0 ^= t3; + g1 ^= t3; + xa -= a_odd & xb; + f0 -= a_odd & f1; + g0 -= a_odd & g1; + xa >>= 1; + f1 <<= 1; + g1 <<= 1; + } + gf65376_lin(d, &u, &v, f1, g1); + + // At the point: + // - Numerator and denominator were both in Montgomery representation, + // but the two factors R canceled each other. + // - We have injected 31*23+51 = 764 extra factors of 2, hence we + // must divide the result by 2^764. + // - However, we also want to obtain the result in Montgomery + // representation, i.e. multiply by 2^256. We thus want to + // divide the current result by 2^(764 - 384) = 2^380. + // - We do this division by using a Montgomery multiplication with + // the Montgomery representation of 1/2^380, i.e. the integer + // 2^384/2^380 = 16. + gf65376_mul(d, d, &INVT380); + return r; +} + +// see gf65376.h +uint32_t +gf65376_invert(gf65376 *d, const gf65376 *a) +{ + return gf65376_div(d, &gf65376_ONE, a); +} + +// see gf65376.h +int32_t +gf65376_legendre(const gf65376 *x) +{ + // Same algorithm as the binary GCD in gf65376_div(), with + // a few differences: + // - We do not keep track of the Bézout coefficients u and v. + // - In each inner iteration we adjust the running symbol value, + // which uses the low 3 bits of the values. + // - Since we need two extra bits of look-ahead, we can only run + // 29 inner iterations, and then need an extra recomputation + // for the last 2. + + gf65376 a, b; + uint64_t xa, xb, f0, g0, f1, g1, ls; + + inner_gf65376_normalize(&a, x); + b = MODULUS; + ls = 0; // running symbol information in bit 1. + + // Outer loop + for (int i = 0; i < 23; i++) { + // Get approximations of a and b over 64 bits. + uint64_t m5 = a.v5 | b.v5; + uint64_t m4 = a.v4 | b.v4; + uint64_t m3 = a.v3 | b.v3; + uint64_t m2 = a.v2 | b.v2; + uint64_t m1 = a.v1 | b.v1; + uint64_t tnz5 = sgnw(m5 | -m5); + uint64_t tnz4 = sgnw(m4 | -m4) & ~tnz5; + uint64_t tnz3 = sgnw(m3 | -m3) & ~tnz5 & ~tnz4; + uint64_t tnz2 = sgnw(m2 | -m2) & ~tnz5 & ~tnz4 & ~tnz3; + uint64_t tnz1 = sgnw(m1 | -m1) & ~tnz5 & ~tnz4 & ~tnz3 & ~tnz2; + uint64_t tnzm = (m5 & tnz5) | (m4 & tnz4) | (m3 & tnz3) | (m2 & tnz2) | (m1 & tnz1); + uint64_t tnza = (a.v5 & tnz5) | (a.v4 & tnz4) | (a.v3 & tnz3) | (a.v2 & tnz2) | (a.v1 & tnz1); + uint64_t tnzb = (b.v5 & tnz5) | (b.v4 & tnz4) | (b.v3 & tnz3) | (b.v2 & tnz2) | (b.v1 & tnz1); + uint64_t snza = (a.v4 & tnz5) | (a.v3 & tnz4) | (a.v2 & tnz3) | (a.v1 & tnz2) | (a.v0 & tnz1); + uint64_t snzb = (b.v4 & tnz5) | (b.v3 & tnz4) | (b.v2 & tnz3) | (b.v1 & tnz2) | (b.v0 & tnz1); + + int64_t s = lzcnt(tnzm); + uint64_t sm = (uint64_t)((31 - s) >> 63); + tnza ^= sm & (tnza ^ ((tnza << 32) | (snza >> 32))); + tnzb ^= sm & (tnzb ^ ((tnzb << 32) | (snzb >> 32))); + s -= 32 & sm; + tnza <<= s; + tnzb <<= s; + + uint64_t tzx = ~(tnz1 | tnz2 | tnz3 | tnz4 | tnz5); + tnza |= a.v0 & tzx; + tnzb |= b.v0 & tzx; + xa = (a.v0 & 0x7FFFFFFF) | (tnza & 0xFFFFFFFF80000000); + xb = (b.v0 & 0x7FFFFFFF) | (tnzb & 0xFFFFFFFF80000000); + + // First 290 inner iterations. + uint64_t fg0 = (uint64_t)1; + uint64_t fg1 = (uint64_t)1 << 32; + for (int j = 0; j < 29; j++) { + uint64_t a_odd, swap, t0, t1, t2; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf65376_sbb(0, xa, xb, &t0); + (void)inner_gf65376_sbb(cc, 0, 0, &swap); + swap &= a_odd; + ls ^= swap & xa & xb; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + t2 = swap & (fg0 ^ fg1); + fg0 ^= t2; + fg1 ^= t2; + xa -= a_odd & xb; + fg0 -= a_odd & fg1; + xa >>= 1; + fg1 <<= 1; + ls ^= (xb + 2) >> 1; + } + + // Compute the updated a and b (low words only) to get + // enough bits for the next two iterations. + uint64_t fg0z = fg0 + 0x7FFFFFFF7FFFFFFF; + uint64_t fg1z = fg1 + 0x7FFFFFFF7FFFFFFF; + f0 = (fg0z & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g0 = (fg0z >> 32) - (uint64_t)0x7FFFFFFF; + f1 = (fg1z & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g1 = (fg1z >> 32) - (uint64_t)0x7FFFFFFF; + uint64_t a0 = (a.v0 * f0 + b.v0 * g0) >> 29; + uint64_t b0 = (a.v0 * f1 + b.v0 * g1) >> 29; + for (int j = 0; j < 2; j++) { + uint64_t a_odd, swap, t0, t1, t2, t3; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf65376_sbb(0, xa, xb, &t0); + (void)inner_gf65376_sbb(cc, 0, 0, &swap); + swap &= a_odd; + ls ^= swap & a0 & b0; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + t2 = swap & (fg0 ^ fg1); + fg0 ^= t2; + fg1 ^= t2; + t3 = swap & (a0 ^ b0); + a0 ^= t3; + b0 ^= t3; + xa -= a_odd & xb; + fg0 -= a_odd & fg1; + a0 -= a_odd & b0; + xa >>= 1; + fg1 <<= 1; + a0 >>= 1; + ls ^= (b0 + 2) >> 1; + } + + // Propagate updates to a and b. + fg0 += 0x7FFFFFFF7FFFFFFF; + fg1 += 0x7FFFFFFF7FFFFFFF; + f0 = (fg0 & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g0 = (fg0 >> 32) - (uint64_t)0x7FFFFFFF; + f1 = (fg1 & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g1 = (fg1 >> 32) - (uint64_t)0x7FFFFFFF; + gf65376 na, nb; + uint64_t nega = lindiv31abs(&na, &a, &b, f0, g0); + (void)lindiv31abs(&nb, &a, &b, f1, g1); + ls ^= nega & nb.v0; + a = na; + b = nb; + } + + // Final iterations: values are at most 53 bits now. We do not + // need to keep track of update coefficients. Just like the GCD, + // we need only 51 iterations, because after 51 iterations, + // value a is 0 or 1, and b is 1, and no further modification to + // the Legendre symbol may happen. + xa = a.v0; + xb = b.v0; + for (int j = 0; j < 51; j++) { + uint64_t a_odd, swap, t0, t1; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf65376_sbb(0, xa, xb, &t0); + (void)inner_gf65376_sbb(cc, 0, 0, &swap); + swap &= a_odd; + ls ^= swap & xa & xb; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + xa -= a_odd & xb; + xa >>= 1; + ls ^= (xb + 2) >> 1; + } + + // At this point, if the source value was not zero, then the low + // bit of ls contains the QR status (0 = square, 1 = non-square), + // which we need to convert to the expected value (+1 or -1). + // If y == 0, then we return 0, per the API. + uint32_t r = 1 - ((uint32_t)ls & 2); + r &= ~gf65376_iszero(x); + return *(int32_t *)&r; +} + +// see gf65376.h +uint32_t +gf65376_sqrt(gf65376 *d, const gf65376 *a) +{ + // Candidate root is a^((q+1)/4), with (q+1)/4 = 65*2^374 + gf65376 y; + gf65376_xsquare(&y, a, 6); + gf65376_mul(&y, &y, a); + gf65376_xsquare(&y, &y, 374); + + // Normalize y and negate if necessary, to set the low bit to 0. + // The low bit check must be on the normal representation, + // not the Montgomery representation. + gf65376 yn; + inner_gf65376_montgomery_reduce(&yn, &y); + uint32_t ctl = -((uint32_t)yn.v0 & 1); + gf65376_neg(&yn, &y); + gf65376_select(&y, &y, &yn, ctl); + + // Check whether the candidate is indeed a square root. + gf65376_square(&yn, &y); + uint32_t r = gf65376_equals(&yn, a); + *d = y; + return r; +} + +// Little-endian encoding of a 64-bit integer. +static inline void +enc64le(void *dst, uint64_t x) +{ + uint8_t *buf = dst; + buf[0] = (uint8_t)x; + buf[1] = (uint8_t)(x >> 8); + buf[2] = (uint8_t)(x >> 16); + buf[3] = (uint8_t)(x >> 24); + buf[4] = (uint8_t)(x >> 32); + buf[5] = (uint8_t)(x >> 40); + buf[6] = (uint8_t)(x >> 48); + buf[7] = (uint8_t)(x >> 56); +} + +// Little-endian decoding of a 64-bit integer. +static inline uint64_t +dec64le(const void *src) +{ + const uint8_t *buf = src; + return (uint64_t)buf[0] | ((uint64_t)buf[1] << 8) | ((uint64_t)buf[2] << 16) | ((uint64_t)buf[3] << 24) | + ((uint64_t)buf[4] << 32) | ((uint64_t)buf[5] << 40) | ((uint64_t)buf[6] << 48) | ((uint64_t)buf[7] << 56); +} + +// see gf65376.h +void +gf65376_encode(void *dst, const gf65376 *a) +{ + uint8_t *buf = dst; + gf65376 x; + + inner_gf65376_montgomery_reduce(&x, a); + enc64le(buf, x.v0); + enc64le(buf + 8, x.v1); + enc64le(buf + 16, x.v2); + enc64le(buf + 24, x.v3); + enc64le(buf + 32, x.v4); + enc64le(buf + 40, x.v5); +} + +// see gf65376.h +uint32_t +gf65376_decode(gf65376 *d, const void *src) +{ + const uint8_t *buf = src; + uint64_t d0, d1, d2, d3, d4, d5, t; + unsigned char cc; + + d0 = dec64le(buf); + d1 = dec64le(buf + 8); + d2 = dec64le(buf + 16); + d3 = dec64le(buf + 24); + d4 = dec64le(buf + 32); + d5 = dec64le(buf + 40); + cc = inner_gf65376_sbb(0, d0, MODULUS.v0, &t); + cc = inner_gf65376_sbb(cc, d1, MODULUS.v1, &t); + cc = inner_gf65376_sbb(cc, d2, MODULUS.v2, &t); + cc = inner_gf65376_sbb(cc, d3, MODULUS.v3, &t); + cc = inner_gf65376_sbb(cc, d4, MODULUS.v4, &t); + cc = inner_gf65376_sbb(cc, d5, MODULUS.v5, &t); + + (void)inner_gf65376_sbb(cc, 0, 0, &t); + + // If the value was not canonical then t = 0; otherwise, t = -1. + d->v0 = d0 & t; + d->v1 = d1 & t; + d->v2 = d2 & t; + d->v3 = d3 & t; + d->v4 = d4 & t; + d->v5 = d5 & t; + + // Convert to Montgomery representation. + gf65376_mul(d, d, &R2); + + return (uint32_t)t; +} + +// see gf65376.h +void +gf65376_decode_reduce(gf65376 *d, const void *src, size_t len) +{ + const uint8_t *buf = src; + + *d = gf65376_ZERO; + if (len == 0) { + return; + } + + size_t rem = len % 48; + if (rem != 0) { + // Input size is not a multiple of 48, we decode a partial + // block, which is already less than 2^383. + uint8_t tmp[48]; + size_t k; + + k = len - rem; + + memcpy(tmp, buf + k, len - k); + memset(tmp + len - k, 0, (sizeof tmp) - (len - k)); + d->v0 = dec64le(&tmp[0]); + d->v1 = dec64le(&tmp[8]); + d->v2 = dec64le(&tmp[16]); + d->v3 = dec64le(&tmp[24]); + d->v4 = dec64le(&tmp[32]); + d->v5 = dec64le(&tmp[40]); + + len = k; + } else { + // Input size is a multiple of 48, we decode a full block, + // and a reduction is needed. + len -= 48; + uint64_t d0 = dec64le(buf + len); + uint64_t d1 = dec64le(buf + len + 8); + uint64_t d2 = dec64le(buf + len + 16); + uint64_t d3 = dec64le(buf + len + 24); + uint64_t d4 = dec64le(buf + len + 32); + uint64_t d5 = dec64le(buf + len + 40); + inner_gf65376_partial_reduce(d, d0, d1, d2, d3, d4, d5); + } + + // Process all remaining blocks, in descending address order. + while (len > 0) { + gf65376_mul(d, d, &R2); + len -= 48; + uint64_t t0 = dec64le(buf + len); + uint64_t t1 = dec64le(buf + len + 8); + uint64_t t2 = dec64le(buf + len + 16); + uint64_t t3 = dec64le(buf + len + 24); + uint64_t t4 = dec64le(buf + len + 32); + uint64_t t5 = dec64le(buf + len + 40); + + gf65376 t; + inner_gf65376_partial_reduce(&t, t0, t1, t2, t3, t4, t5); + gf65376_add(d, d, &t); + } + + // Final conversion to Montgomery representation. + gf65376_mul(d, d, &R2); +} + +void +gf65376_div3(gf65376 *d, const gf65376 *a) +{ + const digit_t MAGIC = 0xAAAAAAAAAAAAAAAB; // 3^-1 mod 2^64 + uint64_t c0, c1, f0, f1; + gf65376 t; + + inner_gf65376_umul(f0, f1, a->arr[5], MAGIC); + t.arr[5] = f1 >> 1; + c1 = a->arr[5] - 3 * t.arr[5]; + + for (int32_t i = 4; i >= 0; i--) { + c0 = c1; + inner_gf65376_umul(f0, f1, a->arr[i], MAGIC); + t.arr[i] = f1 >> 1; + c1 = c0 + a->arr[i] - 3 * t.arr[i]; + t.arr[i] += c0 * ((MAGIC - 1) >> 1); + f0 = ((c1 >> 1) & c1); /* c1 == 3 */ + f1 = ((c1 >> 2) & !(c1 & 0x11)); /* c1 == 4 */ + f0 |= f1; + t.arr[i] += f0; + c1 = c1 - 3 * f0; + } + *d = t; + gf65376_sub(&t, d, &PM1O3); + gf65376_select(d, d, &t, -((c1 & 1) | (c1 >> 1))); // c1 >= 1 + gf65376_sub(&t, d, &PM1O3); + gf65376_select(d, d, &t, -(c1 == 2)); +} \ No newline at end of file diff --git a/src/gf/broadwell/lvl3/include/fp.h b/src/gf/broadwell/lvl3/include/fp.h new file mode 100644 index 0000000..dd7e41b --- /dev/null +++ b/src/gf/broadwell/lvl3/include/fp.h @@ -0,0 +1,139 @@ +#ifndef FP_H +#define FP_H + +// Include statements +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gf65376.h" + +// Type for elements of GF(p) +#define fp_t gf65376 + +// Constants (Assumed to be in Montgomery form) +#define ZERO gf65376_ZERO +#define ONE gf65376_ONE + +// Operations in fp +static inline void +fp_neg(fp_t *d, const fp_t *a) +{ + gf65376_neg(d, a); +} + +void fp_add(fp_t *out, const fp_t *a, const fp_t *b); // implemented in fp_asm.S +void fp_sub(fp_t *out, const fp_t *a, const fp_t *b); // implemented in fp_asm.S +void fp_sqr(fp_t *out, const fp_t *a); // implemented in fp_asm.S +void fp_mul(fp_t *out, const fp_t *a, const fp_t *b); // implemented in fp_asm.S + +static inline void +fp_mul_small(fp_t *d, const fp_t *a, uint32_t n) +{ + gf65376_mul_small(d, a, n); +} + +static inline void +fp_half(fp_t *d, const fp_t *a) +{ + gf65376_half(d, a); +} +// #define fp_half gf65376_half + +static inline void +fp_div3(fp_t *d, const fp_t *a) +{ + gf65376_div3(d, a); +} +// #define fp_div3 gf65376_div3 + +// Constant time selection and swapping +static inline void +fp_select(fp_t *d, const fp_t *a0, const fp_t *a1, uint32_t ctl) +{ + gf65376_select(d, a0, a1, ctl); +} +// #define fp_select gf65376_select +static inline void +fp_cswap(fp_t *a, fp_t *b, uint32_t ctl) +{ + gf65376_cswap(a, b, ctl); +} +// #define fp_cswap gf65376_cswap + +// Comparisons for fp elements +static inline uint32_t +fp_is_zero(const fp_t *a) +{ + return gf65376_iszero(a); +} +// #define fp_is_zero gf65376_iszero + +static inline uint32_t +fp_is_equal(const fp_t *a, const fp_t *b) +{ + return gf65376_equals(a, b); +} +// #define fp_is_equal gf65376_equals + +// Set a uint32 to an Fp value +static inline void +fp_set_small(fp_t *d, uint32_t x) +{ + gf65376_set_small(d, x); +} +// #define fp_set_small gf65376_set_small + +// Encoding and decoding of bytes +static inline void +fp_encode(void *dst, const fp_t *a) +{ + gf65376_encode(dst, a); +} +// #define fp_encode gf65376_encode +static inline uint32_t +fp_decode(fp_t *d, const void *src) +{ + return gf65376_decode(d, src); +} +// #define fp_decode gf65376_decode +static inline void +fp_decode_reduce(fp_t *d, const void *src, size_t len) +{ + gf65376_decode_reduce(d, src, len); +} +// #define fp_decode_reduce gf65376_decode_reduce + +// These functions are essentially useless because we can just +// use = for the shallow copies we need, but they're here for +// now until we do a larger refactoring +static inline void +fp_copy(fp_t *out, const fp_t *a) +{ + memcpy(out, a, sizeof(fp_t)); +} + +static inline void +fp_set_zero(fp_t *a) +{ + memcpy(a, &ZERO, sizeof(fp_t)); +} + +static inline void +fp_set_one(fp_t *a) +{ + memcpy(a, &ONE, sizeof(fp_t)); +} + +// Functions defined in low level code but with different API +void fp_inv(fp_t *a); +void fp_sqrt(fp_t *a); +void fp_exp3div4(fp_t *a); +uint32_t fp_is_square(const fp_t *a); + +#endif diff --git a/src/gf/broadwell/lvl3/include/fp2.h b/src/gf/broadwell/lvl3/include/fp2.h new file mode 100644 index 0000000..81801fa --- /dev/null +++ b/src/gf/broadwell/lvl3/include/fp2.h @@ -0,0 +1,45 @@ +#ifndef FP2_H +#define FP2_H + +#define NO_FP2X_MUL +#define NO_FP2X_SQR + +#include + +extern void fp2_sq_c0(fp2_t *out, const fp2_t *in); +extern void fp2_sq_c1(fp_t *out, const fp2_t *in); + +extern void fp2_mul_c0(fp_t *out, const fp2_t *in0, const fp2_t *in1); +extern void fp2_mul_c1(fp_t *out, const fp2_t *in0, const fp2_t *in1); + +static inline void +fp2_mul(fp2_t *x, const fp2_t *y, const fp2_t *z) +{ + fp_t t; + + fp2_mul_c0(&t, y, z); // c0 = a0*b0 - a1*b1 + fp2_mul_c1(&x->im, y, z); // c1 = a0*b1 + a1*b0 + x->re.arr[0] = t.arr[0]; + x->re.arr[1] = t.arr[1]; + x->re.arr[2] = t.arr[2]; + x->re.arr[3] = t.arr[3]; + x->re.arr[4] = t.arr[4]; + x->re.arr[5] = t.arr[5]; +} + +static inline void +fp2_sqr(fp2_t *x, const fp2_t *y) +{ + fp2_t t; + + fp2_sq_c0(&t, y); // c0 = (a0+a1)(a0-a1) + fp2_sq_c1(&x->im, y); // c1 = 2a0*a1 + x->re.arr[0] = t.re.arr[0]; + x->re.arr[1] = t.re.arr[1]; + x->re.arr[2] = t.re.arr[2]; + x->re.arr[3] = t.re.arr[3]; + x->re.arr[4] = t.re.arr[4]; + x->re.arr[5] = t.re.arr[5]; +} + +#endif \ No newline at end of file diff --git a/src/gf/broadwell/lvl3/include/gf65376.h b/src/gf/broadwell/lvl3/include/gf65376.h new file mode 100644 index 0000000..ba752c9 --- /dev/null +++ b/src/gf/broadwell/lvl3/include/gf65376.h @@ -0,0 +1,1121 @@ +#ifndef gf65376_h__ +#define gf65376_h__ + +#ifdef __cplusplus +extern "C" +{ +#endif +#include +#include +#include +#include +#include +#include + + typedef uint64_t digit_t; // Datatype for representing field elements + + /* + * A gf65376 instance represents an integer modulo q. + * This is a structure; it can be copied with a simple assignment, and + * passed around as a value (though exchanging pointers is possibly more + * efficient). + * The contents are opaque. No calling code should make any assumption + * about the contents. + */ + typedef union + { + // Contents are opaque. + // Implementation note: this encodes the value in Montgomery + // representation, with R = 2^384. Only partial reduction is + // done internally to ensure the value is below 2^383 + struct + { + uint64_t v0; + uint64_t v1; + uint64_t v2; + uint64_t v3; + uint64_t v4; + uint64_t v5; + }; + digit_t arr[6]; + } gf65376; + + /* + * Constant zero (in the field). + */ + extern const gf65376 gf65376_ZERO; + + /* + * Constant one (in the field). + */ + extern const gf65376 gf65376_ONE; + + /* + * Constant -1 (in the field). + */ + extern const gf65376 gf65376_MINUS_ONE; + + /* + * API RULES: + * ========== + * + * Elementary operations on field elements are implemented by functions + * which take as parameter pointers to the operands. The first parameter + * is the pointer to the destination. Thus: + * gf65376 a = ...; + * gf65376 b = ...; + * gf65376 d; + * gf65376_sub(&d, &a, &b) + * sets field element d to a - b (implicitly modulo q). + * + * Operands may be used several times: it is always valid to use as + * output a gf65376 structure which is also used as input. + * + * Boolean values are represented by 32-bit integer (uint32_t) which have + * value exactly 0xFFFFFFFF (for "true") or 0x00000000 (for "false"). This + * convention minimizes the risk that a "smart" compiler breaks the + * constant-time property of the code through unfortunated optimizations. + * When a function expects such a Boolean, the caller MUST take care never + * to provide any value other than 0x00000000 or 0xFFFFFFFF. + * + * Values are encoded into exactly 48 bytes: value x modulo q is mapped to + * its unique integer representant in the [0..q-1] range, which is then + * encoded over 48 bytes with little-endian convention. Encoding is canonical + * and checked: when decoding (with gf65376_decode()), the input value is + * verified to be in the [0..q-1] range; for an out-of-range value, + * gf65376_decode() fills the output structure with zero, and returns + * 0x00000000. + * + * For most operations, the implementation is an inline function, defined + * below; the compiler can thus efficiently include it in the calling code. + * A few expensive operations (e.g. divisions) use non-inline functions, + * declared below but defined in gf65376.c + * + * All functions and macro whose name starts with "inner_gf65376_" are + * internal to this implementation and visible here only in order to + * support the API inline functions; they MUST NOT be used directly. + */ + +#if (defined _MSC_VER && defined _M_X64) || (defined __x86_64__ && (defined __GNUC__ || defined __clang__)) +#include +#define inner_gf65376_adc(cc, a, b, d) _addcarry_u64(cc, a, b, (unsigned long long *)(void *)d) +#define inner_gf65376_sbb(cc, a, b, d) _subborrow_u64(cc, a, b, (unsigned long long *)(void *)d) +#else +static inline unsigned char +inner_gf65376_adc(unsigned char cc, uint64_t a, uint64_t b, uint64_t *d) +{ + unsigned __int128 t = (unsigned __int128)a + (unsigned __int128)b + cc; + *d = (uint64_t)t; + return (unsigned char)(t >> 64); +} +static inline unsigned char +inner_gf65376_sbb(unsigned char cc, uint64_t a, uint64_t b, uint64_t *d) +{ + unsigned __int128 t = (unsigned __int128)a - (unsigned __int128)b - cc; + *d = (uint64_t)t; + return (unsigned char)(-(uint64_t)(t >> 64)); +} +#endif + +#if defined _MSC_VER +#define inner_gf65376_umul(lo, hi, x, y) \ + do { \ + uint64_t umul_hi; \ + (lo) = _umul128((x), (y), &umul_hi); \ + (hi) = umul_hi; \ + } while (0) +#define inner_gf65376_umul_add(lo, hi, x, y, z) \ + do { \ + uint64_t umul_lo, umul_hi; \ + umul_lo = _umul128((x), (y), &umul_hi); \ + unsigned char umul_cc; \ + umul_cc = inner_gf65376_adc(0, umul_lo, (z), &umul_lo); \ + (void)inner_gf65376_adc(umul_cc, umul_hi, 0, &umul_hi); \ + (lo) = umul_lo; \ + (hi) = umul_hi; \ + } while (0) +#define inner_gf65376_umul_x2(lo, hi, x1, y1, x2, y2) \ + do { \ + uint64_t umul_lo, umul_hi; \ + umul_lo = _umul128((x1), (y1), &umul_hi); \ + uint64_t umul_lo2, umul_hi2; \ + umul_lo2 = _umul128((x2), (y2), &umul_hi2); \ + unsigned char umul_cc; \ + umul_cc = inner_gf65376_adc(0, umul_lo, umul_lo2, &umul_lo); \ + (void)inner_gf65376_adc(umul_cc, umul_hi, umul_hi2, &umul_hi); \ + (lo) = umul_lo; \ + (hi) = umul_hi; \ + } while (0) +#define inner_gf65376_umul_x2_add(lo, hi, x1, y1, x2, y2, z) \ + do { \ + uint64_t umul_lo, umul_hi; \ + umul_lo = _umul128((x1), (y1), &umul_hi); \ + uint64_t umul_lo2, umul_hi2; \ + umul_lo2 = _umul128((x2), (y2), &umul_hi2); \ + unsigned char umul_cc; \ + umul_cc = inner_gf65376_adc(0, umul_lo, umul_lo2, &umul_lo); \ + (void)inner_gf65376_adc(umul_cc, umul_hi, umul_hi2, &umul_hi); \ + umul_cc = inner_gf65376_adc(0, umul_lo, (z), &umul_lo); \ + (void)inner_gf65376_adc(umul_cc, umul_hi, 0, &umul_hi); \ + (lo) = umul_lo; \ + (hi) = umul_hi; \ + } while (0) +#else +#define inner_gf65376_umul(lo, hi, x, y) \ + do { \ + unsigned __int128 umul_tmp; \ + umul_tmp = (unsigned __int128)(x) * (unsigned __int128)(y); \ + (lo) = (uint64_t)umul_tmp; \ + (hi) = (uint64_t)(umul_tmp >> 64); \ + } while (0) +#define inner_gf65376_umul_add(lo, hi, x, y, z) \ + do { \ + unsigned __int128 umul_tmp; \ + umul_tmp = (unsigned __int128)(x) * (unsigned __int128)(y) + (unsigned __int128)(uint64_t)(z); \ + (lo) = (uint64_t)umul_tmp; \ + (hi) = (uint64_t)(umul_tmp >> 64); \ + } while (0) +#define inner_gf65376_umul_x2(lo, hi, x1, y1, x2, y2) \ + do { \ + unsigned __int128 umul_tmp; \ + umul_tmp = \ + (unsigned __int128)(x1) * (unsigned __int128)(y1) + (unsigned __int128)(x2) * (unsigned __int128)(y2); \ + (lo) = (uint64_t)umul_tmp; \ + (hi) = (uint64_t)(umul_tmp >> 64); \ + } while (0) +#define inner_gf65376_umul_x2_add(lo, hi, x1, y1, x2, y2, z) \ + do { \ + unsigned __int128 umul_tmp; \ + umul_tmp = (unsigned __int128)(x1) * (unsigned __int128)(y1) + \ + (unsigned __int128)(x2) * (unsigned __int128)(y2) + (unsigned __int128)(uint64_t)(z); \ + (lo) = (uint64_t)umul_tmp; \ + (hi) = (uint64_t)(umul_tmp >> 64); \ + } while (0) +#endif + + /* + * d <- a + b + */ + static inline void + gf65376_add(gf65376 *d, const gf65376 *a, const gf65376 *b) + { + uint64_t d0, d1, d2, d3, d4, d5, f; + unsigned char cc; + + // Raw addition. + cc = inner_gf65376_adc(0, a->v0, b->v0, &d0); + cc = inner_gf65376_adc(cc, a->v1, b->v1, &d1); + cc = inner_gf65376_adc(cc, a->v2, b->v2, &d2); + cc = inner_gf65376_adc(cc, a->v3, b->v3, &d3); + cc = inner_gf65376_adc(cc, a->v4, b->v4, &d4); + (void)inner_gf65376_adc(cc, a->v5, b->v5, &d5); + + // Sum is up to 2^384 - 2. Subtract q if the value is not lower + // than 2^383 (we subtract q by adding -q). + // Note: 0xBF = (-65) % 256, 56 = 376 - 5*64 + f = d5 >> 63; + cc = inner_gf65376_adc(0, d0, f, &d0); + cc = inner_gf65376_adc(cc, d1, 0, &d1); + cc = inner_gf65376_adc(cc, d2, 0, &d2); + cc = inner_gf65376_adc(cc, d3, 0, &d3); + cc = inner_gf65376_adc(cc, d4, 0, &d4); + (void)inner_gf65376_adc(cc, d5, ((uint64_t)0xBF << 56) & -f, &d5); + + // One subtraction of q might not be enough. + f = d5 >> 63; + cc = inner_gf65376_adc(0, d0, f, &d0); + cc = inner_gf65376_adc(cc, d1, 0, &d1); + cc = inner_gf65376_adc(cc, d2, 0, &d2); + cc = inner_gf65376_adc(cc, d3, 0, &d3); + cc = inner_gf65376_adc(cc, d4, 0, &d4); + (void)inner_gf65376_adc(cc, d5, ((uint64_t)0xBF << 56) & -f, &d5); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + } + + /* + * d <- a - b + */ + static inline void + gf65376_sub(gf65376 *d, const gf65376 *a, const gf65376 *b) + { + uint64_t d0, d1, d2, d3, d4, d5, m, f; + unsigned char cc; + + // Raw subtraction. + cc = inner_gf65376_sbb(0, a->v0, b->v0, &d0); + cc = inner_gf65376_sbb(cc, a->v1, b->v1, &d1); + cc = inner_gf65376_sbb(cc, a->v2, b->v2, &d2); + cc = inner_gf65376_sbb(cc, a->v3, b->v3, &d3); + cc = inner_gf65376_sbb(cc, a->v4, b->v4, &d4); + cc = inner_gf65376_sbb(cc, a->v5, b->v5, &d5); + + // Add 2*q if the result is negative. + // Note: 0x7E = (-2*65) % 256, 56 = 376 - 5*64 + (void)inner_gf65376_sbb(cc, 0, 0, &m); + cc = inner_gf65376_sbb(0, d0, m & 2, &d0); + cc = inner_gf65376_sbb(cc, d1, 0, &d1); + cc = inner_gf65376_sbb(cc, d2, 0, &d2); + cc = inner_gf65376_sbb(cc, d3, 0, &d3); + cc = inner_gf65376_sbb(cc, d4, 0, &d4); + (void)inner_gf65376_sbb(cc, d5, ((uint64_t)0x7E << 56) & m, &d5); + + // We might have overdone it; subtract q if necessary. + // Note: 0xBF = (-65) % 256, 56 = 376 - 5*64 + f = d5 >> 63; + cc = inner_gf65376_adc(0, d0, f, &d0); + cc = inner_gf65376_adc(cc, d1, 0, &d1); + cc = inner_gf65376_adc(cc, d2, 0, &d2); + cc = inner_gf65376_adc(cc, d3, 0, &d3); + cc = inner_gf65376_adc(cc, d4, 0, &d4); + (void)inner_gf65376_adc(cc, d5, ((uint64_t)0xBF << 56) & -f, &d5); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + } + + /* + * d <- -a + */ + static inline void + gf65376_neg(gf65376 *d, const gf65376 *a) + { + uint64_t d0, d1, d2, d3, d4, d5, f; + unsigned char cc; + + // 2*q - a + cc = inner_gf65376_sbb(0, (uint64_t)0xFFFFFFFFFFFFFFFE, a->v0, &d0); + cc = inner_gf65376_sbb(cc, (uint64_t)0xFFFFFFFFFFFFFFFF, a->v1, &d1); + cc = inner_gf65376_sbb(cc, (uint64_t)0xFFFFFFFFFFFFFFFF, a->v2, &d2); + cc = inner_gf65376_sbb(cc, (uint64_t)0xFFFFFFFFFFFFFFFF, a->v3, &d3); + cc = inner_gf65376_sbb(cc, (uint64_t)0xFFFFFFFFFFFFFFFF, a->v4, &d4); + (void)inner_gf65376_sbb(cc, (uint64_t)0x81FFFFFFFFFFFFFF, a->v5, &d5); + + // Subtract q if the value is not lower than 2^251. + f = d5 >> 63; + cc = inner_gf65376_adc(0, d0, f, &d0); + cc = inner_gf65376_adc(cc, d1, 0, &d1); + cc = inner_gf65376_adc(cc, d2, 0, &d2); + cc = inner_gf65376_adc(cc, d3, 0, &d3); + cc = inner_gf65376_adc(cc, d4, 0, &d4); + (void)inner_gf65376_adc(cc, d5, ((uint64_t)0xBF << 56) & -f, &d5); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + } + + /* + * If ctl == 0x00000000, then *a0 is copied into *d. + * If ctl == 0xFFFFFFFF, then *a1 is copied into *d. + * ctl MUST be either 0x00000000 or 0xFFFFFFFF. + */ + static inline void + gf65376_select(gf65376 *d, const gf65376 *a0, const gf65376 *a1, uint32_t ctl) + { + uint64_t cw = (uint64_t)*(int32_t *)&ctl; + d->v0 = a0->v0 ^ (cw & (a0->v0 ^ a1->v0)); + d->v1 = a0->v1 ^ (cw & (a0->v1 ^ a1->v1)); + d->v2 = a0->v2 ^ (cw & (a0->v2 ^ a1->v2)); + d->v3 = a0->v3 ^ (cw & (a0->v3 ^ a1->v3)); + d->v4 = a0->v4 ^ (cw & (a0->v4 ^ a1->v4)); + d->v5 = a0->v5 ^ (cw & (a0->v5 ^ a1->v5)); + } + + /* + * If ctl == 0x00000000, then *a and *b are unchanged. + * If ctl == 0xFFFFFFFF, then the contents of *a and *b are swapped. + * ctl MUST be either 0x00000000 or 0xFFFFFFFF. + */ + static inline void + gf65376_cswap(gf65376 *a, gf65376 *b, uint32_t ctl) + { + uint64_t cw = (uint64_t)*(int32_t *)&ctl; + uint64_t t; + t = cw & (a->v0 ^ b->v0); + a->v0 ^= t; + b->v0 ^= t; + t = cw & (a->v1 ^ b->v1); + a->v1 ^= t; + b->v1 ^= t; + t = cw & (a->v2 ^ b->v2); + a->v2 ^= t; + b->v2 ^= t; + t = cw & (a->v3 ^ b->v3); + a->v3 ^= t; + b->v3 ^= t; + t = cw & (a->v4 ^ b->v4); + a->v4 ^= t; + b->v4 ^= t; + t = cw & (a->v5 ^ b->v5); + a->v5 ^= t; + b->v5 ^= t; + } + + /* + * d <- a/2 + */ + static inline void + gf65376_half(gf65376 *d, const gf65376 *a) + { + uint64_t d0, d1, d2, d3, d4, d5; + + d0 = (a->v0 >> 1) | (a->v1 << 63); + d1 = (a->v1 >> 1) | (a->v2 << 63); + d2 = (a->v2 >> 1) | (a->v3 << 63); + d3 = (a->v3 >> 1) | (a->v4 << 63); + d4 = (a->v4 >> 1) | (a->v5 << 63); + d5 = a->v5 >> 1; + d5 += ((uint64_t)65 << 55) & -(a->v0 & 1); + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + } + + // Inner function: 384-bit to 383-bit reduction + static inline void + inner_gf65376_partial_reduce(gf65376 *d, + uint64_t a0, + uint64_t a1, + uint64_t a2, + uint64_t a3, + uint64_t a4, + uint64_t a5) + { + uint64_t d0, d1, d2, d3, d4, d5, h, quo, rem; + unsigned char cc; + + // Split value in high (8 bits) and low (376 bits) parts. + h = a5 >> 56; + a5 &= 0x00FFFFFFFFFFFFFF; + + // 65*2^376 = 1 mod q; hence, we add floor(h/65) + (h mod 65)*2^376 + // to the low part. + quo = (h * 0xFC1) >> 18; + rem = h - (65 * quo); + cc = inner_gf65376_adc(0, a0, quo, &d0); + cc = inner_gf65376_adc(cc, a1, 0, &d1); + cc = inner_gf65376_adc(cc, a2, 0, &d2); + cc = inner_gf65376_adc(cc, a3, 0, &d3); + cc = inner_gf65376_adc(cc, a4, 0, &d4); + (void)inner_gf65376_adc(cc, a5, rem << 56, &d5); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + } + + // Inner function: Normalize value *a into *d. + static inline void + inner_gf65376_normalize(gf65376 *d, const gf65376 *a) + { + uint64_t d0, d1, d2, d3, d4, d5, m; + unsigned char cc; + + // Subtract q. + cc = inner_gf65376_sbb(0, a->v0, 0xFFFFFFFFFFFFFFFF, &d0); + cc = inner_gf65376_sbb(cc, a->v1, 0xFFFFFFFFFFFFFFFF, &d1); + cc = inner_gf65376_sbb(cc, a->v2, 0xFFFFFFFFFFFFFFFF, &d2); + cc = inner_gf65376_sbb(cc, a->v3, 0xFFFFFFFFFFFFFFFF, &d3); + cc = inner_gf65376_sbb(cc, a->v4, 0xFFFFFFFFFFFFFFFF, &d4); + cc = inner_gf65376_sbb(cc, a->v5, 0x40FFFFFFFFFFFFFF, &d5); + + // Add back q if the result is negative. + (void)inner_gf65376_sbb(cc, 0, 0, &m); + cc = inner_gf65376_adc(0, d0, m, &d0); + cc = inner_gf65376_adc(cc, d1, m, &d1); + cc = inner_gf65376_adc(cc, d2, m, &d2); + cc = inner_gf65376_adc(cc, d3, m, &d3); + cc = inner_gf65376_adc(cc, d4, m, &d4); + (void)inner_gf65376_adc(cc, d5, m & 0x40FFFFFFFFFFFFFF, &d5); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + } + + /* + * d <- 2*a + */ + static inline void + gf65376_mul2(gf65376 *d, const gf65376 *a) + { + gf65376_add(d, a, a); + } + + /* + * d <- a*x + * (multiplication by a 32-bit integer) + */ + static inline void + gf65376_mul_small(gf65376 *d, const gf65376 *a, uint32_t x) + { + uint64_t d0, d1, d2, d3, d4, d5, d6, lo, hi, b, h, quo, rem; + unsigned char cc; + + // Product over the integers. Top output word (d6) is at most 31 bits. + b = (uint64_t)x; + inner_gf65376_umul(d0, d1, a->v0, b); + inner_gf65376_umul(d2, d3, a->v2, b); + inner_gf65376_umul(d4, d5, a->v4, b); + + inner_gf65376_umul(lo, hi, a->v1, b); + cc = inner_gf65376_adc(0, d1, lo, &d1); + cc = inner_gf65376_adc(cc, d2, hi, &d2); + inner_gf65376_umul(lo, hi, a->v3, b); + cc = inner_gf65376_adc(cc, d3, lo, &d3); + cc = inner_gf65376_adc(cc, d4, hi, &d4); + inner_gf65376_umul(lo, d6, a->v5, b); + cc = inner_gf65376_adc(cc, d5, lo, &d5); + (void)inner_gf65376_adc(cc, d6, 0, &d6); + + // Extract low 248-bit part, and the high part (at most 35 bits). + h = (d6 << 8) | (d5 >> 56); + d5 &= 0x00FFFFFFFFFFFFFF; + + // Fold h by adding floor(h/65) + (h mod 65)*2^376 to the low part. + inner_gf65376_umul(lo, hi, h, 0xFC0FC0FC0FC0FC1); + quo = hi >> 2; + rem = h - (65 * quo); + cc = inner_gf65376_adc(cc, d0, quo, &d0); + cc = inner_gf65376_adc(cc, d1, 0, &d1); + cc = inner_gf65376_adc(cc, d2, 0, &d2); + cc = inner_gf65376_adc(cc, d3, 0, &d3); + cc = inner_gf65376_adc(cc, d4, 0, &d4); + (void)inner_gf65376_adc(cc, d5, rem << 56, &d5); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + } + + /* + * d <- x + * Input value x (32-bit integer) is converted to field element x mod q. + */ + static inline void + gf65376_set_small(gf65376 *d, uint32_t x) + { + // We want Montgomery representation, i.e. x*2^384 mod q. + // We set h = x*2^8; then: + // x*2^384 = h*2^376 + // = (h mod 65)*2^376 + floor(h/65)*65*2^376 + // = (h mod 65)*2^376 + floor(h/65) mod q + // by using the fact that 65*2^376 = 1 mod q. + uint64_t h, lo, hi, quo, rem; + + // NOTE: 0xFC0FC0FC0FC0FC1 = 65^(-1) % 2^64 + h = (uint64_t)x << 8; + inner_gf65376_umul(lo, hi, h, 0xFC0FC0FC0FC0FC1); + (void)lo; + quo = hi >> 2; + rem = h - (65 * quo); + + d->v0 = quo; + d->v1 = 0; + d->v2 = 0; + d->v3 = 0; + d->v4 = 0; + d->v5 = rem << 56; + } + + // Inner function: d <- a/2^384, with normalization to [0..q-1]. + static inline void + inner_gf65376_montgomery_reduce(gf65376 *d, const gf65376 *a) + { + uint64_t x0, x1, x2, x3, x4, x5, f0, f1, f2, f3, f4, f5; + uint64_t g0, g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11; + uint64_t d0, d1, d2, d3, d4, d5; + uint64_t hi, t, w; + unsigned char cc; + + // Let m = -1/q mod 2^384 = 65*2^376 + 1 + // For input x, we compute f = x*m mod 2^384, then + // h = x + f*q, which is a multiple of 2^384. The output + // is then h/2^384. + // Since x < 2^384, we have: + // h <= 2^384 - 1 + (2^384 - 1)*q + // h <= q*2^384 + 2^384 - q - 1 + // Since h = 0 mod 2^384, this implies that h <= q*2^384. + // The output h/2^384 is therefore between 0 and q (inclusive). + + x0 = a->v0; + x1 = a->v1; + x2 = a->v2; + x3 = a->v3; + x4 = a->v4; + x5 = a->v5; + + // f = x*(-1/q) mod 2^384 + f0 = x0; + f1 = x1; + f2 = x2; + f3 = x3; + f4 = x4; + f5 = x5 + ((x0 * 65) << 56); + + // g = f*q + inner_gf65376_umul(g5, hi, f0, (uint64_t)65 << 56); + inner_gf65376_umul_add(g6, hi, f1, (uint64_t)65 << 56, hi); + inner_gf65376_umul_add(g7, hi, f2, (uint64_t)65 << 56, hi); + inner_gf65376_umul_add(g8, hi, f3, (uint64_t)65 << 56, hi); + inner_gf65376_umul_add(g9, hi, f4, (uint64_t)65 << 56, hi); + inner_gf65376_umul_add(g10, g11, f5, (uint64_t)65 << 56, hi); + + cc = inner_gf65376_sbb(0, 0, f0, &g0); + cc = inner_gf65376_sbb(cc, 0, f1, &g1); + cc = inner_gf65376_sbb(cc, 0, f2, &g2); + cc = inner_gf65376_sbb(cc, 0, f3, &g3); + cc = inner_gf65376_sbb(cc, 0, f4, &g4); + cc = inner_gf65376_sbb(cc, g5, f5, &g5); + cc = inner_gf65376_sbb(cc, g6, 0, &g6); + cc = inner_gf65376_sbb(cc, g7, 0, &g7); + cc = inner_gf65376_sbb(cc, g8, 0, &g8); + cc = inner_gf65376_sbb(cc, g9, 0, &g9); + cc = inner_gf65376_sbb(cc, g10, 0, &g10); + (void)inner_gf65376_sbb(cc, g11, 0, &g11); + + // h = x + f*q (we drop the low 384 bits). + cc = inner_gf65376_adc(0, g0, x0, &x0); + cc = inner_gf65376_adc(cc, g1, x1, &x1); + cc = inner_gf65376_adc(cc, g2, x2, &x2); + cc = inner_gf65376_adc(cc, g3, x3, &x3); + cc = inner_gf65376_adc(cc, g4, x4, &x4); + cc = inner_gf65376_adc(cc, g5, x5, &x5); + cc = inner_gf65376_adc(cc, g6, 0, &d0); + cc = inner_gf65376_adc(cc, g7, 0, &d1); + cc = inner_gf65376_adc(cc, g8, 0, &d2); + cc = inner_gf65376_adc(cc, g9, 0, &d3); + cc = inner_gf65376_adc(cc, g10, 0, &d4); + (void)inner_gf65376_adc(cc, g11, 0, &d5); + + // Normalize: if h = q, replace it with zero. + t = d0 & d1 & d2 & d3 & d4 & (d5 ^ ~(uint64_t)0x40FFFFFFFFFFFFFF); + cc = inner_gf65376_adc(0, t, 1, &t); + (void)inner_gf65376_sbb(cc, 0, 0, &w); + w = ~w; + d->v0 = d0 & w; + d->v1 = d1 & w; + d->v2 = d2 & w; + d->v3 = d3 & w; + d->v4 = d4 & w; + d->v5 = d5 & w; + } + + /* + * d <- a*b + */ + static inline void + gf65376_mul(gf65376 *d, const gf65376 *a, const gf65376 *b) + { + uint64_t e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11; + uint64_t f0, f1, f2, f3, f4, f5, lo, hi, lo2, hi2; + uint64_t g0, g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11; + unsigned char cc; + + // Multiplication over integers. + // 6 mul + inner_gf65376_umul(e0, e1, a->v0, b->v0); + inner_gf65376_umul(e2, e3, a->v1, b->v1); + inner_gf65376_umul(e4, e5, a->v2, b->v2); + inner_gf65376_umul(e6, e7, a->v3, b->v3); + inner_gf65376_umul(e8, e9, a->v4, b->v4); + inner_gf65376_umul(e10, e11, a->v5, b->v5); + + // + 5 mul = 11 + inner_gf65376_umul(lo, hi, a->v0, b->v1); + cc = inner_gf65376_adc(0, e1, lo, &e1); + cc = inner_gf65376_adc(cc, e2, hi, &e2); + inner_gf65376_umul(lo, hi, a->v0, b->v3); + cc = inner_gf65376_adc(cc, e3, lo, &e3); + cc = inner_gf65376_adc(cc, e4, hi, &e4); + inner_gf65376_umul(lo, hi, a->v0, b->v5); + cc = inner_gf65376_adc(cc, e5, lo, &e5); + cc = inner_gf65376_adc(cc, e6, hi, &e6); + inner_gf65376_umul(lo, hi, a->v2, b->v5); + cc = inner_gf65376_adc(cc, e7, lo, &e7); + cc = inner_gf65376_adc(cc, e8, hi, &e8); + inner_gf65376_umul(lo, hi, a->v4, b->v5); + cc = inner_gf65376_adc(cc, e9, lo, &e9); + cc = inner_gf65376_adc(cc, e10, hi, &e10); + cc = inner_gf65376_adc(cc, e11, 0, &e11); + assert(cc == 0); + + // + 5 mul = 16 + inner_gf65376_umul(lo, hi, a->v1, b->v0); + cc = inner_gf65376_adc(0, e1, lo, &e1); + cc = inner_gf65376_adc(cc, e2, hi, &e2); + inner_gf65376_umul(lo, hi, a->v3, b->v0); + cc = inner_gf65376_adc(cc, e3, lo, &e3); + cc = inner_gf65376_adc(cc, e4, hi, &e4); + inner_gf65376_umul(lo, hi, a->v5, b->v0); + cc = inner_gf65376_adc(cc, e5, lo, &e5); + cc = inner_gf65376_adc(cc, e6, hi, &e6); + inner_gf65376_umul(lo, hi, a->v5, b->v2); + cc = inner_gf65376_adc(cc, e7, lo, &e7); + cc = inner_gf65376_adc(cc, e8, hi, &e8); + inner_gf65376_umul(lo, hi, a->v5, b->v4); + cc = inner_gf65376_adc(cc, e9, lo, &e9); + cc = inner_gf65376_adc(cc, e10, hi, &e10); + cc = inner_gf65376_adc(cc, e11, 0, &e11); + assert(cc == 0); + + // + 4 mul = 20 + inner_gf65376_umul(lo, hi, a->v0, b->v2); + cc = inner_gf65376_adc(0, e2, lo, &e2); + cc = inner_gf65376_adc(cc, e3, hi, &e3); + inner_gf65376_umul(lo, hi, a->v0, b->v4); + cc = inner_gf65376_adc(cc, e4, lo, &e4); + cc = inner_gf65376_adc(cc, e5, hi, &e5); + inner_gf65376_umul(lo, hi, a->v2, b->v4); + cc = inner_gf65376_adc(cc, e6, lo, &e6); + cc = inner_gf65376_adc(cc, e7, hi, &e7); + inner_gf65376_umul(lo, hi, a->v3, b->v5); + cc = inner_gf65376_adc(cc, e8, lo, &e8); + cc = inner_gf65376_adc(cc, e9, hi, &e9); + cc = inner_gf65376_adc(cc, e10, 0, &e10); + cc = inner_gf65376_adc(cc, e11, 0, &e11); + assert(cc == 0); + + // + 4 mul = 24 + inner_gf65376_umul(lo, hi, a->v2, b->v0); + cc = inner_gf65376_adc(0, e2, lo, &e2); + cc = inner_gf65376_adc(cc, e3, hi, &e3); + inner_gf65376_umul(lo, hi, a->v4, b->v0); + cc = inner_gf65376_adc(cc, e4, lo, &e4); + cc = inner_gf65376_adc(cc, e5, hi, &e5); + inner_gf65376_umul(lo, hi, a->v4, b->v2); + cc = inner_gf65376_adc(cc, e6, lo, &e6); + cc = inner_gf65376_adc(cc, e7, hi, &e7); + inner_gf65376_umul(lo, hi, a->v5, b->v3); + cc = inner_gf65376_adc(cc, e8, lo, &e8); + cc = inner_gf65376_adc(cc, e9, hi, &e9); + cc = inner_gf65376_adc(cc, e10, 0, &e10); + cc = inner_gf65376_adc(cc, e11, 0, &e11); + assert(cc == 0); + + // + 3 mul = 27 + inner_gf65376_umul(lo, hi, a->v1, b->v2); + cc = inner_gf65376_adc(cc, e3, lo, &e3); + cc = inner_gf65376_adc(cc, e4, hi, &e4); + inner_gf65376_umul(lo, hi, a->v1, b->v4); + cc = inner_gf65376_adc(cc, e5, lo, &e5); + cc = inner_gf65376_adc(cc, e6, hi, &e6); + inner_gf65376_umul(lo, hi, a->v3, b->v4); + cc = inner_gf65376_adc(cc, e7, lo, &e7); + cc = inner_gf65376_adc(cc, e8, hi, &e8); + cc = inner_gf65376_adc(cc, e9, 0, &e9); + cc = inner_gf65376_adc(cc, e10, 0, &e10); + cc = inner_gf65376_adc(cc, e11, 0, &e11); + assert(cc == 0); + + // + 3 mul = 30 + inner_gf65376_umul(lo, hi, a->v2, b->v1); + cc = inner_gf65376_adc(cc, e3, lo, &e3); + cc = inner_gf65376_adc(cc, e4, hi, &e4); + inner_gf65376_umul(lo, hi, a->v4, b->v1); + cc = inner_gf65376_adc(cc, e5, lo, &e5); + cc = inner_gf65376_adc(cc, e6, hi, &e6); + inner_gf65376_umul(lo, hi, a->v4, b->v3); + cc = inner_gf65376_adc(cc, e7, lo, &e7); + cc = inner_gf65376_adc(cc, e8, hi, &e8); + cc = inner_gf65376_adc(cc, e9, 0, &e9); + cc = inner_gf65376_adc(cc, e10, 0, &e10); + cc = inner_gf65376_adc(cc, e11, 0, &e11); + assert(cc == 0); + + // + 2 mul = 32 + inner_gf65376_umul(lo, hi, a->v1, b->v3); + cc = inner_gf65376_adc(cc, e4, lo, &e4); + cc = inner_gf65376_adc(cc, e5, hi, &e5); + inner_gf65376_umul(lo, hi, a->v1, b->v5); + cc = inner_gf65376_adc(cc, e6, lo, &e6); + cc = inner_gf65376_adc(cc, e7, hi, &e7); + cc = inner_gf65376_adc(cc, e8, 0, &e8); + cc = inner_gf65376_adc(cc, e9, 0, &e9); + cc = inner_gf65376_adc(cc, e10, 0, &e10); + cc = inner_gf65376_adc(cc, e11, 0, &e11); + assert(cc == 0); + + // + 2 mul = 34 + inner_gf65376_umul(lo, hi, a->v3, b->v1); + cc = inner_gf65376_adc(cc, e4, lo, &e4); + cc = inner_gf65376_adc(cc, e5, hi, &e5); + inner_gf65376_umul(lo, hi, a->v5, b->v1); + cc = inner_gf65376_adc(cc, e6, lo, &e6); + cc = inner_gf65376_adc(cc, e7, hi, &e7); + cc = inner_gf65376_adc(cc, e8, 0, &e8); + cc = inner_gf65376_adc(cc, e9, 0, &e9); + cc = inner_gf65376_adc(cc, e10, 0, &e10); + cc = inner_gf65376_adc(cc, e11, 0, &e11); + assert(cc == 0); + + // + 2 mul = 36 + inner_gf65376_umul(lo, hi, a->v2, b->v3); + inner_gf65376_umul(lo2, hi2, a->v3, b->v2); + cc = inner_gf65376_adc(0, lo, lo2, &lo); + cc = inner_gf65376_adc(cc, hi, hi2, &hi); + cc = inner_gf65376_adc(cc, 0, 0, &hi2); + assert(cc == 0); + cc = inner_gf65376_adc(0, e5, lo, &e5); + cc = inner_gf65376_adc(cc, e6, hi, &e6); + cc = inner_gf65376_adc(cc, e7, hi2, &e7); + cc = inner_gf65376_adc(cc, e8, 0, &e8); + cc = inner_gf65376_adc(cc, e9, 0, &e9); + cc = inner_gf65376_adc(cc, e10, 0, &e10); + cc = inner_gf65376_adc(cc, e11, 0, &e11); + assert(cc == 0); + + // Montgomery reduction. + // + // Low part is lo(e) = e0..e5 (384 bits). + // Let m = -1/q mod 2^384; we add (lo(e)*m mod 2^384)*q to the + // high part g = e6..e11 (766 bits). + // + // We have m = 65*2^376 + 1. + f0 = e0; + f1 = e1; + f2 = e2; + f3 = e3; + f4 = e4; + f5 = e5 + ((e0 * 65) << 56); + + // g = f*q + inner_gf65376_umul(g5, hi, f0, (uint64_t)65 << 56); + inner_gf65376_umul_add(g6, hi, f1, (uint64_t)65 << 56, hi); + inner_gf65376_umul_add(g7, hi, f2, (uint64_t)65 << 56, hi); + inner_gf65376_umul_add(g8, hi, f3, (uint64_t)65 << 56, hi); + inner_gf65376_umul_add(g9, hi, f4, (uint64_t)65 << 56, hi); + inner_gf65376_umul_add(g10, g11, f5, (uint64_t)65 << 56, hi); + + cc = inner_gf65376_sbb(0, 0, f0, &g0); + cc = inner_gf65376_sbb(cc, 0, f1, &g1); + cc = inner_gf65376_sbb(cc, 0, f2, &g2); + cc = inner_gf65376_sbb(cc, 0, f3, &g3); + cc = inner_gf65376_sbb(cc, 0, f4, &g4); + cc = inner_gf65376_sbb(cc, g5, f5, &g5); + cc = inner_gf65376_sbb(cc, g6, 0, &g6); + cc = inner_gf65376_sbb(cc, g7, 0, &g7); + cc = inner_gf65376_sbb(cc, g8, 0, &g8); + cc = inner_gf65376_sbb(cc, g9, 0, &g9); + cc = inner_gf65376_sbb(cc, g10, 0, &g10); + cc = inner_gf65376_sbb(cc, g11, 0, &g11); + assert(cc == 0); + + // Add g = f*q to e0..e11. + // Since e0..e11 < 2^766 and f < 2^384, we know that the result + // is less than 2^766 + 2^384*65*2^376, which is less than 2^768. + // This is also a multiple of 2^256. We divide by 2^256 by simply + // dropping the low 256 bits (which are all equal to zero), and + // the result is less than 2**384 + cc = inner_gf65376_adc(0, g0, e0, &e0); + cc = inner_gf65376_adc(cc, g1, e1, &e1); + cc = inner_gf65376_adc(cc, g2, e2, &e2); + cc = inner_gf65376_adc(cc, g3, e3, &e3); + cc = inner_gf65376_adc(cc, g4, e4, &e4); + cc = inner_gf65376_adc(cc, g5, e5, &e5); + cc = inner_gf65376_adc(cc, g6, e6, &e6); + cc = inner_gf65376_adc(cc, g7, e7, &e7); + cc = inner_gf65376_adc(cc, g8, e8, &e8); + cc = inner_gf65376_adc(cc, g9, e9, &e9); + cc = inner_gf65376_adc(cc, g10, e10, &e10); + cc = inner_gf65376_adc(cc, g11, e11, &e11); + assert(cc == 0); + + // To ensure the result is in the allowable range, we still need to + // do a final reduction to ensure the value is smaller than 2^383 + inner_gf65376_partial_reduce(d, e6, e7, e8, e9, e10, e11); + } + + /* + * d <- a^2 + */ + static inline void + gf65376_square(gf65376 *d, const gf65376 *a) + { + uint64_t e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11; + uint64_t f0, f1, f2, f3, f4, f5, lo, hi; + uint64_t g0, g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11; + unsigned char cc; + + // Squaring over integers. + // 5 mul + inner_gf65376_umul(e1, e2, a->v0, a->v1); + inner_gf65376_umul(e3, e4, a->v0, a->v3); + inner_gf65376_umul(e5, e6, a->v0, a->v5); + inner_gf65376_umul(e7, e8, a->v2, a->v5); + inner_gf65376_umul(e9, e10, a->v4, a->v5); + + inner_gf65376_umul(lo, hi, a->v0, a->v2); + cc = inner_gf65376_adc(0, e2, lo, &e2); + cc = inner_gf65376_adc(cc, e3, hi, &e3); + inner_gf65376_umul(lo, hi, a->v0, a->v4); + cc = inner_gf65376_adc(cc, e4, lo, &e4); + cc = inner_gf65376_adc(cc, e5, hi, &e5); + inner_gf65376_umul(lo, hi, a->v1, a->v5); + cc = inner_gf65376_adc(cc, e6, lo, &e6); + cc = inner_gf65376_adc(cc, e7, hi, &e7); + inner_gf65376_umul(lo, hi, a->v3, a->v5); + cc = inner_gf65376_adc(cc, e8, lo, &e8); + cc = inner_gf65376_adc(cc, e9, hi, &e9); + (void)inner_gf65376_adc(cc, e10, 0, &e10); + + inner_gf65376_umul(lo, hi, a->v1, a->v2); + cc = inner_gf65376_adc(0, e3, lo, &e3); + cc = inner_gf65376_adc(cc, e4, hi, &e4); + inner_gf65376_umul(lo, hi, a->v1, a->v4); + cc = inner_gf65376_adc(cc, e5, lo, &e5); + cc = inner_gf65376_adc(cc, e6, hi, &e6); + inner_gf65376_umul(lo, hi, a->v3, a->v4); + cc = inner_gf65376_adc(cc, e7, lo, &e7); + cc = inner_gf65376_adc(cc, e8, hi, &e8); + (void)inner_gf65376_adc(cc, e9, 0, &e9); + + inner_gf65376_umul(lo, hi, a->v1, a->v3); + cc = inner_gf65376_adc(0, e4, lo, &e4); + cc = inner_gf65376_adc(cc, e5, hi, &e5); + inner_gf65376_umul(lo, hi, a->v2, a->v4); + cc = inner_gf65376_adc(cc, e6, lo, &e6); + cc = inner_gf65376_adc(cc, e7, hi, &e7); + (void)inner_gf65376_adc(cc, e8, 0, &e8); + + inner_gf65376_umul(lo, hi, a->v2, a->v3); + cc = inner_gf65376_adc(0, e5, lo, &e5); + cc = inner_gf65376_adc(cc, e6, hi, &e6); + (void)inner_gf65376_adc(cc, e7, 0, &e7); + + e11 = e10 >> 63; + e10 = (e10 << 1) | (e9 >> 63); + e9 = (e9 << 1) | (e8 >> 63); + e8 = (e8 << 1) | (e7 >> 63); + e7 = (e7 << 1) | (e6 >> 63); + e6 = (e6 << 1) | (e5 >> 63); + e5 = (e5 << 1) | (e4 >> 63); + e4 = (e4 << 1) | (e3 >> 63); + e3 = (e3 << 1) | (e2 >> 63); + e2 = (e2 << 1) | (e1 >> 63); + e1 = e1 << 1; + + inner_gf65376_umul(e0, hi, a->v0, a->v0); + cc = inner_gf65376_adc(0, e1, hi, &e1); + inner_gf65376_umul(lo, hi, a->v1, a->v1); + cc = inner_gf65376_adc(cc, e2, lo, &e2); + cc = inner_gf65376_adc(cc, e3, hi, &e3); + inner_gf65376_umul(lo, hi, a->v2, a->v2); + cc = inner_gf65376_adc(cc, e4, lo, &e4); + cc = inner_gf65376_adc(cc, e5, hi, &e5); + inner_gf65376_umul(lo, hi, a->v3, a->v3); + cc = inner_gf65376_adc(cc, e6, lo, &e6); + cc = inner_gf65376_adc(cc, e7, hi, &e7); + inner_gf65376_umul(lo, hi, a->v4, a->v4); + cc = inner_gf65376_adc(cc, e8, lo, &e8); + cc = inner_gf65376_adc(cc, e9, hi, &e9); + inner_gf65376_umul(lo, hi, a->v5, a->v5); + cc = inner_gf65376_adc(cc, e10, lo, &e10); + (void)inner_gf65376_adc(cc, e11, hi, &e11); + + // Montgomery reduction. + // + // Low part is lo(e) = e0..e5 (384 bits). + // Let m = -1/q mod 2^384; we add (lo(e)*m mod 2^384)*q to the + // high part g = e6..e11 (766 bits). + // + // We have m = 65*2^376 + 1. + f0 = e0; + f1 = e1; + f2 = e2; + f3 = e3; + f4 = e4; + f5 = e5 + ((e0 * 65) << 56); + + // g = f*q + inner_gf65376_umul(g5, hi, f0, (uint64_t)65 << 56); + inner_gf65376_umul_add(g6, hi, f1, (uint64_t)65 << 56, hi); + inner_gf65376_umul_add(g7, hi, f2, (uint64_t)65 << 56, hi); + inner_gf65376_umul_add(g8, hi, f3, (uint64_t)65 << 56, hi); + inner_gf65376_umul_add(g9, hi, f4, (uint64_t)65 << 56, hi); + inner_gf65376_umul_add(g10, g11, f5, (uint64_t)65 << 56, hi); + + cc = inner_gf65376_sbb(0, 0, f0, &g0); + cc = inner_gf65376_sbb(cc, 0, f1, &g1); + cc = inner_gf65376_sbb(cc, 0, f2, &g2); + cc = inner_gf65376_sbb(cc, 0, f3, &g3); + cc = inner_gf65376_sbb(cc, 0, f4, &g4); + cc = inner_gf65376_sbb(cc, g5, f5, &g5); + cc = inner_gf65376_sbb(cc, g6, 0, &g6); + cc = inner_gf65376_sbb(cc, g7, 0, &g7); + cc = inner_gf65376_sbb(cc, g8, 0, &g8); + cc = inner_gf65376_sbb(cc, g9, 0, &g9); + cc = inner_gf65376_sbb(cc, g10, 0, &g10); + cc = inner_gf65376_sbb(cc, g11, 0, &g11); + assert(cc == 0); + + // Add g = f*q to e0..e11. + // Since e0..e11 < 2^766 and f < 2^384, we know that the result + // is less than 2^766 + 2^384*65*2^376, which is less than 2^768. + // This is also a multiple of 2^256. We divide by 2^256 by simply + // dropping the low 256 bits (which are all equal to zero), and + // the result is less than 2**384 + cc = inner_gf65376_adc(0, g0, e0, &e0); + cc = inner_gf65376_adc(cc, g1, e1, &e1); + cc = inner_gf65376_adc(cc, g2, e2, &e2); + cc = inner_gf65376_adc(cc, g3, e3, &e3); + cc = inner_gf65376_adc(cc, g4, e4, &e4); + cc = inner_gf65376_adc(cc, g5, e5, &e5); + cc = inner_gf65376_adc(cc, g6, e6, &e6); + cc = inner_gf65376_adc(cc, g7, e7, &e7); + cc = inner_gf65376_adc(cc, g8, e8, &e8); + cc = inner_gf65376_adc(cc, g9, e9, &e9); + cc = inner_gf65376_adc(cc, g10, e10, &e10); + cc = inner_gf65376_adc(cc, g11, e11, &e11); + assert(cc == 0); + + // To ensure the result is in the allowable range, we still need to + // do a final reduction to ensure the value is smaller than 2^383 + inner_gf65376_partial_reduce(d, e6, e7, e8, e9, e10, e11); + } + + /* + * d <- a^(2^n) + * This computes n successive squarings of value a, with result in d. + * n == 0 is a valid input (in that case, *a is copied into *d). + * This function is not constant-time with regard to n: the number of + * successive squarings may be observable through timing-based side channels. + */ + static inline void + gf65376_xsquare(gf65376 *d, const gf65376 *a, unsigned n) + { + if (n == 0) { + *d = *a; + return; + } + gf65376_square(d, a); + while (n-- > 1) { + gf65376_square(d, d); + } + } + + /* + * Returns 0xFFFFFFFF if *a is zero; otherwise, 0x00000000 is returned. + */ + static inline uint32_t + gf65376_iszero(const gf65376 *a) + { + uint64_t a0, a1, a2, a3, a4, a5, t0, t1, r; + + // Zero can be represented by 0 or by q. + a0 = a->v0; + a1 = a->v1; + a2 = a->v2; + a3 = a->v3; + a4 = a->v4; + a5 = a->v5; + t0 = a0 | a1 | a2 | a3 | a4 | a5; + t1 = ~a0 | ~a1 | ~a2 | ~a3 | ~a4 | (a5 ^ 0x40FFFFFFFFFFFFFF); + + // Top bit of r is 0 if and only if one of t0 or t1 is zero. + r = (t0 | -t0) & (t1 | -t1); + return (uint32_t)(r >> 63) - 1; + } + + /* + * Returns 0xFFFFFFFF if *a and *b represent the same field element; + * otherwise, 0x00000000 is returned. + */ + static inline uint32_t + gf65376_equals(const gf65376 *a, const gf65376 *b) + { + gf65376 d; + gf65376_sub(&d, a, b); + return gf65376_iszero(&d); + } + + /* + * d <- 1/a + * If *a is not zero, then the inverse is well-defined and written into *d, + * and the function returns 0xFFFFFFFF. If *a is zero, then this function + * sets *d to zero and returns 0x00000000. + */ + uint32_t gf65376_invert(gf65376 *d, const gf65376 *a); + + /* + * d <- a/b + * If *b is not zero, then this functions writes a/b into *d, and returns + * 0xFFFFFFFF. If *b is zero, then this function sets *d to zero (regardless + * of the value of *a) and returns 0x00000000. + */ + uint32_t gf65376_div(gf65376 *d, const gf65376 *a, const gf65376 *b); + + /* + * d <- a/3 + * Divides by 3 in the field by implementing the algorithm proposed in + * "Efficient Multiplication in Finite Field Extensions of Degree 5" + * by El Mrabet, Guillevic and Ionica at ASIACRYPT 2011. + */ + void gf65376_div3(gf65376 *out, const gf65376 *a); + + /* + * Get the Legendre symbol of *a (0 for zero, +1 for a non-zero square, + * -1 for a non-square). + */ + int32_t gf65376_legendre(const gf65376 *a); + + /* + * If *a is a square, then this function sets *d to a square root of a, + * and returns 0xFFFFFFFF. If *a is not a square, then this function + * sets *d to a square root of -a, and returns 0x00000000. + * In all cases, the value written into *d is such that the least significant + * bit of its integer representation (in [0..q-1]) is zero. + */ + uint32_t gf65376_sqrt(gf65376 *d, const gf65376 *a); + + /* + * Encode field element *a into buffer dst (exactly 32 bytes are written). + */ + void gf65376_encode(void *dst, const gf65376 *a); + + /* + * Decode source buffer src (exactly 32 bytes) into a field element *d. + * If the source value is not a valid canonical encoding, then *d is zero + * and the function returns 0x00000000; otherwise, the function returns + * 0xFFFFFFFF. + */ + uint32_t gf65376_decode(gf65376 *d, const void *src); + + /* + * Interpret the source buffer (of size len bytes) as an unsigned integer + * (little-endian convention) and reduce it modulo q, yielding a field + * element which is written into *d. Since reduction is applied, this + * function cannot fail. + */ + void gf65376_decode_reduce(gf65376 *d, const void *src, size_t len); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/gf/broadwell/lvl3/test/CMakeLists.txt b/src/gf/broadwell/lvl3/test/CMakeLists.txt new file mode 100644 index 0000000..316e0a8 --- /dev/null +++ b/src/gf/broadwell/lvl3/test/CMakeLists.txt @@ -0,0 +1 @@ +include(../../lvlx_test.cmake) diff --git a/src/gf/broadwell/lvl5/CMakeLists.txt b/src/gf/broadwell/lvl5/CMakeLists.txt new file mode 100644 index 0000000..b114fa0 --- /dev/null +++ b/src/gf/broadwell/lvl5/CMakeLists.txt @@ -0,0 +1,6 @@ +set(SOURCE_FILES_GF_SPECIFIC + gf27500.c + fp_asm.S +) + +include(../lvlx.cmake) diff --git a/src/gf/broadwell/lvl5/fp.c b/src/gf/broadwell/lvl5/fp.c new file mode 100644 index 0000000..37b7c87 --- /dev/null +++ b/src/gf/broadwell/lvl5/fp.c @@ -0,0 +1,112 @@ +#include +#include "fp.h" + +const digit_t p[NWORDS_FIELD] = { 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, + 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0x01afffffffffffff }; +const digit_t p2[NWORDS_FIELD] = { 0xfffffffffffffffe, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, + 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0x035fffffffffffff }; + +void +fp_sqrt(fp_t *x) +{ + fp_t tmp = *x; + (void)gf27500_sqrt(x, &tmp); +} + +uint32_t +fp_is_square(const fp_t *a) +{ + // ls is (0, 1, -1) and we want fp_is_square + // to return 0xFF..FF when ls is 1 or 0 and 0x00..00 otherwise + int32_t ls = gf27500_legendre(a); + return ~(uint32_t)(ls >> 1); +} + +void +fp_inv(fp_t *x) +{ + fp_t tmp = *x; + (void)gf27500_invert(x, &tmp); +} + +void +fp_exp3div4(fp_t *a) +{ + // + // We optimise this by using the shape of the prime + // to avoid almost all multiplications: + // + // We write: + // (p - 3) / 4 = (27*2^500 - 4) / 4 + // = 27*2^498 - 1 + // = 27*(2^498 - 1) + 26 + // Then we first compute: + // a498 = a**(2^498 - 1) + // Then from this we get the desired result as: + // a**((p-3)/4) = a498**27 * a**26 + // We can compute this with 15 multiplications and 504 squares. + fp_t z26, t3, t6, t9, tmp; + // Compute a**3 and a**26 + fp_sqr(&z26, a); + fp_mul(&tmp, a, &z26); + fp_sqr(&z26, &z26); + // Compute a**(2^3 - 1) = a**7 + fp_mul(&t3, &tmp, &z26); + fp_sqr(&z26, &tmp); + fp_sqr(&z26, &z26); + fp_mul(&z26, &z26, a); + fp_sqr(&z26, &z26); + // Compute a**(2^6 - 1) + fp_sqr(&t6, &t3); + for (int i = 1; i < 3; i++) + fp_sqr(&t6, &t6); + fp_mul(&t6, &t6, &t3); + // Compute a**(2^9 - 1) + fp_sqr(&t9, &t6); + for (int i = 1; i < 3; i++) + fp_sqr(&t9, &t9); + fp_mul(&t9, &t9, &t3); + // Compute a**(2^15 - 1) + fp_sqr(a, &t9); + for (int i = 1; i < 6; i++) + fp_sqr(a, a); + fp_mul(a, a, &t6); + // Compute a**(2^30 - 1) + fp_sqr(&tmp, a); + for (int i = 1; i < 15; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(2^60 - 1) + fp_sqr(&tmp, a); + for (int i = 1; i < 30; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(2^120 - 1) + fp_sqr(&tmp, a); + for (int i = 1; i < 60; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(2^240 - 1) + fp_sqr(&tmp, a); + for (int i = 1; i < 120; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(2^249 - 1) + for (int i = 0; i < 9; i++) + fp_sqr(a, a); + fp_mul(a, a, &t9); + // Compute a**(2^498 - 1) + fp_sqr(&tmp, a); + for (int i = 1; i < 249; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(27*(2^498 - 1)) + fp_sqr(&tmp, a); + fp_sqr(&tmp, &tmp); + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + fp_sqr(&tmp, a); + fp_mul(a, a, &tmp); + // Compute a**(27*(2^498 - 1) + 26) + fp_mul(a, a, &z26); +} diff --git a/src/gf/broadwell/lvl5/fp_asm.S b/src/gf/broadwell/lvl5/fp_asm.S new file mode 100755 index 0000000..3e73903 --- /dev/null +++ b/src/gf/broadwell/lvl5/fp_asm.S @@ -0,0 +1,784 @@ +#include +.intel_syntax noprefix + +.set pbytes,32 +.set plimbs,4 + +#ifdef __APPLE__ +.section __TEXT,__const +#else +.section .rodata +#endif +p_plus_1: .quad 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x01B0000000000000 + +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",@progbits +#endif + +#include + +.text +.p2align 4,,15 + +.global fp_add +fp_add: + push r12 + push r13 + push r14 + push r15 + xor rax, rax + mov r8, [rsi] + mov r9, [rsi+8] + mov r10, [rsi+16] + mov r11, [rsi+24] + mov r12, [rsi+32] + mov r13, [rsi+40] + mov r14, [rsi+48] + mov r15, [rsi+56] + add r8, [rdx] + adc r9, [rdx+8] + adc r10, [rdx+16] + adc r11, [rdx+24] + adc r12, [rdx+32] + adc r13, [rdx+40] + adc r14, [rdx+48] + adc r15, [rdx+56] + mov rax, r15 + shr rax, 57 + neg rax + mov rdx, [rip+p+56] + and rdx, rax + sub r8, rax + sbb r9, rax + sbb r10, rax + sbb r11, rax + sbb r12, rax + sbb r13, rax + sbb r14, rax + sbb r15, rdx + + mov rax, r15 + shr rax, 57 + neg rax + mov rdx, [rip+p+56] + and rdx, rax + sub r8, rax + sbb r9, rax + sbb r10, rax + sbb r11, rax + sbb r12, rax + sbb r13, rax + sbb r14, rax + sbb r15, rdx + mov [rdi], r8 + mov [rdi+8], r9 + mov [rdi+16], r10 + mov [rdi+24], r11 + mov [rdi+32], r12 + mov [rdi+40], r13 + mov [rdi+48], r14 + mov [rdi+56], r15 + pop r15 + pop r14 + pop r13 + pop r12 + ret + +.global fp_sub +fp_sub: + push r12 + push r13 + push r14 + push r15 + xor rax, rax + mov r8, [rsi] + mov r9, [rsi+8] + mov r10, [rsi+16] + mov r11, [rsi+24] + mov r12, [rsi+32] + mov r13, [rsi+40] + mov r14, [rsi+48] + mov r15, [rsi+56] + sub r8, [rdx] + sbb r9, [rdx+8] + sbb r10, [rdx+16] + sbb r11, [rdx+24] + sbb r12, [rdx+32] + sbb r13, [rdx+40] + sbb r14, [rdx+48] + sbb r15, [rdx+56] + sbb rax, 0 + + mov rdx, [rip+p+56] + and rdx, rax + add r8, rax + adc r9, rax + adc r10, rax + adc r11, rax + adc r12, rax + adc r13, rax + adc r14, rax + adc r15, rdx + + mov rax, r15 + sar rax, 57 + mov rdx, [rip+p+56] + and rdx, rax + add r8, rax + adc r9, rax + adc r10, rax + adc r11, rax + adc r12, rax + adc r13, rax + adc r14, rax + adc r15, rdx + + mov [rdi], r8 + mov [rdi+8], r9 + mov [rdi+16], r10 + mov [rdi+24], r11 + mov [rdi+32], r12 + mov [rdi+40], r13 + mov [rdi+48], r14 + mov [rdi+56], r15 + pop r15 + pop r14 + pop r13 + pop r12 + ret + +///////////////////////////////////////////////////////////////// MACRO +// z = a x bi + z +// Inputs: base memory pointer M1 (a), +// bi pre-stored in rdx, +// accumulator z in [Z0:Z8] +// Output: [Z0:Z8] +// Temps: regs T0:T1 +///////////////////////////////////////////////////////////////// +.macro MULADD64x512 M1, Z0, Z1, Z2, Z3, Z4, Z5, Z6, Z7, Z8, T0, T1, C + xor \C, \C + mulx \T0, \T1, \M1 // A0*B0 + adox \Z0, \T1 + adox \Z1, \T0 + mulx \T0, \T1, 8\M1 // A0*B1 + adcx \Z1, \T1 + adox \Z2, \T0 + mulx \T0, \T1, 16\M1 // A0*B2 + adcx \Z2, \T1 + adox \Z3, \T0 + mulx \T0, \T1, 24\M1 // A0*B3 + adcx \Z3, \T1 + adox \Z4, \T0 + mulx \T0, \T1, 32\M1 // A0*B4 + adcx \Z4, \T1 + adox \Z5, \T0 + mulx \T0, \T1, 40\M1 // A0*B5 + adcx \Z5, \T1 + adox \Z6, \T0 + mulx \T0, \T1, 48\M1 // A0*B6 + adcx \Z6, \T1 + adox \Z7, \T0 + mulx \T0, \T1, 56\M1 // A0*B7 + adcx \Z7, \T1 + adox \Z8, \T0 + adc \Z8, 0 +.endm + +.macro MULADD64x64 M1, Z0, Z1, Z2, Z3, Z4, Z5, Z6, Z7, T0, T1 + xor \T0, \T0 + mulx \T0, \T1, \M1 // A0*B0 + adox \Z6, \T1 + adox \Z7, \T0 +.endm + +//*********************************************************************** +// Multiplication in GF(p^2), non-complex part +// Operation: c [rdi] = a0 x b0 - a1 x b1 +// Inputs: a = [a1, a0] stored in [rsi] +// b = [b1, b0] stored in [rdx] +// Output: c stored in [rdi] +//*********************************************************************** +.global fp2_mul_c0 +fp2_mul_c0: + push r12 + push r13 + push r14 + push r15 + push rbx + push rbp + mov rcx, rdx + + // [rdi0:7] <- 2p - b1 + mov r8, [rip+p2] + mov r9, [rip+p2+8] + mov r10, r9 + mov r11, r9 + mov r12, r9 + mov r13, r9 + mov r14, r9 + mov r15, [rip+p2+56] + mov rax, [rcx+64] + mov rdx, [rcx+72] + sub r8, rax + sbb r9, rdx + mov rax, [rcx+80] + mov rdx, [rcx+88] + sbb r10, rax + sbb r11, rdx + mov rax, [rcx+96] + mov rdx, [rcx+104] + sbb r12, rax + sbb r13, rdx + mov rax, [rcx+112] + mov rdx, [rcx+120] + sbb r14, rax + sbb r15, rdx + mov [rdi], r8 + mov [rdi+8], r9 + mov [rdi+16], r10 + mov [rdi+24], r11 + mov [rdi+32], r12 + mov [rdi+40], r13 + mov [rdi+48], r14 + mov [rdi+56], r15 + + // [r8:r15, rax] <- z = a0 x b00 - a1 x b10 + mov rdx, [rcx] + mulx r9, r8, [rsi] + xor rax, rax + mulx r10, r11, [rsi+8] + adcx r9, r11 + mulx r11, r12, [rsi+16] + adcx r10, r12 + mulx r12, r13, [rsi+24] + adcx r11, r13 + mulx r13, r14, [rsi+32] + adcx r12, r14 + mulx r14, r15, [rsi+40] + adcx r13, r15 + mulx r15, rbp, [rsi+48] + adcx r14, rbp + mulx rax, rbx, [rsi+56] + adcx r15, rbx + adc rax, 0 + + mov rdx, [rdi] + MULADD64x512 [rsi+64], r8, r9, r10, r11, r12, r13, r14, r15, rax, rbx, rbp, rbx + // [r9:r14] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r8 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r9, r10, r11, r12, r13, r14, r15, rax, rbx, rbp + + // [r9:r15, rax, r8] <- z = a0 x b01 - a1 x b11 + z + mov rdx, [rcx+8] + MULADD64x512 [rsi], r9, r10, r11, r12, r13, r14, r15, rax, r8, rbx, rbp, r8 + mov rdx, [rdi+8] + MULADD64x512 [rsi+64], r9, r10, r11, r12, r13, r14, r15, rax, r8, rbx, rbp, rbx + // [r10:r15, rax, r8] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r9 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r10, r11, r12, r13, r14, r15, rax, r8, rbx, rbp + + // [r10:r15, rax, r8:r9] <- z = a0 x b02 - a1 x b12 + z + mov rdx, [rcx+16] + MULADD64x512 [rsi], r10, r11, r12, r13, r14, r15, rax, r8, r9, rbx, rbp, r9 + mov rdx, [rdi+16] + MULADD64x512 [rsi+64], r10, r11, r12, r13, r14, r15, rax, r8, r9, rbx, rbp, rbx + // [r11:r15, rax, r8:r9] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r10 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r11, r12, r13, r14, r15, rax, r8, r9, rbx, rbp + + // [r11:r15, rax, r8:r10] <- z = a0 x b03 - a1 x b13 + z + mov rdx, [rcx+24] + MULADD64x512 [rsi], r11, r12, r13, r14, r15, rax, r8, r9, r10, rbx, rbp, r10 + mov rdx, [rdi+24] + MULADD64x512 [rsi+64], r11, r12, r13, r14, r15, rax, r8, r9, r10, rbx, rbp, rbx + // [r12:r15, rax, r8:r10] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r11 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r12, r13, r14, r15, rax, r8, r9, r10, rbx, rbp + + // [r12:r15, rax, r8:r11] <- z = a0 x b04 - a1 x b14 + z + mov rdx, [rcx+32] + MULADD64x512 [rsi], r12, r13, r14, r15, rax, r8, r9, r10, r11, rbx, rbp, r11 + mov rdx, [rdi+32] + MULADD64x512 [rsi+64], r12, r13, r14, r15, rax, r8, r9, r10, r11, rbx, rbp, rbx + // [r13:r15, rax, r8:r11] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r12 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r13, r14, r15, rax, r8, r9, r10, r11, rbx, rbp + + // [r13:r15, rax, r8:r12] <- z = a0 x b05 - a1 x b15 + z + mov rdx, [rcx+40] + MULADD64x512 [rsi], r13, r14, r15, rax, r8, r9, r10, r11, r12, rbx, rbp, r12 + mov rdx, [rdi+40] + MULADD64x512 [rsi+64], r13, r14, r15, rax, r8, r9, r10, r11, r12, rbx, rbp, rbx + // [r14:r15, rax, r8:r12] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r13 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r14, r15, rax, r8, r9, r10, r11, r12, rbx, rbp + + // [r14:r15, rax, r8:r12] <- z = a0 x b06 - a1 x b16 + z + mov rdx, [rcx+48] + MULADD64x512 [rsi], r14, r15, rax, r8, r9, r10, r11, r12, r13, rbx, rbp, r13 + mov rdx, [rdi+48] + MULADD64x512 [rsi+64], r14, r15, rax, r8, r9, r10, r11, r12, r13, rbx, rbp, rbx + // [r15, rax, r8:r13] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r14 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r15, rax, r8, r9, r10, r11, r12, r13, rbx, rbp + + // [r15, rax, r8:r12] <- z = a0 x b06 - a1 x b16 + z + mov rdx, [rcx+56] + MULADD64x512 [rsi], r15, rax, r8, r9, r10, r11, r12, r13, r14, rbx, rbp, r14 + mov rdx, [rdi+56] + MULADD64x512 [rsi+64], r15, rax, r8, r9, r10, r11, r12, r13, r14, rbx, rbp, rbx + // [rax, r8:r14] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r15 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], rax, r8, r9, r10, r11, r12, r13, r14, rbx, rbp + + mov [rdi], rax + mov [rdi+8], r8 + mov [rdi+16], r9 + mov [rdi+24], r10 + mov [rdi+32], r11 + mov [rdi+40], r12 + mov [rdi+48], r13 + mov [rdi+56], r14 + pop rbp + pop rbx + pop r15 + pop r14 + pop r13 + pop r12 + ret + +//*********************************************************************** +// Multiplication in GF(p^2), complex part +// Operation: c [rdi] = a0 x b1 + a1 x b0 +// Inputs: a = [a1, a0] stored in [rsi] +// b = [b1, b0] stored in [rdx] +// Output: c stored in [rdi] +//*********************************************************************** +.global fp2_mul_c1 +fp2_mul_c1: + push r12 + push r13 + push r14 + push r15 + push rbx + push rbp + mov rcx, rdx + + // [r8:r15, rax] <- z = a0 x b10 + a1 x b00 + mov rdx, [rcx+64] + mulx r9, r8, [rsi] + xor rax, rax + mulx r10, r11, [rsi+8] + adcx r9, r11 + mulx r11, r12, [rsi+16] + adcx r10, r12 + mulx r12, r13, [rsi+24] + adcx r11, r13 + mulx r13, r14, [rsi+32] + adcx r12, r14 + mulx r14, r15, [rsi+40] + adcx r13, r15 + mulx r15, rbp, [rsi+48] + adcx r14, rbp + mulx rax, rbx, [rsi+56] + adcx r15, rbx + adc rax, 0 + + mov rdx, [rcx] + MULADD64x512 [rsi+64], r8, r9, r10, r11, r12, r13, r14, r15, rax, rbx, rbp, rbx + // [r9:r14] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r8 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r9, r10, r11, r12, r13, r14, r15, rax, rbx, rbp + + // [r9:r15, rax, r8] <- z = a0 x b01 - a1 x b11 + z + mov rdx, [rcx+72] + MULADD64x512 [rsi], r9, r10, r11, r12, r13, r14, r15, rax, r8, rbx, rbp, r8 + mov rdx, [rcx+8] + MULADD64x512 [rsi+64], r9, r10, r11, r12, r13, r14, r15, rax, r8, rbx, rbp, rbx + // [r10:r15, rax, r8] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r9 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r10, r11, r12, r13, r14, r15, rax, r8, rbx, rbp + + // [r10:r15, rax, r8:r9] <- z = a0 x b02 - a1 x b12 + z + mov rdx, [rcx+80] + MULADD64x512 [rsi], r10, r11, r12, r13, r14, r15, rax, r8, r9, rbx, rbp, r9 + mov rdx, [rcx+16] + MULADD64x512 [rsi+64], r10, r11, r12, r13, r14, r15, rax, r8, r9, rbx, rbp, rbx + // [r11:r15, rax, r8:r9] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r10 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r11, r12, r13, r14, r15, rax, r8, r9, rbx, rbp + + // [r11:r15, rax, r8:r10] <- z = a0 x b03 - a1 x b13 + z + mov rdx, [rcx+88] + MULADD64x512 [rsi], r11, r12, r13, r14, r15, rax, r8, r9, r10, rbx, rbp, r10 + mov rdx, [rcx+24] + MULADD64x512 [rsi+64], r11, r12, r13, r14, r15, rax, r8, r9, r10, rbx, rbp, rbx + // [r12:r15, rax, r8:r10] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r11 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r12, r13, r14, r15, rax, r8, r9, r10, rbx, rbp + + // [r12:r15, rax, r8:r11] <- z = a0 x b04 - a1 x b14 + z + mov rdx, [rcx+96] + MULADD64x512 [rsi], r12, r13, r14, r15, rax, r8, r9, r10, r11, rbx, rbp, r11 + mov rdx, [rcx+32] + MULADD64x512 [rsi+64], r12, r13, r14, r15, rax, r8, r9, r10, r11, rbx, rbp, rbx + // [r13:r15, rax, r8:r11] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r12 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r13, r14, r15, rax, r8, r9, r10, r11, rbx, rbp + + // [r13:r15, rax, r8:r12] <- z = a0 x b05 - a1 x b15 + z + mov rdx, [rcx+104] + MULADD64x512 [rsi], r13, r14, r15, rax, r8, r9, r10, r11, r12, rbx, rbp, r12 + mov rdx, [rcx+40] + MULADD64x512 [rsi+64], r13, r14, r15, rax, r8, r9, r10, r11, r12, rbx, rbp, rbx + // [r14:r15, rax, r8:r12] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r13 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r14, r15, rax, r8, r9, r10, r11, r12, rbx, rbp + + // [r14:r15, rax, r8:r12] <- z = a0 x b06 - a1 x b16 + z + mov rdx, [rcx+112] + MULADD64x512 [rsi], r14, r15, rax, r8, r9, r10, r11, r12, r13, rbx, rbp, r13 + mov rdx, [rcx+48] + MULADD64x512 [rsi+64], r14, r15, rax, r8, r9, r10, r11, r12, r13, rbx, rbp, rbx + // [r15, rax, r8:r13] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r14 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r15, rax, r8, r9, r10, r11, r12, r13, rbx, rbp + + // [r15, rax, r8:r12] <- z = a0 x b06 - a1 x b16 + z + mov rdx, [rcx+120] + MULADD64x512 [rsi], r15, rax, r8, r9, r10, r11, r12, r13, r14, rbx, rbp, r14 + mov rdx, [rcx+56] + MULADD64x512 [rsi+64], r15, rax, r8, r9, r10, r11, r12, r13, r14, rbx, rbp, rbx + // [rax, r8:r14] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r15 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], rax, r8, r9, r10, r11, r12, r13, r14, rbx, rbp + + mov [rdi], rax + mov [rdi+8], r8 + mov [rdi+16], r9 + mov [rdi+24], r10 + mov [rdi+32], r11 + mov [rdi+40], r12 + mov [rdi+48], r13 + mov [rdi+56], r14 + pop rbp + pop rbx + pop r15 + pop r14 + pop r13 + pop r12 + ret + +///////////////////////////////////////////////////////////////// MACRO +// z = a x b (mod p) +// Inputs: base memory pointers M0 (a), M1 (b) +// bi pre-stored in rdx, +// accumulator z in [Z0:Z8], pre-stores a0 x b +// Output: [Z0:Z8] +// Temps: regs T0:T1 +///////////////////////////////////////////////////////////////// +.macro FPMUL512x512 M0, M1, Z0, Z1, Z2, Z3, Z4, Z5, Z6, Z7, Z8, T0, T1 + // [Z1:Z8] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z0 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], \Z1, \Z2, \Z3, \Z4, \Z5, \Z6, \Z7, \Z8, \T0, \T1 + + // [Z1:Z8, Z0] <- z = a01 x a1 + z + mov rdx, 8\M0 + MULADD64x512 \M1, \Z1, \Z2, \Z3, \Z4, \Z5, \Z6, \Z7, \Z8, \Z0, \T0, \T1, \Z0 + // [Z2:Z8, Z0] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z1 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], \Z2, \Z3, \Z4, \Z5, \Z6, \Z7, \Z8, \Z0, \T0, \T1 + + // [Z2:Z8, Z0:Z1] <- z = a02 x a1 + z + mov rdx, 16\M0 + MULADD64x512 \M1, \Z2, \Z3, \Z4, \Z5, \Z6, \Z7, \Z8, \Z0, \Z1, \T0, \T1, \Z1 + // [Z3:Z8, Z0:Z1] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z2 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], \Z3, \Z4, \Z5, \Z6, \Z7, \Z8, \Z0, \Z1, \T0, \T1 + + // [Z3:Z8, Z0:Z2] <- z = a03 x a1 + z + mov rdx, 24\M0 + MULADD64x512 \M1, \Z3, \Z4, \Z5, \Z6, \Z7, \Z8, \Z0, \Z1, \Z2, \T0, \T1, \Z2 + // [Z4:Z8, Z0:Z2] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z3 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], \Z4, \Z5, \Z6, \Z7, \Z8, \Z0, \Z1, \Z2, \T0, \T1 + + // [Z4:Z8, Z0:Z3] <- z = a04 x a1 + z + mov rdx, 32\M0 + MULADD64x512 \M1, \Z4, \Z5, \Z6, \Z7, \Z8, \Z0, \Z1, \Z2, \Z3, \T0, \T1, \Z3 + // [Z5:Z8, Z0:Z3] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z4 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], \Z5, \Z6, \Z7, \Z8, \Z0, \Z1, \Z2, \Z3, \T0, \T1 + + // [Z5:Z8, Z0:Z4] <- z = a05 x a1 + z + mov rdx, 40\M0 + MULADD64x512 \M1, \Z5, \Z6, \Z7, \Z8, \Z0, \Z1, \Z2, \Z3, \Z4, \T0, \T1, \Z4 + // [Z6:Z8, Z0:Z4] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z5 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], \Z6, \Z7, \Z8, \Z0, \Z1, \Z2, \Z3, \Z4, \T0, \T1 + + // [Z6:Z8, Z0:Z5] <- z = a06 x a1 + z + mov rdx, 48\M0 + MULADD64x512 \M1, \Z6, \Z7, \Z8, \Z0, \Z1, \Z2, \Z3, \Z4, \Z5, \T0, \T1, \Z5 + // [Z7:Z8, Z0:Z5] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z6 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], \Z7, \Z8, \Z0, \Z1, \Z2, \Z3, \Z4, \Z5, \T0, \T1 + + // [Z7:Z8, Z0:Z6] <- z = a07 x a1 + z + mov rdx, 56\M0 + MULADD64x512 \M1, \Z7, \Z8, \Z0, \Z1, \Z2, \Z3, \Z4, \Z5, \Z6, \T0, \T1, \Z6 + // [Z8, Z0:Z6] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z7 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], \Z8, \Z0, \Z1, \Z2, \Z3, \Z4, \Z5, \Z6, \T0, \T1 +.endm + +//*********************************************************************** +// Squaring in GF(p^2), non-complex part +// Operation: c [rdi] = (a0+a1) x (a0-a1) +// Inputs: a = [a1, a0] stored in [rsi] +// Output: c stored in [rdi] +//*********************************************************************** +.global fp2_sq_c0 +fp2_sq_c0: + push r12 + push r13 + push r14 + push r15 + push rbx + push rbp + + // a0 + a1 + mov rdx, [rsi] + mov r9, [rsi+8] + mov r10, [rsi+16] + mov r11, [rsi+24] + mov r12, [rsi+32] + mov r13, [rsi+40] + mov r14, [rsi+48] + mov r15, [rsi+56] + add rdx, [rsi+64] + adc r9, [rsi+72] + adc r10, [rsi+80] + adc r11, [rsi+88] + adc r12, [rsi+96] + adc r13, [rsi+104] + adc r14, [rsi+112] + adc r15, [rsi+120] + mov [rdi], rdx + mov [rdi+8], r9 + mov [rdi+16], r10 + mov [rdi+24], r11 + mov [rdi+32], r12 + mov [rdi+40], r13 + mov [rdi+48], r14 + mov [rdi+56], r15 + + // a0 - a1 + 2p + mov r8, [rsi] + mov r10, [rsi+8] + mov r12, [rsi+16] + mov r13, [rsi+24] + mov r14, [rsi+32] + mov r15, [rsi+40] + mov rbx, [rsi+48] + mov rbp, [rsi+56] + sub r8, [rsi+64] + sbb r10, [rsi+72] + sbb r12, [rsi+80] + sbb r13, [rsi+88] + sbb r14, [rsi+96] + sbb r15, [rsi+104] + sbb rbx, [rsi+112] + sbb rbp, [rsi+120] + mov rax, [rip+p2] + add r8, rax + mov rax, [rip+p2+8] + adc r10, rax + adc r12, rax + adc r13, rax + adc r14, rax + adc r15, rax + adc rbx, rax + adc rbp, [rip+p2+56] + mov [rdi+64], r8 + mov [rdi+72], r10 + mov [rdi+80], r12 + mov [rdi+88], r13 + mov [rdi+96], r14 + mov [rdi+104], r15 + mov [rdi+112], rbx + mov [rdi+120], rbp + + // [r8:r15, rax] <- z = a00 x a1 + mulx r9, r8, r8 + xor rax, rax + mulx r10, r11, r10 + adcx r9, r11 + mulx r11, r12, r12 + adcx r10, r12 + mulx r12, r13, r13 + adcx r11, r13 + mulx r13, r14, r14 + adcx r12, r14 + mulx r14, r15, r15 + adcx r13, r15 + mulx r15, rbx, rbx + adcx r14, rbx + mulx rax, rbp, rbp + adcx r15, rbp + adc rax, 0 + + FPMUL512x512 [rdi], [rdi+64], r8, r9, r10, r11, r12, r13, r14, r15, rax, rbx, rbp + + mov [rdi], rax + mov [rdi+8], r8 + mov [rdi+16], r9 + mov [rdi+24], r10 + mov [rdi+32], r11 + mov [rdi+40], r12 + mov [rdi+48], r13 + mov [rdi+56], r14 + pop rbp + pop rbx + pop r15 + pop r14 + pop r13 + pop r12 + ret + +//*********************************************************************** +// Squaring in GF(p^2), complex part +// Operation: c [rdi] = 2a0 x a1 +// Inputs: a = [a1, a0] stored in [reg_p1] +// Output: c stored in [rdi] +//*********************************************************************** +.global fp2_sq_c1 +fp2_sq_c1: + push r12 + push r13 + push r14 + push r15 + push rbx + push rbp + + mov rdx, [rsi] + mov r9, [rsi+8] + mov r10, [rsi+16] + mov r11, [rsi+24] + mov r12, [rsi+32] + mov r13, [rsi+40] + mov r14, [rsi+48] + mov r15, [rsi+56] + add rdx, rdx + adc r9, r9 + adc r10, r10 + adc r11, r11 + adc r12, r12 + adc r13, r13 + adc r14, r14 + adc r15, r15 + sub rsp, 64 + mov [rsp+8], r9 + mov [rsp+16], r10 + mov [rsp+24], r11 + mov [rsp+32], r12 + mov [rsp+40], r13 + mov [rsp+48], r14 + mov [rsp+56], r15 + + // [r8:r15, rax] <- z = a00 x a1 + mulx r9, r8, [rsi+64] + xor rax, rax + mulx r10, r11, [rsi+72] + adcx r9, r11 + mulx r11, r12, [rsi+80] + adcx r10, r12 + mulx r12, r13, [rsi+88] + adcx r11, r13 + mulx r13, r14, [rsi+96] + adcx r12, r14 + mulx r14, r15, [rsi+104] + adcx r13, r15 + mulx r15, rbp, [rsi+112] + adcx r14, rbp + mulx rax, rbx, [rsi+120] + adcx r15, rbx + adc rax, 0 + + FPMUL512x512 [rsp], [rsi+64], r8, r9, r10, r11, r12, r13, r14, r15, rax, rbx, rbp + add rsp, 64 + + mov [rdi], rax + mov [rdi+8], r8 + mov [rdi+16], r9 + mov [rdi+24], r10 + mov [rdi+32], r11 + mov [rdi+40], r12 + mov [rdi+48], r13 + mov [rdi+56], r14 + pop rbp + pop rbx + pop r15 + pop r14 + pop r13 + pop r12 + ret + +//*********************************************************************** +// Field multiplication in GF(p) +// Operation: c = a x b mod p +// Inputs: a stored in [rsi], b stored in [rdx] +// Output: c stored in [rdi] +//*********************************************************************** +.global fp_mul +fp_mul: + push r12 + push r13 + push r14 + push r15 + push rbx + push rbp + mov rcx, rdx + + // [r8:r15, rax] <- z = a x b0 + mov rdx, [rcx] + mulx r9, r8, [rsi] + xor rax, rax + mulx r10, r11, [rsi+8] + adcx r9, r11 + mulx r11, r12, [rsi+16] + adcx r10, r12 + mulx r12, r13, [rsi+24] + adcx r11, r13 + mulx r13, r14, [rsi+32] + adcx r12, r14 + mulx r14, r15, [rsi+40] + adcx r13, r15 + mulx r15, rbp, [rsi+48] + adcx r14, rbp + mulx rax, rbx, [rsi+56] + adcx r15, rbx + adc rax, 0 + + FPMUL512x512 [rcx], [rsi], r8, r9, r10, r11, r12, r13, r14, r15, rax, rbx, rbp + + mov [rdi], rax + mov [rdi+8], r8 + mov [rdi+16], r9 + mov [rdi+24], r10 + mov [rdi+32], r11 + mov [rdi+40], r12 + mov [rdi+48], r13 + mov [rdi+56], r14 + pop rbp + pop rbx + pop r15 + pop r14 + pop r13 + pop r12 + ret + +.global fp_sqr +fp_sqr: + mov rdx, rsi + jmp fp_mul diff --git a/src/gf/broadwell/lvl5/gf27500.c b/src/gf/broadwell/lvl5/gf27500.c new file mode 100644 index 0000000..be91a01 --- /dev/null +++ b/src/gf/broadwell/lvl5/gf27500.c @@ -0,0 +1,839 @@ +#include "gf27500.h" + +// see gf27500.h +const gf27500 gf27500_ZERO = { 0, 0, 0, 0, 0, 0, 0, 0 }; + +// see gf27500.h +const gf27500 gf27500_ONE = { 0x0000000000000097, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0130000000000000 }; + +// see gf27500.h +const gf27500 gf27500_MINUS_ONE = { 0xFFFFFFFFFFFFFF68, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x007FFFFFFFFFFFFF }; + +// Montgomery representation of 2^256. +static const gf27500 R2 = { 0xED097B425ED0F19A, 0x097B425ED097B425, 0x7B425ED097B425ED, 0x425ED097B425ED09, + 0x5ED097B425ED097B, 0xD097B425ED097B42, 0x97B425ED097B425E, 0x0045ED097B425ED0 }; + +// The modulus itself (this is also a valid representation of zero). +static const gf27500 MODULUS = { 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x01AFFFFFFFFFFFFF }; + +// 1/2^496 (in Montgomery representation). +static const gf27500 INVT496 = { 0x0000000000010000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 }; + +static const gf27500 PM1O3 = { 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, + 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0x011fffffffffffff }; + +// Expand the most significant bit of x into a full-width 64-bit word +// (0x0000000000000000 or 0xFFFFFFFFFFFFFFFF). +static inline uint64_t +sgnw(uint64_t x) +{ + return (uint64_t)(*(int64_t *)&x >> 63); +} + +// d <- u*f + v*g (in the field) +// Coefficients f and g are provided as unsigned integers, but they +// really are signed values which must be less than 2^62 (in absolute value). +static void +gf27500_lin(gf27500 *d, const gf27500 *u, const gf27500 *v, uint64_t f, uint64_t g) +{ + // f <- abs(f), keeping the sign in sf, and negating u accordingly + uint64_t sf = sgnw(f); + f = (f ^ sf) - sf; + gf27500 tu; + gf27500_neg(&tu, u); + gf27500_select(&tu, u, &tu, (uint32_t)sf); + + // g <- abs(g), keeping the sign in sg, and negating v accordingly + uint64_t sg = sgnw(g); + g = (g ^ sg) - sg; + gf27500 tv; + gf27500_neg(&tv, v); + gf27500_select(&tv, v, &tv, (uint32_t)sg); + + // Linear combination over plain integers. + uint64_t d0, d1, d2, d3, d4, d5, d6, d7, t; + inner_gf27500_umul_x2(d0, t, tu.v0, f, tv.v0, g); + inner_gf27500_umul_x2_add(d1, t, tu.v1, f, tv.v1, g, t); + inner_gf27500_umul_x2_add(d2, t, tu.v2, f, tv.v2, g, t); + inner_gf27500_umul_x2_add(d3, t, tu.v3, f, tv.v3, g, t); + inner_gf27500_umul_x2_add(d4, t, tu.v4, f, tv.v4, g, t); + inner_gf27500_umul_x2_add(d5, t, tu.v5, f, tv.v5, g, t); + inner_gf27500_umul_x2_add(d6, t, tu.v6, f, tv.v6, g, t); + inner_gf27500_umul_x2_add(d7, t, tu.v7, f, tv.v7, g, t); + + // Reduction: split into low part (500 bits) and high part + // (75 bits, since t can be up to 63 bits). If the high + // part is h, then: + // h*2^500 = (h mod 27)*2^500 + floor(h/27) mod q + uint64_t h0 = (d7 >> 52) | (t << 12); + uint64_t h1 = t >> 52; + d7 &= 0x000FFFFFFFFFFFFF; + + uint64_t z0, z1, quo0, rem0, quo1, rem1; + inner_gf27500_umul(z0, z1, h0, 0x97B425ED097B425F); + (void)z0; + quo0 = z1 >> 4; + rem0 = h0 - (27 * quo0); + quo1 = (0x12F7 * h1) >> 17; + rem1 = h1 - (27 * quo1); + + // h = rem0 + 27*quo0 + (rem1 + 27*quo1)*2^64 + // = rem0 + rem1 + 27*(quo0 + quo1*2^64 + rem1*((2^64 - 1)/27)) + // We add rem0 and rem1 modulo 27, with an extra carry that + // goes into the folded part (multiple of 27). + uint64_t e, f0, f1; + unsigned char cc; + cc = inner_gf27500_adc(0, rem0 + 0xFFFFFFFFFFFFFFE5, rem1, &e); + cc = inner_gf27500_adc(cc, quo0, rem1 * 0x97B425ED097B425, &f0); + cc = inner_gf27500_adc(cc, quo1, 0, &f1); + assert(cc == 0); + e -= 0xFFFFFFFFFFFFFFE5; + + // Now we only have to add e*2^512 + f0:f1 to the low part. + cc = inner_gf27500_adc(0, d0, f0, &d0); + cc = inner_gf27500_adc(cc, d1, f1, &d1); + cc = inner_gf27500_adc(cc, d2, 0, &d2); + cc = inner_gf27500_adc(cc, d3, 0, &d3); + cc = inner_gf27500_adc(cc, d4, 0, &d4); + cc = inner_gf27500_adc(cc, d5, 0, &d5); + cc = inner_gf27500_adc(cc, d6, 0, &d6); + (void)inner_gf27500_adc(cc, d7, e << 52, &d7); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + d->v6 = d6; + d->v7 = d7; +} + +// d <- abs(floor((a*f + b*g) / 2^31)) +// Coefficients f and g are provided as unsigned integer, but they really +// are signed values, which MUST be at most 2^31 in absolute value. +// The computation is performed over the integers, not modulo q. The low +// 31 bits are dropped (in practice, callers provided appropriate coefficients +// f and g such that a*f + b*g is a multiple of 2^31. +// +// If a*f + b*g is negative, then the absolute value is computed, and the +// function returns 0xFFFFFFFFFFFFFFFF; otherwise, the function returns +// 0x0000000000000000. +static uint64_t +lindiv31abs(gf27500 *d, const gf27500 *a, const gf27500 *b, uint64_t f, uint64_t g) +{ + // f <- abs(f), keeping the sign in sf + uint64_t sf = sgnw(f); + f = (f ^ sf) - sf; + + // g <- abs(g), keeping the sign in sg + uint64_t sg = sgnw(g); + g = (g ^ sg) - sg; + + // Apply the signs of f and g to the source operands. + uint64_t a0, a1, a2, a3, a4, a5, a6, a7, a8; + uint64_t b0, b1, b2, b3, b4, b5, b6, b7, b8; + unsigned char cc; + + cc = inner_gf27500_sbb(0, a->v0 ^ sf, sf, &a0); + cc = inner_gf27500_sbb(cc, a->v1 ^ sf, sf, &a1); + cc = inner_gf27500_sbb(cc, a->v2 ^ sf, sf, &a2); + cc = inner_gf27500_sbb(cc, a->v3 ^ sf, sf, &a3); + cc = inner_gf27500_sbb(cc, a->v4 ^ sf, sf, &a4); + cc = inner_gf27500_sbb(cc, a->v5 ^ sf, sf, &a5); + cc = inner_gf27500_sbb(cc, a->v6 ^ sf, sf, &a6); + cc = inner_gf27500_sbb(cc, a->v7 ^ sf, sf, &a7); + (void)inner_gf27500_sbb(cc, 0, 0, &a8); + + cc = inner_gf27500_sbb(0, b->v0 ^ sg, sg, &b0); + cc = inner_gf27500_sbb(cc, b->v1 ^ sg, sg, &b1); + cc = inner_gf27500_sbb(cc, b->v2 ^ sg, sg, &b2); + cc = inner_gf27500_sbb(cc, b->v3 ^ sg, sg, &b3); + cc = inner_gf27500_sbb(cc, b->v4 ^ sg, sg, &b4); + cc = inner_gf27500_sbb(cc, b->v5 ^ sg, sg, &b5); + cc = inner_gf27500_sbb(cc, b->v6 ^ sg, sg, &b6); + cc = inner_gf27500_sbb(cc, b->v7 ^ sg, sg, &b7); + (void)inner_gf27500_sbb(cc, 0, 0, &b8); + + // Compute a*f + b*g into d0:d1:d2:d3:d4. Since f and g are at + // most 2^31, we can add two 128-bit products with no overflow. + // Note: a4 and b4 are both in {0, -1}. + uint64_t d0, d1, d2, d3, d4, d5, d6, d7, d8, t; + inner_gf27500_umul_x2(d0, t, a0, f, b0, g); + inner_gf27500_umul_x2_add(d1, t, a1, f, b1, g, t); + inner_gf27500_umul_x2_add(d2, t, a2, f, b2, g, t); + inner_gf27500_umul_x2_add(d3, t, a3, f, b3, g, t); + inner_gf27500_umul_x2_add(d4, t, a4, f, b4, g, t); + inner_gf27500_umul_x2_add(d5, t, a5, f, b5, g, t); + inner_gf27500_umul_x2_add(d6, t, a6, f, b6, g, t); + inner_gf27500_umul_x2_add(d7, t, a7, f, b7, g, t); + d8 = t - (a8 & f) - (b8 & g); + + // Right-shift the value by 31 bits. + d0 = (d0 >> 31) | (d1 << 33); + d1 = (d1 >> 31) | (d2 << 33); + d2 = (d2 >> 31) | (d3 << 33); + d3 = (d3 >> 31) | (d4 << 33); + d4 = (d4 >> 31) | (d5 << 33); + d5 = (d5 >> 31) | (d6 << 33); + d6 = (d6 >> 31) | (d7 << 33); + d7 = (d7 >> 31) | (d8 << 33); + + // If the result is negative, negate it. + t = sgnw(d8); + cc = inner_gf27500_sbb(0, d0 ^ t, t, &d0); + cc = inner_gf27500_sbb(cc, d1 ^ t, t, &d1); + cc = inner_gf27500_sbb(cc, d2 ^ t, t, &d2); + cc = inner_gf27500_sbb(cc, d3 ^ t, t, &d3); + cc = inner_gf27500_sbb(cc, d4 ^ t, t, &d4); + cc = inner_gf27500_sbb(cc, d5 ^ t, t, &d5); + cc = inner_gf27500_sbb(cc, d6 ^ t, t, &d6); + (void)inner_gf27500_sbb(cc, d7 ^ t, t, &d7); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + d->v6 = d6; + d->v7 = d7; + return t; +} + +// lzcnt(x) returns the number of leading bits of value 0 in x. It supports +// x == 0 (in which case the function returns 64). +#if defined __LZCNT__ +static inline uint64_t +lzcnt(uint64_t x) +{ + return _lzcnt_u64(x); +} +#else +static inline uint64_t +lzcnt(uint64_t x) +{ + uint64_t m, s; + m = sgnw((x >> 32) - 1); + s = m & 32; + x = (x >> 32) ^ (m & (x ^ (x >> 32))); + m = sgnw((x >> 16) - 1); + s |= m & 16; + x = (x >> 16) ^ (m & (x ^ (x >> 16))); + m = sgnw((x >> 8) - 1); + s |= m & 8; + x = (x >> 8) ^ (m & (x ^ (x >> 8))); + m = sgnw((x >> 4) - 1); + s |= m & 4; + x = (x >> 4) ^ (m & (x ^ (x >> 4))); + m = sgnw((x >> 2) - 1); + s |= m & 2; + x = (x >> 2) ^ (m & (x ^ (x >> 2))); + + // At this point, x fits on 2 bits. Count of extra zeros: + // x = 0 -> 2 + // x = 1 -> 1 + // x = 2 -> 0 + // x = 3 -> 0 + s += (2 - x) & ((x - 3) >> 2); + return s; +} +#endif + +// see gf27500.h +uint32_t +gf27500_div(gf27500 *d, const gf27500 *x, const gf27500 *y) +{ + // Extended binary GCD: + // + // a <- y + // b <- q (modulus) + // u <- x (self) + // v <- 0 + // + // Value a is normalized (in the 0..q-1 range). Values a and b are + // then considered as (signed) integers. Values u and v are field + // elements. + // + // Invariants: + // a*x = y*u mod q + // b*x = y*v mod q + // b is always odd + // + // At each step: + // if a is even, then: + // a <- a/2, u <- u/2 mod q + // else: + // if a < b: + // (a, u, b, v) <- (b, v, a, u) + // a <- (a-b)/2, u <- (u-v)/2 mod q + // + // What we implement below is the optimized version of this + // algorithm, as described in https://eprint.iacr.org/2020/972 + + gf27500 a, b, u, v; + uint64_t xa, xb, f0, g0, f1, g1; + uint32_t r; + + r = ~gf27500_iszero(y); + inner_gf27500_normalize(&a, y); + b = MODULUS; + u = *x; + v = gf27500_ZERO; + + // Generic loop does 31*31 = 961 inner iterations. + for (int i = 0; i < 31; i++) { + // Get approximations of a and b over 64 bits: + // - If len(a) <= 64 and len(b) <= 64, then we just use + // their values (low limbs). + // - Otherwise, with n = max(len(a), len(b)), we use: + // (a mod 2^31) + 2^31*floor(a / 2^(n - 33)) + // (b mod 2^31) + 2^31*floor(b / 2^(n - 33)) + uint64_t m7 = a.v7 | b.v7; + uint64_t m6 = a.v6 | b.v6; + uint64_t m5 = a.v5 | b.v5; + uint64_t m4 = a.v4 | b.v4; + uint64_t m3 = a.v3 | b.v3; + uint64_t m2 = a.v2 | b.v2; + uint64_t m1 = a.v1 | b.v1; + uint64_t tnz7 = sgnw(m7 | -m7); + uint64_t tnz6 = sgnw(m6 | -m6) & ~tnz7; + uint64_t tnz5 = sgnw(m5 | -m5) & ~tnz7 & ~tnz6; + uint64_t tnz4 = sgnw(m4 | -m4) & ~tnz7 & ~tnz6 & ~tnz5; + uint64_t tnz3 = sgnw(m3 | -m3) & ~tnz7 & ~tnz6 & ~tnz5 & ~tnz4; + uint64_t tnz2 = sgnw(m2 | -m2) & ~tnz7 & ~tnz6 & ~tnz5 & ~tnz4 & ~tnz3; + uint64_t tnz1 = sgnw(m1 | -m1) & ~tnz7 & ~tnz6 & ~tnz5 & ~tnz4 & ~tnz3 & ~tnz2; + uint64_t tnzm = (m7 & tnz7) | (m6 & tnz6) | (m5 & tnz5) | (m4 & tnz4) | (m3 & tnz3) | (m2 & tnz2) | (m1 & tnz1); + uint64_t tnza = (a.v7 & tnz7) | (a.v6 & tnz6) | (a.v5 & tnz5) | (a.v4 & tnz4) | (a.v3 & tnz3) | (a.v2 & tnz2) | + (a.v1 & tnz1); + uint64_t tnzb = (b.v7 & tnz7) | (b.v6 & tnz6) | (b.v5 & tnz5) | (b.v4 & tnz4) | (b.v3 & tnz3) | (b.v2 & tnz2) | + (b.v1 & tnz1); + uint64_t snza = (a.v6 & tnz7) | (a.v5 & tnz6) | (a.v4 & tnz5) | (a.v3 & tnz4) | (a.v2 & tnz3) | (a.v1 & tnz2) | + (a.v0 & tnz1); + uint64_t snzb = (b.v6 & tnz7) | (b.v5 & tnz6) | (b.v4 & tnz5) | (b.v3 & tnz4) | (b.v2 & tnz3) | (b.v1 & tnz2) | + (b.v0 & tnz1); + + // If both len(a) <= 64 and len(b) <= 64, then: + // tnzm = 0 + // tnza = 0, snza = 0, tnzb = 0, snzb = 0 + // Otherwise: + // tnzm != 0 + // tnza contains the top non-zero limb of a + // snza contains the limb right below tnza + // tnzb contains the top non-zero limb of a + // snzb contains the limb right below tnzb + // + // We count the number of leading zero bits in tnzm: + // - If s <= 31, then the top 31 bits can be extracted from + // tnza and tnzb alone. + // - If 32 <= s <= 63, then we need some bits from snza and + // snzb as well. + int64_t s = lzcnt(tnzm); + uint64_t sm = (uint64_t)((31 - s) >> 63); + tnza ^= sm & (tnza ^ ((tnza << 32) | (snza >> 32))); + tnzb ^= sm & (tnzb ^ ((tnzb << 32) | (snzb >> 32))); + s -= 32 & sm; + tnza <<= s; + tnzb <<= s; + + // At this point: + // - If len(a) <= 64 and len(b) <= 64, then: + // tnza = 0 + // tnzb = 0 + // tnz1 = tnz2 = tnz3 = tnz4 = tnz5 = 0 + // we want to use the entire low words of a and b + // - Otherwise, we want to use the top 33 bits of tnza and + // tnzb, and the low 31 bits of the low words of a and b. + uint64_t tzx = ~(tnz1 | tnz2 | tnz3 | tnz4 | tnz5 | tnz6 | tnz7); + tnza |= a.v0 & tzx; + tnzb |= b.v0 & tzx; + xa = (a.v0 & 0x7FFFFFFF) | (tnza & 0xFFFFFFFF80000000); + xb = (b.v0 & 0x7FFFFFFF) | (tnzb & 0xFFFFFFFF80000000); + + // Compute the 31 inner iterations on xa and xb. + uint64_t fg0 = (uint64_t)1; + uint64_t fg1 = (uint64_t)1 << 32; + for (int j = 0; j < 31; j++) { + uint64_t a_odd, swap, t0, t1, t2; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf27500_sbb(0, xa, xb, &t0); + (void)inner_gf27500_sbb(cc, 0, 0, &swap); + swap &= a_odd; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + t2 = swap & (fg0 ^ fg1); + fg0 ^= t2; + fg1 ^= t2; + xa -= a_odd & xb; + fg0 -= a_odd & fg1; + xa >>= 1; + fg1 <<= 1; + } + fg0 += 0x7FFFFFFF7FFFFFFF; + fg1 += 0x7FFFFFFF7FFFFFFF; + f0 = (fg0 & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g0 = (fg0 >> 32) - (uint64_t)0x7FFFFFFF; + f1 = (fg1 & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g1 = (fg1 >> 32) - (uint64_t)0x7FFFFFFF; + + // Propagate updates to a, b, u and v. + gf27500 na, nb, nu, nv; + uint64_t nega = lindiv31abs(&na, &a, &b, f0, g0); + uint64_t negb = lindiv31abs(&nb, &a, &b, f1, g1); + f0 = (f0 ^ nega) - nega; + g0 = (g0 ^ nega) - nega; + f1 = (f1 ^ negb) - negb; + g1 = (g1 ^ negb) - negb; + gf27500_lin(&nu, &u, &v, f0, g0); + gf27500_lin(&nv, &u, &v, f1, g1); + a = na; + b = nb; + u = nu; + v = nv; + } + + // If y is invertible, then the final GCD is 1, and + // len(a) + len(b) <= 49, so we can end the computation with + // the low words directly. We only need 47 iterations to reach + // the point where b = 1. + // + // If y is zero, then v is unchanged (hence zero) and none of + // the subsequent iterations will change it either, so we get + // 0 on output, which is what we want. + xa = a.v0; + xb = b.v0; + f0 = 1; + g0 = 0; + f1 = 0; + g1 = 1; + for (int j = 0; j < 47; j++) { + uint64_t a_odd, swap, t0, t1, t2, t3; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf27500_sbb(0, xa, xb, &t0); + (void)inner_gf27500_sbb(cc, 0, 0, &swap); + swap &= a_odd; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + t2 = swap & (f0 ^ f1); + f0 ^= t2; + f1 ^= t2; + t3 = swap & (g0 ^ g1); + g0 ^= t3; + g1 ^= t3; + xa -= a_odd & xb; + f0 -= a_odd & f1; + g0 -= a_odd & g1; + xa >>= 1; + f1 <<= 1; + g1 <<= 1; + } + gf27500_lin(d, &u, &v, f1, g1); + + // At the point: + // - Numerator and denominator were both in Montgomery representation, + // but the two factors R canceled each other. + // - We have injected 31*31+47 = 1008 extra factors of 2, hence we + // must divide the result by 2^1008. + // - However, we also want to obtain the result in Montgomery + // representation, i.e. multiply by 2^512. We thus want to + // divide the current result by 2^(1008 - 512) = 2^496. + // - We do this division by using a Montgomery multiplication with + // the Montgomery representation of 1/2^496, i.e. the integer + // 2^512/2^496 = 2^16. + gf27500_mul(d, d, &INVT496); + return r; +} + +// see gf27500.h +uint32_t +gf27500_invert(gf27500 *d, const gf27500 *a) +{ + return gf27500_div(d, &gf27500_ONE, a); +} + +// see gf27500.h +int32_t +gf27500_legendre(const gf27500 *x) +{ + // Same algorithm as the binary GCD in gf27500_div(), with + // a few differences: + // - We do not keep track of the Bézout coefficients u and v. + // - In each inner iteration we adjust the running symbol value, + // which uses the low 3 bits of the values. + // - Since we need two extra bits of look-ahead, we can only run + // 29 inner iterations, and then need an extra recomputation + // for the last 2. + + gf27500 a, b; + uint64_t xa, xb, f0, g0, f1, g1, ls; + + inner_gf27500_normalize(&a, x); + b = MODULUS; + ls = 0; // running symbol information in bit 1. + + // Outer loop + for (int i = 0; i < 31; i++) { + // Get approximations of a and b over 64 bits. + uint64_t m7 = a.v7 | b.v7; + uint64_t m6 = a.v6 | b.v6; + uint64_t m5 = a.v5 | b.v5; + uint64_t m4 = a.v4 | b.v4; + uint64_t m3 = a.v3 | b.v3; + uint64_t m2 = a.v2 | b.v2; + uint64_t m1 = a.v1 | b.v1; + uint64_t tnz7 = sgnw(m7 | -m7); + uint64_t tnz6 = sgnw(m6 | -m6) & ~tnz7; + uint64_t tnz5 = sgnw(m5 | -m5) & ~tnz7 & ~tnz6; + uint64_t tnz4 = sgnw(m4 | -m4) & ~tnz7 & ~tnz6 & ~tnz5; + uint64_t tnz3 = sgnw(m3 | -m3) & ~tnz7 & ~tnz6 & ~tnz5 & ~tnz4; + uint64_t tnz2 = sgnw(m2 | -m2) & ~tnz7 & ~tnz6 & ~tnz5 & ~tnz4 & ~tnz3; + uint64_t tnz1 = sgnw(m1 | -m1) & ~tnz7 & ~tnz6 & ~tnz5 & ~tnz4 & ~tnz3 & ~tnz2; + uint64_t tnzm = (m7 & tnz7) | (m6 & tnz6) | (m5 & tnz5) | (m4 & tnz4) | (m3 & tnz3) | (m2 & tnz2) | (m1 & tnz1); + uint64_t tnza = (a.v7 & tnz7) | (a.v6 & tnz6) | (a.v5 & tnz5) | (a.v4 & tnz4) | (a.v3 & tnz3) | (a.v2 & tnz2) | + (a.v1 & tnz1); + uint64_t tnzb = (b.v7 & tnz7) | (b.v6 & tnz6) | (b.v5 & tnz5) | (b.v4 & tnz4) | (b.v3 & tnz3) | (b.v2 & tnz2) | + (b.v1 & tnz1); + uint64_t snza = (a.v6 & tnz7) | (a.v5 & tnz6) | (a.v4 & tnz5) | (a.v3 & tnz4) | (a.v2 & tnz3) | (a.v1 & tnz2) | + (a.v0 & tnz1); + uint64_t snzb = (b.v6 & tnz7) | (b.v5 & tnz6) | (b.v4 & tnz5) | (b.v3 & tnz4) | (b.v2 & tnz3) | (b.v1 & tnz2) | + (b.v0 & tnz1); + + int64_t s = lzcnt(tnzm); + uint64_t sm = (uint64_t)((31 - s) >> 63); + tnza ^= sm & (tnza ^ ((tnza << 32) | (snza >> 32))); + tnzb ^= sm & (tnzb ^ ((tnzb << 32) | (snzb >> 32))); + s -= 32 & sm; + tnza <<= s; + tnzb <<= s; + + uint64_t tzx = ~(tnz1 | tnz2 | tnz3 | tnz4 | tnz5 | tnz6 | tnz7); + tnza |= a.v0 & tzx; + tnzb |= b.v0 & tzx; + xa = (a.v0 & 0x7FFFFFFF) | (tnza & 0xFFFFFFFF80000000); + xb = (b.v0 & 0x7FFFFFFF) | (tnzb & 0xFFFFFFFF80000000); + + // First 290 inner iterations. + uint64_t fg0 = (uint64_t)1; + uint64_t fg1 = (uint64_t)1 << 32; + for (int j = 0; j < 29; j++) { + uint64_t a_odd, swap, t0, t1, t2; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf27500_sbb(0, xa, xb, &t0); + (void)inner_gf27500_sbb(cc, 0, 0, &swap); + swap &= a_odd; + ls ^= swap & xa & xb; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + t2 = swap & (fg0 ^ fg1); + fg0 ^= t2; + fg1 ^= t2; + xa -= a_odd & xb; + fg0 -= a_odd & fg1; + xa >>= 1; + fg1 <<= 1; + ls ^= (xb + 2) >> 1; + } + + // Compute the updated a and b (low words only) to get + // enough bits for the next two iterations. + uint64_t fg0z = fg0 + 0x7FFFFFFF7FFFFFFF; + uint64_t fg1z = fg1 + 0x7FFFFFFF7FFFFFFF; + f0 = (fg0z & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g0 = (fg0z >> 32) - (uint64_t)0x7FFFFFFF; + f1 = (fg1z & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g1 = (fg1z >> 32) - (uint64_t)0x7FFFFFFF; + uint64_t a0 = (a.v0 * f0 + b.v0 * g0) >> 29; + uint64_t b0 = (a.v0 * f1 + b.v0 * g1) >> 29; + for (int j = 0; j < 2; j++) { + uint64_t a_odd, swap, t0, t1, t2, t3; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf27500_sbb(0, xa, xb, &t0); + (void)inner_gf27500_sbb(cc, 0, 0, &swap); + swap &= a_odd; + ls ^= swap & a0 & b0; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + t2 = swap & (fg0 ^ fg1); + fg0 ^= t2; + fg1 ^= t2; + t3 = swap & (a0 ^ b0); + a0 ^= t3; + b0 ^= t3; + xa -= a_odd & xb; + fg0 -= a_odd & fg1; + a0 -= a_odd & b0; + xa >>= 1; + fg1 <<= 1; + a0 >>= 1; + ls ^= (b0 + 2) >> 1; + } + + // Propagate updates to a and b. + fg0 += 0x7FFFFFFF7FFFFFFF; + fg1 += 0x7FFFFFFF7FFFFFFF; + f0 = (fg0 & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g0 = (fg0 >> 32) - (uint64_t)0x7FFFFFFF; + f1 = (fg1 & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g1 = (fg1 >> 32) - (uint64_t)0x7FFFFFFF; + gf27500 na, nb; + uint64_t nega = lindiv31abs(&na, &a, &b, f0, g0); + (void)lindiv31abs(&nb, &a, &b, f1, g1); + ls ^= nega & nb.v0; + a = na; + b = nb; + } + + // Final iterations: values are at most 49 bits now. We do not + // need to keep track of update coefficients. Just like the GCD, + // we need only 47 iterations, because after 47 iterations, + // value a is 0 or 1, and b is 1, and no further modification to + // the Legendre symbol may happen. + xa = a.v0; + xb = b.v0; + for (int j = 0; j < 47; j++) { + uint64_t a_odd, swap, t0, t1; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf27500_sbb(0, xa, xb, &t0); + (void)inner_gf27500_sbb(cc, 0, 0, &swap); + swap &= a_odd; + ls ^= swap & xa & xb; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + xa -= a_odd & xb; + xa >>= 1; + ls ^= (xb + 2) >> 1; + } + + // At this point, if the source value was not zero, then the low + // bit of ls contains the QR status (0 = square, 1 = non-square), + // which we need to convert to the expected value (+1 or -1). + // If y == 0, then we return 0, per the API. + uint32_t r = 1 - ((uint32_t)ls & 2); + r &= ~gf27500_iszero(x); + return *(int32_t *)&r; +} + +// see gf27500.h +uint32_t +gf27500_sqrt(gf27500 *d, const gf27500 *a) +{ + // Candidate root is a^((q+1)/4), with (q+1)/4 = 27*2^498 + gf27500 y3, y; + gf27500_square(&y3, a); + gf27500_mul(&y3, &y3, a); // a^3 + gf27500_xsquare(&y, &y3, 3); // a^24 + gf27500_mul(&y, &y, &y3); // a^27 + gf27500_xsquare(&y, &y, 498); // a^27*2^498 + + // Normalize y and negate if necessary, to set the low bit to 0. + // The low bit check must be on the normal representation, + // not the Montgomery representation. + gf27500 yn; + inner_gf27500_montgomery_reduce(&yn, &y); + uint32_t ctl = -((uint32_t)yn.v0 & 1); + gf27500_neg(&yn, &y); + gf27500_select(&y, &y, &yn, ctl); + + // Check whether the candidate is indeed a square root. + gf27500_square(&yn, &y); + uint32_t r = gf27500_equals(&yn, a); + *d = y; + return r; +} + +// Little-endian encoding of a 64-bit integer. +static inline void +enc64le(void *dst, uint64_t x) +{ + uint8_t *buf = dst; + buf[0] = (uint8_t)x; + buf[1] = (uint8_t)(x >> 8); + buf[2] = (uint8_t)(x >> 16); + buf[3] = (uint8_t)(x >> 24); + buf[4] = (uint8_t)(x >> 32); + buf[5] = (uint8_t)(x >> 40); + buf[6] = (uint8_t)(x >> 48); + buf[7] = (uint8_t)(x >> 56); +} + +// Little-endian decoding of a 64-bit integer. +static inline uint64_t +dec64le(const void *src) +{ + const uint8_t *buf = src; + return (uint64_t)buf[0] | ((uint64_t)buf[1] << 8) | ((uint64_t)buf[2] << 16) | ((uint64_t)buf[3] << 24) | + ((uint64_t)buf[4] << 32) | ((uint64_t)buf[5] << 40) | ((uint64_t)buf[6] << 48) | ((uint64_t)buf[7] << 56); +} + +// see gf27500.h +void +gf27500_encode(void *dst, const gf27500 *a) +{ + uint8_t *buf = dst; + gf27500 x; + + inner_gf27500_montgomery_reduce(&x, a); + enc64le(buf, x.v0); + enc64le(buf + 8, x.v1); + enc64le(buf + 16, x.v2); + enc64le(buf + 24, x.v3); + enc64le(buf + 32, x.v4); + enc64le(buf + 40, x.v5); + enc64le(buf + 48, x.v6); + enc64le(buf + 56, x.v7); +} + +// see gf27500.h +uint32_t +gf27500_decode(gf27500 *d, const void *src) +{ + const uint8_t *buf = src; + uint64_t d0, d1, d2, d3, d4, d5, d6, d7, t; + unsigned char cc; + + d0 = dec64le(buf); + d1 = dec64le(buf + 8); + d2 = dec64le(buf + 16); + d3 = dec64le(buf + 24); + d4 = dec64le(buf + 32); + d5 = dec64le(buf + 40); + d6 = dec64le(buf + 48); + d7 = dec64le(buf + 56); + cc = inner_gf27500_sbb(0, d0, MODULUS.v0, &t); + cc = inner_gf27500_sbb(cc, d1, MODULUS.v1, &t); + cc = inner_gf27500_sbb(cc, d2, MODULUS.v2, &t); + cc = inner_gf27500_sbb(cc, d3, MODULUS.v3, &t); + cc = inner_gf27500_sbb(cc, d4, MODULUS.v4, &t); + cc = inner_gf27500_sbb(cc, d5, MODULUS.v5, &t); + cc = inner_gf27500_sbb(cc, d6, MODULUS.v6, &t); + cc = inner_gf27500_sbb(cc, d7, MODULUS.v7, &t); + + (void)inner_gf27500_sbb(cc, 0, 0, &t); + + // If the value was not canonical then t = 0; otherwise, t = -1. + d->v0 = d0 & t; + d->v1 = d1 & t; + d->v2 = d2 & t; + d->v3 = d3 & t; + d->v4 = d4 & t; + d->v5 = d5 & t; + d->v6 = d6 & t; + d->v7 = d7 & t; + + // Convert to Montgomery representation. + gf27500_mul(d, d, &R2); + + return (uint32_t)t; +} + +// see gf27500.h +void +gf27500_decode_reduce(gf27500 *d, const void *src, size_t len) +{ + const uint8_t *buf = src; + + *d = gf27500_ZERO; + if (len == 0) { + return; + } + + if ((len & 63) != 0) { + // Input size is not a multiple of 64, we decode a partial + // block, which is already less than 2^512. + uint8_t tmp[64]; + size_t k; + + k = len & ~(size_t)63; + memcpy(tmp, buf + k, len - k); + memset(tmp + len - k, 0, (sizeof tmp) - (len - k)); + d->v0 = dec64le(&tmp[0]); + d->v1 = dec64le(&tmp[8]); + d->v2 = dec64le(&tmp[16]); + d->v3 = dec64le(&tmp[24]); + d->v4 = dec64le(&tmp[32]); + d->v5 = dec64le(&tmp[40]); + d->v6 = dec64le(&tmp[48]); + d->v7 = dec64le(&tmp[56]); + + len = k; + } else { + // Input size is a multiple of 48, we decode a full block, + // and a reduction is needed. + len -= 64; + uint64_t d0 = dec64le(buf + len); + uint64_t d1 = dec64le(buf + len + 8); + uint64_t d2 = dec64le(buf + len + 16); + uint64_t d3 = dec64le(buf + len + 24); + uint64_t d4 = dec64le(buf + len + 32); + uint64_t d5 = dec64le(buf + len + 40); + uint64_t d6 = dec64le(buf + len + 48); + uint64_t d7 = dec64le(buf + len + 56); + + inner_gf27500_partial_reduce(d, d0, d1, d2, d3, d4, d5, d6, d7); + } + + // Process all remaining blocks, in descending address order. + while (len > 0) { + gf27500_mul(d, d, &R2); + len -= 64; + uint64_t t0 = dec64le(buf + len); + uint64_t t1 = dec64le(buf + len + 8); + uint64_t t2 = dec64le(buf + len + 16); + uint64_t t3 = dec64le(buf + len + 24); + uint64_t t4 = dec64le(buf + len + 32); + uint64_t t5 = dec64le(buf + len + 40); + uint64_t t6 = dec64le(buf + len + 48); + uint64_t t7 = dec64le(buf + len + 56); + + gf27500 t; + inner_gf27500_partial_reduce(&t, t0, t1, t2, t3, t4, t5, t6, t7); + gf27500_add(d, d, &t); + } + + // Final conversion to Montgomery representation. + gf27500_mul(d, d, &R2); +} + +void +gf27500_div3(gf27500 *d, const gf27500 *a) +{ + const digit_t MAGIC = 0xAAAAAAAAAAAAAAAB; // 3^-1 mod 2^64 + uint64_t c0, c1, f0, f1; + gf27500 t; + + inner_gf27500_umul(f0, f1, a->arr[7], MAGIC); + t.arr[7] = f1 >> 1; + c1 = a->arr[7] - 3 * t.arr[7]; + + for (int32_t i = 6; i >= 0; i--) { + c0 = c1; + inner_gf27500_umul(f0, f1, a->arr[i], MAGIC); + t.arr[i] = f1 >> 1; + c1 = c0 + a->arr[i] - 3 * t.arr[i]; + t.arr[i] += c0 * ((MAGIC - 1) >> 1); + f0 = ((c1 >> 1) & c1); /* c1 == 3 */ + f1 = ((c1 >> 2) & !(c1 & 0x11)); /* c1 == 4 */ + f0 |= f1; + t.arr[i] += f0; + c1 = c1 - 3 * f0; + } + *d = t; + gf27500_sub(&t, d, &PM1O3); + gf27500_select(d, d, &t, -((c1 & 1) | (c1 >> 1))); // c1 >= 1 + gf27500_sub(&t, d, &PM1O3); + gf27500_select(d, d, &t, -(c1 == 2)); +} \ No newline at end of file diff --git a/src/gf/broadwell/lvl5/include/fp.h b/src/gf/broadwell/lvl5/include/fp.h new file mode 100644 index 0000000..02a45a3 --- /dev/null +++ b/src/gf/broadwell/lvl5/include/fp.h @@ -0,0 +1,141 @@ +#ifndef FP_H +#define FP_H + +// Include statements +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gf27500.h" + +// Type for elements of GF(p) +// Type for elements of GF(p) +#define fp_t gf27500 + +// Constants (Assumed to be in Montgomery form) +// Constants (Assumed to be in Montgomery form) +#define ZERO gf27500_ZERO +#define ONE gf27500_ONE + +// Operations in fp +static inline void +fp_neg(fp_t *d, const fp_t *a) +{ + gf27500_neg(d, a); +} + +void fp_add(fp_t *out, const fp_t *a, const fp_t *b); // implemented in fp_asm.S +void fp_sub(fp_t *out, const fp_t *a, const fp_t *b); // implemented in fp_asm.S +void fp_sqr(fp_t *out, const fp_t *a); // implemented in fp_asm.S +void fp_mul(fp_t *out, const fp_t *a, const fp_t *b); // implemented in fp_asm.S + +static inline void +fp_mul_small(fp_t *d, const fp_t *a, uint32_t n) +{ + gf27500_mul_small(d, a, n); +} + +static inline void +fp_half(fp_t *d, const fp_t *a) +{ + gf27500_half(d, a); +} +// #define fp_half gf27500_half + +static inline void +fp_div3(fp_t *d, const fp_t *a) +{ + gf27500_div3(d, a); +} +// #define fp_div3 gf27500_div3 + +// Constant time selection and swapping +static inline void +fp_select(fp_t *d, const fp_t *a0, const fp_t *a1, uint32_t ctl) +{ + gf27500_select(d, a0, a1, ctl); +} +// #define fp_select gf27500_select + +static inline void +fp_cswap(fp_t *a, fp_t *b, uint32_t ctl) +{ + gf27500_cswap(a, b, ctl); +} +// #define fp_cswap gf27500_cswap + +// Comparisons for fp elements +static inline uint32_t +fp_is_zero(const fp_t *a) +{ + return gf27500_iszero(a); +} +// #define fp_is_zero gf27500_iszero + +static inline uint32_t +fp_is_equal(const fp_t *a, const fp_t *b) +{ + return gf27500_equals(a, b); +} +// #define fp_is_equal gf27500_equals + +// Set a uint32 to an Fp value +static inline void +fp_set_small(fp_t *d, uint32_t x) +{ + gf27500_set_small(d, x); +} +// #define fp_set_small gf27500_set_small + +// Encoding and decoding of bytes +static inline void +fp_encode(void *dst, const fp_t *a) +{ + gf27500_encode(dst, a); +} +// #define fp_encode gf27500_encode +static inline uint32_t +fp_decode(fp_t *d, const void *src) +{ + return gf27500_decode(d, src); +} +// #define fp_decode gf27500_decode +static inline void +fp_decode_reduce(fp_t *d, const void *src, size_t len) +{ + gf27500_decode_reduce(d, src, len); +} +// #define fp_decode_reduce gf27500_decode_reduce +// These functions are essentially useless because we can just +// use = for the shallow copies we need, but they're here for +// now until we do a larger refactoring +static inline void +fp_copy(fp_t *out, const fp_t *a) +{ + memcpy(out, a, sizeof(fp_t)); +} + +static inline void +fp_set_zero(fp_t *a) +{ + memcpy(a, &ZERO, sizeof(fp_t)); +} + +static inline void +fp_set_one(fp_t *a) +{ + memcpy(a, &ONE, sizeof(fp_t)); +} + +// Functions defined in low level code but with different API +void fp_inv(fp_t *a); +void fp_sqrt(fp_t *a); +void fp_exp3div4(fp_t *a); +uint32_t fp_is_square(const fp_t *a); + +#endif diff --git a/src/gf/broadwell/lvl5/include/fp2.h b/src/gf/broadwell/lvl5/include/fp2.h new file mode 100644 index 0000000..736e83e --- /dev/null +++ b/src/gf/broadwell/lvl5/include/fp2.h @@ -0,0 +1,49 @@ +#ifndef FP2_H +#define FP2_H + +#define NO_FP2X_MUL +#define NO_FP2X_SQR + +#include + +extern void fp2_sq_c0(fp2_t *out, const fp2_t *in); +extern void fp2_sq_c1(fp_t *out, const fp2_t *in); + +extern void fp2_mul_c0(fp_t *out, const fp2_t *in0, const fp2_t *in1); +extern void fp2_mul_c1(fp_t *out, const fp2_t *in0, const fp2_t *in1); + +static inline void +fp2_mul(fp2_t *x, const fp2_t *y, const fp2_t *z) +{ + fp_t t; + + fp2_mul_c0(&t, y, z); // c0 = a0*b0 - a1*b1 + fp2_mul_c1(&x->im, y, z); // c1 = a0*b1 + a1*b0 + x->re.arr[0] = t.arr[0]; + x->re.arr[1] = t.arr[1]; + x->re.arr[2] = t.arr[2]; + x->re.arr[3] = t.arr[3]; + x->re.arr[4] = t.arr[4]; + x->re.arr[5] = t.arr[5]; + x->re.arr[6] = t.arr[6]; + x->re.arr[7] = t.arr[7]; +} + +static inline void +fp2_sqr(fp2_t *x, const fp2_t *y) +{ + fp2_t t; + + fp2_sq_c0(&t, y); // c0 = (a0+a1)(a0-a1) + fp2_sq_c1(&x->im, y); // c1 = 2a0*a1 + x->re.arr[0] = t.re.arr[0]; + x->re.arr[1] = t.re.arr[1]; + x->re.arr[2] = t.re.arr[2]; + x->re.arr[3] = t.re.arr[3]; + x->re.arr[4] = t.re.arr[4]; + x->re.arr[5] = t.re.arr[5]; + x->re.arr[6] = t.re.arr[6]; + x->re.arr[7] = t.re.arr[7]; +} + +#endif \ No newline at end of file diff --git a/src/gf/broadwell/lvl5/include/gf27500.h b/src/gf/broadwell/lvl5/include/gf27500.h new file mode 100644 index 0000000..fe5151b --- /dev/null +++ b/src/gf/broadwell/lvl5/include/gf27500.h @@ -0,0 +1,1409 @@ +#ifndef gf27500_h__ +#define gf27500_h__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include +#include +#include +#include +#include +#include + + typedef uint64_t digit_t; // Datatype for representing field elements + + /* + * A gf27500 instance represents an integer modulo q. + * This is a structure; it can be copied with a simple assignment, and + * passed around as a value (though exchanging pointers is possibly more + * efficient). + * The contents are opaque. No calling code should make any assumption + * about the contents. + */ + typedef union + { + // Contents are opaque. + // Implementation note: this encodes the value in Montgomery + // representation, with R = 2^512. Only partial reduction is + // done internally to ensure the value is below 2^505 + struct + { + uint64_t v0; + uint64_t v1; + uint64_t v2; + uint64_t v3; + uint64_t v4; + uint64_t v5; + uint64_t v6; + uint64_t v7; + }; + digit_t arr[8]; + } gf27500; + + /* + * Constant zero (in the field). + */ + extern const gf27500 gf27500_ZERO; + + /* + * Constant one (in the field). + */ + extern const gf27500 gf27500_ONE; + + /* + * Constant -1 (in the field). + */ + extern const gf27500 gf27500_MINUS_ONE; + + /* + * API RULES: + * ========== + * + * Elementary operations on field elements are implemented by functions + * which take as parameter pointers to the operands. The first parameter + * is the pointer to the destination. Thus: + * gf27500 a = ...; + * gf27500 b = ...; + * gf27500 d; + * gf27500_sub(&d, &a, &b) + * sets field element d to a - b (implicitly modulo q). + * + * Operands may be used several times: it is always valid to use as + * output a gf27500 structure which is also used as input. + * + * Boolean values are represented by 32-bit integer (uint32_t) which have + * value exactly 0xFFFFFFFF (for "true") or 0x00000000 (for "false"). This + * convention minimizes the risk that a "smart" compiler breaks the + * constant-time property of the code through unfortunated optimizations. + * When a function expects such a Boolean, the caller MUST take care never + * to provide any value other than 0x00000000 or 0xFFFFFFFF. + * + * Values are encoded into exactly 64 bytes: value x modulo q is mapped to + * its unique integer representant in the [0..q-1] range, which is then + * encoded over 64 bytes with little-endian convention. Encoding is canonical + * and checked: when decoding (with gf27500_decode()), the input value is + * verified to be in the [0..q-1] range; for an out-of-range value, + * gf27500_decode() fills the output structure with zero, and returns + * 0x00000000. + * + * For most operations, the implementation is an inline function, defined + * below; the compiler can thus efficiently include it in the calling code. + * A few expensive operations (e.g. divisions) use non-inline functions, + * declared below but defined in gf27500.c + * + * All functions and macro whose name starts with "inner_gf27500_" are + * internal to this implementation and visible here only in order to + * support the API inline functions; they MUST NOT be used directly. + */ + +#if (defined _MSC_VER && defined _M_X64) || (defined __x86_64__ && (defined __GNUC__ || defined __clang__)) +#include +#define inner_gf27500_adc(cc, a, b, d) _addcarry_u64(cc, a, b, (unsigned long long *)(void *)d) +#define inner_gf27500_sbb(cc, a, b, d) _subborrow_u64(cc, a, b, (unsigned long long *)(void *)d) +#else +static inline unsigned char +inner_gf27500_adc(unsigned char cc, uint64_t a, uint64_t b, uint64_t *d) +{ + unsigned __int128 t = (unsigned __int128)a + (unsigned __int128)b + cc; + *d = (uint64_t)t; + return (unsigned char)(t >> 64); +} +static inline unsigned char +inner_gf27500_sbb(unsigned char cc, uint64_t a, uint64_t b, uint64_t *d) +{ + unsigned __int128 t = (unsigned __int128)a - (unsigned __int128)b - cc; + *d = (uint64_t)t; + return (unsigned char)(-(uint64_t)(t >> 64)); +} +#endif + +#if defined _MSC_VER +#define inner_gf27500_umul(lo, hi, x, y) \ + do { \ + uint64_t umul_hi; \ + (lo) = _umul128((x), (y), &umul_hi); \ + (hi) = umul_hi; \ + } while (0) +#define inner_gf27500_umul_add(lo, hi, x, y, z) \ + do { \ + uint64_t umul_lo, umul_hi; \ + umul_lo = _umul128((x), (y), &umul_hi); \ + unsigned char umul_cc; \ + umul_cc = inner_gf27500_adc(0, umul_lo, (z), &umul_lo); \ + (void)inner_gf27500_adc(umul_cc, umul_hi, 0, &umul_hi); \ + (lo) = umul_lo; \ + (hi) = umul_hi; \ + } while (0) +#define inner_gf27500_umul_x2(lo, hi, x1, y1, x2, y2) \ + do { \ + uint64_t umul_lo, umul_hi; \ + umul_lo = _umul128((x1), (y1), &umul_hi); \ + uint64_t umul_lo2, umul_hi2; \ + umul_lo2 = _umul128((x2), (y2), &umul_hi2); \ + unsigned char umul_cc; \ + umul_cc = inner_gf27500_adc(0, umul_lo, umul_lo2, &umul_lo); \ + (void)inner_gf27500_adc(umul_cc, umul_hi, umul_hi2, &umul_hi); \ + (lo) = umul_lo; \ + (hi) = umul_hi; \ + } while (0) +#define inner_gf27500_umul_x2_add(lo, hi, x1, y1, x2, y2, z) \ + do { \ + uint64_t umul_lo, umul_hi; \ + umul_lo = _umul128((x1), (y1), &umul_hi); \ + uint64_t umul_lo2, umul_hi2; \ + umul_lo2 = _umul128((x2), (y2), &umul_hi2); \ + unsigned char umul_cc; \ + umul_cc = inner_gf27500_adc(0, umul_lo, umul_lo2, &umul_lo); \ + (void)inner_gf27500_adc(umul_cc, umul_hi, umul_hi2, &umul_hi); \ + umul_cc = inner_gf27500_adc(0, umul_lo, (z), &umul_lo); \ + (void)inner_gf27500_adc(umul_cc, umul_hi, 0, &umul_hi); \ + (lo) = umul_lo; \ + (hi) = umul_hi; \ + } while (0) +#else +#define inner_gf27500_umul(lo, hi, x, y) \ + do { \ + unsigned __int128 umul_tmp; \ + umul_tmp = (unsigned __int128)(x) * (unsigned __int128)(y); \ + (lo) = (uint64_t)umul_tmp; \ + (hi) = (uint64_t)(umul_tmp >> 64); \ + } while (0) +#define inner_gf27500_umul_add(lo, hi, x, y, z) \ + do { \ + unsigned __int128 umul_tmp; \ + umul_tmp = (unsigned __int128)(x) * (unsigned __int128)(y) + (unsigned __int128)(uint64_t)(z); \ + (lo) = (uint64_t)umul_tmp; \ + (hi) = (uint64_t)(umul_tmp >> 64); \ + } while (0) +#define inner_gf27500_umul_x2(lo, hi, x1, y1, x2, y2) \ + do { \ + unsigned __int128 umul_tmp; \ + umul_tmp = \ + (unsigned __int128)(x1) * (unsigned __int128)(y1) + (unsigned __int128)(x2) * (unsigned __int128)(y2); \ + (lo) = (uint64_t)umul_tmp; \ + (hi) = (uint64_t)(umul_tmp >> 64); \ + } while (0) +#define inner_gf27500_umul_x2_add(lo, hi, x1, y1, x2, y2, z) \ + do { \ + unsigned __int128 umul_tmp; \ + umul_tmp = (unsigned __int128)(x1) * (unsigned __int128)(y1) + \ + (unsigned __int128)(x2) * (unsigned __int128)(y2) + (unsigned __int128)(uint64_t)(z); \ + (lo) = (uint64_t)umul_tmp; \ + (hi) = (uint64_t)(umul_tmp >> 64); \ + } while (0) +#endif + + /* + * d <- a + b + */ + static inline void + gf27500_add(gf27500 *d, const gf27500 *a, const gf27500 *b) + { + uint64_t d0, d1, d2, d3, d4, d5, d6, d7, f; + unsigned char cc; + + // Raw addition. + cc = inner_gf27500_adc(0, a->v0, b->v0, &d0); + cc = inner_gf27500_adc(cc, a->v1, b->v1, &d1); + cc = inner_gf27500_adc(cc, a->v2, b->v2, &d2); + cc = inner_gf27500_adc(cc, a->v3, b->v3, &d3); + cc = inner_gf27500_adc(cc, a->v4, b->v4, &d4); + cc = inner_gf27500_adc(cc, a->v5, b->v5, &d5); + cc = inner_gf27500_adc(cc, a->v6, b->v6, &d6); + (void)inner_gf27500_adc(cc, a->v7, b->v7, &d7); + + // Sum is up to 2^506 - 2. Subtract q if the value is not lower + // than 2^505 (we subtract q by adding -q). + // Note: 0xE5 = (-27) % 256, 52 = 500 - 7*64 + f = d7 >> 57; + cc = inner_gf27500_adc(0, d0, f, &d0); + cc = inner_gf27500_adc(cc, d1, 0, &d1); + cc = inner_gf27500_adc(cc, d2, 0, &d2); + cc = inner_gf27500_adc(cc, d3, 0, &d3); + cc = inner_gf27500_adc(cc, d4, 0, &d4); + cc = inner_gf27500_adc(cc, d5, 0, &d5); + cc = inner_gf27500_adc(cc, d6, 0, &d6); + (void)inner_gf27500_adc(cc, d7, ((uint64_t)0xFE5 << 52) & -f, &d7); + + // One subtraction of q might not be enough. + f = d7 >> 57; + cc = inner_gf27500_adc(0, d0, f, &d0); + cc = inner_gf27500_adc(cc, d1, 0, &d1); + cc = inner_gf27500_adc(cc, d2, 0, &d2); + cc = inner_gf27500_adc(cc, d3, 0, &d3); + cc = inner_gf27500_adc(cc, d4, 0, &d4); + cc = inner_gf27500_adc(cc, d5, 0, &d5); + cc = inner_gf27500_adc(cc, d6, 0, &d6); + (void)inner_gf27500_adc(cc, d7, ((uint64_t)0xFE5 << 52) & -f, &d7); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + d->v6 = d6; + d->v7 = d7; + } + + /* + * d <- a - b + */ + static inline void + gf27500_sub(gf27500 *d, const gf27500 *a, const gf27500 *b) + { + uint64_t d0, d1, d2, d3, d4, d5, d6, d7, m, f; + unsigned char cc; + + // Raw subtraction. + cc = inner_gf27500_sbb(0, a->v0, b->v0, &d0); + cc = inner_gf27500_sbb(cc, a->v1, b->v1, &d1); + cc = inner_gf27500_sbb(cc, a->v2, b->v2, &d2); + cc = inner_gf27500_sbb(cc, a->v3, b->v3, &d3); + cc = inner_gf27500_sbb(cc, a->v4, b->v4, &d4); + cc = inner_gf27500_sbb(cc, a->v5, b->v5, &d5); + cc = inner_gf27500_sbb(cc, a->v6, b->v6, &d6); + cc = inner_gf27500_sbb(cc, a->v7, b->v7, &d7); + + // Add 2*q if the result is negative. + // Note: 0xCA = (-2*27) % 256, 52 = 500 - 7*64 + (void)inner_gf27500_sbb(cc, 0, 0, &m); + cc = inner_gf27500_sbb(0, d0, m & 2, &d0); + cc = inner_gf27500_sbb(cc, d1, 0, &d1); + cc = inner_gf27500_sbb(cc, d2, 0, &d2); + cc = inner_gf27500_sbb(cc, d3, 0, &d3); + cc = inner_gf27500_sbb(cc, d4, 0, &d4); + cc = inner_gf27500_sbb(cc, d5, 0, &d5); + cc = inner_gf27500_sbb(cc, d6, 0, &d6); + (void)inner_gf27500_sbb(cc, d7, ((uint64_t)0xFCA << 52) & m, &d7); + + // We might have overdone it; subtract q if necessary. + // Note: 0xE5 = (-27) % 256, 52 = 500 - 7*64 + f = d7 >> 57; + cc = inner_gf27500_adc(0, d0, f, &d0); + cc = inner_gf27500_adc(cc, d1, 0, &d1); + cc = inner_gf27500_adc(cc, d2, 0, &d2); + cc = inner_gf27500_adc(cc, d3, 0, &d3); + cc = inner_gf27500_adc(cc, d4, 0, &d4); + cc = inner_gf27500_adc(cc, d5, 0, &d5); + cc = inner_gf27500_adc(cc, d6, 0, &d6); + (void)inner_gf27500_adc(cc, d7, ((uint64_t)0xFE5 << 52) & -f, &d7); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + d->v6 = d6; + d->v7 = d7; + } + + /* + * d <- -a + */ + static inline void + gf27500_neg(gf27500 *d, const gf27500 *a) + { + uint64_t d0, d1, d2, d3, d4, d5, d6, d7, f; + unsigned char cc; + + // 2*q - a + cc = inner_gf27500_sbb(0, (uint64_t)0xFFFFFFFFFFFFFFFE, a->v0, &d0); + cc = inner_gf27500_sbb(cc, (uint64_t)0xFFFFFFFFFFFFFFFF, a->v1, &d1); + cc = inner_gf27500_sbb(cc, (uint64_t)0xFFFFFFFFFFFFFFFF, a->v2, &d2); + cc = inner_gf27500_sbb(cc, (uint64_t)0xFFFFFFFFFFFFFFFF, a->v3, &d3); + cc = inner_gf27500_sbb(cc, (uint64_t)0xFFFFFFFFFFFFFFFF, a->v4, &d4); + cc = inner_gf27500_sbb(cc, (uint64_t)0xFFFFFFFFFFFFFFFF, a->v5, &d5); + cc = inner_gf27500_sbb(cc, (uint64_t)0xFFFFFFFFFFFFFFFF, a->v6, &d6); + (void)inner_gf27500_sbb(cc, (uint64_t)0x035FFFFFFFFFFFFF, a->v7, &d7); + + // Subtract q if the value is not lower than 2^505. + f = d7 >> 57; + cc = inner_gf27500_adc(0, d0, f, &d0); + cc = inner_gf27500_adc(cc, d1, 0, &d1); + cc = inner_gf27500_adc(cc, d2, 0, &d2); + cc = inner_gf27500_adc(cc, d3, 0, &d3); + cc = inner_gf27500_adc(cc, d4, 0, &d4); + cc = inner_gf27500_adc(cc, d5, 0, &d5); + cc = inner_gf27500_adc(cc, d6, 0, &d6); + (void)inner_gf27500_adc(cc, d7, ((uint64_t)0xFE5 << 52) & -f, &d7); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + d->v6 = d6; + d->v7 = d7; + } + + /* + * If ctl == 0x00000000, then *a0 is copied into *d. + * If ctl == 0xFFFFFFFF, then *a1 is copied into *d. + * ctl MUST be either 0x00000000 or 0xFFFFFFFF. + */ + static inline void + gf27500_select(gf27500 *d, const gf27500 *a0, const gf27500 *a1, uint32_t ctl) + { + uint64_t cw = (uint64_t)*(int32_t *)&ctl; + d->v0 = a0->v0 ^ (cw & (a0->v0 ^ a1->v0)); + d->v1 = a0->v1 ^ (cw & (a0->v1 ^ a1->v1)); + d->v2 = a0->v2 ^ (cw & (a0->v2 ^ a1->v2)); + d->v3 = a0->v3 ^ (cw & (a0->v3 ^ a1->v3)); + d->v4 = a0->v4 ^ (cw & (a0->v4 ^ a1->v4)); + d->v5 = a0->v5 ^ (cw & (a0->v5 ^ a1->v5)); + d->v6 = a0->v6 ^ (cw & (a0->v6 ^ a1->v6)); + d->v7 = a0->v7 ^ (cw & (a0->v7 ^ a1->v7)); + } + + /* + * If ctl == 0x00000000, then *a and *b are unchanged. + * If ctl == 0xFFFFFFFF, then the contents of *a and *b are swapped. + * ctl MUST be either 0x00000000 or 0xFFFFFFFF. + */ + static inline void + gf27500_cswap(gf27500 *a, gf27500 *b, uint32_t ctl) + { + uint64_t cw = (uint64_t)*(int32_t *)&ctl; + uint64_t t; + t = cw & (a->v0 ^ b->v0); + a->v0 ^= t; + b->v0 ^= t; + t = cw & (a->v1 ^ b->v1); + a->v1 ^= t; + b->v1 ^= t; + t = cw & (a->v2 ^ b->v2); + a->v2 ^= t; + b->v2 ^= t; + t = cw & (a->v3 ^ b->v3); + a->v3 ^= t; + b->v3 ^= t; + t = cw & (a->v4 ^ b->v4); + a->v4 ^= t; + b->v4 ^= t; + t = cw & (a->v5 ^ b->v5); + a->v5 ^= t; + b->v5 ^= t; + t = cw & (a->v6 ^ b->v6); + a->v6 ^= t; + b->v6 ^= t; + t = cw & (a->v7 ^ b->v7); + a->v7 ^= t; + b->v7 ^= t; + } + + /* + * d <- a/2 + */ + static inline void + gf27500_half(gf27500 *d, const gf27500 *a) + { + uint64_t d0, d1, d2, d3, d4, d5, d6, d7; + + d0 = (a->v0 >> 1) | (a->v1 << 63); + d1 = (a->v1 >> 1) | (a->v2 << 63); + d2 = (a->v2 >> 1) | (a->v3 << 63); + d3 = (a->v3 >> 1) | (a->v4 << 63); + d4 = (a->v4 >> 1) | (a->v5 << 63); + d5 = (a->v5 >> 1) | (a->v6 << 63); + d6 = (a->v6 >> 1) | (a->v7 << 63); + d7 = a->v7 >> 1; + d7 += ((uint64_t)27 << 51) & -(a->v0 & 1); + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + d->v6 = d6; + d->v7 = d7; + } + + // Inner function: 512-bit to 505-bit reduction + static inline void + inner_gf27500_partial_reduce(gf27500 *d, + uint64_t a0, + uint64_t a1, + uint64_t a2, + uint64_t a3, + uint64_t a4, + uint64_t a5, + uint64_t a6, + uint64_t a7) + { + uint64_t d0, d1, d2, d3, d4, d5, d6, d7, h, quo, rem; + unsigned char cc; + + // Split value in high (12 bits) and low (500 bits) parts. + h = a7 >> 52; + a7 &= 0x000FFFFFFFFFFFFF; + + // 27*2^500 = 1 mod q; hence, we add floor(h/27) + (h mod 27)*2^500 + // to the low part. + quo = (0x12F7 * h) >> 17; + rem = h - (27 * quo); + + cc = inner_gf27500_adc(0, a0, quo, &d0); + cc = inner_gf27500_adc(cc, a1, 0, &d1); + cc = inner_gf27500_adc(cc, a2, 0, &d2); + cc = inner_gf27500_adc(cc, a3, 0, &d3); + cc = inner_gf27500_adc(cc, a4, 0, &d4); + cc = inner_gf27500_adc(cc, a5, 0, &d5); + cc = inner_gf27500_adc(cc, a6, 0, &d6); + (void)inner_gf27500_adc(cc, a7, rem << 52, &d7); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + d->v6 = d6; + d->v7 = d7; + } + + // Inner function: Normalize value *a into *d. + static inline void + inner_gf27500_normalize(gf27500 *d, const gf27500 *a) + { + uint64_t d0, d1, d2, d3, d4, d5, d6, d7, m; + unsigned char cc; + + // Subtract q. + cc = inner_gf27500_sbb(0, a->v0, 0xFFFFFFFFFFFFFFFF, &d0); + cc = inner_gf27500_sbb(cc, a->v1, 0xFFFFFFFFFFFFFFFF, &d1); + cc = inner_gf27500_sbb(cc, a->v2, 0xFFFFFFFFFFFFFFFF, &d2); + cc = inner_gf27500_sbb(cc, a->v3, 0xFFFFFFFFFFFFFFFF, &d3); + cc = inner_gf27500_sbb(cc, a->v4, 0xFFFFFFFFFFFFFFFF, &d4); + cc = inner_gf27500_sbb(cc, a->v5, 0xFFFFFFFFFFFFFFFF, &d5); + cc = inner_gf27500_sbb(cc, a->v6, 0xFFFFFFFFFFFFFFFF, &d6); + cc = inner_gf27500_sbb(cc, a->v7, 0x01AFFFFFFFFFFFFF, &d7); + + // Add back q if the result is negative. + (void)inner_gf27500_sbb(cc, 0, 0, &m); + cc = inner_gf27500_adc(0, d0, m, &d0); + cc = inner_gf27500_adc(cc, d1, m, &d1); + cc = inner_gf27500_adc(cc, d2, m, &d2); + cc = inner_gf27500_adc(cc, d3, m, &d3); + cc = inner_gf27500_adc(cc, d4, m, &d4); + cc = inner_gf27500_adc(cc, d5, m, &d5); + cc = inner_gf27500_adc(cc, d6, m, &d6); + (void)inner_gf27500_adc(cc, d7, m & 0x01AFFFFFFFFFFFFF, &d7); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + d->v6 = d6; + d->v7 = d7; + } + + /* + * d <- 2*a + */ + static inline void + gf27500_mul2(gf27500 *d, const gf27500 *a) + { + gf27500_add(d, a, a); + } + + /* + * d <- a*x + * (multiplication by a 32-bit integer) + */ + static inline void + gf27500_mul_small(gf27500 *d, const gf27500 *a, uint32_t x) + { + uint64_t d0, d1, d2, d3, d4, d5, d6, d7, d8; + uint64_t lo, hi, b, h, quo, rem; + unsigned char cc; + + // Product over the integers. Top output word (d6) is at most 31 bits. + b = (uint64_t)x; + inner_gf27500_umul(d0, d1, a->v0, b); + inner_gf27500_umul(d2, d3, a->v2, b); + inner_gf27500_umul(d4, d5, a->v4, b); + inner_gf27500_umul(d6, d7, a->v6, b); + + inner_gf27500_umul(lo, hi, a->v1, b); + cc = inner_gf27500_adc(0, d1, lo, &d1); + cc = inner_gf27500_adc(cc, d2, hi, &d2); + inner_gf27500_umul(lo, hi, a->v3, b); + cc = inner_gf27500_adc(cc, d3, lo, &d3); + cc = inner_gf27500_adc(cc, d4, hi, &d4); + inner_gf27500_umul(lo, hi, a->v5, b); + cc = inner_gf27500_adc(cc, d5, lo, &d5); + cc = inner_gf27500_adc(cc, d6, hi, &d6); + inner_gf27500_umul(lo, d8, a->v7, b); + cc = inner_gf27500_adc(cc, d7, lo, &d7); + (void)inner_gf27500_adc(cc, d8, 0, &d8); + + // Extract low 500-bit part, and the high part (at most 35 bits). + h = (d8 << 12) | (d7 >> 52); + d7 &= 0x000FFFFFFFFFFFFF; + + // Fold h by adding floor(h/65) + (h mod 65)*2^376 to the low part. + inner_gf27500_umul(lo, hi, h, 0x97B425ED097B425F); + quo = hi >> 4; + rem = h - (27 * quo); + + cc = inner_gf27500_adc(cc, d0, quo, &d0); + cc = inner_gf27500_adc(cc, d1, 0, &d1); + cc = inner_gf27500_adc(cc, d2, 0, &d2); + cc = inner_gf27500_adc(cc, d3, 0, &d3); + cc = inner_gf27500_adc(cc, d4, 0, &d4); + cc = inner_gf27500_adc(cc, d5, 0, &d5); + cc = inner_gf27500_adc(cc, d6, 0, &d6); + (void)inner_gf27500_adc(cc, d7, rem << 52, &d7); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + d->v6 = d6; + d->v7 = d7; + } + + /* + * d <- x + * Input value x (32-bit integer) is converted to field element x mod q. + */ + static inline void + gf27500_set_small(gf27500 *d, uint32_t x) + { + // We want Montgomery representation, i.e. x*2^512 mod q. + // We set h = x*2^12; then: + // x*2^512 = h*2^500 + // = (h mod 27)*2^500 + floor(h/27)*27*2^500 + // = (h mod 27)*2^500 + floor(h/27) mod q + // by using the fact that 27*2^500 = 1 mod q. + uint64_t h, lo, hi, quo, rem; + h = (uint64_t)x << 12; + inner_gf27500_umul(lo, hi, h, 0x97B425ED097B425F); + (void)lo; + quo = hi >> 4; + rem = h - (27 * quo); + + d->v0 = quo; + d->v1 = 0; + d->v2 = 0; + d->v3 = 0; + d->v4 = 0; + d->v5 = 0; + d->v6 = 0; + d->v7 = rem << 52; + } + + // Inner function: d <- a/2^512, with normalization to [0..q-1]. + static inline void + inner_gf27500_montgomery_reduce(gf27500 *d, const gf27500 *a) + { + uint64_t x0, x1, x2, x3, x4, x5, x6, x7; + uint64_t f0, f1, f2, f3, f4, f5, f6, f7; + uint64_t g0, g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12, g13, g14, g15; + uint64_t d0, d1, d2, d3, d4, d5, d6, d7; + uint64_t hi, t, w; + unsigned char cc; + + // Let m = -1/q mod 2^512 = 27*2^500 + 1 + // For input x, we compute f = x*m mod 2^512, then + // h = x + f*q, which is a multiple of 2^512. The output + // is then h/2^512. + // Since x < 2^512, we have: + // h <= 2^512 - 1 + (2^512 - 1)*q + // h <= q*2^512 + 2^512 - q - 1 + // Since h = 0 mod 2^512, this implies that h <= q*2^512. + // The output h/2^512 is therefore between 0 and q (inclusive). + + x0 = a->v0; + x1 = a->v1; + x2 = a->v2; + x3 = a->v3; + x4 = a->v4; + x5 = a->v5; + x6 = a->v6; + x7 = a->v7; + + // f = x*(-1/q) mod 2^500 + f0 = x0; + f1 = x1; + f2 = x2; + f3 = x3; + f4 = x4; + f5 = x5; + f6 = x6; + f7 = x7 + ((x0 * 27) << 52); + + // g = f*q + inner_gf27500_umul(g7, hi, f0, (uint64_t)27 << 52); + inner_gf27500_umul_add(g8, hi, f1, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g9, hi, f2, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g10, hi, f3, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g11, hi, f4, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g12, hi, f5, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g13, hi, f6, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g14, g15, f7, (uint64_t)27 << 52, hi); + + cc = inner_gf27500_sbb(0, 0, f0, &g0); + cc = inner_gf27500_sbb(cc, 0, f1, &g1); + cc = inner_gf27500_sbb(cc, 0, f2, &g2); + cc = inner_gf27500_sbb(cc, 0, f3, &g3); + cc = inner_gf27500_sbb(cc, 0, f4, &g4); + cc = inner_gf27500_sbb(cc, 0, f5, &g5); + cc = inner_gf27500_sbb(cc, 0, f6, &g6); + cc = inner_gf27500_sbb(cc, g7, f7, &g7); + cc = inner_gf27500_sbb(cc, g8, 0, &g8); + cc = inner_gf27500_sbb(cc, g9, 0, &g9); + cc = inner_gf27500_sbb(cc, g10, 0, &g10); + cc = inner_gf27500_sbb(cc, g11, 0, &g11); + cc = inner_gf27500_sbb(cc, g12, 0, &g12); + cc = inner_gf27500_sbb(cc, g13, 0, &g13); + cc = inner_gf27500_sbb(cc, g14, 0, &g14); + (void)inner_gf27500_sbb(cc, g15, 0, &g15); + + // h = x + f*q (we drop the low 512 bits). + cc = inner_gf27500_adc(0, g0, x0, &x0); + cc = inner_gf27500_adc(cc, g1, x1, &x1); + cc = inner_gf27500_adc(cc, g2, x2, &x2); + cc = inner_gf27500_adc(cc, g3, x3, &x3); + cc = inner_gf27500_adc(cc, g4, x4, &x4); + cc = inner_gf27500_adc(cc, g5, x5, &x5); + cc = inner_gf27500_adc(cc, g6, x6, &x6); + cc = inner_gf27500_adc(cc, g7, x7, &x7); + cc = inner_gf27500_adc(cc, g8, 0, &d0); + cc = inner_gf27500_adc(cc, g9, 0, &d1); + cc = inner_gf27500_adc(cc, g10, 0, &d2); + cc = inner_gf27500_adc(cc, g11, 0, &d3); + cc = inner_gf27500_adc(cc, g12, 0, &d4); + cc = inner_gf27500_adc(cc, g13, 0, &d5); + cc = inner_gf27500_adc(cc, g14, 0, &d6); + (void)inner_gf27500_adc(cc, g15, 0, &d7); + + // Normalize: if h = q, replace it with zero. + t = d0 & d1 & d2 & d3 & d4 & d5 & d6 & (d7 ^ ~(uint64_t)0x01AFFFFFFFFFFFFF); + cc = inner_gf27500_adc(0, t, 1, &t); + (void)inner_gf27500_sbb(cc, 0, 0, &w); + w = ~w; + d->v0 = d0 & w; + d->v1 = d1 & w; + d->v2 = d2 & w; + d->v3 = d3 & w; + d->v4 = d4 & w; + d->v5 = d5 & w; + d->v6 = d6 & w; + d->v7 = d7 & w; + } + + /* + * d <- a*b + */ + static inline void + gf27500_mul(gf27500 *d, const gf27500 *a, const gf27500 *b) + { + uint64_t e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15; + uint64_t f0, f1, f2, f3, f4, f5, f6, f7; + uint64_t lo, hi, lo2, hi2; + uint64_t g0, g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12, g13, g14, g15; + unsigned char cc; + + // Multiplication over integers. + // 8 mul + inner_gf27500_umul(e0, e1, a->v0, b->v0); + inner_gf27500_umul(e2, e3, a->v1, b->v1); + inner_gf27500_umul(e4, e5, a->v2, b->v2); + inner_gf27500_umul(e6, e7, a->v3, b->v3); + inner_gf27500_umul(e8, e9, a->v4, b->v4); + inner_gf27500_umul(e10, e11, a->v5, b->v5); + inner_gf27500_umul(e12, e13, a->v6, b->v6); + inner_gf27500_umul(e14, e15, a->v7, b->v7); + + // + 7 mul = 15 + inner_gf27500_umul(lo, hi, a->v0, b->v1); + cc = inner_gf27500_adc(0, e1, lo, &e1); + cc = inner_gf27500_adc(cc, e2, hi, &e2); + inner_gf27500_umul(lo, hi, a->v0, b->v3); + cc = inner_gf27500_adc(cc, e3, lo, &e3); + cc = inner_gf27500_adc(cc, e4, hi, &e4); + inner_gf27500_umul(lo, hi, a->v0, b->v5); + cc = inner_gf27500_adc(cc, e5, lo, &e5); + cc = inner_gf27500_adc(cc, e6, hi, &e6); + inner_gf27500_umul(lo, hi, a->v0, b->v7); + cc = inner_gf27500_adc(cc, e7, lo, &e7); + cc = inner_gf27500_adc(cc, e8, hi, &e8); + inner_gf27500_umul(lo, hi, a->v2, b->v7); + cc = inner_gf27500_adc(cc, e9, lo, &e9); + cc = inner_gf27500_adc(cc, e10, hi, &e10); + inner_gf27500_umul(lo, hi, a->v4, b->v7); + cc = inner_gf27500_adc(cc, e11, lo, &e11); + cc = inner_gf27500_adc(cc, e12, hi, &e12); + inner_gf27500_umul(lo, hi, a->v6, b->v7); + cc = inner_gf27500_adc(cc, e13, lo, &e13); + cc = inner_gf27500_adc(cc, e14, hi, &e14); + cc = inner_gf27500_adc(cc, e15, 0, &e15); + assert(cc == 0); + + // + 7 mul = 22 + inner_gf27500_umul(lo, hi, a->v1, b->v0); + cc = inner_gf27500_adc(0, e1, lo, &e1); + cc = inner_gf27500_adc(cc, e2, hi, &e2); + inner_gf27500_umul(lo, hi, a->v3, b->v0); + cc = inner_gf27500_adc(cc, e3, lo, &e3); + cc = inner_gf27500_adc(cc, e4, hi, &e4); + inner_gf27500_umul(lo, hi, a->v5, b->v0); + cc = inner_gf27500_adc(cc, e5, lo, &e5); + cc = inner_gf27500_adc(cc, e6, hi, &e6); + inner_gf27500_umul(lo, hi, a->v7, b->v0); + cc = inner_gf27500_adc(cc, e7, lo, &e7); + cc = inner_gf27500_adc(cc, e8, hi, &e8); + inner_gf27500_umul(lo, hi, a->v7, b->v2); + cc = inner_gf27500_adc(cc, e9, lo, &e9); + cc = inner_gf27500_adc(cc, e10, hi, &e10); + inner_gf27500_umul(lo, hi, a->v7, b->v4); + cc = inner_gf27500_adc(cc, e11, lo, &e11); + cc = inner_gf27500_adc(cc, e12, hi, &e12); + inner_gf27500_umul(lo, hi, a->v7, b->v6); + cc = inner_gf27500_adc(cc, e13, lo, &e13); + cc = inner_gf27500_adc(cc, e14, hi, &e14); + cc = inner_gf27500_adc(cc, e15, 0, &e15); + assert(cc == 0); + + // + 6 mul = 28 + inner_gf27500_umul(lo, hi, a->v0, b->v2); + cc = inner_gf27500_adc(0, e2, lo, &e2); + cc = inner_gf27500_adc(cc, e3, hi, &e3); + inner_gf27500_umul(lo, hi, a->v0, b->v4); + cc = inner_gf27500_adc(cc, e4, lo, &e4); + cc = inner_gf27500_adc(cc, e5, hi, &e5); + inner_gf27500_umul(lo, hi, a->v0, b->v6); + cc = inner_gf27500_adc(cc, e6, lo, &e6); + cc = inner_gf27500_adc(cc, e7, hi, &e7); + inner_gf27500_umul(lo, hi, a->v1, b->v7); + cc = inner_gf27500_adc(cc, e8, lo, &e8); + cc = inner_gf27500_adc(cc, e9, hi, &e9); + inner_gf27500_umul(lo, hi, a->v3, b->v7); + cc = inner_gf27500_adc(cc, e10, lo, &e10); + cc = inner_gf27500_adc(cc, e11, hi, &e11); + inner_gf27500_umul(lo, hi, a->v5, b->v7); + cc = inner_gf27500_adc(cc, e12, lo, &e12); + cc = inner_gf27500_adc(cc, e13, hi, &e13); + cc = inner_gf27500_adc(cc, e14, 0, &e14); + cc = inner_gf27500_adc(cc, e15, 0, &e15); + assert(cc == 0); + + // + 6 mul = 34 + inner_gf27500_umul(lo, hi, a->v2, b->v0); + cc = inner_gf27500_adc(0, e2, lo, &e2); + cc = inner_gf27500_adc(cc, e3, hi, &e3); + inner_gf27500_umul(lo, hi, a->v4, b->v0); + cc = inner_gf27500_adc(cc, e4, lo, &e4); + cc = inner_gf27500_adc(cc, e5, hi, &e5); + inner_gf27500_umul(lo, hi, a->v6, b->v0); + cc = inner_gf27500_adc(cc, e6, lo, &e6); + cc = inner_gf27500_adc(cc, e7, hi, &e7); + inner_gf27500_umul(lo, hi, a->v7, b->v1); + cc = inner_gf27500_adc(cc, e8, lo, &e8); + cc = inner_gf27500_adc(cc, e9, hi, &e9); + inner_gf27500_umul(lo, hi, a->v7, b->v3); + cc = inner_gf27500_adc(cc, e10, lo, &e10); + cc = inner_gf27500_adc(cc, e11, hi, &e11); + inner_gf27500_umul(lo, hi, a->v7, b->v5); + cc = inner_gf27500_adc(cc, e12, lo, &e12); + cc = inner_gf27500_adc(cc, e13, hi, &e13); + cc = inner_gf27500_adc(cc, e14, 0, &e14); + cc = inner_gf27500_adc(cc, e15, 0, &e15); + assert(cc == 0); + + // + 5 mul = 39 + inner_gf27500_umul(lo, hi, a->v1, b->v2); + cc = inner_gf27500_adc(cc, e3, lo, &e3); + cc = inner_gf27500_adc(cc, e4, hi, &e4); + inner_gf27500_umul(lo, hi, a->v1, b->v4); + cc = inner_gf27500_adc(cc, e5, lo, &e5); + cc = inner_gf27500_adc(cc, e6, hi, &e6); + inner_gf27500_umul(lo, hi, a->v1, b->v6); + cc = inner_gf27500_adc(cc, e7, lo, &e7); + cc = inner_gf27500_adc(cc, e8, hi, &e8); + inner_gf27500_umul(lo, hi, a->v3, b->v6); + cc = inner_gf27500_adc(cc, e9, lo, &e9); + cc = inner_gf27500_adc(cc, e10, hi, &e10); + inner_gf27500_umul(lo, hi, a->v5, b->v6); + cc = inner_gf27500_adc(cc, e11, lo, &e11); + cc = inner_gf27500_adc(cc, e12, hi, &e12); + cc = inner_gf27500_adc(cc, e13, 0, &e13); + cc = inner_gf27500_adc(cc, e14, 0, &e14); + cc = inner_gf27500_adc(cc, e15, 0, &e15); + assert(cc == 0); + + // + 5 mul = 44 + inner_gf27500_umul(lo, hi, a->v2, b->v1); + cc = inner_gf27500_adc(cc, e3, lo, &e3); + cc = inner_gf27500_adc(cc, e4, hi, &e4); + inner_gf27500_umul(lo, hi, a->v4, b->v1); + cc = inner_gf27500_adc(cc, e5, lo, &e5); + cc = inner_gf27500_adc(cc, e6, hi, &e6); + inner_gf27500_umul(lo, hi, a->v6, b->v1); + cc = inner_gf27500_adc(cc, e7, lo, &e7); + cc = inner_gf27500_adc(cc, e8, hi, &e8); + inner_gf27500_umul(lo, hi, a->v6, b->v3); + cc = inner_gf27500_adc(cc, e9, lo, &e9); + cc = inner_gf27500_adc(cc, e10, hi, &e10); + inner_gf27500_umul(lo, hi, a->v6, b->v5); + cc = inner_gf27500_adc(cc, e11, lo, &e11); + cc = inner_gf27500_adc(cc, e12, hi, &e12); + cc = inner_gf27500_adc(cc, e13, 0, &e13); + cc = inner_gf27500_adc(cc, e14, 0, &e14); + cc = inner_gf27500_adc(cc, e15, 0, &e15); + assert(cc == 0); + + // + 4 mul = 48 + inner_gf27500_umul(lo, hi, a->v1, b->v3); + cc = inner_gf27500_adc(cc, e4, lo, &e4); + cc = inner_gf27500_adc(cc, e5, hi, &e5); + inner_gf27500_umul(lo, hi, a->v1, b->v5); + cc = inner_gf27500_adc(cc, e6, lo, &e6); + cc = inner_gf27500_adc(cc, e7, hi, &e7); + inner_gf27500_umul(lo, hi, a->v3, b->v5); + cc = inner_gf27500_adc(cc, e8, lo, &e8); + cc = inner_gf27500_adc(cc, e9, hi, &e9); + inner_gf27500_umul(lo, hi, a->v4, b->v6); + cc = inner_gf27500_adc(cc, e10, lo, &e10); + cc = inner_gf27500_adc(cc, e11, hi, &e11); + cc = inner_gf27500_adc(cc, e12, 0, &e12); + cc = inner_gf27500_adc(cc, e13, 0, &e13); + cc = inner_gf27500_adc(cc, e14, 0, &e14); + cc = inner_gf27500_adc(cc, e15, 0, &e15); + assert(cc == 0); + + // + 4 mul = 52 + inner_gf27500_umul(lo, hi, a->v3, b->v1); + cc = inner_gf27500_adc(cc, e4, lo, &e4); + cc = inner_gf27500_adc(cc, e5, hi, &e5); + inner_gf27500_umul(lo, hi, a->v5, b->v1); + cc = inner_gf27500_adc(cc, e6, lo, &e6); + cc = inner_gf27500_adc(cc, e7, hi, &e7); + inner_gf27500_umul(lo, hi, a->v5, b->v3); + cc = inner_gf27500_adc(cc, e8, lo, &e8); + cc = inner_gf27500_adc(cc, e9, hi, &e9); + inner_gf27500_umul(lo, hi, a->v6, b->v4); + cc = inner_gf27500_adc(cc, e10, lo, &e10); + cc = inner_gf27500_adc(cc, e11, hi, &e11); + cc = inner_gf27500_adc(cc, e12, 0, &e12); + cc = inner_gf27500_adc(cc, e13, 0, &e13); + cc = inner_gf27500_adc(cc, e14, 0, &e14); + cc = inner_gf27500_adc(cc, e15, 0, &e15); + assert(cc == 0); + + // + 3 mul = 55 + inner_gf27500_umul(lo, hi, a->v2, b->v3); + cc = inner_gf27500_adc(cc, e5, lo, &e5); + cc = inner_gf27500_adc(cc, e6, hi, &e6); + inner_gf27500_umul(lo, hi, a->v2, b->v5); + cc = inner_gf27500_adc(cc, e7, lo, &e7); + cc = inner_gf27500_adc(cc, e8, hi, &e8); + inner_gf27500_umul(lo, hi, a->v4, b->v5); + cc = inner_gf27500_adc(cc, e9, lo, &e9); + cc = inner_gf27500_adc(cc, e10, hi, &e10); + cc = inner_gf27500_adc(cc, e11, 0, &e11); + cc = inner_gf27500_adc(cc, e12, 0, &e12); + cc = inner_gf27500_adc(cc, e13, 0, &e13); + cc = inner_gf27500_adc(cc, e14, 0, &e14); + cc = inner_gf27500_adc(cc, e15, 0, &e15); + assert(cc == 0); + + // + 3 mul = 58 + inner_gf27500_umul(lo, hi, a->v3, b->v2); + cc = inner_gf27500_adc(cc, e5, lo, &e5); + cc = inner_gf27500_adc(cc, e6, hi, &e6); + inner_gf27500_umul(lo, hi, a->v5, b->v2); + cc = inner_gf27500_adc(cc, e7, lo, &e7); + cc = inner_gf27500_adc(cc, e8, hi, &e8); + inner_gf27500_umul(lo, hi, a->v5, b->v4); + cc = inner_gf27500_adc(cc, e9, lo, &e9); + cc = inner_gf27500_adc(cc, e10, hi, &e10); + cc = inner_gf27500_adc(cc, e11, 0, &e11); + cc = inner_gf27500_adc(cc, e12, 0, &e12); + cc = inner_gf27500_adc(cc, e13, 0, &e13); + cc = inner_gf27500_adc(cc, e14, 0, &e14); + cc = inner_gf27500_adc(cc, e15, 0, &e15); + assert(cc == 0); + + // + 2 mul = 60 + inner_gf27500_umul(lo, hi, a->v2, b->v4); + cc = inner_gf27500_adc(cc, e6, lo, &e6); + cc = inner_gf27500_adc(cc, e7, hi, &e7); + inner_gf27500_umul(lo, hi, a->v2, b->v6); + cc = inner_gf27500_adc(cc, e8, lo, &e8); + cc = inner_gf27500_adc(cc, e9, hi, &e9); + cc = inner_gf27500_adc(cc, e10, 0, &e10); + cc = inner_gf27500_adc(cc, e11, 0, &e11); + cc = inner_gf27500_adc(cc, e12, 0, &e12); + cc = inner_gf27500_adc(cc, e13, 0, &e13); + cc = inner_gf27500_adc(cc, e14, 0, &e14); + cc = inner_gf27500_adc(cc, e15, 0, &e15); + assert(cc == 0); + + // + 2 mul = 62 + inner_gf27500_umul(lo, hi, a->v4, b->v2); + cc = inner_gf27500_adc(cc, e6, lo, &e6); + cc = inner_gf27500_adc(cc, e7, hi, &e7); + inner_gf27500_umul(lo, hi, a->v6, b->v2); + cc = inner_gf27500_adc(cc, e8, lo, &e8); + cc = inner_gf27500_adc(cc, e9, hi, &e9); + cc = inner_gf27500_adc(cc, e10, 0, &e10); + cc = inner_gf27500_adc(cc, e11, 0, &e11); + cc = inner_gf27500_adc(cc, e12, 0, &e12); + cc = inner_gf27500_adc(cc, e13, 0, &e13); + cc = inner_gf27500_adc(cc, e14, 0, &e14); + cc = inner_gf27500_adc(cc, e15, 0, &e15); + assert(cc == 0); + + // + 2 mul = 64 + inner_gf27500_umul(lo, hi, a->v3, b->v4); + inner_gf27500_umul(lo2, hi2, a->v4, b->v3); + cc = inner_gf27500_adc(0, lo, lo2, &lo); + cc = inner_gf27500_adc(cc, hi, hi2, &hi); + cc = inner_gf27500_adc(cc, 0, 0, &hi2); + assert(cc == 0); + cc = inner_gf27500_adc(0, e7, lo, &e7); + cc = inner_gf27500_adc(cc, e8, hi, &e8); + cc = inner_gf27500_adc(cc, e9, hi2, &e9); + cc = inner_gf27500_adc(cc, e10, 0, &e10); + cc = inner_gf27500_adc(cc, e11, 0, &e11); + cc = inner_gf27500_adc(cc, e12, 0, &e12); + cc = inner_gf27500_adc(cc, e13, 0, &e13); + cc = inner_gf27500_adc(cc, e14, 0, &e14); + cc = inner_gf27500_adc(cc, e15, 0, &e15); + assert(cc == 0); + + // Montgomery reduction. + // + // Low part is lo(e) = e0..e7 (512 bits). + // Let m = -1/q mod 2^512; we add (lo(e)*m mod 2^512)*q to the + // high part g = e8..e15 (498 bits). + // + // We have m = 27*2^500 + 1. + f0 = e0; + f1 = e1; + f2 = e2; + f3 = e3; + f4 = e4; + f5 = e5; + f6 = e6; + f7 = e7 + ((e0 * 27) << 52); + + // g = f*q + inner_gf27500_umul(g7, hi, f0, (uint64_t)27 << 52); + inner_gf27500_umul_add(g8, hi, f1, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g9, hi, f2, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g10, hi, f3, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g11, hi, f4, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g12, hi, f5, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g13, hi, f6, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g14, g15, f7, (uint64_t)27 << 52, hi); + + cc = inner_gf27500_sbb(0, 0, f0, &g0); + cc = inner_gf27500_sbb(cc, 0, f1, &g1); + cc = inner_gf27500_sbb(cc, 0, f2, &g2); + cc = inner_gf27500_sbb(cc, 0, f3, &g3); + cc = inner_gf27500_sbb(cc, 0, f4, &g4); + cc = inner_gf27500_sbb(cc, 0, f5, &g5); + cc = inner_gf27500_sbb(cc, 0, f6, &g6); + cc = inner_gf27500_sbb(cc, g7, f7, &g7); + cc = inner_gf27500_sbb(cc, g8, 0, &g8); + cc = inner_gf27500_sbb(cc, g9, 0, &g9); + cc = inner_gf27500_sbb(cc, g10, 0, &g10); + cc = inner_gf27500_sbb(cc, g11, 0, &g11); + cc = inner_gf27500_sbb(cc, g12, 0, &g12); + cc = inner_gf27500_sbb(cc, g13, 0, &g13); + cc = inner_gf27500_sbb(cc, g14, 0, &g14); + (void)inner_gf27500_sbb(cc, g15, 0, &g15); + + // Add g = f*q to e0..e11. + // Since e0..e15 < 2^1010 and f < 2^512, we know that the result + // is less than 2^1010 + 2^512*27*2^500, which is less than 2^1017. + // This is also a multiple of 2^512. We divide by 2^512 by simply + // dropping the low 512 bits (which are all equal to zero), and + // the result is less than 2**505 + cc = inner_gf27500_adc(0, g0, e0, &e0); + cc = inner_gf27500_adc(cc, g1, e1, &e1); + cc = inner_gf27500_adc(cc, g2, e2, &e2); + cc = inner_gf27500_adc(cc, g3, e3, &e3); + cc = inner_gf27500_adc(cc, g4, e4, &e4); + cc = inner_gf27500_adc(cc, g5, e5, &e5); + cc = inner_gf27500_adc(cc, g6, e6, &e6); + cc = inner_gf27500_adc(cc, g7, e7, &e7); + cc = inner_gf27500_adc(cc, g8, e8, &e8); + cc = inner_gf27500_adc(cc, g9, e9, &e9); + cc = inner_gf27500_adc(cc, g10, e10, &e10); + cc = inner_gf27500_adc(cc, g11, e11, &e11); + cc = inner_gf27500_adc(cc, g12, e12, &e12); + cc = inner_gf27500_adc(cc, g13, e13, &e13); + cc = inner_gf27500_adc(cc, g14, e14, &e14); + cc = inner_gf27500_adc(cc, g15, e15, &e15); + assert(cc == 0); + + d->v0 = e8; + d->v1 = e9; + d->v2 = e10; + d->v3 = e11; + d->v4 = e12; + d->v5 = e13; + d->v6 = e14; + d->v7 = e15; + } + + /* + * d <- a^2 + */ + static inline void + gf27500_square(gf27500 *d, const gf27500 *a) + { + uint64_t e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15; + uint64_t f0, f1, f2, f3, f4, f5, f6, f7; + uint64_t lo, hi; + uint64_t g0, g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12, g13, g14, g15; + unsigned char cc; + + // Squaring over integers. + // 7 mul + inner_gf27500_umul(e1, e2, a->v0, a->v1); + inner_gf27500_umul(e3, e4, a->v0, a->v3); + inner_gf27500_umul(e5, e6, a->v0, a->v5); + inner_gf27500_umul(e7, e8, a->v0, a->v7); + inner_gf27500_umul(e9, e10, a->v2, a->v7); + inner_gf27500_umul(e11, e12, a->v4, a->v7); + inner_gf27500_umul(e13, e14, a->v6, a->v7); + + // + 6 = 13 mul + inner_gf27500_umul(lo, hi, a->v0, a->v2); + cc = inner_gf27500_adc(0, e2, lo, &e2); + cc = inner_gf27500_adc(cc, e3, hi, &e3); + inner_gf27500_umul(lo, hi, a->v0, a->v4); + cc = inner_gf27500_adc(cc, e4, lo, &e4); + cc = inner_gf27500_adc(cc, e5, hi, &e5); + inner_gf27500_umul(lo, hi, a->v0, a->v6); + cc = inner_gf27500_adc(cc, e6, lo, &e6); + cc = inner_gf27500_adc(cc, e7, hi, &e7); + inner_gf27500_umul(lo, hi, a->v1, a->v7); + cc = inner_gf27500_adc(cc, e8, lo, &e8); + cc = inner_gf27500_adc(cc, e9, hi, &e9); + inner_gf27500_umul(lo, hi, a->v3, a->v7); + cc = inner_gf27500_adc(cc, e10, lo, &e10); + cc = inner_gf27500_adc(cc, e11, hi, &e11); + inner_gf27500_umul(lo, hi, a->v5, a->v7); + cc = inner_gf27500_adc(cc, e12, lo, &e12); + cc = inner_gf27500_adc(cc, e13, hi, &e13); + (void)inner_gf27500_adc(cc, e14, 0, &e14); + + // + 5 = 18 mul + inner_gf27500_umul(lo, hi, a->v1, a->v2); + cc = inner_gf27500_adc(0, e3, lo, &e3); + cc = inner_gf27500_adc(cc, e4, hi, &e4); + inner_gf27500_umul(lo, hi, a->v1, a->v4); + cc = inner_gf27500_adc(cc, e5, lo, &e5); + cc = inner_gf27500_adc(cc, e6, hi, &e6); + inner_gf27500_umul(lo, hi, a->v1, a->v6); + cc = inner_gf27500_adc(cc, e7, lo, &e7); + cc = inner_gf27500_adc(cc, e8, hi, &e8); + inner_gf27500_umul(lo, hi, a->v3, a->v6); + cc = inner_gf27500_adc(cc, e9, lo, &e9); + cc = inner_gf27500_adc(cc, e10, hi, &e10); + inner_gf27500_umul(lo, hi, a->v5, a->v6); + cc = inner_gf27500_adc(cc, e11, lo, &e11); + cc = inner_gf27500_adc(cc, e12, hi, &e12); + (void)inner_gf27500_adc(cc, e13, 0, &e13); + + // + 4 = 22 mul + inner_gf27500_umul(lo, hi, a->v1, a->v3); + cc = inner_gf27500_adc(0, e4, lo, &e4); + cc = inner_gf27500_adc(cc, e5, hi, &e5); + inner_gf27500_umul(lo, hi, a->v1, a->v5); + cc = inner_gf27500_adc(cc, e6, lo, &e6); + cc = inner_gf27500_adc(cc, e7, hi, &e7); + inner_gf27500_umul(lo, hi, a->v2, a->v6); + cc = inner_gf27500_adc(cc, e8, lo, &e8); + cc = inner_gf27500_adc(cc, e9, hi, &e9); + inner_gf27500_umul(lo, hi, a->v4, a->v6); + cc = inner_gf27500_adc(cc, e10, lo, &e10); + cc = inner_gf27500_adc(cc, e11, hi, &e11); + (void)inner_gf27500_adc(cc, e12, 0, &e12); + + // + 3 = 25 mul + inner_gf27500_umul(lo, hi, a->v2, a->v3); + cc = inner_gf27500_adc(0, e5, lo, &e5); + cc = inner_gf27500_adc(cc, e6, hi, &e6); + inner_gf27500_umul(lo, hi, a->v2, a->v5); + cc = inner_gf27500_adc(cc, e7, lo, &e7); + cc = inner_gf27500_adc(cc, e8, hi, &e8); + inner_gf27500_umul(lo, hi, a->v4, a->v5); + cc = inner_gf27500_adc(cc, e9, lo, &e9); + cc = inner_gf27500_adc(cc, e10, hi, &e10); + (void)inner_gf27500_adc(cc, e11, 0, &e11); + + // + 2 = 27 mul + inner_gf27500_umul(lo, hi, a->v2, a->v4); + cc = inner_gf27500_adc(0, e6, lo, &e6); + cc = inner_gf27500_adc(cc, e7, hi, &e7); + inner_gf27500_umul(lo, hi, a->v3, a->v5); + cc = inner_gf27500_adc(cc, e8, lo, &e8); + cc = inner_gf27500_adc(cc, e9, hi, &e9); + (void)inner_gf27500_adc(cc, e10, 0, &e10); + + // + 1 = 28 mul + inner_gf27500_umul(lo, hi, a->v3, a->v4); + cc = inner_gf27500_adc(0, e7, lo, &e7); + cc = inner_gf27500_adc(cc, e8, hi, &e8); + (void)inner_gf27500_adc(cc, e9, 0, &e9); + + // Multiplication by two for all off diagonal + // terms + e15 = e14 >> 63; + e14 = (e14 << 1) | (e13 >> 63); + e13 = (e13 << 1) | (e12 >> 63); + e12 = (e12 << 1) | (e11 >> 63); + e11 = (e11 << 1) | (e10 >> 63); + e10 = (e10 << 1) | (e9 >> 63); + e9 = (e9 << 1) | (e8 >> 63); + e8 = (e8 << 1) | (e7 >> 63); + e7 = (e7 << 1) | (e6 >> 63); + e6 = (e6 << 1) | (e5 >> 63); + e5 = (e5 << 1) | (e4 >> 63); + e4 = (e4 << 1) | (e3 >> 63); + e3 = (e3 << 1) | (e2 >> 63); + e2 = (e2 << 1) | (e1 >> 63); + e1 = e1 << 1; + + // + 8 = 36 mul (diagonal terms) + inner_gf27500_umul(e0, hi, a->v0, a->v0); + cc = inner_gf27500_adc(0, e1, hi, &e1); + inner_gf27500_umul(lo, hi, a->v1, a->v1); + cc = inner_gf27500_adc(cc, e2, lo, &e2); + cc = inner_gf27500_adc(cc, e3, hi, &e3); + inner_gf27500_umul(lo, hi, a->v2, a->v2); + cc = inner_gf27500_adc(cc, e4, lo, &e4); + cc = inner_gf27500_adc(cc, e5, hi, &e5); + inner_gf27500_umul(lo, hi, a->v3, a->v3); + cc = inner_gf27500_adc(cc, e6, lo, &e6); + cc = inner_gf27500_adc(cc, e7, hi, &e7); + inner_gf27500_umul(lo, hi, a->v4, a->v4); + cc = inner_gf27500_adc(cc, e8, lo, &e8); + cc = inner_gf27500_adc(cc, e9, hi, &e9); + inner_gf27500_umul(lo, hi, a->v5, a->v5); + cc = inner_gf27500_adc(cc, e10, lo, &e10); + cc = inner_gf27500_adc(cc, e11, hi, &e11); + inner_gf27500_umul(lo, hi, a->v6, a->v6); + cc = inner_gf27500_adc(cc, e12, lo, &e12); + cc = inner_gf27500_adc(cc, e13, hi, &e13); + inner_gf27500_umul(lo, hi, a->v7, a->v7); + cc = inner_gf27500_adc(cc, e14, lo, &e14); + (void)inner_gf27500_adc(cc, e15, hi, &e15); + + // Montgomery reduction. + // + // Low part is lo(e) = e0..e7 (512 bits). + // Let m = -1/q mod 2^512; we add (lo(e)*m mod 2^512)*q to the + // high part g = e8..e15 (498 bits). + // + // We have m = 27*2^500 + 1. + f0 = e0; + f1 = e1; + f2 = e2; + f3 = e3; + f4 = e4; + f5 = e5; + f6 = e6; + f7 = e7 + ((e0 * 27) << 52); + + // g = f*q + inner_gf27500_umul(g7, hi, f0, (uint64_t)27 << 52); + inner_gf27500_umul_add(g8, hi, f1, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g9, hi, f2, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g10, hi, f3, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g11, hi, f4, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g12, hi, f5, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g13, hi, f6, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g14, g15, f7, (uint64_t)27 << 52, hi); + + cc = inner_gf27500_sbb(0, 0, f0, &g0); + cc = inner_gf27500_sbb(cc, 0, f1, &g1); + cc = inner_gf27500_sbb(cc, 0, f2, &g2); + cc = inner_gf27500_sbb(cc, 0, f3, &g3); + cc = inner_gf27500_sbb(cc, 0, f4, &g4); + cc = inner_gf27500_sbb(cc, 0, f5, &g5); + cc = inner_gf27500_sbb(cc, 0, f6, &g6); + cc = inner_gf27500_sbb(cc, g7, f7, &g7); + cc = inner_gf27500_sbb(cc, g8, 0, &g8); + cc = inner_gf27500_sbb(cc, g9, 0, &g9); + cc = inner_gf27500_sbb(cc, g10, 0, &g10); + cc = inner_gf27500_sbb(cc, g11, 0, &g11); + cc = inner_gf27500_sbb(cc, g12, 0, &g12); + cc = inner_gf27500_sbb(cc, g13, 0, &g13); + cc = inner_gf27500_sbb(cc, g14, 0, &g14); + (void)inner_gf27500_sbb(cc, g15, 0, &g15); + + // Add g = f*q to e0..e11. + // Since e0..e15 < 2^1010 and f < 2^512, we know that the result + // is less than 2^1010 + 2^512*27*2^500, which is less than 2^1017. + // This is also a multiple of 2^512. We divide by 2^512 by simply + // dropping the low 512 bits (which are all equal to zero), and + // the result is less than 2**505 + cc = inner_gf27500_adc(0, g0, e0, &e0); + cc = inner_gf27500_adc(cc, g1, e1, &e1); + cc = inner_gf27500_adc(cc, g2, e2, &e2); + cc = inner_gf27500_adc(cc, g3, e3, &e3); + cc = inner_gf27500_adc(cc, g4, e4, &e4); + cc = inner_gf27500_adc(cc, g5, e5, &e5); + cc = inner_gf27500_adc(cc, g6, e6, &e6); + cc = inner_gf27500_adc(cc, g7, e7, &e7); + cc = inner_gf27500_adc(cc, g8, e8, &e8); + cc = inner_gf27500_adc(cc, g9, e9, &e9); + cc = inner_gf27500_adc(cc, g10, e10, &e10); + cc = inner_gf27500_adc(cc, g11, e11, &e11); + cc = inner_gf27500_adc(cc, g12, e12, &e12); + cc = inner_gf27500_adc(cc, g13, e13, &e13); + cc = inner_gf27500_adc(cc, g14, e14, &e14); + cc = inner_gf27500_adc(cc, g15, e15, &e15); + assert(cc == 0); + + d->v0 = e8; + d->v1 = e9; + d->v2 = e10; + d->v3 = e11; + d->v4 = e12; + d->v5 = e13; + d->v6 = e14; + d->v7 = e15; + } + + /* + * d <- a^(2^n) + * This computes n successive squarings of value a, with result in d. + * n == 0 is a valid input (in that case, *a is copied into *d). + * This function is not constant-time with regard to n: the number of + * successive squarings may be observable through timing-based side channels. + */ + static inline void + gf27500_xsquare(gf27500 *d, const gf27500 *a, unsigned n) + { + if (n == 0) { + *d = *a; + return; + } + gf27500_square(d, a); + while (n-- > 1) { + gf27500_square(d, d); + } + } + + /* + * Returns 0xFFFFFFFF if *a is zero; otherwise, 0x00000000 is returned. + */ + static inline uint32_t + gf27500_iszero(const gf27500 *a) + { + uint64_t a0, a1, a2, a3, a4, a5, a6, a7, t0, t1, r; + + // Zero can be represented by 0 or by q. + a0 = a->v0; + a1 = a->v1; + a2 = a->v2; + a3 = a->v3; + a4 = a->v4; + a5 = a->v5; + a6 = a->v6; + a7 = a->v7; + + t0 = a0 | a1 | a2 | a3 | a4 | a5 | a6 | a7; + t1 = ~a0 | ~a1 | ~a2 | ~a3 | ~a4 | ~a5 | ~a6 | (a7 ^ 0x01AFFFFFFFFFFFFF); + + // Top bit of r is 0 if and only if one of t0 or t1 is zero. + r = (t0 | -t0) & (t1 | -t1); + return (uint32_t)(r >> 63) - 1; + } + + /* + * Returns 0xFFFFFFFF if *a and *b represent the same field element; + * otherwise, 0x00000000 is returned. + */ + static inline uint32_t + gf27500_equals(const gf27500 *a, const gf27500 *b) + { + gf27500 d; + gf27500_sub(&d, a, b); + return gf27500_iszero(&d); + } + + /* + * d <- 1/a + * If *a is not zero, then the inverse is well-defined and written into *d, + * and the function returns 0xFFFFFFFF. If *a is zero, then this function + * sets *d to zero and returns 0x00000000. + */ + uint32_t gf27500_invert(gf27500 *d, const gf27500 *a); + + /* + * d <- a/b + * If *b is not zero, then this functions writes a/b into *d, and returns + * 0xFFFFFFFF. If *b is zero, then this function sets *d to zero (regardless + * of the value of *a) and returns 0x00000000. + */ + uint32_t gf27500_div(gf27500 *d, const gf27500 *a, const gf27500 *b); + + /* + * d <- a/3 + * Divides by 3 in the field by implementing the algorithm proposed in + * "Efficient Multiplication in Finite Field Extensions of Degree 5" + * by El Mrabet, Guillevic and Ionica at ASIACRYPT 2011. + */ + void gf27500_div3(gf27500 *out, const gf27500 *a); + + /* + * Get the Legendre symbol of *a (0 for zero, +1 for a non-zero square, + * -1 for a non-square). + */ + int32_t gf27500_legendre(const gf27500 *a); + + /* + * If *a is a square, then this function sets *d to a square root of a, + * and returns 0xFFFFFFFF. If *a is not a square, then this function + * sets *d to a square root of -a, and returns 0x00000000. + * In all cases, the value written into *d is such that the least significant + * bit of its integer representation (in [0..q-1]) is zero. + */ + uint32_t gf27500_sqrt(gf27500 *d, const gf27500 *a); + + /* + * Encode field element *a into buffer dst (exactly 64 bytes are written). + */ + void gf27500_encode(void *dst, const gf27500 *a); + + /* + * Decode source buffer src (exactly 64 bytes) into a field element *d. + * If the source value is not a valid canonical encoding, then *d is zero + * and the function returns 0x00000000; otherwise, the function returns + * 0xFFFFFFFF. + */ + uint32_t gf27500_decode(gf27500 *d, const void *src); + + /* + * Interpret the source buffer (of size len bytes) as an unsigned integer + * (little-endian convention) and reduce it modulo q, yielding a field + * element which is written into *d. Since reduction is applied, this + * function cannot fail. + */ + void gf27500_decode_reduce(gf27500 *d, const void *src, size_t len); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/gf/broadwell/lvl5/test/CMakeLists.txt b/src/gf/broadwell/lvl5/test/CMakeLists.txt new file mode 100644 index 0000000..316e0a8 --- /dev/null +++ b/src/gf/broadwell/lvl5/test/CMakeLists.txt @@ -0,0 +1 @@ +include(../../lvlx_test.cmake) diff --git a/src/gf/broadwell/lvlx.cmake b/src/gf/broadwell/lvlx.cmake new file mode 100644 index 0000000..3ab2d2d --- /dev/null +++ b/src/gf/broadwell/lvlx.cmake @@ -0,0 +1,12 @@ +set(SOURCE_FILES_GF_${SVARIANT_UPPER}_BROADWELL + ${SOURCE_FILES_GF_SPECIFIC} + fp.c + ${LVLX_DIR}/fp2.c +) + +add_library(${LIB_GF_${SVARIANT_UPPER}} STATIC ${SOURCE_FILES_GF_${SVARIANT_UPPER}_BROADWELL}) +target_include_directories(${LIB_GF_${SVARIANT_UPPER}} PRIVATE ${INC_COMMON} ${PROJECT_SOURCE_DIR}/src/precomp/ref/${SVARIANT_LOWER}/include ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} include ${INC_PUBLIC}) +target_compile_options(${LIB_GF_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) +target_compile_definitions(${LIB_GF_${SVARIANT_UPPER}} PUBLIC SQISIGN_VARIANT=${SVARIANT_LOWER}) + +add_subdirectory(test) diff --git a/src/gf/broadwell/lvlx/fp2.c b/src/gf/broadwell/lvlx/fp2.c new file mode 100644 index 0000000..3269f6c --- /dev/null +++ b/src/gf/broadwell/lvlx/fp2.c @@ -0,0 +1,188 @@ +#include "fp2.h" +#include +#include + +/* Arithmetic modulo X^2 + 1 */ + +void +fp2_encode(void *dst, const fp2_t *a) +{ + uint8_t *buf = dst; + fp_encode(buf, &(a->re)); + fp_encode(buf + FP_ENCODED_BYTES, &(a->im)); +} + +uint32_t +fp2_decode(fp2_t *d, const void *src) +{ + const uint8_t *buf = src; + uint32_t re, im; + + re = fp_decode(&(d->re), buf); + im = fp_decode(&(d->im), buf + FP_ENCODED_BYTES); + return re & im; +} + +void +fp2_inv(fp2_t *x) +{ + fp_t t0, t1; + + fp_sqr(&t0, &(x->re)); + fp_sqr(&t1, &(x->im)); + fp_add(&t0, &t0, &t1); + fp_inv(&t0); + fp_mul(&(x->re), &(x->re), &t0); + fp_mul(&(x->im), &(x->im), &t0); + fp_neg(&(x->im), &(x->im)); +} + +void +fp2_batched_inv(fp2_t *x, int len) +{ + fp2_t t1[len], t2[len]; + fp2_t inverse; + + // x = x0,...,xn + // t1 = x0, x0*x1, ... ,x0 * x1 * ... * xn + t1[0] = x[0]; + for (int i = 1; i < len; i++) { + fp2_mul(&t1[i], &t1[i - 1], &x[i]); + } + + // inverse = 1/ (x0 * x1 * ... * xn) + inverse = t1[len - 1]; + fp2_inv(&inverse); + t2[0] = inverse; + + // t2 = 1/ (x0 * x1 * ... * xn), 1/ (x0 * x1 * ... * x(n-1)) , ... , 1/xO + for (int i = 1; i < len; i++) { + fp2_mul(&t2[i], &t2[i - 1], &x[len - i]); + } + + x[0] = t2[len - 1]; + for (int i = 1; i < len; i++) { + fp2_mul(&x[i], &t1[i - 1], &t2[len - i - 1]); + } +} + +uint32_t +fp2_is_square(const fp2_t *x) +{ + fp_t t0, t1; + + fp_sqr(&t0, &(x->re)); + fp_sqr(&t1, &(x->im)); + fp_add(&t0, &t0, &t1); + + return fp_is_square(&t0); +} + +void +fp2_sqrt(fp2_t *a) +{ + fp_t x0, x1, t0, t1; + + /* From "Optimized One-Dimensional SQIsign Verification on Intel and + * Cortex-M4" by Aardal et al: https://eprint.iacr.org/2024/1563 */ + + // x0 = \delta = sqrt(a0^2 + a1^2). + fp_sqr(&x0, &(a->re)); + fp_sqr(&x1, &(a->im)); + fp_add(&x0, &x0, &x1); + fp_sqrt(&x0); + // If a1 = 0, there is a risk of \delta = -a0, which makes x0 = 0 below. + // In that case, we restore the value \delta = a0. + fp_select(&x0, &x0, &(a->re), fp_is_zero(&(a->im))); + // x0 = \delta + a0, t0 = 2 * x0. + fp_add(&x0, &x0, &(a->re)); + fp_add(&t0, &x0, &x0); + // x1 = t0^(p-3)/4. + fp_copy(&x1, &t0); + fp_exp3div4(&x1); + // x0 = x0 * x1, x1 = x1 * a1, t1 = (2x0)^2. + fp_mul(&x0, &x0, &x1); + fp_mul(&x1, &x1, &(a->im)); + fp_add(&t1, &x0, &x0); + fp_sqr(&t1, &t1); + // If t1 = t0, return x0 + x1*i, otherwise x1 - x0*i. + fp_sub(&t0, &t0, &t1); + uint32_t f = fp_is_zero(&t0); + fp_neg(&t1, &x0); + fp_copy(&t0, &x1); + fp_select(&t0, &t0, &x0, f); + fp_select(&t1, &t1, &x1, f); + + // Check if t0 is zero + uint32_t t0_is_zero = fp_is_zero(&t0); + // Check whether t0, t1 are odd + // Note: we encode to ensure canonical representation + uint8_t tmp_bytes[FP_ENCODED_BYTES]; + fp_encode(tmp_bytes, &t0); + uint32_t t0_is_odd = -((uint32_t)tmp_bytes[0] & 1); + fp_encode(tmp_bytes, &t1); + uint32_t t1_is_odd = -((uint32_t)tmp_bytes[0] & 1); + // We negate the output if: + // t0 is odd, or + // t0 is zero and t1 is odd + uint32_t negate_output = t0_is_odd | (t0_is_zero & t1_is_odd); + fp_neg(&x0, &t0); + fp_select(&(a->re), &t0, &x0, negate_output); + fp_neg(&x0, &t1); + fp_select(&(a->im), &t1, &x0, negate_output); +} + +uint32_t +fp2_sqrt_verify(fp2_t *a) +{ + fp2_t t0, t1; + + fp2_copy(&t0, a); + fp2_sqrt(a); + fp2_sqr(&t1, a); + + return (fp2_is_equal(&t0, &t1)); +} + +// exponentiation +void +fp2_pow_vartime(fp2_t *out, const fp2_t *x, const digit_t *exp, const int size) +{ + fp2_t acc; + digit_t bit; + + fp2_copy(&acc, x); + fp2_set_one(out); + + // Iterate over each word of exp + for (int j = 0; j < size; j++) { + // Iterate over each bit of the word + for (int i = 0; i < RADIX; i++) { + bit = (exp[j] >> i) & 1; + if (bit == 1) { + fp2_mul(out, out, &acc); + } + fp2_sqr(&acc, &acc); + } + } +} + +void +fp2_print(const char *name, const fp2_t *a) +{ + printf("%s0x", name); + + uint8_t buf[FP_ENCODED_BYTES]; + fp_encode(&buf, &a->re); // Encoding ensures canonical rep + for (int i = 0; i < FP_ENCODED_BYTES; i++) { + printf("%02x", buf[FP_ENCODED_BYTES - i - 1]); + } + + printf(" + i*0x"); + + fp_encode(&buf, &a->im); + for (int i = 0; i < FP_ENCODED_BYTES; i++) { + printf("%02x", buf[FP_ENCODED_BYTES - i - 1]); + } + printf("\n"); +} diff --git a/src/gf/broadwell/lvlx_test.cmake b/src/gf/broadwell/lvlx_test.cmake new file mode 100644 index 0000000..28655ac --- /dev/null +++ b/src/gf/broadwell/lvlx_test.cmake @@ -0,0 +1,23 @@ +add_executable(sqisign_test_gf_${SVARIANT_LOWER}_fp ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/test_fp.c ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/test_utils.c) +target_link_libraries(sqisign_test_gf_${SVARIANT_LOWER}_fp ${LIB_GF_${SVARIANT_UPPER}} sqisign_common_test) +target_include_directories(sqisign_test_gf_${SVARIANT_LOWER}_fp PRIVATE ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ${PROJECT_SOURCE_DIR}/src/precomp/ref/${SVARIANT_LOWER}/include ${INC_PUBLIC}) + +add_executable(sqisign_test_gf_${SVARIANT_LOWER}_fp2 ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/test_fp2.c ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/test_utils.c) +target_link_libraries(sqisign_test_gf_${SVARIANT_LOWER}_fp2 ${LIB_GF_${SVARIANT_UPPER}} sqisign_common_test) +target_include_directories(sqisign_test_gf_${SVARIANT_LOWER}_fp2 PRIVATE ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ${PROJECT_SOURCE_DIR}/src/precomp/ref/${SVARIANT_LOWER}/include ${INC_PUBLIC}) + +add_test(sqisign_test_gf_${SVARIANT_LOWER}_fp sqisign_test_gf_${SVARIANT_LOWER}_fp test) +add_test(sqisign_test_gf_${SVARIANT_LOWER}_fp2 sqisign_test_gf_${SVARIANT_LOWER}_fp2 test) + +add_executable(sqisign_bench_gf_${SVARIANT_LOWER}_fp ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/bench_fp.c ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/test_utils.c) +target_link_libraries(sqisign_bench_gf_${SVARIANT_LOWER}_fp ${LIB_GF_${SVARIANT_UPPER}} sqisign_common_test) +target_include_directories(sqisign_bench_gf_${SVARIANT_LOWER}_fp PRIVATE ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ${PROJECT_SOURCE_DIR}/src/precomp/ref/${SVARIANT_LOWER}/include ${INC_PUBLIC}) + +add_executable(sqisign_bench_gf_${SVARIANT_LOWER}_fp2 ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/bench_fp2.c ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/test_utils.c) +target_link_libraries(sqisign_bench_gf_${SVARIANT_LOWER}_fp2 ${LIB_GF_${SVARIANT_UPPER}} sqisign_common_sys) +target_include_directories(sqisign_bench_gf_${SVARIANT_LOWER}_fp2 PRIVATE ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ${PROJECT_SOURCE_DIR}/src/precomp/ref/${SVARIANT_LOWER}/include ${INC_PUBLIC}) + +set(BM_BINS ${BM_BINS} + sqisign_bench_gf_${SVARIANT_LOWER}_fp sqisign_bench_gf_${SVARIANT_LOWER}_fp2 + CACHE INTERNAL "List of benchmark executables") + diff --git a/src/gf/gfx/test/bench_fp.c b/src/gf/gfx/test/bench_fp.c new file mode 100644 index 0000000..2a2b992 --- /dev/null +++ b/src/gf/gfx/test/bench_fp.c @@ -0,0 +1,254 @@ +#include +#include +#include +#include +#include +#include +#include "test_utils.h" +#include + +#define STRINGIFY2(x) #x +#define STRINGIFY(x) STRINGIFY2(x) + +bool +fp_run(int iterations) +{ + bool OK = true; + int n, i; + uint64_t cycles1, cycles2; + fp_t a, b; + uint8_t tmp[32]; + + fp_random_test(&a); + fp_random_test(&b); + + printf("\n-------------------------------------------------------------------------------------" + "-------------------\n\n"); + printf("Benchmarking GF(p) field arithmetic for " STRINGIFY(SQISIGN_VARIANT) ": \n\n"); + + // GF(p) addition + uint64_t cycle_runs[20]; + + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp_add(&a, &a, &b); + fp_add(&b, &b, &a); + fp_add(&a, &a, &b); + fp_add(&b, &b, &a); + fp_add(&a, &a, &b); + fp_add(&b, &b, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp_encode(tmp, &b); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p) addition runs in .......................................... %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / (6 * iterations), + tmp[0]); + + // GF(p) subtraction + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp_sub(&a, &a, &b); + fp_sub(&b, &b, &a); + fp_sub(&a, &a, &b); + fp_sub(&b, &b, &a); + fp_sub(&a, &a, &b); + fp_sub(&b, &b, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp_encode(tmp, &b); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p) subtraction runs in ....................................... %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / (6 * iterations), + tmp[0]); + + // GF(p) division by 3 + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp_div3(&a, &a); + fp_div3(&b, &b); + fp_div3(&a, &a); + fp_div3(&b, &b); + fp_div3(&a, &a); + fp_div3(&b, &b); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp_encode(tmp, &b); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p) division by 3 runs in ..................................... %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / (6 * iterations), + tmp[0]); + + // GF(p) multiplication + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp_mul(&a, &a, &b); + fp_mul(&b, &b, &a); + fp_mul(&a, &a, &b); + fp_mul(&b, &b, &a); + fp_mul(&a, &a, &b); + fp_mul(&b, &b, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp_encode(tmp, &b); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p) multiplication runs in .................................... %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / (6 * iterations), + tmp[0]); + + // GF(p) small multiplication + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + uint32_t val = cycles1; + for (n = 0; n < iterations; n++) { + fp_mul_small(&a, &a, val); + fp_mul_small(&a, &a, val); + fp_mul_small(&a, &a, val); + fp_mul_small(&a, &a, val); + fp_mul_small(&a, &a, val); + fp_mul_small(&a, &a, val); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp_encode(tmp, &a); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p) small multiplication runs in .............................. %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / (6 * iterations), + tmp[0]); + + // GF(p) squaring + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp_sqr(&a, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp_encode(tmp, &a); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p) squaring runs in .......................................... %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / (iterations), + tmp[0]); + + // GF(p) inversion + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp_inv(&a); + fp_add(&a, &b, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp_encode(tmp, &a); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p) inversion runs in ......................................... %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / iterations, + tmp[0]); + + // GF(p) sqrt + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp_sqrt(&a); + fp_add(&a, &b, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp_encode(tmp, &a); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p) sqrt runs in .............................................. %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / iterations, + tmp[0]); + + // GF(p) is_square + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp_is_square(&a); + fp_add(&a, &b, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp_encode(tmp, &a); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" Square checking runs in ......................................... %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / iterations, + tmp[0]); + + return OK; +} + +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int iterations = 1000 * SQISIGN_TEST_REPS; + int help = 0; + int seed_set = 0; + +#ifndef NDEBUG + fprintf(stderr, + "\x1b[31mIt looks like SQIsign was compiled with assertions enabled.\n" + "This will severely impact performance measurements.\x1b[0m\n"); +#endif + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + } + + if (help || iterations <= 0) { + printf("Usage: %s [--iterations=] [--seed=]\n", argv[0]); + printf("Where is the number of iterations used for benchmarking; if not " + "present, uses the default: %d)\n", + iterations); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + cpucycles_init(); + + return !fp_run(iterations); +} diff --git a/src/gf/gfx/test/bench_fp2.c b/src/gf/gfx/test/bench_fp2.c new file mode 100644 index 0000000..0da8802 --- /dev/null +++ b/src/gf/gfx/test/bench_fp2.c @@ -0,0 +1,234 @@ +#include +#include +#include +#include +#include +#include "test_utils.h" +#include + +#define STRINGIFY2(x) #x +#define STRINGIFY(x) STRINGIFY2(x) + +bool +fp2_run(int iterations) +{ + bool OK = true; + int n, i; + uint64_t cycles1, cycles2; + fp2_t a, b; + uint8_t tmp[2 * FP_ENCODED_BYTES]; + + fp2_random_test(&a); + fp2_random_test(&b); + + printf("\n-------------------------------------------------------------------------------------" + "-------------------\n\n"); + printf("Benchmarking GF(p^2) field arithmetic for " STRINGIFY(SQISIGN_VARIANT) ": \n\n"); + + // GF(p^2) addition + uint64_t cycle_runs[20]; + + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp2_add(&a, &a, &b); + fp2_add(&b, &b, &a); + fp2_add(&a, &a, &b); + fp2_add(&b, &b, &a); + fp2_add(&a, &a, &b); + fp2_add(&b, &b, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp2_encode(tmp, &b); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p^2) addition runs in .......................................... %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / (6 * iterations), + tmp[0]); + + // GF(p^2) subtraction + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp2_sub(&a, &a, &b); + fp2_sub(&b, &b, &a); + fp2_sub(&a, &a, &b); + fp2_sub(&b, &b, &a); + fp2_sub(&a, &a, &b); + fp2_sub(&b, &b, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp2_encode(tmp, &b); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p^2) subtraction runs in ....................................... %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / (6 * iterations), + tmp[0]); + + // GF(p^2) multiplication + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp2_mul(&a, &a, &b); + fp2_mul(&b, &b, &a); + fp2_mul(&a, &a, &b); + fp2_mul(&b, &b, &a); + fp2_mul(&a, &a, &b); + fp2_mul(&b, &b, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp2_encode(tmp, &b); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p^2) multiplication runs in .................................... %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / (6 * iterations), + tmp[0]); + + // GF(p^2) squaring + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp2_sqr(&a, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp2_encode(tmp, &a); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p^2) squaring runs in .......................................... %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / (iterations), + tmp[0]); + + // GF(p^2) small multiplication + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + uint32_t val = cycles1; + for (n = 0; n < iterations; n++) { + fp2_mul_small(&a, &a, val); + fp2_mul_small(&a, &a, val); + fp2_mul_small(&a, &a, val); + fp2_mul_small(&a, &a, val); + fp2_mul_small(&a, &a, val); + fp2_mul_small(&a, &a, val); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp_add(&a.re, &a.re, &a.im); + fp2_encode(tmp, &a); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p^2) small multiplication runs in .............................. %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / (6 * iterations), + tmp[0]); + + // GF(p^2) inversion + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp2_inv(&a); + fp2_add(&a, &b, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp2_encode(tmp, &a); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p^2) inversion runs in ......................................... %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / iterations, + tmp[0]); + + // GF(p^2) sqrt + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp2_sqrt(&a); + fp2_add(&a, &b, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp2_encode(tmp, &a); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p^2) sqrt runs in .............................................. %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / iterations, + tmp[0]); + + // GF(p^2) is_square + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp2_is_square(&a); + fp2_add(&a, &b, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp2_encode(tmp, &a); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" Square checking runs in ........................................... %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / iterations, + tmp[0]); + + return OK; +} + +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int iterations = 1000 * SQISIGN_TEST_REPS; + int help = 0; + int seed_set = 0; + +#ifndef NDEBUG + fprintf(stderr, + "\x1b[31mIt looks like SQIsign was compiled with assertions enabled.\n" + "This will severely impact performance measurements.\x1b[0m\n"); +#endif + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + } + + if (help || iterations <= 0) { + printf("Usage: %s [--iterations=] [--seed=]\n", argv[0]); + printf("Where is the number of iterations used for benchmarking; if not " + "present, uses the default: %d)\n", + iterations); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + cpucycles_init(); + + return !fp2_run(iterations); +} diff --git a/src/gf/gfx/test/test_fp.c b/src/gf/gfx/test/test_fp.c new file mode 100644 index 0000000..89bae40 --- /dev/null +++ b/src/gf/gfx/test/test_fp.c @@ -0,0 +1,460 @@ +#include +#include +#include +#include +#include "test_utils.h" +#include +#include + +bool +fp_test(int iterations) +{ // Tests for the field arithmetic + bool OK = true; + int n, passed; + fp_t a, b, c, d, e, f; + + printf("\n-------------------------------------------------------------------------------------" + "-------------------\n\n"); + printf("Testing field arithmetic over GF(p): \n\n"); + + // Test equality + passed = 1; + for (n = 0; n < iterations; n++) { + fp_random_test(&a); + fp_add(&b, &a, (fp_t *)&ONE); + fp_set_zero(&c); + + if (fp_is_equal(&a, &a) == 0) { + passed = 0; + break; + } + if (fp_is_equal(&a, &b) != 0) { + passed = 0; + break; + } + if (fp_is_equal(&c, (fp_t *)&ZERO) == 0) { + passed = 0; + break; + } + + if (fp_is_zero((fp_t *)&ZERO) == 0) { + passed = 0; + break; + } + if (fp_is_zero((fp_t *)&ONE) != 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p) equality tests ............................................ PASSED"); + else { + printf(" GF(p) equality tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Test mul small + passed = 1; + for (n = 0; n < iterations; n++) { + fp_random_test(&a); + uint32_t val = rand(); + + // Multiply by small value + fp_mul_small(&b, &a, val); + + // Convert and use usual multiplication + fp_set_small(&c, val); + fp_mul(&d, &a, &c); + + if (fp_is_equal(&b, &d) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p) mul small test ............................................ PASSED"); + else { + printf(" GF(p) mul small tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Test half + passed = 1; + for (n = 0; n < iterations; n++) { + fp_random_test(&a); + + fp_add(&b, &a, &a); + fp_half(&c, &b); + if (fp_is_equal(&a, &c) == 0) { + passed = 0; + break; + } + + fp_random_test(&a); + + fp_half(&b, &a); + fp_add(&c, &b, &b); + if (fp_is_equal(&a, &c) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p) half test ................................................. PASSED"); + else { + printf(" GF(p) half tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Field division by 3 + passed = 1; + for (n = 0; n < iterations; n++) { + fp_random_test(&a); + + fp_add(&b, &a, &a); + fp_add(&b, &b, &a); + fp_div3(&c, &b); + + if (fp_is_equal(&a, &c) == 0) { + passed = 0; + break; + } + + fp_set_zero(&a); + fp_div3(&d, &a); // d = 0/3 + if (fp_is_zero(&d) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p) div by 3 tests............................................. PASSED"); + else { + printf(" GF(p) div by 3 tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Test set small + passed = 1; + for (n = 0; n < iterations; n++) { + fp_set_one(&a); + fp_add(&b, &a, &a); + fp_set_small(&c, (uint32_t)2); + if (fp_is_equal(&b, &c) == 0) { + passed = 0; + break; + } + + fp_set_one(&a); + fp_add(&b, &a, &a); + fp_add(&b, &b, &b); + fp_set_small(&c, 4); + if (fp_is_equal(&b, &c) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p) set small test ............................................ PASSED"); + else { + printf(" GF(p) set small... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Field addition + passed = 1; + for (n = 0; n < iterations; n++) { + fp_random_test(&a); + fp_random_test(&b); + fp_random_test(&c); + fp_random_test(&d); + + fp_add(&d, &a, &b); + fp_add(&e, &d, &c); // e = (a+b)+c + fp_add(&d, &b, &c); + fp_add(&f, &d, &a); // f = a+(b+c) + if (fp_is_equal(&e, &f) == 0) { + passed = 0; + break; + } + + fp_add(&d, &a, &b); // d = a+b + fp_add(&e, &b, &a); // e = b+a + if (fp_is_equal(&d, &e) == 0) { + passed = 0; + break; + } + + fp_set_zero(&b); + fp_add(&d, &a, &b); // d = a+0 + if (fp_is_equal(&a, &d) == 0) { + passed = 0; + break; + } + + fp_set_zero(&b); + fp_neg(&d, &a); + fp_add(&e, &a, &d); // e = a+(-a) + if (fp_is_equal(&e, &b) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p) addition tests ............................................ PASSED"); + else { + printf(" GF(p) addition tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Field subtraction + passed = 1; + for (n = 0; n < iterations; n++) { + fp_random_test(&a); + fp_random_test(&b); + fp_random_test(&c); + fp_random_test(&d); + + fp_sub(&d, &a, &b); + fp_sub(&e, &d, &c); // e = (a-b)-c + fp_add(&d, &b, &c); + fp_sub(&f, &a, &d); // f = a-(b+c) + if (fp_is_equal(&e, &f) == 0) { + passed = 0; + break; + } + + fp_sub(&d, &a, &b); // d = a-b + fp_sub(&e, &b, &a); + fp_neg(&e, &e); // e = -(b-a) + if (fp_is_equal(&d, &e) == 0) { + passed = 0; + break; + } + + fp_set_zero(&b); + fp_sub(&d, &a, &b); // d = a-0 + if (fp_is_equal(&a, &d) == 0) { + passed = 0; + break; + } + + fp_sub(&e, &a, &a); // e = a+(-a) + if (fp_is_zero(&e) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p) subtraction tests ......................................... PASSED"); + else { + printf(" GF(p) subtraction tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Field multiplication + passed = 1; + for (n = 0; n < iterations; n++) { + fp_random_test(&a); + fp_random_test(&b); + fp_random_test(&c); + fp_mul(&d, &a, &b); + fp_mul(&e, &d, &c); // e = (a*b)*c + fp_mul(&d, &b, &c); + fp_mul(&f, &d, &a); // f = a*(b*c) + if (fp_is_equal(&e, &f) == 0) { + passed = 0; + break; + } + + fp_add(&d, &b, &c); + fp_mul(&e, &a, &d); // e = a*(b+c) + fp_mul(&d, &a, &b); + fp_mul(&f, &a, &c); + fp_add(&f, &d, &f); // f = a*b+a*c + if (fp_is_equal(&e, &f) == 0) { + passed = 0; + break; + } + + fp_mul(&d, &a, &b); // d = a*b + fp_mul(&e, &b, &a); // e = b*a + if (fp_is_equal(&d, &e) == 0) { + passed = 0; + break; + } + + fp_set_one(&b); + fp_mul(&d, &a, &b); // d = a*1 + if (fp_is_equal(&a, &d) == 0) { + passed = 0; + break; + } + + fp_set_zero(&b); + fp_mul(&d, &a, &b); // d = a*0 + if (fp_is_equal(&b, &d) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p) multiplication tests ...................................... PASSED"); + else { + printf(" GF(p) multiplication tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Field squaring + passed = 1; + for (n = 0; n < iterations; n++) { + fp_random_test(&a); + + fp_sqr(&b, &a); // b = a^2 + fp_mul(&c, &a, &a); // c = a*a + if (fp_is_equal(&b, &c) == 0) { + passed = 0; + break; + } + + fp_set_zero(&a); + fp_sqr(&d, &a); // d = 0^2 + if (fp_is_zero(&d) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p) squaring tests............................................. PASSED"); + else { + printf(" GF(p) squaring tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Field inversion + passed = 1; + for (n = 0; n < iterations; n++) { + fp_random_test(&a); + + fp_copy(&b, &a); + fp_inv(&b); + fp_mul(&c, &a, &b); // c = a*a^-1 + if (fp_is_equal(&c, (fp_t *)&ONE) == 0) { + passed = 0; + break; + } + + fp_set_zero(&a); + fp_inv(&a); // c = 0^-1 + if (fp_is_equal(&a, (fp_t *)&ZERO) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p) inversion tests............................................ PASSED"); + else { + printf(" GF(p) inversion tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Square root and square detection + passed = 1; + for (n = 0; n < iterations; n++) { + fp_random_test(&a); + + fp_sqr(&c, &a); // c = a^2 + if (fp_is_square(&c) == 0) { + passed = 0; + break; + } + + fp_sqrt(&c); // c, d = ±sqrt(c) + fp_neg(&d, &c); + if ((fp_is_equal(&a, &c) == 0) && (fp_is_equal(&a, &d) == 0)) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" Square root, square tests........................................ PASSED"); + else { + printf(" Square root, square tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + return OK; +} + +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int iterations = 1000 * SQISIGN_TEST_REPS; + int help = 0; + int seed_set = 0; + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + } + + if (help || iterations <= 0) { + printf("Usage: %s [--iterations=] [--seed=]\n", argv[0]); + printf("Where is the number of iterations used for testing; if not " + "present, uses the default: %d)\n", + iterations); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + + return !fp_test(iterations); +} diff --git a/src/gf/gfx/test/test_fp2.c b/src/gf/gfx/test/test_fp2.c new file mode 100644 index 0000000..ab2122f --- /dev/null +++ b/src/gf/gfx/test/test_fp2.c @@ -0,0 +1,349 @@ +#include +#include +#include +#include "test_utils.h" +#include +#include + +bool +fp2_test(int iterations) +{ // Tests for the GF(p^2) arithmetic + bool OK = true; + int n, passed; + fp2_t a, b, c, d, e, f; + + printf("\n-------------------------------------------------------------------------------------" + "-------------------\n\n"); + printf("Testing arithmetic over GF(p^2): \n\n"); + + // Addition in GF(p^2) + passed = 1; + for (n = 0; n < iterations; n++) { + fp2_random_test(&a); + fp2_random_test(&b); + fp2_random_test(&c); + fp2_random_test(&d); + + fp2_add(&d, &a, &b); + fp2_add(&e, &d, &c); // e = (a+b)+c + fp2_add(&d, &b, &c); + fp2_add(&f, &d, &a); // f = a+(b+c) + if (fp2_is_equal(&e, &f) == 0) { + passed = 0; + break; + } + + fp2_add(&d, &a, &b); // d = a+b + fp2_add(&e, &b, &a); // e = b+a + if (fp2_is_equal(&d, &e) == 0) { + passed = 0; + break; + } + + fp2_set_zero(&b); + fp2_add(&d, &a, &b); // d = a+0 + if (fp2_is_equal(&d, &a) == 0) { + passed = 0; + break; + } + + fp2_neg(&d, &a); + fp2_add(&e, &a, &d); // e = a+(-a) + if (fp2_is_zero(&e) == 0) { + passed = 0; + break; + } + + // Test add_one special method + fp2_set_one(&b); + fp2_add(&e, &a, &b); + fp2_add_one(&f, &a); + if (fp2_is_equal(&e, &f) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p^2) addition tests ............................................ PASSED"); + else { + printf(" GF(p^2) addition tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Subtraction in GF(p^2) + passed = 1; + for (n = 0; n < iterations; n++) { + fp2_random_test(&a); + fp2_random_test(&b); + fp2_random_test(&c); + fp2_random_test(&d); + + fp2_sub(&d, &a, &b); + fp2_sub(&e, &d, &c); // e = (a-b)-c + fp2_add(&d, &b, &c); + fp2_sub(&f, &a, &d); // f = a-(b+c) + if (fp2_is_equal(&e, &f) == 0) { + passed = 0; + break; + } + + fp2_sub(&d, &a, &b); // d = a-b + fp2_sub(&e, &b, &a); + fp2_neg(&e, &e); // e = -(b-a) + if (fp2_is_equal(&d, &e) == 0) { + passed = 0; + break; + } + + fp2_set_zero(&b); + fp2_sub(&d, &a, &b); // d = a-0 + if (fp2_is_equal(&d, &a) == 0) { + passed = 0; + break; + } + + fp2_sub(&e, &a, &a); // e = a+(-a) + if (fp2_is_zero(&e) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p^2) subtraction tests ......................................... PASSED"); + else { + printf(" GF(p^2) subtraction tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Multiplication in GF(p^2) + passed = 1; + for (n = 0; n < iterations; n++) { + fp2_random_test(&a); + fp2_random_test(&b); + fp2_random_test(&c); + + fp2_mul(&d, &a, &b); + fp2_mul(&e, &d, &c); // e = (a*b)*c + fp2_mul(&d, &b, &c); + fp2_mul(&f, &d, &a); // f = a*(b*c) + if (fp2_is_equal(&e, &f) == 0) { + passed = 0; + break; + } + + fp2_add(&d, &b, &c); + fp2_mul(&e, &a, &d); // e = a*(b+c) + fp2_mul(&d, &a, &b); + fp2_mul(&f, &a, &c); + fp2_add(&f, &d, &f); // f = a*b+a*c + if (fp2_is_equal(&e, &f) == 0) { + passed = 0; + break; + } + + fp2_mul(&d, &a, &b); // d = a*b + fp2_mul(&e, &b, &a); // e = b*a + if (fp2_is_equal(&d, &e) == 0) { + passed = 0; + break; + } + + fp2_set_one(&b); + fp2_mul(&d, &a, &b); // d = a*1 + if (fp2_is_equal(&a, &d) == 0) { + passed = 0; + break; + } + + fp2_set_zero(&b); + fp2_mul(&d, &a, &b); // d = a*0 + if (fp2_is_zero(&d) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p^2) multiplication tests ...................................... PASSED"); + else { + printf(" GF(p^2) multiplication tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Test mul small + passed = 1; + for (n = 0; n < iterations; n++) { + fp2_random_test(&a); + uint32_t val = rand(); + + // Multiply by a small value + fp2_mul_small(&b, &a, val); + + // Convert and multiply as a fp val + fp2_set_small(&c, val); + fp2_mul(&d, &a, &c); + + // Values should be the same + if (fp2_is_equal(&b, &d) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p^2) mul small test ............................................ PASSED"); + else { + printf(" GF(p^2) mul small tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Squaring in GF(p^2) + passed = 1; + for (n = 0; n < iterations; n++) { + fp2_random_test(&a); + fp2_sqr(&b, &a); // b = a^2 + fp2_mul(&c, &a, &a); // c = a*a + if (fp2_is_equal(&b, &c) == 0) { + passed = 0; + break; + } + + fp2_set_zero(&a); + fp2_sqr(&d, &a); // d = 0^2 + if (fp2_is_zero(&d) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p^2) squaring tests............................................. PASSED"); + else { + printf(" GF(p^2) squaring tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Inversion in GF(p^2) + passed = 1; + for (n = 0; n < iterations; n++) { + fp2_random_test(&a); + + fp2_set_one(&d); + fp2_copy(&b, &a); + fp2_inv(&a); + fp2_mul(&c, &a, &b); // c = a*a^-1 + if (fp2_is_equal(&c, &d) == 0) { + passed = 0; + break; + } + + fp2_set_zero(&a); + fp2_set_zero(&d); + fp2_inv(&a); // c = 0^-1 + if (fp2_is_equal(&a, &d) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p^2) inversion tests............................................ PASSED"); + else { + printf(" GF(p^2) inversion tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Square root and square detection in GF(p^2) + passed = 1; + for (n = 0; n < iterations; n++) { + fp2_random_test(&a); + + fp2_sqr(&c, &a); // c = a^2 + if (fp2_is_square(&c) == 0) { + passed = 0; + break; + } + + fp2_copy(&b, &c); + if (!fp2_sqrt_verify(&b)) { + passed = 0; + break; + } + + fp2_sqrt(&c); // c = a = sqrt(c) + fp2_neg(&d, &c); + if ((fp2_is_equal(&a, &c) == 0) && (fp2_is_equal(&a, &d) == 0)) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" Square root, square tests.......................................... PASSED"); + else { + printf(" Square root, square tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + return OK; +} + +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int iterations = 1000 * SQISIGN_TEST_REPS; + int help = 0; + int seed_set = 0; + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + } + + if (help || iterations <= 0) { + printf("Usage: %s [--iterations=] [--seed=]\n", argv[0]); + printf("Where is the number of iterations used for testing; if not " + "present, uses the default: %d)\n", + iterations); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + + return !fp2_test(iterations); +} diff --git a/src/gf/gfx/test/test_utils.c b/src/gf/gfx/test/test_utils.c new file mode 100644 index 0000000..694e319 --- /dev/null +++ b/src/gf/gfx/test/test_utils.c @@ -0,0 +1,39 @@ +/* + * A custom SHA-3 / SHAKE implementation is used for pseudorandom (but + * reproducible) generation of test values. + */ + +#include "test_utils.h" +#include "rng.h" + +// Make n random-ish field elements (for tests only!). +void +fp_random_test(fp_t *a) +{ + uint8_t tmp[FP_ENCODED_BYTES]; + + randombytes(tmp, sizeof(tmp)); + + fp_decode_reduce(a, tmp, sizeof(tmp)); +} + +void +fp2_random_test(fp2_t *a) +{ + fp_random_test(&(a->re)); + fp_random_test(&(a->im)); +} + +int +cmp_u64(const void *v1, const void *v2) +{ + uint64_t x1 = *(const uint64_t *)v1; + uint64_t x2 = *(const uint64_t *)v2; + if (x1 < x2) { + return -1; + } else if (x1 == x2) { + return 0; + } else { + return 1; + } +} diff --git a/src/gf/gfx/test/test_utils.h b/src/gf/gfx/test/test_utils.h new file mode 100644 index 0000000..0c69c76 --- /dev/null +++ b/src/gf/gfx/test/test_utils.h @@ -0,0 +1,19 @@ +#ifndef test_utils_h__ +#define test_utils_h__ + +#include "fp.h" +#include "fp2.h" +#include +#include + +#define PASSED 0 +#define FAILED 1 + +// Random elements of fp and fp2, only suitable for testing +void fp_random_test(fp_t *a); +void fp2_random_test(fp2_t *a); + +// Comparison of u64 for qsort +int cmp_u64(const void *v1, const void *v2); + +#endif diff --git a/src/gf/ref/CMakeLists.txt b/src/gf/ref/CMakeLists.txt index 3b414f0..d0ba315 100644 --- a/src/gf/ref/CMakeLists.txt +++ b/src/gf/ref/CMakeLists.txt @@ -1 +1,3 @@ +set(LVLX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lvlx) + include(${SELECT_SQISIGN_VARIANT}) diff --git a/src/gf/ref/include/fp.h b/src/gf/ref/include/fp.h new file mode 100644 index 0000000..1241d58 --- /dev/null +++ b/src/gf/ref/include/fp.h @@ -0,0 +1,48 @@ +#ifndef FP_H +#define FP_H + +//////////////////////////////////////////////// NOTE: this is placed here for now +#include +#include +#include +#include +#include +#include +#include +#include + +typedef digit_t fp_t[NWORDS_FIELD]; // Datatype for representing field elements + +extern const digit_t ONE[NWORDS_FIELD]; +extern const digit_t ZERO[NWORDS_FIELD]; +// extern const digit_t PM1O3[NWORDS_FIELD]; + +void fp_set_small(fp_t *x, const digit_t val); +void fp_mul_small(fp_t *x, const fp_t *a, const uint32_t val); +void fp_set_zero(fp_t *x); +void fp_set_one(fp_t *x); +uint32_t fp_is_equal(const fp_t *a, const fp_t *b); +uint32_t fp_is_zero(const fp_t *a); +void fp_copy(fp_t *out, const fp_t *a); + +void fp_encode(void *dst, const fp_t *a); +void fp_decode_reduce(fp_t *d, const void *src, size_t len); +uint32_t fp_decode(fp_t *d, const void *src); + +void fp_select(fp_t *d, const fp_t *a0, const fp_t *a1, uint32_t ctl); +void fp_cswap(fp_t *a, fp_t *b, uint32_t ctl); + +void fp_add(fp_t *out, const fp_t *a, const fp_t *b); +void fp_sub(fp_t *out, const fp_t *a, const fp_t *b); +void fp_neg(fp_t *out, const fp_t *a); +void fp_sqr(fp_t *out, const fp_t *a); +void fp_mul(fp_t *out, const fp_t *a, const fp_t *b); + +void fp_inv(fp_t *x); +uint32_t fp_is_square(const fp_t *a); +void fp_sqrt(fp_t *a); +void fp_half(fp_t *out, const fp_t *a); +void fp_exp3div4(fp_t *out, const fp_t *a); +void fp_div3(fp_t *out, const fp_t *a); + +#endif diff --git a/src/gf/ref/include/fp2.h b/src/gf/ref/include/fp2.h new file mode 100644 index 0000000..00e673b --- /dev/null +++ b/src/gf/ref/include/fp2.h @@ -0,0 +1,41 @@ +#ifndef FP2_H +#define FP2_H + +#include +#include "fp.h" +#include + +// Structure for representing elements in GF(p^2) +typedef struct fp2_t +{ + fp_t re, im; +} fp2_t; + +void fp2_set_small(fp2_t *x, const digit_t val); +void fp2_mul_small(fp2_t *x, const fp2_t *y, uint32_t n); +void fp2_set_one(fp2_t *x); +void fp2_set_zero(fp2_t *x); +uint32_t fp2_is_zero(const fp2_t *a); +uint32_t fp2_is_equal(const fp2_t *a, const fp2_t *b); +uint32_t fp2_is_one(const fp2_t *a); +void fp2_copy(fp2_t *x, const fp2_t *y); +void fp2_add(fp2_t *x, const fp2_t *y, const fp2_t *z); +void fp2_add_one(fp2_t *x, const fp2_t *y); +void fp2_sub(fp2_t *x, const fp2_t *y, const fp2_t *z); +void fp2_neg(fp2_t *x, const fp2_t *y); +void fp2_mul(fp2_t *x, const fp2_t *y, const fp2_t *z); +void fp2_sqr(fp2_t *x, const fp2_t *y); +void fp2_inv(fp2_t *x); +uint32_t fp2_is_square(const fp2_t *x); +void fp2_sqrt(fp2_t *x); +uint32_t fp2_sqrt_verify(fp2_t *a); +void fp2_half(fp2_t *x, const fp2_t *y); +void fp2_batched_inv(fp2_t *x, int len); +void fp2_pow_vartime(fp2_t *out, const fp2_t *x, const digit_t *exp, const int size); +void fp2_print(const char *name, const fp2_t *a); +void fp2_encode(void *dst, const fp2_t *a); +uint32_t fp2_decode(fp2_t *d, const void *src); +void fp2_select(fp2_t *d, const fp2_t *a0, const fp2_t *a1, uint32_t ctl); +void fp2_cswap(fp2_t *a, fp2_t *b, uint32_t ctl); + +#endif diff --git a/src/gf/ref/lvl1/CMakeLists.txt b/src/gf/ref/lvl1/CMakeLists.txt index 10e8149..75f4223 100644 --- a/src/gf/ref/lvl1/CMakeLists.txt +++ b/src/gf/ref/lvl1/CMakeLists.txt @@ -1,10 +1,5 @@ - -set(SOURCE_FILES_GF_${SVARIANT_UPPER}_REF - fp_p1913.c fp.c fp2.c +set(SOURCE_FILES_GF_SPECIFIC + fp_p5248_${RADIX}.c ) -add_library(${LIB_GF_${SVARIANT_UPPER}} ${SOURCE_FILES_GF_${SVARIANT_UPPER}_REF}) -target_include_directories(${LIB_GF_${SVARIANT_UPPER}} PRIVATE common ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} include ${PROJECT_SOURCE_DIR}/include ${INC_COMMON}) -target_compile_options(${LIB_GF_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) +include(../lvlx.cmake) diff --git a/src/gf/ref/lvl1/Makefile b/src/gf/ref/lvl1/Makefile deleted file mode 100755 index e59be0e..0000000 --- a/src/gf/ref/lvl1/Makefile +++ /dev/null @@ -1,43 +0,0 @@ - -CC=gcc -CFLAGS= -O3 -std=gnu11 -Wall -march=native -Wno-missing-braces -Wno-logical-not-parentheses -LDFLAGS=-lm -AR=ar rcs -RANLIB=ranlib - -OBJECTS=objs/fp_p1913.o objs/fp.o objs/fp2.o objs/random.o - -all: lib tests - -objs/fp_p1913.o: fp_p1913.c - @mkdir -p $(@D) - $(CC) -c $(CFLAGS) fp_p1913.c -o objs/fp_p1913.o - -objs/fp.o: fp.c - @mkdir -p $(@D) - $(CC) -c $(CFLAGS) fp.c -o objs/fp.o - -objs/fp2.o: fp2.c - @mkdir -p $(@D) - $(CC) -c $(CFLAGS) fp2.c -o objs/fp2.o - -objs/random.o: ../../../common/generic/randombytes_system.c - $(CC) -c $(CFLAGS) ../../../common/generic/randombytes_system.c -o objs/random.o - -lib: $(OBJECTS) - rm -rf lib - mkdir lib - $(AR) lib/libtest.a $^ - $(RANLIB) lib/libtest.a - -tests: lib - $(CC) $(CFLAGS) -L./lib test/test_fp.c test/test_extras.c -ltest $(LDFLAGS) -o test_fp -lgmp - $(CC) $(CFLAGS) -L./lib test/test_fp2.c test/test_extras.c -ltest $(LDFLAGS) -o test_fp2 -lgmp - -check: tests - -.PHONY: clean - -clean: - rm -rf *.req objs lib test_fp* - diff --git a/src/gf/ref/lvl1/fp.c b/src/gf/ref/lvl1/fp.c deleted file mode 100755 index 4514d38..0000000 --- a/src/gf/ref/lvl1/fp.c +++ /dev/null @@ -1,169 +0,0 @@ -#include "include/fp.h" - -const uint64_t p[NWORDS_FIELD] = { 0xffffffffffffffff, 0x252C9E49355147FF, 0x33A6A86587407437, 0x34E29E286B95D98C }; -const uint64_t R2[NWORDS_FIELD] = { 0x233625AE400674D4, 0x20AFD6C1025A1C2E, 0x30A841AB0920655D, 0x0D72E7D67C30CD3D }; -const uint64_t pp[NWORDS_FIELD] = { 0x01, 0x00, 0x00, 0x00 }; - - -void fp_set(digit_t* x, const digit_t val) -{ // Set field element x = val, where val has wordsize - - x[0] = val; - for (unsigned int i = 1; i < NWORDS_FIELD; i++) { - x[i] = 0; - } -} - -bool fp_is_equal(const digit_t* a, const digit_t* b) -{ // Compare two field elements in constant time - // Returns 1 (true) if a=b, 0 (false) otherwise - digit_t r = 0; - - for (unsigned int i = 0; i < NWORDS_FIELD; i++) - r |= a[i] ^ b[i]; - - return (bool)is_digit_zero_ct(r); -} - -bool fp_is_zero(const digit_t* a) -{ // Is a field element zero? - // Returns 1 (true) if a=0, 0 (false) otherwise - digit_t r = 0; - - for (unsigned int i = 0; i < NWORDS_FIELD; i++) - r |= a[i] ^ 0; - - return (bool)is_digit_zero_ct(r); -} - -void fp_copy(digit_t* out, const digit_t* a) -{ - memcpy(out, a, NWORDS_FIELD*RADIX/8); -} - -void fp_neg(digit_t* out, const digit_t* a) -{ // Modular negation, out = -a mod p - // Input: a in [0, p-1] - // Output: out in [0, p-1] - unsigned int i, borrow = 0; - - for (i = 0; i < NWORDS_FIELD; i++) { - SUBC(out[i], borrow, ((digit_t*)p)[i], a[i], borrow); - } - fp_sub(out, out, (digit_t*)p); -} - -void MUL(digit_t* out, const digit_t a, const digit_t b) -{ // Digit multiplication, digit*digit -> 2-digit result - // Inputs: a, b in [0, 2^w-1], where w is the computer wordsize - // Output: 0 < out < 2^(2w)-1 - register digit_t al, ah, bl, bh, temp; - digit_t albl, albh, ahbl, ahbh, res1, res2, res3, carry; - digit_t mask_low = (digit_t)(-1) >> (sizeof(digit_t)*4), mask_high = (digit_t)(-1) << (sizeof(digit_t)*4); - - al = a & mask_low; // Low part - ah = a >> (sizeof(digit_t)*4); // High part - bl = b & mask_low; - bh = b >> (sizeof(digit_t)*4); - - albl = al * bl; - albh = al * bh; - ahbl = ah * bl; - ahbh = ah * bh; - out[0] = albl & mask_low; // out00 - - res1 = albl >> (sizeof(digit_t)*4); - res2 = ahbl & mask_low; - res3 = albh & mask_low; - temp = res1 + res2 + res3; - carry = temp >> (sizeof(digit_t)*4); - out[0] ^= temp << (sizeof(digit_t)*4); // out01 - - res1 = ahbl >> (sizeof(digit_t)*4); - res2 = albh >> (sizeof(digit_t)*4); - res3 = ahbh & mask_low; - temp = res1 + res2 + res3 + carry; - out[1] = temp & mask_low; // out10 - carry = temp & mask_high; - out[1] ^= (ahbh & mask_high) + carry; // out11 -} - -digit_t mp_shiftr(digit_t* x, const unsigned int shift, const unsigned int nwords) -{ // Multiprecision right shift - digit_t bit_out = x[0] & 1; - - for (unsigned int i = 0; i < nwords-1; i++) { - SHIFTR(x[i+1], x[i], shift, x[i], RADIX); - } - x[nwords-1] >>= shift; - return bit_out; -} - -void mp_shiftl(digit_t* x, const unsigned int shift, const unsigned int nwords) -{ // Multiprecision left shift - - for (int i = nwords-1; i > 0; i--) { - SHIFTL(x[i], x[i-1], shift, x[i], RADIX); - } - x[0] <<= shift; -} - -static void fp_exp3div4(digit_t* out, const digit_t* a) -{ // Fixed exponentiation out = a^((p-3)/4) mod p - // Input: a in [0, p-1] - // Output: out in [0, p-1] - // Requirement: p = 3(mod 4) - fp_t p_t, acc; - digit_t bit; - - memcpy((digit_t*)p_t, (digit_t*)p, NWORDS_FIELD*RADIX/8); - memcpy((digit_t*)acc, (digit_t*)a, NWORDS_FIELD*RADIX/8); - mp_shiftr(p_t, 1, NWORDS_FIELD); - mp_shiftr(p_t, 1, NWORDS_FIELD); - fp_set(out, 1); - fp_tomont(out, out); - - for (int i = 0; i < NWORDS_FIELD*RADIX-2; i++) { - bit = p_t[0] & 1; - mp_shiftr(p_t, 1, NWORDS_FIELD); - if (bit == 1) { - fp_mul(out, out, acc); - } - fp_sqr(acc, acc); - } -} - -void fp_inv(digit_t* a) -{ // Modular inversion, out = x^-1*R mod p, where R = 2^(w*nwords), w is the computer wordsize and nwords is the number of words to represent p - // Input: a=xR in [0, p-1] - // Output: out in [0, p-1]. It outputs 0 if the input does not have an inverse - // Requirement: Ceiling(Log(p)) < w*nwords - fp_t t; - - fp_exp3div4(t, a); - fp_sqr(t, t); - fp_sqr(t, t); - fp_mul(a, t, a); // a^(p-2) -} - -bool fp_is_square(const digit_t* a) -{ // Is field element a square? - // Output: out = 0 (false), 1 (true) - fp_t t, one; - - fp_exp3div4(t, a); - fp_sqr(t, t); - fp_mul(t, t, a); // a^((p-1)/2) - fp_frommont(t, t); - fp_set(one, 1); - - return fp_is_equal(t, one); -} - -void fp_sqrt(digit_t* a) -{ // Square root computation, out = a^((p+1)/4) mod p - fp_t t; - - fp_exp3div4(t, a); - fp_mul(a, t, a); // a^((p+1)/4) -} \ No newline at end of file diff --git a/src/gf/ref/lvl1/fp2.c b/src/gf/ref/lvl1/fp2.c deleted file mode 100755 index 4de6396..0000000 --- a/src/gf/ref/lvl1/fp2.c +++ /dev/null @@ -1,192 +0,0 @@ -#include - -extern const digit_t R[NWORDS_FIELD]; - -/* Arithmetic modulo X^2 + 1 */ - -void fp2_set(fp2_t* x, const digit_t val) -{ - fp_set(x->re, val); - fp_set(x->im, 0); -} - -bool fp2_is_zero(const fp2_t* a) -{ // Is a GF(p^2) element zero? - // Returns 1 (true) if a=0, 0 (false) otherwise - - return fp_is_zero(a->re) & fp_is_zero(a->im); -} - -bool fp2_is_equal(const fp2_t* a, const fp2_t* b) -{ // Compare two GF(p^2) elements in constant time - // Returns 1 (true) if a=b, 0 (false) otherwise - - return fp_is_equal(a->re, b->re) & fp_is_equal(a->im, b->im); -} - -void fp2_copy(fp2_t* x, const fp2_t* y) -{ - fp_copy(x->re, y->re); - fp_copy(x->im, y->im); -} - -fp2_t fp2_non_residue() -{ // 2 + i is a quadratic non-residue for p1913 - fp_t one = {0}; - fp2_t res; - - one[0] = 1; - fp_tomont(one, one); - fp_add(res.re, one, one); - fp_copy(res.im, one); - return res; -} - -void fp2_add(fp2_t* x, const fp2_t* y, const fp2_t* z) -{ - fp_add(x->re, y->re, z->re); - fp_add(x->im, y->im, z->im); -} - -void fp2_sub(fp2_t* x, const fp2_t* y, const fp2_t* z) -{ - fp_sub(x->re, y->re, z->re); - fp_sub(x->im, y->im, z->im); -} - -void fp2_neg(fp2_t* x, const fp2_t* y) -{ - fp_neg(x->re, y->re); - fp_neg(x->im, y->im); -} - -void fp2_mul(fp2_t* x, const fp2_t* y, const fp2_t* z) -{ - fp_t t0, t1; - - fp_add(t0, y->re, y->im); - fp_add(t1, z->re, z->im); - fp_mul(t0, t0, t1); - fp_mul(t1, y->im, z->im); - fp_mul(x->re, y->re, z->re); - fp_sub(x->im, t0, t1); - fp_sub(x->im, x->im, x->re); - fp_sub(x->re, x->re, t1); -} - -void fp2_sqr(fp2_t* x, const fp2_t* y) -{ - fp_t sum, diff; - - fp_add(sum, y->re, y->im); - fp_sub(diff, y->re, y->im); - fp_mul(x->im, y->re, y->im); - fp_add(x->im, x->im, x->im); - fp_mul(x->re, sum, diff); -} - -void fp2_inv(fp2_t* x) -{ - fp_t t0, t1; - - fp_sqr(t0, x->re); - fp_sqr(t1, x->im); - fp_add(t0, t0, t1); - fp_inv(t0); - fp_mul(x->re, x->re, t0); - fp_mul(x->im, x->im, t0); - fp_neg(x->im, x->im); -} - -bool fp2_is_square(const fp2_t* x) -{ - fp_t t0, t1; - - fp_sqr(t0, x->re); - fp_sqr(t1, x->im); - fp_add(t0, t0, t1); - - return fp_is_square(t0); -} - -void fp2_frob(fp2_t* x, const fp2_t* y) -{ - memcpy((digit_t*)x->re, (digit_t*)y->re, NWORDS_FIELD*RADIX/8); - fp_neg(x->im, y->im); -} - -void fp2_tomont(fp2_t* x, const fp2_t* y) -{ - fp_tomont(x->re, y->re); - fp_tomont(x->im, y->im); -} - -void fp2_frommont(fp2_t* x, const fp2_t* y) -{ - fp_frommont(x->re, y->re); - fp_frommont(x->im, y->im); -} - -// NOTE: old, non-constant-time implementation. Could be optimized -void fp2_sqrt(fp2_t* x) -{ - fp_t sdelta, re, tmp1, tmp2, inv2, im; - - if (fp_is_zero(x->im)) { - if (fp_is_square(x->re)) { - fp_sqrt(x->re); - return; - } else { - fp_neg(x->im, x->re); - fp_sqrt(x->im); - fp_set(x->re, 0); - return; - } - } - - // sdelta = sqrt(re^2 + im^2) - fp_sqr(sdelta, x->re); - fp_sqr(tmp1, x->im); - fp_add(sdelta, sdelta, tmp1); - fp_sqrt(sdelta); - - fp_set(inv2, 2); - fp_tomont(inv2, inv2); // inv2 <- 2 - fp_inv(inv2); - fp_add(re, x->re, sdelta); - fp_mul(re, re, inv2); - memcpy((digit_t*)tmp2, (digit_t*)re, NWORDS_FIELD*RADIX/8); - - if (!fp_is_square(tmp2)) { - fp_sub(re, x->re, sdelta); - fp_mul(re, re, inv2); - } - - fp_sqrt(re); - memcpy((digit_t*)im, (digit_t*)re, NWORDS_FIELD*RADIX/8); - - fp_inv(im); - fp_mul(im, im, inv2); - fp_mul(x->im, im, x->im); - memcpy((digit_t*)x->re, (digit_t*)re, NWORDS_FIELD*RADIX/8); -} - -// Lexicographic comparison of two field elements. Returns +1 if x > y, -1 if x < y, 0 if x = y -int fp2_cmp(fp2_t* x, fp2_t* y){ - fp2_t a, b; - fp2_frommont(&a, x); - fp2_frommont(&b, y); - for(int i = NWORDS_FIELD-1; i >= 0; i--){ - if(a.re[i] > b.re[i]) - return 1; - if(a.re[i] < b.re[i]) - return -1; - } - for(int i = NWORDS_FIELD-1; i >= 0; i--){ - if(a.im[i] > b.im[i]) - return 1; - if(a.im[i] < b.im[i]) - return -1; - } - return 0; -} \ No newline at end of file diff --git a/src/gf/ref/lvl1/fp_p1913.c b/src/gf/ref/lvl1/fp_p1913.c deleted file mode 100755 index 0e97cd6..0000000 --- a/src/gf/ref/lvl1/fp_p1913.c +++ /dev/null @@ -1,1876 +0,0 @@ -/* Autogenerated: './src/ExtractionOCaml/word_by_word_montgomery' p1913 64 23920667128620486487914848107166358953830561597426178123910317653495243603967 */ -/* curve description: p1913 */ -/* machine_wordsize = 64 (from "64") */ -/* requested operations: (all) */ -/* m = 0x34e29e286b95d98c33a6a86587407437252c9e49355147ffffffffffffffffff (from "23920667128620486487914848107166358953830561597426178123910317653495243603967") */ -/* */ -/* NOTE: In addition to the bounds specified above each function, all */ -/* functions synthesized for this Montgomery arithmetic require the */ -/* input to be strictly less than the prime modulus (m), and also */ -/* require the input to be in the unique saturated representation. */ -/* All functions also ensure that these two properties are true of */ -/* return values. */ -/* */ -/* Computed values: */ -/* eval z = z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) */ -/* bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) + (z[8] << 64) + (z[9] << 72) + (z[10] << 80) + (z[11] << 88) + (z[12] << 96) + (z[13] << 104) + (z[14] << 112) + (z[15] << 120) + (z[16] << 128) + (z[17] << 136) + (z[18] << 144) + (z[19] << 152) + (z[20] << 160) + (z[21] << 168) + (z[22] << 176) + (z[23] << 184) + (z[24] << 192) + (z[25] << 200) + (z[26] << 208) + (z[27] << 216) + (z[28] << 224) + (z[29] << 232) + (z[30] << 240) + (z[31] << 248) */ -/* twos_complement_eval z = let x1 := z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) in */ -/* if x1 & (2^256-1) < 2^255 then x1 & (2^256-1) else (x1 & (2^256-1)) - 2^256 */ - -#include -typedef unsigned char fiat_p1913_uint1; -typedef signed char fiat_p1913_int1; -#if defined(__GNUC__) || defined(__clang__) -# define FIAT_P1913_FIAT_EXTENSION __extension__ -# define FIAT_P1913_FIAT_INLINE __inline__ -#else -# define FIAT_P1913_FIAT_EXTENSION -# define FIAT_P1913_FIAT_INLINE -#endif - -FIAT_P1913_FIAT_EXTENSION typedef signed __int128 fiat_p1913_int128; -FIAT_P1913_FIAT_EXTENSION typedef unsigned __int128 fiat_p1913_uint128; - -/* The type fiat_p1913_montgomery_domain_field_element is a field element in the Montgomery domain. */ -/* Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] */ -typedef uint64_t fiat_p1913_montgomery_domain_field_element[4]; - -/* The type fiat_p1913_non_montgomery_domain_field_element is a field element NOT in the Montgomery domain. */ -/* Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] */ -typedef uint64_t fiat_p1913_non_montgomery_domain_field_element[4]; - -#if (-1 & 3) != 3 -#error "This code only works on a two's complement system" -#endif - - -/* - * The function fiat_p1913_addcarryx_u64 is an addition with carry. - * - * Postconditions: - * out1 = (arg1 + arg2 + arg3) mod 2^64 - * out2 = ⌊(arg1 + arg2 + arg3) / 2^64⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffffffffffff] - * arg3: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - * out2: [0x0 ~> 0x1] - */ -void fiat_p1913_addcarryx_u64(uint64_t* out1, fiat_p1913_uint1* out2, fiat_p1913_uint1 arg1, uint64_t arg2, uint64_t arg3) { - fiat_p1913_uint128 x1; - uint64_t x2; - fiat_p1913_uint1 x3; - x1 = ((arg1 + (fiat_p1913_uint128)arg2) + arg3); - x2 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff)); - x3 = (fiat_p1913_uint1)(x1 >> 64); - *out1 = x2; - *out2 = x3; -} - -/* - * The function fiat_p1913_subborrowx_u64 is a subtraction with borrow. - * - * Postconditions: - * out1 = (-arg1 + arg2 + -arg3) mod 2^64 - * out2 = -⌊(-arg1 + arg2 + -arg3) / 2^64⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffffffffffff] - * arg3: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - * out2: [0x0 ~> 0x1] - */ -void fiat_p1913_subborrowx_u64(uint64_t* out1, fiat_p1913_uint1* out2, fiat_p1913_uint1 arg1, uint64_t arg2, uint64_t arg3) { - fiat_p1913_int128 x1; - fiat_p1913_int1 x2; - uint64_t x3; - x1 = ((arg2 - (fiat_p1913_int128)arg1) - arg3); - x2 = (fiat_p1913_int1)(x1 >> 64); - x3 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff)); - *out1 = x3; - *out2 = (fiat_p1913_uint1)(0x0 - x2); -} - -/* - * The function fiat_p1913_mulx_u64 is a multiplication, returning the full double-width result. - * - * Postconditions: - * out1 = (arg1 * arg2) mod 2^64 - * out2 = ⌊arg1 * arg2 / 2^64⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0xffffffffffffffff] - * arg2: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - * out2: [0x0 ~> 0xffffffffffffffff] - */ -void fiat_p1913_mulx_u64(uint64_t* out1, uint64_t* out2, uint64_t arg1, uint64_t arg2) { - fiat_p1913_uint128 x1; - uint64_t x2; - uint64_t x3; - x1 = ((fiat_p1913_uint128)arg1 * arg2); - x2 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff)); - x3 = (uint64_t)(x1 >> 64); - *out1 = x2; - *out2 = x3; -} - -/* - * The function fiat_p1913_cmovznz_u64 is a single-word conditional move. - * - * Postconditions: - * out1 = (if arg1 = 0 then arg2 else arg3) - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffffffffffff] - * arg3: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - */ -void fiat_p1913_cmovznz_u64(uint64_t* out1, fiat_p1913_uint1 arg1, uint64_t arg2, uint64_t arg3) { - fiat_p1913_uint1 x1; - uint64_t x2; - uint64_t x3; - x1 = (!(!arg1)); - x2 = ((fiat_p1913_int1)(0x0 - x1) & UINT64_C(0xffffffffffffffff)); - x3 = ((x2 & arg3) | ((~x2) & arg2)); - *out1 = x3; -} - -/* - * The function fiat_p1913_mul multiplies two field elements in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * 0 ≤ eval arg2 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg2)) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p1913_mul(fiat_p1913_montgomery_domain_field_element out1, const fiat_p1913_montgomery_domain_field_element arg1, const fiat_p1913_montgomery_domain_field_element arg2) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - fiat_p1913_uint1 x14; - uint64_t x15; - fiat_p1913_uint1 x16; - uint64_t x17; - fiat_p1913_uint1 x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - uint64_t x23; - uint64_t x24; - uint64_t x25; - uint64_t x26; - uint64_t x27; - uint64_t x28; - fiat_p1913_uint1 x29; - uint64_t x30; - fiat_p1913_uint1 x31; - uint64_t x32; - fiat_p1913_uint1 x33; - uint64_t x34; - uint64_t x35; - fiat_p1913_uint1 x36; - uint64_t x37; - fiat_p1913_uint1 x38; - uint64_t x39; - fiat_p1913_uint1 x40; - uint64_t x41; - fiat_p1913_uint1 x42; - uint64_t x43; - fiat_p1913_uint1 x44; - uint64_t x45; - uint64_t x46; - uint64_t x47; - uint64_t x48; - uint64_t x49; - uint64_t x50; - uint64_t x51; - uint64_t x52; - uint64_t x53; - fiat_p1913_uint1 x54; - uint64_t x55; - fiat_p1913_uint1 x56; - uint64_t x57; - fiat_p1913_uint1 x58; - uint64_t x59; - uint64_t x60; - fiat_p1913_uint1 x61; - uint64_t x62; - fiat_p1913_uint1 x63; - uint64_t x64; - fiat_p1913_uint1 x65; - uint64_t x66; - fiat_p1913_uint1 x67; - uint64_t x68; - fiat_p1913_uint1 x69; - uint64_t x70; - uint64_t x71; - uint64_t x72; - uint64_t x73; - uint64_t x74; - uint64_t x75; - uint64_t x76; - uint64_t x77; - uint64_t x78; - fiat_p1913_uint1 x79; - uint64_t x80; - fiat_p1913_uint1 x81; - uint64_t x82; - fiat_p1913_uint1 x83; - uint64_t x84; - uint64_t x85; - fiat_p1913_uint1 x86; - uint64_t x87; - fiat_p1913_uint1 x88; - uint64_t x89; - fiat_p1913_uint1 x90; - uint64_t x91; - fiat_p1913_uint1 x92; - uint64_t x93; - fiat_p1913_uint1 x94; - uint64_t x95; - uint64_t x96; - uint64_t x97; - uint64_t x98; - uint64_t x99; - uint64_t x100; - uint64_t x101; - uint64_t x102; - uint64_t x103; - uint64_t x104; - fiat_p1913_uint1 x105; - uint64_t x106; - fiat_p1913_uint1 x107; - uint64_t x108; - fiat_p1913_uint1 x109; - uint64_t x110; - uint64_t x111; - fiat_p1913_uint1 x112; - uint64_t x113; - fiat_p1913_uint1 x114; - uint64_t x115; - fiat_p1913_uint1 x116; - uint64_t x117; - fiat_p1913_uint1 x118; - uint64_t x119; - fiat_p1913_uint1 x120; - uint64_t x121; - uint64_t x122; - uint64_t x123; - uint64_t x124; - uint64_t x125; - uint64_t x126; - uint64_t x127; - uint64_t x128; - uint64_t x129; - fiat_p1913_uint1 x130; - uint64_t x131; - fiat_p1913_uint1 x132; - uint64_t x133; - fiat_p1913_uint1 x134; - uint64_t x135; - uint64_t x136; - fiat_p1913_uint1 x137; - uint64_t x138; - fiat_p1913_uint1 x139; - uint64_t x140; - fiat_p1913_uint1 x141; - uint64_t x142; - fiat_p1913_uint1 x143; - uint64_t x144; - fiat_p1913_uint1 x145; - uint64_t x146; - uint64_t x147; - uint64_t x148; - uint64_t x149; - uint64_t x150; - uint64_t x151; - uint64_t x152; - uint64_t x153; - uint64_t x154; - uint64_t x155; - fiat_p1913_uint1 x156; - uint64_t x157; - fiat_p1913_uint1 x158; - uint64_t x159; - fiat_p1913_uint1 x160; - uint64_t x161; - uint64_t x162; - fiat_p1913_uint1 x163; - uint64_t x164; - fiat_p1913_uint1 x165; - uint64_t x166; - fiat_p1913_uint1 x167; - uint64_t x168; - fiat_p1913_uint1 x169; - uint64_t x170; - fiat_p1913_uint1 x171; - uint64_t x172; - uint64_t x173; - uint64_t x174; - uint64_t x175; - uint64_t x176; - uint64_t x177; - uint64_t x178; - uint64_t x179; - uint64_t x180; - fiat_p1913_uint1 x181; - uint64_t x182; - fiat_p1913_uint1 x183; - uint64_t x184; - fiat_p1913_uint1 x185; - uint64_t x186; - uint64_t x187; - fiat_p1913_uint1 x188; - uint64_t x189; - fiat_p1913_uint1 x190; - uint64_t x191; - fiat_p1913_uint1 x192; - uint64_t x193; - fiat_p1913_uint1 x194; - uint64_t x195; - fiat_p1913_uint1 x196; - uint64_t x197; - uint64_t x198; - fiat_p1913_uint1 x199; - uint64_t x200; - fiat_p1913_uint1 x201; - uint64_t x202; - fiat_p1913_uint1 x203; - uint64_t x204; - fiat_p1913_uint1 x205; - uint64_t x206; - fiat_p1913_uint1 x207; - uint64_t x208; - uint64_t x209; - uint64_t x210; - uint64_t x211; - x1 = (arg1[1]); - x2 = (arg1[2]); - x3 = (arg1[3]); - x4 = (arg1[0]); - fiat_p1913_mulx_u64(&x5, &x6, x4, (arg2[3])); - fiat_p1913_mulx_u64(&x7, &x8, x4, (arg2[2])); - fiat_p1913_mulx_u64(&x9, &x10, x4, (arg2[1])); - fiat_p1913_mulx_u64(&x11, &x12, x4, (arg2[0])); - fiat_p1913_addcarryx_u64(&x13, &x14, 0x0, x12, x9); - fiat_p1913_addcarryx_u64(&x15, &x16, x14, x10, x7); - fiat_p1913_addcarryx_u64(&x17, &x18, x16, x8, x5); - x19 = (x18 + x6); - fiat_p1913_mulx_u64(&x20, &x21, x11, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x22, &x23, x11, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x24, &x25, x11, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x26, &x27, x11, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x28, &x29, 0x0, x27, x24); - fiat_p1913_addcarryx_u64(&x30, &x31, x29, x25, x22); - fiat_p1913_addcarryx_u64(&x32, &x33, x31, x23, x20); - x34 = (x33 + x21); - fiat_p1913_addcarryx_u64(&x35, &x36, 0x0, x11, x26); - fiat_p1913_addcarryx_u64(&x37, &x38, x36, x13, x28); - fiat_p1913_addcarryx_u64(&x39, &x40, x38, x15, x30); - fiat_p1913_addcarryx_u64(&x41, &x42, x40, x17, x32); - fiat_p1913_addcarryx_u64(&x43, &x44, x42, x19, x34); - fiat_p1913_mulx_u64(&x45, &x46, x1, (arg2[3])); - fiat_p1913_mulx_u64(&x47, &x48, x1, (arg2[2])); - fiat_p1913_mulx_u64(&x49, &x50, x1, (arg2[1])); - fiat_p1913_mulx_u64(&x51, &x52, x1, (arg2[0])); - fiat_p1913_addcarryx_u64(&x53, &x54, 0x0, x52, x49); - fiat_p1913_addcarryx_u64(&x55, &x56, x54, x50, x47); - fiat_p1913_addcarryx_u64(&x57, &x58, x56, x48, x45); - x59 = (x58 + x46); - fiat_p1913_addcarryx_u64(&x60, &x61, 0x0, x37, x51); - fiat_p1913_addcarryx_u64(&x62, &x63, x61, x39, x53); - fiat_p1913_addcarryx_u64(&x64, &x65, x63, x41, x55); - fiat_p1913_addcarryx_u64(&x66, &x67, x65, x43, x57); - fiat_p1913_addcarryx_u64(&x68, &x69, x67, x44, x59); - fiat_p1913_mulx_u64(&x70, &x71, x60, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x72, &x73, x60, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x74, &x75, x60, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x76, &x77, x60, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x78, &x79, 0x0, x77, x74); - fiat_p1913_addcarryx_u64(&x80, &x81, x79, x75, x72); - fiat_p1913_addcarryx_u64(&x82, &x83, x81, x73, x70); - x84 = (x83 + x71); - fiat_p1913_addcarryx_u64(&x85, &x86, 0x0, x60, x76); - fiat_p1913_addcarryx_u64(&x87, &x88, x86, x62, x78); - fiat_p1913_addcarryx_u64(&x89, &x90, x88, x64, x80); - fiat_p1913_addcarryx_u64(&x91, &x92, x90, x66, x82); - fiat_p1913_addcarryx_u64(&x93, &x94, x92, x68, x84); - x95 = ((uint64_t)x94 + x69); - fiat_p1913_mulx_u64(&x96, &x97, x2, (arg2[3])); - fiat_p1913_mulx_u64(&x98, &x99, x2, (arg2[2])); - fiat_p1913_mulx_u64(&x100, &x101, x2, (arg2[1])); - fiat_p1913_mulx_u64(&x102, &x103, x2, (arg2[0])); - fiat_p1913_addcarryx_u64(&x104, &x105, 0x0, x103, x100); - fiat_p1913_addcarryx_u64(&x106, &x107, x105, x101, x98); - fiat_p1913_addcarryx_u64(&x108, &x109, x107, x99, x96); - x110 = (x109 + x97); - fiat_p1913_addcarryx_u64(&x111, &x112, 0x0, x87, x102); - fiat_p1913_addcarryx_u64(&x113, &x114, x112, x89, x104); - fiat_p1913_addcarryx_u64(&x115, &x116, x114, x91, x106); - fiat_p1913_addcarryx_u64(&x117, &x118, x116, x93, x108); - fiat_p1913_addcarryx_u64(&x119, &x120, x118, x95, x110); - fiat_p1913_mulx_u64(&x121, &x122, x111, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x123, &x124, x111, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x125, &x126, x111, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x127, &x128, x111, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x129, &x130, 0x0, x128, x125); - fiat_p1913_addcarryx_u64(&x131, &x132, x130, x126, x123); - fiat_p1913_addcarryx_u64(&x133, &x134, x132, x124, x121); - x135 = (x134 + x122); - fiat_p1913_addcarryx_u64(&x136, &x137, 0x0, x111, x127); - fiat_p1913_addcarryx_u64(&x138, &x139, x137, x113, x129); - fiat_p1913_addcarryx_u64(&x140, &x141, x139, x115, x131); - fiat_p1913_addcarryx_u64(&x142, &x143, x141, x117, x133); - fiat_p1913_addcarryx_u64(&x144, &x145, x143, x119, x135); - x146 = ((uint64_t)x145 + x120); - fiat_p1913_mulx_u64(&x147, &x148, x3, (arg2[3])); - fiat_p1913_mulx_u64(&x149, &x150, x3, (arg2[2])); - fiat_p1913_mulx_u64(&x151, &x152, x3, (arg2[1])); - fiat_p1913_mulx_u64(&x153, &x154, x3, (arg2[0])); - fiat_p1913_addcarryx_u64(&x155, &x156, 0x0, x154, x151); - fiat_p1913_addcarryx_u64(&x157, &x158, x156, x152, x149); - fiat_p1913_addcarryx_u64(&x159, &x160, x158, x150, x147); - x161 = (x160 + x148); - fiat_p1913_addcarryx_u64(&x162, &x163, 0x0, x138, x153); - fiat_p1913_addcarryx_u64(&x164, &x165, x163, x140, x155); - fiat_p1913_addcarryx_u64(&x166, &x167, x165, x142, x157); - fiat_p1913_addcarryx_u64(&x168, &x169, x167, x144, x159); - fiat_p1913_addcarryx_u64(&x170, &x171, x169, x146, x161); - fiat_p1913_mulx_u64(&x172, &x173, x162, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x174, &x175, x162, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x176, &x177, x162, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x178, &x179, x162, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x180, &x181, 0x0, x179, x176); - fiat_p1913_addcarryx_u64(&x182, &x183, x181, x177, x174); - fiat_p1913_addcarryx_u64(&x184, &x185, x183, x175, x172); - x186 = (x185 + x173); - fiat_p1913_addcarryx_u64(&x187, &x188, 0x0, x162, x178); - fiat_p1913_addcarryx_u64(&x189, &x190, x188, x164, x180); - fiat_p1913_addcarryx_u64(&x191, &x192, x190, x166, x182); - fiat_p1913_addcarryx_u64(&x193, &x194, x192, x168, x184); - fiat_p1913_addcarryx_u64(&x195, &x196, x194, x170, x186); - x197 = ((uint64_t)x196 + x171); - fiat_p1913_subborrowx_u64(&x198, &x199, 0x0, x189, UINT64_C(0xffffffffffffffff)); - fiat_p1913_subborrowx_u64(&x200, &x201, x199, x191, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_subborrowx_u64(&x202, &x203, x201, x193, UINT64_C(0x33a6a86587407437)); - fiat_p1913_subborrowx_u64(&x204, &x205, x203, x195, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_subborrowx_u64(&x206, &x207, x205, x197, 0x0); - fiat_p1913_cmovznz_u64(&x208, x207, x198, x189); - fiat_p1913_cmovznz_u64(&x209, x207, x200, x191); - fiat_p1913_cmovznz_u64(&x210, x207, x202, x193); - fiat_p1913_cmovznz_u64(&x211, x207, x204, x195); - out1[0] = x208; - out1[1] = x209; - out1[2] = x210; - out1[3] = x211; -} - -/* - * The function fiat_p1913_square squares a field element in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg1)) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p1913_square(fiat_p1913_montgomery_domain_field_element out1, const fiat_p1913_montgomery_domain_field_element arg1) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - fiat_p1913_uint1 x14; - uint64_t x15; - fiat_p1913_uint1 x16; - uint64_t x17; - fiat_p1913_uint1 x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - uint64_t x23; - uint64_t x24; - uint64_t x25; - uint64_t x26; - uint64_t x27; - uint64_t x28; - fiat_p1913_uint1 x29; - uint64_t x30; - fiat_p1913_uint1 x31; - uint64_t x32; - fiat_p1913_uint1 x33; - uint64_t x34; - uint64_t x35; - fiat_p1913_uint1 x36; - uint64_t x37; - fiat_p1913_uint1 x38; - uint64_t x39; - fiat_p1913_uint1 x40; - uint64_t x41; - fiat_p1913_uint1 x42; - uint64_t x43; - fiat_p1913_uint1 x44; - uint64_t x45; - uint64_t x46; - uint64_t x47; - uint64_t x48; - uint64_t x49; - uint64_t x50; - uint64_t x51; - uint64_t x52; - uint64_t x53; - fiat_p1913_uint1 x54; - uint64_t x55; - fiat_p1913_uint1 x56; - uint64_t x57; - fiat_p1913_uint1 x58; - uint64_t x59; - uint64_t x60; - fiat_p1913_uint1 x61; - uint64_t x62; - fiat_p1913_uint1 x63; - uint64_t x64; - fiat_p1913_uint1 x65; - uint64_t x66; - fiat_p1913_uint1 x67; - uint64_t x68; - fiat_p1913_uint1 x69; - uint64_t x70; - uint64_t x71; - uint64_t x72; - uint64_t x73; - uint64_t x74; - uint64_t x75; - uint64_t x76; - uint64_t x77; - uint64_t x78; - fiat_p1913_uint1 x79; - uint64_t x80; - fiat_p1913_uint1 x81; - uint64_t x82; - fiat_p1913_uint1 x83; - uint64_t x84; - uint64_t x85; - fiat_p1913_uint1 x86; - uint64_t x87; - fiat_p1913_uint1 x88; - uint64_t x89; - fiat_p1913_uint1 x90; - uint64_t x91; - fiat_p1913_uint1 x92; - uint64_t x93; - fiat_p1913_uint1 x94; - uint64_t x95; - uint64_t x96; - uint64_t x97; - uint64_t x98; - uint64_t x99; - uint64_t x100; - uint64_t x101; - uint64_t x102; - uint64_t x103; - uint64_t x104; - fiat_p1913_uint1 x105; - uint64_t x106; - fiat_p1913_uint1 x107; - uint64_t x108; - fiat_p1913_uint1 x109; - uint64_t x110; - uint64_t x111; - fiat_p1913_uint1 x112; - uint64_t x113; - fiat_p1913_uint1 x114; - uint64_t x115; - fiat_p1913_uint1 x116; - uint64_t x117; - fiat_p1913_uint1 x118; - uint64_t x119; - fiat_p1913_uint1 x120; - uint64_t x121; - uint64_t x122; - uint64_t x123; - uint64_t x124; - uint64_t x125; - uint64_t x126; - uint64_t x127; - uint64_t x128; - uint64_t x129; - fiat_p1913_uint1 x130; - uint64_t x131; - fiat_p1913_uint1 x132; - uint64_t x133; - fiat_p1913_uint1 x134; - uint64_t x135; - uint64_t x136; - fiat_p1913_uint1 x137; - uint64_t x138; - fiat_p1913_uint1 x139; - uint64_t x140; - fiat_p1913_uint1 x141; - uint64_t x142; - fiat_p1913_uint1 x143; - uint64_t x144; - fiat_p1913_uint1 x145; - uint64_t x146; - uint64_t x147; - uint64_t x148; - uint64_t x149; - uint64_t x150; - uint64_t x151; - uint64_t x152; - uint64_t x153; - uint64_t x154; - uint64_t x155; - fiat_p1913_uint1 x156; - uint64_t x157; - fiat_p1913_uint1 x158; - uint64_t x159; - fiat_p1913_uint1 x160; - uint64_t x161; - uint64_t x162; - fiat_p1913_uint1 x163; - uint64_t x164; - fiat_p1913_uint1 x165; - uint64_t x166; - fiat_p1913_uint1 x167; - uint64_t x168; - fiat_p1913_uint1 x169; - uint64_t x170; - fiat_p1913_uint1 x171; - uint64_t x172; - uint64_t x173; - uint64_t x174; - uint64_t x175; - uint64_t x176; - uint64_t x177; - uint64_t x178; - uint64_t x179; - uint64_t x180; - fiat_p1913_uint1 x181; - uint64_t x182; - fiat_p1913_uint1 x183; - uint64_t x184; - fiat_p1913_uint1 x185; - uint64_t x186; - uint64_t x187; - fiat_p1913_uint1 x188; - uint64_t x189; - fiat_p1913_uint1 x190; - uint64_t x191; - fiat_p1913_uint1 x192; - uint64_t x193; - fiat_p1913_uint1 x194; - uint64_t x195; - fiat_p1913_uint1 x196; - uint64_t x197; - uint64_t x198; - fiat_p1913_uint1 x199; - uint64_t x200; - fiat_p1913_uint1 x201; - uint64_t x202; - fiat_p1913_uint1 x203; - uint64_t x204; - fiat_p1913_uint1 x205; - uint64_t x206; - fiat_p1913_uint1 x207; - uint64_t x208; - uint64_t x209; - uint64_t x210; - uint64_t x211; - x1 = (arg1[1]); - x2 = (arg1[2]); - x3 = (arg1[3]); - x4 = (arg1[0]); - fiat_p1913_mulx_u64(&x5, &x6, x4, (arg1[3])); - fiat_p1913_mulx_u64(&x7, &x8, x4, (arg1[2])); - fiat_p1913_mulx_u64(&x9, &x10, x4, (arg1[1])); - fiat_p1913_mulx_u64(&x11, &x12, x4, (arg1[0])); - fiat_p1913_addcarryx_u64(&x13, &x14, 0x0, x12, x9); - fiat_p1913_addcarryx_u64(&x15, &x16, x14, x10, x7); - fiat_p1913_addcarryx_u64(&x17, &x18, x16, x8, x5); - x19 = (x18 + x6); - fiat_p1913_mulx_u64(&x20, &x21, x11, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x22, &x23, x11, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x24, &x25, x11, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x26, &x27, x11, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x28, &x29, 0x0, x27, x24); - fiat_p1913_addcarryx_u64(&x30, &x31, x29, x25, x22); - fiat_p1913_addcarryx_u64(&x32, &x33, x31, x23, x20); - x34 = (x33 + x21); - fiat_p1913_addcarryx_u64(&x35, &x36, 0x0, x11, x26); - fiat_p1913_addcarryx_u64(&x37, &x38, x36, x13, x28); - fiat_p1913_addcarryx_u64(&x39, &x40, x38, x15, x30); - fiat_p1913_addcarryx_u64(&x41, &x42, x40, x17, x32); - fiat_p1913_addcarryx_u64(&x43, &x44, x42, x19, x34); - fiat_p1913_mulx_u64(&x45, &x46, x1, (arg1[3])); - fiat_p1913_mulx_u64(&x47, &x48, x1, (arg1[2])); - fiat_p1913_mulx_u64(&x49, &x50, x1, (arg1[1])); - fiat_p1913_mulx_u64(&x51, &x52, x1, (arg1[0])); - fiat_p1913_addcarryx_u64(&x53, &x54, 0x0, x52, x49); - fiat_p1913_addcarryx_u64(&x55, &x56, x54, x50, x47); - fiat_p1913_addcarryx_u64(&x57, &x58, x56, x48, x45); - x59 = (x58 + x46); - fiat_p1913_addcarryx_u64(&x60, &x61, 0x0, x37, x51); - fiat_p1913_addcarryx_u64(&x62, &x63, x61, x39, x53); - fiat_p1913_addcarryx_u64(&x64, &x65, x63, x41, x55); - fiat_p1913_addcarryx_u64(&x66, &x67, x65, x43, x57); - fiat_p1913_addcarryx_u64(&x68, &x69, x67, x44, x59); - fiat_p1913_mulx_u64(&x70, &x71, x60, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x72, &x73, x60, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x74, &x75, x60, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x76, &x77, x60, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x78, &x79, 0x0, x77, x74); - fiat_p1913_addcarryx_u64(&x80, &x81, x79, x75, x72); - fiat_p1913_addcarryx_u64(&x82, &x83, x81, x73, x70); - x84 = (x83 + x71); - fiat_p1913_addcarryx_u64(&x85, &x86, 0x0, x60, x76); - fiat_p1913_addcarryx_u64(&x87, &x88, x86, x62, x78); - fiat_p1913_addcarryx_u64(&x89, &x90, x88, x64, x80); - fiat_p1913_addcarryx_u64(&x91, &x92, x90, x66, x82); - fiat_p1913_addcarryx_u64(&x93, &x94, x92, x68, x84); - x95 = ((uint64_t)x94 + x69); - fiat_p1913_mulx_u64(&x96, &x97, x2, (arg1[3])); - fiat_p1913_mulx_u64(&x98, &x99, x2, (arg1[2])); - fiat_p1913_mulx_u64(&x100, &x101, x2, (arg1[1])); - fiat_p1913_mulx_u64(&x102, &x103, x2, (arg1[0])); - fiat_p1913_addcarryx_u64(&x104, &x105, 0x0, x103, x100); - fiat_p1913_addcarryx_u64(&x106, &x107, x105, x101, x98); - fiat_p1913_addcarryx_u64(&x108, &x109, x107, x99, x96); - x110 = (x109 + x97); - fiat_p1913_addcarryx_u64(&x111, &x112, 0x0, x87, x102); - fiat_p1913_addcarryx_u64(&x113, &x114, x112, x89, x104); - fiat_p1913_addcarryx_u64(&x115, &x116, x114, x91, x106); - fiat_p1913_addcarryx_u64(&x117, &x118, x116, x93, x108); - fiat_p1913_addcarryx_u64(&x119, &x120, x118, x95, x110); - fiat_p1913_mulx_u64(&x121, &x122, x111, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x123, &x124, x111, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x125, &x126, x111, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x127, &x128, x111, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x129, &x130, 0x0, x128, x125); - fiat_p1913_addcarryx_u64(&x131, &x132, x130, x126, x123); - fiat_p1913_addcarryx_u64(&x133, &x134, x132, x124, x121); - x135 = (x134 + x122); - fiat_p1913_addcarryx_u64(&x136, &x137, 0x0, x111, x127); - fiat_p1913_addcarryx_u64(&x138, &x139, x137, x113, x129); - fiat_p1913_addcarryx_u64(&x140, &x141, x139, x115, x131); - fiat_p1913_addcarryx_u64(&x142, &x143, x141, x117, x133); - fiat_p1913_addcarryx_u64(&x144, &x145, x143, x119, x135); - x146 = ((uint64_t)x145 + x120); - fiat_p1913_mulx_u64(&x147, &x148, x3, (arg1[3])); - fiat_p1913_mulx_u64(&x149, &x150, x3, (arg1[2])); - fiat_p1913_mulx_u64(&x151, &x152, x3, (arg1[1])); - fiat_p1913_mulx_u64(&x153, &x154, x3, (arg1[0])); - fiat_p1913_addcarryx_u64(&x155, &x156, 0x0, x154, x151); - fiat_p1913_addcarryx_u64(&x157, &x158, x156, x152, x149); - fiat_p1913_addcarryx_u64(&x159, &x160, x158, x150, x147); - x161 = (x160 + x148); - fiat_p1913_addcarryx_u64(&x162, &x163, 0x0, x138, x153); - fiat_p1913_addcarryx_u64(&x164, &x165, x163, x140, x155); - fiat_p1913_addcarryx_u64(&x166, &x167, x165, x142, x157); - fiat_p1913_addcarryx_u64(&x168, &x169, x167, x144, x159); - fiat_p1913_addcarryx_u64(&x170, &x171, x169, x146, x161); - fiat_p1913_mulx_u64(&x172, &x173, x162, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x174, &x175, x162, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x176, &x177, x162, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x178, &x179, x162, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x180, &x181, 0x0, x179, x176); - fiat_p1913_addcarryx_u64(&x182, &x183, x181, x177, x174); - fiat_p1913_addcarryx_u64(&x184, &x185, x183, x175, x172); - x186 = (x185 + x173); - fiat_p1913_addcarryx_u64(&x187, &x188, 0x0, x162, x178); - fiat_p1913_addcarryx_u64(&x189, &x190, x188, x164, x180); - fiat_p1913_addcarryx_u64(&x191, &x192, x190, x166, x182); - fiat_p1913_addcarryx_u64(&x193, &x194, x192, x168, x184); - fiat_p1913_addcarryx_u64(&x195, &x196, x194, x170, x186); - x197 = ((uint64_t)x196 + x171); - fiat_p1913_subborrowx_u64(&x198, &x199, 0x0, x189, UINT64_C(0xffffffffffffffff)); - fiat_p1913_subborrowx_u64(&x200, &x201, x199, x191, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_subborrowx_u64(&x202, &x203, x201, x193, UINT64_C(0x33a6a86587407437)); - fiat_p1913_subborrowx_u64(&x204, &x205, x203, x195, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_subborrowx_u64(&x206, &x207, x205, x197, 0x0); - fiat_p1913_cmovznz_u64(&x208, x207, x198, x189); - fiat_p1913_cmovznz_u64(&x209, x207, x200, x191); - fiat_p1913_cmovznz_u64(&x210, x207, x202, x193); - fiat_p1913_cmovznz_u64(&x211, x207, x204, x195); - out1[0] = x208; - out1[1] = x209; - out1[2] = x210; - out1[3] = x211; -} - -/* - * The function fiat_p1913_add adds two field elements in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * 0 ≤ eval arg2 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) + eval (from_montgomery arg2)) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p1913_add(fiat_p1913_montgomery_domain_field_element out1, const fiat_p1913_montgomery_domain_field_element arg1, const fiat_p1913_montgomery_domain_field_element arg2) { - uint64_t x1; - fiat_p1913_uint1 x2; - uint64_t x3; - fiat_p1913_uint1 x4; - uint64_t x5; - fiat_p1913_uint1 x6; - uint64_t x7; - fiat_p1913_uint1 x8; - uint64_t x9; - fiat_p1913_uint1 x10; - uint64_t x11; - fiat_p1913_uint1 x12; - uint64_t x13; - fiat_p1913_uint1 x14; - uint64_t x15; - fiat_p1913_uint1 x16; - uint64_t x17; - fiat_p1913_uint1 x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - fiat_p1913_addcarryx_u64(&x1, &x2, 0x0, (arg1[0]), (arg2[0])); - fiat_p1913_addcarryx_u64(&x3, &x4, x2, (arg1[1]), (arg2[1])); - fiat_p1913_addcarryx_u64(&x5, &x6, x4, (arg1[2]), (arg2[2])); - fiat_p1913_addcarryx_u64(&x7, &x8, x6, (arg1[3]), (arg2[3])); - fiat_p1913_subborrowx_u64(&x9, &x10, 0x0, x1, UINT64_C(0xffffffffffffffff)); - fiat_p1913_subborrowx_u64(&x11, &x12, x10, x3, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_subborrowx_u64(&x13, &x14, x12, x5, UINT64_C(0x33a6a86587407437)); - fiat_p1913_subborrowx_u64(&x15, &x16, x14, x7, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_subborrowx_u64(&x17, &x18, x16, x8, 0x0); - fiat_p1913_cmovznz_u64(&x19, x18, x9, x1); - fiat_p1913_cmovznz_u64(&x20, x18, x11, x3); - fiat_p1913_cmovznz_u64(&x21, x18, x13, x5); - fiat_p1913_cmovznz_u64(&x22, x18, x15, x7); - out1[0] = x19; - out1[1] = x20; - out1[2] = x21; - out1[3] = x22; -} - -/* - * The function fiat_p1913_sub subtracts two field elements in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * 0 ≤ eval arg2 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) - eval (from_montgomery arg2)) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p1913_sub(fiat_p1913_montgomery_domain_field_element out1, const fiat_p1913_montgomery_domain_field_element arg1, const fiat_p1913_montgomery_domain_field_element arg2) { - uint64_t x1; - fiat_p1913_uint1 x2; - uint64_t x3; - fiat_p1913_uint1 x4; - uint64_t x5; - fiat_p1913_uint1 x6; - uint64_t x7; - fiat_p1913_uint1 x8; - uint64_t x9; - uint64_t x10; - fiat_p1913_uint1 x11; - uint64_t x12; - fiat_p1913_uint1 x13; - uint64_t x14; - fiat_p1913_uint1 x15; - uint64_t x16; - fiat_p1913_uint1 x17; - fiat_p1913_subborrowx_u64(&x1, &x2, 0x0, (arg1[0]), (arg2[0])); - fiat_p1913_subborrowx_u64(&x3, &x4, x2, (arg1[1]), (arg2[1])); - fiat_p1913_subborrowx_u64(&x5, &x6, x4, (arg1[2]), (arg2[2])); - fiat_p1913_subborrowx_u64(&x7, &x8, x6, (arg1[3]), (arg2[3])); - fiat_p1913_cmovznz_u64(&x9, x8, 0x0, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x10, &x11, 0x0, x1, x9); - fiat_p1913_addcarryx_u64(&x12, &x13, x11, x3, (x9 & UINT64_C(0x252c9e49355147ff))); - fiat_p1913_addcarryx_u64(&x14, &x15, x13, x5, (x9 & UINT64_C(0x33a6a86587407437))); - fiat_p1913_addcarryx_u64(&x16, &x17, x15, x7, (x9 & UINT64_C(0x34e29e286b95d98c))); - out1[0] = x10; - out1[1] = x12; - out1[2] = x14; - out1[3] = x16; -} - -/* - * The function fiat_p1913_opp negates a field element in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval (from_montgomery out1) mod m = -eval (from_montgomery arg1) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p1913_opp(fiat_p1913_montgomery_domain_field_element out1, const fiat_p1913_montgomery_domain_field_element arg1) { - uint64_t x1; - fiat_p1913_uint1 x2; - uint64_t x3; - fiat_p1913_uint1 x4; - uint64_t x5; - fiat_p1913_uint1 x6; - uint64_t x7; - fiat_p1913_uint1 x8; - uint64_t x9; - uint64_t x10; - fiat_p1913_uint1 x11; - uint64_t x12; - fiat_p1913_uint1 x13; - uint64_t x14; - fiat_p1913_uint1 x15; - uint64_t x16; - fiat_p1913_uint1 x17; - fiat_p1913_subborrowx_u64(&x1, &x2, 0x0, 0x0, (arg1[0])); - fiat_p1913_subborrowx_u64(&x3, &x4, x2, 0x0, (arg1[1])); - fiat_p1913_subborrowx_u64(&x5, &x6, x4, 0x0, (arg1[2])); - fiat_p1913_subborrowx_u64(&x7, &x8, x6, 0x0, (arg1[3])); - fiat_p1913_cmovznz_u64(&x9, x8, 0x0, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x10, &x11, 0x0, x1, x9); - fiat_p1913_addcarryx_u64(&x12, &x13, x11, x3, (x9 & UINT64_C(0x252c9e49355147ff))); - fiat_p1913_addcarryx_u64(&x14, &x15, x13, x5, (x9 & UINT64_C(0x33a6a86587407437))); - fiat_p1913_addcarryx_u64(&x16, &x17, x15, x7, (x9 & UINT64_C(0x34e29e286b95d98c))); - out1[0] = x10; - out1[1] = x12; - out1[2] = x14; - out1[3] = x16; -} - -/* - * The function fiat_p1913_from_montgomery translates a field element out of the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval out1 mod m = (eval arg1 * ((2^64)⁻¹ mod m)^4) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p1913_from_montgomery(fiat_p1913_non_montgomery_domain_field_element out1, const fiat_p1913_montgomery_domain_field_element arg1) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - fiat_p1913_uint1 x11; - uint64_t x12; - fiat_p1913_uint1 x13; - uint64_t x14; - fiat_p1913_uint1 x15; - uint64_t x16; - fiat_p1913_uint1 x17; - uint64_t x18; - fiat_p1913_uint1 x19; - uint64_t x20; - fiat_p1913_uint1 x21; - uint64_t x22; - fiat_p1913_uint1 x23; - uint64_t x24; - fiat_p1913_uint1 x25; - uint64_t x26; - fiat_p1913_uint1 x27; - uint64_t x28; - fiat_p1913_uint1 x29; - uint64_t x30; - uint64_t x31; - uint64_t x32; - uint64_t x33; - uint64_t x34; - uint64_t x35; - uint64_t x36; - uint64_t x37; - uint64_t x38; - fiat_p1913_uint1 x39; - uint64_t x40; - fiat_p1913_uint1 x41; - uint64_t x42; - fiat_p1913_uint1 x43; - uint64_t x44; - fiat_p1913_uint1 x45; - uint64_t x46; - fiat_p1913_uint1 x47; - uint64_t x48; - fiat_p1913_uint1 x49; - uint64_t x50; - fiat_p1913_uint1 x51; - uint64_t x52; - fiat_p1913_uint1 x53; - uint64_t x54; - fiat_p1913_uint1 x55; - uint64_t x56; - fiat_p1913_uint1 x57; - uint64_t x58; - uint64_t x59; - uint64_t x60; - uint64_t x61; - uint64_t x62; - uint64_t x63; - uint64_t x64; - uint64_t x65; - uint64_t x66; - fiat_p1913_uint1 x67; - uint64_t x68; - fiat_p1913_uint1 x69; - uint64_t x70; - fiat_p1913_uint1 x71; - uint64_t x72; - fiat_p1913_uint1 x73; - uint64_t x74; - fiat_p1913_uint1 x75; - uint64_t x76; - fiat_p1913_uint1 x77; - uint64_t x78; - fiat_p1913_uint1 x79; - uint64_t x80; - fiat_p1913_uint1 x81; - uint64_t x82; - fiat_p1913_uint1 x83; - uint64_t x84; - fiat_p1913_uint1 x85; - uint64_t x86; - uint64_t x87; - uint64_t x88; - uint64_t x89; - uint64_t x90; - uint64_t x91; - uint64_t x92; - uint64_t x93; - uint64_t x94; - fiat_p1913_uint1 x95; - uint64_t x96; - fiat_p1913_uint1 x97; - uint64_t x98; - fiat_p1913_uint1 x99; - uint64_t x100; - fiat_p1913_uint1 x101; - uint64_t x102; - fiat_p1913_uint1 x103; - uint64_t x104; - fiat_p1913_uint1 x105; - uint64_t x106; - fiat_p1913_uint1 x107; - uint64_t x108; - uint64_t x109; - fiat_p1913_uint1 x110; - uint64_t x111; - fiat_p1913_uint1 x112; - uint64_t x113; - fiat_p1913_uint1 x114; - uint64_t x115; - fiat_p1913_uint1 x116; - uint64_t x117; - fiat_p1913_uint1 x118; - uint64_t x119; - uint64_t x120; - uint64_t x121; - uint64_t x122; - x1 = (arg1[0]); - fiat_p1913_mulx_u64(&x2, &x3, x1, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x4, &x5, x1, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x6, &x7, x1, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x8, &x9, x1, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x10, &x11, 0x0, x9, x6); - fiat_p1913_addcarryx_u64(&x12, &x13, x11, x7, x4); - fiat_p1913_addcarryx_u64(&x14, &x15, x13, x5, x2); - fiat_p1913_addcarryx_u64(&x16, &x17, 0x0, x1, x8); - fiat_p1913_addcarryx_u64(&x18, &x19, x17, 0x0, x10); - fiat_p1913_addcarryx_u64(&x20, &x21, x19, 0x0, x12); - fiat_p1913_addcarryx_u64(&x22, &x23, x21, 0x0, x14); - fiat_p1913_addcarryx_u64(&x24, &x25, 0x0, x18, (arg1[1])); - fiat_p1913_addcarryx_u64(&x26, &x27, x25, x20, 0x0); - fiat_p1913_addcarryx_u64(&x28, &x29, x27, x22, 0x0); - fiat_p1913_mulx_u64(&x30, &x31, x24, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x32, &x33, x24, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x34, &x35, x24, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x36, &x37, x24, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x38, &x39, 0x0, x37, x34); - fiat_p1913_addcarryx_u64(&x40, &x41, x39, x35, x32); - fiat_p1913_addcarryx_u64(&x42, &x43, x41, x33, x30); - fiat_p1913_addcarryx_u64(&x44, &x45, 0x0, x24, x36); - fiat_p1913_addcarryx_u64(&x46, &x47, x45, x26, x38); - fiat_p1913_addcarryx_u64(&x48, &x49, x47, x28, x40); - fiat_p1913_addcarryx_u64(&x50, &x51, x49, (x29 + (x23 + (x15 + x3))), x42); - fiat_p1913_addcarryx_u64(&x52, &x53, 0x0, x46, (arg1[2])); - fiat_p1913_addcarryx_u64(&x54, &x55, x53, x48, 0x0); - fiat_p1913_addcarryx_u64(&x56, &x57, x55, x50, 0x0); - fiat_p1913_mulx_u64(&x58, &x59, x52, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x60, &x61, x52, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x62, &x63, x52, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x64, &x65, x52, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x66, &x67, 0x0, x65, x62); - fiat_p1913_addcarryx_u64(&x68, &x69, x67, x63, x60); - fiat_p1913_addcarryx_u64(&x70, &x71, x69, x61, x58); - fiat_p1913_addcarryx_u64(&x72, &x73, 0x0, x52, x64); - fiat_p1913_addcarryx_u64(&x74, &x75, x73, x54, x66); - fiat_p1913_addcarryx_u64(&x76, &x77, x75, x56, x68); - fiat_p1913_addcarryx_u64(&x78, &x79, x77, (x57 + (x51 + (x43 + x31))), x70); - fiat_p1913_addcarryx_u64(&x80, &x81, 0x0, x74, (arg1[3])); - fiat_p1913_addcarryx_u64(&x82, &x83, x81, x76, 0x0); - fiat_p1913_addcarryx_u64(&x84, &x85, x83, x78, 0x0); - fiat_p1913_mulx_u64(&x86, &x87, x80, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x88, &x89, x80, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x90, &x91, x80, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x92, &x93, x80, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x94, &x95, 0x0, x93, x90); - fiat_p1913_addcarryx_u64(&x96, &x97, x95, x91, x88); - fiat_p1913_addcarryx_u64(&x98, &x99, x97, x89, x86); - fiat_p1913_addcarryx_u64(&x100, &x101, 0x0, x80, x92); - fiat_p1913_addcarryx_u64(&x102, &x103, x101, x82, x94); - fiat_p1913_addcarryx_u64(&x104, &x105, x103, x84, x96); - fiat_p1913_addcarryx_u64(&x106, &x107, x105, (x85 + (x79 + (x71 + x59))), x98); - x108 = (x107 + (x99 + x87)); - fiat_p1913_subborrowx_u64(&x109, &x110, 0x0, x102, UINT64_C(0xffffffffffffffff)); - fiat_p1913_subborrowx_u64(&x111, &x112, x110, x104, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_subborrowx_u64(&x113, &x114, x112, x106, UINT64_C(0x33a6a86587407437)); - fiat_p1913_subborrowx_u64(&x115, &x116, x114, x108, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_subborrowx_u64(&x117, &x118, x116, 0x0, 0x0); - fiat_p1913_cmovznz_u64(&x119, x118, x109, x102); - fiat_p1913_cmovznz_u64(&x120, x118, x111, x104); - fiat_p1913_cmovznz_u64(&x121, x118, x113, x106); - fiat_p1913_cmovznz_u64(&x122, x118, x115, x108); - out1[0] = x119; - out1[1] = x120; - out1[2] = x121; - out1[3] = x122; -} - -/* - * The function fiat_p1913_to_montgomery translates a field element into the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval (from_montgomery out1) mod m = eval arg1 mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p1913_to_montgomery(fiat_p1913_montgomery_domain_field_element out1, const fiat_p1913_non_montgomery_domain_field_element arg1) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - fiat_p1913_uint1 x14; - uint64_t x15; - fiat_p1913_uint1 x16; - uint64_t x17; - fiat_p1913_uint1 x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - uint64_t x23; - uint64_t x24; - uint64_t x25; - uint64_t x26; - uint64_t x27; - fiat_p1913_uint1 x28; - uint64_t x29; - fiat_p1913_uint1 x30; - uint64_t x31; - fiat_p1913_uint1 x32; - uint64_t x33; - fiat_p1913_uint1 x34; - uint64_t x35; - fiat_p1913_uint1 x36; - uint64_t x37; - fiat_p1913_uint1 x38; - uint64_t x39; - fiat_p1913_uint1 x40; - uint64_t x41; - uint64_t x42; - uint64_t x43; - uint64_t x44; - uint64_t x45; - uint64_t x46; - uint64_t x47; - uint64_t x48; - uint64_t x49; - fiat_p1913_uint1 x50; - uint64_t x51; - fiat_p1913_uint1 x52; - uint64_t x53; - fiat_p1913_uint1 x54; - uint64_t x55; - fiat_p1913_uint1 x56; - uint64_t x57; - fiat_p1913_uint1 x58; - uint64_t x59; - fiat_p1913_uint1 x60; - uint64_t x61; - fiat_p1913_uint1 x62; - uint64_t x63; - uint64_t x64; - uint64_t x65; - uint64_t x66; - uint64_t x67; - uint64_t x68; - uint64_t x69; - uint64_t x70; - uint64_t x71; - fiat_p1913_uint1 x72; - uint64_t x73; - fiat_p1913_uint1 x74; - uint64_t x75; - fiat_p1913_uint1 x76; - uint64_t x77; - fiat_p1913_uint1 x78; - uint64_t x79; - fiat_p1913_uint1 x80; - uint64_t x81; - fiat_p1913_uint1 x82; - uint64_t x83; - fiat_p1913_uint1 x84; - uint64_t x85; - uint64_t x86; - uint64_t x87; - uint64_t x88; - uint64_t x89; - uint64_t x90; - uint64_t x91; - uint64_t x92; - uint64_t x93; - fiat_p1913_uint1 x94; - uint64_t x95; - fiat_p1913_uint1 x96; - uint64_t x97; - fiat_p1913_uint1 x98; - uint64_t x99; - fiat_p1913_uint1 x100; - uint64_t x101; - fiat_p1913_uint1 x102; - uint64_t x103; - fiat_p1913_uint1 x104; - uint64_t x105; - fiat_p1913_uint1 x106; - uint64_t x107; - uint64_t x108; - uint64_t x109; - uint64_t x110; - uint64_t x111; - uint64_t x112; - uint64_t x113; - uint64_t x114; - uint64_t x115; - fiat_p1913_uint1 x116; - uint64_t x117; - fiat_p1913_uint1 x118; - uint64_t x119; - fiat_p1913_uint1 x120; - uint64_t x121; - fiat_p1913_uint1 x122; - uint64_t x123; - fiat_p1913_uint1 x124; - uint64_t x125; - fiat_p1913_uint1 x126; - uint64_t x127; - fiat_p1913_uint1 x128; - uint64_t x129; - uint64_t x130; - uint64_t x131; - uint64_t x132; - uint64_t x133; - uint64_t x134; - uint64_t x135; - uint64_t x136; - uint64_t x137; - fiat_p1913_uint1 x138; - uint64_t x139; - fiat_p1913_uint1 x140; - uint64_t x141; - fiat_p1913_uint1 x142; - uint64_t x143; - fiat_p1913_uint1 x144; - uint64_t x145; - fiat_p1913_uint1 x146; - uint64_t x147; - fiat_p1913_uint1 x148; - uint64_t x149; - fiat_p1913_uint1 x150; - uint64_t x151; - uint64_t x152; - uint64_t x153; - uint64_t x154; - uint64_t x155; - uint64_t x156; - uint64_t x157; - uint64_t x158; - uint64_t x159; - fiat_p1913_uint1 x160; - uint64_t x161; - fiat_p1913_uint1 x162; - uint64_t x163; - fiat_p1913_uint1 x164; - uint64_t x165; - fiat_p1913_uint1 x166; - uint64_t x167; - fiat_p1913_uint1 x168; - uint64_t x169; - fiat_p1913_uint1 x170; - uint64_t x171; - fiat_p1913_uint1 x172; - uint64_t x173; - uint64_t x174; - fiat_p1913_uint1 x175; - uint64_t x176; - fiat_p1913_uint1 x177; - uint64_t x178; - fiat_p1913_uint1 x179; - uint64_t x180; - fiat_p1913_uint1 x181; - uint64_t x182; - fiat_p1913_uint1 x183; - uint64_t x184; - uint64_t x185; - uint64_t x186; - uint64_t x187; - x1 = (arg1[1]); - x2 = (arg1[2]); - x3 = (arg1[3]); - x4 = (arg1[0]); - fiat_p1913_mulx_u64(&x5, &x6, x4, UINT64_C(0xd72e7d67c30cd3d)); - fiat_p1913_mulx_u64(&x7, &x8, x4, UINT64_C(0x30a841ab0920655d)); - fiat_p1913_mulx_u64(&x9, &x10, x4, UINT64_C(0x20afd6c1025a1c2e)); - fiat_p1913_mulx_u64(&x11, &x12, x4, UINT64_C(0x233625ae400674d4)); - fiat_p1913_addcarryx_u64(&x13, &x14, 0x0, x12, x9); - fiat_p1913_addcarryx_u64(&x15, &x16, x14, x10, x7); - fiat_p1913_addcarryx_u64(&x17, &x18, x16, x8, x5); - fiat_p1913_mulx_u64(&x19, &x20, x11, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x21, &x22, x11, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x23, &x24, x11, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x25, &x26, x11, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x27, &x28, 0x0, x26, x23); - fiat_p1913_addcarryx_u64(&x29, &x30, x28, x24, x21); - fiat_p1913_addcarryx_u64(&x31, &x32, x30, x22, x19); - fiat_p1913_addcarryx_u64(&x33, &x34, 0x0, x11, x25); - fiat_p1913_addcarryx_u64(&x35, &x36, x34, x13, x27); - fiat_p1913_addcarryx_u64(&x37, &x38, x36, x15, x29); - fiat_p1913_addcarryx_u64(&x39, &x40, x38, x17, x31); - fiat_p1913_mulx_u64(&x41, &x42, x1, UINT64_C(0xd72e7d67c30cd3d)); - fiat_p1913_mulx_u64(&x43, &x44, x1, UINT64_C(0x30a841ab0920655d)); - fiat_p1913_mulx_u64(&x45, &x46, x1, UINT64_C(0x20afd6c1025a1c2e)); - fiat_p1913_mulx_u64(&x47, &x48, x1, UINT64_C(0x233625ae400674d4)); - fiat_p1913_addcarryx_u64(&x49, &x50, 0x0, x48, x45); - fiat_p1913_addcarryx_u64(&x51, &x52, x50, x46, x43); - fiat_p1913_addcarryx_u64(&x53, &x54, x52, x44, x41); - fiat_p1913_addcarryx_u64(&x55, &x56, 0x0, x35, x47); - fiat_p1913_addcarryx_u64(&x57, &x58, x56, x37, x49); - fiat_p1913_addcarryx_u64(&x59, &x60, x58, x39, x51); - fiat_p1913_addcarryx_u64(&x61, &x62, x60, ((x40 + (x18 + x6)) + (x32 + x20)), x53); - fiat_p1913_mulx_u64(&x63, &x64, x55, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x65, &x66, x55, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x67, &x68, x55, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x69, &x70, x55, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x71, &x72, 0x0, x70, x67); - fiat_p1913_addcarryx_u64(&x73, &x74, x72, x68, x65); - fiat_p1913_addcarryx_u64(&x75, &x76, x74, x66, x63); - fiat_p1913_addcarryx_u64(&x77, &x78, 0x0, x55, x69); - fiat_p1913_addcarryx_u64(&x79, &x80, x78, x57, x71); - fiat_p1913_addcarryx_u64(&x81, &x82, x80, x59, x73); - fiat_p1913_addcarryx_u64(&x83, &x84, x82, x61, x75); - fiat_p1913_mulx_u64(&x85, &x86, x2, UINT64_C(0xd72e7d67c30cd3d)); - fiat_p1913_mulx_u64(&x87, &x88, x2, UINT64_C(0x30a841ab0920655d)); - fiat_p1913_mulx_u64(&x89, &x90, x2, UINT64_C(0x20afd6c1025a1c2e)); - fiat_p1913_mulx_u64(&x91, &x92, x2, UINT64_C(0x233625ae400674d4)); - fiat_p1913_addcarryx_u64(&x93, &x94, 0x0, x92, x89); - fiat_p1913_addcarryx_u64(&x95, &x96, x94, x90, x87); - fiat_p1913_addcarryx_u64(&x97, &x98, x96, x88, x85); - fiat_p1913_addcarryx_u64(&x99, &x100, 0x0, x79, x91); - fiat_p1913_addcarryx_u64(&x101, &x102, x100, x81, x93); - fiat_p1913_addcarryx_u64(&x103, &x104, x102, x83, x95); - fiat_p1913_addcarryx_u64(&x105, &x106, x104, ((x84 + (x62 + (x54 + x42))) + (x76 + x64)), x97); - fiat_p1913_mulx_u64(&x107, &x108, x99, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x109, &x110, x99, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x111, &x112, x99, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x113, &x114, x99, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x115, &x116, 0x0, x114, x111); - fiat_p1913_addcarryx_u64(&x117, &x118, x116, x112, x109); - fiat_p1913_addcarryx_u64(&x119, &x120, x118, x110, x107); - fiat_p1913_addcarryx_u64(&x121, &x122, 0x0, x99, x113); - fiat_p1913_addcarryx_u64(&x123, &x124, x122, x101, x115); - fiat_p1913_addcarryx_u64(&x125, &x126, x124, x103, x117); - fiat_p1913_addcarryx_u64(&x127, &x128, x126, x105, x119); - fiat_p1913_mulx_u64(&x129, &x130, x3, UINT64_C(0xd72e7d67c30cd3d)); - fiat_p1913_mulx_u64(&x131, &x132, x3, UINT64_C(0x30a841ab0920655d)); - fiat_p1913_mulx_u64(&x133, &x134, x3, UINT64_C(0x20afd6c1025a1c2e)); - fiat_p1913_mulx_u64(&x135, &x136, x3, UINT64_C(0x233625ae400674d4)); - fiat_p1913_addcarryx_u64(&x137, &x138, 0x0, x136, x133); - fiat_p1913_addcarryx_u64(&x139, &x140, x138, x134, x131); - fiat_p1913_addcarryx_u64(&x141, &x142, x140, x132, x129); - fiat_p1913_addcarryx_u64(&x143, &x144, 0x0, x123, x135); - fiat_p1913_addcarryx_u64(&x145, &x146, x144, x125, x137); - fiat_p1913_addcarryx_u64(&x147, &x148, x146, x127, x139); - fiat_p1913_addcarryx_u64(&x149, &x150, x148, ((x128 + (x106 + (x98 + x86))) + (x120 + x108)), x141); - fiat_p1913_mulx_u64(&x151, &x152, x143, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x153, &x154, x143, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x155, &x156, x143, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x157, &x158, x143, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x159, &x160, 0x0, x158, x155); - fiat_p1913_addcarryx_u64(&x161, &x162, x160, x156, x153); - fiat_p1913_addcarryx_u64(&x163, &x164, x162, x154, x151); - fiat_p1913_addcarryx_u64(&x165, &x166, 0x0, x143, x157); - fiat_p1913_addcarryx_u64(&x167, &x168, x166, x145, x159); - fiat_p1913_addcarryx_u64(&x169, &x170, x168, x147, x161); - fiat_p1913_addcarryx_u64(&x171, &x172, x170, x149, x163); - x173 = ((x172 + (x150 + (x142 + x130))) + (x164 + x152)); - fiat_p1913_subborrowx_u64(&x174, &x175, 0x0, x167, UINT64_C(0xffffffffffffffff)); - fiat_p1913_subborrowx_u64(&x176, &x177, x175, x169, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_subborrowx_u64(&x178, &x179, x177, x171, UINT64_C(0x33a6a86587407437)); - fiat_p1913_subborrowx_u64(&x180, &x181, x179, x173, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_subborrowx_u64(&x182, &x183, x181, 0x0, 0x0); - fiat_p1913_cmovznz_u64(&x184, x183, x174, x167); - fiat_p1913_cmovznz_u64(&x185, x183, x176, x169); - fiat_p1913_cmovznz_u64(&x186, x183, x178, x171); - fiat_p1913_cmovznz_u64(&x187, x183, x180, x173); - out1[0] = x184; - out1[1] = x185; - out1[2] = x186; - out1[3] = x187; -} - -/* - * The function fiat_p1913_nonzero outputs a single non-zero word if the input is non-zero and zero otherwise. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * out1 = 0 ↔ eval (from_montgomery arg1) mod m = 0 - * - * Input Bounds: - * arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - */ -void fiat_p1913_nonzero(uint64_t* out1, const uint64_t arg1[4]) { - uint64_t x1; - x1 = ((arg1[0]) | ((arg1[1]) | ((arg1[2]) | (arg1[3])))); - *out1 = x1; -} - -/* - * The function fiat_p1913_selectznz is a multi-limb conditional select. - * - * Postconditions: - * out1 = (if arg1 = 0 then arg2 else arg3) - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * arg3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * Output Bounds: - * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - */ -void fiat_p1913_selectznz(uint64_t out1[4], fiat_p1913_uint1 arg1, const uint64_t arg2[4], const uint64_t arg3[4]) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - fiat_p1913_cmovznz_u64(&x1, arg1, (arg2[0]), (arg3[0])); - fiat_p1913_cmovznz_u64(&x2, arg1, (arg2[1]), (arg3[1])); - fiat_p1913_cmovznz_u64(&x3, arg1, (arg2[2]), (arg3[2])); - fiat_p1913_cmovznz_u64(&x4, arg1, (arg2[3]), (arg3[3])); - out1[0] = x1; - out1[1] = x2; - out1[2] = x3; - out1[3] = x4; -} - -/* - * The function fiat_p1913_to_bytes serializes a field element NOT in the Montgomery domain to bytes in little-endian order. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * out1 = map (λ x, ⌊((eval arg1 mod m) mod 2^(8 * (x + 1))) / 2^(8 * x)⌋) [0..31] - * - * Input Bounds: - * arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0x3fffffffffffffff]] - * Output Bounds: - * out1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x3f]] - */ -void fiat_p1913_to_bytes(uint8_t out1[32], const uint64_t arg1[4]) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint8_t x5; - uint64_t x6; - uint8_t x7; - uint64_t x8; - uint8_t x9; - uint64_t x10; - uint8_t x11; - uint64_t x12; - uint8_t x13; - uint64_t x14; - uint8_t x15; - uint64_t x16; - uint8_t x17; - uint8_t x18; - uint8_t x19; - uint64_t x20; - uint8_t x21; - uint64_t x22; - uint8_t x23; - uint64_t x24; - uint8_t x25; - uint64_t x26; - uint8_t x27; - uint64_t x28; - uint8_t x29; - uint64_t x30; - uint8_t x31; - uint8_t x32; - uint8_t x33; - uint64_t x34; - uint8_t x35; - uint64_t x36; - uint8_t x37; - uint64_t x38; - uint8_t x39; - uint64_t x40; - uint8_t x41; - uint64_t x42; - uint8_t x43; - uint64_t x44; - uint8_t x45; - uint8_t x46; - uint8_t x47; - uint64_t x48; - uint8_t x49; - uint64_t x50; - uint8_t x51; - uint64_t x52; - uint8_t x53; - uint64_t x54; - uint8_t x55; - uint64_t x56; - uint8_t x57; - uint64_t x58; - uint8_t x59; - uint8_t x60; - x1 = (arg1[3]); - x2 = (arg1[2]); - x3 = (arg1[1]); - x4 = (arg1[0]); - x5 = (uint8_t)(x4 & UINT8_C(0xff)); - x6 = (x4 >> 8); - x7 = (uint8_t)(x6 & UINT8_C(0xff)); - x8 = (x6 >> 8); - x9 = (uint8_t)(x8 & UINT8_C(0xff)); - x10 = (x8 >> 8); - x11 = (uint8_t)(x10 & UINT8_C(0xff)); - x12 = (x10 >> 8); - x13 = (uint8_t)(x12 & UINT8_C(0xff)); - x14 = (x12 >> 8); - x15 = (uint8_t)(x14 & UINT8_C(0xff)); - x16 = (x14 >> 8); - x17 = (uint8_t)(x16 & UINT8_C(0xff)); - x18 = (uint8_t)(x16 >> 8); - x19 = (uint8_t)(x3 & UINT8_C(0xff)); - x20 = (x3 >> 8); - x21 = (uint8_t)(x20 & UINT8_C(0xff)); - x22 = (x20 >> 8); - x23 = (uint8_t)(x22 & UINT8_C(0xff)); - x24 = (x22 >> 8); - x25 = (uint8_t)(x24 & UINT8_C(0xff)); - x26 = (x24 >> 8); - x27 = (uint8_t)(x26 & UINT8_C(0xff)); - x28 = (x26 >> 8); - x29 = (uint8_t)(x28 & UINT8_C(0xff)); - x30 = (x28 >> 8); - x31 = (uint8_t)(x30 & UINT8_C(0xff)); - x32 = (uint8_t)(x30 >> 8); - x33 = (uint8_t)(x2 & UINT8_C(0xff)); - x34 = (x2 >> 8); - x35 = (uint8_t)(x34 & UINT8_C(0xff)); - x36 = (x34 >> 8); - x37 = (uint8_t)(x36 & UINT8_C(0xff)); - x38 = (x36 >> 8); - x39 = (uint8_t)(x38 & UINT8_C(0xff)); - x40 = (x38 >> 8); - x41 = (uint8_t)(x40 & UINT8_C(0xff)); - x42 = (x40 >> 8); - x43 = (uint8_t)(x42 & UINT8_C(0xff)); - x44 = (x42 >> 8); - x45 = (uint8_t)(x44 & UINT8_C(0xff)); - x46 = (uint8_t)(x44 >> 8); - x47 = (uint8_t)(x1 & UINT8_C(0xff)); - x48 = (x1 >> 8); - x49 = (uint8_t)(x48 & UINT8_C(0xff)); - x50 = (x48 >> 8); - x51 = (uint8_t)(x50 & UINT8_C(0xff)); - x52 = (x50 >> 8); - x53 = (uint8_t)(x52 & UINT8_C(0xff)); - x54 = (x52 >> 8); - x55 = (uint8_t)(x54 & UINT8_C(0xff)); - x56 = (x54 >> 8); - x57 = (uint8_t)(x56 & UINT8_C(0xff)); - x58 = (x56 >> 8); - x59 = (uint8_t)(x58 & UINT8_C(0xff)); - x60 = (uint8_t)(x58 >> 8); - out1[0] = x5; - out1[1] = x7; - out1[2] = x9; - out1[3] = x11; - out1[4] = x13; - out1[5] = x15; - out1[6] = x17; - out1[7] = x18; - out1[8] = x19; - out1[9] = x21; - out1[10] = x23; - out1[11] = x25; - out1[12] = x27; - out1[13] = x29; - out1[14] = x31; - out1[15] = x32; - out1[16] = x33; - out1[17] = x35; - out1[18] = x37; - out1[19] = x39; - out1[20] = x41; - out1[21] = x43; - out1[22] = x45; - out1[23] = x46; - out1[24] = x47; - out1[25] = x49; - out1[26] = x51; - out1[27] = x53; - out1[28] = x55; - out1[29] = x57; - out1[30] = x59; - out1[31] = x60; -} - -/* - * The function fiat_p1913_from_bytes deserializes a field element NOT in the Montgomery domain from bytes in little-endian order. - * - * Preconditions: - * 0 ≤ bytes_eval arg1 < m - * Postconditions: - * eval out1 mod m = bytes_eval arg1 mod m - * 0 ≤ eval out1 < m - * - * Input Bounds: - * arg1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x3f]] - * Output Bounds: - * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0x3fffffffffffffff]] - */ -void fiat_p1913_from_bytes(uint64_t out1[4], const uint8_t arg1[32]) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint8_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - uint64_t x14; - uint64_t x15; - uint8_t x16; - uint64_t x17; - uint64_t x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - uint64_t x23; - uint8_t x24; - uint64_t x25; - uint64_t x26; - uint64_t x27; - uint64_t x28; - uint64_t x29; - uint64_t x30; - uint64_t x31; - uint8_t x32; - uint64_t x33; - uint64_t x34; - uint64_t x35; - uint64_t x36; - uint64_t x37; - uint64_t x38; - uint64_t x39; - uint64_t x40; - uint64_t x41; - uint64_t x42; - uint64_t x43; - uint64_t x44; - uint64_t x45; - uint64_t x46; - uint64_t x47; - uint64_t x48; - uint64_t x49; - uint64_t x50; - uint64_t x51; - uint64_t x52; - uint64_t x53; - uint64_t x54; - uint64_t x55; - uint64_t x56; - uint64_t x57; - uint64_t x58; - uint64_t x59; - uint64_t x60; - x1 = ((uint64_t)(arg1[31]) << 56); - x2 = ((uint64_t)(arg1[30]) << 48); - x3 = ((uint64_t)(arg1[29]) << 40); - x4 = ((uint64_t)(arg1[28]) << 32); - x5 = ((uint64_t)(arg1[27]) << 24); - x6 = ((uint64_t)(arg1[26]) << 16); - x7 = ((uint64_t)(arg1[25]) << 8); - x8 = (arg1[24]); - x9 = ((uint64_t)(arg1[23]) << 56); - x10 = ((uint64_t)(arg1[22]) << 48); - x11 = ((uint64_t)(arg1[21]) << 40); - x12 = ((uint64_t)(arg1[20]) << 32); - x13 = ((uint64_t)(arg1[19]) << 24); - x14 = ((uint64_t)(arg1[18]) << 16); - x15 = ((uint64_t)(arg1[17]) << 8); - x16 = (arg1[16]); - x17 = ((uint64_t)(arg1[15]) << 56); - x18 = ((uint64_t)(arg1[14]) << 48); - x19 = ((uint64_t)(arg1[13]) << 40); - x20 = ((uint64_t)(arg1[12]) << 32); - x21 = ((uint64_t)(arg1[11]) << 24); - x22 = ((uint64_t)(arg1[10]) << 16); - x23 = ((uint64_t)(arg1[9]) << 8); - x24 = (arg1[8]); - x25 = ((uint64_t)(arg1[7]) << 56); - x26 = ((uint64_t)(arg1[6]) << 48); - x27 = ((uint64_t)(arg1[5]) << 40); - x28 = ((uint64_t)(arg1[4]) << 32); - x29 = ((uint64_t)(arg1[3]) << 24); - x30 = ((uint64_t)(arg1[2]) << 16); - x31 = ((uint64_t)(arg1[1]) << 8); - x32 = (arg1[0]); - x33 = (x31 + (uint64_t)x32); - x34 = (x30 + x33); - x35 = (x29 + x34); - x36 = (x28 + x35); - x37 = (x27 + x36); - x38 = (x26 + x37); - x39 = (x25 + x38); - x40 = (x23 + (uint64_t)x24); - x41 = (x22 + x40); - x42 = (x21 + x41); - x43 = (x20 + x42); - x44 = (x19 + x43); - x45 = (x18 + x44); - x46 = (x17 + x45); - x47 = (x15 + (uint64_t)x16); - x48 = (x14 + x47); - x49 = (x13 + x48); - x50 = (x12 + x49); - x51 = (x11 + x50); - x52 = (x10 + x51); - x53 = (x9 + x52); - x54 = (x7 + (uint64_t)x8); - x55 = (x6 + x54); - x56 = (x5 + x55); - x57 = (x4 + x56); - x58 = (x3 + x57); - x59 = (x2 + x58); - x60 = (x1 + x59); - out1[0] = x39; - out1[1] = x46; - out1[2] = x53; - out1[3] = x60; -} - -/* - * The function fiat_p1913_set_one returns the field element one in the Montgomery domain. - * - * Postconditions: - * eval (from_montgomery out1) mod m = 1 mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p1913_set_one(fiat_p1913_montgomery_domain_field_element out1) { - out1[0] = 0x4; - out1[1] = UINT64_C(0x6b4d86db2abae000); - out1[2] = UINT64_C(0x31655e69e2fe2f23); - out1[3] = UINT64_C(0x2c75875e51a899cf); -} - -void fp_add(uint64_t* out, const uint64_t* a, const uint64_t* b) { - fiat_p1913_add(out, a, b); -} - -void fp_sub(uint64_t* out, const uint64_t* a, const uint64_t* b) { - fiat_p1913_sub(out, a, b); -} - -void fp_sqr(uint64_t* out, const uint64_t* a) { - fiat_p1913_square(out, a); -} - -void fp_mul(uint64_t* out, const uint64_t* a, const uint64_t* b) { - fiat_p1913_mul(out, a, b); -} - -void fp_tomont(uint64_t* out, const uint64_t* a) { - fiat_p1913_to_montgomery(out, a); -} - -void fp_frommont(uint64_t* out, const uint64_t* a) { - fiat_p1913_from_montgomery(out, a); -} - -void fp_mont_setone(uint64_t* out) { - fiat_p1913_set_one(out); -} \ No newline at end of file diff --git a/src/gf/ref/lvl1/fp_p3923.c b/src/gf/ref/lvl1/fp_p3923.c deleted file mode 100644 index 2703d72..0000000 --- a/src/gf/ref/lvl1/fp_p3923.c +++ /dev/null @@ -1,1781 +0,0 @@ -/* Autogenerated: 'src/ExtractionOCaml/word_by_word_montgomery' p3923 64 23759399264157352358673788613307970528646815114090876784643387662192449945599 */ -/* curve description: p3923 */ -/* machine_wordsize = 64 (from "64") */ -/* requested operations: (all) */ -/* m = 0x348757eadf5c9530b7311a63633f03db535805fa6e9e48b1ffffffffffffffff (from "23759399264157352358673788613307970528646815114090876784643387662192449945599") */ -/* */ -/* NOTE: In addition to the bounds specified above each function, all */ -/* functions synthesized for this Montgomery arithmetic require the */ -/* input to be strictly less than the prime modulus (m), and also */ -/* require the input to be in the unique saturated representation. */ -/* All functions also ensure that these two properties are true of */ -/* return values. */ -/* */ -/* Computed values: */ -/* eval z = z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) */ -/* bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) + (z[8] << 64) + (z[9] << 72) + (z[10] << 80) + (z[11] << 88) + (z[12] << 96) + (z[13] << 104) + (z[14] << 112) + (z[15] << 120) + (z[16] << 128) + (z[17] << 136) + (z[18] << 144) + (z[19] << 152) + (z[20] << 160) + (z[21] << 168) + (z[22] << 176) + (z[23] << 184) + (z[24] << 192) + (z[25] << 200) + (z[26] << 208) + (z[27] << 216) + (z[28] << 224) + (z[29] << 232) + (z[30] << 240) + (z[31] << 248) */ -/* twos_complement_eval z = let x1 := z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) in */ -/* if x1 & (2^256-1) < 2^255 then x1 & (2^256-1) else (x1 & (2^256-1)) - 2^256 */ - -#include -typedef unsigned char fiat_p3923_uint1; -typedef signed char fiat_p3923_int1; -#if defined(__GNUC__) || defined(__clang__) -# define FIAT_P3923_FIAT_EXTENSION __extension__ -# define FIAT_P3923_FIAT_INLINE __inline__ -#else -# define FIAT_P3923_FIAT_EXTENSION -# define FIAT_P3923_FIAT_INLINE -#endif - -FIAT_P3923_FIAT_EXTENSION typedef signed __int128 fiat_p3923_int128; -FIAT_P3923_FIAT_EXTENSION typedef unsigned __int128 fiat_p3923_uint128; - -/* The type fiat_p3923_montgomery_domain_field_element is a field element in the Montgomery domain. */ -/* Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] */ -typedef uint64_t fiat_p3923_montgomery_domain_field_element[4]; - -/* The type fiat_p3923_non_montgomery_domain_field_element is a field element NOT in the Montgomery domain. */ -/* Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] */ -typedef uint64_t fiat_p3923_non_montgomery_domain_field_element[4]; - -#if (-1 & 3) != 3 -#error "This code only works on a two's complement system" -#endif - - -/* - * The function fiat_p3923_addcarryx_u64 is an addition with carry. - * - * Postconditions: - * out1 = (arg1 + arg2 + arg3) mod 2^64 - * out2 = ⌊(arg1 + arg2 + arg3) / 2^64⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffffffffffff] - * arg3: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - * out2: [0x0 ~> 0x1] - */ -static void fiat_p3923_addcarryx_u64(uint64_t* out1, fiat_p3923_uint1* out2, fiat_p3923_uint1 arg1, uint64_t arg2, uint64_t arg3) { - fiat_p3923_uint128 x1; - uint64_t x2; - fiat_p3923_uint1 x3; - x1 = ((arg1 + (fiat_p3923_uint128)arg2) + arg3); - x2 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff)); - x3 = (fiat_p3923_uint1)(x1 >> 64); - *out1 = x2; - *out2 = x3; -} - -/* - * The function fiat_p3923_subborrowx_u64 is a subtraction with borrow. - * - * Postconditions: - * out1 = (-arg1 + arg2 + -arg3) mod 2^64 - * out2 = -⌊(-arg1 + arg2 + -arg3) / 2^64⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffffffffffff] - * arg3: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - * out2: [0x0 ~> 0x1] - */ -static void fiat_p3923_subborrowx_u64(uint64_t* out1, fiat_p3923_uint1* out2, fiat_p3923_uint1 arg1, uint64_t arg2, uint64_t arg3) { - fiat_p3923_int128 x1; - fiat_p3923_int1 x2; - uint64_t x3; - x1 = ((arg2 - (fiat_p3923_int128)arg1) - arg3); - x2 = (fiat_p3923_int1)(x1 >> 64); - x3 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff)); - *out1 = x3; - *out2 = (fiat_p3923_uint1)(0x0 - x2); -} - -/* - * The function fiat_p3923_mulx_u64 is a multiplication, returning the full double-width result. - * - * Postconditions: - * out1 = (arg1 * arg2) mod 2^64 - * out2 = ⌊arg1 * arg2 / 2^64⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0xffffffffffffffff] - * arg2: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - * out2: [0x0 ~> 0xffffffffffffffff] - */ -static void fiat_p3923_mulx_u64(uint64_t* out1, uint64_t* out2, uint64_t arg1, uint64_t arg2) { - fiat_p3923_uint128 x1; - uint64_t x2; - uint64_t x3; - x1 = ((fiat_p3923_uint128)arg1 * arg2); - x2 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff)); - x3 = (uint64_t)(x1 >> 64); - *out1 = x2; - *out2 = x3; -} - -/* - * The function fiat_p3923_cmovznz_u64 is a single-word conditional move. - * - * Postconditions: - * out1 = (if arg1 = 0 then arg2 else arg3) - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffffffffffff] - * arg3: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - */ -static void fiat_p3923_cmovznz_u64(uint64_t* out1, fiat_p3923_uint1 arg1, uint64_t arg2, uint64_t arg3) { - fiat_p3923_uint1 x1; - uint64_t x2; - uint64_t x3; - x1 = (!(!arg1)); - x2 = ((fiat_p3923_int1)(0x0 - x1) & UINT64_C(0xffffffffffffffff)); - x3 = ((x2 & arg3) | ((~x2) & arg2)); - *out1 = x3; -} - -/* - * The function fiat_p3923_mul multiplies two field elements in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * 0 ≤ eval arg2 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg2)) mod m - * 0 ≤ eval out1 < m - * - */ -static void fiat_p3923_mul(fiat_p3923_montgomery_domain_field_element out1, const fiat_p3923_montgomery_domain_field_element arg1, const fiat_p3923_montgomery_domain_field_element arg2) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - fiat_p3923_uint1 x14; - uint64_t x15; - fiat_p3923_uint1 x16; - uint64_t x17; - fiat_p3923_uint1 x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - uint64_t x23; - uint64_t x24; - uint64_t x25; - uint64_t x26; - uint64_t x27; - uint64_t x28; - fiat_p3923_uint1 x29; - uint64_t x30; - fiat_p3923_uint1 x31; - uint64_t x32; - fiat_p3923_uint1 x33; - uint64_t x34; - uint64_t x35; - fiat_p3923_uint1 x36; - uint64_t x37; - fiat_p3923_uint1 x38; - uint64_t x39; - fiat_p3923_uint1 x40; - uint64_t x41; - fiat_p3923_uint1 x42; - uint64_t x43; - fiat_p3923_uint1 x44; - uint64_t x45; - uint64_t x46; - uint64_t x47; - uint64_t x48; - uint64_t x49; - uint64_t x50; - uint64_t x51; - uint64_t x52; - uint64_t x53; - fiat_p3923_uint1 x54; - uint64_t x55; - fiat_p3923_uint1 x56; - uint64_t x57; - fiat_p3923_uint1 x58; - uint64_t x59; - uint64_t x60; - fiat_p3923_uint1 x61; - uint64_t x62; - fiat_p3923_uint1 x63; - uint64_t x64; - fiat_p3923_uint1 x65; - uint64_t x66; - fiat_p3923_uint1 x67; - uint64_t x68; - fiat_p3923_uint1 x69; - uint64_t x70; - uint64_t x71; - uint64_t x72; - uint64_t x73; - uint64_t x74; - uint64_t x75; - uint64_t x76; - uint64_t x77; - uint64_t x78; - fiat_p3923_uint1 x79; - uint64_t x80; - fiat_p3923_uint1 x81; - uint64_t x82; - fiat_p3923_uint1 x83; - uint64_t x84; - uint64_t x85; - fiat_p3923_uint1 x86; - uint64_t x87; - fiat_p3923_uint1 x88; - uint64_t x89; - fiat_p3923_uint1 x90; - uint64_t x91; - fiat_p3923_uint1 x92; - uint64_t x93; - fiat_p3923_uint1 x94; - uint64_t x95; - uint64_t x96; - uint64_t x97; - uint64_t x98; - uint64_t x99; - uint64_t x100; - uint64_t x101; - uint64_t x102; - uint64_t x103; - uint64_t x104; - fiat_p3923_uint1 x105; - uint64_t x106; - fiat_p3923_uint1 x107; - uint64_t x108; - fiat_p3923_uint1 x109; - uint64_t x110; - uint64_t x111; - fiat_p3923_uint1 x112; - uint64_t x113; - fiat_p3923_uint1 x114; - uint64_t x115; - fiat_p3923_uint1 x116; - uint64_t x117; - fiat_p3923_uint1 x118; - uint64_t x119; - fiat_p3923_uint1 x120; - uint64_t x121; - uint64_t x122; - uint64_t x123; - uint64_t x124; - uint64_t x125; - uint64_t x126; - uint64_t x127; - uint64_t x128; - uint64_t x129; - fiat_p3923_uint1 x130; - uint64_t x131; - fiat_p3923_uint1 x132; - uint64_t x133; - fiat_p3923_uint1 x134; - uint64_t x135; - uint64_t x136; - fiat_p3923_uint1 x137; - uint64_t x138; - fiat_p3923_uint1 x139; - uint64_t x140; - fiat_p3923_uint1 x141; - uint64_t x142; - fiat_p3923_uint1 x143; - uint64_t x144; - fiat_p3923_uint1 x145; - uint64_t x146; - uint64_t x147; - uint64_t x148; - uint64_t x149; - uint64_t x150; - uint64_t x151; - uint64_t x152; - uint64_t x153; - uint64_t x154; - uint64_t x155; - fiat_p3923_uint1 x156; - uint64_t x157; - fiat_p3923_uint1 x158; - uint64_t x159; - fiat_p3923_uint1 x160; - uint64_t x161; - uint64_t x162; - fiat_p3923_uint1 x163; - uint64_t x164; - fiat_p3923_uint1 x165; - uint64_t x166; - fiat_p3923_uint1 x167; - uint64_t x168; - fiat_p3923_uint1 x169; - uint64_t x170; - fiat_p3923_uint1 x171; - uint64_t x172; - uint64_t x173; - uint64_t x174; - uint64_t x175; - uint64_t x176; - uint64_t x177; - uint64_t x178; - uint64_t x179; - uint64_t x180; - fiat_p3923_uint1 x181; - uint64_t x182; - fiat_p3923_uint1 x183; - uint64_t x184; - fiat_p3923_uint1 x185; - uint64_t x186; - uint64_t x187; - fiat_p3923_uint1 x188; - uint64_t x189; - fiat_p3923_uint1 x190; - uint64_t x191; - fiat_p3923_uint1 x192; - uint64_t x193; - fiat_p3923_uint1 x194; - uint64_t x195; - fiat_p3923_uint1 x196; - uint64_t x197; - uint64_t x198; - fiat_p3923_uint1 x199; - uint64_t x200; - fiat_p3923_uint1 x201; - uint64_t x202; - fiat_p3923_uint1 x203; - uint64_t x204; - fiat_p3923_uint1 x205; - uint64_t x206; - fiat_p3923_uint1 x207; - uint64_t x208; - uint64_t x209; - uint64_t x210; - uint64_t x211; - x1 = (arg1[1]); - x2 = (arg1[2]); - x3 = (arg1[3]); - x4 = (arg1[0]); - fiat_p3923_mulx_u64(&x5, &x6, x4, (arg2[3])); - fiat_p3923_mulx_u64(&x7, &x8, x4, (arg2[2])); - fiat_p3923_mulx_u64(&x9, &x10, x4, (arg2[1])); - fiat_p3923_mulx_u64(&x11, &x12, x4, (arg2[0])); - fiat_p3923_addcarryx_u64(&x13, &x14, 0x0, x12, x9); - fiat_p3923_addcarryx_u64(&x15, &x16, x14, x10, x7); - fiat_p3923_addcarryx_u64(&x17, &x18, x16, x8, x5); - x19 = (x18 + x6); - fiat_p3923_mulx_u64(&x20, &x21, x11, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x22, &x23, x11, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x24, &x25, x11, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x26, &x27, x11, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x28, &x29, 0x0, x27, x24); - fiat_p3923_addcarryx_u64(&x30, &x31, x29, x25, x22); - fiat_p3923_addcarryx_u64(&x32, &x33, x31, x23, x20); - x34 = (x33 + x21); - fiat_p3923_addcarryx_u64(&x35, &x36, 0x0, x11, x26); - fiat_p3923_addcarryx_u64(&x37, &x38, x36, x13, x28); - fiat_p3923_addcarryx_u64(&x39, &x40, x38, x15, x30); - fiat_p3923_addcarryx_u64(&x41, &x42, x40, x17, x32); - fiat_p3923_addcarryx_u64(&x43, &x44, x42, x19, x34); - fiat_p3923_mulx_u64(&x45, &x46, x1, (arg2[3])); - fiat_p3923_mulx_u64(&x47, &x48, x1, (arg2[2])); - fiat_p3923_mulx_u64(&x49, &x50, x1, (arg2[1])); - fiat_p3923_mulx_u64(&x51, &x52, x1, (arg2[0])); - fiat_p3923_addcarryx_u64(&x53, &x54, 0x0, x52, x49); - fiat_p3923_addcarryx_u64(&x55, &x56, x54, x50, x47); - fiat_p3923_addcarryx_u64(&x57, &x58, x56, x48, x45); - x59 = (x58 + x46); - fiat_p3923_addcarryx_u64(&x60, &x61, 0x0, x37, x51); - fiat_p3923_addcarryx_u64(&x62, &x63, x61, x39, x53); - fiat_p3923_addcarryx_u64(&x64, &x65, x63, x41, x55); - fiat_p3923_addcarryx_u64(&x66, &x67, x65, x43, x57); - fiat_p3923_addcarryx_u64(&x68, &x69, x67, x44, x59); - fiat_p3923_mulx_u64(&x70, &x71, x60, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x72, &x73, x60, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x74, &x75, x60, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x76, &x77, x60, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x78, &x79, 0x0, x77, x74); - fiat_p3923_addcarryx_u64(&x80, &x81, x79, x75, x72); - fiat_p3923_addcarryx_u64(&x82, &x83, x81, x73, x70); - x84 = (x83 + x71); - fiat_p3923_addcarryx_u64(&x85, &x86, 0x0, x60, x76); - fiat_p3923_addcarryx_u64(&x87, &x88, x86, x62, x78); - fiat_p3923_addcarryx_u64(&x89, &x90, x88, x64, x80); - fiat_p3923_addcarryx_u64(&x91, &x92, x90, x66, x82); - fiat_p3923_addcarryx_u64(&x93, &x94, x92, x68, x84); - x95 = ((uint64_t)x94 + x69); - fiat_p3923_mulx_u64(&x96, &x97, x2, (arg2[3])); - fiat_p3923_mulx_u64(&x98, &x99, x2, (arg2[2])); - fiat_p3923_mulx_u64(&x100, &x101, x2, (arg2[1])); - fiat_p3923_mulx_u64(&x102, &x103, x2, (arg2[0])); - fiat_p3923_addcarryx_u64(&x104, &x105, 0x0, x103, x100); - fiat_p3923_addcarryx_u64(&x106, &x107, x105, x101, x98); - fiat_p3923_addcarryx_u64(&x108, &x109, x107, x99, x96); - x110 = (x109 + x97); - fiat_p3923_addcarryx_u64(&x111, &x112, 0x0, x87, x102); - fiat_p3923_addcarryx_u64(&x113, &x114, x112, x89, x104); - fiat_p3923_addcarryx_u64(&x115, &x116, x114, x91, x106); - fiat_p3923_addcarryx_u64(&x117, &x118, x116, x93, x108); - fiat_p3923_addcarryx_u64(&x119, &x120, x118, x95, x110); - fiat_p3923_mulx_u64(&x121, &x122, x111, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x123, &x124, x111, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x125, &x126, x111, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x127, &x128, x111, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x129, &x130, 0x0, x128, x125); - fiat_p3923_addcarryx_u64(&x131, &x132, x130, x126, x123); - fiat_p3923_addcarryx_u64(&x133, &x134, x132, x124, x121); - x135 = (x134 + x122); - fiat_p3923_addcarryx_u64(&x136, &x137, 0x0, x111, x127); - fiat_p3923_addcarryx_u64(&x138, &x139, x137, x113, x129); - fiat_p3923_addcarryx_u64(&x140, &x141, x139, x115, x131); - fiat_p3923_addcarryx_u64(&x142, &x143, x141, x117, x133); - fiat_p3923_addcarryx_u64(&x144, &x145, x143, x119, x135); - x146 = ((uint64_t)x145 + x120); - fiat_p3923_mulx_u64(&x147, &x148, x3, (arg2[3])); - fiat_p3923_mulx_u64(&x149, &x150, x3, (arg2[2])); - fiat_p3923_mulx_u64(&x151, &x152, x3, (arg2[1])); - fiat_p3923_mulx_u64(&x153, &x154, x3, (arg2[0])); - fiat_p3923_addcarryx_u64(&x155, &x156, 0x0, x154, x151); - fiat_p3923_addcarryx_u64(&x157, &x158, x156, x152, x149); - fiat_p3923_addcarryx_u64(&x159, &x160, x158, x150, x147); - x161 = (x160 + x148); - fiat_p3923_addcarryx_u64(&x162, &x163, 0x0, x138, x153); - fiat_p3923_addcarryx_u64(&x164, &x165, x163, x140, x155); - fiat_p3923_addcarryx_u64(&x166, &x167, x165, x142, x157); - fiat_p3923_addcarryx_u64(&x168, &x169, x167, x144, x159); - fiat_p3923_addcarryx_u64(&x170, &x171, x169, x146, x161); - fiat_p3923_mulx_u64(&x172, &x173, x162, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x174, &x175, x162, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x176, &x177, x162, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x178, &x179, x162, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x180, &x181, 0x0, x179, x176); - fiat_p3923_addcarryx_u64(&x182, &x183, x181, x177, x174); - fiat_p3923_addcarryx_u64(&x184, &x185, x183, x175, x172); - x186 = (x185 + x173); - fiat_p3923_addcarryx_u64(&x187, &x188, 0x0, x162, x178); - fiat_p3923_addcarryx_u64(&x189, &x190, x188, x164, x180); - fiat_p3923_addcarryx_u64(&x191, &x192, x190, x166, x182); - fiat_p3923_addcarryx_u64(&x193, &x194, x192, x168, x184); - fiat_p3923_addcarryx_u64(&x195, &x196, x194, x170, x186); - x197 = ((uint64_t)x196 + x171); - fiat_p3923_subborrowx_u64(&x198, &x199, 0x0, x189, UINT64_C(0xffffffffffffffff)); - fiat_p3923_subborrowx_u64(&x200, &x201, x199, x191, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_subborrowx_u64(&x202, &x203, x201, x193, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_subborrowx_u64(&x204, &x205, x203, x195, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_subborrowx_u64(&x206, &x207, x205, x197, 0x0); - fiat_p3923_cmovznz_u64(&x208, x207, x198, x189); - fiat_p3923_cmovznz_u64(&x209, x207, x200, x191); - fiat_p3923_cmovznz_u64(&x210, x207, x202, x193); - fiat_p3923_cmovznz_u64(&x211, x207, x204, x195); - out1[0] = x208; - out1[1] = x209; - out1[2] = x210; - out1[3] = x211; -} - -/* - * The function fiat_p3923_square squares a field element in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg1)) mod m - * 0 ≤ eval out1 < m - * - */ -static void fiat_p3923_square(fiat_p3923_montgomery_domain_field_element out1, const fiat_p3923_montgomery_domain_field_element arg1) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - fiat_p3923_uint1 x14; - uint64_t x15; - fiat_p3923_uint1 x16; - uint64_t x17; - fiat_p3923_uint1 x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - uint64_t x23; - uint64_t x24; - uint64_t x25; - uint64_t x26; - uint64_t x27; - uint64_t x28; - fiat_p3923_uint1 x29; - uint64_t x30; - fiat_p3923_uint1 x31; - uint64_t x32; - fiat_p3923_uint1 x33; - uint64_t x34; - uint64_t x35; - fiat_p3923_uint1 x36; - uint64_t x37; - fiat_p3923_uint1 x38; - uint64_t x39; - fiat_p3923_uint1 x40; - uint64_t x41; - fiat_p3923_uint1 x42; - uint64_t x43; - fiat_p3923_uint1 x44; - uint64_t x45; - uint64_t x46; - uint64_t x47; - uint64_t x48; - uint64_t x49; - uint64_t x50; - uint64_t x51; - uint64_t x52; - uint64_t x53; - fiat_p3923_uint1 x54; - uint64_t x55; - fiat_p3923_uint1 x56; - uint64_t x57; - fiat_p3923_uint1 x58; - uint64_t x59; - uint64_t x60; - fiat_p3923_uint1 x61; - uint64_t x62; - fiat_p3923_uint1 x63; - uint64_t x64; - fiat_p3923_uint1 x65; - uint64_t x66; - fiat_p3923_uint1 x67; - uint64_t x68; - fiat_p3923_uint1 x69; - uint64_t x70; - uint64_t x71; - uint64_t x72; - uint64_t x73; - uint64_t x74; - uint64_t x75; - uint64_t x76; - uint64_t x77; - uint64_t x78; - fiat_p3923_uint1 x79; - uint64_t x80; - fiat_p3923_uint1 x81; - uint64_t x82; - fiat_p3923_uint1 x83; - uint64_t x84; - uint64_t x85; - fiat_p3923_uint1 x86; - uint64_t x87; - fiat_p3923_uint1 x88; - uint64_t x89; - fiat_p3923_uint1 x90; - uint64_t x91; - fiat_p3923_uint1 x92; - uint64_t x93; - fiat_p3923_uint1 x94; - uint64_t x95; - uint64_t x96; - uint64_t x97; - uint64_t x98; - uint64_t x99; - uint64_t x100; - uint64_t x101; - uint64_t x102; - uint64_t x103; - uint64_t x104; - fiat_p3923_uint1 x105; - uint64_t x106; - fiat_p3923_uint1 x107; - uint64_t x108; - fiat_p3923_uint1 x109; - uint64_t x110; - uint64_t x111; - fiat_p3923_uint1 x112; - uint64_t x113; - fiat_p3923_uint1 x114; - uint64_t x115; - fiat_p3923_uint1 x116; - uint64_t x117; - fiat_p3923_uint1 x118; - uint64_t x119; - fiat_p3923_uint1 x120; - uint64_t x121; - uint64_t x122; - uint64_t x123; - uint64_t x124; - uint64_t x125; - uint64_t x126; - uint64_t x127; - uint64_t x128; - uint64_t x129; - fiat_p3923_uint1 x130; - uint64_t x131; - fiat_p3923_uint1 x132; - uint64_t x133; - fiat_p3923_uint1 x134; - uint64_t x135; - uint64_t x136; - fiat_p3923_uint1 x137; - uint64_t x138; - fiat_p3923_uint1 x139; - uint64_t x140; - fiat_p3923_uint1 x141; - uint64_t x142; - fiat_p3923_uint1 x143; - uint64_t x144; - fiat_p3923_uint1 x145; - uint64_t x146; - uint64_t x147; - uint64_t x148; - uint64_t x149; - uint64_t x150; - uint64_t x151; - uint64_t x152; - uint64_t x153; - uint64_t x154; - uint64_t x155; - fiat_p3923_uint1 x156; - uint64_t x157; - fiat_p3923_uint1 x158; - uint64_t x159; - fiat_p3923_uint1 x160; - uint64_t x161; - uint64_t x162; - fiat_p3923_uint1 x163; - uint64_t x164; - fiat_p3923_uint1 x165; - uint64_t x166; - fiat_p3923_uint1 x167; - uint64_t x168; - fiat_p3923_uint1 x169; - uint64_t x170; - fiat_p3923_uint1 x171; - uint64_t x172; - uint64_t x173; - uint64_t x174; - uint64_t x175; - uint64_t x176; - uint64_t x177; - uint64_t x178; - uint64_t x179; - uint64_t x180; - fiat_p3923_uint1 x181; - uint64_t x182; - fiat_p3923_uint1 x183; - uint64_t x184; - fiat_p3923_uint1 x185; - uint64_t x186; - uint64_t x187; - fiat_p3923_uint1 x188; - uint64_t x189; - fiat_p3923_uint1 x190; - uint64_t x191; - fiat_p3923_uint1 x192; - uint64_t x193; - fiat_p3923_uint1 x194; - uint64_t x195; - fiat_p3923_uint1 x196; - uint64_t x197; - uint64_t x198; - fiat_p3923_uint1 x199; - uint64_t x200; - fiat_p3923_uint1 x201; - uint64_t x202; - fiat_p3923_uint1 x203; - uint64_t x204; - fiat_p3923_uint1 x205; - uint64_t x206; - fiat_p3923_uint1 x207; - uint64_t x208; - uint64_t x209; - uint64_t x210; - uint64_t x211; - x1 = (arg1[1]); - x2 = (arg1[2]); - x3 = (arg1[3]); - x4 = (arg1[0]); - fiat_p3923_mulx_u64(&x5, &x6, x4, (arg1[3])); - fiat_p3923_mulx_u64(&x7, &x8, x4, (arg1[2])); - fiat_p3923_mulx_u64(&x9, &x10, x4, (arg1[1])); - fiat_p3923_mulx_u64(&x11, &x12, x4, (arg1[0])); - fiat_p3923_addcarryx_u64(&x13, &x14, 0x0, x12, x9); - fiat_p3923_addcarryx_u64(&x15, &x16, x14, x10, x7); - fiat_p3923_addcarryx_u64(&x17, &x18, x16, x8, x5); - x19 = (x18 + x6); - fiat_p3923_mulx_u64(&x20, &x21, x11, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x22, &x23, x11, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x24, &x25, x11, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x26, &x27, x11, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x28, &x29, 0x0, x27, x24); - fiat_p3923_addcarryx_u64(&x30, &x31, x29, x25, x22); - fiat_p3923_addcarryx_u64(&x32, &x33, x31, x23, x20); - x34 = (x33 + x21); - fiat_p3923_addcarryx_u64(&x35, &x36, 0x0, x11, x26); - fiat_p3923_addcarryx_u64(&x37, &x38, x36, x13, x28); - fiat_p3923_addcarryx_u64(&x39, &x40, x38, x15, x30); - fiat_p3923_addcarryx_u64(&x41, &x42, x40, x17, x32); - fiat_p3923_addcarryx_u64(&x43, &x44, x42, x19, x34); - fiat_p3923_mulx_u64(&x45, &x46, x1, (arg1[3])); - fiat_p3923_mulx_u64(&x47, &x48, x1, (arg1[2])); - fiat_p3923_mulx_u64(&x49, &x50, x1, (arg1[1])); - fiat_p3923_mulx_u64(&x51, &x52, x1, (arg1[0])); - fiat_p3923_addcarryx_u64(&x53, &x54, 0x0, x52, x49); - fiat_p3923_addcarryx_u64(&x55, &x56, x54, x50, x47); - fiat_p3923_addcarryx_u64(&x57, &x58, x56, x48, x45); - x59 = (x58 + x46); - fiat_p3923_addcarryx_u64(&x60, &x61, 0x0, x37, x51); - fiat_p3923_addcarryx_u64(&x62, &x63, x61, x39, x53); - fiat_p3923_addcarryx_u64(&x64, &x65, x63, x41, x55); - fiat_p3923_addcarryx_u64(&x66, &x67, x65, x43, x57); - fiat_p3923_addcarryx_u64(&x68, &x69, x67, x44, x59); - fiat_p3923_mulx_u64(&x70, &x71, x60, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x72, &x73, x60, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x74, &x75, x60, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x76, &x77, x60, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x78, &x79, 0x0, x77, x74); - fiat_p3923_addcarryx_u64(&x80, &x81, x79, x75, x72); - fiat_p3923_addcarryx_u64(&x82, &x83, x81, x73, x70); - x84 = (x83 + x71); - fiat_p3923_addcarryx_u64(&x85, &x86, 0x0, x60, x76); - fiat_p3923_addcarryx_u64(&x87, &x88, x86, x62, x78); - fiat_p3923_addcarryx_u64(&x89, &x90, x88, x64, x80); - fiat_p3923_addcarryx_u64(&x91, &x92, x90, x66, x82); - fiat_p3923_addcarryx_u64(&x93, &x94, x92, x68, x84); - x95 = ((uint64_t)x94 + x69); - fiat_p3923_mulx_u64(&x96, &x97, x2, (arg1[3])); - fiat_p3923_mulx_u64(&x98, &x99, x2, (arg1[2])); - fiat_p3923_mulx_u64(&x100, &x101, x2, (arg1[1])); - fiat_p3923_mulx_u64(&x102, &x103, x2, (arg1[0])); - fiat_p3923_addcarryx_u64(&x104, &x105, 0x0, x103, x100); - fiat_p3923_addcarryx_u64(&x106, &x107, x105, x101, x98); - fiat_p3923_addcarryx_u64(&x108, &x109, x107, x99, x96); - x110 = (x109 + x97); - fiat_p3923_addcarryx_u64(&x111, &x112, 0x0, x87, x102); - fiat_p3923_addcarryx_u64(&x113, &x114, x112, x89, x104); - fiat_p3923_addcarryx_u64(&x115, &x116, x114, x91, x106); - fiat_p3923_addcarryx_u64(&x117, &x118, x116, x93, x108); - fiat_p3923_addcarryx_u64(&x119, &x120, x118, x95, x110); - fiat_p3923_mulx_u64(&x121, &x122, x111, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x123, &x124, x111, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x125, &x126, x111, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x127, &x128, x111, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x129, &x130, 0x0, x128, x125); - fiat_p3923_addcarryx_u64(&x131, &x132, x130, x126, x123); - fiat_p3923_addcarryx_u64(&x133, &x134, x132, x124, x121); - x135 = (x134 + x122); - fiat_p3923_addcarryx_u64(&x136, &x137, 0x0, x111, x127); - fiat_p3923_addcarryx_u64(&x138, &x139, x137, x113, x129); - fiat_p3923_addcarryx_u64(&x140, &x141, x139, x115, x131); - fiat_p3923_addcarryx_u64(&x142, &x143, x141, x117, x133); - fiat_p3923_addcarryx_u64(&x144, &x145, x143, x119, x135); - x146 = ((uint64_t)x145 + x120); - fiat_p3923_mulx_u64(&x147, &x148, x3, (arg1[3])); - fiat_p3923_mulx_u64(&x149, &x150, x3, (arg1[2])); - fiat_p3923_mulx_u64(&x151, &x152, x3, (arg1[1])); - fiat_p3923_mulx_u64(&x153, &x154, x3, (arg1[0])); - fiat_p3923_addcarryx_u64(&x155, &x156, 0x0, x154, x151); - fiat_p3923_addcarryx_u64(&x157, &x158, x156, x152, x149); - fiat_p3923_addcarryx_u64(&x159, &x160, x158, x150, x147); - x161 = (x160 + x148); - fiat_p3923_addcarryx_u64(&x162, &x163, 0x0, x138, x153); - fiat_p3923_addcarryx_u64(&x164, &x165, x163, x140, x155); - fiat_p3923_addcarryx_u64(&x166, &x167, x165, x142, x157); - fiat_p3923_addcarryx_u64(&x168, &x169, x167, x144, x159); - fiat_p3923_addcarryx_u64(&x170, &x171, x169, x146, x161); - fiat_p3923_mulx_u64(&x172, &x173, x162, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x174, &x175, x162, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x176, &x177, x162, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x178, &x179, x162, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x180, &x181, 0x0, x179, x176); - fiat_p3923_addcarryx_u64(&x182, &x183, x181, x177, x174); - fiat_p3923_addcarryx_u64(&x184, &x185, x183, x175, x172); - x186 = (x185 + x173); - fiat_p3923_addcarryx_u64(&x187, &x188, 0x0, x162, x178); - fiat_p3923_addcarryx_u64(&x189, &x190, x188, x164, x180); - fiat_p3923_addcarryx_u64(&x191, &x192, x190, x166, x182); - fiat_p3923_addcarryx_u64(&x193, &x194, x192, x168, x184); - fiat_p3923_addcarryx_u64(&x195, &x196, x194, x170, x186); - x197 = ((uint64_t)x196 + x171); - fiat_p3923_subborrowx_u64(&x198, &x199, 0x0, x189, UINT64_C(0xffffffffffffffff)); - fiat_p3923_subborrowx_u64(&x200, &x201, x199, x191, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_subborrowx_u64(&x202, &x203, x201, x193, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_subborrowx_u64(&x204, &x205, x203, x195, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_subborrowx_u64(&x206, &x207, x205, x197, 0x0); - fiat_p3923_cmovznz_u64(&x208, x207, x198, x189); - fiat_p3923_cmovznz_u64(&x209, x207, x200, x191); - fiat_p3923_cmovznz_u64(&x210, x207, x202, x193); - fiat_p3923_cmovznz_u64(&x211, x207, x204, x195); - out1[0] = x208; - out1[1] = x209; - out1[2] = x210; - out1[3] = x211; -} - -/* - * The function fiat_p3923_add adds two field elements in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * 0 ≤ eval arg2 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) + eval (from_montgomery arg2)) mod m - * 0 ≤ eval out1 < m - * - */ -static void fiat_p3923_add(fiat_p3923_montgomery_domain_field_element out1, const fiat_p3923_montgomery_domain_field_element arg1, const fiat_p3923_montgomery_domain_field_element arg2) { - uint64_t x1; - fiat_p3923_uint1 x2; - uint64_t x3; - fiat_p3923_uint1 x4; - uint64_t x5; - fiat_p3923_uint1 x6; - uint64_t x7; - fiat_p3923_uint1 x8; - uint64_t x9; - fiat_p3923_uint1 x10; - uint64_t x11; - fiat_p3923_uint1 x12; - uint64_t x13; - fiat_p3923_uint1 x14; - uint64_t x15; - fiat_p3923_uint1 x16; - uint64_t x17; - fiat_p3923_uint1 x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - fiat_p3923_addcarryx_u64(&x1, &x2, 0x0, (arg1[0]), (arg2[0])); - fiat_p3923_addcarryx_u64(&x3, &x4, x2, (arg1[1]), (arg2[1])); - fiat_p3923_addcarryx_u64(&x5, &x6, x4, (arg1[2]), (arg2[2])); - fiat_p3923_addcarryx_u64(&x7, &x8, x6, (arg1[3]), (arg2[3])); - fiat_p3923_subborrowx_u64(&x9, &x10, 0x0, x1, UINT64_C(0xffffffffffffffff)); - fiat_p3923_subborrowx_u64(&x11, &x12, x10, x3, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_subborrowx_u64(&x13, &x14, x12, x5, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_subborrowx_u64(&x15, &x16, x14, x7, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_subborrowx_u64(&x17, &x18, x16, x8, 0x0); - fiat_p3923_cmovznz_u64(&x19, x18, x9, x1); - fiat_p3923_cmovznz_u64(&x20, x18, x11, x3); - fiat_p3923_cmovznz_u64(&x21, x18, x13, x5); - fiat_p3923_cmovznz_u64(&x22, x18, x15, x7); - out1[0] = x19; - out1[1] = x20; - out1[2] = x21; - out1[3] = x22; -} - -/* - * The function fiat_p3923_sub subtracts two field elements in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * 0 ≤ eval arg2 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) - eval (from_montgomery arg2)) mod m - * 0 ≤ eval out1 < m - * - */ -static void fiat_p3923_sub(fiat_p3923_montgomery_domain_field_element out1, const fiat_p3923_montgomery_domain_field_element arg1, const fiat_p3923_montgomery_domain_field_element arg2) { - uint64_t x1; - fiat_p3923_uint1 x2; - uint64_t x3; - fiat_p3923_uint1 x4; - uint64_t x5; - fiat_p3923_uint1 x6; - uint64_t x7; - fiat_p3923_uint1 x8; - uint64_t x9; - uint64_t x10; - fiat_p3923_uint1 x11; - uint64_t x12; - fiat_p3923_uint1 x13; - uint64_t x14; - fiat_p3923_uint1 x15; - uint64_t x16; - fiat_p3923_uint1 x17; - fiat_p3923_subborrowx_u64(&x1, &x2, 0x0, (arg1[0]), (arg2[0])); - fiat_p3923_subborrowx_u64(&x3, &x4, x2, (arg1[1]), (arg2[1])); - fiat_p3923_subborrowx_u64(&x5, &x6, x4, (arg1[2]), (arg2[2])); - fiat_p3923_subborrowx_u64(&x7, &x8, x6, (arg1[3]), (arg2[3])); - fiat_p3923_cmovznz_u64(&x9, x8, 0x0, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x10, &x11, 0x0, x1, x9); - fiat_p3923_addcarryx_u64(&x12, &x13, x11, x3, (x9 & UINT64_C(0x535805fa6e9e48b1))); - fiat_p3923_addcarryx_u64(&x14, &x15, x13, x5, (x9 & UINT64_C(0xb7311a63633f03db))); - fiat_p3923_addcarryx_u64(&x16, &x17, x15, x7, (x9 & UINT64_C(0x348757eadf5c9530))); - out1[0] = x10; - out1[1] = x12; - out1[2] = x14; - out1[3] = x16; -} - -/* - * The function fiat_p3923_from_montgomery translates a field element out of the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval out1 mod m = (eval arg1 * ((2^64)⁻¹ mod m)^4) mod m - * 0 ≤ eval out1 < m - * - */ -static void fiat_p3923_from_montgomery(fiat_p3923_non_montgomery_domain_field_element out1, const fiat_p3923_montgomery_domain_field_element arg1) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - fiat_p3923_uint1 x11; - uint64_t x12; - fiat_p3923_uint1 x13; - uint64_t x14; - fiat_p3923_uint1 x15; - uint64_t x16; - fiat_p3923_uint1 x17; - uint64_t x18; - fiat_p3923_uint1 x19; - uint64_t x20; - fiat_p3923_uint1 x21; - uint64_t x22; - fiat_p3923_uint1 x23; - uint64_t x24; - fiat_p3923_uint1 x25; - uint64_t x26; - fiat_p3923_uint1 x27; - uint64_t x28; - fiat_p3923_uint1 x29; - uint64_t x30; - uint64_t x31; - uint64_t x32; - uint64_t x33; - uint64_t x34; - uint64_t x35; - uint64_t x36; - uint64_t x37; - uint64_t x38; - fiat_p3923_uint1 x39; - uint64_t x40; - fiat_p3923_uint1 x41; - uint64_t x42; - fiat_p3923_uint1 x43; - uint64_t x44; - fiat_p3923_uint1 x45; - uint64_t x46; - fiat_p3923_uint1 x47; - uint64_t x48; - fiat_p3923_uint1 x49; - uint64_t x50; - fiat_p3923_uint1 x51; - uint64_t x52; - fiat_p3923_uint1 x53; - uint64_t x54; - fiat_p3923_uint1 x55; - uint64_t x56; - fiat_p3923_uint1 x57; - uint64_t x58; - uint64_t x59; - uint64_t x60; - uint64_t x61; - uint64_t x62; - uint64_t x63; - uint64_t x64; - uint64_t x65; - uint64_t x66; - fiat_p3923_uint1 x67; - uint64_t x68; - fiat_p3923_uint1 x69; - uint64_t x70; - fiat_p3923_uint1 x71; - uint64_t x72; - fiat_p3923_uint1 x73; - uint64_t x74; - fiat_p3923_uint1 x75; - uint64_t x76; - fiat_p3923_uint1 x77; - uint64_t x78; - fiat_p3923_uint1 x79; - uint64_t x80; - fiat_p3923_uint1 x81; - uint64_t x82; - fiat_p3923_uint1 x83; - uint64_t x84; - fiat_p3923_uint1 x85; - uint64_t x86; - uint64_t x87; - uint64_t x88; - uint64_t x89; - uint64_t x90; - uint64_t x91; - uint64_t x92; - uint64_t x93; - uint64_t x94; - fiat_p3923_uint1 x95; - uint64_t x96; - fiat_p3923_uint1 x97; - uint64_t x98; - fiat_p3923_uint1 x99; - uint64_t x100; - fiat_p3923_uint1 x101; - uint64_t x102; - fiat_p3923_uint1 x103; - uint64_t x104; - fiat_p3923_uint1 x105; - uint64_t x106; - fiat_p3923_uint1 x107; - uint64_t x108; - uint64_t x109; - fiat_p3923_uint1 x110; - uint64_t x111; - fiat_p3923_uint1 x112; - uint64_t x113; - fiat_p3923_uint1 x114; - uint64_t x115; - fiat_p3923_uint1 x116; - uint64_t x117; - fiat_p3923_uint1 x118; - uint64_t x119; - uint64_t x120; - uint64_t x121; - uint64_t x122; - x1 = (arg1[0]); - fiat_p3923_mulx_u64(&x2, &x3, x1, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x4, &x5, x1, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x6, &x7, x1, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x8, &x9, x1, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x10, &x11, 0x0, x9, x6); - fiat_p3923_addcarryx_u64(&x12, &x13, x11, x7, x4); - fiat_p3923_addcarryx_u64(&x14, &x15, x13, x5, x2); - fiat_p3923_addcarryx_u64(&x16, &x17, 0x0, x1, x8); - fiat_p3923_addcarryx_u64(&x18, &x19, x17, 0x0, x10); - fiat_p3923_addcarryx_u64(&x20, &x21, x19, 0x0, x12); - fiat_p3923_addcarryx_u64(&x22, &x23, x21, 0x0, x14); - fiat_p3923_addcarryx_u64(&x24, &x25, 0x0, x18, (arg1[1])); - fiat_p3923_addcarryx_u64(&x26, &x27, x25, x20, 0x0); - fiat_p3923_addcarryx_u64(&x28, &x29, x27, x22, 0x0); - fiat_p3923_mulx_u64(&x30, &x31, x24, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x32, &x33, x24, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x34, &x35, x24, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x36, &x37, x24, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x38, &x39, 0x0, x37, x34); - fiat_p3923_addcarryx_u64(&x40, &x41, x39, x35, x32); - fiat_p3923_addcarryx_u64(&x42, &x43, x41, x33, x30); - fiat_p3923_addcarryx_u64(&x44, &x45, 0x0, x24, x36); - fiat_p3923_addcarryx_u64(&x46, &x47, x45, x26, x38); - fiat_p3923_addcarryx_u64(&x48, &x49, x47, x28, x40); - fiat_p3923_addcarryx_u64(&x50, &x51, x49, (x29 + (x23 + (x15 + x3))), x42); - fiat_p3923_addcarryx_u64(&x52, &x53, 0x0, x46, (arg1[2])); - fiat_p3923_addcarryx_u64(&x54, &x55, x53, x48, 0x0); - fiat_p3923_addcarryx_u64(&x56, &x57, x55, x50, 0x0); - fiat_p3923_mulx_u64(&x58, &x59, x52, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x60, &x61, x52, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x62, &x63, x52, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x64, &x65, x52, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x66, &x67, 0x0, x65, x62); - fiat_p3923_addcarryx_u64(&x68, &x69, x67, x63, x60); - fiat_p3923_addcarryx_u64(&x70, &x71, x69, x61, x58); - fiat_p3923_addcarryx_u64(&x72, &x73, 0x0, x52, x64); - fiat_p3923_addcarryx_u64(&x74, &x75, x73, x54, x66); - fiat_p3923_addcarryx_u64(&x76, &x77, x75, x56, x68); - fiat_p3923_addcarryx_u64(&x78, &x79, x77, (x57 + (x51 + (x43 + x31))), x70); - fiat_p3923_addcarryx_u64(&x80, &x81, 0x0, x74, (arg1[3])); - fiat_p3923_addcarryx_u64(&x82, &x83, x81, x76, 0x0); - fiat_p3923_addcarryx_u64(&x84, &x85, x83, x78, 0x0); - fiat_p3923_mulx_u64(&x86, &x87, x80, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x88, &x89, x80, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x90, &x91, x80, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x92, &x93, x80, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x94, &x95, 0x0, x93, x90); - fiat_p3923_addcarryx_u64(&x96, &x97, x95, x91, x88); - fiat_p3923_addcarryx_u64(&x98, &x99, x97, x89, x86); - fiat_p3923_addcarryx_u64(&x100, &x101, 0x0, x80, x92); - fiat_p3923_addcarryx_u64(&x102, &x103, x101, x82, x94); - fiat_p3923_addcarryx_u64(&x104, &x105, x103, x84, x96); - fiat_p3923_addcarryx_u64(&x106, &x107, x105, (x85 + (x79 + (x71 + x59))), x98); - x108 = (x107 + (x99 + x87)); - fiat_p3923_subborrowx_u64(&x109, &x110, 0x0, x102, UINT64_C(0xffffffffffffffff)); - fiat_p3923_subborrowx_u64(&x111, &x112, x110, x104, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_subborrowx_u64(&x113, &x114, x112, x106, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_subborrowx_u64(&x115, &x116, x114, x108, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_subborrowx_u64(&x117, &x118, x116, 0x0, 0x0); - fiat_p3923_cmovznz_u64(&x119, x118, x109, x102); - fiat_p3923_cmovznz_u64(&x120, x118, x111, x104); - fiat_p3923_cmovznz_u64(&x121, x118, x113, x106); - fiat_p3923_cmovznz_u64(&x122, x118, x115, x108); - out1[0] = x119; - out1[1] = x120; - out1[2] = x121; - out1[3] = x122; -} - -/* - * The function fiat_p3923_to_montgomery translates a field element into the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval (from_montgomery out1) mod m = eval arg1 mod m - * 0 ≤ eval out1 < m - * - */ -static void fiat_p3923_to_montgomery(fiat_p3923_montgomery_domain_field_element out1, const fiat_p3923_non_montgomery_domain_field_element arg1) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - fiat_p3923_uint1 x14; - uint64_t x15; - fiat_p3923_uint1 x16; - uint64_t x17; - fiat_p3923_uint1 x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - uint64_t x23; - uint64_t x24; - uint64_t x25; - uint64_t x26; - uint64_t x27; - fiat_p3923_uint1 x28; - uint64_t x29; - fiat_p3923_uint1 x30; - uint64_t x31; - fiat_p3923_uint1 x32; - uint64_t x33; - fiat_p3923_uint1 x34; - uint64_t x35; - fiat_p3923_uint1 x36; - uint64_t x37; - fiat_p3923_uint1 x38; - uint64_t x39; - fiat_p3923_uint1 x40; - uint64_t x41; - uint64_t x42; - uint64_t x43; - uint64_t x44; - uint64_t x45; - uint64_t x46; - uint64_t x47; - uint64_t x48; - uint64_t x49; - fiat_p3923_uint1 x50; - uint64_t x51; - fiat_p3923_uint1 x52; - uint64_t x53; - fiat_p3923_uint1 x54; - uint64_t x55; - fiat_p3923_uint1 x56; - uint64_t x57; - fiat_p3923_uint1 x58; - uint64_t x59; - fiat_p3923_uint1 x60; - uint64_t x61; - fiat_p3923_uint1 x62; - uint64_t x63; - uint64_t x64; - uint64_t x65; - uint64_t x66; - uint64_t x67; - uint64_t x68; - uint64_t x69; - uint64_t x70; - uint64_t x71; - fiat_p3923_uint1 x72; - uint64_t x73; - fiat_p3923_uint1 x74; - uint64_t x75; - fiat_p3923_uint1 x76; - uint64_t x77; - fiat_p3923_uint1 x78; - uint64_t x79; - fiat_p3923_uint1 x80; - uint64_t x81; - fiat_p3923_uint1 x82; - uint64_t x83; - fiat_p3923_uint1 x84; - uint64_t x85; - uint64_t x86; - uint64_t x87; - uint64_t x88; - uint64_t x89; - uint64_t x90; - uint64_t x91; - uint64_t x92; - uint64_t x93; - fiat_p3923_uint1 x94; - uint64_t x95; - fiat_p3923_uint1 x96; - uint64_t x97; - fiat_p3923_uint1 x98; - uint64_t x99; - fiat_p3923_uint1 x100; - uint64_t x101; - fiat_p3923_uint1 x102; - uint64_t x103; - fiat_p3923_uint1 x104; - uint64_t x105; - fiat_p3923_uint1 x106; - uint64_t x107; - uint64_t x108; - uint64_t x109; - uint64_t x110; - uint64_t x111; - uint64_t x112; - uint64_t x113; - uint64_t x114; - uint64_t x115; - fiat_p3923_uint1 x116; - uint64_t x117; - fiat_p3923_uint1 x118; - uint64_t x119; - fiat_p3923_uint1 x120; - uint64_t x121; - fiat_p3923_uint1 x122; - uint64_t x123; - fiat_p3923_uint1 x124; - uint64_t x125; - fiat_p3923_uint1 x126; - uint64_t x127; - fiat_p3923_uint1 x128; - uint64_t x129; - uint64_t x130; - uint64_t x131; - uint64_t x132; - uint64_t x133; - uint64_t x134; - uint64_t x135; - uint64_t x136; - uint64_t x137; - fiat_p3923_uint1 x138; - uint64_t x139; - fiat_p3923_uint1 x140; - uint64_t x141; - fiat_p3923_uint1 x142; - uint64_t x143; - fiat_p3923_uint1 x144; - uint64_t x145; - fiat_p3923_uint1 x146; - uint64_t x147; - fiat_p3923_uint1 x148; - uint64_t x149; - fiat_p3923_uint1 x150; - uint64_t x151; - uint64_t x152; - uint64_t x153; - uint64_t x154; - uint64_t x155; - uint64_t x156; - uint64_t x157; - uint64_t x158; - uint64_t x159; - fiat_p3923_uint1 x160; - uint64_t x161; - fiat_p3923_uint1 x162; - uint64_t x163; - fiat_p3923_uint1 x164; - uint64_t x165; - fiat_p3923_uint1 x166; - uint64_t x167; - fiat_p3923_uint1 x168; - uint64_t x169; - fiat_p3923_uint1 x170; - uint64_t x171; - fiat_p3923_uint1 x172; - uint64_t x173; - uint64_t x174; - fiat_p3923_uint1 x175; - uint64_t x176; - fiat_p3923_uint1 x177; - uint64_t x178; - fiat_p3923_uint1 x179; - uint64_t x180; - fiat_p3923_uint1 x181; - uint64_t x182; - fiat_p3923_uint1 x183; - uint64_t x184; - uint64_t x185; - uint64_t x186; - uint64_t x187; - x1 = (arg1[1]); - x2 = (arg1[2]); - x3 = (arg1[3]); - x4 = (arg1[0]); - fiat_p3923_mulx_u64(&x5, &x6, x4, UINT64_C(0x2ed52f29f5b889a8)); - fiat_p3923_mulx_u64(&x7, &x8, x4, UINT64_C(0xf52e01b77a8daf49)); - fiat_p3923_mulx_u64(&x9, &x10, x4, UINT64_C(0x5aefc767151e69b7)); - fiat_p3923_mulx_u64(&x11, &x12, x4, UINT64_C(0xda5a066fea16792e)); - fiat_p3923_addcarryx_u64(&x13, &x14, 0x0, x12, x9); - fiat_p3923_addcarryx_u64(&x15, &x16, x14, x10, x7); - fiat_p3923_addcarryx_u64(&x17, &x18, x16, x8, x5); - fiat_p3923_mulx_u64(&x19, &x20, x11, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x21, &x22, x11, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x23, &x24, x11, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x25, &x26, x11, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x27, &x28, 0x0, x26, x23); - fiat_p3923_addcarryx_u64(&x29, &x30, x28, x24, x21); - fiat_p3923_addcarryx_u64(&x31, &x32, x30, x22, x19); - fiat_p3923_addcarryx_u64(&x33, &x34, 0x0, x11, x25); - fiat_p3923_addcarryx_u64(&x35, &x36, x34, x13, x27); - fiat_p3923_addcarryx_u64(&x37, &x38, x36, x15, x29); - fiat_p3923_addcarryx_u64(&x39, &x40, x38, x17, x31); - fiat_p3923_mulx_u64(&x41, &x42, x1, UINT64_C(0x2ed52f29f5b889a8)); - fiat_p3923_mulx_u64(&x43, &x44, x1, UINT64_C(0xf52e01b77a8daf49)); - fiat_p3923_mulx_u64(&x45, &x46, x1, UINT64_C(0x5aefc767151e69b7)); - fiat_p3923_mulx_u64(&x47, &x48, x1, UINT64_C(0xda5a066fea16792e)); - fiat_p3923_addcarryx_u64(&x49, &x50, 0x0, x48, x45); - fiat_p3923_addcarryx_u64(&x51, &x52, x50, x46, x43); - fiat_p3923_addcarryx_u64(&x53, &x54, x52, x44, x41); - fiat_p3923_addcarryx_u64(&x55, &x56, 0x0, x35, x47); - fiat_p3923_addcarryx_u64(&x57, &x58, x56, x37, x49); - fiat_p3923_addcarryx_u64(&x59, &x60, x58, x39, x51); - fiat_p3923_addcarryx_u64(&x61, &x62, x60, ((x40 + (x18 + x6)) + (x32 + x20)), x53); - fiat_p3923_mulx_u64(&x63, &x64, x55, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x65, &x66, x55, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x67, &x68, x55, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x69, &x70, x55, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x71, &x72, 0x0, x70, x67); - fiat_p3923_addcarryx_u64(&x73, &x74, x72, x68, x65); - fiat_p3923_addcarryx_u64(&x75, &x76, x74, x66, x63); - fiat_p3923_addcarryx_u64(&x77, &x78, 0x0, x55, x69); - fiat_p3923_addcarryx_u64(&x79, &x80, x78, x57, x71); - fiat_p3923_addcarryx_u64(&x81, &x82, x80, x59, x73); - fiat_p3923_addcarryx_u64(&x83, &x84, x82, x61, x75); - fiat_p3923_mulx_u64(&x85, &x86, x2, UINT64_C(0x2ed52f29f5b889a8)); - fiat_p3923_mulx_u64(&x87, &x88, x2, UINT64_C(0xf52e01b77a8daf49)); - fiat_p3923_mulx_u64(&x89, &x90, x2, UINT64_C(0x5aefc767151e69b7)); - fiat_p3923_mulx_u64(&x91, &x92, x2, UINT64_C(0xda5a066fea16792e)); - fiat_p3923_addcarryx_u64(&x93, &x94, 0x0, x92, x89); - fiat_p3923_addcarryx_u64(&x95, &x96, x94, x90, x87); - fiat_p3923_addcarryx_u64(&x97, &x98, x96, x88, x85); - fiat_p3923_addcarryx_u64(&x99, &x100, 0x0, x79, x91); - fiat_p3923_addcarryx_u64(&x101, &x102, x100, x81, x93); - fiat_p3923_addcarryx_u64(&x103, &x104, x102, x83, x95); - fiat_p3923_addcarryx_u64(&x105, &x106, x104, ((x84 + (x62 + (x54 + x42))) + (x76 + x64)), x97); - fiat_p3923_mulx_u64(&x107, &x108, x99, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x109, &x110, x99, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x111, &x112, x99, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x113, &x114, x99, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x115, &x116, 0x0, x114, x111); - fiat_p3923_addcarryx_u64(&x117, &x118, x116, x112, x109); - fiat_p3923_addcarryx_u64(&x119, &x120, x118, x110, x107); - fiat_p3923_addcarryx_u64(&x121, &x122, 0x0, x99, x113); - fiat_p3923_addcarryx_u64(&x123, &x124, x122, x101, x115); - fiat_p3923_addcarryx_u64(&x125, &x126, x124, x103, x117); - fiat_p3923_addcarryx_u64(&x127, &x128, x126, x105, x119); - fiat_p3923_mulx_u64(&x129, &x130, x3, UINT64_C(0x2ed52f29f5b889a8)); - fiat_p3923_mulx_u64(&x131, &x132, x3, UINT64_C(0xf52e01b77a8daf49)); - fiat_p3923_mulx_u64(&x133, &x134, x3, UINT64_C(0x5aefc767151e69b7)); - fiat_p3923_mulx_u64(&x135, &x136, x3, UINT64_C(0xda5a066fea16792e)); - fiat_p3923_addcarryx_u64(&x137, &x138, 0x0, x136, x133); - fiat_p3923_addcarryx_u64(&x139, &x140, x138, x134, x131); - fiat_p3923_addcarryx_u64(&x141, &x142, x140, x132, x129); - fiat_p3923_addcarryx_u64(&x143, &x144, 0x0, x123, x135); - fiat_p3923_addcarryx_u64(&x145, &x146, x144, x125, x137); - fiat_p3923_addcarryx_u64(&x147, &x148, x146, x127, x139); - fiat_p3923_addcarryx_u64(&x149, &x150, x148, ((x128 + (x106 + (x98 + x86))) + (x120 + x108)), x141); - fiat_p3923_mulx_u64(&x151, &x152, x143, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x153, &x154, x143, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x155, &x156, x143, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x157, &x158, x143, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x159, &x160, 0x0, x158, x155); - fiat_p3923_addcarryx_u64(&x161, &x162, x160, x156, x153); - fiat_p3923_addcarryx_u64(&x163, &x164, x162, x154, x151); - fiat_p3923_addcarryx_u64(&x165, &x166, 0x0, x143, x157); - fiat_p3923_addcarryx_u64(&x167, &x168, x166, x145, x159); - fiat_p3923_addcarryx_u64(&x169, &x170, x168, x147, x161); - fiat_p3923_addcarryx_u64(&x171, &x172, x170, x149, x163); - x173 = ((x172 + (x150 + (x142 + x130))) + (x164 + x152)); - fiat_p3923_subborrowx_u64(&x174, &x175, 0x0, x167, UINT64_C(0xffffffffffffffff)); - fiat_p3923_subborrowx_u64(&x176, &x177, x175, x169, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_subborrowx_u64(&x178, &x179, x177, x171, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_subborrowx_u64(&x180, &x181, x179, x173, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_subborrowx_u64(&x182, &x183, x181, 0x0, 0x0); - fiat_p3923_cmovznz_u64(&x184, x183, x174, x167); - fiat_p3923_cmovznz_u64(&x185, x183, x176, x169); - fiat_p3923_cmovznz_u64(&x186, x183, x178, x171); - fiat_p3923_cmovznz_u64(&x187, x183, x180, x173); - out1[0] = x184; - out1[1] = x185; - out1[2] = x186; - out1[3] = x187; -} - -/* - * The function fiat_p3923_set_one returns the field element one in the Montgomery domain. - * - * Postconditions: - * eval (from_montgomery out1) mod m = 1 mod m - * 0 ≤ eval out1 < m - * - */ -static void fiat_p3923_set_one(fiat_p3923_montgomery_domain_field_element out1) { - out1[0] = 0x4; - out1[1] = UINT64_C(0xb29fe8164586dd38); - out1[2] = UINT64_C(0x233b96727303f092); - out1[3] = UINT64_C(0x2de2a054828dab3d); -} - -#if 0 - -/* - * The function fiat_p3923_msat returns the saturated representation of the prime modulus. - * - * Postconditions: - * twos_complement_eval out1 = m - * 0 ≤ eval out1 < m - * - * Output Bounds: - * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - */ -static void fiat_p3923_msat(uint64_t out1[5]) { - out1[0] = UINT64_C(0xffffffffffffffff); - out1[1] = UINT64_C(0x535805fa6e9e48b1); - out1[2] = UINT64_C(0xb7311a63633f03db); - out1[3] = UINT64_C(0x348757eadf5c9530); - out1[4] = 0x0; -} - -/* - * The function fiat_p3923_divstep_precomp returns the precomputed value for Bernstein-Yang-inversion (in montgomery form). - * - * Postconditions: - * eval (from_montgomery out1) = ⌊(m - 1) / 2⌋^(if ⌊log2 m⌋ + 1 < 46 then ⌊(49 * (⌊log2 m⌋ + 1) + 80) / 17⌋ else ⌊(49 * (⌊log2 m⌋ + 1) + 57) / 17⌋) - * 0 ≤ eval out1 < m - * - * Output Bounds: - * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - */ -static void fiat_p3923_divstep_precomp(uint64_t out1[4]) { - out1[0] = UINT64_C(0xaee112e844291710); - out1[1] = UINT64_C(0x1e0160ba47b5dac7); - out1[2] = UINT64_C(0x24a2c2e843cc0a4f); - out1[3] = UINT64_C(0x24f57f5d3517ab8f); -} - -/* - * The function fiat_p3923_divstep computes a divstep. - * - * Preconditions: - * 0 ≤ eval arg4 < m - * 0 ≤ eval arg5 < m - * Postconditions: - * out1 = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then 1 - arg1 else 1 + arg1) - * twos_complement_eval out2 = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then twos_complement_eval arg3 else twos_complement_eval arg2) - * twos_complement_eval out3 = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then ⌊(twos_complement_eval arg3 - twos_complement_eval arg2) / 2⌋ else ⌊(twos_complement_eval arg3 + (twos_complement_eval arg3 mod 2) * twos_complement_eval arg2) / 2⌋) - * eval (from_montgomery out4) mod m = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then (2 * eval (from_montgomery arg5)) mod m else (2 * eval (from_montgomery arg4)) mod m) - * eval (from_montgomery out5) mod m = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then (eval (from_montgomery arg4) - eval (from_montgomery arg4)) mod m else (eval (from_montgomery arg5) + (twos_complement_eval arg3 mod 2) * eval (from_montgomery arg4)) mod m) - * 0 ≤ eval out5 < m - * 0 ≤ eval out5 < m - * 0 ≤ eval out2 < m - * 0 ≤ eval out3 < m - * - * Input Bounds: - * arg1: [0x0 ~> 0xffffffffffffffff] - * arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * arg3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * arg4: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * arg5: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - * out2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * out3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * out4: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * out5: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - */ -static void fiat_p3923_divstep(uint64_t* out1, uint64_t out2[5], uint64_t out3[5], uint64_t out4[4], uint64_t out5[4], uint64_t arg1, const uint64_t arg2[5], const uint64_t arg3[5], const uint64_t arg4[4], const uint64_t arg5[4]) { - uint64_t x1; - fiat_p3923_uint1 x2; - fiat_p3923_uint1 x3; - uint64_t x4; - fiat_p3923_uint1 x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - fiat_p3923_uint1 x13; - uint64_t x14; - fiat_p3923_uint1 x15; - uint64_t x16; - fiat_p3923_uint1 x17; - uint64_t x18; - fiat_p3923_uint1 x19; - uint64_t x20; - fiat_p3923_uint1 x21; - uint64_t x22; - uint64_t x23; - uint64_t x24; - uint64_t x25; - uint64_t x26; - uint64_t x27; - uint64_t x28; - uint64_t x29; - uint64_t x30; - uint64_t x31; - fiat_p3923_uint1 x32; - uint64_t x33; - fiat_p3923_uint1 x34; - uint64_t x35; - fiat_p3923_uint1 x36; - uint64_t x37; - fiat_p3923_uint1 x38; - uint64_t x39; - fiat_p3923_uint1 x40; - uint64_t x41; - fiat_p3923_uint1 x42; - uint64_t x43; - fiat_p3923_uint1 x44; - uint64_t x45; - fiat_p3923_uint1 x46; - uint64_t x47; - fiat_p3923_uint1 x48; - uint64_t x49; - uint64_t x50; - uint64_t x51; - uint64_t x52; - uint64_t x53; - fiat_p3923_uint1 x54; - uint64_t x55; - fiat_p3923_uint1 x56; - uint64_t x57; - fiat_p3923_uint1 x58; - uint64_t x59; - fiat_p3923_uint1 x60; - uint64_t x61; - uint64_t x62; - fiat_p3923_uint1 x63; - uint64_t x64; - fiat_p3923_uint1 x65; - uint64_t x66; - fiat_p3923_uint1 x67; - uint64_t x68; - fiat_p3923_uint1 x69; - uint64_t x70; - uint64_t x71; - uint64_t x72; - uint64_t x73; - fiat_p3923_uint1 x74; - uint64_t x75; - uint64_t x76; - uint64_t x77; - uint64_t x78; - uint64_t x79; - uint64_t x80; - fiat_p3923_uint1 x81; - uint64_t x82; - fiat_p3923_uint1 x83; - uint64_t x84; - fiat_p3923_uint1 x85; - uint64_t x86; - fiat_p3923_uint1 x87; - uint64_t x88; - fiat_p3923_uint1 x89; - uint64_t x90; - uint64_t x91; - uint64_t x92; - uint64_t x93; - uint64_t x94; - fiat_p3923_uint1 x95; - uint64_t x96; - fiat_p3923_uint1 x97; - uint64_t x98; - fiat_p3923_uint1 x99; - uint64_t x100; - fiat_p3923_uint1 x101; - uint64_t x102; - fiat_p3923_uint1 x103; - uint64_t x104; - fiat_p3923_uint1 x105; - uint64_t x106; - fiat_p3923_uint1 x107; - uint64_t x108; - fiat_p3923_uint1 x109; - uint64_t x110; - fiat_p3923_uint1 x111; - uint64_t x112; - fiat_p3923_uint1 x113; - uint64_t x114; - uint64_t x115; - uint64_t x116; - uint64_t x117; - uint64_t x118; - uint64_t x119; - uint64_t x120; - uint64_t x121; - uint64_t x122; - uint64_t x123; - uint64_t x124; - uint64_t x125; - uint64_t x126; - fiat_p3923_addcarryx_u64(&x1, &x2, 0x0, (~arg1), 0x1); - x3 = (fiat_p3923_uint1)((fiat_p3923_uint1)(x1 >> 63) & (fiat_p3923_uint1)((arg3[0]) & 0x1)); - fiat_p3923_addcarryx_u64(&x4, &x5, 0x0, (~arg1), 0x1); - fiat_p3923_cmovznz_u64(&x6, x3, arg1, x4); - fiat_p3923_cmovznz_u64(&x7, x3, (arg2[0]), (arg3[0])); - fiat_p3923_cmovznz_u64(&x8, x3, (arg2[1]), (arg3[1])); - fiat_p3923_cmovznz_u64(&x9, x3, (arg2[2]), (arg3[2])); - fiat_p3923_cmovznz_u64(&x10, x3, (arg2[3]), (arg3[3])); - fiat_p3923_cmovznz_u64(&x11, x3, (arg2[4]), (arg3[4])); - fiat_p3923_addcarryx_u64(&x12, &x13, 0x0, 0x1, (~(arg2[0]))); - fiat_p3923_addcarryx_u64(&x14, &x15, x13, 0x0, (~(arg2[1]))); - fiat_p3923_addcarryx_u64(&x16, &x17, x15, 0x0, (~(arg2[2]))); - fiat_p3923_addcarryx_u64(&x18, &x19, x17, 0x0, (~(arg2[3]))); - fiat_p3923_addcarryx_u64(&x20, &x21, x19, 0x0, (~(arg2[4]))); - fiat_p3923_cmovznz_u64(&x22, x3, (arg3[0]), x12); - fiat_p3923_cmovznz_u64(&x23, x3, (arg3[1]), x14); - fiat_p3923_cmovznz_u64(&x24, x3, (arg3[2]), x16); - fiat_p3923_cmovznz_u64(&x25, x3, (arg3[3]), x18); - fiat_p3923_cmovznz_u64(&x26, x3, (arg3[4]), x20); - fiat_p3923_cmovznz_u64(&x27, x3, (arg4[0]), (arg5[0])); - fiat_p3923_cmovznz_u64(&x28, x3, (arg4[1]), (arg5[1])); - fiat_p3923_cmovznz_u64(&x29, x3, (arg4[2]), (arg5[2])); - fiat_p3923_cmovznz_u64(&x30, x3, (arg4[3]), (arg5[3])); - fiat_p3923_addcarryx_u64(&x31, &x32, 0x0, x27, x27); - fiat_p3923_addcarryx_u64(&x33, &x34, x32, x28, x28); - fiat_p3923_addcarryx_u64(&x35, &x36, x34, x29, x29); - fiat_p3923_addcarryx_u64(&x37, &x38, x36, x30, x30); - fiat_p3923_subborrowx_u64(&x39, &x40, 0x0, x31, UINT64_C(0xffffffffffffffff)); - fiat_p3923_subborrowx_u64(&x41, &x42, x40, x33, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_subborrowx_u64(&x43, &x44, x42, x35, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_subborrowx_u64(&x45, &x46, x44, x37, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_subborrowx_u64(&x47, &x48, x46, x38, 0x0); - x49 = (arg4[3]); - x50 = (arg4[2]); - x51 = (arg4[1]); - x52 = (arg4[0]); - fiat_p3923_subborrowx_u64(&x53, &x54, 0x0, 0x0, x52); - fiat_p3923_subborrowx_u64(&x55, &x56, x54, 0x0, x51); - fiat_p3923_subborrowx_u64(&x57, &x58, x56, 0x0, x50); - fiat_p3923_subborrowx_u64(&x59, &x60, x58, 0x0, x49); - fiat_p3923_cmovznz_u64(&x61, x60, 0x0, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x62, &x63, 0x0, x53, x61); - fiat_p3923_addcarryx_u64(&x64, &x65, x63, x55, (x61 & UINT64_C(0x535805fa6e9e48b1))); - fiat_p3923_addcarryx_u64(&x66, &x67, x65, x57, (x61 & UINT64_C(0xb7311a63633f03db))); - fiat_p3923_addcarryx_u64(&x68, &x69, x67, x59, (x61 & UINT64_C(0x348757eadf5c9530))); - fiat_p3923_cmovznz_u64(&x70, x3, (arg5[0]), x62); - fiat_p3923_cmovznz_u64(&x71, x3, (arg5[1]), x64); - fiat_p3923_cmovznz_u64(&x72, x3, (arg5[2]), x66); - fiat_p3923_cmovznz_u64(&x73, x3, (arg5[3]), x68); - x74 = (fiat_p3923_uint1)(x22 & 0x1); - fiat_p3923_cmovznz_u64(&x75, x74, 0x0, x7); - fiat_p3923_cmovznz_u64(&x76, x74, 0x0, x8); - fiat_p3923_cmovznz_u64(&x77, x74, 0x0, x9); - fiat_p3923_cmovznz_u64(&x78, x74, 0x0, x10); - fiat_p3923_cmovznz_u64(&x79, x74, 0x0, x11); - fiat_p3923_addcarryx_u64(&x80, &x81, 0x0, x22, x75); - fiat_p3923_addcarryx_u64(&x82, &x83, x81, x23, x76); - fiat_p3923_addcarryx_u64(&x84, &x85, x83, x24, x77); - fiat_p3923_addcarryx_u64(&x86, &x87, x85, x25, x78); - fiat_p3923_addcarryx_u64(&x88, &x89, x87, x26, x79); - fiat_p3923_cmovznz_u64(&x90, x74, 0x0, x27); - fiat_p3923_cmovznz_u64(&x91, x74, 0x0, x28); - fiat_p3923_cmovznz_u64(&x92, x74, 0x0, x29); - fiat_p3923_cmovznz_u64(&x93, x74, 0x0, x30); - fiat_p3923_addcarryx_u64(&x94, &x95, 0x0, x70, x90); - fiat_p3923_addcarryx_u64(&x96, &x97, x95, x71, x91); - fiat_p3923_addcarryx_u64(&x98, &x99, x97, x72, x92); - fiat_p3923_addcarryx_u64(&x100, &x101, x99, x73, x93); - fiat_p3923_subborrowx_u64(&x102, &x103, 0x0, x94, UINT64_C(0xffffffffffffffff)); - fiat_p3923_subborrowx_u64(&x104, &x105, x103, x96, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_subborrowx_u64(&x106, &x107, x105, x98, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_subborrowx_u64(&x108, &x109, x107, x100, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_subborrowx_u64(&x110, &x111, x109, x101, 0x0); - fiat_p3923_addcarryx_u64(&x112, &x113, 0x0, x6, 0x1); - x114 = ((x80 >> 1) | ((x82 << 63) & UINT64_C(0xffffffffffffffff))); - x115 = ((x82 >> 1) | ((x84 << 63) & UINT64_C(0xffffffffffffffff))); - x116 = ((x84 >> 1) | ((x86 << 63) & UINT64_C(0xffffffffffffffff))); - x117 = ((x86 >> 1) | ((x88 << 63) & UINT64_C(0xffffffffffffffff))); - x118 = ((x88 & UINT64_C(0x8000000000000000)) | (x88 >> 1)); - fiat_p3923_cmovznz_u64(&x119, x48, x39, x31); - fiat_p3923_cmovznz_u64(&x120, x48, x41, x33); - fiat_p3923_cmovznz_u64(&x121, x48, x43, x35); - fiat_p3923_cmovznz_u64(&x122, x48, x45, x37); - fiat_p3923_cmovznz_u64(&x123, x111, x102, x94); - fiat_p3923_cmovznz_u64(&x124, x111, x104, x96); - fiat_p3923_cmovznz_u64(&x125, x111, x106, x98); - fiat_p3923_cmovznz_u64(&x126, x111, x108, x100); - *out1 = x112; - out2[0] = x7; - out2[1] = x8; - out2[2] = x9; - out2[3] = x10; - out2[4] = x11; - out3[0] = x114; - out3[1] = x115; - out3[2] = x116; - out3[3] = x117; - out3[4] = x118; - out4[0] = x119; - out4[1] = x120; - out4[2] = x121; - out4[3] = x122; - out5[0] = x123; - out5[1] = x124; - out5[2] = x125; - out5[3] = x126; -} - -#endif - -void fp_add(uint64_t* out, const uint64_t* a, const uint64_t* b) { - fiat_p3923_add(out, a, b); -} - -void fp_sub(uint64_t* out, const uint64_t* a, const uint64_t* b) { - fiat_p3923_sub(out, a, b); -} - -void fp_sqr(uint64_t* out, const uint64_t* a) { - fiat_p3923_square(out, a); -} - -void fp_mul(uint64_t* out, const uint64_t* a, const uint64_t* b) { - fiat_p3923_mul(out, a, b); -} - -void fp_tomont(uint64_t* out, const uint64_t* a) { - fiat_p3923_to_montgomery(out, a); -} - -void fp_frommont(uint64_t* out, const uint64_t* a) { - fiat_p3923_from_montgomery(out, a); -} - -void fp_mont_setone(uint64_t* out) { - fiat_p3923_set_one(out); -} diff --git a/src/gf/ref/lvl1/fp_p5248_32.c b/src/gf/ref/lvl1/fp_p5248_32.c new file mode 100644 index 0000000..a52add3 --- /dev/null +++ b/src/gf/ref/lvl1/fp_p5248_32.c @@ -0,0 +1,942 @@ +// clang-format off +// Command line : python monty.py 32 +// 0x4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +#include +#include + +#define sspint int32_t +#define spint uint32_t +#define udpint uint64_t +#define dpint uint64_t + +#define Wordlength 32 +#define Nlimbs 9 +#define Radix 29 +#define Nbits 251 +#define Nbytes 32 + +#define MONTGOMERY +// propagate carries +inline static spint prop(spint *n) { + int i; + spint mask = ((spint)1 << 29u) - (spint)1; + sspint carry = (sspint)n[0]; + carry >>= 29u; + n[0] &= mask; + for (i = 1; i < 8; i++) { + carry += (sspint)n[i]; + n[i] = (spint)carry & mask; + carry >>= 29u; + } + n[8] += (spint)carry; + return -((n[8] >> 1) >> 30u); +} + +// propagate carries and add p if negative, propagate carries again +inline static int flatten(spint *n) { + spint carry = prop(n); + n[0] -= (spint)1u & carry; + n[8] += ((spint)0x50000u) & carry; + (void)prop(n); + return (int)(carry & 1); +} + +// Montgomery final subtract +static int modfsb(spint *n) { + n[0] += (spint)1u; + n[8] -= (spint)0x50000u; + return flatten(n); +} + +// Modular addition - reduce less than 2p +static void modadd(const spint *a, const spint *b, spint *n) { + spint carry; + n[0] = a[0] + b[0]; + n[1] = a[1] + b[1]; + n[2] = a[2] + b[2]; + n[3] = a[3] + b[3]; + n[4] = a[4] + b[4]; + n[5] = a[5] + b[5]; + n[6] = a[6] + b[6]; + n[7] = a[7] + b[7]; + n[8] = a[8] + b[8]; + n[0] += (spint)2u; + n[8] -= (spint)0xa0000u; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[8] += ((spint)0xa0000u) & carry; + (void)prop(n); +} + +// Modular subtraction - reduce less than 2p +static void modsub(const spint *a, const spint *b, spint *n) { + spint carry; + n[0] = a[0] - b[0]; + n[1] = a[1] - b[1]; + n[2] = a[2] - b[2]; + n[3] = a[3] - b[3]; + n[4] = a[4] - b[4]; + n[5] = a[5] - b[5]; + n[6] = a[6] - b[6]; + n[7] = a[7] - b[7]; + n[8] = a[8] - b[8]; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[8] += ((spint)0xa0000u) & carry; + (void)prop(n); +} + +// Modular negation +static void modneg(const spint *b, spint *n) { + spint carry; + n[0] = (spint)0 - b[0]; + n[1] = (spint)0 - b[1]; + n[2] = (spint)0 - b[2]; + n[3] = (spint)0 - b[3]; + n[4] = (spint)0 - b[4]; + n[5] = (spint)0 - b[5]; + n[6] = (spint)0 - b[6]; + n[7] = (spint)0 - b[7]; + n[8] = (spint)0 - b[8]; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[8] += ((spint)0xa0000u) & carry; + (void)prop(n); +} + +// Overflow limit = 18446744073709551616 +// maximum possible = 2594249331921584137 +// Modular multiplication, c=a*b mod 2p +static void modmul(const spint *a, const spint *b, spint *c) { + dpint t = 0; + spint p8 = 0x50000u; + spint q = ((spint)1 << 29u); // q is unsaturated radix + spint mask = (spint)(q - (spint)1); + t += (dpint)a[0] * b[0]; + spint v0 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[1]; + t += (dpint)a[1] * b[0]; + spint v1 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[2]; + t += (dpint)a[1] * b[1]; + t += (dpint)a[2] * b[0]; + spint v2 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[3]; + t += (dpint)a[1] * b[2]; + t += (dpint)a[2] * b[1]; + t += (dpint)a[3] * b[0]; + spint v3 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[4]; + t += (dpint)a[1] * b[3]; + t += (dpint)a[2] * b[2]; + t += (dpint)a[3] * b[1]; + t += (dpint)a[4] * b[0]; + spint v4 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[5]; + t += (dpint)a[1] * b[4]; + t += (dpint)a[2] * b[3]; + t += (dpint)a[3] * b[2]; + t += (dpint)a[4] * b[1]; + t += (dpint)a[5] * b[0]; + spint v5 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[6]; + t += (dpint)a[1] * b[5]; + t += (dpint)a[2] * b[4]; + t += (dpint)a[3] * b[3]; + t += (dpint)a[4] * b[2]; + t += (dpint)a[5] * b[1]; + t += (dpint)a[6] * b[0]; + spint v6 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[7]; + t += (dpint)a[1] * b[6]; + t += (dpint)a[2] * b[5]; + t += (dpint)a[3] * b[4]; + t += (dpint)a[4] * b[3]; + t += (dpint)a[5] * b[2]; + t += (dpint)a[6] * b[1]; + t += (dpint)a[7] * b[0]; + spint v7 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[8]; + t += (dpint)a[1] * b[7]; + t += (dpint)a[2] * b[6]; + t += (dpint)a[3] * b[5]; + t += (dpint)a[4] * b[4]; + t += (dpint)a[5] * b[3]; + t += (dpint)a[6] * b[2]; + t += (dpint)a[7] * b[1]; + t += (dpint)a[8] * b[0]; + t += (dpint)v0 * (dpint)p8; + spint v8 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[1] * b[8]; + t += (dpint)a[2] * b[7]; + t += (dpint)a[3] * b[6]; + t += (dpint)a[4] * b[5]; + t += (dpint)a[5] * b[4]; + t += (dpint)a[6] * b[3]; + t += (dpint)a[7] * b[2]; + t += (dpint)a[8] * b[1]; + t += (dpint)v1 * (dpint)p8; + c[0] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[2] * b[8]; + t += (dpint)a[3] * b[7]; + t += (dpint)a[4] * b[6]; + t += (dpint)a[5] * b[5]; + t += (dpint)a[6] * b[4]; + t += (dpint)a[7] * b[3]; + t += (dpint)a[8] * b[2]; + t += (dpint)v2 * (dpint)p8; + c[1] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[3] * b[8]; + t += (dpint)a[4] * b[7]; + t += (dpint)a[5] * b[6]; + t += (dpint)a[6] * b[5]; + t += (dpint)a[7] * b[4]; + t += (dpint)a[8] * b[3]; + t += (dpint)v3 * (dpint)p8; + c[2] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[4] * b[8]; + t += (dpint)a[5] * b[7]; + t += (dpint)a[6] * b[6]; + t += (dpint)a[7] * b[5]; + t += (dpint)a[8] * b[4]; + t += (dpint)v4 * (dpint)p8; + c[3] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[5] * b[8]; + t += (dpint)a[6] * b[7]; + t += (dpint)a[7] * b[6]; + t += (dpint)a[8] * b[5]; + t += (dpint)v5 * (dpint)p8; + c[4] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[6] * b[8]; + t += (dpint)a[7] * b[7]; + t += (dpint)a[8] * b[6]; + t += (dpint)v6 * (dpint)p8; + c[5] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[7] * b[8]; + t += (dpint)a[8] * b[7]; + t += (dpint)v7 * (dpint)p8; + c[6] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[8] * b[8]; + t += (dpint)v8 * (dpint)p8; + c[7] = ((spint)t & mask); + t >>= 29; + c[8] = (spint)t; +} + +// Modular squaring, c=a*a mod 2p +static void modsqr(const spint *a, spint *c) { + udpint tot; + udpint t = 0; + spint p8 = 0x50000u; + spint q = ((spint)1 << 29u); // q is unsaturated radix + spint mask = (spint)(q - (spint)1); + tot = (udpint)a[0] * a[0]; + t = tot; + spint v0 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[1]; + tot *= 2; + t += tot; + spint v1 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[2]; + tot *= 2; + tot += (udpint)a[1] * a[1]; + t += tot; + spint v2 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[3]; + tot += (udpint)a[1] * a[2]; + tot *= 2; + t += tot; + spint v3 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[4]; + tot += (udpint)a[1] * a[3]; + tot *= 2; + tot += (udpint)a[2] * a[2]; + t += tot; + spint v4 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[5]; + tot += (udpint)a[1] * a[4]; + tot += (udpint)a[2] * a[3]; + tot *= 2; + t += tot; + spint v5 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[6]; + tot += (udpint)a[1] * a[5]; + tot += (udpint)a[2] * a[4]; + tot *= 2; + tot += (udpint)a[3] * a[3]; + t += tot; + spint v6 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[7]; + tot += (udpint)a[1] * a[6]; + tot += (udpint)a[2] * a[5]; + tot += (udpint)a[3] * a[4]; + tot *= 2; + t += tot; + spint v7 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[8]; + tot += (udpint)a[1] * a[7]; + tot += (udpint)a[2] * a[6]; + tot += (udpint)a[3] * a[5]; + tot *= 2; + tot += (udpint)a[4] * a[4]; + t += tot; + t += (udpint)v0 * p8; + spint v8 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[1] * a[8]; + tot += (udpint)a[2] * a[7]; + tot += (udpint)a[3] * a[6]; + tot += (udpint)a[4] * a[5]; + tot *= 2; + t += tot; + t += (udpint)v1 * p8; + c[0] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[2] * a[8]; + tot += (udpint)a[3] * a[7]; + tot += (udpint)a[4] * a[6]; + tot *= 2; + tot += (udpint)a[5] * a[5]; + t += tot; + t += (udpint)v2 * p8; + c[1] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[3] * a[8]; + tot += (udpint)a[4] * a[7]; + tot += (udpint)a[5] * a[6]; + tot *= 2; + t += tot; + t += (udpint)v3 * p8; + c[2] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[4] * a[8]; + tot += (udpint)a[5] * a[7]; + tot *= 2; + tot += (udpint)a[6] * a[6]; + t += tot; + t += (udpint)v4 * p8; + c[3] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[5] * a[8]; + tot += (udpint)a[6] * a[7]; + tot *= 2; + t += tot; + t += (udpint)v5 * p8; + c[4] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[6] * a[8]; + tot *= 2; + tot += (udpint)a[7] * a[7]; + t += tot; + t += (udpint)v6 * p8; + c[5] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[7] * a[8]; + tot *= 2; + t += tot; + t += (udpint)v7 * p8; + c[6] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[8] * a[8]; + t += tot; + t += (udpint)v8 * p8; + c[7] = ((spint)t & mask); + t >>= 29; + c[8] = (spint)t; +} + +// copy +static void modcpy(const spint *a, spint *c) { + int i; + for (i = 0; i < 9; i++) { + c[i] = a[i]; + } +} + +// square n times +static void modnsqr(spint *a, int n) { + int i; + for (i = 0; i < n; i++) { + modsqr(a, a); + } +} + +// Calculate progenitor +static void modpro(const spint *w, spint *z) { + spint x[9]; + spint t0[9]; + spint t1[9]; + spint t2[9]; + spint t3[9]; + spint t4[9]; + modcpy(w, x); + modsqr(x, z); + modmul(x, z, t0); + modsqr(t0, z); + modmul(x, z, z); + modsqr(z, t1); + modsqr(t1, t3); + modsqr(t3, t2); + modcpy(t2, t4); + modnsqr(t4, 3); + modmul(t2, t4, t2); + modcpy(t2, t4); + modnsqr(t4, 6); + modmul(t2, t4, t2); + modcpy(t2, t4); + modnsqr(t4, 2); + modmul(t3, t4, t3); + modnsqr(t3, 13); + modmul(t2, t3, t2); + modcpy(t2, t3); + modnsqr(t3, 27); + modmul(t2, t3, t2); + modmul(z, t2, z); + modcpy(z, t2); + modnsqr(t2, 4); + modmul(t1, t2, t1); + modmul(t0, t1, t0); + modmul(t1, t0, t1); + modmul(t0, t1, t0); + modmul(t1, t0, t2); + modmul(t0, t2, t0); + modmul(t1, t0, t1); + modnsqr(t1, 63); + modmul(t0, t1, t1); + modnsqr(t1, 64); + modmul(t0, t1, t0); + modnsqr(t0, 57); + modmul(z, t0, z); +} + +// calculate inverse, provide progenitor h if available +static void modinv(const spint *x, const spint *h, spint *z) { + spint s[9]; + spint t[9]; + if (h == NULL) { + modpro(x, t); + } else { + modcpy(h, t); + } + modcpy(x, s); + modnsqr(t, 2); + modmul(s, t, z); +} + +// Convert m to n-residue form, n=nres(m) +static void nres(const spint *m, spint *n) { + const spint c[9] = {0xcf5c28fu, 0x6666666u, 0x13333333u, + 0x19999999u, 0xcccccccu, 0x6666666u, + 0x13333333u, 0x19999999u, 0x1ccccu}; + modmul(m, c, n); +} + +// Convert n back to normal form, m=redc(n) +static void redc(const spint *n, spint *m) { + int i; + spint c[9]; + c[0] = 1; + for (i = 1; i < 9; i++) { + c[i] = 0; + } + modmul(n, c, m); + (void)modfsb(m); +} + +// is unity? +static int modis1(const spint *a) { + int i; + spint c[9]; + spint c0; + spint d = 0; + redc(a, c); + for (i = 1; i < 9; i++) { + d |= c[i]; + } + c0 = (spint)c[0]; + return ((spint)1 & ((d - (spint)1) >> 29u) & + (((c0 ^ (spint)1) - (spint)1) >> 29u)); +} + +// is zero? +static int modis0(const spint *a) { + int i; + spint c[9]; + spint d = 0; + redc(a, c); + for (i = 0; i < 9; i++) { + d |= c[i]; + } + return ((spint)1 & ((d - (spint)1) >> 29u)); +} + +// set to zero +static void modzer(spint *a) { + int i; + for (i = 0; i < 9; i++) { + a[i] = 0; + } +} + +// set to one +static void modone(spint *a) { + int i; + a[0] = 1; + for (i = 1; i < 9; i++) { + a[i] = 0; + } + nres(a, a); +} + +// set to integer +static void modint(int x, spint *a) { + int i; + a[0] = (spint)x; + for (i = 1; i < 9; i++) { + a[i] = 0; + } + nres(a, a); +} + +// Modular multiplication by an integer, c=a*b mod 2p +static void modmli(const spint *a, int b, spint *c) { + spint t[9]; + modint(b, t); + modmul(a, t, c); +} + +// Test for quadratic residue +static int modqr(const spint *h, const spint *x) { + spint r[9]; + if (h == NULL) { + modpro(x, r); + modsqr(r, r); + } else { + modsqr(h, r); + } + modmul(r, x, r); + return modis1(r) | modis0(x); +} + +// conditional move g to f if d=1 +// strongly recommend inlining be disabled using compiler specific syntax +static void modcmv(int b, const spint *g, volatile spint *f) { + int i; + spint c0, c1, s, t; + spint r = 0x5aa5a55au; + c0 = (1 - b) + r; + c1 = b + r; + for (i = 0; i < 9; i++) { + s = g[i]; + t = f[i]; + f[i] = c0 * t + c1 * s; + f[i] -= r * (t + s); + } +} + +// conditional swap g and f if d=1 +// strongly recommend inlining be disabled using compiler specific syntax +static void modcsw(int b, volatile spint *g, volatile spint *f) { + int i; + spint c0, c1, s, t, w; + spint r = 0x5aa5a55au; + c0 = (1 - b) + r; + c1 = b + r; + for (i = 0; i < 9; i++) { + s = g[i]; + t = f[i]; + w = r * (t + s); + f[i] = c0 * t + c1 * s; + f[i] -= w; + g[i] = c0 * s + c1 * t; + g[i] -= w; + } +} + +// Modular square root, provide progenitor h if available, NULL if not +static void modsqrt(const spint *x, const spint *h, spint *r) { + spint s[9]; + spint y[9]; + if (h == NULL) { + modpro(x, y); + } else { + modcpy(h, y); + } + modmul(y, x, s); + modcpy(s, r); +} + +// shift left by less than a word +static void modshl(unsigned int n, spint *a) { + int i; + a[8] = ((a[8] << n)) | (a[7] >> (29u - n)); + for (i = 7; i > 0; i--) { + a[i] = ((a[i] << n) & (spint)0x1fffffff) | (a[i - 1] >> (29u - n)); + } + a[0] = (a[0] << n) & (spint)0x1fffffff; +} + +// shift right by less than a word. Return shifted out part +static int modshr(unsigned int n, spint *a) { + int i; + spint r = a[0] & (((spint)1 << n) - (spint)1); + for (i = 0; i < 8; i++) { + a[i] = (a[i] >> n) | ((a[i + 1] << (29u - n)) & (spint)0x1fffffff); + } + a[8] = a[8] >> n; + return r; +} + +// set a= 2^r +static void mod2r(unsigned int r, spint *a) { + unsigned int n = r / 29u; + unsigned int m = r % 29u; + modzer(a); + if (r >= 32 * 8) + return; + a[n] = 1; + a[n] <<= m; + nres(a, a); +} + +// export to byte array +static void modexp(const spint *a, char *b) { + int i; + spint c[9]; + redc(a, c); + for (i = 31; i >= 0; i--) { + b[i] = c[0] & (spint)0xff; + (void)modshr(8, c); + } +} + +// import from byte array +// returns 1 if in range, else 0 +static int modimp(const char *b, spint *a) { + int i, res; + for (i = 0; i < 9; i++) { + a[i] = 0; + } + for (i = 0; i < 32; i++) { + modshl(8, a); + a[0] += (spint)(unsigned char)b[i]; + } + res = modfsb(a); + nres(a, a); + return res; +} + +// determine sign +static int modsign(const spint *a) { + spint c[9]; + redc(a, c); + return c[0] % 2; +} + +// return true if equal +static int modcmp(const spint *a, const spint *b) { + spint c[9], d[9]; + int i, eq = 1; + redc(a, c); + redc(b, d); + for (i = 0; i < 9; i++) { + eq &= (((c[i] ^ d[i]) - 1) >> 29) & 1; + } + return eq; +} + +// clang-format on +/****************************************************************************** + API functions calling generated code above + ******************************************************************************/ + +#include + +const digit_t ZERO[NWORDS_FIELD] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; +const digit_t ONE[NWORDS_FIELD] = { 0x00000666, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00020000 }; +// Montgomery representation of 2^-1 +static const digit_t TWO_INV[NWORDS_FIELD] = { 0x00000333, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00010000 }; +// Montgomery representation of 3^-1 +static const digit_t THREE_INV[NWORDS_FIELD] = { + 0x15555777, 0x0aaaaaaa, 0x15555555, 0x0aaaaaaa, 0x15555555, 0x0aaaaaaa, 0x15555555, 0x0aaaaaaa, 0x00025555, +}; +// Montgomery representation of 2^256 +static const digit_t R2[NWORDS_FIELD] = { 0x0667ae14, 0x13333333, 0x19999999, 0x0ccccccc, 0x06666666, + 0x13333333, 0x19999999, 0x0ccccccc, 0x00026666 }; + +void +fp_set_small(fp_t *x, const digit_t val) +{ + modint((int)val, *x); +} + +void +fp_mul_small(fp_t *x, const fp_t *a, const uint32_t val) +{ + modmli(*a, (int)val, *x); +} + +void +fp_set_zero(fp_t *x) +{ + modzer(*x); +} + +void +fp_set_one(fp_t *x) +{ + modone(*x); +} + +uint32_t +fp_is_equal(const fp_t *a, const fp_t *b) +{ + return -(uint32_t)modcmp(*a, *b); +} + +uint32_t +fp_is_zero(const fp_t *a) +{ + return -(uint32_t)modis0(*a); +} + +void +fp_copy(fp_t *out, const fp_t *a) +{ + modcpy(*a, *out); +} + +void +fp_cswap(fp_t *a, fp_t *b, uint32_t ctl) +{ + modcsw((int)(ctl & 0x1), *a, *b); +} + +void +fp_add(fp_t *out, const fp_t *a, const fp_t *b) +{ + modadd(*a, *b, *out); +} + +void +fp_sub(fp_t *out, const fp_t *a, const fp_t *b) +{ + modsub(*a, *b, *out); +} + +void +fp_neg(fp_t *out, const fp_t *a) +{ + modneg(*a, *out); +} + +void +fp_sqr(fp_t *out, const fp_t *a) +{ + modsqr(*a, *out); +} + +void +fp_mul(fp_t *out, const fp_t *a, const fp_t *b) +{ + modmul(*a, *b, *out); +} + +void +fp_inv(fp_t *x) +{ + modinv(*x, NULL, *x); +} + +uint32_t +fp_is_square(const fp_t *a) +{ + return -(uint32_t)modqr(NULL, *a); +} + +void +fp_sqrt(fp_t *a) +{ + modsqrt(*a, NULL, *a); +} + +void +fp_half(fp_t *out, const fp_t *a) +{ + modmul(TWO_INV, *a, *out); +} + +void +fp_exp3div4(fp_t *out, const fp_t *a) +{ + modpro(*a, *out); +} + +void +fp_div3(fp_t *out, const fp_t *a) +{ + modmul(THREE_INV, *a, *out); +} + +void +fp_encode(void *dst, const fp_t *a) +{ + // Modified version of modexp() + int i; + spint c[9]; + redc(*a, c); + for (i = 0; i < 32; i++) { + ((char *)dst)[i] = c[0] & (spint)0xff; + (void)modshr(8, c); + } +} + +uint32_t +fp_decode(fp_t *d, const void *src) +{ + // Modified version of modimp() + int i; + spint res; + const unsigned char *b = src; + for (i = 0; i < 9; i++) { + (*d)[i] = 0; + } + for (i = 31; i >= 0; i--) { + modshl(8, *d); + (*d)[0] += (spint)b[i]; + } + res = (spint)-modfsb(*d); + nres(*d, *d); + // If the value was canonical then res = -1; otherwise, res = 0 + for (i = 0; i < 9; i++) { + (*d)[i] &= res; + } + return (uint32_t)res; +} + +static inline unsigned char +add_carry(unsigned char cc, spint a, spint b, spint *d) +{ + udpint t = (udpint)a + (udpint)b + cc; + *d = (spint)t; + return (unsigned char)(t >> Wordlength); +} + +static void +partial_reduce(spint *out, const spint *src) +{ + spint h, l, quo, rem; + unsigned char cc; + + // Split value in high (8 bits) and low (248 bits) parts. + h = src[7] >> 24; + l = src[7] & 0x00FFFFFF; + + // 5*2^248 = 1 mod q; hence, we add floor(h/5) + (h mod 5)*2^248 + // to the low part. + quo = (h * 0xCD) >> 10; + rem = h - (5 * quo); + cc = add_carry(0, src[0], quo, &out[0]); + cc = add_carry(cc, src[1], 0, &out[1]); + cc = add_carry(cc, src[2], 0, &out[2]); + cc = add_carry(cc, src[3], 0, &out[3]); + cc = add_carry(cc, src[4], 0, &out[4]); + cc = add_carry(cc, src[5], 0, &out[5]); + cc = add_carry(cc, src[6], 0, &out[6]); + (void)add_carry(cc, l, rem << 24, &out[7]); +} + +// Little-endian encoding of a 32-bit integer. +static inline void +enc32le(void *dst, uint32_t x) +{ + uint8_t *buf = dst; + buf[0] = (uint8_t)x; + buf[1] = (uint8_t)(x >> 8); + buf[2] = (uint8_t)(x >> 16); + buf[3] = (uint8_t)(x >> 24); +} + +// Little-endian decoding of a 32-bit integer. +static inline uint32_t +dec32le(const void *src) +{ + const uint8_t *buf = src; + return (spint)buf[0] | ((spint)buf[1] << 8) | ((spint)buf[2] << 16) | ((spint)buf[3] << 24); +} + +void +fp_decode_reduce(fp_t *d, const void *src, size_t len) +{ + uint32_t t[8]; // Stores Nbytes * 8 bits + uint8_t tmp[32]; // Nbytes + const uint8_t *b = src; + + fp_set_zero(d); + if (len == 0) { + return; + } + + size_t rem = len % 32; + if (rem != 0) { + // Input size is not a multiple of 32, we decode a partial + // block, which is already less than 2^248. + size_t k = len - rem; + memcpy(tmp, b + k, len - k); + memset(tmp + len - k, 0, (sizeof tmp) - (len - k)); + fp_decode(d, tmp); + len = k; + } + // Process all remaining blocks, in descending address order. + while (len > 0) { + fp_mul(d, d, &R2); + len -= 32; + t[0] = dec32le(b + len); + t[1] = dec32le(b + len + 4); + t[2] = dec32le(b + len + 8); + t[3] = dec32le(b + len + 12); + t[4] = dec32le(b + len + 16); + t[5] = dec32le(b + len + 20); + t[6] = dec32le(b + len + 24); + t[7] = dec32le(b + len + 28); + partial_reduce(t, t); + enc32le(tmp, t[0]); + enc32le(tmp + 4, t[1]); + enc32le(tmp + 8, t[2]); + enc32le(tmp + 12, t[3]); + enc32le(tmp + 16, t[4]); + enc32le(tmp + 20, t[5]); + enc32le(tmp + 24, t[6]); + enc32le(tmp + 28, t[7]); + fp_t a; + fp_decode(&a, tmp); + fp_add(d, d, &a); + } +} diff --git a/src/gf/ref/lvl1/fp_p5248_64.c b/src/gf/ref/lvl1/fp_p5248_64.c new file mode 100644 index 0000000..cde28dd --- /dev/null +++ b/src/gf/ref/lvl1/fp_p5248_64.c @@ -0,0 +1,791 @@ +// clang-format off +// Command line : python monty.py 64 +// 0x4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +#include +#include + +#define sspint int64_t +#define spint uint64_t +#define udpint __uint128_t +#define dpint __uint128_t + +#define Wordlength 64 +#define Nlimbs 5 +#define Radix 51 +#define Nbits 251 +#define Nbytes 32 + +#define MONTGOMERY +// propagate carries +inline static spint prop(spint *n) { + int i; + spint mask = ((spint)1 << 51u) - (spint)1; + sspint carry = (sspint)n[0]; + carry >>= 51u; + n[0] &= mask; + for (i = 1; i < 4; i++) { + carry += (sspint)n[i]; + n[i] = (spint)carry & mask; + carry >>= 51u; + } + n[4] += (spint)carry; + return -((n[4] >> 1) >> 62u); +} + +// propagate carries and add p if negative, propagate carries again +inline static int flatten(spint *n) { + spint carry = prop(n); + n[0] -= (spint)1u & carry; + n[4] += ((spint)0x500000000000u) & carry; + (void)prop(n); + return (int)(carry & 1); +} + +// Montgomery final subtract +inline static int modfsb(spint *n) { + n[0] += (spint)1u; + n[4] -= (spint)0x500000000000u; + return flatten(n); +} + +// Modular addition - reduce less than 2p +inline static void modadd(const spint *a, const spint *b, spint *n) { + spint carry; + n[0] = a[0] + b[0]; + n[1] = a[1] + b[1]; + n[2] = a[2] + b[2]; + n[3] = a[3] + b[3]; + n[4] = a[4] + b[4]; + n[0] += (spint)2u; + n[4] -= (spint)0xa00000000000u; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[4] += ((spint)0xa00000000000u) & carry; + (void)prop(n); +} + +// Modular subtraction - reduce less than 2p +inline static void modsub(const spint *a, const spint *b, spint *n) { + spint carry; + n[0] = a[0] - b[0]; + n[1] = a[1] - b[1]; + n[2] = a[2] - b[2]; + n[3] = a[3] - b[3]; + n[4] = a[4] - b[4]; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[4] += ((spint)0xa00000000000u) & carry; + (void)prop(n); +} + +// Modular negation +inline static void modneg(const spint *b, spint *n) { + spint carry; + n[0] = (spint)0 - b[0]; + n[1] = (spint)0 - b[1]; + n[2] = (spint)0 - b[2]; + n[3] = (spint)0 - b[3]; + n[4] = (spint)0 - b[4]; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[4] += ((spint)0xa00000000000u) & carry; + (void)prop(n); +} + +// Overflow limit = 340282366920938463463374607431768211456 +// maximum possible = 25551082561965953719787503747077 +// Modular multiplication, c=a*b mod 2p +inline static void modmul(const spint *a, const spint *b, spint *c) { + dpint t = 0; + spint p4 = 0x500000000000u; + spint q = ((spint)1 << 51u); // q is unsaturated radix + spint mask = (spint)(q - (spint)1); + t += (dpint)a[0] * b[0]; + spint v0 = ((spint)t & mask); + t >>= 51; + t += (dpint)a[0] * b[1]; + t += (dpint)a[1] * b[0]; + spint v1 = ((spint)t & mask); + t >>= 51; + t += (dpint)a[0] * b[2]; + t += (dpint)a[1] * b[1]; + t += (dpint)a[2] * b[0]; + spint v2 = ((spint)t & mask); + t >>= 51; + t += (dpint)a[0] * b[3]; + t += (dpint)a[1] * b[2]; + t += (dpint)a[2] * b[1]; + t += (dpint)a[3] * b[0]; + spint v3 = ((spint)t & mask); + t >>= 51; + t += (dpint)a[0] * b[4]; + t += (dpint)a[1] * b[3]; + t += (dpint)a[2] * b[2]; + t += (dpint)a[3] * b[1]; + t += (dpint)a[4] * b[0]; + t += (dpint)v0 * (dpint)p4; + spint v4 = ((spint)t & mask); + t >>= 51; + t += (dpint)a[1] * b[4]; + t += (dpint)a[2] * b[3]; + t += (dpint)a[3] * b[2]; + t += (dpint)a[4] * b[1]; + t += (dpint)v1 * (dpint)p4; + c[0] = ((spint)t & mask); + t >>= 51; + t += (dpint)a[2] * b[4]; + t += (dpint)a[3] * b[3]; + t += (dpint)a[4] * b[2]; + t += (dpint)v2 * (dpint)p4; + c[1] = ((spint)t & mask); + t >>= 51; + t += (dpint)a[3] * b[4]; + t += (dpint)a[4] * b[3]; + t += (dpint)v3 * (dpint)p4; + c[2] = ((spint)t & mask); + t >>= 51; + t += (dpint)a[4] * b[4]; + t += (dpint)v4 * (dpint)p4; + c[3] = ((spint)t & mask); + t >>= 51; + c[4] = (spint)t; +} + +// Modular squaring, c=a*a mod 2p +inline static void modsqr(const spint *a, spint *c) { + udpint tot; + udpint t = 0; + spint p4 = 0x500000000000u; + spint q = ((spint)1 << 51u); // q is unsaturated radix + spint mask = (spint)(q - (spint)1); + tot = (udpint)a[0] * a[0]; + t = tot; + spint v0 = ((spint)t & mask); + t >>= 51; + tot = (udpint)a[0] * a[1]; + tot *= 2; + t += tot; + spint v1 = ((spint)t & mask); + t >>= 51; + tot = (udpint)a[0] * a[2]; + tot *= 2; + tot += (udpint)a[1] * a[1]; + t += tot; + spint v2 = ((spint)t & mask); + t >>= 51; + tot = (udpint)a[0] * a[3]; + tot += (udpint)a[1] * a[2]; + tot *= 2; + t += tot; + spint v3 = ((spint)t & mask); + t >>= 51; + tot = (udpint)a[0] * a[4]; + tot += (udpint)a[1] * a[3]; + tot *= 2; + tot += (udpint)a[2] * a[2]; + t += tot; + t += (udpint)v0 * p4; + spint v4 = ((spint)t & mask); + t >>= 51; + tot = (udpint)a[1] * a[4]; + tot += (udpint)a[2] * a[3]; + tot *= 2; + t += tot; + t += (udpint)v1 * p4; + c[0] = ((spint)t & mask); + t >>= 51; + tot = (udpint)a[2] * a[4]; + tot *= 2; + tot += (udpint)a[3] * a[3]; + t += tot; + t += (udpint)v2 * p4; + c[1] = ((spint)t & mask); + t >>= 51; + tot = (udpint)a[3] * a[4]; + tot *= 2; + t += tot; + t += (udpint)v3 * p4; + c[2] = ((spint)t & mask); + t >>= 51; + tot = (udpint)a[4] * a[4]; + t += tot; + t += (udpint)v4 * p4; + c[3] = ((spint)t & mask); + t >>= 51; + c[4] = (spint)t; +} + +// copy +inline static void modcpy(const spint *a, spint *c) { + int i; + for (i = 0; i < 5; i++) { + c[i] = a[i]; + } +} + +// square n times +static void modnsqr(spint *a, int n) { + int i; + for (i = 0; i < n; i++) { + modsqr(a, a); + } +} + +// Calculate progenitor +static void modpro(const spint *w, spint *z) { + spint x[5]; + spint t0[5]; + spint t1[5]; + spint t2[5]; + spint t3[5]; + spint t4[5]; + modcpy(w, x); + modsqr(x, z); + modmul(x, z, t0); + modsqr(t0, z); + modmul(x, z, z); + modsqr(z, t1); + modsqr(t1, t3); + modsqr(t3, t2); + modcpy(t2, t4); + modnsqr(t4, 3); + modmul(t2, t4, t2); + modcpy(t2, t4); + modnsqr(t4, 6); + modmul(t2, t4, t2); + modcpy(t2, t4); + modnsqr(t4, 2); + modmul(t3, t4, t3); + modnsqr(t3, 13); + modmul(t2, t3, t2); + modcpy(t2, t3); + modnsqr(t3, 27); + modmul(t2, t3, t2); + modmul(z, t2, z); + modcpy(z, t2); + modnsqr(t2, 4); + modmul(t1, t2, t1); + modmul(t0, t1, t0); + modmul(t1, t0, t1); + modmul(t0, t1, t0); + modmul(t1, t0, t2); + modmul(t0, t2, t0); + modmul(t1, t0, t1); + modnsqr(t1, 63); + modmul(t0, t1, t1); + modnsqr(t1, 64); + modmul(t0, t1, t0); + modnsqr(t0, 57); + modmul(z, t0, z); +} + +// calculate inverse, provide progenitor h if available +static void modinv(const spint *x, const spint *h, spint *z) { + spint s[5]; + spint t[5]; + if (h == NULL) { + modpro(x, t); + } else { + modcpy(h, t); + } + modcpy(x, s); + modnsqr(t, 2); + modmul(s, t, z); +} + +// Convert m to n-residue form, n=nres(m) +static void nres(const spint *m, spint *n) { + const spint c[5] = {0x4cccccccccf5cu, 0x1999999999999u, 0x3333333333333u, + 0x6666666666666u, 0xcccccccccccu}; + modmul(m, c, n); +} + +// Convert n back to normal form, m=redc(n) +static void redc(const spint *n, spint *m) { + int i; + spint c[5]; + c[0] = 1; + for (i = 1; i < 5; i++) { + c[i] = 0; + } + modmul(n, c, m); + (void)modfsb(m); +} + +// is unity? +static int modis1(const spint *a) { + int i; + spint c[5]; + spint c0; + spint d = 0; + redc(a, c); + for (i = 1; i < 5; i++) { + d |= c[i]; + } + c0 = (spint)c[0]; + return ((spint)1 & ((d - (spint)1) >> 51u) & + (((c0 ^ (spint)1) - (spint)1) >> 51u)); +} + +// is zero? +static int modis0(const spint *a) { + int i; + spint c[5]; + spint d = 0; + redc(a, c); + for (i = 0; i < 5; i++) { + d |= c[i]; + } + return ((spint)1 & ((d - (spint)1) >> 51u)); +} + +// set to zero +static void modzer(spint *a) { + int i; + for (i = 0; i < 5; i++) { + a[i] = 0; + } +} + +// set to one +static void modone(spint *a) { + int i; + a[0] = 1; + for (i = 1; i < 5; i++) { + a[i] = 0; + } + nres(a, a); +} + +// set to integer +static void modint(int x, spint *a) { + int i; + a[0] = (spint)x; + for (i = 1; i < 5; i++) { + a[i] = 0; + } + nres(a, a); +} + +// Modular multiplication by an integer, c=a*b mod 2p +inline static void modmli(const spint *a, int b, spint *c) { + spint t[5]; + modint(b, t); + modmul(a, t, c); +} + +// Test for quadratic residue +static int modqr(const spint *h, const spint *x) { + spint r[5]; + if (h == NULL) { + modpro(x, r); + modsqr(r, r); + } else { + modsqr(h, r); + } + modmul(r, x, r); + return modis1(r) | modis0(x); +} + +// conditional move g to f if d=1 +// strongly recommend inlining be disabled using compiler specific syntax +static void modcmv(int b, const spint *g, volatile spint *f) { + int i; + spint c0, c1, s, t; + spint r = 0x3cc3c33c5aa5a55au; + c0 = (1 - b) + r; + c1 = b + r; + for (i = 0; i < 5; i++) { + s = g[i]; + t = f[i]; + f[i] = c0 * t + c1 * s; + f[i] -= r * (t + s); + } +} + +// conditional swap g and f if d=1 +// strongly recommend inlining be disabled using compiler specific syntax +static void modcsw(int b, volatile spint *g, volatile spint *f) { + int i; + spint c0, c1, s, t, w; + spint r = 0x3cc3c33c5aa5a55au; + c0 = (1 - b) + r; + c1 = b + r; + for (i = 0; i < 5; i++) { + s = g[i]; + t = f[i]; + w = r * (t + s); + f[i] = c0 * t + c1 * s; + f[i] -= w; + g[i] = c0 * s + c1 * t; + g[i] -= w; + } +} + +// Modular square root, provide progenitor h if available, NULL if not +static void modsqrt(const spint *x, const spint *h, spint *r) { + spint s[5]; + spint y[5]; + if (h == NULL) { + modpro(x, y); + } else { + modcpy(h, y); + } + modmul(y, x, s); + modcpy(s, r); +} + +// shift left by less than a word +static void modshl(unsigned int n, spint *a) { + int i; + a[4] = ((a[4] << n)) | (a[3] >> (51u - n)); + for (i = 3; i > 0; i--) { + a[i] = ((a[i] << n) & (spint)0x7ffffffffffff) | (a[i - 1] >> (51u - n)); + } + a[0] = (a[0] << n) & (spint)0x7ffffffffffff; +} + +// shift right by less than a word. Return shifted out part +static int modshr(unsigned int n, spint *a) { + int i; + spint r = a[0] & (((spint)1 << n) - (spint)1); + for (i = 0; i < 4; i++) { + a[i] = (a[i] >> n) | ((a[i + 1] << (51u - n)) & (spint)0x7ffffffffffff); + } + a[4] = a[4] >> n; + return r; +} + +// set a= 2^r +static void mod2r(unsigned int r, spint *a) { + unsigned int n = r / 51u; + unsigned int m = r % 51u; + modzer(a); + if (r >= 32 * 8) + return; + a[n] = 1; + a[n] <<= m; + nres(a, a); +} + +// export to byte array +static void modexp(const spint *a, char *b) { + int i; + spint c[5]; + redc(a, c); + for (i = 31; i >= 0; i--) { + b[i] = c[0] & (spint)0xff; + (void)modshr(8, c); + } +} + +// import from byte array +// returns 1 if in range, else 0 +static int modimp(const char *b, spint *a) { + int i, res; + for (i = 0; i < 5; i++) { + a[i] = 0; + } + for (i = 0; i < 32; i++) { + modshl(8, a); + a[0] += (spint)(unsigned char)b[i]; + } + res = modfsb(a); + nres(a, a); + return res; +} + +// determine sign +static int modsign(const spint *a) { + spint c[5]; + redc(a, c); + return c[0] % 2; +} + +// return true if equal +static int modcmp(const spint *a, const spint *b) { + spint c[5], d[5]; + int i, eq = 1; + redc(a, c); + redc(b, d); + for (i = 0; i < 5; i++) { + eq &= (((c[i] ^ d[i]) - 1) >> 51) & 1; + } + return eq; +} + +// clang-format on +/****************************************************************************** + API functions calling generated code above + ******************************************************************************/ + +#include + +const digit_t ZERO[NWORDS_FIELD] = { 0x0, 0x0, 0x0, 0x0, 0x0 }; +const digit_t ONE[NWORDS_FIELD] = { 0x0000000000000019, + 0x0000000000000000, + 0x0000000000000000, + 0x0000000000000000, + 0x0000300000000000 }; +// Montgomery representation of 2^-1 +static const digit_t TWO_INV[NWORDS_FIELD] = { 0x000000000000000c, + 0x0000000000000000, + 0x0000000000000000, + 0x0000000000000000, + 0x0000400000000000 }; +// Montgomery representation of 3^-1 +static const digit_t THREE_INV[NWORDS_FIELD] = { 0x000555555555555d, + 0x0002aaaaaaaaaaaa, + 0x0005555555555555, + 0x0002aaaaaaaaaaaa, + 0x0000455555555555 }; +// Montgomery representation of 2^256 +static const digit_t R2[NWORDS_FIELD] = { 0x0001999999999eb8, + 0x0003333333333333, + 0x0006666666666666, + 0x0004cccccccccccc, + 0x0000199999999999 }; + +void +fp_set_small(fp_t *x, const digit_t val) +{ + modint((int)val, *x); +} + +void +fp_mul_small(fp_t *x, const fp_t *a, const uint32_t val) +{ + modmli(*a, (int)val, *x); +} + +void +fp_set_zero(fp_t *x) +{ + modzer(*x); +} + +void +fp_set_one(fp_t *x) +{ + modone(*x); +} + +uint32_t +fp_is_equal(const fp_t *a, const fp_t *b) +{ + return -(uint32_t)modcmp(*a, *b); +} + +uint32_t +fp_is_zero(const fp_t *a) +{ + return -(uint32_t)modis0(*a); +} + +void +fp_copy(fp_t *out, const fp_t *a) +{ + modcpy(*a, *out); +} + +void +fp_cswap(fp_t *a, fp_t *b, uint32_t ctl) +{ + modcsw((int)(ctl & 0x1), *a, *b); +} + +void +fp_add(fp_t *out, const fp_t *a, const fp_t *b) +{ + modadd(*a, *b, *out); +} + +void +fp_sub(fp_t *out, const fp_t *a, const fp_t *b) +{ + modsub(*a, *b, *out); +} + +void +fp_neg(fp_t *out, const fp_t *a) +{ + modneg(*a, *out); +} + +void +fp_sqr(fp_t *out, const fp_t *a) +{ + modsqr(*a, *out); +} + +void +fp_mul(fp_t *out, const fp_t *a, const fp_t *b) +{ + modmul(*a, *b, *out); +} + +void +fp_inv(fp_t *x) +{ + modinv(*x, NULL, *x); +} + +uint32_t +fp_is_square(const fp_t *a) +{ + return -(uint32_t)modqr(NULL, *a); +} + +void +fp_sqrt(fp_t *a) +{ + modsqrt(*a, NULL, *a); +} + +void +fp_half(fp_t *out, const fp_t *a) +{ + modmul(TWO_INV, *a, *out); +} + +void +fp_exp3div4(fp_t *out, const fp_t *a) +{ + modpro(*a, *out); +} + +void +fp_div3(fp_t *out, const fp_t *a) +{ + modmul(THREE_INV, *a, *out); +} + +void +fp_encode(void *dst, const fp_t *a) +{ + // Modified version of modexp() + int i; + spint c[5]; + redc(*a, c); + for (i = 0; i < 32; i++) { + ((char *)dst)[i] = c[0] & (spint)0xff; + (void)modshr(8, c); + } +} + +uint32_t +fp_decode(fp_t *d, const void *src) +{ + // Modified version of modimp() + int i; + spint res; + const unsigned char *b = src; + for (i = 0; i < 5; i++) { + (*d)[i] = 0; + } + for (i = 31; i >= 0; i--) { + modshl(8, *d); + (*d)[0] += (spint)b[i]; + } + res = (spint)-modfsb(*d); + nres(*d, *d); + // If the value was canonical then res = -1; otherwise, res = 0 + for (i = 0; i < 5; i++) { + (*d)[i] &= res; + } + return (uint32_t)res; +} + +static inline unsigned char +add_carry(unsigned char cc, spint a, spint b, spint *d) +{ + udpint t = (udpint)a + (udpint)b + cc; + *d = (spint)t; + return (unsigned char)(t >> Wordlength); +} + +static void +partial_reduce(spint *out, const spint *src) +{ + spint h, l, quo, rem; + unsigned char cc; + + // Split value in high (8 bits) and low (248 bits) parts. + h = src[3] >> 56; + l = src[3] & 0x00FFFFFFFFFFFFFF; + + // 5*2^248 = 1 mod q; hence, we add floor(h/5) + (h mod 5)*2^248 + // to the low part. + quo = (h * 0xCD) >> 10; + rem = h - (5 * quo); + cc = add_carry(0, src[0], quo, &out[0]); + cc = add_carry(cc, src[1], 0, &out[1]); + cc = add_carry(cc, src[2], 0, &out[2]); + (void)add_carry(cc, l, rem << 56, &out[3]); +} + +// Little-endian encoding of a 64-bit integer. +static inline void +enc64le(void *dst, uint64_t x) +{ + uint8_t *buf = dst; + buf[0] = (uint8_t)x; + buf[1] = (uint8_t)(x >> 8); + buf[2] = (uint8_t)(x >> 16); + buf[3] = (uint8_t)(x >> 24); + buf[4] = (uint8_t)(x >> 32); + buf[5] = (uint8_t)(x >> 40); + buf[6] = (uint8_t)(x >> 48); + buf[7] = (uint8_t)(x >> 56); +} + +// Little-endian decoding of a 64-bit integer. +static inline uint64_t +dec64le(const void *src) +{ + const uint8_t *buf = src; + return (spint)buf[0] | ((spint)buf[1] << 8) | ((spint)buf[2] << 16) | ((spint)buf[3] << 24) | + ((spint)buf[4] << 32) | ((spint)buf[5] << 40) | ((spint)buf[6] << 48) | ((spint)buf[7] << 56); +} + +void +fp_decode_reduce(fp_t *d, const void *src, size_t len) +{ + uint64_t t[4]; // Stores Nbytes * 8 bits + uint8_t tmp[32]; // Nbytes + const uint8_t *b = src; + + fp_set_zero(d); + if (len == 0) { + return; + } + + size_t rem = len % 32; + if (rem != 0) { + // Input size is not a multiple of 32, we decode a partial + // block, which is already less than 2^248. + size_t k = len - rem; + memcpy(tmp, b + k, len - k); + memset(tmp + len - k, 0, (sizeof tmp) - (len - k)); + fp_decode(d, tmp); + len = k; + } + // Process all remaining blocks, in descending address order. + while (len > 0) { + fp_mul(d, d, &R2); + len -= 32; + t[0] = dec64le(b + len); + t[1] = dec64le(b + len + 8); + t[2] = dec64le(b + len + 16); + t[3] = dec64le(b + len + 24); + partial_reduce(t, t); + enc64le(tmp, t[0]); + enc64le(tmp + 8, t[1]); + enc64le(tmp + 16, t[2]); + enc64le(tmp + 24, t[3]); + fp_t a; + fp_decode(&a, tmp); + fp_add(d, d, &a); + } +} diff --git a/src/gf/ref/lvl1/include/fp.h b/src/gf/ref/lvl1/include/fp.h deleted file mode 100644 index 833f4c7..0000000 --- a/src/gf/ref/lvl1/include/fp.h +++ /dev/null @@ -1,76 +0,0 @@ -#ifndef FP_H -#define FP_H - -//////////////////////////////////////////////// NOTE: this is placed here for now -#include -#include -#include -#include -#include -#include -#include - -typedef digit_t fp_t[NWORDS_FIELD]; // Datatype for representing field elements - -void fp_set(digit_t* x, const digit_t val); -bool fp_is_equal(const digit_t* a, const digit_t* b); -bool fp_is_zero(const digit_t* a); -void fp_copy(digit_t* out, const digit_t* a); -digit_t mp_shiftr(digit_t* x, const unsigned int shift, const unsigned int nwords); -void mp_shiftl(digit_t* x, const unsigned int shift, const unsigned int nwords); -void fp_add(digit_t* out, const digit_t* a, const digit_t* b); -void fp_sub(digit_t* out, const digit_t* a, const digit_t* b); -void fp_neg(digit_t* out, const digit_t* a); -void fp_sqr(digit_t* out, const digit_t* a); -void fp_mul(digit_t* out, const digit_t* a, const digit_t* b); -void MUL(digit_t* out, const digit_t a, const digit_t b); -void fp_inv(digit_t* x); -bool fp_is_square(const digit_t* a); -void fp_sqrt(digit_t* a); -void fp_tomont(digit_t* out, const digit_t* a); -void fp_frommont(digit_t* out, const digit_t* a); -void fp_mont_setone(digit_t* out); - -/********************** Constant-time unsigned comparisons ***********************/ - -// The following functions return 1 (TRUE) if condition is true, 0 (FALSE) otherwise - -static inline unsigned int is_digit_nonzero_ct(digit_t x) -{ // Is x != 0? - return (unsigned int)((x | (0 - x)) >> (RADIX - 1)); -} - -static inline unsigned int is_digit_zero_ct(digit_t x) -{ // Is x = 0? - return (unsigned int)(1 ^ is_digit_nonzero_ct(x)); -} - -static inline unsigned int is_digit_lessthan_ct(digit_t x, digit_t y) -{ // Is x < y? - return (unsigned int)((x ^ ((x ^ y) | ((x - y) ^ y))) >> (RADIX - 1)); -} - -/********************** Platform-independent macros for digit-size operations **********************/ - -// Digit addition with carry -#define ADDC(sumOut, carryOut, addend1, addend2, carryIn) \ - { digit_t tempReg = (addend1) + (digit_t)(carryIn); \ - (sumOut) = (addend2) + tempReg; \ - (carryOut) = (is_digit_lessthan_ct(tempReg, (digit_t)(carryIn)) | is_digit_lessthan_ct((sumOut), tempReg)); } - -// Digit subtraction with borrow -#define SUBC(differenceOut, borrowOut, minuend, subtrahend, borrowIn) \ - { digit_t tempReg = (minuend) - (subtrahend); \ - unsigned int borrowReg = (is_digit_lessthan_ct((minuend), (subtrahend)) | ((borrowIn) & is_digit_zero_ct(tempReg))); \ - (differenceOut) = tempReg - (digit_t)(borrowIn); \ - (borrowOut) = borrowReg; } - -// Shift right with flexible datatype -#define SHIFTR(highIn, lowIn, shift, shiftOut, DigitSize) \ - (shiftOut) = ((lowIn) >> (shift)) ^ ((highIn) << (DigitSize - (shift))); - -// Digit shift left -#define SHIFTL(highIn, lowIn, shift, shiftOut, DigitSize) \ - (shiftOut) = ((highIn) << (shift)) ^ ((lowIn) >> (RADIX - (shift))); - -#endif \ No newline at end of file diff --git a/src/gf/ref/lvl1/include/fp2.h b/src/gf/ref/lvl1/include/fp2.h deleted file mode 100755 index 2e01669..0000000 --- a/src/gf/ref/lvl1/include/fp2.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef FP2_H -#define FP2_H - -#include "fp.h" - -// Structure for representing elements in GF(p^2) -typedef struct fp2_t { - fp_t re, im; -} fp2_t; - -void fp2_set(fp2_t* x, const digit_t val); -bool fp2_is_zero(const fp2_t* a); -bool fp2_is_equal(const fp2_t* a, const fp2_t* b); -void fp2_copy(fp2_t* x, const fp2_t* y); -fp2_t fp2_non_residue(); -void fp2_add(fp2_t* x, const fp2_t* y, const fp2_t* z); -void fp2_sub(fp2_t* x, const fp2_t* y, const fp2_t* z); -void fp2_neg(fp2_t* x, const fp2_t* y); -void fp2_mul(fp2_t* x, const fp2_t* y, const fp2_t* z); -void fp2_sqr(fp2_t* x, const fp2_t* y); -void fp2_inv(fp2_t* x); -bool fp2_is_square(const fp2_t* x); -void fp2_frob(fp2_t* x, const fp2_t* y); -void fp2_sqrt(fp2_t* x); -void fp2_tomont(fp2_t* x, const fp2_t* y); -void fp2_frommont(fp2_t* x, const fp2_t* y); -int fp2_cmp(fp2_t* x, fp2_t* y); - -#endif diff --git a/src/gf/ref/lvl1/test/CMakeLists.txt b/src/gf/ref/lvl1/test/CMakeLists.txt index 2f769a7..316e0a8 100644 --- a/src/gf/ref/lvl1/test/CMakeLists.txt +++ b/src/gf/ref/lvl1/test/CMakeLists.txt @@ -1,9 +1 @@ -add_executable(sqisign_test_gf_${SVARIANT_LOWER}_fp test_fp.c test_extras.c) -target_link_libraries(sqisign_test_gf_${SVARIANT_LOWER}_fp ${LIB_GF_${SVARIANT_UPPER}}) -target_include_directories(sqisign_test_gf_${SVARIANT_LOWER}_fp PRIVATE ../include ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC}) -add_test(sqisign_test_gf_${SVARIANT_LOWER}_fp sqisign_test_gf_${SVARIANT_LOWER}_fp test ${SQISIGN_TEST_REPS}) - -add_executable(sqisign_test_gf_${SVARIANT_LOWER}_fp2 test_fp2.c test_extras.c) -target_link_libraries(sqisign_test_gf_${SVARIANT_LOWER}_fp2 ${LIB_GF_${SVARIANT_UPPER}}) -target_include_directories(sqisign_test_gf_${SVARIANT_LOWER}_fp2 PRIVATE ../include ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC}) -add_test(sqisign_test_gf_${SVARIANT_LOWER}_fp2 sqisign_test_gf_${SVARIANT_LOWER}_fp2 test ${SQISIGN_TEST_REPS}) \ No newline at end of file +include(../../lvlx_test.cmake) diff --git a/src/gf/ref/lvl1/test/test_extras.c b/src/gf/ref/lvl1/test/test_extras.c deleted file mode 100755 index ce61317..0000000 --- a/src/gf/ref/lvl1/test/test_extras.c +++ /dev/null @@ -1,74 +0,0 @@ -#include "test_extras.h" -#include - -// Global constants -extern const digit_t p[NWORDS_FIELD]; -extern const digit_t R2[NWORDS_FIELD]; - -#if 0 -int64_t cpucycles(void) -{ // Access system counter for benchmarking - unsigned int hi, lo; - - asm volatile ("rdtsc\n\t" : "=a" (lo), "=d"(hi)); - return ((int64_t)lo) | (((int64_t)hi) << 32); -} -#endif - - -int compare_words(digit_t* a, digit_t* b, unsigned int nwords) -{ // Comparing "nword" elements, a=b? : (1) a>b, (0) a=b, (-1) a= 0; i--) - { - if (a[i] > b[i]) return 1; - else if (a[i] < b[i]) return -1; - } - - return 0; -} - - -static void sub_test(digit_t* out, digit_t* a, digit_t* b, unsigned int nwords) -{ // Subtraction without borrow, out = a-b where a>b - // SECURITY NOTE: this function does not have constant-time execution. It is for TESTING ONLY. - unsigned int i; - digit_t res, carry, borrow = 0; - - for (i = 0; i < nwords; i++) - { - res = a[i] - b[i]; - carry = (a[i] < b[i]); - out[i] = res - borrow; - borrow = carry || (res < borrow); - } -} - - -void fprandom_test(digit_t* a) -{ // Generating a pseudo-random field element in [0, p-1] - // SECURITY NOTE: distribution is not fully uniform. TO BE USED FOR TESTING ONLY. - unsigned int i, diff = 256-254, nwords = NWORDS_FIELD; - unsigned char* string = NULL; - - string = (unsigned char*)a; - for (i = 0; i < sizeof(digit_t)*nwords; i++) { - *(string + i) = (unsigned char)rand(); // Obtain 256-bit number - } - a[nwords-1] &= (((digit_t)(-1) << diff) >> diff); - - while (compare_words((digit_t*)p, a, nwords) < 1) { // Force it to [0, modulus-1] - sub_test(a, a, (digit_t*)p, nwords); - } -} - - -void fp2random_test(fp2_t* a) -{ // Generating a pseudo-random element in GF(p^2) - // SECURITY NOTE: distribution is not fully uniform. TO BE USED FOR TESTING ONLY. - - fprandom_test(a->re); - fprandom_test(a->im); -} \ No newline at end of file diff --git a/src/gf/ref/lvl1/test/test_extras.h b/src/gf/ref/lvl1/test/test_extras.h deleted file mode 100755 index ae24e33..0000000 --- a/src/gf/ref/lvl1/test/test_extras.h +++ /dev/null @@ -1,25 +0,0 @@ - -#ifndef TEST_EXTRAS_H -#define TEST_EXTRAS_H - -#include -#include -#include "../include/fp.h" -#include "../include/fp2.h" - -#define PASSED 0 -#define FAILED 1 - -// Access system counter for benchmarking -//int64_t cpucycles(void); - -// Comparing "nword" elements, a=b? : (1) a!=b, (0) a=b -int compare_words(digit_t* a, digit_t* b, unsigned int nwords); - -// Generating a pseudo-random field element in [0, p-1] -void fprandom_test(digit_t* a); - -// Generating a pseudo-random element in GF(p^2) -void fp2random_test(fp2_t* a); - -#endif \ No newline at end of file diff --git a/src/gf/ref/lvl1/test/test_fp.c b/src/gf/ref/lvl1/test/test_fp.c deleted file mode 100755 index 1cdd247..0000000 --- a/src/gf/ref/lvl1/test/test_fp.c +++ /dev/null @@ -1,295 +0,0 @@ -#include "test_extras.h" -#include -#include -#include - -// Global constants -extern const digit_t p[NWORDS_FIELD]; - -// Benchmark and test parameters -static int BENCH_LOOPS = 100000; // Number of iterations per bench -static int TEST_LOOPS = 100000; // Number of iterations per test - - -bool fp_test() -{ // Tests for the field arithmetic - bool OK = true; - int n, passed; - fp_t a, b, c, d, e, f, ma, mb, mc, md, me, mf; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing field arithmetic over GF(p): \n\n"); - - // Field addition - passed = 1; - for (n=0; n\n"); - exit(1); - } - if (!strcmp(argv[1], "test")) { - TEST_LOOPS = atoi(argv[2]); - return !fp_test(); - } else if (!strcmp(argv[1], "bench")) { - BENCH_LOOPS = atoi(argv[2]); - return !fp_run(); - } else { - exit(1); - } -} \ No newline at end of file diff --git a/src/gf/ref/lvl1/test/test_fp2.c b/src/gf/ref/lvl1/test/test_fp2.c deleted file mode 100755 index f6cef7d..0000000 --- a/src/gf/ref/lvl1/test/test_fp2.c +++ /dev/null @@ -1,307 +0,0 @@ -#include "test_extras.h" -#include -#include -#include - -// Global constants -extern const digit_t p[NWORDS_FIELD]; - -// Benchmark and test parameters -static int BENCH_LOOPS = 100000; // Number of iterations per bench -static int TEST_LOOPS = 100000; // Number of iterations per test - - -bool fp2_test() -{ // Tests for the GF(p^2) arithmetic - bool OK = true; - int n, passed; - fp2_t a, b, c, d, e, f, ma, mb, mc, md, me, mf; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing arithmetic over GF(p^2): \n\n"); - - // Addition in GF(p^2) - passed = 1; - for (n=0; n\n"); - exit(1); - } - if (!strcmp(argv[1], "test")) { - TEST_LOOPS = atoi(argv[2]); - return !fp2_test(); - } else if (!strcmp(argv[1], "bench")) { - BENCH_LOOPS = atoi(argv[2]); - return !fp2_run(); - } else { - exit(1); - } -} \ No newline at end of file diff --git a/src/gf/ref/lvl3/CMakeLists.txt b/src/gf/ref/lvl3/CMakeLists.txt index cd81a50..f9d6b64 100644 --- a/src/gf/ref/lvl3/CMakeLists.txt +++ b/src/gf/ref/lvl3/CMakeLists.txt @@ -1,10 +1,5 @@ - -set(SOURCE_FILES_GF_${SVARIANT_UPPER}_REF - fp_p47441.c fp.c fp2.c +set(SOURCE_FILES_GF_SPECIFIC + fp_p65376_${RADIX}.c ) -add_library(${LIB_GF_${SVARIANT_UPPER}} ${SOURCE_FILES_GF_${SVARIANT_UPPER}_REF}) -target_include_directories(${LIB_GF_${SVARIANT_UPPER}} PRIVATE common ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} include ${PROJECT_SOURCE_DIR}/include ${INC_COMMON}) -target_compile_options(${LIB_GF_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) +include(../lvlx.cmake) diff --git a/src/gf/ref/lvl3/Makefile b/src/gf/ref/lvl3/Makefile deleted file mode 100644 index f83ebee..0000000 --- a/src/gf/ref/lvl3/Makefile +++ /dev/null @@ -1,43 +0,0 @@ - -CC=gcc -CFLAGS= -O3 -std=gnu11 -Wall -march=native -Wno-missing-braces -Wno-logical-not-parentheses -LDFLAGS=-lm -AR=ar rcs -RANLIB=ranlib - -OBJECTS=objs/fp_p47441.o objs/fp.o objs/fp2.o objs/random.o - -all: lib tests - -objs/fp_p47441.o: fp_p47441.c - @mkdir -p $(@D) - $(CC) -c $(CFLAGS) fp_p47441.c -o objs/fp_p47441.o - -objs/fp.o: fp.c - @mkdir -p $(@D) - $(CC) -c $(CFLAGS) fp.c -o objs/fp.o - -objs/fp2.o: fp2.c - @mkdir -p $(@D) - $(CC) -c $(CFLAGS) fp2.c -o objs/fp2.o - -objs/random.o: ../../../common/generic/randombytes_system.c - $(CC) -c $(CFLAGS) ../../../common/generic/randombytes_system.c -o objs/random.o - -lib: $(OBJECTS) - rm -rf lib - mkdir lib - $(AR) lib/libtest.a $^ - $(RANLIB) lib/libtest.a - -tests: lib - $(CC) $(CFLAGS) -L./lib test/test_fp.c test/test_extras.c -ltest $(LDFLAGS) -o test_fp -lgmp - $(CC) $(CFLAGS) -L./lib test/test_fp2.c test/test_extras.c -ltest $(LDFLAGS) -o test_fp2 -lgmp - -check: tests - -.PHONY: clean - -clean: - rm -rf *.req objs lib test_fp* - diff --git a/src/gf/ref/lvl3/fp.c b/src/gf/ref/lvl3/fp.c deleted file mode 100644 index 6bbbe77..0000000 --- a/src/gf/ref/lvl3/fp.c +++ /dev/null @@ -1,171 +0,0 @@ -#include "include/fp.h" - - -const uint64_t p[NWORDS_FIELD] = { 0xFFFFFFFFFFFFFFFF, 0x4C6174C1FFFFFFFF, 0xC722F669356EA468, 0x65BC2E0A90AEB751, 0xC6AE604A45D10AD6, 0x03DF6EEEAB0871A2 }; -const uint64_t R2[NWORDS_FIELD] = { 0x47B3E8268664617E, 0xDC10C645BFE4A1AC, 0x342C8B98F26F21ED, 0x328905E465CD7DB3, 0x0AFEA5EB6EF0DA10, 0x0389174E2D56216F }; -const uint64_t pp[NWORDS_FIELD] = { 0x01, 0x00, 0x00, 0x00 }; - - - -void fp_set(digit_t* x, const digit_t val) -{ // Set field element x = val, where val has wordsize - - x[0] = val; - for (unsigned int i = 1; i < NWORDS_FIELD; i++) { - x[i] = 0; - } -} - -bool fp_is_equal(const digit_t* a, const digit_t* b) -{ // Compare two field elements in constant time - // Returns 1 (true) if a=b, 0 (false) otherwise - digit_t r = 0; - - for (unsigned int i = 0; i < NWORDS_FIELD; i++) - r |= a[i] ^ b[i]; - - return (bool)is_digit_zero_ct(r); -} - -bool fp_is_zero(const digit_t* a) -{ // Is a field element zero? - // Returns 1 (true) if a=0, 0 (false) otherwise - digit_t r = 0; - - for (unsigned int i = 0; i < NWORDS_FIELD; i++) - r |= a[i] ^ 0; - - return (bool)is_digit_zero_ct(r); -} - -void fp_copy(digit_t* out, const digit_t* a) -{ - memcpy(out, a, NWORDS_FIELD*RADIX/8); -} - -void fp_neg(digit_t* out, const digit_t* a) -{ // Modular negation, out = -a mod p - // Input: a in [0, p-1] - // Output: out in [0, p-1] - unsigned int i, borrow = 0; - - for (i = 0; i < NWORDS_FIELD; i++) { - SUBC(out[i], borrow, ((digit_t*)p)[i], a[i], borrow); - } - fp_sub(out, out, (digit_t*)p); -} - -void MUL(digit_t* out, const digit_t a, const digit_t b) -{ // Digit multiplication, digit*digit -> 2-digit result - // Inputs: a, b in [0, 2^w-1], where w is the computer wordsize - // Output: 0 < out < 2^(2w)-1 - register digit_t al, ah, bl, bh, temp; - digit_t albl, albh, ahbl, ahbh, res1, res2, res3, carry; - digit_t mask_low = (digit_t)(-1) >> (sizeof(digit_t)*4), mask_high = (digit_t)(-1) << (sizeof(digit_t)*4); - - al = a & mask_low; // Low part - ah = a >> (sizeof(digit_t)*4); // High part - bl = b & mask_low; - bh = b >> (sizeof(digit_t)*4); - - albl = al * bl; - albh = al * bh; - ahbl = ah * bl; - ahbh = ah * bh; - out[0] = albl & mask_low; // out00 - - res1 = albl >> (sizeof(digit_t)*4); - res2 = ahbl & mask_low; - res3 = albh & mask_low; - temp = res1 + res2 + res3; - carry = temp >> (sizeof(digit_t)*4); - out[0] ^= temp << (sizeof(digit_t)*4); // out01 - - res1 = ahbl >> (sizeof(digit_t)*4); - res2 = albh >> (sizeof(digit_t)*4); - res3 = ahbh & mask_low; - temp = res1 + res2 + res3 + carry; - out[1] = temp & mask_low; // out10 - carry = temp & mask_high; - out[1] ^= (ahbh & mask_high) + carry; // out11 -} - -digit_t mp_shiftr(digit_t* x, const unsigned int shift, const unsigned int nwords) -{ // Multiprecision right shift - digit_t bit_out = x[0] & 1; - - for (unsigned int i = 0; i < nwords-1; i++) { - SHIFTR(x[i+1], x[i], shift, x[i], RADIX); - } - x[nwords-1] >>= shift; - return bit_out; -} - -void mp_shiftl(digit_t* x, const unsigned int shift, const unsigned int nwords) -{ // Multiprecision left shift - - for (int i = nwords-1; i > 0; i--) { - SHIFTL(x[i], x[i-1], shift, x[i], RADIX); - } - x[0] <<= shift; -} - -static void fp_exp3div4(digit_t* out, const digit_t* a) -{ // Fixed exponentiation out = a^((p-3)/4) mod p - // Input: a in [0, p-1] - // Output: out in [0, p-1] - // Requirement: p = 3(mod 4) - fp_t p_t, acc; - digit_t bit; - - memcpy((digit_t*)p_t, (digit_t*)p, NWORDS_FIELD*RADIX/8); - memcpy((digit_t*)acc, (digit_t*)a, NWORDS_FIELD*RADIX/8); - mp_shiftr(p_t, 1, NWORDS_FIELD); - mp_shiftr(p_t, 1, NWORDS_FIELD); - fp_set(out, 1); - fp_tomont(out, out); - - for (int i = 0; i < NWORDS_FIELD*RADIX-2; i++) { - bit = p_t[0] & 1; - mp_shiftr(p_t, 1, NWORDS_FIELD); - if (bit == 1) { - fp_mul(out, out, acc); - } - fp_sqr(acc, acc); - } -} - -void fp_inv(digit_t* a) -{ // Modular inversion, out = x^-1*R mod p, where R = 2^(w*nwords), w is the computer wordsize and nwords is the number of words to represent p - // Input: a=xR in [0, p-1] - // Output: out in [0, p-1]. It outputs 0 if the input does not have an inverse - // Requirement: Ceiling(Log(p)) < w*nwords - fp_t t; - - fp_exp3div4(t, a); - fp_sqr(t, t); - fp_sqr(t, t); - fp_mul(a, t, a); // a^(p-2) -} - -bool fp_is_square(const digit_t* a) -{ // Is field element a square? - // Output: out = 0 (false), 1 (true) - fp_t t, one; - - fp_exp3div4(t, a); - fp_sqr(t, t); - fp_mul(t, t, a); // a^((p-1)/2) - fp_frommont(t, t); - fp_set(one, 1); - - return fp_is_equal(t, one); -} - -void fp_sqrt(digit_t* a) -{ // Square root computation, out = a^((p+1)/4) mod p - fp_t t; - - fp_exp3div4(t, a); - fp_mul(a, t, a); // a^((p+1)/4) -} \ No newline at end of file diff --git a/src/gf/ref/lvl3/fp2.c b/src/gf/ref/lvl3/fp2.c deleted file mode 100644 index 00ceb76..0000000 --- a/src/gf/ref/lvl3/fp2.c +++ /dev/null @@ -1,194 +0,0 @@ -#include - -extern const digit_t R[NWORDS_FIELD]; - -/* Arithmetic modulo X^2 + 1 */ - -void fp2_set(fp2_t* x, const digit_t val) -{ - fp_set(x->re, val); - fp_set(x->im, 0); -} - -bool fp2_is_zero(const fp2_t* a) -{ // Is a GF(p^2) element zero? - // Returns 1 (true) if a=0, 0 (false) otherwise - - return fp_is_zero(a->re) & fp_is_zero(a->im); -} - -bool fp2_is_equal(const fp2_t* a, const fp2_t* b) -{ // Compare two GF(p^2) elements in constant time - // Returns 1 (true) if a=b, 0 (false) otherwise - - return fp_is_equal(a->re, b->re) & fp_is_equal(a->im, b->im); -} - -void fp2_copy(fp2_t* x, const fp2_t* y) -{ - fp_copy(x->re, y->re); - fp_copy(x->im, y->im); -} - -fp2_t fp2_non_residue() -{ // 6 + i is a quadratic non-residue for p47441 - fp_t one = {0}; - fp2_t res; - - one[0] = 1; - fp_tomont(one, one); - fp_copy(res.im, one); - fp_add(one, one, one); - fp_add(res.re, one, one); - fp_add(res.re, res.re, one); - return res; -} - -void fp2_add(fp2_t* x, const fp2_t* y, const fp2_t* z) -{ - fp_add(x->re, y->re, z->re); - fp_add(x->im, y->im, z->im); -} - -void fp2_sub(fp2_t* x, const fp2_t* y, const fp2_t* z) -{ - fp_sub(x->re, y->re, z->re); - fp_sub(x->im, y->im, z->im); -} - -void fp2_neg(fp2_t* x, const fp2_t* y) -{ - fp_neg(x->re, y->re); - fp_neg(x->im, y->im); -} - -void fp2_mul(fp2_t* x, const fp2_t* y, const fp2_t* z) -{ - fp_t t0, t1; - - fp_add(t0, y->re, y->im); - fp_add(t1, z->re, z->im); - fp_mul(t0, t0, t1); - fp_mul(t1, y->im, z->im); - fp_mul(x->re, y->re, z->re); - fp_sub(x->im, t0, t1); - fp_sub(x->im, x->im, x->re); - fp_sub(x->re, x->re, t1); -} - -void fp2_sqr(fp2_t* x, const fp2_t* y) -{ - fp_t sum, diff; - - fp_add(sum, y->re, y->im); - fp_sub(diff, y->re, y->im); - fp_mul(x->im, y->re, y->im); - fp_add(x->im, x->im, x->im); - fp_mul(x->re, sum, diff); -} - -void fp2_inv(fp2_t* x) -{ - fp_t t0, t1; - - fp_sqr(t0, x->re); - fp_sqr(t1, x->im); - fp_add(t0, t0, t1); - fp_inv(t0); - fp_mul(x->re, x->re, t0); - fp_mul(x->im, x->im, t0); - fp_neg(x->im, x->im); -} - -bool fp2_is_square(const fp2_t* x) -{ - fp_t t0, t1; - - fp_sqr(t0, x->re); - fp_sqr(t1, x->im); - fp_add(t0, t0, t1); - - return fp_is_square(t0); -} - -void fp2_frob(fp2_t* x, const fp2_t* y) -{ - memcpy((digit_t*)x->re, (digit_t*)y->re, NWORDS_FIELD*RADIX/8); - fp_neg(x->im, y->im); -} - -void fp2_tomont(fp2_t* x, const fp2_t* y) -{ - fp_tomont(x->re, y->re); - fp_tomont(x->im, y->im); -} - -void fp2_frommont(fp2_t* x, const fp2_t* y) -{ - fp_frommont(x->re, y->re); - fp_frommont(x->im, y->im); -} - -// NOTE: old, non-constant-time implementation. Could be optimized -void fp2_sqrt(fp2_t* x) -{ - fp_t sdelta, re, tmp1, tmp2, inv2, im; - - if (fp_is_zero(x->im)) { - if (fp_is_square(x->re)) { - fp_sqrt(x->re); - return; - } else { - fp_neg(x->im, x->re); - fp_sqrt(x->im); - fp_set(x->re, 0); - return; - } - } - - // sdelta = sqrt(re^2 + im^2) - fp_sqr(sdelta, x->re); - fp_sqr(tmp1, x->im); - fp_add(sdelta, sdelta, tmp1); - fp_sqrt(sdelta); - - fp_set(inv2, 2); - fp_tomont(inv2, inv2); // inv2 <- 2 - fp_inv(inv2); - fp_add(re, x->re, sdelta); - fp_mul(re, re, inv2); - memcpy((digit_t*)tmp2, (digit_t*)re, NWORDS_FIELD*RADIX/8); - - if (!fp_is_square(tmp2)) { - fp_sub(re, x->re, sdelta); - fp_mul(re, re, inv2); - } - - fp_sqrt(re); - memcpy((digit_t*)im, (digit_t*)re, NWORDS_FIELD*RADIX/8); - - fp_inv(im); - fp_mul(im, im, inv2); - fp_mul(x->im, im, x->im); - memcpy((digit_t*)x->re, (digit_t*)re, NWORDS_FIELD*RADIX/8); -} - -// Lexicographic comparison of two field elements. Returns +1 if x > y, -1 if x < y, 0 if x = y -int fp2_cmp(fp2_t* x, fp2_t* y){ - fp2_t a, b; - fp2_frommont(&a, x); - fp2_frommont(&b, y); - for(int i = NWORDS_FIELD-1; i >= 0; i--){ - if(a.re[i] > b.re[i]) - return 1; - if(a.re[i] < b.re[i]) - return -1; - } - for(int i = NWORDS_FIELD-1; i >= 0; i--){ - if(a.im[i] > b.im[i]) - return 1; - if(a.im[i] < b.im[i]) - return -1; - } - return 0; -} \ No newline at end of file diff --git a/src/gf/ref/lvl3/fp_p47441.c b/src/gf/ref/lvl3/fp_p47441.c deleted file mode 100644 index 26a79e1..0000000 --- a/src/gf/ref/lvl3/fp_p47441.c +++ /dev/null @@ -1,3424 +0,0 @@ -/* Autogenerated: './src/ExtractionOCaml/word_by_word_montgomery' p47441 64 0x3df6eeeab0871a2c6ae604a45d10ad665bc2e0a90aeb751c722f669356ea4684c6174c1ffffffffffffffffffffffff */ -/* curve description: p47441 */ -/* machine_wordsize = 64 (from "64") */ -/* requested operations: (all) */ -/* m = 0x3df6eeeab0871a2c6ae604a45d10ad665bc2e0a90aeb751c722f669356ea4684c6174c1ffffffffffffffffffffffff (from "0x3df6eeeab0871a2c6ae604a45d10ad665bc2e0a90aeb751c722f669356ea4684c6174c1ffffffffffffffffffffffff") */ -/* */ -/* NOTE: In addition to the bounds specified above each function, all */ -/* functions synthesized for this Montgomery arithmetic require the */ -/* input to be strictly less than the prime modulus (m), and also */ -/* require the input to be in the unique saturated representation. */ -/* All functions also ensure that these two properties are true of */ -/* return values. */ -/* */ -/* Computed values: */ -/* eval z = z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) + (z[4] << 256) + (z[5] << 0x140) */ -/* bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) + (z[8] << 64) + (z[9] << 72) + (z[10] << 80) + (z[11] << 88) + (z[12] << 96) + (z[13] << 104) + (z[14] << 112) + (z[15] << 120) + (z[16] << 128) + (z[17] << 136) + (z[18] << 144) + (z[19] << 152) + (z[20] << 160) + (z[21] << 168) + (z[22] << 176) + (z[23] << 184) + (z[24] << 192) + (z[25] << 200) + (z[26] << 208) + (z[27] << 216) + (z[28] << 224) + (z[29] << 232) + (z[30] << 240) + (z[31] << 248) + (z[32] << 256) + (z[33] << 0x108) + (z[34] << 0x110) + (z[35] << 0x118) + (z[36] << 0x120) + (z[37] << 0x128) + (z[38] << 0x130) + (z[39] << 0x138) + (z[40] << 0x140) + (z[41] << 0x148) + (z[42] << 0x150) + (z[43] << 0x158) + (z[44] << 0x160) + (z[45] << 0x168) + (z[46] << 0x170) + (z[47] << 0x178) */ -/* twos_complement_eval z = let x1 := z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) + (z[4] << 256) + (z[5] << 0x140) in */ -/* if x1 & (2^384-1) < 2^383 then x1 & (2^384-1) else (x1 & (2^384-1)) - 2^384 */ - -#include -typedef unsigned char fiat_p47441_uint1; -typedef signed char fiat_p47441_int1; -#if defined(__GNUC__) || defined(__clang__) -# define FIAT_P47441_FIAT_EXTENSION __extension__ -# define FIAT_P47441_FIAT_INLINE __inline__ -#else -# define FIAT_P47441_FIAT_EXTENSION -# define FIAT_P47441_FIAT_INLINE -#endif - -FIAT_P47441_FIAT_EXTENSION typedef signed __int128 fiat_p47441_int128; -FIAT_P47441_FIAT_EXTENSION typedef unsigned __int128 fiat_p47441_uint128; - -/* The type fiat_p47441_montgomery_domain_field_element is a field element in the Montgomery domain. */ -/* Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] */ -typedef uint64_t fiat_p47441_montgomery_domain_field_element[6]; - -/* The type fiat_p47441_non_montgomery_domain_field_element is a field element NOT in the Montgomery domain. */ -/* Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] */ -typedef uint64_t fiat_p47441_non_montgomery_domain_field_element[6]; - -#if (-1 & 3) != 3 -#error "This code only works on a two's complement system" -#endif - - -/* - * The function fiat_p47441_addcarryx_u64 is an addition with carry. - * - * Postconditions: - * out1 = (arg1 + arg2 + arg3) mod 2^64 - * out2 = ⌊(arg1 + arg2 + arg3) / 2^64⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffffffffffff] - * arg3: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - * out2: [0x0 ~> 0x1] - */ -void fiat_p47441_addcarryx_u64(uint64_t* out1, fiat_p47441_uint1* out2, fiat_p47441_uint1 arg1, uint64_t arg2, uint64_t arg3) { - fiat_p47441_uint128 x1; - uint64_t x2; - fiat_p47441_uint1 x3; - x1 = ((arg1 + (fiat_p47441_uint128)arg2) + arg3); - x2 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff)); - x3 = (fiat_p47441_uint1)(x1 >> 64); - *out1 = x2; - *out2 = x3; -} - -/* - * The function fiat_p47441_subborrowx_u64 is a subtraction with borrow. - * - * Postconditions: - * out1 = (-arg1 + arg2 + -arg3) mod 2^64 - * out2 = -⌊(-arg1 + arg2 + -arg3) / 2^64⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffffffffffff] - * arg3: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - * out2: [0x0 ~> 0x1] - */ -void fiat_p47441_subborrowx_u64(uint64_t* out1, fiat_p47441_uint1* out2, fiat_p47441_uint1 arg1, uint64_t arg2, uint64_t arg3) { - fiat_p47441_int128 x1; - fiat_p47441_int1 x2; - uint64_t x3; - x1 = ((arg2 - (fiat_p47441_int128)arg1) - arg3); - x2 = (fiat_p47441_int1)(x1 >> 64); - x3 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff)); - *out1 = x3; - *out2 = (fiat_p47441_uint1)(0x0 - x2); -} - -/* - * The function fiat_p47441_mulx_u64 is a multiplication, returning the full double-width result. - * - * Postconditions: - * out1 = (arg1 * arg2) mod 2^64 - * out2 = ⌊arg1 * arg2 / 2^64⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0xffffffffffffffff] - * arg2: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - * out2: [0x0 ~> 0xffffffffffffffff] - */ -void fiat_p47441_mulx_u64(uint64_t* out1, uint64_t* out2, uint64_t arg1, uint64_t arg2) { - fiat_p47441_uint128 x1; - uint64_t x2; - uint64_t x3; - x1 = ((fiat_p47441_uint128)arg1 * arg2); - x2 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff)); - x3 = (uint64_t)(x1 >> 64); - *out1 = x2; - *out2 = x3; -} - -/* - * The function fiat_p47441_cmovznz_u64 is a single-word conditional move. - * - * Postconditions: - * out1 = (if arg1 = 0 then arg2 else arg3) - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffffffffffff] - * arg3: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - */ -void fiat_p47441_cmovznz_u64(uint64_t* out1, fiat_p47441_uint1 arg1, uint64_t arg2, uint64_t arg3) { - fiat_p47441_uint1 x1; - uint64_t x2; - uint64_t x3; - x1 = (!(!arg1)); - x2 = ((fiat_p47441_int1)(0x0 - x1) & UINT64_C(0xffffffffffffffff)); - x3 = ((x2 & arg3) | ((~x2) & arg2)); - *out1 = x3; -} - -/* - * The function fiat_p47441_mul multiplies two field elements in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * 0 ≤ eval arg2 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg2)) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p47441_mul(fiat_p47441_montgomery_domain_field_element out1, const fiat_p47441_montgomery_domain_field_element arg1, const fiat_p47441_montgomery_domain_field_element arg2) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - uint64_t x14; - uint64_t x15; - uint64_t x16; - uint64_t x17; - uint64_t x18; - uint64_t x19; - fiat_p47441_uint1 x20; - uint64_t x21; - fiat_p47441_uint1 x22; - uint64_t x23; - fiat_p47441_uint1 x24; - uint64_t x25; - fiat_p47441_uint1 x26; - uint64_t x27; - fiat_p47441_uint1 x28; - uint64_t x29; - uint64_t x30; - uint64_t x31; - uint64_t x32; - uint64_t x33; - uint64_t x34; - uint64_t x35; - uint64_t x36; - uint64_t x37; - uint64_t x38; - uint64_t x39; - uint64_t x40; - uint64_t x41; - uint64_t x42; - fiat_p47441_uint1 x43; - uint64_t x44; - fiat_p47441_uint1 x45; - uint64_t x46; - fiat_p47441_uint1 x47; - uint64_t x48; - fiat_p47441_uint1 x49; - uint64_t x50; - fiat_p47441_uint1 x51; - uint64_t x52; - uint64_t x53; - fiat_p47441_uint1 x54; - uint64_t x55; - fiat_p47441_uint1 x56; - uint64_t x57; - fiat_p47441_uint1 x58; - uint64_t x59; - fiat_p47441_uint1 x60; - uint64_t x61; - fiat_p47441_uint1 x62; - uint64_t x63; - fiat_p47441_uint1 x64; - uint64_t x65; - fiat_p47441_uint1 x66; - uint64_t x67; - uint64_t x68; - uint64_t x69; - uint64_t x70; - uint64_t x71; - uint64_t x72; - uint64_t x73; - uint64_t x74; - uint64_t x75; - uint64_t x76; - uint64_t x77; - uint64_t x78; - uint64_t x79; - fiat_p47441_uint1 x80; - uint64_t x81; - fiat_p47441_uint1 x82; - uint64_t x83; - fiat_p47441_uint1 x84; - uint64_t x85; - fiat_p47441_uint1 x86; - uint64_t x87; - fiat_p47441_uint1 x88; - uint64_t x89; - uint64_t x90; - fiat_p47441_uint1 x91; - uint64_t x92; - fiat_p47441_uint1 x93; - uint64_t x94; - fiat_p47441_uint1 x95; - uint64_t x96; - fiat_p47441_uint1 x97; - uint64_t x98; - fiat_p47441_uint1 x99; - uint64_t x100; - fiat_p47441_uint1 x101; - uint64_t x102; - fiat_p47441_uint1 x103; - uint64_t x104; - uint64_t x105; - uint64_t x106; - uint64_t x107; - uint64_t x108; - uint64_t x109; - uint64_t x110; - uint64_t x111; - uint64_t x112; - uint64_t x113; - uint64_t x114; - uint64_t x115; - uint64_t x116; - fiat_p47441_uint1 x117; - uint64_t x118; - fiat_p47441_uint1 x119; - uint64_t x120; - fiat_p47441_uint1 x121; - uint64_t x122; - fiat_p47441_uint1 x123; - uint64_t x124; - fiat_p47441_uint1 x125; - uint64_t x126; - uint64_t x127; - fiat_p47441_uint1 x128; - uint64_t x129; - fiat_p47441_uint1 x130; - uint64_t x131; - fiat_p47441_uint1 x132; - uint64_t x133; - fiat_p47441_uint1 x134; - uint64_t x135; - fiat_p47441_uint1 x136; - uint64_t x137; - fiat_p47441_uint1 x138; - uint64_t x139; - fiat_p47441_uint1 x140; - uint64_t x141; - uint64_t x142; - uint64_t x143; - uint64_t x144; - uint64_t x145; - uint64_t x146; - uint64_t x147; - uint64_t x148; - uint64_t x149; - uint64_t x150; - uint64_t x151; - uint64_t x152; - uint64_t x153; - uint64_t x154; - fiat_p47441_uint1 x155; - uint64_t x156; - fiat_p47441_uint1 x157; - uint64_t x158; - fiat_p47441_uint1 x159; - uint64_t x160; - fiat_p47441_uint1 x161; - uint64_t x162; - fiat_p47441_uint1 x163; - uint64_t x164; - uint64_t x165; - fiat_p47441_uint1 x166; - uint64_t x167; - fiat_p47441_uint1 x168; - uint64_t x169; - fiat_p47441_uint1 x170; - uint64_t x171; - fiat_p47441_uint1 x172; - uint64_t x173; - fiat_p47441_uint1 x174; - uint64_t x175; - fiat_p47441_uint1 x176; - uint64_t x177; - fiat_p47441_uint1 x178; - uint64_t x179; - uint64_t x180; - uint64_t x181; - uint64_t x182; - uint64_t x183; - uint64_t x184; - uint64_t x185; - uint64_t x186; - uint64_t x187; - uint64_t x188; - uint64_t x189; - uint64_t x190; - uint64_t x191; - fiat_p47441_uint1 x192; - uint64_t x193; - fiat_p47441_uint1 x194; - uint64_t x195; - fiat_p47441_uint1 x196; - uint64_t x197; - fiat_p47441_uint1 x198; - uint64_t x199; - fiat_p47441_uint1 x200; - uint64_t x201; - uint64_t x202; - fiat_p47441_uint1 x203; - uint64_t x204; - fiat_p47441_uint1 x205; - uint64_t x206; - fiat_p47441_uint1 x207; - uint64_t x208; - fiat_p47441_uint1 x209; - uint64_t x210; - fiat_p47441_uint1 x211; - uint64_t x212; - fiat_p47441_uint1 x213; - uint64_t x214; - fiat_p47441_uint1 x215; - uint64_t x216; - uint64_t x217; - uint64_t x218; - uint64_t x219; - uint64_t x220; - uint64_t x221; - uint64_t x222; - uint64_t x223; - uint64_t x224; - uint64_t x225; - uint64_t x226; - uint64_t x227; - uint64_t x228; - uint64_t x229; - fiat_p47441_uint1 x230; - uint64_t x231; - fiat_p47441_uint1 x232; - uint64_t x233; - fiat_p47441_uint1 x234; - uint64_t x235; - fiat_p47441_uint1 x236; - uint64_t x237; - fiat_p47441_uint1 x238; - uint64_t x239; - uint64_t x240; - fiat_p47441_uint1 x241; - uint64_t x242; - fiat_p47441_uint1 x243; - uint64_t x244; - fiat_p47441_uint1 x245; - uint64_t x246; - fiat_p47441_uint1 x247; - uint64_t x248; - fiat_p47441_uint1 x249; - uint64_t x250; - fiat_p47441_uint1 x251; - uint64_t x252; - fiat_p47441_uint1 x253; - uint64_t x254; - uint64_t x255; - uint64_t x256; - uint64_t x257; - uint64_t x258; - uint64_t x259; - uint64_t x260; - uint64_t x261; - uint64_t x262; - uint64_t x263; - uint64_t x264; - uint64_t x265; - uint64_t x266; - fiat_p47441_uint1 x267; - uint64_t x268; - fiat_p47441_uint1 x269; - uint64_t x270; - fiat_p47441_uint1 x271; - uint64_t x272; - fiat_p47441_uint1 x273; - uint64_t x274; - fiat_p47441_uint1 x275; - uint64_t x276; - uint64_t x277; - fiat_p47441_uint1 x278; - uint64_t x279; - fiat_p47441_uint1 x280; - uint64_t x281; - fiat_p47441_uint1 x282; - uint64_t x283; - fiat_p47441_uint1 x284; - uint64_t x285; - fiat_p47441_uint1 x286; - uint64_t x287; - fiat_p47441_uint1 x288; - uint64_t x289; - fiat_p47441_uint1 x290; - uint64_t x291; - uint64_t x292; - uint64_t x293; - uint64_t x294; - uint64_t x295; - uint64_t x296; - uint64_t x297; - uint64_t x298; - uint64_t x299; - uint64_t x300; - uint64_t x301; - uint64_t x302; - uint64_t x303; - uint64_t x304; - fiat_p47441_uint1 x305; - uint64_t x306; - fiat_p47441_uint1 x307; - uint64_t x308; - fiat_p47441_uint1 x309; - uint64_t x310; - fiat_p47441_uint1 x311; - uint64_t x312; - fiat_p47441_uint1 x313; - uint64_t x314; - uint64_t x315; - fiat_p47441_uint1 x316; - uint64_t x317; - fiat_p47441_uint1 x318; - uint64_t x319; - fiat_p47441_uint1 x320; - uint64_t x321; - fiat_p47441_uint1 x322; - uint64_t x323; - fiat_p47441_uint1 x324; - uint64_t x325; - fiat_p47441_uint1 x326; - uint64_t x327; - fiat_p47441_uint1 x328; - uint64_t x329; - uint64_t x330; - uint64_t x331; - uint64_t x332; - uint64_t x333; - uint64_t x334; - uint64_t x335; - uint64_t x336; - uint64_t x337; - uint64_t x338; - uint64_t x339; - uint64_t x340; - uint64_t x341; - fiat_p47441_uint1 x342; - uint64_t x343; - fiat_p47441_uint1 x344; - uint64_t x345; - fiat_p47441_uint1 x346; - uint64_t x347; - fiat_p47441_uint1 x348; - uint64_t x349; - fiat_p47441_uint1 x350; - uint64_t x351; - uint64_t x352; - fiat_p47441_uint1 x353; - uint64_t x354; - fiat_p47441_uint1 x355; - uint64_t x356; - fiat_p47441_uint1 x357; - uint64_t x358; - fiat_p47441_uint1 x359; - uint64_t x360; - fiat_p47441_uint1 x361; - uint64_t x362; - fiat_p47441_uint1 x363; - uint64_t x364; - fiat_p47441_uint1 x365; - uint64_t x366; - uint64_t x367; - uint64_t x368; - uint64_t x369; - uint64_t x370; - uint64_t x371; - uint64_t x372; - uint64_t x373; - uint64_t x374; - uint64_t x375; - uint64_t x376; - uint64_t x377; - uint64_t x378; - uint64_t x379; - fiat_p47441_uint1 x380; - uint64_t x381; - fiat_p47441_uint1 x382; - uint64_t x383; - fiat_p47441_uint1 x384; - uint64_t x385; - fiat_p47441_uint1 x386; - uint64_t x387; - fiat_p47441_uint1 x388; - uint64_t x389; - uint64_t x390; - fiat_p47441_uint1 x391; - uint64_t x392; - fiat_p47441_uint1 x393; - uint64_t x394; - fiat_p47441_uint1 x395; - uint64_t x396; - fiat_p47441_uint1 x397; - uint64_t x398; - fiat_p47441_uint1 x399; - uint64_t x400; - fiat_p47441_uint1 x401; - uint64_t x402; - fiat_p47441_uint1 x403; - uint64_t x404; - uint64_t x405; - uint64_t x406; - uint64_t x407; - uint64_t x408; - uint64_t x409; - uint64_t x410; - uint64_t x411; - uint64_t x412; - uint64_t x413; - uint64_t x414; - uint64_t x415; - uint64_t x416; - fiat_p47441_uint1 x417; - uint64_t x418; - fiat_p47441_uint1 x419; - uint64_t x420; - fiat_p47441_uint1 x421; - uint64_t x422; - fiat_p47441_uint1 x423; - uint64_t x424; - fiat_p47441_uint1 x425; - uint64_t x426; - uint64_t x427; - fiat_p47441_uint1 x428; - uint64_t x429; - fiat_p47441_uint1 x430; - uint64_t x431; - fiat_p47441_uint1 x432; - uint64_t x433; - fiat_p47441_uint1 x434; - uint64_t x435; - fiat_p47441_uint1 x436; - uint64_t x437; - fiat_p47441_uint1 x438; - uint64_t x439; - fiat_p47441_uint1 x440; - uint64_t x441; - uint64_t x442; - fiat_p47441_uint1 x443; - uint64_t x444; - fiat_p47441_uint1 x445; - uint64_t x446; - fiat_p47441_uint1 x447; - uint64_t x448; - fiat_p47441_uint1 x449; - uint64_t x450; - fiat_p47441_uint1 x451; - uint64_t x452; - fiat_p47441_uint1 x453; - uint64_t x454; - fiat_p47441_uint1 x455; - uint64_t x456; - uint64_t x457; - uint64_t x458; - uint64_t x459; - uint64_t x460; - uint64_t x461; - x1 = (arg1[1]); - x2 = (arg1[2]); - x3 = (arg1[3]); - x4 = (arg1[4]); - x5 = (arg1[5]); - x6 = (arg1[0]); - fiat_p47441_mulx_u64(&x7, &x8, x6, (arg2[5])); - fiat_p47441_mulx_u64(&x9, &x10, x6, (arg2[4])); - fiat_p47441_mulx_u64(&x11, &x12, x6, (arg2[3])); - fiat_p47441_mulx_u64(&x13, &x14, x6, (arg2[2])); - fiat_p47441_mulx_u64(&x15, &x16, x6, (arg2[1])); - fiat_p47441_mulx_u64(&x17, &x18, x6, (arg2[0])); - fiat_p47441_addcarryx_u64(&x19, &x20, 0x0, x18, x15); - fiat_p47441_addcarryx_u64(&x21, &x22, x20, x16, x13); - fiat_p47441_addcarryx_u64(&x23, &x24, x22, x14, x11); - fiat_p47441_addcarryx_u64(&x25, &x26, x24, x12, x9); - fiat_p47441_addcarryx_u64(&x27, &x28, x26, x10, x7); - x29 = (x28 + x8); - fiat_p47441_mulx_u64(&x30, &x31, x17, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x32, &x33, x17, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x34, &x35, x17, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x36, &x37, x17, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x38, &x39, x17, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x40, &x41, x17, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x42, &x43, 0x0, x41, x38); - fiat_p47441_addcarryx_u64(&x44, &x45, x43, x39, x36); - fiat_p47441_addcarryx_u64(&x46, &x47, x45, x37, x34); - fiat_p47441_addcarryx_u64(&x48, &x49, x47, x35, x32); - fiat_p47441_addcarryx_u64(&x50, &x51, x49, x33, x30); - x52 = (x51 + x31); - fiat_p47441_addcarryx_u64(&x53, &x54, 0x0, x17, x40); - fiat_p47441_addcarryx_u64(&x55, &x56, x54, x19, x42); - fiat_p47441_addcarryx_u64(&x57, &x58, x56, x21, x44); - fiat_p47441_addcarryx_u64(&x59, &x60, x58, x23, x46); - fiat_p47441_addcarryx_u64(&x61, &x62, x60, x25, x48); - fiat_p47441_addcarryx_u64(&x63, &x64, x62, x27, x50); - fiat_p47441_addcarryx_u64(&x65, &x66, x64, x29, x52); - fiat_p47441_mulx_u64(&x67, &x68, x1, (arg2[5])); - fiat_p47441_mulx_u64(&x69, &x70, x1, (arg2[4])); - fiat_p47441_mulx_u64(&x71, &x72, x1, (arg2[3])); - fiat_p47441_mulx_u64(&x73, &x74, x1, (arg2[2])); - fiat_p47441_mulx_u64(&x75, &x76, x1, (arg2[1])); - fiat_p47441_mulx_u64(&x77, &x78, x1, (arg2[0])); - fiat_p47441_addcarryx_u64(&x79, &x80, 0x0, x78, x75); - fiat_p47441_addcarryx_u64(&x81, &x82, x80, x76, x73); - fiat_p47441_addcarryx_u64(&x83, &x84, x82, x74, x71); - fiat_p47441_addcarryx_u64(&x85, &x86, x84, x72, x69); - fiat_p47441_addcarryx_u64(&x87, &x88, x86, x70, x67); - x89 = (x88 + x68); - fiat_p47441_addcarryx_u64(&x90, &x91, 0x0, x55, x77); - fiat_p47441_addcarryx_u64(&x92, &x93, x91, x57, x79); - fiat_p47441_addcarryx_u64(&x94, &x95, x93, x59, x81); - fiat_p47441_addcarryx_u64(&x96, &x97, x95, x61, x83); - fiat_p47441_addcarryx_u64(&x98, &x99, x97, x63, x85); - fiat_p47441_addcarryx_u64(&x100, &x101, x99, x65, x87); - fiat_p47441_addcarryx_u64(&x102, &x103, x101, x66, x89); - fiat_p47441_mulx_u64(&x104, &x105, x90, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x106, &x107, x90, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x108, &x109, x90, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x110, &x111, x90, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x112, &x113, x90, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x114, &x115, x90, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x116, &x117, 0x0, x115, x112); - fiat_p47441_addcarryx_u64(&x118, &x119, x117, x113, x110); - fiat_p47441_addcarryx_u64(&x120, &x121, x119, x111, x108); - fiat_p47441_addcarryx_u64(&x122, &x123, x121, x109, x106); - fiat_p47441_addcarryx_u64(&x124, &x125, x123, x107, x104); - x126 = (x125 + x105); - fiat_p47441_addcarryx_u64(&x127, &x128, 0x0, x90, x114); - fiat_p47441_addcarryx_u64(&x129, &x130, x128, x92, x116); - fiat_p47441_addcarryx_u64(&x131, &x132, x130, x94, x118); - fiat_p47441_addcarryx_u64(&x133, &x134, x132, x96, x120); - fiat_p47441_addcarryx_u64(&x135, &x136, x134, x98, x122); - fiat_p47441_addcarryx_u64(&x137, &x138, x136, x100, x124); - fiat_p47441_addcarryx_u64(&x139, &x140, x138, x102, x126); - x141 = ((uint64_t)x140 + x103); - fiat_p47441_mulx_u64(&x142, &x143, x2, (arg2[5])); - fiat_p47441_mulx_u64(&x144, &x145, x2, (arg2[4])); - fiat_p47441_mulx_u64(&x146, &x147, x2, (arg2[3])); - fiat_p47441_mulx_u64(&x148, &x149, x2, (arg2[2])); - fiat_p47441_mulx_u64(&x150, &x151, x2, (arg2[1])); - fiat_p47441_mulx_u64(&x152, &x153, x2, (arg2[0])); - fiat_p47441_addcarryx_u64(&x154, &x155, 0x0, x153, x150); - fiat_p47441_addcarryx_u64(&x156, &x157, x155, x151, x148); - fiat_p47441_addcarryx_u64(&x158, &x159, x157, x149, x146); - fiat_p47441_addcarryx_u64(&x160, &x161, x159, x147, x144); - fiat_p47441_addcarryx_u64(&x162, &x163, x161, x145, x142); - x164 = (x163 + x143); - fiat_p47441_addcarryx_u64(&x165, &x166, 0x0, x129, x152); - fiat_p47441_addcarryx_u64(&x167, &x168, x166, x131, x154); - fiat_p47441_addcarryx_u64(&x169, &x170, x168, x133, x156); - fiat_p47441_addcarryx_u64(&x171, &x172, x170, x135, x158); - fiat_p47441_addcarryx_u64(&x173, &x174, x172, x137, x160); - fiat_p47441_addcarryx_u64(&x175, &x176, x174, x139, x162); - fiat_p47441_addcarryx_u64(&x177, &x178, x176, x141, x164); - fiat_p47441_mulx_u64(&x179, &x180, x165, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x181, &x182, x165, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x183, &x184, x165, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x185, &x186, x165, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x187, &x188, x165, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x189, &x190, x165, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x191, &x192, 0x0, x190, x187); - fiat_p47441_addcarryx_u64(&x193, &x194, x192, x188, x185); - fiat_p47441_addcarryx_u64(&x195, &x196, x194, x186, x183); - fiat_p47441_addcarryx_u64(&x197, &x198, x196, x184, x181); - fiat_p47441_addcarryx_u64(&x199, &x200, x198, x182, x179); - x201 = (x200 + x180); - fiat_p47441_addcarryx_u64(&x202, &x203, 0x0, x165, x189); - fiat_p47441_addcarryx_u64(&x204, &x205, x203, x167, x191); - fiat_p47441_addcarryx_u64(&x206, &x207, x205, x169, x193); - fiat_p47441_addcarryx_u64(&x208, &x209, x207, x171, x195); - fiat_p47441_addcarryx_u64(&x210, &x211, x209, x173, x197); - fiat_p47441_addcarryx_u64(&x212, &x213, x211, x175, x199); - fiat_p47441_addcarryx_u64(&x214, &x215, x213, x177, x201); - x216 = ((uint64_t)x215 + x178); - fiat_p47441_mulx_u64(&x217, &x218, x3, (arg2[5])); - fiat_p47441_mulx_u64(&x219, &x220, x3, (arg2[4])); - fiat_p47441_mulx_u64(&x221, &x222, x3, (arg2[3])); - fiat_p47441_mulx_u64(&x223, &x224, x3, (arg2[2])); - fiat_p47441_mulx_u64(&x225, &x226, x3, (arg2[1])); - fiat_p47441_mulx_u64(&x227, &x228, x3, (arg2[0])); - fiat_p47441_addcarryx_u64(&x229, &x230, 0x0, x228, x225); - fiat_p47441_addcarryx_u64(&x231, &x232, x230, x226, x223); - fiat_p47441_addcarryx_u64(&x233, &x234, x232, x224, x221); - fiat_p47441_addcarryx_u64(&x235, &x236, x234, x222, x219); - fiat_p47441_addcarryx_u64(&x237, &x238, x236, x220, x217); - x239 = (x238 + x218); - fiat_p47441_addcarryx_u64(&x240, &x241, 0x0, x204, x227); - fiat_p47441_addcarryx_u64(&x242, &x243, x241, x206, x229); - fiat_p47441_addcarryx_u64(&x244, &x245, x243, x208, x231); - fiat_p47441_addcarryx_u64(&x246, &x247, x245, x210, x233); - fiat_p47441_addcarryx_u64(&x248, &x249, x247, x212, x235); - fiat_p47441_addcarryx_u64(&x250, &x251, x249, x214, x237); - fiat_p47441_addcarryx_u64(&x252, &x253, x251, x216, x239); - fiat_p47441_mulx_u64(&x254, &x255, x240, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x256, &x257, x240, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x258, &x259, x240, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x260, &x261, x240, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x262, &x263, x240, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x264, &x265, x240, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x266, &x267, 0x0, x265, x262); - fiat_p47441_addcarryx_u64(&x268, &x269, x267, x263, x260); - fiat_p47441_addcarryx_u64(&x270, &x271, x269, x261, x258); - fiat_p47441_addcarryx_u64(&x272, &x273, x271, x259, x256); - fiat_p47441_addcarryx_u64(&x274, &x275, x273, x257, x254); - x276 = (x275 + x255); - fiat_p47441_addcarryx_u64(&x277, &x278, 0x0, x240, x264); - fiat_p47441_addcarryx_u64(&x279, &x280, x278, x242, x266); - fiat_p47441_addcarryx_u64(&x281, &x282, x280, x244, x268); - fiat_p47441_addcarryx_u64(&x283, &x284, x282, x246, x270); - fiat_p47441_addcarryx_u64(&x285, &x286, x284, x248, x272); - fiat_p47441_addcarryx_u64(&x287, &x288, x286, x250, x274); - fiat_p47441_addcarryx_u64(&x289, &x290, x288, x252, x276); - x291 = ((uint64_t)x290 + x253); - fiat_p47441_mulx_u64(&x292, &x293, x4, (arg2[5])); - fiat_p47441_mulx_u64(&x294, &x295, x4, (arg2[4])); - fiat_p47441_mulx_u64(&x296, &x297, x4, (arg2[3])); - fiat_p47441_mulx_u64(&x298, &x299, x4, (arg2[2])); - fiat_p47441_mulx_u64(&x300, &x301, x4, (arg2[1])); - fiat_p47441_mulx_u64(&x302, &x303, x4, (arg2[0])); - fiat_p47441_addcarryx_u64(&x304, &x305, 0x0, x303, x300); - fiat_p47441_addcarryx_u64(&x306, &x307, x305, x301, x298); - fiat_p47441_addcarryx_u64(&x308, &x309, x307, x299, x296); - fiat_p47441_addcarryx_u64(&x310, &x311, x309, x297, x294); - fiat_p47441_addcarryx_u64(&x312, &x313, x311, x295, x292); - x314 = (x313 + x293); - fiat_p47441_addcarryx_u64(&x315, &x316, 0x0, x279, x302); - fiat_p47441_addcarryx_u64(&x317, &x318, x316, x281, x304); - fiat_p47441_addcarryx_u64(&x319, &x320, x318, x283, x306); - fiat_p47441_addcarryx_u64(&x321, &x322, x320, x285, x308); - fiat_p47441_addcarryx_u64(&x323, &x324, x322, x287, x310); - fiat_p47441_addcarryx_u64(&x325, &x326, x324, x289, x312); - fiat_p47441_addcarryx_u64(&x327, &x328, x326, x291, x314); - fiat_p47441_mulx_u64(&x329, &x330, x315, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x331, &x332, x315, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x333, &x334, x315, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x335, &x336, x315, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x337, &x338, x315, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x339, &x340, x315, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x341, &x342, 0x0, x340, x337); - fiat_p47441_addcarryx_u64(&x343, &x344, x342, x338, x335); - fiat_p47441_addcarryx_u64(&x345, &x346, x344, x336, x333); - fiat_p47441_addcarryx_u64(&x347, &x348, x346, x334, x331); - fiat_p47441_addcarryx_u64(&x349, &x350, x348, x332, x329); - x351 = (x350 + x330); - fiat_p47441_addcarryx_u64(&x352, &x353, 0x0, x315, x339); - fiat_p47441_addcarryx_u64(&x354, &x355, x353, x317, x341); - fiat_p47441_addcarryx_u64(&x356, &x357, x355, x319, x343); - fiat_p47441_addcarryx_u64(&x358, &x359, x357, x321, x345); - fiat_p47441_addcarryx_u64(&x360, &x361, x359, x323, x347); - fiat_p47441_addcarryx_u64(&x362, &x363, x361, x325, x349); - fiat_p47441_addcarryx_u64(&x364, &x365, x363, x327, x351); - x366 = ((uint64_t)x365 + x328); - fiat_p47441_mulx_u64(&x367, &x368, x5, (arg2[5])); - fiat_p47441_mulx_u64(&x369, &x370, x5, (arg2[4])); - fiat_p47441_mulx_u64(&x371, &x372, x5, (arg2[3])); - fiat_p47441_mulx_u64(&x373, &x374, x5, (arg2[2])); - fiat_p47441_mulx_u64(&x375, &x376, x5, (arg2[1])); - fiat_p47441_mulx_u64(&x377, &x378, x5, (arg2[0])); - fiat_p47441_addcarryx_u64(&x379, &x380, 0x0, x378, x375); - fiat_p47441_addcarryx_u64(&x381, &x382, x380, x376, x373); - fiat_p47441_addcarryx_u64(&x383, &x384, x382, x374, x371); - fiat_p47441_addcarryx_u64(&x385, &x386, x384, x372, x369); - fiat_p47441_addcarryx_u64(&x387, &x388, x386, x370, x367); - x389 = (x388 + x368); - fiat_p47441_addcarryx_u64(&x390, &x391, 0x0, x354, x377); - fiat_p47441_addcarryx_u64(&x392, &x393, x391, x356, x379); - fiat_p47441_addcarryx_u64(&x394, &x395, x393, x358, x381); - fiat_p47441_addcarryx_u64(&x396, &x397, x395, x360, x383); - fiat_p47441_addcarryx_u64(&x398, &x399, x397, x362, x385); - fiat_p47441_addcarryx_u64(&x400, &x401, x399, x364, x387); - fiat_p47441_addcarryx_u64(&x402, &x403, x401, x366, x389); - fiat_p47441_mulx_u64(&x404, &x405, x390, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x406, &x407, x390, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x408, &x409, x390, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x410, &x411, x390, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x412, &x413, x390, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x414, &x415, x390, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x416, &x417, 0x0, x415, x412); - fiat_p47441_addcarryx_u64(&x418, &x419, x417, x413, x410); - fiat_p47441_addcarryx_u64(&x420, &x421, x419, x411, x408); - fiat_p47441_addcarryx_u64(&x422, &x423, x421, x409, x406); - fiat_p47441_addcarryx_u64(&x424, &x425, x423, x407, x404); - x426 = (x425 + x405); - fiat_p47441_addcarryx_u64(&x427, &x428, 0x0, x390, x414); - fiat_p47441_addcarryx_u64(&x429, &x430, x428, x392, x416); - fiat_p47441_addcarryx_u64(&x431, &x432, x430, x394, x418); - fiat_p47441_addcarryx_u64(&x433, &x434, x432, x396, x420); - fiat_p47441_addcarryx_u64(&x435, &x436, x434, x398, x422); - fiat_p47441_addcarryx_u64(&x437, &x438, x436, x400, x424); - fiat_p47441_addcarryx_u64(&x439, &x440, x438, x402, x426); - x441 = ((uint64_t)x440 + x403); - fiat_p47441_subborrowx_u64(&x442, &x443, 0x0, x429, UINT64_C(0xffffffffffffffff)); - fiat_p47441_subborrowx_u64(&x444, &x445, x443, x431, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_subborrowx_u64(&x446, &x447, x445, x433, UINT64_C(0xc722f669356ea468)); - fiat_p47441_subborrowx_u64(&x448, &x449, x447, x435, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_subborrowx_u64(&x450, &x451, x449, x437, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_subborrowx_u64(&x452, &x453, x451, x439, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_subborrowx_u64(&x454, &x455, x453, x441, 0x0); - fiat_p47441_cmovznz_u64(&x456, x455, x442, x429); - fiat_p47441_cmovznz_u64(&x457, x455, x444, x431); - fiat_p47441_cmovznz_u64(&x458, x455, x446, x433); - fiat_p47441_cmovznz_u64(&x459, x455, x448, x435); - fiat_p47441_cmovznz_u64(&x460, x455, x450, x437); - fiat_p47441_cmovznz_u64(&x461, x455, x452, x439); - out1[0] = x456; - out1[1] = x457; - out1[2] = x458; - out1[3] = x459; - out1[4] = x460; - out1[5] = x461; -} - -/* - * The function fiat_p47441_square squares a field element in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg1)) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p47441_square(fiat_p47441_montgomery_domain_field_element out1, const fiat_p47441_montgomery_domain_field_element arg1) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - uint64_t x14; - uint64_t x15; - uint64_t x16; - uint64_t x17; - uint64_t x18; - uint64_t x19; - fiat_p47441_uint1 x20; - uint64_t x21; - fiat_p47441_uint1 x22; - uint64_t x23; - fiat_p47441_uint1 x24; - uint64_t x25; - fiat_p47441_uint1 x26; - uint64_t x27; - fiat_p47441_uint1 x28; - uint64_t x29; - uint64_t x30; - uint64_t x31; - uint64_t x32; - uint64_t x33; - uint64_t x34; - uint64_t x35; - uint64_t x36; - uint64_t x37; - uint64_t x38; - uint64_t x39; - uint64_t x40; - uint64_t x41; - uint64_t x42; - fiat_p47441_uint1 x43; - uint64_t x44; - fiat_p47441_uint1 x45; - uint64_t x46; - fiat_p47441_uint1 x47; - uint64_t x48; - fiat_p47441_uint1 x49; - uint64_t x50; - fiat_p47441_uint1 x51; - uint64_t x52; - uint64_t x53; - fiat_p47441_uint1 x54; - uint64_t x55; - fiat_p47441_uint1 x56; - uint64_t x57; - fiat_p47441_uint1 x58; - uint64_t x59; - fiat_p47441_uint1 x60; - uint64_t x61; - fiat_p47441_uint1 x62; - uint64_t x63; - fiat_p47441_uint1 x64; - uint64_t x65; - fiat_p47441_uint1 x66; - uint64_t x67; - uint64_t x68; - uint64_t x69; - uint64_t x70; - uint64_t x71; - uint64_t x72; - uint64_t x73; - uint64_t x74; - uint64_t x75; - uint64_t x76; - uint64_t x77; - uint64_t x78; - uint64_t x79; - fiat_p47441_uint1 x80; - uint64_t x81; - fiat_p47441_uint1 x82; - uint64_t x83; - fiat_p47441_uint1 x84; - uint64_t x85; - fiat_p47441_uint1 x86; - uint64_t x87; - fiat_p47441_uint1 x88; - uint64_t x89; - uint64_t x90; - fiat_p47441_uint1 x91; - uint64_t x92; - fiat_p47441_uint1 x93; - uint64_t x94; - fiat_p47441_uint1 x95; - uint64_t x96; - fiat_p47441_uint1 x97; - uint64_t x98; - fiat_p47441_uint1 x99; - uint64_t x100; - fiat_p47441_uint1 x101; - uint64_t x102; - fiat_p47441_uint1 x103; - uint64_t x104; - uint64_t x105; - uint64_t x106; - uint64_t x107; - uint64_t x108; - uint64_t x109; - uint64_t x110; - uint64_t x111; - uint64_t x112; - uint64_t x113; - uint64_t x114; - uint64_t x115; - uint64_t x116; - fiat_p47441_uint1 x117; - uint64_t x118; - fiat_p47441_uint1 x119; - uint64_t x120; - fiat_p47441_uint1 x121; - uint64_t x122; - fiat_p47441_uint1 x123; - uint64_t x124; - fiat_p47441_uint1 x125; - uint64_t x126; - uint64_t x127; - fiat_p47441_uint1 x128; - uint64_t x129; - fiat_p47441_uint1 x130; - uint64_t x131; - fiat_p47441_uint1 x132; - uint64_t x133; - fiat_p47441_uint1 x134; - uint64_t x135; - fiat_p47441_uint1 x136; - uint64_t x137; - fiat_p47441_uint1 x138; - uint64_t x139; - fiat_p47441_uint1 x140; - uint64_t x141; - uint64_t x142; - uint64_t x143; - uint64_t x144; - uint64_t x145; - uint64_t x146; - uint64_t x147; - uint64_t x148; - uint64_t x149; - uint64_t x150; - uint64_t x151; - uint64_t x152; - uint64_t x153; - uint64_t x154; - fiat_p47441_uint1 x155; - uint64_t x156; - fiat_p47441_uint1 x157; - uint64_t x158; - fiat_p47441_uint1 x159; - uint64_t x160; - fiat_p47441_uint1 x161; - uint64_t x162; - fiat_p47441_uint1 x163; - uint64_t x164; - uint64_t x165; - fiat_p47441_uint1 x166; - uint64_t x167; - fiat_p47441_uint1 x168; - uint64_t x169; - fiat_p47441_uint1 x170; - uint64_t x171; - fiat_p47441_uint1 x172; - uint64_t x173; - fiat_p47441_uint1 x174; - uint64_t x175; - fiat_p47441_uint1 x176; - uint64_t x177; - fiat_p47441_uint1 x178; - uint64_t x179; - uint64_t x180; - uint64_t x181; - uint64_t x182; - uint64_t x183; - uint64_t x184; - uint64_t x185; - uint64_t x186; - uint64_t x187; - uint64_t x188; - uint64_t x189; - uint64_t x190; - uint64_t x191; - fiat_p47441_uint1 x192; - uint64_t x193; - fiat_p47441_uint1 x194; - uint64_t x195; - fiat_p47441_uint1 x196; - uint64_t x197; - fiat_p47441_uint1 x198; - uint64_t x199; - fiat_p47441_uint1 x200; - uint64_t x201; - uint64_t x202; - fiat_p47441_uint1 x203; - uint64_t x204; - fiat_p47441_uint1 x205; - uint64_t x206; - fiat_p47441_uint1 x207; - uint64_t x208; - fiat_p47441_uint1 x209; - uint64_t x210; - fiat_p47441_uint1 x211; - uint64_t x212; - fiat_p47441_uint1 x213; - uint64_t x214; - fiat_p47441_uint1 x215; - uint64_t x216; - uint64_t x217; - uint64_t x218; - uint64_t x219; - uint64_t x220; - uint64_t x221; - uint64_t x222; - uint64_t x223; - uint64_t x224; - uint64_t x225; - uint64_t x226; - uint64_t x227; - uint64_t x228; - uint64_t x229; - fiat_p47441_uint1 x230; - uint64_t x231; - fiat_p47441_uint1 x232; - uint64_t x233; - fiat_p47441_uint1 x234; - uint64_t x235; - fiat_p47441_uint1 x236; - uint64_t x237; - fiat_p47441_uint1 x238; - uint64_t x239; - uint64_t x240; - fiat_p47441_uint1 x241; - uint64_t x242; - fiat_p47441_uint1 x243; - uint64_t x244; - fiat_p47441_uint1 x245; - uint64_t x246; - fiat_p47441_uint1 x247; - uint64_t x248; - fiat_p47441_uint1 x249; - uint64_t x250; - fiat_p47441_uint1 x251; - uint64_t x252; - fiat_p47441_uint1 x253; - uint64_t x254; - uint64_t x255; - uint64_t x256; - uint64_t x257; - uint64_t x258; - uint64_t x259; - uint64_t x260; - uint64_t x261; - uint64_t x262; - uint64_t x263; - uint64_t x264; - uint64_t x265; - uint64_t x266; - fiat_p47441_uint1 x267; - uint64_t x268; - fiat_p47441_uint1 x269; - uint64_t x270; - fiat_p47441_uint1 x271; - uint64_t x272; - fiat_p47441_uint1 x273; - uint64_t x274; - fiat_p47441_uint1 x275; - uint64_t x276; - uint64_t x277; - fiat_p47441_uint1 x278; - uint64_t x279; - fiat_p47441_uint1 x280; - uint64_t x281; - fiat_p47441_uint1 x282; - uint64_t x283; - fiat_p47441_uint1 x284; - uint64_t x285; - fiat_p47441_uint1 x286; - uint64_t x287; - fiat_p47441_uint1 x288; - uint64_t x289; - fiat_p47441_uint1 x290; - uint64_t x291; - uint64_t x292; - uint64_t x293; - uint64_t x294; - uint64_t x295; - uint64_t x296; - uint64_t x297; - uint64_t x298; - uint64_t x299; - uint64_t x300; - uint64_t x301; - uint64_t x302; - uint64_t x303; - uint64_t x304; - fiat_p47441_uint1 x305; - uint64_t x306; - fiat_p47441_uint1 x307; - uint64_t x308; - fiat_p47441_uint1 x309; - uint64_t x310; - fiat_p47441_uint1 x311; - uint64_t x312; - fiat_p47441_uint1 x313; - uint64_t x314; - uint64_t x315; - fiat_p47441_uint1 x316; - uint64_t x317; - fiat_p47441_uint1 x318; - uint64_t x319; - fiat_p47441_uint1 x320; - uint64_t x321; - fiat_p47441_uint1 x322; - uint64_t x323; - fiat_p47441_uint1 x324; - uint64_t x325; - fiat_p47441_uint1 x326; - uint64_t x327; - fiat_p47441_uint1 x328; - uint64_t x329; - uint64_t x330; - uint64_t x331; - uint64_t x332; - uint64_t x333; - uint64_t x334; - uint64_t x335; - uint64_t x336; - uint64_t x337; - uint64_t x338; - uint64_t x339; - uint64_t x340; - uint64_t x341; - fiat_p47441_uint1 x342; - uint64_t x343; - fiat_p47441_uint1 x344; - uint64_t x345; - fiat_p47441_uint1 x346; - uint64_t x347; - fiat_p47441_uint1 x348; - uint64_t x349; - fiat_p47441_uint1 x350; - uint64_t x351; - uint64_t x352; - fiat_p47441_uint1 x353; - uint64_t x354; - fiat_p47441_uint1 x355; - uint64_t x356; - fiat_p47441_uint1 x357; - uint64_t x358; - fiat_p47441_uint1 x359; - uint64_t x360; - fiat_p47441_uint1 x361; - uint64_t x362; - fiat_p47441_uint1 x363; - uint64_t x364; - fiat_p47441_uint1 x365; - uint64_t x366; - uint64_t x367; - uint64_t x368; - uint64_t x369; - uint64_t x370; - uint64_t x371; - uint64_t x372; - uint64_t x373; - uint64_t x374; - uint64_t x375; - uint64_t x376; - uint64_t x377; - uint64_t x378; - uint64_t x379; - fiat_p47441_uint1 x380; - uint64_t x381; - fiat_p47441_uint1 x382; - uint64_t x383; - fiat_p47441_uint1 x384; - uint64_t x385; - fiat_p47441_uint1 x386; - uint64_t x387; - fiat_p47441_uint1 x388; - uint64_t x389; - uint64_t x390; - fiat_p47441_uint1 x391; - uint64_t x392; - fiat_p47441_uint1 x393; - uint64_t x394; - fiat_p47441_uint1 x395; - uint64_t x396; - fiat_p47441_uint1 x397; - uint64_t x398; - fiat_p47441_uint1 x399; - uint64_t x400; - fiat_p47441_uint1 x401; - uint64_t x402; - fiat_p47441_uint1 x403; - uint64_t x404; - uint64_t x405; - uint64_t x406; - uint64_t x407; - uint64_t x408; - uint64_t x409; - uint64_t x410; - uint64_t x411; - uint64_t x412; - uint64_t x413; - uint64_t x414; - uint64_t x415; - uint64_t x416; - fiat_p47441_uint1 x417; - uint64_t x418; - fiat_p47441_uint1 x419; - uint64_t x420; - fiat_p47441_uint1 x421; - uint64_t x422; - fiat_p47441_uint1 x423; - uint64_t x424; - fiat_p47441_uint1 x425; - uint64_t x426; - uint64_t x427; - fiat_p47441_uint1 x428; - uint64_t x429; - fiat_p47441_uint1 x430; - uint64_t x431; - fiat_p47441_uint1 x432; - uint64_t x433; - fiat_p47441_uint1 x434; - uint64_t x435; - fiat_p47441_uint1 x436; - uint64_t x437; - fiat_p47441_uint1 x438; - uint64_t x439; - fiat_p47441_uint1 x440; - uint64_t x441; - uint64_t x442; - fiat_p47441_uint1 x443; - uint64_t x444; - fiat_p47441_uint1 x445; - uint64_t x446; - fiat_p47441_uint1 x447; - uint64_t x448; - fiat_p47441_uint1 x449; - uint64_t x450; - fiat_p47441_uint1 x451; - uint64_t x452; - fiat_p47441_uint1 x453; - uint64_t x454; - fiat_p47441_uint1 x455; - uint64_t x456; - uint64_t x457; - uint64_t x458; - uint64_t x459; - uint64_t x460; - uint64_t x461; - x1 = (arg1[1]); - x2 = (arg1[2]); - x3 = (arg1[3]); - x4 = (arg1[4]); - x5 = (arg1[5]); - x6 = (arg1[0]); - fiat_p47441_mulx_u64(&x7, &x8, x6, (arg1[5])); - fiat_p47441_mulx_u64(&x9, &x10, x6, (arg1[4])); - fiat_p47441_mulx_u64(&x11, &x12, x6, (arg1[3])); - fiat_p47441_mulx_u64(&x13, &x14, x6, (arg1[2])); - fiat_p47441_mulx_u64(&x15, &x16, x6, (arg1[1])); - fiat_p47441_mulx_u64(&x17, &x18, x6, (arg1[0])); - fiat_p47441_addcarryx_u64(&x19, &x20, 0x0, x18, x15); - fiat_p47441_addcarryx_u64(&x21, &x22, x20, x16, x13); - fiat_p47441_addcarryx_u64(&x23, &x24, x22, x14, x11); - fiat_p47441_addcarryx_u64(&x25, &x26, x24, x12, x9); - fiat_p47441_addcarryx_u64(&x27, &x28, x26, x10, x7); - x29 = (x28 + x8); - fiat_p47441_mulx_u64(&x30, &x31, x17, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x32, &x33, x17, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x34, &x35, x17, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x36, &x37, x17, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x38, &x39, x17, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x40, &x41, x17, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x42, &x43, 0x0, x41, x38); - fiat_p47441_addcarryx_u64(&x44, &x45, x43, x39, x36); - fiat_p47441_addcarryx_u64(&x46, &x47, x45, x37, x34); - fiat_p47441_addcarryx_u64(&x48, &x49, x47, x35, x32); - fiat_p47441_addcarryx_u64(&x50, &x51, x49, x33, x30); - x52 = (x51 + x31); - fiat_p47441_addcarryx_u64(&x53, &x54, 0x0, x17, x40); - fiat_p47441_addcarryx_u64(&x55, &x56, x54, x19, x42); - fiat_p47441_addcarryx_u64(&x57, &x58, x56, x21, x44); - fiat_p47441_addcarryx_u64(&x59, &x60, x58, x23, x46); - fiat_p47441_addcarryx_u64(&x61, &x62, x60, x25, x48); - fiat_p47441_addcarryx_u64(&x63, &x64, x62, x27, x50); - fiat_p47441_addcarryx_u64(&x65, &x66, x64, x29, x52); - fiat_p47441_mulx_u64(&x67, &x68, x1, (arg1[5])); - fiat_p47441_mulx_u64(&x69, &x70, x1, (arg1[4])); - fiat_p47441_mulx_u64(&x71, &x72, x1, (arg1[3])); - fiat_p47441_mulx_u64(&x73, &x74, x1, (arg1[2])); - fiat_p47441_mulx_u64(&x75, &x76, x1, (arg1[1])); - fiat_p47441_mulx_u64(&x77, &x78, x1, (arg1[0])); - fiat_p47441_addcarryx_u64(&x79, &x80, 0x0, x78, x75); - fiat_p47441_addcarryx_u64(&x81, &x82, x80, x76, x73); - fiat_p47441_addcarryx_u64(&x83, &x84, x82, x74, x71); - fiat_p47441_addcarryx_u64(&x85, &x86, x84, x72, x69); - fiat_p47441_addcarryx_u64(&x87, &x88, x86, x70, x67); - x89 = (x88 + x68); - fiat_p47441_addcarryx_u64(&x90, &x91, 0x0, x55, x77); - fiat_p47441_addcarryx_u64(&x92, &x93, x91, x57, x79); - fiat_p47441_addcarryx_u64(&x94, &x95, x93, x59, x81); - fiat_p47441_addcarryx_u64(&x96, &x97, x95, x61, x83); - fiat_p47441_addcarryx_u64(&x98, &x99, x97, x63, x85); - fiat_p47441_addcarryx_u64(&x100, &x101, x99, x65, x87); - fiat_p47441_addcarryx_u64(&x102, &x103, x101, x66, x89); - fiat_p47441_mulx_u64(&x104, &x105, x90, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x106, &x107, x90, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x108, &x109, x90, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x110, &x111, x90, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x112, &x113, x90, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x114, &x115, x90, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x116, &x117, 0x0, x115, x112); - fiat_p47441_addcarryx_u64(&x118, &x119, x117, x113, x110); - fiat_p47441_addcarryx_u64(&x120, &x121, x119, x111, x108); - fiat_p47441_addcarryx_u64(&x122, &x123, x121, x109, x106); - fiat_p47441_addcarryx_u64(&x124, &x125, x123, x107, x104); - x126 = (x125 + x105); - fiat_p47441_addcarryx_u64(&x127, &x128, 0x0, x90, x114); - fiat_p47441_addcarryx_u64(&x129, &x130, x128, x92, x116); - fiat_p47441_addcarryx_u64(&x131, &x132, x130, x94, x118); - fiat_p47441_addcarryx_u64(&x133, &x134, x132, x96, x120); - fiat_p47441_addcarryx_u64(&x135, &x136, x134, x98, x122); - fiat_p47441_addcarryx_u64(&x137, &x138, x136, x100, x124); - fiat_p47441_addcarryx_u64(&x139, &x140, x138, x102, x126); - x141 = ((uint64_t)x140 + x103); - fiat_p47441_mulx_u64(&x142, &x143, x2, (arg1[5])); - fiat_p47441_mulx_u64(&x144, &x145, x2, (arg1[4])); - fiat_p47441_mulx_u64(&x146, &x147, x2, (arg1[3])); - fiat_p47441_mulx_u64(&x148, &x149, x2, (arg1[2])); - fiat_p47441_mulx_u64(&x150, &x151, x2, (arg1[1])); - fiat_p47441_mulx_u64(&x152, &x153, x2, (arg1[0])); - fiat_p47441_addcarryx_u64(&x154, &x155, 0x0, x153, x150); - fiat_p47441_addcarryx_u64(&x156, &x157, x155, x151, x148); - fiat_p47441_addcarryx_u64(&x158, &x159, x157, x149, x146); - fiat_p47441_addcarryx_u64(&x160, &x161, x159, x147, x144); - fiat_p47441_addcarryx_u64(&x162, &x163, x161, x145, x142); - x164 = (x163 + x143); - fiat_p47441_addcarryx_u64(&x165, &x166, 0x0, x129, x152); - fiat_p47441_addcarryx_u64(&x167, &x168, x166, x131, x154); - fiat_p47441_addcarryx_u64(&x169, &x170, x168, x133, x156); - fiat_p47441_addcarryx_u64(&x171, &x172, x170, x135, x158); - fiat_p47441_addcarryx_u64(&x173, &x174, x172, x137, x160); - fiat_p47441_addcarryx_u64(&x175, &x176, x174, x139, x162); - fiat_p47441_addcarryx_u64(&x177, &x178, x176, x141, x164); - fiat_p47441_mulx_u64(&x179, &x180, x165, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x181, &x182, x165, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x183, &x184, x165, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x185, &x186, x165, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x187, &x188, x165, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x189, &x190, x165, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x191, &x192, 0x0, x190, x187); - fiat_p47441_addcarryx_u64(&x193, &x194, x192, x188, x185); - fiat_p47441_addcarryx_u64(&x195, &x196, x194, x186, x183); - fiat_p47441_addcarryx_u64(&x197, &x198, x196, x184, x181); - fiat_p47441_addcarryx_u64(&x199, &x200, x198, x182, x179); - x201 = (x200 + x180); - fiat_p47441_addcarryx_u64(&x202, &x203, 0x0, x165, x189); - fiat_p47441_addcarryx_u64(&x204, &x205, x203, x167, x191); - fiat_p47441_addcarryx_u64(&x206, &x207, x205, x169, x193); - fiat_p47441_addcarryx_u64(&x208, &x209, x207, x171, x195); - fiat_p47441_addcarryx_u64(&x210, &x211, x209, x173, x197); - fiat_p47441_addcarryx_u64(&x212, &x213, x211, x175, x199); - fiat_p47441_addcarryx_u64(&x214, &x215, x213, x177, x201); - x216 = ((uint64_t)x215 + x178); - fiat_p47441_mulx_u64(&x217, &x218, x3, (arg1[5])); - fiat_p47441_mulx_u64(&x219, &x220, x3, (arg1[4])); - fiat_p47441_mulx_u64(&x221, &x222, x3, (arg1[3])); - fiat_p47441_mulx_u64(&x223, &x224, x3, (arg1[2])); - fiat_p47441_mulx_u64(&x225, &x226, x3, (arg1[1])); - fiat_p47441_mulx_u64(&x227, &x228, x3, (arg1[0])); - fiat_p47441_addcarryx_u64(&x229, &x230, 0x0, x228, x225); - fiat_p47441_addcarryx_u64(&x231, &x232, x230, x226, x223); - fiat_p47441_addcarryx_u64(&x233, &x234, x232, x224, x221); - fiat_p47441_addcarryx_u64(&x235, &x236, x234, x222, x219); - fiat_p47441_addcarryx_u64(&x237, &x238, x236, x220, x217); - x239 = (x238 + x218); - fiat_p47441_addcarryx_u64(&x240, &x241, 0x0, x204, x227); - fiat_p47441_addcarryx_u64(&x242, &x243, x241, x206, x229); - fiat_p47441_addcarryx_u64(&x244, &x245, x243, x208, x231); - fiat_p47441_addcarryx_u64(&x246, &x247, x245, x210, x233); - fiat_p47441_addcarryx_u64(&x248, &x249, x247, x212, x235); - fiat_p47441_addcarryx_u64(&x250, &x251, x249, x214, x237); - fiat_p47441_addcarryx_u64(&x252, &x253, x251, x216, x239); - fiat_p47441_mulx_u64(&x254, &x255, x240, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x256, &x257, x240, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x258, &x259, x240, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x260, &x261, x240, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x262, &x263, x240, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x264, &x265, x240, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x266, &x267, 0x0, x265, x262); - fiat_p47441_addcarryx_u64(&x268, &x269, x267, x263, x260); - fiat_p47441_addcarryx_u64(&x270, &x271, x269, x261, x258); - fiat_p47441_addcarryx_u64(&x272, &x273, x271, x259, x256); - fiat_p47441_addcarryx_u64(&x274, &x275, x273, x257, x254); - x276 = (x275 + x255); - fiat_p47441_addcarryx_u64(&x277, &x278, 0x0, x240, x264); - fiat_p47441_addcarryx_u64(&x279, &x280, x278, x242, x266); - fiat_p47441_addcarryx_u64(&x281, &x282, x280, x244, x268); - fiat_p47441_addcarryx_u64(&x283, &x284, x282, x246, x270); - fiat_p47441_addcarryx_u64(&x285, &x286, x284, x248, x272); - fiat_p47441_addcarryx_u64(&x287, &x288, x286, x250, x274); - fiat_p47441_addcarryx_u64(&x289, &x290, x288, x252, x276); - x291 = ((uint64_t)x290 + x253); - fiat_p47441_mulx_u64(&x292, &x293, x4, (arg1[5])); - fiat_p47441_mulx_u64(&x294, &x295, x4, (arg1[4])); - fiat_p47441_mulx_u64(&x296, &x297, x4, (arg1[3])); - fiat_p47441_mulx_u64(&x298, &x299, x4, (arg1[2])); - fiat_p47441_mulx_u64(&x300, &x301, x4, (arg1[1])); - fiat_p47441_mulx_u64(&x302, &x303, x4, (arg1[0])); - fiat_p47441_addcarryx_u64(&x304, &x305, 0x0, x303, x300); - fiat_p47441_addcarryx_u64(&x306, &x307, x305, x301, x298); - fiat_p47441_addcarryx_u64(&x308, &x309, x307, x299, x296); - fiat_p47441_addcarryx_u64(&x310, &x311, x309, x297, x294); - fiat_p47441_addcarryx_u64(&x312, &x313, x311, x295, x292); - x314 = (x313 + x293); - fiat_p47441_addcarryx_u64(&x315, &x316, 0x0, x279, x302); - fiat_p47441_addcarryx_u64(&x317, &x318, x316, x281, x304); - fiat_p47441_addcarryx_u64(&x319, &x320, x318, x283, x306); - fiat_p47441_addcarryx_u64(&x321, &x322, x320, x285, x308); - fiat_p47441_addcarryx_u64(&x323, &x324, x322, x287, x310); - fiat_p47441_addcarryx_u64(&x325, &x326, x324, x289, x312); - fiat_p47441_addcarryx_u64(&x327, &x328, x326, x291, x314); - fiat_p47441_mulx_u64(&x329, &x330, x315, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x331, &x332, x315, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x333, &x334, x315, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x335, &x336, x315, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x337, &x338, x315, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x339, &x340, x315, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x341, &x342, 0x0, x340, x337); - fiat_p47441_addcarryx_u64(&x343, &x344, x342, x338, x335); - fiat_p47441_addcarryx_u64(&x345, &x346, x344, x336, x333); - fiat_p47441_addcarryx_u64(&x347, &x348, x346, x334, x331); - fiat_p47441_addcarryx_u64(&x349, &x350, x348, x332, x329); - x351 = (x350 + x330); - fiat_p47441_addcarryx_u64(&x352, &x353, 0x0, x315, x339); - fiat_p47441_addcarryx_u64(&x354, &x355, x353, x317, x341); - fiat_p47441_addcarryx_u64(&x356, &x357, x355, x319, x343); - fiat_p47441_addcarryx_u64(&x358, &x359, x357, x321, x345); - fiat_p47441_addcarryx_u64(&x360, &x361, x359, x323, x347); - fiat_p47441_addcarryx_u64(&x362, &x363, x361, x325, x349); - fiat_p47441_addcarryx_u64(&x364, &x365, x363, x327, x351); - x366 = ((uint64_t)x365 + x328); - fiat_p47441_mulx_u64(&x367, &x368, x5, (arg1[5])); - fiat_p47441_mulx_u64(&x369, &x370, x5, (arg1[4])); - fiat_p47441_mulx_u64(&x371, &x372, x5, (arg1[3])); - fiat_p47441_mulx_u64(&x373, &x374, x5, (arg1[2])); - fiat_p47441_mulx_u64(&x375, &x376, x5, (arg1[1])); - fiat_p47441_mulx_u64(&x377, &x378, x5, (arg1[0])); - fiat_p47441_addcarryx_u64(&x379, &x380, 0x0, x378, x375); - fiat_p47441_addcarryx_u64(&x381, &x382, x380, x376, x373); - fiat_p47441_addcarryx_u64(&x383, &x384, x382, x374, x371); - fiat_p47441_addcarryx_u64(&x385, &x386, x384, x372, x369); - fiat_p47441_addcarryx_u64(&x387, &x388, x386, x370, x367); - x389 = (x388 + x368); - fiat_p47441_addcarryx_u64(&x390, &x391, 0x0, x354, x377); - fiat_p47441_addcarryx_u64(&x392, &x393, x391, x356, x379); - fiat_p47441_addcarryx_u64(&x394, &x395, x393, x358, x381); - fiat_p47441_addcarryx_u64(&x396, &x397, x395, x360, x383); - fiat_p47441_addcarryx_u64(&x398, &x399, x397, x362, x385); - fiat_p47441_addcarryx_u64(&x400, &x401, x399, x364, x387); - fiat_p47441_addcarryx_u64(&x402, &x403, x401, x366, x389); - fiat_p47441_mulx_u64(&x404, &x405, x390, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x406, &x407, x390, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x408, &x409, x390, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x410, &x411, x390, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x412, &x413, x390, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x414, &x415, x390, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x416, &x417, 0x0, x415, x412); - fiat_p47441_addcarryx_u64(&x418, &x419, x417, x413, x410); - fiat_p47441_addcarryx_u64(&x420, &x421, x419, x411, x408); - fiat_p47441_addcarryx_u64(&x422, &x423, x421, x409, x406); - fiat_p47441_addcarryx_u64(&x424, &x425, x423, x407, x404); - x426 = (x425 + x405); - fiat_p47441_addcarryx_u64(&x427, &x428, 0x0, x390, x414); - fiat_p47441_addcarryx_u64(&x429, &x430, x428, x392, x416); - fiat_p47441_addcarryx_u64(&x431, &x432, x430, x394, x418); - fiat_p47441_addcarryx_u64(&x433, &x434, x432, x396, x420); - fiat_p47441_addcarryx_u64(&x435, &x436, x434, x398, x422); - fiat_p47441_addcarryx_u64(&x437, &x438, x436, x400, x424); - fiat_p47441_addcarryx_u64(&x439, &x440, x438, x402, x426); - x441 = ((uint64_t)x440 + x403); - fiat_p47441_subborrowx_u64(&x442, &x443, 0x0, x429, UINT64_C(0xffffffffffffffff)); - fiat_p47441_subborrowx_u64(&x444, &x445, x443, x431, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_subborrowx_u64(&x446, &x447, x445, x433, UINT64_C(0xc722f669356ea468)); - fiat_p47441_subborrowx_u64(&x448, &x449, x447, x435, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_subborrowx_u64(&x450, &x451, x449, x437, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_subborrowx_u64(&x452, &x453, x451, x439, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_subborrowx_u64(&x454, &x455, x453, x441, 0x0); - fiat_p47441_cmovznz_u64(&x456, x455, x442, x429); - fiat_p47441_cmovznz_u64(&x457, x455, x444, x431); - fiat_p47441_cmovznz_u64(&x458, x455, x446, x433); - fiat_p47441_cmovznz_u64(&x459, x455, x448, x435); - fiat_p47441_cmovznz_u64(&x460, x455, x450, x437); - fiat_p47441_cmovznz_u64(&x461, x455, x452, x439); - out1[0] = x456; - out1[1] = x457; - out1[2] = x458; - out1[3] = x459; - out1[4] = x460; - out1[5] = x461; -} - -/* - * The function fiat_p47441_add adds two field elements in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * 0 ≤ eval arg2 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) + eval (from_montgomery arg2)) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p47441_add(fiat_p47441_montgomery_domain_field_element out1, const fiat_p47441_montgomery_domain_field_element arg1, const fiat_p47441_montgomery_domain_field_element arg2) { - uint64_t x1; - fiat_p47441_uint1 x2; - uint64_t x3; - fiat_p47441_uint1 x4; - uint64_t x5; - fiat_p47441_uint1 x6; - uint64_t x7; - fiat_p47441_uint1 x8; - uint64_t x9; - fiat_p47441_uint1 x10; - uint64_t x11; - fiat_p47441_uint1 x12; - uint64_t x13; - fiat_p47441_uint1 x14; - uint64_t x15; - fiat_p47441_uint1 x16; - uint64_t x17; - fiat_p47441_uint1 x18; - uint64_t x19; - fiat_p47441_uint1 x20; - uint64_t x21; - fiat_p47441_uint1 x22; - uint64_t x23; - fiat_p47441_uint1 x24; - uint64_t x25; - fiat_p47441_uint1 x26; - uint64_t x27; - uint64_t x28; - uint64_t x29; - uint64_t x30; - uint64_t x31; - uint64_t x32; - fiat_p47441_addcarryx_u64(&x1, &x2, 0x0, (arg1[0]), (arg2[0])); - fiat_p47441_addcarryx_u64(&x3, &x4, x2, (arg1[1]), (arg2[1])); - fiat_p47441_addcarryx_u64(&x5, &x6, x4, (arg1[2]), (arg2[2])); - fiat_p47441_addcarryx_u64(&x7, &x8, x6, (arg1[3]), (arg2[3])); - fiat_p47441_addcarryx_u64(&x9, &x10, x8, (arg1[4]), (arg2[4])); - fiat_p47441_addcarryx_u64(&x11, &x12, x10, (arg1[5]), (arg2[5])); - fiat_p47441_subborrowx_u64(&x13, &x14, 0x0, x1, UINT64_C(0xffffffffffffffff)); - fiat_p47441_subborrowx_u64(&x15, &x16, x14, x3, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_subborrowx_u64(&x17, &x18, x16, x5, UINT64_C(0xc722f669356ea468)); - fiat_p47441_subborrowx_u64(&x19, &x20, x18, x7, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_subborrowx_u64(&x21, &x22, x20, x9, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_subborrowx_u64(&x23, &x24, x22, x11, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_subborrowx_u64(&x25, &x26, x24, x12, 0x0); - fiat_p47441_cmovznz_u64(&x27, x26, x13, x1); - fiat_p47441_cmovznz_u64(&x28, x26, x15, x3); - fiat_p47441_cmovznz_u64(&x29, x26, x17, x5); - fiat_p47441_cmovznz_u64(&x30, x26, x19, x7); - fiat_p47441_cmovznz_u64(&x31, x26, x21, x9); - fiat_p47441_cmovznz_u64(&x32, x26, x23, x11); - out1[0] = x27; - out1[1] = x28; - out1[2] = x29; - out1[3] = x30; - out1[4] = x31; - out1[5] = x32; -} - -/* - * The function fiat_p47441_sub subtracts two field elements in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * 0 ≤ eval arg2 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) - eval (from_montgomery arg2)) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p47441_sub(fiat_p47441_montgomery_domain_field_element out1, const fiat_p47441_montgomery_domain_field_element arg1, const fiat_p47441_montgomery_domain_field_element arg2) { - uint64_t x1; - fiat_p47441_uint1 x2; - uint64_t x3; - fiat_p47441_uint1 x4; - uint64_t x5; - fiat_p47441_uint1 x6; - uint64_t x7; - fiat_p47441_uint1 x8; - uint64_t x9; - fiat_p47441_uint1 x10; - uint64_t x11; - fiat_p47441_uint1 x12; - uint64_t x13; - uint64_t x14; - fiat_p47441_uint1 x15; - uint64_t x16; - fiat_p47441_uint1 x17; - uint64_t x18; - fiat_p47441_uint1 x19; - uint64_t x20; - fiat_p47441_uint1 x21; - uint64_t x22; - fiat_p47441_uint1 x23; - uint64_t x24; - fiat_p47441_uint1 x25; - fiat_p47441_subborrowx_u64(&x1, &x2, 0x0, (arg1[0]), (arg2[0])); - fiat_p47441_subborrowx_u64(&x3, &x4, x2, (arg1[1]), (arg2[1])); - fiat_p47441_subborrowx_u64(&x5, &x6, x4, (arg1[2]), (arg2[2])); - fiat_p47441_subborrowx_u64(&x7, &x8, x6, (arg1[3]), (arg2[3])); - fiat_p47441_subborrowx_u64(&x9, &x10, x8, (arg1[4]), (arg2[4])); - fiat_p47441_subborrowx_u64(&x11, &x12, x10, (arg1[5]), (arg2[5])); - fiat_p47441_cmovznz_u64(&x13, x12, 0x0, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x14, &x15, 0x0, x1, x13); - fiat_p47441_addcarryx_u64(&x16, &x17, x15, x3, (x13 & UINT64_C(0x4c6174c1ffffffff))); - fiat_p47441_addcarryx_u64(&x18, &x19, x17, x5, (x13 & UINT64_C(0xc722f669356ea468))); - fiat_p47441_addcarryx_u64(&x20, &x21, x19, x7, (x13 & UINT64_C(0x65bc2e0a90aeb751))); - fiat_p47441_addcarryx_u64(&x22, &x23, x21, x9, (x13 & UINT64_C(0xc6ae604a45d10ad6))); - fiat_p47441_addcarryx_u64(&x24, &x25, x23, x11, (x13 & UINT64_C(0x3df6eeeab0871a2))); - out1[0] = x14; - out1[1] = x16; - out1[2] = x18; - out1[3] = x20; - out1[4] = x22; - out1[5] = x24; -} - -/* - * The function fiat_p47441_opp negates a field element in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval (from_montgomery out1) mod m = -eval (from_montgomery arg1) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p47441_opp(fiat_p47441_montgomery_domain_field_element out1, const fiat_p47441_montgomery_domain_field_element arg1) { - uint64_t x1; - fiat_p47441_uint1 x2; - uint64_t x3; - fiat_p47441_uint1 x4; - uint64_t x5; - fiat_p47441_uint1 x6; - uint64_t x7; - fiat_p47441_uint1 x8; - uint64_t x9; - fiat_p47441_uint1 x10; - uint64_t x11; - fiat_p47441_uint1 x12; - uint64_t x13; - uint64_t x14; - fiat_p47441_uint1 x15; - uint64_t x16; - fiat_p47441_uint1 x17; - uint64_t x18; - fiat_p47441_uint1 x19; - uint64_t x20; - fiat_p47441_uint1 x21; - uint64_t x22; - fiat_p47441_uint1 x23; - uint64_t x24; - fiat_p47441_uint1 x25; - fiat_p47441_subborrowx_u64(&x1, &x2, 0x0, 0x0, (arg1[0])); - fiat_p47441_subborrowx_u64(&x3, &x4, x2, 0x0, (arg1[1])); - fiat_p47441_subborrowx_u64(&x5, &x6, x4, 0x0, (arg1[2])); - fiat_p47441_subborrowx_u64(&x7, &x8, x6, 0x0, (arg1[3])); - fiat_p47441_subborrowx_u64(&x9, &x10, x8, 0x0, (arg1[4])); - fiat_p47441_subborrowx_u64(&x11, &x12, x10, 0x0, (arg1[5])); - fiat_p47441_cmovznz_u64(&x13, x12, 0x0, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x14, &x15, 0x0, x1, x13); - fiat_p47441_addcarryx_u64(&x16, &x17, x15, x3, (x13 & UINT64_C(0x4c6174c1ffffffff))); - fiat_p47441_addcarryx_u64(&x18, &x19, x17, x5, (x13 & UINT64_C(0xc722f669356ea468))); - fiat_p47441_addcarryx_u64(&x20, &x21, x19, x7, (x13 & UINT64_C(0x65bc2e0a90aeb751))); - fiat_p47441_addcarryx_u64(&x22, &x23, x21, x9, (x13 & UINT64_C(0xc6ae604a45d10ad6))); - fiat_p47441_addcarryx_u64(&x24, &x25, x23, x11, (x13 & UINT64_C(0x3df6eeeab0871a2))); - out1[0] = x14; - out1[1] = x16; - out1[2] = x18; - out1[3] = x20; - out1[4] = x22; - out1[5] = x24; -} - -/* - * The function fiat_p47441_from_montgomery translates a field element out of the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval out1 mod m = (eval arg1 * ((2^64)⁻¹ mod m)^6) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p47441_from_montgomery(fiat_p47441_non_montgomery_domain_field_element out1, const fiat_p47441_montgomery_domain_field_element arg1) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - uint64_t x14; - fiat_p47441_uint1 x15; - uint64_t x16; - fiat_p47441_uint1 x17; - uint64_t x18; - fiat_p47441_uint1 x19; - uint64_t x20; - fiat_p47441_uint1 x21; - uint64_t x22; - fiat_p47441_uint1 x23; - uint64_t x24; - fiat_p47441_uint1 x25; - uint64_t x26; - fiat_p47441_uint1 x27; - uint64_t x28; - fiat_p47441_uint1 x29; - uint64_t x30; - fiat_p47441_uint1 x31; - uint64_t x32; - fiat_p47441_uint1 x33; - uint64_t x34; - fiat_p47441_uint1 x35; - uint64_t x36; - fiat_p47441_uint1 x37; - uint64_t x38; - fiat_p47441_uint1 x39; - uint64_t x40; - fiat_p47441_uint1 x41; - uint64_t x42; - fiat_p47441_uint1 x43; - uint64_t x44; - fiat_p47441_uint1 x45; - uint64_t x46; - uint64_t x47; - uint64_t x48; - uint64_t x49; - uint64_t x50; - uint64_t x51; - uint64_t x52; - uint64_t x53; - uint64_t x54; - uint64_t x55; - uint64_t x56; - uint64_t x57; - uint64_t x58; - fiat_p47441_uint1 x59; - uint64_t x60; - fiat_p47441_uint1 x61; - uint64_t x62; - fiat_p47441_uint1 x63; - uint64_t x64; - fiat_p47441_uint1 x65; - uint64_t x66; - fiat_p47441_uint1 x67; - uint64_t x68; - fiat_p47441_uint1 x69; - uint64_t x70; - fiat_p47441_uint1 x71; - uint64_t x72; - fiat_p47441_uint1 x73; - uint64_t x74; - fiat_p47441_uint1 x75; - uint64_t x76; - fiat_p47441_uint1 x77; - uint64_t x78; - fiat_p47441_uint1 x79; - uint64_t x80; - fiat_p47441_uint1 x81; - uint64_t x82; - fiat_p47441_uint1 x83; - uint64_t x84; - fiat_p47441_uint1 x85; - uint64_t x86; - fiat_p47441_uint1 x87; - uint64_t x88; - fiat_p47441_uint1 x89; - uint64_t x90; - uint64_t x91; - uint64_t x92; - uint64_t x93; - uint64_t x94; - uint64_t x95; - uint64_t x96; - uint64_t x97; - uint64_t x98; - uint64_t x99; - uint64_t x100; - uint64_t x101; - uint64_t x102; - fiat_p47441_uint1 x103; - uint64_t x104; - fiat_p47441_uint1 x105; - uint64_t x106; - fiat_p47441_uint1 x107; - uint64_t x108; - fiat_p47441_uint1 x109; - uint64_t x110; - fiat_p47441_uint1 x111; - uint64_t x112; - fiat_p47441_uint1 x113; - uint64_t x114; - fiat_p47441_uint1 x115; - uint64_t x116; - fiat_p47441_uint1 x117; - uint64_t x118; - fiat_p47441_uint1 x119; - uint64_t x120; - fiat_p47441_uint1 x121; - uint64_t x122; - fiat_p47441_uint1 x123; - uint64_t x124; - fiat_p47441_uint1 x125; - uint64_t x126; - fiat_p47441_uint1 x127; - uint64_t x128; - fiat_p47441_uint1 x129; - uint64_t x130; - fiat_p47441_uint1 x131; - uint64_t x132; - fiat_p47441_uint1 x133; - uint64_t x134; - uint64_t x135; - uint64_t x136; - uint64_t x137; - uint64_t x138; - uint64_t x139; - uint64_t x140; - uint64_t x141; - uint64_t x142; - uint64_t x143; - uint64_t x144; - uint64_t x145; - uint64_t x146; - fiat_p47441_uint1 x147; - uint64_t x148; - fiat_p47441_uint1 x149; - uint64_t x150; - fiat_p47441_uint1 x151; - uint64_t x152; - fiat_p47441_uint1 x153; - uint64_t x154; - fiat_p47441_uint1 x155; - uint64_t x156; - fiat_p47441_uint1 x157; - uint64_t x158; - fiat_p47441_uint1 x159; - uint64_t x160; - fiat_p47441_uint1 x161; - uint64_t x162; - fiat_p47441_uint1 x163; - uint64_t x164; - fiat_p47441_uint1 x165; - uint64_t x166; - fiat_p47441_uint1 x167; - uint64_t x168; - fiat_p47441_uint1 x169; - uint64_t x170; - fiat_p47441_uint1 x171; - uint64_t x172; - fiat_p47441_uint1 x173; - uint64_t x174; - fiat_p47441_uint1 x175; - uint64_t x176; - fiat_p47441_uint1 x177; - uint64_t x178; - uint64_t x179; - uint64_t x180; - uint64_t x181; - uint64_t x182; - uint64_t x183; - uint64_t x184; - uint64_t x185; - uint64_t x186; - uint64_t x187; - uint64_t x188; - uint64_t x189; - uint64_t x190; - fiat_p47441_uint1 x191; - uint64_t x192; - fiat_p47441_uint1 x193; - uint64_t x194; - fiat_p47441_uint1 x195; - uint64_t x196; - fiat_p47441_uint1 x197; - uint64_t x198; - fiat_p47441_uint1 x199; - uint64_t x200; - fiat_p47441_uint1 x201; - uint64_t x202; - fiat_p47441_uint1 x203; - uint64_t x204; - fiat_p47441_uint1 x205; - uint64_t x206; - fiat_p47441_uint1 x207; - uint64_t x208; - fiat_p47441_uint1 x209; - uint64_t x210; - fiat_p47441_uint1 x211; - uint64_t x212; - fiat_p47441_uint1 x213; - uint64_t x214; - fiat_p47441_uint1 x215; - uint64_t x216; - fiat_p47441_uint1 x217; - uint64_t x218; - fiat_p47441_uint1 x219; - uint64_t x220; - fiat_p47441_uint1 x221; - uint64_t x222; - uint64_t x223; - uint64_t x224; - uint64_t x225; - uint64_t x226; - uint64_t x227; - uint64_t x228; - uint64_t x229; - uint64_t x230; - uint64_t x231; - uint64_t x232; - uint64_t x233; - uint64_t x234; - fiat_p47441_uint1 x235; - uint64_t x236; - fiat_p47441_uint1 x237; - uint64_t x238; - fiat_p47441_uint1 x239; - uint64_t x240; - fiat_p47441_uint1 x241; - uint64_t x242; - fiat_p47441_uint1 x243; - uint64_t x244; - fiat_p47441_uint1 x245; - uint64_t x246; - fiat_p47441_uint1 x247; - uint64_t x248; - fiat_p47441_uint1 x249; - uint64_t x250; - fiat_p47441_uint1 x251; - uint64_t x252; - fiat_p47441_uint1 x253; - uint64_t x254; - fiat_p47441_uint1 x255; - uint64_t x256; - uint64_t x257; - fiat_p47441_uint1 x258; - uint64_t x259; - fiat_p47441_uint1 x260; - uint64_t x261; - fiat_p47441_uint1 x262; - uint64_t x263; - fiat_p47441_uint1 x264; - uint64_t x265; - fiat_p47441_uint1 x266; - uint64_t x267; - fiat_p47441_uint1 x268; - uint64_t x269; - fiat_p47441_uint1 x270; - uint64_t x271; - uint64_t x272; - uint64_t x273; - uint64_t x274; - uint64_t x275; - uint64_t x276; - x1 = (arg1[0]); - fiat_p47441_mulx_u64(&x2, &x3, x1, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x4, &x5, x1, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x6, &x7, x1, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x8, &x9, x1, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x10, &x11, x1, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x12, &x13, x1, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x14, &x15, 0x0, x13, x10); - fiat_p47441_addcarryx_u64(&x16, &x17, x15, x11, x8); - fiat_p47441_addcarryx_u64(&x18, &x19, x17, x9, x6); - fiat_p47441_addcarryx_u64(&x20, &x21, x19, x7, x4); - fiat_p47441_addcarryx_u64(&x22, &x23, x21, x5, x2); - fiat_p47441_addcarryx_u64(&x24, &x25, 0x0, x1, x12); - fiat_p47441_addcarryx_u64(&x26, &x27, x25, 0x0, x14); - fiat_p47441_addcarryx_u64(&x28, &x29, x27, 0x0, x16); - fiat_p47441_addcarryx_u64(&x30, &x31, x29, 0x0, x18); - fiat_p47441_addcarryx_u64(&x32, &x33, x31, 0x0, x20); - fiat_p47441_addcarryx_u64(&x34, &x35, x33, 0x0, x22); - fiat_p47441_addcarryx_u64(&x36, &x37, 0x0, x26, (arg1[1])); - fiat_p47441_addcarryx_u64(&x38, &x39, x37, x28, 0x0); - fiat_p47441_addcarryx_u64(&x40, &x41, x39, x30, 0x0); - fiat_p47441_addcarryx_u64(&x42, &x43, x41, x32, 0x0); - fiat_p47441_addcarryx_u64(&x44, &x45, x43, x34, 0x0); - fiat_p47441_mulx_u64(&x46, &x47, x36, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x48, &x49, x36, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x50, &x51, x36, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x52, &x53, x36, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x54, &x55, x36, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x56, &x57, x36, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x58, &x59, 0x0, x57, x54); - fiat_p47441_addcarryx_u64(&x60, &x61, x59, x55, x52); - fiat_p47441_addcarryx_u64(&x62, &x63, x61, x53, x50); - fiat_p47441_addcarryx_u64(&x64, &x65, x63, x51, x48); - fiat_p47441_addcarryx_u64(&x66, &x67, x65, x49, x46); - fiat_p47441_addcarryx_u64(&x68, &x69, 0x0, x36, x56); - fiat_p47441_addcarryx_u64(&x70, &x71, x69, x38, x58); - fiat_p47441_addcarryx_u64(&x72, &x73, x71, x40, x60); - fiat_p47441_addcarryx_u64(&x74, &x75, x73, x42, x62); - fiat_p47441_addcarryx_u64(&x76, &x77, x75, x44, x64); - fiat_p47441_addcarryx_u64(&x78, &x79, x77, (x45 + (x35 + (x23 + x3))), x66); - fiat_p47441_addcarryx_u64(&x80, &x81, 0x0, x70, (arg1[2])); - fiat_p47441_addcarryx_u64(&x82, &x83, x81, x72, 0x0); - fiat_p47441_addcarryx_u64(&x84, &x85, x83, x74, 0x0); - fiat_p47441_addcarryx_u64(&x86, &x87, x85, x76, 0x0); - fiat_p47441_addcarryx_u64(&x88, &x89, x87, x78, 0x0); - fiat_p47441_mulx_u64(&x90, &x91, x80, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x92, &x93, x80, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x94, &x95, x80, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x96, &x97, x80, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x98, &x99, x80, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x100, &x101, x80, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x102, &x103, 0x0, x101, x98); - fiat_p47441_addcarryx_u64(&x104, &x105, x103, x99, x96); - fiat_p47441_addcarryx_u64(&x106, &x107, x105, x97, x94); - fiat_p47441_addcarryx_u64(&x108, &x109, x107, x95, x92); - fiat_p47441_addcarryx_u64(&x110, &x111, x109, x93, x90); - fiat_p47441_addcarryx_u64(&x112, &x113, 0x0, x80, x100); - fiat_p47441_addcarryx_u64(&x114, &x115, x113, x82, x102); - fiat_p47441_addcarryx_u64(&x116, &x117, x115, x84, x104); - fiat_p47441_addcarryx_u64(&x118, &x119, x117, x86, x106); - fiat_p47441_addcarryx_u64(&x120, &x121, x119, x88, x108); - fiat_p47441_addcarryx_u64(&x122, &x123, x121, (x89 + (x79 + (x67 + x47))), x110); - fiat_p47441_addcarryx_u64(&x124, &x125, 0x0, x114, (arg1[3])); - fiat_p47441_addcarryx_u64(&x126, &x127, x125, x116, 0x0); - fiat_p47441_addcarryx_u64(&x128, &x129, x127, x118, 0x0); - fiat_p47441_addcarryx_u64(&x130, &x131, x129, x120, 0x0); - fiat_p47441_addcarryx_u64(&x132, &x133, x131, x122, 0x0); - fiat_p47441_mulx_u64(&x134, &x135, x124, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x136, &x137, x124, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x138, &x139, x124, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x140, &x141, x124, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x142, &x143, x124, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x144, &x145, x124, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x146, &x147, 0x0, x145, x142); - fiat_p47441_addcarryx_u64(&x148, &x149, x147, x143, x140); - fiat_p47441_addcarryx_u64(&x150, &x151, x149, x141, x138); - fiat_p47441_addcarryx_u64(&x152, &x153, x151, x139, x136); - fiat_p47441_addcarryx_u64(&x154, &x155, x153, x137, x134); - fiat_p47441_addcarryx_u64(&x156, &x157, 0x0, x124, x144); - fiat_p47441_addcarryx_u64(&x158, &x159, x157, x126, x146); - fiat_p47441_addcarryx_u64(&x160, &x161, x159, x128, x148); - fiat_p47441_addcarryx_u64(&x162, &x163, x161, x130, x150); - fiat_p47441_addcarryx_u64(&x164, &x165, x163, x132, x152); - fiat_p47441_addcarryx_u64(&x166, &x167, x165, (x133 + (x123 + (x111 + x91))), x154); - fiat_p47441_addcarryx_u64(&x168, &x169, 0x0, x158, (arg1[4])); - fiat_p47441_addcarryx_u64(&x170, &x171, x169, x160, 0x0); - fiat_p47441_addcarryx_u64(&x172, &x173, x171, x162, 0x0); - fiat_p47441_addcarryx_u64(&x174, &x175, x173, x164, 0x0); - fiat_p47441_addcarryx_u64(&x176, &x177, x175, x166, 0x0); - fiat_p47441_mulx_u64(&x178, &x179, x168, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x180, &x181, x168, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x182, &x183, x168, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x184, &x185, x168, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x186, &x187, x168, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x188, &x189, x168, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x190, &x191, 0x0, x189, x186); - fiat_p47441_addcarryx_u64(&x192, &x193, x191, x187, x184); - fiat_p47441_addcarryx_u64(&x194, &x195, x193, x185, x182); - fiat_p47441_addcarryx_u64(&x196, &x197, x195, x183, x180); - fiat_p47441_addcarryx_u64(&x198, &x199, x197, x181, x178); - fiat_p47441_addcarryx_u64(&x200, &x201, 0x0, x168, x188); - fiat_p47441_addcarryx_u64(&x202, &x203, x201, x170, x190); - fiat_p47441_addcarryx_u64(&x204, &x205, x203, x172, x192); - fiat_p47441_addcarryx_u64(&x206, &x207, x205, x174, x194); - fiat_p47441_addcarryx_u64(&x208, &x209, x207, x176, x196); - fiat_p47441_addcarryx_u64(&x210, &x211, x209, (x177 + (x167 + (x155 + x135))), x198); - fiat_p47441_addcarryx_u64(&x212, &x213, 0x0, x202, (arg1[5])); - fiat_p47441_addcarryx_u64(&x214, &x215, x213, x204, 0x0); - fiat_p47441_addcarryx_u64(&x216, &x217, x215, x206, 0x0); - fiat_p47441_addcarryx_u64(&x218, &x219, x217, x208, 0x0); - fiat_p47441_addcarryx_u64(&x220, &x221, x219, x210, 0x0); - fiat_p47441_mulx_u64(&x222, &x223, x212, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x224, &x225, x212, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x226, &x227, x212, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x228, &x229, x212, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x230, &x231, x212, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x232, &x233, x212, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x234, &x235, 0x0, x233, x230); - fiat_p47441_addcarryx_u64(&x236, &x237, x235, x231, x228); - fiat_p47441_addcarryx_u64(&x238, &x239, x237, x229, x226); - fiat_p47441_addcarryx_u64(&x240, &x241, x239, x227, x224); - fiat_p47441_addcarryx_u64(&x242, &x243, x241, x225, x222); - fiat_p47441_addcarryx_u64(&x244, &x245, 0x0, x212, x232); - fiat_p47441_addcarryx_u64(&x246, &x247, x245, x214, x234); - fiat_p47441_addcarryx_u64(&x248, &x249, x247, x216, x236); - fiat_p47441_addcarryx_u64(&x250, &x251, x249, x218, x238); - fiat_p47441_addcarryx_u64(&x252, &x253, x251, x220, x240); - fiat_p47441_addcarryx_u64(&x254, &x255, x253, (x221 + (x211 + (x199 + x179))), x242); - x256 = (x255 + (x243 + x223)); - fiat_p47441_subborrowx_u64(&x257, &x258, 0x0, x246, UINT64_C(0xffffffffffffffff)); - fiat_p47441_subborrowx_u64(&x259, &x260, x258, x248, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_subborrowx_u64(&x261, &x262, x260, x250, UINT64_C(0xc722f669356ea468)); - fiat_p47441_subborrowx_u64(&x263, &x264, x262, x252, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_subborrowx_u64(&x265, &x266, x264, x254, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_subborrowx_u64(&x267, &x268, x266, x256, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_subborrowx_u64(&x269, &x270, x268, 0x0, 0x0); - fiat_p47441_cmovznz_u64(&x271, x270, x257, x246); - fiat_p47441_cmovznz_u64(&x272, x270, x259, x248); - fiat_p47441_cmovznz_u64(&x273, x270, x261, x250); - fiat_p47441_cmovznz_u64(&x274, x270, x263, x252); - fiat_p47441_cmovznz_u64(&x275, x270, x265, x254); - fiat_p47441_cmovznz_u64(&x276, x270, x267, x256); - out1[0] = x271; - out1[1] = x272; - out1[2] = x273; - out1[3] = x274; - out1[4] = x275; - out1[5] = x276; -} - -/* - * The function fiat_p47441_to_montgomery translates a field element into the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval (from_montgomery out1) mod m = eval arg1 mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p47441_to_montgomery(fiat_p47441_montgomery_domain_field_element out1, const fiat_p47441_non_montgomery_domain_field_element arg1) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - uint64_t x14; - uint64_t x15; - uint64_t x16; - uint64_t x17; - uint64_t x18; - uint64_t x19; - fiat_p47441_uint1 x20; - uint64_t x21; - fiat_p47441_uint1 x22; - uint64_t x23; - fiat_p47441_uint1 x24; - uint64_t x25; - fiat_p47441_uint1 x26; - uint64_t x27; - fiat_p47441_uint1 x28; - uint64_t x29; - uint64_t x30; - uint64_t x31; - uint64_t x32; - uint64_t x33; - uint64_t x34; - uint64_t x35; - uint64_t x36; - uint64_t x37; - uint64_t x38; - uint64_t x39; - uint64_t x40; - uint64_t x41; - fiat_p47441_uint1 x42; - uint64_t x43; - fiat_p47441_uint1 x44; - uint64_t x45; - fiat_p47441_uint1 x46; - uint64_t x47; - fiat_p47441_uint1 x48; - uint64_t x49; - fiat_p47441_uint1 x50; - uint64_t x51; - fiat_p47441_uint1 x52; - uint64_t x53; - fiat_p47441_uint1 x54; - uint64_t x55; - fiat_p47441_uint1 x56; - uint64_t x57; - fiat_p47441_uint1 x58; - uint64_t x59; - fiat_p47441_uint1 x60; - uint64_t x61; - fiat_p47441_uint1 x62; - uint64_t x63; - uint64_t x64; - uint64_t x65; - uint64_t x66; - uint64_t x67; - uint64_t x68; - uint64_t x69; - uint64_t x70; - uint64_t x71; - uint64_t x72; - uint64_t x73; - uint64_t x74; - uint64_t x75; - fiat_p47441_uint1 x76; - uint64_t x77; - fiat_p47441_uint1 x78; - uint64_t x79; - fiat_p47441_uint1 x80; - uint64_t x81; - fiat_p47441_uint1 x82; - uint64_t x83; - fiat_p47441_uint1 x84; - uint64_t x85; - fiat_p47441_uint1 x86; - uint64_t x87; - fiat_p47441_uint1 x88; - uint64_t x89; - fiat_p47441_uint1 x90; - uint64_t x91; - fiat_p47441_uint1 x92; - uint64_t x93; - fiat_p47441_uint1 x94; - uint64_t x95; - fiat_p47441_uint1 x96; - uint64_t x97; - uint64_t x98; - uint64_t x99; - uint64_t x100; - uint64_t x101; - uint64_t x102; - uint64_t x103; - uint64_t x104; - uint64_t x105; - uint64_t x106; - uint64_t x107; - uint64_t x108; - uint64_t x109; - fiat_p47441_uint1 x110; - uint64_t x111; - fiat_p47441_uint1 x112; - uint64_t x113; - fiat_p47441_uint1 x114; - uint64_t x115; - fiat_p47441_uint1 x116; - uint64_t x117; - fiat_p47441_uint1 x118; - uint64_t x119; - fiat_p47441_uint1 x120; - uint64_t x121; - fiat_p47441_uint1 x122; - uint64_t x123; - fiat_p47441_uint1 x124; - uint64_t x125; - fiat_p47441_uint1 x126; - uint64_t x127; - fiat_p47441_uint1 x128; - uint64_t x129; - fiat_p47441_uint1 x130; - uint64_t x131; - uint64_t x132; - uint64_t x133; - uint64_t x134; - uint64_t x135; - uint64_t x136; - uint64_t x137; - uint64_t x138; - uint64_t x139; - uint64_t x140; - uint64_t x141; - uint64_t x142; - uint64_t x143; - fiat_p47441_uint1 x144; - uint64_t x145; - fiat_p47441_uint1 x146; - uint64_t x147; - fiat_p47441_uint1 x148; - uint64_t x149; - fiat_p47441_uint1 x150; - uint64_t x151; - fiat_p47441_uint1 x152; - uint64_t x153; - fiat_p47441_uint1 x154; - uint64_t x155; - fiat_p47441_uint1 x156; - uint64_t x157; - fiat_p47441_uint1 x158; - uint64_t x159; - fiat_p47441_uint1 x160; - uint64_t x161; - fiat_p47441_uint1 x162; - uint64_t x163; - fiat_p47441_uint1 x164; - uint64_t x165; - uint64_t x166; - uint64_t x167; - uint64_t x168; - uint64_t x169; - uint64_t x170; - uint64_t x171; - uint64_t x172; - uint64_t x173; - uint64_t x174; - uint64_t x175; - uint64_t x176; - uint64_t x177; - fiat_p47441_uint1 x178; - uint64_t x179; - fiat_p47441_uint1 x180; - uint64_t x181; - fiat_p47441_uint1 x182; - uint64_t x183; - fiat_p47441_uint1 x184; - uint64_t x185; - fiat_p47441_uint1 x186; - uint64_t x187; - fiat_p47441_uint1 x188; - uint64_t x189; - fiat_p47441_uint1 x190; - uint64_t x191; - fiat_p47441_uint1 x192; - uint64_t x193; - fiat_p47441_uint1 x194; - uint64_t x195; - fiat_p47441_uint1 x196; - uint64_t x197; - fiat_p47441_uint1 x198; - uint64_t x199; - uint64_t x200; - uint64_t x201; - uint64_t x202; - uint64_t x203; - uint64_t x204; - uint64_t x205; - uint64_t x206; - uint64_t x207; - uint64_t x208; - uint64_t x209; - uint64_t x210; - uint64_t x211; - fiat_p47441_uint1 x212; - uint64_t x213; - fiat_p47441_uint1 x214; - uint64_t x215; - fiat_p47441_uint1 x216; - uint64_t x217; - fiat_p47441_uint1 x218; - uint64_t x219; - fiat_p47441_uint1 x220; - uint64_t x221; - fiat_p47441_uint1 x222; - uint64_t x223; - fiat_p47441_uint1 x224; - uint64_t x225; - fiat_p47441_uint1 x226; - uint64_t x227; - fiat_p47441_uint1 x228; - uint64_t x229; - fiat_p47441_uint1 x230; - uint64_t x231; - fiat_p47441_uint1 x232; - uint64_t x233; - uint64_t x234; - uint64_t x235; - uint64_t x236; - uint64_t x237; - uint64_t x238; - uint64_t x239; - uint64_t x240; - uint64_t x241; - uint64_t x242; - uint64_t x243; - uint64_t x244; - uint64_t x245; - fiat_p47441_uint1 x246; - uint64_t x247; - fiat_p47441_uint1 x248; - uint64_t x249; - fiat_p47441_uint1 x250; - uint64_t x251; - fiat_p47441_uint1 x252; - uint64_t x253; - fiat_p47441_uint1 x254; - uint64_t x255; - fiat_p47441_uint1 x256; - uint64_t x257; - fiat_p47441_uint1 x258; - uint64_t x259; - fiat_p47441_uint1 x260; - uint64_t x261; - fiat_p47441_uint1 x262; - uint64_t x263; - fiat_p47441_uint1 x264; - uint64_t x265; - fiat_p47441_uint1 x266; - uint64_t x267; - uint64_t x268; - uint64_t x269; - uint64_t x270; - uint64_t x271; - uint64_t x272; - uint64_t x273; - uint64_t x274; - uint64_t x275; - uint64_t x276; - uint64_t x277; - uint64_t x278; - uint64_t x279; - fiat_p47441_uint1 x280; - uint64_t x281; - fiat_p47441_uint1 x282; - uint64_t x283; - fiat_p47441_uint1 x284; - uint64_t x285; - fiat_p47441_uint1 x286; - uint64_t x287; - fiat_p47441_uint1 x288; - uint64_t x289; - fiat_p47441_uint1 x290; - uint64_t x291; - fiat_p47441_uint1 x292; - uint64_t x293; - fiat_p47441_uint1 x294; - uint64_t x295; - fiat_p47441_uint1 x296; - uint64_t x297; - fiat_p47441_uint1 x298; - uint64_t x299; - fiat_p47441_uint1 x300; - uint64_t x301; - uint64_t x302; - uint64_t x303; - uint64_t x304; - uint64_t x305; - uint64_t x306; - uint64_t x307; - uint64_t x308; - uint64_t x309; - uint64_t x310; - uint64_t x311; - uint64_t x312; - uint64_t x313; - fiat_p47441_uint1 x314; - uint64_t x315; - fiat_p47441_uint1 x316; - uint64_t x317; - fiat_p47441_uint1 x318; - uint64_t x319; - fiat_p47441_uint1 x320; - uint64_t x321; - fiat_p47441_uint1 x322; - uint64_t x323; - fiat_p47441_uint1 x324; - uint64_t x325; - fiat_p47441_uint1 x326; - uint64_t x327; - fiat_p47441_uint1 x328; - uint64_t x329; - fiat_p47441_uint1 x330; - uint64_t x331; - fiat_p47441_uint1 x332; - uint64_t x333; - fiat_p47441_uint1 x334; - uint64_t x335; - uint64_t x336; - uint64_t x337; - uint64_t x338; - uint64_t x339; - uint64_t x340; - uint64_t x341; - uint64_t x342; - uint64_t x343; - uint64_t x344; - uint64_t x345; - uint64_t x346; - uint64_t x347; - fiat_p47441_uint1 x348; - uint64_t x349; - fiat_p47441_uint1 x350; - uint64_t x351; - fiat_p47441_uint1 x352; - uint64_t x353; - fiat_p47441_uint1 x354; - uint64_t x355; - fiat_p47441_uint1 x356; - uint64_t x357; - fiat_p47441_uint1 x358; - uint64_t x359; - fiat_p47441_uint1 x360; - uint64_t x361; - fiat_p47441_uint1 x362; - uint64_t x363; - fiat_p47441_uint1 x364; - uint64_t x365; - fiat_p47441_uint1 x366; - uint64_t x367; - fiat_p47441_uint1 x368; - uint64_t x369; - uint64_t x370; - uint64_t x371; - uint64_t x372; - uint64_t x373; - uint64_t x374; - uint64_t x375; - uint64_t x376; - uint64_t x377; - uint64_t x378; - uint64_t x379; - uint64_t x380; - uint64_t x381; - fiat_p47441_uint1 x382; - uint64_t x383; - fiat_p47441_uint1 x384; - uint64_t x385; - fiat_p47441_uint1 x386; - uint64_t x387; - fiat_p47441_uint1 x388; - uint64_t x389; - fiat_p47441_uint1 x390; - uint64_t x391; - fiat_p47441_uint1 x392; - uint64_t x393; - fiat_p47441_uint1 x394; - uint64_t x395; - fiat_p47441_uint1 x396; - uint64_t x397; - fiat_p47441_uint1 x398; - uint64_t x399; - fiat_p47441_uint1 x400; - uint64_t x401; - fiat_p47441_uint1 x402; - uint64_t x403; - uint64_t x404; - fiat_p47441_uint1 x405; - uint64_t x406; - fiat_p47441_uint1 x407; - uint64_t x408; - fiat_p47441_uint1 x409; - uint64_t x410; - fiat_p47441_uint1 x411; - uint64_t x412; - fiat_p47441_uint1 x413; - uint64_t x414; - fiat_p47441_uint1 x415; - uint64_t x416; - fiat_p47441_uint1 x417; - uint64_t x418; - uint64_t x419; - uint64_t x420; - uint64_t x421; - uint64_t x422; - uint64_t x423; - x1 = (arg1[1]); - x2 = (arg1[2]); - x3 = (arg1[3]); - x4 = (arg1[4]); - x5 = (arg1[5]); - x6 = (arg1[0]); - fiat_p47441_mulx_u64(&x7, &x8, x6, UINT64_C(0x389174e2d56216f)); - fiat_p47441_mulx_u64(&x9, &x10, x6, UINT64_C(0xafea5eb6ef0da10)); - fiat_p47441_mulx_u64(&x11, &x12, x6, UINT64_C(0x328905e465cd7db3)); - fiat_p47441_mulx_u64(&x13, &x14, x6, UINT64_C(0x342c8b98f26f21ed)); - fiat_p47441_mulx_u64(&x15, &x16, x6, UINT64_C(0xdc10c645bfe4a1ac)); - fiat_p47441_mulx_u64(&x17, &x18, x6, UINT64_C(0x47b3e8268664617e)); - fiat_p47441_addcarryx_u64(&x19, &x20, 0x0, x18, x15); - fiat_p47441_addcarryx_u64(&x21, &x22, x20, x16, x13); - fiat_p47441_addcarryx_u64(&x23, &x24, x22, x14, x11); - fiat_p47441_addcarryx_u64(&x25, &x26, x24, x12, x9); - fiat_p47441_addcarryx_u64(&x27, &x28, x26, x10, x7); - fiat_p47441_mulx_u64(&x29, &x30, x17, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x31, &x32, x17, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x33, &x34, x17, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x35, &x36, x17, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x37, &x38, x17, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x39, &x40, x17, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x41, &x42, 0x0, x40, x37); - fiat_p47441_addcarryx_u64(&x43, &x44, x42, x38, x35); - fiat_p47441_addcarryx_u64(&x45, &x46, x44, x36, x33); - fiat_p47441_addcarryx_u64(&x47, &x48, x46, x34, x31); - fiat_p47441_addcarryx_u64(&x49, &x50, x48, x32, x29); - fiat_p47441_addcarryx_u64(&x51, &x52, 0x0, x17, x39); - fiat_p47441_addcarryx_u64(&x53, &x54, x52, x19, x41); - fiat_p47441_addcarryx_u64(&x55, &x56, x54, x21, x43); - fiat_p47441_addcarryx_u64(&x57, &x58, x56, x23, x45); - fiat_p47441_addcarryx_u64(&x59, &x60, x58, x25, x47); - fiat_p47441_addcarryx_u64(&x61, &x62, x60, x27, x49); - fiat_p47441_mulx_u64(&x63, &x64, x1, UINT64_C(0x389174e2d56216f)); - fiat_p47441_mulx_u64(&x65, &x66, x1, UINT64_C(0xafea5eb6ef0da10)); - fiat_p47441_mulx_u64(&x67, &x68, x1, UINT64_C(0x328905e465cd7db3)); - fiat_p47441_mulx_u64(&x69, &x70, x1, UINT64_C(0x342c8b98f26f21ed)); - fiat_p47441_mulx_u64(&x71, &x72, x1, UINT64_C(0xdc10c645bfe4a1ac)); - fiat_p47441_mulx_u64(&x73, &x74, x1, UINT64_C(0x47b3e8268664617e)); - fiat_p47441_addcarryx_u64(&x75, &x76, 0x0, x74, x71); - fiat_p47441_addcarryx_u64(&x77, &x78, x76, x72, x69); - fiat_p47441_addcarryx_u64(&x79, &x80, x78, x70, x67); - fiat_p47441_addcarryx_u64(&x81, &x82, x80, x68, x65); - fiat_p47441_addcarryx_u64(&x83, &x84, x82, x66, x63); - fiat_p47441_addcarryx_u64(&x85, &x86, 0x0, x53, x73); - fiat_p47441_addcarryx_u64(&x87, &x88, x86, x55, x75); - fiat_p47441_addcarryx_u64(&x89, &x90, x88, x57, x77); - fiat_p47441_addcarryx_u64(&x91, &x92, x90, x59, x79); - fiat_p47441_addcarryx_u64(&x93, &x94, x92, x61, x81); - fiat_p47441_addcarryx_u64(&x95, &x96, x94, ((x62 + (x28 + x8)) + (x50 + x30)), x83); - fiat_p47441_mulx_u64(&x97, &x98, x85, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x99, &x100, x85, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x101, &x102, x85, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x103, &x104, x85, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x105, &x106, x85, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x107, &x108, x85, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x109, &x110, 0x0, x108, x105); - fiat_p47441_addcarryx_u64(&x111, &x112, x110, x106, x103); - fiat_p47441_addcarryx_u64(&x113, &x114, x112, x104, x101); - fiat_p47441_addcarryx_u64(&x115, &x116, x114, x102, x99); - fiat_p47441_addcarryx_u64(&x117, &x118, x116, x100, x97); - fiat_p47441_addcarryx_u64(&x119, &x120, 0x0, x85, x107); - fiat_p47441_addcarryx_u64(&x121, &x122, x120, x87, x109); - fiat_p47441_addcarryx_u64(&x123, &x124, x122, x89, x111); - fiat_p47441_addcarryx_u64(&x125, &x126, x124, x91, x113); - fiat_p47441_addcarryx_u64(&x127, &x128, x126, x93, x115); - fiat_p47441_addcarryx_u64(&x129, &x130, x128, x95, x117); - fiat_p47441_mulx_u64(&x131, &x132, x2, UINT64_C(0x389174e2d56216f)); - fiat_p47441_mulx_u64(&x133, &x134, x2, UINT64_C(0xafea5eb6ef0da10)); - fiat_p47441_mulx_u64(&x135, &x136, x2, UINT64_C(0x328905e465cd7db3)); - fiat_p47441_mulx_u64(&x137, &x138, x2, UINT64_C(0x342c8b98f26f21ed)); - fiat_p47441_mulx_u64(&x139, &x140, x2, UINT64_C(0xdc10c645bfe4a1ac)); - fiat_p47441_mulx_u64(&x141, &x142, x2, UINT64_C(0x47b3e8268664617e)); - fiat_p47441_addcarryx_u64(&x143, &x144, 0x0, x142, x139); - fiat_p47441_addcarryx_u64(&x145, &x146, x144, x140, x137); - fiat_p47441_addcarryx_u64(&x147, &x148, x146, x138, x135); - fiat_p47441_addcarryx_u64(&x149, &x150, x148, x136, x133); - fiat_p47441_addcarryx_u64(&x151, &x152, x150, x134, x131); - fiat_p47441_addcarryx_u64(&x153, &x154, 0x0, x121, x141); - fiat_p47441_addcarryx_u64(&x155, &x156, x154, x123, x143); - fiat_p47441_addcarryx_u64(&x157, &x158, x156, x125, x145); - fiat_p47441_addcarryx_u64(&x159, &x160, x158, x127, x147); - fiat_p47441_addcarryx_u64(&x161, &x162, x160, x129, x149); - fiat_p47441_addcarryx_u64(&x163, &x164, x162, ((x130 + (x96 + (x84 + x64))) + (x118 + x98)), x151); - fiat_p47441_mulx_u64(&x165, &x166, x153, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x167, &x168, x153, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x169, &x170, x153, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x171, &x172, x153, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x173, &x174, x153, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x175, &x176, x153, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x177, &x178, 0x0, x176, x173); - fiat_p47441_addcarryx_u64(&x179, &x180, x178, x174, x171); - fiat_p47441_addcarryx_u64(&x181, &x182, x180, x172, x169); - fiat_p47441_addcarryx_u64(&x183, &x184, x182, x170, x167); - fiat_p47441_addcarryx_u64(&x185, &x186, x184, x168, x165); - fiat_p47441_addcarryx_u64(&x187, &x188, 0x0, x153, x175); - fiat_p47441_addcarryx_u64(&x189, &x190, x188, x155, x177); - fiat_p47441_addcarryx_u64(&x191, &x192, x190, x157, x179); - fiat_p47441_addcarryx_u64(&x193, &x194, x192, x159, x181); - fiat_p47441_addcarryx_u64(&x195, &x196, x194, x161, x183); - fiat_p47441_addcarryx_u64(&x197, &x198, x196, x163, x185); - fiat_p47441_mulx_u64(&x199, &x200, x3, UINT64_C(0x389174e2d56216f)); - fiat_p47441_mulx_u64(&x201, &x202, x3, UINT64_C(0xafea5eb6ef0da10)); - fiat_p47441_mulx_u64(&x203, &x204, x3, UINT64_C(0x328905e465cd7db3)); - fiat_p47441_mulx_u64(&x205, &x206, x3, UINT64_C(0x342c8b98f26f21ed)); - fiat_p47441_mulx_u64(&x207, &x208, x3, UINT64_C(0xdc10c645bfe4a1ac)); - fiat_p47441_mulx_u64(&x209, &x210, x3, UINT64_C(0x47b3e8268664617e)); - fiat_p47441_addcarryx_u64(&x211, &x212, 0x0, x210, x207); - fiat_p47441_addcarryx_u64(&x213, &x214, x212, x208, x205); - fiat_p47441_addcarryx_u64(&x215, &x216, x214, x206, x203); - fiat_p47441_addcarryx_u64(&x217, &x218, x216, x204, x201); - fiat_p47441_addcarryx_u64(&x219, &x220, x218, x202, x199); - fiat_p47441_addcarryx_u64(&x221, &x222, 0x0, x189, x209); - fiat_p47441_addcarryx_u64(&x223, &x224, x222, x191, x211); - fiat_p47441_addcarryx_u64(&x225, &x226, x224, x193, x213); - fiat_p47441_addcarryx_u64(&x227, &x228, x226, x195, x215); - fiat_p47441_addcarryx_u64(&x229, &x230, x228, x197, x217); - fiat_p47441_addcarryx_u64(&x231, &x232, x230, ((x198 + (x164 + (x152 + x132))) + (x186 + x166)), x219); - fiat_p47441_mulx_u64(&x233, &x234, x221, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x235, &x236, x221, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x237, &x238, x221, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x239, &x240, x221, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x241, &x242, x221, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x243, &x244, x221, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x245, &x246, 0x0, x244, x241); - fiat_p47441_addcarryx_u64(&x247, &x248, x246, x242, x239); - fiat_p47441_addcarryx_u64(&x249, &x250, x248, x240, x237); - fiat_p47441_addcarryx_u64(&x251, &x252, x250, x238, x235); - fiat_p47441_addcarryx_u64(&x253, &x254, x252, x236, x233); - fiat_p47441_addcarryx_u64(&x255, &x256, 0x0, x221, x243); - fiat_p47441_addcarryx_u64(&x257, &x258, x256, x223, x245); - fiat_p47441_addcarryx_u64(&x259, &x260, x258, x225, x247); - fiat_p47441_addcarryx_u64(&x261, &x262, x260, x227, x249); - fiat_p47441_addcarryx_u64(&x263, &x264, x262, x229, x251); - fiat_p47441_addcarryx_u64(&x265, &x266, x264, x231, x253); - fiat_p47441_mulx_u64(&x267, &x268, x4, UINT64_C(0x389174e2d56216f)); - fiat_p47441_mulx_u64(&x269, &x270, x4, UINT64_C(0xafea5eb6ef0da10)); - fiat_p47441_mulx_u64(&x271, &x272, x4, UINT64_C(0x328905e465cd7db3)); - fiat_p47441_mulx_u64(&x273, &x274, x4, UINT64_C(0x342c8b98f26f21ed)); - fiat_p47441_mulx_u64(&x275, &x276, x4, UINT64_C(0xdc10c645bfe4a1ac)); - fiat_p47441_mulx_u64(&x277, &x278, x4, UINT64_C(0x47b3e8268664617e)); - fiat_p47441_addcarryx_u64(&x279, &x280, 0x0, x278, x275); - fiat_p47441_addcarryx_u64(&x281, &x282, x280, x276, x273); - fiat_p47441_addcarryx_u64(&x283, &x284, x282, x274, x271); - fiat_p47441_addcarryx_u64(&x285, &x286, x284, x272, x269); - fiat_p47441_addcarryx_u64(&x287, &x288, x286, x270, x267); - fiat_p47441_addcarryx_u64(&x289, &x290, 0x0, x257, x277); - fiat_p47441_addcarryx_u64(&x291, &x292, x290, x259, x279); - fiat_p47441_addcarryx_u64(&x293, &x294, x292, x261, x281); - fiat_p47441_addcarryx_u64(&x295, &x296, x294, x263, x283); - fiat_p47441_addcarryx_u64(&x297, &x298, x296, x265, x285); - fiat_p47441_addcarryx_u64(&x299, &x300, x298, ((x266 + (x232 + (x220 + x200))) + (x254 + x234)), x287); - fiat_p47441_mulx_u64(&x301, &x302, x289, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x303, &x304, x289, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x305, &x306, x289, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x307, &x308, x289, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x309, &x310, x289, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x311, &x312, x289, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x313, &x314, 0x0, x312, x309); - fiat_p47441_addcarryx_u64(&x315, &x316, x314, x310, x307); - fiat_p47441_addcarryx_u64(&x317, &x318, x316, x308, x305); - fiat_p47441_addcarryx_u64(&x319, &x320, x318, x306, x303); - fiat_p47441_addcarryx_u64(&x321, &x322, x320, x304, x301); - fiat_p47441_addcarryx_u64(&x323, &x324, 0x0, x289, x311); - fiat_p47441_addcarryx_u64(&x325, &x326, x324, x291, x313); - fiat_p47441_addcarryx_u64(&x327, &x328, x326, x293, x315); - fiat_p47441_addcarryx_u64(&x329, &x330, x328, x295, x317); - fiat_p47441_addcarryx_u64(&x331, &x332, x330, x297, x319); - fiat_p47441_addcarryx_u64(&x333, &x334, x332, x299, x321); - fiat_p47441_mulx_u64(&x335, &x336, x5, UINT64_C(0x389174e2d56216f)); - fiat_p47441_mulx_u64(&x337, &x338, x5, UINT64_C(0xafea5eb6ef0da10)); - fiat_p47441_mulx_u64(&x339, &x340, x5, UINT64_C(0x328905e465cd7db3)); - fiat_p47441_mulx_u64(&x341, &x342, x5, UINT64_C(0x342c8b98f26f21ed)); - fiat_p47441_mulx_u64(&x343, &x344, x5, UINT64_C(0xdc10c645bfe4a1ac)); - fiat_p47441_mulx_u64(&x345, &x346, x5, UINT64_C(0x47b3e8268664617e)); - fiat_p47441_addcarryx_u64(&x347, &x348, 0x0, x346, x343); - fiat_p47441_addcarryx_u64(&x349, &x350, x348, x344, x341); - fiat_p47441_addcarryx_u64(&x351, &x352, x350, x342, x339); - fiat_p47441_addcarryx_u64(&x353, &x354, x352, x340, x337); - fiat_p47441_addcarryx_u64(&x355, &x356, x354, x338, x335); - fiat_p47441_addcarryx_u64(&x357, &x358, 0x0, x325, x345); - fiat_p47441_addcarryx_u64(&x359, &x360, x358, x327, x347); - fiat_p47441_addcarryx_u64(&x361, &x362, x360, x329, x349); - fiat_p47441_addcarryx_u64(&x363, &x364, x362, x331, x351); - fiat_p47441_addcarryx_u64(&x365, &x366, x364, x333, x353); - fiat_p47441_addcarryx_u64(&x367, &x368, x366, ((x334 + (x300 + (x288 + x268))) + (x322 + x302)), x355); - fiat_p47441_mulx_u64(&x369, &x370, x357, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x371, &x372, x357, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x373, &x374, x357, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x375, &x376, x357, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x377, &x378, x357, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x379, &x380, x357, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x381, &x382, 0x0, x380, x377); - fiat_p47441_addcarryx_u64(&x383, &x384, x382, x378, x375); - fiat_p47441_addcarryx_u64(&x385, &x386, x384, x376, x373); - fiat_p47441_addcarryx_u64(&x387, &x388, x386, x374, x371); - fiat_p47441_addcarryx_u64(&x389, &x390, x388, x372, x369); - fiat_p47441_addcarryx_u64(&x391, &x392, 0x0, x357, x379); - fiat_p47441_addcarryx_u64(&x393, &x394, x392, x359, x381); - fiat_p47441_addcarryx_u64(&x395, &x396, x394, x361, x383); - fiat_p47441_addcarryx_u64(&x397, &x398, x396, x363, x385); - fiat_p47441_addcarryx_u64(&x399, &x400, x398, x365, x387); - fiat_p47441_addcarryx_u64(&x401, &x402, x400, x367, x389); - x403 = ((x402 + (x368 + (x356 + x336))) + (x390 + x370)); - fiat_p47441_subborrowx_u64(&x404, &x405, 0x0, x393, UINT64_C(0xffffffffffffffff)); - fiat_p47441_subborrowx_u64(&x406, &x407, x405, x395, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_subborrowx_u64(&x408, &x409, x407, x397, UINT64_C(0xc722f669356ea468)); - fiat_p47441_subborrowx_u64(&x410, &x411, x409, x399, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_subborrowx_u64(&x412, &x413, x411, x401, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_subborrowx_u64(&x414, &x415, x413, x403, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_subborrowx_u64(&x416, &x417, x415, 0x0, 0x0); - fiat_p47441_cmovznz_u64(&x418, x417, x404, x393); - fiat_p47441_cmovznz_u64(&x419, x417, x406, x395); - fiat_p47441_cmovznz_u64(&x420, x417, x408, x397); - fiat_p47441_cmovznz_u64(&x421, x417, x410, x399); - fiat_p47441_cmovznz_u64(&x422, x417, x412, x401); - fiat_p47441_cmovznz_u64(&x423, x417, x414, x403); - out1[0] = x418; - out1[1] = x419; - out1[2] = x420; - out1[3] = x421; - out1[4] = x422; - out1[5] = x423; -} - -/* - * The function fiat_p47441_nonzero outputs a single non-zero word if the input is non-zero and zero otherwise. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * out1 = 0 ↔ eval (from_montgomery arg1) mod m = 0 - * - * Input Bounds: - * arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - */ -void fiat_p47441_nonzero(uint64_t* out1, const uint64_t arg1[6]) { - uint64_t x1; - x1 = ((arg1[0]) | ((arg1[1]) | ((arg1[2]) | ((arg1[3]) | ((arg1[4]) | (arg1[5])))))); - *out1 = x1; -} - -/* - * The function fiat_p47441_selectznz is a multi-limb conditional select. - * - * Postconditions: - * out1 = (if arg1 = 0 then arg2 else arg3) - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * arg3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * Output Bounds: - * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - */ -void fiat_p47441_selectznz(uint64_t out1[6], fiat_p47441_uint1 arg1, const uint64_t arg2[6], const uint64_t arg3[6]) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - fiat_p47441_cmovznz_u64(&x1, arg1, (arg2[0]), (arg3[0])); - fiat_p47441_cmovznz_u64(&x2, arg1, (arg2[1]), (arg3[1])); - fiat_p47441_cmovznz_u64(&x3, arg1, (arg2[2]), (arg3[2])); - fiat_p47441_cmovznz_u64(&x4, arg1, (arg2[3]), (arg3[3])); - fiat_p47441_cmovznz_u64(&x5, arg1, (arg2[4]), (arg3[4])); - fiat_p47441_cmovznz_u64(&x6, arg1, (arg2[5]), (arg3[5])); - out1[0] = x1; - out1[1] = x2; - out1[2] = x3; - out1[3] = x4; - out1[4] = x5; - out1[5] = x6; -} - -/* - * The function fiat_p47441_to_bytes serializes a field element NOT in the Montgomery domain to bytes in little-endian order. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * out1 = map (λ x, ⌊((eval arg1 mod m) mod 2^(8 * (x + 1))) / 2^(8 * x)⌋) [0..47] - * - * Input Bounds: - * arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0x3ffffffffffffff]] - * Output Bounds: - * out1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x3]] - */ -void fiat_p47441_to_bytes(uint8_t out1[48], const uint64_t arg1[6]) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint8_t x7; - uint64_t x8; - uint8_t x9; - uint64_t x10; - uint8_t x11; - uint64_t x12; - uint8_t x13; - uint64_t x14; - uint8_t x15; - uint64_t x16; - uint8_t x17; - uint64_t x18; - uint8_t x19; - uint8_t x20; - uint8_t x21; - uint64_t x22; - uint8_t x23; - uint64_t x24; - uint8_t x25; - uint64_t x26; - uint8_t x27; - uint64_t x28; - uint8_t x29; - uint64_t x30; - uint8_t x31; - uint64_t x32; - uint8_t x33; - uint8_t x34; - uint8_t x35; - uint64_t x36; - uint8_t x37; - uint64_t x38; - uint8_t x39; - uint64_t x40; - uint8_t x41; - uint64_t x42; - uint8_t x43; - uint64_t x44; - uint8_t x45; - uint64_t x46; - uint8_t x47; - uint8_t x48; - uint8_t x49; - uint64_t x50; - uint8_t x51; - uint64_t x52; - uint8_t x53; - uint64_t x54; - uint8_t x55; - uint64_t x56; - uint8_t x57; - uint64_t x58; - uint8_t x59; - uint64_t x60; - uint8_t x61; - uint8_t x62; - uint8_t x63; - uint64_t x64; - uint8_t x65; - uint64_t x66; - uint8_t x67; - uint64_t x68; - uint8_t x69; - uint64_t x70; - uint8_t x71; - uint64_t x72; - uint8_t x73; - uint64_t x74; - uint8_t x75; - uint8_t x76; - uint8_t x77; - uint64_t x78; - uint8_t x79; - uint64_t x80; - uint8_t x81; - uint64_t x82; - uint8_t x83; - uint64_t x84; - uint8_t x85; - uint64_t x86; - uint8_t x87; - uint64_t x88; - uint8_t x89; - uint8_t x90; - x1 = (arg1[5]); - x2 = (arg1[4]); - x3 = (arg1[3]); - x4 = (arg1[2]); - x5 = (arg1[1]); - x6 = (arg1[0]); - x7 = (uint8_t)(x6 & UINT8_C(0xff)); - x8 = (x6 >> 8); - x9 = (uint8_t)(x8 & UINT8_C(0xff)); - x10 = (x8 >> 8); - x11 = (uint8_t)(x10 & UINT8_C(0xff)); - x12 = (x10 >> 8); - x13 = (uint8_t)(x12 & UINT8_C(0xff)); - x14 = (x12 >> 8); - x15 = (uint8_t)(x14 & UINT8_C(0xff)); - x16 = (x14 >> 8); - x17 = (uint8_t)(x16 & UINT8_C(0xff)); - x18 = (x16 >> 8); - x19 = (uint8_t)(x18 & UINT8_C(0xff)); - x20 = (uint8_t)(x18 >> 8); - x21 = (uint8_t)(x5 & UINT8_C(0xff)); - x22 = (x5 >> 8); - x23 = (uint8_t)(x22 & UINT8_C(0xff)); - x24 = (x22 >> 8); - x25 = (uint8_t)(x24 & UINT8_C(0xff)); - x26 = (x24 >> 8); - x27 = (uint8_t)(x26 & UINT8_C(0xff)); - x28 = (x26 >> 8); - x29 = (uint8_t)(x28 & UINT8_C(0xff)); - x30 = (x28 >> 8); - x31 = (uint8_t)(x30 & UINT8_C(0xff)); - x32 = (x30 >> 8); - x33 = (uint8_t)(x32 & UINT8_C(0xff)); - x34 = (uint8_t)(x32 >> 8); - x35 = (uint8_t)(x4 & UINT8_C(0xff)); - x36 = (x4 >> 8); - x37 = (uint8_t)(x36 & UINT8_C(0xff)); - x38 = (x36 >> 8); - x39 = (uint8_t)(x38 & UINT8_C(0xff)); - x40 = (x38 >> 8); - x41 = (uint8_t)(x40 & UINT8_C(0xff)); - x42 = (x40 >> 8); - x43 = (uint8_t)(x42 & UINT8_C(0xff)); - x44 = (x42 >> 8); - x45 = (uint8_t)(x44 & UINT8_C(0xff)); - x46 = (x44 >> 8); - x47 = (uint8_t)(x46 & UINT8_C(0xff)); - x48 = (uint8_t)(x46 >> 8); - x49 = (uint8_t)(x3 & UINT8_C(0xff)); - x50 = (x3 >> 8); - x51 = (uint8_t)(x50 & UINT8_C(0xff)); - x52 = (x50 >> 8); - x53 = (uint8_t)(x52 & UINT8_C(0xff)); - x54 = (x52 >> 8); - x55 = (uint8_t)(x54 & UINT8_C(0xff)); - x56 = (x54 >> 8); - x57 = (uint8_t)(x56 & UINT8_C(0xff)); - x58 = (x56 >> 8); - x59 = (uint8_t)(x58 & UINT8_C(0xff)); - x60 = (x58 >> 8); - x61 = (uint8_t)(x60 & UINT8_C(0xff)); - x62 = (uint8_t)(x60 >> 8); - x63 = (uint8_t)(x2 & UINT8_C(0xff)); - x64 = (x2 >> 8); - x65 = (uint8_t)(x64 & UINT8_C(0xff)); - x66 = (x64 >> 8); - x67 = (uint8_t)(x66 & UINT8_C(0xff)); - x68 = (x66 >> 8); - x69 = (uint8_t)(x68 & UINT8_C(0xff)); - x70 = (x68 >> 8); - x71 = (uint8_t)(x70 & UINT8_C(0xff)); - x72 = (x70 >> 8); - x73 = (uint8_t)(x72 & UINT8_C(0xff)); - x74 = (x72 >> 8); - x75 = (uint8_t)(x74 & UINT8_C(0xff)); - x76 = (uint8_t)(x74 >> 8); - x77 = (uint8_t)(x1 & UINT8_C(0xff)); - x78 = (x1 >> 8); - x79 = (uint8_t)(x78 & UINT8_C(0xff)); - x80 = (x78 >> 8); - x81 = (uint8_t)(x80 & UINT8_C(0xff)); - x82 = (x80 >> 8); - x83 = (uint8_t)(x82 & UINT8_C(0xff)); - x84 = (x82 >> 8); - x85 = (uint8_t)(x84 & UINT8_C(0xff)); - x86 = (x84 >> 8); - x87 = (uint8_t)(x86 & UINT8_C(0xff)); - x88 = (x86 >> 8); - x89 = (uint8_t)(x88 & UINT8_C(0xff)); - x90 = (uint8_t)(x88 >> 8); - out1[0] = x7; - out1[1] = x9; - out1[2] = x11; - out1[3] = x13; - out1[4] = x15; - out1[5] = x17; - out1[6] = x19; - out1[7] = x20; - out1[8] = x21; - out1[9] = x23; - out1[10] = x25; - out1[11] = x27; - out1[12] = x29; - out1[13] = x31; - out1[14] = x33; - out1[15] = x34; - out1[16] = x35; - out1[17] = x37; - out1[18] = x39; - out1[19] = x41; - out1[20] = x43; - out1[21] = x45; - out1[22] = x47; - out1[23] = x48; - out1[24] = x49; - out1[25] = x51; - out1[26] = x53; - out1[27] = x55; - out1[28] = x57; - out1[29] = x59; - out1[30] = x61; - out1[31] = x62; - out1[32] = x63; - out1[33] = x65; - out1[34] = x67; - out1[35] = x69; - out1[36] = x71; - out1[37] = x73; - out1[38] = x75; - out1[39] = x76; - out1[40] = x77; - out1[41] = x79; - out1[42] = x81; - out1[43] = x83; - out1[44] = x85; - out1[45] = x87; - out1[46] = x89; - out1[47] = x90; -} - -/* - * The function fiat_p47441_from_bytes deserializes a field element NOT in the Montgomery domain from bytes in little-endian order. - * - * Preconditions: - * 0 ≤ bytes_eval arg1 < m - * Postconditions: - * eval out1 mod m = bytes_eval arg1 mod m - * 0 ≤ eval out1 < m - * - * Input Bounds: - * arg1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x3]] - * Output Bounds: - * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0x3ffffffffffffff]] - */ -void fiat_p47441_from_bytes(uint64_t out1[6], const uint8_t arg1[48]) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint8_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - uint64_t x14; - uint64_t x15; - uint8_t x16; - uint64_t x17; - uint64_t x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - uint64_t x23; - uint8_t x24; - uint64_t x25; - uint64_t x26; - uint64_t x27; - uint64_t x28; - uint64_t x29; - uint64_t x30; - uint64_t x31; - uint8_t x32; - uint64_t x33; - uint64_t x34; - uint64_t x35; - uint64_t x36; - uint64_t x37; - uint64_t x38; - uint64_t x39; - uint8_t x40; - uint64_t x41; - uint64_t x42; - uint64_t x43; - uint64_t x44; - uint64_t x45; - uint64_t x46; - uint64_t x47; - uint8_t x48; - uint64_t x49; - uint64_t x50; - uint64_t x51; - uint64_t x52; - uint64_t x53; - uint64_t x54; - uint64_t x55; - uint64_t x56; - uint64_t x57; - uint64_t x58; - uint64_t x59; - uint64_t x60; - uint64_t x61; - uint64_t x62; - uint64_t x63; - uint64_t x64; - uint64_t x65; - uint64_t x66; - uint64_t x67; - uint64_t x68; - uint64_t x69; - uint64_t x70; - uint64_t x71; - uint64_t x72; - uint64_t x73; - uint64_t x74; - uint64_t x75; - uint64_t x76; - uint64_t x77; - uint64_t x78; - uint64_t x79; - uint64_t x80; - uint64_t x81; - uint64_t x82; - uint64_t x83; - uint64_t x84; - uint64_t x85; - uint64_t x86; - uint64_t x87; - uint64_t x88; - uint64_t x89; - uint64_t x90; - x1 = ((uint64_t)(arg1[47]) << 56); - x2 = ((uint64_t)(arg1[46]) << 48); - x3 = ((uint64_t)(arg1[45]) << 40); - x4 = ((uint64_t)(arg1[44]) << 32); - x5 = ((uint64_t)(arg1[43]) << 24); - x6 = ((uint64_t)(arg1[42]) << 16); - x7 = ((uint64_t)(arg1[41]) << 8); - x8 = (arg1[40]); - x9 = ((uint64_t)(arg1[39]) << 56); - x10 = ((uint64_t)(arg1[38]) << 48); - x11 = ((uint64_t)(arg1[37]) << 40); - x12 = ((uint64_t)(arg1[36]) << 32); - x13 = ((uint64_t)(arg1[35]) << 24); - x14 = ((uint64_t)(arg1[34]) << 16); - x15 = ((uint64_t)(arg1[33]) << 8); - x16 = (arg1[32]); - x17 = ((uint64_t)(arg1[31]) << 56); - x18 = ((uint64_t)(arg1[30]) << 48); - x19 = ((uint64_t)(arg1[29]) << 40); - x20 = ((uint64_t)(arg1[28]) << 32); - x21 = ((uint64_t)(arg1[27]) << 24); - x22 = ((uint64_t)(arg1[26]) << 16); - x23 = ((uint64_t)(arg1[25]) << 8); - x24 = (arg1[24]); - x25 = ((uint64_t)(arg1[23]) << 56); - x26 = ((uint64_t)(arg1[22]) << 48); - x27 = ((uint64_t)(arg1[21]) << 40); - x28 = ((uint64_t)(arg1[20]) << 32); - x29 = ((uint64_t)(arg1[19]) << 24); - x30 = ((uint64_t)(arg1[18]) << 16); - x31 = ((uint64_t)(arg1[17]) << 8); - x32 = (arg1[16]); - x33 = ((uint64_t)(arg1[15]) << 56); - x34 = ((uint64_t)(arg1[14]) << 48); - x35 = ((uint64_t)(arg1[13]) << 40); - x36 = ((uint64_t)(arg1[12]) << 32); - x37 = ((uint64_t)(arg1[11]) << 24); - x38 = ((uint64_t)(arg1[10]) << 16); - x39 = ((uint64_t)(arg1[9]) << 8); - x40 = (arg1[8]); - x41 = ((uint64_t)(arg1[7]) << 56); - x42 = ((uint64_t)(arg1[6]) << 48); - x43 = ((uint64_t)(arg1[5]) << 40); - x44 = ((uint64_t)(arg1[4]) << 32); - x45 = ((uint64_t)(arg1[3]) << 24); - x46 = ((uint64_t)(arg1[2]) << 16); - x47 = ((uint64_t)(arg1[1]) << 8); - x48 = (arg1[0]); - x49 = (x47 + (uint64_t)x48); - x50 = (x46 + x49); - x51 = (x45 + x50); - x52 = (x44 + x51); - x53 = (x43 + x52); - x54 = (x42 + x53); - x55 = (x41 + x54); - x56 = (x39 + (uint64_t)x40); - x57 = (x38 + x56); - x58 = (x37 + x57); - x59 = (x36 + x58); - x60 = (x35 + x59); - x61 = (x34 + x60); - x62 = (x33 + x61); - x63 = (x31 + (uint64_t)x32); - x64 = (x30 + x63); - x65 = (x29 + x64); - x66 = (x28 + x65); - x67 = (x27 + x66); - x68 = (x26 + x67); - x69 = (x25 + x68); - x70 = (x23 + (uint64_t)x24); - x71 = (x22 + x70); - x72 = (x21 + x71); - x73 = (x20 + x72); - x74 = (x19 + x73); - x75 = (x18 + x74); - x76 = (x17 + x75); - x77 = (x15 + (uint64_t)x16); - x78 = (x14 + x77); - x79 = (x13 + x78); - x80 = (x12 + x79); - x81 = (x11 + x80); - x82 = (x10 + x81); - x83 = (x9 + x82); - x84 = (x7 + (uint64_t)x8); - x85 = (x6 + x84); - x86 = (x5 + x85); - x87 = (x4 + x86); - x88 = (x3 + x87); - x89 = (x2 + x88); - x90 = (x1 + x89); - out1[0] = x55; - out1[1] = x62; - out1[2] = x69; - out1[3] = x76; - out1[4] = x83; - out1[5] = x90; -} - -/* - * The function fiat_p47441_set_one returns the field element one in the Montgomery domain. - * - * Postconditions: - * eval (from_montgomery out1) mod m = 1 mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p47441_set_one(fiat_p47441_montgomery_domain_field_element out1) { - out1[0] = UINT8_C(0x42); - out1[1] = UINT64_C(0x4edfe5fc00000000); - out1[2] = UINT64_C(0xa8fc78e039799d1c); - out1[3] = UINT64_C(0xc57c2146b2f4bcea); - out1[4] = UINT64_C(0xc70b2cda001b34b9); - out1[5] = UINT64_C(0x656677e7d2b408); -} - -void fp_add(uint64_t* out, const uint64_t* a, const uint64_t* b) { - fiat_p47441_add(out, a, b); -} - -void fp_sub(uint64_t* out, const uint64_t* a, const uint64_t* b) { - fiat_p47441_sub(out, a, b); -} - -void fp_sqr(uint64_t* out, const uint64_t* a) { - fiat_p47441_square(out, a); -} - -void fp_mul(uint64_t* out, const uint64_t* a, const uint64_t* b) { - fiat_p47441_mul(out, a, b); -} - -void fp_tomont(uint64_t* out, const uint64_t* a) { - fiat_p47441_to_montgomery(out, a); -} - -void fp_frommont(uint64_t* out, const uint64_t* a) { - fiat_p47441_from_montgomery(out, a); -} - -void fp_mont_setone(uint64_t* out) { - fiat_p47441_set_one(out); -} \ No newline at end of file diff --git a/src/gf/ref/lvl3/fp_p65376_32.c b/src/gf/ref/lvl3/fp_p65376_32.c new file mode 100644 index 0000000..1483461 --- /dev/null +++ b/src/gf/ref/lvl3/fp_p65376_32.c @@ -0,0 +1,1231 @@ +// clang-format off +// Command line : python monty.py 32 +// 0x40ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +#include +#include + +#define sspint int32_t +#define spint uint32_t +#define udpint uint64_t +#define dpint uint64_t + +#define Wordlength 32 +#define Nlimbs 14 +#define Radix 28 +#define Nbits 383 +#define Nbytes 48 + +#define MONTGOMERY +// propagate carries +inline static spint prop(spint *n) { + int i; + spint mask = ((spint)1 << 28u) - (spint)1; + sspint carry = (sspint)n[0]; + carry >>= 28u; + n[0] &= mask; + for (i = 1; i < 13; i++) { + carry += (sspint)n[i]; + n[i] = (spint)carry & mask; + carry >>= 28u; + } + n[13] += (spint)carry; + return -((n[13] >> 1) >> 30u); +} + +// propagate carries and add p if negative, propagate carries again +inline static int flatten(spint *n) { + spint carry = prop(n); + n[0] -= (spint)1u & carry; + n[13] += ((spint)0x41000u) & carry; + (void)prop(n); + return (int)(carry & 1); +} + +// Montgomery final subtract +static int modfsb(spint *n) { + n[0] += (spint)1u; + n[13] -= (spint)0x41000u; + return flatten(n); +} + +// Modular addition - reduce less than 2p +static void modadd(const spint *a, const spint *b, spint *n) { + spint carry; + n[0] = a[0] + b[0]; + n[1] = a[1] + b[1]; + n[2] = a[2] + b[2]; + n[3] = a[3] + b[3]; + n[4] = a[4] + b[4]; + n[5] = a[5] + b[5]; + n[6] = a[6] + b[6]; + n[7] = a[7] + b[7]; + n[8] = a[8] + b[8]; + n[9] = a[9] + b[9]; + n[10] = a[10] + b[10]; + n[11] = a[11] + b[11]; + n[12] = a[12] + b[12]; + n[13] = a[13] + b[13]; + n[0] += (spint)2u; + n[13] -= (spint)0x82000u; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[13] += ((spint)0x82000u) & carry; + (void)prop(n); +} + +// Modular subtraction - reduce less than 2p +static void modsub(const spint *a, const spint *b, spint *n) { + spint carry; + n[0] = a[0] - b[0]; + n[1] = a[1] - b[1]; + n[2] = a[2] - b[2]; + n[3] = a[3] - b[3]; + n[4] = a[4] - b[4]; + n[5] = a[5] - b[5]; + n[6] = a[6] - b[6]; + n[7] = a[7] - b[7]; + n[8] = a[8] - b[8]; + n[9] = a[9] - b[9]; + n[10] = a[10] - b[10]; + n[11] = a[11] - b[11]; + n[12] = a[12] - b[12]; + n[13] = a[13] - b[13]; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[13] += ((spint)0x82000u) & carry; + (void)prop(n); +} + +// Modular negation +static void modneg(const spint *b, spint *n) { + spint carry; + n[0] = (spint)0 - b[0]; + n[1] = (spint)0 - b[1]; + n[2] = (spint)0 - b[2]; + n[3] = (spint)0 - b[3]; + n[4] = (spint)0 - b[4]; + n[5] = (spint)0 - b[5]; + n[6] = (spint)0 - b[6]; + n[7] = (spint)0 - b[7]; + n[8] = (spint)0 - b[8]; + n[9] = (spint)0 - b[9]; + n[10] = (spint)0 - b[10]; + n[11] = (spint)0 - b[11]; + n[12] = (spint)0 - b[12]; + n[13] = (spint)0 - b[13]; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[13] += ((spint)0x82000u) & carry; + (void)prop(n); +} + +// Overflow limit = 18446744073709551616 +// maximum possible = 1008877845989814286 +// Modular multiplication, c=a*b mod 2p +static void modmul(const spint *a, const spint *b, spint *c) { + dpint t = 0; + spint p13 = 0x41000u; + spint q = ((spint)1 << 28u); // q is unsaturated radix + spint mask = (spint)(q - (spint)1); + t += (dpint)a[0] * b[0]; + spint v0 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[0] * b[1]; + t += (dpint)a[1] * b[0]; + spint v1 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[0] * b[2]; + t += (dpint)a[1] * b[1]; + t += (dpint)a[2] * b[0]; + spint v2 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[0] * b[3]; + t += (dpint)a[1] * b[2]; + t += (dpint)a[2] * b[1]; + t += (dpint)a[3] * b[0]; + spint v3 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[0] * b[4]; + t += (dpint)a[1] * b[3]; + t += (dpint)a[2] * b[2]; + t += (dpint)a[3] * b[1]; + t += (dpint)a[4] * b[0]; + spint v4 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[0] * b[5]; + t += (dpint)a[1] * b[4]; + t += (dpint)a[2] * b[3]; + t += (dpint)a[3] * b[2]; + t += (dpint)a[4] * b[1]; + t += (dpint)a[5] * b[0]; + spint v5 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[0] * b[6]; + t += (dpint)a[1] * b[5]; + t += (dpint)a[2] * b[4]; + t += (dpint)a[3] * b[3]; + t += (dpint)a[4] * b[2]; + t += (dpint)a[5] * b[1]; + t += (dpint)a[6] * b[0]; + spint v6 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[0] * b[7]; + t += (dpint)a[1] * b[6]; + t += (dpint)a[2] * b[5]; + t += (dpint)a[3] * b[4]; + t += (dpint)a[4] * b[3]; + t += (dpint)a[5] * b[2]; + t += (dpint)a[6] * b[1]; + t += (dpint)a[7] * b[0]; + spint v7 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[0] * b[8]; + t += (dpint)a[1] * b[7]; + t += (dpint)a[2] * b[6]; + t += (dpint)a[3] * b[5]; + t += (dpint)a[4] * b[4]; + t += (dpint)a[5] * b[3]; + t += (dpint)a[6] * b[2]; + t += (dpint)a[7] * b[1]; + t += (dpint)a[8] * b[0]; + spint v8 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[0] * b[9]; + t += (dpint)a[1] * b[8]; + t += (dpint)a[2] * b[7]; + t += (dpint)a[3] * b[6]; + t += (dpint)a[4] * b[5]; + t += (dpint)a[5] * b[4]; + t += (dpint)a[6] * b[3]; + t += (dpint)a[7] * b[2]; + t += (dpint)a[8] * b[1]; + t += (dpint)a[9] * b[0]; + spint v9 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[0] * b[10]; + t += (dpint)a[1] * b[9]; + t += (dpint)a[2] * b[8]; + t += (dpint)a[3] * b[7]; + t += (dpint)a[4] * b[6]; + t += (dpint)a[5] * b[5]; + t += (dpint)a[6] * b[4]; + t += (dpint)a[7] * b[3]; + t += (dpint)a[8] * b[2]; + t += (dpint)a[9] * b[1]; + t += (dpint)a[10] * b[0]; + spint v10 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[0] * b[11]; + t += (dpint)a[1] * b[10]; + t += (dpint)a[2] * b[9]; + t += (dpint)a[3] * b[8]; + t += (dpint)a[4] * b[7]; + t += (dpint)a[5] * b[6]; + t += (dpint)a[6] * b[5]; + t += (dpint)a[7] * b[4]; + t += (dpint)a[8] * b[3]; + t += (dpint)a[9] * b[2]; + t += (dpint)a[10] * b[1]; + t += (dpint)a[11] * b[0]; + spint v11 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[0] * b[12]; + t += (dpint)a[1] * b[11]; + t += (dpint)a[2] * b[10]; + t += (dpint)a[3] * b[9]; + t += (dpint)a[4] * b[8]; + t += (dpint)a[5] * b[7]; + t += (dpint)a[6] * b[6]; + t += (dpint)a[7] * b[5]; + t += (dpint)a[8] * b[4]; + t += (dpint)a[9] * b[3]; + t += (dpint)a[10] * b[2]; + t += (dpint)a[11] * b[1]; + t += (dpint)a[12] * b[0]; + spint v12 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[0] * b[13]; + t += (dpint)a[1] * b[12]; + t += (dpint)a[2] * b[11]; + t += (dpint)a[3] * b[10]; + t += (dpint)a[4] * b[9]; + t += (dpint)a[5] * b[8]; + t += (dpint)a[6] * b[7]; + t += (dpint)a[7] * b[6]; + t += (dpint)a[8] * b[5]; + t += (dpint)a[9] * b[4]; + t += (dpint)a[10] * b[3]; + t += (dpint)a[11] * b[2]; + t += (dpint)a[12] * b[1]; + t += (dpint)a[13] * b[0]; + t += (dpint)v0 * (dpint)p13; + spint v13 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[1] * b[13]; + t += (dpint)a[2] * b[12]; + t += (dpint)a[3] * b[11]; + t += (dpint)a[4] * b[10]; + t += (dpint)a[5] * b[9]; + t += (dpint)a[6] * b[8]; + t += (dpint)a[7] * b[7]; + t += (dpint)a[8] * b[6]; + t += (dpint)a[9] * b[5]; + t += (dpint)a[10] * b[4]; + t += (dpint)a[11] * b[3]; + t += (dpint)a[12] * b[2]; + t += (dpint)a[13] * b[1]; + t += (dpint)v1 * (dpint)p13; + c[0] = ((spint)t & mask); + t >>= 28; + t += (dpint)a[2] * b[13]; + t += (dpint)a[3] * b[12]; + t += (dpint)a[4] * b[11]; + t += (dpint)a[5] * b[10]; + t += (dpint)a[6] * b[9]; + t += (dpint)a[7] * b[8]; + t += (dpint)a[8] * b[7]; + t += (dpint)a[9] * b[6]; + t += (dpint)a[10] * b[5]; + t += (dpint)a[11] * b[4]; + t += (dpint)a[12] * b[3]; + t += (dpint)a[13] * b[2]; + t += (dpint)v2 * (dpint)p13; + c[1] = ((spint)t & mask); + t >>= 28; + t += (dpint)a[3] * b[13]; + t += (dpint)a[4] * b[12]; + t += (dpint)a[5] * b[11]; + t += (dpint)a[6] * b[10]; + t += (dpint)a[7] * b[9]; + t += (dpint)a[8] * b[8]; + t += (dpint)a[9] * b[7]; + t += (dpint)a[10] * b[6]; + t += (dpint)a[11] * b[5]; + t += (dpint)a[12] * b[4]; + t += (dpint)a[13] * b[3]; + t += (dpint)v3 * (dpint)p13; + c[2] = ((spint)t & mask); + t >>= 28; + t += (dpint)a[4] * b[13]; + t += (dpint)a[5] * b[12]; + t += (dpint)a[6] * b[11]; + t += (dpint)a[7] * b[10]; + t += (dpint)a[8] * b[9]; + t += (dpint)a[9] * b[8]; + t += (dpint)a[10] * b[7]; + t += (dpint)a[11] * b[6]; + t += (dpint)a[12] * b[5]; + t += (dpint)a[13] * b[4]; + t += (dpint)v4 * (dpint)p13; + c[3] = ((spint)t & mask); + t >>= 28; + t += (dpint)a[5] * b[13]; + t += (dpint)a[6] * b[12]; + t += (dpint)a[7] * b[11]; + t += (dpint)a[8] * b[10]; + t += (dpint)a[9] * b[9]; + t += (dpint)a[10] * b[8]; + t += (dpint)a[11] * b[7]; + t += (dpint)a[12] * b[6]; + t += (dpint)a[13] * b[5]; + t += (dpint)v5 * (dpint)p13; + c[4] = ((spint)t & mask); + t >>= 28; + t += (dpint)a[6] * b[13]; + t += (dpint)a[7] * b[12]; + t += (dpint)a[8] * b[11]; + t += (dpint)a[9] * b[10]; + t += (dpint)a[10] * b[9]; + t += (dpint)a[11] * b[8]; + t += (dpint)a[12] * b[7]; + t += (dpint)a[13] * b[6]; + t += (dpint)v6 * (dpint)p13; + c[5] = ((spint)t & mask); + t >>= 28; + t += (dpint)a[7] * b[13]; + t += (dpint)a[8] * b[12]; + t += (dpint)a[9] * b[11]; + t += (dpint)a[10] * b[10]; + t += (dpint)a[11] * b[9]; + t += (dpint)a[12] * b[8]; + t += (dpint)a[13] * b[7]; + t += (dpint)v7 * (dpint)p13; + c[6] = ((spint)t & mask); + t >>= 28; + t += (dpint)a[8] * b[13]; + t += (dpint)a[9] * b[12]; + t += (dpint)a[10] * b[11]; + t += (dpint)a[11] * b[10]; + t += (dpint)a[12] * b[9]; + t += (dpint)a[13] * b[8]; + t += (dpint)v8 * (dpint)p13; + c[7] = ((spint)t & mask); + t >>= 28; + t += (dpint)a[9] * b[13]; + t += (dpint)a[10] * b[12]; + t += (dpint)a[11] * b[11]; + t += (dpint)a[12] * b[10]; + t += (dpint)a[13] * b[9]; + t += (dpint)v9 * (dpint)p13; + c[8] = ((spint)t & mask); + t >>= 28; + t += (dpint)a[10] * b[13]; + t += (dpint)a[11] * b[12]; + t += (dpint)a[12] * b[11]; + t += (dpint)a[13] * b[10]; + t += (dpint)v10 * (dpint)p13; + c[9] = ((spint)t & mask); + t >>= 28; + t += (dpint)a[11] * b[13]; + t += (dpint)a[12] * b[12]; + t += (dpint)a[13] * b[11]; + t += (dpint)v11 * (dpint)p13; + c[10] = ((spint)t & mask); + t >>= 28; + t += (dpint)a[12] * b[13]; + t += (dpint)a[13] * b[12]; + t += (dpint)v12 * (dpint)p13; + c[11] = ((spint)t & mask); + t >>= 28; + t += (dpint)a[13] * b[13]; + t += (dpint)v13 * (dpint)p13; + c[12] = ((spint)t & mask); + t >>= 28; + c[13] = (spint)t; +} + +// Modular squaring, c=a*a mod 2p +static void modsqr(const spint *a, spint *c) { + udpint tot; + udpint t = 0; + spint p13 = 0x41000u; + spint q = ((spint)1 << 28u); // q is unsaturated radix + spint mask = (spint)(q - (spint)1); + tot = (udpint)a[0] * a[0]; + t = tot; + spint v0 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[0] * a[1]; + tot *= 2; + t += tot; + spint v1 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[0] * a[2]; + tot *= 2; + tot += (udpint)a[1] * a[1]; + t += tot; + spint v2 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[0] * a[3]; + tot += (udpint)a[1] * a[2]; + tot *= 2; + t += tot; + spint v3 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[0] * a[4]; + tot += (udpint)a[1] * a[3]; + tot *= 2; + tot += (udpint)a[2] * a[2]; + t += tot; + spint v4 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[0] * a[5]; + tot += (udpint)a[1] * a[4]; + tot += (udpint)a[2] * a[3]; + tot *= 2; + t += tot; + spint v5 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[0] * a[6]; + tot += (udpint)a[1] * a[5]; + tot += (udpint)a[2] * a[4]; + tot *= 2; + tot += (udpint)a[3] * a[3]; + t += tot; + spint v6 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[0] * a[7]; + tot += (udpint)a[1] * a[6]; + tot += (udpint)a[2] * a[5]; + tot += (udpint)a[3] * a[4]; + tot *= 2; + t += tot; + spint v7 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[0] * a[8]; + tot += (udpint)a[1] * a[7]; + tot += (udpint)a[2] * a[6]; + tot += (udpint)a[3] * a[5]; + tot *= 2; + tot += (udpint)a[4] * a[4]; + t += tot; + spint v8 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[0] * a[9]; + tot += (udpint)a[1] * a[8]; + tot += (udpint)a[2] * a[7]; + tot += (udpint)a[3] * a[6]; + tot += (udpint)a[4] * a[5]; + tot *= 2; + t += tot; + spint v9 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[0] * a[10]; + tot += (udpint)a[1] * a[9]; + tot += (udpint)a[2] * a[8]; + tot += (udpint)a[3] * a[7]; + tot += (udpint)a[4] * a[6]; + tot *= 2; + tot += (udpint)a[5] * a[5]; + t += tot; + spint v10 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[0] * a[11]; + tot += (udpint)a[1] * a[10]; + tot += (udpint)a[2] * a[9]; + tot += (udpint)a[3] * a[8]; + tot += (udpint)a[4] * a[7]; + tot += (udpint)a[5] * a[6]; + tot *= 2; + t += tot; + spint v11 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[0] * a[12]; + tot += (udpint)a[1] * a[11]; + tot += (udpint)a[2] * a[10]; + tot += (udpint)a[3] * a[9]; + tot += (udpint)a[4] * a[8]; + tot += (udpint)a[5] * a[7]; + tot *= 2; + tot += (udpint)a[6] * a[6]; + t += tot; + spint v12 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[0] * a[13]; + tot += (udpint)a[1] * a[12]; + tot += (udpint)a[2] * a[11]; + tot += (udpint)a[3] * a[10]; + tot += (udpint)a[4] * a[9]; + tot += (udpint)a[5] * a[8]; + tot += (udpint)a[6] * a[7]; + tot *= 2; + t += tot; + t += (udpint)v0 * p13; + spint v13 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[1] * a[13]; + tot += (udpint)a[2] * a[12]; + tot += (udpint)a[3] * a[11]; + tot += (udpint)a[4] * a[10]; + tot += (udpint)a[5] * a[9]; + tot += (udpint)a[6] * a[8]; + tot *= 2; + tot += (udpint)a[7] * a[7]; + t += tot; + t += (udpint)v1 * p13; + c[0] = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[2] * a[13]; + tot += (udpint)a[3] * a[12]; + tot += (udpint)a[4] * a[11]; + tot += (udpint)a[5] * a[10]; + tot += (udpint)a[6] * a[9]; + tot += (udpint)a[7] * a[8]; + tot *= 2; + t += tot; + t += (udpint)v2 * p13; + c[1] = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[3] * a[13]; + tot += (udpint)a[4] * a[12]; + tot += (udpint)a[5] * a[11]; + tot += (udpint)a[6] * a[10]; + tot += (udpint)a[7] * a[9]; + tot *= 2; + tot += (udpint)a[8] * a[8]; + t += tot; + t += (udpint)v3 * p13; + c[2] = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[4] * a[13]; + tot += (udpint)a[5] * a[12]; + tot += (udpint)a[6] * a[11]; + tot += (udpint)a[7] * a[10]; + tot += (udpint)a[8] * a[9]; + tot *= 2; + t += tot; + t += (udpint)v4 * p13; + c[3] = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[5] * a[13]; + tot += (udpint)a[6] * a[12]; + tot += (udpint)a[7] * a[11]; + tot += (udpint)a[8] * a[10]; + tot *= 2; + tot += (udpint)a[9] * a[9]; + t += tot; + t += (udpint)v5 * p13; + c[4] = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[6] * a[13]; + tot += (udpint)a[7] * a[12]; + tot += (udpint)a[8] * a[11]; + tot += (udpint)a[9] * a[10]; + tot *= 2; + t += tot; + t += (udpint)v6 * p13; + c[5] = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[7] * a[13]; + tot += (udpint)a[8] * a[12]; + tot += (udpint)a[9] * a[11]; + tot *= 2; + tot += (udpint)a[10] * a[10]; + t += tot; + t += (udpint)v7 * p13; + c[6] = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[8] * a[13]; + tot += (udpint)a[9] * a[12]; + tot += (udpint)a[10] * a[11]; + tot *= 2; + t += tot; + t += (udpint)v8 * p13; + c[7] = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[9] * a[13]; + tot += (udpint)a[10] * a[12]; + tot *= 2; + tot += (udpint)a[11] * a[11]; + t += tot; + t += (udpint)v9 * p13; + c[8] = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[10] * a[13]; + tot += (udpint)a[11] * a[12]; + tot *= 2; + t += tot; + t += (udpint)v10 * p13; + c[9] = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[11] * a[13]; + tot *= 2; + tot += (udpint)a[12] * a[12]; + t += tot; + t += (udpint)v11 * p13; + c[10] = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[12] * a[13]; + tot *= 2; + t += tot; + t += (udpint)v12 * p13; + c[11] = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[13] * a[13]; + t += tot; + t += (udpint)v13 * p13; + c[12] = ((spint)t & mask); + t >>= 28; + c[13] = (spint)t; +} + +// copy +static void modcpy(const spint *a, spint *c) { + int i; + for (i = 0; i < 14; i++) { + c[i] = a[i]; + } +} + +// square n times +static void modnsqr(spint *a, int n) { + int i; + for (i = 0; i < n; i++) { + modsqr(a, a); + } +} + +// Calculate progenitor +static void modpro(const spint *w, spint *z) { + spint x[14]; + spint t0[14]; + spint t1[14]; + spint t2[14]; + spint t3[14]; + spint t4[14]; + spint t5[14]; + modcpy(w, x); + modsqr(x, z); + modsqr(z, t0); + modmul(x, t0, t1); + modmul(z, t1, z); + modsqr(z, t0); + modsqr(t0, t3); + modsqr(t3, t4); + modsqr(t4, t2); + modcpy(t2, t5); + modnsqr(t5, 3); + modmul(t2, t5, t2); + modcpy(t2, t5); + modnsqr(t5, 6); + modmul(t2, t5, t2); + modcpy(t2, t5); + modnsqr(t5, 2); + modmul(t4, t5, t5); + modnsqr(t5, 13); + modmul(t2, t5, t2); + modcpy(t2, t5); + modnsqr(t5, 2); + modmul(t4, t5, t4); + modnsqr(t4, 28); + modmul(t2, t4, t2); + modsqr(t2, t4); + modmul(t3, t4, t3); + modnsqr(t3, 59); + modmul(t2, t3, t2); + modmul(t1, t2, t1); + modmul(z, t1, z); + modmul(t0, z, t0); + modmul(t1, t0, t1); + modsqr(t1, t2); + modmul(t1, t2, t2); + modsqr(t2, t2); + modmul(t1, t2, t2); + modmul(t0, t2, t0); + modmul(z, t0, z); + modsqr(z, t2); + modmul(z, t2, t2); + modmul(t0, t2, t0); + modmul(t1, t0, t1); + modcpy(t1, t2); + modnsqr(t2, 128); + modmul(t1, t2, t1); + modmul(t0, t1, t0); + modnsqr(t0, 125); + modmul(z, t0, z); +} + +// calculate inverse, provide progenitor h if available +static void modinv(const spint *x, const spint *h, spint *z) { + spint s[14]; + spint t[14]; + if (h == NULL) { + modpro(x, t); + } else { + modcpy(h, t); + } + modcpy(x, s); + modnsqr(t, 2); + modmul(s, t, z); +} + +// Convert m to n-residue form, n=nres(m) +static void nres(const spint *m, spint *n) { + const spint c[14] = {0xf13732fu, 0x3f03f03u, 0x3f03f0u, 0xf03f03fu, + 0x3f03f03u, 0x3f03f0u, 0xf03f03fu, 0x3f03f03u, + 0x3f03f0u, 0xf03f03fu, 0x3f03f03u, 0x3f03f0u, + 0xf03f03fu, 0x14f03u}; + modmul(m, c, n); +} + +// Convert n back to normal form, m=redc(n) +static void redc(const spint *n, spint *m) { + int i; + spint c[14]; + c[0] = 1; + for (i = 1; i < 14; i++) { + c[i] = 0; + } + modmul(n, c, m); + (void)modfsb(m); +} + +// is unity? +static int modis1(const spint *a) { + int i; + spint c[14]; + spint c0; + spint d = 0; + redc(a, c); + for (i = 1; i < 14; i++) { + d |= c[i]; + } + c0 = (spint)c[0]; + return ((spint)1 & ((d - (spint)1) >> 28u) & + (((c0 ^ (spint)1) - (spint)1) >> 28u)); +} + +// is zero? +static int modis0(const spint *a) { + int i; + spint c[14]; + spint d = 0; + redc(a, c); + for (i = 0; i < 14; i++) { + d |= c[i]; + } + return ((spint)1 & ((d - (spint)1) >> 28u)); +} + +// set to zero +static void modzer(spint *a) { + int i; + for (i = 0; i < 14; i++) { + a[i] = 0; + } +} + +// set to one +static void modone(spint *a) { + int i; + a[0] = 1; + for (i = 1; i < 14; i++) { + a[i] = 0; + } + nres(a, a); +} + +// set to integer +static void modint(int x, spint *a) { + int i; + a[0] = (spint)x; + for (i = 1; i < 14; i++) { + a[i] = 0; + } + nres(a, a); +} + +// Modular multiplication by an integer, c=a*b mod 2p +static void modmli(const spint *a, int b, spint *c) { + spint t[14]; + modint(b, t); + modmul(a, t, c); +} + +// Test for quadratic residue +static int modqr(const spint *h, const spint *x) { + spint r[14]; + if (h == NULL) { + modpro(x, r); + modsqr(r, r); + } else { + modsqr(h, r); + } + modmul(r, x, r); + return modis1(r) | modis0(x); +} + +// conditional move g to f if d=1 +// strongly recommend inlining be disabled using compiler specific syntax +static void modcmv(int b, const spint *g, volatile spint *f) { + int i; + spint c0, c1, s, t; + spint r = 0x5aa5a55au; + c0 = (1 - b) + r; + c1 = b + r; + for (i = 0; i < 14; i++) { + s = g[i]; + t = f[i]; + f[i] = c0 * t + c1 * s; + f[i] -= r * (t + s); + } +} + +// conditional swap g and f if d=1 +// strongly recommend inlining be disabled using compiler specific syntax +static void modcsw(int b, volatile spint *g, volatile spint *f) { + int i; + spint c0, c1, s, t, w; + spint r = 0x5aa5a55au; + c0 = (1 - b) + r; + c1 = b + r; + for (i = 0; i < 14; i++) { + s = g[i]; + t = f[i]; + w = r * (t + s); + f[i] = c0 * t + c1 * s; + f[i] -= w; + g[i] = c0 * s + c1 * t; + g[i] -= w; + } +} + +// Modular square root, provide progenitor h if available, NULL if not +static void modsqrt(const spint *x, const spint *h, spint *r) { + spint s[14]; + spint y[14]; + if (h == NULL) { + modpro(x, y); + } else { + modcpy(h, y); + } + modmul(y, x, s); + modcpy(s, r); +} + +// shift left by less than a word +static void modshl(unsigned int n, spint *a) { + int i; + a[13] = ((a[13] << n)) | (a[12] >> (28u - n)); + for (i = 12; i > 0; i--) { + a[i] = ((a[i] << n) & (spint)0xfffffff) | (a[i - 1] >> (28u - n)); + } + a[0] = (a[0] << n) & (spint)0xfffffff; +} + +// shift right by less than a word. Return shifted out part +static int modshr(unsigned int n, spint *a) { + int i; + spint r = a[0] & (((spint)1 << n) - (spint)1); + for (i = 0; i < 13; i++) { + a[i] = (a[i] >> n) | ((a[i + 1] << (28u - n)) & (spint)0xfffffff); + } + a[13] = a[13] >> n; + return r; +} + +// set a= 2^r +static void mod2r(unsigned int r, spint *a) { + unsigned int n = r / 28u; + unsigned int m = r % 28u; + modzer(a); + if (r >= 48 * 8) + return; + a[n] = 1; + a[n] <<= m; + nres(a, a); +} + +// export to byte array +static void modexp(const spint *a, char *b) { + int i; + spint c[14]; + redc(a, c); + for (i = 47; i >= 0; i--) { + b[i] = c[0] & (spint)0xff; + (void)modshr(8, c); + } +} + +// import from byte array +// returns 1 if in range, else 0 +static int modimp(const char *b, spint *a) { + int i, res; + for (i = 0; i < 14; i++) { + a[i] = 0; + } + for (i = 0; i < 48; i++) { + modshl(8, a); + a[0] += (spint)(unsigned char)b[i]; + } + res = modfsb(a); + nres(a, a); + return res; +} + +// determine sign +static int modsign(const spint *a) { + spint c[14]; + redc(a, c); + return c[0] % 2; +} + +// return true if equal +static int modcmp(const spint *a, const spint *b) { + spint c[14], d[14]; + int i, eq = 1; + redc(a, c); + redc(b, d); + for (i = 0; i < 14; i++) { + eq &= (((c[i] ^ d[i]) - 1) >> 28) & 1; + } + return eq; +} + +// clang-format on +/****************************************************************************** + API functions calling generated code above + ******************************************************************************/ + +#include + +const digit_t ZERO[NWORDS_FIELD] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; +const digit_t ONE[NWORDS_FIELD] = { + 0x000003f0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000 +}; +// Montgomery representation of 2^-1 +static const digit_t TWO_INV[NWORDS_FIELD] = { 0x000001f8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00008000 }; +// Montgomery representation of 3^-1 +static const digit_t THREE_INV[NWORDS_FIELD] = { 0x0aaaabfa, 0x0aaaaaaa, 0x0aaaaaaa, 0x0aaaaaaa, 0x0aaaaaaa, + 0x0aaaaaaa, 0x0aaaaaaa, 0x0aaaaaaa, 0x0aaaaaaa, 0x0aaaaaaa, + 0x0aaaaaaa, 0x0aaaaaaa, 0x0aaaaaaa, 0x00030aaa }; +// Montgomery representation of 2^384 +static const digit_t R2[NWORDS_FIELD] = { 0x003f1373, 0x0f03f03f, 0x03f03f03, 0x003f03f0, 0x0f03f03f, + 0x03f03f03, 0x003f03f0, 0x0f03f03f, 0x03f03f03, 0x003f03f0, + 0x0f03f03f, 0x03f03f03, 0x003f03f0, 0x0000c03f }; + +void +fp_set_small(fp_t *x, const digit_t val) +{ + modint((int)val, *x); +} + +void +fp_mul_small(fp_t *x, const fp_t *a, const uint32_t val) +{ + modmli(*a, (int)val, *x); +} + +void +fp_set_zero(fp_t *x) +{ + modzer(*x); +} + +void +fp_set_one(fp_t *x) +{ + modone(*x); +} + +uint32_t +fp_is_equal(const fp_t *a, const fp_t *b) +{ + return -(uint32_t)modcmp(*a, *b); +} + +uint32_t +fp_is_zero(const fp_t *a) +{ + return -(uint32_t)modis0(*a); +} + +void +fp_copy(fp_t *out, const fp_t *a) +{ + modcpy(*a, *out); +} + +void +fp_cswap(fp_t *a, fp_t *b, uint32_t ctl) +{ + modcsw((int)(ctl & 0x1), *a, *b); +} + +void +fp_add(fp_t *out, const fp_t *a, const fp_t *b) +{ + modadd(*a, *b, *out); +} + +void +fp_sub(fp_t *out, const fp_t *a, const fp_t *b) +{ + modsub(*a, *b, *out); +} + +void +fp_neg(fp_t *out, const fp_t *a) +{ + modneg(*a, *out); +} + +void +fp_sqr(fp_t *out, const fp_t *a) +{ + modsqr(*a, *out); +} + +void +fp_mul(fp_t *out, const fp_t *a, const fp_t *b) +{ + modmul(*a, *b, *out); +} + +void +fp_inv(fp_t *x) +{ + modinv(*x, NULL, *x); +} + +uint32_t +fp_is_square(const fp_t *a) +{ + return -(uint32_t)modqr(NULL, *a); +} + +void +fp_sqrt(fp_t *a) +{ + modsqrt(*a, NULL, *a); +} + +void +fp_half(fp_t *out, const fp_t *a) +{ + modmul(TWO_INV, *a, *out); +} + +void +fp_exp3div4(fp_t *out, const fp_t *a) +{ + modpro(*a, *out); +} + +void +fp_div3(fp_t *out, const fp_t *a) +{ + modmul(THREE_INV, *a, *out); +} + +void +fp_encode(void *dst, const fp_t *a) +{ + // Modified version of modexp() + int i; + spint c[14]; + redc(*a, c); + for (i = 0; i < 48; i++) { + ((char *)dst)[i] = c[0] & (spint)0xff; + (void)modshr(8, c); + } +} + +uint32_t +fp_decode(fp_t *d, const void *src) +{ + // Modified version of modimp() + int i; + spint res; + const unsigned char *b = src; + for (i = 0; i < 14; i++) { + (*d)[i] = 0; + } + for (i = 47; i >= 0; i--) { + modshl(8, *d); + (*d)[0] += (spint)b[i]; + } + res = (spint)-modfsb(*d); + nres(*d, *d); + // If the value was canonical then res = -1; otherwise, res = 0 + for (i = 0; i < 14; i++) { + (*d)[i] &= res; + } + return (uint32_t)res; +} + +static inline unsigned char +add_carry(unsigned char cc, spint a, spint b, spint *d) +{ + udpint t = (udpint)a + (udpint)b + cc; + *d = (spint)t; + return (unsigned char)(t >> Wordlength); +} + +static void +partial_reduce(spint *out, const spint *src) +{ + spint h, l, quo, rem; + unsigned char cc; + + // Split value in high (8 bits) and low (376 bits) parts. + h = src[11] >> 24; + l = src[11] & 0x00FFFFFF; + + // 65*2^376 = 1 mod q; hence, we add floor(h/65) + (h mod 65)*2^376 + // to the low part. + quo = (h * 0xFC1) >> 18; + rem = h - (65 * quo); + cc = add_carry(0, src[0], quo, &out[0]); + cc = add_carry(cc, src[1], 0, &out[1]); + cc = add_carry(cc, src[2], 0, &out[2]); + cc = add_carry(cc, src[3], 0, &out[3]); + cc = add_carry(cc, src[4], 0, &out[4]); + cc = add_carry(cc, src[5], 0, &out[5]); + cc = add_carry(cc, src[6], 0, &out[6]); + cc = add_carry(cc, src[7], 0, &out[7]); + cc = add_carry(cc, src[8], 0, &out[8]); + cc = add_carry(cc, src[9], 0, &out[9]); + cc = add_carry(cc, src[10], 0, &out[10]); + (void)add_carry(cc, l, rem << 24, &out[11]); +} + +// Little-endian encoding of a 32-bit integer. +static inline void +enc32le(void *dst, uint32_t x) +{ + uint8_t *buf = dst; + buf[0] = (uint8_t)x; + buf[1] = (uint8_t)(x >> 8); + buf[2] = (uint8_t)(x >> 16); + buf[3] = (uint8_t)(x >> 24); +} + +// Little-endian decoding of a 32-bit integer. +static inline uint32_t +dec32le(const void *src) +{ + const uint8_t *buf = src; + return (spint)buf[0] | ((spint)buf[1] << 8) | ((spint)buf[2] << 16) | ((spint)buf[3] << 24); +} + +void +fp_decode_reduce(fp_t *d, const void *src, size_t len) +{ + uint32_t t[12]; // Stores Nbytes * 8 bits + uint8_t tmp[48]; // Nbytes + const uint8_t *b = src; + + fp_set_zero(d); + if (len == 0) { + return; + } + + size_t rem = len % 48; + if (rem != 0) { + // Input size is not a multiple of 48, we decode a partial + // block, which is already less than 2^376. + size_t k = len - rem; + memcpy(tmp, b + k, len - k); + memset(tmp + len - k, 0, (sizeof tmp) - (len - k)); + fp_decode(d, tmp); + len = k; + } + // Process all remaining blocks, in descending address order. + while (len > 0) { + fp_mul(d, d, &R2); + len -= 48; + t[0] = dec32le(b + len); + t[1] = dec32le(b + len + 4); + t[2] = dec32le(b + len + 8); + t[3] = dec32le(b + len + 12); + t[4] = dec32le(b + len + 16); + t[5] = dec32le(b + len + 20); + t[6] = dec32le(b + len + 24); + t[7] = dec32le(b + len + 28); + t[8] = dec32le(b + len + 32); + t[9] = dec32le(b + len + 36); + t[10] = dec32le(b + len + 40); + t[11] = dec32le(b + len + 44); + partial_reduce(t, t); + enc32le(tmp, t[0]); + enc32le(tmp + 4, t[1]); + enc32le(tmp + 8, t[2]); + enc32le(tmp + 12, t[3]); + enc32le(tmp + 16, t[4]); + enc32le(tmp + 20, t[5]); + enc32le(tmp + 24, t[6]); + enc32le(tmp + 28, t[7]); + enc32le(tmp + 32, t[8]); + enc32le(tmp + 36, t[9]); + enc32le(tmp + 40, t[10]); + enc32le(tmp + 44, t[11]); + fp_t a; + fp_decode(&a, tmp); + fp_add(d, d, &a); + } +} diff --git a/src/gf/ref/lvl3/fp_p65376_64.c b/src/gf/ref/lvl3/fp_p65376_64.c new file mode 100644 index 0000000..539cde5 --- /dev/null +++ b/src/gf/ref/lvl3/fp_p65376_64.c @@ -0,0 +1,872 @@ +// clang-format off +// Command line : python monty.py 64 +// 0x40ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +#include +#include + +#define sspint int64_t +#define spint uint64_t +#define udpint __uint128_t +#define dpint __uint128_t + +#define Wordlength 64 +#define Nlimbs 7 +#define Radix 55 +#define Nbits 383 +#define Nbytes 48 + +#define MONTGOMERY +// propagate carries +inline static spint prop(spint *n) { + int i; + spint mask = ((spint)1 << 55u) - (spint)1; + sspint carry = (sspint)n[0]; + carry >>= 55u; + n[0] &= mask; + for (i = 1; i < 6; i++) { + carry += (sspint)n[i]; + n[i] = (spint)carry & mask; + carry >>= 55u; + } + n[6] += (spint)carry; + return -((n[6] >> 1) >> 62u); +} + +// propagate carries and add p if negative, propagate carries again +inline static int flatten(spint *n) { + spint carry = prop(n); + n[0] -= (spint)1u & carry; + n[6] += ((spint)0x10400000000000u) & carry; + (void)prop(n); + return (int)(carry & 1); +} + +// Montgomery final subtract +inline static int modfsb(spint *n) { + n[0] += (spint)1u; + n[6] -= (spint)0x10400000000000u; + return flatten(n); +} + +// Modular addition - reduce less than 2p +inline static void modadd(const spint *a, const spint *b, spint *n) { + spint carry; + n[0] = a[0] + b[0]; + n[1] = a[1] + b[1]; + n[2] = a[2] + b[2]; + n[3] = a[3] + b[3]; + n[4] = a[4] + b[4]; + n[5] = a[5] + b[5]; + n[6] = a[6] + b[6]; + n[0] += (spint)2u; + n[6] -= (spint)0x20800000000000u; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[6] += ((spint)0x20800000000000u) & carry; + (void)prop(n); +} + +// Modular subtraction - reduce less than 2p +inline static void modsub(const spint *a, const spint *b, spint *n) { + spint carry; + n[0] = a[0] - b[0]; + n[1] = a[1] - b[1]; + n[2] = a[2] - b[2]; + n[3] = a[3] - b[3]; + n[4] = a[4] - b[4]; + n[5] = a[5] - b[5]; + n[6] = a[6] - b[6]; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[6] += ((spint)0x20800000000000u) & carry; + (void)prop(n); +} + +// Modular negation +inline static void modneg(const spint *b, spint *n) { + spint carry; + n[0] = (spint)0 - b[0]; + n[1] = (spint)0 - b[1]; + n[2] = (spint)0 - b[2]; + n[3] = (spint)0 - b[3]; + n[4] = (spint)0 - b[4]; + n[5] = (spint)0 - b[5]; + n[6] = (spint)0 - b[6]; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[6] += ((spint)0x20800000000000u) & carry; + (void)prop(n); +} + +// Overflow limit = 340282366920938463463374607431768211456 +// maximum possible = 9251314080475062396111552646217735 +// Modular multiplication, c=a*b mod 2p +inline static void modmul(const spint *a, const spint *b, spint *c) { + dpint t = 0; + spint p6 = 0x10400000000000u; + spint q = ((spint)1 << 55u); // q is unsaturated radix + spint mask = (spint)(q - (spint)1); + t += (dpint)a[0] * b[0]; + spint v0 = ((spint)t & mask); + t >>= 55; + t += (dpint)a[0] * b[1]; + t += (dpint)a[1] * b[0]; + spint v1 = ((spint)t & mask); + t >>= 55; + t += (dpint)a[0] * b[2]; + t += (dpint)a[1] * b[1]; + t += (dpint)a[2] * b[0]; + spint v2 = ((spint)t & mask); + t >>= 55; + t += (dpint)a[0] * b[3]; + t += (dpint)a[1] * b[2]; + t += (dpint)a[2] * b[1]; + t += (dpint)a[3] * b[0]; + spint v3 = ((spint)t & mask); + t >>= 55; + t += (dpint)a[0] * b[4]; + t += (dpint)a[1] * b[3]; + t += (dpint)a[2] * b[2]; + t += (dpint)a[3] * b[1]; + t += (dpint)a[4] * b[0]; + spint v4 = ((spint)t & mask); + t >>= 55; + t += (dpint)a[0] * b[5]; + t += (dpint)a[1] * b[4]; + t += (dpint)a[2] * b[3]; + t += (dpint)a[3] * b[2]; + t += (dpint)a[4] * b[1]; + t += (dpint)a[5] * b[0]; + spint v5 = ((spint)t & mask); + t >>= 55; + t += (dpint)a[0] * b[6]; + t += (dpint)a[1] * b[5]; + t += (dpint)a[2] * b[4]; + t += (dpint)a[3] * b[3]; + t += (dpint)a[4] * b[2]; + t += (dpint)a[5] * b[1]; + t += (dpint)a[6] * b[0]; + t += (dpint)v0 * (dpint)p6; + spint v6 = ((spint)t & mask); + t >>= 55; + t += (dpint)a[1] * b[6]; + t += (dpint)a[2] * b[5]; + t += (dpint)a[3] * b[4]; + t += (dpint)a[4] * b[3]; + t += (dpint)a[5] * b[2]; + t += (dpint)a[6] * b[1]; + t += (dpint)v1 * (dpint)p6; + c[0] = ((spint)t & mask); + t >>= 55; + t += (dpint)a[2] * b[6]; + t += (dpint)a[3] * b[5]; + t += (dpint)a[4] * b[4]; + t += (dpint)a[5] * b[3]; + t += (dpint)a[6] * b[2]; + t += (dpint)v2 * (dpint)p6; + c[1] = ((spint)t & mask); + t >>= 55; + t += (dpint)a[3] * b[6]; + t += (dpint)a[4] * b[5]; + t += (dpint)a[5] * b[4]; + t += (dpint)a[6] * b[3]; + t += (dpint)v3 * (dpint)p6; + c[2] = ((spint)t & mask); + t >>= 55; + t += (dpint)a[4] * b[6]; + t += (dpint)a[5] * b[5]; + t += (dpint)a[6] * b[4]; + t += (dpint)v4 * (dpint)p6; + c[3] = ((spint)t & mask); + t >>= 55; + t += (dpint)a[5] * b[6]; + t += (dpint)a[6] * b[5]; + t += (dpint)v5 * (dpint)p6; + c[4] = ((spint)t & mask); + t >>= 55; + t += (dpint)a[6] * b[6]; + t += (dpint)v6 * (dpint)p6; + c[5] = ((spint)t & mask); + t >>= 55; + c[6] = (spint)t; +} + +// Modular squaring, c=a*a mod 2p +inline static void modsqr(const spint *a, spint *c) { + udpint tot; + udpint t = 0; + spint p6 = 0x10400000000000u; + spint q = ((spint)1 << 55u); // q is unsaturated radix + spint mask = (spint)(q - (spint)1); + tot = (udpint)a[0] * a[0]; + t = tot; + spint v0 = ((spint)t & mask); + t >>= 55; + tot = (udpint)a[0] * a[1]; + tot *= 2; + t += tot; + spint v1 = ((spint)t & mask); + t >>= 55; + tot = (udpint)a[0] * a[2]; + tot *= 2; + tot += (udpint)a[1] * a[1]; + t += tot; + spint v2 = ((spint)t & mask); + t >>= 55; + tot = (udpint)a[0] * a[3]; + tot += (udpint)a[1] * a[2]; + tot *= 2; + t += tot; + spint v3 = ((spint)t & mask); + t >>= 55; + tot = (udpint)a[0] * a[4]; + tot += (udpint)a[1] * a[3]; + tot *= 2; + tot += (udpint)a[2] * a[2]; + t += tot; + spint v4 = ((spint)t & mask); + t >>= 55; + tot = (udpint)a[0] * a[5]; + tot += (udpint)a[1] * a[4]; + tot += (udpint)a[2] * a[3]; + tot *= 2; + t += tot; + spint v5 = ((spint)t & mask); + t >>= 55; + tot = (udpint)a[0] * a[6]; + tot += (udpint)a[1] * a[5]; + tot += (udpint)a[2] * a[4]; + tot *= 2; + tot += (udpint)a[3] * a[3]; + t += tot; + t += (udpint)v0 * p6; + spint v6 = ((spint)t & mask); + t >>= 55; + tot = (udpint)a[1] * a[6]; + tot += (udpint)a[2] * a[5]; + tot += (udpint)a[3] * a[4]; + tot *= 2; + t += tot; + t += (udpint)v1 * p6; + c[0] = ((spint)t & mask); + t >>= 55; + tot = (udpint)a[2] * a[6]; + tot += (udpint)a[3] * a[5]; + tot *= 2; + tot += (udpint)a[4] * a[4]; + t += tot; + t += (udpint)v2 * p6; + c[1] = ((spint)t & mask); + t >>= 55; + tot = (udpint)a[3] * a[6]; + tot += (udpint)a[4] * a[5]; + tot *= 2; + t += tot; + t += (udpint)v3 * p6; + c[2] = ((spint)t & mask); + t >>= 55; + tot = (udpint)a[4] * a[6]; + tot *= 2; + tot += (udpint)a[5] * a[5]; + t += tot; + t += (udpint)v4 * p6; + c[3] = ((spint)t & mask); + t >>= 55; + tot = (udpint)a[5] * a[6]; + tot *= 2; + t += tot; + t += (udpint)v5 * p6; + c[4] = ((spint)t & mask); + t >>= 55; + tot = (udpint)a[6] * a[6]; + t += tot; + t += (udpint)v6 * p6; + c[5] = ((spint)t & mask); + t >>= 55; + c[6] = (spint)t; +} + +// copy +inline static void modcpy(const spint *a, spint *c) { + int i; + for (i = 0; i < 7; i++) { + c[i] = a[i]; + } +} + +// square n times +static void modnsqr(spint *a, int n) { + int i; + for (i = 0; i < n; i++) { + modsqr(a, a); + } +} + +// Calculate progenitor +static void modpro(const spint *w, spint *z) { + spint x[7]; + spint t0[7]; + spint t1[7]; + spint t2[7]; + spint t3[7]; + spint t4[7]; + spint t5[7]; + modcpy(w, x); + modsqr(x, z); + modsqr(z, t0); + modmul(x, t0, t1); + modmul(z, t1, z); + modsqr(z, t0); + modsqr(t0, t3); + modsqr(t3, t4); + modsqr(t4, t2); + modcpy(t2, t5); + modnsqr(t5, 3); + modmul(t2, t5, t2); + modcpy(t2, t5); + modnsqr(t5, 6); + modmul(t2, t5, t2); + modcpy(t2, t5); + modnsqr(t5, 2); + modmul(t4, t5, t5); + modnsqr(t5, 13); + modmul(t2, t5, t2); + modcpy(t2, t5); + modnsqr(t5, 2); + modmul(t4, t5, t4); + modnsqr(t4, 28); + modmul(t2, t4, t2); + modsqr(t2, t4); + modmul(t3, t4, t3); + modnsqr(t3, 59); + modmul(t2, t3, t2); + modmul(t1, t2, t1); + modmul(z, t1, z); + modmul(t0, z, t0); + modmul(t1, t0, t1); + modsqr(t1, t2); + modmul(t1, t2, t2); + modsqr(t2, t2); + modmul(t1, t2, t2); + modmul(t0, t2, t0); + modmul(z, t0, z); + modsqr(z, t2); + modmul(z, t2, t2); + modmul(t0, t2, t0); + modmul(t1, t0, t1); + modcpy(t1, t2); + modnsqr(t2, 128); + modmul(t1, t2, t1); + modmul(t0, t1, t0); + modnsqr(t0, 125); + modmul(z, t0, z); +} + +// calculate inverse, provide progenitor h if available +static void modinv(const spint *x, const spint *h, spint *z) { + spint s[7]; + spint t[7]; + if (h == NULL) { + modpro(x, t); + } else { + modcpy(h, t); + } + modcpy(x, s); + modnsqr(t, 2); + modmul(s, t, z); +} + +// Convert m to n-residue form, n=nres(m) +static void nres(const spint *m, spint *n) { + const spint c[7] = {0xfc0fc0fc0fc4du, 0x781f81f81f81f8u, 0x3f03f03f03f03u, + 0x7e07e07e07e07eu, 0x40fc0fc0fc0fc0u, 0x1f81f81f81f81fu, + 0xcff03f03f03f0u}; + modmul(m, c, n); +} + +// Convert n back to normal form, m=redc(n) +static void redc(const spint *n, spint *m) { + int i; + spint c[7]; + c[0] = 1; + for (i = 1; i < 7; i++) { + c[i] = 0; + } + modmul(n, c, m); + (void)modfsb(m); +} + +// is unity? +static int modis1(const spint *a) { + int i; + spint c[7]; + spint c0; + spint d = 0; + redc(a, c); + for (i = 1; i < 7; i++) { + d |= c[i]; + } + c0 = (spint)c[0]; + return ((spint)1 & ((d - (spint)1) >> 55u) & + (((c0 ^ (spint)1) - (spint)1) >> 55u)); +} + +// is zero? +static int modis0(const spint *a) { + int i; + spint c[7]; + spint d = 0; + redc(a, c); + for (i = 0; i < 7; i++) { + d |= c[i]; + } + return ((spint)1 & ((d - (spint)1) >> 55u)); +} + +// set to zero +static void modzer(spint *a) { + int i; + for (i = 0; i < 7; i++) { + a[i] = 0; + } +} + +// set to one +static void modone(spint *a) { + int i; + a[0] = 1; + for (i = 1; i < 7; i++) { + a[i] = 0; + } + nres(a, a); +} + +// set to integer +static void modint(int x, spint *a) { + int i; + a[0] = (spint)x; + for (i = 1; i < 7; i++) { + a[i] = 0; + } + nres(a, a); +} + +// Modular multiplication by an integer, c=a*b mod 2p +inline static void modmli(const spint *a, int b, spint *c) { + spint t[7]; + modint(b, t); + modmul(a, t, c); +} + +// Test for quadratic residue +static int modqr(const spint *h, const spint *x) { + spint r[7]; + if (h == NULL) { + modpro(x, r); + modsqr(r, r); + } else { + modsqr(h, r); + } + modmul(r, x, r); + return modis1(r) | modis0(x); +} + +// conditional move g to f if d=1 +// strongly recommend inlining be disabled using compiler specific syntax +static void modcmv(int b, const spint *g, volatile spint *f) { + int i; + spint c0, c1, s, t; + spint r = 0x3cc3c33c5aa5a55au; + c0 = (1 - b) + r; + c1 = b + r; + for (i = 0; i < 7; i++) { + s = g[i]; + t = f[i]; + f[i] = c0 * t + c1 * s; + f[i] -= r * (t + s); + } +} + +// conditional swap g and f if d=1 +// strongly recommend inlining be disabled using compiler specific syntax +static void modcsw(int b, volatile spint *g, volatile spint *f) { + int i; + spint c0, c1, s, t, w; + spint r = 0x3cc3c33c5aa5a55au; + c0 = (1 - b) + r; + c1 = b + r; + for (i = 0; i < 7; i++) { + s = g[i]; + t = f[i]; + w = r * (t + s); + f[i] = c0 * t + c1 * s; + f[i] -= w; + g[i] = c0 * s + c1 * t; + g[i] -= w; + } +} + +// Modular square root, provide progenitor h if available, NULL if not +static void modsqrt(const spint *x, const spint *h, spint *r) { + spint s[7]; + spint y[7]; + if (h == NULL) { + modpro(x, y); + } else { + modcpy(h, y); + } + modmul(y, x, s); + modcpy(s, r); +} + +// shift left by less than a word +static void modshl(unsigned int n, spint *a) { + int i; + a[6] = ((a[6] << n)) | (a[5] >> (55u - n)); + for (i = 5; i > 0; i--) { + a[i] = ((a[i] << n) & (spint)0x7fffffffffffff) | (a[i - 1] >> (55u - n)); + } + a[0] = (a[0] << n) & (spint)0x7fffffffffffff; +} + +// shift right by less than a word. Return shifted out part +static int modshr(unsigned int n, spint *a) { + int i; + spint r = a[0] & (((spint)1 << n) - (spint)1); + for (i = 0; i < 6; i++) { + a[i] = (a[i] >> n) | ((a[i + 1] << (55u - n)) & (spint)0x7fffffffffffff); + } + a[6] = a[6] >> n; + return r; +} + +// set a= 2^r +static void mod2r(unsigned int r, spint *a) { + unsigned int n = r / 55u; + unsigned int m = r % 55u; + modzer(a); + if (r >= 48 * 8) + return; + a[n] = 1; + a[n] <<= m; + nres(a, a); +} + +// export to byte array +static void modexp(const spint *a, char *b) { + int i; + spint c[7]; + redc(a, c); + for (i = 47; i >= 0; i--) { + b[i] = c[0] & (spint)0xff; + (void)modshr(8, c); + } +} + +// import from byte array +// returns 1 if in range, else 0 +static int modimp(const char *b, spint *a) { + int i, res; + for (i = 0; i < 7; i++) { + a[i] = 0; + } + for (i = 0; i < 48; i++) { + modshl(8, a); + a[0] += (spint)(unsigned char)b[i]; + } + res = modfsb(a); + nres(a, a); + return res; +} + +// determine sign +static int modsign(const spint *a) { + spint c[7]; + redc(a, c); + return c[0] % 2; +} + +// return true if equal +static int modcmp(const spint *a, const spint *b) { + spint c[7], d[7]; + int i, eq = 1; + redc(a, c); + redc(b, d); + for (i = 0; i < 7; i++) { + eq &= (((c[i] ^ d[i]) - 1) >> 55) & 1; + } + return eq; +} + +// clang-format on +/****************************************************************************** + API functions calling generated code above + ******************************************************************************/ + +#include + +const digit_t ZERO[NWORDS_FIELD] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; +const digit_t ONE[NWORDS_FIELD] = { 0x0000000000000007, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x000e400000000000 }; +// Montgomery representation of 2^-1 +static const digit_t TWO_INV[NWORDS_FIELD] = { 0x0000000000000003, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, + 0x000f400000000000 }; +// Montgomery representation of 3^-1 +static const digit_t THREE_INV[NWORDS_FIELD] = { 0x0055555555555557, 0x002aaaaaaaaaaaaa, 0x0055555555555555, + 0x002aaaaaaaaaaaaa, 0x0055555555555555, 0x002aaaaaaaaaaaaa, + 0x000f955555555555 }; +// Montgomery representation of 2^384 +static const digit_t R2[NWORDS_FIELD] = { 0x0007e07e07e07e26, 0x007c0fc0fc0fc0fc, 0x0001f81f81f81f81, + 0x003f03f03f03f03f, 0x00607e07e07e07e0, 0x000fc0fc0fc0fc0f, + 0x000e9f81f81f81f8 }; + +void +fp_set_small(fp_t *x, const digit_t val) +{ + modint((int)val, *x); +} + +void +fp_mul_small(fp_t *x, const fp_t *a, const uint32_t val) +{ + modmli(*a, (int)val, *x); +} + +void +fp_set_zero(fp_t *x) +{ + modzer(*x); +} + +void +fp_set_one(fp_t *x) +{ + modone(*x); +} + +uint32_t +fp_is_equal(const fp_t *a, const fp_t *b) +{ + return -(uint32_t)modcmp(*a, *b); +} + +uint32_t +fp_is_zero(const fp_t *a) +{ + return -(uint32_t)modis0(*a); +} + +void +fp_copy(fp_t *out, const fp_t *a) +{ + modcpy(*a, *out); +} + +void +fp_cswap(fp_t *a, fp_t *b, uint32_t ctl) +{ + modcsw((int)(ctl & 0x1), *a, *b); +} + +void +fp_add(fp_t *out, const fp_t *a, const fp_t *b) +{ + modadd(*a, *b, *out); +} + +void +fp_sub(fp_t *out, const fp_t *a, const fp_t *b) +{ + modsub(*a, *b, *out); +} + +void +fp_neg(fp_t *out, const fp_t *a) +{ + modneg(*a, *out); +} + +void +fp_sqr(fp_t *out, const fp_t *a) +{ + modsqr(*a, *out); +} + +void +fp_mul(fp_t *out, const fp_t *a, const fp_t *b) +{ + modmul(*a, *b, *out); +} + +void +fp_inv(fp_t *x) +{ + modinv(*x, NULL, *x); +} + +uint32_t +fp_is_square(const fp_t *a) +{ + return -(uint32_t)modqr(NULL, *a); +} + +void +fp_sqrt(fp_t *a) +{ + modsqrt(*a, NULL, *a); +} + +void +fp_half(fp_t *out, const fp_t *a) +{ + modmul(TWO_INV, *a, *out); +} + +void +fp_exp3div4(fp_t *out, const fp_t *a) +{ + modpro(*a, *out); +} + +void +fp_div3(fp_t *out, const fp_t *a) +{ + modmul(THREE_INV, *a, *out); +} + +void +fp_encode(void *dst, const fp_t *a) +{ + // Modified version of modexp() + int i; + spint c[7]; + redc(*a, c); + for (i = 0; i < 48; i++) { + ((char *)dst)[i] = c[0] & (spint)0xff; + (void)modshr(8, c); + } +} + +uint32_t +fp_decode(fp_t *d, const void *src) +{ + // Modified version of modimp() + int i; + spint res; + const unsigned char *b = src; + for (i = 0; i < 7; i++) { + (*d)[i] = 0; + } + for (i = 47; i >= 0; i--) { + modshl(8, *d); + (*d)[0] += (spint)b[i]; + } + res = (spint)-modfsb(*d); + nres(*d, *d); + // If the value was canonical then res = -1; otherwise, res = 0 + for (i = 0; i < 7; i++) { + (*d)[i] &= res; + } + return (uint32_t)res; +} + +static inline unsigned char +add_carry(unsigned char cc, spint a, spint b, spint *d) +{ + udpint t = (udpint)a + (udpint)b + cc; + *d = (spint)t; + return (unsigned char)(t >> Wordlength); +} + +static void +partial_reduce(spint *out, const spint *src) +{ + spint h, l, quo, rem; + unsigned char cc; + + // Split value in high (8 bits) and low (376 bits) parts. + h = src[5] >> 56; + l = src[5] & 0x00FFFFFFFFFFFFFF; + + // 65*2^376 = 1 mod q; hence, we add floor(h/65) + (h mod 65)*2^376 + // to the low part. + quo = (h * 0xFC1) >> 18; + rem = h - (65 * quo); + cc = add_carry(0, src[0], quo, &out[0]); + cc = add_carry(cc, src[1], 0, &out[1]); + cc = add_carry(cc, src[2], 0, &out[2]); + cc = add_carry(cc, src[3], 0, &out[3]); + cc = add_carry(cc, src[4], 0, &out[4]); + (void)add_carry(cc, l, rem << 56, &out[5]); +} + +// Little-endian encoding of a 64-bit integer. +static inline void +enc64le(void *dst, uint64_t x) +{ + uint8_t *buf = dst; + buf[0] = (uint8_t)x; + buf[1] = (uint8_t)(x >> 8); + buf[2] = (uint8_t)(x >> 16); + buf[3] = (uint8_t)(x >> 24); + buf[4] = (uint8_t)(x >> 32); + buf[5] = (uint8_t)(x >> 40); + buf[6] = (uint8_t)(x >> 48); + buf[7] = (uint8_t)(x >> 56); +} + +// Little-endian decoding of a 64-bit integer. +static inline uint64_t +dec64le(const void *src) +{ + const uint8_t *buf = src; + return (spint)buf[0] | ((spint)buf[1] << 8) | ((spint)buf[2] << 16) | ((spint)buf[3] << 24) | + ((spint)buf[4] << 32) | ((spint)buf[5] << 40) | ((spint)buf[6] << 48) | ((spint)buf[7] << 56); +} + +void +fp_decode_reduce(fp_t *d, const void *src, size_t len) +{ + uint64_t t[6]; // Stores Nbytes * 8 bits + uint8_t tmp[48]; // Nbytes + const uint8_t *b = src; + + fp_set_zero(d); + if (len == 0) { + return; + } + + size_t rem = len % 48; + if (rem != 0) { + // Input size is not a multiple of 48, we decode a partial + // block, which is already less than 2^376. + size_t k = len - rem; + memcpy(tmp, b + k, len - k); + memset(tmp + len - k, 0, (sizeof tmp) - (len - k)); + fp_decode(d, tmp); + len = k; + } + // Process all remaining blocks, in descending address order. + while (len > 0) { + fp_mul(d, d, &R2); + len -= 48; + t[0] = dec64le(b + len); + t[1] = dec64le(b + len + 8); + t[2] = dec64le(b + len + 16); + t[3] = dec64le(b + len + 24); + t[4] = dec64le(b + len + 32); + t[5] = dec64le(b + len + 40); + partial_reduce(t, t); + enc64le(tmp, t[0]); + enc64le(tmp + 8, t[1]); + enc64le(tmp + 16, t[2]); + enc64le(tmp + 24, t[3]); + enc64le(tmp + 32, t[4]); + enc64le(tmp + 40, t[5]); + fp_t a; + fp_decode(&a, tmp); + fp_add(d, d, &a); + } +} diff --git a/src/gf/ref/lvl3/include/fp.h b/src/gf/ref/lvl3/include/fp.h deleted file mode 100644 index 7fb11af..0000000 --- a/src/gf/ref/lvl3/include/fp.h +++ /dev/null @@ -1,76 +0,0 @@ -#ifndef FP_H -#define FP_H - -//////////////////////////////////////////////// NOTE: this is placed here for now -#include -#include -#include -#include -#include -#include -#include - -typedef digit_t fp_t[NWORDS_FIELD]; // Datatype for representing field elements - -void fp_set(digit_t* x, const digit_t val); -bool fp_is_equal(const digit_t* a, const digit_t* b); -bool fp_is_zero(const digit_t* a); -void fp_copy(digit_t* out, const digit_t* a); -digit_t mp_shiftr(digit_t* x, const unsigned int shift, const unsigned int nwords); -void mp_shiftl(digit_t* x, const unsigned int shift, const unsigned int nwords); -void fp_add(digit_t* out, const digit_t* a, const digit_t* b); -void fp_sub(digit_t* out, const digit_t* a, const digit_t* b); -void fp_neg(digit_t* out, const digit_t* a); -void fp_sqr(digit_t* out, const digit_t* a); -void fp_mul(digit_t* out, const digit_t* a, const digit_t* b); -void MUL(digit_t* out, const digit_t a, const digit_t b); -void fp_inv(digit_t* x); -bool fp_is_square(const digit_t* a); -void fp_sqrt(digit_t* a); -void fp_tomont(digit_t* out, const digit_t* a); -void fp_frommont(digit_t* out, const digit_t* a); -void fp_mont_setone(digit_t* out); - -/********************** Constant-time unsigned comparisons ***********************/ - -// The following functions return 1 (TRUE) if condition is true, 0 (FALSE) otherwise - -static inline unsigned int is_digit_nonzero_ct(digit_t x) -{ // Is x != 0? - return (unsigned int)((x | (0 - x)) >> (RADIX - 1)); -} - -static inline unsigned int is_digit_zero_ct(digit_t x) -{ // Is x = 0? - return (unsigned int)(1 ^ is_digit_nonzero_ct(x)); -} - -static inline unsigned int is_digit_lessthan_ct(digit_t x, digit_t y) -{ // Is x < y? - return (unsigned int)((x ^ ((x ^ y) | ((x - y) ^ y))) >> (RADIX - 1)); -} - -/********************** Platform-independent macros for digit-size operations **********************/ - -// Digit addition with carry -#define ADDC(sumOut, carryOut, addend1, addend2, carryIn) \ - { digit_t tempReg = (addend1) + (digit_t)(carryIn); \ - (sumOut) = (addend2) + tempReg; \ - (carryOut) = (is_digit_lessthan_ct(tempReg, (digit_t)(carryIn)) | is_digit_lessthan_ct((sumOut), tempReg)); } - -// Digit subtraction with borrow -#define SUBC(differenceOut, borrowOut, minuend, subtrahend, borrowIn) \ - { digit_t tempReg = (minuend) - (subtrahend); \ - unsigned int borrowReg = (is_digit_lessthan_ct((minuend), (subtrahend)) | ((borrowIn) & is_digit_zero_ct(tempReg))); \ - (differenceOut) = tempReg - (digit_t)(borrowIn); \ - (borrowOut) = borrowReg; } - -// Shift right with flexible datatype -#define SHIFTR(highIn, lowIn, shift, shiftOut, DigitSize) \ - (shiftOut) = ((lowIn) >> (shift)) ^ ((highIn) << (DigitSize - (shift))); - -// Digit shift left -#define SHIFTL(highIn, lowIn, shift, shiftOut, DigitSize) \ - (shiftOut) = ((highIn) << (shift)) ^ ((lowIn) >> (RADIX - (shift))); - -#endif \ No newline at end of file diff --git a/src/gf/ref/lvl3/include/fp2.h b/src/gf/ref/lvl3/include/fp2.h deleted file mode 100644 index 8015de0..0000000 --- a/src/gf/ref/lvl3/include/fp2.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef FP2_H -#define FP2_H - -#include "fp.h" - -// Structure for representing elements in GF(p^2) -typedef struct fp2_t { - fp_t re, im; -} fp2_t; - -void fp2_set(fp2_t* x, const digit_t val); -bool fp2_is_zero(const fp2_t* a); -bool fp2_is_equal(const fp2_t* a, const fp2_t* b); -void fp2_copy(fp2_t* x, const fp2_t* y); -fp2_t fp2_non_residue(); -void fp2_add(fp2_t* x, const fp2_t* y, const fp2_t* z); -void fp2_sub(fp2_t* x, const fp2_t* y, const fp2_t* z); -void fp2_neg(fp2_t* x, const fp2_t* y); -void fp2_mul(fp2_t* x, const fp2_t* y, const fp2_t* z); -void fp2_sqr(fp2_t* x, const fp2_t* y); -void fp2_inv(fp2_t* x); -bool fp2_is_square(const fp2_t* x); -void fp2_frob(fp2_t* x, const fp2_t* y); -void fp2_sqrt(fp2_t* x); -void fp2_tomont(fp2_t* x, const fp2_t* y); -void fp2_frommont(fp2_t* x, const fp2_t* y); -int fp2_cmp(fp2_t* x, fp2_t* y); - -#endif diff --git a/src/gf/ref/lvl3/test/CMakeLists.txt b/src/gf/ref/lvl3/test/CMakeLists.txt index 2f769a7..316e0a8 100644 --- a/src/gf/ref/lvl3/test/CMakeLists.txt +++ b/src/gf/ref/lvl3/test/CMakeLists.txt @@ -1,9 +1 @@ -add_executable(sqisign_test_gf_${SVARIANT_LOWER}_fp test_fp.c test_extras.c) -target_link_libraries(sqisign_test_gf_${SVARIANT_LOWER}_fp ${LIB_GF_${SVARIANT_UPPER}}) -target_include_directories(sqisign_test_gf_${SVARIANT_LOWER}_fp PRIVATE ../include ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC}) -add_test(sqisign_test_gf_${SVARIANT_LOWER}_fp sqisign_test_gf_${SVARIANT_LOWER}_fp test ${SQISIGN_TEST_REPS}) - -add_executable(sqisign_test_gf_${SVARIANT_LOWER}_fp2 test_fp2.c test_extras.c) -target_link_libraries(sqisign_test_gf_${SVARIANT_LOWER}_fp2 ${LIB_GF_${SVARIANT_UPPER}}) -target_include_directories(sqisign_test_gf_${SVARIANT_LOWER}_fp2 PRIVATE ../include ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC}) -add_test(sqisign_test_gf_${SVARIANT_LOWER}_fp2 sqisign_test_gf_${SVARIANT_LOWER}_fp2 test ${SQISIGN_TEST_REPS}) \ No newline at end of file +include(../../lvlx_test.cmake) diff --git a/src/gf/ref/lvl3/test/test_extras.c b/src/gf/ref/lvl3/test/test_extras.c deleted file mode 100644 index d0689c6..0000000 --- a/src/gf/ref/lvl3/test/test_extras.c +++ /dev/null @@ -1,74 +0,0 @@ -#include "test_extras.h" -#include - -// Global constants -extern const digit_t p[NWORDS_FIELD]; -extern const digit_t R2[NWORDS_FIELD]; - -#if 0 -int64_t cpucycles(void) -{ // Access system counter for benchmarking - unsigned int hi, lo; - - asm volatile ("rdtsc\n\t" : "=a" (lo), "=d"(hi)); - return ((int64_t)lo) | (((int64_t)hi) << 32); -} -#endif - - -int compare_words(digit_t* a, digit_t* b, unsigned int nwords) -{ // Comparing "nword" elements, a=b? : (1) a>b, (0) a=b, (-1) a= 0; i--) - { - if (a[i] > b[i]) return 1; - else if (a[i] < b[i]) return -1; - } - - return 0; -} - - -static void sub_test(digit_t* out, digit_t* a, digit_t* b, unsigned int nwords) -{ // Subtraction without borrow, out = a-b where a>b - // SECURITY NOTE: this function does not have constant-time execution. It is for TESTING ONLY. - unsigned int i; - digit_t res, carry, borrow = 0; - - for (i = 0; i < nwords; i++) - { - res = a[i] - b[i]; - carry = (a[i] < b[i]); - out[i] = res - borrow; - borrow = carry || (res < borrow); - } -} - - -void fprandom_test(digit_t* a) -{ // Generating a pseudo-random field element in [0, p-1] - // SECURITY NOTE: distribution is not fully uniform. TO BE USED FOR TESTING ONLY. - unsigned int i, diff = 256-254, nwords = NWORDS_FIELD; - unsigned char* string = NULL; - - string = (unsigned char*)a; - for (i = 0; i < sizeof(digit_t)*nwords; i++) { - *(string + i) = (unsigned char)rand(); // Obtain 256-bit number - } - a[nwords-1] &= (((digit_t)(-1) << diff) >> diff); - - while (compare_words((digit_t*)p, a, nwords) < 1) { // Force it to [0, modulus-1] - sub_test(a, a, (digit_t*)p, nwords); - } -} - - -void fp2random_test(fp2_t* a) -{ // Generating a pseudo-random element in GF(p^2) - // SECURITY NOTE: distribution is not fully uniform. TO BE USED FOR TESTING ONLY. - - fprandom_test(a->re); - fprandom_test(a->im); -} \ No newline at end of file diff --git a/src/gf/ref/lvl3/test/test_extras.h b/src/gf/ref/lvl3/test/test_extras.h deleted file mode 100644 index 3de524d..0000000 --- a/src/gf/ref/lvl3/test/test_extras.h +++ /dev/null @@ -1,25 +0,0 @@ - -#ifndef TEST_EXTRAS_H -#define TEST_EXTRAS_H - -#include -#include -#include "../include/fp.h" -#include "../include/fp2.h" - -#define PASSED 0 -#define FAILED 1 - -// Access system counter for benchmarking -//int64_t cpucycles(void); - -// Comparing "nword" elements, a=b? : (1) a!=b, (0) a=b -int compare_words(digit_t* a, digit_t* b, unsigned int nwords); - -// Generating a pseudo-random field element in [0, p-1] -void fprandom_test(digit_t* a); - -// Generating a pseudo-random element in GF(p^2) -void fp2random_test(fp2_t* a); - -#endif \ No newline at end of file diff --git a/src/gf/ref/lvl3/test/test_fp.c b/src/gf/ref/lvl3/test/test_fp.c deleted file mode 100644 index 033c570..0000000 --- a/src/gf/ref/lvl3/test/test_fp.c +++ /dev/null @@ -1,295 +0,0 @@ -#include "test_extras.h" -#include -#include -#include - -// Global constants -extern const digit_t p[NWORDS_FIELD]; - -// Benchmark and test parameters -static int BENCH_LOOPS = 100000; // Number of iterations per bench -static int TEST_LOOPS = 100000; // Number of iterations per test - - -bool fp_test() -{ // Tests for the field arithmetic - bool OK = true; - int n, passed; - fp_t a, b, c, d, e, f, ma, mb, mc, md, me, mf; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing field arithmetic over GF(p): \n\n"); - - // Field addition - passed = 1; - for (n=0; n\n"); - exit(1); - } - if (!strcmp(argv[1], "test")) { - TEST_LOOPS = atoi(argv[2]); - return !fp_test(); - } else if (!strcmp(argv[1], "bench")) { - BENCH_LOOPS = atoi(argv[2]); - return !fp_run(); - } else { - exit(1); - } -} \ No newline at end of file diff --git a/src/gf/ref/lvl3/test/test_fp2.c b/src/gf/ref/lvl3/test/test_fp2.c deleted file mode 100644 index 48b08c7..0000000 --- a/src/gf/ref/lvl3/test/test_fp2.c +++ /dev/null @@ -1,307 +0,0 @@ -#include "test_extras.h" -#include -#include -#include - -// Global constants -extern const digit_t p[NWORDS_FIELD]; - -// Benchmark and test parameters -static int BENCH_LOOPS = 100000; // Number of iterations per bench -static int TEST_LOOPS = 100000; // Number of iterations per test - - -bool fp2_test() -{ // Tests for the GF(p^2) arithmetic - bool OK = true; - int n, passed; - fp2_t a, b, c, d, e, f, ma, mb, mc, md, me, mf; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing arithmetic over GF(p^2): \n\n"); - - // Addition in GF(p^2) - passed = 1; - for (n=0; n\n"); - exit(1); - } - if (!strcmp(argv[1], "test")) { - TEST_LOOPS = atoi(argv[2]); - return !fp2_test(); - } else if (!strcmp(argv[1], "bench")) { - BENCH_LOOPS = atoi(argv[2]); - return !fp2_run(); - } else { - exit(1); - } -} \ No newline at end of file diff --git a/src/gf/ref/lvl5/CMakeLists.txt b/src/gf/ref/lvl5/CMakeLists.txt index 22784ae..ea5c83f 100644 --- a/src/gf/ref/lvl5/CMakeLists.txt +++ b/src/gf/ref/lvl5/CMakeLists.txt @@ -1,10 +1,5 @@ - -set(SOURCE_FILES_GF_${SVARIANT_UPPER}_REF - fp_p318233.c fp.c fp2.c +set(SOURCE_FILES_GF_SPECIFIC + fp_p27500_${RADIX}.c ) -add_library(${LIB_GF_${SVARIANT_UPPER}} ${SOURCE_FILES_GF_${SVARIANT_UPPER}_REF}) -target_include_directories(${LIB_GF_${SVARIANT_UPPER}} PRIVATE common ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} include ${PROJECT_SOURCE_DIR}/include ${INC_COMMON}) -target_compile_options(${LIB_GF_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) +include(../lvlx.cmake) diff --git a/src/gf/ref/lvl5/Makefile b/src/gf/ref/lvl5/Makefile deleted file mode 100644 index 036be07..0000000 --- a/src/gf/ref/lvl5/Makefile +++ /dev/null @@ -1,43 +0,0 @@ - -CC=gcc -CFLAGS= -O3 -std=gnu11 -Wall -march=native -Wno-missing-braces -Wno-logical-not-parentheses -LDFLAGS=-lm -AR=ar rcs -RANLIB=ranlib - -OBJECTS=objs/fp_p318233.o objs/fp.o objs/fp2.o objs/random.o - -all: lib tests - -objs/fp_p318233.o: fp_p318233.c - @mkdir -p $(@D) - $(CC) -c $(CFLAGS) fp_p318233.c -o objs/fp_p318233.o - -objs/fp.o: fp.c - @mkdir -p $(@D) - $(CC) -c $(CFLAGS) fp.c -o objs/fp.o - -objs/fp2.o: fp2.c - @mkdir -p $(@D) - $(CC) -c $(CFLAGS) fp2.c -o objs/fp2.o - -objs/random.o: ../../../common/generic/randombytes_system.c - $(CC) -c $(CFLAGS) ../../../common/generic/randombytes_system.c -o objs/random.o - -lib: $(OBJECTS) - rm -rf lib - mkdir lib - $(AR) lib/libtest.a $^ - $(RANLIB) lib/libtest.a - -tests: lib - $(CC) $(CFLAGS) -L./lib test/test_fp.c test/test_extras.c -ltest $(LDFLAGS) -o test_fp -lgmp - $(CC) $(CFLAGS) -L./lib test/test_fp2.c test/test_extras.c -ltest $(LDFLAGS) -o test_fp2 -lgmp - -check: tests - -.PHONY: clean - -clean: - rm -rf *.req objs lib test_fp* - diff --git a/src/gf/ref/lvl5/fp.c b/src/gf/ref/lvl5/fp.c deleted file mode 100644 index 565cf1f..0000000 --- a/src/gf/ref/lvl5/fp.c +++ /dev/null @@ -1,168 +0,0 @@ -#include "include/fp.h" - -const uint64_t p[NWORDS_FIELD] = { 0xffffffffffffffff, 0xFFFFFFFFFFFFFFFF, 0x994C68ADA6E1FFFF, 0xFAF0A29A781974CE, 0xFE3AC5904A0DEA65, 0x02BDBE6326507D01, 0x8C15B0036936E792, 0x255946A8869BC6 }; -const uint64_t R2[NWORDS_FIELD] = { 0x46E4E8A0C7549CBD, 0xCB993B5943E89EA5, 0x545AC09F2F1B55C8, 0x1ADB99DDACAA06EC, 0x87994B8955D8B8D4, 0x2CC2EA622F9E57C8, 0x2780B5F2DAF1003C, 0x1691676B8674B8 }; -const uint64_t pp[NWORDS_FIELD] = { 0x01, 0x00, 0x00, 0x00 }; - -void fp_set(digit_t* x, const digit_t val) -{ // Set field element x = val, where val has wordsize - - x[0] = val; - for (unsigned int i = 1; i < NWORDS_FIELD; i++) { - x[i] = 0; - } -} - -bool fp_is_equal(const digit_t* a, const digit_t* b) -{ // Compare two field elements in constant time - // Returns 1 (true) if a=b, 0 (false) otherwise - digit_t r = 0; - - for (unsigned int i = 0; i < NWORDS_FIELD; i++) - r |= a[i] ^ b[i]; - - return (bool)is_digit_zero_ct(r); -} - -bool fp_is_zero(const digit_t* a) -{ // Is a field element zero? - // Returns 1 (true) if a=0, 0 (false) otherwise - digit_t r = 0; - - for (unsigned int i = 0; i < NWORDS_FIELD; i++) - r |= a[i] ^ 0; - - return (bool)is_digit_zero_ct(r); -} - -void fp_copy(digit_t* out, const digit_t* a) -{ - memcpy(out, a, NWORDS_FIELD*RADIX/8); -} - -void fp_neg(digit_t* out, const digit_t* a) -{ // Modular negation, out = -a mod p - // Input: a in [0, p-1] - // Output: out in [0, p-1] - unsigned int i, borrow = 0; - - for (i = 0; i < NWORDS_FIELD; i++) { - SUBC(out[i], borrow, ((digit_t*)p)[i], a[i], borrow); - } - fp_sub(out, out, (digit_t*)p); -} - -void MUL(digit_t* out, const digit_t a, const digit_t b) -{ // Digit multiplication, digit*digit -> 2-digit result - // Inputs: a, b in [0, 2^w-1], where w is the computer wordsize - // Output: 0 < out < 2^(2w)-1 - register digit_t al, ah, bl, bh, temp; - digit_t albl, albh, ahbl, ahbh, res1, res2, res3, carry; - digit_t mask_low = (digit_t)(-1) >> (sizeof(digit_t)*4), mask_high = (digit_t)(-1) << (sizeof(digit_t)*4); - - al = a & mask_low; // Low part - ah = a >> (sizeof(digit_t)*4); // High part - bl = b & mask_low; - bh = b >> (sizeof(digit_t)*4); - - albl = al * bl; - albh = al * bh; - ahbl = ah * bl; - ahbh = ah * bh; - out[0] = albl & mask_low; // out00 - - res1 = albl >> (sizeof(digit_t)*4); - res2 = ahbl & mask_low; - res3 = albh & mask_low; - temp = res1 + res2 + res3; - carry = temp >> (sizeof(digit_t)*4); - out[0] ^= temp << (sizeof(digit_t)*4); // out01 - - res1 = ahbl >> (sizeof(digit_t)*4); - res2 = albh >> (sizeof(digit_t)*4); - res3 = ahbh & mask_low; - temp = res1 + res2 + res3 + carry; - out[1] = temp & mask_low; // out10 - carry = temp & mask_high; - out[1] ^= (ahbh & mask_high) + carry; // out11 -} - -digit_t mp_shiftr(digit_t* x, const unsigned int shift, const unsigned int nwords) -{ // Multiprecision right shift - digit_t bit_out = x[0] & 1; - - for (unsigned int i = 0; i < nwords-1; i++) { - SHIFTR(x[i+1], x[i], shift, x[i], RADIX); - } - x[nwords-1] >>= shift; - return bit_out; -} - -void mp_shiftl(digit_t* x, const unsigned int shift, const unsigned int nwords) -{ // Multiprecision left shift - - for (int i = nwords-1; i > 0; i--) { - SHIFTL(x[i], x[i-1], shift, x[i], RADIX); - } - x[0] <<= shift; -} - -static void fp_exp3div4(digit_t* out, const digit_t* a) -{ // Fixed exponentiation out = a^((p-3)/4) mod p - // Input: a in [0, p-1] - // Output: out in [0, p-1] - // Requirement: p = 3(mod 4) - fp_t p_t, acc; - digit_t bit; - - memcpy((digit_t*)p_t, (digit_t*)p, NWORDS_FIELD*RADIX/8); - memcpy((digit_t*)acc, (digit_t*)a, NWORDS_FIELD*RADIX/8); - mp_shiftr(p_t, 1, NWORDS_FIELD); - mp_shiftr(p_t, 1, NWORDS_FIELD); - fp_set(out, 1); - fp_tomont(out, out); - - for (int i = 0; i < NWORDS_FIELD*RADIX-2; i++) { - bit = p_t[0] & 1; - mp_shiftr(p_t, 1, NWORDS_FIELD); - if (bit == 1) { - fp_mul(out, out, acc); - } - fp_sqr(acc, acc); - } -} - -void fp_inv(digit_t* a) -{ // Modular inversion, out = x^-1*R mod p, where R = 2^(w*nwords), w is the computer wordsize and nwords is the number of words to represent p - // Input: a=xR in [0, p-1] - // Output: out in [0, p-1]. It outputs 0 if the input does not have an inverse - // Requirement: Ceiling(Log(p)) < w*nwords - fp_t t; - - fp_exp3div4(t, a); - fp_sqr(t, t); - fp_sqr(t, t); - fp_mul(a, t, a); // a^(p-2) -} - -bool fp_is_square(const digit_t* a) -{ // Is field element a square? - // Output: out = 0 (false), 1 (true) - fp_t t, one; - - fp_exp3div4(t, a); - fp_sqr(t, t); - fp_mul(t, t, a); // a^((p-1)/2) - fp_frommont(t, t); - fp_set(one, 1); - - return fp_is_equal(t, one); -} - -void fp_sqrt(digit_t* a) -{ // Square root computation, out = a^((p+1)/4) mod p - fp_t t; - - fp_exp3div4(t, a); - fp_mul(a, t, a); // a^((p+1)/4) -} \ No newline at end of file diff --git a/src/gf/ref/lvl5/fp2.c b/src/gf/ref/lvl5/fp2.c deleted file mode 100644 index 5fe0e84..0000000 --- a/src/gf/ref/lvl5/fp2.c +++ /dev/null @@ -1,193 +0,0 @@ -#include - -extern const digit_t R[NWORDS_FIELD]; - -/* Arithmetic modulo X^2 + 1 */ - -void fp2_set(fp2_t* x, const digit_t val) -{ - fp_set(x->re, val); - fp_set(x->im, 0); -} - -bool fp2_is_zero(const fp2_t* a) -{ // Is a GF(p^2) element zero? - // Returns 1 (true) if a=0, 0 (false) otherwise - - return fp_is_zero(a->re) & fp_is_zero(a->im); -} - -bool fp2_is_equal(const fp2_t* a, const fp2_t* b) -{ // Compare two GF(p^2) elements in constant time - // Returns 1 (true) if a=b, 0 (false) otherwise - - return fp_is_equal(a->re, b->re) & fp_is_equal(a->im, b->im); -} - -void fp2_copy(fp2_t* x, const fp2_t* y) -{ - fp_copy(x->re, y->re); - fp_copy(x->im, y->im); -} - -fp2_t fp2_non_residue() -{ // 5 + 2i is a quadratic non-residue for p318233 - fp_t one = {0}; - fp2_t res; - - one[0] = 1; - fp_tomont(one, one); - fp_add(res.im, one, one); - fp_add(res.re, res.im, res.im); - fp_add(res.re, res.re, one); - return res; -} - -void fp2_add(fp2_t* x, const fp2_t* y, const fp2_t* z) -{ - fp_add(x->re, y->re, z->re); - fp_add(x->im, y->im, z->im); -} - -void fp2_sub(fp2_t* x, const fp2_t* y, const fp2_t* z) -{ - fp_sub(x->re, y->re, z->re); - fp_sub(x->im, y->im, z->im); -} - -void fp2_neg(fp2_t* x, const fp2_t* y) -{ - fp_neg(x->re, y->re); - fp_neg(x->im, y->im); -} - -void fp2_mul(fp2_t* x, const fp2_t* y, const fp2_t* z) -{ - fp_t t0, t1; - - fp_add(t0, y->re, y->im); - fp_add(t1, z->re, z->im); - fp_mul(t0, t0, t1); - fp_mul(t1, y->im, z->im); - fp_mul(x->re, y->re, z->re); - fp_sub(x->im, t0, t1); - fp_sub(x->im, x->im, x->re); - fp_sub(x->re, x->re, t1); -} - -void fp2_sqr(fp2_t* x, const fp2_t* y) -{ - fp_t sum, diff; - - fp_add(sum, y->re, y->im); - fp_sub(diff, y->re, y->im); - fp_mul(x->im, y->re, y->im); - fp_add(x->im, x->im, x->im); - fp_mul(x->re, sum, diff); -} - -void fp2_inv(fp2_t* x) -{ - fp_t t0, t1; - - fp_sqr(t0, x->re); - fp_sqr(t1, x->im); - fp_add(t0, t0, t1); - fp_inv(t0); - fp_mul(x->re, x->re, t0); - fp_mul(x->im, x->im, t0); - fp_neg(x->im, x->im); -} - -bool fp2_is_square(const fp2_t* x) -{ - fp_t t0, t1; - - fp_sqr(t0, x->re); - fp_sqr(t1, x->im); - fp_add(t0, t0, t1); - - return fp_is_square(t0); -} - -void fp2_frob(fp2_t* x, const fp2_t* y) -{ - memcpy((digit_t*)x->re, (digit_t*)y->re, NWORDS_FIELD*RADIX/8); - fp_neg(x->im, y->im); -} - -void fp2_tomont(fp2_t* x, const fp2_t* y) -{ - fp_tomont(x->re, y->re); - fp_tomont(x->im, y->im); -} - -void fp2_frommont(fp2_t* x, const fp2_t* y) -{ - fp_frommont(x->re, y->re); - fp_frommont(x->im, y->im); -} - -// NOTE: old, non-constant-time implementation. Could be optimized -void fp2_sqrt(fp2_t* x) -{ - fp_t sdelta, re, tmp1, tmp2, inv2, im; - - if (fp_is_zero(x->im)) { - if (fp_is_square(x->re)) { - fp_sqrt(x->re); - return; - } else { - fp_neg(x->im, x->re); - fp_sqrt(x->im); - fp_set(x->re, 0); - return; - } - } - - // sdelta = sqrt(re^2 + im^2) - fp_sqr(sdelta, x->re); - fp_sqr(tmp1, x->im); - fp_add(sdelta, sdelta, tmp1); - fp_sqrt(sdelta); - - fp_set(inv2, 2); - fp_tomont(inv2, inv2); // inv2 <- 2 - fp_inv(inv2); - fp_add(re, x->re, sdelta); - fp_mul(re, re, inv2); - memcpy((digit_t*)tmp2, (digit_t*)re, NWORDS_FIELD*RADIX/8); - - if (!fp_is_square(tmp2)) { - fp_sub(re, x->re, sdelta); - fp_mul(re, re, inv2); - } - - fp_sqrt(re); - memcpy((digit_t*)im, (digit_t*)re, NWORDS_FIELD*RADIX/8); - - fp_inv(im); - fp_mul(im, im, inv2); - fp_mul(x->im, im, x->im); - memcpy((digit_t*)x->re, (digit_t*)re, NWORDS_FIELD*RADIX/8); -} - -// Lexicographic comparison of two field elements. Returns +1 if x > y, -1 if x < y, 0 if x = y -int fp2_cmp(fp2_t* x, fp2_t* y){ - fp2_t a, b; - fp2_frommont(&a, x); - fp2_frommont(&b, y); - for(int i = NWORDS_FIELD-1; i >= 0; i--){ - if(a.re[i] > b.re[i]) - return 1; - if(a.re[i] < b.re[i]) - return -1; - } - for(int i = NWORDS_FIELD-1; i >= 0; i--){ - if(a.im[i] > b.im[i]) - return 1; - if(a.im[i] < b.im[i]) - return -1; - } - return 0; -} \ No newline at end of file diff --git a/src/gf/ref/lvl5/fp_p27500_32.c b/src/gf/ref/lvl5/fp_p27500_32.c new file mode 100644 index 0000000..ecf5ea7 --- /dev/null +++ b/src/gf/ref/lvl5/fp_p27500_32.c @@ -0,0 +1,1514 @@ +// clang-format off +// Command line : python monty.py 32 +// 0x1afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +#include +#include + +#define sspint int32_t +#define spint uint32_t +#define udpint uint64_t +#define dpint uint64_t + +#define Wordlength 32 +#define Nlimbs 18 +#define Radix 29 +#define Nbits 505 +#define Nbytes 64 + +#define MONTGOMERY +// propagate carries +inline static spint prop(spint *n) { + int i; + spint mask = ((spint)1 << 29u) - (spint)1; + sspint carry = (sspint)n[0]; + carry >>= 29u; + n[0] &= mask; + for (i = 1; i < 17; i++) { + carry += (sspint)n[i]; + n[i] = (spint)carry & mask; + carry >>= 29u; + } + n[17] += (spint)carry; + return -((n[17] >> 1) >> 30u); +} + +// propagate carries and add p if negative, propagate carries again +inline static int flatten(spint *n) { + spint carry = prop(n); + n[0] -= (spint)1u & carry; + n[17] += ((spint)0xd80u) & carry; + (void)prop(n); + return (int)(carry & 1); +} + +// Montgomery final subtract +static int modfsb(spint *n) { + n[0] += (spint)1u; + n[17] -= (spint)0xd80u; + return flatten(n); +} + +// Modular addition - reduce less than 2p +static void modadd(const spint *a, const spint *b, spint *n) { + spint carry; + n[0] = a[0] + b[0]; + n[1] = a[1] + b[1]; + n[2] = a[2] + b[2]; + n[3] = a[3] + b[3]; + n[4] = a[4] + b[4]; + n[5] = a[5] + b[5]; + n[6] = a[6] + b[6]; + n[7] = a[7] + b[7]; + n[8] = a[8] + b[8]; + n[9] = a[9] + b[9]; + n[10] = a[10] + b[10]; + n[11] = a[11] + b[11]; + n[12] = a[12] + b[12]; + n[13] = a[13] + b[13]; + n[14] = a[14] + b[14]; + n[15] = a[15] + b[15]; + n[16] = a[16] + b[16]; + n[17] = a[17] + b[17]; + n[0] += (spint)2u; + n[17] -= (spint)0x1b00u; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[17] += ((spint)0x1b00u) & carry; + (void)prop(n); +} + +// Modular subtraction - reduce less than 2p +static void modsub(const spint *a, const spint *b, spint *n) { + spint carry; + n[0] = a[0] - b[0]; + n[1] = a[1] - b[1]; + n[2] = a[2] - b[2]; + n[3] = a[3] - b[3]; + n[4] = a[4] - b[4]; + n[5] = a[5] - b[5]; + n[6] = a[6] - b[6]; + n[7] = a[7] - b[7]; + n[8] = a[8] - b[8]; + n[9] = a[9] - b[9]; + n[10] = a[10] - b[10]; + n[11] = a[11] - b[11]; + n[12] = a[12] - b[12]; + n[13] = a[13] - b[13]; + n[14] = a[14] - b[14]; + n[15] = a[15] - b[15]; + n[16] = a[16] - b[16]; + n[17] = a[17] - b[17]; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[17] += ((spint)0x1b00u) & carry; + (void)prop(n); +} + +// Modular negation +static void modneg(const spint *b, spint *n) { + spint carry; + n[0] = (spint)0 - b[0]; + n[1] = (spint)0 - b[1]; + n[2] = (spint)0 - b[2]; + n[3] = (spint)0 - b[3]; + n[4] = (spint)0 - b[4]; + n[5] = (spint)0 - b[5]; + n[6] = (spint)0 - b[6]; + n[7] = (spint)0 - b[7]; + n[8] = (spint)0 - b[8]; + n[9] = (spint)0 - b[9]; + n[10] = (spint)0 - b[10]; + n[11] = (spint)0 - b[11]; + n[12] = (spint)0 - b[12]; + n[13] = (spint)0 - b[13]; + n[14] = (spint)0 - b[14]; + n[15] = (spint)0 - b[15]; + n[16] = (spint)0 - b[16]; + n[17] = (spint)0 - b[17]; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[17] += ((spint)0x1b00u) & carry; + (void)prop(n); +} + +// Overflow limit = 18446744073709551616 +// maximum possible = 5188148641189065362 +// Modular multiplication, c=a*b mod 2p +static void modmul(const spint *a, const spint *b, spint *c) { + dpint t = 0; + spint p17 = 0xd80u; + spint q = ((spint)1 << 29u); // q is unsaturated radix + spint mask = (spint)(q - (spint)1); + t += (dpint)a[0] * b[0]; + spint v0 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[1]; + t += (dpint)a[1] * b[0]; + spint v1 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[2]; + t += (dpint)a[1] * b[1]; + t += (dpint)a[2] * b[0]; + spint v2 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[3]; + t += (dpint)a[1] * b[2]; + t += (dpint)a[2] * b[1]; + t += (dpint)a[3] * b[0]; + spint v3 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[4]; + t += (dpint)a[1] * b[3]; + t += (dpint)a[2] * b[2]; + t += (dpint)a[3] * b[1]; + t += (dpint)a[4] * b[0]; + spint v4 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[5]; + t += (dpint)a[1] * b[4]; + t += (dpint)a[2] * b[3]; + t += (dpint)a[3] * b[2]; + t += (dpint)a[4] * b[1]; + t += (dpint)a[5] * b[0]; + spint v5 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[6]; + t += (dpint)a[1] * b[5]; + t += (dpint)a[2] * b[4]; + t += (dpint)a[3] * b[3]; + t += (dpint)a[4] * b[2]; + t += (dpint)a[5] * b[1]; + t += (dpint)a[6] * b[0]; + spint v6 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[7]; + t += (dpint)a[1] * b[6]; + t += (dpint)a[2] * b[5]; + t += (dpint)a[3] * b[4]; + t += (dpint)a[4] * b[3]; + t += (dpint)a[5] * b[2]; + t += (dpint)a[6] * b[1]; + t += (dpint)a[7] * b[0]; + spint v7 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[8]; + t += (dpint)a[1] * b[7]; + t += (dpint)a[2] * b[6]; + t += (dpint)a[3] * b[5]; + t += (dpint)a[4] * b[4]; + t += (dpint)a[5] * b[3]; + t += (dpint)a[6] * b[2]; + t += (dpint)a[7] * b[1]; + t += (dpint)a[8] * b[0]; + spint v8 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[9]; + t += (dpint)a[1] * b[8]; + t += (dpint)a[2] * b[7]; + t += (dpint)a[3] * b[6]; + t += (dpint)a[4] * b[5]; + t += (dpint)a[5] * b[4]; + t += (dpint)a[6] * b[3]; + t += (dpint)a[7] * b[2]; + t += (dpint)a[8] * b[1]; + t += (dpint)a[9] * b[0]; + spint v9 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[10]; + t += (dpint)a[1] * b[9]; + t += (dpint)a[2] * b[8]; + t += (dpint)a[3] * b[7]; + t += (dpint)a[4] * b[6]; + t += (dpint)a[5] * b[5]; + t += (dpint)a[6] * b[4]; + t += (dpint)a[7] * b[3]; + t += (dpint)a[8] * b[2]; + t += (dpint)a[9] * b[1]; + t += (dpint)a[10] * b[0]; + spint v10 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[11]; + t += (dpint)a[1] * b[10]; + t += (dpint)a[2] * b[9]; + t += (dpint)a[3] * b[8]; + t += (dpint)a[4] * b[7]; + t += (dpint)a[5] * b[6]; + t += (dpint)a[6] * b[5]; + t += (dpint)a[7] * b[4]; + t += (dpint)a[8] * b[3]; + t += (dpint)a[9] * b[2]; + t += (dpint)a[10] * b[1]; + t += (dpint)a[11] * b[0]; + spint v11 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[12]; + t += (dpint)a[1] * b[11]; + t += (dpint)a[2] * b[10]; + t += (dpint)a[3] * b[9]; + t += (dpint)a[4] * b[8]; + t += (dpint)a[5] * b[7]; + t += (dpint)a[6] * b[6]; + t += (dpint)a[7] * b[5]; + t += (dpint)a[8] * b[4]; + t += (dpint)a[9] * b[3]; + t += (dpint)a[10] * b[2]; + t += (dpint)a[11] * b[1]; + t += (dpint)a[12] * b[0]; + spint v12 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[13]; + t += (dpint)a[1] * b[12]; + t += (dpint)a[2] * b[11]; + t += (dpint)a[3] * b[10]; + t += (dpint)a[4] * b[9]; + t += (dpint)a[5] * b[8]; + t += (dpint)a[6] * b[7]; + t += (dpint)a[7] * b[6]; + t += (dpint)a[8] * b[5]; + t += (dpint)a[9] * b[4]; + t += (dpint)a[10] * b[3]; + t += (dpint)a[11] * b[2]; + t += (dpint)a[12] * b[1]; + t += (dpint)a[13] * b[0]; + spint v13 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[14]; + t += (dpint)a[1] * b[13]; + t += (dpint)a[2] * b[12]; + t += (dpint)a[3] * b[11]; + t += (dpint)a[4] * b[10]; + t += (dpint)a[5] * b[9]; + t += (dpint)a[6] * b[8]; + t += (dpint)a[7] * b[7]; + t += (dpint)a[8] * b[6]; + t += (dpint)a[9] * b[5]; + t += (dpint)a[10] * b[4]; + t += (dpint)a[11] * b[3]; + t += (dpint)a[12] * b[2]; + t += (dpint)a[13] * b[1]; + t += (dpint)a[14] * b[0]; + spint v14 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[15]; + t += (dpint)a[1] * b[14]; + t += (dpint)a[2] * b[13]; + t += (dpint)a[3] * b[12]; + t += (dpint)a[4] * b[11]; + t += (dpint)a[5] * b[10]; + t += (dpint)a[6] * b[9]; + t += (dpint)a[7] * b[8]; + t += (dpint)a[8] * b[7]; + t += (dpint)a[9] * b[6]; + t += (dpint)a[10] * b[5]; + t += (dpint)a[11] * b[4]; + t += (dpint)a[12] * b[3]; + t += (dpint)a[13] * b[2]; + t += (dpint)a[14] * b[1]; + t += (dpint)a[15] * b[0]; + spint v15 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[16]; + t += (dpint)a[1] * b[15]; + t += (dpint)a[2] * b[14]; + t += (dpint)a[3] * b[13]; + t += (dpint)a[4] * b[12]; + t += (dpint)a[5] * b[11]; + t += (dpint)a[6] * b[10]; + t += (dpint)a[7] * b[9]; + t += (dpint)a[8] * b[8]; + t += (dpint)a[9] * b[7]; + t += (dpint)a[10] * b[6]; + t += (dpint)a[11] * b[5]; + t += (dpint)a[12] * b[4]; + t += (dpint)a[13] * b[3]; + t += (dpint)a[14] * b[2]; + t += (dpint)a[15] * b[1]; + t += (dpint)a[16] * b[0]; + spint v16 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[17]; + t += (dpint)a[1] * b[16]; + t += (dpint)a[2] * b[15]; + t += (dpint)a[3] * b[14]; + t += (dpint)a[4] * b[13]; + t += (dpint)a[5] * b[12]; + t += (dpint)a[6] * b[11]; + t += (dpint)a[7] * b[10]; + t += (dpint)a[8] * b[9]; + t += (dpint)a[9] * b[8]; + t += (dpint)a[10] * b[7]; + t += (dpint)a[11] * b[6]; + t += (dpint)a[12] * b[5]; + t += (dpint)a[13] * b[4]; + t += (dpint)a[14] * b[3]; + t += (dpint)a[15] * b[2]; + t += (dpint)a[16] * b[1]; + t += (dpint)a[17] * b[0]; + t += (dpint)v0 * (dpint)p17; + spint v17 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[1] * b[17]; + t += (dpint)a[2] * b[16]; + t += (dpint)a[3] * b[15]; + t += (dpint)a[4] * b[14]; + t += (dpint)a[5] * b[13]; + t += (dpint)a[6] * b[12]; + t += (dpint)a[7] * b[11]; + t += (dpint)a[8] * b[10]; + t += (dpint)a[9] * b[9]; + t += (dpint)a[10] * b[8]; + t += (dpint)a[11] * b[7]; + t += (dpint)a[12] * b[6]; + t += (dpint)a[13] * b[5]; + t += (dpint)a[14] * b[4]; + t += (dpint)a[15] * b[3]; + t += (dpint)a[16] * b[2]; + t += (dpint)a[17] * b[1]; + t += (dpint)v1 * (dpint)p17; + c[0] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[2] * b[17]; + t += (dpint)a[3] * b[16]; + t += (dpint)a[4] * b[15]; + t += (dpint)a[5] * b[14]; + t += (dpint)a[6] * b[13]; + t += (dpint)a[7] * b[12]; + t += (dpint)a[8] * b[11]; + t += (dpint)a[9] * b[10]; + t += (dpint)a[10] * b[9]; + t += (dpint)a[11] * b[8]; + t += (dpint)a[12] * b[7]; + t += (dpint)a[13] * b[6]; + t += (dpint)a[14] * b[5]; + t += (dpint)a[15] * b[4]; + t += (dpint)a[16] * b[3]; + t += (dpint)a[17] * b[2]; + t += (dpint)v2 * (dpint)p17; + c[1] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[3] * b[17]; + t += (dpint)a[4] * b[16]; + t += (dpint)a[5] * b[15]; + t += (dpint)a[6] * b[14]; + t += (dpint)a[7] * b[13]; + t += (dpint)a[8] * b[12]; + t += (dpint)a[9] * b[11]; + t += (dpint)a[10] * b[10]; + t += (dpint)a[11] * b[9]; + t += (dpint)a[12] * b[8]; + t += (dpint)a[13] * b[7]; + t += (dpint)a[14] * b[6]; + t += (dpint)a[15] * b[5]; + t += (dpint)a[16] * b[4]; + t += (dpint)a[17] * b[3]; + t += (dpint)v3 * (dpint)p17; + c[2] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[4] * b[17]; + t += (dpint)a[5] * b[16]; + t += (dpint)a[6] * b[15]; + t += (dpint)a[7] * b[14]; + t += (dpint)a[8] * b[13]; + t += (dpint)a[9] * b[12]; + t += (dpint)a[10] * b[11]; + t += (dpint)a[11] * b[10]; + t += (dpint)a[12] * b[9]; + t += (dpint)a[13] * b[8]; + t += (dpint)a[14] * b[7]; + t += (dpint)a[15] * b[6]; + t += (dpint)a[16] * b[5]; + t += (dpint)a[17] * b[4]; + t += (dpint)v4 * (dpint)p17; + c[3] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[5] * b[17]; + t += (dpint)a[6] * b[16]; + t += (dpint)a[7] * b[15]; + t += (dpint)a[8] * b[14]; + t += (dpint)a[9] * b[13]; + t += (dpint)a[10] * b[12]; + t += (dpint)a[11] * b[11]; + t += (dpint)a[12] * b[10]; + t += (dpint)a[13] * b[9]; + t += (dpint)a[14] * b[8]; + t += (dpint)a[15] * b[7]; + t += (dpint)a[16] * b[6]; + t += (dpint)a[17] * b[5]; + t += (dpint)v5 * (dpint)p17; + c[4] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[6] * b[17]; + t += (dpint)a[7] * b[16]; + t += (dpint)a[8] * b[15]; + t += (dpint)a[9] * b[14]; + t += (dpint)a[10] * b[13]; + t += (dpint)a[11] * b[12]; + t += (dpint)a[12] * b[11]; + t += (dpint)a[13] * b[10]; + t += (dpint)a[14] * b[9]; + t += (dpint)a[15] * b[8]; + t += (dpint)a[16] * b[7]; + t += (dpint)a[17] * b[6]; + t += (dpint)v6 * (dpint)p17; + c[5] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[7] * b[17]; + t += (dpint)a[8] * b[16]; + t += (dpint)a[9] * b[15]; + t += (dpint)a[10] * b[14]; + t += (dpint)a[11] * b[13]; + t += (dpint)a[12] * b[12]; + t += (dpint)a[13] * b[11]; + t += (dpint)a[14] * b[10]; + t += (dpint)a[15] * b[9]; + t += (dpint)a[16] * b[8]; + t += (dpint)a[17] * b[7]; + t += (dpint)v7 * (dpint)p17; + c[6] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[8] * b[17]; + t += (dpint)a[9] * b[16]; + t += (dpint)a[10] * b[15]; + t += (dpint)a[11] * b[14]; + t += (dpint)a[12] * b[13]; + t += (dpint)a[13] * b[12]; + t += (dpint)a[14] * b[11]; + t += (dpint)a[15] * b[10]; + t += (dpint)a[16] * b[9]; + t += (dpint)a[17] * b[8]; + t += (dpint)v8 * (dpint)p17; + c[7] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[9] * b[17]; + t += (dpint)a[10] * b[16]; + t += (dpint)a[11] * b[15]; + t += (dpint)a[12] * b[14]; + t += (dpint)a[13] * b[13]; + t += (dpint)a[14] * b[12]; + t += (dpint)a[15] * b[11]; + t += (dpint)a[16] * b[10]; + t += (dpint)a[17] * b[9]; + t += (dpint)v9 * (dpint)p17; + c[8] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[10] * b[17]; + t += (dpint)a[11] * b[16]; + t += (dpint)a[12] * b[15]; + t += (dpint)a[13] * b[14]; + t += (dpint)a[14] * b[13]; + t += (dpint)a[15] * b[12]; + t += (dpint)a[16] * b[11]; + t += (dpint)a[17] * b[10]; + t += (dpint)v10 * (dpint)p17; + c[9] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[11] * b[17]; + t += (dpint)a[12] * b[16]; + t += (dpint)a[13] * b[15]; + t += (dpint)a[14] * b[14]; + t += (dpint)a[15] * b[13]; + t += (dpint)a[16] * b[12]; + t += (dpint)a[17] * b[11]; + t += (dpint)v11 * (dpint)p17; + c[10] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[12] * b[17]; + t += (dpint)a[13] * b[16]; + t += (dpint)a[14] * b[15]; + t += (dpint)a[15] * b[14]; + t += (dpint)a[16] * b[13]; + t += (dpint)a[17] * b[12]; + t += (dpint)v12 * (dpint)p17; + c[11] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[13] * b[17]; + t += (dpint)a[14] * b[16]; + t += (dpint)a[15] * b[15]; + t += (dpint)a[16] * b[14]; + t += (dpint)a[17] * b[13]; + t += (dpint)v13 * (dpint)p17; + c[12] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[14] * b[17]; + t += (dpint)a[15] * b[16]; + t += (dpint)a[16] * b[15]; + t += (dpint)a[17] * b[14]; + t += (dpint)v14 * (dpint)p17; + c[13] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[15] * b[17]; + t += (dpint)a[16] * b[16]; + t += (dpint)a[17] * b[15]; + t += (dpint)v15 * (dpint)p17; + c[14] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[16] * b[17]; + t += (dpint)a[17] * b[16]; + t += (dpint)v16 * (dpint)p17; + c[15] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[17] * b[17]; + t += (dpint)v17 * (dpint)p17; + c[16] = ((spint)t & mask); + t >>= 29; + c[17] = (spint)t; +} + +// Modular squaring, c=a*a mod 2p +static void modsqr(const spint *a, spint *c) { + udpint tot; + udpint t = 0; + spint p17 = 0xd80u; + spint q = ((spint)1 << 29u); // q is unsaturated radix + spint mask = (spint)(q - (spint)1); + tot = (udpint)a[0] * a[0]; + t = tot; + spint v0 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[1]; + tot *= 2; + t += tot; + spint v1 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[2]; + tot *= 2; + tot += (udpint)a[1] * a[1]; + t += tot; + spint v2 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[3]; + tot += (udpint)a[1] * a[2]; + tot *= 2; + t += tot; + spint v3 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[4]; + tot += (udpint)a[1] * a[3]; + tot *= 2; + tot += (udpint)a[2] * a[2]; + t += tot; + spint v4 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[5]; + tot += (udpint)a[1] * a[4]; + tot += (udpint)a[2] * a[3]; + tot *= 2; + t += tot; + spint v5 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[6]; + tot += (udpint)a[1] * a[5]; + tot += (udpint)a[2] * a[4]; + tot *= 2; + tot += (udpint)a[3] * a[3]; + t += tot; + spint v6 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[7]; + tot += (udpint)a[1] * a[6]; + tot += (udpint)a[2] * a[5]; + tot += (udpint)a[3] * a[4]; + tot *= 2; + t += tot; + spint v7 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[8]; + tot += (udpint)a[1] * a[7]; + tot += (udpint)a[2] * a[6]; + tot += (udpint)a[3] * a[5]; + tot *= 2; + tot += (udpint)a[4] * a[4]; + t += tot; + spint v8 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[9]; + tot += (udpint)a[1] * a[8]; + tot += (udpint)a[2] * a[7]; + tot += (udpint)a[3] * a[6]; + tot += (udpint)a[4] * a[5]; + tot *= 2; + t += tot; + spint v9 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[10]; + tot += (udpint)a[1] * a[9]; + tot += (udpint)a[2] * a[8]; + tot += (udpint)a[3] * a[7]; + tot += (udpint)a[4] * a[6]; + tot *= 2; + tot += (udpint)a[5] * a[5]; + t += tot; + spint v10 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[11]; + tot += (udpint)a[1] * a[10]; + tot += (udpint)a[2] * a[9]; + tot += (udpint)a[3] * a[8]; + tot += (udpint)a[4] * a[7]; + tot += (udpint)a[5] * a[6]; + tot *= 2; + t += tot; + spint v11 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[12]; + tot += (udpint)a[1] * a[11]; + tot += (udpint)a[2] * a[10]; + tot += (udpint)a[3] * a[9]; + tot += (udpint)a[4] * a[8]; + tot += (udpint)a[5] * a[7]; + tot *= 2; + tot += (udpint)a[6] * a[6]; + t += tot; + spint v12 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[13]; + tot += (udpint)a[1] * a[12]; + tot += (udpint)a[2] * a[11]; + tot += (udpint)a[3] * a[10]; + tot += (udpint)a[4] * a[9]; + tot += (udpint)a[5] * a[8]; + tot += (udpint)a[6] * a[7]; + tot *= 2; + t += tot; + spint v13 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[14]; + tot += (udpint)a[1] * a[13]; + tot += (udpint)a[2] * a[12]; + tot += (udpint)a[3] * a[11]; + tot += (udpint)a[4] * a[10]; + tot += (udpint)a[5] * a[9]; + tot += (udpint)a[6] * a[8]; + tot *= 2; + tot += (udpint)a[7] * a[7]; + t += tot; + spint v14 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[15]; + tot += (udpint)a[1] * a[14]; + tot += (udpint)a[2] * a[13]; + tot += (udpint)a[3] * a[12]; + tot += (udpint)a[4] * a[11]; + tot += (udpint)a[5] * a[10]; + tot += (udpint)a[6] * a[9]; + tot += (udpint)a[7] * a[8]; + tot *= 2; + t += tot; + spint v15 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[16]; + tot += (udpint)a[1] * a[15]; + tot += (udpint)a[2] * a[14]; + tot += (udpint)a[3] * a[13]; + tot += (udpint)a[4] * a[12]; + tot += (udpint)a[5] * a[11]; + tot += (udpint)a[6] * a[10]; + tot += (udpint)a[7] * a[9]; + tot *= 2; + tot += (udpint)a[8] * a[8]; + t += tot; + spint v16 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[17]; + tot += (udpint)a[1] * a[16]; + tot += (udpint)a[2] * a[15]; + tot += (udpint)a[3] * a[14]; + tot += (udpint)a[4] * a[13]; + tot += (udpint)a[5] * a[12]; + tot += (udpint)a[6] * a[11]; + tot += (udpint)a[7] * a[10]; + tot += (udpint)a[8] * a[9]; + tot *= 2; + t += tot; + t += (udpint)v0 * p17; + spint v17 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[1] * a[17]; + tot += (udpint)a[2] * a[16]; + tot += (udpint)a[3] * a[15]; + tot += (udpint)a[4] * a[14]; + tot += (udpint)a[5] * a[13]; + tot += (udpint)a[6] * a[12]; + tot += (udpint)a[7] * a[11]; + tot += (udpint)a[8] * a[10]; + tot *= 2; + tot += (udpint)a[9] * a[9]; + t += tot; + t += (udpint)v1 * p17; + c[0] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[2] * a[17]; + tot += (udpint)a[3] * a[16]; + tot += (udpint)a[4] * a[15]; + tot += (udpint)a[5] * a[14]; + tot += (udpint)a[6] * a[13]; + tot += (udpint)a[7] * a[12]; + tot += (udpint)a[8] * a[11]; + tot += (udpint)a[9] * a[10]; + tot *= 2; + t += tot; + t += (udpint)v2 * p17; + c[1] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[3] * a[17]; + tot += (udpint)a[4] * a[16]; + tot += (udpint)a[5] * a[15]; + tot += (udpint)a[6] * a[14]; + tot += (udpint)a[7] * a[13]; + tot += (udpint)a[8] * a[12]; + tot += (udpint)a[9] * a[11]; + tot *= 2; + tot += (udpint)a[10] * a[10]; + t += tot; + t += (udpint)v3 * p17; + c[2] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[4] * a[17]; + tot += (udpint)a[5] * a[16]; + tot += (udpint)a[6] * a[15]; + tot += (udpint)a[7] * a[14]; + tot += (udpint)a[8] * a[13]; + tot += (udpint)a[9] * a[12]; + tot += (udpint)a[10] * a[11]; + tot *= 2; + t += tot; + t += (udpint)v4 * p17; + c[3] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[5] * a[17]; + tot += (udpint)a[6] * a[16]; + tot += (udpint)a[7] * a[15]; + tot += (udpint)a[8] * a[14]; + tot += (udpint)a[9] * a[13]; + tot += (udpint)a[10] * a[12]; + tot *= 2; + tot += (udpint)a[11] * a[11]; + t += tot; + t += (udpint)v5 * p17; + c[4] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[6] * a[17]; + tot += (udpint)a[7] * a[16]; + tot += (udpint)a[8] * a[15]; + tot += (udpint)a[9] * a[14]; + tot += (udpint)a[10] * a[13]; + tot += (udpint)a[11] * a[12]; + tot *= 2; + t += tot; + t += (udpint)v6 * p17; + c[5] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[7] * a[17]; + tot += (udpint)a[8] * a[16]; + tot += (udpint)a[9] * a[15]; + tot += (udpint)a[10] * a[14]; + tot += (udpint)a[11] * a[13]; + tot *= 2; + tot += (udpint)a[12] * a[12]; + t += tot; + t += (udpint)v7 * p17; + c[6] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[8] * a[17]; + tot += (udpint)a[9] * a[16]; + tot += (udpint)a[10] * a[15]; + tot += (udpint)a[11] * a[14]; + tot += (udpint)a[12] * a[13]; + tot *= 2; + t += tot; + t += (udpint)v8 * p17; + c[7] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[9] * a[17]; + tot += (udpint)a[10] * a[16]; + tot += (udpint)a[11] * a[15]; + tot += (udpint)a[12] * a[14]; + tot *= 2; + tot += (udpint)a[13] * a[13]; + t += tot; + t += (udpint)v9 * p17; + c[8] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[10] * a[17]; + tot += (udpint)a[11] * a[16]; + tot += (udpint)a[12] * a[15]; + tot += (udpint)a[13] * a[14]; + tot *= 2; + t += tot; + t += (udpint)v10 * p17; + c[9] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[11] * a[17]; + tot += (udpint)a[12] * a[16]; + tot += (udpint)a[13] * a[15]; + tot *= 2; + tot += (udpint)a[14] * a[14]; + t += tot; + t += (udpint)v11 * p17; + c[10] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[12] * a[17]; + tot += (udpint)a[13] * a[16]; + tot += (udpint)a[14] * a[15]; + tot *= 2; + t += tot; + t += (udpint)v12 * p17; + c[11] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[13] * a[17]; + tot += (udpint)a[14] * a[16]; + tot *= 2; + tot += (udpint)a[15] * a[15]; + t += tot; + t += (udpint)v13 * p17; + c[12] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[14] * a[17]; + tot += (udpint)a[15] * a[16]; + tot *= 2; + t += tot; + t += (udpint)v14 * p17; + c[13] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[15] * a[17]; + tot *= 2; + tot += (udpint)a[16] * a[16]; + t += tot; + t += (udpint)v15 * p17; + c[14] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[16] * a[17]; + tot *= 2; + t += tot; + t += (udpint)v16 * p17; + c[15] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[17] * a[17]; + t += tot; + t += (udpint)v17 * p17; + c[16] = ((spint)t & mask); + t >>= 29; + c[17] = (spint)t; +} + +// copy +static void modcpy(const spint *a, spint *c) { + int i; + for (i = 0; i < 18; i++) { + c[i] = a[i]; + } +} + +// square n times +static void modnsqr(spint *a, int n) { + int i; + for (i = 0; i < n; i++) { + modsqr(a, a); + } +} + +// Calculate progenitor +static void modpro(const spint *w, spint *z) { + spint x[18]; + spint t0[18]; + spint t1[18]; + spint t2[18]; + spint t3[18]; + spint t4[18]; + spint t5[18]; + spint t6[18]; + modcpy(w, x); + modcpy(x, z); + modnsqr(z, 2); + modmul(x, z, t0); + modmul(x, t0, z); + modsqr(z, t1); + modmul(x, t1, t1); + modsqr(t1, t3); + modsqr(t3, t2); + modmul(t3, t2, t4); + modsqr(t4, t5); + modcpy(t5, t2); + modnsqr(t2, 2); + modsqr(t2, t6); + modmul(t2, t6, t6); + modmul(t5, t6, t5); + modnsqr(t5, 5); + modmul(t2, t5, t2); + modcpy(t2, t5); + modnsqr(t5, 12); + modmul(t2, t5, t2); + modcpy(t2, t5); + modnsqr(t5, 2); + modmul(t2, t5, t5); + modmul(t4, t5, t4); + modsqr(t4, t5); + modmul(t2, t5, t2); + modmul(t4, t2, t4); + modnsqr(t4, 27); + modmul(t2, t4, t2); + modmul(t1, t2, t2); + modcpy(t2, t4); + modnsqr(t4, 2); + modmul(t3, t4, t3); + modnsqr(t3, 58); + modmul(t2, t3, t2); + modmul(z, t2, z); + modcpy(z, t2); + modnsqr(t2, 4); + modmul(t1, t2, t1); + modmul(t0, t1, t0); + modmul(t1, t0, t1); + modsqr(t1, t2); + modmul(t0, t2, t0); + modcpy(t0, t2); + modnsqr(t2, 2); + modmul(t0, t2, t2); + modmul(t1, t2, t1); + modmul(t0, t1, t0); + modnsqr(t1, 128); + modmul(t0, t1, t1); + modnsqr(t1, 128); + modmul(t0, t1, t0); + modnsqr(t0, 119); + modmul(z, t0, z); +} + +// calculate inverse, provide progenitor h if available +static void modinv(const spint *x, const spint *h, spint *z) { + spint s[18]; + spint t[18]; + if (h == NULL) { + modpro(x, t); + } else { + modcpy(h, t); + } + modcpy(x, s); + modnsqr(t, 2); + modmul(s, t, z); +} + +// Convert m to n-residue form, n=nres(m) +static void nres(const spint *m, spint *n) { + const spint c[18] = {0x19a29700u, 0x12f6878u, 0x17b425edu, 0x1a12f684u, + 0x97b425eu, 0x1da12f68u, 0x1097b425u, 0xbda12f6u, + 0xd097b42u, 0x4bda12fu, 0x1ed097b4u, 0x84bda12u, + 0x5ed097bu, 0x1684bda1u, 0x25ed097u, 0xf684bdau, + 0x1425ed09u, 0x4bdu}; + modmul(m, c, n); +} + +// Convert n back to normal form, m=redc(n) +static void redc(const spint *n, spint *m) { + int i; + spint c[18]; + c[0] = 1; + for (i = 1; i < 18; i++) { + c[i] = 0; + } + modmul(n, c, m); + (void)modfsb(m); +} + +// is unity? +static int modis1(const spint *a) { + int i; + spint c[18]; + spint c0; + spint d = 0; + redc(a, c); + for (i = 1; i < 18; i++) { + d |= c[i]; + } + c0 = (spint)c[0]; + return ((spint)1 & ((d - (spint)1) >> 29u) & + (((c0 ^ (spint)1) - (spint)1) >> 29u)); +} + +// is zero? +static int modis0(const spint *a) { + int i; + spint c[18]; + spint d = 0; + redc(a, c); + for (i = 0; i < 18; i++) { + d |= c[i]; + } + return ((spint)1 & ((d - (spint)1) >> 29u)); +} + +// set to zero +static void modzer(spint *a) { + int i; + for (i = 0; i < 18; i++) { + a[i] = 0; + } +} + +// set to one +static void modone(spint *a) { + int i; + a[0] = 1; + for (i = 1; i < 18; i++) { + a[i] = 0; + } + nres(a, a); +} + +// set to integer +static void modint(int x, spint *a) { + int i; + a[0] = (spint)x; + for (i = 1; i < 18; i++) { + a[i] = 0; + } + nres(a, a); +} + +// Modular multiplication by an integer, c=a*b mod 2p +static void modmli(const spint *a, int b, spint *c) { + spint t[18]; + modint(b, t); + modmul(a, t, c); +} + +// Test for quadratic residue +static int modqr(const spint *h, const spint *x) { + spint r[18]; + if (h == NULL) { + modpro(x, r); + modsqr(r, r); + } else { + modsqr(h, r); + } + modmul(r, x, r); + return modis1(r) | modis0(x); +} + +// conditional move g to f if d=1 +// strongly recommend inlining be disabled using compiler specific syntax +static void modcmv(int b, const spint *g, volatile spint *f) { + int i; + spint c0, c1, s, t; + spint r = 0x5aa5a55au; + c0 = (1 - b) + r; + c1 = b + r; + for (i = 0; i < 18; i++) { + s = g[i]; + t = f[i]; + f[i] = c0 * t + c1 * s; + f[i] -= r * (t + s); + } +} + +// conditional swap g and f if d=1 +// strongly recommend inlining be disabled using compiler specific syntax +static void modcsw(int b, volatile spint *g, volatile spint *f) { + int i; + spint c0, c1, s, t, w; + spint r = 0x5aa5a55au; + c0 = (1 - b) + r; + c1 = b + r; + for (i = 0; i < 18; i++) { + s = g[i]; + t = f[i]; + w = r * (t + s); + f[i] = c0 * t + c1 * s; + f[i] -= w; + g[i] = c0 * s + c1 * t; + g[i] -= w; + } +} + +// Modular square root, provide progenitor h if available, NULL if not +static void modsqrt(const spint *x, const spint *h, spint *r) { + spint s[18]; + spint y[18]; + if (h == NULL) { + modpro(x, y); + } else { + modcpy(h, y); + } + modmul(y, x, s); + modcpy(s, r); +} + +// shift left by less than a word +static void modshl(unsigned int n, spint *a) { + int i; + a[17] = ((a[17] << n)) | (a[16] >> (29u - n)); + for (i = 16; i > 0; i--) { + a[i] = ((a[i] << n) & (spint)0x1fffffff) | (a[i - 1] >> (29u - n)); + } + a[0] = (a[0] << n) & (spint)0x1fffffff; +} + +// shift right by less than a word. Return shifted out part +static int modshr(unsigned int n, spint *a) { + int i; + spint r = a[0] & (((spint)1 << n) - (spint)1); + for (i = 0; i < 17; i++) { + a[i] = (a[i] >> n) | ((a[i + 1] << (29u - n)) & (spint)0x1fffffff); + } + a[17] = a[17] >> n; + return r; +} + +// set a= 2^r +static void mod2r(unsigned int r, spint *a) { + unsigned int n = r / 29u; + unsigned int m = r % 29u; + modzer(a); + if (r >= 64 * 8) + return; + a[n] = 1; + a[n] <<= m; + nres(a, a); +} + +// export to byte array +static void modexp(const spint *a, char *b) { + int i; + spint c[18]; + redc(a, c); + for (i = 63; i >= 0; i--) { + b[i] = c[0] & (spint)0xff; + (void)modshr(8, c); + } +} + +// import from byte array +// returns 1 if in range, else 0 +static int modimp(const char *b, spint *a) { + int i, res; + for (i = 0; i < 18; i++) { + a[i] = 0; + } + for (i = 0; i < 64; i++) { + modshl(8, a); + a[0] += (spint)(unsigned char)b[i]; + } + res = modfsb(a); + nres(a, a); + return res; +} + +// determine sign +static int modsign(const spint *a) { + spint c[18]; + redc(a, c); + return c[0] % 2; +} + +// return true if equal +static int modcmp(const spint *a, const spint *b) { + spint c[18], d[18]; + int i, eq = 1; + redc(a, c); + redc(b, d); + for (i = 0; i < 18; i++) { + eq &= (((c[i] ^ d[i]) - 1) >> 29) & 1; + } + return eq; +} + +// clang-format on +/****************************************************************************** + API functions calling generated code above + ******************************************************************************/ + +#include + +const digit_t ZERO[NWORDS_FIELD] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; +const digit_t ONE[NWORDS_FIELD] = { 0x00025ed0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000800 }; +// Montgomery representation of 2^-1 +static const digit_t TWO_INV[NWORDS_FIELD] = { 0x00012f68, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400 }; +// Montgomery representation of 3^-1 +static const digit_t THREE_INV[NWORDS_FIELD] = { + 0x15561f9a, 0x0aaaaaaa, 0x15555555, 0x0aaaaaaa, 0x15555555, 0x0aaaaaaa, 0x15555555, 0x0aaaaaaa, 0x15555555, + 0x0aaaaaaa, 0x15555555, 0x0aaaaaaa, 0x15555555, 0x0aaaaaaa, 0x15555555, 0x0aaaaaaa, 0x15555555, 0x00000baa +}; +// Montgomery representation of 2^512 +static const digit_t R2[NWORDS_FIELD] = { 0x03c668a5, 0x0f684bda, 0x1425ed09, 0x12f684bd, 0x1b425ed0, 0x012f684b, + 0x17b425ed, 0x1a12f684, 0x097b425e, 0x1da12f68, 0x1097b425, 0x0bda12f6, + 0x0d097b42, 0x04bda12f, 0x1ed097b4, 0x084bda12, 0x05ed097b, 0x00000a21 }; + +void +fp_set_small(fp_t *x, const digit_t val) +{ + modint((int)val, *x); +} + +void +fp_mul_small(fp_t *x, const fp_t *a, const uint32_t val) +{ + modmli(*a, (int)val, *x); +} + +void +fp_set_zero(fp_t *x) +{ + modzer(*x); +} + +void +fp_set_one(fp_t *x) +{ + modone(*x); +} + +uint32_t +fp_is_equal(const fp_t *a, const fp_t *b) +{ + return -(uint32_t)modcmp(*a, *b); +} + +uint32_t +fp_is_zero(const fp_t *a) +{ + return -(uint32_t)modis0(*a); +} + +void +fp_copy(fp_t *out, const fp_t *a) +{ + modcpy(*a, *out); +} + +void +fp_cswap(fp_t *a, fp_t *b, uint32_t ctl) +{ + modcsw((int)(ctl & 0x1), *a, *b); +} + +void +fp_add(fp_t *out, const fp_t *a, const fp_t *b) +{ + modadd(*a, *b, *out); +} + +void +fp_sub(fp_t *out, const fp_t *a, const fp_t *b) +{ + modsub(*a, *b, *out); +} + +void +fp_neg(fp_t *out, const fp_t *a) +{ + modneg(*a, *out); +} + +void +fp_sqr(fp_t *out, const fp_t *a) +{ + modsqr(*a, *out); +} + +void +fp_mul(fp_t *out, const fp_t *a, const fp_t *b) +{ + modmul(*a, *b, *out); +} + +void +fp_inv(fp_t *x) +{ + modinv(*x, NULL, *x); +} + +uint32_t +fp_is_square(const fp_t *a) +{ + return -(uint32_t)modqr(NULL, *a); +} + +void +fp_sqrt(fp_t *a) +{ + modsqrt(*a, NULL, *a); +} + +void +fp_half(fp_t *out, const fp_t *a) +{ + modmul(TWO_INV, *a, *out); +} + +void +fp_exp3div4(fp_t *out, const fp_t *a) +{ + modpro(*a, *out); +} + +void +fp_div3(fp_t *out, const fp_t *a) +{ + modmul(THREE_INV, *a, *out); +} + +void +fp_encode(void *dst, const fp_t *a) +{ + // Modified version of modexp() + int i; + spint c[18]; + redc(*a, c); + for (i = 0; i < 64; i++) { + ((char *)dst)[i] = c[0] & (spint)0xff; + (void)modshr(8, c); + } +} + +uint32_t +fp_decode(fp_t *d, const void *src) +{ + // Modified version of modimp() + int i; + spint res; + const unsigned char *b = src; + for (i = 0; i < 18; i++) { + (*d)[i] = 0; + } + for (i = 63; i >= 0; i--) { + modshl(8, *d); + (*d)[0] += (spint)b[i]; + } + res = (spint)-modfsb(*d); + nres(*d, *d); + // If the value was canonical then res = -1; otherwise, res = 0 + for (i = 0; i < 18; i++) { + (*d)[i] &= res; + } + return (uint32_t)res; +} + +static inline unsigned char +add_carry(unsigned char cc, spint a, spint b, spint *d) +{ + udpint t = (udpint)a + (udpint)b + cc; + *d = (spint)t; + return (unsigned char)(t >> Wordlength); +} + +static void +partial_reduce(spint *out, const spint *src) +{ + spint h, l, quo, rem; + unsigned char cc; + + // Split value in high (12 bits) and low (500 bits) parts. + h = src[15] >> 20; + l = src[15] & 0x000FFFFF; + + // 27*2^500 = 1 mod q; hence, we add floor(h/27) + (h mod 27)*2^500 + // to the low part. + quo = (h * 0x12F7) >> 17; + rem = h - (27 * quo); + cc = add_carry(0, src[0], quo, &out[0]); + cc = add_carry(cc, src[1], 0, &out[1]); + cc = add_carry(cc, src[2], 0, &out[2]); + cc = add_carry(cc, src[3], 0, &out[3]); + cc = add_carry(cc, src[4], 0, &out[4]); + cc = add_carry(cc, src[5], 0, &out[5]); + cc = add_carry(cc, src[6], 0, &out[6]); + cc = add_carry(cc, src[7], 0, &out[7]); + cc = add_carry(cc, src[8], 0, &out[8]); + cc = add_carry(cc, src[9], 0, &out[9]); + cc = add_carry(cc, src[10], 0, &out[10]); + cc = add_carry(cc, src[11], 0, &out[11]); + cc = add_carry(cc, src[12], 0, &out[12]); + cc = add_carry(cc, src[13], 0, &out[13]); + cc = add_carry(cc, src[14], 0, &out[14]); + (void)add_carry(cc, l, rem << 20, &out[15]); +} + +// Little-endian encoding of a 32-bit integer. +static inline void +enc32le(void *dst, uint32_t x) +{ + uint8_t *buf = dst; + buf[0] = (uint8_t)x; + buf[1] = (uint8_t)(x >> 8); + buf[2] = (uint8_t)(x >> 16); + buf[3] = (uint8_t)(x >> 24); +} + +// Little-endian decoding of a 32-bit integer. +static inline uint32_t +dec32le(const void *src) +{ + const uint8_t *buf = src; + return (spint)buf[0] | ((spint)buf[1] << 8) | ((spint)buf[2] << 16) | ((spint)buf[3] << 24); +} + +void +fp_decode_reduce(fp_t *d, const void *src, size_t len) +{ + uint32_t t[16]; // Stores Nbytes * 8 bits + uint8_t tmp[64]; // Nbytes + const uint8_t *b = src; + + fp_set_zero(d); + if (len == 0) { + return; + } + + size_t rem = len % 64; + if (rem != 0) { + // Input size is not a multiple of 64, we decode a partial + // block, which is already less than 2^500. + size_t k = len - rem; + memcpy(tmp, b + k, len - k); + memset(tmp + len - k, 0, (sizeof tmp) - (len - k)); + fp_decode(d, tmp); + len = k; + } + // Process all remaining blocks, in descending address order. + while (len > 0) { + fp_mul(d, d, &R2); + len -= 64; + t[0] = dec32le(b + len); + t[1] = dec32le(b + len + 4); + t[2] = dec32le(b + len + 8); + t[3] = dec32le(b + len + 12); + t[4] = dec32le(b + len + 16); + t[5] = dec32le(b + len + 20); + t[6] = dec32le(b + len + 24); + t[7] = dec32le(b + len + 28); + t[8] = dec32le(b + len + 32); + t[9] = dec32le(b + len + 36); + t[10] = dec32le(b + len + 40); + t[11] = dec32le(b + len + 44); + t[12] = dec32le(b + len + 48); + t[13] = dec32le(b + len + 52); + t[14] = dec32le(b + len + 56); + t[15] = dec32le(b + len + 60); + partial_reduce(t, t); + enc32le(tmp, t[0]); + enc32le(tmp + 4, t[1]); + enc32le(tmp + 8, t[2]); + enc32le(tmp + 12, t[3]); + enc32le(tmp + 16, t[4]); + enc32le(tmp + 20, t[5]); + enc32le(tmp + 24, t[6]); + enc32le(tmp + 28, t[7]); + enc32le(tmp + 32, t[8]); + enc32le(tmp + 36, t[9]); + enc32le(tmp + 40, t[10]); + enc32le(tmp + 44, t[11]); + enc32le(tmp + 48, t[12]); + enc32le(tmp + 52, t[13]); + enc32le(tmp + 56, t[14]); + enc32le(tmp + 60, t[15]); + fp_t a; + fp_decode(&a, tmp); + fp_add(d, d, &a); + } +} diff --git a/src/gf/ref/lvl5/fp_p27500_64.c b/src/gf/ref/lvl5/fp_p27500_64.c new file mode 100644 index 0000000..33bb75e --- /dev/null +++ b/src/gf/ref/lvl5/fp_p27500_64.c @@ -0,0 +1,970 @@ +// clang-format off +// Command line : python monty.py 64 +// 0x1afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +#include +#include + +#define sspint int64_t +#define spint uint64_t +#define udpint __uint128_t +#define dpint __uint128_t + +#define Wordlength 64 +#define Nlimbs 9 +#define Radix 57 +#define Nbits 505 +#define Nbytes 64 + +#define MONTGOMERY +// propagate carries +inline static spint prop(spint *n) { + int i; + spint mask = ((spint)1 << 57u) - (spint)1; + sspint carry = (sspint)n[0]; + carry >>= 57u; + n[0] &= mask; + for (i = 1; i < 8; i++) { + carry += (sspint)n[i]; + n[i] = (spint)carry & mask; + carry >>= 57u; + } + n[8] += (spint)carry; + return -((n[8] >> 1) >> 62u); +} + +// propagate carries and add p if negative, propagate carries again +inline static int flatten(spint *n) { + spint carry = prop(n); + n[0] -= (spint)1u & carry; + n[8] += ((spint)0x1b00000000000u) & carry; + (void)prop(n); + return (int)(carry & 1); +} + +// Montgomery final subtract +inline static int modfsb(spint *n) { + n[0] += (spint)1u; + n[8] -= (spint)0x1b00000000000u; + return flatten(n); +} + +// Modular addition - reduce less than 2p +inline static void modadd(const spint *a, const spint *b, spint *n) { + spint carry; + n[0] = a[0] + b[0]; + n[1] = a[1] + b[1]; + n[2] = a[2] + b[2]; + n[3] = a[3] + b[3]; + n[4] = a[4] + b[4]; + n[5] = a[5] + b[5]; + n[6] = a[6] + b[6]; + n[7] = a[7] + b[7]; + n[8] = a[8] + b[8]; + n[0] += (spint)2u; + n[8] -= (spint)0x3600000000000u; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[8] += ((spint)0x3600000000000u) & carry; + (void)prop(n); +} + +// Modular subtraction - reduce less than 2p +inline static void modsub(const spint *a, const spint *b, spint *n) { + spint carry; + n[0] = a[0] - b[0]; + n[1] = a[1] - b[1]; + n[2] = a[2] - b[2]; + n[3] = a[3] - b[3]; + n[4] = a[4] - b[4]; + n[5] = a[5] - b[5]; + n[6] = a[6] - b[6]; + n[7] = a[7] - b[7]; + n[8] = a[8] - b[8]; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[8] += ((spint)0x3600000000000u) & carry; + (void)prop(n); +} + +// Modular negation +inline static void modneg(const spint *b, spint *n) { + spint carry; + n[0] = (spint)0 - b[0]; + n[1] = (spint)0 - b[1]; + n[2] = (spint)0 - b[2]; + n[3] = (spint)0 - b[3]; + n[4] = (spint)0 - b[4]; + n[5] = (spint)0 - b[5]; + n[6] = (spint)0 - b[6]; + n[7] = (spint)0 - b[7]; + n[8] = (spint)0 - b[8]; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[8] += ((spint)0x3600000000000u) & carry; + (void)prop(n); +} + +// Overflow limit = 340282366920938463463374607431768211456 +// maximum possible = 186991140039668477603471750259015689 +// Modular multiplication, c=a*b mod 2p +inline static void modmul(const spint *a, const spint *b, spint *c) { + dpint t = 0; + spint p8 = 0x1b00000000000u; + spint q = ((spint)1 << 57u); // q is unsaturated radix + spint mask = (spint)(q - (spint)1); + t += (dpint)a[0] * b[0]; + spint v0 = ((spint)t & mask); + t >>= 57; + t += (dpint)a[0] * b[1]; + t += (dpint)a[1] * b[0]; + spint v1 = ((spint)t & mask); + t >>= 57; + t += (dpint)a[0] * b[2]; + t += (dpint)a[1] * b[1]; + t += (dpint)a[2] * b[0]; + spint v2 = ((spint)t & mask); + t >>= 57; + t += (dpint)a[0] * b[3]; + t += (dpint)a[1] * b[2]; + t += (dpint)a[2] * b[1]; + t += (dpint)a[3] * b[0]; + spint v3 = ((spint)t & mask); + t >>= 57; + t += (dpint)a[0] * b[4]; + t += (dpint)a[1] * b[3]; + t += (dpint)a[2] * b[2]; + t += (dpint)a[3] * b[1]; + t += (dpint)a[4] * b[0]; + spint v4 = ((spint)t & mask); + t >>= 57; + t += (dpint)a[0] * b[5]; + t += (dpint)a[1] * b[4]; + t += (dpint)a[2] * b[3]; + t += (dpint)a[3] * b[2]; + t += (dpint)a[4] * b[1]; + t += (dpint)a[5] * b[0]; + spint v5 = ((spint)t & mask); + t >>= 57; + t += (dpint)a[0] * b[6]; + t += (dpint)a[1] * b[5]; + t += (dpint)a[2] * b[4]; + t += (dpint)a[3] * b[3]; + t += (dpint)a[4] * b[2]; + t += (dpint)a[5] * b[1]; + t += (dpint)a[6] * b[0]; + spint v6 = ((spint)t & mask); + t >>= 57; + t += (dpint)a[0] * b[7]; + t += (dpint)a[1] * b[6]; + t += (dpint)a[2] * b[5]; + t += (dpint)a[3] * b[4]; + t += (dpint)a[4] * b[3]; + t += (dpint)a[5] * b[2]; + t += (dpint)a[6] * b[1]; + t += (dpint)a[7] * b[0]; + spint v7 = ((spint)t & mask); + t >>= 57; + t += (dpint)a[0] * b[8]; + t += (dpint)a[1] * b[7]; + t += (dpint)a[2] * b[6]; + t += (dpint)a[3] * b[5]; + t += (dpint)a[4] * b[4]; + t += (dpint)a[5] * b[3]; + t += (dpint)a[6] * b[2]; + t += (dpint)a[7] * b[1]; + t += (dpint)a[8] * b[0]; + t += (dpint)v0 * (dpint)p8; + spint v8 = ((spint)t & mask); + t >>= 57; + t += (dpint)a[1] * b[8]; + t += (dpint)a[2] * b[7]; + t += (dpint)a[3] * b[6]; + t += (dpint)a[4] * b[5]; + t += (dpint)a[5] * b[4]; + t += (dpint)a[6] * b[3]; + t += (dpint)a[7] * b[2]; + t += (dpint)a[8] * b[1]; + t += (dpint)v1 * (dpint)p8; + c[0] = ((spint)t & mask); + t >>= 57; + t += (dpint)a[2] * b[8]; + t += (dpint)a[3] * b[7]; + t += (dpint)a[4] * b[6]; + t += (dpint)a[5] * b[5]; + t += (dpint)a[6] * b[4]; + t += (dpint)a[7] * b[3]; + t += (dpint)a[8] * b[2]; + t += (dpint)v2 * (dpint)p8; + c[1] = ((spint)t & mask); + t >>= 57; + t += (dpint)a[3] * b[8]; + t += (dpint)a[4] * b[7]; + t += (dpint)a[5] * b[6]; + t += (dpint)a[6] * b[5]; + t += (dpint)a[7] * b[4]; + t += (dpint)a[8] * b[3]; + t += (dpint)v3 * (dpint)p8; + c[2] = ((spint)t & mask); + t >>= 57; + t += (dpint)a[4] * b[8]; + t += (dpint)a[5] * b[7]; + t += (dpint)a[6] * b[6]; + t += (dpint)a[7] * b[5]; + t += (dpint)a[8] * b[4]; + t += (dpint)v4 * (dpint)p8; + c[3] = ((spint)t & mask); + t >>= 57; + t += (dpint)a[5] * b[8]; + t += (dpint)a[6] * b[7]; + t += (dpint)a[7] * b[6]; + t += (dpint)a[8] * b[5]; + t += (dpint)v5 * (dpint)p8; + c[4] = ((spint)t & mask); + t >>= 57; + t += (dpint)a[6] * b[8]; + t += (dpint)a[7] * b[7]; + t += (dpint)a[8] * b[6]; + t += (dpint)v6 * (dpint)p8; + c[5] = ((spint)t & mask); + t >>= 57; + t += (dpint)a[7] * b[8]; + t += (dpint)a[8] * b[7]; + t += (dpint)v7 * (dpint)p8; + c[6] = ((spint)t & mask); + t >>= 57; + t += (dpint)a[8] * b[8]; + t += (dpint)v8 * (dpint)p8; + c[7] = ((spint)t & mask); + t >>= 57; + c[8] = (spint)t; +} + +// Modular squaring, c=a*a mod 2p +inline static void modsqr(const spint *a, spint *c) { + udpint tot; + udpint t = 0; + spint p8 = 0x1b00000000000u; + spint q = ((spint)1 << 57u); // q is unsaturated radix + spint mask = (spint)(q - (spint)1); + tot = (udpint)a[0] * a[0]; + t = tot; + spint v0 = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[0] * a[1]; + tot *= 2; + t += tot; + spint v1 = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[0] * a[2]; + tot *= 2; + tot += (udpint)a[1] * a[1]; + t += tot; + spint v2 = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[0] * a[3]; + tot += (udpint)a[1] * a[2]; + tot *= 2; + t += tot; + spint v3 = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[0] * a[4]; + tot += (udpint)a[1] * a[3]; + tot *= 2; + tot += (udpint)a[2] * a[2]; + t += tot; + spint v4 = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[0] * a[5]; + tot += (udpint)a[1] * a[4]; + tot += (udpint)a[2] * a[3]; + tot *= 2; + t += tot; + spint v5 = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[0] * a[6]; + tot += (udpint)a[1] * a[5]; + tot += (udpint)a[2] * a[4]; + tot *= 2; + tot += (udpint)a[3] * a[3]; + t += tot; + spint v6 = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[0] * a[7]; + tot += (udpint)a[1] * a[6]; + tot += (udpint)a[2] * a[5]; + tot += (udpint)a[3] * a[4]; + tot *= 2; + t += tot; + spint v7 = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[0] * a[8]; + tot += (udpint)a[1] * a[7]; + tot += (udpint)a[2] * a[6]; + tot += (udpint)a[3] * a[5]; + tot *= 2; + tot += (udpint)a[4] * a[4]; + t += tot; + t += (udpint)v0 * p8; + spint v8 = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[1] * a[8]; + tot += (udpint)a[2] * a[7]; + tot += (udpint)a[3] * a[6]; + tot += (udpint)a[4] * a[5]; + tot *= 2; + t += tot; + t += (udpint)v1 * p8; + c[0] = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[2] * a[8]; + tot += (udpint)a[3] * a[7]; + tot += (udpint)a[4] * a[6]; + tot *= 2; + tot += (udpint)a[5] * a[5]; + t += tot; + t += (udpint)v2 * p8; + c[1] = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[3] * a[8]; + tot += (udpint)a[4] * a[7]; + tot += (udpint)a[5] * a[6]; + tot *= 2; + t += tot; + t += (udpint)v3 * p8; + c[2] = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[4] * a[8]; + tot += (udpint)a[5] * a[7]; + tot *= 2; + tot += (udpint)a[6] * a[6]; + t += tot; + t += (udpint)v4 * p8; + c[3] = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[5] * a[8]; + tot += (udpint)a[6] * a[7]; + tot *= 2; + t += tot; + t += (udpint)v5 * p8; + c[4] = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[6] * a[8]; + tot *= 2; + tot += (udpint)a[7] * a[7]; + t += tot; + t += (udpint)v6 * p8; + c[5] = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[7] * a[8]; + tot *= 2; + t += tot; + t += (udpint)v7 * p8; + c[6] = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[8] * a[8]; + t += tot; + t += (udpint)v8 * p8; + c[7] = ((spint)t & mask); + t >>= 57; + c[8] = (spint)t; +} + +// copy +inline static void modcpy(const spint *a, spint *c) { + int i; + for (i = 0; i < 9; i++) { + c[i] = a[i]; + } +} + +// square n times +static void modnsqr(spint *a, int n) { + int i; + for (i = 0; i < n; i++) { + modsqr(a, a); + } +} + +// Calculate progenitor +static void modpro(const spint *w, spint *z) { + spint x[9]; + spint t0[9]; + spint t1[9]; + spint t2[9]; + spint t3[9]; + spint t4[9]; + spint t5[9]; + spint t6[9]; + modcpy(w, x); + modcpy(x, z); + modnsqr(z, 2); + modmul(x, z, t0); + modmul(x, t0, z); + modsqr(z, t1); + modmul(x, t1, t1); + modsqr(t1, t3); + modsqr(t3, t2); + modmul(t3, t2, t4); + modsqr(t4, t5); + modcpy(t5, t2); + modnsqr(t2, 2); + modsqr(t2, t6); + modmul(t2, t6, t6); + modmul(t5, t6, t5); + modnsqr(t5, 5); + modmul(t2, t5, t2); + modcpy(t2, t5); + modnsqr(t5, 12); + modmul(t2, t5, t2); + modcpy(t2, t5); + modnsqr(t5, 2); + modmul(t2, t5, t5); + modmul(t4, t5, t4); + modsqr(t4, t5); + modmul(t2, t5, t2); + modmul(t4, t2, t4); + modnsqr(t4, 27); + modmul(t2, t4, t2); + modmul(t1, t2, t2); + modcpy(t2, t4); + modnsqr(t4, 2); + modmul(t3, t4, t3); + modnsqr(t3, 58); + modmul(t2, t3, t2); + modmul(z, t2, z); + modcpy(z, t2); + modnsqr(t2, 4); + modmul(t1, t2, t1); + modmul(t0, t1, t0); + modmul(t1, t0, t1); + modsqr(t1, t2); + modmul(t0, t2, t0); + modcpy(t0, t2); + modnsqr(t2, 2); + modmul(t0, t2, t2); + modmul(t1, t2, t1); + modmul(t0, t1, t0); + modnsqr(t1, 128); + modmul(t0, t1, t1); + modnsqr(t1, 128); + modmul(t0, t1, t0); + modnsqr(t0, 119); + modmul(z, t0, z); +} + +// calculate inverse, provide progenitor h if available +static void modinv(const spint *x, const spint *h, spint *z) { + spint s[9]; + spint t[9]; + if (h == NULL) { + modpro(x, t); + } else { + modcpy(h, t); + } + modcpy(x, s); + modnsqr(t, 2); + modmul(s, t, z); +} + +// Convert m to n-residue form, n=nres(m) +static void nres(const spint *m, spint *n) { + const spint c[9] = { + 0x25ed097b43c668u, 0x84bda12f684bdau, 0xd097b425ed097bu, + 0x1da12f684bda12fu, 0x17b425ed097b425u, 0x12f684bda12f684u, + 0x25ed097b425ed0u, 0x84bda12f684bdau, 0x117b425ed097bu}; + modmul(m, c, n); +} + +// Convert n back to normal form, m=redc(n) +static void redc(const spint *n, spint *m) { + int i; + spint c[9]; + c[0] = 1; + for (i = 1; i < 9; i++) { + c[i] = 0; + } + modmul(n, c, m); + (void)modfsb(m); +} + +// is unity? +static int modis1(const spint *a) { + int i; + spint c[9]; + spint c0; + spint d = 0; + redc(a, c); + for (i = 1; i < 9; i++) { + d |= c[i]; + } + c0 = (spint)c[0]; + return ((spint)1 & ((d - (spint)1) >> 57u) & + (((c0 ^ (spint)1) - (spint)1) >> 57u)); +} + +// is zero? +static int modis0(const spint *a) { + int i; + spint c[9]; + spint d = 0; + redc(a, c); + for (i = 0; i < 9; i++) { + d |= c[i]; + } + return ((spint)1 & ((d - (spint)1) >> 57u)); +} + +// set to zero +static void modzer(spint *a) { + int i; + for (i = 0; i < 9; i++) { + a[i] = 0; + } +} + +// set to one +static void modone(spint *a) { + int i; + a[0] = 1; + for (i = 1; i < 9; i++) { + a[i] = 0; + } + nres(a, a); +} + +// set to integer +static void modint(int x, spint *a) { + int i; + a[0] = (spint)x; + for (i = 1; i < 9; i++) { + a[i] = 0; + } + nres(a, a); +} + +// Modular multiplication by an integer, c=a*b mod 2p +inline static void modmli(const spint *a, int b, spint *c) { + spint t[9]; + modint(b, t); + modmul(a, t, c); +} + +// Test for quadratic residue +static int modqr(const spint *h, const spint *x) { + spint r[9]; + if (h == NULL) { + modpro(x, r); + modsqr(r, r); + } else { + modsqr(h, r); + } + modmul(r, x, r); + return modis1(r) | modis0(x); +} + +// conditional move g to f if d=1 +// strongly recommend inlining be disabled using compiler specific syntax +static void modcmv(int b, const spint *g, volatile spint *f) { + int i; + spint c0, c1, s, t; + spint r = 0x3cc3c33c5aa5a55au; + c0 = (1 - b) + r; + c1 = b + r; + for (i = 0; i < 9; i++) { + s = g[i]; + t = f[i]; + f[i] = c0 * t + c1 * s; + f[i] -= r * (t + s); + } +} + +// conditional swap g and f if d=1 +// strongly recommend inlining be disabled using compiler specific syntax +static void modcsw(int b, volatile spint *g, volatile spint *f) { + int i; + spint c0, c1, s, t, w; + spint r = 0x3cc3c33c5aa5a55au; + c0 = (1 - b) + r; + c1 = b + r; + for (i = 0; i < 9; i++) { + s = g[i]; + t = f[i]; + w = r * (t + s); + f[i] = c0 * t + c1 * s; + f[i] -= w; + g[i] = c0 * s + c1 * t; + g[i] -= w; + } +} + +// Modular square root, provide progenitor h if available, NULL if not +static void modsqrt(const spint *x, const spint *h, spint *r) { + spint s[9]; + spint y[9]; + if (h == NULL) { + modpro(x, y); + } else { + modcpy(h, y); + } + modmul(y, x, s); + modcpy(s, r); +} + +// shift left by less than a word +static void modshl(unsigned int n, spint *a) { + int i; + a[8] = ((a[8] << n)) | (a[7] >> (57u - n)); + for (i = 7; i > 0; i--) { + a[i] = ((a[i] << n) & (spint)0x1ffffffffffffff) | (a[i - 1] >> (57u - n)); + } + a[0] = (a[0] << n) & (spint)0x1ffffffffffffff; +} + +// shift right by less than a word. Return shifted out part +static int modshr(unsigned int n, spint *a) { + int i; + spint r = a[0] & (((spint)1 << n) - (spint)1); + for (i = 0; i < 8; i++) { + a[i] = (a[i] >> n) | ((a[i + 1] << (57u - n)) & (spint)0x1ffffffffffffff); + } + a[8] = a[8] >> n; + return r; +} + +// set a= 2^r +static void mod2r(unsigned int r, spint *a) { + unsigned int n = r / 57u; + unsigned int m = r % 57u; + modzer(a); + if (r >= 64 * 8) + return; + a[n] = 1; + a[n] <<= m; + nres(a, a); +} + +// export to byte array +static void modexp(const spint *a, char *b) { + int i; + spint c[9]; + redc(a, c); + for (i = 63; i >= 0; i--) { + b[i] = c[0] & (spint)0xff; + (void)modshr(8, c); + } +} + +// import from byte array +// returns 1 if in range, else 0 +static int modimp(const char *b, spint *a) { + int i, res; + for (i = 0; i < 9; i++) { + a[i] = 0; + } + for (i = 0; i < 64; i++) { + modshl(8, a); + a[0] += (spint)(unsigned char)b[i]; + } + res = modfsb(a); + nres(a, a); + return res; +} + +// determine sign +static int modsign(const spint *a) { + spint c[9]; + redc(a, c); + return c[0] % 2; +} + +// return true if equal +static int modcmp(const spint *a, const spint *b) { + spint c[9], d[9]; + int i, eq = 1; + redc(a, c); + redc(b, d); + for (i = 0; i < 9; i++) { + eq &= (((c[i] ^ d[i]) - 1) >> 57) & 1; + } + return eq; +} + +// clang-format on +/****************************************************************************** + API functions calling generated code above + ******************************************************************************/ + +#include + +const digit_t ZERO[NWORDS_FIELD] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; +const digit_t ONE[NWORDS_FIELD] = { 0x000000000000012f, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000b00000000000 }; +// Montgomery representation of 2^-1 +static const digit_t TWO_INV[NWORDS_FIELD] = { 0x0000000000000097, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0001300000000000 }; +// Montgomery representation of 3^-1 +static const digit_t THREE_INV[NWORDS_FIELD] = { 0x00aaaaaaaaaaab0f, 0x0155555555555555, 0x00aaaaaaaaaaaaaa, + 0x0155555555555555, 0x00aaaaaaaaaaaaaa, 0x0155555555555555, + 0x00aaaaaaaaaaaaaa, 0x0155555555555555, 0x00015aaaaaaaaaaa }; +// Montgomery representation of 2^512 +static const digit_t R2[NWORDS_FIELD] = { 0x0012f684bda1e334, 0x01425ed097b425ed, 0x01684bda12f684bd, + 0x01ed097b425ed097, 0x00bda12f684bda12, 0x0097b425ed097b42, + 0x0012f684bda12f68, 0x01425ed097b425ed, 0x00008bda12f684bd }; + +void +fp_set_small(fp_t *x, const digit_t val) +{ + modint((int)val, *x); +} + +void +fp_mul_small(fp_t *x, const fp_t *a, const uint32_t val) +{ + modmli(*a, (int)val, *x); +} + +void +fp_set_zero(fp_t *x) +{ + modzer(*x); +} + +void +fp_set_one(fp_t *x) +{ + modone(*x); +} + +uint32_t +fp_is_equal(const fp_t *a, const fp_t *b) +{ + return -(uint32_t)modcmp(*a, *b); +} + +uint32_t +fp_is_zero(const fp_t *a) +{ + return -(uint32_t)modis0(*a); +} + +void +fp_copy(fp_t *out, const fp_t *a) +{ + modcpy(*a, *out); +} + +void +fp_cswap(fp_t *a, fp_t *b, uint32_t ctl) +{ + modcsw((int)(ctl & 0x1), *a, *b); +} + +void +fp_add(fp_t *out, const fp_t *a, const fp_t *b) +{ + modadd(*a, *b, *out); +} + +void +fp_sub(fp_t *out, const fp_t *a, const fp_t *b) +{ + modsub(*a, *b, *out); +} + +void +fp_neg(fp_t *out, const fp_t *a) +{ + modneg(*a, *out); +} + +void +fp_sqr(fp_t *out, const fp_t *a) +{ + modsqr(*a, *out); +} + +void +fp_mul(fp_t *out, const fp_t *a, const fp_t *b) +{ + modmul(*a, *b, *out); +} + +void +fp_inv(fp_t *x) +{ + modinv(*x, NULL, *x); +} + +uint32_t +fp_is_square(const fp_t *a) +{ + return -(uint32_t)modqr(NULL, *a); +} + +void +fp_sqrt(fp_t *a) +{ + modsqrt(*a, NULL, *a); +} + +void +fp_half(fp_t *out, const fp_t *a) +{ + modmul(TWO_INV, *a, *out); +} + +void +fp_exp3div4(fp_t *out, const fp_t *a) +{ + modpro(*a, *out); +} + +void +fp_div3(fp_t *out, const fp_t *a) +{ + modmul(THREE_INV, *a, *out); +} + +void +fp_encode(void *dst, const fp_t *a) +{ + // Modified version of modexp() + int i; + spint c[9]; + redc(*a, c); + for (i = 0; i < 64; i++) { + ((char *)dst)[i] = c[0] & (spint)0xff; + (void)modshr(8, c); + } +} + +uint32_t +fp_decode(fp_t *d, const void *src) +{ + // Modified version of modimp() + int i; + spint res; + const unsigned char *b = src; + for (i = 0; i < 9; i++) { + (*d)[i] = 0; + } + for (i = 63; i >= 0; i--) { + modshl(8, *d); + (*d)[0] += (spint)b[i]; + } + res = (spint)-modfsb(*d); + nres(*d, *d); + // If the value was canonical then res = -1; otherwise, res = 0 + for (i = 0; i < 9; i++) { + (*d)[i] &= res; + } + return (uint32_t)res; +} + +static inline unsigned char +add_carry(unsigned char cc, spint a, spint b, spint *d) +{ + udpint t = (udpint)a + (udpint)b + cc; + *d = (spint)t; + return (unsigned char)(t >> Wordlength); +} + +static void +partial_reduce(spint *out, const spint *src) +{ + spint h, l, quo, rem; + unsigned char cc; + + // Split value in high (12 bits) and low (500 bits) parts. + h = src[7] >> 52; + l = src[7] & 0x000FFFFFFFFFFFFF; + + // 27*2^500 = 1 mod q; hence, we add floor(h/27) + (h mod 27)*2^500 + // to the low part. + quo = (h * 0x12F7) >> 17; + rem = h - (27 * quo); + cc = add_carry(0, src[0], quo, &out[0]); + cc = add_carry(cc, src[1], 0, &out[1]); + cc = add_carry(cc, src[2], 0, &out[2]); + cc = add_carry(cc, src[3], 0, &out[3]); + cc = add_carry(cc, src[4], 0, &out[4]); + cc = add_carry(cc, src[5], 0, &out[5]); + cc = add_carry(cc, src[6], 0, &out[6]); + (void)add_carry(cc, l, rem << 52, &out[7]); +} + +// Little-endian encoding of a 64-bit integer. +static inline void +enc64le(void *dst, uint64_t x) +{ + uint8_t *buf = dst; + buf[0] = (uint8_t)x; + buf[1] = (uint8_t)(x >> 8); + buf[2] = (uint8_t)(x >> 16); + buf[3] = (uint8_t)(x >> 24); + buf[4] = (uint8_t)(x >> 32); + buf[5] = (uint8_t)(x >> 40); + buf[6] = (uint8_t)(x >> 48); + buf[7] = (uint8_t)(x >> 56); +} + +// Little-endian decoding of a 64-bit integer. +static inline uint64_t +dec64le(const void *src) +{ + const uint8_t *buf = src; + return (spint)buf[0] | ((spint)buf[1] << 8) | ((spint)buf[2] << 16) | ((spint)buf[3] << 24) | + ((spint)buf[4] << 32) | ((spint)buf[5] << 40) | ((spint)buf[6] << 48) | ((spint)buf[7] << 56); +} + +void +fp_decode_reduce(fp_t *d, const void *src, size_t len) +{ + uint64_t t[8]; // Stores Nbytes * 8 bits + uint8_t tmp[64]; // Nbytes + const uint8_t *b = src; + + fp_set_zero(d); + if (len == 0) { + return; + } + + size_t rem = len % 64; + if (rem != 0) { + // Input size is not a multiple of 64, we decode a partial + // block, which is already less than 2^500. + size_t k = len - rem; + memcpy(tmp, b + k, len - k); + memset(tmp + len - k, 0, (sizeof tmp) - (len - k)); + fp_decode(d, tmp); + len = k; + } + // Process all remaining blocks, in descending address order. + while (len > 0) { + fp_mul(d, d, &R2); + len -= 64; + t[0] = dec64le(b + len); + t[1] = dec64le(b + len + 8); + t[2] = dec64le(b + len + 16); + t[3] = dec64le(b + len + 24); + t[4] = dec64le(b + len + 32); + t[5] = dec64le(b + len + 40); + t[6] = dec64le(b + len + 48); + t[7] = dec64le(b + len + 56); + partial_reduce(t, t); + enc64le(tmp, t[0]); + enc64le(tmp + 8, t[1]); + enc64le(tmp + 16, t[2]); + enc64le(tmp + 24, t[3]); + enc64le(tmp + 32, t[4]); + enc64le(tmp + 40, t[5]); + enc64le(tmp + 48, t[6]); + enc64le(tmp + 56, t[7]); + fp_t a; + fp_decode(&a, tmp); + fp_add(d, d, &a); + } +} diff --git a/src/gf/ref/lvl5/fp_p318233.c b/src/gf/ref/lvl5/fp_p318233.c deleted file mode 100644 index c76c4bb..0000000 --- a/src/gf/ref/lvl5/fp_p318233.c +++ /dev/null @@ -1,5491 +0,0 @@ -/* Autogenerated: './src/ExtractionOCaml/word_by_word_montgomery' p318233 64 0x255946a8869bc68c15b0036936e79202bdbe6326507d01fe3ac5904a0dea65faf0a29a781974ce994c68ada6e1ffffffffffffffffffffffffffffffffffff */ -/* curve description: p318233 */ -/* machine_wordsize = 64 (from "64") */ -/* requested operations: (all) */ -/* m = 0x255946a8869bc68c15b0036936e79202bdbe6326507d01fe3ac5904a0dea65faf0a29a781974ce994c68ada6e1ffffffffffffffffffffffffffffffffffff (from "0x255946a8869bc68c15b0036936e79202bdbe6326507d01fe3ac5904a0dea65faf0a29a781974ce994c68ada6e1ffffffffffffffffffffffffffffffffffff") */ -/* */ -/* NOTE: In addition to the bounds specified above each function, all */ -/* functions synthesized for this Montgomery arithmetic require the */ -/* input to be strictly less than the prime modulus (m), and also */ -/* require the input to be in the unique saturated representation. */ -/* All functions also ensure that these two properties are true of */ -/* return values. */ -/* */ -/* Computed values: */ -/* eval z = z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) + (z[4] << 256) + (z[5] << 0x140) + (z[6] << 0x180) + (z[7] << 0x1c0) */ -/* bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) + (z[8] << 64) + (z[9] << 72) + (z[10] << 80) + (z[11] << 88) + (z[12] << 96) + (z[13] << 104) + (z[14] << 112) + (z[15] << 120) + (z[16] << 128) + (z[17] << 136) + (z[18] << 144) + (z[19] << 152) + (z[20] << 160) + (z[21] << 168) + (z[22] << 176) + (z[23] << 184) + (z[24] << 192) + (z[25] << 200) + (z[26] << 208) + (z[27] << 216) + (z[28] << 224) + (z[29] << 232) + (z[30] << 240) + (z[31] << 248) + (z[32] << 256) + (z[33] << 0x108) + (z[34] << 0x110) + (z[35] << 0x118) + (z[36] << 0x120) + (z[37] << 0x128) + (z[38] << 0x130) + (z[39] << 0x138) + (z[40] << 0x140) + (z[41] << 0x148) + (z[42] << 0x150) + (z[43] << 0x158) + (z[44] << 0x160) + (z[45] << 0x168) + (z[46] << 0x170) + (z[47] << 0x178) + (z[48] << 0x180) + (z[49] << 0x188) + (z[50] << 0x190) + (z[51] << 0x198) + (z[52] << 0x1a0) + (z[53] << 0x1a8) + (z[54] << 0x1b0) + (z[55] << 0x1b8) + (z[56] << 0x1c0) + (z[57] << 0x1c8) + (z[58] << 0x1d0) + (z[59] << 0x1d8) + (z[60] << 0x1e0) + (z[61] << 0x1e8) + (z[62] << 0x1f0) */ -/* twos_complement_eval z = let x1 := z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) + (z[4] << 256) + (z[5] << 0x140) + (z[6] << 0x180) + (z[7] << 0x1c0) in */ -/* if x1 & (2^512-1) < 2^511 then x1 & (2^512-1) else (x1 & (2^512-1)) - 2^512 */ - -#include -typedef unsigned char fiat_p318233_uint1; -typedef signed char fiat_p318233_int1; -#if defined(__GNUC__) || defined(__clang__) -# define FIAT_P318233_FIAT_EXTENSION __extension__ -# define FIAT_P318233_FIAT_INLINE __inline__ -#else -# define FIAT_P318233_FIAT_EXTENSION -# define FIAT_P318233_FIAT_INLINE -#endif - -FIAT_P318233_FIAT_EXTENSION typedef signed __int128 fiat_p318233_int128; -FIAT_P318233_FIAT_EXTENSION typedef unsigned __int128 fiat_p318233_uint128; - -/* The type fiat_p318233_montgomery_domain_field_element is a field element in the Montgomery domain. */ -/* Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] */ -typedef uint64_t fiat_p318233_montgomery_domain_field_element[8]; - -/* The type fiat_p318233_non_montgomery_domain_field_element is a field element NOT in the Montgomery domain. */ -/* Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] */ -typedef uint64_t fiat_p318233_non_montgomery_domain_field_element[8]; - -#if (-1 & 3) != 3 -#error "This code only works on a two's complement system" -#endif - - -/* - * The function fiat_p318233_addcarryx_u64 is an addition with carry. - * - * Postconditions: - * out1 = (arg1 + arg2 + arg3) mod 2^64 - * out2 = ⌊(arg1 + arg2 + arg3) / 2^64⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffffffffffff] - * arg3: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - * out2: [0x0 ~> 0x1] - */ -void fiat_p318233_addcarryx_u64(uint64_t* out1, fiat_p318233_uint1* out2, fiat_p318233_uint1 arg1, uint64_t arg2, uint64_t arg3) { - fiat_p318233_uint128 x1; - uint64_t x2; - fiat_p318233_uint1 x3; - x1 = ((arg1 + (fiat_p318233_uint128)arg2) + arg3); - x2 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff)); - x3 = (fiat_p318233_uint1)(x1 >> 64); - *out1 = x2; - *out2 = x3; -} - -/* - * The function fiat_p318233_subborrowx_u64 is a subtraction with borrow. - * - * Postconditions: - * out1 = (-arg1 + arg2 + -arg3) mod 2^64 - * out2 = -⌊(-arg1 + arg2 + -arg3) / 2^64⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffffffffffff] - * arg3: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - * out2: [0x0 ~> 0x1] - */ -void fiat_p318233_subborrowx_u64(uint64_t* out1, fiat_p318233_uint1* out2, fiat_p318233_uint1 arg1, uint64_t arg2, uint64_t arg3) { - fiat_p318233_int128 x1; - fiat_p318233_int1 x2; - uint64_t x3; - x1 = ((arg2 - (fiat_p318233_int128)arg1) - arg3); - x2 = (fiat_p318233_int1)(x1 >> 64); - x3 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff)); - *out1 = x3; - *out2 = (fiat_p318233_uint1)(0x0 - x2); -} - -/* - * The function fiat_p318233_mulx_u64 is a multiplication, returning the full double-width result. - * - * Postconditions: - * out1 = (arg1 * arg2) mod 2^64 - * out2 = ⌊arg1 * arg2 / 2^64⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0xffffffffffffffff] - * arg2: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - * out2: [0x0 ~> 0xffffffffffffffff] - */ -void fiat_p318233_mulx_u64(uint64_t* out1, uint64_t* out2, uint64_t arg1, uint64_t arg2) { - fiat_p318233_uint128 x1; - uint64_t x2; - uint64_t x3; - x1 = ((fiat_p318233_uint128)arg1 * arg2); - x2 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff)); - x3 = (uint64_t)(x1 >> 64); - *out1 = x2; - *out2 = x3; -} - -/* - * The function fiat_p318233_cmovznz_u64 is a single-word conditional move. - * - * Postconditions: - * out1 = (if arg1 = 0 then arg2 else arg3) - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffffffffffff] - * arg3: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - */ -void fiat_p318233_cmovznz_u64(uint64_t* out1, fiat_p318233_uint1 arg1, uint64_t arg2, uint64_t arg3) { - fiat_p318233_uint1 x1; - uint64_t x2; - uint64_t x3; - x1 = (!(!arg1)); - x2 = ((fiat_p318233_int1)(0x0 - x1) & UINT64_C(0xffffffffffffffff)); - x3 = ((x2 & arg3) | ((~x2) & arg2)); - *out1 = x3; -} - -/* - * The function fiat_p318233_mul multiplies two field elements in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * 0 ≤ eval arg2 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg2)) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p318233_mul(fiat_p318233_montgomery_domain_field_element out1, const fiat_p318233_montgomery_domain_field_element arg1, const fiat_p318233_montgomery_domain_field_element arg2) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - uint64_t x14; - uint64_t x15; - uint64_t x16; - uint64_t x17; - uint64_t x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - uint64_t x23; - uint64_t x24; - uint64_t x25; - fiat_p318233_uint1 x26; - uint64_t x27; - fiat_p318233_uint1 x28; - uint64_t x29; - fiat_p318233_uint1 x30; - uint64_t x31; - fiat_p318233_uint1 x32; - uint64_t x33; - fiat_p318233_uint1 x34; - uint64_t x35; - fiat_p318233_uint1 x36; - uint64_t x37; - fiat_p318233_uint1 x38; - uint64_t x39; - uint64_t x40; - uint64_t x41; - uint64_t x42; - uint64_t x43; - uint64_t x44; - uint64_t x45; - uint64_t x46; - uint64_t x47; - uint64_t x48; - uint64_t x49; - uint64_t x50; - uint64_t x51; - uint64_t x52; - uint64_t x53; - uint64_t x54; - uint64_t x55; - uint64_t x56; - fiat_p318233_uint1 x57; - uint64_t x58; - fiat_p318233_uint1 x59; - uint64_t x60; - fiat_p318233_uint1 x61; - uint64_t x62; - fiat_p318233_uint1 x63; - uint64_t x64; - fiat_p318233_uint1 x65; - uint64_t x66; - fiat_p318233_uint1 x67; - uint64_t x68; - fiat_p318233_uint1 x69; - uint64_t x70; - uint64_t x71; - fiat_p318233_uint1 x72; - uint64_t x73; - fiat_p318233_uint1 x74; - uint64_t x75; - fiat_p318233_uint1 x76; - uint64_t x77; - fiat_p318233_uint1 x78; - uint64_t x79; - fiat_p318233_uint1 x80; - uint64_t x81; - fiat_p318233_uint1 x82; - uint64_t x83; - fiat_p318233_uint1 x84; - uint64_t x85; - fiat_p318233_uint1 x86; - uint64_t x87; - fiat_p318233_uint1 x88; - uint64_t x89; - uint64_t x90; - uint64_t x91; - uint64_t x92; - uint64_t x93; - uint64_t x94; - uint64_t x95; - uint64_t x96; - uint64_t x97; - uint64_t x98; - uint64_t x99; - uint64_t x100; - uint64_t x101; - uint64_t x102; - uint64_t x103; - uint64_t x104; - uint64_t x105; - fiat_p318233_uint1 x106; - uint64_t x107; - fiat_p318233_uint1 x108; - uint64_t x109; - fiat_p318233_uint1 x110; - uint64_t x111; - fiat_p318233_uint1 x112; - uint64_t x113; - fiat_p318233_uint1 x114; - uint64_t x115; - fiat_p318233_uint1 x116; - uint64_t x117; - fiat_p318233_uint1 x118; - uint64_t x119; - uint64_t x120; - fiat_p318233_uint1 x121; - uint64_t x122; - fiat_p318233_uint1 x123; - uint64_t x124; - fiat_p318233_uint1 x125; - uint64_t x126; - fiat_p318233_uint1 x127; - uint64_t x128; - fiat_p318233_uint1 x129; - uint64_t x130; - fiat_p318233_uint1 x131; - uint64_t x132; - fiat_p318233_uint1 x133; - uint64_t x134; - fiat_p318233_uint1 x135; - uint64_t x136; - fiat_p318233_uint1 x137; - uint64_t x138; - uint64_t x139; - uint64_t x140; - uint64_t x141; - uint64_t x142; - uint64_t x143; - uint64_t x144; - uint64_t x145; - uint64_t x146; - uint64_t x147; - uint64_t x148; - uint64_t x149; - uint64_t x150; - uint64_t x151; - uint64_t x152; - uint64_t x153; - uint64_t x154; - fiat_p318233_uint1 x155; - uint64_t x156; - fiat_p318233_uint1 x157; - uint64_t x158; - fiat_p318233_uint1 x159; - uint64_t x160; - fiat_p318233_uint1 x161; - uint64_t x162; - fiat_p318233_uint1 x163; - uint64_t x164; - fiat_p318233_uint1 x165; - uint64_t x166; - fiat_p318233_uint1 x167; - uint64_t x168; - uint64_t x169; - fiat_p318233_uint1 x170; - uint64_t x171; - fiat_p318233_uint1 x172; - uint64_t x173; - fiat_p318233_uint1 x174; - uint64_t x175; - fiat_p318233_uint1 x176; - uint64_t x177; - fiat_p318233_uint1 x178; - uint64_t x179; - fiat_p318233_uint1 x180; - uint64_t x181; - fiat_p318233_uint1 x182; - uint64_t x183; - fiat_p318233_uint1 x184; - uint64_t x185; - fiat_p318233_uint1 x186; - uint64_t x187; - uint64_t x188; - uint64_t x189; - uint64_t x190; - uint64_t x191; - uint64_t x192; - uint64_t x193; - uint64_t x194; - uint64_t x195; - uint64_t x196; - uint64_t x197; - uint64_t x198; - uint64_t x199; - uint64_t x200; - uint64_t x201; - uint64_t x202; - uint64_t x203; - uint64_t x204; - fiat_p318233_uint1 x205; - uint64_t x206; - fiat_p318233_uint1 x207; - uint64_t x208; - fiat_p318233_uint1 x209; - uint64_t x210; - fiat_p318233_uint1 x211; - uint64_t x212; - fiat_p318233_uint1 x213; - uint64_t x214; - fiat_p318233_uint1 x215; - uint64_t x216; - fiat_p318233_uint1 x217; - uint64_t x218; - uint64_t x219; - fiat_p318233_uint1 x220; - uint64_t x221; - fiat_p318233_uint1 x222; - uint64_t x223; - fiat_p318233_uint1 x224; - uint64_t x225; - fiat_p318233_uint1 x226; - uint64_t x227; - fiat_p318233_uint1 x228; - uint64_t x229; - fiat_p318233_uint1 x230; - uint64_t x231; - fiat_p318233_uint1 x232; - uint64_t x233; - fiat_p318233_uint1 x234; - uint64_t x235; - fiat_p318233_uint1 x236; - uint64_t x237; - uint64_t x238; - uint64_t x239; - uint64_t x240; - uint64_t x241; - uint64_t x242; - uint64_t x243; - uint64_t x244; - uint64_t x245; - uint64_t x246; - uint64_t x247; - uint64_t x248; - uint64_t x249; - uint64_t x250; - uint64_t x251; - uint64_t x252; - uint64_t x253; - fiat_p318233_uint1 x254; - uint64_t x255; - fiat_p318233_uint1 x256; - uint64_t x257; - fiat_p318233_uint1 x258; - uint64_t x259; - fiat_p318233_uint1 x260; - uint64_t x261; - fiat_p318233_uint1 x262; - uint64_t x263; - fiat_p318233_uint1 x264; - uint64_t x265; - fiat_p318233_uint1 x266; - uint64_t x267; - uint64_t x268; - fiat_p318233_uint1 x269; - uint64_t x270; - fiat_p318233_uint1 x271; - uint64_t x272; - fiat_p318233_uint1 x273; - uint64_t x274; - fiat_p318233_uint1 x275; - uint64_t x276; - fiat_p318233_uint1 x277; - uint64_t x278; - fiat_p318233_uint1 x279; - uint64_t x280; - fiat_p318233_uint1 x281; - uint64_t x282; - fiat_p318233_uint1 x283; - uint64_t x284; - fiat_p318233_uint1 x285; - uint64_t x286; - uint64_t x287; - uint64_t x288; - uint64_t x289; - uint64_t x290; - uint64_t x291; - uint64_t x292; - uint64_t x293; - uint64_t x294; - uint64_t x295; - uint64_t x296; - uint64_t x297; - uint64_t x298; - uint64_t x299; - uint64_t x300; - uint64_t x301; - uint64_t x302; - uint64_t x303; - fiat_p318233_uint1 x304; - uint64_t x305; - fiat_p318233_uint1 x306; - uint64_t x307; - fiat_p318233_uint1 x308; - uint64_t x309; - fiat_p318233_uint1 x310; - uint64_t x311; - fiat_p318233_uint1 x312; - uint64_t x313; - fiat_p318233_uint1 x314; - uint64_t x315; - fiat_p318233_uint1 x316; - uint64_t x317; - uint64_t x318; - fiat_p318233_uint1 x319; - uint64_t x320; - fiat_p318233_uint1 x321; - uint64_t x322; - fiat_p318233_uint1 x323; - uint64_t x324; - fiat_p318233_uint1 x325; - uint64_t x326; - fiat_p318233_uint1 x327; - uint64_t x328; - fiat_p318233_uint1 x329; - uint64_t x330; - fiat_p318233_uint1 x331; - uint64_t x332; - fiat_p318233_uint1 x333; - uint64_t x334; - fiat_p318233_uint1 x335; - uint64_t x336; - uint64_t x337; - uint64_t x338; - uint64_t x339; - uint64_t x340; - uint64_t x341; - uint64_t x342; - uint64_t x343; - uint64_t x344; - uint64_t x345; - uint64_t x346; - uint64_t x347; - uint64_t x348; - uint64_t x349; - uint64_t x350; - uint64_t x351; - uint64_t x352; - fiat_p318233_uint1 x353; - uint64_t x354; - fiat_p318233_uint1 x355; - uint64_t x356; - fiat_p318233_uint1 x357; - uint64_t x358; - fiat_p318233_uint1 x359; - uint64_t x360; - fiat_p318233_uint1 x361; - uint64_t x362; - fiat_p318233_uint1 x363; - uint64_t x364; - fiat_p318233_uint1 x365; - uint64_t x366; - uint64_t x367; - fiat_p318233_uint1 x368; - uint64_t x369; - fiat_p318233_uint1 x370; - uint64_t x371; - fiat_p318233_uint1 x372; - uint64_t x373; - fiat_p318233_uint1 x374; - uint64_t x375; - fiat_p318233_uint1 x376; - uint64_t x377; - fiat_p318233_uint1 x378; - uint64_t x379; - fiat_p318233_uint1 x380; - uint64_t x381; - fiat_p318233_uint1 x382; - uint64_t x383; - fiat_p318233_uint1 x384; - uint64_t x385; - uint64_t x386; - uint64_t x387; - uint64_t x388; - uint64_t x389; - uint64_t x390; - uint64_t x391; - uint64_t x392; - uint64_t x393; - uint64_t x394; - uint64_t x395; - uint64_t x396; - uint64_t x397; - uint64_t x398; - uint64_t x399; - uint64_t x400; - uint64_t x401; - uint64_t x402; - fiat_p318233_uint1 x403; - uint64_t x404; - fiat_p318233_uint1 x405; - uint64_t x406; - fiat_p318233_uint1 x407; - uint64_t x408; - fiat_p318233_uint1 x409; - uint64_t x410; - fiat_p318233_uint1 x411; - uint64_t x412; - fiat_p318233_uint1 x413; - uint64_t x414; - fiat_p318233_uint1 x415; - uint64_t x416; - uint64_t x417; - fiat_p318233_uint1 x418; - uint64_t x419; - fiat_p318233_uint1 x420; - uint64_t x421; - fiat_p318233_uint1 x422; - uint64_t x423; - fiat_p318233_uint1 x424; - uint64_t x425; - fiat_p318233_uint1 x426; - uint64_t x427; - fiat_p318233_uint1 x428; - uint64_t x429; - fiat_p318233_uint1 x430; - uint64_t x431; - fiat_p318233_uint1 x432; - uint64_t x433; - fiat_p318233_uint1 x434; - uint64_t x435; - uint64_t x436; - uint64_t x437; - uint64_t x438; - uint64_t x439; - uint64_t x440; - uint64_t x441; - uint64_t x442; - uint64_t x443; - uint64_t x444; - uint64_t x445; - uint64_t x446; - uint64_t x447; - uint64_t x448; - uint64_t x449; - uint64_t x450; - uint64_t x451; - fiat_p318233_uint1 x452; - uint64_t x453; - fiat_p318233_uint1 x454; - uint64_t x455; - fiat_p318233_uint1 x456; - uint64_t x457; - fiat_p318233_uint1 x458; - uint64_t x459; - fiat_p318233_uint1 x460; - uint64_t x461; - fiat_p318233_uint1 x462; - uint64_t x463; - fiat_p318233_uint1 x464; - uint64_t x465; - uint64_t x466; - fiat_p318233_uint1 x467; - uint64_t x468; - fiat_p318233_uint1 x469; - uint64_t x470; - fiat_p318233_uint1 x471; - uint64_t x472; - fiat_p318233_uint1 x473; - uint64_t x474; - fiat_p318233_uint1 x475; - uint64_t x476; - fiat_p318233_uint1 x477; - uint64_t x478; - fiat_p318233_uint1 x479; - uint64_t x480; - fiat_p318233_uint1 x481; - uint64_t x482; - fiat_p318233_uint1 x483; - uint64_t x484; - uint64_t x485; - uint64_t x486; - uint64_t x487; - uint64_t x488; - uint64_t x489; - uint64_t x490; - uint64_t x491; - uint64_t x492; - uint64_t x493; - uint64_t x494; - uint64_t x495; - uint64_t x496; - uint64_t x497; - uint64_t x498; - uint64_t x499; - uint64_t x500; - uint64_t x501; - fiat_p318233_uint1 x502; - uint64_t x503; - fiat_p318233_uint1 x504; - uint64_t x505; - fiat_p318233_uint1 x506; - uint64_t x507; - fiat_p318233_uint1 x508; - uint64_t x509; - fiat_p318233_uint1 x510; - uint64_t x511; - fiat_p318233_uint1 x512; - uint64_t x513; - fiat_p318233_uint1 x514; - uint64_t x515; - uint64_t x516; - fiat_p318233_uint1 x517; - uint64_t x518; - fiat_p318233_uint1 x519; - uint64_t x520; - fiat_p318233_uint1 x521; - uint64_t x522; - fiat_p318233_uint1 x523; - uint64_t x524; - fiat_p318233_uint1 x525; - uint64_t x526; - fiat_p318233_uint1 x527; - uint64_t x528; - fiat_p318233_uint1 x529; - uint64_t x530; - fiat_p318233_uint1 x531; - uint64_t x532; - fiat_p318233_uint1 x533; - uint64_t x534; - uint64_t x535; - uint64_t x536; - uint64_t x537; - uint64_t x538; - uint64_t x539; - uint64_t x540; - uint64_t x541; - uint64_t x542; - uint64_t x543; - uint64_t x544; - uint64_t x545; - uint64_t x546; - uint64_t x547; - uint64_t x548; - uint64_t x549; - uint64_t x550; - fiat_p318233_uint1 x551; - uint64_t x552; - fiat_p318233_uint1 x553; - uint64_t x554; - fiat_p318233_uint1 x555; - uint64_t x556; - fiat_p318233_uint1 x557; - uint64_t x558; - fiat_p318233_uint1 x559; - uint64_t x560; - fiat_p318233_uint1 x561; - uint64_t x562; - fiat_p318233_uint1 x563; - uint64_t x564; - uint64_t x565; - fiat_p318233_uint1 x566; - uint64_t x567; - fiat_p318233_uint1 x568; - uint64_t x569; - fiat_p318233_uint1 x570; - uint64_t x571; - fiat_p318233_uint1 x572; - uint64_t x573; - fiat_p318233_uint1 x574; - uint64_t x575; - fiat_p318233_uint1 x576; - uint64_t x577; - fiat_p318233_uint1 x578; - uint64_t x579; - fiat_p318233_uint1 x580; - uint64_t x581; - fiat_p318233_uint1 x582; - uint64_t x583; - uint64_t x584; - uint64_t x585; - uint64_t x586; - uint64_t x587; - uint64_t x588; - uint64_t x589; - uint64_t x590; - uint64_t x591; - uint64_t x592; - uint64_t x593; - uint64_t x594; - uint64_t x595; - uint64_t x596; - uint64_t x597; - uint64_t x598; - uint64_t x599; - uint64_t x600; - fiat_p318233_uint1 x601; - uint64_t x602; - fiat_p318233_uint1 x603; - uint64_t x604; - fiat_p318233_uint1 x605; - uint64_t x606; - fiat_p318233_uint1 x607; - uint64_t x608; - fiat_p318233_uint1 x609; - uint64_t x610; - fiat_p318233_uint1 x611; - uint64_t x612; - fiat_p318233_uint1 x613; - uint64_t x614; - uint64_t x615; - fiat_p318233_uint1 x616; - uint64_t x617; - fiat_p318233_uint1 x618; - uint64_t x619; - fiat_p318233_uint1 x620; - uint64_t x621; - fiat_p318233_uint1 x622; - uint64_t x623; - fiat_p318233_uint1 x624; - uint64_t x625; - fiat_p318233_uint1 x626; - uint64_t x627; - fiat_p318233_uint1 x628; - uint64_t x629; - fiat_p318233_uint1 x630; - uint64_t x631; - fiat_p318233_uint1 x632; - uint64_t x633; - uint64_t x634; - uint64_t x635; - uint64_t x636; - uint64_t x637; - uint64_t x638; - uint64_t x639; - uint64_t x640; - uint64_t x641; - uint64_t x642; - uint64_t x643; - uint64_t x644; - uint64_t x645; - uint64_t x646; - uint64_t x647; - uint64_t x648; - uint64_t x649; - fiat_p318233_uint1 x650; - uint64_t x651; - fiat_p318233_uint1 x652; - uint64_t x653; - fiat_p318233_uint1 x654; - uint64_t x655; - fiat_p318233_uint1 x656; - uint64_t x657; - fiat_p318233_uint1 x658; - uint64_t x659; - fiat_p318233_uint1 x660; - uint64_t x661; - fiat_p318233_uint1 x662; - uint64_t x663; - uint64_t x664; - fiat_p318233_uint1 x665; - uint64_t x666; - fiat_p318233_uint1 x667; - uint64_t x668; - fiat_p318233_uint1 x669; - uint64_t x670; - fiat_p318233_uint1 x671; - uint64_t x672; - fiat_p318233_uint1 x673; - uint64_t x674; - fiat_p318233_uint1 x675; - uint64_t x676; - fiat_p318233_uint1 x677; - uint64_t x678; - fiat_p318233_uint1 x679; - uint64_t x680; - fiat_p318233_uint1 x681; - uint64_t x682; - uint64_t x683; - uint64_t x684; - uint64_t x685; - uint64_t x686; - uint64_t x687; - uint64_t x688; - uint64_t x689; - uint64_t x690; - uint64_t x691; - uint64_t x692; - uint64_t x693; - uint64_t x694; - uint64_t x695; - uint64_t x696; - uint64_t x697; - uint64_t x698; - uint64_t x699; - fiat_p318233_uint1 x700; - uint64_t x701; - fiat_p318233_uint1 x702; - uint64_t x703; - fiat_p318233_uint1 x704; - uint64_t x705; - fiat_p318233_uint1 x706; - uint64_t x707; - fiat_p318233_uint1 x708; - uint64_t x709; - fiat_p318233_uint1 x710; - uint64_t x711; - fiat_p318233_uint1 x712; - uint64_t x713; - uint64_t x714; - fiat_p318233_uint1 x715; - uint64_t x716; - fiat_p318233_uint1 x717; - uint64_t x718; - fiat_p318233_uint1 x719; - uint64_t x720; - fiat_p318233_uint1 x721; - uint64_t x722; - fiat_p318233_uint1 x723; - uint64_t x724; - fiat_p318233_uint1 x725; - uint64_t x726; - fiat_p318233_uint1 x727; - uint64_t x728; - fiat_p318233_uint1 x729; - uint64_t x730; - fiat_p318233_uint1 x731; - uint64_t x732; - uint64_t x733; - uint64_t x734; - uint64_t x735; - uint64_t x736; - uint64_t x737; - uint64_t x738; - uint64_t x739; - uint64_t x740; - uint64_t x741; - uint64_t x742; - uint64_t x743; - uint64_t x744; - uint64_t x745; - uint64_t x746; - uint64_t x747; - uint64_t x748; - fiat_p318233_uint1 x749; - uint64_t x750; - fiat_p318233_uint1 x751; - uint64_t x752; - fiat_p318233_uint1 x753; - uint64_t x754; - fiat_p318233_uint1 x755; - uint64_t x756; - fiat_p318233_uint1 x757; - uint64_t x758; - fiat_p318233_uint1 x759; - uint64_t x760; - fiat_p318233_uint1 x761; - uint64_t x762; - uint64_t x763; - fiat_p318233_uint1 x764; - uint64_t x765; - fiat_p318233_uint1 x766; - uint64_t x767; - fiat_p318233_uint1 x768; - uint64_t x769; - fiat_p318233_uint1 x770; - uint64_t x771; - fiat_p318233_uint1 x772; - uint64_t x773; - fiat_p318233_uint1 x774; - uint64_t x775; - fiat_p318233_uint1 x776; - uint64_t x777; - fiat_p318233_uint1 x778; - uint64_t x779; - fiat_p318233_uint1 x780; - uint64_t x781; - uint64_t x782; - fiat_p318233_uint1 x783; - uint64_t x784; - fiat_p318233_uint1 x785; - uint64_t x786; - fiat_p318233_uint1 x787; - uint64_t x788; - fiat_p318233_uint1 x789; - uint64_t x790; - fiat_p318233_uint1 x791; - uint64_t x792; - fiat_p318233_uint1 x793; - uint64_t x794; - fiat_p318233_uint1 x795; - uint64_t x796; - fiat_p318233_uint1 x797; - uint64_t x798; - fiat_p318233_uint1 x799; - uint64_t x800; - uint64_t x801; - uint64_t x802; - uint64_t x803; - uint64_t x804; - uint64_t x805; - uint64_t x806; - uint64_t x807; - x1 = (arg1[1]); - x2 = (arg1[2]); - x3 = (arg1[3]); - x4 = (arg1[4]); - x5 = (arg1[5]); - x6 = (arg1[6]); - x7 = (arg1[7]); - x8 = (arg1[0]); - fiat_p318233_mulx_u64(&x9, &x10, x8, (arg2[7])); - fiat_p318233_mulx_u64(&x11, &x12, x8, (arg2[6])); - fiat_p318233_mulx_u64(&x13, &x14, x8, (arg2[5])); - fiat_p318233_mulx_u64(&x15, &x16, x8, (arg2[4])); - fiat_p318233_mulx_u64(&x17, &x18, x8, (arg2[3])); - fiat_p318233_mulx_u64(&x19, &x20, x8, (arg2[2])); - fiat_p318233_mulx_u64(&x21, &x22, x8, (arg2[1])); - fiat_p318233_mulx_u64(&x23, &x24, x8, (arg2[0])); - fiat_p318233_addcarryx_u64(&x25, &x26, 0x0, x24, x21); - fiat_p318233_addcarryx_u64(&x27, &x28, x26, x22, x19); - fiat_p318233_addcarryx_u64(&x29, &x30, x28, x20, x17); - fiat_p318233_addcarryx_u64(&x31, &x32, x30, x18, x15); - fiat_p318233_addcarryx_u64(&x33, &x34, x32, x16, x13); - fiat_p318233_addcarryx_u64(&x35, &x36, x34, x14, x11); - fiat_p318233_addcarryx_u64(&x37, &x38, x36, x12, x9); - x39 = (x38 + x10); - fiat_p318233_mulx_u64(&x40, &x41, x23, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x42, &x43, x23, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x44, &x45, x23, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x46, &x47, x23, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x48, &x49, x23, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x50, &x51, x23, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x52, &x53, x23, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x54, &x55, x23, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x56, &x57, 0x0, x55, x52); - fiat_p318233_addcarryx_u64(&x58, &x59, x57, x53, x50); - fiat_p318233_addcarryx_u64(&x60, &x61, x59, x51, x48); - fiat_p318233_addcarryx_u64(&x62, &x63, x61, x49, x46); - fiat_p318233_addcarryx_u64(&x64, &x65, x63, x47, x44); - fiat_p318233_addcarryx_u64(&x66, &x67, x65, x45, x42); - fiat_p318233_addcarryx_u64(&x68, &x69, x67, x43, x40); - x70 = (x69 + x41); - fiat_p318233_addcarryx_u64(&x71, &x72, 0x0, x23, x54); - fiat_p318233_addcarryx_u64(&x73, &x74, x72, x25, x56); - fiat_p318233_addcarryx_u64(&x75, &x76, x74, x27, x58); - fiat_p318233_addcarryx_u64(&x77, &x78, x76, x29, x60); - fiat_p318233_addcarryx_u64(&x79, &x80, x78, x31, x62); - fiat_p318233_addcarryx_u64(&x81, &x82, x80, x33, x64); - fiat_p318233_addcarryx_u64(&x83, &x84, x82, x35, x66); - fiat_p318233_addcarryx_u64(&x85, &x86, x84, x37, x68); - fiat_p318233_addcarryx_u64(&x87, &x88, x86, x39, x70); - fiat_p318233_mulx_u64(&x89, &x90, x1, (arg2[7])); - fiat_p318233_mulx_u64(&x91, &x92, x1, (arg2[6])); - fiat_p318233_mulx_u64(&x93, &x94, x1, (arg2[5])); - fiat_p318233_mulx_u64(&x95, &x96, x1, (arg2[4])); - fiat_p318233_mulx_u64(&x97, &x98, x1, (arg2[3])); - fiat_p318233_mulx_u64(&x99, &x100, x1, (arg2[2])); - fiat_p318233_mulx_u64(&x101, &x102, x1, (arg2[1])); - fiat_p318233_mulx_u64(&x103, &x104, x1, (arg2[0])); - fiat_p318233_addcarryx_u64(&x105, &x106, 0x0, x104, x101); - fiat_p318233_addcarryx_u64(&x107, &x108, x106, x102, x99); - fiat_p318233_addcarryx_u64(&x109, &x110, x108, x100, x97); - fiat_p318233_addcarryx_u64(&x111, &x112, x110, x98, x95); - fiat_p318233_addcarryx_u64(&x113, &x114, x112, x96, x93); - fiat_p318233_addcarryx_u64(&x115, &x116, x114, x94, x91); - fiat_p318233_addcarryx_u64(&x117, &x118, x116, x92, x89); - x119 = (x118 + x90); - fiat_p318233_addcarryx_u64(&x120, &x121, 0x0, x73, x103); - fiat_p318233_addcarryx_u64(&x122, &x123, x121, x75, x105); - fiat_p318233_addcarryx_u64(&x124, &x125, x123, x77, x107); - fiat_p318233_addcarryx_u64(&x126, &x127, x125, x79, x109); - fiat_p318233_addcarryx_u64(&x128, &x129, x127, x81, x111); - fiat_p318233_addcarryx_u64(&x130, &x131, x129, x83, x113); - fiat_p318233_addcarryx_u64(&x132, &x133, x131, x85, x115); - fiat_p318233_addcarryx_u64(&x134, &x135, x133, x87, x117); - fiat_p318233_addcarryx_u64(&x136, &x137, x135, x88, x119); - fiat_p318233_mulx_u64(&x138, &x139, x120, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x140, &x141, x120, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x142, &x143, x120, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x144, &x145, x120, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x146, &x147, x120, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x148, &x149, x120, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x150, &x151, x120, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x152, &x153, x120, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x154, &x155, 0x0, x153, x150); - fiat_p318233_addcarryx_u64(&x156, &x157, x155, x151, x148); - fiat_p318233_addcarryx_u64(&x158, &x159, x157, x149, x146); - fiat_p318233_addcarryx_u64(&x160, &x161, x159, x147, x144); - fiat_p318233_addcarryx_u64(&x162, &x163, x161, x145, x142); - fiat_p318233_addcarryx_u64(&x164, &x165, x163, x143, x140); - fiat_p318233_addcarryx_u64(&x166, &x167, x165, x141, x138); - x168 = (x167 + x139); - fiat_p318233_addcarryx_u64(&x169, &x170, 0x0, x120, x152); - fiat_p318233_addcarryx_u64(&x171, &x172, x170, x122, x154); - fiat_p318233_addcarryx_u64(&x173, &x174, x172, x124, x156); - fiat_p318233_addcarryx_u64(&x175, &x176, x174, x126, x158); - fiat_p318233_addcarryx_u64(&x177, &x178, x176, x128, x160); - fiat_p318233_addcarryx_u64(&x179, &x180, x178, x130, x162); - fiat_p318233_addcarryx_u64(&x181, &x182, x180, x132, x164); - fiat_p318233_addcarryx_u64(&x183, &x184, x182, x134, x166); - fiat_p318233_addcarryx_u64(&x185, &x186, x184, x136, x168); - x187 = ((uint64_t)x186 + x137); - fiat_p318233_mulx_u64(&x188, &x189, x2, (arg2[7])); - fiat_p318233_mulx_u64(&x190, &x191, x2, (arg2[6])); - fiat_p318233_mulx_u64(&x192, &x193, x2, (arg2[5])); - fiat_p318233_mulx_u64(&x194, &x195, x2, (arg2[4])); - fiat_p318233_mulx_u64(&x196, &x197, x2, (arg2[3])); - fiat_p318233_mulx_u64(&x198, &x199, x2, (arg2[2])); - fiat_p318233_mulx_u64(&x200, &x201, x2, (arg2[1])); - fiat_p318233_mulx_u64(&x202, &x203, x2, (arg2[0])); - fiat_p318233_addcarryx_u64(&x204, &x205, 0x0, x203, x200); - fiat_p318233_addcarryx_u64(&x206, &x207, x205, x201, x198); - fiat_p318233_addcarryx_u64(&x208, &x209, x207, x199, x196); - fiat_p318233_addcarryx_u64(&x210, &x211, x209, x197, x194); - fiat_p318233_addcarryx_u64(&x212, &x213, x211, x195, x192); - fiat_p318233_addcarryx_u64(&x214, &x215, x213, x193, x190); - fiat_p318233_addcarryx_u64(&x216, &x217, x215, x191, x188); - x218 = (x217 + x189); - fiat_p318233_addcarryx_u64(&x219, &x220, 0x0, x171, x202); - fiat_p318233_addcarryx_u64(&x221, &x222, x220, x173, x204); - fiat_p318233_addcarryx_u64(&x223, &x224, x222, x175, x206); - fiat_p318233_addcarryx_u64(&x225, &x226, x224, x177, x208); - fiat_p318233_addcarryx_u64(&x227, &x228, x226, x179, x210); - fiat_p318233_addcarryx_u64(&x229, &x230, x228, x181, x212); - fiat_p318233_addcarryx_u64(&x231, &x232, x230, x183, x214); - fiat_p318233_addcarryx_u64(&x233, &x234, x232, x185, x216); - fiat_p318233_addcarryx_u64(&x235, &x236, x234, x187, x218); - fiat_p318233_mulx_u64(&x237, &x238, x219, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x239, &x240, x219, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x241, &x242, x219, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x243, &x244, x219, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x245, &x246, x219, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x247, &x248, x219, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x249, &x250, x219, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x251, &x252, x219, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x253, &x254, 0x0, x252, x249); - fiat_p318233_addcarryx_u64(&x255, &x256, x254, x250, x247); - fiat_p318233_addcarryx_u64(&x257, &x258, x256, x248, x245); - fiat_p318233_addcarryx_u64(&x259, &x260, x258, x246, x243); - fiat_p318233_addcarryx_u64(&x261, &x262, x260, x244, x241); - fiat_p318233_addcarryx_u64(&x263, &x264, x262, x242, x239); - fiat_p318233_addcarryx_u64(&x265, &x266, x264, x240, x237); - x267 = (x266 + x238); - fiat_p318233_addcarryx_u64(&x268, &x269, 0x0, x219, x251); - fiat_p318233_addcarryx_u64(&x270, &x271, x269, x221, x253); - fiat_p318233_addcarryx_u64(&x272, &x273, x271, x223, x255); - fiat_p318233_addcarryx_u64(&x274, &x275, x273, x225, x257); - fiat_p318233_addcarryx_u64(&x276, &x277, x275, x227, x259); - fiat_p318233_addcarryx_u64(&x278, &x279, x277, x229, x261); - fiat_p318233_addcarryx_u64(&x280, &x281, x279, x231, x263); - fiat_p318233_addcarryx_u64(&x282, &x283, x281, x233, x265); - fiat_p318233_addcarryx_u64(&x284, &x285, x283, x235, x267); - x286 = ((uint64_t)x285 + x236); - fiat_p318233_mulx_u64(&x287, &x288, x3, (arg2[7])); - fiat_p318233_mulx_u64(&x289, &x290, x3, (arg2[6])); - fiat_p318233_mulx_u64(&x291, &x292, x3, (arg2[5])); - fiat_p318233_mulx_u64(&x293, &x294, x3, (arg2[4])); - fiat_p318233_mulx_u64(&x295, &x296, x3, (arg2[3])); - fiat_p318233_mulx_u64(&x297, &x298, x3, (arg2[2])); - fiat_p318233_mulx_u64(&x299, &x300, x3, (arg2[1])); - fiat_p318233_mulx_u64(&x301, &x302, x3, (arg2[0])); - fiat_p318233_addcarryx_u64(&x303, &x304, 0x0, x302, x299); - fiat_p318233_addcarryx_u64(&x305, &x306, x304, x300, x297); - fiat_p318233_addcarryx_u64(&x307, &x308, x306, x298, x295); - fiat_p318233_addcarryx_u64(&x309, &x310, x308, x296, x293); - fiat_p318233_addcarryx_u64(&x311, &x312, x310, x294, x291); - fiat_p318233_addcarryx_u64(&x313, &x314, x312, x292, x289); - fiat_p318233_addcarryx_u64(&x315, &x316, x314, x290, x287); - x317 = (x316 + x288); - fiat_p318233_addcarryx_u64(&x318, &x319, 0x0, x270, x301); - fiat_p318233_addcarryx_u64(&x320, &x321, x319, x272, x303); - fiat_p318233_addcarryx_u64(&x322, &x323, x321, x274, x305); - fiat_p318233_addcarryx_u64(&x324, &x325, x323, x276, x307); - fiat_p318233_addcarryx_u64(&x326, &x327, x325, x278, x309); - fiat_p318233_addcarryx_u64(&x328, &x329, x327, x280, x311); - fiat_p318233_addcarryx_u64(&x330, &x331, x329, x282, x313); - fiat_p318233_addcarryx_u64(&x332, &x333, x331, x284, x315); - fiat_p318233_addcarryx_u64(&x334, &x335, x333, x286, x317); - fiat_p318233_mulx_u64(&x336, &x337, x318, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x338, &x339, x318, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x340, &x341, x318, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x342, &x343, x318, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x344, &x345, x318, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x346, &x347, x318, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x348, &x349, x318, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x350, &x351, x318, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x352, &x353, 0x0, x351, x348); - fiat_p318233_addcarryx_u64(&x354, &x355, x353, x349, x346); - fiat_p318233_addcarryx_u64(&x356, &x357, x355, x347, x344); - fiat_p318233_addcarryx_u64(&x358, &x359, x357, x345, x342); - fiat_p318233_addcarryx_u64(&x360, &x361, x359, x343, x340); - fiat_p318233_addcarryx_u64(&x362, &x363, x361, x341, x338); - fiat_p318233_addcarryx_u64(&x364, &x365, x363, x339, x336); - x366 = (x365 + x337); - fiat_p318233_addcarryx_u64(&x367, &x368, 0x0, x318, x350); - fiat_p318233_addcarryx_u64(&x369, &x370, x368, x320, x352); - fiat_p318233_addcarryx_u64(&x371, &x372, x370, x322, x354); - fiat_p318233_addcarryx_u64(&x373, &x374, x372, x324, x356); - fiat_p318233_addcarryx_u64(&x375, &x376, x374, x326, x358); - fiat_p318233_addcarryx_u64(&x377, &x378, x376, x328, x360); - fiat_p318233_addcarryx_u64(&x379, &x380, x378, x330, x362); - fiat_p318233_addcarryx_u64(&x381, &x382, x380, x332, x364); - fiat_p318233_addcarryx_u64(&x383, &x384, x382, x334, x366); - x385 = ((uint64_t)x384 + x335); - fiat_p318233_mulx_u64(&x386, &x387, x4, (arg2[7])); - fiat_p318233_mulx_u64(&x388, &x389, x4, (arg2[6])); - fiat_p318233_mulx_u64(&x390, &x391, x4, (arg2[5])); - fiat_p318233_mulx_u64(&x392, &x393, x4, (arg2[4])); - fiat_p318233_mulx_u64(&x394, &x395, x4, (arg2[3])); - fiat_p318233_mulx_u64(&x396, &x397, x4, (arg2[2])); - fiat_p318233_mulx_u64(&x398, &x399, x4, (arg2[1])); - fiat_p318233_mulx_u64(&x400, &x401, x4, (arg2[0])); - fiat_p318233_addcarryx_u64(&x402, &x403, 0x0, x401, x398); - fiat_p318233_addcarryx_u64(&x404, &x405, x403, x399, x396); - fiat_p318233_addcarryx_u64(&x406, &x407, x405, x397, x394); - fiat_p318233_addcarryx_u64(&x408, &x409, x407, x395, x392); - fiat_p318233_addcarryx_u64(&x410, &x411, x409, x393, x390); - fiat_p318233_addcarryx_u64(&x412, &x413, x411, x391, x388); - fiat_p318233_addcarryx_u64(&x414, &x415, x413, x389, x386); - x416 = (x415 + x387); - fiat_p318233_addcarryx_u64(&x417, &x418, 0x0, x369, x400); - fiat_p318233_addcarryx_u64(&x419, &x420, x418, x371, x402); - fiat_p318233_addcarryx_u64(&x421, &x422, x420, x373, x404); - fiat_p318233_addcarryx_u64(&x423, &x424, x422, x375, x406); - fiat_p318233_addcarryx_u64(&x425, &x426, x424, x377, x408); - fiat_p318233_addcarryx_u64(&x427, &x428, x426, x379, x410); - fiat_p318233_addcarryx_u64(&x429, &x430, x428, x381, x412); - fiat_p318233_addcarryx_u64(&x431, &x432, x430, x383, x414); - fiat_p318233_addcarryx_u64(&x433, &x434, x432, x385, x416); - fiat_p318233_mulx_u64(&x435, &x436, x417, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x437, &x438, x417, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x439, &x440, x417, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x441, &x442, x417, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x443, &x444, x417, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x445, &x446, x417, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x447, &x448, x417, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x449, &x450, x417, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x451, &x452, 0x0, x450, x447); - fiat_p318233_addcarryx_u64(&x453, &x454, x452, x448, x445); - fiat_p318233_addcarryx_u64(&x455, &x456, x454, x446, x443); - fiat_p318233_addcarryx_u64(&x457, &x458, x456, x444, x441); - fiat_p318233_addcarryx_u64(&x459, &x460, x458, x442, x439); - fiat_p318233_addcarryx_u64(&x461, &x462, x460, x440, x437); - fiat_p318233_addcarryx_u64(&x463, &x464, x462, x438, x435); - x465 = (x464 + x436); - fiat_p318233_addcarryx_u64(&x466, &x467, 0x0, x417, x449); - fiat_p318233_addcarryx_u64(&x468, &x469, x467, x419, x451); - fiat_p318233_addcarryx_u64(&x470, &x471, x469, x421, x453); - fiat_p318233_addcarryx_u64(&x472, &x473, x471, x423, x455); - fiat_p318233_addcarryx_u64(&x474, &x475, x473, x425, x457); - fiat_p318233_addcarryx_u64(&x476, &x477, x475, x427, x459); - fiat_p318233_addcarryx_u64(&x478, &x479, x477, x429, x461); - fiat_p318233_addcarryx_u64(&x480, &x481, x479, x431, x463); - fiat_p318233_addcarryx_u64(&x482, &x483, x481, x433, x465); - x484 = ((uint64_t)x483 + x434); - fiat_p318233_mulx_u64(&x485, &x486, x5, (arg2[7])); - fiat_p318233_mulx_u64(&x487, &x488, x5, (arg2[6])); - fiat_p318233_mulx_u64(&x489, &x490, x5, (arg2[5])); - fiat_p318233_mulx_u64(&x491, &x492, x5, (arg2[4])); - fiat_p318233_mulx_u64(&x493, &x494, x5, (arg2[3])); - fiat_p318233_mulx_u64(&x495, &x496, x5, (arg2[2])); - fiat_p318233_mulx_u64(&x497, &x498, x5, (arg2[1])); - fiat_p318233_mulx_u64(&x499, &x500, x5, (arg2[0])); - fiat_p318233_addcarryx_u64(&x501, &x502, 0x0, x500, x497); - fiat_p318233_addcarryx_u64(&x503, &x504, x502, x498, x495); - fiat_p318233_addcarryx_u64(&x505, &x506, x504, x496, x493); - fiat_p318233_addcarryx_u64(&x507, &x508, x506, x494, x491); - fiat_p318233_addcarryx_u64(&x509, &x510, x508, x492, x489); - fiat_p318233_addcarryx_u64(&x511, &x512, x510, x490, x487); - fiat_p318233_addcarryx_u64(&x513, &x514, x512, x488, x485); - x515 = (x514 + x486); - fiat_p318233_addcarryx_u64(&x516, &x517, 0x0, x468, x499); - fiat_p318233_addcarryx_u64(&x518, &x519, x517, x470, x501); - fiat_p318233_addcarryx_u64(&x520, &x521, x519, x472, x503); - fiat_p318233_addcarryx_u64(&x522, &x523, x521, x474, x505); - fiat_p318233_addcarryx_u64(&x524, &x525, x523, x476, x507); - fiat_p318233_addcarryx_u64(&x526, &x527, x525, x478, x509); - fiat_p318233_addcarryx_u64(&x528, &x529, x527, x480, x511); - fiat_p318233_addcarryx_u64(&x530, &x531, x529, x482, x513); - fiat_p318233_addcarryx_u64(&x532, &x533, x531, x484, x515); - fiat_p318233_mulx_u64(&x534, &x535, x516, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x536, &x537, x516, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x538, &x539, x516, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x540, &x541, x516, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x542, &x543, x516, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x544, &x545, x516, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x546, &x547, x516, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x548, &x549, x516, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x550, &x551, 0x0, x549, x546); - fiat_p318233_addcarryx_u64(&x552, &x553, x551, x547, x544); - fiat_p318233_addcarryx_u64(&x554, &x555, x553, x545, x542); - fiat_p318233_addcarryx_u64(&x556, &x557, x555, x543, x540); - fiat_p318233_addcarryx_u64(&x558, &x559, x557, x541, x538); - fiat_p318233_addcarryx_u64(&x560, &x561, x559, x539, x536); - fiat_p318233_addcarryx_u64(&x562, &x563, x561, x537, x534); - x564 = (x563 + x535); - fiat_p318233_addcarryx_u64(&x565, &x566, 0x0, x516, x548); - fiat_p318233_addcarryx_u64(&x567, &x568, x566, x518, x550); - fiat_p318233_addcarryx_u64(&x569, &x570, x568, x520, x552); - fiat_p318233_addcarryx_u64(&x571, &x572, x570, x522, x554); - fiat_p318233_addcarryx_u64(&x573, &x574, x572, x524, x556); - fiat_p318233_addcarryx_u64(&x575, &x576, x574, x526, x558); - fiat_p318233_addcarryx_u64(&x577, &x578, x576, x528, x560); - fiat_p318233_addcarryx_u64(&x579, &x580, x578, x530, x562); - fiat_p318233_addcarryx_u64(&x581, &x582, x580, x532, x564); - x583 = ((uint64_t)x582 + x533); - fiat_p318233_mulx_u64(&x584, &x585, x6, (arg2[7])); - fiat_p318233_mulx_u64(&x586, &x587, x6, (arg2[6])); - fiat_p318233_mulx_u64(&x588, &x589, x6, (arg2[5])); - fiat_p318233_mulx_u64(&x590, &x591, x6, (arg2[4])); - fiat_p318233_mulx_u64(&x592, &x593, x6, (arg2[3])); - fiat_p318233_mulx_u64(&x594, &x595, x6, (arg2[2])); - fiat_p318233_mulx_u64(&x596, &x597, x6, (arg2[1])); - fiat_p318233_mulx_u64(&x598, &x599, x6, (arg2[0])); - fiat_p318233_addcarryx_u64(&x600, &x601, 0x0, x599, x596); - fiat_p318233_addcarryx_u64(&x602, &x603, x601, x597, x594); - fiat_p318233_addcarryx_u64(&x604, &x605, x603, x595, x592); - fiat_p318233_addcarryx_u64(&x606, &x607, x605, x593, x590); - fiat_p318233_addcarryx_u64(&x608, &x609, x607, x591, x588); - fiat_p318233_addcarryx_u64(&x610, &x611, x609, x589, x586); - fiat_p318233_addcarryx_u64(&x612, &x613, x611, x587, x584); - x614 = (x613 + x585); - fiat_p318233_addcarryx_u64(&x615, &x616, 0x0, x567, x598); - fiat_p318233_addcarryx_u64(&x617, &x618, x616, x569, x600); - fiat_p318233_addcarryx_u64(&x619, &x620, x618, x571, x602); - fiat_p318233_addcarryx_u64(&x621, &x622, x620, x573, x604); - fiat_p318233_addcarryx_u64(&x623, &x624, x622, x575, x606); - fiat_p318233_addcarryx_u64(&x625, &x626, x624, x577, x608); - fiat_p318233_addcarryx_u64(&x627, &x628, x626, x579, x610); - fiat_p318233_addcarryx_u64(&x629, &x630, x628, x581, x612); - fiat_p318233_addcarryx_u64(&x631, &x632, x630, x583, x614); - fiat_p318233_mulx_u64(&x633, &x634, x615, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x635, &x636, x615, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x637, &x638, x615, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x639, &x640, x615, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x641, &x642, x615, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x643, &x644, x615, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x645, &x646, x615, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x647, &x648, x615, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x649, &x650, 0x0, x648, x645); - fiat_p318233_addcarryx_u64(&x651, &x652, x650, x646, x643); - fiat_p318233_addcarryx_u64(&x653, &x654, x652, x644, x641); - fiat_p318233_addcarryx_u64(&x655, &x656, x654, x642, x639); - fiat_p318233_addcarryx_u64(&x657, &x658, x656, x640, x637); - fiat_p318233_addcarryx_u64(&x659, &x660, x658, x638, x635); - fiat_p318233_addcarryx_u64(&x661, &x662, x660, x636, x633); - x663 = (x662 + x634); - fiat_p318233_addcarryx_u64(&x664, &x665, 0x0, x615, x647); - fiat_p318233_addcarryx_u64(&x666, &x667, x665, x617, x649); - fiat_p318233_addcarryx_u64(&x668, &x669, x667, x619, x651); - fiat_p318233_addcarryx_u64(&x670, &x671, x669, x621, x653); - fiat_p318233_addcarryx_u64(&x672, &x673, x671, x623, x655); - fiat_p318233_addcarryx_u64(&x674, &x675, x673, x625, x657); - fiat_p318233_addcarryx_u64(&x676, &x677, x675, x627, x659); - fiat_p318233_addcarryx_u64(&x678, &x679, x677, x629, x661); - fiat_p318233_addcarryx_u64(&x680, &x681, x679, x631, x663); - x682 = ((uint64_t)x681 + x632); - fiat_p318233_mulx_u64(&x683, &x684, x7, (arg2[7])); - fiat_p318233_mulx_u64(&x685, &x686, x7, (arg2[6])); - fiat_p318233_mulx_u64(&x687, &x688, x7, (arg2[5])); - fiat_p318233_mulx_u64(&x689, &x690, x7, (arg2[4])); - fiat_p318233_mulx_u64(&x691, &x692, x7, (arg2[3])); - fiat_p318233_mulx_u64(&x693, &x694, x7, (arg2[2])); - fiat_p318233_mulx_u64(&x695, &x696, x7, (arg2[1])); - fiat_p318233_mulx_u64(&x697, &x698, x7, (arg2[0])); - fiat_p318233_addcarryx_u64(&x699, &x700, 0x0, x698, x695); - fiat_p318233_addcarryx_u64(&x701, &x702, x700, x696, x693); - fiat_p318233_addcarryx_u64(&x703, &x704, x702, x694, x691); - fiat_p318233_addcarryx_u64(&x705, &x706, x704, x692, x689); - fiat_p318233_addcarryx_u64(&x707, &x708, x706, x690, x687); - fiat_p318233_addcarryx_u64(&x709, &x710, x708, x688, x685); - fiat_p318233_addcarryx_u64(&x711, &x712, x710, x686, x683); - x713 = (x712 + x684); - fiat_p318233_addcarryx_u64(&x714, &x715, 0x0, x666, x697); - fiat_p318233_addcarryx_u64(&x716, &x717, x715, x668, x699); - fiat_p318233_addcarryx_u64(&x718, &x719, x717, x670, x701); - fiat_p318233_addcarryx_u64(&x720, &x721, x719, x672, x703); - fiat_p318233_addcarryx_u64(&x722, &x723, x721, x674, x705); - fiat_p318233_addcarryx_u64(&x724, &x725, x723, x676, x707); - fiat_p318233_addcarryx_u64(&x726, &x727, x725, x678, x709); - fiat_p318233_addcarryx_u64(&x728, &x729, x727, x680, x711); - fiat_p318233_addcarryx_u64(&x730, &x731, x729, x682, x713); - fiat_p318233_mulx_u64(&x732, &x733, x714, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x734, &x735, x714, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x736, &x737, x714, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x738, &x739, x714, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x740, &x741, x714, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x742, &x743, x714, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x744, &x745, x714, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x746, &x747, x714, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x748, &x749, 0x0, x747, x744); - fiat_p318233_addcarryx_u64(&x750, &x751, x749, x745, x742); - fiat_p318233_addcarryx_u64(&x752, &x753, x751, x743, x740); - fiat_p318233_addcarryx_u64(&x754, &x755, x753, x741, x738); - fiat_p318233_addcarryx_u64(&x756, &x757, x755, x739, x736); - fiat_p318233_addcarryx_u64(&x758, &x759, x757, x737, x734); - fiat_p318233_addcarryx_u64(&x760, &x761, x759, x735, x732); - x762 = (x761 + x733); - fiat_p318233_addcarryx_u64(&x763, &x764, 0x0, x714, x746); - fiat_p318233_addcarryx_u64(&x765, &x766, x764, x716, x748); - fiat_p318233_addcarryx_u64(&x767, &x768, x766, x718, x750); - fiat_p318233_addcarryx_u64(&x769, &x770, x768, x720, x752); - fiat_p318233_addcarryx_u64(&x771, &x772, x770, x722, x754); - fiat_p318233_addcarryx_u64(&x773, &x774, x772, x724, x756); - fiat_p318233_addcarryx_u64(&x775, &x776, x774, x726, x758); - fiat_p318233_addcarryx_u64(&x777, &x778, x776, x728, x760); - fiat_p318233_addcarryx_u64(&x779, &x780, x778, x730, x762); - x781 = ((uint64_t)x780 + x731); - fiat_p318233_subborrowx_u64(&x782, &x783, 0x0, x765, UINT64_C(0xffffffffffffffff)); - fiat_p318233_subborrowx_u64(&x784, &x785, x783, x767, UINT64_C(0xffffffffffffffff)); - fiat_p318233_subborrowx_u64(&x786, &x787, x785, x769, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_subborrowx_u64(&x788, &x789, x787, x771, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_subborrowx_u64(&x790, &x791, x789, x773, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_subborrowx_u64(&x792, &x793, x791, x775, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_subborrowx_u64(&x794, &x795, x793, x777, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_subborrowx_u64(&x796, &x797, x795, x779, UINT64_C(0x255946a8869bc6)); - fiat_p318233_subborrowx_u64(&x798, &x799, x797, x781, 0x0); - fiat_p318233_cmovznz_u64(&x800, x799, x782, x765); - fiat_p318233_cmovznz_u64(&x801, x799, x784, x767); - fiat_p318233_cmovznz_u64(&x802, x799, x786, x769); - fiat_p318233_cmovznz_u64(&x803, x799, x788, x771); - fiat_p318233_cmovznz_u64(&x804, x799, x790, x773); - fiat_p318233_cmovznz_u64(&x805, x799, x792, x775); - fiat_p318233_cmovznz_u64(&x806, x799, x794, x777); - fiat_p318233_cmovznz_u64(&x807, x799, x796, x779); - out1[0] = x800; - out1[1] = x801; - out1[2] = x802; - out1[3] = x803; - out1[4] = x804; - out1[5] = x805; - out1[6] = x806; - out1[7] = x807; -} - -/* - * The function fiat_p318233_square squares a field element in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg1)) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p318233_square(fiat_p318233_montgomery_domain_field_element out1, const fiat_p318233_montgomery_domain_field_element arg1) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - uint64_t x14; - uint64_t x15; - uint64_t x16; - uint64_t x17; - uint64_t x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - uint64_t x23; - uint64_t x24; - uint64_t x25; - fiat_p318233_uint1 x26; - uint64_t x27; - fiat_p318233_uint1 x28; - uint64_t x29; - fiat_p318233_uint1 x30; - uint64_t x31; - fiat_p318233_uint1 x32; - uint64_t x33; - fiat_p318233_uint1 x34; - uint64_t x35; - fiat_p318233_uint1 x36; - uint64_t x37; - fiat_p318233_uint1 x38; - uint64_t x39; - uint64_t x40; - uint64_t x41; - uint64_t x42; - uint64_t x43; - uint64_t x44; - uint64_t x45; - uint64_t x46; - uint64_t x47; - uint64_t x48; - uint64_t x49; - uint64_t x50; - uint64_t x51; - uint64_t x52; - uint64_t x53; - uint64_t x54; - uint64_t x55; - uint64_t x56; - fiat_p318233_uint1 x57; - uint64_t x58; - fiat_p318233_uint1 x59; - uint64_t x60; - fiat_p318233_uint1 x61; - uint64_t x62; - fiat_p318233_uint1 x63; - uint64_t x64; - fiat_p318233_uint1 x65; - uint64_t x66; - fiat_p318233_uint1 x67; - uint64_t x68; - fiat_p318233_uint1 x69; - uint64_t x70; - uint64_t x71; - fiat_p318233_uint1 x72; - uint64_t x73; - fiat_p318233_uint1 x74; - uint64_t x75; - fiat_p318233_uint1 x76; - uint64_t x77; - fiat_p318233_uint1 x78; - uint64_t x79; - fiat_p318233_uint1 x80; - uint64_t x81; - fiat_p318233_uint1 x82; - uint64_t x83; - fiat_p318233_uint1 x84; - uint64_t x85; - fiat_p318233_uint1 x86; - uint64_t x87; - fiat_p318233_uint1 x88; - uint64_t x89; - uint64_t x90; - uint64_t x91; - uint64_t x92; - uint64_t x93; - uint64_t x94; - uint64_t x95; - uint64_t x96; - uint64_t x97; - uint64_t x98; - uint64_t x99; - uint64_t x100; - uint64_t x101; - uint64_t x102; - uint64_t x103; - uint64_t x104; - uint64_t x105; - fiat_p318233_uint1 x106; - uint64_t x107; - fiat_p318233_uint1 x108; - uint64_t x109; - fiat_p318233_uint1 x110; - uint64_t x111; - fiat_p318233_uint1 x112; - uint64_t x113; - fiat_p318233_uint1 x114; - uint64_t x115; - fiat_p318233_uint1 x116; - uint64_t x117; - fiat_p318233_uint1 x118; - uint64_t x119; - uint64_t x120; - fiat_p318233_uint1 x121; - uint64_t x122; - fiat_p318233_uint1 x123; - uint64_t x124; - fiat_p318233_uint1 x125; - uint64_t x126; - fiat_p318233_uint1 x127; - uint64_t x128; - fiat_p318233_uint1 x129; - uint64_t x130; - fiat_p318233_uint1 x131; - uint64_t x132; - fiat_p318233_uint1 x133; - uint64_t x134; - fiat_p318233_uint1 x135; - uint64_t x136; - fiat_p318233_uint1 x137; - uint64_t x138; - uint64_t x139; - uint64_t x140; - uint64_t x141; - uint64_t x142; - uint64_t x143; - uint64_t x144; - uint64_t x145; - uint64_t x146; - uint64_t x147; - uint64_t x148; - uint64_t x149; - uint64_t x150; - uint64_t x151; - uint64_t x152; - uint64_t x153; - uint64_t x154; - fiat_p318233_uint1 x155; - uint64_t x156; - fiat_p318233_uint1 x157; - uint64_t x158; - fiat_p318233_uint1 x159; - uint64_t x160; - fiat_p318233_uint1 x161; - uint64_t x162; - fiat_p318233_uint1 x163; - uint64_t x164; - fiat_p318233_uint1 x165; - uint64_t x166; - fiat_p318233_uint1 x167; - uint64_t x168; - uint64_t x169; - fiat_p318233_uint1 x170; - uint64_t x171; - fiat_p318233_uint1 x172; - uint64_t x173; - fiat_p318233_uint1 x174; - uint64_t x175; - fiat_p318233_uint1 x176; - uint64_t x177; - fiat_p318233_uint1 x178; - uint64_t x179; - fiat_p318233_uint1 x180; - uint64_t x181; - fiat_p318233_uint1 x182; - uint64_t x183; - fiat_p318233_uint1 x184; - uint64_t x185; - fiat_p318233_uint1 x186; - uint64_t x187; - uint64_t x188; - uint64_t x189; - uint64_t x190; - uint64_t x191; - uint64_t x192; - uint64_t x193; - uint64_t x194; - uint64_t x195; - uint64_t x196; - uint64_t x197; - uint64_t x198; - uint64_t x199; - uint64_t x200; - uint64_t x201; - uint64_t x202; - uint64_t x203; - uint64_t x204; - fiat_p318233_uint1 x205; - uint64_t x206; - fiat_p318233_uint1 x207; - uint64_t x208; - fiat_p318233_uint1 x209; - uint64_t x210; - fiat_p318233_uint1 x211; - uint64_t x212; - fiat_p318233_uint1 x213; - uint64_t x214; - fiat_p318233_uint1 x215; - uint64_t x216; - fiat_p318233_uint1 x217; - uint64_t x218; - uint64_t x219; - fiat_p318233_uint1 x220; - uint64_t x221; - fiat_p318233_uint1 x222; - uint64_t x223; - fiat_p318233_uint1 x224; - uint64_t x225; - fiat_p318233_uint1 x226; - uint64_t x227; - fiat_p318233_uint1 x228; - uint64_t x229; - fiat_p318233_uint1 x230; - uint64_t x231; - fiat_p318233_uint1 x232; - uint64_t x233; - fiat_p318233_uint1 x234; - uint64_t x235; - fiat_p318233_uint1 x236; - uint64_t x237; - uint64_t x238; - uint64_t x239; - uint64_t x240; - uint64_t x241; - uint64_t x242; - uint64_t x243; - uint64_t x244; - uint64_t x245; - uint64_t x246; - uint64_t x247; - uint64_t x248; - uint64_t x249; - uint64_t x250; - uint64_t x251; - uint64_t x252; - uint64_t x253; - fiat_p318233_uint1 x254; - uint64_t x255; - fiat_p318233_uint1 x256; - uint64_t x257; - fiat_p318233_uint1 x258; - uint64_t x259; - fiat_p318233_uint1 x260; - uint64_t x261; - fiat_p318233_uint1 x262; - uint64_t x263; - fiat_p318233_uint1 x264; - uint64_t x265; - fiat_p318233_uint1 x266; - uint64_t x267; - uint64_t x268; - fiat_p318233_uint1 x269; - uint64_t x270; - fiat_p318233_uint1 x271; - uint64_t x272; - fiat_p318233_uint1 x273; - uint64_t x274; - fiat_p318233_uint1 x275; - uint64_t x276; - fiat_p318233_uint1 x277; - uint64_t x278; - fiat_p318233_uint1 x279; - uint64_t x280; - fiat_p318233_uint1 x281; - uint64_t x282; - fiat_p318233_uint1 x283; - uint64_t x284; - fiat_p318233_uint1 x285; - uint64_t x286; - uint64_t x287; - uint64_t x288; - uint64_t x289; - uint64_t x290; - uint64_t x291; - uint64_t x292; - uint64_t x293; - uint64_t x294; - uint64_t x295; - uint64_t x296; - uint64_t x297; - uint64_t x298; - uint64_t x299; - uint64_t x300; - uint64_t x301; - uint64_t x302; - uint64_t x303; - fiat_p318233_uint1 x304; - uint64_t x305; - fiat_p318233_uint1 x306; - uint64_t x307; - fiat_p318233_uint1 x308; - uint64_t x309; - fiat_p318233_uint1 x310; - uint64_t x311; - fiat_p318233_uint1 x312; - uint64_t x313; - fiat_p318233_uint1 x314; - uint64_t x315; - fiat_p318233_uint1 x316; - uint64_t x317; - uint64_t x318; - fiat_p318233_uint1 x319; - uint64_t x320; - fiat_p318233_uint1 x321; - uint64_t x322; - fiat_p318233_uint1 x323; - uint64_t x324; - fiat_p318233_uint1 x325; - uint64_t x326; - fiat_p318233_uint1 x327; - uint64_t x328; - fiat_p318233_uint1 x329; - uint64_t x330; - fiat_p318233_uint1 x331; - uint64_t x332; - fiat_p318233_uint1 x333; - uint64_t x334; - fiat_p318233_uint1 x335; - uint64_t x336; - uint64_t x337; - uint64_t x338; - uint64_t x339; - uint64_t x340; - uint64_t x341; - uint64_t x342; - uint64_t x343; - uint64_t x344; - uint64_t x345; - uint64_t x346; - uint64_t x347; - uint64_t x348; - uint64_t x349; - uint64_t x350; - uint64_t x351; - uint64_t x352; - fiat_p318233_uint1 x353; - uint64_t x354; - fiat_p318233_uint1 x355; - uint64_t x356; - fiat_p318233_uint1 x357; - uint64_t x358; - fiat_p318233_uint1 x359; - uint64_t x360; - fiat_p318233_uint1 x361; - uint64_t x362; - fiat_p318233_uint1 x363; - uint64_t x364; - fiat_p318233_uint1 x365; - uint64_t x366; - uint64_t x367; - fiat_p318233_uint1 x368; - uint64_t x369; - fiat_p318233_uint1 x370; - uint64_t x371; - fiat_p318233_uint1 x372; - uint64_t x373; - fiat_p318233_uint1 x374; - uint64_t x375; - fiat_p318233_uint1 x376; - uint64_t x377; - fiat_p318233_uint1 x378; - uint64_t x379; - fiat_p318233_uint1 x380; - uint64_t x381; - fiat_p318233_uint1 x382; - uint64_t x383; - fiat_p318233_uint1 x384; - uint64_t x385; - uint64_t x386; - uint64_t x387; - uint64_t x388; - uint64_t x389; - uint64_t x390; - uint64_t x391; - uint64_t x392; - uint64_t x393; - uint64_t x394; - uint64_t x395; - uint64_t x396; - uint64_t x397; - uint64_t x398; - uint64_t x399; - uint64_t x400; - uint64_t x401; - uint64_t x402; - fiat_p318233_uint1 x403; - uint64_t x404; - fiat_p318233_uint1 x405; - uint64_t x406; - fiat_p318233_uint1 x407; - uint64_t x408; - fiat_p318233_uint1 x409; - uint64_t x410; - fiat_p318233_uint1 x411; - uint64_t x412; - fiat_p318233_uint1 x413; - uint64_t x414; - fiat_p318233_uint1 x415; - uint64_t x416; - uint64_t x417; - fiat_p318233_uint1 x418; - uint64_t x419; - fiat_p318233_uint1 x420; - uint64_t x421; - fiat_p318233_uint1 x422; - uint64_t x423; - fiat_p318233_uint1 x424; - uint64_t x425; - fiat_p318233_uint1 x426; - uint64_t x427; - fiat_p318233_uint1 x428; - uint64_t x429; - fiat_p318233_uint1 x430; - uint64_t x431; - fiat_p318233_uint1 x432; - uint64_t x433; - fiat_p318233_uint1 x434; - uint64_t x435; - uint64_t x436; - uint64_t x437; - uint64_t x438; - uint64_t x439; - uint64_t x440; - uint64_t x441; - uint64_t x442; - uint64_t x443; - uint64_t x444; - uint64_t x445; - uint64_t x446; - uint64_t x447; - uint64_t x448; - uint64_t x449; - uint64_t x450; - uint64_t x451; - fiat_p318233_uint1 x452; - uint64_t x453; - fiat_p318233_uint1 x454; - uint64_t x455; - fiat_p318233_uint1 x456; - uint64_t x457; - fiat_p318233_uint1 x458; - uint64_t x459; - fiat_p318233_uint1 x460; - uint64_t x461; - fiat_p318233_uint1 x462; - uint64_t x463; - fiat_p318233_uint1 x464; - uint64_t x465; - uint64_t x466; - fiat_p318233_uint1 x467; - uint64_t x468; - fiat_p318233_uint1 x469; - uint64_t x470; - fiat_p318233_uint1 x471; - uint64_t x472; - fiat_p318233_uint1 x473; - uint64_t x474; - fiat_p318233_uint1 x475; - uint64_t x476; - fiat_p318233_uint1 x477; - uint64_t x478; - fiat_p318233_uint1 x479; - uint64_t x480; - fiat_p318233_uint1 x481; - uint64_t x482; - fiat_p318233_uint1 x483; - uint64_t x484; - uint64_t x485; - uint64_t x486; - uint64_t x487; - uint64_t x488; - uint64_t x489; - uint64_t x490; - uint64_t x491; - uint64_t x492; - uint64_t x493; - uint64_t x494; - uint64_t x495; - uint64_t x496; - uint64_t x497; - uint64_t x498; - uint64_t x499; - uint64_t x500; - uint64_t x501; - fiat_p318233_uint1 x502; - uint64_t x503; - fiat_p318233_uint1 x504; - uint64_t x505; - fiat_p318233_uint1 x506; - uint64_t x507; - fiat_p318233_uint1 x508; - uint64_t x509; - fiat_p318233_uint1 x510; - uint64_t x511; - fiat_p318233_uint1 x512; - uint64_t x513; - fiat_p318233_uint1 x514; - uint64_t x515; - uint64_t x516; - fiat_p318233_uint1 x517; - uint64_t x518; - fiat_p318233_uint1 x519; - uint64_t x520; - fiat_p318233_uint1 x521; - uint64_t x522; - fiat_p318233_uint1 x523; - uint64_t x524; - fiat_p318233_uint1 x525; - uint64_t x526; - fiat_p318233_uint1 x527; - uint64_t x528; - fiat_p318233_uint1 x529; - uint64_t x530; - fiat_p318233_uint1 x531; - uint64_t x532; - fiat_p318233_uint1 x533; - uint64_t x534; - uint64_t x535; - uint64_t x536; - uint64_t x537; - uint64_t x538; - uint64_t x539; - uint64_t x540; - uint64_t x541; - uint64_t x542; - uint64_t x543; - uint64_t x544; - uint64_t x545; - uint64_t x546; - uint64_t x547; - uint64_t x548; - uint64_t x549; - uint64_t x550; - fiat_p318233_uint1 x551; - uint64_t x552; - fiat_p318233_uint1 x553; - uint64_t x554; - fiat_p318233_uint1 x555; - uint64_t x556; - fiat_p318233_uint1 x557; - uint64_t x558; - fiat_p318233_uint1 x559; - uint64_t x560; - fiat_p318233_uint1 x561; - uint64_t x562; - fiat_p318233_uint1 x563; - uint64_t x564; - uint64_t x565; - fiat_p318233_uint1 x566; - uint64_t x567; - fiat_p318233_uint1 x568; - uint64_t x569; - fiat_p318233_uint1 x570; - uint64_t x571; - fiat_p318233_uint1 x572; - uint64_t x573; - fiat_p318233_uint1 x574; - uint64_t x575; - fiat_p318233_uint1 x576; - uint64_t x577; - fiat_p318233_uint1 x578; - uint64_t x579; - fiat_p318233_uint1 x580; - uint64_t x581; - fiat_p318233_uint1 x582; - uint64_t x583; - uint64_t x584; - uint64_t x585; - uint64_t x586; - uint64_t x587; - uint64_t x588; - uint64_t x589; - uint64_t x590; - uint64_t x591; - uint64_t x592; - uint64_t x593; - uint64_t x594; - uint64_t x595; - uint64_t x596; - uint64_t x597; - uint64_t x598; - uint64_t x599; - uint64_t x600; - fiat_p318233_uint1 x601; - uint64_t x602; - fiat_p318233_uint1 x603; - uint64_t x604; - fiat_p318233_uint1 x605; - uint64_t x606; - fiat_p318233_uint1 x607; - uint64_t x608; - fiat_p318233_uint1 x609; - uint64_t x610; - fiat_p318233_uint1 x611; - uint64_t x612; - fiat_p318233_uint1 x613; - uint64_t x614; - uint64_t x615; - fiat_p318233_uint1 x616; - uint64_t x617; - fiat_p318233_uint1 x618; - uint64_t x619; - fiat_p318233_uint1 x620; - uint64_t x621; - fiat_p318233_uint1 x622; - uint64_t x623; - fiat_p318233_uint1 x624; - uint64_t x625; - fiat_p318233_uint1 x626; - uint64_t x627; - fiat_p318233_uint1 x628; - uint64_t x629; - fiat_p318233_uint1 x630; - uint64_t x631; - fiat_p318233_uint1 x632; - uint64_t x633; - uint64_t x634; - uint64_t x635; - uint64_t x636; - uint64_t x637; - uint64_t x638; - uint64_t x639; - uint64_t x640; - uint64_t x641; - uint64_t x642; - uint64_t x643; - uint64_t x644; - uint64_t x645; - uint64_t x646; - uint64_t x647; - uint64_t x648; - uint64_t x649; - fiat_p318233_uint1 x650; - uint64_t x651; - fiat_p318233_uint1 x652; - uint64_t x653; - fiat_p318233_uint1 x654; - uint64_t x655; - fiat_p318233_uint1 x656; - uint64_t x657; - fiat_p318233_uint1 x658; - uint64_t x659; - fiat_p318233_uint1 x660; - uint64_t x661; - fiat_p318233_uint1 x662; - uint64_t x663; - uint64_t x664; - fiat_p318233_uint1 x665; - uint64_t x666; - fiat_p318233_uint1 x667; - uint64_t x668; - fiat_p318233_uint1 x669; - uint64_t x670; - fiat_p318233_uint1 x671; - uint64_t x672; - fiat_p318233_uint1 x673; - uint64_t x674; - fiat_p318233_uint1 x675; - uint64_t x676; - fiat_p318233_uint1 x677; - uint64_t x678; - fiat_p318233_uint1 x679; - uint64_t x680; - fiat_p318233_uint1 x681; - uint64_t x682; - uint64_t x683; - uint64_t x684; - uint64_t x685; - uint64_t x686; - uint64_t x687; - uint64_t x688; - uint64_t x689; - uint64_t x690; - uint64_t x691; - uint64_t x692; - uint64_t x693; - uint64_t x694; - uint64_t x695; - uint64_t x696; - uint64_t x697; - uint64_t x698; - uint64_t x699; - fiat_p318233_uint1 x700; - uint64_t x701; - fiat_p318233_uint1 x702; - uint64_t x703; - fiat_p318233_uint1 x704; - uint64_t x705; - fiat_p318233_uint1 x706; - uint64_t x707; - fiat_p318233_uint1 x708; - uint64_t x709; - fiat_p318233_uint1 x710; - uint64_t x711; - fiat_p318233_uint1 x712; - uint64_t x713; - uint64_t x714; - fiat_p318233_uint1 x715; - uint64_t x716; - fiat_p318233_uint1 x717; - uint64_t x718; - fiat_p318233_uint1 x719; - uint64_t x720; - fiat_p318233_uint1 x721; - uint64_t x722; - fiat_p318233_uint1 x723; - uint64_t x724; - fiat_p318233_uint1 x725; - uint64_t x726; - fiat_p318233_uint1 x727; - uint64_t x728; - fiat_p318233_uint1 x729; - uint64_t x730; - fiat_p318233_uint1 x731; - uint64_t x732; - uint64_t x733; - uint64_t x734; - uint64_t x735; - uint64_t x736; - uint64_t x737; - uint64_t x738; - uint64_t x739; - uint64_t x740; - uint64_t x741; - uint64_t x742; - uint64_t x743; - uint64_t x744; - uint64_t x745; - uint64_t x746; - uint64_t x747; - uint64_t x748; - fiat_p318233_uint1 x749; - uint64_t x750; - fiat_p318233_uint1 x751; - uint64_t x752; - fiat_p318233_uint1 x753; - uint64_t x754; - fiat_p318233_uint1 x755; - uint64_t x756; - fiat_p318233_uint1 x757; - uint64_t x758; - fiat_p318233_uint1 x759; - uint64_t x760; - fiat_p318233_uint1 x761; - uint64_t x762; - uint64_t x763; - fiat_p318233_uint1 x764; - uint64_t x765; - fiat_p318233_uint1 x766; - uint64_t x767; - fiat_p318233_uint1 x768; - uint64_t x769; - fiat_p318233_uint1 x770; - uint64_t x771; - fiat_p318233_uint1 x772; - uint64_t x773; - fiat_p318233_uint1 x774; - uint64_t x775; - fiat_p318233_uint1 x776; - uint64_t x777; - fiat_p318233_uint1 x778; - uint64_t x779; - fiat_p318233_uint1 x780; - uint64_t x781; - uint64_t x782; - fiat_p318233_uint1 x783; - uint64_t x784; - fiat_p318233_uint1 x785; - uint64_t x786; - fiat_p318233_uint1 x787; - uint64_t x788; - fiat_p318233_uint1 x789; - uint64_t x790; - fiat_p318233_uint1 x791; - uint64_t x792; - fiat_p318233_uint1 x793; - uint64_t x794; - fiat_p318233_uint1 x795; - uint64_t x796; - fiat_p318233_uint1 x797; - uint64_t x798; - fiat_p318233_uint1 x799; - uint64_t x800; - uint64_t x801; - uint64_t x802; - uint64_t x803; - uint64_t x804; - uint64_t x805; - uint64_t x806; - uint64_t x807; - x1 = (arg1[1]); - x2 = (arg1[2]); - x3 = (arg1[3]); - x4 = (arg1[4]); - x5 = (arg1[5]); - x6 = (arg1[6]); - x7 = (arg1[7]); - x8 = (arg1[0]); - fiat_p318233_mulx_u64(&x9, &x10, x8, (arg1[7])); - fiat_p318233_mulx_u64(&x11, &x12, x8, (arg1[6])); - fiat_p318233_mulx_u64(&x13, &x14, x8, (arg1[5])); - fiat_p318233_mulx_u64(&x15, &x16, x8, (arg1[4])); - fiat_p318233_mulx_u64(&x17, &x18, x8, (arg1[3])); - fiat_p318233_mulx_u64(&x19, &x20, x8, (arg1[2])); - fiat_p318233_mulx_u64(&x21, &x22, x8, (arg1[1])); - fiat_p318233_mulx_u64(&x23, &x24, x8, (arg1[0])); - fiat_p318233_addcarryx_u64(&x25, &x26, 0x0, x24, x21); - fiat_p318233_addcarryx_u64(&x27, &x28, x26, x22, x19); - fiat_p318233_addcarryx_u64(&x29, &x30, x28, x20, x17); - fiat_p318233_addcarryx_u64(&x31, &x32, x30, x18, x15); - fiat_p318233_addcarryx_u64(&x33, &x34, x32, x16, x13); - fiat_p318233_addcarryx_u64(&x35, &x36, x34, x14, x11); - fiat_p318233_addcarryx_u64(&x37, &x38, x36, x12, x9); - x39 = (x38 + x10); - fiat_p318233_mulx_u64(&x40, &x41, x23, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x42, &x43, x23, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x44, &x45, x23, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x46, &x47, x23, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x48, &x49, x23, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x50, &x51, x23, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x52, &x53, x23, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x54, &x55, x23, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x56, &x57, 0x0, x55, x52); - fiat_p318233_addcarryx_u64(&x58, &x59, x57, x53, x50); - fiat_p318233_addcarryx_u64(&x60, &x61, x59, x51, x48); - fiat_p318233_addcarryx_u64(&x62, &x63, x61, x49, x46); - fiat_p318233_addcarryx_u64(&x64, &x65, x63, x47, x44); - fiat_p318233_addcarryx_u64(&x66, &x67, x65, x45, x42); - fiat_p318233_addcarryx_u64(&x68, &x69, x67, x43, x40); - x70 = (x69 + x41); - fiat_p318233_addcarryx_u64(&x71, &x72, 0x0, x23, x54); - fiat_p318233_addcarryx_u64(&x73, &x74, x72, x25, x56); - fiat_p318233_addcarryx_u64(&x75, &x76, x74, x27, x58); - fiat_p318233_addcarryx_u64(&x77, &x78, x76, x29, x60); - fiat_p318233_addcarryx_u64(&x79, &x80, x78, x31, x62); - fiat_p318233_addcarryx_u64(&x81, &x82, x80, x33, x64); - fiat_p318233_addcarryx_u64(&x83, &x84, x82, x35, x66); - fiat_p318233_addcarryx_u64(&x85, &x86, x84, x37, x68); - fiat_p318233_addcarryx_u64(&x87, &x88, x86, x39, x70); - fiat_p318233_mulx_u64(&x89, &x90, x1, (arg1[7])); - fiat_p318233_mulx_u64(&x91, &x92, x1, (arg1[6])); - fiat_p318233_mulx_u64(&x93, &x94, x1, (arg1[5])); - fiat_p318233_mulx_u64(&x95, &x96, x1, (arg1[4])); - fiat_p318233_mulx_u64(&x97, &x98, x1, (arg1[3])); - fiat_p318233_mulx_u64(&x99, &x100, x1, (arg1[2])); - fiat_p318233_mulx_u64(&x101, &x102, x1, (arg1[1])); - fiat_p318233_mulx_u64(&x103, &x104, x1, (arg1[0])); - fiat_p318233_addcarryx_u64(&x105, &x106, 0x0, x104, x101); - fiat_p318233_addcarryx_u64(&x107, &x108, x106, x102, x99); - fiat_p318233_addcarryx_u64(&x109, &x110, x108, x100, x97); - fiat_p318233_addcarryx_u64(&x111, &x112, x110, x98, x95); - fiat_p318233_addcarryx_u64(&x113, &x114, x112, x96, x93); - fiat_p318233_addcarryx_u64(&x115, &x116, x114, x94, x91); - fiat_p318233_addcarryx_u64(&x117, &x118, x116, x92, x89); - x119 = (x118 + x90); - fiat_p318233_addcarryx_u64(&x120, &x121, 0x0, x73, x103); - fiat_p318233_addcarryx_u64(&x122, &x123, x121, x75, x105); - fiat_p318233_addcarryx_u64(&x124, &x125, x123, x77, x107); - fiat_p318233_addcarryx_u64(&x126, &x127, x125, x79, x109); - fiat_p318233_addcarryx_u64(&x128, &x129, x127, x81, x111); - fiat_p318233_addcarryx_u64(&x130, &x131, x129, x83, x113); - fiat_p318233_addcarryx_u64(&x132, &x133, x131, x85, x115); - fiat_p318233_addcarryx_u64(&x134, &x135, x133, x87, x117); - fiat_p318233_addcarryx_u64(&x136, &x137, x135, x88, x119); - fiat_p318233_mulx_u64(&x138, &x139, x120, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x140, &x141, x120, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x142, &x143, x120, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x144, &x145, x120, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x146, &x147, x120, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x148, &x149, x120, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x150, &x151, x120, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x152, &x153, x120, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x154, &x155, 0x0, x153, x150); - fiat_p318233_addcarryx_u64(&x156, &x157, x155, x151, x148); - fiat_p318233_addcarryx_u64(&x158, &x159, x157, x149, x146); - fiat_p318233_addcarryx_u64(&x160, &x161, x159, x147, x144); - fiat_p318233_addcarryx_u64(&x162, &x163, x161, x145, x142); - fiat_p318233_addcarryx_u64(&x164, &x165, x163, x143, x140); - fiat_p318233_addcarryx_u64(&x166, &x167, x165, x141, x138); - x168 = (x167 + x139); - fiat_p318233_addcarryx_u64(&x169, &x170, 0x0, x120, x152); - fiat_p318233_addcarryx_u64(&x171, &x172, x170, x122, x154); - fiat_p318233_addcarryx_u64(&x173, &x174, x172, x124, x156); - fiat_p318233_addcarryx_u64(&x175, &x176, x174, x126, x158); - fiat_p318233_addcarryx_u64(&x177, &x178, x176, x128, x160); - fiat_p318233_addcarryx_u64(&x179, &x180, x178, x130, x162); - fiat_p318233_addcarryx_u64(&x181, &x182, x180, x132, x164); - fiat_p318233_addcarryx_u64(&x183, &x184, x182, x134, x166); - fiat_p318233_addcarryx_u64(&x185, &x186, x184, x136, x168); - x187 = ((uint64_t)x186 + x137); - fiat_p318233_mulx_u64(&x188, &x189, x2, (arg1[7])); - fiat_p318233_mulx_u64(&x190, &x191, x2, (arg1[6])); - fiat_p318233_mulx_u64(&x192, &x193, x2, (arg1[5])); - fiat_p318233_mulx_u64(&x194, &x195, x2, (arg1[4])); - fiat_p318233_mulx_u64(&x196, &x197, x2, (arg1[3])); - fiat_p318233_mulx_u64(&x198, &x199, x2, (arg1[2])); - fiat_p318233_mulx_u64(&x200, &x201, x2, (arg1[1])); - fiat_p318233_mulx_u64(&x202, &x203, x2, (arg1[0])); - fiat_p318233_addcarryx_u64(&x204, &x205, 0x0, x203, x200); - fiat_p318233_addcarryx_u64(&x206, &x207, x205, x201, x198); - fiat_p318233_addcarryx_u64(&x208, &x209, x207, x199, x196); - fiat_p318233_addcarryx_u64(&x210, &x211, x209, x197, x194); - fiat_p318233_addcarryx_u64(&x212, &x213, x211, x195, x192); - fiat_p318233_addcarryx_u64(&x214, &x215, x213, x193, x190); - fiat_p318233_addcarryx_u64(&x216, &x217, x215, x191, x188); - x218 = (x217 + x189); - fiat_p318233_addcarryx_u64(&x219, &x220, 0x0, x171, x202); - fiat_p318233_addcarryx_u64(&x221, &x222, x220, x173, x204); - fiat_p318233_addcarryx_u64(&x223, &x224, x222, x175, x206); - fiat_p318233_addcarryx_u64(&x225, &x226, x224, x177, x208); - fiat_p318233_addcarryx_u64(&x227, &x228, x226, x179, x210); - fiat_p318233_addcarryx_u64(&x229, &x230, x228, x181, x212); - fiat_p318233_addcarryx_u64(&x231, &x232, x230, x183, x214); - fiat_p318233_addcarryx_u64(&x233, &x234, x232, x185, x216); - fiat_p318233_addcarryx_u64(&x235, &x236, x234, x187, x218); - fiat_p318233_mulx_u64(&x237, &x238, x219, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x239, &x240, x219, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x241, &x242, x219, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x243, &x244, x219, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x245, &x246, x219, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x247, &x248, x219, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x249, &x250, x219, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x251, &x252, x219, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x253, &x254, 0x0, x252, x249); - fiat_p318233_addcarryx_u64(&x255, &x256, x254, x250, x247); - fiat_p318233_addcarryx_u64(&x257, &x258, x256, x248, x245); - fiat_p318233_addcarryx_u64(&x259, &x260, x258, x246, x243); - fiat_p318233_addcarryx_u64(&x261, &x262, x260, x244, x241); - fiat_p318233_addcarryx_u64(&x263, &x264, x262, x242, x239); - fiat_p318233_addcarryx_u64(&x265, &x266, x264, x240, x237); - x267 = (x266 + x238); - fiat_p318233_addcarryx_u64(&x268, &x269, 0x0, x219, x251); - fiat_p318233_addcarryx_u64(&x270, &x271, x269, x221, x253); - fiat_p318233_addcarryx_u64(&x272, &x273, x271, x223, x255); - fiat_p318233_addcarryx_u64(&x274, &x275, x273, x225, x257); - fiat_p318233_addcarryx_u64(&x276, &x277, x275, x227, x259); - fiat_p318233_addcarryx_u64(&x278, &x279, x277, x229, x261); - fiat_p318233_addcarryx_u64(&x280, &x281, x279, x231, x263); - fiat_p318233_addcarryx_u64(&x282, &x283, x281, x233, x265); - fiat_p318233_addcarryx_u64(&x284, &x285, x283, x235, x267); - x286 = ((uint64_t)x285 + x236); - fiat_p318233_mulx_u64(&x287, &x288, x3, (arg1[7])); - fiat_p318233_mulx_u64(&x289, &x290, x3, (arg1[6])); - fiat_p318233_mulx_u64(&x291, &x292, x3, (arg1[5])); - fiat_p318233_mulx_u64(&x293, &x294, x3, (arg1[4])); - fiat_p318233_mulx_u64(&x295, &x296, x3, (arg1[3])); - fiat_p318233_mulx_u64(&x297, &x298, x3, (arg1[2])); - fiat_p318233_mulx_u64(&x299, &x300, x3, (arg1[1])); - fiat_p318233_mulx_u64(&x301, &x302, x3, (arg1[0])); - fiat_p318233_addcarryx_u64(&x303, &x304, 0x0, x302, x299); - fiat_p318233_addcarryx_u64(&x305, &x306, x304, x300, x297); - fiat_p318233_addcarryx_u64(&x307, &x308, x306, x298, x295); - fiat_p318233_addcarryx_u64(&x309, &x310, x308, x296, x293); - fiat_p318233_addcarryx_u64(&x311, &x312, x310, x294, x291); - fiat_p318233_addcarryx_u64(&x313, &x314, x312, x292, x289); - fiat_p318233_addcarryx_u64(&x315, &x316, x314, x290, x287); - x317 = (x316 + x288); - fiat_p318233_addcarryx_u64(&x318, &x319, 0x0, x270, x301); - fiat_p318233_addcarryx_u64(&x320, &x321, x319, x272, x303); - fiat_p318233_addcarryx_u64(&x322, &x323, x321, x274, x305); - fiat_p318233_addcarryx_u64(&x324, &x325, x323, x276, x307); - fiat_p318233_addcarryx_u64(&x326, &x327, x325, x278, x309); - fiat_p318233_addcarryx_u64(&x328, &x329, x327, x280, x311); - fiat_p318233_addcarryx_u64(&x330, &x331, x329, x282, x313); - fiat_p318233_addcarryx_u64(&x332, &x333, x331, x284, x315); - fiat_p318233_addcarryx_u64(&x334, &x335, x333, x286, x317); - fiat_p318233_mulx_u64(&x336, &x337, x318, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x338, &x339, x318, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x340, &x341, x318, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x342, &x343, x318, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x344, &x345, x318, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x346, &x347, x318, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x348, &x349, x318, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x350, &x351, x318, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x352, &x353, 0x0, x351, x348); - fiat_p318233_addcarryx_u64(&x354, &x355, x353, x349, x346); - fiat_p318233_addcarryx_u64(&x356, &x357, x355, x347, x344); - fiat_p318233_addcarryx_u64(&x358, &x359, x357, x345, x342); - fiat_p318233_addcarryx_u64(&x360, &x361, x359, x343, x340); - fiat_p318233_addcarryx_u64(&x362, &x363, x361, x341, x338); - fiat_p318233_addcarryx_u64(&x364, &x365, x363, x339, x336); - x366 = (x365 + x337); - fiat_p318233_addcarryx_u64(&x367, &x368, 0x0, x318, x350); - fiat_p318233_addcarryx_u64(&x369, &x370, x368, x320, x352); - fiat_p318233_addcarryx_u64(&x371, &x372, x370, x322, x354); - fiat_p318233_addcarryx_u64(&x373, &x374, x372, x324, x356); - fiat_p318233_addcarryx_u64(&x375, &x376, x374, x326, x358); - fiat_p318233_addcarryx_u64(&x377, &x378, x376, x328, x360); - fiat_p318233_addcarryx_u64(&x379, &x380, x378, x330, x362); - fiat_p318233_addcarryx_u64(&x381, &x382, x380, x332, x364); - fiat_p318233_addcarryx_u64(&x383, &x384, x382, x334, x366); - x385 = ((uint64_t)x384 + x335); - fiat_p318233_mulx_u64(&x386, &x387, x4, (arg1[7])); - fiat_p318233_mulx_u64(&x388, &x389, x4, (arg1[6])); - fiat_p318233_mulx_u64(&x390, &x391, x4, (arg1[5])); - fiat_p318233_mulx_u64(&x392, &x393, x4, (arg1[4])); - fiat_p318233_mulx_u64(&x394, &x395, x4, (arg1[3])); - fiat_p318233_mulx_u64(&x396, &x397, x4, (arg1[2])); - fiat_p318233_mulx_u64(&x398, &x399, x4, (arg1[1])); - fiat_p318233_mulx_u64(&x400, &x401, x4, (arg1[0])); - fiat_p318233_addcarryx_u64(&x402, &x403, 0x0, x401, x398); - fiat_p318233_addcarryx_u64(&x404, &x405, x403, x399, x396); - fiat_p318233_addcarryx_u64(&x406, &x407, x405, x397, x394); - fiat_p318233_addcarryx_u64(&x408, &x409, x407, x395, x392); - fiat_p318233_addcarryx_u64(&x410, &x411, x409, x393, x390); - fiat_p318233_addcarryx_u64(&x412, &x413, x411, x391, x388); - fiat_p318233_addcarryx_u64(&x414, &x415, x413, x389, x386); - x416 = (x415 + x387); - fiat_p318233_addcarryx_u64(&x417, &x418, 0x0, x369, x400); - fiat_p318233_addcarryx_u64(&x419, &x420, x418, x371, x402); - fiat_p318233_addcarryx_u64(&x421, &x422, x420, x373, x404); - fiat_p318233_addcarryx_u64(&x423, &x424, x422, x375, x406); - fiat_p318233_addcarryx_u64(&x425, &x426, x424, x377, x408); - fiat_p318233_addcarryx_u64(&x427, &x428, x426, x379, x410); - fiat_p318233_addcarryx_u64(&x429, &x430, x428, x381, x412); - fiat_p318233_addcarryx_u64(&x431, &x432, x430, x383, x414); - fiat_p318233_addcarryx_u64(&x433, &x434, x432, x385, x416); - fiat_p318233_mulx_u64(&x435, &x436, x417, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x437, &x438, x417, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x439, &x440, x417, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x441, &x442, x417, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x443, &x444, x417, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x445, &x446, x417, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x447, &x448, x417, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x449, &x450, x417, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x451, &x452, 0x0, x450, x447); - fiat_p318233_addcarryx_u64(&x453, &x454, x452, x448, x445); - fiat_p318233_addcarryx_u64(&x455, &x456, x454, x446, x443); - fiat_p318233_addcarryx_u64(&x457, &x458, x456, x444, x441); - fiat_p318233_addcarryx_u64(&x459, &x460, x458, x442, x439); - fiat_p318233_addcarryx_u64(&x461, &x462, x460, x440, x437); - fiat_p318233_addcarryx_u64(&x463, &x464, x462, x438, x435); - x465 = (x464 + x436); - fiat_p318233_addcarryx_u64(&x466, &x467, 0x0, x417, x449); - fiat_p318233_addcarryx_u64(&x468, &x469, x467, x419, x451); - fiat_p318233_addcarryx_u64(&x470, &x471, x469, x421, x453); - fiat_p318233_addcarryx_u64(&x472, &x473, x471, x423, x455); - fiat_p318233_addcarryx_u64(&x474, &x475, x473, x425, x457); - fiat_p318233_addcarryx_u64(&x476, &x477, x475, x427, x459); - fiat_p318233_addcarryx_u64(&x478, &x479, x477, x429, x461); - fiat_p318233_addcarryx_u64(&x480, &x481, x479, x431, x463); - fiat_p318233_addcarryx_u64(&x482, &x483, x481, x433, x465); - x484 = ((uint64_t)x483 + x434); - fiat_p318233_mulx_u64(&x485, &x486, x5, (arg1[7])); - fiat_p318233_mulx_u64(&x487, &x488, x5, (arg1[6])); - fiat_p318233_mulx_u64(&x489, &x490, x5, (arg1[5])); - fiat_p318233_mulx_u64(&x491, &x492, x5, (arg1[4])); - fiat_p318233_mulx_u64(&x493, &x494, x5, (arg1[3])); - fiat_p318233_mulx_u64(&x495, &x496, x5, (arg1[2])); - fiat_p318233_mulx_u64(&x497, &x498, x5, (arg1[1])); - fiat_p318233_mulx_u64(&x499, &x500, x5, (arg1[0])); - fiat_p318233_addcarryx_u64(&x501, &x502, 0x0, x500, x497); - fiat_p318233_addcarryx_u64(&x503, &x504, x502, x498, x495); - fiat_p318233_addcarryx_u64(&x505, &x506, x504, x496, x493); - fiat_p318233_addcarryx_u64(&x507, &x508, x506, x494, x491); - fiat_p318233_addcarryx_u64(&x509, &x510, x508, x492, x489); - fiat_p318233_addcarryx_u64(&x511, &x512, x510, x490, x487); - fiat_p318233_addcarryx_u64(&x513, &x514, x512, x488, x485); - x515 = (x514 + x486); - fiat_p318233_addcarryx_u64(&x516, &x517, 0x0, x468, x499); - fiat_p318233_addcarryx_u64(&x518, &x519, x517, x470, x501); - fiat_p318233_addcarryx_u64(&x520, &x521, x519, x472, x503); - fiat_p318233_addcarryx_u64(&x522, &x523, x521, x474, x505); - fiat_p318233_addcarryx_u64(&x524, &x525, x523, x476, x507); - fiat_p318233_addcarryx_u64(&x526, &x527, x525, x478, x509); - fiat_p318233_addcarryx_u64(&x528, &x529, x527, x480, x511); - fiat_p318233_addcarryx_u64(&x530, &x531, x529, x482, x513); - fiat_p318233_addcarryx_u64(&x532, &x533, x531, x484, x515); - fiat_p318233_mulx_u64(&x534, &x535, x516, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x536, &x537, x516, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x538, &x539, x516, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x540, &x541, x516, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x542, &x543, x516, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x544, &x545, x516, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x546, &x547, x516, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x548, &x549, x516, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x550, &x551, 0x0, x549, x546); - fiat_p318233_addcarryx_u64(&x552, &x553, x551, x547, x544); - fiat_p318233_addcarryx_u64(&x554, &x555, x553, x545, x542); - fiat_p318233_addcarryx_u64(&x556, &x557, x555, x543, x540); - fiat_p318233_addcarryx_u64(&x558, &x559, x557, x541, x538); - fiat_p318233_addcarryx_u64(&x560, &x561, x559, x539, x536); - fiat_p318233_addcarryx_u64(&x562, &x563, x561, x537, x534); - x564 = (x563 + x535); - fiat_p318233_addcarryx_u64(&x565, &x566, 0x0, x516, x548); - fiat_p318233_addcarryx_u64(&x567, &x568, x566, x518, x550); - fiat_p318233_addcarryx_u64(&x569, &x570, x568, x520, x552); - fiat_p318233_addcarryx_u64(&x571, &x572, x570, x522, x554); - fiat_p318233_addcarryx_u64(&x573, &x574, x572, x524, x556); - fiat_p318233_addcarryx_u64(&x575, &x576, x574, x526, x558); - fiat_p318233_addcarryx_u64(&x577, &x578, x576, x528, x560); - fiat_p318233_addcarryx_u64(&x579, &x580, x578, x530, x562); - fiat_p318233_addcarryx_u64(&x581, &x582, x580, x532, x564); - x583 = ((uint64_t)x582 + x533); - fiat_p318233_mulx_u64(&x584, &x585, x6, (arg1[7])); - fiat_p318233_mulx_u64(&x586, &x587, x6, (arg1[6])); - fiat_p318233_mulx_u64(&x588, &x589, x6, (arg1[5])); - fiat_p318233_mulx_u64(&x590, &x591, x6, (arg1[4])); - fiat_p318233_mulx_u64(&x592, &x593, x6, (arg1[3])); - fiat_p318233_mulx_u64(&x594, &x595, x6, (arg1[2])); - fiat_p318233_mulx_u64(&x596, &x597, x6, (arg1[1])); - fiat_p318233_mulx_u64(&x598, &x599, x6, (arg1[0])); - fiat_p318233_addcarryx_u64(&x600, &x601, 0x0, x599, x596); - fiat_p318233_addcarryx_u64(&x602, &x603, x601, x597, x594); - fiat_p318233_addcarryx_u64(&x604, &x605, x603, x595, x592); - fiat_p318233_addcarryx_u64(&x606, &x607, x605, x593, x590); - fiat_p318233_addcarryx_u64(&x608, &x609, x607, x591, x588); - fiat_p318233_addcarryx_u64(&x610, &x611, x609, x589, x586); - fiat_p318233_addcarryx_u64(&x612, &x613, x611, x587, x584); - x614 = (x613 + x585); - fiat_p318233_addcarryx_u64(&x615, &x616, 0x0, x567, x598); - fiat_p318233_addcarryx_u64(&x617, &x618, x616, x569, x600); - fiat_p318233_addcarryx_u64(&x619, &x620, x618, x571, x602); - fiat_p318233_addcarryx_u64(&x621, &x622, x620, x573, x604); - fiat_p318233_addcarryx_u64(&x623, &x624, x622, x575, x606); - fiat_p318233_addcarryx_u64(&x625, &x626, x624, x577, x608); - fiat_p318233_addcarryx_u64(&x627, &x628, x626, x579, x610); - fiat_p318233_addcarryx_u64(&x629, &x630, x628, x581, x612); - fiat_p318233_addcarryx_u64(&x631, &x632, x630, x583, x614); - fiat_p318233_mulx_u64(&x633, &x634, x615, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x635, &x636, x615, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x637, &x638, x615, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x639, &x640, x615, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x641, &x642, x615, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x643, &x644, x615, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x645, &x646, x615, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x647, &x648, x615, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x649, &x650, 0x0, x648, x645); - fiat_p318233_addcarryx_u64(&x651, &x652, x650, x646, x643); - fiat_p318233_addcarryx_u64(&x653, &x654, x652, x644, x641); - fiat_p318233_addcarryx_u64(&x655, &x656, x654, x642, x639); - fiat_p318233_addcarryx_u64(&x657, &x658, x656, x640, x637); - fiat_p318233_addcarryx_u64(&x659, &x660, x658, x638, x635); - fiat_p318233_addcarryx_u64(&x661, &x662, x660, x636, x633); - x663 = (x662 + x634); - fiat_p318233_addcarryx_u64(&x664, &x665, 0x0, x615, x647); - fiat_p318233_addcarryx_u64(&x666, &x667, x665, x617, x649); - fiat_p318233_addcarryx_u64(&x668, &x669, x667, x619, x651); - fiat_p318233_addcarryx_u64(&x670, &x671, x669, x621, x653); - fiat_p318233_addcarryx_u64(&x672, &x673, x671, x623, x655); - fiat_p318233_addcarryx_u64(&x674, &x675, x673, x625, x657); - fiat_p318233_addcarryx_u64(&x676, &x677, x675, x627, x659); - fiat_p318233_addcarryx_u64(&x678, &x679, x677, x629, x661); - fiat_p318233_addcarryx_u64(&x680, &x681, x679, x631, x663); - x682 = ((uint64_t)x681 + x632); - fiat_p318233_mulx_u64(&x683, &x684, x7, (arg1[7])); - fiat_p318233_mulx_u64(&x685, &x686, x7, (arg1[6])); - fiat_p318233_mulx_u64(&x687, &x688, x7, (arg1[5])); - fiat_p318233_mulx_u64(&x689, &x690, x7, (arg1[4])); - fiat_p318233_mulx_u64(&x691, &x692, x7, (arg1[3])); - fiat_p318233_mulx_u64(&x693, &x694, x7, (arg1[2])); - fiat_p318233_mulx_u64(&x695, &x696, x7, (arg1[1])); - fiat_p318233_mulx_u64(&x697, &x698, x7, (arg1[0])); - fiat_p318233_addcarryx_u64(&x699, &x700, 0x0, x698, x695); - fiat_p318233_addcarryx_u64(&x701, &x702, x700, x696, x693); - fiat_p318233_addcarryx_u64(&x703, &x704, x702, x694, x691); - fiat_p318233_addcarryx_u64(&x705, &x706, x704, x692, x689); - fiat_p318233_addcarryx_u64(&x707, &x708, x706, x690, x687); - fiat_p318233_addcarryx_u64(&x709, &x710, x708, x688, x685); - fiat_p318233_addcarryx_u64(&x711, &x712, x710, x686, x683); - x713 = (x712 + x684); - fiat_p318233_addcarryx_u64(&x714, &x715, 0x0, x666, x697); - fiat_p318233_addcarryx_u64(&x716, &x717, x715, x668, x699); - fiat_p318233_addcarryx_u64(&x718, &x719, x717, x670, x701); - fiat_p318233_addcarryx_u64(&x720, &x721, x719, x672, x703); - fiat_p318233_addcarryx_u64(&x722, &x723, x721, x674, x705); - fiat_p318233_addcarryx_u64(&x724, &x725, x723, x676, x707); - fiat_p318233_addcarryx_u64(&x726, &x727, x725, x678, x709); - fiat_p318233_addcarryx_u64(&x728, &x729, x727, x680, x711); - fiat_p318233_addcarryx_u64(&x730, &x731, x729, x682, x713); - fiat_p318233_mulx_u64(&x732, &x733, x714, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x734, &x735, x714, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x736, &x737, x714, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x738, &x739, x714, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x740, &x741, x714, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x742, &x743, x714, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x744, &x745, x714, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x746, &x747, x714, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x748, &x749, 0x0, x747, x744); - fiat_p318233_addcarryx_u64(&x750, &x751, x749, x745, x742); - fiat_p318233_addcarryx_u64(&x752, &x753, x751, x743, x740); - fiat_p318233_addcarryx_u64(&x754, &x755, x753, x741, x738); - fiat_p318233_addcarryx_u64(&x756, &x757, x755, x739, x736); - fiat_p318233_addcarryx_u64(&x758, &x759, x757, x737, x734); - fiat_p318233_addcarryx_u64(&x760, &x761, x759, x735, x732); - x762 = (x761 + x733); - fiat_p318233_addcarryx_u64(&x763, &x764, 0x0, x714, x746); - fiat_p318233_addcarryx_u64(&x765, &x766, x764, x716, x748); - fiat_p318233_addcarryx_u64(&x767, &x768, x766, x718, x750); - fiat_p318233_addcarryx_u64(&x769, &x770, x768, x720, x752); - fiat_p318233_addcarryx_u64(&x771, &x772, x770, x722, x754); - fiat_p318233_addcarryx_u64(&x773, &x774, x772, x724, x756); - fiat_p318233_addcarryx_u64(&x775, &x776, x774, x726, x758); - fiat_p318233_addcarryx_u64(&x777, &x778, x776, x728, x760); - fiat_p318233_addcarryx_u64(&x779, &x780, x778, x730, x762); - x781 = ((uint64_t)x780 + x731); - fiat_p318233_subborrowx_u64(&x782, &x783, 0x0, x765, UINT64_C(0xffffffffffffffff)); - fiat_p318233_subborrowx_u64(&x784, &x785, x783, x767, UINT64_C(0xffffffffffffffff)); - fiat_p318233_subborrowx_u64(&x786, &x787, x785, x769, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_subborrowx_u64(&x788, &x789, x787, x771, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_subborrowx_u64(&x790, &x791, x789, x773, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_subborrowx_u64(&x792, &x793, x791, x775, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_subborrowx_u64(&x794, &x795, x793, x777, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_subborrowx_u64(&x796, &x797, x795, x779, UINT64_C(0x255946a8869bc6)); - fiat_p318233_subborrowx_u64(&x798, &x799, x797, x781, 0x0); - fiat_p318233_cmovznz_u64(&x800, x799, x782, x765); - fiat_p318233_cmovznz_u64(&x801, x799, x784, x767); - fiat_p318233_cmovznz_u64(&x802, x799, x786, x769); - fiat_p318233_cmovznz_u64(&x803, x799, x788, x771); - fiat_p318233_cmovznz_u64(&x804, x799, x790, x773); - fiat_p318233_cmovznz_u64(&x805, x799, x792, x775); - fiat_p318233_cmovznz_u64(&x806, x799, x794, x777); - fiat_p318233_cmovznz_u64(&x807, x799, x796, x779); - out1[0] = x800; - out1[1] = x801; - out1[2] = x802; - out1[3] = x803; - out1[4] = x804; - out1[5] = x805; - out1[6] = x806; - out1[7] = x807; -} - -/* - * The function fiat_p318233_add adds two field elements in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * 0 ≤ eval arg2 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) + eval (from_montgomery arg2)) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p318233_add(fiat_p318233_montgomery_domain_field_element out1, const fiat_p318233_montgomery_domain_field_element arg1, const fiat_p318233_montgomery_domain_field_element arg2) { - uint64_t x1; - fiat_p318233_uint1 x2; - uint64_t x3; - fiat_p318233_uint1 x4; - uint64_t x5; - fiat_p318233_uint1 x6; - uint64_t x7; - fiat_p318233_uint1 x8; - uint64_t x9; - fiat_p318233_uint1 x10; - uint64_t x11; - fiat_p318233_uint1 x12; - uint64_t x13; - fiat_p318233_uint1 x14; - uint64_t x15; - fiat_p318233_uint1 x16; - uint64_t x17; - fiat_p318233_uint1 x18; - uint64_t x19; - fiat_p318233_uint1 x20; - uint64_t x21; - fiat_p318233_uint1 x22; - uint64_t x23; - fiat_p318233_uint1 x24; - uint64_t x25; - fiat_p318233_uint1 x26; - uint64_t x27; - fiat_p318233_uint1 x28; - uint64_t x29; - fiat_p318233_uint1 x30; - uint64_t x31; - fiat_p318233_uint1 x32; - uint64_t x33; - fiat_p318233_uint1 x34; - uint64_t x35; - uint64_t x36; - uint64_t x37; - uint64_t x38; - uint64_t x39; - uint64_t x40; - uint64_t x41; - uint64_t x42; - fiat_p318233_addcarryx_u64(&x1, &x2, 0x0, (arg1[0]), (arg2[0])); - fiat_p318233_addcarryx_u64(&x3, &x4, x2, (arg1[1]), (arg2[1])); - fiat_p318233_addcarryx_u64(&x5, &x6, x4, (arg1[2]), (arg2[2])); - fiat_p318233_addcarryx_u64(&x7, &x8, x6, (arg1[3]), (arg2[3])); - fiat_p318233_addcarryx_u64(&x9, &x10, x8, (arg1[4]), (arg2[4])); - fiat_p318233_addcarryx_u64(&x11, &x12, x10, (arg1[5]), (arg2[5])); - fiat_p318233_addcarryx_u64(&x13, &x14, x12, (arg1[6]), (arg2[6])); - fiat_p318233_addcarryx_u64(&x15, &x16, x14, (arg1[7]), (arg2[7])); - fiat_p318233_subborrowx_u64(&x17, &x18, 0x0, x1, UINT64_C(0xffffffffffffffff)); - fiat_p318233_subborrowx_u64(&x19, &x20, x18, x3, UINT64_C(0xffffffffffffffff)); - fiat_p318233_subborrowx_u64(&x21, &x22, x20, x5, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_subborrowx_u64(&x23, &x24, x22, x7, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_subborrowx_u64(&x25, &x26, x24, x9, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_subborrowx_u64(&x27, &x28, x26, x11, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_subborrowx_u64(&x29, &x30, x28, x13, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_subborrowx_u64(&x31, &x32, x30, x15, UINT64_C(0x255946a8869bc6)); - fiat_p318233_subborrowx_u64(&x33, &x34, x32, x16, 0x0); - fiat_p318233_cmovznz_u64(&x35, x34, x17, x1); - fiat_p318233_cmovznz_u64(&x36, x34, x19, x3); - fiat_p318233_cmovznz_u64(&x37, x34, x21, x5); - fiat_p318233_cmovznz_u64(&x38, x34, x23, x7); - fiat_p318233_cmovznz_u64(&x39, x34, x25, x9); - fiat_p318233_cmovznz_u64(&x40, x34, x27, x11); - fiat_p318233_cmovznz_u64(&x41, x34, x29, x13); - fiat_p318233_cmovznz_u64(&x42, x34, x31, x15); - out1[0] = x35; - out1[1] = x36; - out1[2] = x37; - out1[3] = x38; - out1[4] = x39; - out1[5] = x40; - out1[6] = x41; - out1[7] = x42; -} - -/* - * The function fiat_p318233_sub subtracts two field elements in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * 0 ≤ eval arg2 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) - eval (from_montgomery arg2)) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p318233_sub(fiat_p318233_montgomery_domain_field_element out1, const fiat_p318233_montgomery_domain_field_element arg1, const fiat_p318233_montgomery_domain_field_element arg2) { - uint64_t x1; - fiat_p318233_uint1 x2; - uint64_t x3; - fiat_p318233_uint1 x4; - uint64_t x5; - fiat_p318233_uint1 x6; - uint64_t x7; - fiat_p318233_uint1 x8; - uint64_t x9; - fiat_p318233_uint1 x10; - uint64_t x11; - fiat_p318233_uint1 x12; - uint64_t x13; - fiat_p318233_uint1 x14; - uint64_t x15; - fiat_p318233_uint1 x16; - uint64_t x17; - uint64_t x18; - fiat_p318233_uint1 x19; - uint64_t x20; - fiat_p318233_uint1 x21; - uint64_t x22; - fiat_p318233_uint1 x23; - uint64_t x24; - fiat_p318233_uint1 x25; - uint64_t x26; - fiat_p318233_uint1 x27; - uint64_t x28; - fiat_p318233_uint1 x29; - uint64_t x30; - fiat_p318233_uint1 x31; - uint64_t x32; - fiat_p318233_uint1 x33; - fiat_p318233_subborrowx_u64(&x1, &x2, 0x0, (arg1[0]), (arg2[0])); - fiat_p318233_subborrowx_u64(&x3, &x4, x2, (arg1[1]), (arg2[1])); - fiat_p318233_subborrowx_u64(&x5, &x6, x4, (arg1[2]), (arg2[2])); - fiat_p318233_subborrowx_u64(&x7, &x8, x6, (arg1[3]), (arg2[3])); - fiat_p318233_subborrowx_u64(&x9, &x10, x8, (arg1[4]), (arg2[4])); - fiat_p318233_subborrowx_u64(&x11, &x12, x10, (arg1[5]), (arg2[5])); - fiat_p318233_subborrowx_u64(&x13, &x14, x12, (arg1[6]), (arg2[6])); - fiat_p318233_subborrowx_u64(&x15, &x16, x14, (arg1[7]), (arg2[7])); - fiat_p318233_cmovznz_u64(&x17, x16, 0x0, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x18, &x19, 0x0, x1, x17); - fiat_p318233_addcarryx_u64(&x20, &x21, x19, x3, x17); - fiat_p318233_addcarryx_u64(&x22, &x23, x21, x5, (x17 & UINT64_C(0x994c68ada6e1ffff))); - fiat_p318233_addcarryx_u64(&x24, &x25, x23, x7, (x17 & UINT64_C(0xfaf0a29a781974ce))); - fiat_p318233_addcarryx_u64(&x26, &x27, x25, x9, (x17 & UINT64_C(0xfe3ac5904a0dea65))); - fiat_p318233_addcarryx_u64(&x28, &x29, x27, x11, (x17 & UINT64_C(0x2bdbe6326507d01))); - fiat_p318233_addcarryx_u64(&x30, &x31, x29, x13, (x17 & UINT64_C(0x8c15b0036936e792))); - fiat_p318233_addcarryx_u64(&x32, &x33, x31, x15, (x17 & UINT64_C(0x255946a8869bc6))); - out1[0] = x18; - out1[1] = x20; - out1[2] = x22; - out1[3] = x24; - out1[4] = x26; - out1[5] = x28; - out1[6] = x30; - out1[7] = x32; -} - -/* - * The function fiat_p318233_opp negates a field element in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval (from_montgomery out1) mod m = -eval (from_montgomery arg1) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p318233_opp(fiat_p318233_montgomery_domain_field_element out1, const fiat_p318233_montgomery_domain_field_element arg1) { - uint64_t x1; - fiat_p318233_uint1 x2; - uint64_t x3; - fiat_p318233_uint1 x4; - uint64_t x5; - fiat_p318233_uint1 x6; - uint64_t x7; - fiat_p318233_uint1 x8; - uint64_t x9; - fiat_p318233_uint1 x10; - uint64_t x11; - fiat_p318233_uint1 x12; - uint64_t x13; - fiat_p318233_uint1 x14; - uint64_t x15; - fiat_p318233_uint1 x16; - uint64_t x17; - uint64_t x18; - fiat_p318233_uint1 x19; - uint64_t x20; - fiat_p318233_uint1 x21; - uint64_t x22; - fiat_p318233_uint1 x23; - uint64_t x24; - fiat_p318233_uint1 x25; - uint64_t x26; - fiat_p318233_uint1 x27; - uint64_t x28; - fiat_p318233_uint1 x29; - uint64_t x30; - fiat_p318233_uint1 x31; - uint64_t x32; - fiat_p318233_uint1 x33; - fiat_p318233_subborrowx_u64(&x1, &x2, 0x0, 0x0, (arg1[0])); - fiat_p318233_subborrowx_u64(&x3, &x4, x2, 0x0, (arg1[1])); - fiat_p318233_subborrowx_u64(&x5, &x6, x4, 0x0, (arg1[2])); - fiat_p318233_subborrowx_u64(&x7, &x8, x6, 0x0, (arg1[3])); - fiat_p318233_subborrowx_u64(&x9, &x10, x8, 0x0, (arg1[4])); - fiat_p318233_subborrowx_u64(&x11, &x12, x10, 0x0, (arg1[5])); - fiat_p318233_subborrowx_u64(&x13, &x14, x12, 0x0, (arg1[6])); - fiat_p318233_subborrowx_u64(&x15, &x16, x14, 0x0, (arg1[7])); - fiat_p318233_cmovznz_u64(&x17, x16, 0x0, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x18, &x19, 0x0, x1, x17); - fiat_p318233_addcarryx_u64(&x20, &x21, x19, x3, x17); - fiat_p318233_addcarryx_u64(&x22, &x23, x21, x5, (x17 & UINT64_C(0x994c68ada6e1ffff))); - fiat_p318233_addcarryx_u64(&x24, &x25, x23, x7, (x17 & UINT64_C(0xfaf0a29a781974ce))); - fiat_p318233_addcarryx_u64(&x26, &x27, x25, x9, (x17 & UINT64_C(0xfe3ac5904a0dea65))); - fiat_p318233_addcarryx_u64(&x28, &x29, x27, x11, (x17 & UINT64_C(0x2bdbe6326507d01))); - fiat_p318233_addcarryx_u64(&x30, &x31, x29, x13, (x17 & UINT64_C(0x8c15b0036936e792))); - fiat_p318233_addcarryx_u64(&x32, &x33, x31, x15, (x17 & UINT64_C(0x255946a8869bc6))); - out1[0] = x18; - out1[1] = x20; - out1[2] = x22; - out1[3] = x24; - out1[4] = x26; - out1[5] = x28; - out1[6] = x30; - out1[7] = x32; -} - -/* - * The function fiat_p318233_from_montgomery translates a field element out of the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval out1 mod m = (eval arg1 * ((2^64)⁻¹ mod m)^8) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p318233_from_montgomery(fiat_p318233_non_montgomery_domain_field_element out1, const fiat_p318233_montgomery_domain_field_element arg1) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - uint64_t x14; - uint64_t x15; - uint64_t x16; - uint64_t x17; - uint64_t x18; - fiat_p318233_uint1 x19; - uint64_t x20; - fiat_p318233_uint1 x21; - uint64_t x22; - fiat_p318233_uint1 x23; - uint64_t x24; - fiat_p318233_uint1 x25; - uint64_t x26; - fiat_p318233_uint1 x27; - uint64_t x28; - fiat_p318233_uint1 x29; - uint64_t x30; - fiat_p318233_uint1 x31; - uint64_t x32; - fiat_p318233_uint1 x33; - uint64_t x34; - fiat_p318233_uint1 x35; - uint64_t x36; - fiat_p318233_uint1 x37; - uint64_t x38; - fiat_p318233_uint1 x39; - uint64_t x40; - fiat_p318233_uint1 x41; - uint64_t x42; - fiat_p318233_uint1 x43; - uint64_t x44; - fiat_p318233_uint1 x45; - uint64_t x46; - fiat_p318233_uint1 x47; - uint64_t x48; - fiat_p318233_uint1 x49; - uint64_t x50; - fiat_p318233_uint1 x51; - uint64_t x52; - fiat_p318233_uint1 x53; - uint64_t x54; - fiat_p318233_uint1 x55; - uint64_t x56; - fiat_p318233_uint1 x57; - uint64_t x58; - fiat_p318233_uint1 x59; - uint64_t x60; - fiat_p318233_uint1 x61; - uint64_t x62; - uint64_t x63; - uint64_t x64; - uint64_t x65; - uint64_t x66; - uint64_t x67; - uint64_t x68; - uint64_t x69; - uint64_t x70; - uint64_t x71; - uint64_t x72; - uint64_t x73; - uint64_t x74; - uint64_t x75; - uint64_t x76; - uint64_t x77; - uint64_t x78; - fiat_p318233_uint1 x79; - uint64_t x80; - fiat_p318233_uint1 x81; - uint64_t x82; - fiat_p318233_uint1 x83; - uint64_t x84; - fiat_p318233_uint1 x85; - uint64_t x86; - fiat_p318233_uint1 x87; - uint64_t x88; - fiat_p318233_uint1 x89; - uint64_t x90; - fiat_p318233_uint1 x91; - uint64_t x92; - fiat_p318233_uint1 x93; - uint64_t x94; - fiat_p318233_uint1 x95; - uint64_t x96; - fiat_p318233_uint1 x97; - uint64_t x98; - fiat_p318233_uint1 x99; - uint64_t x100; - fiat_p318233_uint1 x101; - uint64_t x102; - fiat_p318233_uint1 x103; - uint64_t x104; - fiat_p318233_uint1 x105; - uint64_t x106; - fiat_p318233_uint1 x107; - uint64_t x108; - fiat_p318233_uint1 x109; - uint64_t x110; - fiat_p318233_uint1 x111; - uint64_t x112; - fiat_p318233_uint1 x113; - uint64_t x114; - fiat_p318233_uint1 x115; - uint64_t x116; - fiat_p318233_uint1 x117; - uint64_t x118; - fiat_p318233_uint1 x119; - uint64_t x120; - fiat_p318233_uint1 x121; - uint64_t x122; - uint64_t x123; - uint64_t x124; - uint64_t x125; - uint64_t x126; - uint64_t x127; - uint64_t x128; - uint64_t x129; - uint64_t x130; - uint64_t x131; - uint64_t x132; - uint64_t x133; - uint64_t x134; - uint64_t x135; - uint64_t x136; - uint64_t x137; - uint64_t x138; - fiat_p318233_uint1 x139; - uint64_t x140; - fiat_p318233_uint1 x141; - uint64_t x142; - fiat_p318233_uint1 x143; - uint64_t x144; - fiat_p318233_uint1 x145; - uint64_t x146; - fiat_p318233_uint1 x147; - uint64_t x148; - fiat_p318233_uint1 x149; - uint64_t x150; - fiat_p318233_uint1 x151; - uint64_t x152; - fiat_p318233_uint1 x153; - uint64_t x154; - fiat_p318233_uint1 x155; - uint64_t x156; - fiat_p318233_uint1 x157; - uint64_t x158; - fiat_p318233_uint1 x159; - uint64_t x160; - fiat_p318233_uint1 x161; - uint64_t x162; - fiat_p318233_uint1 x163; - uint64_t x164; - fiat_p318233_uint1 x165; - uint64_t x166; - fiat_p318233_uint1 x167; - uint64_t x168; - fiat_p318233_uint1 x169; - uint64_t x170; - fiat_p318233_uint1 x171; - uint64_t x172; - fiat_p318233_uint1 x173; - uint64_t x174; - fiat_p318233_uint1 x175; - uint64_t x176; - fiat_p318233_uint1 x177; - uint64_t x178; - fiat_p318233_uint1 x179; - uint64_t x180; - fiat_p318233_uint1 x181; - uint64_t x182; - uint64_t x183; - uint64_t x184; - uint64_t x185; - uint64_t x186; - uint64_t x187; - uint64_t x188; - uint64_t x189; - uint64_t x190; - uint64_t x191; - uint64_t x192; - uint64_t x193; - uint64_t x194; - uint64_t x195; - uint64_t x196; - uint64_t x197; - uint64_t x198; - fiat_p318233_uint1 x199; - uint64_t x200; - fiat_p318233_uint1 x201; - uint64_t x202; - fiat_p318233_uint1 x203; - uint64_t x204; - fiat_p318233_uint1 x205; - uint64_t x206; - fiat_p318233_uint1 x207; - uint64_t x208; - fiat_p318233_uint1 x209; - uint64_t x210; - fiat_p318233_uint1 x211; - uint64_t x212; - fiat_p318233_uint1 x213; - uint64_t x214; - fiat_p318233_uint1 x215; - uint64_t x216; - fiat_p318233_uint1 x217; - uint64_t x218; - fiat_p318233_uint1 x219; - uint64_t x220; - fiat_p318233_uint1 x221; - uint64_t x222; - fiat_p318233_uint1 x223; - uint64_t x224; - fiat_p318233_uint1 x225; - uint64_t x226; - fiat_p318233_uint1 x227; - uint64_t x228; - fiat_p318233_uint1 x229; - uint64_t x230; - fiat_p318233_uint1 x231; - uint64_t x232; - fiat_p318233_uint1 x233; - uint64_t x234; - fiat_p318233_uint1 x235; - uint64_t x236; - fiat_p318233_uint1 x237; - uint64_t x238; - fiat_p318233_uint1 x239; - uint64_t x240; - fiat_p318233_uint1 x241; - uint64_t x242; - uint64_t x243; - uint64_t x244; - uint64_t x245; - uint64_t x246; - uint64_t x247; - uint64_t x248; - uint64_t x249; - uint64_t x250; - uint64_t x251; - uint64_t x252; - uint64_t x253; - uint64_t x254; - uint64_t x255; - uint64_t x256; - uint64_t x257; - uint64_t x258; - fiat_p318233_uint1 x259; - uint64_t x260; - fiat_p318233_uint1 x261; - uint64_t x262; - fiat_p318233_uint1 x263; - uint64_t x264; - fiat_p318233_uint1 x265; - uint64_t x266; - fiat_p318233_uint1 x267; - uint64_t x268; - fiat_p318233_uint1 x269; - uint64_t x270; - fiat_p318233_uint1 x271; - uint64_t x272; - fiat_p318233_uint1 x273; - uint64_t x274; - fiat_p318233_uint1 x275; - uint64_t x276; - fiat_p318233_uint1 x277; - uint64_t x278; - fiat_p318233_uint1 x279; - uint64_t x280; - fiat_p318233_uint1 x281; - uint64_t x282; - fiat_p318233_uint1 x283; - uint64_t x284; - fiat_p318233_uint1 x285; - uint64_t x286; - fiat_p318233_uint1 x287; - uint64_t x288; - fiat_p318233_uint1 x289; - uint64_t x290; - fiat_p318233_uint1 x291; - uint64_t x292; - fiat_p318233_uint1 x293; - uint64_t x294; - fiat_p318233_uint1 x295; - uint64_t x296; - fiat_p318233_uint1 x297; - uint64_t x298; - fiat_p318233_uint1 x299; - uint64_t x300; - fiat_p318233_uint1 x301; - uint64_t x302; - uint64_t x303; - uint64_t x304; - uint64_t x305; - uint64_t x306; - uint64_t x307; - uint64_t x308; - uint64_t x309; - uint64_t x310; - uint64_t x311; - uint64_t x312; - uint64_t x313; - uint64_t x314; - uint64_t x315; - uint64_t x316; - uint64_t x317; - uint64_t x318; - fiat_p318233_uint1 x319; - uint64_t x320; - fiat_p318233_uint1 x321; - uint64_t x322; - fiat_p318233_uint1 x323; - uint64_t x324; - fiat_p318233_uint1 x325; - uint64_t x326; - fiat_p318233_uint1 x327; - uint64_t x328; - fiat_p318233_uint1 x329; - uint64_t x330; - fiat_p318233_uint1 x331; - uint64_t x332; - fiat_p318233_uint1 x333; - uint64_t x334; - fiat_p318233_uint1 x335; - uint64_t x336; - fiat_p318233_uint1 x337; - uint64_t x338; - fiat_p318233_uint1 x339; - uint64_t x340; - fiat_p318233_uint1 x341; - uint64_t x342; - fiat_p318233_uint1 x343; - uint64_t x344; - fiat_p318233_uint1 x345; - uint64_t x346; - fiat_p318233_uint1 x347; - uint64_t x348; - fiat_p318233_uint1 x349; - uint64_t x350; - fiat_p318233_uint1 x351; - uint64_t x352; - fiat_p318233_uint1 x353; - uint64_t x354; - fiat_p318233_uint1 x355; - uint64_t x356; - fiat_p318233_uint1 x357; - uint64_t x358; - fiat_p318233_uint1 x359; - uint64_t x360; - fiat_p318233_uint1 x361; - uint64_t x362; - uint64_t x363; - uint64_t x364; - uint64_t x365; - uint64_t x366; - uint64_t x367; - uint64_t x368; - uint64_t x369; - uint64_t x370; - uint64_t x371; - uint64_t x372; - uint64_t x373; - uint64_t x374; - uint64_t x375; - uint64_t x376; - uint64_t x377; - uint64_t x378; - fiat_p318233_uint1 x379; - uint64_t x380; - fiat_p318233_uint1 x381; - uint64_t x382; - fiat_p318233_uint1 x383; - uint64_t x384; - fiat_p318233_uint1 x385; - uint64_t x386; - fiat_p318233_uint1 x387; - uint64_t x388; - fiat_p318233_uint1 x389; - uint64_t x390; - fiat_p318233_uint1 x391; - uint64_t x392; - fiat_p318233_uint1 x393; - uint64_t x394; - fiat_p318233_uint1 x395; - uint64_t x396; - fiat_p318233_uint1 x397; - uint64_t x398; - fiat_p318233_uint1 x399; - uint64_t x400; - fiat_p318233_uint1 x401; - uint64_t x402; - fiat_p318233_uint1 x403; - uint64_t x404; - fiat_p318233_uint1 x405; - uint64_t x406; - fiat_p318233_uint1 x407; - uint64_t x408; - fiat_p318233_uint1 x409; - uint64_t x410; - fiat_p318233_uint1 x411; - uint64_t x412; - fiat_p318233_uint1 x413; - uint64_t x414; - fiat_p318233_uint1 x415; - uint64_t x416; - fiat_p318233_uint1 x417; - uint64_t x418; - fiat_p318233_uint1 x419; - uint64_t x420; - fiat_p318233_uint1 x421; - uint64_t x422; - uint64_t x423; - uint64_t x424; - uint64_t x425; - uint64_t x426; - uint64_t x427; - uint64_t x428; - uint64_t x429; - uint64_t x430; - uint64_t x431; - uint64_t x432; - uint64_t x433; - uint64_t x434; - uint64_t x435; - uint64_t x436; - uint64_t x437; - uint64_t x438; - fiat_p318233_uint1 x439; - uint64_t x440; - fiat_p318233_uint1 x441; - uint64_t x442; - fiat_p318233_uint1 x443; - uint64_t x444; - fiat_p318233_uint1 x445; - uint64_t x446; - fiat_p318233_uint1 x447; - uint64_t x448; - fiat_p318233_uint1 x449; - uint64_t x450; - fiat_p318233_uint1 x451; - uint64_t x452; - fiat_p318233_uint1 x453; - uint64_t x454; - fiat_p318233_uint1 x455; - uint64_t x456; - fiat_p318233_uint1 x457; - uint64_t x458; - fiat_p318233_uint1 x459; - uint64_t x460; - fiat_p318233_uint1 x461; - uint64_t x462; - fiat_p318233_uint1 x463; - uint64_t x464; - fiat_p318233_uint1 x465; - uint64_t x466; - fiat_p318233_uint1 x467; - uint64_t x468; - uint64_t x469; - fiat_p318233_uint1 x470; - uint64_t x471; - fiat_p318233_uint1 x472; - uint64_t x473; - fiat_p318233_uint1 x474; - uint64_t x475; - fiat_p318233_uint1 x476; - uint64_t x477; - fiat_p318233_uint1 x478; - uint64_t x479; - fiat_p318233_uint1 x480; - uint64_t x481; - fiat_p318233_uint1 x482; - uint64_t x483; - fiat_p318233_uint1 x484; - uint64_t x485; - fiat_p318233_uint1 x486; - uint64_t x487; - uint64_t x488; - uint64_t x489; - uint64_t x490; - uint64_t x491; - uint64_t x492; - uint64_t x493; - uint64_t x494; - x1 = (arg1[0]); - fiat_p318233_mulx_u64(&x2, &x3, x1, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x4, &x5, x1, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x6, &x7, x1, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x8, &x9, x1, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x10, &x11, x1, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x12, &x13, x1, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x14, &x15, x1, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x16, &x17, x1, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x18, &x19, 0x0, x17, x14); - fiat_p318233_addcarryx_u64(&x20, &x21, x19, x15, x12); - fiat_p318233_addcarryx_u64(&x22, &x23, x21, x13, x10); - fiat_p318233_addcarryx_u64(&x24, &x25, x23, x11, x8); - fiat_p318233_addcarryx_u64(&x26, &x27, x25, x9, x6); - fiat_p318233_addcarryx_u64(&x28, &x29, x27, x7, x4); - fiat_p318233_addcarryx_u64(&x30, &x31, x29, x5, x2); - fiat_p318233_addcarryx_u64(&x32, &x33, 0x0, x1, x16); - fiat_p318233_addcarryx_u64(&x34, &x35, x33, 0x0, x18); - fiat_p318233_addcarryx_u64(&x36, &x37, x35, 0x0, x20); - fiat_p318233_addcarryx_u64(&x38, &x39, x37, 0x0, x22); - fiat_p318233_addcarryx_u64(&x40, &x41, x39, 0x0, x24); - fiat_p318233_addcarryx_u64(&x42, &x43, x41, 0x0, x26); - fiat_p318233_addcarryx_u64(&x44, &x45, x43, 0x0, x28); - fiat_p318233_addcarryx_u64(&x46, &x47, x45, 0x0, x30); - fiat_p318233_addcarryx_u64(&x48, &x49, 0x0, x34, (arg1[1])); - fiat_p318233_addcarryx_u64(&x50, &x51, x49, x36, 0x0); - fiat_p318233_addcarryx_u64(&x52, &x53, x51, x38, 0x0); - fiat_p318233_addcarryx_u64(&x54, &x55, x53, x40, 0x0); - fiat_p318233_addcarryx_u64(&x56, &x57, x55, x42, 0x0); - fiat_p318233_addcarryx_u64(&x58, &x59, x57, x44, 0x0); - fiat_p318233_addcarryx_u64(&x60, &x61, x59, x46, 0x0); - fiat_p318233_mulx_u64(&x62, &x63, x48, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x64, &x65, x48, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x66, &x67, x48, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x68, &x69, x48, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x70, &x71, x48, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x72, &x73, x48, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x74, &x75, x48, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x76, &x77, x48, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x78, &x79, 0x0, x77, x74); - fiat_p318233_addcarryx_u64(&x80, &x81, x79, x75, x72); - fiat_p318233_addcarryx_u64(&x82, &x83, x81, x73, x70); - fiat_p318233_addcarryx_u64(&x84, &x85, x83, x71, x68); - fiat_p318233_addcarryx_u64(&x86, &x87, x85, x69, x66); - fiat_p318233_addcarryx_u64(&x88, &x89, x87, x67, x64); - fiat_p318233_addcarryx_u64(&x90, &x91, x89, x65, x62); - fiat_p318233_addcarryx_u64(&x92, &x93, 0x0, x48, x76); - fiat_p318233_addcarryx_u64(&x94, &x95, x93, x50, x78); - fiat_p318233_addcarryx_u64(&x96, &x97, x95, x52, x80); - fiat_p318233_addcarryx_u64(&x98, &x99, x97, x54, x82); - fiat_p318233_addcarryx_u64(&x100, &x101, x99, x56, x84); - fiat_p318233_addcarryx_u64(&x102, &x103, x101, x58, x86); - fiat_p318233_addcarryx_u64(&x104, &x105, x103, x60, x88); - fiat_p318233_addcarryx_u64(&x106, &x107, x105, (x61 + (x47 + (x31 + x3))), x90); - fiat_p318233_addcarryx_u64(&x108, &x109, 0x0, x94, (arg1[2])); - fiat_p318233_addcarryx_u64(&x110, &x111, x109, x96, 0x0); - fiat_p318233_addcarryx_u64(&x112, &x113, x111, x98, 0x0); - fiat_p318233_addcarryx_u64(&x114, &x115, x113, x100, 0x0); - fiat_p318233_addcarryx_u64(&x116, &x117, x115, x102, 0x0); - fiat_p318233_addcarryx_u64(&x118, &x119, x117, x104, 0x0); - fiat_p318233_addcarryx_u64(&x120, &x121, x119, x106, 0x0); - fiat_p318233_mulx_u64(&x122, &x123, x108, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x124, &x125, x108, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x126, &x127, x108, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x128, &x129, x108, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x130, &x131, x108, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x132, &x133, x108, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x134, &x135, x108, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x136, &x137, x108, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x138, &x139, 0x0, x137, x134); - fiat_p318233_addcarryx_u64(&x140, &x141, x139, x135, x132); - fiat_p318233_addcarryx_u64(&x142, &x143, x141, x133, x130); - fiat_p318233_addcarryx_u64(&x144, &x145, x143, x131, x128); - fiat_p318233_addcarryx_u64(&x146, &x147, x145, x129, x126); - fiat_p318233_addcarryx_u64(&x148, &x149, x147, x127, x124); - fiat_p318233_addcarryx_u64(&x150, &x151, x149, x125, x122); - fiat_p318233_addcarryx_u64(&x152, &x153, 0x0, x108, x136); - fiat_p318233_addcarryx_u64(&x154, &x155, x153, x110, x138); - fiat_p318233_addcarryx_u64(&x156, &x157, x155, x112, x140); - fiat_p318233_addcarryx_u64(&x158, &x159, x157, x114, x142); - fiat_p318233_addcarryx_u64(&x160, &x161, x159, x116, x144); - fiat_p318233_addcarryx_u64(&x162, &x163, x161, x118, x146); - fiat_p318233_addcarryx_u64(&x164, &x165, x163, x120, x148); - fiat_p318233_addcarryx_u64(&x166, &x167, x165, (x121 + (x107 + (x91 + x63))), x150); - fiat_p318233_addcarryx_u64(&x168, &x169, 0x0, x154, (arg1[3])); - fiat_p318233_addcarryx_u64(&x170, &x171, x169, x156, 0x0); - fiat_p318233_addcarryx_u64(&x172, &x173, x171, x158, 0x0); - fiat_p318233_addcarryx_u64(&x174, &x175, x173, x160, 0x0); - fiat_p318233_addcarryx_u64(&x176, &x177, x175, x162, 0x0); - fiat_p318233_addcarryx_u64(&x178, &x179, x177, x164, 0x0); - fiat_p318233_addcarryx_u64(&x180, &x181, x179, x166, 0x0); - fiat_p318233_mulx_u64(&x182, &x183, x168, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x184, &x185, x168, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x186, &x187, x168, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x188, &x189, x168, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x190, &x191, x168, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x192, &x193, x168, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x194, &x195, x168, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x196, &x197, x168, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x198, &x199, 0x0, x197, x194); - fiat_p318233_addcarryx_u64(&x200, &x201, x199, x195, x192); - fiat_p318233_addcarryx_u64(&x202, &x203, x201, x193, x190); - fiat_p318233_addcarryx_u64(&x204, &x205, x203, x191, x188); - fiat_p318233_addcarryx_u64(&x206, &x207, x205, x189, x186); - fiat_p318233_addcarryx_u64(&x208, &x209, x207, x187, x184); - fiat_p318233_addcarryx_u64(&x210, &x211, x209, x185, x182); - fiat_p318233_addcarryx_u64(&x212, &x213, 0x0, x168, x196); - fiat_p318233_addcarryx_u64(&x214, &x215, x213, x170, x198); - fiat_p318233_addcarryx_u64(&x216, &x217, x215, x172, x200); - fiat_p318233_addcarryx_u64(&x218, &x219, x217, x174, x202); - fiat_p318233_addcarryx_u64(&x220, &x221, x219, x176, x204); - fiat_p318233_addcarryx_u64(&x222, &x223, x221, x178, x206); - fiat_p318233_addcarryx_u64(&x224, &x225, x223, x180, x208); - fiat_p318233_addcarryx_u64(&x226, &x227, x225, (x181 + (x167 + (x151 + x123))), x210); - fiat_p318233_addcarryx_u64(&x228, &x229, 0x0, x214, (arg1[4])); - fiat_p318233_addcarryx_u64(&x230, &x231, x229, x216, 0x0); - fiat_p318233_addcarryx_u64(&x232, &x233, x231, x218, 0x0); - fiat_p318233_addcarryx_u64(&x234, &x235, x233, x220, 0x0); - fiat_p318233_addcarryx_u64(&x236, &x237, x235, x222, 0x0); - fiat_p318233_addcarryx_u64(&x238, &x239, x237, x224, 0x0); - fiat_p318233_addcarryx_u64(&x240, &x241, x239, x226, 0x0); - fiat_p318233_mulx_u64(&x242, &x243, x228, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x244, &x245, x228, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x246, &x247, x228, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x248, &x249, x228, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x250, &x251, x228, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x252, &x253, x228, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x254, &x255, x228, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x256, &x257, x228, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x258, &x259, 0x0, x257, x254); - fiat_p318233_addcarryx_u64(&x260, &x261, x259, x255, x252); - fiat_p318233_addcarryx_u64(&x262, &x263, x261, x253, x250); - fiat_p318233_addcarryx_u64(&x264, &x265, x263, x251, x248); - fiat_p318233_addcarryx_u64(&x266, &x267, x265, x249, x246); - fiat_p318233_addcarryx_u64(&x268, &x269, x267, x247, x244); - fiat_p318233_addcarryx_u64(&x270, &x271, x269, x245, x242); - fiat_p318233_addcarryx_u64(&x272, &x273, 0x0, x228, x256); - fiat_p318233_addcarryx_u64(&x274, &x275, x273, x230, x258); - fiat_p318233_addcarryx_u64(&x276, &x277, x275, x232, x260); - fiat_p318233_addcarryx_u64(&x278, &x279, x277, x234, x262); - fiat_p318233_addcarryx_u64(&x280, &x281, x279, x236, x264); - fiat_p318233_addcarryx_u64(&x282, &x283, x281, x238, x266); - fiat_p318233_addcarryx_u64(&x284, &x285, x283, x240, x268); - fiat_p318233_addcarryx_u64(&x286, &x287, x285, (x241 + (x227 + (x211 + x183))), x270); - fiat_p318233_addcarryx_u64(&x288, &x289, 0x0, x274, (arg1[5])); - fiat_p318233_addcarryx_u64(&x290, &x291, x289, x276, 0x0); - fiat_p318233_addcarryx_u64(&x292, &x293, x291, x278, 0x0); - fiat_p318233_addcarryx_u64(&x294, &x295, x293, x280, 0x0); - fiat_p318233_addcarryx_u64(&x296, &x297, x295, x282, 0x0); - fiat_p318233_addcarryx_u64(&x298, &x299, x297, x284, 0x0); - fiat_p318233_addcarryx_u64(&x300, &x301, x299, x286, 0x0); - fiat_p318233_mulx_u64(&x302, &x303, x288, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x304, &x305, x288, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x306, &x307, x288, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x308, &x309, x288, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x310, &x311, x288, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x312, &x313, x288, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x314, &x315, x288, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x316, &x317, x288, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x318, &x319, 0x0, x317, x314); - fiat_p318233_addcarryx_u64(&x320, &x321, x319, x315, x312); - fiat_p318233_addcarryx_u64(&x322, &x323, x321, x313, x310); - fiat_p318233_addcarryx_u64(&x324, &x325, x323, x311, x308); - fiat_p318233_addcarryx_u64(&x326, &x327, x325, x309, x306); - fiat_p318233_addcarryx_u64(&x328, &x329, x327, x307, x304); - fiat_p318233_addcarryx_u64(&x330, &x331, x329, x305, x302); - fiat_p318233_addcarryx_u64(&x332, &x333, 0x0, x288, x316); - fiat_p318233_addcarryx_u64(&x334, &x335, x333, x290, x318); - fiat_p318233_addcarryx_u64(&x336, &x337, x335, x292, x320); - fiat_p318233_addcarryx_u64(&x338, &x339, x337, x294, x322); - fiat_p318233_addcarryx_u64(&x340, &x341, x339, x296, x324); - fiat_p318233_addcarryx_u64(&x342, &x343, x341, x298, x326); - fiat_p318233_addcarryx_u64(&x344, &x345, x343, x300, x328); - fiat_p318233_addcarryx_u64(&x346, &x347, x345, (x301 + (x287 + (x271 + x243))), x330); - fiat_p318233_addcarryx_u64(&x348, &x349, 0x0, x334, (arg1[6])); - fiat_p318233_addcarryx_u64(&x350, &x351, x349, x336, 0x0); - fiat_p318233_addcarryx_u64(&x352, &x353, x351, x338, 0x0); - fiat_p318233_addcarryx_u64(&x354, &x355, x353, x340, 0x0); - fiat_p318233_addcarryx_u64(&x356, &x357, x355, x342, 0x0); - fiat_p318233_addcarryx_u64(&x358, &x359, x357, x344, 0x0); - fiat_p318233_addcarryx_u64(&x360, &x361, x359, x346, 0x0); - fiat_p318233_mulx_u64(&x362, &x363, x348, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x364, &x365, x348, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x366, &x367, x348, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x368, &x369, x348, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x370, &x371, x348, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x372, &x373, x348, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x374, &x375, x348, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x376, &x377, x348, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x378, &x379, 0x0, x377, x374); - fiat_p318233_addcarryx_u64(&x380, &x381, x379, x375, x372); - fiat_p318233_addcarryx_u64(&x382, &x383, x381, x373, x370); - fiat_p318233_addcarryx_u64(&x384, &x385, x383, x371, x368); - fiat_p318233_addcarryx_u64(&x386, &x387, x385, x369, x366); - fiat_p318233_addcarryx_u64(&x388, &x389, x387, x367, x364); - fiat_p318233_addcarryx_u64(&x390, &x391, x389, x365, x362); - fiat_p318233_addcarryx_u64(&x392, &x393, 0x0, x348, x376); - fiat_p318233_addcarryx_u64(&x394, &x395, x393, x350, x378); - fiat_p318233_addcarryx_u64(&x396, &x397, x395, x352, x380); - fiat_p318233_addcarryx_u64(&x398, &x399, x397, x354, x382); - fiat_p318233_addcarryx_u64(&x400, &x401, x399, x356, x384); - fiat_p318233_addcarryx_u64(&x402, &x403, x401, x358, x386); - fiat_p318233_addcarryx_u64(&x404, &x405, x403, x360, x388); - fiat_p318233_addcarryx_u64(&x406, &x407, x405, (x361 + (x347 + (x331 + x303))), x390); - fiat_p318233_addcarryx_u64(&x408, &x409, 0x0, x394, (arg1[7])); - fiat_p318233_addcarryx_u64(&x410, &x411, x409, x396, 0x0); - fiat_p318233_addcarryx_u64(&x412, &x413, x411, x398, 0x0); - fiat_p318233_addcarryx_u64(&x414, &x415, x413, x400, 0x0); - fiat_p318233_addcarryx_u64(&x416, &x417, x415, x402, 0x0); - fiat_p318233_addcarryx_u64(&x418, &x419, x417, x404, 0x0); - fiat_p318233_addcarryx_u64(&x420, &x421, x419, x406, 0x0); - fiat_p318233_mulx_u64(&x422, &x423, x408, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x424, &x425, x408, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x426, &x427, x408, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x428, &x429, x408, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x430, &x431, x408, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x432, &x433, x408, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x434, &x435, x408, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x436, &x437, x408, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x438, &x439, 0x0, x437, x434); - fiat_p318233_addcarryx_u64(&x440, &x441, x439, x435, x432); - fiat_p318233_addcarryx_u64(&x442, &x443, x441, x433, x430); - fiat_p318233_addcarryx_u64(&x444, &x445, x443, x431, x428); - fiat_p318233_addcarryx_u64(&x446, &x447, x445, x429, x426); - fiat_p318233_addcarryx_u64(&x448, &x449, x447, x427, x424); - fiat_p318233_addcarryx_u64(&x450, &x451, x449, x425, x422); - fiat_p318233_addcarryx_u64(&x452, &x453, 0x0, x408, x436); - fiat_p318233_addcarryx_u64(&x454, &x455, x453, x410, x438); - fiat_p318233_addcarryx_u64(&x456, &x457, x455, x412, x440); - fiat_p318233_addcarryx_u64(&x458, &x459, x457, x414, x442); - fiat_p318233_addcarryx_u64(&x460, &x461, x459, x416, x444); - fiat_p318233_addcarryx_u64(&x462, &x463, x461, x418, x446); - fiat_p318233_addcarryx_u64(&x464, &x465, x463, x420, x448); - fiat_p318233_addcarryx_u64(&x466, &x467, x465, (x421 + (x407 + (x391 + x363))), x450); - x468 = (x467 + (x451 + x423)); - fiat_p318233_subborrowx_u64(&x469, &x470, 0x0, x454, UINT64_C(0xffffffffffffffff)); - fiat_p318233_subborrowx_u64(&x471, &x472, x470, x456, UINT64_C(0xffffffffffffffff)); - fiat_p318233_subborrowx_u64(&x473, &x474, x472, x458, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_subborrowx_u64(&x475, &x476, x474, x460, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_subborrowx_u64(&x477, &x478, x476, x462, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_subborrowx_u64(&x479, &x480, x478, x464, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_subborrowx_u64(&x481, &x482, x480, x466, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_subborrowx_u64(&x483, &x484, x482, x468, UINT64_C(0x255946a8869bc6)); - fiat_p318233_subborrowx_u64(&x485, &x486, x484, 0x0, 0x0); - fiat_p318233_cmovznz_u64(&x487, x486, x469, x454); - fiat_p318233_cmovznz_u64(&x488, x486, x471, x456); - fiat_p318233_cmovznz_u64(&x489, x486, x473, x458); - fiat_p318233_cmovznz_u64(&x490, x486, x475, x460); - fiat_p318233_cmovznz_u64(&x491, x486, x477, x462); - fiat_p318233_cmovznz_u64(&x492, x486, x479, x464); - fiat_p318233_cmovznz_u64(&x493, x486, x481, x466); - fiat_p318233_cmovznz_u64(&x494, x486, x483, x468); - out1[0] = x487; - out1[1] = x488; - out1[2] = x489; - out1[3] = x490; - out1[4] = x491; - out1[5] = x492; - out1[6] = x493; - out1[7] = x494; -} - -/* - * The function fiat_p318233_to_montgomery translates a field element into the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval (from_montgomery out1) mod m = eval arg1 mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p318233_to_montgomery(fiat_p318233_montgomery_domain_field_element out1, const fiat_p318233_non_montgomery_domain_field_element arg1) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - uint64_t x14; - uint64_t x15; - uint64_t x16; - uint64_t x17; - uint64_t x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - uint64_t x23; - uint64_t x24; - uint64_t x25; - fiat_p318233_uint1 x26; - uint64_t x27; - fiat_p318233_uint1 x28; - uint64_t x29; - fiat_p318233_uint1 x30; - uint64_t x31; - fiat_p318233_uint1 x32; - uint64_t x33; - fiat_p318233_uint1 x34; - uint64_t x35; - fiat_p318233_uint1 x36; - uint64_t x37; - fiat_p318233_uint1 x38; - uint64_t x39; - uint64_t x40; - uint64_t x41; - uint64_t x42; - uint64_t x43; - uint64_t x44; - uint64_t x45; - uint64_t x46; - uint64_t x47; - uint64_t x48; - uint64_t x49; - uint64_t x50; - uint64_t x51; - uint64_t x52; - uint64_t x53; - uint64_t x54; - uint64_t x55; - fiat_p318233_uint1 x56; - uint64_t x57; - fiat_p318233_uint1 x58; - uint64_t x59; - fiat_p318233_uint1 x60; - uint64_t x61; - fiat_p318233_uint1 x62; - uint64_t x63; - fiat_p318233_uint1 x64; - uint64_t x65; - fiat_p318233_uint1 x66; - uint64_t x67; - fiat_p318233_uint1 x68; - uint64_t x69; - fiat_p318233_uint1 x70; - uint64_t x71; - fiat_p318233_uint1 x72; - uint64_t x73; - fiat_p318233_uint1 x74; - uint64_t x75; - fiat_p318233_uint1 x76; - uint64_t x77; - fiat_p318233_uint1 x78; - uint64_t x79; - fiat_p318233_uint1 x80; - uint64_t x81; - fiat_p318233_uint1 x82; - uint64_t x83; - fiat_p318233_uint1 x84; - uint64_t x85; - uint64_t x86; - uint64_t x87; - uint64_t x88; - uint64_t x89; - uint64_t x90; - uint64_t x91; - uint64_t x92; - uint64_t x93; - uint64_t x94; - uint64_t x95; - uint64_t x96; - uint64_t x97; - uint64_t x98; - uint64_t x99; - uint64_t x100; - uint64_t x101; - fiat_p318233_uint1 x102; - uint64_t x103; - fiat_p318233_uint1 x104; - uint64_t x105; - fiat_p318233_uint1 x106; - uint64_t x107; - fiat_p318233_uint1 x108; - uint64_t x109; - fiat_p318233_uint1 x110; - uint64_t x111; - fiat_p318233_uint1 x112; - uint64_t x113; - fiat_p318233_uint1 x114; - uint64_t x115; - fiat_p318233_uint1 x116; - uint64_t x117; - fiat_p318233_uint1 x118; - uint64_t x119; - fiat_p318233_uint1 x120; - uint64_t x121; - fiat_p318233_uint1 x122; - uint64_t x123; - fiat_p318233_uint1 x124; - uint64_t x125; - fiat_p318233_uint1 x126; - uint64_t x127; - fiat_p318233_uint1 x128; - uint64_t x129; - fiat_p318233_uint1 x130; - uint64_t x131; - uint64_t x132; - uint64_t x133; - uint64_t x134; - uint64_t x135; - uint64_t x136; - uint64_t x137; - uint64_t x138; - uint64_t x139; - uint64_t x140; - uint64_t x141; - uint64_t x142; - uint64_t x143; - uint64_t x144; - uint64_t x145; - uint64_t x146; - uint64_t x147; - fiat_p318233_uint1 x148; - uint64_t x149; - fiat_p318233_uint1 x150; - uint64_t x151; - fiat_p318233_uint1 x152; - uint64_t x153; - fiat_p318233_uint1 x154; - uint64_t x155; - fiat_p318233_uint1 x156; - uint64_t x157; - fiat_p318233_uint1 x158; - uint64_t x159; - fiat_p318233_uint1 x160; - uint64_t x161; - fiat_p318233_uint1 x162; - uint64_t x163; - fiat_p318233_uint1 x164; - uint64_t x165; - fiat_p318233_uint1 x166; - uint64_t x167; - fiat_p318233_uint1 x168; - uint64_t x169; - fiat_p318233_uint1 x170; - uint64_t x171; - fiat_p318233_uint1 x172; - uint64_t x173; - fiat_p318233_uint1 x174; - uint64_t x175; - fiat_p318233_uint1 x176; - uint64_t x177; - uint64_t x178; - uint64_t x179; - uint64_t x180; - uint64_t x181; - uint64_t x182; - uint64_t x183; - uint64_t x184; - uint64_t x185; - uint64_t x186; - uint64_t x187; - uint64_t x188; - uint64_t x189; - uint64_t x190; - uint64_t x191; - uint64_t x192; - uint64_t x193; - fiat_p318233_uint1 x194; - uint64_t x195; - fiat_p318233_uint1 x196; - uint64_t x197; - fiat_p318233_uint1 x198; - uint64_t x199; - fiat_p318233_uint1 x200; - uint64_t x201; - fiat_p318233_uint1 x202; - uint64_t x203; - fiat_p318233_uint1 x204; - uint64_t x205; - fiat_p318233_uint1 x206; - uint64_t x207; - fiat_p318233_uint1 x208; - uint64_t x209; - fiat_p318233_uint1 x210; - uint64_t x211; - fiat_p318233_uint1 x212; - uint64_t x213; - fiat_p318233_uint1 x214; - uint64_t x215; - fiat_p318233_uint1 x216; - uint64_t x217; - fiat_p318233_uint1 x218; - uint64_t x219; - fiat_p318233_uint1 x220; - uint64_t x221; - fiat_p318233_uint1 x222; - uint64_t x223; - uint64_t x224; - uint64_t x225; - uint64_t x226; - uint64_t x227; - uint64_t x228; - uint64_t x229; - uint64_t x230; - uint64_t x231; - uint64_t x232; - uint64_t x233; - uint64_t x234; - uint64_t x235; - uint64_t x236; - uint64_t x237; - uint64_t x238; - uint64_t x239; - fiat_p318233_uint1 x240; - uint64_t x241; - fiat_p318233_uint1 x242; - uint64_t x243; - fiat_p318233_uint1 x244; - uint64_t x245; - fiat_p318233_uint1 x246; - uint64_t x247; - fiat_p318233_uint1 x248; - uint64_t x249; - fiat_p318233_uint1 x250; - uint64_t x251; - fiat_p318233_uint1 x252; - uint64_t x253; - fiat_p318233_uint1 x254; - uint64_t x255; - fiat_p318233_uint1 x256; - uint64_t x257; - fiat_p318233_uint1 x258; - uint64_t x259; - fiat_p318233_uint1 x260; - uint64_t x261; - fiat_p318233_uint1 x262; - uint64_t x263; - fiat_p318233_uint1 x264; - uint64_t x265; - fiat_p318233_uint1 x266; - uint64_t x267; - fiat_p318233_uint1 x268; - uint64_t x269; - uint64_t x270; - uint64_t x271; - uint64_t x272; - uint64_t x273; - uint64_t x274; - uint64_t x275; - uint64_t x276; - uint64_t x277; - uint64_t x278; - uint64_t x279; - uint64_t x280; - uint64_t x281; - uint64_t x282; - uint64_t x283; - uint64_t x284; - uint64_t x285; - fiat_p318233_uint1 x286; - uint64_t x287; - fiat_p318233_uint1 x288; - uint64_t x289; - fiat_p318233_uint1 x290; - uint64_t x291; - fiat_p318233_uint1 x292; - uint64_t x293; - fiat_p318233_uint1 x294; - uint64_t x295; - fiat_p318233_uint1 x296; - uint64_t x297; - fiat_p318233_uint1 x298; - uint64_t x299; - fiat_p318233_uint1 x300; - uint64_t x301; - fiat_p318233_uint1 x302; - uint64_t x303; - fiat_p318233_uint1 x304; - uint64_t x305; - fiat_p318233_uint1 x306; - uint64_t x307; - fiat_p318233_uint1 x308; - uint64_t x309; - fiat_p318233_uint1 x310; - uint64_t x311; - fiat_p318233_uint1 x312; - uint64_t x313; - fiat_p318233_uint1 x314; - uint64_t x315; - uint64_t x316; - uint64_t x317; - uint64_t x318; - uint64_t x319; - uint64_t x320; - uint64_t x321; - uint64_t x322; - uint64_t x323; - uint64_t x324; - uint64_t x325; - uint64_t x326; - uint64_t x327; - uint64_t x328; - uint64_t x329; - uint64_t x330; - uint64_t x331; - fiat_p318233_uint1 x332; - uint64_t x333; - fiat_p318233_uint1 x334; - uint64_t x335; - fiat_p318233_uint1 x336; - uint64_t x337; - fiat_p318233_uint1 x338; - uint64_t x339; - fiat_p318233_uint1 x340; - uint64_t x341; - fiat_p318233_uint1 x342; - uint64_t x343; - fiat_p318233_uint1 x344; - uint64_t x345; - fiat_p318233_uint1 x346; - uint64_t x347; - fiat_p318233_uint1 x348; - uint64_t x349; - fiat_p318233_uint1 x350; - uint64_t x351; - fiat_p318233_uint1 x352; - uint64_t x353; - fiat_p318233_uint1 x354; - uint64_t x355; - fiat_p318233_uint1 x356; - uint64_t x357; - fiat_p318233_uint1 x358; - uint64_t x359; - fiat_p318233_uint1 x360; - uint64_t x361; - uint64_t x362; - uint64_t x363; - uint64_t x364; - uint64_t x365; - uint64_t x366; - uint64_t x367; - uint64_t x368; - uint64_t x369; - uint64_t x370; - uint64_t x371; - uint64_t x372; - uint64_t x373; - uint64_t x374; - uint64_t x375; - uint64_t x376; - uint64_t x377; - fiat_p318233_uint1 x378; - uint64_t x379; - fiat_p318233_uint1 x380; - uint64_t x381; - fiat_p318233_uint1 x382; - uint64_t x383; - fiat_p318233_uint1 x384; - uint64_t x385; - fiat_p318233_uint1 x386; - uint64_t x387; - fiat_p318233_uint1 x388; - uint64_t x389; - fiat_p318233_uint1 x390; - uint64_t x391; - fiat_p318233_uint1 x392; - uint64_t x393; - fiat_p318233_uint1 x394; - uint64_t x395; - fiat_p318233_uint1 x396; - uint64_t x397; - fiat_p318233_uint1 x398; - uint64_t x399; - fiat_p318233_uint1 x400; - uint64_t x401; - fiat_p318233_uint1 x402; - uint64_t x403; - fiat_p318233_uint1 x404; - uint64_t x405; - fiat_p318233_uint1 x406; - uint64_t x407; - uint64_t x408; - uint64_t x409; - uint64_t x410; - uint64_t x411; - uint64_t x412; - uint64_t x413; - uint64_t x414; - uint64_t x415; - uint64_t x416; - uint64_t x417; - uint64_t x418; - uint64_t x419; - uint64_t x420; - uint64_t x421; - uint64_t x422; - uint64_t x423; - fiat_p318233_uint1 x424; - uint64_t x425; - fiat_p318233_uint1 x426; - uint64_t x427; - fiat_p318233_uint1 x428; - uint64_t x429; - fiat_p318233_uint1 x430; - uint64_t x431; - fiat_p318233_uint1 x432; - uint64_t x433; - fiat_p318233_uint1 x434; - uint64_t x435; - fiat_p318233_uint1 x436; - uint64_t x437; - fiat_p318233_uint1 x438; - uint64_t x439; - fiat_p318233_uint1 x440; - uint64_t x441; - fiat_p318233_uint1 x442; - uint64_t x443; - fiat_p318233_uint1 x444; - uint64_t x445; - fiat_p318233_uint1 x446; - uint64_t x447; - fiat_p318233_uint1 x448; - uint64_t x449; - fiat_p318233_uint1 x450; - uint64_t x451; - fiat_p318233_uint1 x452; - uint64_t x453; - uint64_t x454; - uint64_t x455; - uint64_t x456; - uint64_t x457; - uint64_t x458; - uint64_t x459; - uint64_t x460; - uint64_t x461; - uint64_t x462; - uint64_t x463; - uint64_t x464; - uint64_t x465; - uint64_t x466; - uint64_t x467; - uint64_t x468; - uint64_t x469; - fiat_p318233_uint1 x470; - uint64_t x471; - fiat_p318233_uint1 x472; - uint64_t x473; - fiat_p318233_uint1 x474; - uint64_t x475; - fiat_p318233_uint1 x476; - uint64_t x477; - fiat_p318233_uint1 x478; - uint64_t x479; - fiat_p318233_uint1 x480; - uint64_t x481; - fiat_p318233_uint1 x482; - uint64_t x483; - fiat_p318233_uint1 x484; - uint64_t x485; - fiat_p318233_uint1 x486; - uint64_t x487; - fiat_p318233_uint1 x488; - uint64_t x489; - fiat_p318233_uint1 x490; - uint64_t x491; - fiat_p318233_uint1 x492; - uint64_t x493; - fiat_p318233_uint1 x494; - uint64_t x495; - fiat_p318233_uint1 x496; - uint64_t x497; - fiat_p318233_uint1 x498; - uint64_t x499; - uint64_t x500; - uint64_t x501; - uint64_t x502; - uint64_t x503; - uint64_t x504; - uint64_t x505; - uint64_t x506; - uint64_t x507; - uint64_t x508; - uint64_t x509; - uint64_t x510; - uint64_t x511; - uint64_t x512; - uint64_t x513; - uint64_t x514; - uint64_t x515; - fiat_p318233_uint1 x516; - uint64_t x517; - fiat_p318233_uint1 x518; - uint64_t x519; - fiat_p318233_uint1 x520; - uint64_t x521; - fiat_p318233_uint1 x522; - uint64_t x523; - fiat_p318233_uint1 x524; - uint64_t x525; - fiat_p318233_uint1 x526; - uint64_t x527; - fiat_p318233_uint1 x528; - uint64_t x529; - fiat_p318233_uint1 x530; - uint64_t x531; - fiat_p318233_uint1 x532; - uint64_t x533; - fiat_p318233_uint1 x534; - uint64_t x535; - fiat_p318233_uint1 x536; - uint64_t x537; - fiat_p318233_uint1 x538; - uint64_t x539; - fiat_p318233_uint1 x540; - uint64_t x541; - fiat_p318233_uint1 x542; - uint64_t x543; - fiat_p318233_uint1 x544; - uint64_t x545; - uint64_t x546; - uint64_t x547; - uint64_t x548; - uint64_t x549; - uint64_t x550; - uint64_t x551; - uint64_t x552; - uint64_t x553; - uint64_t x554; - uint64_t x555; - uint64_t x556; - uint64_t x557; - uint64_t x558; - uint64_t x559; - uint64_t x560; - uint64_t x561; - fiat_p318233_uint1 x562; - uint64_t x563; - fiat_p318233_uint1 x564; - uint64_t x565; - fiat_p318233_uint1 x566; - uint64_t x567; - fiat_p318233_uint1 x568; - uint64_t x569; - fiat_p318233_uint1 x570; - uint64_t x571; - fiat_p318233_uint1 x572; - uint64_t x573; - fiat_p318233_uint1 x574; - uint64_t x575; - fiat_p318233_uint1 x576; - uint64_t x577; - fiat_p318233_uint1 x578; - uint64_t x579; - fiat_p318233_uint1 x580; - uint64_t x581; - fiat_p318233_uint1 x582; - uint64_t x583; - fiat_p318233_uint1 x584; - uint64_t x585; - fiat_p318233_uint1 x586; - uint64_t x587; - fiat_p318233_uint1 x588; - uint64_t x589; - fiat_p318233_uint1 x590; - uint64_t x591; - uint64_t x592; - uint64_t x593; - uint64_t x594; - uint64_t x595; - uint64_t x596; - uint64_t x597; - uint64_t x598; - uint64_t x599; - uint64_t x600; - uint64_t x601; - uint64_t x602; - uint64_t x603; - uint64_t x604; - uint64_t x605; - uint64_t x606; - uint64_t x607; - fiat_p318233_uint1 x608; - uint64_t x609; - fiat_p318233_uint1 x610; - uint64_t x611; - fiat_p318233_uint1 x612; - uint64_t x613; - fiat_p318233_uint1 x614; - uint64_t x615; - fiat_p318233_uint1 x616; - uint64_t x617; - fiat_p318233_uint1 x618; - uint64_t x619; - fiat_p318233_uint1 x620; - uint64_t x621; - fiat_p318233_uint1 x622; - uint64_t x623; - fiat_p318233_uint1 x624; - uint64_t x625; - fiat_p318233_uint1 x626; - uint64_t x627; - fiat_p318233_uint1 x628; - uint64_t x629; - fiat_p318233_uint1 x630; - uint64_t x631; - fiat_p318233_uint1 x632; - uint64_t x633; - fiat_p318233_uint1 x634; - uint64_t x635; - fiat_p318233_uint1 x636; - uint64_t x637; - uint64_t x638; - uint64_t x639; - uint64_t x640; - uint64_t x641; - uint64_t x642; - uint64_t x643; - uint64_t x644; - uint64_t x645; - uint64_t x646; - uint64_t x647; - uint64_t x648; - uint64_t x649; - uint64_t x650; - uint64_t x651; - uint64_t x652; - uint64_t x653; - fiat_p318233_uint1 x654; - uint64_t x655; - fiat_p318233_uint1 x656; - uint64_t x657; - fiat_p318233_uint1 x658; - uint64_t x659; - fiat_p318233_uint1 x660; - uint64_t x661; - fiat_p318233_uint1 x662; - uint64_t x663; - fiat_p318233_uint1 x664; - uint64_t x665; - fiat_p318233_uint1 x666; - uint64_t x667; - fiat_p318233_uint1 x668; - uint64_t x669; - fiat_p318233_uint1 x670; - uint64_t x671; - fiat_p318233_uint1 x672; - uint64_t x673; - fiat_p318233_uint1 x674; - uint64_t x675; - fiat_p318233_uint1 x676; - uint64_t x677; - fiat_p318233_uint1 x678; - uint64_t x679; - fiat_p318233_uint1 x680; - uint64_t x681; - fiat_p318233_uint1 x682; - uint64_t x683; - uint64_t x684; - uint64_t x685; - uint64_t x686; - uint64_t x687; - uint64_t x688; - uint64_t x689; - uint64_t x690; - uint64_t x691; - uint64_t x692; - uint64_t x693; - uint64_t x694; - uint64_t x695; - uint64_t x696; - uint64_t x697; - uint64_t x698; - uint64_t x699; - fiat_p318233_uint1 x700; - uint64_t x701; - fiat_p318233_uint1 x702; - uint64_t x703; - fiat_p318233_uint1 x704; - uint64_t x705; - fiat_p318233_uint1 x706; - uint64_t x707; - fiat_p318233_uint1 x708; - uint64_t x709; - fiat_p318233_uint1 x710; - uint64_t x711; - fiat_p318233_uint1 x712; - uint64_t x713; - fiat_p318233_uint1 x714; - uint64_t x715; - fiat_p318233_uint1 x716; - uint64_t x717; - fiat_p318233_uint1 x718; - uint64_t x719; - fiat_p318233_uint1 x720; - uint64_t x721; - fiat_p318233_uint1 x722; - uint64_t x723; - fiat_p318233_uint1 x724; - uint64_t x725; - fiat_p318233_uint1 x726; - uint64_t x727; - fiat_p318233_uint1 x728; - uint64_t x729; - uint64_t x730; - fiat_p318233_uint1 x731; - uint64_t x732; - fiat_p318233_uint1 x733; - uint64_t x734; - fiat_p318233_uint1 x735; - uint64_t x736; - fiat_p318233_uint1 x737; - uint64_t x738; - fiat_p318233_uint1 x739; - uint64_t x740; - fiat_p318233_uint1 x741; - uint64_t x742; - fiat_p318233_uint1 x743; - uint64_t x744; - fiat_p318233_uint1 x745; - uint64_t x746; - fiat_p318233_uint1 x747; - uint64_t x748; - uint64_t x749; - uint64_t x750; - uint64_t x751; - uint64_t x752; - uint64_t x753; - uint64_t x754; - uint64_t x755; - x1 = (arg1[1]); - x2 = (arg1[2]); - x3 = (arg1[3]); - x4 = (arg1[4]); - x5 = (arg1[5]); - x6 = (arg1[6]); - x7 = (arg1[7]); - x8 = (arg1[0]); - fiat_p318233_mulx_u64(&x9, &x10, x8, UINT64_C(0x1691676b8674b8)); - fiat_p318233_mulx_u64(&x11, &x12, x8, UINT64_C(0x2780b5f2daf1003c)); - fiat_p318233_mulx_u64(&x13, &x14, x8, UINT64_C(0x2cc2ea622f9e57c8)); - fiat_p318233_mulx_u64(&x15, &x16, x8, UINT64_C(0x87994b8955d8b8d4)); - fiat_p318233_mulx_u64(&x17, &x18, x8, UINT64_C(0x1adb99ddacaa06ec)); - fiat_p318233_mulx_u64(&x19, &x20, x8, UINT64_C(0x545ac09f2f1b55c8)); - fiat_p318233_mulx_u64(&x21, &x22, x8, UINT64_C(0xcb993b5943e89ea5)); - fiat_p318233_mulx_u64(&x23, &x24, x8, UINT64_C(0x46e4e8a0c7549cbd)); - fiat_p318233_addcarryx_u64(&x25, &x26, 0x0, x24, x21); - fiat_p318233_addcarryx_u64(&x27, &x28, x26, x22, x19); - fiat_p318233_addcarryx_u64(&x29, &x30, x28, x20, x17); - fiat_p318233_addcarryx_u64(&x31, &x32, x30, x18, x15); - fiat_p318233_addcarryx_u64(&x33, &x34, x32, x16, x13); - fiat_p318233_addcarryx_u64(&x35, &x36, x34, x14, x11); - fiat_p318233_addcarryx_u64(&x37, &x38, x36, x12, x9); - fiat_p318233_mulx_u64(&x39, &x40, x23, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x41, &x42, x23, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x43, &x44, x23, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x45, &x46, x23, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x47, &x48, x23, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x49, &x50, x23, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x51, &x52, x23, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x53, &x54, x23, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x55, &x56, 0x0, x54, x51); - fiat_p318233_addcarryx_u64(&x57, &x58, x56, x52, x49); - fiat_p318233_addcarryx_u64(&x59, &x60, x58, x50, x47); - fiat_p318233_addcarryx_u64(&x61, &x62, x60, x48, x45); - fiat_p318233_addcarryx_u64(&x63, &x64, x62, x46, x43); - fiat_p318233_addcarryx_u64(&x65, &x66, x64, x44, x41); - fiat_p318233_addcarryx_u64(&x67, &x68, x66, x42, x39); - fiat_p318233_addcarryx_u64(&x69, &x70, 0x0, x23, x53); - fiat_p318233_addcarryx_u64(&x71, &x72, x70, x25, x55); - fiat_p318233_addcarryx_u64(&x73, &x74, x72, x27, x57); - fiat_p318233_addcarryx_u64(&x75, &x76, x74, x29, x59); - fiat_p318233_addcarryx_u64(&x77, &x78, x76, x31, x61); - fiat_p318233_addcarryx_u64(&x79, &x80, x78, x33, x63); - fiat_p318233_addcarryx_u64(&x81, &x82, x80, x35, x65); - fiat_p318233_addcarryx_u64(&x83, &x84, x82, x37, x67); - fiat_p318233_mulx_u64(&x85, &x86, x1, UINT64_C(0x1691676b8674b8)); - fiat_p318233_mulx_u64(&x87, &x88, x1, UINT64_C(0x2780b5f2daf1003c)); - fiat_p318233_mulx_u64(&x89, &x90, x1, UINT64_C(0x2cc2ea622f9e57c8)); - fiat_p318233_mulx_u64(&x91, &x92, x1, UINT64_C(0x87994b8955d8b8d4)); - fiat_p318233_mulx_u64(&x93, &x94, x1, UINT64_C(0x1adb99ddacaa06ec)); - fiat_p318233_mulx_u64(&x95, &x96, x1, UINT64_C(0x545ac09f2f1b55c8)); - fiat_p318233_mulx_u64(&x97, &x98, x1, UINT64_C(0xcb993b5943e89ea5)); - fiat_p318233_mulx_u64(&x99, &x100, x1, UINT64_C(0x46e4e8a0c7549cbd)); - fiat_p318233_addcarryx_u64(&x101, &x102, 0x0, x100, x97); - fiat_p318233_addcarryx_u64(&x103, &x104, x102, x98, x95); - fiat_p318233_addcarryx_u64(&x105, &x106, x104, x96, x93); - fiat_p318233_addcarryx_u64(&x107, &x108, x106, x94, x91); - fiat_p318233_addcarryx_u64(&x109, &x110, x108, x92, x89); - fiat_p318233_addcarryx_u64(&x111, &x112, x110, x90, x87); - fiat_p318233_addcarryx_u64(&x113, &x114, x112, x88, x85); - fiat_p318233_addcarryx_u64(&x115, &x116, 0x0, x71, x99); - fiat_p318233_addcarryx_u64(&x117, &x118, x116, x73, x101); - fiat_p318233_addcarryx_u64(&x119, &x120, x118, x75, x103); - fiat_p318233_addcarryx_u64(&x121, &x122, x120, x77, x105); - fiat_p318233_addcarryx_u64(&x123, &x124, x122, x79, x107); - fiat_p318233_addcarryx_u64(&x125, &x126, x124, x81, x109); - fiat_p318233_addcarryx_u64(&x127, &x128, x126, x83, x111); - fiat_p318233_addcarryx_u64(&x129, &x130, x128, ((x84 + (x38 + x10)) + (x68 + x40)), x113); - fiat_p318233_mulx_u64(&x131, &x132, x115, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x133, &x134, x115, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x135, &x136, x115, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x137, &x138, x115, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x139, &x140, x115, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x141, &x142, x115, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x143, &x144, x115, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x145, &x146, x115, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x147, &x148, 0x0, x146, x143); - fiat_p318233_addcarryx_u64(&x149, &x150, x148, x144, x141); - fiat_p318233_addcarryx_u64(&x151, &x152, x150, x142, x139); - fiat_p318233_addcarryx_u64(&x153, &x154, x152, x140, x137); - fiat_p318233_addcarryx_u64(&x155, &x156, x154, x138, x135); - fiat_p318233_addcarryx_u64(&x157, &x158, x156, x136, x133); - fiat_p318233_addcarryx_u64(&x159, &x160, x158, x134, x131); - fiat_p318233_addcarryx_u64(&x161, &x162, 0x0, x115, x145); - fiat_p318233_addcarryx_u64(&x163, &x164, x162, x117, x147); - fiat_p318233_addcarryx_u64(&x165, &x166, x164, x119, x149); - fiat_p318233_addcarryx_u64(&x167, &x168, x166, x121, x151); - fiat_p318233_addcarryx_u64(&x169, &x170, x168, x123, x153); - fiat_p318233_addcarryx_u64(&x171, &x172, x170, x125, x155); - fiat_p318233_addcarryx_u64(&x173, &x174, x172, x127, x157); - fiat_p318233_addcarryx_u64(&x175, &x176, x174, x129, x159); - fiat_p318233_mulx_u64(&x177, &x178, x2, UINT64_C(0x1691676b8674b8)); - fiat_p318233_mulx_u64(&x179, &x180, x2, UINT64_C(0x2780b5f2daf1003c)); - fiat_p318233_mulx_u64(&x181, &x182, x2, UINT64_C(0x2cc2ea622f9e57c8)); - fiat_p318233_mulx_u64(&x183, &x184, x2, UINT64_C(0x87994b8955d8b8d4)); - fiat_p318233_mulx_u64(&x185, &x186, x2, UINT64_C(0x1adb99ddacaa06ec)); - fiat_p318233_mulx_u64(&x187, &x188, x2, UINT64_C(0x545ac09f2f1b55c8)); - fiat_p318233_mulx_u64(&x189, &x190, x2, UINT64_C(0xcb993b5943e89ea5)); - fiat_p318233_mulx_u64(&x191, &x192, x2, UINT64_C(0x46e4e8a0c7549cbd)); - fiat_p318233_addcarryx_u64(&x193, &x194, 0x0, x192, x189); - fiat_p318233_addcarryx_u64(&x195, &x196, x194, x190, x187); - fiat_p318233_addcarryx_u64(&x197, &x198, x196, x188, x185); - fiat_p318233_addcarryx_u64(&x199, &x200, x198, x186, x183); - fiat_p318233_addcarryx_u64(&x201, &x202, x200, x184, x181); - fiat_p318233_addcarryx_u64(&x203, &x204, x202, x182, x179); - fiat_p318233_addcarryx_u64(&x205, &x206, x204, x180, x177); - fiat_p318233_addcarryx_u64(&x207, &x208, 0x0, x163, x191); - fiat_p318233_addcarryx_u64(&x209, &x210, x208, x165, x193); - fiat_p318233_addcarryx_u64(&x211, &x212, x210, x167, x195); - fiat_p318233_addcarryx_u64(&x213, &x214, x212, x169, x197); - fiat_p318233_addcarryx_u64(&x215, &x216, x214, x171, x199); - fiat_p318233_addcarryx_u64(&x217, &x218, x216, x173, x201); - fiat_p318233_addcarryx_u64(&x219, &x220, x218, x175, x203); - fiat_p318233_addcarryx_u64(&x221, &x222, x220, ((x176 + (x130 + (x114 + x86))) + (x160 + x132)), x205); - fiat_p318233_mulx_u64(&x223, &x224, x207, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x225, &x226, x207, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x227, &x228, x207, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x229, &x230, x207, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x231, &x232, x207, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x233, &x234, x207, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x235, &x236, x207, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x237, &x238, x207, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x239, &x240, 0x0, x238, x235); - fiat_p318233_addcarryx_u64(&x241, &x242, x240, x236, x233); - fiat_p318233_addcarryx_u64(&x243, &x244, x242, x234, x231); - fiat_p318233_addcarryx_u64(&x245, &x246, x244, x232, x229); - fiat_p318233_addcarryx_u64(&x247, &x248, x246, x230, x227); - fiat_p318233_addcarryx_u64(&x249, &x250, x248, x228, x225); - fiat_p318233_addcarryx_u64(&x251, &x252, x250, x226, x223); - fiat_p318233_addcarryx_u64(&x253, &x254, 0x0, x207, x237); - fiat_p318233_addcarryx_u64(&x255, &x256, x254, x209, x239); - fiat_p318233_addcarryx_u64(&x257, &x258, x256, x211, x241); - fiat_p318233_addcarryx_u64(&x259, &x260, x258, x213, x243); - fiat_p318233_addcarryx_u64(&x261, &x262, x260, x215, x245); - fiat_p318233_addcarryx_u64(&x263, &x264, x262, x217, x247); - fiat_p318233_addcarryx_u64(&x265, &x266, x264, x219, x249); - fiat_p318233_addcarryx_u64(&x267, &x268, x266, x221, x251); - fiat_p318233_mulx_u64(&x269, &x270, x3, UINT64_C(0x1691676b8674b8)); - fiat_p318233_mulx_u64(&x271, &x272, x3, UINT64_C(0x2780b5f2daf1003c)); - fiat_p318233_mulx_u64(&x273, &x274, x3, UINT64_C(0x2cc2ea622f9e57c8)); - fiat_p318233_mulx_u64(&x275, &x276, x3, UINT64_C(0x87994b8955d8b8d4)); - fiat_p318233_mulx_u64(&x277, &x278, x3, UINT64_C(0x1adb99ddacaa06ec)); - fiat_p318233_mulx_u64(&x279, &x280, x3, UINT64_C(0x545ac09f2f1b55c8)); - fiat_p318233_mulx_u64(&x281, &x282, x3, UINT64_C(0xcb993b5943e89ea5)); - fiat_p318233_mulx_u64(&x283, &x284, x3, UINT64_C(0x46e4e8a0c7549cbd)); - fiat_p318233_addcarryx_u64(&x285, &x286, 0x0, x284, x281); - fiat_p318233_addcarryx_u64(&x287, &x288, x286, x282, x279); - fiat_p318233_addcarryx_u64(&x289, &x290, x288, x280, x277); - fiat_p318233_addcarryx_u64(&x291, &x292, x290, x278, x275); - fiat_p318233_addcarryx_u64(&x293, &x294, x292, x276, x273); - fiat_p318233_addcarryx_u64(&x295, &x296, x294, x274, x271); - fiat_p318233_addcarryx_u64(&x297, &x298, x296, x272, x269); - fiat_p318233_addcarryx_u64(&x299, &x300, 0x0, x255, x283); - fiat_p318233_addcarryx_u64(&x301, &x302, x300, x257, x285); - fiat_p318233_addcarryx_u64(&x303, &x304, x302, x259, x287); - fiat_p318233_addcarryx_u64(&x305, &x306, x304, x261, x289); - fiat_p318233_addcarryx_u64(&x307, &x308, x306, x263, x291); - fiat_p318233_addcarryx_u64(&x309, &x310, x308, x265, x293); - fiat_p318233_addcarryx_u64(&x311, &x312, x310, x267, x295); - fiat_p318233_addcarryx_u64(&x313, &x314, x312, ((x268 + (x222 + (x206 + x178))) + (x252 + x224)), x297); - fiat_p318233_mulx_u64(&x315, &x316, x299, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x317, &x318, x299, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x319, &x320, x299, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x321, &x322, x299, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x323, &x324, x299, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x325, &x326, x299, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x327, &x328, x299, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x329, &x330, x299, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x331, &x332, 0x0, x330, x327); - fiat_p318233_addcarryx_u64(&x333, &x334, x332, x328, x325); - fiat_p318233_addcarryx_u64(&x335, &x336, x334, x326, x323); - fiat_p318233_addcarryx_u64(&x337, &x338, x336, x324, x321); - fiat_p318233_addcarryx_u64(&x339, &x340, x338, x322, x319); - fiat_p318233_addcarryx_u64(&x341, &x342, x340, x320, x317); - fiat_p318233_addcarryx_u64(&x343, &x344, x342, x318, x315); - fiat_p318233_addcarryx_u64(&x345, &x346, 0x0, x299, x329); - fiat_p318233_addcarryx_u64(&x347, &x348, x346, x301, x331); - fiat_p318233_addcarryx_u64(&x349, &x350, x348, x303, x333); - fiat_p318233_addcarryx_u64(&x351, &x352, x350, x305, x335); - fiat_p318233_addcarryx_u64(&x353, &x354, x352, x307, x337); - fiat_p318233_addcarryx_u64(&x355, &x356, x354, x309, x339); - fiat_p318233_addcarryx_u64(&x357, &x358, x356, x311, x341); - fiat_p318233_addcarryx_u64(&x359, &x360, x358, x313, x343); - fiat_p318233_mulx_u64(&x361, &x362, x4, UINT64_C(0x1691676b8674b8)); - fiat_p318233_mulx_u64(&x363, &x364, x4, UINT64_C(0x2780b5f2daf1003c)); - fiat_p318233_mulx_u64(&x365, &x366, x4, UINT64_C(0x2cc2ea622f9e57c8)); - fiat_p318233_mulx_u64(&x367, &x368, x4, UINT64_C(0x87994b8955d8b8d4)); - fiat_p318233_mulx_u64(&x369, &x370, x4, UINT64_C(0x1adb99ddacaa06ec)); - fiat_p318233_mulx_u64(&x371, &x372, x4, UINT64_C(0x545ac09f2f1b55c8)); - fiat_p318233_mulx_u64(&x373, &x374, x4, UINT64_C(0xcb993b5943e89ea5)); - fiat_p318233_mulx_u64(&x375, &x376, x4, UINT64_C(0x46e4e8a0c7549cbd)); - fiat_p318233_addcarryx_u64(&x377, &x378, 0x0, x376, x373); - fiat_p318233_addcarryx_u64(&x379, &x380, x378, x374, x371); - fiat_p318233_addcarryx_u64(&x381, &x382, x380, x372, x369); - fiat_p318233_addcarryx_u64(&x383, &x384, x382, x370, x367); - fiat_p318233_addcarryx_u64(&x385, &x386, x384, x368, x365); - fiat_p318233_addcarryx_u64(&x387, &x388, x386, x366, x363); - fiat_p318233_addcarryx_u64(&x389, &x390, x388, x364, x361); - fiat_p318233_addcarryx_u64(&x391, &x392, 0x0, x347, x375); - fiat_p318233_addcarryx_u64(&x393, &x394, x392, x349, x377); - fiat_p318233_addcarryx_u64(&x395, &x396, x394, x351, x379); - fiat_p318233_addcarryx_u64(&x397, &x398, x396, x353, x381); - fiat_p318233_addcarryx_u64(&x399, &x400, x398, x355, x383); - fiat_p318233_addcarryx_u64(&x401, &x402, x400, x357, x385); - fiat_p318233_addcarryx_u64(&x403, &x404, x402, x359, x387); - fiat_p318233_addcarryx_u64(&x405, &x406, x404, ((x360 + (x314 + (x298 + x270))) + (x344 + x316)), x389); - fiat_p318233_mulx_u64(&x407, &x408, x391, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x409, &x410, x391, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x411, &x412, x391, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x413, &x414, x391, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x415, &x416, x391, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x417, &x418, x391, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x419, &x420, x391, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x421, &x422, x391, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x423, &x424, 0x0, x422, x419); - fiat_p318233_addcarryx_u64(&x425, &x426, x424, x420, x417); - fiat_p318233_addcarryx_u64(&x427, &x428, x426, x418, x415); - fiat_p318233_addcarryx_u64(&x429, &x430, x428, x416, x413); - fiat_p318233_addcarryx_u64(&x431, &x432, x430, x414, x411); - fiat_p318233_addcarryx_u64(&x433, &x434, x432, x412, x409); - fiat_p318233_addcarryx_u64(&x435, &x436, x434, x410, x407); - fiat_p318233_addcarryx_u64(&x437, &x438, 0x0, x391, x421); - fiat_p318233_addcarryx_u64(&x439, &x440, x438, x393, x423); - fiat_p318233_addcarryx_u64(&x441, &x442, x440, x395, x425); - fiat_p318233_addcarryx_u64(&x443, &x444, x442, x397, x427); - fiat_p318233_addcarryx_u64(&x445, &x446, x444, x399, x429); - fiat_p318233_addcarryx_u64(&x447, &x448, x446, x401, x431); - fiat_p318233_addcarryx_u64(&x449, &x450, x448, x403, x433); - fiat_p318233_addcarryx_u64(&x451, &x452, x450, x405, x435); - fiat_p318233_mulx_u64(&x453, &x454, x5, UINT64_C(0x1691676b8674b8)); - fiat_p318233_mulx_u64(&x455, &x456, x5, UINT64_C(0x2780b5f2daf1003c)); - fiat_p318233_mulx_u64(&x457, &x458, x5, UINT64_C(0x2cc2ea622f9e57c8)); - fiat_p318233_mulx_u64(&x459, &x460, x5, UINT64_C(0x87994b8955d8b8d4)); - fiat_p318233_mulx_u64(&x461, &x462, x5, UINT64_C(0x1adb99ddacaa06ec)); - fiat_p318233_mulx_u64(&x463, &x464, x5, UINT64_C(0x545ac09f2f1b55c8)); - fiat_p318233_mulx_u64(&x465, &x466, x5, UINT64_C(0xcb993b5943e89ea5)); - fiat_p318233_mulx_u64(&x467, &x468, x5, UINT64_C(0x46e4e8a0c7549cbd)); - fiat_p318233_addcarryx_u64(&x469, &x470, 0x0, x468, x465); - fiat_p318233_addcarryx_u64(&x471, &x472, x470, x466, x463); - fiat_p318233_addcarryx_u64(&x473, &x474, x472, x464, x461); - fiat_p318233_addcarryx_u64(&x475, &x476, x474, x462, x459); - fiat_p318233_addcarryx_u64(&x477, &x478, x476, x460, x457); - fiat_p318233_addcarryx_u64(&x479, &x480, x478, x458, x455); - fiat_p318233_addcarryx_u64(&x481, &x482, x480, x456, x453); - fiat_p318233_addcarryx_u64(&x483, &x484, 0x0, x439, x467); - fiat_p318233_addcarryx_u64(&x485, &x486, x484, x441, x469); - fiat_p318233_addcarryx_u64(&x487, &x488, x486, x443, x471); - fiat_p318233_addcarryx_u64(&x489, &x490, x488, x445, x473); - fiat_p318233_addcarryx_u64(&x491, &x492, x490, x447, x475); - fiat_p318233_addcarryx_u64(&x493, &x494, x492, x449, x477); - fiat_p318233_addcarryx_u64(&x495, &x496, x494, x451, x479); - fiat_p318233_addcarryx_u64(&x497, &x498, x496, ((x452 + (x406 + (x390 + x362))) + (x436 + x408)), x481); - fiat_p318233_mulx_u64(&x499, &x500, x483, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x501, &x502, x483, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x503, &x504, x483, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x505, &x506, x483, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x507, &x508, x483, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x509, &x510, x483, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x511, &x512, x483, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x513, &x514, x483, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x515, &x516, 0x0, x514, x511); - fiat_p318233_addcarryx_u64(&x517, &x518, x516, x512, x509); - fiat_p318233_addcarryx_u64(&x519, &x520, x518, x510, x507); - fiat_p318233_addcarryx_u64(&x521, &x522, x520, x508, x505); - fiat_p318233_addcarryx_u64(&x523, &x524, x522, x506, x503); - fiat_p318233_addcarryx_u64(&x525, &x526, x524, x504, x501); - fiat_p318233_addcarryx_u64(&x527, &x528, x526, x502, x499); - fiat_p318233_addcarryx_u64(&x529, &x530, 0x0, x483, x513); - fiat_p318233_addcarryx_u64(&x531, &x532, x530, x485, x515); - fiat_p318233_addcarryx_u64(&x533, &x534, x532, x487, x517); - fiat_p318233_addcarryx_u64(&x535, &x536, x534, x489, x519); - fiat_p318233_addcarryx_u64(&x537, &x538, x536, x491, x521); - fiat_p318233_addcarryx_u64(&x539, &x540, x538, x493, x523); - fiat_p318233_addcarryx_u64(&x541, &x542, x540, x495, x525); - fiat_p318233_addcarryx_u64(&x543, &x544, x542, x497, x527); - fiat_p318233_mulx_u64(&x545, &x546, x6, UINT64_C(0x1691676b8674b8)); - fiat_p318233_mulx_u64(&x547, &x548, x6, UINT64_C(0x2780b5f2daf1003c)); - fiat_p318233_mulx_u64(&x549, &x550, x6, UINT64_C(0x2cc2ea622f9e57c8)); - fiat_p318233_mulx_u64(&x551, &x552, x6, UINT64_C(0x87994b8955d8b8d4)); - fiat_p318233_mulx_u64(&x553, &x554, x6, UINT64_C(0x1adb99ddacaa06ec)); - fiat_p318233_mulx_u64(&x555, &x556, x6, UINT64_C(0x545ac09f2f1b55c8)); - fiat_p318233_mulx_u64(&x557, &x558, x6, UINT64_C(0xcb993b5943e89ea5)); - fiat_p318233_mulx_u64(&x559, &x560, x6, UINT64_C(0x46e4e8a0c7549cbd)); - fiat_p318233_addcarryx_u64(&x561, &x562, 0x0, x560, x557); - fiat_p318233_addcarryx_u64(&x563, &x564, x562, x558, x555); - fiat_p318233_addcarryx_u64(&x565, &x566, x564, x556, x553); - fiat_p318233_addcarryx_u64(&x567, &x568, x566, x554, x551); - fiat_p318233_addcarryx_u64(&x569, &x570, x568, x552, x549); - fiat_p318233_addcarryx_u64(&x571, &x572, x570, x550, x547); - fiat_p318233_addcarryx_u64(&x573, &x574, x572, x548, x545); - fiat_p318233_addcarryx_u64(&x575, &x576, 0x0, x531, x559); - fiat_p318233_addcarryx_u64(&x577, &x578, x576, x533, x561); - fiat_p318233_addcarryx_u64(&x579, &x580, x578, x535, x563); - fiat_p318233_addcarryx_u64(&x581, &x582, x580, x537, x565); - fiat_p318233_addcarryx_u64(&x583, &x584, x582, x539, x567); - fiat_p318233_addcarryx_u64(&x585, &x586, x584, x541, x569); - fiat_p318233_addcarryx_u64(&x587, &x588, x586, x543, x571); - fiat_p318233_addcarryx_u64(&x589, &x590, x588, ((x544 + (x498 + (x482 + x454))) + (x528 + x500)), x573); - fiat_p318233_mulx_u64(&x591, &x592, x575, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x593, &x594, x575, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x595, &x596, x575, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x597, &x598, x575, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x599, &x600, x575, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x601, &x602, x575, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x603, &x604, x575, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x605, &x606, x575, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x607, &x608, 0x0, x606, x603); - fiat_p318233_addcarryx_u64(&x609, &x610, x608, x604, x601); - fiat_p318233_addcarryx_u64(&x611, &x612, x610, x602, x599); - fiat_p318233_addcarryx_u64(&x613, &x614, x612, x600, x597); - fiat_p318233_addcarryx_u64(&x615, &x616, x614, x598, x595); - fiat_p318233_addcarryx_u64(&x617, &x618, x616, x596, x593); - fiat_p318233_addcarryx_u64(&x619, &x620, x618, x594, x591); - fiat_p318233_addcarryx_u64(&x621, &x622, 0x0, x575, x605); - fiat_p318233_addcarryx_u64(&x623, &x624, x622, x577, x607); - fiat_p318233_addcarryx_u64(&x625, &x626, x624, x579, x609); - fiat_p318233_addcarryx_u64(&x627, &x628, x626, x581, x611); - fiat_p318233_addcarryx_u64(&x629, &x630, x628, x583, x613); - fiat_p318233_addcarryx_u64(&x631, &x632, x630, x585, x615); - fiat_p318233_addcarryx_u64(&x633, &x634, x632, x587, x617); - fiat_p318233_addcarryx_u64(&x635, &x636, x634, x589, x619); - fiat_p318233_mulx_u64(&x637, &x638, x7, UINT64_C(0x1691676b8674b8)); - fiat_p318233_mulx_u64(&x639, &x640, x7, UINT64_C(0x2780b5f2daf1003c)); - fiat_p318233_mulx_u64(&x641, &x642, x7, UINT64_C(0x2cc2ea622f9e57c8)); - fiat_p318233_mulx_u64(&x643, &x644, x7, UINT64_C(0x87994b8955d8b8d4)); - fiat_p318233_mulx_u64(&x645, &x646, x7, UINT64_C(0x1adb99ddacaa06ec)); - fiat_p318233_mulx_u64(&x647, &x648, x7, UINT64_C(0x545ac09f2f1b55c8)); - fiat_p318233_mulx_u64(&x649, &x650, x7, UINT64_C(0xcb993b5943e89ea5)); - fiat_p318233_mulx_u64(&x651, &x652, x7, UINT64_C(0x46e4e8a0c7549cbd)); - fiat_p318233_addcarryx_u64(&x653, &x654, 0x0, x652, x649); - fiat_p318233_addcarryx_u64(&x655, &x656, x654, x650, x647); - fiat_p318233_addcarryx_u64(&x657, &x658, x656, x648, x645); - fiat_p318233_addcarryx_u64(&x659, &x660, x658, x646, x643); - fiat_p318233_addcarryx_u64(&x661, &x662, x660, x644, x641); - fiat_p318233_addcarryx_u64(&x663, &x664, x662, x642, x639); - fiat_p318233_addcarryx_u64(&x665, &x666, x664, x640, x637); - fiat_p318233_addcarryx_u64(&x667, &x668, 0x0, x623, x651); - fiat_p318233_addcarryx_u64(&x669, &x670, x668, x625, x653); - fiat_p318233_addcarryx_u64(&x671, &x672, x670, x627, x655); - fiat_p318233_addcarryx_u64(&x673, &x674, x672, x629, x657); - fiat_p318233_addcarryx_u64(&x675, &x676, x674, x631, x659); - fiat_p318233_addcarryx_u64(&x677, &x678, x676, x633, x661); - fiat_p318233_addcarryx_u64(&x679, &x680, x678, x635, x663); - fiat_p318233_addcarryx_u64(&x681, &x682, x680, ((x636 + (x590 + (x574 + x546))) + (x620 + x592)), x665); - fiat_p318233_mulx_u64(&x683, &x684, x667, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x685, &x686, x667, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x687, &x688, x667, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x689, &x690, x667, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x691, &x692, x667, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x693, &x694, x667, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x695, &x696, x667, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x697, &x698, x667, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x699, &x700, 0x0, x698, x695); - fiat_p318233_addcarryx_u64(&x701, &x702, x700, x696, x693); - fiat_p318233_addcarryx_u64(&x703, &x704, x702, x694, x691); - fiat_p318233_addcarryx_u64(&x705, &x706, x704, x692, x689); - fiat_p318233_addcarryx_u64(&x707, &x708, x706, x690, x687); - fiat_p318233_addcarryx_u64(&x709, &x710, x708, x688, x685); - fiat_p318233_addcarryx_u64(&x711, &x712, x710, x686, x683); - fiat_p318233_addcarryx_u64(&x713, &x714, 0x0, x667, x697); - fiat_p318233_addcarryx_u64(&x715, &x716, x714, x669, x699); - fiat_p318233_addcarryx_u64(&x717, &x718, x716, x671, x701); - fiat_p318233_addcarryx_u64(&x719, &x720, x718, x673, x703); - fiat_p318233_addcarryx_u64(&x721, &x722, x720, x675, x705); - fiat_p318233_addcarryx_u64(&x723, &x724, x722, x677, x707); - fiat_p318233_addcarryx_u64(&x725, &x726, x724, x679, x709); - fiat_p318233_addcarryx_u64(&x727, &x728, x726, x681, x711); - x729 = ((x728 + (x682 + (x666 + x638))) + (x712 + x684)); - fiat_p318233_subborrowx_u64(&x730, &x731, 0x0, x715, UINT64_C(0xffffffffffffffff)); - fiat_p318233_subborrowx_u64(&x732, &x733, x731, x717, UINT64_C(0xffffffffffffffff)); - fiat_p318233_subborrowx_u64(&x734, &x735, x733, x719, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_subborrowx_u64(&x736, &x737, x735, x721, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_subborrowx_u64(&x738, &x739, x737, x723, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_subborrowx_u64(&x740, &x741, x739, x725, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_subborrowx_u64(&x742, &x743, x741, x727, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_subborrowx_u64(&x744, &x745, x743, x729, UINT64_C(0x255946a8869bc6)); - fiat_p318233_subborrowx_u64(&x746, &x747, x745, 0x0, 0x0); - fiat_p318233_cmovznz_u64(&x748, x747, x730, x715); - fiat_p318233_cmovznz_u64(&x749, x747, x732, x717); - fiat_p318233_cmovznz_u64(&x750, x747, x734, x719); - fiat_p318233_cmovznz_u64(&x751, x747, x736, x721); - fiat_p318233_cmovznz_u64(&x752, x747, x738, x723); - fiat_p318233_cmovznz_u64(&x753, x747, x740, x725); - fiat_p318233_cmovznz_u64(&x754, x747, x742, x727); - fiat_p318233_cmovznz_u64(&x755, x747, x744, x729); - out1[0] = x748; - out1[1] = x749; - out1[2] = x750; - out1[3] = x751; - out1[4] = x752; - out1[5] = x753; - out1[6] = x754; - out1[7] = x755; -} - -/* - * The function fiat_p318233_nonzero outputs a single non-zero word if the input is non-zero and zero otherwise. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * out1 = 0 ↔ eval (from_montgomery arg1) mod m = 0 - * - * Input Bounds: - * arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - */ -void fiat_p318233_nonzero(uint64_t* out1, const uint64_t arg1[8]) { - uint64_t x1; - x1 = ((arg1[0]) | ((arg1[1]) | ((arg1[2]) | ((arg1[3]) | ((arg1[4]) | ((arg1[5]) | ((arg1[6]) | (arg1[7])))))))); - *out1 = x1; -} - -/* - * The function fiat_p318233_selectznz is a multi-limb conditional select. - * - * Postconditions: - * out1 = (if arg1 = 0 then arg2 else arg3) - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * arg3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * Output Bounds: - * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - */ -void fiat_p318233_selectznz(uint64_t out1[8], fiat_p318233_uint1 arg1, const uint64_t arg2[8], const uint64_t arg3[8]) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - fiat_p318233_cmovznz_u64(&x1, arg1, (arg2[0]), (arg3[0])); - fiat_p318233_cmovznz_u64(&x2, arg1, (arg2[1]), (arg3[1])); - fiat_p318233_cmovznz_u64(&x3, arg1, (arg2[2]), (arg3[2])); - fiat_p318233_cmovznz_u64(&x4, arg1, (arg2[3]), (arg3[3])); - fiat_p318233_cmovznz_u64(&x5, arg1, (arg2[4]), (arg3[4])); - fiat_p318233_cmovznz_u64(&x6, arg1, (arg2[5]), (arg3[5])); - fiat_p318233_cmovznz_u64(&x7, arg1, (arg2[6]), (arg3[6])); - fiat_p318233_cmovznz_u64(&x8, arg1, (arg2[7]), (arg3[7])); - out1[0] = x1; - out1[1] = x2; - out1[2] = x3; - out1[3] = x4; - out1[4] = x5; - out1[5] = x6; - out1[6] = x7; - out1[7] = x8; -} - -/* - * The function fiat_p318233_to_bytes serializes a field element NOT in the Montgomery domain to bytes in little-endian order. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * out1 = map (λ x, ⌊((eval arg1 mod m) mod 2^(8 * (x + 1))) / 2^(8 * x)⌋) [0..62] - * - * Input Bounds: - * arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0x3fffffffffffff]] - * Output Bounds: - * out1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x3f]] - */ -void fiat_p318233_to_bytes(uint8_t out1[63], const uint64_t arg1[8]) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint8_t x9; - uint64_t x10; - uint8_t x11; - uint64_t x12; - uint8_t x13; - uint64_t x14; - uint8_t x15; - uint64_t x16; - uint8_t x17; - uint64_t x18; - uint8_t x19; - uint64_t x20; - uint8_t x21; - uint8_t x22; - uint8_t x23; - uint64_t x24; - uint8_t x25; - uint64_t x26; - uint8_t x27; - uint64_t x28; - uint8_t x29; - uint64_t x30; - uint8_t x31; - uint64_t x32; - uint8_t x33; - uint64_t x34; - uint8_t x35; - uint8_t x36; - uint8_t x37; - uint64_t x38; - uint8_t x39; - uint64_t x40; - uint8_t x41; - uint64_t x42; - uint8_t x43; - uint64_t x44; - uint8_t x45; - uint64_t x46; - uint8_t x47; - uint64_t x48; - uint8_t x49; - uint8_t x50; - uint8_t x51; - uint64_t x52; - uint8_t x53; - uint64_t x54; - uint8_t x55; - uint64_t x56; - uint8_t x57; - uint64_t x58; - uint8_t x59; - uint64_t x60; - uint8_t x61; - uint64_t x62; - uint8_t x63; - uint8_t x64; - uint8_t x65; - uint64_t x66; - uint8_t x67; - uint64_t x68; - uint8_t x69; - uint64_t x70; - uint8_t x71; - uint64_t x72; - uint8_t x73; - uint64_t x74; - uint8_t x75; - uint64_t x76; - uint8_t x77; - uint8_t x78; - uint8_t x79; - uint64_t x80; - uint8_t x81; - uint64_t x82; - uint8_t x83; - uint64_t x84; - uint8_t x85; - uint64_t x86; - uint8_t x87; - uint64_t x88; - uint8_t x89; - uint64_t x90; - uint8_t x91; - uint8_t x92; - uint8_t x93; - uint64_t x94; - uint8_t x95; - uint64_t x96; - uint8_t x97; - uint64_t x98; - uint8_t x99; - uint64_t x100; - uint8_t x101; - uint64_t x102; - uint8_t x103; - uint64_t x104; - uint8_t x105; - uint8_t x106; - uint8_t x107; - uint64_t x108; - uint8_t x109; - uint64_t x110; - uint8_t x111; - uint64_t x112; - uint8_t x113; - uint64_t x114; - uint8_t x115; - uint64_t x116; - uint8_t x117; - uint8_t x118; - x1 = (arg1[7]); - x2 = (arg1[6]); - x3 = (arg1[5]); - x4 = (arg1[4]); - x5 = (arg1[3]); - x6 = (arg1[2]); - x7 = (arg1[1]); - x8 = (arg1[0]); - x9 = (uint8_t)(x8 & UINT8_C(0xff)); - x10 = (x8 >> 8); - x11 = (uint8_t)(x10 & UINT8_C(0xff)); - x12 = (x10 >> 8); - x13 = (uint8_t)(x12 & UINT8_C(0xff)); - x14 = (x12 >> 8); - x15 = (uint8_t)(x14 & UINT8_C(0xff)); - x16 = (x14 >> 8); - x17 = (uint8_t)(x16 & UINT8_C(0xff)); - x18 = (x16 >> 8); - x19 = (uint8_t)(x18 & UINT8_C(0xff)); - x20 = (x18 >> 8); - x21 = (uint8_t)(x20 & UINT8_C(0xff)); - x22 = (uint8_t)(x20 >> 8); - x23 = (uint8_t)(x7 & UINT8_C(0xff)); - x24 = (x7 >> 8); - x25 = (uint8_t)(x24 & UINT8_C(0xff)); - x26 = (x24 >> 8); - x27 = (uint8_t)(x26 & UINT8_C(0xff)); - x28 = (x26 >> 8); - x29 = (uint8_t)(x28 & UINT8_C(0xff)); - x30 = (x28 >> 8); - x31 = (uint8_t)(x30 & UINT8_C(0xff)); - x32 = (x30 >> 8); - x33 = (uint8_t)(x32 & UINT8_C(0xff)); - x34 = (x32 >> 8); - x35 = (uint8_t)(x34 & UINT8_C(0xff)); - x36 = (uint8_t)(x34 >> 8); - x37 = (uint8_t)(x6 & UINT8_C(0xff)); - x38 = (x6 >> 8); - x39 = (uint8_t)(x38 & UINT8_C(0xff)); - x40 = (x38 >> 8); - x41 = (uint8_t)(x40 & UINT8_C(0xff)); - x42 = (x40 >> 8); - x43 = (uint8_t)(x42 & UINT8_C(0xff)); - x44 = (x42 >> 8); - x45 = (uint8_t)(x44 & UINT8_C(0xff)); - x46 = (x44 >> 8); - x47 = (uint8_t)(x46 & UINT8_C(0xff)); - x48 = (x46 >> 8); - x49 = (uint8_t)(x48 & UINT8_C(0xff)); - x50 = (uint8_t)(x48 >> 8); - x51 = (uint8_t)(x5 & UINT8_C(0xff)); - x52 = (x5 >> 8); - x53 = (uint8_t)(x52 & UINT8_C(0xff)); - x54 = (x52 >> 8); - x55 = (uint8_t)(x54 & UINT8_C(0xff)); - x56 = (x54 >> 8); - x57 = (uint8_t)(x56 & UINT8_C(0xff)); - x58 = (x56 >> 8); - x59 = (uint8_t)(x58 & UINT8_C(0xff)); - x60 = (x58 >> 8); - x61 = (uint8_t)(x60 & UINT8_C(0xff)); - x62 = (x60 >> 8); - x63 = (uint8_t)(x62 & UINT8_C(0xff)); - x64 = (uint8_t)(x62 >> 8); - x65 = (uint8_t)(x4 & UINT8_C(0xff)); - x66 = (x4 >> 8); - x67 = (uint8_t)(x66 & UINT8_C(0xff)); - x68 = (x66 >> 8); - x69 = (uint8_t)(x68 & UINT8_C(0xff)); - x70 = (x68 >> 8); - x71 = (uint8_t)(x70 & UINT8_C(0xff)); - x72 = (x70 >> 8); - x73 = (uint8_t)(x72 & UINT8_C(0xff)); - x74 = (x72 >> 8); - x75 = (uint8_t)(x74 & UINT8_C(0xff)); - x76 = (x74 >> 8); - x77 = (uint8_t)(x76 & UINT8_C(0xff)); - x78 = (uint8_t)(x76 >> 8); - x79 = (uint8_t)(x3 & UINT8_C(0xff)); - x80 = (x3 >> 8); - x81 = (uint8_t)(x80 & UINT8_C(0xff)); - x82 = (x80 >> 8); - x83 = (uint8_t)(x82 & UINT8_C(0xff)); - x84 = (x82 >> 8); - x85 = (uint8_t)(x84 & UINT8_C(0xff)); - x86 = (x84 >> 8); - x87 = (uint8_t)(x86 & UINT8_C(0xff)); - x88 = (x86 >> 8); - x89 = (uint8_t)(x88 & UINT8_C(0xff)); - x90 = (x88 >> 8); - x91 = (uint8_t)(x90 & UINT8_C(0xff)); - x92 = (uint8_t)(x90 >> 8); - x93 = (uint8_t)(x2 & UINT8_C(0xff)); - x94 = (x2 >> 8); - x95 = (uint8_t)(x94 & UINT8_C(0xff)); - x96 = (x94 >> 8); - x97 = (uint8_t)(x96 & UINT8_C(0xff)); - x98 = (x96 >> 8); - x99 = (uint8_t)(x98 & UINT8_C(0xff)); - x100 = (x98 >> 8); - x101 = (uint8_t)(x100 & UINT8_C(0xff)); - x102 = (x100 >> 8); - x103 = (uint8_t)(x102 & UINT8_C(0xff)); - x104 = (x102 >> 8); - x105 = (uint8_t)(x104 & UINT8_C(0xff)); - x106 = (uint8_t)(x104 >> 8); - x107 = (uint8_t)(x1 & UINT8_C(0xff)); - x108 = (x1 >> 8); - x109 = (uint8_t)(x108 & UINT8_C(0xff)); - x110 = (x108 >> 8); - x111 = (uint8_t)(x110 & UINT8_C(0xff)); - x112 = (x110 >> 8); - x113 = (uint8_t)(x112 & UINT8_C(0xff)); - x114 = (x112 >> 8); - x115 = (uint8_t)(x114 & UINT8_C(0xff)); - x116 = (x114 >> 8); - x117 = (uint8_t)(x116 & UINT8_C(0xff)); - x118 = (uint8_t)(x116 >> 8); - out1[0] = x9; - out1[1] = x11; - out1[2] = x13; - out1[3] = x15; - out1[4] = x17; - out1[5] = x19; - out1[6] = x21; - out1[7] = x22; - out1[8] = x23; - out1[9] = x25; - out1[10] = x27; - out1[11] = x29; - out1[12] = x31; - out1[13] = x33; - out1[14] = x35; - out1[15] = x36; - out1[16] = x37; - out1[17] = x39; - out1[18] = x41; - out1[19] = x43; - out1[20] = x45; - out1[21] = x47; - out1[22] = x49; - out1[23] = x50; - out1[24] = x51; - out1[25] = x53; - out1[26] = x55; - out1[27] = x57; - out1[28] = x59; - out1[29] = x61; - out1[30] = x63; - out1[31] = x64; - out1[32] = x65; - out1[33] = x67; - out1[34] = x69; - out1[35] = x71; - out1[36] = x73; - out1[37] = x75; - out1[38] = x77; - out1[39] = x78; - out1[40] = x79; - out1[41] = x81; - out1[42] = x83; - out1[43] = x85; - out1[44] = x87; - out1[45] = x89; - out1[46] = x91; - out1[47] = x92; - out1[48] = x93; - out1[49] = x95; - out1[50] = x97; - out1[51] = x99; - out1[52] = x101; - out1[53] = x103; - out1[54] = x105; - out1[55] = x106; - out1[56] = x107; - out1[57] = x109; - out1[58] = x111; - out1[59] = x113; - out1[60] = x115; - out1[61] = x117; - out1[62] = x118; -} - -/* - * The function fiat_p318233_from_bytes deserializes a field element NOT in the Montgomery domain from bytes in little-endian order. - * - * Preconditions: - * 0 ≤ bytes_eval arg1 < m - * Postconditions: - * eval out1 mod m = bytes_eval arg1 mod m - * 0 ≤ eval out1 < m - * - * Input Bounds: - * arg1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x3f]] - * Output Bounds: - * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0x3fffffffffffff]] - */ -void fiat_p318233_from_bytes(uint64_t out1[8], const uint8_t arg1[63]) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint8_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - uint64_t x14; - uint8_t x15; - uint64_t x16; - uint64_t x17; - uint64_t x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - uint8_t x23; - uint64_t x24; - uint64_t x25; - uint64_t x26; - uint64_t x27; - uint64_t x28; - uint64_t x29; - uint64_t x30; - uint8_t x31; - uint64_t x32; - uint64_t x33; - uint64_t x34; - uint64_t x35; - uint64_t x36; - uint64_t x37; - uint64_t x38; - uint8_t x39; - uint64_t x40; - uint64_t x41; - uint64_t x42; - uint64_t x43; - uint64_t x44; - uint64_t x45; - uint64_t x46; - uint8_t x47; - uint64_t x48; - uint64_t x49; - uint64_t x50; - uint64_t x51; - uint64_t x52; - uint64_t x53; - uint64_t x54; - uint8_t x55; - uint64_t x56; - uint64_t x57; - uint64_t x58; - uint64_t x59; - uint64_t x60; - uint64_t x61; - uint64_t x62; - uint8_t x63; - uint64_t x64; - uint64_t x65; - uint64_t x66; - uint64_t x67; - uint64_t x68; - uint64_t x69; - uint64_t x70; - uint64_t x71; - uint64_t x72; - uint64_t x73; - uint64_t x74; - uint64_t x75; - uint64_t x76; - uint64_t x77; - uint64_t x78; - uint64_t x79; - uint64_t x80; - uint64_t x81; - uint64_t x82; - uint64_t x83; - uint64_t x84; - uint64_t x85; - uint64_t x86; - uint64_t x87; - uint64_t x88; - uint64_t x89; - uint64_t x90; - uint64_t x91; - uint64_t x92; - uint64_t x93; - uint64_t x94; - uint64_t x95; - uint64_t x96; - uint64_t x97; - uint64_t x98; - uint64_t x99; - uint64_t x100; - uint64_t x101; - uint64_t x102; - uint64_t x103; - uint64_t x104; - uint64_t x105; - uint64_t x106; - uint64_t x107; - uint64_t x108; - uint64_t x109; - uint64_t x110; - uint64_t x111; - uint64_t x112; - uint64_t x113; - uint64_t x114; - uint64_t x115; - uint64_t x116; - uint64_t x117; - uint64_t x118; - x1 = ((uint64_t)(arg1[62]) << 48); - x2 = ((uint64_t)(arg1[61]) << 40); - x3 = ((uint64_t)(arg1[60]) << 32); - x4 = ((uint64_t)(arg1[59]) << 24); - x5 = ((uint64_t)(arg1[58]) << 16); - x6 = ((uint64_t)(arg1[57]) << 8); - x7 = (arg1[56]); - x8 = ((uint64_t)(arg1[55]) << 56); - x9 = ((uint64_t)(arg1[54]) << 48); - x10 = ((uint64_t)(arg1[53]) << 40); - x11 = ((uint64_t)(arg1[52]) << 32); - x12 = ((uint64_t)(arg1[51]) << 24); - x13 = ((uint64_t)(arg1[50]) << 16); - x14 = ((uint64_t)(arg1[49]) << 8); - x15 = (arg1[48]); - x16 = ((uint64_t)(arg1[47]) << 56); - x17 = ((uint64_t)(arg1[46]) << 48); - x18 = ((uint64_t)(arg1[45]) << 40); - x19 = ((uint64_t)(arg1[44]) << 32); - x20 = ((uint64_t)(arg1[43]) << 24); - x21 = ((uint64_t)(arg1[42]) << 16); - x22 = ((uint64_t)(arg1[41]) << 8); - x23 = (arg1[40]); - x24 = ((uint64_t)(arg1[39]) << 56); - x25 = ((uint64_t)(arg1[38]) << 48); - x26 = ((uint64_t)(arg1[37]) << 40); - x27 = ((uint64_t)(arg1[36]) << 32); - x28 = ((uint64_t)(arg1[35]) << 24); - x29 = ((uint64_t)(arg1[34]) << 16); - x30 = ((uint64_t)(arg1[33]) << 8); - x31 = (arg1[32]); - x32 = ((uint64_t)(arg1[31]) << 56); - x33 = ((uint64_t)(arg1[30]) << 48); - x34 = ((uint64_t)(arg1[29]) << 40); - x35 = ((uint64_t)(arg1[28]) << 32); - x36 = ((uint64_t)(arg1[27]) << 24); - x37 = ((uint64_t)(arg1[26]) << 16); - x38 = ((uint64_t)(arg1[25]) << 8); - x39 = (arg1[24]); - x40 = ((uint64_t)(arg1[23]) << 56); - x41 = ((uint64_t)(arg1[22]) << 48); - x42 = ((uint64_t)(arg1[21]) << 40); - x43 = ((uint64_t)(arg1[20]) << 32); - x44 = ((uint64_t)(arg1[19]) << 24); - x45 = ((uint64_t)(arg1[18]) << 16); - x46 = ((uint64_t)(arg1[17]) << 8); - x47 = (arg1[16]); - x48 = ((uint64_t)(arg1[15]) << 56); - x49 = ((uint64_t)(arg1[14]) << 48); - x50 = ((uint64_t)(arg1[13]) << 40); - x51 = ((uint64_t)(arg1[12]) << 32); - x52 = ((uint64_t)(arg1[11]) << 24); - x53 = ((uint64_t)(arg1[10]) << 16); - x54 = ((uint64_t)(arg1[9]) << 8); - x55 = (arg1[8]); - x56 = ((uint64_t)(arg1[7]) << 56); - x57 = ((uint64_t)(arg1[6]) << 48); - x58 = ((uint64_t)(arg1[5]) << 40); - x59 = ((uint64_t)(arg1[4]) << 32); - x60 = ((uint64_t)(arg1[3]) << 24); - x61 = ((uint64_t)(arg1[2]) << 16); - x62 = ((uint64_t)(arg1[1]) << 8); - x63 = (arg1[0]); - x64 = (x62 + (uint64_t)x63); - x65 = (x61 + x64); - x66 = (x60 + x65); - x67 = (x59 + x66); - x68 = (x58 + x67); - x69 = (x57 + x68); - x70 = (x56 + x69); - x71 = (x54 + (uint64_t)x55); - x72 = (x53 + x71); - x73 = (x52 + x72); - x74 = (x51 + x73); - x75 = (x50 + x74); - x76 = (x49 + x75); - x77 = (x48 + x76); - x78 = (x46 + (uint64_t)x47); - x79 = (x45 + x78); - x80 = (x44 + x79); - x81 = (x43 + x80); - x82 = (x42 + x81); - x83 = (x41 + x82); - x84 = (x40 + x83); - x85 = (x38 + (uint64_t)x39); - x86 = (x37 + x85); - x87 = (x36 + x86); - x88 = (x35 + x87); - x89 = (x34 + x88); - x90 = (x33 + x89); - x91 = (x32 + x90); - x92 = (x30 + (uint64_t)x31); - x93 = (x29 + x92); - x94 = (x28 + x93); - x95 = (x27 + x94); - x96 = (x26 + x95); - x97 = (x25 + x96); - x98 = (x24 + x97); - x99 = (x22 + (uint64_t)x23); - x100 = (x21 + x99); - x101 = (x20 + x100); - x102 = (x19 + x101); - x103 = (x18 + x102); - x104 = (x17 + x103); - x105 = (x16 + x104); - x106 = (x14 + (uint64_t)x15); - x107 = (x13 + x106); - x108 = (x12 + x107); - x109 = (x11 + x108); - x110 = (x10 + x109); - x111 = (x9 + x110); - x112 = (x8 + x111); - x113 = (x6 + (uint64_t)x7); - x114 = (x5 + x113); - x115 = (x4 + x114); - x116 = (x3 + x115); - x117 = (x2 + x116); - x118 = (x1 + x117); - out1[0] = x70; - out1[1] = x77; - out1[2] = x84; - out1[3] = x91; - out1[4] = x98; - out1[5] = x105; - out1[6] = x112; - out1[7] = x118; -} - -/* - * The function fiat_p318233_set_one returns the field element one in the Montgomery domain. - * - * Postconditions: - * eval (from_montgomery out1) mod m = 1 mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p318233_set_one(fiat_p318233_montgomery_domain_field_element out1) { - out1[0] = UINT16_C(0x6da); - out1[1] = 0x0; - out1[2] = UINT64_C(0xaa7aca36978c0000); - out1[3] = UINT64_C(0xab45e9a52195b079); - out1[4] = UINT64_C(0x215261649ca80146); - out1[5] = UINT64_C(0x37f58cab7c878058); - out1[6] = UINT64_C(0x336808a11dd16199); - out1[7] = UINT64_C(0x1a51e155b8b1a4); -} - -void fp_add(uint64_t* out, const uint64_t* a, const uint64_t* b) { - fiat_p318233_add(out, a, b); -} - -void fp_sub(uint64_t* out, const uint64_t* a, const uint64_t* b) { - fiat_p318233_sub(out, a, b); -} - -void fp_sqr(uint64_t* out, const uint64_t* a) { - fiat_p318233_square(out, a); -} - -void fp_mul(uint64_t* out, const uint64_t* a, const uint64_t* b) { - fiat_p318233_mul(out, a, b); -} - -void fp_tomont(uint64_t* out, const uint64_t* a) { - fiat_p318233_to_montgomery(out, a); -} - -void fp_frommont(uint64_t* out, const uint64_t* a) { - fiat_p318233_from_montgomery(out, a); -} - -void fp_mont_setone(uint64_t* out) { - fiat_p318233_set_one(out); -} \ No newline at end of file diff --git a/src/gf/ref/lvl5/include/fp.h b/src/gf/ref/lvl5/include/fp.h deleted file mode 100644 index 7fb11af..0000000 --- a/src/gf/ref/lvl5/include/fp.h +++ /dev/null @@ -1,76 +0,0 @@ -#ifndef FP_H -#define FP_H - -//////////////////////////////////////////////// NOTE: this is placed here for now -#include -#include -#include -#include -#include -#include -#include - -typedef digit_t fp_t[NWORDS_FIELD]; // Datatype for representing field elements - -void fp_set(digit_t* x, const digit_t val); -bool fp_is_equal(const digit_t* a, const digit_t* b); -bool fp_is_zero(const digit_t* a); -void fp_copy(digit_t* out, const digit_t* a); -digit_t mp_shiftr(digit_t* x, const unsigned int shift, const unsigned int nwords); -void mp_shiftl(digit_t* x, const unsigned int shift, const unsigned int nwords); -void fp_add(digit_t* out, const digit_t* a, const digit_t* b); -void fp_sub(digit_t* out, const digit_t* a, const digit_t* b); -void fp_neg(digit_t* out, const digit_t* a); -void fp_sqr(digit_t* out, const digit_t* a); -void fp_mul(digit_t* out, const digit_t* a, const digit_t* b); -void MUL(digit_t* out, const digit_t a, const digit_t b); -void fp_inv(digit_t* x); -bool fp_is_square(const digit_t* a); -void fp_sqrt(digit_t* a); -void fp_tomont(digit_t* out, const digit_t* a); -void fp_frommont(digit_t* out, const digit_t* a); -void fp_mont_setone(digit_t* out); - -/********************** Constant-time unsigned comparisons ***********************/ - -// The following functions return 1 (TRUE) if condition is true, 0 (FALSE) otherwise - -static inline unsigned int is_digit_nonzero_ct(digit_t x) -{ // Is x != 0? - return (unsigned int)((x | (0 - x)) >> (RADIX - 1)); -} - -static inline unsigned int is_digit_zero_ct(digit_t x) -{ // Is x = 0? - return (unsigned int)(1 ^ is_digit_nonzero_ct(x)); -} - -static inline unsigned int is_digit_lessthan_ct(digit_t x, digit_t y) -{ // Is x < y? - return (unsigned int)((x ^ ((x ^ y) | ((x - y) ^ y))) >> (RADIX - 1)); -} - -/********************** Platform-independent macros for digit-size operations **********************/ - -// Digit addition with carry -#define ADDC(sumOut, carryOut, addend1, addend2, carryIn) \ - { digit_t tempReg = (addend1) + (digit_t)(carryIn); \ - (sumOut) = (addend2) + tempReg; \ - (carryOut) = (is_digit_lessthan_ct(tempReg, (digit_t)(carryIn)) | is_digit_lessthan_ct((sumOut), tempReg)); } - -// Digit subtraction with borrow -#define SUBC(differenceOut, borrowOut, minuend, subtrahend, borrowIn) \ - { digit_t tempReg = (minuend) - (subtrahend); \ - unsigned int borrowReg = (is_digit_lessthan_ct((minuend), (subtrahend)) | ((borrowIn) & is_digit_zero_ct(tempReg))); \ - (differenceOut) = tempReg - (digit_t)(borrowIn); \ - (borrowOut) = borrowReg; } - -// Shift right with flexible datatype -#define SHIFTR(highIn, lowIn, shift, shiftOut, DigitSize) \ - (shiftOut) = ((lowIn) >> (shift)) ^ ((highIn) << (DigitSize - (shift))); - -// Digit shift left -#define SHIFTL(highIn, lowIn, shift, shiftOut, DigitSize) \ - (shiftOut) = ((highIn) << (shift)) ^ ((lowIn) >> (RADIX - (shift))); - -#endif \ No newline at end of file diff --git a/src/gf/ref/lvl5/include/fp2.h b/src/gf/ref/lvl5/include/fp2.h deleted file mode 100644 index 8015de0..0000000 --- a/src/gf/ref/lvl5/include/fp2.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef FP2_H -#define FP2_H - -#include "fp.h" - -// Structure for representing elements in GF(p^2) -typedef struct fp2_t { - fp_t re, im; -} fp2_t; - -void fp2_set(fp2_t* x, const digit_t val); -bool fp2_is_zero(const fp2_t* a); -bool fp2_is_equal(const fp2_t* a, const fp2_t* b); -void fp2_copy(fp2_t* x, const fp2_t* y); -fp2_t fp2_non_residue(); -void fp2_add(fp2_t* x, const fp2_t* y, const fp2_t* z); -void fp2_sub(fp2_t* x, const fp2_t* y, const fp2_t* z); -void fp2_neg(fp2_t* x, const fp2_t* y); -void fp2_mul(fp2_t* x, const fp2_t* y, const fp2_t* z); -void fp2_sqr(fp2_t* x, const fp2_t* y); -void fp2_inv(fp2_t* x); -bool fp2_is_square(const fp2_t* x); -void fp2_frob(fp2_t* x, const fp2_t* y); -void fp2_sqrt(fp2_t* x); -void fp2_tomont(fp2_t* x, const fp2_t* y); -void fp2_frommont(fp2_t* x, const fp2_t* y); -int fp2_cmp(fp2_t* x, fp2_t* y); - -#endif diff --git a/src/gf/ref/lvl5/test/CMakeLists.txt b/src/gf/ref/lvl5/test/CMakeLists.txt index 2f769a7..316e0a8 100644 --- a/src/gf/ref/lvl5/test/CMakeLists.txt +++ b/src/gf/ref/lvl5/test/CMakeLists.txt @@ -1,9 +1 @@ -add_executable(sqisign_test_gf_${SVARIANT_LOWER}_fp test_fp.c test_extras.c) -target_link_libraries(sqisign_test_gf_${SVARIANT_LOWER}_fp ${LIB_GF_${SVARIANT_UPPER}}) -target_include_directories(sqisign_test_gf_${SVARIANT_LOWER}_fp PRIVATE ../include ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC}) -add_test(sqisign_test_gf_${SVARIANT_LOWER}_fp sqisign_test_gf_${SVARIANT_LOWER}_fp test ${SQISIGN_TEST_REPS}) - -add_executable(sqisign_test_gf_${SVARIANT_LOWER}_fp2 test_fp2.c test_extras.c) -target_link_libraries(sqisign_test_gf_${SVARIANT_LOWER}_fp2 ${LIB_GF_${SVARIANT_UPPER}}) -target_include_directories(sqisign_test_gf_${SVARIANT_LOWER}_fp2 PRIVATE ../include ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC}) -add_test(sqisign_test_gf_${SVARIANT_LOWER}_fp2 sqisign_test_gf_${SVARIANT_LOWER}_fp2 test ${SQISIGN_TEST_REPS}) \ No newline at end of file +include(../../lvlx_test.cmake) diff --git a/src/gf/ref/lvl5/test/test_extras.c b/src/gf/ref/lvl5/test/test_extras.c deleted file mode 100644 index d0689c6..0000000 --- a/src/gf/ref/lvl5/test/test_extras.c +++ /dev/null @@ -1,74 +0,0 @@ -#include "test_extras.h" -#include - -// Global constants -extern const digit_t p[NWORDS_FIELD]; -extern const digit_t R2[NWORDS_FIELD]; - -#if 0 -int64_t cpucycles(void) -{ // Access system counter for benchmarking - unsigned int hi, lo; - - asm volatile ("rdtsc\n\t" : "=a" (lo), "=d"(hi)); - return ((int64_t)lo) | (((int64_t)hi) << 32); -} -#endif - - -int compare_words(digit_t* a, digit_t* b, unsigned int nwords) -{ // Comparing "nword" elements, a=b? : (1) a>b, (0) a=b, (-1) a= 0; i--) - { - if (a[i] > b[i]) return 1; - else if (a[i] < b[i]) return -1; - } - - return 0; -} - - -static void sub_test(digit_t* out, digit_t* a, digit_t* b, unsigned int nwords) -{ // Subtraction without borrow, out = a-b where a>b - // SECURITY NOTE: this function does not have constant-time execution. It is for TESTING ONLY. - unsigned int i; - digit_t res, carry, borrow = 0; - - for (i = 0; i < nwords; i++) - { - res = a[i] - b[i]; - carry = (a[i] < b[i]); - out[i] = res - borrow; - borrow = carry || (res < borrow); - } -} - - -void fprandom_test(digit_t* a) -{ // Generating a pseudo-random field element in [0, p-1] - // SECURITY NOTE: distribution is not fully uniform. TO BE USED FOR TESTING ONLY. - unsigned int i, diff = 256-254, nwords = NWORDS_FIELD; - unsigned char* string = NULL; - - string = (unsigned char*)a; - for (i = 0; i < sizeof(digit_t)*nwords; i++) { - *(string + i) = (unsigned char)rand(); // Obtain 256-bit number - } - a[nwords-1] &= (((digit_t)(-1) << diff) >> diff); - - while (compare_words((digit_t*)p, a, nwords) < 1) { // Force it to [0, modulus-1] - sub_test(a, a, (digit_t*)p, nwords); - } -} - - -void fp2random_test(fp2_t* a) -{ // Generating a pseudo-random element in GF(p^2) - // SECURITY NOTE: distribution is not fully uniform. TO BE USED FOR TESTING ONLY. - - fprandom_test(a->re); - fprandom_test(a->im); -} \ No newline at end of file diff --git a/src/gf/ref/lvl5/test/test_extras.h b/src/gf/ref/lvl5/test/test_extras.h deleted file mode 100644 index 3de524d..0000000 --- a/src/gf/ref/lvl5/test/test_extras.h +++ /dev/null @@ -1,25 +0,0 @@ - -#ifndef TEST_EXTRAS_H -#define TEST_EXTRAS_H - -#include -#include -#include "../include/fp.h" -#include "../include/fp2.h" - -#define PASSED 0 -#define FAILED 1 - -// Access system counter for benchmarking -//int64_t cpucycles(void); - -// Comparing "nword" elements, a=b? : (1) a!=b, (0) a=b -int compare_words(digit_t* a, digit_t* b, unsigned int nwords); - -// Generating a pseudo-random field element in [0, p-1] -void fprandom_test(digit_t* a); - -// Generating a pseudo-random element in GF(p^2) -void fp2random_test(fp2_t* a); - -#endif \ No newline at end of file diff --git a/src/gf/ref/lvl5/test/test_fp.c b/src/gf/ref/lvl5/test/test_fp.c deleted file mode 100644 index 71c1b9f..0000000 --- a/src/gf/ref/lvl5/test/test_fp.c +++ /dev/null @@ -1,296 +0,0 @@ -#include "test_extras.h" -#include -#include -#include -#include - -// Global constants -extern const digit_t p[NWORDS_FIELD]; - -// Benchmark and test parameters -static int BENCH_LOOPS = 100000; // Number of iterations per bench -static int TEST_LOOPS = 100000; // Number of iterations per test - - -bool fp_test() -{ // Tests for the field arithmetic - bool OK = true; - int n, passed; - fp_t a, b, c, d, e, f, ma, mb, mc, md, me, mf; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing field arithmetic over GF(p): \n\n"); - - // Field addition - passed = 1; - for (n=0; n\n"); - exit(1); - } - if (!strcmp(argv[1], "test")) { - TEST_LOOPS = atoi(argv[2]); - return !fp_test(); - } else if (!strcmp(argv[1], "bench")) { - BENCH_LOOPS = atoi(argv[2]); - return !fp_run(); - } else { - exit(1); - } -} \ No newline at end of file diff --git a/src/gf/ref/lvl5/test/test_fp2.c b/src/gf/ref/lvl5/test/test_fp2.c deleted file mode 100644 index 48b08c7..0000000 --- a/src/gf/ref/lvl5/test/test_fp2.c +++ /dev/null @@ -1,307 +0,0 @@ -#include "test_extras.h" -#include -#include -#include - -// Global constants -extern const digit_t p[NWORDS_FIELD]; - -// Benchmark and test parameters -static int BENCH_LOOPS = 100000; // Number of iterations per bench -static int TEST_LOOPS = 100000; // Number of iterations per test - - -bool fp2_test() -{ // Tests for the GF(p^2) arithmetic - bool OK = true; - int n, passed; - fp2_t a, b, c, d, e, f, ma, mb, mc, md, me, mf; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing arithmetic over GF(p^2): \n\n"); - - // Addition in GF(p^2) - passed = 1; - for (n=0; n\n"); - exit(1); - } - if (!strcmp(argv[1], "test")) { - TEST_LOOPS = atoi(argv[2]); - return !fp2_test(); - } else if (!strcmp(argv[1], "bench")) { - BENCH_LOOPS = atoi(argv[2]); - return !fp2_run(); - } else { - exit(1); - } -} \ No newline at end of file diff --git a/src/gf/ref/lvlx.cmake b/src/gf/ref/lvlx.cmake new file mode 100644 index 0000000..d27441b --- /dev/null +++ b/src/gf/ref/lvlx.cmake @@ -0,0 +1,13 @@ +set(SOURCE_FILES_GF_${SVARIANT_UPPER}_REF + ${SOURCE_FILES_GF_SPECIFIC} + ${LVLX_DIR}/fp.c + ${LVLX_DIR}/fp2.c +) + +add_library(${LIB_GF_${SVARIANT_UPPER}} STATIC ${SOURCE_FILES_GF_${SVARIANT_UPPER}_REF}) +target_include_directories(${LIB_GF_${SVARIANT_UPPER}} PRIVATE ${INC_COMMON} ${PROJECT_SOURCE_DIR}/src/precomp/ref/${SVARIANT_LOWER}/include ${INC_GF} ${INC_MP} ${INC_PUBLIC}) +target_compile_options(${LIB_GF_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) +target_link_libraries(${LIB_GF_${SVARIANT_UPPER}} ${LIB_MP}) +target_compile_definitions(${LIB_GF_${SVARIANT_UPPER}} PUBLIC SQISIGN_VARIANT=${SVARIANT_LOWER}) + +add_subdirectory(test) diff --git a/src/gf/ref/lvlx/fp.c b/src/gf/ref/lvlx/fp.c new file mode 100644 index 0000000..48e2937 --- /dev/null +++ b/src/gf/ref/lvlx/fp.c @@ -0,0 +1,15 @@ +#include + +/* + * If ctl == 0x00000000, then *d is set to a0 + * If ctl == 0xFFFFFFFF, then *d is set to a1 + * ctl MUST be either 0x00000000 or 0xFFFFFFFF. + */ +void +fp_select(fp_t *d, const fp_t *a0, const fp_t *a1, uint32_t ctl) +{ + digit_t cw = (int32_t)ctl; + for (unsigned int i = 0; i < NWORDS_FIELD; i++) { + (*d)[i] = (*a0)[i] ^ (cw & ((*a0)[i] ^ (*a1)[i])); + } +} diff --git a/src/gf/ref/lvlx/fp2.c b/src/gf/ref/lvlx/fp2.c new file mode 100644 index 0000000..a258952 --- /dev/null +++ b/src/gf/ref/lvlx/fp2.c @@ -0,0 +1,328 @@ +#include +#include +#include + +/* Arithmetic modulo X^2 + 1 */ + +void +fp2_set_small(fp2_t *x, const digit_t val) +{ + fp_set_small(&(x->re), val); + fp_set_zero(&(x->im)); +} + +void +fp2_mul_small(fp2_t *x, const fp2_t *y, uint32_t n) +{ + fp_mul_small(&x->re, &y->re, n); + fp_mul_small(&x->im, &y->im, n); +} + +void +fp2_set_one(fp2_t *x) +{ + fp_set_one(&(x->re)); + fp_set_zero(&(x->im)); +} + +void +fp2_set_zero(fp2_t *x) +{ + fp_set_zero(&(x->re)); + fp_set_zero(&(x->im)); +} + +// Is a GF(p^2) element zero? +// Returns 0xFF...FF (true) if a=0, 0 (false) otherwise +uint32_t +fp2_is_zero(const fp2_t *a) +{ + return fp_is_zero(&(a->re)) & fp_is_zero(&(a->im)); +} + +// Compare two GF(p^2) elements in constant time +// Returns 0xFF...FF (true) if a=b, 0 (false) otherwise +uint32_t +fp2_is_equal(const fp2_t *a, const fp2_t *b) +{ + return fp_is_equal(&(a->re), &(b->re)) & fp_is_equal(&(a->im), &(b->im)); +} + +// Is a GF(p^2) element one? +// Returns 0xFF...FF (true) if a=1, 0 (false) otherwise +uint32_t +fp2_is_one(const fp2_t *a) +{ + return fp_is_equal(&(a->re), &ONE) & fp_is_zero(&(a->im)); +} + +void +fp2_copy(fp2_t *x, const fp2_t *y) +{ + fp_copy(&(x->re), &(y->re)); + fp_copy(&(x->im), &(y->im)); +} + +void +fp2_add(fp2_t *x, const fp2_t *y, const fp2_t *z) +{ + fp_add(&(x->re), &(y->re), &(z->re)); + fp_add(&(x->im), &(y->im), &(z->im)); +} + +void +fp2_add_one(fp2_t *x, const fp2_t *y) +{ + fp_add(&x->re, &y->re, &ONE); + fp_copy(&x->im, &y->im); +} + +void +fp2_sub(fp2_t *x, const fp2_t *y, const fp2_t *z) +{ + fp_sub(&(x->re), &(y->re), &(z->re)); + fp_sub(&(x->im), &(y->im), &(z->im)); +} + +void +fp2_neg(fp2_t *x, const fp2_t *y) +{ + fp_neg(&(x->re), &(y->re)); + fp_neg(&(x->im), &(y->im)); +} + +void +fp2_mul(fp2_t *x, const fp2_t *y, const fp2_t *z) +{ + fp_t t0, t1; + + fp_add(&t0, &(y->re), &(y->im)); + fp_add(&t1, &(z->re), &(z->im)); + fp_mul(&t0, &t0, &t1); + fp_mul(&t1, &(y->im), &(z->im)); + fp_mul(&(x->re), &(y->re), &(z->re)); + fp_sub(&(x->im), &t0, &t1); + fp_sub(&(x->im), &(x->im), &(x->re)); + fp_sub(&(x->re), &(x->re), &t1); +} + +void +fp2_sqr(fp2_t *x, const fp2_t *y) +{ + fp_t sum, diff; + + fp_add(&sum, &(y->re), &(y->im)); + fp_sub(&diff, &(y->re), &(y->im)); + fp_mul(&(x->im), &(y->re), &(y->im)); + fp_add(&(x->im), &(x->im), &(x->im)); + fp_mul(&(x->re), &sum, &diff); +} + +void +fp2_inv(fp2_t *x) +{ + fp_t t0, t1; + + fp_sqr(&t0, &(x->re)); + fp_sqr(&t1, &(x->im)); + fp_add(&t0, &t0, &t1); + fp_inv(&t0); + fp_mul(&(x->re), &(x->re), &t0); + fp_mul(&(x->im), &(x->im), &t0); + fp_neg(&(x->im), &(x->im)); +} + +uint32_t +fp2_is_square(const fp2_t *x) +{ + fp_t t0, t1; + + fp_sqr(&t0, &(x->re)); + fp_sqr(&t1, &(x->im)); + fp_add(&t0, &t0, &t1); + + return fp_is_square(&t0); +} + +void +fp2_sqrt(fp2_t *a) +{ + fp_t x0, x1, t0, t1; + + /* From "Optimized One-Dimensional SQIsign Verification on Intel and + * Cortex-M4" by Aardal et al: https://eprint.iacr.org/2024/1563 */ + + // x0 = \delta = sqrt(a0^2 + a1^2). + fp_sqr(&x0, &(a->re)); + fp_sqr(&x1, &(a->im)); + fp_add(&x0, &x0, &x1); + fp_sqrt(&x0); + // If a1 = 0, there is a risk of \delta = -a0, which makes x0 = 0 below. + // In that case, we restore the value \delta = a0. + fp_select(&x0, &x0, &(a->re), fp_is_zero(&(a->im))); + // x0 = \delta + a0, t0 = 2 * x0. + fp_add(&x0, &x0, &(a->re)); + fp_add(&t0, &x0, &x0); + + // x1 = t0^(p-3)/4 + fp_exp3div4(&x1, &t0); + + // x0 = x0 * x1, x1 = x1 * a1, t1 = (2x0)^2. + fp_mul(&x0, &x0, &x1); + fp_mul(&x1, &x1, &(a->im)); + fp_add(&t1, &x0, &x0); + fp_sqr(&t1, &t1); + // If t1 = t0, return x0 + x1*i, otherwise x1 - x0*i. + fp_sub(&t0, &t0, &t1); + uint32_t f = fp_is_zero(&t0); + fp_neg(&t1, &x0); + fp_copy(&t0, &x1); + fp_select(&t0, &t0, &x0, f); + fp_select(&t1, &t1, &x1, f); + + // Check if t0 is zero + uint32_t t0_is_zero = fp_is_zero(&t0); + + // Check whether t0, t1 are odd + // Note: we encode to ensure canonical representation + uint8_t tmp_bytes[FP_ENCODED_BYTES]; + fp_encode(tmp_bytes, &t0); + uint32_t t0_is_odd = -((uint32_t)tmp_bytes[0] & 1); + fp_encode(tmp_bytes, &t1); + uint32_t t1_is_odd = -((uint32_t)tmp_bytes[0] & 1); + + // We negate the output if: + // t0 is odd, or + // t0 is zero and t1 is odd + uint32_t negate_output = t0_is_odd | (t0_is_zero & t1_is_odd); + fp_neg(&x0, &t0); + fp_select(&(a->re), &t0, &x0, negate_output); + fp_neg(&x0, &t1); + fp_select(&(a->im), &t1, &x0, negate_output); +} + +uint32_t +fp2_sqrt_verify(fp2_t *a) +{ + fp2_t t0, t1; + + fp2_copy(&t0, a); + fp2_sqrt(a); + fp2_sqr(&t1, a); + + return (fp2_is_equal(&t0, &t1)); +} + +void +fp2_half(fp2_t *x, const fp2_t *y) +{ + fp_half(&(x->re), &(y->re)); + fp_half(&(x->im), &(y->im)); +} + +void +fp2_batched_inv(fp2_t *x, int len) +{ + fp2_t t1[len], t2[len]; + fp2_t inverse; + + // x = x0,...,xn + // t1 = x0, x0*x1, ... ,x0 * x1 * ... * xn + fp2_copy(&t1[0], &x[0]); + for (int i = 1; i < len; i++) { + fp2_mul(&t1[i], &t1[i - 1], &x[i]); + } + + // inverse = 1/ (x0 * x1 * ... * xn) + fp2_copy(&inverse, &t1[len - 1]); + fp2_inv(&inverse); + + fp2_copy(&t2[0], &inverse); + // t2 = 1/ (x0 * x1 * ... * xn), 1/ (x0 * x1 * ... * x(n-1)) , ... , 1/xO + for (int i = 1; i < len; i++) { + fp2_mul(&t2[i], &t2[i - 1], &x[len - i]); + } + + fp2_copy(&x[0], &t2[len - 1]); + + for (int i = 1; i < len; i++) { + fp2_mul(&x[i], &t1[i - 1], &t2[len - i - 1]); + } +} + +// exponentiation using square and multiply +// Warning!! Not constant time! +void +fp2_pow_vartime(fp2_t *out, const fp2_t *x, const digit_t *exp, const int size) +{ + fp2_t acc; + digit_t bit; + + fp2_copy(&acc, x); + fp2_set_one(out); + + // Iterate over each word of exp + for (int j = 0; j < size; j++) { + // Iterate over each bit of the word + for (int i = 0; i < RADIX; i++) { + bit = (exp[j] >> i) & 1; + if (bit == 1) { + fp2_mul(out, out, &acc); + } + fp2_sqr(&acc, &acc); + } + } +} + +void +fp2_print(const char *name, const fp2_t *a) +{ + printf("%s0x", name); + + uint8_t buf[FP_ENCODED_BYTES]; + fp_encode(&buf, &a->re); // Encoding ensures canonical rep + for (int i = 0; i < FP_ENCODED_BYTES; i++) { + printf("%02x", buf[FP_ENCODED_BYTES - i - 1]); + } + + printf(" + i*0x"); + + fp_encode(&buf, &a->im); + for (int i = 0; i < FP_ENCODED_BYTES; i++) { + printf("%02x", buf[FP_ENCODED_BYTES - i - 1]); + } + printf("\n"); +} + +void +fp2_encode(void *dst, const fp2_t *a) +{ + uint8_t *buf = dst; + fp_encode(buf, &(a->re)); + fp_encode(buf + FP_ENCODED_BYTES, &(a->im)); +} + +uint32_t +fp2_decode(fp2_t *d, const void *src) +{ + const uint8_t *buf = src; + uint32_t re, im; + + re = fp_decode(&(d->re), buf); + im = fp_decode(&(d->im), buf + FP_ENCODED_BYTES); + return re & im; +} + +void +fp2_select(fp2_t *d, const fp2_t *a0, const fp2_t *a1, uint32_t ctl) +{ + fp_select(&(d->re), &(a0->re), &(a1->re), ctl); + fp_select(&(d->im), &(a0->im), &(a1->im), ctl); +} + +void +fp2_cswap(fp2_t *a, fp2_t *b, uint32_t ctl) +{ + fp_cswap(&(a->re), &(b->re), ctl); + fp_cswap(&(a->im), &(b->im), ctl); +} diff --git a/src/gf/ref/lvlx_test.cmake b/src/gf/ref/lvlx_test.cmake new file mode 100644 index 0000000..c27d24b --- /dev/null +++ b/src/gf/ref/lvlx_test.cmake @@ -0,0 +1,23 @@ +add_executable(sqisign_test_gf_${SVARIANT_LOWER}_fp ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/test_fp.c ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/test_utils.c) +target_link_libraries(sqisign_test_gf_${SVARIANT_LOWER}_fp ${LIB_GF_${SVARIANT_UPPER}} ${LIB_MP} sqisign_common_test) +target_include_directories(sqisign_test_gf_${SVARIANT_LOWER}_fp PRIVATE ${INC_GF} ${INC_COMMON} ${PROJECT_SOURCE_DIR}/src/precomp/ref/${SVARIANT_LOWER}/include ${INC_PUBLIC}) + +add_executable(sqisign_test_gf_${SVARIANT_LOWER}_fp2 ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/test_fp2.c ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/test_utils.c) +target_link_libraries(sqisign_test_gf_${SVARIANT_LOWER}_fp2 ${LIB_GF_${SVARIANT_UPPER}} ${LIB_MP} sqisign_common_test) +target_include_directories(sqisign_test_gf_${SVARIANT_LOWER}_fp2 PRIVATE ${INC_GF} ${INC_COMMON} ${PROJECT_SOURCE_DIR}/src/precomp/ref/${SVARIANT_LOWER}/include ${INC_PUBLIC}) + +add_test(sqisign_test_gf_${SVARIANT_LOWER}_fp sqisign_test_gf_${SVARIANT_LOWER}_fp test) +add_test(sqisign_test_gf_${SVARIANT_LOWER}_fp2 sqisign_test_gf_${SVARIANT_LOWER}_fp2 test) + +add_executable(sqisign_bench_gf_${SVARIANT_LOWER}_fp ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/bench_fp.c ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/test_utils.c) +target_link_libraries(sqisign_bench_gf_${SVARIANT_LOWER}_fp ${LIB_GF_${SVARIANT_UPPER}} ${LIB_MP} sqisign_common_sys) +target_include_directories(sqisign_bench_gf_${SVARIANT_LOWER}_fp PRIVATE ${INC_GF} ${INC_COMMON} ${PROJECT_SOURCE_DIR}/src/precomp/ref/${SVARIANT_LOWER}/include ${INC_PUBLIC}) + +add_executable(sqisign_bench_gf_${SVARIANT_LOWER}_fp2 ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/bench_fp2.c ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/test_utils.c) +target_link_libraries(sqisign_bench_gf_${SVARIANT_LOWER}_fp2 ${LIB_GF_${SVARIANT_UPPER}} ${LIB_MP} sqisign_common_sys) +target_include_directories(sqisign_bench_gf_${SVARIANT_LOWER}_fp2 PRIVATE ${INC_GF} ${INC_COMMON} ${PROJECT_SOURCE_DIR}/src/precomp/ref/${SVARIANT_LOWER}/include ${INC_PUBLIC}) + +set(BM_BINS ${BM_BINS} + sqisign_bench_gf_${SVARIANT_LOWER}_fp sqisign_bench_gf_${SVARIANT_LOWER}_fp2 + CACHE INTERNAL "List of benchmark executables") + diff --git a/src/intbig/CMakeLists.txt b/src/hd/CMakeLists.txt similarity index 100% rename from src/intbig/CMakeLists.txt rename to src/hd/CMakeLists.txt diff --git a/src/hd/ref/CMakeLists.txt b/src/hd/ref/CMakeLists.txt new file mode 100644 index 0000000..d0ba315 --- /dev/null +++ b/src/hd/ref/CMakeLists.txt @@ -0,0 +1,3 @@ +set(LVLX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lvlx) + +include(${SELECT_SQISIGN_VARIANT}) diff --git a/src/hd/ref/include/hd.h b/src/hd/ref/include/hd.h new file mode 100644 index 0000000..2b16e23 --- /dev/null +++ b/src/hd/ref/include/hd.h @@ -0,0 +1,435 @@ +/** @file + * + * @authors Antonin Leroux + * + * @brief The HD-isogenies algorithm required by the signature + * + */ + +#ifndef HD_H +#define HD_H + +#include +#include +#include + +/** @defgroup hd_module Abelian surfaces and their isogenies + * @{ + */ + +#define HD_extra_torsion 2 + +/** @defgroup hd_struct Data structures for dimension 2 + * @{ + */ + +/** @brief Type for couple point with XZ coordinates + * @typedef theta_couple_point_t + * + * @struct theta_couple_point + * + * Structure for the couple point on an elliptic product + * using XZ coordinates + */ +typedef struct theta_couple_point +{ + ec_point_t P1; + ec_point_t P2; +} theta_couple_point_t; + +/** @brief Type for three couple points T1, T2, T1-T2 with XZ coordinates + * @typedef theta_kernel_couple_points_t + * + * @struct theta_kernel_couple_points + * + * Structure for a triple of theta couple points T1, T2 and T1 - T2 + */ +typedef struct theta_kernel_couple_points +{ + theta_couple_point_t T1; + theta_couple_point_t T2; + theta_couple_point_t T1m2; +} theta_kernel_couple_points_t; + +/** @brief Type for couple point with XYZ coordinates + * @typedef theta_couple_jac_point_t + * + * @struct theta_couple_jac_point + * + * Structure for the couple point on an elliptic product + * using XYZ coordinates + */ +typedef struct theta_couple_jac_point +{ + jac_point_t P1; + jac_point_t P2; +} theta_couple_jac_point_t; + +/** @brief Type for couple curve * + * @typedef theta_couple_curve_t + * + * @struct theta_couple_curve + * + * the theta_couple_curve structure + */ +typedef struct theta_couple_curve +{ + ec_curve_t E1; + ec_curve_t E2; +} theta_couple_curve_t; + +/** @brief Type for a product E1 x E2 with corresponding bases + * @typedef theta_couple_curve_with_basis_t + * + * @struct theta_couple_curve_with_basis + * + * tType for a product E1 x E2 with corresponding bases Ei[2^n] + */ +typedef struct theta_couple_curve_with_basis +{ + ec_curve_t E1; + ec_curve_t E2; + ec_basis_t B1; + ec_basis_t B2; +} theta_couple_curve_with_basis_t; + +/** @brief Type for theta point * + * @typedef theta_point_t + * + * @struct theta_point + * + * the theta_point structure used + */ +typedef struct theta_point +{ + fp2_t x; + fp2_t y; + fp2_t z; + fp2_t t; +} theta_point_t; + +/** @brief Type for theta point with repeating components + * @typedef theta_point_compact_t + * + * @struct theta_point_compact + * + * the theta_point structure used for points with repeated components + */ +typedef struct theta_point_compact +{ + fp2_t x; + fp2_t y; +} theta_point_compact_t; + +/** @brief Type for theta structure * + * @typedef theta_structure_t + * + * @struct theta_structure + * + * the theta_structure structure used + */ +typedef struct theta_structure +{ + theta_point_t null_point; + bool precomputation; + + // Eight precomputed values used for doubling and + // (2,2)-isogenies. + fp2_t XYZ0; + fp2_t YZT0; + fp2_t XZT0; + fp2_t XYT0; + + fp2_t xyz0; + fp2_t yzt0; + fp2_t xzt0; + fp2_t xyt0; +} theta_structure_t; + +/** @brief A 2x2 matrix used for action by translation + * @typedef translation_matrix_t + * + * @struct translation_matrix + * + * Structure to hold 4 fp2_t elements representing a 2x2 matrix used when computing + * a compatible theta structure during gluing. + */ +typedef struct translation_matrix +{ + fp2_t g00; + fp2_t g01; + fp2_t g10; + fp2_t g11; +} translation_matrix_t; + +/** @brief A 4x4 matrix used for basis changes + * @typedef basis_change_matrix_t + * + * @struct basis_change_matrix + * + * Structure to hold 16 elements representing a 4x4 matrix used for changing + * the basis of a theta point. + */ +typedef struct basis_change_matrix +{ + fp2_t m[4][4]; +} basis_change_matrix_t; + +/** @brief Type for gluing (2,2) theta isogeny * + * @typedef theta_gluing_t + * + * @struct theta_gluing + * + * the theta_gluing structure + */ +typedef struct theta_gluing +{ + + theta_couple_curve_t domain; + theta_couple_jac_point_t xyK1_8; + theta_point_compact_t imageK1_8; + basis_change_matrix_t M; + theta_point_t precomputation; + theta_point_t codomain; + +} theta_gluing_t; + +/** @brief Type for standard (2,2) theta isogeny * + * @typedef theta_isogeny_t + * + * @struct theta_isogeny + * + * the theta_isogeny structure + */ +typedef struct theta_isogeny +{ + theta_point_t T1_8; + theta_point_t T2_8; + bool hadamard_bool_1; + bool hadamard_bool_2; + theta_structure_t domain; + theta_point_t precomputation; + theta_structure_t codomain; +} theta_isogeny_t; + +/** @brief Type for splitting isomorphism * + * @typedef theta_splitting_t + * + * @struct theta_splitting + * + * the theta_splitting structure + */ +typedef struct theta_splitting +{ + basis_change_matrix_t M; + theta_structure_t B; + +} theta_splitting_t; + +// end of hd_struct +/** + * @} + */ + +/** @defgroup hd_functions Functions for dimension 2 + * @{ + */ + +/** + * @brief Compute the double of the theta couple point in on the elliptic product E12 + * + * @param out Output: the theta_couple_point + * @param in the theta couple point in the elliptic product + * @param E1E2 an elliptic product + * in = (P1,P2) + * out = [2] (P1,P2) + * + */ +void double_couple_point(theta_couple_point_t *out, const theta_couple_point_t *in, const theta_couple_curve_t *E1E2); + +/** + * @brief Compute the iterated double of the theta couple point in on the elliptic product E12 + * + * @param out Output: the theta_couple_point + * @param n : the number of iteration + * @param E1E2 an elliptic product + * @param in the theta couple point in the elliptic product + * in = (P1,P2) + * out = [2^n] (P1,P2) + * + */ +void double_couple_point_iter(theta_couple_point_t *out, + unsigned n, + const theta_couple_point_t *in, + const theta_couple_curve_t *E1E2); + +/** + * @brief Compute the addition of two points in (X : Y : Z) coordinates on the elliptic product E12 + * + * @param out Output: the theta_couple_jac_point + * @param T1 the theta couple jac point in the elliptic product + * @param T2 the theta couple jac point in the elliptic product + * @param E1E2 an elliptic product + * in = (P1, P2), (Q1, Q2) + * out = (P1 + Q1, P2 + Q2) + * + **/ +void add_couple_jac_points(theta_couple_jac_point_t *out, + const theta_couple_jac_point_t *T1, + const theta_couple_jac_point_t *T2, + const theta_couple_curve_t *E1E2); + +/** + * @brief Compute the double of the theta couple point in on the elliptic product E12 + * + * @param out Output: the theta_couple_point + * @param in the theta couple point in the elliptic product + * @param E1E2 an elliptic product + * in = (P1,P2) + * out = [2] (P1,P2) + * + */ +void double_couple_jac_point(theta_couple_jac_point_t *out, + const theta_couple_jac_point_t *in, + const theta_couple_curve_t *E1E2); + +/** + * @brief Compute the iterated double of the theta couple jac point in on the elliptic product E12 + * + * @param out Output: the theta_couple_jac_point + * @param n : the number of iteration + * @param in the theta couple jac point in the elliptic product + * @param E1E2 an elliptic product + * in = (P1,P2) + * out = [2^n] (P1,P2) + * + */ +void double_couple_jac_point_iter(theta_couple_jac_point_t *out, + unsigned n, + const theta_couple_jac_point_t *in, + const theta_couple_curve_t *E1E2); + +/** + * @brief A forgetful function which returns (X : Z) points given a pair of (X : Y : Z) points + * + * @param P Output: the theta_couple_point + * @param xyP : the theta_couple_jac_point + **/ +void couple_jac_to_xz(theta_couple_point_t *P, const theta_couple_jac_point_t *xyP); + +/** + * @brief Compute a (2,2) isogeny chain in dimension 2 between elliptic + * products in the theta_model and evaluate at a list of points of the form + * (P1,0) or (0,P2). Returns 0 if the codomain fails to split (or there is + * an error during the computation) and 1 otherwise. + * + * @param n : the length of the isogeny chain + * @param E12 an elliptic curve product + * @param ker T1, T2 and T1-T2. couple points on E12[2^(n+2)] + * @param extra_torsion boolean indicating if we give the points in E12[2^n] or + * E12[2^(n+HD_extra_torsion)] + * @param E34 Output: the codomain curve + * @param P12 Input/Output: pointer to points to be pushed through the isogeny (in-place) + * @param numP: length of the list of points given in P12 (can be zero) + * @returns 1 on success 0 on failure + * + */ +int theta_chain_compute_and_eval(unsigned n, + /*const*/ theta_couple_curve_t *E12, + const theta_kernel_couple_points_t *ker, + bool extra_torsion, + theta_couple_curve_t *E34, + theta_couple_point_t *P12, + size_t numP); + +/** + * @brief Compute a (2,2) isogeny chain in dimension 2 between elliptic + * products in the theta_model and evaluate at a list of points of the form + * (P1,0) or (0,P2). Returns 0 if the codomain fails to split (or there is + * an error during the computation) and 1 otherwise. + * Compared to theta_chain_compute_and_eval, it does extra isotropy + * checks on the kernel. + * + * @param n : the length of the isogeny chain + * @param E12 an elliptic curve product + * @param ker T1, T2 and T1-T2. couple points on E12[2^(n+2)] + * @param extra_torsion boolean indicating if we give the points in E12[2^n] or + * E12[2^(n+HD_extra_torsion)] + * @param E34 Output: the codomain curve + * @param P12 Input/Output: pointer to points to be pushed through the isogeny (in-place) + * @param numP: length of the list of points given in P12 (can be zero) + * @returns 1 on success 0 on failure + * + */ +int theta_chain_compute_and_eval_verify(unsigned n, + /*const*/ theta_couple_curve_t *E12, + const theta_kernel_couple_points_t *ker, + bool extra_torsion, + theta_couple_curve_t *E34, + theta_couple_point_t *P12, + size_t numP); + +/** + * @brief Compute a (2,2) isogeny chain in dimension 2 between elliptic + * products in the theta_model and evaluate at a list of points of the form + * (P1,0) or (0,P2). Returns 0 if the codomain fails to split (or there is + * an error during the computation) and 1 otherwise. + * Compared to theta_chain_compute_and_eval, it selects a random Montgomery + * model of the codomain. + * + * @param n : the length of the isogeny chain + * @param E12 an elliptic curve product + * @param ker T1, T2 and T1-T2. couple points on E12[2^(n+2)] + * @param extra_torsion boolean indicating if we give the points in E12[2^n] or + * E12[2^(n+HD_extra_torsion)] + * @param E34 Output: the codomain curve + * @param P12 Input/Output: pointer to points to be pushed through the isogeny (in-place) + * @param numP: length of the list of points given in P12 (can be zero) + * @returns 1 on success, 0 on failure + * + */ +int theta_chain_compute_and_eval_randomized(unsigned n, + /*const*/ theta_couple_curve_t *E12, + const theta_kernel_couple_points_t *ker, + bool extra_torsion, + theta_couple_curve_t *E34, + theta_couple_point_t *P12, + size_t numP); + +/** + * @brief Given a bases B1 on E1 and B2 on E2 copies this to create a kernel + * on E1 x E2 as couple points T1, T2 and T1 - T2 + * + * @param ker Output: a kernel for dim_two_isogenies (T1, T2, T1-T2) + * @param B1 Input basis on E1 + * @param B2 Input basis on E2 + **/ +void copy_bases_to_kernel(theta_kernel_couple_points_t *ker, const ec_basis_t *B1, const ec_basis_t *B2); + +/** + * @brief Given a couple of points (P1, P2) on a couple of curves (E1, E2) + * this function tests if both points are of order exactly 2^t + * + * @param T: couple point (P1, P2) + * @param E: a couple of curves (E1, E2) + * @param t: an integer + * @returns 0xFFFFFFFF on success, 0 on failure + */ +static int +test_couple_point_order_twof(const theta_couple_point_t *T, const theta_couple_curve_t *E, int t) +{ + int check_P1 = test_point_order_twof(&T->P1, &E->E1, t); + int check_P2 = test_point_order_twof(&T->P2, &E->E2, t); + + return check_P1 & check_P2; +} + +// end of hd_functions +/** + * @} + */ +// end of hd_module +/** + * @} + */ +#endif diff --git a/src/hd/ref/lvl1/CMakeLists.txt b/src/hd/ref/lvl1/CMakeLists.txt new file mode 100644 index 0000000..c7637fa --- /dev/null +++ b/src/hd/ref/lvl1/CMakeLists.txt @@ -0,0 +1 @@ +include(../lvlx.cmake) diff --git a/src/hd/ref/lvl3/CMakeLists.txt b/src/hd/ref/lvl3/CMakeLists.txt new file mode 100644 index 0000000..c7637fa --- /dev/null +++ b/src/hd/ref/lvl3/CMakeLists.txt @@ -0,0 +1 @@ +include(../lvlx.cmake) diff --git a/src/hd/ref/lvl5/CMakeLists.txt b/src/hd/ref/lvl5/CMakeLists.txt new file mode 100644 index 0000000..c7637fa --- /dev/null +++ b/src/hd/ref/lvl5/CMakeLists.txt @@ -0,0 +1 @@ +include(../lvlx.cmake) diff --git a/src/hd/ref/lvlx.cmake b/src/hd/ref/lvlx.cmake new file mode 100644 index 0000000..4ef8704 --- /dev/null +++ b/src/hd/ref/lvlx.cmake @@ -0,0 +1,11 @@ +set(SOURCE_FILES_HD_GENERIC_REF + ${LVLX_DIR}/hd.c + ${LVLX_DIR}/theta_structure.c + ${LVLX_DIR}/theta_isogenies.c +) + +add_library(${LIB_HD_${SVARIANT_UPPER}} STATIC ${SOURCE_FILES_HD_GENERIC_REF}) +target_link_libraries(${LIB_HD_${SVARIANT_UPPER}} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}}) +target_include_directories(${LIB_HD_${SVARIANT_UPPER}} PRIVATE ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_HD}) +target_compile_options(${LIB_HD_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) +target_compile_definitions(${LIB_HD_${SVARIANT_UPPER}} PUBLIC SQISIGN_VARIANT=${SVARIANT_LOWER}) diff --git a/src/hd/ref/lvlx/hd.c b/src/hd/ref/lvlx/hd.c new file mode 100644 index 0000000..0424108 --- /dev/null +++ b/src/hd/ref/lvlx/hd.c @@ -0,0 +1,93 @@ +#include +#include + +void +double_couple_point(theta_couple_point_t *out, const theta_couple_point_t *in, const theta_couple_curve_t *E1E2) +{ + ec_dbl(&out->P1, &in->P1, &E1E2->E1); + ec_dbl(&out->P2, &in->P2, &E1E2->E2); +} + +void +double_couple_point_iter(theta_couple_point_t *out, + unsigned n, + const theta_couple_point_t *in, + const theta_couple_curve_t *E1E2) +{ + if (n == 0) { + memmove(out, in, sizeof(theta_couple_point_t)); + } else { + double_couple_point(out, in, E1E2); + for (unsigned i = 0; i < n - 1; i++) { + double_couple_point(out, out, E1E2); + } + } +} + +void +add_couple_jac_points(theta_couple_jac_point_t *out, + const theta_couple_jac_point_t *T1, + const theta_couple_jac_point_t *T2, + const theta_couple_curve_t *E1E2) +{ + ADD(&out->P1, &T1->P1, &T2->P1, &E1E2->E1); + ADD(&out->P2, &T1->P2, &T2->P2, &E1E2->E2); +} + +void +double_couple_jac_point(theta_couple_jac_point_t *out, + const theta_couple_jac_point_t *in, + const theta_couple_curve_t *E1E2) +{ + DBL(&out->P1, &in->P1, &E1E2->E1); + DBL(&out->P2, &in->P2, &E1E2->E2); +} + +void +double_couple_jac_point_iter(theta_couple_jac_point_t *out, + unsigned n, + const theta_couple_jac_point_t *in, + const theta_couple_curve_t *E1E2) +{ + if (n == 0) { + *out = *in; + } else if (n == 1) { + double_couple_jac_point(out, in, E1E2); + } else { + fp2_t a1, a2, t1, t2; + + jac_to_ws(&out->P1, &t1, &a1, &in->P1, &E1E2->E1); + jac_to_ws(&out->P2, &t2, &a2, &in->P2, &E1E2->E2); + + DBLW(&out->P1, &t1, &out->P1, &t1); + DBLW(&out->P2, &t2, &out->P2, &t2); + for (unsigned i = 0; i < n - 1; i++) { + DBLW(&out->P1, &t1, &out->P1, &t1); + DBLW(&out->P2, &t2, &out->P2, &t2); + } + + jac_from_ws(&out->P1, &out->P1, &a1, &E1E2->E1); + jac_from_ws(&out->P2, &out->P2, &a2, &E1E2->E2); + } +} + +void +couple_jac_to_xz(theta_couple_point_t *P, const theta_couple_jac_point_t *xyP) +{ + jac_to_xz(&P->P1, &xyP->P1); + jac_to_xz(&P->P2, &xyP->P2); +} + +void +copy_bases_to_kernel(theta_kernel_couple_points_t *ker, const ec_basis_t *B1, const ec_basis_t *B2) +{ + // Copy the basis on E1 to (P, _) on T1, T2 and T1 - T2 + copy_point(&ker->T1.P1, &B1->P); + copy_point(&ker->T2.P1, &B1->Q); + copy_point(&ker->T1m2.P1, &B1->PmQ); + + // Copy the basis on E2 to (_, P) on T1, T2 and T1 - T2 + copy_point(&ker->T1.P2, &B2->P); + copy_point(&ker->T2.P2, &B2->Q); + copy_point(&ker->T1m2.P2, &B2->PmQ); +} diff --git a/src/hd/ref/lvlx/theta_isogenies.c b/src/hd/ref/lvlx/theta_isogenies.c new file mode 100644 index 0000000..478a9ab --- /dev/null +++ b/src/hd/ref/lvlx/theta_isogenies.c @@ -0,0 +1,1283 @@ +#include "theta_isogenies.h" +#include +#include +#include +#include +#include + +// Select a base change matrix in constant time, with M1 a regular +// base change matrix and M2 a precomputed base change matrix +// If option = 0 then M <- M1, else if option = 0xFF...FF then M <- M2 +static inline void +select_base_change_matrix(basis_change_matrix_t *M, + const basis_change_matrix_t *M1, + const precomp_basis_change_matrix_t *M2, + const uint32_t option) +{ + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + fp2_select(&M->m[i][j], &M1->m[i][j], &FP2_CONSTANTS[M2->m[i][j]], option); +} + +// Set a regular base change matrix from a precomputed one +static inline void +set_base_change_matrix_from_precomp(basis_change_matrix_t *res, const precomp_basis_change_matrix_t *M) +{ + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + res->m[i][j] = FP2_CONSTANTS[M->m[i][j]]; +} + +static inline void +choose_index_theta_point(fp2_t *res, int ind, const theta_point_t *T) +{ + const fp2_t *src = NULL; + switch (ind % 4) { + case 0: + src = &T->x; + break; + case 1: + src = &T->y; + break; + case 2: + src = &T->z; + break; + case 3: + src = &T->t; + break; + default: + assert(0); + } + fp2_copy(res, src); +} + +// same as apply_isomorphism method but more efficient when the t component of P is zero. +static void +apply_isomorphism_general(theta_point_t *res, + const basis_change_matrix_t *M, + const theta_point_t *P, + const bool Pt_not_zero) +{ + fp2_t x1; + theta_point_t temp; + + fp2_mul(&temp.x, &P->x, &M->m[0][0]); + fp2_mul(&x1, &P->y, &M->m[0][1]); + fp2_add(&temp.x, &temp.x, &x1); + fp2_mul(&x1, &P->z, &M->m[0][2]); + fp2_add(&temp.x, &temp.x, &x1); + + fp2_mul(&temp.y, &P->x, &M->m[1][0]); + fp2_mul(&x1, &P->y, &M->m[1][1]); + fp2_add(&temp.y, &temp.y, &x1); + fp2_mul(&x1, &P->z, &M->m[1][2]); + fp2_add(&temp.y, &temp.y, &x1); + + fp2_mul(&temp.z, &P->x, &M->m[2][0]); + fp2_mul(&x1, &P->y, &M->m[2][1]); + fp2_add(&temp.z, &temp.z, &x1); + fp2_mul(&x1, &P->z, &M->m[2][2]); + fp2_add(&temp.z, &temp.z, &x1); + + fp2_mul(&temp.t, &P->x, &M->m[3][0]); + fp2_mul(&x1, &P->y, &M->m[3][1]); + fp2_add(&temp.t, &temp.t, &x1); + fp2_mul(&x1, &P->z, &M->m[3][2]); + fp2_add(&temp.t, &temp.t, &x1); + + if (Pt_not_zero) { + fp2_mul(&x1, &P->t, &M->m[0][3]); + fp2_add(&temp.x, &temp.x, &x1); + + fp2_mul(&x1, &P->t, &M->m[1][3]); + fp2_add(&temp.y, &temp.y, &x1); + + fp2_mul(&x1, &P->t, &M->m[2][3]); + fp2_add(&temp.z, &temp.z, &x1); + + fp2_mul(&x1, &P->t, &M->m[3][3]); + fp2_add(&temp.t, &temp.t, &x1); + } + + fp2_copy(&res->x, &temp.x); + fp2_copy(&res->y, &temp.y); + fp2_copy(&res->z, &temp.z); + fp2_copy(&res->t, &temp.t); +} + +static void +apply_isomorphism(theta_point_t *res, const basis_change_matrix_t *M, const theta_point_t *P) +{ + apply_isomorphism_general(res, M, P, true); +} + +// set res = M1 * M2 with matrix multiplication +static void +base_change_matrix_multiplication(basis_change_matrix_t *res, + const basis_change_matrix_t *M1, + const basis_change_matrix_t *M2) +{ + basis_change_matrix_t tmp; + fp2_t sum, m_ik, m_kj; + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + fp2_set_zero(&sum); + for (int k = 0; k < 4; k++) { + m_ik = M1->m[i][k]; + m_kj = M2->m[k][j]; + fp2_mul(&m_ik, &m_ik, &m_kj); + fp2_add(&sum, &sum, &m_ik); + } + tmp.m[i][j] = sum; + } + } + *res = tmp; +} + +// compute the theta_point corresponding to the couple of point T on an elliptic product +static void +base_change(theta_point_t *out, const theta_gluing_t *phi, const theta_couple_point_t *T) +{ + theta_point_t null_point; + + // null_point = (a : b : c : d) + // a = P1.x P2.x, b = P1.x P2.z, c = P1.z P2.x, d = P1.z P2.z + fp2_mul(&null_point.x, &T->P1.x, &T->P2.x); + fp2_mul(&null_point.y, &T->P1.x, &T->P2.z); + fp2_mul(&null_point.z, &T->P2.x, &T->P1.z); + fp2_mul(&null_point.t, &T->P1.z, &T->P2.z); + + // Apply the basis change + apply_isomorphism(out, &phi->M, &null_point); +} + +static void +action_by_translation_z_and_det(fp2_t *z_inv, fp2_t *det_inv, const ec_point_t *P4, const ec_point_t *P2) +{ + // Store the Z-coordinate to invert + fp2_copy(z_inv, &P4->z); + + // Then collect detij = xij wij - uij zij + fp2_t tmp; + fp2_mul(det_inv, &P4->x, &P2->z); + fp2_mul(&tmp, &P4->z, &P2->x); + fp2_sub(det_inv, det_inv, &tmp); +} + +static void +action_by_translation_compute_matrix(translation_matrix_t *G, + const ec_point_t *P4, + const ec_point_t *P2, + const fp2_t *z_inv, + const fp2_t *det_inv) +{ + fp2_t tmp; + + // Gi.g10 = uij xij /detij - xij/zij + fp2_mul(&tmp, &P4->x, z_inv); + fp2_mul(&G->g10, &P4->x, &P2->x); + fp2_mul(&G->g10, &G->g10, det_inv); + fp2_sub(&G->g10, &G->g10, &tmp); + + // Gi.g11 = uij zij * detij + fp2_mul(&G->g11, &P2->x, det_inv); + fp2_mul(&G->g11, &G->g11, &P4->z); + + // Gi.g00 = -Gi.g11 + fp2_neg(&G->g00, &G->g11); + + // Gi.g01 = - wij zij detij + fp2_mul(&G->g01, &P2->z, det_inv); + fp2_mul(&G->g01, &G->g01, &P4->z); + fp2_neg(&G->g01, &G->g01); +} + +// Returns 1 if the basis is as expected and 0 otherwise +// We only expect this to fail for malformed signatures, so +// do not require this to run in constant time. +static int +verify_two_torsion(const theta_couple_point_t *K1_2, const theta_couple_point_t *K2_2, const theta_couple_curve_t *E12) +{ + // First check if any point in K1_2 or K2_2 is zero, if they are then the points did not have + // order 8 when we started gluing + if (ec_is_zero(&K1_2->P1) | ec_is_zero(&K1_2->P2) | ec_is_zero(&K2_2->P1) | ec_is_zero(&K2_2->P2)) { + return 0; + } + + // Now ensure that P1, Q1 and P2, Q2 are independent. For points of order two this means + // that they're not the same + if (ec_is_equal(&K1_2->P1, &K2_2->P1) | ec_is_equal(&K1_2->P2, &K2_2->P2)) { + return 0; + } + + // Finally, double points to ensure all points have order exactly 0 + theta_couple_point_t O1, O2; + double_couple_point(&O1, K1_2, E12); + double_couple_point(&O2, K2_2, E12); + // If this check fails then the points had order 2*f for some f, and the kernel is malformed. + if (!(ec_is_zero(&O1.P1) & ec_is_zero(&O1.P2) & ec_is_zero(&O2.P1) & ec_is_zero(&O2.P2))) { + return 0; + } + + return 1; +} + +// Computes the action by translation for four points +// (P1, P2) and (Q1, Q2) on E1 x E2 simultaneously to +// save on inversions. +// Returns 0 if any of Pi or Qi does not have order 2 +// and 1 otherwise +static int +action_by_translation(translation_matrix_t *Gi, + const theta_couple_point_t *K1_4, + const theta_couple_point_t *K2_4, + const theta_couple_curve_t *E12) +{ + // Compute points of order 2 from Ki_4 + theta_couple_point_t K1_2, K2_2; + double_couple_point(&K1_2, K1_4, E12); + double_couple_point(&K2_2, K2_4, E12); + + if (!verify_two_torsion(&K1_2, &K2_2, E12)) { + return 0; + } + + // We need to invert four Z coordinates and + // four determinants which we do with batched + // inversion + fp2_t inverses[8]; + action_by_translation_z_and_det(&inverses[0], &inverses[4], &K1_4->P1, &K1_2.P1); + action_by_translation_z_and_det(&inverses[1], &inverses[5], &K1_4->P2, &K1_2.P2); + action_by_translation_z_and_det(&inverses[2], &inverses[6], &K2_4->P1, &K2_2.P1); + action_by_translation_z_and_det(&inverses[3], &inverses[7], &K2_4->P2, &K2_2.P2); + + fp2_batched_inv(inverses, 8); + if (fp2_is_zero(&inverses[0])) + return 0; // something was wrong with our input (which somehow was not caught by + // verify_two_torsion) + + action_by_translation_compute_matrix(&Gi[0], &K1_4->P1, &K1_2.P1, &inverses[0], &inverses[4]); + action_by_translation_compute_matrix(&Gi[1], &K1_4->P2, &K1_2.P2, &inverses[1], &inverses[5]); + action_by_translation_compute_matrix(&Gi[2], &K2_4->P1, &K2_2.P1, &inverses[2], &inverses[6]); + action_by_translation_compute_matrix(&Gi[3], &K2_4->P2, &K2_2.P2, &inverses[3], &inverses[7]); + + return 1; +} + +// Given the appropriate four torsion, computes the +// change of basis to compute the correct theta null +// point. +// Returns 0 if the order of K1_4 or K2_4 is not 4 +static int +gluing_change_of_basis(basis_change_matrix_t *M, + const theta_couple_point_t *K1_4, + const theta_couple_point_t *K2_4, + const theta_couple_curve_t *E12) +{ + // Compute the four 2x2 matrices for the action by translation + // on the four points: + translation_matrix_t Gi[4]; + if (!action_by_translation(Gi, K1_4, K2_4, E12)) + return 0; + + // Computation of the 4x4 matrix from Mij + // t001, t101 (resp t002, t102) first column of M11 * M21 (resp M12 * M22) + fp2_t t001, t101, t002, t102, tmp; + + fp2_mul(&t001, &Gi[0].g00, &Gi[2].g00); + fp2_mul(&tmp, &Gi[0].g01, &Gi[2].g10); + fp2_add(&t001, &t001, &tmp); + + fp2_mul(&t101, &Gi[0].g10, &Gi[2].g00); + fp2_mul(&tmp, &Gi[0].g11, &Gi[2].g10); + fp2_add(&t101, &t101, &tmp); + + fp2_mul(&t002, &Gi[1].g00, &Gi[3].g00); + fp2_mul(&tmp, &Gi[1].g01, &Gi[3].g10); + fp2_add(&t002, &t002, &tmp); + + fp2_mul(&t102, &Gi[1].g10, &Gi[3].g00); + fp2_mul(&tmp, &Gi[1].g11, &Gi[3].g10); + fp2_add(&t102, &t102, &tmp); + + // trace for the first row + fp2_set_one(&M->m[0][0]); + fp2_mul(&tmp, &t001, &t002); + fp2_add(&M->m[0][0], &M->m[0][0], &tmp); + fp2_mul(&tmp, &Gi[2].g00, &Gi[3].g00); + fp2_add(&M->m[0][0], &M->m[0][0], &tmp); + fp2_mul(&tmp, &Gi[0].g00, &Gi[1].g00); + fp2_add(&M->m[0][0], &M->m[0][0], &tmp); + + fp2_mul(&M->m[0][1], &t001, &t102); + fp2_mul(&tmp, &Gi[2].g00, &Gi[3].g10); + fp2_add(&M->m[0][1], &M->m[0][1], &tmp); + fp2_mul(&tmp, &Gi[0].g00, &Gi[1].g10); + fp2_add(&M->m[0][1], &M->m[0][1], &tmp); + + fp2_mul(&M->m[0][2], &t101, &t002); + fp2_mul(&tmp, &Gi[2].g10, &Gi[3].g00); + fp2_add(&M->m[0][2], &M->m[0][2], &tmp); + fp2_mul(&tmp, &Gi[0].g10, &Gi[1].g00); + fp2_add(&M->m[0][2], &M->m[0][2], &tmp); + + fp2_mul(&M->m[0][3], &t101, &t102); + fp2_mul(&tmp, &Gi[2].g10, &Gi[3].g10); + fp2_add(&M->m[0][3], &M->m[0][3], &tmp); + fp2_mul(&tmp, &Gi[0].g10, &Gi[1].g10); + fp2_add(&M->m[0][3], &M->m[0][3], &tmp); + + // Compute the action of (0,out.K2_4.P2) for the second row + fp2_mul(&tmp, &Gi[3].g01, &M->m[0][1]); + fp2_mul(&M->m[1][0], &Gi[3].g00, &M->m[0][0]); + fp2_add(&M->m[1][0], &M->m[1][0], &tmp); + + fp2_mul(&tmp, &Gi[3].g11, &M->m[0][1]); + fp2_mul(&M->m[1][1], &Gi[3].g10, &M->m[0][0]); + fp2_add(&M->m[1][1], &M->m[1][1], &tmp); + + fp2_mul(&tmp, &Gi[3].g01, &M->m[0][3]); + fp2_mul(&M->m[1][2], &Gi[3].g00, &M->m[0][2]); + fp2_add(&M->m[1][2], &M->m[1][2], &tmp); + + fp2_mul(&tmp, &Gi[3].g11, &M->m[0][3]); + fp2_mul(&M->m[1][3], &Gi[3].g10, &M->m[0][2]); + fp2_add(&M->m[1][3], &M->m[1][3], &tmp); + + // compute the action of (K1_4.P1,0) for the third row + fp2_mul(&tmp, &Gi[0].g01, &M->m[0][2]); + fp2_mul(&M->m[2][0], &Gi[0].g00, &M->m[0][0]); + fp2_add(&M->m[2][0], &M->m[2][0], &tmp); + + fp2_mul(&tmp, &Gi[0].g01, &M->m[0][3]); + fp2_mul(&M->m[2][1], &Gi[0].g00, &M->m[0][1]); + fp2_add(&M->m[2][1], &M->m[2][1], &tmp); + + fp2_mul(&tmp, &Gi[0].g11, &M->m[0][2]); + fp2_mul(&M->m[2][2], &Gi[0].g10, &M->m[0][0]); + fp2_add(&M->m[2][2], &M->m[2][2], &tmp); + + fp2_mul(&tmp, &Gi[0].g11, &M->m[0][3]); + fp2_mul(&M->m[2][3], &Gi[0].g10, &M->m[0][1]); + fp2_add(&M->m[2][3], &M->m[2][3], &tmp); + + // compute the action of (K1_4.P1,K2_4.P2) for the final row + fp2_mul(&tmp, &Gi[0].g01, &M->m[1][2]); + fp2_mul(&M->m[3][0], &Gi[0].g00, &M->m[1][0]); + fp2_add(&M->m[3][0], &M->m[3][0], &tmp); + + fp2_mul(&tmp, &Gi[0].g01, &M->m[1][3]); + fp2_mul(&M->m[3][1], &Gi[0].g00, &M->m[1][1]); + fp2_add(&M->m[3][1], &M->m[3][1], &tmp); + + fp2_mul(&tmp, &Gi[0].g11, &M->m[1][2]); + fp2_mul(&M->m[3][2], &Gi[0].g10, &M->m[1][0]); + fp2_add(&M->m[3][2], &M->m[3][2], &tmp); + + fp2_mul(&tmp, &Gi[0].g11, &M->m[1][3]); + fp2_mul(&M->m[3][3], &Gi[0].g10, &M->m[1][1]); + fp2_add(&M->m[3][3], &M->m[3][3], &tmp); + + return 1; +} + +/** + * @brief Compute the gluing isogeny from an elliptic product + * + * @param out Output: the theta_gluing + * @param K1_8 a couple point + * @param E12 an elliptic curve product + * @param K2_8 a point in E2[8] + * + * out : E1xE2 -> A of kernel [4](K1_8,K2_8) + * if the kernel supplied has the incorrect order, or gluing seems malformed, + * returns 0, otherwise returns 1. + */ +static int +gluing_compute(theta_gluing_t *out, + const theta_couple_curve_t *E12, + const theta_couple_jac_point_t *xyK1_8, + const theta_couple_jac_point_t *xyK2_8, + bool verify) +{ + // Ensure that we have been given the eight torsion +#ifndef NDEBUG + { + int check = test_jac_order_twof(&xyK1_8->P1, &E12->E1, 3); + if (!check) + debug_print("xyK1_8->P1 does not have order 8"); + check = test_jac_order_twof(&xyK2_8->P1, &E12->E1, 3); + if (!check) + debug_print("xyK2_8->P1 does not have order 8"); + check = test_jac_order_twof(&xyK1_8->P2, &E12->E2, 3); + if (!check) + debug_print("xyK2_8->P1 does not have order 8"); + check = test_jac_order_twof(&xyK2_8->P2, &E12->E2, 3); + if (!check) + debug_print("xyK2_8->P2 does not have order 8"); + } +#endif + + out->xyK1_8 = *xyK1_8; + out->domain = *E12; + + // Given points in E[8] x E[8] we need the four torsion below + theta_couple_jac_point_t xyK1_4, xyK2_4; + + double_couple_jac_point(&xyK1_4, xyK1_8, E12); + double_couple_jac_point(&xyK2_4, xyK2_8, E12); + + // Convert from (X:Y:Z) coordinates to (X:Z) + theta_couple_point_t K1_8, K2_8; + theta_couple_point_t K1_4, K2_4; + + couple_jac_to_xz(&K1_8, xyK1_8); + couple_jac_to_xz(&K2_8, xyK2_8); + couple_jac_to_xz(&K1_4, &xyK1_4); + couple_jac_to_xz(&K2_4, &xyK2_4); + + // Set the basis change matrix, if we have not been given a valid K[8] for this computation + // gluing_change_of_basis will detect this and return 0 + if (!gluing_change_of_basis(&out->M, &K1_4, &K2_4, E12)) { + debug_print("gluing failed as kernel does not have correct order"); + return 0; + } + + // apply the base change to the kernel + theta_point_t TT1, TT2; + + base_change(&TT1, out, &K1_8); + base_change(&TT2, out, &K2_8); + + // compute the codomain + to_squared_theta(&TT1, &TT1); + to_squared_theta(&TT2, &TT2); + + // If the kernel is well formed then TT1.t and TT2.t are zero + // if they are not, we exit early as the signature we are validating + // is probably malformed + if (!(fp2_is_zero(&TT1.t) & fp2_is_zero(&TT2.t))) { + debug_print("gluing failed TT1.t or TT2.t is not zero"); + return 0; + } + // Test our projective factors are non zero + if (fp2_is_zero(&TT1.x) | fp2_is_zero(&TT2.x) | fp2_is_zero(&TT1.y) | fp2_is_zero(&TT2.z) | fp2_is_zero(&TT1.z)) + return 0; // invalid input + + // Projective factor: Ax + fp2_mul(&out->codomain.x, &TT1.x, &TT2.x); + fp2_mul(&out->codomain.y, &TT1.y, &TT2.x); + fp2_mul(&out->codomain.z, &TT1.x, &TT2.z); + fp2_set_zero(&out->codomain.t); + // Projective factor: ABCxz + fp2_mul(&out->precomputation.x, &TT1.y, &TT2.z); + fp2_copy(&out->precomputation.y, &out->codomain.z); + fp2_copy(&out->precomputation.z, &out->codomain.y); + fp2_set_zero(&out->precomputation.t); + + // Compute the two components of phi(K1_8) = (x:x:y:y). + fp2_mul(&out->imageK1_8.x, &TT1.x, &out->precomputation.x); + fp2_mul(&out->imageK1_8.y, &TT1.z, &out->precomputation.z); + + // If K1_8 and K2_8 are our 8-torsion points, this ensures that the + // 4-torsion points [2]K1_8 and [2]K2_8 are isotropic. + if (verify) { + fp2_t t1, t2; + fp2_mul(&t1, &TT1.y, &out->precomputation.y); + if (!fp2_is_equal(&out->imageK1_8.x, &t1)) + return 0; + fp2_mul(&t1, &TT2.x, &out->precomputation.x); + fp2_mul(&t2, &TT2.z, &out->precomputation.z); + if (!fp2_is_equal(&t2, &t1)) + return 0; + } + + // compute the final codomain + hadamard(&out->codomain, &out->codomain); + return 1; +} + +// sub routine of the gluing eval +static void +gluing_eval_point(theta_point_t *image, const theta_couple_jac_point_t *P, const theta_gluing_t *phi) +{ + theta_point_t T1, T2; + add_components_t add_comp1, add_comp2; + + // Compute the cross addition components of P1+Q1 and P2+Q2 + jac_to_xz_add_components(&add_comp1, &P->P1, &phi->xyK1_8.P1, &phi->domain.E1); + jac_to_xz_add_components(&add_comp2, &P->P2, &phi->xyK1_8.P2, &phi->domain.E2); + + // Compute T1 and T2 derived from the cross addition components. + fp2_mul(&T1.x, &add_comp1.u, &add_comp2.u); // T1x = u1u2 + fp2_mul(&T2.t, &add_comp1.v, &add_comp2.v); // T2t = v1v2 + fp2_add(&T1.x, &T1.x, &T2.t); // T1x = u1u2 + v1v2 + fp2_mul(&T1.y, &add_comp1.u, &add_comp2.w); // T1y = u1w2 + fp2_mul(&T1.z, &add_comp1.w, &add_comp2.u); // T1z = w1u2 + fp2_mul(&T1.t, &add_comp1.w, &add_comp2.w); // T1t = w1w2 + fp2_add(&T2.x, &add_comp1.u, &add_comp1.v); // T2x = (u1+v1) + fp2_add(&T2.y, &add_comp2.u, &add_comp2.v); // T2y = (u2+v2) + fp2_mul(&T2.x, &T2.x, &T2.y); // T2x = (u1+v1)(u2+v2) + fp2_sub(&T2.x, &T2.x, &T1.x); // T1x = v1u2 + u1v2 + fp2_mul(&T2.y, &add_comp1.v, &add_comp2.w); // T2y = v1w2 + fp2_mul(&T2.z, &add_comp1.w, &add_comp2.v); // T2z = w1v2 + fp2_set_zero(&T2.t); // T2t = 0 + + // Apply the basis change and compute their respective square + // theta(P+Q) = M.T1 - M.T2 and theta(P-Q) = M.T1 + M.T2 + apply_isomorphism_general(&T1, &phi->M, &T1, true); + apply_isomorphism_general(&T2, &phi->M, &T2, false); + pointwise_square(&T1, &T1); + pointwise_square(&T2, &T2); + + // the difference between the two is therefore theta(P+Q)theta(P-Q) + // whose hadamard transform is then the product of the dual + // theta_points of phi(P) and phi(Q). + fp2_sub(&T1.x, &T1.x, &T2.x); + fp2_sub(&T1.y, &T1.y, &T2.y); + fp2_sub(&T1.z, &T1.z, &T2.z); + fp2_sub(&T1.t, &T1.t, &T2.t); + hadamard(&T1, &T1); + + // Compute (x, y, z, t) + // As imageK1_8 = (x:x:y:y), its inverse is (y:y:x:x). + fp2_mul(&image->x, &T1.x, &phi->imageK1_8.y); + fp2_mul(&image->y, &T1.y, &phi->imageK1_8.y); + fp2_mul(&image->z, &T1.z, &phi->imageK1_8.x); + fp2_mul(&image->t, &T1.t, &phi->imageK1_8.x); + + hadamard(image, image); +} + +// Same as gluing_eval_point but in the very special case where we already know that the point will +// have a zero coordinate at the place where the zero coordinate of the dual_theta_nullpoint would +// have made the computation difficult +static int +gluing_eval_point_special_case(theta_point_t *image, const theta_couple_point_t *P, const theta_gluing_t *phi) +{ + theta_point_t T; + + // Apply the basis change + base_change(&T, phi, P); + + // Apply the to_squared_theta transform + to_squared_theta(&T, &T); + + // This coordinate should always be 0 in a gluing because D=0. + // If this is not the case, something went very wrong, so reject + if (!fp2_is_zero(&T.t)) + return 0; + + // Compute (x, y, z, t) + fp2_mul(&image->x, &T.x, &phi->precomputation.x); + fp2_mul(&image->y, &T.y, &phi->precomputation.y); + fp2_mul(&image->z, &T.z, &phi->precomputation.z); + fp2_set_zero(&image->t); + + hadamard(image, image); + return 1; +} + +/** + * @brief Evaluate a gluing isogeny from an elliptic product on a basis + * + * @param image1 Output: the theta_point of the image of the first couple of points + * @param image2 Output : the theta point of the image of the second couple of points + * @param xyT1: A pair of points (X : Y : Z) on E1E2 to glue using phi + * @param xyT2: A pair of points (X : Y : Z) on E1E2 to glue using phi + * @param phi : a gluing isogeny E1 x E2 -> A + * + **/ +static void +gluing_eval_basis(theta_point_t *image1, + theta_point_t *image2, + const theta_couple_jac_point_t *xyT1, + const theta_couple_jac_point_t *xyT2, + const theta_gluing_t *phi) +{ + gluing_eval_point(image1, xyT1, phi); + gluing_eval_point(image2, xyT2, phi); +} + +/** + * @brief Compute a (2,2) isogeny in dimension 2 in the theta_model + * + * @param out Output: the theta_isogeny + * @param A a theta null point for the domain + * @param T1_8 a point in A[8] + * @param T2_8 a point in A[8] + * @param hadamard_bool_1 a boolean used for the last two steps of the chain + * @param hadamard_bool_2 a boolean used for the last two steps of the chain + * + * out : A -> B of kernel [4](T1_8,T2_8) + * hadamard_bool_1 controls if the domain is in standard or dual coordinates + * hadamard_bool_2 controls if the codomain is in standard or dual coordinates + * verify: add extra sanity check to ensure our 8-torsion points are coherent with the isogeny + * + */ +static int +theta_isogeny_compute(theta_isogeny_t *out, + const theta_structure_t *A, + const theta_point_t *T1_8, + const theta_point_t *T2_8, + bool hadamard_bool_1, + bool hadamard_bool_2, + bool verify) +{ + out->hadamard_bool_1 = hadamard_bool_1; + out->hadamard_bool_2 = hadamard_bool_2; + out->domain = *A; + out->T1_8 = *T1_8; + out->T2_8 = *T2_8; + out->codomain.precomputation = false; + + theta_point_t TT1, TT2; + + if (hadamard_bool_1) { + hadamard(&TT1, T1_8); + to_squared_theta(&TT1, &TT1); + hadamard(&TT2, T2_8); + to_squared_theta(&TT2, &TT2); + } else { + to_squared_theta(&TT1, T1_8); + to_squared_theta(&TT2, T2_8); + } + + fp2_t t1, t2; + + // Test that our projective factor ABCDxzw is non zero, where + // TT1=(Ax, Bx, Cy, Dy), TT2=(Az, Bw, Cz, Dw) + // But ABCDxzw=0 can only happen if we had an unexpected splitting in + // the isogeny chain. + // In either case reject + // (this is not strictly necessary, we could just return (0:0:0:0)) + if (fp2_is_zero(&TT2.x) | fp2_is_zero(&TT2.y) | fp2_is_zero(&TT2.z) | fp2_is_zero(&TT2.t) | fp2_is_zero(&TT1.x) | + fp2_is_zero(&TT1.y)) + return 0; + + fp2_mul(&t1, &TT1.x, &TT2.y); + fp2_mul(&t2, &TT1.y, &TT2.x); + fp2_mul(&out->codomain.null_point.x, &TT2.x, &t1); + fp2_mul(&out->codomain.null_point.y, &TT2.y, &t2); + fp2_mul(&out->codomain.null_point.z, &TT2.z, &t1); + fp2_mul(&out->codomain.null_point.t, &TT2.t, &t2); + fp2_t t3; + fp2_mul(&t3, &TT2.z, &TT2.t); + fp2_mul(&out->precomputation.x, &t3, &TT1.y); + fp2_mul(&out->precomputation.y, &t3, &TT1.x); + fp2_copy(&out->precomputation.z, &out->codomain.null_point.t); + fp2_copy(&out->precomputation.t, &out->codomain.null_point.z); + + // If T1_8 and T2_8 are our 8-torsion points, this ensures that the + // 4-torsion points 2T1_8 and 2T2_8 are isotropic. + if (verify) { + fp2_mul(&t1, &TT1.x, &out->precomputation.x); + fp2_mul(&t2, &TT1.y, &out->precomputation.y); + if (!fp2_is_equal(&t1, &t2)) + return 0; + fp2_mul(&t1, &TT1.z, &out->precomputation.z); + fp2_mul(&t2, &TT1.t, &out->precomputation.t); + if (!fp2_is_equal(&t1, &t2)) + return 0; + fp2_mul(&t1, &TT2.x, &out->precomputation.x); + fp2_mul(&t2, &TT2.z, &out->precomputation.z); + if (!fp2_is_equal(&t1, &t2)) + return 0; + fp2_mul(&t1, &TT2.y, &out->precomputation.y); + fp2_mul(&t2, &TT2.t, &out->precomputation.t); + if (!fp2_is_equal(&t1, &t2)) + return 0; + } + + if (hadamard_bool_2) { + hadamard(&out->codomain.null_point, &out->codomain.null_point); + } + return 1; +} + +/** + * @brief Compute a (2,2) isogeny when only the 4 torsion above the kernel is known and not the 8 + * torsion + * + * @param out Output: the theta_isogeny + * @param A a theta null point for the domain + * @param T1_4 a point in A[4] + * @param T2_4 a point in A[4] + * @param hadamard_bool_1 a boolean + * @param hadamard_bool_2 a boolean + * + * out : A -> B of kernel [2](T1_4,T2_4) + * hadamard_bool_1 controls if the domain is in standard or dual coordinates + * hadamard_bool_2 controls if the codomain is in standard or dual coordinates + * + */ +static void +theta_isogeny_compute_4(theta_isogeny_t *out, + const theta_structure_t *A, + const theta_point_t *T1_4, + const theta_point_t *T2_4, + bool hadamard_bool_1, + bool hadamard_bool_2) +{ + out->hadamard_bool_1 = hadamard_bool_1; + out->hadamard_bool_2 = hadamard_bool_2; + out->domain = *A; + out->T1_8 = *T1_4; + out->T2_8 = *T2_4; + out->codomain.precomputation = false; + + theta_point_t TT1, TT2; + // we will compute: + // TT1 = (xAB, _ , xCD, _) + // TT2 = (AA,BB,CC,DD) + + // fp2_t xA_inv,zA_inv,tB_inv; + + if (hadamard_bool_1) { + hadamard(&TT1, T1_4); + to_squared_theta(&TT1, &TT1); + + hadamard(&TT2, &A->null_point); + to_squared_theta(&TT2, &TT2); + } else { + to_squared_theta(&TT1, T1_4); + to_squared_theta(&TT2, &A->null_point); + } + + fp2_t sqaabb, sqaacc; + fp2_mul(&sqaabb, &TT2.x, &TT2.y); + fp2_mul(&sqaacc, &TT2.x, &TT2.z); + // No need to check the square roots, only used for signing. + // sqaabb = sqrt(AA*BB) + fp2_sqrt(&sqaabb); + // sqaacc = sqrt(AA*CC) + fp2_sqrt(&sqaacc); + + // we compute out->codomain.null_point = (xAB * sqaacc * AA, xAB *sqaabb *sqaacc, xCD*sqaabb * + // AA) out->precomputation = (xAB * BB * CC *DD , sqaabb * CC * DD * xAB , sqaacc * BB* DD * xAB + // , xCD * sqaabb *sqaacc * BB) + + fp2_mul(&out->codomain.null_point.y, &sqaabb, &sqaacc); + fp2_mul(&out->precomputation.t, &out->codomain.null_point.y, &TT1.z); + fp2_mul(&out->codomain.null_point.y, &out->codomain.null_point.y, + &TT1.x); // done for out->codomain.null_point.y + + fp2_mul(&out->codomain.null_point.t, &TT1.z, &sqaabb); + fp2_mul(&out->codomain.null_point.t, &out->codomain.null_point.t, + &TT2.x); // done for out->codomain.null_point.t + + fp2_mul(&out->codomain.null_point.x, &TT1.x, &TT2.x); + fp2_mul(&out->codomain.null_point.z, &out->codomain.null_point.x, + &TT2.z); // done for out->codomain.null_point.z + fp2_mul(&out->codomain.null_point.x, &out->codomain.null_point.x, + &sqaacc); // done for out->codomain.null_point.x + + fp2_mul(&out->precomputation.x, &TT1.x, &TT2.t); + fp2_mul(&out->precomputation.z, &out->precomputation.x, &TT2.y); + fp2_mul(&out->precomputation.x, &out->precomputation.x, &TT2.z); + fp2_mul(&out->precomputation.y, &out->precomputation.x, &sqaabb); // done for out->precomputation.y + fp2_mul(&out->precomputation.x, &out->precomputation.x, &TT2.y); // done for out->precomputation.x + fp2_mul(&out->precomputation.z, &out->precomputation.z, &sqaacc); // done for out->precomputation.z + fp2_mul(&out->precomputation.t, &out->precomputation.t, &TT2.y); // done for out->precomputation.t + + if (hadamard_bool_2) { + hadamard(&out->codomain.null_point, &out->codomain.null_point); + } +} + +/** + * @brief Compute a (2,2) isogeny when only the kernel is known and not the 8 or 4 torsion above + * + * @param out Output: the theta_isogeny + * @param A a theta null point for the domain + * @param T1_2 a point in A[2] + * @param T2_2 a point in A[2] + * @param hadamard_bool_1 a boolean + * @param boo2 a boolean + * + * out : A -> B of kernel (T1_2,T2_2) + * hadamard_bool_1 controls if the domain is in standard or dual coordinates + * hadamard_bool_2 controls if the codomain is in standard or dual coordinates + * + */ +static void +theta_isogeny_compute_2(theta_isogeny_t *out, + const theta_structure_t *A, + const theta_point_t *T1_2, + const theta_point_t *T2_2, + bool hadamard_bool_1, + bool hadamard_bool_2) +{ + out->hadamard_bool_1 = hadamard_bool_1; + out->hadamard_bool_2 = hadamard_bool_2; + out->domain = *A; + out->T1_8 = *T1_2; + out->T2_8 = *T2_2; + out->codomain.precomputation = false; + + theta_point_t TT2; + // we will compute: + // TT2 = (AA,BB,CC,DD) + + if (hadamard_bool_1) { + hadamard(&TT2, &A->null_point); + to_squared_theta(&TT2, &TT2); + } else { + to_squared_theta(&TT2, &A->null_point); + } + + // we compute out->codomain.null_point = (AA,sqaabb, sqaacc, sqaadd) + // out->precomputation = ( BB * CC *DD , sqaabb * CC * DD , sqaacc * BB* DD , sqaadd * BB * CC) + fp2_copy(&out->codomain.null_point.x, &TT2.x); + fp2_mul(&out->codomain.null_point.y, &TT2.x, &TT2.y); + fp2_mul(&out->codomain.null_point.z, &TT2.x, &TT2.z); + fp2_mul(&out->codomain.null_point.t, &TT2.x, &TT2.t); + // No need to check the square roots, only used for signing. + fp2_sqrt(&out->codomain.null_point.y); + fp2_sqrt(&out->codomain.null_point.z); + fp2_sqrt(&out->codomain.null_point.t); + + fp2_mul(&out->precomputation.x, &TT2.z, &TT2.t); + fp2_mul(&out->precomputation.y, + &out->precomputation.x, + &out->codomain.null_point.y); // done for out->precomputation.y + fp2_mul(&out->precomputation.x, &out->precomputation.x, &TT2.y); // done for out->precomputation.x + fp2_mul(&out->precomputation.z, &TT2.t, &out->codomain.null_point.z); + fp2_mul(&out->precomputation.z, &out->precomputation.z, &TT2.y); // done for out->precomputation.z + fp2_mul(&out->precomputation.t, &TT2.z, &out->codomain.null_point.t); + fp2_mul(&out->precomputation.t, &out->precomputation.t, &TT2.y); // done for out->precomputation.t + + if (hadamard_bool_2) { + hadamard(&out->codomain.null_point, &out->codomain.null_point); + } +} + +static void +theta_isogeny_eval(theta_point_t *out, const theta_isogeny_t *phi, const theta_point_t *P) +{ + if (phi->hadamard_bool_1) { + hadamard(out, P); + to_squared_theta(out, out); + } else { + to_squared_theta(out, P); + } + fp2_mul(&out->x, &out->x, &phi->precomputation.x); + fp2_mul(&out->y, &out->y, &phi->precomputation.y); + fp2_mul(&out->z, &out->z, &phi->precomputation.z); + fp2_mul(&out->t, &out->t, &phi->precomputation.t); + + if (phi->hadamard_bool_2) { + hadamard(out, out); + } +} + +#if defined(ENABLE_SIGN) +// Sample a random secret index in [0, 5] to select one of the 6 normalisation +// matrices for the normalisation of the output of the (2,2)-chain during +// splitting +static unsigned char +sample_random_index(void) +{ + // To avoid bias in reduction we should only consider integers smaller + // than 2^32 which are a multiple of 6, so we only reduce bytes with a + // value in [0, 4294967292-1]. + // We have 4294967292/2^32 = ~99.9999999% chance that the first try is "good". + unsigned char seed_arr[4]; + uint32_t seed; + + do { + randombytes(seed_arr, 4); + seed = (seed_arr[0] | (seed_arr[1] << 8) | (seed_arr[2] << 16) | (seed_arr[3] << 24)); + } while (seed >= 4294967292U); + + uint32_t secret_index = seed - (((uint64_t)seed * 2863311531U) >> 34) * 6; + assert(secret_index == seed % 6); // ensure the constant time trick above works + return (unsigned char)secret_index; +} +#endif + +static bool +splitting_compute(theta_splitting_t *out, const theta_structure_t *A, int zero_index, bool randomize) + +{ + // init + uint32_t ctl; + uint32_t count = 0; + fp2_t U_cst, t1, t2; + + memset(&out->M, 0, sizeof(basis_change_matrix_t)); + + // enumerate through all indices + for (int i = 0; i < 10; i++) { + fp2_set_zero(&U_cst); + for (int t = 0; t < 4; t++) { + // Iterate through the null point + choose_index_theta_point(&t2, t, &A->null_point); + choose_index_theta_point(&t1, t ^ EVEN_INDEX[i][1], &A->null_point); + + // Compute t1 * t2 + fp2_mul(&t1, &t1, &t2); + // If CHI_EVAL(i,t) is +1 we want ctl to be 0 and + // If CHI_EVAL(i,t) is -1 we want ctl to be 0xFF..FF + ctl = (uint32_t)(CHI_EVAL[EVEN_INDEX[i][0]][t] >> 1); + assert(ctl == 0 || ctl == 0xffffffff); + + fp2_neg(&t2, &t1); + fp2_select(&t1, &t1, &t2, ctl); + + // Then we compute U_cst ± (t1 * t2) + fp2_add(&U_cst, &U_cst, &t1); + } + + // If U_cst is 0 then update the splitting matrix + ctl = fp2_is_zero(&U_cst); + count -= ctl; + select_base_change_matrix(&out->M, &out->M, &SPLITTING_TRANSFORMS[i], ctl); + if (zero_index != -1 && i == zero_index && + !ctl) { // extra checks if we know exactly where the 0 index should be + return 0; + } + } + +#if defined(ENABLE_SIGN) + // Pick a random normalization matrix + if (randomize) { + unsigned char secret_index = sample_random_index(); + basis_change_matrix_t Mrandom; + + set_base_change_matrix_from_precomp(&Mrandom, &NORMALIZATION_TRANSFORMS[0]); + + // Use a constant time selection to pick the index we want + for (unsigned char i = 1; i < 6; i++) { + // When i == secret_index, mask == 0 and 0xFF..FF otherwise + int32_t mask = i - secret_index; + mask = (mask | -mask) >> 31; + select_base_change_matrix(&Mrandom, &Mrandom, &NORMALIZATION_TRANSFORMS[i], ~mask); + } + base_change_matrix_multiplication(&out->M, &Mrandom, &out->M); + } +#else + assert(!randomize); +#endif + + // apply the isomorphism to ensure the null point is compatible with splitting + apply_isomorphism(&out->B.null_point, &out->M, &A->null_point); + + // splitting was successful only if exactly one zero was identified + return count == 1; +} + +static int +theta_product_structure_to_elliptic_product(theta_couple_curve_t *E12, theta_structure_t *A) +{ + fp2_t xx, yy; + + // This should be true from our computations in splitting_compute + // but still check this for sanity + if (!is_product_theta_point(&A->null_point)) + return 0; + + ec_curve_init(&(E12->E1)); + ec_curve_init(&(E12->E2)); + + // A valid elliptic theta null point has no zero coordinate + if (fp2_is_zero(&A->null_point.x) | fp2_is_zero(&A->null_point.y) | fp2_is_zero(&A->null_point.z)) + return 0; + + // xx = x², yy = y² + fp2_sqr(&xx, &A->null_point.x); + fp2_sqr(&yy, &A->null_point.y); + // xx = x^4, yy = y^4 + fp2_sqr(&xx, &xx); + fp2_sqr(&yy, &yy); + + // A2 = -2(x^4+y^4)/(x^4-y^4) + fp2_add(&E12->E2.A, &xx, &yy); + fp2_sub(&E12->E2.C, &xx, &yy); + fp2_add(&E12->E2.A, &E12->E2.A, &E12->E2.A); + fp2_neg(&E12->E2.A, &E12->E2.A); + + // same with x,z + fp2_sqr(&xx, &A->null_point.x); + fp2_sqr(&yy, &A->null_point.z); + fp2_sqr(&xx, &xx); + fp2_sqr(&yy, &yy); + + // A1 = -2(x^4+z^4)/(x^4-z^4) + fp2_add(&E12->E1.A, &xx, &yy); + fp2_sub(&E12->E1.C, &xx, &yy); + fp2_add(&E12->E1.A, &E12->E1.A, &E12->E1.A); + fp2_neg(&E12->E1.A, &E12->E1.A); + + if (fp2_is_zero(&E12->E1.C) | fp2_is_zero(&E12->E2.C)) + return 0; + + return 1; +} + +static int +theta_point_to_montgomery_point(theta_couple_point_t *P12, const theta_point_t *P, const theta_structure_t *A) +{ + fp2_t temp; + const fp2_t *x, *z; + + if (!is_product_theta_point(P)) + return 0; + + x = &P->x; + z = &P->y; + if (fp2_is_zero(x) & fp2_is_zero(z)) { + x = &P->z; + z = &P->t; + } + if (fp2_is_zero(x) & fp2_is_zero(z)) { + return 0; // at this point P=(0:0:0:0) so is invalid + } + // P2.X = A.null_point.y * P.x + A.null_point.x * P.y + // P2.Z = - A.null_point.y * P.x + A.null_point.x * P.y + fp2_mul(&P12->P2.x, &A->null_point.y, x); + fp2_mul(&temp, &A->null_point.x, z); + fp2_sub(&P12->P2.z, &temp, &P12->P2.x); + fp2_add(&P12->P2.x, &P12->P2.x, &temp); + + x = &P->x; + z = &P->z; + if (fp2_is_zero(x) & fp2_is_zero(z)) { + x = &P->y; + z = &P->t; + } + // P1.X = A.null_point.z * P.x + A.null_point.x * P.z + // P1.Z = -A.null_point.z * P.x + A.null_point.x * P.z + fp2_mul(&P12->P1.x, &A->null_point.z, x); + fp2_mul(&temp, &A->null_point.x, z); + fp2_sub(&P12->P1.z, &temp, &P12->P1.x); + fp2_add(&P12->P1.x, &P12->P1.x, &temp); + return 1; +} + +static int +_theta_chain_compute_impl(unsigned n, + theta_couple_curve_t *E12, + const theta_kernel_couple_points_t *ker, + bool extra_torsion, + theta_couple_curve_t *E34, + theta_couple_point_t *P12, + size_t numP, + bool verify, + bool randomize) +{ + theta_structure_t theta; + + // lift the basis + theta_couple_jac_point_t xyT1, xyT2; + + ec_basis_t bas1 = { .P = ker->T1.P1, .Q = ker->T2.P1, .PmQ = ker->T1m2.P1 }; + ec_basis_t bas2 = { .P = ker->T1.P2, .Q = ker->T2.P2, .PmQ = ker->T1m2.P2 }; + if (!lift_basis(&xyT1.P1, &xyT2.P1, &bas1, &E12->E1)) + return 0; + if (!lift_basis(&xyT1.P2, &xyT2.P2, &bas2, &E12->E2)) + return 0; + + const unsigned extra = HD_extra_torsion * extra_torsion; + +#ifndef NDEBUG + assert(extra == 0 || extra == 2); // only cases implemented + if (!test_point_order_twof(&bas2.P, &E12->E2, n + extra)) + debug_print("bas2.P does not have correct order"); + + if (!test_jac_order_twof(&xyT2.P2, &E12->E2, n + extra)) + debug_print("xyT2.P2 does not have correct order"); +#endif + + theta_point_t pts[numP ? numP : 1]; + + int space = 1; + for (unsigned i = 1; i < n; i *= 2) + ++space; + + uint16_t todo[space]; + todo[0] = n - 2 + extra; + + int current = 0; + + // kernel points for the gluing isogeny + theta_couple_jac_point_t jacQ1[space], jacQ2[space]; + jacQ1[0] = xyT1; + jacQ2[0] = xyT2; + while (todo[current] != 1) { + assert(todo[current] >= 2); + ++current; + assert(current < space); + // the gluing isogeny is quite a bit more expensive than the others, + // so we adjust the usual splitting rule here a little bit: towards + // the end of the doubling chain it will be cheaper to recompute the + // doublings after evaluation than to push the intermediate points. + const unsigned num_dbls = todo[current - 1] >= 16 ? todo[current - 1] / 2 : todo[current - 1] - 1; + assert(num_dbls && num_dbls < todo[current - 1]); + double_couple_jac_point_iter(&jacQ1[current], num_dbls, &jacQ1[current - 1], E12); + double_couple_jac_point_iter(&jacQ2[current], num_dbls, &jacQ2[current - 1], E12); + todo[current] = todo[current - 1] - num_dbls; + } + + // kernel points for the remaining isogeny steps + theta_point_t thetaQ1[space], thetaQ2[space]; + + // the gluing step + theta_gluing_t first_step; + { + assert(todo[current] == 1); + + // compute the gluing isogeny + if (!gluing_compute(&first_step, E12, &jacQ1[current], &jacQ2[current], verify)) + return 0; + + // evaluate + for (unsigned j = 0; j < numP; ++j) { + assert(ec_is_zero(&P12[j].P1) || ec_is_zero(&P12[j].P2)); + if (!gluing_eval_point_special_case(&pts[j], &P12[j], &first_step)) + return 0; + } + + // push kernel points through gluing isogeny + for (int j = 0; j < current; ++j) { + gluing_eval_basis(&thetaQ1[j], &thetaQ2[j], &jacQ1[j], &jacQ2[j], &first_step); + --todo[j]; + } + + --current; + } + + // set-up the theta_structure for the first codomain + theta.null_point = first_step.codomain; + theta.precomputation = 0; + theta_precomputation(&theta); + + theta_isogeny_t step; + + // and now we do the remaining steps + for (unsigned i = 1; current >= 0 && todo[current]; ++i) { + assert(current < space); + while (todo[current] != 1) { + assert(todo[current] >= 2); + ++current; + assert(current < space); + const unsigned num_dbls = todo[current - 1] / 2; + assert(num_dbls && num_dbls < todo[current - 1]); + double_iter(&thetaQ1[current], &theta, &thetaQ1[current - 1], num_dbls); + double_iter(&thetaQ2[current], &theta, &thetaQ2[current - 1], num_dbls); + todo[current] = todo[current - 1] - num_dbls; + } + + // computing the next step + int ret; + if (i == n - 2) // penultimate step + ret = theta_isogeny_compute(&step, &theta, &thetaQ1[current], &thetaQ2[current], 0, 0, verify); + else if (i == n - 1) // ultimate step + ret = theta_isogeny_compute(&step, &theta, &thetaQ1[current], &thetaQ2[current], 1, 0, false); + else + ret = theta_isogeny_compute(&step, &theta, &thetaQ1[current], &thetaQ2[current], 0, 1, verify); + if (!ret) + return 0; + + for (unsigned j = 0; j < numP; ++j) + theta_isogeny_eval(&pts[j], &step, &pts[j]); + + // updating the codomain + theta = step.codomain; + + // pushing the kernel + assert(todo[current] == 1); + for (int j = 0; j < current; ++j) { + theta_isogeny_eval(&thetaQ1[j], &step, &thetaQ1[j]); + theta_isogeny_eval(&thetaQ2[j], &step, &thetaQ2[j]); + assert(todo[j]); + --todo[j]; + } + + --current; + } + + assert(current == -1); + + if (!extra_torsion) { + if (n >= 3) { + // in the last step we've skipped pushing the kernel since current was == 0, let's do it now + theta_isogeny_eval(&thetaQ1[0], &step, &thetaQ1[0]); + theta_isogeny_eval(&thetaQ2[0], &step, &thetaQ2[0]); + } + + // penultimate step + theta_isogeny_compute_4(&step, &theta, &thetaQ1[0], &thetaQ2[0], 0, 0); + for (unsigned j = 0; j < numP; ++j) + theta_isogeny_eval(&pts[j], &step, &pts[j]); + theta = step.codomain; + theta_isogeny_eval(&thetaQ1[0], &step, &thetaQ1[0]); + theta_isogeny_eval(&thetaQ2[0], &step, &thetaQ2[0]); + + // ultimate step + theta_isogeny_compute_2(&step, &theta, &thetaQ1[0], &thetaQ2[0], 1, 0); + for (unsigned j = 0; j < numP; ++j) + theta_isogeny_eval(&pts[j], &step, &pts[j]); + theta = step.codomain; + } + + // final splitting step + theta_splitting_t last_step; + + bool is_split = splitting_compute(&last_step, &theta, extra_torsion ? 8 : -1, randomize); + + if (!is_split) { + debug_print("kernel did not generate an isogeny between elliptic products"); + return 0; + } + + if (!theta_product_structure_to_elliptic_product(E34, &last_step.B)) + return 0; + + // evaluate + for (size_t j = 0; j < numP; ++j) { + apply_isomorphism(&pts[j], &last_step.M, &pts[j]); + if (!theta_point_to_montgomery_point(&P12[j], &pts[j], &last_step.B)) + return 0; + } + + return 1; +} + +int +theta_chain_compute_and_eval(unsigned n, + /*const*/ theta_couple_curve_t *E12, + const theta_kernel_couple_points_t *ker, + bool extra_torsion, + theta_couple_curve_t *E34, + theta_couple_point_t *P12, + size_t numP) +{ + return _theta_chain_compute_impl(n, E12, ker, extra_torsion, E34, P12, numP, false, false); +} + +// Like theta_chain_compute_and_eval, adding extra verification checks; +// used in the signature verification +int +theta_chain_compute_and_eval_verify(unsigned n, + /*const*/ theta_couple_curve_t *E12, + const theta_kernel_couple_points_t *ker, + bool extra_torsion, + theta_couple_curve_t *E34, + theta_couple_point_t *P12, + size_t numP) +{ + return _theta_chain_compute_impl(n, E12, ker, extra_torsion, E34, P12, numP, true, false); +} + +int +theta_chain_compute_and_eval_randomized(unsigned n, + /*const*/ theta_couple_curve_t *E12, + const theta_kernel_couple_points_t *ker, + bool extra_torsion, + theta_couple_curve_t *E34, + theta_couple_point_t *P12, + size_t numP) +{ + return _theta_chain_compute_impl(n, E12, ker, extra_torsion, E34, P12, numP, false, true); +} diff --git a/src/hd/ref/lvlx/theta_isogenies.h b/src/hd/ref/lvlx/theta_isogenies.h new file mode 100644 index 0000000..d151811 --- /dev/null +++ b/src/hd/ref/lvlx/theta_isogenies.h @@ -0,0 +1,18 @@ +/** @file + * + * @authors Antonin Leroux + * + * @brief the theta isogeny header + */ + +#ifndef THETA_ISOGENY_H +#define THETA_ISOGENY_H + +#include +#include +#include +#include "theta_structure.h" +#include +#include + +#endif diff --git a/src/hd/ref/lvlx/theta_structure.c b/src/hd/ref/lvlx/theta_structure.c new file mode 100644 index 0000000..ce97ac6 --- /dev/null +++ b/src/hd/ref/lvlx/theta_structure.c @@ -0,0 +1,78 @@ +#include "theta_structure.h" +#include + +void +theta_precomputation(theta_structure_t *A) +{ + + if (A->precomputation) { + return; + } + + theta_point_t A_dual; + to_squared_theta(&A_dual, &A->null_point); + + fp2_t t1, t2; + fp2_mul(&t1, &A_dual.x, &A_dual.y); + fp2_mul(&t2, &A_dual.z, &A_dual.t); + fp2_mul(&A->XYZ0, &t1, &A_dual.z); + fp2_mul(&A->XYT0, &t1, &A_dual.t); + fp2_mul(&A->YZT0, &t2, &A_dual.y); + fp2_mul(&A->XZT0, &t2, &A_dual.x); + + fp2_mul(&t1, &A->null_point.x, &A->null_point.y); + fp2_mul(&t2, &A->null_point.z, &A->null_point.t); + fp2_mul(&A->xyz0, &t1, &A->null_point.z); + fp2_mul(&A->xyt0, &t1, &A->null_point.t); + fp2_mul(&A->yzt0, &t2, &A->null_point.y); + fp2_mul(&A->xzt0, &t2, &A->null_point.x); + + A->precomputation = true; +} + +void +double_point(theta_point_t *out, theta_structure_t *A, const theta_point_t *in) +{ + to_squared_theta(out, in); + fp2_sqr(&out->x, &out->x); + fp2_sqr(&out->y, &out->y); + fp2_sqr(&out->z, &out->z); + fp2_sqr(&out->t, &out->t); + + if (!A->precomputation) { + theta_precomputation(A); + } + fp2_mul(&out->x, &out->x, &A->YZT0); + fp2_mul(&out->y, &out->y, &A->XZT0); + fp2_mul(&out->z, &out->z, &A->XYT0); + fp2_mul(&out->t, &out->t, &A->XYZ0); + + hadamard(out, out); + + fp2_mul(&out->x, &out->x, &A->yzt0); + fp2_mul(&out->y, &out->y, &A->xzt0); + fp2_mul(&out->z, &out->z, &A->xyt0); + fp2_mul(&out->t, &out->t, &A->xyz0); +} + +void +double_iter(theta_point_t *out, theta_structure_t *A, const theta_point_t *in, int exp) +{ + if (exp == 0) { + *out = *in; + } else { + double_point(out, A, in); + for (int i = 1; i < exp; i++) { + double_point(out, A, out); + } + } +} + +uint32_t +is_product_theta_point(const theta_point_t *P) +{ + fp2_t t1, t2; + fp2_mul(&t1, &P->x, &P->t); + fp2_mul(&t2, &P->y, &P->z); + return fp2_is_equal(&t1, &t2); +} diff --git a/src/hd/ref/lvlx/theta_structure.h b/src/hd/ref/lvlx/theta_structure.h new file mode 100644 index 0000000..fc630b7 --- /dev/null +++ b/src/hd/ref/lvlx/theta_structure.h @@ -0,0 +1,135 @@ +/** @file + * + * @authors Antonin Leroux + * + * @brief the theta structure header + */ + +#ifndef THETA_STRUCTURE_H +#define THETA_STRUCTURE_H + +#include +#include +#include + +/** @internal + * @ingroup hd_module + * @defgroup hd_theta Functions for theta structures + * @{ + */ + +/** + * @brief Perform the hadamard transform on a theta point + * + * @param out Output: the theta_point + * @param in a theta point* + * in = (x,y,z,t) + * out = (x+y+z+t, x-y+z-t, x+y-z-t, x-y-z+t) + * + */ +static inline void +hadamard(theta_point_t *out, const theta_point_t *in) +{ + fp2_t t1, t2, t3, t4; + + // t1 = x + y + fp2_add(&t1, &in->x, &in->y); + // t2 = x - y + fp2_sub(&t2, &in->x, &in->y); + // t3 = z + t + fp2_add(&t3, &in->z, &in->t); + // t4 = z - t + fp2_sub(&t4, &in->z, &in->t); + + fp2_add(&out->x, &t1, &t3); + fp2_add(&out->y, &t2, &t4); + fp2_sub(&out->z, &t1, &t3); + fp2_sub(&out->t, &t2, &t4); +} + +/** + * @brief Square the coordinates of a theta point + * @param out Output: the theta_point + * @param in a theta point* + * in = (x,y,z,t) + * out = (x^2, y^2, z^2, t^2) + * + */ +static inline void +pointwise_square(theta_point_t *out, const theta_point_t *in) +{ + fp2_sqr(&out->x, &in->x); + fp2_sqr(&out->y, &in->y); + fp2_sqr(&out->z, &in->z); + fp2_sqr(&out->t, &in->t); +} + +/** + * @brief Square the coordinates and then perform the hadamard transform + * + * @param out Output: the theta_point + * @param in a theta point* + * in = (x,y,z,t) + * out = (x^2+y^2+z^2+t^2, x^2-y^2+z^2-t^2, x^2+y^2-z^2-t^2, x^2-y^2-z^2+t^2) + * + */ +static inline void +to_squared_theta(theta_point_t *out, const theta_point_t *in) +{ + pointwise_square(out, in); + hadamard(out, out); +} + +/** + * @brief Perform the theta structure precomputation + * + * @param A Output: the theta_structure + * + * if A.null_point = (x,y,z,t) + * if (xx,yy,zz,tt) = to_squared_theta(A.null_point) + * Computes y0,z0,t0,Y0,Z0,T0 = x/y,x/z,x/t,XX/YY,XX/ZZ,XX/TT + * + */ +void theta_precomputation(theta_structure_t *A); + +/** + * @brief Compute the double of the theta point in on the theta struc A + * + * @param out Output: the theta_point + * @param A a theta structure + * @param in a theta point in the theta structure A + * in = (x,y,z,t) + * out = [2] (x,y,z,t) + * /!\ assumes that no coordinates is zero and that the precomputation of A has been done + * + */ +void double_point(theta_point_t *out, theta_structure_t *A, const theta_point_t *in); + +/** + * @brief Compute the iterated double of the theta point in on the theta struc A + * + * @param out Output: the theta_point + * @param A a theta structure + * @param in a theta point in the theta structure A + * @param exp the exponent + * in = (x,y,z,t) + * out = [2^2] (x,y,z,t) + * /!\ assumes that no coordinates is zero and that the precomputation of A has been done + * + */ +void double_iter(theta_point_t *out, theta_structure_t *A, const theta_point_t *in, int exp); + +/* + * @brief Check if a theta point is a product theta point + * + * @param P a theta point + * @return 0xFFFFFFFF if true, zero otherwise + */ +uint32_t is_product_theta_point(const theta_point_t *P); + +// end hd_theta +/** + * @} + */ + +#endif diff --git a/src/id2iso/ref/CMakeLists.txt b/src/id2iso/ref/CMakeLists.txt index 1f66b59..d0ba315 100644 --- a/src/id2iso/ref/CMakeLists.txt +++ b/src/id2iso/ref/CMakeLists.txt @@ -1,3 +1,3 @@ -set(ID2ISOX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/id2isox) +set(LVLX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lvlx) include(${SELECT_SQISIGN_VARIANT}) diff --git a/src/id2iso/ref/id2isox/id2iso.c b/src/id2iso/ref/id2isox/id2iso.c deleted file mode 100644 index 5b60322..0000000 --- a/src/id2iso/ref/id2isox/id2iso.c +++ /dev/null @@ -1,1096 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -static __inline__ uint64_t rdtsc(void) -{ - return (uint64_t) cpucycles(); -} - -static int test_point_order_twof(ec_point_t *P, ec_curve_t *E) { - ec_point_t test = *P; - assert(!fp2_is_zero(&test.z)); - for (int i = 0;i=0; i--) - printf("%016" PRIx64, b.re[i]); - printf(" + i*0x"); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.im[i]); - printf("\n"); -} - -static void curve_print(char *name, ec_curve_t E){ - fp2_t a; - fp2_copy(&a, &E.C); - fp2_inv(&a); - fp2_mul(&a, &a, &E.A); - fp2_print(name, a); -} - -static void point_print(char *name, ec_point_t P){ - fp2_t a; - if(fp2_is_zero(&P.z)){ - printf("%s = INF\n", name); - } - else{ - fp2_copy(&a, &P.z); - fp2_inv(&a); - fp2_mul(&a, &a, &P.x); - fp2_print(name, a); - } -} -//XXX - -void id2iso_long_two_isog_init(id2iso_long_two_isog_t *isog, const size_t length) -{ - isog->length = length; - isog->chain = malloc(length * sizeof(*isog->chain)); -} - -void id2iso_long_two_isog_finalize(id2iso_long_two_isog_t *isog) -{ - free(isog->chain); -} - -void id2iso_compressed_long_two_isog_init(id2iso_compressed_long_two_isog_t *zip, const size_t length) -{ - zip->length = length; - zip->zip_chain = malloc(length * sizeof(*zip->zip_chain)); - for (size_t i = 0; i < length; ++i) - ibz_init(&zip->zip_chain[i]); -} - -void id2iso_compressed_long_two_isog_finalize(id2iso_compressed_long_two_isog_t *zip) -{ - for (size_t i = 0; i < zip->length; ++i) - ibz_finalize(&zip->zip_chain[i]); - free(zip->zip_chain); -} - -/** - * @brief evaluation of an endomorphism beta of norm dividing T² on the 2^f torsion - * - * @param action_matrix Output : the matrix of the action - * @param ideal_beta_L : a left O0-ideal for the left part of the endomorphism - * @param ideal_beta_R : a left 00-ideal for the right part of the endomorphism - * @param trace : the trace of the endomorphism mod 2^f - * @param Bpoo : the quaternion algebra - * @param domain : the starting curve - * @param basis_minus : odd torsion basis - * @param basis_plus : odd torsion basis - * @param two_basis : a basis of the 2^f torsion - * @param ibz_two_f : the value of 2^f - * @returns a bit indicating if the computation succeeded - * the matrix given in output correspond to the action of the endomorphism beta on the 2^f torsion - * the trace is used to lift the sign ambiguity - */ -void endomorphism_evaluation(ibz_mat_2x2_t *action_matrix, const quat_left_ideal_t *ideal_beta_L, const quat_left_ideal_t *ideal_beta_R, const ibz_t *trace, const quat_alg_t *Bpoo, const ec_curve_t *domain, const ec_basis_t *basis_minus, const ec_basis_t *basis_plus, const ec_basis_t *two_basis,const ibz_t *ibz_two_f) { - - // var dec - ec_isog_odd_t isog_beta_L,isog_beta_R; - ec_basis_t basis_R;ec_point_t basis_L[2]; - ec_curve_t codomain_L,codomain_R; - ec_isom_t isom; - digit_t x1[NWORDS_ORDER] = {0},x2[NWORDS_ORDER] = {0},x3[NWORDS_ORDER] = {0},x4[NWORDS_ORDER] = {0}; - ibz_t i1,i2,i3,i4,trace_temp; - ibz_init(&i1);ibz_init(&i2);ibz_init(&i3);ibz_init(&i4);ibz_init(&trace_temp); - - // translate the ideals ideal_beta_R[ind] and ideal_beta_L[ind] to isogenies - id2iso_ideal_to_isogeny_odd(&isog_beta_L,domain,basis_plus,basis_minus,ideal_beta_L); - id2iso_ideal_to_isogeny_odd(&isog_beta_R,domain,basis_plus,basis_minus,ideal_beta_R); - - // init of points and basis - basis_R = *two_basis; - basis_L[0] = two_basis->P; - basis_L[1] = two_basis->Q; - - codomain_R = *domain; - codomain_L = *domain; - assert(test_point_order_twof(&basis_R.Q,&codomain_R)); - assert(test_point_order_twof(&basis_R.PmQ,&codomain_R)); - assert(test_point_order_twof(&basis_R.P,&codomain_R)); - assert(test_point_order_twof(&basis_L[0],&codomain_L)); - - // evaluation of the 2^f basis - // evaluating the right isogeny on the full basis - ec_eval_odd_basis(&codomain_R,&isog_beta_R,&basis_R,1); - - // evaluation the left isogeny on the incomplete basis - ec_eval_odd(&codomain_L,&isog_beta_L,basis_L,2); - - // checking that the points still have the correct order - assert(test_point_order_twof(&basis_L[0],&codomain_L)); - - // for debug, we check that the two codomains are isomorphic - #ifndef NDEBUG - fp2_t j_R,j_L; - ec_j_inv(&j_R, &codomain_R); - ec_j_inv(&j_L, &codomain_L); - assert(fp2_is_equal(&j_R,&j_L)); - #endif - - // computing the isomorphism - ec_isomorphism(&isom, &codomain_L, &codomain_R); - - // applying the isomorphism - ec_iso_eval(&basis_L[0],&isom); - ec_iso_eval(&basis_L[1],&isom); - - assert(test_point_order_twof(&basis_L[1],&codomain_R)); - assert(test_point_order_twof(&basis_R.P,&codomain_R)); - assert(test_point_order_twof(&basis_R.Q,&codomain_R)); - assert(test_point_order_twof(&basis_R.PmQ,&codomain_R)); - assert(ec_is_on_curve(&codomain_R,&basis_R.P)); - assert(ec_is_on_curve(&codomain_R,&basis_R.Q)); - assert(ec_is_on_curve(&codomain_R,&basis_R.PmQ)); - assert(ec_is_on_curve(&codomain_R,&basis_L[0])); - - // DLP step - // we do the DLP and get the result up to sign - // first DLP - assert(test_point_order_twof(&basis_L[0],&codomain_R)); - ec_dlog_2(x1,x2,&basis_R,&basis_L[0],&codomain_R); - - // copying the digits - ibz_copy_digit_array(&i2,x2); - ibz_copy_digit_array(&i1,x1); - - // second DLP - ec_dlog_2(x3,x4,&basis_R,&basis_L[1],&codomain_R); - - //copyting the digits - ibz_copy_digit_array(&i3,x3); - ibz_copy_digit_array(&i4,x4); - - #ifndef NDEBUG - ec_point_t test; - ec_biscalar_mul(&test,&codomain_R,x1,x2,&basis_R); - assert(ec_is_equal(&test,&basis_L[0])); - ec_biscalar_mul(&test,&codomain_R,x3,x4,&basis_R); - assert(ec_is_equal(&test,&basis_L[1])); - #endif - - - ibz_copy_digit_array(&i1,x1); - ibz_copy_digit_array(&i2,x2); - ibz_copy_digit_array(&i3,x3); - ibz_copy_digit_array(&i4,x4); - - // multiplication by the norm of ideal_beta_R - ibz_mul(&i1,&i1,&ideal_beta_R->norm); - ibz_mul(&i2,&i2,&ideal_beta_R->norm); - ibz_mul(&i3,&i3,&ideal_beta_R->norm); - ibz_mul(&i4,&i4,&ideal_beta_R->norm); - - // computation mod 2^f - ibz_mod(&i1,&i1,ibz_two_f); - ibz_mod(&i2,&i2,ibz_two_f); - ibz_mod(&i3,&i3,ibz_two_f); - ibz_mod(&i4,&i4,ibz_two_f); - - // compute the trace - ibz_add(&trace_temp,&i1,&i4); - ibz_mod(&trace_temp,&trace_temp,ibz_two_f); - - if (ibz_cmp(&trace_temp,trace)!=0){ - ibz_neg(&i1,&i1); - ibz_neg(&i2,&i2); - ibz_mod(&i1,&i1,ibz_two_f); - ibz_mod(&i2,&i2,ibz_two_f); - ibz_add(&trace_temp,&i1,&i4); - ibz_mod(&trace_temp,&trace_temp,ibz_two_f); - if (ibz_cmp(&trace_temp,trace)!=0) { - ibz_neg(&i4,&i4); - ibz_neg(&i3,&i3); - ibz_mod(&i4,&i4,ibz_two_f); - ibz_mod(&i3,&i3,ibz_two_f); - ibz_add(&trace_temp,&i1,&i4); - ibz_mod(&trace_temp,&trace_temp,ibz_two_f); - if (ibz_cmp(trace,&trace_temp)!=0) { - ibz_neg(&i1,&i1); - ibz_neg(&i2,&i2); - ibz_mod(&i1,&i1,ibz_two_f); - ibz_mod(&i2,&i2,ibz_two_f); - ibz_add(&trace_temp,&i1,&i4); - ibz_mod(&trace_temp,&trace_temp,ibz_two_f); - } - } - } - // for debug checking final equality - assert(0==ibz_cmp(&trace_temp,trace)); - - // we have the correct values, now we can copy the output - ibz_copy(&(*action_matrix)[0][0],&i1); - ibz_copy(&(*action_matrix)[0][1],&i2); - ibz_copy(&(*action_matrix)[1][0],&i3); - ibz_copy(&(*action_matrix)[1][1],&i4); - - - // var finalize - ibz_finalize(&i1);ibz_finalize(&i2);ibz_finalize(&i3);ibz_finalize(&i4); - ibz_finalize(&trace_temp); - -} - - -/** - * @brief Translating an ideal of norm a big power of 2 into the corresponding isogeny - * - * @param isog_zip Output : compression of the output isogeny - * @param basis_minus : odd torsion basis (in the end, this will be the basis pushed through the output isogeny) - * @param basis_plus : odd torsion basis (in the end, this will be the basis pushed through the output isogeny) - * @param domain : the starting curve (in the end, this will be the codomain of the output isogeny) - * @param kernel_dual : the dual of the kernel of the last step of isog_start_two (in the end this will be the kernel of the dual of the last step of the output isogeny) - * @param gen_input : quaternion element, element of a maximal order O, generator of the O-ideal to be translated - * @param length : the length of the chain to be translated - * @param lideal_start_small : a small ideal equivalent to lideal_start_two of right order equal to O - * @param lideal_start_two : O0-ideal of norm a power of 2 equivalent to lideal_start_small, corresponding to an isogeny isog_start_two - * @param gen_two element of O0, generator of lideal_start_two - * @param Bpoo : the quaternion algebra - * @returns a bit indicating if the computation succeeded - * /!\ the composition of isog_start_two and isog might be backtracking - * lideal_start_two = O0 < gen_two , 2^*> - * lideal_start_small = O0 < conj(gen_two), * > - * lideal_start_small = lideal_lideal_start_two * conj(gen_two) / 2^* - * The ideal to be translated is equal to O < gen_input, 2^e> where O = OR(lideal_start_small) - * - * assumes that the ideal given in input has exactly norm 2^e where e = length * f (where f = TORSION_PLUS_EVEN_POWER) - * when used for compressing an isogeny, we assume that the curve given in input is normalized!! - */ -int id2iso_ideal_to_isogeny_two_long_power_of_2(id2iso_compressed_long_two_isog_t *isog_zip, ec_curve_t *domain, ec_basis_t *basis_minus, ec_basis_t *basis_plus, ec_point_t *kernel_dual, const quat_alg_elem_t *gen_input, const int length, const quat_left_ideal_t *lideal_start_small, const quat_left_ideal_t *lideal_start_two, const quat_alg_elem_t *gen_two, const quat_alg_t *Bpoo) { - - // var dec - int found; - quat_alg_elem_t beta; - quat_alg_elem_t gen,gen_constraint; - ibz_t n_beta,n; - quat_left_ideal_t lideal_small; - quat_left_ideal_t ideal_beta_L[length],ideal_beta_R[length]; - ibq_t ibq_trace; - ibz_t beta_trace[length]; - ibz_vec_2_t linear_comb[length]; - quat_alg_elem_t gen_input_temp,quat_temp; - quat_alg_elem_t gen_two_temp; - quat_left_ideal_t lideal_equiv;quat_left_ideal_init(&lideal_equiv); quat_order_t right_order;quat_order_init(&right_order); // TODECIDE we might avoid this by solving solve linear combination without using the right order - quat_alg_coord_t coeffs; - - int const f = TORSION_PLUS_EVEN_POWER; - ibz_t ibz_two_f,temp,remainder; - ec_basis_t temp_odd_basis[2]; - ec_curve_t temp_domain; ec_point_t temp_kernel_dual; ec_basis_t temp_two_basis; - ec_isog_even_t isog; - ec_point_t pushed_points[7]; - ibz_mat_2x2_t action_matrix; - digit_t digit_a[NWORDS_ORDER] = {0}; digit_t digit_b[NWORDS_ORDER] = {0}; - ibz_t ibz_a,ibz_b; - - // var init - found = 0; - quat_alg_elem_init(&beta); - quat_alg_elem_init(&gen);quat_alg_elem_init(&gen_constraint); - quat_alg_elem_init(&gen_input_temp);quat_alg_elem_init(&quat_temp); - quat_alg_elem_init(&gen_two_temp); - ibz_init(&n_beta); ibz_init(&n); - ibz_init(&temp); ibz_init(&ibz_two_f); - ibz_init(&remainder); - ibq_init(&ibq_trace); - ibz_init(&ibz_a);ibz_init(&ibz_b); - ibz_mat_2x2_init(&action_matrix); - quat_left_ideal_init(&lideal_small); - quat_alg_coord_init(&coeffs); - for (int ind=0; ind when ind is bigger than 0). conj(gen) is contained in lideal_small. - // At ind = 0, we have lideal_equiv = lideal_small - // - gen_input_temp is an element of the right order of lideal_equiv generating the ideal of norm 2^f corresponding to the (ind+1)-th isogeny to be translated. - // - gen_two_temp is an element of the right order of lideal_equiv such that the principal ideal O0 < gen_two_temp > = lideal_two * conj(lideal_equiv) where lideal_two corresponds to the isogeny of degree 2^* connecting E0 to the domain of the (ind+1)-th isogeny to be translated - - // At the beginning of iteration ind: - // - lideal_small is set to be lideal_equiv times an ideal of norm 2^f corresponding to the (ind+1)-th isogeny to be translated - // During iteration ind, all the other values will be updated - - // The main goal of iteration ind is to find an endomorphism beta contained inside the right order of lideal_equiv of step ind+1 (which is isomorphic to the endomorphism ring of the codomain of the (ind+1)-th isogeny to be translated) - // this endomorphism beta will be used to compute the two ideals ideal_beta_L[ind],ideal_beta_R[ind] and the trace trace_beta[ind] which are required to actually compute the (ind+1)-th isogeny to be translated. - // Two coefficients linear_comb[ind] will also be necessary, it is also computed in the loop below. - - // gen_constraint = conjugate( gen_two ) - quat_alg_conj(&gen_constraint,gen_two); - - // gen = norm(lideal_start_small) - quat_alg_scalar(&gen,&lideal_start_small->norm,&ibz_const_one); - - // n = norm(lideal_small) T - ibz_copy(&n,&lideal_start_small->norm); - - // gen_input_temp = gen_input - quat_alg_elem_copy(&gen_input_temp,gen_input); - - - // lideal_small = lideal_start_small - quat_left_ideal_copy(&lideal_small,lideal_start_small); - - // gen_two_temp = gen_two - quat_alg_elem_copy(&gen_two_temp,gen_two); - - // for debug we check that all values are contained in the correct orders and lattices - assert(quat_lattice_contains(&coeffs,&STANDARD_EXTREMAL_ORDER.order,&gen_two_temp,Bpoo)); - assert(quat_lattice_contains(&coeffs,&lideal_start_two->lattice,&gen_two_temp,Bpoo)); - assert(!quat_lattice_contains(&coeffs,&lideal_start_small->lattice,&gen_two_temp,Bpoo)); - quat_alg_conj(&quat_temp,&gen_two_temp); - assert(quat_lattice_contains(&coeffs,&lideal_start_small->lattice,&quat_temp,Bpoo)); - - // timing - setlocale(LC_NUMERIC, ""); - uint64_t t0, t1; - - // we will loop through and try to find an endomorphism beta for each - for (int ind=0; ind 0) { - // we update the various ideals and quaternion elements - - // if we set lideal_equiv = ideal_small * gen / norm(lideal_small) = O0 < gen, n(gen)/n(lideal_small) > - // we have set (at the end of the previous iteration) gen_input_temp = conj ( gen ) / norm(gen ) * gen_input_temp * gen - // and lideal_small = lideal_equiv * O_R(lideal_equiv) < gen_input_temp , 2^f > = O0 < make_primitive (gen * gen_input_temp) , n(gen) * 2^f /n (lideal_small) > - - // update lideal_small - // quat_temp = gen * gen_input_temp - quat_alg_mul(&quat_temp,&gen,&gen_input_temp, Bpoo); - quat_alg_normalize(&quat_temp); - - assert(quat_lattice_contains(&coeffs,&STANDARD_EXTREMAL_ORDER.order,&quat_temp,Bpoo)); - assert(quat_alg_is_primitive(&gen_input_temp,&right_order,Bpoo)); - assert(quat_lattice_contains(&coeffs,&lideal_equiv.lattice,&quat_temp,Bpoo)); - - // temp = n * 2^f - ibz_mul(&temp,&n,&ibz_two_f); - quat_lideal_make_primitive_then_create(&lideal_small,&quat_temp,&temp,&STANDARD_EXTREMAL_ORDER.order,Bpoo); - - } - // copying n in temp - ibz_copy(&temp,&n); - - // trying to solve the norm equation algorithm - found = klpt_eichler_special_norm(&beta,&n_beta,&gen,&n,&lideal_small,&gen_constraint, Bpoo); - if (!found) { - break; - } - - // the solution has been found, we proceed to the remaining computations - // this includes computation of an updated values of gen_two_temp and gen_input_temp, - // of the ideals ideal_beta_L[ind] and ideal_beta_R[ind], - // of the trace of beta as beta_trace[ind], and of the linear_combination linear_comb[ind] - - #ifndef NDEBUG - quat_alg_conj(&quat_temp,&gen); - quat_lattice_contains(&coeffs,&lideal_small.lattice,&quat_temp,Bpoo); - #endif - - - - // computation of lideal_equiv as lideal_small* gen / norm(lideal_small) - quat_alg_elem_copy(&quat_temp,&gen); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&lideal_small.norm); - int lideal_mul_ok = quat_lideal_mul(&lideal_equiv,&lideal_small,&quat_temp,Bpoo,0); - assert(lideal_mul_ok); - - - // computing the right order of lideal_equiv - quat_lideal_right_order(&right_order,&lideal_equiv,Bpoo); - assert(quat_lattice_contains(&coeffs,&right_order,&beta,Bpoo)); - - if (ind > 0) { - // we can adjust the scalar of gen_input_temp, because it was adjusted for gen_constraint during the execution of eichler norm fixed - ibz_copy(&gen_input_temp.denom,&gen_constraint.denom); - } - - - // update gen_input_temp = conj ( gen ) / norm(gen ) * gen_input_temp * gen - quat_alg_normalize(&gen); - quat_alg_conj(&quat_temp,&gen); - assert(quat_lattice_contains(&coeffs,&lideal_small.lattice,&quat_temp,Bpoo)); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&n); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&lideal_small.norm); - quat_alg_mul(&gen_input_temp,&quat_temp,&gen_input_temp,Bpoo); - quat_alg_mul(&gen_input_temp,&gen_input_temp,&gen,Bpoo); - quat_alg_normalize(&gen_input_temp); - - // update gen_constraint - if (ind > 0) { - // gen_constraint is simply the conjugate of gen_input_temp - quat_alg_conj(&gen_constraint,&gen_input_temp); - - } - else { - // gen_constraint = conj (gen) /norm(gen) * gen_constraint * gen - quat_alg_mul(&gen_constraint,&quat_temp,&gen_constraint,Bpoo); - quat_alg_mul(&gen_constraint,&gen_constraint,&gen,Bpoo); - quat_alg_normalize(&gen_constraint); - } - // for debug we check that our updated element are contained in the correct orders - assert(quat_lattice_contains(&coeffs,&right_order,&gen_constraint,Bpoo)); - assert(quat_lattice_contains(&coeffs,&right_order,&gen_input_temp,Bpoo)); - // assert(quat_alg_is_primitive(&gen_input_temp,&right_order,Bpoo)); - assert(quat_lattice_contains(&coeffs,&right_order,&beta,Bpoo)); - assert(quat_alg_is_primitive(&beta,&right_order,Bpoo)); - - // for debug we check that gen_two_temp is indeed contained inside order.order - assert(quat_lattice_contains(&coeffs,&STANDARD_EXTREMAL_ORDER.order,&gen_two_temp,Bpoo)); - - // update gen_two_temp = conj( gen ) * gen_two_temp / (lideal_equiv) - quat_alg_conj(&quat_temp,&gen); - quat_alg_mul(&gen_two_temp,&quat_temp,&gen_two_temp,Bpoo); - ibz_mul(&gen_two_temp.denom,&gen_two_temp.denom,&temp); - quat_alg_normalize(&gen_two_temp); - assert(quat_lattice_contains(&coeffs,&STANDARD_EXTREMAL_ORDER.order,&gen_two_temp,Bpoo)); - - // computation of the two ideals - // ideal_beta_L = O0 < beta * gen_two_temp, N>, ideal_beta_R = O0 < conj(beta) * gen_two_temp, N'> with N N' = n_beta - - // quat_temp = beta * gen_two_temp - quat_alg_mul(&quat_temp,&beta,&gen_two_temp,&QUATALG_PINFTY); - - // computation of the norm of this first ideal - ibz_gcd(&temp,&n_beta,&TORSION_ODD); - // creation of ideal_beta_L - quat_lideal_make_primitive_then_create(&ideal_beta_L[ind],&quat_temp,&temp,&STANDARD_EXTREMAL_ORDER.order,Bpoo); - assert(0==ibz_cmp(&temp,&ideal_beta_L[ind].norm)); - - // computation of the generator of ideal_beta_R - // as conj(beta) * gen_two_temp - quat_alg_conj(&quat_temp,&beta); - quat_alg_mul(&quat_temp,&quat_temp,&gen_two_temp, Bpoo); - quat_alg_normalize(&quat_temp); - - // computation of the norm of ideal_beta_R - ibz_div(&temp,&remainder,&n_beta,&ideal_beta_L[ind].norm); - - // creation of ideal_beta_R - quat_lideal_make_primitive_then_create(&ideal_beta_R[ind],&quat_temp,&temp,&STANDARD_EXTREMAL_ORDER.order,Bpoo); - assert(0==ibz_cmp(&temp,&ideal_beta_R[ind].norm)); - - #ifndef NDEBUG - ibz_mul(&temp,&ideal_beta_R[ind].norm,&ideal_beta_L[ind].norm); - assert(0==ibz_cmp(&temp,&n_beta)); - #endif - - // computation of the trace of beta - quat_alg_trace(&ibq_trace,&beta); - if (!ibq_to_ibz(&beta_trace[ind],&ibq_trace)) { - assert(0); - } - else { - // adjusting the trace mod 2^f - ibz_mod(&beta_trace[ind],&beta_trace[ind],&ibz_two_f); - } - - // removing scalar factors if needed - // TODUPDATE : it is only needed if trace is even so we may check that to avoid doing that operation every time - quat_alg_make_primitive(&coeffs,&temp,&gen_input_temp,&right_order,Bpoo); - ibz_mul(&gen_input_temp.denom,&gen_input_temp.denom,&temp); - quat_alg_normalize(&gen_input_temp); - - // computation of the linear_combination such that linear_comb[ind][0] + beta * linear_comb[ind][1] sends the kernel of the dual of the 2^f isogeny of step ind-1 to the kernel of the 2^f isogeny of step ind - found = klpt_find_linear_comb(&linear_comb[ind],&beta,&right_order,&ibz_two_f,f,&gen_constraint,&gen_input_temp,Bpoo); - if (!found) { - break; - // TODEBUG - } - - int lideal_generator_ok; - lideal_generator_ok = quat_lideal_generator_coprime(&gen,&lideal_equiv,&ibz_const_two,Bpoo,0); - assert(lideal_generator_ok); - quat_alg_normalize(&gen); - - // ensure that we still have the correct value of gen_constraint - quat_alg_conj(&gen_constraint,&gen_input_temp); - - - } - // the quaternion computation has succeeded, we can proceed to perform all elliptic curve and isogeny operations - if (found) { - // init all ec values needed for this computation - - // domain - temp_domain = *domain; - - // kernel dual - temp_kernel_dual = *kernel_dual; - - // odd torsion points - temp_odd_basis[0] = *basis_minus; - temp_odd_basis[1] = *basis_plus; - - for (int ind =0;ind 0) { - assert(0!=ibz_get(&linear_comb[ind][1])%2); - ibz_invmod(&linear_comb[ind][1],&linear_comb[ind][1],&ibz_two_f); - ibz_mul(&linear_comb[ind][0],&linear_comb[ind][0],&linear_comb[ind][1]); - ibz_mod(&linear_comb[ind][0],&linear_comb[ind][0],&ibz_two_f); - ibz_copy(&linear_comb[ind][1],&ibz_const_one); - ibz_copy(&isog_zip->zip_chain[ind],&linear_comb[ind][0]); - } - - // computation of the kernel - // changing the ibzs to digits - ibz_to_digit_array(digit_a,&linear_comb[ind][0]); - ibz_to_digit_array(digit_b,&linear_comb[ind][1]); - - isog.kernel = temp_two_basis.P; - - ec_biscalar_mul(&isog.kernel,&temp_domain,digit_a,digit_b,&temp_two_basis); - assert(test_point_order_twof(&isog.kernel,&temp_domain)); - - // setting the isogeny - isog.curve = temp_domain; - isog.length = f; - - // compression for the first step - // the first step is different for the compression - if (ind == 0) { - // first we compute a new deterministic basis of the curve - ec_curve_to_basis_2(&temp_two_basis,&temp_domain); - - // then we perform a dlp to express isog.kernel in this basis - ec_dlog_2(digit_a,digit_b,&temp_two_basis,&isog.kernel,&temp_domain); - - // translate the digit_t as ibz_t - ibz_copy_digit_array(&ibz_a,digit_a); - ibz_copy_digit_array(&ibz_b,digit_b); - // testing the sign - - - #ifndef NDEBUG - ec_point_t test; - ec_biscalar_mul(&test,&temp_domain,digit_a,digit_b,&temp_two_basis); - assert(ec_is_equal(&test,&isog.kernel)); - #endif - - // then we encode the isogeny as a scalar and a bit - // set the bit_first_step as 0 when we can get a generator as temp_two_basis.P + s temp_two_basis.Q - // if not, then this means we can write as Q + s P - isog_zip->bit_first_step = ibz_get(&ibz_a)%2!=0; - if (isog_zip->bit_first_step) { - // compute the scalar s as ibz_b / ibz_a mod 2^f - if(!ibz_invmod(&ibz_a,&ibz_a,&ibz_two_f)) { - assert(0); - } - ibz_mul(&ibz_b,&ibz_b,&ibz_a); - ibz_mod(&ibz_b,&ibz_b,&ibz_two_f); - ibz_copy(&isog_zip->zip_chain[ind],&ibz_b); - // and we can set the kernel dual to be temp_two_basis.Q - temp_kernel_dual = temp_two_basis.Q; - - ibz_to_digit_array(digit_b,&ibz_b); - ibz_copy_digit_array(&ibz_b,digit_b); - // ec_ladder3pt(&isog.kernel,digit_b,&temp_two_basis.P,&temp_two_basis.Q,&temp_two_basis.PmQ,&temp_domain); - } - else { - // compute the scalar s as ibz_a / ibz_b mod 2^f - if (!ibz_invmod(&ibz_b,&ibz_b,&ibz_two_f)) { - assert(0); - } - ibz_mul(&ibz_a,&ibz_b,&ibz_a); - ibz_mod(&ibz_a,&ibz_a,&ibz_two_f); - ibz_copy(&isog_zip->zip_chain[ind],&ibz_a); - // and we can set the kernel dual to be temp_two_basis.P - temp_kernel_dual = temp_two_basis.P; - - ibz_to_digit_array(digit_a,&ibz_a); - ibz_copy_digit_array(&ibz_a,digit_a); - // ec_ladder3pt(&isog.kernel,digit_a,&temp_two_basis.Q,&temp_two_basis.P,&temp_two_basis.PmQ,&temp_domain); - } - - } - - assert(test_point_order_twof(&temp_kernel_dual,&temp_domain)); - // evaluating the isogeny - // TODECIDE : we may use a non-zero eval for this one - pushed_points[0] = temp_odd_basis[0].P; - pushed_points[1] = temp_odd_basis[0].Q; - pushed_points[2] = temp_odd_basis[0].PmQ; - pushed_points[3] = temp_odd_basis[1].P; - pushed_points[4] = temp_odd_basis[1].Q; - pushed_points[5] = temp_odd_basis[1].PmQ; - pushed_points[6] = temp_kernel_dual; - ec_eval_even(&temp_domain,&isog,pushed_points,7); - temp_odd_basis[0].P = pushed_points[0]; - temp_odd_basis[0].Q = pushed_points[1]; - temp_odd_basis[0].PmQ = pushed_points[2]; - temp_odd_basis[1].P = pushed_points[3]; - temp_odd_basis[1].Q = pushed_points[4]; - temp_odd_basis[1].PmQ = pushed_points[5]; - temp_kernel_dual = pushed_points[6]; - assert(test_point_order_twof(&temp_kernel_dual,&temp_domain)); - - } - - *domain = temp_domain; - *kernel_dual = temp_kernel_dual; - *basis_minus = temp_odd_basis[0]; - *basis_plus = temp_odd_basis[1]; - - - } - - // var finalize - quat_alg_elem_finalize(&beta); - quat_alg_elem_finalize(&gen);quat_alg_elem_finalize(&gen_constraint); - quat_alg_elem_finalize(&gen_input_temp);quat_alg_elem_finalize(&quat_temp); - quat_alg_elem_finalize(&gen_two_temp); - ibz_finalize(&n_beta); ibz_finalize(&n); - ibz_finalize(&temp); ibz_finalize(&ibz_two_f); - ibz_finalize(&remainder); - ibz_finalize(&ibz_a);ibz_finalize(&ibz_b); - ibq_finalize(&ibq_trace); - ibz_mat_2x2_finalize(&action_matrix); - quat_left_ideal_finalize(&lideal_small); - quat_alg_coord_finalize(&coeffs); - quat_left_ideal_finalize(&lideal_equiv); quat_order_finalize(&right_order); - for (int ind=0; indcoord[2]); - ibz_copy(&(*vec)[3], &el->coord[3]); - ibz_sub(&(*vec)[0], &el->coord[0], &el->coord[3]); - ibz_sub(&(*vec)[1], &el->coord[1], &el->coord[2]); - if (ibz_is_one(&el->denom)) { - ibz_add(&(*vec)[2], &(*vec)[2], &(*vec)[2]); - ibz_add(&(*vec)[3], &(*vec)[3], &(*vec)[3]); - } else { - assert(!ibz_cmp(&el->denom, &ibz_const_two)); - ibz_div_2exp(&(*vec)[0], &(*vec)[0], 1); - ibz_div_2exp(&(*vec)[1], &(*vec)[1], 1); - } -} - -void id2iso_ideal_to_kernel_dlogs_even(ibz_vec_2_t *vec, const quat_left_ideal_t *lideal) -{ - ibz_t tmp; - ibz_init(&tmp); - - ibz_mat_2x2_t mat; - ibz_mat_2x2_init(&mat); - - // construct the matrix of the dual of alpha on the 2^f-torsion - { - quat_alg_elem_t alpha; - quat_alg_elem_init(&alpha); - - int lideal_generator_ok; - lideal_generator_ok = quat_lideal_generator(&alpha, lideal, &QUATALG_PINFTY,0); - assert(lideal_generator_ok); - quat_alg_conj(&alpha, &alpha); - - ibz_vec_4_t coeffs; - ibz_vec_4_init(&coeffs); - from_1ijk_to_O0basis(&coeffs, &alpha); - - for (unsigned i = 0; i < 2; ++i) { - ibz_add(&mat[i][i], &mat[i][i], &coeffs[0]); - for (unsigned j = 0; j < 2; ++j) { - ibz_mul(&tmp, &ACTION_GEN2[i][j], &coeffs[1]); - ibz_add(&mat[i][j], &mat[i][j], &tmp); - ibz_mul(&tmp, &ACTION_GEN3[i][j], &coeffs[2]); - ibz_add(&mat[i][j], &mat[i][j], &tmp); - ibz_mul(&tmp, &ACTION_GEN4[i][j], &coeffs[3]); - ibz_add(&mat[i][j], &mat[i][j], &tmp); - } - } - - ibz_vec_4_finalize(&coeffs); - quat_alg_elem_finalize(&alpha); - } - - // find the kernel of alpha modulo the norm of the ideal - { - ibz_t const *const norm = &lideal->norm; - - ibz_mod(&(*vec)[0], &mat[0][0], norm); - ibz_mod(&(*vec)[1], &mat[1][0], norm); - ibz_gcd(&tmp, &(*vec)[0], &(*vec)[1]); - if (!(ibz_get(&tmp) & 1)) { - ibz_mod(&(*vec)[0], &mat[0][1], norm); - ibz_mod(&(*vec)[1], &mat[1][1], norm); - } -#ifndef NDEBUG - ibz_gcd(&tmp, &(*vec)[0], norm); - ibz_gcd(&tmp, &(*vec)[1], &tmp); - assert(!ibz_cmp(&tmp, &ibz_const_one)); -#endif - } - - ibz_mat_2x2_finalize(&mat); - ibz_finalize(&tmp); -} - - - -void id2iso_ideal_to_isogeny_even(ec_isog_even_t *isog, const quat_left_ideal_t *lideal_input) -{ - // compute length - isog->length = 0; - ibz_t norm; - ibz_init(&norm); - ibz_copy(&norm, &lideal_input->norm); - while (!ibz_is_one(&norm)) { - assert(!ibz_is_zero(&norm) && !(ibz_get(&norm) & 1)); - ibz_div_2exp(&norm, &norm, 1); - ++isog->length; - } - ibz_finalize(&norm); - assert(isog->length <= TORSION_PLUS_EVEN_POWER); - - digit_t scalars[2][NWORDS_FIELD]; - { - ibz_vec_2_t vec; - ibz_vec_2_init(&vec); - - id2iso_ideal_to_kernel_dlogs_even(&vec, lideal_input); - - // multiply out unnecessary cofactor from 2^f-torsion basis - for (size_t i = isog->length; i < TORSION_PLUS_EVEN_POWER; ++i) { - ibz_add(&vec[0], &vec[0], &vec[0]); - ibz_add(&vec[1], &vec[1], &vec[1]); - } - - ibz_to_digit_array(scalars[0], &vec[0]); - ibz_to_digit_array(scalars[1], &vec[1]); - - ibz_vec_2_finalize(&vec); - } - - isog->curve = CURVE_E0; - ec_biscalar_mul(&isog->kernel, &isog->curve, scalars[0], scalars[1], &BASIS_EVEN); - -} - - - -void id2iso_ideal_to_kernel_dlogs_odd(ibz_vec_2_t *vec, ec_degree_odd_t *deg, const quat_left_ideal_t *lideal) -{ - ibz_t tmp; - ibz_init(&tmp); - - ibz_mat_2x2_t mat; - ibz_mat_2x2_init(&mat); - - // construct the matrix of the dual of alpha on the T-torsion - { - quat_alg_elem_t alpha; - quat_alg_elem_init(&alpha); - - int lideal_generator_ok; - lideal_generator_ok = quat_lideal_generator(&alpha, lideal, &QUATALG_PINFTY,0); - assert(lideal_generator_ok); - assert(ibz_divides(&ibz_const_two, &alpha.denom)); // denominator is invertible mod T, ignore - - for (unsigned i = 0; i < 2; ++i) { - ibz_add(&mat[i][i], &mat[i][i], &alpha.coord[0]); - for (unsigned j = 0; j < 2; ++j) { - ibz_mul(&tmp, &ACTION_I[i][j], &alpha.coord[1]); - ibz_sub(&mat[i][j], &mat[i][j], &tmp); - ibz_mul(&tmp, &ACTION_J[i][j], &alpha.coord[2]); - ibz_sub(&mat[i][j], &mat[i][j], &tmp); - ibz_mul(&tmp, &ACTION_K[i][j], &alpha.coord[3]); - ibz_sub(&mat[i][j], &mat[i][j], &tmp); -// ibz_mod(&mat[i][j], &mat[i][j], &TORSION_ODD); - } - } - - quat_alg_elem_finalize(&alpha); - } - - // determine prime powers in the norm of the ideal - size_t numpp = 0; - #define NUMPP (sizeof(TORSION_ODD_PRIMEPOWERS) / sizeof(*TORSION_ODD_PRIMEPOWERS)) - ibz_t pps[NUMPP]; - ibz_vec_2_t vs[NUMPP]; - { - ibz_t const *const norm = &lideal->norm; - - for (size_t i = 0; i < NUMPP; ++i) { - ibz_gcd(&tmp, norm, &TORSION_ODD_PRIMEPOWERS[i]); - (*deg)[i] = 0; - if (!ibz_is_one(&tmp)) { - ibz_init(&pps[numpp]); - ibz_copy(&pps[numpp], &tmp); - ibz_vec_2_init(&vs[numpp]); - ++numpp; - - // compute valuation - ibz_t l, r; - ibz_init(&l); - ibz_init(&r); - ibz_set(&l, TORSION_ODD_PRIMES[i]); - do { - ++(*deg)[i]; - ibz_div(&tmp, &r, &tmp, &l); - assert(!ibz_is_zero(&tmp) && ibz_is_zero(&r)); - } while (!ibz_is_one(&tmp)); - ibz_finalize(&r); - ibz_finalize(&l); - } - } - } - #undef NUMPP - - // find the kernel of alpha modulo each prime power - { - for (size_t i = 0; i < numpp; ++i) { - ibz_mod(&vs[i][0], &mat[0][0], &pps[i]); - ibz_mod(&vs[i][1], &mat[1][0], &pps[i]); - ibz_gcd(&tmp, &vs[i][0], &pps[i]); - ibz_gcd(&tmp, &vs[i][1], &tmp); - if (ibz_cmp(&tmp, &ibz_const_one)) { - ibz_mod(&vs[i][0], &mat[0][1], &pps[i]); - ibz_mod(&vs[i][1], &mat[1][1], &pps[i]); - } -#ifndef NDEBUG - ibz_gcd(&tmp, &vs[i][0], &pps[i]); - ibz_gcd(&tmp, &vs[i][1], &tmp); - assert(!ibz_cmp(&tmp, &ibz_const_one)); -#endif - } - } - - // now CRT them together - { - //TODO use a product tree instead - ibz_t mod; - ibz_init(&mod); - ibz_set(&mod, 1); - ibz_set(&(*vec)[0], 0); - ibz_set(&(*vec)[1], 0); - for (size_t i = 0; i < numpp; ++i) { - //TODO use vector CRT - ibz_crt(&(*vec)[0], &(*vec)[0], &vs[i][0], &mod, &pps[i]); - ibz_crt(&(*vec)[1], &(*vec)[1], &vs[i][1], &mod, &pps[i]); - //TODO optionally return lcm from CRT and use it - ibz_mul(&mod, &mod, &pps[i]); - ibz_finalize(&pps[i]); - } - ibz_finalize(&mod); - } - - for (size_t i = 0; i < numpp; ++i) - ibz_vec_2_finalize(&vs[i]); - - ibz_mat_2x2_finalize(&mat); - - ibz_finalize(&tmp); -} - - - - -/** - * @brief Translating an ideal of odd norm dividing p²-1 into the corresponding isogeny - * - * @param isog Output : the output isogeny - * @param basis_minus : a basis of ec points - * @param basis_plus : a basis of ec points - * @param domain : an elliptic curve - * @param lideal_input : O0-ideal corresponding to the ideal to be translated - * - * compute the isogeny starting from domain corresponding to ideal_input - * the coefficients extracted from the ideal are to be applied to basis_minus and basis_plus to compute the kernel of the isogeny. - * - */ - -void id2iso_ideal_to_isogeny_odd(ec_isog_odd_t *isog, const ec_curve_t *domain, const ec_basis_t *basis_plus,const ec_basis_t *basis_minus, const quat_left_ideal_t *lideal_input) -{ - digit_t scalars_plus[2][NWORDS_FIELD], scalars_minus[2][NWORDS_FIELD]; - { - ibz_vec_2_t vec; - ibz_vec_2_init(&vec); - - id2iso_ideal_to_kernel_dlogs_odd(&vec, &isog->degree, lideal_input); - - ibz_t tmp; - ibz_init(&tmp); - - // multiply out unnecessary cofactor from T-torsion basis - assert(sizeof(isog->degree)/sizeof(*isog->degree) - == sizeof(TORSION_ODD_PRIMEPOWERS)/sizeof(*TORSION_ODD_PRIMEPOWERS)); - for (size_t i = 0; i < sizeof(isog->degree)/sizeof(*isog->degree); ++i) { - assert(isog->degree[i] <= TORSION_ODD_POWERS[i]); - if (isog->degree[i] == TORSION_ODD_POWERS[i]) - continue; - ibz_set(&tmp, TORSION_ODD_PRIMES[i]); - ibz_pow(&tmp, &tmp, TORSION_ODD_POWERS[i] - isog->degree[i]); - ibz_mul(&vec[0], &vec[0], &tmp); - ibz_mul(&vec[1], &vec[1], &tmp); - } - - ibz_mod(&tmp, &vec[0], &TORSION_ODD_PLUS); - ibz_to_digit_array(scalars_plus[0], &tmp); - ibz_mod(&tmp, &vec[1], &TORSION_ODD_PLUS); - ibz_to_digit_array(scalars_plus[1], &tmp); - ibz_mod(&tmp, &vec[0], &TORSION_ODD_MINUS); - ibz_to_digit_array(scalars_minus[0], &tmp); - ibz_mod(&tmp, &vec[1], &TORSION_ODD_MINUS); - ibz_to_digit_array(scalars_minus[1], &tmp); - - ibz_finalize(&tmp); - - ibz_vec_2_finalize(&vec); - } - - isog->curve = *domain; - ec_biscalar_mul(&isog->ker_plus, domain, scalars_plus[0], scalars_plus[1], basis_plus); - ec_biscalar_mul(&isog->ker_minus, domain, scalars_minus[0], scalars_minus[1], basis_minus); -} - - -void id2iso_kernel_dlogs_to_ideal(quat_left_ideal_t *lideal, const ibz_vec_2_t *vec2, const ibz_vec_2_t *vec3) -{ - ibz_vec_2_t ker; - ibz_vec_2_init(&ker); - ibz_crt(&ker[0], &(*vec2)[0], &(*vec3)[0], &TORSION_PLUS_2POWER, &TORSION_PLUS_3POWER); - ibz_crt(&ker[1], &(*vec2)[1], &(*vec3)[1], &TORSION_PLUS_2POWER, &TORSION_PLUS_3POWER); - - // algorithm: apply endomorphisms 1 and j+(1+k)/2 to the kernel point, - // the result should form a basis of the respective torsion subgroup. - // then apply i to the kernel point and decompose over said basis. - // hence we have an equation a*P + b*[j+(1+k)/2]P == [i]P, which will - // easily reveal an endomorphism that kills P. - - ibz_vec_2_t vec; - ibz_vec_2_init(&vec); - - { - ibz_mat_2x2_t mat; - ibz_mat_2x2_init(&mat); - - ibz_copy(&mat[0][0], &ker[0]); - ibz_copy(&mat[1][0], &ker[1]); - - ibz_mat_2x2_eval(&vec, &ACTION_J, &ker); - ibz_copy(&mat[0][1], &vec[0]); - ibz_copy(&mat[1][1], &vec[1]); - ibz_mat_2x2_eval(&vec, &ACTION_GEN4, &ker); - ibz_add(&mat[0][1], &mat[0][1], &vec[0]); - ibz_add(&mat[1][1], &mat[1][1], &vec[1]); - ibz_mod(&mat[0][1], &mat[0][1], &TORSION_PLUS_23POWER); - ibz_mod(&mat[1][1], &mat[1][1], &TORSION_PLUS_23POWER); - - ibz_mat_2x2_t inv; - ibz_mat_2x2_init(&inv); - { - int inv_ok = ibz_2x2_inv_mod(&inv, &mat, &TORSION_PLUS_23POWER); - assert(inv_ok); - } - ibz_mat_2x2_finalize(&mat); - - ibz_mat_2x2_eval(&vec, &ACTION_I, &ker); - ibz_mat_2x2_eval(&vec, &inv, &vec); - - ibz_mat_2x2_finalize(&inv); - } - - ibz_vec_2_finalize(&ker); - - // final result: a - i + b*(j+(1+k)/2) - quat_alg_elem_t gen; - quat_alg_elem_init(&gen); - ibz_set(&gen.denom, 2); - ibz_add(&gen.coord[0], &vec[0], &vec[0]); - ibz_set(&gen.coord[1], -2); - ibz_add(&gen.coord[2], &vec[1], &vec[1]); - ibz_copy(&gen.coord[3], &vec[1]); - ibz_add(&gen.coord[0], &gen.coord[0], &vec[1]); - ibz_vec_2_finalize(&vec); - - quat_lideal_create_from_primitive(lideal, &gen, &TORSION_PLUS_23POWER, &MAXORD_O0, &QUATALG_PINFTY); - - assert(0 == ibz_cmp(&lideal->norm, &TORSION_PLUS_23POWER)); - - quat_alg_elem_finalize(&gen); -} - - diff --git a/src/id2iso/ref/id2isox/test/id2iso.c b/src/id2iso/ref/id2isox/test/id2iso.c deleted file mode 100644 index 15956f8..0000000 --- a/src/id2iso/ref/id2isox/test/id2iso.c +++ /dev/null @@ -1,254 +0,0 @@ -#include - -#include "id2iso_tests.h" - -//XXX FIXME stolen from src/ec/opt/generic/test/isog-test.c -static void fp2_print(char *name, fp2_t const a){ - fp2_t b; - fp2_set(&b, 1); - fp2_mul(&b, &b, &a); - printf("%s = 0x", name); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.re[i]); - printf(" + i*0x"); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.im[i]); - printf("\n"); -} - -static void point_print(char *name, ec_point_t P){ - fp2_t a; - if(fp2_is_zero(&P.z)){ - printf("%s = INF\n", name); - } - else{ - fp2_copy(&a, &P.z); - fp2_inv(&a); - fp2_mul(&a, &a, &P.x); - fp2_print(name, a); - } -} -//XXX - -int id2iso_test_long_id2iso() { - // var dec - int found =1; - ibz_t temp,remainder,n; - ibq_t ibq_norm; - quat_alg_elem_t gen,gen_two,gen_check,quat_temp,gen_key; - - quat_left_ideal_t lideal_small,lideal_check,lideal_two; - quat_left_ideal_t lideal_two_one,lideal_small_one; - quat_order_t right_order; - id2iso_compressed_long_two_isog_t zip; - ec_isog_even_t isog_two_one; - quat_alg_coord_t coeffs; - ibz_mat_4x4_t reduced,gram; - - ec_basis_t basis_plus,basis_minus; - ec_basis_t odd_basis[2]; - ec_curve_t curve = {0}; - ec_point_t kernel_dual = {0}; - ec_basis_t even_basis = {0}; - - // var init - ibq_init(&ibq_norm); - ibz_init(&temp);ibz_init(&remainder);ibz_init(&n); - quat_alg_elem_init(&gen); - quat_alg_elem_init(&gen_two); - quat_alg_elem_init(&gen_key); - quat_alg_elem_init(&gen_check); - quat_alg_elem_init(&quat_temp); - quat_left_ideal_init(&lideal_small); - quat_left_ideal_init(&lideal_check); - quat_left_ideal_init(&lideal_two); - quat_left_ideal_init(&lideal_two_one); - quat_left_ideal_init(&lideal_small_one); - quat_order_init(&right_order); - quat_alg_coord_init(&coeffs); - ibz_mat_4x4_init(&reduced);ibz_mat_4x4_init(&gram); - // computation of lideal_small - generate_random_prime(&n,1,KLPT_secret_key_prime_size); - ibz_mul(&temp,&n,&TORSION_ODD); - found = found && represent_integer(&gen_check,&temp,&QUATALG_PINFTY); - assert(found); - quat_lideal_create_from_primitive(&lideal_small,&gen_check,&n,&STANDARD_EXTREMAL_ORDER.order,&QUATALG_PINFTY); - quat_alg_conj(&gen_check,&gen_check); - quat_lideal_create_from_primitive(&lideal_check,&gen_check,&TORSION_ODD,&STANDARD_EXTREMAL_ORDER.order,&QUATALG_PINFTY); - assert(quat_lideal_isom(&quat_temp,&lideal_small,&lideal_check,&QUATALG_PINFTY)); - - // application of keygen_klpt to compute a generator of lideal_two - found = found && klpt_keygen_klpt(&gen,&lideal_small,&QUATALG_PINFTY); - quat_alg_conj(&gen,&gen); - quat_alg_elem_copy(&gen_key,&gen); - - - - // TODEBUG check that this is indeed an integer - int length = KLPT_keygen_length/TORSION_PLUS_EVEN_POWER; - assert(KLPT_keygen_length==TORSION_PLUS_EVEN_POWER*length); - - // computation of the norm of lideal_two - quat_alg_norm(&ibq_norm,&gen,&QUATALG_PINFTY); - ibq_to_ibz(&temp,&ibq_norm); - ibz_div(&temp,&remainder,&temp,&lideal_small.norm); - assert(0==ibz_cmp(&remainder,&ibz_const_zero)); - ibz_pow(&remainder,&ibz_const_two,KLPT_keygen_length); - assert(0==ibz_cmp(&remainder,&temp)); - - // computation of lideal_two - quat_lideal_create_from_primitive(&lideal_two,&gen,&temp,&STANDARD_EXTREMAL_ORDER.order,&QUATALG_PINFTY); - - // we compute a better generator - int find_gen = 0; - while (!find_gen) { - ibz_rand_interval_minm_m(&coeffs[0],100); - ibz_rand_interval_minm_m(&coeffs[1],100); - ibz_rand_interval_minm_m(&coeffs[2],100); - ibz_rand_interval_minm_m(&coeffs[3],100); - ibz_mat_4x4_eval(&gen.coord,&lideal_two.lattice.basis,&coeffs); - ibz_copy(&gen.denom,&lideal_two.lattice.denom); - - quat_alg_trace(&ibq_norm,&gen); - ibq_to_ibz(&temp,&ibq_norm); - find_gen = (0!=ibz_get(&temp)%2); - } - - assert(quat_lideal_isom(&quat_temp,&lideal_two,&lideal_small,&QUATALG_PINFTY)); - assert(quat_lideal_isom(&quat_temp,&lideal_two,&lideal_check,&QUATALG_PINFTY)); - // computing the ideal of the first step - - ibz_pow(&remainder,&ibz_const_two,TORSION_PLUS_EVEN_POWER); - quat_lideal_create_from_primitive(&lideal_two_one,&gen,&remainder,&STANDARD_EXTREMAL_ORDER.order,&QUATALG_PINFTY); - - - // computing the right_order - quat_lideal_right_order(&right_order,&lideal_two_one,&QUATALG_PINFTY); - - - assert(quat_lattice_contains(&coeffs,&right_order,&gen,&QUATALG_PINFTY)); - - // computing an ideal equivalent to lideal_two_one - quat_lideal_reduce_basis(&reduced,&gram,&lideal_two_one,&QUATALG_PINFTY); - found = found && klpt_lideal_equiv(&gen_two,&temp,&reduced,&gram,&lideal_two_one.norm,&lideal_two_one.lattice.denom,&QUATALG_PINFTY); - quat_lideal_create_from_primitive(&lideal_small_one,&gen_two,&temp,&STANDARD_EXTREMAL_ORDER.order,&QUATALG_PINFTY); - quat_alg_conj(&gen_two,&gen_two); - assert(quat_lattice_contains(&coeffs,&lideal_two_one.lattice,&gen_two,&QUATALG_PINFTY)); - assert(quat_lideal_isom(&quat_temp,&lideal_two_one,&lideal_small_one,&QUATALG_PINFTY)); - - quat_left_ideal_t ideal_test; - quat_left_ideal_init(&ideal_test); - quat_lideal_create_from_primitive(&ideal_test,&gen_two,&lideal_two_one.norm,&STANDARD_EXTREMAL_ORDER.order,&QUATALG_PINFTY); - assert(quat_lideal_equals(&ideal_test,&lideal_two_one,&QUATALG_PINFTY)); - - // casting gen into the right order of lideal_small_one - quat_alg_elem_copy(&quat_temp,&gen_two); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&lideal_two_one.norm); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&lideal_small_one.norm); - quat_alg_mul(&gen,&quat_temp,&gen,&QUATALG_PINFTY); - quat_alg_conj(&quat_temp,&gen_two); - quat_alg_mul(&gen,&gen,&quat_temp,&QUATALG_PINFTY); - - #ifndef NDEBUG - quat_lideal_right_order(&right_order,&lideal_small_one,&QUATALG_PINFTY); - assert(quat_lattice_contains(&coeffs,&right_order,&gen,&QUATALG_PINFTY)); - int lideal_generator_ok1= quat_lideal_generator_coprime(&quat_temp,&lideal_small_one,&ibz_const_two,&QUATALG_PINFTY,0); - assert(lideal_generator_ok1); - quat_alg_mul(&quat_temp,&quat_temp,&gen,&QUATALG_PINFTY); - ibz_pow(&temp,&ibz_const_two,TORSION_PLUS_EVEN_POWER*(length -1) ); - ibz_mul(&temp,&temp,&lideal_small_one.norm); - quat_lideal_create_from_primitive(&ideal_test,&quat_temp,&temp,&STANDARD_EXTREMAL_ORDER.order,&QUATALG_PINFTY); - assert(quat_lideal_isom(&quat_temp,&ideal_test,&lideal_check,&QUATALG_PINFTY)); - assert(quat_lideal_isom(&quat_temp,&ideal_test,&lideal_small,&QUATALG_PINFTY)); - if (!quat_lideal_isom(&quat_temp,&ideal_test,&lideal_check,&QUATALG_PINFTY)) { - printf("the final check will fail ! \n"); - } - #endif - - // copying the precomputed basis - basis_plus = BASIS_ODD_PLUS; - basis_minus = BASIS_ODD_MINUS; - odd_basis[0] = basis_minus; - odd_basis[1] = basis_plus; - - // copying the starting curve - curve = CURVE_E0; - - // Computing the first isogeny - id2iso_ideal_to_isogeny_even(&isog_two_one,&lideal_two_one); - - // computation of the deterministic second point as the kernel dual - ec_complete_basis_2(&even_basis,&curve,&isog_two_one.kernel); - kernel_dual = even_basis.Q; - - // evaluation through the first isogeny - ec_eval_even_basis(&curve,&isog_two_one,odd_basis,2); - - basis_minus = odd_basis[0]; basis_plus=odd_basis[1]; - ec_curve_t E; - ec_eval_even(&E,&isog_two_one,&kernel_dual,1); - - - id2iso_compressed_long_two_isog_init(&zip, length); - - found = found && id2iso_ideal_to_isogeny_two_long_power_of_2(&zip,&curve,&basis_minus,&basis_plus,&kernel_dual,&gen,length-1,&lideal_small_one,&lideal_two_one,&gen_two,&QUATALG_PINFTY); - - - if ( found ) { - ec_isog_odd_t isog_check; - id2iso_ideal_to_isogeny_odd(&isog_check,&CURVE_E0,&BASIS_ODD_PLUS,&BASIS_ODD_MINUS,&lideal_check); - ec_curve_t new_curve=CURVE_E0; - ec_eval_odd(&new_curve,&isog_check,&even_basis.P,1); - - // checking equality of j_inv - fp2_t j1,j2; - ec_j_inv(&j1,&new_curve); - ec_j_inv(&j2,&curve); - found = found && fp2_is_equal(&j1,&j2); - if (!fp2_is_equal(&j1,&j2)) { - printf(" the final check failed \n"); - } - } - else { - printf("the long translation failed \n"); - } - - - - // var finalize - quat_alg_elem_finalize(&gen_key); - quat_alg_elem_finalize(&gen_check); - quat_alg_elem_finalize(&quat_temp); - ibq_finalize(&ibq_norm); - ibz_finalize(&temp);ibz_finalize(&remainder);ibz_finalize(&n); - quat_alg_elem_finalize(&gen); - quat_alg_elem_finalize(&gen_two); - quat_left_ideal_finalize(&lideal_small); - quat_left_ideal_finalize(&lideal_check); - quat_left_ideal_finalize(&lideal_two); - quat_left_ideal_finalize(&lideal_two_one); - quat_left_ideal_finalize(&lideal_small_one); - quat_left_ideal_finalize(&ideal_test); - quat_order_finalize(&right_order); - quat_alg_coord_finalize(&coeffs); - ibz_mat_4x4_finalize(&reduced);ibz_mat_4x4_finalize(&gram); - id2iso_compressed_long_two_isog_finalize(&zip); - - return found; -} - -int id2iso_test_id2iso() { - int res = 1; - printf("\n \nRunning id2iso tests for long id2iso \n \n"); - - - for (int i =0; i<3;i++) { - res = res && id2iso_test_long_id2iso(); - } - - if (!res) { - printf("ID2ISO unit test long id2iso failed\n"); - } - - return res; -} diff --git a/src/id2iso/ref/id2isox/test/id2ker_even.c b/src/id2iso/ref/id2isox/test/id2ker_even.c deleted file mode 100644 index 66d3ce1..0000000 --- a/src/id2iso/ref/id2isox/test/id2ker_even.c +++ /dev/null @@ -1,190 +0,0 @@ -#include "id2iso_tests.h" - -// TODO deduplicate with id2ker_odd.c - - -static void random_scalar(ibz_t *k) -{ - ibz_pow(k, &ibz_const_two, 123); - ibz_rand_interval(k, &ibz_const_zero, k); -} - - -// defined in src/klpt/ref/generic/tools.c -int represent_integer(quat_alg_elem_t *gamma, ibz_t *n_gamma, const quat_alg_t *Bpoo); - -// I will have norm dividing 2^f, whereas J will have norm dividing T -static void random_pair_of_equivalent_ideals(quat_left_ideal_t *I, quat_left_ideal_t *J) -{ - ibz_t normIJ; - ibz_init(&normIJ); - ibz_pow(&normIJ, &ibz_const_two, TORSION_PLUS_EVEN_POWER - (rand() % 5)); // arbitrarily divide out some powers of 2 - ibz_mul(&normIJ, &normIJ, &TORSION_ODD); - -// arbitrarily divide out one of the prime powers -{ -ibz_t rem; -ibz_init(&rem); -ibz_div(&normIJ, &rem, &normIJ, &TORSION_ODD_PRIMEPOWERS[rand() % sizeof(TORSION_ODD_PRIMEPOWERS)/sizeof(*TORSION_ODD_PRIMEPOWERS)]); -assert(ibz_is_zero(&rem)); -ibz_finalize(&rem); -} - - quat_alg_elem_t genI; - quat_alg_elem_init(&genI); - - { - int r = represent_integer(&genI, &normIJ, &QUATALG_PINFTY); - assert(r); - } - -// quat_alg_elem_print(&genI); - - quat_alg_elem_t genJ; - quat_alg_elem_init(&genJ); - quat_alg_conj(&genJ, &genI); - - ibz_t normI, normJ; - ibz_init(&normI); - ibz_init(&normJ); - ibz_gcd(&normJ, &normIJ, &TORSION_ODD); - { - ibz_t rem; - ibz_init(&rem); - ibz_div(&normI, &rem, &normIJ, &normJ); - assert(ibz_is_zero(&rem)); - ibz_finalize(&rem); - } - - quat_lideal_create_from_primitive(I, &genI, &normI, &MAXORD_O0, &QUATALG_PINFTY); - quat_lideal_create_from_primitive(J, &genJ, &normJ, &MAXORD_O0, &QUATALG_PINFTY); - - ibz_finalize(&normJ); - ibz_finalize(&normI); - quat_alg_elem_finalize(&genJ); - quat_alg_elem_finalize(&genI); - ibz_finalize(&normIJ); -} - - -int _id2iso_test_id2kerdlogs_even() -{ - int res = 1; - - quat_left_ideal_t ideal, ignored; - quat_left_ideal_init(&ideal); - { - quat_left_ideal_init(&ignored); - random_pair_of_equivalent_ideals(&ideal, &ignored); - quat_left_ideal_finalize(&ignored); - } -// quat_left_ideal_print(&ideal); - - ibz_vec_2_t vec1, vec2; - ibz_vec_2_init(&vec1); - ibz_vec_2_init(&vec2); - - // call it twice and make sure we get equivalent results - void id2iso_ideal_to_kernel_dlogs_even(ibz_vec_2_t *vec, const quat_left_ideal_t *lideal); - id2iso_ideal_to_kernel_dlogs_even(&vec1, &ideal); - id2iso_ideal_to_kernel_dlogs_even(&vec2, &ideal); - -// ibz_printf("vec1 = (%Zd, %Zd)\n", &vec1[0], &vec1[1]); -// ibz_printf("vec2 = (%Zd, %Zd)\n", &vec2[0], &vec2[1]); - - ibz_t lhs, rhs; - ibz_init(&lhs); - ibz_init(&rhs); - ibz_mul(&lhs, &vec1[0], &vec2[1]); - ibz_mul(&rhs, &vec2[0], &vec1[1]); - ibz_mod(&lhs, &lhs, &ideal.norm); - ibz_mod(&rhs, &rhs, &ideal.norm); -// ibz_printf("lhs = %Zd\n", &lhs); -// ibz_printf("rhs = %Zd\n", &rhs); - res &= !ibz_cmp(&lhs, &rhs); - ibz_finalize(&lhs); - ibz_finalize(&rhs); - - quat_left_ideal_finalize(&ideal); - - ibz_vec_2_finalize(&vec1); - ibz_vec_2_finalize(&vec2); - - return res; -} - -#include - -int _id2iso_test_id2ker_even() -{ - int res = 1; - - ec_isog_even_t isog1; - ec_isog_odd_t isog2; - do { - quat_left_ideal_t ideal1, ideal2; - quat_left_ideal_init(&ideal1); - quat_left_ideal_init(&ideal2); - - random_pair_of_equivalent_ideals(&ideal1, &ideal2); - -// quat_left_ideal_print(&ideal1); -// quat_left_ideal_print(&ideal2); - - id2iso_ideal_to_isogeny_even(&isog1, &ideal1); - id2iso_ideal_to_isogeny_odd(&isog2, &CURVE_E0, &BASIS_ODD_PLUS, &BASIS_ODD_MINUS, &ideal2); - - // check orders - { - if (!ibz_is_one(&ideal1.norm) && fp2_is_zero(&isog1.kernel.z)) { - printf("norm of ideal1 is >1 but kernel is trivial; something is wrong!\n"); - res &= 0; - } - if (!ibz_is_one(&ideal2.norm) && fp2_is_zero(&isog2.ker_plus.z) && fp2_is_zero(&isog2.ker_minus.z)) { - printf("norm of ideal2 is >1 but kernel is trivial; something is wrong!\n"); - res &= 0; - } - } - - quat_left_ideal_finalize(&ideal1); - quat_left_ideal_finalize(&ideal2); - // TODO: if 2^e-isogenies supported abritrary length this could be much faster - } while (isog1.length != TORSION_PLUS_EVEN_POWER); -// printf("2-isogeny length: %lu\n", (unsigned long) isog1.length); - - { - ec_curve_t curve1, curve2; - ec_eval_even(&curve1, &isog1, NULL, 0); - ec_eval_odd(&curve2, &isog2, NULL, 0); - - if (fp2_is_zero(&curve1.C) || fp2_is_zero(&curve2.C)) { - printf("broken curve constant after isogeny; something is wrong!\n"); - res &= 0; - } - - fp2_t j1, j2; - ec_j_inv(&j1, &curve1); - ec_j_inv(&j2, &curve2); - - res &= fp2_is_equal(&j1, &j2); - } - - return res; -} - - -int id2iso_test_id2ker_even() { - int res = 1; - printf("\n \nRunning id2iso tests for ideal_to_kernel_even() \n \n"); - - for (int i = 0; i < 5; i++) { - res &= _id2iso_test_id2kerdlogs_even(); - res &= _id2iso_test_id2ker_even(); - } - - if (!res) { - printf("ID2ISO unit test ideal_to_kernel_even() failed\n"); - } - - return res; -} diff --git a/src/id2iso/ref/id2isox/test/id2ker_odd.c b/src/id2iso/ref/id2isox/test/id2ker_odd.c deleted file mode 100644 index c4411f6..0000000 --- a/src/id2iso/ref/id2isox/test/id2ker_odd.c +++ /dev/null @@ -1,189 +0,0 @@ -#include "id2iso_tests.h" - -// TODO deduplicate with id2ker_odd.c - - -static void random_scalar(ibz_t *k) -{ - ibz_pow(k, &ibz_const_two, 123); - ibz_rand_interval(k, &ibz_const_zero, k); -} - - -// defined in src/klpt/ref/generic/tools.c -int represent_integer(quat_alg_elem_t *gamma, ibz_t *n_gamma, const quat_alg_t *Bpoo); - -// both ideals will have norm dividing T -static void random_pair_of_equivalent_ideals(quat_left_ideal_t *I, quat_left_ideal_t *J) -{ - ibz_t normIJ; - ibz_init(&normIJ); - ibz_mul(&normIJ, &TORSION_ODD, &TORSION_ODD); - -// arbitrarily divide out one of the prime powers -{ -ibz_t rem; -ibz_init(&rem); -ibz_div(&normIJ, &rem, &normIJ, &TORSION_ODD_PRIMEPOWERS[rand() % sizeof(TORSION_ODD_PRIMEPOWERS)/sizeof(*TORSION_ODD_PRIMEPOWERS)]); -assert(ibz_is_zero(&rem)); -ibz_finalize(&rem); -} - - quat_alg_elem_t genI; - quat_alg_elem_init(&genI); - - { - int r = represent_integer(&genI, &normIJ, &QUATALG_PINFTY); - assert(r); - } - -// quat_alg_elem_print(&genI); - - quat_alg_elem_t genJ; - quat_alg_elem_init(&genJ); - quat_alg_conj(&genJ, &genI); - - ibz_t normI, normJ; - ibz_init(&normI); - ibz_init(&normJ); - ibz_gcd(&normI, &normIJ, &TORSION_ODD); - { - ibz_t rem; - ibz_init(&rem); - ibz_div(&normJ, &rem, &normIJ, &normI); - assert(ibz_is_zero(&rem)); - ibz_finalize(&rem); - } - - quat_lideal_create_from_primitive(I, &genI, &normI, &MAXORD_O0, &QUATALG_PINFTY); - quat_lideal_create_from_primitive(J, &genJ, &normJ, &MAXORD_O0, &QUATALG_PINFTY); - - ibz_finalize(&normJ); - ibz_finalize(&normI); - quat_alg_elem_finalize(&genJ); - quat_alg_elem_finalize(&genI); - ibz_finalize(&normIJ); -} - - -int _id2iso_test_id2kerdlogs_odd() -{ - int res = 1; - - quat_left_ideal_t ideal, ignored; - quat_left_ideal_init(&ideal); - { - quat_left_ideal_init(&ignored); - random_pair_of_equivalent_ideals(&ignored, &ideal); - quat_left_ideal_finalize(&ignored); - } -// quat_left_ideal_print(&ideal); - - ibz_vec_2_t vec1, vec2; - ibz_vec_2_init(&vec1); - ibz_vec_2_init(&vec2); - - // call it twice and make sure we get equivalent results - void id2iso_ideal_to_kernel_dlogs_odd(ibz_vec_2_t *vec, ec_degree_odd_t *deg, const quat_left_ideal_t *lideal); - ec_degree_odd_t deg1, deg2; - id2iso_ideal_to_kernel_dlogs_odd(&vec1, °1, &ideal); - id2iso_ideal_to_kernel_dlogs_odd(&vec2, °2, &ideal); - -// ibz_printf("vec1 = (%Zd, %Zd)\n", &vec1[0], &vec1[1]); -// ibz_printf("vec2 = (%Zd, %Zd)\n", &vec2[0], &vec2[1]); -// printf("deg1 = "); for (size_t i = 0; i < sizeof(deg1)/sizeof(*deg1); ++i) printf(",%d"+(!i), (int) deg1[i]); printf("\n"); -// printf("deg2 = "); for (size_t i = 0; i < sizeof(deg2)/sizeof(*deg2); ++i) printf(",%d"+(!i), (int) deg2[i]); printf("\n"); - - ibz_t lhs, rhs; - ibz_init(&lhs); - ibz_init(&rhs); - ibz_mul(&lhs, &vec1[0], &vec2[1]); - ibz_mul(&rhs, &vec2[0], &vec1[1]); - ibz_mod(&lhs, &lhs, &ideal.norm); - ibz_mod(&rhs, &rhs, &ideal.norm); -// ibz_printf("lhs = %Zd\n", &lhs); -// ibz_printf("rhs = %Zd\n", &rhs); - res &= !ibz_cmp(&lhs, &rhs); - ibz_finalize(&lhs); - ibz_finalize(&rhs); - - quat_left_ideal_finalize(&ideal); - - ibz_vec_2_finalize(&vec1); - ibz_vec_2_finalize(&vec2); - - return res; -} - -#include - -int _id2iso_test_id2ker_odd() -{ - int res = 1; - - ec_isog_odd_t isog1, isog2; - { - quat_left_ideal_t ideal1, ideal2; - quat_left_ideal_init(&ideal1); - quat_left_ideal_init(&ideal2); - - random_pair_of_equivalent_ideals(&ideal1, &ideal2); - -// quat_left_ideal_print(&ideal1); -// quat_left_ideal_print(&ideal2); - - id2iso_ideal_to_isogeny_odd(&isog1, &CURVE_E0, &BASIS_ODD_PLUS, &BASIS_ODD_MINUS, &ideal1); - id2iso_ideal_to_isogeny_odd(&isog2, &CURVE_E0, &BASIS_ODD_PLUS, &BASIS_ODD_MINUS, &ideal2); - - // check orders - { - if (!ibz_is_one(&ideal1.norm) && fp2_is_zero(&isog1.ker_plus.z) && fp2_is_zero(&isog1.ker_minus.z)) { - printf("norm of ideal1 is >1 but kernel is trivial; something is wrong!\n"); - res &= 0; - } - if (!ibz_is_one(&ideal2.norm) && fp2_is_zero(&isog2.ker_plus.z) && fp2_is_zero(&isog2.ker_minus.z)) { - printf("norm of ideal2 is >1 but kernel is trivial; something is wrong!\n"); - res &= 0; - } - } - - quat_left_ideal_finalize(&ideal1); - quat_left_ideal_finalize(&ideal2); - } - - { - ec_curve_t curve1, curve2; - ec_eval_odd(&curve1, &isog1, NULL, 0); - ec_eval_odd(&curve2, &isog2, NULL, 0); - - if (fp2_is_zero(&curve1.C) || fp2_is_zero(&curve2.C)) { - printf("broken curve constant after isogeny; something is wrong!\n"); - res &= 0; - } - - fp2_t j1, j2; - ec_j_inv(&j1, &curve1); - ec_j_inv(&j2, &curve2); - - res &= fp2_is_equal(&j1, &j2); - } - - return res; -} - - -int id2iso_test_id2ker_odd() { - int res = 1; - printf("\n \nRunning id2iso tests for ideal_to_kernel_odd() \n \n"); - - for (int i = 0; i < 5; i++) { - res &= _id2iso_test_id2kerdlogs_odd(); - res &= _id2iso_test_id2ker_odd(); - } - - if (!res) { - printf("ID2ISO unit test ideal_to_kernel_odd() failed\n"); - } - - return res; -} diff --git a/src/id2iso/ref/id2isox/test/ker2id.c b/src/id2iso/ref/id2isox/test/ker2id.c deleted file mode 100644 index 5f5f21f..0000000 --- a/src/id2iso/ref/id2isox/test/ker2id.c +++ /dev/null @@ -1,65 +0,0 @@ -#include "id2iso_tests.h" - -static void random_scalar(ibz_t *k) -{ - ibz_pow(k, &ibz_const_two, 123); - ibz_rand_interval(k, &ibz_const_zero, k); -} - -int _id2iso_test_ker2id() { - int res = 1; - - ibz_vec_2_t vec2, vec3; - ibz_vec_2_init(&vec2); - ibz_vec_2_init(&vec3); - - { - ibz_t gcd; - ibz_init(&gcd); - do { - random_scalar(&vec2[0]); - random_scalar(&vec2[1]); - ibz_gcd(&gcd, &vec2[0], &vec2[1]); - } while (ibz_divides(&gcd, &ibz_const_two)); - ibz_t three; - ibz_init(&three); - ibz_set(&three, 3); - do { - random_scalar(&vec3[0]); - random_scalar(&vec3[1]); - ibz_gcd(&gcd, &vec3[0], &vec3[1]); - } while (ibz_divides(&gcd, &three)); - ibz_finalize(&three); - ibz_finalize(&gcd); - } -// ibz_printf("vec2 = (%Zd,%Zd)\n", &vec2[0], &vec2[1]); -// ibz_printf("vec3 = (%Zd,%Zd)\n", &vec3[0], &vec3[1]); - - quat_left_ideal_t I; - quat_left_ideal_init(&I); - id2iso_kernel_dlogs_to_ideal(&I, &vec2, &vec3); -// quat_left_ideal_print(&I); - quat_left_ideal_finalize(&I); - ibz_vec_2_finalize(&vec2); - ibz_vec_2_finalize(&vec3); - - //TODO FIXME this really only tests that the function doesn't crash - - return res; -} - - -int id2iso_test_ker2id() { - int res = 1; - printf("\n \nRunning id2iso tests for kernel_dlogs_to_ideal() \n \n"); - - for (int i = 0; i < 10; i++) { - res &= _id2iso_test_ker2id(); - } - - if (!res) { - printf("ID2ISO unit test kernel_dlogs_to_ideal() failed\n"); - } - - return res; -} diff --git a/src/id2iso/ref/id2isox/test/test_id2iso.c b/src/id2iso/ref/id2isox/test/test_id2iso.c deleted file mode 100644 index 511f2f9..0000000 --- a/src/id2iso/ref/id2isox/test/test_id2iso.c +++ /dev/null @@ -1,24 +0,0 @@ - -#include "id2iso_tests.h" - -// run all tests in module -int main(){ - int res = 1; - - randombytes_init((unsigned char *) "some", (unsigned char *) "string", 128); - - printf("Running id2iso module unit tests\n"); - - res = res & id2iso_test_ker2id(); - res = res & id2iso_test_id2ker_even(); - res = res & id2iso_test_id2ker_odd(); - res = res & id2iso_test_id2iso(); - - if(!res){ - printf("\nSome tests failed!\n"); - } - else { - printf("All tests passed!\n"); - } - return(!res); -} diff --git a/src/id2iso/ref/include/id2iso.h b/src/id2iso/ref/include/id2iso.h index 83b7249..1b4eaae 100644 --- a/src/id2iso/ref/include/id2iso.h +++ b/src/id2iso/ref/include/id2iso.h @@ -1,139 +1,280 @@ /** @file - * + * * @authors Antonin Leroux - * - * @brief The id2iso algorithms + * + * @brief The id2iso algorithms */ #ifndef ID2ISO_H #define ID2ISO_H -#include -#include -#include +#include #include +#include +#include +#include +#include +#include +#include /** @defgroup id2iso_id2iso Ideal to isogeny conversion * @{ -*/ - -/** @defgroup id2iso_iso_types Types for isogenies needed for the id2iso - * @{ -*/ - -/** @brief Type for long chain of two isogenies - * - * @typedef id2iso_long_two_isog - * - * Represented as a vector ec_isog_even_t -*/ -typedef struct id2iso_long_two_isog { - unsigned short length; ///< the number of smaller two isogeny chains - ec_isog_even_t *chain; ///< the chain of two isogeny -} id2iso_long_two_isog_t; - -/** @brief Type for compressed long chain of two isogenies - * - * @typedef id2iso_compressed_long_two_isog - * - * Represented as a vector of intbig -*/ -typedef struct id2iso_compressed_long_two_isog { - unsigned short length; ///< the number of smaller two isogeny chains - ibz_t *zip_chain; ///< the chain of two isogeny, compressed - unsigned char bit_first_step ; ///< the bit for the first step -} id2iso_compressed_long_two_isog_t; - -/** @} -*/ + */ +static const quat_represent_integer_params_t QUAT_represent_integer_params = { + .algebra = &QUATALG_PINFTY, /// The level-specific quaternion algebra + .order = &(EXTREMAL_ORDERS[0]), // The special extremal order O0 + .primality_test_iterations = QUAT_primality_num_iter // precompted bound on the iteration number in primality tests +}; /*************************** Functions *****************************/ - -/** @defgroup id2iso Constructors and Destructors - * @{ -*/ -void id2iso_long_two_isog_init(id2iso_long_two_isog_t *isog, const size_t length); -void id2iso_long_two_isog_finalize(id2iso_long_two_isog_t *isog); - -void id2iso_compressed_long_two_isog_init(id2iso_compressed_long_two_isog_t *zip, const size_t length); -void id2iso_compressed_long_two_isog_finalize(id2iso_compressed_long_two_isog_t *zip); - -/** @} -*/ - /** @defgroup id2iso_others Other functions needed for id2iso * @{ -*/ - -/** - * @brief Translating an ideal of norm a big power of 2 into the corresponding isogeny - * - * @param isog_zip Output : compression of the output isogeny - * @param basis_minus : odd torsion basis (in the end, this will be the basis pushed through the output isogeny) - * @param basis_plus : odd torsion basis (in the end, this will be the basis pushed through the output isogeny) - * @param domain : the starting curve (in the end, this will be the codomain of the output isogeny) - * @param kernel_dual : the dual of the kernel of the last step of isog_start_two (in the end this will be the kernel of the dual of the last step of the output isogeny) - * @param gen_input : quaternion element, element of a maximal order O, generator of the O-ideal to be translated - * @param length : the length of the chain to be translated - * @param lideal_start_small : a small ideal equivalent to lideal_start_two of right order equal to O - * @param lideal_start_two : O0-ideal of norm a power of 2 equivalent to lideal_start_small, corresponding to an isogeny isog_start_two - * @param gen_two element of O0, generator of lideal_start_two - * @param Bpoo : the quaternion algebra - * @returns a bit indicating if the computation succeeded - * /!\ the composition of isog_start_two and isog might be backtracking - * lideal_start_two = O0 < gen_two , 2^*> - * lideal_start_small = O0 < conj(gen_two), * > - * lideal_start_small = lideal_lideal_start_two * conj(gen_two) / 2^* - * The ideal to be translated is equal to O < gen_input, 2^e> where O = OR(lideal_start_small) - * - * assumes that the ideal given in input has exactly norm 2^e where e = length * f (where f = TORSION_PLUS_EVEN_POWER) - * when used for compressing an isogeny, we assume that the curve given in input is normalized - */ -int id2iso_ideal_to_isogeny_two_long_power_of_2(id2iso_compressed_long_two_isog_t *isog_zip, ec_curve_t *domain, ec_basis_t *basis_minus, ec_basis_t *basis_plus, ec_point_t *kernel_dual, const quat_alg_elem_t *gen_input, const int length, const quat_left_ideal_t *lideal_start_small, const quat_left_ideal_t *lideal_start_two, const quat_alg_elem_t *gen_two, const quat_alg_t *Bpoo); - -/** - * @brief Translating an ideal of odd norm dividing p²-1 into the corresponding isogeny - * - * @param isog Output : the output isogeny - * @param basis_minus : a basis of ec points - * @param basis_plus : a basis of ec points - * @param domain : an elliptic curve - * @param lideal_input : O0-ideal corresponding to the ideal to be translated - * - * compute the isogeny starting from domain corresponding to ideal_input - * the coefficients extracted from the ideal are to be applied to basis_minus and basis_plus to compute the kernel of the isogeny. - * */ -void id2iso_ideal_to_isogeny_odd(ec_isog_odd_t *isog, const ec_curve_t *domain, const ec_basis_t *basis_plus,const ec_basis_t *basis_minus, const quat_left_ideal_t *lideal_input); - /** - * @brief Translating an ideal of norm a power of two dividing p²-1 into the corresponding isogeny + * @brief Scalar multiplication [x]P + [y]Q where x and y are stored inside an + * ibz_vec_2_t [x, y] and P, Q in E[2^f] + * + * @param res Output: the point R = [x]P + [y]Q + * @param scalar_vec: a vector of ibz type elements (x, y) + * @param f: an integer such that P, Q are in E[2^f] + * @param PQ: an x-only basis x(P), x(Q) and x(P-Q) + * @param curve: the curve E the points P, Q, R are defined on * - * @param isog Output : the output isogeny - * @param lideal_input : O0-ideal corresponding to the ideal to be translated - * */ - -void id2iso_ideal_to_isogeny_even(ec_isog_even_t *isog, const quat_left_ideal_t *lideal_input); - +void ec_biscalar_mul_ibz_vec(ec_point_t *res, + const ibz_vec_2_t *scalar_vec, + const int f, + const ec_basis_t *PQ, + const ec_curve_t *curve); /** - * @brief Translating a kernel on the curve E0, represented as two vectors with respect to the precomputed 2^f- and 3^e-torsion bases, into the corresponding O0-ideal + * @brief Translating an ideal of norm 2^f dividing p²-1 into the corresponding + * kernel coefficients + * + * @param ker_dlog Output : two coefficients indicating the decomposition of the + * kernel over the canonical basis of E0[2^f] + * @param lideal_input : O0-ideal corresponding to the ideal to be translated of + * norm 2^f + * + */ +void id2iso_ideal_to_kernel_dlogs_even(ibz_vec_2_t *ker_dlog, const quat_left_ideal_t *lideal_input); + +/** + * @brief Applies some 2x2 matrix on a basis of E[2^TORSION_EVEN_POWER] + * + * @param P the basis + * @param E the curve + * @param mat the matrix + * @param f TORSION_EVEN_POWER + * @returns 1 if success, 0 if error + * + * helper function, works in place + * + */ +int matrix_application_even_basis(ec_basis_t *P, const ec_curve_t *E, ibz_mat_2x2_t *mat, int f); + +/** + * @brief Applies some endomorphism of an alternate curve to E[f] + * + * @param P the basis + * @param index_alternate_curve index of the alternate order in the list of precomputed extremal + * orders + * @param E the curve (E is not required to be the alternate curve in question since in the end we + * only apply a matrix) + * @param theta the endomorphism + * @param f TORSION_EVEN_POWER + * + * helper function, works in place + * + */ +void endomorphism_application_even_basis(ec_basis_t *P, + const int index_alternate_curve, + const ec_curve_t *E, + const quat_alg_elem_t *theta, + int f); + +/** + * @brief Translating a kernel on the curve E0, represented as a vector with + * respect to the precomputed 2^f-torsion basis, into the corresponding O0-ideal * * @param lideal Output : the output O0-ideal - * @param vec2 : length-2 vector giving the 2-power part of the kernel with respect to the precomputed TORSION_PLUS_2POWER basis - * @param vec3 : length-2 vector giving the 3-power part of the kernel with respect to the precomputed TORSION_PLUS_3POWER basis + * @param f : exponent definining the norm of the ideal to compute + * @param vec2 : length-2 vector giving the 2-power part of the kernel with + * respect to the precomputed 2^f basis * */ -void id2iso_kernel_dlogs_to_ideal(quat_left_ideal_t *lideal, const ibz_vec_2_t *vec2, const ibz_vec_2_t *vec3); +void id2iso_kernel_dlogs_to_ideal_even(quat_left_ideal_t *lideal, const ibz_vec_2_t *vec2, int f); + +/** + * @brief Change of basis matrix for full basis B2 + * Finds mat such that: + * (mat*v).B2 = v.B1 + * where "." is the dot product, defined as (v1,v2).(P,Q) = v1*P + v2*Q + * + * @param mat the computed change of basis matrix + * @param B1 the source basis for E[2^f] + * @param B2 the target basis for E[2^e] + * @param E the elliptic curve + * @param f 2^f is the order of the points of the input basis + * + * mat encodes the coordinates of the points of B1 in the basis B2 + */ +void change_of_basis_matrix_tate(ibz_mat_2x2_t *mat, const ec_basis_t *B1, const ec_basis_t *B2, ec_curve_t *E, int f); + +/** + * @brief Change of basis matrix for full basis B2 + * Finds mat such that: + * (mat*v).B1 = [2^e-f]*v.B2 + * where "." is the dot product, defined as (v1,v2).(P,Q) = v1*P + v2*Q + * + * @param mat the computed change of basis matrix + * @param B1 the source basis for E[2^e] + * @param B2 the target basis for E[2^f] + * @param E the elliptic curve + * @param f 2^f is the order of the points of the input basis + * + * mat encodes the coordinates of the points of B1 in the basis B2, by + * applying change_of_basis_matrix_tate and inverting the outcome + */ +void change_of_basis_matrix_tate_invert(ibz_mat_2x2_t *mat, + const ec_basis_t *B1, + const ec_basis_t *B2, + ec_curve_t *E, + int f); /** @} */ + +/** @defgroup id2iso_arbitrary Arbitrary isogeny evaluation + * @{ + */ +/** + * @brief Function to find elements u, v, d1, d2, beta1, beta2 for the ideal to isogeny + * + * @param u Output: integer + * @param v Output: integer + * @param beta1 Output: quaternion element + * @param beta2 Output: quaternion element + * @param d1 Output: integer + * @param d2 Output: integer + * @param index_alternate_order_1 Output: small integer (index of an alternate order) + * @param index_alternate_order_2 Output: small integer (index of an alternate order) + * @param target : integer, target norm + * @param lideal : O0-ideal defining the search space + * @param Bpoo : quaternion algebra + * @param num_alternate_order number of alternate order we consider + * @returns 1 if the computation succeeds, 0 otherwise + * + * Let us write ti = index_alternate_order_i, + * we look for u,v,beta1,beta2,d1,d2,t1,t2 + * such that u d1 + v d2 = target + * and where di = norm(betai)/norm(Ii), where the ideal Ii is equal to overbar{Ji} * lideal and + * betai is in Ii where Ji is a connecting ideal between the maximal order O0 and O_ti t1,t2 must be + * contained between 0 and num_alternate_order This corresponds to the function SuitableIdeals in + * the spec + */ +int find_uv(ibz_t *u, + ibz_t *v, + quat_alg_elem_t *beta1, + quat_alg_elem_t *beta2, + ibz_t *d1, + ibz_t *d2, + int *index_alternate_order_1, + int *index_alternate_order_2, + const ibz_t *target, + const quat_left_ideal_t *lideal, + const quat_alg_t *Bpoo, + int num_alternate_order); + +/** + * @brief Computes an arbitrary isogeny of fixed degree starting from E0 + * and evaluates it a list of points of the form (P1,0) or (0,P2). + * + * @param lideal Output : an ideal of norm u + * @param u : integer + * @param small : bit indicating if we the value of u is "small" meaning that we + expect it to be + * around sqrt{p}, in that case we use a length slightly above + * @param E34 Output: the codomain curve + * @param P12 Input/Output: pointer to points to be pushed through the isogeny + (in-place) + * @param numP: length of the list of points given in P12 (can be zero) + * @param index_alternate_order : index of the special extremal order to be used (in the list of + these orders) + * @returns the length of the chain if the computation succeeded, zero upon + failure + * + * F is an isogeny encoding an isogeny [adjust]*phi : E0 -> Eu of degree u + * note that the codomain of F can be either Eu x Eu' or Eu' x Eu for some curve + Eu' + */ +int fixed_degree_isogeny_and_eval(quat_left_ideal_t *lideal, + const ibz_t *u, + bool small, + theta_couple_curve_t *E34, + theta_couple_point_t *P12, + size_t numP, + const int index_alternate_order); + +/** + * @brief Translating an ideal into a representation of the corresponding + * isogeny + * + * @param beta1 Output: quaternion element + * @param beta2 Output: quaternion element + * @param u Output: integer + * @param v Output: integer + * @param d1 Output: integer + * @param d2 Output: integer + * @param codomain the codomain of the isogeny corresponding to lideal + * @param basis Output : evaluation of the canonical basis of E0 through the + * ideal corresponding to lideal + * @param lideal : O0 - ideal in input + * @param Bpoo : the quaternion algebra + * @returns 1 if the computation succeeded, 0 otherwise + * + * Compute the codomain and image on the basis of E0 of the isogeny + * E0 -> codomain corresponding to lideal + * + * There is some integer e >= 0 such that + * 2^e * u, 2^e * v,beta1, beta2, d1, d2 are the output of find_uv + * on input target = 2^TORSION_PLUS_EVEN_POWER and lideal + * + * codomain and basis are computed with the help of a dimension 2 isogeny + * of degree 2^TORSION_PLUS_EVEN_POWER - e using a Kani diagram + * + */ +int dim2id2iso_ideal_to_isogeny_clapotis(quat_alg_elem_t *beta1, + quat_alg_elem_t *beta2, + ibz_t *u, + ibz_t *v, + ibz_t *d1, + ibz_t *d2, + ec_curve_t *codomain, + ec_basis_t *basis, + const quat_left_ideal_t *lideal, + const quat_alg_t *Bpoo); + +/** + * @brief Translating an ideal into a representation of the corresponding + * isogeny + * + * @param basis Output : evaluation of the canonical basis of E0 through the + * ideal corresponding to lideal + * @param lideal : ideal in input + * @param codomain + * @returns 1 if the computation succeeds, 0 otherwise + * + * This is a wrapper around the ideal to isogeny clapotis function + */ +int dim2id2iso_arbitrary_isogeny_evaluation(ec_basis_t *basis, ec_curve_t *codomain, const quat_left_ideal_t *lideal); + /** @} */ - +/** @} + */ #endif diff --git a/src/id2iso/ref/lvl1/CMakeLists.txt b/src/id2iso/ref/lvl1/CMakeLists.txt index 17c5e1b..c7637fa 100644 --- a/src/id2iso/ref/lvl1/CMakeLists.txt +++ b/src/id2iso/ref/lvl1/CMakeLists.txt @@ -1,10 +1 @@ - -set(SOURCE_FILES_ID2ISO_GENERIC_REF - ${ID2ISOX_DIR}/id2iso.c -) - -add_library(${LIB_ID2ISO_${SVARIANT_UPPER}} ${SOURCE_FILES_ID2ISO_GENERIC_REF}) -target_include_directories(${LIB_ID2ISO_${SVARIANT_UPPER}} PRIVATE common ${INC_PUBLIC} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_ID2ISO} ${INC_COMMON} ${INC_GF_${SVARIANT_UPPER}}) -target_compile_options(${LIB_ID2ISO_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) +include(../lvlx.cmake) diff --git a/src/id2iso/ref/lvl1/test/CMakeLists.txt b/src/id2iso/ref/lvl1/test/CMakeLists.txt index d5c520f..316e0a8 100644 --- a/src/id2iso/ref/lvl1/test/CMakeLists.txt +++ b/src/id2iso/ref/lvl1/test/CMakeLists.txt @@ -1,12 +1 @@ -set(SOURCE_FILES_ID2ISO_GENERIC_REF_TESTS - ${ID2ISOX_DIR}/test/ker2id.c - ${ID2ISOX_DIR}/test/id2ker_even.c - ${ID2ISOX_DIR}/test/id2ker_odd.c - ${ID2ISOX_DIR}/test/id2iso.c - ${ID2ISOX_DIR}/test/test_id2iso.c -) -add_executable(sqisign_test_id2iso_${SVARIANT_LOWER} ${SOURCE_FILES_ID2ISO_GENERIC_REF_TESTS}) -target_link_libraries(sqisign_test_id2iso_${SVARIANT_LOWER} ${LIB_ID2ISO_${SVARIANT_UPPER}} ${LIB_KLPT_${SVARIANT_UPPER}} ${LIB_QUATERNION} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_INTBIG} ${LIB_PUBLIC} ${GMP} sqisign_common_sys ) -target_include_directories(sqisign_test_id2iso_${SVARIANT_LOWER} PRIVATE ${INC_PUBLIC} ${INC_INTBIG} ${INC_EC} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ${INC_ID2ISO} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ./include/ ) - -add_test(sqisign_test_id2iso_${SVARIANT_LOWER} sqisign_test_id2iso_${SVARIANT_LOWER}) +include(../../lvlx_test.cmake) diff --git a/src/id2iso/ref/lvl3/CMakeLists.txt b/src/id2iso/ref/lvl3/CMakeLists.txt index 17c5e1b..c7637fa 100644 --- a/src/id2iso/ref/lvl3/CMakeLists.txt +++ b/src/id2iso/ref/lvl3/CMakeLists.txt @@ -1,10 +1 @@ - -set(SOURCE_FILES_ID2ISO_GENERIC_REF - ${ID2ISOX_DIR}/id2iso.c -) - -add_library(${LIB_ID2ISO_${SVARIANT_UPPER}} ${SOURCE_FILES_ID2ISO_GENERIC_REF}) -target_include_directories(${LIB_ID2ISO_${SVARIANT_UPPER}} PRIVATE common ${INC_PUBLIC} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_ID2ISO} ${INC_COMMON} ${INC_GF_${SVARIANT_UPPER}}) -target_compile_options(${LIB_ID2ISO_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) +include(../lvlx.cmake) diff --git a/src/id2iso/ref/lvl3/test/CMakeLists.txt b/src/id2iso/ref/lvl3/test/CMakeLists.txt index d5c520f..316e0a8 100644 --- a/src/id2iso/ref/lvl3/test/CMakeLists.txt +++ b/src/id2iso/ref/lvl3/test/CMakeLists.txt @@ -1,12 +1 @@ -set(SOURCE_FILES_ID2ISO_GENERIC_REF_TESTS - ${ID2ISOX_DIR}/test/ker2id.c - ${ID2ISOX_DIR}/test/id2ker_even.c - ${ID2ISOX_DIR}/test/id2ker_odd.c - ${ID2ISOX_DIR}/test/id2iso.c - ${ID2ISOX_DIR}/test/test_id2iso.c -) -add_executable(sqisign_test_id2iso_${SVARIANT_LOWER} ${SOURCE_FILES_ID2ISO_GENERIC_REF_TESTS}) -target_link_libraries(sqisign_test_id2iso_${SVARIANT_LOWER} ${LIB_ID2ISO_${SVARIANT_UPPER}} ${LIB_KLPT_${SVARIANT_UPPER}} ${LIB_QUATERNION} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_INTBIG} ${LIB_PUBLIC} ${GMP} sqisign_common_sys ) -target_include_directories(sqisign_test_id2iso_${SVARIANT_LOWER} PRIVATE ${INC_PUBLIC} ${INC_INTBIG} ${INC_EC} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ${INC_ID2ISO} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ./include/ ) - -add_test(sqisign_test_id2iso_${SVARIANT_LOWER} sqisign_test_id2iso_${SVARIANT_LOWER}) +include(../../lvlx_test.cmake) diff --git a/src/id2iso/ref/lvl5/CMakeLists.txt b/src/id2iso/ref/lvl5/CMakeLists.txt index 17c5e1b..c7637fa 100644 --- a/src/id2iso/ref/lvl5/CMakeLists.txt +++ b/src/id2iso/ref/lvl5/CMakeLists.txt @@ -1,10 +1 @@ - -set(SOURCE_FILES_ID2ISO_GENERIC_REF - ${ID2ISOX_DIR}/id2iso.c -) - -add_library(${LIB_ID2ISO_${SVARIANT_UPPER}} ${SOURCE_FILES_ID2ISO_GENERIC_REF}) -target_include_directories(${LIB_ID2ISO_${SVARIANT_UPPER}} PRIVATE common ${INC_PUBLIC} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_ID2ISO} ${INC_COMMON} ${INC_GF_${SVARIANT_UPPER}}) -target_compile_options(${LIB_ID2ISO_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) +include(../lvlx.cmake) diff --git a/src/id2iso/ref/lvl5/test/CMakeLists.txt b/src/id2iso/ref/lvl5/test/CMakeLists.txt index d5c520f..316e0a8 100644 --- a/src/id2iso/ref/lvl5/test/CMakeLists.txt +++ b/src/id2iso/ref/lvl5/test/CMakeLists.txt @@ -1,12 +1 @@ -set(SOURCE_FILES_ID2ISO_GENERIC_REF_TESTS - ${ID2ISOX_DIR}/test/ker2id.c - ${ID2ISOX_DIR}/test/id2ker_even.c - ${ID2ISOX_DIR}/test/id2ker_odd.c - ${ID2ISOX_DIR}/test/id2iso.c - ${ID2ISOX_DIR}/test/test_id2iso.c -) -add_executable(sqisign_test_id2iso_${SVARIANT_LOWER} ${SOURCE_FILES_ID2ISO_GENERIC_REF_TESTS}) -target_link_libraries(sqisign_test_id2iso_${SVARIANT_LOWER} ${LIB_ID2ISO_${SVARIANT_UPPER}} ${LIB_KLPT_${SVARIANT_UPPER}} ${LIB_QUATERNION} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_INTBIG} ${LIB_PUBLIC} ${GMP} sqisign_common_sys ) -target_include_directories(sqisign_test_id2iso_${SVARIANT_LOWER} PRIVATE ${INC_PUBLIC} ${INC_INTBIG} ${INC_EC} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ${INC_ID2ISO} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ./include/ ) - -add_test(sqisign_test_id2iso_${SVARIANT_LOWER} sqisign_test_id2iso_${SVARIANT_LOWER}) +include(../../lvlx_test.cmake) diff --git a/src/id2iso/ref/lvlx.cmake b/src/id2iso/ref/lvlx.cmake new file mode 100644 index 0000000..9b8c0f9 --- /dev/null +++ b/src/id2iso/ref/lvlx.cmake @@ -0,0 +1,12 @@ +set(SOURCE_FILES_ID2ISO_GENERIC_REF + ${LVLX_DIR}/id2iso.c + ${LVLX_DIR}/dim2id2iso.c +) + +add_library(${LIB_ID2ISO_${SVARIANT_UPPER}} STATIC ${SOURCE_FILES_ID2ISO_GENERIC_REF}) +target_link_libraries(${LIB_ID2ISO_${SVARIANT_UPPER}} ${LIB_QUATERNION} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_MP} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}} ${LIB_HD_${SVARIANT_UPPER}}) +target_include_directories(${LIB_ID2ISO_${SVARIANT_UPPER}} PRIVATE ${INC_PUBLIC} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_MP} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_HD} ${INC_ID2ISO} ${INC_COMMON}) +target_compile_options(${LIB_ID2ISO_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) +target_compile_definitions(${LIB_ID2ISO_${SVARIANT_UPPER}} PUBLIC SQISIGN_VARIANT=${SVARIANT_LOWER}) + +add_subdirectory(test) diff --git a/src/id2iso/ref/lvlx/dim2id2iso.c b/src/id2iso/ref/lvlx/dim2id2iso.c new file mode 100644 index 0000000..171473d --- /dev/null +++ b/src/id2iso/ref/lvlx/dim2id2iso.c @@ -0,0 +1,1172 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int +_fixed_degree_isogeny_impl(quat_left_ideal_t *lideal, + const ibz_t *u, + bool small, + theta_couple_curve_t *E34, + theta_couple_point_t *P12, + size_t numP, + const int index_alternate_order) +{ + + // var declaration + int ret; + ibz_t two_pow, tmp; + quat_alg_elem_t theta; + + ec_curve_t E0; + copy_curve(&E0, &CURVES_WITH_ENDOMORPHISMS[index_alternate_order].curve); + ec_curve_normalize_A24(&E0); + + unsigned length; + + int u_bitsize = ibz_bitsize(u); + + // deciding the power of 2 of the dim2 isogeny we use for this + // the smaller the faster, but if it set too low there is a risk that + // RepresentInteger will fail + if (!small) { + // in that case, we just set it to be the biggest value possible + length = TORSION_EVEN_POWER - HD_extra_torsion; + } else { + length = ibz_bitsize(&QUATALG_PINFTY.p) + QUAT_repres_bound_input - u_bitsize; + assert(u_bitsize < (int)length); + assert(length < TORSION_EVEN_POWER - HD_extra_torsion); + } + assert(length); + + // var init + ibz_init(&two_pow); + ibz_init(&tmp); + quat_alg_elem_init(&theta); + + ibz_pow(&two_pow, &ibz_const_two, length); + ibz_copy(&tmp, u); + assert(ibz_cmp(&two_pow, &tmp) > 0); + assert(!ibz_is_even(&tmp)); + + // computing the endomorphism theta of norm u * (2^(length) - u) + ibz_sub(&tmp, &two_pow, &tmp); + ibz_mul(&tmp, &tmp, u); + assert(!ibz_is_even(&tmp)); + + // setting-up the quat_represent_integer_params + quat_represent_integer_params_t ri_params; + ri_params.primality_test_iterations = QUAT_represent_integer_params.primality_test_iterations; + + quat_p_extremal_maximal_order_t order_hnf; + quat_alg_elem_init(&order_hnf.z); + quat_alg_elem_copy(&order_hnf.z, &EXTREMAL_ORDERS[index_alternate_order].z); + quat_alg_elem_init(&order_hnf.t); + quat_alg_elem_copy(&order_hnf.t, &EXTREMAL_ORDERS[index_alternate_order].t); + quat_lattice_init(&order_hnf.order); + ibz_copy(&order_hnf.order.denom, &EXTREMAL_ORDERS[index_alternate_order].order.denom); + ibz_mat_4x4_copy(&order_hnf.order.basis, &EXTREMAL_ORDERS[index_alternate_order].order.basis); + order_hnf.q = EXTREMAL_ORDERS[index_alternate_order].q; + ri_params.order = &order_hnf; + ri_params.algebra = &QUATALG_PINFTY; + +#ifndef NDEBUG + assert(quat_lattice_contains(NULL, &ri_params.order->order, &ri_params.order->z)); + assert(quat_lattice_contains(NULL, &ri_params.order->order, &ri_params.order->t)); +#endif + + ret = quat_represent_integer(&theta, &tmp, 1, &ri_params); + + assert(!ibz_is_even(&tmp)); + + if (!ret) { + printf("represent integer failed for the alternate order number %d and for " + "a target of " + "size %d for a u of size %d with length = " + "%u \n", + index_alternate_order, + ibz_bitsize(&tmp), + ibz_bitsize(u), + length); + goto cleanup; + } + quat_lideal_create(lideal, &theta, u, &order_hnf.order, &QUATALG_PINFTY); + + quat_alg_elem_finalize(&order_hnf.z); + quat_alg_elem_finalize(&order_hnf.t); + quat_lattice_finalize(&order_hnf.order); + +#ifndef NDEBUG + ibz_t test_norm, test_denom; + ibz_init(&test_denom); + ibz_init(&test_norm); + quat_alg_norm(&test_norm, &test_denom, &theta, &QUATALG_PINFTY); + assert(ibz_is_one(&test_denom)); + assert(ibz_cmp(&test_norm, &tmp) == 0); + assert(!ibz_is_even(&tmp)); + assert(quat_lattice_contains(NULL, &EXTREMAL_ORDERS[index_alternate_order].order, &theta)); + ibz_finalize(&test_norm); + ibz_finalize(&test_denom); +#endif + + ec_basis_t B0_two; + // copying the basis + copy_basis(&B0_two, &CURVES_WITH_ENDOMORPHISMS[index_alternate_order].basis_even); + assert(test_basis_order_twof(&B0_two, &E0, TORSION_EVEN_POWER)); + ec_dbl_iter_basis(&B0_two, TORSION_EVEN_POWER - length - HD_extra_torsion, &B0_two, &E0); + + assert(test_basis_order_twof(&B0_two, &E0, length + HD_extra_torsion)); + + // now we set-up the kernel + theta_couple_point_t T1; + theta_couple_point_t T2, T1m2; + + copy_point(&T1.P1, &B0_two.P); + copy_point(&T2.P1, &B0_two.Q); + copy_point(&T1m2.P1, &B0_two.PmQ); + + // multiplication of theta by (u)^-1 mod 2^(length+2) + ibz_mul(&two_pow, &two_pow, &ibz_const_two); + ibz_mul(&two_pow, &two_pow, &ibz_const_two); + ibz_copy(&tmp, u); + ibz_invmod(&tmp, &tmp, &two_pow); + assert(!ibz_is_even(&tmp)); + + ibz_mul(&theta.coord[0], &theta.coord[0], &tmp); + ibz_mul(&theta.coord[1], &theta.coord[1], &tmp); + ibz_mul(&theta.coord[2], &theta.coord[2], &tmp); + ibz_mul(&theta.coord[3], &theta.coord[3], &tmp); + + // applying theta to the basis + ec_basis_t B0_two_theta; + copy_basis(&B0_two_theta, &B0_two); + endomorphism_application_even_basis(&B0_two_theta, index_alternate_order, &E0, &theta, length + HD_extra_torsion); + + // Ensure the basis we're using has the expected order + assert(test_basis_order_twof(&B0_two_theta, &E0, length + HD_extra_torsion)); + + // Set-up the domain E0 x E0 + theta_couple_curve_t E00; + E00.E1 = E0; + E00.E2 = E0; + + // Set-up the kernel from the bases + theta_kernel_couple_points_t dim_two_ker; + copy_bases_to_kernel(&dim_two_ker, &B0_two, &B0_two_theta); + + ret = theta_chain_compute_and_eval(length, &E00, &dim_two_ker, true, E34, P12, numP); + if (!ret) + goto cleanup; + + assert(length); + ret = (int)length; + +cleanup: + // var finalize + ibz_finalize(&two_pow); + ibz_finalize(&tmp); + quat_alg_elem_finalize(&theta); + + return ret; +} + +int +fixed_degree_isogeny_and_eval(quat_left_ideal_t *lideal, + const ibz_t *u, + bool small, + theta_couple_curve_t *E34, + theta_couple_point_t *P12, + size_t numP, + const int index_alternate_order) +{ + return _fixed_degree_isogeny_impl(lideal, u, small, E34, P12, numP, index_alternate_order); +} + +// takes the output of LLL and apply some small treatment on the basis +// reordering vectors and switching some signs if needed to make it in a nicer +// shape +static void +post_LLL_basis_treatment(ibz_mat_4x4_t *gram, ibz_mat_4x4_t *reduced, const ibz_t *norm, bool is_special_order) +{ + // if the left order is the special one, then we apply some additional post + // treatment + if (is_special_order) { + // reordering the basis if needed + if (ibz_cmp(&(*gram)[0][0], &(*gram)[2][2]) == 0) { + for (int i = 0; i < 4; i++) { + ibz_swap(&(*reduced)[i][1], &(*reduced)[i][2]); + } + ibz_swap(&(*gram)[0][2], &(*gram)[0][1]); + ibz_swap(&(*gram)[2][0], &(*gram)[1][0]); + ibz_swap(&(*gram)[3][2], &(*gram)[3][1]); + ibz_swap(&(*gram)[2][3], &(*gram)[1][3]); + ibz_swap(&(*gram)[2][2], &(*gram)[1][1]); + } else if (ibz_cmp(&(*gram)[0][0], &(*gram)[3][3]) == 0) { + for (int i = 0; i < 4; i++) { + ibz_swap(&(*reduced)[i][1], &(*reduced)[i][3]); + } + ibz_swap(&(*gram)[0][3], &(*gram)[0][1]); + ibz_swap(&(*gram)[3][0], &(*gram)[1][0]); + ibz_swap(&(*gram)[2][3], &(*gram)[2][1]); + ibz_swap(&(*gram)[3][2], &(*gram)[1][2]); + ibz_swap(&(*gram)[3][3], &(*gram)[1][1]); + } else if (ibz_cmp(&(*gram)[1][1], &(*gram)[3][3]) == 0) { + // in this case it seems that we need to swap the second and third + // element, and then recompute entirely the second element from the first + // first we swap the second and third element + for (int i = 0; i < 4; i++) { + ibz_swap(&(*reduced)[i][1], &(*reduced)[i][2]); + } + ibz_swap(&(*gram)[0][2], &(*gram)[0][1]); + ibz_swap(&(*gram)[2][0], &(*gram)[1][0]); + ibz_swap(&(*gram)[3][2], &(*gram)[3][1]); + ibz_swap(&(*gram)[2][3], &(*gram)[1][3]); + ibz_swap(&(*gram)[2][2], &(*gram)[1][1]); + } + + // adjusting the sign if needed + if (ibz_cmp(&(*reduced)[0][0], &(*reduced)[1][1]) != 0) { + for (int i = 0; i < 4; i++) { + ibz_neg(&(*reduced)[i][1], &(*reduced)[i][1]); + ibz_neg(&(*gram)[i][1], &(*gram)[i][1]); + ibz_neg(&(*gram)[1][i], &(*gram)[1][i]); + } + } + if (ibz_cmp(&(*reduced)[0][2], &(*reduced)[1][3]) != 0) { + for (int i = 0; i < 4; i++) { + ibz_neg(&(*reduced)[i][3], &(*reduced)[i][3]); + ibz_neg(&(*gram)[i][3], &(*gram)[i][3]); + ibz_neg(&(*gram)[3][i], &(*gram)[3][i]); + } + // assert(ibz_cmp(&(*reduced)[0][2],&(*reduced)[1][3])==0); + } + } +} + +// enumerate all vectors in an hypercube of norm m for the infinity norm +// with respect to a basis whose gram matrix is given by gram +// Returns an int `count`, the number of vectors found with the desired +// properties +static int +enumerate_hypercube(ibz_vec_4_t *vecs, ibz_t *norms, int m, const ibz_mat_4x4_t *gram, const ibz_t *adjusted_norm) +{ + + ibz_t remain, norm; + ibz_vec_4_t point; + + ibz_init(&remain); + ibz_init(&norm); + ibz_vec_4_init(&point); + + assert(m > 0); + + int count = 0; + int dim = 2 * m + 1; + int dim2 = dim * dim; + int dim3 = dim2 * dim; + + // if the basis is of the form alpha, i*alpha, beta, i*beta + // we can remove some values due to symmetry of the basis that + bool need_remove_symmetry = + (ibz_cmp(&(*gram)[0][0], &(*gram)[1][1]) == 0 && ibz_cmp(&(*gram)[3][3], &(*gram)[2][2]) == 0); + + int check1, check2, check3; + + // Enumerate over points in a hypercube with coordinates (x, y, z, w) + for (int x = -m; x <= 0; x++) { // We only check non-positive x-values + for (int y = -m; y < m + 1; y++) { + // Once x = 0 we only consider non-positive y values + if (x == 0 && y > 0) { + break; + } + for (int z = -m; z < m + 1; z++) { + // If x and y are both zero, we only consider non-positive z values + if (x == 0 && y == 0 && z > 0) { + break; + } + for (int w = -m; w < m + 1; w++) { + // If x, y, z are all zero, we only consider negative w values + if (x == 0 && y == 0 && z == 0 && w >= 0) { + break; + } + + // Now for each candidate (x, y, z, w) we need to check a number of + // conditions We have already filtered for symmetry with several break + // statements, but there are more checks. + + // 1. We do not allow all (x, y, z, w) to be multiples of 2 + // 2. We do not allow all (x, y, z, w) to be multiples of 3 + // 3. We do not want elements of the same norm, so we quotient out the + // action + // of a group of order four generated by i for a basis expected to + // be of the form: [gamma, i gamma, beta, i beta ]. + + // Ensure that not all values are even + if (!((x | y | z | w) & 1)) { + continue; + } + // Ensure that not all values are multiples of three + if (x % 3 == 0 && y % 3 == 0 && z % 3 == 0 && w % 3 == 0) { + continue; + } + + check1 = (m + w) + dim * (m + z) + dim2 * (m + y) + dim3 * (m + x); + check2 = (m - z) + dim * (m + w) + dim2 * (m - x) + dim3 * (m + y); + check3 = (m + z) + dim * (m - w) + dim2 * (m + x) + dim3 * (m - y); + + // either the basis does not have symmetry and we are good, + // or there is a special symmetry that we can exploit + // and we ensure that we don't record the same norm in the list + if (!need_remove_symmetry || (check1 <= check2 && check1 <= check3)) { + // Set the point as a vector (x, y, z, w) + ibz_set(&point[0], x); + ibz_set(&point[1], y); + ibz_set(&point[2], z); + ibz_set(&point[3], w); + + // Evaluate this through the gram matrix and divide out by the + // adjusted_norm + quat_qf_eval(&norm, gram, &point); + ibz_div(&norm, &remain, &norm, adjusted_norm); + assert(ibz_is_zero(&remain)); + + if (ibz_mod_ui(&norm, 2) == 1) { + ibz_set(&vecs[count][0], x); + ibz_set(&vecs[count][1], y); + ibz_set(&vecs[count][2], z); + ibz_set(&vecs[count][3], w); + ibz_copy(&norms[count], &norm); + count++; + } + } + } + } + } + } + + ibz_finalize(&remain); + ibz_finalize(&norm); + ibz_vec_4_finalize(&point); + + return count - 1; +} + +// enumerate through the two list given in input to find to integer d1,d2 such +// that there exists u,v with u d1 + v d2 = target the bool is diagonal +// indicates if the two lists are the same +static int +find_uv_from_lists(ibz_t *au, + ibz_t *bu, + ibz_t *av, + ibz_t *bv, + ibz_t *u, + ibz_t *v, + int *index_sol1, + int *index_sol2, + const ibz_t *target, + const ibz_t *small_norms1, + const ibz_t *small_norms2, + const ibz_t *quotients, + const int index1, + const int index2, + const int is_diagonal, + const int number_sum_square) +{ + + ibz_t n, remain, adjusted_norm; + ibz_init(&n); + ibz_init(&remain); + ibz_init(&adjusted_norm); + + int found = 0; + int cmp; + ibz_copy(&n, target); + + // enumerating through the list + for (int i1 = 0; i1 < index1; i1++) { + ibz_mod(&adjusted_norm, &n, &small_norms1[i1]); + int starting_index2; + if (is_diagonal) { + starting_index2 = i1; + } else { + starting_index2 = 0; + } + for (int i2 = starting_index2; i2 < index2; i2++) { + // u = target / d1 mod d2 + if (!ibz_invmod(&remain, &small_norms2[i2], &small_norms1[i1])) { + continue; + } + ibz_mul(v, &remain, &adjusted_norm); + ibz_mod(v, v, &small_norms1[i1]); + cmp = ibz_cmp(v, "ients[i2]); + while (!found && cmp < 0) { + if (number_sum_square > 0) { + found = ibz_cornacchia_prime(av, bv, &ibz_const_one, v); + } else if (number_sum_square == 0) { + found = 1; + } + if (found) { + ibz_mul(&remain, v, &small_norms2[i2]); + ibz_copy(au, &n); + ibz_sub(u, au, &remain); + assert(ibz_cmp(u, &ibz_const_zero) > 0); + ibz_div(u, &remain, u, &small_norms1[i1]); + assert(ibz_is_zero(&remain)); + // we want to remove weird cases where u,v have big power of two + found = found && (ibz_get(u) != 0 && ibz_get(v) != 0); + if (number_sum_square == 2) { + found = ibz_cornacchia_prime(au, bu, &ibz_const_one, u); + } + } + if (!found) { + ibz_add(v, v, &small_norms1[i1]); + cmp = ibz_cmp(v, "ients[i2]); + } + } + + if (found) { + // copying the indices + *index_sol1 = i1; + *index_sol2 = i2; + break; + } + } + if (found) { + break; + } + } + + ibz_finalize(&n); + ibz_finalize(&remain); + ibz_finalize(&adjusted_norm); + + return found; +} + +struct vec_and_norm +{ + ibz_vec_4_t vec; + ibz_t norm; + int idx; +}; + +static int +compare_vec_by_norm(const void *_first, const void *_second) +{ + const struct vec_and_norm *first = _first, *second = _second; + int res = ibz_cmp(&first->norm, &second->norm); + if (res != 0) + return res; + else + return first->idx - second->idx; +} + +// use several special curves +// we assume that the first one is always j=1728 +int +find_uv(ibz_t *u, + ibz_t *v, + quat_alg_elem_t *beta1, + quat_alg_elem_t *beta2, + ibz_t *d1, + ibz_t *d2, + int *index_alternate_order_1, + int *index_alternate_order_2, + const ibz_t *target, + const quat_left_ideal_t *lideal, + const quat_alg_t *Bpoo, + int num_alternate_order) + +{ + + // variable declaration & init + ibz_vec_4_t vec; + ibz_t n; + ibz_t au, bu, av, bv; + ibz_t norm_d; + ibz_t remain; + ibz_init(&au); + ibz_init(&bu); + ibz_init(&av); + ibz_init(&bv); + ibz_init(&norm_d); + ibz_init(&n); + ibz_vec_4_init(&vec); + ibz_init(&remain); + + ibz_copy(&n, target); + + ibz_t adjusted_norm[num_alternate_order + 1]; + ibz_mat_4x4_t gram[num_alternate_order + 1], reduced[num_alternate_order + 1]; + quat_left_ideal_t ideal[num_alternate_order + 1]; + + for (int i = 0; i < num_alternate_order + 1; i++) { + ibz_init(&adjusted_norm[i]); + ibz_mat_4x4_init(&gram[i]); + ibz_mat_4x4_init(&reduced[i]); + quat_left_ideal_init(&ideal[i]); + } + + // first we reduce the ideal given in input + quat_lideal_copy(&ideal[0], lideal); + quat_lideal_reduce_basis(&reduced[0], &gram[0], &ideal[0], Bpoo); + + ibz_mat_4x4_copy(&ideal[0].lattice.basis, &reduced[0]); + ibz_set(&adjusted_norm[0], 1); + ibz_mul(&adjusted_norm[0], &adjusted_norm[0], &ideal[0].lattice.denom); + ibz_mul(&adjusted_norm[0], &adjusted_norm[0], &ideal[0].lattice.denom); + post_LLL_basis_treatment(&gram[0], &reduced[0], &ideal[0].norm, true); + + // for efficient lattice reduction, we replace ideal[0] by the equivalent + // ideal of smallest norm + quat_left_ideal_t reduced_id; + quat_left_ideal_init(&reduced_id); + quat_lideal_copy(&reduced_id, &ideal[0]); + quat_alg_elem_t delta; + // delta will be the element of smallest norm + quat_alg_elem_init(&delta); + ibz_set(&delta.coord[0], 1); + ibz_set(&delta.coord[1], 0); + ibz_set(&delta.coord[2], 0); + ibz_set(&delta.coord[3], 0); + ibz_copy(&delta.denom, &reduced_id.lattice.denom); + ibz_mat_4x4_eval(&delta.coord, &reduced[0], &delta.coord); + assert(quat_lattice_contains(NULL, &reduced_id.lattice, &delta)); + + // reduced_id = ideal[0] * \overline{delta}/n(ideal[0]) + quat_alg_conj(&delta, &delta); + ibz_mul(&delta.denom, &delta.denom, &ideal[0].norm); + quat_lattice_alg_elem_mul(&reduced_id.lattice, &reduced_id.lattice, &delta, Bpoo); + ibz_copy(&reduced_id.norm, &gram[0][0][0]); + ibz_div(&reduced_id.norm, &remain, &reduced_id.norm, &adjusted_norm[0]); + assert(ibz_cmp(&remain, &ibz_const_zero) == 0); + + // and conj_ideal is the conjugate of reduced_id + // init the right order; + quat_lattice_t right_order; + quat_lattice_init(&right_order); + // computing the conjugate + quat_left_ideal_t conj_ideal; + quat_left_ideal_init(&conj_ideal); + quat_lideal_conjugate_without_hnf(&conj_ideal, &right_order, &reduced_id, Bpoo); + + // computing all the other connecting ideals and reducing them + for (int i = 1; i < num_alternate_order + 1; i++) { + quat_lideal_lideal_mul_reduced(&ideal[i], &gram[i], &conj_ideal, &ALTERNATE_CONNECTING_IDEALS[i - 1], Bpoo); + ibz_mat_4x4_copy(&reduced[i], &ideal[i].lattice.basis); + ibz_set(&adjusted_norm[i], 1); + ibz_mul(&adjusted_norm[i], &adjusted_norm[i], &ideal[i].lattice.denom); + ibz_mul(&adjusted_norm[i], &adjusted_norm[i], &ideal[i].lattice.denom); + post_LLL_basis_treatment(&gram[i], &reduced[i], &ideal[i].norm, false); + } + + // enumerating small vectors + + // global parameters for the enumeration + int m = FINDUV_box_size; + int m4 = FINDUV_cube_size; + + ibz_vec_4_t small_vecs[num_alternate_order + 1][m4]; + ibz_t small_norms[num_alternate_order + 1][m4]; + ibz_vec_4_t alternate_small_vecs[num_alternate_order + 1][m4]; + ibz_t alternate_small_norms[num_alternate_order + 1][m4]; + ibz_t quotients[num_alternate_order + 1][m4]; + int indices[num_alternate_order + 1]; + + for (int j = 0; j < num_alternate_order + 1; j++) { + for (int i = 0; i < m4; i++) { + ibz_init(&small_norms[j][i]); + ibz_vec_4_init(&small_vecs[j][i]); + ibz_init(&alternate_small_norms[j][i]); + ibz_init("ients[j][i]); + ibz_vec_4_init(&alternate_small_vecs[j][i]); + } + // enumeration in the hypercube of norm m + indices[j] = enumerate_hypercube(small_vecs[j], small_norms[j], m, &gram[j], &adjusted_norm[j]); + + // sorting the list + { + struct vec_and_norm small_vecs_and_norms[indices[j]]; + for (int i = 0; i < indices[j]; ++i) { + memcpy(&small_vecs_and_norms[i].vec, &small_vecs[j][i], sizeof(ibz_vec_4_t)); + memcpy(&small_vecs_and_norms[i].norm, &small_norms[j][i], sizeof(ibz_t)); + small_vecs_and_norms[i].idx = i; + } + qsort(small_vecs_and_norms, indices[j], sizeof(*small_vecs_and_norms), compare_vec_by_norm); + for (int i = 0; i < indices[j]; ++i) { + memcpy(&small_vecs[j][i], &small_vecs_and_norms[i].vec, sizeof(ibz_vec_4_t)); + memcpy(&small_norms[j][i], &small_vecs_and_norms[i].norm, sizeof(ibz_t)); + } +#ifndef NDEBUG + for (int i = 1; i < indices[j]; ++i) + assert(ibz_cmp(&small_norms[j][i - 1], &small_norms[j][i]) <= 0); +#endif + } + + for (int i = 0; i < indices[j]; i++) { + ibz_div("ients[j][i], &remain, &n, &small_norms[j][i]); + } + } + + int found = 0; + int i1; + int i2; + for (int j1 = 0; j1 < num_alternate_order + 1; j1++) { + for (int j2 = j1; j2 < num_alternate_order + 1; j2++) { + // in this case, there are some small adjustements to make + int is_diago = (j1 == j2); + found = find_uv_from_lists(&au, + &bu, + &av, + &bv, + u, + v, + &i1, + &i2, + target, + small_norms[j1], + small_norms[j2], + quotients[j2], + indices[j1], + indices[j2], + is_diago, + 0); + // } + + if (found) { + // recording the solutions that we found + ibz_copy(&beta1->denom, &ideal[j1].lattice.denom); + ibz_copy(&beta2->denom, &ideal[j2].lattice.denom); + ibz_copy(d1, &small_norms[j1][i1]); + ibz_copy(d2, &small_norms[j2][i2]); + ibz_mat_4x4_eval(&beta1->coord, &reduced[j1], &small_vecs[j1][i1]); + ibz_mat_4x4_eval(&beta2->coord, &reduced[j2], &small_vecs[j2][i2]); + assert(quat_lattice_contains(NULL, &ideal[j1].lattice, beta1)); + assert(quat_lattice_contains(NULL, &ideal[j2].lattice, beta2)); + if (j1 != 0 || j2 != 0) { + ibz_div(&delta.denom, &remain, &delta.denom, &lideal->norm); + assert(ibz_cmp(&remain, &ibz_const_zero) == 0); + ibz_mul(&delta.denom, &delta.denom, &conj_ideal.norm); + } + if (j1 != 0) { + // we send back beta1 to the original ideal + quat_alg_mul(beta1, &delta, beta1, Bpoo); + quat_alg_normalize(beta1); + } + if (j2 != 0) { + // we send back beta2 to the original ideal + quat_alg_mul(beta2, &delta, beta2, Bpoo); + quat_alg_normalize(beta2); + } + + // if the selected element belong to an alternate order, we conjugate it + if (j1 != 0) { + quat_alg_conj(beta1, beta1); + } + if (j2 != 0) { + quat_alg_conj(beta2, beta2); + } + +#ifndef NDEBUG + quat_alg_norm(&remain, &norm_d, beta1, &QUATALG_PINFTY); + assert(ibz_is_one(&norm_d)); + ibz_mul(&n, d1, &ideal->norm); + if (j1 > 0) { + ibz_mul(&n, &n, &ALTERNATE_CONNECTING_IDEALS[j1 - 1].norm); + } + assert(ibz_cmp(&n, &remain) == 0); + quat_alg_norm(&remain, &norm_d, beta2, &QUATALG_PINFTY); + assert(ibz_is_one(&norm_d)); + ibz_mul(&n, d2, &ideal->norm); + if (j2 > 0) { + ibz_mul(&n, &n, &ALTERNATE_CONNECTING_IDEALS[j2 - 1].norm); + } + assert(ibz_cmp(&n, &remain) == 0); + assert(quat_lattice_contains(NULL, &ideal->lattice, beta1)); + assert(quat_lattice_contains(NULL, &ideal->lattice, beta2)); + + quat_left_ideal_t ideal_test; + quat_lattice_t ro; + quat_left_ideal_init(&ideal_test); + quat_lattice_init(&ro); + if (j1 > 0) { + quat_lideal_copy(&ideal_test, &ALTERNATE_CONNECTING_IDEALS[j1 - 1]); + quat_lideal_conjugate_without_hnf(&ideal_test, &ro, &ideal_test, Bpoo); + quat_lideal_lideal_mul_reduced(&ideal_test, &gram[0], &ideal_test, ideal, Bpoo); + assert(quat_lattice_contains(NULL, &ideal_test.lattice, beta1)); + } + if (j2 > 0) { + quat_lideal_copy(&ideal_test, &ALTERNATE_CONNECTING_IDEALS[j2 - 1]); + quat_lideal_conjugate_without_hnf(&ideal_test, &ro, &ideal_test, Bpoo); + quat_lideal_lideal_mul_reduced(&ideal_test, &gram[0], &ideal_test, ideal, Bpoo); + assert(quat_lattice_contains(NULL, &ideal_test.lattice, beta2)); + } + + quat_lattice_finalize(&ro); + quat_left_ideal_finalize(&ideal_test); +#endif + + *index_alternate_order_1 = j1; + *index_alternate_order_2 = j2; + break; + } + } + if (found) { + break; + } + } + + for (int j = 0; j < num_alternate_order + 1; j++) { + for (int i = 0; i < m4; i++) { + ibz_finalize(&small_norms[j][i]); + ibz_vec_4_finalize(&small_vecs[j][i]); + ibz_finalize(&alternate_small_norms[j][i]); + ibz_finalize("ients[j][i]); + ibz_vec_4_finalize(&alternate_small_vecs[j][i]); + } + } + + // var finalize + for (int i = 0; i < num_alternate_order + 1; i++) { + ibz_mat_4x4_finalize(&gram[i]); + ibz_mat_4x4_finalize(&reduced[i]); + quat_left_ideal_finalize(&ideal[i]); + ibz_finalize(&adjusted_norm[i]); + } + + ibz_finalize(&n); + ibz_vec_4_finalize(&vec); + ibz_finalize(&au); + ibz_finalize(&bu); + ibz_finalize(&av); + ibz_finalize(&bv); + ibz_finalize(&remain); + ibz_finalize(&norm_d); + quat_lattice_finalize(&right_order); + quat_left_ideal_finalize(&conj_ideal); + quat_left_ideal_finalize(&reduced_id); + quat_alg_elem_finalize(&delta); + + return found; +} + +int +dim2id2iso_ideal_to_isogeny_clapotis(quat_alg_elem_t *beta1, + quat_alg_elem_t *beta2, + ibz_t *u, + ibz_t *v, + ibz_t *d1, + ibz_t *d2, + ec_curve_t *codomain, + ec_basis_t *basis, + const quat_left_ideal_t *lideal, + const quat_alg_t *Bpoo) +{ + ibz_t target, tmp, two_pow; + ; + quat_alg_elem_t theta; + + ibz_t norm_d; + ibz_init(&norm_d); + ibz_t test1, test2; + ibz_init(&test1); + ibz_init(&test2); + + ibz_init(&target); + ibz_init(&tmp); + ibz_init(&two_pow); + int exp = TORSION_EVEN_POWER; + quat_alg_elem_init(&theta); + + // first, we find u,v,d1,d2,beta1,beta2 + // such that u*d1 + v*d2 = 2^TORSION_EVEN_POWER and there are ideals of + // norm d1,d2 equivalent to ideal beta1 and beta2 are elements of norm nd1, + // nd2 where n=n(lideal) + int ret; + int index_order1 = 0, index_order2 = 0; +#ifndef NDEBUG + unsigned int Fu_length, Fv_length; +#endif + ret = find_uv(u, + v, + beta1, + beta2, + d1, + d2, + &index_order1, + &index_order2, + &TORSION_PLUS_2POWER, + lideal, + Bpoo, + NUM_ALTERNATE_EXTREMAL_ORDERS); + if (!ret) { + goto cleanup; + } + + assert(ibz_is_odd(d1) && ibz_is_odd(d2)); + // compute the valuation of the GCD of u,v + ibz_gcd(&tmp, u, v); + assert(ibz_cmp(&tmp, &ibz_const_zero) != 0); + int exp_gcd = ibz_two_adic(&tmp); + exp = TORSION_EVEN_POWER - exp_gcd; + // removing the power of 2 from u and v + ibz_div(u, &test1, u, &tmp); + assert(ibz_cmp(&test1, &ibz_const_zero) == 0); + ibz_div(v, &test1, v, &tmp); + assert(ibz_cmp(&test1, &ibz_const_zero) == 0); + +#ifndef NDEBUG + // checking that ud1+vd2 = 2^exp + ibz_t pow_check, tmp_check; + ibz_init(&pow_check); + ibz_init(&tmp_check); + ibz_pow(&pow_check, &ibz_const_two, exp); + ibz_mul(&tmp_check, d1, u); + ibz_sub(&pow_check, &pow_check, &tmp_check); + ibz_mul(&tmp_check, v, d2); + ibz_sub(&pow_check, &pow_check, &tmp_check); + assert(ibz_cmp(&pow_check, &ibz_const_zero) == 0); + ibz_finalize(&tmp_check); + ibz_finalize(&pow_check); +#endif + + // now we compute the dimension 2 isogeny + // F : Eu x Ev -> E x E' + // where we have phi_u : Eu -> E_index_order1 and phi_v : Ev -> E_index_order2 + // if we have phi1 : E_index_order_1 -> E of degree d1 + // and phi2 : E_index_order_2 -> E of degree d2 + // we can define theta = phi2 o hat{phi1} + // and the kernel of F is given by + // ( [ud1](P), phiv o theta o hat{phiu} (P)),( [ud1](Q), phiv o theta o + // hat{phiu} (Q)) where P,Q is a basis of E0[2e] + + // now we set-up the kernel + // ec_curve_t E0 = CURVE_E0; + ec_curve_t E1; + copy_curve(&E1, &CURVES_WITH_ENDOMORPHISMS[index_order1].curve); + ec_curve_t E2; + copy_curve(&E2, &CURVES_WITH_ENDOMORPHISMS[index_order2].curve); + ec_basis_t bas1, bas2; + theta_couple_curve_t E01; + theta_kernel_couple_points_t ker; + + ec_basis_t bas_u; + copy_basis(&bas1, &CURVES_WITH_ENDOMORPHISMS[index_order1].basis_even); + copy_basis(&bas2, &CURVES_WITH_ENDOMORPHISMS[index_order2].basis_even); + + // we start by computing theta = beta2 \hat{beta1}/n + ibz_set(&theta.denom, 1); + quat_alg_conj(&theta, beta1); + quat_alg_mul(&theta, beta2, &theta, &QUATALG_PINFTY); + ibz_mul(&theta.denom, &theta.denom, &lideal->norm); + + // now we perform the actual computation + quat_left_ideal_t idealu, idealv; + quat_left_ideal_init(&idealu); + quat_left_ideal_init(&idealv); + theta_couple_curve_t Fu_codomain, Fv_codomain; + theta_couple_point_t pushed_points[3]; + theta_couple_point_t *const V1 = pushed_points + 0, *const V2 = pushed_points + 1, *const V1m2 = pushed_points + 2; + theta_couple_point_t P, Q, PmQ; + + copy_point(&P.P1, &bas1.P); + copy_point(&PmQ.P1, &bas1.PmQ); + copy_point(&Q.P1, &bas1.Q); + // Set points to zero + ec_point_init(&P.P2); + ec_point_init(&Q.P2); + ec_point_init(&PmQ.P2); + + pushed_points[0] = P; + pushed_points[1] = Q; + pushed_points[2] = PmQ; + // we perform the computation of phiu with a fixed degree isogeny + ret = fixed_degree_isogeny_and_eval( + &idealu, u, true, &Fu_codomain, pushed_points, sizeof(pushed_points) / sizeof(*pushed_points), index_order1); + + if (!ret) { + goto cleanup; + } + assert(test_point_order_twof(&V1->P1, &Fu_codomain.E1, TORSION_EVEN_POWER)); + assert(test_point_order_twof(&V1->P2, &Fu_codomain.E2, TORSION_EVEN_POWER)); + +#ifndef NDEBUG + Fu_length = (unsigned int)ret; + // presumably the correct curve is the first one, we check this + fp2_t w0a, w1a, w2a; + ec_curve_t E1_tmp, Fu_codomain_E1_tmp, Fu_codomain_E2_tmp; + copy_curve(&E1_tmp, &E1); + copy_curve(&Fu_codomain_E1_tmp, &Fu_codomain.E1); + copy_curve(&Fu_codomain_E2_tmp, &Fu_codomain.E2); + weil(&w0a, TORSION_EVEN_POWER, &bas1.P, &bas1.Q, &bas1.PmQ, &E1_tmp); + weil(&w1a, TORSION_EVEN_POWER, &V1->P1, &V2->P1, &V1m2->P1, &Fu_codomain_E1_tmp); + weil(&w2a, TORSION_EVEN_POWER, &V1->P2, &V2->P2, &V1m2->P2, &Fu_codomain_E2_tmp); + ibz_pow(&two_pow, &ibz_const_two, Fu_length); + ibz_sub(&two_pow, &two_pow, u); + + // now we are checking that the weil pairings are equal to the correct value + digit_t digit_u[NWORDS_ORDER] = { 0 }; + ibz_to_digit_array(digit_u, u); + fp2_t test_powa; + fp2_pow_vartime(&test_powa, &w0a, digit_u, NWORDS_ORDER); + + assert(fp2_is_equal(&test_powa, &w1a)); + ibz_to_digit_array(digit_u, &two_pow); + fp2_pow_vartime(&test_powa, &w0a, digit_u, NWORDS_ORDER); + assert(fp2_is_equal(&test_powa, &w2a)); +#endif + + // copying the basis images + copy_point(&bas_u.P, &V1->P1); + copy_point(&bas_u.Q, &V2->P1); + copy_point(&bas_u.PmQ, &V1m2->P1); + + // copying the points to the first part of the kernel + copy_point(&ker.T1.P1, &bas_u.P); + copy_point(&ker.T2.P1, &bas_u.Q); + copy_point(&ker.T1m2.P1, &bas_u.PmQ); + copy_curve(&E01.E1, &Fu_codomain.E1); + + copy_point(&P.P1, &bas2.P); + copy_point(&PmQ.P1, &bas2.PmQ); + copy_point(&Q.P1, &bas2.Q); + pushed_points[0] = P; + pushed_points[1] = Q; + pushed_points[2] = PmQ; + + // computation of phiv + ret = fixed_degree_isogeny_and_eval( + &idealv, v, true, &Fv_codomain, pushed_points, sizeof(pushed_points) / sizeof(*pushed_points), index_order2); + if (!ret) { + goto cleanup; + } + + assert(test_point_order_twof(&V1->P1, &Fv_codomain.E1, TORSION_EVEN_POWER)); + assert(test_point_order_twof(&V1->P2, &Fv_codomain.E2, TORSION_EVEN_POWER)); + +#ifndef NDEBUG + Fv_length = (unsigned int)ret; + ec_curve_t E2_tmp, Fv_codomain_E1_tmp, Fv_codomain_E2_tmp; + copy_curve(&E2_tmp, &E2); + copy_curve(&Fv_codomain_E1_tmp, &Fv_codomain.E1); + copy_curve(&Fv_codomain_E2_tmp, &Fv_codomain.E2); + // presumably the correct curve is the first one, we check this + weil(&w0a, TORSION_EVEN_POWER, &bas2.P, &bas2.Q, &bas2.PmQ, &E2_tmp); + weil(&w1a, TORSION_EVEN_POWER, &V1->P1, &V2->P1, &V1m2->P1, &Fv_codomain_E1_tmp); + weil(&w2a, TORSION_EVEN_POWER, &V1->P2, &V2->P2, &V1m2->P2, &Fv_codomain_E2_tmp); + if (Fv_length == 0) { + ibz_set(&tmp, 1); + ibz_set(&two_pow, 1); + } else { + ibz_pow(&two_pow, &ibz_const_two, Fv_length); + ibz_sub(&two_pow, &two_pow, v); + } + + // now we are checking that one of the two is equal to the correct value + ibz_to_digit_array(digit_u, v); + fp2_pow_vartime(&test_powa, &w0a, digit_u, NWORDS_ORDER); + assert(fp2_is_equal(&test_powa, &w1a)); + ibz_to_digit_array(digit_u, &two_pow); + fp2_pow_vartime(&test_powa, &w0a, digit_u, NWORDS_ORDER); + assert(fp2_is_equal(&test_powa, &w2a)); + +#endif + + copy_point(&bas2.P, &V1->P1); + copy_point(&bas2.Q, &V2->P1); + copy_point(&bas2.PmQ, &V1m2->P1); + + // multiplying theta by 1 / (d1 * n(connecting_ideal2)) + ibz_pow(&two_pow, &ibz_const_two, TORSION_EVEN_POWER); + ibz_copy(&tmp, d1); + if (index_order2 > 0) { + ibz_mul(&tmp, &tmp, &ALTERNATE_CONNECTING_IDEALS[index_order2 - 1].norm); + } + ibz_invmod(&tmp, &tmp, &two_pow); + + ibz_mul(&theta.coord[0], &theta.coord[0], &tmp); + ibz_mul(&theta.coord[1], &theta.coord[1], &tmp); + ibz_mul(&theta.coord[2], &theta.coord[2], &tmp); + ibz_mul(&theta.coord[3], &theta.coord[3], &tmp); + + // applying theta + endomorphism_application_even_basis(&bas2, 0, &Fv_codomain.E1, &theta, TORSION_EVEN_POWER); + + assert(test_basis_order_twof(&bas2, &Fv_codomain.E1, TORSION_EVEN_POWER)); + + // copying points to the second part of the kernel + copy_point(&ker.T1.P2, &bas2.P); + copy_point(&ker.T2.P2, &bas2.Q); + copy_point(&ker.T1m2.P2, &bas2.PmQ); + copy_curve(&E01.E2, &Fv_codomain.E1); + + // copying the points to the first part of the kernel + quat_left_ideal_finalize(&idealu); + quat_left_ideal_finalize(&idealv); + + double_couple_point_iter(&ker.T1, TORSION_EVEN_POWER - exp, &ker.T1, &E01); + double_couple_point_iter(&ker.T2, TORSION_EVEN_POWER - exp, &ker.T2, &E01); + double_couple_point_iter(&ker.T1m2, TORSION_EVEN_POWER - exp, &ker.T1m2, &E01); + + assert(test_point_order_twof(&ker.T1.P1, &E01.E1, exp)); + assert(test_point_order_twof(&ker.T1m2.P2, &E01.E2, exp)); + + assert(ibz_is_odd(u)); + + // now we evaluate the basis points through the isogeny + assert(test_basis_order_twof(&bas_u, &E01.E1, TORSION_EVEN_POWER)); + + // evaluating the basis through the isogeny of degree u*d1 + copy_point(&pushed_points[0].P1, &bas_u.P); + copy_point(&pushed_points[2].P1, &bas_u.PmQ); + copy_point(&pushed_points[1].P1, &bas_u.Q); + // Set points to zero + ec_point_init(&pushed_points[0].P2); + ec_point_init(&pushed_points[1].P2); + ec_point_init(&pushed_points[2].P2); + + theta_couple_curve_t theta_codomain; + + ret = theta_chain_compute_and_eval_randomized( + exp, &E01, &ker, false, &theta_codomain, pushed_points, sizeof(pushed_points) / sizeof(*pushed_points)); + if (!ret) { + goto cleanup; + } + + theta_couple_point_t T1, T2, T1m2; + T1 = pushed_points[0]; + T2 = pushed_points[1]; + T1m2 = pushed_points[2]; + + assert(test_point_order_twof(&T1.P2, &theta_codomain.E2, TORSION_EVEN_POWER)); + assert(test_point_order_twof(&T1.P1, &theta_codomain.E1, TORSION_EVEN_POWER)); + assert(test_point_order_twof(&T1m2.P2, &theta_codomain.E2, TORSION_EVEN_POWER)); + + copy_point(&basis->P, &T1.P1); + copy_point(&basis->Q, &T2.P1); + copy_point(&basis->PmQ, &T1m2.P1); + copy_curve(codomain, &theta_codomain.E1); + + // using weil pairing to verify that we selected the correct curve + fp2_t w0, w1; + // ec_curve_t E0 = CURVE_E0; + // ec_basis_t bas0 = BASIS_EVEN; + weil(&w0, TORSION_EVEN_POWER, &bas1.P, &bas1.Q, &bas1.PmQ, &E1); + weil(&w1, TORSION_EVEN_POWER, &basis->P, &basis->Q, &basis->PmQ, codomain); + + digit_t digit_d[NWORDS_ORDER] = { 0 }; + ibz_mul(&tmp, d1, u); + ibz_mul(&tmp, &tmp, u); + ibz_mod(&tmp, &tmp, &TORSION_PLUS_2POWER); + ibz_to_digit_array(digit_d, &tmp); + fp2_t test_pow; + fp2_pow_vartime(&test_pow, &w0, digit_d, NWORDS_ORDER); + + // then we have selected the wrong one + if (!fp2_is_equal(&w1, &test_pow)) { + copy_point(&basis->P, &T1.P2); + copy_point(&basis->Q, &T2.P2); + copy_point(&basis->PmQ, &T1m2.P2); + copy_curve(codomain, &theta_codomain.E2); + +// verifying that the other one is the good one +#ifndef NDEBUG + ec_curve_t codomain_tmp; + copy_curve(&codomain_tmp, codomain); + weil(&w1, TORSION_EVEN_POWER, &basis->P, &basis->Q, &basis->PmQ, &codomain_tmp); + fp2_pow_vartime(&test_pow, &w0, digit_d, NWORDS_ORDER); + assert(fp2_is_equal(&test_pow, &w1)); +#endif + } + + // now we apply M / (u * d1) where M is the matrix corresponding to the + // endomorphism beta1 = phi o dual(phi1) we multiply beta1 by the inverse of + // (u*d1) mod 2^TORSION_EVEN_POWER + ibz_mul(&tmp, u, d1); + if (index_order1 != 0) { + ibz_mul(&tmp, &tmp, &CONNECTING_IDEALS[index_order1].norm); + } + ibz_invmod(&tmp, &tmp, &TORSION_PLUS_2POWER); + ibz_mul(&beta1->coord[0], &beta1->coord[0], &tmp); + ibz_mul(&beta1->coord[1], &beta1->coord[1], &tmp); + ibz_mul(&beta1->coord[2], &beta1->coord[2], &tmp); + ibz_mul(&beta1->coord[3], &beta1->coord[3], &tmp); + + endomorphism_application_even_basis(basis, 0, codomain, beta1, TORSION_EVEN_POWER); + +#ifndef NDEBUG + { + ec_curve_t E0 = CURVE_E0; + ec_curve_t codomain_tmp; + ec_basis_t bas0 = CURVES_WITH_ENDOMORPHISMS[0].basis_even; + copy_curve(&codomain_tmp, codomain); + copy_curve(&E1_tmp, &E1); + copy_curve(&E2_tmp, &E2); + weil(&w0a, TORSION_EVEN_POWER, &bas0.P, &bas0.Q, &bas0.PmQ, &E0); + weil(&w1a, TORSION_EVEN_POWER, &basis->P, &basis->Q, &basis->PmQ, &codomain_tmp); + digit_t tmp_d[2 * NWORDS_ORDER] = { 0 }; + if (index_order1 != 0) { + copy_basis(&bas1, &CURVES_WITH_ENDOMORPHISMS[index_order1].basis_even); + weil(&w0, TORSION_EVEN_POWER, &bas1.P, &bas1.Q, &bas1.PmQ, &E1_tmp); + ibz_to_digit_array(tmp_d, &CONNECTING_IDEALS[index_order1].norm); + fp2_pow_vartime(&test_pow, &w0a, tmp_d, 2 * NWORDS_ORDER); + assert(fp2_is_equal(&test_pow, &w0)); + } + if (index_order2 != 0) { + copy_basis(&bas2, &CURVES_WITH_ENDOMORPHISMS[index_order2].basis_even); + weil(&w0, TORSION_EVEN_POWER, &bas2.P, &bas2.Q, &bas2.PmQ, &E2_tmp); + ibz_to_digit_array(tmp_d, &CONNECTING_IDEALS[index_order2].norm); + fp2_pow_vartime(&test_pow, &w0a, tmp_d, 2 * NWORDS_ORDER); + assert(fp2_is_equal(&test_pow, &w0)); + } + ibz_to_digit_array(tmp_d, &lideal->norm); + fp2_pow_vartime(&test_pow, &w0a, tmp_d, 2 * NWORDS_ORDER); + assert(fp2_is_equal(&test_pow, &w1a)); + } +#endif + +cleanup: + ibz_finalize(&norm_d); + ibz_finalize(&test1); + ibz_finalize(&test2); + ibz_finalize(&target); + ibz_finalize(&tmp); + ibz_finalize(&two_pow); + quat_alg_elem_finalize(&theta); + return ret; +} + +int +dim2id2iso_arbitrary_isogeny_evaluation(ec_basis_t *basis, ec_curve_t *codomain, const quat_left_ideal_t *lideal) +{ + int ret; + + quat_alg_elem_t beta1, beta2; + ibz_t u, v, d1, d2; + + quat_alg_elem_init(&beta1); + quat_alg_elem_init(&beta2); + + ibz_init(&u); + ibz_init(&v); + ibz_init(&d1); + ibz_init(&d2); + + ret = dim2id2iso_ideal_to_isogeny_clapotis( + &beta1, &beta2, &u, &v, &d1, &d2, codomain, basis, lideal, &QUATALG_PINFTY); + + quat_alg_elem_finalize(&beta1); + quat_alg_elem_finalize(&beta2); + + ibz_finalize(&u); + ibz_finalize(&v); + ibz_finalize(&d1); + ibz_finalize(&d2); + + return ret; +} diff --git a/src/id2iso/ref/lvlx/id2iso.c b/src/id2iso/ref/lvlx/id2iso.c new file mode 100644 index 0000000..0743974 --- /dev/null +++ b/src/id2iso/ref/lvlx/id2iso.c @@ -0,0 +1,338 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Scalar multiplication [x]P + [y]Q where x and y are stored +// inside an ibz_vec_2_t [x, y] and P, Q \in E[2^f] +void +ec_biscalar_mul_ibz_vec(ec_point_t *res, + const ibz_vec_2_t *scalar_vec, + const int f, + const ec_basis_t *PQ, + const ec_curve_t *curve) +{ + digit_t scalars[2][NWORDS_ORDER]; + ibz_to_digit_array(scalars[0], &(*scalar_vec)[0]); + ibz_to_digit_array(scalars[1], &(*scalar_vec)[1]); + ec_biscalar_mul(res, scalars[0], scalars[1], f, PQ, curve); +} + +// Given an ideal, computes the scalars s0, s1 which determine the kernel generator +// of the equivalent isogeny +void +id2iso_ideal_to_kernel_dlogs_even(ibz_vec_2_t *vec, const quat_left_ideal_t *lideal) +{ + ibz_t tmp; + ibz_init(&tmp); + + ibz_mat_2x2_t mat; + ibz_mat_2x2_init(&mat); + + // construct the matrix of the dual of alpha on the 2^f-torsion + { + quat_alg_elem_t alpha; + quat_alg_elem_init(&alpha); + + int lideal_generator_ok UNUSED = quat_lideal_generator(&alpha, lideal, &QUATALG_PINFTY); + assert(lideal_generator_ok); + quat_alg_conj(&alpha, &alpha); + + ibz_vec_4_t coeffs; + ibz_vec_4_init(&coeffs); + quat_change_to_O0_basis(&coeffs, &alpha); + + for (unsigned i = 0; i < 2; ++i) { + ibz_add(&mat[i][i], &mat[i][i], &coeffs[0]); + for (unsigned j = 0; j < 2; ++j) { + ibz_mul(&tmp, &ACTION_GEN2[i][j], &coeffs[1]); + ibz_add(&mat[i][j], &mat[i][j], &tmp); + ibz_mul(&tmp, &ACTION_GEN3[i][j], &coeffs[2]); + ibz_add(&mat[i][j], &mat[i][j], &tmp); + ibz_mul(&tmp, &ACTION_GEN4[i][j], &coeffs[3]); + ibz_add(&mat[i][j], &mat[i][j], &tmp); + } + } + + ibz_vec_4_finalize(&coeffs); + quat_alg_elem_finalize(&alpha); + } + + // find the kernel of alpha modulo the norm of the ideal + { + const ibz_t *const norm = &lideal->norm; + + ibz_mod(&(*vec)[0], &mat[0][0], norm); + ibz_mod(&(*vec)[1], &mat[1][0], norm); + ibz_gcd(&tmp, &(*vec)[0], &(*vec)[1]); + if (ibz_is_even(&tmp)) { + ibz_mod(&(*vec)[0], &mat[0][1], norm); + ibz_mod(&(*vec)[1], &mat[1][1], norm); + } +#ifndef NDEBUG + ibz_gcd(&tmp, &(*vec)[0], norm); + ibz_gcd(&tmp, &(*vec)[1], &tmp); + assert(!ibz_cmp(&tmp, &ibz_const_one)); +#endif + } + + ibz_mat_2x2_finalize(&mat); + ibz_finalize(&tmp); +} + +// helper function to apply a matrix to a basis of E[2^f] +// works in place +int +matrix_application_even_basis(ec_basis_t *bas, const ec_curve_t *E, ibz_mat_2x2_t *mat, int f) +{ + digit_t scalars[2][NWORDS_ORDER] = { 0 }; + int ret; + + ibz_t tmp, pow_two; + ibz_init(&tmp); + ibz_init(&pow_two); + ibz_pow(&pow_two, &ibz_const_two, f); + + ec_basis_t tmp_bas; + copy_basis(&tmp_bas, bas); + + // reduction mod 2f + ibz_mod(&(*mat)[0][0], &(*mat)[0][0], &pow_two); + ibz_mod(&(*mat)[0][1], &(*mat)[0][1], &pow_two); + ibz_mod(&(*mat)[1][0], &(*mat)[1][0], &pow_two); + ibz_mod(&(*mat)[1][1], &(*mat)[1][1], &pow_two); + + // For a matrix [[a, c], [b, d]] we compute: + // + // first basis element R = [a]P + [b]Q + ibz_to_digit_array(scalars[0], &(*mat)[0][0]); + ibz_to_digit_array(scalars[1], &(*mat)[1][0]); + ec_biscalar_mul(&bas->P, scalars[0], scalars[1], f, &tmp_bas, E); + + // second basis element S = [c]P + [d]Q + ibz_to_digit_array(scalars[0], &(*mat)[0][1]); + ibz_to_digit_array(scalars[1], &(*mat)[1][1]); + ec_biscalar_mul(&bas->Q, scalars[0], scalars[1], f, &tmp_bas, E); + + // Their difference R - S = [a - c]P + [b - d]Q + ibz_sub(&tmp, &(*mat)[0][0], &(*mat)[0][1]); + ibz_mod(&tmp, &tmp, &pow_two); + ibz_to_digit_array(scalars[0], &tmp); + ibz_sub(&tmp, &(*mat)[1][0], &(*mat)[1][1]); + ibz_mod(&tmp, &tmp, &pow_two); + ibz_to_digit_array(scalars[1], &tmp); + ret = ec_biscalar_mul(&bas->PmQ, scalars[0], scalars[1], f, &tmp_bas, E); + + ibz_finalize(&tmp); + ibz_finalize(&pow_two); + + return ret; +} + +// helper function to apply some endomorphism of E0 on the precomputed basis of E[2^f] +// works in place +void +endomorphism_application_even_basis(ec_basis_t *bas, + const int index_alternate_curve, + const ec_curve_t *E, + const quat_alg_elem_t *theta, + int f) +{ + ibz_t tmp; + ibz_init(&tmp); + ibz_vec_4_t coeffs; + ibz_vec_4_init(&coeffs); + ibz_mat_2x2_t mat; + ibz_mat_2x2_init(&mat); + + ibz_t content; + ibz_init(&content); + + // decomposing theta on the basis + quat_alg_make_primitive(&coeffs, &content, theta, &EXTREMAL_ORDERS[index_alternate_curve].order); + assert(ibz_is_odd(&content)); + + ibz_set(&mat[0][0], 0); + ibz_set(&mat[0][1], 0); + ibz_set(&mat[1][0], 0); + ibz_set(&mat[1][1], 0); + + // computing the matrix + + for (unsigned i = 0; i < 2; ++i) { + ibz_add(&mat[i][i], &mat[i][i], &coeffs[0]); + for (unsigned j = 0; j < 2; ++j) { + ibz_mul(&tmp, &CURVES_WITH_ENDOMORPHISMS[index_alternate_curve].action_gen2[i][j], &coeffs[1]); + ibz_add(&mat[i][j], &mat[i][j], &tmp); + ibz_mul(&tmp, &CURVES_WITH_ENDOMORPHISMS[index_alternate_curve].action_gen3[i][j], &coeffs[2]); + ibz_add(&mat[i][j], &mat[i][j], &tmp); + ibz_mul(&tmp, &CURVES_WITH_ENDOMORPHISMS[index_alternate_curve].action_gen4[i][j], &coeffs[3]); + ibz_add(&mat[i][j], &mat[i][j], &tmp); + ibz_mul(&mat[i][j], &mat[i][j], &content); + } + } + + // and now we apply it + matrix_application_even_basis(bas, E, &mat, f); + + ibz_vec_4_finalize(&coeffs); + ibz_mat_2x2_finalize(&mat); + ibz_finalize(&content); + + ibz_finalize(&tmp); +} + +// compute the ideal whose kernel is generated by vec2[0]*BO[0] + vec2[1]*B0[1] where B0 is the +// canonical basis of E0 +void +id2iso_kernel_dlogs_to_ideal_even(quat_left_ideal_t *lideal, const ibz_vec_2_t *vec2, int f) +{ + + // algorithm: apply endomorphisms 1 and j+(1+k)/2 to the kernel point, + // the result should form a basis of the respective torsion subgroup. + // then apply i to the kernel point and decompose over said basis. + // hence we have an equation a*P + b*[j+(1+k)/2]P == [i]P, which will + // easily reveal an endomorphism that kills P. + + ibz_t two_pow; + ibz_init(&two_pow); + + ibz_vec_2_t vec; + ibz_vec_2_init(&vec); + + if (f == TORSION_EVEN_POWER) { + ibz_copy(&two_pow, &TORSION_PLUS_2POWER); + } else { + ibz_pow(&two_pow, &ibz_const_two, f); + } + + { + ibz_mat_2x2_t mat; + ibz_mat_2x2_init(&mat); + + ibz_copy(&mat[0][0], &(*vec2)[0]); + ibz_copy(&mat[1][0], &(*vec2)[1]); + + ibz_mat_2x2_eval(&vec, &ACTION_J, vec2); + ibz_copy(&mat[0][1], &vec[0]); + ibz_copy(&mat[1][1], &vec[1]); + + ibz_mat_2x2_eval(&vec, &ACTION_GEN4, vec2); + ibz_add(&mat[0][1], &mat[0][1], &vec[0]); + ibz_add(&mat[1][1], &mat[1][1], &vec[1]); + + ibz_mod(&mat[0][1], &mat[0][1], &two_pow); + ibz_mod(&mat[1][1], &mat[1][1], &two_pow); + + ibz_mat_2x2_t inv; + ibz_mat_2x2_init(&inv); + { + int inv_ok UNUSED = ibz_mat_2x2_inv_mod(&inv, &mat, &two_pow); + assert(inv_ok); + } + ibz_mat_2x2_finalize(&mat); + + ibz_mat_2x2_eval(&vec, &ACTION_I, vec2); + ibz_mat_2x2_eval(&vec, &inv, &vec); + + ibz_mat_2x2_finalize(&inv); + } + + // final result: a - i + b*(j+(1+k)/2) + quat_alg_elem_t gen; + quat_alg_elem_init(&gen); + ibz_set(&gen.denom, 2); + ibz_add(&gen.coord[0], &vec[0], &vec[0]); + ibz_set(&gen.coord[1], -2); + ibz_add(&gen.coord[2], &vec[1], &vec[1]); + ibz_copy(&gen.coord[3], &vec[1]); + ibz_add(&gen.coord[0], &gen.coord[0], &vec[1]); + ibz_vec_2_finalize(&vec); + + quat_lideal_create(lideal, &gen, &two_pow, &MAXORD_O0, &QUATALG_PINFTY); + + assert(0 == ibz_cmp(&lideal->norm, &two_pow)); + + quat_alg_elem_finalize(&gen); + ibz_finalize(&two_pow); +} + +// finds mat such that: +// (mat*v).B2 = v.B1 +// where "." is the dot product, defined as (v1,v2).(P,Q) = v1*P + v2*Q +// mat encodes the coordinates of the points of B1 in the basis B2 +// specifically requires B1 or B2 to be "full" w.r.t to the 2^n torsion, so that we use tate +// full = 0 assumes B2 is "full" so the easier case. +// if we want to switch the role of B2 and B1, we invert the matrix, e.g. set full = 1 +static void +_change_of_basis_matrix_tate(ibz_mat_2x2_t *mat, + const ec_basis_t *B1, + const ec_basis_t *B2, + ec_curve_t *E, + int f, + bool invert) +{ + digit_t x1[NWORDS_ORDER] = { 0 }, x2[NWORDS_ORDER] = { 0 }, x3[NWORDS_ORDER] = { 0 }, x4[NWORDS_ORDER] = { 0 }; + +#ifndef NDEBUG + int e_full = TORSION_EVEN_POWER; + int e_diff = e_full - f; +#endif + + // Ensure the input basis has points of order 2^f + if (invert) { + assert(test_basis_order_twof(B1, E, e_full)); + ec_dlog_2_tate(x1, x2, x3, x4, B1, B2, E, f); + mp_invert_matrix(x1, x2, x3, x4, f, NWORDS_ORDER); + } else { + assert(test_basis_order_twof(B2, E, e_full)); + ec_dlog_2_tate(x1, x2, x3, x4, B2, B1, E, f); + } + +#ifndef NDEBUG + { + if (invert) { + ec_point_t test, test2; + ec_biscalar_mul(&test, x1, x2, f, B2, E); + ec_dbl_iter(&test2, e_diff, &B1->P, E); + assert(ec_is_equal(&test, &test2)); + + ec_biscalar_mul(&test, x3, x4, f, B2, E); + ec_dbl_iter(&test2, e_diff, &B1->Q, E); + assert(ec_is_equal(&test, &test2)); + } else { + ec_point_t test; + ec_biscalar_mul(&test, x1, x2, f, B2, E); + ec_dbl_iter(&test, e_diff, &test, E); + assert(ec_is_equal(&test, &(B1->P))); + + ec_biscalar_mul(&test, x3, x4, f, B2, E); + ec_dbl_iter(&test, e_diff, &test, E); + assert(ec_is_equal(&test, &(B1->Q))); + } + } +#endif + + // Copy the results into the matrix + ibz_copy_digit_array(&((*mat)[0][0]), x1); + ibz_copy_digit_array(&((*mat)[1][0]), x2); + ibz_copy_digit_array(&((*mat)[0][1]), x3); + ibz_copy_digit_array(&((*mat)[1][1]), x4); +} + +void +change_of_basis_matrix_tate(ibz_mat_2x2_t *mat, const ec_basis_t *B1, const ec_basis_t *B2, ec_curve_t *E, int f) +{ + _change_of_basis_matrix_tate(mat, B1, B2, E, f, false); +} + +void +change_of_basis_matrix_tate_invert(ibz_mat_2x2_t *mat, const ec_basis_t *B1, const ec_basis_t *B2, ec_curve_t *E, int f) +{ + _change_of_basis_matrix_tate(mat, B1, B2, E, f, true); +} diff --git a/src/id2iso/ref/lvlx/test/dim2id2iso_tests.h b/src/id2iso/ref/lvlx/test/dim2id2iso_tests.h new file mode 100644 index 0000000..e9292e6 --- /dev/null +++ b/src/id2iso/ref/lvlx/test/dim2id2iso_tests.h @@ -0,0 +1,30 @@ +#ifndef DIM2ID2ISO_TESTS_H +#define DIM2ID2ISO_TESTS_H + +#include +#include +#include +#include +#include +#include +#include +#include + +/** @internal + * @ingroup id2iso_id2iso + * @defgroup dim2id2iso_tests dim2id2iso module test functions + * @{ + */ + +int dim2id2iso_test_fixed_degree_isogeny(void); + +int dim2id2iso_test_find_uv(void); + +int dim2id2iso_test_find_uv(void); + +int dim2id2iso_test_dimid2iso(void); + +/** @} + */ + +#endif diff --git a/src/id2iso/ref/id2isox/test/id2iso_tests.h b/src/id2iso/ref/lvlx/test/id2iso_tests.h similarity index 68% rename from src/id2iso/ref/id2isox/test/id2iso_tests.h rename to src/id2iso/ref/lvlx/test/id2iso_tests.h index 9b76b6f..af469a0 100644 --- a/src/id2iso/ref/id2isox/test/id2iso_tests.h +++ b/src/id2iso/ref/lvlx/test/id2iso_tests.h @@ -1,15 +1,15 @@ #ifndef ID2ISO_TESTS_H #define ID2ISO_TESTS_H -#include #include -#include #include #include +#include #include #include #include #include +#include /** @internal * @ingroup id2iso_id2iso @@ -17,16 +17,11 @@ * @{ */ -int id2iso_test_ker2id(); +int id2iso_test_ker2id(void); -int id2iso_test_id2ker_even(); - -int id2iso_test_id2ker_odd(); - -int id2iso_test_id2iso(); +int id2iso_test_id2iso(void); /** @} */ - #endif diff --git a/src/id2iso/ref/lvlx/test/ker2id.c b/src/id2iso/ref/lvlx/test/ker2id.c new file mode 100644 index 0000000..be46378 --- /dev/null +++ b/src/id2iso/ref/lvlx/test/ker2id.c @@ -0,0 +1,54 @@ +#include "id2iso_tests.h" + +static void +random_scalar(ibz_t *k) +{ + ibz_pow(k, &ibz_const_two, 123); + ibz_rand_interval(k, &ibz_const_zero, k); +} + +int +_id2iso_test_ker2id(void) +{ + int res = 1; + + ibz_vec_2_t vec2; + ibz_vec_2_init(&vec2); + + { + ibz_t gcd; + ibz_init(&gcd); + do { + random_scalar(&vec2[0]); + random_scalar(&vec2[1]); + ibz_gcd(&gcd, &vec2[0], &vec2[1]); + } while (ibz_divides(&gcd, &ibz_const_two)); + ibz_finalize(&gcd); + } + + quat_left_ideal_t I; + quat_left_ideal_init(&I); + id2iso_kernel_dlogs_to_ideal_even(&I, &vec2, TORSION_EVEN_POWER); + // quat_left_ideal_print(&I); + quat_left_ideal_finalize(&I); + ibz_vec_2_finalize(&vec2); + + return res; +} + +int +id2iso_test_ker2id(void) +{ + int res = 1; + printf("\n \nRunning id2iso tests for kernel_dlogs_to_ideal \n \n"); + + for (int i = 0; i < 10; i++) { + res &= _id2iso_test_ker2id(); + } + + if (!res) { + printf("ID2ISO unit test kernel_dlogs_to_ideal() failed\n"); + } + + return res; +} diff --git a/src/id2iso/ref/lvlx/test/represent_integer_benchmarks.c b/src/id2iso/ref/lvlx/test/represent_integer_benchmarks.c new file mode 100644 index 0000000..5651098 --- /dev/null +++ b/src/id2iso/ref/lvlx/test/represent_integer_benchmarks.c @@ -0,0 +1,272 @@ +#include +#include +#include +#include + +#define STRINGIFY2(x) #x +#define STRINGIFY(x) STRINGIFY2(x) + +// return 0 if ok, anything else if error +// sample array of odd numbers +int +id2iso_represent_integer_benchmarks_input_generation(ibz_t *n_gammas, int bitsize, int iterations) +{ + int randret = 1; + ibz_t max; + ibz_init(&max); + ibz_pow(&max, &ibz_const_two, bitsize - 1); + for (int i = 0; i < iterations; i++) { + randret = randret && ibz_rand_interval(&(n_gammas[i]), &ibz_const_one, &max); + ibz_mul(&(n_gammas[i]), &ibz_const_two, &(n_gammas[i])); + ibz_add(&(n_gammas[i]), &ibz_const_one, &(n_gammas[i])); + } + ibz_finalize(&max); + return (!randret); +} + +// 0 if ok, 1 otherwise +int +id2iso_represent_integer_benchmarks_test(const quat_alg_elem_t *gamma, + const ibz_t *n_gamma, + int non_diag, + const quat_represent_integer_params_t *params) +{ + ibz_vec_4_t coord; + ibz_t norm_d, norm_n; + ibz_init(&norm_d); + ibz_init(&norm_n); + ibz_vec_4_init(&coord); + int res = 0; + quat_alg_norm(&norm_n, &norm_d, gamma, &QUATALG_PINFTY); + res = res || !ibz_is_one(&norm_d); + res = res || !(ibz_cmp(&norm_n, n_gamma) == 0); + res = res || !quat_lattice_contains(NULL, &((*params).order->order), gamma); + if (non_diag) { + if ((*params).order->q == 1) { + ibz_mul(&norm_n, &ibz_const_two, &ibz_const_two); + ibz_add(&norm_d, &((*gamma).coord[0]), &((*gamma).coord[3])); + ibz_mod(&norm_d, &norm_d, &norm_n); + res = res || (0 != ibz_cmp(&ibz_const_two, &norm_d)); + ibz_sub(&norm_d, &((*gamma).coord[1]), &((*gamma).coord[2])); + ibz_mod(&norm_d, &norm_d, &norm_n); + res = res || (0 != ibz_cmp(&ibz_const_two, &norm_d)); + } else { + quat_lattice_contains(&coord, &((*params).order->order), gamma); + ibz_gcd(&norm_d, &(coord[1]), &(coord[2])); + ibz_gcd(&norm_d, &norm_d, &(coord[3])); + res = res || ibz_is_even(&norm_d); + } + } + ibz_finalize(&norm_d); + ibz_finalize(&norm_n); + ibz_vec_4_finalize(&coord); + return (res); +} + +int +id2iso_represent_integer_benchmarks(int bitsize, int iterations, int non_diag, int test, int orders) +{ + int res = 0; + int randret = 0; + uint64_t start, end, sum; + ibz_t *n_gammas; + ibz_t aux; + quat_alg_elem_t *gammas; + n_gammas = malloc(iterations * sizeof(ibz_t)); + gammas = malloc(iterations * sizeof(quat_alg_elem_t)); + for (int i = 0; i < iterations; i++) { + ibz_init(&(n_gammas[i])); + quat_alg_elem_init(&(gammas[i])); + } + ibz_init(&aux); + + quat_represent_integer_params_t ri_params; + quat_p_extremal_maximal_order_t order_hnf; + quat_alg_elem_init(&order_hnf.z); + quat_alg_elem_init(&order_hnf.t); + quat_lattice_init(&order_hnf.order); + + printf("Running represent_integer benchmarks for " STRINGIFY(SQISIGN_VARIANT) " with %d iterations, %d orders, " + "non_diag set to %d, inputs of bitsize %d and the %d-bit prime\n", + iterations, + orders, + non_diag, + bitsize, + ibz_bitsize(&(QUATALG_PINFTY.p))); + if (test) { + printf("Tests are run on the outputs\n"); + } + for (int index_alternate_order = 0; index_alternate_order < orders; index_alternate_order++) { + + ri_params.primality_test_iterations = QUAT_represent_integer_params.primality_test_iterations; + + quat_alg_elem_copy(&order_hnf.z, &EXTREMAL_ORDERS[index_alternate_order].z); + quat_alg_elem_copy(&order_hnf.t, &EXTREMAL_ORDERS[index_alternate_order].t); + ibz_copy(&order_hnf.order.denom, &EXTREMAL_ORDERS[index_alternate_order].order.denom); + ibz_mat_4x4_copy(&order_hnf.order.basis, &EXTREMAL_ORDERS[index_alternate_order].order.basis); + order_hnf.q = EXTREMAL_ORDERS[index_alternate_order].q; + ri_params.order = &order_hnf; + ri_params.algebra = &QUATALG_PINFTY; + + // adjust bitsize + ibz_set(&aux, ri_params.order->q); + int bitsize_adjustment = ibz_bitsize(&aux); + +#ifndef NDEBUG + assert(quat_lattice_contains(NULL, &ri_params.order->order, &ri_params.order->z)); + assert(quat_lattice_contains(NULL, &ri_params.order->order, &ri_params.order->t)); +#endif + + randret = randret || id2iso_represent_integer_benchmarks_input_generation( + n_gammas, bitsize + bitsize_adjustment, iterations); + + if (randret) + goto fin; + + sum = 0; + for (int iter = 0; iter < iterations; iter++) { + start = cpucycles(); + res = res | !quat_represent_integer(&(gammas[iter]), &(n_gammas[iter]), non_diag, &ri_params); + end = cpucycles(); + sum = sum + end - start; + } + + printf("For order with q=%d: %" PRIu64 " cycles on average per iteration (adjusted bitsize %d)\n", + (ri_params.order->q), + sum / iterations, + bitsize + bitsize_adjustment); + if (test) { + for (int iter = 0; iter < iterations; iter++) { + res = res || id2iso_represent_integer_benchmarks_test( + &(gammas[iter]), &(n_gammas[iter]), non_diag, &ri_params); + } + } + } + +fin:; + if (randret) { + printf("Randomness failure in id2iso_represent_integer_benchmarks\n"); + } + if (res) { + printf("Tests in id2iso_represent_integer_benchmarks failed\n"); + } + + quat_alg_elem_finalize(&order_hnf.z); + quat_alg_elem_finalize(&order_hnf.t); + quat_lattice_finalize(&order_hnf.order); + ibz_finalize(&aux); + for (int i = 0; i < iterations; i++) { + ibz_finalize(&(n_gammas[i])); + quat_alg_elem_finalize(&(gammas[i])); + } + free(n_gammas); + free(gammas); + + return (res | 2 * randret); +} + +int +main(int argc, char *argv[]) +{ + uint32_t seed[12]; + int iterations = 10 * SQISIGN_TEST_REPS; + int help = 0; + int seed_set = 0; + int max_orders = NUM_ALTERNATE_EXTREMAL_ORDERS + 1; + int orders = max_orders; + int tests = 0; + int non_diag = 1; + int bitsize = ibz_bitsize(&(QUATALG_PINFTY.p)) + 25; + int invalid = 0; + +#ifndef NDEBUG + fprintf(stderr, + "\x1b[31mIt looks like SQIsign was compiled with assertions enabled.\n" + "This will severely impact performance measurements.\x1b[0m\n"); +#endif + + for (int i = 1; i < argc; i++) { + if (!tests && strcmp(argv[i], "--tests") == 0) { + tests = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + + if (non_diag && (strcmp(argv[i], "--disable-non-diag") == 0)) { + non_diag = 0; + continue; + } + + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + + if (sscanf(argv[i], "--bitsize=%d", &bitsize) == 1) { + continue; + } + + if (sscanf(argv[i], "--orders=%d", &orders) == 1) { + continue; + } + } + + invalid = invalid || (argc > 6); + invalid = invalid || ((non_diag != 1) && (non_diag != 0)) || (iterations < 0); + invalid = invalid || (bitsize < ibz_bitsize(&(QUATALG_PINFTY.p)) + 20); + invalid = invalid || (orders > max_orders); + invalid = invalid || (orders < 0); + + if (help || invalid) { + if (invalid) { + printf("Invalid input\n"); + } + printf("Usage: %s [--bitsize=] [--orders=] [--iterations=] " + "[--tests] [--disable-non-diag] [--seed=]\n", + argv[0]); + printf("Where is least 20 higher than the bitsize of the prime used in the " + "algebra(which depends on the level); if no present, uses the default %d; it will be " + "adjusted for larger maximal orders by this program\n", + bitsize); + printf("Where is the number of maximal orders on which benchmarks are run. It " + "must be lower than %d;" + "if not present, uses the default: %d)\n", + max_orders, + orders); + printf("Where is the number of iterations used for benchmarking; if not " + "present, uses the default: %d)\n", + iterations); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + printf("Additional verifications are run on each output if --tests is passed\n"); + printf("If --disable-non-diag is passed, the non_diag flag in the calls is set to 0, otherwise it " + "defaults to 1. If non_diag=1, benchmarks are only run for one order where q=1.\n"); + printf("Output has last bit set if tests failed, second-to-last if randomness failed\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + cpucycles_init(); + + return id2iso_represent_integer_benchmarks(bitsize, iterations, non_diag, tests, orders); +} diff --git a/src/id2iso/ref/lvlx/test/test_dim2id2iso.c b/src/id2iso/ref/lvlx/test/test_dim2id2iso.c new file mode 100644 index 0000000..110d3b3 --- /dev/null +++ b/src/id2iso/ref/lvlx/test/test_dim2id2iso.c @@ -0,0 +1,343 @@ +#include +#include "id2iso_tests.h" +#include +#include + +static int +ec_is_on_curve(ec_point_t *P, ec_curve_t *E) +{ + fp2_t y_sq, X, tmp; + + fp2_copy(&X, &P->z); + fp2_inv(&X); + fp2_mul(&X, &X, &P->x); + fp2_mul(&y_sq, &X, &X); + fp2_mul(&y_sq, &y_sq, &X); // X^3 + fp2_copy(&tmp, &E->C); + fp2_inv(&tmp); + fp2_mul(&tmp, &tmp, &E->A); + fp2_mul(&tmp, &tmp, &X); + fp2_mul(&tmp, &tmp, &X); + fp2_add(&y_sq, &y_sq, &tmp); // X^3 + A X^2 + fp2_add(&y_sq, &y_sq, &X); // X^3 + A X^2 + X + + if (fp2_is_square(&y_sq)) { + return 1; + } else { + return 0; + } +} + +int +dim2id2iso_test_fixed_degree_isogeny(void) +{ + int ret; + ibz_t u, two_pow; + ibz_t tmp; + quat_left_ideal_t lideal; + ibz_init(&u); + ibz_init(&tmp); + ibz_init(&two_pow); + quat_left_ideal_init(&lideal); + + for (int i = 0; i <= NUM_ALTERNATE_EXTREMAL_ORDERS; i++) { + if (EXTREMAL_ORDERS[i].q % 4 == 1) { + // u is a random prime + ibz_generate_random_prime(&u, 1, 110, QUAT_represent_integer_params.primality_test_iterations); + + // now we check that we get a correct codomain in the end + // by evaluating some point and checking the pairing + theta_couple_curve_t E00; + ec_curve_t E0; + copy_curve(&E0, &CURVES_WITH_ENDOMORPHISMS[i].curve); + ec_curve_normalize_A24(&E0); + copy_curve(&E00.E1, &E0); + copy_curve(&E00.E2, &E0); + ec_basis_t bas = CURVES_WITH_ENDOMORPHISMS[i].basis_even; + + assert(test_point_order_twof(&bas.P, &E00.E1, TORSION_EVEN_POWER)); + assert(test_point_order_twof(&bas.Q, &E00.E2, TORSION_EVEN_POWER)); + assert(test_point_order_twof(&bas.PmQ, &E00.E1, TORSION_EVEN_POWER)); + assert(ec_is_on_curve(&bas.P, &E00.E1)); + + // creating points for translation + theta_couple_point_t T1, T2, T3; + copy_point(&T1.P1, &bas.P); + copy_point(&T2.P1, &bas.Q); + copy_point(&T3.P1, &bas.PmQ); + ec_point_init(&T1.P2); + ec_point_init(&T2.P2); + ec_point_init(&T3.P2); + + assert(ec_is_on_curve(&T2.P1, &E00.E1)); + assert(ec_is_on_curve(&T1.P1, &E00.E1)); + assert(ec_is_on_curve(&T3.P1, &E00.E1)); + assert(ec_is_zero(&T1.P2)); + assert(ec_is_zero(&T2.P2)); + assert(ec_is_zero(&T3.P2)); + + theta_couple_curve_t codomain; + theta_couple_point_t pushed_points[3]; + theta_couple_point_t *const Tev1 = pushed_points + 0, *const Tev2 = pushed_points + 1, + *const Tev3 = pushed_points + 2; + pushed_points[0] = T1; + pushed_points[1] = T2; + pushed_points[2] = T3; + + // Compute the isogeny and evaluation + ret = fixed_degree_isogeny_and_eval( + &lideal, &u, 0, &codomain, pushed_points, sizeof(pushed_points) / sizeof(*pushed_points), i); + assert(ret); + unsigned int length = (unsigned int)ret; + + assert(ec_is_on_curve(&Tev1->P2, &codomain.E2)); + assert(ec_is_on_curve(&Tev2->P1, &codomain.E1)); + assert(ec_is_on_curve(&Tev1->P1, &codomain.E1)); + assert(ec_is_on_curve(&Tev3->P1, &codomain.E1)); + assert(ec_is_on_curve(&Tev2->P2, &codomain.E2)); + assert(ec_is_on_curve(&Tev3->P2, &codomain.E2)); + + assert(test_point_order_twof(&Tev1->P1, &codomain.E1, TORSION_EVEN_POWER)); + assert(test_point_order_twof(&Tev1->P2, &codomain.E2, TORSION_EVEN_POWER)); + assert(test_point_order_twof(&Tev2->P1, &codomain.E1, TORSION_EVEN_POWER)); + assert(test_point_order_twof(&Tev2->P2, &codomain.E2, TORSION_EVEN_POWER)); + assert(test_point_order_twof(&Tev3->P1, &codomain.E1, TORSION_EVEN_POWER)); + assert(test_point_order_twof(&Tev3->P2, &codomain.E2, TORSION_EVEN_POWER)); + fp2_t w0, w1, w2; + + weil(&w0, TORSION_EVEN_POWER, &bas.P, &bas.Q, &bas.PmQ, &E0); + weil(&w1, TORSION_EVEN_POWER, &Tev1->P1, &Tev2->P1, &Tev3->P1, &codomain.E1); + weil(&w2, TORSION_EVEN_POWER, &Tev1->P2, &Tev2->P2, &Tev3->P2, &codomain.E2); + ibz_pow(&two_pow, &ibz_const_two, length); + ibz_sub(&two_pow, &two_pow, &u); + // now we are checking that one of the two is equal to the correct value + digit_t digit_u[NWORDS_ORDER] = { 0 }; + ibz_to_digit_array(digit_u, &u); + fp2_t test_pow; + fp2_pow_vartime(&test_pow, &w0, digit_u, NWORDS_ORDER); + + // The way we set up the 2d isogeny we should always get the first curve + assert(fp2_is_equal(&test_pow, &w1)); + ibz_to_digit_array(digit_u, &two_pow); + fp2_pow_vartime(&test_pow, &w0, digit_u, NWORDS_ORDER); + assert(fp2_is_equal(&test_pow, &w2)); + } + } + + ibz_finalize(&tmp); + ibz_finalize(&u); + ibz_finalize(&two_pow); + quat_left_ideal_finalize(&lideal); + + return 1; +} + +int +dim2id2iso_test_find_uv(void) +{ + // var dec + int found = 1; + ibz_t temp, remainder, n1, n2; + ibz_t norm_d; + quat_alg_elem_t gen; + + quat_left_ideal_t lideal_small; + quat_lattice_t right_order; + ibz_mat_4x4_t reduced, gram; + ibz_vec_4_t coeffs; + quat_alg_elem_t beta1, beta2; + ibz_t u, v, d1, d2, target; + // var init + ibz_init(&target); + ibz_init(&norm_d); + ibz_init(&temp); + ibz_init(&remainder); + ibz_init(&n1); + ibz_init(&n2); + quat_alg_elem_init(&gen); + quat_left_ideal_init(&lideal_small); + quat_lattice_init(&right_order); + ibz_mat_4x4_init(&reduced); + ibz_mat_4x4_init(&gram); + ibz_vec_4_init(&coeffs); + + quat_alg_elem_init(&beta1); + quat_alg_elem_init(&beta2); + + ibz_init(&u); + ibz_init(&v); + ibz_init(&d1); + ibz_init(&d2); + + // computation of lideal_small + ibz_generate_random_prime( + &n1, 1, ibz_bitsize(&QUATALG_PINFTY.p), QUAT_represent_integer_params.primality_test_iterations); + ibz_generate_random_prime( + &n2, 1, ibz_bitsize(&QUATALG_PINFTY.p), QUAT_represent_integer_params.primality_test_iterations); + ibz_mul(&temp, &n1, &n2); + found = found && quat_represent_integer(&gen, &temp, 0, &QUAT_represent_integer_params); + assert(found); + quat_lideal_create(&lideal_small, &gen, &n1, &STANDARD_EXTREMAL_ORDER.order, &QUATALG_PINFTY); + + int exp = TORSION_EVEN_POWER; + ibz_pow(&target, &ibz_const_two, exp); + + found = 0; + int num_rerun = 0; + int max_num_rerun = 2; + int index_alternate_order_1; + int index_alternate_order_2; + while (!found && num_rerun < max_num_rerun) { + found = find_uv(&u, + &v, + &beta1, + &beta2, + &d1, + &d2, + &index_alternate_order_1, + &index_alternate_order_2, + &target, + &lideal_small, + &QUATALG_PINFTY, + NUM_ALTERNATE_EXTREMAL_ORDERS); + if (num_rerun > 0) { + printf("alternate rerun ! \n"); + } + num_rerun++; + } + // TOC_clock(t,"alternate find_uv"); + // printf("\n\n"); + // assert(found); + + if (!found) { + printf("alternate failed \n"); + } + + ibz_finalize(&norm_d); + ibz_finalize(&temp); + ibz_finalize(&remainder); + ibz_finalize(&n1); + ibz_finalize(&n2); + quat_alg_elem_finalize(&gen); + quat_left_ideal_finalize(&lideal_small); + quat_lattice_finalize(&right_order); + ibz_mat_4x4_finalize(&reduced); + ibz_mat_4x4_finalize(&gram); + ibz_finalize(&u); + ibz_finalize(&v); + ibz_finalize(&d1); + ibz_finalize(&d2); + ibz_vec_4_finalize(&coeffs); + ibz_finalize(&target); + + quat_alg_elem_finalize(&beta1); + quat_alg_elem_finalize(&beta2); + + return found; +} + +int +dim2id2iso_test_dimid2iso(void) +{ + + // var dec + int found = 1; + ibz_t temp, remainder, n1, n2; + quat_alg_elem_t gen; + + quat_left_ideal_t lideal_small; + quat_lattice_t right_order; + ibz_mat_4x4_t reduced, gram; + quat_alg_elem_t beta1, beta2; + ibz_t u, v, d1, d2; + + // var init + ibz_init(&temp); + ibz_init(&remainder); + ibz_init(&n1); + ibz_init(&n2); + quat_alg_elem_init(&gen); + quat_left_ideal_init(&lideal_small); + quat_lattice_init(&right_order); + ibz_mat_4x4_init(&reduced); + ibz_mat_4x4_init(&gram); + + quat_alg_elem_init(&beta1); + quat_alg_elem_init(&beta2); + + ibz_init(&u); + ibz_init(&v); + ibz_init(&d1); + ibz_init(&d2); + + // we start by checking that the precomputation is correct, while checking at the same time our + // algorithm + for (int i = 0; i < NUM_ALTERNATE_EXTREMAL_ORDERS; i++) { + ec_basis_t bas_check; + ec_curve_t codom_check; + quat_left_ideal_t id; + quat_left_ideal_init(&id); + quat_lideal_copy(&id, &ALTERNATE_CONNECTING_IDEALS[i]); + found = found && dim2id2iso_arbitrary_isogeny_evaluation(&bas_check, &codom_check, &id); + ec_isom_t isom; + ec_isomorphism(&isom, &codom_check, &ALTERNATE_STARTING_CURVES[i].curve); + ec_iso_eval(&bas_check.P, &isom); + ec_iso_eval(&bas_check.Q, &isom); + ec_iso_eval(&bas_check.PmQ, &isom); + assert(test_point_order_twof(&bas_check.P, &ALTERNATE_STARTING_CURVES[i].curve, TORSION_EVEN_POWER)); + assert(test_point_order_twof(&bas_check.Q, &ALTERNATE_STARTING_CURVES[i].curve, TORSION_EVEN_POWER)); + assert(test_point_order_twof(&bas_check.PmQ, &ALTERNATE_STARTING_CURVES[i].curve, TORSION_EVEN_POWER)); + assert(ec_is_equal(&bas_check.P, &ALTERNATE_STARTING_CURVES[i].basis_even.P)); + assert(ec_is_equal(&bas_check.Q, &ALTERNATE_STARTING_CURVES[i].basis_even.Q)); + assert(ec_is_equal(&bas_check.PmQ, &ALTERNATE_STARTING_CURVES[i].basis_even.PmQ)); + quat_left_ideal_finalize(&id); + } + + // computation of lideal_small + ibz_generate_random_prime( + &n1, 1, ibz_bitsize(&QUATALG_PINFTY.p), QUAT_represent_integer_params.primality_test_iterations); + ibz_generate_random_prime( + &n2, 1, ibz_bitsize(&QUATALG_PINFTY.p), QUAT_represent_integer_params.primality_test_iterations); + ibz_mul(&temp, &n1, &n2); + found = found && quat_represent_integer(&gen, &temp, 0, &QUAT_represent_integer_params); + assert(found); + quat_lideal_create(&lideal_small, &gen, &n1, &STANDARD_EXTREMAL_ORDER.order, &QUATALG_PINFTY); + ec_basis_t bas_end; + ec_curve_t codom; + ec_curve_init(&codom); + + found = dim2id2iso_ideal_to_isogeny_clapotis( + &beta1, &beta2, &u, &v, &d1, &d2, &codom, &bas_end, &lideal_small, &QUATALG_PINFTY); + + for (int i = 0; i < 10; i++) { + ibz_generate_random_prime( + &n1, 1, ibz_bitsize(&QUATALG_PINFTY.p), QUAT_represent_integer_params.primality_test_iterations); + ibz_generate_random_prime( + &n2, 1, ibz_bitsize(&QUATALG_PINFTY.p), QUAT_represent_integer_params.primality_test_iterations); + ibz_mul(&temp, &n1, &n2); + found = found && quat_represent_integer(&gen, &temp, 0, &QUAT_represent_integer_params); + assert(found); + quat_lideal_create(&lideal_small, &gen, &n1, &STANDARD_EXTREMAL_ORDER.order, &QUATALG_PINFTY); + found = dim2id2iso_ideal_to_isogeny_clapotis( + &beta1, &beta2, &u, &v, &d1, &d2, &codom, &bas_end, &lideal_small, &QUATALG_PINFTY); + } + + ibz_finalize(&temp); + ibz_finalize(&remainder); + ibz_finalize(&n1); + ibz_finalize(&n2); + quat_alg_elem_finalize(&gen); + quat_left_ideal_finalize(&lideal_small); + quat_lattice_finalize(&right_order); + ibz_mat_4x4_finalize(&reduced); + ibz_mat_4x4_finalize(&gram); + ibz_finalize(&u); + ibz_finalize(&v); + ibz_finalize(&d1); + ibz_finalize(&d2); + + quat_alg_elem_finalize(&beta1); + quat_alg_elem_finalize(&beta2); + + return found; +} diff --git a/src/id2iso/ref/lvlx/test/test_id2iso.c b/src/id2iso/ref/lvlx/test/test_id2iso.c new file mode 100644 index 0000000..756467a --- /dev/null +++ b/src/id2iso/ref/lvlx/test/test_id2iso.c @@ -0,0 +1,78 @@ +#include +#include +#include + +#include "id2iso_tests.h" +#include "dim2id2iso_tests.h" +#include +#include +#include + +// run all tests in module +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int help = 0; + int seed_set = 0; + int res = 1; + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + } + + if (help) { + printf("Usage: %s [--seed=]\n", argv[0]); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + + printf("Running id2iso module unit tests\n"); + + res = res & id2iso_test_ker2id(); + + printf("\nRunning dim2id2iso module unit tests\n"); + + printf("\nRunning find uv tests \n"); + int number_test_find_uv = 5; + for (int i = 0; i < number_test_find_uv; i++) { + res = res & dim2id2iso_test_find_uv(); + } + + printf("\nRunning fixed degree tests\n"); + + res = res & dim2id2iso_test_fixed_degree_isogeny(); + + printf("\nRunning id2iso_clapotis tests\n"); + res = res & dim2id2iso_test_dimid2iso(); + + if (!res) { + printf("\nSome tests failed!\n"); + } else { + printf("\nAll tests passed!\n"); + } + return (!res); +} diff --git a/src/id2iso/ref/lvlx_test.cmake b/src/id2iso/ref/lvlx_test.cmake new file mode 100644 index 0000000..661e0c1 --- /dev/null +++ b/src/id2iso/ref/lvlx_test.cmake @@ -0,0 +1,18 @@ +set(SOURCE_FILES_ID2ISO_GENERIC_REF_TESTS + ${LVLX_DIR}/test/ker2id.c + ${LVLX_DIR}/test/test_id2iso.c + ${LVLX_DIR}/test/test_dim2id2iso.c +) +add_executable(sqisign_test_id2iso_${SVARIANT_LOWER} ${SOURCE_FILES_ID2ISO_GENERIC_REF_TESTS}) +target_link_libraries(sqisign_test_id2iso_${SVARIANT_LOWER} ${LIB_ID2ISO_${SVARIANT_UPPER}} sqisign_common_test) +target_include_directories(sqisign_test_id2iso_${SVARIANT_LOWER} PRIVATE ${INC_PUBLIC} ${INC_EC} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_HD} ${INC_ID2ISO} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ./include/ ) + +add_test(sqisign_test_id2iso_${SVARIANT_LOWER} sqisign_test_id2iso_${SVARIANT_LOWER}) + +set(SOURCE_FILES_ID2ISO_RI_BENCH + ${LVLX_DIR}/test/represent_integer_benchmarks.c +) +add_executable(sqisign_id2iso_benchmark_represent_integer_${SVARIANT_LOWER} ${SOURCE_FILES_ID2ISO_RI_BENCH}) +target_link_libraries(sqisign_id2iso_benchmark_represent_integer_${SVARIANT_LOWER} ${LIB_ID2ISO_${SVARIANT_UPPER}} sqisign_common_test) +target_include_directories(sqisign_id2iso_benchmark_represent_integer_${SVARIANT_LOWER} PRIVATE ${INC_PUBLIC} ${INC_EC} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_HD} ${INC_ID2ISO} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ./include/ ) +set(BM_BINS ${BM_BINS} sqisign_id2iso_benchmark_represent_integer_${SVARIANT_LOWER} CACHE INTERNAL "List of benchmark executables") diff --git a/src/intbig/ref/generic/CMakeLists.txt b/src/intbig/ref/generic/CMakeLists.txt deleted file mode 100644 index b99098d..0000000 --- a/src/intbig/ref/generic/CMakeLists.txt +++ /dev/null @@ -1,9 +0,0 @@ -set(SOURCE_FILES_INTBIG_GENERIC_REF - intbig.c -) - -add_library(${LIB_INTBIG} ${SOURCE_FILES_INTBIG_GENERIC_REF}) -target_include_directories(${LIB_INTBIG} PRIVATE common ${INC_PUBLIC} ${INC_COMMON} include gmp) -target_compile_options(${LIB_INTBIG} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) diff --git a/src/intbig/ref/generic/include/intbig.h b/src/intbig/ref/generic/include/intbig.h deleted file mode 100644 index 0dbd3ab..0000000 --- a/src/intbig/ref/generic/include/intbig.h +++ /dev/null @@ -1,545 +0,0 @@ -/** @file - * - * @authors Luca De Feo, Sina Schaeffler - * - * @brief Declarations for big integers in the reference implementation -*/ - -#ifndef INTBIG_H -#define INTBIG_H - -#include -#include -#include - -/** @defgroup ibz_all Signed big integers - * @{ -*/ - -/** @defgroup ibz_t Precise number types - * @{ -*/ - -/** @brief Type for signed long integers - * - * @typedef ibz_t - * - * For integers of arbitrary size, used by intbig module, using gmp -*/ -typedef mpz_t ibz_t ; - -/** @brief Type for fractions of integers - * - * @typedef ibq_t - * - * For fractions of integers of arbitrary size, used by intbig module, using gmp -*/ -typedef mpq_t ibq_t ; - - -/** @brief Type for vector of 2 big integers - * - * @typedef ibz_vec_2_t -*/ -typedef ibz_t ibz_vec_2_t[2]; - -/** @} -*/ - - -/********************************************************************/ - -/** @defgroup ibz_c Constants - * @{ -*/ - -/** - * Constant zero -*/ -extern const ibz_t ibz_const_zero; - -/** - * Constant one -*/ -extern const ibz_t ibz_const_one; - -/** - * Constant two -*/ -extern const ibz_t ibz_const_two; - -/** - * Constant three -*/ -extern const ibz_t ibz_const_three; - -/** @} -*/ - -/* constructors/destructors (possibly no-ops) */ - -/** @defgroup ibz_c Constructors and Destructors - * @{ -*/ - -void ibz_init(ibz_t *x); -void ibq_init(ibq_t *x); -void ibz_vec_2_init(ibz_vec_2_t *vec); - - -void ibz_finalize(ibz_t *x); -void ibq_finalize(ibq_t *x); -void ibz_vec_2_finalize(ibz_vec_2_t *vec); - -/** @brief overwrites memory before freeing it -*/ -void ibz_secure_finalize(ibz_t *x); - -/** @brief overwrites memory before freeing it -*/ -void ibq_secure_finalize(ibq_t *x); - -/** @brief overwrites memory before freeing it -*/ -void ibz_vec_2_secure_finalize(ibz_vec_2_t *vec); - -/** @} -*/ - -/** @defgroup ibz_za Basic integer arithmetic - * @{ -*/ - -/** @brief sum=a+b -*/ -void ibz_add(ibz_t *sum, const ibz_t *a, const ibz_t *b); - -/** @brief diff=a-b -*/ -void ibz_sub(ibz_t *diff, const ibz_t *a, const ibz_t *b); - -/** @brief prod=a*b -*/ -void ibz_mul(ibz_t *prod, const ibz_t *a, const ibz_t *b); - -/** @brief prod=a*2^exp -*/ -void ibz_mul_2exp(ibz_t *prod, const ibz_t *a, uint64_t exp); - -/** @brief neg=-a -*/ -void ibz_neg(ibz_t *neg, const ibz_t* a); - -/** @brief abs=|a| -*/ -void ibz_abs(ibz_t *abs, const ibz_t* a); - -/** @brief Euclidean division of a by b - * - * Computes quotient, remainder so that remainder+quotient*b = a where 0<=|remainder|<|b| - * The quotient is rounded towards zero. -*/ -void ibz_div(ibz_t *quotient, ibz_t *remainder, const ibz_t *a, const ibz_t *b); - -/** @brief Euclidean division of a by b - * - * Computes quotient, remainder so that remainder+quotient*b = a where 0<=|remainder|<|b| - * The quotient is rounded towards minus infinity. - */ -void ibz_div_floor(ibz_t *q, ibz_t *r, const ibz_t *n, const ibz_t *d); - -/** @brief Euclidean division of a by 2^exp - * - * Computes a right shift of abs(a) by exp bits, then sets sign(quotient) to sign(a). - * - * Division and rounding is as in ibz_div. -*/ -void ibz_div_2exp(ibz_t *quotient, const ibz_t *a, uint64_t exp); - -/** @brief r = a mod b - * - * Assumes valid inputs - * The sign of the divisor is ignored, the result is always non-negative -*/ -void ibz_mod(ibz_t *r, const ibz_t *a, const ibz_t *b); - -/** @brief Test if a = 0 mod b -*/ -int ibz_divides(const ibz_t *a, const ibz_t *b); - -/** @brief pow=x^e - * - * Assumes valid inputs, The case 0^0 yields 1. -*/ -void ibz_pow(ibz_t *pow, const ibz_t *x, int64_t e); - -/** @brief pow=(x^e) mod m - * - * Assumes valid inputs -*/ -void ibz_pow_mod(ibz_t *pow, const ibz_t *x, const ibz_t *e, const ibz_t *m); - -/** @brief Compare a and b - * - * @returns a positive value if a > b, zero if a = b, and a negative value if a < b -*/ -int ibz_cmp(const ibz_t *a, const ibz_t *b); - -/** @brief Test if x is 0 - * - * @returns 1 if x=0, 0 otherwise -*/ -int ibz_is_zero(const ibz_t *x); - -/** @brief Test if x is 1 - * - * @returns 1 if x=1, 0 otherwise -*/ -int ibz_is_one(const ibz_t *x); - -/** @brief Test if x is even - * - * @returns 1 if x is even, 0 otherwise -*/ -int ibz_is_even(const ibz_t *x); - -/** @brief set i to value x -*/ -void ibz_set(ibz_t *i, int64_t x); - -/** @brief set i to integer ontained in string when read as number in base - * - * Base should be 10 or 16, and the number should be written without ponctuation or whitespaces - * - * Case for base 16 does not matter - * - * @returns 1 if the string could be converted to an integer, 0 otherwise - */ -int ibz_set_from_str(ibz_t *i, const char *str, int base); - -/** @brief Copy value into target -*/ -void ibz_copy(ibz_t *target, const ibz_t *value); - -/** @brief Exchange values of a and b - */ -void ibz_swap(ibz_t *a, ibz_t *b); - -/** @brief Copy dig array to target, given digits and the length of the dig array - * - * @param target Target ibz_t element - * @param dig array of digits - * @param dig_len length of the digits array -*/ -void ibz_copy_digits(ibz_t *target, const digit_t *dig, int dig_len); -#define ibz_copy_digit_array(I, T) do { ibz_copy_digits((I), (T), sizeof(T)/sizeof(*(T))); } while (0) - -/** @brief Copy an ibz_t to target digit_t array. - * Restrictions: ibz >= 0 and target must hold sufficient elements to hold ibz - * - * @param target Target digit_t array - * @param ibz ibz source ibz_t element -*/ -void ibz_to_digits(digit_t *target, const ibz_t *ibz); -#define ibz_to_digit_array(T, I) do { memset((T), 0, sizeof(T)); ibz_to_digits((T), (I)); } while (0) - -/** @brief get int64_t equal to the lowest bits of i -*/ -int64_t ibz_get(const ibz_t *i); - -//void ibz_printf(const char* format, ...); -#define ibz_printf gmp_printf - -/** @brief generate random value in [a, b] - * assumed that a >= 0 and b >= 0 and a < b - * @returns 1 on success, 0 on failiure -*/ -int ibz_rand_interval(ibz_t *rand, const ibz_t *a, const ibz_t *b); - -/** @brief generate random value in [a, b] - * assumed that a >= 0, b >= 0 and a < b - * @returns 1 on success, 0 on failiure -*/ -int ibz_rand_interval_i(ibz_t *rand, int64_t a, int64_t b); - -/** @brief generate random value in [-m, m] - * assumed that m > 0 and bitlength of m < 64 bit - * @returns 1 on success, 0 on failiure -*/ -int ibz_rand_interval_minm_m(ibz_t *rand, int64_t m); - - -/** @brief Bitsize of a. - * - * @returns Bitsize of a. - * -*/ -int ibz_bitsize(const ibz_t *a); - - -/* etc....*/ - -/** @} -*/ - -/** @defgroup ibz_qa Basic fraction arithmetic - * @{ -*/ - -/** @brief sum=a+b -*/ -void ibq_add(ibq_t *sum, const ibq_t *a, const ibq_t *b); - -/** @brief diff=a-b -*/ -void ibq_sub(ibq_t *diff, const ibq_t *a, const ibq_t *b); - -/** @brief neg=-x - */ -void ibq_neg(ibq_t *neg, const ibq_t *x); - -/** @brief abs=|x| - */ -void ibq_abs(ibq_t *abs, const ibq_t *x); - -/** @brief prod=a*b -*/ -void ibq_mul(ibq_t* prod, const ibq_t *a, const ibq_t *b); - -/** @brief inv=1/x - * - * @returns 0 if x is 0, 1 if inverse exists and was computed -*/ -int ibq_inv(ibq_t *inv, const ibq_t *x); - -/** @brief quot = a/b - * @param quot Output a/b - * @param a - * @param b must not be 0 -*/ -void ibq_div(ibq_t *quot, const ibq_t *a, const ibq_t *b); - -/** @brief Compare a and b - * - * @returns a positive value if a > b, zero if a = b, and a negative value if a < b -*/ -int ibq_cmp(const ibq_t *a, const ibq_t *b); - -/** @brief Test if x is 0 - * - * @returns 1 if x=0, 0 otherwise -*/ -int ibq_is_zero(const ibq_t *x); - -/** @brief Test if x is 1 - * - * @returns 1 if x=1, 0 otherwise -*/ -int ibq_is_one(const ibq_t *x); - -/** @brief Set q to a/b if b not 0 - * - * @returns 1 if b not 0 and q is set, 0 otherwise -*/ -int ibq_set(ibq_t *q, const ibz_t *a, const ibz_t *b); - -/** @brief Set x to 0 - * - * Assumes x is initialized -*/ -void ibq_set_zero(ibq_t *x); - -/** @brief Set x to 1 - * - * Assumes x is initialized -*/ -void ibq_set_one(ibq_t *x); - -/** @brief Copy value into target -*/ -void ibq_copy(ibq_t *target, const ibq_t *value); - -/** @brief Exchange values of a and b - */ -void ibq_swap(ibq_t *a, ibq_t *b); - -/** @brief Denominator of x -*/ -void ibq_denom(ibz_t *d, const ibq_t *x); - -/** @brief Numerator of x -*/ -void ibq_num(ibz_t *n, const ibq_t *x); - -/** @brief Checks if q is an integer - * - * @returns 1 if yes, 0 if not -*/ -int ibq_is_ibz(const ibq_t *q); - -/** - * @brief Converts a fraction q to an integer y, if q is an integer. - * - * @returns 1 if z is an integer, 0 if not -*/ -int ibq_to_ibz(ibz_t *z, const ibq_t *q); - -/** @} -*/ - -/** @defgroup ibz_n Number theory functions - * @{ -*/ - - -/** - * @brief Probabilistic primality test - * - * @param n The number to test - * @param reps Number of Miller-Rabin repetitions. The more, the slower and the less likely are false positives - * @return 1 if probably prime, 0 if certainly not prime, 2 if certainly prime - * - * Using GMP's implementation: - * - * From GMP's documentation: "This function performs some trial divisions, a Baillie-PSW probable prime test, then reps-24 Miller-Rabin probabilistic primality tests." - */ -int ibz_probab_prime(const ibz_t *n, int reps); - -/** - * @brief Greatest common divisor - * - * @param gcd Output: Set to the gcd of a and b - * @param a - * @param b - */ -void ibz_gcd(ibz_t *gcd, const ibz_t *a, const ibz_t *b); - -/** - * @brief GCD and Bézout coefficients u, v such that ua + bv = gcd - * - * @param gcd Output: Set to the gcd of a and b - * @param u Output: integer such that ua+bv=gcd - * @param v Output: Integer such that ua+bv=gcd - * @param a - * @param b - */ -void ibz_xgcd(ibz_t *gcd, ibz_t *u, ibz_t *v, const ibz_t *a, const ibz_t *b); - -/** - * @brief GCD, Bézout coefficients u, v such that ua + bv = gcd, and annihilators s, t such that sa + bt = 0 - * - * @param gcd Output: Set to the gcd of a and b - * @param s Output: integer such that sa+bt=0 - * @param t Output: Integer such that sa+bt=0 - * @param u Output: integer such that ua+bv=gcd - * @param v Output: Integer such that ua+bv=gcd - * @param a - * @param b - */ -void ibz_xgcd_ann(ibz_t *gcd, ibz_t *s, ibz_t *t, ibz_t *u, ibz_t *v, const ibz_t *a, const ibz_t *b); - - -/** - * @brief Modular inverse - * - * @param inv Output: Set to the integer in [0,mod[ such that a*inv = 1 mod (mod) if it exists - * @param a - * @param mod - * @returns 1 if inverse exists and was computed, 0 otherwise - */ -int ibz_invmod(ibz_t *inv, const ibz_t *a, const ibz_t *mod); - -/** - * @brief Chinese remainders - * - * @param crt Output: Set so that crt = a mod (mod_a), crt = b mod (mod_b) - * @param a - * @param b - * @param mod_a - * @param mod_b - */ -void ibz_crt(ibz_t *crt, const ibz_t *a, const ibz_t *b, const ibz_t *mod_a, const ibz_t *mod_b); - -/** - * @brief Kronecker symbol of a mod b - * - * @returns Kronecker symbol of a mod b - * @param a - * @param b - * - * Uses GMP's implementation - */ -int ibz_kronecker(const ibz_t *a, const ibz_t *b); - -/** - * @brief Jacobi symbol of a mod odd - * - * @returns jacobi symbol of a mod odd - * @param a - * @param odd assumed odd - * - * Uses GMP's implementation - * - * If output is -1, a is a not a square mod odd - */ -int ibz_jacobi(const ibz_t *a, const ibz_t *odd); - -/** - * @brief Legendre symbol of a mod p - * - * @returns Legendre symbol of a mod p - * @param a - * @param p assumed prime - * - * Uses GMP's implementation - * - * If output is 1, a is a square mod p, if -1, not. If 0, it is divisible by p - */ -int ibz_legendre(const ibz_t *a, const ibz_t *p); - - - -/** - * @brief Integer square root of a perfect square - * - * @returns 1 if an integer square root of a exists and was computed, 0 otherwise - * @param sqrt Output: Set to a integer square root of a if any exist - * @param a number of which an integer square root is searched - */ -int ibz_sqrt(ibz_t *sqrt, const ibz_t *a); - -/** - * @brief Floor of Integer square root - * - * @param sqrt Output: Set to the floor of an integer square root - * @param a number of which a floor of an integer square root is searched - */ -void ibz_sqrt_floor(ibz_t *sqrt, const ibz_t *a); - -/** - * @brief Square root modulo a prime - * - * @returns 1 if square root of a mod p exists and was computed, 0 otherwise - * @param sqrt Output: Set to a square root of a mod p if any exist - * @param a number of which a square root mod p is searched - * @param p assumed prime - */ -int ibz_sqrt_mod_p(ibz_t *sqrt, const ibz_t *a, const ibz_t *p); - -/** - * @brief Square root modulo a the double of a given prime - * - * @returns 1 if square root of a mod (2p) exists and was computed, 0 otherwise - * @param sqrt Output: Set to a square root of a mod (2p) if any exist - * @param a number of which a square root mod (2p) is searched - * @param p assumed prime - */ -int ibz_sqrt_mod_2p(ibz_t *sqrt, const ibz_t *a, const ibz_t *p); - -/** @} -*/ - -// end of ibz_all -/** @} -*/ -#endif diff --git a/src/intbig/ref/generic/intbig.c b/src/intbig/ref/generic/intbig.c deleted file mode 100644 index 0a8bedc..0000000 --- a/src/intbig/ref/generic/intbig.c +++ /dev/null @@ -1,1114 +0,0 @@ -#include -#include -#include -#include -#include - -//#define DEBUG_VERBOSE - -#ifdef DEBUG_VERBOSE -#define DEBUG_STR_PRINTF(x) printf("%s\n", (x)); -#define DEBUG_STR_FUN_INT_MP(op, arg1, arg2) \ - gmp_printf("%s,%lx,%Zx\n", (op), (arg1), (arg2)); -#define DEBUG_STR_FUN_3(op, arg1, arg2, arg3) \ - gmp_printf("%s,%Zx,%Zx,%Zx\n", (op), (arg1), (arg2), (arg3)); -#define DEBUG_STR_FUN_INT_MP2(op, arg1, arg2, arg3) \ - if ((arg1) >= 0) \ - gmp_printf("%s,%lx,%Zx,%Zx\n", (op), (arg1), (arg2), (arg3)); \ - else \ - gmp_printf("%s,-%lx,%Zx,%Zx\n", (op), (-arg1), (arg2), (arg3)); -#define DEBUG_STR_FUN_INT_MP_INT(op, arg1, arg2, arg3) \ - gmp_printf("%s,%lx,%Zx,%lx\n", (op), (arg1), (arg2), (arg3)); -#define DEBUG_STR_FUN_4(op, arg1, arg2, arg3, arg4) \ - gmp_printf("%s,%Zx,%Zx,%Zx,%Zx\n", (op), (arg1), (arg2), (arg3), (arg4)); -#else -#define DEBUG_STR_PRINTF(x) -#define DEBUG_STR_FUN_INT_MP(op, arg1, arg2) -#define DEBUG_STR_FUN_3(op, arg1, arg2, arg3) -#define DEBUG_STR_FUN_INT_MP2(op, arg1, arg2, arg3) -#define DEBUG_STR_FUN_INT_MP_INT(op, arg1, arg2, arg3) -#define DEBUG_STR_FUN_4(op, arg1, arg2, arg3, arg4) -#endif - -/** @defgroup ibz_t Constants - * @{ - */ - -const __mpz_struct ibz_const_zero[1] = { - { - ._mp_alloc = 0, - ._mp_size = 0, - ._mp_d = (mp_limb_t[]){0}, - } -}; - -const __mpz_struct ibz_const_one[1] = { - { - ._mp_alloc = 0, - ._mp_size = 1, - ._mp_d = (mp_limb_t[]){1}, - } -}; - -const __mpz_struct ibz_const_two[1] = { - { - ._mp_alloc = 0, - ._mp_size = 1, - ._mp_d = (mp_limb_t[]){2}, - } -}; - -const __mpz_struct ibz_const_three[1] = { - { - ._mp_alloc = 0, - ._mp_size = 1, - ._mp_d = (mp_limb_t[]){3}, - } -}; - -/* constructors/destructors (possibly no-ops) */ - -/** @defgroup ibz_t Constructors and Destructors - * @{ - */ - -void ibz_init(ibz_t *x) -{ - mpz_init(*x); -} - -void ibq_init(ibq_t *x) -{ - mpq_init(*x); -} - -void ibz_vec_2_init(ibz_vec_2_t *vec) -{ - ibz_init(&((*vec)[0])); - ibz_init(&((*vec)[1])); -} - -void ibz_finalize(ibz_t *x) -{ - mpz_clear(*x); -} - -void ibz_secure_finalize(ibz_t *x) -{ - typedef void (*setui_t)(mpz_t, unsigned long int); - static volatile setui_t setui_fun = mpz_set_ui; - setui_fun(*x, 0); - mpz_clear(*x); -} - -void ibq_finalize(ibq_t *x) -{ - mpq_clear(*x); -} - -void ibq_secure_finalize(ibq_t *x) -{ - typedef void (*setui_t)(mpq_t, unsigned long int, unsigned long int); - static volatile setui_t setui_fun = mpq_set_ui; - setui_fun(*x, 0, 0); - mpq_clear(*x); -} - -void ibz_vec_2_finalize(ibz_vec_2_t *vec) -{ - ibz_finalize(&((*vec)[0])); - ibz_finalize(&((*vec)[1])); -} - -void ibz_vec_2_secure_finalize(ibz_vec_2_t *vec) -{ - ibz_secure_finalize(&((*vec)[0])); - ibz_secure_finalize(&((*vec)[1])); -} - -/** @} - */ - -/** @defgroup ibz_za Basic integer arithmetic - * @{ - */ - -/** @brief sum=a+b - */ -void ibz_add(ibz_t *sum, const ibz_t *a, const ibz_t *b) -{ -#ifdef DEBUG_VERBOSE - ibz_t a_cp, b_cp; - ibz_init(&a_cp); - ibz_init(&b_cp); - ibz_copy(&a_cp, a); - ibz_copy(&b_cp, b); -#endif - mpz_add(*sum, *a, *b); -#ifdef DEBUG_VERBOSE - DEBUG_STR_FUN_3("ibz_add", *sum, a_cp, b_cp); - ibz_finalize(&a_cp); - ibz_finalize(&b_cp); -#endif -} - -/** @brief diff=a-b - */ -void ibz_sub(ibz_t *diff, const ibz_t *a, const ibz_t *b) -{ -#ifdef DEBUG_VERBOSE - ibz_t a_cp, b_cp; - ibz_init(&a_cp); - ibz_init(&b_cp); - ibz_copy(&a_cp, a); - ibz_copy(&b_cp, b); -#endif - mpz_sub(*diff, *a, *b); - -#ifdef DEBUG_VERBOSE - DEBUG_STR_FUN_3("ibz_sub", *diff, a_cp, b_cp); - ibz_finalize(&a_cp); - ibz_finalize(&b_cp); -#endif -} - -/** @brief prod=a*b - */ -void ibz_mul(ibz_t *prod, const ibz_t *a, const ibz_t *b) -{ -#ifdef DEBUG_VERBOSE - ibz_t a_cp, b_cp; - ibz_init(&a_cp); - ibz_init(&b_cp); - ibz_copy(&a_cp, a); - ibz_copy(&b_cp, b); -#endif - mpz_mul(*prod, *a, *b); -#ifdef DEBUG_VERBOSE - DEBUG_STR_FUN_3("ibz_mul", *prod, a_cp, b_cp); - ibz_finalize(&a_cp); - ibz_finalize(&b_cp); -#endif - -} - -/** @brief prod=a*2^exp -*/ -void ibz_mul_2exp(ibz_t *prod, const ibz_t *a, uint64_t exp) { -#ifdef DEBUG_VERBOSE - ibz_t a_cp; - ibz_init(&a_cp); - ibz_copy(&a_cp, a); -#endif - mpz_mul_2exp(*prod, *a, exp); -#ifdef DEBUG_VERBOSE - gmp_printf("ibz_mul_2exp,%Zx,%Zx,%lx\n", *prod, a_cp, exp); - ibz_finalize(&a_cp); -#endif -} - -/** @brief neg=-a -*/ -void ibz_neg(ibz_t *neg, const ibz_t* a) { - mpz_neg(*neg, *a); -} - -/** @brief abs=|a| -*/ -void ibz_abs(ibz_t *abs, const ibz_t* a) { - mpz_abs(*abs, *a); -} - -/** @brief Euclidean division of a by b - * - * Computes quotient, remainder so that remainder+quotient*b = a where 0<=|remainder|<|b| - * The quotient is rounded towards zero. - */ -void ibz_div(ibz_t *quotient, ibz_t *remainder, const ibz_t *a, const ibz_t *b) -{ -#ifdef DEBUG_VERBOSE - ibz_t a_cp, b_cp; - ibz_init(&a_cp); - ibz_init(&b_cp); - ibz_copy(&a_cp, a); - ibz_copy(&b_cp, b); -#endif - mpz_tdiv_qr(*quotient, *remainder, *a, *b); -#ifdef DEBUG_VERBOSE - DEBUG_STR_FUN_4("ibz_div", *quotient, *remainder, a_cp, b_cp); - ibz_finalize(&a_cp); - ibz_finalize(&b_cp); -#endif -} - -/** @brief Euclidean division of a by b - * - * Computes quotient, remainder so that remainder+quotient*b = a where 0<=|remainder|<|b| - * The quotient is rounded towards minus infinity. - */ -void ibz_div_floor(ibz_t *q, ibz_t *r, const ibz_t *n, const ibz_t *d){ - mpz_fdiv_qr(*q,*r,*n,*d); -} - -/** @brief Euclidean division of a by 2^exp - * - * Computes a right shift of abs(a) by exp bits, then sets sign(quotient) to sign(a) -*/ -void ibz_div_2exp(ibz_t *quotient, const ibz_t *a, uint64_t exp) { -#ifdef DEBUG_VERBOSE - ibz_t a_cp; - ibz_init(&a_cp); - ibz_copy(&a_cp, a); -#endif - mpz_tdiv_q_2exp(*quotient, *a, exp); -#ifdef DEBUG_VERBOSE - gmp_printf("ibz_div_2exp,%Zx,%Zx,%lx\n", *quotient, a_cp, exp); - ibz_finalize(&a_cp); -#endif -} - -/** @brief r = a mod b - * - * Assumes valid inputs - * The sign of the divisor is ignored, the result is always non-negative - */ -void ibz_mod(ibz_t *r, const ibz_t *a, const ibz_t *b) -{ - mpz_mod(*r, *a, *b); -} - -/** @brief Test if a = 0 mod b -*/ -int ibz_divides(const ibz_t *a, const ibz_t *b) -{ - return mpz_divisible_p(*a, *b); -} - -/** @brief pow=x^e - * - * Assumes valid inputs - */ -void ibz_pow(ibz_t *pow, const ibz_t *x, int64_t e) -{ - mpz_pow_ui(*pow, *x, (unsigned long int)e); -} - -/** @brief pow=(x^e) mod m - */ -void ibz_pow_mod(ibz_t *pow, const ibz_t *x, const ibz_t *e, const ibz_t *m) -{ - mpz_powm(*pow, *x, *e, *m); - DEBUG_STR_FUN_4("ibz_pow_mod", *pow, *x, *e, *m); -} - -/** @brief Compare a and b - * - * @returns a positive value if a > b, zero if a = b, and a negative value if a < b - */ -int ibz_cmp(const ibz_t *a, const ibz_t *b) -{ - int ret = mpz_cmp(*a, *b); - DEBUG_STR_FUN_INT_MP2("ibz_cmp", ret, *a, *b); - return ret; -} - -/** @brief Test if x is 0 - * - * @returns 1 if x=0, 0 otherwise - */ -int ibz_is_zero(const ibz_t *x) -{ - int ret = !mpz_cmp_ui(*x, 0); - DEBUG_STR_FUN_INT_MP("ibz_is_zero", ret, *x); - return ret; -} - -/** @brief Test if x is 1 - * - * @returns 1 if x=1, 0 otherwise - */ -int ibz_is_one(const ibz_t *x) -{ - int ret = !mpz_cmp_ui(*x, 1); - DEBUG_STR_FUN_INT_MP("ibz_is_one", ret, *x); - return ret; -} - -/** @brief Test if x is even - * - * @returns 1 if x is even, 0 otherwise -*/ -int ibz_is_even(const ibz_t *x) { - int ret = !mpz_tstbit(*x, 0); - DEBUG_STR_FUN_INT_MP("ibz_is_even", ret, *x); - return ret; -} - -/** @brief set i to value x - */ -void ibz_set(ibz_t *i, int64_t x) -{ - mpz_set_si(*i, (signed long int)x); -} - -/** @brief set i to integer ontained in string when read as number in base - * - * Base should be 10 or 16, and the number should be written without ponctuation or whitespaces - * - * Case for base 16 does not matter - * - * @returns 1 if the string could be converted to an integer, 0 otherwise - */ -int ibz_set_from_str(ibz_t *i, const char *str, int base) -{ - return(1 + mpz_set_str (*i, str,base)); -} - -/** @brief Copy value into target - */ -void ibz_copy(ibz_t *target, const ibz_t *value) -{ - mpz_set(*target, *value); -} - -/** @brief Exchange values of a and b - */ -void ibz_swap(ibz_t *a, ibz_t *b){ - mpz_swap(*a,*b); -} - -/** @brief get long equal to the lowest bits of i - */ -int64_t ibz_get(const ibz_t *i) -{ - return (int64_t)mpz_get_si(*i); -} - -/** @brief generate random value in [a, b] with rejection sampling - * @returns 0 if random generation failed, 1 if it succeeded - */ -int ibz_rand_interval(ibz_t *rand, const ibz_t *a, const ibz_t *b) -{ - // TODO: do it with a hash stream? - int randret; - int ret = 1; - mpz_t tmp; - mpz_t bmina; - mpz_init(bmina); - mpz_sub(bmina, *b, *a); - - size_t len_bits = mpz_sizeinbase(bmina, 2); - size_t len_bytes = (len_bits + 7) / 8; - size_t sizeof_limb = sizeof(mp_limb_t); - size_t sizeof_limb_bits = sizeof_limb*8; - size_t len_limbs = (len_bytes + sizeof_limb - 1) / sizeof_limb; - - mp_limb_t mask = ((mp_limb_t) -1) >> (sizeof_limb_bits - (len_bits % sizeof_limb_bits)); - mp_limb_t r[len_limbs]; - - do { - randret = randombytes((unsigned char *)r, len_bytes); - if (randret != 0) { - ret = 0; - goto err; - } -#ifdef TARGET_BIG_ENDIAN - for (int i = 0; i < len_limbs; ++i) - r[i] = BSWAP_DIGIT(r[i]); -#endif - r[len_limbs - 1] &= mask; - mpz_roinit_n(tmp, r, len_limbs); - if (mpz_cmp(tmp, bmina) <= 0) break; - } while (1); - - mpz_add(*rand, tmp, *a); -err: - mpz_clear(bmina); - return ret; -} - -int ibz_rand_interval_i(ibz_t *rand, int64_t a, int64_t b) { - int ret = 1; - mpz_t a_big, b_big; - mpz_init_set_si(a_big, a); - mpz_init_set_si(b_big, b); - ret = ibz_rand_interval(rand, &a_big, &b_big); - mpz_clear(a_big); - mpz_clear(b_big); - return ret; -} - -int ibz_rand_interval_minm_m(ibz_t *rand, int64_t m) { - int ret = 1; - ret = ibz_rand_interval_i(rand, 0, 2*m); - if (ret != 1) goto err; - mpz_sub_ui(*rand, *rand, (unsigned long int) m); -err: - return ret; -} - - -/** @brief Bitsize of a. - * - * @returns Bitsize of a. - * - */ -int ibz_bitsize(const ibz_t *a) -{ - return (int)mpz_sizeinbase(*a, 2); -} - -/* etc....*/ - -/** @} - */ - -/** @defgroup ibz_qa Basic fraction arithmetic - * @{ - */ - -/** @brief sum=a+b - */ -void ibq_add(ibq_t *sum, const ibq_t *a, const ibq_t *b) -{ - mpq_add(*sum, *a, *b); -} - -/** @brief diff=a-b - */ -void ibq_sub(ibq_t *diff, const ibq_t *a, const ibq_t *b) -{ - mpq_sub(*diff, *a, *b); -} - -/** @brief neg=-x - */ -void ibq_neg(ibq_t *neg, const ibq_t *x){ - mpq_neg(*neg,*x); -} - -/** @brief abs=|x| - */ -void ibq_abs(ibq_t *abs, const ibq_t *x){ - mpq_abs(*abs,*x); -} - -/** @brief prod=a*b - */ -void ibq_mul(ibq_t *prod, const ibq_t *a, const ibq_t *b) -{ - mpq_mul(*prod, *a, *b); -} - -/** @brief inv=1/x - * - * @returns 0 if x is 0, 1 if inverse exists and was computed - */ -int ibq_inv(ibq_t *inv, const ibq_t *x) -{ - if (mpq_cmp_ui(*x, 0, 1)) - { - mpq_inv(*inv, *x); - return 1; - } - else - { - return 0; - } -} - -/** @brief quot = a/b - * @param quot Output a/b - * @param a - * @param b must not be 0 -*/ -void ibq_div(ibq_t *quot, const ibq_t *a, const ibq_t *b){ - mpq_div(*quot,*a,*b); -} - -/** @brief Compare a and b - * - * @returns a positive value if a > b, zero if a = b, and a negative value if a < b - */ -int ibq_cmp(const ibq_t *a, const ibq_t *b) -{ - return mpq_cmp(*a, *b); -} - -/** @brief Test if x is 0 - * - * @returns 1 if x=0, 0 otherwise - */ -int ibq_is_zero(const ibq_t *x) -{ - return !mpq_cmp_ui(*x, 0, 1); -} - -/** @brief Test if x is 1 - * - * @returns 1 if x=1, 0 otherwise - */ -int ibq_is_one(const ibq_t *x) -{ - return !mpq_cmp_ui(*x, 1, 1); -} - -/** @brief Set q to a/b if b not 0 - * - * @returns 1 if b not 0 and q is set, 0 otherwise - */ -int ibq_set(ibq_t *q, const ibz_t *a, const ibz_t *b) -{ - if (mpz_cmp_si(*b, 0)) - { - mpq_set_num(*q, *a); - mpq_set_den(*q, *b); - mpq_canonicalize(*q); - return 1; - } - else - { - return 0; - } -} - -/** @brief Copy value into target - */ -void ibq_copy(ibq_t *target, const ibq_t *value) -{ - mpq_set(*target, *value); -} - -/** @brief Exchange values of a and b - */ -void ibq_swap(ibq_t *a, ibq_t *b){ - mpq_swap(*a,*b); -} - -/** @brief Copy dig array to target, given digits and the length of the dig array - * - * @param target Target ibz_t element - * @param dig array of digits - * @param dig_len length of the digits array -*/ -void ibz_copy_digits(ibz_t *target, const digit_t *dig, int dig_len) { - mpz_t tmp, tmp2; - assert(sizeof(mp_limb_t) <= sizeof(digit_t)); - if (sizeof(mp_limb_t) == sizeof(digit_t)) { - mpz_roinit_n(tmp, (const mp_limb_t *) dig, dig_len); - mpz_set(*target, tmp); - } else { - // type size mismatch, we populate the mpz_t with gmp's public interface taking 'unsigned long int' - mpz_init(tmp); - mpz_init(tmp2); - int sizeof_uli = sizeof(unsigned long int); - int sizeof_digit_t = sizeof(digit_t); - int uli_for_digs = (sizeof_digit_t + sizeof_uli - 1) / sizeof_uli; - mpz_set_ui(tmp, 0); - for (int i = 0; i < dig_len; ++i) { - digit_t d = dig[i]; - for (int j = 0; j < uli_for_digs; ++j) { - mpz_set_ui(tmp2, (unsigned long int) d); - mpz_mul_2exp(tmp2, tmp2, j*sizeof_uli*8 + i*sizeof_digit_t*8); - mpz_add(tmp, tmp, tmp2); - d >>= (sizeof_uli*8); - } - } - mpz_set(*target, tmp); - mpz_clear(tmp); - mpz_clear(tmp2); - } -} - -/** @brief Copy an ibz_t to target digit_t array. - * Restrictions: ibz >= 0 and target must hold sufficient elements to hold ibz - * - * @param target Target digit_t array - * @param ibz ibz source ibz_t element -*/ -void ibz_to_digits(digit_t *target, const ibz_t *ibz) { - assert(sizeof(mp_limb_t) <= sizeof(digit_t)); - size_t ibz_limbs = mpz_size(*ibz); - if (ibz_limbs == 0) { - target[0] = 0; - } else { - if (sizeof(mp_limb_t) == sizeof(digit_t)) { - const mp_limb_t *limbs = mpz_limbs_read(*ibz); - for (int i = 0; i < ibz_limbs; ++i) { - target[i] = limbs[i]; - } - } else { - mpz_t tmp; - mpz_init_set(tmp, *ibz); - int sizeof_digit_t = sizeof(digit_t); - int sizeof_limb = sizeof(mp_limb_t); - int digit_len = (ibz_limbs*sizeof_limb + sizeof_digit_t - 1) / sizeof_digit_t; - for (int i = 0; i < digit_len; ++i) { - target[i] = 0; - for (int j = 0; j < (sizeof_digit_t + sizeof_limb - 1) / sizeof_limb; ++j) { - target[i] |= ((digit_t) mpz_getlimbn(tmp, j)) << (j*8*sizeof_limb); - } - mpz_div_2exp(tmp, tmp, sizeof_digit_t*8); - } - mpz_clear(tmp); - } - } -} - -/** @brief Denominator of x - */ -void ibq_denom(ibz_t *d, const ibq_t *x) -{ - mpq_get_den(*d, *x); -} - -/** @brief Numerator of x - */ -void ibq_num(ibz_t *n, const ibq_t *x) -{ - mpq_get_num(*n, *x); -} - -/** @brief Checks if x is an integer - * - * @returns 1 if yes, 0 if not - */ -int ibq_is_ibz(const ibq_t *q) -{ - mpz_t num, den; - int ret; - mpz_init(num); - mpz_init(den); - - mpq_get_num(num, *q); - mpq_get_den(den, *q); - - ret = (mpz_divisible_p(num, den) == 0 ? 0 : 1); - - mpz_clear(num); - mpz_clear(den); - return ret; -} - -/** - * @brief Converts a fraction q to an integer y, if q is an integer. - * - * @returns 1 if z is an integer, 0 if not - */ -int ibq_to_ibz(ibz_t *z, const ibq_t *q) -{ - mpz_t num, den; - int ret; - mpz_init(num); - mpz_init(den); - - mpq_get_num(num, *q); - mpq_get_den(den, *q); - - ret = (mpz_divisible_p(num, den) == 0 ? 0 : 1); - - if (!ret) - goto err; - - mpz_divexact(*z, num, den); - -err: - mpz_clear(num); - mpz_clear(den); - return ret; -} - -/** @} - */ - -/** @defgroup ibz_n Number theory functions - * @{ - */ - -/** - * @brief Probabilistic primality test - * - * @param n The number to test - * @param reps Number of Miller-Rabin repetitions. The more, the slower and the less likely are false positives - * @return 1 if probably prime, 0 if certainly not prime, 2 if certainly prime - * - * Using GMP's implementation: - * - * From GMP's documentation: "This function performs some trial divisions, a Baillie-PSW probable prime test, then reps-24 Miller-Rabin probabilistic primality tests." - */ -int ibz_probab_prime(const ibz_t *n, int reps) -{ - int ret = mpz_probab_prime_p(*n, reps); - DEBUG_STR_FUN_INT_MP_INT("ibz_probab_prime", ret, *n, reps); - return ret; -} - -/** - * @brief Greatest common divisor - * - * @param gcd Output: Set to the gcd of a and b - * @param a - * @param b - */ -void ibz_gcd(ibz_t *gcd, const ibz_t *a, const ibz_t *b) -{ - mpz_gcd(*gcd, *a, *b); -} - -/** - * @brief GCD and Bézout coefficients u, v such that ua + bv = gcd - * - * @param gcd Output: Set to the gcd of a and b - * @param u Output: integer such that ua+bv=gcd - * @param v Output: Integer such that ua+bv=gcd - * @param a - * @param b - */ -void ibz_xgcd(ibz_t *gcd, ibz_t *u, ibz_t *v, const ibz_t *a, const ibz_t *b) -{ - mpz_gcdext(*gcd, *u, *v, *a, *b); -} - -/** - * @brief GCD, Bézout coefficients u, v such that ua + bv = gcd, and annihilators s, t such that sa + bt = 0 - * - * @param gcd Output: Set to the gcd of a and b - * @param s Output: integer such that sa+bt=0 - * @param t Output: Integer such that sa+bt=0 - * @param u Output: integer such that ua+bv=gcd - * @param v Output: Integer such that ua+bv=gcd - * @param a - * @param b - */ -void ibz_xgcd_ann(ibz_t *gcd, ibz_t *s, ibz_t *t, ibz_t *u, ibz_t *v, const ibz_t *a, const ibz_t *b) { - ibz_t thrash; - ibz_init(&thrash); - ibz_xgcd(gcd, u, v, a, b); - ibz_div(s, &thrash, b, gcd); - ibz_neg(t, a); - ibz_div(t, &thrash, t, gcd); - ibz_finalize(&thrash); -} - - -/** - * @brief Modular inverse - * - * @param inv Output: Set to the integer in [0,mod[ such that a*inv = 1 mod (mod) if it exists - * @param a - * @param mod - * @returns 1 if inverse exists and was computed, 0 otherwise - */ -int ibz_invmod(ibz_t *inv, const ibz_t *a, const ibz_t *mod) -{ - return (mpz_invert(*inv, *a, *mod) ? 1 : 0); -} - -/** - * @brief Calculates CRT with a system of two congruences, using Extended Euclidean. - * - * @param crt Output: Set so that crt = a mod (mod_a), crt = b mod (mod_b) - * @param a - * @param b - * @param mod_a - * @param mod_b - */ -void ibz_crt(ibz_t *crt, const ibz_t *a, const ibz_t *b, const ibz_t *mod_a, const ibz_t *mod_b) -{ - mpz_t tmp, u, v; - mpz_init(tmp); - mpz_init(u); - mpz_init(v); - mpz_gcdext(tmp, u, v, *mod_a, *mod_b); - - mpz_mul(tmp, *a, v); - mpz_mul(tmp, tmp, *mod_b); - - mpz_mul(u, *b, u); - mpz_mul(u, u, *mod_a); - - mpz_add(tmp, tmp, u); - - mpz_mul(v, *mod_a, *mod_b); - - mpz_mod(*crt, tmp, v); - - mpz_clear(tmp); - mpz_clear(u); - mpz_clear(v); -} - -/** - * @brief Kronecker symbol of a mod b - * - * @returns Kronecker symbol of a mod b - * @param a - * @param b - * - * Uses GMP's implementation - */ -int ibz_kronecker(const ibz_t *a, const ibz_t *b) -{ - return mpz_kronecker(*a, *b); -} - -/** - * @brief Jacobi symbol of a mod odd - * - * @returns jacobi symbol of a mod odd - * @param a - * @param odd assumed odd - * - * Uses GMP's implementation - * - * If output is -1, a is a not a square mod odd - */ -int ibz_jacobi(const ibz_t *a, const ibz_t *odd) -{ - return mpz_jacobi(*a, *odd); -} - -/** - * @brief Legendre symbol of a mod p - * - * @returns Legendre symbol of a mod p - * @param a - * @param p assumed prime - * - * Uses GMP's implementation - * - * If output is 1, a is a square mod p, if -1, not. If 0, it is divisible by p - */ -int ibz_legendre(const ibz_t *a, const ibz_t *p) -{ - return mpz_legendre(*a, *p); -} - -/** - * @brief Integer square root of a perfect square - * - * @returns 1 if an integer square root of a exists and was computed, 0 otherwise - * @param sqrt Output: Set to a integer square root of a if any exist - * @param a number of which an integer square root is searched - */ -int ibz_sqrt(ibz_t *sqrt, const ibz_t *a) -{ - if (mpz_perfect_square_p(*a)) - { - mpz_sqrt(*sqrt, *a); - return 1; - } - else - { - return 0; - } -} - -/** - * @brief Floor of Integer square root - * - * @param sqrt Output: Set to the floor of an integer square root - * @param a number of which a floor of an integer square root is searched - */ -void ibz_sqrt_floor(ibz_t *sqrt, const ibz_t *a) -{ - mpz_sqrt(*sqrt, *a); -} - -/** - * @brief Square root modulo a prime - * - * We handle two special cases separately: - * - p mod 4 == 3 - * - p mod 8 == 5 - * - * Otherwise (if p mod 8 == 1), we apply the Shanks-Tonelli algorithm - * to find the square root. - * - * @returns 1 if square root of a mod p exists and was computed, 0 otherwise - * @param sqrt Output: Set to a square root of a mod p if any exist - * @param a number of which a square root mod p is searched - * @param p assumed prime - */ -int ibz_sqrt_mod_p(ibz_t *sqrt, const ibz_t *a, const ibz_t *p) -{ - // TODO: handle special cases, a = 0? - -#ifndef NDEBUG - assert(ibz_probab_prime(p, 100)); -#endif - -#ifdef DEBUG_VERBOSE - ibz_t a_cp, p_cp; - ibz_init(&a_cp); - ibz_init(&p_cp); - ibz_copy(&a_cp, a); - ibz_copy(&p_cp, p); -#endif - - mpz_t amod, tmp, exp, a4, a2, n, q, z, qnr, x, y, b, pm1; - mpz_init(amod); - mpz_init(tmp); - mpz_init(exp); - mpz_init(a4); - mpz_init(a2); - mpz_init(n); - mpz_init(q); - mpz_init(z); - mpz_init(qnr); - mpz_init(x); - mpz_init(y); - mpz_init(b); - mpz_init(pm1); - - int ret = 1; - - mpz_mod(amod, *a, *p); - if (mpz_cmp_ui(amod, 0) < 0) - { - mpz_add(amod, *p, amod); - } - - if (mpz_jacobi(amod, *p) != 1) - { - ret = 0; - goto end; - } - - mpz_sub_ui(pm1, *p, 1); - - if (mpz_mod_ui(tmp, *p, 4) == 3) - { - // p % 4 == 3 - mpz_add_ui(tmp, *p, 1); - mpz_fdiv_q_2exp(tmp, tmp, 2); - mpz_powm(*sqrt, amod, tmp, *p); - } - else if (mpz_mod_ui(tmp, *p, 8) == 5) - { - // p % 8 == 5 - mpz_sub_ui(tmp, *p, 1); - mpz_fdiv_q_2exp(tmp, tmp, 2); - mpz_powm(tmp, amod, tmp, *p); // a^{(p-1)/4} mod p - if (!mpz_cmp_ui(tmp, 1)) - { - mpz_add_ui(tmp, *p, 3); - mpz_fdiv_q_2exp(tmp, tmp, 3); - mpz_powm(*sqrt, amod, tmp, *p); // a^{(p+3)/8} mod p - } - else - { - mpz_sub_ui(tmp, *p, 5); - mpz_fdiv_q_2exp(tmp, tmp, 3); // (p - 5) / 8 - mpz_mul_2exp(a4, amod, 2); // 4*a - mpz_powm(tmp, a4, tmp, *p); - - mpz_mul_2exp(a2, amod, 1); - mpz_mul(tmp, a2, tmp); - mpz_mod(*sqrt, tmp, *p); - } - } - else - { - // p % 8 == 1 -> Shanks-Tonelli - int e = 0; - mpz_sub_ui(q, *p, 1); - while (mpz_tstbit(q, e) == 0) - e++; - mpz_fdiv_q_2exp(q, q, e); - - // 1. find generator - non-quadratic residue - mpz_set_ui(n, 2); - while (mpz_legendre(qnr, *p) != -1) - mpz_add_ui(qnr, qnr, 1); - mpz_powm(z, qnr, q, *p); - - // 2. Initialize - mpz_set(y, z); - int r = e; - mpz_powm(y, amod, q, *p); // y = a^q mod p - - mpz_add_ui(tmp, q, 1); // tmp = (q + 1) / 2 - mpz_fdiv_q_2exp(tmp, tmp, 1); - - mpz_powm(x, amod, tmp, *p); // x = a^(q + 1)/2 mod p - - mpz_set_ui(exp, 1); - mpz_mul_2exp(exp, exp, e - 2); - - for (int i = 0; i < e; ++i) - { - mpz_powm(b, y, exp, *p); - - if (!mpz_cmp(b, pm1)) - { - mpz_mul(x, x, z); - mpz_mod(x, x, *p); - - mpz_mul(y, y, z); - mpz_mul(y, y, z); - mpz_mod(y, y, *p); - } - - mpz_powm_ui(z, z, 2, *p); - mpz_fdiv_q_2exp(exp, exp, 1); - } - - mpz_set(*sqrt, x); - } - -#ifdef DEBUG_VERBOSE - DEBUG_STR_FUN_3("ibz_sqrt_mod_p", *sqrt, a_cp, p_cp); - ibz_finalize(&a_cp); - ibz_finalize(&p_cp); -#endif - -end: - mpz_clear(amod); - mpz_clear(tmp); - mpz_clear(exp); - mpz_clear(a4); - mpz_clear(a2); - mpz_clear(n); - mpz_clear(q); - mpz_clear(z); - mpz_clear(qnr); - mpz_clear(x); - mpz_clear(y); - mpz_clear(b); - mpz_clear(pm1); - - return ret; -} - -/** - * @brief Square root modulo a the double of a given prime - * - * If sqrt(a) mod p is odd -> outputs sqrt(a) (mod 2p) - * Otherwise -> outputs sqrt(x) + p (mod 2p) - * - * @returns 1 if square root of a mod (2p) exists and was computed, 0 otherwise - * @param sqrt Output: Set to a square root of a mod (2p) if any exist - * @param a number of which a square root mod (2p) is searched - * @param p assumed prime - */ -int ibz_sqrt_mod_2p(ibz_t *sqrt, const ibz_t *a, const ibz_t *p) -{ - int ret = 1; - mpz_t sqrt_modp; - mpz_init(sqrt_modp); - - ret = ibz_sqrt_mod_p(&sqrt_modp, a, p); - if (ret == 0) - goto err; - - if (mpz_tstbit(*a, 0) != mpz_tstbit(sqrt_modp, 0)) - mpz_add(*sqrt, sqrt_modp, *p); - else - mpz_set(*sqrt, sqrt_modp); - - DEBUG_STR_FUN_3("ibz_sqrt_mod_2p", *sqrt, *a, *p); -err: - mpz_clear(sqrt_modp); - return ret; -} diff --git a/src/intbig/ref/generic/test/CMakeLists.txt b/src/intbig/ref/generic/test/CMakeLists.txt deleted file mode 100644 index 8103001..0000000 --- a/src/intbig/ref/generic/test/CMakeLists.txt +++ /dev/null @@ -1,9 +0,0 @@ -add_executable(sqisign_test_intbig test_intbig.c) -target_link_libraries(sqisign_test_intbig ${LIB_INTBIG} ${GMP} sqisign_common_sys) -target_include_directories(sqisign_test_intbig PRIVATE ../include ${INC_PUBLIC} ${INC_COMMON}) - -# MSAN and GMP lead to false positives, see -# https://gmplib.org/list-archives/gmp-bugs/2019-March/004529.html -if(NOT CMAKE_BUILD_TYPE STREQUAL "MSAN") - add_test(sqisign_test_intbig sqisign_test_intbig ${SQISIGN_TEST_REPS} 256) -endif() \ No newline at end of file diff --git a/src/intbig/ref/generic/test/test_intbig.c b/src/intbig/ref/generic/test/test_intbig.c deleted file mode 100644 index 06f639c..0000000 --- a/src/intbig/ref/generic/test/test_intbig.c +++ /dev/null @@ -1,551 +0,0 @@ -#include -#include -#include -#include -#include - -static int test_ibq_consts() { - int ret = 0; - ibq_t t; - ibz_t tmp1, tmp2, tmp3; - ibz_init(&tmp1); - ibz_init(&tmp2); - ibz_init(&tmp3); - ibq_init(&t); - - ibz_set(&tmp1, 123); - ibz_set(&tmp2, -123); - if (!ibq_set(&t, &tmp1, &tmp2)) { - ret = -1; - goto err; - } - - if (ibq_is_one(&t)) { - ret = -1; - goto err; - } - - if (!ibq_is_ibz(&t)) { - ret = -1; - goto err; - } - - if (!ibq_to_ibz(&tmp3, &t)) { - ret = -1; - goto err; - } - - if (ibz_is_one(&tmp3)) { - ret = -1; - goto err; - } - - ibz_set(&tmp2, 123); - if (!ibq_set(&t, &tmp1, &tmp2)) { - ret = -1; - goto err; - } - - if (!ibq_is_one(&t)) { - ret = -1; - goto err; - } - - if (!ibq_is_ibz(&t)) { - ret = -1; - goto err; - } - - if (!ibq_to_ibz(&tmp3, &t)) { - ret = -1; - goto err; - } - - if (!ibz_is_one(&tmp3)) { - ret = -1; - goto err; - } - - ibz_set(&tmp1, 0); - ibq_set(&t, &tmp1, &tmp2); - - if (!ibq_is_zero(&t)) { - ret = -1; - goto err; - } - - if (!ibq_is_ibz(&t)) { - ret = -1; - goto err; - } - - if (!ibq_to_ibz(&tmp3, &t)) { - ret = -1; - goto err; - } - - if (!ibz_is_zero(&tmp3)) { - ret = -1; - goto err; - } - -err: - ibq_finalize(&t); - ibz_finalize(&tmp1); - ibz_finalize(&tmp2); - ibz_finalize(&tmp3); - return ret; -} - -/** - * Tests ibz_sqrt_mod_p and ibz_sqrt_mod_2p - * Allows to provide the number of repetitions and the bit-size of the primes. -*/ -static int test_ibz_sqrt_mod_p_2p(int reps, int prime_n) { - gmp_randstate_t state; - gmp_randinit_mt(state); - gmp_randseed_ui(state, 1); // set static seed - - int ret = 0; - - // Initialize GMP variables - mpz_t prime, a, prime_minus_a, asq, sqrt, tmp; - mpz_t prime_p4m3, prime_p5m8, prime_p1m8; - mpz_t prime_p4m3_x2, prime_p5m8_x2, prime_p1m8_x2; - mpz_init(prime); - mpz_init(prime_p4m3); - mpz_init(prime_p5m8); - mpz_init(prime_p1m8); - mpz_init(prime_p4m3_x2); - mpz_init(prime_p5m8_x2); - mpz_init(prime_p1m8_x2); - mpz_init(a); - mpz_init(prime_minus_a); - mpz_init(asq); - mpz_init(sqrt); - mpz_init(tmp); - - // Generate random prime number - int n = prime_n; // Number of bits - - for (int r = 0; r < reps; ++r) { - mpz_urandomb(prime, state, n); - - int p4m3 = 0, p5m8 = 0, p1m8 = 0; - - while (p4m3 == 0 || p5m8 == 0 || p1m8 == 0) { - mpz_nextprime(prime, prime); - - if (mpz_mod_ui(tmp, prime, 4) == 3) { - mpz_set(prime_p4m3, prime); - p4m3 = 1; - } else if (mpz_mod_ui(tmp, prime, 8) == 5) { - mpz_set(prime_p5m8, prime); - p5m8 = 1; - } else if (mpz_mod_ui(tmp, prime, 8) == 1) { - mpz_set(prime_p1m8, prime); - p1m8 = 1; - } else { - printf("Should not happen..\n"); - ret = -1; - goto err; - } - } - - mpz_t *primes[] = { &prime_p4m3, &prime_p5m8, &prime_p1m8 }; - mpz_t *primes_x2[] = { &prime_p4m3_x2, &prime_p5m8_x2, &prime_p1m8_x2 }; - for (int i = 0; i < 3; ++i) // 2p - mpz_mul_2exp(*primes_x2[i], *primes[i], 1); - - // Test sqrt mod p - for (int i = 0; i < 3; ++i) { - mpz_urandomm(a, state, *primes[i]); - mpz_sub(prime_minus_a, *primes[i], a); - mpz_powm_ui(asq, a, 2, *primes[i]); - - int no_sqrt = !ibz_sqrt_mod_p(&sqrt, &asq, primes[i]); - mpz_powm_ui(tmp, sqrt, 2, *primes[i]); - - if (no_sqrt || (mpz_cmp(sqrt, a) && mpz_cmp(sqrt, prime_minus_a))) { - printf("Test sqrt_mod_p failed\n"); - gmp_printf("%Zx\n%Zx\n", sqrt, a); - ret = -1; - goto err; - } - } - - // Test sqrt mod 2p - for (int i = 0; i < 3; ++i) { - mpz_urandomm(a, state, *primes_x2[i]); - - mpz_sub(prime_minus_a, *primes_x2[i], a); - mpz_powm_ui(asq, a, 2, *primes_x2[i]); - - int no_sqrt = !ibz_sqrt_mod_2p(&sqrt, &asq, primes[i]); - mpz_powm_ui(tmp, sqrt, 2, *primes_x2[i]); - - if (no_sqrt || (mpz_cmp(sqrt, a) && mpz_cmp(sqrt, prime_minus_a))) { - printf("Test sqrt_mod_2p failed\n"); - gmp_printf("prime = %Zx\nprime_x2 = %Zx\nsqrt = %Zx\na = %Zx\na^2=%Zx\np - a = %Zx\n", *primes[i], *primes_x2[i], sqrt, a, asq, prime_minus_a); - ret = -1; - goto err; - } - } - } - -err: - gmp_randclear(state); - mpz_clear(prime); - mpz_clear(prime_p4m3); - mpz_clear(prime_p5m8); - mpz_clear(prime_p1m8); - mpz_clear(prime_p4m3_x2); - mpz_clear(prime_p5m8_x2); - mpz_clear(prime_p1m8_x2); - mpz_clear(a); - mpz_clear(prime_minus_a); - mpz_clear(asq); - mpz_clear(sqrt); - mpz_clear(tmp); - return ret; - -} - -/** - * Tests CRT -*/ -static int test_ibz_crt(int reps, int prime_n) { - gmp_randstate_t state; - gmp_randinit_mt(state); - gmp_randseed_ui(state, 1); // set static seed - - int ret = 0; - - // Initialize GMP variables - mpz_t prime1, prime2, prime1xprime2, crt, a, b, tst; - mpz_init(prime1); - mpz_init(prime2); - mpz_init(prime1xprime2); - mpz_init(crt); - mpz_init(a); - mpz_init(b); - mpz_init(tst); - - // Generate random prime number - int n = prime_n; // Number of bits - - for (int r = 0; r < reps; ++r) { - mpz_urandomb(prime1, state, n); - mpz_nextprime(prime1, prime1); - mpz_urandomm(a, state, prime1); - mpz_urandomb(prime2, state, n); - mpz_nextprime(prime2, prime2); - mpz_urandomm(b, state, prime2); - mpz_mul(prime1xprime2, prime1, prime2); - - ibz_crt(&crt, &a, &b, &prime1, &prime2); - mpz_mod(tst, crt, prime1); - if (mpz_cmp(tst, a)) { - ret = -1; - goto err; - } - mpz_mod(tst, crt, prime2); - if (mpz_cmp(tst, b)) { - ret = -1; - goto err; - } - mpz_mod(tst, crt, prime1xprime2); - if (mpz_cmp(tst, crt)) { - ret = -1; - goto err; - } - } - -err: - gmp_randclear(state); - mpz_clear(prime1); - mpz_clear(prime2); - mpz_clear(prime1xprime2); - mpz_clear(crt); - mpz_clear(a); - mpz_clear(b); - mpz_clear(tst); - return ret; -} - -static int test_ibz_constants() { - int ret = 0; - const ibz_t* zero = &ibz_const_zero; - const ibz_t* one = &ibz_const_one; - const ibz_t* two = &ibz_const_two; - - mpz_t tmp; - mpz_init(tmp); - mpz_add(tmp, *zero, *one); - mpz_add(tmp, tmp, *two); - - ret = (!mpz_cmp_ui(tmp, 3) ? 0 : -1); - - mpz_clear(tmp); - return ret; -} - -static int test_ibz_rand_interval(int reps) { - int ret = 0; - mpz_t low, high, rand; - mpz_init(low); - mpz_init(high); - mpz_init(rand); - mpz_set_str(low, "ffa", 16); - mpz_set_str(high, "eeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", 16); - - for (int i = 0; i < reps; ++i) { - ret = ibz_rand_interval(&rand, &low, &high); - if (ret != 1) { - ret = -1; - goto err; - } else { - ret = 0; - } - - if (mpz_cmp(rand, low) < 0 || mpz_cmp(rand, high) > 0) { - ret = -1; - gmp_printf("rand: %Zx\n", rand); - goto err; - } - } -err: - mpz_clear(low); - mpz_clear(high); - mpz_clear(rand); - return ret; -} - -static int test_ibz_rand_interval_i(int reps) { - int ret = 0; - int64_t low, high; - mpz_t rand; - mpz_init(rand); - - for (int i = 0; i < reps; ++i) { - randombytes((unsigned char *)&low, sizeof(int64_t)); - randombytes((unsigned char *)&high, sizeof(int64_t)); - if (low < 0) low = -low; - if (high < 0) high = -high; - if (low > high) { - int64_t tmp = low; - low = high; - high = tmp; - } - - ret = ibz_rand_interval_i(&rand, low, high); - if (ret != 1) { - ret = -1; - goto err; - } else { - ret = 0; - } - - if (mpz_cmp_si(rand, low) < 0 || mpz_cmp_si(rand, high) > 0) { - ret = -1; - gmp_printf("rand: %Zx\n", rand); - goto err; - } - - } - -err: - mpz_clear(rand); - return ret; -} - -static int test_ibz_rand_interval_minm_m(int reps) { - int ret = 0; - int64_t m; - mpz_t rand; - mpz_init(rand); - - for (int i = 0; i < reps; ++i) { - randombytes((unsigned char *)&m, sizeof(int64_t)); - if (m < 0) m = -m; - m >>= 1; // less than 64 bit - - if (m < 0) { - ret = -1; - goto err; - } - - ret = ibz_rand_interval_minm_m(&rand, m); - if (ret != 1) { - ret = -1; - goto err; - } else { - ret = 0; - } - - if (mpz_cmp_si(rand, -m) < 0 || mpz_cmp_si(rand, m) > 0) { - ret = -1; - gmp_printf("rand: %Zx\n", rand); - goto err; - } - } - -err: - mpz_clear(rand); - return ret; -} - -static int test_ibz_copy_digits() { - int ret = 0; - digit_t d1[] = { 0x12345678 }; - digit_t d2[] = { 2, 1 }; - - // TODO: test for other than 64 bit - const char d1str[] = "12345678"; - const char d2str[] = "10000000000000002"; - - char d1_intbig_str[80] = {0}; - char d2_intbig_str[80] = {0}; - - mpz_t d1_intbig, d2_intbig; - mpz_init(d1_intbig); - mpz_init(d2_intbig); - - ibz_copy_digits(&d1_intbig, d1, 1); - ibz_copy_digits(&d2_intbig, d2, 2); - - gmp_sprintf(d1_intbig_str, "%Zx", d1_intbig); - gmp_sprintf(d2_intbig_str, "%Zx", d2_intbig); - - if (memcmp(d1str, d1_intbig_str, 8)) { - ret = -1; - goto err; - } - if (memcmp(d2str, d2_intbig_str, 17)) { - ret = -1; - goto err; - } -err: - mpz_clear(d1_intbig); - mpz_clear(d2_intbig); - return ret; -} - -static int test_ibz_to_digits() { - int ret = 0; - mpz_t d1_intbig, d2_intbig, zero_intbig; - mpz_t d1_intbig_rec, d2_intbig_rec, zero_intbig_rec, cof, cof2; - const char d1str[] = "12345678"; - const char d2str[] = "10000000000000002"; - - mpz_init_set_str(d1_intbig, d1str, 16); - mpz_init_set_str(d2_intbig, d2str, 16); - mpz_init(zero_intbig); - - mpz_init(d1_intbig_rec); - mpz_init(d2_intbig_rec); - mpz_init(zero_intbig_rec); - mpz_init(cof); - mpz_init(cof2); - - size_t d1_digits = (mpz_sizeinbase(d1_intbig, 2) + sizeof(digit_t)*8 - 1) / (sizeof(digit_t)*8); - size_t d2_digits = (mpz_sizeinbase(d2_intbig, 2) + sizeof(digit_t)*8 - 1) / (sizeof(digit_t)*8); - - digit_t d1[d1_digits]; - digit_t d2[d2_digits]; - digit_t zero[1]; - - ibz_to_digits(d1, &d1_intbig); - ibz_to_digits(d2, &d2_intbig); - ibz_to_digits(zero, &zero_intbig); - - // A lazy test, but we know that this conversion should be correct from the previous test - - ibz_copy_digits(&d1_intbig_rec, d1, d1_digits); - ibz_copy_digits(&d2_intbig_rec, d2, d2_digits); - ibz_copy_digits(&zero_intbig_rec, zero, 1); - - if (mpz_cmp(d1_intbig, d1_intbig_rec) || mpz_cmp(zero_intbig, zero_intbig_rec)) { - ret = -1; - goto err; - } - - - digit_t p_cofactor_for_3g[5] = { 0x0000000000000000,0x74f9dace0d9ec800,0x63a25b437f655001,0x0000000000000019, 0 }; - digit_t p_cofactor_for_3g_rec[5] = { 0 }; - ibz_copy_digits(&cof, p_cofactor_for_3g, 5); - ibz_printf("cof: %Zx\n", cof); - ibz_to_digits(p_cofactor_for_3g_rec, &cof); - ibz_copy_digits(&cof2, p_cofactor_for_3g_rec, 5); - ibz_printf("cof2: %Zx\n", cof2); - - if (ibz_cmp(&cof, &cof2)) { - ret = -1; - goto err; - } - - digit_t da[2] = {0,0}; - - mpz_t strval, strval_check; - mpz_init(strval_check); - mpz_init_set_str(strval, "1617406613339667622221321", 10); - ibz_to_digits(da,&strval); - ibz_copy_digits(&strval_check, da, 2); - ibz_printf("strval: %Zd\nstrval_check: %Zd\n", strval, strval_check); - if (ibz_cmp(&strval, &strval_check)) { - ret = -1; - goto err; - } - -err: - mpz_clear(d1_intbig); - mpz_clear(d2_intbig); - mpz_clear(zero_intbig); - mpz_clear(d1_intbig_rec); - mpz_clear(d2_intbig_rec); - mpz_clear(zero_intbig_rec); - mpz_clear(cof); - mpz_clear(cof2); - mpz_clear(strval); - mpz_clear(strval_check); - return ret; -} - -int main(int argc, char *argv[]) { - int ret = 0; - if (argc < 3) { - printf("Please enter an integer argument for the number of repetitions, and one for the prime size in bits.\n"); - exit(1); - } - int reps = atoi(argv[1]); - int prime_n = atoi(argv[2]); - - ret = test_ibq_consts(); - if (ret) goto err; - - ret = test_ibz_sqrt_mod_p_2p(reps, prime_n); - if (ret) goto err; - - ret = test_ibz_crt(reps, prime_n); - if (ret) goto err; - - ret = test_ibz_constants(); - if (ret) goto err; - - ret = test_ibz_rand_interval(reps); - if (ret) goto err; - - ret = test_ibz_rand_interval_i(reps); - if (ret) goto err; - - ret = test_ibz_rand_interval_minm_m(reps); - if (ret) goto err; - - ret = test_ibz_copy_digits(); - if (ret) goto err; - - ret = test_ibz_to_digits(); - if (ret) goto err; -err: - return ret; -} diff --git a/src/klpt/ref/CMakeLists.txt b/src/klpt/ref/CMakeLists.txt deleted file mode 100644 index 1ab0814..0000000 --- a/src/klpt/ref/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -set(KLPTX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/klptx) - -include(${SELECT_SQISIGN_VARIANT}) diff --git a/src/klpt/ref/include/klpt.h b/src/klpt/ref/include/klpt.h deleted file mode 100644 index 54a2c01..0000000 --- a/src/klpt/ref/include/klpt.h +++ /dev/null @@ -1,218 +0,0 @@ -/** @file - * - * @authors Antonin Leroux - * - * @brief The norm equation algorithms - */ - -#ifndef KLPT_H -#define KLPT_H - -#include -#include -#include -#include -#include -#include - - -/*************************** Functions *****************************/ - -/** @defgroup klpt_klpt Functions and types for KLPT - * @{ -*/ - -/** @defgroup klpt_extremals Init for extremal orders - * @{ -*/ -static inline int generate_random_prime(ibz_t *p , int is3mod4 ,int bitsize) { - int found = 0; - ibz_t two_pow,two_powp; - - ibz_init(&two_pow);ibz_init(&two_powp); - ibz_pow(&two_pow,&ibz_const_two,bitsize); - ibz_pow(&two_powp,&ibz_const_two,bitsize+1); - - int cnt = 0; - while (!found && cnt < KLPT_random_prime_attempts*bitsize) { - cnt ++ ; - ibz_rand_interval(p,&two_pow,&two_powp); - - found = ibz_probab_prime(p,30) && (!is3mod4 || (ibz_get(p)%4 == 3)) ; - } - ibz_finalize(&two_pow);ibz_finalize(&two_powp); - return found; - -} - - -void quat_alg_elem_copy(quat_alg_elem_t *copy,const quat_alg_elem_t *copied); -void quat_left_ideal_copy(quat_left_ideal_t *copy,const quat_left_ideal_t *copied); - - -/** - * @brief Representing an integer by the quadratic norm form of a maximal extremal order - * - * @param gamma Output: a quaternion element - * @param n_gamma Output : target norm of gamma (it is also an input, the final value will be a divisor of the initial value) - * @param Bpoo the quaternion algebra - * - * This algorithm finds a primitive quaternion element gamma of n_gamma inside the standard maximal extremal order - * Failure is possible - */ -int represent_integer(quat_alg_elem_t *gamma, ibz_t *n_gamma, const quat_alg_t *Bpoo); - -/** @} -*/ - -/** @defgroup klpt_equiv Finding equivalent left ideals - * @{ -*/ - -/** - * @brief Keygen random ideal - * @param ideal : Output : random ideal - * @param order : maximal extremal order - * @param Bpoo the quaternion algebra - * computes a keygen ideal - */ -int klpt_keygen_random_ideal(quat_left_ideal_t *ideal, const quat_p_extremal_maximal_order_t *order, const quat_alg_t *Bpoo); - -/** - * @brief Equivalent left ideal eichler randomized - * - * @param gen Output: generator of equiv - * @param n level of the eichler order - * @param lideal quaternion ideal - * @param Bpoo the quaternion algebra - * finds an ideal randomized in the class of eichler orders of level n - * assumes that n is prime - */ -void klpt_lideal_equiv_random_eichler(quat_alg_elem_t *gen, const ibz_t *n, const quat_left_ideal_t *lideal, const quat_alg_t *Bpoo); - -/** - * @brief Equivalent left ideal - * - * @param gen Output: generator of equiv - * @param n Output : norm of the equivalent ideal - * @param reduced the reduced basis for the ideal in input - * @param gram the gram matrix of the reduced basis - * @param lideal_norm the norm of the ideal represented by reduced basis - * @param denom integer, the denominator of the ideal - * @param Bpoo the quaternion algebra - * @return a bit indicating if the computation succeeded - * Assumes that the basis is reduced - * there is an equivalent ideal of norm n such that equiv_lideal = lideal * gen/Norm(lideal) - * this search is randomized and may fail - */ -int klpt_lideal_equiv(quat_alg_elem_t *gen, ibz_t *n, const ibz_mat_4x4_t *reduced, const ibz_mat_4x4_t *gram, const ibz_t *lideal_norm, const ibz_t *denom, const quat_alg_t *Bpoo); - - -/** @} -*/ - - -/** @defgroup klpt_klpt_general Finding equivalent left ideals of power of 2 norm - * @{ -*/ -/** - * @brief Equivalent left ideal of power of two norm - * - * @param gen Output: generator of equiv - * @param lideal left O0 ideal - * @param lideal_start left O0 ideal - * @param delta quaternion algebra element - * @param Bpoo the quaternion algebra - * - * Let J = lideal_start - * if K = intersect(lideal ,J) and I = conjugate (J) * K - * equiv_lideal is equivalent to the ideal I and we have the equality - * equiv_lideal = I * gen/Norm(lideal) of norm n = 2^KLPT_signing_length - * where conjugate(gen) lideal - * moreover we need that gen * delta is contained in the eichler order ZZ + J - * Assumes that the ideals lideal and lideal_start has a "good" norm (ie that one needs not to apply lideal_equiv) - * returns a bit indicating if the computation has succeeded - */ -int klpt_signing_klpt(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const quat_left_ideal_t *lideal_start, const quat_alg_elem_t *delta, const quat_alg_t *Bpoo); - -/** - * @brief Equivalent left O0-ideal of power of two norm - * - * @param gen Output: generator of equiv - * @param lideal left O0 ideal - * @param Bpoo the quaternion algebra - * - * - * equiv_lideal is equivalent to the ideal lideal and we have the equality - * equiv_lideal = lideal * gen/Norm(lideal) of norm n = 2^KLPT_keygen_length - * where conjugate(gen) is in lideal - * Assumes that the ideals lideal has a "good" norm (ie that one needs not to apply lideal_equiv) - * returns a bit indicating if the computation has succeeded - */ -int klpt_keygen_klpt(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const quat_alg_t *Bpoo); - - -/** @} -*/ - - -/** - * @brief Finding an endomorphism of smooth norm inside an eichler order - * - * @param beta Output: the endomorphism - * @param n_beta Output: the norm of beta - * @param gen Output: the generator of equivalent ideal - * @param n Output: the norm of the equivalent ideal - * @param lideal left O0 ideal - * @param gen_constraint generator of a left OR(lideal)-ideal, is contained inside OR(lideal) may be modified during the computation (division by some scalar) - * @param Bpoo the quaternion algebra - * - * Let I = lideal and K = O_R(I) < gen_constraint,2> - * Find beta of norm n_beta in OR(J) \ O (by design the norm of beta is odd) - * where J = I * gen /Norm(I) of norm n, a prime number - * and O is the embedding of ZZ + K inside OR(J) (induced by the isomorphism from OR(I) to OR(J)) - * returns a bit indicating if the computation succeeded - * in most cases beta will be contained in the order ZZ + J, but in some extreme cases (where we use another special extremal order) it might not be true. This does not change anything for the applications of eichler_special_norm. - */ -int klpt_eichler_special_norm(quat_alg_elem_t *beta, ibz_t *n_beta, quat_alg_elem_t *gen, ibz_t *n, quat_left_ideal_t *lideal, quat_alg_elem_t *gen_constraint, const quat_alg_t *Bpoo); - - -/** @} -*/ - -/** @} -*/ - - - -/** @ingroup klpt_klpt - * @defgroup klpt_tools Various tools for KLPT and norm equations - * @{ -*/ - -/** - * @brief Finding the good linear combination - * - * @param C Output: the linear combination - * @param beta the endomorphism - * @param order the order - * @param n the norm - * @param exp the exponent - * @param gen_start element of order, generate a left O-ideal of norm n = 2^exp - * @param gen_end element of order, generate a left O-ideal of norm n = 2^exp - * @param Bpoo quaternion algebra - * - * lideal_start = order - * lideal_end = order - * This algorithm finds two integers C[1], C[2] such that the pushforward of the ideal lideal_start by the endomorphism C[1] + C[2] beta is equal to lideal_end - * beta is an endomorphism of order - * Returns a bit indicating if the computation succeeded - */ -int klpt_find_linear_comb(ibz_vec_2_t *C,const quat_alg_elem_t *beta, const quat_order_t *order, const ibz_t *n, const unsigned short exp, const quat_alg_elem_t *gen_start, const quat_alg_elem_t *gen_end,const quat_alg_t *Bpoo); - - -/** @} -*/ - - -#endif diff --git a/src/klpt/ref/klptx/eichler.c b/src/klpt/ref/klptx/eichler.c deleted file mode 100644 index 0c741c6..0000000 --- a/src/klpt/ref/klptx/eichler.c +++ /dev/null @@ -1,735 +0,0 @@ -#include -#include "tools.h" - -/** @file - * - * @authors Antonin Leroux - * - * @brief the eichler norm equation implementation - */ - - -/** - * @brief Deciding if a given vector is suitable for the eichler norm algorithm - * - * @param mu Output: a quaternion algebra element - * @param C the vector to be tested - * @param params parameters - * - */ -int condition_eichler( quat_alg_elem_t *mu, const ibz_vec_2_t *C, const void* params) { - - // we start by casting myparams to the correct type - eichler_norm_param_t *eichler_norm_param = (eichler_norm_param_t*)params; - // var dec - int found = 0; - quat_alg_elem_t quat_temp; - quat_alg_coord_t coeffs; - ibz_t norm,rhs; - ibz_t temp; - ibq_t ibq_norm; - ibz_t a,b; - ibz_t ibz_q; - quat_left_ideal_t id1,id2; - - // var init - quat_alg_elem_init(&quat_temp); - quat_alg_coord_init(&coeffs); - ibz_init(&norm);ibz_init(&rhs); - ibz_init(&temp); - ibq_init(&ibq_norm); - ibz_init(&a);ibz_init(&b); - ibz_init(&ibz_q); - quat_left_ideal_init(&id1); - quat_left_ideal_init(&id2); - - ibz_set(&ibz_q,eichler_norm_param->order.q); - - // mu = j* ( C[0] + i * C[1]) - ibz_copy(&coeffs[0],&ibz_const_zero); - ibz_copy(&coeffs[1],&ibz_const_zero); - ibz_copy(&coeffs[2],&(*C)[0]); - ibz_copy(&coeffs[3],&(*C)[1]); - - - order_elem_create(mu,&eichler_norm_param->order,&coeffs,&eichler_norm_param->Bpoo); - - // for debug check that mu is in the correct order - assert(quat_lattice_contains(&coeffs,&eichler_norm_param->right_order,mu,&eichler_norm_param->Bpoo)); - - // norm = n(mu) - quat_alg_norm(&ibq_norm,mu,&eichler_norm_param->Bpoo); - if (!ibq_to_ibz(&norm,&ibq_norm)) { - assert(0); - } - - #ifndef NDEBUG - ibz_mul(&rhs,&(*C)[0],&(*C)[0]); - ibz_set(&temp,eichler_norm_param->order.q); - ibz_mul(&temp,&temp,&(*C)[1]); - ibz_mul(&temp,&temp,&(*C)[1]); - ibz_add(&temp,&temp,&rhs); - ibz_mul(&temp,&temp,&eichler_norm_param->Bpoo.p); - assert(0==ibz_cmp(&temp,&norm)); - #endif - - // rhs = (target_norm - norm) / n² - ibz_sub(&rhs,&eichler_norm_param->target_norm,&norm); - ibz_mul(&temp,&eichler_norm_param->n,&eichler_norm_param->n); - ibz_div(&rhs,&temp,&rhs,&temp); - - - - // for debug check that the remainder is zero - assert(ibz_cmp(&temp,&ibz_const_zero)==0); - - // covers the case where we adjusted the norm of the target by 4, to help obtaining a primitive element - // will always happen when eichler_nom_param.order.q = 1 mod 4 - if (ibz_get(&eichler_norm_param->target_norm)%2==0) { - - // when eichler_nom_param.order.q = 3 mod 4, we make some adjustements to help obtaining a primitive element and - // make possible the resolution of the binary quadratic equation below - // in this first case we will find an element of the form 4 * M for some prime M - if (eichler_norm_param->order.q%8 == 3 && ibz_get(&rhs)%4 == 0) { - ibz_set(&temp,4); - ibz_div(&norm,&temp,&rhs,&temp); - assert(0==ibz_cmp(&temp,&ibz_const_zero)); - } - // in this first case we will find an element of the form 8 * M for some prime M - else if ((eichler_norm_param->order.q%8 == 7 && ibz_get(&rhs)%8 == 0)) { - ibz_set(&temp,8); - ibz_div(&norm,&temp,&rhs,&temp); - assert(0==ibz_cmp(&temp,&ibz_const_zero)); - } - else { - ibz_copy(&norm,&rhs); - } - assert(ibz_cmp(&norm,&ibz_const_zero)>=0); - - // TODUPDATE we can probably filter out some cases depending on the reduosiy - if ((eichler_norm_param->order.q == 1 && ibz_cornacchia_extended(&a, &b,&norm, SMALL_PRIMES_1MOD4 , sizeof(SMALL_PRIMES_1MOD4)/sizeof(*SMALL_PRIMES_1MOD4), KLPT_primality_num_iter, &PROD_SMALL_PRIMES_3MOD4)) - || (eichler_norm_param->order.q%4 == 1 && ibz_probab_prime(&norm,KLPT_primality_num_iter) && ibz_cornacchia_prime(&a,&b, &ibz_q, &norm)) - || (eichler_norm_param->order.q%8 == 3 && ibz_get(&rhs)%4 == 0 && ibz_probab_prime(&norm,KLPT_primality_num_iter) && ibz_cornacchia_special_prime(&a,&b,&ibz_q,&norm,2)) - || (eichler_norm_param->order.q%8 == 7 && ibz_get(&rhs)%8 ==0 && ibz_probab_prime(&norm,KLPT_primality_num_iter) && ibz_cornacchia_special_prime(&a,&b,&ibz_q,&norm,3)) - - ){ - - ibz_copy(&coeffs[2],&ibz_const_zero); - ibz_copy(&coeffs[3],&ibz_const_zero); - ibz_copy(&coeffs[0],&a); - ibz_copy(&coeffs[1],&b); - ibz_mul(&coeffs[0],&coeffs[0],&eichler_norm_param->n); - ibz_mul(&coeffs[1],&coeffs[1],&eichler_norm_param->n); - - // computing the final value of mu - // quat_temp = n * (a + i*b) - order_elem_create(&quat_temp,&eichler_norm_param->order,&coeffs,&eichler_norm_param->Bpoo); - - // mu = mu + quat_temp - quat_alg_add(mu,mu,&quat_temp); - - - #ifndef NDEBUG - // for debug we check check that the norm is indeed the target norm - quat_alg_norm(&ibq_norm,mu,&eichler_norm_param->Bpoo); - ibq_to_ibz(&norm,&ibq_norm); - assert(ibz_cmp(&norm,&eichler_norm_param->target_norm)==0); - assert(quat_lattice_contains(&coeffs,&eichler_norm_param->order.order,mu,&eichler_norm_param->Bpoo)); - #endif - - // mu = mu / 2 and checking that the result in still in the order - ibz_mul(&mu->denom,&mu->denom,&ibz_const_two); - found = quat_lattice_contains(&coeffs,&eichler_norm_param->order.order,mu,&eichler_norm_param->Bpoo); - - } - } - - // this second case is only possible when q = 3 mod 4 - // here, we have not adjusted the target_norm, so it is odd - else { - // same as before, we differentiate several cases to enable the computation and boost the probability of finding a primitive element - // in particular, we will try to find a,b of the right norm such that a+ib/2 is in the maximal extremal order - if (eichler_norm_param->order.q%8 == 3 && ibz_get(&rhs)%2 != 0) { - ibz_copy(&norm,&rhs); - } - else if ((eichler_norm_param->order.q%8 == 3 && ibz_get(&rhs)%4 == 0)) { - ibz_set(&temp,4); - ibz_div(&norm,&temp,&rhs,&temp); - assert(0==ibz_cmp(&temp,&ibz_const_zero)); - } - else if ((eichler_norm_param->order.q%8 == 7 && ibz_get(&rhs)%4 == 2)) { - ibz_set(&temp,2); - ibz_div(&norm,&temp,&rhs,&temp); - assert(0==ibz_cmp(&temp,&ibz_const_zero)); - } - - // TODUPDATE we can probably filter out some cases depending on the reduosiy - if ((eichler_norm_param->order.q%8 == 3 && (ibz_get(&rhs)%2 != 0) && ibz_probab_prime(&norm,KLPT_primality_num_iter) && ibz_cornacchia_special_prime(&a,&b,&ibz_q,&norm,2)) - || (eichler_norm_param->order.q%8 == 3 && ibz_get(&rhs)%4 ==0 && ibz_probab_prime(&norm,KLPT_primality_num_iter) && ibz_cornacchia_special_prime(&a,&b,&ibz_q,&norm,4)) - || (eichler_norm_param->order.q%8 == 7 && ibz_get(&rhs)%4 ==2 && ibz_probab_prime(&norm,KLPT_primality_num_iter) && ibz_cornacchia_special_prime(&a,&b,&ibz_q,&norm,3)) - - ) { - ibz_copy(&coeffs[2],&ibz_const_zero); - ibz_copy(&coeffs[3],&ibz_const_zero); - ibz_copy(&coeffs[0],&a); - ibz_copy(&coeffs[1],&b); - ibz_mul(&coeffs[0],&coeffs[0],&eichler_norm_param->n); - ibz_mul(&coeffs[1],&coeffs[1],&eichler_norm_param->n); - - // computing the final value of mu - // quat_temp = n * (a + i*b) / 2 - order_elem_create(&quat_temp,&eichler_norm_param->order,&coeffs,&eichler_norm_param->Bpoo); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&ibz_const_two); - - - // debug testing that quat_temp is in the correct order - assert(quat_lattice_contains(&coeffs,&eichler_norm_param->order.order,&quat_temp,&eichler_norm_param->Bpoo)); - - // mu = mu + quat_temp - quat_alg_add(mu,mu,&quat_temp); - - // debug testing that mu is in the correct order - assert(quat_lattice_contains(&coeffs,&eichler_norm_param->order.order,mu,&eichler_norm_param->Bpoo)); - - #ifndef NDEBUG - // debug testing the norm - quat_alg_norm(&ibq_norm,mu,&eichler_norm_param->Bpoo); - ibq_to_ibz(&norm,&ibq_norm); - assert(ibz_cmp(&norm,&eichler_norm_param->target_norm)==0); - #endif - - found = 1; - - } - - } - if (found) { - - // for debug we check that the element is primitive and contained in the correct order - assert(quat_alg_is_primitive(mu,&eichler_norm_param->order.order,&eichler_norm_param->Bpoo)); - assert(quat_lattice_contains(&coeffs,&eichler_norm_param->right_order,mu,&eichler_norm_param->Bpoo)); - assert(quat_lattice_contains(&coeffs,&eichler_norm_param->order.order,mu,&eichler_norm_param->Bpoo)); - assert(quat_lattice_contains(&coeffs,&eichler_norm_param->right_order,&eichler_norm_param->gen_constraint,&eichler_norm_param->Bpoo)); - assert(quat_alg_is_primitive(&eichler_norm_param->gen_constraint,&eichler_norm_param->right_order,&eichler_norm_param->Bpoo)); - - // mu is in the extremal order, we only to verify the final condition - // computing the first ideal to compare id1 = order < gen_constraint , 2 > - quat_lideal_make_primitive_then_create(&id1,&eichler_norm_param->gen_constraint,&ibz_const_two,&eichler_norm_param->right_order,&eichler_norm_param->Bpoo); - - // computing the generator of the second ideal quat_temp = gen_constraint * conjugate( mu ) - quat_alg_conj(&quat_temp,mu); - quat_alg_mul(&quat_temp,&eichler_norm_param->gen_constraint,&quat_temp,&eichler_norm_param->Bpoo); - quat_alg_normalize(&quat_temp); - - // computing id2 = order < quat_temp ,2> - quat_lideal_make_primitive_then_create(&id2,&quat_temp,&ibz_const_two,&eichler_norm_param->right_order,&eichler_norm_param->Bpoo); - - // testing equality - found = !quat_lideal_equals(&id1,&id2,&eichler_norm_param->Bpoo); - - } - - - - // var finalize - quat_alg_elem_finalize(&quat_temp); - quat_alg_coord_finalize(&coeffs); - ibz_finalize(&norm);ibz_finalize(&rhs); - ibz_finalize(&temp); - ibq_finalize(&ibq_norm); - ibz_finalize(&a);ibz_finalize(&b); - ibz_finalize(&ibz_q); - quat_left_ideal_finalize(&id1); - quat_left_ideal_finalize(&id2); - - return found; -} - - -/** - * @brief Finding an endomorphism of smooth norm inside a fixed eichler order - * - * @param beta Output: the linear combination - * @param n_beta Output: the norm of bet and O = OR(J) and ideal_constraint = O < gen_constraint,2> - * Find beta of norm defined n_quat_C in OR(J) \ (ZZ + ideal_constraint) (by design the norm of beta is odd) - * gen_constraint is assumed to be primitive! - * assumes n is prime - * returns a bit indicating if the computation succeeded - */ -int eichler_special_norm_fixed(quat_alg_elem_t *beta,ibz_t *n_beta, const quat_p_extremal_maximal_order_t *order, const quat_alg_elem_t *gen, const ibz_t *n, quat_alg_elem_t *gen_constraint, const quat_alg_t *Bpoo) { - - // var dec - int cnt; - ibz_t nj; // norm of j - ibq_t temp_ibq; - ibz_t temp,lambda; - ibz_t n_quat_C; - int size_list; - quat_left_ideal_t lideal; - quat_alg_coord_t coeffs; - quat_alg_elem_t quat_1,quat_C,scal,quat_temp,mu; - ibz_vec_2_t C; // the linear combination - int is_divisible = 0; - int is_n_quat_C_square; - int log_margin; - int found; - int abort = 0; - eichler_norm_param_t param; - - // var init - found = 1; - cnt = 0; - ibz_init(&nj); - ibz_init(&n_quat_C); - ibz_t n_mu_list[KLPT_eichler_number_mu_norm]; - - ibz_init(&temp); - ibz_init(&lambda); - ibq_init(&temp_ibq); - quat_left_ideal_init(&lideal); - quat_alg_elem_init(&quat_1); - quat_alg_elem_init(&quat_C); - quat_alg_elem_init(&scal); - quat_alg_elem_init(&quat_temp); - quat_alg_elem_init(&mu); - quat_alg_coord_init(&coeffs); - ibz_vec_2_init(&C); - for (int ind=0;indp); - ibz_init(¶m.n); - ibz_init(¶m.target_norm); - quat_alg_elem_init(¶m.gen_constraint); - param.order = *order; - quat_order_init(¶m.right_order); - - //the quaternion element 1 - quat_alg_scalar(&quat_1,&ibz_const_one,&ibz_const_one); - - // computation the ideal lideal - quat_lideal_make_primitive_then_create(&lideal,gen,n,&order->order,Bpoo); - - // computation of the right order of lideal - quat_lideal_right_order(¶m.right_order,&lideal,Bpoo); - - - // removing the potential scalar factors of gen_constraint - // TODUPDATE optimize this to avoid doing it when unnecessary (using the trace ?) - quat_alg_make_primitive(&coeffs,&temp,gen_constraint,¶m.right_order,Bpoo); - ibz_mul(&gen_constraint->denom,&gen_constraint->denom,&temp); - quat_alg_normalize(gen_constraint); - - // copying to eichler norm param - quat_alg_elem_copy(¶m.gen_constraint,gen_constraint); - - // for debug, we check that gen_constraint is in the correct right order - assert(quat_lattice_contains(&coeffs,¶m.right_order,gen_constraint,Bpoo)); - assert(quat_alg_is_primitive(gen_constraint,¶m.right_order,Bpoo)); - - // computation of the linear combination - found = found && solve_combi_eichler(&C,order,&quat_1,&quat_1,&lideal,Bpoo,is_divisible); - assert(found); - - // compute quat_C = j * (C[0] + i * C[1]) - ibz_copy(&coeffs[0],&ibz_const_zero); - ibz_copy(&coeffs[1],&ibz_const_zero); - ibz_copy(&coeffs[2],&C[0]); - ibz_copy(&coeffs[3],&C[1]); - order_elem_create(&quat_C,order,&coeffs,Bpoo); - assert(quat_lattice_contains(&coeffs,¶m.right_order,&quat_C,Bpoo)); - - // computation of the norm of beta - quat_alg_norm(&temp_ibq,&quat_C,Bpoo); - if (!ibq_to_ibz(&n_quat_C,&temp_ibq)) { - assert(0); - } - - - ibz_mul(&lambda,&C[0],&C[0]); - ibz_set(&temp,order->q); - ibz_mul(&temp,&temp,&C[1]); - ibz_mul(&temp,&temp,&C[1]); - ibz_add(&temp,&temp,&lambda); - ibz_mul(&temp,&temp,&Bpoo->p); - assert(0==ibz_cmp(&temp,&n_quat_C)); - - // computation of the legendre symbol - is_n_quat_C_square = ibz_legendre(&n_quat_C,n); - - //computation of the log_margin = log (p) + 3 log(n) + KLPT_strong_approx_log_margin - log_margin = ibz_bitsize(&Bpoo->p) + 3* ibz_bitsize(n) + KLPT_eichler_strong_approx_log_margin; - - // computation of a list of possible values for n_mu - size_list = norm_list_computation(n_mu_list,KLPT_eichler_number_mu_norm,log_margin,n,is_n_quat_C_square); - - // if no suitable norm has been found we can abort directly - if (!size_list) { - abort = 1; - } - - if(!abort){ - found = 0; - - // strong_approximation loop - while (!found && cnt < size_list) { - - // computation of the value of lambda - ibz_invmod(&temp,&n_quat_C,n); - ibz_mul(&temp,&temp,&n_mu_list[cnt]); - ibz_mod(&temp,&temp,n); - found=ibz_sqrt_mod_p(&lambda,&temp,n); - assert(found); - - // if q = 1 mod 4 multiply lambda by 2 and the final norm by 4 - if (order->q%4 == 1) { - // if (1) { - ibz_mul(&temp,&n_mu_list[cnt],&ibz_const_two); - ibz_mul(&temp,&temp,&ibz_const_two); - ibz_mul(&lambda,&lambda,&ibz_const_two); - } - else { - ibz_copy(&temp,&n_mu_list[cnt]); - } - // preparation of the strong approx computation - // setting param - ibz_copy(¶m.target_norm,&temp); - ibz_copy(¶m.n,n); - - - // actual strong_approximation - found = strong_approximation(&mu,&temp,order,&C,&n_quat_C,&lambda,n,KLPT_eichler_number_strong_approx,condition_eichler,¶m,Bpoo); - if (!found && order->q%4==3) { - // if q =3 mod 4, we try again by multiplying the norm by 4 - ibz_mul(&temp,&n_mu_list[cnt],&ibz_const_two); - ibz_mul(&temp,&temp,&ibz_const_two); - ibz_mul(&lambda,&lambda,&ibz_const_two); - ibz_copy(¶m.target_norm,&temp); - found = strong_approximation(&mu,&temp,order,&C,&n_quat_C,&lambda,n,KLPT_eichler_number_strong_approx,condition_eichler,¶m,Bpoo); - - } - - if (found) { - // computing the final beta = mu - ibz_copy(&beta->coord[0],&mu.coord[0]); - ibz_copy(&beta->coord[1],&mu.coord[1]); - ibz_copy(&beta->coord[2],&mu.coord[2]); - ibz_copy(&beta->coord[3],&mu.coord[3]); - ibz_copy(&beta->denom,&mu.denom); - ibz_copy(n_beta,&n_mu_list[cnt]); - } - else { - // incrementing the counter - cnt++; - } - } - } else { - found = 0; - } - - // var finalize - ibz_finalize(&nj); - ibz_finalize(&n_quat_C); - quat_left_ideal_finalize(&lideal); - quat_alg_elem_finalize(&quat_1); - quat_alg_elem_finalize(&quat_C); - quat_alg_elem_finalize(&scal); - quat_alg_elem_finalize(&quat_temp); - ibz_finalize(&temp); - ibz_finalize(&lambda); - ibq_finalize(&temp_ibq); - quat_alg_elem_finalize(&mu); - quat_alg_coord_finalize(&coeffs); - ibz_vec_2_finalize(&C); - for (int ind=0;ind - * Find beta of norm n_beta in OR(J) \ O (by design the norm of beta is odd) - * where J = I * gen /Norm(I) of norm n, a prime number - * and O is the embedding of ZZ + K inside OR(J) (induced by the isomorphism from OR(I) to OR(J)) - * returns a bit indicating if the computation succeeded - * in most cases beta will be contained in the order ZZ + J, but in some extreme cases (where we use another special extremal order) it might not be true. This does not change anything for the applications of eichler_special_norm. - */ -int klpt_eichler_special_norm(quat_alg_elem_t *beta, ibz_t *n_beta, quat_alg_elem_t *gen, ibz_t *n, quat_left_ideal_t *lideal, quat_alg_elem_t *gen_constraint, const quat_alg_t *Bpoo) { - - // var declaration - int bitsize; - ibz_t mod2; - int found,found_equiv; - int cnt; - quat_alg_elem_t gen_lideal; - ibz_t n_lideal; - quat_left_ideal_t connecting_lideal; - quat_order_t right_order; - quat_alg_elem_t new_gen_constraint,quat_temp; - const quat_p_extremal_maximal_order_t *alternate_order = NULL; - ibz_mat_4x4_t reduced,gram; - quat_alg_coord_t coeffs; - - // var init - found = 0; found_equiv = 0; - cnt = 0; - ibz_init(&mod2); - ibz_init(&n_lideal); - quat_alg_elem_init(&gen_lideal); - quat_alg_elem_init(&new_gen_constraint); - quat_alg_elem_init(&quat_temp); - quat_left_ideal_init(&connecting_lideal); - quat_order_init(&right_order); - ibz_mat_4x4_init(&reduced); - ibz_mat_4x4_init(&gram); - quat_alg_coord_init(&coeffs); - - // we start by deciding if we can use J = I - // for that we try to see if the value of n(I) is small and odd - bitsize = ibz_bitsize(&lideal->norm); - if (ibz_get(&lideal->norm)%2 == 1 && bitsize < KLPT_eichler_smallnorm_bitsize ) { - // in that case, we should have enough room to find an output with J = I - // compute the generator and copy the norm - int lideal_generator_ok = quat_lideal_generator(gen,lideal,Bpoo,0); - assert(lideal_generator_ok); - ibz_copy(n,&lideal->norm); - found = eichler_special_norm_fixed(beta,n_beta,&STANDARD_EXTREMAL_ORDER,gen,n,gen_constraint,Bpoo); - - // we adjust the value of gen to match the requirement J = I * gen /Norm(I) of norm n with J = I - quat_alg_scalar(gen,n,&ibz_const_one); - found_equiv = 1; - - // if it failed we used alternate orders - if (!found ) { - - cnt = 0; - // we compute the right order of lideal - quat_lideal_right_order(&right_order,lideal,Bpoo); - - while ( !found && cnt < KLPT_eichler_num_equiv_ideal*NUM_ALTERNATE_EXTREMAL_ORDERS ) { - - if (cnt%KLPT_eichler_num_equiv_ideal == 0) { - // we initialize the alternate order and the other values - int index = cnt/KLPT_eichler_num_equiv_ideal; - - alternate_order = &ALTERNATE_EXTREMAL_ORDERS[index]; - - // fist we need to compute connecting_lideal = connecting_ideal ( right_order, alternate_order ) - quat_connecting_ideal(&connecting_lideal,&ALTERNATE_EXTREMAL_ORDERS[index].order,&right_order,Bpoo); - - // we reduce the basis and compute its gram matrix - // basis reduction step - quat_lideal_reduce_basis(&reduced,&gram,&connecting_lideal,Bpoo); - - } - cnt++; - - // we compute an equivalent ideal - found = klpt_lideal_equiv(&gen_lideal,&n_lideal,&reduced,&gram,&connecting_lideal.norm,&connecting_lideal.lattice.denom,Bpoo); - if (!found) { - continue; - } - - // filtering if the bitsize of n is too big - if (ibz_bitsize(&CHARACTERISTIC)+ 3*ibz_bitsize(&n_lideal) > 2*ibz_bitsize(&TORSION_ODD)) { - found = 0; - continue; - - } - // we adapt the value of gen_constraint to be contained inside the right order of equiv_lideal - // new_gen_constraint = ( conj(gen_lideal) / n(gen_lideal) ) * new_gen_constraint * gen_lideal - quat_alg_conj(&quat_temp,&gen_lideal); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&n_lideal); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&connecting_lideal.norm); - quat_alg_mul(&new_gen_constraint,&quat_temp,gen_constraint,Bpoo); - quat_alg_mul(&new_gen_constraint,&new_gen_constraint,&gen_lideal,Bpoo); - - // we try to solve the eichler norm equation - found = eichler_special_norm_fixed(beta,n_beta,alternate_order,&gen_lideal,&n_lideal,&new_gen_constraint,Bpoo); - - assert(!found || quat_lattice_contains(&coeffs,&alternate_order->order,beta,Bpoo)); - - } - - - if (found ) { - // we apply the isomorphism to embed beta into the correct order - - // first, we send beta to right_order - // beta = gen_lideal * beta * conj (gen_lideal) / n( gen_lideal ) - quat_alg_mul(beta,beta,&quat_temp,Bpoo); - quat_alg_mul(beta,&gen_lideal,beta,Bpoo); - assert(quat_lattice_contains(&coeffs,&right_order,beta,Bpoo)); - - // second, we send beta to the right order of the equivalent ideal generated by gen - // beta = conj ( gen ) / n ( gen ) * beta * gen - quat_alg_conj(&quat_temp,gen); - ibz_mul(&quat_temp.denom,&quat_temp.denom,n); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&lideal->norm); - quat_alg_mul(beta,&quat_temp,beta,Bpoo); - quat_alg_mul(beta,beta,gen,Bpoo); - - } - } - } - else { - // in all other cases we try to run the eichler order norm equation for the standard extremal order first - // before trying alternates order - - // we compute a reduced basis and its gram matrix - quat_lideal_reduce_basis(&reduced,&gram,lideal,Bpoo); - - // we will try different ideals equivalent to lideal - while ( !found && cnt < KLPT_eichler_num_equiv_ideal ) { - - cnt++; - // we start by computing an equivalent ideal. - // equiv_lideal = lideal * gen/Norm(lideal) - // gen is contained in equiv_lideal and conj(lideal) - - found_equiv = klpt_lideal_equiv(gen,n,&reduced,&gram,&lideal->norm,&lideal->lattice.denom,Bpoo); - if (!found_equiv) { - found = 0; - continue; - } - - // filtering if the bitsize of n is too big - if (ibz_bitsize(&CHARACTERISTIC)+ 3*ibz_bitsize(n) > 2*ibz_bitsize(&TORSION_ODD)) { - found = 0; - continue; - } - - // we adapt the value of gen_constraint to be contained inside the right order of equiv_lideal - // new_gen_constraint = ( conj(gen) / n(gen) ) * gen_constraint * gen - quat_alg_conj(&new_gen_constraint,gen); - ibz_mul(&new_gen_constraint.denom,&new_gen_constraint.denom,n); - ibz_mul(&new_gen_constraint.denom,&new_gen_constraint.denom,&lideal->norm); - quat_alg_mul(&new_gen_constraint,&new_gen_constraint,gen_constraint,Bpoo); - quat_alg_mul(&new_gen_constraint,&new_gen_constraint,gen,Bpoo); - - - // we try to solve the eichler norm equation - found = eichler_special_norm_fixed(beta,n_beta,&STANDARD_EXTREMAL_ORDER,gen,n,&new_gen_constraint,Bpoo); - - } - - // then we try the same with but with an alternate special extremal orders - // we will need to find a connecting ideal and then try the same procedure with ideals equivalent to the connecting ideal - if (!found && found_equiv) { - - cnt = 0; - // we compute the right order of lideal - quat_lideal_right_order(&right_order,lideal,Bpoo); - - while ( !found && cnt < KLPT_eichler_num_equiv_ideal*NUM_ALTERNATE_EXTREMAL_ORDERS ) { - - if (cnt%KLPT_eichler_num_equiv_ideal == 0) { - // we initialize the alternate order and the other values - int index = cnt/KLPT_eichler_num_equiv_ideal; - - alternate_order = &ALTERNATE_EXTREMAL_ORDERS[index]; - - // fist we need to compute connecting_lideal = connecting_ideal ( right_order, alternate_order ) - quat_connecting_ideal(&connecting_lideal,&ALTERNATE_EXTREMAL_ORDERS[index].order,&right_order,Bpoo); - - // we reduce the basis and compute its gram matrix - // basis reduction step - quat_lideal_reduce_basis(&reduced,&gram,&connecting_lideal,Bpoo); - - } - cnt++; - - // we compute an equivalent ideal - found = klpt_lideal_equiv(&gen_lideal,&n_lideal,&reduced,&gram,&connecting_lideal.norm,&connecting_lideal.lattice.denom,Bpoo); - if (!found) { - continue; - } - - // filtering if the bitsize of n is too big - if ( ibz_bitsize(&CHARACTERISTIC)+ 3*ibz_bitsize(&n_lideal) > 2*ibz_bitsize(&TORSION_ODD)) { - found = 0; - continue; - - } - - // we adapt the value of gen_constraint to be contained inside the right order of equiv_lideal - // new_gen_constraint = ( conj(gen_lideal) / n(gen_lideal) ) * new_gen_constraint * gen_lideal - quat_alg_conj(&quat_temp,&gen_lideal); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&n_lideal); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&connecting_lideal.norm); - quat_alg_mul(&new_gen_constraint,&quat_temp,gen_constraint,Bpoo); - quat_alg_mul(&new_gen_constraint,&new_gen_constraint,&gen_lideal,Bpoo); - - // we try to solve the eichler norm equation - found = eichler_special_norm_fixed(beta,n_beta,alternate_order,&gen_lideal,&n_lideal,&new_gen_constraint,Bpoo); - - assert(!found || quat_lattice_contains(&coeffs,&alternate_order->order,beta,Bpoo)); - - } - - - if (found ) { - // we apply the isomorphism to embed beta into the correct order - - // first, we send beta to right_order - // beta = gen_lideal * beta * conj (gen_lideal) / n( gen_lideal ) - quat_alg_mul(beta,beta,&quat_temp,Bpoo); - quat_alg_mul(beta,&gen_lideal,beta,Bpoo); - assert(quat_lattice_contains(&coeffs,&right_order,beta,Bpoo)); - - // second, we send beta to the right order of the equivalent ideal generated by gen - // beta = conj ( gen ) / n ( gen ) * beta * gen - quat_alg_conj(&quat_temp,gen); - ibz_mul(&quat_temp.denom,&quat_temp.denom,n); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&lideal->norm); - quat_alg_mul(beta,&quat_temp,beta,Bpoo); - quat_alg_mul(beta,beta,gen,Bpoo); - - } - - } - } - - - // var finalization - ibz_finalize(&mod2); - ibz_finalize(&n_lideal); - quat_alg_elem_finalize(&gen_lideal); - quat_alg_elem_finalize(&quat_temp); - quat_alg_elem_finalize(&new_gen_constraint); - quat_left_ideal_finalize(&connecting_lideal); - quat_order_finalize(&right_order); - ibz_mat_4x4_finalize(&reduced); - ibz_mat_4x4_finalize(&gram); - quat_alg_coord_finalize(&coeffs); - return found & found_equiv; -} diff --git a/src/klpt/ref/klptx/equiv.c b/src/klpt/ref/klptx/equiv.c deleted file mode 100644 index 20fa31a..0000000 --- a/src/klpt/ref/klptx/equiv.c +++ /dev/null @@ -1,249 +0,0 @@ -#include -#include "tools.h" - - -/** - * @brief Keygen random ideal - * @param ideal : Output : random ideal - * @param order : maximal extremal order - * @param Bpoo the quaternion algebra - * computes a keygen ideal - */ -int klpt_keygen_random_ideal(quat_left_ideal_t *ideal, const quat_p_extremal_maximal_order_t *order, const quat_alg_t *Bpoo) { - - int found; - ibz_t temp; - quat_alg_elem_t gamma;quat_alg_elem_t quat_temp; - quat_alg_coord_t coeffs; - ibz_t n; - - ibz_init(&temp);ibz_init(&n); - quat_alg_elem_init(&gamma);quat_alg_elem_init(&quat_temp); - quat_alg_coord_init(&coeffs); - - // we start by sampling the random norm n - generate_random_prime(&n,1,KLPT_secret_key_prime_size); - - // we start by sampling a random element of norm n 2^log(p) - ibz_pow(&temp,&ibz_const_two,2*ibz_bitsize(&CHARACTERISTIC)); - ibz_mul(&temp,&temp,&n); - found = represent_integer(&gamma,&temp,Bpoo); - if (!found) { - return 0; - } - // then we generate a random scalar - ibz_rand_interval(&temp,&ibz_const_zero,&n); - - // if temp != 0 then we set gamma = gamma * (temp + i) - if (0!=ibz_cmp(&temp,&ibz_const_zero)) { - ibz_copy(&coeffs[0],&temp); - ibz_copy(&coeffs[1],&ibz_const_one); - ibz_copy(&coeffs[2],&ibz_const_zero); - ibz_copy(&coeffs[3],&ibz_const_zero); - order_elem_create(&quat_temp,order,&coeffs,Bpoo); - quat_alg_mul(&gamma,&gamma,&quat_temp,Bpoo); - } - - // we compute the output ideal O0 - quat_lideal_create_from_primitive(ideal,&gamma,&n,&order->order,Bpoo); - - - ibz_finalize(&temp);ibz_finalize(&n); - quat_alg_elem_finalize(&gamma);quat_alg_elem_finalize(&quat_temp); - quat_alg_coord_finalize(&coeffs); - return found; -} - -/** - * @brief Equivalent left ideal eichler randomized - * - * @param gen Output: generator of equiv - * @param n level of the eichler order - * @param lideal quaternion ideal - * @param Bpoo the quaternion algebra - * finds an ideal randomized in the class of eichler orders of level n - * assumes that n is prime - */ -void klpt_lideal_equiv_random_eichler(quat_alg_elem_t *gen, const ibz_t *n, const quat_left_ideal_t *lideal, const quat_alg_t *Bpoo) { - - - // declaration of variables - int ctr = 0; - int check = 0; - int found = 0; - ibq_t ibq_norm; - ibz_t temp;ibz_t disc; - quat_alg_coord_t coeffs; - quat_alg_elem_t beta,quat_temp,gamma; - - // var init - quat_alg_coord_init(&coeffs); - ibz_init(&temp);ibz_init(&disc); - ibq_init(&ibq_norm); - quat_alg_elem_init(&beta); - quat_alg_elem_init(&gamma); - quat_alg_elem_init(&quat_temp); - - // the loop : we are looking for our nice element - // the number of tries is bounded - while (!found && ctr < KLPT_equiv_num_iter) { - ctr++; - // we select our linear combination at random - ibz_rand_interval_minm_m(&coeffs[0],KLPT_equiv_bound_coeff); - ibz_rand_interval_minm_m(&coeffs[1],KLPT_equiv_bound_coeff); - ibz_rand_interval_minm_m(&coeffs[2],KLPT_equiv_bound_coeff); - ibz_rand_interval_minm_m(&coeffs[3],KLPT_equiv_bound_coeff); - - // computation of the quaternion element - // as beta = \sum_{0 <= i <= 3 } coeffs[i] * bas[i] - ibz_mat_4x4_eval(&beta.coord,&lideal->parent_order->basis,&coeffs); - ibz_copy(&beta.denom,&lideal->parent_order->denom); - - - // now we need to check that n is inert in the quadratic order ZZ[beta] - // computing the discriminant n(beta) - 4*trace(beta)^2 - quat_alg_norm(&ibq_norm,&beta,Bpoo); - check = ibq_to_ibz(&disc,&ibq_norm); - assert(&check); - quat_alg_trace(&ibq_norm,&beta); - check = ibq_to_ibz(&temp,&ibq_norm); - assert(&check); - ibz_mul(&temp,&temp,&temp); - ibz_mul(&temp,&temp,&ibz_const_two); - ibz_mul(&temp,&temp,&ibz_const_two); - ibz_sub(&disc,&disc,&temp); - ibz_neg(&disc,&disc); - // testing that n is inert in ZZ[beta] - ibz_mod(&temp,&disc,n); - found = (0!=ibz_cmp(&temp,&ibz_const_zero)) && (-1 == ibz_legendre(&disc,n)); - - } - // we have found the nice element beta - // now we need to find the nice element in lideal - ctr = 0; - found = 0; - while (!found && ctr < KLPT_equiv_num_iter) { - ctr++; - // we select our linear combination at random - ibz_rand_interval_minm_m(&coeffs[0],KLPT_equiv_bound_coeff); - ibz_rand_interval_minm_m(&coeffs[1],KLPT_equiv_bound_coeff); - ibz_rand_interval_minm_m(&coeffs[2],KLPT_equiv_bound_coeff); - ibz_rand_interval_minm_m(&coeffs[3],KLPT_equiv_bound_coeff); - - // computation of the quaternion element - // as beta = \sum_{0 <= i <= 3 } coeffs[i] * bas[i] - ibz_mat_4x4_eval(&gamma.coord,&lideal->lattice.basis,&coeffs); - ibz_copy(&gamma.denom,&lideal->lattice.denom); - - - // now we need to check that n is coprime with norm of gamma - quat_alg_norm(&ibq_norm,&gamma,Bpoo); - ibq_to_ibz(&disc,&ibq_norm); - - ibz_gcd(&temp,&disc,n); - // testing that the norm is coprime to 2*n - found = (0==ibz_cmp(&temp,&ibz_const_one)); - } - - // now we can sample the random linear combination - ibz_rand_interval(&temp,&ibz_const_zero,n); - - // if temp != 0 then we compute gamma as (temp + beta) * gamma - if (0!=ibz_cmp(&temp,&ibz_const_zero)) { - quat_alg_scalar(&quat_temp,&temp,&ibz_const_one); - quat_alg_add(&beta,&beta,&quat_temp); - quat_alg_mul(&gamma,&beta,&gamma,Bpoo); - } - - // copying the result to gen - quat_alg_conj(gen,&gamma); - - - // freeing the variables - quat_alg_coord_finalize(&coeffs); - ibz_finalize(&temp);ibz_finalize(&disc); - ibq_finalize(&ibq_norm); - quat_alg_elem_finalize(&beta); - quat_alg_elem_finalize(&gamma); - quat_alg_elem_finalize(&quat_temp); -} - -/** - * @brief Equivalent left ideal - * - * @param gen Output: generator of equiv - * @param n Output : norm of the equivalent ideal - * @param reduced the reduced basis for the ideal in input - * @param gram the gram matrix of the reduced basis - * @param lideal_norm the norm of the ideal represented by reduced basis - * @param denom integer, the denominator of the ideal - * @param Bpoo the quaternion algebra - * @return a bit indicating if the computation succeeded - * Assumes that the basis is reduced - * there is an equivalent ideal of norm n such that equiv_lideal = lideal * gen/Norm(lideal) - * this search is randomized and may fail - */ -int klpt_lideal_equiv(quat_alg_elem_t *gen, ibz_t *n, const ibz_mat_4x4_t *reduced, const ibz_mat_4x4_t *gram, const ibz_t *lideal_norm, const ibz_t *denom, const quat_alg_t *Bpoo) { - - - // declaration of variables - int ctr = 0; - int found = 0; - ibz_t norm_v,remainder,quotient_norm_v,adjusted_norm; - quat_alg_coord_t coeffs; - - // var init - quat_alg_coord_init(&coeffs); - ibz_init(&norm_v); - ibz_init(&remainder); - ibz_init("ient_norm_v); - ibz_init(&adjusted_norm); - - // dividing by the denom to get the real norm from the gram matrix - ibz_mul(&adjusted_norm,lideal_norm,denom); - ibz_mul(&adjusted_norm,&adjusted_norm,denom); - - // the loop : we are looking for our nice element - // the number of tries is bounded - while (!found && ctr < KLPT_equiv_num_iter) { - ctr++; - // we select our linear combination at random - ibz_rand_interval_minm_m(&coeffs[0],KLPT_equiv_bound_coeff); - ibz_rand_interval_minm_m(&coeffs[1],KLPT_equiv_bound_coeff); - ibz_rand_interval_minm_m(&coeffs[2],KLPT_equiv_bound_coeff); - ibz_rand_interval_minm_m(&coeffs[3],KLPT_equiv_bound_coeff); - - //computation of the norm of the vector sampled - quat_qf_eval(&norm_v,gram,&coeffs); - - // compute the norm of the equivalent ideal - // can be improved by removing the power of two first and the odd part only if the trial division failed (this should always be called on an ideal of norm 2^x * N for some big prime N ) - ibz_div("ient_norm_v,&remainder,&norm_v,&adjusted_norm); - - // debug : check that the remainder is zero - assert(ibz_is_zero(&remainder)); - - // pseudo-primality test - if (ibz_probab_prime("ient_norm_v,KLPT_primality_num_iter)) { - // computes the generator using a matrix multiplication - ibz_mat_4x4_eval(&gen->coord,reduced,&coeffs); - - ibz_copy(&gen->denom,denom); - - quat_alg_conj(gen,gen); - ibz_copy(n,"ient_norm_v); - found = 1; break; - } - - - } - - // freeing the variables - ibz_finalize(&norm_v); - ibz_finalize(&remainder); - ibz_finalize("ient_norm_v); - ibz_finalize(&adjusted_norm); - quat_alg_coord_finalize(&coeffs); - - return found; -} diff --git a/src/klpt/ref/klptx/klpt.c b/src/klpt/ref/klptx/klpt.c deleted file mode 100644 index 93e26ca..0000000 --- a/src/klpt/ref/klptx/klpt.c +++ /dev/null @@ -1,634 +0,0 @@ -#include -#include "tools.h" - - -/** - * @brief Deciding if a given vector is suitable for the signing klpt algorithm - * - * we test that gamma * mu is primitive in the end - * @param mu Output: a quaternion algebra element - * @param C the vector to be tested - * @param params parameters - * - */ -int condition_signing_klpt(quat_alg_elem_t *mu, const ibz_vec_2_t *C, const void* params) { - // we start by casting params to the correct type - const signing_klpt_param_t *signing_klpt_param = params; - // var dec - int found; - quat_alg_elem_t quat_temp; - quat_alg_coord_t coeffs; - ibq_t ibq_norm; - ibz_t norm,rhs; - ibz_t temp; - ibz_t a,b; - ibz_t ibz_q; - - // var init - quat_alg_elem_init(&quat_temp); - quat_alg_coord_init(&coeffs); - ibq_init(&ibq_norm); - ibz_init(&norm);ibz_init(&rhs); - ibz_init(&temp); - ibz_init(&a);ibz_init(&b); - ibz_init(&ibz_q); - found = 0; - - - // mu = j* ( C[0] + i * C[1]) - ibz_copy(&coeffs[0],&ibz_const_zero); - ibz_copy(&coeffs[1],&ibz_const_zero); - ibz_copy(&coeffs[2],&(*C)[0]); - ibz_copy(&coeffs[3],&(*C)[1]); - order_elem_create(mu,signing_klpt_param->order,&coeffs,&signing_klpt_param->Bpoo); - - - - // norm = n(mu) - quat_alg_norm(&ibq_norm,mu,&signing_klpt_param->Bpoo); - found = ibq_to_ibz(&norm,&ibq_norm); - if (!found) { - assert(found); - } - - // rhs = (target_norm - norm) / n² - ibz_sub(&rhs,&signing_klpt_param->target_norm,&norm); - ibz_mul(&temp,&signing_klpt_param->n,&signing_klpt_param->n); - ibz_div(&rhs,&temp,&rhs,&temp); - - // for debug, we check that the remainder is zero - assert(ibz_cmp(&temp,&ibz_const_zero)==0); - - found = found && ibz_cornacchia_extended(&a, &b,&rhs,SMALL_PRIMES_1MOD4,sizeof(SMALL_PRIMES_1MOD4)/sizeof(*SMALL_PRIMES_1MOD4), KLPT_primality_num_iter, &PROD_SMALL_PRIMES_3MOD4); - - if (found) { - // computing the final value of mu - // quat_temp = a + i*b - ibz_copy(&coeffs[2],&ibz_const_zero); - ibz_copy(&coeffs[3],&ibz_const_zero); - ibz_copy(&coeffs[0],&a); - ibz_copy(&coeffs[1],&b); - ibz_mul(&coeffs[0],&coeffs[0],&signing_klpt_param->n); - ibz_mul(&coeffs[1],&coeffs[1],&signing_klpt_param->n); - order_elem_create(&quat_temp,signing_klpt_param->order,&coeffs,&signing_klpt_param->Bpoo); - - ibz_sub(&temp,&signing_klpt_param->target_norm,&norm); - quat_alg_norm(&ibq_norm,&quat_temp,&signing_klpt_param->Bpoo); - assert(ibq_to_ibz(&norm,&ibq_norm)); - assert(ibz_cmp(&norm,&temp)==0); - - // mu = mu + quat_temp - quat_alg_add(mu,mu,&quat_temp); - - #ifndef NDEBUG - // for debug, we check that the norm is indeed the target norm - quat_alg_norm(&ibq_norm,mu,&signing_klpt_param->Bpoo); - assert(ibq_to_ibz(&norm,&ibq_norm)); - assert(ibz_cmp(&norm,&signing_klpt_param->target_norm)==0); - #endif - - // mu = mu / 2 - ibz_mul(&mu->denom,&mu->denom,&ibz_const_two); - // trying if mu is contained in signing_klpt_param-> order - // if not is is useless to continue - found = quat_lattice_contains(&coeffs,&signing_klpt_param->order->order,mu,&signing_klpt_param->Bpoo); - - - - if (found) { - // mu is in the extremal order, we only need to verify that gamma * mu is primitive - quat_alg_mul(&quat_temp,&signing_klpt_param->gamma,mu,&signing_klpt_param->Bpoo); - found = quat_alg_is_primitive(&quat_temp,&signing_klpt_param->order->order,&signing_klpt_param->Bpoo); - - // verifying that gamma*mu*delta will also be primitive in the right order of ideal_start - quat_alg_mul(&quat_temp,&quat_temp,&signing_klpt_param->delta,&signing_klpt_param->Bpoo); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&signing_klpt_param->equiv_n); - quat_alg_trace(&ibq_norm,&quat_temp); - if(!ibq_to_ibz(&norm,&ibq_norm)) { - assert(0); - } - found = found && ibz_get(&norm)%2 != 0; - } - } - - if (found) { - quat_alg_norm(&ibq_norm,mu,&signing_klpt_param->Bpoo); - assert(ibq_to_ibz(&norm,&ibq_norm)); - ibz_mul(&norm,&norm,&ibz_const_two); - ibz_mul(&norm,&norm,&ibz_const_two); - assert(ibz_cmp(&norm,&signing_klpt_param->target_norm)==0); - } - - // var finalize - quat_alg_elem_finalize(&quat_temp); - quat_alg_coord_finalize(&coeffs); - ibq_finalize(&ibq_norm); - ibz_finalize(&norm);ibz_finalize(&rhs); - ibz_finalize(&temp); - ibz_finalize(&a);ibz_finalize(&b); - ibz_finalize(&ibz_q); - - return found; -} - - - -/** - * @brief Deciding if a given vector is suitable for the signing klpt algorithm - * - * we test that gamma * mu is primitive in the end - * @param mu Output: a quaternion algebra element - * @param C the vector to be tested - * @param params parameters - * - */ -int condition_keygen_klpt(quat_alg_elem_t *mu, const ibz_vec_2_t *C, const void* params) { - // we start by casting params to the correct type - const signing_klpt_param_t *signing_klpt_param = params; - // var dec - int found; - quat_alg_elem_t quat_temp; - quat_alg_coord_t coeffs; - ibq_t ibq_norm; - ibz_t norm,rhs; - ibz_t temp; - ibz_t a,b; - ibz_t ibz_q; - - // var init - quat_alg_elem_init(&quat_temp); - quat_alg_coord_init(&coeffs); - ibq_init(&ibq_norm); - ibz_init(&norm);ibz_init(&rhs); - ibz_init(&temp); - ibz_init(&a);ibz_init(&b); - ibz_init(&ibz_q); - found = 0; - - - // mu = j* ( C[0] + i * C[1]) - ibz_copy(&coeffs[0],&ibz_const_zero); - ibz_copy(&coeffs[1],&ibz_const_zero); - ibz_copy(&coeffs[2],&(*C)[0]); - ibz_copy(&coeffs[3],&(*C)[1]); - order_elem_create(mu,signing_klpt_param->order,&coeffs,&signing_klpt_param->Bpoo); - - - - // norm = n(mu) - quat_alg_norm(&ibq_norm,mu,&signing_klpt_param->Bpoo); - found = ibq_to_ibz(&norm,&ibq_norm); - if (!found) { - assert(found); - } - - // rhs = (target_norm - norm) / n² - ibz_sub(&rhs,&signing_klpt_param->target_norm,&norm); - ibz_mul(&temp,&signing_klpt_param->n,&signing_klpt_param->n); - ibz_div(&rhs,&temp,&rhs,&temp); - - // for debug, we check that the remainder is zero - assert(ibz_cmp(&temp,&ibz_const_zero)==0); - - found = found && ibz_cornacchia_extended(&a, &b,&rhs,SMALL_PRIMES_1MOD4,sizeof(SMALL_PRIMES_1MOD4)/sizeof(*SMALL_PRIMES_1MOD4), KLPT_primality_num_iter, &PROD_SMALL_PRIMES_3MOD4); - - if (found) { - - // computing the final value of mu - // quat_temp = a + i*b - ibz_copy(&coeffs[2],&ibz_const_zero); - ibz_copy(&coeffs[3],&ibz_const_zero); - ibz_copy(&coeffs[0],&a); - ibz_copy(&coeffs[1],&b); - ibz_mul(&coeffs[0],&coeffs[0],&signing_klpt_param->n); - ibz_mul(&coeffs[1],&coeffs[1],&signing_klpt_param->n); - order_elem_create(&quat_temp,signing_klpt_param->order,&coeffs,&signing_klpt_param->Bpoo); - - ibz_sub(&temp,&signing_klpt_param->target_norm,&norm); - quat_alg_norm(&ibq_norm,&quat_temp,&signing_klpt_param->Bpoo); - assert(ibq_to_ibz(&norm,&ibq_norm)); - assert(ibz_cmp(&norm,&temp)==0); - - // mu = mu + quat_temp - quat_alg_add(mu,mu,&quat_temp); - - // for debug, we check that the norm is indeed the target norm - #ifndef NDEBUG - quat_alg_norm(&ibq_norm,mu,&signing_klpt_param->Bpoo); - assert(ibq_to_ibz(&norm,&ibq_norm)); - assert(ibz_cmp(&norm,&signing_klpt_param->target_norm)==0); - #endif - - // mu = mu / 2 - ibz_mul(&mu->denom,&mu->denom,&ibz_const_two); - - // trying if mu is contained in signing_klpt_param-> order - // if not is is useless to continue - found = quat_lattice_contains(&coeffs,&signing_klpt_param->order->order,mu,&signing_klpt_param->Bpoo); - - if (found) { - // mu is in the extremal order, we only need to verify that gamma * mu is primitive - quat_alg_mul(&quat_temp,&signing_klpt_param->gamma,mu,&signing_klpt_param->Bpoo); - found = quat_alg_is_primitive(&quat_temp,&signing_klpt_param->order->order,&signing_klpt_param->Bpoo); - } - - } - - - // var finalize - quat_alg_elem_finalize(&quat_temp); - quat_alg_coord_finalize(&coeffs); - ibq_finalize(&ibq_norm); - ibz_finalize(&norm);ibz_finalize(&rhs); - ibz_finalize(&temp); - ibz_finalize(&a);ibz_finalize(&b); - ibz_finalize(&ibz_q); - return found; -} - -/** - * @brief Equivalent left ideal of power of two norm - * - * @param gen Output: generator of equiv - * @param lideal left O0 ideal - * @param lideal_start left O0 ideal - * @param delta quaternion algebra element - * @param Bpoo the quaternion algebra - * - * Let J = lideal_start - * if K = intersect(lideal ,J) and I = conjugate (J) * K - * equiv_lideal is equivalent to the ideal I and we have the equality - * equiv_lideal = I * gen/Norm(lideal) of norm n = 2^KLPT_signing_klpt_length - * where conjugate(gen) lideal - * moreover we need that gen * delta is contained in the eichler order ZZ + J - * Assumes that the ideals lideal and lideal_start has a "good" norm (ie that one needs not to apply lideal_equiv) - * returns a bit indicating if the computation has succeeded - */ -int klpt_signing_klpt(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const quat_left_ideal_t *lideal_start, const quat_alg_elem_t *delta, const quat_alg_t *Bpoo) { - - // var dec - int found; - int cnt; - int e0,e1,center; - ibz_t n_gamma,temp_rand,n_prod,n_mu,s1,s2; - ibq_t ibq_n_quat_C,ibq_n_quat_C_start; - ibz_t lambda,n_quat_C,n_quat_C_start; - quat_alg_elem_t gamma,quat_one,mu; - quat_alg_elem_t quat_C,quat_C_start; - ibz_vec_2_t C,C_start; - quat_alg_coord_t coeffs; - signing_klpt_param_t param; - - // var init - found = 0; - cnt = 0; - ibz_init(&n_gamma); - ibz_init(&n_mu); - ibz_init(&temp_rand); - ibz_init(&n_prod); - ibz_init(&lambda); - ibz_init(&s1);ibz_init(&s2); - ibz_init(&n_quat_C);ibz_init(&n_quat_C_start); - ibq_init(&ibq_n_quat_C);ibq_init(&ibq_n_quat_C_start); - ibz_vec_2_init(&C); - ibz_vec_2_init(&C_start); - quat_alg_elem_init(&mu); - quat_alg_elem_init(&gamma); - quat_alg_elem_init(&quat_one); - quat_alg_elem_init(&quat_C); - quat_alg_elem_init(&quat_C_start); - quat_alg_coord_init(&coeffs); - ibz_init(¶m.n); - ibz_init(¶m.equiv_n); - ibz_init(¶m.target_norm); - quat_alg_init_set(¶m.Bpoo,&Bpoo->p); - param.order = &STANDARD_EXTREMAL_ORDER; - - // quaternion element for 1 - quat_alg_scalar(&quat_one,&ibz_const_one,&ibz_const_one); - - // initializing the center of the sample interval as log(p) - log( n(lideal) ) + KLPT_gamma_exponent_center_shift - center = ibz_bitsize(&Bpoo->p) - ibz_bitsize(&lideal->norm) + KLPT_gamma_exponent_center_shift ; - - // the main loop, iterate until a solution is found or the bound is reached - while (!found && cnt < KLPT_signing_num_gamma_trial) { - // incrementing the counter - cnt++; - // we start by choosing the exponent of gamma at random inside some interval (depending on the choice of parameters this interval might actually be of size 1) - // sampling the exponent - ibz_rand_interval_i(&temp_rand,center - KLPT_gamma_exponent_interval_size, center + KLPT_gamma_exponent_interval_size); - - // computation of the norm - ibz_pow(&n_gamma,&ibz_const_two,ibz_get(&temp_rand)); - ibz_mul(&n_gamma,&n_gamma,&lideal->norm); - - // computing the value of gamma - found = represent_integer(&gamma,&n_gamma,Bpoo); - - if (!found ) { - assert(found); - } - else { - // computing the norm of the remaining part - ibz_pow(&temp_rand,&ibz_const_two,KLPT_signing_klpt_length); - ibz_mul(&temp_rand,&lideal->norm,&temp_rand); - ibz_div(&n_mu,&temp_rand,&temp_rand,&n_gamma); - - // computing the first linear combination mod n(lideal) - - found = solve_combi_eichler(&C,&STANDARD_EXTREMAL_ORDER,&gamma,&quat_one,lideal,Bpoo,1); - if (!found) { - assert(found); - } - // computing the element quat_C = j* (C[0] + i C[1]); - ibz_copy(&coeffs[0],&ibz_const_zero); - ibz_copy(&coeffs[1],&ibz_const_zero); - ibz_copy(&coeffs[2],&C[0]); - ibz_copy(&coeffs[3],&C[1]); - order_elem_create(&quat_C,&STANDARD_EXTREMAL_ORDER,&coeffs,Bpoo); - - // computing the norm n_quat_C of quat_C - quat_alg_norm(&ibq_n_quat_C,&quat_C,Bpoo); - found = ibq_to_ibz(&n_quat_C,&ibq_n_quat_C); - if (!found) { - assert(found); - } - - // check that the quadratic reduosity condition is verified - // n_mu / n_quat_C must be square mod lideal.norm - ibz_invmod(&temp_rand,&n_quat_C,&lideal->norm); - ibz_mul(&temp_rand,&n_mu,&temp_rand); - found = ibz_sqrt_mod_p(&s1,&temp_rand,&lideal->norm); - - if (found) { - // computing the second linear combination mod n(lideal_start) - found = solve_combi_eichler(&C_start,&STANDARD_EXTREMAL_ORDER,&gamma,delta,lideal_start,Bpoo,0); - - - // computing the element quat_C = j* (C[0] + i C[1]); - ibz_copy(&coeffs[2],&C_start[0]); - ibz_copy(&coeffs[3],&C_start[1]); - order_elem_create(&quat_C_start,&STANDARD_EXTREMAL_ORDER,&coeffs,Bpoo); - - // computing the norm n_quat_C of quat_C - quat_alg_norm(&ibq_n_quat_C_start,&quat_C_start,Bpoo); - found = ibq_to_ibz(&n_quat_C_start,&ibq_n_quat_C_start); - if (!found) { - assert(found); - } - - // checking the quadratic reduosity condition - // n_mu / n_quat_C_start must be square mod lideal_start.norm - ibz_invmod(&temp_rand,&n_quat_C_start,&lideal_start->norm); - ibz_mul(&temp_rand,&n_mu,&temp_rand); - found = ibz_sqrt_mod_p(&s2,&temp_rand,&lideal_start->norm); - if (found) { - // computationn of the product - ibz_mul(&n_prod,&lideal->norm,&lideal_start->norm); - - // computation of the value of lambda - ibz_crt(&lambda,&s1,&s2,&lideal->norm,&lideal_start->norm); - - // multiply lambda by 2 and the final norm by 4 - ibz_mul(&temp_rand,&n_mu,&ibz_const_two); - ibz_mul(&n_mu,&temp_rand,&ibz_const_two); - ibz_mul(&lambda,&lambda,&ibz_const_two); - - // replace C by CRT of C and C_start - ibz_crt(&C[0],&C[0],&C_start[0],&lideal->norm,&lideal_start->norm); - ibz_crt(&C[1],&C[1],&C_start[1],&lideal->norm,&lideal_start->norm); - - // computing the element quat_C = j* (C[0] + i C[1]); - ibz_copy(&coeffs[0],&ibz_const_zero); - ibz_copy(&coeffs[1],&ibz_const_zero); - ibz_copy(&coeffs[2],&C[0]); - ibz_copy(&coeffs[3],&C[1]); - order_elem_create(&quat_C,&STANDARD_EXTREMAL_ORDER,&coeffs,Bpoo); - - // computing the norm n_quat_C of quat_C - quat_alg_norm(&ibq_n_quat_C,&quat_C,Bpoo); - found = ibq_to_ibz(&n_quat_C,&ibq_n_quat_C); - if (!found) { - assert(found); - } - - // preparation of the strong approx computation - // setting param - ibz_copy(¶m.target_norm,&n_mu); - ibz_copy(¶m.n,&n_prod); - ibz_copy(¶m.equiv_n,&lideal->norm); - param.gamma = gamma; - param.delta = *delta; - - // computing the strong approximation - found = strong_approximation(&mu,&n_mu,&STANDARD_EXTREMAL_ORDER,&C,&n_quat_C,&lambda,&n_prod,KLPT_signing_number_strong_approx,condition_signing_klpt,¶m,Bpoo); - - if (found) { - - - - - quat_alg_norm(&ibq_n_quat_C,&mu,Bpoo); - assert( ibq_to_ibz(&n_quat_C,&ibq_n_quat_C)); - ibz_mul(&n_quat_C,&n_quat_C,&ibz_const_two); - ibz_mul(&n_quat_C,&n_quat_C,&ibz_const_two); - assert(0==ibz_cmp(&n_quat_C,&n_mu)); - - // computation of the final output gen = gamma * mu - quat_alg_mul(gen,&gamma,&mu,Bpoo); - - } - - - } - } - } - - } - - // var finalize - ibz_finalize(&n_gamma); - ibz_finalize(&temp_rand); - ibz_finalize(&n_prod); - ibz_finalize(&lambda); - ibz_finalize(&s1);ibz_finalize(&s2); - ibz_finalize(&n_quat_C);ibz_finalize(&n_quat_C_start); - ibq_finalize(&ibq_n_quat_C);ibq_finalize(&ibq_n_quat_C_start); - ibz_vec_2_finalize(&C); - ibz_vec_2_finalize(&C_start); - quat_alg_elem_finalize(&gamma); - quat_alg_elem_finalize(&quat_one); - quat_alg_elem_finalize(&mu); - ibz_finalize(&n_mu); - quat_alg_elem_finalize(&quat_C); - quat_alg_elem_finalize(&quat_C_start); - quat_alg_coord_finalize(&coeffs); - ibz_finalize(¶m.target_norm); - ibz_finalize(¶m.equiv_n); - ibz_finalize(¶m.n); - quat_alg_finalize(¶m.Bpoo); - - return found; - - -} - - -/** - * @brief Equivalent left O0-ideal of power of two norm - * - * @param gen Output: generator of equiv - * @param lideal left O0 ideal - * @param delta quaternion algebra element - * @param Bpoo the quaternion algebra - * - * - * equiv_lideal is equivalent to the ideal lideal and we have the equality - * equiv_lideal = lideal * gen/Norm(lideal) of norm n = 2^KLPT_keygen_length - * where conjugate(gen) is in lideal - * Assumes that the ideals lideal has a "good" norm (ie that one needs not to apply lideal_equiv) - * returns a bit indicating if the computation has succeeded - */ -int klpt_keygen_klpt(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const quat_alg_t *Bpoo) { - // var dec - int found; - int cnt; - int e0,e1,center; - ibz_t n_gamma,temp_rand,n_prod,n_mu; - ibq_t ibq_n_quat_C; - ibz_t lambda,n_quat_C; - quat_alg_elem_t gamma,quat_one,mu; - quat_alg_elem_t quat_C; - ibz_vec_2_t C; - quat_alg_coord_t coeffs; - signing_klpt_param_t param; - - // var init - found = 0; - cnt = 0; - ibz_init(&n_gamma); - ibz_init(&n_mu); - ibz_init(&temp_rand); - ibz_init(&n_prod); - ibz_init(&lambda); - ibz_init(&n_quat_C); - ibq_init(&ibq_n_quat_C); - ibz_vec_2_init(&C); - quat_alg_elem_init(&mu); - quat_alg_elem_init(&gamma); - quat_alg_elem_init(&quat_one); - quat_alg_elem_init(&quat_C); - quat_alg_coord_init(&coeffs); - ibz_init(¶m.n); - ibz_init(¶m.target_norm); - quat_alg_init_set(¶m.Bpoo,&Bpoo->p); - param.order = &STANDARD_EXTREMAL_ORDER; - - // quaternion element for 1 - quat_alg_scalar(&quat_one,&ibz_const_one,&ibz_const_one); - - // initializing the center of the sample interval as log(p) - log( n(lideal) ) + KLPT_gamma_exponent_center_shift - center = ibz_bitsize(&Bpoo->p) - ibz_bitsize(&lideal->norm) + KLPT_gamma_exponent_center_shift; - - - // the main loop, iterate until a solution is found or the bound is reached - while (!found && cnt < KLPT_keygen_num_gamma_trial) { - // incrementing the counter - cnt++; - // we start by choosing the exponent of gamma at random inside some interval (depending on the choice of parameters this interval might actually be of size 1) - // sampling the exponent - ibz_rand_interval_i(&temp_rand,center - KLPT_gamma_exponent_interval_size, center + KLPT_gamma_exponent_interval_size); - - // computation of the norm - ibz_pow(&n_gamma,&ibz_const_two,ibz_get(&temp_rand)); - ibz_mul(&n_gamma,&n_gamma,&lideal->norm); - - // computing the value of gamma - found = represent_integer(&gamma,&n_gamma,Bpoo); - - if (found) { - // computing the norm of the remaining part - ibz_pow(&temp_rand,&ibz_const_two,KLPT_keygen_length); - ibz_mul(&temp_rand,&lideal->norm,&temp_rand); - ibz_div(&n_mu,&temp_rand,&temp_rand,&n_gamma); - - // computing the linear combination mod n(lideal) - - found = solve_combi_eichler(&C,&STANDARD_EXTREMAL_ORDER,&gamma,&quat_one,lideal,Bpoo,1); - if (!found) { - assert(found); - } - // computing the element quat_C = j* (C[0] + i C[1]); - ibz_copy(&coeffs[0],&ibz_const_zero); - ibz_copy(&coeffs[1],&ibz_const_zero); - ibz_copy(&coeffs[2],&C[0]); - ibz_copy(&coeffs[3],&C[1]); - order_elem_create(&quat_C,&STANDARD_EXTREMAL_ORDER,&coeffs,Bpoo); - - // computing the norm n_quat_C of quat_C - quat_alg_norm(&ibq_n_quat_C,&quat_C,Bpoo); - found = ibq_to_ibz(&n_quat_C,&ibq_n_quat_C); - if (!found) { - assert(found); - } - - // check that the quadratic reduosity condition is verified - // n_mu / n_quat_C must be square mod lideal.norm - ibz_invmod(&temp_rand,&n_quat_C,&lideal->norm); - ibz_mul(&temp_rand,&n_mu,&temp_rand); - found = ibz_sqrt_mod_p(&lambda,&temp_rand,&lideal->norm); - if (found) { - - - // multiply lambda by 2 and the final norm by 4 - ibz_mul(&temp_rand,&n_mu,&ibz_const_two); - ibz_mul(&n_mu,&temp_rand,&ibz_const_two); - ibz_mul(&lambda,&lambda,&ibz_const_two); - - // preparation of the strong approx computation - // setting param - ibz_copy(¶m.target_norm,&n_mu); - ibz_copy(¶m.n,&lideal->norm); - param.gamma = gamma; - - // computing the strong approximation - found = strong_approximation(&mu,&n_mu,&STANDARD_EXTREMAL_ORDER,&C,&n_quat_C,&lambda,&lideal->norm,KLPT_signing_number_strong_approx,condition_keygen_klpt,¶m,Bpoo); - - if (found) { - - quat_alg_norm(&ibq_n_quat_C,&mu,Bpoo); - assert( ibq_to_ibz(&n_quat_C,&ibq_n_quat_C)); - ibz_mul(&n_quat_C,&n_quat_C,&ibz_const_two); - ibz_mul(&n_quat_C,&n_quat_C,&ibz_const_two); - assert(0==ibz_cmp(&n_quat_C,&n_mu)); - - // computation of the final output gen = gamma * mu - quat_alg_mul(gen,&gamma,&mu,Bpoo); - } - - } - } - } - - // var finalize - ibz_finalize(&n_gamma); - ibz_finalize(&temp_rand); - ibz_finalize(&n_prod); - ibz_finalize(&lambda); - ibz_finalize(&n_quat_C); - ibq_finalize(&ibq_n_quat_C); - ibz_vec_2_finalize(&C); - quat_alg_elem_finalize(&gamma); - quat_alg_elem_finalize(&quat_one); - quat_alg_elem_finalize(&mu); - ibz_finalize(&n_mu); - quat_alg_elem_finalize(&quat_C); - quat_alg_coord_finalize(&coeffs); - - ibz_finalize(¶m.n); - ibz_finalize(¶m.target_norm); - quat_alg_finalize(¶m.Bpoo); - - return found; - -} diff --git a/src/klpt/ref/klptx/test/eichler.c b/src/klpt/ref/klptx/test/eichler.c deleted file mode 100644 index ecec659..0000000 --- a/src/klpt/ref/klptx/test/eichler.c +++ /dev/null @@ -1,335 +0,0 @@ -#include - -#include "klpt_tests.h" -#include "../eichler.c" - -int test_special_cornacchia(int index) { - int res; - ibz_t q; - ibz_t x,y,p; - ibz_init(&q); - ibz_init(&x);ibz_init(&y);ibz_init(&p); - int qq = ALTERNATE_EXTREMAL_ORDERS[index].q; - ibz_set(&q,qq); - - int exp = 128; - res = 0; - int adjust = 0; - if (qq%8 ==7) { - adjust =3; - } - else if (qq%8==3) { - adjust =2; - } - while (!res) { - generate_random_prime(&p,0,exp); - // ibz_printf("%Zd \n",p); - if (qq%4 ==3) { - res = ibz_cornacchia_special_prime(&x,&y,&q,&p,adjust); - } - else { - res= ibz_cornacchia_prime(&x,&y,&q,&p); - } - - } - - - ibz_finalize(&q); - ibz_finalize(&x);ibz_finalize(&y);ibz_finalize(&p); - return res; -} - -int klpt_test_eichler_special_norm() { - - int status; - int res; - ibz_t p,n,n_beta; - quat_alg_t Bpoo; - quat_left_ideal_t ideal; - quat_order_t right_order; - quat_alg_elem_t gen,beta,gen_constraint; - quat_alg_coord_t coeffs; - ibq_t ibq_norm; - ibz_t norm; - - ibz_init(&norm);ibq_init(&ibq_norm); - ibz_init(&p);ibz_init(&n);ibz_init(&n_beta); - ibz_copy(&p,&CHARACTERISTIC); - quat_alg_init_set(&Bpoo,&p); - quat_alg_elem_init(&gen); - quat_alg_elem_init(&beta); - quat_alg_elem_init(&gen_constraint); - quat_left_ideal_init(&ideal); - quat_alg_coord_init(&coeffs); - quat_order_init(&right_order); - - int exp = ibz_bitsize(&CHARACTERISTIC)/4; - quat_lideal_random_2e(&ideal,&STANDARD_EXTREMAL_ORDER.order,&Bpoo,exp,'6'); - quat_lideal_right_order(&right_order,&ideal,&Bpoo); - int found = 0; - while (!found) { - ibz_rand_interval_minm_m(&coeffs[0],20); - ibz_rand_interval_minm_m(&coeffs[1],20); - ibz_rand_interval_minm_m(&coeffs[2],20); - ibz_rand_interval_minm_m(&coeffs[3],20); - ibz_mat_4x4_eval(&gen_constraint.coord,&right_order.basis,&coeffs); - ibz_copy(&gen_constraint.denom,&right_order.denom); - - quat_alg_norm(&ibq_norm,&gen_constraint,&Bpoo); - status = ibq_to_ibz(&norm,&ibq_norm); - assert(status); - found = ibz_get(&norm)%4==2 && quat_alg_is_primitive(&gen_constraint,&right_order,&Bpoo); - } - - assert(quat_lattice_contains(&coeffs,&right_order,&gen_constraint,&Bpoo)); - - res = klpt_eichler_special_norm(&beta,&n_beta,&gen,&n,&ideal,&gen_constraint,&Bpoo); - assert(res); - - ibz_finalize(&norm);ibq_finalize(&ibq_norm); - ibz_finalize(&p);ibz_finalize(&n);ibz_finalize(&n_beta); - quat_alg_finalize(&Bpoo); - quat_alg_elem_finalize(&gen); - quat_alg_elem_finalize(&beta); - quat_alg_elem_finalize(&gen_constraint); - quat_left_ideal_finalize(&ideal); - quat_alg_coord_finalize(&coeffs); - quat_order_finalize(&right_order); - - return res; -} - -int klpt_test_eichler_special_norm_fixed_standard() { - - int res; - int rep_found; - int status; - ibz_t p,n,pow2,n_beta,temp; - quat_alg_elem_t gen,gen_constraint,beta; - quat_alg_t Bpoo; - quat_alg_coord_t coeffs; - quat_left_ideal_t ideal; - quat_order_t right_order; - ibq_t ibq_norm;ibz_t norm; - - ibq_init(&ibq_norm);ibz_init(&norm); - quat_alg_coord_init(&coeffs); - ibz_init(&p);ibz_init(&n);ibz_init(&pow2);ibz_init(&n_beta);ibz_init(&temp); - quat_alg_elem_init(&gen); - quat_alg_elem_init(&gen_constraint); - quat_alg_elem_init(&beta); - quat_left_ideal_init(&ideal); - quat_order_init(&right_order); - - - int exp = 128; - int margin = 20; - - res = generate_random_prime(&p,1,2*exp); - quat_alg_init_set(&Bpoo,&p); - res = generate_random_prime(&n,1,exp); - - ibz_pow(&pow2,&ibz_const_two,2*exp+margin); - - ibz_mul(&temp,&n,&pow2); - rep_found = represent_integer(&gen,&temp,&Bpoo); - while (!rep_found) { - rep_found = represent_integer(&gen,&temp,&Bpoo); - } - - quat_lideal_make_primitive_then_create(&ideal,&gen,&n,&STANDARD_EXTREMAL_ORDER.order,&Bpoo); - quat_lideal_right_order(&right_order,&ideal,&Bpoo); - - int found = 0; - while (!found) { - ibz_rand_interval_minm_m(&coeffs[0],20); - ibz_rand_interval_minm_m(&coeffs[1],20); - ibz_rand_interval_minm_m(&coeffs[2],20); - ibz_rand_interval_minm_m(&coeffs[3],20); - ibz_mat_4x4_eval(&gen_constraint.coord,&right_order.basis,&coeffs); - ibz_copy(&gen_constraint.denom,&right_order.denom); - - quat_alg_norm(&ibq_norm,&gen_constraint,&Bpoo); - status = ibq_to_ibz(&norm,&ibq_norm); - assert(status); - - found = ibz_get(&norm)%4==2; - } - assert(quat_lattice_contains(&coeffs,&right_order,&gen_constraint,&Bpoo)); - assert(quat_lattice_contains(&coeffs,&right_order,&gen,&Bpoo)); - - - res = res && eichler_special_norm_fixed(&beta,&n_beta,&STANDARD_EXTREMAL_ORDER,&gen,&n,&gen_constraint,&Bpoo); - - quat_alg_norm(&ibq_norm,&beta,&Bpoo); - assert(ibq_to_ibz(&norm,&ibq_norm)); - assert(ibz_cmp(&n_beta,&norm)==0); - - res = res && quat_lattice_contains(&coeffs,&STANDARD_EXTREMAL_ORDER.order,&beta,&Bpoo); - res = res && quat_lattice_contains(&coeffs,&right_order,&beta,&Bpoo); - - ibq_finalize(&ibq_norm); - ibz_finalize(&norm); - quat_alg_coord_finalize(&coeffs); - ibz_finalize(&p);ibz_finalize(&n);ibz_finalize(&pow2);ibz_finalize(&n_beta);ibz_finalize(&temp); - quat_alg_elem_finalize(&gen); - quat_alg_elem_finalize(&gen_constraint); - quat_alg_elem_finalize(&beta); - quat_left_ideal_finalize(&ideal); - quat_order_finalize(&right_order); - quat_alg_finalize(&Bpoo); - - return res; -} - -int klpt_test_eichler_special_norm_fixed_alternate(int index) { - - int status; - int res; - int rep_found; - ibz_t p,n,pow2,n_beta,temp; - quat_alg_elem_t gen,gen_constraint,beta; - ibz_mat_4x4_t reduced, gram; - quat_alg_t Bpoo; - quat_alg_coord_t coeffs; - quat_left_ideal_t start,equiv; - - ibq_t ibq_norm; - ibz_t norm; - ibq_init(&ibq_norm); - ibz_init(&norm); - quat_alg_coord_init(&coeffs); - ibz_init(&p);ibz_init(&n);ibz_init(&pow2);ibz_init(&n_beta);ibz_init(&temp); - quat_alg_elem_init(&gen); - quat_alg_elem_init(&gen_constraint); - quat_alg_elem_init(&beta); - quat_left_ideal_init(&start);quat_left_ideal_init(&equiv); - ibz_mat_4x4_init(&reduced); - ibz_mat_4x4_init(&gram); - int exp = 128; - int margin = 20; - - ibz_copy(&p,&CHARACTERISTIC); - quat_alg_init_set(&Bpoo,&p); - - const quat_p_extremal_maximal_order_t *order = &ALTERNATE_EXTREMAL_ORDERS[index]; - - quat_alg_norm(&ibq_norm,&order->i,&Bpoo); - - assert(ibq_to_ibz(&norm,&ibq_norm)); - assert(ibz_get(&norm)==ALTERNATE_EXTREMAL_ORDERS[index].q); - assert(quat_lattice_contains(&coeffs,&order->order,&order->i,&Bpoo)); - assert(quat_lattice_contains(&coeffs,&order->order,&order->j,&Bpoo)); - - - quat_lideal_random_2e(&start,&order->order,&Bpoo,2*exp,'8'); - int lideal_generator_ok = quat_lideal_generator(&gen,&start,&Bpoo,0); - assert(lideal_generator_ok); - - ibz_pow(&pow2,&ibz_const_two,2*exp); - quat_lideal_create_from_primitive(&start,&gen,&pow2,&order->order,&Bpoo); - - quat_lideal_reduce_basis(&reduced,&gram,&start,&Bpoo); - - - res = klpt_lideal_equiv(&gen,&n,&reduced,&gram,&start.norm,&start.lattice.denom,&Bpoo); - assert(res); - - - quat_lideal_create_from_primitive(&equiv,&gen,&n,&order->order,&Bpoo); - assert(quat_lideal_isom(&gen_constraint,&equiv,&start,&Bpoo)); - - if (order->q %4 == 3 ) { - ibz_copy(&coeffs[0],&ibz_const_one); - ibz_copy(&coeffs[1],&ibz_const_one); - ibz_copy(&coeffs[2],&ibz_const_zero); - ibz_copy(&coeffs[3],&ibz_const_zero); - order_elem_create(&beta,order,&coeffs,&Bpoo); - ibz_mul(&beta.denom,&beta.denom,&ibz_const_two); - assert(quat_lattice_contains(&coeffs,&order->order,&beta,&Bpoo)); - } - - - int found = 0; - quat_order_t right_order; - quat_order_init(&right_order); - - quat_lideal_right_order(&right_order,&equiv,&Bpoo); - while (!found) { - ibz_rand_interval_minm_m(&coeffs[0],20); - ibz_rand_interval_minm_m(&coeffs[1],20); - ibz_rand_interval_minm_m(&coeffs[2],20); - ibz_rand_interval_minm_m(&coeffs[3],20); - ibz_mat_4x4_eval(&gen_constraint.coord,&right_order.basis,&coeffs); - ibz_copy(&gen_constraint.denom,&right_order.denom); - - quat_alg_norm(&ibq_norm,&gen_constraint,&Bpoo); - status = ibq_to_ibz(&norm,&ibq_norm); - assert(status); - found = ibz_get(&norm)%4==2; - } - assert(quat_lattice_contains(&coeffs,&right_order,&gen_constraint,&Bpoo)); - assert(quat_lattice_contains(&coeffs,&right_order,&gen,&Bpoo)); - - res = res && eichler_special_norm_fixed(&beta,&n_beta,order,&gen,&n,&gen_constraint,&Bpoo); - if (!res ) { - printf("FAIL eichler norm for q = %" PRId64 " (this is expected) \n",order->q); - - } - else { - printf("SUCCESS eichler norm for q = %" PRId64 " \n",order->q); - quat_alg_norm(&ibq_norm,&beta,&Bpoo); - assert(ibq_to_ibz(&norm,&ibq_norm)); - assert(ibz_cmp(&n_beta,&norm)==0); - - res = res && quat_lattice_contains(&coeffs,&order->order,&beta,&Bpoo); - res = res && quat_lattice_contains(&coeffs,&right_order,&beta,&Bpoo); - } - - ibq_finalize(&ibq_norm); - ibz_finalize(&norm); - quat_alg_coord_finalize(&coeffs); - ibz_finalize(&p);ibz_finalize(&n);ibz_finalize(&pow2);ibz_finalize(&n_beta);ibz_finalize(&temp); - quat_alg_elem_finalize(&gen); - quat_alg_elem_finalize(&gen_constraint); - quat_alg_elem_finalize(&beta); - quat_left_ideal_finalize(&start); quat_left_ideal_finalize(&equiv); - quat_order_finalize(&right_order); - quat_alg_finalize(&Bpoo); - ibz_mat_4x4_finalize(&reduced); - ibz_mat_4x4_finalize(&gram); - return res; -} - -int klpt_test_eichler() { - int res = 1; - printf("Running klpt tests for eichler norm \n \n"); - - for (int i =0; i<3;i++) { - res = res & klpt_test_eichler_special_norm_fixed_standard(); - } - - if (!res) { - printf("KLPT unit test special eichler norm fixed for standard order failed\n \n"); - } - for (int i =0; i -#include -#include -#include -#include "../tools.h" -#include -#include - -/** @internal - * @ingroup klpt_klpt - * @defgroup klpt_tests KLPT module test functions - * @{ - */ - -/** @brief Test for the tools of the KLPT module, covers the following functions : - * - * int represent_integer(quat_alg_elem_t *gamma, ibz_t *n_gamma, const quat_alg_t *Bpoo); - * int solve_combi_eichler(ibz_vec_2_t *C, const quat_p_extremal_maximal_order_t *order, const quat_alg_elem_t *gamma, const quat_alg_elem_t *delta, const quat_left_ideal_t *lideal, const quat_alg_t *Bpoo, int is_divisible); - * int klpt_find_linear_comb(ibz_vec_2_t *C,const quat_alg_elem_t *beta, const quat_order_t *order, const ibz_t *n, const unsigned short exp, const quat_alg_elem_t *gen_start, const quat_alg_elem_t *gen_end,const quat_alg_t *Bpoo); - * - */ -int klpt_test_tools(); - -/** @brief Test for the equiv of the KLPT module, covers the following functions : - * - * int klpt_lideal_equiv(quat_alg_elem_t *gen, ibz_t *n, const quat_lattice_t *reduced, const ibz_mat_4x4_t *gram, const ibz_t *lideal_norm, const quat_alg_t *Bpoo) - * - */ -int klpt_test_equiv(); - -int klpt_test_klpt(); - -int klpt_test_eichler(); - -/** @} - */ - -#endif diff --git a/src/klpt/ref/klptx/test/test_klpt.c b/src/klpt/ref/klptx/test/test_klpt.c deleted file mode 100644 index 4ce193f..0000000 --- a/src/klpt/ref/klptx/test/test_klpt.c +++ /dev/null @@ -1,23 +0,0 @@ - -#include "klpt_tests.h" - -// run all tests in module -int main(){ - int res = 1; - - randombytes_init((unsigned char *) "some", (unsigned char *) "string", 128); - - printf("\nRunning klpt module unit tests\n \n"); - - res = res & klpt_test_tools(); - res = res & klpt_test_equiv(); - res = res & klpt_test_eichler(); - res = res & klpt_test_klpt(); - if(!res){ - printf("\nSome tests failed!\n"); - } - else { - printf("All tests passed!\n"); - } - return(!res); -} diff --git a/src/klpt/ref/klptx/test/tools.c b/src/klpt/ref/klptx/test/tools.c deleted file mode 100644 index 97bed41..0000000 --- a/src/klpt/ref/klptx/test/tools.c +++ /dev/null @@ -1,514 +0,0 @@ -#include "klpt_tests.h" - - -int kltp_test_keygen_random_ideal() { - - int res; - - ibz_t n; - quat_left_ideal_t ideal; - ibz_init(&n); - quat_left_ideal_init(&ideal); - - res = klpt_keygen_random_ideal(&ideal,&STANDARD_EXTREMAL_ORDER,&QUATALG_PINFTY); - - ibz_finalize(&n); - quat_left_ideal_finalize(&ideal); - - return res; -} - -int klpt_test_lideal_generator_coprime() { - int found = 1; - ibz_t p,temp; - ibz_t M; - quat_alg_t Bpoo; - quat_alg_elem_t gamma; - quat_left_ideal_t id,id2; - - quat_alg_elem_init(&gamma); - ibz_init(&M); - ibz_init(&p); - ibz_init(&temp); - quat_left_ideal_init(&id); - quat_left_ideal_init(&id2); - - - - int exp = 128; - found = generate_random_prime(&p,1,2*exp); - quat_alg_init_set(&Bpoo,&p); - - found = found && (generate_random_prime(&M,1,exp)); - ibz_pow(&temp,&ibz_const_two,2*exp); - ibz_mul(&temp,&M,&temp); - - found = found && represent_integer(&gamma,&temp,&Bpoo); - assert(found); - - quat_lideal_make_primitive_then_create(&id,&gamma,&M,&STANDARD_EXTREMAL_ORDER.order,&Bpoo); - - found = found && quat_lideal_generator_coprime(&gamma,&id,&ibz_const_two,&Bpoo,0); - assert(found); - - assert(quat_alg_is_primitive(&gamma,&STANDARD_EXTREMAL_ORDER.order,&Bpoo)); - - quat_lideal_make_primitive_then_create(&id2,&gamma,&M,&STANDARD_EXTREMAL_ORDER.order,&Bpoo); - - assert(quat_lideal_equals(&id,&id2,&Bpoo)); - - quat_alg_elem_finalize(&gamma); - ibz_finalize(&M); - ibz_finalize(&p); - ibz_finalize(&temp); - quat_left_ideal_finalize(&id); - quat_left_ideal_finalize(&id2); - quat_alg_finalize(&Bpoo); - return found; - -} - -int klpt_test_lideal_isom (int index) { - - int res =1 ; - ibz_t p,n; - quat_alg_elem_t gen; - quat_alg_t Bpoo; - quat_left_ideal_t ideal,equiv; - quat_order_t right_order; - ibz_mat_4x4_t gram,reduced; - ibz_mat_4x4_init(&gram); - ibz_mat_4x4_init(&reduced); - ibz_init(&p);ibz_init(&n); - ibz_copy(&p,&CHARACTERISTIC); - quat_alg_init_set(&Bpoo,&p); - quat_left_ideal_init(&ideal);quat_left_ideal_init(&equiv); - const quat_p_extremal_maximal_order_t *alternate_order = &ALTERNATE_EXTREMAL_ORDERS[index]; - quat_alg_elem_init(&gen); - - - for (int i=0; i<2;i++) { - quat_connecting_ideal(&ideal,&STANDARD_EXTREMAL_ORDER.order,&alternate_order->order,&Bpoo); - quat_lideal_reduce_basis(&reduced,&gram,&ideal,&Bpoo); - klpt_lideal_equiv(&gen,&n,&reduced,&gram,&ideal.norm,&ideal.lattice.denom,&Bpoo); - - quat_lideal_make_primitive_then_create(&equiv,&gen,&n,&STANDARD_EXTREMAL_ORDER.order,&Bpoo); - - assert(quat_lideal_isom(&gen,&ideal,&equiv,&Bpoo)); - - quat_lideal_random_2e(&ideal,&alternate_order->order,&Bpoo,128,'8'); - - quat_lideal_reduce_basis(&reduced,&gram,&ideal,&Bpoo); - klpt_lideal_equiv(&gen,&n,&reduced,&gram,&ideal.norm,&ideal.lattice.denom,&Bpoo); - - quat_lideal_make_primitive_then_create(&equiv,&gen,&n,&alternate_order->order,&Bpoo); - - assert(quat_lideal_isom(&gen,&ideal,&equiv,&Bpoo)); - } - - ibz_mat_4x4_finalize(&gram); - ibz_mat_4x4_finalize(&reduced); - ibz_finalize(&p);ibz_finalize(&n); - quat_alg_finalize(&Bpoo); - quat_left_ideal_finalize(&ideal);quat_left_ideal_finalize(&equiv); - quat_alg_elem_finalize(&gen); - - return res; - -} - -int klpt_test_connecting_ideal(int index) { - int res; - - ibz_t p; - quat_alg_t Bpoo; - quat_left_ideal_t ideal,connect; - quat_order_t right_order; - ibz_init(&p); - ibz_copy(&p,&CHARACTERISTIC); - quat_alg_init_set(&Bpoo,&p); - quat_left_ideal_init(&ideal);quat_left_ideal_init(&connect); - quat_order_init(&right_order); - const quat_p_extremal_maximal_order_t *alternate_order = &ALTERNATE_EXTREMAL_ORDERS[index]; - - quat_lideal_random_2e(&ideal,&STANDARD_EXTREMAL_ORDER.order,&Bpoo,256,'8'); - - quat_lideal_right_order(&right_order,&ideal,&Bpoo); - - quat_connecting_ideal(&connect,&STANDARD_EXTREMAL_ORDER.order,&alternate_order->order,&Bpoo); - quat_connecting_ideal(&connect,&right_order,&alternate_order->order,&Bpoo); - - ibz_finalize(&p); - quat_alg_finalize(&Bpoo); - quat_left_ideal_finalize(&ideal);quat_left_ideal_finalize(&connect); - quat_order_finalize(&right_order); - - res = 1; - return res; -} - -int klpt_test_find_linear_comb() { - int status; - int found = 0; - quat_alg_t Bpoo; - ibz_t p,M,temp,temp2; - quat_order_t right_order; - quat_alg_elem_t beta,gen_start,gen_end,quat_temp; - quat_left_ideal_t ideal_two_start, ideal_two; - quat_left_ideal_t random_ideal; - ibz_vec_2_t C; - ibz_t ibz_two_exp; - ibq_t ibq_norm; - ibz_t norm; - quat_alg_coord_t coeffs; - - quat_alg_coord_init(&coeffs); - quat_order_init(&right_order); - quat_left_ideal_init(&random_ideal); - ibq_init(&ibq_norm); - ibz_init(&norm); - ibz_init(&p); - ibz_init(&M); - ibz_init(&temp);ibz_init(&temp2); - ibz_init(&ibz_two_exp); - ibz_vec_2_init(&C); - quat_alg_elem_init(&beta);quat_alg_elem_init(&gen_start); - quat_alg_elem_init(&gen_end);quat_alg_elem_init(&quat_temp); - quat_left_ideal_init(&ideal_two_start); - quat_left_ideal_init(&ideal_two); - - int found_rep; - int exp = 128; - int margin = 30; - - found = generate_random_prime(&p,1,2*exp); - quat_alg_init_set(&Bpoo,&p); - - found = found && (generate_random_prime(&M,1,exp+margin)); - found = found && (generate_random_prime(&temp,1,exp+margin)); - assert(found); - ibz_mul(&temp,&M,&temp); - ibz_copy(&temp2,&temp); - - - found_rep = represent_integer(&beta,&temp2,&Bpoo); - while (!found_rep) { - found_rep = represent_integer(&beta,&temp2,&Bpoo); - - } - ibz_pow(&ibz_two_exp,&ibz_const_two,exp); - ibz_mul(&temp,&M,&ibz_two_exp); - ibz_copy(&temp2,&temp); - found_rep = represent_integer(&gen_start,&temp,&Bpoo); - while (!found_rep && quat_alg_is_primitive(&gen_start,&STANDARD_EXTREMAL_ORDER.order,&Bpoo)) { - found_rep = represent_integer(&gen_start,&temp2,&Bpoo); - } - quat_lideal_make_primitive_then_create(&ideal_two_start,&gen_start,&ibz_const_two,&STANDARD_EXTREMAL_ORDER.order,&Bpoo); - - quat_alg_conj(&gen_end,&beta); - quat_alg_mul(&gen_end,&gen_start,&gen_end,&Bpoo); - - - quat_lideal_make_primitive_then_create(&ideal_two,&gen_end,&ibz_const_two,&STANDARD_EXTREMAL_ORDER.order,&Bpoo); - quat_alg_norm(&ibq_norm,&beta,&Bpoo); - - status = ibq_to_ibz(&norm,&ibq_norm); - assert(status); - - while (!quat_lideal_equals(&ideal_two,&ideal_two_start,&Bpoo)) { - - found_rep = represent_integer(&beta,&norm,&Bpoo); - while (!found_rep) { - found_rep = represent_integer(&beta,&norm,&Bpoo); - } - - ibz_copy(&temp2,&temp); - found_rep = represent_integer(&gen_start,&temp2,&Bpoo); - while (!found_rep && quat_alg_is_primitive(&gen_start,&STANDARD_EXTREMAL_ORDER.order,&Bpoo)) { - found_rep = represent_integer(&gen_start,&temp2,&Bpoo); - } - // quat_alg_elem_print(&gen_start); - quat_lideal_make_primitive_then_create(&ideal_two_start,&gen_start,&ibz_const_two,&STANDARD_EXTREMAL_ORDER.order,&Bpoo); - - quat_alg_conj(&gen_end,&beta); - quat_alg_mul(&gen_end,&gen_start,&gen_end,&Bpoo); - - - quat_lideal_make_primitive_then_create(&ideal_two,&gen_end,&ibz_const_two,&STANDARD_EXTREMAL_ORDER.order,&Bpoo); - } - - quat_lideal_create_from_primitive(&random_ideal,&beta,&M,&STANDARD_EXTREMAL_ORDER.order,&Bpoo); - quat_lideal_right_order(&right_order,&random_ideal,&Bpoo); - - assert(quat_lattice_contains(&coeffs,&right_order,&beta,&Bpoo)); - - quat_lideal_random_2e(&ideal_two_start,&right_order,&Bpoo,exp,'8'); - - quat_lideal_random_2e(&ideal_two,&right_order,&Bpoo,exp,'8'); - assert(!quat_lideal_equals(&ideal_two_start,&ideal_two,&Bpoo)); - - found = found && quat_lideal_generator(&gen_start,&ideal_two_start,&Bpoo,0); - assert(found); - found = found && quat_lideal_generator(&gen_end,&ideal_two,&Bpoo,0); - assert(found); - assert(!quat_lattice_contains(&coeffs,&ideal_two.lattice,&gen_start,&Bpoo)); - - quat_alg_conj(&quat_temp,&beta); - quat_alg_mul(&quat_temp,&gen_start,&quat_temp,&Bpoo); - assert(!quat_lattice_contains(&coeffs,&ideal_two_start.lattice,&quat_temp,&Bpoo)); - - found = found && klpt_find_linear_comb(&C,&beta,&right_order,&ibz_two_exp,(unsigned short)exp,&gen_start,&gen_end,&Bpoo); - - - assert(found); - assert(ibz_get(&C[0])%2 !=0 || ibz_get(&C[1])%2 != 0); - - quat_left_ideal_t ideal_test; - quat_left_ideal_init(&ideal_test); - quat_alg_scalar(&quat_temp,&C[1],&ibz_const_one); - quat_alg_conj(&gen_end,&beta); - quat_alg_mul(&gen_end,&quat_temp,&gen_end,&Bpoo); - quat_alg_scalar(&quat_temp,&C[0],&ibz_const_one); - quat_alg_add(&gen_end,&gen_end,&quat_temp); - quat_alg_mul(&gen_end,&gen_start,&gen_end,&Bpoo); - assert(quat_lattice_contains(&coeffs,&ideal_two.lattice,&gen_end,&Bpoo)); - - quat_alg_finalize(&Bpoo); - quat_left_ideal_finalize(&ideal_test); - quat_alg_coord_finalize(&coeffs); - quat_order_finalize(&right_order); - quat_left_ideal_finalize(&random_ideal); - ibq_finalize(&ibq_norm); - ibz_finalize(&norm); - ibz_finalize(&p); - ibz_finalize(&M); - ibz_finalize(&temp);ibz_finalize(&temp2); - ibz_finalize(&ibz_two_exp); - ibz_vec_2_finalize(&C); - quat_alg_elem_finalize(&beta);quat_alg_elem_finalize(&gen_start); - quat_alg_elem_finalize(&gen_end);quat_alg_elem_finalize(&quat_temp); - quat_left_ideal_finalize(&ideal_two_start); - quat_left_ideal_finalize(&ideal_two); - - return found; -} - -int klpt_test_solve_combi_eichler() { - int found = 0; - quat_alg_t Bpoo; - ibz_t p,M,temp; - quat_alg_elem_t gamma1,gamma2,delta,quat_res; - ibz_vec_2_t C; - quat_left_ideal_t lideal; - quat_alg_coord_t t1,t2; - quat_order_t right_order; - quat_alg_elem_t shift_gamma,quat_one; - ibq_t ibq_norm;ibz_t norm; - - ibq_init(&ibq_norm); - ibz_init(&norm); - ibz_init(&p); - ibz_init(&M); - ibz_init(&temp); - quat_alg_elem_init(&gamma1); quat_alg_elem_init(&gamma2);quat_alg_elem_init(&delta);quat_alg_elem_init(&quat_res); - ibz_vec_2_init(&C); - quat_left_ideal_init(&lideal); - quat_alg_coord_init(&t1);quat_alg_coord_init(&t2); - quat_order_init(&right_order); - quat_alg_elem_init(&shift_gamma);quat_alg_elem_init(&quat_one); - - quat_alg_scalar(&quat_one,&ibz_const_one,&ibz_const_one); - - int exp = 128; - - int found_rep = 1; - - found = generate_random_prime(&p,1,2*exp); - quat_alg_init_set(&Bpoo,&p); - - found_rep = (generate_random_prime(&M,1,exp)); - found_rep = (generate_random_prime(&temp,1,exp+100)); - ibz_mul(&temp,&M,&temp); - found = found && represent_integer(&gamma1,&temp,&Bpoo); - ibz_pow(&temp,&ibz_const_two,exp+100); - ibz_mul(&temp,&M,&temp); - found_rep = represent_integer(&gamma2,&temp,&Bpoo); - while (!found_rep) { - found_rep = represent_integer(&gamma2,&temp,&Bpoo); - } - - ibz_pow(&temp,&ibz_const_two,3*exp); - - found_rep = represent_integer(&shift_gamma,&temp,&Bpoo); - while (!found_rep) { - represent_integer(&shift_gamma,&temp,&Bpoo); - } - found_rep = represent_integer(&delta,&temp,&Bpoo); - while (!found_rep) { - found_rep = represent_integer(&delta,&temp,&Bpoo); - } - - quat_lideal_make_primitive_then_create(&lideal,&gamma1,&M,&STANDARD_EXTREMAL_ORDER.order,&Bpoo); - - found = found && (ibz_cmp(&M,&lideal.norm)==0); - - quat_lideal_right_order(&right_order,&lideal,&Bpoo); - - found = found && solve_combi_eichler(&C,&STANDARD_EXTREMAL_ORDER,&shift_gamma,&delta,&lideal,&Bpoo,0); - if (!found) { - printf("eichler solve failed \n"); - } - ibz_copy(&t1[0],&ibz_const_zero);ibz_copy(&t1[1],&ibz_const_zero); - ibz_copy(&t1[2],&C[0]);ibz_copy(&t1[3],&C[1]); - - order_elem_create(&quat_res,&STANDARD_EXTREMAL_ORDER,&t1,&Bpoo); - quat_alg_mul(&quat_res,&shift_gamma,&quat_res,&Bpoo); - quat_alg_mul(&quat_res,&quat_res,&delta,&Bpoo); - - found = found && quat_lattice_contains(&t2,&right_order,&quat_res,&Bpoo); - if (!found) { - printf("the solution is not in the eichler order \n"); - } - found = found && !quat_lattice_contains(&t2,&lideal.lattice,&quat_res,&Bpoo); - if (!found) { - printf("the solution is in the lattice \n"); - } - - - found = found && solve_combi_eichler(&C,&STANDARD_EXTREMAL_ORDER,&gamma2,&quat_one,&lideal,&Bpoo,1); - if (!found ){ - printf("the second solve combi failed \n"); - } - - ibz_copy(&t1[2],&C[0]);ibz_copy(&t1[3],&C[1]); - - order_elem_create(&quat_res,&STANDARD_EXTREMAL_ORDER,&t1,&Bpoo); - quat_alg_mul(&quat_res,&gamma2,&quat_res,&Bpoo); - quat_alg_mul(&quat_res,&quat_res,&quat_one,&Bpoo); - - - found = found && quat_lattice_contains(&t2,&lideal.lattice,&quat_res,&Bpoo); - - ibq_finalize(&ibq_norm); - ibz_finalize(&norm); - ibz_finalize(&p); - ibz_finalize(&M); - ibz_finalize(&temp); - quat_alg_elem_finalize(&gamma1); quat_alg_elem_finalize(&gamma2);quat_alg_elem_finalize(&delta);quat_alg_elem_finalize(&quat_res); - ibz_vec_2_finalize(&C); - quat_left_ideal_finalize(&lideal); - quat_alg_coord_finalize(&t1);quat_alg_coord_finalize(&t2); - quat_order_finalize(&right_order); - quat_alg_elem_finalize(&shift_gamma);quat_alg_elem_finalize(&quat_one); - quat_alg_finalize(&Bpoo); - - - return found; -} - -int klpt_test_represent_integer() { - int found = 0; - ibz_t p,temp; - ibz_t M,M_begin; - quat_alg_t Bpoo; - quat_alg_elem_t gamma; - - quat_alg_elem_init(&gamma); - ibz_init(&M);ibz_init(&M_begin); - ibz_init(&p); - ibz_init(&temp); - - - int exp = 128; - found = generate_random_prime(&p,1,2*exp); - quat_alg_init_set(&Bpoo,&p); - - found = found && (generate_random_prime(&M,1,exp)); - ibz_pow(&temp,&ibz_const_two,exp+15); - ibz_mul(&M,&M,&temp); - ibz_copy(&M_begin,&M); - - - - found = found && represent_integer(&gamma,&M,&Bpoo); - if (!found) { - printf("repesent integer did not find anything \n"); - } - - ibq_t norm; - ibq_init(&norm); - ibz_t ibz_norm; - ibz_init(&ibz_norm); - quat_alg_norm(&norm,&gamma,&Bpoo); - - - found = found && ibq_to_ibz(&ibz_norm,&norm); - - found = found && (ibz_cmp(&ibz_norm,&M)==0); - if (! found ){ - ibz_printf("unequality of norm \n %Zd \n %Zd \n",ibz_norm,M); - } - - ibz_t remainder; - ibz_init(&remainder); - ibz_div(&temp,&remainder,&M_begin,&M); - - found = found && (ibz_cmp(&remainder,&ibz_const_zero)==0); - - quat_alg_elem_finalize(&gamma); - ibz_finalize(&M); - quat_alg_finalize(&Bpoo); - ibz_finalize(&p); - ibz_finalize(&temp); - ibz_finalize(&M_begin); - ibz_finalize(&remainder); - ibq_finalize(&norm); - ibz_finalize(&ibz_norm); - return found; -} - -int klpt_test_tools() { - - int res = 1; - res =kltp_test_keygen_random_ideal(); - assert(res); - for (int i =0; i<2;i++) { - res= res && klpt_test_lideal_generator_coprime(); - } - assert(res); - for (int i =0; i<2;i++) { - res= res && klpt_test_lideal_isom(i); - } - assert(res); - for (int i =0; i<2;i++) { - res= res && klpt_test_connecting_ideal(i); - } - assert(res); - - printf("Running klpt tests for represent integer \n \n"); - - for (int i =0; i<3;i++) { - res= res && klpt_test_represent_integer(); - } - if (!res) { - printf("KLPT unit test represent_integer failed\n"); - } - printf("Running klpt tests for solve combi eichler \n \n"); - - for (int i =0; i<3;i++) { - res= res && klpt_test_solve_combi_eichler(); - } - if (!res) { - printf("KLPT unit test solve_combi_eichler failed\n"); - } - - printf("Running klpt tests for finding linear combination \n \n"); - - for (int i =0; i<3;i++) { - res= res && klpt_test_find_linear_comb(); - } - if (!res) { - printf("KLPT unit test find_linear_comb failed\n"); - } - return res; -} diff --git a/src/klpt/ref/klptx/tools.c b/src/klpt/ref/klptx/tools.c deleted file mode 100644 index 96ca031..0000000 --- a/src/klpt/ref/klptx/tools.c +++ /dev/null @@ -1,730 +0,0 @@ -#include -#include -#include "tools.h" - - - -/** @file - * - * @authors Antonin Leroux - * - * @brief the eichler norm equation implementation - */ - - -void quat_alg_elem_copy(quat_alg_elem_t *copy,const quat_alg_elem_t *copied) { - ibz_copy(©->denom,&copied->denom); - ibz_copy(©->coord[0],&copied->coord[0]); - ibz_copy(©->coord[1],&copied->coord[1]); - ibz_copy(©->coord[2],&copied->coord[2]); - ibz_copy(©->coord[3],&copied->coord[3]); -} -void quat_left_ideal_copy(quat_left_ideal_t *copy,const quat_left_ideal_t *copied) { - copy->parent_order = copied->parent_order; - ibz_copy(©->norm,&copied->norm); - ibz_copy(©->lattice.denom,&copied->lattice.denom); - for (int i=0;i<4;i++) { - for (int j=0;j<4;j++) { - ibz_copy(©->lattice.basis[i][j],&copied->lattice.basis[i][j]); - } - } -} - - -/** - * @brief Create an element of a extremal maximal order from its coefficients - * - * @param elem Output: the quaternion element - * @param order the order - * @param coeffs the vector of 4 ibz coefficients - * @param Bpoo quaternion algebra - * - * elem = x + i*y + j*z + j*i*t - * where coeffs = [x,y,z,t] and i = order.i, j = order.j - * - */ -void order_elem_create(quat_alg_elem_t *elem, const quat_p_extremal_maximal_order_t *order, const quat_alg_coord_t *coeffs, const quat_alg_t *Bpoo) { - - // var dec - quat_alg_elem_t quat_temp; - - // var init - quat_alg_elem_init(&quat_temp); - - // elem = x - quat_alg_scalar(elem,&(*coeffs)[0],&ibz_const_one); - - // quat_temp = i*y - quat_alg_scalar(&quat_temp,&((*coeffs)[1]),&ibz_const_one); - quat_alg_mul(&quat_temp,&order->i,&quat_temp,Bpoo); - - // elem = x + i*y - quat_alg_add(elem,elem,&quat_temp); - - // quat_temp = z * j - quat_alg_scalar(&quat_temp,&(*coeffs)[2],&ibz_const_one); - quat_alg_mul(&quat_temp,&order->j,&quat_temp,Bpoo); - - // elem = x + i* + z*j - quat_alg_add(elem,elem,&quat_temp); - - // quat_temp = t * j * i - quat_alg_scalar(&quat_temp,&(*coeffs)[3],&ibz_const_one); - quat_alg_mul(&quat_temp,&order->j,&quat_temp,Bpoo); - quat_alg_mul(&quat_temp,&quat_temp,&order->i,Bpoo); - - // elem = x + i*y + j*z + j*i*t - quat_alg_add(elem,elem,&quat_temp); - - quat_alg_elem_finalize(&quat_temp); -} - -/** - * @brief Finding the good linear combination - * - * @param C Output: the linear combination - * @param beta the endomorphism - * @param order the order - * @param n the norm - * @param e the exponent - * @param gen_start element of order, generate a left O-ideal of norm n = 2^exp - * @param gen_end element of order, generate a left O-ideal of norm n = 2^exp - * @param Bpoo quaternion algebra - * - * lideal_start = order < gen_start,n> - * lideal_end = order < gen_end,n> - * This algorithm finds two integers C[1], C[2] such that the pushforward of the ideal lideal_start by the endomorphism C[1] + C[2] beta is equal to lideal_end - * beta is an endomorphism of order, it has been chosen to ensure that a solution exists - * Returns a bit indicating if the computation succeeded - */ -int klpt_find_linear_comb(ibz_vec_2_t *C,const quat_alg_elem_t *beta, const quat_order_t *order, const ibz_t *n, const unsigned short exp, const quat_alg_elem_t *gen_start, const quat_alg_elem_t *gen_end,const quat_alg_t *Bpoo) { - - // var dec - int found; - quat_left_ideal_t lideal_end; - quat_alg_elem_t temp,gamma,bas2,bas3; - quat_alg_coord_t v0,v1,v2,v3; - ibz_mat_4x4_t system; - - // var init - found = 0; - quat_alg_coord_init(&v1);quat_alg_coord_init(&v0); - quat_alg_coord_init(&v2);quat_alg_coord_init(&v3); - quat_alg_elem_init(&gamma); - quat_alg_elem_init(&temp); - quat_alg_elem_init(&bas2); - quat_alg_elem_init(&bas3); - quat_left_ideal_init(&lideal_end); - ibz_mat_4x4_init(&system); - - assert(quat_lattice_contains(&v0,order,gen_end,Bpoo)); - - //computing lideal_start from gen_start - quat_lideal_create_from_primitive(&lideal_end,gen_end,n,order,Bpoo); - - - // compute gamma = gen_start * \overline { beta } - quat_alg_conj(&temp,beta); - quat_alg_mul(&gamma,gen_start,&temp,Bpoo); - quat_alg_normalize(&gamma); - - - // computing the system to solve - // possibly solving the system over the basis of Bpoo should be enough ?? (up to rescaling to allow for integer solutions) - - // converting the basis in actual quaternion element bas2,bas3 - ibz_copy(&bas2.denom,&lideal_end.lattice.denom); - ibz_copy(&bas3.denom,&lideal_end.lattice.denom); - ibz_copy(&bas2.coord[0],&lideal_end.lattice.basis[0][2]); - ibz_copy(&bas2.coord[1],&lideal_end.lattice.basis[1][2]); - ibz_copy(&bas2.coord[2],&lideal_end.lattice.basis[2][2]); - ibz_copy(&bas2.coord[3],&lideal_end.lattice.basis[3][2]); - ibz_copy(&bas3.coord[0],&lideal_end.lattice.basis[0][3]); - ibz_copy(&bas3.coord[1],&lideal_end.lattice.basis[1][3]); - ibz_copy(&bas3.coord[2],&lideal_end.lattice.basis[2][3]); - ibz_copy(&bas3.coord[3],&lideal_end.lattice.basis[3][3]); - - - - // setting the four vectors needed for the system - found = quat_lattice_contains(&v0,order,gen_start,Bpoo); - assert(found); - found = found && quat_lattice_contains(&v1,order,&gamma,Bpoo); - assert(found); - found = found && quat_lattice_contains(&v2,order,&bas2,Bpoo); - assert(found); - found = found && quat_lattice_contains(&v3,order,&bas3,Bpoo); - assert(found); - - // creation of the actual system - ibz_copy(&system[0][0],&v0[0]); - ibz_copy(&system[0][1],&v1[0]); - ibz_copy(&system[0][2],&v2[0]); - ibz_copy(&system[0][3],&v3[0]); - ibz_copy(&system[1][0],&v0[1]); - ibz_copy(&system[1][1],&v1[1]); - ibz_copy(&system[1][2],&v2[1]); - ibz_copy(&system[1][3],&v3[1]); - ibz_copy(&system[2][0],&v0[2]); - ibz_copy(&system[2][1],&v1[2]); - ibz_copy(&system[2][2],&v2[2]); - ibz_copy(&system[2][3],&v3[2]); - ibz_copy(&system[3][0],&v0[3]); - ibz_copy(&system[3][1],&v1[3]); - ibz_copy(&system[3][2],&v2[3]); - ibz_copy(&system[3][3],&v3[3]); - // ibz_copy(&system[0][0],&gen_start->coord[0]); - // ibz_copy(&system[0][1],&gamma.coord[0]); - // ibz_copy(&system[0][2],&bas2.coord[0]); - // ibz_copy(&system[0][3],&bas3.coord[0]); - // ibz_copy(&system[1][0],&gen_start->coord[1]); - // ibz_copy(&system[1][1],&gamma.coord[1]); - // ibz_copy(&system[1][2],&bas2.coord[1]); - // ibz_copy(&system[1][3],&bas3.coord[1]); - // ibz_copy(&system[2][0],&gen_start->coord[2]); - // ibz_copy(&system[2][1],&gamma.coord[2]); - // ibz_copy(&system[2][2],&bas2.coord[2]); - // ibz_copy(&system[2][3],&bas3.coord[2]); - // ibz_copy(&system[3][0],&gen_start->coord[3]); - // ibz_copy(&system[3][1],&gamma.coord[3]); - // ibz_copy(&system[3][2],&bas2.coord[3]); - // ibz_copy(&system[3][3],&bas3.coord[3]); - - // finding the kernel of the system - found = ibz_4x4_right_ker_mod_power_of_2(&v0,&system,exp); - - // computation of the result - ibz_copy(&(*C)[0],&v0[0]); - ibz_copy(&(*C)[1],&v0[1]); - // var fin - quat_alg_coord_finalize(&v1);quat_alg_coord_finalize(&v0); - quat_alg_coord_finalize(&v2);quat_alg_coord_finalize(&v3); - quat_alg_elem_finalize(&gamma); - quat_alg_elem_finalize(&temp); - quat_alg_elem_finalize(&bas2); - quat_alg_elem_finalize(&bas3); - quat_left_ideal_finalize(&lideal_end); - ibz_mat_4x4_finalize(&system); - - return found; -} - -/** - * @brief Finding the good linear span(j,i*j) combination - * - * @param C Output: two integers modulo n - * @param order special extremal order - * @param delta quaternion element - * @param gamma quaternion element - * @param lideal generator of left order ideal - * @param Bpoo quaternion algebra - * @param is_divisible intean indicating if Norm(gamma) is divisible by n - * - * This algorithm finds two integers C[0], C[1] such that gamma * j * (C[0] + i C[1]]) * delta is in the eichler order ZZ + lideal - * if gamma have norm divisible by n(lideal) (indicated by the intean is_divisible), then the result will be contained in J - * Failure should not be possible - * Assumes n is prime ! - */ -int solve_combi_eichler(ibz_vec_2_t *C, const quat_p_extremal_maximal_order_t *order, const quat_alg_elem_t *gamma, const quat_alg_elem_t *delta, const quat_left_ideal_t *lideal, const quat_alg_t *Bpoo, int is_divisible){ - - - //var dec - int found; - quat_alg_elem_t gamma_delta, gamma_j,gamma_j_delta,gamma_ji_delta,denom1,denom2,denom3,bas2,bas3; - - //var init - found = 0; - quat_alg_elem_init(&gamma_j); - quat_alg_elem_init(&gamma_delta); - quat_alg_elem_init(&gamma_j_delta); - quat_alg_elem_init(&gamma_ji_delta); - quat_alg_elem_init(&denom1); - quat_alg_elem_init(&denom2); - quat_alg_elem_init(&denom3); - quat_alg_elem_init(&bas3); - quat_alg_elem_init(&bas2); - - // computation of the system to solve - - //computation of the algebra elements we need - // we multiply everything by gamma and delta - quat_alg_mul(&gamma_j,gamma,&order->j,Bpoo); - quat_alg_mul(&gamma_ji_delta,&gamma_j,&order->i,Bpoo); - quat_alg_mul(&gamma_j_delta,&gamma_j,delta,Bpoo); - quat_alg_mul(&gamma_ji_delta,&gamma_ji_delta,delta,Bpoo); - quat_alg_normalize(&gamma_ji_delta); - quat_alg_normalize(&gamma_j_delta); - - // we create the two elements that are interesting to us - ibz_copy(&bas2.denom,&ibz_const_one); - ibz_copy(&bas3.denom,&ibz_const_one); - ibz_copy(&bas2.coord[0],&lideal->lattice.basis[0][2]); - ibz_copy(&bas2.coord[1],&lideal->lattice.basis[1][2]); - ibz_copy(&bas2.coord[2],&lideal->lattice.basis[2][2]); - ibz_copy(&bas2.coord[3],&lideal->lattice.basis[3][2]); - ibz_copy(&bas3.coord[0],&lideal->lattice.basis[0][3]); - ibz_copy(&bas3.coord[1],&lideal->lattice.basis[1][3]); - ibz_copy(&bas3.coord[2],&lideal->lattice.basis[2][3]); - ibz_copy(&bas3.coord[3],&lideal->lattice.basis[3][3]); - - // we compute the denominators - quat_alg_scalar(&denom1,&gamma_ji_delta.denom,&ibz_const_one); - quat_alg_scalar(&denom2,&lideal->lattice.denom,&ibz_const_one); - quat_alg_scalar(&denom3,&gamma_j_delta.denom,&ibz_const_one); - - // performing the necessary multiplication by crossed denom - quat_alg_mul(&gamma_j_delta,&gamma_j_delta,&denom2,Bpoo); quat_alg_mul(&gamma_j_delta,&gamma_j_delta,&denom1,Bpoo); - quat_alg_mul(&gamma_ji_delta,&gamma_ji_delta,&denom2,Bpoo);quat_alg_mul(&gamma_ji_delta,&gamma_ji_delta,&denom3,Bpoo); - quat_alg_mul(&bas2,&bas2,&denom1,Bpoo);quat_alg_mul(&bas2,&bas2,&denom3,Bpoo); - quat_alg_mul(&bas3,&bas3,&denom1,Bpoo);quat_alg_mul(&bas3,&bas3,&denom3,Bpoo); - - if (is_divisible) { - // declaration and init of the system and kernel - ibz_mat_4x4_t system; - ibz_mat_4x4_init(&system); - quat_alg_coord_t ker; - quat_alg_coord_init(&ker); - - // we fill the system - ibz_copy(&system[0][0],&gamma_j_delta.coord[0]); - ibz_copy(&system[0][1],&gamma_ji_delta.coord[0]); - ibz_copy(&system[0][2],&bas2.coord[0]); - ibz_copy(&system[0][3],&bas3.coord[0]); - ibz_copy(&system[1][0],&gamma_j_delta.coord[1]); - ibz_copy(&system[1][1],&gamma_ji_delta.coord[1]); - ibz_copy(&system[1][2],&bas2.coord[1]); - ibz_copy(&system[1][3],&bas3.coord[1]); - ibz_copy(&system[2][0],&gamma_j_delta.coord[2]); - ibz_copy(&system[2][1],&gamma_ji_delta.coord[2]); - ibz_copy(&system[2][2],&bas2.coord[2]); - ibz_copy(&system[2][3],&bas3.coord[2]); - ibz_copy(&system[3][0],&gamma_j_delta.coord[3]); - ibz_copy(&system[3][1],&gamma_ji_delta.coord[3]); - ibz_copy(&system[3][2],&bas2.coord[3]); - ibz_copy(&system[3][3],&bas3.coord[3]); - - // ibz_mat_4x4_print(&system); - - // resolution of the system - found = ibz_4x4_right_ker_mod_prime(&ker,&system,&lideal->norm); - assert(found); - - // computation of the result - ibz_copy(&(*C)[0],&ker[0]); - ibz_copy(&(*C)[1],&ker[1]); - - // finalization of the kernel and system - ibz_mat_4x4_finalize(&system); - quat_alg_coord_finalize(&ker); - - } - else { - // somme missing operations - // gamma_delta = 1 - quat_alg_scalar(&gamma_delta,&ibz_const_one,&ibz_const_one); - - // multiply by the denom - quat_alg_mul(&gamma_delta,&gamma_delta,&denom1,Bpoo); - quat_alg_mul(&gamma_delta,&gamma_delta,&denom2,Bpoo); - quat_alg_mul(&gamma_delta,&gamma_delta,&denom3,Bpoo); - - // declaration and init of the system and - ibz_mat_4x5_t system; - ibz_mat_4x5_init(&system); - ibz_vec_5_t ker; - ibz_vec_5_init(&ker); - - // we fill the system - ibz_copy(&system[0][0],&gamma_j_delta.coord[0]); - ibz_copy(&system[0][1],&gamma_ji_delta.coord[0]); - ibz_copy(&system[0][2],&gamma_delta.coord[0]); - ibz_copy(&system[0][3],&bas2.coord[0]); - ibz_copy(&system[0][4],&bas3.coord[0]); - ibz_copy(&system[1][0],&gamma_j_delta.coord[1]); - ibz_copy(&system[1][1],&gamma_ji_delta.coord[1]); - ibz_copy(&system[1][2],&gamma_delta.coord[1]); - ibz_copy(&system[1][3],&bas2.coord[1]); - ibz_copy(&system[1][4],&bas3.coord[1]); - ibz_copy(&system[2][0],&gamma_j_delta.coord[2]); - ibz_copy(&system[2][1],&gamma_ji_delta.coord[2]); - ibz_copy(&system[2][2],&gamma_delta.coord[2]); - ibz_copy(&system[2][3],&bas2.coord[2]); - ibz_copy(&system[2][4],&bas3.coord[2]); - ibz_copy(&system[3][0],&gamma_j_delta.coord[3]); - ibz_copy(&system[3][1],&gamma_ji_delta.coord[3]); - ibz_copy(&system[3][2],&gamma_delta.coord[3]); - ibz_copy(&system[3][3],&bas2.coord[3]); - ibz_copy(&system[3][4],&bas3.coord[3]); - - // resolution of the system - found = ibz_4x5_right_ker_mod_prime(&ker,&system,&lideal->norm); - assert(found); - // computation of the result - ibz_copy(&(*C)[0],&ker[0]); - ibz_copy(&(*C)[1],&ker[1]); - - // finalization of the kernel and system - ibz_mat_4x5_finalize(&system); - ibz_vec_5_finalize(&ker); - - - } - - // var finalize - quat_alg_elem_finalize(&gamma_j); - quat_alg_elem_finalize(&gamma_delta); - quat_alg_elem_finalize(&gamma_j_delta); - quat_alg_elem_finalize(&gamma_ji_delta); - quat_alg_elem_finalize(&denom1); - quat_alg_elem_finalize(&denom2); - quat_alg_elem_finalize(&denom3); - quat_alg_elem_finalize(&bas3); - quat_alg_elem_finalize(&bas2); - return found; - -} - - -/** - * @brief Representing an integer by the quadratic norm form of a maximal extremal order - * - * @param gamma Output: a quaternion element - * @param n_gamma Outut: norm of gamma (also part of the input, it is the target norm a multiple of the final norm) - * @param Bpoo the quaternion algebra - * @return 1 if the computation succeeded - * - * This algorithm finds a primitive quaternion element gamma of n_gamma inside the standard maximal extremal order - */ -int represent_integer(quat_alg_elem_t *gamma, ibz_t *n_gamma, const quat_alg_t *Bpoo){ - - // var dec - int found; - int cnt; - ibz_t cornacchia_target; - ibz_t adjusted_n_gamma; - ibz_t bound,sq_bound,temp; - quat_alg_coord_t coeffs; // coeffs = [x,y,z,t] - quat_alg_elem_t quat_temp; - int prime_list_length;short prime_list[1]; ibz_t prod_bad_primes; // TODO adapt - prime_list[0] = 5; prime_list_length = 1; - ibz_init(&prod_bad_primes);ibz_copy(&prod_bad_primes,&ibz_const_one); - - - // var init - found = 0; - cnt = 0; - ibz_init(&bound);ibz_init(&temp);ibz_init(&sq_bound); - quat_alg_coord_init(&coeffs); - quat_alg_elem_init(&quat_temp); - ibz_init(&adjusted_n_gamma); - ibz_init(&cornacchia_target); - - //adjusting the norm of gamma (multiplied by 4 to find a solution in the full maximal order) - ibz_mul(&adjusted_n_gamma,n_gamma,&ibz_const_two); - ibz_mul(&adjusted_n_gamma,&adjusted_n_gamma,&ibz_const_two); - - // computation of the first bound = sqrt (adjust_n_gamma / p ) - ibz_div(&sq_bound,&bound,&adjusted_n_gamma,&Bpoo->p); - ibz_sqrt_floor(&bound,&sq_bound); - // entering the main loop - while (!found && cnt < KLPT_repres_num_gamma_trial) { - cnt ++; - // we start by sampling the first coordinate - ibz_rand_interval(&coeffs[2],&ibz_const_one,&bound); - // then, we sample the second coordinate - // computing the second bound in temp as sqrt( (adjust_n_gamma - coeffs[2]²)/p ) - ibz_mul(&cornacchia_target,&coeffs[2],&coeffs[2]); - ibz_sub(&temp,&sq_bound,&cornacchia_target); - ibz_sqrt_floor(&temp,&temp); - - if (ibz_cmp(&temp,&ibz_const_zero) ==0) { - continue; - } - // sampling the second value - ibz_rand_interval(&coeffs[3],&ibz_const_one,&temp); - - // compute cornacchia_target = n_gamma - p * (z² + t²) - ibz_mul(&temp,&coeffs[3],&coeffs[3]); - ibz_add(&cornacchia_target,&cornacchia_target,&temp); - ibz_mul(&cornacchia_target,&cornacchia_target,&Bpoo->p); - ibz_sub(&cornacchia_target,&adjusted_n_gamma,&cornacchia_target); - // applying cornacchia extended - - found = ibz_cornacchia_extended(&coeffs[0],&coeffs[1],&cornacchia_target,prime_list,prime_list_length, KLPT_primality_num_iter, &prod_bad_primes); - - // check that we can divide by two at least once - // we must have x = t mod 2 and y = z mod 2 - found = found && (ibz_get(&coeffs[0])%2 == ibz_get(&coeffs[3])%2) && (ibz_get(&coeffs[1])%2 == ibz_get(&coeffs[2])%2); - - } - if (found) { - // translate x,y,z,t into the quaternion element gamma - order_elem_create(gamma,&STANDARD_EXTREMAL_ORDER,&coeffs,Bpoo); - // making gamma primitive - // coeffs contains the coefficients of primitivized gamma in the basis of order - quat_alg_make_primitive(&coeffs,&temp,gamma,&STANDARD_EXTREMAL_ORDER.order,Bpoo); - - // new gamma - ibz_mat_4x4_eval(&coeffs,&STANDARD_EXTREMAL_ORDER.order.basis,&coeffs); - ibz_copy(&gamma->coord[0],&coeffs[0]); - ibz_copy(&gamma->coord[1],&coeffs[1]); - ibz_copy(&gamma->coord[2],&coeffs[2]); - ibz_copy(&gamma->coord[3],&coeffs[3]); - ibz_copy(&gamma->denom,&STANDARD_EXTREMAL_ORDER.order.denom); - - // adjust the norm of gamma by dividing by the scalar temp² - ibz_mul(&temp,&temp,&temp); - ibz_div(n_gamma,&bound,&adjusted_n_gamma,&temp); - - } - // var finalize - ibz_finalize(&bound);ibz_finalize(&temp);ibz_finalize(&sq_bound); - quat_alg_coord_finalize(&coeffs); - quat_alg_elem_finalize(&quat_temp); - ibz_finalize(&adjusted_n_gamma); - ibz_finalize(&cornacchia_target); - ibz_finalize(&prod_bad_primes); - - return found; -} - -/** - * @brief Computing the strong approximation - * - * @param mu Output: a quaternion element - * @param n_mu 4 times target norm of mu - * @param order special extremal order - * @param C coefficients to be lifted - * @param n_quat_C norm of the quaternion element corresponding to C - * @param lambda an integer used in the computation - * @param n modulo for the lift - * @param max_tries int, bound on the number of tries before we abort - * @param condition a filter function returning whether a vector should be output or not - * @param params extra parameters passed to `condition`. May be NULL. - * @param Bpoo the quaternion algebra - * - * This algorithm finds a quaternion element mu of norm equal to n_mu/4 such that - * mu = lambda* (C[0] + i * C[1])*j mod ( n * order) - * the value of lambda has been computed in a way to make this computation possible - * the value of mu is computed by the function condition (which depends on some additional params) and must satisfy a set of constraints defined by condition - * the number of trials is max_tries - * Assumes n is either a prime or a product of big prime ! this means the probability to encounter non-invertible elements is considered negligible - */ -int strong_approximation(quat_alg_elem_t *mu, const ibz_t *n_mu, const quat_p_extremal_maximal_order_t *order, const ibz_vec_2_t *C, const ibz_t *n_quat_C, const ibz_t *lambda, const ibz_t *n, int max_tries, -int (*condition)(quat_alg_elem_t*, const ibz_vec_2_t*, const void*), const void *params, const quat_alg_t *Bpoo) { - - // var dec - ibz_t ibz_q; - ibz_t p_lambda_2; - ibz_t coeff_c0,coeff_c1; - ibz_t cst_term,temp; - ibz_t bound; - ibz_mat_2x2_t lat; - ibz_vec_2_t target; - int found; - - // var init - ibz_init(&ibz_q); ibz_init(&temp);ibz_init(&bound); - ibz_init(&p_lambda_2); - ibz_init(&coeff_c0);ibz_init(&coeff_c1); - ibz_init(&cst_term); - ibz_mat_2x2_init(&lat); - ibz_vec_2_init(&target); - - // computation of various ibz - ibz_set(&ibz_q,order->q); - - // p_lambda_2 = p * lambda * 2 - ibz_mul(&p_lambda_2,lambda,&Bpoo->p); - ibz_mul(&p_lambda_2,&p_lambda_2,&ibz_const_two); - - //coeff_c0 = p_lambda_2 * C[0] - ibz_mul(&coeff_c0,&p_lambda_2,&(*C)[0]); - ibz_mod(&coeff_c0,&coeff_c0,n); - //coeff_c1 = 1/(q * p_lambda_2 * C[1]) mod n - ibz_mul(&coeff_c1,&p_lambda_2,&(*C)[1]); - ibz_mul(&coeff_c1,&coeff_c1,&ibz_q); - ibz_mod(&coeff_c1,&coeff_c1,n); - ibz_invmod(&coeff_c1,&coeff_c1,n); - - - // cst_term = (n_mu-lambda^2 * n_quat_c)/n - ibz_mul(&temp,lambda,lambda); - ibz_mul(&temp,&temp,n_quat_C); - ibz_sub(&temp,n_mu,&temp); - ibz_div(&cst_term,&temp,&temp,n); - ibz_mod(&cst_term,&cst_term,n); - - // for debug check that the remainder is zero - assert(ibz_cmp(&temp,&ibz_const_zero)==0); - - // computation of the lattice - // first_column = n * ( 1, - coeff_c0 * coeff_c1 mod n) - // we start by inverting coeff_c1 - ibz_copy(&lat[0][0],n); - ibz_copy(&lat[1][0],&coeff_c1); - ibz_neg(&lat[1][0],&lat[1][0]); - ibz_mul(&lat[1][0],&lat[1][0],&coeff_c0); - ibz_mod(&lat[1][0],&lat[1][0],n); - ibz_mul(&lat[1][0],&lat[1][0],n); - - // second_colum = ( 0, n² ) - ibz_copy(&lat[0][1],&ibz_const_zero); - ibz_copy(&lat[1][1],n); - ibz_mul(&lat[1][1],&lat[1][1],n); - - // computation of the target vector = (lambda * C[0], lambda * C[1] + n * cst_term * coeff_c1 ) - ibz_mul(&target[0],lambda,&(*C)[0]); - ibz_mul(&target[1],lambda,&(*C)[1]); - ibz_mul(&temp,&cst_term,&coeff_c1); - ibz_mod(&temp,&temp,n); - ibz_mul(&temp,&temp,n); - ibz_add(&target[1],&target[1],&temp); - - // computation of the norm log_bound - ibz_div(&bound,&temp,n_mu,&Bpoo->p); - int dist_bound = ibz_bitsize(&bound) - 1; - // to avoid that dist_bound is too big - if (dist_bound > 3*ibz_bitsize(n) + 10) { - dist_bound= 3*ibz_bitsize(n) + 10; - } - - // enumeration of small vectors until a suitable one is found - found = quat_2x2_lattice_enumerate_cvp_filter(mu,&lat,&target,order->q,dist_bound,condition,params,max_tries); - - // var finalize - ibz_finalize(&ibz_q);ibz_finalize(&temp);ibz_finalize(&bound); - ibz_finalize(&p_lambda_2); - ibz_finalize(&coeff_c0);ibz_finalize(&coeff_c1); - ibz_finalize(&cst_term); - ibz_mat_2x2_finalize(&lat); - ibz_vec_2_finalize(&target); - - return found; -} - - -/** - * @brief Computing a list of good norm - * - * @param list Output: a list of ibz - * @param list_size int, size of the list - * @param log_bound int, logarithmic bound - * @param n ibz, the modulo - * @param target_reduosity int, a legendre symbol - * @returns the number of integers above the bound that were able to set - * - * This algorithm finds a list of size list_size - * of ibz dividing TORSION_ODD^2 - * such that the log of these ibz is bigger than log_bound - * and the legendre symbol of these integers mod n is equal to target_reduosity - * assumes that TORSION_ODD is divided by a big power of 3, so we look for T² and T² divided by small powers of 3 (possibly divided by another factor to satisfy the reduosity condition). - */ -int norm_list_computation(ibz_t *list, int list_size, int log_bound, const ibz_t *n, int target_reduosity) { - - // var dec - ibz_t temp,remainder; - ibz_t elli; - int is_smaller; - int cnt = 0; - int num_found=0; - int found = 0; - int log_freedom =0; - ibz_t const *const T = &TORSION_ODD; - size_t const num_fac = sizeof(TORSION_ODD_PRIMES) / sizeof(*TORSION_ODD_PRIMES); - uint64_t const *const fac = TORSION_ODD_PRIMES; - - - // var init - ibz_init(&temp);ibz_init(&remainder); - ibz_init(&elli); - - assert(fac[0]==3); // by construction of p - - // temp = T² - ibz_mul(&temp, T, T); - - // log_freedom is the bitsize of temp - log_freedom = ibz_bitsize(&temp); - // indicates if we have a chance to find an integer bigger than the bound - is_smaller = (log_bound < log_freedom); - // elli = fac[0]; - ibz_set(&elli,fac[0]); - int small_reduosity = ibz_legendre(&elli,n); - - // in that case we look for a number that is a square - if (target_reduosity == 1 ) { - - while (is_smaller && num_found < list_size ) { - // copy the value to the output list - ibz_copy(&(list[num_found]),&temp); - num_found++; - - // we set up to compute another value - if (small_reduosity == 1) { - // we can afford to remove only fac[0] since it is a square - ibz_set(&remainder,fac[0]); - } - else { - // we need to remove fac[0]² because fac[0] is not a square - ibz_set(&remainder,fac[0]*fac[0]); - } - ibz_div(&temp,&remainder,&temp,&remainder); - log_freedom = ibz_bitsize(&temp); - is_smaller = (log_bound < log_freedom); - } - - } - else if (is_smaller) { - - // first, we look for a factor that is not a square that we can remove from T² to obtain an integer with the right reduosity - while (!found && num_found < num_fac ) { - - ibz_set(&elli,fac[num_found]); - if (ibz_legendre(&elli,n) == -1 ) { - ibz_div(&temp,&remainder,&temp,&elli); - assert(ibz_cmp(&remainder,&ibz_const_zero)==0); - log_freedom = ibz_bitsize(&temp); - is_smaller = (log_bound < log_freedom); - found = 1; - - } - num_found++; - } - if (!found) { - // no suitable factor was found, we cannot find any suitable integer - return 0; - } - // now we actually try to find integers - num_found =0; - while (is_smaller && num_found < list_size) { - // copy the good value to the output list - ibz_copy(&list[num_found],&temp); - num_found++; - - // we set up to compute another value - // we need to remove fac[0]² - if (small_reduosity == 1) { - // we can afford to remove only fac[0] since it is a square - ibz_set(&remainder,fac[0]); - } - else { - // we need to remove fac[0]² because fac[0] is not a square - ibz_set(&remainder,fac[0]*fac[0]); - } - ibz_div(&temp,&remainder,&temp,&remainder); - assert(ibz_cmp(&remainder,&ibz_const_zero)==0); - log_freedom = ibz_bitsize(&temp); - is_smaller = (log_bound < log_freedom); - } - } - - - - // var finalize - ibz_finalize(&temp);ibz_finalize(&remainder); - ibz_finalize(&elli); - - return num_found; - -} diff --git a/src/klpt/ref/klptx/tools.h b/src/klpt/ref/klptx/tools.h deleted file mode 100644 index 45b8f57..0000000 --- a/src/klpt/ref/klptx/tools.h +++ /dev/null @@ -1,168 +0,0 @@ -#include -#include -#include - -/** @file - * - * @authors Antonin Leroux - * - * @brief the klpt_tools header - */ - -#ifndef KLPT_TOOLS_H -#define KLPT_TOOLS_H - -/** @internal - * @ingroup klpt_klpt - * @defgroup klpt_internal KLPT module internal functions and types - * @{ - */ - -/** @internal - * @defgroup klpt_param_t Types for klpt parameters - * @{ -*/ - -/** @brief Type for klpt parameter * - * @typedef signing_klpt_param_t - * - * @struct signing_klpt_param - * - * the structure used in klpt for the call to strong approx -*/ -typedef struct signing_klpt_param { - - - quat_alg_elem_t gamma; - quat_alg_elem_t delta; - ibz_t target_norm; - quat_alg_t Bpoo; - const quat_p_extremal_maximal_order_t *order; - ibz_t n; - ibz_t equiv_n; - - -} signing_klpt_param_t; - - -/** @brief Type for quaternion algebras - * - * @typedef eichler_norm_param_t - * - * @struct eichler_norm_param - * - * the structure used in eichler_norm_param for the call to strong approx - */ -typedef struct eichler_norm_param { - - quat_alg_elem_t gen_constraint; - - - ibz_t target_norm; - quat_alg_t Bpoo; - quat_p_extremal_maximal_order_t order; - ibz_t n; - quat_order_t right_order; - -} eichler_norm_param_t; - - -/** - * @} -*/ - -/** @} -*/ - - -/** @internal - * @ingroup klpt_tools - * @{ -*/ - -/** - * @brief Create an element of a extremal maximal order from its coefficients - * - * @param elem Output: the quaternion element - * @param order the order - * @param coeffs the vector of 4 ibz coefficients - * @param Bpoo quaternion algebra - * - * elem = x + i*y + j*z + j*i*t - * where coeffs = [x,y,z,t] and i = order.i, j = order.j - * - */ -void order_elem_create(quat_alg_elem_t *elem, const quat_p_extremal_maximal_order_t *order, const quat_alg_coord_t *coeffs, const quat_alg_t *Bpoo); - -/** - * @brief Finding the good linear span(j,i*j) combination - * - * @param C Output: two integers modulo n - * @param order special extremal order - * @param delta quaternion element - * @param gamma quaternion element - * @param lideal left order-ideal - * @param Bpoo quaternion algebra - * @param is_divisible boolean indicating if Norm(gamma) is divisible by n - * - * This algorithm finds two integers C[0], C[1] such that gamma * j * (C[0] + i C[1]]) * delta is in the eichler order ZZ + lideal - * if gamma have norm divisible by n(lideal) (indicated by the boolean is_divisible), then the result will be contained in J - * Failure should not be possible - * Assumes n is prime ! - */ -int solve_combi_eichler(ibz_vec_2_t *C, const quat_p_extremal_maximal_order_t *order, const quat_alg_elem_t *gamma, const quat_alg_elem_t *delta, const quat_left_ideal_t *lideal, const quat_alg_t *Bpoo, int is_divisible); - - -int ibz_cornacchia_special_prime(ibz_t *x, ibz_t *y, const ibz_t *n, const ibz_t *p, const int exp_adjust); - - - - -/** - * @brief Computing the strong approximation - * - * @param mu Output: a quaternion element - * @param n_mu 4 times target norm of mu - * @param order special extremal order - * @param C coefficients to be lifted - * @param n_quat_C norm of the quaternion element corresponding to C - * @param lambda an integer used in the computation - * @param n modulo for the lift - * @param max_tries int, bound on the number of tries before we abort - * @param condition a filter function returning whether a vector should be output or not - * @param params extra parameters passed to `condition`. May be NULL. - * @param Bpoo the quaternion algebra - * - * This algorithm finds a quaternion element mu of norm equal to n_mu/4 such that - * mu = lambda* (C[0] + i * C[1])*j mod ( n * order) - * the value of lambda has been computed in a way to make this computation possible - * the value of mu is computed by the function condition (which depends on some additional params) and must satisfy a set of constraints defined by condition - * the number of trials is max_tries - * Assumes n is either a prime or a product of big prime ! this means the probability to encounter non-invertible elements is considered negligible - */ -int strong_approximation(quat_alg_elem_t *mu, const ibz_t *n_mu, const quat_p_extremal_maximal_order_t *order, const ibz_vec_2_t *C, const ibz_t *n_quat_C, const ibz_t *lambda, const ibz_t *n, int max_tries, -int (*condition)(quat_alg_elem_t*, const ibz_vec_2_t*, const void*), const void *params, const quat_alg_t *Bpoo); - - -/** - * @brief Computing a list of good norm - * - * @param list Output: a list of ibz - * @param list_size int, size of the list - * @param log_bound int, logarithmic bound - * @param n ibz, the modulo - * @param target_reduosity int, a legendre symbol - * @returns a bit indicating if at least one factor was found - * - * This algorithm finds a list of size list_size - * of ibz dividing T^2 - * such that the log of these ibz is smaller than log_bound and their legendre symbol - * and the legendre symbol of these ibz mod n is equal to target_reduosity - */ -int norm_list_computation(ibz_t *list, int list_size, int log_bound, const ibz_t *n, int target_reduosity); - -/** @} -*/ - - -#endif diff --git a/src/klpt/ref/lvl1/CMakeLists.txt b/src/klpt/ref/lvl1/CMakeLists.txt deleted file mode 100644 index 52530b5..0000000 --- a/src/klpt/ref/lvl1/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -set(SOURCE_FILES_KLPT_GENERIC_REF - ${KLPTX_DIR}/eichler.c - ${KLPTX_DIR}/equiv.c - ${KLPTX_DIR}/klpt.c - ${KLPTX_DIR}/tools.c -) - -add_library(${LIB_KLPT_${SVARIANT_UPPER}} ${SOURCE_FILES_KLPT_GENERIC_REF}) -target_include_directories(${LIB_KLPT_${SVARIANT_UPPER}} PRIVATE common ${INC_PUBLIC} ${INC_COMMON} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ) -target_compile_options(${LIB_KLPT_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) diff --git a/src/klpt/ref/lvl1/test/CMakeLists.txt b/src/klpt/ref/lvl1/test/CMakeLists.txt deleted file mode 100644 index 017faf3..0000000 --- a/src/klpt/ref/lvl1/test/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -set(SOURCE_FILES_KLPT_GENERIC_REF_TESTS - ${KLPTX_DIR}/test/tools.c - ${KLPTX_DIR}/test/equiv.c - ${KLPTX_DIR}/test/klpt.c - ${KLPTX_DIR}/test/eichler.c - ${KLPTX_DIR}/test/test_klpt.c -) -add_executable(sqisign_test_klpt_${SVARIANT_UPPER} ${SOURCE_FILES_KLPT_GENERIC_REF_TESTS}) -target_link_libraries(sqisign_test_klpt_${SVARIANT_UPPER} ${LIB_KLPT_${SVARIANT_UPPER}} ${LIB_QUATERNION} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_INTBIG} ${LIB_PUBLIC} ${GMP} sqisign_common_sys ) -target_include_directories(sqisign_test_klpt_${SVARIANT_UPPER} PRIVATE ${INC_PUBLIC} ${INC_COMMON} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ./include/ ) - -add_test(sqisign_test_klpt_${SVARIANT_UPPER} sqisign_test_klpt_${SVARIANT_UPPER}) \ No newline at end of file diff --git a/src/klpt/ref/lvl3/CMakeLists.txt b/src/klpt/ref/lvl3/CMakeLists.txt deleted file mode 100644 index 52530b5..0000000 --- a/src/klpt/ref/lvl3/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -set(SOURCE_FILES_KLPT_GENERIC_REF - ${KLPTX_DIR}/eichler.c - ${KLPTX_DIR}/equiv.c - ${KLPTX_DIR}/klpt.c - ${KLPTX_DIR}/tools.c -) - -add_library(${LIB_KLPT_${SVARIANT_UPPER}} ${SOURCE_FILES_KLPT_GENERIC_REF}) -target_include_directories(${LIB_KLPT_${SVARIANT_UPPER}} PRIVATE common ${INC_PUBLIC} ${INC_COMMON} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ) -target_compile_options(${LIB_KLPT_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) diff --git a/src/klpt/ref/lvl3/test/CMakeLists.txt b/src/klpt/ref/lvl3/test/CMakeLists.txt deleted file mode 100644 index 017faf3..0000000 --- a/src/klpt/ref/lvl3/test/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -set(SOURCE_FILES_KLPT_GENERIC_REF_TESTS - ${KLPTX_DIR}/test/tools.c - ${KLPTX_DIR}/test/equiv.c - ${KLPTX_DIR}/test/klpt.c - ${KLPTX_DIR}/test/eichler.c - ${KLPTX_DIR}/test/test_klpt.c -) -add_executable(sqisign_test_klpt_${SVARIANT_UPPER} ${SOURCE_FILES_KLPT_GENERIC_REF_TESTS}) -target_link_libraries(sqisign_test_klpt_${SVARIANT_UPPER} ${LIB_KLPT_${SVARIANT_UPPER}} ${LIB_QUATERNION} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_INTBIG} ${LIB_PUBLIC} ${GMP} sqisign_common_sys ) -target_include_directories(sqisign_test_klpt_${SVARIANT_UPPER} PRIVATE ${INC_PUBLIC} ${INC_COMMON} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ./include/ ) - -add_test(sqisign_test_klpt_${SVARIANT_UPPER} sqisign_test_klpt_${SVARIANT_UPPER}) \ No newline at end of file diff --git a/src/klpt/ref/lvl5/CMakeLists.txt b/src/klpt/ref/lvl5/CMakeLists.txt deleted file mode 100644 index 52530b5..0000000 --- a/src/klpt/ref/lvl5/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -set(SOURCE_FILES_KLPT_GENERIC_REF - ${KLPTX_DIR}/eichler.c - ${KLPTX_DIR}/equiv.c - ${KLPTX_DIR}/klpt.c - ${KLPTX_DIR}/tools.c -) - -add_library(${LIB_KLPT_${SVARIANT_UPPER}} ${SOURCE_FILES_KLPT_GENERIC_REF}) -target_include_directories(${LIB_KLPT_${SVARIANT_UPPER}} PRIVATE common ${INC_PUBLIC} ${INC_COMMON} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ) -target_compile_options(${LIB_KLPT_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) diff --git a/src/klpt/ref/lvl5/test/CMakeLists.txt b/src/klpt/ref/lvl5/test/CMakeLists.txt deleted file mode 100644 index 017faf3..0000000 --- a/src/klpt/ref/lvl5/test/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -set(SOURCE_FILES_KLPT_GENERIC_REF_TESTS - ${KLPTX_DIR}/test/tools.c - ${KLPTX_DIR}/test/equiv.c - ${KLPTX_DIR}/test/klpt.c - ${KLPTX_DIR}/test/eichler.c - ${KLPTX_DIR}/test/test_klpt.c -) -add_executable(sqisign_test_klpt_${SVARIANT_UPPER} ${SOURCE_FILES_KLPT_GENERIC_REF_TESTS}) -target_link_libraries(sqisign_test_klpt_${SVARIANT_UPPER} ${LIB_KLPT_${SVARIANT_UPPER}} ${LIB_QUATERNION} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_INTBIG} ${LIB_PUBLIC} ${GMP} sqisign_common_sys ) -target_include_directories(sqisign_test_klpt_${SVARIANT_UPPER} PRIVATE ${INC_PUBLIC} ${INC_COMMON} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ./include/ ) - -add_test(sqisign_test_klpt_${SVARIANT_UPPER} sqisign_test_klpt_${SVARIANT_UPPER}) \ No newline at end of file diff --git a/src/mini-gmp/mini-gmp-extra.c b/src/mini-gmp/mini-gmp-extra.c new file mode 100644 index 0000000..396d505 --- /dev/null +++ b/src/mini-gmp/mini-gmp-extra.c @@ -0,0 +1,73 @@ +#include +#include +#if defined(MINI_GMP) +#include "mini-gmp.h" +#else +// This configuration is used only for testing +#include +#endif +#include + +// Exported for testing +int +mini_mpz_legendre(const mpz_t a, const mpz_t p) +{ + int res = 0; + mpz_t e; + mpz_init_set(e, p); + mpz_sub_ui(e, e, 1); + mpz_fdiv_q_2exp(e, e, 1); + mpz_powm(e, a, e, p); + + if (mpz_cmp_ui(e, 1) <= 0) { + res = mpz_get_si(e); + } else { + res = -1; + } + mpz_clear(e); + return res; +} + +#if defined(MINI_GMP) +int +mpz_legendre(const mpz_t a, const mpz_t p) +{ + return mini_mpz_legendre(a, p); +} +#endif + +// Exported for testing +double +mini_mpz_get_d_2exp(signed long int *exp, const mpz_t op) +{ + double ret; + int tmp_exp; + mpz_t tmp; + + // Handle the case where op is 0 + if (mpz_cmp_ui(op, 0) == 0) { + *exp = 0; + return 0.0; + } + + *exp = mpz_sizeinbase(op, 2); + + mpz_init_set(tmp, op); + + if (*exp > DBL_MAX_EXP) { + mpz_fdiv_q_2exp(tmp, tmp, *exp - DBL_MAX_EXP); + } + + ret = frexp(mpz_get_d(tmp), &tmp_exp); + mpz_clear(tmp); + + return ret; +} + +#if defined(MINI_GMP) +double +mpz_get_d_2exp(signed long int *exp, const mpz_t op) +{ + return mini_mpz_get_d_2exp(exp, op); +} +#endif diff --git a/src/mini-gmp/mini-gmp-extra.h b/src/mini-gmp/mini-gmp-extra.h new file mode 100644 index 0000000..0113cfd --- /dev/null +++ b/src/mini-gmp/mini-gmp-extra.h @@ -0,0 +1,19 @@ +#ifndef MINI_GMP_EXTRA_H +#define MINI_GMP_EXTRA_H + +#if defined MINI_GMP +#include "mini-gmp.h" + +typedef long mp_exp_t; + +int mpz_legendre(const mpz_t a, const mpz_t p); +double mpz_get_d_2exp(signed long int *exp, const mpz_t op); +#else +// This configuration is used only for testing +#include +#endif + +int mini_mpz_legendre(const mpz_t a, const mpz_t p); +double mini_mpz_get_d_2exp(signed long int *exp, const mpz_t op); + +#endif diff --git a/src/mini-gmp/mini-gmp.c b/src/mini-gmp/mini-gmp.c new file mode 100644 index 0000000..3830ab2 --- /dev/null +++ b/src/mini-gmp/mini-gmp.c @@ -0,0 +1,4671 @@ +/* Note: The code from mini-gmp is modifed from the original by + commenting out the definition of GMP_LIMB_BITS */ + +/* + mini-gmp, a minimalistic implementation of a GNU GMP subset. + + Contributed to the GNU project by Niels Möller + Additional functionalities and improvements by Marco Bodrato. + +Copyright 1991-1997, 1999-2022 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP Library is free software; you can redistribute it and/or modify +it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + +or + + * the GNU General Public License as published by the Free Software + Foundation; either version 2 of the License, or (at your option) any + later version. + +or both in parallel, as here. + +The GNU MP Library is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received copies of the GNU General Public License and the +GNU Lesser General Public License along with the GNU MP Library. If not, +see https://www.gnu.org/licenses/. */ + +/* NOTE: All functions in this file which are not declared in + mini-gmp.h are internal, and are not intended to be compatible + with GMP or with future versions of mini-gmp. */ + +/* Much of the material copied from GMP files, including: gmp-impl.h, + longlong.h, mpn/generic/add_n.c, mpn/generic/addmul_1.c, + mpn/generic/lshift.c, mpn/generic/mul_1.c, + mpn/generic/mul_basecase.c, mpn/generic/rshift.c, + mpn/generic/sbpi1_div_qr.c, mpn/generic/sub_n.c, + mpn/generic/submul_1.c. */ + +#include +#include +#include +#include +#include +#include + +#include "mini-gmp.h" + +#if !defined(MINI_GMP_DONT_USE_FLOAT_H) +#include +#endif + + +/* Macros */ +/* Removed from here as it is passed as a compiler command-line definition */ +/* #define GMP_LIMB_BITS (sizeof(mp_limb_t) * CHAR_BIT) */ + +#define GMP_LIMB_MAX ((mp_limb_t) ~ (mp_limb_t) 0) +#define GMP_LIMB_HIGHBIT ((mp_limb_t) 1 << (GMP_LIMB_BITS - 1)) + +#define GMP_HLIMB_BIT ((mp_limb_t) 1 << (GMP_LIMB_BITS / 2)) +#define GMP_LLIMB_MASK (GMP_HLIMB_BIT - 1) + +#define GMP_ULONG_BITS (sizeof(unsigned long) * CHAR_BIT) +#define GMP_ULONG_HIGHBIT ((unsigned long) 1 << (GMP_ULONG_BITS - 1)) + +#define GMP_ABS(x) ((x) >= 0 ? (x) : -(x)) +#define GMP_NEG_CAST(T,x) (-((T)((x) + 1) - 1)) + +#define GMP_MIN(a, b) ((a) < (b) ? (a) : (b)) +#define GMP_MAX(a, b) ((a) > (b) ? (a) : (b)) + +#define GMP_CMP(a,b) (((a) > (b)) - ((a) < (b))) + +#if defined(DBL_MANT_DIG) && FLT_RADIX == 2 +#define GMP_DBL_MANT_BITS DBL_MANT_DIG +#else +#define GMP_DBL_MANT_BITS (53) +#endif + +/* Return non-zero if xp,xsize and yp,ysize overlap. + If xp+xsize<=yp there's no overlap, or if yp+ysize<=xp there's no + overlap. If both these are false, there's an overlap. */ +#define GMP_MPN_OVERLAP_P(xp, xsize, yp, ysize) \ + ((xp) + (xsize) > (yp) && (yp) + (ysize) > (xp)) + +#define gmp_assert_nocarry(x) do { \ + mp_limb_t __cy = (x); \ + assert (__cy == 0); \ + (void) (__cy); \ + } while (0) + +#define gmp_clz(count, x) do { \ + mp_limb_t __clz_x = (x); \ + unsigned __clz_c = 0; \ + int LOCAL_SHIFT_BITS = 8; \ + if (GMP_LIMB_BITS > LOCAL_SHIFT_BITS) \ + for (; \ + (__clz_x & ((mp_limb_t) 0xff << (GMP_LIMB_BITS - 8))) == 0; \ + __clz_c += 8) \ + { __clz_x <<= LOCAL_SHIFT_BITS; } \ + for (; (__clz_x & GMP_LIMB_HIGHBIT) == 0; __clz_c++) \ + __clz_x <<= 1; \ + (count) = __clz_c; \ + } while (0) + +#define gmp_ctz(count, x) do { \ + mp_limb_t __ctz_x = (x); \ + unsigned __ctz_c = 0; \ + gmp_clz (__ctz_c, __ctz_x & - __ctz_x); \ + (count) = GMP_LIMB_BITS - 1 - __ctz_c; \ + } while (0) + +#define gmp_add_ssaaaa(sh, sl, ah, al, bh, bl) \ + do { \ + mp_limb_t __x; \ + __x = (al) + (bl); \ + (sh) = (ah) + (bh) + (__x < (al)); \ + (sl) = __x; \ + } while (0) + +#define gmp_sub_ddmmss(sh, sl, ah, al, bh, bl) \ + do { \ + mp_limb_t __x; \ + __x = (al) - (bl); \ + (sh) = (ah) - (bh) - ((al) < (bl)); \ + (sl) = __x; \ + } while (0) + +#define gmp_umul_ppmm(w1, w0, u, v) \ + do { \ + int LOCAL_GMP_LIMB_BITS = GMP_LIMB_BITS; \ + if (sizeof(unsigned int) * CHAR_BIT >= 2 * GMP_LIMB_BITS) \ + { \ + unsigned int __ww = (unsigned int) (u) * (v); \ + w0 = (mp_limb_t) __ww; \ + w1 = (mp_limb_t) (__ww >> LOCAL_GMP_LIMB_BITS); \ + } \ + else if (GMP_ULONG_BITS >= 2 * GMP_LIMB_BITS) \ + { \ + unsigned long int __ww = (unsigned long int) (u) * (v); \ + w0 = (mp_limb_t) __ww; \ + w1 = (mp_limb_t) (__ww >> LOCAL_GMP_LIMB_BITS); \ + } \ + else { \ + mp_limb_t __x0, __x1, __x2, __x3; \ + unsigned __ul, __vl, __uh, __vh; \ + mp_limb_t __u = (u), __v = (v); \ + assert (sizeof (unsigned) * 2 >= sizeof (mp_limb_t)); \ + \ + __ul = __u & GMP_LLIMB_MASK; \ + __uh = __u >> (GMP_LIMB_BITS / 2); \ + __vl = __v & GMP_LLIMB_MASK; \ + __vh = __v >> (GMP_LIMB_BITS / 2); \ + \ + __x0 = (mp_limb_t) __ul * __vl; \ + __x1 = (mp_limb_t) __ul * __vh; \ + __x2 = (mp_limb_t) __uh * __vl; \ + __x3 = (mp_limb_t) __uh * __vh; \ + \ + __x1 += __x0 >> (GMP_LIMB_BITS / 2);/* this can't give carry */ \ + __x1 += __x2; /* but this indeed can */ \ + if (__x1 < __x2) /* did we get it? */ \ + __x3 += GMP_HLIMB_BIT; /* yes, add it in the proper pos. */ \ + \ + (w1) = __x3 + (__x1 >> (GMP_LIMB_BITS / 2)); \ + (w0) = (__x1 << (GMP_LIMB_BITS / 2)) + (__x0 & GMP_LLIMB_MASK); \ + } \ + } while (0) + +/* If mp_limb_t is of size smaller than int, plain u*v implies + automatic promotion to *signed* int, and then multiply may overflow + and cause undefined behavior. Explicitly cast to unsigned int for + that case. */ +#define gmp_umullo_limb(u, v) \ + ((sizeof(mp_limb_t) >= sizeof(int)) ? (u)*(v) : (unsigned int)(u) * (v)) + +#define gmp_udiv_qrnnd_preinv(q, r, nh, nl, d, di) \ + do { \ + mp_limb_t _qh, _ql, _r, _mask; \ + gmp_umul_ppmm (_qh, _ql, (nh), (di)); \ + gmp_add_ssaaaa (_qh, _ql, _qh, _ql, (nh) + 1, (nl)); \ + _r = (nl) - gmp_umullo_limb (_qh, (d)); \ + _mask = -(mp_limb_t) (_r > _ql); /* both > and >= are OK */ \ + _qh += _mask; \ + _r += _mask & (d); \ + if (_r >= (d)) \ + { \ + _r -= (d); \ + _qh++; \ + } \ + \ + (r) = _r; \ + (q) = _qh; \ + } while (0) + +#define gmp_udiv_qr_3by2(q, r1, r0, n2, n1, n0, d1, d0, dinv) \ + do { \ + mp_limb_t _q0, _t1, _t0, _mask; \ + gmp_umul_ppmm ((q), _q0, (n2), (dinv)); \ + gmp_add_ssaaaa ((q), _q0, (q), _q0, (n2), (n1)); \ + \ + /* Compute the two most significant limbs of n - q'd */ \ + (r1) = (n1) - gmp_umullo_limb ((d1), (q)); \ + gmp_sub_ddmmss ((r1), (r0), (r1), (n0), (d1), (d0)); \ + gmp_umul_ppmm (_t1, _t0, (d0), (q)); \ + gmp_sub_ddmmss ((r1), (r0), (r1), (r0), _t1, _t0); \ + (q)++; \ + \ + /* Conditionally adjust q and the remainders */ \ + _mask = - (mp_limb_t) ((r1) >= _q0); \ + (q) += _mask; \ + gmp_add_ssaaaa ((r1), (r0), (r1), (r0), _mask & (d1), _mask & (d0)); \ + if ((r1) >= (d1)) \ + { \ + if ((r1) > (d1) || (r0) >= (d0)) \ + { \ + (q)++; \ + gmp_sub_ddmmss ((r1), (r0), (r1), (r0), (d1), (d0)); \ + } \ + } \ + } while (0) + +/* Swap macros. */ +#define MP_LIMB_T_SWAP(x, y) \ + do { \ + mp_limb_t __mp_limb_t_swap__tmp = (x); \ + (x) = (y); \ + (y) = __mp_limb_t_swap__tmp; \ + } while (0) +#define MP_SIZE_T_SWAP(x, y) \ + do { \ + mp_size_t __mp_size_t_swap__tmp = (x); \ + (x) = (y); \ + (y) = __mp_size_t_swap__tmp; \ + } while (0) +#define MP_BITCNT_T_SWAP(x,y) \ + do { \ + mp_bitcnt_t __mp_bitcnt_t_swap__tmp = (x); \ + (x) = (y); \ + (y) = __mp_bitcnt_t_swap__tmp; \ + } while (0) +#define MP_PTR_SWAP(x, y) \ + do { \ + mp_ptr __mp_ptr_swap__tmp = (x); \ + (x) = (y); \ + (y) = __mp_ptr_swap__tmp; \ + } while (0) +#define MP_SRCPTR_SWAP(x, y) \ + do { \ + mp_srcptr __mp_srcptr_swap__tmp = (x); \ + (x) = (y); \ + (y) = __mp_srcptr_swap__tmp; \ + } while (0) + +#define MPN_PTR_SWAP(xp,xs, yp,ys) \ + do { \ + MP_PTR_SWAP (xp, yp); \ + MP_SIZE_T_SWAP (xs, ys); \ + } while(0) +#define MPN_SRCPTR_SWAP(xp,xs, yp,ys) \ + do { \ + MP_SRCPTR_SWAP (xp, yp); \ + MP_SIZE_T_SWAP (xs, ys); \ + } while(0) + +#define MPZ_PTR_SWAP(x, y) \ + do { \ + mpz_ptr __mpz_ptr_swap__tmp = (x); \ + (x) = (y); \ + (y) = __mpz_ptr_swap__tmp; \ + } while (0) +#define MPZ_SRCPTR_SWAP(x, y) \ + do { \ + mpz_srcptr __mpz_srcptr_swap__tmp = (x); \ + (x) = (y); \ + (y) = __mpz_srcptr_swap__tmp; \ + } while (0) + +const int mp_bits_per_limb = GMP_LIMB_BITS; + + +/* Memory allocation and other helper functions. */ +static void +gmp_die (const char *msg) +{ + fprintf (stderr, "%s\n", msg); + abort(); +} + +static void * +gmp_default_alloc (size_t size) +{ + void *p; + + assert (size > 0); + + p = malloc (size); + if (!p) + gmp_die("gmp_default_alloc: Virtual memory exhausted."); + + return p; +} + +static void * +gmp_default_realloc (void *old, size_t unused_old_size, size_t new_size) +{ + void * p; + + p = realloc (old, new_size); + + if (!p) + gmp_die("gmp_default_realloc: Virtual memory exhausted."); + + return p; +} + +static void +gmp_default_free (void *p, size_t unused_size) +{ + free (p); +} + +static void * (*gmp_allocate_func) (size_t) = gmp_default_alloc; +static void * (*gmp_reallocate_func) (void *, size_t, size_t) = gmp_default_realloc; +static void (*gmp_free_func) (void *, size_t) = gmp_default_free; + +void +mp_get_memory_functions (void *(**alloc_func) (size_t), + void *(**realloc_func) (void *, size_t, size_t), + void (**free_func) (void *, size_t)) +{ + if (alloc_func) + *alloc_func = gmp_allocate_func; + + if (realloc_func) + *realloc_func = gmp_reallocate_func; + + if (free_func) + *free_func = gmp_free_func; +} + +void +mp_set_memory_functions (void *(*alloc_func) (size_t), + void *(*realloc_func) (void *, size_t, size_t), + void (*free_func) (void *, size_t)) +{ + if (!alloc_func) + alloc_func = gmp_default_alloc; + if (!realloc_func) + realloc_func = gmp_default_realloc; + if (!free_func) + free_func = gmp_default_free; + + gmp_allocate_func = alloc_func; + gmp_reallocate_func = realloc_func; + gmp_free_func = free_func; +} + +#define gmp_alloc(size) ((*gmp_allocate_func)((size))) +#define gmp_free(p, size) ((*gmp_free_func) ((p), (size))) +#define gmp_realloc(ptr, old_size, size) ((*gmp_reallocate_func)(ptr, old_size, size)) + +static mp_ptr +gmp_alloc_limbs (mp_size_t size) +{ + return (mp_ptr) gmp_alloc (size * sizeof (mp_limb_t)); +} + +static mp_ptr +gmp_realloc_limbs (mp_ptr old, mp_size_t old_size, mp_size_t size) +{ + assert (size > 0); + return (mp_ptr) gmp_realloc (old, old_size * sizeof (mp_limb_t), size * sizeof (mp_limb_t)); +} + +static void +gmp_free_limbs (mp_ptr old, mp_size_t size) +{ + gmp_free (old, size * sizeof (mp_limb_t)); +} + + +/* MPN interface */ + +void +mpn_copyi (mp_ptr d, mp_srcptr s, mp_size_t n) +{ + mp_size_t i; + for (i = 0; i < n; i++) + d[i] = s[i]; +} + +void +mpn_copyd (mp_ptr d, mp_srcptr s, mp_size_t n) +{ + while (--n >= 0) + d[n] = s[n]; +} + +int +mpn_cmp (mp_srcptr ap, mp_srcptr bp, mp_size_t n) +{ + while (--n >= 0) + { + if (ap[n] != bp[n]) + return ap[n] > bp[n] ? 1 : -1; + } + return 0; +} + +static int +mpn_cmp4 (mp_srcptr ap, mp_size_t an, mp_srcptr bp, mp_size_t bn) +{ + if (an != bn) + return an < bn ? -1 : 1; + else + return mpn_cmp (ap, bp, an); +} + +static mp_size_t +mpn_normalized_size (mp_srcptr xp, mp_size_t n) +{ + while (n > 0 && xp[n-1] == 0) + --n; + return n; +} + +int +mpn_zero_p(mp_srcptr rp, mp_size_t n) +{ + return mpn_normalized_size (rp, n) == 0; +} + +void +mpn_zero (mp_ptr rp, mp_size_t n) +{ + while (--n >= 0) + rp[n] = 0; +} + +mp_limb_t +mpn_add_1 (mp_ptr rp, mp_srcptr ap, mp_size_t n, mp_limb_t b) +{ + mp_size_t i; + + assert (n > 0); + i = 0; + do + { + mp_limb_t r = ap[i] + b; + /* Carry out */ + b = (r < b); + rp[i] = r; + } + while (++i < n); + + return b; +} + +mp_limb_t +mpn_add_n (mp_ptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n) +{ + mp_size_t i; + mp_limb_t cy; + + for (i = 0, cy = 0; i < n; i++) + { + mp_limb_t a, b, r; + a = ap[i]; b = bp[i]; + r = a + cy; + cy = (r < cy); + r += b; + cy += (r < b); + rp[i] = r; + } + return cy; +} + +mp_limb_t +mpn_add (mp_ptr rp, mp_srcptr ap, mp_size_t an, mp_srcptr bp, mp_size_t bn) +{ + mp_limb_t cy; + + assert (an >= bn); + + cy = mpn_add_n (rp, ap, bp, bn); + if (an > bn) + cy = mpn_add_1 (rp + bn, ap + bn, an - bn, cy); + return cy; +} + +mp_limb_t +mpn_sub_1 (mp_ptr rp, mp_srcptr ap, mp_size_t n, mp_limb_t b) +{ + mp_size_t i; + + assert (n > 0); + + i = 0; + do + { + mp_limb_t a = ap[i]; + /* Carry out */ + mp_limb_t cy = a < b; + rp[i] = a - b; + b = cy; + } + while (++i < n); + + return b; +} + +mp_limb_t +mpn_sub_n (mp_ptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n) +{ + mp_size_t i; + mp_limb_t cy; + + for (i = 0, cy = 0; i < n; i++) + { + mp_limb_t a, b; + a = ap[i]; b = bp[i]; + b += cy; + cy = (b < cy); + cy += (a < b); + rp[i] = a - b; + } + return cy; +} + +mp_limb_t +mpn_sub (mp_ptr rp, mp_srcptr ap, mp_size_t an, mp_srcptr bp, mp_size_t bn) +{ + mp_limb_t cy; + + assert (an >= bn); + + cy = mpn_sub_n (rp, ap, bp, bn); + if (an > bn) + cy = mpn_sub_1 (rp + bn, ap + bn, an - bn, cy); + return cy; +} + +mp_limb_t +mpn_mul_1 (mp_ptr rp, mp_srcptr up, mp_size_t n, mp_limb_t vl) +{ + mp_limb_t ul, cl, hpl, lpl; + + assert (n >= 1); + + cl = 0; + do + { + ul = *up++; + gmp_umul_ppmm (hpl, lpl, ul, vl); + + lpl += cl; + cl = (lpl < cl) + hpl; + + *rp++ = lpl; + } + while (--n != 0); + + return cl; +} + +mp_limb_t +mpn_addmul_1 (mp_ptr rp, mp_srcptr up, mp_size_t n, mp_limb_t vl) +{ + mp_limb_t ul, cl, hpl, lpl, rl; + + assert (n >= 1); + + cl = 0; + do + { + ul = *up++; + gmp_umul_ppmm (hpl, lpl, ul, vl); + + lpl += cl; + cl = (lpl < cl) + hpl; + + rl = *rp; + lpl = rl + lpl; + cl += lpl < rl; + *rp++ = lpl; + } + while (--n != 0); + + return cl; +} + +mp_limb_t +mpn_submul_1 (mp_ptr rp, mp_srcptr up, mp_size_t n, mp_limb_t vl) +{ + mp_limb_t ul, cl, hpl, lpl, rl; + + assert (n >= 1); + + cl = 0; + do + { + ul = *up++; + gmp_umul_ppmm (hpl, lpl, ul, vl); + + lpl += cl; + cl = (lpl < cl) + hpl; + + rl = *rp; + lpl = rl - lpl; + cl += lpl > rl; + *rp++ = lpl; + } + while (--n != 0); + + return cl; +} + +mp_limb_t +mpn_mul (mp_ptr rp, mp_srcptr up, mp_size_t un, mp_srcptr vp, mp_size_t vn) +{ + assert (un >= vn); + assert (vn >= 1); + assert (!GMP_MPN_OVERLAP_P(rp, un + vn, up, un)); + assert (!GMP_MPN_OVERLAP_P(rp, un + vn, vp, vn)); + + /* We first multiply by the low order limb. This result can be + stored, not added, to rp. We also avoid a loop for zeroing this + way. */ + + rp[un] = mpn_mul_1 (rp, up, un, vp[0]); + + /* Now accumulate the product of up[] and the next higher limb from + vp[]. */ + + while (--vn >= 1) + { + rp += 1, vp += 1; + rp[un] = mpn_addmul_1 (rp, up, un, vp[0]); + } + return rp[un]; +} + +void +mpn_mul_n (mp_ptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n) +{ + mpn_mul (rp, ap, n, bp, n); +} + +void +mpn_sqr (mp_ptr rp, mp_srcptr ap, mp_size_t n) +{ + mpn_mul (rp, ap, n, ap, n); +} + +mp_limb_t +mpn_lshift (mp_ptr rp, mp_srcptr up, mp_size_t n, unsigned int cnt) +{ + mp_limb_t high_limb, low_limb; + unsigned int tnc; + mp_limb_t retval; + + assert (n >= 1); + assert (cnt >= 1); + assert (cnt < GMP_LIMB_BITS); + + up += n; + rp += n; + + tnc = GMP_LIMB_BITS - cnt; + low_limb = *--up; + retval = low_limb >> tnc; + high_limb = (low_limb << cnt); + + while (--n != 0) + { + low_limb = *--up; + *--rp = high_limb | (low_limb >> tnc); + high_limb = (low_limb << cnt); + } + *--rp = high_limb; + + return retval; +} + +mp_limb_t +mpn_rshift (mp_ptr rp, mp_srcptr up, mp_size_t n, unsigned int cnt) +{ + mp_limb_t high_limb, low_limb; + unsigned int tnc; + mp_limb_t retval; + + assert (n >= 1); + assert (cnt >= 1); + assert (cnt < GMP_LIMB_BITS); + + tnc = GMP_LIMB_BITS - cnt; + high_limb = *up++; + retval = (high_limb << tnc); + low_limb = high_limb >> cnt; + + while (--n != 0) + { + high_limb = *up++; + *rp++ = low_limb | (high_limb << tnc); + low_limb = high_limb >> cnt; + } + *rp = low_limb; + + return retval; +} + +static mp_bitcnt_t +mpn_common_scan (mp_limb_t limb, mp_size_t i, mp_srcptr up, mp_size_t un, + mp_limb_t ux) +{ + unsigned cnt; + + assert (ux == 0 || ux == GMP_LIMB_MAX); + assert (0 <= i && i <= un ); + + while (limb == 0) + { + i++; + if (i == un) + return (ux == 0 ? ~(mp_bitcnt_t) 0 : un * GMP_LIMB_BITS); + limb = ux ^ up[i]; + } + gmp_ctz (cnt, limb); + return (mp_bitcnt_t) i * GMP_LIMB_BITS + cnt; +} + +mp_bitcnt_t +mpn_scan1 (mp_srcptr ptr, mp_bitcnt_t bit) +{ + mp_size_t i; + i = bit / GMP_LIMB_BITS; + + return mpn_common_scan ( ptr[i] & (GMP_LIMB_MAX << (bit % GMP_LIMB_BITS)), + i, ptr, i, 0); +} + +mp_bitcnt_t +mpn_scan0 (mp_srcptr ptr, mp_bitcnt_t bit) +{ + mp_size_t i; + i = bit / GMP_LIMB_BITS; + + return mpn_common_scan (~ptr[i] & (GMP_LIMB_MAX << (bit % GMP_LIMB_BITS)), + i, ptr, i, GMP_LIMB_MAX); +} + +void +mpn_com (mp_ptr rp, mp_srcptr up, mp_size_t n) +{ + while (--n >= 0) + *rp++ = ~ *up++; +} + +mp_limb_t +mpn_neg (mp_ptr rp, mp_srcptr up, mp_size_t n) +{ + while (*up == 0) + { + *rp = 0; + if (!--n) + return 0; + ++up; ++rp; + } + *rp = - *up; + mpn_com (++rp, ++up, --n); + return 1; +} + + +/* MPN division interface. */ + +/* The 3/2 inverse is defined as + + m = floor( (B^3-1) / (B u1 + u0)) - B +*/ +mp_limb_t +mpn_invert_3by2 (mp_limb_t u1, mp_limb_t u0) +{ + mp_limb_t r, m; + + { + mp_limb_t p, ql; + unsigned ul, uh, qh; + + assert (sizeof (unsigned) * 2 >= sizeof (mp_limb_t)); + /* For notation, let b denote the half-limb base, so that B = b^2. + Split u1 = b uh + ul. */ + ul = u1 & GMP_LLIMB_MASK; + uh = u1 >> (GMP_LIMB_BITS / 2); + + /* Approximation of the high half of quotient. Differs from the 2/1 + inverse of the half limb uh, since we have already subtracted + u0. */ + qh = (u1 ^ GMP_LIMB_MAX) / uh; + + /* Adjust to get a half-limb 3/2 inverse, i.e., we want + + qh' = floor( (b^3 - 1) / u) - b = floor ((b^3 - b u - 1) / u + = floor( (b (~u) + b-1) / u), + + and the remainder + + r = b (~u) + b-1 - qh (b uh + ul) + = b (~u - qh uh) + b-1 - qh ul + + Subtraction of qh ul may underflow, which implies adjustments. + But by normalization, 2 u >= B > qh ul, so we need to adjust by + at most 2. + */ + + r = ((~u1 - (mp_limb_t) qh * uh) << (GMP_LIMB_BITS / 2)) | GMP_LLIMB_MASK; + + p = (mp_limb_t) qh * ul; + /* Adjustment steps taken from udiv_qrnnd_c */ + if (r < p) + { + qh--; + r += u1; + if (r >= u1) /* i.e. we didn't get carry when adding to r */ + if (r < p) + { + qh--; + r += u1; + } + } + r -= p; + + /* Low half of the quotient is + + ql = floor ( (b r + b-1) / u1). + + This is a 3/2 division (on half-limbs), for which qh is a + suitable inverse. */ + + p = (r >> (GMP_LIMB_BITS / 2)) * qh + r; + /* Unlike full-limb 3/2, we can add 1 without overflow. For this to + work, it is essential that ql is a full mp_limb_t. */ + ql = (p >> (GMP_LIMB_BITS / 2)) + 1; + + /* By the 3/2 trick, we don't need the high half limb. */ + r = (r << (GMP_LIMB_BITS / 2)) + GMP_LLIMB_MASK - ql * u1; + + if (r >= (GMP_LIMB_MAX & (p << (GMP_LIMB_BITS / 2)))) + { + ql--; + r += u1; + } + m = ((mp_limb_t) qh << (GMP_LIMB_BITS / 2)) + ql; + if (r >= u1) + { + m++; + r -= u1; + } + } + + /* Now m is the 2/1 inverse of u1. If u0 > 0, adjust it to become a + 3/2 inverse. */ + if (u0 > 0) + { + mp_limb_t th, tl; + r = ~r; + r += u0; + if (r < u0) + { + m--; + if (r >= u1) + { + m--; + r -= u1; + } + r -= u1; + } + gmp_umul_ppmm (th, tl, u0, m); + r += th; + if (r < th) + { + m--; + m -= ((r > u1) | ((r == u1) & (tl > u0))); + } + } + + return m; +} + +struct gmp_div_inverse +{ + /* Normalization shift count. */ + unsigned shift; + /* Normalized divisor (d0 unused for mpn_div_qr_1) */ + mp_limb_t d1, d0; + /* Inverse, for 2/1 or 3/2. */ + mp_limb_t di; +}; + +static void +mpn_div_qr_1_invert (struct gmp_div_inverse *inv, mp_limb_t d) +{ + unsigned shift; + + assert (d > 0); + gmp_clz (shift, d); + inv->shift = shift; + inv->d1 = d << shift; + inv->di = mpn_invert_limb (inv->d1); +} + +static void +mpn_div_qr_2_invert (struct gmp_div_inverse *inv, + mp_limb_t d1, mp_limb_t d0) +{ + unsigned shift; + + assert (d1 > 0); + gmp_clz (shift, d1); + inv->shift = shift; + if (shift > 0) + { + d1 = (d1 << shift) | (d0 >> (GMP_LIMB_BITS - shift)); + d0 <<= shift; + } + inv->d1 = d1; + inv->d0 = d0; + inv->di = mpn_invert_3by2 (d1, d0); +} + +static void +mpn_div_qr_invert (struct gmp_div_inverse *inv, + mp_srcptr dp, mp_size_t dn) +{ + assert (dn > 0); + + if (dn == 1) + mpn_div_qr_1_invert (inv, dp[0]); + else if (dn == 2) + mpn_div_qr_2_invert (inv, dp[1], dp[0]); + else + { + unsigned shift; + mp_limb_t d1, d0; + + d1 = dp[dn-1]; + d0 = dp[dn-2]; + assert (d1 > 0); + gmp_clz (shift, d1); + inv->shift = shift; + if (shift > 0) + { + d1 = (d1 << shift) | (d0 >> (GMP_LIMB_BITS - shift)); + d0 = (d0 << shift) | (dp[dn-3] >> (GMP_LIMB_BITS - shift)); + } + inv->d1 = d1; + inv->d0 = d0; + inv->di = mpn_invert_3by2 (d1, d0); + } +} + +/* Not matching current public gmp interface, rather corresponding to + the sbpi1_div_* functions. */ +static mp_limb_t +mpn_div_qr_1_preinv (mp_ptr qp, mp_srcptr np, mp_size_t nn, + const struct gmp_div_inverse *inv) +{ + mp_limb_t d, di; + mp_limb_t r; + mp_ptr tp = NULL; + mp_size_t tn = 0; + + if (inv->shift > 0) + { + /* Shift, reusing qp area if possible. In-place shift if qp == np. */ + tp = qp; + if (!tp) + { + tn = nn; + tp = gmp_alloc_limbs (tn); + } + r = mpn_lshift (tp, np, nn, inv->shift); + np = tp; + } + else + r = 0; + + d = inv->d1; + di = inv->di; + while (--nn >= 0) + { + mp_limb_t q; + + gmp_udiv_qrnnd_preinv (q, r, r, np[nn], d, di); + if (qp) + qp[nn] = q; + } + if (tn) + gmp_free_limbs (tp, tn); + + return r >> inv->shift; +} + +static void +mpn_div_qr_2_preinv (mp_ptr qp, mp_ptr np, mp_size_t nn, + const struct gmp_div_inverse *inv) +{ + unsigned shift; + mp_size_t i; + mp_limb_t d1, d0, di, r1, r0; + + assert (nn >= 2); + shift = inv->shift; + d1 = inv->d1; + d0 = inv->d0; + di = inv->di; + + if (shift > 0) + r1 = mpn_lshift (np, np, nn, shift); + else + r1 = 0; + + r0 = np[nn - 1]; + + i = nn - 2; + do + { + mp_limb_t n0, q; + n0 = np[i]; + gmp_udiv_qr_3by2 (q, r1, r0, r1, r0, n0, d1, d0, di); + + if (qp) + qp[i] = q; + } + while (--i >= 0); + + if (shift > 0) + { + assert ((r0 & (GMP_LIMB_MAX >> (GMP_LIMB_BITS - shift))) == 0); + r0 = (r0 >> shift) | (r1 << (GMP_LIMB_BITS - shift)); + r1 >>= shift; + } + + np[1] = r1; + np[0] = r0; +} + +static void +mpn_div_qr_pi1 (mp_ptr qp, + mp_ptr np, mp_size_t nn, mp_limb_t n1, + mp_srcptr dp, mp_size_t dn, + mp_limb_t dinv) +{ + mp_size_t i; + + mp_limb_t d1, d0; + mp_limb_t cy, cy1; + mp_limb_t q; + + assert (dn > 2); + assert (nn >= dn); + + d1 = dp[dn - 1]; + d0 = dp[dn - 2]; + + assert ((d1 & GMP_LIMB_HIGHBIT) != 0); + /* Iteration variable is the index of the q limb. + * + * We divide + * by + */ + + i = nn - dn; + do + { + mp_limb_t n0 = np[dn-1+i]; + + if (n1 == d1 && n0 == d0) + { + q = GMP_LIMB_MAX; + mpn_submul_1 (np+i, dp, dn, q); + n1 = np[dn-1+i]; /* update n1, last loop's value will now be invalid */ + } + else + { + gmp_udiv_qr_3by2 (q, n1, n0, n1, n0, np[dn-2+i], d1, d0, dinv); + + cy = mpn_submul_1 (np + i, dp, dn-2, q); + + cy1 = n0 < cy; + n0 = n0 - cy; + cy = n1 < cy1; + n1 = n1 - cy1; + np[dn-2+i] = n0; + + if (cy != 0) + { + n1 += d1 + mpn_add_n (np + i, np + i, dp, dn - 1); + q--; + } + } + + if (qp) + qp[i] = q; + } + while (--i >= 0); + + np[dn - 1] = n1; +} + +static void +mpn_div_qr_preinv (mp_ptr qp, mp_ptr np, mp_size_t nn, + mp_srcptr dp, mp_size_t dn, + const struct gmp_div_inverse *inv) +{ + assert (dn > 0); + assert (nn >= dn); + + if (dn == 1) + np[0] = mpn_div_qr_1_preinv (qp, np, nn, inv); + else if (dn == 2) + mpn_div_qr_2_preinv (qp, np, nn, inv); + else + { + mp_limb_t nh; + unsigned shift; + + assert (inv->d1 == dp[dn-1]); + assert (inv->d0 == dp[dn-2]); + assert ((inv->d1 & GMP_LIMB_HIGHBIT) != 0); + + shift = inv->shift; + if (shift > 0) + nh = mpn_lshift (np, np, nn, shift); + else + nh = 0; + + mpn_div_qr_pi1 (qp, np, nn, nh, dp, dn, inv->di); + + if (shift > 0) + gmp_assert_nocarry (mpn_rshift (np, np, dn, shift)); + } +} + +static void +mpn_div_qr (mp_ptr qp, mp_ptr np, mp_size_t nn, mp_srcptr dp, mp_size_t dn) +{ + struct gmp_div_inverse inv; + mp_ptr tp = NULL; + + assert (dn > 0); + assert (nn >= dn); + + mpn_div_qr_invert (&inv, dp, dn); + if (dn > 2 && inv.shift > 0) + { + tp = gmp_alloc_limbs (dn); + gmp_assert_nocarry (mpn_lshift (tp, dp, dn, inv.shift)); + dp = tp; + } + mpn_div_qr_preinv (qp, np, nn, dp, dn, &inv); + if (tp) + gmp_free_limbs (tp, dn); +} + + +/* MPN base conversion. */ +static unsigned +mpn_base_power_of_two_p (unsigned b) +{ + switch (b) + { + case 2: return 1; + case 4: return 2; + case 8: return 3; + case 16: return 4; + case 32: return 5; + case 64: return 6; + case 128: return 7; + case 256: return 8; + default: return 0; + } +} + +struct mpn_base_info +{ + /* bb is the largest power of the base which fits in one limb, and + exp is the corresponding exponent. */ + unsigned exp; + mp_limb_t bb; +}; + +static void +mpn_get_base_info (struct mpn_base_info *info, mp_limb_t b) +{ + mp_limb_t m; + mp_limb_t p; + unsigned exp; + + m = GMP_LIMB_MAX / b; + for (exp = 1, p = b; p <= m; exp++) + p *= b; + + info->exp = exp; + info->bb = p; +} + +static mp_bitcnt_t +mpn_limb_size_in_base_2 (mp_limb_t u) +{ + unsigned shift; + + assert (u > 0); + gmp_clz (shift, u); + return GMP_LIMB_BITS - shift; +} + +static size_t +mpn_get_str_bits (unsigned char *sp, unsigned bits, mp_srcptr up, mp_size_t un) +{ + unsigned char mask; + size_t sn, j; + mp_size_t i; + unsigned shift; + + sn = ((un - 1) * GMP_LIMB_BITS + mpn_limb_size_in_base_2 (up[un-1]) + + bits - 1) / bits; + + mask = (1U << bits) - 1; + + for (i = 0, j = sn, shift = 0; j-- > 0;) + { + unsigned char digit = up[i] >> shift; + + shift += bits; + + if (shift >= GMP_LIMB_BITS && ++i < un) + { + shift -= GMP_LIMB_BITS; + digit |= up[i] << (bits - shift); + } + sp[j] = digit & mask; + } + return sn; +} + +/* We generate digits from the least significant end, and reverse at + the end. */ +static size_t +mpn_limb_get_str (unsigned char *sp, mp_limb_t w, + const struct gmp_div_inverse *binv) +{ + mp_size_t i; + for (i = 0; w > 0; i++) + { + mp_limb_t h, l, r; + + h = w >> (GMP_LIMB_BITS - binv->shift); + l = w << binv->shift; + + gmp_udiv_qrnnd_preinv (w, r, h, l, binv->d1, binv->di); + assert ((r & (GMP_LIMB_MAX >> (GMP_LIMB_BITS - binv->shift))) == 0); + r >>= binv->shift; + + sp[i] = r; + } + return i; +} + +static size_t +mpn_get_str_other (unsigned char *sp, + int base, const struct mpn_base_info *info, + mp_ptr up, mp_size_t un) +{ + struct gmp_div_inverse binv; + size_t sn; + size_t i; + + mpn_div_qr_1_invert (&binv, base); + + sn = 0; + + if (un > 1) + { + struct gmp_div_inverse bbinv; + mpn_div_qr_1_invert (&bbinv, info->bb); + + do + { + mp_limb_t w; + size_t done; + w = mpn_div_qr_1_preinv (up, up, un, &bbinv); + un -= (up[un-1] == 0); + done = mpn_limb_get_str (sp + sn, w, &binv); + + for (sn += done; done < info->exp; done++) + sp[sn++] = 0; + } + while (un > 1); + } + sn += mpn_limb_get_str (sp + sn, up[0], &binv); + + /* Reverse order */ + for (i = 0; 2*i + 1 < sn; i++) + { + unsigned char t = sp[i]; + sp[i] = sp[sn - i - 1]; + sp[sn - i - 1] = t; + } + + return sn; +} + +size_t +mpn_get_str (unsigned char *sp, int base, mp_ptr up, mp_size_t un) +{ + unsigned bits; + + assert (un > 0); + assert (up[un-1] > 0); + + bits = mpn_base_power_of_two_p (base); + if (bits) + return mpn_get_str_bits (sp, bits, up, un); + else + { + struct mpn_base_info info; + + mpn_get_base_info (&info, base); + return mpn_get_str_other (sp, base, &info, up, un); + } +} + +static mp_size_t +mpn_set_str_bits (mp_ptr rp, const unsigned char *sp, size_t sn, + unsigned bits) +{ + mp_size_t rn; + mp_limb_t limb; + unsigned shift; + + for (limb = 0, rn = 0, shift = 0; sn-- > 0; ) + { + limb |= (mp_limb_t) sp[sn] << shift; + shift += bits; + if (shift >= GMP_LIMB_BITS) + { + shift -= GMP_LIMB_BITS; + rp[rn++] = limb; + /* Next line is correct also if shift == 0, + bits == 8, and mp_limb_t == unsigned char. */ + limb = (unsigned int) sp[sn] >> (bits - shift); + } + } + if (limb != 0) + rp[rn++] = limb; + else + rn = mpn_normalized_size (rp, rn); + return rn; +} + +/* Result is usually normalized, except for all-zero input, in which + case a single zero limb is written at *RP, and 1 is returned. */ +static mp_size_t +mpn_set_str_other (mp_ptr rp, const unsigned char *sp, size_t sn, + mp_limb_t b, const struct mpn_base_info *info) +{ + mp_size_t rn; + mp_limb_t w; + unsigned k; + size_t j; + + assert (sn > 0); + + k = 1 + (sn - 1) % info->exp; + + j = 0; + w = sp[j++]; + while (--k != 0) + w = w * b + sp[j++]; + + rp[0] = w; + + for (rn = 1; j < sn;) + { + mp_limb_t cy; + + w = sp[j++]; + for (k = 1; k < info->exp; k++) + w = w * b + sp[j++]; + + cy = mpn_mul_1 (rp, rp, rn, info->bb); + cy += mpn_add_1 (rp, rp, rn, w); + if (cy > 0) + rp[rn++] = cy; + } + assert (j == sn); + + return rn; +} + +mp_size_t +mpn_set_str (mp_ptr rp, const unsigned char *sp, size_t sn, int base) +{ + unsigned bits; + + if (sn == 0) + return 0; + + bits = mpn_base_power_of_two_p (base); + if (bits) + return mpn_set_str_bits (rp, sp, sn, bits); + else + { + struct mpn_base_info info; + + mpn_get_base_info (&info, base); + return mpn_set_str_other (rp, sp, sn, base, &info); + } +} + + +/* MPZ interface */ +void +mpz_init (mpz_t r) +{ + static const mp_limb_t dummy_limb = GMP_LIMB_MAX & 0xc1a0; + + r->_mp_alloc = 0; + r->_mp_size = 0; + r->_mp_d = (mp_ptr) &dummy_limb; +} + +/* The utility of this function is a bit limited, since many functions + assigns the result variable using mpz_swap. */ +void +mpz_init2 (mpz_t r, mp_bitcnt_t bits) +{ + mp_size_t rn; + + bits -= (bits != 0); /* Round down, except if 0 */ + rn = 1 + bits / GMP_LIMB_BITS; + + r->_mp_alloc = rn; + r->_mp_size = 0; + r->_mp_d = gmp_alloc_limbs (rn); +} + +void +mpz_clear (mpz_t r) +{ + if (r->_mp_alloc) + gmp_free_limbs (r->_mp_d, r->_mp_alloc); +} + +static mp_ptr +mpz_realloc (mpz_t r, mp_size_t size) +{ + size = GMP_MAX (size, 1); + + if (r->_mp_alloc) + r->_mp_d = gmp_realloc_limbs (r->_mp_d, r->_mp_alloc, size); + else + r->_mp_d = gmp_alloc_limbs (size); + r->_mp_alloc = size; + + if (GMP_ABS (r->_mp_size) > size) + r->_mp_size = 0; + + return r->_mp_d; +} + +/* Realloc for an mpz_t WHAT if it has less than NEEDED limbs. */ +#define MPZ_REALLOC(z,n) ((n) > (z)->_mp_alloc \ + ? mpz_realloc(z,n) \ + : (z)->_mp_d) + +/* MPZ assignment and basic conversions. */ +void +mpz_set_si (mpz_t r, signed long int x) +{ + if (x >= 0) + mpz_set_ui (r, x); + else /* (x < 0) */ + if (GMP_LIMB_BITS < GMP_ULONG_BITS) + { + mpz_set_ui (r, GMP_NEG_CAST (unsigned long int, x)); + mpz_neg (r, r); + } + else + { + r->_mp_size = -1; + MPZ_REALLOC (r, 1)[0] = GMP_NEG_CAST (unsigned long int, x); + } +} + +void +mpz_set_ui (mpz_t r, unsigned long int x) +{ + if (x > 0) + { + r->_mp_size = 1; + MPZ_REALLOC (r, 1)[0] = x; + if (GMP_LIMB_BITS < GMP_ULONG_BITS) + { + int LOCAL_GMP_LIMB_BITS = GMP_LIMB_BITS; + while (x >>= LOCAL_GMP_LIMB_BITS) + { + ++ r->_mp_size; + MPZ_REALLOC (r, r->_mp_size)[r->_mp_size - 1] = x; + } + } + } + else + r->_mp_size = 0; +} + +void +mpz_set (mpz_t r, const mpz_t x) +{ + /* Allow the NOP r == x */ + if (r != x) + { + mp_size_t n; + mp_ptr rp; + + n = GMP_ABS (x->_mp_size); + rp = MPZ_REALLOC (r, n); + + mpn_copyi (rp, x->_mp_d, n); + r->_mp_size = x->_mp_size; + } +} + +void +mpz_init_set_si (mpz_t r, signed long int x) +{ + mpz_init (r); + mpz_set_si (r, x); +} + +void +mpz_init_set_ui (mpz_t r, unsigned long int x) +{ + mpz_init (r); + mpz_set_ui (r, x); +} + +void +mpz_init_set (mpz_t r, const mpz_t x) +{ + mpz_init (r); + mpz_set (r, x); +} + +int +mpz_fits_slong_p (const mpz_t u) +{ + return mpz_cmp_si (u, LONG_MAX) <= 0 && mpz_cmp_si (u, LONG_MIN) >= 0; +} + +static int +mpn_absfits_ulong_p (mp_srcptr up, mp_size_t un) +{ + int ulongsize = GMP_ULONG_BITS / GMP_LIMB_BITS; + mp_limb_t ulongrem = 0; + + if (GMP_ULONG_BITS % GMP_LIMB_BITS != 0) + ulongrem = (mp_limb_t) (ULONG_MAX >> GMP_LIMB_BITS * ulongsize) + 1; + + return un <= ulongsize || (up[ulongsize] < ulongrem && un == ulongsize + 1); +} + +int +mpz_fits_ulong_p (const mpz_t u) +{ + mp_size_t us = u->_mp_size; + + return us >= 0 && mpn_absfits_ulong_p (u->_mp_d, us); +} + +int +mpz_fits_sint_p (const mpz_t u) +{ + return mpz_cmp_si (u, INT_MAX) <= 0 && mpz_cmp_si (u, INT_MIN) >= 0; +} + +int +mpz_fits_uint_p (const mpz_t u) +{ + return u->_mp_size >= 0 && mpz_cmpabs_ui (u, UINT_MAX) <= 0; +} + +int +mpz_fits_sshort_p (const mpz_t u) +{ + return mpz_cmp_si (u, SHRT_MAX) <= 0 && mpz_cmp_si (u, SHRT_MIN) >= 0; +} + +int +mpz_fits_ushort_p (const mpz_t u) +{ + return u->_mp_size >= 0 && mpz_cmpabs_ui (u, USHRT_MAX) <= 0; +} + +long int +mpz_get_si (const mpz_t u) +{ + unsigned long r = mpz_get_ui (u); + unsigned long c = -LONG_MAX - LONG_MIN; + + if (u->_mp_size < 0) + /* This expression is necessary to properly handle -LONG_MIN */ + return -(long) c - (long) ((r - c) & LONG_MAX); + else + return (long) (r & LONG_MAX); +} + +unsigned long int +mpz_get_ui (const mpz_t u) +{ + if (GMP_LIMB_BITS < GMP_ULONG_BITS) + { + int LOCAL_GMP_LIMB_BITS = GMP_LIMB_BITS; + unsigned long r = 0; + mp_size_t n = GMP_ABS (u->_mp_size); + n = GMP_MIN (n, 1 + (mp_size_t) (GMP_ULONG_BITS - 1) / GMP_LIMB_BITS); + while (--n >= 0) + r = (r << LOCAL_GMP_LIMB_BITS) + u->_mp_d[n]; + return r; + } + + return u->_mp_size == 0 ? 0 : u->_mp_d[0]; +} + +size_t +mpz_size (const mpz_t u) +{ + return GMP_ABS (u->_mp_size); +} + +mp_limb_t +mpz_getlimbn (const mpz_t u, mp_size_t n) +{ + if (n >= 0 && n < GMP_ABS (u->_mp_size)) + return u->_mp_d[n]; + else + return 0; +} + +void +mpz_realloc2 (mpz_t x, mp_bitcnt_t n) +{ + mpz_realloc (x, 1 + (n - (n != 0)) / GMP_LIMB_BITS); +} + +mp_srcptr +mpz_limbs_read (mpz_srcptr x) +{ + return x->_mp_d; +} + +mp_ptr +mpz_limbs_modify (mpz_t x, mp_size_t n) +{ + assert (n > 0); + return MPZ_REALLOC (x, n); +} + +mp_ptr +mpz_limbs_write (mpz_t x, mp_size_t n) +{ + return mpz_limbs_modify (x, n); +} + +void +mpz_limbs_finish (mpz_t x, mp_size_t xs) +{ + mp_size_t xn; + xn = mpn_normalized_size (x->_mp_d, GMP_ABS (xs)); + x->_mp_size = xs < 0 ? -xn : xn; +} + +static mpz_srcptr +mpz_roinit_normal_n (mpz_t x, mp_srcptr xp, mp_size_t xs) +{ + x->_mp_alloc = 0; + x->_mp_d = (mp_ptr) xp; + x->_mp_size = xs; + return x; +} + +mpz_srcptr +mpz_roinit_n (mpz_t x, mp_srcptr xp, mp_size_t xs) +{ + mpz_roinit_normal_n (x, xp, xs); + mpz_limbs_finish (x, xs); + return x; +} + + +/* Conversions and comparison to double. */ +void +mpz_set_d (mpz_t r, double x) +{ + int sign; + mp_ptr rp; + mp_size_t rn, i; + double B; + double Bi; + mp_limb_t f; + + /* x != x is true when x is a NaN, and x == x * 0.5 is true when x is + zero or infinity. */ + if (x != x || x == x * 0.5) + { + r->_mp_size = 0; + return; + } + + sign = x < 0.0 ; + if (sign) + x = - x; + + if (x < 1.0) + { + r->_mp_size = 0; + return; + } + B = 4.0 * (double) (GMP_LIMB_HIGHBIT >> 1); + Bi = 1.0 / B; + for (rn = 1; x >= B; rn++) + x *= Bi; + + rp = MPZ_REALLOC (r, rn); + + f = (mp_limb_t) x; + x -= f; + assert (x < 1.0); + i = rn-1; + rp[i] = f; + while (--i >= 0) + { + x = B * x; + f = (mp_limb_t) x; + x -= f; + assert (x < 1.0); + rp[i] = f; + } + + r->_mp_size = sign ? - rn : rn; +} + +void +mpz_init_set_d (mpz_t r, double x) +{ + mpz_init (r); + mpz_set_d (r, x); +} + +double +mpz_get_d (const mpz_t u) +{ + int m; + mp_limb_t l; + mp_size_t un; + double x; + double B = 4.0 * (double) (GMP_LIMB_HIGHBIT >> 1); + + un = GMP_ABS (u->_mp_size); + + if (un == 0) + return 0.0; + + l = u->_mp_d[--un]; + gmp_clz (m, l); + m = m + GMP_DBL_MANT_BITS - GMP_LIMB_BITS; + if (m < 0) + l &= GMP_LIMB_MAX << -m; + + for (x = l; --un >= 0;) + { + x = B*x; + if (m > 0) { + l = u->_mp_d[un]; + m -= GMP_LIMB_BITS; + if (m < 0) + l &= GMP_LIMB_MAX << -m; + x += l; + } + } + + if (u->_mp_size < 0) + x = -x; + + return x; +} + +int +mpz_cmpabs_d (const mpz_t x, double d) +{ + mp_size_t xn; + double B, Bi; + mp_size_t i; + + xn = x->_mp_size; + d = GMP_ABS (d); + + if (xn != 0) + { + xn = GMP_ABS (xn); + + B = 4.0 * (double) (GMP_LIMB_HIGHBIT >> 1); + Bi = 1.0 / B; + + /* Scale d so it can be compared with the top limb. */ + for (i = 1; i < xn; i++) + d *= Bi; + + if (d >= B) + return -1; + + /* Compare floor(d) to top limb, subtract and cancel when equal. */ + for (i = xn; i-- > 0;) + { + mp_limb_t f, xl; + + f = (mp_limb_t) d; + xl = x->_mp_d[i]; + if (xl > f) + return 1; + else if (xl < f) + return -1; + d = B * (d - f); + } + } + return - (d > 0.0); +} + +int +mpz_cmp_d (const mpz_t x, double d) +{ + if (x->_mp_size < 0) + { + if (d >= 0.0) + return -1; + else + return -mpz_cmpabs_d (x, d); + } + else + { + if (d < 0.0) + return 1; + else + return mpz_cmpabs_d (x, d); + } +} + + +/* MPZ comparisons and the like. */ +int +mpz_sgn (const mpz_t u) +{ + return GMP_CMP (u->_mp_size, 0); +} + +int +mpz_cmp_si (const mpz_t u, long v) +{ + mp_size_t usize = u->_mp_size; + + if (v >= 0) + return mpz_cmp_ui (u, v); + else if (usize >= 0) + return 1; + else + return - mpz_cmpabs_ui (u, GMP_NEG_CAST (unsigned long int, v)); +} + +int +mpz_cmp_ui (const mpz_t u, unsigned long v) +{ + mp_size_t usize = u->_mp_size; + + if (usize < 0) + return -1; + else + return mpz_cmpabs_ui (u, v); +} + +int +mpz_cmp (const mpz_t a, const mpz_t b) +{ + mp_size_t asize = a->_mp_size; + mp_size_t bsize = b->_mp_size; + + if (asize != bsize) + return (asize < bsize) ? -1 : 1; + else if (asize >= 0) + return mpn_cmp (a->_mp_d, b->_mp_d, asize); + else + return mpn_cmp (b->_mp_d, a->_mp_d, -asize); +} + +int +mpz_cmpabs_ui (const mpz_t u, unsigned long v) +{ + mp_size_t un = GMP_ABS (u->_mp_size); + + if (! mpn_absfits_ulong_p (u->_mp_d, un)) + return 1; + else + { + unsigned long uu = mpz_get_ui (u); + return GMP_CMP(uu, v); + } +} + +int +mpz_cmpabs (const mpz_t u, const mpz_t v) +{ + return mpn_cmp4 (u->_mp_d, GMP_ABS (u->_mp_size), + v->_mp_d, GMP_ABS (v->_mp_size)); +} + +void +mpz_abs (mpz_t r, const mpz_t u) +{ + mpz_set (r, u); + r->_mp_size = GMP_ABS (r->_mp_size); +} + +void +mpz_neg (mpz_t r, const mpz_t u) +{ + mpz_set (r, u); + r->_mp_size = -r->_mp_size; +} + +void +mpz_swap (mpz_t u, mpz_t v) +{ + MP_SIZE_T_SWAP (u->_mp_alloc, v->_mp_alloc); + MPN_PTR_SWAP (u->_mp_d, u->_mp_size, v->_mp_d, v->_mp_size); +} + + +/* MPZ addition and subtraction */ + + +void +mpz_add_ui (mpz_t r, const mpz_t a, unsigned long b) +{ + mpz_t bb; + mpz_init_set_ui (bb, b); + mpz_add (r, a, bb); + mpz_clear (bb); +} + +void +mpz_sub_ui (mpz_t r, const mpz_t a, unsigned long b) +{ + mpz_ui_sub (r, b, a); + mpz_neg (r, r); +} + +void +mpz_ui_sub (mpz_t r, unsigned long a, const mpz_t b) +{ + mpz_neg (r, b); + mpz_add_ui (r, r, a); +} + +static mp_size_t +mpz_abs_add (mpz_t r, const mpz_t a, const mpz_t b) +{ + mp_size_t an = GMP_ABS (a->_mp_size); + mp_size_t bn = GMP_ABS (b->_mp_size); + mp_ptr rp; + mp_limb_t cy; + + if (an < bn) + { + MPZ_SRCPTR_SWAP (a, b); + MP_SIZE_T_SWAP (an, bn); + } + + rp = MPZ_REALLOC (r, an + 1); + cy = mpn_add (rp, a->_mp_d, an, b->_mp_d, bn); + + rp[an] = cy; + + return an + cy; +} + +static mp_size_t +mpz_abs_sub (mpz_t r, const mpz_t a, const mpz_t b) +{ + mp_size_t an = GMP_ABS (a->_mp_size); + mp_size_t bn = GMP_ABS (b->_mp_size); + int cmp; + mp_ptr rp; + + cmp = mpn_cmp4 (a->_mp_d, an, b->_mp_d, bn); + if (cmp > 0) + { + rp = MPZ_REALLOC (r, an); + gmp_assert_nocarry (mpn_sub (rp, a->_mp_d, an, b->_mp_d, bn)); + return mpn_normalized_size (rp, an); + } + else if (cmp < 0) + { + rp = MPZ_REALLOC (r, bn); + gmp_assert_nocarry (mpn_sub (rp, b->_mp_d, bn, a->_mp_d, an)); + return -mpn_normalized_size (rp, bn); + } + else + return 0; +} + +void +mpz_add (mpz_t r, const mpz_t a, const mpz_t b) +{ + mp_size_t rn; + + if ( (a->_mp_size ^ b->_mp_size) >= 0) + rn = mpz_abs_add (r, a, b); + else + rn = mpz_abs_sub (r, a, b); + + r->_mp_size = a->_mp_size >= 0 ? rn : - rn; +} + +void +mpz_sub (mpz_t r, const mpz_t a, const mpz_t b) +{ + mp_size_t rn; + + if ( (a->_mp_size ^ b->_mp_size) >= 0) + rn = mpz_abs_sub (r, a, b); + else + rn = mpz_abs_add (r, a, b); + + r->_mp_size = a->_mp_size >= 0 ? rn : - rn; +} + + +/* MPZ multiplication */ +void +mpz_mul_si (mpz_t r, const mpz_t u, long int v) +{ + if (v < 0) + { + mpz_mul_ui (r, u, GMP_NEG_CAST (unsigned long int, v)); + mpz_neg (r, r); + } + else + mpz_mul_ui (r, u, v); +} + +void +mpz_mul_ui (mpz_t r, const mpz_t u, unsigned long int v) +{ + mpz_t vv; + mpz_init_set_ui (vv, v); + mpz_mul (r, u, vv); + mpz_clear (vv); + return; +} + +void +mpz_mul (mpz_t r, const mpz_t u, const mpz_t v) +{ + int sign; + mp_size_t un, vn, rn; + mpz_t t; + mp_ptr tp; + + un = u->_mp_size; + vn = v->_mp_size; + + if (un == 0 || vn == 0) + { + r->_mp_size = 0; + return; + } + + sign = (un ^ vn) < 0; + + un = GMP_ABS (un); + vn = GMP_ABS (vn); + + mpz_init2 (t, (un + vn) * GMP_LIMB_BITS); + + tp = t->_mp_d; + if (un >= vn) + mpn_mul (tp, u->_mp_d, un, v->_mp_d, vn); + else + mpn_mul (tp, v->_mp_d, vn, u->_mp_d, un); + + rn = un + vn; + rn -= tp[rn-1] == 0; + + t->_mp_size = sign ? - rn : rn; + mpz_swap (r, t); + mpz_clear (t); +} + +void +mpz_mul_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t bits) +{ + mp_size_t un, rn; + mp_size_t limbs; + unsigned shift; + mp_ptr rp; + + un = GMP_ABS (u->_mp_size); + if (un == 0) + { + r->_mp_size = 0; + return; + } + + limbs = bits / GMP_LIMB_BITS; + shift = bits % GMP_LIMB_BITS; + + rn = un + limbs + (shift > 0); + rp = MPZ_REALLOC (r, rn); + if (shift > 0) + { + mp_limb_t cy = mpn_lshift (rp + limbs, u->_mp_d, un, shift); + rp[rn-1] = cy; + rn -= (cy == 0); + } + else + mpn_copyd (rp + limbs, u->_mp_d, un); + + mpn_zero (rp, limbs); + + r->_mp_size = (u->_mp_size < 0) ? - rn : rn; +} + +void +mpz_addmul_ui (mpz_t r, const mpz_t u, unsigned long int v) +{ + mpz_t t; + mpz_init_set_ui (t, v); + mpz_mul (t, u, t); + mpz_add (r, r, t); + mpz_clear (t); +} + +void +mpz_submul_ui (mpz_t r, const mpz_t u, unsigned long int v) +{ + mpz_t t; + mpz_init_set_ui (t, v); + mpz_mul (t, u, t); + mpz_sub (r, r, t); + mpz_clear (t); +} + +void +mpz_addmul (mpz_t r, const mpz_t u, const mpz_t v) +{ + mpz_t t; + mpz_init (t); + mpz_mul (t, u, v); + mpz_add (r, r, t); + mpz_clear (t); +} + +void +mpz_submul (mpz_t r, const mpz_t u, const mpz_t v) +{ + mpz_t t; + mpz_init (t); + mpz_mul (t, u, v); + mpz_sub (r, r, t); + mpz_clear (t); +} + + +/* MPZ division */ +enum mpz_div_round_mode { GMP_DIV_FLOOR, GMP_DIV_CEIL, GMP_DIV_TRUNC }; + +/* Allows q or r to be zero. Returns 1 iff remainder is non-zero. */ +static int +mpz_div_qr (mpz_t q, mpz_t r, + const mpz_t n, const mpz_t d, enum mpz_div_round_mode mode) +{ + mp_size_t ns, ds, nn, dn, qs; + ns = n->_mp_size; + ds = d->_mp_size; + + if (ds == 0) + gmp_die("mpz_div_qr: Divide by zero."); + + if (ns == 0) + { + if (q) + q->_mp_size = 0; + if (r) + r->_mp_size = 0; + return 0; + } + + nn = GMP_ABS (ns); + dn = GMP_ABS (ds); + + qs = ds ^ ns; + + if (nn < dn) + { + if (mode == GMP_DIV_CEIL && qs >= 0) + { + /* q = 1, r = n - d */ + if (r) + mpz_sub (r, n, d); + if (q) + mpz_set_ui (q, 1); + } + else if (mode == GMP_DIV_FLOOR && qs < 0) + { + /* q = -1, r = n + d */ + if (r) + mpz_add (r, n, d); + if (q) + mpz_set_si (q, -1); + } + else + { + /* q = 0, r = d */ + if (r) + mpz_set (r, n); + if (q) + q->_mp_size = 0; + } + return 1; + } + else + { + mp_ptr np, qp; + mp_size_t qn, rn; + mpz_t tq, tr; + + mpz_init_set (tr, n); + np = tr->_mp_d; + + qn = nn - dn + 1; + + if (q) + { + mpz_init2 (tq, qn * GMP_LIMB_BITS); + qp = tq->_mp_d; + } + else + qp = NULL; + + mpn_div_qr (qp, np, nn, d->_mp_d, dn); + + if (qp) + { + qn -= (qp[qn-1] == 0); + + tq->_mp_size = qs < 0 ? -qn : qn; + } + rn = mpn_normalized_size (np, dn); + tr->_mp_size = ns < 0 ? - rn : rn; + + if (mode == GMP_DIV_FLOOR && qs < 0 && rn != 0) + { + if (q) + mpz_sub_ui (tq, tq, 1); + if (r) + mpz_add (tr, tr, d); + } + else if (mode == GMP_DIV_CEIL && qs >= 0 && rn != 0) + { + if (q) + mpz_add_ui (tq, tq, 1); + if (r) + mpz_sub (tr, tr, d); + } + + if (q) + { + mpz_swap (tq, q); + mpz_clear (tq); + } + if (r) + mpz_swap (tr, r); + + mpz_clear (tr); + + return rn != 0; + } +} + +void +mpz_cdiv_qr (mpz_t q, mpz_t r, const mpz_t n, const mpz_t d) +{ + mpz_div_qr (q, r, n, d, GMP_DIV_CEIL); +} + +void +mpz_fdiv_qr (mpz_t q, mpz_t r, const mpz_t n, const mpz_t d) +{ + mpz_div_qr (q, r, n, d, GMP_DIV_FLOOR); +} + +void +mpz_tdiv_qr (mpz_t q, mpz_t r, const mpz_t n, const mpz_t d) +{ + mpz_div_qr (q, r, n, d, GMP_DIV_TRUNC); +} + +void +mpz_cdiv_q (mpz_t q, const mpz_t n, const mpz_t d) +{ + mpz_div_qr (q, NULL, n, d, GMP_DIV_CEIL); +} + +void +mpz_fdiv_q (mpz_t q, const mpz_t n, const mpz_t d) +{ + mpz_div_qr (q, NULL, n, d, GMP_DIV_FLOOR); +} + +void +mpz_tdiv_q (mpz_t q, const mpz_t n, const mpz_t d) +{ + mpz_div_qr (q, NULL, n, d, GMP_DIV_TRUNC); +} + +void +mpz_cdiv_r (mpz_t r, const mpz_t n, const mpz_t d) +{ + mpz_div_qr (NULL, r, n, d, GMP_DIV_CEIL); +} + +void +mpz_fdiv_r (mpz_t r, const mpz_t n, const mpz_t d) +{ + mpz_div_qr (NULL, r, n, d, GMP_DIV_FLOOR); +} + +void +mpz_tdiv_r (mpz_t r, const mpz_t n, const mpz_t d) +{ + mpz_div_qr (NULL, r, n, d, GMP_DIV_TRUNC); +} + +void +mpz_mod (mpz_t r, const mpz_t n, const mpz_t d) +{ + mpz_div_qr (NULL, r, n, d, d->_mp_size >= 0 ? GMP_DIV_FLOOR : GMP_DIV_CEIL); +} + +static void +mpz_div_q_2exp (mpz_t q, const mpz_t u, mp_bitcnt_t bit_index, + enum mpz_div_round_mode mode) +{ + mp_size_t un, qn; + mp_size_t limb_cnt; + mp_ptr qp; + int adjust; + + un = u->_mp_size; + if (un == 0) + { + q->_mp_size = 0; + return; + } + limb_cnt = bit_index / GMP_LIMB_BITS; + qn = GMP_ABS (un) - limb_cnt; + bit_index %= GMP_LIMB_BITS; + + if (mode == ((un > 0) ? GMP_DIV_CEIL : GMP_DIV_FLOOR)) /* un != 0 here. */ + /* Note: Below, the final indexing at limb_cnt is valid because at + that point we have qn > 0. */ + adjust = (qn <= 0 + || !mpn_zero_p (u->_mp_d, limb_cnt) + || (u->_mp_d[limb_cnt] + & (((mp_limb_t) 1 << bit_index) - 1))); + else + adjust = 0; + + if (qn <= 0) + qn = 0; + else + { + qp = MPZ_REALLOC (q, qn); + + if (bit_index != 0) + { + mpn_rshift (qp, u->_mp_d + limb_cnt, qn, bit_index); + qn -= qp[qn - 1] == 0; + } + else + { + mpn_copyi (qp, u->_mp_d + limb_cnt, qn); + } + } + + q->_mp_size = qn; + + if (adjust) + mpz_add_ui (q, q, 1); + if (un < 0) + mpz_neg (q, q); +} + +static void +mpz_div_r_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t bit_index, + enum mpz_div_round_mode mode) +{ + mp_size_t us, un, rn; + mp_ptr rp; + mp_limb_t mask; + + us = u->_mp_size; + if (us == 0 || bit_index == 0) + { + r->_mp_size = 0; + return; + } + rn = (bit_index + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS; + assert (rn > 0); + + rp = MPZ_REALLOC (r, rn); + un = GMP_ABS (us); + + mask = GMP_LIMB_MAX >> (rn * GMP_LIMB_BITS - bit_index); + + if (rn > un) + { + /* Quotient (with truncation) is zero, and remainder is + non-zero */ + if (mode == ((us > 0) ? GMP_DIV_CEIL : GMP_DIV_FLOOR)) /* us != 0 here. */ + { + /* Have to negate and sign extend. */ + mp_size_t i; + + gmp_assert_nocarry (! mpn_neg (rp, u->_mp_d, un)); + for (i = un; i < rn - 1; i++) + rp[i] = GMP_LIMB_MAX; + + rp[rn-1] = mask; + us = -us; + } + else + { + /* Just copy */ + if (r != u) + mpn_copyi (rp, u->_mp_d, un); + + rn = un; + } + } + else + { + if (r != u) + mpn_copyi (rp, u->_mp_d, rn - 1); + + rp[rn-1] = u->_mp_d[rn-1] & mask; + + if (mode == ((us > 0) ? GMP_DIV_CEIL : GMP_DIV_FLOOR)) /* us != 0 here. */ + { + /* If r != 0, compute 2^{bit_count} - r. */ + mpn_neg (rp, rp, rn); + + rp[rn-1] &= mask; + + /* us is not used for anything else, so we can modify it + here to indicate flipped sign. */ + us = -us; + } + } + rn = mpn_normalized_size (rp, rn); + r->_mp_size = us < 0 ? -rn : rn; +} + +void +mpz_cdiv_q_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt) +{ + mpz_div_q_2exp (r, u, cnt, GMP_DIV_CEIL); +} + +void +mpz_fdiv_q_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt) +{ + mpz_div_q_2exp (r, u, cnt, GMP_DIV_FLOOR); +} + +void +mpz_tdiv_q_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt) +{ + mpz_div_q_2exp (r, u, cnt, GMP_DIV_TRUNC); +} + +void +mpz_cdiv_r_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt) +{ + mpz_div_r_2exp (r, u, cnt, GMP_DIV_CEIL); +} + +void +mpz_fdiv_r_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt) +{ + mpz_div_r_2exp (r, u, cnt, GMP_DIV_FLOOR); +} + +void +mpz_tdiv_r_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt) +{ + mpz_div_r_2exp (r, u, cnt, GMP_DIV_TRUNC); +} + +void +mpz_divexact (mpz_t q, const mpz_t n, const mpz_t d) +{ + gmp_assert_nocarry (mpz_div_qr (q, NULL, n, d, GMP_DIV_TRUNC)); +} + +int +mpz_divisible_p (const mpz_t n, const mpz_t d) +{ + return mpz_div_qr (NULL, NULL, n, d, GMP_DIV_TRUNC) == 0; +} + +int +mpz_congruent_p (const mpz_t a, const mpz_t b, const mpz_t m) +{ + mpz_t t; + int res; + + /* a == b (mod 0) iff a == b */ + if (mpz_sgn (m) == 0) + return (mpz_cmp (a, b) == 0); + + mpz_init (t); + mpz_sub (t, a, b); + res = mpz_divisible_p (t, m); + mpz_clear (t); + + return res; +} + +static unsigned long +mpz_div_qr_ui (mpz_t q, mpz_t r, + const mpz_t n, unsigned long d, enum mpz_div_round_mode mode) +{ + unsigned long ret; + mpz_t rr, dd; + + mpz_init (rr); + mpz_init_set_ui (dd, d); + mpz_div_qr (q, rr, n, dd, mode); + mpz_clear (dd); + ret = mpz_get_ui (rr); + + if (r) + mpz_swap (r, rr); + mpz_clear (rr); + + return ret; +} + +unsigned long +mpz_cdiv_qr_ui (mpz_t q, mpz_t r, const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (q, r, n, d, GMP_DIV_CEIL); +} + +unsigned long +mpz_fdiv_qr_ui (mpz_t q, mpz_t r, const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (q, r, n, d, GMP_DIV_FLOOR); +} + +unsigned long +mpz_tdiv_qr_ui (mpz_t q, mpz_t r, const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (q, r, n, d, GMP_DIV_TRUNC); +} + +unsigned long +mpz_cdiv_q_ui (mpz_t q, const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (q, NULL, n, d, GMP_DIV_CEIL); +} + +unsigned long +mpz_fdiv_q_ui (mpz_t q, const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (q, NULL, n, d, GMP_DIV_FLOOR); +} + +unsigned long +mpz_tdiv_q_ui (mpz_t q, const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (q, NULL, n, d, GMP_DIV_TRUNC); +} + +unsigned long +mpz_cdiv_r_ui (mpz_t r, const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (NULL, r, n, d, GMP_DIV_CEIL); +} +unsigned long +mpz_fdiv_r_ui (mpz_t r, const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (NULL, r, n, d, GMP_DIV_FLOOR); +} +unsigned long +mpz_tdiv_r_ui (mpz_t r, const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (NULL, r, n, d, GMP_DIV_TRUNC); +} + +unsigned long +mpz_cdiv_ui (const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (NULL, NULL, n, d, GMP_DIV_CEIL); +} + +unsigned long +mpz_fdiv_ui (const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (NULL, NULL, n, d, GMP_DIV_FLOOR); +} + +unsigned long +mpz_tdiv_ui (const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (NULL, NULL, n, d, GMP_DIV_TRUNC); +} + +unsigned long +mpz_mod_ui (mpz_t r, const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (NULL, r, n, d, GMP_DIV_FLOOR); +} + +void +mpz_divexact_ui (mpz_t q, const mpz_t n, unsigned long d) +{ + gmp_assert_nocarry (mpz_div_qr_ui (q, NULL, n, d, GMP_DIV_TRUNC)); +} + +int +mpz_divisible_ui_p (const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (NULL, NULL, n, d, GMP_DIV_TRUNC) == 0; +} + + +/* GCD */ +static mp_limb_t +mpn_gcd_11 (mp_limb_t u, mp_limb_t v) +{ + unsigned shift; + + assert ( (u | v) > 0); + + if (u == 0) + return v; + else if (v == 0) + return u; + + gmp_ctz (shift, u | v); + + u >>= shift; + v >>= shift; + + if ( (u & 1) == 0) + MP_LIMB_T_SWAP (u, v); + + while ( (v & 1) == 0) + v >>= 1; + + while (u != v) + { + if (u > v) + { + u -= v; + do + u >>= 1; + while ( (u & 1) == 0); + } + else + { + v -= u; + do + v >>= 1; + while ( (v & 1) == 0); + } + } + return u << shift; +} + +mp_size_t +mpn_gcd (mp_ptr rp, mp_ptr up, mp_size_t un, mp_ptr vp, mp_size_t vn) +{ + assert (un >= vn); + assert (vn > 0); + assert (!GMP_MPN_OVERLAP_P (up, un, vp, vn)); + assert (vp[vn-1] > 0); + assert ((up[0] | vp[0]) & 1); + + if (un > vn) + mpn_div_qr (NULL, up, un, vp, vn); + + un = mpn_normalized_size (up, vn); + if (un == 0) + { + mpn_copyi (rp, vp, vn); + return vn; + } + + if (!(vp[0] & 1)) + MPN_PTR_SWAP (up, un, vp, vn); + + while (un > 1 || vn > 1) + { + int shift; + assert (vp[0] & 1); + + while (up[0] == 0) + { + up++; + un--; + } + gmp_ctz (shift, up[0]); + if (shift > 0) + { + gmp_assert_nocarry (mpn_rshift(up, up, un, shift)); + un -= (up[un-1] == 0); + } + + if (un < vn) + MPN_PTR_SWAP (up, un, vp, vn); + else if (un == vn) + { + int c = mpn_cmp (up, vp, un); + if (c == 0) + { + mpn_copyi (rp, up, un); + return un; + } + else if (c < 0) + MP_PTR_SWAP (up, vp); + } + + gmp_assert_nocarry (mpn_sub (up, up, un, vp, vn)); + un = mpn_normalized_size (up, un); + } + rp[0] = mpn_gcd_11 (up[0], vp[0]); + return 1; +} + +unsigned long +mpz_gcd_ui (mpz_t g, const mpz_t u, unsigned long v) +{ + mpz_t t; + mpz_init_set_ui(t, v); + mpz_gcd (t, u, t); + if (v > 0) + v = mpz_get_ui (t); + + if (g) + mpz_swap (t, g); + + mpz_clear (t); + + return v; +} + +static mp_bitcnt_t +mpz_make_odd (mpz_t r) +{ + mp_bitcnt_t shift; + + assert (r->_mp_size > 0); + /* Count trailing zeros, equivalent to mpn_scan1, because we know that there is a 1 */ + shift = mpn_scan1 (r->_mp_d, 0); + mpz_tdiv_q_2exp (r, r, shift); + + return shift; +} + +void +mpz_gcd (mpz_t g, const mpz_t u, const mpz_t v) +{ + mpz_t tu, tv; + mp_bitcnt_t uz, vz, gz; + + if (u->_mp_size == 0) + { + mpz_abs (g, v); + return; + } + if (v->_mp_size == 0) + { + mpz_abs (g, u); + return; + } + + mpz_init (tu); + mpz_init (tv); + + mpz_abs (tu, u); + uz = mpz_make_odd (tu); + mpz_abs (tv, v); + vz = mpz_make_odd (tv); + gz = GMP_MIN (uz, vz); + + if (tu->_mp_size < tv->_mp_size) + mpz_swap (tu, tv); + + tu->_mp_size = mpn_gcd (tu->_mp_d, tu->_mp_d, tu->_mp_size, tv->_mp_d, tv->_mp_size); + mpz_mul_2exp (g, tu, gz); + + mpz_clear (tu); + mpz_clear (tv); +} + +void +mpz_gcdext (mpz_t g, mpz_t s, mpz_t t, const mpz_t u, const mpz_t v) +{ + mpz_t tu, tv, s0, s1, t0, t1; + mp_bitcnt_t uz, vz, gz; + mp_bitcnt_t power; + int cmp; + + if (u->_mp_size == 0) + { + /* g = 0 u + sgn(v) v */ + signed long sign = mpz_sgn (v); + mpz_abs (g, v); + if (s) + s->_mp_size = 0; + if (t) + mpz_set_si (t, sign); + return; + } + + if (v->_mp_size == 0) + { + /* g = sgn(u) u + 0 v */ + signed long sign = mpz_sgn (u); + mpz_abs (g, u); + if (s) + mpz_set_si (s, sign); + if (t) + t->_mp_size = 0; + return; + } + + mpz_init (tu); + mpz_init (tv); + mpz_init (s0); + mpz_init (s1); + mpz_init (t0); + mpz_init (t1); + + mpz_abs (tu, u); + uz = mpz_make_odd (tu); + mpz_abs (tv, v); + vz = mpz_make_odd (tv); + gz = GMP_MIN (uz, vz); + + uz -= gz; + vz -= gz; + + /* Cofactors corresponding to odd gcd. gz handled later. */ + if (tu->_mp_size < tv->_mp_size) + { + mpz_swap (tu, tv); + MPZ_SRCPTR_SWAP (u, v); + MPZ_PTR_SWAP (s, t); + MP_BITCNT_T_SWAP (uz, vz); + } + + /* Maintain + * + * u = t0 tu + t1 tv + * v = s0 tu + s1 tv + * + * where u and v denote the inputs with common factors of two + * eliminated, and det (s0, t0; s1, t1) = 2^p. Then + * + * 2^p tu = s1 u - t1 v + * 2^p tv = -s0 u + t0 v + */ + + /* After initial division, tu = q tv + tu', we have + * + * u = 2^uz (tu' + q tv) + * v = 2^vz tv + * + * or + * + * t0 = 2^uz, t1 = 2^uz q + * s0 = 0, s1 = 2^vz + */ + + mpz_tdiv_qr (t1, tu, tu, tv); + mpz_mul_2exp (t1, t1, uz); + + mpz_setbit (s1, vz); + power = uz + vz; + + if (tu->_mp_size > 0) + { + mp_bitcnt_t shift; + shift = mpz_make_odd (tu); + mpz_setbit (t0, uz + shift); + power += shift; + + for (;;) + { + int c; + c = mpz_cmp (tu, tv); + if (c == 0) + break; + + if (c < 0) + { + /* tv = tv' + tu + * + * u = t0 tu + t1 (tv' + tu) = (t0 + t1) tu + t1 tv' + * v = s0 tu + s1 (tv' + tu) = (s0 + s1) tu + s1 tv' */ + + mpz_sub (tv, tv, tu); + mpz_add (t0, t0, t1); + mpz_add (s0, s0, s1); + + shift = mpz_make_odd (tv); + mpz_mul_2exp (t1, t1, shift); + mpz_mul_2exp (s1, s1, shift); + } + else + { + mpz_sub (tu, tu, tv); + mpz_add (t1, t0, t1); + mpz_add (s1, s0, s1); + + shift = mpz_make_odd (tu); + mpz_mul_2exp (t0, t0, shift); + mpz_mul_2exp (s0, s0, shift); + } + power += shift; + } + } + else + mpz_setbit (t0, uz); + + /* Now tv = odd part of gcd, and -s0 and t0 are corresponding + cofactors. */ + + mpz_mul_2exp (tv, tv, gz); + mpz_neg (s0, s0); + + /* 2^p g = s0 u + t0 v. Eliminate one factor of two at a time. To + adjust cofactors, we need u / g and v / g */ + + mpz_divexact (s1, v, tv); + mpz_abs (s1, s1); + mpz_divexact (t1, u, tv); + mpz_abs (t1, t1); + + while (power-- > 0) + { + /* s0 u + t0 v = (s0 - v/g) u - (t0 + u/g) v */ + if (mpz_odd_p (s0) || mpz_odd_p (t0)) + { + mpz_sub (s0, s0, s1); + mpz_add (t0, t0, t1); + } + assert (mpz_even_p (t0) && mpz_even_p (s0)); + mpz_tdiv_q_2exp (s0, s0, 1); + mpz_tdiv_q_2exp (t0, t0, 1); + } + + /* Choose small cofactors (they should generally satify + + |s| < |u| / 2g and |t| < |v| / 2g, + + with some documented exceptions). Always choose the smallest s, + if there are two choices for s with same absolute value, choose + the one with smallest corresponding t (this asymmetric condition + is needed to prefer s = 0, |t| = 1 when g = |a| = |b|). */ + mpz_add (s1, s0, s1); + mpz_sub (t1, t0, t1); + cmp = mpz_cmpabs (s0, s1); + if (cmp > 0 || (cmp == 0 && mpz_cmpabs (t0, t1) > 0)) + { + mpz_swap (s0, s1); + mpz_swap (t0, t1); + } + if (u->_mp_size < 0) + mpz_neg (s0, s0); + if (v->_mp_size < 0) + mpz_neg (t0, t0); + + mpz_swap (g, tv); + if (s) + mpz_swap (s, s0); + if (t) + mpz_swap (t, t0); + + mpz_clear (tu); + mpz_clear (tv); + mpz_clear (s0); + mpz_clear (s1); + mpz_clear (t0); + mpz_clear (t1); +} + +void +mpz_lcm (mpz_t r, const mpz_t u, const mpz_t v) +{ + mpz_t g; + + if (u->_mp_size == 0 || v->_mp_size == 0) + { + r->_mp_size = 0; + return; + } + + mpz_init (g); + + mpz_gcd (g, u, v); + mpz_divexact (g, u, g); + mpz_mul (r, g, v); + + mpz_clear (g); + mpz_abs (r, r); +} + +void +mpz_lcm_ui (mpz_t r, const mpz_t u, unsigned long v) +{ + if (v == 0 || u->_mp_size == 0) + { + r->_mp_size = 0; + return; + } + + v /= mpz_gcd_ui (NULL, u, v); + mpz_mul_ui (r, u, v); + + mpz_abs (r, r); +} + +int +mpz_invert (mpz_t r, const mpz_t u, const mpz_t m) +{ + mpz_t g, tr; + int invertible; + + if (u->_mp_size == 0 || mpz_cmpabs_ui (m, 1) <= 0) + return 0; + + mpz_init (g); + mpz_init (tr); + + mpz_gcdext (g, tr, NULL, u, m); + invertible = (mpz_cmp_ui (g, 1) == 0); + + if (invertible) + { + if (tr->_mp_size < 0) + { + if (m->_mp_size >= 0) + mpz_add (tr, tr, m); + else + mpz_sub (tr, tr, m); + } + mpz_swap (r, tr); + } + + mpz_clear (g); + mpz_clear (tr); + return invertible; +} + + +/* Higher level operations (sqrt, pow and root) */ + +void +mpz_pow_ui (mpz_t r, const mpz_t b, unsigned long e) +{ + unsigned long bit; + mpz_t tr; + mpz_init_set_ui (tr, 1); + + bit = GMP_ULONG_HIGHBIT; + do + { + mpz_mul (tr, tr, tr); + if (e & bit) + mpz_mul (tr, tr, b); + bit >>= 1; + } + while (bit > 0); + + mpz_swap (r, tr); + mpz_clear (tr); +} + +void +mpz_ui_pow_ui (mpz_t r, unsigned long blimb, unsigned long e) +{ + mpz_t b; + + mpz_init_set_ui (b, blimb); + mpz_pow_ui (r, b, e); + mpz_clear (b); +} + +void +mpz_powm (mpz_t r, const mpz_t b, const mpz_t e, const mpz_t m) +{ + mpz_t tr; + mpz_t base; + mp_size_t en, mn; + mp_srcptr mp; + struct gmp_div_inverse minv; + unsigned shift; + mp_ptr tp = NULL; + + en = GMP_ABS (e->_mp_size); + mn = GMP_ABS (m->_mp_size); + if (mn == 0) + gmp_die ("mpz_powm: Zero modulo."); + + if (en == 0) + { + mpz_set_ui (r, mpz_cmpabs_ui (m, 1)); + return; + } + + mp = m->_mp_d; + mpn_div_qr_invert (&minv, mp, mn); + shift = minv.shift; + + if (shift > 0) + { + /* To avoid shifts, we do all our reductions, except the final + one, using a *normalized* m. */ + minv.shift = 0; + + tp = gmp_alloc_limbs (mn); + gmp_assert_nocarry (mpn_lshift (tp, mp, mn, shift)); + mp = tp; + } + + mpz_init (base); + + if (e->_mp_size < 0) + { + if (!mpz_invert (base, b, m)) + gmp_die ("mpz_powm: Negative exponent and non-invertible base."); + } + else + { + mp_size_t bn; + mpz_abs (base, b); + + bn = base->_mp_size; + if (bn >= mn) + { + mpn_div_qr_preinv (NULL, base->_mp_d, base->_mp_size, mp, mn, &minv); + bn = mn; + } + + /* We have reduced the absolute value. Now take care of the + sign. Note that we get zero represented non-canonically as + m. */ + if (b->_mp_size < 0) + { + mp_ptr bp = MPZ_REALLOC (base, mn); + gmp_assert_nocarry (mpn_sub (bp, mp, mn, bp, bn)); + bn = mn; + } + base->_mp_size = mpn_normalized_size (base->_mp_d, bn); + } + mpz_init_set_ui (tr, 1); + + while (--en >= 0) + { + mp_limb_t w = e->_mp_d[en]; + mp_limb_t bit; + + bit = GMP_LIMB_HIGHBIT; + do + { + mpz_mul (tr, tr, tr); + if (w & bit) + mpz_mul (tr, tr, base); + if (tr->_mp_size > mn) + { + mpn_div_qr_preinv (NULL, tr->_mp_d, tr->_mp_size, mp, mn, &minv); + tr->_mp_size = mpn_normalized_size (tr->_mp_d, mn); + } + bit >>= 1; + } + while (bit > 0); + } + + /* Final reduction */ + if (tr->_mp_size >= mn) + { + minv.shift = shift; + mpn_div_qr_preinv (NULL, tr->_mp_d, tr->_mp_size, mp, mn, &minv); + tr->_mp_size = mpn_normalized_size (tr->_mp_d, mn); + } + if (tp) + gmp_free_limbs (tp, mn); + + mpz_swap (r, tr); + mpz_clear (tr); + mpz_clear (base); +} + +void +mpz_powm_ui (mpz_t r, const mpz_t b, unsigned long elimb, const mpz_t m) +{ + mpz_t e; + + mpz_init_set_ui (e, elimb); + mpz_powm (r, b, e, m); + mpz_clear (e); +} + +/* x=trunc(y^(1/z)), r=y-x^z */ +void +mpz_rootrem (mpz_t x, mpz_t r, const mpz_t y, unsigned long z) +{ + int sgn; + mp_bitcnt_t bc; + mpz_t t, u; + + sgn = y->_mp_size < 0; + if ((~z & sgn) != 0) + gmp_die ("mpz_rootrem: Negative argument, with even root."); + if (z == 0) + gmp_die ("mpz_rootrem: Zeroth root."); + + if (mpz_cmpabs_ui (y, 1) <= 0) { + if (x) + mpz_set (x, y); + if (r) + r->_mp_size = 0; + return; + } + + mpz_init (u); + mpz_init (t); + bc = (mpz_sizeinbase (y, 2) - 1) / z + 1; + mpz_setbit (t, bc); + + if (z == 2) /* simplify sqrt loop: z-1 == 1 */ + do { + mpz_swap (u, t); /* u = x */ + mpz_tdiv_q (t, y, u); /* t = y/x */ + mpz_add (t, t, u); /* t = y/x + x */ + mpz_tdiv_q_2exp (t, t, 1); /* x'= (y/x + x)/2 */ + } while (mpz_cmpabs (t, u) < 0); /* |x'| < |x| */ + else /* z != 2 */ { + mpz_t v; + + mpz_init (v); + if (sgn) + mpz_neg (t, t); + + do { + mpz_swap (u, t); /* u = x */ + mpz_pow_ui (t, u, z - 1); /* t = x^(z-1) */ + mpz_tdiv_q (t, y, t); /* t = y/x^(z-1) */ + mpz_mul_ui (v, u, z - 1); /* v = x*(z-1) */ + mpz_add (t, t, v); /* t = y/x^(z-1) + x*(z-1) */ + mpz_tdiv_q_ui (t, t, z); /* x'=(y/x^(z-1) + x*(z-1))/z */ + } while (mpz_cmpabs (t, u) < 0); /* |x'| < |x| */ + + mpz_clear (v); + } + + if (r) { + mpz_pow_ui (t, u, z); + mpz_sub (r, y, t); + } + if (x) + mpz_swap (x, u); + mpz_clear (u); + mpz_clear (t); +} + +int +mpz_root (mpz_t x, const mpz_t y, unsigned long z) +{ + int res; + mpz_t r; + + mpz_init (r); + mpz_rootrem (x, r, y, z); + res = r->_mp_size == 0; + mpz_clear (r); + + return res; +} + +/* Compute s = floor(sqrt(u)) and r = u - s^2. Allows r == NULL */ +void +mpz_sqrtrem (mpz_t s, mpz_t r, const mpz_t u) +{ + mpz_rootrem (s, r, u, 2); +} + +void +mpz_sqrt (mpz_t s, const mpz_t u) +{ + mpz_rootrem (s, NULL, u, 2); +} + +int +mpz_perfect_square_p (const mpz_t u) +{ + if (u->_mp_size <= 0) + return (u->_mp_size == 0); + else + return mpz_root (NULL, u, 2); +} + +int +mpn_perfect_square_p (mp_srcptr p, mp_size_t n) +{ + mpz_t t; + + assert (n > 0); + assert (p [n-1] != 0); + return mpz_root (NULL, mpz_roinit_normal_n (t, p, n), 2); +} + +mp_size_t +mpn_sqrtrem (mp_ptr sp, mp_ptr rp, mp_srcptr p, mp_size_t n) +{ + mpz_t s, r, u; + mp_size_t res; + + assert (n > 0); + assert (p [n-1] != 0); + + mpz_init (r); + mpz_init (s); + mpz_rootrem (s, r, mpz_roinit_normal_n (u, p, n), 2); + + assert (s->_mp_size == (n+1)/2); + mpn_copyd (sp, s->_mp_d, s->_mp_size); + mpz_clear (s); + res = r->_mp_size; + if (rp) + mpn_copyd (rp, r->_mp_d, res); + mpz_clear (r); + return res; +} + +/* Combinatorics */ + +void +mpz_mfac_uiui (mpz_t x, unsigned long n, unsigned long m) +{ + mpz_set_ui (x, n + (n == 0)); + if (m + 1 < 2) return; + while (n > m + 1) + mpz_mul_ui (x, x, n -= m); +} + +void +mpz_2fac_ui (mpz_t x, unsigned long n) +{ + mpz_mfac_uiui (x, n, 2); +} + +void +mpz_fac_ui (mpz_t x, unsigned long n) +{ + mpz_mfac_uiui (x, n, 1); +} + +void +mpz_bin_uiui (mpz_t r, unsigned long n, unsigned long k) +{ + mpz_t t; + + mpz_set_ui (r, k <= n); + + if (k > (n >> 1)) + k = (k <= n) ? n - k : 0; + + mpz_init (t); + mpz_fac_ui (t, k); + + for (; k > 0; --k) + mpz_mul_ui (r, r, n--); + + mpz_divexact (r, r, t); + mpz_clear (t); +} + + +/* Primality testing */ + +/* Computes Kronecker (a/b) with odd b, a!=0 and GCD(a,b) = 1 */ +/* Adapted from JACOBI_BASE_METHOD==4 in mpn/generic/jacbase.c */ +static int +gmp_jacobi_coprime (mp_limb_t a, mp_limb_t b) +{ + int c, bit = 0; + + assert (b & 1); + assert (a != 0); + /* assert (mpn_gcd_11 (a, b) == 1); */ + + /* Below, we represent a and b shifted right so that the least + significant one bit is implicit. */ + b >>= 1; + + gmp_ctz(c, a); + a >>= 1; + + for (;;) + { + a >>= c; + /* (2/b) = -1 if b = 3 or 5 mod 8 */ + bit ^= c & (b ^ (b >> 1)); + if (a < b) + { + if (a == 0) + return bit & 1 ? -1 : 1; + bit ^= a & b; + a = b - a; + b -= a; + } + else + { + a -= b; + assert (a != 0); + } + + gmp_ctz(c, a); + ++c; + } +} + +static void +gmp_lucas_step_k_2k (mpz_t V, mpz_t Qk, const mpz_t n) +{ + mpz_mod (Qk, Qk, n); + /* V_{2k} <- V_k ^ 2 - 2Q^k */ + mpz_mul (V, V, V); + mpz_submul_ui (V, Qk, 2); + mpz_tdiv_r (V, V, n); + /* Q^{2k} = (Q^k)^2 */ + mpz_mul (Qk, Qk, Qk); +} + +/* Computes V_k, Q^k (mod n) for the Lucas' sequence */ +/* with P=1, Q=Q; k = (n>>b0)|1. */ +/* Requires an odd n > 4; b0 > 0; -2*Q must not overflow a long */ +/* Returns (U_k == 0) and sets V=V_k and Qk=Q^k. */ +static int +gmp_lucas_mod (mpz_t V, mpz_t Qk, long Q, + mp_bitcnt_t b0, const mpz_t n) +{ + mp_bitcnt_t bs; + mpz_t U; + int res; + + assert (b0 > 0); + assert (Q <= - (LONG_MIN / 2)); + assert (Q >= - (LONG_MAX / 2)); + assert (mpz_cmp_ui (n, 4) > 0); + assert (mpz_odd_p (n)); + + mpz_init_set_ui (U, 1); /* U1 = 1 */ + mpz_set_ui (V, 1); /* V1 = 1 */ + mpz_set_si (Qk, Q); + + for (bs = mpz_sizeinbase (n, 2) - 1; --bs >= b0;) + { + /* U_{2k} <- U_k * V_k */ + mpz_mul (U, U, V); + /* V_{2k} <- V_k ^ 2 - 2Q^k */ + /* Q^{2k} = (Q^k)^2 */ + gmp_lucas_step_k_2k (V, Qk, n); + + /* A step k->k+1 is performed if the bit in $n$ is 1 */ + /* mpz_tstbit(n,bs) or the bit is 0 in $n$ but */ + /* should be 1 in $n+1$ (bs == b0) */ + if (b0 == bs || mpz_tstbit (n, bs)) + { + /* Q^{k+1} <- Q^k * Q */ + mpz_mul_si (Qk, Qk, Q); + /* U_{k+1} <- (U_k + V_k) / 2 */ + mpz_swap (U, V); /* Keep in V the old value of U_k */ + mpz_add (U, U, V); + /* We have to compute U/2, so we need an even value, */ + /* equivalent (mod n) */ + if (mpz_odd_p (U)) + mpz_add (U, U, n); + mpz_tdiv_q_2exp (U, U, 1); + /* V_{k+1} <-(D*U_k + V_k) / 2 = + U_{k+1} + (D-1)/2*U_k = U_{k+1} - 2Q*U_k */ + mpz_mul_si (V, V, -2*Q); + mpz_add (V, U, V); + mpz_tdiv_r (V, V, n); + } + mpz_tdiv_r (U, U, n); + } + + res = U->_mp_size == 0; + mpz_clear (U); + return res; +} + +/* Performs strong Lucas' test on x, with parameters suggested */ +/* for the BPSW test. Qk is only passed to recycle a variable. */ +/* Requires GCD (x,6) = 1.*/ +static int +gmp_stronglucas (const mpz_t x, mpz_t Qk) +{ + mp_bitcnt_t b0; + mpz_t V, n; + mp_limb_t maxD, D; /* The absolute value is stored. */ + long Q; + mp_limb_t tl; + + /* Test on the absolute value. */ + mpz_roinit_normal_n (n, x->_mp_d, GMP_ABS (x->_mp_size)); + + assert (mpz_odd_p (n)); + /* assert (mpz_gcd_ui (NULL, n, 6) == 1); */ + if (mpz_root (Qk, n, 2)) + return 0; /* A square is composite. */ + + /* Check Ds up to square root (in case, n is prime) + or avoid overflows */ + maxD = (Qk->_mp_size == 1) ? Qk->_mp_d [0] - 1 : GMP_LIMB_MAX; + + D = 3; + /* Search a D such that (D/n) = -1 in the sequence 5,-7,9,-11,.. */ + /* For those Ds we have (D/n) = (n/|D|) */ + do + { + if (D >= maxD) + return 1 + (D != GMP_LIMB_MAX); /* (1 + ! ~ D) */ + D += 2; + tl = mpz_tdiv_ui (n, D); + if (tl == 0) + return 0; + } + while (gmp_jacobi_coprime (tl, D) == 1); + + mpz_init (V); + + /* n-(D/n) = n+1 = d*2^{b0}, with d = (n>>b0) | 1 */ + b0 = mpn_common_scan (~ n->_mp_d[0], 0, n->_mp_d, n->_mp_size, GMP_LIMB_MAX); + /* b0 = mpz_scan0 (n, 0); */ + + /* D= P^2 - 4Q; P = 1; Q = (1-D)/4 */ + Q = (D & 2) ? (long) (D >> 2) + 1 : -(long) (D >> 2); + + if (! gmp_lucas_mod (V, Qk, Q, b0, n)) /* If Ud != 0 */ + while (V->_mp_size != 0 && --b0 != 0) /* while Vk != 0 */ + /* V <- V ^ 2 - 2Q^k */ + /* Q^{2k} = (Q^k)^2 */ + gmp_lucas_step_k_2k (V, Qk, n); + + mpz_clear (V); + return (b0 != 0); +} + +static int +gmp_millerrabin (const mpz_t n, const mpz_t nm1, mpz_t y, + const mpz_t q, mp_bitcnt_t k) +{ + assert (k > 0); + + /* Caller must initialize y to the base. */ + mpz_powm (y, y, q, n); + + if (mpz_cmp_ui (y, 1) == 0 || mpz_cmp (y, nm1) == 0) + return 1; + + while (--k > 0) + { + mpz_powm_ui (y, y, 2, n); + if (mpz_cmp (y, nm1) == 0) + return 1; + } + return 0; +} + +/* This product is 0xc0cfd797, and fits in 32 bits. */ +#define GMP_PRIME_PRODUCT \ + (3UL*5UL*7UL*11UL*13UL*17UL*19UL*23UL*29UL) + +/* Bit (p+1)/2 is set, for each odd prime <= 61 */ +#define GMP_PRIME_MASK 0xc96996dcUL + +int +mpz_probab_prime_p (const mpz_t n, int reps) +{ + mpz_t nm1; + mpz_t q; + mpz_t y; + mp_bitcnt_t k; + int is_prime; + int j; + + /* Note that we use the absolute value of n only, for compatibility + with the real GMP. */ + if (mpz_even_p (n)) + return (mpz_cmpabs_ui (n, 2) == 0) ? 2 : 0; + + /* Above test excludes n == 0 */ + assert (n->_mp_size != 0); + + if (mpz_cmpabs_ui (n, 64) < 0) + return (GMP_PRIME_MASK >> (n->_mp_d[0] >> 1)) & 2; + + if (mpz_gcd_ui (NULL, n, GMP_PRIME_PRODUCT) != 1) + return 0; + + /* All prime factors are >= 31. */ + if (mpz_cmpabs_ui (n, 31*31) < 0) + return 2; + + mpz_init (nm1); + mpz_init (q); + + /* Find q and k, where q is odd and n = 1 + 2**k * q. */ + mpz_abs (nm1, n); + nm1->_mp_d[0] -= 1; + /* Count trailing zeros, equivalent to mpn_scan1, because we know that there is a 1 */ + k = mpn_scan1 (nm1->_mp_d, 0); + mpz_tdiv_q_2exp (q, nm1, k); + + /* BPSW test */ + mpz_init_set_ui (y, 2); + is_prime = gmp_millerrabin (n, nm1, y, q, k) && gmp_stronglucas (n, y); + reps -= 24; /* skip the first 24 repetitions */ + + /* Use Miller-Rabin, with a deterministic sequence of bases, a[j] = + j^2 + j + 41 using Euler's polynomial. We potentially stop early, + if a[j] >= n - 1. Since n >= 31*31, this can happen only if reps > + 30 (a[30] == 971 > 31*31 == 961). */ + + for (j = 0; is_prime & (j < reps); j++) + { + mpz_set_ui (y, (unsigned long) j*j+j+41); + if (mpz_cmp (y, nm1) >= 0) + { + /* Don't try any further bases. This "early" break does not affect + the result for any reasonable reps value (<=5000 was tested) */ + assert (j >= 30); + break; + } + is_prime = gmp_millerrabin (n, nm1, y, q, k); + } + mpz_clear (nm1); + mpz_clear (q); + mpz_clear (y); + + return is_prime; +} + + +/* Logical operations and bit manipulation. */ + +/* Numbers are treated as if represented in two's complement (and + infinitely sign extended). For a negative values we get the two's + complement from -x = ~x + 1, where ~ is bitwise complement. + Negation transforms + + xxxx10...0 + + into + + yyyy10...0 + + where yyyy is the bitwise complement of xxxx. So least significant + bits, up to and including the first one bit, are unchanged, and + the more significant bits are all complemented. + + To change a bit from zero to one in a negative number, subtract the + corresponding power of two from the absolute value. This can never + underflow. To change a bit from one to zero, add the corresponding + power of two, and this might overflow. E.g., if x = -001111, the + two's complement is 110001. Clearing the least significant bit, we + get two's complement 110000, and -010000. */ + +int +mpz_tstbit (const mpz_t d, mp_bitcnt_t bit_index) +{ + mp_size_t limb_index; + unsigned shift; + mp_size_t ds; + mp_size_t dn; + mp_limb_t w; + int bit; + + ds = d->_mp_size; + dn = GMP_ABS (ds); + limb_index = bit_index / GMP_LIMB_BITS; + if (limb_index >= dn) + return ds < 0; + + shift = bit_index % GMP_LIMB_BITS; + w = d->_mp_d[limb_index]; + bit = (w >> shift) & 1; + + if (ds < 0) + { + /* d < 0. Check if any of the bits below is set: If so, our bit + must be complemented. */ + if (shift > 0 && (mp_limb_t) (w << (GMP_LIMB_BITS - shift)) > 0) + return bit ^ 1; + while (--limb_index >= 0) + if (d->_mp_d[limb_index] > 0) + return bit ^ 1; + } + return bit; +} + +static void +mpz_abs_add_bit (mpz_t d, mp_bitcnt_t bit_index) +{ + mp_size_t dn, limb_index; + mp_limb_t bit; + mp_ptr dp; + + dn = GMP_ABS (d->_mp_size); + + limb_index = bit_index / GMP_LIMB_BITS; + bit = (mp_limb_t) 1 << (bit_index % GMP_LIMB_BITS); + + if (limb_index >= dn) + { + mp_size_t i; + /* The bit should be set outside of the end of the number. + We have to increase the size of the number. */ + dp = MPZ_REALLOC (d, limb_index + 1); + + dp[limb_index] = bit; + for (i = dn; i < limb_index; i++) + dp[i] = 0; + dn = limb_index + 1; + } + else + { + mp_limb_t cy; + + dp = d->_mp_d; + + cy = mpn_add_1 (dp + limb_index, dp + limb_index, dn - limb_index, bit); + if (cy > 0) + { + dp = MPZ_REALLOC (d, dn + 1); + dp[dn++] = cy; + } + } + + d->_mp_size = (d->_mp_size < 0) ? - dn : dn; +} + +static void +mpz_abs_sub_bit (mpz_t d, mp_bitcnt_t bit_index) +{ + mp_size_t dn, limb_index; + mp_ptr dp; + mp_limb_t bit; + + dn = GMP_ABS (d->_mp_size); + dp = d->_mp_d; + + limb_index = bit_index / GMP_LIMB_BITS; + bit = (mp_limb_t) 1 << (bit_index % GMP_LIMB_BITS); + + assert (limb_index < dn); + + gmp_assert_nocarry (mpn_sub_1 (dp + limb_index, dp + limb_index, + dn - limb_index, bit)); + dn = mpn_normalized_size (dp, dn); + d->_mp_size = (d->_mp_size < 0) ? - dn : dn; +} + +void +mpz_setbit (mpz_t d, mp_bitcnt_t bit_index) +{ + if (!mpz_tstbit (d, bit_index)) + { + if (d->_mp_size >= 0) + mpz_abs_add_bit (d, bit_index); + else + mpz_abs_sub_bit (d, bit_index); + } +} + +void +mpz_clrbit (mpz_t d, mp_bitcnt_t bit_index) +{ + if (mpz_tstbit (d, bit_index)) + { + if (d->_mp_size >= 0) + mpz_abs_sub_bit (d, bit_index); + else + mpz_abs_add_bit (d, bit_index); + } +} + +void +mpz_combit (mpz_t d, mp_bitcnt_t bit_index) +{ + if (mpz_tstbit (d, bit_index) ^ (d->_mp_size < 0)) + mpz_abs_sub_bit (d, bit_index); + else + mpz_abs_add_bit (d, bit_index); +} + +void +mpz_com (mpz_t r, const mpz_t u) +{ + mpz_add_ui (r, u, 1); + mpz_neg (r, r); +} + +void +mpz_and (mpz_t r, const mpz_t u, const mpz_t v) +{ + mp_size_t un, vn, rn, i; + mp_ptr up, vp, rp; + + mp_limb_t ux, vx, rx; + mp_limb_t uc, vc, rc; + mp_limb_t ul, vl, rl; + + un = GMP_ABS (u->_mp_size); + vn = GMP_ABS (v->_mp_size); + if (un < vn) + { + MPZ_SRCPTR_SWAP (u, v); + MP_SIZE_T_SWAP (un, vn); + } + if (vn == 0) + { + r->_mp_size = 0; + return; + } + + uc = u->_mp_size < 0; + vc = v->_mp_size < 0; + rc = uc & vc; + + ux = -uc; + vx = -vc; + rx = -rc; + + /* If the smaller input is positive, higher limbs don't matter. */ + rn = vx ? un : vn; + + rp = MPZ_REALLOC (r, rn + (mp_size_t) rc); + + up = u->_mp_d; + vp = v->_mp_d; + + i = 0; + do + { + ul = (up[i] ^ ux) + uc; + uc = ul < uc; + + vl = (vp[i] ^ vx) + vc; + vc = vl < vc; + + rl = ( (ul & vl) ^ rx) + rc; + rc = rl < rc; + rp[i] = rl; + } + while (++i < vn); + assert (vc == 0); + + for (; i < rn; i++) + { + ul = (up[i] ^ ux) + uc; + uc = ul < uc; + + rl = ( (ul & vx) ^ rx) + rc; + rc = rl < rc; + rp[i] = rl; + } + if (rc) + rp[rn++] = rc; + else + rn = mpn_normalized_size (rp, rn); + + r->_mp_size = rx ? -rn : rn; +} + +void +mpz_ior (mpz_t r, const mpz_t u, const mpz_t v) +{ + mp_size_t un, vn, rn, i; + mp_ptr up, vp, rp; + + mp_limb_t ux, vx, rx; + mp_limb_t uc, vc, rc; + mp_limb_t ul, vl, rl; + + un = GMP_ABS (u->_mp_size); + vn = GMP_ABS (v->_mp_size); + if (un < vn) + { + MPZ_SRCPTR_SWAP (u, v); + MP_SIZE_T_SWAP (un, vn); + } + if (vn == 0) + { + mpz_set (r, u); + return; + } + + uc = u->_mp_size < 0; + vc = v->_mp_size < 0; + rc = uc | vc; + + ux = -uc; + vx = -vc; + rx = -rc; + + /* If the smaller input is negative, by sign extension higher limbs + don't matter. */ + rn = vx ? vn : un; + + rp = MPZ_REALLOC (r, rn + (mp_size_t) rc); + + up = u->_mp_d; + vp = v->_mp_d; + + i = 0; + do + { + ul = (up[i] ^ ux) + uc; + uc = ul < uc; + + vl = (vp[i] ^ vx) + vc; + vc = vl < vc; + + rl = ( (ul | vl) ^ rx) + rc; + rc = rl < rc; + rp[i] = rl; + } + while (++i < vn); + assert (vc == 0); + + for (; i < rn; i++) + { + ul = (up[i] ^ ux) + uc; + uc = ul < uc; + + rl = ( (ul | vx) ^ rx) + rc; + rc = rl < rc; + rp[i] = rl; + } + if (rc) + rp[rn++] = rc; + else + rn = mpn_normalized_size (rp, rn); + + r->_mp_size = rx ? -rn : rn; +} + +void +mpz_xor (mpz_t r, const mpz_t u, const mpz_t v) +{ + mp_size_t un, vn, i; + mp_ptr up, vp, rp; + + mp_limb_t ux, vx, rx; + mp_limb_t uc, vc, rc; + mp_limb_t ul, vl, rl; + + un = GMP_ABS (u->_mp_size); + vn = GMP_ABS (v->_mp_size); + if (un < vn) + { + MPZ_SRCPTR_SWAP (u, v); + MP_SIZE_T_SWAP (un, vn); + } + if (vn == 0) + { + mpz_set (r, u); + return; + } + + uc = u->_mp_size < 0; + vc = v->_mp_size < 0; + rc = uc ^ vc; + + ux = -uc; + vx = -vc; + rx = -rc; + + rp = MPZ_REALLOC (r, un + (mp_size_t) rc); + + up = u->_mp_d; + vp = v->_mp_d; + + i = 0; + do + { + ul = (up[i] ^ ux) + uc; + uc = ul < uc; + + vl = (vp[i] ^ vx) + vc; + vc = vl < vc; + + rl = (ul ^ vl ^ rx) + rc; + rc = rl < rc; + rp[i] = rl; + } + while (++i < vn); + assert (vc == 0); + + for (; i < un; i++) + { + ul = (up[i] ^ ux) + uc; + uc = ul < uc; + + rl = (ul ^ ux) + rc; + rc = rl < rc; + rp[i] = rl; + } + if (rc) + rp[un++] = rc; + else + un = mpn_normalized_size (rp, un); + + r->_mp_size = rx ? -un : un; +} + +static unsigned +gmp_popcount_limb (mp_limb_t x) +{ + unsigned c; + + /* Do 16 bits at a time, to avoid limb-sized constants. */ + int LOCAL_SHIFT_BITS = 16; + for (c = 0; x > 0;) + { + unsigned w = x - ((x >> 1) & 0x5555); + w = ((w >> 2) & 0x3333) + (w & 0x3333); + w = (w >> 4) + w; + w = ((w >> 8) & 0x000f) + (w & 0x000f); + c += w; + if (GMP_LIMB_BITS > LOCAL_SHIFT_BITS) + x >>= LOCAL_SHIFT_BITS; + else + x = 0; + } + return c; +} + +mp_bitcnt_t +mpn_popcount (mp_srcptr p, mp_size_t n) +{ + mp_size_t i; + mp_bitcnt_t c; + + for (c = 0, i = 0; i < n; i++) + c += gmp_popcount_limb (p[i]); + + return c; +} + +mp_bitcnt_t +mpz_popcount (const mpz_t u) +{ + mp_size_t un; + + un = u->_mp_size; + + if (un < 0) + return ~(mp_bitcnt_t) 0; + + return mpn_popcount (u->_mp_d, un); +} + +mp_bitcnt_t +mpz_hamdist (const mpz_t u, const mpz_t v) +{ + mp_size_t un, vn, i; + mp_limb_t uc, vc, ul, vl, comp; + mp_srcptr up, vp; + mp_bitcnt_t c; + + un = u->_mp_size; + vn = v->_mp_size; + + if ( (un ^ vn) < 0) + return ~(mp_bitcnt_t) 0; + + comp = - (uc = vc = (un < 0)); + if (uc) + { + assert (vn < 0); + un = -un; + vn = -vn; + } + + up = u->_mp_d; + vp = v->_mp_d; + + if (un < vn) + MPN_SRCPTR_SWAP (up, un, vp, vn); + + for (i = 0, c = 0; i < vn; i++) + { + ul = (up[i] ^ comp) + uc; + uc = ul < uc; + + vl = (vp[i] ^ comp) + vc; + vc = vl < vc; + + c += gmp_popcount_limb (ul ^ vl); + } + assert (vc == 0); + + for (; i < un; i++) + { + ul = (up[i] ^ comp) + uc; + uc = ul < uc; + + c += gmp_popcount_limb (ul ^ comp); + } + + return c; +} + +mp_bitcnt_t +mpz_scan1 (const mpz_t u, mp_bitcnt_t starting_bit) +{ + mp_ptr up; + mp_size_t us, un, i; + mp_limb_t limb, ux; + + us = u->_mp_size; + un = GMP_ABS (us); + i = starting_bit / GMP_LIMB_BITS; + + /* Past the end there's no 1 bits for u>=0, or an immediate 1 bit + for u<0. Notice this test picks up any u==0 too. */ + if (i >= un) + return (us >= 0 ? ~(mp_bitcnt_t) 0 : starting_bit); + + up = u->_mp_d; + ux = 0; + limb = up[i]; + + if (starting_bit != 0) + { + if (us < 0) + { + ux = mpn_zero_p (up, i); + limb = ~ limb + ux; + ux = - (mp_limb_t) (limb >= ux); + } + + /* Mask to 0 all bits before starting_bit, thus ignoring them. */ + limb &= GMP_LIMB_MAX << (starting_bit % GMP_LIMB_BITS); + } + + return mpn_common_scan (limb, i, up, un, ux); +} + +mp_bitcnt_t +mpz_scan0 (const mpz_t u, mp_bitcnt_t starting_bit) +{ + mp_ptr up; + mp_size_t us, un, i; + mp_limb_t limb, ux; + + us = u->_mp_size; + ux = - (mp_limb_t) (us >= 0); + un = GMP_ABS (us); + i = starting_bit / GMP_LIMB_BITS; + + /* When past end, there's an immediate 0 bit for u>=0, or no 0 bits for + u<0. Notice this test picks up all cases of u==0 too. */ + if (i >= un) + return (ux ? starting_bit : ~(mp_bitcnt_t) 0); + + up = u->_mp_d; + limb = up[i] ^ ux; + + if (ux == 0) + limb -= mpn_zero_p (up, i); /* limb = ~(~limb + zero_p) */ + + /* Mask all bits before starting_bit, thus ignoring them. */ + limb &= GMP_LIMB_MAX << (starting_bit % GMP_LIMB_BITS); + + return mpn_common_scan (limb, i, up, un, ux); +} + + +/* MPZ base conversion. */ + +size_t +mpz_sizeinbase (const mpz_t u, int base) +{ + mp_size_t un, tn; + mp_srcptr up; + mp_ptr tp; + mp_bitcnt_t bits; + struct gmp_div_inverse bi; + size_t ndigits; + + assert (base >= 2); + assert (base <= 62); + + un = GMP_ABS (u->_mp_size); + if (un == 0) + return 1; + + up = u->_mp_d; + + bits = (un - 1) * GMP_LIMB_BITS + mpn_limb_size_in_base_2 (up[un-1]); + switch (base) + { + case 2: + return bits; + case 4: + return (bits + 1) / 2; + case 8: + return (bits + 2) / 3; + case 16: + return (bits + 3) / 4; + case 32: + return (bits + 4) / 5; + /* FIXME: Do something more clever for the common case of base + 10. */ + } + + tp = gmp_alloc_limbs (un); + mpn_copyi (tp, up, un); + mpn_div_qr_1_invert (&bi, base); + + tn = un; + ndigits = 0; + do + { + ndigits++; + mpn_div_qr_1_preinv (tp, tp, tn, &bi); + tn -= (tp[tn-1] == 0); + } + while (tn > 0); + + gmp_free_limbs (tp, un); + return ndigits; +} + +char * +mpz_get_str (char *sp, int base, const mpz_t u) +{ + unsigned bits; + const char *digits; + mp_size_t un; + size_t i, sn, osn; + + digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + if (base > 1) + { + if (base <= 36) + digits = "0123456789abcdefghijklmnopqrstuvwxyz"; + else if (base > 62) + return NULL; + } + else if (base >= -1) + base = 10; + else + { + base = -base; + if (base > 36) + return NULL; + } + + sn = 1 + mpz_sizeinbase (u, base); + if (!sp) + { + osn = 1 + sn; + sp = (char *) gmp_alloc (osn); + } + else + osn = 0; + un = GMP_ABS (u->_mp_size); + + if (un == 0) + { + sp[0] = '0'; + sn = 1; + goto ret; + } + + i = 0; + + if (u->_mp_size < 0) + sp[i++] = '-'; + + bits = mpn_base_power_of_two_p (base); + + if (bits) + /* Not modified in this case. */ + sn = i + mpn_get_str_bits ((unsigned char *) sp + i, bits, u->_mp_d, un); + else + { + struct mpn_base_info info; + mp_ptr tp; + + mpn_get_base_info (&info, base); + tp = gmp_alloc_limbs (un); + mpn_copyi (tp, u->_mp_d, un); + + sn = i + mpn_get_str_other ((unsigned char *) sp + i, base, &info, tp, un); + gmp_free_limbs (tp, un); + } + + for (; i < sn; i++) + sp[i] = digits[(unsigned char) sp[i]]; + +ret: + sp[sn] = '\0'; + if (osn && osn != sn + 1) + sp = (char*) gmp_realloc (sp, osn, sn + 1); + return sp; +} + +int +mpz_set_str (mpz_t r, const char *sp, int base) +{ + unsigned bits, value_of_a; + mp_size_t rn, alloc; + mp_ptr rp; + size_t dn, sn; + int sign; + unsigned char *dp; + + assert (base == 0 || (base >= 2 && base <= 62)); + + while (isspace( (unsigned char) *sp)) + sp++; + + sign = (*sp == '-'); + sp += sign; + + if (base == 0) + { + if (sp[0] == '0') + { + if (sp[1] == 'x' || sp[1] == 'X') + { + base = 16; + sp += 2; + } + else if (sp[1] == 'b' || sp[1] == 'B') + { + base = 2; + sp += 2; + } + else + base = 8; + } + else + base = 10; + } + + if (!*sp) + { + r->_mp_size = 0; + return -1; + } + sn = strlen(sp); + dp = (unsigned char *) gmp_alloc (sn); + + value_of_a = (base > 36) ? 36 : 10; + for (dn = 0; *sp; sp++) + { + unsigned digit; + + if (isspace ((unsigned char) *sp)) + continue; + else if (*sp >= '0' && *sp <= '9') + digit = *sp - '0'; + else if (*sp >= 'a' && *sp <= 'z') + digit = *sp - 'a' + value_of_a; + else if (*sp >= 'A' && *sp <= 'Z') + digit = *sp - 'A' + 10; + else + digit = base; /* fail */ + + if (digit >= (unsigned) base) + { + gmp_free (dp, sn); + r->_mp_size = 0; + return -1; + } + + dp[dn++] = digit; + } + + if (!dn) + { + gmp_free (dp, sn); + r->_mp_size = 0; + return -1; + } + bits = mpn_base_power_of_two_p (base); + + if (bits > 0) + { + alloc = (dn * bits + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS; + rp = MPZ_REALLOC (r, alloc); + rn = mpn_set_str_bits (rp, dp, dn, bits); + } + else + { + struct mpn_base_info info; + mpn_get_base_info (&info, base); + alloc = (dn + info.exp - 1) / info.exp; + rp = MPZ_REALLOC (r, alloc); + rn = mpn_set_str_other (rp, dp, dn, base, &info); + /* Normalization, needed for all-zero input. */ + assert (rn > 0); + rn -= rp[rn-1] == 0; + } + assert (rn <= alloc); + gmp_free (dp, sn); + + r->_mp_size = sign ? - rn : rn; + + return 0; +} + +int +mpz_init_set_str (mpz_t r, const char *sp, int base) +{ + mpz_init (r); + return mpz_set_str (r, sp, base); +} + +size_t +mpz_out_str (FILE *stream, int base, const mpz_t x) +{ + char *str; + size_t len, n; + + str = mpz_get_str (NULL, base, x); + if (!str) + return 0; + len = strlen (str); + n = fwrite (str, 1, len, stream); + gmp_free (str, len + 1); + return n; +} + + +static int +gmp_detect_endian (void) +{ + static const int i = 2; + const unsigned char *p = (const unsigned char *) &i; + return 1 - *p; +} + +/* Import and export. Does not support nails. */ +void +mpz_import (mpz_t r, size_t count, int order, size_t size, int endian, + size_t nails, const void *src) +{ + const unsigned char *p; + ptrdiff_t word_step; + mp_ptr rp; + mp_size_t rn; + + /* The current (partial) limb. */ + mp_limb_t limb; + /* The number of bytes already copied to this limb (starting from + the low end). */ + size_t bytes; + /* The index where the limb should be stored, when completed. */ + mp_size_t i; + + if (nails != 0) + gmp_die ("mpz_import: Nails not supported."); + + assert (order == 1 || order == -1); + assert (endian >= -1 && endian <= 1); + + if (endian == 0) + endian = gmp_detect_endian (); + + p = (unsigned char *) src; + + word_step = (order != endian) ? 2 * size : 0; + + /* Process bytes from the least significant end, so point p at the + least significant word. */ + if (order == 1) + { + p += size * (count - 1); + word_step = - word_step; + } + + /* And at least significant byte of that word. */ + if (endian == 1) + p += (size - 1); + + rn = (size * count + sizeof(mp_limb_t) - 1) / sizeof(mp_limb_t); + rp = MPZ_REALLOC (r, rn); + + for (limb = 0, bytes = 0, i = 0; count > 0; count--, p += word_step) + { + size_t j; + for (j = 0; j < size; j++, p -= (ptrdiff_t) endian) + { + limb |= (mp_limb_t) *p << (bytes++ * CHAR_BIT); + if (bytes == sizeof(mp_limb_t)) + { + rp[i++] = limb; + bytes = 0; + limb = 0; + } + } + } + assert (i + (bytes > 0) == rn); + if (limb != 0) + rp[i++] = limb; + else + i = mpn_normalized_size (rp, i); + + r->_mp_size = i; +} + +void * +mpz_export (void *r, size_t *countp, int order, size_t size, int endian, + size_t nails, const mpz_t u) +{ + size_t count; + mp_size_t un; + + if (nails != 0) + gmp_die ("mpz_export: Nails not supported."); + + assert (order == 1 || order == -1); + assert (endian >= -1 && endian <= 1); + assert (size > 0 || u->_mp_size == 0); + + un = u->_mp_size; + count = 0; + if (un != 0) + { + size_t k; + unsigned char *p; + ptrdiff_t word_step; + /* The current (partial) limb. */ + mp_limb_t limb; + /* The number of bytes left to do in this limb. */ + size_t bytes; + /* The index where the limb was read. */ + mp_size_t i; + + un = GMP_ABS (un); + + /* Count bytes in top limb. */ + limb = u->_mp_d[un-1]; + assert (limb != 0); + + k = (GMP_LIMB_BITS <= CHAR_BIT); + if (!k) + { + do { + int LOCAL_CHAR_BIT = CHAR_BIT; + k++; limb >>= LOCAL_CHAR_BIT; + } while (limb != 0); + } + /* else limb = 0; */ + + count = (k + (un-1) * sizeof (mp_limb_t) + size - 1) / size; + + if (!r) + r = gmp_alloc (count * size); + + if (endian == 0) + endian = gmp_detect_endian (); + + p = (unsigned char *) r; + + word_step = (order != endian) ? 2 * size : 0; + + /* Process bytes from the least significant end, so point p at the + least significant word. */ + if (order == 1) + { + p += size * (count - 1); + word_step = - word_step; + } + + /* And at least significant byte of that word. */ + if (endian == 1) + p += (size - 1); + + for (bytes = 0, i = 0, k = 0; k < count; k++, p += word_step) + { + size_t j; + for (j = 0; j < size; ++j, p -= (ptrdiff_t) endian) + { + if (sizeof (mp_limb_t) == 1) + { + if (i < un) + *p = u->_mp_d[i++]; + else + *p = 0; + } + else + { + int LOCAL_CHAR_BIT = CHAR_BIT; + if (bytes == 0) + { + if (i < un) + limb = u->_mp_d[i++]; + bytes = sizeof (mp_limb_t); + } + *p = limb; + limb >>= LOCAL_CHAR_BIT; + bytes--; + } + } + } + assert (i == un); + assert (k == count); + } + + if (countp) + *countp = count; + + return r; +} diff --git a/src/mini-gmp/mini-gmp.h b/src/mini-gmp/mini-gmp.h new file mode 100644 index 0000000..f28cb36 --- /dev/null +++ b/src/mini-gmp/mini-gmp.h @@ -0,0 +1,311 @@ +/* mini-gmp, a minimalistic implementation of a GNU GMP subset. + +Copyright 2011-2015, 2017, 2019-2021 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP Library is free software; you can redistribute it and/or modify +it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + +or + + * the GNU General Public License as published by the Free Software + Foundation; either version 2 of the License, or (at your option) any + later version. + +or both in parallel, as here. + +The GNU MP Library is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received copies of the GNU General Public License and the +GNU Lesser General Public License along with the GNU MP Library. If not, +see https://www.gnu.org/licenses/. */ + +/* About mini-gmp: This is a minimal implementation of a subset of the + GMP interface. It is intended for inclusion into applications which + have modest bignums needs, as a fallback when the real GMP library + is not installed. + + This file defines the public interface. */ + +#ifndef __MINI_GMP_H__ +#define __MINI_GMP_H__ + +/* For size_t */ +#include + +#if defined (__cplusplus) +extern "C" { +#endif + +void mp_set_memory_functions (void *(*) (size_t), + void *(*) (void *, size_t, size_t), + void (*) (void *, size_t)); + +void mp_get_memory_functions (void *(**) (size_t), + void *(**) (void *, size_t, size_t), + void (**) (void *, size_t)); + +#ifndef MINI_GMP_LIMB_TYPE +#define MINI_GMP_LIMB_TYPE long +#endif + +typedef unsigned MINI_GMP_LIMB_TYPE mp_limb_t; +typedef long mp_size_t; +typedef unsigned long mp_bitcnt_t; + +typedef mp_limb_t *mp_ptr; +typedef const mp_limb_t *mp_srcptr; + +typedef struct +{ + int _mp_alloc; /* Number of *limbs* allocated and pointed + to by the _mp_d field. */ + int _mp_size; /* abs(_mp_size) is the number of limbs the + last field points to. If _mp_size is + negative this is a negative number. */ + mp_limb_t *_mp_d; /* Pointer to the limbs. */ +} __mpz_struct; + +typedef __mpz_struct mpz_t[1]; + +typedef __mpz_struct *mpz_ptr; +typedef const __mpz_struct *mpz_srcptr; + +extern const int mp_bits_per_limb; + +void mpn_copyi (mp_ptr, mp_srcptr, mp_size_t); +void mpn_copyd (mp_ptr, mp_srcptr, mp_size_t); +void mpn_zero (mp_ptr, mp_size_t); + +int mpn_cmp (mp_srcptr, mp_srcptr, mp_size_t); +int mpn_zero_p (mp_srcptr, mp_size_t); + +mp_limb_t mpn_add_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); +mp_limb_t mpn_add_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); +mp_limb_t mpn_add (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t); + +mp_limb_t mpn_sub_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); +mp_limb_t mpn_sub_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); +mp_limb_t mpn_sub (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t); + +mp_limb_t mpn_mul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); +mp_limb_t mpn_addmul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); +mp_limb_t mpn_submul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); + +mp_limb_t mpn_mul (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t); +void mpn_mul_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); +void mpn_sqr (mp_ptr, mp_srcptr, mp_size_t); +int mpn_perfect_square_p (mp_srcptr, mp_size_t); +mp_size_t mpn_sqrtrem (mp_ptr, mp_ptr, mp_srcptr, mp_size_t); +mp_size_t mpn_gcd (mp_ptr, mp_ptr, mp_size_t, mp_ptr, mp_size_t); + +mp_limb_t mpn_lshift (mp_ptr, mp_srcptr, mp_size_t, unsigned int); +mp_limb_t mpn_rshift (mp_ptr, mp_srcptr, mp_size_t, unsigned int); + +mp_bitcnt_t mpn_scan0 (mp_srcptr, mp_bitcnt_t); +mp_bitcnt_t mpn_scan1 (mp_srcptr, mp_bitcnt_t); + +void mpn_com (mp_ptr, mp_srcptr, mp_size_t); +mp_limb_t mpn_neg (mp_ptr, mp_srcptr, mp_size_t); + +mp_bitcnt_t mpn_popcount (mp_srcptr, mp_size_t); + +mp_limb_t mpn_invert_3by2 (mp_limb_t, mp_limb_t); +#define mpn_invert_limb(x) mpn_invert_3by2 ((x), 0) + +size_t mpn_get_str (unsigned char *, int, mp_ptr, mp_size_t); +mp_size_t mpn_set_str (mp_ptr, const unsigned char *, size_t, int); + +void mpz_init (mpz_t); +void mpz_init2 (mpz_t, mp_bitcnt_t); +void mpz_clear (mpz_t); + +#define mpz_odd_p(z) (((z)->_mp_size != 0) & (int) (z)->_mp_d[0]) +#define mpz_even_p(z) (! mpz_odd_p (z)) + +int mpz_sgn (const mpz_t); +int mpz_cmp_si (const mpz_t, long); +int mpz_cmp_ui (const mpz_t, unsigned long); +int mpz_cmp (const mpz_t, const mpz_t); +int mpz_cmpabs_ui (const mpz_t, unsigned long); +int mpz_cmpabs (const mpz_t, const mpz_t); +int mpz_cmp_d (const mpz_t, double); +int mpz_cmpabs_d (const mpz_t, double); + +void mpz_abs (mpz_t, const mpz_t); +void mpz_neg (mpz_t, const mpz_t); +void mpz_swap (mpz_t, mpz_t); + +void mpz_add_ui (mpz_t, const mpz_t, unsigned long); +void mpz_add (mpz_t, const mpz_t, const mpz_t); +void mpz_sub_ui (mpz_t, const mpz_t, unsigned long); +void mpz_ui_sub (mpz_t, unsigned long, const mpz_t); +void mpz_sub (mpz_t, const mpz_t, const mpz_t); + +void mpz_mul_si (mpz_t, const mpz_t, long int); +void mpz_mul_ui (mpz_t, const mpz_t, unsigned long int); +void mpz_mul (mpz_t, const mpz_t, const mpz_t); +void mpz_mul_2exp (mpz_t, const mpz_t, mp_bitcnt_t); +void mpz_addmul_ui (mpz_t, const mpz_t, unsigned long int); +void mpz_addmul (mpz_t, const mpz_t, const mpz_t); +void mpz_submul_ui (mpz_t, const mpz_t, unsigned long int); +void mpz_submul (mpz_t, const mpz_t, const mpz_t); + +void mpz_cdiv_qr (mpz_t, mpz_t, const mpz_t, const mpz_t); +void mpz_fdiv_qr (mpz_t, mpz_t, const mpz_t, const mpz_t); +void mpz_tdiv_qr (mpz_t, mpz_t, const mpz_t, const mpz_t); +void mpz_cdiv_q (mpz_t, const mpz_t, const mpz_t); +void mpz_fdiv_q (mpz_t, const mpz_t, const mpz_t); +void mpz_tdiv_q (mpz_t, const mpz_t, const mpz_t); +void mpz_cdiv_r (mpz_t, const mpz_t, const mpz_t); +void mpz_fdiv_r (mpz_t, const mpz_t, const mpz_t); +void mpz_tdiv_r (mpz_t, const mpz_t, const mpz_t); + +void mpz_cdiv_q_2exp (mpz_t, const mpz_t, mp_bitcnt_t); +void mpz_fdiv_q_2exp (mpz_t, const mpz_t, mp_bitcnt_t); +void mpz_tdiv_q_2exp (mpz_t, const mpz_t, mp_bitcnt_t); +void mpz_cdiv_r_2exp (mpz_t, const mpz_t, mp_bitcnt_t); +void mpz_fdiv_r_2exp (mpz_t, const mpz_t, mp_bitcnt_t); +void mpz_tdiv_r_2exp (mpz_t, const mpz_t, mp_bitcnt_t); + +void mpz_mod (mpz_t, const mpz_t, const mpz_t); + +void mpz_divexact (mpz_t, const mpz_t, const mpz_t); + +int mpz_divisible_p (const mpz_t, const mpz_t); +int mpz_congruent_p (const mpz_t, const mpz_t, const mpz_t); + +unsigned long mpz_cdiv_qr_ui (mpz_t, mpz_t, const mpz_t, unsigned long); +unsigned long mpz_fdiv_qr_ui (mpz_t, mpz_t, const mpz_t, unsigned long); +unsigned long mpz_tdiv_qr_ui (mpz_t, mpz_t, const mpz_t, unsigned long); +unsigned long mpz_cdiv_q_ui (mpz_t, const mpz_t, unsigned long); +unsigned long mpz_fdiv_q_ui (mpz_t, const mpz_t, unsigned long); +unsigned long mpz_tdiv_q_ui (mpz_t, const mpz_t, unsigned long); +unsigned long mpz_cdiv_r_ui (mpz_t, const mpz_t, unsigned long); +unsigned long mpz_fdiv_r_ui (mpz_t, const mpz_t, unsigned long); +unsigned long mpz_tdiv_r_ui (mpz_t, const mpz_t, unsigned long); +unsigned long mpz_cdiv_ui (const mpz_t, unsigned long); +unsigned long mpz_fdiv_ui (const mpz_t, unsigned long); +unsigned long mpz_tdiv_ui (const mpz_t, unsigned long); + +unsigned long mpz_mod_ui (mpz_t, const mpz_t, unsigned long); + +void mpz_divexact_ui (mpz_t, const mpz_t, unsigned long); + +int mpz_divisible_ui_p (const mpz_t, unsigned long); + +unsigned long mpz_gcd_ui (mpz_t, const mpz_t, unsigned long); +void mpz_gcd (mpz_t, const mpz_t, const mpz_t); +void mpz_gcdext (mpz_t, mpz_t, mpz_t, const mpz_t, const mpz_t); +void mpz_lcm_ui (mpz_t, const mpz_t, unsigned long); +void mpz_lcm (mpz_t, const mpz_t, const mpz_t); +int mpz_invert (mpz_t, const mpz_t, const mpz_t); + +void mpz_sqrtrem (mpz_t, mpz_t, const mpz_t); +void mpz_sqrt (mpz_t, const mpz_t); +int mpz_perfect_square_p (const mpz_t); + +void mpz_pow_ui (mpz_t, const mpz_t, unsigned long); +void mpz_ui_pow_ui (mpz_t, unsigned long, unsigned long); +void mpz_powm (mpz_t, const mpz_t, const mpz_t, const mpz_t); +void mpz_powm_ui (mpz_t, const mpz_t, unsigned long, const mpz_t); + +void mpz_rootrem (mpz_t, mpz_t, const mpz_t, unsigned long); +int mpz_root (mpz_t, const mpz_t, unsigned long); + +void mpz_fac_ui (mpz_t, unsigned long); +void mpz_2fac_ui (mpz_t, unsigned long); +void mpz_mfac_uiui (mpz_t, unsigned long, unsigned long); +void mpz_bin_uiui (mpz_t, unsigned long, unsigned long); + +int mpz_probab_prime_p (const mpz_t, int); + +int mpz_tstbit (const mpz_t, mp_bitcnt_t); +void mpz_setbit (mpz_t, mp_bitcnt_t); +void mpz_clrbit (mpz_t, mp_bitcnt_t); +void mpz_combit (mpz_t, mp_bitcnt_t); + +void mpz_com (mpz_t, const mpz_t); +void mpz_and (mpz_t, const mpz_t, const mpz_t); +void mpz_ior (mpz_t, const mpz_t, const mpz_t); +void mpz_xor (mpz_t, const mpz_t, const mpz_t); + +mp_bitcnt_t mpz_popcount (const mpz_t); +mp_bitcnt_t mpz_hamdist (const mpz_t, const mpz_t); +mp_bitcnt_t mpz_scan0 (const mpz_t, mp_bitcnt_t); +mp_bitcnt_t mpz_scan1 (const mpz_t, mp_bitcnt_t); + +int mpz_fits_slong_p (const mpz_t); +int mpz_fits_ulong_p (const mpz_t); +int mpz_fits_sint_p (const mpz_t); +int mpz_fits_uint_p (const mpz_t); +int mpz_fits_sshort_p (const mpz_t); +int mpz_fits_ushort_p (const mpz_t); +long int mpz_get_si (const mpz_t); +unsigned long int mpz_get_ui (const mpz_t); +double mpz_get_d (const mpz_t); +size_t mpz_size (const mpz_t); +mp_limb_t mpz_getlimbn (const mpz_t, mp_size_t); + +void mpz_realloc2 (mpz_t, mp_bitcnt_t); +mp_srcptr mpz_limbs_read (mpz_srcptr); +mp_ptr mpz_limbs_modify (mpz_t, mp_size_t); +mp_ptr mpz_limbs_write (mpz_t, mp_size_t); +void mpz_limbs_finish (mpz_t, mp_size_t); +mpz_srcptr mpz_roinit_n (mpz_t, mp_srcptr, mp_size_t); + +#define MPZ_ROINIT_N(xp, xs) {{0, (xs),(xp) }} + +void mpz_set_si (mpz_t, signed long int); +void mpz_set_ui (mpz_t, unsigned long int); +void mpz_set (mpz_t, const mpz_t); +void mpz_set_d (mpz_t, double); + +void mpz_init_set_si (mpz_t, signed long int); +void mpz_init_set_ui (mpz_t, unsigned long int); +void mpz_init_set (mpz_t, const mpz_t); +void mpz_init_set_d (mpz_t, double); + +size_t mpz_sizeinbase (const mpz_t, int); +char *mpz_get_str (char *, int, const mpz_t); +int mpz_set_str (mpz_t, const char *, int); +int mpz_init_set_str (mpz_t, const char *, int); + +/* This long list taken from gmp.h. */ +/* For reference, "defined(EOF)" cannot be used here. In g++ 2.95.4, + defines EOF but not FILE. */ +#if defined (FILE) \ + || defined (H_STDIO) \ + || defined (_H_STDIO) /* AIX */ \ + || defined (_STDIO_H) /* glibc, Sun, SCO */ \ + || defined (_STDIO_H_) /* BSD, OSF */ \ + || defined (__STDIO_H) /* Borland */ \ + || defined (__STDIO_H__) /* IRIX */ \ + || defined (_STDIO_INCLUDED) /* HPUX */ \ + || defined (__dj_include_stdio_h_) /* DJGPP */ \ + || defined (_FILE_DEFINED) /* Microsoft */ \ + || defined (__STDIO__) /* Apple MPW MrC */ \ + || defined (_MSL_STDIO_H) /* Metrowerks */ \ + || defined (_STDIO_H_INCLUDED) /* QNX4 */ \ + || defined (_ISO_STDIO_ISO_H) /* Sun C++ */ \ + || defined (__STDIO_LOADED) /* VMS */ \ + || defined (_STDIO) /* HPE NonStop */ \ + || defined (__DEFINED_FILE) /* musl */ +size_t mpz_out_str (FILE *, int, const mpz_t); +#endif + +void mpz_import (mpz_t, size_t, int, size_t, int, size_t, const void *); +void *mpz_export (void *, size_t *, int, size_t, int, size_t, const mpz_t); + +#if defined (__cplusplus) +} +#endif +#endif /* __MINI_GMP_H__ */ diff --git a/src/klpt/CMakeLists.txt b/src/mp/CMakeLists.txt similarity index 100% rename from src/klpt/CMakeLists.txt rename to src/mp/CMakeLists.txt diff --git a/src/intbig/ref/CMakeLists.txt b/src/mp/ref/CMakeLists.txt similarity index 100% rename from src/intbig/ref/CMakeLists.txt rename to src/mp/ref/CMakeLists.txt diff --git a/src/mp/ref/generic/CMakeLists.txt b/src/mp/ref/generic/CMakeLists.txt new file mode 100644 index 0000000..fe9d5a4 --- /dev/null +++ b/src/mp/ref/generic/CMakeLists.txt @@ -0,0 +1,7 @@ +set(SOURCE_FILES_MP_GENERIC_REF + mp.c +) + +add_library(${LIB_MP} STATIC ${SOURCE_FILES_MP_GENERIC_REF}) +target_include_directories(${LIB_MP} PRIVATE ${INC_PUBLIC} ${INC_COMMON} ${INC_MP}) +target_compile_options(${LIB_MP} PRIVATE ${C_OPT_FLAGS}) \ No newline at end of file diff --git a/src/mp/ref/generic/include/mp.h b/src/mp/ref/generic/include/mp.h new file mode 100644 index 0000000..b3733b5 --- /dev/null +++ b/src/mp/ref/generic/include/mp.h @@ -0,0 +1,88 @@ +#ifndef MP_H +#define MP_H + +#include +#include +#include + +// Functions taken from the GF module + +void mp_add(digit_t *c, const digit_t *a, const digit_t *b, const unsigned int nwords); +digit_t mp_shiftr(digit_t *x, const unsigned int shift, const unsigned int nwords); +void multiple_mp_shiftl(digit_t *x, const unsigned int shift, const unsigned int nwords); +void mp_shiftl(digit_t *x, const unsigned int shift, const unsigned int nwords); +void MUL(digit_t *out, const digit_t a, const digit_t b); + +// Functions taken from the EC module + +void mp_sub(digit_t *c, const digit_t *a, const digit_t *b, const unsigned int nwords); +void select_ct(digit_t *c, const digit_t *a, const digit_t *b, const digit_t mask, const int nwords); +void swap_ct(digit_t *a, digit_t *b, const digit_t option, const int nwords); +int mp_compare(const digit_t *a, const digit_t *b, unsigned int nwords); +bool mp_is_zero(const digit_t *a, unsigned int nwords); +void mp_mul2(digit_t *c, const digit_t *a, const digit_t *b); + +// Further functions for multiprecision arithmetic +void mp_print(const digit_t *a, size_t nwords); +void mp_copy(digit_t *b, const digit_t *a, size_t nwords); +void mp_neg(digit_t *a, unsigned int nwords); +bool mp_is_one(const digit_t *x, unsigned int nwords); +void mp_mul(digit_t *c, const digit_t *a, const digit_t *b, size_t nwords); +void mp_mod_2exp(digit_t *a, unsigned int e, unsigned int nwords); +void mp_inv_2e(digit_t *b, const digit_t *a, int e, unsigned int nwords); +void mp_invert_matrix(digit_t *r1, digit_t *r2, digit_t *s1, digit_t *s2, int e, unsigned int nwords); + +#define mp_is_odd(x, nwords) (((nwords) != 0) & (int)(x)[0]) +#define mp_is_even(x, nwords) (!mp_is_odd(x, nwords)) + +/********************** Constant-time unsigned comparisons ***********************/ + +// The following functions return 1 (TRUE) if condition is true, 0 (FALSE) otherwise +static inline unsigned int +is_digit_nonzero_ct(digit_t x) +{ // Is x != 0? + return (unsigned int)((x | (0 - x)) >> (RADIX - 1)); +} + +static inline unsigned int +is_digit_zero_ct(digit_t x) +{ // Is x = 0? + return (unsigned int)(1 ^ is_digit_nonzero_ct(x)); +} + +static inline unsigned int +is_digit_lessthan_ct(digit_t x, digit_t y) +{ // Is x < y? + return (unsigned int)((x ^ ((x ^ y) | ((x - y) ^ y))) >> (RADIX - 1)); +} + +/********************** Platform-independent macros for digit-size operations + * **********************/ + +// Digit addition with carry +#define ADDC(sumOut, carryOut, addend1, addend2, carryIn) \ + { \ + digit_t tempReg = (addend1) + (digit_t)(carryIn); \ + (sumOut) = (addend2) + tempReg; \ + (carryOut) = (is_digit_lessthan_ct(tempReg, (digit_t)(carryIn)) | is_digit_lessthan_ct((sumOut), tempReg)); \ + } + +// Digit subtraction with borrow +#define SUBC(differenceOut, borrowOut, minuend, subtrahend, borrowIn) \ + { \ + digit_t tempReg = (minuend) - (subtrahend); \ + unsigned int borrowReg = \ + (is_digit_lessthan_ct((minuend), (subtrahend)) | ((borrowIn) & is_digit_zero_ct(tempReg))); \ + (differenceOut) = tempReg - (digit_t)(borrowIn); \ + (borrowOut) = borrowReg; \ + } + +// Shift right with flexible datatype +#define SHIFTR(highIn, lowIn, shift, shiftOut, DigitSize) \ + (shiftOut) = ((lowIn) >> (shift)) ^ ((highIn) << (DigitSize - (shift))); + +// Digit shift left +#define SHIFTL(highIn, lowIn, shift, shiftOut, DigitSize) \ + (shiftOut) = ((highIn) << (shift)) ^ ((lowIn) >> (RADIX - (shift))); + +#endif diff --git a/src/mp/ref/generic/mp.c b/src/mp/ref/generic/mp.c new file mode 100644 index 0000000..27f4a96 --- /dev/null +++ b/src/mp/ref/generic/mp.c @@ -0,0 +1,357 @@ +#include +#include +#include +#include + +// double-wide multiplication +void +MUL(digit_t *out, const digit_t a, const digit_t b) +{ +#ifdef RADIX_32 + uint64_t r = (uint64_t)a * b; + out[0] = r & 0xFFFFFFFFUL; + out[1] = r >> 32; + +#elif defined(RADIX_64) && defined(_MSC_VER) + uint64_t umul_hi; + out[0] = _umul128(a, b, &umul_hi); + out[1] = umul_hi; + +#elif defined(RADIX_64) && defined(HAVE_UINT128) + unsigned __int128 umul_tmp; + umul_tmp = (unsigned __int128)(a) * (unsigned __int128)(b); + out[0] = (uint64_t)umul_tmp; + out[1] = (uint64_t)(umul_tmp >> 64); + +#else + register digit_t al, ah, bl, bh, temp; + digit_t albl, albh, ahbl, ahbh, res1, res2, res3, carry; + digit_t mask_low = (digit_t)(-1) >> (sizeof(digit_t) * 4), mask_high = (digit_t)(-1) << (sizeof(digit_t) * 4); + al = a & mask_low; // Low part + ah = a >> (sizeof(digit_t) * 4); // High part + bl = b & mask_low; + bh = b >> (sizeof(digit_t) * 4); + + albl = al * bl; + albh = al * bh; + ahbl = ah * bl; + ahbh = ah * bh; + out[0] = albl & mask_low; // out00 + + res1 = albl >> (sizeof(digit_t) * 4); + res2 = ahbl & mask_low; + res3 = albh & mask_low; + temp = res1 + res2 + res3; + carry = temp >> (sizeof(digit_t) * 4); + out[0] ^= temp << (sizeof(digit_t) * 4); // out01 + + res1 = ahbl >> (sizeof(digit_t) * 4); + res2 = albh >> (sizeof(digit_t) * 4); + res3 = ahbh & mask_low; + temp = res1 + res2 + res3 + carry; + out[1] = temp & mask_low; // out10 + carry = temp & mask_high; + out[1] ^= (ahbh & mask_high) + carry; // out11 + +#endif +} + +void +mp_add(digit_t *c, const digit_t *a, const digit_t *b, const unsigned int nwords) +{ // Multiprecision addition + unsigned int i, carry = 0; + + for (i = 0; i < nwords; i++) { + ADDC(c[i], carry, a[i], b[i], carry); + } +} + +digit_t +mp_shiftr(digit_t *x, const unsigned int shift, const unsigned int nwords) +{ // Multiprecision right shift by 1...RADIX-1 + digit_t bit_out = x[0] & 1; + + for (unsigned int i = 0; i < nwords - 1; i++) { + SHIFTR(x[i + 1], x[i], shift, x[i], RADIX); + } + x[nwords - 1] >>= shift; + return bit_out; +} + +void +mp_shiftl(digit_t *x, const unsigned int shift, const unsigned int nwords) +{ // Multiprecision left shift by 1...RADIX-1 + + for (int i = nwords - 1; i > 0; i--) { + SHIFTL(x[i], x[i - 1], shift, x[i], RADIX); + } + x[0] <<= shift; +} + +void +multiple_mp_shiftl(digit_t *x, const unsigned int shift, const unsigned int nwords) +{ + int t = shift; + while (t > RADIX - 1) { + mp_shiftl(x, RADIX - 1, nwords); + t = t - (RADIX - 1); + } + mp_shiftl(x, t, nwords); +} + +// The below functions were taken from the EC module + +void +mp_sub(digit_t *c, const digit_t *a, const digit_t *b, const unsigned int nwords) +{ // Multiprecision subtraction, assuming a > b + unsigned int i, borrow = 0; + + for (i = 0; i < nwords; i++) { + SUBC(c[i], borrow, a[i], b[i], borrow); + } +} + +void +select_ct(digit_t *c, const digit_t *a, const digit_t *b, const digit_t mask, const int nwords) +{ // Select c <- a if mask = 0, select c <- b if mask = 1...1 + + for (int i = 0; i < nwords; i++) { + c[i] = ((a[i] ^ b[i]) & mask) ^ a[i]; + } +} + +void +swap_ct(digit_t *a, digit_t *b, const digit_t option, const int nwords) +{ // Swap entries + // If option = 0 then P <- P and Q <- Q, else if option = 0xFF...FF then a <- b and b <- a + digit_t temp; + + for (int i = 0; i < nwords; i++) { + temp = option & (a[i] ^ b[i]); + a[i] = temp ^ a[i]; + b[i] = temp ^ b[i]; + } +} + +int +mp_compare(const digit_t *a, const digit_t *b, unsigned int nwords) +{ // Multiprecision comparison, a=b? : (1) a>b, (0) a=b, (-1) a= 0; i--) { + if (a[i] > b[i]) + return 1; + else if (a[i] < b[i]) + return -1; + } + return 0; +} + +bool +mp_is_zero(const digit_t *a, unsigned int nwords) +{ // Is a multiprecision element zero? + // Returns 1 (true) if a=0, 0 (false) otherwise + digit_t r = 0; + + for (unsigned int i = 0; i < nwords; i++) + r |= a[i] ^ 0; + + return (bool)is_digit_zero_ct(r); +} + +void +mp_mul2(digit_t *c, const digit_t *a, const digit_t *b) +{ // Multiprecision multiplication fixed to two-digit operands + unsigned int carry = 0; + digit_t t0[2], t1[2], t2[2]; + + MUL(t0, a[0], b[0]); + MUL(t1, a[0], b[1]); + ADDC(t0[1], carry, t0[1], t1[0], carry); + ADDC(t1[1], carry, 0, t1[1], carry); + MUL(t2, a[1], b[1]); + ADDC(t2[0], carry, t2[0], t1[1], carry); + ADDC(t2[1], carry, 0, t2[1], carry); + c[0] = t0[0]; + c[1] = t0[1]; + c[2] = t2[0]; + c[3] = t2[1]; +} + +void +mp_print(const digit_t *a, size_t nwords) +{ + printf("0x"); + for (size_t i = 0; i < nwords; i++) { +#ifdef RADIX_32 + printf("%08" PRIx32, a[nwords - i - 1]); // Print each word with 8 hex digits +#elif defined(RADIX_64) + printf("%016" PRIx64, a[nwords - i - 1]); // Print each word with 16 hex digits +#endif + } +} + +void +mp_copy(digit_t *b, const digit_t *a, size_t nwords) +{ + for (size_t i = 0; i < nwords; i++) { + b[i] = a[i]; + } +} + +void +mp_mul(digit_t *c, const digit_t *a, const digit_t *b, size_t nwords) +{ + // Multiprecision multiplication, c = a*b, for nwords-digit inputs, with nwords-digit output + // explicitly does not use the higher half of c, as we do not need in our applications + digit_t carry, UV[2], t[nwords], cc[nwords]; + + for (size_t i = 0; i < nwords; i++) { + cc[i] = 0; + } + + for (size_t i = 0; i < nwords; i++) { + + MUL(t, a[i], b[0]); + + for (size_t j = 1; j < nwords - 1; j++) { + MUL(UV, a[i], b[j]); + ADDC(t[j], carry, t[j], UV[0], 0); + t[j + 1] = UV[1] + carry; + } + + int j = nwords - 1; + MUL(UV, a[i], b[j]); + ADDC(t[j], carry, t[j], UV[0], 0); + + mp_add(&cc[i], &cc[i], t, nwords - i); + } + + mp_copy(c, cc, nwords); +} + +void +mp_mod_2exp(digit_t *a, unsigned int e, unsigned int nwords) +{ // Multiprecision modulo 2^e, with 0 <= a < 2^(e) + unsigned int i, q = e >> LOG2RADIX, r = e & (RADIX - 1); + + if (q < nwords) { + a[q] &= ((digit_t)1 << r) - 1; + + for (i = q + 1; i < nwords; i++) { + a[i] = 0; + } + } +} + +void +mp_neg(digit_t *a, unsigned int nwords) +{ // negates a + for (size_t i = 0; i < nwords; i++) { + a[i] ^= -1; + } + + a[0] += 1; +} + +bool +mp_is_one(const digit_t *x, unsigned int nwords) +{ // returns true if x represents 1, and false otherwise + if (x[0] != 1) { + return false; + } + + for (size_t i = 1; i < nwords; i++) { + if (x[i] != 0) { + return false; + } + } + return true; +} + +void +mp_inv_2e(digit_t *b, const digit_t *a, int e, unsigned int nwords) +{ // Inversion modulo 2^e, using Newton's method and Hensel lifting + // we take the first power of 2 larger than e to use + // requires a to be odd, of course + // returns b such that a*b = 1 mod 2^e + assert((a[0] & 1) == 1); + + digit_t x[nwords], y[nwords], aa[nwords], mp_one[nwords], tmp[nwords]; + mp_copy(aa, a, nwords); + + mp_one[0] = 1; + for (unsigned int i = 1; i < nwords; i++) { + mp_one[i] = 0; + } + + int p = 1; + while ((1 << p) < e) { + p++; + } + p -= 2; // using k = 4 for initial inverse + int w = (1 << (p + 2)); + + mp_mod_2exp(aa, w, nwords); + mp_add(x, aa, aa, nwords); + mp_add(x, x, aa, nwords); // should be 3a + x[0] ^= (1 << 1); // so that x equals (3a)^2 xor 2 + mp_mod_2exp(x, w, nwords); // now x*a = 1 mod 2^4, which we lift + + mp_mul(tmp, aa, x, nwords); + mp_neg(tmp, nwords); + mp_add(y, mp_one, tmp, nwords); + + // Hensel lifting for p rounds + for (int i = 0; i < p; i++) { + mp_add(tmp, mp_one, y, nwords); + mp_mul(x, x, tmp, nwords); + mp_mul(y, y, y, nwords); + } + + mp_mod_2exp(x, w, nwords); + mp_copy(b, x, nwords); + + // verify results + mp_mul(x, x, aa, nwords); + mp_mod_2exp(x, w, nwords); + assert(mp_is_one(x, nwords)); +} + +void +mp_invert_matrix(digit_t *r1, digit_t *r2, digit_t *s1, digit_t *s2, int e, unsigned int nwords) +{ + // given a matrix ( ( a, b ), (c, d) ) of values mod 2^e + // returns the inverse matrix gamma ( (d, -b), (-c, a) ) + // where gamma is the inverse of the determinant a*d - b*c + // assumes the matrix is invertible, otherwises, inversion of determinant fails + + int p = 1; + while ((1 << p) < e) { + p++; + } + int w = (1 << (p)); + + digit_t det[nwords], tmp[nwords], resa[nwords], resb[nwords], resc[nwords], resd[nwords]; + mp_mul(tmp, r1, s2, nwords); + mp_mul(det, r2, s1, nwords); + mp_sub(det, tmp, det, nwords); + mp_inv_2e(det, det, e, nwords); + + mp_mul(resa, det, s2, nwords); + mp_mul(resb, det, r2, nwords); + mp_mul(resc, det, s1, nwords); + mp_mul(resd, det, r1, nwords); + + mp_neg(resb, nwords); + mp_neg(resc, nwords); + + mp_mod_2exp(resa, w, nwords); + mp_mod_2exp(resb, w, nwords); + mp_mod_2exp(resc, w, nwords); + mp_mod_2exp(resd, w, nwords); + + mp_copy(r1, resa, nwords); + mp_copy(r2, resb, nwords); + mp_copy(s1, resc, nwords); + mp_copy(s2, resd, nwords); +} diff --git a/src/nistapi/lvl1/api.c b/src/nistapi/lvl1/api.c index b709419..baccd59 100644 --- a/src/nistapi/lvl1/api.c +++ b/src/nistapi/lvl1/api.c @@ -3,22 +3,31 @@ #include #include +#if defined(ENABLE_SIGN) + +SQISIGN_API int -crypto_sign_keypair(unsigned char *pk, unsigned char *sk) { +crypto_sign_keypair(unsigned char *pk, unsigned char *sk) +{ return sqisign_keypair(pk, sk); } +SQISIGN_API int crypto_sign(unsigned char *sm, unsigned long long *smlen, const unsigned char *m, unsigned long long mlen, - const unsigned char *sk) { + const unsigned char *sk) +{ return sqisign_sign(sm, smlen, m, mlen, sk); } +#endif +SQISIGN_API int crypto_sign_open(unsigned char *m, unsigned long long *mlen, const unsigned char *sm, unsigned long long smlen, - const unsigned char *pk) { + const unsigned char *pk) +{ return sqisign_open(m, mlen, sm, smlen, pk); } diff --git a/src/nistapi/lvl1/api.h b/src/nistapi/lvl1/api.h index b2bacb8..93a3984 100644 --- a/src/nistapi/lvl1/api.h +++ b/src/nistapi/lvl1/api.h @@ -3,20 +3,27 @@ #ifndef api_h #define api_h -#define CRYPTO_SECRETKEYBYTES 782 -#define CRYPTO_PUBLICKEYBYTES 64 -#define CRYPTO_BYTES 177 +#include -#define CRYPTO_ALGNAME "lvl1" +#define CRYPTO_SECRETKEYBYTES 353 +#define CRYPTO_PUBLICKEYBYTES 65 +#define CRYPTO_BYTES 148 +#define CRYPTO_ALGNAME "SQIsign_lvl1" + +#if defined(ENABLE_SIGN) +SQISIGN_API int crypto_sign_keypair(unsigned char *pk, unsigned char *sk); +SQISIGN_API int crypto_sign(unsigned char *sm, unsigned long long *smlen, const unsigned char *m, unsigned long long mlen, const unsigned char *sk); +#endif +SQISIGN_API int crypto_sign_open(unsigned char *m, unsigned long long *mlen, const unsigned char *sm, unsigned long long smlen, diff --git a/src/nistapi/lvl3/api.c b/src/nistapi/lvl3/api.c index b709419..e01f911 100644 --- a/src/nistapi/lvl3/api.c +++ b/src/nistapi/lvl3/api.c @@ -3,22 +3,30 @@ #include #include +#if defined(ENABLE_SIGN) +SQISIGN_API int -crypto_sign_keypair(unsigned char *pk, unsigned char *sk) { +crypto_sign_keypair(unsigned char *pk, unsigned char *sk) +{ return sqisign_keypair(pk, sk); } +SQISIGN_API int crypto_sign(unsigned char *sm, unsigned long long *smlen, const unsigned char *m, unsigned long long mlen, - const unsigned char *sk) { + const unsigned char *sk) +{ return sqisign_sign(sm, smlen, m, mlen, sk); } +#endif +SQISIGN_API int crypto_sign_open(unsigned char *m, unsigned long long *mlen, const unsigned char *sm, unsigned long long smlen, - const unsigned char *pk) { + const unsigned char *pk) +{ return sqisign_open(m, mlen, sm, smlen, pk); } diff --git a/src/nistapi/lvl3/api.h b/src/nistapi/lvl3/api.h index ff18440..8a37d4b 100644 --- a/src/nistapi/lvl3/api.h +++ b/src/nistapi/lvl3/api.h @@ -3,20 +3,27 @@ #ifndef api_h #define api_h -#define CRYPTO_SECRETKEYBYTES 1138 -#define CRYPTO_PUBLICKEYBYTES 96 -#define CRYPTO_BYTES 263 +#include -#define CRYPTO_ALGNAME "lvl3" +#define CRYPTO_SECRETKEYBYTES 529 +#define CRYPTO_PUBLICKEYBYTES 97 +#define CRYPTO_BYTES 224 +#define CRYPTO_ALGNAME "SQIsign_lvl3" + +#if defined(ENABLE_SIGN) +SQISIGN_API int crypto_sign_keypair(unsigned char *pk, unsigned char *sk); +SQISIGN_API int crypto_sign(unsigned char *sm, unsigned long long *smlen, const unsigned char *m, unsigned long long mlen, const unsigned char *sk); +#endif +SQISIGN_API int crypto_sign_open(unsigned char *m, unsigned long long *mlen, const unsigned char *sm, unsigned long long smlen, diff --git a/src/nistapi/lvl5/api.c b/src/nistapi/lvl5/api.c index b709419..e01f911 100644 --- a/src/nistapi/lvl5/api.c +++ b/src/nistapi/lvl5/api.c @@ -3,22 +3,30 @@ #include #include +#if defined(ENABLE_SIGN) +SQISIGN_API int -crypto_sign_keypair(unsigned char *pk, unsigned char *sk) { +crypto_sign_keypair(unsigned char *pk, unsigned char *sk) +{ return sqisign_keypair(pk, sk); } +SQISIGN_API int crypto_sign(unsigned char *sm, unsigned long long *smlen, const unsigned char *m, unsigned long long mlen, - const unsigned char *sk) { + const unsigned char *sk) +{ return sqisign_sign(sm, smlen, m, mlen, sk); } +#endif +SQISIGN_API int crypto_sign_open(unsigned char *m, unsigned long long *mlen, const unsigned char *sm, unsigned long long smlen, - const unsigned char *pk) { + const unsigned char *pk) +{ return sqisign_open(m, mlen, sm, smlen, pk); } diff --git a/src/nistapi/lvl5/api.h b/src/nistapi/lvl5/api.h index 69226c2..dee239e 100644 --- a/src/nistapi/lvl5/api.h +++ b/src/nistapi/lvl5/api.h @@ -3,20 +3,27 @@ #ifndef api_h #define api_h -#define CRYPTO_SECRETKEYBYTES 1509 -#define CRYPTO_PUBLICKEYBYTES 128 -#define CRYPTO_BYTES 335 +#include -#define CRYPTO_ALGNAME "lvl5" +#define CRYPTO_SECRETKEYBYTES 701 +#define CRYPTO_PUBLICKEYBYTES 129 +#define CRYPTO_BYTES 292 +#define CRYPTO_ALGNAME "SQIsign_lvl5" + +#if defined(ENABLE_SIGN) +SQISIGN_API int crypto_sign_keypair(unsigned char *pk, unsigned char *sk); +SQISIGN_API int crypto_sign(unsigned char *sm, unsigned long long *smlen, const unsigned char *m, unsigned long long mlen, const unsigned char *sk); +#endif +SQISIGN_API int crypto_sign_open(unsigned char *m, unsigned long long *mlen, const unsigned char *sm, unsigned long long smlen, diff --git a/src/precomp/ref/lvl1/CMakeLists.txt b/src/precomp/ref/lvl1/CMakeLists.txt index 2fd08d3..c7637fa 100644 --- a/src/precomp/ref/lvl1/CMakeLists.txt +++ b/src/precomp/ref/lvl1/CMakeLists.txt @@ -1,49 +1 @@ -set(SOURCE_FILES_PRECOMP_${SVARIANT_UPPER}_REF - torsion_constants.c - quaternion_data.c - endomorphism_action.c - klpt_constants.c -) - -add_library(${LIB_PRECOMP_${SVARIANT_UPPER}} ${SOURCE_FILES_PRECOMP_${SVARIANT_UPPER}_REF}) -target_include_directories(${LIB_PRECOMP_${SVARIANT_UPPER}} PRIVATE common ${INC_INTBIG} ${INC_QUATERNION} ${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/src/ec/ref/include ${PROJECT_SOURCE_DIR}/src/ec/ref/${SVARIANT_LOWER}/include ${PROJECT_SOURCE_DIR}/src/gf/ref/${SVARIANT_LOWER}/include ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_COMMON}) -target_compile_options(${LIB_PRECOMP_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_custom_command( - OUTPUT - "${CMAKE_CURRENT_SOURCE_DIR}/torsion_constants.c" - "${CMAKE_CURRENT_SOURCE_DIR}/include/torsion_constants.h" - "${CMAKE_CURRENT_SOURCE_DIR}/include/klpt_constants.h" - "${CMAKE_CURRENT_SOURCE_DIR}/klpt_constants.c" - "${CMAKE_CURRENT_SOURCE_DIR}/include/encoded_sizes.h" - "${PROJECT_SOURCE_DIR}/src/nistapi/lvl1/api.h" - "${CMAKE_CURRENT_SOURCE_DIR}/quaternion_data.c" - "${CMAKE_CURRENT_SOURCE_DIR}/include/quaternion_data.h" - "${CMAKE_CURRENT_SOURCE_DIR}/endomorphism_action.c" - "${CMAKE_CURRENT_SOURCE_DIR}/include/endomorphism_action.h" - COMMAND - echo "Please run manually: make precomp" -) - -find_program(SAGEMATH sage) -add_custom_target(precomp_${SVARIANT_LOWER} - DEPENDS - "./sqisign_parameters.txt" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_torsion_constants.sage" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_klpt_constants.sage" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_sizes.sage" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_quaternion_data.sage" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_endomorphism_action.sage" - WORKING_DIRECTORY - "${CMAKE_CURRENT_SOURCE_DIR}" -) - -set_directory_properties(PROPERTIES CLEAN_NO_CUSTOM true) -set_target_properties(precomp_${SVARIANT_LOWER} PROPERTIES EXCLUDE_FROM_ALL TRUE) - -add_dependencies(precomp precomp_lvl1) +include(../lvlx.cmake) diff --git a/src/precomp/ref/lvl1/e0_basis.c b/src/precomp/ref/lvl1/e0_basis.c new file mode 100644 index 0000000..5be2b8e --- /dev/null +++ b/src/precomp/ref/lvl1/e0_basis.c @@ -0,0 +1,55 @@ +#include +const fp2_t BASIS_E0_PX = { +#if 0 +#elif RADIX == 16 +{0x107, 0xc, 0x1890, 0xf2a, 0x52b, 0xb68, 0x152d, 0xa4c, 0x1054, 0x642, 0x36a, 0x6f8, 0x7ad, 0x146c, 0x1d66, 0x1b67, 0x236, 0x10d, 0x1933, 0x3} +#elif RADIX == 32 +{0x3020e, 0xb795624, 0x5ab6829, 0x1514995, 0x1b5190a, 0x187ad37c, 0x19facd46, 0x8688db6, 0x3c998} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x52b795624001810, 0x8c8505452654b56d, 0xf59a8d87ad37c0da, 0x24e4cc21a236db3} +#else +{0x5bcab12000c08, 0x452654b56d052, 0x26f81b5190a0a, 0x36cfd66a361eb, 0x12726610d11b} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1f87, 0x83e, 0x32e, 0xe58, 0xd9d, 0x1416, 0x752, 0x13b4, 0x1efa, 0xe62, 0x12f5, 0x1907, 0x1814, 0x1ddd, 0x1aa6, 0x1420, 0x2cd, 0x1431, 0x1be2, 0x7} +#elif RADIX == 32 +{0x120fbf0f, 0x1d72c0cb, 0xa54166c, 0x1bea7687, 0x197ab98b, 0x1b814c83, 0x8354ddd, 0x188b368, 0x2df15} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xcd9d72c0cb907df8, 0x5cc5efa9da1d4a82, 0x6a9bbbb814c83cbd, 0x26ef8a8622cda10} +#else +{0x6b96065c83efc, 0x29da1d4a82cd9, 0x190797ab98bdf, 0x6841aa6eeee05, 0x1377c5431166} +#endif +#endif +}; +const fp2_t BASIS_E0_QX = { +#if 0 +#elif RADIX == 16 +{0x5ff, 0x1783, 0xadc, 0x775, 0xad4, 0x593, 0xb4c, 0x21e, 0x1cb2, 0x13d8, 0x179f, 0x680, 0x1a9c, 0x1824, 0x118e, 0x13d9, 0x24, 0x1956, 0x1dd2, 0x9} +#elif RADIX == 32 +{0x5e0cbff, 0x143baab7, 0x9859356, 0x12c843cb, 0xbcfcf63, 0x9a9c340, 0x16631d82, 0xab00927, 0x4ee96} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x6ad43baab72f065f, 0xe7b1cb210f2d30b2, 0xc63b049a9c3405e7, 0x4ff74b2ac0249ec} +#else +{0x21dd55b97832f, 0x210f2d30b26ad, 0x680bcfcf6396, 0x27b318ec126a7, 0x4ffba5956012} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1c7f, 0x1117, 0xa4, 0x1164, 0x6e, 0x1e63, 0x1b7b, 0x1305, 0x424, 0x131a, 0x1b61, 0xae3, 0x17b1, 0xe5e, 0x1848, 0x1e81, 0x14a5, 0x1cb5, 0x1d87, 0x8} +#elif RADIX == 32 +{0x445f8ff, 0xe8b2029, 0xf7e6303, 0x109260bb, 0x1db0cc68, 0x1d7b1571, 0x7090e5, 0x5ad297d, 0x3ec3f} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x606e8b2029222fc7, 0x6634424982edefcc, 0xe121cbd7b1571ed8, 0x4f761f96b4a5f40} +#else +{0x74590149117e3, 0x4982edefcc606, 0x2ae3db0cc6884, 0x7d0384872f5ec, 0x4fbb0fcb5a52} +#endif +#endif +}; diff --git a/src/precomp/ref/lvl1/ec_params.c b/src/precomp/ref/lvl1/ec_params.c new file mode 100644 index 0000000..5011f10 --- /dev/null +++ b/src/precomp/ref/lvl1/ec_params.c @@ -0,0 +1,4 @@ +#include +// p+1 divided by the power of 2 +const digit_t p_cofactor_for_2f[1] = {5}; + diff --git a/src/precomp/ref/lvl1/endomorphism_action.c b/src/precomp/ref/lvl1/endomorphism_action.c index 9114d1e..abeddc3 100644 --- a/src/precomp/ref/lvl1/endomorphism_action.c +++ b/src/precomp/ref/lvl1/endomorphism_action.c @@ -1,56 +1,3336 @@ #include #include #include +const curve_with_endomorphism_ring_t CURVES_WITH_ENDOMORPHISMS[7] = {{{{ #if 0 -#elif 8*DIGIT_LEN == 16 -const ec_basis_t BASIS_EVEN = {{{{0xaa6456e57b3d0e5c, 0x6e1e74cfc06d9529, 0xe77005c1d8e998d9, 0x207aef3d73fb9e71}, {0x918dbc45635410cb, 0x6ee588ba09396573, 0x68aa64be61e6f4c4, 0x16e37aee06350f3}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0xc71dcbb1e0f986f5, 0xbd60f6c8d8c31906, 0x753a060121887848, 0x2104aa23e92066b1}, {0x187b3ab8b007ee01, 0xa0cfdf9999fd088e, 0x1dbb43376c18e129, 0x1be43892abe83cab}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x5f063c05ab333c4b, 0x9432317b20a4a9dd, 0x3d246e5d9e99e169, 0x112c26ed94c42aea}, {0xf650f44ad5ca0053, 0xbe39aa3b866de04d, 0x8eca3998d4b32c4d, 0x24e1dfdd264f7289}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_PLUS = {{{{0x9225eb7dc4964589, 0x84809bd2660ac787, 0x9b120b36af060f7b, 0x26c6e5fb8ba413a2}, {0xc3243c45368044cd, 0xf4c6c6136b0396e3, 0x36e7ca367bcda18e, 0x2b2ea4f64b8d9b4d}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x2e78d4ca270d7e6b, 0xf9ac7eaa9713ab55, 0x6b68d02784ce09b1, 0x33fe700247f21db9}, {0x72995ed7921505e9, 0x9af528d378e626ba, 0x319a09e659f3fbf, 0x14f7b599168ae1bb}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x1fc31ea8afacffa9, 0x2198ad06ba5f7c1e, 0x867ee910c84f9241, 0x22f0ae8a117bf50}, {0x7624b1b2a61cca63, 0x6de050872be1c855, 0xf26e2a76937d44db, 0x13e175482bc586c4}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_MINUS = {{{{0x1821f9af01cc0789, 0x66b67297ef3013a7, 0xe2f055ae52632d3d, 0xdadc43eddf1c21b}, {0xd236109f47f870ac, 0xf229a667744c0266, 0xf9d93d6f01f921fa, 0x2c3b6b5594983796}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x3abe763db230770c, 0xe4f9d39d2c76dbde, 0x15233adf6bc96db0, 0x9e8670c2795523}, {0xd80ba0bdd941e6ea, 0x6ff5c7474a4a781e, 0x9f7a618e8469d0a2, 0x304a4540668f3eb3}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0xb4ac0084a2b43849, 0xf00f44c1e014f6b5, 0x1bd32f9f8e5196ea, 0x15f9e117c931dba}, {0x682ed40c9aba9b0c, 0x23ecbcd17bcf48bb, 0xa965b22a1497f9d3, 0xcc6dae3c8db528a}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_PLUS = {{{{0xb382773d0ee2c6c5, 0x79bf22b00e75b701, 0x3dad4448a15e78b8, 0x2eb8550cb8d850d7}, {0x3289f573f719e381, 0xbeed476da914eb33, 0x6842f12d33d945f8, 0x1198a19ef03352bd}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x2c70e2ff4f8ed280, 0xd57145fbbd907950, 0x1ddf917bc2cd217f, 0x645838fc77dbffc}, {0x964fa32cefd3fdeb, 0xd551d0d6d0d1947b, 0x557b59a0b5fe55fc, 0x26cdcead70200b29}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x1e1dfa89820375fa, 0xf99b7f5e9addf912, 0xb316e64530602ca4, 0x1f6c3e438538999f}, {0x15924ed1bb15198, 0x4b5e6672bbda95e3, 0x6145e2a98ca22c88, 0xfcfc3a246698c7c}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_MINUS = {{{{0x1821f9af01cc0789, 0x66b67297ef3013a7, 0xe2f055ae52632d3d, 0xdadc43eddf1c21b}, {0xd236109f47f870ac, 0xf229a667744c0266, 0xf9d93d6f01f921fa, 0x2c3b6b5594983796}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x3abe763db230770c, 0xe4f9d39d2c76dbde, 0x15233adf6bc96db0, 0x9e8670c2795523}, {0xd80ba0bdd941e6ea, 0x6ff5c7474a4a781e, 0x9f7a618e8469d0a2, 0x304a4540668f3eb3}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0xb4ac0084a2b43849, 0xf00f44c1e014f6b5, 0x1bd32f9f8e5196ea, 0x15f9e117c931dba}, {0x682ed40c9aba9b0c, 0x23ecbcd17bcf48bb, 0xa965b22a1497f9d3, 0xcc6dae3c8db528a}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_CHALLENGE = {{{{0x94437da213f9a8b1, 0xaba06afd54324148, 0x88ae0c022485a5f0, 0x14c75d2e824d358c}, {0xf66dc2e267ccd26c, 0x4874947cabbe1286, 0x9d58768934cf0ac, 0x204e323f499fb9c7}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x6df59b590d8b49c3, 0x1a9d2f960b7a3739, 0xb07ddc58241945ff, 0x3484655e395cb341}, {0x304ad2e438e5e35d, 0x2dae483b5d058280, 0x6f8c329dfd772ab6, 0x3185a956086f9c3a}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0xc005575f13b6b2c2, 0xddf9a6915407672a, 0x2c9a775fc6672c13, 0x1e1cabf3a03e1a97}, {0x63582f61f3e388aa, 0xcb1e01ccb3f27f1d, 0xd2f07c8953154892, 0x31dfa2e1a8469e03}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_curve_t CURVE_E0 = {{{0x0}}, {{0x1}}}; -const ec_point_t CURVE_E0_A24 = {{{0x0}}, {{0x1}}}; -const ibz_mat_2x2_t ACTION_I = {{{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x46a8,0x9057,0x86de,0xcba9,0xc982,0xce00,0x3e5,0xafe9,0x7503,0xb4f7,0x31d9,0x45f1,0xb772,0x4e23,0x3858,0xcfd8,0x4244,0xf58d,0x271b,0x3760,0x5e52,0x9b69,0xb03c,0x29df,0x6f76}}}, {{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x6727,0x3496,0xa592,0xd124,0xb138,0x5406,0x1e37,0xb681,0x76ad,0xc6bb,0x3525,0x6e4f,0xd837,0x95a4,0x9c8e,0x7ab7,0x2da8,0x8205,0x4c09,0x3094,0x3570,0x4038,0x4a69,0x2a6d,0xcee0,0x2}}}}, {{{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x3fa9,0x8525,0xf0a8,0x5add,0xedd1,0xbf8,0xc425,0xab51,0x3750,0x2506,0x4007,0x68,0x782a,0x50ad,0xac25,0x9d19,0x61a2,0x845b,0x6841,0x3bfe,0x18f1,0x7633,0x7ee4,0x8fe2,0x2e11,0x5}}}, {{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0xb958,0x6fa8,0x7921,0x3456,0xfe7d,0x2ee0,0xd079,0xa9ed,0x3802,0xb215,0xfbd7,0x2861,0xd953,0xec53,0xc535,0xdcd9,0x22ea,0x9a6c,0x7b8,0x3207,0x7ed8,0x88c4,0x5112,0xbcd6,0x8860,0xb}}}}}; -const ibz_mat_2x2_t ACTION_J = {{{{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x8354,0xab63,0x73ba,0x2683,0x8448,0x368b,0x2cd5,0xc866,0x2b98,0x9216,0x53,0x88ab,0x347b,0xb226,0xfa60,0x3176,0x6542,0x6238,0x1e2c,0xa818,0x32f4,0xaf7a,0x882d,0xd0e1,0x29ca,0x6}}}, {{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x10cf,0xf3dd,0x6e4e,0xe4d9,0xded9,0xd202,0x9877,0x2a7d,0x622f,0x396a,0xa0ef,0x5d91,0x65aa,0x4bcc,0xc09e,0x6a38,0x1eed,0x73c8,0x2bad,0xd729,0x39c9,0xaf44,0xfe5b,0x426b,0x97df,0x4}}}}, {{{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0xfebf,0x9134,0xff6b,0xdcc8,0xc195,0xc004,0xcffc,0xdb6,0xe162,0xffcc,0x3ce8,0xa30f,0x3924,0x8354,0xfb23,0xd944,0x52f4,0x6855,0x8c09,0xeb48,0x7623,0xb14a,0x6d25,0x3a99,0xc7db,0x5}}}, {{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x7cac,0x549c,0x8c45,0xd97c,0x43b7,0xc656,0xa789,0x9170,0x816d,0xd4f6,0x2d5d,0xe5a8,0x5c49,0x8851,0x32d,0x7b3b,0xffed,0x2dc0,0x10a8,0xc14f,0xaa35,0x74b3,0x7921,0x15d4,0xce0c,0x5}}}}}; -const ibz_mat_2x2_t ACTION_K = {{{{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0xcf39,0x123e,0x7e70,0x506e,0xc931,0x1913,0x6a42,0xc5f,0x890e,0x46e0,0x8d25,0x8c50,0x50f6,0x2e4e,0x6efa,0xa17e,0xae62,0x868e,0x7a98,0x601,0x2d87,0xcf47,0xfed6,0x5274,0x9d7c,0x5}}}, {{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0xd40c,0x78cc,0xb84c,0x8d05,0xea7a,0x2f1b,0xb273,0x7369,0x9dd7,0x2ce8,0xfa0b,0xc55c,0x1662,0x5710,0xbdc5,0xc9b4,0x318c,0xd27a,0xd4d7,0x3665,0x49f,0x71e7,0xdf5c,0x79c7,0xde2d,0x7}}}}, {{{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0xf71c,0x75ce,0xa9e9,0xb3d9,0x1118,0xbf1a,0x6441,0x7cd5,0xc3a,0xd7fb,0x1ac0,0xc439,0xeef7,0x9f3b,0x4181,0x7f05,0x7aed,0x1582,0x5bd0,0x920d,0x9286,0x3b44,0x9aa4,0xc48f,0x8111,0x5}}}, {{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x30c7,0xedc1,0x818f,0xaf91,0xfece,0xe3cd,0x6a1c,0x4d77,0x23f8,0x202c,0xa08c,0xe202,0x3fce,0xc29,0x8e94,0xb33,0xb6cd,0x96a,0xb43c,0x6365,0xafa3,0x54e6,0x278,0x9441,0x5a5a,0x6}}}}}; -const ibz_mat_2x2_t ACTION_GEN2 = {{{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x46a8,0x9057,0x86de,0xcba9,0xc982,0xce00,0x3e5,0xafe9,0x7503,0xb4f7,0x31d9,0x45f1,0xb772,0x4e23,0x3858,0xcfd8,0x4244,0xf58d,0x271b,0x3760,0x5e52,0x9b69,0xb03c,0x29df,0x6f76}}}, {{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x6727,0x3496,0xa592,0xd124,0xb138,0x5406,0x1e37,0xb681,0x76ad,0xc6bb,0x3525,0x6e4f,0xd837,0x95a4,0x9c8e,0x7ab7,0x2da8,0x8205,0x4c09,0x3094,0x3570,0x4038,0x4a69,0x2a6d,0xcee0,0x2}}}}, {{{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x3fa9,0x8525,0xf0a8,0x5add,0xedd1,0xbf8,0xc425,0xab51,0x3750,0x2506,0x4007,0x68,0x782a,0x50ad,0xac25,0x9d19,0x61a2,0x845b,0x6841,0x3bfe,0x18f1,0x7633,0x7ee4,0x8fe2,0x2e11,0x5}}}, {{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0xb958,0x6fa8,0x7921,0x3456,0xfe7d,0x2ee0,0xd079,0xa9ed,0x3802,0xb215,0xfbd7,0x2861,0xd953,0xec53,0xc535,0xdcd9,0x22ea,0x9a6c,0x7b8,0x3207,0x7ed8,0x88c4,0x5112,0xbcd6,0x8860,0xb}}}}}; -const ibz_mat_2x2_t ACTION_GEN3 = {{{{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x64fe,0x9ddd,0x7d4c,0x7916,0x26e5,0x8246,0x985d,0x3c27,0xd04e,0xa386,0x1916,0xe74e,0xf5f6,0x8024,0x995c,0x80a7,0xd3c3,0x2be2,0x22a4,0x6fbc,0xc8a3,0x2571,0x9c35,0x7d60,0x4ca0,0x3}}}, {{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0xbbfb,0x9439,0x9f0,0x5aff,0xc809,0x9304,0x5b57,0x707f,0xec6e,0x8012,0x6b0a,0xe5f0,0x9ef0,0x70b8,0x2e96,0xf278,0xa64a,0x7ae6,0xbbdb,0x3de,0x379d,0x77be,0xa462,0xb66c,0xb35f,0x3}}}}, {{{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x1f34,0xb2d,0x780a,0x9bd3,0xbbb3,0x646f,0xb440,0x896f,0xe2dc,0xc5ef,0x5550,0x8e5,0xa10a,0x873c,0x526b,0x9188,0xce3,0xbe55,0x118f,0xc857,0xb61f,0xa5d5,0xf6ac,0xd898,0x76e1,0xb}}}, {{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x9b02,0x6222,0x82b3,0x86e9,0xa11a,0x7a9b,0x3c01,0x1daf,0xdcb8,0xc385,0x149a,0x8705,0x9ace,0xba52,0x6431,0x2c0a,0x916c,0x6416,0xc30,0xf9ab,0x1486,0xfebc,0x6519,0x6955,0xab36,0x8}}}}}; -const ibz_mat_2x2_t ACTION_GEN4 = {{{{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x679d,0x91f,0x3f38,0xa837,0xc898,0x8afa,0x1f50,0x331b,0x9b0a,0x56f6,0xdd6b,0xfd51,0xf0dd,0x3462,0x3644,0x2718,0x9c9,0x8b44,0x54b6,0xb7b4,0x8558,0xf9ba,0x8012,0x9c95,0xcaa9,0x8}}}, {{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x6a06,0x3c66,0xdc26,0x4682,0xd93d,0x15fe,0x4369,0xe6a0,0xa56e,0x49fa,0x13de,0x19d8,0xd394,0xc8c3,0x5da9,0x3b33,0xcb5e,0x3139,0x81d6,0xcfe6,0x70e4,0xcb0a,0xf055,0x303e,0xeb02,0x9}}}}, {{{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x7b8e,0xbae7,0xd4f4,0x59ec,0x88c,0xdf8d,0xb220,0x3e6a,0x861d,0x6bfd,0x8d60,0xe21c,0xf77b,0xcf9d,0xa0c0,0xbf82,0x3d76,0xac1,0xade8,0x4906,0x4943,0x1da2,0xcd52,0xe247,0xc088,0x2}}}, {{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x9864,0xf6e0,0xc0c7,0x57c8,0xff67,0x71e6,0xb50e,0x26bb,0x11fc,0x1016,0x5046,0x7101,0x9fe7,0x614,0xc74a,0x8599,0x5b66,0x4b5,0xda1e,0xb1b2,0x57d1,0x2a73,0x813c,0x4a20,0x2d2d,0x3}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_UNDISTORTED_GEN = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x8}}}, {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xa12e,0x6526,0xbcc1,0x5f91,0x18ef,0x4f6f,0x5206,0x73e4,0xe166,0x894b,0x63d0,0x3525,0xe0c3,0x5118,0x4d54,0xb2aa,0x12f2}}}, {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x255d,0x6cb1,0x39e6,0xeabd,0xf4f1,0x2b10,0xff77,0x8cc6,0x18d9,0xe0a9,0xade1,0x7274,0xec7c,0x8af5,0xde41,0xf859,0x8791}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_DISTORTION_ENDO = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x4550,0xc754,0xbb43,0xd9c9,0x1e09,0xf476,0x91c3,0x8f4f,0xae13,0x654d,0xc39b,0xbd46,0x5e10,0xbc3d,0xe06a,0x6ba6,0x32c4}}}, {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x5307,0xac34,0xc11e,0xde5,0x1e71,0x52c0,0x45fe,0xea6e,0x48d8,0xa5c4,0x4744,0xe26,0x47,0x7275,0x5965,0x8645,0xa46e}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xf8fb,0x5ec5,0xdde5,0xed0c,0x7184,0x437d,0x1a51,0xe32f,0x673,0xa6f0,0x1916,0x8d28,0xac10,0x2e62,0xdf2c,0xccb2,0x2ce7}}}}}; -#elif 8*DIGIT_LEN == 32 -const ec_basis_t BASIS_EVEN = {{{{0xaa6456e57b3d0e5c, 0x6e1e74cfc06d9529, 0xe77005c1d8e998d9, 0x207aef3d73fb9e71}, {0x918dbc45635410cb, 0x6ee588ba09396573, 0x68aa64be61e6f4c4, 0x16e37aee06350f3}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0xc71dcbb1e0f986f5, 0xbd60f6c8d8c31906, 0x753a060121887848, 0x2104aa23e92066b1}, {0x187b3ab8b007ee01, 0xa0cfdf9999fd088e, 0x1dbb43376c18e129, 0x1be43892abe83cab}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x5f063c05ab333c4b, 0x9432317b20a4a9dd, 0x3d246e5d9e99e169, 0x112c26ed94c42aea}, {0xf650f44ad5ca0053, 0xbe39aa3b866de04d, 0x8eca3998d4b32c4d, 0x24e1dfdd264f7289}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_PLUS = {{{{0x9225eb7dc4964589, 0x84809bd2660ac787, 0x9b120b36af060f7b, 0x26c6e5fb8ba413a2}, {0xc3243c45368044cd, 0xf4c6c6136b0396e3, 0x36e7ca367bcda18e, 0x2b2ea4f64b8d9b4d}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x2e78d4ca270d7e6b, 0xf9ac7eaa9713ab55, 0x6b68d02784ce09b1, 0x33fe700247f21db9}, {0x72995ed7921505e9, 0x9af528d378e626ba, 0x319a09e659f3fbf, 0x14f7b599168ae1bb}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x1fc31ea8afacffa9, 0x2198ad06ba5f7c1e, 0x867ee910c84f9241, 0x22f0ae8a117bf50}, {0x7624b1b2a61cca63, 0x6de050872be1c855, 0xf26e2a76937d44db, 0x13e175482bc586c4}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_MINUS = {{{{0x1821f9af01cc0789, 0x66b67297ef3013a7, 0xe2f055ae52632d3d, 0xdadc43eddf1c21b}, {0xd236109f47f870ac, 0xf229a667744c0266, 0xf9d93d6f01f921fa, 0x2c3b6b5594983796}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x3abe763db230770c, 0xe4f9d39d2c76dbde, 0x15233adf6bc96db0, 0x9e8670c2795523}, {0xd80ba0bdd941e6ea, 0x6ff5c7474a4a781e, 0x9f7a618e8469d0a2, 0x304a4540668f3eb3}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0xb4ac0084a2b43849, 0xf00f44c1e014f6b5, 0x1bd32f9f8e5196ea, 0x15f9e117c931dba}, {0x682ed40c9aba9b0c, 0x23ecbcd17bcf48bb, 0xa965b22a1497f9d3, 0xcc6dae3c8db528a}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_PLUS = {{{{0xb382773d0ee2c6c5, 0x79bf22b00e75b701, 0x3dad4448a15e78b8, 0x2eb8550cb8d850d7}, {0x3289f573f719e381, 0xbeed476da914eb33, 0x6842f12d33d945f8, 0x1198a19ef03352bd}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x2c70e2ff4f8ed280, 0xd57145fbbd907950, 0x1ddf917bc2cd217f, 0x645838fc77dbffc}, {0x964fa32cefd3fdeb, 0xd551d0d6d0d1947b, 0x557b59a0b5fe55fc, 0x26cdcead70200b29}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x1e1dfa89820375fa, 0xf99b7f5e9addf912, 0xb316e64530602ca4, 0x1f6c3e438538999f}, {0x15924ed1bb15198, 0x4b5e6672bbda95e3, 0x6145e2a98ca22c88, 0xfcfc3a246698c7c}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_MINUS = {{{{0x1821f9af01cc0789, 0x66b67297ef3013a7, 0xe2f055ae52632d3d, 0xdadc43eddf1c21b}, {0xd236109f47f870ac, 0xf229a667744c0266, 0xf9d93d6f01f921fa, 0x2c3b6b5594983796}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x3abe763db230770c, 0xe4f9d39d2c76dbde, 0x15233adf6bc96db0, 0x9e8670c2795523}, {0xd80ba0bdd941e6ea, 0x6ff5c7474a4a781e, 0x9f7a618e8469d0a2, 0x304a4540668f3eb3}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0xb4ac0084a2b43849, 0xf00f44c1e014f6b5, 0x1bd32f9f8e5196ea, 0x15f9e117c931dba}, {0x682ed40c9aba9b0c, 0x23ecbcd17bcf48bb, 0xa965b22a1497f9d3, 0xcc6dae3c8db528a}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_CHALLENGE = {{{{0x94437da213f9a8b1, 0xaba06afd54324148, 0x88ae0c022485a5f0, 0x14c75d2e824d358c}, {0xf66dc2e267ccd26c, 0x4874947cabbe1286, 0x9d58768934cf0ac, 0x204e323f499fb9c7}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x6df59b590d8b49c3, 0x1a9d2f960b7a3739, 0xb07ddc58241945ff, 0x3484655e395cb341}, {0x304ad2e438e5e35d, 0x2dae483b5d058280, 0x6f8c329dfd772ab6, 0x3185a956086f9c3a}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0xc005575f13b6b2c2, 0xddf9a6915407672a, 0x2c9a775fc6672c13, 0x1e1cabf3a03e1a97}, {0x63582f61f3e388aa, 0xcb1e01ccb3f27f1d, 0xd2f07c8953154892, 0x31dfa2e1a8469e03}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_curve_t CURVE_E0 = {{{0x0}}, {{0x1}}}; -const ec_point_t CURVE_E0_A24 = {{{0x0}}, {{0x1}}}; -const ibz_mat_2x2_t ACTION_I = {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x905746a8,0xcba986de,0xce00c982,0xafe903e5,0xb4f77503,0x45f131d9,0x4e23b772,0xcfd83858,0xf58d4244,0x3760271b,0x9b695e52,0x29dfb03c,0x6f76}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x34966727,0xd124a592,0x5406b138,0xb6811e37,0xc6bb76ad,0x6e4f3525,0x95a4d837,0x7ab79c8e,0x82052da8,0x30944c09,0x40383570,0x2a6d4a69,0x2cee0}}}}, {{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x85253fa9,0x5addf0a8,0xbf8edd1,0xab51c425,0x25063750,0x684007,0x50ad782a,0x9d19ac25,0x845b61a2,0x3bfe6841,0x763318f1,0x8fe27ee4,0x52e11}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x6fa8b958,0x34567921,0x2ee0fe7d,0xa9edd079,0xb2153802,0x2861fbd7,0xec53d953,0xdcd9c535,0x9a6c22ea,0x320707b8,0x88c47ed8,0xbcd65112,0xb8860}}}}}; -const ibz_mat_2x2_t ACTION_J = {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xab638354,0x268373ba,0x368b8448,0xc8662cd5,0x92162b98,0x88ab0053,0xb226347b,0x3176fa60,0x62386542,0xa8181e2c,0xaf7a32f4,0xd0e1882d,0x629ca}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xf3dd10cf,0xe4d96e4e,0xd202ded9,0x2a7d9877,0x396a622f,0x5d91a0ef,0x4bcc65aa,0x6a38c09e,0x73c81eed,0xd7292bad,0xaf4439c9,0x426bfe5b,0x497df}}}}, {{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x9134febf,0xdcc8ff6b,0xc004c195,0xdb6cffc,0xffcce162,0xa30f3ce8,0x83543924,0xd944fb23,0x685552f4,0xeb488c09,0xb14a7623,0x3a996d25,0x5c7db}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x549c7cac,0xd97c8c45,0xc65643b7,0x9170a789,0xd4f6816d,0xe5a82d5d,0x88515c49,0x7b3b032d,0x2dc0ffed,0xc14f10a8,0x74b3aa35,0x15d47921,0x5ce0c}}}}}; -const ibz_mat_2x2_t ACTION_K = {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x123ecf39,0x506e7e70,0x1913c931,0xc5f6a42,0x46e0890e,0x8c508d25,0x2e4e50f6,0xa17e6efa,0x868eae62,0x6017a98,0xcf472d87,0x5274fed6,0x59d7c}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x78ccd40c,0x8d05b84c,0x2f1bea7a,0x7369b273,0x2ce89dd7,0xc55cfa0b,0x57101662,0xc9b4bdc5,0xd27a318c,0x3665d4d7,0x71e7049f,0x79c7df5c,0x7de2d}}}}, {{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x75cef71c,0xb3d9a9e9,0xbf1a1118,0x7cd56441,0xd7fb0c3a,0xc4391ac0,0x9f3beef7,0x7f054181,0x15827aed,0x920d5bd0,0x3b449286,0xc48f9aa4,0x58111}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xedc130c7,0xaf91818f,0xe3cdfece,0x4d776a1c,0x202c23f8,0xe202a08c,0xc293fce,0xb338e94,0x96ab6cd,0x6365b43c,0x54e6afa3,0x94410278,0x65a5a}}}}}; -const ibz_mat_2x2_t ACTION_GEN2 = {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x905746a8,0xcba986de,0xce00c982,0xafe903e5,0xb4f77503,0x45f131d9,0x4e23b772,0xcfd83858,0xf58d4244,0x3760271b,0x9b695e52,0x29dfb03c,0x6f76}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x34966727,0xd124a592,0x5406b138,0xb6811e37,0xc6bb76ad,0x6e4f3525,0x95a4d837,0x7ab79c8e,0x82052da8,0x30944c09,0x40383570,0x2a6d4a69,0x2cee0}}}}, {{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x85253fa9,0x5addf0a8,0xbf8edd1,0xab51c425,0x25063750,0x684007,0x50ad782a,0x9d19ac25,0x845b61a2,0x3bfe6841,0x763318f1,0x8fe27ee4,0x52e11}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x6fa8b958,0x34567921,0x2ee0fe7d,0xa9edd079,0xb2153802,0x2861fbd7,0xec53d953,0xdcd9c535,0x9a6c22ea,0x320707b8,0x88c47ed8,0xbcd65112,0xb8860}}}}}; -const ibz_mat_2x2_t ACTION_GEN3 = {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x9ddd64fe,0x79167d4c,0x824626e5,0x3c27985d,0xa386d04e,0xe74e1916,0x8024f5f6,0x80a7995c,0x2be2d3c3,0x6fbc22a4,0x2571c8a3,0x7d609c35,0x34ca0}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x9439bbfb,0x5aff09f0,0x9304c809,0x707f5b57,0x8012ec6e,0xe5f06b0a,0x70b89ef0,0xf2782e96,0x7ae6a64a,0x3debbdb,0x77be379d,0xb66ca462,0x3b35f}}}}, {{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xb2d1f34,0x9bd3780a,0x646fbbb3,0x896fb440,0xc5efe2dc,0x8e55550,0x873ca10a,0x9188526b,0xbe550ce3,0xc857118f,0xa5d5b61f,0xd898f6ac,0xb76e1}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x62229b02,0x86e982b3,0x7a9ba11a,0x1daf3c01,0xc385dcb8,0x8705149a,0xba529ace,0x2c0a6431,0x6416916c,0xf9ab0c30,0xfebc1486,0x69556519,0x8ab36}}}}}; -const ibz_mat_2x2_t ACTION_GEN4 = {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x91f679d,0xa8373f38,0x8afac898,0x331b1f50,0x56f69b0a,0xfd51dd6b,0x3462f0dd,0x27183644,0x8b4409c9,0xb7b454b6,0xf9ba8558,0x9c958012,0x8caa9}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x3c666a06,0x4682dc26,0x15fed93d,0xe6a04369,0x49faa56e,0x19d813de,0xc8c3d394,0x3b335da9,0x3139cb5e,0xcfe681d6,0xcb0a70e4,0x303ef055,0x9eb02}}}}, {{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xbae77b8e,0x59ecd4f4,0xdf8d088c,0x3e6ab220,0x6bfd861d,0xe21c8d60,0xcf9df77b,0xbf82a0c0,0xac13d76,0x4906ade8,0x1da24943,0xe247cd52,0x2c088}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xf6e09864,0x57c8c0c7,0x71e6ff67,0x26bbb50e,0x101611fc,0x71015046,0x6149fe7,0x8599c74a,0x4b55b66,0xb1b2da1e,0x2a7357d1,0x4a20813c,0x32d2d}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_UNDISTORTED_GEN = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x8}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x6526a12e,0x5f91bcc1,0x4f6f18ef,0x73e45206,0x894be166,0x352563d0,0x5118e0c3,0xb2aa4d54,0x12f2}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x6cb1255d,0xeabd39e6,0x2b10f4f1,0x8cc6ff77,0xe0a918d9,0x7274ade1,0x8af5ec7c,0xf859de41,0x8791}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_DISTORTION_ENDO = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xc7544550,0xd9c9bb43,0xf4761e09,0x8f4f91c3,0x654dae13,0xbd46c39b,0xbc3d5e10,0x6ba6e06a,0x32c4}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xac345307,0xde5c11e,0x52c01e71,0xea6e45fe,0xa5c448d8,0xe264744,0x72750047,0x86455965,0xa46e}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x5ec5f8fb,0xed0cdde5,0x437d7184,0xe32f1a51,0xa6f00673,0x8d281916,0x2e62ac10,0xccb2df2c,0x2ce7}}}}}; -#elif 8*DIGIT_LEN == 64 -const ec_basis_t BASIS_EVEN = {{{{0xaa6456e57b3d0e5c, 0x6e1e74cfc06d9529, 0xe77005c1d8e998d9, 0x207aef3d73fb9e71}, {0x918dbc45635410cb, 0x6ee588ba09396573, 0x68aa64be61e6f4c4, 0x16e37aee06350f3}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0xc71dcbb1e0f986f5, 0xbd60f6c8d8c31906, 0x753a060121887848, 0x2104aa23e92066b1}, {0x187b3ab8b007ee01, 0xa0cfdf9999fd088e, 0x1dbb43376c18e129, 0x1be43892abe83cab}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x5f063c05ab333c4b, 0x9432317b20a4a9dd, 0x3d246e5d9e99e169, 0x112c26ed94c42aea}, {0xf650f44ad5ca0053, 0xbe39aa3b866de04d, 0x8eca3998d4b32c4d, 0x24e1dfdd264f7289}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_PLUS = {{{{0x9225eb7dc4964589, 0x84809bd2660ac787, 0x9b120b36af060f7b, 0x26c6e5fb8ba413a2}, {0xc3243c45368044cd, 0xf4c6c6136b0396e3, 0x36e7ca367bcda18e, 0x2b2ea4f64b8d9b4d}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x2e78d4ca270d7e6b, 0xf9ac7eaa9713ab55, 0x6b68d02784ce09b1, 0x33fe700247f21db9}, {0x72995ed7921505e9, 0x9af528d378e626ba, 0x319a09e659f3fbf, 0x14f7b599168ae1bb}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x1fc31ea8afacffa9, 0x2198ad06ba5f7c1e, 0x867ee910c84f9241, 0x22f0ae8a117bf50}, {0x7624b1b2a61cca63, 0x6de050872be1c855, 0xf26e2a76937d44db, 0x13e175482bc586c4}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_MINUS = {{{{0x1821f9af01cc0789, 0x66b67297ef3013a7, 0xe2f055ae52632d3d, 0xdadc43eddf1c21b}, {0xd236109f47f870ac, 0xf229a667744c0266, 0xf9d93d6f01f921fa, 0x2c3b6b5594983796}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x3abe763db230770c, 0xe4f9d39d2c76dbde, 0x15233adf6bc96db0, 0x9e8670c2795523}, {0xd80ba0bdd941e6ea, 0x6ff5c7474a4a781e, 0x9f7a618e8469d0a2, 0x304a4540668f3eb3}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0xb4ac0084a2b43849, 0xf00f44c1e014f6b5, 0x1bd32f9f8e5196ea, 0x15f9e117c931dba}, {0x682ed40c9aba9b0c, 0x23ecbcd17bcf48bb, 0xa965b22a1497f9d3, 0xcc6dae3c8db528a}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_PLUS = {{{{0xb382773d0ee2c6c5, 0x79bf22b00e75b701, 0x3dad4448a15e78b8, 0x2eb8550cb8d850d7}, {0x3289f573f719e381, 0xbeed476da914eb33, 0x6842f12d33d945f8, 0x1198a19ef03352bd}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x2c70e2ff4f8ed280, 0xd57145fbbd907950, 0x1ddf917bc2cd217f, 0x645838fc77dbffc}, {0x964fa32cefd3fdeb, 0xd551d0d6d0d1947b, 0x557b59a0b5fe55fc, 0x26cdcead70200b29}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x1e1dfa89820375fa, 0xf99b7f5e9addf912, 0xb316e64530602ca4, 0x1f6c3e438538999f}, {0x15924ed1bb15198, 0x4b5e6672bbda95e3, 0x6145e2a98ca22c88, 0xfcfc3a246698c7c}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_MINUS = {{{{0x1821f9af01cc0789, 0x66b67297ef3013a7, 0xe2f055ae52632d3d, 0xdadc43eddf1c21b}, {0xd236109f47f870ac, 0xf229a667744c0266, 0xf9d93d6f01f921fa, 0x2c3b6b5594983796}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x3abe763db230770c, 0xe4f9d39d2c76dbde, 0x15233adf6bc96db0, 0x9e8670c2795523}, {0xd80ba0bdd941e6ea, 0x6ff5c7474a4a781e, 0x9f7a618e8469d0a2, 0x304a4540668f3eb3}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0xb4ac0084a2b43849, 0xf00f44c1e014f6b5, 0x1bd32f9f8e5196ea, 0x15f9e117c931dba}, {0x682ed40c9aba9b0c, 0x23ecbcd17bcf48bb, 0xa965b22a1497f9d3, 0xcc6dae3c8db528a}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_CHALLENGE = {{{{0x94437da213f9a8b1, 0xaba06afd54324148, 0x88ae0c022485a5f0, 0x14c75d2e824d358c}, {0xf66dc2e267ccd26c, 0x4874947cabbe1286, 0x9d58768934cf0ac, 0x204e323f499fb9c7}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x6df59b590d8b49c3, 0x1a9d2f960b7a3739, 0xb07ddc58241945ff, 0x3484655e395cb341}, {0x304ad2e438e5e35d, 0x2dae483b5d058280, 0x6f8c329dfd772ab6, 0x3185a956086f9c3a}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0xc005575f13b6b2c2, 0xddf9a6915407672a, 0x2c9a775fc6672c13, 0x1e1cabf3a03e1a97}, {0x63582f61f3e388aa, 0xcb1e01ccb3f27f1d, 0xd2f07c8953154892, 0x31dfa2e1a8469e03}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_curve_t CURVE_E0 = {{{0x0}}, {{0x1}}}; -const ec_point_t CURVE_E0_A24 = {{{0x0}}, {{0x1}}}; -const ibz_mat_2x2_t ACTION_I = {{{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xcba986de905746a8,0xafe903e5ce00c982,0x45f131d9b4f77503,0xcfd838584e23b772,0x3760271bf58d4244,0x29dfb03c9b695e52,0x6f76}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xd124a59234966727,0xb6811e375406b138,0x6e4f3525c6bb76ad,0x7ab79c8e95a4d837,0x30944c0982052da8,0x2a6d4a6940383570,0x2cee0}}}}, {{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x5addf0a885253fa9,0xab51c4250bf8edd1,0x68400725063750,0x9d19ac2550ad782a,0x3bfe6841845b61a2,0x8fe27ee4763318f1,0x52e11}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x345679216fa8b958,0xa9edd0792ee0fe7d,0x2861fbd7b2153802,0xdcd9c535ec53d953,0x320707b89a6c22ea,0xbcd6511288c47ed8,0xb8860}}}}}; -const ibz_mat_2x2_t ACTION_J = {{{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x268373baab638354,0xc8662cd5368b8448,0x88ab005392162b98,0x3176fa60b226347b,0xa8181e2c62386542,0xd0e1882daf7a32f4,0x629ca}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xe4d96e4ef3dd10cf,0x2a7d9877d202ded9,0x5d91a0ef396a622f,0x6a38c09e4bcc65aa,0xd7292bad73c81eed,0x426bfe5baf4439c9,0x497df}}}}, {{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xdcc8ff6b9134febf,0xdb6cffcc004c195,0xa30f3ce8ffcce162,0xd944fb2383543924,0xeb488c09685552f4,0x3a996d25b14a7623,0x5c7db}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xd97c8c45549c7cac,0x9170a789c65643b7,0xe5a82d5dd4f6816d,0x7b3b032d88515c49,0xc14f10a82dc0ffed,0x15d4792174b3aa35,0x5ce0c}}}}}; -const ibz_mat_2x2_t ACTION_K = {{{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x506e7e70123ecf39,0xc5f6a421913c931,0x8c508d2546e0890e,0xa17e6efa2e4e50f6,0x6017a98868eae62,0x5274fed6cf472d87,0x59d7c}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x8d05b84c78ccd40c,0x7369b2732f1bea7a,0xc55cfa0b2ce89dd7,0xc9b4bdc557101662,0x3665d4d7d27a318c,0x79c7df5c71e7049f,0x7de2d}}}}, {{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xb3d9a9e975cef71c,0x7cd56441bf1a1118,0xc4391ac0d7fb0c3a,0x7f0541819f3beef7,0x920d5bd015827aed,0xc48f9aa43b449286,0x58111}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xaf91818fedc130c7,0x4d776a1ce3cdfece,0xe202a08c202c23f8,0xb338e940c293fce,0x6365b43c096ab6cd,0x9441027854e6afa3,0x65a5a}}}}}; -const ibz_mat_2x2_t ACTION_GEN2 = {{{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xcba986de905746a8,0xafe903e5ce00c982,0x45f131d9b4f77503,0xcfd838584e23b772,0x3760271bf58d4244,0x29dfb03c9b695e52,0x6f76}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xd124a59234966727,0xb6811e375406b138,0x6e4f3525c6bb76ad,0x7ab79c8e95a4d837,0x30944c0982052da8,0x2a6d4a6940383570,0x2cee0}}}}, {{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x5addf0a885253fa9,0xab51c4250bf8edd1,0x68400725063750,0x9d19ac2550ad782a,0x3bfe6841845b61a2,0x8fe27ee4763318f1,0x52e11}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x345679216fa8b958,0xa9edd0792ee0fe7d,0x2861fbd7b2153802,0xdcd9c535ec53d953,0x320707b89a6c22ea,0xbcd6511288c47ed8,0xb8860}}}}}; -const ibz_mat_2x2_t ACTION_GEN3 = {{{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x79167d4c9ddd64fe,0x3c27985d824626e5,0xe74e1916a386d04e,0x80a7995c8024f5f6,0x6fbc22a42be2d3c3,0x7d609c352571c8a3,0x34ca0}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x5aff09f09439bbfb,0x707f5b579304c809,0xe5f06b0a8012ec6e,0xf2782e9670b89ef0,0x3debbdb7ae6a64a,0xb66ca46277be379d,0x3b35f}}}}, {{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x9bd3780a0b2d1f34,0x896fb440646fbbb3,0x8e55550c5efe2dc,0x9188526b873ca10a,0xc857118fbe550ce3,0xd898f6aca5d5b61f,0xb76e1}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x86e982b362229b02,0x1daf3c017a9ba11a,0x8705149ac385dcb8,0x2c0a6431ba529ace,0xf9ab0c306416916c,0x69556519febc1486,0x8ab36}}}}}; -const ibz_mat_2x2_t ACTION_GEN4 = {{{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xa8373f38091f679d,0x331b1f508afac898,0xfd51dd6b56f69b0a,0x271836443462f0dd,0xb7b454b68b4409c9,0x9c958012f9ba8558,0x8caa9}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x4682dc263c666a06,0xe6a0436915fed93d,0x19d813de49faa56e,0x3b335da9c8c3d394,0xcfe681d63139cb5e,0x303ef055cb0a70e4,0x9eb02}}}}, {{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x59ecd4f4bae77b8e,0x3e6ab220df8d088c,0xe21c8d606bfd861d,0xbf82a0c0cf9df77b,0x4906ade80ac13d76,0xe247cd521da24943,0x2c088}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x57c8c0c7f6e09864,0x26bbb50e71e6ff67,0x71015046101611fc,0x8599c74a06149fe7,0xb1b2da1e04b55b66,0x4a20813c2a7357d1,0x32d2d}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_UNDISTORTED_GEN = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x8}}}, {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x5f91bcc16526a12e,0x73e452064f6f18ef,0x352563d0894be166,0xb2aa4d545118e0c3,0x12f2}}}, {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xeabd39e66cb1255d,0x8cc6ff772b10f4f1,0x7274ade1e0a918d9,0xf859de418af5ec7c,0x8791}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_DISTORTION_ENDO = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xd9c9bb43c7544550,0x8f4f91c3f4761e09,0xbd46c39b654dae13,0x6ba6e06abc3d5e10,0x32c4}}}, {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xde5c11eac345307,0xea6e45fe52c01e71,0xe264744a5c448d8,0x8645596572750047,0xa46e}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xed0cdde55ec5f8fb,0xe32f1a51437d7184,0x8d281916a6f00673,0xccb2df2c2e62ac10,0x2ce7}}}}}; +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} #endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x199, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6} +#elif RADIX == 32 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x19, 0x0, 0x0, 0x300000000000000} +#else +{0xc, 0x0, 0x0, 0x0, 0x400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x107, 0xc, 0x1890, 0xf2a, 0x52b, 0xb68, 0x152d, 0xa4c, 0x1054, 0x642, 0x36a, 0x6f8, 0x7ad, 0x146c, 0x1d66, 0x1b67, 0x236, 0x10d, 0x1933, 0x3} +#elif RADIX == 32 +{0x3020e, 0xb795624, 0x5ab6829, 0x1514995, 0x1b5190a, 0x187ad37c, 0x19facd46, 0x8688db6, 0x3c998} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x52b795624001810, 0x8c8505452654b56d, 0xf59a8d87ad37c0da, 0x24e4cc21a236db3} +#else +{0x5bcab12000c08, 0x452654b56d052, 0x26f81b5190a0a, 0x36cfd66a361eb, 0x12726610d11b} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1f87, 0x83e, 0x32e, 0xe58, 0xd9d, 0x1416, 0x752, 0x13b4, 0x1efa, 0xe62, 0x12f5, 0x1907, 0x1814, 0x1ddd, 0x1aa6, 0x1420, 0x2cd, 0x1431, 0x1be2, 0x7} +#elif RADIX == 32 +{0x120fbf0f, 0x1d72c0cb, 0xa54166c, 0x1bea7687, 0x197ab98b, 0x1b814c83, 0x8354ddd, 0x188b368, 0x2df15} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xcd9d72c0cb907df8, 0x5cc5efa9da1d4a82, 0x6a9bbbb814c83cbd, 0x26ef8a8622cda10} +#else +{0x6b96065c83efc, 0x29da1d4a82cd9, 0x190797ab98bdf, 0x6841aa6eeee05, 0x1377c5431166} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x5ff, 0x1783, 0xadc, 0x775, 0xad4, 0x593, 0xb4c, 0x21e, 0x1cb2, 0x13d8, 0x179f, 0x680, 0x1a9c, 0x1824, 0x118e, 0x13d9, 0x24, 0x1956, 0x1dd2, 0x9} +#elif RADIX == 32 +{0x5e0cbff, 0x143baab7, 0x9859356, 0x12c843cb, 0xbcfcf63, 0x9a9c340, 0x16631d82, 0xab00927, 0x4ee96} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x6ad43baab72f065f, 0xe7b1cb210f2d30b2, 0xc63b049a9c3405e7, 0x4ff74b2ac0249ec} +#else +{0x21dd55b97832f, 0x210f2d30b26ad, 0x680bcfcf6396, 0x27b318ec126a7, 0x4ffba5956012} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1c7f, 0x1117, 0xa4, 0x1164, 0x6e, 0x1e63, 0x1b7b, 0x1305, 0x424, 0x131a, 0x1b61, 0xae3, 0x17b1, 0xe5e, 0x1848, 0x1e81, 0x14a5, 0x1cb5, 0x1d87, 0x8} +#elif RADIX == 32 +{0x445f8ff, 0xe8b2029, 0xf7e6303, 0x109260bb, 0x1db0cc68, 0x1d7b1571, 0x7090e5, 0x5ad297d, 0x3ec3f} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x606e8b2029222fc7, 0x6634424982edefcc, 0xe121cbd7b1571ed8, 0x4f761f96b4a5f40} +#else +{0x74590149117e3, 0x4982edefcc606, 0x2ae3db0cc6884, 0x7d0384872f5ec, 0x4fbb0fcb5a52} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x342, 0xfb7, 0xed, 0x1d80, 0x17f1, 0x4a2, 0x1c26, 0xb96, 0x1367, 0x3dc, 0x1624, 0x1f2a, 0x5e, 0x1cab, 0x27, 0x1e89, 0x1293, 0x1e24, 0x417, 0x5} +#elif RADIX == 32 +{0xbedc685, 0x11ec003b, 0x4c4a2bf, 0xd9d72dc, 0xb120f72, 0x1605ef95, 0x2404fca, 0x1124a4fd, 0x20bf} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x57f1ec003b5f6e34, 0x7b93675cb709894, 0x809f95605ef95589, 0xc905fc49293f44} +#else +{0xf6001dafb71a, 0x75cb70989457f, 0x5f2ab120f726c, 0x7d12027e55817, 0x6482fe24949} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0xf3c, 0x1d21, 0xd78, 0xe8e, 0x1f3c, 0x11b, 0x12c, 0x1851, 0x19b1, 0xd9, 0xf3f, 0x759, 0xf47, 0x1e88, 0x56e, 0x8ef, 0x116e, 0x1fa1, 0x1199, 0x0} +#elif RADIX == 32 +{0x7485e78, 0x1c74735e, 0x5811bf9, 0x6c70a21, 0x179f8367, 0x10f473ac, 0x1bcadde8, 0x1d0c5b91, 0x8ccf} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x7f3c74735e3a42f3, 0xc1b39b1c2884b023, 0x95bbd10f473acbcf, 0x3c4667f4316e477} +#else +{0x63a39af1d2179, 0x1c2884b0237f3, 0x675979f836736, 0x11de56ef443d1, 0x462333fa18b7} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x56db,0x1b54,0xbda2,0xc5d3,0xdd06,0x861d,0x9780,0x7475,0x33d1,0x41af,0x34b2,0x7f9d,0x7f8c,0xaa8c,0xb471,0xca}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1b5456db,0xc5d3bda2,0x861ddd06,0x74759780,0x41af33d1,0x7f9d34b2,0xaa8c7f8c,0xcab471}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc5d3bda21b5456db,0x74759780861ddd06,0x7f9d34b241af33d1,0xcab471aa8c7f8c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7d7a,0x48b,0x7d32,0x7bfb,0x9bd3,0x63d8,0x9182,0xa955,0x3e1,0x344,0x6861,0x76bf,0x5cd0,0xeeb4,0x4ae3,0x57}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x48b7d7a,0x7bfb7d32,0x63d89bd3,0xa9559182,0x34403e1,0x76bf6861,0xeeb45cd0,0x574ae3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7bfb7d32048b7d7a,0xa955918263d89bd3,0x76bf6861034403e1,0x574ae3eeb45cd0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x444f,0x3698,0xd649,0x856f,0x41db,0x498f,0xafdf,0x189c,0xcb5b,0xe50b,0xbff,0xf7e0,0x47f9,0xa88b,0x35da,0x15}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3698444f,0x856fd649,0x498f41db,0x189cafdf,0xe50bcb5b,0xf7e00bff,0xa88b47f9,0x1535da}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x856fd6493698444f,0x189cafdf498f41db,0xf7e00bffe50bcb5b,0x1535daa88b47f9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xa925,0xe4ab,0x425d,0x3a2c,0x22f9,0x79e2,0x687f,0x8b8a,0xcc2e,0xbe50,0xcb4d,0x8062,0x8073,0x5573,0x4b8e,0x35}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe4aba925,0x3a2c425d,0x79e222f9,0x8b8a687f,0xbe50cc2e,0x8062cb4d,0x55738073,0x354b8e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3a2c425de4aba925,0x8b8a687f79e222f9,0x8062cb4dbe50cc2e,0x354b8e55738073}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xabf,0x5490,0xd5fd,0x36ba,0xda0f,0x4a59,0x4eea,0xd1,0xa3f0,0xa7ae,0x6f6,0x9146,0x5004,0xcde6,0xa2d2,0x7d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x54900abf,0x36bad5fd,0x4a59da0f,0xd14eea,0xa7aea3f0,0x914606f6,0xcde65004,0x7da2d2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x36bad5fd54900abf,0xd14eea4a59da0f,0x914606f6a7aea3f0,0x7da2d2cde65004}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8680,0xb787,0xbde3,0x611d,0xa95f,0x8b68,0xc9ec,0x819,0x2361,0xf73e,0x5e31,0xbd7b,0x2b45,0x40d7,0x2400,0x68}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb7878680,0x611dbde3,0x8b68a95f,0x819c9ec,0xf73e2361,0xbd7b5e31,0x40d72b45,0x682400}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x611dbde3b7878680,0x819c9ec8b68a95f,0xbd7b5e31f73e2361,0x68240040d72b45}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x4277,0x6d20,0x9e12,0x1f0c,0x977f,0xf854,0x9d1c,0x563f,0xdb,0xc2ed,0xaf54,0xe829,0x4fb,0xd83,0x7be8,0xca}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6d204277,0x1f0c9e12,0xf854977f,0x563f9d1c,0xc2ed00db,0xe829af54,0xd8304fb,0xca7be8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1f0c9e126d204277,0x563f9d1cf854977f,0xe829af54c2ed00db,0xca7be80d8304fb}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf541,0xab6f,0x2a02,0xc945,0x25f0,0xb5a6,0xb115,0xff2e,0x5c0f,0x5851,0xf909,0x6eb9,0xaffb,0x3219,0x5d2d,0x82}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xab6ff541,0xc9452a02,0xb5a625f0,0xff2eb115,0x58515c0f,0x6eb9f909,0x3219affb,0x825d2d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc9452a02ab6ff541,0xff2eb115b5a625f0,0x6eb9f90958515c0f,0x825d2d3219affb}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x231b,0x1af2,0x1640,0xb19c,0xf713,0xe470,0x683e,0xf39a,0x3289,0x7a54,0xc26e,0x904e,0xd5a6,0x6a0c,0x55fc,0x44}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1af2231b,0xb19c1640,0xe470f713,0xf39a683e,0x7a543289,0x904ec26e,0x6a0cd5a6,0x4455fc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb19c16401af2231b,0xf39a683ee470f713,0x904ec26e7a543289,0x4455fc6a0cd5a6}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xad7a,0xb685,0xde69,0x55d2,0x5675,0x84e8,0x5916,0x925f,0x8c0a,0x1cb6,0x7c51,0x8391,0xffce,0x11d1,0x96ce,0xcd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb685ad7a,0x55d2de69,0x84e85675,0x925f5916,0x1cb68c0a,0x83917c51,0x11d1ffce,0xcd96ce}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x55d2de69b685ad7a,0x925f591684e85675,0x83917c511cb68c0a,0xcd96ce11d1ffce}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3724,0x79bd,0x1b92,0x959b,0xb3ec,0x6f18,0x27d4,0x64a7,0x9b4b,0x8c7e,0xade7,0x664b,0xa6d9,0xa287,0x6a1d,0x48}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x79bd3724,0x959b1b92,0x6f18b3ec,0x64a727d4,0x8c7e9b4b,0x664bade7,0xa287a6d9,0x486a1d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x959b1b9279bd3724,0x64a727d46f18b3ec,0x664bade78c7e9b4b,0x486a1da287a6d9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdce5,0xe50d,0xe9bf,0x4e63,0x8ec,0x1b8f,0x97c1,0xc65,0xcd76,0x85ab,0x3d91,0x6fb1,0x2a59,0x95f3,0xaa03,0xbb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe50ddce5,0x4e63e9bf,0x1b8f08ec,0xc6597c1,0x85abcd76,0x6fb13d91,0x95f32a59,0xbbaa03}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4e63e9bfe50ddce5,0xc6597c11b8f08ec,0x6fb13d9185abcd76,0xbbaa0395f32a59}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x56db,0x1b54,0xbda2,0xc5d3,0xdd06,0x861d,0x9780,0x7475,0x33d1,0x41af,0x34b2,0x7f9d,0x7f8c,0xaa8c,0xb471,0xca}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1b5456db,0xc5d3bda2,0x861ddd06,0x74759780,0x41af33d1,0x7f9d34b2,0xaa8c7f8c,0xcab471}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc5d3bda21b5456db,0x74759780861ddd06,0x7f9d34b241af33d1,0xcab471aa8c7f8c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7d7a,0x48b,0x7d32,0x7bfb,0x9bd3,0x63d8,0x9182,0xa955,0x3e1,0x344,0x6861,0x76bf,0x5cd0,0xeeb4,0x4ae3,0x57}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x48b7d7a,0x7bfb7d32,0x63d89bd3,0xa9559182,0x34403e1,0x76bf6861,0xeeb45cd0,0x574ae3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7bfb7d32048b7d7a,0xa955918263d89bd3,0x76bf6861034403e1,0x574ae3eeb45cd0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x444f,0x3698,0xd649,0x856f,0x41db,0x498f,0xafdf,0x189c,0xcb5b,0xe50b,0xbff,0xf7e0,0x47f9,0xa88b,0x35da,0x15}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3698444f,0x856fd649,0x498f41db,0x189cafdf,0xe50bcb5b,0xf7e00bff,0xa88b47f9,0x1535da}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x856fd6493698444f,0x189cafdf498f41db,0xf7e00bffe50bcb5b,0x1535daa88b47f9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xa925,0xe4ab,0x425d,0x3a2c,0x22f9,0x79e2,0x687f,0x8b8a,0xcc2e,0xbe50,0xcb4d,0x8062,0x8073,0x5573,0x4b8e,0x35}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe4aba925,0x3a2c425d,0x79e222f9,0x8b8a687f,0xbe50cc2e,0x8062cb4d,0x55738073,0x354b8e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3a2c425de4aba925,0x8b8a687f79e222f9,0x8062cb4dbe50cc2e,0x354b8e55738073}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x30cd,0xb7f2,0x49cf,0xfe47,0xdb8a,0x683b,0x7335,0xbaa3,0xebe0,0x74ae,0x9dd4,0x8871,0x67c8,0x3c39,0x2ba2,0x24}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb7f230cd,0xfe4749cf,0x683bdb8a,0xbaa37335,0x74aeebe0,0x88719dd4,0x3c3967c8,0x242ba2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xfe4749cfb7f230cd,0xbaa37335683bdb8a,0x88719dd474aeebe0,0x242ba23c3967c8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x81fd,0xde09,0x9d8a,0x6e8c,0xa299,0x77a0,0xadb7,0x58b7,0x13a1,0x7d41,0x6349,0x1a1d,0xc40b,0x17c5,0xb772,0xdf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xde0981fd,0x6e8c9d8a,0x77a0a299,0x58b7adb7,0x7d4113a1,0x1a1d6349,0x17c5c40b,0xdfb772}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6e8c9d8ade0981fd,0x58b7adb777a0a299,0x1a1d63497d4113a1,0xdfb77217c5c40b}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x4363,0xd1dc,0x3a2d,0x523e,0xecad,0x20f1,0x267e,0x376e,0x661b,0x53fc,0xddaa,0xf004,0x267a,0x5b07,0xd8e1,0x6f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd1dc4363,0x523e3a2d,0x20f1ecad,0x376e267e,0x53fc661b,0xf004ddaa,0x5b07267a,0x6fd8e1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x523e3a2dd1dc4363,0x376e267e20f1ecad,0xf004ddaa53fc661b,0x6fd8e15b07267a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xcf33,0x480d,0xb630,0x1b8,0x2475,0x97c4,0x8cca,0x455c,0x141f,0x8b51,0x622b,0x778e,0x9837,0xc3c6,0xd45d,0xdb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x480dcf33,0x1b8b630,0x97c42475,0x455c8cca,0x8b51141f,0x778e622b,0xc3c69837,0xdbd45d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1b8b630480dcf33,0x455c8cca97c42475,0x778e622b8b51141f,0xdbd45dc3c69837}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x118e,0xd79,0xb20,0xd8ce,0x7b89,0x7238,0x341f,0xf9cd,0x1944,0x3d2a,0x6137,0x4827,0x6ad3,0x3506,0x2afe,0x22}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd79118e,0xd8ce0b20,0x72387b89,0xf9cd341f,0x3d2a1944,0x48276137,0x35066ad3,0x222afe}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd8ce0b200d79118e,0xf9cd341f72387b89,0x482761373d2a1944,0x222afe35066ad3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd6bd,0xdb42,0x6f34,0xaae9,0x2b3a,0x4274,0xac8b,0x492f,0x4605,0x8e5b,0xbe28,0x41c8,0xffe7,0x8e8,0xcb67,0x66}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdb42d6bd,0xaae96f34,0x42742b3a,0x492fac8b,0x8e5b4605,0x41c8be28,0x8e8ffe7,0x66cb67}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xaae96f34db42d6bd,0x492fac8b42742b3a,0x41c8be288e5b4605,0x66cb6708e8ffe7}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9b92,0x3cde,0x8dc9,0x4acd,0x59f6,0x378c,0x93ea,0xb253,0x4da5,0xc63f,0xd6f3,0xb325,0xd36c,0xd143,0x350e,0x24}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3cde9b92,0x4acd8dc9,0x378c59f6,0xb25393ea,0xc63f4da5,0xb325d6f3,0xd143d36c,0x24350e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4acd8dc93cde9b92,0xb25393ea378c59f6,0xb325d6f3c63f4da5,0x24350ed143d36c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xee73,0xf286,0xf4df,0x2731,0x8476,0x8dc7,0xcbe0,0x632,0xe6bb,0xc2d5,0x9ec8,0xb7d8,0x952c,0xcaf9,0xd501,0xdd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf286ee73,0x2731f4df,0x8dc78476,0x632cbe0,0xc2d5e6bb,0xb7d89ec8,0xcaf9952c,0xddd501}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2731f4dff286ee73,0x632cbe08dc78476,0xb7d89ec8c2d5e6bb,0xddd501caf9952c}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x19e1, 0x1d98, 0x1de9, 0x1dfc, 0x922, 0x1fb8, 0x476, 0xd05, 0xc85, 0x1788, 0x1967, 0x155d, 0x1f93, 0x629, 0x188f, 0x119, 0x1f6f, 0x241, 0x1378, 0x0} +#elif RADIX == 32 +{0xf6633c2, 0x2efe77a, 0xedfb849, 0x1215a0a4, 0x1cb3de21, 0x13f93aae, 0x6711e62, 0x120fdbc2, 0x9bc0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x922efe77a7b319e, 0xef10c8568291dbf7, 0xe23cc53f93aaee59, 0x54de0483f6f08c} +#else +{0x177f3bd3d98cf, 0x568291dbf7092, 0x755dcb3de2190, 0x423388f314fe4, 0x2a6f0241fb7} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x811, 0xf66, 0x77a, 0x177f, 0x248, 0x17ee, 0x91d, 0xb41, 0x321, 0x1de2, 0xe59, 0x1d57, 0xfe4, 0x198a, 0xe23, 0x1846, 0xfdb, 0x90, 0x14de, 0x8} +#elif RADIX == 32 +{0x13d99023, 0x8bbf9de, 0x3b7ee12, 0xc856829, 0x172cf788, 0x14fe4eab, 0x119c4798, 0x483f6f0, 0x3a6f0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xc248bbf9de9ecc81, 0x7bc43215a0a476fd, 0x388f314fe4eabb96, 0x95378120fdbc23} +#else +{0x45dfcef4f6640, 0x15a0a476fdc24, 0x1d5772cf78864, 0x708ce23cc53f9, 0x2ca9bc0907ed} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x869, 0x197b, 0xcdb, 0x1d89, 0xf9b, 0x1d79, 0x18ec, 0xafe, 0x1d41, 0x77, 0x9d4, 0x1a3f, 0x2b, 0x46d, 0x173e, 0xedd, 0x172, 0x1c77, 0x8a6, 0x8} +#elif RADIX == 32 +{0x1e5ed0d3, 0x1bec4b36, 0x1d9d797c, 0x15055fd8, 0x14ea01df, 0x1a02bd1f, 0x176e7c46, 0x3b85c9d, 0x34537} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x2f9bec4b36f2f686, 0xefd4157f63b3af, 0xdcf88da02bd1fa75, 0x31229b8ee17276e} +#else +{0x5f6259b797b43, 0x157f63b3af2f9, 0x7a3f4ea01dfa8, 0x1dbb73e23680a, 0x18914dc770b9} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x124b, 0xed4, 0x1706, 0x32d, 0x1541, 0x11b8, 0x2b0, 0xbe4, 0x1ee8, 0x1a3c, 0x16e3, 0x1d25, 0x19bb, 0xb63, 0x1fc1, 0x5fa, 0xf03, 0xfa, 0x1ec, 0x9} +#elif RADIX == 32 +{0x13b52497, 0x1196dc1, 0x1611b8aa, 0x1ba17c82, 0x1b71e8f3, 0x79bbe92, 0x1ebf82b6, 0x7d3c0cb, 0x40f60} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x1541196dc19da924, 0xf479ee85f20ac237, 0x7f056c79bbe92db8, 0x3b87b01f4f032fd} +#else +{0x8cb6e0ced492, 0x5f20ac237154, 0x7d25b71e8f3dd, 0x4bf5fc15b1e6e, 0x1dc3d80fa781} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1e71, 0xd67, 0x13da, 0x19eb, 0x137a, 0x1d27, 0x1ba7, 0x1996, 0x755, 0xe3d, 0x1139, 0x1764, 0x18ac, 0x1020, 0x3c4, 0x150e, 0x1ffd, 0x14fe, 0xa16, 0x6} +#elif RADIX == 32 +{0x1359fce3, 0x1acf5cf6, 0x14fd279b, 0x1d5732db, 0x89cb8f4, 0x18acbb2, 0x3878902, 0x7f7ff6a, 0x150b5} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xf37acf5cf69acfe7, 0x5c7a755ccb6e9fa4, 0xf120418acbb244e, 0x8285a9fdffda87} +#else +{0x567ae7b4d67f3, 0x5ccb6e9fa4f37, 0x176489cb8f4ea, 0x6a1c3c481062b, 0x2c142d4feffe} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x13ec, 0x10a3, 0x1e69, 0x106f, 0x619, 0x1cb5, 0x9aa, 0x362, 0x53a, 0x1af5, 0x1bae, 0x60a, 0x2a4, 0x448, 0x3d0, 0x535, 0xeb1, 0x1a6e, 0x978, 0x5} +#elif RADIX == 32 +{0xc28e7d9, 0x19837f9a, 0x155cb530, 0x14e86c49, 0xdd76bd4, 0x102a4305, 0xd47a044, 0x1373ac4a, 0x4bc6} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xa619837f9a61473e, 0xb5ea53a1b126ab96, 0x8f408902a43056eb, 0x3ea5e34dceb129a} +#else +{0x4c1bfcd30a39f, 0x21b126ab96a61, 0x60add76bd4a7, 0x4a6a3d02240a9, 0x1f52f1a6e758} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x77a, 0x201, 0x168d, 0x8fe, 0x780, 0x1ccb, 0x52b, 0x1c83, 0x18dd, 0xcef, 0x11f5, 0x1446, 0x301, 0xb63, 0xe3f, 0x1b72, 0x1, 0x1da9, 0x1281, 0x8} +#elif RADIX == 32 +{0x8804ef5, 0x47f5a3, 0x57ccb3c, 0x3779065, 0x8fab3bf, 0x6301a23, 0x1c9c7eb6, 0xd480076, 0x3940f} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x678047f5a3440277, 0x59df8dde4194af99, 0x38fd6c6301a2347d, 0x364a07b52001db9} +#else +{0x23fad1a2013b, 0x5e4194af99678, 0x34468fab3bf1b, 0x76e4e3f5b18c0, 0x432503da9000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1, 0xb39, 0x969, 0x1324, 0xbe6, 0x86e, 0x1021, 0x29a, 0x1ff0, 0xd23, 0x7d5, 0x72a, 0x1e33, 0x1fd9, 0x10af, 0x15bc, 0x1d56, 0x928, 0x1d49, 0x0} +#elif RADIX == 32 +{0xace4002, 0x699225a, 0x4286e5f, 0x1fc05350, 0x3eab48f, 0x13e33395, 0xf215ffd, 0x94755ab, 0xea4a} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xcbe699225a567200, 0x5a47ff014d40850d, 0x42bffb3e333951f5, 0x57525251d56ade} +#else +{0x34c912d2b3900, 0x14d40850dcbe, 0x672a3eab48ffe, 0x2b790affecf8c, 0x2ba92928eab} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xef13,0xa8dc,0x8ceb,0xe405,0xe2f5,0xfda5,0x28ac,0x3bbe,0x41e5,0xee91,0xb0ff,0x5f5c,0x1920,0x1e33,0xef67,0x95}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa8dcef13,0xe4058ceb,0xfda5e2f5,0x3bbe28ac,0xee9141e5,0x5f5cb0ff,0x1e331920,0x95ef67}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xe4058ceba8dcef13,0x3bbe28acfda5e2f5,0x5f5cb0ffee9141e5,0x95ef671e331920}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6b6e,0x9e93,0xfbce,0xb1b6,0x80bb,0x14b8,0x20ae,0x6bcd,0xb7f4,0xfeff,0xc4a7,0xceb3,0xd874,0x65bf,0xe003,0xe9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9e936b6e,0xb1b6fbce,0x14b880bb,0x6bcd20ae,0xfeffb7f4,0xceb3c4a7,0x65bfd874,0xe9e003}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb1b6fbce9e936b6e,0x6bcd20ae14b880bb,0xceb3c4a7feffb7f4,0xe9e00365bfd874}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x47ff,0xc988,0x46b6,0x5236,0x9694,0xec04,0xd563,0x7d56,0x6833,0xc48f,0x8b0a,0xe195,0xb64e,0xe957,0x58b2,0xdb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc98847ff,0x523646b6,0xec049694,0x7d56d563,0xc48f6833,0xe1958b0a,0xe957b64e,0xdb58b2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x523646b6c98847ff,0x7d56d563ec049694,0xe1958b0ac48f6833,0xdb58b2e957b64e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x10ed,0x5723,0x7314,0x1bfa,0x1d0a,0x25a,0xd753,0xc441,0xbe1a,0x116e,0x4f00,0xa0a3,0xe6df,0xe1cc,0x1098,0x6a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x572310ed,0x1bfa7314,0x25a1d0a,0xc441d753,0x116ebe1a,0xa0a34f00,0xe1cce6df,0x6a1098}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1bfa7314572310ed,0xc441d753025a1d0a,0xa0a34f00116ebe1a,0x6a1098e1cce6df}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x231b,0x1af2,0x1640,0xb19c,0xf713,0xe470,0x683e,0xf39a,0x3289,0x7a54,0xc26e,0x904e,0xd5a6,0x6a0c,0x55fc,0x44}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1af2231b,0xb19c1640,0xe470f713,0xf39a683e,0x7a543289,0x904ec26e,0x6a0cd5a6,0x4455fc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb19c16401af2231b,0xf39a683ee470f713,0x904ec26e7a543289,0x4455fc6a0cd5a6}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xad7a,0xb685,0xde69,0x55d2,0x5675,0x84e8,0x5916,0x925f,0x8c0a,0x1cb6,0x7c51,0x8391,0xffce,0x11d1,0x96ce,0xcd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb685ad7a,0x55d2de69,0x84e85675,0x925f5916,0x1cb68c0a,0x83917c51,0x11d1ffce,0xcd96ce}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x55d2de69b685ad7a,0x925f591684e85675,0x83917c511cb68c0a,0xcd96ce11d1ffce}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3724,0x79bd,0x1b92,0x959b,0xb3ec,0x6f18,0x27d4,0x64a7,0x9b4b,0x8c7e,0xade7,0x664b,0xa6d9,0xa287,0x6a1d,0x48}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x79bd3724,0x959b1b92,0x6f18b3ec,0x64a727d4,0x8c7e9b4b,0x664bade7,0xa287a6d9,0x486a1d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x959b1b9279bd3724,0x64a727d46f18b3ec,0x664bade78c7e9b4b,0x486a1da287a6d9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdce5,0xe50d,0xe9bf,0x4e63,0x8ec,0x1b8f,0x97c1,0xc65,0xcd76,0x85ab,0x3d91,0x6fb1,0x2a59,0x95f3,0xaa03,0xbb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe50ddce5,0x4e63e9bf,0x1b8f08ec,0xc6597c1,0x85abcd76,0x6fb13d91,0x95f32a59,0xbbaa03}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4e63e9bfe50ddce5,0xc6597c11b8f08ec,0x6fb13d9185abcd76,0xbbaa0395f32a59}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8d79,0x38f8,0xf94c,0xe776,0x2bdf,0x2d2e,0x4242,0x8677,0xddf0,0x1736,0xa2e3,0x8ee7,0x52ac,0x4bb1,0xbb55,0xa4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x38f88d79,0xe776f94c,0x2d2e2bdf,0x86774242,0x1736ddf0,0x8ee7a2e3,0x4bb152ac,0xa4bb55}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xe776f94c38f88d79,0x867742422d2e2bdf,0x8ee7a2e31736ddf0,0xa4bb554bb152ac}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6774,0xe280,0xc0b8,0xd49d,0x3b88,0x2577,0xc53f,0x7a5d,0x3032,0x4cfb,0xd6b2,0x3ed5,0x27b8,0x584c,0x85b1,0xfc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe2806774,0xd49dc0b8,0x25773b88,0x7a5dc53f,0x4cfb3032,0x3ed5d6b2,0x584c27b8,0xfc85b1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd49dc0b8e2806774,0x7a5dc53f25773b88,0x3ed5d6b24cfb3032,0xfc85b1584c27b8}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc139,0x25cf,0xd25b,0xadb9,0xbd39,0xaa20,0x8867,0x4e7a,0x8b24,0xa81f,0x412a,0xacfc,0xee2d,0xab0c,0x1d50,0x20}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x25cfc139,0xadb9d25b,0xaa20bd39,0x4e7a8867,0xa81f8b24,0xacfc412a,0xab0cee2d,0x201d50}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xadb9d25b25cfc139,0x4e7a8867aa20bd39,0xacfc412aa81f8b24,0x201d50ab0cee2d}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7287,0xc707,0x6b3,0x1889,0xd420,0xd2d1,0xbdbd,0x7988,0x220f,0xe8c9,0x5d1c,0x7118,0xad53,0xb44e,0x44aa,0x5b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc7077287,0x188906b3,0xd2d1d420,0x7988bdbd,0xe8c9220f,0x71185d1c,0xb44ead53,0x5b44aa}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x188906b3c7077287,0x7988bdbdd2d1d420,0x71185d1ce8c9220f,0x5b44aab44ead53}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xef13,0xa8dc,0x8ceb,0xe405,0xe2f5,0xfda5,0x28ac,0x3bbe,0x41e5,0xee91,0xb0ff,0x5f5c,0x1920,0x1e33,0xef67,0x95}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa8dcef13,0xe4058ceb,0xfda5e2f5,0x3bbe28ac,0xee9141e5,0x5f5cb0ff,0x1e331920,0x95ef67}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xe4058ceba8dcef13,0x3bbe28acfda5e2f5,0x5f5cb0ffee9141e5,0x95ef671e331920}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6b6e,0x9e93,0xfbce,0xb1b6,0x80bb,0x14b8,0x20ae,0x6bcd,0xb7f4,0xfeff,0xc4a7,0xceb3,0xd874,0x65bf,0xe003,0xe9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9e936b6e,0xb1b6fbce,0x14b880bb,0x6bcd20ae,0xfeffb7f4,0xceb3c4a7,0x65bfd874,0xe9e003}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb1b6fbce9e936b6e,0x6bcd20ae14b880bb,0xceb3c4a7feffb7f4,0xe9e00365bfd874}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x47ff,0xc988,0x46b6,0x5236,0x9694,0xec04,0xd563,0x7d56,0x6833,0xc48f,0x8b0a,0xe195,0xb64e,0xe957,0x58b2,0xdb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc98847ff,0x523646b6,0xec049694,0x7d56d563,0xc48f6833,0xe1958b0a,0xe957b64e,0xdb58b2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x523646b6c98847ff,0x7d56d563ec049694,0xe1958b0ac48f6833,0xdb58b2e957b64e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x10ed,0x5723,0x7314,0x1bfa,0x1d0a,0x25a,0xd753,0xc441,0xbe1a,0x116e,0x4f00,0xa0a3,0xe6df,0xe1cc,0x1098,0x6a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x572310ed,0x1bfa7314,0x25a1d0a,0xc441d753,0x116ebe1a,0xa0a34f00,0xe1cce6df,0x6a1098}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1bfa7314572310ed,0xc441d753025a1d0a,0xa0a34f00116ebe1a,0x6a1098e1cce6df}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x118e,0xd79,0xb20,0xd8ce,0x7b89,0x7238,0x341f,0xf9cd,0x1944,0x3d2a,0x6137,0x4827,0x6ad3,0x3506,0x2afe,0x22}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd79118e,0xd8ce0b20,0x72387b89,0xf9cd341f,0x3d2a1944,0x48276137,0x35066ad3,0x222afe}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd8ce0b200d79118e,0xf9cd341f72387b89,0x482761373d2a1944,0x222afe35066ad3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd6bd,0xdb42,0x6f34,0xaae9,0x2b3a,0x4274,0xac8b,0x492f,0x4605,0x8e5b,0xbe28,0x41c8,0xffe7,0x8e8,0xcb67,0x66}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdb42d6bd,0xaae96f34,0x42742b3a,0x492fac8b,0x8e5b4605,0x41c8be28,0x8e8ffe7,0x66cb67}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xaae96f34db42d6bd,0x492fac8b42742b3a,0x41c8be288e5b4605,0x66cb6708e8ffe7}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9b92,0x3cde,0x8dc9,0x4acd,0x59f6,0x378c,0x93ea,0xb253,0x4da5,0xc63f,0xd6f3,0xb325,0xd36c,0xd143,0x350e,0x24}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3cde9b92,0x4acd8dc9,0x378c59f6,0xb25393ea,0xc63f4da5,0xb325d6f3,0xd143d36c,0x24350e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4acd8dc93cde9b92,0xb25393ea378c59f6,0xb325d6f3c63f4da5,0x24350ed143d36c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xee73,0xf286,0xf4df,0x2731,0x8476,0x8dc7,0xcbe0,0x632,0xe6bb,0xc2d5,0x9ec8,0xb7d8,0x952c,0xcaf9,0xd501,0xdd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf286ee73,0x2731f4df,0x8dc78476,0x632cbe0,0xc2d5e6bb,0xb7d89ec8,0xcaf9952c,0xddd501}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2731f4dff286ee73,0x632cbe08dc78476,0xb7d89ec8c2d5e6bb,0xddd501caf9952c}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7029,0x8b30,0x7529,0x9941,0x2be8,0x7b3f,0xe3d7,0x4553,0x7065,0x7bef,0xb49c,0xc80b,0xfa3e,0x950c,0x1ece,0x18}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8b307029,0x99417529,0x7b3f2be8,0x4553e3d7,0x7bef7065,0xc80bb49c,0x950cfa3e,0x181ece}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x994175298b307029,0x4553e3d77b3f2be8,0xc80bb49c7bef7065,0x181ece950cfa3e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb399,0x92ce,0x85e8,0x7c82,0x86eb,0xb186,0x8924,0x64f1,0xd93,0x5e9a,0x3165,0x4196,0x5e79,0x158,0x55d5,0x31}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x92ceb399,0x7c8285e8,0xb18686eb,0x64f18924,0x5e9a0d93,0x41963165,0x1585e79,0x3155d5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7c8285e892ceb399,0x64f18924b18686eb,0x419631655e9a0d93,0x3155d501585e79}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xda47,0x29f8,0x7209,0xaa0c,0xfc22,0x39c9,0x6e19,0x517c,0xc94e,0xcfa4,0x20fc,0x1edc,0xe0d0,0x396d,0x85f0,0xdf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x29f8da47,0xaa0c7209,0x39c9fc22,0x517c6e19,0xcfa4c94e,0x1edc20fc,0x396de0d0,0xdf85f0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xaa0c720929f8da47,0x517c6e1939c9fc22,0x1edc20fccfa4c94e,0xdf85f0396de0d0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8fd7,0x74cf,0x8ad6,0x66be,0xd417,0x84c0,0x1c28,0xbaac,0x8f9a,0x8410,0x4b63,0x37f4,0x5c1,0x6af3,0xe131,0xe7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x74cf8fd7,0x66be8ad6,0x84c0d417,0xbaac1c28,0x84108f9a,0x37f44b63,0x6af305c1,0xe7e131}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x66be8ad674cf8fd7,0xbaac1c2884c0d417,0x37f44b6384108f9a,0xe7e1316af305c1}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x13f5, 0x8b7, 0x1873, 0x144a, 0x1a89, 0x13f9, 0xd49, 0x6f2, 0x3bb, 0x102, 0x1ecb, 0x180b, 0x4d5, 0x608, 0x119, 0x5e6, 0x751, 0x961, 0xd37, 0x5} +#elif RADIX == 32 +{0x1a2de7eb, 0x9a2561c, 0x933f9d4, 0xeecde4d, 0x1f658408, 0x104d5c05, 0x19823260, 0xb09d44b, 0x69ba} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3a89a2561cd16f3f, 0xc2043bb37935267f, 0x464c104d5c05fb2, 0x1bb4dd2c27512f3} +#else +{0x4d12b0e68b79f, 0x337935267f3a8, 0x380bf65840877, 0x4bcc119304135, 0x35da6e9613a8} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x1e96, 0x1a2d, 0x161c, 0xd12, 0xea2, 0xcfe, 0x1352, 0x19bc, 0x10ee, 0x1840, 0x1fb2, 0xe02, 0x135, 0x982, 0x1046, 0x979, 0x9d4, 0x1a58, 0x1b4d, 0x9} +#elif RADIX == 32 +{0x68b7d2d, 0x2689587, 0xa4cfe75, 0x3bb3793, 0xfd96102, 0x4135701, 0x1e608c98, 0x12c27512, 0x4da6e} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xcea2689587345be9, 0xb0810eecde4d499f, 0xc1193041357017ec, 0x22ed374b09d44bc} +#else +{0x1344ac39a2df4, 0x6cde4d499fcea, 0x2e02fd961021d, 0x12f30464c104d, 0x39769ba584ea} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0xa82, 0x1d2d, 0x15b8, 0x404, 0x1a32, 0xaf9, 0xa86, 0xddf, 0x14bf, 0x100c, 0xc42, 0xa89, 0x1df, 0x82f, 0x1f07, 0x782, 0x664, 0x1ba5, 0x5d7, 0x2} +#elif RADIX == 32 +{0x74b5504, 0x1220256e, 0x10caf9d1, 0x12fdbbea, 0x16214032, 0x1e1df544, 0xbe0e82, 0x1d29990f, 0x22ebe} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3a3220256e3a5aa8, 0xa0194bf6efaa195f, 0x7c1d05e1df544b10, 0xb175f74a6643c1} +#else +{0x11012b71d2d54, 0x76efaa195f3a3, 0x6a89621403297, 0xf05f07417877, 0x58bafba5332} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x5a1, 0x46a, 0x17ab, 0x1cfa, 0x547, 0x1b9c, 0xda5, 0x141e, 0x216, 0x1f49, 0xaca, 0x15a1, 0xfe0, 0x1afb, 0x1a47, 0x133d, 0x1887, 0x590, 0xbc2, 0x1} +#elif RADIX == 32 +{0x191a8b42, 0x7e7d5ea, 0x14bb9c2a, 0x85a83cd, 0x15657d24, 0x16fe0ad0, 0xf748faf, 0xc8621e6, 0x15e11} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x8547e7d5eac8d45a, 0xbe92216a0f369773, 0xe91f5f6fe0ad0ab2, 0x5af08b2188799e} +#else +{0x3f3eaf5646a2d, 0x6a0f369773854, 0x15a15657d2442, 0x667ba47d7dbf8, 0x2d784590c43} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1311, 0x910, 0x413, 0x1d16, 0x14f7, 0x19c9, 0x14d3, 0x1504, 0x776, 0x1c2c, 0x15b0, 0xc6e, 0x36b, 0x1777, 0x1ed2, 0xb34, 0x1281, 0x1281, 0xd0f, 0x4} +#elif RADIX == 32 +{0x1a442622, 0x17e8b104, 0x1a79c9a7, 0x1ddaa094, 0xad870b0, 0xe36b637, 0xd3da577, 0x140ca056, 0x4687c} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x34f7e8b104d22131, 0x3858776a82534f39, 0x7b4aeee36b63756c, 0x7343e50328159a} +#else +{0x3f45882691098, 0x6a82534f3934f, 0x6c6ead870b0ee, 0x5669ed2bbb8da, 0x2b9a1f281940} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x12d2, 0x6d8, 0x1e2c, 0x6f9, 0x5e8, 0x4e5, 0x32c, 0x58d, 0x1bda, 0x16f9, 0x8b5, 0x3c0, 0x10c, 0xb18, 0x450, 0x834, 0x3b7, 0x8d7, 0x15bf, 0x0} +#elif RADIX == 32 +{0x1b625a4, 0x837cf8b, 0x584e52f, 0xf68b1a3, 0x45adbe7, 0x1010c1e0, 0xd08a0b1, 0x6b8edd0, 0xadfa} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xa5e837cf8b0db12d, 0x6df3bda2c68cb09c, 0x114163010c1e022d, 0xa56fd1ae3b741a} +#else +{0x41be7c586d896, 0x22c68cb09ca5e, 0x3c045adbe77b, 0x506845058c043, 0x2d2b7e8d71db} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x5f, 0x444, 0x49e, 0xae7, 0x248, 0x1a37, 0x9b6, 0xc28, 0x464, 0x19b7, 0x1560, 0xd7a, 0x2e3, 0x81a, 0x6f5, 0x5f9, 0x1818, 0x164c, 0x1713, 0x7} +#elif RADIX == 32 +{0x111100bf, 0x8573927, 0x16da3712, 0x11918509, 0xab066dc, 0x142e36bd, 0x1e4dea81, 0x1266060b, 0x2b89d} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xe248573927888805, 0x336e46461426db46, 0x9bd50342e36bd558, 0x4edc4ec998182fc} +#else +{0x42b9c93c44402, 0x461426db46e24, 0x6d7aab066dc8c, 0xbf26f540d0b8, 0x4f6e2764cc0c} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x19b1, 0x1912, 0x1eb, 0x1cbc, 0x210, 0x17cf, 0x1b9e, 0x754, 0x38c, 0x816, 0x1431, 0x79a, 0xa57, 0x15ff, 0x756, 0xa60, 0x1064, 0x162f, 0x1e5e, 0x0} +#elif RADIX == 32 +{0x1e44b362, 0x10e5e07a, 0x13d7cf10, 0xe30ea9b, 0xa18a058, 0x1ea573cd, 0x180ead5f, 0x117c1914, 0xf2f5} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xe210e5e07af2259b, 0x502c38c3aa6e7af9, 0x1d5abfea573cd50c, 0x5797ac5f064530} +#else +{0x72f03d7912cd, 0x43aa6e7af9e21, 0x679aa18a05871, 0x14c0756affa95, 0x2abcbd62f832} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x5ff1,0xa594,0x52b3,0xe75d,0xdd09,0xd267,0x7d25,0xd976,0xbc5,0xc1a8,0x9aae,0x10bf,0xe894,0x8de3,0xae84,0x70}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa5945ff1,0xe75d52b3,0xd267dd09,0xd9767d25,0xc1a80bc5,0x10bf9aae,0x8de3e894,0x70ae84}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xe75d52b3a5945ff1,0xd9767d25d267dd09,0x10bf9aaec1a80bc5,0x70ae848de3e894}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x11e6,0xb9e0,0x96c0,0xa6d7,0xee81,0x4b6,0x2f44,0xf4c5,0x4597,0xe75d,0x5b93,0xebb6,0x59c6,0xc08e,0x3084,0x16}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb9e011e6,0xa6d796c0,0x4b6ee81,0xf4c52f44,0xe75d4597,0xebb65b93,0xc08e59c6,0x163084}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa6d796c0b9e011e6,0xf4c52f4404b6ee81,0xebb65b93e75d4597,0x163084c08e59c6}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf41d,0x3463,0x6031,0x479f,0x6fe7,0x159f,0x1e6b,0x404e,0xe302,0x88a8,0xc1f7,0xad84,0x8b50,0x3175,0x3d66,0xab}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3463f41d,0x479f6031,0x159f6fe7,0x404e1e6b,0x88a8e302,0xad84c1f7,0x31758b50,0xab3d66}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x479f60313463f41d,0x404e1e6b159f6fe7,0xad84c1f788a8e302,0xab3d6631758b50}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xa00f,0x5a6b,0xad4c,0x18a2,0x22f6,0x2d98,0x82da,0x2689,0xf43a,0x3e57,0x6551,0xef40,0x176b,0x721c,0x517b,0x8f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x5a6ba00f,0x18a2ad4c,0x2d9822f6,0x268982da,0x3e57f43a,0xef406551,0x721c176b,0x8f517b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x18a2ad4c5a6ba00f,0x268982da2d9822f6,0xef4065513e57f43a,0x8f517b721c176b}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x231b,0x1af2,0x1640,0xb19c,0xf713,0xe470,0x683e,0xf39a,0x3289,0x7a54,0xc26e,0x904e,0xd5a6,0x6a0c,0x55fc,0x44}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1af2231b,0xb19c1640,0xe470f713,0xf39a683e,0x7a543289,0x904ec26e,0x6a0cd5a6,0x4455fc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb19c16401af2231b,0xf39a683ee470f713,0x904ec26e7a543289,0x4455fc6a0cd5a6}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xad7a,0xb685,0xde69,0x55d2,0x5675,0x84e8,0x5916,0x925f,0x8c0a,0x1cb6,0x7c51,0x8391,0xffce,0x11d1,0x96ce,0xcd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb685ad7a,0x55d2de69,0x84e85675,0x925f5916,0x1cb68c0a,0x83917c51,0x11d1ffce,0xcd96ce}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x55d2de69b685ad7a,0x925f591684e85675,0x83917c511cb68c0a,0xcd96ce11d1ffce}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3724,0x79bd,0x1b92,0x959b,0xb3ec,0x6f18,0x27d4,0x64a7,0x9b4b,0x8c7e,0xade7,0x664b,0xa6d9,0xa287,0x6a1d,0x48}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x79bd3724,0x959b1b92,0x6f18b3ec,0x64a727d4,0x8c7e9b4b,0x664bade7,0xa287a6d9,0x486a1d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x959b1b9279bd3724,0x64a727d46f18b3ec,0x664bade78c7e9b4b,0x486a1da287a6d9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdce5,0xe50d,0xe9bf,0x4e63,0x8ec,0x1b8f,0x97c1,0xc65,0xcd76,0x85ab,0x3d91,0x6fb1,0x2a59,0x95f3,0xaa03,0xbb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe50ddce5,0x4e63e9bf,0x1b8f08ec,0xc6597c1,0x85abcd76,0x6fb13d91,0x95f32a59,0xbbaa03}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4e63e9bfe50ddce5,0xc6597c11b8f08ec,0x6fb13d9185abcd76,0xbbaa0395f32a59}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xffc3,0x1fbe,0xc7ef,0x56c4,0x2834,0xfa5c,0x36aa,0x1ced,0x9076,0xa31d,0x8890,0xe52,0x87d2,0xef68,0x98bc,0xc2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1fbeffc3,0x56c4c7ef,0xfa5c2834,0x1ced36aa,0xa31d9076,0xe528890,0xef6887d2,0xc298bc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x56c4c7ef1fbeffc3,0x1ced36aafa5c2834,0xe528890a31d9076,0xc298bcef6887d2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x4098,0xd740,0xb5c6,0x8109,0x299,0x3a8c,0x81c2,0xc0d0,0xe848,0x9243,0x8996,0x656a,0x8c87,0x6c99,0xb9f5,0x4c}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd7404098,0x8109b5c6,0x3a8c0299,0xc0d081c2,0x9243e848,0x656a8996,0x6c998c87,0x4cb9f5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8109b5c6d7404098,0xc0d081c23a8c0299,0x656a89969243e848,0x4cb9f56c998c87}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x712b,0xfeed,0x55b5,0xc5fe,0xe867,0x77a9,0x1775,0x7814,0x4780,0x73b1,0x86b1,0x3973,0x797a,0x7f0b,0x1fa,0xb0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xfeed712b,0xc5fe55b5,0x77a9e867,0x78141775,0x73b14780,0x397386b1,0x7f0b797a,0xb001fa}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc5fe55b5feed712b,0x7814177577a9e867,0x397386b173b14780,0xb001fa7f0b797a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3d,0xe041,0x3810,0xa93b,0xd7cb,0x5a3,0xc955,0xe312,0x6f89,0x5ce2,0x776f,0xf1ad,0x782d,0x1097,0x6743,0x3d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe041003d,0xa93b3810,0x5a3d7cb,0xe312c955,0x5ce26f89,0xf1ad776f,0x1097782d,0x3d6743}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa93b3810e041003d,0xe312c95505a3d7cb,0xf1ad776f5ce26f89,0x3d67431097782d}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x5ff1,0xa594,0x52b3,0xe75d,0xdd09,0xd267,0x7d25,0xd976,0xbc5,0xc1a8,0x9aae,0x10bf,0xe894,0x8de3,0xae84,0x70}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa5945ff1,0xe75d52b3,0xd267dd09,0xd9767d25,0xc1a80bc5,0x10bf9aae,0x8de3e894,0x70ae84}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xe75d52b3a5945ff1,0xd9767d25d267dd09,0x10bf9aaec1a80bc5,0x70ae848de3e894}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x11e6,0xb9e0,0x96c0,0xa6d7,0xee81,0x4b6,0x2f44,0xf4c5,0x4597,0xe75d,0x5b93,0xebb6,0x59c6,0xc08e,0x3084,0x16}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb9e011e6,0xa6d796c0,0x4b6ee81,0xf4c52f44,0xe75d4597,0xebb65b93,0xc08e59c6,0x163084}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa6d796c0b9e011e6,0xf4c52f4404b6ee81,0xebb65b93e75d4597,0x163084c08e59c6}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf41d,0x3463,0x6031,0x479f,0x6fe7,0x159f,0x1e6b,0x404e,0xe302,0x88a8,0xc1f7,0xad84,0x8b50,0x3175,0x3d66,0xab}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3463f41d,0x479f6031,0x159f6fe7,0x404e1e6b,0x88a8e302,0xad84c1f7,0x31758b50,0xab3d66}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x479f60313463f41d,0x404e1e6b159f6fe7,0xad84c1f788a8e302,0xab3d6631758b50}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xa00f,0x5a6b,0xad4c,0x18a2,0x22f6,0x2d98,0x82da,0x2689,0xf43a,0x3e57,0x6551,0xef40,0x176b,0x721c,0x517b,0x8f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x5a6ba00f,0x18a2ad4c,0x2d9822f6,0x268982da,0x3e57f43a,0xef406551,0x721c176b,0x8f517b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x18a2ad4c5a6ba00f,0x268982da2d9822f6,0xef4065513e57f43a,0x8f517b721c176b}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x118e,0xd79,0xb20,0xd8ce,0x7b89,0x7238,0x341f,0xf9cd,0x1944,0x3d2a,0x6137,0x4827,0x6ad3,0x3506,0x2afe,0x22}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd79118e,0xd8ce0b20,0x72387b89,0xf9cd341f,0x3d2a1944,0x48276137,0x35066ad3,0x222afe}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd8ce0b200d79118e,0xf9cd341f72387b89,0x482761373d2a1944,0x222afe35066ad3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd6bd,0xdb42,0x6f34,0xaae9,0x2b3a,0x4274,0xac8b,0x492f,0x4605,0x8e5b,0xbe28,0x41c8,0xffe7,0x8e8,0xcb67,0x66}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdb42d6bd,0xaae96f34,0x42742b3a,0x492fac8b,0x8e5b4605,0x41c8be28,0x8e8ffe7,0x66cb67}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xaae96f34db42d6bd,0x492fac8b42742b3a,0x41c8be288e5b4605,0x66cb6708e8ffe7}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9b92,0x3cde,0x8dc9,0x4acd,0x59f6,0x378c,0x93ea,0xb253,0x4da5,0xc63f,0xd6f3,0xb325,0xd36c,0xd143,0x350e,0x24}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3cde9b92,0x4acd8dc9,0x378c59f6,0xb25393ea,0xc63f4da5,0xb325d6f3,0xd143d36c,0x24350e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4acd8dc93cde9b92,0xb25393ea378c59f6,0xb325d6f3c63f4da5,0x24350ed143d36c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xee73,0xf286,0xf4df,0x2731,0x8476,0x8dc7,0xcbe0,0x632,0xe6bb,0xc2d5,0x9ec8,0xb7d8,0x952c,0xcaf9,0xd501,0xdd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf286ee73,0x2731f4df,0x8dc78476,0x632cbe0,0xc2d5e6bb,0xb7d89ec8,0xcaf9952c,0xddd501}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2731f4dff286ee73,0x632cbe08dc78476,0xb7d89ec8c2d5e6bb,0xddd501caf9952c}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x5d2b,0x1bd6,0xcc3f,0x7e74,0x4fea,0xfba0,0x9f84,0xd6d4,0x42a1,0x88d1,0x68b1,0x4f4e,0x13ec,0xa60c,0xb13b,0x2e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1bd65d2b,0x7e74cc3f,0xfba04fea,0xd6d49f84,0x88d142a1,0x4f4e68b1,0xa60c13ec,0x2eb13b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7e74cc3f1bd65d2b,0xd6d49f84fba04fea,0x4f4e68b188d142a1,0x2eb13ba60c13ec}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7b4f,0x9448,0xaa16,0x649a,0xe4b4,0x3bc2,0xd3fd,0x8df1,0x931e,0x4078,0x8caa,0xe896,0xdeec,0xbed5,0x166e,0x7c}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x94487b4f,0x649aaa16,0x3bc2e4b4,0x8df1d3fd,0x4078931e,0xe8968caa,0xbed5deec,0x7c166e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x649aaa1694487b4f,0x8df1d3fd3bc2e4b4,0xe8968caa4078931e,0x7c166ebed5deec}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x101d,0x51aa,0xd32d,0x2b40,0x7ba,0xc5f8,0x257a,0xb323,0x9bde,0x20c5,0xdc8f,0x2c3d,0x4e7b,0x54a6,0x17b9,0x99}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x51aa101d,0x2b40d32d,0xc5f807ba,0xb323257a,0x20c59bde,0x2c3ddc8f,0x54a64e7b,0x9917b9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2b40d32d51aa101d,0xb323257ac5f807ba,0x2c3ddc8f20c59bde,0x9917b954a64e7b}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xa2d5,0xe429,0x33c0,0x818b,0xb015,0x45f,0x607b,0x292b,0xbd5e,0x772e,0x974e,0xb0b1,0xec13,0x59f3,0x4ec4,0xd1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe429a2d5,0x818b33c0,0x45fb015,0x292b607b,0x772ebd5e,0xb0b1974e,0x59f3ec13,0xd14ec4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x818b33c0e429a2d5,0x292b607b045fb015,0xb0b1974e772ebd5e,0xd14ec459f3ec13}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0xa72, 0x186f, 0x81c, 0x105c, 0x151, 0x1451, 0x1b96, 0x4d1, 0x12be, 0x3bf, 0x996, 0x1130, 0x1460, 0x1ed8, 0xc2a, 0x1c23, 0x1ee, 0x3f4, 0xbe2, 0x9} +#elif RADIX == 32 +{0x61bd4e5, 0x1182e207, 0x12d4510a, 0xaf89a3b, 0x4cb0efe, 0x11460898, 0x8d855ed, 0x1fa07bb8, 0x45f10} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x215182e20730dea7, 0x877f2be268ee5a8a, 0xb0abdb1460898265, 0xeaf887e81eee11} +#else +{0xc17103986f53, 0x6268ee5a8a215, 0x11304cb0efe57, 0x3846c2af6c518, 0x2f57c43f40f7} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x1c36, 0x61b, 0x207, 0xc17, 0x854, 0x1514, 0xee5, 0x1134, 0x1caf, 0x10ef, 0x265, 0x44c, 0x518, 0x17b6, 0x1b0a, 0x1708, 0x7b, 0x10fd, 0xaf8, 0x3} +#elif RADIX == 32 +{0x1986f86c, 0x1460b881, 0x1cb51442, 0x12be268e, 0x132c3bf, 0xc518226, 0x236157b, 0x7e81eee, 0x357c4} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x885460b881cc37c3, 0x61dfcaf89a3b96a2, 0x6c2af6c518226099, 0x1fabe21fa07bb84} +#else +{0x2305c40e61be1, 0x789a3b96a2885, 0x44c132c3bf95, 0x6e11b0abdb146, 0x37d5f10fd03d} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x1c07, 0x15d6, 0x526, 0xde7, 0x149b, 0x719, 0x1786, 0x1272, 0x18b, 0x1bac, 0xf74, 0x1588, 0xe6f, 0x24c, 0x1204, 0x1e9d, 0x13bb, 0x1ccb, 0x78d, 0x9} +#elif RADIX == 32 +{0x1575b80f, 0x1b6f3949, 0x10c719a4, 0x62e4e57, 0x7ba6eb0, 0x18e6fac4, 0x7640824, 0x65ceefd, 0x43c6f} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x349b6f3949abadc0, 0x375818b9395e18e3, 0xc810498e6fac43dd, 0x279e379973bbf4e} +#else +{0x5b79ca4d5d6e0, 0x39395e18e3349, 0x75887ba6eb031, 0x7d3b20412639b, 0x13cf1bccb9dd} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0xddf, 0x238, 0xe4b, 0x1958, 0xe6e, 0x1059, 0x133, 0x1e11, 0x5ae, 0x2ab, 0x1044, 0xdd, 0xe9d, 0x1aa8, 0x15e2, 0xc9b, 0xaa6, 0x3c8, 0x10ac, 0x0} +#elif RADIX == 32 +{0x188e1bbe, 0xecac392, 0x6705973, 0x16bbc221, 0x18220aac, 0x10e9d06e, 0x6ebc5aa, 0x1e42a999, 0x8560} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x2e6ecac392c470dd, 0x5565aef0884ce0b, 0xd78b550e9d06ec11, 0x4b42b0790aa664d} +#else +{0x76561c962386e, 0x6f0884ce0b2e6, 0x20dd8220aacb5, 0x19375e2d543a7, 0x4da1583c8553} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x192, 0x1c6d, 0x18a4, 0x152, 0x1aa9, 0xec4, 0x1be8, 0x1209, 0x7f, 0x797, 0x1295, 0x1433, 0x1a75, 0x15a, 0x1d64, 0x146c, 0x12df, 0x10af, 0x188f, 0x1} +#elif RADIX == 32 +{0x71b4324, 0x90a9629, 0x1d0ec4d5, 0x1fe413b, 0x194a9e5c, 0x15a75a19, 0x1b3ac815, 0x57cb7e8, 0x1c47c} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x9aa90a962938da19, 0x4f2e07f904efa1d8, 0x75902b5a75a19ca5, 0xae23e15f2dfa36} +#else +{0x4854b149c6d0c, 0x7904efa1d89aa, 0x343394a9e5c0f, 0x68d9d640ad69d, 0x2d711f0af96f} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x129c, 0xe1d, 0x1bd3, 0xf2a, 0x937, 0xf81, 0xa47, 0x186b, 0x1bbe, 0x1c6d, 0x1edd, 0x1b51, 0xa10, 0x167a, 0x1f0b, 0x374, 0x720, 0x1547, 0x726, 0x1} +#elif RADIX == 32 +{0x1b876538, 0x177956f4, 0x8ef8149, 0xefb0d6a, 0x1f6ef1b7, 0x14a10da8, 0x1d3e1767, 0xa39c806, 0x13935} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x29377956f4dc3b29, 0x78dbbbec35a91df0, 0x7c2ecf4a10da8fb7, 0x3c9c9aa8e7201ba} +#else +{0x3bcab7a6e1d94, 0x6c35a91df0293, 0x1b51f6ef1b777, 0x6e9f0bb3d284, 0x464e4d547390} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x12cc, 0x495, 0x1a14, 0x1db0, 0xb66, 0x76a, 0x1a77, 0xaf6, 0x1656, 0x1ad7, 0xb35, 0x4b1, 0xffa, 0x37b, 0xabf, 0xa5c, 0xdc9, 0x1a74, 0x11c9, 0x8} +#elif RADIX == 32 +{0x1256599, 0x6ed8685, 0xee76a5b, 0x19595eda, 0x159aeb5e, 0x16ffa258, 0x17157e37, 0x13a37254, 0x38e4e} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x4b66ed8685092b2c, 0x75af65657b69dced, 0x2afc6f6ffa258acd, 0x4047274e8dc952e} +#else +{0x376c342849596, 0x657b69dced4b6, 0x44b159aeb5eca, 0x54b8abf1bdbfe, 0x202393a746e4} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1379, 0x125e, 0x1c56, 0x1811, 0x144, 0x2a8, 0xbb3, 0x2ca, 0x6d2, 0x565, 0x91e, 0x1280, 0x1b4f, 0x51a, 0x1eb7, 0x35a, 0x14fe, 0x1b59, 0x182e, 0x2} +#elif RADIX == 32 +{0x1497a6f2, 0x4c08f15, 0x1662a80a, 0x1b48594b, 0x48f1594, 0x15b4f940, 0x16bd6e51, 0x1acd3f86, 0x2c176} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x144c08f15a4bd37, 0x8aca6d21652ecc55, 0x7adca35b4f940247, 0x2e60bb6b34fe1ad} +#else +{0x260478ad25e9b, 0x21652ecc55014, 0x728048f1594da, 0x6b5eb728d6d3, 0x3f305db59a7f} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x323f,0x7ed2,0x4455,0x415c,0x5876,0x4282,0x76ef,0xcc11,0xbdab,0x1142,0x4729,0x3405,0x1155,0x1779,0x7c1f,0xc5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x7ed2323f,0x415c4455,0x42825876,0xcc1176ef,0x1142bdab,0x34054729,0x17791155,0xc57c1f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x415c44557ed2323f,0xcc1176ef42825876,0x340547291142bdab,0xc57c1f17791155}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc9ce,0xa958,0x4fac,0x8a69,0x31e1,0x9997,0x1a17,0x8c19,0xd118,0x68c7,0xc0eb,0x8113,0x62fd,0xf8c8,0xc94e,0x3f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa958c9ce,0x8a694fac,0x999731e1,0x8c191a17,0x68c7d118,0x8113c0eb,0xf8c862fd,0x3fc94e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8a694faca958c9ce,0x8c191a17999731e1,0x8113c0eb68c7d118,0x3fc94ef8c862fd}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x41cb,0xed47,0x8ea0,0x127c,0x69d5,0xf74c,0xce8c,0x3826,0x3da2,0x6bf3,0x56b,0xe695,0xc45c,0x84ac,0x5817,0xd0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xed4741cb,0x127c8ea0,0xf74c69d5,0x3826ce8c,0x6bf33da2,0xe695056b,0x84acc45c,0xd05817}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x127c8ea0ed4741cb,0x3826ce8cf74c69d5,0xe695056b6bf33da2,0xd0581784acc45c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xcdc1,0x812d,0xbbaa,0xbea3,0xa789,0xbd7d,0x8910,0x33ee,0x4254,0xeebd,0xb8d6,0xcbfa,0xeeaa,0xe886,0x83e0,0x3a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x812dcdc1,0xbea3bbaa,0xbd7da789,0x33ee8910,0xeebd4254,0xcbfab8d6,0xe886eeaa,0x3a83e0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xbea3bbaa812dcdc1,0x33ee8910bd7da789,0xcbfab8d6eebd4254,0x3a83e0e886eeaa}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdce5,0xe50d,0xe9bf,0x4e63,0x8ec,0x1b8f,0x97c1,0xc65,0xcd76,0x85ab,0x3d91,0x6fb1,0x2a59,0x95f3,0xaa03,0xbb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe50ddce5,0x4e63e9bf,0x1b8f08ec,0xc6597c1,0x85abcd76,0x6fb13d91,0x95f32a59,0xbbaa03}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4e63e9bfe50ddce5,0xc6597c11b8f08ec,0x6fb13d9185abcd76,0xbbaa0395f32a59}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x5286,0x497a,0x2196,0xaa2d,0xa98a,0x7b17,0xa6e9,0x6da0,0x73f5,0xe349,0x83ae,0x7c6e,0x31,0xee2e,0x6931,0x32}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x497a5286,0xaa2d2196,0x7b17a98a,0x6da0a6e9,0xe34973f5,0x7c6e83ae,0xee2e0031,0x326931}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xaa2d2196497a5286,0x6da0a6e97b17a98a,0x7c6e83aee34973f5,0x326931ee2e0031}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc8dc,0x8642,0xe46d,0x6a64,0x4c13,0x90e7,0xd82b,0x9b58,0x64b4,0x7381,0x5218,0x99b4,0x5926,0x5d78,0x95e2,0xb7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8642c8dc,0x6a64e46d,0x90e74c13,0x9b58d82b,0x738164b4,0x99b45218,0x5d785926,0xb795e2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6a64e46d8642c8dc,0x9b58d82b90e74c13,0x99b45218738164b4,0xb795e25d785926}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x231b,0x1af2,0x1640,0xb19c,0xf713,0xe470,0x683e,0xf39a,0x3289,0x7a54,0xc26e,0x904e,0xd5a6,0x6a0c,0x55fc,0x44}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1af2231b,0xb19c1640,0xe470f713,0xf39a683e,0x7a543289,0x904ec26e,0x6a0cd5a6,0x4455fc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb19c16401af2231b,0xf39a683ee470f713,0x904ec26e7a543289,0x4455fc6a0cd5a6}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7363,0xbe7a,0xc901,0xb6e0,0x6a56,0x779d,0xbc42,0xd659,0x3476,0x3868,0x12f4,0x923a,0x6fa8,0x5412,0xd5f9,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbe7a7363,0xb6e0c901,0x779d6a56,0xd659bc42,0x38683476,0x923a12f4,0x54126fa8,0x3d5f9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb6e0c901be7a7363,0xd659bc42779d6a56,0x923a12f438683476,0x3d5f954126fa8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xedb4,0x4fd4,0x5c14,0x14b,0xf702,0xd6be,0x9c11,0x4bb,0x9f10,0xde25,0xb159,0x5085,0xb0a9,0x6f42,0xc4d3,0x1d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4fd4edb4,0x14b5c14,0xd6bef702,0x4bb9c11,0xde259f10,0x5085b159,0x6f42b0a9,0x1dc4d3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x14b5c144fd4edb4,0x4bb9c11d6bef702,0x5085b159de259f10,0x1dc4d36f42b0a9}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe873,0x4974,0xc7ed,0x6b01,0xaffb,0xf3d4,0xc641,0x20d6,0xca22,0x2d69,0x9f01,0x451e,0xfa05,0xef65,0xb43b,0xde}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4974e873,0x6b01c7ed,0xf3d4affb,0x20d6c641,0x2d69ca22,0x451e9f01,0xef65fa05,0xdeb43b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6b01c7ed4974e873,0x20d6c641f3d4affb,0x451e9f012d69ca22,0xdeb43bef65fa05}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8c9d,0x4185,0x36fe,0x491f,0x95a9,0x8862,0x43bd,0x29a6,0xcb89,0xc797,0xed0b,0x6dc5,0x9057,0xabed,0x2a06,0xfc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x41858c9d,0x491f36fe,0x886295a9,0x29a643bd,0xc797cb89,0x6dc5ed0b,0xabed9057,0xfc2a06}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x491f36fe41858c9d,0x29a643bd886295a9,0x6dc5ed0bc797cb89,0xfc2a06abed9057}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x323f,0x7ed2,0x4455,0x415c,0x5876,0x4282,0x76ef,0xcc11,0xbdab,0x1142,0x4729,0x3405,0x1155,0x1779,0x7c1f,0xc5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x7ed2323f,0x415c4455,0x42825876,0xcc1176ef,0x1142bdab,0x34054729,0x17791155,0xc57c1f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x415c44557ed2323f,0xcc1176ef42825876,0x340547291142bdab,0xc57c1f17791155}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc9ce,0xa958,0x4fac,0x8a69,0x31e1,0x9997,0x1a17,0x8c19,0xd118,0x68c7,0xc0eb,0x8113,0x62fd,0xf8c8,0xc94e,0x3f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa958c9ce,0x8a694fac,0x999731e1,0x8c191a17,0x68c7d118,0x8113c0eb,0xf8c862fd,0x3fc94e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8a694faca958c9ce,0x8c191a17999731e1,0x8113c0eb68c7d118,0x3fc94ef8c862fd}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x41cb,0xed47,0x8ea0,0x127c,0x69d5,0xf74c,0xce8c,0x3826,0x3da2,0x6bf3,0x56b,0xe695,0xc45c,0x84ac,0x5817,0xd0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xed4741cb,0x127c8ea0,0xf74c69d5,0x3826ce8c,0x6bf33da2,0xe695056b,0x84acc45c,0xd05817}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x127c8ea0ed4741cb,0x3826ce8cf74c69d5,0xe695056b6bf33da2,0xd0581784acc45c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xcdc1,0x812d,0xbbaa,0xbea3,0xa789,0xbd7d,0x8910,0x33ee,0x4254,0xeebd,0xb8d6,0xcbfa,0xeeaa,0xe886,0x83e0,0x3a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x812dcdc1,0xbea3bbaa,0xbd7da789,0x33ee8910,0xeebd4254,0xcbfab8d6,0xe886eeaa,0x3a83e0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xbea3bbaa812dcdc1,0x33ee8910bd7da789,0xcbfab8d6eebd4254,0x3a83e0e886eeaa}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xee73,0xf286,0xf4df,0x2731,0x8476,0x8dc7,0xcbe0,0x632,0xe6bb,0xc2d5,0x9ec8,0xb7d8,0x952c,0xcaf9,0xd501,0xdd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf286ee73,0x2731f4df,0x8dc78476,0x632cbe0,0xc2d5e6bb,0xb7d89ec8,0xcaf9952c,0xddd501}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2731f4dff286ee73,0x632cbe08dc78476,0xb7d89ec8c2d5e6bb,0xddd501caf9952c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x2943,0x24bd,0x90cb,0x5516,0xd4c5,0xbd8b,0x5374,0xb6d0,0xb9fa,0x71a4,0x41d7,0xbe37,0x18,0xf717,0x3498,0x99}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x24bd2943,0x551690cb,0xbd8bd4c5,0xb6d05374,0x71a4b9fa,0xbe3741d7,0xf7170018,0x993498}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x551690cb24bd2943,0xb6d05374bd8bd4c5,0xbe3741d771a4b9fa,0x993498f7170018}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x646e,0xc321,0x7236,0xb532,0xa609,0xc873,0x6c15,0x4dac,0xb25a,0x39c0,0x290c,0x4cda,0x2c93,0x2ebc,0xcaf1,0xdb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc321646e,0xb5327236,0xc873a609,0x4dac6c15,0x39c0b25a,0x4cda290c,0x2ebc2c93,0xdbcaf1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb5327236c321646e,0x4dac6c15c873a609,0x4cda290c39c0b25a,0xdbcaf12ebc2c93}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x118e,0xd79,0xb20,0xd8ce,0x7b89,0x7238,0x341f,0xf9cd,0x1944,0x3d2a,0x6137,0x4827,0x6ad3,0x3506,0x2afe,0x22}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd79118e,0xd8ce0b20,0x72387b89,0xf9cd341f,0x3d2a1944,0x48276137,0x35066ad3,0x222afe}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd8ce0b200d79118e,0xf9cd341f72387b89,0x482761373d2a1944,0x222afe35066ad3}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xca5b,0x1036,0x34a6,0x490c,0xc0ed,0x771b,0x1590,0x1c17,0x4855,0x977e,0x8054,0xdb98,0xb26f,0x1175,0x7722,0xfe}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1036ca5b,0x490c34a6,0x771bc0ed,0x1c171590,0x977e4855,0xdb988054,0x1175b26f,0xfe7722}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x490c34a61036ca5b,0x1c171590771bc0ed,0xdb988054977e4855,0xfe77221175b26f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf543,0x821c,0xae0a,0xb0cb,0x642d,0x5a80,0xd2bf,0x2340,0xc8f,0xe1ce,0x4e38,0xdace,0x3445,0x807e,0x9bc4,0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x821cf543,0xb0cbae0a,0x5a80642d,0x2340d2bf,0xe1ce0c8f,0xdace4e38,0x807e3445,0x59bc4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb0cbae0a821cf543,0x2340d2bf5a80642d,0xdace4e38e1ce0c8f,0x59bc4807e3445}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6e85,0xc3dc,0xfd4,0x39a7,0x5158,0x777b,0xb83,0xb0fe,0x55de,0x45b3,0x103f,0x53dc,0x27e2,0xb6cb,0x2b18,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc3dc6e85,0x39a70fd4,0x777b5158,0xb0fe0b83,0x45b355de,0x53dc103f,0xb6cb27e2,0x12b18}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x39a70fd4c3dc6e85,0xb0fe0b83777b5158,0x53dc103f45b355de,0x12b18b6cb27e2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x35a5,0xefc9,0xcb59,0xb6f3,0x3f12,0x88e4,0xea6f,0xe3e8,0xb7aa,0x6881,0x7fab,0x2467,0x4d90,0xee8a,0x88dd,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xefc935a5,0xb6f3cb59,0x88e43f12,0xe3e8ea6f,0x6881b7aa,0x24677fab,0xee8a4d90,0x188dd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb6f3cb59efc935a5,0xe3e8ea6f88e43f12,0x24677fab6881b7aa,0x188ddee8a4d90}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x102e, 0x4c4, 0x1586, 0x1184, 0xa12, 0x9ce, 0x1866, 0x433, 0x5ef, 0x82a, 0x13a5, 0xbc6, 0x591, 0x175b, 0x10bc, 0xfa5, 0x109d, 0x8d4, 0x1325, 0x9} +#elif RADIX == 32 +{0x1131205d, 0x128c2561, 0xcc9ce50, 0x17bc8678, 0x9d2a0a8, 0x165915e3, 0x9617975, 0x6a4275f, 0x4992a} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xca128c2561898902, 0x50545ef219e19939, 0xc2f2eb65915e34e9, 0x4acc951a909d7d2} +#else +{0x14612b0c4c481, 0x7219e19939ca1, 0x2bc69d2a0a8bd, 0x5f4b0bcbad964, 0x25664a8d484e} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x5a5, 0x1131, 0x561, 0x1461, 0x1284, 0x1273, 0x1e19, 0x190c, 0x117b, 0xa0a, 0x14e9, 0xaf1, 0x1964, 0x5d6, 0xc2f, 0xbe9, 0x427, 0xa35, 0xcc9, 0x3} +#elif RADIX == 32 +{0xc4c4b4a, 0x4a30958, 0x3327394, 0x5ef219e, 0x1a74a82a, 0xd964578, 0x1a585e5d, 0x11a909d7, 0x3664a} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x7284a3095862625a, 0x541517bc8678664e, 0xb0bcbad964578d3a, 0x1ab32546a4275f4} +#else +{0x25184ac31312d, 0x3c8678664e728, 0xaf1a74a82a2f, 0x57d2c2f2eb659, 0xd5992a35213} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x1b4a, 0xf6a, 0xadd, 0x302, 0x196b, 0x366, 0x1399, 0xe83, 0x1540, 0xcd, 0x169d, 0x1007, 0xfe6, 0x1fd2, 0xebb, 0x808, 0x1725, 0x1c1e, 0x1009, 0x8} +#elif RADIX == 32 +{0xbdab695, 0xb1812b7, 0x132366cb, 0x1501d073, 0x1b4e8336, 0x4fe6803, 0x21d77fd, 0xf5c950, 0x3804f} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xd96b1812b75ed5b4, 0x419b540741ce646c, 0x3aeffa4fe6803da7, 0x36402783d725404} +#else +{0x58c095baf6ada, 0x741ce646cd96, 0x5007b4e8336a8, 0x5010ebbfe93f9, 0x1b2013c1eb92} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x122a, 0x94e, 0x1927, 0x1701, 0x58e, 0x79, 0x134e, 0xecc, 0xa0f, 0x7be, 0xc39, 0xfb2, 0x1df0, 0x79a, 0x154a, 0x1a4a, 0x23f, 0x3de, 0x1be1, 0x9} +#elif RADIX == 32 +{0x1a53a455, 0xeb80e49, 0x9c0792c, 0x83dd993, 0x61c9ef9, 0x15df07d9, 0x12aa9479, 0x1ef08ff4, 0x4df08} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x258eb80e49d29d22, 0x4f7ca0f7664d380f, 0x5528f35df07d930e, 0x36ef847bc23fd25} +#else +{0x75c0724e94e91, 0x77664d380f258, 0xfb261c9ef941, 0x749554a3cd77c, 0x1b77c23de11f} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1943, 0x2e1, 0x677, 0x614, 0x19e, 0x11e6, 0xde2, 0x104d, 0x551, 0x1455, 0x1d7e, 0xdd, 0x15e0, 0x14c5, 0xeeb, 0x14b5, 0x168f, 0x1a03, 0xa9d, 0x4} +#elif RADIX == 32 +{0x18b87286, 0x1e30a19d, 0x1c51e60c, 0x154609ad, 0x1ebf5154, 0xb5e006e, 0xd5dd74c, 0x101da3e9, 0x454ee} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xc19e30a19dc5c394, 0xa8aa551826b78a3c, 0xbbae98b5e006ef5f, 0x112a7740768fa5a} +#else +{0x71850cee2e1ca, 0x1826b78a3cc19, 0xddebf5154aa, 0x696aeeba62d78, 0x8953ba03b47} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x512, 0xda9, 0x31a, 0x1711, 0x1b65, 0x9f0, 0xe54, 0x1d4a, 0xe1c, 0xc90, 0x1837, 0x1728, 0x15fa, 0xa40, 0xf21, 0x1b43, 0x1716, 0x1277, 0x11a8, 0x9} +#elif RADIX == 32 +{0x136a4a25, 0x5b888c6, 0xa89f0db, 0x1873a94e, 0xc1bb241, 0x15fab94, 0x10de42a4, 0x13bdc5b6, 0x48d44} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x1b65b888c69b5251, 0xd920e1cea539513e, 0xbc854815fab9460d, 0xec6a24ef716da1} +#else +{0x2dc44634da928, 0x4ea539513e1b6, 0x5728c1bb241c3, 0x3686f2152057e, 0x2f6351277b8b} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x822, 0x1a13, 0x11d, 0x10e0, 0x2b9, 0x1d20, 0x19f9, 0x1dc2, 0x1770, 0x135e, 0x1c13, 0x1cba, 0x14df, 0x5c8, 0x1f31, 0x215, 0x16ed, 0x1f7a, 0xc6c, 0x5} +#elif RADIX == 32 +{0xe84d045, 0x19870047, 0x1f3d2015, 0x1dc3b859, 0xe09cd7a, 0x114dfe5d, 0x57e625c, 0x1bd5bb44, 0x6367} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x2b9870047742682, 0xe6bd770ee167e7a4, 0xfcc4b914dfe5d704, 0xcb1b3ef56ed10a} +#else +{0x4c38023ba1341, 0xee167e7a402b, 0x7cbae09cd7aee, 0x442bf312e4537, 0x658d9f7ab76} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x2cc, 0xd50, 0xeda, 0x1c3c, 0x8a6, 0x1659, 0xffb, 0x1cee, 0x1f14, 0x17fe, 0x1860, 0x427, 0x132c, 0x5c0, 0xb9f, 0x143d, 0x639, 0x19f0, 0x1551, 0x7} +#elif RADIX == 32 +{0x13540599, 0x6e1e3b6, 0x1f765945, 0x1c539dcf, 0x1c305ffb, 0x132c213, 0xf573e5c, 0xf818e68, 0x2aa8e} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x28a6e1e3b69aa02c, 0x2ffdf14e773feecb, 0xae7cb8132c213e18, 0x3fd5473e0639a1e} +#else +{0x370f1db4d5016, 0x4e773feecb28a, 0x427c305ffbe2, 0x687ab9f2e04cb, 0x1feaa39f031c} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x900d,0xd052,0xb453,0x206a,0xe61d,0x31f2,0xc579,0xfb21,0xc870,0x2bb,0xf38f,0xf9c1,0x83aa,0x47f1,0x58d1,0xeb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd052900d,0x206ab453,0x31f2e61d,0xfb21c579,0x2bbc870,0xf9c1f38f,0x47f183aa,0xeb58d1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x206ab453d052900d,0xfb21c57931f2e61d,0xf9c1f38f02bbc870,0xeb58d147f183aa}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x727e,0xa5e8,0xebc3,0x9e04,0xf1eb,0x38d7,0x68e0,0x8ea9,0x8f77,0x8331,0x48eb,0x82c0,0xb0a3,0x3583,0xf221,0x54}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa5e8727e,0x9e04ebc3,0x38d7f1eb,0x8ea968e0,0x83318f77,0x82c048eb,0x3583b0a3,0x54f221}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x9e04ebc3a5e8727e,0x8ea968e038d7f1eb,0x82c048eb83318f77,0x54f2213583b0a3}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdba9,0x49e4,0xc9b3,0x34e9,0x7ab9,0xd876,0xcae0,0xcfb0,0x6177,0x26b3,0x2c98,0x1e30,0x4a38,0x53cc,0x3bdc,0x71}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x49e4dba9,0x34e9c9b3,0xd8767ab9,0xcfb0cae0,0x26b36177,0x1e302c98,0x53cc4a38,0x713bdc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x34e9c9b349e4dba9,0xcfb0cae0d8767ab9,0x1e302c9826b36177,0x713bdc53cc4a38}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6ff3,0x2fad,0x4bac,0xdf95,0x19e2,0xce0d,0x3a86,0x4de,0x378f,0xfd44,0xc70,0x63e,0x7c55,0xb80e,0xa72e,0x14}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2fad6ff3,0xdf954bac,0xce0d19e2,0x4de3a86,0xfd44378f,0x63e0c70,0xb80e7c55,0x14a72e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xdf954bac2fad6ff3,0x4de3a86ce0d19e2,0x63e0c70fd44378f,0x14a72eb80e7c55}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x231b,0x1af2,0x1640,0xb19c,0xf713,0xe470,0x683e,0xf39a,0x3289,0x7a54,0xc26e,0x904e,0xd5a6,0x6a0c,0x55fc,0x44}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1af2231b,0xb19c1640,0xe470f713,0xf39a683e,0x7a543289,0x904ec26e,0x6a0cd5a6,0x4455fc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb19c16401af2231b,0xf39a683ee470f713,0x904ec26e7a543289,0x4455fc6a0cd5a6}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xad7a,0xb685,0xde69,0x55d2,0x5675,0x84e8,0x5916,0x925f,0x8c0a,0x1cb6,0x7c51,0x8391,0xffce,0x11d1,0x96ce,0xcd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb685ad7a,0x55d2de69,0x84e85675,0x925f5916,0x1cb68c0a,0x83917c51,0x11d1ffce,0xcd96ce}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x55d2de69b685ad7a,0x925f591684e85675,0x83917c511cb68c0a,0xcd96ce11d1ffce}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3724,0x79bd,0x1b92,0x959b,0xb3ec,0x6f18,0x27d4,0x64a7,0x9b4b,0x8c7e,0xade7,0x664b,0xa6d9,0xa287,0x6a1d,0x48}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x79bd3724,0x959b1b92,0x6f18b3ec,0x64a727d4,0x8c7e9b4b,0x664bade7,0xa287a6d9,0x486a1d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x959b1b9279bd3724,0x64a727d46f18b3ec,0x664bade78c7e9b4b,0x486a1da287a6d9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdce5,0xe50d,0xe9bf,0x4e63,0x8ec,0x1b8f,0x97c1,0xc65,0xcd76,0x85ab,0x3d91,0x6fb1,0x2a59,0x95f3,0xaa03,0xbb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe50ddce5,0x4e63e9bf,0x1b8f08ec,0xc6597c1,0x85abcd76,0x6fb13d91,0x95f32a59,0xbbaa03}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4e63e9bfe50ddce5,0xc6597c11b8f08ec,0x6fb13d9185abcd76,0xbbaa0395f32a59}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x2417,0x1b00,0xcfe,0x8960,0x662e,0x42d2,0xc00f,0x222c,0x7671,0x278b,0x863f,0xbcac,0xdb9c,0x6e5e,0x4c5a,0x1b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1b002417,0x89600cfe,0x42d2662e,0x222cc00f,0x278b7671,0xbcac863f,0x6e5edb9c,0x1b4c5a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x89600cfe1b002417,0x222cc00f42d2662e,0xbcac863f278b7671,0x1b4c5a6e5edb9c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x21e8,0xd92b,0x5a2d,0xef86,0xf492,0x1483,0x8ae0,0x6b37,0x7f78,0x7b90,0x69c5,0xf4ec,0x2fb9,0x1660,0x8296,0xf8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd92b21e8,0xef865a2d,0x1483f492,0x6b378ae0,0x7b907f78,0xf4ec69c5,0x16602fb9,0xf88296}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xef865a2dd92b21e8,0x6b378ae01483f492,0xf4ec69c57b907f78,0xf8829616602fb9}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x38ff,0x5dc5,0x9aea,0xbc0e,0xbea5,0x775d,0x447b,0xc311,0xf01c,0xb63a,0x15fd,0x162a,0xab76,0x9def,0x2a0d,0xc5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x5dc538ff,0xbc0e9aea,0x775dbea5,0xc311447b,0xb63af01c,0x162a15fd,0x9defab76,0xc52a0d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xbc0e9aea5dc538ff,0xc311447b775dbea5,0x162a15fdb63af01c,0xc52a0d9defab76}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdbe9,0xe4ff,0xf301,0x769f,0x99d1,0xbd2d,0x3ff0,0xddd3,0x898e,0xd874,0x79c0,0x4353,0x2463,0x91a1,0xb3a5,0xe4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe4ffdbe9,0x769ff301,0xbd2d99d1,0xddd33ff0,0xd874898e,0x435379c0,0x91a12463,0xe4b3a5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x769ff301e4ffdbe9,0xddd33ff0bd2d99d1,0x435379c0d874898e,0xe4b3a591a12463}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x900d,0xd052,0xb453,0x206a,0xe61d,0x31f2,0xc579,0xfb21,0xc870,0x2bb,0xf38f,0xf9c1,0x83aa,0x47f1,0x58d1,0xeb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd052900d,0x206ab453,0x31f2e61d,0xfb21c579,0x2bbc870,0xf9c1f38f,0x47f183aa,0xeb58d1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x206ab453d052900d,0xfb21c57931f2e61d,0xf9c1f38f02bbc870,0xeb58d147f183aa}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x727e,0xa5e8,0xebc3,0x9e04,0xf1eb,0x38d7,0x68e0,0x8ea9,0x8f77,0x8331,0x48eb,0x82c0,0xb0a3,0x3583,0xf221,0x54}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa5e8727e,0x9e04ebc3,0x38d7f1eb,0x8ea968e0,0x83318f77,0x82c048eb,0x3583b0a3,0x54f221}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x9e04ebc3a5e8727e,0x8ea968e038d7f1eb,0x82c048eb83318f77,0x54f2213583b0a3}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdba9,0x49e4,0xc9b3,0x34e9,0x7ab9,0xd876,0xcae0,0xcfb0,0x6177,0x26b3,0x2c98,0x1e30,0x4a38,0x53cc,0x3bdc,0x71}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x49e4dba9,0x34e9c9b3,0xd8767ab9,0xcfb0cae0,0x26b36177,0x1e302c98,0x53cc4a38,0x713bdc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x34e9c9b349e4dba9,0xcfb0cae0d8767ab9,0x1e302c9826b36177,0x713bdc53cc4a38}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6ff3,0x2fad,0x4bac,0xdf95,0x19e2,0xce0d,0x3a86,0x4de,0x378f,0xfd44,0xc70,0x63e,0x7c55,0xb80e,0xa72e,0x14}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2fad6ff3,0xdf954bac,0xce0d19e2,0x4de3a86,0xfd44378f,0x63e0c70,0xb80e7c55,0x14a72e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xdf954bac2fad6ff3,0x4de3a86ce0d19e2,0x63e0c70fd44378f,0x14a72eb80e7c55}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x118e,0xd79,0xb20,0xd8ce,0x7b89,0x7238,0x341f,0xf9cd,0x1944,0x3d2a,0x6137,0x4827,0x6ad3,0x3506,0x2afe,0x22}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd79118e,0xd8ce0b20,0x72387b89,0xf9cd341f,0x3d2a1944,0x48276137,0x35066ad3,0x222afe}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd8ce0b200d79118e,0xf9cd341f72387b89,0x482761373d2a1944,0x222afe35066ad3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd6bd,0xdb42,0x6f34,0xaae9,0x2b3a,0x4274,0xac8b,0x492f,0x4605,0x8e5b,0xbe28,0x41c8,0xffe7,0x8e8,0xcb67,0x66}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdb42d6bd,0xaae96f34,0x42742b3a,0x492fac8b,0x8e5b4605,0x41c8be28,0x8e8ffe7,0x66cb67}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xaae96f34db42d6bd,0x492fac8b42742b3a,0x41c8be288e5b4605,0x66cb6708e8ffe7}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9b92,0x3cde,0x8dc9,0x4acd,0x59f6,0x378c,0x93ea,0xb253,0x4da5,0xc63f,0xd6f3,0xb325,0xd36c,0xd143,0x350e,0x24}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3cde9b92,0x4acd8dc9,0x378c59f6,0xb25393ea,0xc63f4da5,0xb325d6f3,0xd143d36c,0x24350e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4acd8dc93cde9b92,0xb25393ea378c59f6,0xb325d6f3c63f4da5,0x24350ed143d36c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xee73,0xf286,0xf4df,0x2731,0x8476,0x8dc7,0xcbe0,0x632,0xe6bb,0xc2d5,0x9ec8,0xb7d8,0x952c,0xcaf9,0xd501,0xdd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf286ee73,0x2731f4df,0x8dc78476,0x632cbe0,0xc2d5e6bb,0xb7d89ec8,0xcaf9952c,0xddd501}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2731f4dff286ee73,0x632cbe08dc78476,0xb7d89ec8c2d5e6bb,0xddd501caf9952c}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x20f0,0x2693,0xacbf,0x731a,0xb0f3,0xd8ce,0x1bcd,0xf836,0x8469,0x44d5,0xd604,0xd3aa,0x4aa8,0xcdc3,0x9086,0x3f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x269320f0,0x731aacbf,0xd8ceb0f3,0xf8361bcd,0x44d58469,0xd3aad604,0xcdc34aa8,0x3f9086}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x731aacbf269320f0,0xf8361bcdd8ceb0f3,0xd3aad60444d58469,0x3f9086cdc34aa8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xcc11,0xe55a,0x932f,0x9534,0x2895,0xaf43,0x2956,0x614f,0x4e84,0xe4b2,0x60c6,0x255,0xbb14,0xd70d,0xc61e,0x13}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe55acc11,0x9534932f,0xaf432895,0x614f2956,0xe4b24e84,0x25560c6,0xd70dbb14,0x13c61e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x9534932fe55acc11,0x614f2956af432895,0x25560c6e4b24e84,0x13c61ed70dbb14}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x28d6,0x450d,0xd24f,0x54e4,0x6e67,0x81d,0x9b71,0xadbe,0x1088,0x6148,0x4ebf,0x4b68,0x829e,0x65c8,0xe1a6,0xe5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x450d28d6,0x54e4d24f,0x81d6e67,0xadbe9b71,0x61481088,0x4b684ebf,0x65c8829e,0xe5e1a6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x54e4d24f450d28d6,0xadbe9b71081d6e67,0x4b684ebf61481088,0xe5e1a665c8829e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdf10,0xd96c,0x5340,0x8ce5,0x4f0c,0x2731,0xe432,0x7c9,0x7b96,0xbb2a,0x29fb,0x2c55,0xb557,0x323c,0x6f79,0xc0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd96cdf10,0x8ce55340,0x27314f0c,0x7c9e432,0xbb2a7b96,0x2c5529fb,0x323cb557,0xc06f79}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8ce55340d96cdf10,0x7c9e43227314f0c,0x2c5529fbbb2a7b96,0xc06f79323cb557}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x6b9, 0xd4c, 0x1d8d, 0x1f99, 0x1be4, 0x1f53, 0x5c1, 0x1937, 0x9c, 0xe68, 0x61e, 0x14e8, 0x352, 0x3d6, 0x174, 0x133, 0x18a6, 0x1b19, 0x94b, 0x9} +#elif RADIX == 32 +{0xb530d73, 0x4fccf63, 0x183f53df, 0x27326e5, 0x30f39a0, 0xc352a74, 0xcc2e83d, 0x18ce2982, 0x44a5e} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x7be4fccf635a986b, 0x9cd009cc9b9707ea, 0x85d07ac352a74187, 0x31a52f6338a6099} +#else +{0x27e67b1ad4c35, 0x4c9b9707ea7be, 0x54e830f39a013, 0x2661741eb0d4, 0x40d297b19c53} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x348, 0xb53, 0xf63, 0x7e6, 0x1ef9, 0xfd4, 0x1970, 0x64d, 0x27, 0x139a, 0x187, 0x153a, 0x10d4, 0xf5, 0x185d, 0x104c, 0xe29, 0x1ec6, 0x1a52, 0x0} +#elif RADIX == 32 +{0x1ad4c690, 0x193f33d8, 0xe0fd4f7, 0x9cc9b9, 0xc3ce68, 0xb0d4a9d, 0x1330ba0f, 0x16338a60, 0xd297} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x9ef93f33d8d6a634, 0xe734027326e5c1fa, 0x61741eb0d4a9d061, 0x28694bd8ce29826} +#else +{0x49f99ec6b531a, 0x7326e5c1fa9ef, 0x153a0c3ce6804, 0x609985d07ac35, 0x1434a5ec6714} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x18af, 0xb6e, 0x124d, 0xa49, 0xa8c, 0x11f5, 0xea9, 0x298, 0xa55, 0x1738, 0xb61, 0x2b9, 0x8a, 0x167a, 0x17e6, 0x2b0, 0x1290, 0x16ad, 0x1505, 0x2} +#elif RADIX == 32 +{0xadbb15e, 0xc524c93, 0x1531f554, 0x954530e, 0x15b0dce1, 0x1408a15c, 0xc2fcd67, 0x156ca405, 0x2a82d} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xaa8c524c9356dd8a, 0x6e70a5514c3aa63e, 0x5f9acf408a15cad8, 0x4c5416d5b290158} +#else +{0x6292649ab6ec5, 0x514c3aa63eaa8, 0x42b95b0dce14a, 0x5617e6b3d022, 0x262a0b6ad948} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1390, 0x1895, 0x9b7, 0xa5a, 0x1030, 0x16c1, 0xd21, 0x1053, 0x327, 0x1a4c, 0x1a22, 0x11e4, 0x16ba, 0x13a1, 0x1dbc, 0x1aac, 0x148c, 0x5c8, 0x15d2, 0x0} +#elif RADIX == 32 +{0x1e256720, 0x1052d26d, 0x436c181, 0xc9e0a6d, 0xd116930, 0x36ba8f2, 0xb3b793a, 0xe452335, 0xae91} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x303052d26df12b39, 0xb498327829b486d8, 0x76f27436ba8f2688, 0x5748b9148cd56} +#else +{0x296936f8959c, 0x7829b486d8303, 0x51e4d11693064, 0x3559dbc9d0dae, 0x282ba45c8a46} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1be6, 0x11b3, 0x14ba, 0xf43, 0x1bd1, 0x215, 0x1e9a, 0x137a, 0x7b2, 0x15, 0x126, 0x148, 0x1c2b, 0x1b70, 0xf1c, 0x1e48, 0x1259, 0x188a, 0x1e44, 0x7} +#elif RADIX == 32 +{0x146cf7cd, 0x117a1d2e, 0x134215de, 0x1eca6f5e, 0x930054, 0x1c2b0a4, 0x121e39b7, 0x454967c, 0x2f226} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xbbd17a1d2ea367be, 0x802a7b29bd7a6842, 0x3c736e1c2b0a4049, 0x21f913115259f24} +#else +{0xbd0e9751b3df, 0x29bd7a6842bbd, 0x61480930054f6, 0x7c90f1cdb870a, 0x10fc8988a92c} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x4c5, 0x37e, 0xafa, 0x1b90, 0x13d, 0x8d3, 0xaa7, 0x489, 0x1d4a, 0x17bc, 0x168, 0x37f, 0x1ed6, 0x666, 0x1889, 0x1a4e, 0xa57, 0xeb7, 0xd37, 0x7} +#elif RADIX == 32 +{0x10df898b, 0x1ddc82be, 0x14e8d309, 0x1528912a, 0x10b45ef3, 0xded61bf, 0x13b11266, 0x15ba95f4, 0x269bb} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x613ddc82be86fc4c, 0x2f79d4a244aa9d1a, 0x6224ccded61bf85a, 0x1cb4ddd6ea57d27} +#else +{0x6ee415f437e26, 0x2244aa9d1a613, 0x437f0b45ef3a9, 0x749d8893337b5, 0xe5a6eeb752b} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x447, 0x1b87, 0x1cf0, 0x155, 0xb1, 0x804, 0x97a, 0x64a, 0x886, 0x3a3, 0x126f, 0x1553, 0x74d, 0xde9, 0x941, 0x39c, 0x8f, 0x1bbb, 0xf3, 0x1} +#elif RADIX == 32 +{0x6e1c88e, 0x110aaf3c, 0xf480405, 0x218c949, 0x19378e8d, 0x1274daa9, 0x71282de, 0x1dd823c7, 0x1079e} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x80b10aaf3c370e44, 0xc74688632525e900, 0x2505bd274daa9c9b, 0x2383cf77608f1ce} +#else +{0x85579e1b8722, 0x632525e90080b, 0x35539378e8d10, 0x47389416f49d3, 0x11c1e7bbb047} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0xf9d, 0x552, 0x797, 0x19fc, 0x166, 0x7a8, 0x1ee5, 0xc77, 0x1ee7, 0x15ef, 0x340, 0x10df, 0x1d5f, 0x170, 0xf2, 0x123, 0x1bb1, 0xd23, 0x3fc, 0x6} +#elif RADIX == 32 +{0x19549f3b, 0x6cfe1e5, 0x1ca7a80b, 0x1b9d8efe, 0x11a057bf, 0x1d5f86f, 0x8c1e417, 0x91eec42, 0x11fe3} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x166cfe1e5caa4f9, 0x2bdfee763bfb94f5, 0x83c82e1d5f86f8d0, 0x440ff1a47bb1091} +#else +{0x367f0f2e5527c, 0x763bfb94f5016, 0x70df1a057bfdc, 0x42460f20b8757, 0x4a07f8d23dd8} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x27cb,0x4931,0x13e0,0xcd75,0x6846,0x3de7,0x5a91,0x9ff9,0xa270,0xa6d6,0x26ec,0xb972,0xb44,0xe4b8,0x52fc,0x3f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x493127cb,0xcd7513e0,0x3de76846,0x9ff95a91,0xa6d6a270,0xb97226ec,0xe4b80b44,0x3f52fc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xcd7513e0493127cb,0x9ff95a913de76846,0xb97226eca6d6a270,0x3f52fce4b80b44}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x2d7e,0x5a38,0xca74,0x1d16,0x2547,0x1674,0x8c29,0xafc2,0x2349,0x4856,0x2c73,0x7957,0x67e1,0x3c3e,0x4d3,0xad}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x5a382d7e,0x1d16ca74,0x16742547,0xafc28c29,0x48562349,0x79572c73,0x3c3e67e1,0xad04d3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1d16ca745a382d7e,0xafc28c2916742547,0x79572c7348562349,0xad04d33c3e67e1}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd8d7,0x27fb,0x321e,0xcf15,0xfbd3,0x6f8e,0x5fbd,0x7ed7,0xf394,0x58d6,0x5937,0xb73c,0xbfb,0xe027,0x64ac,0x22}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x27fbd8d7,0xcf15321e,0x6f8efbd3,0x7ed75fbd,0x58d6f394,0xb73c5937,0xe0270bfb,0x2264ac}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xcf15321e27fbd8d7,0x7ed75fbd6f8efbd3,0xb73c593758d6f394,0x2264ace0270bfb}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd835,0xb6ce,0xec1f,0x328a,0x97b9,0xc218,0xa56e,0x6006,0x5d8f,0x5929,0xd913,0x468d,0xf4bb,0x1b47,0xad03,0xc0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb6ced835,0x328aec1f,0xc21897b9,0x6006a56e,0x59295d8f,0x468dd913,0x1b47f4bb,0xc0ad03}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x328aec1fb6ced835,0x6006a56ec21897b9,0x468dd91359295d8f,0xc0ad031b47f4bb}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdce5,0xe50d,0xe9bf,0x4e63,0x8ec,0x1b8f,0x97c1,0xc65,0xcd76,0x85ab,0x3d91,0x6fb1,0x2a59,0x95f3,0xaa03,0xbb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe50ddce5,0x4e63e9bf,0x1b8f08ec,0xc6597c1,0x85abcd76,0x6fb13d91,0x95f32a59,0xbbaa03}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4e63e9bfe50ddce5,0xc6597c11b8f08ec,0x6fb13d9185abcd76,0xbbaa0395f32a59}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x5286,0x497a,0x2196,0xaa2d,0xa98a,0x7b17,0xa6e9,0x6da0,0x73f5,0xe349,0x83ae,0x7c6e,0x31,0xee2e,0x6931,0x32}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x497a5286,0xaa2d2196,0x7b17a98a,0x6da0a6e9,0xe34973f5,0x7c6e83ae,0xee2e0031,0x326931}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xaa2d2196497a5286,0x6da0a6e97b17a98a,0x7c6e83aee34973f5,0x326931ee2e0031}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc8dc,0x8642,0xe46d,0x6a64,0x4c13,0x90e7,0xd82b,0x9b58,0x64b4,0x7381,0x5218,0x99b4,0x5926,0x5d78,0x95e2,0xb7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8642c8dc,0x6a64e46d,0x90e74c13,0x9b58d82b,0x738164b4,0x99b45218,0x5d785926,0xb795e2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6a64e46d8642c8dc,0x9b58d82b90e74c13,0x99b45218738164b4,0xb795e25d785926}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x231b,0x1af2,0x1640,0xb19c,0xf713,0xe470,0x683e,0xf39a,0x3289,0x7a54,0xc26e,0x904e,0xd5a6,0x6a0c,0x55fc,0x44}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1af2231b,0xb19c1640,0xe470f713,0xf39a683e,0x7a543289,0x904ec26e,0x6a0cd5a6,0x4455fc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb19c16401af2231b,0xf39a683ee470f713,0x904ec26e7a543289,0x4455fc6a0cd5a6}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x94df,0x6dc7,0xcd7f,0xebb2,0xb290,0x811d,0x2825,0xc88,0xd514,0x959a,0x7d64,0xc8c3,0x16a9,0x106a,0x1eea,0x32}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6dc794df,0xebb2cd7f,0x811db290,0xc882825,0x959ad514,0xc8c37d64,0x106a16a9,0x321eea}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xebb2cd7f6dc794df,0xc882825811db290,0xc8c37d64959ad514,0x321eea106a16a9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe08c,0xe778,0x1464,0x19fe,0xef25,0x1d24,0xa98f,0x4af0,0x70d3,0x8e4d,0x2b82,0x95ea,0x3277,0xc267,0x1695,0xf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe778e08c,0x19fe1464,0x1d24ef25,0x4af0a98f,0x8e4d70d3,0x95ea2b82,0xc2673277,0xf1695}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x19fe1464e778e08c,0x4af0a98f1d24ef25,0x95ea2b828e4d70d3,0xf1695c2673277}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf1df,0xb6e1,0xe2a4,0x4bc9,0xdc85,0x6365,0x3fca,0x9a38,0xee2,0xed03,0xca7f,0x1984,0xe709,0x1efe,0xc173,0x8b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb6e1f1df,0x4bc9e2a4,0x6365dc85,0x9a383fca,0xed030ee2,0x1984ca7f,0x1efee709,0x8bc173}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4bc9e2a4b6e1f1df,0x9a383fca6365dc85,0x1984ca7fed030ee2,0x8bc1731efee709}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6b21,0x9238,0x3280,0x144d,0x4d6f,0x7ee2,0xd7da,0xf377,0x2aeb,0x6a65,0x829b,0x373c,0xe956,0xef95,0xe115,0xcd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x92386b21,0x144d3280,0x7ee24d6f,0xf377d7da,0x6a652aeb,0x373c829b,0xef95e956,0xcde115}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x144d328092386b21,0xf377d7da7ee24d6f,0x373c829b6a652aeb,0xcde115ef95e956}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x27cb,0x4931,0x13e0,0xcd75,0x6846,0x3de7,0x5a91,0x9ff9,0xa270,0xa6d6,0x26ec,0xb972,0xb44,0xe4b8,0x52fc,0x3f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x493127cb,0xcd7513e0,0x3de76846,0x9ff95a91,0xa6d6a270,0xb97226ec,0xe4b80b44,0x3f52fc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xcd7513e0493127cb,0x9ff95a913de76846,0xb97226eca6d6a270,0x3f52fce4b80b44}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x2d7e,0x5a38,0xca74,0x1d16,0x2547,0x1674,0x8c29,0xafc2,0x2349,0x4856,0x2c73,0x7957,0x67e1,0x3c3e,0x4d3,0xad}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x5a382d7e,0x1d16ca74,0x16742547,0xafc28c29,0x48562349,0x79572c73,0x3c3e67e1,0xad04d3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1d16ca745a382d7e,0xafc28c2916742547,0x79572c7348562349,0xad04d33c3e67e1}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd8d7,0x27fb,0x321e,0xcf15,0xfbd3,0x6f8e,0x5fbd,0x7ed7,0xf394,0x58d6,0x5937,0xb73c,0xbfb,0xe027,0x64ac,0x22}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x27fbd8d7,0xcf15321e,0x6f8efbd3,0x7ed75fbd,0x58d6f394,0xb73c5937,0xe0270bfb,0x2264ac}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xcf15321e27fbd8d7,0x7ed75fbd6f8efbd3,0xb73c593758d6f394,0x2264ace0270bfb}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd835,0xb6ce,0xec1f,0x328a,0x97b9,0xc218,0xa56e,0x6006,0x5d8f,0x5929,0xd913,0x468d,0xf4bb,0x1b47,0xad03,0xc0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb6ced835,0x328aec1f,0xc21897b9,0x6006a56e,0x59295d8f,0x468dd913,0x1b47f4bb,0xc0ad03}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x328aec1fb6ced835,0x6006a56ec21897b9,0x468dd91359295d8f,0xc0ad031b47f4bb}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xee73,0xf286,0xf4df,0x2731,0x8476,0x8dc7,0xcbe0,0x632,0xe6bb,0xc2d5,0x9ec8,0xb7d8,0x952c,0xcaf9,0xd501,0xdd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf286ee73,0x2731f4df,0x8dc78476,0x632cbe0,0xc2d5e6bb,0xb7d89ec8,0xcaf9952c,0xddd501}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2731f4dff286ee73,0x632cbe08dc78476,0xb7d89ec8c2d5e6bb,0xddd501caf9952c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x2943,0x24bd,0x90cb,0x5516,0xd4c5,0xbd8b,0x5374,0xb6d0,0xb9fa,0x71a4,0x41d7,0xbe37,0x18,0xf717,0x3498,0x99}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x24bd2943,0x551690cb,0xbd8bd4c5,0xb6d05374,0x71a4b9fa,0xbe3741d7,0xf7170018,0x993498}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x551690cb24bd2943,0xb6d05374bd8bd4c5,0xbe3741d771a4b9fa,0x993498f7170018}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x646e,0xc321,0x7236,0xb532,0xa609,0xc873,0x6c15,0x4dac,0xb25a,0x39c0,0x290c,0x4cda,0x2c93,0x2ebc,0xcaf1,0xdb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc321646e,0xb5327236,0xc873a609,0x4dac6c15,0x39c0b25a,0x4cda290c,0x2ebc2c93,0xdbcaf1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb5327236c321646e,0x4dac6c15c873a609,0x4cda290c39c0b25a,0xdbcaf12ebc2c93}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x118e,0xd79,0xb20,0xd8ce,0x7b89,0x7238,0x341f,0xf9cd,0x1944,0x3d2a,0x6137,0x4827,0x6ad3,0x3506,0x2afe,0x22}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd79118e,0xd8ce0b20,0x72387b89,0xf9cd341f,0x3d2a1944,0x48276137,0x35066ad3,0x222afe}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd8ce0b200d79118e,0xf9cd341f72387b89,0x482761373d2a1944,0x222afe35066ad3}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd647,0xf187,0x9a31,0x1ee,0x193b,0xeec2,0xbfed,0x9418,0x15b6,0xe9a,0x4c74,0xae85,0x3ebe,0x2677,0x3f12,0x42}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf187d647,0x1ee9a31,0xeec2193b,0x9418bfed,0xe9a15b6,0xae854c74,0x26773ebe,0x423f12}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1ee9a31f187d647,0x9418bfedeec2193b,0xae854c740e9a15b6,0x423f1226773ebe}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x68ff,0x99be,0x416c,0x7bbf,0xd44f,0x609f,0x7682,0xa8ff,0xa6bb,0xec03,0x8e77,0xc076,0x7873,0x9676,0xa152,0xf5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x99be68ff,0x7bbf416c,0x609fd44f,0xa8ff7682,0xec03a6bb,0xc0768e77,0x96767873,0xf5a152}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7bbf416c99be68ff,0xa8ff7682609fd44f,0xc0768e77ec03a6bb,0xf5a15296767873}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3739,0xf7da,0xbd23,0xa38e,0x8cf9,0x7690,0x6b0e,0x1a7,0x77f0,0xa2bd,0x5ac7,0x5101,0x3aae,0xa922,0x2d3a,0x95}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf7da3739,0xa38ebd23,0x76908cf9,0x1a76b0e,0xa2bd77f0,0x51015ac7,0xa9223aae,0x952d3a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa38ebd23f7da3739,0x1a76b0e76908cf9,0x51015ac7a2bd77f0,0x952d3aa9223aae}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x29b9,0xe78,0x65ce,0xfe11,0xe6c4,0x113d,0x4012,0x6be7,0xea49,0xf165,0xb38b,0x517a,0xc141,0xd988,0xc0ed,0xbd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe7829b9,0xfe1165ce,0x113de6c4,0x6be74012,0xf165ea49,0x517ab38b,0xd988c141,0xbdc0ed}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xfe1165ce0e7829b9,0x6be74012113de6c4,0x517ab38bf165ea49,0xbdc0edd988c141}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x1068, 0xf2c, 0x1ada, 0x1f58, 0x1343, 0x5cc, 0x90, 0x1bba, 0x50b, 0x1a35, 0x35f, 0x1388, 0x5ce, 0xc4f, 0x1462, 0x191f, 0x665, 0x843, 0x1cb1, 0x1} +#elif RADIX == 32 +{0x13cb20d0, 0x3fac6b6, 0x1205cc9a, 0x142f7740, 0x1afe8d4, 0x1e5ce9c4, 0x7e8c4c4, 0x2199972, 0x1e58a} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x9343fac6b69e5906, 0xf46a50bddd0240b9, 0xd18989e5ce9c40d7, 0x28f2c5086665c8f} +#else +{0x1fd635b4f2c83, 0x3ddd0240b9934, 0x53881afe8d4a1, 0x723f462627973, 0x147962843332} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x5b3, 0x13cb, 0x6b6, 0x1fd6, 0x4d0, 0x173, 0x1024, 0x1eee, 0x942, 0x1e8d, 0xd7, 0x14e2, 0x1973, 0x1313, 0x1d18, 0xe47, 0x1999, 0xa10, 0xf2c, 0x6} +#elif RADIX == 32 +{0x14f2cb67, 0x10feb1ad, 0x4817326, 0x50bddd0, 0x6bfa35, 0x7973a71, 0x11fa3131, 0x1086665c, 0x17962} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x64d0feb1ada7965b, 0xfd1a942f7740902e, 0xf462627973a71035, 0x123cb1421999723} +#else +{0x7f58d6d3cb2d, 0x2f7740902e64d, 0x74e206bfa3528, 0x5c8fd18989e5c, 0x311e58a10ccc} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x14ba, 0xa50, 0x219, 0x1ca8, 0x1858, 0xe67, 0x1b19, 0xb09, 0x17fa, 0x89f, 0x10d7, 0x1a55, 0x14de, 0x1f37, 0x12f0, 0x1247, 0x1aa6, 0x109f, 0x493, 0x6} +#elif RADIX == 32 +{0xa942975, 0x18e54086, 0x32e67c2, 0x1fe9613b, 0x186ba27e, 0xf4ded2a, 0x11e5e1f3, 0x4fea9a4, 0x1249c} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xf858e5408654a14b, 0xd13f7fa584ec65cc, 0xcbc3e6f4ded2ac35, 0x35124e13faa6923} +#else +{0x472a0432a50a5, 0x2584ec65ccf85, 0x5a5586ba27eff, 0x248f2f0f9bd37, 0x42892709fd53} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1ba, 0xab8, 0x1ded, 0xdc9, 0xf40, 0xaa3, 0x169, 0x53c, 0x2, 0x848, 0x9a6, 0xbad, 0xb7e, 0x15dc, 0x87, 0x1cf3, 0x1791, 0x1af2, 0x1cdf, 0x7} +#elif RADIX == 32 +{0xaae0375, 0x6e4f7b, 0xd2aa37a, 0x8a781, 0x14d32120, 0x18b7e5d6, 0x1cc10f5d, 0x1795e479, 0x2e6fe} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x6f406e4f7b55701b, 0x909000229e05a554, 0x821ebb8b7e5d6a69, 0x35f37f5e5791e79} +#else +{0x3727bdaab80d, 0x229e05a5546f4, 0x4bad4d3212000, 0x79e6087aee2df, 0x42f9bfaf2bc8} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x5b, 0xad0, 0x69, 0x1038, 0x18d2, 0x180d, 0x1871, 0x46b, 0x26b, 0x1ef2, 0xe46, 0x72d, 0xc0d, 0x15a4, 0x6d7, 0x221, 0x1611, 0x1a89, 0xd3f, 0x8} +#elif RADIX == 32 +{0xab400b7, 0x1281c01a, 0xe380dc6, 0x9ac8d78, 0x17237bc8, 0x8c0d396, 0x84daf5a, 0x144d8444, 0x369fe} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xb8d281c01a55a005, 0xbde426b235e1c701, 0x9b5eb48c0d396b91, 0x3b34ff513611110} +#else +{0x140e00d2ad002, 0x3235e1c701b8d, 0x272d7237bc84d, 0x44426d7ad2303, 0x459a7fa89b08} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1131, 0xac7, 0xa16, 0x918, 0x5d8, 0x1e64, 0x3e5, 0x142c, 0x1f89, 0x1cb7, 0xf96, 0x370, 0x4da, 0xf45, 0x1aa5, 0x1872, 0x1fc, 0xd83, 0x1145, 0x6} +#elif RADIX == 32 +{0x12b1e263, 0x1848c285, 0x1cbe642e, 0x1e268583, 0x7cb72df, 0xa4da1b8, 0x1cb54af4, 0xc187f30, 0x18a2b} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x85d848c285958f13, 0xb96ff89a160f97cc, 0x6a95e8a4da1b83e5, 0x84515b061fcc39} +#else +{0x4246142cac789, 0x1a160f97cc85d, 0x43707cb72dff1, 0x30e5aa57a2936, 0x2c228ad830fe} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x7a4, 0x388, 0xd00, 0x66c, 0x1a9a, 0xabc, 0x97b, 0xadc, 0xaab, 0x1601, 0x287, 0xb2a, 0x1ab7, 0x1803, 0x1d06, 0x81c, 0x890, 0x11e0, 0x1e19, 0x0} +#elif RADIX == 32 +{0xe20f48, 0x1a336340, 0xf6abcd4, 0xaad5b89, 0x143d805, 0x7ab7595, 0x73a0d80, 0xf022410, 0xf0cc} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x9a9a33634007107a, 0xec02aab56e25ed57, 0x741b007ab75950a1, 0x1478663c089040e} +#else +{0x519b1a003883d, 0x356e25ed579a9, 0x6b2a143d80555, 0x1039d06c01ead, 0xa3c331e0448} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1e68, 0xcde, 0x29, 0x1777, 0x1ef8, 0x1a1c, 0x204, 0x148, 0x14ba, 0x1c39, 0x175, 0x1263, 0x4de, 0x1032, 0x1649, 0x5a4, 0xad, 0xcfb, 0x870, 0x3} +#elif RADIX == 32 +{0xb37bcd0, 0x18bbb80a, 0x9a1cf7, 0x12e82902, 0x10baf0e6, 0x44de931, 0x92c9303, 0x7d82b4b, 0x34383} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x9ef8bbb80a59bde6, 0x78734ba0a4081343, 0x59260644de93185d, 0x29a1c19f60ad2d2} +#else +{0x45ddc052cdef3, 0x20a40813439ef, 0x52630baf0e697, 0x4b49649819137, 0x14d0e0cfb056} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7177,0xb186,0x73de,0xc572,0x9802,0xc0ee,0x7031,0xfe17,0xbc2e,0x41c5,0xe2a7,0xed41,0x1cbf,0x9ff9,0xf5bc,0x1e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb1867177,0xc57273de,0xc0ee9802,0xfe177031,0x41c5bc2e,0xed41e2a7,0x9ff91cbf,0x1ef5bc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc57273deb1867177,0xfe177031c0ee9802,0xed41e2a741c5bc2e,0x1ef5bc9ff91cbf}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x726a,0xbae3,0x32b6,0x75c2,0xe003,0x6e79,0xd172,0x382a,0x8a51,0x7962,0xa563,0x6a39,0x9cdd,0xc910,0xf6f0,0xa0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbae3726a,0x75c232b6,0x6e79e003,0x382ad172,0x79628a51,0x6a39a563,0xc9109cdd,0xa0f6f0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x75c232b6bae3726a,0x382ad1726e79e003,0x6a39a56379628a51,0xa0f6f0c9109cdd}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x246b,0x9fa9,0x54e6,0xbd87,0x15b5,0x1c70,0x6470,0x25fa,0x3f5c,0x8940,0xa6e9,0x7eb5,0x6109,0x54a1,0xa8df,0x16}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9fa9246b,0xbd8754e6,0x1c7015b5,0x25fa6470,0x89403f5c,0x7eb5a6e9,0x54a16109,0x16a8df}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xbd8754e69fa9246b,0x25fa64701c7015b5,0x7eb5a6e989403f5c,0x16a8df54a16109}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8e89,0x4e79,0x8c21,0x3a8d,0x67fd,0x3f11,0x8fce,0x1e8,0x43d1,0xbe3a,0x1d58,0x12be,0xe340,0x6006,0xa43,0xe1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4e798e89,0x3a8d8c21,0x3f1167fd,0x1e88fce,0xbe3a43d1,0x12be1d58,0x6006e340,0xe10a43}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3a8d8c214e798e89,0x1e88fce3f1167fd,0x12be1d58be3a43d1,0xe10a436006e340}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x231b,0x1af2,0x1640,0xb19c,0xf713,0xe470,0x683e,0xf39a,0x3289,0x7a54,0xc26e,0x904e,0xd5a6,0x6a0c,0x55fc,0x44}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1af2231b,0xb19c1640,0xe470f713,0xf39a683e,0x7a543289,0x904ec26e,0x6a0cd5a6,0x4455fc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb19c16401af2231b,0xf39a683ee470f713,0x904ec26e7a543289,0x4455fc6a0cd5a6}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xad7a,0xb685,0xde69,0x55d2,0x5675,0x84e8,0x5916,0x925f,0x8c0a,0x1cb6,0x7c51,0x8391,0xffce,0x11d1,0x96ce,0xcd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb685ad7a,0x55d2de69,0x84e85675,0x925f5916,0x1cb68c0a,0x83917c51,0x11d1ffce,0xcd96ce}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x55d2de69b685ad7a,0x925f591684e85675,0x83917c511cb68c0a,0xcd96ce11d1ffce}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3724,0x79bd,0x1b92,0x959b,0xb3ec,0x6f18,0x27d4,0x64a7,0x9b4b,0x8c7e,0xade7,0x664b,0xa6d9,0xa287,0x6a1d,0x48}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x79bd3724,0x959b1b92,0x6f18b3ec,0x64a727d4,0x8c7e9b4b,0x664bade7,0xa287a6d9,0x486a1d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x959b1b9279bd3724,0x64a727d46f18b3ec,0x664bade78c7e9b4b,0x486a1da287a6d9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdce5,0xe50d,0xe9bf,0x4e63,0x8ec,0x1b8f,0x97c1,0xc65,0xcd76,0x85ab,0x3d91,0x6fb1,0x2a59,0x95f3,0xaa03,0xbb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe50ddce5,0x4e63e9bf,0x1b8f08ec,0xc6597c1,0x85abcd76,0x6fb13d91,0x95f32a59,0xbbaa03}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4e63e9bfe50ddce5,0xc6597c11b8f08ec,0x6fb13d9185abcd76,0xbbaa0395f32a59}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1975,0x2b02,0x86c,0x9cbe,0x7576,0xb1c3,0xd9a7,0x737e,0x4de1,0xa245,0x7652,0xf9bf,0x4bf8,0xdc2c,0xeaa1,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2b021975,0x9cbe086c,0xb1c37576,0x737ed9a7,0xa2454de1,0xf9bf7652,0xdc2c4bf8,0x8eaa1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x9cbe086c2b021975,0x737ed9a7b1c37576,0xf9bf7652a2454de1,0x8eaa1dc2c4bf8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xee88,0x46bc,0x7177,0x337c,0x92b6,0x40dc,0xb657,0x3366,0x6c8a,0x2b98,0x40eb,0x1146,0xe116,0xb00a,0xa22f,0xe3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x46bcee88,0x337c7177,0x40dc92b6,0x3366b657,0x2b986c8a,0x114640eb,0xb00ae116,0xe3a22f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x337c717746bcee88,0x3366b65740dc92b6,0x114640eb2b986c8a,0xe3a22fb00ae116}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf28d,0x64d3,0xe248,0x40b9,0x5141,0x82bb,0x82ea,0xcf35,0xfaf0,0x3,0xd71f,0x6e88,0x7ac9,0xf4c9,0x6b9e,0xcc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x64d3f28d,0x40b9e248,0x82bb5141,0xcf3582ea,0x3faf0,0x6e88d71f,0xf4c97ac9,0xcc6b9e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x40b9e24864d3f28d,0xcf3582ea82bb5141,0x6e88d71f0003faf0,0xcc6b9ef4c97ac9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe68b,0xd4fd,0xf793,0x6341,0x8a89,0x4e3c,0x2658,0x8c81,0xb21e,0x5dba,0x89ad,0x640,0xb407,0x23d3,0x155e,0xf7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd4fde68b,0x6341f793,0x4e3c8a89,0x8c812658,0x5dbab21e,0x64089ad,0x23d3b407,0xf7155e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6341f793d4fde68b,0x8c8126584e3c8a89,0x64089ad5dbab21e,0xf7155e23d3b407}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7177,0xb186,0x73de,0xc572,0x9802,0xc0ee,0x7031,0xfe17,0xbc2e,0x41c5,0xe2a7,0xed41,0x1cbf,0x9ff9,0xf5bc,0x1e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb1867177,0xc57273de,0xc0ee9802,0xfe177031,0x41c5bc2e,0xed41e2a7,0x9ff91cbf,0x1ef5bc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc57273deb1867177,0xfe177031c0ee9802,0xed41e2a741c5bc2e,0x1ef5bc9ff91cbf}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x726a,0xbae3,0x32b6,0x75c2,0xe003,0x6e79,0xd172,0x382a,0x8a51,0x7962,0xa563,0x6a39,0x9cdd,0xc910,0xf6f0,0xa0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbae3726a,0x75c232b6,0x6e79e003,0x382ad172,0x79628a51,0x6a39a563,0xc9109cdd,0xa0f6f0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x75c232b6bae3726a,0x382ad1726e79e003,0x6a39a56379628a51,0xa0f6f0c9109cdd}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x246b,0x9fa9,0x54e6,0xbd87,0x15b5,0x1c70,0x6470,0x25fa,0x3f5c,0x8940,0xa6e9,0x7eb5,0x6109,0x54a1,0xa8df,0x16}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9fa9246b,0xbd8754e6,0x1c7015b5,0x25fa6470,0x89403f5c,0x7eb5a6e9,0x54a16109,0x16a8df}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xbd8754e69fa9246b,0x25fa64701c7015b5,0x7eb5a6e989403f5c,0x16a8df54a16109}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8e89,0x4e79,0x8c21,0x3a8d,0x67fd,0x3f11,0x8fce,0x1e8,0x43d1,0xbe3a,0x1d58,0x12be,0xe340,0x6006,0xa43,0xe1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4e798e89,0x3a8d8c21,0x3f1167fd,0x1e88fce,0xbe3a43d1,0x12be1d58,0x6006e340,0xe10a43}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3a8d8c214e798e89,0x1e88fce3f1167fd,0x12be1d58be3a43d1,0xe10a436006e340}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x118e,0xd79,0xb20,0xd8ce,0x7b89,0x7238,0x341f,0xf9cd,0x1944,0x3d2a,0x6137,0x4827,0x6ad3,0x3506,0x2afe,0x22}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd79118e,0xd8ce0b20,0x72387b89,0xf9cd341f,0x3d2a1944,0x48276137,0x35066ad3,0x222afe}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd8ce0b200d79118e,0xf9cd341f72387b89,0x482761373d2a1944,0x222afe35066ad3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd6bd,0xdb42,0x6f34,0xaae9,0x2b3a,0x4274,0xac8b,0x492f,0x4605,0x8e5b,0xbe28,0x41c8,0xffe7,0x8e8,0xcb67,0x66}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdb42d6bd,0xaae96f34,0x42742b3a,0x492fac8b,0x8e5b4605,0x41c8be28,0x8e8ffe7,0x66cb67}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xaae96f34db42d6bd,0x492fac8b42742b3a,0x41c8be288e5b4605,0x66cb6708e8ffe7}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9b92,0x3cde,0x8dc9,0x4acd,0x59f6,0x378c,0x93ea,0xb253,0x4da5,0xc63f,0xd6f3,0xb325,0xd36c,0xd143,0x350e,0x24}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3cde9b92,0x4acd8dc9,0x378c59f6,0xb25393ea,0xc63f4da5,0xb325d6f3,0xd143d36c,0x24350e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4acd8dc93cde9b92,0xb25393ea378c59f6,0xb325d6f3c63f4da5,0x24350ed143d36c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xee73,0xf286,0xf4df,0x2731,0x8476,0x8dc7,0xcbe0,0x632,0xe6bb,0xc2d5,0x9ec8,0xb7d8,0x952c,0xcaf9,0xd501,0xdd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf286ee73,0x2731f4df,0x8dc78476,0x632cbe0,0xc2d5e6bb,0xb7d89ec8,0xcaf9952c,0xddd501}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2731f4dff286ee73,0x632cbe08dc78476,0xb7d89ec8c2d5e6bb,0xddd501caf9952c}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x84a0,0x8ad1,0xbcc4,0xc440,0x94e1,0x46ea,0x15c6,0x784e,0x190,0xd26f,0x630,0x2bee,0x74b1,0x93ce,0xe061,0x3c}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8ad184a0,0xc440bcc4,0x46ea94e1,0x784e15c6,0xd26f0190,0x2bee0630,0x93ce74b1,0x3ce061}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc440bcc48ad184a0,0x784e15c646ea94e1,0x2bee0630d26f0190,0x3ce06193ce74b1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1e2b,0xdafe,0xfa45,0xa69b,0xb77e,0xf670,0x927d,0xa0f9,0xccb5,0xc897,0x9607,0x5f22,0x47bf,0x867,0xf781,0xd9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdafe1e2b,0xa69bfa45,0xf670b77e,0xa0f9927d,0xc897ccb5,0x5f229607,0x86747bf,0xd9f781}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa69bfa45dafe1e2b,0xa0f9927df670b77e,0x5f229607c897ccb5,0xd9f781086747bf}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x2aa2,0xbd3f,0x2ad,0x19bd,0xe6f0,0x3b95,0x3fff,0xd17e,0xf3a6,0x7888,0xda46,0x3b21,0xcc57,0x5301,0x3e50,0xc4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbd3f2aa2,0x19bd02ad,0x3b95e6f0,0xd17e3fff,0x7888f3a6,0x3b21da46,0x5301cc57,0xc43e50}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x19bd02adbd3f2aa2,0xd17e3fff3b95e6f0,0x3b21da467888f3a6,0xc43e505301cc57}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7b60,0x752e,0x433b,0x3bbf,0x6b1e,0xb915,0xea39,0x87b1,0xfe6f,0x2d90,0xf9cf,0xd411,0x8b4e,0x6c31,0x1f9e,0xc3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x752e7b60,0x3bbf433b,0xb9156b1e,0x87b1ea39,0x2d90fe6f,0xd411f9cf,0x6c318b4e,0xc31f9e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3bbf433b752e7b60,0x87b1ea39b9156b1e,0xd411f9cf2d90fe6f,0xc31f9e6c318b4e}}} +#endif +}}}}; diff --git a/src/precomp/ref/lvl1/hd_splitting_transforms.c b/src/precomp/ref/lvl1/hd_splitting_transforms.c new file mode 100644 index 0000000..6332d21 --- /dev/null +++ b/src/precomp/ref/lvl1/hd_splitting_transforms.c @@ -0,0 +1,143 @@ +#include + +#define FP2_ZERO 0 +#define FP2_ONE 1 +#define FP2_I 2 +#define FP2_MINUS_ONE 3 +#define FP2_MINUS_I 4 + +const int EVEN_INDEX[10][2] = {{0, 0}, {0, 1}, {0, 2}, {0, 3}, {1, 0}, {1, 2}, {2, 0}, {2, 1}, {3, 0}, {3, 3}}; +const int CHI_EVAL[4][4] = {{1, 1, 1, 1}, {1, -1, 1, -1}, {1, 1, -1, -1}, {1, -1, -1, 1}}; +const fp2_t FP2_CONSTANTS[5] = {{ +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x1ccc, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x7} +#elif RADIX == 32 +{0x1ffff999, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x2ffff} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xffffffffffffffcc, 0xffffffffffffffff, 0xffffffffffffffff, 0x3ffffffffffffff} +#else +{0x7ffffffffffe6, 0x7ffffffffffff, 0x7ffffffffffff, 0x7ffffffffffff, 0x1fffffffffff} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1ccc, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x7} +#elif RADIX == 32 +{0x1ffff999, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x2ffff} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xffffffffffffffcc, 0xffffffffffffffff, 0xffffffffffffffff, 0x3ffffffffffffff} +#else +{0x7ffffffffffe6, 0x7ffffffffffff, 0x7ffffffffffff, 0x7ffffffffffff, 0x1fffffffffff} +#endif +#endif +}}; +const precomp_basis_change_matrix_t SPLITTING_TRANSFORMS[10] = {{{{FP2_ONE, FP2_I, FP2_ONE, FP2_I}, {FP2_ONE, FP2_MINUS_I, FP2_MINUS_ONE, FP2_I}, {FP2_ONE, FP2_I, FP2_MINUS_ONE, FP2_MINUS_I}, {FP2_MINUS_ONE, FP2_I, FP2_MINUS_ONE, FP2_I}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_MINUS_ONE, FP2_ZERO, FP2_ZERO}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}, {FP2_ZERO, FP2_ZERO, FP2_MINUS_ONE, FP2_ZERO}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_MINUS_ONE}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE}, {FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_ONE}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_ONE}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE}, {FP2_MINUS_ONE, FP2_ONE, FP2_ONE, FP2_MINUS_ONE}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}}}}; +const precomp_basis_change_matrix_t NORMALIZATION_TRANSFORMS[6] = {{{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}}}, {{{FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}}}, {{{FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_ONE}, {FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}}}, {{{FP2_MINUS_ONE, FP2_I, FP2_I, FP2_ONE}, {FP2_I, FP2_MINUS_ONE, FP2_ONE, FP2_I}, {FP2_I, FP2_ONE, FP2_MINUS_ONE, FP2_I}, {FP2_ONE, FP2_I, FP2_I, FP2_MINUS_ONE}}}, {{{FP2_ONE, FP2_I, FP2_I, FP2_MINUS_ONE}, {FP2_I, FP2_ONE, FP2_MINUS_ONE, FP2_I}, {FP2_I, FP2_MINUS_ONE, FP2_ONE, FP2_I}, {FP2_MINUS_ONE, FP2_I, FP2_I, FP2_ONE}}}}; diff --git a/src/precomp/ref/lvl1/include/e0_basis.h b/src/precomp/ref/lvl1/include/e0_basis.h new file mode 100644 index 0000000..05cafb8 --- /dev/null +++ b/src/precomp/ref/lvl1/include/e0_basis.h @@ -0,0 +1,3 @@ +#include +extern const fp2_t BASIS_E0_PX; +extern const fp2_t BASIS_E0_QX; diff --git a/src/precomp/ref/lvl1/include/ec_params.h b/src/precomp/ref/lvl1/include/ec_params.h index 5b5ed67..e02ac1d 100644 --- a/src/precomp/ref/lvl1/include/ec_params.h +++ b/src/precomp/ref/lvl1/include/ec_params.h @@ -1,52 +1,12 @@ #ifndef EC_PARAMS_H #define EC_PARAMS_H -#include +#include -#define POWER_OF_2 75 -#define POWER_OF_3 36 +#define TORSION_EVEN_POWER 248 -static digit_t TWOpF[NWORDS_ORDER] = {0x0, 0x0800, 0x0, 0x0}; // 2^g -static digit_t TWOpFm1[NWORDS_ORDER] = {0x0, 0x0400, 0x0, 0x0}; // 2^(g-1) -static digit_t THREEpE[NWORDS_ORDER] = {0x0000000017179149, 0x0, 0x0, 0x0}; // 3^e -static digit_t THREEpF[NWORDS_ORDER] = {0x02153E468B91C6D1, 0x0, 0x0, 0x0}; // 3^f -static digit_t THREEpFdiv2[NWORDS_ORDER] = {0x010A9F2345C8E368, 0x0, 0x0, 0x0}; // Floor(3^f/2) +// p+1 divided by the power of 2 +extern const digit_t p_cofactor_for_2f[1]; +#define P_COFACTOR_FOR_2F_BITLENGTH 3 -#define scaled 1 // unscaled (0) or scaled (1) remainder tree approach -#define gap 83 - -#define P_LEN 9 -#define M_LEN 19 - -static digit_t p_plus_minus_bitlength[P_LEN + M_LEN] = - { 2,5,6,7,7,8,9,10,11,3,4,4,6,7,7,7,8,8,8,8,9,9,9,10,11,11,11,11 }; - -static digit_t p_cofactor_for_2f[3] = { 0x86e4a593c926aa29,0x318674d50cb0e80e,0x00069c53c50d72bb }; -#define P_COFACTOR_FOR_2F_BITLENGTH 179 - -static digit_t p_cofactor_for_3g[4] = { 0x0000000000000000,0x74f9dace0d9ec800,0x63a25b437f655001,0x0000000000000019 }; -#define P_COFACTOR_FOR_3G_BITLENGTH 197 - -static digit_t p_cofactor_for_6fg[4] = { 0x002E9F3B59C1B3D9,0x032C744B686FECAA }; -#define P_COFACTOR_FOR_6FG_BITLENGTH 122 - -static int STRATEGY4[36] = { 15, 9, 5, 3, 2, 1, 1, 1, 1, 2, 1, 1, 1, 4, 2, 1, 1, 1, 2, 1, 1, 7, 4, 2, 1, 1, 2, 1, 1, 3, 2, 1, 1, 1, 1}; - -static int sizeI[] = { - 0, 2, 4, 6, 6, 7, 12, 14, 28, 1, 2, 3, 3, 5, 6, 6, 6, 6, 9, 8, 10, 12, 12, 12, 16, 16, 18, 22 -}; -static int sizeJ[] = { - 0, 2, 3, 4, 4, 7, 10, 13, 17, 1, 1, 1, 3, 4, 4, 4, 5, 5, 6, 7, 9, 8, 10, 12, 16, 16, 16, 22 -}; -static int sizeK[] = { - 1, 3, 5, 2, 6, 0, 5, 7, 4, 1, 1, 0, 0, 4, 0, 5, 5, 8, 3, 7, 11, 2, 9, 15, 4, 12, 20, 18 -}; - -#define sI_max 28 -#define sJ_max 22 -#define sK_max 59 - -#define ceil_log_sI_max 5 -#define ceil_log_sJ_max 5 - -#endif \ No newline at end of file +#endif diff --git a/src/precomp/ref/lvl1/include/encoded_sizes.h b/src/precomp/ref/lvl1/include/encoded_sizes.h index 77185a9..02f8642 100644 --- a/src/precomp/ref/lvl1/include/encoded_sizes.h +++ b/src/precomp/ref/lvl1/include/encoded_sizes.h @@ -1,14 +1,11 @@ +#define SECURITY_BITS 128 +#define SQIsign_response_length 126 +#define HASH_ITERATIONS 64 +#define FP_ENCODED_BYTES 32 #define FP2_ENCODED_BYTES 64 #define EC_CURVE_ENCODED_BYTES 64 #define EC_POINT_ENCODED_BYTES 64 #define EC_BASIS_ENCODED_BYTES 192 -#define CHAIN_LENGTH 9 -#define QUAT_ALG_ELEM_ENCODED_BITS 425 -#define QUAT_ALG_ELEM_ENCODED_BYTES 54 -#define ID2ISO_LONG_TWO_ISOG_ENCODED_BYTES 1170 -#define ZIP_CHAIN_LEN 14 -#define ID2ISO_COMPRESSED_LONG_TWO_ISOG_ZIP_CHAIN_BYTES 10 -#define ID2ISO_COMPRESSED_LONG_TWO_ISOG_BYTES 141 -#define SIGNATURE_LEN 177 -#define PUBLICKEY_BYTES 64 -#define SECRETKEY_BYTES 782 +#define PUBLICKEY_BYTES 65 +#define SECRETKEY_BYTES 353 +#define SIGNATURE_BYTES 148 diff --git a/src/precomp/ref/lvl1/include/endomorphism_action.h b/src/precomp/ref/lvl1/include/endomorphism_action.h index f5397aa..1cc782a 100644 --- a/src/precomp/ref/lvl1/include/endomorphism_action.h +++ b/src/precomp/ref/lvl1/include/endomorphism_action.h @@ -1,19 +1,31 @@ -#include +#ifndef ENDOMORPHISM_ACTION_H +#define ENDOMORPHISM_ACTION_H +#include #include #include -extern const ec_basis_t BASIS_EVEN; -extern const ec_basis_t BASIS_ODD_PLUS; -extern const ec_basis_t BASIS_ODD_MINUS; -extern const ec_basis_t BASIS_COMMITMENT_PLUS; -extern const ec_basis_t BASIS_COMMITMENT_MINUS; -extern const ec_basis_t BASIS_CHALLENGE; -extern const ec_curve_t CURVE_E0; -extern const ec_point_t CURVE_E0_A24; -extern const ibz_mat_2x2_t ACTION_I; -extern const ibz_mat_2x2_t ACTION_J; -extern const ibz_mat_2x2_t ACTION_K; -extern const ibz_mat_2x2_t ACTION_GEN2; -extern const ibz_mat_2x2_t ACTION_GEN3; -extern const ibz_mat_2x2_t ACTION_GEN4; -extern const quat_alg_elem_t COMMITMENT_IDEAL_UNDISTORTED_GEN; -extern const quat_alg_elem_t COMMITMENT_IDEAL_DISTORTION_ENDO; +/** Type for precomputed endomorphism rings applied to precomputed torsion bases. + * + * Precomputed by the precompute scripts. + * + * @typedef curve_with_endomorphism_ring_t + * + * @struct curve_with_endomorphism_ring + **/ +typedef struct curve_with_endomorphism_ring { + ec_curve_t curve; + ec_basis_t basis_even; + ibz_mat_2x2_t action_i, action_j, action_k; + ibz_mat_2x2_t action_gen2, action_gen3, action_gen4; +} curve_with_endomorphism_ring_t; +#define CURVE_E0 (CURVES_WITH_ENDOMORPHISMS->curve) +#define BASIS_EVEN (CURVES_WITH_ENDOMORPHISMS->basis_even) +#define ACTION_I (CURVES_WITH_ENDOMORPHISMS->action_i) +#define ACTION_J (CURVES_WITH_ENDOMORPHISMS->action_j) +#define ACTION_K (CURVES_WITH_ENDOMORPHISMS->action_k) +#define ACTION_GEN2 (CURVES_WITH_ENDOMORPHISMS->action_gen2) +#define ACTION_GEN3 (CURVES_WITH_ENDOMORPHISMS->action_gen3) +#define ACTION_GEN4 (CURVES_WITH_ENDOMORPHISMS->action_gen4) +#define NUM_ALTERNATE_STARTING_CURVES 6 +#define ALTERNATE_STARTING_CURVES (CURVES_WITH_ENDOMORPHISMS+1) +extern const curve_with_endomorphism_ring_t CURVES_WITH_ENDOMORPHISMS[7]; +#endif diff --git a/src/precomp/ref/lvl1/include/fp_constants.h b/src/precomp/ref/lvl1/include/fp_constants.h index 5eb016a..c770b78 100644 --- a/src/precomp/ref/lvl1/include/fp_constants.h +++ b/src/precomp/ref/lvl1/include/fp_constants.h @@ -1,4 +1,17 @@ +#if RADIX == 32 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +#define NWORDS_FIELD 8 +#else +#define NWORDS_FIELD 9 +#endif +#define NWORDS_ORDER 8 +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) #define NWORDS_FIELD 4 -#define NWORDS_ORDER 4 +#else +#define NWORDS_FIELD 5 +#endif +#define NWORDS_ORDER 4 +#endif #define BITS 256 #define LOG2P 8 diff --git a/src/precomp/ref/lvl1/include/hd_splitting_transforms.h b/src/precomp/ref/lvl1/include/hd_splitting_transforms.h new file mode 100644 index 0000000..b3147a4 --- /dev/null +++ b/src/precomp/ref/lvl1/include/hd_splitting_transforms.h @@ -0,0 +1,18 @@ +#ifndef HD_SPLITTING_H +#define HD_SPLITTING_H + +#include +#include + +typedef struct precomp_basis_change_matrix { + uint8_t m[4][4]; +} precomp_basis_change_matrix_t; + +extern const int EVEN_INDEX[10][2]; +extern const int CHI_EVAL[4][4]; +extern const fp2_t FP2_CONSTANTS[5]; +extern const precomp_basis_change_matrix_t SPLITTING_TRANSFORMS[10]; +extern const precomp_basis_change_matrix_t NORMALIZATION_TRANSFORMS[6]; + +#endif + diff --git a/src/precomp/ref/lvl1/include/klpt_constants.h b/src/precomp/ref/lvl1/include/klpt_constants.h deleted file mode 100644 index fcf1e50..0000000 --- a/src/precomp/ref/lvl1/include/klpt_constants.h +++ /dev/null @@ -1,27 +0,0 @@ -#include -#define KLPT_equiv_bound_coeff 6 -#define KLPT_equiv_num_iter 28561 -#define KLPT_primality_num_iter 32 -#define KLPT_signing_klpt_length 1050 -#define KLPT_signing_num_gamma_trial 64 -#define KLPT_gamma_exponent_interval_size 0 -#define KLPT_gamma_exponent_center_shift 14 -#define KLPT_repres_num_gamma_trial 16384 -#define KLPT_signing_number_strong_approx 3432 -#define KLPT_random_prime_attempts 64 -#define KLPT_secret_key_prime_size 64 -#define KLPT_keygen_length 675 -#define KLPT_keygen_num_gamma_trial 64 -#define KLPT_eichler_smallnorm_bitsize 112 -#define KLPT_keygen_number_strong_approx 2639 -#define KLPT_eichler_number_mu_norm 8 -#define KLPT_eichler_strong_approx_log_margin 2 -#define KLPT_eichler_num_equiv_ideal 26 -#define KLPT_eichler_number_strong_approx 2540 -#define SQISIGN_response_attempts 64 -#define SQISIGN_random_length 0 -#define SQISIGN_signing_total_length 1050 -#define SQISIGN_signing_length 14 -#define SQISIGN_keygen_length 9 -extern const short SMALL_PRIMES_1MOD4[11]; -extern const ibz_t PROD_SMALL_PRIMES_3MOD4; diff --git a/src/precomp/ref/lvl1/include/quaternion_constants.h b/src/precomp/ref/lvl1/include/quaternion_constants.h new file mode 100644 index 0000000..5dca7d7 --- /dev/null +++ b/src/precomp/ref/lvl1/include/quaternion_constants.h @@ -0,0 +1,6 @@ +#include +#define QUAT_primality_num_iter 32 +#define QUAT_repres_bound_input 20 +#define QUAT_equiv_bound_coeff 64 +#define FINDUV_box_size 2 +#define FINDUV_cube_size 624 diff --git a/src/precomp/ref/lvl1/include/quaternion_data.h b/src/precomp/ref/lvl1/include/quaternion_data.h index c3de3e1..a5eb110 100644 --- a/src/precomp/ref/lvl1/include/quaternion_data.h +++ b/src/precomp/ref/lvl1/include/quaternion_data.h @@ -1,7 +1,12 @@ -#include #include -#define NUM_ALTERNATE_EXTREMAL_ORDERS 7 +#define MAXORD_O0 (EXTREMAL_ORDERS->order) +#define STANDARD_EXTREMAL_ORDER (EXTREMAL_ORDERS[0]) +#define NUM_ALTERNATE_EXTREMAL_ORDERS 6 +#define ALTERNATE_EXTREMAL_ORDERS (EXTREMAL_ORDERS+1) +#define ALTERNATE_CONNECTING_IDEALS (CONNECTING_IDEALS+1) +#define ALTERNATE_CONJUGATING_ELEMENTS (CONJUGATING_ELEMENTS+1) +extern const ibz_t QUAT_prime_cofactor; extern const quat_alg_t QUATALG_PINFTY; -extern const quat_order_t MAXORD_O0; -extern const quat_p_extremal_maximal_order_t STANDARD_EXTREMAL_ORDER; -extern const quat_p_extremal_maximal_order_t ALTERNATE_EXTREMAL_ORDERS[7]; +extern const quat_p_extremal_maximal_order_t EXTREMAL_ORDERS[7]; +extern const quat_left_ideal_t CONNECTING_IDEALS[7]; +extern const quat_alg_elem_t CONJUGATING_ELEMENTS[7]; diff --git a/src/precomp/ref/lvl1/include/torsion_constants.h b/src/precomp/ref/lvl1/include/torsion_constants.h index 98b30b3..2756a27 100644 --- a/src/precomp/ref/lvl1/include/torsion_constants.h +++ b/src/precomp/ref/lvl1/include/torsion_constants.h @@ -1,24 +1,6 @@ -#include -#define TORSION_2POWER_BYTES 10 -#define TORSION_3POWER_BYTES 8 -#define TORSION_23POWER_BYTES 17 -extern const uint64_t TORSION_PLUS_EVEN_POWER; -extern const uint64_t TORSION_ODD_PRIMES[28]; -extern const uint64_t TORSION_ODD_POWERS[28]; -extern const uint64_t TORSION_PLUS_ODD_PRIMES[9]; -extern const size_t TORSION_PLUS_ODD_POWERS[9]; -extern const uint64_t TORSION_MINUS_ODD_PRIMES[19]; -extern const size_t TORSION_MINUS_ODD_POWERS[19]; -extern const size_t DEGREE_COMMITMENT_POWERS[28]; -extern const ibz_t CHARACTERISTIC; -extern const ibz_t TORSION_ODD; -extern const ibz_t TORSION_ODD_PRIMEPOWERS[28]; -extern const ibz_t TORSION_ODD_PLUS; -extern const ibz_t TORSION_ODD_MINUS; +#include +#define TORSION_2POWER_BYTES 32 +extern const ibz_t TWO_TO_SECURITY_BITS; extern const ibz_t TORSION_PLUS_2POWER; -extern const ibz_t TORSION_PLUS_3POWER; -extern const ibz_t TORSION_PLUS_23POWER; -extern const ibz_t DEGREE_COMMITMENT; -extern const ibz_t DEGREE_COMMITMENT_PLUS; -extern const ibz_t DEGREE_COMMITMENT_MINUS; -extern const ibz_t DEGREE_CHALLENGE; +extern const ibz_t SEC_DEGREE; +extern const ibz_t COM_DEGREE; diff --git a/src/precomp/ref/lvl1/klpt_constants.c b/src/precomp/ref/lvl1/klpt_constants.c deleted file mode 100644 index 3358164..0000000 --- a/src/precomp/ref/lvl1/klpt_constants.c +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include -#include -#if 0 -#elif 8*DIGIT_LEN == 16 -const short SMALL_PRIMES_1MOD4[11] = {0x5, 0xd, 0x11, 0x1d, 0x25, 0x29, 0x35, 0x3d, 0x49, 0x59, 0x61}; -const ibz_t PROD_SMALL_PRIMES_3MOD4 = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x173b,0x80bd,0xa9d7,0xa185}}}; -#elif 8*DIGIT_LEN == 32 -const short SMALL_PRIMES_1MOD4[11] = {0x5, 0xd, 0x11, 0x1d, 0x25, 0x29, 0x35, 0x3d, 0x49, 0x59, 0x61}; -const ibz_t PROD_SMALL_PRIMES_3MOD4 = {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x80bd173b,0xa185a9d7}}}; -#elif 8*DIGIT_LEN == 64 -const short SMALL_PRIMES_1MOD4[11] = {0x5, 0xd, 0x11, 0x1d, 0x25, 0x29, 0x35, 0x3d, 0x49, 0x59, 0x61}; -const ibz_t PROD_SMALL_PRIMES_3MOD4 = {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xa185a9d780bd173b}}}; -#endif diff --git a/src/precomp/ref/lvl1/quaternion_data.c b/src/precomp/ref/lvl1/quaternion_data.c index 0894028..baf3da0 100644 --- a/src/precomp/ref/lvl1/quaternion_data.c +++ b/src/precomp/ref/lvl1/quaternion_data.c @@ -1,20 +1,3176 @@ #include #include #include +const ibz_t QUAT_prime_cofactor = #if 0 -#elif 8*DIGIT_LEN == 16 -const quat_alg_t QUATALG_PINFTY = {{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0x47ff,0x3551,0x9e49,0x252c,0x7437,0x8740,0xa865,0x33a6,0xd98c,0x6b95,0x9e28,0x34e2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0x47ff,0x3551,0x9e49,0x252c,0x7437,0x8740,0xa865,0x33a6,0xd98c,0x6b95,0x9e28,0x34e2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0x47ff,0x3551,0x9e49,0x252c,0x7437,0x8740,0xa865,0x33a6,0xd98c,0x6b95,0x9e28,0x34e2}}}}}}; -const quat_order_t MAXORD_O0 = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}; -const quat_p_extremal_maximal_order_t STANDARD_EXTREMAL_ORDER = {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1}; -const quat_p_extremal_maximal_order_t ALTERNATE_EXTREMAL_ORDERS[7] = {{{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf508,0x9173,0xfad5,0xf531,0xa571,0xc66d,0x411,0x86fc}}}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf508,0x9173,0xfad5,0xf531,0xa571,0xc66d,0x411,0x86fc}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xfa84,0xc8b9,0xfd6a,0xfa98,0xd2b8,0xe336,0x208,0x437e}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xfa84,0xc8b9,0xfd6a,0xfa98,0xd2b8,0xe336,0x208,0x437e}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x2820,0x8fdc,0xf7b4,0x7a9e,0xa5b,0xd77d,0xbc5f,0x3efd,0xf98b,0xf3a,0x3056,0x334a,0x40,0x4f65,0x662d,0x2396}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1410,0x47ee,0x7bda,0xbd4f,0x852d,0xebbe,0xde2f,0x9f7e,0x7cc5,0x79d,0x182b,0x19a5,0x8020,0xa7b2,0x3316,0x11cb}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9a27,0x95c,0xc884,0x91ff,0xef4b,0xc1ca,0xfabb,0x33b8,0xf98b,0xf3a,0x3056,0x334a,0x40,0x4f65,0x662d,0x2396}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xfa84,0xc8b9,0xfd6a,0xfa98,0xd2b8,0xe336,0x208,0x437e}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf508,0x9173,0xfad5,0xf531,0xa571,0xc66d,0x411,0x86fc}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x1bf2,0xcff,0x5e61,0xd13e,0x361f,0x2b64,0x8348,0x1689}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x3}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf38c,0x430,0x268d,0xa0fd,0x3891,0xcb70,0xeebe,0x3738}}}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf38c,0x430,0x268d,0xa0fd,0x3891,0xcb70,0xeebe,0x3738}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x79c6,0x8218,0x9346,0xd07e,0x1c48,0x65b8,0x775f,0x1b9c}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8a48,0x4e19,0xb498,0x4481,0x645a,0x6523,0xf47f,0xebd5,0x568c,0xd118,0x8fdd,0x4c28,0x44ef,0xa6c5,0xc19f,0x5f4}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe677,0x2da9,0x96e8,0xe7c7,0xfb55,0xa06f,0x1078,0xa192}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x79c6,0x8218,0x9346,0xd07e,0x1c48,0x65b8,0x775f,0x1b9c}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf38c,0x430,0x268d,0xa0fd,0x3891,0xcb70,0xeebe,0x3738}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe677,0x2da9,0x96e8,0xe7c7,0xfb55,0xa06f,0x1078,0xa192}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xd}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2d2,0xe639,0x8fd6,0x201e,0x74ca,0xa699,0x7a91,0x3c02}}}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2d2,0xe639,0x8fd6,0x201e,0x74ca,0xa699,0x7a91,0x3c02}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8169,0x731c,0x47eb,0x100f,0xba65,0xd34c,0x3d48,0x1e01}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xfa22,0xccc5,0xe86d,0x485c,0x6189,0x3a24,0xf08a,0x534d,0xf56d,0xb7c3,0x9377,0x7de4,0xd766,0x3586,0x94bd,0x708}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xfd11,0xe662,0x7436,0xa42e,0x30c4,0x1d12,0xf845,0xa9a6,0xfab6,0xdbe1,0x49bb,0x3ef2,0x6bb3,0x9ac3,0x4a5e,0x384}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x4a50,0xb78f,0x9382,0x4472,0xe7e4,0xd139,0xb64d,0x1794,0xf56d,0xb7c3,0x9377,0x7de4,0xd766,0x3586,0x94bd,0x708}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8169,0x731c,0x47eb,0x100f,0xba65,0xd34c,0x3d48,0x1e01}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2d2,0xe639,0x8fd6,0x201e,0x74ca,0xa699,0x7a91,0x3c02}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x5fa4,0x2a6d,0xa9d6,0x7d4,0xf34a,0xd1d4,0x7478,0x7772}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x13}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb00,0x5f26,0xd2c4,0x9c87,0xbe9e,0xebb0,0x6685,0x30af}}}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb00,0x5f26,0xd2c4,0x9c87,0xbe9e,0xebb0,0x6685,0x30af}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x580,0x2f93,0xe962,0x4e43,0x5f4f,0xf5d8,0xb342,0x1857}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x580,0x2f93,0xe962,0x4e43,0x5f4f,0xf5d8,0xb342,0x1857}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8000,0xa23c,0xce8,0xecd5,0x8721,0x2bf1,0xc989,0xe09b,0x202a,0x4453,0xaf22,0xd70b,0xc07f,0xc644,0x1f4f,0x4a1}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x4000,0x511e,0x8674,0xf66a,0xc390,0x95f8,0xe4c4,0x704d,0x9015,0x2229,0xd791,0xeb85,0x603f,0xe322,0x8fa7,0x250}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9fff,0x7f60,0xf4db,0xdf95,0xdc35,0x6681,0x43d0,0xd71b,0x202a,0x4453,0xaf22,0xd70b,0xc07f,0xc644,0x1f4f,0x4a1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x580,0x2f93,0xe962,0x4e43,0x5f4f,0xf5d8,0xb342,0x1857}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb00,0x5f26,0xd2c4,0x9c87,0xbe9e,0xebb0,0x6685,0x30af}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xc002,0x45b7,0x301a,0x1a7e,0x55d8,0x8adf,0xb71,0x1301}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x17}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd48,0x934e,0xa756,0x46b3,0xb5a0,0xfcd8,0x6d15,0x3c16}}}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd48,0x934e,0xa756,0x46b3,0xb5a0,0xfcd8,0x6d15,0x3c16}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6a4,0x49a7,0xd3ab,0x2359,0x5ad0,0xfe6c,0x368a,0x1e0b}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3220,0x6448,0xcbb6,0x8a9b,0x94f0,0xb96d,0x8e3,0xfea8,0xf1b,0x3c36,0x16c,0x2c52,0x62cb,0x9e64,0x428c,0x70d}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x167f,0x8798,0xcb5d,0xabbe,0x4d9,0x4e90,0xf28c,0xd0b7,0xf1a,0x3c36,0x16c,0x2c52,0x62cb,0x9e64,0x428c,0x70d}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6a4,0x49a7,0xd3ab,0x2359,0x5ad0,0xfe6c,0x368a,0x1e0b}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd48,0x934e,0xa756,0x46b3,0xb5a0,0xfcd8,0x6d15,0x3c16}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -9, ._mp_d = (mp_limb_t[]) {0x1ba1,0xdcb0,0x58,0xdedd,0x9016,0x6add,0x1657,0x2df0,0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1d}, {{{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x5bbe,0x15d7,0x57f9,0x4168,0xa74e,0xc5bc,0xa151,0x546e,0x12}}}, {{{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x5bbe,0x15d7,0x57f9,0x4168,0xa74e,0xc5bc,0xa151,0x546e,0x12}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xaddf,0x8aeb,0x2bfc,0x20b4,0x53a7,0xe2de,0x50a8,0x2a37,0x9}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x5082,0x3302,0x52ea,0x72c4,0x1346,0xc4d9,0xa79c,0x6dbe,0xe980,0xaf26,0xa05e,0x2cb3,0x9be1,0x401c,0xbc96,0xfdb3,0xa7}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x458f,0x2b52,0x290a,0x2bf3,0x5bd4,0x1e47,0x68e5,0xd1e8,0xfc86,0xface,0x7a4d,0xc6d6,0xaabc,0x37d3,0xc371,0xb301,0x40}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xaddf,0x8aeb,0x2bfc,0x20b4,0x53a7,0xe2de,0x50a8,0x2a37,0x9}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x5bbe,0x15d7,0x57f9,0x4168,0xa74e,0xc5bc,0xa151,0x546e,0x12}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -9, ._mp_d = (mp_limb_t[]) {0x49ba,0xb00c,0x43bb,0xdadd,0xcbf9,0xaceb,0x528d,0xeae9,0x58}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x94}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x25}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc6aa,0xc7ce,0xf488,0x73ee,0x2bc9,0xe445,0x2ef7,0xae5e}}}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc6aa,0xc7ce,0xf488,0x73ee,0x2bc9,0xe445,0x2ef7,0xae5e}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6355,0x63e7,0x7a44,0xb9f7,0x95e4,0xf222,0x177b,0x572f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb472,0x4fe1,0x2240,0x9939,0xb1f0,0xce40,0x7e04,0xed63,0x23c2,0x49d2,0x127e,0x9326,0xd832,0xc07b,0x153f,0x3b62}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6f69,0xb851,0xe08a,0xb75a,0x497c,0x1ca3,0x7b44,0x874d,0x5659,0xee23,0xcb8e,0x9bf7,0x671f,0xd84d,0x4d47,0x251d}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6355,0x63e7,0x7a44,0xb9f7,0x95e4,0xf222,0x177b,0x572f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc6aa,0xc7ce,0xf488,0x73ee,0x2bc9,0xe445,0x2ef7,0xae5e}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xaf2,0xccdd,0xa6eb,0x4346,0x2dcd,0x2229,0x9bf7,0x6885,0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x29}}; -#elif 8*DIGIT_LEN == 32 -const quat_alg_t QUATALG_PINFTY = {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0x355147ff,0x252c9e49,0x87407437,0x33a6a865,0x6b95d98c,0x34e29e28}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0x355147ff,0x252c9e49,0x87407437,0x33a6a865,0x6b95d98c,0x34e29e28}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0x355147ff,0x252c9e49,0x87407437,0x33a6a865,0x6b95d98c,0x34e29e28}}}}}}; -const quat_order_t MAXORD_O0 = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}; -const quat_p_extremal_maximal_order_t STANDARD_EXTREMAL_ORDER = {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1}; -const quat_p_extremal_maximal_order_t ALTERNATE_EXTREMAL_ORDERS[7] = {{{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x9173f508,0xf531fad5,0xc66da571,0x86fc0411}}}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x9173f508,0xf531fad5,0xc66da571,0x86fc0411}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc8b9fa84,0xfa98fd6a,0xe336d2b8,0x437e0208}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc8b9fa84,0xfa98fd6a,0xe336d2b8,0x437e0208}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8fdc2820,0x7a9ef7b4,0xd77d0a5b,0x3efdbc5f,0xf3af98b,0x334a3056,0x4f650040,0x2396662d}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x47ee1410,0xbd4f7bda,0xebbe852d,0x9f7ede2f,0x79d7cc5,0x19a5182b,0xa7b28020,0x11cb3316}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x95c9a27,0x91ffc884,0xc1caef4b,0x33b8fabb,0xf3af98b,0x334a3056,0x4f650040,0x2396662d}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc8b9fa84,0xfa98fd6a,0xe336d2b8,0x437e0208}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x9173f508,0xf531fad5,0xc66da571,0x86fc0411}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xcff1bf2,0xd13e5e61,0x2b64361f,0x16898348}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x3}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x430f38c,0xa0fd268d,0xcb703891,0x3738eebe}}}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x430f38c,0xa0fd268d,0xcb703891,0x3738eebe}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x821879c6,0xd07e9346,0x65b81c48,0x1b9c775f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4e198a48,0x4481b498,0x6523645a,0xebd5f47f,0xd118568c,0x4c288fdd,0xa6c544ef,0x5f4c19f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2da9e677,0xe7c796e8,0xa06ffb55,0xa1921078}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x821879c6,0xd07e9346,0x65b81c48,0x1b9c775f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x430f38c,0xa0fd268d,0xcb703891,0x3738eebe}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2da9e677,0xe7c796e8,0xa06ffb55,0xa1921078}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xd}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xe63902d2,0x201e8fd6,0xa69974ca,0x3c027a91}}}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xe63902d2,0x201e8fd6,0xa69974ca,0x3c027a91}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x731c8169,0x100f47eb,0xd34cba65,0x1e013d48}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xccc5fa22,0x485ce86d,0x3a246189,0x534df08a,0xb7c3f56d,0x7de49377,0x3586d766,0x70894bd}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe662fd11,0xa42e7436,0x1d1230c4,0xa9a6f845,0xdbe1fab6,0x3ef249bb,0x9ac36bb3,0x3844a5e}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb78f4a50,0x44729382,0xd139e7e4,0x1794b64d,0xb7c3f56d,0x7de49377,0x3586d766,0x70894bd}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x731c8169,0x100f47eb,0xd34cba65,0x1e013d48}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xe63902d2,0x201e8fd6,0xa69974ca,0x3c027a91}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x2a6d5fa4,0x7d4a9d6,0xd1d4f34a,0x77727478}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x13}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x5f260b00,0x9c87d2c4,0xebb0be9e,0x30af6685}}}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x5f260b00,0x9c87d2c4,0xebb0be9e,0x30af6685}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2f930580,0x4e43e962,0xf5d85f4f,0x1857b342}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2f930580,0x4e43e962,0xf5d85f4f,0x1857b342}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa23c8000,0xecd50ce8,0x2bf18721,0xe09bc989,0x4453202a,0xd70baf22,0xc644c07f,0x4a11f4f}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x511e4000,0xf66a8674,0x95f8c390,0x704de4c4,0x22299015,0xeb85d791,0xe322603f,0x2508fa7}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x7f609fff,0xdf95f4db,0x6681dc35,0xd71b43d0,0x4453202a,0xd70baf22,0xc644c07f,0x4a11f4f}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2f930580,0x4e43e962,0xf5d85f4f,0x1857b342}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x5f260b00,0x9c87d2c4,0xebb0be9e,0x30af6685}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x45b7c002,0x1a7e301a,0x8adf55d8,0x13010b71}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x17}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x934e0d48,0x46b3a756,0xfcd8b5a0,0x3c166d15}}}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x934e0d48,0x46b3a756,0xfcd8b5a0,0x3c166d15}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x49a706a4,0x2359d3ab,0xfe6c5ad0,0x1e0b368a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x64483220,0x8a9bcbb6,0xb96d94f0,0xfea808e3,0x3c360f1b,0x2c52016c,0x9e6462cb,0x70d428c}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8798167f,0xabbecb5d,0x4e9004d9,0xd0b7f28c,0x3c360f1a,0x2c52016c,0x9e6462cb,0x70d428c}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x49a706a4,0x2359d3ab,0xfe6c5ad0,0x1e0b368a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x934e0d48,0x46b3a756,0xfcd8b5a0,0x3c166d15}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -5, ._mp_d = (mp_limb_t[]) {0xdcb01ba1,0xdedd0058,0x6add9016,0x2df01657,0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1d}, {{{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x15d75bbe,0x416857f9,0xc5bca74e,0x546ea151,0x12}}}, {{{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x15d75bbe,0x416857f9,0xc5bca74e,0x546ea151,0x12}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x8aebaddf,0x20b42bfc,0xe2de53a7,0x2a3750a8,0x9}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x33025082,0x72c452ea,0xc4d91346,0x6dbea79c,0xaf26e980,0x2cb3a05e,0x401c9be1,0xfdb3bc96,0xa7}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x2b52458f,0x2bf3290a,0x1e475bd4,0xd1e868e5,0xfacefc86,0xc6d67a4d,0x37d3aabc,0xb301c371,0x40}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x8aebaddf,0x20b42bfc,0xe2de53a7,0x2a3750a8,0x9}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x15d75bbe,0x416857f9,0xc5bca74e,0x546ea151,0x12}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -5, ._mp_d = (mp_limb_t[]) {0xb00c49ba,0xdadd43bb,0xacebcbf9,0xeae9528d,0x58}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x94}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x25}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc7cec6aa,0x73eef488,0xe4452bc9,0xae5e2ef7}}}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc7cec6aa,0x73eef488,0xe4452bc9,0xae5e2ef7}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x63e76355,0xb9f77a44,0xf22295e4,0x572f177b}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4fe1b472,0x99392240,0xce40b1f0,0xed637e04,0x49d223c2,0x9326127e,0xc07bd832,0x3b62153f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb8516f69,0xb75ae08a,0x1ca3497c,0x874d7b44,0xee235659,0x9bf7cb8e,0xd84d671f,0x251d4d47}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x63e76355,0xb9f77a44,0xf22295e4,0x572f177b}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc7cec6aa,0x73eef488,0xe4452bc9,0xae5e2ef7}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xccdd0af2,0x4346a6eb,0x22292dcd,0x68859bf7,0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x29}}; -#elif 8*DIGIT_LEN == 64 -const quat_alg_t QUATALG_PINFTY = {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0x252c9e49355147ff,0x33a6a86587407437,0x34e29e286b95d98c}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0x252c9e49355147ff,0x33a6a86587407437,0x34e29e286b95d98c}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0x252c9e49355147ff,0x33a6a86587407437,0x34e29e286b95d98c}}}}}}; -const quat_order_t MAXORD_O0 = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}; -const quat_p_extremal_maximal_order_t STANDARD_EXTREMAL_ORDER = {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1}; -const quat_p_extremal_maximal_order_t ALTERNATE_EXTREMAL_ORDERS[7] = {{{{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xf531fad59173f508,0x86fc0411c66da571}}}, {{{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xf531fad59173f508,0x86fc0411c66da571}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xfa98fd6ac8b9fa84,0x437e0208e336d2b8}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xfa98fd6ac8b9fa84,0x437e0208e336d2b8}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7a9ef7b48fdc2820,0x3efdbc5fd77d0a5b,0x334a30560f3af98b,0x2396662d4f650040}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xbd4f7bda47ee1410,0x9f7ede2febbe852d,0x19a5182b079d7cc5,0x11cb3316a7b28020}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x91ffc884095c9a27,0x33b8fabbc1caef4b,0x334a30560f3af98b,0x2396662d4f650040}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xfa98fd6ac8b9fa84,0x437e0208e336d2b8}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xf531fad59173f508,0x86fc0411c66da571}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -2, ._mp_d = (mp_limb_t[]) {0xd13e5e610cff1bf2,0x168983482b64361f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x3}, {{{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xa0fd268d0430f38c,0x3738eebecb703891}}}, {{{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xa0fd268d0430f38c,0x3738eebecb703891}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xd07e9346821879c6,0x1b9c775f65b81c48}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4481b4984e198a48,0xebd5f47f6523645a,0x4c288fddd118568c,0x5f4c19fa6c544ef}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xe7c796e82da9e677,0xa1921078a06ffb55}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xd07e9346821879c6,0x1b9c775f65b81c48}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xa0fd268d0430f38c,0x3738eebecb703891}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xe7c796e82da9e677,0xa1921078a06ffb55}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xd}, {{{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x201e8fd6e63902d2,0x3c027a91a69974ca}}}, {{{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x201e8fd6e63902d2,0x3c027a91a69974ca}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x100f47eb731c8169,0x1e013d48d34cba65}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x485ce86dccc5fa22,0x534df08a3a246189,0x7de49377b7c3f56d,0x70894bd3586d766}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa42e7436e662fd11,0xa9a6f8451d1230c4,0x3ef249bbdbe1fab6,0x3844a5e9ac36bb3}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x44729382b78f4a50,0x1794b64dd139e7e4,0x7de49377b7c3f56d,0x70894bd3586d766}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x100f47eb731c8169,0x1e013d48d34cba65}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x201e8fd6e63902d2,0x3c027a91a69974ca}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -2, ._mp_d = (mp_limb_t[]) {0x7d4a9d62a6d5fa4,0x77727478d1d4f34a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x13}, {{{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x9c87d2c45f260b00,0x30af6685ebb0be9e}}}, {{{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x9c87d2c45f260b00,0x30af6685ebb0be9e}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x4e43e9622f930580,0x1857b342f5d85f4f}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x4e43e9622f930580,0x1857b342f5d85f4f}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xecd50ce8a23c8000,0xe09bc9892bf18721,0xd70baf224453202a,0x4a11f4fc644c07f}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xf66a8674511e4000,0x704de4c495f8c390,0xeb85d79122299015,0x2508fa7e322603f}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xdf95f4db7f609fff,0xd71b43d06681dc35,0xd70baf224453202a,0x4a11f4fc644c07f}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x4e43e9622f930580,0x1857b342f5d85f4f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x9c87d2c45f260b00,0x30af6685ebb0be9e}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -2, ._mp_d = (mp_limb_t[]) {0x1a7e301a45b7c002,0x13010b718adf55d8}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x17}, {{{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x46b3a756934e0d48,0x3c166d15fcd8b5a0}}}, {{{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x46b3a756934e0d48,0x3c166d15fcd8b5a0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x2359d3ab49a706a4,0x1e0b368afe6c5ad0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8a9bcbb664483220,0xfea808e3b96d94f0,0x2c52016c3c360f1b,0x70d428c9e6462cb}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xabbecb5d8798167f,0xd0b7f28c4e9004d9,0x2c52016c3c360f1a,0x70d428c9e6462cb}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x2359d3ab49a706a4,0x1e0b368afe6c5ad0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x46b3a756934e0d48,0x3c166d15fcd8b5a0}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0xdedd0058dcb01ba1,0x2df016576add9016,0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1d}, {{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x416857f915d75bbe,0x546ea151c5bca74e,0x12}}}, {{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x416857f915d75bbe,0x546ea151c5bca74e,0x12}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x20b42bfc8aebaddf,0x2a3750a8e2de53a7,0x9}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x72c452ea33025082,0x6dbea79cc4d91346,0x2cb3a05eaf26e980,0xfdb3bc96401c9be1,0xa7}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x2bf3290a2b52458f,0xd1e868e51e475bd4,0xc6d67a4dfacefc86,0xb301c37137d3aabc,0x40}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x20b42bfc8aebaddf,0x2a3750a8e2de53a7,0x9}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x416857f915d75bbe,0x546ea151c5bca74e,0x12}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0xdadd43bbb00c49ba,0xeae9528dacebcbf9,0x58}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x94}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x25}, {{{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x73eef488c7cec6aa,0xae5e2ef7e4452bc9}}}, {{{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x73eef488c7cec6aa,0xae5e2ef7e4452bc9}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xb9f77a4463e76355,0x572f177bf22295e4}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x993922404fe1b472,0xed637e04ce40b1f0,0x9326127e49d223c2,0x3b62153fc07bd832}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb75ae08ab8516f69,0x874d7b441ca3497c,0x9bf7cb8eee235659,0x251d4d47d84d671f}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xb9f77a4463e76355,0x572f177bf22295e4}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x73eef488c7cec6aa,0xae5e2ef7e4452bc9}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x4346a6ebccdd0af2,0x68859bf722292dcd,0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x29}}; +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x41,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x800}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x41,0x0,0x0,0x0,0x0,0x0,0x0,0x8000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x41,0x0,0x0,0x800000000000000}}} #endif +; +const quat_alg_t QUATALG_PINFTY = { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x4ff}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x4ffffff}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0xffffffffffffffff,0xffffffffffffffff,0x4ffffffffffffff}}} +#endif +}; +const quat_p_extremal_maximal_order_t EXTREMAL_ORDERS[7] = {{{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 1}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x10000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x0,0x1000000000000000}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x10000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x0,0x1000000000000000}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x800}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x8000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x0,0x800000000000000}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x800000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x80000000000000}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x800}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x8000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x0,0x800000000000000}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x10000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x0,0x1000000000000000}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 5}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x78d4,0x7b85,0x7a64,0xf5f2,0x29b9,0x3696,0x6101,0xb874}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7b8578d4,0xf5f27a64,0x369629b9,0xb8746101}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xf5f27a647b8578d4,0xb8746101369629b9}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x78d4,0x7b85,0x7a64,0xf5f2,0x29b9,0x3696,0x6101,0xb874}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7b8578d4,0xf5f27a64,0x369629b9,0xb8746101}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xf5f27a647b8578d4,0xb8746101369629b9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbc6a,0x3dc2,0x3d32,0xfaf9,0x14dc,0x9b4b,0x3080,0x5c3a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3dc2bc6a,0xfaf93d32,0x9b4b14dc,0x5c3a3080}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xfaf93d323dc2bc6a,0x5c3a30809b4b14dc}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x7d47,0x6fa4,0x2ad5,0x95ad,0x8a4b,0x49be,0x77e7,0xc898,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x6fa47d47,0x95ad2ad5,0x49be8a4b,0xc89877e7,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x95ad2ad56fa47d47,0xc89877e749be8a4b,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3f47,0x7060,0x5e29,0x3e35,0xd950,0x2a1b,0x10ae,0x78dd,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x280}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x70603f47,0x3e355e29,0x2a1bd950,0x78dd10ae,0x0,0x0,0x0,0x2800000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3e355e2970603f47,0x78dd10ae2a1bd950,0x0,0x280000000000000}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbc6a,0x3dc2,0x3d32,0xfaf9,0x14dc,0x9b4b,0x3080,0x5c3a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3dc2bc6a,0xfaf93d32,0x9b4b14dc,0x5c3a3080}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xfaf93d323dc2bc6a,0x5c3a30809b4b14dc}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x3fe7,0x28ee,0x26e8,0xb194,0x6d7a,0xaf58,0xe568,0xd6d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x28ee3fe7,0xb19426e8,0xaf586d7a,0xd6de568}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -2, ._mp_d = (mp_limb_t[]) {0xb19426e828ee3fe7,0xd6de568af586d7a}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x78d4,0x7b85,0x7a64,0xf5f2,0x29b9,0x3696,0x6101,0xb874}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7b8578d4,0xf5f27a64,0x369629b9,0xb8746101}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xf5f27a647b8578d4,0xb8746101369629b9}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x7d47,0x6fa4,0x2ad5,0x95ad,0x8a4b,0x49be,0x77e7,0xc898,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x6fa47d47,0x95ad2ad5,0x49be8a4b,0xc89877e7,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x95ad2ad56fa47d47,0xc89877e749be8a4b,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 17}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe5e2,0x7715,0xa8e6,0x3c6f,0x9078,0x872b,0x9bec,0x1794}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7715e5e2,0x3c6fa8e6,0x872b9078,0x17949bec}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x3c6fa8e67715e5e2,0x17949bec872b9078}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe5e2,0x7715,0xa8e6,0x3c6f,0x9078,0x872b,0x9bec,0x1794}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7715e5e2,0x3c6fa8e6,0x872b9078,0x17949bec}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x3c6fa8e67715e5e2,0x17949bec872b9078}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf2f1,0x3b8a,0xd473,0x1e37,0xc83c,0x4395,0x4df6,0xbca}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3b8af2f1,0x1e37d473,0x4395c83c,0xbca4df6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1e37d4733b8af2f1,0xbca4df64395c83c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x307a,0x74c8,0x8082,0xb034,0x4e8a,0xc43a,0x399a,0x9ab}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x74c8307a,0xb0348082,0xc43a4e8a,0x9ab399a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -2, ._mp_d = (mp_limb_t[]) {0xb034808274c8307a,0x9ab399ac43a4e8a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x954f,0x6bc9,0xca46,0x3d25,0x431b,0x46ed,0x8229,0x4f5,0xe453,0x6eb3,0x4530,0xeb3e,0x5306,0xb3e4,0x306e,0x45}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6bc9954f,0x3d25ca46,0x46ed431b,0x4f58229,0x6eb3e453,0xeb3e4530,0xb3e45306,0x45306e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3d25ca466bc9954f,0x4f5822946ed431b,0xeb3e45306eb3e453,0x45306eb3e45306}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf2f1,0x3b8a,0xd473,0x1e37,0xc83c,0x4395,0x4df6,0xbca}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3b8af2f1,0x1e37d473,0x4395c83c,0xbca4df6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1e37d4733b8af2f1,0xbca4df64395c83c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe7f,0xca3a,0x2454,0xbd31,0xe562,0xcb4c,0x72f0,0x21}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xca3a0e7f,0xbd312454,0xcb4ce562,0x2172f0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xbd312454ca3a0e7f,0x2172f0cb4ce562}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe5e2,0x7715,0xa8e6,0x3c6f,0x9078,0x872b,0x9bec,0x1794}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7715e5e2,0x3c6fa8e6,0x872b9078,0x17949bec}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x3c6fa8e67715e5e2,0x17949bec872b9078}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x307a,0x74c8,0x8082,0xb034,0x4e8a,0xc43a,0x399a,0x9ab}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x74c8307a,0xb0348082,0xc43a4e8a,0x9ab399a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -2, ._mp_d = (mp_limb_t[]) {0xb034808274c8307a,0x9ab399ac43a4e8a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 37}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xafa2,0x6dee,0xc511,0xde33,0xc8ce,0xc89e,0x4f97,0x2df9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6deeafa2,0xde33c511,0xc89ec8ce,0x2df94f97}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xde33c5116deeafa2,0x2df94f97c89ec8ce}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xafa2,0x6dee,0xc511,0xde33,0xc8ce,0xc89e,0x4f97,0x2df9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6deeafa2,0xde33c511,0xc89ec8ce,0x2df94f97}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xde33c5116deeafa2,0x2df94f97c89ec8ce}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x57d1,0xb6f7,0xe288,0x6f19,0x6467,0xe44f,0xa7cb,0x16fc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb6f757d1,0x6f19e288,0xe44f6467,0x16fca7cb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x6f19e288b6f757d1,0x16fca7cbe44f6467}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdd36,0xda6b,0xa943,0xd17a,0xe307,0x564c,0x4b0c,0x44d4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xda6bdd36,0xd17aa943,0x564ce307,0x44d44b0c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xd17aa943da6bdd36,0x44d44b0c564ce307}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0x3a03,0xc406,0x47c,0xa0a2,0x6dbc,0x1df4,0x796,0x6cee,0xce0c,0xe0c7,0xc7c,0xc7ce,0x7ce0,0xce0c,0xe0c7,0x7c}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xc4063a03,0xa0a2047c,0x1df46dbc,0x6cee0796,0xe0c7ce0c,0xc7ce0c7c,0xce0c7ce0,0x7ce0c7}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xa0a2047cc4063a03,0x6cee07961df46dbc,0xc7ce0c7ce0c7ce0c,0x7ce0c7ce0c7ce0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x57d1,0xb6f7,0xe288,0x6f19,0x6467,0xe44f,0xa7cb,0x16fc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb6f757d1,0x6f19e288,0xe44f6467,0x16fca7cb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x6f19e288b6f757d1,0x16fca7cbe44f6467}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x188f,0xa1e2,0x2148,0xd9f8,0x2e79,0x1a07,0xe1b2,0xd6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xa1e2188f,0xd9f82148,0x1a072e79,0xd6e1b2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -2, ._mp_d = (mp_limb_t[]) {0xd9f82148a1e2188f,0xd6e1b21a072e79}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xafa2,0x6dee,0xc511,0xde33,0xc8ce,0xc89e,0x4f97,0x2df9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6deeafa2,0xde33c511,0xc89ec8ce,0x2df94f97}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xde33c5116deeafa2,0x2df94f97c89ec8ce}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdd36,0xda6b,0xa943,0xd17a,0xe307,0x564c,0x4b0c,0x44d4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xda6bdd36,0xd17aa943,0x564ce307,0x44d44b0c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xd17aa943da6bdd36,0x44d44b0c564ce307}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 41}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x96a4,0x25b,0x14f2,0x3800,0x4e7c,0x7958,0xab7f,0x7bbe,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x25b96a4,0x380014f2,0x79584e7c,0x7bbeab7f,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x380014f2025b96a4,0x7bbeab7f79584e7c,0x1}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x96a4,0x25b,0x14f2,0x3800,0x4e7c,0x7958,0xab7f,0x7bbe,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x25b96a4,0x380014f2,0x79584e7c,0x7bbeab7f,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x380014f2025b96a4,0x7bbeab7f79584e7c,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xcb52,0x12d,0xa79,0x1c00,0x273e,0xbcac,0x55bf,0xbddf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x12dcb52,0x1c000a79,0xbcac273e,0xbddf55bf}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1c000a79012dcb52,0xbddf55bfbcac273e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -9, ._mp_d = (mp_limb_t[]) {0x73e3,0x3339,0x19e7,0x4ba1,0x6ebc,0x2702,0xee62,0xdbd0,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -5, ._mp_d = (mp_limb_t[]) {0x333973e3,0x4ba119e7,0x27026ebc,0xdbd0ee62,0x7}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0x4ba119e7333973e3,0xdbd0ee6227026ebc,0x7}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xca33,0x3dd0,0x1d92,0x9f0,0x2f81,0xafe9,0xe395,0x83f7,0xfffc,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x27f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3dd0ca33,0x9f01d92,0xafe92f81,0x83f7e395,0xfffffffc,0xffffffff,0xffffffff,0x27fffff}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x9f01d923dd0ca33,0x83f7e395afe92f81,0xfffffffffffffffc,0x27fffffffffffff}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xcb52,0x12d,0xa79,0x1c00,0x273e,0xbcac,0x55bf,0xbddf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x12dcb52,0x1c000a79,0xbcac273e,0xbddf55bf}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1c000a79012dcb52,0xbddf55bfbcac273e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x35}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x35}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x35}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xeb73,0xf93c,0x71c0,0x87f5,0x667a,0xcb3c,0xb9cb,0x12fa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xf93ceb73,0x87f571c0,0xcb3c667a,0x12fab9cb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x87f571c0f93ceb73,0x12fab9cbcb3c667a}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x96a4,0x25b,0x14f2,0x3800,0x4e7c,0x7958,0xab7f,0x7bbe,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x25b96a4,0x380014f2,0x79584e7c,0x7bbeab7f,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x380014f2025b96a4,0x7bbeab7f79584e7c,0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -9, ._mp_d = (mp_limb_t[]) {0x73e3,0x3339,0x19e7,0x4ba1,0x6ebc,0x2702,0xee62,0xdbd0,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -5, ._mp_d = (mp_limb_t[]) {0x333973e3,0x4ba119e7,0x27026ebc,0xdbd0ee62,0x7}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0x4ba119e7333973e3,0xdbd0ee6227026ebc,0x7}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x35}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x35}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x35}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 53}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x7ffa,0x55af,0x7b9e,0xe2b9,0xa7af,0x578c,0xf76b,0xc227,0xf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x55af7ffa,0xe2b97b9e,0x578ca7af,0xc227f76b,0xf}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xe2b97b9e55af7ffa,0xc227f76b578ca7af,0xf}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x7ffa,0x55af,0x7b9e,0xe2b9,0xa7af,0x578c,0xf76b,0xc227,0xf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x55af7ffa,0xe2b97b9e,0x578ca7af,0xc227f76b,0xf}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xe2b97b9e55af7ffa,0xc227f76b578ca7af,0xf}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xbffd,0x2ad7,0xbdcf,0xf15c,0x53d7,0xabc6,0xfbb5,0xe113,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x2ad7bffd,0xf15cbdcf,0xabc653d7,0xe113fbb5,0x7}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xf15cbdcf2ad7bffd,0xe113fbb5abc653d7,0x7}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -9, ._mp_d = (mp_limb_t[]) {0xd16,0xf02b,0x1ce7,0xa2ef,0x54b,0x2c56,0x5963,0x667,0x6f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -5, ._mp_d = (mp_limb_t[]) {0xf02b0d16,0xa2ef1ce7,0x2c56054b,0x6675963,0x6f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0xa2ef1ce7f02b0d16,0x66759632c56054b,0x6f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf0ab,0x9d3b,0x6ea,0x84ac,0x62e5,0xdde9,0x882b,0xd021,0xffe2,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x13ff}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9d3bf0ab,0x84ac06ea,0xdde962e5,0xd021882b,0xffffffe2,0xffffffff,0xffffffff,0x13ffffff}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x84ac06ea9d3bf0ab,0xd021882bdde962e5,0xffffffffffffffe2,0x13ffffffffffffff}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xbffd,0x2ad7,0xbdcf,0xf15c,0x53d7,0xabc6,0xfbb5,0xe113,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x2ad7bffd,0xf15cbdcf,0xabc653d7,0xe113fbb5,0x7}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xf15cbdcf2ad7bffd,0xe113fbb5abc653d7,0x7}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x308}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x308}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x308}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1f37,0x5c4a,0x13f1,0x770,0x7183,0x5600,0xda31,0x9281}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x5c4a1f37,0x77013f1,0x56007183,0x9281da31}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x77013f15c4a1f37,0x9281da3156007183}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x7ffa,0x55af,0x7b9e,0xe2b9,0xa7af,0x578c,0xf76b,0xc227,0xf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x55af7ffa,0xe2b97b9e,0x578ca7af,0xc227f76b,0xf}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xe2b97b9e55af7ffa,0xc227f76b578ca7af,0xf}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -9, ._mp_d = (mp_limb_t[]) {0xd16,0xf02b,0x1ce7,0xa2ef,0x54b,0x2c56,0x5963,0x667,0x6f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -5, ._mp_d = (mp_limb_t[]) {0xf02b0d16,0xa2ef1ce7,0x2c56054b,0x6675963,0x6f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0xa2ef1ce7f02b0d16,0x66759632c56054b,0x6f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x308}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x308}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x308}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 97}}; +const quat_left_ideal_t CONNECTING_IDEALS[7] = {{{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x6000}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2,0x0,0x0,0x60000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x2,0x6000000000000000}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x1000}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1,0x0,0x0,0x10000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1,0x1000000000000000}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x6000}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2,0x0,0x0,0x60000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x2,0x6000000000000000}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x5000}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1,0x0,0x0,0x50000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1,0x5000000000000000}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x3000}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1,0x0,0x0,0x30000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1,0x3000000000000000}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf5fe,0x8673,0x157b,0x7f90,0xd2c5,0xd00b,0xa646,0x78f4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8673f5fe,0x7f90157b,0xd00bd2c5,0x78f4a646}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x7f90157b8673f5fe,0x78f4a646d00bd2c5}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xfee5,0x2b,0xd6d8,0xe65c,0x68a3,0xe72d,0x373d,0x5b1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2bfee5,0xe65cd6d8,0xe72d68a3,0x5b1373d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xe65cd6d8002bfee5,0x5b1373de72d68a3}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf5fe,0x8673,0x157b,0x7f90,0xd2c5,0xd00b,0xa646,0x78f4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8673f5fe,0x7f90157b,0xd00bd2c5,0x78f4a646}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x7f90157b8673f5fe,0x78f4a646d00bd2c5}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf719,0x8647,0x3ea3,0x9933,0x6a21,0xe8de,0x6f08,0x7343}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8647f719,0x99333ea3,0xe8de6a21,0x73436f08}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x99333ea38647f719,0x73436f08e8de6a21}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xfaff,0xc339,0xabd,0xbfc8,0xe962,0x6805,0x5323,0x3c7a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc339faff,0xbfc80abd,0x6805e962,0x3c7a5323}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xbfc80abdc339faff,0x3c7a53236805e962}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe5e2,0x7715,0xa8e6,0x3c6f,0x9078,0x872b,0x9bec,0x1794}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7715e5e2,0x3c6fa8e6,0x872b9078,0x17949bec}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x3c6fa8e67715e5e2,0x17949bec872b9078}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8597,0x3af7,0xa5a,0xbb29,0x77c0,0xd2d9,0xf561,0x84f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3af78597,0xbb290a5a,0xd2d977c0,0x84ff561}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xbb290a5a3af78597,0x84ff561d2d977c0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe5e2,0x7715,0xa8e6,0x3c6f,0x9078,0x872b,0x9bec,0x1794}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7715e5e2,0x3c6fa8e6,0x872b9078,0x17949bec}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x3c6fa8e67715e5e2,0x17949bec872b9078}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x604b,0x3c1e,0x9e8c,0x8146,0x18b7,0xb452,0xa68a,0xf44}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3c1e604b,0x81469e8c,0xb45218b7,0xf44a68a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x81469e8c3c1e604b,0xf44a68ab45218b7}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf2f1,0x3b8a,0xd473,0x1e37,0xc83c,0x4395,0x4df6,0xbca}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3b8af2f1,0x1e37d473,0x4395c83c,0xbca4df6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1e37d4733b8af2f1,0xbca4df64395c83c}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xafa2,0x6dee,0xc511,0xde33,0xc8ce,0xc89e,0x4f97,0x2df9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6deeafa2,0xde33c511,0xc89ec8ce,0x2df94f97}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xde33c5116deeafa2,0x2df94f97c89ec8ce}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x519b,0xa90b,0xcdca,0xd5f5,0x757a,0x83dd,0xb354,0xe59}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa90b519b,0xd5f5cdca,0x83dd757a,0xe59b354}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xd5f5cdcaa90b519b,0xe59b35483dd757a}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xafa2,0x6dee,0xc511,0xde33,0xc8ce,0xc89e,0x4f97,0x2df9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6deeafa2,0xde33c511,0xc89ec8ce,0x2df94f97}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xde33c5116deeafa2,0x2df94f97c89ec8ce}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x5e07,0xc4e3,0xf746,0x83d,0x5354,0x44c1,0x9c43,0x1f9f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc4e35e07,0x83df746,0x44c15354,0x1f9f9c43}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x83df746c4e35e07,0x1f9f9c4344c15354}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x57d1,0xb6f7,0xe288,0x6f19,0x6467,0xe44f,0xa7cb,0x16fc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb6f757d1,0x6f19e288,0xe44f6467,0x16fca7cb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x6f19e288b6f757d1,0x16fca7cbe44f6467}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x19f2,0x5594,0xee77,0x52a2,0xf459,0x45c9,0x2187,0xb348}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x559419f2,0x52a2ee77,0x45c9f459,0xb3482187}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x52a2ee77559419f2,0xb348218745c9f459}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdbd3,0x967a,0x8a96,0x1df4,0x7845,0xd70,0x419a,0x222}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x967adbd3,0x1df48a96,0xd707845,0x222419a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1df48a96967adbd3,0x222419a0d707845}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x19f2,0x5594,0xee77,0x52a2,0xf459,0x45c9,0x2187,0xb348}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x559419f2,0x52a2ee77,0x45c9f459,0xb3482187}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x52a2ee77559419f2,0xb348218745c9f459}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3e1f,0xbf19,0x63e0,0x34ae,0x7c14,0x3859,0xdfed,0xb125}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xbf193e1f,0x34ae63e0,0x38597c14,0xb125dfed}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x34ae63e0bf193e1f,0xb125dfed38597c14}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xcf9,0xaaca,0x773b,0xa951,0xfa2c,0xa2e4,0x10c3,0x59a4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xaaca0cf9,0xa951773b,0xa2e4fa2c,0x59a410c3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xa951773baaca0cf9,0x59a410c3a2e4fa2c}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xaa3a,0x67cf,0x6ad7,0xd031,0x701,0xebca,0xd852,0x2996}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x67cfaa3a,0xd0316ad7,0xebca0701,0x2996d852}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xd0316ad767cfaa3a,0x2996d852ebca0701}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x275,0xd7ab,0xedeb,0xbc67,0xad41,0xaeb5,0xf2e5,0x148e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd7ab0275,0xbc67edeb,0xaeb5ad41,0x148ef2e5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xbc67edebd7ab0275,0x148ef2e5aeb5ad41}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xaa3a,0x67cf,0x6ad7,0xd031,0x701,0xebca,0xd852,0x2996}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x67cfaa3a,0xd0316ad7,0xebca0701,0x2996d852}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xd0316ad767cfaa3a,0x2996d852ebca0701}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa7c5,0x9024,0x7ceb,0x13c9,0x59c0,0x3d14,0xe56d,0x1507}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x9024a7c5,0x13c97ceb,0x3d1459c0,0x1507e56d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x13c97ceb9024a7c5,0x1507e56d3d1459c0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd51d,0xb3e7,0xb56b,0xe818,0x380,0x75e5,0x6c29,0x14cb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb3e7d51d,0xe818b56b,0x75e50380,0x14cb6c29}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xe818b56bb3e7d51d,0x14cb6c2975e50380}}} +#endif +, &MAXORD_O0}}; +const quat_alg_elem_t CONJUGATING_ELEMENTS[7] = {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x1000}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1,0x0,0x0,0x10000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1,0x1000000000000000}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x1000}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x1,0x0,0x0,0x10000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -2, ._mp_d = (mp_limb_t[]) {0x1,0x1000000000000000}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf94f,0x85ef,0x90f3,0xcc79,0x98d9,0x1a83,0x8d,0x67e1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x85eff94f,0xcc7990f3,0x1a8398d9,0x67e1008d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xcc7990f385eff94f,0x67e1008d1a8398d9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xf94f,0x85ef,0x90f3,0xcc79,0x98d9,0x1a83,0x8d,0x67e1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x85eff94f,0xcc7990f3,0x1a8398d9,0x67e1008d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -2, ._mp_d = (mp_limb_t[]) {0xcc7990f385eff94f,0x67e1008d1a8398d9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf2f1,0x3b8a,0xd473,0x1e37,0xc83c,0x4395,0x4df6,0xbca}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3b8af2f1,0x1e37d473,0x4395c83c,0xbca4df6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1e37d4733b8af2f1,0xbca4df64395c83c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xf2f1,0x3b8a,0xd473,0x1e37,0xc83c,0x4395,0x4df6,0xbca}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x3b8af2f1,0x1e37d473,0x4395c83c,0xbca4df6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -2, ._mp_d = (mp_limb_t[]) {0x1e37d4733b8af2f1,0xbca4df64395c83c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x57d1,0xb6f7,0xe288,0x6f19,0x6467,0xe44f,0xa7cb,0x16fc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb6f757d1,0x6f19e288,0xe44f6467,0x16fca7cb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x6f19e288b6f757d1,0x16fca7cbe44f6467}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x57d1,0xb6f7,0xe288,0x6f19,0x6467,0xe44f,0xa7cb,0x16fc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xb6f757d1,0x6f19e288,0xe44f6467,0x16fca7cb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -2, ._mp_d = (mp_limb_t[]) {0x6f19e288b6f757d1,0x16fca7cbe44f6467}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6511,0x45fa,0xa368,0xe869,0x4db2,0x88fc,0x6989,0xbdf3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x45fa6511,0xe869a368,0x88fc4db2,0xbdf36989}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xe869a36845fa6511,0xbdf3698988fc4db2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x6511,0x45fa,0xa368,0xe869,0x4db2,0x88fc,0x6989,0xbdf3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x45fa6511,0xe869a368,0x88fc4db2,0xbdf36989}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -2, ._mp_d = (mp_limb_t[]) {0xe869a36845fa6511,0xbdf3698988fc4db2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x5}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1e6b,0x5c4a,0x13f1,0x770,0x7183,0x5600,0xda31,0x9281}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x5c4a1e6b,0x77013f1,0x56007183,0x9281da31}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x77013f15c4a1e6b,0x9281da3156007183}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x1e6b,0x5c4a,0x13f1,0x770,0x7183,0x5600,0xda31,0x9281}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x5c4a1e6b,0x77013f1,0x56007183,0x9281da31}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -2, ._mp_d = (mp_limb_t[]) {0x77013f15c4a1e6b,0x9281da3156007183}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x4}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4}}} +#endif +}}}; diff --git a/src/precomp/ref/lvl1/sqisign_parameters.txt b/src/precomp/ref/lvl1/sqisign_parameters.txt index d56d70c..8a1a26a 100644 --- a/src/precomp/ref/lvl1/sqisign_parameters.txt +++ b/src/precomp/ref/lvl1/sqisign_parameters.txt @@ -1,3 +1,3 @@ lvl = 1 -p = 0x34e29e286b95d98c33a6a86587407437252c9e49355147ffffffffffffffffff -B = 2000 +p = 0x4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +num_orders = 7 diff --git a/src/precomp/ref/lvl1/torsion_constants.c b/src/precomp/ref/lvl1/torsion_constants.c index d670025..d7a42bc 100644 --- a/src/precomp/ref/lvl1/torsion_constants.c +++ b/src/precomp/ref/lvl1/torsion_constants.c @@ -1,68 +1,43 @@ #include #include #include +const ibz_t TWO_TO_SECURITY_BITS = #if 0 -#elif 8*DIGIT_LEN == 16 -const uint64_t TORSION_PLUS_EVEN_POWER = 0x4b; -const uint64_t TORSION_ODD_PRIMES[28] = {0x3, 0x17, 0x3b, 0x65, 0x6d, 0xc5, 0x1eb, 0x2e7, 0x779, 0x7, 0xb, 0xd, 0x25, 0x59, 0x61, 0x6b, 0x83, 0x89, 0xdf, 0xef, 0x17f, 0x185, 0x1f3, 0x25f, 0x409, 0x419, 0x4a9, 0x7b5}; -const uint64_t TORSION_ODD_POWERS[28] = {0x24, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const uint64_t TORSION_PLUS_ODD_PRIMES[9] = {0x3, 0x17, 0x3b, 0x65, 0x6d, 0xc5, 0x1eb, 0x2e7, 0x779}; -const size_t TORSION_PLUS_ODD_POWERS[9] = {0x24, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2}; -const uint64_t TORSION_MINUS_ODD_PRIMES[19] = {0x7, 0xb, 0xd, 0x25, 0x59, 0x61, 0x6b, 0x83, 0x89, 0xdf, 0xef, 0x17f, 0x185, 0x1f3, 0x25f, 0x409, 0x419, 0x4a9, 0x7b5}; -const size_t TORSION_MINUS_ODD_POWERS[19] = {0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const size_t DEGREE_COMMITMENT_POWERS[28] = {0x0, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const ibz_t CHARACTERISTIC = {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0x47ff,0x3551,0x9e49,0x252c,0x7437,0x8740,0xa865,0x33a6,0xd98c,0x6b95,0x9e28,0x34e2}}}; -const ibz_t TORSION_ODD = {{._mp_alloc = 0, ._mp_size = 21, ._mp_d = (mp_limb_t[]) {0x9c39,0x8bdf,0x3ada,0xa0cb,0xe195,0xb62c,0xca65,0x18ad,0x4ef2,0xb1c7,0x963f,0xa5f5,0xff2c,0xda91,0x2ce5,0xa54d,0x85bb,0x29e4,0xd6c0,0xfadc,0x17e}}}; -const ibz_t TORSION_ODD_PRIMEPOWERS[28] = {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc6d1,0x8b91,0x3e46,0x215}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x211}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd99}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x27d9}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2e69}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9799}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xadb9,0x3}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x6c71,0x8}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xd731,0x37}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x961}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xb}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x25}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x59}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x61}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x6b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x83}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x89}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xdf}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xef}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x17f}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x185}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1f3}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x25f}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x409}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x419}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4a9}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x7b5}}}}; -const ibz_t TORSION_ODD_PLUS = {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xaa29,0xc926,0xa593,0x86e4,0xe80e,0xcb0,0x74d5,0x3186,0x72bb,0xc50d,0x9c53,0x6}}}; -const ibz_t TORSION_ODD_MINUS = {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xc391,0x81fc,0x4307,0xb45c,0x8cc7,0xa562,0x2134,0x3fea,0xef0a,0x39}}}; -const ibz_t TORSION_PLUS_2POWER = {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x800}}}; -const ibz_t TORSION_PLUS_3POWER = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc6d1,0x8b91,0x3e46,0x215}}}; -const ibz_t TORSION_PLUS_23POWER = {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x8800,0x8e36,0x345c,0xa9f2,0x10}}}; -const ibz_t DEGREE_COMMITMENT = {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x28e9,0xc551,0x1238,0xa0b3,0x76c,0x9d7d,0x4579,0xb59d,0xef3,0xb18b,0x664a,0xb2f1,0x383c,0x81df,0xa08,0x85e4,0xb7dc}}}; -const ibz_t DEGREE_COMMITMENT_PLUS = {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb3d9,0x59c1,0x9f3b,0x2e,0xecaa,0x686f,0x744b,0x32c}}}; -const ibz_t DEGREE_COMMITMENT_MINUS = {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xc391,0x81fc,0x4307,0xb45c,0x8cc7,0xa562,0x2134,0x3fea,0xef0a,0x39}}}; -const ibz_t DEGREE_CHALLENGE = {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x8800,0x8e36,0x345c,0xa9f2,0x10}}}; -#elif 8*DIGIT_LEN == 32 -const uint64_t TORSION_PLUS_EVEN_POWER = 0x4b; -const uint64_t TORSION_ODD_PRIMES[28] = {0x3, 0x17, 0x3b, 0x65, 0x6d, 0xc5, 0x1eb, 0x2e7, 0x779, 0x7, 0xb, 0xd, 0x25, 0x59, 0x61, 0x6b, 0x83, 0x89, 0xdf, 0xef, 0x17f, 0x185, 0x1f3, 0x25f, 0x409, 0x419, 0x4a9, 0x7b5}; -const uint64_t TORSION_ODD_POWERS[28] = {0x24, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const uint64_t TORSION_PLUS_ODD_PRIMES[9] = {0x3, 0x17, 0x3b, 0x65, 0x6d, 0xc5, 0x1eb, 0x2e7, 0x779}; -const size_t TORSION_PLUS_ODD_POWERS[9] = {0x24, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2}; -const uint64_t TORSION_MINUS_ODD_PRIMES[19] = {0x7, 0xb, 0xd, 0x25, 0x59, 0x61, 0x6b, 0x83, 0x89, 0xdf, 0xef, 0x17f, 0x185, 0x1f3, 0x25f, 0x409, 0x419, 0x4a9, 0x7b5}; -const size_t TORSION_MINUS_ODD_POWERS[19] = {0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const size_t DEGREE_COMMITMENT_POWERS[28] = {0x0, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const ibz_t CHARACTERISTIC = {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0x355147ff,0x252c9e49,0x87407437,0x33a6a865,0x6b95d98c,0x34e29e28}}}; -const ibz_t TORSION_ODD = {{._mp_alloc = 0, ._mp_size = 11, ._mp_d = (mp_limb_t[]) {0x8bdf9c39,0xa0cb3ada,0xb62ce195,0x18adca65,0xb1c74ef2,0xa5f5963f,0xda91ff2c,0xa54d2ce5,0x29e485bb,0xfadcd6c0,0x17e}}}; -const ibz_t TORSION_ODD_PRIMEPOWERS[28] = {{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x8b91c6d1,0x2153e46}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x211}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd99}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x27d9}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2e69}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9799}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3adb9}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x86c71}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x37d731}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x961}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xb}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x25}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x59}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x61}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x6b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x83}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x89}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xdf}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xef}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x17f}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x185}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1f3}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x25f}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x409}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x419}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4a9}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x7b5}}}}; -const ibz_t TORSION_ODD_PLUS = {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xc926aa29,0x86e4a593,0xcb0e80e,0x318674d5,0xc50d72bb,0x69c53}}}; -const ibz_t TORSION_ODD_MINUS = {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x81fcc391,0xb45c4307,0xa5628cc7,0x3fea2134,0x39ef0a}}}; -const ibz_t TORSION_PLUS_2POWER = {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x800}}}; -const ibz_t TORSION_PLUS_3POWER = {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x8b91c6d1,0x2153e46}}}; -const ibz_t TORSION_PLUS_23POWER = {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x8e368800,0xa9f2345c,0x10}}}; -const ibz_t DEGREE_COMMITMENT = {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xc55128e9,0xa0b31238,0x9d7d076c,0xb59d4579,0xb18b0ef3,0xb2f1664a,0x81df383c,0x85e40a08,0xb7dc}}}; -const ibz_t DEGREE_COMMITMENT_PLUS = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x59c1b3d9,0x2e9f3b,0x686fecaa,0x32c744b}}}; -const ibz_t DEGREE_COMMITMENT_MINUS = {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x81fcc391,0xb45c4307,0xa5628cc7,0x3fea2134,0x39ef0a}}}; -const ibz_t DEGREE_CHALLENGE = {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x8e368800,0xa9f2345c,0x10}}}; -#elif 8*DIGIT_LEN == 64 -const uint64_t TORSION_PLUS_EVEN_POWER = 0x4b; -const uint64_t TORSION_ODD_PRIMES[28] = {0x3, 0x17, 0x3b, 0x65, 0x6d, 0xc5, 0x1eb, 0x2e7, 0x779, 0x7, 0xb, 0xd, 0x25, 0x59, 0x61, 0x6b, 0x83, 0x89, 0xdf, 0xef, 0x17f, 0x185, 0x1f3, 0x25f, 0x409, 0x419, 0x4a9, 0x7b5}; -const uint64_t TORSION_ODD_POWERS[28] = {0x24, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const uint64_t TORSION_PLUS_ODD_PRIMES[9] = {0x3, 0x17, 0x3b, 0x65, 0x6d, 0xc5, 0x1eb, 0x2e7, 0x779}; -const size_t TORSION_PLUS_ODD_POWERS[9] = {0x24, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2}; -const uint64_t TORSION_MINUS_ODD_PRIMES[19] = {0x7, 0xb, 0xd, 0x25, 0x59, 0x61, 0x6b, 0x83, 0x89, 0xdf, 0xef, 0x17f, 0x185, 0x1f3, 0x25f, 0x409, 0x419, 0x4a9, 0x7b5}; -const size_t TORSION_MINUS_ODD_POWERS[19] = {0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const size_t DEGREE_COMMITMENT_POWERS[28] = {0x0, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const ibz_t CHARACTERISTIC = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0x252c9e49355147ff,0x33a6a86587407437,0x34e29e286b95d98c}}}; -const ibz_t TORSION_ODD = {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xa0cb3ada8bdf9c39,0x18adca65b62ce195,0xa5f5963fb1c74ef2,0xa54d2ce5da91ff2c,0xfadcd6c029e485bb,0x17e}}}; -const ibz_t TORSION_ODD_PRIMEPOWERS[28] = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2153e468b91c6d1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x211}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd99}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x27d9}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2e69}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9799}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3adb9}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x86c71}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x37d731}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x961}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xb}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x25}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x59}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x61}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x6b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x83}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x89}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xdf}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xef}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x17f}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x185}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1f3}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x25f}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x409}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x419}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4a9}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x7b5}}}}; -const ibz_t TORSION_ODD_PLUS = {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x86e4a593c926aa29,0x318674d50cb0e80e,0x69c53c50d72bb}}}; -const ibz_t TORSION_ODD_MINUS = {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xb45c430781fcc391,0x3fea2134a5628cc7,0x39ef0a}}}; -const ibz_t TORSION_PLUS_2POWER = {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x0,0x800}}}; -const ibz_t TORSION_PLUS_3POWER = {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2153e468b91c6d1}}}; -const ibz_t TORSION_PLUS_23POWER = {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x0,0xa9f2345c8e368800,0x10}}}; -const ibz_t DEGREE_COMMITMENT = {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xa0b31238c55128e9,0xb59d45799d7d076c,0xb2f1664ab18b0ef3,0x85e40a0881df383c,0xb7dc}}}; -const ibz_t DEGREE_COMMITMENT_PLUS = {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x2e9f3b59c1b3d9,0x32c744b686fecaa}}}; -const ibz_t DEGREE_COMMITMENT_MINUS = {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xb45c430781fcc391,0x3fea2134a5628cc7,0x39ef0a}}}; -const ibz_t DEGREE_CHALLENGE = {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x0,0xa9f2345c8e368800,0x10}}}; +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x1}}} #endif +; +const ibz_t TORSION_PLUS_2POWER = +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x100}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x100000000000000}}} +#endif +; +const ibz_t SEC_DEGREE = +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 33, ._mp_d = (mp_limb_t[]) {0x4b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x4b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x4b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#endif +; +const ibz_t COM_DEGREE = +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 33, ._mp_d = (mp_limb_t[]) {0x4b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x4b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x4b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#endif +; diff --git a/src/precomp/ref/lvl3/CMakeLists.txt b/src/precomp/ref/lvl3/CMakeLists.txt index b104660..c7637fa 100644 --- a/src/precomp/ref/lvl3/CMakeLists.txt +++ b/src/precomp/ref/lvl3/CMakeLists.txt @@ -1,49 +1 @@ -set(SOURCE_FILES_PRECOMP_${SVARIANT_UPPER}_REF - torsion_constants.c - quaternion_data.c - endomorphism_action.c - klpt_constants.c -) - -add_library(${LIB_PRECOMP_${SVARIANT_UPPER}} ${SOURCE_FILES_PRECOMP_${SVARIANT_UPPER}_REF}) -target_include_directories(${LIB_PRECOMP_${SVARIANT_UPPER}} PRIVATE common ${INC_INTBIG} ${INC_QUATERNION} ${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/src/ec/ref/include ${PROJECT_SOURCE_DIR}/src/ec/ref/${SVARIANT_LOWER}/include ${PROJECT_SOURCE_DIR}/src/gf/ref/${SVARIANT_LOWER}/include ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_COMMON}) -target_compile_options(${LIB_PRECOMP_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_custom_command( - OUTPUT - "${CMAKE_CURRENT_SOURCE_DIR}/torsion_constants.c" - "${CMAKE_CURRENT_SOURCE_DIR}/include/torsion_constants.h" - "${CMAKE_CURRENT_SOURCE_DIR}/include/klpt_constants.h" - "${CMAKE_CURRENT_SOURCE_DIR}/klpt_constants.c" - "${CMAKE_CURRENT_SOURCE_DIR}/include/encoded_sizes.h" - "${PROJECT_SOURCE_DIR}/src/nistapi/lvl3/api.h" - "${CMAKE_CURRENT_SOURCE_DIR}/quaternion_data.c" - "${CMAKE_CURRENT_SOURCE_DIR}/include/quaternion_data.h" - "${CMAKE_CURRENT_SOURCE_DIR}/endomorphism_action.c" - "${CMAKE_CURRENT_SOURCE_DIR}/include/endomorphism_action.h" - COMMAND - echo "Please run manually: make precomp" -) - -find_program(SAGEMATH sage) -add_custom_target(precomp_${SVARIANT_LOWER} - DEPENDS - "./sqisign_parameters.txt" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_torsion_constants.sage" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_klpt_constants.sage" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_sizes.sage" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_quaternion_data.sage" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_endomorphism_action.sage" - WORKING_DIRECTORY - "${CMAKE_CURRENT_SOURCE_DIR}" -) - -set_directory_properties(PROPERTIES CLEAN_NO_CUSTOM true) -set_target_properties(precomp_${SVARIANT_LOWER} PROPERTIES EXCLUDE_FROM_ALL TRUE) - -add_dependencies(precomp precomp_lvl3) +include(../lvlx.cmake) diff --git a/src/precomp/ref/lvl3/e0_basis.c b/src/precomp/ref/lvl3/e0_basis.c new file mode 100644 index 0000000..1b12a83 --- /dev/null +++ b/src/precomp/ref/lvl3/e0_basis.c @@ -0,0 +1,55 @@ +#include +const fp2_t BASIS_E0_PX = { +#if 0 +#elif RADIX == 16 +{0x1196, 0x134b, 0xdbd, 0x118d, 0x712, 0x1646, 0x5d7, 0x8eb, 0x431, 0xf5b, 0x161e, 0x13b6, 0x1c07, 0x42, 0x8ba, 0xeec, 0x1a43, 0x545, 0x1cdb, 0x1659, 0x1614, 0xde, 0x72d, 0x1b80, 0x1706, 0x15a3, 0x894, 0xd4a, 0x1b2f, 0x12} +#elif RADIX == 32 +{0x9a5c65a, 0xa31adbd, 0x7b231c4, 0xc51d65d, 0x1e7ad90, 0x1e76d6, 0x8ba0217, 0xe90ddd8, 0x3cdb2a2, 0xf5852cb, 0x72d06, 0xd1dc1b7, 0xa94894a, 0x14cbd} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x31c4a31adbd9a5c6, 0xe7ad90c51d65d7b2, 0x88ba021701e76d61, 0x2cb3cdb2a2e90ddd, 0xdc1b70072d06f585, 0x16eecbda94894ad1} +#else +{0x94635b7b34b8c, 0x431475975ec8c7, 0x380f3b6b0f3d6c, 0x2e90ddd88ba021, 0x5eb0a59679b654, 0x347706dc01cb41, 0xb7765ed4a44a5} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0xa85, 0x10cc, 0x1ef, 0xb0b, 0x1082, 0x5be, 0xd14, 0x1100, 0x1a33, 0x174b, 0x181c, 0x83e, 0x1034, 0x18ba, 0x205, 0x1f39, 0x1e9, 0x1998, 0x130e, 0x801, 0xfeb, 0x698, 0xdf9, 0x6a5, 0x5b6, 0x2c8, 0x1283, 0xad9, 0x960, 0x1e} +#elif RADIX == 32 +{0x8662a17, 0x96161ef, 0x42df420, 0xce200d1, 0x1cba5e8, 0xd107d8, 0x205c5d4, 0x7a7e72, 0x330eccc, 0xc3fad00, 0x4adf934, 0x6416d8d, 0x5b32831, 0x2f581} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xf42096161ef8662a, 0xcba5e8ce200d142d, 0x2205c5d40d107d81, 0xd00330eccc07a7e7, 0x16d8d4adf934c3fa, 0x6065815b3283164} +#else +{0x412c2c3df0cc54, 0x2338803450b7d0, 0x206883ec0e5d2f, 0x407a7e72205c5d, 0x187f5a00661d99, 0x5905b6352b7e4d, 0x3032c0ad99418} +#endif +#endif +}; +const fp2_t BASIS_E0_QX = { +#if 0 +#elif RADIX == 16 +{0x16ed, 0x818, 0x127a, 0xcfb, 0x1be6, 0x1b40, 0x1bf1, 0xe75, 0x129c, 0x151, 0x425, 0x142e, 0x1edb, 0x254, 0x5cc, 0x1a5b, 0x1e1d, 0x1e27, 0x1a12, 0x8a8, 0x59e, 0x933, 0x1647, 0x686, 0x19e, 0x1e51, 0x151f, 0x1b6e, 0x1efe, 0xd} +#elif RADIX == 32 +{0x40c5bb5, 0x99f727a, 0x1da06f9, 0x71cebbf, 0x250a8ca, 0xb6e85c4, 0x5cc12a7, 0xf8774b6, 0x1a12f13, 0x9967915, 0xd64749, 0x288678d, 0x6dd51ff, 0x2ebfb} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x6f999f727a40c5b, 0x50a8ca71cebbf1da, 0x65cc12a7b6e85c42, 0x9151a12f13f8774b, 0x8678d0d647499967, 0x2e23bfb6dd51ff28} +#else +{0x7333ee4f4818b7, 0x29c73aefc7681b, 0x3db742e2128546, 0x3f8774b65cc12a, 0x332cf22a3425e2, 0x4a219e343591d2, 0x6d1dfdb6ea8ff} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x18a9, 0x1838, 0x1588, 0x1720, 0xf3f, 0x1fcd, 0x44d, 0x1e6b, 0x681, 0x1249, 0x1f8a, 0x5af, 0x1f58, 0x1c12, 0xf21, 0x1887, 0x278, 0x156a, 0xbfe, 0x765, 0x12f7, 0x4da, 0x16ce, 0x7c1, 0x1c04, 0x1773, 0x853, 0xab7, 0xe1d, 0x1a} +#elif RADIX == 32 +{0xc1c62a7, 0xee41588, 0xdfe6bcf, 0x7cd644, 0x8a9249a, 0xd60b5ff, 0xf21e097, 0x9e310e, 0xabfeab5, 0xd4bdcec, 0x836ce26, 0xb9f010f, 0x56e853b, 0x10875} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x6bcfee41588c1c62, 0xa9249a07cd644dfe, 0xef21e097d60b5ff8, 0xcecabfeab509e310, 0xf010f836ce26d4bd, 0x2a7787556e853bb9} +#else +{0x1fdc82b11838c5, 0x681f359137f9af, 0x3eb05affc54924, 0x509e310ef21e09, 0x5a97b9d957fd56, 0x6e7c043e0db389, 0x4fbc3aab7429d} +#endif +#endif +}; diff --git a/src/precomp/ref/lvl3/ec_params.c b/src/precomp/ref/lvl3/ec_params.c new file mode 100644 index 0000000..ae214aa --- /dev/null +++ b/src/precomp/ref/lvl3/ec_params.c @@ -0,0 +1,4 @@ +#include +// p+1 divided by the power of 2 +const digit_t p_cofactor_for_2f[1] = {65}; + diff --git a/src/precomp/ref/lvl3/endomorphism_action.c b/src/precomp/ref/lvl3/endomorphism_action.c index 0110474..8aafeac 100644 --- a/src/precomp/ref/lvl3/endomorphism_action.c +++ b/src/precomp/ref/lvl3/endomorphism_action.c @@ -1,56 +1,3812 @@ #include #include #include +const curve_with_endomorphism_ring_t CURVES_WITH_ENDOMORPHISMS[8] = {{{{ #if 0 -#elif 8*DIGIT_LEN == 16 -const ec_basis_t BASIS_EVEN = {{{{0x22e6355134b7d255, 0xa7f7f4f4597d08dc, 0xb8eb0e50d5888eec, 0xed36a84e0c7f72ba, 0xb6ed1c0b46f3f28e, 0x282153a62f4d1b8}, {0xd57efea74410a787, 0xea4460d69d71d250, 0xb3d9ad4193397a46, 0x3124b5b93ff1a081, 0x45a800b0c82d3709, 0x24b0e60e1353c61}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x17df8f9d274de7f, 0x351632cce83ec8aa, 0x56e019deae8daf7e, 0x3da35b5dc1820a3b, 0xbb60de7d759b75b1, 0x2e81949d5d0a4d9}, {0xa4efe85f225c5804, 0x9cbd9fc32e16b4f8, 0xa8be541ed7c20bbc, 0xe057875bd571d902, 0x35f5baf03dab21ff, 0x3493d2784699545}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xb37f8fba3f4420f8, 0x8d48f1acb03706df, 0x5f5d4860530ffdbc, 0x3346cb7307f4e98e, 0xebbd3a151d8187ef, 0x14e3e664b5f52b0}, {0xdab91da8f4656795, 0xdbdcf3c3108cac88, 0x272d467ca27bde21, 0x147ed2cd9dc73cf0, 0x67421707fd5d4d50, 0x1c9f704aa559bda}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_PLUS = {{{{0xdb68fd6ab36028ee, 0xb67ecbd22b247e6d, 0x3ddb4a10bff4a0, 0x31eccf041ed4eabc, 0x6c93b74e3dbd1615, 0xece18a8a69c342}, {0x3ac922e0d53a3b4e, 0xaaa4c42158564daf, 0x1359d8744b831fce, 0x6f1eb5f50a893a70, 0x290b2fffdf9f083e, 0x56212fe48636bb}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xd64d88142398fc70, 0x8cd791e2b175b8ad, 0x8cf816a594e65996, 0xdc15534f4bbc3e, 0x2ebd5f0fca9cb695, 0x2677728640635e3}, {0x8e859814dd48f154, 0x400b48d3d3fb2e17, 0x9e315059bbc401a9, 0x26c24fc85c0a4034, 0x2095f2ade3a1cc0e, 0x789dae43794796}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x55c5c814e95ff9e, 0x624aa7502d08f66d, 0xfaef96a43369b1b5, 0x6bd0164a386601da, 0xc4624eccbcab4884, 0x10154ec03218312}, {0x4fbfbe9e5f4e4beb, 0x1392132cc9a7a298, 0x87bee2902df2694c, 0x2fd70dedc82c836c, 0xb969a66833ea4330, 0xac80d610eac86e}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_MINUS = {{{{0x4668fbf6837118e1, 0xe3f7541cde4ef86b, 0x6222f4709df362fa, 0xfff04e39c27d3eeb, 0x950a899ed78c3ac4, 0x325b141dae45991}, {0xdcd302b823c975d7, 0x52a74513892de655, 0x71698b3599387e45, 0x190b468017eb95b1, 0x8d1e5211978b6ff3, 0x29dc08516c36f88}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x29ebd3656c338c34, 0x2bfcf65c705b22cb, 0xc34d5916fff804ae, 0x936fa5577596f777, 0x88bc262ea82314b1, 0x3cb841bc5ebf63f}, {0x1cd8d5a530a1914c, 0xaa47dc464b7fe567, 0xb2f6cfba20a12302, 0xbdec2a7f8ed5764a, 0x8d8caffb90342f7, 0x2bc600de26023a0}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xef90e01f16ec0b, 0xbe3b230014cdc8ca, 0x11d8068a91007c6a, 0xef60fc7a468eb46, 0x6ebe6eb84394eacc, 0xb27d0c0b9cc97e}, {0xfb44d144ffbc728, 0x35fed8aabb632fb0, 0xbce80df03ad44c4c, 0x94e973d6d612e79a, 0xf90b559988365d91, 0x1d8b3925fcef701}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_PLUS = {{{{0xcf4ab671f3581670, 0xfe5bec2006b84191, 0x9c86c3022ef1c1dc, 0xca2fd261142cadc9, 0x615c338c784391f1, 0x220d6a5b67dc16c}, {0x827228cb3c97f27d, 0x62e6cbb0680bb491, 0x595f79839679df49, 0xb532dbc517c50a6e, 0x307360426131c2a7, 0x36d0c506b0ee9bf}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xa40cf5606210efd5, 0xe2a74bde914816ea, 0x3eaded7bce47ee4e, 0x5c13b2fc6d3f0e6f, 0x7c3d8e9de2169375, 0x1ff7fd7dbf97c03}, {0xc35492b3b8cb43e2, 0x3101d6730b5f0690, 0x18bb5b95ff4732ad, 0xc910043b50554bb7, 0xe157f6abd14ab159, 0x136ee8f2b5d364c}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x52706bfd8763b0c3, 0xa42c185c8aff91f3, 0x787da4c24686d040, 0xb481c545c5d853a3, 0xeff30a78ada95338, 0x42de7d5615621e}, {0x9c57da37895bac33, 0x151877b2e03774e0, 0x932f17a8d669aae8, 0xce9262ee9efce8c9, 0x31226e5e998455ab, 0x208b93fdae6a791}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_MINUS = {{{{0x4668fbf6837118e1, 0xe3f7541cde4ef86b, 0x6222f4709df362fa, 0xfff04e39c27d3eeb, 0x950a899ed78c3ac4, 0x325b141dae45991}, {0xdcd302b823c975d7, 0x52a74513892de655, 0x71698b3599387e45, 0x190b468017eb95b1, 0x8d1e5211978b6ff3, 0x29dc08516c36f88}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x29ebd3656c338c34, 0x2bfcf65c705b22cb, 0xc34d5916fff804ae, 0x936fa5577596f777, 0x88bc262ea82314b1, 0x3cb841bc5ebf63f}, {0x1cd8d5a530a1914c, 0xaa47dc464b7fe567, 0xb2f6cfba20a12302, 0xbdec2a7f8ed5764a, 0x8d8caffb90342f7, 0x2bc600de26023a0}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xef90e01f16ec0b, 0xbe3b230014cdc8ca, 0x11d8068a91007c6a, 0xef60fc7a468eb46, 0x6ebe6eb84394eacc, 0xb27d0c0b9cc97e}, {0xfb44d144ffbc728, 0x35fed8aabb632fb0, 0xbce80df03ad44c4c, 0x94e973d6d612e79a, 0xf90b559988365d91, 0x1d8b3925fcef701}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_CHALLENGE = {{{{0xbeb1828b6321b73b, 0x9b4ae33a51041b28, 0xb8eb52edec901458, 0x489f36189fbe40e2, 0x23b52fca75d8097a, 0x1fa77728850feb5}, {0x3c3181fa7491fa00, 0x90610c1cf4b08f0d, 0xc9a4e86e25007aa9, 0x5b71c5a9406460c7, 0xcc87c9e89706249a, 0x35c54d562e37057}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x4660c57fe78f45e1, 0x52046157833495f6, 0x3a046cb27e641924, 0x3d296d4fc4f86278, 0x53eab7beef1edc6b, 0x180b61ad44039e5}, {0x70a4e03a435a0a94, 0xf4446a3f06c86e3b, 0x83264cf9fe7b13b9, 0xded3fc0f6172e26, 0xc0ad14de5a337e74, 0x27cb876a7e80950}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xa6cb0f8ced1d3798, 0x7d2277dc624ef354, 0xed0fc61f3fcf514, 0x80d1db25eb940c0d, 0x5e0af0166b2e4f8f, 0x3a9eaad39577c49}, {0xe3b7bc63514ee9b3, 0x541be4cbdbf35256, 0x4ce81454a8ce471e, 0x97b4f5aca2ab4e14, 0x5e3ef1b3acf3da56, 0x1be60bf81366891}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_curve_t CURVE_E0 = {{{0x0}}, {{0x1}}}; -const ec_point_t CURVE_E0_A24 = {{{0x0}}, {{0x1}}}; -const ibz_mat_2x2_t ACTION_I = {{{{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0xf9ad,0x5f9b,0x6ce9,0xbb0,0xd99f,0xfa8,0xd044,0x233e,0x87e8,0xca4e,0x4a37,0x56fc,0x9dca,0x9c29,0x5919,0xe176,0x49f2,0x703,0xedb8,0x79d4,0xee35,0xf59f,0x2616,0xd452,0x2b73,0xbe73,0x59c,0x7105,0xc02b,0x9deb,0xf129,0xd05f,0xa69,0x9aaa,0x470c,0xa988,0x270}}}, {{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0x4602,0x9ac2,0xb4ca,0x4dc4,0x4c48,0x81e5,0x7e0a,0x8b5b,0x89b7,0x7e46,0xfa8f,0x54fa,0x905e,0x76fc,0xb466,0xa68,0x6ea2,0xec93,0x1752,0x3208,0xa003,0x320,0xd8bc,0x5fbe,0x3e0a,0x73c0,0xf878,0x363a,0x288e,0xc25e,0xb565,0xdaee,0x880a,0x793b,0x4f3b,0x6e37,0x92}}}}, {{{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0xff8b,0xb5e4,0x8708,0x298b,0x12b1,0xd78a,0x68cb,0xb760,0xb439,0x8235,0x4322,0x2444,0xbb26,0x144c,0xcdf3,0x67ce,0x4c77,0x789a,0xe4a0,0xecfa,0x9e7e,0x8163,0x96c,0x510f,0xa6dc,0xf672,0x8152,0x5b7c,0xa824,0x40c,0x1d30,0xaca1,0xc8de,0xda4b,0x75d1,0x17,0xa58}}}, {{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0x653,0xa064,0x9316,0xf44f,0x2660,0xf057,0x96f1,0x46bd,0x1261,0x8b14,0x468e,0xf557,0x4bed,0x4122,0xb58d,0x5aa5,0x981f,0xe023,0x31d,0xfe62,0x8acd,0xcd7c,0xd36d,0xebeb,0x1ff9,0x9212,0xeb42,0xdfcb,0xe015,0xa9d4,0xd889,0xf67,0xdc26,0xc0dd,0xc1fb,0x9018,0xa92}}}}}; -const ibz_mat_2x2_t ACTION_J = {{{{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0x5359,0xd834,0x93b2,0xd92d,0x9b7d,0x171d,0xe04c,0xdeef,0x7fd0,0xef48,0xc82f,0x8949,0x679b,0x832,0x868f,0x251d,0xdf6f,0x4f09,0xe75,0x1b2c,0xde6b,0x905,0x730,0x96d8,0x3651,0xf6f3,0xc0fb,0x6341,0xed57,0x8dd3,0x2678,0x6f49,0x905d,0xb032,0xb8e5,0xb1a,0x160}}}, {{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0xeab0,0x5959,0x9779,0xc157,0x9e09,0xabc0,0x4987,0xb2b2,0xc465,0x41cb,0x28f3,0xc425,0x800a,0x52b5,0xa793,0x9aa2,0x1b4d,0xba7d,0x78e3,0x1043,0x62b,0x48fe,0x67a5,0x6ac1,0xe1fd,0x7734,0x5d61,0xee4d,0x12cc,0xa978,0xab4c,0x69cb,0x4efc,0x85fa,0xaf33,0xb815,0xc3}}}}, {{{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0xa413,0x8161,0xeff,0x6861,0x5ea,0x270d,0x8480,0xa589,0xeec9,0xcd5e,0xd511,0x3613,0xcbc9,0xbce9,0x774e,0xcd73,0x995a,0x8ed7,0x85cb,0x7b1a,0x65de,0xdeb6,0xb79b,0xc9b2,0xb14f,0xa86d,0x5252,0xd55e,0xc3aa,0xe5c2,0xbcf9,0x5e0f,0xc2d7,0x85ad,0x2b48,0xf16e,0x19b}}}, {{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0xaca7,0x27cb,0x6c4d,0x26d2,0x6482,0xe8e2,0x86e9,0x8b0c,0x1a78,0x661a,0xc896,0xc309,0x821c,0xd519,0x8817,0x16fe,0x2a3,0x981d,0xe260,0x5d0a,0x9a98,0xba16,0xf254,0x2965,0x151c,0x5992,0x2fe3,0xed8f,0xb2e9,0xb9ec,0xa33a,0x707e,0x5632,0xab55,0x5022,0x2e86,0xba3}}}}}; -const ibz_mat_2x2_t ACTION_K = {{{{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0x5e4b,0xf857,0x15d3,0x5f39,0x327d,0xf49d,0x1206,0x32f8,0x32d,0xb830,0x8d08,0x57bb,0xa63d,0xa3fa,0x31ce,0x4bb0,0xd817,0xa181,0x6a23,0x1056,0xb43c,0xa42d,0xbca9,0x8adf,0xc97c,0x67b5,0xa69b,0xd3e0,0xa039,0x82e0,0xeb8,0x5ea5,0xdad8,0x4264,0xd763,0x1170,0x1a1}}}, {{._mp_alloc = 0, ._mp_size = 36, ._mp_d = (mp_limb_t[]) {0xcc3e,0x8cf3,0xfe19,0x1ea2,0x1b31,0x311a,0x85ef,0x82ef,0xdd53,0xda45,0x6b4c,0x49a7,0xfd6a,0x628d,0x85f1,0x960d,0xf0e9,0x5e12,0xcf21,0xa0a0,0x169d,0x1240,0xb63d,0xee8f,0xaf8c,0x12da,0x802c,0x6d14,0x7027,0x4a5b,0xff7f,0xd76f,0x8a9,0x6a95,0xff1c,0xe83d}}}}, {{{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0x8c7c,0xdf9f,0xdbf8,0xc3e2,0x3533,0x3b5d,0x39e9,0x89df,0x3202,0x7b1e,0x8bc5,0x1c24,0xaa1e,0x134d,0x2977,0xee57,0x80b9,0xd74d,0x232a,0x3467,0x152a,0xc9cd,0x2f03,0xd2c5,0xd887,0xcda9,0x65cc,0x3bf9,0xc690,0x88d,0x9016,0xdb95,0xec1a,0x413a,0x8321,0xdd30,0xb06}}}, {{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0xa1b5,0x7a8,0xea2c,0xa0c6,0xcd82,0xb62,0x552f,0x3704,0x971c,0x9d32,0x3bd,0xf498,0x437a,0x3951,0xdcd8,0xf06b,0x9fa,0x45a5,0x86b2,0x67e0,0xc4c7,0x1eee,0x3cdb,0x355e,0x81f1,0xe8cf,0x4a43,0x7cf0,0x7,0xc4e0,0xbafa,0x8122,0xbb7,0x1923,0x31a5,0x2830,0xb62}}}}}; -const ibz_mat_2x2_t ACTION_GEN2 = {{{{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0xf9ad,0x5f9b,0x6ce9,0xbb0,0xd99f,0xfa8,0xd044,0x233e,0x87e8,0xca4e,0x4a37,0x56fc,0x9dca,0x9c29,0x5919,0xe176,0x49f2,0x703,0xedb8,0x79d4,0xee35,0xf59f,0x2616,0xd452,0x2b73,0xbe73,0x59c,0x7105,0xc02b,0x9deb,0xf129,0xd05f,0xa69,0x9aaa,0x470c,0xa988,0x270}}}, {{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0x4602,0x9ac2,0xb4ca,0x4dc4,0x4c48,0x81e5,0x7e0a,0x8b5b,0x89b7,0x7e46,0xfa8f,0x54fa,0x905e,0x76fc,0xb466,0xa68,0x6ea2,0xec93,0x1752,0x3208,0xa003,0x320,0xd8bc,0x5fbe,0x3e0a,0x73c0,0xf878,0x363a,0x288e,0xc25e,0xb565,0xdaee,0x880a,0x793b,0x4f3b,0x6e37,0x92}}}}, {{{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0xff8b,0xb5e4,0x8708,0x298b,0x12b1,0xd78a,0x68cb,0xb760,0xb439,0x8235,0x4322,0x2444,0xbb26,0x144c,0xcdf3,0x67ce,0x4c77,0x789a,0xe4a0,0xecfa,0x9e7e,0x8163,0x96c,0x510f,0xa6dc,0xf672,0x8152,0x5b7c,0xa824,0x40c,0x1d30,0xaca1,0xc8de,0xda4b,0x75d1,0x17,0xa58}}}, {{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0x653,0xa064,0x9316,0xf44f,0x2660,0xf057,0x96f1,0x46bd,0x1261,0x8b14,0x468e,0xf557,0x4bed,0x4122,0xb58d,0x5aa5,0x981f,0xe023,0x31d,0xfe62,0x8acd,0xcd7c,0xd36d,0xebeb,0x1ff9,0x9212,0xeb42,0xdfcb,0xe015,0xa9d4,0xd889,0xf67,0xdc26,0xc0dd,0xc1fb,0x9018,0xa92}}}}}; -const ibz_mat_2x2_t ACTION_GEN3 = {{{{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0x2683,0x1be8,0x4e,0x726f,0x3a8e,0x1363,0x8be3,0x3615,0xd101,0x77c,0xd197,0x164c,0xf78f,0xc0d3,0xf727,0x2157,0x5ba,0x9e9a,0xf681,0x69b,0x22d2,0xe0e1,0x1365,0x95b4,0xd699,0x2f5,0xdbbc,0x128b,0x26e2,0xb9c0,0x70aa,0x8fb8,0x40ab,0x5332,0x47d,0xf722,0x869}}}, {{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0x1859,0xfa0e,0x2621,0x78e,0xf529,0x16d2,0xe3c9,0x9f06,0x270e,0x6009,0x11c1,0x8c90,0x834,0xe4d9,0xadfc,0xd285,0x44f7,0x5388,0xc81b,0x2125,0x5317,0xa60f,0x2030,0xe540,0x9003,0xf57a,0x2aec,0x9244,0x1dad,0x35eb,0x3059,0xa25d,0xeb83,0x7f9a,0x7f37,0x1326,0xab}}}}, {{{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0x51cf,0x1ba3,0x4b04,0xc8f6,0x8c4d,0xff4b,0x2a40,0x6373,0x9ea6,0x527b,0xd47d,0xd355,0x3853,0x5741,0x29f4,0x38af,0x63f2,0xf74c,0x2da0,0x7026,0x3eb0,0x919b,0xdd46,0xed7f,0xd1cc,0x77b2,0xe242,0x40d5,0x608,0x98c8,0x51ee,0xf53c,0xb922,0x5dc0,0x5511,0x9593,0xc7b}}}, {{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0xd97d,0xe417,0xffb1,0x8d90,0xc571,0xec9c,0xdb52,0x33e6,0xc948,0x4de5,0xbf2f,0x3606,0xf229,0x1c77,0x177f,0x1ac4,0xdc58,0x488c,0xfa54,0x719a,0x5631,0xe23b,0xe61e,0x2a89,0x74d4,0x4d8f,0x1523,0x3e45,0x795f,0x8e00,0x5908,0x500f,0xa5e4,0x855,0x48b,0x427f,0x499}}}}}; -const ibz_mat_2x2_t ACTION_GEN4 = {{{{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0xaf26,0xfc2b,0x8ae9,0xaf9c,0x993e,0x7a4e,0x3c9e,0x4e7a,0x4ebb,0x86c9,0x8ee7,0xd207,0x47fa,0xc0a3,0x203a,0xc3e6,0x5d14,0xc454,0xad7c,0xc446,0x169f,0x33a5,0xdb17,0x258e,0x8a75,0x5c1d,0xcbbd,0x9258,0xa03d,0xe550,0x6c35,0x1f36,0x60b4,0xcef6,0xf035,0x2588,0x752}}}, {{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0xe61f,0xc679,0x7f0c,0x8f51,0xd98,0x988d,0xf692,0x7675,0x3bce,0x97d4,0x7e09,0x4afd,0xf391,0x1fec,0xca4c,0xe914,0xe97d,0xa29c,0xdffb,0x8c6b,0x47d0,0xeaae,0xd7e0,0x5766,0xfd7d,0xb1af,0xb885,0x5ef2,0x834,0x490e,0xe499,0xdb9b,0x779c,0x630e,0x8412,0x10ef,0x682}}}}, {{{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0xc63e,0x6fcf,0x6dfc,0xe1f1,0x9a99,0x9dae,0xd08f,0xf9ed,0x6625,0xe840,0xe45,0x343c,0xc9eb,0xf84c,0x9c0e,0x1539,0x3166,0x5f3a,0xa00,0xd64f,0xc716,0x4674,0x9444,0xc981,0x91fa,0xf17,0x2b56,0xc665,0x3368,0xa827,0xace4,0x5dae,0x6955,0xce61,0xc614,0xb68,0xc05}}}, {{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0x50db,0x3d4,0x7516,0x5063,0x66c1,0x85b1,0x2a97,0x1b82,0x4b8e,0xce99,0x1de,0x7a4c,0xa1bd,0x1ca8,0xee6c,0x7835,0x84fd,0x22d2,0x4359,0xb3f0,0x6263,0x8f77,0x1e6d,0x9aaf,0xc0f8,0xf467,0x2521,0xbe78,0x3,0x6270,0x5d7d,0xc091,0x85db,0x8c91,0x18d2,0x1418,0x5b1}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_UNDISTORTED_GEN = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x5618,0x91a5,0xcb1,0xec10,0x5d13,0x966d,0x2570,0xdd22,0xbd4,0xdd08,0x2a09,0x3bbe,0x5f37,0xd115,0x4654,0x9e06,0x981d,0x14b8,0x39e7,0x8f5f,0xea39,0x3bac,0x3ec9,0x14f3}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa05f,0xee14,0xb22,0x39f7,0xd1f8,0x2e3b,0x1510,0xe8a4,0xc434,0xe2b9,0xfc70,0xe01f,0xae2e,0x1049,0xa35,0x1f9f,0x966,0x2daa,0x4084,0x4931,0x6e9e,0x907d,0x9561,0x722}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_DISTORTION_ENDO = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa744,0xe0f6,0x4a03,0xd4bd,0xbe44,0xcb47,0x692f,0x814b,0x8ab1,0x6803,0x716f,0x7a91,0x771c,0x9d47,0x39c2,0x70e8,0x1dc1,0xdb8e,0x7444,0x6673,0xe706,0xc21,0x4594,0x353d}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x387,0xa498,0xa53d,0x37dd,0xd4e,0x78a0,0x4d99,0x48b9,0xbcf4,0xc524,0xbdca,0xc972,0x3bd5,0x51be,0xb971,0x6d73,0x9f69,0x3a0d,0x60c,0x4c09,0x4e4,0xb155,0xcf32,0x565e}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1b5d,0x8a51,0xdd5d,0x1483,0x3d75,0x8cbe,0x9d34,0x964,0x6d97,0x5409,0x3bb1,0x5e4e,0x9384,0x2ead,0x6dee,0x439d,0xcf8b,0x9c90,0xaf44,0x3f6f,0xf968,0x2120,0x1235,0x1663}}}}}; -#elif 8*DIGIT_LEN == 32 -const ec_basis_t BASIS_EVEN = {{{{0x22e6355134b7d255, 0xa7f7f4f4597d08dc, 0xb8eb0e50d5888eec, 0xed36a84e0c7f72ba, 0xb6ed1c0b46f3f28e, 0x282153a62f4d1b8}, {0xd57efea74410a787, 0xea4460d69d71d250, 0xb3d9ad4193397a46, 0x3124b5b93ff1a081, 0x45a800b0c82d3709, 0x24b0e60e1353c61}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x17df8f9d274de7f, 0x351632cce83ec8aa, 0x56e019deae8daf7e, 0x3da35b5dc1820a3b, 0xbb60de7d759b75b1, 0x2e81949d5d0a4d9}, {0xa4efe85f225c5804, 0x9cbd9fc32e16b4f8, 0xa8be541ed7c20bbc, 0xe057875bd571d902, 0x35f5baf03dab21ff, 0x3493d2784699545}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xb37f8fba3f4420f8, 0x8d48f1acb03706df, 0x5f5d4860530ffdbc, 0x3346cb7307f4e98e, 0xebbd3a151d8187ef, 0x14e3e664b5f52b0}, {0xdab91da8f4656795, 0xdbdcf3c3108cac88, 0x272d467ca27bde21, 0x147ed2cd9dc73cf0, 0x67421707fd5d4d50, 0x1c9f704aa559bda}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_PLUS = {{{{0xdb68fd6ab36028ee, 0xb67ecbd22b247e6d, 0x3ddb4a10bff4a0, 0x31eccf041ed4eabc, 0x6c93b74e3dbd1615, 0xece18a8a69c342}, {0x3ac922e0d53a3b4e, 0xaaa4c42158564daf, 0x1359d8744b831fce, 0x6f1eb5f50a893a70, 0x290b2fffdf9f083e, 0x56212fe48636bb}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xd64d88142398fc70, 0x8cd791e2b175b8ad, 0x8cf816a594e65996, 0xdc15534f4bbc3e, 0x2ebd5f0fca9cb695, 0x2677728640635e3}, {0x8e859814dd48f154, 0x400b48d3d3fb2e17, 0x9e315059bbc401a9, 0x26c24fc85c0a4034, 0x2095f2ade3a1cc0e, 0x789dae43794796}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x55c5c814e95ff9e, 0x624aa7502d08f66d, 0xfaef96a43369b1b5, 0x6bd0164a386601da, 0xc4624eccbcab4884, 0x10154ec03218312}, {0x4fbfbe9e5f4e4beb, 0x1392132cc9a7a298, 0x87bee2902df2694c, 0x2fd70dedc82c836c, 0xb969a66833ea4330, 0xac80d610eac86e}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_MINUS = {{{{0x4668fbf6837118e1, 0xe3f7541cde4ef86b, 0x6222f4709df362fa, 0xfff04e39c27d3eeb, 0x950a899ed78c3ac4, 0x325b141dae45991}, {0xdcd302b823c975d7, 0x52a74513892de655, 0x71698b3599387e45, 0x190b468017eb95b1, 0x8d1e5211978b6ff3, 0x29dc08516c36f88}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x29ebd3656c338c34, 0x2bfcf65c705b22cb, 0xc34d5916fff804ae, 0x936fa5577596f777, 0x88bc262ea82314b1, 0x3cb841bc5ebf63f}, {0x1cd8d5a530a1914c, 0xaa47dc464b7fe567, 0xb2f6cfba20a12302, 0xbdec2a7f8ed5764a, 0x8d8caffb90342f7, 0x2bc600de26023a0}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xef90e01f16ec0b, 0xbe3b230014cdc8ca, 0x11d8068a91007c6a, 0xef60fc7a468eb46, 0x6ebe6eb84394eacc, 0xb27d0c0b9cc97e}, {0xfb44d144ffbc728, 0x35fed8aabb632fb0, 0xbce80df03ad44c4c, 0x94e973d6d612e79a, 0xf90b559988365d91, 0x1d8b3925fcef701}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_PLUS = {{{{0xcf4ab671f3581670, 0xfe5bec2006b84191, 0x9c86c3022ef1c1dc, 0xca2fd261142cadc9, 0x615c338c784391f1, 0x220d6a5b67dc16c}, {0x827228cb3c97f27d, 0x62e6cbb0680bb491, 0x595f79839679df49, 0xb532dbc517c50a6e, 0x307360426131c2a7, 0x36d0c506b0ee9bf}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xa40cf5606210efd5, 0xe2a74bde914816ea, 0x3eaded7bce47ee4e, 0x5c13b2fc6d3f0e6f, 0x7c3d8e9de2169375, 0x1ff7fd7dbf97c03}, {0xc35492b3b8cb43e2, 0x3101d6730b5f0690, 0x18bb5b95ff4732ad, 0xc910043b50554bb7, 0xe157f6abd14ab159, 0x136ee8f2b5d364c}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x52706bfd8763b0c3, 0xa42c185c8aff91f3, 0x787da4c24686d040, 0xb481c545c5d853a3, 0xeff30a78ada95338, 0x42de7d5615621e}, {0x9c57da37895bac33, 0x151877b2e03774e0, 0x932f17a8d669aae8, 0xce9262ee9efce8c9, 0x31226e5e998455ab, 0x208b93fdae6a791}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_MINUS = {{{{0x4668fbf6837118e1, 0xe3f7541cde4ef86b, 0x6222f4709df362fa, 0xfff04e39c27d3eeb, 0x950a899ed78c3ac4, 0x325b141dae45991}, {0xdcd302b823c975d7, 0x52a74513892de655, 0x71698b3599387e45, 0x190b468017eb95b1, 0x8d1e5211978b6ff3, 0x29dc08516c36f88}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x29ebd3656c338c34, 0x2bfcf65c705b22cb, 0xc34d5916fff804ae, 0x936fa5577596f777, 0x88bc262ea82314b1, 0x3cb841bc5ebf63f}, {0x1cd8d5a530a1914c, 0xaa47dc464b7fe567, 0xb2f6cfba20a12302, 0xbdec2a7f8ed5764a, 0x8d8caffb90342f7, 0x2bc600de26023a0}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xef90e01f16ec0b, 0xbe3b230014cdc8ca, 0x11d8068a91007c6a, 0xef60fc7a468eb46, 0x6ebe6eb84394eacc, 0xb27d0c0b9cc97e}, {0xfb44d144ffbc728, 0x35fed8aabb632fb0, 0xbce80df03ad44c4c, 0x94e973d6d612e79a, 0xf90b559988365d91, 0x1d8b3925fcef701}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_CHALLENGE = {{{{0xbeb1828b6321b73b, 0x9b4ae33a51041b28, 0xb8eb52edec901458, 0x489f36189fbe40e2, 0x23b52fca75d8097a, 0x1fa77728850feb5}, {0x3c3181fa7491fa00, 0x90610c1cf4b08f0d, 0xc9a4e86e25007aa9, 0x5b71c5a9406460c7, 0xcc87c9e89706249a, 0x35c54d562e37057}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x4660c57fe78f45e1, 0x52046157833495f6, 0x3a046cb27e641924, 0x3d296d4fc4f86278, 0x53eab7beef1edc6b, 0x180b61ad44039e5}, {0x70a4e03a435a0a94, 0xf4446a3f06c86e3b, 0x83264cf9fe7b13b9, 0xded3fc0f6172e26, 0xc0ad14de5a337e74, 0x27cb876a7e80950}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xa6cb0f8ced1d3798, 0x7d2277dc624ef354, 0xed0fc61f3fcf514, 0x80d1db25eb940c0d, 0x5e0af0166b2e4f8f, 0x3a9eaad39577c49}, {0xe3b7bc63514ee9b3, 0x541be4cbdbf35256, 0x4ce81454a8ce471e, 0x97b4f5aca2ab4e14, 0x5e3ef1b3acf3da56, 0x1be60bf81366891}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_curve_t CURVE_E0 = {{{0x0}}, {{0x1}}}; -const ec_point_t CURVE_E0_A24 = {{{0x0}}, {{0x1}}}; -const ibz_mat_2x2_t ACTION_I = {{{{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0x5f9bf9ad,0xbb06ce9,0xfa8d99f,0x233ed044,0xca4e87e8,0x56fc4a37,0x9c299dca,0xe1765919,0x70349f2,0x79d4edb8,0xf59fee35,0xd4522616,0xbe732b73,0x7105059c,0x9debc02b,0xd05ff129,0x9aaa0a69,0xa988470c,0x270}}}, {{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0x9ac24602,0x4dc4b4ca,0x81e54c48,0x8b5b7e0a,0x7e4689b7,0x54fafa8f,0x76fc905e,0xa68b466,0xec936ea2,0x32081752,0x320a003,0x5fbed8bc,0x73c03e0a,0x363af878,0xc25e288e,0xdaeeb565,0x793b880a,0x6e374f3b,0x92}}}}, {{{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0xb5e4ff8b,0x298b8708,0xd78a12b1,0xb76068cb,0x8235b439,0x24444322,0x144cbb26,0x67cecdf3,0x789a4c77,0xecfae4a0,0x81639e7e,0x510f096c,0xf672a6dc,0x5b7c8152,0x40ca824,0xaca11d30,0xda4bc8de,0x1775d1,0xa58}}}, {{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0xa0640653,0xf44f9316,0xf0572660,0x46bd96f1,0x8b141261,0xf557468e,0x41224bed,0x5aa5b58d,0xe023981f,0xfe62031d,0xcd7c8acd,0xebebd36d,0x92121ff9,0xdfcbeb42,0xa9d4e015,0xf67d889,0xc0dddc26,0x9018c1fb,0xa92}}}}}; -const ibz_mat_2x2_t ACTION_J = {{{{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0xd8345359,0xd92d93b2,0x171d9b7d,0xdeefe04c,0xef487fd0,0x8949c82f,0x832679b,0x251d868f,0x4f09df6f,0x1b2c0e75,0x905de6b,0x96d80730,0xf6f33651,0x6341c0fb,0x8dd3ed57,0x6f492678,0xb032905d,0xb1ab8e5,0x160}}}, {{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0x5959eab0,0xc1579779,0xabc09e09,0xb2b24987,0x41cbc465,0xc42528f3,0x52b5800a,0x9aa2a793,0xba7d1b4d,0x104378e3,0x48fe062b,0x6ac167a5,0x7734e1fd,0xee4d5d61,0xa97812cc,0x69cbab4c,0x85fa4efc,0xb815af33,0xc3}}}}, {{{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0x8161a413,0x68610eff,0x270d05ea,0xa5898480,0xcd5eeec9,0x3613d511,0xbce9cbc9,0xcd73774e,0x8ed7995a,0x7b1a85cb,0xdeb665de,0xc9b2b79b,0xa86db14f,0xd55e5252,0xe5c2c3aa,0x5e0fbcf9,0x85adc2d7,0xf16e2b48,0x19b}}}, {{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0x27cbaca7,0x26d26c4d,0xe8e26482,0x8b0c86e9,0x661a1a78,0xc309c896,0xd519821c,0x16fe8817,0x981d02a3,0x5d0ae260,0xba169a98,0x2965f254,0x5992151c,0xed8f2fe3,0xb9ecb2e9,0x707ea33a,0xab555632,0x2e865022,0xba3}}}}}; -const ibz_mat_2x2_t ACTION_K = {{{{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0xf8575e4b,0x5f3915d3,0xf49d327d,0x32f81206,0xb830032d,0x57bb8d08,0xa3faa63d,0x4bb031ce,0xa181d817,0x10566a23,0xa42db43c,0x8adfbca9,0x67b5c97c,0xd3e0a69b,0x82e0a039,0x5ea50eb8,0x4264dad8,0x1170d763,0x1a1}}}, {{._mp_alloc = 0, ._mp_size = 18, ._mp_d = (mp_limb_t[]) {0x8cf3cc3e,0x1ea2fe19,0x311a1b31,0x82ef85ef,0xda45dd53,0x49a76b4c,0x628dfd6a,0x960d85f1,0x5e12f0e9,0xa0a0cf21,0x1240169d,0xee8fb63d,0x12daaf8c,0x6d14802c,0x4a5b7027,0xd76fff7f,0x6a9508a9,0xe83dff1c}}}}, {{{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0xdf9f8c7c,0xc3e2dbf8,0x3b5d3533,0x89df39e9,0x7b1e3202,0x1c248bc5,0x134daa1e,0xee572977,0xd74d80b9,0x3467232a,0xc9cd152a,0xd2c52f03,0xcda9d887,0x3bf965cc,0x88dc690,0xdb959016,0x413aec1a,0xdd308321,0xb06}}}, {{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0x7a8a1b5,0xa0c6ea2c,0xb62cd82,0x3704552f,0x9d32971c,0xf49803bd,0x3951437a,0xf06bdcd8,0x45a509fa,0x67e086b2,0x1eeec4c7,0x355e3cdb,0xe8cf81f1,0x7cf04a43,0xc4e00007,0x8122bafa,0x19230bb7,0x283031a5,0xb62}}}}}; -const ibz_mat_2x2_t ACTION_GEN2 = {{{{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0x5f9bf9ad,0xbb06ce9,0xfa8d99f,0x233ed044,0xca4e87e8,0x56fc4a37,0x9c299dca,0xe1765919,0x70349f2,0x79d4edb8,0xf59fee35,0xd4522616,0xbe732b73,0x7105059c,0x9debc02b,0xd05ff129,0x9aaa0a69,0xa988470c,0x270}}}, {{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0x9ac24602,0x4dc4b4ca,0x81e54c48,0x8b5b7e0a,0x7e4689b7,0x54fafa8f,0x76fc905e,0xa68b466,0xec936ea2,0x32081752,0x320a003,0x5fbed8bc,0x73c03e0a,0x363af878,0xc25e288e,0xdaeeb565,0x793b880a,0x6e374f3b,0x92}}}}, {{{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0xb5e4ff8b,0x298b8708,0xd78a12b1,0xb76068cb,0x8235b439,0x24444322,0x144cbb26,0x67cecdf3,0x789a4c77,0xecfae4a0,0x81639e7e,0x510f096c,0xf672a6dc,0x5b7c8152,0x40ca824,0xaca11d30,0xda4bc8de,0x1775d1,0xa58}}}, {{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0xa0640653,0xf44f9316,0xf0572660,0x46bd96f1,0x8b141261,0xf557468e,0x41224bed,0x5aa5b58d,0xe023981f,0xfe62031d,0xcd7c8acd,0xebebd36d,0x92121ff9,0xdfcbeb42,0xa9d4e015,0xf67d889,0xc0dddc26,0x9018c1fb,0xa92}}}}}; -const ibz_mat_2x2_t ACTION_GEN3 = {{{{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0x1be82683,0x726f004e,0x13633a8e,0x36158be3,0x77cd101,0x164cd197,0xc0d3f78f,0x2157f727,0x9e9a05ba,0x69bf681,0xe0e122d2,0x95b41365,0x2f5d699,0x128bdbbc,0xb9c026e2,0x8fb870aa,0x533240ab,0xf722047d,0x869}}}, {{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0xfa0e1859,0x78e2621,0x16d2f529,0x9f06e3c9,0x6009270e,0x8c9011c1,0xe4d90834,0xd285adfc,0x538844f7,0x2125c81b,0xa60f5317,0xe5402030,0xf57a9003,0x92442aec,0x35eb1dad,0xa25d3059,0x7f9aeb83,0x13267f37,0xab}}}}, {{{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0x1ba351cf,0xc8f64b04,0xff4b8c4d,0x63732a40,0x527b9ea6,0xd355d47d,0x57413853,0x38af29f4,0xf74c63f2,0x70262da0,0x919b3eb0,0xed7fdd46,0x77b2d1cc,0x40d5e242,0x98c80608,0xf53c51ee,0x5dc0b922,0x95935511,0xc7b}}}, {{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0xe417d97d,0x8d90ffb1,0xec9cc571,0x33e6db52,0x4de5c948,0x3606bf2f,0x1c77f229,0x1ac4177f,0x488cdc58,0x719afa54,0xe23b5631,0x2a89e61e,0x4d8f74d4,0x3e451523,0x8e00795f,0x500f5908,0x855a5e4,0x427f048b,0x499}}}}}; -const ibz_mat_2x2_t ACTION_GEN4 = {{{{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0xfc2baf26,0xaf9c8ae9,0x7a4e993e,0x4e7a3c9e,0x86c94ebb,0xd2078ee7,0xc0a347fa,0xc3e6203a,0xc4545d14,0xc446ad7c,0x33a5169f,0x258edb17,0x5c1d8a75,0x9258cbbd,0xe550a03d,0x1f366c35,0xcef660b4,0x2588f035,0x752}}}, {{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0xc679e61f,0x8f517f0c,0x988d0d98,0x7675f692,0x97d43bce,0x4afd7e09,0x1fecf391,0xe914ca4c,0xa29ce97d,0x8c6bdffb,0xeaae47d0,0x5766d7e0,0xb1affd7d,0x5ef2b885,0x490e0834,0xdb9be499,0x630e779c,0x10ef8412,0x682}}}}, {{{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0x6fcfc63e,0xe1f16dfc,0x9dae9a99,0xf9edd08f,0xe8406625,0x343c0e45,0xf84cc9eb,0x15399c0e,0x5f3a3166,0xd64f0a00,0x4674c716,0xc9819444,0xf1791fa,0xc6652b56,0xa8273368,0x5daeace4,0xce616955,0xb68c614,0xc05}}}, {{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0x3d450db,0x50637516,0x85b166c1,0x1b822a97,0xce994b8e,0x7a4c01de,0x1ca8a1bd,0x7835ee6c,0x22d284fd,0xb3f04359,0x8f776263,0x9aaf1e6d,0xf467c0f8,0xbe782521,0x62700003,0xc0915d7d,0x8c9185db,0x141818d2,0x5b1}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_UNDISTORTED_GEN = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x91a55618,0xec100cb1,0x966d5d13,0xdd222570,0xdd080bd4,0x3bbe2a09,0xd1155f37,0x9e064654,0x14b8981d,0x8f5f39e7,0x3bacea39,0x14f33ec9}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xee14a05f,0x39f70b22,0x2e3bd1f8,0xe8a41510,0xe2b9c434,0xe01ffc70,0x1049ae2e,0x1f9f0a35,0x2daa0966,0x49314084,0x907d6e9e,0x7229561}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_DISTORTION_ENDO = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xe0f6a744,0xd4bd4a03,0xcb47be44,0x814b692f,0x68038ab1,0x7a91716f,0x9d47771c,0x70e839c2,0xdb8e1dc1,0x66737444,0xc21e706,0x353d4594}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xa4980387,0x37dda53d,0x78a00d4e,0x48b94d99,0xc524bcf4,0xc972bdca,0x51be3bd5,0x6d73b971,0x3a0d9f69,0x4c09060c,0xb15504e4,0x565ecf32}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x8a511b5d,0x1483dd5d,0x8cbe3d75,0x9649d34,0x54096d97,0x5e4e3bb1,0x2ead9384,0x439d6dee,0x9c90cf8b,0x3f6faf44,0x2120f968,0x16631235}}}}}; -#elif 8*DIGIT_LEN == 64 -const ec_basis_t BASIS_EVEN = {{{{0x22e6355134b7d255, 0xa7f7f4f4597d08dc, 0xb8eb0e50d5888eec, 0xed36a84e0c7f72ba, 0xb6ed1c0b46f3f28e, 0x282153a62f4d1b8}, {0xd57efea74410a787, 0xea4460d69d71d250, 0xb3d9ad4193397a46, 0x3124b5b93ff1a081, 0x45a800b0c82d3709, 0x24b0e60e1353c61}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x17df8f9d274de7f, 0x351632cce83ec8aa, 0x56e019deae8daf7e, 0x3da35b5dc1820a3b, 0xbb60de7d759b75b1, 0x2e81949d5d0a4d9}, {0xa4efe85f225c5804, 0x9cbd9fc32e16b4f8, 0xa8be541ed7c20bbc, 0xe057875bd571d902, 0x35f5baf03dab21ff, 0x3493d2784699545}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xb37f8fba3f4420f8, 0x8d48f1acb03706df, 0x5f5d4860530ffdbc, 0x3346cb7307f4e98e, 0xebbd3a151d8187ef, 0x14e3e664b5f52b0}, {0xdab91da8f4656795, 0xdbdcf3c3108cac88, 0x272d467ca27bde21, 0x147ed2cd9dc73cf0, 0x67421707fd5d4d50, 0x1c9f704aa559bda}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_PLUS = {{{{0xdb68fd6ab36028ee, 0xb67ecbd22b247e6d, 0x3ddb4a10bff4a0, 0x31eccf041ed4eabc, 0x6c93b74e3dbd1615, 0xece18a8a69c342}, {0x3ac922e0d53a3b4e, 0xaaa4c42158564daf, 0x1359d8744b831fce, 0x6f1eb5f50a893a70, 0x290b2fffdf9f083e, 0x56212fe48636bb}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xd64d88142398fc70, 0x8cd791e2b175b8ad, 0x8cf816a594e65996, 0xdc15534f4bbc3e, 0x2ebd5f0fca9cb695, 0x2677728640635e3}, {0x8e859814dd48f154, 0x400b48d3d3fb2e17, 0x9e315059bbc401a9, 0x26c24fc85c0a4034, 0x2095f2ade3a1cc0e, 0x789dae43794796}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x55c5c814e95ff9e, 0x624aa7502d08f66d, 0xfaef96a43369b1b5, 0x6bd0164a386601da, 0xc4624eccbcab4884, 0x10154ec03218312}, {0x4fbfbe9e5f4e4beb, 0x1392132cc9a7a298, 0x87bee2902df2694c, 0x2fd70dedc82c836c, 0xb969a66833ea4330, 0xac80d610eac86e}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_MINUS = {{{{0x4668fbf6837118e1, 0xe3f7541cde4ef86b, 0x6222f4709df362fa, 0xfff04e39c27d3eeb, 0x950a899ed78c3ac4, 0x325b141dae45991}, {0xdcd302b823c975d7, 0x52a74513892de655, 0x71698b3599387e45, 0x190b468017eb95b1, 0x8d1e5211978b6ff3, 0x29dc08516c36f88}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x29ebd3656c338c34, 0x2bfcf65c705b22cb, 0xc34d5916fff804ae, 0x936fa5577596f777, 0x88bc262ea82314b1, 0x3cb841bc5ebf63f}, {0x1cd8d5a530a1914c, 0xaa47dc464b7fe567, 0xb2f6cfba20a12302, 0xbdec2a7f8ed5764a, 0x8d8caffb90342f7, 0x2bc600de26023a0}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xef90e01f16ec0b, 0xbe3b230014cdc8ca, 0x11d8068a91007c6a, 0xef60fc7a468eb46, 0x6ebe6eb84394eacc, 0xb27d0c0b9cc97e}, {0xfb44d144ffbc728, 0x35fed8aabb632fb0, 0xbce80df03ad44c4c, 0x94e973d6d612e79a, 0xf90b559988365d91, 0x1d8b3925fcef701}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_PLUS = {{{{0xcf4ab671f3581670, 0xfe5bec2006b84191, 0x9c86c3022ef1c1dc, 0xca2fd261142cadc9, 0x615c338c784391f1, 0x220d6a5b67dc16c}, {0x827228cb3c97f27d, 0x62e6cbb0680bb491, 0x595f79839679df49, 0xb532dbc517c50a6e, 0x307360426131c2a7, 0x36d0c506b0ee9bf}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xa40cf5606210efd5, 0xe2a74bde914816ea, 0x3eaded7bce47ee4e, 0x5c13b2fc6d3f0e6f, 0x7c3d8e9de2169375, 0x1ff7fd7dbf97c03}, {0xc35492b3b8cb43e2, 0x3101d6730b5f0690, 0x18bb5b95ff4732ad, 0xc910043b50554bb7, 0xe157f6abd14ab159, 0x136ee8f2b5d364c}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x52706bfd8763b0c3, 0xa42c185c8aff91f3, 0x787da4c24686d040, 0xb481c545c5d853a3, 0xeff30a78ada95338, 0x42de7d5615621e}, {0x9c57da37895bac33, 0x151877b2e03774e0, 0x932f17a8d669aae8, 0xce9262ee9efce8c9, 0x31226e5e998455ab, 0x208b93fdae6a791}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_MINUS = {{{{0x4668fbf6837118e1, 0xe3f7541cde4ef86b, 0x6222f4709df362fa, 0xfff04e39c27d3eeb, 0x950a899ed78c3ac4, 0x325b141dae45991}, {0xdcd302b823c975d7, 0x52a74513892de655, 0x71698b3599387e45, 0x190b468017eb95b1, 0x8d1e5211978b6ff3, 0x29dc08516c36f88}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x29ebd3656c338c34, 0x2bfcf65c705b22cb, 0xc34d5916fff804ae, 0x936fa5577596f777, 0x88bc262ea82314b1, 0x3cb841bc5ebf63f}, {0x1cd8d5a530a1914c, 0xaa47dc464b7fe567, 0xb2f6cfba20a12302, 0xbdec2a7f8ed5764a, 0x8d8caffb90342f7, 0x2bc600de26023a0}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xef90e01f16ec0b, 0xbe3b230014cdc8ca, 0x11d8068a91007c6a, 0xef60fc7a468eb46, 0x6ebe6eb84394eacc, 0xb27d0c0b9cc97e}, {0xfb44d144ffbc728, 0x35fed8aabb632fb0, 0xbce80df03ad44c4c, 0x94e973d6d612e79a, 0xf90b559988365d91, 0x1d8b3925fcef701}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_CHALLENGE = {{{{0xbeb1828b6321b73b, 0x9b4ae33a51041b28, 0xb8eb52edec901458, 0x489f36189fbe40e2, 0x23b52fca75d8097a, 0x1fa77728850feb5}, {0x3c3181fa7491fa00, 0x90610c1cf4b08f0d, 0xc9a4e86e25007aa9, 0x5b71c5a9406460c7, 0xcc87c9e89706249a, 0x35c54d562e37057}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x4660c57fe78f45e1, 0x52046157833495f6, 0x3a046cb27e641924, 0x3d296d4fc4f86278, 0x53eab7beef1edc6b, 0x180b61ad44039e5}, {0x70a4e03a435a0a94, 0xf4446a3f06c86e3b, 0x83264cf9fe7b13b9, 0xded3fc0f6172e26, 0xc0ad14de5a337e74, 0x27cb876a7e80950}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xa6cb0f8ced1d3798, 0x7d2277dc624ef354, 0xed0fc61f3fcf514, 0x80d1db25eb940c0d, 0x5e0af0166b2e4f8f, 0x3a9eaad39577c49}, {0xe3b7bc63514ee9b3, 0x541be4cbdbf35256, 0x4ce81454a8ce471e, 0x97b4f5aca2ab4e14, 0x5e3ef1b3acf3da56, 0x1be60bf81366891}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_curve_t CURVE_E0 = {{{0x0}}, {{0x1}}}; -const ec_point_t CURVE_E0_A24 = {{{0x0}}, {{0x1}}}; -const ibz_mat_2x2_t ACTION_I = {{{{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xbb06ce95f9bf9ad,0x233ed0440fa8d99f,0x56fc4a37ca4e87e8,0xe17659199c299dca,0x79d4edb8070349f2,0xd4522616f59fee35,0x7105059cbe732b73,0xd05ff1299debc02b,0xa988470c9aaa0a69,0x270}}}, {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0x4dc4b4ca9ac24602,0x8b5b7e0a81e54c48,0x54fafa8f7e4689b7,0xa68b46676fc905e,0x32081752ec936ea2,0x5fbed8bc0320a003,0x363af87873c03e0a,0xdaeeb565c25e288e,0x6e374f3b793b880a,0x92}}}}, {{{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0x298b8708b5e4ff8b,0xb76068cbd78a12b1,0x244443228235b439,0x67cecdf3144cbb26,0xecfae4a0789a4c77,0x510f096c81639e7e,0x5b7c8152f672a6dc,0xaca11d30040ca824,0x1775d1da4bc8de,0xa58}}}, {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xf44f9316a0640653,0x46bd96f1f0572660,0xf557468e8b141261,0x5aa5b58d41224bed,0xfe62031de023981f,0xebebd36dcd7c8acd,0xdfcbeb4292121ff9,0xf67d889a9d4e015,0x9018c1fbc0dddc26,0xa92}}}}}; -const ibz_mat_2x2_t ACTION_J = {{{{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xd92d93b2d8345359,0xdeefe04c171d9b7d,0x8949c82fef487fd0,0x251d868f0832679b,0x1b2c0e754f09df6f,0x96d807300905de6b,0x6341c0fbf6f33651,0x6f4926788dd3ed57,0xb1ab8e5b032905d,0x160}}}, {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xc15797795959eab0,0xb2b24987abc09e09,0xc42528f341cbc465,0x9aa2a79352b5800a,0x104378e3ba7d1b4d,0x6ac167a548fe062b,0xee4d5d617734e1fd,0x69cbab4ca97812cc,0xb815af3385fa4efc,0xc3}}}}, {{{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0x68610eff8161a413,0xa5898480270d05ea,0x3613d511cd5eeec9,0xcd73774ebce9cbc9,0x7b1a85cb8ed7995a,0xc9b2b79bdeb665de,0xd55e5252a86db14f,0x5e0fbcf9e5c2c3aa,0xf16e2b4885adc2d7,0x19b}}}, {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0x26d26c4d27cbaca7,0x8b0c86e9e8e26482,0xc309c896661a1a78,0x16fe8817d519821c,0x5d0ae260981d02a3,0x2965f254ba169a98,0xed8f2fe35992151c,0x707ea33ab9ecb2e9,0x2e865022ab555632,0xba3}}}}}; -const ibz_mat_2x2_t ACTION_K = {{{{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0x5f3915d3f8575e4b,0x32f81206f49d327d,0x57bb8d08b830032d,0x4bb031cea3faa63d,0x10566a23a181d817,0x8adfbca9a42db43c,0xd3e0a69b67b5c97c,0x5ea50eb882e0a039,0x1170d7634264dad8,0x1a1}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x1ea2fe198cf3cc3e,0x82ef85ef311a1b31,0x49a76b4cda45dd53,0x960d85f1628dfd6a,0xa0a0cf215e12f0e9,0xee8fb63d1240169d,0x6d14802c12daaf8c,0xd76fff7f4a5b7027,0xe83dff1c6a9508a9}}}}, {{{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xc3e2dbf8df9f8c7c,0x89df39e93b5d3533,0x1c248bc57b1e3202,0xee572977134daa1e,0x3467232ad74d80b9,0xd2c52f03c9cd152a,0x3bf965cccda9d887,0xdb959016088dc690,0xdd308321413aec1a,0xb06}}}, {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xa0c6ea2c07a8a1b5,0x3704552f0b62cd82,0xf49803bd9d32971c,0xf06bdcd83951437a,0x67e086b245a509fa,0x355e3cdb1eeec4c7,0x7cf04a43e8cf81f1,0x8122bafac4e00007,0x283031a519230bb7,0xb62}}}}}; -const ibz_mat_2x2_t ACTION_GEN2 = {{{{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xbb06ce95f9bf9ad,0x233ed0440fa8d99f,0x56fc4a37ca4e87e8,0xe17659199c299dca,0x79d4edb8070349f2,0xd4522616f59fee35,0x7105059cbe732b73,0xd05ff1299debc02b,0xa988470c9aaa0a69,0x270}}}, {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0x4dc4b4ca9ac24602,0x8b5b7e0a81e54c48,0x54fafa8f7e4689b7,0xa68b46676fc905e,0x32081752ec936ea2,0x5fbed8bc0320a003,0x363af87873c03e0a,0xdaeeb565c25e288e,0x6e374f3b793b880a,0x92}}}}, {{{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0x298b8708b5e4ff8b,0xb76068cbd78a12b1,0x244443228235b439,0x67cecdf3144cbb26,0xecfae4a0789a4c77,0x510f096c81639e7e,0x5b7c8152f672a6dc,0xaca11d30040ca824,0x1775d1da4bc8de,0xa58}}}, {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xf44f9316a0640653,0x46bd96f1f0572660,0xf557468e8b141261,0x5aa5b58d41224bed,0xfe62031de023981f,0xebebd36dcd7c8acd,0xdfcbeb4292121ff9,0xf67d889a9d4e015,0x9018c1fbc0dddc26,0xa92}}}}}; -const ibz_mat_2x2_t ACTION_GEN3 = {{{{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0x726f004e1be82683,0x36158be313633a8e,0x164cd197077cd101,0x2157f727c0d3f78f,0x69bf6819e9a05ba,0x95b41365e0e122d2,0x128bdbbc02f5d699,0x8fb870aab9c026e2,0xf722047d533240ab,0x869}}}, {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0x78e2621fa0e1859,0x9f06e3c916d2f529,0x8c9011c16009270e,0xd285adfce4d90834,0x2125c81b538844f7,0xe5402030a60f5317,0x92442aecf57a9003,0xa25d305935eb1dad,0x13267f377f9aeb83,0xab}}}}, {{{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xc8f64b041ba351cf,0x63732a40ff4b8c4d,0xd355d47d527b9ea6,0x38af29f457413853,0x70262da0f74c63f2,0xed7fdd46919b3eb0,0x40d5e24277b2d1cc,0xf53c51ee98c80608,0x959355115dc0b922,0xc7b}}}, {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0x8d90ffb1e417d97d,0x33e6db52ec9cc571,0x3606bf2f4de5c948,0x1ac4177f1c77f229,0x719afa54488cdc58,0x2a89e61ee23b5631,0x3e4515234d8f74d4,0x500f59088e00795f,0x427f048b0855a5e4,0x499}}}}}; -const ibz_mat_2x2_t ACTION_GEN4 = {{{{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xaf9c8ae9fc2baf26,0x4e7a3c9e7a4e993e,0xd2078ee786c94ebb,0xc3e6203ac0a347fa,0xc446ad7cc4545d14,0x258edb1733a5169f,0x9258cbbd5c1d8a75,0x1f366c35e550a03d,0x2588f035cef660b4,0x752}}}, {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0x8f517f0cc679e61f,0x7675f692988d0d98,0x4afd7e0997d43bce,0xe914ca4c1fecf391,0x8c6bdffba29ce97d,0x5766d7e0eaae47d0,0x5ef2b885b1affd7d,0xdb9be499490e0834,0x10ef8412630e779c,0x682}}}}, {{{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xe1f16dfc6fcfc63e,0xf9edd08f9dae9a99,0x343c0e45e8406625,0x15399c0ef84cc9eb,0xd64f0a005f3a3166,0xc98194444674c716,0xc6652b560f1791fa,0x5daeace4a8273368,0xb68c614ce616955,0xc05}}}, {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0x5063751603d450db,0x1b822a9785b166c1,0x7a4c01dece994b8e,0x7835ee6c1ca8a1bd,0xb3f0435922d284fd,0x9aaf1e6d8f776263,0xbe782521f467c0f8,0xc0915d7d62700003,0x141818d28c9185db,0x5b1}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_UNDISTORTED_GEN = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xec100cb191a55618,0xdd222570966d5d13,0x3bbe2a09dd080bd4,0x9e064654d1155f37,0x8f5f39e714b8981d,0x14f33ec93bacea39}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x39f70b22ee14a05f,0xe8a415102e3bd1f8,0xe01ffc70e2b9c434,0x1f9f0a351049ae2e,0x493140842daa0966,0x7229561907d6e9e}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_DISTORTION_ENDO = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xd4bd4a03e0f6a744,0x814b692fcb47be44,0x7a91716f68038ab1,0x70e839c29d47771c,0x66737444db8e1dc1,0x353d45940c21e706}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x37dda53da4980387,0x48b94d9978a00d4e,0xc972bdcac524bcf4,0x6d73b97151be3bd5,0x4c09060c3a0d9f69,0x565ecf32b15504e4}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1483dd5d8a511b5d,0x9649d348cbe3d75,0x5e4e3bb154096d97,0x439d6dee2ead9384,0x3f6faf449c90cf8b,0x166312352120f968}}}}}; +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} #endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x7e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1} +#elif RADIX == 32 +{0x1f8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x1, 0x0, 0x0, 0x0, 0x0, 0x3f00000000000000} +#else +{0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x1196, 0x134b, 0xdbd, 0x118d, 0x712, 0x1646, 0x5d7, 0x8eb, 0x431, 0xf5b, 0x161e, 0x13b6, 0x1c07, 0x42, 0x8ba, 0xeec, 0x1a43, 0x545, 0x1cdb, 0x1659, 0x1614, 0xde, 0x72d, 0x1b80, 0x1706, 0x15a3, 0x894, 0xd4a, 0x1b2f, 0x12} +#elif RADIX == 32 +{0x9a5c65a, 0xa31adbd, 0x7b231c4, 0xc51d65d, 0x1e7ad90, 0x1e76d6, 0x8ba0217, 0xe90ddd8, 0x3cdb2a2, 0xf5852cb, 0x72d06, 0xd1dc1b7, 0xa94894a, 0x14cbd} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x31c4a31adbd9a5c6, 0xe7ad90c51d65d7b2, 0x88ba021701e76d61, 0x2cb3cdb2a2e90ddd, 0xdc1b70072d06f585, 0x16eecbda94894ad1} +#else +{0x94635b7b34b8c, 0x431475975ec8c7, 0x380f3b6b0f3d6c, 0x2e90ddd88ba021, 0x5eb0a59679b654, 0x347706dc01cb41, 0xb7765ed4a44a5} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0xa85, 0x10cc, 0x1ef, 0xb0b, 0x1082, 0x5be, 0xd14, 0x1100, 0x1a33, 0x174b, 0x181c, 0x83e, 0x1034, 0x18ba, 0x205, 0x1f39, 0x1e9, 0x1998, 0x130e, 0x801, 0xfeb, 0x698, 0xdf9, 0x6a5, 0x5b6, 0x2c8, 0x1283, 0xad9, 0x960, 0x1e} +#elif RADIX == 32 +{0x8662a17, 0x96161ef, 0x42df420, 0xce200d1, 0x1cba5e8, 0xd107d8, 0x205c5d4, 0x7a7e72, 0x330eccc, 0xc3fad00, 0x4adf934, 0x6416d8d, 0x5b32831, 0x2f581} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xf42096161ef8662a, 0xcba5e8ce200d142d, 0x2205c5d40d107d81, 0xd00330eccc07a7e7, 0x16d8d4adf934c3fa, 0x6065815b3283164} +#else +{0x412c2c3df0cc54, 0x2338803450b7d0, 0x206883ec0e5d2f, 0x407a7e72205c5d, 0x187f5a00661d99, 0x5905b6352b7e4d, 0x3032c0ad99418} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x16ed, 0x818, 0x127a, 0xcfb, 0x1be6, 0x1b40, 0x1bf1, 0xe75, 0x129c, 0x151, 0x425, 0x142e, 0x1edb, 0x254, 0x5cc, 0x1a5b, 0x1e1d, 0x1e27, 0x1a12, 0x8a8, 0x59e, 0x933, 0x1647, 0x686, 0x19e, 0x1e51, 0x151f, 0x1b6e, 0x1efe, 0xd} +#elif RADIX == 32 +{0x40c5bb5, 0x99f727a, 0x1da06f9, 0x71cebbf, 0x250a8ca, 0xb6e85c4, 0x5cc12a7, 0xf8774b6, 0x1a12f13, 0x9967915, 0xd64749, 0x288678d, 0x6dd51ff, 0x2ebfb} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x6f999f727a40c5b, 0x50a8ca71cebbf1da, 0x65cc12a7b6e85c42, 0x9151a12f13f8774b, 0x8678d0d647499967, 0x2e23bfb6dd51ff28} +#else +{0x7333ee4f4818b7, 0x29c73aefc7681b, 0x3db742e2128546, 0x3f8774b65cc12a, 0x332cf22a3425e2, 0x4a219e343591d2, 0x6d1dfdb6ea8ff} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x18a9, 0x1838, 0x1588, 0x1720, 0xf3f, 0x1fcd, 0x44d, 0x1e6b, 0x681, 0x1249, 0x1f8a, 0x5af, 0x1f58, 0x1c12, 0xf21, 0x1887, 0x278, 0x156a, 0xbfe, 0x765, 0x12f7, 0x4da, 0x16ce, 0x7c1, 0x1c04, 0x1773, 0x853, 0xab7, 0xe1d, 0x1a} +#elif RADIX == 32 +{0xc1c62a7, 0xee41588, 0xdfe6bcf, 0x7cd644, 0x8a9249a, 0xd60b5ff, 0xf21e097, 0x9e310e, 0xabfeab5, 0xd4bdcec, 0x836ce26, 0xb9f010f, 0x56e853b, 0x10875} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x6bcfee41588c1c62, 0xa9249a07cd644dfe, 0xef21e097d60b5ff8, 0xcecabfeab509e310, 0xf010f836ce26d4bd, 0x2a7787556e853bb9} +#else +{0x1fdc82b11838c5, 0x681f359137f9af, 0x3eb05affc54924, 0x509e310ef21e09, 0x5a97b9d957fd56, 0x6e7c043e0db389, 0x4fbc3aab7429d} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1e36, 0x1718, 0xced, 0x186e, 0x83d, 0x1a23, 0xf5b, 0x5ca, 0x194d, 0x1bd8, 0xb67, 0x9f7, 0x1806, 0x17ae, 0x508, 0x117f, 0x5cc, 0x1809, 0x14b1, 0x85f, 0xcf0, 0x1b0c, 0x1753, 0x1484, 0xb5f, 0x1d62, 0x808, 0x1cc3, 0x844, 0x9} +#elif RADIX == 32 +{0xb8c78d9, 0x70dcced, 0xbd11a0f, 0x34b94f5, 0x67dec65, 0x193eeb, 0x508bd76, 0x97322fe, 0xf4b1c04, 0x633c10b, 0x9753d8, 0xb12d7e9, 0x986808e, 0x9113} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x1a0f70dccedb8c78, 0x7dec6534b94f5bd1, 0xe508bd760193eeb6, 0x10bf4b1c0497322f, 0x2d7e909753d8633c, 0x3722113986808eb1} +#else +{0x1ee1b99db718f1, 0x14d2e53d6f4468, 0x300c9f75b3ef63, 0x497322fe508bd7, 0xc678217e96380, 0x2c4b5fa425d4f6, 0xb51089cc34047} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1785, 0x1652, 0x4b4, 0x1b37, 0x918, 0x12d, 0x1340, 0x16d3, 0xee, 0xb43, 0x52a, 0x1ff, 0x1e6b, 0x1424, 0x609, 0x1e2c, 0x19bd, 0x18f, 0x174a, 0x134d, 0x6f4, 0xa33, 0x1d5c, 0xa53, 0x73c, 0x361, 0x372, 0x1242, 0x87c, 0x17} +#elif RADIX == 32 +{0xb295e16, 0x366e4b4, 0x96a46, 0xbada734, 0x2a5a183, 0x9ac3fe5, 0x609a127, 0xe6f7c58, 0xb74a0c7, 0x99bd269, 0xa7d5c51, 0xb09cf14, 0x4843721, 0x381f2} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x6a46366e4b4b295e, 0xa5a183bada734009, 0x8609a1279ac3fe52, 0x269b74a0c7e6f7c5, 0x9cf14a7d5c5199bd, 0x5ce1f24843721b0} +#else +{0xc6cdc969652bc, 0xeeb69cd0025a9, 0x3cd61ff2952d0c, 0x7e6f7c58609a12, 0x3337a4d36e9418, 0x6c273c529f5714, 0x2e70f92421b90} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x97d1,0x8f9c,0x8477,0x3a,0x39d2,0x66ae,0xabd6,0x13da,0xf153,0xb9e7,0xf8db,0x5f9f,0x36f7,0xfcb2,0xa4f0,0x62b9,0x5c07,0x3694,0x539d,0xe8c5,0x7631,0xf16c,0xc691,0x9a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x8f9c97d1,0x3a8477,0x66ae39d2,0x13daabd6,0xb9e7f153,0x5f9ff8db,0xfcb236f7,0x62b9a4f0,0x36945c07,0xe8c5539d,0xf16c7631,0x9ac691}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x3a84778f9c97d1,0x13daabd666ae39d2,0x5f9ff8dbb9e7f153,0x62b9a4f0fcb236f7,0xe8c5539d36945c07,0x9ac691f16c7631}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1ac2,0xbac6,0x4a43,0x76df,0xe925,0x4a2d,0x1cf8,0xd32d,0x7867,0x1dc0,0xc02f,0xdf8b,0xf122,0x4f0c,0xe07d,0x4a9e,0xa97,0x7ce2,0x8791,0x3570,0x1749,0x519b,0x34cc,0x66}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xbac61ac2,0x76df4a43,0x4a2de925,0xd32d1cf8,0x1dc07867,0xdf8bc02f,0x4f0cf122,0x4a9ee07d,0x7ce20a97,0x35708791,0x519b1749,0x6634cc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x76df4a43bac61ac2,0xd32d1cf84a2de925,0xdf8bc02f1dc07867,0x4a9ee07d4f0cf122,0x357087917ce20a97,0x6634cc519b1749}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xfb0f,0x234,0xa481,0x9c61,0x4bd1,0xcd58,0x3a72,0xe38c,0xbe7b,0xea3,0xf102,0xdc99,0xf180,0xb229,0x5d86,0xef91,0x46c4,0x8831,0xa9d5,0xf66f,0xa451,0x6c02,0x9ebd,0xfc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x234fb0f,0x9c61a481,0xcd584bd1,0xe38c3a72,0xea3be7b,0xdc99f102,0xb229f180,0xef915d86,0x883146c4,0xf66fa9d5,0x6c02a451,0xfc9ebd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9c61a4810234fb0f,0xe38c3a72cd584bd1,0xdc99f1020ea3be7b,0xef915d86b229f180,0xf66fa9d5883146c4,0xfc9ebd6c02a451}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x682f,0x7063,0x7b88,0xffc5,0xc62d,0x9951,0x5429,0xec25,0xeac,0x4618,0x724,0xa060,0xc908,0x34d,0x5b0f,0x9d46,0xa3f8,0xc96b,0xac62,0x173a,0x89ce,0xe93,0x396e,0x65}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7063682f,0xffc57b88,0x9951c62d,0xec255429,0x46180eac,0xa0600724,0x34dc908,0x9d465b0f,0xc96ba3f8,0x173aac62,0xe9389ce,0x65396e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xffc57b887063682f,0xec2554299951c62d,0xa060072446180eac,0x9d465b0f034dc908,0x173aac62c96ba3f8,0x65396e0e9389ce}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x6f75,0xc742,0x1abb,0xc3b2,0x4bff,0xf015,0x66b,0xc51b,0xacd6,0x30c2,0xf641,0x625b,0x2e88,0xbe5,0x5121,0xbe40,0x8ac2,0x755b,0xb8c9,0x4eb6,0xb07,0x46b6,0x84cf,0x47}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xc7426f75,0xc3b21abb,0xf0154bff,0xc51b066b,0x30c2acd6,0x625bf641,0xbe52e88,0xbe405121,0x755b8ac2,0x4eb6b8c9,0x46b60b07,0x4784cf}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xc3b21abbc7426f75,0xc51b066bf0154bff,0x625bf64130c2acd6,0xbe4051210be52e88,0x4eb6b8c9755b8ac2,0x4784cf46b60b07}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x9db8,0x479b,0xe350,0xae1e,0x4f92,0x6572,0x60a4,0x89ed,0x12f4,0xb88d,0x64b6,0xf9ca,0x26b,0xc086,0x83b8,0xb2c7,0x88a8,0xe99b,0x57b3,0x9017,0xe033,0x9d5d,0x5de6,0x37}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x479b9db8,0xae1ee350,0x65724f92,0x89ed60a4,0xb88d12f4,0xf9ca64b6,0xc086026b,0xb2c783b8,0xe99b88a8,0x901757b3,0x9d5de033,0x375de6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xae1ee350479b9db8,0x89ed60a465724f92,0xf9ca64b6b88d12f4,0xb2c783b8c086026b,0x901757b3e99b88a8,0x375de69d5de033}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x23f7,0x1d02,0x3431,0x354e,0xba31,0x23a4,0xe6c4,0x6a9c,0x64c,0xea8,0x419f,0xe54f,0x3cb9,0xc02d,0x3caf,0xe7a3,0x2d32,0x31d4,0xed80,0x47d9,0x2086,0x69f4,0x80d3,0x25}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x1d0223f7,0x354e3431,0x23a4ba31,0x6a9ce6c4,0xea8064c,0xe54f419f,0xc02d3cb9,0xe7a33caf,0x31d42d32,0x47d9ed80,0x69f42086,0x2580d3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x354e34311d0223f7,0x6a9ce6c423a4ba31,0xe54f419f0ea8064c,0xe7a33cafc02d3cb9,0x47d9ed8031d42d32,0x2580d369f42086}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x908b,0x38bd,0xe544,0x3c4d,0xb400,0xfea,0xf994,0x3ae4,0x5329,0xcf3d,0x9be,0x9da4,0xd177,0xf41a,0xaede,0x41bf,0x753d,0x8aa4,0x4736,0xb149,0xf4f8,0xb949,0x7b30,0xb8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x38bd908b,0x3c4de544,0xfeab400,0x3ae4f994,0xcf3d5329,0x9da409be,0xf41ad177,0x41bfaede,0x8aa4753d,0xb1494736,0xb949f4f8,0xb87b30}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x3c4de54438bd908b,0x3ae4f9940feab400,0x9da409becf3d5329,0x41bfaedef41ad177,0xb14947368aa4753d,0xb87b30b949f4f8}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x58b3,0x9d97,0x998f,0xea82,0xc940,0x400a,0xec0c,0x9d04,0xbfb4,0x79c4,0x485c,0x525a,0xcaa0,0x36ba,0x94b3,0x828a,0x6102,0x76fe,0xb36f,0x45c1,0xb70f,0xa988,0xb614,0x6c}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9d9758b3,0xea82998f,0x400ac940,0x9d04ec0c,0x79c4bfb4,0x525a485c,0x36bacaa0,0x828a94b3,0x76fe6102,0x45c1b36f,0xa988b70f,0x6cb614}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xea82998f9d9758b3,0x9d04ec0c400ac940,0x525a485c79c4bfb4,0x828a94b336bacaa0,0x45c1b36f76fe6102,0x6cb614a988b70f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xf28e,0x2e0a,0xfab7,0x1f58,0x11ea,0x243,0x39c3,0x28d4,0xe1ba,0x1878,0x3aec,0x4d87,0xf832,0x354a,0xa312,0x7416,0xb5b,0x68ee,0x1627,0x78d2,0xfbbc,0x152f,0x1cb2,0xd1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x2e0af28e,0x1f58fab7,0x24311ea,0x28d439c3,0x1878e1ba,0x4d873aec,0x354af832,0x7416a312,0x68ee0b5b,0x78d21627,0x152ffbbc,0xd11cb2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1f58fab72e0af28e,0x28d439c3024311ea,0x4d873aec1878e1ba,0x7416a312354af832,0x78d2162768ee0b5b,0xd11cb2152ffbbc}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x3134,0x8876,0x4246,0xdd4b,0x87d0,0x86b1,0x71e8,0x2d33,0xfe04,0xe6d8,0x6377,0xf6d6,0xdd4f,0x8b91,0x29d4,0x521e,0x3822,0xa1d5,0x2eb9,0x8c9c,0x35a1,0xab9f,0x2d4c,0x11}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x88763134,0xdd4b4246,0x86b187d0,0x2d3371e8,0xe6d8fe04,0xf6d66377,0x8b91dd4f,0x521e29d4,0xa1d53822,0x8c9c2eb9,0xab9f35a1,0x112d4c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xdd4b424688763134,0x2d3371e886b187d0,0xf6d66377e6d8fe04,0x521e29d48b91dd4f,0x8c9c2eb9a1d53822,0x112d4cab9f35a1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa74d,0x6268,0x6670,0x157d,0x36bf,0xbff5,0x13f3,0x62fb,0x404b,0x863b,0xb7a3,0xada5,0x355f,0xc945,0x6b4c,0x7d75,0x9efd,0x8901,0x4c90,0xba3e,0x48f0,0x5677,0x49eb,0x93}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6268a74d,0x157d6670,0xbff536bf,0x62fb13f3,0x863b404b,0xada5b7a3,0xc945355f,0x7d756b4c,0x89019efd,0xba3e4c90,0x567748f0,0x9349eb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x157d66706268a74d,0x62fb13f3bff536bf,0xada5b7a3863b404b,0x7d756b4cc945355f,0xba3e4c9089019efd,0x9349eb567748f0}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x97d1,0x8f9c,0x8477,0x3a,0x39d2,0x66ae,0xabd6,0x13da,0xf153,0xb9e7,0xf8db,0x5f9f,0x36f7,0xfcb2,0xa4f0,0x62b9,0x5c07,0x3694,0x539d,0xe8c5,0x7631,0xf16c,0xc691,0x9a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x8f9c97d1,0x3a8477,0x66ae39d2,0x13daabd6,0xb9e7f153,0x5f9ff8db,0xfcb236f7,0x62b9a4f0,0x36945c07,0xe8c5539d,0xf16c7631,0x9ac691}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x3a84778f9c97d1,0x13daabd666ae39d2,0x5f9ff8dbb9e7f153,0x62b9a4f0fcb236f7,0xe8c5539d36945c07,0x9ac691f16c7631}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1ac2,0xbac6,0x4a43,0x76df,0xe925,0x4a2d,0x1cf8,0xd32d,0x7867,0x1dc0,0xc02f,0xdf8b,0xf122,0x4f0c,0xe07d,0x4a9e,0xa97,0x7ce2,0x8791,0x3570,0x1749,0x519b,0x34cc,0x66}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xbac61ac2,0x76df4a43,0x4a2de925,0xd32d1cf8,0x1dc07867,0xdf8bc02f,0x4f0cf122,0x4a9ee07d,0x7ce20a97,0x35708791,0x519b1749,0x6634cc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x76df4a43bac61ac2,0xd32d1cf84a2de925,0xdf8bc02f1dc07867,0x4a9ee07d4f0cf122,0x357087917ce20a97,0x6634cc519b1749}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xfb0f,0x234,0xa481,0x9c61,0x4bd1,0xcd58,0x3a72,0xe38c,0xbe7b,0xea3,0xf102,0xdc99,0xf180,0xb229,0x5d86,0xef91,0x46c4,0x8831,0xa9d5,0xf66f,0xa451,0x6c02,0x9ebd,0xfc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x234fb0f,0x9c61a481,0xcd584bd1,0xe38c3a72,0xea3be7b,0xdc99f102,0xb229f180,0xef915d86,0x883146c4,0xf66fa9d5,0x6c02a451,0xfc9ebd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9c61a4810234fb0f,0xe38c3a72cd584bd1,0xdc99f1020ea3be7b,0xef915d86b229f180,0xf66fa9d5883146c4,0xfc9ebd6c02a451}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x682f,0x7063,0x7b88,0xffc5,0xc62d,0x9951,0x5429,0xec25,0xeac,0x4618,0x724,0xa060,0xc908,0x34d,0x5b0f,0x9d46,0xa3f8,0xc96b,0xac62,0x173a,0x89ce,0xe93,0x396e,0x65}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7063682f,0xffc57b88,0x9951c62d,0xec255429,0x46180eac,0xa0600724,0x34dc908,0x9d465b0f,0xc96ba3f8,0x173aac62,0xe9389ce,0x65396e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xffc57b887063682f,0xec2554299951c62d,0xa060072446180eac,0x9d465b0f034dc908,0x173aac62c96ba3f8,0x65396e0e9389ce}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x83a3,0xab6f,0x4f99,0xe1f6,0xc2e8,0x2b61,0xd921,0xec7a,0x4f14,0x7555,0xf78e,0xe0fd,0xb2bf,0x44b,0xfb09,0x107c,0xf365,0x55f7,0x633,0x9bbe,0x409c,0x9c11,0x25b0,0xf1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xab6f83a3,0xe1f64f99,0x2b61c2e8,0xec7ad921,0x75554f14,0xe0fdf78e,0x44bb2bf,0x107cfb09,0x55f7f365,0x9bbe0633,0x9c11409c,0xf125b0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xe1f64f99ab6f83a3,0xec7ad9212b61c2e8,0xe0fdf78e75554f14,0x107cfb09044bb2bf,0x9bbe063355f7f365,0xf125b09c11409c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xdc3d,0x130,0x16ca,0x127f,0x1c5c,0x57d0,0x3ece,0x2e8d,0xc5ae,0xeb26,0x1272,0x6cab,0x79c7,0x7c9,0x321b,0xfeb3,0xc99f,0xb33e,0xefa2,0x62c3,0x7bbe,0x777c,0xc959,0x4e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x130dc3d,0x127f16ca,0x57d01c5c,0x2e8d3ece,0xeb26c5ae,0x6cab1272,0x7c979c7,0xfeb3321b,0xb33ec99f,0x62c3efa2,0x777c7bbe,0x4ec959}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x127f16ca0130dc3d,0x2e8d3ece57d01c5c,0x6cab1272eb26c5ae,0xfeb3321b07c979c7,0x62c3efa2b33ec99f,0x4ec959777c7bbe}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x8f83,0xf9b,0xec59,0x68d7,0x8301,0x787e,0x909b,0x2714,0xe264,0x8ea5,0x9950,0x60f4,0x971d,0x392b,0x4d1b,0xeb9a,0xb9fb,0xdd02,0xcbaa,0x1f24,0x626c,0x6afb,0xfc8,0x91}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xf9b8f83,0x68d7ec59,0x787e8301,0x2714909b,0x8ea5e264,0x60f49950,0x392b971d,0xeb9a4d1b,0xdd02b9fb,0x1f24cbaa,0x6afb626c,0x910fc8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x68d7ec590f9b8f83,0x2714909b787e8301,0x60f499508ea5e264,0xeb9a4d1b392b971d,0x1f24cbaadd02b9fb,0x910fc86afb626c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x7c5d,0x5490,0xb066,0x1e09,0x3d17,0xd49e,0x26de,0x1385,0xb0eb,0x8aaa,0x871,0x1f02,0x4d40,0xfbb4,0x4f6,0xef83,0xc9a,0xaa08,0xf9cc,0x6441,0xbf63,0x63ee,0xda4f,0xe}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x54907c5d,0x1e09b066,0xd49e3d17,0x138526de,0x8aaab0eb,0x1f020871,0xfbb44d40,0xef8304f6,0xaa080c9a,0x6441f9cc,0x63eebf63,0xeda4f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1e09b06654907c5d,0x138526ded49e3d17,0x1f0208718aaab0eb,0xef8304f6fbb44d40,0x6441f9ccaa080c9a,0xeda4f63eebf63}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xac5a,0xcecb,0x4cc7,0x7541,0x64a0,0x2005,0x7606,0x4e82,0x5fda,0x3ce2,0x242e,0x292d,0x6550,0x9b5d,0x4a59,0x4145,0x3081,0xbb7f,0xd9b7,0xa2e0,0x5b87,0x54c4,0x5b0a,0x36}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xcecbac5a,0x75414cc7,0x200564a0,0x4e827606,0x3ce25fda,0x292d242e,0x9b5d6550,0x41454a59,0xbb7f3081,0xa2e0d9b7,0x54c45b87,0x365b0a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x75414cc7cecbac5a,0x4e827606200564a0,0x292d242e3ce25fda,0x41454a599b5d6550,0xa2e0d9b7bb7f3081,0x365b0a54c45b87}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x7947,0x9705,0x7d5b,0xfac,0x88f5,0x8121,0x1ce1,0x146a,0x70dd,0xc3c,0x9d76,0x26c3,0x7c19,0x1aa5,0x5189,0xba0b,0x5ad,0xb477,0xb13,0x3c69,0xfdde,0xa97,0x8e59,0x68}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x97057947,0xfac7d5b,0x812188f5,0x146a1ce1,0xc3c70dd,0x26c39d76,0x1aa57c19,0xba0b5189,0xb47705ad,0x3c690b13,0xa97fdde,0x688e59}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xfac7d5b97057947,0x146a1ce1812188f5,0x26c39d760c3c70dd,0xba0b51891aa57c19,0x3c690b13b47705ad,0x688e590a97fdde}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x189a,0x443b,0xa123,0x6ea5,0xc3e8,0x4358,0xb8f4,0x1699,0x7f02,0xf36c,0x31bb,0xfb6b,0xeea7,0x45c8,0x14ea,0x290f,0x9c11,0xd0ea,0x175c,0xc64e,0x9ad0,0x55cf,0x96a6,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x443b189a,0x6ea5a123,0x4358c3e8,0x1699b8f4,0xf36c7f02,0xfb6b31bb,0x45c8eea7,0x290f14ea,0xd0ea9c11,0xc64e175c,0x55cf9ad0,0x896a6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x6ea5a123443b189a,0x1699b8f44358c3e8,0xfb6b31bbf36c7f02,0x290f14ea45c8eea7,0xc64e175cd0ea9c11,0x896a655cf9ad0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x53a7,0x3134,0xb338,0x8abe,0x9b5f,0xdffa,0x89f9,0xb17d,0xa025,0xc31d,0xdbd1,0xd6d2,0x9aaf,0x64a2,0xb5a6,0xbeba,0xcf7e,0x4480,0x2648,0x5d1f,0xa478,0xab3b,0xa4f5,0xc9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x313453a7,0x8abeb338,0xdffa9b5f,0xb17d89f9,0xc31da025,0xd6d2dbd1,0x64a29aaf,0xbebab5a6,0x4480cf7e,0x5d1f2648,0xab3ba478,0xc9a4f5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x8abeb338313453a7,0xb17d89f9dffa9b5f,0xd6d2dbd1c31da025,0xbebab5a664a29aaf,0x5d1f26484480cf7e,0xc9a4f5ab3ba478}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x194c, 0x43, 0xc70, 0x1c7a, 0xa7a, 0xdf7, 0x1564, 0x1809, 0x8e8, 0x3a5, 0x1399, 0xf0a, 0x914, 0x1a27, 0xb1c, 0xcd0, 0xfc, 0xaa4, 0xd87, 0x1ed2, 0x2c0, 0x8e4, 0x1b93, 0x1a3f, 0x1d9b, 0x1a00, 0xbce, 0x17d2, 0x1a07, 0xf} +#elif RADIX == 32 +{0x21e531, 0xb8f4c70, 0x46fba9e, 0xa301356, 0x991d2a3, 0x451e153, 0xb1cd13a, 0x3f19a0, 0x4d87552, 0x20b03da, 0x7fb9347, 0x766f4, 0xfa4bced, 0x3d81e} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xba9eb8f4c70021e5, 0x91d2a3a30135646f, 0xb1cd13a451e1539, 0x3da4d8755203f19a, 0x766f47fb934720b0, 0xcae81efa4bced00} +#else +{0x3d71e98e0043ca, 0xe8c04d591beea, 0x5228f0a9cc8e95, 0x203f19a0b1cd13, 0x641607b49b0eaa, 0x401d9bd1fee4d1, 0x65740f7d25e76} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x1ed1, 0x10, 0x131c, 0x171e, 0x1a9e, 0x37d, 0xd59, 0x602, 0xa3a, 0x8e9, 0x14e6, 0x3c2, 0x1a45, 0x689, 0x2c7, 0x334, 0x3f, 0x1aa9, 0x1361, 0x7b4, 0xb0, 0x1a39, 0x1ee4, 0x1e8f, 0x766, 0x1680, 0x12f3, 0x1df4, 0x1e81, 0x4} +#elif RADIX == 32 +{0x87b44, 0xae3d31c, 0x91beea7, 0xe8c04d5, 0xe6474a8, 0x9147854, 0x2c7344e, 0x80fc668, 0x9361d54, 0xc82c0f6, 0x1fee4d1, 0x401d9bd, 0xbe92f3b, 0x27a07} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xeea7ae3d31c0087b, 0x6474a8e8c04d591b, 0x82c7344e9147854e, 0xf69361d5480fc66, 0x1d9bd1fee4d1c82c, 0x116ba07be92f3b40} +#else +{0x4f5c7a638010f6, 0x23a30135646fba, 0x748a3c2a7323a5, 0x480fc6682c7344, 0x390581ed26c3aa, 0x500766f47fb934, 0x8b5d03df4979d} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x187c, 0x10c9, 0xfda, 0x189b, 0x3b, 0xbcd, 0x16ab, 0xabe, 0x102, 0x19b7, 0x288, 0x1c7e, 0x1ee8, 0x452, 0x853, 0x1b5a, 0x1ca8, 0x1129, 0xd16, 0x168a, 0x1414, 0x6ed, 0xc0, 0xda2, 0x19ae, 0x12fe, 0x1813, 0xdd8, 0x102e, 0x1f} +#elif RADIX == 32 +{0x864e1f3, 0xf136fda, 0xb5e680e, 0x957d6a, 0x88cdb84, 0xba38fc2, 0x8532297, 0xf2a36b4, 0x4d16894, 0x6d052d1, 0x440c037, 0x7f66b9b, 0xbb18139, 0x390b9} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x680ef136fda864e1, 0x8cdb840957d6ab5e, 0x48532297ba38fc28, 0x2d14d16894f2a36b, 0x66b9b440c0376d05, 0x3dec0b9bb181397f} +#else +{0x1de26dfb50c9c3, 0x10255f5aad79a0, 0x3dd1c7e14466dc, 0x4f2a36b4853229, 0x6da0a5a29a2d12, 0x5fd9ae6d10300d, 0xeb605cdd8c09c} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1ca3, 0x16ad, 0x12b3, 0x9d7, 0xb37, 0x118b, 0xb22, 0x1662, 0xa8f, 0xd68, 0x6d5, 0x1a1f, 0x1f29, 0x632, 0x1b7e, 0xb6, 0xba7, 0xeca, 0x11ed, 0x13b, 0x18cc, 0x19a2, 0x77, 0x1582, 0x11ff, 0xc5f, 0x7de, 0x4b1, 0x1a7f, 0x18} +#elif RADIX == 32 +{0xb56f28f, 0xd3af2b3, 0x28c5acd, 0x3ecc4b2, 0xd56b42a, 0xca743e6, 0xb7e3197, 0x2e9c16d, 0x71ed765, 0x1633027, 0x4077cd, 0x2fc7feb, 0x9627de6, 0x39fc} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x5acdd3af2b3b56f2, 0x56b42a3ecc4b228c, 0xdb7e3197ca743e6d, 0x2771ed7652e9c16, 0xc7feb04077cd1633, 0x24529fc9627de62f} +#else +{0x1ba75e5676ade5, 0x28fb312c8a316b, 0x3e53a1f36ab5a1, 0x52e9c16db7e319, 0x22c6604ee3daec, 0xbf1ffac101df3, 0x1e94fe4b13ef3} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1f7a, 0x1a13, 0x11f4, 0xaeb, 0x997, 0x12d, 0x315, 0x1d7, 0x2fc, 0x736, 0x927, 0x350, 0x695, 0x14ac, 0x703, 0x1ec7, 0x1567, 0x1527, 0x7ee, 0x1a23, 0x11aa, 0x919, 0x130b, 0x199e, 0x137d, 0x795, 0x4e4, 0x1dc6, 0xa87, 0xd} +#elif RADIX == 32 +{0xd09fde9, 0xd5d71f4, 0x5096a65, 0xf03ae31, 0x2739b0b, 0xa546a09, 0x703a561, 0xd59fd8e, 0x67eea93, 0xcc6ab44, 0x3d30b48, 0xcacdf73, 0xb8c4e43, 0x29a1f} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x6a65d5d71f4d09fd, 0x739b0bf03ae31509, 0xe703a561a546a092, 0xb4467eea93d59fd8, 0xcdf733d30b48cc6a, 0x3b52a1fb8c4e43ca} +#else +{0x4babae3e9a13fb, 0x2fc0eb8c5425a9, 0xd2a3504939cd8, 0x3d59fd8e703a56, 0x198d5688cfdd52, 0x72b37dccf4c2d2, 0xd6950fdc62721} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0xa54, 0x1685, 0x1b20, 0x1632, 0x1047, 0x159e, 0x14a0, 0x94c, 0x3c8, 0x793, 0x3a2, 0x1938, 0x1899, 0x15b7, 0xefa, 0xcc8, 0x12c3, 0x1335, 0x4ef, 0x1e93, 0x1861, 0x1602, 0x1d6c, 0x1ae7, 0x187, 0x18b1, 0x857, 0x8da, 0x12f7, 0xa} +#elif RADIX == 32 +{0xb42a951, 0xec65b20, 0xacf411, 0x212994a, 0xa23c98f, 0x2672703, 0xefaadbe, 0xcb0d990, 0x64ef99a, 0x16187d2, 0xcfd6cb0, 0x58861f5, 0x1b4857c, 0x13bdd} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xf411ec65b20b42a9, 0x23c98f212994a0ac, 0xefaadbe2672703a, 0x7d264ef99acb0d99, 0x861f5cfd6cb01618, 0x14a4bdd1b4857c58} +#else +{0x23d8cb64168552, 0x3c84a65282b3d0, 0x71339381d11e4c, 0x2cb0d990efaadb, 0x2c30fa4c9df33, 0x162187d73f5b2c, 0xa525ee8da42be} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1e6b, 0x111, 0x74d, 0xb04, 0x738, 0x178f, 0xdc5, 0x835, 0x724, 0xaf9, 0xf3c, 0x1855, 0x266, 0x1b16, 0x1cf0, 0x1aa3, 0x32f, 0xce, 0x1f26, 0x16ba, 0x1cb6, 0x9b8, 0x12de, 0x1cef, 0x1a72, 0x1d68, 0xa02, 0x1c67, 0xa67, 0x13} +#elif RADIX == 32 +{0x88f9ae, 0x160874d, 0x5bc79ce, 0x9106adc, 0x3c57c9c, 0x99b0aaf, 0xcf0d8b0, 0xcbf547, 0x5f26067, 0xc72dad7, 0xdf2de4d, 0xb469cb9, 0x8cea02e, 0x1899f} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x79ce160874d088f9, 0xc57c9c9106adc5bc, 0x7cf0d8b099b0aaf3, 0xad75f260670cbf54, 0x69cb9df2de4dc72d, 0x2c4699f8cea02eb4} +#else +{0x1c2c10e9a111f3, 0x72441ab716f1e7, 0x4cd85579e2be4, 0x70cbf547cf0d8b, 0x38e5b5aebe4c0c, 0x2d1a72e77cb793, 0x5e34cfc675017} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x12d6, 0x1c7a, 0x9bb, 0x1ce1, 0x1ca, 0xf3f, 0x1036, 0x19a6, 0x1c79, 0x5bf, 0x3, 0x1a92, 0x1d08, 0xeaa, 0x11e8, 0xab1, 0x1ed2, 0x80c, 0x10c9, 0x1517, 0xc18, 0x1513, 0x1dff, 0xc00, 0x16a0, 0x14ce, 0x72d, 0x1a86, 0xd45, 0x19} +#elif RADIX == 32 +{0xe3d4b5b, 0xb9c29bb, 0x679f872, 0xe734d03, 0x32dff1, 0x4235240, 0x1e87557, 0x7b49563, 0xf0c9406, 0x9b062a2, 0x1dffa8, 0x675a818, 0x50c72da, 0x8517} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xf872b9c29bbe3d4b, 0x32dff1e734d03679, 0x31e8755742352400, 0x2a2f0c94067b4956, 0x5a81801dffa89b06, 0x172351750c72da67} +#else +{0x657385377c7a96, 0x479cd340d9e7e1, 0x3a11a9200196ff, 0x67b495631e8755, 0x1360c545e19280, 0x19d6a060077fea, 0xb91a8ba86396d} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x8d4f,0xfa2a,0xd4d0,0xce2,0x7436,0x8079,0xbe5f,0x2c18,0x5699,0x3569,0x7ecd,0xe106,0xea0,0x7d91,0xcc95,0x7293,0x5f1d,0xd812,0xb900,0x9858,0xd95a,0xc80e,0x1d4a,0xa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xfa2a8d4f,0xce2d4d0,0x80797436,0x2c18be5f,0x35695699,0xe1067ecd,0x7d910ea0,0x7293cc95,0xd8125f1d,0x9858b900,0xc80ed95a,0xa1d4a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xce2d4d0fa2a8d4f,0x2c18be5f80797436,0xe1067ecd35695699,0x7293cc957d910ea0,0x9858b900d8125f1d,0xa1d4ac80ed95a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1eca,0x7027,0xf189,0x93f2,0x1c1f,0x5a6f,0xabbc,0x9e7d,0xa00a,0xc45,0x62a8,0x8db0,0x70cd,0x413f,0x400a,0xffaa,0x2ae6,0xd8a8,0xcb0e,0x69c4,0x7d9a,0x7a25,0xa679,0xad}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x70271eca,0x93f2f189,0x5a6f1c1f,0x9e7dabbc,0xc45a00a,0x8db062a8,0x413f70cd,0xffaa400a,0xd8a82ae6,0x69c4cb0e,0x7a257d9a,0xada679}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x93f2f18970271eca,0x9e7dabbc5a6f1c1f,0x8db062a80c45a00a,0xffaa400a413f70cd,0x69c4cb0ed8a82ae6,0xada6797a257d9a}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x8949,0xfec5,0x9be5,0xc657,0xab10,0x2df6,0x3ee,0xc0f7,0x1a64,0x328e,0x3b3,0xb50c,0x650a,0xa23d,0x8ab,0xb103,0xf6e6,0xb27d,0x708a,0xc702,0x5301,0x2f00,0x9991,0x2f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xfec58949,0xc6579be5,0x2df6ab10,0xc0f703ee,0x328e1a64,0xb50c03b3,0xa23d650a,0xb10308ab,0xb27df6e6,0xc702708a,0x2f005301,0x2f9991}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xc6579be5fec58949,0xc0f703ee2df6ab10,0xb50c03b3328e1a64,0xb10308aba23d650a,0xc702708ab27df6e6,0x2f99912f005301}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x72b1,0x5d5,0x2b2f,0xf31d,0x8bc9,0x7f86,0x41a0,0xd3e7,0xa966,0xca96,0x8132,0x1ef9,0xf15f,0x826e,0x336a,0x8d6c,0xa0e2,0x27ed,0x46ff,0x67a7,0x26a5,0x37f1,0xe2b5,0xf5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x5d572b1,0xf31d2b2f,0x7f868bc9,0xd3e741a0,0xca96a966,0x1ef98132,0x826ef15f,0x8d6c336a,0x27eda0e2,0x67a746ff,0x37f126a5,0xf5e2b5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xf31d2b2f05d572b1,0xd3e741a07f868bc9,0x1ef98132ca96a966,0x8d6c336a826ef15f,0x67a746ff27eda0e2,0xf5e2b537f126a5}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa74d,0x6268,0x6670,0x157d,0x36bf,0xbff5,0x13f3,0x62fb,0x404b,0x863b,0xb7a3,0xada5,0x355f,0xc945,0x6b4c,0x7d75,0x9efd,0x8901,0x4c90,0xba3e,0x48f0,0x5677,0x49eb,0x93}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6268a74d,0x157d6670,0xbff536bf,0x62fb13f3,0x863b404b,0xada5b7a3,0xc945355f,0x7d756b4c,0x89019efd,0xba3e4c90,0x567748f0,0x9349eb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x157d66706268a74d,0x62fb13f3bff536bf,0xada5b7a3863b404b,0x7d756b4cc945355f,0xba3e4c9089019efd,0x9349eb567748f0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xd72,0xd1f5,0x548,0xe0a7,0xee15,0xfdbc,0xc63c,0xd72b,0x1e45,0xe787,0xc513,0xb278,0x7cd,0xcab5,0x5ced,0x8be9,0xf4a4,0x9711,0xe9d8,0x872d,0x443,0xead0,0xe34d,0x2e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xd1f50d72,0xe0a70548,0xfdbcee15,0xd72bc63c,0xe7871e45,0xb278c513,0xcab507cd,0x8be95ced,0x9711f4a4,0x872de9d8,0xead00443,0x2ee34d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xe0a70548d1f50d72,0xd72bc63cfdbcee15,0xb278c513e7871e45,0x8be95cedcab507cd,0x872de9d89711f4a4,0x2ee34dead00443}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xcecc,0x7789,0xbdb9,0x22b4,0x782f,0x794e,0x8e17,0xd2cc,0x1fb,0x1927,0x9c88,0x929,0x22b0,0x746e,0xd62b,0xade1,0xc7dd,0x5e2a,0xd146,0x7363,0xca5e,0x5460,0xd2b3,0xee}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7789cecc,0x22b4bdb9,0x794e782f,0xd2cc8e17,0x192701fb,0x9299c88,0x746e22b0,0xade1d62b,0x5e2ac7dd,0x7363d146,0x5460ca5e,0xeed2b3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x22b4bdb97789cecc,0xd2cc8e17794e782f,0x9299c88192701fb,0xade1d62b746e22b0,0x7363d1465e2ac7dd,0xeed2b35460ca5e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x58b3,0x9d97,0x998f,0xea82,0xc940,0x400a,0xec0c,0x9d04,0xbfb4,0x79c4,0x485c,0x525a,0xcaa0,0x36ba,0x94b3,0x828a,0x6102,0x76fe,0xb36f,0x45c1,0xb70f,0xa988,0xb614,0x6c}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9d9758b3,0xea82998f,0x400ac940,0x9d04ec0c,0x79c4bfb4,0x525a485c,0x36bacaa0,0x828a94b3,0x76fe6102,0x45c1b36f,0xa988b70f,0x6cb614}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xea82998f9d9758b3,0x9d04ec0c400ac940,0x525a485c79c4bfb4,0x828a94b336bacaa0,0x45c1b36f76fe6102,0x6cb614a988b70f}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1ebb,0xe120,0x35fc,0x20e3,0xba01,0xff68,0x2ef4,0x62f6,0x5e93,0x94c1,0x3f93,0x804c,0xddc5,0x5b3d,0x1d31,0xf673,0x6e47,0x3d32,0x242c,0x6f7e,0x764b,0x63cb,0xbf4,0xf7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xe1201ebb,0x20e335fc,0xff68ba01,0x62f62ef4,0x94c15e93,0x804c3f93,0x5b3dddc5,0xf6731d31,0x3d326e47,0x6f7e242c,0x63cb764b,0xf70bf4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x20e335fce1201ebb,0x62f62ef4ff68ba01,0x804c3f9394c15e93,0xf6731d315b3dddc5,0x6f7e242c3d326e47,0xf70bf463cb764b}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xe76c,0x34d0,0x684,0xee5,0x43c6,0x5a38,0x4bd5,0x2867,0xd3c5,0x2ee1,0xf790,0x18bf,0xbb64,0x3924,0x7d25,0xe0bc,0x913a,0x1355,0x50e9,0x7091,0x6724,0x21b2,0xc027,0xaa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x34d0e76c,0xee50684,0x5a3843c6,0x28674bd5,0x2ee1d3c5,0x18bff790,0x3924bb64,0xe0bc7d25,0x1355913a,0x709150e9,0x21b26724,0xaac027}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xee5068434d0e76c,0x28674bd55a3843c6,0x18bff7902ee1d3c5,0xe0bc7d253924bb64,0x709150e91355913a,0xaac02721b26724}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xbd01,0x45bb,0x58bc,0x8007,0xbf5b,0xfd7,0x440b,0x7f9,0x54ed,0xe5db,0x2ba9,0xcd7b,0xfc98,0x1314,0x1470,0x9e9b,0xca3,0x944c,0x73c6,0x4cc9,0xa757,0x45fe,0x8b40,0x46}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x45bbbd01,0x800758bc,0xfd7bf5b,0x7f9440b,0xe5db54ed,0xcd7b2ba9,0x1314fc98,0x9e9b1470,0x944c0ca3,0x4cc973c6,0x45fea757,0x468b40}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x800758bc45bbbd01,0x7f9440b0fd7bf5b,0xcd7b2ba9e5db54ed,0x9e9b14701314fc98,0x4cc973c6944c0ca3,0x468b4045fea757}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xe145,0x1edf,0xca03,0xdf1c,0x45fe,0x97,0xd10b,0x9d09,0xa16c,0x6b3e,0xc06c,0x7fb3,0x223a,0xa4c2,0xe2ce,0x98c,0x91b8,0xc2cd,0xdbd3,0x9081,0x89b4,0x9c34,0xf40b,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x1edfe145,0xdf1cca03,0x9745fe,0x9d09d10b,0x6b3ea16c,0x7fb3c06c,0xa4c2223a,0x98ce2ce,0xc2cd91b8,0x9081dbd3,0x9c3489b4,0x8f40b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xdf1cca031edfe145,0x9d09d10b009745fe,0x7fb3c06c6b3ea16c,0x98ce2cea4c2223a,0x9081dbd3c2cd91b8,0x8f40b9c3489b4}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x8d4f,0xfa2a,0xd4d0,0xce2,0x7436,0x8079,0xbe5f,0x2c18,0x5699,0x3569,0x7ecd,0xe106,0xea0,0x7d91,0xcc95,0x7293,0x5f1d,0xd812,0xb900,0x9858,0xd95a,0xc80e,0x1d4a,0xa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xfa2a8d4f,0xce2d4d0,0x80797436,0x2c18be5f,0x35695699,0xe1067ecd,0x7d910ea0,0x7293cc95,0xd8125f1d,0x9858b900,0xc80ed95a,0xa1d4a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xce2d4d0fa2a8d4f,0x2c18be5f80797436,0xe1067ecd35695699,0x7293cc957d910ea0,0x9858b900d8125f1d,0xa1d4ac80ed95a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1eca,0x7027,0xf189,0x93f2,0x1c1f,0x5a6f,0xabbc,0x9e7d,0xa00a,0xc45,0x62a8,0x8db0,0x70cd,0x413f,0x400a,0xffaa,0x2ae6,0xd8a8,0xcb0e,0x69c4,0x7d9a,0x7a25,0xa679,0xad}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x70271eca,0x93f2f189,0x5a6f1c1f,0x9e7dabbc,0xc45a00a,0x8db062a8,0x413f70cd,0xffaa400a,0xd8a82ae6,0x69c4cb0e,0x7a257d9a,0xada679}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x93f2f18970271eca,0x9e7dabbc5a6f1c1f,0x8db062a80c45a00a,0xffaa400a413f70cd,0x69c4cb0ed8a82ae6,0xada6797a257d9a}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x8949,0xfec5,0x9be5,0xc657,0xab10,0x2df6,0x3ee,0xc0f7,0x1a64,0x328e,0x3b3,0xb50c,0x650a,0xa23d,0x8ab,0xb103,0xf6e6,0xb27d,0x708a,0xc702,0x5301,0x2f00,0x9991,0x2f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xfec58949,0xc6579be5,0x2df6ab10,0xc0f703ee,0x328e1a64,0xb50c03b3,0xa23d650a,0xb10308ab,0xb27df6e6,0xc702708a,0x2f005301,0x2f9991}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xc6579be5fec58949,0xc0f703ee2df6ab10,0xb50c03b3328e1a64,0xb10308aba23d650a,0xc702708ab27df6e6,0x2f99912f005301}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x72b1,0x5d5,0x2b2f,0xf31d,0x8bc9,0x7f86,0x41a0,0xd3e7,0xa966,0xca96,0x8132,0x1ef9,0xf15f,0x826e,0x336a,0x8d6c,0xa0e2,0x27ed,0x46ff,0x67a7,0x26a5,0x37f1,0xe2b5,0xf5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x5d572b1,0xf31d2b2f,0x7f868bc9,0xd3e741a0,0xca96a966,0x1ef98132,0x826ef15f,0x8d6c336a,0x27eda0e2,0x67a746ff,0x37f126a5,0xf5e2b5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xf31d2b2f05d572b1,0xd3e741a07f868bc9,0x1ef98132ca96a966,0x8d6c336a826ef15f,0x67a746ff27eda0e2,0xf5e2b537f126a5}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x53a7,0x3134,0xb338,0x8abe,0x9b5f,0xdffa,0x89f9,0xb17d,0xa025,0xc31d,0xdbd1,0xd6d2,0x9aaf,0x64a2,0xb5a6,0xbeba,0xcf7e,0x4480,0x2648,0x5d1f,0xa478,0xab3b,0xa4f5,0xc9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x313453a7,0x8abeb338,0xdffa9b5f,0xb17d89f9,0xc31da025,0xd6d2dbd1,0x64a29aaf,0xbebab5a6,0x4480cf7e,0x5d1f2648,0xab3ba478,0xc9a4f5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x8abeb338313453a7,0xb17d89f9dffa9b5f,0xd6d2dbd1c31da025,0xbebab5a664a29aaf,0x5d1f26484480cf7e,0xc9a4f5ab3ba478}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x86b9,0x68fa,0x82a4,0xf053,0x770a,0x7ede,0xe31e,0xeb95,0x8f22,0xf3c3,0x6289,0xd93c,0x83e6,0xe55a,0xae76,0x45f4,0xfa52,0x4b88,0xf4ec,0xc396,0x221,0xf568,0x71a6,0x97}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x68fa86b9,0xf05382a4,0x7ede770a,0xeb95e31e,0xf3c38f22,0xd93c6289,0xe55a83e6,0x45f4ae76,0x4b88fa52,0xc396f4ec,0xf5680221,0x9771a6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xf05382a468fa86b9,0xeb95e31e7ede770a,0xd93c6289f3c38f22,0x45f4ae76e55a83e6,0xc396f4ec4b88fa52,0x9771a6f5680221}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xe766,0xbbc4,0x5edc,0x915a,0x3c17,0xbca7,0x470b,0xe966,0x80fd,0xc93,0xce44,0x494,0x1158,0xba37,0xeb15,0xd6f0,0x63ee,0x2f15,0xe8a3,0x39b1,0x652f,0xaa30,0x6959,0xf7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xbbc4e766,0x915a5edc,0xbca73c17,0xe966470b,0xc9380fd,0x494ce44,0xba371158,0xd6f0eb15,0x2f1563ee,0x39b1e8a3,0xaa30652f,0xf76959}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x915a5edcbbc4e766,0xe966470bbca73c17,0x494ce440c9380fd,0xd6f0eb15ba371158,0x39b1e8a32f1563ee,0xf76959aa30652f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xac5a,0xcecb,0x4cc7,0x7541,0x64a0,0x2005,0x7606,0x4e82,0x5fda,0x3ce2,0x242e,0x292d,0x6550,0x9b5d,0x4a59,0x4145,0x3081,0xbb7f,0xd9b7,0xa2e0,0x5b87,0x54c4,0x5b0a,0x36}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xcecbac5a,0x75414cc7,0x200564a0,0x4e827606,0x3ce25fda,0x292d242e,0x9b5d6550,0x41454a59,0xbb7f3081,0xa2e0d9b7,0x54c45b87,0x365b0a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x75414cc7cecbac5a,0x4e827606200564a0,0x292d242e3ce25fda,0x41454a599b5d6550,0xa2e0d9b7bb7f3081,0x365b0a54c45b87}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x3e42,0x35b4,0xc315,0x4acc,0x7905,0x734e,0xe57,0x941d,0xcc00,0x9010,0x652,0x5679,0x1e7c,0x69d5,0x77f0,0x5936,0x9815,0xdc49,0xdbae,0x8415,0x2381,0x706d,0x1b55,0x35}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x35b43e42,0x4accc315,0x734e7905,0x941d0e57,0x9010cc00,0x56790652,0x69d51e7c,0x593677f0,0xdc499815,0x8415dbae,0x706d2381,0x351b55}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x4accc31535b43e42,0x941d0e57734e7905,0x567906529010cc00,0x593677f069d51e7c,0x8415dbaedc499815,0x351b55706d2381}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x9f23,0x1f88,0x311a,0x8d4e,0x15a2,0x199f,0x997,0x8bcf,0xc7a0,0xc956,0x3de8,0x254b,0x1224,0x1a69,0x604a,0x9cb1,0xa8f7,0xc6ee,0x5903,0x65b8,0xe8a5,0xa271,0x7d6e,0xb3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x1f889f23,0x8d4e311a,0x199f15a2,0x8bcf0997,0xc956c7a0,0x254b3de8,0x1a691224,0x9cb1604a,0xc6eea8f7,0x65b85903,0xa271e8a5,0xb37d6e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x8d4e311a1f889f23,0x8bcf0997199f15a2,0x254b3de8c956c7a0,0x9cb1604a1a691224,0x65b85903c6eea8f7,0xb37d6ea271e8a5}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xfad4,0x9280,0x39ea,0xba3b,0xb12b,0x1c9c,0x5ffd,0x2c19,0x13bf,0x2145,0xaf34,0x30c1,0x70d8,0x27ea,0x6539,0xb50a,0x3106,0x3638,0x7fad,0xa5d2,0x912a,0xb0e6,0xb4a1,0xfd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9280fad4,0xba3b39ea,0x1c9cb12b,0x2c195ffd,0x214513bf,0x30c1af34,0x27ea70d8,0xb50a6539,0x36383106,0xa5d27fad,0xb0e6912a,0xfdb4a1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xba3b39ea9280fad4,0x2c195ffd1c9cb12b,0x30c1af34214513bf,0xb50a653927ea70d8,0xa5d27fad36383106,0xfdb4a1b0e6912a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xc1be,0xca4b,0x3cea,0xb533,0x86fa,0x8cb1,0xf1a8,0x6be2,0x33ff,0x6fef,0xf9ad,0xa986,0xe183,0x962a,0x880f,0xa6c9,0x67ea,0x23b6,0x2451,0x7bea,0xdc7e,0x8f92,0xe4aa,0xca}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xca4bc1be,0xb5333cea,0x8cb186fa,0x6be2f1a8,0x6fef33ff,0xa986f9ad,0x962ae183,0xa6c9880f,0x23b667ea,0x7bea2451,0x8f92dc7e,0xcae4aa}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xb5333ceaca4bc1be,0x6be2f1a88cb186fa,0xa986f9ad6fef33ff,0xa6c9880f962ae183,0x7bea245123b667ea,0xcae4aa8f92dc7e}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x9a9, 0x8c7, 0x119d, 0xada, 0x1d98, 0xc97, 0x1a31, 0xdc6, 0x192a, 0xf3c, 0x509, 0xc5b, 0xea7, 0x1eb9, 0x59d, 0x1e3c, 0x114b, 0x88, 0x5a9, 0x1154, 0x18c0, 0x11db, 0x1ba9, 0x3b8, 0x837, 0x18d0, 0x17eb, 0x211, 0x1aa7, 0x11} +#elif RADIX == 32 +{0x463a6a6, 0x15b519d, 0x164bf66, 0xa9b8da3, 0x979e64, 0xa9d8b65, 0x59df5cb, 0x452fc78, 0x85a9044, 0xde3022a, 0x71ba98e, 0x6820dc7, 0x4237ebc, 0xca9c} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xbf6615b519d463a6, 0x979e64a9b8da3164, 0x859df5cba9d8b650, 0x22a85a9044452fc7, 0x20dc771ba98ede30, 0x2a32a9c4237ebc68} +#else +{0x4c2b6a33a8c74d, 0x12a6e368c592fd, 0x5d4ec5b284bcf3, 0x4452fc7859df5c, 0x5bc604550b5208, 0x1a08371dc6ea63, 0x4d954e211bf5e} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x1ae8, 0xa31, 0x1467, 0x2b6, 0x1f66, 0xb25, 0x168c, 0x1371, 0x64a, 0xbcf, 0x1942, 0x1b16, 0xba9, 0xfae, 0x167, 0x1f8f, 0x452, 0x822, 0x16a, 0x455, 0x1e30, 0xc76, 0x6ea, 0x18ee, 0x20d, 0x1e34, 0xdfa, 0x1884, 0x12a9, 0xd} +#elif RADIX == 32 +{0x518eba1, 0x856d467, 0xc592fd9, 0x2a6e368, 0x425e799, 0xea762d9, 0x1677d72, 0x114bf1e, 0xa16a411, 0xb78c08a, 0xdc6ea63, 0x1a08371, 0x108dfaf, 0x2baa7} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x2fd9856d467518eb, 0x25e7992a6e368c59, 0xe1677d72ea762d94, 0x8aa16a411114bf1, 0x8371dc6ea63b78c, 0x290caa7108dfaf1a} +#else +{0x330ada8cea31d7, 0x64a9b8da3164bf, 0x1753b16ca12f3c, 0x1114bf1e1677d7, 0x76f1811542d482, 0x46820dc771ba98, 0x4465538846fd7} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x954, 0x49a, 0xee7, 0x1037, 0x171c, 0x81, 0x448, 0x76f, 0x1615, 0xefe, 0xe70, 0xc54, 0x3d4, 0xc30, 0x1aaf, 0x72c, 0x464, 0x7a7, 0x5b7, 0x1f2a, 0xa98, 0x8db, 0x1689, 0x1cc1, 0x11ae, 0x4bf, 0x1ddc, 0x1f93, 0x1b3e, 0xb} +#elif RADIX == 32 +{0x24d2551, 0x206eee7, 0x8040dc7, 0x54ede44, 0x7077f58, 0xf518a8e, 0xaaf6180, 0x9190e59, 0x45b73d3, 0xdaa63e5, 0x8368946, 0x5fc6bb9, 0xf27ddc2, 0x1dcfb} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xdc7206eee724d25, 0x77f5854ede44804, 0x9aaf6180f518a8e7, 0x3e545b73d39190e5, 0xc6bb98368946daa6, 0x14aecfbf27ddc25f} +#else +{0xe40dddce49a4a, 0x6153b791201037, 0x7a8c547383bfa, 0x39190e59aaf618, 0x5b54c7ca8b6e7a, 0x17f1aee60da251, 0xa5767df93eee1} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0xf14, 0xa31, 0x805, 0x19bd, 0x1b37, 0x5d5, 0x1211, 0x9c0, 0x557, 0x6b5, 0x1b2a, 0x775, 0x1a4f, 0x1d9, 0x520, 0x16be, 0x3d, 0x1cae, 0x4ca, 0x1a17, 0x1e64, 0x170b, 0x136, 0x1cd4, 0x150b, 0x1111, 0xf0b, 0x1af9, 0x3ce, 0x1c} +#elif RADIX == 32 +{0x518bc53, 0xf37a805, 0x12eaecd, 0x5d38121, 0x2a35a95, 0x93ceebb, 0x5200ece, 0xf6d7c, 0xe4cae57, 0x5f99342, 0xa8136b8, 0x88d42f9, 0x5f2f0b8, 0x1df3b} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xaecdf37a805518bc, 0xa35a955d3812112e, 0xc5200ece93ceebb2, 0x342e4cae5700f6d7, 0xd42f9a8136b85f99, 0x1530f3b5f2f0b888} +#else +{0x1be6f500aa3178, 0x5574e04844babb, 0x749e775d951ad4, 0x700f6d7c5200ec, 0xbf32685c995ca, 0x22350be6a04dae, 0xa9879daf9785c} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1b6e, 0x5aa, 0x1bd9, 0x1e85, 0x1615, 0x1629, 0xb8b, 0x1066, 0x1532, 0x19ad, 0xe24, 0xcb8, 0x17fc, 0x2ab, 0x1726, 0x1ad5, 0x1c83, 0x1b32, 0x75e, 0x1794, 0x161d, 0x9c4, 0x11b6, 0x1c02, 0x14bb, 0x15d2, 0x10d5, 0x26b, 0x1765, 0x14} +#elif RADIX == 32 +{0x2d56dba, 0x7d0bbd9, 0xbb14d85, 0xca0ccb8, 0x24cd6d4, 0xff1970e, 0x726155d, 0x720f5ab, 0x875ed99, 0x25876f2, 0x51b64e, 0xe952ef8, 0x4d70d5a, 0x23d94} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x4d857d0bbd92d56d, 0x4cd6d4ca0ccb8bb1, 0xb726155dff1970e2, 0x6f2875ed99720f5a, 0x52ef8051b64e2587, 0x2f5dd944d70d5ae9} +#else +{0xafa177b25aadb, 0x5328332e2ec536, 0x6ff8cb871266b6, 0x1720f5ab726155, 0x44b0ede50ebdb3, 0x3a54bbe0146d93, 0x76eeca26b86ad} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x18aa, 0x459, 0x747, 0x401, 0x14be, 0x13ba, 0xafb, 0x1cb4, 0x636, 0xd10, 0x16ec, 0x1e6e, 0x1ee5, 0x1475, 0xf82, 0x1695, 0x1a54, 0xe4e, 0x1856, 0x459, 0x752, 0x1d56, 0x15a7, 0xde2, 0x158c, 0x623, 0x17, 0x10d9, 0x1156, 0x19} +#elif RADIX == 32 +{0x22ce2ab, 0x8802747, 0xb9dd52f, 0xdb968af, 0xec68818, 0xb97cdd6, 0xf82a3af, 0x6952d2a, 0x3856727, 0xb1d488b, 0xc55a7ea, 0x11d631b, 0x1b20173, 0x955a} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xd52f880274722ce2, 0xc68818db968afb9d, 0xaf82a3afb97cdd6e, 0x88b38567276952d2, 0xd631bc55a7eab1d4, 0x2b7455a1b2017311} +#else +{0x5f1004e8e459c5, 0x636e5a2bee7754, 0x7dcbe6eb763440, 0x76952d2af82a3a, 0x563a911670ace4, 0x44758c6f1569fa, 0x57a2ad0d900b9} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1557, 0x1987, 0x65f, 0x1c20, 0x14ef, 0xb3b, 0xbbe, 0x19db, 0xc77, 0x566, 0x9ea, 0xcab, 0xafc, 0x1fda, 0xb44, 0x1fe6, 0x1af3, 0x1829, 0x2ef, 0xc23, 0x83d, 0x82c, 0x1fa8, 0x14b, 0xd6e, 0xde8, 0x260, 0x1019, 0x97a, 0x3} +#elif RADIX == 32 +{0xcc3d55c, 0xf84065f, 0xe59dd3b, 0xdf3b6bb, 0xea2b331, 0xbf19569, 0xb44fed2, 0xebcffcc, 0x62efc14, 0x620f584, 0x97fa841, 0xf435b82, 0x322606, 0x1a5ea} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xdd3bf84065fcc3d5, 0xa2b331df3b6bbe59, 0xcb44fed2bf19569e, 0x58462efc14ebcffc, 0x35b8297fa841620f, 0x17765ea0322606f4} +#else +{0x77f080cbf987aa, 0x477cedaef96774, 0x15f8cab4f51599, 0x4ebcffccb44fed, 0x2c41eb08c5df82, 0x3d0d6e0a5fea10, 0xbbb2f50191303} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0xb02, 0xc60, 0x791, 0x1cf7, 0xc15, 0x125a, 0x1697, 0xca1, 0x327, 0x89f, 0xf64, 0xddf, 0xcb7, 0x1977, 0x29f, 0x100a, 0xdac, 0xc8, 0x1e16, 0x1c4e, 0xedf, 0x1ec0, 0x1ac0, 0x1bbd, 0x16ee, 0x106a, 0x35c, 0x11cc, 0xdde, 0x20} +#elif RADIX == 32 +{0x6302c0b, 0x79ee791, 0x792d305, 0x9d94369, 0x6444f8c, 0x2ddbbef, 0x29fcbbb, 0x36b2014, 0xde16064, 0x3b7f89, 0x7bac0f6, 0x355bbb7, 0x39835c8, 0x4077a} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xd30579ee7916302c, 0x444f8c9d94369792, 0x429fcbbb2ddbbef6, 0xf89de1606436b201, 0x5bbb77bac0f603b7, 0x30b77a39835c835} +#else +{0xaf3dcf22c6058, 0x327650da5e4b4c, 0x596eddf7b2227c, 0x436b201429fcbb, 0x4076ff13bc2c0c, 0xd56eeddeeb03d, 0x185bbd1cc1ae4} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xb089,0xa64c,0xa5a7,0x17cc,0xe580,0xaa34,0x86e8,0x9328,0x2d1e,0x66ce,0x2dbc,0xd6e5,0x68f,0xaf97,0x8c7a,0xc341,0x4b41,0x4e1c,0xe0a3,0x580f,0xe796,0x8f21,0x8ad3,0xf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xa64cb089,0x17cca5a7,0xaa34e580,0x932886e8,0x66ce2d1e,0xd6e52dbc,0xaf97068f,0xc3418c7a,0x4e1c4b41,0x580fe0a3,0x8f21e796,0xf8ad3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x17cca5a7a64cb089,0x932886e8aa34e580,0xd6e52dbc66ce2d1e,0xc3418c7aaf97068f,0x580fe0a34e1c4b41,0xf8ad38f21e796}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xebe,0xec57,0xcd8c,0xef29,0xf13a,0xd391,0xa791,0x715c,0xe58e,0x194c,0xf950,0x5a37,0xdb9e,0xdab6,0x82c8,0x5cce,0x3197,0x339a,0xa700,0xad4,0xcd5b,0x91c1,0x5cff,0xb0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xec570ebe,0xef29cd8c,0xd391f13a,0x715ca791,0x194ce58e,0x5a37f950,0xdab6db9e,0x5cce82c8,0x339a3197,0xad4a700,0x91c1cd5b,0xb05cff}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xef29cd8cec570ebe,0x715ca791d391f13a,0x5a37f950194ce58e,0x5cce82c8dab6db9e,0xad4a700339a3197,0xb05cff91c1cd5b}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x3b4f,0x8fac,0x4b2c,0xc9a0,0x69a2,0xe4fa,0x3480,0xe41b,0x5801,0xd68b,0xa965,0x2f67,0x3134,0x7ac0,0x93a7,0x5352,0x9612,0x200e,0x33e6,0x44f,0xbca8,0x82f1,0xe411,0x4d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x8fac3b4f,0xc9a04b2c,0xe4fa69a2,0xe41b3480,0xd68b5801,0x2f67a965,0x7ac03134,0x535293a7,0x200e9612,0x44f33e6,0x82f1bca8,0x4de411}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xc9a04b2c8fac3b4f,0xe41b3480e4fa69a2,0x2f67a965d68b5801,0x535293a77ac03134,0x44f33e6200e9612,0x4de41182f1bca8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x4f77,0x59b3,0x5a58,0xe833,0x1a7f,0x55cb,0x7917,0x6cd7,0xd2e1,0x9931,0xd243,0x291a,0xf970,0x5068,0x7385,0x3cbe,0xb4be,0xb1e3,0x1f5c,0xa7f0,0x1869,0x70de,0x752c,0xf0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x59b34f77,0xe8335a58,0x55cb1a7f,0x6cd77917,0x9931d2e1,0x291ad243,0x5068f970,0x3cbe7385,0xb1e3b4be,0xa7f01f5c,0x70de1869,0xf0752c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xe8335a5859b34f77,0x6cd7791755cb1a7f,0x291ad2439931d2e1,0x3cbe73855068f970,0xa7f01f5cb1e3b4be,0xf0752c70de1869}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x58b3,0x9d97,0x998f,0xea82,0xc940,0x400a,0xec0c,0x9d04,0xbfb4,0x79c4,0x485c,0x525a,0xcaa0,0x36ba,0x94b3,0x828a,0x6102,0x76fe,0xb36f,0x45c1,0xb70f,0xa988,0xb614,0x6c}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9d9758b3,0xea82998f,0x400ac940,0x9d04ec0c,0x79c4bfb4,0x525a485c,0x36bacaa0,0x828a94b3,0x76fe6102,0x45c1b36f,0xa988b70f,0x6cb614}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xea82998f9d9758b3,0x9d04ec0c400ac940,0x525a485c79c4bfb4,0x828a94b336bacaa0,0x45c1b36f76fe6102,0x6cb614a988b70f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xf28e,0x2e0a,0xfab7,0x1f58,0x11ea,0x243,0x39c3,0x28d4,0xe1ba,0x1878,0x3aec,0x4d87,0xf832,0x354a,0xa312,0x7416,0xb5b,0x68ee,0x1627,0x78d2,0xfbbc,0x152f,0x1cb2,0xd1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x2e0af28e,0x1f58fab7,0x24311ea,0x28d439c3,0x1878e1ba,0x4d873aec,0x354af832,0x7416a312,0x68ee0b5b,0x78d21627,0x152ffbbc,0xd11cb2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1f58fab72e0af28e,0x28d439c3024311ea,0x4d873aec1878e1ba,0x7416a312354af832,0x78d2162768ee0b5b,0xd11cb2152ffbbc}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x3134,0x8876,0x4246,0xdd4b,0x87d0,0x86b1,0x71e8,0x2d33,0xfe04,0xe6d8,0x6377,0xf6d6,0xdd4f,0x8b91,0x29d4,0x521e,0x3822,0xa1d5,0x2eb9,0x8c9c,0x35a1,0xab9f,0x2d4c,0x11}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x88763134,0xdd4b4246,0x86b187d0,0x2d3371e8,0xe6d8fe04,0xf6d66377,0x8b91dd4f,0x521e29d4,0xa1d53822,0x8c9c2eb9,0xab9f35a1,0x112d4c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xdd4b424688763134,0x2d3371e886b187d0,0xf6d66377e6d8fe04,0x521e29d48b91dd4f,0x8c9c2eb9a1d53822,0x112d4cab9f35a1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa74d,0x6268,0x6670,0x157d,0x36bf,0xbff5,0x13f3,0x62fb,0x404b,0x863b,0xb7a3,0xada5,0x355f,0xc945,0x6b4c,0x7d75,0x9efd,0x8901,0x4c90,0xba3e,0x48f0,0x5677,0x49eb,0x93}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6268a74d,0x157d6670,0xbff536bf,0x62fb13f3,0x863b404b,0xada5b7a3,0xc945355f,0x7d756b4c,0x89019efd,0xba3e4c90,0x567748f0,0x9349eb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x157d66706268a74d,0x62fb13f3bff536bf,0xada5b7a3863b404b,0x7d756b4cc945355f,0xba3e4c9089019efd,0x9349eb567748f0}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xe463,0x3132,0x31,0xb872,0xdbee,0x1045,0x2b88,0x62c5,0xee3c,0xde5c,0xb179,0xa84f,0x18e5,0x355e,0x9a0f,0xbef8,0x783a,0x35b5,0x6d1c,0xaa31,0x3024,0xed81,0xa0f6,0x8a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x3132e463,0xb8720031,0x1045dbee,0x62c52b88,0xde5cee3c,0xa84fb179,0x355e18e5,0xbef89a0f,0x35b5783a,0xaa316d1c,0xed813024,0x8aa0f6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xb87200313132e463,0x62c52b881045dbee,0xa84fb179de5cee3c,0xbef89a0f355e18e5,0xaa316d1c35b5783a,0x8aa0f6ed813024}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xcf24,0xdac2,0xe08b,0xd2f9,0x13a,0xf1f,0x9517,0xfa7c,0xa1c5,0x581e,0x4d0b,0x3e59,0x97cc,0x7506,0xee19,0xa48e,0xb1b0,0x50c2,0xb5a7,0x4b1d,0x2fcd,0xee68,0xab65,0x85}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xdac2cf24,0xd2f9e08b,0xf1f013a,0xfa7c9517,0x581ea1c5,0x3e594d0b,0x750697cc,0xa48eee19,0x50c2b1b0,0x4b1db5a7,0xee682fcd,0x85ab65}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xd2f9e08bdac2cf24,0xfa7c95170f1f013a,0x3e594d0b581ea1c5,0xa48eee19750697cc,0x4b1db5a750c2b1b0,0x85ab65ee682fcd}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x8b69,0x7be5,0xdf28,0x9c91,0xf929,0x7c60,0x6c50,0x4f81,0x714a,0x59da,0x2741,0x3c71,0x223a,0x79bf,0x14bd,0xa26f,0xc787,0x606d,0xc74c,0xef81,0xd1c4,0x32a,0x55ff,0x6a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7be58b69,0x9c91df28,0x7c60f929,0x4f816c50,0x59da714a,0x3c712741,0x79bf223a,0xa26f14bd,0x606dc787,0xef81c74c,0x32ad1c4,0x6a55ff}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9c91df287be58b69,0x4f816c507c60f929,0x3c71274159da714a,0xa26f14bd79bf223a,0xef81c74c606dc787,0x6a55ff032ad1c4}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1b9d,0xcecd,0xffce,0x478d,0x2411,0xefba,0xd477,0x9d3a,0x11c3,0x21a3,0x4e86,0x57b0,0xe71a,0xcaa1,0x65f0,0x4107,0x87c5,0xca4a,0x92e3,0x55ce,0xcfdb,0x127e,0x5f09,0x75}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xcecd1b9d,0x478dffce,0xefba2411,0x9d3ad477,0x21a311c3,0x57b04e86,0xcaa1e71a,0x410765f0,0xca4a87c5,0x55ce92e3,0x127ecfdb,0x755f09}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x478dffcececd1b9d,0x9d3ad477efba2411,0x57b04e8621a311c3,0x410765f0caa1e71a,0x55ce92e3ca4a87c5,0x755f09127ecfdb}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xb089,0xa64c,0xa5a7,0x17cc,0xe580,0xaa34,0x86e8,0x9328,0x2d1e,0x66ce,0x2dbc,0xd6e5,0x68f,0xaf97,0x8c7a,0xc341,0x4b41,0x4e1c,0xe0a3,0x580f,0xe796,0x8f21,0x8ad3,0xf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xa64cb089,0x17cca5a7,0xaa34e580,0x932886e8,0x66ce2d1e,0xd6e52dbc,0xaf97068f,0xc3418c7a,0x4e1c4b41,0x580fe0a3,0x8f21e796,0xf8ad3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x17cca5a7a64cb089,0x932886e8aa34e580,0xd6e52dbc66ce2d1e,0xc3418c7aaf97068f,0x580fe0a34e1c4b41,0xf8ad38f21e796}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xebe,0xec57,0xcd8c,0xef29,0xf13a,0xd391,0xa791,0x715c,0xe58e,0x194c,0xf950,0x5a37,0xdb9e,0xdab6,0x82c8,0x5cce,0x3197,0x339a,0xa700,0xad4,0xcd5b,0x91c1,0x5cff,0xb0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xec570ebe,0xef29cd8c,0xd391f13a,0x715ca791,0x194ce58e,0x5a37f950,0xdab6db9e,0x5cce82c8,0x339a3197,0xad4a700,0x91c1cd5b,0xb05cff}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xef29cd8cec570ebe,0x715ca791d391f13a,0x5a37f950194ce58e,0x5cce82c8dab6db9e,0xad4a700339a3197,0xb05cff91c1cd5b}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x3b4f,0x8fac,0x4b2c,0xc9a0,0x69a2,0xe4fa,0x3480,0xe41b,0x5801,0xd68b,0xa965,0x2f67,0x3134,0x7ac0,0x93a7,0x5352,0x9612,0x200e,0x33e6,0x44f,0xbca8,0x82f1,0xe411,0x4d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x8fac3b4f,0xc9a04b2c,0xe4fa69a2,0xe41b3480,0xd68b5801,0x2f67a965,0x7ac03134,0x535293a7,0x200e9612,0x44f33e6,0x82f1bca8,0x4de411}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xc9a04b2c8fac3b4f,0xe41b3480e4fa69a2,0x2f67a965d68b5801,0x535293a77ac03134,0x44f33e6200e9612,0x4de41182f1bca8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x4f77,0x59b3,0x5a58,0xe833,0x1a7f,0x55cb,0x7917,0x6cd7,0xd2e1,0x9931,0xd243,0x291a,0xf970,0x5068,0x7385,0x3cbe,0xb4be,0xb1e3,0x1f5c,0xa7f0,0x1869,0x70de,0x752c,0xf0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x59b34f77,0xe8335a58,0x55cb1a7f,0x6cd77917,0x9931d2e1,0x291ad243,0x5068f970,0x3cbe7385,0xb1e3b4be,0xa7f01f5c,0x70de1869,0xf0752c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xe8335a5859b34f77,0x6cd7791755cb1a7f,0x291ad2439931d2e1,0x3cbe73855068f970,0xa7f01f5cb1e3b4be,0xf0752c70de1869}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xac5a,0xcecb,0x4cc7,0x7541,0x64a0,0x2005,0x7606,0x4e82,0x5fda,0x3ce2,0x242e,0x292d,0x6550,0x9b5d,0x4a59,0x4145,0x3081,0xbb7f,0xd9b7,0xa2e0,0x5b87,0x54c4,0x5b0a,0x36}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xcecbac5a,0x75414cc7,0x200564a0,0x4e827606,0x3ce25fda,0x292d242e,0x9b5d6550,0x41454a59,0xbb7f3081,0xa2e0d9b7,0x54c45b87,0x365b0a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x75414cc7cecbac5a,0x4e827606200564a0,0x292d242e3ce25fda,0x41454a599b5d6550,0xa2e0d9b7bb7f3081,0x365b0a54c45b87}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x7947,0x9705,0x7d5b,0xfac,0x88f5,0x8121,0x1ce1,0x146a,0x70dd,0xc3c,0x9d76,0x26c3,0x7c19,0x1aa5,0x5189,0xba0b,0x5ad,0xb477,0xb13,0x3c69,0xfdde,0xa97,0x8e59,0x68}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x97057947,0xfac7d5b,0x812188f5,0x146a1ce1,0xc3c70dd,0x26c39d76,0x1aa57c19,0xba0b5189,0xb47705ad,0x3c690b13,0xa97fdde,0x688e59}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xfac7d5b97057947,0x146a1ce1812188f5,0x26c39d760c3c70dd,0xba0b51891aa57c19,0x3c690b13b47705ad,0x688e590a97fdde}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x189a,0x443b,0xa123,0x6ea5,0xc3e8,0x4358,0xb8f4,0x1699,0x7f02,0xf36c,0x31bb,0xfb6b,0xeea7,0x45c8,0x14ea,0x290f,0x9c11,0xd0ea,0x175c,0xc64e,0x9ad0,0x55cf,0x96a6,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x443b189a,0x6ea5a123,0x4358c3e8,0x1699b8f4,0xf36c7f02,0xfb6b31bb,0x45c8eea7,0x290f14ea,0xd0ea9c11,0xc64e175c,0x55cf9ad0,0x896a6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x6ea5a123443b189a,0x1699b8f44358c3e8,0xfb6b31bbf36c7f02,0x290f14ea45c8eea7,0xc64e175cd0ea9c11,0x896a655cf9ad0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x53a7,0x3134,0xb338,0x8abe,0x9b5f,0xdffa,0x89f9,0xb17d,0xa025,0xc31d,0xdbd1,0xd6d2,0x9aaf,0x64a2,0xb5a6,0xbeba,0xcf7e,0x4480,0x2648,0x5d1f,0xa478,0xab3b,0xa4f5,0xc9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x313453a7,0x8abeb338,0xdffa9b5f,0xb17d89f9,0xc31da025,0xd6d2dbd1,0x64a29aaf,0xbebab5a6,0x4480cf7e,0x5d1f2648,0xab3ba478,0xc9a4f5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x8abeb338313453a7,0xb17d89f9dffa9b5f,0xd6d2dbd1c31da025,0xbebab5a664a29aaf,0x5d1f26484480cf7e,0xc9a4f5ab3ba478}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xd69f,0xa20a,0x2dbf,0x4897,0x3199,0xde89,0xe5f9,0x293e,0x826b,0xb67a,0x9878,0x508f,0x1cd5,0xbfc7,0xa6dc,0xa78c,0xa5a7,0xf717,0x2bd3,0x9a61,0x7d35,0xb772,0xba39,0x5d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xa20ad69f,0x48972dbf,0xde893199,0x293ee5f9,0xb67a826b,0x508f9878,0xbfc71cd5,0xa78ca6dc,0xf717a5a7,0x9a612bd3,0xb7727d35,0x5dba39}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x48972dbfa20ad69f,0x293ee5f9de893199,0x508f9878b67a826b,0xa78ca6dcbfc71cd5,0x9a612bd3f717a5a7,0x5dba39b7727d35}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xeec1,0x1e36,0x61bb,0x9e9f,0xe1d8,0x9166,0x8a8e,0xb5cd,0xc787,0x4281,0xb7db,0xc5fe,0x29b,0x7038,0xad1a,0xdfb3,0x5d88,0xa643,0xce34,0xe9d5,0xfe7,0xc15c,0xb80f,0xbc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x1e36eec1,0x9e9f61bb,0x9166e1d8,0xb5cd8a8e,0x4281c787,0xc5feb7db,0x7038029b,0xdfb3ad1a,0xa6435d88,0xe9d5ce34,0xc15c0fe7,0xbcb80f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9e9f61bb1e36eec1,0xb5cd8a8e9166e1d8,0xc5feb7db4281c787,0xdfb3ad1a7038029b,0xe9d5ce34a6435d88,0xbcb80fc15c0fe7}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xb7ff,0xc2,0x2b8a,0x5a59,0xd318,0x52ca,0x9b64,0xad19,0x8df,0xc9b8,0x7b28,0x9d09,0xe309,0x9,0xfb09,0xcbb9,0x6a67,0x1137,0x707c,0xaa5,0xcdf5,0x3ffd,0xfb9e,0xb9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xc2b7ff,0x5a592b8a,0x52cad318,0xad199b64,0xc9b808df,0x9d097b28,0x9e309,0xcbb9fb09,0x11376a67,0xaa5707c,0x3ffdcdf5,0xb9fb9e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x5a592b8a00c2b7ff,0xad199b6452cad318,0x9d097b28c9b808df,0xcbb9fb090009e309,0xaa5707c11376a67,0xb9fb9e3ffdcdf5}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x2961,0x5df5,0xd240,0xb768,0xce66,0x2176,0x1a06,0xd6c1,0x7d94,0x4985,0x6787,0xaf70,0xe32a,0x4038,0x5923,0x5873,0x5a58,0x8e8,0xd42c,0x659e,0x82ca,0x488d,0x45c6,0xa2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x5df52961,0xb768d240,0x2176ce66,0xd6c11a06,0x49857d94,0xaf706787,0x4038e32a,0x58735923,0x8e85a58,0x659ed42c,0x488d82ca,0xa245c6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xb768d2405df52961,0xd6c11a062176ce66,0xaf70678749857d94,0x587359234038e32a,0x659ed42c08e85a58,0xa245c6488d82ca}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0xccf, 0xad2, 0x1c72, 0x1f31, 0x155, 0xa3, 0x1062, 0xf6e, 0xe60, 0x87b, 0x1891, 0xb45, 0x1de8, 0x7f8, 0x18a6, 0x1e67, 0x988, 0x1887, 0xca7, 0x216, 0x1daa, 0x1aa5, 0xc3a, 0x11d3, 0x1282, 0x55d, 0x15fc, 0x1132, 0x1c5e, 0x8} +#elif RADIX == 32 +{0x569333d, 0x7e63c72, 0x2051855, 0x81edd06, 0x9143db9, 0x7a168b8, 0x8a63fc7, 0xa623ccf, 0xcca7c43, 0x2f6a842, 0xa6c3ad5, 0xaeca0a3, 0x2655fc2, 0x617a} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x18557e63c7256933, 0x143db981edd06205, 0xf8a63fc77a168b89, 0x842cca7c43a623cc, 0xca0a3a6c3ad52f6a, 0xf8317a2655fc2ae} +#else +{0x2afcc78e4ad266, 0x6607b741881461, 0x3bd0b45c48a1ed, 0x3a623ccf8a63fc, 0x25ed5085994f88, 0x2bb2828e9b0eb5, 0x7c18bd132afe1} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x13b1, 0x12b4, 0xf1c, 0xfcc, 0x1855, 0x1028, 0x1418, 0x3db, 0x1b98, 0xa1e, 0xe24, 0x2d1, 0x77a, 0x11fe, 0x1e29, 0x799, 0x1a62, 0x1e21, 0x1329, 0x1085, 0xf6a, 0x16a9, 0x1b0e, 0x1474, 0xca0, 0x157, 0x157f, 0x144c, 0x1317, 0x1b} +#elif RADIX == 32 +{0x95a4ec7, 0x5f98f1c, 0x8814615, 0x607b741, 0x2450f6e, 0xde85a2e, 0xe298ff1, 0xe988f33, 0xb329f10, 0x4bdaa10, 0xe9b0eb5, 0xabb2828, 0x89957f0, 0x19c5e} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x46155f98f1c95a4e, 0x450f6e607b741881, 0x3e298ff1de85a2e2, 0xa10b329f10e988f3, 0xb2828e9b0eb54bda, 0x32a0c5e89957f0ab} +#else +{0x2abf31e392b49d, 0x3981edd0620518, 0xef42d1712287b, 0xe988f33e298ff, 0x297b54216653e2, 0x2aeca0a3a6c3ad, 0x91062f44cabf8} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0xdd8, 0x13bc, 0x17ae, 0x83e, 0x10c6, 0x1a72, 0x270, 0x84, 0xb92, 0x431, 0x1fdf, 0x9cf, 0x2a9, 0x121d, 0x5d5, 0x1d9f, 0xa48, 0xec9, 0xcfc, 0x6ee, 0x1812, 0x66b, 0xed8, 0xf7, 0x117b, 0x1fb7, 0xc5, 0x1f00, 0x134f, 0x1f} +#elif RADIX == 32 +{0x9de3763, 0x907d7ae, 0xd39431, 0x4810827, 0xdf218ae, 0xaa539ff, 0x5d590e8, 0xa923b3e, 0xccfc764, 0x5e048dd, 0xeeed833, 0xdbc5ec1, 0xe000c5f, 0x39d3f} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x9431907d7ae9de37, 0xf218ae48108270d3, 0xe5d590e8aa539ffd, 0x8ddccfc764a923b3, 0xc5ec1eeed8335e04, 0x195cd3fe000c5fdb} +#else +{0x6320faf5d3bc6e, 0x39204209c34e50, 0x45529cffef90c5, 0x4a923b3e5d590e, 0x6bc091bb99f8ec, 0x76f17b07bbb60c, 0xcae69ff00062f} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0xf36, 0x2c8, 0x1ab4, 0x17c1, 0x10be, 0x1a20, 0x1baf, 0x3ce, 0x1088, 0xd75, 0x1e25, 0x10f8, 0x3d2, 0x1b8, 0x9c7, 0x168, 0x44c, 0x372, 0xc50, 0x1d9a, 0x1b99, 0xab9, 0x8af, 0x657, 0xe84, 0xe1d, 0x1675, 0x47, 0x157e, 0xc} +#elif RADIX == 32 +{0x1643cd9, 0xaf83ab4, 0xfd1042f, 0x2079dba, 0x256bac2, 0xf4a1f1e, 0x9c70dc0, 0x11302d0, 0x4c501b9, 0xcee67b3, 0xae8af55, 0xeba10c, 0x8f6757, 0x245f8} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x42faf83ab41643c, 0x56bac22079dbafd1, 0x9c70dc0f4a1f1e2, 0x7b34c501b911302d, 0xba10cae8af55cee6, 0x373d5f808f67570e} +#else +{0x5f5f075682c879, 0x881e76ebf4410, 0x7a50f8f12b5d6, 0x111302d09c70dc, 0x39dccf6698a037, 0x43ae8432ba2bd5, 0xb5eafc047b3ab} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x4b0, 0x31c, 0x92f, 0xf0d, 0xbc1, 0x1e89, 0x4ce, 0x1480, 0xdee, 0x504, 0x970, 0x16c3, 0xcb6, 0xae7, 0x1147, 0x8c, 0xc2a, 0x1ff9, 0x7d8, 0xfe9, 0x1fb1, 0x748, 0x998, 0xb85, 0x1a8e, 0x19c7, 0x5f7, 0x103c, 0x12a4, 0xe} +#elif RADIX == 32 +{0x18e12c1, 0x5e1a92f, 0xef44af0, 0xba9004c, 0x7028237, 0x2dad869, 0x147573b, 0xb0a8119, 0x27d8ffc, 0x47ec5fd, 0xa9983a, 0xe3ea397, 0x785f7c, 0x33a92} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x4af05e1a92f18e12, 0x28237ba9004cef4, 0x9147573b2dad8697, 0x5fd27d8ffcb0a811, 0xea3970a9983a47ec, 0x3134a920785f7ce3} +#else +{0x60bc3525e31c25, 0x5eea40133bd12b, 0x596d6c34b81411, 0x4b0a8119147573, 0x48fd8bfa4fb1ff, 0x38fa8e5c2a660e, 0x85a54903c2fbe} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x15a9, 0x1ae1, 0x1dd2, 0xa61, 0x1259, 0xfad, 0xe49, 0x1f6d, 0xd9a, 0x1371, 0xee7, 0x1179, 0x1bcf, 0x876, 0x3ca, 0xf7c, 0x1192, 0x315, 0x916, 0x1aa5, 0x1ca9, 0x10cb, 0xe32, 0x18b9, 0xf58, 0x1932, 0x1cce, 0x1ba7, 0x1377, 0x6} +#elif RADIX == 32 +{0xd70d6a4, 0x54c3dd2, 0x97d6c96, 0x6bedae4, 0xe79b8b6, 0xf3e2f2e, 0x3ca43b6, 0xc649ef8, 0xa91618a, 0x5f2a754, 0x72e3286, 0x993d631, 0x74fccec, 0x34ddf} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x6c9654c3dd2d70d6, 0x79b8b66bedae497d, 0x83ca43b6f3e2f2ee, 0x754a91618ac649ef, 0x3d63172e32865f2a, 0x29d8ddf74fccec99} +#else +{0x2ca987ba5ae1ad, 0x59afb6b925f5b2, 0x379f179773cdc5, 0x2c649ef83ca43b, 0x4be54ea9522c31, 0x264f58c5cb8ca1, 0x4ac6efba7e676} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1f79, 0xcad, 0x18f2, 0x1ba7, 0x1d14, 0x1fc6, 0x197d, 0x522, 0xab, 0x7bd, 0x57b, 0x1fbf, 0x12, 0xb50, 0x425, 0x1aa3, 0x1c8e, 0x11cf, 0x1c1b, 0x1774, 0x3fc, 0x36a, 0x148f, 0x1fd3, 0x608, 0x1711, 0x1142, 0xcfa, 0xd43, 0xd} +#elif RADIX == 32 +{0x656fde5, 0x374f8f2, 0xdfe3745, 0xaca4597, 0x7b3de82, 0x4bf7e5, 0x4255a80, 0xf23b546, 0x9c1b8e7, 0x50ff2ee, 0xa748f1b, 0x889823f, 0x9f5142b, 0x2a50d} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3745374f8f2656fd, 0xb3de82aca4597dfe, 0x64255a8004bf7e57, 0x2ee9c1b8e7f23b54, 0x9823fa748f1b50ff, 0x3a4f50d9f5142b88} +#else +{0xa6e9f1e4cadfb, 0xab29165f7f8dd, 0x25fbf2bd9ef4, 0x7f23b5464255a8, 0x6a1fe5dd38371c, 0x622608fe9d23c6, 0xce7a86cfa8a15} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x14a, 0x1236, 0x839, 0xe2, 0xe2d, 0xe17, 0x1b8f, 0x18dd, 0xb20, 0xeb8, 0x1da9, 0xc53, 0x12e8, 0x146, 0x1b9b, 0x154, 0x1121, 0x1049, 0x105d, 0x631, 0xc9, 0xbe0, 0x8fa, 0xbc0, 0x34b, 0x178a, 0x77b, 0x2a7, 0x105b, 0x15} +#elif RADIX == 32 +{0x91b052a, 0x41c4839, 0xf70bb8b, 0x831bbb8, 0xa975c2c, 0xba18a7d, 0xb9b0a34, 0xc4842a9, 0x305d824, 0x324c6, 0x808fa5f, 0xc50d2d7, 0x54e77bb, 0x2a16c} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xbb8b41c483991b05, 0x975c2c831bbb8f70, 0x9b9b0a34ba18a7da, 0x4c6305d824c4842a, 0xd2d7808fa5f0032, 0xad416c54e77bbc5} +#else +{0x1683890732360a, 0x320c6eee3dc2ee, 0x25d0c53ed4bae1, 0x4c4842a9b9b0a3, 0x6006498c60bb04, 0x71434b5e023e97, 0x56a0b62a73bdd} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x4fff,0xe916,0xb451,0xaee,0xc580,0xfa2c,0xb766,0x199a,0xa8a0,0x36f2,0xaa1b,0x47dd,0xb34f,0x26f5,0xb1ba,0xc4c1,0xad4d,0xfcf8,0x21fd,0xf7a,0x2a36,0x4cd2,0x2b08,0x94}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xe9164fff,0xaeeb451,0xfa2cc580,0x199ab766,0x36f2a8a0,0x47ddaa1b,0x26f5b34f,0xc4c1b1ba,0xfcf8ad4d,0xf7a21fd,0x4cd22a36,0x942b08}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xaeeb451e9164fff,0x199ab766fa2cc580,0x47ddaa1b36f2a8a0,0xc4c1b1ba26f5b34f,0xf7a21fdfcf8ad4d,0x942b084cd22a36}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xf16e,0x5176,0xe09f,0xe2ae,0xa46d,0x6925,0xc9bd,0xbd66,0xdd5c,0x51ce,0xe98d,0x9ad3,0x6815,0x4476,0xbec8,0xa088,0x6799,0x1733,0xf164,0x1d16,0xc914,0x4af3,0x3b5b,0x84}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x5176f16e,0xe2aee09f,0x6925a46d,0xbd66c9bd,0x51cedd5c,0x9ad3e98d,0x44766815,0xa088bec8,0x17336799,0x1d16f164,0x4af3c914,0x843b5b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xe2aee09f5176f16e,0xbd66c9bd6925a46d,0x9ad3e98d51cedd5c,0xa088bec844766815,0x1d16f16417336799,0x843b5b4af3c914}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x22c1,0x4088,0xbc14,0x9620,0x7d53,0x77ec,0x89,0xda12,0x54df,0x3806,0xb925,0x6092,0xd1b4,0x59e3,0x3419,0x9617,0x9ae6,0x48a9,0xf008,0xb452,0x9756,0x35cb,0x9c5d,0x49}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x408822c1,0x9620bc14,0x77ec7d53,0xda120089,0x380654df,0x6092b925,0x59e3d1b4,0x96173419,0x48a99ae6,0xb452f008,0x35cb9756,0x499c5d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9620bc14408822c1,0xda12008977ec7d53,0x6092b925380654df,0x9617341959e3d1b4,0xb452f00848a99ae6,0x499c5d35cb9756}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xb001,0x16e9,0x4bae,0xf511,0x3a7f,0x5d3,0x4899,0xe665,0x575f,0xc90d,0x55e4,0xb822,0x4cb0,0xd90a,0x4e45,0x3b3e,0x52b2,0x307,0xde02,0xf085,0xd5c9,0xb32d,0xd4f7,0x6b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x16e9b001,0xf5114bae,0x5d33a7f,0xe6654899,0xc90d575f,0xb82255e4,0xd90a4cb0,0x3b3e4e45,0x30752b2,0xf085de02,0xb32dd5c9,0x6bd4f7}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xf5114bae16e9b001,0xe665489905d33a7f,0xb82255e4c90d575f,0x3b3e4e45d90a4cb0,0xf085de02030752b2,0x6bd4f7b32dd5c9}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x58b3,0x9d97,0x998f,0xea82,0xc940,0x400a,0xec0c,0x9d04,0xbfb4,0x79c4,0x485c,0x525a,0xcaa0,0x36ba,0x94b3,0x828a,0x6102,0x76fe,0xb36f,0x45c1,0xb70f,0xa988,0xb614,0x6c}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9d9758b3,0xea82998f,0x400ac940,0x9d04ec0c,0x79c4bfb4,0x525a485c,0x36bacaa0,0x828a94b3,0x76fe6102,0x45c1b36f,0xa988b70f,0x6cb614}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xea82998f9d9758b3,0x9d04ec0c400ac940,0x525a485c79c4bfb4,0x828a94b336bacaa0,0x45c1b36f76fe6102,0x6cb614a988b70f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xf28e,0x2e0a,0xfab7,0x1f58,0x11ea,0x243,0x39c3,0x28d4,0xe1ba,0x1878,0x3aec,0x4d87,0xf832,0x354a,0xa312,0x7416,0xb5b,0x68ee,0x1627,0x78d2,0xfbbc,0x152f,0x1cb2,0xd1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x2e0af28e,0x1f58fab7,0x24311ea,0x28d439c3,0x1878e1ba,0x4d873aec,0x354af832,0x7416a312,0x68ee0b5b,0x78d21627,0x152ffbbc,0xd11cb2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1f58fab72e0af28e,0x28d439c3024311ea,0x4d873aec1878e1ba,0x7416a312354af832,0x78d2162768ee0b5b,0xd11cb2152ffbbc}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x3134,0x8876,0x4246,0xdd4b,0x87d0,0x86b1,0x71e8,0x2d33,0xfe04,0xe6d8,0x6377,0xf6d6,0xdd4f,0x8b91,0x29d4,0x521e,0x3822,0xa1d5,0x2eb9,0x8c9c,0x35a1,0xab9f,0x2d4c,0x11}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x88763134,0xdd4b4246,0x86b187d0,0x2d3371e8,0xe6d8fe04,0xf6d66377,0x8b91dd4f,0x521e29d4,0xa1d53822,0x8c9c2eb9,0xab9f35a1,0x112d4c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xdd4b424688763134,0x2d3371e886b187d0,0xf6d66377e6d8fe04,0x521e29d48b91dd4f,0x8c9c2eb9a1d53822,0x112d4cab9f35a1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa74d,0x6268,0x6670,0x157d,0x36bf,0xbff5,0x13f3,0x62fb,0x404b,0x863b,0xb7a3,0xada5,0x355f,0xc945,0x6b4c,0x7d75,0x9efd,0x8901,0x4c90,0xba3e,0x48f0,0x5677,0x49eb,0x93}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6268a74d,0x157d6670,0xbff536bf,0x62fb13f3,0x863b404b,0xada5b7a3,0xc945355f,0x7d756b4c,0x89019efd,0xba3e4c90,0x567748f0,0x9349eb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x157d66706268a74d,0x62fb13f3bff536bf,0xada5b7a3863b404b,0x7d756b4cc945355f,0xba3e4c9089019efd,0x9349eb567748f0}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xafa5,0x4195,0xbb2d,0xdd24,0xa3ca,0xc678,0xf995,0x2ccb,0x5c3b,0xf9ff,0xd06,0x1f9b,0x926d,0x4e3b,0x2881,0x24f2,0xcf4c,0x8e9a,0xa38d,0x24cb,0xe8f2,0x28a1,0x581c,0xde}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x4195afa5,0xdd24bb2d,0xc678a3ca,0x2ccbf995,0xf9ff5c3b,0x1f9b0d06,0x4e3b926d,0x24f22881,0x8e9acf4c,0x24cba38d,0x28a1e8f2,0xde581c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xdd24bb2d4195afa5,0x2ccbf995c678a3ca,0x1f9b0d06f9ff5c3b,0x24f228814e3b926d,0x24cba38d8e9acf4c,0xde581c28a1e8f2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xcd88,0x9cea,0x593c,0xb5a8,0x79c6,0xc07c,0x496f,0xfb85,0x5ac9,0x381c,0xf4f8,0xfa59,0xb7a3,0x5caa,0x24c2,0x67c8,0x31b3,0x7585,0xbe8a,0xb89f,0xa29f,0x6cd5,0xc156,0x25}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9ceacd88,0xb5a8593c,0xc07c79c6,0xfb85496f,0x381c5ac9,0xfa59f4f8,0x5caab7a3,0x67c824c2,0x758531b3,0xb89fbe8a,0x6cd5a29f,0x25c156}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xb5a8593c9ceacd88,0xfb85496fc07c79c6,0xfa59f4f8381c5ac9,0x67c824c25caab7a3,0xb89fbe8a758531b3,0x25c1566cd5a29f}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x9627,0xd297,0x9200,0x73de,0xaa89,0xf44f,0x99c7,0x2d45,0xb1eb,0xab2b,0x4168,0x976f,0x1e88,0x7777,0x2f39,0x6648,0xc224,0xd5a1,0xb815,0x861b,0xf76f,0xb476,0x4123,0xbe}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xd2979627,0x73de9200,0xf44faa89,0x2d4599c7,0xab2bb1eb,0x976f4168,0x77771e88,0x66482f39,0xd5a1c224,0x861bb815,0xb476f76f,0xbe4123}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x73de9200d2979627,0x2d4599c7f44faa89,0x976f4168ab2bb1eb,0x66482f3977771e88,0x861bb815d5a1c224,0xbe4123b476f76f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x505b,0xbe6a,0x44d2,0x22db,0x5c35,0x3987,0x66a,0xd334,0xa3c4,0x600,0xf2f9,0xe064,0x6d92,0xb1c4,0xd77e,0xdb0d,0x30b3,0x7165,0x5c72,0xdb34,0x170d,0xd75e,0xa7e3,0x21}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xbe6a505b,0x22db44d2,0x39875c35,0xd334066a,0x600a3c4,0xe064f2f9,0xb1c46d92,0xdb0dd77e,0x716530b3,0xdb345c72,0xd75e170d,0x21a7e3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x22db44d2be6a505b,0xd334066a39875c35,0xe064f2f90600a3c4,0xdb0dd77eb1c46d92,0xdb345c72716530b3,0x21a7e3d75e170d}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x4fff,0xe916,0xb451,0xaee,0xc580,0xfa2c,0xb766,0x199a,0xa8a0,0x36f2,0xaa1b,0x47dd,0xb34f,0x26f5,0xb1ba,0xc4c1,0xad4d,0xfcf8,0x21fd,0xf7a,0x2a36,0x4cd2,0x2b08,0x94}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xe9164fff,0xaeeb451,0xfa2cc580,0x199ab766,0x36f2a8a0,0x47ddaa1b,0x26f5b34f,0xc4c1b1ba,0xfcf8ad4d,0xf7a21fd,0x4cd22a36,0x942b08}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xaeeb451e9164fff,0x199ab766fa2cc580,0x47ddaa1b36f2a8a0,0xc4c1b1ba26f5b34f,0xf7a21fdfcf8ad4d,0x942b084cd22a36}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xf16e,0x5176,0xe09f,0xe2ae,0xa46d,0x6925,0xc9bd,0xbd66,0xdd5c,0x51ce,0xe98d,0x9ad3,0x6815,0x4476,0xbec8,0xa088,0x6799,0x1733,0xf164,0x1d16,0xc914,0x4af3,0x3b5b,0x84}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x5176f16e,0xe2aee09f,0x6925a46d,0xbd66c9bd,0x51cedd5c,0x9ad3e98d,0x44766815,0xa088bec8,0x17336799,0x1d16f164,0x4af3c914,0x843b5b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xe2aee09f5176f16e,0xbd66c9bd6925a46d,0x9ad3e98d51cedd5c,0xa088bec844766815,0x1d16f16417336799,0x843b5b4af3c914}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x22c1,0x4088,0xbc14,0x9620,0x7d53,0x77ec,0x89,0xda12,0x54df,0x3806,0xb925,0x6092,0xd1b4,0x59e3,0x3419,0x9617,0x9ae6,0x48a9,0xf008,0xb452,0x9756,0x35cb,0x9c5d,0x49}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x408822c1,0x9620bc14,0x77ec7d53,0xda120089,0x380654df,0x6092b925,0x59e3d1b4,0x96173419,0x48a99ae6,0xb452f008,0x35cb9756,0x499c5d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9620bc14408822c1,0xda12008977ec7d53,0x6092b925380654df,0x9617341959e3d1b4,0xb452f00848a99ae6,0x499c5d35cb9756}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xb001,0x16e9,0x4bae,0xf511,0x3a7f,0x5d3,0x4899,0xe665,0x575f,0xc90d,0x55e4,0xb822,0x4cb0,0xd90a,0x4e45,0x3b3e,0x52b2,0x307,0xde02,0xf085,0xd5c9,0xb32d,0xd4f7,0x6b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x16e9b001,0xf5114bae,0x5d33a7f,0xe6654899,0xc90d575f,0xb82255e4,0xd90a4cb0,0x3b3e4e45,0x30752b2,0xf085de02,0xb32dd5c9,0x6bd4f7}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xf5114bae16e9b001,0xe665489905d33a7f,0xb82255e4c90d575f,0x3b3e4e45d90a4cb0,0xf085de02030752b2,0x6bd4f7b32dd5c9}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xac5a,0xcecb,0x4cc7,0x7541,0x64a0,0x2005,0x7606,0x4e82,0x5fda,0x3ce2,0x242e,0x292d,0x6550,0x9b5d,0x4a59,0x4145,0x3081,0xbb7f,0xd9b7,0xa2e0,0x5b87,0x54c4,0x5b0a,0x36}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xcecbac5a,0x75414cc7,0x200564a0,0x4e827606,0x3ce25fda,0x292d242e,0x9b5d6550,0x41454a59,0xbb7f3081,0xa2e0d9b7,0x54c45b87,0x365b0a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x75414cc7cecbac5a,0x4e827606200564a0,0x292d242e3ce25fda,0x41454a599b5d6550,0xa2e0d9b7bb7f3081,0x365b0a54c45b87}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x7947,0x9705,0x7d5b,0xfac,0x88f5,0x8121,0x1ce1,0x146a,0x70dd,0xc3c,0x9d76,0x26c3,0x7c19,0x1aa5,0x5189,0xba0b,0x5ad,0xb477,0xb13,0x3c69,0xfdde,0xa97,0x8e59,0x68}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x97057947,0xfac7d5b,0x812188f5,0x146a1ce1,0xc3c70dd,0x26c39d76,0x1aa57c19,0xba0b5189,0xb47705ad,0x3c690b13,0xa97fdde,0x688e59}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xfac7d5b97057947,0x146a1ce1812188f5,0x26c39d760c3c70dd,0xba0b51891aa57c19,0x3c690b13b47705ad,0x688e590a97fdde}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x189a,0x443b,0xa123,0x6ea5,0xc3e8,0x4358,0xb8f4,0x1699,0x7f02,0xf36c,0x31bb,0xfb6b,0xeea7,0x45c8,0x14ea,0x290f,0x9c11,0xd0ea,0x175c,0xc64e,0x9ad0,0x55cf,0x96a6,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x443b189a,0x6ea5a123,0x4358c3e8,0x1699b8f4,0xf36c7f02,0xfb6b31bb,0x45c8eea7,0x290f14ea,0xd0ea9c11,0xc64e175c,0x55cf9ad0,0x896a6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x6ea5a123443b189a,0x1699b8f44358c3e8,0xfb6b31bbf36c7f02,0x290f14ea45c8eea7,0xc64e175cd0ea9c11,0x896a655cf9ad0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x53a7,0x3134,0xb338,0x8abe,0x9b5f,0xdffa,0x89f9,0xb17d,0xa025,0xc31d,0xdbd1,0xd6d2,0x9aaf,0x64a2,0xb5a6,0xbeba,0xcf7e,0x4480,0x2648,0x5d1f,0xa478,0xab3b,0xa4f5,0xc9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x313453a7,0x8abeb338,0xdffa9b5f,0xb17d89f9,0xc31da025,0xd6d2dbd1,0x64a29aaf,0xbebab5a6,0x4480cf7e,0x5d1f2648,0xab3ba478,0xc9a4f5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x8abeb338313453a7,0xb17d89f9dffa9b5f,0xd6d2dbd1c31da025,0xbebab5a664a29aaf,0x5d1f26484480cf7e,0xc9a4f5ab3ba478}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x43c6,0x55d8,0x682a,0xc215,0x706e,0xac4c,0x5ce,0x1182,0x8b72,0x90e3,0xf04f,0x6a11,0xc345,0x3488,0x45b0,0x5d3f,0x556b,0x9896,0x7b20,0x8d46,0xa9e3,0x7b0c,0xd428,0xba}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x55d843c6,0xc215682a,0xac4c706e,0x118205ce,0x90e38b72,0x6a11f04f,0x3488c345,0x5d3f45b0,0x9896556b,0x8d467b20,0x7b0ca9e3,0xbad428}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xc215682a55d843c6,0x118205ceac4c706e,0x6a11f04f90e38b72,0x5d3f45b03488c345,0x8d467b209896556b,0xbad4287b0ca9e3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x91a5,0xf9ad,0x243c,0xedb9,0xc4f5,0xce5f,0xd6d7,0x3592,0x40df,0xdead,0x1489,0xe297,0x55b1,0xee4d,0xda9d,0x9e1f,0x4a5c,0xd99a,0x6c6b,0xa585,0x62fc,0x4383,0xc1ad,0xc0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xf9ad91a5,0xedb9243c,0xce5fc4f5,0x3592d6d7,0xdead40df,0xe2971489,0xee4d55b1,0x9e1fda9d,0xd99a4a5c,0xa5856c6b,0x438362fc,0xc0c1ad}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xedb9243cf9ad91a5,0x3592d6d7ce5fc4f5,0xe2971489dead40df,0x9e1fda9dee4d55b1,0xa5856c6bd99a4a5c,0xc0c1ad438362fc}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xf454,0x6191,0x2181,0x2fc4,0x66fb,0xc44f,0x7bb6,0x9b1c,0x99f,0xee09,0xb1a3,0xf8f9,0xf234,0x5151,0x595c,0x4e44,0xa80a,0x305c,0x9930,0x25f6,0x8e50,0xb812,0xff4d,0xb8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6191f454,0x2fc42181,0xc44f66fb,0x9b1c7bb6,0xee09099f,0xf8f9b1a3,0x5151f234,0x4e44595c,0x305ca80a,0x25f69930,0xb8128e50,0xb8ff4d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x2fc421816191f454,0x9b1c7bb6c44f66fb,0xf8f9b1a3ee09099f,0x4e44595c5151f234,0x25f69930305ca80a,0xb8ff4db8128e50}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xbc3a,0xaa27,0x97d5,0x3dea,0x8f91,0x53b3,0xfa31,0xee7d,0x748d,0x6f1c,0xfb0,0x95ee,0x3cba,0xcb77,0xba4f,0xa2c0,0xaa94,0x6769,0x84df,0x72b9,0x561c,0x84f3,0x2bd7,0x45}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xaa27bc3a,0x3dea97d5,0x53b38f91,0xee7dfa31,0x6f1c748d,0x95ee0fb0,0xcb773cba,0xa2c0ba4f,0x6769aa94,0x72b984df,0x84f3561c,0x452bd7}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x3dea97d5aa27bc3a,0xee7dfa3153b38f91,0x95ee0fb06f1c748d,0xa2c0ba4fcb773cba,0x72b984df6769aa94,0x452bd784f3561c}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x10c4, 0x1e1a, 0x1b68, 0xa71, 0xa1a, 0x1f60, 0xdda, 0xb59, 0x1bc0, 0x26c, 0x1325, 0x4cf, 0x1375, 0x10ef, 0x1702, 0x1eff, 0x171f, 0x467, 0xc1c, 0xf3b, 0xf74, 0x6fa, 0x177f, 0x911, 0x8bc, 0x16b7, 0x1022, 0xa5f, 0xa55, 0x9} +#elif RADIX == 32 +{0xf0d4311, 0x94e3b68, 0xafb0286, 0x16b2dd, 0x251366f, 0xdd499f3, 0x702877c, 0xdc7fdff, 0x6c1c233, 0xd3dd1e7, 0x2377f37, 0x5ba2f12, 0x4bf022b, 0x9955} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x28694e3b68f0d43, 0x51366f016b2ddafb, 0xf702877cdd499f32, 0x1e76c1c233dc7fdf, 0xa2f122377f37d3dd, 0x45a9554bf022b5b} +#else +{0xd29c76d1e1a86, 0x3c05acb76bec0a, 0x66ea4cf99289b3, 0x3dc7fdff702877, 0x7a7ba3ced83846, 0x56e8bc488ddfcd, 0x22d4aaa5f8115} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x14af, 0x786, 0xeda, 0x129c, 0x286, 0x17d8, 0xb76, 0x2d6, 0x6f0, 0x89b, 0x1cc9, 0x933, 0x1cdd, 0x143b, 0x1dc0, 0x1fbf, 0x1dc7, 0x119, 0x1b07, 0x3ce, 0x13dd, 0x19be, 0xddf, 0x244, 0x1a2f, 0x15ad, 0x1c08, 0xa97, 0xa95, 0x3} +#elif RADIX == 32 +{0x3c352bc, 0xa538eda, 0x6bec0a1, 0xc05acb7, 0xc944d9b, 0x375267c, 0xdc0a1df, 0xf71ff7f, 0xdb0708c, 0xf4f7479, 0x88ddfcd, 0xd6e8bc4, 0x52fc08a, 0x1aa55} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xc0a1a538eda3c352, 0x944d9bc05acb76be, 0xfdc0a1df375267cc, 0x479db0708cf71ff7, 0xe8bc488ddfcdf4f7, 0x2fd6a5552fc08ad6} +#else +{0x434a71db4786a5, 0x6f016b2ddafb02, 0x79ba933e64a26c, 0x4f71ff7fdc0a1d, 0x3e9ee8f3b60e11, 0x35ba2f122377f3, 0x7ab52aa97e045} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0xd3b, 0x1cbd, 0x1177, 0x1087, 0x5d2, 0x1535, 0x1cb5, 0x1372, 0x158a, 0x931, 0x12da, 0x1b9d, 0x44e, 0xa00, 0xb71, 0xe8a, 0x1c57, 0x1a1, 0x5bb, 0x1180, 0x15f0, 0x1ca3, 0x119b, 0x16cc, 0xd3a, 0xaa7, 0xbc3, 0x9fc, 0xb07, 0x1a} +#elif RADIX == 32 +{0xe5eb4ef, 0xa10f177, 0x5a9a974, 0x2a6e5cb, 0xda498d6, 0x13b73b2, 0xb715001, 0xf15dd14, 0x5bb0d0, 0x1d7c230, 0x9919be5, 0x53b4ead, 0x3f8bc35, 0xfc1d} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xa974a10f177e5eb4, 0xa498d62a6e5cb5a9, 0x4b71500113b73b2d, 0x23005bb0d0f15dd1, 0xb4ead9919be51d7c, 0x3cbec1d3f8bc3553} +#else +{0x69421e2efcbd69, 0x58a9b972d6a6a5, 0x89db9d96d24c6, 0xf15dd14b71500, 0x23af84600b761a, 0x54ed3ab66466f9, 0xe1f60e9fc5e1a} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x186, 0x245, 0xa48, 0x11da, 0x1354, 0x9fc, 0x168f, 0xff7, 0x1f2c, 0x6a2, 0x6fb, 0x980, 0x164f, 0xbb8, 0x49c, 0x1ad1, 0x145f, 0x80a, 0xf93, 0x2d8, 0x1846, 0x43, 0x5a9, 0x3a, 0x72e, 0x1e10, 0x741, 0x783, 0x967, 0x1a} +#elif RADIX == 32 +{0x122861b, 0x23b4a48, 0xf4fe4d5, 0xb1fef68, 0xfb3517c, 0x93d3006, 0x49c5dc5, 0x517f5a2, 0xf93405, 0x1e1185b, 0x745a902, 0x81cb80, 0xf06741f, 0xf59c} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xe4d523b4a4812286, 0xb3517cb1fef68f4f, 0x249c5dc593d3006f, 0x85b0f93405517f5a, 0x1cb80745a9021e11, 0x6ea59cf06741f08} +#else +{0x2a47694902450c, 0x72c7fbda3d3f93, 0x2c9e98037d9a8b, 0x5517f5a249c5dc, 0x43c230b61f2680, 0x42072e01d16a40, 0x3752ce7833a0f} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1064, 0x8a7, 0x7c, 0x1876, 0xf16, 0x3a0, 0x124, 0x637, 0x11bf, 0x223, 0x6d, 0x58e, 0xcde, 0xaf, 0x99c, 0x1c62, 0xdcb, 0xe10, 0x7ba, 0x127f, 0x1a23, 0x69a, 0x7bd, 0x238, 0x455, 0x16ac, 0x1147, 0x12a, 0x14c1, 0x5} +#elif RADIX == 32 +{0x453c190, 0xb0ec07c, 0x41d03c5, 0xfcc6e12, 0x6d111c6, 0x378b1c0, 0x99c057b, 0x372f8c4, 0xe7ba708, 0xd688e4f, 0x707bd34, 0x5611544, 0x255147b, 0x2d304} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3c5b0ec07c453c1, 0xd111c6fcc6e1241d, 0x499c057b378b1c06, 0xe4fe7ba708372f8c, 0x11544707bd34d688, 0x24bd304255147b56} +#else +{0xb61d80f88a783, 0x1bf31b8490740f, 0x59bc58e036888e, 0x372f8c499c057, 0x1ad11c9fcf74e1, 0x55845511c1ef4d, 0x21e98212a8a3d} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0xaab, 0x60b, 0x8a0, 0x15d7, 0xbd8, 0x3ab, 0x1641, 0x1771, 0x134a, 0x17a, 0x785, 0x624, 0x1d, 0x1c3d, 0xcb1, 0xb5e, 0x23f, 0xf53, 0x879, 0x5e2, 0x903, 0xaff, 0xf72, 0xa2d, 0x7f4, 0xeb8, 0xd96, 0x1715, 0xffa, 0xa} +#elif RADIX == 32 +{0x305aaad, 0x2bae8a0, 0x11d5af6, 0x2aee364, 0x850bd4d, 0x74c487, 0xcb1e1e8, 0x88fd6bc, 0x48797a9, 0xfa40cbc, 0x5af7257, 0x5c1fd14, 0xe2ad967, 0x12fea} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x5af62bae8a0305aa, 0x50bd4d2aee36411d, 0xccb1e1e8074c4878, 0xcbc48797a988fd6b, 0x1fd145af7257fa40, 0x2bfffeae2ad9675c} +#else +{0x6c575d14060b55, 0x34abb8d904756b, 0x403a6243c285ea, 0x188fd6bccb1e1e, 0x7f48197890f2f5, 0x5707f4516bdc95, 0x5bfff57156cb3} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x195c, 0x1d55, 0x99f, 0x11f, 0x106b, 0xab1, 0x3e7, 0x1e40, 0xa1e, 0xdf0, 0x1dd4, 0x5cd, 0xfc3, 0x1c99, 0xbfa, 0x1ead, 0x1f6, 0x12fa, 0x1465, 0xad7, 0x1a84, 0x18d8, 0x1b7f, 0x9fe, 0x14b1, 0x13b7, 0x189f, 0x12bc, 0xabc, 0x1f} +#elif RADIX == 32 +{0xeaae573, 0xc23e99f, 0x7558c1a, 0x7bc803e, 0xd46f828, 0xf0cb9bd, 0xbfae4cb, 0x7dbd5a, 0xf46597d, 0xc6a115a, 0xfdb7fc6, 0xdbd2c53, 0x57989f9, 0x37af2} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x8c1ac23e99feaae5, 0x46f8287bc803e755, 0xabfae4cbf0cb9bdd, 0x15af46597d07dbd5, 0xd2c53fdb7fc6c6a1, 0x1d6aaf257989f9db} +#else +{0x35847d33fd55ca, 0x21ef200f9d5630, 0x5f865cdeea37c1, 0x507dbd5abfae4c, 0x58d422b5e8cb2f, 0x76f4b14ff6dff1, 0xeb55792bcc4fc} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x970, 0x18b4, 0xc62, 0xf59, 0xf33, 0x6c0, 0x5ae, 0x86b, 0x1690, 0x17e1, 0x829, 0xab5, 0x169, 0x1115, 0x1b7e, 0x17fa, 0xcae, 0x1b7, 0xc7b, 0xb70, 0x11fc, 0x1417, 0x8b4, 0x1b78, 0x35a, 0x18e, 0x1e46, 0x15f0, 0xf64, 0x15} +#elif RADIX == 32 +{0xc5a25c2, 0xdeb2c62, 0xe3603cc, 0x410d65a, 0x29bf0da, 0x5a556a8, 0xb7e88a8, 0xb2baff5, 0xc7b0db, 0xbc7f16e, 0xf08b4a0, 0xc70d6b6, 0xbe1e460, 0x29d92} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3ccdeb2c62c5a25, 0x9bf0da410d65ae36, 0x5b7e88a85a556a82, 0x16e0c7b0dbb2baff, 0xd6b6f08b4a0bc7f, 0x316bd92be1e460c7} +#else +{0x19bd658c58b44b, 0x69043596b8d80f, 0x42d2ab5414df86, 0x3b2baff5b7e88a, 0x178fe2dc18f61b, 0x31c35adbc22d28, 0x875ec95f0f230} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x807f,0x9ad4,0xa2d5,0xb571,0xe39a,0x9682,0xbc36,0x2fde,0x80a1,0x55a9,0x2092,0x49c9,0x4269,0x7a75,0x7411,0xde67,0x75d6,0x9689,0xaf23,0x7b89,0x819b,0x60e4,0x276f,0x1a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9ad4807f,0xb571a2d5,0x9682e39a,0x2fdebc36,0x55a980a1,0x49c92092,0x7a754269,0xde677411,0x968975d6,0x7b89af23,0x60e4819b,0x1a276f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xb571a2d59ad4807f,0x2fdebc369682e39a,0x49c9209255a980a1,0xde6774117a754269,0x7b89af23968975d6,0x1a276f60e4819b}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xc876,0x218,0xd2f9,0x49ab,0x3ef7,0x1ab3,0x4dc4,0xf981,0x381a,0xdb9c,0x12c5,0xc5e1,0x5b21,0xc148,0x9d31,0x5369,0x5706,0x2277,0xcf63,0x1c7d,0xe151,0xd481,0xcd50,0x4b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x218c876,0x49abd2f9,0x1ab33ef7,0xf9814dc4,0xdb9c381a,0xc5e112c5,0xc1485b21,0x53699d31,0x22775706,0x1c7dcf63,0xd481e151,0x4bcd50}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x49abd2f90218c876,0xf9814dc41ab33ef7,0xc5e112c5db9c381a,0x53699d31c1485b21,0x1c7dcf6322775706,0x4bcd50d481e151}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x2191,0x98ac,0x5708,0x78cc,0x63fa,0xe9c9,0x168,0x4c13,0x19e6,0xe2be,0xd010,0xd629,0xf3ff,0x3b08,0x7c2b,0xed3e,0x356e,0x5d94,0x253b,0xa0f5,0xc652,0x60d4,0x9dac,0x63}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x98ac2191,0x78cc5708,0xe9c963fa,0x4c130168,0xe2be19e6,0xd629d010,0x3b08f3ff,0xed3e7c2b,0x5d94356e,0xa0f5253b,0x60d4c652,0x639dac}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x78cc570898ac2191,0x4c130168e9c963fa,0xd629d010e2be19e6,0xed3e7c2b3b08f3ff,0xa0f5253b5d94356e,0x639dac60d4c652}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x7f81,0x652b,0x5d2a,0x4a8e,0x1c65,0x697d,0x43c9,0xd021,0x7f5e,0xaa56,0xdf6d,0xb636,0xbd96,0x858a,0x8bee,0x2198,0x8a29,0x6976,0x50dc,0x8476,0x7e64,0x9f1b,0xd890,0xe5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x652b7f81,0x4a8e5d2a,0x697d1c65,0xd02143c9,0xaa567f5e,0xb636df6d,0x858abd96,0x21988bee,0x69768a29,0x847650dc,0x9f1b7e64,0xe5d890}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x4a8e5d2a652b7f81,0xd02143c9697d1c65,0xb636df6daa567f5e,0x21988bee858abd96,0x847650dc69768a29,0xe5d8909f1b7e64}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa74d,0x6268,0x6670,0x157d,0x36bf,0xbff5,0x13f3,0x62fb,0x404b,0x863b,0xb7a3,0xada5,0x355f,0xc945,0x6b4c,0x7d75,0x9efd,0x8901,0x4c90,0xba3e,0x48f0,0x5677,0x49eb,0x93}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6268a74d,0x157d6670,0xbff536bf,0x62fb13f3,0x863b404b,0xada5b7a3,0xc945355f,0x7d756b4c,0x89019efd,0xba3e4c90,0x567748f0,0x9349eb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x157d66706268a74d,0x62fb13f3bff536bf,0xada5b7a3863b404b,0x7d756b4cc945355f,0xba3e4c9089019efd,0x9349eb567748f0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xd72,0xd1f5,0x548,0xe0a7,0xee15,0xfdbc,0xc63c,0xd72b,0x1e45,0xe787,0xc513,0xb278,0x7cd,0xcab5,0x5ced,0x8be9,0xf4a4,0x9711,0xe9d8,0x872d,0x443,0xead0,0xe34d,0x2e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xd1f50d72,0xe0a70548,0xfdbcee15,0xd72bc63c,0xe7871e45,0xb278c513,0xcab507cd,0x8be95ced,0x9711f4a4,0x872de9d8,0xead00443,0x2ee34d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xe0a70548d1f50d72,0xd72bc63cfdbcee15,0xb278c513e7871e45,0x8be95cedcab507cd,0x872de9d89711f4a4,0x2ee34dead00443}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xcecc,0x7789,0xbdb9,0x22b4,0x782f,0x794e,0x8e17,0xd2cc,0x1fb,0x1927,0x9c88,0x929,0x22b0,0x746e,0xd62b,0xade1,0xc7dd,0x5e2a,0xd146,0x7363,0xca5e,0x5460,0xd2b3,0xee}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7789cecc,0x22b4bdb9,0x794e782f,0xd2cc8e17,0x192701fb,0x9299c88,0x746e22b0,0xade1d62b,0x5e2ac7dd,0x7363d146,0x5460ca5e,0xeed2b3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x22b4bdb97789cecc,0xd2cc8e17794e782f,0x9299c88192701fb,0xade1d62b746e22b0,0x7363d1465e2ac7dd,0xeed2b35460ca5e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x58b3,0x9d97,0x998f,0xea82,0xc940,0x400a,0xec0c,0x9d04,0xbfb4,0x79c4,0x485c,0x525a,0xcaa0,0x36ba,0x94b3,0x828a,0x6102,0x76fe,0xb36f,0x45c1,0xb70f,0xa988,0xb614,0x6c}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9d9758b3,0xea82998f,0x400ac940,0x9d04ec0c,0x79c4bfb4,0x525a485c,0x36bacaa0,0x828a94b3,0x76fe6102,0x45c1b36f,0xa988b70f,0x6cb614}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xea82998f9d9758b3,0x9d04ec0c400ac940,0x525a485c79c4bfb4,0x828a94b336bacaa0,0x45c1b36f76fe6102,0x6cb614a988b70f}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x313b,0xc18a,0x812a,0x406d,0x472a,0x9fca,0x9f07,0xb030,0x8b7b,0x7924,0x2af6,0x9e99,0x2b81,0x8eb8,0x35ee,0x59c8,0x7655,0x34cc,0x5aaf,0x326,0xe58d,0xf8b7,0x969a,0x6e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xc18a313b,0x406d812a,0x9fca472a,0xb0309f07,0x79248b7b,0x9e992af6,0x8eb82b81,0x59c835ee,0x34cc7655,0x3265aaf,0xf8b7e58d,0x6e969a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x406d812ac18a313b,0xb0309f079fca472a,0x9e992af679248b7b,0x59c835ee8eb82b81,0x3265aaf34cc7655,0x6e969af8b7e58d}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x6610,0xfd89,0xb147,0xcf39,0x2b02,0x4ccf,0xed64,0x8470,0xaaf6,0x1891,0x8c78,0xf074,0x8a4c,0xfaed,0xd66c,0xf52b,0xf1c5,0xb0a,0x5cd,0x46f8,0x79a3,0x81de,0x451d,0xd9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xfd896610,0xcf39b147,0x4ccf2b02,0x8470ed64,0x1891aaf6,0xf0748c78,0xfaed8a4c,0xf52bd66c,0xb0af1c5,0x46f805cd,0x81de79a3,0xd9451d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xcf39b147fd896610,0x8470ed644ccf2b02,0xf0748c781891aaf6,0xf52bd66cfaed8a4c,0x46f805cd0b0af1c5,0xd9451d81de79a3}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1869,0x2ce0,0x425c,0x7d0f,0x30c8,0x1c3e,0xd562,0xfb41,0x3951,0xeccc,0x9c8a,0xb265,0x829,0xd879,0x3c42,0x2cbf,0xb1d2,0xd9d3,0xee28,0x7fdf,0xccdd,0x3ad,0xa6d9,0x3b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x2ce01869,0x7d0f425c,0x1c3e30c8,0xfb41d562,0xeccc3951,0xb2659c8a,0xd8790829,0x2cbf3c42,0xd9d3b1d2,0x7fdfee28,0x3adccdd,0x3ba6d9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7d0f425c2ce01869,0xfb41d5621c3e30c8,0xb2659c8aeccc3951,0x2cbf3c42d8790829,0x7fdfee28d9d3b1d2,0x3ba6d903adccdd}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xcec5,0x3e75,0x7ed5,0xbf92,0xb8d5,0x6035,0x60f8,0x4fcf,0x7484,0x86db,0xd509,0x6166,0xd47e,0x7147,0xca11,0xa637,0x89aa,0xcb33,0xa550,0xfcd9,0x1a72,0x748,0x6965,0x91}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x3e75cec5,0xbf927ed5,0x6035b8d5,0x4fcf60f8,0x86db7484,0x6166d509,0x7147d47e,0xa637ca11,0xcb3389aa,0xfcd9a550,0x7481a72,0x916965}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xbf927ed53e75cec5,0x4fcf60f86035b8d5,0x6166d50986db7484,0xa637ca117147d47e,0xfcd9a550cb3389aa,0x91696507481a72}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x807f,0x9ad4,0xa2d5,0xb571,0xe39a,0x9682,0xbc36,0x2fde,0x80a1,0x55a9,0x2092,0x49c9,0x4269,0x7a75,0x7411,0xde67,0x75d6,0x9689,0xaf23,0x7b89,0x819b,0x60e4,0x276f,0x1a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9ad4807f,0xb571a2d5,0x9682e39a,0x2fdebc36,0x55a980a1,0x49c92092,0x7a754269,0xde677411,0x968975d6,0x7b89af23,0x60e4819b,0x1a276f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xb571a2d59ad4807f,0x2fdebc369682e39a,0x49c9209255a980a1,0xde6774117a754269,0x7b89af23968975d6,0x1a276f60e4819b}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xc876,0x218,0xd2f9,0x49ab,0x3ef7,0x1ab3,0x4dc4,0xf981,0x381a,0xdb9c,0x12c5,0xc5e1,0x5b21,0xc148,0x9d31,0x5369,0x5706,0x2277,0xcf63,0x1c7d,0xe151,0xd481,0xcd50,0x4b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x218c876,0x49abd2f9,0x1ab33ef7,0xf9814dc4,0xdb9c381a,0xc5e112c5,0xc1485b21,0x53699d31,0x22775706,0x1c7dcf63,0xd481e151,0x4bcd50}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x49abd2f90218c876,0xf9814dc41ab33ef7,0xc5e112c5db9c381a,0x53699d31c1485b21,0x1c7dcf6322775706,0x4bcd50d481e151}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x2191,0x98ac,0x5708,0x78cc,0x63fa,0xe9c9,0x168,0x4c13,0x19e6,0xe2be,0xd010,0xd629,0xf3ff,0x3b08,0x7c2b,0xed3e,0x356e,0x5d94,0x253b,0xa0f5,0xc652,0x60d4,0x9dac,0x63}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x98ac2191,0x78cc5708,0xe9c963fa,0x4c130168,0xe2be19e6,0xd629d010,0x3b08f3ff,0xed3e7c2b,0x5d94356e,0xa0f5253b,0x60d4c652,0x639dac}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x78cc570898ac2191,0x4c130168e9c963fa,0xd629d010e2be19e6,0xed3e7c2b3b08f3ff,0xa0f5253b5d94356e,0x639dac60d4c652}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x7f81,0x652b,0x5d2a,0x4a8e,0x1c65,0x697d,0x43c9,0xd021,0x7f5e,0xaa56,0xdf6d,0xb636,0xbd96,0x858a,0x8bee,0x2198,0x8a29,0x6976,0x50dc,0x8476,0x7e64,0x9f1b,0xd890,0xe5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x652b7f81,0x4a8e5d2a,0x697d1c65,0xd02143c9,0xaa567f5e,0xb636df6d,0x858abd96,0x21988bee,0x69768a29,0x847650dc,0x9f1b7e64,0xe5d890}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x4a8e5d2a652b7f81,0xd02143c9697d1c65,0xb636df6daa567f5e,0x21988bee858abd96,0x847650dc69768a29,0xe5d8909f1b7e64}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x53a7,0x3134,0xb338,0x8abe,0x9b5f,0xdffa,0x89f9,0xb17d,0xa025,0xc31d,0xdbd1,0xd6d2,0x9aaf,0x64a2,0xb5a6,0xbeba,0xcf7e,0x4480,0x2648,0x5d1f,0xa478,0xab3b,0xa4f5,0xc9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x313453a7,0x8abeb338,0xdffa9b5f,0xb17d89f9,0xc31da025,0xd6d2dbd1,0x64a29aaf,0xbebab5a6,0x4480cf7e,0x5d1f2648,0xab3ba478,0xc9a4f5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x8abeb338313453a7,0xb17d89f9dffa9b5f,0xd6d2dbd1c31da025,0xbebab5a664a29aaf,0x5d1f26484480cf7e,0xc9a4f5ab3ba478}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x86b9,0x68fa,0x82a4,0xf053,0x770a,0x7ede,0xe31e,0xeb95,0x8f22,0xf3c3,0x6289,0xd93c,0x83e6,0xe55a,0xae76,0x45f4,0xfa52,0x4b88,0xf4ec,0xc396,0x221,0xf568,0x71a6,0x97}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x68fa86b9,0xf05382a4,0x7ede770a,0xeb95e31e,0xf3c38f22,0xd93c6289,0xe55a83e6,0x45f4ae76,0x4b88fa52,0xc396f4ec,0xf5680221,0x9771a6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xf05382a468fa86b9,0xeb95e31e7ede770a,0xd93c6289f3c38f22,0x45f4ae76e55a83e6,0xc396f4ec4b88fa52,0x9771a6f5680221}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xe766,0xbbc4,0x5edc,0x915a,0x3c17,0xbca7,0x470b,0xe966,0x80fd,0xc93,0xce44,0x494,0x1158,0xba37,0xeb15,0xd6f0,0x63ee,0x2f15,0xe8a3,0x39b1,0x652f,0xaa30,0x6959,0xf7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xbbc4e766,0x915a5edc,0xbca73c17,0xe966470b,0xc9380fd,0x494ce44,0xba371158,0xd6f0eb15,0x2f1563ee,0x39b1e8a3,0xaa30652f,0xf76959}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x915a5edcbbc4e766,0xe966470bbca73c17,0x494ce440c9380fd,0xd6f0eb15ba371158,0x39b1e8a32f1563ee,0xf76959aa30652f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xac5a,0xcecb,0x4cc7,0x7541,0x64a0,0x2005,0x7606,0x4e82,0x5fda,0x3ce2,0x242e,0x292d,0x6550,0x9b5d,0x4a59,0x4145,0x3081,0xbb7f,0xd9b7,0xa2e0,0x5b87,0x54c4,0x5b0a,0x36}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xcecbac5a,0x75414cc7,0x200564a0,0x4e827606,0x3ce25fda,0x292d242e,0x9b5d6550,0x41454a59,0xbb7f3081,0xa2e0d9b7,0x54c45b87,0x365b0a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x75414cc7cecbac5a,0x4e827606200564a0,0x292d242e3ce25fda,0x41454a599b5d6550,0xa2e0d9b7bb7f3081,0x365b0a54c45b87}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x29a3,0x7abe,0x2ef1,0x26a6,0xa5a5,0x54e6,0xf4c8,0xb56f,0x2bae,0x1aae,0xd9ba,0x94ed,0x2df5,0x882c,0xc686,0x6f64,0x29f7,0x850a,0x9eee,0x617c,0x5678,0x3108,0x8ebe,0x86}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7abe29a3,0x26a62ef1,0x54e6a5a5,0xb56ff4c8,0x1aae2bae,0x94edd9ba,0x882c2df5,0x6f64c686,0x850a29f7,0x617c9eee,0x31085678,0x868ebe}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x26a62ef17abe29a3,0xb56ff4c854e6a5a5,0x94edd9ba1aae2bae,0x6f64c686882c2df5,0x617c9eee850a29f7,0x868ebe31085678}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xc2a5,0x8ce6,0x3729,0xaa2b,0xb9d2,0xbf43,0xe2be,0xaf25,0x4ffb,0xec8e,0xf85a,0x94c6,0xe027,0x3c64,0xf4ad,0xf63,0x86ba,0xa244,0xde0f,0x2390,0x11e1,0xdd7c,0xcd4c,0x33}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x8ce6c2a5,0xaa2b3729,0xbf43b9d2,0xaf25e2be,0xec8e4ffb,0x94c6f85a,0x3c64e027,0xf63f4ad,0xa24486ba,0x2390de0f,0xdd7c11e1,0x33cd4c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xaa2b37298ce6c2a5,0xaf25e2bebf43b9d2,0x94c6f85aec8e4ffb,0xf63f4ad3c64e027,0x2390de0fa24486ba,0x33cd4cdd7c11e1}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1893,0xa4bf,0x1eb8,0x9df0,0x91b1,0x17b0,0xe4ae,0x6ba1,0x35fd,0xd56b,0xc03f,0x82a8,0x99cd,0x30be,0xf3a3,0x181e,0x879b,0x518,0x3e8,0xed0e,0xc0ff,0xe2d6,0xe29c,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xa4bf1893,0x9df01eb8,0x17b091b1,0x6ba1e4ae,0xd56b35fd,0x82a8c03f,0x30be99cd,0x181ef3a3,0x518879b,0xed0e03e8,0xe2d6c0ff,0x1e29c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9df01eb8a4bf1893,0x6ba1e4ae17b091b1,0x82a8c03fd56b35fd,0x181ef3a330be99cd,0xed0e03e80518879b,0x1e29ce2d6c0ff}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xd65d,0x8541,0xd10e,0xd959,0x5a5a,0xab19,0xb37,0x4a90,0xd451,0xe551,0x2645,0x6b12,0xd20a,0x77d3,0x3979,0x909b,0xd608,0x7af5,0x6111,0x9e83,0xa987,0xcef7,0x7141,0x79}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x8541d65d,0xd959d10e,0xab195a5a,0x4a900b37,0xe551d451,0x6b122645,0x77d3d20a,0x909b3979,0x7af5d608,0x9e836111,0xcef7a987,0x797141}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xd959d10e8541d65d,0x4a900b37ab195a5a,0x6b122645e551d451,0x909b397977d3d20a,0x9e8361117af5d608,0x797141cef7a987}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x187f, 0x1c7d, 0x163a, 0x54d, 0x197f, 0x1a5d, 0x1833, 0x823, 0x11ae, 0x225, 0xd6d, 0x1627, 0xd6c, 0x1625, 0xa36, 0xf64, 0xcfa, 0x327, 0x188d, 0xfab, 0x56b, 0x91c, 0x1cc5, 0x4fe, 0x2ae, 0x181a, 0x195, 0x1288, 0x10fc, 0x3} +#elif RADIX == 32 +{0xe3ee1fc, 0xca9b63a, 0x3d2ee5f, 0xb904783, 0x6d112c6, 0x5b2c4ed, 0xa36b12b, 0xb3e9ec8, 0x788d193, 0xe15adf5, 0xfdcc548, 0xd0ab89, 0x510195c, 0x1c3f2} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xee5fca9b63ae3ee1, 0xd112c6b9047833d2, 0x8a36b12b5b2c4ed6, 0xdf5788d193b3e9ec, 0xab89fdcc548e15a, 0x40183f2510195c0d} +#else +{0x3f9536c75c7dc3, 0x1ae411e0cf4bb9, 0x5ad96276b68896, 0x3b3e9ec8a36b12, 0x1c2b5beaf11a32, 0x342ae27f73152, 0xfcc1f92880cae} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0xe9d, 0x171f, 0xd8e, 0x1953, 0xe5f, 0x1e97, 0x1e0c, 0x1208, 0xc6b, 0x889, 0x1b5b, 0x589, 0xb5b, 0x1589, 0x28d, 0x13d9, 0x1b3e, 0x8c9, 0x1e23, 0x1bea, 0x15a, 0xa47, 0x1731, 0x113f, 0x10ab, 0xe06, 0x65, 0x4a2, 0x83f, 0x1a} +#elif RADIX == 32 +{0xb8fba77, 0xf2a6d8e, 0xcf4bb97, 0xae411e0, 0x5b444b1, 0xd6cb13b, 0x28dac4a, 0xecfa7b2, 0x5e23464, 0x3856b7d, 0x7f73152, 0x342ae2, 0x9440657, 0xf0fc} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xbb97f2a6d8eb8fba, 0xb444b1ae411e0cf4, 0x228dac4ad6cb13b5, 0xb7d5e23464ecfa7b, 0x42ae27f731523856, 0x1e460fc944065703} +#else +{0x2fe54db1d71f74, 0x46b9047833d2ee, 0x56b6589dada225, 0x4ecfa7b228dac4, 0x470ad6fabc468c, 0x40d0ab89fdcc54, 0xf2307e4a2032b} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x237, 0xee8, 0xd8c, 0xafb, 0x18cd, 0x1ce1, 0x162a, 0x11c9, 0x1bbc, 0x1415, 0x1c35, 0x1d0c, 0x1104, 0x1558, 0x9d, 0xb17, 0x1097, 0x16d2, 0xc02, 0x1573, 0x1c5f, 0x1bec, 0x1a73, 0x1dfe, 0x1923, 0x18d6, 0x221, 0x11ee, 0x1581, 0xb} +#elif RADIX == 32 +{0x77408dd, 0x55f6d8c, 0xae70e33, 0xf239362, 0x35a0aee, 0x413a19c, 0x9daac4, 0x425d62e, 0x6c02b69, 0x6717eae, 0xfda73df, 0x6b648fb, 0x3dc221c, 0x1c606} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xe3355f6d8c77408, 0x5a0aeef239362ae7, 0xe09daac4413a19c3, 0xeae6c02b69425d62, 0x648fbfda73df6717, 0x38396063dc221c6b} +#else +{0x66abedb18ee811, 0x3bc8e4d8ab9c38, 0x2209d0ce1ad057, 0x1425d62e09daac, 0x6ce2fd5cd8056d, 0x1ad923eff69cf7, 0xbdcb031ee110e} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x16a4, 0x11f0, 0x446, 0x1b2b, 0x129e, 0x1b52, 0x25, 0x18e4, 0x15d7, 0x545, 0x1502, 0x3af, 0x1b45, 0xff3, 0x1423, 0x1574, 0x1c5a, 0xff0, 0x1663, 0x114b, 0xc99, 0x1c89, 0x11f0, 0x15fd, 0x17a1, 0x14dd, 0x17f7, 0x1451, 0x5af, 0x17} +#elif RADIX == 32 +{0x8f85a92, 0xb656446, 0x5da94a7, 0x5f1c802, 0x22a2d7, 0xd1475f5, 0x4237f9e, 0x716aae9, 0x76637f8, 0x4b26629, 0xfb1f0e4, 0x6ede86b, 0x8a37f7a, 0x376be} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x94a7b6564468f85a, 0x22a2d75f1c8025da, 0x94237f9ed1475f50, 0x62976637f8716aae, 0xde86bfb1f0e44b26, 0x25496be8a37f7a6e} +#else +{0x4f6cac88d1f0b5, 0x5d7c7200976a52, 0x768a3afa811516, 0x716aae94237f9, 0x964cc52ecc6ff, 0x1bb7a1afec7c39, 0x264b5f451bfbd} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0xc89, 0x16f8, 0x1bcf, 0x14c7, 0x1c81, 0x1c37, 0x3b1, 0xb00, 0x5e, 0xdb5, 0x920, 0x14db, 0x41, 0x1bd7, 0x159d, 0x1889, 0x1318, 0x95d, 0x13d5, 0x46b, 0x18bd, 0x1bf1, 0x1bf6, 0x1ba2, 0x2d6, 0x1b06, 0x17c1, 0x1a40, 0x1f02, 0x11} +#elif RADIX == 32 +{0xb7c3226, 0x698fbcf, 0x1e1bf20, 0x796003b, 0x206da81, 0x1069b69, 0x59ddeb8, 0xcc63113, 0x73d54ae, 0x8e2f48d, 0x45bf6df, 0x830b5b7, 0x4817c1d, 0xdc0b} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xbf20698fbcfb7c32, 0x6da81796003b1e1, 0x359ddeb81069b692, 0x48d73d54aecc6311, 0xb5b745bf6df8e2f, 0x9b3c0b4817c1d83} +#else +{0x40d31f79f6f864, 0x5e5800ec786fc, 0x40834db49036d4, 0x6cc6311359ddeb, 0x71c5e91ae7aa95, 0x60c2d6dd16fdb7, 0x4d9e05a40be0e} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x8c0, 0x125b, 0x1d1c, 0x8a8, 0x1c41, 0xbb7, 0x15bf, 0x15ec, 0x959, 0x1fc5, 0xc2, 0x2ff, 0x1dd2, 0x1c02, 0x9db, 0x139d, 0x9a, 0x1654, 0xce7, 0xf6d, 0x13e5, 0x19be, 0x1f28, 0x161c, 0xe9f, 0x940, 0x77d, 0x162c, 0x385, 0x4} +#elif RADIX == 32 +{0x92da300, 0x5151d1c, 0xf5dbf10, 0x66bd95b, 0xc2fe2a5, 0x7485fe0, 0x9dbe017, 0x26a73a, 0xace7b2a, 0xf4f95ed, 0x39f28cd, 0xa03a7ec, 0xc5877d4, 0x20e16} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xbf105151d1c92da3, 0x2fe2a566bd95bf5d, 0xa9dbe0177485fe0c, 0x5edace7b2a026a73, 0x3a7ec39f28cdf4f9, 0x20e16c5877d4a0} +#else +{0x20a2a3a3925b46, 0x159af656fd76fc, 0x3ba42ff0617f15, 0x2026a73a9dbe01, 0x3e9f2bdb59cf65, 0x280e9fb0e7ca33, 0x1070b62c3bea} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0xd30, 0x670, 0x165f, 0x18f8, 0x3fe, 0x11e5, 0x663, 0x270, 0x18cb, 0x42b, 0x11c3, 0xe0a, 0x4fc, 0x18ad, 0xfd0, 0x3fa, 0x1957, 0x1544, 0x941, 0x181e, 0x661, 0x18b9, 0x74a, 0xa70, 0x866, 0x11f8, 0xd20, 0xae3, 0x19b8, 0xb} +#elif RADIX == 32 +{0x33834c1, 0xb1f165f, 0x38f28ff, 0x2c4e066, 0xc3215e3, 0x3f1c151, 0xfd0c569, 0x655c7f4, 0xc941aa2, 0xc998703, 0xe074ac5, 0xfc21994, 0x5c6d208, 0x1d6e1} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x28ffb1f165f33834, 0x3215e32c4e06638f, 0x4fd0c5693f1c151c, 0x703c941aa2655c7f, 0x21994e074ac5c998, 0x311e6e15c6d208fc} +#else +{0x7f63e2cbe67069, 0xcb138198e3ca3, 0x49f8e0a8e190af, 0x2655c7f4fd0c56, 0x39330e07928354, 0x3f08665381d2b1, 0x84f370ae36904} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1f47, 0x9e3, 0x5d, 0xdc6, 0x18a3, 0x1c99, 0x1253, 0x179f, 0x16b, 0x1b87, 0x27a, 0x9f8, 0x1064, 0x9ed, 0xe66, 0x47d, 0x4e9, 0x1805, 0x1349, 0x40, 0x1bbd, 0x7f6, 0x1c57, 0x1f9f, 0x11e9, 0x14cf, 0xe61, 0x1892, 0x833, 0x10} +#elif RADIX == 32 +{0x4f1fd1e, 0xdb8c05d, 0x3e4ce28, 0xaef3f25, 0x7adc385, 0x1913f02, 0xe664f6c, 0x93a48fa, 0x1349c02, 0xb6ef408, 0x3fc573f, 0x67c7a7f, 0x124e61a, 0xcf} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xce28db8c05d4f1fd, 0xadc385aef3f253e4, 0xae664f6c1913f027, 0x4081349c0293a48f, 0xc7a7f3fc573fb6ef, 0x79e0cf124e61a67} +#else +{0x51b7180ba9e3fa, 0x16bbcfc94f9338, 0x60c89f813d6e1c, 0x293a48fae664f6, 0x76dde810269380, 0x19f1e9fcff15cf, 0x3cf067892730d} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x5419,0x8a5a,0x8d5e,0x1367,0xae77,0x3903,0xcf47,0xab31,0xf30c,0x9219,0xed73,0x2055,0xcc84,0x4098,0x7046,0x4d6f,0x5c68,0xe641,0x224,0xd5ed,0x977a,0xdfcd,0x15c8,0xe4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x8a5a5419,0x13678d5e,0x3903ae77,0xab31cf47,0x9219f30c,0x2055ed73,0x4098cc84,0x4d6f7046,0xe6415c68,0xd5ed0224,0xdfcd977a,0xe415c8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x13678d5e8a5a5419,0xab31cf473903ae77,0x2055ed739219f30c,0x4d6f70464098cc84,0xd5ed0224e6415c68,0xe415c8dfcd977a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x92ea,0x29a5,0x41ba,0x7e17,0x33c,0xaeb2,0x4b64,0x1b0d,0x4be,0xe57e,0x2d2e,0x1554,0xe7f7,0xea1e,0x4267,0x7d2a,0x17cd,0xd234,0xc388,0x147a,0x43e6,0xaa63,0x83bd,0x4f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x29a592ea,0x7e1741ba,0xaeb2033c,0x1b0d4b64,0xe57e04be,0x15542d2e,0xea1ee7f7,0x7d2a4267,0xd23417cd,0x147ac388,0xaa6343e6,0x4f83bd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7e1741ba29a592ea,0x1b0d4b64aeb2033c,0x15542d2ee57e04be,0x7d2a4267ea1ee7f7,0x147ac388d23417cd,0x4f83bdaa6343e6}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa8b7,0x5b17,0x819c,0x465e,0xa6fb,0xb2a1,0x91c3,0x953,0x486,0x4ed4,0xc367,0x75ba,0xcc01,0x115f,0xe242,0xe751,0x4748,0xbf53,0x4ec0,0x950a,0xe08e,0x7ea2,0xec82,0x7d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x5b17a8b7,0x465e819c,0xb2a1a6fb,0x95391c3,0x4ed40486,0x75bac367,0x115fcc01,0xe751e242,0xbf534748,0x950a4ec0,0x7ea2e08e,0x7dec82}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x465e819c5b17a8b7,0x95391c3b2a1a6fb,0x75bac3674ed40486,0xe751e242115fcc01,0x950a4ec0bf534748,0x7dec827ea2e08e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xabe7,0x75a5,0x72a1,0xec98,0x5188,0xc6fc,0x30b8,0x54ce,0xcf3,0x6de6,0x128c,0xdfaa,0x337b,0xbf67,0x8fb9,0xb290,0xa397,0x19be,0xfddb,0x2a12,0x6885,0x2032,0xea37,0x1b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x75a5abe7,0xec9872a1,0xc6fc5188,0x54ce30b8,0x6de60cf3,0xdfaa128c,0xbf67337b,0xb2908fb9,0x19bea397,0x2a12fddb,0x20326885,0x1bea37}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xec9872a175a5abe7,0x54ce30b8c6fc5188,0xdfaa128c6de60cf3,0xb2908fb9bf67337b,0x2a12fddb19bea397,0x1bea3720326885}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x58b3,0x9d97,0x998f,0xea82,0xc940,0x400a,0xec0c,0x9d04,0xbfb4,0x79c4,0x485c,0x525a,0xcaa0,0x36ba,0x94b3,0x828a,0x6102,0x76fe,0xb36f,0x45c1,0xb70f,0xa988,0xb614,0x6c}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9d9758b3,0xea82998f,0x400ac940,0x9d04ec0c,0x79c4bfb4,0x525a485c,0x36bacaa0,0x828a94b3,0x76fe6102,0x45c1b36f,0xa988b70f,0x6cb614}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xea82998f9d9758b3,0x9d04ec0c400ac940,0x525a485c79c4bfb4,0x828a94b336bacaa0,0x45c1b36f76fe6102,0x6cb614a988b70f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xf28e,0x2e0a,0xfab7,0x1f58,0x11ea,0x243,0x39c3,0x28d4,0xe1ba,0x1878,0x3aec,0x4d87,0xf832,0x354a,0xa312,0x7416,0xb5b,0x68ee,0x1627,0x78d2,0xfbbc,0x152f,0x1cb2,0xd1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x2e0af28e,0x1f58fab7,0x24311ea,0x28d439c3,0x1878e1ba,0x4d873aec,0x354af832,0x7416a312,0x68ee0b5b,0x78d21627,0x152ffbbc,0xd11cb2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1f58fab72e0af28e,0x28d439c3024311ea,0x4d873aec1878e1ba,0x7416a312354af832,0x78d2162768ee0b5b,0xd11cb2152ffbbc}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x3134,0x8876,0x4246,0xdd4b,0x87d0,0x86b1,0x71e8,0x2d33,0xfe04,0xe6d8,0x6377,0xf6d6,0xdd4f,0x8b91,0x29d4,0x521e,0x3822,0xa1d5,0x2eb9,0x8c9c,0x35a1,0xab9f,0x2d4c,0x11}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x88763134,0xdd4b4246,0x86b187d0,0x2d3371e8,0xe6d8fe04,0xf6d66377,0x8b91dd4f,0x521e29d4,0xa1d53822,0x8c9c2eb9,0xab9f35a1,0x112d4c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xdd4b424688763134,0x2d3371e886b187d0,0xf6d66377e6d8fe04,0x521e29d48b91dd4f,0x8c9c2eb9a1d53822,0x112d4cab9f35a1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa74d,0x6268,0x6670,0x157d,0x36bf,0xbff5,0x13f3,0x62fb,0x404b,0x863b,0xb7a3,0xada5,0x355f,0xc945,0x6b4c,0x7d75,0x9efd,0x8901,0x4c90,0xba3e,0x48f0,0x5677,0x49eb,0x93}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6268a74d,0x157d6670,0xbff536bf,0x62fb13f3,0x863b404b,0xada5b7a3,0xc945355f,0x7d756b4c,0x89019efd,0xba3e4c90,0x567748f0,0x9349eb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x157d66706268a74d,0x62fb13f3bff536bf,0xada5b7a3863b404b,0x7d756b4cc945355f,0xba3e4c9089019efd,0x9349eb567748f0}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x703,0xe86d,0xe89e,0xbcf8,0x675b,0xe250,0x9f65,0xe8ec,0x2c83,0x11ca,0x4751,0x192a,0xf9d8,0xf46a,0xeb89,0x4f40,0x2a2c,0xdcf,0xfff9,0x13f9,0x24e7,0x8348,0xb9af,0x6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xe86d0703,0xbcf8e89e,0xe250675b,0xe8ec9f65,0x11ca2c83,0x192a4751,0xf46af9d8,0x4f40eb89,0xdcf2a2c,0x13f9fff9,0x834824e7,0x6b9af}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xbcf8e89ee86d0703,0xe8ec9f65e250675b,0x192a475111ca2c83,0x4f40eb89f46af9d8,0x13f9fff90dcf2a2c,0x6b9af834824e7}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1e40,0xb548,0xf9c7,0x6598,0x7e33,0x25c6,0x6cbf,0x2ef2,0xa630,0xdd99,0xaef2,0xf320,0x4a2,0x93a7,0x4541,0x2f7c,0xbf45,0x1a7a,0x24f4,0x52a9,0xd3b4,0xa12a,0x9d37,0xb0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xb5481e40,0x6598f9c7,0x25c67e33,0x2ef26cbf,0xdd99a630,0xf320aef2,0x93a704a2,0x2f7c4541,0x1a7abf45,0x52a924f4,0xa12ad3b4,0xb09d37}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x6598f9c7b5481e40,0x2ef26cbf25c67e33,0xf320aef2dd99a630,0x2f7c454193a704a2,0x52a924f41a7abf45,0xb09d37a12ad3b4}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1e1,0x2283,0x3774,0x83d4,0xf33f,0x1fc,0x2790,0xde59,0xe89d,0xc942,0x2c1b,0x6574,0x55b1,0x3a3c,0x9f11,0xbb0a,0x6813,0xa69,0xff9d,0xc94c,0xdede,0xce6b,0x18c6,0xa9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x228301e1,0x83d43774,0x1fcf33f,0xde592790,0xc942e89d,0x65742c1b,0x3a3c55b1,0xbb0a9f11,0xa696813,0xc94cff9d,0xce6bdede,0xa918c6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x83d43774228301e1,0xde59279001fcf33f,0x65742c1bc942e89d,0xbb0a9f113a3c55b1,0xc94cff9d0a696813,0xa918c6ce6bdede}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xf8fd,0x1792,0x1761,0x4307,0x98a4,0x1daf,0x609a,0x1713,0xd37c,0xee35,0xb8ae,0xe6d5,0x627,0xb95,0x1476,0xb0bf,0xd5d3,0xf230,0x6,0xec06,0xdb18,0x7cb7,0x4650,0xf9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x1792f8fd,0x43071761,0x1daf98a4,0x1713609a,0xee35d37c,0xe6d5b8ae,0xb950627,0xb0bf1476,0xf230d5d3,0xec060006,0x7cb7db18,0xf94650}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x430717611792f8fd,0x1713609a1daf98a4,0xe6d5b8aeee35d37c,0xb0bf14760b950627,0xec060006f230d5d3,0xf946507cb7db18}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x5419,0x8a5a,0x8d5e,0x1367,0xae77,0x3903,0xcf47,0xab31,0xf30c,0x9219,0xed73,0x2055,0xcc84,0x4098,0x7046,0x4d6f,0x5c68,0xe641,0x224,0xd5ed,0x977a,0xdfcd,0x15c8,0xe4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x8a5a5419,0x13678d5e,0x3903ae77,0xab31cf47,0x9219f30c,0x2055ed73,0x4098cc84,0x4d6f7046,0xe6415c68,0xd5ed0224,0xdfcd977a,0xe415c8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x13678d5e8a5a5419,0xab31cf473903ae77,0x2055ed739219f30c,0x4d6f70464098cc84,0xd5ed0224e6415c68,0xe415c8dfcd977a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x92ea,0x29a5,0x41ba,0x7e17,0x33c,0xaeb2,0x4b64,0x1b0d,0x4be,0xe57e,0x2d2e,0x1554,0xe7f7,0xea1e,0x4267,0x7d2a,0x17cd,0xd234,0xc388,0x147a,0x43e6,0xaa63,0x83bd,0x4f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x29a592ea,0x7e1741ba,0xaeb2033c,0x1b0d4b64,0xe57e04be,0x15542d2e,0xea1ee7f7,0x7d2a4267,0xd23417cd,0x147ac388,0xaa6343e6,0x4f83bd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7e1741ba29a592ea,0x1b0d4b64aeb2033c,0x15542d2ee57e04be,0x7d2a4267ea1ee7f7,0x147ac388d23417cd,0x4f83bdaa6343e6}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa8b7,0x5b17,0x819c,0x465e,0xa6fb,0xb2a1,0x91c3,0x953,0x486,0x4ed4,0xc367,0x75ba,0xcc01,0x115f,0xe242,0xe751,0x4748,0xbf53,0x4ec0,0x950a,0xe08e,0x7ea2,0xec82,0x7d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x5b17a8b7,0x465e819c,0xb2a1a6fb,0x95391c3,0x4ed40486,0x75bac367,0x115fcc01,0xe751e242,0xbf534748,0x950a4ec0,0x7ea2e08e,0x7dec82}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x465e819c5b17a8b7,0x95391c3b2a1a6fb,0x75bac3674ed40486,0xe751e242115fcc01,0x950a4ec0bf534748,0x7dec827ea2e08e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xabe7,0x75a5,0x72a1,0xec98,0x5188,0xc6fc,0x30b8,0x54ce,0xcf3,0x6de6,0x128c,0xdfaa,0x337b,0xbf67,0x8fb9,0xb290,0xa397,0x19be,0xfddb,0x2a12,0x6885,0x2032,0xea37,0x1b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x75a5abe7,0xec9872a1,0xc6fc5188,0x54ce30b8,0x6de60cf3,0xdfaa128c,0xbf67337b,0xb2908fb9,0x19bea397,0x2a12fddb,0x20326885,0x1bea37}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xec9872a175a5abe7,0x54ce30b8c6fc5188,0xdfaa128c6de60cf3,0xb2908fb9bf67337b,0x2a12fddb19bea397,0x1bea3720326885}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xac5a,0xcecb,0x4cc7,0x7541,0x64a0,0x2005,0x7606,0x4e82,0x5fda,0x3ce2,0x242e,0x292d,0x6550,0x9b5d,0x4a59,0x4145,0x3081,0xbb7f,0xd9b7,0xa2e0,0x5b87,0x54c4,0x5b0a,0x36}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xcecbac5a,0x75414cc7,0x200564a0,0x4e827606,0x3ce25fda,0x292d242e,0x9b5d6550,0x41454a59,0xbb7f3081,0xa2e0d9b7,0x54c45b87,0x365b0a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x75414cc7cecbac5a,0x4e827606200564a0,0x292d242e3ce25fda,0x41454a599b5d6550,0xa2e0d9b7bb7f3081,0x365b0a54c45b87}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x7947,0x9705,0x7d5b,0xfac,0x88f5,0x8121,0x1ce1,0x146a,0x70dd,0xc3c,0x9d76,0x26c3,0x7c19,0x1aa5,0x5189,0xba0b,0x5ad,0xb477,0xb13,0x3c69,0xfdde,0xa97,0x8e59,0x68}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x97057947,0xfac7d5b,0x812188f5,0x146a1ce1,0xc3c70dd,0x26c39d76,0x1aa57c19,0xba0b5189,0xb47705ad,0x3c690b13,0xa97fdde,0x688e59}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xfac7d5b97057947,0x146a1ce1812188f5,0x26c39d760c3c70dd,0xba0b51891aa57c19,0x3c690b13b47705ad,0x688e590a97fdde}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x189a,0x443b,0xa123,0x6ea5,0xc3e8,0x4358,0xb8f4,0x1699,0x7f02,0xf36c,0x31bb,0xfb6b,0xeea7,0x45c8,0x14ea,0x290f,0x9c11,0xd0ea,0x175c,0xc64e,0x9ad0,0x55cf,0x96a6,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x443b189a,0x6ea5a123,0x4358c3e8,0x1699b8f4,0xf36c7f02,0xfb6b31bb,0x45c8eea7,0x290f14ea,0xd0ea9c11,0xc64e175c,0x55cf9ad0,0x896a6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x6ea5a123443b189a,0x1699b8f44358c3e8,0xfb6b31bbf36c7f02,0x290f14ea45c8eea7,0xc64e175cd0ea9c11,0x896a655cf9ad0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x53a7,0x3134,0xb338,0x8abe,0x9b5f,0xdffa,0x89f9,0xb17d,0xa025,0xc31d,0xdbd1,0xd6d2,0x9aaf,0x64a2,0xb5a6,0xbeba,0xcf7e,0x4480,0x2648,0x5d1f,0xa478,0xab3b,0xa4f5,0xc9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x313453a7,0x8abeb338,0xdffa9b5f,0xb17d89f9,0xc31da025,0xd6d2dbd1,0x64a29aaf,0xbebab5a6,0x4480cf7e,0x5d1f2648,0xab3ba478,0xc9a4f5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x8abeb338313453a7,0xb17d89f9dffa9b5f,0xd6d2dbd1c31da025,0xbebab5a664a29aaf,0x5d1f26484480cf7e,0xc9a4f5ab3ba478}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x2d5d,0x46e9,0x4215,0x63b0,0x8358,0xdc91,0x80aa,0x6970,0x4e7d,0x266d,0xc13a,0xe4ea,0x504e,0xbc38,0xdbaf,0x119b,0xa3cc,0x45d8,0x98db,0x7b90,0x3a5b,0xde6a,0x3676,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x46e92d5d,0x63b04215,0xdc918358,0x697080aa,0x266d4e7d,0xe4eac13a,0xbc38504e,0x119bdbaf,0x45d8a3cc,0x7b9098db,0xde6a3a5b,0x83676}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x63b0421546e92d5d,0x697080aadc918358,0xe4eac13a266d4e7d,0x119bdbafbc38504e,0x7b9098db45d8a3cc,0x83676de6a3a5b}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1db1,0x61ae,0x220b,0xc2e,0xa7ee,0xb16a,0x8697,0xf90c,0x7505,0xced5,0x5cf8,0xb601,0x6235,0x27ad,0x9fdf,0x57d0,0xca2,0xa6d2,0x94db,0xb53a,0x8bd2,0xa3ad,0xfe95,0x92}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x61ae1db1,0xc2e220b,0xb16aa7ee,0xf90c8697,0xced57505,0xb6015cf8,0x27ad6235,0x57d09fdf,0xa6d20ca2,0xb53a94db,0xa3ad8bd2,0x92fe95}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xc2e220b61ae1db1,0xf90c8697b16aa7ee,0xb6015cf8ced57505,0x57d09fdf27ad6235,0xb53a94dba6d20ca2,0x92fe95a3ad8bd2}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa809,0xf0cf,0xb393,0xf0ab,0x181a,0xb5bc,0x1833,0xb0ea,0xff0e,0x3088,0xb299,0x4f5c,0x5a20,0x5b86,0xad7b,0x9ffd,0x2216,0x4e4c,0xb8eb,0x989,0x712f,0xa798,0x8e8f,0x45}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xf0cfa809,0xf0abb393,0xb5bc181a,0xb0ea1833,0x3088ff0e,0x4f5cb299,0x5b865a20,0x9ffdad7b,0x4e4c2216,0x989b8eb,0xa798712f,0x458e8f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xf0abb393f0cfa809,0xb0ea1833b5bc181a,0x4f5cb2993088ff0e,0x9ffdad7b5b865a20,0x989b8eb4e4c2216,0x458e8fa798712f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xd2a3,0xb916,0xbdea,0x9c4f,0x7ca7,0x236e,0x7f55,0x968f,0xb182,0xd992,0x3ec5,0x1b15,0xafb1,0x43c7,0x2450,0xee64,0x5c33,0xba27,0x6724,0x846f,0xc5a4,0x2195,0xc989,0xf7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xb916d2a3,0x9c4fbdea,0x236e7ca7,0x968f7f55,0xd992b182,0x1b153ec5,0x43c7afb1,0xee642450,0xba275c33,0x846f6724,0x2195c5a4,0xf7c989}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9c4fbdeab916d2a3,0x968f7f55236e7ca7,0x1b153ec5d992b182,0xee64245043c7afb1,0x846f6724ba275c33,0xf7c9892195c5a4}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x17bf, 0xbb8, 0x485, 0x1296, 0x1b32, 0xe0b, 0x13f9, 0x15f5, 0x1a2b, 0xff6, 0xf53, 0x70a, 0x36c, 0x40f, 0xa89, 0xca6, 0x37e, 0x1488, 0x1796, 0x1be2, 0x1e0f, 0xf10, 0x1628, 0x1a20, 0x1ee7, 0x1e53, 0x48c, 0x94, 0xd53, 0xd} +#elif RADIX == 32 +{0x5dc5efd, 0xa52c485, 0x9705ecc, 0xaebeb3f, 0x537fb68, 0xdb0e14f, 0xa892078, 0xdf994c, 0x5796a44, 0x8783f7c, 0x4162878, 0x29fb9f4, 0x12848cf, 0x2a54c} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x5ecca52c4855dc5e, 0x37fb68aebeb3f970, 0xca892078db0e14f5, 0xf7c5796a440df994, 0xfb9f441628788783, 0x406754c12848cf29} +#else +{0x194a5890abb8bd, 0x22bafacfe5c17b, 0x46d870a7a9bfdb, 0x40df994ca89207, 0x10f07ef8af2d48, 0x4a7ee7d1058a1e, 0xff3aa60942467} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x66d, 0xaee, 0x1121, 0x14a5, 0x1ecc, 0xb82, 0xcfe, 0x1d7d, 0x168a, 0x1bfd, 0x13d4, 0x1c2, 0x18db, 0x903, 0x12a2, 0x1329, 0xdf, 0x1522, 0x15e5, 0x1ef8, 0x783, 0x3c4, 0x58a, 0x1e88, 0x1fb9, 0x794, 0x123, 0x1825, 0x1754, 0x1c} +#elif RADIX == 32 +{0x57719b7, 0x294b121, 0xe5c17b3, 0x2bafacf, 0xd4dfeda, 0x36c3853, 0x2a2481e, 0x37e653, 0x15e5a91, 0x21e0fdf, 0x1058a1e, 0xca7ee7d, 0x4a1233, 0x22d53} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x17b3294b12157719, 0x4dfeda2bafacfe5c, 0x32a2481e36c3853d, 0xfdf15e5a91037e65, 0x7ee7d1058a1e21e0, 0x2e99d5304a1233ca} +#else +{0x665296242aee33, 0x68aebeb3f9705e, 0x71b61c29ea6ff6, 0x1037e6532a2481, 0x443c1fbe2bcb52, 0x729fb9f4416287, 0x70cea98250919} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x3e9, 0x9f6, 0x1c50, 0x27e, 0xa85, 0x39c, 0xa7b, 0x177c, 0xdfc, 0x77e, 0x1490, 0x11b8, 0xd2b, 0x17dc, 0xd7c, 0x16a0, 0xe21, 0xb86, 0x15bb, 0x844, 0x146c, 0xe51, 0xc6d, 0x143d, 0x1d2b, 0x1715, 0x18bb, 0xdc8, 0x55d, 0x16} +#elif RADIX == 32 +{0x4fb0fa6, 0x44fdc50, 0xb1ce2a1, 0xf2ef8a7, 0x903bf37, 0x4ae3714, 0xd7cbee3, 0x3886d40, 0x95bb5c3, 0x8d1b108, 0x7ac6d72, 0x8af4ae8, 0xb918bbb, 0x2f575} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xe2a144fdc504fb0f, 0x3bf37f2ef8a7b1c, 0xd7cbee34ae37149, 0x10895bb5c33886d4, 0xf4ae87ac6d728d1b, 0x2a55575b918bbb8a} +#else +{0x4289fb8a09f61f, 0x5fcbbe29ec738a, 0x1a571b8a481df9, 0x33886d40d7cbee, 0x51a362112b76b8, 0x62bd2ba1eb1b5c, 0x4eaabadc8c5dd} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x793, 0x1095, 0x8d0, 0x676, 0x2be, 0x1a9d, 0x6d6, 0x1d0, 0x112a, 0x18e1, 0x1741, 0xc68, 0x156d, 0x113f, 0x181e, 0x201, 0xcd7, 0xbb7, 0xdb, 0x64c, 0x181e, 0x63, 0x965, 0xf2, 0xc95, 0x50d, 0x1ec2, 0x1c03, 0x5b4, 0x1b} +#elif RADIX == 32 +{0x84a9e4f, 0x8cec8d0, 0x6d4e8af, 0xa83a06d, 0x41c70c4, 0x5b58d17, 0x81e89fd, 0xb35c403, 0x80db5db, 0x1e078c9, 0xe496503, 0x86b2541, 0x807ec22, 0x166d3} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xe8af8cec8d084a9e, 0x1c70c4a83a06d6d4, 0x381e89fd5b58d174, 0x8c980db5dbb35c40, 0xb2541e4965031e07, 0x14256d3807ec2286} +#else +{0x5f19d91a10953c, 0x12a0e81b5b53a2, 0x6adac68ba0e386, 0x3b35c40381e89f, 0x63c0f19301b6bb, 0x21ac9507925940, 0xa12b69c03f611} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x71d, 0xf0e, 0x506, 0x1aec, 0x3f6, 0x2c1, 0x17dd, 0x43f, 0x1552, 0x1488, 0x10c3, 0x5ea, 0xfd4, 0x634, 0x1eb1, 0x1711, 0x1424, 0xeb1, 0xfe1, 0xa0a, 0x165f, 0x5c8, 0x1544, 0x1493, 0x329, 0x19ec, 0x1db4, 0x983, 0x790, 0x1d} +#elif RADIX == 32 +{0x7871c77, 0xb5d8506, 0xd1608fd, 0x4887f7d, 0xc3a4455, 0xf50bd50, 0xeb131a3, 0xd092e23, 0x4fe1758, 0x4597d41, 0x275442e, 0xf60ca69, 0x307db4c, 0x26e41} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x8fdb5d85067871c, 0x3a44554887f7dd16, 0x3eb131a3f50bd50c, 0xd414fe1758d092e2, 0xca69275442e4597, 0x1e5de41307db4cf6} +#else +{0x7b6bb0a0cf0e38, 0x55221fdf745823, 0x1fa85ea861d222, 0xd092e23eb131a, 0x48b2fa829fc2eb, 0x3d8329a49d510b, 0xf2ef20983eda6} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x704, 0x1718, 0x1f41, 0x1569, 0x1353, 0x403, 0x8ba, 0xd3b, 0x1e9a, 0xca6, 0x1433, 0xc05, 0x2dd, 0xf7d, 0x12c8, 0x1109, 0x1797, 0x4e2, 0xf77, 0x569, 0xfcf, 0x1dd4, 0x11a4, 0x1354, 0x1563, 0x14b7, 0x6ad, 0xf7e, 0x251, 0xe} +#elif RADIX == 32 +{0xb8c1c11, 0xead3f41, 0xa201cd4, 0x69a768b, 0x336537a, 0xb7580b4, 0x2c87be8, 0x5e5e213, 0x2f77271, 0xa3f3cad, 0xa91a4ee, 0x5bd58e6, 0xefc6ada, 0x2f945} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x1cd4ead3f41b8c1c, 0x36537a69a768ba20, 0x32c87be8b7580b43, 0xcad2f772715e5e21, 0xd58e6a91a4eea3f3, 0x480945efc6ada5b} +#else +{0x29d5a7e8371838, 0x69a69da2e88073, 0x45bac05a19b29b, 0x15e5e2132c87be, 0x547e795a5eee4e, 0x16f5639aa4693b, 0x2404a2f7e356d} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0xf6, 0x15a2, 0x1cbc, 0x185c, 0x9a1, 0xc2f, 0x1123, 0x11, 0xda7, 0x1628, 0x41, 0x1163, 0x12f7, 0x9aa, 0x1235, 0x1444, 0x1c4a, 0x3b6, 0xfee, 0x96, 0x1ed, 0x1f4d, 0x5ec, 0x1bf2, 0x1bca, 0x151d, 0x58f, 0x293, 0x960, 0x20} +#elif RADIX == 32 +{0xad103db, 0x70b9cbc, 0x3617a68, 0x9c02312, 0x41b1436, 0xbde2c60, 0x2354d54, 0x712a889, 0xcfee1db, 0x687b412, 0xe45ecfa, 0x8eef2b7, 0x52658fa, 0x3f580} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x7a6870b9cbcad103, 0x1b14369c02312361, 0x92354d54bde2c604, 0x412cfee1db712a88, 0xef2b7e45ecfa687b, 0x37da58052658fa8e} +#else +{0x50e1739795a207, 0x5a7008c48d85e9, 0x25ef163020d8a1, 0x3712a8892354d5, 0x4d0f68259fdc3b, 0x23bbcadf917b3e, 0xbad2c02932c7d} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0xbc5, 0xa1d, 0xe8a, 0xe9c, 0x1af1, 0x13b5, 0xa68, 0x4a4, 0x135e, 0x171, 0x716, 0x2c2, 0x1c2b, 0x332, 0x349, 0x138c, 0x168b, 0x21c, 0x1629, 0xb97, 0x186, 0x629, 0x6e8, 0x497, 0x128c, 0x19d2, 0xcc1, 0x121, 0x250, 0x1a} +#elif RADIX == 32 +{0x50eaf17, 0x5d38e8a, 0x89daebc, 0x78948a6, 0x160b8cd, 0xac5847, 0x3491997, 0x5a2e718, 0xf62910e, 0x4861972, 0x2e6e831, 0xe94a309, 0x242cc1c, 0xd940} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xaebc5d38e8a50eaf, 0x60b8cd78948a689d, 0x834919970ac58471, 0x972f62910e5a2e71, 0x4a3092e6e8314861, 0x5e4940242cc1ce9} +#else +{0x78ba71d14a1d5e, 0x35e25229a276ba, 0x38562c238b05c6, 0x65a2e718349199, 0x290c32e5ec5221, 0x3a528c24b9ba0c, 0x2f24a0121660e} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xc761,0xa939,0x45c3,0xca85,0x6b48,0xe2f1,0x7d5b,0x8e01,0xb824,0x1b34,0x31da,0x3fa1,0xaae4,0x143a,0xc0b8,0xe32f,0x843,0x2c29,0xd142,0x4e56,0xd55c,0xc504,0x24cd,0xc5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xa939c761,0xca8545c3,0xe2f16b48,0x8e017d5b,0x1b34b824,0x3fa131da,0x143aaae4,0xe32fc0b8,0x2c290843,0x4e56d142,0xc504d55c,0xc524cd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xca8545c3a939c761,0x8e017d5be2f16b48,0x3fa131da1b34b824,0xe32fc0b8143aaae4,0x4e56d1422c290843,0xc524cdc504d55c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xe87a,0x6127,0x8903,0x2308,0xfbed,0x12dc,0x3209,0xc898,0x715,0x2ab8,0x446f,0x1078,0x2808,0x2493,0x34a9,0xf92b,0x96f4,0xa3a,0xf860,0xd4ad,0xc8a9,0x410d,0x626b,0xe5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6127e87a,0x23088903,0x12dcfbed,0xc8983209,0x2ab80715,0x1078446f,0x24932808,0xf92b34a9,0xa3a96f4,0xd4adf860,0x410dc8a9,0xe5626b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x230889036127e87a,0xc898320912dcfbed,0x1078446f2ab80715,0xf92b34a924932808,0xd4adf8600a3a96f4,0xe5626b410dc8a9}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa06f,0xcd2e,0x736e,0xdfff,0x28f9,0xe694,0x7c39,0xab16,0x21f5,0xbc4,0x4883,0xe8f6,0xcaae,0xf3c3,0xa9f1,0x8d46,0x16e4,0xa8e2,0x5d95,0x3838,0xa6f1,0x34b7,0x94da,0xde}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xcd2ea06f,0xdfff736e,0xe69428f9,0xab167c39,0xbc421f5,0xe8f64883,0xf3c3caae,0x8d46a9f1,0xa8e216e4,0x38385d95,0x34b7a6f1,0xde94da}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xdfff736ecd2ea06f,0xab167c39e69428f9,0xe8f648830bc421f5,0x8d46a9f1f3c3caae,0x38385d95a8e216e4,0xde94da34b7a6f1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x389f,0x56c6,0xba3c,0x357a,0x94b7,0x1d0e,0x82a4,0x71fe,0x47db,0xe4cb,0xce25,0xc05e,0x551b,0xebc5,0x3f47,0x1cd0,0xf7bc,0xd3d6,0x2ebd,0xb1a9,0x2aa3,0x3afb,0xdb32,0x3a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x56c6389f,0x357aba3c,0x1d0e94b7,0x71fe82a4,0xe4cb47db,0xc05ece25,0xebc5551b,0x1cd03f47,0xd3d6f7bc,0xb1a92ebd,0x3afb2aa3,0x3adb32}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x357aba3c56c6389f,0x71fe82a41d0e94b7,0xc05ece25e4cb47db,0x1cd03f47ebc5551b,0xb1a92ebdd3d6f7bc,0x3adb323afb2aa3}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa74d,0x6268,0x6670,0x157d,0x36bf,0xbff5,0x13f3,0x62fb,0x404b,0x863b,0xb7a3,0xada5,0x355f,0xc945,0x6b4c,0x7d75,0x9efd,0x8901,0x4c90,0xba3e,0x48f0,0x5677,0x49eb,0x93}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6268a74d,0x157d6670,0xbff536bf,0x62fb13f3,0x863b404b,0xada5b7a3,0xc945355f,0x7d756b4c,0x89019efd,0xba3e4c90,0x567748f0,0x9349eb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x157d66706268a74d,0x62fb13f3bff536bf,0xada5b7a3863b404b,0x7d756b4cc945355f,0xba3e4c9089019efd,0x9349eb567748f0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xd72,0xd1f5,0x548,0xe0a7,0xee15,0xfdbc,0xc63c,0xd72b,0x1e45,0xe787,0xc513,0xb278,0x7cd,0xcab5,0x5ced,0x8be9,0xf4a4,0x9711,0xe9d8,0x872d,0x443,0xead0,0xe34d,0x2e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xd1f50d72,0xe0a70548,0xfdbcee15,0xd72bc63c,0xe7871e45,0xb278c513,0xcab507cd,0x8be95ced,0x9711f4a4,0x872de9d8,0xead00443,0x2ee34d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xe0a70548d1f50d72,0xd72bc63cfdbcee15,0xb278c513e7871e45,0x8be95cedcab507cd,0x872de9d89711f4a4,0x2ee34dead00443}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xcecc,0x7789,0xbdb9,0x22b4,0x782f,0x794e,0x8e17,0xd2cc,0x1fb,0x1927,0x9c88,0x929,0x22b0,0x746e,0xd62b,0xade1,0xc7dd,0x5e2a,0xd146,0x7363,0xca5e,0x5460,0xd2b3,0xee}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7789cecc,0x22b4bdb9,0x794e782f,0xd2cc8e17,0x192701fb,0x9299c88,0x746e22b0,0xade1d62b,0x5e2ac7dd,0x7363d146,0x5460ca5e,0xeed2b3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x22b4bdb97789cecc,0xd2cc8e17794e782f,0x9299c88192701fb,0xade1d62b746e22b0,0x7363d1465e2ac7dd,0xeed2b35460ca5e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x58b3,0x9d97,0x998f,0xea82,0xc940,0x400a,0xec0c,0x9d04,0xbfb4,0x79c4,0x485c,0x525a,0xcaa0,0x36ba,0x94b3,0x828a,0x6102,0x76fe,0xb36f,0x45c1,0xb70f,0xa988,0xb614,0x6c}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9d9758b3,0xea82998f,0x400ac940,0x9d04ec0c,0x79c4bfb4,0x525a485c,0x36bacaa0,0x828a94b3,0x76fe6102,0x45c1b36f,0xa988b70f,0x6cb614}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xea82998f9d9758b3,0x9d04ec0c400ac940,0x525a485c79c4bfb4,0x828a94b336bacaa0,0x45c1b36f76fe6102,0x6cb614a988b70f}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xac65,0x6102,0xe1f0,0x7b39,0x64be,0xff4d,0x8256,0xd11b,0x4645,0x7a89,0x814c,0x66e7,0x77a,0xc4d8,0xe691,0x1f42,0xfdb9,0x547b,0x752,0x18d9,0x9279,0xe604,0xbed4,0xec}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6102ac65,0x7b39e1f0,0xff4d64be,0xd11b8256,0x7a894645,0x66e7814c,0xc4d8077a,0x1f42e691,0x547bfdb9,0x18d90752,0xe6049279,0xecbed4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7b39e1f06102ac65,0xd11b8256ff4d64be,0x66e7814c7a894645,0x1f42e691c4d8077a,0x18d90752547bfdb9,0xecbed4e6049279}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x3380,0xe477,0x9e18,0x218d,0xddc6,0x4cc5,0xb33f,0x59e7,0xb291,0xa1a1,0x8f77,0x92a2,0x480e,0x82af,0x40f1,0x5d48,0x83b0,0x4229,0xcb9e,0xff7a,0x2e32,0xa78,0x71fc,0x16}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xe4773380,0x218d9e18,0x4cc5ddc6,0x59e7b33f,0xa1a1b291,0x92a28f77,0x82af480e,0x5d4840f1,0x422983b0,0xff7acb9e,0xa782e32,0x1671fc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x218d9e18e4773380,0x59e7b33f4cc5ddc6,0x92a28f77a1a1b291,0x5d4840f182af480e,0xff7acb9e422983b0,0x1671fc0a782e32}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xbb17,0xaa62,0x774e,0x2e59,0xe440,0xebce,0x874e,0xbfdb,0x3afd,0xa7ba,0xded2,0x78aa,0x7568,0xcfed,0x5633,0xa1de,0x4c5e,0x5796,0x5727,0xec25,0xac0a,0xce9c,0x3f13,0x98}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xaa62bb17,0x2e59774e,0xebcee440,0xbfdb874e,0xa7ba3afd,0x78aaded2,0xcfed7568,0xa1de5633,0x57964c5e,0xec255727,0xce9cac0a,0x983f13}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x2e59774eaa62bb17,0xbfdb874eebcee440,0x78aaded2a7ba3afd,0xa1de5633cfed7568,0xec25572757964c5e,0x983f13ce9cac0a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x539b,0x9efd,0x1e0f,0x84c6,0x9b41,0xb2,0x7da9,0x2ee4,0xb9ba,0x8576,0x7eb3,0x9918,0xf885,0x3b27,0x196e,0xe0bd,0x246,0xab84,0xf8ad,0xe726,0x6d86,0x19fb,0x412b,0x13}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9efd539b,0x84c61e0f,0xb29b41,0x2ee47da9,0x8576b9ba,0x99187eb3,0x3b27f885,0xe0bd196e,0xab840246,0xe726f8ad,0x19fb6d86,0x13412b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x84c61e0f9efd539b,0x2ee47da900b29b41,0x99187eb38576b9ba,0xe0bd196e3b27f885,0xe726f8adab840246,0x13412b19fb6d86}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xc761,0xa939,0x45c3,0xca85,0x6b48,0xe2f1,0x7d5b,0x8e01,0xb824,0x1b34,0x31da,0x3fa1,0xaae4,0x143a,0xc0b8,0xe32f,0x843,0x2c29,0xd142,0x4e56,0xd55c,0xc504,0x24cd,0xc5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xa939c761,0xca8545c3,0xe2f16b48,0x8e017d5b,0x1b34b824,0x3fa131da,0x143aaae4,0xe32fc0b8,0x2c290843,0x4e56d142,0xc504d55c,0xc524cd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xca8545c3a939c761,0x8e017d5be2f16b48,0x3fa131da1b34b824,0xe32fc0b8143aaae4,0x4e56d1422c290843,0xc524cdc504d55c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xe87a,0x6127,0x8903,0x2308,0xfbed,0x12dc,0x3209,0xc898,0x715,0x2ab8,0x446f,0x1078,0x2808,0x2493,0x34a9,0xf92b,0x96f4,0xa3a,0xf860,0xd4ad,0xc8a9,0x410d,0x626b,0xe5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6127e87a,0x23088903,0x12dcfbed,0xc8983209,0x2ab80715,0x1078446f,0x24932808,0xf92b34a9,0xa3a96f4,0xd4adf860,0x410dc8a9,0xe5626b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x230889036127e87a,0xc898320912dcfbed,0x1078446f2ab80715,0xf92b34a924932808,0xd4adf8600a3a96f4,0xe5626b410dc8a9}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa06f,0xcd2e,0x736e,0xdfff,0x28f9,0xe694,0x7c39,0xab16,0x21f5,0xbc4,0x4883,0xe8f6,0xcaae,0xf3c3,0xa9f1,0x8d46,0x16e4,0xa8e2,0x5d95,0x3838,0xa6f1,0x34b7,0x94da,0xde}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xcd2ea06f,0xdfff736e,0xe69428f9,0xab167c39,0xbc421f5,0xe8f64883,0xf3c3caae,0x8d46a9f1,0xa8e216e4,0x38385d95,0x34b7a6f1,0xde94da}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xdfff736ecd2ea06f,0xab167c39e69428f9,0xe8f648830bc421f5,0x8d46a9f1f3c3caae,0x38385d95a8e216e4,0xde94da34b7a6f1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x389f,0x56c6,0xba3c,0x357a,0x94b7,0x1d0e,0x82a4,0x71fe,0x47db,0xe4cb,0xce25,0xc05e,0x551b,0xebc5,0x3f47,0x1cd0,0xf7bc,0xd3d6,0x2ebd,0xb1a9,0x2aa3,0x3afb,0xdb32,0x3a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x56c6389f,0x357aba3c,0x1d0e94b7,0x71fe82a4,0xe4cb47db,0xc05ece25,0xebc5551b,0x1cd03f47,0xd3d6f7bc,0xb1a92ebd,0x3afb2aa3,0x3adb32}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x357aba3c56c6389f,0x71fe82a41d0e94b7,0xc05ece25e4cb47db,0x1cd03f47ebc5551b,0xb1a92ebdd3d6f7bc,0x3adb323afb2aa3}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x53a7,0x3134,0xb338,0x8abe,0x9b5f,0xdffa,0x89f9,0xb17d,0xa025,0xc31d,0xdbd1,0xd6d2,0x9aaf,0x64a2,0xb5a6,0xbeba,0xcf7e,0x4480,0x2648,0x5d1f,0xa478,0xab3b,0xa4f5,0xc9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x313453a7,0x8abeb338,0xdffa9b5f,0xb17d89f9,0xc31da025,0xd6d2dbd1,0x64a29aaf,0xbebab5a6,0x4480cf7e,0x5d1f2648,0xab3ba478,0xc9a4f5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x8abeb338313453a7,0xb17d89f9dffa9b5f,0xd6d2dbd1c31da025,0xbebab5a664a29aaf,0x5d1f26484480cf7e,0xc9a4f5ab3ba478}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x86b9,0x68fa,0x82a4,0xf053,0x770a,0x7ede,0xe31e,0xeb95,0x8f22,0xf3c3,0x6289,0xd93c,0x83e6,0xe55a,0xae76,0x45f4,0xfa52,0x4b88,0xf4ec,0xc396,0x221,0xf568,0x71a6,0x97}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x68fa86b9,0xf05382a4,0x7ede770a,0xeb95e31e,0xf3c38f22,0xd93c6289,0xe55a83e6,0x45f4ae76,0x4b88fa52,0xc396f4ec,0xf5680221,0x9771a6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xf05382a468fa86b9,0xeb95e31e7ede770a,0xd93c6289f3c38f22,0x45f4ae76e55a83e6,0xc396f4ec4b88fa52,0x9771a6f5680221}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xe766,0xbbc4,0x5edc,0x915a,0x3c17,0xbca7,0x470b,0xe966,0x80fd,0xc93,0xce44,0x494,0x1158,0xba37,0xeb15,0xd6f0,0x63ee,0x2f15,0xe8a3,0x39b1,0x652f,0xaa30,0x6959,0xf7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xbbc4e766,0x915a5edc,0xbca73c17,0xe966470b,0xc9380fd,0x494ce44,0xba371158,0xd6f0eb15,0x2f1563ee,0x39b1e8a3,0xaa30652f,0xf76959}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x915a5edcbbc4e766,0xe966470bbca73c17,0x494ce440c9380fd,0xd6f0eb15ba371158,0x39b1e8a32f1563ee,0xf76959aa30652f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xac5a,0xcecb,0x4cc7,0x7541,0x64a0,0x2005,0x7606,0x4e82,0x5fda,0x3ce2,0x242e,0x292d,0x6550,0x9b5d,0x4a59,0x4145,0x3081,0xbb7f,0xd9b7,0xa2e0,0x5b87,0x54c4,0x5b0a,0x36}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xcecbac5a,0x75414cc7,0x200564a0,0x4e827606,0x3ce25fda,0x292d242e,0x9b5d6550,0x41454a59,0xbb7f3081,0xa2e0d9b7,0x54c45b87,0x365b0a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x75414cc7cecbac5a,0x4e827606200564a0,0x292d242e3ce25fda,0x41454a599b5d6550,0xa2e0d9b7bb7f3081,0x365b0a54c45b87}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xb919,0xcfad,0xeb7f,0x81f8,0x4d97,0xf272,0x4300,0xdd38,0x1b01,0x826,0x1894,0x3e43,0x7310,0xa84,0x4161,0x7c63,0xec4,0x9625,0xe475,0xadc9,0x5a7,0xfa6a,0xb7e3,0x7e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xcfadb919,0x81f8eb7f,0xf2724d97,0xdd384300,0x8261b01,0x3e431894,0xa847310,0x7c634161,0x96250ec4,0xadc9e475,0xfa6a05a7,0x7eb7e3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x81f8eb7fcfadb919,0xdd384300f2724d97,0x3e43189408261b01,0x7c6341610a847310,0xadc9e47596250ec4,0x7eb7e3fa6a05a7}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1e83,0xade4,0x9d21,0x2e51,0x42e5,0xd3,0xac79,0xe0a8,0x32e2,0xfcf2,0xb504,0xc941,0xa0d0,0x8016,0x5485,0x3331,0xabd7,0xc296,0xf76e,0xef5,0xce39,0x8e31,0x165c,0x56}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xade41e83,0x2e519d21,0xd342e5,0xe0a8ac79,0xfcf232e2,0xc941b504,0x8016a0d0,0x33315485,0xc296abd7,0xef5f76e,0x8e31ce39,0x56165c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x2e519d21ade41e83,0xe0a8ac7900d342e5,0xc941b504fcf232e2,0x333154858016a0d0,0xef5f76ec296abd7,0x56165c8e31ce39}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xdd11,0x6e27,0xfbdb,0xf5d9,0xd6cb,0x9fef,0xc59a,0x7a4,0xfbd,0x5c3e,0xbc2,0xd091,0x6546,0xc9d0,0x193e,0x93fa,0x776,0x2763,0xdecd,0xbbe3,0xcec1,0x6abf,0x9070,0x66}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6e27dd11,0xf5d9fbdb,0x9fefd6cb,0x7a4c59a,0x5c3e0fbd,0xd0910bc2,0xc9d06546,0x93fa193e,0x27630776,0xbbe3decd,0x6abfcec1,0x669070}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xf5d9fbdb6e27dd11,0x7a4c59a9fefd6cb,0xd0910bc25c3e0fbd,0x93fa193ec9d06546,0xbbe3decd27630776,0x6690706abfcec1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x46e7,0x3052,0x1480,0x7e07,0xb268,0xd8d,0xbcff,0x22c7,0xe4fe,0xf7d9,0xe76b,0xc1bc,0x8cef,0xf57b,0xbe9e,0x839c,0xf13b,0x69da,0x1b8a,0x5236,0xfa58,0x595,0x481c,0x81}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x305246e7,0x7e071480,0xd8db268,0x22c7bcff,0xf7d9e4fe,0xc1bce76b,0xf57b8cef,0x839cbe9e,0x69daf13b,0x52361b8a,0x595fa58,0x81481c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7e071480305246e7,0x22c7bcff0d8db268,0xc1bce76bf7d9e4fe,0x839cbe9ef57b8cef,0x52361b8a69daf13b,0x81481c0595fa58}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0xb89, 0xf4d, 0xbd8, 0x18d2, 0x781, 0x1f79, 0xef5, 0xcfd, 0xa7d, 0x121a, 0x59e, 0x18a3, 0x2b, 0x122f, 0x9d5, 0x18aa, 0x105f, 0x1bcd, 0x871, 0x1f9d, 0xae4, 0xc5c, 0x385, 0xbe8, 0x1878, 0xcd8, 0x7a1, 0x7c8, 0x5b4, 0xe} +#elif RADIX == 32 +{0x7a6ae25, 0x71a4bd8, 0x5fbc9e0, 0xf59faef, 0x9e90d29, 0xaf1465, 0x9d59178, 0xc17f154, 0xa871de6, 0xe2b93f3, 0xd038562, 0x6c61e17, 0xf907a16, 0x306d0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xc9e071a4bd87a6ae, 0xe90d29f59faef5fb, 0x49d591780af14659, 0x3f3a871de6c17f15, 0x61e17d038562e2b9, 0x9956d0f907a166c} +#else +{0x40e3497b0f4d5c, 0x27d67ebbd7ef27, 0x40578a32cf4869, 0x6c17f1549d5917, 0x5c5727e750e3bc, 0x1b18785f40e158, 0x4cab687c83d0b} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0xb60, 0x3d3, 0x12f6, 0xe34, 0x9e0, 0xfde, 0xbbd, 0xb3f, 0x129f, 0x1486, 0x1967, 0x1e28, 0x180a, 0xc8b, 0x1275, 0x1e2a, 0xc17, 0xef3, 0xa1c, 0x7e7, 0x2b9, 0xb17, 0xe1, 0x2fa, 0x61e, 0xb36, 0x1e8, 0x1f2, 0x156d, 0xc} +#elif RADIX == 32 +{0x1e9ad81, 0x1c692f6, 0xd7ef278, 0x7d67ebb, 0x67a434a, 0x2bc519, 0x275645e, 0xb05fc55, 0xea1c779, 0xb8ae4fc, 0xf40e158, 0x9b18785, 0x3e41e85, 0x245b4} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xf2781c692f61e9ad, 0x7a434a7d67ebbd7e, 0x5275645e02bc5196, 0x4fcea1c779b05fc5, 0x18785f40e158b8ae, 0x20e55b43e41e859b} +#else +{0x7038d25ec3d35b, 0x29f59faef5fbc9, 0x7015e28cb3d21a, 0x1b05fc55275645, 0x1715c9f9d438ef, 0x66c61e17d03856, 0x32ada1f20f42} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x441, 0x1774, 0x1527, 0x106a, 0x577, 0x3fc, 0xf92, 0x12c4, 0x96a, 0x10ea, 0x10f5, 0x11c9, 0x1f8, 0x1407, 0x1bcc, 0x16c4, 0x15c1, 0x790, 0x5bc, 0x1c28, 0xbc6, 0x123c, 0xf19, 0x1d6f, 0x361, 0x1fcd, 0x1dc9, 0x20c, 0x17c6, 0x6} +#elif RADIX == 32 +{0xbba1104, 0xe0d5527, 0x21fe15d, 0xaa588f9, 0xf587525, 0x7e23930, 0xbcca038, 0x5706d89, 0x5bc3c8, 0xe2f1b85, 0xdef1991, 0xe68d87a, 0x419dc9f, 0x35f18} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xe15de0d5527bba11, 0x587525aa588f921f, 0x9bcca0387e23930f, 0xb8505bc3c85706d8, 0x8d87adef1991e2f1, 0x139f18419dc9fe6} +#else +{0x3bc1aaa4f77422, 0x16a9623e487f85, 0x43f11c987ac3a9, 0x5706d89bcca03, 0x3c5e370a0b7879, 0x79a361eb7bc664, 0x9cf8c20cee4f} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x98a, 0x1bbb, 0x7d8, 0xd84, 0x3fe, 0x90b, 0xfe8, 0x12c3, 0x1e84, 0xde3, 0xbe1, 0x1217, 0x1925, 0x84a, 0xa0e, 0x7cd, 0x1854, 0x768, 0x6e6, 0x1d87, 0xfac, 0x6df, 0x109b, 0x64d, 0x9f2, 0x596, 0x435, 0x1918, 0x1095, 0x0} +#elif RADIX == 32 +{0xddda628, 0x9b087d8, 0x84858ff, 0x12586fe, 0xe16f1fa, 0x49642eb, 0xa0e4256, 0x6150f9a, 0xe6e63b4, 0xfbeb3b0, 0x9b09b36, 0xcb27c8c, 0x2304352, 0x4257} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x58ff9b087d8ddda6, 0x16f1fa12586fe848, 0xaa0e425649642ebe, 0x3b0e6e63b46150f9, 0x27c8c9b09b36fbeb, 0xa2c2572304352cb} +#else +{0x7f3610fb1bbb4c, 0x684961bfa12163, 0x324b2175f0b78f, 0x46150f9aa0e425, 0x5f7d6761cdcc76, 0x32c9f2326c26cd, 0x51612b91821a9} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x17ec, 0x6b9, 0x1dc0, 0x1783, 0x18ee, 0xdd4, 0x1c7f, 0x1fb2, 0x16b0, 0x196e, 0x1e5a, 0x1fda, 0x11f9, 0x117, 0x1c30, 0x1a47, 0x2a2, 0x19e6, 0x1347, 0x2bb, 0x1463, 0x1f37, 0xa64, 0x3c6, 0x1910, 0x2bc, 0xbc0, 0x17e8, 0x1cfd, 0xa} +#elif RADIX == 32 +{0x35cdfb1, 0xaf07dc0, 0xf6ea63b, 0xc3f65c7, 0x5acb75a, 0x7e7fb5e, 0xc3008bc, 0xa8b48f, 0x7347cf3, 0xbd18c57, 0x8ca64f9, 0x5e64407, 0xfd0bc01, 0x163f6} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xa63baf07dc035cdf, 0xacb75ac3f65c7f6e, 0xfc3008bc7e7fb5e5, 0xc577347cf30a8b48, 0x644078ca64f9bd18, 0x2d073f6fd0bc015e} +#else +{0x775e0fb806b9bf, 0x6b0fd971fdba98, 0x63f3fdaf2d65ba, 0x30a8b48fc3008b, 0x37a318aee68f9e, 0x5799101e32993e, 0x6439fb7e85e00} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x440, 0x172e, 0x4f, 0x1e07, 0x15ce, 0x1b55, 0x68e, 0x2c, 0x13bb, 0x1f43, 0x1dda, 0x1fb4, 0xe54, 0x1502, 0x723, 0x7e7, 0x1147, 0x1ba0, 0x3d0, 0xf7c, 0x1754, 0x5fc, 0x1098, 0x16aa, 0x182, 0x1c1d, 0x18e9, 0x13ce, 0xbae, 0x18} +#elif RADIX == 32 +{0xb971102, 0xbc0e04f, 0xedaad73, 0xec05868, 0xdafa1ce, 0x953f69d, 0x723a813, 0x451cfce, 0x83d0dd0, 0xe5d51ef, 0x550982f, 0xe860ad, 0x79d8e9e, 0x40eba} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xad73bc0e04fb9711, 0xafa1ceec05868eda, 0xe723a813953f69dd, 0x1ef83d0dd0451cfc, 0x860ad550982fe5d5, 0xc2eba79d8e9e0e} +#else +{0x67781c09f72e22, 0x3bb0161a3b6ab5, 0x1ca9fb4eed7d0e, 0x451cfce723a81, 0x7cbaa3df07a1ba, 0x3a182b554260b, 0x6175d3cec74f} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x18c5, 0x1326, 0x1d4d, 0x19eb, 0xea, 0x947, 0x1adf, 0xbf5, 0xafe, 0x1225, 0x18a0, 0xb3a, 0x8e0, 0xaea, 0x17aa, 0x19a5, 0x912, 0x634, 0x15c7, 0x1df7, 0x13cb, 0x1894, 0xeaa, 0xa69, 0x6ca, 0x1b49, 0x26f, 0x1f50, 0xd92, 0x6} +#elif RADIX == 32 +{0x9936314, 0xb3d7d4d, 0xf4a383a, 0xf97ebad, 0xa0912ab, 0x3816758, 0x7aa5752, 0x244b34b, 0xf5c731a, 0xa4f2fbe, 0xd2eaac4, 0xa49b294, 0xea026fd, 0x3364b} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x383ab3d7d4d99363, 0x912abf97ebadf4a, 0xb7aa57523816758a, 0xfbef5c731a244b34, 0x9b294d2eaac4a4f2, 0x54764bea026fda4} +#else +{0x7567afa9b326c6, 0x2fe5faeb7d28e0, 0x11c0b3ac504895, 0x2244b34b7aa575, 0x149e5f7deb8e63, 0x6926ca534baab1, 0x2a3b25f50137e} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x132f, 0x6d5, 0x95b, 0xa68, 0x1814, 0x12d3, 0x1f1e, 0x857, 0x14fa, 0xcf, 0x1f19, 0xe1b, 0x1cf7, 0xa53, 0x1455, 0x5ef, 0x3e2, 0x199c, 0x1162, 0x38d, 0x174b, 0x794, 0xef6, 0xf74, 0x9c, 0x1f55, 0x1c4d, 0x56f, 0x1638, 0x19} +#elif RADIX == 32 +{0x36accbf, 0x14d095b, 0xe969e05, 0xe90aff1, 0x19067d3, 0x3ddc37f, 0x455529f, 0xf88bdf, 0xb162cce, 0xa5d2c71, 0xe8ef63c, 0xaa8271e, 0xadfc4df, 0xa8e0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x9e0514d095b36acc, 0x9067d3e90aff1e96, 0xf455529f3ddc37f1, 0xc71b162cce0f88bd, 0x8271ee8ef63ca5d2, 0x30898e0adfc4dfaa} +#else +{0xa29a12b66d599, 0x4fa42bfc7a5a78, 0x79eee1bf8c833e, 0x60f88bdf455529, 0x14ba58e362c599, 0x6aa09c7ba3bd8f, 0x804c7056fe26f} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xe7,0x36f4,0xe2a7,0x986d,0x214b,0xf464,0x7818,0x49f7,0x5ea0,0x73e7,0x9e17,0x85a0,0xd1cc,0xc33d,0x7833,0xbb28,0xba60,0x69d5,0xd73c,0x879e,0x6732,0x905,0xeefd,0xc8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x36f400e7,0x986de2a7,0xf464214b,0x49f77818,0x73e75ea0,0x85a09e17,0xc33dd1cc,0xbb287833,0x69d5ba60,0x879ed73c,0x9056732,0xc8eefd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x986de2a736f400e7,0x49f77818f464214b,0x85a09e1773e75ea0,0xbb287833c33dd1cc,0x879ed73c69d5ba60,0xc8eefd09056732}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x925e,0xff6f,0xa6dc,0x2eff,0xb2a6,0xe88c,0xab24,0x6829,0x91eb,0x118,0x77ac,0x8506,0x9934,0x5a86,0x5cac,0xfd15,0x5869,0xc232,0xebcf,0xcdef,0x254,0xf9e4,0xcc7b,0x96}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xff6f925e,0x2effa6dc,0xe88cb2a6,0x6829ab24,0x11891eb,0x850677ac,0x5a869934,0xfd155cac,0xc2325869,0xcdefebcf,0xf9e40254,0x96cc7b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x2effa6dcff6f925e,0x6829ab24e88cb2a6,0x850677ac011891eb,0xfd155cac5a869934,0xcdefebcfc2325869,0x96cc7bf9e40254}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xae19,0xed4d,0x178c,0x7829,0x7b15,0x4808,0xdab3,0xebc6,0x25cb,0x3298,0xe9bd,0x3d5e,0xe9a4,0x960,0x92e6,0xb3ea,0x33e,0xf491,0x2343,0xbdb9,0xa17d,0x63a5,0x767f,0x41}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xed4dae19,0x7829178c,0x48087b15,0xebc6dab3,0x329825cb,0x3d5ee9bd,0x960e9a4,0xb3ea92e6,0xf491033e,0xbdb92343,0x63a5a17d,0x41767f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7829178ced4dae19,0xebc6dab348087b15,0x3d5ee9bd329825cb,0xb3ea92e60960e9a4,0xbdb92343f491033e,0x41767f63a5a17d}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xff19,0xc90b,0x1d58,0x6792,0xdeb4,0xb9b,0x87e7,0xb608,0xa15f,0x8c18,0x61e8,0x7a5f,0x2e33,0x3cc2,0x87cc,0x44d7,0x459f,0x962a,0x28c3,0x7861,0x98cd,0xf6fa,0x1102,0x37}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xc90bff19,0x67921d58,0xb9bdeb4,0xb60887e7,0x8c18a15f,0x7a5f61e8,0x3cc22e33,0x44d787cc,0x962a459f,0x786128c3,0xf6fa98cd,0x371102}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x67921d58c90bff19,0xb60887e70b9bdeb4,0x7a5f61e88c18a15f,0x44d787cc3cc22e33,0x786128c3962a459f,0x371102f6fa98cd}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa74d,0x6268,0x6670,0x157d,0x36bf,0xbff5,0x13f3,0x62fb,0x404b,0x863b,0xb7a3,0xada5,0x355f,0xc945,0x6b4c,0x7d75,0x9efd,0x8901,0x4c90,0xba3e,0x48f0,0x5677,0x49eb,0x93}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6268a74d,0x157d6670,0xbff536bf,0x62fb13f3,0x863b404b,0xada5b7a3,0xc945355f,0x7d756b4c,0x89019efd,0xba3e4c90,0x567748f0,0x9349eb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x157d66706268a74d,0x62fb13f3bff536bf,0xada5b7a3863b404b,0x7d756b4cc945355f,0xba3e4c9089019efd,0x9349eb567748f0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xd72,0xd1f5,0x548,0xe0a7,0xee15,0xfdbc,0xc63c,0xd72b,0x1e45,0xe787,0xc513,0xb278,0x7cd,0xcab5,0x5ced,0x8be9,0xf4a4,0x9711,0xe9d8,0x872d,0x443,0xead0,0xe34d,0x2e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xd1f50d72,0xe0a70548,0xfdbcee15,0xd72bc63c,0xe7871e45,0xb278c513,0xcab507cd,0x8be95ced,0x9711f4a4,0x872de9d8,0xead00443,0x2ee34d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xe0a70548d1f50d72,0xd72bc63cfdbcee15,0xb278c513e7871e45,0x8be95cedcab507cd,0x872de9d89711f4a4,0x2ee34dead00443}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xcecc,0x7789,0xbdb9,0x22b4,0x782f,0x794e,0x8e17,0xd2cc,0x1fb,0x1927,0x9c88,0x929,0x22b0,0x746e,0xd62b,0xade1,0xc7dd,0x5e2a,0xd146,0x7363,0xca5e,0x5460,0xd2b3,0xee}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7789cecc,0x22b4bdb9,0x794e782f,0xd2cc8e17,0x192701fb,0x9299c88,0x746e22b0,0xade1d62b,0x5e2ac7dd,0x7363d146,0x5460ca5e,0xeed2b3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x22b4bdb97789cecc,0xd2cc8e17794e782f,0x9299c88192701fb,0xade1d62b746e22b0,0x7363d1465e2ac7dd,0xeed2b35460ca5e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x58b3,0x9d97,0x998f,0xea82,0xc940,0x400a,0xec0c,0x9d04,0xbfb4,0x79c4,0x485c,0x525a,0xcaa0,0x36ba,0x94b3,0x828a,0x6102,0x76fe,0xb36f,0x45c1,0xb70f,0xa988,0xb614,0x6c}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9d9758b3,0xea82998f,0x400ac940,0x9d04ec0c,0x79c4bfb4,0x525a485c,0x36bacaa0,0x828a94b3,0x76fe6102,0x45c1b36f,0xa988b70f,0x6cb614}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xea82998f9d9758b3,0x9d04ec0c400ac940,0x525a485c79c4bfb4,0x828a94b336bacaa0,0x45c1b36f76fe6102,0x6cb614a988b70f}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x3d63,0xdad1,0xf501,0xd58f,0x8741,0xd265,0xf8bd,0xb3b9,0xac08,0xfc8b,0x45ab,0xbcdf,0x501,0x9f7,0x10ed,0x102f,0xc6e3,0xdc57,0xf892,0x8db4,0x2c76,0x21ab,0x2bc3,0x8e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xdad13d63,0xd58ff501,0xd2658741,0xb3b9f8bd,0xfc8bac08,0xbcdf45ab,0x9f70501,0x102f10ed,0xdc57c6e3,0x8db4f892,0x21ab2c76,0x8e2bc3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xd58ff501dad13d63,0xb3b9f8bdd2658741,0xbcdf45abfc8bac08,0x102f10ed09f70501,0x8db4f892dc57c6e3,0x8e2bc321ab2c76}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xc998,0x418c,0xa8e4,0x2354,0x622a,0xb76d,0x5487,0xdad9,0x1672,0x522b,0xa00f,0xdfa5,0x296b,0xe17c,0x595e,0x91e1,0xa22d,0xe126,0x904c,0x9288,0x5075,0xc6c5,0x61b0,0xb1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x418cc998,0x2354a8e4,0xb76d622a,0xdad95487,0x522b1672,0xdfa5a00f,0xe17c296b,0x91e1595e,0xe126a22d,0x9288904c,0xc6c55075,0xb161b0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x2354a8e4418cc998,0xdad95487b76d622a,0xdfa5a00f522b1672,0x91e1595ee17c296b,0x9288904ce126a22d,0xb161b0c6c55075}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1271,0x594e,0x16ee,0x35fa,0xaf0e,0x11b2,0x1fca,0x24b7,0xa3e3,0x2bcc,0xc2f0,0x6409,0xf8e1,0x6a8f,0x67e,0xe7ee,0xad00,0x2b9a,0x6813,0x5e0a,0x6dec,0x48f5,0xbd1d,0xb3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x594e1271,0x35fa16ee,0x11b2af0e,0x24b71fca,0x2bcca3e3,0x6409c2f0,0x6a8ff8e1,0xe7ee067e,0x2b9aad00,0x5e0a6813,0x48f56dec,0xb3bd1d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x35fa16ee594e1271,0x24b71fca11b2af0e,0x6409c2f02bcca3e3,0xe7ee067e6a8ff8e1,0x5e0a68132b9aad00,0xb3bd1d48f56dec}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xc29d,0x252e,0xafe,0x2a70,0x78be,0x2d9a,0x742,0x4c46,0x53f7,0x374,0xba54,0x4320,0xfafe,0xf608,0xef12,0xefd0,0x391c,0x23a8,0x76d,0x724b,0xd389,0xde54,0xd43c,0x71}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x252ec29d,0x2a700afe,0x2d9a78be,0x4c460742,0x37453f7,0x4320ba54,0xf608fafe,0xefd0ef12,0x23a8391c,0x724b076d,0xde54d389,0x71d43c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x2a700afe252ec29d,0x4c4607422d9a78be,0x4320ba54037453f7,0xefd0ef12f608fafe,0x724b076d23a8391c,0x71d43cde54d389}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xe7,0x36f4,0xe2a7,0x986d,0x214b,0xf464,0x7818,0x49f7,0x5ea0,0x73e7,0x9e17,0x85a0,0xd1cc,0xc33d,0x7833,0xbb28,0xba60,0x69d5,0xd73c,0x879e,0x6732,0x905,0xeefd,0xc8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x36f400e7,0x986de2a7,0xf464214b,0x49f77818,0x73e75ea0,0x85a09e17,0xc33dd1cc,0xbb287833,0x69d5ba60,0x879ed73c,0x9056732,0xc8eefd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x986de2a736f400e7,0x49f77818f464214b,0x85a09e1773e75ea0,0xbb287833c33dd1cc,0x879ed73c69d5ba60,0xc8eefd09056732}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x925e,0xff6f,0xa6dc,0x2eff,0xb2a6,0xe88c,0xab24,0x6829,0x91eb,0x118,0x77ac,0x8506,0x9934,0x5a86,0x5cac,0xfd15,0x5869,0xc232,0xebcf,0xcdef,0x254,0xf9e4,0xcc7b,0x96}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xff6f925e,0x2effa6dc,0xe88cb2a6,0x6829ab24,0x11891eb,0x850677ac,0x5a869934,0xfd155cac,0xc2325869,0xcdefebcf,0xf9e40254,0x96cc7b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x2effa6dcff6f925e,0x6829ab24e88cb2a6,0x850677ac011891eb,0xfd155cac5a869934,0xcdefebcfc2325869,0x96cc7bf9e40254}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xae19,0xed4d,0x178c,0x7829,0x7b15,0x4808,0xdab3,0xebc6,0x25cb,0x3298,0xe9bd,0x3d5e,0xe9a4,0x960,0x92e6,0xb3ea,0x33e,0xf491,0x2343,0xbdb9,0xa17d,0x63a5,0x767f,0x41}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xed4dae19,0x7829178c,0x48087b15,0xebc6dab3,0x329825cb,0x3d5ee9bd,0x960e9a4,0xb3ea92e6,0xf491033e,0xbdb92343,0x63a5a17d,0x41767f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7829178ced4dae19,0xebc6dab348087b15,0x3d5ee9bd329825cb,0xb3ea92e60960e9a4,0xbdb92343f491033e,0x41767f63a5a17d}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xff19,0xc90b,0x1d58,0x6792,0xdeb4,0xb9b,0x87e7,0xb608,0xa15f,0x8c18,0x61e8,0x7a5f,0x2e33,0x3cc2,0x87cc,0x44d7,0x459f,0x962a,0x28c3,0x7861,0x98cd,0xf6fa,0x1102,0x37}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xc90bff19,0x67921d58,0xb9bdeb4,0xb60887e7,0x8c18a15f,0x7a5f61e8,0x3cc22e33,0x44d787cc,0x962a459f,0x786128c3,0xf6fa98cd,0x371102}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x67921d58c90bff19,0xb60887e70b9bdeb4,0x7a5f61e88c18a15f,0x44d787cc3cc22e33,0x786128c3962a459f,0x371102f6fa98cd}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x53a7,0x3134,0xb338,0x8abe,0x9b5f,0xdffa,0x89f9,0xb17d,0xa025,0xc31d,0xdbd1,0xd6d2,0x9aaf,0x64a2,0xb5a6,0xbeba,0xcf7e,0x4480,0x2648,0x5d1f,0xa478,0xab3b,0xa4f5,0xc9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x313453a7,0x8abeb338,0xdffa9b5f,0xb17d89f9,0xc31da025,0xd6d2dbd1,0x64a29aaf,0xbebab5a6,0x4480cf7e,0x5d1f2648,0xab3ba478,0xc9a4f5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x8abeb338313453a7,0xb17d89f9dffa9b5f,0xd6d2dbd1c31da025,0xbebab5a664a29aaf,0x5d1f26484480cf7e,0xc9a4f5ab3ba478}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x86b9,0x68fa,0x82a4,0xf053,0x770a,0x7ede,0xe31e,0xeb95,0x8f22,0xf3c3,0x6289,0xd93c,0x83e6,0xe55a,0xae76,0x45f4,0xfa52,0x4b88,0xf4ec,0xc396,0x221,0xf568,0x71a6,0x97}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x68fa86b9,0xf05382a4,0x7ede770a,0xeb95e31e,0xf3c38f22,0xd93c6289,0xe55a83e6,0x45f4ae76,0x4b88fa52,0xc396f4ec,0xf5680221,0x9771a6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xf05382a468fa86b9,0xeb95e31e7ede770a,0xd93c6289f3c38f22,0x45f4ae76e55a83e6,0xc396f4ec4b88fa52,0x9771a6f5680221}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xe766,0xbbc4,0x5edc,0x915a,0x3c17,0xbca7,0x470b,0xe966,0x80fd,0xc93,0xce44,0x494,0x1158,0xba37,0xeb15,0xd6f0,0x63ee,0x2f15,0xe8a3,0x39b1,0x652f,0xaa30,0x6959,0xf7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xbbc4e766,0x915a5edc,0xbca73c17,0xe966470b,0xc9380fd,0x494ce44,0xba371158,0xd6f0eb15,0x2f1563ee,0x39b1e8a3,0xaa30652f,0xf76959}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x915a5edcbbc4e766,0xe966470bbca73c17,0x494ce440c9380fd,0xd6f0eb15ba371158,0x39b1e8a32f1563ee,0xf76959aa30652f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xac5a,0xcecb,0x4cc7,0x7541,0x64a0,0x2005,0x7606,0x4e82,0x5fda,0x3ce2,0x242e,0x292d,0x6550,0x9b5d,0x4a59,0x4145,0x3081,0xbb7f,0xd9b7,0xa2e0,0x5b87,0x54c4,0x5b0a,0x36}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xcecbac5a,0x75414cc7,0x200564a0,0x4e827606,0x3ce25fda,0x292d242e,0x9b5d6550,0x41454a59,0xbb7f3081,0xa2e0d9b7,0x54c45b87,0x365b0a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x75414cc7cecbac5a,0x4e827606200564a0,0x292d242e3ce25fda,0x41454a599b5d6550,0xa2e0d9b7bb7f3081,0x365b0a54c45b87}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xd70d,0x31e4,0xa551,0x7483,0x6f09,0x34d,0x6a80,0x85f,0x6b11,0xe29b,0x188,0x38d2,0x85b,0xa241,0xc423,0xddc8,0x3260,0x1722,0xf3a4,0x7cf7,0x36e8,0x7955,0xeeb9,0xc6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x31e4d70d,0x7483a551,0x34d6f09,0x85f6a80,0xe29b6b11,0x38d20188,0xa241085b,0xddc8c423,0x17223260,0x7cf7f3a4,0x795536e8,0xc6eeb9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7483a55131e4d70d,0x85f6a80034d6f09,0x38d20188e29b6b11,0xddc8c423a241085b,0x7cf7f3a417223260,0xc6eeb9795536e8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x59a9,0x8f53,0xd42f,0xf65b,0x7134,0x4475,0x9543,0x8428,0x4555,0x7d45,0x7bfb,0xe15d,0xe9c2,0x24ec,0xf17f,0x88ea,0x766c,0xbf2d,0x2b42,0x2771,0x5dfc,0xd040,0xfa62,0xc9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x8f5359a9,0xf65bd42f,0x44757134,0x84289543,0x7d454555,0xe15d7bfb,0x24ece9c2,0x88eaf17f,0xbf2d766c,0x27712b42,0xd0405dfc,0xc9fa62}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xf65bd42f8f5359a9,0x8428954344757134,0xe15d7bfb7d454555,0x88eaf17f24ece9c2,0x27712b42bf2d766c,0xc9fa62d0405dfc}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x4b49,0x89b0,0x8c52,0x91ca,0xed1b,0xd527,0x453,0x82d,0xb0eb,0xb6bf,0x3790,0x5816,0x49bb,0xa0a7,0xffc6,0x5530,0x23b9,0x12bb,0x52c4,0x6f51,0x25fd,0x62d,0x723d,0xc6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x89b04b49,0x91ca8c52,0xd527ed1b,0x82d0453,0xb6bfb0eb,0x58163790,0xa0a749bb,0x5530ffc6,0x12bb23b9,0x6f5152c4,0x62d25fd,0xc6723d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x91ca8c5289b04b49,0x82d0453d527ed1b,0x58163790b6bfb0eb,0x5530ffc6a0a749bb,0x6f5152c412bb23b9,0xc6723d062d25fd}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x28f3,0xce1b,0x5aae,0x8b7c,0x90f6,0xfcb2,0x957f,0xf7a0,0x94ee,0x1d64,0xfe77,0xc72d,0xf7a4,0x5dbe,0x3bdc,0x2237,0xcd9f,0xe8dd,0xc5b,0x8308,0xc917,0x86aa,0x1146,0x39}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xce1b28f3,0x8b7c5aae,0xfcb290f6,0xf7a0957f,0x1d6494ee,0xc72dfe77,0x5dbef7a4,0x22373bdc,0xe8ddcd9f,0x83080c5b,0x86aac917,0x391146}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x8b7c5aaece1b28f3,0xf7a0957ffcb290f6,0xc72dfe771d6494ee,0x22373bdc5dbef7a4,0x83080c5be8ddcd9f,0x39114686aac917}}} +#endif +}}}}; diff --git a/src/precomp/ref/lvl3/hd_splitting_transforms.c b/src/precomp/ref/lvl3/hd_splitting_transforms.c new file mode 100644 index 0000000..d980d12 --- /dev/null +++ b/src/precomp/ref/lvl3/hd_splitting_transforms.c @@ -0,0 +1,143 @@ +#include + +#define FP2_ZERO 0 +#define FP2_ONE 1 +#define FP2_I 2 +#define FP2_MINUS_ONE 3 +#define FP2_MINUS_I 4 + +const int EVEN_INDEX[10][2] = {{0, 0}, {0, 1}, {0, 2}, {0, 3}, {1, 0}, {1, 2}, {2, 0}, {2, 1}, {3, 0}, {3, 3}}; +const int CHI_EVAL[4][4] = {{1, 1, 1, 1}, {1, -1, 1, -1}, {1, 1, -1, -1}, {1, -1, -1, 1}}; +const fp2_t FP2_CONSTANTS[5] = {{ +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x1f03, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0xfff, 0x1e} +#elif RADIX == 32 +{0xffffc0f, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0x30fff} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xfffffffffffffffc, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0x3ffffffffffffff} +#else +{0x7ffffffffffff8, 0x7fffffffffffff, 0x7fffffffffffff, 0x7fffffffffffff, 0x7fffffffffffff, 0x7fffffffffffff, 0x1ffffffffffff} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1f03, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0xfff, 0x1e} +#elif RADIX == 32 +{0xffffc0f, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0x30fff} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xfffffffffffffffc, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0x3ffffffffffffff} +#else +{0x7ffffffffffff8, 0x7fffffffffffff, 0x7fffffffffffff, 0x7fffffffffffff, 0x7fffffffffffff, 0x7fffffffffffff, 0x1ffffffffffff} +#endif +#endif +}}; +const precomp_basis_change_matrix_t SPLITTING_TRANSFORMS[10] = {{{{FP2_ONE, FP2_I, FP2_ONE, FP2_I}, {FP2_ONE, FP2_MINUS_I, FP2_MINUS_ONE, FP2_I}, {FP2_ONE, FP2_I, FP2_MINUS_ONE, FP2_MINUS_I}, {FP2_MINUS_ONE, FP2_I, FP2_MINUS_ONE, FP2_I}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_MINUS_ONE, FP2_ZERO, FP2_ZERO}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}, {FP2_ZERO, FP2_ZERO, FP2_MINUS_ONE, FP2_ZERO}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_MINUS_ONE}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE}, {FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_ONE}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_ONE}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE}, {FP2_MINUS_ONE, FP2_ONE, FP2_ONE, FP2_MINUS_ONE}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}}}}; +const precomp_basis_change_matrix_t NORMALIZATION_TRANSFORMS[6] = {{{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}}}, {{{FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}}}, {{{FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_ONE}, {FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}}}, {{{FP2_MINUS_ONE, FP2_I, FP2_I, FP2_ONE}, {FP2_I, FP2_MINUS_ONE, FP2_ONE, FP2_I}, {FP2_I, FP2_ONE, FP2_MINUS_ONE, FP2_I}, {FP2_ONE, FP2_I, FP2_I, FP2_MINUS_ONE}}}, {{{FP2_ONE, FP2_I, FP2_I, FP2_MINUS_ONE}, {FP2_I, FP2_ONE, FP2_MINUS_ONE, FP2_I}, {FP2_I, FP2_MINUS_ONE, FP2_ONE, FP2_I}, {FP2_MINUS_ONE, FP2_I, FP2_I, FP2_ONE}}}}; diff --git a/src/precomp/ref/lvl3/include/e0_basis.h b/src/precomp/ref/lvl3/include/e0_basis.h new file mode 100644 index 0000000..05cafb8 --- /dev/null +++ b/src/precomp/ref/lvl3/include/e0_basis.h @@ -0,0 +1,3 @@ +#include +extern const fp2_t BASIS_E0_PX; +extern const fp2_t BASIS_E0_QX; diff --git a/src/precomp/ref/lvl3/include/ec_params.h b/src/precomp/ref/lvl3/include/ec_params.h index aae6504..941abd5 100644 --- a/src/precomp/ref/lvl3/include/ec_params.h +++ b/src/precomp/ref/lvl3/include/ec_params.h @@ -1,69 +1,12 @@ #ifndef EC_PARAMS_H #define EC_PARAMS_H -#define POWER_OF_2 97 -#define POWER_OF_3 68 +#include -static digit_t TWOpF[NWORDS_ORDER] = {0x0, 0x200000000, 0x0, 0x0, 0x0, 0x0}; // 2^g -static digit_t TWOpFm1[NWORDS_ORDER] = {0x0, 0x100000000, 0x0, 0x0, 0x0, 0x0}; // 2^(g-1) -static digit_t THREEpE[NWORDS_ORDER] = {0x003B3FCEF3103289, 0x0, 0x0, 0x0, 0x0, 0x0}; // 3^e -static digit_t THREEpF[NWORDS_ORDER] = {0x58DE83727119CD51, 0x00000DB6794B8C65, 0x0, 0x0, 0x0, 0x0}; // 3^f -static digit_t THREEpFdiv2[NWORDS_ORDER] = {0xAC6F41B9388CE6A8, 0x000006DB3CA5C632, 0x0, 0x0, 0x0, 0x0}; // Floor(3^f/2) +#define TORSION_EVEN_POWER 376 -#define scaled 1 // unscaled (0) or scaled (1) remainder tree approach -#define gap 83 +// p+1 divided by the power of 2 +extern const digit_t p_cofactor_for_2f[1]; +#define P_COFACTOR_FOR_2F_BITLENGTH 7 -#define P_LEN 7 -#define M_LEN 21 - -static digit_t p_plus_minus_bitlength[P_LEN + M_LEN] = -{ 2, 3, 4, 6, 8, 9, 10, 3, 4, 7, 7, 8, 8, 8, 8, 9, 10, 11, 12, - 12, 13, 13, 13, 13, 14, 15, 16, 16}; - -static digit_t p_cofactor_for_2f[5] = { -0x9AB752342630BA61, -0x48575BA8E3917B34, -0x22E8856B32DE1705, -0x558438D163573025, -0x0000000001EFB777 -}; -#define P_COFACTOR_FOR_2F_BITLENGTH 281 - -static digit_t p_cofactor_for_3g[5] = { - 0x0000000000000000, - 0x97E5302200000000, - 0xEE54EDDA13CFE081, - 0xC6BFE309D9209F3F, - 0x000000000000484C -}; - -#define P_COFACTOR_FOR_3G_BITLENGTH 271 - - -static digit_t p_cofactor_for_6fg[3] = { - 0x09E7F040CBF29811, - 0xEC904F9FF72A76ED, - 0x00002426635FF184 -}; -#define P_COFACTOR_FOR_6FG_BITLENGTH 174 - -static int STRATEGY4[47] = { 19, 12, 7, 4, 2, 1, 1, 1, 2, 1, 1, 3, 2, 1, 1, 1, 1, 5, 3, 2, 1, 1, 1, 1, 2, 1, 1, 1, 7, 5, 3, 2, 1, 1, 1, 1, 2, 1, 1, 1, 3, 2, 1, 1, 1, 1}; - -static int sizeI[P_LEN+M_LEN] = { - 0, 1, 2, 3, 6, 14, 14, 1, 3, 5, 5, 7, 8, 8, 10, 11, 14, 19, 26, 30, 35, 40, 44, 44, 52, 88, 114, 114 -}; -static int sizeJ[P_LEN+M_LEN] = { - 0, 1, 1, 3, 6, 9, 13, 1, 1, 4, 5, 6, 7, 7, 6, 10, 10, 16, 23, 28, 32, 32, 32, 33, 45, 76, 87, 104 -}; -static int sizeK[P_LEN+M_LEN] = { - 1, 1, 1, 5, 6, 2, 16, 0, 0, 4, 6, 2, 4, 7, 0, 1, 4, 6, 0, 5, 18, 13, 30, 2, 18, 12, 3, 8 -}; - -#define sI_max 114 -#define sJ_max 104 -#define sK_max 47 - -#define ceil_log_sI_max 7 -#define ceil_log_sJ_max 7 - -#endif \ No newline at end of file +#endif diff --git a/src/precomp/ref/lvl3/include/encoded_sizes.h b/src/precomp/ref/lvl3/include/encoded_sizes.h index 33c5aac..50a8781 100644 --- a/src/precomp/ref/lvl3/include/encoded_sizes.h +++ b/src/precomp/ref/lvl3/include/encoded_sizes.h @@ -1,14 +1,11 @@ +#define SECURITY_BITS 192 +#define SQIsign_response_length 192 +#define HASH_ITERATIONS 256 +#define FP_ENCODED_BYTES 48 #define FP2_ENCODED_BYTES 96 #define EC_CURVE_ENCODED_BYTES 96 #define EC_POINT_ENCODED_BYTES 96 #define EC_BASIS_ENCODED_BYTES 288 -#define CHAIN_LENGTH 10 -#define QUAT_ALG_ELEM_ENCODED_BITS 588 -#define QUAT_ALG_ELEM_ENCODED_BYTES 74 -#define ID2ISO_LONG_TWO_ISOG_ENCODED_BYTES 1940 -#define ZIP_CHAIN_LEN 16 -#define ID2ISO_COMPRESSED_LONG_TWO_ISOG_ZIP_CHAIN_BYTES 13 -#define ID2ISO_COMPRESSED_LONG_TWO_ISOG_BYTES 209 -#define SIGNATURE_LEN 263 -#define PUBLICKEY_BYTES 96 -#define SECRETKEY_BYTES 1138 +#define PUBLICKEY_BYTES 97 +#define SECRETKEY_BYTES 529 +#define SIGNATURE_BYTES 224 diff --git a/src/precomp/ref/lvl3/include/endomorphism_action.h b/src/precomp/ref/lvl3/include/endomorphism_action.h index f5397aa..5bb17f5 100644 --- a/src/precomp/ref/lvl3/include/endomorphism_action.h +++ b/src/precomp/ref/lvl3/include/endomorphism_action.h @@ -1,19 +1,31 @@ -#include +#ifndef ENDOMORPHISM_ACTION_H +#define ENDOMORPHISM_ACTION_H +#include #include #include -extern const ec_basis_t BASIS_EVEN; -extern const ec_basis_t BASIS_ODD_PLUS; -extern const ec_basis_t BASIS_ODD_MINUS; -extern const ec_basis_t BASIS_COMMITMENT_PLUS; -extern const ec_basis_t BASIS_COMMITMENT_MINUS; -extern const ec_basis_t BASIS_CHALLENGE; -extern const ec_curve_t CURVE_E0; -extern const ec_point_t CURVE_E0_A24; -extern const ibz_mat_2x2_t ACTION_I; -extern const ibz_mat_2x2_t ACTION_J; -extern const ibz_mat_2x2_t ACTION_K; -extern const ibz_mat_2x2_t ACTION_GEN2; -extern const ibz_mat_2x2_t ACTION_GEN3; -extern const ibz_mat_2x2_t ACTION_GEN4; -extern const quat_alg_elem_t COMMITMENT_IDEAL_UNDISTORTED_GEN; -extern const quat_alg_elem_t COMMITMENT_IDEAL_DISTORTION_ENDO; +/** Type for precomputed endomorphism rings applied to precomputed torsion bases. + * + * Precomputed by the precompute scripts. + * + * @typedef curve_with_endomorphism_ring_t + * + * @struct curve_with_endomorphism_ring + **/ +typedef struct curve_with_endomorphism_ring { + ec_curve_t curve; + ec_basis_t basis_even; + ibz_mat_2x2_t action_i, action_j, action_k; + ibz_mat_2x2_t action_gen2, action_gen3, action_gen4; +} curve_with_endomorphism_ring_t; +#define CURVE_E0 (CURVES_WITH_ENDOMORPHISMS->curve) +#define BASIS_EVEN (CURVES_WITH_ENDOMORPHISMS->basis_even) +#define ACTION_I (CURVES_WITH_ENDOMORPHISMS->action_i) +#define ACTION_J (CURVES_WITH_ENDOMORPHISMS->action_j) +#define ACTION_K (CURVES_WITH_ENDOMORPHISMS->action_k) +#define ACTION_GEN2 (CURVES_WITH_ENDOMORPHISMS->action_gen2) +#define ACTION_GEN3 (CURVES_WITH_ENDOMORPHISMS->action_gen3) +#define ACTION_GEN4 (CURVES_WITH_ENDOMORPHISMS->action_gen4) +#define NUM_ALTERNATE_STARTING_CURVES 7 +#define ALTERNATE_STARTING_CURVES (CURVES_WITH_ENDOMORPHISMS+1) +extern const curve_with_endomorphism_ring_t CURVES_WITH_ENDOMORPHISMS[8]; +#endif diff --git a/src/precomp/ref/lvl3/include/fp_constants.h b/src/precomp/ref/lvl3/include/fp_constants.h index c38f167..063579a 100644 --- a/src/precomp/ref/lvl3/include/fp_constants.h +++ b/src/precomp/ref/lvl3/include/fp_constants.h @@ -1,4 +1,17 @@ +#if RADIX == 32 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +#define NWORDS_FIELD 12 +#else +#define NWORDS_FIELD 14 +#endif +#define NWORDS_ORDER 12 +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) #define NWORDS_FIELD 6 -#define NWORDS_ORDER 6 +#else +#define NWORDS_FIELD 7 +#endif +#define NWORDS_ORDER 6 +#endif #define BITS 384 #define LOG2P 9 diff --git a/src/precomp/ref/lvl3/include/hd_splitting_transforms.h b/src/precomp/ref/lvl3/include/hd_splitting_transforms.h new file mode 100644 index 0000000..b3147a4 --- /dev/null +++ b/src/precomp/ref/lvl3/include/hd_splitting_transforms.h @@ -0,0 +1,18 @@ +#ifndef HD_SPLITTING_H +#define HD_SPLITTING_H + +#include +#include + +typedef struct precomp_basis_change_matrix { + uint8_t m[4][4]; +} precomp_basis_change_matrix_t; + +extern const int EVEN_INDEX[10][2]; +extern const int CHI_EVAL[4][4]; +extern const fp2_t FP2_CONSTANTS[5]; +extern const precomp_basis_change_matrix_t SPLITTING_TRANSFORMS[10]; +extern const precomp_basis_change_matrix_t NORMALIZATION_TRANSFORMS[6]; + +#endif + diff --git a/src/precomp/ref/lvl3/include/klpt_constants.h b/src/precomp/ref/lvl3/include/klpt_constants.h deleted file mode 100644 index 9c42124..0000000 --- a/src/precomp/ref/lvl3/include/klpt_constants.h +++ /dev/null @@ -1,27 +0,0 @@ -#include -#define KLPT_equiv_bound_coeff 7 -#define KLPT_equiv_num_iter 50625 -#define KLPT_primality_num_iter 32 -#define KLPT_signing_klpt_length 1552 -#define KLPT_signing_num_gamma_trial 64 -#define KLPT_gamma_exponent_interval_size 0 -#define KLPT_gamma_exponent_center_shift 15 -#define KLPT_repres_num_gamma_trial 32768 -#define KLPT_signing_number_strong_approx 5108 -#define KLPT_random_prime_attempts 64 -#define KLPT_secret_key_prime_size 95 -#define KLPT_keygen_length 970 -#define KLPT_keygen_num_gamma_trial 64 -#define KLPT_eichler_smallnorm_bitsize 165 -#define KLPT_keygen_number_strong_approx 3929 -#define KLPT_eichler_number_mu_norm 12 -#define KLPT_eichler_strong_approx_log_margin 2 -#define KLPT_eichler_num_equiv_ideal 38 -#define KLPT_eichler_number_strong_approx 3780 -#define SQISIGN_response_attempts 64 -#define SQISIGN_random_length 0 -#define SQISIGN_signing_total_length 1552 -#define SQISIGN_signing_length 16 -#define SQISIGN_keygen_length 10 -extern const short SMALL_PRIMES_1MOD4[11]; -extern const ibz_t PROD_SMALL_PRIMES_3MOD4; diff --git a/src/precomp/ref/lvl3/include/quaternion_constants.h b/src/precomp/ref/lvl3/include/quaternion_constants.h new file mode 100644 index 0000000..a2f4b52 --- /dev/null +++ b/src/precomp/ref/lvl3/include/quaternion_constants.h @@ -0,0 +1,6 @@ +#include +#define QUAT_primality_num_iter 32 +#define QUAT_repres_bound_input 21 +#define QUAT_equiv_bound_coeff 64 +#define FINDUV_box_size 3 +#define FINDUV_cube_size 2400 diff --git a/src/precomp/ref/lvl3/include/quaternion_data.h b/src/precomp/ref/lvl3/include/quaternion_data.h index c3de3e1..740da6e 100644 --- a/src/precomp/ref/lvl3/include/quaternion_data.h +++ b/src/precomp/ref/lvl3/include/quaternion_data.h @@ -1,7 +1,12 @@ -#include #include +#define MAXORD_O0 (EXTREMAL_ORDERS->order) +#define STANDARD_EXTREMAL_ORDER (EXTREMAL_ORDERS[0]) #define NUM_ALTERNATE_EXTREMAL_ORDERS 7 +#define ALTERNATE_EXTREMAL_ORDERS (EXTREMAL_ORDERS+1) +#define ALTERNATE_CONNECTING_IDEALS (CONNECTING_IDEALS+1) +#define ALTERNATE_CONJUGATING_ELEMENTS (CONJUGATING_ELEMENTS+1) +extern const ibz_t QUAT_prime_cofactor; extern const quat_alg_t QUATALG_PINFTY; -extern const quat_order_t MAXORD_O0; -extern const quat_p_extremal_maximal_order_t STANDARD_EXTREMAL_ORDER; -extern const quat_p_extremal_maximal_order_t ALTERNATE_EXTREMAL_ORDERS[7]; +extern const quat_p_extremal_maximal_order_t EXTREMAL_ORDERS[8]; +extern const quat_left_ideal_t CONNECTING_IDEALS[8]; +extern const quat_alg_elem_t CONJUGATING_ELEMENTS[8]; diff --git a/src/precomp/ref/lvl3/include/torsion_constants.h b/src/precomp/ref/lvl3/include/torsion_constants.h index e2d197d..f5e4e9f 100644 --- a/src/precomp/ref/lvl3/include/torsion_constants.h +++ b/src/precomp/ref/lvl3/include/torsion_constants.h @@ -1,24 +1,6 @@ -#include -#define TORSION_2POWER_BYTES 13 -#define TORSION_3POWER_BYTES 14 -#define TORSION_23POWER_BYTES 26 -extern const uint64_t TORSION_PLUS_EVEN_POWER; -extern const uint64_t TORSION_ODD_PRIMES[28]; -extern const uint64_t TORSION_ODD_POWERS[28]; -extern const uint64_t TORSION_PLUS_ODD_PRIMES[7]; -extern const size_t TORSION_PLUS_ODD_POWERS[7]; -extern const uint64_t TORSION_MINUS_ODD_PRIMES[21]; -extern const size_t TORSION_MINUS_ODD_POWERS[21]; -extern const size_t DEGREE_COMMITMENT_POWERS[28]; -extern const ibz_t CHARACTERISTIC; -extern const ibz_t TORSION_ODD; -extern const ibz_t TORSION_ODD_PRIMEPOWERS[28]; -extern const ibz_t TORSION_ODD_PLUS; -extern const ibz_t TORSION_ODD_MINUS; +#include +#define TORSION_2POWER_BYTES 48 +extern const ibz_t TWO_TO_SECURITY_BITS; extern const ibz_t TORSION_PLUS_2POWER; -extern const ibz_t TORSION_PLUS_3POWER; -extern const ibz_t TORSION_PLUS_23POWER; -extern const ibz_t DEGREE_COMMITMENT; -extern const ibz_t DEGREE_COMMITMENT_PLUS; -extern const ibz_t DEGREE_COMMITMENT_MINUS; -extern const ibz_t DEGREE_CHALLENGE; +extern const ibz_t SEC_DEGREE; +extern const ibz_t COM_DEGREE; diff --git a/src/precomp/ref/lvl3/klpt_constants.c b/src/precomp/ref/lvl3/klpt_constants.c deleted file mode 100644 index 3358164..0000000 --- a/src/precomp/ref/lvl3/klpt_constants.c +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include -#include -#if 0 -#elif 8*DIGIT_LEN == 16 -const short SMALL_PRIMES_1MOD4[11] = {0x5, 0xd, 0x11, 0x1d, 0x25, 0x29, 0x35, 0x3d, 0x49, 0x59, 0x61}; -const ibz_t PROD_SMALL_PRIMES_3MOD4 = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x173b,0x80bd,0xa9d7,0xa185}}}; -#elif 8*DIGIT_LEN == 32 -const short SMALL_PRIMES_1MOD4[11] = {0x5, 0xd, 0x11, 0x1d, 0x25, 0x29, 0x35, 0x3d, 0x49, 0x59, 0x61}; -const ibz_t PROD_SMALL_PRIMES_3MOD4 = {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x80bd173b,0xa185a9d7}}}; -#elif 8*DIGIT_LEN == 64 -const short SMALL_PRIMES_1MOD4[11] = {0x5, 0xd, 0x11, 0x1d, 0x25, 0x29, 0x35, 0x3d, 0x49, 0x59, 0x61}; -const ibz_t PROD_SMALL_PRIMES_3MOD4 = {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xa185a9d780bd173b}}}; -#endif diff --git a/src/precomp/ref/lvl3/quaternion_data.c b/src/precomp/ref/lvl3/quaternion_data.c index f465ab6..2440225 100644 --- a/src/precomp/ref/lvl3/quaternion_data.c +++ b/src/precomp/ref/lvl3/quaternion_data.c @@ -1,20 +1,3626 @@ #include #include #include +const ibz_t QUAT_prime_cofactor = #if 0 -#elif 8*DIGIT_LEN == 16 -const quat_alg_t QUATALG_PINFTY = {{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x74c1,0x4c61,0xa468,0x356e,0xf669,0xc722,0xb751,0x90ae,0x2e0a,0x65bc,0xad6,0x45d1,0x604a,0xc6ae,0x71a2,0xab08,0x6eee,0x3df}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x74c1,0x4c61,0xa468,0x356e,0xf669,0xc722,0xb751,0x90ae,0x2e0a,0x65bc,0xad6,0x45d1,0x604a,0xc6ae,0x71a2,0xab08,0x6eee,0x3df}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x74c1,0x4c61,0xa468,0x356e,0xf669,0xc722,0xb751,0x90ae,0x2e0a,0x65bc,0xad6,0x45d1,0x604a,0xc6ae,0x71a2,0xab08,0x6eee,0x3df}}}}}}; -const quat_order_t MAXORD_O0 = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}; -const quat_p_extremal_maximal_order_t STANDARD_EXTREMAL_ORDER = {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1}; -const quat_p_extremal_maximal_order_t ALTERNATE_EXTREMAL_ORDERS[7] = {{{{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xd07e,0x99c6,0x707e,0x2590,0xe6e5,0x16a9,0x15cb,0xf289,0x7b19,0x349,0x2937,0x2890}}}, {{{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xd07e,0x99c6,0x707e,0x2590,0xe6e5,0x16a9,0x15cb,0xf289,0x7b19,0x349,0x2937,0x2890}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x683f,0x4ce3,0x383f,0x92c8,0xf372,0x8b54,0x8ae5,0xf944,0xbd8c,0x81a4,0x149b,0x1448}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x7f02,0xe45a,0x5dd2,0x5621,0x7342,0x517f,0x2c7e,0xf602,0x361e,0x307,0x521b,0x10d9,0x45c7,0xc8a3,0xe540,0xdb2b,0x3e19,0x138f,0xd9ec,0x4603,0xaa01,0xcac6,0xaf07,0x336}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x3f81,0x722d,0xaee9,0x2b10,0xb9a1,0x28bf,0x163f,0x7b01,0x9b0f,0x8183,0xa90d,0x886c,0xa2e3,0x6451,0xf2a0,0xed95,0x9f0c,0x9c7,0xecf6,0xa301,0x5500,0xe563,0x5783,0x19b}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x95e,0x7e34,0x3884,0x5e12,0xef66,0xa920,0x266b,0xbcb1,0x75cb,0xbadf,0x4ba2,0xf93}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x683f,0x4ce3,0x383f,0x92c8,0xf372,0x8b54,0x8ae5,0xf944,0xbd8c,0x81a4,0x149b,0x1448}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xd07e,0x99c6,0x707e,0x2590,0xe6e5,0x16a9,0x15cb,0xf289,0x7b19,0x349,0x2937,0x2890}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0x12bc,0xfc68,0x7108,0xbc24,0xdecc,0x5241,0x4cd7,0x7962,0xeb97,0x75be,0x9745,0x1f26}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x3}, {{{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xf18,0xfecc,0x9d2,0xe5c5,0xcbb8,0x1c34,0xa029,0x9a05,0x3cc5,0x4c22,0x4674,0x5472}}}, {{{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xf18,0xfecc,0x9d2,0xe5c5,0xcbb8,0x1c34,0xa029,0x9a05,0x3cc5,0x4c22,0x4674,0x5472}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x78c,0x7f66,0x84e9,0x72e2,0x65dc,0x8e1a,0xd014,0xcd02,0x1e62,0x2611,0x233a,0x2a39}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xe920,0xd791,0x1fd,0xc431,0xbfb0,0x70fd,0xeb42,0xf1d5,0x4a4,0x499,0xd63f,0x40a,0xb3d6,0x2e8c,0x87b9,0x9b64,0x6f5a,0xe716,0x2d0a,0xcdfc,0xa6b,0x9277,0x989f,0xded}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xd9e1,0xbea1,0x3b1f,0x1b20,0xec88,0x4320,0x7b3a,0x1b1d,0xed2e,0xce2,0x705,0x1ff7,0x47ef,0xac38,0xcfe3,0xd7c1,0x5fbd,0x5c6f,0x1204,0x8598,0x6a91,0xa0fc,0x3d0c,0x592}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x78c,0x7f66,0x84e9,0x72e2,0x65dc,0x8e1a,0xd014,0xcd02,0x1e62,0x2611,0x233a,0x2a39}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xf18,0xfecc,0x9d2,0xe5c5,0xcbb8,0x1c34,0xa029,0x9a05,0x3cc5,0x4c22,0x4674,0x5472}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0x90db,0xf5fa,0xdc5c,0xc0,0xe0b9,0x9256,0x6e61,0x5c18,0x6763,0xc8c3,0x8964,0x6842}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x5}, {{{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xee3a,0x7214,0xac30,0xb093,0xc9ce,0x8af1,0xaa71,0x8469,0xaf6a,0x1492,0x46dd,0x17e9}}}, {{{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xee3a,0x7214,0xac30,0xb093,0xc9ce,0x8af1,0xaa71,0x8469,0xaf6a,0x1492,0x46dd,0x17e9}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x771d,0x390a,0xd618,0x5849,0xe4e7,0xc578,0xd538,0x4234,0x57b5,0x8a49,0xa36e,0xbf4}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xf292,0xdf5f,0xf5d0,0x38b4,0xb3b4,0xaca5,0xa340,0x5c40,0xfe7f,0xc31f,0x507a,0x2da9,0xdc1b,0x1e9a,0x9af0,0x9404,0x8b76,0x21d7,0x3160,0x9944,0xba5a,0xe5df,0xdfa6,0x11d}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xf949,0x6faf,0x7ae8,0x1c5a,0xd9da,0x5652,0x51a0,0xae20,0xff3f,0x618f,0xa83d,0x96d4,0x6e0d,0xf4d,0x4d78,0x4a02,0xc5bb,0x10eb,0x18b0,0x4ca2,0xdd2d,0x72ef,0xefd3,0x8e}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x1c90,0x402d,0x1529,0xd2ba,0xab53,0xe4e7,0xa27,0xf893,0xf471,0x95a7,0x4a3f,0x305}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x771d,0x390a,0xd618,0x5849,0xe4e7,0xc578,0xd538,0x4234,0x57b5,0x8a49,0xa36e,0xbf4}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xee3a,0x7214,0xac30,0xb093,0xc9ce,0x8af1,0xaa71,0x8469,0xaf6a,0x1492,0x46dd,0x17e9}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x3920,0x805a,0x2a52,0xa574,0x56a7,0xc9cf,0x144f,0xf126,0xe8e3,0x2b4f,0x947f,0x60a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x7}, {{{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6ce0,0x5a29,0xcaf5,0x75fb,0x4497,0x847e,0xed64,0xe2d9,0x27c3,0x72c3,0xd228,0x2a98}}}, {{{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6ce0,0x5a29,0xcaf5,0x75fb,0x4497,0x847e,0xed64,0xe2d9,0x27c3,0x72c3,0xd228,0x2a98}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xb670,0xad14,0xe57a,0xbafd,0x224b,0x423f,0xf6b2,0xf16c,0x93e1,0x3961,0x6914,0x154c}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xb670,0xad14,0xe57a,0xbafd,0x224b,0x423f,0xf6b2,0xf16c,0x93e1,0x3961,0x6914,0x154c}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xe200,0xc706,0x8600,0xa90e,0x1c37,0x36d3,0x9648,0x17b7,0xc8e4,0x6528,0x662b,0x3031,0xa41,0x7e15,0x5e0e,0x5586,0x68d5,0xb086,0x8b21,0xde5c,0x59bb,0xc11b,0x4017,0x38b}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x7100,0x6383,0x4300,0xd487,0x8e1b,0x1b69,0xcb24,0xbdb,0x6472,0xb294,0xb315,0x9818,0x8520,0x3f0a,0x2f07,0xaac3,0x346a,0xd843,0x4590,0xef2e,0xacdd,0xe08d,0xa00b,0x1c5}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xaf81,0x415e,0x1985,0xc8f4,0x3cdb,0xadd5,0xfc00,0x4aa8,0x50e4,0xc673,0xb005,0xf0f5,0xa40,0x7e15,0x5e0e,0x5586,0x68d5,0xb086,0x8b21,0xde5c,0x59bb,0xc11b,0x4017,0x38b}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xb670,0xad14,0xe57a,0xbafd,0x224b,0x423f,0xf6b2,0xf16c,0x93e1,0x3961,0x6914,0x154c}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6ce0,0x5a29,0xcaf5,0x75fb,0x4497,0x847e,0xed64,0xe2d9,0x27c3,0x72c3,0xd228,0x2a98}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x64fe,0xb50,0xd8f7,0xc034,0xbeb7,0x11fb,0x348f,0x9a1d,0xefff,0x3d6a,0x6c4b,0x7e77}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xb}, {{{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x4de0,0xfae4,0x6267,0x7fd9,0x7eca,0x2350,0x494b,0x1927,0xce89,0x9621,0xaf08,0x8bb}}}, {{{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x4de0,0xfae4,0x6267,0x7fd9,0x7eca,0x2350,0x494b,0x1927,0xce89,0x9621,0xaf08,0x8bb}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x26f0,0xfd72,0xb133,0x3fec,0x3f65,0x91a8,0xa4a5,0x8c93,0xe744,0x4b10,0xd784,0x45d}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x4200,0x2758,0x6efa,0x757c,0x8411,0xdefe,0xd643,0x4fe6,0x93ab,0x49f7,0x2818,0xa66f,0x6ca1,0x715d,0x530f,0x20b8,0xb136,0x4f0b,0x97b7,0x2032,0x17ec,0xdbcd,0x2244,0x26}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x9c01,0x2d01,0x5ee8,0x6446,0xc360,0xbf96,0xf68,0xf85c,0x6232,0xa024,0x9706,0xa637,0x6ca1,0x715d,0x530f,0x20b8,0xb136,0x4f0b,0x97b7,0x2032,0x17ec,0xdbcd,0x2244,0x26}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x26f0,0xfd72,0xb133,0x3fec,0x3f65,0x91a8,0xa4a5,0x8c93,0xe744,0x4b10,0xd784,0x45d}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x4de0,0xfae4,0x6267,0x7fd9,0x7eca,0x2350,0x494b,0x1927,0xce89,0x9621,0xaf08,0x8bb}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0xa5ff,0xfa56,0x1011,0x1136,0xc0b1,0x1f67,0xc6db,0x578a,0x3178,0xa9d3,0x9111,0x37}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xd}, {{{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x3a40,0x9c50,0x8440,0xbfd9,0xd7e0,0x1f7,0x8a32,0xcaca,0xb3b,0x2615,0x3d3f,0xa14}}}, {{{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x3a40,0x9c50,0x8440,0xbfd9,0xd7e0,0x1f7,0x8a32,0xcaca,0xb3b,0x2615,0x3d3f,0xa14}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x1d20,0x4e28,0xc220,0x5fec,0xebf0,0xfb,0x4519,0xe565,0x859d,0x930a,0x1e9f,0x50a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x8800,0x3aa0,0x8011,0xc210,0x6c37,0x8c6c,0x2407,0xecce,0x1310,0xd5f6,0xd7b4,0x4e72,0xd10e,0xb8d1,0x3e55,0x32d1,0x8e65,0x3702,0xe4ca,0x1c47,0x5ff2,0x47bf,0xcb31,0x32}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x801,0x1c89,0x9f98,0x742c,0x299c,0xb098,0x59ca,0xb28b,0xf560,0x704e,0xff55,0x1b1e}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x1d20,0x4e28,0xc220,0x5fec,0xebf0,0xfb,0x4519,0xe565,0x859d,0x930a,0x1e9f,0x50a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x3a40,0x9c50,0x8440,0xbfd9,0xd7e0,0x1f7,0x8a32,0xcaca,0xb3b,0x2615,0x3d3f,0xa14}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x801,0x1c89,0x9f98,0x742c,0x299c,0xb098,0x59ca,0xb28b,0xf560,0x704e,0xff55,0x1b1e}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x11}, {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x45b6,0x2d1f,0x4788,0xdecc,0x42f4,0xf406,0x7975,0xbe12,0xb753,0x7d46,0x15d0,0xd278,0x6}}}, {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x45b6,0x2d1f,0x4788,0xdecc,0x42f4,0xf406,0x7975,0xbe12,0xb753,0x7d46,0x15d0,0xd278,0x6}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xa2db,0x168f,0x23c4,0x6f66,0x217a,0xfa03,0x3cba,0xdf09,0x5ba9,0x3ea3,0xae8,0x693c,0x3}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0xceb2,0xf887,0x83d9,0x9f4,0xd993,0x4dae,0x8051,0x4055,0xa807,0x62d2,0x4d70,0x6776,0x4f8b,0xbd48,0x5ec2,0xacb2,0xdd61,0xa2ef,0xfcf9,0xcac0,0xf6ab,0x3114,0x20f2,0x4555,0x17}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0xe759,0xfc43,0x41ec,0x84fa,0x6cc9,0xa6d7,0xc028,0xa02a,0x5403,0x3169,0x26b8,0xb3bb,0x27c5,0x5ea4,0x2f61,0xd659,0xeeb0,0xd177,0x7e7c,0xe560,0x7b55,0x188a,0x9079,0xa2aa,0xb}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x5870,0xf2e6,0xe47b,0x8186,0x85ec,0x260e,0xfec1,0xb9e8,0x6d00,0xb89b,0x58ba,0xf414,0x2294,0x73b0,0x4a97,0x5637,0x551f,0x94c1,0xb0c5,0xd296,0x1d55,0xa609,0x331,0x1e25,0xa}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xa2db,0x168f,0x23c4,0x6f66,0x217a,0xfa03,0x3cba,0xdf09,0x5ba9,0x3ea3,0xae8,0x693c,0x3}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x45b6,0x2d1f,0x4788,0xdecc,0x42f4,0xf406,0x7975,0xbe12,0xb753,0x7d46,0x15d0,0xd278,0x6}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -13, ._mp_d = (mp_limb_t[]) {0x41c8,0xc538,0x3ec1,0x80dd,0xeefd,0x3b0c,0x3fa5,0x9ed0,0x8a6f,0x8c87,0x1b3a,0x3996,0x20}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2e}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x17}}; -#elif 8*DIGIT_LEN == 32 -const quat_alg_t QUATALG_PINFTY = {{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0xffffffff,0x4c6174c1,0x356ea468,0xc722f669,0x90aeb751,0x65bc2e0a,0x45d10ad6,0xc6ae604a,0xab0871a2,0x3df6eee}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0xffffffff,0x4c6174c1,0x356ea468,0xc722f669,0x90aeb751,0x65bc2e0a,0x45d10ad6,0xc6ae604a,0xab0871a2,0x3df6eee}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0xffffffff,0x4c6174c1,0x356ea468,0xc722f669,0x90aeb751,0x65bc2e0a,0x45d10ad6,0xc6ae604a,0xab0871a2,0x3df6eee}}}}}}; -const quat_order_t MAXORD_O0 = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}; -const quat_p_extremal_maximal_order_t STANDARD_EXTREMAL_ORDER = {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1}; -const quat_p_extremal_maximal_order_t ALTERNATE_EXTREMAL_ORDERS[7] = {{{{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x99c6d07e,0x2590707e,0x16a9e6e5,0xf28915cb,0x3497b19,0x28902937}}}, {{{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x99c6d07e,0x2590707e,0x16a9e6e5,0xf28915cb,0x3497b19,0x28902937}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x4ce3683f,0x92c8383f,0x8b54f372,0xf9448ae5,0x81a4bd8c,0x1448149b}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xe45a7f02,0x56215dd2,0x517f7342,0xf6022c7e,0x307361e,0x10d9521b,0xc8a345c7,0xdb2be540,0x138f3e19,0x4603d9ec,0xcac6aa01,0x336af07}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x722d3f81,0x2b10aee9,0x28bfb9a1,0x7b01163f,0x81839b0f,0x886ca90d,0x6451a2e3,0xed95f2a0,0x9c79f0c,0xa301ecf6,0xe5635500,0x19b5783}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7e34095e,0x5e123884,0xa920ef66,0xbcb1266b,0xbadf75cb,0xf934ba2}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x4ce3683f,0x92c8383f,0x8b54f372,0xf9448ae5,0x81a4bd8c,0x1448149b}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x99c6d07e,0x2590707e,0x16a9e6e5,0xf28915cb,0x3497b19,0x28902937}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0xfc6812bc,0xbc247108,0x5241decc,0x79624cd7,0x75beeb97,0x1f269745}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x3}, {{{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xfecc0f18,0xe5c509d2,0x1c34cbb8,0x9a05a029,0x4c223cc5,0x54724674}}}, {{{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xfecc0f18,0xe5c509d2,0x1c34cbb8,0x9a05a029,0x4c223cc5,0x54724674}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7f66078c,0x72e284e9,0x8e1a65dc,0xcd02d014,0x26111e62,0x2a39233a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xd791e920,0xc43101fd,0x70fdbfb0,0xf1d5eb42,0x49904a4,0x40ad63f,0x2e8cb3d6,0x9b6487b9,0xe7166f5a,0xcdfc2d0a,0x92770a6b,0xded989f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xbea1d9e1,0x1b203b1f,0x4320ec88,0x1b1d7b3a,0xce2ed2e,0x1ff70705,0xac3847ef,0xd7c1cfe3,0x5c6f5fbd,0x85981204,0xa0fc6a91,0x5923d0c}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7f66078c,0x72e284e9,0x8e1a65dc,0xcd02d014,0x26111e62,0x2a39233a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xfecc0f18,0xe5c509d2,0x1c34cbb8,0x9a05a029,0x4c223cc5,0x54724674}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0xf5fa90db,0xc0dc5c,0x9256e0b9,0x5c186e61,0xc8c36763,0x68428964}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x5}, {{{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7214ee3a,0xb093ac30,0x8af1c9ce,0x8469aa71,0x1492af6a,0x17e946dd}}}, {{{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7214ee3a,0xb093ac30,0x8af1c9ce,0x8469aa71,0x1492af6a,0x17e946dd}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x390a771d,0x5849d618,0xc578e4e7,0x4234d538,0x8a4957b5,0xbf4a36e}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xdf5ff292,0x38b4f5d0,0xaca5b3b4,0x5c40a340,0xc31ffe7f,0x2da9507a,0x1e9adc1b,0x94049af0,0x21d78b76,0x99443160,0xe5dfba5a,0x11ddfa6}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6faff949,0x1c5a7ae8,0x5652d9da,0xae2051a0,0x618fff3f,0x96d4a83d,0xf4d6e0d,0x4a024d78,0x10ebc5bb,0x4ca218b0,0x72efdd2d,0x8eefd3}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x402d1c90,0xd2ba1529,0xe4e7ab53,0xf8930a27,0x95a7f471,0x3054a3f}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x390a771d,0x5849d618,0xc578e4e7,0x4234d538,0x8a4957b5,0xbf4a36e}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7214ee3a,0xb093ac30,0x8af1c9ce,0x8469aa71,0x1492af6a,0x17e946dd}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x805a3920,0xa5742a52,0xc9cf56a7,0xf126144f,0x2b4fe8e3,0x60a947f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x7}, {{{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x5a296ce0,0x75fbcaf5,0x847e4497,0xe2d9ed64,0x72c327c3,0x2a98d228}}}, {{{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x5a296ce0,0x75fbcaf5,0x847e4497,0xe2d9ed64,0x72c327c3,0x2a98d228}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xad14b670,0xbafde57a,0x423f224b,0xf16cf6b2,0x396193e1,0x154c6914}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xad14b670,0xbafde57a,0x423f224b,0xf16cf6b2,0x396193e1,0x154c6914}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xc706e200,0xa90e8600,0x36d31c37,0x17b79648,0x6528c8e4,0x3031662b,0x7e150a41,0x55865e0e,0xb08668d5,0xde5c8b21,0xc11b59bb,0x38b4017}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x63837100,0xd4874300,0x1b698e1b,0xbdbcb24,0xb2946472,0x9818b315,0x3f0a8520,0xaac32f07,0xd843346a,0xef2e4590,0xe08dacdd,0x1c5a00b}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x415eaf81,0xc8f41985,0xadd53cdb,0x4aa8fc00,0xc67350e4,0xf0f5b005,0x7e150a40,0x55865e0e,0xb08668d5,0xde5c8b21,0xc11b59bb,0x38b4017}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xad14b670,0xbafde57a,0x423f224b,0xf16cf6b2,0x396193e1,0x154c6914}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x5a296ce0,0x75fbcaf5,0x847e4497,0xe2d9ed64,0x72c327c3,0x2a98d228}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xb5064fe,0xc034d8f7,0x11fbbeb7,0x9a1d348f,0x3d6aefff,0x7e776c4b}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xb}, {{{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xfae44de0,0x7fd96267,0x23507eca,0x1927494b,0x9621ce89,0x8bbaf08}}}, {{{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xfae44de0,0x7fd96267,0x23507eca,0x1927494b,0x9621ce89,0x8bbaf08}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xfd7226f0,0x3fecb133,0x91a83f65,0x8c93a4a5,0x4b10e744,0x45dd784}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x27584200,0x757c6efa,0xdefe8411,0x4fe6d643,0x49f793ab,0xa66f2818,0x715d6ca1,0x20b8530f,0x4f0bb136,0x203297b7,0xdbcd17ec,0x262244}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x2d019c01,0x64465ee8,0xbf96c360,0xf85c0f68,0xa0246232,0xa6379706,0x715d6ca1,0x20b8530f,0x4f0bb136,0x203297b7,0xdbcd17ec,0x262244}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xfd7226f0,0x3fecb133,0x91a83f65,0x8c93a4a5,0x4b10e744,0x45dd784}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xfae44de0,0x7fd96267,0x23507eca,0x1927494b,0x9621ce89,0x8bbaf08}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0xfa56a5ff,0x11361011,0x1f67c0b1,0x578ac6db,0xa9d33178,0x379111}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xd}, {{{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9c503a40,0xbfd98440,0x1f7d7e0,0xcaca8a32,0x26150b3b,0xa143d3f}}}, {{{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9c503a40,0xbfd98440,0x1f7d7e0,0xcaca8a32,0x26150b3b,0xa143d3f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x4e281d20,0x5fecc220,0xfbebf0,0xe5654519,0x930a859d,0x50a1e9f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x3aa08800,0xc2108011,0x8c6c6c37,0xecce2407,0xd5f61310,0x4e72d7b4,0xb8d1d10e,0x32d13e55,0x37028e65,0x1c47e4ca,0x47bf5ff2,0x32cb31}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1c890801,0x742c9f98,0xb098299c,0xb28b59ca,0x704ef560,0x1b1eff55}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x4e281d20,0x5fecc220,0xfbebf0,0xe5654519,0x930a859d,0x50a1e9f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9c503a40,0xbfd98440,0x1f7d7e0,0xcaca8a32,0x26150b3b,0xa143d3f}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1c890801,0x742c9f98,0xb098299c,0xb28b59ca,0x704ef560,0x1b1eff55}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x11}, {{{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x2d1f45b6,0xdecc4788,0xf40642f4,0xbe127975,0x7d46b753,0xd27815d0,0x6}}}, {{{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x2d1f45b6,0xdecc4788,0xf40642f4,0xbe127975,0x7d46b753,0xd27815d0,0x6}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x168fa2db,0x6f6623c4,0xfa03217a,0xdf093cba,0x3ea35ba9,0x693c0ae8,0x3}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xf887ceb2,0x9f483d9,0x4daed993,0x40558051,0x62d2a807,0x67764d70,0xbd484f8b,0xacb25ec2,0xa2efdd61,0xcac0fcf9,0x3114f6ab,0x455520f2,0x17}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xfc43e759,0x84fa41ec,0xa6d76cc9,0xa02ac028,0x31695403,0xb3bb26b8,0x5ea427c5,0xd6592f61,0xd177eeb0,0xe5607e7c,0x188a7b55,0xa2aa9079,0xb}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xf2e65870,0x8186e47b,0x260e85ec,0xb9e8fec1,0xb89b6d00,0xf41458ba,0x73b02294,0x56374a97,0x94c1551f,0xd296b0c5,0xa6091d55,0x1e250331,0xa}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x168fa2db,0x6f6623c4,0xfa03217a,0xdf093cba,0x3ea35ba9,0x693c0ae8,0x3}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x2d1f45b6,0xdecc4788,0xf40642f4,0xbe127975,0x7d46b753,0xd27815d0,0x6}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -7, ._mp_d = (mp_limb_t[]) {0xc53841c8,0x80dd3ec1,0x3b0ceefd,0x9ed03fa5,0x8c878a6f,0x39961b3a,0x20}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2e}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x17}}; -#elif 8*DIGIT_LEN == 64 -const quat_alg_t QUATALG_PINFTY = {{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0x4c6174c1ffffffff,0xc722f669356ea468,0x65bc2e0a90aeb751,0xc6ae604a45d10ad6,0x3df6eeeab0871a2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0x4c6174c1ffffffff,0xc722f669356ea468,0x65bc2e0a90aeb751,0xc6ae604a45d10ad6,0x3df6eeeab0871a2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0x4c6174c1ffffffff,0xc722f669356ea468,0x65bc2e0a90aeb751,0xc6ae604a45d10ad6,0x3df6eeeab0871a2}}}}}}; -const quat_order_t MAXORD_O0 = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}; -const quat_p_extremal_maximal_order_t STANDARD_EXTREMAL_ORDER = {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1}; -const quat_p_extremal_maximal_order_t ALTERNATE_EXTREMAL_ORDERS[7] = {{{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x2590707e99c6d07e,0xf28915cb16a9e6e5,0x2890293703497b19}}}, {{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x2590707e99c6d07e,0xf28915cb16a9e6e5,0x2890293703497b19}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x92c8383f4ce3683f,0xf9448ae58b54f372,0x1448149b81a4bd8c}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x56215dd2e45a7f02,0xf6022c7e517f7342,0x10d9521b0307361e,0xdb2be540c8a345c7,0x4603d9ec138f3e19,0x336af07cac6aa01}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x2b10aee9722d3f81,0x7b01163f28bfb9a1,0x886ca90d81839b0f,0xed95f2a06451a2e3,0xa301ecf609c79f0c,0x19b5783e5635500}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x5e1238847e34095e,0xbcb1266ba920ef66,0xf934ba2badf75cb}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x92c8383f4ce3683f,0xf9448ae58b54f372,0x1448149b81a4bd8c}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x2590707e99c6d07e,0xf28915cb16a9e6e5,0x2890293703497b19}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0xbc247108fc6812bc,0x79624cd75241decc,0x1f26974575beeb97}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x3}, {{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xe5c509d2fecc0f18,0x9a05a0291c34cbb8,0x547246744c223cc5}}}, {{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xe5c509d2fecc0f18,0x9a05a0291c34cbb8,0x547246744c223cc5}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x72e284e97f66078c,0xcd02d0148e1a65dc,0x2a39233a26111e62}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xc43101fdd791e920,0xf1d5eb4270fdbfb0,0x40ad63f049904a4,0x9b6487b92e8cb3d6,0xcdfc2d0ae7166f5a,0xded989f92770a6b}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1b203b1fbea1d9e1,0x1b1d7b3a4320ec88,0x1ff707050ce2ed2e,0xd7c1cfe3ac3847ef,0x859812045c6f5fbd,0x5923d0ca0fc6a91}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x72e284e97f66078c,0xcd02d0148e1a65dc,0x2a39233a26111e62}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xe5c509d2fecc0f18,0x9a05a0291c34cbb8,0x547246744c223cc5}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0xc0dc5cf5fa90db,0x5c186e619256e0b9,0x68428964c8c36763}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x5}, {{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xb093ac307214ee3a,0x8469aa718af1c9ce,0x17e946dd1492af6a}}}, {{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xb093ac307214ee3a,0x8469aa718af1c9ce,0x17e946dd1492af6a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x5849d618390a771d,0x4234d538c578e4e7,0xbf4a36e8a4957b5}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x38b4f5d0df5ff292,0x5c40a340aca5b3b4,0x2da9507ac31ffe7f,0x94049af01e9adc1b,0x9944316021d78b76,0x11ddfa6e5dfba5a}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1c5a7ae86faff949,0xae2051a05652d9da,0x96d4a83d618fff3f,0x4a024d780f4d6e0d,0x4ca218b010ebc5bb,0x8eefd372efdd2d}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xd2ba1529402d1c90,0xf8930a27e4e7ab53,0x3054a3f95a7f471}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x5849d618390a771d,0x4234d538c578e4e7,0xbf4a36e8a4957b5}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xb093ac307214ee3a,0x8469aa718af1c9ce,0x17e946dd1492af6a}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xa5742a52805a3920,0xf126144fc9cf56a7,0x60a947f2b4fe8e3}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x7}, {{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x75fbcaf55a296ce0,0xe2d9ed64847e4497,0x2a98d22872c327c3}}}, {{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x75fbcaf55a296ce0,0xe2d9ed64847e4497,0x2a98d22872c327c3}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xbafde57aad14b670,0xf16cf6b2423f224b,0x154c6914396193e1}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xbafde57aad14b670,0xf16cf6b2423f224b,0x154c6914396193e1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xa90e8600c706e200,0x17b7964836d31c37,0x3031662b6528c8e4,0x55865e0e7e150a41,0xde5c8b21b08668d5,0x38b4017c11b59bb}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xd487430063837100,0xbdbcb241b698e1b,0x9818b315b2946472,0xaac32f073f0a8520,0xef2e4590d843346a,0x1c5a00be08dacdd}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xc8f41985415eaf81,0x4aa8fc00add53cdb,0xf0f5b005c67350e4,0x55865e0e7e150a40,0xde5c8b21b08668d5,0x38b4017c11b59bb}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xbafde57aad14b670,0xf16cf6b2423f224b,0x154c6914396193e1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x75fbcaf55a296ce0,0xe2d9ed64847e4497,0x2a98d22872c327c3}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xc034d8f70b5064fe,0x9a1d348f11fbbeb7,0x7e776c4b3d6aefff}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xb}, {{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x7fd96267fae44de0,0x1927494b23507eca,0x8bbaf089621ce89}}}, {{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x7fd96267fae44de0,0x1927494b23507eca,0x8bbaf089621ce89}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x3fecb133fd7226f0,0x8c93a4a591a83f65,0x45dd7844b10e744}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x757c6efa27584200,0x4fe6d643defe8411,0xa66f281849f793ab,0x20b8530f715d6ca1,0x203297b74f0bb136,0x262244dbcd17ec}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x64465ee82d019c01,0xf85c0f68bf96c360,0xa6379706a0246232,0x20b8530f715d6ca1,0x203297b74f0bb136,0x262244dbcd17ec}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x3fecb133fd7226f0,0x8c93a4a591a83f65,0x45dd7844b10e744}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x7fd96267fae44de0,0x1927494b23507eca,0x8bbaf089621ce89}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0x11361011fa56a5ff,0x578ac6db1f67c0b1,0x379111a9d33178}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xd}, {{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xbfd984409c503a40,0xcaca8a3201f7d7e0,0xa143d3f26150b3b}}}, {{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xbfd984409c503a40,0xcaca8a3201f7d7e0,0xa143d3f26150b3b}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x5fecc2204e281d20,0xe565451900fbebf0,0x50a1e9f930a859d}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xc21080113aa08800,0xecce24078c6c6c37,0x4e72d7b4d5f61310,0x32d13e55b8d1d10e,0x1c47e4ca37028e65,0x32cb3147bf5ff2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x742c9f981c890801,0xb28b59cab098299c,0x1b1eff55704ef560}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x5fecc2204e281d20,0xe565451900fbebf0,0x50a1e9f930a859d}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xbfd984409c503a40,0xcaca8a3201f7d7e0,0xa143d3f26150b3b}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x742c9f981c890801,0xb28b59cab098299c,0x1b1eff55704ef560}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x11}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xdecc47882d1f45b6,0xbe127975f40642f4,0xd27815d07d46b753,0x6}}}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xdecc47882d1f45b6,0xbe127975f40642f4,0xd27815d07d46b753,0x6}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6f6623c4168fa2db,0xdf093cbafa03217a,0x693c0ae83ea35ba9,0x3}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x9f483d9f887ceb2,0x405580514daed993,0x67764d7062d2a807,0xacb25ec2bd484f8b,0xcac0fcf9a2efdd61,0x455520f23114f6ab,0x17}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x84fa41ecfc43e759,0xa02ac028a6d76cc9,0xb3bb26b831695403,0xd6592f615ea427c5,0xe5607e7cd177eeb0,0xa2aa9079188a7b55,0xb}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x8186e47bf2e65870,0xb9e8fec1260e85ec,0xf41458bab89b6d00,0x56374a9773b02294,0xd296b0c594c1551f,0x1e250331a6091d55,0xa}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6f6623c4168fa2db,0xdf093cbafa03217a,0x693c0ae83ea35ba9,0x3}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xdecc47882d1f45b6,0xbe127975f40642f4,0xd27815d07d46b753,0x6}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x80dd3ec1c53841c8,0x9ed03fa53b0ceefd,0x39961b3a8c878a6f,0x20}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2e}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x17}}; +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x171,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8000}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x171,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x171,0x0,0x0,0x0,0x0,0x8000000000000000}}} #endif +; +const quat_alg_t QUATALG_PINFTY = { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x40ff}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x40ffffff}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0xffffffffffffffff,0xffffffffffffffff,0xffffffffffffffff,0xffffffffffffffff,0x40ffffffffffffff}}} +#endif +}; +const quat_p_extremal_maximal_order_t EXTREMAL_ORDERS[8] = {{{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 1}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xafcc,0xe7ed,0x58f3,0x3e59,0x9763,0x88d6,0xf2c5,0x4a6d,0x3afe,0xf44b,0x7d27,0x3c31}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xe7edafcc,0x3e5958f3,0x88d69763,0x4a6df2c5,0xf44b3afe,0x3c317d27}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x3e5958f3e7edafcc,0x4a6df2c588d69763,0x3c317d27f44b3afe}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xafcc,0xe7ed,0x58f3,0x3e59,0x9763,0x88d6,0xf2c5,0x4a6d,0x3afe,0xf44b,0x7d27,0x3c31}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xe7edafcc,0x3e5958f3,0x88d69763,0x4a6df2c5,0xf44b3afe,0x3c317d27}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x3e5958f3e7edafcc,0x4a6df2c588d69763,0x3c317d27f44b3afe}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xd7e6,0xf3f6,0xac79,0x9f2c,0x4bb1,0xc46b,0xf962,0x2536,0x9d7f,0xfa25,0xbe93,0x1e18}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xf3f6d7e6,0x9f2cac79,0xc46b4bb1,0x2536f962,0xfa259d7f,0x1e18be93}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x9f2cac79f3f6d7e6,0x2536f962c46b4bb1,0x1e18be93fa259d7f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x2fb7,0xea91,0xa3ea,0x2a21,0x9cd1,0x26b3,0xde73,0xa2d3,0xcecc,0x20a1,0xc963,0x266b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xea912fb7,0x2a21a3ea,0x26b39cd1,0xa2d3de73,0x20a1cecc,0x266bc963}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x2a21a3eaea912fb7,0xa2d3de7326b39cd1,0x266bc96320a1cecc}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1e5f,0x4aa8,0x9064,0x8436,0x8fae,0x50ab,0x2fd8,0xdd15,0x617a,0x8343,0x9423,0x3d7,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x680}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x4aa81e5f,0x84369064,0x50ab8fae,0xdd152fd8,0x8343617a,0x3d79423,0x0,0x0,0x0,0x0,0x0,0x6800000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x843690644aa81e5f,0xdd152fd850ab8fae,0x3d794238343617a,0x0,0x0,0x680000000000000}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xd7e6,0xf3f6,0xac79,0x9f2c,0x4bb1,0xc46b,0xf962,0x2536,0x9d7f,0xfa25,0xbe93,0x1e18}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xf3f6d7e6,0x9f2cac79,0xc46b4bb1,0x2536f962,0xfa259d7f,0x1e18be93}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x9f2cac79f3f6d7e6,0x2536f962c46b4bb1,0x1e18be93fa259d7f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0x1e5f,0x4aa8,0x9064,0x8436,0x8fae,0x50ab,0x2fd8,0xdd15,0x617a,0x8343,0x9423,0x3d7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0x4aa81e5f,0x84369064,0x50ab8fae,0xdd152fd8,0x8343617a,0x3d79423}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0x843690644aa81e5f,0xdd152fd850ab8fae,0x3d794238343617a}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xafcc,0xe7ed,0x58f3,0x3e59,0x9763,0x88d6,0xf2c5,0x4a6d,0x3afe,0xf44b,0x7d27,0x3c31}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xe7edafcc,0x3e5958f3,0x88d69763,0x4a6df2c5,0xf44b3afe,0x3c317d27}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x3e5958f3e7edafcc,0x4a6df2c588d69763,0x3c317d27f44b3afe}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x2fb7,0xea91,0xa3ea,0x2a21,0x9cd1,0x26b3,0xde73,0xa2d3,0xcecc,0x20a1,0xc963,0x266b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xea912fb7,0x2a21a3ea,0x26b39cd1,0xa2d3de73,0x20a1cecc,0x266bc963}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x2a21a3eaea912fb7,0xa2d3de7326b39cd1,0x266bc96320a1cecc}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 5}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xc40,0xb21f,0x5bc7,0x8dca,0xc2a2,0xca0a,0xc8b1,0xbddd,0xcb7d,0xc9d5,0xa9d,0x3cc0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xb21f0c40,0x8dca5bc7,0xca0ac2a2,0xbdddc8b1,0xc9d5cb7d,0x3cc00a9d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x8dca5bc7b21f0c40,0xbdddc8b1ca0ac2a2,0x3cc00a9dc9d5cb7d}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xc40,0xb21f,0x5bc7,0x8dca,0xc2a2,0xca0a,0xc8b1,0xbddd,0xcb7d,0xc9d5,0xa9d,0x3cc0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xb21f0c40,0x8dca5bc7,0xca0ac2a2,0xbdddc8b1,0xc9d5cb7d,0x3cc00a9d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x8dca5bc7b21f0c40,0xbdddc8b1ca0ac2a2,0x3cc00a9dc9d5cb7d}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x8620,0xd90f,0x2de3,0x46e5,0x6151,0xe505,0xe458,0xdeee,0xe5be,0xe4ea,0x54e,0x1e60}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xd90f8620,0x46e52de3,0xe5056151,0xdeeee458,0xe4eae5be,0x1e60054e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x46e52de3d90f8620,0xdeeee458e5056151,0x1e60054ee4eae5be}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6801,0x9f6f,0x4e1e,0xbd0b,0x5c5e,0xaa12,0xb4c6,0x3849,0xd6c7,0x2d76,0x3227,0xb106}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9f6f6801,0xbd0b4e1e,0xaa125c5e,0x3849b4c6,0x2d76d6c7,0xb1063227}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xbd0b4e1e9f6f6801,0x3849b4c6aa125c5e,0xb10632272d76d6c7}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x8400,0x4135,0x343c,0xa4cf,0x6603,0xa414,0xc207,0x5ac7,0x921b,0xd084,0x1ed,0x6cf,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x280}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x41358400,0xa4cf343c,0xa4146603,0x5ac7c207,0xd084921b,0x6cf01ed,0x0,0x0,0x0,0x0,0x0,0x2800000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xa4cf343c41358400,0x5ac7c207a4146603,0x6cf01edd084921b,0x0,0x0,0x280000000000000}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x8620,0xd90f,0x2de3,0x46e5,0x6151,0xe505,0xe458,0xdeee,0xe5be,0xe4ea,0x54e,0x1e60}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xd90f8620,0x46e52de3,0xe5056151,0xdeeee458,0xe4eae5be,0x1e60054e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x46e52de3d90f8620,0xdeeee458e5056151,0x1e60054ee4eae5be}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0x8400,0x4135,0x343c,0xa4cf,0x6603,0xa414,0xc207,0x5ac7,0x921b,0xd084,0x1ed,0x6cf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0x41358400,0xa4cf343c,0xa4146603,0x5ac7c207,0xd084921b,0x6cf01ed}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0xa4cf343c41358400,0x5ac7c207a4146603,0x6cf01edd084921b}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xc40,0xb21f,0x5bc7,0x8dca,0xc2a2,0xca0a,0xc8b1,0xbddd,0xcb7d,0xc9d5,0xa9d,0x3cc0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xb21f0c40,0x8dca5bc7,0xca0ac2a2,0xbdddc8b1,0xc9d5cb7d,0x3cc00a9d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x8dca5bc7b21f0c40,0xbdddc8b1ca0ac2a2,0x3cc00a9dc9d5cb7d}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6801,0x9f6f,0x4e1e,0xbd0b,0x5c5e,0xaa12,0xb4c6,0x3849,0xd6c7,0x2d76,0x3227,0xb106}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9f6f6801,0xbd0b4e1e,0xaa125c5e,0x3849b4c6,0x2d76d6c7,0xb1063227}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xbd0b4e1e9f6f6801,0x3849b4c6aa125c5e,0xb10632272d76d6c7}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 13}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x5b40,0x7328,0xdb38,0x5357,0x465b,0x31d8,0x1f3,0x85cf,0x32b9,0xd8dc,0x6f6d,0x3dab,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x73285b40,0x5357db38,0x31d8465b,0x85cf01f3,0xd8dc32b9,0x3dab6f6d,0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x5357db3873285b40,0x85cf01f331d8465b,0x3dab6f6dd8dc32b9,0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x5b40,0x7328,0xdb38,0x5357,0x465b,0x31d8,0x1f3,0x85cf,0x32b9,0xd8dc,0x6f6d,0x3dab,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x73285b40,0x5357db38,0x31d8465b,0x85cf01f3,0xd8dc32b9,0x3dab6f6d,0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x5357db3873285b40,0x85cf01f331d8465b,0x3dab6f6dd8dc32b9,0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x2da0,0x3994,0xed9c,0xa9ab,0x232d,0x98ec,0x80f9,0xc2e7,0x195c,0xec6e,0xb7b6,0x1ed5,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x39942da0,0xa9abed9c,0x98ec232d,0xc2e780f9,0xec6e195c,0x1ed5b7b6,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa9abed9c39942da0,0xc2e780f998ec232d,0x1ed5b7b6ec6e195c,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -13, ._mp_d = (mp_limb_t[]) {0xb7ef,0x4ddc,0x58cc,0xe284,0xc4a7,0xb9ed,0xdca9,0xc383,0xc3dd,0x5a13,0xd2bc,0x7663,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -7, ._mp_d = (mp_limb_t[]) {0x4ddcb7ef,0xe28458cc,0xb9edc4a7,0xc383dca9,0x5a13c3dd,0x7663d2bc,0x3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xe28458cc4ddcb7ef,0xc383dca9b9edc4a7,0x7663d2bc5a13c3dd,0x3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xdc07,0x925a,0x605a,0x9489,0x475b,0x7944,0x880f,0x65fa,0xed5a,0x329c,0x13f8,0x78f2,0xfffe,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x207f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x925adc07,0x9489605a,0x7944475b,0x65fa880f,0x329ced5a,0x78f213f8,0xfffffffe,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x207fffff}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9489605a925adc07,0x65fa880f7944475b,0x78f213f8329ced5a,0xfffffffffffffffe,0xffffffffffffffff,0x207fffffffffffff}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x2da0,0x3994,0xed9c,0xa9ab,0x232d,0x98ec,0x80f9,0xc2e7,0x195c,0xec6e,0xb7b6,0x1ed5,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x39942da0,0xa9abed9c,0x98ec232d,0xc2e780f9,0xec6e195c,0x1ed5b7b6,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa9abed9c39942da0,0xc2e780f998ec232d,0x1ed5b7b6ec6e195c,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9c07,0x5ca4,0xc660,0xc2e5,0x94d7,0x2b1d,0x3b32,0xa3de,0x67a4,0x2fd3,0xfeab,0x1a11}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x5ca49c07,0xc2e5c660,0x2b1d94d7,0xa3de3b32,0x2fd367a4,0x1a11feab}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xc2e5c6605ca49c07,0xa3de3b322b1d94d7,0x1a11feab2fd367a4}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x5b40,0x7328,0xdb38,0x5357,0x465b,0x31d8,0x1f3,0x85cf,0x32b9,0xd8dc,0x6f6d,0x3dab,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x73285b40,0x5357db38,0x31d8465b,0x85cf01f3,0xd8dc32b9,0x3dab6f6d,0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x5357db3873285b40,0x85cf01f331d8465b,0x3dab6f6dd8dc32b9,0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -13, ._mp_d = (mp_limb_t[]) {0xb7ef,0x4ddc,0x58cc,0xe284,0xc4a7,0xb9ed,0xdca9,0xc383,0xc3dd,0x5a13,0xd2bc,0x7663,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -7, ._mp_d = (mp_limb_t[]) {0x4ddcb7ef,0xe28458cc,0xb9edc4a7,0xc383dca9,0x5a13c3dd,0x7663d2bc,0x3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xe28458cc4ddcb7ef,0xc383dca9b9edc4a7,0x7663d2bc5a13c3dd,0x3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 17}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xdfda,0xabc3,0xd4b8,0x7c1c,0x4727,0x66b2,0x21da,0x79cc,0xe3a3,0x553d,0x9b8d,0xa12d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xabc3dfda,0x7c1cd4b8,0x66b24727,0x79cc21da,0x553de3a3,0xa12d9b8d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x7c1cd4b8abc3dfda,0x79cc21da66b24727,0xa12d9b8d553de3a3}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xdfda,0xabc3,0xd4b8,0x7c1c,0x4727,0x66b2,0x21da,0x79cc,0xe3a3,0x553d,0x9b8d,0xa12d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xabc3dfda,0x7c1cd4b8,0x66b24727,0x79cc21da,0x553de3a3,0xa12d9b8d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x7c1cd4b8abc3dfda,0x79cc21da66b24727,0xa12d9b8d553de3a3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xefed,0x55e1,0x6a5c,0xbe0e,0x2393,0x3359,0x10ed,0xbce6,0xf1d1,0xaa9e,0xcdc6,0x5096}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x55e1efed,0xbe0e6a5c,0x33592393,0xbce610ed,0xaa9ef1d1,0x5096cdc6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xbe0e6a5c55e1efed,0xbce610ed33592393,0x5096cdc6aa9ef1d1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0xe8e2,0xea6f,0x72f1,0x2e52,0x152a,0xc137,0x5fe4,0xfd0e,0x9736,0x7a1,0xfa3d,0xc6b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0xea6fe8e2,0x2e5272f1,0xc137152a,0xfd0e5fe4,0x7a19736,0xc6bfa3d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0x2e5272f1ea6fe8e2,0xfd0e5fe4c137152a,0xc6bfa3d07a19736}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x9a15,0x48a0,0x16ae,0xa42,0x3772,0x534a,0x26a7,0x2f5e,0xce7c,0x39eb,0xa365,0x745c,0x6a25,0xa257,0x2576,0x576a,0x76a2,0x6a25,0xa257,0x2576,0x576a,0x76a2,0x6a25,0x657}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x48a09a15,0xa4216ae,0x534a3772,0x2f5e26a7,0x39ebce7c,0x745ca365,0xa2576a25,0x576a2576,0x6a2576a2,0x2576a257,0x76a2576a,0x6576a25}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xa4216ae48a09a15,0x2f5e26a7534a3772,0x745ca36539ebce7c,0x576a2576a2576a25,0x2576a2576a2576a2,0x6576a2576a2576a}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xefed,0x55e1,0x6a5c,0xbe0e,0x2393,0x3359,0x10ed,0xbce6,0xf1d1,0xaa9e,0xcdc6,0x5096}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x55e1efed,0xbe0e6a5c,0x33592393,0xbce610ed,0xaa9ef1d1,0x5096cdc6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xbe0e6a5c55e1efed,0xbce610ed33592393,0x5096cdc6aa9ef1d1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x50e5,0x2533,0xb03b,0x2c45,0xfde,0xaaf1,0xafff,0x8c73,0xebfd,0xfb3,0xc7bc,0x26}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x253350e5,0x2c45b03b,0xaaf10fde,0x8c73afff,0xfb3ebfd,0x26c7bc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x2c45b03b253350e5,0x8c73afffaaf10fde,0x26c7bc0fb3ebfd}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xdfda,0xabc3,0xd4b8,0x7c1c,0x4727,0x66b2,0x21da,0x79cc,0xe3a3,0x553d,0x9b8d,0xa12d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xabc3dfda,0x7c1cd4b8,0x66b24727,0x79cc21da,0x553de3a3,0xa12d9b8d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x7c1cd4b8abc3dfda,0x79cc21da66b24727,0xa12d9b8d553de3a3}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0xe8e2,0xea6f,0x72f1,0x2e52,0x152a,0xc137,0x5fe4,0xfd0e,0x9736,0x7a1,0xfa3d,0xc6b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0xea6fe8e2,0x2e5272f1,0xc137152a,0xfd0e5fe4,0x7a19736,0xc6bfa3d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0x2e5272f1ea6fe8e2,0xfd0e5fe4c137152a,0xc6bfa3d07a19736}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x8}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 41}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xb000,0x6067,0x56e7,0x950c,0xb3d,0x28e6,0x1bfb,0xb990,0xeb8,0x7184,0x2273,0x29aa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x6067b000,0x950c56e7,0x28e60b3d,0xb9901bfb,0x71840eb8,0x29aa2273}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x950c56e76067b000,0xb9901bfb28e60b3d,0x29aa227371840eb8}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xb000,0x6067,0x56e7,0x950c,0xb3d,0x28e6,0x1bfb,0xb990,0xeb8,0x7184,0x2273,0x29aa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x6067b000,0x950c56e7,0x28e60b3d,0xb9901bfb,0x71840eb8,0x29aa2273}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x950c56e76067b000,0xb9901bfb28e60b3d,0x29aa227371840eb8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xd800,0xb033,0x2b73,0xca86,0x59e,0x9473,0xdfd,0x5cc8,0x75c,0xb8c2,0x1139,0x14d5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xb033d800,0xca862b73,0x9473059e,0x5cc80dfd,0xb8c2075c,0x14d51139}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xca862b73b033d800,0x5cc80dfd9473059e,0x14d51139b8c2075c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xffff,0xef7f,0x6120,0xdec9,0x3d80,0xfcb4,0xe8d7,0x2d72,0x4077,0xeecc,0xcd2a,0x4bc9,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xef7fffff,0xdec96120,0xfcb43d80,0x2d72e8d7,0xeecc4077,0x4bc9cd2a,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xdec96120ef7fffff,0x2d72e8d7fcb43d80,0x4bc9cd2aeecc4077,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -24, ._mp_d = (mp_limb_t[]) {0x73ba,0x1227,0x9519,0xedfb,0x605b,0xe80,0x1a20,0xf0b2,0xb418,0xa90c,0xb325,0xefd6,0x7e3e,0xf8fc,0xe3f1,0x8fc7,0x3f1f,0xfc7e,0xf1f8,0xc7e3,0x1f8f,0x7e3f,0xf8fc,0x71}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0x122773ba,0xedfb9519,0xe80605b,0xf0b21a20,0xa90cb418,0xefd6b325,0xf8fc7e3e,0x8fc7e3f1,0xfc7e3f1f,0xc7e3f1f8,0x7e3f1f8f,0x71f8fc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0xedfb9519122773ba,0xf0b21a200e80605b,0xefd6b325a90cb418,0x8fc7e3f1f8fc7e3e,0xc7e3f1f8fc7e3f1f,0x71f8fc7e3f1f8f}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xd800,0xb033,0x2b73,0xca86,0x59e,0x9473,0xdfd,0x5cc8,0x75c,0xb8c2,0x1139,0x14d5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xb033d800,0xca862b73,0x9473059e,0x5cc80dfd,0xb8c2075c,0x14d51139}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xca862b73b033d800,0x5cc80dfd9473059e,0x14d51139b8c2075c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0x73ba,0x8a7,0x681e,0x130f,0xeee3,0xd966,0x4ebe,0xf78b,0xba4d,0xfa9,0xc409,0x245}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0x8a773ba,0x130f681e,0xd966eee3,0xf78b4ebe,0xfa9ba4d,0x245c409}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0x130f681e08a773ba,0xf78b4ebed966eee3,0x245c4090fa9ba4d}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xb000,0x6067,0x56e7,0x950c,0xb3d,0x28e6,0x1bfb,0xb990,0xeb8,0x7184,0x2273,0x29aa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x6067b000,0x950c56e7,0x28e60b3d,0xb9901bfb,0x71840eb8,0x29aa2273}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x950c56e76067b000,0xb9901bfb28e60b3d,0x29aa227371840eb8}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xffff,0xef7f,0x6120,0xdec9,0x3d80,0xfcb4,0xe8d7,0x2d72,0x4077,0xeecc,0xcd2a,0x4bc9,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xef7fffff,0xdec96120,0xfcb43d80,0x2d72e8d7,0xeecc4077,0x4bc9cd2a,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xdec96120ef7fffff,0x2d72e8d7fcb43d80,0x4bc9cd2aeecc4077,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 73}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7b26,0x37a0,0xc8dc,0x97d3,0x7f2f,0xd6bd,0x931,0x1df2,0x2918,0x4a3e,0x2591,0x6ee7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x37a07b26,0x97d3c8dc,0xd6bd7f2f,0x1df20931,0x4a3e2918,0x6ee72591}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x97d3c8dc37a07b26,0x1df20931d6bd7f2f,0x6ee725914a3e2918}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7b26,0x37a0,0xc8dc,0x97d3,0x7f2f,0xd6bd,0x931,0x1df2,0x2918,0x4a3e,0x2591,0x6ee7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x37a07b26,0x97d3c8dc,0xd6bd7f2f,0x1df20931,0x4a3e2918,0x6ee72591}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x97d3c8dc37a07b26,0x1df20931d6bd7f2f,0x6ee725914a3e2918}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x3d93,0x1bd0,0xe46e,0xcbe9,0xbf97,0xeb5e,0x498,0xef9,0x148c,0xa51f,0x92c8,0x3773}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1bd03d93,0xcbe9e46e,0xeb5ebf97,0xef90498,0xa51f148c,0x377392c8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xcbe9e46e1bd03d93,0xef90498eb5ebf97,0x377392c8a51f148c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x4fae,0x9faa,0x2b8a,0x6a69,0x436c,0x633a,0x7892,0x301c,0xec62,0xcb54,0xe41,0xac50}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9faa4fae,0x6a692b8a,0x633a436c,0x301c7892,0xcb54ec62,0xac500e41}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x6a692b8a9faa4fae,0x301c7892633a436c,0xac500e41cb54ec62}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -24, ._mp_d = (mp_limb_t[]) {0x30b3,0xeb66,0x87b7,0x617e,0x27c,0xfa7,0xdcf4,0x90c8,0x7e8b,0x9e3c,0xaf36,0xb7ba,0x5eeb,0xbaf7,0xbdd7,0x75ee,0x7baf,0xebdd,0xf75e,0xd7ba,0xeebd,0xaf75,0xdd7b,0x2eb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0xeb6630b3,0x617e87b7,0xfa7027c,0x90c8dcf4,0x9e3c7e8b,0xb7baaf36,0xbaf75eeb,0x75eebdd7,0xebdd7baf,0xd7baf75e,0xaf75eebd,0x2ebdd7b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0x617e87b7eb6630b3,0x90c8dcf40fa7027c,0xb7baaf369e3c7e8b,0x75eebdd7baf75eeb,0xd7baf75eebdd7baf,0x2ebdd7baf75eebd}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x3d93,0x1bd0,0xe46e,0xcbe9,0xbf97,0xeb5e,0x498,0xef9,0x148c,0xa51f,0x92c8,0x3773}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1bd03d93,0xcbe9e46e,0xeb5ebf97,0xef90498,0xa51f148c,0x377392c8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xcbe9e46e1bd03d93,0xef90498eb5ebf97,0x377392c8a51f148c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0xb5ab,0x986,0x1b92,0x5123,0x4b2a,0x653b,0x4896,0xc0fd,0x579e,0xc06c,0xd20e,0xf7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0x986b5ab,0x51231b92,0x653b4b2a,0xc0fd4896,0xc06c579e,0xf7d20e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0x51231b920986b5ab,0xc0fd4896653b4b2a,0xf7d20ec06c579e}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7b26,0x37a0,0xc8dc,0x97d3,0x7f2f,0xd6bd,0x931,0x1df2,0x2918,0x4a3e,0x2591,0x6ee7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x37a07b26,0x97d3c8dc,0xd6bd7f2f,0x1df20931,0x4a3e2918,0x6ee72591}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x97d3c8dc37a07b26,0x1df20931d6bd7f2f,0x6ee725914a3e2918}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x4fae,0x9faa,0x2b8a,0x6a69,0x436c,0x633a,0x7892,0x301c,0xec62,0xcb54,0xe41,0xac50}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9faa4fae,0x6a692b8a,0x633a436c,0x301c7892,0xcb54ec62,0xac500e41}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x6a692b8a9faa4fae,0x301c7892633a436c,0xac500e41cb54ec62}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 89}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xa194,0x6df0,0x4b4c,0xf874,0xb43e,0x362a,0x11bb,0x84f2,0xc623,0x61a2,0x7d42,0xe501,0x30}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x6df0a194,0xf8744b4c,0x362ab43e,0x84f211bb,0x61a2c623,0xe5017d42,0x30}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xf8744b4c6df0a194,0x84f211bb362ab43e,0xe5017d4261a2c623,0x30}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xa194,0x6df0,0x4b4c,0xf874,0xb43e,0x362a,0x11bb,0x84f2,0xc623,0x61a2,0x7d42,0xe501,0x30}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x6df0a194,0xf8744b4c,0x362ab43e,0x84f211bb,0x61a2c623,0xe5017d42,0x30}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xf8744b4c6df0a194,0x84f211bb362ab43e,0xe5017d4261a2c623,0x30}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x50ca,0x36f8,0x25a6,0x7c3a,0x5a1f,0x9b15,0x8dd,0xc279,0x6311,0x30d1,0xbea1,0x7280,0x18}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x36f850ca,0x7c3a25a6,0x9b155a1f,0xc27908dd,0x30d16311,0x7280bea1,0x18}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7c3a25a636f850ca,0xc27908dd9b155a1f,0x7280bea130d16311,0x18}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x83f7,0x63ae,0x245e,0x2154,0x883c,0x544b,0x8f96,0x1b2d,0xcc0c,0x8d73,0x7bdd,0x118e,0x1df}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x63ae83f7,0x2154245e,0x544b883c,0x1b2d8f96,0x8d73cc0c,0x118e7bdd,0x1df}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2154245e63ae83f7,0x1b2d8f96544b883c,0x118e7bdd8d73cc0c,0x1df}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -24, ._mp_d = (mp_limb_t[]) {0xbd79,0x489c,0xbd84,0xce46,0x9344,0xb194,0x642a,0x3c5a,0xdb04,0x96f5,0x6e1f,0x4dcb,0xff6e,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x207f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0x489cbd79,0xce46bd84,0xb1949344,0x3c5a642a,0x96f5db04,0x4dcb6e1f,0xffffff6e,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x207fffff}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0xce46bd84489cbd79,0x3c5a642ab1949344,0x4dcb6e1f96f5db04,0xffffffffffffff6e,0xffffffffffffffff,0x207fffffffffffff}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x50ca,0x36f8,0x25a6,0x7c3a,0x5a1f,0x9b15,0x8dd,0xc279,0x6311,0x30d1,0xbea1,0x7280,0x18}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x36f850ca,0x7c3a25a6,0x9b155a1f,0xc27908dd,0x30d16311,0x7280bea1,0x18}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7c3a25a636f850ca,0xc27908dd9b155a1f,0x7280bea130d16311,0x18}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x61}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x61}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x61}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -13, ._mp_d = (mp_limb_t[]) {0xa1c9,0x3fda,0x577,0x71a8,0xf4d3,0x4269,0xecf2,0x2a5d,0x41b6,0x6e41,0x47e5,0x782c,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -7, ._mp_d = (mp_limb_t[]) {0x3fdaa1c9,0x71a80577,0x4269f4d3,0x2a5decf2,0x6e4141b6,0x782c47e5,0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x71a805773fdaa1c9,0x2a5decf24269f4d3,0x782c47e56e4141b6,0x2}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xa194,0x6df0,0x4b4c,0xf874,0xb43e,0x362a,0x11bb,0x84f2,0xc623,0x61a2,0x7d42,0xe501,0x30}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x6df0a194,0xf8744b4c,0x362ab43e,0x84f211bb,0x61a2c623,0xe5017d42,0x30}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xf8744b4c6df0a194,0x84f211bb362ab43e,0xe5017d4261a2c623,0x30}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x83f7,0x63ae,0x245e,0x2154,0x883c,0x544b,0x8f96,0x1b2d,0xcc0c,0x8d73,0x7bdd,0x118e,0x1df}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x63ae83f7,0x2154245e,0x544b883c,0x1b2d8f96,0x8d73cc0c,0x118e7bdd,0x1df}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2154245e63ae83f7,0x1b2d8f96544b883c,0x118e7bdd8d73cc0c,0x1df}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x61}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x61}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x61}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 97}}; +const quat_left_ideal_t CONNECTING_IDEALS[8] = {{{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xbf5a,0x9a6f,0xcde1,0x21d4,0x52b1,0xe7a0,0xf3ba,0x78eb,0xc45c,0x787f,0x5c29,0x1c51,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x9a6fbf5a,0x21d4cde1,0xe7a052b1,0x78ebf3ba,0x787fc45c,0x1c515c29,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x21d4cde19a6fbf5a,0x78ebf3bae7a052b1,0x1c515c29787fc45c,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x8015,0xfd5c,0xb508,0x1437,0xfa92,0x6222,0x1452,0xa79a,0x6c31,0xd3a9,0xb3c4,0x15c5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xfd5c8015,0x1437b508,0x6222fa92,0xa79a1452,0xd3a96c31,0x15c5b3c4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x1437b508fd5c8015,0xa79a14526222fa92,0x15c5b3c4d3a96c31}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xbf5a,0x9a6f,0xcde1,0x21d4,0x52b1,0xe7a0,0xf3ba,0x78eb,0xc45c,0x787f,0x5c29,0x1c51,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x9a6fbf5a,0x21d4cde1,0xe7a052b1,0x78ebf3ba,0x787fc45c,0x1c515c29,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x21d4cde19a6fbf5a,0x78ebf3bae7a052b1,0x1c515c29787fc45c,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x3f45,0x9d13,0x18d8,0xd9d,0x581f,0x857d,0xdf68,0xd151,0x582a,0xa4d6,0xa864,0x68b,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x9d133f45,0xd9d18d8,0x857d581f,0xd151df68,0xa4d6582a,0x68ba864,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd9d18d89d133f45,0xd151df68857d581f,0x68ba864a4d6582a,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xdfad,0xcd37,0x66f0,0x90ea,0x2958,0x73d0,0xf9dd,0x3c75,0xe22e,0xbc3f,0xae14,0x8e28}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xcd37dfad,0x90ea66f0,0x73d02958,0x3c75f9dd,0xbc3fe22e,0x8e28ae14}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x90ea66f0cd37dfad,0x3c75f9dd73d02958,0x8e28ae14bc3fe22e}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x9d7a,0x920e,0xe71,0xc120,0x8fbf,0x607e,0x29f,0xff55,0x7422,0x4796,0xbca4,0x125b,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x920e9d7a,0xc1200e71,0x607e8fbf,0xff55029f,0x47967422,0x125bbca4,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc1200e71920e9d7a,0xff55029f607e8fbf,0x125bbca447967422,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xbcbf,0x76ed,0xc538,0xec53,0xeb88,0xb40d,0xa54e,0x14f,0x8bb2,0x300a,0xedb2,0x539}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x76edbcbf,0xec53c538,0xb40deb88,0x14fa54e,0x300a8bb2,0x539edb2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xec53c53876edbcbf,0x14fa54eb40deb88,0x539edb2300a8bb2}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x9d7a,0x920e,0xe71,0xc120,0x8fbf,0x607e,0x29f,0xff55,0x7422,0x4796,0xbca4,0x125b,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x920e9d7a,0xc1200e71,0x607e8fbf,0xff55029f,0x47967422,0x125bbca4,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc1200e71920e9d7a,0xff55029f607e8fbf,0x125bbca447967422,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xe0bb,0x1b20,0x4939,0xd4cc,0xa436,0xac70,0x5d50,0xfe05,0xe870,0x178b,0xcef2,0xd21,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x1b20e0bb,0xd4cc4939,0xac70a436,0xfe055d50,0x178be870,0xd21cef2,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd4cc49391b20e0bb,0xfe055d50ac70a436,0xd21cef2178be870,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x4ebd,0xc907,0x738,0xe090,0x47df,0xb03f,0x814f,0x7faa,0x3a11,0x23cb,0xde52,0x892d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xc9074ebd,0xe0900738,0xb03f47df,0x7faa814f,0x23cb3a11,0x892dde52}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xe0900738c9074ebd,0x7faa814fb03f47df,0x892dde5223cb3a11}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xd282,0xcb1f,0x6532,0xe33e,0x153d,0xfd8,0x4275,0x2b62,0xf17d,0xdb04,0x3f12,0xf722,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xcb1fd282,0xe33e6532,0xfd8153d,0x2b624275,0xdb04f17d,0xf7223f12,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xe33e6532cb1fd282,0x2b6242750fd8153d,0xf7223f12db04f17d,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x50bf,0xeebf,0xe944,0xea4d,0x76d,0xcbc5,0x4919,0x12b0,0x71f3,0x9e30,0x3304,0x1265}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xeebf50bf,0xea4de944,0xcbc5076d,0x12b04919,0x9e3071f3,0x12653304}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xea4de944eebf50bf,0x12b04919cbc5076d,0x126533049e3071f3}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xd282,0xcb1f,0x6532,0xe33e,0x153d,0xfd8,0x4275,0x2b62,0xf17d,0xdb04,0x3f12,0xf722,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xcb1fd282,0xe33e6532,0xfd8153d,0x2b624275,0xdb04f17d,0xf7223f12,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xe33e6532cb1fd282,0x2b6242750fd8153d,0xf7223f12db04f17d,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x81c3,0xdc60,0x7bed,0xf8f0,0xdcf,0x4413,0xf95b,0x18b1,0x7f8a,0x3cd4,0xc0e,0xe4bd,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xdc6081c3,0xf8f07bed,0x44130dcf,0x18b1f95b,0x3cd47f8a,0xe4bd0c0e,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xf8f07beddc6081c3,0x18b1f95b44130dcf,0xe4bd0c0e3cd47f8a,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xe941,0x658f,0x3299,0xf19f,0xa9e,0x87ec,0x213a,0x95b1,0x78be,0x6d82,0x1f89,0xfb91}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x658fe941,0xf19f3299,0x87ec0a9e,0x95b1213a,0x6d8278be,0xfb911f89}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xf19f3299658fe941,0x95b1213a87ec0a9e,0xfb911f896d8278be}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xdfda,0xabc3,0xd4b8,0x7c1c,0x4727,0x66b2,0x21da,0x79cc,0xe3a3,0x553d,0x9b8d,0xa12d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xabc3dfda,0x7c1cd4b8,0x66b24727,0x79cc21da,0x553de3a3,0xa12d9b8d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x7c1cd4b8abc3dfda,0x79cc21da66b24727,0xa12d9b8d553de3a3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x60fb,0xd399,0x887f,0xd263,0xe0e7,0xb202,0x699b,0xea34,0x5a15,0x4b8a,0x6763,0x8e95}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xd39960fb,0xd263887f,0xb202e0e7,0xea34699b,0x4b8a5a15,0x8e956763}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xd263887fd39960fb,0xea34699bb202e0e7,0x8e9567634b8a5a15}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xdfda,0xabc3,0xd4b8,0x7c1c,0x4727,0x66b2,0x21da,0x79cc,0xe3a3,0x553d,0x9b8d,0xa12d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xabc3dfda,0x7c1cd4b8,0x66b24727,0x79cc21da,0x553de3a3,0xa12d9b8d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x7c1cd4b8abc3dfda,0x79cc21da66b24727,0xa12d9b8d553de3a3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7edf,0xd82a,0x4c38,0xa9b9,0x663f,0xb4af,0xb83e,0x8f97,0x898d,0x9b3,0x342a,0x1298}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xd82a7edf,0xa9b94c38,0xb4af663f,0x8f97b83e,0x9b3898d,0x1298342a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xa9b94c38d82a7edf,0x8f97b83eb4af663f,0x1298342a09b3898d}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xefed,0x55e1,0x6a5c,0xbe0e,0x2393,0x3359,0x10ed,0xbce6,0xf1d1,0xaa9e,0xcdc6,0x5096}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x55e1efed,0xbe0e6a5c,0x33592393,0xbce610ed,0xaa9ef1d1,0x5096cdc6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xbe0e6a5c55e1efed,0xbce610ed33592393,0x5096cdc6aa9ef1d1}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xe00e,0xd869,0x1a76,0xd8de,0xfe4c,0xabc5,0x99e1,0xf264,0x7d83,0x9c3,0x32ab,0xb60b,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xd869e00e,0xd8de1a76,0xabc5fe4c,0xf26499e1,0x9c37d83,0xb60b32ab,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd8de1a76d869e00e,0xf26499e1abc5fe4c,0xb60b32ab09c37d83,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xb00f,0x8bbf,0x19a9,0xd6b,0xf7b,0xcd5c,0x74e7,0xd7e2,0xa419,0x3593,0x56a8,0x8de8,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x8bbfb00f,0xd6b19a9,0xcd5c0f7b,0xd7e274e7,0x3593a419,0x8de856a8,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd6b19a98bbfb00f,0xd7e274e7cd5c0f7b,0x8de856a83593a419,0x1}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xe00e,0xd869,0x1a76,0xd8de,0xfe4c,0xabc5,0x99e1,0xf264,0x7d83,0x9c3,0x32ab,0xb60b,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xd869e00e,0xd8de1a76,0xabc5fe4c,0xf26499e1,0x9c37d83,0xb60b32ab,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd8de1a76d869e00e,0xf26499e1abc5fe4c,0xb60b32ab09c37d83,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x2fff,0x4caa,0xcd,0xcb73,0xeed1,0xde69,0x24f9,0x1a82,0xd96a,0xd42f,0xdc02,0x2822}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x4caa2fff,0xcb7300cd,0xde69eed1,0x1a8224f9,0xd42fd96a,0x2822dc02}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xcb7300cd4caa2fff,0x1a8224f9de69eed1,0x2822dc02d42fd96a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xf007,0x6c34,0xd3b,0x6c6f,0xff26,0xd5e2,0x4cf0,0xf932,0xbec1,0x84e1,0x9955,0xdb05}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x6c34f007,0x6c6f0d3b,0xd5e2ff26,0xf9324cf0,0x84e1bec1,0xdb059955}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x6c6f0d3b6c34f007,0xf9324cf0d5e2ff26,0xdb05995584e1bec1}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7b26,0x37a0,0xc8dc,0x97d3,0x7f2f,0xd6bd,0x931,0x1df2,0x2918,0x4a3e,0x2591,0x6ee7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x37a07b26,0x97d3c8dc,0xd6bd7f2f,0x1df20931,0x4a3e2918,0x6ee72591}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x97d3c8dc37a07b26,0x1df20931d6bd7f2f,0x6ee725914a3e2918}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x3a91,0xcd01,0xac55,0x9a52,0x9887,0x118f,0x4dec,0x4245,0xd869,0x1022,0x1d16,0x7ad}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xcd013a91,0x9a52ac55,0x118f9887,0x42454dec,0x1022d869,0x7ad1d16}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x9a52ac55cd013a91,0x42454dec118f9887,0x7ad1d161022d869}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7b26,0x37a0,0xc8dc,0x97d3,0x7f2f,0xd6bd,0x931,0x1df2,0x2918,0x4a3e,0x2591,0x6ee7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x37a07b26,0x97d3c8dc,0xd6bd7f2f,0x1df20931,0x4a3e2918,0x6ee72591}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x97d3c8dc37a07b26,0x1df20931d6bd7f2f,0x6ee725914a3e2918}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x4095,0x6a9f,0x1c86,0xfd81,0xe6a7,0xc52d,0xbb45,0xdbac,0x50ae,0x3a1b,0x87b,0x673a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x6a9f4095,0xfd811c86,0xc52de6a7,0xdbacbb45,0x3a1b50ae,0x673a087b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xfd811c866a9f4095,0xdbacbb45c52de6a7,0x673a087b3a1b50ae}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x3d93,0x1bd0,0xe46e,0xcbe9,0xbf97,0xeb5e,0x498,0xef9,0x148c,0xa51f,0x92c8,0x3773}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1bd03d93,0xcbe9e46e,0xeb5ebf97,0xef90498,0xa51f148c,0x377392c8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xcbe9e46e1bd03d93,0xef90498eb5ebf97,0x377392c8a51f148c}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xe5ca,0x3b34,0xb04b,0x430f,0xe795,0xa04a,0x8c7d,0xec47,0x77df,0x8e5c,0xb71e,0xd31f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x3b34e5ca,0x430fb04b,0xa04ae795,0xec478c7d,0x8e5c77df,0xd31fb71e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x430fb04b3b34e5ca,0xec478c7da04ae795,0xd31fb71e8e5c77df}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x4d27,0x98d5,0x3839,0x83ff,0x48b7,0x4d5b,0xc95b,0xbe45,0x9d44,0x36f3,0x4d57,0x6c26}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x98d54d27,0x83ff3839,0x4d5b48b7,0xbe45c95b,0x36f39d44,0x6c264d57}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x83ff383998d54d27,0xbe45c95b4d5b48b7,0x6c264d5736f39d44}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xe5ca,0x3b34,0xb04b,0x430f,0xe795,0xa04a,0x8c7d,0xec47,0x77df,0x8e5c,0xb71e,0xd31f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x3b34e5ca,0x430fb04b,0xa04ae795,0xec478c7d,0x8e5c77df,0xd31fb71e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x430fb04b3b34e5ca,0xec478c7da04ae795,0xd31fb71e8e5c77df}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x98a3,0xa25f,0x7811,0xbf10,0x9edd,0x52ef,0xc322,0x2e01,0xda9b,0x5768,0x69c7,0x66f9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xa25f98a3,0xbf107811,0x52ef9edd,0x2e01c322,0x5768da9b,0x66f969c7}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xbf107811a25f98a3,0x2e01c32252ef9edd,0x66f969c75768da9b}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x72e5,0x9d9a,0xd825,0xa187,0x73ca,0xd025,0xc63e,0xf623,0x3bef,0x472e,0xdb8f,0x698f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9d9a72e5,0xa187d825,0xd02573ca,0xf623c63e,0x472e3bef,0x698fdb8f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xa187d8259d9a72e5,0xf623c63ed02573ca,0x698fdb8f472e3bef}}} +#endif +, &MAXORD_O0}}; +const quat_alg_elem_t CONJUGATING_ELEMENTS[8] = {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0x8015,0xfd5c,0xb508,0x1437,0xfa92,0x6222,0x1452,0xa79a,0x6c31,0xd3a9,0xb3c4,0x15c5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0xfd5c8015,0x1437b508,0x6222fa92,0xa79a1452,0xd3a96c31,0x15c5b3c4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0x1437b508fd5c8015,0xa79a14526222fa92,0x15c5b3c4d3a96c31}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0x8015,0xfd5c,0xb508,0x1437,0xfa92,0x6222,0x1452,0xa79a,0x6c31,0xd3a9,0xb3c4,0x15c5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0xfd5c8015,0x1437b508,0x6222fa92,0xa79a1452,0xd3a96c31,0x15c5b3c4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0x1437b508fd5c8015,0xa79a14526222fa92,0x15c5b3c4d3a96c31}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0xbcbf,0x76ed,0xc538,0xec53,0xeb88,0xb40d,0xa54e,0x14f,0x8bb2,0x300a,0xedb2,0x539}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0x76edbcbf,0xec53c538,0xb40deb88,0x14fa54e,0x300a8bb2,0x539edb2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0xec53c53876edbcbf,0x14fa54eb40deb88,0x539edb2300a8bb2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0xbcbf,0x76ed,0xc538,0xec53,0xeb88,0xb40d,0xa54e,0x14f,0x8bb2,0x300a,0xedb2,0x539}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0x76edbcbf,0xec53c538,0xb40deb88,0x14fa54e,0x300a8bb2,0x539edb2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0xec53c53876edbcbf,0x14fa54eb40deb88,0x539edb2300a8bb2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x2341,0xb9df,0x4e77,0xcd8c,0x1cab,0xdb9d,0x8b8e,0x3e12,0x6370,0x7935,0x7217,0x987,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xb9df2341,0xcd8c4e77,0xdb9d1cab,0x3e128b8e,0x79356370,0x9877217,0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xcd8c4e77b9df2341,0x3e128b8edb9d1cab,0x987721779356370,0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -13, ._mp_d = (mp_limb_t[]) {0x2341,0xb9df,0x4e77,0xcd8c,0x1cab,0xdb9d,0x8b8e,0x3e12,0x6370,0x7935,0x7217,0x987,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -7, ._mp_d = (mp_limb_t[]) {0xb9df2341,0xcd8c4e77,0xdb9d1cab,0x3e128b8e,0x79356370,0x9877217,0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xcd8c4e77b9df2341,0x3e128b8edb9d1cab,0x987721779356370,0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xefed,0x55e1,0x6a5c,0xbe0e,0x2393,0x3359,0x10ed,0xbce6,0xf1d1,0xaa9e,0xcdc6,0x5096}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x55e1efed,0xbe0e6a5c,0x33592393,0xbce610ed,0xaa9ef1d1,0x5096cdc6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xbe0e6a5c55e1efed,0xbce610ed33592393,0x5096cdc6aa9ef1d1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0xefed,0x55e1,0x6a5c,0xbe0e,0x2393,0x3359,0x10ed,0xbce6,0xf1d1,0xaa9e,0xcdc6,0x5096}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0x55e1efed,0xbe0e6a5c,0x33592393,0xbce610ed,0xaa9ef1d1,0x5096cdc6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0xbe0e6a5c55e1efed,0xbce610ed33592393,0x5096cdc6aa9ef1d1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0x2fff,0x4caa,0xcd,0xcb73,0xeed1,0xde69,0x24f9,0x1a82,0xd96a,0xd42f,0xdc02,0x2822}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0x4caa2fff,0xcb7300cd,0xde69eed1,0x1a8224f9,0xd42fd96a,0x2822dc02}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0xcb7300cd4caa2fff,0x1a8224f9de69eed1,0x2822dc02d42fd96a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x2fff,0x4caa,0xcd,0xcb73,0xeed1,0xde69,0x24f9,0x1a82,0xd96a,0xd42f,0xdc02,0x2822}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x4caa2fff,0xcb7300cd,0xde69eed1,0x1a8224f9,0xd42fd96a,0x2822dc02}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xcb7300cd4caa2fff,0x1a8224f9de69eed1,0x2822dc02d42fd96a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x3d93,0x1bd0,0xe46e,0xcbe9,0xbf97,0xeb5e,0x498,0xef9,0x148c,0xa51f,0x92c8,0x3773}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1bd03d93,0xcbe9e46e,0xeb5ebf97,0xef90498,0xa51f148c,0x377392c8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xcbe9e46e1bd03d93,0xef90498eb5ebf97,0x377392c8a51f148c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0x3d93,0x1bd0,0xe46e,0xcbe9,0xbf97,0xeb5e,0x498,0xef9,0x148c,0xa51f,0x92c8,0x3773}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0x1bd03d93,0xcbe9e46e,0xeb5ebf97,0xef90498,0xa51f148c,0x377392c8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0xcbe9e46e1bd03d93,0xef90498eb5ebf97,0x377392c8a51f148c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x4385,0xf091,0xe8e9,0xfaa3,0x7d60,0x8ab7,0x68b2,0x8a57,0x2754,0xa10c,0x6f20,0x71e4,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xf0914385,0xfaa3e8e9,0x8ab77d60,0x8a5768b2,0xa10c2754,0x71e46f20,0x4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xfaa3e8e9f0914385,0x8a5768b28ab77d60,0x71e46f20a10c2754,0x4}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x4385,0xf091,0xe8e9,0xfaa3,0x7d60,0x8ab7,0x68b2,0x8a57,0x2754,0xa10c,0x6f20,0x71e4,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xf0914385,0xfaa3e8e9,0x8ab77d60,0x8a5768b2,0xa10c2754,0x71e46f20,0x4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xfaa3e8e9f0914385,0x8a5768b28ab77d60,0x71e46f20a10c2754,0x4}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9}}} +#endif +}}}; diff --git a/src/precomp/ref/lvl3/sqisign_parameters.txt b/src/precomp/ref/lvl3/sqisign_parameters.txt index c22eb65..52241be 100644 --- a/src/precomp/ref/lvl3/sqisign_parameters.txt +++ b/src/precomp/ref/lvl3/sqisign_parameters.txt @@ -1,3 +1,3 @@ lvl = 3 -p = 0x3df6eeeab0871a2c6ae604a45d10ad665bc2e0a90aeb751c722f669356ea4684c6174c1ffffffffffffffffffffffff -B = 48000 +p = 0x40ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +num_orders = 8 diff --git a/src/precomp/ref/lvl3/torsion_constants.c b/src/precomp/ref/lvl3/torsion_constants.c index 5e87f49..1a6c203 100644 --- a/src/precomp/ref/lvl3/torsion_constants.c +++ b/src/precomp/ref/lvl3/torsion_constants.c @@ -1,68 +1,43 @@ #include #include #include +const ibz_t TWO_TO_SECURITY_BITS = #if 0 -#elif 8*DIGIT_LEN == 16 -const uint64_t TORSION_PLUS_EVEN_POWER = 0x61; -const uint64_t TORSION_ODD_PRIMES[28] = {0x3, 0x7, 0xb, 0x2f, 0x9d, 0x1fd, 0x2f9, 0x5, 0xd, 0x59, 0x71, 0xad, 0xe9, 0xef, 0xf1, 0x1bb, 0x239, 0x4cd, 0x959, 0xd2b, 0x11a5, 0x141b, 0x163d, 0x16b5, 0x24b5, 0x6899, 0x9aff, 0xb951}; -const uint64_t TORSION_ODD_POWERS[28] = {0x44, 0xc, 0x4, 0x4, 0x4, 0x4, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const uint64_t TORSION_PLUS_ODD_PRIMES[7] = {0x3, 0x7, 0xb, 0x2f, 0x9d, 0x1fd, 0x2f9}; -const size_t TORSION_PLUS_ODD_POWERS[7] = {0x44, 0xc, 0x4, 0x4, 0x4, 0x4, 0x4}; -const uint64_t TORSION_MINUS_ODD_PRIMES[21] = {0x5, 0xd, 0x59, 0x71, 0xad, 0xe9, 0xef, 0xf1, 0x1bb, 0x239, 0x4cd, 0x959, 0xd2b, 0x11a5, 0x141b, 0x163d, 0x16b5, 0x24b5, 0x6899, 0x9aff, 0xb951}; -const size_t TORSION_MINUS_ODD_POWERS[21] = {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const size_t DEGREE_COMMITMENT_POWERS[28] = {0x0, 0xc, 0x4, 0x4, 0x4, 0x4, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const ibz_t CHARACTERISTIC = {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x74c1,0x4c61,0xa468,0x356e,0xf669,0xc722,0xb751,0x90ae,0x2e0a,0x65bc,0xad6,0x45d1,0x604a,0xc6ae,0x71a2,0xab08,0x6eee,0x3df}}}; -const ibz_t TORSION_ODD = {{._mp_alloc = 0, ._mp_size = 31, ._mp_d = (mp_limb_t[]) {0x339b,0xb4fe,0x4d24,0x2ab1,0xc863,0x2629,0xf4dc,0x6ea5,0x753,0x1e0e,0x7109,0xf393,0x786a,0xbc1b,0x3c81,0x618e,0xfcc2,0xe01e,0xa5b6,0xa842,0x786f,0xa868,0x5020,0xa3e0,0xe4d9,0xefe3,0xf347,0x2dc3,0x8484,0x9cd0,0x681}}}; -const ibz_t TORSION_ODD_PRIMEPOWERS[28] = {{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xcd51,0x7119,0x8372,0x58de,0x8c65,0x794b,0xdb6}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x4821,0x3901,0x3}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3931}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x7541,0x4a}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xd4d1,0x2436}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x2851,0xa0d7,0xf}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xf561,0x1645,0x4e}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x59}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x71}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xad}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xe9}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xef}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xf1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1bb}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x239}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4cd}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x959}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd2b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11a5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x141b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x163d}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x16b5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x24b5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x6899}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9aff}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xb951}}}}; -const ibz_t TORSION_ODD_PLUS = {{._mp_alloc = 0, ._mp_size = 18, ._mp_d = (mp_limb_t[]) {0xba61,0x2630,0x5234,0x9ab7,0x7b34,0xe391,0x5ba8,0x4857,0x1705,0x32de,0x856b,0x22e8,0x3025,0x6357,0x38d1,0x5584,0xb777,0x1ef}}}; -const ibz_t TORSION_ODD_MINUS = {{._mp_alloc = 0, ._mp_size = 14, ._mp_d = (mp_limb_t[]) {0x77b,0xeffc,0x1f3,0x9185,0x14e6,0x6206,0x1598,0x97dd,0x54d7,0xf6ce,0xab08,0x9035,0x5c29,0x3}}}; -const ibz_t TORSION_PLUS_2POWER = {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x2}}}; -const ibz_t TORSION_PLUS_3POWER = {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xcd51,0x7119,0x8372,0x58de,0x8c65,0x794b,0xdb6}}}; -const ibz_t TORSION_PLUS_23POWER = {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x9aa2,0xe233,0x6e4,0xb1bd,0x18ca,0xf297,0x1b6c}}}; -const ibz_t DEGREE_COMMITMENT = {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x872b,0x2f73,0xdc9e,0x43e5,0x8784,0x5ec0,0x2835,0xe933,0xbdb4,0x5490,0x1a83,0x3cb,0xfec3,0x48dc,0xafb,0xf32d,0x47fe,0x6014,0xd35c,0xabe0,0xac24,0x65b7,0xd459,0x7976}}}; -const ibz_t DEGREE_COMMITMENT_PLUS = {{._mp_alloc = 0, ._mp_size = 11, ._mp_d = (mp_limb_t[]) {0x9811,0xcbf2,0xf040,0x9e7,0x76ed,0xf72a,0x4f9f,0xec90,0xf184,0x635f,0x2426}}}; -const ibz_t DEGREE_COMMITMENT_MINUS = {{._mp_alloc = 0, ._mp_size = 14, ._mp_d = (mp_limb_t[]) {0x77b,0xeffc,0x1f3,0x9185,0x14e6,0x6206,0x1598,0x97dd,0x54d7,0xf6ce,0xab08,0x9035,0x5c29,0x3}}}; -const ibz_t DEGREE_CHALLENGE = {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x9aa2,0xe233,0x6e4,0xb1bd,0x18ca,0xf297,0x1b6c}}}; -#elif 8*DIGIT_LEN == 32 -const uint64_t TORSION_PLUS_EVEN_POWER = 0x61; -const uint64_t TORSION_ODD_PRIMES[28] = {0x3, 0x7, 0xb, 0x2f, 0x9d, 0x1fd, 0x2f9, 0x5, 0xd, 0x59, 0x71, 0xad, 0xe9, 0xef, 0xf1, 0x1bb, 0x239, 0x4cd, 0x959, 0xd2b, 0x11a5, 0x141b, 0x163d, 0x16b5, 0x24b5, 0x6899, 0x9aff, 0xb951}; -const uint64_t TORSION_ODD_POWERS[28] = {0x44, 0xc, 0x4, 0x4, 0x4, 0x4, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const uint64_t TORSION_PLUS_ODD_PRIMES[7] = {0x3, 0x7, 0xb, 0x2f, 0x9d, 0x1fd, 0x2f9}; -const size_t TORSION_PLUS_ODD_POWERS[7] = {0x44, 0xc, 0x4, 0x4, 0x4, 0x4, 0x4}; -const uint64_t TORSION_MINUS_ODD_PRIMES[21] = {0x5, 0xd, 0x59, 0x71, 0xad, 0xe9, 0xef, 0xf1, 0x1bb, 0x239, 0x4cd, 0x959, 0xd2b, 0x11a5, 0x141b, 0x163d, 0x16b5, 0x24b5, 0x6899, 0x9aff, 0xb951}; -const size_t TORSION_MINUS_ODD_POWERS[21] = {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const size_t DEGREE_COMMITMENT_POWERS[28] = {0x0, 0xc, 0x4, 0x4, 0x4, 0x4, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const ibz_t CHARACTERISTIC = {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0xffffffff,0x4c6174c1,0x356ea468,0xc722f669,0x90aeb751,0x65bc2e0a,0x45d10ad6,0xc6ae604a,0xab0871a2,0x3df6eee}}}; -const ibz_t TORSION_ODD = {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb4fe339b,0x2ab14d24,0x2629c863,0x6ea5f4dc,0x1e0e0753,0xf3937109,0xbc1b786a,0x618e3c81,0xe01efcc2,0xa842a5b6,0xa868786f,0xa3e05020,0xefe3e4d9,0x2dc3f347,0x9cd08484,0x681}}}; -const ibz_t TORSION_ODD_PRIMEPOWERS[28] = {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7119cd51,0x58de8372,0x794b8c65,0xdb6}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x39014821,0x3}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3931}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4a7541}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2436d4d1}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xa0d72851,0xf}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1645f561,0x4e}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x59}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x71}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xad}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xe9}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xef}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xf1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1bb}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x239}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4cd}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x959}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd2b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11a5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x141b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x163d}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x16b5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x24b5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x6899}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9aff}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xb951}}}}; -const ibz_t TORSION_ODD_PLUS = {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x2630ba61,0x9ab75234,0xe3917b34,0x48575ba8,0x32de1705,0x22e8856b,0x63573025,0x558438d1,0x1efb777}}}; -const ibz_t TORSION_ODD_MINUS = {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xeffc077b,0x918501f3,0x620614e6,0x97dd1598,0xf6ce54d7,0x9035ab08,0x35c29}}}; -const ibz_t TORSION_PLUS_2POWER = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x2}}}; -const ibz_t TORSION_PLUS_3POWER = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7119cd51,0x58de8372,0x794b8c65,0xdb6}}}; -const ibz_t TORSION_PLUS_23POWER = {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0xe2339aa2,0xb1bd06e4,0xf29718ca,0x1b6c}}}; -const ibz_t DEGREE_COMMITMENT = {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x2f73872b,0x43e5dc9e,0x5ec08784,0xe9332835,0x5490bdb4,0x3cb1a83,0x48dcfec3,0xf32d0afb,0x601447fe,0xabe0d35c,0x65b7ac24,0x7976d459}}}; -const ibz_t DEGREE_COMMITMENT_PLUS = {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xcbf29811,0x9e7f040,0xf72a76ed,0xec904f9f,0x635ff184,0x2426}}}; -const ibz_t DEGREE_COMMITMENT_MINUS = {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xeffc077b,0x918501f3,0x620614e6,0x97dd1598,0xf6ce54d7,0x9035ab08,0x35c29}}}; -const ibz_t DEGREE_CHALLENGE = {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0xe2339aa2,0xb1bd06e4,0xf29718ca,0x1b6c}}}; -#elif 8*DIGIT_LEN == 64 -const uint64_t TORSION_PLUS_EVEN_POWER = 0x61; -const uint64_t TORSION_ODD_PRIMES[28] = {0x3, 0x7, 0xb, 0x2f, 0x9d, 0x1fd, 0x2f9, 0x5, 0xd, 0x59, 0x71, 0xad, 0xe9, 0xef, 0xf1, 0x1bb, 0x239, 0x4cd, 0x959, 0xd2b, 0x11a5, 0x141b, 0x163d, 0x16b5, 0x24b5, 0x6899, 0x9aff, 0xb951}; -const uint64_t TORSION_ODD_POWERS[28] = {0x44, 0xc, 0x4, 0x4, 0x4, 0x4, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const uint64_t TORSION_PLUS_ODD_PRIMES[7] = {0x3, 0x7, 0xb, 0x2f, 0x9d, 0x1fd, 0x2f9}; -const size_t TORSION_PLUS_ODD_POWERS[7] = {0x44, 0xc, 0x4, 0x4, 0x4, 0x4, 0x4}; -const uint64_t TORSION_MINUS_ODD_PRIMES[21] = {0x5, 0xd, 0x59, 0x71, 0xad, 0xe9, 0xef, 0xf1, 0x1bb, 0x239, 0x4cd, 0x959, 0xd2b, 0x11a5, 0x141b, 0x163d, 0x16b5, 0x24b5, 0x6899, 0x9aff, 0xb951}; -const size_t TORSION_MINUS_ODD_POWERS[21] = {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const size_t DEGREE_COMMITMENT_POWERS[28] = {0x0, 0xc, 0x4, 0x4, 0x4, 0x4, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const ibz_t CHARACTERISTIC = {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0x4c6174c1ffffffff,0xc722f669356ea468,0x65bc2e0a90aeb751,0xc6ae604a45d10ad6,0x3df6eeeab0871a2}}}; -const ibz_t TORSION_ODD = {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2ab14d24b4fe339b,0x6ea5f4dc2629c863,0xf39371091e0e0753,0x618e3c81bc1b786a,0xa842a5b6e01efcc2,0xa3e05020a868786f,0x2dc3f347efe3e4d9,0x6819cd08484}}}; -const ibz_t TORSION_ODD_PRIMEPOWERS[28] = {{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x58de83727119cd51,0xdb6794b8c65}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x339014821}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3931}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4a7541}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2436d4d1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xfa0d72851}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4e1645f561}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x59}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x71}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xad}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xe9}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xef}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xf1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1bb}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x239}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4cd}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x959}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd2b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11a5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x141b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x163d}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x16b5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x24b5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x6899}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9aff}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xb951}}}}; -const ibz_t TORSION_ODD_PLUS = {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x9ab752342630ba61,0x48575ba8e3917b34,0x22e8856b32de1705,0x558438d163573025,0x1efb777}}}; -const ibz_t TORSION_ODD_MINUS = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x918501f3effc077b,0x97dd1598620614e6,0x9035ab08f6ce54d7,0x35c29}}}; -const ibz_t TORSION_PLUS_2POWER = {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x0,0x200000000}}}; -const ibz_t TORSION_PLUS_3POWER = {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x58de83727119cd51,0xdb6794b8c65}}}; -const ibz_t TORSION_PLUS_23POWER = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x0,0xe2339aa200000000,0xf29718cab1bd06e4,0x1b6c}}}; -const ibz_t DEGREE_COMMITMENT = {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x43e5dc9e2f73872b,0xe93328355ec08784,0x3cb1a835490bdb4,0xf32d0afb48dcfec3,0xabe0d35c601447fe,0x7976d45965b7ac24}}}; -const ibz_t DEGREE_COMMITMENT_PLUS = {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x9e7f040cbf29811,0xec904f9ff72a76ed,0x2426635ff184}}}; -const ibz_t DEGREE_COMMITMENT_MINUS = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x918501f3effc077b,0x97dd1598620614e6,0x9035ab08f6ce54d7,0x35c29}}}; -const ibz_t DEGREE_CHALLENGE = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x0,0xe2339aa200000000,0xf29718cab1bd06e4,0x1b6c}}}; +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x1}}} #endif +; +const ibz_t TORSION_PLUS_2POWER = +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x100}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x100000000000000}}} +#endif +; +const ibz_t SEC_DEGREE = +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 49, ._mp_d = (mp_limb_t[]) {0xb7,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0xb7,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xb7,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#endif +; +const ibz_t COM_DEGREE = +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 49, ._mp_d = (mp_limb_t[]) {0xb7,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0xb7,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xb7,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#endif +; diff --git a/src/precomp/ref/lvl5/CMakeLists.txt b/src/precomp/ref/lvl5/CMakeLists.txt index 389782d..c7637fa 100644 --- a/src/precomp/ref/lvl5/CMakeLists.txt +++ b/src/precomp/ref/lvl5/CMakeLists.txt @@ -1,49 +1 @@ -set(SOURCE_FILES_PRECOMP_${SVARIANT_UPPER}_REF - torsion_constants.c - quaternion_data.c - endomorphism_action.c - klpt_constants.c -) - -add_library(${LIB_PRECOMP_${SVARIANT_UPPER}} ${SOURCE_FILES_PRECOMP_${SVARIANT_UPPER}_REF}) -target_include_directories(${LIB_PRECOMP_${SVARIANT_UPPER}} PRIVATE common ${INC_INTBIG} ${INC_QUATERNION} ${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/src/ec/ref/include ${PROJECT_SOURCE_DIR}/src/ec/ref/${SVARIANT_LOWER}/include ${PROJECT_SOURCE_DIR}/src/gf/ref/${SVARIANT_LOWER}/include ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_COMMON}) -target_compile_options(${LIB_PRECOMP_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_custom_command( - OUTPUT - "${CMAKE_CURRENT_SOURCE_DIR}/torsion_constants.c" - "${CMAKE_CURRENT_SOURCE_DIR}/include/torsion_constants.h" - "${CMAKE_CURRENT_SOURCE_DIR}/include/klpt_constants.h" - "${CMAKE_CURRENT_SOURCE_DIR}/klpt_constants.c" - "${CMAKE_CURRENT_SOURCE_DIR}/include/encoded_sizes.h" - "${PROJECT_SOURCE_DIR}/src/nistapi/lvl5/api.h" - "${CMAKE_CURRENT_SOURCE_DIR}/quaternion_data.c" - "${CMAKE_CURRENT_SOURCE_DIR}/include/quaternion_data.h" - "${CMAKE_CURRENT_SOURCE_DIR}/endomorphism_action.c" - "${CMAKE_CURRENT_SOURCE_DIR}/include/endomorphism_action.h" - COMMAND - echo "Please run manually: make precomp" -) - -find_program(SAGEMATH sage) -add_custom_target(precomp_${SVARIANT_LOWER} - DEPENDS - "./sqisign_parameters.txt" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_torsion_constants.sage" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_klpt_constants.sage" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_sizes.sage" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_quaternion_data.sage" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_endomorphism_action.sage" - WORKING_DIRECTORY - "${CMAKE_CURRENT_SOURCE_DIR}" -) - -set_directory_properties(PROPERTIES CLEAN_NO_CUSTOM true) -set_target_properties(precomp_${SVARIANT_LOWER} PROPERTIES EXCLUDE_FROM_ALL TRUE) - -add_dependencies(precomp precomp_lvl5) +include(../lvlx.cmake) diff --git a/src/precomp/ref/lvl5/e0_basis.c b/src/precomp/ref/lvl5/e0_basis.c new file mode 100644 index 0000000..a7148e4 --- /dev/null +++ b/src/precomp/ref/lvl5/e0_basis.c @@ -0,0 +1,55 @@ +#include +const fp2_t BASIS_E0_PX = { +#if 0 +#elif RADIX == 16 +{0x1099, 0xa9f, 0x14f8, 0x1537, 0x1a13, 0x97e, 0x1095, 0xc8b, 0xdd2, 0x1c5f, 0xbdf, 0x1344, 0x1330, 0x1733, 0x185d, 0x1b08, 0x464, 0x76f, 0xe44, 0x3fc, 0x1dc0, 0x1c62, 0x88, 0x972, 0x13f4, 0x18c8, 0x6bd, 0x804, 0x1269, 0x19e0, 0x14bd, 0x10a1, 0xe5e, 0x1af2, 0x156c, 0x3f7, 0x16a1, 0x47d, 0x314} +#elif RADIX == 32 +{0x184cba61, 0xf4f854f, 0x1fb42753, 0x45c2552, 0x1c5f6e93, 0x2688bdf, 0xedcce66, 0x64d8461, 0x1c8876f2, 0x177007f8, 0x12044718, 0x1913f44b, 0x10d7b8, 0x1cf049a5, 0x1d0a1a5e, 0x1b35e4e5, 0x1508fdea, 0x66d} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x27537a7c2a7e132e, 0x7dba4c8b84aa5fb4, 0xedcce6613445eff1, 0xc7221dbc8c9b08c2, 0x8972044718bb803f, 0x24d280435ee3227e, 0x6bc9cbd0a1a5ee78, 0x1011f6d423f7ab6} +#else +{0xa6f4f854fc265d, 0x4c8b84aa5fb427, 0x1309a22f7f8bedd, 0x12326c230bb7339, 0x1177007f8e443b7, 0x3227e897204471, 0x173c12694021af7, 0xd9af272f428697, 0x523eda847ef5} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x4b1, 0x178f, 0x107b, 0x6f6, 0x75e, 0x1b27, 0x4db, 0x1e1b, 0xd78, 0x15b6, 0x1130, 0x8cc, 0x1ac0, 0x9b7, 0x692, 0x1e07, 0x1f4, 0xfd7, 0x2ab, 0x7b5, 0x1040, 0xa43, 0xb6d, 0x13a1, 0x1422, 0x10c9, 0x10b0, 0x1540, 0x827, 0xa69, 0x1761, 0x1f25, 0x1d16, 0x16f2, 0x1fcb, 0x92, 0xcba, 0x1c03, 0x3c7} +#elif RADIX == 32 +{0x1258c7b1, 0xd07bbc7, 0x9cebc6f, 0x10d936f6, 0x15b66bc7, 0x1199130, 0x926df58, 0x1f4f039a, 0x556fd70, 0x1c100f6a, 0x15b6a90, 0x1934229d, 0x15021610, 0x1534a09e, 0xdf25bb0, 0x12ede5d1, 0x5d024bf, 0xa9b} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xbc6f683dde3c9631, 0xd9af1e1b26dec9ce, 0x926df5808cc89856, 0x5155bf5c3e9e0734, 0x53a15b6a90e0807b, 0x504f540858432684, 0xdbcba2df25bb0a9a, 0x18f00d974092fe5} +#else +{0xded07bbc792c63, 0x11e1b26dec9cebc, 0xc046644c2b6cd7, 0x10fa781cd249b7d, 0x1c100f6a2ab7eb, 0x3268453a15b6a9, 0x54d2827aa042c2, 0x1976f2e8b7c96ec, 0x16e01b2e8125f} +#endif +#endif +}; +const fp2_t BASIS_E0_QX = { +#if 0 +#elif RADIX == 16 +{0x15c, 0x865, 0x1af6, 0x17b9, 0x6a2, 0x1c22, 0x17c5, 0x1149, 0xa7, 0x151e, 0xe57, 0x4c2, 0x18cd, 0xbd2, 0x7a4, 0x7c6, 0x74a, 0xd2, 0x902, 0x68c, 0x21e, 0x1e44, 0x1f5a, 0x1d4c, 0x115b, 0x1777, 0x16d4, 0x503, 0x3af, 0x7e4, 0x1aa7, 0x3dd, 0x827, 0x186b, 0x765, 0x1fc5, 0xc78, 0x9bd, 0xfe} +#elif RADIX == 32 +{0x10ae12d6, 0x13af6432, 0x88d457b, 0xa4df178, 0x151e053c, 0x14984e57, 0x122f4b19, 0x14a3e31e, 0x12040d23, 0x878d18, 0xcfad791, 0xef15bea, 0x140eda97, 0x13f20ebc, 0xe3ddd53, 0x1970d682, 0x3c7f14e, 0x4eb} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x457b9d7b21942b84, 0x7814f149be2f088d, 0x22f4b19a4c272bd4, 0xc4810348e947c63d, 0x7d4cfad791043c68, 0x75e503b6a5dde2b, 0xe1ad04e3ddd539f9, 0x1326f58f1fc53b2} +#else +{0xf73af643285709, 0xf149be2f088d45, 0xcd261395ea3c0a, 0x3a51f18f48bd2c, 0x20878d18902069, 0x1dde2b7d4cfad79, 0x1cfc83af281db52, 0xcb86b4138f7754, 0xb4deb1e3f8a7} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x6ac, 0x25e, 0xc7a, 0x1492, 0xd01, 0xbc0, 0x118, 0x376, 0x3e0, 0x7ae, 0x573, 0x171f, 0x35a, 0x1725, 0x48f, 0xc94, 0x133c, 0x16a4, 0x10a8, 0x178d, 0xdd7, 0x798, 0x1d05, 0x39f, 0xc2a, 0x179c, 0x407, 0xd3, 0x118a, 0x1c9f, 0xeac, 0x145b, 0xc35, 0x11a2, 0x58b, 0xe4, 0x5e3, 0xae7, 0x330} +#elif RADIX == 32 +{0x3563c78, 0x4c7a12f, 0x101a0349, 0x1bb04617, 0x7ae1f00, 0xae3e573, 0x7dc946b, 0x13c64a12, 0x1516a49, 0x375ef1b, 0x1fe829e6, 0x138c2a1c, 0x34c80f7, 0xe4fc628, 0xb45b756, 0x2e344c3, 0xf18390b, 0x339} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x349263d0978d58f, 0xb87c037608c2f01a, 0x7dc946b571f2b99e, 0xd8545a92678c9424, 0x439fe829e61baf78, 0xe3140d3203de7185, 0xc68986b45b756727, 0x32b9cbc60e42c5} +#else +{0x924c7a12f1ab1e, 0x37608c2f01a03, 0x15ab8f95ccf5c3e, 0x99e325091f7251, 0xc375ef1b0a8b52, 0x1e7185439fe829e, 0x1393f18a069901e, 0x1171a261ad16dd5, 0x6573978c1c85} +#endif +#endif +}; diff --git a/src/precomp/ref/lvl5/ec_params.c b/src/precomp/ref/lvl5/ec_params.c new file mode 100644 index 0000000..d2aa074 --- /dev/null +++ b/src/precomp/ref/lvl5/ec_params.c @@ -0,0 +1,4 @@ +#include +// p+1 divided by the power of 2 +const digit_t p_cofactor_for_2f[1] = {27}; + diff --git a/src/precomp/ref/lvl5/endomorphism_action.c b/src/precomp/ref/lvl5/endomorphism_action.c index 00ec494..dd089e6 100644 --- a/src/precomp/ref/lvl5/endomorphism_action.c +++ b/src/precomp/ref/lvl5/endomorphism_action.c @@ -1,56 +1,3336 @@ #include #include #include +const curve_with_endomorphism_ring_t CURVES_WITH_ENDOMORPHISMS[7] = {{{{ #if 0 -#elif 8*DIGIT_LEN == 16 -const ec_basis_t BASIS_EVEN = {{{{0xf893b25235cd05, 0xcfad0c31816a3767, 0x24d6633b878c9852, 0x947ef3f6bd7e54a9, 0xcfcc6931acebc9ec, 0x7a593c6f226d62a7, 0xd773da3276d4514e, 0xf93f309a42dec}, {0x70e6b5b84d87aff3, 0x3b39ea4b8a9af50f, 0x33bb72fc45f05294, 0x1103f3d679fb626a, 0x29e23daba686e722, 0xd7683a594c898767, 0x41c4ad3db823bae1, 0x13f1daa2e21221}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xac16948532220971, 0x5652f704391431a5, 0xca5ee11424c4943d, 0xaa2208832540971a, 0x9e289f9c846e5c2b, 0xde48d5cd32bd5fe2, 0x913b3efa3bc42565, 0xd203dedb14213}, {0x5872c77992dd67c0, 0xb937a740922a8754, 0x21f7d1669ef949f, 0x2a7139b6c8587d0f, 0xf8bab24328aa27ab, 0xdab9bd3b2ddeec79, 0xe83b475f203bcb65, 0x556741a934ed3}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x90f4d4d80ba9ed72, 0xc8b9a440304ca99d, 0xc943b3a8997d4b88, 0xf08d352edc87530f, 0x767ca098b77d7071, 0x50dba761679c1732, 0x545a298536db6db9, 0x1381accb5f9aff}, {0x97233d48b02e6714, 0x684847c5bc2333e7, 0x18886606aeba8b01, 0xe4d42f848dafb6fc, 0xcc8ac9374d922260, 0x63189d0ed97c756, 0xa21cc3b155e35e31, 0x17400333e40769}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_PLUS = {{{{0xcde42ca0952857f6, 0x43986ee6663ef6cd, 0x55871379b845a923, 0x76ed1adf6ebef960, 0xabc4b150fc745f1e, 0x1c8a9c2defeb0f13, 0x13dd17be34fd733, 0x19e43fe41e4c43}, {0x2fa1833df935bc09, 0x69f359ab51c26ad9, 0xf9586cab92e541d6, 0x7362de7c9a12a54, 0xf971e28525d978bc, 0xf9e36a9529d0f3bd, 0xaea48e8b461db588, 0x1c33797cdc407}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x89c16fec8e55f16c, 0x1ff4d48fd451c2bb, 0x7b18fb54214c6532, 0x9ef491c4f579c67e, 0x38cd883c7d0cd40e, 0x499dc1361f2d123, 0x1335e051324fdbc7, 0xfd4fddbdc2a7f}, {0xcb3f9f71c926dc70, 0xebc2bb04385445c8, 0x6fd7a4eaca478a40, 0x151e3f61abfba2cb, 0x761770fecf1ee8c0, 0xd021aa20f5cd88a9, 0xbfcf8539dcdfb928, 0x18506735ab454e}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x2df9cd51f27fb63e, 0x70ba06f5979446db, 0xa3fbb7300b16af8d, 0x992c1287f9a1c577, 0xb243e4491d37450e, 0x8473713e201019e0, 0xef9c23305e454581, 0x67b9998e13889}, {0x452150d05e768c9b, 0x4fe2b493696f8226, 0xac671e6158fedc93, 0x670fe96577281a7c, 0xa28c4be3e9ad4931, 0x6f20e70a714aae4b, 0x9890ecbc08f30c2e, 0x24a2c3ff722e18}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_MINUS = {{{{0x2d2d051047dbd624, 0xfca1b15a916f7be5, 0x441312cd63f16c3f, 0xff7438fdce0ea446, 0x9fdef5936357fab, 0xf9ae02a9421f5416, 0xf7b77ef02bd1c1f8, 0x16f3f63378f96e}, {0x407ce7ffebc92b8e, 0x55fe79acf73aa929, 0x3337fb9216805495, 0xf6db0b7b43176f92, 0x853ee17ab74bf23d, 0xec5cbc949d4b0709, 0xce952df77dfd072f, 0xb16ebf531bef1}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x230916c16a0947e7, 0xa5a77aa3652d437b, 0x945736cf18a280b2, 0xe714d31d874572f1, 0x41bfcb5db198a4ac, 0x33c4ca4686e96f44, 0xe393b5d625debb73, 0x13895d37996b33}, {0xada606e483b73739, 0xe88daed540f3341d, 0xf398a06307ae9e8e, 0x61c2dfd85ef3c1a5, 0xbd29fb1cf683401c, 0x9aae565349a44142, 0x87a7c3de59a75f0d, 0x24c83660611a31}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x102024e8a598a5e8, 0x2bc941882c5f9245, 0xd6d60580934ea556, 0x86a4552d3207e718, 0x96eee147b2e294b5, 0x3ab66e6e93801f2e, 0xc8a390dff6441c41, 0x86407d5d6eb31}, {0xbd273dcfdc4cc333, 0x739eb9e099d67c56, 0x72a7fb0c255bdc52, 0x478eeb66fd200a09, 0x18965b28ca1ee442, 0xafff9738826e71d0, 0xa5a3e52397324a99, 0x22814353549863}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_PLUS = {{{{0xf74e278739139769, 0x58be58577063e414, 0x7eb0edc56149472a, 0xcca10962fd516fae, 0x1ff09b1f54235f02, 0xfaba3bd39b494a4e, 0x59131f688c981aa3, 0x1d51b125134e7b}, {0x65f0988abfc680f0, 0xa7ec54e82f4f2ab4, 0x9cf1b55adef48a73, 0xcd7037d25eae0ef2, 0xf92fd0cacb35869a, 0x4afc0821a671bcfa, 0x2d0ff9a442d5b9a3, 0x2478f31e1b0ea8}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x357c1914bd227f58, 0x8c0d19f6290630f6, 0x49b100de6a80c2b8, 0xa1d365344bbb92d1, 0x20457092ad863380, 0x8274b2b3309427b, 0x57f899ef3140dadd, 0x25503c1a2afc85}, {0x85cd3fa621493a3d, 0x92741aa3b1184149, 0x57dc1c77e580e8ac, 0xd58459bf1d974197, 0x7a88578d886499ce, 0x22ca10e6b3805ca4, 0x2762f95867f32794, 0x1f3dac32b57131}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x2f94ba52e8516cfd, 0xc0cc95a65ef5d3f0, 0x78cd1286af1a549, 0xc58dfb5ca45bda4f, 0xfcb50d3ddcf80ec3, 0x90c191d252c72d27, 0x33d25fd46c7f1402, 0x1c30b1fd3aa2f7}, {0x2a5802b9b8b9188f, 0xeb15e1196bf95ce6, 0x8667c8dd3375a95d, 0x6c5e7827fd12c65d, 0x7b22fdd30e62d493, 0xc59204eeb4f57f61, 0x4c18ee49e098a97f, 0x230ac44ef70718}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_MINUS = {{{{0x2d2d051047dbd624, 0xfca1b15a916f7be5, 0x441312cd63f16c3f, 0xff7438fdce0ea446, 0x9fdef5936357fab, 0xf9ae02a9421f5416, 0xf7b77ef02bd1c1f8, 0x16f3f63378f96e}, {0x407ce7ffebc92b8e, 0x55fe79acf73aa929, 0x3337fb9216805495, 0xf6db0b7b43176f92, 0x853ee17ab74bf23d, 0xec5cbc949d4b0709, 0xce952df77dfd072f, 0xb16ebf531bef1}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x230916c16a0947e7, 0xa5a77aa3652d437b, 0x945736cf18a280b2, 0xe714d31d874572f1, 0x41bfcb5db198a4ac, 0x33c4ca4686e96f44, 0xe393b5d625debb73, 0x13895d37996b33}, {0xada606e483b73739, 0xe88daed540f3341d, 0xf398a06307ae9e8e, 0x61c2dfd85ef3c1a5, 0xbd29fb1cf683401c, 0x9aae565349a44142, 0x87a7c3de59a75f0d, 0x24c83660611a31}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x102024e8a598a5e8, 0x2bc941882c5f9245, 0xd6d60580934ea556, 0x86a4552d3207e718, 0x96eee147b2e294b5, 0x3ab66e6e93801f2e, 0xc8a390dff6441c41, 0x86407d5d6eb31}, {0xbd273dcfdc4cc333, 0x739eb9e099d67c56, 0x72a7fb0c255bdc52, 0x478eeb66fd200a09, 0x18965b28ca1ee442, 0xafff9738826e71d0, 0xa5a3e52397324a99, 0x22814353549863}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_CHALLENGE = {{{{0x6e2338651dd6b809, 0xa0b4a74a516bc856, 0xcef4dc03ae64bc, 0x7e04105e61ad1ccc, 0x824a280776a0a61a, 0xb0cbb7066de4598f, 0x91147e22289f3e7c, 0x1159e486ae42c7}, {0x4ad227aedc9e33c9, 0xe3050d4ccb8cd5e6, 0x859f12c8125c3c76, 0xc70299649231184f, 0xde2bae7b1651dfd, 0x38ae5d76b98a0bf5, 0x4afcb9cdd51c75ac, 0x1cd37f9c7ba50e}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x9712f28d07df37f6, 0x3c0fdc3f6b148b77, 0x498753d83c208925, 0x3e9d6e57123afc04, 0xff41fe276d7b38de, 0x6fd059cabd88b549, 0x206a33c3360330d5, 0x5b66cd2ad497f}, {0x9b6c484b0169169b, 0x6854e01c5c87805c, 0x3217830c5fa9e618, 0x26b5dc3839eb347d, 0xc1b369290ec7c6b1, 0x7a2f3702ffd2460d, 0x2a17887c3a6da2f1, 0x16971eee1d9a05}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x6274b50ea5c661fa, 0xe3c3462c17e5a676, 0x73863c6c6e3e939d, 0x36adea15c2e668ab, 0x20ea8297e2acacbb, 0x720c5bd322a623a1, 0xa914186e4ebaa9a2, 0x4e9c355009afd}, {0x8dbb2dc3278a80f0, 0x9c6baecf247fbe32, 0x2fca5dddae71c5fd, 0x6e944e9e7de384cd, 0xeef1669c4da7aede, 0x6fb68320ff68c3a7, 0x9150f158b68d6cdb, 0x22c905c30fedc8}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_curve_t CURVE_E0 = {{{0x0}}, {{0x1}}}; -const ec_point_t CURVE_E0_A24 = {{{0x0}}, {{0x1}}}; -const ibz_mat_2x2_t ACTION_I = {{{{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x822e,0xa4c8,0x4610,0x5a8b,0x2415,0xfeac,0x27bd,0xb1f5,0x1e46,0xb5f,0x52cf,0xf527,0x53e,0x2406,0x8456,0x58a3,0x55b0,0x54e8,0x90e1,0x5e13,0x3229,0x4390,0x8aba,0x2806,0xb85f,0xfabd,0xf21c,0x5c49,0x2802,0x1c51,0x64aa,0x7530,0x8d3f,0x229a,0x2de7,0x3aab,0xfa6,0x4f85,0xca7b,0x5c65,0x1198,0xaa3,0x4a56,0xcad6,0xa026,0xe372,0xd9e3,0x99a0,0x1ab2,0x38}}}, {{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x257b,0x88f,0xfa56,0x95aa,0xf879,0x9e34,0x5ab5,0xfea2,0x4f0b,0x7758,0x41d9,0x1edc,0x2b25,0x4ef,0x23a0,0xedeb,0xfe6f,0x9288,0x8fed,0xb5ee,0xb32c,0x240b,0x753d,0x9ce5,0x5aeb,0xdeca,0x191,0xa317,0xf4e6,0x2c6f,0x6fed,0xf7f0,0xfb81,0xa76f,0xcb2f,0x21c4,0x5d27,0x5125,0xb7ae,0x7953,0x3ff5,0x9b6c,0x21c2,0x6861,0x4476,0xcc4d,0xcfe,0x75eb,0x10dc,0x68}}}}, {{{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x9ac1,0x5782,0xe01b,0x8f27,0x73fc,0x2e55,0x613d,0x3632,0xba61,0x3dc1,0xcfeb,0x7133,0x4a27,0xd9f8,0xd3ae,0xd0f,0x6ce5,0xa488,0x75cd,0xfecc,0x50d3,0x3560,0x5752,0x8933,0x5c00,0x3c5b,0x583d,0x303f,0x69c5,0x3a5c,0xd22,0x4af1,0x52a1,0x3fb9,0x797b,0xcc3b,0xc5ff,0x2557,0x8699,0x562d,0x2e84,0x4437,0xc1f7,0xe16d,0x17b6,0xeed8,0x6dda,0x75d9,0x7954,0x38}}}, {{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x7dd2,0x5b37,0xb9ef,0xa574,0xdbea,0x153,0xd842,0x4e0a,0xe1b9,0xbd26,0x3743,0x35e3,0x1d37,0xb434,0x9134,0xcdd8,0x1fe9,0x2753,0xf73c,0x7d67,0x92d,0xbb80,0x7f34,0xd0e,0x96a0,0x9889,0x4088,0xd457,0x238f,0xa756,0xb8b0,0x294b,0x4357,0x8b14,0xf093,0xa16b,0xa910,0x8b65,0x8a58,0xf9c,0xcdcf,0xe3db,0x3f9e,0xc7e2,0xe1a,0x1fe6,0xfd20,0x5411,0x475,0xb8}}}}}; -const ibz_mat_2x2_t ACTION_J = {{{{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x53e2,0xb9aa,0x7cd,0xfbce,0x1786,0x909,0xcbe1,0x91b7,0x6c2f,0x3100,0x8ce2,0x6711,0xfad9,0xcb2,0x320d,0x1698,0x9936,0xbcd1,0xf50d,0x2ce4,0xd029,0xc55c,0xa859,0x4872,0x7c20,0xf3ac,0x11d9,0xe67c,0xf3e,0x8965,0x8b84,0x3900,0x4281,0x5674,0x8d53,0x6101,0x31a5,0xbf38,0xcf4d,0x4e17,0x5651,0x1d6d,0x5c60,0x48a,0xde9,0xf8e2,0x6a63,0x88ca,0xc38e,0x36}}}, {{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0xc805,0x885a,0xd41e,0xacd,0x15f1,0x3188,0x690b,0x64a4,0x8291,0xed45,0xa35d,0xed6f,0x1b45,0x37f3,0x1f5,0xfb40,0x48fe,0x3599,0x7340,0xd12e,0xa8a8,0x9fb7,0x22b4,0x9977,0xb379,0x8172,0x574c,0x6ff6,0x2c45,0x589e,0x1bd2,0x3868,0x24e6,0x8eaf,0x4af3,0xad81,0x3d8b,0x9011,0x1195,0xe06,0x8bd4,0xc1ee,0xcbad,0x3653,0x3365,0x35d7,0x4728,0x51e5,0xdce,0x5b}}}}, {{{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0xd419,0xdb92,0xdb57,0xe34b,0x69cd,0xbc6e,0x768a,0x8c63,0xf85c,0x1fca,0xd738,0x293,0xf4fb,0xe1bb,0x3f5d,0xa950,0x9c75,0x17e1,0x3f25,0x1832,0x1847,0x6a78,0x1768,0xd9e3,0xedf6,0x6f05,0x6bdc,0x5e0f,0x8dbd,0xdb9f,0xfc08,0x669b,0xbbbe,0x8b9e,0xfd0d,0x6942,0xdc1c,0x29a6,0x401e,0xcca4,0x8a3e,0x9ee2,0x9a7d,0x23a0,0x239f,0x448e,0xb7b5,0x716b,0x9da3,0x2b}}}, {{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0xac1e,0x4655,0xf832,0x431,0xe879,0xf6f6,0x341e,0x6e48,0x93d0,0x9785,0xfd30,0xc3f8,0x279c,0xcb87,0xe37d,0xfe3,0xdc64,0xbf69,0x930f,0xae96,0x6b2d,0x39b3,0x6195,0xeca2,0xd2de,0x9f9a,0x20cb,0x4a25,0x3c53,0x3a42,0x91d6,0x657b,0x8e15,0x573a,0x9127,0x7b15,0x8711,0x1bb2,0x8586,0x1dea,0x8916,0xd111,0x2d94,0x8e2e,0xa058,0xa76,0x6ca0,0x64e8,0x5b99,0xb9}}}}}; -const ibz_mat_2x2_t ACTION_K = {{{{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x5b9f,0x25ee,0x122c,0xed15,0xbaee,0x4d2c,0x2a4b,0xf9df,0xddb0,0xa7de,0xbfc9,0xc687,0xa41,0x793a,0x5337,0x94c7,0xf7e5,0xae44,0xf53d,0xd1be,0xc28d,0x16b8,0x25e0,0x18d9,0xef55,0x7fc1,0xf8dd,0xa414,0x867e,0x69b6,0xa158,0xd472,0x8197,0xac11,0x1d8e,0xbba1,0xa476,0x3a0f,0x698b,0x14a7,0xed3f,0xabd3,0xea8,0xa036,0xf3df,0x828a,0xc3f,0x32d0,0x2cb8,0xc9}}}, {{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x8350,0x5396,0xc5bc,0xf2ef,0xddf2,0xb7eb,0x8199,0x9019,0x2bc2,0xaad8,0xc8cc,0x783d,0x2106,0xb3ac,0xee4d,0x933d,0xe79,0xd197,0x6276,0x72e,0x94e2,0xda67,0x2fdb,0x6857,0x58d0,0x5bb8,0x5564,0x8a78,0xfdab,0x5b1a,0xfd2d,0xeb82,0x524e,0x3b70,0x22e5,0x4f48,0x78bf,0x3823,0x3b77,0x3874,0xac01,0xba36,0xd345,0xcd62,0xe28d,0xcf00,0xa286,0x6fe7,0x4eab,0x31}}}}, {{{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x62e4,0x1b04,0xae30,0x7650,0xf5e0,0x65cf,0x1fcc,0x8486,0xe766,0x1861,0xae85,0x1df5,0x87e,0xcd2f,0xaf4c,0x4e45,0xf712,0xf583,0x8287,0xb4a3,0x473,0xd091,0x2015,0xe441,0x437c,0xe472,0x9b77,0x3adf,0x5de5,0xd627,0xb1d5,0x5f80,0x910,0x5175,0x69d0,0x7af3,0x4a2,0x5348,0x140e,0x1f3a,0x57c0,0xc9e2,0x532,0xeda6,0x93a9,0x55ee,0x1001,0xd3ec,0xfd1a,0xd5}}}, {{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0xa461,0xda11,0xedd3,0x12ea,0x4511,0xb2d3,0xd5b4,0x620,0x224f,0x20a7,0xca49,0x6482,0x1834,0x5f00,0xc253,0x91b4,0x7db4,0xcdf6,0x92df,0x9bc,0x78c9,0xe857,0xe40e,0x1c3b,0x5faa,0x1385,0x39c8,0x8c8c,0xc513,0x59f0,0x7c02,0xca09,0x4efe,0x19d,0xec,0x2076,0x1440,0xa0db,0xeb48,0x575a,0xf228,0x42aa,0x7b4c,0xf282,0xba61,0x80cd,0xcac4,0xbae2,0xf26f,0x26}}}}}; -const ibz_mat_2x2_t ACTION_GEN2 = {{{{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x822e,0xa4c8,0x4610,0x5a8b,0x2415,0xfeac,0x27bd,0xb1f5,0x1e46,0xb5f,0x52cf,0xf527,0x53e,0x2406,0x8456,0x58a3,0x55b0,0x54e8,0x90e1,0x5e13,0x3229,0x4390,0x8aba,0x2806,0xb85f,0xfabd,0xf21c,0x5c49,0x2802,0x1c51,0x64aa,0x7530,0x8d3f,0x229a,0x2de7,0x3aab,0xfa6,0x4f85,0xca7b,0x5c65,0x1198,0xaa3,0x4a56,0xcad6,0xa026,0xe372,0xd9e3,0x99a0,0x1ab2,0x38}}}, {{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x257b,0x88f,0xfa56,0x95aa,0xf879,0x9e34,0x5ab5,0xfea2,0x4f0b,0x7758,0x41d9,0x1edc,0x2b25,0x4ef,0x23a0,0xedeb,0xfe6f,0x9288,0x8fed,0xb5ee,0xb32c,0x240b,0x753d,0x9ce5,0x5aeb,0xdeca,0x191,0xa317,0xf4e6,0x2c6f,0x6fed,0xf7f0,0xfb81,0xa76f,0xcb2f,0x21c4,0x5d27,0x5125,0xb7ae,0x7953,0x3ff5,0x9b6c,0x21c2,0x6861,0x4476,0xcc4d,0xcfe,0x75eb,0x10dc,0x68}}}}, {{{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x9ac1,0x5782,0xe01b,0x8f27,0x73fc,0x2e55,0x613d,0x3632,0xba61,0x3dc1,0xcfeb,0x7133,0x4a27,0xd9f8,0xd3ae,0xd0f,0x6ce5,0xa488,0x75cd,0xfecc,0x50d3,0x3560,0x5752,0x8933,0x5c00,0x3c5b,0x583d,0x303f,0x69c5,0x3a5c,0xd22,0x4af1,0x52a1,0x3fb9,0x797b,0xcc3b,0xc5ff,0x2557,0x8699,0x562d,0x2e84,0x4437,0xc1f7,0xe16d,0x17b6,0xeed8,0x6dda,0x75d9,0x7954,0x38}}}, {{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x7dd2,0x5b37,0xb9ef,0xa574,0xdbea,0x153,0xd842,0x4e0a,0xe1b9,0xbd26,0x3743,0x35e3,0x1d37,0xb434,0x9134,0xcdd8,0x1fe9,0x2753,0xf73c,0x7d67,0x92d,0xbb80,0x7f34,0xd0e,0x96a0,0x9889,0x4088,0xd457,0x238f,0xa756,0xb8b0,0x294b,0x4357,0x8b14,0xf093,0xa16b,0xa910,0x8b65,0x8a58,0xf9c,0xcdcf,0xe3db,0x3f9e,0xc7e2,0xe1a,0x1fe6,0xfd20,0x5411,0x475,0xb8}}}}}; -const ibz_mat_2x2_t ACTION_GEN3 = {{{{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x6b08,0x2f39,0xa6ef,0x2b2c,0x9dce,0x83da,0x79cf,0x21d6,0xc53b,0x272,0xb4e2,0x43a1,0x9147,0x479,0xe5f7,0x4adb,0xb240,0x46fa,0x706,0xb33a,0x9ed4,0x83fe,0x1e81,0x52c7,0xc1bf,0x40d8,0x9b4e,0xb9b3,0xc169,0xb4ae,0x86c4,0xa656,0xd02b,0x935e,0xecda,0x3be1,0xfd01,0x74d3,0xf74e,0x8b3f,0xa3a8,0x8b47,0x9855,0xb10c,0xae28,0xefd6,0xda5,0x880f,0x7eb4,0xaf}}}, {{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0xf6c0,0x4874,0x673a,0x503c,0x8735,0x67de,0x61e0,0xb1a3,0xe8ce,0xb24e,0xf29b,0x8625,0x2335,0x9e71,0x92ca,0x7495,0x23b7,0xe411,0x8196,0xc38e,0xadea,0xe1e1,0x4bf8,0x9b2e,0x8732,0x301e,0xac6f,0x986,0x1096,0xc287,0x45df,0x182c,0x9034,0x9b0f,0xb11,0x67a3,0x4d59,0xf09b,0xe4a1,0xc3ac,0x65e4,0x2ead,0x76b8,0xcf5a,0x3bed,0x8112,0x2a13,0x63e8,0x8f55,0x61}}}}, {{{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0xb76d,0x998a,0xddb9,0x3939,0xeee5,0xf561,0xebe3,0xe14a,0x595e,0xaec6,0xd391,0x39e3,0x1f91,0x5dda,0x986,0x5b30,0x4ad,0x5e35,0x5a79,0x8b7f,0x348d,0x4fec,0x375d,0xb18b,0xa4fb,0xd5b0,0x620c,0x4727,0xfbc1,0x8afd,0x8495,0xd8c6,0x72f,0x65ac,0x3b44,0x1abf,0x510e,0xa77f,0xe35b,0x9168,0xdc61,0x718c,0x2e3a,0x287,0x1dab,0x19b3,0x92c8,0xf3a2,0xb7b,0x32}}}, {{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x94f8,0xd0c6,0x5910,0xd4d3,0x6231,0x7c25,0x8630,0xde29,0x3ac4,0xc613,0xd530,0xe768,0x912e,0xd3c0,0x2f93,0xdba0,0xc359,0x3540,0x8117,0x2841,0x9c82,0x7b11,0xeb6d,0xe24d,0x8d3f,0x526e,0x9757,0x76ed,0x8a28,0xef8,0x9696,0xf825,0x6a,0x1a50,0x31a0,0xa035,0xbbb5,0x6616,0x5d85,0xe0c2,0x3bbe,0x6337,0xf19f,0xe1ab,0x18,0x1382,0xc95e,0x65a3,0xa073,0x40}}}}}; -const ibz_mat_2x2_t ACTION_GEN4 = {{{{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x2dd0,0x12f7,0x8916,0x768a,0x5d77,0xa696,0x9525,0x7cef,0x6ed8,0xd3ef,0xdfe4,0xe343,0x520,0xbc9d,0xa99b,0xca63,0x7bf2,0xd722,0x7a9e,0xe8df,0x6146,0xb5c,0x92f0,0x8c6c,0xf7aa,0xbfe0,0x7c6e,0x520a,0x433f,0x34db,0x50ac,0xea39,0xc0cb,0x5608,0x8ec7,0x5dd0,0xd23b,0x9d07,0xb4c5,0x8a53,0xf69f,0x55e9,0x754,0xd01b,0x79ef,0xc145,0x61f,0x1968,0x965c,0x64}}}, {{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x41a8,0x29cb,0xe2de,0x7977,0xeef9,0xdbf5,0xc0cc,0x480c,0x15e1,0x556c,0xe466,0x3c1e,0x1083,0xd9d6,0xf726,0xc99e,0x873c,0x68cb,0x313b,0x397,0xca71,0xed33,0x97ed,0x342b,0x2c68,0x2ddc,0x2ab2,0xc53c,0x7ed5,0xad8d,0x7e96,0x75c1,0x2927,0x9db8,0x1172,0xa7a4,0xbc5f,0x9c11,0x1dbb,0x9c3a,0x5600,0xdd1b,0x69a2,0xe6b1,0x7146,0x6780,0xd143,0xb7f3,0xa755,0x18}}}}, {{{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x3172,0xd82,0x5718,0x3b28,0xfaf0,0x32e7,0xfe6,0x4243,0xf3b3,0x8c30,0xd742,0xefa,0x843f,0x6697,0xd7a6,0x2722,0xfb89,0xfac1,0xc143,0xda51,0x8239,0xe848,0x900a,0x7220,0x21be,0xf239,0xcdbb,0x9d6f,0xaef2,0xeb13,0x58ea,0x2fc0,0x8488,0x28ba,0xb4e8,0x3d79,0x251,0x29a4,0xa07,0xf9d,0x2be0,0x64f1,0x299,0xf6d3,0x49d4,0xaaf7,0x800,0x69f6,0xfe8d,0x6a}}}, {{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0xd231,0xed08,0x76e9,0x8975,0xa288,0x5969,0x6ada,0x8310,0x9127,0xf496,0xaa2d,0x47c6,0x1d55,0x1b9d,0x6bef,0x5c18,0xf9a7,0xa518,0xd7e,0xf29c,0xda0f,0xf3b3,0x76fe,0xa8a8,0x5754,0xd366,0xb636,0xde96,0x852,0x8ecc,0xccae,0xb442,0xfca,0x57a6,0x8fb3,0x7e46,0xe67b,0x3de2,0xa00e,0xe1ae,0xe8c7,0x9894,0x82a0,0xc29d,0x3451,0x4213,0xd0e4,0xd44a,0x88cb,0x8b}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_UNDISTORTED_GEN = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2f}}}, {{._mp_alloc = 0, ._mp_size = 33, ._mp_d = (mp_limb_t[]) {0xd1c1,0x4acf,0xea1c,0x9efb,0xde65,0x1c30,0xe5e,0x92ff,0x9031,0xadb3,0xac6b,0xa6e1,0x40c9,0xcfdf,0xd9f6,0x3fcb,0x6ca9,0xfde9,0x3e37,0xa52e,0xe3c5,0x1855,0xa01,0x11fd,0x3cdf,0x1ecc,0x318a,0x9c0c,0x31c6,0xda41,0x2065,0xd27f,0x148f}}}, {{._mp_alloc = 0, ._mp_size = 34, ._mp_d = (mp_limb_t[]) {0x2651,0x5ce6,0x8d81,0xc6c,0x8011,0xe8,0x76e8,0xf200,0x83a6,0x53dd,0x21c8,0x4a4c,0xcdfe,0xd5e6,0x8812,0x2d1,0x13b0,0x7da5,0x638f,0xe681,0x397f,0xcba6,0x2308,0x8001,0x90ee,0x9192,0xeb6c,0x66fc,0x4f59,0xd7c8,0x865f,0x32e2,0x641f,0x2}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_DISTORTION_ENDO = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 34, ._mp_d = (mp_limb_t[]) {0x6411,0x75eb,0x930b,0x5585,0xa500,0x63ee,0x180f,0xf861,0x366a,0x1e88,0xebd2,0x2f7,0x80da,0xeec4,0x5e4b,0xb27b,0x9c18,0x974a,0xa082,0x8f32,0x3c1,0x62b1,0x80f3,0x2258,0xcfd,0xa073,0x5874,0x4603,0x22c8,0xa576,0x292b,0xb895,0xac23,0xb}}}, {{._mp_alloc = 0, ._mp_size = 33, ._mp_d = (mp_limb_t[]) {0xcbaf,0xa2ff,0xe66d,0xf297,0x48aa,0xd8da,0x9c8e,0x46de,0x64f4,0x77e2,0x9ac5,0x7c21,0x5419,0xb16b,0x4768,0x60c9,0xd3ad,0x864,0x2dc1,0x2,0xb239,0xe38,0x26d3,0x176c,0x2111,0x1b64,0xfdbc,0x4b36,0x249f,0x1151,0x8a54,0x332d,0x143a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 34, ._mp_d = (mp_limb_t[]) {0xb8d4,0xc97b,0x68a5,0xf1fc,0xcaea,0x1cfa,0xcc66,0x1af8,0x9a15,0x9012,0x7ea,0x390a,0x75fd,0x9a00,0x8094,0xb3db,0x4547,0x9ce8,0x99a1,0x91fc,0x46a6,0xb0b0,0x56e9,0x6c5c,0x128c,0x5d38,0x7b27,0x2240,0xea36,0xd094,0x20,0xb736,0xe1ff,0x15}}}}}; -#elif 8*DIGIT_LEN == 32 -const ec_basis_t BASIS_EVEN = {{{{0xf893b25235cd05, 0xcfad0c31816a3767, 0x24d6633b878c9852, 0x947ef3f6bd7e54a9, 0xcfcc6931acebc9ec, 0x7a593c6f226d62a7, 0xd773da3276d4514e, 0xf93f309a42dec}, {0x70e6b5b84d87aff3, 0x3b39ea4b8a9af50f, 0x33bb72fc45f05294, 0x1103f3d679fb626a, 0x29e23daba686e722, 0xd7683a594c898767, 0x41c4ad3db823bae1, 0x13f1daa2e21221}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xac16948532220971, 0x5652f704391431a5, 0xca5ee11424c4943d, 0xaa2208832540971a, 0x9e289f9c846e5c2b, 0xde48d5cd32bd5fe2, 0x913b3efa3bc42565, 0xd203dedb14213}, {0x5872c77992dd67c0, 0xb937a740922a8754, 0x21f7d1669ef949f, 0x2a7139b6c8587d0f, 0xf8bab24328aa27ab, 0xdab9bd3b2ddeec79, 0xe83b475f203bcb65, 0x556741a934ed3}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x90f4d4d80ba9ed72, 0xc8b9a440304ca99d, 0xc943b3a8997d4b88, 0xf08d352edc87530f, 0x767ca098b77d7071, 0x50dba761679c1732, 0x545a298536db6db9, 0x1381accb5f9aff}, {0x97233d48b02e6714, 0x684847c5bc2333e7, 0x18886606aeba8b01, 0xe4d42f848dafb6fc, 0xcc8ac9374d922260, 0x63189d0ed97c756, 0xa21cc3b155e35e31, 0x17400333e40769}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_PLUS = {{{{0xcde42ca0952857f6, 0x43986ee6663ef6cd, 0x55871379b845a923, 0x76ed1adf6ebef960, 0xabc4b150fc745f1e, 0x1c8a9c2defeb0f13, 0x13dd17be34fd733, 0x19e43fe41e4c43}, {0x2fa1833df935bc09, 0x69f359ab51c26ad9, 0xf9586cab92e541d6, 0x7362de7c9a12a54, 0xf971e28525d978bc, 0xf9e36a9529d0f3bd, 0xaea48e8b461db588, 0x1c33797cdc407}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x89c16fec8e55f16c, 0x1ff4d48fd451c2bb, 0x7b18fb54214c6532, 0x9ef491c4f579c67e, 0x38cd883c7d0cd40e, 0x499dc1361f2d123, 0x1335e051324fdbc7, 0xfd4fddbdc2a7f}, {0xcb3f9f71c926dc70, 0xebc2bb04385445c8, 0x6fd7a4eaca478a40, 0x151e3f61abfba2cb, 0x761770fecf1ee8c0, 0xd021aa20f5cd88a9, 0xbfcf8539dcdfb928, 0x18506735ab454e}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x2df9cd51f27fb63e, 0x70ba06f5979446db, 0xa3fbb7300b16af8d, 0x992c1287f9a1c577, 0xb243e4491d37450e, 0x8473713e201019e0, 0xef9c23305e454581, 0x67b9998e13889}, {0x452150d05e768c9b, 0x4fe2b493696f8226, 0xac671e6158fedc93, 0x670fe96577281a7c, 0xa28c4be3e9ad4931, 0x6f20e70a714aae4b, 0x9890ecbc08f30c2e, 0x24a2c3ff722e18}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_MINUS = {{{{0x2d2d051047dbd624, 0xfca1b15a916f7be5, 0x441312cd63f16c3f, 0xff7438fdce0ea446, 0x9fdef5936357fab, 0xf9ae02a9421f5416, 0xf7b77ef02bd1c1f8, 0x16f3f63378f96e}, {0x407ce7ffebc92b8e, 0x55fe79acf73aa929, 0x3337fb9216805495, 0xf6db0b7b43176f92, 0x853ee17ab74bf23d, 0xec5cbc949d4b0709, 0xce952df77dfd072f, 0xb16ebf531bef1}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x230916c16a0947e7, 0xa5a77aa3652d437b, 0x945736cf18a280b2, 0xe714d31d874572f1, 0x41bfcb5db198a4ac, 0x33c4ca4686e96f44, 0xe393b5d625debb73, 0x13895d37996b33}, {0xada606e483b73739, 0xe88daed540f3341d, 0xf398a06307ae9e8e, 0x61c2dfd85ef3c1a5, 0xbd29fb1cf683401c, 0x9aae565349a44142, 0x87a7c3de59a75f0d, 0x24c83660611a31}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x102024e8a598a5e8, 0x2bc941882c5f9245, 0xd6d60580934ea556, 0x86a4552d3207e718, 0x96eee147b2e294b5, 0x3ab66e6e93801f2e, 0xc8a390dff6441c41, 0x86407d5d6eb31}, {0xbd273dcfdc4cc333, 0x739eb9e099d67c56, 0x72a7fb0c255bdc52, 0x478eeb66fd200a09, 0x18965b28ca1ee442, 0xafff9738826e71d0, 0xa5a3e52397324a99, 0x22814353549863}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_PLUS = {{{{0xf74e278739139769, 0x58be58577063e414, 0x7eb0edc56149472a, 0xcca10962fd516fae, 0x1ff09b1f54235f02, 0xfaba3bd39b494a4e, 0x59131f688c981aa3, 0x1d51b125134e7b}, {0x65f0988abfc680f0, 0xa7ec54e82f4f2ab4, 0x9cf1b55adef48a73, 0xcd7037d25eae0ef2, 0xf92fd0cacb35869a, 0x4afc0821a671bcfa, 0x2d0ff9a442d5b9a3, 0x2478f31e1b0ea8}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x357c1914bd227f58, 0x8c0d19f6290630f6, 0x49b100de6a80c2b8, 0xa1d365344bbb92d1, 0x20457092ad863380, 0x8274b2b3309427b, 0x57f899ef3140dadd, 0x25503c1a2afc85}, {0x85cd3fa621493a3d, 0x92741aa3b1184149, 0x57dc1c77e580e8ac, 0xd58459bf1d974197, 0x7a88578d886499ce, 0x22ca10e6b3805ca4, 0x2762f95867f32794, 0x1f3dac32b57131}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x2f94ba52e8516cfd, 0xc0cc95a65ef5d3f0, 0x78cd1286af1a549, 0xc58dfb5ca45bda4f, 0xfcb50d3ddcf80ec3, 0x90c191d252c72d27, 0x33d25fd46c7f1402, 0x1c30b1fd3aa2f7}, {0x2a5802b9b8b9188f, 0xeb15e1196bf95ce6, 0x8667c8dd3375a95d, 0x6c5e7827fd12c65d, 0x7b22fdd30e62d493, 0xc59204eeb4f57f61, 0x4c18ee49e098a97f, 0x230ac44ef70718}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_MINUS = {{{{0x2d2d051047dbd624, 0xfca1b15a916f7be5, 0x441312cd63f16c3f, 0xff7438fdce0ea446, 0x9fdef5936357fab, 0xf9ae02a9421f5416, 0xf7b77ef02bd1c1f8, 0x16f3f63378f96e}, {0x407ce7ffebc92b8e, 0x55fe79acf73aa929, 0x3337fb9216805495, 0xf6db0b7b43176f92, 0x853ee17ab74bf23d, 0xec5cbc949d4b0709, 0xce952df77dfd072f, 0xb16ebf531bef1}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x230916c16a0947e7, 0xa5a77aa3652d437b, 0x945736cf18a280b2, 0xe714d31d874572f1, 0x41bfcb5db198a4ac, 0x33c4ca4686e96f44, 0xe393b5d625debb73, 0x13895d37996b33}, {0xada606e483b73739, 0xe88daed540f3341d, 0xf398a06307ae9e8e, 0x61c2dfd85ef3c1a5, 0xbd29fb1cf683401c, 0x9aae565349a44142, 0x87a7c3de59a75f0d, 0x24c83660611a31}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x102024e8a598a5e8, 0x2bc941882c5f9245, 0xd6d60580934ea556, 0x86a4552d3207e718, 0x96eee147b2e294b5, 0x3ab66e6e93801f2e, 0xc8a390dff6441c41, 0x86407d5d6eb31}, {0xbd273dcfdc4cc333, 0x739eb9e099d67c56, 0x72a7fb0c255bdc52, 0x478eeb66fd200a09, 0x18965b28ca1ee442, 0xafff9738826e71d0, 0xa5a3e52397324a99, 0x22814353549863}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_CHALLENGE = {{{{0x6e2338651dd6b809, 0xa0b4a74a516bc856, 0xcef4dc03ae64bc, 0x7e04105e61ad1ccc, 0x824a280776a0a61a, 0xb0cbb7066de4598f, 0x91147e22289f3e7c, 0x1159e486ae42c7}, {0x4ad227aedc9e33c9, 0xe3050d4ccb8cd5e6, 0x859f12c8125c3c76, 0xc70299649231184f, 0xde2bae7b1651dfd, 0x38ae5d76b98a0bf5, 0x4afcb9cdd51c75ac, 0x1cd37f9c7ba50e}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x9712f28d07df37f6, 0x3c0fdc3f6b148b77, 0x498753d83c208925, 0x3e9d6e57123afc04, 0xff41fe276d7b38de, 0x6fd059cabd88b549, 0x206a33c3360330d5, 0x5b66cd2ad497f}, {0x9b6c484b0169169b, 0x6854e01c5c87805c, 0x3217830c5fa9e618, 0x26b5dc3839eb347d, 0xc1b369290ec7c6b1, 0x7a2f3702ffd2460d, 0x2a17887c3a6da2f1, 0x16971eee1d9a05}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x6274b50ea5c661fa, 0xe3c3462c17e5a676, 0x73863c6c6e3e939d, 0x36adea15c2e668ab, 0x20ea8297e2acacbb, 0x720c5bd322a623a1, 0xa914186e4ebaa9a2, 0x4e9c355009afd}, {0x8dbb2dc3278a80f0, 0x9c6baecf247fbe32, 0x2fca5dddae71c5fd, 0x6e944e9e7de384cd, 0xeef1669c4da7aede, 0x6fb68320ff68c3a7, 0x9150f158b68d6cdb, 0x22c905c30fedc8}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_curve_t CURVE_E0 = {{{0x0}}, {{0x1}}}; -const ec_point_t CURVE_E0_A24 = {{{0x0}}, {{0x1}}}; -const ibz_mat_2x2_t ACTION_I = {{{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0xa4c8822e,0x5a8b4610,0xfeac2415,0xb1f527bd,0xb5f1e46,0xf52752cf,0x2406053e,0x58a38456,0x54e855b0,0x5e1390e1,0x43903229,0x28068aba,0xfabdb85f,0x5c49f21c,0x1c512802,0x753064aa,0x229a8d3f,0x3aab2de7,0x4f850fa6,0x5c65ca7b,0xaa31198,0xcad64a56,0xe372a026,0x99a0d9e3,0x381ab2}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x88f257b,0x95aafa56,0x9e34f879,0xfea25ab5,0x77584f0b,0x1edc41d9,0x4ef2b25,0xedeb23a0,0x9288fe6f,0xb5ee8fed,0x240bb32c,0x9ce5753d,0xdeca5aeb,0xa3170191,0x2c6ff4e6,0xf7f06fed,0xa76ffb81,0x21c4cb2f,0x51255d27,0x7953b7ae,0x9b6c3ff5,0x686121c2,0xcc4d4476,0x75eb0cfe,0x6810dc}}}}, {{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x57829ac1,0x8f27e01b,0x2e5573fc,0x3632613d,0x3dc1ba61,0x7133cfeb,0xd9f84a27,0xd0fd3ae,0xa4886ce5,0xfecc75cd,0x356050d3,0x89335752,0x3c5b5c00,0x303f583d,0x3a5c69c5,0x4af10d22,0x3fb952a1,0xcc3b797b,0x2557c5ff,0x562d8699,0x44372e84,0xe16dc1f7,0xeed817b6,0x75d96dda,0x387954}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x5b377dd2,0xa574b9ef,0x153dbea,0x4e0ad842,0xbd26e1b9,0x35e33743,0xb4341d37,0xcdd89134,0x27531fe9,0x7d67f73c,0xbb80092d,0xd0e7f34,0x988996a0,0xd4574088,0xa756238f,0x294bb8b0,0x8b144357,0xa16bf093,0x8b65a910,0xf9c8a58,0xe3dbcdcf,0xc7e23f9e,0x1fe60e1a,0x5411fd20,0xb80475}}}}}; -const ibz_mat_2x2_t ACTION_J = {{{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0xb9aa53e2,0xfbce07cd,0x9091786,0x91b7cbe1,0x31006c2f,0x67118ce2,0xcb2fad9,0x1698320d,0xbcd19936,0x2ce4f50d,0xc55cd029,0x4872a859,0xf3ac7c20,0xe67c11d9,0x89650f3e,0x39008b84,0x56744281,0x61018d53,0xbf3831a5,0x4e17cf4d,0x1d6d5651,0x48a5c60,0xf8e20de9,0x88ca6a63,0x36c38e}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x885ac805,0xacdd41e,0x318815f1,0x64a4690b,0xed458291,0xed6fa35d,0x37f31b45,0xfb4001f5,0x359948fe,0xd12e7340,0x9fb7a8a8,0x997722b4,0x8172b379,0x6ff6574c,0x589e2c45,0x38681bd2,0x8eaf24e6,0xad814af3,0x90113d8b,0xe061195,0xc1ee8bd4,0x3653cbad,0x35d73365,0x51e54728,0x5b0dce}}}}, {{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0xdb92d419,0xe34bdb57,0xbc6e69cd,0x8c63768a,0x1fcaf85c,0x293d738,0xe1bbf4fb,0xa9503f5d,0x17e19c75,0x18323f25,0x6a781847,0xd9e31768,0x6f05edf6,0x5e0f6bdc,0xdb9f8dbd,0x669bfc08,0x8b9ebbbe,0x6942fd0d,0x29a6dc1c,0xcca4401e,0x9ee28a3e,0x23a09a7d,0x448e239f,0x716bb7b5,0x2b9da3}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x4655ac1e,0x431f832,0xf6f6e879,0x6e48341e,0x978593d0,0xc3f8fd30,0xcb87279c,0xfe3e37d,0xbf69dc64,0xae96930f,0x39b36b2d,0xeca26195,0x9f9ad2de,0x4a2520cb,0x3a423c53,0x657b91d6,0x573a8e15,0x7b159127,0x1bb28711,0x1dea8586,0xd1118916,0x8e2e2d94,0xa76a058,0x64e86ca0,0xb95b99}}}}}; -const ibz_mat_2x2_t ACTION_K = {{{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x25ee5b9f,0xed15122c,0x4d2cbaee,0xf9df2a4b,0xa7deddb0,0xc687bfc9,0x793a0a41,0x94c75337,0xae44f7e5,0xd1bef53d,0x16b8c28d,0x18d925e0,0x7fc1ef55,0xa414f8dd,0x69b6867e,0xd472a158,0xac118197,0xbba11d8e,0x3a0fa476,0x14a7698b,0xabd3ed3f,0xa0360ea8,0x828af3df,0x32d00c3f,0xc92cb8}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x53968350,0xf2efc5bc,0xb7ebddf2,0x90198199,0xaad82bc2,0x783dc8cc,0xb3ac2106,0x933dee4d,0xd1970e79,0x72e6276,0xda6794e2,0x68572fdb,0x5bb858d0,0x8a785564,0x5b1afdab,0xeb82fd2d,0x3b70524e,0x4f4822e5,0x382378bf,0x38743b77,0xba36ac01,0xcd62d345,0xcf00e28d,0x6fe7a286,0x314eab}}}}, {{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x1b0462e4,0x7650ae30,0x65cff5e0,0x84861fcc,0x1861e766,0x1df5ae85,0xcd2f087e,0x4e45af4c,0xf583f712,0xb4a38287,0xd0910473,0xe4412015,0xe472437c,0x3adf9b77,0xd6275de5,0x5f80b1d5,0x51750910,0x7af369d0,0x534804a2,0x1f3a140e,0xc9e257c0,0xeda60532,0x55ee93a9,0xd3ec1001,0xd5fd1a}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0xda11a461,0x12eaedd3,0xb2d34511,0x620d5b4,0x20a7224f,0x6482ca49,0x5f001834,0x91b4c253,0xcdf67db4,0x9bc92df,0xe85778c9,0x1c3be40e,0x13855faa,0x8c8c39c8,0x59f0c513,0xca097c02,0x19d4efe,0x207600ec,0xa0db1440,0x575aeb48,0x42aaf228,0xf2827b4c,0x80cdba61,0xbae2cac4,0x26f26f}}}}}; -const ibz_mat_2x2_t ACTION_GEN2 = {{{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0xa4c8822e,0x5a8b4610,0xfeac2415,0xb1f527bd,0xb5f1e46,0xf52752cf,0x2406053e,0x58a38456,0x54e855b0,0x5e1390e1,0x43903229,0x28068aba,0xfabdb85f,0x5c49f21c,0x1c512802,0x753064aa,0x229a8d3f,0x3aab2de7,0x4f850fa6,0x5c65ca7b,0xaa31198,0xcad64a56,0xe372a026,0x99a0d9e3,0x381ab2}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x88f257b,0x95aafa56,0x9e34f879,0xfea25ab5,0x77584f0b,0x1edc41d9,0x4ef2b25,0xedeb23a0,0x9288fe6f,0xb5ee8fed,0x240bb32c,0x9ce5753d,0xdeca5aeb,0xa3170191,0x2c6ff4e6,0xf7f06fed,0xa76ffb81,0x21c4cb2f,0x51255d27,0x7953b7ae,0x9b6c3ff5,0x686121c2,0xcc4d4476,0x75eb0cfe,0x6810dc}}}}, {{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x57829ac1,0x8f27e01b,0x2e5573fc,0x3632613d,0x3dc1ba61,0x7133cfeb,0xd9f84a27,0xd0fd3ae,0xa4886ce5,0xfecc75cd,0x356050d3,0x89335752,0x3c5b5c00,0x303f583d,0x3a5c69c5,0x4af10d22,0x3fb952a1,0xcc3b797b,0x2557c5ff,0x562d8699,0x44372e84,0xe16dc1f7,0xeed817b6,0x75d96dda,0x387954}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x5b377dd2,0xa574b9ef,0x153dbea,0x4e0ad842,0xbd26e1b9,0x35e33743,0xb4341d37,0xcdd89134,0x27531fe9,0x7d67f73c,0xbb80092d,0xd0e7f34,0x988996a0,0xd4574088,0xa756238f,0x294bb8b0,0x8b144357,0xa16bf093,0x8b65a910,0xf9c8a58,0xe3dbcdcf,0xc7e23f9e,0x1fe60e1a,0x5411fd20,0xb80475}}}}}; -const ibz_mat_2x2_t ACTION_GEN3 = {{{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x2f396b08,0x2b2ca6ef,0x83da9dce,0x21d679cf,0x272c53b,0x43a1b4e2,0x4799147,0x4adbe5f7,0x46fab240,0xb33a0706,0x83fe9ed4,0x52c71e81,0x40d8c1bf,0xb9b39b4e,0xb4aec169,0xa65686c4,0x935ed02b,0x3be1ecda,0x74d3fd01,0x8b3ff74e,0x8b47a3a8,0xb10c9855,0xefd6ae28,0x880f0da5,0xaf7eb4}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x4874f6c0,0x503c673a,0x67de8735,0xb1a361e0,0xb24ee8ce,0x8625f29b,0x9e712335,0x749592ca,0xe41123b7,0xc38e8196,0xe1e1adea,0x9b2e4bf8,0x301e8732,0x986ac6f,0xc2871096,0x182c45df,0x9b0f9034,0x67a30b11,0xf09b4d59,0xc3ace4a1,0x2ead65e4,0xcf5a76b8,0x81123bed,0x63e82a13,0x618f55}}}}, {{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x998ab76d,0x3939ddb9,0xf561eee5,0xe14aebe3,0xaec6595e,0x39e3d391,0x5dda1f91,0x5b300986,0x5e3504ad,0x8b7f5a79,0x4fec348d,0xb18b375d,0xd5b0a4fb,0x4727620c,0x8afdfbc1,0xd8c68495,0x65ac072f,0x1abf3b44,0xa77f510e,0x9168e35b,0x718cdc61,0x2872e3a,0x19b31dab,0xf3a292c8,0x320b7b}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0xd0c694f8,0xd4d35910,0x7c256231,0xde298630,0xc6133ac4,0xe768d530,0xd3c0912e,0xdba02f93,0x3540c359,0x28418117,0x7b119c82,0xe24deb6d,0x526e8d3f,0x76ed9757,0xef88a28,0xf8259696,0x1a50006a,0xa03531a0,0x6616bbb5,0xe0c25d85,0x63373bbe,0xe1abf19f,0x13820018,0x65a3c95e,0x40a073}}}}}; -const ibz_mat_2x2_t ACTION_GEN4 = {{{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x12f72dd0,0x768a8916,0xa6965d77,0x7cef9525,0xd3ef6ed8,0xe343dfe4,0xbc9d0520,0xca63a99b,0xd7227bf2,0xe8df7a9e,0xb5c6146,0x8c6c92f0,0xbfe0f7aa,0x520a7c6e,0x34db433f,0xea3950ac,0x5608c0cb,0x5dd08ec7,0x9d07d23b,0x8a53b4c5,0x55e9f69f,0xd01b0754,0xc14579ef,0x1968061f,0x64965c}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x29cb41a8,0x7977e2de,0xdbf5eef9,0x480cc0cc,0x556c15e1,0x3c1ee466,0xd9d61083,0xc99ef726,0x68cb873c,0x397313b,0xed33ca71,0x342b97ed,0x2ddc2c68,0xc53c2ab2,0xad8d7ed5,0x75c17e96,0x9db82927,0xa7a41172,0x9c11bc5f,0x9c3a1dbb,0xdd1b5600,0xe6b169a2,0x67807146,0xb7f3d143,0x18a755}}}}, {{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0xd823172,0x3b285718,0x32e7faf0,0x42430fe6,0x8c30f3b3,0xefad742,0x6697843f,0x2722d7a6,0xfac1fb89,0xda51c143,0xe8488239,0x7220900a,0xf23921be,0x9d6fcdbb,0xeb13aef2,0x2fc058ea,0x28ba8488,0x3d79b4e8,0x29a40251,0xf9d0a07,0x64f12be0,0xf6d30299,0xaaf749d4,0x69f60800,0x6afe8d}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0xed08d231,0x897576e9,0x5969a288,0x83106ada,0xf4969127,0x47c6aa2d,0x1b9d1d55,0x5c186bef,0xa518f9a7,0xf29c0d7e,0xf3b3da0f,0xa8a876fe,0xd3665754,0xde96b636,0x8ecc0852,0xb442ccae,0x57a60fca,0x7e468fb3,0x3de2e67b,0xe1aea00e,0x9894e8c7,0xc29d82a0,0x42133451,0xd44ad0e4,0x8b88cb}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_UNDISTORTED_GEN = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2f}}}, {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x4acfd1c1,0x9efbea1c,0x1c30de65,0x92ff0e5e,0xadb39031,0xa6e1ac6b,0xcfdf40c9,0x3fcbd9f6,0xfde96ca9,0xa52e3e37,0x1855e3c5,0x11fd0a01,0x1ecc3cdf,0x9c0c318a,0xda4131c6,0xd27f2065,0x148f}}}, {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x5ce62651,0xc6c8d81,0xe88011,0xf20076e8,0x53dd83a6,0x4a4c21c8,0xd5e6cdfe,0x2d18812,0x7da513b0,0xe681638f,0xcba6397f,0x80012308,0x919290ee,0x66fceb6c,0xd7c84f59,0x32e2865f,0x2641f}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_DISTORTION_ENDO = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x75eb6411,0x5585930b,0x63eea500,0xf861180f,0x1e88366a,0x2f7ebd2,0xeec480da,0xb27b5e4b,0x974a9c18,0x8f32a082,0x62b103c1,0x225880f3,0xa0730cfd,0x46035874,0xa57622c8,0xb895292b,0xbac23}}}, {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xa2ffcbaf,0xf297e66d,0xd8da48aa,0x46de9c8e,0x77e264f4,0x7c219ac5,0xb16b5419,0x60c94768,0x864d3ad,0x22dc1,0xe38b239,0x176c26d3,0x1b642111,0x4b36fdbc,0x1151249f,0x332d8a54,0x143a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xc97bb8d4,0xf1fc68a5,0x1cfacaea,0x1af8cc66,0x90129a15,0x390a07ea,0x9a0075fd,0xb3db8094,0x9ce84547,0x91fc99a1,0xb0b046a6,0x6c5c56e9,0x5d38128c,0x22407b27,0xd094ea36,0xb7360020,0x15e1ff}}}}}; -#elif 8*DIGIT_LEN == 64 -const ec_basis_t BASIS_EVEN = {{{{0xf893b25235cd05, 0xcfad0c31816a3767, 0x24d6633b878c9852, 0x947ef3f6bd7e54a9, 0xcfcc6931acebc9ec, 0x7a593c6f226d62a7, 0xd773da3276d4514e, 0xf93f309a42dec}, {0x70e6b5b84d87aff3, 0x3b39ea4b8a9af50f, 0x33bb72fc45f05294, 0x1103f3d679fb626a, 0x29e23daba686e722, 0xd7683a594c898767, 0x41c4ad3db823bae1, 0x13f1daa2e21221}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xac16948532220971, 0x5652f704391431a5, 0xca5ee11424c4943d, 0xaa2208832540971a, 0x9e289f9c846e5c2b, 0xde48d5cd32bd5fe2, 0x913b3efa3bc42565, 0xd203dedb14213}, {0x5872c77992dd67c0, 0xb937a740922a8754, 0x21f7d1669ef949f, 0x2a7139b6c8587d0f, 0xf8bab24328aa27ab, 0xdab9bd3b2ddeec79, 0xe83b475f203bcb65, 0x556741a934ed3}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x90f4d4d80ba9ed72, 0xc8b9a440304ca99d, 0xc943b3a8997d4b88, 0xf08d352edc87530f, 0x767ca098b77d7071, 0x50dba761679c1732, 0x545a298536db6db9, 0x1381accb5f9aff}, {0x97233d48b02e6714, 0x684847c5bc2333e7, 0x18886606aeba8b01, 0xe4d42f848dafb6fc, 0xcc8ac9374d922260, 0x63189d0ed97c756, 0xa21cc3b155e35e31, 0x17400333e40769}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_PLUS = {{{{0xcde42ca0952857f6, 0x43986ee6663ef6cd, 0x55871379b845a923, 0x76ed1adf6ebef960, 0xabc4b150fc745f1e, 0x1c8a9c2defeb0f13, 0x13dd17be34fd733, 0x19e43fe41e4c43}, {0x2fa1833df935bc09, 0x69f359ab51c26ad9, 0xf9586cab92e541d6, 0x7362de7c9a12a54, 0xf971e28525d978bc, 0xf9e36a9529d0f3bd, 0xaea48e8b461db588, 0x1c33797cdc407}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x89c16fec8e55f16c, 0x1ff4d48fd451c2bb, 0x7b18fb54214c6532, 0x9ef491c4f579c67e, 0x38cd883c7d0cd40e, 0x499dc1361f2d123, 0x1335e051324fdbc7, 0xfd4fddbdc2a7f}, {0xcb3f9f71c926dc70, 0xebc2bb04385445c8, 0x6fd7a4eaca478a40, 0x151e3f61abfba2cb, 0x761770fecf1ee8c0, 0xd021aa20f5cd88a9, 0xbfcf8539dcdfb928, 0x18506735ab454e}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x2df9cd51f27fb63e, 0x70ba06f5979446db, 0xa3fbb7300b16af8d, 0x992c1287f9a1c577, 0xb243e4491d37450e, 0x8473713e201019e0, 0xef9c23305e454581, 0x67b9998e13889}, {0x452150d05e768c9b, 0x4fe2b493696f8226, 0xac671e6158fedc93, 0x670fe96577281a7c, 0xa28c4be3e9ad4931, 0x6f20e70a714aae4b, 0x9890ecbc08f30c2e, 0x24a2c3ff722e18}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_MINUS = {{{{0x2d2d051047dbd624, 0xfca1b15a916f7be5, 0x441312cd63f16c3f, 0xff7438fdce0ea446, 0x9fdef5936357fab, 0xf9ae02a9421f5416, 0xf7b77ef02bd1c1f8, 0x16f3f63378f96e}, {0x407ce7ffebc92b8e, 0x55fe79acf73aa929, 0x3337fb9216805495, 0xf6db0b7b43176f92, 0x853ee17ab74bf23d, 0xec5cbc949d4b0709, 0xce952df77dfd072f, 0xb16ebf531bef1}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x230916c16a0947e7, 0xa5a77aa3652d437b, 0x945736cf18a280b2, 0xe714d31d874572f1, 0x41bfcb5db198a4ac, 0x33c4ca4686e96f44, 0xe393b5d625debb73, 0x13895d37996b33}, {0xada606e483b73739, 0xe88daed540f3341d, 0xf398a06307ae9e8e, 0x61c2dfd85ef3c1a5, 0xbd29fb1cf683401c, 0x9aae565349a44142, 0x87a7c3de59a75f0d, 0x24c83660611a31}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x102024e8a598a5e8, 0x2bc941882c5f9245, 0xd6d60580934ea556, 0x86a4552d3207e718, 0x96eee147b2e294b5, 0x3ab66e6e93801f2e, 0xc8a390dff6441c41, 0x86407d5d6eb31}, {0xbd273dcfdc4cc333, 0x739eb9e099d67c56, 0x72a7fb0c255bdc52, 0x478eeb66fd200a09, 0x18965b28ca1ee442, 0xafff9738826e71d0, 0xa5a3e52397324a99, 0x22814353549863}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_PLUS = {{{{0xf74e278739139769, 0x58be58577063e414, 0x7eb0edc56149472a, 0xcca10962fd516fae, 0x1ff09b1f54235f02, 0xfaba3bd39b494a4e, 0x59131f688c981aa3, 0x1d51b125134e7b}, {0x65f0988abfc680f0, 0xa7ec54e82f4f2ab4, 0x9cf1b55adef48a73, 0xcd7037d25eae0ef2, 0xf92fd0cacb35869a, 0x4afc0821a671bcfa, 0x2d0ff9a442d5b9a3, 0x2478f31e1b0ea8}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x357c1914bd227f58, 0x8c0d19f6290630f6, 0x49b100de6a80c2b8, 0xa1d365344bbb92d1, 0x20457092ad863380, 0x8274b2b3309427b, 0x57f899ef3140dadd, 0x25503c1a2afc85}, {0x85cd3fa621493a3d, 0x92741aa3b1184149, 0x57dc1c77e580e8ac, 0xd58459bf1d974197, 0x7a88578d886499ce, 0x22ca10e6b3805ca4, 0x2762f95867f32794, 0x1f3dac32b57131}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x2f94ba52e8516cfd, 0xc0cc95a65ef5d3f0, 0x78cd1286af1a549, 0xc58dfb5ca45bda4f, 0xfcb50d3ddcf80ec3, 0x90c191d252c72d27, 0x33d25fd46c7f1402, 0x1c30b1fd3aa2f7}, {0x2a5802b9b8b9188f, 0xeb15e1196bf95ce6, 0x8667c8dd3375a95d, 0x6c5e7827fd12c65d, 0x7b22fdd30e62d493, 0xc59204eeb4f57f61, 0x4c18ee49e098a97f, 0x230ac44ef70718}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_MINUS = {{{{0x2d2d051047dbd624, 0xfca1b15a916f7be5, 0x441312cd63f16c3f, 0xff7438fdce0ea446, 0x9fdef5936357fab, 0xf9ae02a9421f5416, 0xf7b77ef02bd1c1f8, 0x16f3f63378f96e}, {0x407ce7ffebc92b8e, 0x55fe79acf73aa929, 0x3337fb9216805495, 0xf6db0b7b43176f92, 0x853ee17ab74bf23d, 0xec5cbc949d4b0709, 0xce952df77dfd072f, 0xb16ebf531bef1}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x230916c16a0947e7, 0xa5a77aa3652d437b, 0x945736cf18a280b2, 0xe714d31d874572f1, 0x41bfcb5db198a4ac, 0x33c4ca4686e96f44, 0xe393b5d625debb73, 0x13895d37996b33}, {0xada606e483b73739, 0xe88daed540f3341d, 0xf398a06307ae9e8e, 0x61c2dfd85ef3c1a5, 0xbd29fb1cf683401c, 0x9aae565349a44142, 0x87a7c3de59a75f0d, 0x24c83660611a31}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x102024e8a598a5e8, 0x2bc941882c5f9245, 0xd6d60580934ea556, 0x86a4552d3207e718, 0x96eee147b2e294b5, 0x3ab66e6e93801f2e, 0xc8a390dff6441c41, 0x86407d5d6eb31}, {0xbd273dcfdc4cc333, 0x739eb9e099d67c56, 0x72a7fb0c255bdc52, 0x478eeb66fd200a09, 0x18965b28ca1ee442, 0xafff9738826e71d0, 0xa5a3e52397324a99, 0x22814353549863}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_CHALLENGE = {{{{0x6e2338651dd6b809, 0xa0b4a74a516bc856, 0xcef4dc03ae64bc, 0x7e04105e61ad1ccc, 0x824a280776a0a61a, 0xb0cbb7066de4598f, 0x91147e22289f3e7c, 0x1159e486ae42c7}, {0x4ad227aedc9e33c9, 0xe3050d4ccb8cd5e6, 0x859f12c8125c3c76, 0xc70299649231184f, 0xde2bae7b1651dfd, 0x38ae5d76b98a0bf5, 0x4afcb9cdd51c75ac, 0x1cd37f9c7ba50e}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x9712f28d07df37f6, 0x3c0fdc3f6b148b77, 0x498753d83c208925, 0x3e9d6e57123afc04, 0xff41fe276d7b38de, 0x6fd059cabd88b549, 0x206a33c3360330d5, 0x5b66cd2ad497f}, {0x9b6c484b0169169b, 0x6854e01c5c87805c, 0x3217830c5fa9e618, 0x26b5dc3839eb347d, 0xc1b369290ec7c6b1, 0x7a2f3702ffd2460d, 0x2a17887c3a6da2f1, 0x16971eee1d9a05}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x6274b50ea5c661fa, 0xe3c3462c17e5a676, 0x73863c6c6e3e939d, 0x36adea15c2e668ab, 0x20ea8297e2acacbb, 0x720c5bd322a623a1, 0xa914186e4ebaa9a2, 0x4e9c355009afd}, {0x8dbb2dc3278a80f0, 0x9c6baecf247fbe32, 0x2fca5dddae71c5fd, 0x6e944e9e7de384cd, 0xeef1669c4da7aede, 0x6fb68320ff68c3a7, 0x9150f158b68d6cdb, 0x22c905c30fedc8}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_curve_t CURVE_E0 = {{{0x0}}, {{0x1}}}; -const ec_point_t CURVE_E0_A24 = {{{0x0}}, {{0x1}}}; -const ibz_mat_2x2_t ACTION_I = {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x5a8b4610a4c8822e,0xb1f527bdfeac2415,0xf52752cf0b5f1e46,0x58a384562406053e,0x5e1390e154e855b0,0x28068aba43903229,0x5c49f21cfabdb85f,0x753064aa1c512802,0x3aab2de7229a8d3f,0x5c65ca7b4f850fa6,0xcad64a560aa31198,0x99a0d9e3e372a026,0x381ab2}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x95aafa56088f257b,0xfea25ab59e34f879,0x1edc41d977584f0b,0xedeb23a004ef2b25,0xb5ee8fed9288fe6f,0x9ce5753d240bb32c,0xa3170191deca5aeb,0xf7f06fed2c6ff4e6,0x21c4cb2fa76ffb81,0x7953b7ae51255d27,0x686121c29b6c3ff5,0x75eb0cfecc4d4476,0x6810dc}}}}, {{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x8f27e01b57829ac1,0x3632613d2e5573fc,0x7133cfeb3dc1ba61,0xd0fd3aed9f84a27,0xfecc75cda4886ce5,0x89335752356050d3,0x303f583d3c5b5c00,0x4af10d223a5c69c5,0xcc3b797b3fb952a1,0x562d86992557c5ff,0xe16dc1f744372e84,0x75d96ddaeed817b6,0x387954}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xa574b9ef5b377dd2,0x4e0ad8420153dbea,0x35e33743bd26e1b9,0xcdd89134b4341d37,0x7d67f73c27531fe9,0xd0e7f34bb80092d,0xd4574088988996a0,0x294bb8b0a756238f,0xa16bf0938b144357,0xf9c8a588b65a910,0xc7e23f9ee3dbcdcf,0x5411fd201fe60e1a,0xb80475}}}}}; -const ibz_mat_2x2_t ACTION_J = {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xfbce07cdb9aa53e2,0x91b7cbe109091786,0x67118ce231006c2f,0x1698320d0cb2fad9,0x2ce4f50dbcd19936,0x4872a859c55cd029,0xe67c11d9f3ac7c20,0x39008b8489650f3e,0x61018d5356744281,0x4e17cf4dbf3831a5,0x48a5c601d6d5651,0x88ca6a63f8e20de9,0x36c38e}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xacdd41e885ac805,0x64a4690b318815f1,0xed6fa35ded458291,0xfb4001f537f31b45,0xd12e7340359948fe,0x997722b49fb7a8a8,0x6ff6574c8172b379,0x38681bd2589e2c45,0xad814af38eaf24e6,0xe06119590113d8b,0x3653cbadc1ee8bd4,0x51e5472835d73365,0x5b0dce}}}}, {{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xe34bdb57db92d419,0x8c63768abc6e69cd,0x293d7381fcaf85c,0xa9503f5de1bbf4fb,0x18323f2517e19c75,0xd9e317686a781847,0x5e0f6bdc6f05edf6,0x669bfc08db9f8dbd,0x6942fd0d8b9ebbbe,0xcca4401e29a6dc1c,0x23a09a7d9ee28a3e,0x716bb7b5448e239f,0x2b9da3}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x431f8324655ac1e,0x6e48341ef6f6e879,0xc3f8fd30978593d0,0xfe3e37dcb87279c,0xae96930fbf69dc64,0xeca2619539b36b2d,0x4a2520cb9f9ad2de,0x657b91d63a423c53,0x7b159127573a8e15,0x1dea85861bb28711,0x8e2e2d94d1118916,0x64e86ca00a76a058,0xb95b99}}}}}; -const ibz_mat_2x2_t ACTION_K = {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xed15122c25ee5b9f,0xf9df2a4b4d2cbaee,0xc687bfc9a7deddb0,0x94c75337793a0a41,0xd1bef53dae44f7e5,0x18d925e016b8c28d,0xa414f8dd7fc1ef55,0xd472a15869b6867e,0xbba11d8eac118197,0x14a7698b3a0fa476,0xa0360ea8abd3ed3f,0x32d00c3f828af3df,0xc92cb8}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xf2efc5bc53968350,0x90198199b7ebddf2,0x783dc8ccaad82bc2,0x933dee4db3ac2106,0x72e6276d1970e79,0x68572fdbda6794e2,0x8a7855645bb858d0,0xeb82fd2d5b1afdab,0x4f4822e53b70524e,0x38743b77382378bf,0xcd62d345ba36ac01,0x6fe7a286cf00e28d,0x314eab}}}}, {{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x7650ae301b0462e4,0x84861fcc65cff5e0,0x1df5ae851861e766,0x4e45af4ccd2f087e,0xb4a38287f583f712,0xe4412015d0910473,0x3adf9b77e472437c,0x5f80b1d5d6275de5,0x7af369d051750910,0x1f3a140e534804a2,0xeda60532c9e257c0,0xd3ec100155ee93a9,0xd5fd1a}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x12eaedd3da11a461,0x620d5b4b2d34511,0x6482ca4920a7224f,0x91b4c2535f001834,0x9bc92dfcdf67db4,0x1c3be40ee85778c9,0x8c8c39c813855faa,0xca097c0259f0c513,0x207600ec019d4efe,0x575aeb48a0db1440,0xf2827b4c42aaf228,0xbae2cac480cdba61,0x26f26f}}}}}; -const ibz_mat_2x2_t ACTION_GEN2 = {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x5a8b4610a4c8822e,0xb1f527bdfeac2415,0xf52752cf0b5f1e46,0x58a384562406053e,0x5e1390e154e855b0,0x28068aba43903229,0x5c49f21cfabdb85f,0x753064aa1c512802,0x3aab2de7229a8d3f,0x5c65ca7b4f850fa6,0xcad64a560aa31198,0x99a0d9e3e372a026,0x381ab2}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x95aafa56088f257b,0xfea25ab59e34f879,0x1edc41d977584f0b,0xedeb23a004ef2b25,0xb5ee8fed9288fe6f,0x9ce5753d240bb32c,0xa3170191deca5aeb,0xf7f06fed2c6ff4e6,0x21c4cb2fa76ffb81,0x7953b7ae51255d27,0x686121c29b6c3ff5,0x75eb0cfecc4d4476,0x6810dc}}}}, {{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x8f27e01b57829ac1,0x3632613d2e5573fc,0x7133cfeb3dc1ba61,0xd0fd3aed9f84a27,0xfecc75cda4886ce5,0x89335752356050d3,0x303f583d3c5b5c00,0x4af10d223a5c69c5,0xcc3b797b3fb952a1,0x562d86992557c5ff,0xe16dc1f744372e84,0x75d96ddaeed817b6,0x387954}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xa574b9ef5b377dd2,0x4e0ad8420153dbea,0x35e33743bd26e1b9,0xcdd89134b4341d37,0x7d67f73c27531fe9,0xd0e7f34bb80092d,0xd4574088988996a0,0x294bb8b0a756238f,0xa16bf0938b144357,0xf9c8a588b65a910,0xc7e23f9ee3dbcdcf,0x5411fd201fe60e1a,0xb80475}}}}}; -const ibz_mat_2x2_t ACTION_GEN3 = {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x2b2ca6ef2f396b08,0x21d679cf83da9dce,0x43a1b4e20272c53b,0x4adbe5f704799147,0xb33a070646fab240,0x52c71e8183fe9ed4,0xb9b39b4e40d8c1bf,0xa65686c4b4aec169,0x3be1ecda935ed02b,0x8b3ff74e74d3fd01,0xb10c98558b47a3a8,0x880f0da5efd6ae28,0xaf7eb4}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x503c673a4874f6c0,0xb1a361e067de8735,0x8625f29bb24ee8ce,0x749592ca9e712335,0xc38e8196e41123b7,0x9b2e4bf8e1e1adea,0x986ac6f301e8732,0x182c45dfc2871096,0x67a30b119b0f9034,0xc3ace4a1f09b4d59,0xcf5a76b82ead65e4,0x63e82a1381123bed,0x618f55}}}}, {{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x3939ddb9998ab76d,0xe14aebe3f561eee5,0x39e3d391aec6595e,0x5b3009865dda1f91,0x8b7f5a795e3504ad,0xb18b375d4fec348d,0x4727620cd5b0a4fb,0xd8c684958afdfbc1,0x1abf3b4465ac072f,0x9168e35ba77f510e,0x2872e3a718cdc61,0xf3a292c819b31dab,0x320b7b}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xd4d35910d0c694f8,0xde2986307c256231,0xe768d530c6133ac4,0xdba02f93d3c0912e,0x284181173540c359,0xe24deb6d7b119c82,0x76ed9757526e8d3f,0xf82596960ef88a28,0xa03531a01a50006a,0xe0c25d856616bbb5,0xe1abf19f63373bbe,0x65a3c95e13820018,0x40a073}}}}}; -const ibz_mat_2x2_t ACTION_GEN4 = {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x768a891612f72dd0,0x7cef9525a6965d77,0xe343dfe4d3ef6ed8,0xca63a99bbc9d0520,0xe8df7a9ed7227bf2,0x8c6c92f00b5c6146,0x520a7c6ebfe0f7aa,0xea3950ac34db433f,0x5dd08ec75608c0cb,0x8a53b4c59d07d23b,0xd01b075455e9f69f,0x1968061fc14579ef,0x64965c}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x7977e2de29cb41a8,0x480cc0ccdbf5eef9,0x3c1ee466556c15e1,0xc99ef726d9d61083,0x397313b68cb873c,0x342b97eded33ca71,0xc53c2ab22ddc2c68,0x75c17e96ad8d7ed5,0xa7a411729db82927,0x9c3a1dbb9c11bc5f,0xe6b169a2dd1b5600,0xb7f3d14367807146,0x18a755}}}}, {{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x3b2857180d823172,0x42430fe632e7faf0,0xefad7428c30f3b3,0x2722d7a66697843f,0xda51c143fac1fb89,0x7220900ae8488239,0x9d6fcdbbf23921be,0x2fc058eaeb13aef2,0x3d79b4e828ba8488,0xf9d0a0729a40251,0xf6d3029964f12be0,0x69f60800aaf749d4,0x6afe8d}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x897576e9ed08d231,0x83106ada5969a288,0x47c6aa2df4969127,0x5c186bef1b9d1d55,0xf29c0d7ea518f9a7,0xa8a876fef3b3da0f,0xde96b636d3665754,0xb442ccae8ecc0852,0x7e468fb357a60fca,0xe1aea00e3de2e67b,0xc29d82a09894e8c7,0xd44ad0e442133451,0x8b88cb}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_UNDISTORTED_GEN = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2f}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x9efbea1c4acfd1c1,0x92ff0e5e1c30de65,0xa6e1ac6badb39031,0x3fcbd9f6cfdf40c9,0xa52e3e37fde96ca9,0x11fd0a011855e3c5,0x9c0c318a1ecc3cdf,0xd27f2065da4131c6,0x148f}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xc6c8d815ce62651,0xf20076e800e88011,0x4a4c21c853dd83a6,0x2d18812d5e6cdfe,0xe681638f7da513b0,0x80012308cba6397f,0x66fceb6c919290ee,0x32e2865fd7c84f59,0x2641f}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_DISTORTION_ENDO = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x5585930b75eb6411,0xf861180f63eea500,0x2f7ebd21e88366a,0xb27b5e4beec480da,0x8f32a082974a9c18,0x225880f362b103c1,0x46035874a0730cfd,0xb895292ba57622c8,0xbac23}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xf297e66da2ffcbaf,0x46de9c8ed8da48aa,0x7c219ac577e264f4,0x60c94768b16b5419,0x22dc10864d3ad,0x176c26d30e38b239,0x4b36fdbc1b642111,0x332d8a541151249f,0x143a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xf1fc68a5c97bb8d4,0x1af8cc661cfacaea,0x390a07ea90129a15,0xb3db80949a0075fd,0x91fc99a19ce84547,0x6c5c56e9b0b046a6,0x22407b275d38128c,0xb7360020d094ea36,0x15e1ff}}}}}; +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} #endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x280} +#elif RADIX == 32 +{0x12f68, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x400} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x4b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x170000000000000} +#else +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x1099, 0xa9f, 0x14f8, 0x1537, 0x1a13, 0x97e, 0x1095, 0xc8b, 0xdd2, 0x1c5f, 0xbdf, 0x1344, 0x1330, 0x1733, 0x185d, 0x1b08, 0x464, 0x76f, 0xe44, 0x3fc, 0x1dc0, 0x1c62, 0x88, 0x972, 0x13f4, 0x18c8, 0x6bd, 0x804, 0x1269, 0x19e0, 0x14bd, 0x10a1, 0xe5e, 0x1af2, 0x156c, 0x3f7, 0x16a1, 0x47d, 0x314} +#elif RADIX == 32 +{0x184cba61, 0xf4f854f, 0x1fb42753, 0x45c2552, 0x1c5f6e93, 0x2688bdf, 0xedcce66, 0x64d8461, 0x1c8876f2, 0x177007f8, 0x12044718, 0x1913f44b, 0x10d7b8, 0x1cf049a5, 0x1d0a1a5e, 0x1b35e4e5, 0x1508fdea, 0x66d} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x27537a7c2a7e132e, 0x7dba4c8b84aa5fb4, 0xedcce6613445eff1, 0xc7221dbc8c9b08c2, 0x8972044718bb803f, 0x24d280435ee3227e, 0x6bc9cbd0a1a5ee78, 0x1011f6d423f7ab6} +#else +{0xa6f4f854fc265d, 0x4c8b84aa5fb427, 0x1309a22f7f8bedd, 0x12326c230bb7339, 0x1177007f8e443b7, 0x3227e897204471, 0x173c12694021af7, 0xd9af272f428697, 0x523eda847ef5} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x4b1, 0x178f, 0x107b, 0x6f6, 0x75e, 0x1b27, 0x4db, 0x1e1b, 0xd78, 0x15b6, 0x1130, 0x8cc, 0x1ac0, 0x9b7, 0x692, 0x1e07, 0x1f4, 0xfd7, 0x2ab, 0x7b5, 0x1040, 0xa43, 0xb6d, 0x13a1, 0x1422, 0x10c9, 0x10b0, 0x1540, 0x827, 0xa69, 0x1761, 0x1f25, 0x1d16, 0x16f2, 0x1fcb, 0x92, 0xcba, 0x1c03, 0x3c7} +#elif RADIX == 32 +{0x1258c7b1, 0xd07bbc7, 0x9cebc6f, 0x10d936f6, 0x15b66bc7, 0x1199130, 0x926df58, 0x1f4f039a, 0x556fd70, 0x1c100f6a, 0x15b6a90, 0x1934229d, 0x15021610, 0x1534a09e, 0xdf25bb0, 0x12ede5d1, 0x5d024bf, 0xa9b} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xbc6f683dde3c9631, 0xd9af1e1b26dec9ce, 0x926df5808cc89856, 0x5155bf5c3e9e0734, 0x53a15b6a90e0807b, 0x504f540858432684, 0xdbcba2df25bb0a9a, 0x18f00d974092fe5} +#else +{0xded07bbc792c63, 0x11e1b26dec9cebc, 0xc046644c2b6cd7, 0x10fa781cd249b7d, 0x1c100f6a2ab7eb, 0x3268453a15b6a9, 0x54d2827aa042c2, 0x1976f2e8b7c96ec, 0x16e01b2e8125f} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x15c, 0x865, 0x1af6, 0x17b9, 0x6a2, 0x1c22, 0x17c5, 0x1149, 0xa7, 0x151e, 0xe57, 0x4c2, 0x18cd, 0xbd2, 0x7a4, 0x7c6, 0x74a, 0xd2, 0x902, 0x68c, 0x21e, 0x1e44, 0x1f5a, 0x1d4c, 0x115b, 0x1777, 0x16d4, 0x503, 0x3af, 0x7e4, 0x1aa7, 0x3dd, 0x827, 0x186b, 0x765, 0x1fc5, 0xc78, 0x9bd, 0xfe} +#elif RADIX == 32 +{0x10ae12d6, 0x13af6432, 0x88d457b, 0xa4df178, 0x151e053c, 0x14984e57, 0x122f4b19, 0x14a3e31e, 0x12040d23, 0x878d18, 0xcfad791, 0xef15bea, 0x140eda97, 0x13f20ebc, 0xe3ddd53, 0x1970d682, 0x3c7f14e, 0x4eb} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x457b9d7b21942b84, 0x7814f149be2f088d, 0x22f4b19a4c272bd4, 0xc4810348e947c63d, 0x7d4cfad791043c68, 0x75e503b6a5dde2b, 0xe1ad04e3ddd539f9, 0x1326f58f1fc53b2} +#else +{0xf73af643285709, 0xf149be2f088d45, 0xcd261395ea3c0a, 0x3a51f18f48bd2c, 0x20878d18902069, 0x1dde2b7d4cfad79, 0x1cfc83af281db52, 0xcb86b4138f7754, 0xb4deb1e3f8a7} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x6ac, 0x25e, 0xc7a, 0x1492, 0xd01, 0xbc0, 0x118, 0x376, 0x3e0, 0x7ae, 0x573, 0x171f, 0x35a, 0x1725, 0x48f, 0xc94, 0x133c, 0x16a4, 0x10a8, 0x178d, 0xdd7, 0x798, 0x1d05, 0x39f, 0xc2a, 0x179c, 0x407, 0xd3, 0x118a, 0x1c9f, 0xeac, 0x145b, 0xc35, 0x11a2, 0x58b, 0xe4, 0x5e3, 0xae7, 0x330} +#elif RADIX == 32 +{0x3563c78, 0x4c7a12f, 0x101a0349, 0x1bb04617, 0x7ae1f00, 0xae3e573, 0x7dc946b, 0x13c64a12, 0x1516a49, 0x375ef1b, 0x1fe829e6, 0x138c2a1c, 0x34c80f7, 0xe4fc628, 0xb45b756, 0x2e344c3, 0xf18390b, 0x339} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x349263d0978d58f, 0xb87c037608c2f01a, 0x7dc946b571f2b99e, 0xd8545a92678c9424, 0x439fe829e61baf78, 0xe3140d3203de7185, 0xc68986b45b756727, 0x32b9cbc60e42c5} +#else +{0x924c7a12f1ab1e, 0x37608c2f01a03, 0x15ab8f95ccf5c3e, 0x99e325091f7251, 0xc375ef1b0a8b52, 0x1e7185439fe829e, 0x1393f18a069901e, 0x1171a261ad16dd5, 0x6573978c1c85} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x19da, 0x19cd, 0x19e2, 0x5ea, 0x1079, 0x11ba, 0x1f5e, 0x228, 0x1a45, 0x16ee, 0x18a1, 0x11eb, 0x127a, 0x1d6f, 0x106f, 0x118f, 0x1d0c, 0x1571, 0x1b2d, 0xb60, 0xb27, 0xe1f, 0xe58, 0xe01, 0x4f4, 0x183, 0x13a9, 0x1584, 0x5cb, 0xcce, 0x1ce7, 0x4da, 0x1e62, 0x1213, 0x7fe, 0x1e6, 0x17d, 0x350, 0x3a0} +#elif RADIX == 32 +{0x1ced44bf, 0x159e2ce6, 0xea0f25e, 0x1147d7a3, 0x16eed228, 0xa3d78a1, 0x17f5be4f, 0x10c8c7c1, 0x165b571e, 0x1ac9d6c1, 0x172c387, 0x1064f470, 0x16127521, 0x1667172e, 0x44dae73, 0x1fa427e6, 0xbe8798f, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xf25eacf167373b51, 0xbb48a228faf46ea0, 0x7f5be4f51ebc50db, 0xd96d5c7a1918f83, 0x8e0172c387d64eb6, 0x8b975849d4860c9e, 0x484fcc44dae73b33, 0x50d402fa1e63ff} +#else +{0xbd59e2ce6e76a2, 0xa228faf46ea0f2, 0x7a8f5e286ddda4, 0x1e86463e0dfd6f9, 0xfac9d6c1b2dab8, 0x60c9e8e0172c38, 0x1d99c5cbac24ea4, 0x1fd213f31136b9c, 0xa1a805f43cc7} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1dea, 0x1bbc, 0x9b0, 0x1066, 0x10fb, 0x1fe8, 0x1bca, 0x34d, 0x275, 0x42a, 0xc7b, 0x6e8, 0x1f5c, 0x12e5, 0x155d, 0x4f2, 0x1422, 0xfce, 0x603, 0x17a8, 0xd9f, 0x182d, 0x9fe, 0x3b1, 0x342, 0x1c21, 0x1aff, 0x1e38, 0x1ac8, 0x1c98, 0x51f, 0x897, 0xe23, 0x17e7, 0xced, 0x1e6, 0x125a, 0x18f3, 0x1b8} +#elif RADIX == 32 +{0xef520a6, 0xc9b0dde, 0x1a21f706, 0x1a6ef2bf, 0x42a13a8, 0x10dd0c7b, 0xecb97eb, 0x2227955, 0xc06fcea, 0xb67ef50, 0x114ff60b, 0x423421d, 0x18e35ffc, 0x1e4c6b23, 0x689728f, 0x1b6fcee2, 0x12d07999, 0x69c} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xf70664d86ef3bd48, 0xa84ea34dde57fa21, 0xecb97eb86e863d90, 0x8301bf3a8444f2aa, 0x43b14ff60b5b3f7a, 0x3591e38d7ff08468, 0xdf9dc4689728ff26, 0x463ce4b41e6676} +#else +{0xcc9b0dde77a90, 0xa34dde57fa21f7, 0x15c37431ec85427, 0xa1113caabb2e5f, 0x16b67ef506037e7, 0x10846843b14ff60, 0x1f931ac8f1c6bff, 0x1db7e7711a25ca3, 0x8c79c9683ccc} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x3337,0x86b9,0x96a8,0x892f,0x9f38,0x4c8e,0xc497,0xdf75,0x4fd7,0xd5b3,0x5dec,0xd543,0xf3dc,0xd5c3,0x8de3,0xa71e,0xd939,0x1324,0x7073,0x5af3,0xbb6b,0x4122,0x9d0,0x81d7,0x74de,0x3877,0x5ea0,0x6d85,0x7c31,0x8f2d,0x9df2,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x86b93337,0x892f96a8,0x4c8e9f38,0xdf75c497,0xd5b34fd7,0xd5435dec,0xd5c3f3dc,0xa71e8de3,0x1324d939,0x5af37073,0x4122bb6b,0x81d709d0,0x387774de,0x6d855ea0,0x8f2d7c31,0x19df2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x892f96a886b93337,0xdf75c4974c8e9f38,0xd5435decd5b34fd7,0xa71e8de3d5c3f3dc,0x5af370731324d939,0x81d709d04122bb6b,0x6d855ea0387774de,0x19df28f2d7c31}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x28e,0xcfd,0xe1c2,0x2061,0xe412,0x3b18,0x40df,0x716c,0xd025,0xd980,0xc041,0xebb9,0xbb45,0x4982,0x17de,0xa8fe,0xb079,0xffe5,0x34d9,0x2aa6,0x2b0b,0x6787,0x9bab,0x6bc3,0x7365,0x3c03,0xf512,0xb57b,0x897,0xf0b5,0x9c9c,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xcfd028e,0x2061e1c2,0x3b18e412,0x716c40df,0xd980d025,0xebb9c041,0x4982bb45,0xa8fe17de,0xffe5b079,0x2aa634d9,0x67872b0b,0x6bc39bab,0x3c037365,0xb57bf512,0xf0b50897,0x89c9c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2061e1c20cfd028e,0x716c40df3b18e412,0xebb9c041d980d025,0xa8fe17de4982bb45,0x2aa634d9ffe5b079,0x6bc39bab67872b0b,0xb57bf5123c037365,0x89c9cf0b50897}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x45b1,0x429e,0x37b2,0xd856,0x2f81,0x86cd,0x39cb,0x81ba,0x771e,0xee7e,0x58,0xfbe4,0xa4b,0x28fb,0x7a7d,0x5bb8,0xa413,0x1657,0x2d54,0x3a9d,0xbbad,0x75a3,0x689,0x3069,0xb0ad,0x2fdd,0x2e81,0xad39,0xd3cd,0x2bff,0xb5cb,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x429e45b1,0xd85637b2,0x86cd2f81,0x81ba39cb,0xee7e771e,0xfbe40058,0x28fb0a4b,0x5bb87a7d,0x1657a413,0x3a9d2d54,0x75a3bbad,0x30690689,0x2fddb0ad,0xad392e81,0x2bffd3cd,0x7b5cb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd85637b2429e45b1,0x81ba39cb86cd2f81,0xfbe40058ee7e771e,0x5bb87a7d28fb0a4b,0x3a9d2d541657a413,0x3069068975a3bbad,0xad392e812fddb0ad,0x7b5cb2bffd3cd}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xccc9,0x7946,0x6957,0x76d0,0x60c7,0xb371,0x3b68,0x208a,0xb028,0x2a4c,0xa213,0x2abc,0xc23,0x2a3c,0x721c,0x58e1,0x26c6,0xecdb,0x8f8c,0xa50c,0x4494,0xbedd,0xf62f,0x7e28,0x8b21,0xc788,0xa15f,0x927a,0x83ce,0x70d2,0x620d,0xe}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7946ccc9,0x76d06957,0xb37160c7,0x208a3b68,0x2a4cb028,0x2abca213,0x2a3c0c23,0x58e1721c,0xecdb26c6,0xa50c8f8c,0xbedd4494,0x7e28f62f,0xc7888b21,0x927aa15f,0x70d283ce,0xe620d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x76d069577946ccc9,0x208a3b68b37160c7,0x2abca2132a4cb028,0x58e1721c2a3c0c23,0xa50c8f8cecdb26c6,0x7e28f62fbedd4494,0x927aa15fc7888b21,0xe620d70d283ce}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x20f3,0x77e0,0xc9a6,0xeb4f,0xb334,0xff68,0xecb4,0xa6e3,0x5015,0x43c1,0x9e87,0xf4eb,0x22e7,0x5f37,0x9392,0x80a0,0x9ea0,0x670f,0x1be3,0x7559,0x2cb5,0x900d,0xfa83,0x1519,0x67b8,0x4d7c,0xaf3a,0x6dc4,0x12e1,0x1e51,0x8d84,0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x77e020f3,0xeb4fc9a6,0xff68b334,0xa6e3ecb4,0x43c15015,0xf4eb9e87,0x5f3722e7,0x80a09392,0x670f9ea0,0x75591be3,0x900d2cb5,0x1519fa83,0x4d7c67b8,0x6dc4af3a,0x1e5112e1,0x58d84}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xeb4fc9a677e020f3,0xa6e3ecb4ff68b334,0xf4eb9e8743c15015,0x80a093925f3722e7,0x75591be3670f9ea0,0x1519fa83900d2cb5,0x6dc4af3a4d7c67b8,0x58d841e5112e1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x8e98,0xe430,0x6d21,0x2fa6,0x524f,0xf0cf,0xe5eb,0x30ec,0x3658,0x7711,0x7d2f,0x47bf,0xbbc5,0x720c,0xe7a6,0x1ef4,0x335f,0x2c25,0x59e5,0x471c,0x5e06,0x5d38,0x62d6,0xa2a7,0x65f3,0xdefc,0x5e15,0x7a7a,0xdac4,0xc542,0x7bb8,0xd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe4308e98,0x2fa66d21,0xf0cf524f,0x30ece5eb,0x77113658,0x47bf7d2f,0x720cbbc5,0x1ef4e7a6,0x2c25335f,0x471c59e5,0x5d385e06,0xa2a762d6,0xdefc65f3,0x7a7a5e15,0xc542dac4,0xd7bb8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2fa66d21e4308e98,0x30ece5ebf0cf524f,0x47bf7d2f77113658,0x1ef4e7a6720cbbc5,0x471c59e52c25335f,0xa2a762d65d385e06,0x7a7a5e15defc65f3,0xd7bb8c542dac4}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x3249,0xe4fe,0xec61,0x49e0,0x5b5f,0xc495,0x6ef6,0x811,0x4fdf,0x59fc,0xbd69,0x608e,0xafe2,0xe9a9,0x5706,0x98ac,0xb327,0x481a,0x9c4e,0xecac,0x19fa,0x6401,0xfaad,0x14a4,0xeda,0x3fb5,0x7eb5,0x9768,0x6597,0x4c10,0xdc28,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe4fe3249,0x49e0ec61,0xc4955b5f,0x8116ef6,0x59fc4fdf,0x608ebd69,0xe9a9afe2,0x98ac5706,0x481ab327,0xecac9c4e,0x640119fa,0x14a4faad,0x3fb50eda,0x97687eb5,0x4c106597,0xbdc28}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x49e0ec61e4fe3249,0x8116ef6c4955b5f,0x608ebd6959fc4fdf,0x98ac5706e9a9afe2,0xecac9c4e481ab327,0x14a4faad640119fa,0x97687eb53fb50eda,0xbdc284c106597}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xdf0d,0x881f,0x3659,0x14b0,0x4ccb,0x97,0x134b,0x591c,0xafea,0xbc3e,0x6178,0xb14,0xdd18,0xa0c8,0x6c6d,0x7f5f,0x615f,0x98f0,0xe41c,0x8aa6,0xd34a,0x6ff2,0x57c,0xeae6,0x9847,0xb283,0x50c5,0x923b,0xed1e,0xe1ae,0x727b,0xa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x881fdf0d,0x14b03659,0x974ccb,0x591c134b,0xbc3eafea,0xb146178,0xa0c8dd18,0x7f5f6c6d,0x98f0615f,0x8aa6e41c,0x6ff2d34a,0xeae6057c,0xb2839847,0x923b50c5,0xe1aeed1e,0xa727b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x14b03659881fdf0d,0x591c134b00974ccb,0xb146178bc3eafea,0x7f5f6c6da0c8dd18,0x8aa6e41c98f0615f,0xeae6057c6ff2d34a,0x923b50c5b2839847,0xa727be1aeed1e}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf3b3,0x88db,0xd050,0x75f1,0x10dd,0x8cbe,0x97c4,0xe7a2,0xe6ae,0xf1e2,0xd51f,0x8d12,0x55a8,0x6395,0xc98a,0xc097,0x60c3,0x66aa,0x54f3,0x78ce,0x5dce,0x7fb3,0x99a7,0x3e1,0x8753,0x3c9a,0x3339,0x30f3,0x406e,0xc05e,0xc99f,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x88dbf3b3,0x75f1d050,0x8cbe10dd,0xe7a297c4,0xf1e2e6ae,0x8d12d51f,0x639555a8,0xc097c98a,0x66aa60c3,0x78ce54f3,0x7fb35dce,0x3e199a7,0x3c9a8753,0x30f33339,0xc05e406e,0x7c99f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x75f1d05088dbf3b3,0xe7a297c48cbe10dd,0x8d12d51ff1e2e6ae,0xc097c98a639555a8,0x78ce54f366aa60c3,0x3e199a77fb35dce,0x30f333393c9a8753,0x7c99fc05e406e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xbdde,0x1bf3,0x7bc0,0xcae7,0x8d2e,0x58a8,0x4b1a,0xbcb8,0xccd9,0x3d98,0xfcf2,0x4881,0x66f8,0x3473,0x2e8a,0x730d,0xabbf,0x4789,0xdce9,0x58ea,0xf54,0x6169,0x58d0,0x3280,0xe1f9,0x5bd0,0x67a0,0x23d2,0x2611,0x18e1,0xd51f,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1bf3bdde,0xcae77bc0,0x58a88d2e,0xbcb84b1a,0x3d98ccd9,0x4881fcf2,0x347366f8,0x730d2e8a,0x4789abbf,0x58eadce9,0x61690f54,0x328058d0,0x5bd0e1f9,0x23d267a0,0x18e12611,0x7d51f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xcae77bc01bf3bdde,0xbcb84b1a58a88d2e,0x4881fcf23d98ccd9,0x730d2e8a347366f8,0x58eadce94789abbf,0x328058d061690f54,0x23d267a05bd0e1f9,0x7d51f18e12611}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xee54,0xe36f,0x939d,0xea02,0xe6db,0xa7ae,0x9f39,0x8bb3,0x7f02,0xf594,0xa9ab,0xae5e,0x9a76,0x7fc0,0xd9a,0xbecd,0x692d,0x8b68,0x30f4,0xff9a,0xd1ae,0xfd43,0xbdfc,0xc552,0xfe0d,0xa4bf,0x33e5,0x981b,0x202c,0x45e8,0x8573,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe36fee54,0xea02939d,0xa7aee6db,0x8bb39f39,0xf5947f02,0xae5ea9ab,0x7fc09a76,0xbecd0d9a,0x8b68692d,0xff9a30f4,0xfd43d1ae,0xc552bdfc,0xa4bffe0d,0x981b33e5,0x45e8202c,0xc8573}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xea02939de36fee54,0x8bb39f39a7aee6db,0xae5ea9abf5947f02,0xbecd0d9a7fc09a76,0xff9a30f48b68692d,0xc552bdfcfd43d1ae,0x981b33e5a4bffe0d,0xc857345e8202c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc4d,0x7724,0x2faf,0x8a0e,0xef22,0x7341,0x683b,0x185d,0x1951,0xe1d,0x2ae0,0x72ed,0xaa57,0x9c6a,0x3675,0x3f68,0x9f3c,0x9955,0xab0c,0x8731,0xa231,0x804c,0x6658,0xfc1e,0x78ac,0xc365,0xccc6,0xcf0c,0xbf91,0x3fa1,0x3660,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x77240c4d,0x8a0e2faf,0x7341ef22,0x185d683b,0xe1d1951,0x72ed2ae0,0x9c6aaa57,0x3f683675,0x99559f3c,0x8731ab0c,0x804ca231,0xfc1e6658,0xc36578ac,0xcf0cccc6,0x3fa1bf91,0x83660}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8a0e2faf77240c4d,0x185d683b7341ef22,0x72ed2ae00e1d1951,0x3f6836759c6aaa57,0x8731ab0c99559f3c,0xfc1e6658804ca231,0xcf0cccc6c36578ac,0x836603fa1bf91}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x3337,0x86b9,0x96a8,0x892f,0x9f38,0x4c8e,0xc497,0xdf75,0x4fd7,0xd5b3,0x5dec,0xd543,0xf3dc,0xd5c3,0x8de3,0xa71e,0xd939,0x1324,0x7073,0x5af3,0xbb6b,0x4122,0x9d0,0x81d7,0x74de,0x3877,0x5ea0,0x6d85,0x7c31,0x8f2d,0x9df2,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x86b93337,0x892f96a8,0x4c8e9f38,0xdf75c497,0xd5b34fd7,0xd5435dec,0xd5c3f3dc,0xa71e8de3,0x1324d939,0x5af37073,0x4122bb6b,0x81d709d0,0x387774de,0x6d855ea0,0x8f2d7c31,0x19df2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x892f96a886b93337,0xdf75c4974c8e9f38,0xd5435decd5b34fd7,0xa71e8de3d5c3f3dc,0x5af370731324d939,0x81d709d04122bb6b,0x6d855ea0387774de,0x19df28f2d7c31}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x28e,0xcfd,0xe1c2,0x2061,0xe412,0x3b18,0x40df,0x716c,0xd025,0xd980,0xc041,0xebb9,0xbb45,0x4982,0x17de,0xa8fe,0xb079,0xffe5,0x34d9,0x2aa6,0x2b0b,0x6787,0x9bab,0x6bc3,0x7365,0x3c03,0xf512,0xb57b,0x897,0xf0b5,0x9c9c,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xcfd028e,0x2061e1c2,0x3b18e412,0x716c40df,0xd980d025,0xebb9c041,0x4982bb45,0xa8fe17de,0xffe5b079,0x2aa634d9,0x67872b0b,0x6bc39bab,0x3c037365,0xb57bf512,0xf0b50897,0x89c9c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2061e1c20cfd028e,0x716c40df3b18e412,0xebb9c041d980d025,0xa8fe17de4982bb45,0x2aa634d9ffe5b079,0x6bc39bab67872b0b,0xb57bf5123c037365,0x89c9cf0b50897}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x45b1,0x429e,0x37b2,0xd856,0x2f81,0x86cd,0x39cb,0x81ba,0x771e,0xee7e,0x58,0xfbe4,0xa4b,0x28fb,0x7a7d,0x5bb8,0xa413,0x1657,0x2d54,0x3a9d,0xbbad,0x75a3,0x689,0x3069,0xb0ad,0x2fdd,0x2e81,0xad39,0xd3cd,0x2bff,0xb5cb,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x429e45b1,0xd85637b2,0x86cd2f81,0x81ba39cb,0xee7e771e,0xfbe40058,0x28fb0a4b,0x5bb87a7d,0x1657a413,0x3a9d2d54,0x75a3bbad,0x30690689,0x2fddb0ad,0xad392e81,0x2bffd3cd,0x7b5cb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd85637b2429e45b1,0x81ba39cb86cd2f81,0xfbe40058ee7e771e,0x5bb87a7d28fb0a4b,0x3a9d2d541657a413,0x3069068975a3bbad,0xad392e812fddb0ad,0x7b5cb2bffd3cd}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xccc9,0x7946,0x6957,0x76d0,0x60c7,0xb371,0x3b68,0x208a,0xb028,0x2a4c,0xa213,0x2abc,0xc23,0x2a3c,0x721c,0x58e1,0x26c6,0xecdb,0x8f8c,0xa50c,0x4494,0xbedd,0xf62f,0x7e28,0x8b21,0xc788,0xa15f,0x927a,0x83ce,0x70d2,0x620d,0xe}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7946ccc9,0x76d06957,0xb37160c7,0x208a3b68,0x2a4cb028,0x2abca213,0x2a3c0c23,0x58e1721c,0xecdb26c6,0xa50c8f8c,0xbedd4494,0x7e28f62f,0xc7888b21,0x927aa15f,0x70d283ce,0xe620d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x76d069577946ccc9,0x208a3b68b37160c7,0x2abca2132a4cb028,0x58e1721c2a3c0c23,0xa50c8f8cecdb26c6,0x7e28f62fbedd4494,0x927aa15fc7888b21,0xe620d70d283ce}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xaa15,0x7f4c,0xb027,0xba3f,0xa936,0x25fb,0xd8a6,0xc32c,0x4ff6,0xcba,0x7e3a,0x6517,0x8b62,0x1a7d,0x90bb,0x13df,0x3bed,0x3d1a,0x462b,0x6826,0xf410,0xe897,0x8229,0x4b78,0xee4b,0x42f9,0x6ed,0x6da5,0x4789,0x56bf,0x95bb,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7f4caa15,0xba3fb027,0x25fba936,0xc32cd8a6,0xcba4ff6,0x65177e3a,0x1a7d8b62,0x13df90bb,0x3d1a3bed,0x6826462b,0xe897f410,0x4b788229,0x42f9ee4b,0x6da506ed,0x56bf4789,0xb95bb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xba3fb0277f4caa15,0xc32cd8a625fba936,0x65177e3a0cba4ff6,0x13df90bb1a7d8b62,0x6826462b3d1a3bed,0x4b788229e897f410,0x6da506ed42f9ee4b,0xb95bb56bf4789}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc893,0xf896,0x2771,0xa804,0x1b30,0x95f4,0x9365,0xd12c,0x33e,0xa849,0x9eb8,0x99bc,0xbb85,0x5dc7,0x7fc2,0x63f9,0x71ec,0x9605,0x475f,0xb8e1,0xc488,0xe25f,0x7f40,0x8735,0xecac,0xd7f,0x2994,0x17fb,0xf1ae,0xdafb,0xc2a,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf896c893,0xa8042771,0x95f41b30,0xd12c9365,0xa849033e,0x99bc9eb8,0x5dc7bb85,0x63f97fc2,0x960571ec,0xb8e1475f,0xe25fc488,0x87357f40,0xd7fecac,0x17fb2994,0xdafbf1ae,0x30c2a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa8042771f896c893,0xd12c936595f41b30,0x99bc9eb8a849033e,0x63f97fc25dc7bb85,0xb8e1475f960571ec,0x87357f40e25fc488,0x17fb29940d7fecac,0x30c2adafbf1ae}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x3bfd,0x13ce,0x920a,0x911b,0x4570,0x25b1,0xd461,0xc4e5,0x637e,0x243d,0x5ee1,0x2e39,0x5d17,0x952,0x68c2,0x7a32,0x2b9d,0x2f39,0xe4d1,0x13a4,0x6ad4,0x6cd2,0x9b,0xa287,0x5fc3,0x37c9,0xd69b,0xa250,0x1cb2,0xbc08,0xc8f9,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x13ce3bfd,0x911b920a,0x25b14570,0xc4e5d461,0x243d637e,0x2e395ee1,0x9525d17,0x7a3268c2,0x2f392b9d,0x13a4e4d1,0x6cd26ad4,0xa287009b,0x37c95fc3,0xa250d69b,0xbc081cb2,0x1c8f9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x911b920a13ce3bfd,0xc4e5d46125b14570,0x2e395ee1243d637e,0x7a3268c209525d17,0x13a4e4d12f392b9d,0xa287009b6cd26ad4,0xa250d69b37c95fc3,0x1c8f9bc081cb2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x55eb,0x80b3,0x4fd8,0x45c0,0x56c9,0xda04,0x2759,0x3cd3,0xb009,0xf345,0x81c5,0x9ae8,0x749d,0xe582,0x6f44,0xec20,0xc412,0xc2e5,0xb9d4,0x97d9,0xbef,0x1768,0x7dd6,0xb487,0x11b4,0xbd06,0xf912,0x925a,0xb876,0xa940,0x6a44,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x80b355eb,0x45c04fd8,0xda0456c9,0x3cd32759,0xf345b009,0x9ae881c5,0xe582749d,0xec206f44,0xc2e5c412,0x97d9b9d4,0x17680bef,0xb4877dd6,0xbd0611b4,0x925af912,0xa940b876,0x46a44}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x45c04fd880b355eb,0x3cd32759da0456c9,0x9ae881c5f345b009,0xec206f44e582749d,0x97d9b9d4c2e5c412,0xb4877dd617680bef,0x925af912bd0611b4,0x46a44a940b876}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf9da,0x446d,0xe828,0xbaf8,0x86e,0x465f,0x4be2,0x73d1,0x7357,0xf8f1,0x6a8f,0x4689,0xaad4,0x31ca,0xe4c5,0xe04b,0x3061,0xb355,0x2a79,0x3c67,0xaee7,0xbfd9,0xccd3,0x81f0,0x43a9,0x9e4d,0x999c,0x1879,0x2037,0xe02f,0xe4cf,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x446df9da,0xbaf8e828,0x465f086e,0x73d14be2,0xf8f17357,0x46896a8f,0x31caaad4,0xe04be4c5,0xb3553061,0x3c672a79,0xbfd9aee7,0x81f0ccd3,0x9e4d43a9,0x1879999c,0xe02f2037,0xbe4cf}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbaf8e828446df9da,0x73d14be2465f086e,0x46896a8ff8f17357,0xe04be4c531caaad4,0x3c672a79b3553061,0x81f0ccd3bfd9aee7,0x1879999c9e4d43a9,0xbe4cfe02f2037}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xdeef,0xdf9,0xbde0,0x6573,0x4697,0x2c54,0x258d,0xde5c,0x666c,0x1ecc,0xfe79,0x2440,0xb37c,0x1a39,0x9745,0xb986,0xd5df,0xa3c4,0x6e74,0x2c75,0x87aa,0x30b4,0x2c68,0x9940,0x70fc,0x2de8,0x33d0,0x91e9,0x9308,0x8c70,0xea8f,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdf9deef,0x6573bde0,0x2c544697,0xde5c258d,0x1ecc666c,0x2440fe79,0x1a39b37c,0xb9869745,0xa3c4d5df,0x2c756e74,0x30b487aa,0x99402c68,0x2de870fc,0x91e933d0,0x8c709308,0xbea8f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6573bde00df9deef,0xde5c258d2c544697,0x2440fe791ecc666c,0xb98697451a39b37c,0x2c756e74a3c4d5df,0x99402c6830b487aa,0x91e933d02de870fc,0xbea8f8c709308}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf72a,0xf1b7,0x49ce,0xf501,0x736d,0xd3d7,0xcf9c,0x45d9,0x3f81,0xfaca,0x54d5,0x572f,0x4d3b,0x3fe0,0x86cd,0xdf66,0x3496,0x45b4,0x187a,0x7fcd,0xe8d7,0x7ea1,0x5efe,0xe2a9,0xff06,0xd25f,0x99f2,0x4c0d,0x1016,0xa2f4,0x42b9,0xe}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf1b7f72a,0xf50149ce,0xd3d7736d,0x45d9cf9c,0xfaca3f81,0x572f54d5,0x3fe04d3b,0xdf6686cd,0x45b43496,0x7fcd187a,0x7ea1e8d7,0xe2a95efe,0xd25fff06,0x4c0d99f2,0xa2f41016,0xe42b9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf50149cef1b7f72a,0x45d9cf9cd3d7736d,0x572f54d5faca3f81,0xdf6686cd3fe04d3b,0x7fcd187a45b43496,0xe2a95efe7ea1e8d7,0x4c0d99f2d25fff06,0xe42b9a2f41016}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x627,0xbb92,0x17d7,0x4507,0xf791,0xb9a0,0xb41d,0x8c2e,0x8ca8,0x70e,0x9570,0xb976,0x552b,0xce35,0x1b3a,0x1fb4,0xcf9e,0x4caa,0xd586,0xc398,0x5118,0x4026,0x332c,0x7e0f,0xbc56,0x61b2,0x6663,0xe786,0xdfc8,0x1fd0,0x1b30,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xbb920627,0x450717d7,0xb9a0f791,0x8c2eb41d,0x70e8ca8,0xb9769570,0xce35552b,0x1fb41b3a,0x4caacf9e,0xc398d586,0x40265118,0x7e0f332c,0x61b2bc56,0xe7866663,0x1fd0dfc8,0x41b30}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x450717d7bb920627,0x8c2eb41db9a0f791,0xb9769570070e8ca8,0x1fb41b3ace35552b,0xc398d5864caacf9e,0x7e0f332c40265118,0xe786666361b2bc56,0x41b301fd0dfc8}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x4d6, 0x18fd, 0x18c0, 0x13c1, 0x1718, 0x122c, 0x830, 0xa02, 0xee0, 0x1ad1, 0x1485, 0x27f, 0x13e5, 0x118f, 0xdce, 0x31c, 0x1b49, 0x998, 0x117, 0x343, 0xdae, 0x1fe7, 0x16a0, 0x1c43, 0x172, 0xa6e, 0x702, 0xeb8, 0x835, 0x1cf, 0x48d, 0x4e4, 0x13eb, 0x57d, 0xccf, 0x97e, 0x3b6, 0x910, 0x2dd} +#elif RADIX == 32 +{0x126b3651, 0x38c0c7e, 0xb2e313c, 0x10120c24, 0x1ad17702, 0x144ff485, 0x7463e7c, 0x14918e37, 0x22e998d, 0x1b6b8686, 0x3b507f9, 0xdc172e2, 0x1ae0e04a, 0x10e7a0d5, 0x164e4246, 0x13cafb3e, 0x1db25f99, 0x300} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x313c1c6063f49acd, 0x45dc0a0241848b2e, 0x7463e7ca27fa42eb, 0x308ba66369231c6e, 0x5c43b507f9db5c34, 0xd06aeb838129b82e, 0x95f67d64e4246873, 0xfa44076c97e667} +#else +{0x7838c0c7e9359b, 0xa0241848b2e31, 0x1e513fd2175a2ee, 0xda48c71b9d18f9, 0x13b6b86861174cc, 0x9b82e5c43b507f, 0x1439e83575c1c09, 0x19e57d9f5939091, 0x44880ed92fcc} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x937, 0x63f, 0xe30, 0x4f0, 0x5c6, 0x48b, 0x120c, 0x280, 0xbb8, 0xeb4, 0x1d21, 0x89f, 0x1cf9, 0x1463, 0x373, 0x8c7, 0x6d2, 0x1a66, 0x1845, 0x10d0, 0x1b6b, 0x7f9, 0x1da8, 0x1710, 0x105c, 0x129b, 0x1c0, 0xbae, 0x1a0d, 0x873, 0x123, 0x1939, 0xcfa, 0x195f, 0x1333, 0x125f, 0xed, 0xa44, 0x697} +#elif RADIX == 32 +{0x149bfcfc, 0xe3031f, 0x2cb8c4f, 0x14048309, 0xeb45dc0, 0x513fd21, 0x19d18f9f, 0xd24638d, 0x108ba663, 0xedae1a1, 0x10ed41fe, 0x13705cb8, 0xeb83812, 0x1439e835, 0x15939091, 0xcf2becf, 0x76c97e6, 0x820} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x8c4f071818fd26ff, 0xd1770280906122cb, 0x9d18f9f289fe90ba, 0xc22e998da48c71b, 0x9710ed41fe76d70d, 0xf41abae0e04a6e0b, 0xe57d9f5939091a1c, 0x6a9101db25f999} +#else +{0x9e0e3031fa4dfe, 0x10280906122cb8c, 0xf944ff485d68bb, 0x369231c6e7463e, 0x1cedae1a1845d33, 0xa6e0b9710ed41f, 0xd0e7a0d5d70702, 0x6795f67d64e424, 0xd52203b64bf3} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x1863, 0x635, 0x19a9, 0x17fc, 0xdfe, 0x1784, 0x150b, 0x16c3, 0x15c0, 0x1f5f, 0x11d9, 0x1064, 0x1893, 0x1829, 0x211, 0x1a9e, 0x2e1, 0x3cc, 0x1e64, 0x12ed, 0x1c2c, 0x18b9, 0x121d, 0x234, 0xec9, 0x14dc, 0x4b6, 0xaad, 0x19f6, 0x805, 0x1984, 0x1843, 0xfca, 0x1a7a, 0xe04, 0x4af, 0x881, 0x65b, 0x421} +#elif RADIX == 32 +{0x1c31ce4f, 0x199a931a, 0x11bfd7f, 0x161d42ef, 0x1f5fae05, 0xe0c91d9, 0x8e0a712, 0xe1d4f08, 0x1cc83cc1, 0xf0b25db, 0x1490ee2e, 0x1b8ec911, 0xab496d4, 0x402e7d9, 0x15843cc2, 0x134f4fc, 0x4092bdc, 0x85a} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xfd7fccd498d70c73, 0x7eb816c3a85de11b, 0x8e0a71270648ecfd, 0xdf320f305c3a9e10, 0x223490ee2e78592e, 0x73ecaad25b5371d9, 0x69e9f95843cc2201, 0xf996d1024af702} +#else +{0xff99a931ae18e7, 0x16c3a85de11bfd, 0x938324767ebf5c, 0x170ea78423829c, 0x1cf0b25dbe641e6, 0x1371d9223490ee2, 0x1100b9f655692da, 0x9a7a7e5610f30, 0x432da20495ee} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1a7, 0x175b, 0x9bd, 0xb94, 0x1a66, 0x1d52, 0x1eb3, 0x1431, 0x9e7, 0x1b9d, 0x75f, 0xcba, 0x17e9, 0xe1d, 0xdb, 0xc7b, 0x76, 0xa04, 0xd73, 0x3f7, 0x17dd, 0x1555, 0x5d6, 0x16ee, 0x1df6, 0x1429, 0x15cb, 0x140b, 0x1aeb, 0x14fb, 0x1984, 0x179b, 0x1ba1, 0x125e, 0xb62, 0x249, 0x95a, 0x137a, 0x7c} +#elif RADIX == 32 +{0x10d3893a, 0x89bdbad, 0x14b4ccb9, 0x18facfa, 0x1b9d4f3d, 0x597475f, 0xdb876fd, 0x7663d83, 0x1ae6a040, 0xdf747ee, 0xe2eb555, 0x53df6b7, 0x102eb974, 0xa7debae, 0x379bcc2, 0x18a4bdba, 0xad09256, 0xcd2} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xccb944dedd6c34e2, 0x753cf431f59f54b4, 0xdb876fd2cba3afee, 0x76b9a8100ecc7b06, 0xd6ee2eb5556fba3f, 0xf5d740bae5d0a7be, 0x497b74379bcc253e, 0x84de92b42495b1} +#else +{0x17289bdbad869c4, 0xf431f59f54b4cc, 0x1e965d1d7f73a9e, 0x3b31ec1b6e1db, 0xadf747eed73502, 0x10a7bed6ee2eb55, 0x129f7aeba05d72e, 0xc525edd0de6f30, 0x109bd2568492b} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1d6a, 0x5b, 0x24a, 0x1bfc, 0x1cef, 0xc7e, 0x1cac, 0x1e4, 0x68, 0x16da, 0x30d, 0x13a5, 0x505, 0x329, 0x9f4, 0x1dae, 0x371, 0x111b, 0x200, 0x1b69, 0x1e51, 0x3b7, 0x316, 0x509, 0x1af2, 0x1220, 0x8c2, 0x195a, 0x1050, 0x1b7a, 0xd8b, 0x1a21, 0x336, 0x14fa, 0x1a4b, 0x11d, 0x167d, 0x1501, 0x302} +#elif RADIX == 32 +{0x1eb53915, 0x1824a02d, 0x1fb9dfbf, 0xf272b18, 0x16da0340, 0x1674a30d, 0x1a0ca4a0, 0x171ed727, 0x40111b1, 0x1f9476d2, 0x918b0ed, 0x41af228, 0x5691852, 0x1dbd4143, 0xda216c5, 0x12e9f433, 0x13e84774, 0xc8d} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xdfbfc125016fad4e, 0x680d01e4e5631fb9, 0xa0ca4a0b3a5186db, 0x9100446c6e3dae4f, 0x450918b0edfca3b6, 0xa0a195a46148835e, 0xd3e866da216c5ede, 0x75406cfa11dd25} +#else +{0x17f824a02df5a9c, 0x101e4e5631fb9df, 0x1059d28c36db406, 0x11b8f6b93e83292, 0x1bf9476d220088d, 0x8835e450918b0e, 0xf6f5050cad230a, 0x974fa19b6885b1, 0xea80d9f423ba} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1e9d, 0xbb9, 0x14f9, 0xc51, 0x1731, 0x122e, 0x1901, 0x59a, 0xcc1, 0xb65, 0xc68, 0x1eaf, 0x1f48, 0x1e46, 0xe46, 0x9c1, 0x1013, 0x12f8, 0x18a, 0x177f, 0x1e19, 0x1cca, 0x257, 0x18b9, 0xa38, 0x184b, 0x15a4, 0x86d, 0xa8c, 0x1df5, 0xf2, 0x37, 0x5d9, 0x292, 0x11ae, 0x9e, 0x1fce, 0x7f4, 0x407} +#elif RADIX == 32 +{0x1f4ecc63, 0x34f95dc, 0xbae62c5, 0xcd64064, 0xb656609, 0x3d5ec68, 0x3791be9, 0x134e0b9, 0x3152f88, 0x17866efe, 0x1912bf32, 0x96a38c5, 0x1b6b498, 0xefaaa31, 0x12037079, 0xb85245d, 0x1e7027a3, 0x727} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x62c51a7caee7d3b3, 0x9598259ac80c8bae, 0x3791be91eaf6342d, 0xf0c54be20269c172, 0x18b912bf32bc3377, 0x551886dad2612d47, 0xa48bb203707977d, 0x29fd3f9c09e8d7} +#else +{0x18a34f95dcfa766, 0x259ac80c8bae62, 0x148f57b1a16cacc, 0x809a705c8de46f, 0x57866efe18a97c, 0x12d4718b912bf3, 0xbbeaa8c436d693, 0x15c2922ec80dc1e, 0x53fa7f3813d1} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x177, 0xf70, 0x25, 0x503, 0x1f96, 0x1abd, 0x6f5, 0x115b, 0xa68, 0x1192, 0x338, 0x1bae, 0x15af, 0x1570, 0xb79, 0x1c9a, 0xe78, 0x19de, 0x860, 0x1076, 0x1a63, 0x1d52, 0x1511, 0x10c5, 0x1fdf, 0xab1, 0x1454, 0x2c4, 0x292, 0x1135, 0x273, 0x1d, 0xefa, 0x47, 0x344, 0x226, 0x9c1, 0x1af, 0x639} +#elif RADIX == 32 +{0xbbf600, 0x60257b8, 0xf7f2c50, 0xad9bd75, 0x11925344, 0x1f75c338, 0x1cd5c2b5, 0x78e4d2d, 0x10c19de7, 0x1698e0ec, 0x5a88f54, 0x163fdf86, 0xb128a8a, 0x189a8a48, 0x1401d139, 0x11008eef, 0xe088986, 0xd7a} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x2c503012bdc02efd, 0x494d115b37aeaf7f, 0xcd5c2b5fbae19c46, 0x64306779cf1c9a5b, 0xf0c5a88f54b4c707, 0x45242c4a2a2ac7fb, 0x11ddf401d139c4d, 0xd86bd3822261a2} +#else +{0xa060257b805dfb, 0x1115b37aeaf7f2c, 0x1afdd70ce2324a6, 0x73c72696f3570a, 0x9698e0ec860cef, 0xac7fbf0c5a88f5, 0xe26a2921625151, 0x8804777d00744e, 0xd7a70444c3} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x153b, 0x598, 0x100c, 0x1537, 0x1eda, 0x190b, 0x1406, 0x186e, 0x457, 0x469, 0x14a0, 0x1ce0, 0x1f6d, 0xf2f, 0x1837, 0x616, 0x16d0, 0xf35, 0x192b, 0x106, 0x17d6, 0x6b3, 0x169e, 0x27a, 0xe54, 0xa42, 0x1694, 0x16c3, 0x7b, 0x298, 0x118, 0xb0, 0x893, 0xbca, 0x1678, 0x19de, 0xb59, 0x3a, 0x43} +#elif RADIX == 32 +{0xa9d84f6, 0xf00c2cc, 0x2fdb553, 0x37501b2, 0x46922be, 0x179c14a0, 0x1bbcbfed, 0xd030b60, 0x1256f35b, 0x1df5820d, 0x1ab4f1ac, 0x84e5413, 0x1b0ed28a, 0x14c01ee, 0x60b008c, 0x1e179489, 0x1ace77ac, 0x8d2} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xb55378061662a761, 0xa48af86ea03642fd, 0xbbcbfedbce0a5011, 0x6c95bcd6da0616c1, 0x827ab4f1acefac10, 0xf76c3b4a2909ca, 0x2f291260b008c0a6, 0x680e96b39deb3c} +#else +{0xa6f00c2cc54ec2, 0xf86ea03642fdb5, 0x16de7052808d245, 0x1b68185b06ef2ff, 0x19df5820d92b79a, 0x909ca827ab4f1a, 0x53007bb61da51, 0xf0bca44982c023, 0xd01d2d673bd6} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x625d,0xe815,0xba6a,0x6297,0x1a75,0xd2b2,0xc698,0xd28b,0xb1,0x97f3,0x82e4,0x4126,0xf8e7,0x3639,0x1816,0x9c43,0xd2cf,0x37da,0xad52,0x2b8a,0x91cb,0x4297,0x6be7,0x1a98,0x19e4,0xa8a,0x22de,0x835c,0x4d5f,0x4596,0xa957,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe815625d,0x6297ba6a,0xd2b21a75,0xd28bc698,0x97f300b1,0x412682e4,0x3639f8e7,0x9c431816,0x37dad2cf,0x2b8aad52,0x429791cb,0x1a986be7,0xa8a19e4,0x835c22de,0x45964d5f,0x7a957}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6297ba6ae815625d,0xd28bc698d2b21a75,0x412682e497f300b1,0x9c4318163639f8e7,0x2b8aad5237dad2cf,0x1a986be7429791cb,0x835c22de0a8a19e4,0x7a95745964d5f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf6c6,0x71f7,0xa10,0xf04d,0x23dd,0x2419,0x60da,0xbcad,0xe86c,0xb26d,0x2f1d,0xdb61,0xae7,0xd947,0xb159,0x9d94,0x42db,0x8401,0xe3fe,0xcd5c,0x7586,0xfd38,0xf28a,0xc4c5,0x40d7,0x5c22,0x185c,0xd31f,0x843f,0xe782,0xb462,0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x71f7f6c6,0xf04d0a10,0x241923dd,0xbcad60da,0xb26de86c,0xdb612f1d,0xd9470ae7,0x9d94b159,0x840142db,0xcd5ce3fe,0xfd387586,0xc4c5f28a,0x5c2240d7,0xd31f185c,0xe782843f,0x5b462}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf04d0a1071f7f6c6,0xbcad60da241923dd,0xdb612f1db26de86c,0x9d94b159d9470ae7,0xcd5ce3fe840142db,0xc4c5f28afd387586,0xd31f185c5c2240d7,0x5b462e782843f}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x1c53,0x7318,0xfc96,0x4b34,0xd504,0xae17,0x4d56,0xa914,0x6a8c,0x69,0x2448,0x28b,0x5716,0xce1b,0xa7cc,0xd29c,0x48cf,0x1028,0xc81e,0x40dd,0xbcdf,0x6d4,0x36f7,0xcb9f,0x8d7,0x3a34,0x99c0,0x38d3,0x6e18,0xb4bc,0xe1a8,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x73181c53,0x4b34fc96,0xae17d504,0xa9144d56,0x696a8c,0x28b2448,0xce1b5716,0xd29ca7cc,0x102848cf,0x40ddc81e,0x6d4bcdf,0xcb9f36f7,0x3a3408d7,0x38d399c0,0xb4bc6e18,0xbe1a8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4b34fc9673181c53,0xa9144d56ae17d504,0x28b244800696a8c,0xd29ca7ccce1b5716,0x40ddc81e102848cf,0xcb9f36f706d4bcdf,0x38d399c03a3408d7,0xbe1a8b4bc6e18}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x9da3,0x17ea,0x4595,0x9d68,0xe58a,0x2d4d,0x3967,0x2d74,0xff4e,0x680c,0x7d1b,0xbed9,0x718,0xc9c6,0xe7e9,0x63bc,0x2d30,0xc825,0x52ad,0xd475,0x6e34,0xbd68,0x9418,0xe567,0xe61b,0xf575,0xdd21,0x7ca3,0xb2a0,0xba69,0x56a8,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x17ea9da3,0x9d684595,0x2d4de58a,0x2d743967,0x680cff4e,0xbed97d1b,0xc9c60718,0x63bce7e9,0xc8252d30,0xd47552ad,0xbd686e34,0xe5679418,0xf575e61b,0x7ca3dd21,0xba69b2a0,0x856a8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9d68459517ea9da3,0x2d7439672d4de58a,0xbed97d1b680cff4e,0x63bce7e9c9c60718,0xd47552adc8252d30,0xe5679418bd686e34,0x7ca3dd21f575e61b,0x856a8ba69b2a0}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf3b3,0x88db,0xd050,0x75f1,0x10dd,0x8cbe,0x97c4,0xe7a2,0xe6ae,0xf1e2,0xd51f,0x8d12,0x55a8,0x6395,0xc98a,0xc097,0x60c3,0x66aa,0x54f3,0x78ce,0x5dce,0x7fb3,0x99a7,0x3e1,0x8753,0x3c9a,0x3339,0x30f3,0x406e,0xc05e,0xc99f,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x88dbf3b3,0x75f1d050,0x8cbe10dd,0xe7a297c4,0xf1e2e6ae,0x8d12d51f,0x639555a8,0xc097c98a,0x66aa60c3,0x78ce54f3,0x7fb35dce,0x3e199a7,0x3c9a8753,0x30f33339,0xc05e406e,0x7c99f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x75f1d05088dbf3b3,0xe7a297c48cbe10dd,0x8d12d51ff1e2e6ae,0xc097c98a639555a8,0x78ce54f366aa60c3,0x3e199a77fb35dce,0x30f333393c9a8753,0x7c99fc05e406e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xbdde,0x1bf3,0x7bc0,0xcae7,0x8d2e,0x58a8,0x4b1a,0xbcb8,0xccd9,0x3d98,0xfcf2,0x4881,0x66f8,0x3473,0x2e8a,0x730d,0xabbf,0x4789,0xdce9,0x58ea,0xf54,0x6169,0x58d0,0x3280,0xe1f9,0x5bd0,0x67a0,0x23d2,0x2611,0x18e1,0xd51f,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1bf3bdde,0xcae77bc0,0x58a88d2e,0xbcb84b1a,0x3d98ccd9,0x4881fcf2,0x347366f8,0x730d2e8a,0x4789abbf,0x58eadce9,0x61690f54,0x328058d0,0x5bd0e1f9,0x23d267a0,0x18e12611,0x7d51f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xcae77bc01bf3bdde,0xbcb84b1a58a88d2e,0x4881fcf23d98ccd9,0x730d2e8a347366f8,0x58eadce94789abbf,0x328058d061690f54,0x23d267a05bd0e1f9,0x7d51f18e12611}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xee54,0xe36f,0x939d,0xea02,0xe6db,0xa7ae,0x9f39,0x8bb3,0x7f02,0xf594,0xa9ab,0xae5e,0x9a76,0x7fc0,0xd9a,0xbecd,0x692d,0x8b68,0x30f4,0xff9a,0xd1ae,0xfd43,0xbdfc,0xc552,0xfe0d,0xa4bf,0x33e5,0x981b,0x202c,0x45e8,0x8573,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe36fee54,0xea02939d,0xa7aee6db,0x8bb39f39,0xf5947f02,0xae5ea9ab,0x7fc09a76,0xbecd0d9a,0x8b68692d,0xff9a30f4,0xfd43d1ae,0xc552bdfc,0xa4bffe0d,0x981b33e5,0x45e8202c,0xc8573}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xea02939de36fee54,0x8bb39f39a7aee6db,0xae5ea9abf5947f02,0xbecd0d9a7fc09a76,0xff9a30f48b68692d,0xc552bdfcfd43d1ae,0x981b33e5a4bffe0d,0xc857345e8202c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc4d,0x7724,0x2faf,0x8a0e,0xef22,0x7341,0x683b,0x185d,0x1951,0xe1d,0x2ae0,0x72ed,0xaa57,0x9c6a,0x3675,0x3f68,0x9f3c,0x9955,0xab0c,0x8731,0xa231,0x804c,0x6658,0xfc1e,0x78ac,0xc365,0xccc6,0xcf0c,0xbf91,0x3fa1,0x3660,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x77240c4d,0x8a0e2faf,0x7341ef22,0x185d683b,0xe1d1951,0x72ed2ae0,0x9c6aaa57,0x3f683675,0x99559f3c,0x8731ab0c,0x804ca231,0xfc1e6658,0xc36578ac,0xcf0cccc6,0x3fa1bf91,0x83660}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8a0e2faf77240c4d,0x185d683b7341ef22,0x72ed2ae00e1d1951,0x3f6836759c6aaa57,0x8731ab0c99559f3c,0xfc1e6658804ca231,0xcf0cccc6c36578ac,0x836603fa1bf91}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x1aff,0x9f84,0xf1c6,0xd816,0xbdd0,0xd450,0x1990,0x119,0xbcf7,0x1a97,0x4780,0x8209,0x695b,0x1d73,0x20ba,0x7b53,0x5e3c,0x4ce5,0xac53,0x351f,0xaaa3,0x5a3e,0xd54c,0x121f,0xbf17,0xdb55,0xc9c,0x8370,0x2061,0x415c,0x1f35,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9f841aff,0xd816f1c6,0xd450bdd0,0x1191990,0x1a97bcf7,0x82094780,0x1d73695b,0x7b5320ba,0x4ce55e3c,0x351fac53,0x5a3eaaa3,0x121fd54c,0xdb55bf17,0x83700c9c,0x415c2061,0xc1f35}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd816f1c69f841aff,0x1191990d450bdd0,0x820947801a97bcf7,0x7b5320ba1d73695b,0x351fac534ce55e3c,0x121fd54c5a3eaaa3,0x83700c9cdb55bf17,0xc1f35415c2061}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x7734,0xde6f,0xbab1,0xd4f3,0xc928,0x6c68,0x69b0,0x7cc0,0x994f,0x296c,0xb1dc,0x2eb2,0xe4ce,0x8494,0xa8ff,0x95d3,0x5f30,0xe7f,0x918,0x6cd6,0xae27,0x747c,0x1f93,0xed96,0x5590,0xc91a,0x713d,0xc33e,0xc075,0x40fd,0x9ce5,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xde6f7734,0xd4f3bab1,0x6c68c928,0x7cc069b0,0x296c994f,0x2eb2b1dc,0x8494e4ce,0x95d3a8ff,0xe7f5f30,0x6cd60918,0x747cae27,0xed961f93,0xc91a5590,0xc33e713d,0x40fdc075,0x39ce5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd4f3bab1de6f7734,0x7cc069b06c68c928,0x2eb2b1dc296c994f,0x95d3a8ff8494e4ce,0x6cd609180e7f5f30,0xed961f93747cae27,0xc33e713dc91a5590,0x39ce540fdc075}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xda85,0x89f5,0x1aaf,0x9ec7,0xcfff,0xec63,0x3ae9,0x20bc,0xc2f3,0x9942,0x7d84,0xfa25,0x5e69,0xeb7b,0xc357,0x9342,0x5c58,0xd26c,0x857b,0x7a7f,0x757,0xfb5c,0xbb97,0x33,0x6c28,0xfceb,0xd644,0xcc0a,0x22ad,0xe1c0,0x12d6,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x89f5da85,0x9ec71aaf,0xec63cfff,0x20bc3ae9,0x9942c2f3,0xfa257d84,0xeb7b5e69,0x9342c357,0xd26c5c58,0x7a7f857b,0xfb5c0757,0x33bb97,0xfceb6c28,0xcc0ad644,0xe1c022ad,0x412d6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9ec71aaf89f5da85,0x20bc3ae9ec63cfff,0xfa257d849942c2f3,0x9342c357eb7b5e69,0x7a7f857bd26c5c58,0x33bb97fb5c0757,0xcc0ad644fceb6c28,0x412d6e1c022ad}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xe501,0x607b,0xe39,0x27e9,0x422f,0x2baf,0xe66f,0xfee6,0x4308,0xe568,0xb87f,0x7df6,0x96a4,0xe28c,0xdf45,0x84ac,0xa1c3,0xb31a,0x53ac,0xcae0,0x555c,0xa5c1,0x2ab3,0xede0,0x40e8,0x24aa,0xf363,0x7c8f,0xdf9e,0xbea3,0xe0ca,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x607be501,0x27e90e39,0x2baf422f,0xfee6e66f,0xe5684308,0x7df6b87f,0xe28c96a4,0x84acdf45,0xb31aa1c3,0xcae053ac,0xa5c1555c,0xede02ab3,0x24aa40e8,0x7c8ff363,0xbea3df9e,0x3e0ca}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x27e90e39607be501,0xfee6e66f2baf422f,0x7df6b87fe5684308,0x84acdf45e28c96a4,0xcae053acb31aa1c3,0xede02ab3a5c1555c,0x7c8ff36324aa40e8,0x3e0cabea3df9e}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x625d,0xe815,0xba6a,0x6297,0x1a75,0xd2b2,0xc698,0xd28b,0xb1,0x97f3,0x82e4,0x4126,0xf8e7,0x3639,0x1816,0x9c43,0xd2cf,0x37da,0xad52,0x2b8a,0x91cb,0x4297,0x6be7,0x1a98,0x19e4,0xa8a,0x22de,0x835c,0x4d5f,0x4596,0xa957,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe815625d,0x6297ba6a,0xd2b21a75,0xd28bc698,0x97f300b1,0x412682e4,0x3639f8e7,0x9c431816,0x37dad2cf,0x2b8aad52,0x429791cb,0x1a986be7,0xa8a19e4,0x835c22de,0x45964d5f,0x7a957}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6297ba6ae815625d,0xd28bc698d2b21a75,0x412682e497f300b1,0x9c4318163639f8e7,0x2b8aad5237dad2cf,0x1a986be7429791cb,0x835c22de0a8a19e4,0x7a95745964d5f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf6c6,0x71f7,0xa10,0xf04d,0x23dd,0x2419,0x60da,0xbcad,0xe86c,0xb26d,0x2f1d,0xdb61,0xae7,0xd947,0xb159,0x9d94,0x42db,0x8401,0xe3fe,0xcd5c,0x7586,0xfd38,0xf28a,0xc4c5,0x40d7,0x5c22,0x185c,0xd31f,0x843f,0xe782,0xb462,0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x71f7f6c6,0xf04d0a10,0x241923dd,0xbcad60da,0xb26de86c,0xdb612f1d,0xd9470ae7,0x9d94b159,0x840142db,0xcd5ce3fe,0xfd387586,0xc4c5f28a,0x5c2240d7,0xd31f185c,0xe782843f,0x5b462}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf04d0a1071f7f6c6,0xbcad60da241923dd,0xdb612f1db26de86c,0x9d94b159d9470ae7,0xcd5ce3fe840142db,0xc4c5f28afd387586,0xd31f185c5c2240d7,0x5b462e782843f}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x1c53,0x7318,0xfc96,0x4b34,0xd504,0xae17,0x4d56,0xa914,0x6a8c,0x69,0x2448,0x28b,0x5716,0xce1b,0xa7cc,0xd29c,0x48cf,0x1028,0xc81e,0x40dd,0xbcdf,0x6d4,0x36f7,0xcb9f,0x8d7,0x3a34,0x99c0,0x38d3,0x6e18,0xb4bc,0xe1a8,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x73181c53,0x4b34fc96,0xae17d504,0xa9144d56,0x696a8c,0x28b2448,0xce1b5716,0xd29ca7cc,0x102848cf,0x40ddc81e,0x6d4bcdf,0xcb9f36f7,0x3a3408d7,0x38d399c0,0xb4bc6e18,0xbe1a8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4b34fc9673181c53,0xa9144d56ae17d504,0x28b244800696a8c,0xd29ca7ccce1b5716,0x40ddc81e102848cf,0xcb9f36f706d4bcdf,0x38d399c03a3408d7,0xbe1a8b4bc6e18}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x9da3,0x17ea,0x4595,0x9d68,0xe58a,0x2d4d,0x3967,0x2d74,0xff4e,0x680c,0x7d1b,0xbed9,0x718,0xc9c6,0xe7e9,0x63bc,0x2d30,0xc825,0x52ad,0xd475,0x6e34,0xbd68,0x9418,0xe567,0xe61b,0xf575,0xdd21,0x7ca3,0xb2a0,0xba69,0x56a8,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x17ea9da3,0x9d684595,0x2d4de58a,0x2d743967,0x680cff4e,0xbed97d1b,0xc9c60718,0x63bce7e9,0xc8252d30,0xd47552ad,0xbd686e34,0xe5679418,0xf575e61b,0x7ca3dd21,0xba69b2a0,0x856a8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9d68459517ea9da3,0x2d7439672d4de58a,0xbed97d1b680cff4e,0x63bce7e9c9c60718,0xd47552adc8252d30,0xe5679418bd686e34,0x7ca3dd21f575e61b,0x856a8ba69b2a0}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf9da,0x446d,0xe828,0xbaf8,0x86e,0x465f,0x4be2,0x73d1,0x7357,0xf8f1,0x6a8f,0x4689,0xaad4,0x31ca,0xe4c5,0xe04b,0x3061,0xb355,0x2a79,0x3c67,0xaee7,0xbfd9,0xccd3,0x81f0,0x43a9,0x9e4d,0x999c,0x1879,0x2037,0xe02f,0xe4cf,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x446df9da,0xbaf8e828,0x465f086e,0x73d14be2,0xf8f17357,0x46896a8f,0x31caaad4,0xe04be4c5,0xb3553061,0x3c672a79,0xbfd9aee7,0x81f0ccd3,0x9e4d43a9,0x1879999c,0xe02f2037,0xbe4cf}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbaf8e828446df9da,0x73d14be2465f086e,0x46896a8ff8f17357,0xe04be4c531caaad4,0x3c672a79b3553061,0x81f0ccd3bfd9aee7,0x1879999c9e4d43a9,0xbe4cfe02f2037}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xdeef,0xdf9,0xbde0,0x6573,0x4697,0x2c54,0x258d,0xde5c,0x666c,0x1ecc,0xfe79,0x2440,0xb37c,0x1a39,0x9745,0xb986,0xd5df,0xa3c4,0x6e74,0x2c75,0x87aa,0x30b4,0x2c68,0x9940,0x70fc,0x2de8,0x33d0,0x91e9,0x9308,0x8c70,0xea8f,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdf9deef,0x6573bde0,0x2c544697,0xde5c258d,0x1ecc666c,0x2440fe79,0x1a39b37c,0xb9869745,0xa3c4d5df,0x2c756e74,0x30b487aa,0x99402c68,0x2de870fc,0x91e933d0,0x8c709308,0xbea8f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6573bde00df9deef,0xde5c258d2c544697,0x2440fe791ecc666c,0xb98697451a39b37c,0x2c756e74a3c4d5df,0x99402c6830b487aa,0x91e933d02de870fc,0xbea8f8c709308}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf72a,0xf1b7,0x49ce,0xf501,0x736d,0xd3d7,0xcf9c,0x45d9,0x3f81,0xfaca,0x54d5,0x572f,0x4d3b,0x3fe0,0x86cd,0xdf66,0x3496,0x45b4,0x187a,0x7fcd,0xe8d7,0x7ea1,0x5efe,0xe2a9,0xff06,0xd25f,0x99f2,0x4c0d,0x1016,0xa2f4,0x42b9,0xe}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf1b7f72a,0xf50149ce,0xd3d7736d,0x45d9cf9c,0xfaca3f81,0x572f54d5,0x3fe04d3b,0xdf6686cd,0x45b43496,0x7fcd187a,0x7ea1e8d7,0xe2a95efe,0xd25fff06,0x4c0d99f2,0xa2f41016,0xe42b9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf50149cef1b7f72a,0x45d9cf9cd3d7736d,0x572f54d5faca3f81,0xdf6686cd3fe04d3b,0x7fcd187a45b43496,0xe2a95efe7ea1e8d7,0x4c0d99f2d25fff06,0xe42b9a2f41016}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x627,0xbb92,0x17d7,0x4507,0xf791,0xb9a0,0xb41d,0x8c2e,0x8ca8,0x70e,0x9570,0xb976,0x552b,0xce35,0x1b3a,0x1fb4,0xcf9e,0x4caa,0xd586,0xc398,0x5118,0x4026,0x332c,0x7e0f,0xbc56,0x61b2,0x6663,0xe786,0xdfc8,0x1fd0,0x1b30,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xbb920627,0x450717d7,0xb9a0f791,0x8c2eb41d,0x70e8ca8,0xb9769570,0xce35552b,0x1fb41b3a,0x4caacf9e,0xc398d586,0x40265118,0x7e0f332c,0x61b2bc56,0xe7866663,0x1fd0dfc8,0x41b30}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x450717d7bb920627,0x8c2eb41db9a0f791,0xb9769570070e8ca8,0x1fb41b3ace35552b,0xc398d5864caacf9e,0x7e0f332c40265118,0xe786666361b2bc56,0x41b301fd0dfc8}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x679c,0x35ac,0x6c8c,0xee5e,0x2827,0x29fa,0x9f6c,0xbda,0x2083,0x5e20,0xd351,0x39bd,0xd9bc,0x4085,0x3727,0x8f2,0xe905,0x55dd,0x6f90,0x6e26,0x6779,0xf15a,0xf170,0xec90,0xdb0e,0x53a0,0x6f99,0xe710,0xad92,0xa7f0,0xe2e1,0xd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x35ac679c,0xee5e6c8c,0x29fa2827,0xbda9f6c,0x5e202083,0x39bdd351,0x4085d9bc,0x8f23727,0x55dde905,0x6e266f90,0xf15a6779,0xec90f170,0x53a0db0e,0xe7106f99,0xa7f0ad92,0xde2e1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xee5e6c8c35ac679c,0xbda9f6c29fa2827,0x39bdd3515e202083,0x8f237274085d9bc,0x6e266f9055dde905,0xec90f170f15a6779,0xe7106f9953a0db0e,0xde2e1a7f0ad92}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xa483,0xbf25,0x238c,0x4c65,0xdd0b,0xccc9,0xc5af,0xac20,0xe998,0xb162,0xe2bf,0xbd24,0x5fd,0x6720,0xd781,0xd37d,0xa89,0x595a,0x76b0,0x7f86,0xdea4,0x59ea,0x2c01,0xd679,0x714b,0x5454,0xe262,0x2bcf,0xfad4,0x8bc0,0x8cd3,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xbf25a483,0x4c65238c,0xccc9dd0b,0xac20c5af,0xb162e998,0xbd24e2bf,0x672005fd,0xd37dd781,0x595a0a89,0x7f8676b0,0x59eadea4,0xd6792c01,0x5454714b,0x2bcfe262,0x8bc0fad4,0xc8cd3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4c65238cbf25a483,0xac20c5afccc9dd0b,0xbd24e2bfb162e998,0xd37dd781672005fd,0x7f8676b0595a0a89,0xd6792c0159eadea4,0x2bcfe2625454714b,0xc8cd38bc0fad4}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x3f72,0x6188,0x95e8,0xed15,0x2b1a,0x2fd,0xaae9,0x15d9,0x5945,0x23ff,0xfe55,0xce25,0xaa48,0xa648,0x8534,0x16db,0x3fcf,0xa301,0xfb7c,0x3a68,0x4ba,0x1c1d,0x30ee,0xf044,0x116f,0xc4f8,0x98b2,0x4971,0xea5c,0xb93e,0x2836,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x61883f72,0xed1595e8,0x2fd2b1a,0x15d9aae9,0x23ff5945,0xce25fe55,0xa648aa48,0x16db8534,0xa3013fcf,0x3a68fb7c,0x1c1d04ba,0xf04430ee,0xc4f8116f,0x497198b2,0xb93eea5c,0x32836}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xed1595e861883f72,0x15d9aae902fd2b1a,0xce25fe5523ff5945,0x16db8534a648aa48,0x3a68fb7ca3013fcf,0xf04430ee1c1d04ba,0x497198b2c4f8116f,0x32836b93eea5c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x9864,0xca53,0x9373,0x11a1,0xd7d8,0xd605,0x6093,0xf425,0xdf7c,0xa1df,0x2cae,0xc642,0x2643,0xbf7a,0xc8d8,0xf70d,0x16fa,0xaa22,0x906f,0x91d9,0x9886,0xea5,0xe8f,0x136f,0x24f1,0xac5f,0x9066,0x18ef,0x526d,0x580f,0x1d1e,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xca539864,0x11a19373,0xd605d7d8,0xf4256093,0xa1dfdf7c,0xc6422cae,0xbf7a2643,0xf70dc8d8,0xaa2216fa,0x91d9906f,0xea59886,0x136f0e8f,0xac5f24f1,0x18ef9066,0x580f526d,0x21d1e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x11a19373ca539864,0xf4256093d605d7d8,0xc6422caea1dfdf7c,0xf70dc8d8bf7a2643,0x91d9906faa2216fa,0x136f0e8f0ea59886,0x18ef9066ac5f24f1,0x21d1e580f526d}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x185f, 0xecc, 0x21c, 0xa62, 0x77, 0x8b1, 0x1188, 0xec2, 0xda1, 0xbf0, 0xb11, 0x82d, 0x1fe9, 0x10d4, 0x1e36, 0x194e, 0x77e, 0x1112, 0x14c0, 0x1dcd, 0x1be7, 0x1a4c, 0x140e, 0x10c5, 0x1aaf, 0x236, 0xdf3, 0x1a21, 0x1dff, 0x15bb, 0xda8, 0x30e, 0x17b0, 0xc7b, 0xd1, 0xcb, 0x868, 0x2e5, 0x5a} +#elif RADIX == 32 +{0xc2f86ac, 0x421c766, 0xc40eea6, 0x16146211, 0xbf06d0b, 0x505ab11, 0x1b4353fd, 0x17eca778, 0x9811123, 0x6f9fb9b, 0x5a07693, 0x6daaf86, 0x885be62, 0xaddf7ff, 0x30e6d4, 0x1458f77b, 0x34032c1, 0x52a} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xeea6210e3b330be1, 0xc1b42ec28c422c40, 0xb4353fd282d588af, 0xda604448efd94ef1, 0xf0c5a0769337cfdc, 0xfbffa216f988db55, 0xb1eef6030e6d456e, 0x120b950d00cb068} +#else +{0x14c421c766617c3, 0x2ec28c422c40ee, 0x1e9416ac457e0da, 0x3bf653bc6d0d4f, 0x66f9fb9b4c0889, 0x8db55f0c5a0769, 0x2b77dffd10b7cc, 0x1a2c7bbd80c39b5, 0x9172a1a01960} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x61a, 0x3b3, 0x1087, 0x1a98, 0x81d, 0x22c, 0x1462, 0xbb0, 0x368, 0xafc, 0xac4, 0xa0b, 0x7fa, 0x1435, 0x178d, 0x1653, 0x11df, 0x444, 0xd30, 0x1f73, 0x6f9, 0x1693, 0xd03, 0x1c31, 0x16ab, 0x188d, 0xb7c, 0x1e88, 0x1f7f, 0x56e, 0x136a, 0xc3, 0x1dec, 0xb1e, 0x1834, 0x32, 0xa1a, 0x10b9, 0xe6} +#elif RADIX == 32 +{0x130d1113, 0x110871d9, 0xb103ba9, 0x1d851884, 0xafc1b42, 0x9416ac4, 0x6d0d4ff, 0x1dfb29de, 0x1a604448, 0x19be7ee6, 0x11681da4, 0x11b6abe1, 0x1a216f98, 0x2b77dff, 0x180c39b5, 0xd163dde, 0x10d00cb0, 0x54a} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3ba988438eccc344, 0xf06d0bb0a3108b10, 0x6d0d4ff4a0b5622b, 0x369811123bf653bc, 0x7c31681da4cdf3f7, 0xbeffe885be6236d5, 0x2c7bbd80c39b515b, 0x742e5434032c1a} +#else +{0x15310871d998688, 0x10bb0a3108b103b, 0x1fa505ab115f836, 0x8efd94ef1b4353, 0x99be7ee6d30222, 0x236d57c31681da, 0x8addf7ff442df3, 0x68b1eef6030e6d, 0xe85ca8680658} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0xa5a, 0x2ab, 0x659, 0x149f, 0xf1b, 0xa1a, 0xb05, 0x1915, 0x1aa8, 0x1aa0, 0x1c4d, 0xe2f, 0xe1c, 0x19ab, 0x1d34, 0xa8f, 0xf59, 0x1f1, 0xc6d, 0x520, 0xb6e, 0x127f, 0x5dd, 0x175a, 0x1957, 0x1ca4, 0x1563, 0x122f, 0x705, 0xcd6, 0x1c02, 0xdc1, 0x93b, 0x387, 0x1870, 0x54, 0x853, 0x1adc, 0x6bc} +#elif RADIX == 32 +{0x152d7fc4, 0x1e659155, 0x69e3749, 0x8aac154, 0x1aa0d546, 0x11c5fc4d, 0x1a66adc3, 0x159547f4, 0x18da1f17, 0x1adb8a40, 0x1a2eec9f, 0x149957ba, 0x8beac7c, 0x66b1c16, 0x16dc1e01, 0x1c070e93, 0x2981530, 0xe2} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3749f32c8aad4b5f, 0x83551915582a869e, 0xa66adc38e2fe26ea, 0x63687c5eb2a8fe9, 0xf75a2eec9fd6dc52, 0x8e0b22fab1f2932a, 0xe1d276dc1e01335, 0x196b710a6054c38} +#else +{0x93e659155a96bf, 0x11915582a869e37, 0x1c717f137541aa, 0x17acaa3fa699ab7, 0x1fadb8a40c6d0f8, 0x12932af75a2eec9, 0x99ac705917d58f, 0xe038749db70780, 0x17d6e214c0a98} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x66e, 0xe79, 0xadd, 0x23, 0xf11, 0x7d6, 0x1091, 0x42a, 0x1885, 0x128, 0x6f9, 0xcdd, 0x1d55, 0x19bd, 0x116f, 0x1dbd, 0x107b, 0xaef, 0x8bc, 0xa74, 0x7b5, 0xdff, 0x743, 0x17e0, 0x453, 0x414, 0x672, 0xf28, 0x198a, 0x19c4, 0x1e85, 0xcb9, 0x17c2, 0x14c6, 0x1871, 0x1034, 0x6cb, 0x55b, 0xbf} +#elif RADIX == 32 +{0x13370e29, 0x6add73c, 0x159e2202, 0x154244f, 0x128c429, 0x159ba6f9, 0x17e6f7aa, 0x7bedec5, 0x1178aef8, 0x19ed54e8, 0x3a1b7f, 0x28453bf, 0x1ca0ce44, 0x1ce26629, 0x4cb9f42, 0x1c698d7c, 0x165c0d30, 0x159} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x2202356eb9e4cdc3, 0xa310a42a8489f59e, 0x7e6f7aaacdd37c84, 0x445e2bbe0f7dbd8b, 0x77e03a1b7fcf6aa7, 0x3314f2833910508a, 0xd31af84cb9f42e71, 0xe956cd97034c38} +#else +{0x46add73c99b87, 0xa42a8489f59e22, 0x15566e9be425188, 0x183df6f62df9bde, 0x1f9ed54e88bc577, 0x10508a77e03a1b7, 0x1738998a79419c8, 0xe34c6be132e7d0, 0x22ad9b2e0698} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x165f, 0x1e7c, 0xe41, 0x12eb, 0xa1, 0x1655, 0x6db, 0x1dfc, 0x4a, 0xac7, 0x1dcb, 0x3d9, 0x16a0, 0x562, 0x1d70, 0x528, 0xaa7, 0x172e, 0x36c, 0x728, 0x1e76, 0x23f, 0x6e6, 0x53e, 0x1640, 0x1a82, 0x1b78, 0x1066, 0x895, 0x17eb, 0x1713, 0x174d, 0x679, 0x1415, 0x19a8, 0xe7c, 0x674, 0x1f81, 0x15} +#elif RADIX == 32 +{0xb2f81a0, 0x16e41f3e, 0x1541432e, 0xfe1b6ec, 0xac70257, 0x7b3dcb, 0x18158ad4, 0xa729475, 0x6d972e5, 0x1f9d8e50, 0x1e37308f, 0x10564029, 0x19b6f1a, 0x1bf5a256, 0x1374db89, 0xa282a67, 0x13a39f33, 0xc09} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x432eb720f9f2cbe0, 0x1c095dfc36dd9541, 0x8158ad403d9ee5ab, 0x81b65cb954e528eb, 0x53e37308ffcec72, 0xd12b066dbc6a0ac8, 0x5054cf374db89dfa, 0xafe04ce8e7ccd4} +#else +{0x5d6e41f3e597c0, 0x15dfc36dd954143, 0xa01ecf72d58e04, 0x55394a3ae0562b, 0x1ff9d8e5036cb97, 0xa0ac8053e37308, 0xefd68958336de3, 0x15141533cdd36e2, 0x15fc099d1cf99} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1e32, 0x1f7c, 0x1c05, 0x372, 0x34a, 0x1d26, 0x11b9, 0x294, 0xa87, 0x1835, 0x158f, 0x1d19, 0x13e8, 0x4dc, 0x1e1a, 0x195f, 0x116e, 0x62c, 0x1839, 0x107a, 0xa4f, 0x119f, 0x18f3, 0xc48, 0x1c7a, 0x100d, 0x2e9, 0x12df, 0xbec, 0x6f1, 0x8bf, 0xe24, 0xa57, 0x50c, 0x28b, 0x31e, 0x430, 0x1b08, 0x378} +#elif RADIX == 32 +{0xf1941d7, 0x5c05fbe, 0x9869437, 0x14a46e7a, 0x18355438, 0x3a3358f, 0xd13727d, 0x16ecaff8, 0x107262c8, 0x1a93e0f5, 0x8c79c67, 0x1bc7a62, 0xb7c5d30, 0x1378afb2, 0xee2445f, 0x2ca18a5, 0x180c785, 0x1c1} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x94372e02fdf3c650, 0xd550e2948dcf4986, 0xd13727d1d19ac7e0, 0xac1c98b22dd95ff0, 0x4c48c79c67d49f07, 0x57d92df174c0378f, 0x94314aee2445f9bc, 0xc6c2086031e145} +#else +{0x6e5c05fbe78ca0, 0xe2948dcf498694, 0x1e8e8cd63f06aa8, 0x8b7657fc344dc9, 0xfa93e0f5839316, 0x378f4c48c79c6, 0x1cde2bec96f8ba6, 0x11650c52bb89117, 0x18d8410c063c2} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1044, 0x2d0, 0x1004, 0x1082, 0x535, 0x141a, 0x10a6, 0x1f9d, 0xc2d, 0x1347, 0xdf4, 0x1db1, 0x90e, 0x116d, 0x59c, 0xc2b, 0x7c2, 0x15d7, 0x119, 0x32c, 0x1e89, 0x1b01, 0xe5f, 0x105f, 0xd7d, 0xb4f, 0x1c33, 0x1b3b, 0xf2d, 0xc22, 0x11d8, 0x1848, 0x11a9, 0x1ee7, 0x6ea, 0x165d, 0x17d4, 0x77, 0x64b} +#elif RADIX == 32 +{0x8227755, 0x5004168, 0x68a6b08, 0x1cec29a8, 0x1347616f, 0x1bb62df4, 0xe45b521, 0x1c261596, 0x2335d73, 0xfa24658, 0x1f72fec0, 0x9ed7d82, 0xcef866b, 0x6113cb7, 0x138488ec, 0x1abdcf1a, 0x1ea5974d, 0x83d} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x6b0828020b42089d, 0x1d85bf9d8535068a, 0xe45b521ddb16fa4d, 0xc08cd75cf84c2b2c, 0xb05f72fec07d1232, 0x9e5bb3be19ad3daf, 0x7b9e3538488ec308, 0x1681defa965d375} +#else +{0x1050041684113b, 0x1bf9d8535068a6b, 0x10eed8b7d268ec2, 0x13e130acb3916d4, 0xfa24658119aeb, 0xd3dafb05f72fec, 0x1844f2dd9df0cd, 0x1d5ee78d4e1223b, 0x1203bdf52cba6} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x7bc, 0x14d4, 0x1225, 0x1afb, 0x179e, 0x2c0, 0x1c0, 0x1267, 0x450, 0x1f26, 0x1e3f, 0x2bb, 0x19a5, 0x12f9, 0xa57, 0x2d, 0x1ed, 0xa16, 0x754, 0x1893, 0x759, 0x6bb, 0x618, 0x1379, 0xff3, 0x1989, 0x1abb, 0x1c40, 0x1bf5, 0x71e, 0xd6d, 0xc04, 0x15ef, 0x6aa, 0x4da, 0x1fb6, 0xb5b, 0x9f2, 0x211} +#elif RADIX == 32 +{0x3de2735, 0x17225a6a, 0x102f3daf, 0x13387005, 0x1f262284, 0x14577e3f, 0xbcbe734, 0x1ed016a9, 0xea8a160, 0x19d67126, 0x1930c1ae, 0x112ff39b, 0x11035779, 0x138f6fd7, 0x1ec046b6, 0x168d555e, 0x1adfed89, 0x412} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3dafb912d350f789, 0x988a12670e00b02f, 0xbcbe734a2bbf1ffc, 0x33aa28583da02d52, 0x737930c1aeceb389, 0xb7ebc40d5de625fe, 0x1aaabdec046b69c7, 0x15a7c96b7fb626d} +#else +{0x15f7225a6a1ef13, 0x12670e00b02f3d, 0x1a515df8ffe4c45, 0xf680b54af2f9c, 0x1d9d6712675450b, 0x625fe737930c1a, 0x14e3dbf5e206aef, 0x1b46aaaf7b011ad, 0x104f92d6ff6c4} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x5b0b,0xfec,0x3254,0x9d11,0x8130,0x32bb,0x65ca,0x86b8,0x8184,0xfce7,0x3cc3,0x667c,0xa54b,0x4e65,0x271e,0x9834,0xa9c,0x1d81,0x5e0d,0x45fd,0x26eb,0x4b0b,0x5f8f,0x7e57,0xd36f,0xcb4c,0x56b4,0xe984,0xad75,0xcfdf,0x59a1,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xfec5b0b,0x9d113254,0x32bb8130,0x86b865ca,0xfce78184,0x667c3cc3,0x4e65a54b,0x9834271e,0x1d810a9c,0x45fd5e0d,0x4b0b26eb,0x7e575f8f,0xcb4cd36f,0xe98456b4,0xcfdfad75,0xb59a1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9d1132540fec5b0b,0x86b865ca32bb8130,0x667c3cc3fce78184,0x9834271e4e65a54b,0x45fd5e0d1d810a9c,0x7e575f8f4b0b26eb,0xe98456b4cb4cd36f,0xb59a1cfdfad75}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x2bba,0x15e8,0x1c2b,0x55ed,0xb72c,0xb3cc,0x3a5c,0xb409,0x2f3d,0x71b,0xd365,0x90a1,0xb2f5,0x1e26,0xbe0,0xa633,0xc5a6,0xe2bd,0xe0e3,0x49b3,0xd4c8,0x9f1c,0x9ba3,0x3674,0x2e5a,0x5411,0xc603,0xcdd3,0xfb23,0x2e7e,0x88a,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x15e82bba,0x55ed1c2b,0xb3ccb72c,0xb4093a5c,0x71b2f3d,0x90a1d365,0x1e26b2f5,0xa6330be0,0xe2bdc5a6,0x49b3e0e3,0x9f1cd4c8,0x36749ba3,0x54112e5a,0xcdd3c603,0x2e7efb23,0x4088a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x55ed1c2b15e82bba,0xb4093a5cb3ccb72c,0x90a1d365071b2f3d,0xa6330be01e26b2f5,0x49b3e0e3e2bdc5a6,0x36749ba39f1cd4c8,0xcdd3c60354112e5a,0x4088a2e7efb23}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xa8e5,0xb5b7,0x12fc,0x2365,0x6f00,0x2267,0x5260,0x5ece,0xbf38,0x93ee,0xfcde,0xe5b3,0x9f9,0x712a,0x1770,0xdd48,0xdd27,0x5350,0xb7f5,0xbdf,0x46a4,0x7cb4,0xe6a9,0xca36,0x8565,0x3c9,0xe43b,0x3713,0x4fe2,0xeeb1,0x806a,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb5b7a8e5,0x236512fc,0x22676f00,0x5ece5260,0x93eebf38,0xe5b3fcde,0x712a09f9,0xdd481770,0x5350dd27,0xbdfb7f5,0x7cb446a4,0xca36e6a9,0x3c98565,0x3713e43b,0xeeb14fe2,0x4806a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x236512fcb5b7a8e5,0x5ece526022676f00,0xe5b3fcde93eebf38,0xdd481770712a09f9,0xbdfb7f55350dd27,0xca36e6a97cb446a4,0x3713e43b03c98565,0x4806aeeb14fe2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xa4f5,0xf013,0xcdab,0x62ee,0x7ecf,0xcd44,0x9a35,0x7947,0x7e7b,0x318,0xc33c,0x9983,0x5ab4,0xb19a,0xd8e1,0x67cb,0xf563,0xe27e,0xa1f2,0xba02,0xd914,0xb4f4,0xa070,0x81a8,0x2c90,0x34b3,0xa94b,0x167b,0x528a,0x3020,0xa65e,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf013a4f5,0x62eecdab,0xcd447ecf,0x79479a35,0x3187e7b,0x9983c33c,0xb19a5ab4,0x67cbd8e1,0xe27ef563,0xba02a1f2,0xb4f4d914,0x81a8a070,0x34b32c90,0x167ba94b,0x3020528a,0x4a65e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x62eecdabf013a4f5,0x79479a35cd447ecf,0x9983c33c03187e7b,0x67cbd8e1b19a5ab4,0xba02a1f2e27ef563,0x81a8a070b4f4d914,0x167ba94b34b32c90,0x4a65e3020528a}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf3b3,0x88db,0xd050,0x75f1,0x10dd,0x8cbe,0x97c4,0xe7a2,0xe6ae,0xf1e2,0xd51f,0x8d12,0x55a8,0x6395,0xc98a,0xc097,0x60c3,0x66aa,0x54f3,0x78ce,0x5dce,0x7fb3,0x99a7,0x3e1,0x8753,0x3c9a,0x3339,0x30f3,0x406e,0xc05e,0xc99f,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x88dbf3b3,0x75f1d050,0x8cbe10dd,0xe7a297c4,0xf1e2e6ae,0x8d12d51f,0x639555a8,0xc097c98a,0x66aa60c3,0x78ce54f3,0x7fb35dce,0x3e199a7,0x3c9a8753,0x30f33339,0xc05e406e,0x7c99f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x75f1d05088dbf3b3,0xe7a297c48cbe10dd,0x8d12d51ff1e2e6ae,0xc097c98a639555a8,0x78ce54f366aa60c3,0x3e199a77fb35dce,0x30f333393c9a8753,0x7c99fc05e406e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xbdde,0x1bf3,0x7bc0,0xcae7,0x8d2e,0x58a8,0x4b1a,0xbcb8,0xccd9,0x3d98,0xfcf2,0x4881,0x66f8,0x3473,0x2e8a,0x730d,0xabbf,0x4789,0xdce9,0x58ea,0xf54,0x6169,0x58d0,0x3280,0xe1f9,0x5bd0,0x67a0,0x23d2,0x2611,0x18e1,0xd51f,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1bf3bdde,0xcae77bc0,0x58a88d2e,0xbcb84b1a,0x3d98ccd9,0x4881fcf2,0x347366f8,0x730d2e8a,0x4789abbf,0x58eadce9,0x61690f54,0x328058d0,0x5bd0e1f9,0x23d267a0,0x18e12611,0x7d51f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xcae77bc01bf3bdde,0xbcb84b1a58a88d2e,0x4881fcf23d98ccd9,0x730d2e8a347366f8,0x58eadce94789abbf,0x328058d061690f54,0x23d267a05bd0e1f9,0x7d51f18e12611}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xee54,0xe36f,0x939d,0xea02,0xe6db,0xa7ae,0x9f39,0x8bb3,0x7f02,0xf594,0xa9ab,0xae5e,0x9a76,0x7fc0,0xd9a,0xbecd,0x692d,0x8b68,0x30f4,0xff9a,0xd1ae,0xfd43,0xbdfc,0xc552,0xfe0d,0xa4bf,0x33e5,0x981b,0x202c,0x45e8,0x8573,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe36fee54,0xea02939d,0xa7aee6db,0x8bb39f39,0xf5947f02,0xae5ea9ab,0x7fc09a76,0xbecd0d9a,0x8b68692d,0xff9a30f4,0xfd43d1ae,0xc552bdfc,0xa4bffe0d,0x981b33e5,0x45e8202c,0xc8573}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xea02939de36fee54,0x8bb39f39a7aee6db,0xae5ea9abf5947f02,0xbecd0d9a7fc09a76,0xff9a30f48b68692d,0xc552bdfcfd43d1ae,0x981b33e5a4bffe0d,0xc857345e8202c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc4d,0x7724,0x2faf,0x8a0e,0xef22,0x7341,0x683b,0x185d,0x1951,0xe1d,0x2ae0,0x72ed,0xaa57,0x9c6a,0x3675,0x3f68,0x9f3c,0x9955,0xab0c,0x8731,0xa231,0x804c,0x6658,0xfc1e,0x78ac,0xc365,0xccc6,0xcf0c,0xbf91,0x3fa1,0x3660,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x77240c4d,0x8a0e2faf,0x7341ef22,0x185d683b,0xe1d1951,0x72ed2ae0,0x9c6aaa57,0x3f683675,0x99559f3c,0x8731ab0c,0x804ca231,0xfc1e6658,0xc36578ac,0xcf0cccc6,0x3fa1bf91,0x83660}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8a0e2faf77240c4d,0x185d683b7341ef22,0x72ed2ae00e1d1951,0x3f6836759c6aaa57,0x8731ab0c99559f3c,0xfc1e6658804ca231,0xcf0cccc6c36578ac,0x836603fa1bf91}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x5eb9,0x2393,0xd8e8,0xc566,0xd78,0xa77f,0x1bf1,0x4577,0x3141,0xecd3,0x132c,0x281,0x13b5,0x1d34,0xb4bb,0xf25,0xdc3,0xbf86,0x5e9f,0xde50,0xf536,0xe95e,0xd5b0,0x687d,0x3ab,0x992c,0xdb8d,0xc8cc,0xfaf0,0xd954,0x6e1a,0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x23935eb9,0xc566d8e8,0xa77f0d78,0x45771bf1,0xecd33141,0x281132c,0x1d3413b5,0xf25b4bb,0xbf860dc3,0xde505e9f,0xe95ef536,0x687dd5b0,0x992c03ab,0xc8ccdb8d,0xd954faf0,0x56e1a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc566d8e823935eb9,0x45771bf1a77f0d78,0x281132cecd33141,0xf25b4bb1d3413b5,0xde505e9fbf860dc3,0x687dd5b0e95ef536,0xc8ccdb8d992c03ab,0x56e1ad954faf0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf17c,0xf7a8,0xd9f7,0x1544,0xb2c8,0xf5aa,0x3812,0x3fba,0xf63e,0xb545,0x678c,0xad77,0xed9f,0x12f8,0xa5dc,0x74c9,0xec1d,0xc1e0,0x806f,0x14a0,0xfb25,0x34f3,0x606c,0x57d5,0x9733,0x9c8c,0x83e3,0xa787,0x7cae,0x503b,0x2499,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf7a8f17c,0x1544d9f7,0xf5aab2c8,0x3fba3812,0xb545f63e,0xad77678c,0x12f8ed9f,0x74c9a5dc,0xc1e0ec1d,0x14a0806f,0x34f3fb25,0x57d5606c,0x9c8c9733,0xa78783e3,0x503b7cae,0x12499}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1544d9f7f7a8f17c,0x3fba3812f5aab2c8,0xad77678cb545f63e,0x74c9a5dc12f8ed9f,0x14a0806fc1e0ec1d,0x57d5606c34f3fb25,0xa78783e39c8c9733,0x12499503b7cae}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x5d83,0x57ac,0xb73f,0xb74d,0x1869,0x3588,0x43,0x915,0x7f31,0x82eb,0x4487,0xb830,0x6627,0x70a7,0x9911,0x5646,0x4779,0xe113,0x168c,0x925d,0xc1e8,0xd347,0xa95e,0xd5a6,0x7deb,0xbeb,0x72,0xf755,0x306,0x9ee2,0x7ef9,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x57ac5d83,0xb74db73f,0x35881869,0x9150043,0x82eb7f31,0xb8304487,0x70a76627,0x56469911,0xe1134779,0x925d168c,0xd347c1e8,0xd5a6a95e,0xbeb7deb,0xf7550072,0x9ee20306,0x27ef9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb74db73f57ac5d83,0x915004335881869,0xb830448782eb7f31,0x5646991170a76627,0x925d168ce1134779,0xd5a6a95ed347c1e8,0xf75500720beb7deb,0x27ef99ee20306}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xa147,0xdc6c,0x2717,0x3a99,0xf287,0x5880,0xe40e,0xba88,0xcebe,0x132c,0xecd3,0xfd7e,0xec4a,0xe2cb,0x4b44,0xf0da,0xf23c,0x4079,0xa160,0x21af,0xac9,0x16a1,0x2a4f,0x9782,0xfc54,0x66d3,0x2472,0x3733,0x50f,0x26ab,0x91e5,0xa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdc6ca147,0x3a992717,0x5880f287,0xba88e40e,0x132ccebe,0xfd7eecd3,0xe2cbec4a,0xf0da4b44,0x4079f23c,0x21afa160,0x16a10ac9,0x97822a4f,0x66d3fc54,0x37332472,0x26ab050f,0xa91e5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3a992717dc6ca147,0xba88e40e5880f287,0xfd7eecd3132ccebe,0xf0da4b44e2cbec4a,0x21afa1604079f23c,0x97822a4f16a10ac9,0x3733247266d3fc54,0xa91e526ab050f}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x5b0b,0xfec,0x3254,0x9d11,0x8130,0x32bb,0x65ca,0x86b8,0x8184,0xfce7,0x3cc3,0x667c,0xa54b,0x4e65,0x271e,0x9834,0xa9c,0x1d81,0x5e0d,0x45fd,0x26eb,0x4b0b,0x5f8f,0x7e57,0xd36f,0xcb4c,0x56b4,0xe984,0xad75,0xcfdf,0x59a1,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xfec5b0b,0x9d113254,0x32bb8130,0x86b865ca,0xfce78184,0x667c3cc3,0x4e65a54b,0x9834271e,0x1d810a9c,0x45fd5e0d,0x4b0b26eb,0x7e575f8f,0xcb4cd36f,0xe98456b4,0xcfdfad75,0xb59a1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9d1132540fec5b0b,0x86b865ca32bb8130,0x667c3cc3fce78184,0x9834271e4e65a54b,0x45fd5e0d1d810a9c,0x7e575f8f4b0b26eb,0xe98456b4cb4cd36f,0xb59a1cfdfad75}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x2bba,0x15e8,0x1c2b,0x55ed,0xb72c,0xb3cc,0x3a5c,0xb409,0x2f3d,0x71b,0xd365,0x90a1,0xb2f5,0x1e26,0xbe0,0xa633,0xc5a6,0xe2bd,0xe0e3,0x49b3,0xd4c8,0x9f1c,0x9ba3,0x3674,0x2e5a,0x5411,0xc603,0xcdd3,0xfb23,0x2e7e,0x88a,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x15e82bba,0x55ed1c2b,0xb3ccb72c,0xb4093a5c,0x71b2f3d,0x90a1d365,0x1e26b2f5,0xa6330be0,0xe2bdc5a6,0x49b3e0e3,0x9f1cd4c8,0x36749ba3,0x54112e5a,0xcdd3c603,0x2e7efb23,0x4088a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x55ed1c2b15e82bba,0xb4093a5cb3ccb72c,0x90a1d365071b2f3d,0xa6330be01e26b2f5,0x49b3e0e3e2bdc5a6,0x36749ba39f1cd4c8,0xcdd3c60354112e5a,0x4088a2e7efb23}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xa8e5,0xb5b7,0x12fc,0x2365,0x6f00,0x2267,0x5260,0x5ece,0xbf38,0x93ee,0xfcde,0xe5b3,0x9f9,0x712a,0x1770,0xdd48,0xdd27,0x5350,0xb7f5,0xbdf,0x46a4,0x7cb4,0xe6a9,0xca36,0x8565,0x3c9,0xe43b,0x3713,0x4fe2,0xeeb1,0x806a,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb5b7a8e5,0x236512fc,0x22676f00,0x5ece5260,0x93eebf38,0xe5b3fcde,0x712a09f9,0xdd481770,0x5350dd27,0xbdfb7f5,0x7cb446a4,0xca36e6a9,0x3c98565,0x3713e43b,0xeeb14fe2,0x4806a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x236512fcb5b7a8e5,0x5ece526022676f00,0xe5b3fcde93eebf38,0xdd481770712a09f9,0xbdfb7f55350dd27,0xca36e6a97cb446a4,0x3713e43b03c98565,0x4806aeeb14fe2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xa4f5,0xf013,0xcdab,0x62ee,0x7ecf,0xcd44,0x9a35,0x7947,0x7e7b,0x318,0xc33c,0x9983,0x5ab4,0xb19a,0xd8e1,0x67cb,0xf563,0xe27e,0xa1f2,0xba02,0xd914,0xb4f4,0xa070,0x81a8,0x2c90,0x34b3,0xa94b,0x167b,0x528a,0x3020,0xa65e,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf013a4f5,0x62eecdab,0xcd447ecf,0x79479a35,0x3187e7b,0x9983c33c,0xb19a5ab4,0x67cbd8e1,0xe27ef563,0xba02a1f2,0xb4f4d914,0x81a8a070,0x34b32c90,0x167ba94b,0x3020528a,0x4a65e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x62eecdabf013a4f5,0x79479a35cd447ecf,0x9983c33c03187e7b,0x67cbd8e1b19a5ab4,0xba02a1f2e27ef563,0x81a8a070b4f4d914,0x167ba94b34b32c90,0x4a65e3020528a}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf9da,0x446d,0xe828,0xbaf8,0x86e,0x465f,0x4be2,0x73d1,0x7357,0xf8f1,0x6a8f,0x4689,0xaad4,0x31ca,0xe4c5,0xe04b,0x3061,0xb355,0x2a79,0x3c67,0xaee7,0xbfd9,0xccd3,0x81f0,0x43a9,0x9e4d,0x999c,0x1879,0x2037,0xe02f,0xe4cf,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x446df9da,0xbaf8e828,0x465f086e,0x73d14be2,0xf8f17357,0x46896a8f,0x31caaad4,0xe04be4c5,0xb3553061,0x3c672a79,0xbfd9aee7,0x81f0ccd3,0x9e4d43a9,0x1879999c,0xe02f2037,0xbe4cf}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbaf8e828446df9da,0x73d14be2465f086e,0x46896a8ff8f17357,0xe04be4c531caaad4,0x3c672a79b3553061,0x81f0ccd3bfd9aee7,0x1879999c9e4d43a9,0xbe4cfe02f2037}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xdeef,0xdf9,0xbde0,0x6573,0x4697,0x2c54,0x258d,0xde5c,0x666c,0x1ecc,0xfe79,0x2440,0xb37c,0x1a39,0x9745,0xb986,0xd5df,0xa3c4,0x6e74,0x2c75,0x87aa,0x30b4,0x2c68,0x9940,0x70fc,0x2de8,0x33d0,0x91e9,0x9308,0x8c70,0xea8f,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdf9deef,0x6573bde0,0x2c544697,0xde5c258d,0x1ecc666c,0x2440fe79,0x1a39b37c,0xb9869745,0xa3c4d5df,0x2c756e74,0x30b487aa,0x99402c68,0x2de870fc,0x91e933d0,0x8c709308,0xbea8f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6573bde00df9deef,0xde5c258d2c544697,0x2440fe791ecc666c,0xb98697451a39b37c,0x2c756e74a3c4d5df,0x99402c6830b487aa,0x91e933d02de870fc,0xbea8f8c709308}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf72a,0xf1b7,0x49ce,0xf501,0x736d,0xd3d7,0xcf9c,0x45d9,0x3f81,0xfaca,0x54d5,0x572f,0x4d3b,0x3fe0,0x86cd,0xdf66,0x3496,0x45b4,0x187a,0x7fcd,0xe8d7,0x7ea1,0x5efe,0xe2a9,0xff06,0xd25f,0x99f2,0x4c0d,0x1016,0xa2f4,0x42b9,0xe}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf1b7f72a,0xf50149ce,0xd3d7736d,0x45d9cf9c,0xfaca3f81,0x572f54d5,0x3fe04d3b,0xdf6686cd,0x45b43496,0x7fcd187a,0x7ea1e8d7,0xe2a95efe,0xd25fff06,0x4c0d99f2,0xa2f41016,0xe42b9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf50149cef1b7f72a,0x45d9cf9cd3d7736d,0x572f54d5faca3f81,0xdf6686cd3fe04d3b,0x7fcd187a45b43496,0xe2a95efe7ea1e8d7,0x4c0d99f2d25fff06,0xe42b9a2f41016}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x627,0xbb92,0x17d7,0x4507,0xf791,0xb9a0,0xb41d,0x8c2e,0x8ca8,0x70e,0x9570,0xb976,0x552b,0xce35,0x1b3a,0x1fb4,0xcf9e,0x4caa,0xd586,0xc398,0x5118,0x4026,0x332c,0x7e0f,0xbc56,0x61b2,0x6663,0xe786,0xdfc8,0x1fd0,0x1b30,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xbb920627,0x450717d7,0xb9a0f791,0x8c2eb41d,0x70e8ca8,0xb9769570,0xce35552b,0x1fb41b3a,0x4caacf9e,0xc398d586,0x40265118,0x7e0f332c,0x61b2bc56,0xe7866663,0x1fd0dfc8,0x41b30}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x450717d7bb920627,0x8c2eb41db9a0f791,0xb9769570070e8ca8,0x1fb41b3ace35552b,0xc398d5864caacf9e,0x7e0f332c40265118,0xe786666361b2bc56,0x41b301fd0dfc8}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x6f0b,0x3478,0x5aeb,0x64,0x9a1a,0xecff,0xccf0,0x2fab,0xf3a8,0x718a,0x97e7,0xc31a,0xa0cd,0xb872,0x514e,0x5ee1,0x4b79,0x4af9,0xd0c3,0x97c6,0x9591,0x2370,0xa987,0xa5e6,0xe201,0x8730,0x3150,0x1980,0x8452,0x3b83,0x25c9,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x34786f0b,0x645aeb,0xecff9a1a,0x2fabccf0,0x718af3a8,0xc31a97e7,0xb872a0cd,0x5ee1514e,0x4af94b79,0x97c6d0c3,0x23709591,0xa5e6a987,0x8730e201,0x19803150,0x3b838452,0xb25c9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x645aeb34786f0b,0x2fabccf0ecff9a1a,0xc31a97e7718af3a8,0x5ee1514eb872a0cd,0x97c6d0c34af94b79,0xa5e6a98723709591,0x198031508730e201,0xb25c93b838452}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x1de7,0x7f69,0xdefe,0xfc6b,0x6fd5,0xc100,0x5188,0x1318,0x416e,0x10dd,0x33ac,0x4260,0x8985,0x1d0e,0x5b13,0xd02e,0x6fb5,0x6e28,0x9b7d,0x4f72,0x9665,0xd5f3,0xf00d,0xda5f,0x98f2,0xd778,0x4b2a,0x958d,0xfcef,0xd837,0x4a93,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7f691de7,0xfc6bdefe,0xc1006fd5,0x13185188,0x10dd416e,0x426033ac,0x1d0e8985,0xd02e5b13,0x6e286fb5,0x4f729b7d,0xd5f39665,0xda5ff00d,0xd77898f2,0x958d4b2a,0xd837fcef,0x34a93}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xfc6bdefe7f691de7,0x13185188c1006fd5,0x426033ac10dd416e,0xd02e5b131d0e8985,0x4f729b7d6e286fb5,0xda5ff00dd5f39665,0x958d4b2ad77898f2,0x34a93d837fcef}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x8527,0x81f3,0xcb8f,0x5e0d,0x7c93,0x7448,0x613,0xedcf,0x7d31,0x77c7,0x19dc,0x8ace,0xbfb8,0xa582,0x9ccc,0x28df,0xb6e0,0x4f69,0x33e6,0x546b,0xcfb2,0x1627,0x53ed,0xdc8d,0xd80b,0xb843,0xc438,0xb942,0x8fb5,0xb3c0,0xc1dc,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x81f38527,0x5e0dcb8f,0x74487c93,0xedcf0613,0x77c77d31,0x8ace19dc,0xa582bfb8,0x28df9ccc,0x4f69b6e0,0x546b33e6,0x1627cfb2,0xdc8d53ed,0xb843d80b,0xb942c438,0xb3c08fb5,0x2c1dc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x5e0dcb8f81f38527,0xedcf061374487c93,0x8ace19dc77c77d31,0x28df9ccca582bfb8,0x546b33e64f69b6e0,0xdc8d53ed1627cfb2,0xb942c438b843d80b,0x2c1dcb3c08fb5}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x90f5,0xcb87,0xa514,0xff9b,0x65e5,0x1300,0x330f,0xd054,0xc57,0x8e75,0x6818,0x3ce5,0x5f32,0x478d,0xaeb1,0xa11e,0xb486,0xb506,0x2f3c,0x6839,0x6a6e,0xdc8f,0x5678,0x5a19,0x1dfe,0x78cf,0xceaf,0xe67f,0x7bad,0xc47c,0xda36,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xcb8790f5,0xff9ba514,0x130065e5,0xd054330f,0x8e750c57,0x3ce56818,0x478d5f32,0xa11eaeb1,0xb506b486,0x68392f3c,0xdc8f6a6e,0x5a195678,0x78cf1dfe,0xe67fceaf,0xc47c7bad,0x4da36}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xff9ba514cb8790f5,0xd054330f130065e5,0x3ce568188e750c57,0xa11eaeb1478d5f32,0x68392f3cb506b486,0x5a195678dc8f6a6e,0xe67fceaf78cf1dfe,0x4da36c47c7bad}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x14d5, 0x1163, 0xf47, 0x337, 0x71e, 0x4ad, 0x1071, 0x19d4, 0x11d9, 0xdce, 0x186a, 0x1785, 0x13c8, 0x695, 0xe1b, 0x54b, 0x174f, 0xd0c, 0x17cb, 0x17db, 0xb41, 0xb78, 0x1a46, 0x66f, 0x23, 0x836, 0x19ce, 0xcdf, 0x90b, 0x6fb, 0x1508, 0x1bb5, 0x6aa, 0x1219, 0x1bba, 0x1d67, 0x1e46, 0x8d8, 0x62c} +#elif RADIX == 32 +{0x1a6af50e, 0xef478b1, 0xb4e3c33, 0xea41c49, 0xdce8ece, 0x2f0b86a, 0xd9a5679, 0x14f2a5b8, 0xf96d0cb, 0x2d06fb7, 0xfd232de, 0x6c02333, 0x137f39c8, 0x37da42d, 0x15bb5a84, 0xea4326a, 0x123759f7, 0x9c7} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3c3377a3c58e9abd, 0x3a3b39d483892b4e, 0xd9a56791785c3537, 0xbbe5b432e9e54b70, 0x666fd232de16837d, 0xd216cdfce720d804, 0x4864d55bb5a841be, 0x72363c8dd67ddd} +#else +{0x66ef478b1d357a, 0x139d483892b4e3c, 0x1c8bc2e1a9b9d1d, 0xba7952dc366959, 0x1c2d06fb77cb686, 0xd804666fd232d, 0xdf690b66fe739, 0x1752193556ed6a1, 0xe46c791bacfb} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x1d37, 0x1c58, 0x1bd1, 0x10cd, 0x9c7, 0x92b, 0x41c, 0xe75, 0x1476, 0x1373, 0xe1a, 0x5e1, 0xcf2, 0x19a5, 0x1b86, 0x1952, 0x5d3, 0x1b43, 0x1df2, 0xdf6, 0x2d0, 0x12de, 0x1e91, 0x199b, 0x1008, 0x120d, 0x1e73, 0x1b37, 0x1a42, 0x1be, 0xd42, 0x16ed, 0x9aa, 0x1486, 0x1eee, 0x1759, 0x791, 0x236, 0x5bb} +#elif RADIX == 32 +{0xe9becab, 0x1bbd1e2c, 0xad38f0c, 0x13a90712, 0x1373a3b3, 0x8bc2e1a, 0x366959e, 0x1d3ca96e, 0x1be5b432, 0x10b41bed, 0x1bf48cb7, 0x1b008cc, 0xcdfce72, 0xdf690b, 0x156ed6a1, 0x1ba90c9a, 0x1c8dd67d, 0xd31} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x8f0cdde8f163a6fb, 0xce8ece7520e24ad3, 0x366959e45e170d4d, 0x6ef96d0cba7952dc, 0x199bf48cb785a0df, 0xb485b37f39c83601, 0x52193556ed6a106f, 0x488d8f23759f77} +#else +{0x19bbd1e2c74df6, 0xce7520e24ad38f, 0xf22f0b86a6e747, 0x12e9e54b70d9a56, 0xf0b41beddf2da1, 0x83601199bf48cb, 0x837da42d9bf9ce, 0x1dd4864d55bb5a8, 0x911b1e46eb3e} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x8f6, 0xe30, 0x75, 0xaf7, 0xb3c, 0x1672, 0x1e05, 0x157a, 0x16b1, 0x1fd, 0x3c2, 0x114d, 0x1000, 0x1b4f, 0x1f37, 0xc0e, 0xdd, 0x4de, 0xdff, 0x55e, 0x1a2f, 0x353, 0xc4a, 0x1225, 0x9ed, 0x9ff, 0x1493, 0x18e6, 0x96c, 0x163c, 0xa76, 0x1c78, 0x11b4, 0x1087, 0x1519, 0xc82, 0x3e0, 0x7d4, 0xf5} +#elif RADIX == 32 +{0x47b122a, 0xe075718, 0x1c9678af, 0xbd7816c, 0x1fdb58d, 0x229a3c2, 0x1bed3e00, 0xdd6077c, 0x1bfe4de0, 0x1e8bcabc, 0x56250d4, 0x1fe9ed91, 0x39a9269, 0xb1e25b3, 0x9c7853b, 0x6610f1b, 0x1f0320aa, 0x7a0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x78af703ab8c11ec4, 0xf6d6357af02d9c96, 0xbed3e00114d1e107, 0xe6ff93781bac0ef9, 0xb2256250d4f45e55, 0x12d98e6a49a7fd3d, 0xc21e369c7853b58f, 0xe9f507c0c82a8c} +#else +{0x15ee07571823d89, 0x357af02d9c9678, 0x8a68f083fb6b, 0x6eb03be6fb4f8, 0x9e8bcabcdff26f, 0x7fd3db2256250d, 0x1ac7896cc73524d, 0x330878da71e14e, 0x23ea0f819055} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1227, 0x1240, 0x423, 0xd84, 0x1dc1, 0x982, 0x1cb3, 0x14e1, 0x16eb, 0x1409, 0xf49, 0xec8, 0x888, 0xe0b, 0x1c45, 0x176, 0x49e, 0x1d40, 0x1e6b, 0x7a3, 0xfba, 0x175f, 0x1908, 0xb88, 0x168c, 0x1324, 0x159f, 0x1077, 0xac3, 0x10b4, 0x478, 0x240, 0x1682, 0x14f, 0x1599, 0x152f, 0x1197, 0xad5, 0x133} +#elif RADIX == 32 +{0x91396c4, 0x8423920, 0xbb82d8, 0x70f2cd3, 0x1409b75d, 0x1d90f49, 0x2b82d11, 0x9e0bb71, 0x1cd7d402, 0x1bee8f47, 0x8c845d7, 0x4968c5c, 0x1deb3f3, 0x85a2b0e, 0x424023c, 0x6429f68, 0xcbd4beb, 0xac} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x82d84211c90244e5, 0x26dd74e1e59a60bb, 0x2b82d110ec87a4d0, 0x3f35f50093c176e2, 0x8b88c845d7df747a, 0x1587077acfcc92d1, 0x853ed0424023c42d, 0x12ab5632f52facc} +#else +{0x1b08423920489cb, 0x174e1e59a60bb82, 0x887643d268136e, 0x24f05db88ae0b4, 0xfbee8f47e6bea0, 0xc92d18b88c845d, 0x2168ac383bd67e, 0x13214fb4109008f, 0xa56ac65ea5f5} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1544, 0x1dea, 0x162d, 0x73d, 0x6d1, 0x1511, 0x5f2, 0x275, 0x1aff, 0x1c7, 0x1d84, 0x1875, 0x10df, 0x2e0, 0x70b, 0x9eb, 0x897, 0xf0f, 0xa5d, 0xf38, 0x108c, 0x1c12, 0x1649, 0x1849, 0x9b8, 0x2bc, 0x1b0, 0xd0e, 0xfdb, 0x8ee, 0x1b0b, 0x1fdc, 0xc1, 0x1771, 0x1776, 0xa12, 0x1392, 0xd10, 0x618} +#elif RADIX == 32 +{0xaa27395, 0x1b62def5, 0x44da273, 0x13a97caa, 0x1c7d7f8, 0x1f0ebd84, 0x58b821b, 0x974f59c, 0x14baf0f4, 0x14231e70, 0x9b24f04, 0x1789b8c2, 0x14383602, 0x14773f6d, 0x3fdcd85, 0x1daee20c, 0x1c9284ae, 0xd04} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xa273db16f7aaa89c, 0x1f5fe2752f95444d, 0x58b821bf875ec207, 0x852ebc3d12e9eb38, 0x1849b24f04a118f3, 0x9fb6d0e0d80af137, 0x5dc4183fdcd85a3b, 0x183442724a12bbb} +#else +{0xe7b62def555139, 0x1e2752f95444da2, 0xdfc3af61038faf, 0x144ba7ace162e08, 0x94231e70a5d787, 0xaf1371849b24f0, 0xd1dcfdb68706c0, 0xed771060ff7361, 0x156884e494257} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1756, 0x1187, 0x608, 0x637, 0x5c5, 0x459, 0x12f2, 0x9a1, 0x314, 0xe7f, 0x1c73, 0x27f, 0xa8d, 0x17f8, 0x1e33, 0x1878, 0x1c21, 0x123b, 0xb76, 0x7ea, 0x157, 0x16b4, 0xad7, 0x413, 0x56e, 0x4f3, 0x881, 0x1319, 0x1cc3, 0x1813, 0x1575, 0x1f0, 0x13f9, 0x1ef4, 0x8ae, 0x17c8, 0xd48, 0x157d, 0x5ea} +#elif RADIX == 32 +{0x1bab7032, 0xe6088c3, 0x164b8a63, 0xd0cbc88, 0xe7f18a2, 0x144ffc73, 0x19dfe151, 0x21c3c78, 0x16ed23be, 0x55cfd4, 0x1356bdad, 0x1e656e20, 0xc651024, 0x1c09f30e, 0x121f0aba, 0xbbde93f, 0xa45f211, 0x8eb} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x8a637304461eeadc, 0xfc6289a19791164b, 0x9dfe151a27fe39b9, 0xa5bb48ef843878f1, 0xc41356bdad02ae7e, 0xf98731944093ccad, 0x7bd27f21f0abae04, 0x155f5a917c8457} +#else +{0xc6e6088c3dd5b8, 0x89a19791164b8a, 0x8d13ff1cdcfe31, 0x1e10e1e3c677f85, 0x1a055cfd4b7691d, 0x13ccadc41356bda, 0x17027cc398ca204, 0x15def49fc87c2ae, 0x2abeb522f908} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0xbba, 0x1eb6, 0x49a, 0x12a5, 0x12d2, 0x30a, 0x172f, 0x174d, 0x1231, 0x1036, 0x122e, 0x158, 0x743, 0xf10, 0x1e52, 0x18c7, 0x152e, 0x13b1, 0x7ae, 0x128d, 0x9c4, 0x848, 0x4, 0x1e64, 0x1e6f, 0x10ca, 0x3d4, 0x164, 0x1c8, 0x3e2, 0x4e8, 0x27b, 0x1d32, 0x1cc2, 0x1c60, 0x7a8, 0x13df, 0x1f6b, 0x6ad} +#elif RADIX == 32 +{0x5dd7eaa, 0xa49af5b, 0x2a5a52a, 0x1a6dcbc6, 0x1036918d, 0xc2b122e, 0x93c40e8, 0x12ec63f9, 0xf5d3b1a, 0x271251a, 0x4002212, 0x195e6ff3, 0x5907a90, 0x1f10720, 0x427b274, 0x183985d3, 0x1ef9ea38, 0x45c} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xa52a524d7ad9775f, 0xda46374db978c2a5, 0x93c40e8615891740, 0xd3d74ec6a5d8c7f2, 0xfe64002212138928, 0x83901641ea432bcd, 0x730ba6427b2740f8, 0x11fdae7be7a8e30} +#else +{0x54a49af5b2eebf, 0x374db978c2a5a5, 0x1430ac48ba06d23, 0x1a97631fca4f103, 0x4271251a7ae9d8, 0x32bcdfe6400221, 0x7c41c80b20f52, 0xc1cc2e9909ec9d, 0x8fb5cf7cf51c} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1d5e, 0x18e6, 0xc97, 0x1db2, 0x9df, 0x19d3, 0x1564, 0x1a3a, 0x90, 0xea5, 0xd74, 0x19fc, 0xf84, 0xadd, 0x2e5, 0x10bb, 0x183f, 0x1334, 0xa50, 0x54b, 0xd22, 0x1295, 0xf11, 0xfa1, 0x1810, 0xa3, 0xa81, 0x1026, 0x2b2, 0x19ee, 0x1a4a, 0xf8a, 0xfb3, 0x1463, 0x19c5, 0x42c, 0x830, 0x562, 0x3db} +#elif RADIX == 32 +{0xeaf491f, 0x4c97c73, 0x14d3bfdb, 0x11d55933, 0xea50486, 0x133f8d74, 0x12ab75f0, 0x3f85d8b, 0x14a1334c, 0xb488a96, 0x1788ca5, 0x1478107d, 0x995020, 0xcf70aca, 0x6f8ad25, 0x1168c6fb, 0x1810b33, 0x892} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xbfdb264be39babd2, 0x94121a3aab2674d3, 0x2ab75f099fc6ba3a, 0xb5284cd307f0bb17, 0xfa1788ca55a4454, 0x8565026540828f02, 0xd18df66f8ad2567b, 0x7958906042cce2} +#else +{0x1b64c97c73757a4, 0x1a3aab2674d3bf, 0x184cfe35d1d4a09, 0xc1fc2ec5caadd7, 0xab488a96a5099a, 0x28f020fa1788ca, 0xb3dc2b28132a04, 0x18b4637d9be2b49, 0xf2b120c08599} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x3919,0x9bc5,0xcbb7,0xe8a6,0x3f55,0x22a,0x8690,0xc64e,0x8e93,0x6c4d,0x80e8,0x422f,0xffd,0x7e1,0xf545,0xb342,0x87be,0x80a5,0xa62b,0xfb8d,0x4048,0x466e,0x4697,0xd4d,0x9d79,0xc9ba,0x52c1,0xa008,0x21f1,0xf309,0xb87c,0xa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9bc53919,0xe8a6cbb7,0x22a3f55,0xc64e8690,0x6c4d8e93,0x422f80e8,0x7e10ffd,0xb342f545,0x80a587be,0xfb8da62b,0x466e4048,0xd4d4697,0xc9ba9d79,0xa00852c1,0xf30921f1,0xab87c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe8a6cbb79bc53919,0xc64e8690022a3f55,0x422f80e86c4d8e93,0xb342f54507e10ffd,0xfb8da62b80a587be,0xd4d4697466e4048,0xa00852c1c9ba9d79,0xab87cf30921f1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc03e,0x86b5,0xcdfe,0x5bc4,0xc7a1,0xbc7b,0x90d9,0x9464,0xc604,0x9345,0x853d,0xc710,0x1ad2,0x4b98,0x4050,0x8ef4,0xd73c,0x6664,0xbd2,0xb610,0x483e,0x5e87,0xabe9,0xcf72,0x679e,0xbfbf,0x52b1,0x3483,0xf7c,0x4a36,0xbd53,0xe}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x86b5c03e,0x5bc4cdfe,0xbc7bc7a1,0x946490d9,0x9345c604,0xc710853d,0x4b981ad2,0x8ef44050,0x6664d73c,0xb6100bd2,0x5e87483e,0xcf72abe9,0xbfbf679e,0x348352b1,0x4a360f7c,0xebd53}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x5bc4cdfe86b5c03e,0x946490d9bc7bc7a1,0xc710853d9345c604,0x8ef440504b981ad2,0xb6100bd26664d73c,0xcf72abe95e87483e,0x348352b1bfbf679e,0xebd534a360f7c}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x5937,0x9b8c,0xba31,0x676c,0x8d31,0x9c3d,0xf619,0x42e2,0x4d1a,0xd072,0x76e5,0x390a,0x5086,0x7643,0x2d16,0xfd71,0x341,0xff7b,0x56ec,0xed63,0x1436,0x7324,0x6a5d,0x9488,0x9f0,0x145,0xd6b5,0x4043,0x10d8,0xeb6e,0x7784,0xf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9b8c5937,0x676cba31,0x9c3d8d31,0x42e2f619,0xd0724d1a,0x390a76e5,0x76435086,0xfd712d16,0xff7b0341,0xed6356ec,0x73241436,0x94886a5d,0x14509f0,0x4043d6b5,0xeb6e10d8,0xf7784}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x676cba319b8c5937,0x42e2f6199c3d8d31,0x390a76e5d0724d1a,0xfd712d1676435086,0xed6356ecff7b0341,0x94886a5d73241436,0x4043d6b5014509f0,0xf7784eb6e10d8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc6e7,0x643a,0x3448,0x1759,0xc0aa,0xfdd5,0x796f,0x39b1,0x716c,0x93b2,0x7f17,0xbdd0,0xf002,0xf81e,0xaba,0x4cbd,0x7841,0x7f5a,0x59d4,0x472,0xbfb7,0xb991,0xb968,0xf2b2,0x6286,0x3645,0xad3e,0x5ff7,0xde0e,0xcf6,0x4783,0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x643ac6e7,0x17593448,0xfdd5c0aa,0x39b1796f,0x93b2716c,0xbdd07f17,0xf81ef002,0x4cbd0aba,0x7f5a7841,0x47259d4,0xb991bfb7,0xf2b2b968,0x36456286,0x5ff7ad3e,0xcf6de0e,0x54783}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x17593448643ac6e7,0x39b1796ffdd5c0aa,0xbdd07f1793b2716c,0x4cbd0abaf81ef002,0x47259d47f5a7841,0xf2b2b968b991bfb7,0x5ff7ad3e36456286,0x547830cf6de0e}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf3b3,0x88db,0xd050,0x75f1,0x10dd,0x8cbe,0x97c4,0xe7a2,0xe6ae,0xf1e2,0xd51f,0x8d12,0x55a8,0x6395,0xc98a,0xc097,0x60c3,0x66aa,0x54f3,0x78ce,0x5dce,0x7fb3,0x99a7,0x3e1,0x8753,0x3c9a,0x3339,0x30f3,0x406e,0xc05e,0xc99f,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x88dbf3b3,0x75f1d050,0x8cbe10dd,0xe7a297c4,0xf1e2e6ae,0x8d12d51f,0x639555a8,0xc097c98a,0x66aa60c3,0x78ce54f3,0x7fb35dce,0x3e199a7,0x3c9a8753,0x30f33339,0xc05e406e,0x7c99f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x75f1d05088dbf3b3,0xe7a297c48cbe10dd,0x8d12d51ff1e2e6ae,0xc097c98a639555a8,0x78ce54f366aa60c3,0x3e199a77fb35dce,0x30f333393c9a8753,0x7c99fc05e406e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xbdde,0x1bf3,0x7bc0,0xcae7,0x8d2e,0x58a8,0x4b1a,0xbcb8,0xccd9,0x3d98,0xfcf2,0x4881,0x66f8,0x3473,0x2e8a,0x730d,0xabbf,0x4789,0xdce9,0x58ea,0xf54,0x6169,0x58d0,0x3280,0xe1f9,0x5bd0,0x67a0,0x23d2,0x2611,0x18e1,0xd51f,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1bf3bdde,0xcae77bc0,0x58a88d2e,0xbcb84b1a,0x3d98ccd9,0x4881fcf2,0x347366f8,0x730d2e8a,0x4789abbf,0x58eadce9,0x61690f54,0x328058d0,0x5bd0e1f9,0x23d267a0,0x18e12611,0x7d51f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xcae77bc01bf3bdde,0xbcb84b1a58a88d2e,0x4881fcf23d98ccd9,0x730d2e8a347366f8,0x58eadce94789abbf,0x328058d061690f54,0x23d267a05bd0e1f9,0x7d51f18e12611}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xee54,0xe36f,0x939d,0xea02,0xe6db,0xa7ae,0x9f39,0x8bb3,0x7f02,0xf594,0xa9ab,0xae5e,0x9a76,0x7fc0,0xd9a,0xbecd,0x692d,0x8b68,0x30f4,0xff9a,0xd1ae,0xfd43,0xbdfc,0xc552,0xfe0d,0xa4bf,0x33e5,0x981b,0x202c,0x45e8,0x8573,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe36fee54,0xea02939d,0xa7aee6db,0x8bb39f39,0xf5947f02,0xae5ea9ab,0x7fc09a76,0xbecd0d9a,0x8b68692d,0xff9a30f4,0xfd43d1ae,0xc552bdfc,0xa4bffe0d,0x981b33e5,0x45e8202c,0xc8573}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xea02939de36fee54,0x8bb39f39a7aee6db,0xae5ea9abf5947f02,0xbecd0d9a7fc09a76,0xff9a30f48b68692d,0xc552bdfcfd43d1ae,0x981b33e5a4bffe0d,0xc857345e8202c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc4d,0x7724,0x2faf,0x8a0e,0xef22,0x7341,0x683b,0x185d,0x1951,0xe1d,0x2ae0,0x72ed,0xaa57,0x9c6a,0x3675,0x3f68,0x9f3c,0x9955,0xab0c,0x8731,0xa231,0x804c,0x6658,0xfc1e,0x78ac,0xc365,0xccc6,0xcf0c,0xbf91,0x3fa1,0x3660,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x77240c4d,0x8a0e2faf,0x7341ef22,0x185d683b,0xe1d1951,0x72ed2ae0,0x9c6aaa57,0x3f683675,0x99559f3c,0x8731ab0c,0x804ca231,0xfc1e6658,0xc36578ac,0xcf0cccc6,0x3fa1bf91,0x83660}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8a0e2faf77240c4d,0x185d683b7341ef22,0x72ed2ae00e1d1951,0x3f6836759c6aaa57,0x8731ab0c99559f3c,0xfc1e6658804ca231,0xcf0cccc6c36578ac,0x836603fa1bf91}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x5fd3,0xc1bb,0x3527,0x289e,0x97fd,0xf5ce,0xa8e1,0xfbf2,0x8f04,0xb5e7,0xdf66,0xcb44,0x5b5,0x8314,0x31c,0x6e5c,0xa6b9,0x3134,0x3d19,0x5ea9,0x860d,0x37fe,0x8003,0xafb9,0xbfdd,0xf377,0xa36d,0xde5a,0xa9df,0x8da,0xc872,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc1bb5fd3,0x289e3527,0xf5ce97fd,0xfbf2a8e1,0xb5e78f04,0xcb44df66,0x831405b5,0x6e5c031c,0x3134a6b9,0x5ea93d19,0x37fe860d,0xafb98003,0xf377bfdd,0xde5aa36d,0x8daa9df,0xbc872}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x289e3527c1bb5fd3,0xfbf2a8e1f5ce97fd,0xcb44df66b5e78f04,0x6e5c031c831405b5,0x5ea93d193134a6b9,0xafb9800337fe860d,0xde5aa36df377bfdd,0xbc87208daa9df}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xb354,0x6a4f,0xd461,0xf7db,0x4aec,0x6786,0xff6,0xb274,0xfcf4,0x66d,0x97e9,0x277e,0x5e43,0x68a3,0xb1fa,0x6062,0xa56a,0x8c2b,0x67ed,0xd926,0x444a,0x4883,0x5bc5,0x8084,0x1f0a,0x209e,0x3b85,0x4eb6,0x14fe,0xb973,0xb05c,0xa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6a4fb354,0xf7dbd461,0x67864aec,0xb2740ff6,0x66dfcf4,0x277e97e9,0x68a35e43,0x6062b1fa,0x8c2ba56a,0xd92667ed,0x4883444a,0x80845bc5,0x209e1f0a,0x4eb63b85,0xb97314fe,0xab05c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf7dbd4616a4fb354,0xb2740ff667864aec,0x277e97e9066dfcf4,0x6062b1fa68a35e43,0xd92667ed8c2ba56a,0x80845bc54883444a,0x4eb63b85209e1f0a,0xab05cb97314fe}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x9c41,0x213b,0x2271,0x4d2a,0xca4c,0x987c,0xf3fd,0x8462,0x84ba,0x5504,0xf930,0x5ca1,0xb075,0x84d2,0xb16,0x1bc1,0xe1ac,0xfeb5,0xe84e,0x4bb0,0xf6b6,0x57b6,0x3d98,0x97f4,0xda24,0x9866,0x1aae,0xb84,0x36ec,0xfcb7,0x4a2d,0xf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x213b9c41,0x4d2a2271,0x987cca4c,0x8462f3fd,0x550484ba,0x5ca1f930,0x84d2b075,0x1bc10b16,0xfeb5e1ac,0x4bb0e84e,0x57b6f6b6,0x97f43d98,0x9866da24,0xb841aae,0xfcb736ec,0xf4a2d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4d2a2271213b9c41,0x8462f3fd987cca4c,0x5ca1f930550484ba,0x1bc10b1684d2b075,0x4bb0e84efeb5e1ac,0x97f43d9857b6f6b6,0xb841aae9866da24,0xf4a2dfcb736ec}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xa02d,0x3e44,0xcad8,0xd761,0x6802,0xa31,0x571e,0x40d,0x70fb,0x4a18,0x2099,0x34bb,0xfa4a,0x7ceb,0xfce3,0x91a3,0x5946,0xcecb,0xc2e6,0xa156,0x79f2,0xc801,0x7ffc,0x5046,0x4022,0xc88,0x5c92,0x21a5,0x5620,0xf725,0x378d,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3e44a02d,0xd761cad8,0xa316802,0x40d571e,0x4a1870fb,0x34bb2099,0x7cebfa4a,0x91a3fce3,0xcecb5946,0xa156c2e6,0xc80179f2,0x50467ffc,0xc884022,0x21a55c92,0xf7255620,0x4378d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd761cad83e44a02d,0x40d571e0a316802,0x34bb20994a1870fb,0x91a3fce37cebfa4a,0xa156c2e6cecb5946,0x50467ffcc80179f2,0x21a55c920c884022,0x4378df7255620}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x3919,0x9bc5,0xcbb7,0xe8a6,0x3f55,0x22a,0x8690,0xc64e,0x8e93,0x6c4d,0x80e8,0x422f,0xffd,0x7e1,0xf545,0xb342,0x87be,0x80a5,0xa62b,0xfb8d,0x4048,0x466e,0x4697,0xd4d,0x9d79,0xc9ba,0x52c1,0xa008,0x21f1,0xf309,0xb87c,0xa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9bc53919,0xe8a6cbb7,0x22a3f55,0xc64e8690,0x6c4d8e93,0x422f80e8,0x7e10ffd,0xb342f545,0x80a587be,0xfb8da62b,0x466e4048,0xd4d4697,0xc9ba9d79,0xa00852c1,0xf30921f1,0xab87c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe8a6cbb79bc53919,0xc64e8690022a3f55,0x422f80e86c4d8e93,0xb342f54507e10ffd,0xfb8da62b80a587be,0xd4d4697466e4048,0xa00852c1c9ba9d79,0xab87cf30921f1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc03e,0x86b5,0xcdfe,0x5bc4,0xc7a1,0xbc7b,0x90d9,0x9464,0xc604,0x9345,0x853d,0xc710,0x1ad2,0x4b98,0x4050,0x8ef4,0xd73c,0x6664,0xbd2,0xb610,0x483e,0x5e87,0xabe9,0xcf72,0x679e,0xbfbf,0x52b1,0x3483,0xf7c,0x4a36,0xbd53,0xe}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x86b5c03e,0x5bc4cdfe,0xbc7bc7a1,0x946490d9,0x9345c604,0xc710853d,0x4b981ad2,0x8ef44050,0x6664d73c,0xb6100bd2,0x5e87483e,0xcf72abe9,0xbfbf679e,0x348352b1,0x4a360f7c,0xebd53}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x5bc4cdfe86b5c03e,0x946490d9bc7bc7a1,0xc710853d9345c604,0x8ef440504b981ad2,0xb6100bd26664d73c,0xcf72abe95e87483e,0x348352b1bfbf679e,0xebd534a360f7c}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x5937,0x9b8c,0xba31,0x676c,0x8d31,0x9c3d,0xf619,0x42e2,0x4d1a,0xd072,0x76e5,0x390a,0x5086,0x7643,0x2d16,0xfd71,0x341,0xff7b,0x56ec,0xed63,0x1436,0x7324,0x6a5d,0x9488,0x9f0,0x145,0xd6b5,0x4043,0x10d8,0xeb6e,0x7784,0xf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9b8c5937,0x676cba31,0x9c3d8d31,0x42e2f619,0xd0724d1a,0x390a76e5,0x76435086,0xfd712d16,0xff7b0341,0xed6356ec,0x73241436,0x94886a5d,0x14509f0,0x4043d6b5,0xeb6e10d8,0xf7784}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x676cba319b8c5937,0x42e2f6199c3d8d31,0x390a76e5d0724d1a,0xfd712d1676435086,0xed6356ecff7b0341,0x94886a5d73241436,0x4043d6b5014509f0,0xf7784eb6e10d8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc6e7,0x643a,0x3448,0x1759,0xc0aa,0xfdd5,0x796f,0x39b1,0x716c,0x93b2,0x7f17,0xbdd0,0xf002,0xf81e,0xaba,0x4cbd,0x7841,0x7f5a,0x59d4,0x472,0xbfb7,0xb991,0xb968,0xf2b2,0x6286,0x3645,0xad3e,0x5ff7,0xde0e,0xcf6,0x4783,0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x643ac6e7,0x17593448,0xfdd5c0aa,0x39b1796f,0x93b2716c,0xbdd07f17,0xf81ef002,0x4cbd0aba,0x7f5a7841,0x47259d4,0xb991bfb7,0xf2b2b968,0x36456286,0x5ff7ad3e,0xcf6de0e,0x54783}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x17593448643ac6e7,0x39b1796ffdd5c0aa,0xbdd07f1793b2716c,0x4cbd0abaf81ef002,0x47259d47f5a7841,0xf2b2b968b991bfb7,0x5ff7ad3e36456286,0x547830cf6de0e}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf9da,0x446d,0xe828,0xbaf8,0x86e,0x465f,0x4be2,0x73d1,0x7357,0xf8f1,0x6a8f,0x4689,0xaad4,0x31ca,0xe4c5,0xe04b,0x3061,0xb355,0x2a79,0x3c67,0xaee7,0xbfd9,0xccd3,0x81f0,0x43a9,0x9e4d,0x999c,0x1879,0x2037,0xe02f,0xe4cf,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x446df9da,0xbaf8e828,0x465f086e,0x73d14be2,0xf8f17357,0x46896a8f,0x31caaad4,0xe04be4c5,0xb3553061,0x3c672a79,0xbfd9aee7,0x81f0ccd3,0x9e4d43a9,0x1879999c,0xe02f2037,0xbe4cf}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbaf8e828446df9da,0x73d14be2465f086e,0x46896a8ff8f17357,0xe04be4c531caaad4,0x3c672a79b3553061,0x81f0ccd3bfd9aee7,0x1879999c9e4d43a9,0xbe4cfe02f2037}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xdeef,0xdf9,0xbde0,0x6573,0x4697,0x2c54,0x258d,0xde5c,0x666c,0x1ecc,0xfe79,0x2440,0xb37c,0x1a39,0x9745,0xb986,0xd5df,0xa3c4,0x6e74,0x2c75,0x87aa,0x30b4,0x2c68,0x9940,0x70fc,0x2de8,0x33d0,0x91e9,0x9308,0x8c70,0xea8f,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdf9deef,0x6573bde0,0x2c544697,0xde5c258d,0x1ecc666c,0x2440fe79,0x1a39b37c,0xb9869745,0xa3c4d5df,0x2c756e74,0x30b487aa,0x99402c68,0x2de870fc,0x91e933d0,0x8c709308,0xbea8f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6573bde00df9deef,0xde5c258d2c544697,0x2440fe791ecc666c,0xb98697451a39b37c,0x2c756e74a3c4d5df,0x99402c6830b487aa,0x91e933d02de870fc,0xbea8f8c709308}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf72a,0xf1b7,0x49ce,0xf501,0x736d,0xd3d7,0xcf9c,0x45d9,0x3f81,0xfaca,0x54d5,0x572f,0x4d3b,0x3fe0,0x86cd,0xdf66,0x3496,0x45b4,0x187a,0x7fcd,0xe8d7,0x7ea1,0x5efe,0xe2a9,0xff06,0xd25f,0x99f2,0x4c0d,0x1016,0xa2f4,0x42b9,0xe}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf1b7f72a,0xf50149ce,0xd3d7736d,0x45d9cf9c,0xfaca3f81,0x572f54d5,0x3fe04d3b,0xdf6686cd,0x45b43496,0x7fcd187a,0x7ea1e8d7,0xe2a95efe,0xd25fff06,0x4c0d99f2,0xa2f41016,0xe42b9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf50149cef1b7f72a,0x45d9cf9cd3d7736d,0x572f54d5faca3f81,0xdf6686cd3fe04d3b,0x7fcd187a45b43496,0xe2a95efe7ea1e8d7,0x4c0d99f2d25fff06,0xe42b9a2f41016}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x627,0xbb92,0x17d7,0x4507,0xf791,0xb9a0,0xb41d,0x8c2e,0x8ca8,0x70e,0x9570,0xb976,0x552b,0xce35,0x1b3a,0x1fb4,0xcf9e,0x4caa,0xd586,0xc398,0x5118,0x4026,0x332c,0x7e0f,0xbc56,0x61b2,0x6663,0xe786,0xdfc8,0x1fd0,0x1b30,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xbb920627,0x450717d7,0xb9a0f791,0x8c2eb41d,0x70e8ca8,0xb9769570,0xce35552b,0x1fb41b3a,0x4caacf9e,0xc398d586,0x40265118,0x7e0f332c,0x61b2bc56,0xe7866663,0x1fd0dfc8,0x41b30}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x450717d7bb920627,0x8c2eb41db9a0f791,0xb9769570070e8ca8,0x1fb41b3ace35552b,0xc398d5864caacf9e,0x7e0f332c40265118,0xe786666361b2bc56,0x41b301fd0dfc8}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x718a,0xe24a,0xae5,0xa4d6,0xd401,0xf453,0x9f91,0x69ce,0x7d19,0xfa11,0x9273,0x4e63,0xf33a,0xde49,0xe08f,0x746a,0x243d,0x52bb,0x43b6,0xe4c,0x1bdd,0x380d,0xdf64,0x74fe,0x4dfa,0x584f,0xa4d6,0xd71b,0xf067,0xf070,0x717e,0xf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe24a718a,0xa4d60ae5,0xf453d401,0x69ce9f91,0xfa117d19,0x4e639273,0xde49f33a,0x746ae08f,0x52bb243d,0xe4c43b6,0x380d1bdd,0x74fedf64,0x584f4dfa,0xd71ba4d6,0xf070f067,0xf717e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa4d60ae5e24a718a,0x69ce9f91f453d401,0x4e639273fa117d19,0x746ae08fde49f33a,0xe4c43b652bb243d,0x74fedf64380d1bdd,0xd71ba4d6584f4dfa,0xf717ef070f067}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x5d93,0x7845,0xd1d0,0xe045,0xfa74,0x6b6,0x9400,0xad36,0x4e68,0xd3f6,0x9b00,0x7ca0,0xab22,0xfac,0x1fb6,0xb42f,0x57db,0xb2e3,0xbc5b,0x2b2d,0x94fa,0xc77e,0x34e2,0x2918,0x6ce9,0xf9dd,0x68cf,0xd4a2,0xbc59,0x6050,0xda60,0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x78455d93,0xe045d1d0,0x6b6fa74,0xad369400,0xd3f64e68,0x7ca09b00,0xfacab22,0xb42f1fb6,0xb2e357db,0x2b2dbc5b,0xc77e94fa,0x291834e2,0xf9dd6ce9,0xd4a268cf,0x6050bc59,0x5da60}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe045d1d078455d93,0xad36940006b6fa74,0x7ca09b00d3f64e68,0xb42f1fb60facab22,0x2b2dbc5bb2e357db,0x291834e2c77e94fa,0xd4a268cff9dd6ce9,0x5da606050bc59}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc6dc,0x5d39,0xac2b,0x2d81,0xc9b8,0xf398,0xdab5,0x8e30,0xb3b2,0x1b25,0x7102,0x8cd2,0x952e,0x7c35,0xb4f3,0x52b8,0x5789,0xb877,0x6906,0x8d31,0x98a6,0x8a10,0x2b3,0x1667,0x856,0xa935,0xfc76,0xc8ec,0x6044,0x9148,0x4f02,0xd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x5d39c6dc,0x2d81ac2b,0xf398c9b8,0x8e30dab5,0x1b25b3b2,0x8cd27102,0x7c35952e,0x52b8b4f3,0xb8775789,0x8d316906,0x8a1098a6,0x166702b3,0xa9350856,0xc8ecfc76,0x91486044,0xd4f02}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2d81ac2b5d39c6dc,0x8e30dab5f398c9b8,0x8cd271021b25b3b2,0x52b8b4f37c35952e,0x8d316906b8775789,0x166702b38a1098a6,0xc8ecfc76a9350856,0xd4f0291486044}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 31, ._mp_d = (mp_limb_t[]) {0x8e76,0x1db5,0xf51a,0x5b29,0x2bfe,0xbac,0x606e,0x9631,0x82e6,0x5ee,0x6d8c,0xb19c,0xcc5,0x21b6,0x1f70,0x8b95,0xdbc2,0xad44,0xbc49,0xf1b3,0xe422,0xc7f2,0x209b,0x8b01,0xb205,0xa7b0,0x5b29,0x28e4,0xf98,0xf8f,0x8e81}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1db58e76,0x5b29f51a,0xbac2bfe,0x9631606e,0x5ee82e6,0xb19c6d8c,0x21b60cc5,0x8b951f70,0xad44dbc2,0xf1b3bc49,0xc7f2e422,0x8b01209b,0xa7b0b205,0x28e45b29,0xf8f0f98,0x8e81}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x5b29f51a1db58e76,0x9631606e0bac2bfe,0xb19c6d8c05ee82e6,0x8b951f7021b60cc5,0xf1b3bc49ad44dbc2,0x8b01209bc7f2e422,0x28e45b29a7b0b205,0x8e810f8f0f98}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0xca6, 0xc89, 0x411, 0x17e9, 0x188d, 0xad5, 0x8de, 0x403, 0x183a, 0x1e0d, 0x28c, 0xfdc, 0xbcc, 0xd0, 0xa3a, 0xb2e, 0x140c, 0x11b4, 0x4bb, 0x10da, 0xb22, 0x1a4c, 0xbfa, 0xbd5, 0xae6, 0xeff, 0x465, 0x8df, 0xcf9, 0x1c4a, 0x1807, 0x1462, 0xead, 0x1c43, 0x12a3, 0x1ec2, 0x1e12, 0xad0, 0x1cd} +#elif RADIX == 32 +{0x1653222c, 0x12411644, 0x15711b7e, 0x1a3795, 0x1e0dc1d1, 0x11fb828c, 0x1d034179, 0xc59728, 0x9771b4a, 0x2c8a1b4, 0x155fd693, 0x1feae65e, 0x37c8cae, 0x1e2533e5, 0x1b462c03, 0x8f886ea, 0x1097b0a5, 0x487} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x1b7e9208b22594c8, 0x3707440346f2b571, 0xd0341798fdc14678, 0xa25dc6d2818b2e51, 0xcbd55fd69316450d, 0x99f28df232bbfd5c, 0xf10dd5b462c03f12, 0xeab43c25ec2951} +#else +{0xfd2411644b2991, 0x1440346f2b5711b, 0x1cc7ee0a33c1b83, 0xa062cb94740d05, 0x62c8a1b44bb8da, 0x1bfd5ccbd55fd69, 0x1f894cf946f9195, 0x147c43756d18b00, 0x2568784bd852} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0xb2b, 0xb22, 0x904, 0xdfa, 0xe23, 0x12b5, 0x1a37, 0x1100, 0xe0e, 0x783, 0xa3, 0x3f7, 0x2f3, 0x1034, 0x128e, 0x2cb, 0x503, 0x1c6d, 0x112e, 0x1436, 0x2c8, 0x1693, 0xafe, 0x12f5, 0x1ab9, 0xbbf, 0x1919, 0xa37, 0x133e, 0x1f12, 0x1601, 0xd18, 0x1bab, 0x1f10, 0x14a8, 0x17b0, 0x784, 0xab4, 0x653} +#elif RADIX == 32 +{0x595f7f3, 0x14904591, 0xd5c46df, 0x8068de5, 0x7837074, 0xc7ee0a3, 0x740d05e, 0x103165ca, 0x25dc6d2, 0x18b2286d, 0x1557f5a4, 0x17fab997, 0x8df232b, 0x1f894cf9, 0x16d18b00, 0xa3e21ba, 0x1c25ec29, 0x521} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x46dfa4822c89657d, 0xdc1d100d1bcad5c, 0x740d05e63f70519e, 0x689771b4a062cb94, 0x32f557f5a4c59143, 0xa67ca37c8caeff57, 0x7c43756d18b00fc4, 0x1aaad0f097b0a54} +#else +{0x1bf49045912cafb, 0x1d100d1bcad5c46, 0xf31fb828cf06e0, 0x12818b2e51d0341, 0x98b2286d12ee36, 0xeff5732f557f5a, 0x7e2533e51be465, 0x151f10dd5b462c0, 0x1a55a1e12f614} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x517, 0x18a8, 0x1a92, 0x94f, 0x1bb0, 0xf2c, 0x43, 0x5a8, 0x1463, 0x1b4b, 0x1a1c, 0x1c0e, 0x148a, 0x7f5, 0x6a3, 0x820, 0x1fc7, 0x141c, 0x1c2b, 0xd98, 0x48c, 0x587, 0x1b23, 0x1fb5, 0x4c0, 0x179c, 0x169e, 0x1927, 0x16b8, 0x1beb, 0x6bb, 0x1923, 0x2b7, 0x146d, 0x32b, 0xd85, 0x1a89, 0x1fb0, 0x2be} +#elif RADIX == 32 +{0x28bb412, 0x1fa92c54, 0xb376094, 0xd4010de, 0x1b4ba319, 0xb81da1c, 0x119fd691, 0x1c74101a, 0x185741cf, 0x19231b31, 0x15d91961, 0x1384c0fd, 0x49ed3d7, 0x1df5dae3, 0xf92335d, 0xae8da2b, 0x144b6146, 0xa86} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x6094fd4962a0a2ed, 0x2e8c65a8021bcb37, 0x19fd6915c0ed0e6d, 0x8e15d073f8e82035, 0x1fb5d91961c918d9, 0xed71927b4f5e7098, 0xd1b456f92335defa, 0x7ec3512d85195} +#else +{0x129fa92c54145da, 0x65a8021bcb3760, 0x8ae07687369746, 0xfe3a080d467f5a, 0x39231b31c2ba0e, 0x1e70981fb5d9196, 0xf7d76b8c93da7a, 0x5746d15be48cd7, 0xfd86a25b0a3} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x147b, 0x14f1, 0xfdd, 0xb2a, 0xff7, 0x1426, 0xce1, 0x19a8, 0x1bf3, 0xbdd, 0x16dd, 0x1339, 0x10dd, 0x8f4, 0x1d29, 0x1b05, 0x1ee, 0x187b, 0x118a, 0x1e55, 0xcde, 0x1a18, 0x1b1f, 0x1648, 0x1c75, 0x1db8, 0xa2a, 0x1ab6, 0x1fa, 0xb0a, 0x1bdf, 0x1d18, 0x1a98, 0x12d9, 0x13df, 0x6e0, 0xa3c, 0x537, 0x345} +#elif RADIX == 32 +{0x1a3dbe03, 0x14fdda78, 0x99feeb2, 0xd433868, 0xbdddf9e, 0x166736dd, 0x14a3d21b, 0x1eed82f4, 0x31587b0, 0x337bcab, 0x8d8fe86, 0x171c75b2, 0xad9455d, 0x158507eb, 0x11d18def, 0x17e5b3a9, 0x11e1b827, 0x13a} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xeeb2a7eed3c68f6f, 0x777e79a8670d099f, 0x4a3d21bb339b6eaf, 0x58c561ec3ddb05e9, 0xb648d8fe8619bde5, 0x83f5ab651576e38e, 0xcb67531d18defac2, 0xd94dd4786e09ef} +#else +{0x1654fdda78d1edf, 0x79a8670d099fee, 0xdd99cdb757bbbf, 0x10f76c17a528f48, 0xc337bcab18ac3d, 0x16e38eb648d8fe8, 0x1d6141fad5b28ab, 0x1bf2d9d4c74637b, 0x29ba8f0dc13} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0xc4b, 0x1f6e, 0xcba, 0x1a23, 0x8a1, 0x7c3, 0x1a45, 0x1ca3, 0x6a9, 0x643, 0x3b, 0xc83, 0x208, 0x21a, 0xd43, 0x1805, 0x1078, 0x9af, 0x80a, 0x1555, 0x50d, 0x1eb8, 0xa49, 0x161c, 0x1eee, 0xe1b, 0xf4b, 0x9de, 0x117e, 0x14f8, 0xea7, 0xd18, 0x112a, 0x1a38, 0x1cc7, 0x1c36, 0xe5, 0x10fa, 0x411} +#elif RADIX == 32 +{0x625cd26, 0x6cbafb7, 0x10d143a2, 0x51e914f, 0x643354f, 0x190603b, 0x1886841, 0x78c02b5, 0x10149af8, 0x1436aaa, 0x1c524fae, 0x37eeeb0, 0x779e96e, 0x1a7c45f9, 0x14d18753, 0x11f47112, 0x72f0db9, 0x6d0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x43a2365d7db98973, 0xcd53ca3d229f0d1, 0x18868410c8301d99, 0x540526be0f18056a, 0xd61c524fae0a1b55, 0x22fc9de7a5b86fdd, 0xe8e2254d18753d3e, 0x7c3e81cbc36e63} +#else +{0x1446cbafb7312e6, 0x13ca3d229f0d143, 0x864180ecc866a, 0x183c6015a8621a1, 0x1c1436aaa80a4d7, 0x186fddd61c524fa, 0x1e9f117e4ef3d2d, 0x18fa388953461d4, 0xf87d039786dc} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x9d5, 0x0, 0x181d, 0xced, 0x1fe0, 0x267, 0xc65, 0x1a4d, 0x9e3, 0x1f0c, 0x5d, 0xbae, 0x276, 0x1551, 0x1684, 0x1eab, 0x17f0, 0x1b20, 0xae6, 0xbc3, 0x95, 0x17c3, 0xfd8, 0x1359, 0x3f5, 0x12b6, 0x1410, 0x113, 0x1a19, 0x1c1d, 0xd91, 0x1446, 0x1233, 0x170, 0x1c50, 0x13ac, 0x6eb, 0x926, 0x3bf} +#elif RADIX == 32 +{0x4eac70e, 0x1b81d000, 0x19ffc0ce, 0x126b1944, 0x1f0c4f1e, 0x1975c05d, 0x255444e, 0x1f0f55da, 0x15cdb20b, 0x18255786, 0x197ec5f0, 0x16c3f59a, 0x44e8212, 0x1e0ee864, 0x74466c8, 0x1402e123, 0x175ceb38, 0xc31} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xc0cedc0e80013ab1, 0x313c7a4d632899ff, 0x255444ecbae02efc, 0x35736c82fe1eabb4, 0xb3597ec5f0c12abc, 0x7432113a084ad87e, 0x5c24674466c8f07, 0x14a498dd73ace28} +#else +{0x19db81d00027563, 0x7a4d632899ffc0, 0x765d70177e189e, 0xbf87aaed095511, 0x18255786ae6d90, 0xad87eb3597ec5f, 0x783ba19089d042, 0xa0170919d119b2, 0xe4931bae759c} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1997, 0xa5a, 0x4c4, 0x155d, 0x70b, 0x12f, 0xe9d, 0xfe0, 0x147c, 0x9b6, 0x18ea, 0xf41, 0x1636, 0x1707, 0x1a7e, 0x1326, 0x76d, 0xbef, 0x9fe, 0x1bb4, 0xe22, 0x200, 0x1a11, 0x7e6, 0x1709, 0x1be9, 0x1507, 0x1c63, 0xb6f, 0xceb, 0x1b88, 0x1ef6, 0x16b7, 0x20f, 0x1497, 0x1e1c, 0x26e, 0x139d, 0x330} +#elif RADIX == 32 +{0xccbbc7d, 0x1a4c452d, 0xbce1755, 0x1f03a742, 0x9b6a3e3, 0x19e838ea, 0x1f5c1ec6, 0x16d99369, 0x13fcbef3, 0x388b768, 0x6d08880, 0x1d37093f, 0x118ea0fb, 0x675adbf, 0xfef6dc4, 0x5c41f6b, 0x13778729, 0x568} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x1755d262296b32ef, 0xda8f8fe074e84bce, 0xf5c1ec6cf41c7526, 0x44ff2fbcedb326d3, 0x27e6d088801c45bb, 0xd6dfc63a83efa6e1, 0x883ed6fef6dc433a, 0x34e744dde1ca4b} +#else +{0xaba4c452d665de, 0x18fe074e84bce17, 0x367a0e3a936d47, 0x13b6cc9b4fd707b, 0x388b7689fe5f7, 0xfa6e127e6d0888, 0x19d6b6fe31d41f, 0x12e20fb5bfbdb71, 0x69ce89bbc394} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1bf, 0x197b, 0x1b4, 0x1a8a, 0xd22, 0x1cb5, 0x298, 0x76b, 0x16b6, 0x5aa, 0x54b, 0x1b63, 0x1d59, 0x2dc, 0xfe1, 0x1b24, 0x1725, 0x9a8, 0x2dd, 0x150f, 0x12de, 0x9d9, 0x2fd, 0x95f, 0xcc1, 0x1ffd, 0x101b, 0x707, 0x1d9d, 0x464, 0x39e, 0x97b, 0x8cf, 0x4a5, 0xed1, 0x9c3, 0x1b66, 0x1521, 0x112} +#elif RADIX == 32 +{0x10df9458, 0x141b4cbd, 0xd5a45a8, 0x1b58a639, 0x5aab5b1, 0x76c654b, 0x108b73ab, 0x125d923f, 0x5ba9a8b, 0xcb7aa1e, 0x1f17ea76, 0x1facc14a, 0x1c1e037f, 0x2327674, 0x1e97b1cf, 0x14494a8c, 0x1b3270dd, 0x50e} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x45a8a0da65ec37e5, 0xaad6c76b14c72d5a, 0x8b73ab3b632a596, 0xf16ea6a2e4bb247f, 0x295f17ea7665bd50, 0x3b3a70780dfff598, 0x929519e97b1cf119, 0x254876cc9c3768} +#else +{0x15141b4cbd86fca, 0xc76b14c72d5a45, 0x159db1952cb556b, 0xb92ec91fc22dce, 0xccb7aa1e2dd4d4, 0x1ff598295f17ea7, 0x188c9d9d383c06f, 0x1a24a5467a5ec73, 0x4a90ed99386e} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x4f71,0xd850,0x620a,0x55cc,0x31b0,0x4b74,0xab42,0x125c,0xb589,0xa634,0x73b3,0xca64,0x6ed0,0x6c41,0x6022,0x9b4a,0xb03e,0xe0d,0x1e19,0x2925,0x275e,0x42a,0x10dd,0xfc6a,0x7f51,0xb592,0x977e,0xe556,0x10bc,0x873d,0xa68f,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd8504f71,0x55cc620a,0x4b7431b0,0x125cab42,0xa634b589,0xca6473b3,0x6c416ed0,0x9b4a6022,0xe0db03e,0x29251e19,0x42a275e,0xfc6a10dd,0xb5927f51,0xe556977e,0x873d10bc,0x3a68f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x55cc620ad8504f71,0x125cab424b7431b0,0xca6473b3a634b589,0x9b4a60226c416ed0,0x29251e190e0db03e,0xfc6a10dd042a275e,0xe556977eb5927f51,0x3a68f873d10bc}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xed2,0x7e79,0xb784,0x90c5,0xe054,0xfc99,0x606e,0x59f4,0xb88f,0xb6ae,0x29bf,0xe3fc,0xa3cf,0x8c88,0xba94,0x4bf9,0xcb60,0xf771,0x31c0,0x7236,0x2401,0xa9e7,0xb9b8,0xfdbf,0x326e,0xb4d5,0x9bd6,0xc810,0xb7f0,0x661,0x1f62,0xf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7e790ed2,0x90c5b784,0xfc99e054,0x59f4606e,0xb6aeb88f,0xe3fc29bf,0x8c88a3cf,0x4bf9ba94,0xf771cb60,0x723631c0,0xa9e72401,0xfdbfb9b8,0xb4d5326e,0xc8109bd6,0x661b7f0,0xf1f62}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x90c5b7847e790ed2,0x59f4606efc99e054,0xe3fc29bfb6aeb88f,0x4bf9ba948c88a3cf,0x723631c0f771cb60,0xfdbfb9b8a9e72401,0xc8109bd6b4d5326e,0xf1f620661b7f0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xb407,0xc1a7,0x6715,0xe1ad,0x31eb,0x15e8,0x1594,0xbd8e,0x3976,0x2bae,0x8f7a,0x1636,0x8d19,0x88d2,0x12ae,0x1627,0xf2b0,0x4868,0xdd78,0xfa51,0xfd6b,0xa1f3,0x7eb3,0x35d9,0xd826,0x2c09,0x12a8,0x54dd,0x87d6,0xc29c,0x5bcd,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc1a7b407,0xe1ad6715,0x15e831eb,0xbd8e1594,0x2bae3976,0x16368f7a,0x88d28d19,0x162712ae,0x4868f2b0,0xfa51dd78,0xa1f3fd6b,0x35d97eb3,0x2c09d826,0x54dd12a8,0xc29c87d6,0x15bcd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe1ad6715c1a7b407,0xbd8e159415e831eb,0x16368f7a2bae3976,0x162712ae88d28d19,0xfa51dd784868f2b0,0x35d97eb3a1f3fd6b,0x54dd12a82c09d826,0x15bcdc29c87d6}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xb08f,0x27af,0x9df5,0xaa33,0xce4f,0xb48b,0x54bd,0xeda3,0x4a76,0x59cb,0x8c4c,0x359b,0x912f,0x93be,0x9fdd,0x64b5,0x4fc1,0xf1f2,0xe1e6,0xd6da,0xd8a1,0xfbd5,0xef22,0x395,0x80ae,0x4a6d,0x6881,0x1aa9,0xef43,0x78c2,0x5970,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x27afb08f,0xaa339df5,0xb48bce4f,0xeda354bd,0x59cb4a76,0x359b8c4c,0x93be912f,0x64b59fdd,0xf1f24fc1,0xd6dae1e6,0xfbd5d8a1,0x395ef22,0x4a6d80ae,0x1aa96881,0x78c2ef43,0xc5970}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xaa339df527afb08f,0xeda354bdb48bce4f,0x359b8c4c59cb4a76,0x64b59fdd93be912f,0xd6dae1e6f1f24fc1,0x395ef22fbd5d8a1,0x1aa968814a6d80ae,0xc597078c2ef43}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf3b3,0x88db,0xd050,0x75f1,0x10dd,0x8cbe,0x97c4,0xe7a2,0xe6ae,0xf1e2,0xd51f,0x8d12,0x55a8,0x6395,0xc98a,0xc097,0x60c3,0x66aa,0x54f3,0x78ce,0x5dce,0x7fb3,0x99a7,0x3e1,0x8753,0x3c9a,0x3339,0x30f3,0x406e,0xc05e,0xc99f,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x88dbf3b3,0x75f1d050,0x8cbe10dd,0xe7a297c4,0xf1e2e6ae,0x8d12d51f,0x639555a8,0xc097c98a,0x66aa60c3,0x78ce54f3,0x7fb35dce,0x3e199a7,0x3c9a8753,0x30f33339,0xc05e406e,0x7c99f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x75f1d05088dbf3b3,0xe7a297c48cbe10dd,0x8d12d51ff1e2e6ae,0xc097c98a639555a8,0x78ce54f366aa60c3,0x3e199a77fb35dce,0x30f333393c9a8753,0x7c99fc05e406e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xbdde,0x1bf3,0x7bc0,0xcae7,0x8d2e,0x58a8,0x4b1a,0xbcb8,0xccd9,0x3d98,0xfcf2,0x4881,0x66f8,0x3473,0x2e8a,0x730d,0xabbf,0x4789,0xdce9,0x58ea,0xf54,0x6169,0x58d0,0x3280,0xe1f9,0x5bd0,0x67a0,0x23d2,0x2611,0x18e1,0xd51f,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1bf3bdde,0xcae77bc0,0x58a88d2e,0xbcb84b1a,0x3d98ccd9,0x4881fcf2,0x347366f8,0x730d2e8a,0x4789abbf,0x58eadce9,0x61690f54,0x328058d0,0x5bd0e1f9,0x23d267a0,0x18e12611,0x7d51f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xcae77bc01bf3bdde,0xbcb84b1a58a88d2e,0x4881fcf23d98ccd9,0x730d2e8a347366f8,0x58eadce94789abbf,0x328058d061690f54,0x23d267a05bd0e1f9,0x7d51f18e12611}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xee54,0xe36f,0x939d,0xea02,0xe6db,0xa7ae,0x9f39,0x8bb3,0x7f02,0xf594,0xa9ab,0xae5e,0x9a76,0x7fc0,0xd9a,0xbecd,0x692d,0x8b68,0x30f4,0xff9a,0xd1ae,0xfd43,0xbdfc,0xc552,0xfe0d,0xa4bf,0x33e5,0x981b,0x202c,0x45e8,0x8573,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe36fee54,0xea02939d,0xa7aee6db,0x8bb39f39,0xf5947f02,0xae5ea9ab,0x7fc09a76,0xbecd0d9a,0x8b68692d,0xff9a30f4,0xfd43d1ae,0xc552bdfc,0xa4bffe0d,0x981b33e5,0x45e8202c,0xc8573}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xea02939de36fee54,0x8bb39f39a7aee6db,0xae5ea9abf5947f02,0xbecd0d9a7fc09a76,0xff9a30f48b68692d,0xc552bdfcfd43d1ae,0x981b33e5a4bffe0d,0xc857345e8202c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc4d,0x7724,0x2faf,0x8a0e,0xef22,0x7341,0x683b,0x185d,0x1951,0xe1d,0x2ae0,0x72ed,0xaa57,0x9c6a,0x3675,0x3f68,0x9f3c,0x9955,0xab0c,0x8731,0xa231,0x804c,0x6658,0xfc1e,0x78ac,0xc365,0xccc6,0xcf0c,0xbf91,0x3fa1,0x3660,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x77240c4d,0x8a0e2faf,0x7341ef22,0x185d683b,0xe1d1951,0x72ed2ae0,0x9c6aaa57,0x3f683675,0x99559f3c,0x8731ab0c,0x804ca231,0xfc1e6658,0xc36578ac,0xcf0cccc6,0x3fa1bf91,0x83660}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8a0e2faf77240c4d,0x185d683b7341ef22,0x72ed2ae00e1d1951,0x3f6836759c6aaa57,0x8731ab0c99559f3c,0xfc1e6658804ca231,0xcf0cccc6c36578ac,0x836603fa1bf91}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xe7eb,0x27c8,0x739b,0x6eaa,0x7a17,0xf593,0xac1c,0x4a84,0x1a27,0x7771,0xe67e,0xea3d,0x4596,0xa34b,0x8edd,0xc51c,0x7c15,0xd1a1,0x2551,0x481b,0x402e,0xfed0,0x8b82,0x1eab,0xc98b,0x20fa,0x7143,0x6abf,0x463a,0x475f,0x510f,0x9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x27c8e7eb,0x6eaa739b,0xf5937a17,0x4a84ac1c,0x77711a27,0xea3de67e,0xa34b4596,0xc51c8edd,0xd1a17c15,0x481b2551,0xfed0402e,0x1eab8b82,0x20fac98b,0x6abf7143,0x475f463a,0x9510f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6eaa739b27c8e7eb,0x4a84ac1cf5937a17,0xea3de67e77711a27,0xc51c8edda34b4596,0x481b2551d1a17c15,0x1eab8b82fed0402e,0x6abf714320fac98b,0x9510f475f463a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x9e28,0x9e31,0xdab6,0x138c,0xc3c0,0x5193,0x444d,0xb2b7,0xf371,0x5630,0xb08b,0xc700,0x2404,0x3f08,0xc3f,0xbd7c,0x963b,0xd892,0x7bb2,0x429d,0x19d8,0xf277,0x853d,0x9aac,0x9bfa,0x42cd,0xf5e8,0x9e40,0x8a41,0x15a8,0x9c23,0x6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9e319e28,0x138cdab6,0x5193c3c0,0xb2b7444d,0x5630f371,0xc700b08b,0x3f082404,0xbd7c0c3f,0xd892963b,0x429d7bb2,0xf27719d8,0x9aac853d,0x42cd9bfa,0x9e40f5e8,0x15a88a41,0x69c23}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x138cdab69e319e28,0xb2b7444d5193c3c0,0xc700b08b5630f371,0xbd7c0c3f3f082404,0x429d7bb2d892963b,0x9aac853df27719d8,0x9e40f5e842cd9bfa,0x69c2315a88a41}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x66d1,0x8ee,0x9219,0x9d61,0x13a4,0xfc63,0xc3ee,0xdf2a,0x1353,0x2ef,0xc391,0x8ad8,0x953b,0xb014,0x1029,0xa4b2,0x61a3,0xfc07,0xf3a8,0x199c,0xe6c8,0x6a41,0x6eb7,0xb459,0xa187,0x2f4e,0x9ec3,0x8b4e,0x5321,0x38b,0x5b21,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8ee66d1,0x9d619219,0xfc6313a4,0xdf2ac3ee,0x2ef1353,0x8ad8c391,0xb014953b,0xa4b21029,0xfc0761a3,0x199cf3a8,0x6a41e6c8,0xb4596eb7,0x2f4ea187,0x8b4e9ec3,0x38b5321,0x35b21}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9d61921908ee66d1,0xdf2ac3eefc6313a4,0x8ad8c39102ef1353,0xa4b21029b014953b,0x199cf3a8fc0761a3,0xb4596eb76a41e6c8,0x8b4e9ec32f4ea187,0x35b21038b5321}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x1815,0xd837,0x8c64,0x9155,0x85e8,0xa6c,0x53e3,0xb57b,0xe5d8,0x888e,0x1981,0x15c2,0xba69,0x5cb4,0x7122,0x3ae3,0x83ea,0x2e5e,0xdaae,0xb7e4,0xbfd1,0x12f,0x747d,0xe154,0x3674,0xdf05,0x8ebc,0x9540,0xb9c5,0xb8a0,0xaef0,0x6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd8371815,0x91558c64,0xa6c85e8,0xb57b53e3,0x888ee5d8,0x15c21981,0x5cb4ba69,0x3ae37122,0x2e5e83ea,0xb7e4daae,0x12fbfd1,0xe154747d,0xdf053674,0x95408ebc,0xb8a0b9c5,0x6aef0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x91558c64d8371815,0xb57b53e30a6c85e8,0x15c21981888ee5d8,0x3ae371225cb4ba69,0xb7e4daae2e5e83ea,0xe154747d012fbfd1,0x95408ebcdf053674,0x6aef0b8a0b9c5}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x4f71,0xd850,0x620a,0x55cc,0x31b0,0x4b74,0xab42,0x125c,0xb589,0xa634,0x73b3,0xca64,0x6ed0,0x6c41,0x6022,0x9b4a,0xb03e,0xe0d,0x1e19,0x2925,0x275e,0x42a,0x10dd,0xfc6a,0x7f51,0xb592,0x977e,0xe556,0x10bc,0x873d,0xa68f,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd8504f71,0x55cc620a,0x4b7431b0,0x125cab42,0xa634b589,0xca6473b3,0x6c416ed0,0x9b4a6022,0xe0db03e,0x29251e19,0x42a275e,0xfc6a10dd,0xb5927f51,0xe556977e,0x873d10bc,0x3a68f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x55cc620ad8504f71,0x125cab424b7431b0,0xca6473b3a634b589,0x9b4a60226c416ed0,0x29251e190e0db03e,0xfc6a10dd042a275e,0xe556977eb5927f51,0x3a68f873d10bc}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xed2,0x7e79,0xb784,0x90c5,0xe054,0xfc99,0x606e,0x59f4,0xb88f,0xb6ae,0x29bf,0xe3fc,0xa3cf,0x8c88,0xba94,0x4bf9,0xcb60,0xf771,0x31c0,0x7236,0x2401,0xa9e7,0xb9b8,0xfdbf,0x326e,0xb4d5,0x9bd6,0xc810,0xb7f0,0x661,0x1f62,0xf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7e790ed2,0x90c5b784,0xfc99e054,0x59f4606e,0xb6aeb88f,0xe3fc29bf,0x8c88a3cf,0x4bf9ba94,0xf771cb60,0x723631c0,0xa9e72401,0xfdbfb9b8,0xb4d5326e,0xc8109bd6,0x661b7f0,0xf1f62}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x90c5b7847e790ed2,0x59f4606efc99e054,0xe3fc29bfb6aeb88f,0x4bf9ba948c88a3cf,0x723631c0f771cb60,0xfdbfb9b8a9e72401,0xc8109bd6b4d5326e,0xf1f620661b7f0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xb407,0xc1a7,0x6715,0xe1ad,0x31eb,0x15e8,0x1594,0xbd8e,0x3976,0x2bae,0x8f7a,0x1636,0x8d19,0x88d2,0x12ae,0x1627,0xf2b0,0x4868,0xdd78,0xfa51,0xfd6b,0xa1f3,0x7eb3,0x35d9,0xd826,0x2c09,0x12a8,0x54dd,0x87d6,0xc29c,0x5bcd,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc1a7b407,0xe1ad6715,0x15e831eb,0xbd8e1594,0x2bae3976,0x16368f7a,0x88d28d19,0x162712ae,0x4868f2b0,0xfa51dd78,0xa1f3fd6b,0x35d97eb3,0x2c09d826,0x54dd12a8,0xc29c87d6,0x15bcd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe1ad6715c1a7b407,0xbd8e159415e831eb,0x16368f7a2bae3976,0x162712ae88d28d19,0xfa51dd784868f2b0,0x35d97eb3a1f3fd6b,0x54dd12a82c09d826,0x15bcdc29c87d6}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xb08f,0x27af,0x9df5,0xaa33,0xce4f,0xb48b,0x54bd,0xeda3,0x4a76,0x59cb,0x8c4c,0x359b,0x912f,0x93be,0x9fdd,0x64b5,0x4fc1,0xf1f2,0xe1e6,0xd6da,0xd8a1,0xfbd5,0xef22,0x395,0x80ae,0x4a6d,0x6881,0x1aa9,0xef43,0x78c2,0x5970,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x27afb08f,0xaa339df5,0xb48bce4f,0xeda354bd,0x59cb4a76,0x359b8c4c,0x93be912f,0x64b59fdd,0xf1f24fc1,0xd6dae1e6,0xfbd5d8a1,0x395ef22,0x4a6d80ae,0x1aa96881,0x78c2ef43,0xc5970}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xaa339df527afb08f,0xeda354bdb48bce4f,0x359b8c4c59cb4a76,0x64b59fdd93be912f,0xd6dae1e6f1f24fc1,0x395ef22fbd5d8a1,0x1aa968814a6d80ae,0xc597078c2ef43}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf9da,0x446d,0xe828,0xbaf8,0x86e,0x465f,0x4be2,0x73d1,0x7357,0xf8f1,0x6a8f,0x4689,0xaad4,0x31ca,0xe4c5,0xe04b,0x3061,0xb355,0x2a79,0x3c67,0xaee7,0xbfd9,0xccd3,0x81f0,0x43a9,0x9e4d,0x999c,0x1879,0x2037,0xe02f,0xe4cf,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x446df9da,0xbaf8e828,0x465f086e,0x73d14be2,0xf8f17357,0x46896a8f,0x31caaad4,0xe04be4c5,0xb3553061,0x3c672a79,0xbfd9aee7,0x81f0ccd3,0x9e4d43a9,0x1879999c,0xe02f2037,0xbe4cf}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbaf8e828446df9da,0x73d14be2465f086e,0x46896a8ff8f17357,0xe04be4c531caaad4,0x3c672a79b3553061,0x81f0ccd3bfd9aee7,0x1879999c9e4d43a9,0xbe4cfe02f2037}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xdeef,0xdf9,0xbde0,0x6573,0x4697,0x2c54,0x258d,0xde5c,0x666c,0x1ecc,0xfe79,0x2440,0xb37c,0x1a39,0x9745,0xb986,0xd5df,0xa3c4,0x6e74,0x2c75,0x87aa,0x30b4,0x2c68,0x9940,0x70fc,0x2de8,0x33d0,0x91e9,0x9308,0x8c70,0xea8f,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdf9deef,0x6573bde0,0x2c544697,0xde5c258d,0x1ecc666c,0x2440fe79,0x1a39b37c,0xb9869745,0xa3c4d5df,0x2c756e74,0x30b487aa,0x99402c68,0x2de870fc,0x91e933d0,0x8c709308,0xbea8f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6573bde00df9deef,0xde5c258d2c544697,0x2440fe791ecc666c,0xb98697451a39b37c,0x2c756e74a3c4d5df,0x99402c6830b487aa,0x91e933d02de870fc,0xbea8f8c709308}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf72a,0xf1b7,0x49ce,0xf501,0x736d,0xd3d7,0xcf9c,0x45d9,0x3f81,0xfaca,0x54d5,0x572f,0x4d3b,0x3fe0,0x86cd,0xdf66,0x3496,0x45b4,0x187a,0x7fcd,0xe8d7,0x7ea1,0x5efe,0xe2a9,0xff06,0xd25f,0x99f2,0x4c0d,0x1016,0xa2f4,0x42b9,0xe}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf1b7f72a,0xf50149ce,0xd3d7736d,0x45d9cf9c,0xfaca3f81,0x572f54d5,0x3fe04d3b,0xdf6686cd,0x45b43496,0x7fcd187a,0x7ea1e8d7,0xe2a95efe,0xd25fff06,0x4c0d99f2,0xa2f41016,0xe42b9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf50149cef1b7f72a,0x45d9cf9cd3d7736d,0x572f54d5faca3f81,0xdf6686cd3fe04d3b,0x7fcd187a45b43496,0xe2a95efe7ea1e8d7,0x4c0d99f2d25fff06,0xe42b9a2f41016}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x627,0xbb92,0x17d7,0x4507,0xf791,0xb9a0,0xb41d,0x8c2e,0x8ca8,0x70e,0x9570,0xb976,0x552b,0xce35,0x1b3a,0x1fb4,0xcf9e,0x4caa,0xd586,0xc398,0x5118,0x4026,0x332c,0x7e0f,0xbc56,0x61b2,0x6663,0xe786,0xdfc8,0x1fd0,0x1b30,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xbb920627,0x450717d7,0xb9a0f791,0x8c2eb41d,0x70e8ca8,0xb9769570,0xce35552b,0x1fb41b3a,0x4caacf9e,0xc398d586,0x40265118,0x7e0f332c,0x61b2bc56,0xe7866663,0x1fd0dfc8,0x41b30}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x450717d7bb920627,0x8c2eb41db9a0f791,0xb9769570070e8ca8,0x1fb41b3ace35552b,0xc398d5864caacf9e,0x7e0f332c40265118,0xe786666361b2bc56,0x41b301fd0dfc8}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xb83a,0x5e7a,0x2c9b,0xd483,0xeff9,0x71e9,0x4a21,0x2eae,0x921,0xbb26,0x6bf2,0xb038,0xeac9,0xc05a,0xd498,0x34fb,0x7ca,0xaae9,0x2674,0x81de,0x471f,0x7dbe,0x88c9,0xa354,0x9f03,0x5301,0x9acc,0x7c82,0xc479,0x732,0xdc7b,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x5e7ab83a,0xd4832c9b,0x71e9eff9,0x2eae4a21,0xbb260921,0xb0386bf2,0xc05aeac9,0x34fbd498,0xaae907ca,0x81de2674,0x7dbe471f,0xa35488c9,0x53019f03,0x7c829acc,0x732c479,0x8dc7b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd4832c9b5e7ab83a,0x2eae4a2171e9eff9,0xb0386bf2bb260921,0x34fbd498c05aeac9,0x81de2674aae907ca,0xa35488c97dbe471f,0x7c829acc53019f03,0x8dc7b0732c479}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 31, ._mp_d = (mp_limb_t[]) {0x4733,0xaeba,0xf3d4,0x84bf,0x453a,0xa71a,0xe0fa,0x4604,0xf02b,0x9bc2,0xb114,0x5fc5,0x5f8d,0x1a8d,0x2302,0x175d,0x3655,0x8351,0x51b,0x698c,0xc745,0x8c83,0xdd6a,0xdd4b,0x682f,0x80b7,0xd1fc,0xe320,0xca30,0xc1d3,0xc365}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xaeba4733,0x84bff3d4,0xa71a453a,0x4604e0fa,0x9bc2f02b,0x5fc5b114,0x1a8d5f8d,0x175d2302,0x83513655,0x698c051b,0x8c83c745,0xdd4bdd6a,0x80b7682f,0xe320d1fc,0xc1d3ca30,0xc365}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x84bff3d4aeba4733,0x4604e0faa71a453a,0x5fc5b1149bc2f02b,0x175d23021a8d5f8d,0x698c051b83513655,0xdd4bdd6a8c83c745,0xe320d1fc80b7682f,0xc365c1d3ca30}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xe32c,0x5173,0xdcb0,0xe05d,0x3a7e,0x6e8c,0xfd38,0xbed7,0x5fe0,0xa986,0x26f1,0xedf0,0x8fc7,0x1dbc,0xa48e,0x2e70,0x6648,0xe767,0xe8c3,0xf05b,0x26aa,0x63b6,0xf8f6,0x5304,0x7042,0x7c93,0x54a2,0xe675,0xd3ea,0x2b1,0xb36e,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x5173e32c,0xe05ddcb0,0x6e8c3a7e,0xbed7fd38,0xa9865fe0,0xedf026f1,0x1dbc8fc7,0x2e70a48e,0xe7676648,0xf05be8c3,0x63b626aa,0x5304f8f6,0x7c937042,0xe67554a2,0x2b1d3ea,0x8b36e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe05ddcb05173e32c,0xbed7fd386e8c3a7e,0xedf026f1a9865fe0,0x2e70a48e1dbc8fc7,0xf05be8c3e7676648,0x5304f8f663b626aa,0xe67554a27c937042,0x8b36e02b1d3ea}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x47c6,0xa185,0xd364,0x2b7c,0x1006,0x8e16,0xb5de,0xd151,0xf6de,0x44d9,0x940d,0x4fc7,0x1536,0x3fa5,0x2b67,0xcb04,0xf835,0x5516,0xd98b,0x7e21,0xb8e0,0x8241,0x7736,0x5cab,0x60fc,0xacfe,0x6533,0x837d,0x3b86,0xf8cd,0x2384,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xa18547c6,0x2b7cd364,0x8e161006,0xd151b5de,0x44d9f6de,0x4fc7940d,0x3fa51536,0xcb042b67,0x5516f835,0x7e21d98b,0x8241b8e0,0x5cab7736,0xacfe60fc,0x837d6533,0xf8cd3b86,0x72384}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2b7cd364a18547c6,0xd151b5de8e161006,0x4fc7940d44d9f6de,0xcb042b673fa51536,0x7e21d98b5516f835,0x5cab77368241b8e0,0x837d6533acfe60fc,0x72384f8cd3b86}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x116d, 0x165f, 0x7d3, 0x488, 0xe08, 0xb12, 0x2e0, 0x18b4, 0xdbb, 0x181e, 0xe50, 0x19b8, 0xc17, 0x1c82, 0x1cf6, 0x7b9, 0xebb, 0x1c0a, 0x183a, 0x1f42, 0x1a3e, 0x176b, 0x19fa, 0x7e4, 0x1646, 0x1dc5, 0x1e9d, 0x4b3, 0x18df, 0xf2d, 0xe2e, 0x2e3, 0x903, 0x19ef, 0x1f94, 0x237, 0x18ef, 0x26c, 0x12f} +#elif RADIX == 32 +{0x18b69673, 0x107d3b2f, 0x49c1048, 0x5a0b816, 0x181e6dde, 0x1f370e50, 0x1b720982, 0xbb3dcf3, 0x1075c0a7, 0x1e8fbe85, 0x4cfd5da, 0x18b6463f, 0x12cfd3bd, 0x796e37c, 0x62e3717, 0x533de90, 0x7788dff, 0x2e6} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x104883e9d97e2da5, 0x79b778b41702c49c, 0xb720982f9b872860, 0x2c1d7029d767b9e7, 0xc7e4cfd5daf47df4, 0x71be4b3f4ef716c8, 0x67bd2062e37173cb, 0x1089b31de237fca} +#else +{0x9107d3b2fc5b4b, 0x178b41702c49c10, 0x17cdc394303cdb, 0x75d9ee79edc826, 0x15e8fbe8583ae05, 0x1716c8c7e4cfd5d, 0x19e5b8df259fa77, 0x1299ef4818b8dc5, 0x613663bc46ff} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x1c5d, 0x1d97, 0x1f4, 0x122, 0x1382, 0x2c4, 0xb8, 0x1e2d, 0x136e, 0x607, 0x394, 0x1e6e, 0x1305, 0x1720, 0xf3d, 0x19ee, 0x13ae, 0x1702, 0x160e, 0x17d0, 0x1e8f, 0x15da, 0x67e, 0x11f9, 0xd91, 0xf71, 0x1fa7, 0x192c, 0xe37, 0x13cb, 0x1b8b, 0x18b8, 0x1a40, 0x67b, 0x1fe5, 0x188d, 0x63b, 0x189b, 0x47b} +#elif RADIX == 32 +{0x1e2ed505, 0x41f4ecb, 0x11270412, 0x11682e05, 0x6079b77, 0x17cdc394, 0x1edc8260, 0x1aecf73c, 0xc1d7029, 0x17a3efa1, 0x1933f576, 0xe2d918f, 0x4b3f4ef, 0x19e5b8df, 0x18b8dc5, 0x194cf7a4, 0x11de237f, 0x159} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x41220fa765f8bb5, 0x1e6dde2d05c0b127, 0xedc8260be6e1ca18, 0xb075c0a75d9ee79, 0x31f933f576bd1f7d, 0xdc6f92cfd3bdc5b2, 0x99ef4818b8dc5cf2, 0x6e26cc7788dff2} +#else +{0x2441f4ecbf176a, 0x1de2d05c0b12704, 0x105f370e50c0f36, 0x9d767b9e7b7209, 0xd7a3efa160eb81, 0x1dc5b231f933f57, 0xe796e37c967e9d, 0x1ca67bd2062e371, 0xdc4d98ef11bf} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x51d, 0x1394, 0xcca, 0x1568, 0x1790, 0x11d6, 0x18aa, 0xe65, 0x1e8e, 0x4fe, 0xab9, 0x1496, 0x167d, 0x1b42, 0x1f85, 0x1d7a, 0x8c4, 0x17ea, 0x1269, 0x16, 0x1fbf, 0x8b5, 0x6f4, 0x1202, 0x17c4, 0x427, 0x1273, 0x14f, 0x49c, 0xfba, 0x1b3b, 0x13cd, 0x10ee, 0x634, 0x10ae, 0x2c4, 0x10b4, 0x1377, 0xfe} +#elif RADIX == 32 +{0x28e92dc, 0x10cca9ca, 0x15af2156, 0x132e2aa3, 0x4fef473, 0x1692cab9, 0x2ed0acf, 0xc4ebd7e, 0x4d37ea4, 0xfefc02d, 0x237a22d, 0x4f7c490, 0x53e4e64, 0x17dd1270, 0x1d3cdd9d, 0xb8c690e, 0x5a0b121, 0x1bc} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x215686654e50a3a4, 0xfbd1ce65c55475af, 0x2ed0acfb49655c93, 0x6934dfa9189d7afc, 0x920237a22d7f7e01, 0x893814f939909ef8, 0x18d21dd3cdd9dbee, 0x134dde1682c4857} +#else +{0xad0cca9ca14749, 0x1ce65c55475af21, 0x7da4b2ae49fde8, 0x46275ebf0bb42b, 0x1afefc02d269bf5, 0x109ef8920237a22, 0xdf7449c0a7c9cc, 0x15c6348774f3767, 0xb9bbc2d05890} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x17ab, 0x1e1a, 0x1bfe, 0x1f73, 0x1eb9, 0xf30, 0x1cca, 0x1aaf, 0xbea, 0xa1b, 0xb73, 0x86d, 0x1c13, 0x1c31, 0x1e6e, 0x1fbf, 0x968, 0x10f0, 0xb53, 0x1418, 0x11c6, 0x65f, 0x188, 0x2c7, 0x79b, 0xa9, 0xa92, 0x12b0, 0x1b53, 0x1564, 0xfa7, 0x1fd7, 0xa5b, 0xb32, 0x1bc8, 0xc90, 0x11ee, 0x1f6, 0x3f2} +#elif RADIX == 32 +{0xbd5cad1, 0x7bfef0d, 0xc3d73f7, 0x157f329e, 0xa1b5f56, 0xd0dab73, 0x1770c782, 0x168fdff9, 0x16a70f04, 0x1c71a830, 0x70c4197, 0x15279b16, 0xac15240, 0x1ab26d4e, 0x17fd77d3, 0x121664a5, 0xf732437, 0xa34} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x73f73dff786af572, 0x6d7d5aafe653cc3d, 0x770c782686d5b9a8, 0x85a9c3c12d1fbff3, 0x62c70c4197e38d41, 0x36a72b054902a4f3, 0x2cc94b7fd77d3d59, 0x1307da3dcc90de4} +#else +{0x1ee7bfef0d5eae5, 0x15aafe653cc3d73, 0x13436adcd436be, 0x4b47effcddc31e, 0xfc71a830b53878, 0x2a4f362c70c419, 0x1eac9b539582a48, 0x190b3252dff5df4, 0xb0fb47b9921b} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x166f, 0x4b7, 0x1268, 0x18f5, 0x10a9, 0x17ea, 0x105e, 0x1090, 0x1c31, 0x624, 0xec6, 0xea1, 0x17d2, 0xf55, 0x10d3, 0x8fb, 0x9ab, 0x1ae2, 0x952, 0xcab, 0x100d, 0x702, 0xc4d, 0x1387, 0x344, 0xdaf, 0x1566, 0xf8c, 0x1e1c, 0x6f1, 0x1af9, 0xf1, 0xd6d, 0xa06, 0xb5c, 0x62c, 0x2e9, 0x1131, 0x683} +#elif RADIX == 32 +{0x1b37fb85, 0xb26825b, 0x1aa1538f, 0x48417af, 0x624e18c, 0x9d42ec6, 0x9bd56fa, 0x1ab47dc3, 0x12a5ae24, 0x14035956, 0x76269c0, 0x15e3449c, 0x1e32accd, 0x1378f871, 0x1a0f1d7c, 0x17140cd6, 0x17498b16, 0x608} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x538f593412decdfe, 0x9386309082f5faa1, 0x9bd56fa4ea176318, 0xb4a96b893568fb86, 0x93876269c0a01aca, 0x7c38f8cab336bc68, 0x2819ada0f1d7c9bc, 0x17c4c45d262c5ae} +#else +{0x11eb26825bd9bfd, 0x309082f5faa153, 0x1d2750bb18c49c3, 0x4d5a3ee1a6f55b, 0x14035956952d71, 0x16bc6893876269c, 0x4de3e1c7c65599, 0xb8a066b683c75f, 0x148988ba4c58b} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x826, 0x1efe, 0xa95, 0x174d, 0x11b5, 0x1184, 0x1d4, 0x1024, 0x1d44, 0x349, 0x83c, 0x665, 0x4a2, 0x1288, 0x473, 0xa16, 0xe54, 0xafc, 0x6e2, 0x13f1, 0x217, 0x11e4, 0x1988, 0xe26, 0xd9a, 0x168f, 0x3d, 0x1436, 0x311, 0x148d, 0x168f, 0x1ad8, 0x1156, 0xb8, 0x193f, 0x1655, 0x279, 0x5cd, 0x65e} +#elif RADIX == 32 +{0x41378c1, 0x1aa95f7f, 0x1236b74, 0x1207523, 0x349ea24, 0x8cca83c, 0x19ca2094, 0x5450b11, 0xdc4afc7, 0x85e7e2, 0x6cc4479, 0x11ed9a71, 0x10d807b6, 0x1a468c46, 0xdad8b47, 0xfc17115, 0x13cd9572, 0xe8} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x6b74d54afbf904de, 0x27a890240ea46123, 0x9ca2094466541e0d, 0x13712bf1ca8a1623, 0x4e26cc4479042f3f, 0x462343601eda3db3, 0x82e22adad8b47d23, 0x517344f3655c9f} +#else +{0xe9aa95f7f209bc, 0x90240ea461236b, 0xa2332a0f0693d4, 0x72a28588e72882, 0x12085e7e26e257e, 0x1a3db34e26cc447, 0x1e91a311a1b00f6, 0x7e0b88ab6b62d1, 0xa2e689e6cab9} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1aab, 0xe01, 0x1bf3, 0x122d, 0xd71, 0x34e, 0x153b, 0x1444, 0x1d19, 0x1165, 0x1496, 0x568, 0x12d4, 0x105c, 0x1129, 0x2c7, 0x1706, 0x359, 0x1a4f, 0x114, 0x758, 0x1780, 0x1617, 0x1485, 0x1147, 0xa4f, 0x1f77, 0xf13, 0x1547, 0x103c, 0x352, 0x125d, 0xb1e, 0x1526, 0x1708, 0xfb5, 0x17bf, 0x1d55, 0x6bc} +#elif RADIX == 32 +{0x1d55ffc5, 0x1bbf3700, 0x139ae322, 0x2254ec6, 0x1165e8cd, 0x10ad1496, 0x14c1725a, 0x106163c4, 0x149e359b, 0x1d60229, 0x5b0bde0, 0x9f147a4, 0x1c4feeea, 0x81e551d, 0x1d25d1a9, 0x22a4cb1, 0x1dfbed6e, 0x72d} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xe322ddf9b807557f, 0x97a33444a9d8d39a, 0x4c1725a8568a4b45, 0x4d278d66e0c2c789, 0xf485b0bde00eb011, 0x2a8ef13fbba93e28, 0x549963d25d1a940f, 0x197556f7efb5b84} +#else +{0x45bbf3700eaaff, 0x13444a9d8d39ae3, 0xd42b4525a2cbd1, 0x1b830b1e25305c9, 0x1d60229a4f1ac, 0x93e28f485b0bde, 0xa079547789fddd, 0x1152658f49746a, 0x17eaadefdf6b7} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x204, 0x9f6, 0x1dba, 0x110e, 0x6ea, 0x112a, 0xa11, 0xd06, 0x15aa, 0x1f0b, 0xeec, 0xef1, 0x1edc, 0x1604, 0x65b, 0x129, 0x39d, 0x8f8, 0x5d5, 0x672, 0x150a, 0x233, 0xc20, 0x12ba, 0x1855, 0x15a6, 0xd50, 0x1c71, 0x15b7, 0xf04, 0x579, 0x16d2, 0xbac, 0x4c9, 0xaf5, 0x514, 0xf27, 0xef, 0x36a} +#elif RADIX == 32 +{0x10240be, 0x1ddba4fb, 0xa8dd510, 0x8328462, 0x1f0bad53, 0x11de2eec, 0xdd813db, 0x19d09499, 0xbaa8f81, 0x1d428ce4, 0x1a61008c, 0x14d85595, 0x11c5aa15, 0x178256df, 0x196d22bc, 0x1d4992ba, 0x19394515, 0x27b} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xd510eedd27d84090, 0x2eb54d06508c4a8d, 0xdd813db8ef17767c, 0x22eaa3e073a12932, 0xb2ba61008cea1467, 0x2b6fc716a8569b0a, 0x93257596d22bcbc1, 0x503bde4e51457a} +#else +{0x21ddba4fb08120, 0x14d06508c4a8dd5, 0xdc778bbb3e175a, 0x1ce84a4cb7604f, 0x19d428ce45d547c, 0x169b0ab2ba61008, 0x5e095b7e38b542, 0x1ea4c95d65b48af, 0xa077bc9ca28a} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x2ce5,0xf14f,0xd32e,0x18c2,0x5217,0x2833,0xa7fc,0x4090,0xd9d5,0x4d89,0xe770,0x3801,0xbca0,0x6ac9,0x5432,0x2ee5,0x4356,0x827a,0xdf1a,0x8911,0x4102,0xf05a,0x3e5,0x18b9,0xf66f,0x77ad,0xd99b,0xea2f,0xa030,0x36bb,0xe071,0xd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf14f2ce5,0x18c2d32e,0x28335217,0x4090a7fc,0x4d89d9d5,0x3801e770,0x6ac9bca0,0x2ee55432,0x827a4356,0x8911df1a,0xf05a4102,0x18b903e5,0x77adf66f,0xea2fd99b,0x36bba030,0xde071}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x18c2d32ef14f2ce5,0x4090a7fc28335217,0x3801e7704d89d9d5,0x2ee554326ac9bca0,0x8911df1a827a4356,0x18b903e5f05a4102,0xea2fd99b77adf66f,0xde07136bba030}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x752,0x8c67,0x260,0x14f,0x138a,0x865,0x5e4d,0x4db9,0xca26,0x7a2c,0x4a7e,0x9422,0xb2f6,0xbdc8,0x841d,0x7e33,0x5677,0x38a6,0x9633,0x15fc,0xacce,0xbe04,0xdcef,0xb16c,0xd57b,0x7a5e,0x8395,0x1f8f,0xe4b9,0xe383,0x4be3,0x6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8c670752,0x14f0260,0x865138a,0x4db95e4d,0x7a2cca26,0x94224a7e,0xbdc8b2f6,0x7e33841d,0x38a65677,0x15fc9633,0xbe04acce,0xb16cdcef,0x7a5ed57b,0x1f8f8395,0xe383e4b9,0x64be3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x14f02608c670752,0x4db95e4d0865138a,0x94224a7e7a2cca26,0x7e33841dbdc8b2f6,0x15fc963338a65677,0xb16cdcefbe04acce,0x1f8f83957a5ed57b,0x64be3e383e4b9}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x9b63,0x40f2,0x5177,0x535f,0x5098,0x2f26,0x18a2,0x5e1c,0x5d70,0x33e9,0x1db9,0x2397,0xaccc,0xb98b,0xcae6,0x87bf,0xd43f,0xb329,0xf2d0,0x2f67,0x779c,0xd2ab,0x4369,0xc67d,0xd065,0x9550,0xf06b,0x1a2b,0xc6e,0x9b2b,0xbb64,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x40f29b63,0x535f5177,0x2f265098,0x5e1c18a2,0x33e95d70,0x23971db9,0xb98baccc,0x87bfcae6,0xb329d43f,0x2f67f2d0,0xd2ab779c,0xc67d4369,0x9550d065,0x1a2bf06b,0x9b2b0c6e,0x3bb64}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x535f517740f29b63,0x5e1c18a22f265098,0x23971db933e95d70,0x87bfcae6b98baccc,0x2f67f2d0b329d43f,0xc67d4369d2ab779c,0x1a2bf06b9550d065,0x3bb649b2b0c6e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xd31b,0xeb0,0x2cd1,0xe73d,0xade8,0xd7cc,0x5803,0xbf6f,0x262a,0xb276,0x188f,0xc7fe,0x435f,0x9536,0xabcd,0xd11a,0xbca9,0x7d85,0x20e5,0x76ee,0xbefd,0xfa5,0xfc1a,0xe746,0x990,0x8852,0x2664,0x15d0,0x5fcf,0xc944,0x1f8e,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xeb0d31b,0xe73d2cd1,0xd7ccade8,0xbf6f5803,0xb276262a,0xc7fe188f,0x9536435f,0xd11aabcd,0x7d85bca9,0x76ee20e5,0xfa5befd,0xe746fc1a,0x88520990,0x15d02664,0xc9445fcf,0x21f8e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe73d2cd10eb0d31b,0xbf6f5803d7ccade8,0xc7fe188fb276262a,0xd11aabcd9536435f,0x76ee20e57d85bca9,0xe746fc1a0fa5befd,0x15d0266488520990,0x21f8ec9445fcf}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc4d,0x7724,0x2faf,0x8a0e,0xef22,0x7341,0x683b,0x185d,0x1951,0xe1d,0x2ae0,0x72ed,0xaa57,0x9c6a,0x3675,0x3f68,0x9f3c,0x9955,0xab0c,0x8731,0xa231,0x804c,0x6658,0xfc1e,0x78ac,0xc365,0xccc6,0xcf0c,0xbf91,0x3fa1,0x3660,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x77240c4d,0x8a0e2faf,0x7341ef22,0x185d683b,0xe1d1951,0x72ed2ae0,0x9c6aaa57,0x3f683675,0x99559f3c,0x8731ab0c,0x804ca231,0xfc1e6658,0xc36578ac,0xcf0cccc6,0x3fa1bf91,0x83660}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8a0e2faf77240c4d,0x185d683b7341ef22,0x72ed2ae00e1d1951,0x3f6836759c6aaa57,0x8731ab0c99559f3c,0xfc1e6658804ca231,0xcf0cccc6c36578ac,0x836603fa1bf91}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x4222,0xe40c,0x843f,0x3518,0x72d1,0xa757,0xb4e5,0x4347,0x3326,0xc267,0x30d,0xb77e,0x9907,0xcb8c,0xd175,0x8cf2,0x5440,0xb876,0x2316,0xa715,0xf0ab,0x9e96,0xa72f,0xcd7f,0x1e06,0xa42f,0x985f,0xdc2d,0xd9ee,0xe71e,0x2ae0,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe40c4222,0x3518843f,0xa75772d1,0x4347b4e5,0xc2673326,0xb77e030d,0xcb8c9907,0x8cf2d175,0xb8765440,0xa7152316,0x9e96f0ab,0xcd7fa72f,0xa42f1e06,0xdc2d985f,0xe71ed9ee,0x82ae0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3518843fe40c4222,0x4347b4e5a75772d1,0xb77e030dc2673326,0x8cf2d175cb8c9907,0xa7152316b8765440,0xcd7fa72f9e96f0ab,0xdc2d985fa42f1e06,0x82ae0e71ed9ee}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x11ac,0x1c90,0x6c62,0x15fd,0x1924,0x5851,0x60c6,0x744c,0x80fd,0xa6b,0x5654,0x51a1,0x6589,0x803f,0xf265,0x4132,0x96d2,0x7497,0xcf0b,0x65,0x2e51,0x2bc,0x4203,0x3aad,0x1f2,0x5b40,0xcc1a,0x67e4,0xdfd3,0xba17,0x7a8c,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1c9011ac,0x15fd6c62,0x58511924,0x744c60c6,0xa6b80fd,0x51a15654,0x803f6589,0x4132f265,0x749796d2,0x65cf0b,0x2bc2e51,0x3aad4203,0x5b4001f2,0x67e4cc1a,0xba17dfd3,0x37a8c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x15fd6c621c9011ac,0x744c60c658511924,0x51a156540a6b80fd,0x4132f265803f6589,0x65cf0b749796d2,0x3aad420302bc2e51,0x67e4cc1a5b4001f2,0x37a8cba17dfd3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf3b3,0x88db,0xd050,0x75f1,0x10dd,0x8cbe,0x97c4,0xe7a2,0xe6ae,0xf1e2,0xd51f,0x8d12,0x55a8,0x6395,0xc98a,0xc097,0x60c3,0x66aa,0x54f3,0x78ce,0x5dce,0x7fb3,0x99a7,0x3e1,0x8753,0x3c9a,0x3339,0x30f3,0x406e,0xc05e,0xc99f,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x88dbf3b3,0x75f1d050,0x8cbe10dd,0xe7a297c4,0xf1e2e6ae,0x8d12d51f,0x639555a8,0xc097c98a,0x66aa60c3,0x78ce54f3,0x7fb35dce,0x3e199a7,0x3c9a8753,0x30f33339,0xc05e406e,0x7c99f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x75f1d05088dbf3b3,0xe7a297c48cbe10dd,0x8d12d51ff1e2e6ae,0xc097c98a639555a8,0x78ce54f366aa60c3,0x3e199a77fb35dce,0x30f333393c9a8753,0x7c99fc05e406e}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x99f9,0x50f4,0xd750,0xb0a2,0xfdaa,0x6986,0x6b4b,0x34be,0x7bd5,0x3974,0xe05,0x8c18,0x6bb8,0xbb5a,0xcc33,0x63b5,0x943b,0xec49,0xb4ef,0xbdc4,0x5a2a,0x2fc8,0x85ad,0x1291,0xa29f,0x9618,0x721b,0x93f6,0xb40f,0x2e85,0xdfbb,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x50f499f9,0xb0a2d750,0x6986fdaa,0x34be6b4b,0x39747bd5,0x8c180e05,0xbb5a6bb8,0x63b5cc33,0xec49943b,0xbdc4b4ef,0x2fc85a2a,0x129185ad,0x9618a29f,0x93f6721b,0x2e85b40f,0xbdfbb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb0a2d75050f499f9,0x34be6b4b6986fdaa,0x8c180e0539747bd5,0x63b5cc33bb5a6bb8,0xbdc4b4efec49943b,0x129185ad2fc85a2a,0x93f6721b9618a29f,0xbdfbb2e85b40f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf4c0,0x4ff5,0x2aee,0x3e90,0x49,0xb2af,0xf257,0x111c,0xead0,0xc1d5,0xc7d9,0x8a7c,0x9579,0xf62,0xe1f6,0xb43c,0x8f3f,0x14ca,0x1b7b,0xc209,0xac8,0xf5cd,0xdfc0,0x5d39,0x9d8d,0x9c9a,0x2e6e,0xba54,0x79d5,0x4f02,0x1cfc,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x4ff5f4c0,0x3e902aee,0xb2af0049,0x111cf257,0xc1d5ead0,0x8a7cc7d9,0xf629579,0xb43ce1f6,0x14ca8f3f,0xc2091b7b,0xf5cd0ac8,0x5d39dfc0,0x9c9a9d8d,0xba542e6e,0x4f0279d5,0x21cfc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3e902aee4ff5f4c0,0x111cf257b2af0049,0x8a7cc7d9c1d5ead0,0xb43ce1f60f629579,0xc2091b7b14ca8f3f,0x5d39dfc0f5cd0ac8,0xba542e6e9c9a9d8d,0x21cfc4f0279d5}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x1eb,0x1730,0x3343,0xcef3,0x2add,0x7615,0x353e,0xd52b,0x9951,0xc1,0x2292,0x69d0,0x4a9f,0xc1bd,0xfec7,0xd332,0x72b7,0x67f8,0xaa27,0x61a4,0x33dd,0x8ec0,0xfe1d,0x9a69,0x38ac,0x60f,0x209b,0xbb33,0x55b1,0x13f5,0x5c80,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x173001eb,0xcef33343,0x76152add,0xd52b353e,0xc19951,0x69d02292,0xc1bd4a9f,0xd332fec7,0x67f872b7,0x61a4aa27,0x8ec033dd,0x9a69fe1d,0x60f38ac,0xbb33209b,0x13f555b1,0xc5c80}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xcef33343173001eb,0xd52b353e76152add,0x69d0229200c19951,0xd332fec7c1bd4a9f,0x61a4aa2767f872b7,0x9a69fe1d8ec033dd,0xbb33209b060f38ac,0xc5c8013f555b1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x6607,0xaf0b,0x28af,0x4f5d,0x255,0x9679,0x94b4,0xcb41,0x842a,0xc68b,0xf1fa,0x73e7,0x9447,0x44a5,0x33cc,0x9c4a,0x6bc4,0x13b6,0x4b10,0x423b,0xa5d5,0xd037,0x7a52,0xed6e,0x5d60,0x69e7,0x8de4,0x6c09,0x4bf0,0xd17a,0x2044,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xaf0b6607,0x4f5d28af,0x96790255,0xcb4194b4,0xc68b842a,0x73e7f1fa,0x44a59447,0x9c4a33cc,0x13b66bc4,0x423b4b10,0xd037a5d5,0xed6e7a52,0x69e75d60,0x6c098de4,0xd17a4bf0,0x42044}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4f5d28afaf0b6607,0xcb4194b496790255,0x73e7f1fac68b842a,0x9c4a33cc44a59447,0x423b4b1013b66bc4,0xed6e7a52d037a5d5,0x6c098de469e75d60,0x42044d17a4bf0}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x2ce5,0xf14f,0xd32e,0x18c2,0x5217,0x2833,0xa7fc,0x4090,0xd9d5,0x4d89,0xe770,0x3801,0xbca0,0x6ac9,0x5432,0x2ee5,0x4356,0x827a,0xdf1a,0x8911,0x4102,0xf05a,0x3e5,0x18b9,0xf66f,0x77ad,0xd99b,0xea2f,0xa030,0x36bb,0xe071,0xd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf14f2ce5,0x18c2d32e,0x28335217,0x4090a7fc,0x4d89d9d5,0x3801e770,0x6ac9bca0,0x2ee55432,0x827a4356,0x8911df1a,0xf05a4102,0x18b903e5,0x77adf66f,0xea2fd99b,0x36bba030,0xde071}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x18c2d32ef14f2ce5,0x4090a7fc28335217,0x3801e7704d89d9d5,0x2ee554326ac9bca0,0x8911df1a827a4356,0x18b903e5f05a4102,0xea2fd99b77adf66f,0xde07136bba030}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x752,0x8c67,0x260,0x14f,0x138a,0x865,0x5e4d,0x4db9,0xca26,0x7a2c,0x4a7e,0x9422,0xb2f6,0xbdc8,0x841d,0x7e33,0x5677,0x38a6,0x9633,0x15fc,0xacce,0xbe04,0xdcef,0xb16c,0xd57b,0x7a5e,0x8395,0x1f8f,0xe4b9,0xe383,0x4be3,0x6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8c670752,0x14f0260,0x865138a,0x4db95e4d,0x7a2cca26,0x94224a7e,0xbdc8b2f6,0x7e33841d,0x38a65677,0x15fc9633,0xbe04acce,0xb16cdcef,0x7a5ed57b,0x1f8f8395,0xe383e4b9,0x64be3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x14f02608c670752,0x4db95e4d0865138a,0x94224a7e7a2cca26,0x7e33841dbdc8b2f6,0x15fc963338a65677,0xb16cdcefbe04acce,0x1f8f83957a5ed57b,0x64be3e383e4b9}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x9b63,0x40f2,0x5177,0x535f,0x5098,0x2f26,0x18a2,0x5e1c,0x5d70,0x33e9,0x1db9,0x2397,0xaccc,0xb98b,0xcae6,0x87bf,0xd43f,0xb329,0xf2d0,0x2f67,0x779c,0xd2ab,0x4369,0xc67d,0xd065,0x9550,0xf06b,0x1a2b,0xc6e,0x9b2b,0xbb64,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x40f29b63,0x535f5177,0x2f265098,0x5e1c18a2,0x33e95d70,0x23971db9,0xb98baccc,0x87bfcae6,0xb329d43f,0x2f67f2d0,0xd2ab779c,0xc67d4369,0x9550d065,0x1a2bf06b,0x9b2b0c6e,0x3bb64}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x535f517740f29b63,0x5e1c18a22f265098,0x23971db933e95d70,0x87bfcae6b98baccc,0x2f67f2d0b329d43f,0xc67d4369d2ab779c,0x1a2bf06b9550d065,0x3bb649b2b0c6e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xd31b,0xeb0,0x2cd1,0xe73d,0xade8,0xd7cc,0x5803,0xbf6f,0x262a,0xb276,0x188f,0xc7fe,0x435f,0x9536,0xabcd,0xd11a,0xbca9,0x7d85,0x20e5,0x76ee,0xbefd,0xfa5,0xfc1a,0xe746,0x990,0x8852,0x2664,0x15d0,0x5fcf,0xc944,0x1f8e,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xeb0d31b,0xe73d2cd1,0xd7ccade8,0xbf6f5803,0xb276262a,0xc7fe188f,0x9536435f,0xd11aabcd,0x7d85bca9,0x76ee20e5,0xfa5befd,0xe746fc1a,0x88520990,0x15d02664,0xc9445fcf,0x21f8e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe73d2cd10eb0d31b,0xbf6f5803d7ccade8,0xc7fe188fb276262a,0xd11aabcd9536435f,0x76ee20e57d85bca9,0xe746fc1a0fa5befd,0x15d0266488520990,0x21f8ec9445fcf}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x627,0xbb92,0x17d7,0x4507,0xf791,0xb9a0,0xb41d,0x8c2e,0x8ca8,0x70e,0x9570,0xb976,0x552b,0xce35,0x1b3a,0x1fb4,0xcf9e,0x4caa,0xd586,0xc398,0x5118,0x4026,0x332c,0x7e0f,0xbc56,0x61b2,0x6663,0xe786,0xdfc8,0x1fd0,0x1b30,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xbb920627,0x450717d7,0xb9a0f791,0x8c2eb41d,0x70e8ca8,0xb9769570,0xce35552b,0x1fb41b3a,0x4caacf9e,0xc398d586,0x40265118,0x7e0f332c,0x61b2bc56,0xe7866663,0x1fd0dfc8,0x41b30}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x450717d7bb920627,0x8c2eb41db9a0f791,0xb9769570070e8ca8,0x1fb41b3ace35552b,0xc398d5864caacf9e,0x7e0f332c40265118,0xe786666361b2bc56,0x41b301fd0dfc8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x2111,0xf206,0x421f,0x9a8c,0xb968,0xd3ab,0xda72,0x21a3,0x9993,0xe133,0x186,0xdbbf,0x4c83,0xe5c6,0x68ba,0x4679,0x2a20,0x5c3b,0x918b,0xd38a,0x7855,0xcf4b,0xd397,0x66bf,0x8f03,0xd217,0xcc2f,0x6e16,0x6cf7,0x738f,0x1570,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf2062111,0x9a8c421f,0xd3abb968,0x21a3da72,0xe1339993,0xdbbf0186,0xe5c64c83,0x467968ba,0x5c3b2a20,0xd38a918b,0xcf4b7855,0x66bfd397,0xd2178f03,0x6e16cc2f,0x738f6cf7,0x41570}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9a8c421ff2062111,0x21a3da72d3abb968,0xdbbf0186e1339993,0x467968bae5c64c83,0xd38a918b5c3b2a20,0x66bfd397cf4b7855,0x6e16cc2fd2178f03,0x41570738f6cf7}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x8d6,0xe48,0xb631,0xafe,0x8c92,0x2c28,0x3063,0xba26,0xc07e,0x535,0xab2a,0xa8d0,0xb2c4,0xc01f,0x7932,0x2099,0xcb69,0xba4b,0xe785,0x8032,0x1728,0x815e,0xa101,0x1d56,0xf9,0x2da0,0x660d,0xb3f2,0xefe9,0x5d0b,0xbd46,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe4808d6,0xafeb631,0x2c288c92,0xba263063,0x535c07e,0xa8d0ab2a,0xc01fb2c4,0x20997932,0xba4bcb69,0x8032e785,0x815e1728,0x1d56a101,0x2da000f9,0xb3f2660d,0x5d0befe9,0x1bd46}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xafeb6310e4808d6,0xba2630632c288c92,0xa8d0ab2a0535c07e,0x20997932c01fb2c4,0x8032e785ba4bcb69,0x1d56a101815e1728,0xb3f2660d2da000f9,0x1bd465d0befe9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf9da,0x446d,0xe828,0xbaf8,0x86e,0x465f,0x4be2,0x73d1,0x7357,0xf8f1,0x6a8f,0x4689,0xaad4,0x31ca,0xe4c5,0xe04b,0x3061,0xb355,0x2a79,0x3c67,0xaee7,0xbfd9,0xccd3,0x81f0,0x43a9,0x9e4d,0x999c,0x1879,0x2037,0xe02f,0xe4cf,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x446df9da,0xbaf8e828,0x465f086e,0x73d14be2,0xf8f17357,0x46896a8f,0x31caaad4,0xe04be4c5,0xb3553061,0x3c672a79,0xbfd9aee7,0x81f0ccd3,0x9e4d43a9,0x1879999c,0xe02f2037,0xbe4cf}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbaf8e828446df9da,0x73d14be2465f086e,0x46896a8ff8f17357,0xe04be4c531caaad4,0x3c672a79b3553061,0x81f0ccd3bfd9aee7,0x1879999c9e4d43a9,0xbe4cfe02f2037}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x129d,0xdd4c,0xe2b2,0xca3b,0x6c0b,0x9c8b,0x68f9,0x412,0x51a8,0x7583,0xae25,0xb80d,0x35d5,0x387b,0x4ba1,0x66e1,0x754,0xf6b6,0x3d8c,0x650,0xa955,0x214f,0xc05f,0x16d2,0x9ce4,0x246f,0x123e,0x3ed3,0xa07f,0x2e24,0x8964,0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdd4c129d,0xca3be2b2,0x9c8b6c0b,0x41268f9,0x758351a8,0xb80dae25,0x387b35d5,0x66e14ba1,0xf6b60754,0x6503d8c,0x214fa955,0x16d2c05f,0x246f9ce4,0x3ed3123e,0x2e24a07f,0x58964}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xca3be2b2dd4c129d,0x41268f99c8b6c0b,0xb80dae25758351a8,0x66e14ba1387b35d5,0x6503d8cf6b60754,0x16d2c05f214fa955,0x3ed3123e246f9ce4,0x589642e24a07f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x9e3f,0xbc60,0xa44c,0x253c,0xa75e,0xa9f9,0x326f,0x9f9f,0x14aa,0xa47f,0x3889,0x5ee3,0x87d,0x933f,0x6cba,0x6222,0xcd43,0xa8c9,0xa815,0x992a,0x643a,0xc1d3,0x4cff,0xf675,0xf30b,0x7e2a,0x5248,0xb9e4,0xa454,0x2c53,0x525b,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xbc609e3f,0x253ca44c,0xa9f9a75e,0x9f9f326f,0xa47f14aa,0x5ee33889,0x933f087d,0x62226cba,0xa8c9cd43,0x992aa815,0xc1d3643a,0xf6754cff,0x7e2af30b,0xb9e45248,0x2c53a454,0x3525b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x253ca44cbc609e3f,0x9f9f326fa9f9a75e,0x5ee33889a47f14aa,0x62226cba933f087d,0x992aa815a8c9cd43,0xf6754cffc1d3643a,0xb9e452487e2af30b,0x3525b2c53a454}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x584d,0xa517,0xb681,0x45de,0xc2ea,0x7c58,0x123,0xe0fd,0xfd80,0x6c5b,0xf669,0xddc5,0xb21a,0xcaa9,0xc7a0,0x37ec,0xf8c6,0x12e7,0xe984,0xe812,0xef9f,0x128a,0x9fca,0x41f5,0x118f,0x5c32,0xf1cf,0x78c5,0x9424,0x2ae3,0x60d2,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xa517584d,0x45deb681,0x7c58c2ea,0xe0fd0123,0x6c5bfd80,0xddc5f669,0xcaa9b21a,0x37ecc7a0,0x12e7f8c6,0xe812e984,0x128aef9f,0x41f59fca,0x5c32118f,0x78c5f1cf,0x2ae39424,0x260d2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x45deb681a517584d,0xe0fd01237c58c2ea,0xddc5f6696c5bfd80,0x37ecc7a0caa9b21a,0xe812e98412e7f8c6,0x41f59fca128aef9f,0x78c5f1cf5c32118f,0x260d22ae39424}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xed63,0x22b3,0x1d4d,0x35c4,0x93f4,0x6374,0x9706,0xfbed,0xae57,0x8a7c,0x51da,0x47f2,0xca2a,0xc784,0xb45e,0x991e,0xf8ab,0x949,0xc273,0xf9af,0x56aa,0xdeb0,0x3fa0,0xe92d,0x631b,0xdb90,0xedc1,0xc12c,0x5f80,0xd1db,0x769b,0xa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x22b3ed63,0x35c41d4d,0x637493f4,0xfbed9706,0x8a7cae57,0x47f251da,0xc784ca2a,0x991eb45e,0x949f8ab,0xf9afc273,0xdeb056aa,0xe92d3fa0,0xdb90631b,0xc12cedc1,0xd1db5f80,0xa769b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x35c41d4d22b3ed63,0xfbed9706637493f4,0x47f251da8a7cae57,0x991eb45ec784ca2a,0xf9afc2730949f8ab,0xe92d3fa0deb056aa,0xc12cedc1db90631b,0xa769bd1db5f80}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x1414, 0x1912, 0xddb, 0xb9, 0x121b, 0x195d, 0x6c5, 0xe75, 0x1d16, 0xcaf, 0x1a05, 0x15cc, 0x1537, 0x1c57, 0x141a, 0x1b9d, 0x5b0, 0x9e7, 0xf10, 0x300, 0x1d5c, 0xc13, 0x245, 0x1b91, 0x352, 0x730, 0xd55, 0x1ca3, 0x1dac, 0x7b0, 0x15b9, 0x1ba6, 0x7d6, 0xba4, 0xc12, 0x649, 0xf1, 0xd51, 0x107} +#elif RADIX == 32 +{0xa0a1383, 0x12ddbc89, 0x1764360b, 0x13a9b172, 0xcafe8b3, 0x1eb99a05, 0xd715ea6, 0x1b0dced0, 0x1e209e72, 0x1f570600, 0x11122b04, 0x60352dc, 0x128daaa7, 0x13d876b3, 0xdba6adc, 0x497487d, 0x7899258, 0x208} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x360b96ede44a8284, 0xbfa2ce75362e5764, 0xd715ea6f5ccd02b2, 0x788279cb61b9da0, 0x5b91122b04fab830, 0x3b59ca36aa9cc06a, 0x2e90fadba6adc9ec, 0x17b5441e2649609} +#else +{0x172ddbc8950509, 0xce75362e576436, 0x137ae6681595fd1, 0x12d86e76835c57a, 0x9f570600f104f3, 0x1cc06a5b91122b0, 0x4f61dace51b554, 0x24ba43eb6e9ab7, 0x146a883c4c92c} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x1507, 0x1e44, 0xb76, 0x182e, 0xc86, 0xe57, 0x9b1, 0x139d, 0x1f45, 0xb2b, 0x681, 0x1d73, 0x1d4d, 0x1715, 0xd06, 0x6e7, 0x196c, 0x279, 0x3c4, 0xc0, 0x1f57, 0xb04, 0x891, 0x16e4, 0xd4, 0x9cc, 0x1b55, 0x728, 0x76b, 0x9ec, 0x156e, 0x16e9, 0x1f5, 0x12e9, 0xb04, 0x992, 0x83c, 0x1b54, 0x2c1} +#elif RADIX == 32 +{0xa83b449, 0x1cb76f22, 0x15d90d82, 0x1cea6c5c, 0xb2bfa2c, 0x17ae6681, 0x35c57a9, 0x16c373b4, 0x788279c, 0x7d5c180, 0x4448ac1, 0x1980d4b7, 0x1ca36aa9, 0x4f61dac, 0xb6e9ab7, 0x125d21f, 0x1e26496, 0x122} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xd82e5bb7912a0ed, 0xafe8b39d4d8b95d9, 0x35c57a9bd73340ac, 0x1e209e72d86e768, 0x96e4448ac13eae0c, 0xed6728daaa7301a, 0x4ba43eb6e9ab727b, 0x1ed51078992582} +#else +{0x105cb76f22541da, 0xb39d4d8b95d90d, 0x14deb99a05657f4, 0x1cb61b9da0d715e, 0x27d5c1803c413c, 0x7301a96e4448ac, 0x193d876b3946d55, 0x92e90fadba6ad, 0x3daa20f1324b} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0xa07, 0x1f97, 0x13c4, 0xb69, 0x15ec, 0x161d, 0x194, 0x135c, 0xe18, 0x119a, 0x684, 0x199, 0x1a93, 0x906, 0x62e, 0x1ad4, 0xc99, 0x40b, 0x10df, 0xf12, 0x9ee, 0x93, 0x1837, 0x42d, 0x1ea3, 0x1967, 0x1d41, 0x422, 0x2d5, 0x17d0, 0x1550, 0x1c2d, 0x139a, 0x152b, 0xa57, 0x1072, 0x13bf, 0x1fe7, 0x57a} +#elif RADIX == 32 +{0x1503e7ec, 0x133c4fcb, 0x76bd8b6, 0x1ae0652c, 0x119a70c4, 0xc332684, 0x17241b52, 0x99d6a18, 0x1be40b6, 0x1a7b9e25, 0xdc1b824, 0xcfea321, 0x108ba839, 0xbe80b54, 0x15c2daa8, 0x15ea5739, 0x1dfc1c94, 0xd3c} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xd8b699e27e5d40f9, 0x69c3135c0ca5876b, 0x7241b52619934246, 0x286f902d933ad431, 0x642dc1b824d3dcf1, 0x5aa422ea0e59fd4, 0xd4ae735c2daa85f4, 0x1a7f9e77f07252b} +#else +{0x16d33c4fcba81f3, 0x1135c0ca5876bd8, 0x930cc9a12334e1, 0x164ceb50c5c906d, 0x9a7b9e250df205, 0x59fd4642dc1b82, 0x2fa02d52117507, 0xaf52b9cd70b6aa, 0x19ff3cefe0e4a} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x2, 0x2d8, 0x113e, 0xa74, 0x660, 0x141f, 0x64f, 0x885, 0x46, 0x17b9, 0x94f, 0x1b44, 0x361, 0xbf6, 0x1f17, 0x583, 0x18b3, 0x118e, 0x9ba, 0x49f, 0x1fc3, 0x13eb, 0x11c8, 0xcc8, 0x1b2d, 0x8c, 0x9c6, 0x1d9, 0xf33, 0x53d, 0x129a, 0x1b4a, 0x65, 0x169a, 0xe74, 0x544, 0x17e3, 0x1f0f, 0x2a6} +#elif RADIX == 32 +{0x1324b, 0x913e16c, 0x7ccc0a7, 0x42993e8, 0x17b90232, 0x768894f, 0xbafd86c, 0xb32c1fc, 0x137518ec, 0x1ff0c93e, 0x88e44fa, 0x119b2d66, 0x76538c0, 0x29ebccc, 0xbb4a94d, 0x1d2d3406, 0x1f19511c, 0x3fd} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xc0a7489f0b60004c, 0xe408c885327d07cc, 0xbafd86c3b444a7de, 0xf4dd463b166583f8, 0xacc88e44faff8649, 0x5e661d94e3023365, 0x5a680cbb4a94d14f, 0xf7c3efc654473a} +#else +{0x14e913e16c00099, 0xc885327d07ccc0, 0x161da2253ef7204, 0xc59960fe2ebf61, 0x15ff0c93e9ba8c7, 0x23365acc88e44f, 0x8a7af330eca718, 0xe969a032ed2a53, 0x3f87df8ca88e} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0xe6e, 0xc55, 0xb5a, 0x1be4, 0x10f8, 0x1175, 0x1ada, 0x13de, 0xa0d, 0x1cb, 0x6f3, 0x91f, 0x70c, 0x12ef, 0x1403, 0x115a, 0x1205, 0x1705, 0xb8a, 0x490, 0x681, 0x1a6f, 0xd49, 0x2ca, 0x7e2, 0x1ad8, 0x1aa6, 0x9e8, 0x1f0f, 0x1df, 0xc32, 0xd30, 0x1a34, 0xfc4, 0x1519, 0x1cde, 0x7c9, 0x12da, 0x157} +#elif RADIX == 32 +{0x17371973, 0x8b5a62a, 0x1d61f1be, 0x1ef6b6a2, 0x1cb506c, 0x1123e6f3, 0x1cbbce1, 0x58ad50, 0x17157059, 0x19a04920, 0xa6a4e9b, 0x1b07e216, 0x7a354da, 0xeffc3d, 0x8d30619, 0x65f89a3, 0x1e4f37aa, 0x651} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xf1be45ad3155cdc6, 0x2d41b3ded6d45d61, 0x1cbbce1891f37987, 0x5c55c1640b15aa0, 0x42ca6a4e9bcd0249, 0xfe1e9e8d536b60fc, 0xbf13468d30619077, 0x9cb68f93cdea8c} +#else +{0x17c8b5a62ab9b8c, 0x1b3ded6d45d61f1, 0x10c48f9bcc396a0, 0x1902c56a8072ef3, 0x179a04920b8ab82, 0xb60fc42ca6a4e9, 0x83bff0f4f46a9b, 0x32fc4d1a34c186, 0x1396d1f279bd5} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0xc71, 0x167c, 0x1de2, 0x708, 0xb78, 0x1797, 0x16d0, 0xc73, 0x1f29, 0x1014, 0x1753, 0x1dd9, 0x1326, 0xab2, 0x1e6e, 0x51a, 0x32d, 0x7c1, 0x127b, 0x1b08, 0xcd4, 0x5fd, 0x159a, 0xb2c, 0x137d, 0x28f, 0xc4f, 0x121a, 0x16dd, 0x1771, 0xa7b, 0x11b9, 0xe86, 0x199c, 0x1cb5, 0x2db, 0x14b3, 0x1e97, 0x7b} +#elif RADIX == 32 +{0x638892e, 0x11de2b3e, 0x5d6f070, 0x39db42f, 0x1014f94b, 0x1bbb3753, 0x172aca64, 0x12d28d79, 0x4f67c11, 0xb353611, 0xcacd17f, 0x11f37d59, 0x86989e2, 0x1bb8db76, 0xd1b953d, 0xd7338e8, 0x598b6f9, 0x7bd} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xf0708ef159f18e22, 0x53e52c73b685e5d6, 0x72aca64ddd9ba9c0, 0x893d9f0465a51af3, 0xab2cacd17f59a9b0, 0x6dbb21a6278a3e6f, 0xe671d0d1b953dddc, 0x7fa5e9662dbe5a} +#else +{0xe11de2b3e31c44, 0x12c73b685e5d6f0, 0x126eecdd4e029f2, 0x1196946bcdcab29, 0x1eb35361127b3e0, 0xa3e6fab2cacd17, 0xeee36dd90d313c, 0x16b99c74346e54f, 0xff4bd2cc5b7c} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x111d, 0x19ac, 0x1a8f, 0xc58, 0xaa, 0xdc, 0x13de, 0x1dc, 0x17a6, 0x1e3d, 0x198a, 0x40a, 0x120b, 0x17ba, 0x91c, 0x1858, 0xee4, 0x33b, 0x18aa, 0x1124, 0x5f8, 0x37d, 0xf3e, 0xa4b, 0x1e1, 0x2bd, 0x1ff2, 0x1a56, 0x1168, 0x739, 0x1fee, 0x190c, 0x13e9, 0xd07, 0x17fd, 0x1b9e, 0x198b, 0x1faa, 0xd2} +#elif RADIX == 32 +{0x88e8fa0, 0x11a8fcd6, 0x170154c5, 0xee4f781, 0x1e3dbd30, 0xc81598a, 0xe5eea41, 0xe4c2c24, 0x115433b7, 0x97e2249, 0xb79f0df, 0x17a1e152, 0x95bfe42, 0x39cc5a3, 0x1390cff7, 0x1f5a0f3e, 0xc5ee7af, 0xd56} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x54c58d47e6b223a3, 0xf6f4c1dc9ef03701, 0xe5eea41640acc578, 0x4c550ceddc985848, 0x2a4b79f0df4bf112, 0x62d1a56ff90af43c, 0xb41e7d390cff71ce, 0x187eab317b9ebfe} +#else +{0x18b1a8fcd644747, 0xc1dc9ef0370154, 0xb205662bc7b7a, 0x177261612397ba9, 0x1e97e22498aa19d, 0xaf43c2a4b79f0d, 0x18e73168d2b7fc8, 0x1fad079f4e433fd, 0x15fd5662f73d7} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x63c, 0x609, 0x89c, 0x1f09, 0x9c9, 0x1e89, 0x1826, 0x1460, 0x15d6, 0xa52, 0xbb2, 0x1b93, 0x1f90, 0xa2f, 0x3b3, 0x1a76, 0x1c29, 0x17fc, 0x864, 0x55a, 0x1a9b, 0x7fa, 0x7ee, 0x75f, 0x1b4b, 0x15e6, 0xd75, 0x1238, 0x847, 0x1711, 0x9e7, 0xa37, 0x4b6, 0x1264, 0x3e1, 0xf87, 0x1c47, 0x706, 0x20b} +#elif RADIX == 32 +{0x131e26c1, 0x1289c304, 0x25393f0, 0x30609bd, 0xa52aeb5, 0x3726bb2, 0x19a8bff2, 0x29d3b0e, 0x10c97fce, 0x16a6cab4, 0x1f3f71fe, 0x1cdb4b3a, 0x8e1aeb5, 0x1b88a11e, 0xca374f3, 0x1864c84b, 0x23be1c7, 0xab7} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x93f0944e1824c789, 0x4abad460c137a253, 0x9a8bff21b935d929, 0xa4325ff3853a761d, 0x675f3f71feb53655, 0x508f2386bad79b69, 0xc99096ca374f3dc4, 0x129c1b88ef871f0} +#else +{0x1e1289c30498f13, 0xd460c137a25393, 0x190dc9aec94a55d, 0xe14e9d8766a2ff, 0x1d6a6cab4864bfe, 0x179b69675f3f71f, 0x1ee2284791c35d6, 0x1c326425b28dd3c, 0xa383711df0e3} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xfe45,0x561e,0xa798,0xc163,0xedaa,0x1fff,0xb3c0,0xda12,0x2588,0x5123,0x2390,0xface,0x6e59,0x651b,0xa21d,0xb190,0xe1b0,0x21b0,0x6030,0xd81,0x6542,0x64b0,0x8cef,0xa91c,0xe0bd,0xd947,0xe27b,0x961a,0x2a3e,0xf20a,0xed0,0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x561efe45,0xc163a798,0x1fffedaa,0xda12b3c0,0x51232588,0xface2390,0x651b6e59,0xb190a21d,0x21b0e1b0,0xd816030,0x64b06542,0xa91c8cef,0xd947e0bd,0x961ae27b,0xf20a2a3e,0x50ed0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc163a798561efe45,0xda12b3c01fffedaa,0xface239051232588,0xb190a21d651b6e59,0xd81603021b0e1b0,0xa91c8cef64b06542,0x961ae27bd947e0bd,0x50ed0f20a2a3e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xff6,0x4b77,0xed4e,0x3538,0xc757,0x3304,0xd547,0xc49f,0x801b,0xb2ff,0x4796,0xcad,0x58be,0x969c,0x3e77,0x83e1,0xa371,0x7d43,0x6664,0x3720,0x6c98,0xe4e5,0x74dc,0xebbc,0xaab5,0xc7e0,0x3147,0x5bc9,0x537e,0x7ff5,0xb400,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x4b770ff6,0x3538ed4e,0x3304c757,0xc49fd547,0xb2ff801b,0xcad4796,0x969c58be,0x83e13e77,0x7d43a371,0x37206664,0xe4e56c98,0xebbc74dc,0xc7e0aab5,0x5bc93147,0x7ff5537e,0xcb400}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3538ed4e4b770ff6,0xc49fd5473304c757,0xcad4796b2ff801b,0x83e13e77969c58be,0x372066647d43a371,0xebbc74dce4e56c98,0x5bc93147c7e0aab5,0xcb4007ff5537e}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x77eb,0xce58,0xfaa0,0x429c,0xc7dd,0xbe89,0x68a,0xc196,0xd249,0x63ae,0xa04a,0xbc4e,0xbbb5,0x64ad,0xfc2b,0x4738,0x4d4d,0x918a,0x6b55,0x459d,0xf5ab,0x748c,0x208a,0xfe42,0x21d2,0x3785,0x23d7,0x28cc,0xfd9f,0x106a,0x3406,0xd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xce5877eb,0x429cfaa0,0xbe89c7dd,0xc196068a,0x63aed249,0xbc4ea04a,0x64adbbb5,0x4738fc2b,0x918a4d4d,0x459d6b55,0x748cf5ab,0xfe42208a,0x378521d2,0x28cc23d7,0x106afd9f,0xd3406}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x429cfaa0ce5877eb,0xc196068abe89c7dd,0xbc4ea04a63aed249,0x4738fc2b64adbbb5,0x459d6b55918a4d4d,0xfe42208a748cf5ab,0x28cc23d7378521d2,0xd3406106afd9f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x1bb,0xa9e1,0x5867,0x3e9c,0x1255,0xe000,0x4c3f,0x25ed,0xda77,0xaedc,0xdc6f,0x531,0x91a6,0x9ae4,0x5de2,0x4e6f,0x1e4f,0xde4f,0x9fcf,0xf27e,0x9abd,0x9b4f,0x7310,0x56e3,0x1f42,0x26b8,0x1d84,0x69e5,0xd5c1,0xdf5,0xf12f,0xa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xa9e101bb,0x3e9c5867,0xe0001255,0x25ed4c3f,0xaedcda77,0x531dc6f,0x9ae491a6,0x4e6f5de2,0xde4f1e4f,0xf27e9fcf,0x9b4f9abd,0x56e37310,0x26b81f42,0x69e51d84,0xdf5d5c1,0xaf12f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3e9c5867a9e101bb,0x25ed4c3fe0001255,0x531dc6faedcda77,0x4e6f5de29ae491a6,0xf27e9fcfde4f1e4f,0x56e373109b4f9abd,0x69e51d8426b81f42,0xaf12f0df5d5c1}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf3b3,0x88db,0xd050,0x75f1,0x10dd,0x8cbe,0x97c4,0xe7a2,0xe6ae,0xf1e2,0xd51f,0x8d12,0x55a8,0x6395,0xc98a,0xc097,0x60c3,0x66aa,0x54f3,0x78ce,0x5dce,0x7fb3,0x99a7,0x3e1,0x8753,0x3c9a,0x3339,0x30f3,0x406e,0xc05e,0xc99f,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x88dbf3b3,0x75f1d050,0x8cbe10dd,0xe7a297c4,0xf1e2e6ae,0x8d12d51f,0x639555a8,0xc097c98a,0x66aa60c3,0x78ce54f3,0x7fb35dce,0x3e199a7,0x3c9a8753,0x30f33339,0xc05e406e,0x7c99f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x75f1d05088dbf3b3,0xe7a297c48cbe10dd,0x8d12d51ff1e2e6ae,0xc097c98a639555a8,0x78ce54f366aa60c3,0x3e199a77fb35dce,0x30f333393c9a8753,0x7c99fc05e406e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xbdde,0x1bf3,0x7bc0,0xcae7,0x8d2e,0x58a8,0x4b1a,0xbcb8,0xccd9,0x3d98,0xfcf2,0x4881,0x66f8,0x3473,0x2e8a,0x730d,0xabbf,0x4789,0xdce9,0x58ea,0xf54,0x6169,0x58d0,0x3280,0xe1f9,0x5bd0,0x67a0,0x23d2,0x2611,0x18e1,0xd51f,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1bf3bdde,0xcae77bc0,0x58a88d2e,0xbcb84b1a,0x3d98ccd9,0x4881fcf2,0x347366f8,0x730d2e8a,0x4789abbf,0x58eadce9,0x61690f54,0x328058d0,0x5bd0e1f9,0x23d267a0,0x18e12611,0x7d51f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xcae77bc01bf3bdde,0xbcb84b1a58a88d2e,0x4881fcf23d98ccd9,0x730d2e8a347366f8,0x58eadce94789abbf,0x328058d061690f54,0x23d267a05bd0e1f9,0x7d51f18e12611}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xee54,0xe36f,0x939d,0xea02,0xe6db,0xa7ae,0x9f39,0x8bb3,0x7f02,0xf594,0xa9ab,0xae5e,0x9a76,0x7fc0,0xd9a,0xbecd,0x692d,0x8b68,0x30f4,0xff9a,0xd1ae,0xfd43,0xbdfc,0xc552,0xfe0d,0xa4bf,0x33e5,0x981b,0x202c,0x45e8,0x8573,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe36fee54,0xea02939d,0xa7aee6db,0x8bb39f39,0xf5947f02,0xae5ea9ab,0x7fc09a76,0xbecd0d9a,0x8b68692d,0xff9a30f4,0xfd43d1ae,0xc552bdfc,0xa4bffe0d,0x981b33e5,0x45e8202c,0xc8573}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xea02939de36fee54,0x8bb39f39a7aee6db,0xae5ea9abf5947f02,0xbecd0d9a7fc09a76,0xff9a30f48b68692d,0xc552bdfcfd43d1ae,0x981b33e5a4bffe0d,0xc857345e8202c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc4d,0x7724,0x2faf,0x8a0e,0xef22,0x7341,0x683b,0x185d,0x1951,0xe1d,0x2ae0,0x72ed,0xaa57,0x9c6a,0x3675,0x3f68,0x9f3c,0x9955,0xab0c,0x8731,0xa231,0x804c,0x6658,0xfc1e,0x78ac,0xc365,0xccc6,0xcf0c,0xbf91,0x3fa1,0x3660,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x77240c4d,0x8a0e2faf,0x7341ef22,0x185d683b,0xe1d1951,0x72ed2ae0,0x9c6aaa57,0x3f683675,0x99559f3c,0x8731ab0c,0x804ca231,0xfc1e6658,0xc36578ac,0xcf0cccc6,0x3fa1bf91,0x83660}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8a0e2faf77240c4d,0x185d683b7341ef22,0x72ed2ae00e1d1951,0x3f6836759c6aaa57,0x8731ab0c99559f3c,0xfc1e6658804ca231,0xcf0cccc6c36578ac,0x836603fa1bf91}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x39f7,0x51a0,0x71ea,0x7557,0x794c,0x6b5e,0x6a81,0x9aa7,0xd8dd,0xab85,0xe387,0x2121,0x1086,0x7989,0xe273,0xf813,0xebd5,0xb13f,0x9ef5,0xc6d5,0x2da2,0x14f8,0xecf3,0x24c4,0xf485,0xc8de,0xb9ef,0xb213,0xbc4d,0xe587,0xd591,0xd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x51a039f7,0x755771ea,0x6b5e794c,0x9aa76a81,0xab85d8dd,0x2121e387,0x79891086,0xf813e273,0xb13febd5,0xc6d59ef5,0x14f82da2,0x24c4ecf3,0xc8def485,0xb213b9ef,0xe587bc4d,0xdd591}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x755771ea51a039f7,0x9aa76a816b5e794c,0x2121e387ab85d8dd,0xf813e27379891086,0xc6d59ef5b13febd5,0x24c4ecf314f82da2,0xb213b9efc8def485,0xdd591e587bc4d}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc5d4,0x133f,0xc116,0x2a9e,0xacf5,0xaedd,0x6173,0xdacf,0x6448,0xa33e,0x6d36,0x5013,0x2093,0x59f6,0xe571,0x906d,0x37c9,0xe4ab,0xb92a,0xbe30,0x1d49,0xde58,0xffc8,0x47ff,0xe0cb,0x6230,0x6128,0x8679,0x731c,0xc5e,0x66c7,0xd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x133fc5d4,0x2a9ec116,0xaeddacf5,0xdacf6173,0xa33e6448,0x50136d36,0x59f62093,0x906de571,0xe4ab37c9,0xbe30b92a,0xde581d49,0x47ffffc8,0x6230e0cb,0x86796128,0xc5e731c,0xd66c7}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2a9ec116133fc5d4,0xdacf6173aeddacf5,0x50136d36a33e6448,0x906de57159f62093,0xbe30b92ae4ab37c9,0x47ffffc8de581d49,0x867961286230e0cb,0xd66c70c5e731c}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x55ad,0x2e3e,0xd0dc,0x8dad,0x4e0a,0xe1d0,0x3e27,0x81af,0x1bb4,0xa5fa,0x52f2,0x5bd4,0x2b9b,0xddfe,0x36,0xbdd4,0xf99a,0x3027,0x21d2,0x7b29,0x10ee,0x2146,0x6864,0xec5c,0x6bbd,0x540f,0xbc15,0xe4a1,0xee,0x3d9c,0xdf51,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x2e3e55ad,0x8dadd0dc,0xe1d04e0a,0x81af3e27,0xa5fa1bb4,0x5bd452f2,0xddfe2b9b,0xbdd40036,0x3027f99a,0x7b2921d2,0x214610ee,0xec5c6864,0x540f6bbd,0xe4a1bc15,0x3d9c00ee,0x4df51}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8dadd0dc2e3e55ad,0x81af3e27e1d04e0a,0x5bd452f2a5fa1bb4,0xbdd40036ddfe2b9b,0x7b2921d23027f99a,0xec5c6864214610ee,0xe4a1bc15540f6bbd,0x4df513d9c00ee}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc609,0xae5f,0x8e15,0x8aa8,0x86b3,0x94a1,0x957e,0x6558,0x2722,0x547a,0x1c78,0xdede,0xef79,0x8676,0x1d8c,0x7ec,0x142a,0x4ec0,0x610a,0x392a,0xd25d,0xeb07,0x130c,0xdb3b,0xb7a,0x3721,0x4610,0x4dec,0x43b2,0x1a78,0x2a6e,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xae5fc609,0x8aa88e15,0x94a186b3,0x6558957e,0x547a2722,0xdede1c78,0x8676ef79,0x7ec1d8c,0x4ec0142a,0x392a610a,0xeb07d25d,0xdb3b130c,0x37210b7a,0x4dec4610,0x1a7843b2,0x22a6e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8aa88e15ae5fc609,0x6558957e94a186b3,0xdede1c78547a2722,0x7ec1d8c8676ef79,0x392a610a4ec0142a,0xdb3b130ceb07d25d,0x4dec461037210b7a,0x22a6e1a7843b2}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xfe45,0x561e,0xa798,0xc163,0xedaa,0x1fff,0xb3c0,0xda12,0x2588,0x5123,0x2390,0xface,0x6e59,0x651b,0xa21d,0xb190,0xe1b0,0x21b0,0x6030,0xd81,0x6542,0x64b0,0x8cef,0xa91c,0xe0bd,0xd947,0xe27b,0x961a,0x2a3e,0xf20a,0xed0,0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x561efe45,0xc163a798,0x1fffedaa,0xda12b3c0,0x51232588,0xface2390,0x651b6e59,0xb190a21d,0x21b0e1b0,0xd816030,0x64b06542,0xa91c8cef,0xd947e0bd,0x961ae27b,0xf20a2a3e,0x50ed0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc163a798561efe45,0xda12b3c01fffedaa,0xface239051232588,0xb190a21d651b6e59,0xd81603021b0e1b0,0xa91c8cef64b06542,0x961ae27bd947e0bd,0x50ed0f20a2a3e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xff6,0x4b77,0xed4e,0x3538,0xc757,0x3304,0xd547,0xc49f,0x801b,0xb2ff,0x4796,0xcad,0x58be,0x969c,0x3e77,0x83e1,0xa371,0x7d43,0x6664,0x3720,0x6c98,0xe4e5,0x74dc,0xebbc,0xaab5,0xc7e0,0x3147,0x5bc9,0x537e,0x7ff5,0xb400,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x4b770ff6,0x3538ed4e,0x3304c757,0xc49fd547,0xb2ff801b,0xcad4796,0x969c58be,0x83e13e77,0x7d43a371,0x37206664,0xe4e56c98,0xebbc74dc,0xc7e0aab5,0x5bc93147,0x7ff5537e,0xcb400}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3538ed4e4b770ff6,0xc49fd5473304c757,0xcad4796b2ff801b,0x83e13e77969c58be,0x372066647d43a371,0xebbc74dce4e56c98,0x5bc93147c7e0aab5,0xcb4007ff5537e}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x77eb,0xce58,0xfaa0,0x429c,0xc7dd,0xbe89,0x68a,0xc196,0xd249,0x63ae,0xa04a,0xbc4e,0xbbb5,0x64ad,0xfc2b,0x4738,0x4d4d,0x918a,0x6b55,0x459d,0xf5ab,0x748c,0x208a,0xfe42,0x21d2,0x3785,0x23d7,0x28cc,0xfd9f,0x106a,0x3406,0xd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xce5877eb,0x429cfaa0,0xbe89c7dd,0xc196068a,0x63aed249,0xbc4ea04a,0x64adbbb5,0x4738fc2b,0x918a4d4d,0x459d6b55,0x748cf5ab,0xfe42208a,0x378521d2,0x28cc23d7,0x106afd9f,0xd3406}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x429cfaa0ce5877eb,0xc196068abe89c7dd,0xbc4ea04a63aed249,0x4738fc2b64adbbb5,0x459d6b55918a4d4d,0xfe42208a748cf5ab,0x28cc23d7378521d2,0xd3406106afd9f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x1bb,0xa9e1,0x5867,0x3e9c,0x1255,0xe000,0x4c3f,0x25ed,0xda77,0xaedc,0xdc6f,0x531,0x91a6,0x9ae4,0x5de2,0x4e6f,0x1e4f,0xde4f,0x9fcf,0xf27e,0x9abd,0x9b4f,0x7310,0x56e3,0x1f42,0x26b8,0x1d84,0x69e5,0xd5c1,0xdf5,0xf12f,0xa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xa9e101bb,0x3e9c5867,0xe0001255,0x25ed4c3f,0xaedcda77,0x531dc6f,0x9ae491a6,0x4e6f5de2,0xde4f1e4f,0xf27e9fcf,0x9b4f9abd,0x56e37310,0x26b81f42,0x69e51d84,0xdf5d5c1,0xaf12f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3e9c5867a9e101bb,0x25ed4c3fe0001255,0x531dc6faedcda77,0x4e6f5de29ae491a6,0xf27e9fcfde4f1e4f,0x56e373109b4f9abd,0x69e51d8426b81f42,0xaf12f0df5d5c1}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf9da,0x446d,0xe828,0xbaf8,0x86e,0x465f,0x4be2,0x73d1,0x7357,0xf8f1,0x6a8f,0x4689,0xaad4,0x31ca,0xe4c5,0xe04b,0x3061,0xb355,0x2a79,0x3c67,0xaee7,0xbfd9,0xccd3,0x81f0,0x43a9,0x9e4d,0x999c,0x1879,0x2037,0xe02f,0xe4cf,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x446df9da,0xbaf8e828,0x465f086e,0x73d14be2,0xf8f17357,0x46896a8f,0x31caaad4,0xe04be4c5,0xb3553061,0x3c672a79,0xbfd9aee7,0x81f0ccd3,0x9e4d43a9,0x1879999c,0xe02f2037,0xbe4cf}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbaf8e828446df9da,0x73d14be2465f086e,0x46896a8ff8f17357,0xe04be4c531caaad4,0x3c672a79b3553061,0x81f0ccd3bfd9aee7,0x1879999c9e4d43a9,0xbe4cfe02f2037}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xdeef,0xdf9,0xbde0,0x6573,0x4697,0x2c54,0x258d,0xde5c,0x666c,0x1ecc,0xfe79,0x2440,0xb37c,0x1a39,0x9745,0xb986,0xd5df,0xa3c4,0x6e74,0x2c75,0x87aa,0x30b4,0x2c68,0x9940,0x70fc,0x2de8,0x33d0,0x91e9,0x9308,0x8c70,0xea8f,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdf9deef,0x6573bde0,0x2c544697,0xde5c258d,0x1ecc666c,0x2440fe79,0x1a39b37c,0xb9869745,0xa3c4d5df,0x2c756e74,0x30b487aa,0x99402c68,0x2de870fc,0x91e933d0,0x8c709308,0xbea8f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6573bde00df9deef,0xde5c258d2c544697,0x2440fe791ecc666c,0xb98697451a39b37c,0x2c756e74a3c4d5df,0x99402c6830b487aa,0x91e933d02de870fc,0xbea8f8c709308}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf72a,0xf1b7,0x49ce,0xf501,0x736d,0xd3d7,0xcf9c,0x45d9,0x3f81,0xfaca,0x54d5,0x572f,0x4d3b,0x3fe0,0x86cd,0xdf66,0x3496,0x45b4,0x187a,0x7fcd,0xe8d7,0x7ea1,0x5efe,0xe2a9,0xff06,0xd25f,0x99f2,0x4c0d,0x1016,0xa2f4,0x42b9,0xe}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf1b7f72a,0xf50149ce,0xd3d7736d,0x45d9cf9c,0xfaca3f81,0x572f54d5,0x3fe04d3b,0xdf6686cd,0x45b43496,0x7fcd187a,0x7ea1e8d7,0xe2a95efe,0xd25fff06,0x4c0d99f2,0xa2f41016,0xe42b9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf50149cef1b7f72a,0x45d9cf9cd3d7736d,0x572f54d5faca3f81,0xdf6686cd3fe04d3b,0x7fcd187a45b43496,0xe2a95efe7ea1e8d7,0x4c0d99f2d25fff06,0xe42b9a2f41016}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x627,0xbb92,0x17d7,0x4507,0xf791,0xb9a0,0xb41d,0x8c2e,0x8ca8,0x70e,0x9570,0xb976,0x552b,0xce35,0x1b3a,0x1fb4,0xcf9e,0x4caa,0xd586,0xc398,0x5118,0x4026,0x332c,0x7e0f,0xbc56,0x61b2,0x6663,0xe786,0xdfc8,0x1fd0,0x1b30,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xbb920627,0x450717d7,0xb9a0f791,0x8c2eb41d,0x70e8ca8,0xb9769570,0xce35552b,0x1fb41b3a,0x4caacf9e,0xc398d586,0x40265118,0x7e0f332c,0x61b2bc56,0xe7866663,0x1fd0dfc8,0x41b30}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x450717d7bb920627,0x8c2eb41db9a0f791,0xb9769570070e8ca8,0x1fb41b3ace35552b,0xc398d5864caacf9e,0x7e0f332c40265118,0xe786666361b2bc56,0x41b301fd0dfc8}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x9e37,0x619b,0xa159,0x8865,0xab15,0x85c2,0xb3b,0x57ce,0x8108,0xa8d6,0xfeb0,0x8cf0,0xef13,0xc7e1,0x6936,0xc3a9,0xd8f2,0x9c5d,0x7c68,0x7ba2,0xf4da,0x4c63,0x845b,0x22eb,0xbedd,0x37a0,0x24f3,0x7019,0x2855,0x6905,0xb81c,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x619b9e37,0x8865a159,0x85c2ab15,0x57ce0b3b,0xa8d68108,0x8cf0feb0,0xc7e1ef13,0xc3a96936,0x9c5dd8f2,0x7ba27c68,0x4c63f4da,0x22eb845b,0x37a0bedd,0x701924f3,0x69052855,0x3b81c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8865a159619b9e37,0x57ce0b3b85c2ab15,0x8cf0feb0a8d68108,0xc3a96936c7e1ef13,0x7ba27c689c5dd8f2,0x22eb845b4c63f4da,0x701924f337a0bedd,0x3b81c69052855}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x92b5,0x1309,0xc1ee,0xadd1,0x165,0x4911,0xaf0c,0x4a4f,0x5374,0xd4b2,0x926f,0xacc0,0xfd2f,0xeb63,0x7c68,0xc188,0x41ce,0x152e,0x6cfe,0x9a22,0xadb,0x933,0x438c,0x5fef,0xe17a,0x82aa,0x7732,0x8c5b,0xfa7b,0x4cd4,0xdcee,0x6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x130992b5,0xadd1c1ee,0x49110165,0x4a4faf0c,0xd4b25374,0xacc0926f,0xeb63fd2f,0xc1887c68,0x152e41ce,0x9a226cfe,0x9330adb,0x5fef438c,0x82aae17a,0x8c5b7732,0x4cd4fa7b,0x6dcee}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xadd1c1ee130992b5,0x4a4faf0c49110165,0xacc0926fd4b25374,0xc1887c68eb63fd2f,0x9a226cfe152e41ce,0x5fef438c09330adb,0x8c5b773282aae17a,0x6dcee4cd4fa7b}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x77b7,0xc00c,0x743e,0x91b3,0xc92c,0x3be,0xc9e8,0x4b6b,0x519c,0xed1b,0x857f,0x2be7,0x2270,0x64a0,0x3a21,0xd5ec,0xd5d1,0x2392,0x175a,0xa58f,0x5c36,0x3908,0x5f46,0x1875,0xee40,0xcd4a,0x7e0b,0x8eda,0x87e0,0xc28c,0x6e24,0xd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc00c77b7,0x91b3743e,0x3bec92c,0x4b6bc9e8,0xed1b519c,0x2be7857f,0x64a02270,0xd5ec3a21,0x2392d5d1,0xa58f175a,0x39085c36,0x18755f46,0xcd4aee40,0x8eda7e0b,0xc28c87e0,0xd6e24}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x91b3743ec00c77b7,0x4b6bc9e803bec92c,0x2be7857fed1b519c,0xd5ec3a2164a02270,0xa58f175a2392d5d1,0x18755f4639085c36,0x8eda7e0bcd4aee40,0xd6e24c28c87e0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x61c9,0x9e64,0x5ea6,0x779a,0x54ea,0x7a3d,0xf4c4,0xa831,0x7ef7,0x5729,0x14f,0x730f,0x10ec,0x381e,0x96c9,0x3c56,0x270d,0x63a2,0x8397,0x845d,0xb25,0xb39c,0x7ba4,0xdd14,0x4122,0xc85f,0xdb0c,0x8fe6,0xd7aa,0x96fa,0x47e3,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9e6461c9,0x779a5ea6,0x7a3d54ea,0xa831f4c4,0x57297ef7,0x730f014f,0x381e10ec,0x3c5696c9,0x63a2270d,0x845d8397,0xb39c0b25,0xdd147ba4,0xc85f4122,0x8fe6db0c,0x96fad7aa,0xc47e3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x779a5ea69e6461c9,0xa831f4c47a3d54ea,0x730f014f57297ef7,0x3c5696c9381e10ec,0x845d839763a2270d,0xdd147ba4b39c0b25,0x8fe6db0cc85f4122,0xc47e396fad7aa}}} +#endif +}}}}; diff --git a/src/precomp/ref/lvl5/hd_splitting_transforms.c b/src/precomp/ref/lvl5/hd_splitting_transforms.c new file mode 100644 index 0000000..a697ac7 --- /dev/null +++ b/src/precomp/ref/lvl5/hd_splitting_transforms.c @@ -0,0 +1,143 @@ +#include + +#define FP2_ZERO 0 +#define FP2_ONE 1 +#define FP2_I 2 +#define FP2_MINUS_ONE 3 +#define FP2_MINUS_I 4 + +const int EVEN_INDEX[10][2] = {{0, 0}, {0, 1}, {0, 2}, {0, 3}, {1, 0}, {1, 2}, {2, 0}, {2, 1}, {3, 0}, {3, 3}}; +const int CHI_EVAL[4][4] = {{1, 1, 1, 1}, {1, -1, 1, -1}, {1, 1, -1, -1}, {1, -1, -1, 1}}; +const fp2_t FP2_CONSTANTS[5] = {{ +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x1ffb, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1bf} +#elif RADIX == 32 +{0x1ffda12f, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x57f} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xffffffffffffff68, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0x7fffffffffffff} +#else +{0x1fffffffffffed0, 0x1ffffffffffffff, 0x1ffffffffffffff, 0x1ffffffffffffff, 0x1ffffffffffffff, 0x1ffffffffffffff, 0x1ffffffffffffff, 0x1ffffffffffffff, 0xffffffffffff} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1ffb, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1bf} +#elif RADIX == 32 +{0x1ffda12f, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x57f} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xffffffffffffff68, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0x7fffffffffffff} +#else +{0x1fffffffffffed0, 0x1ffffffffffffff, 0x1ffffffffffffff, 0x1ffffffffffffff, 0x1ffffffffffffff, 0x1ffffffffffffff, 0x1ffffffffffffff, 0x1ffffffffffffff, 0xffffffffffff} +#endif +#endif +}}; +const precomp_basis_change_matrix_t SPLITTING_TRANSFORMS[10] = {{{{FP2_ONE, FP2_I, FP2_ONE, FP2_I}, {FP2_ONE, FP2_MINUS_I, FP2_MINUS_ONE, FP2_I}, {FP2_ONE, FP2_I, FP2_MINUS_ONE, FP2_MINUS_I}, {FP2_MINUS_ONE, FP2_I, FP2_MINUS_ONE, FP2_I}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_MINUS_ONE, FP2_ZERO, FP2_ZERO}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}, {FP2_ZERO, FP2_ZERO, FP2_MINUS_ONE, FP2_ZERO}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_MINUS_ONE}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE}, {FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_ONE}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_ONE}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE}, {FP2_MINUS_ONE, FP2_ONE, FP2_ONE, FP2_MINUS_ONE}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}}}}; +const precomp_basis_change_matrix_t NORMALIZATION_TRANSFORMS[6] = {{{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}}}, {{{FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}}}, {{{FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_ONE}, {FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}}}, {{{FP2_MINUS_ONE, FP2_I, FP2_I, FP2_ONE}, {FP2_I, FP2_MINUS_ONE, FP2_ONE, FP2_I}, {FP2_I, FP2_ONE, FP2_MINUS_ONE, FP2_I}, {FP2_ONE, FP2_I, FP2_I, FP2_MINUS_ONE}}}, {{{FP2_ONE, FP2_I, FP2_I, FP2_MINUS_ONE}, {FP2_I, FP2_ONE, FP2_MINUS_ONE, FP2_I}, {FP2_I, FP2_MINUS_ONE, FP2_ONE, FP2_I}, {FP2_MINUS_ONE, FP2_I, FP2_I, FP2_ONE}}}}; diff --git a/src/precomp/ref/lvl5/include/e0_basis.h b/src/precomp/ref/lvl5/include/e0_basis.h new file mode 100644 index 0000000..05cafb8 --- /dev/null +++ b/src/precomp/ref/lvl5/include/e0_basis.h @@ -0,0 +1,3 @@ +#include +extern const fp2_t BASIS_E0_PX; +extern const fp2_t BASIS_E0_QX; diff --git a/src/precomp/ref/lvl5/include/ec_params.h b/src/precomp/ref/lvl5/include/ec_params.h index e55c08c..9f2aca3 100644 --- a/src/precomp/ref/lvl5/include/ec_params.h +++ b/src/precomp/ref/lvl5/include/ec_params.h @@ -1,76 +1,12 @@ #ifndef EC_PARAMS_H #define EC_PARAMS_H -#define POWER_OF_2 145 -#define POWER_OF_3 72 +#include -static digit_t TWOpF[NWORDS_ORDER] = {0x0, 0x0, 0x20000, 0x0, 0x0, 0x0, 0x0, 0x0}; // 2^g -static digit_t TWOpFm1[NWORDS_ORDER] = {0x0, 0x0, 0x10000, 0x0, 0x0, 0x0, 0x0, 0x0}; // 2^(g-1) -static digit_t THREEpE[NWORDS_ORDER] = {0x2153E468B91C6D1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; // 3^e -static digit_t THREEpF[NWORDS_ORDER] = {0x1E679735C929F6A1, 0x000456BC60E76C11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; // 3^f -static digit_t THREEpFdiv2[NWORDS_ORDER] = {0x8F33CB9AE494FB50, 0x00022B5E3073B608, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; // Floor(3^f/2) +#define TORSION_EVEN_POWER 500 -#define scaled 1 // unscaled (0) or scaled (1) remainder tree approach -#define gap 83 +// p+1 divided by the power of 2 +extern const digit_t p_cofactor_for_2f[1]; +#define P_COFACTOR_FOR_2F_BITLENGTH 5 -#define P_LEN 7 -#define M_LEN 27 - -static long p_plus_minus_bitlength[P_LEN + M_LEN] ={ - 2, 4, 6, 7, 7, 9, 10, 3, 3, 5, 6, 6, 7, 7, 8, 10, - 10, 10, 10, 12, 13, 13, 13, 14, 14, 14, 14, 14, - 15, 15, 16, 16, 16, 19 -}; - -static digit_t p_cofactor_for_2f[6] = { - 0xBA674CA63456D371, - 0xF532FD78514D3C0C, - 0x3E80FF1D62C82506, - 0x73C9015EDF319328, - 0x4DE3460AD801B49B, - 0x00000012ACA35443 -}; -#define P_COFACTOR_FOR_2F_BITLENGTH 357 - -static digit_t p_cofactor_for_3g[7] = { - 0x0000000000000000, - 0x0000000000000000, - 0x0F469D6875A20000, - 0x10CAFA623AD43E00, - 0x27F3E11532C58F78, - 0x9BA98880DA1DC006, - 0x0000000000000008 - -}; - -#define P_COFACTOR_FOR_3G_BITLENGTH 388 - - -static digit_t p_cofactor_for_6fg[4] = { - 0x1F0007A34EB43AD1, - 0xC7BC08657D311D6A, - 0xE00313F9F08A9962, - 0x00044DD4C4406D0E -}; -#define P_COFACTOR_FOR_6FG_BITLENGTH 243 - -static int STRATEGY4[71] = { 28, 16, 11, 7, 4, 2, 1, 1, 1, 2, 1, 1, 3, 2, 1, 1, 1, 1, 4, 3, 2, 1, 1, 1, 1, 2, 1, 1, 7, 4, 2, 1, 1, 1, 2, 1, 1, 3, 2, 1, 1, 1, 1, 12, 7, 4, 2, 1, 1, 1, 2, 1, 1, 3, 2, 1, 1, 1, 1, 5, 3, 2, 1, 1, 1, 1, 2, 1, 1, 1}; - -static int sizeI[P_LEN+M_LEN] = { - 0, 3, 3, 4, 6, 11, 14, 1, 1, 2, 3, 4, 4, 6, 6, 13, 14, 14, 18, 26, 32, 38, 48, 54, 60, 62, 62, 64, 72, 92, 118, 126, 130, 310 -}; -static int sizeJ[P_LEN+M_LEN] = { - 0, 1, 3, 4, 4, 10, 14, 1, 1, 2, 3, 3, 4, 5, 6, 12, 13, 13, 14, 24, 32, 33, 37, 49, 56, 60, 62, 62, 64, 63, 102, 125, 126, 256 -}; -static int sizeK[P_LEN+M_LEN] = { - 1, 0, 2, 1, 3, 10, 21, 0, 1, 0, 0, 2, 4, 3, 3, 9, 2, 5, 0, 21, 28, 21, 11, 6, 75, 21, 82, 59, 75, 21, 21, 123, 0, 396 -}; - -#define sI_max 310 -#define sJ_max 256 -#define sK_max 396 - -#define ceil_log_sI_max 9 -#define ceil_log_sJ_max 9 - -#endif \ No newline at end of file +#endif diff --git a/src/precomp/ref/lvl5/include/encoded_sizes.h b/src/precomp/ref/lvl5/include/encoded_sizes.h index 4a20d87..3aafb0d 100644 --- a/src/precomp/ref/lvl5/include/encoded_sizes.h +++ b/src/precomp/ref/lvl5/include/encoded_sizes.h @@ -1,14 +1,11 @@ +#define SECURITY_BITS 256 +#define SQIsign_response_length 253 +#define HASH_ITERATIONS 512 +#define FP_ENCODED_BYTES 64 #define FP2_ENCODED_BYTES 128 #define EC_CURVE_ENCODED_BYTES 128 #define EC_POINT_ENCODED_BYTES 128 #define EC_BASIS_ENCODED_BYTES 384 -#define CHAIN_LENGTH 9 -#define QUAT_ALG_ELEM_ENCODED_BITS 771 -#define QUAT_ALG_ELEM_ENCODED_BYTES 97 -#define ID2ISO_LONG_TWO_ISOG_ENCODED_BYTES 2322 -#define ZIP_CHAIN_LEN 14 -#define ID2ISO_COMPRESSED_LONG_TWO_ISOG_ZIP_CHAIN_BYTES 19 -#define ID2ISO_COMPRESSED_LONG_TWO_ISOG_BYTES 267 -#define SIGNATURE_LEN 335 -#define PUBLICKEY_BYTES 128 -#define SECRETKEY_BYTES 1509 +#define PUBLICKEY_BYTES 129 +#define SECRETKEY_BYTES 701 +#define SIGNATURE_BYTES 292 diff --git a/src/precomp/ref/lvl5/include/endomorphism_action.h b/src/precomp/ref/lvl5/include/endomorphism_action.h index f5397aa..1cc782a 100644 --- a/src/precomp/ref/lvl5/include/endomorphism_action.h +++ b/src/precomp/ref/lvl5/include/endomorphism_action.h @@ -1,19 +1,31 @@ -#include +#ifndef ENDOMORPHISM_ACTION_H +#define ENDOMORPHISM_ACTION_H +#include #include #include -extern const ec_basis_t BASIS_EVEN; -extern const ec_basis_t BASIS_ODD_PLUS; -extern const ec_basis_t BASIS_ODD_MINUS; -extern const ec_basis_t BASIS_COMMITMENT_PLUS; -extern const ec_basis_t BASIS_COMMITMENT_MINUS; -extern const ec_basis_t BASIS_CHALLENGE; -extern const ec_curve_t CURVE_E0; -extern const ec_point_t CURVE_E0_A24; -extern const ibz_mat_2x2_t ACTION_I; -extern const ibz_mat_2x2_t ACTION_J; -extern const ibz_mat_2x2_t ACTION_K; -extern const ibz_mat_2x2_t ACTION_GEN2; -extern const ibz_mat_2x2_t ACTION_GEN3; -extern const ibz_mat_2x2_t ACTION_GEN4; -extern const quat_alg_elem_t COMMITMENT_IDEAL_UNDISTORTED_GEN; -extern const quat_alg_elem_t COMMITMENT_IDEAL_DISTORTION_ENDO; +/** Type for precomputed endomorphism rings applied to precomputed torsion bases. + * + * Precomputed by the precompute scripts. + * + * @typedef curve_with_endomorphism_ring_t + * + * @struct curve_with_endomorphism_ring + **/ +typedef struct curve_with_endomorphism_ring { + ec_curve_t curve; + ec_basis_t basis_even; + ibz_mat_2x2_t action_i, action_j, action_k; + ibz_mat_2x2_t action_gen2, action_gen3, action_gen4; +} curve_with_endomorphism_ring_t; +#define CURVE_E0 (CURVES_WITH_ENDOMORPHISMS->curve) +#define BASIS_EVEN (CURVES_WITH_ENDOMORPHISMS->basis_even) +#define ACTION_I (CURVES_WITH_ENDOMORPHISMS->action_i) +#define ACTION_J (CURVES_WITH_ENDOMORPHISMS->action_j) +#define ACTION_K (CURVES_WITH_ENDOMORPHISMS->action_k) +#define ACTION_GEN2 (CURVES_WITH_ENDOMORPHISMS->action_gen2) +#define ACTION_GEN3 (CURVES_WITH_ENDOMORPHISMS->action_gen3) +#define ACTION_GEN4 (CURVES_WITH_ENDOMORPHISMS->action_gen4) +#define NUM_ALTERNATE_STARTING_CURVES 6 +#define ALTERNATE_STARTING_CURVES (CURVES_WITH_ENDOMORPHISMS+1) +extern const curve_with_endomorphism_ring_t CURVES_WITH_ENDOMORPHISMS[7]; +#endif diff --git a/src/precomp/ref/lvl5/include/fp_constants.h b/src/precomp/ref/lvl5/include/fp_constants.h index 93fee43..094cb4d 100644 --- a/src/precomp/ref/lvl5/include/fp_constants.h +++ b/src/precomp/ref/lvl5/include/fp_constants.h @@ -1,4 +1,17 @@ +#if RADIX == 32 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +#define NWORDS_FIELD 16 +#else +#define NWORDS_FIELD 18 +#endif +#define NWORDS_ORDER 16 +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) #define NWORDS_FIELD 8 -#define NWORDS_ORDER 8 +#else +#define NWORDS_FIELD 9 +#endif +#define NWORDS_ORDER 8 +#endif #define BITS 512 -#define LOG2P 9 \ No newline at end of file +#define LOG2P 9 diff --git a/src/precomp/ref/lvl5/include/hd_splitting_transforms.h b/src/precomp/ref/lvl5/include/hd_splitting_transforms.h new file mode 100644 index 0000000..b3147a4 --- /dev/null +++ b/src/precomp/ref/lvl5/include/hd_splitting_transforms.h @@ -0,0 +1,18 @@ +#ifndef HD_SPLITTING_H +#define HD_SPLITTING_H + +#include +#include + +typedef struct precomp_basis_change_matrix { + uint8_t m[4][4]; +} precomp_basis_change_matrix_t; + +extern const int EVEN_INDEX[10][2]; +extern const int CHI_EVAL[4][4]; +extern const fp2_t FP2_CONSTANTS[5]; +extern const precomp_basis_change_matrix_t SPLITTING_TRANSFORMS[10]; +extern const precomp_basis_change_matrix_t NORMALIZATION_TRANSFORMS[6]; + +#endif + diff --git a/src/precomp/ref/lvl5/include/klpt_constants.h b/src/precomp/ref/lvl5/include/klpt_constants.h deleted file mode 100644 index 6895c42..0000000 --- a/src/precomp/ref/lvl5/include/klpt_constants.h +++ /dev/null @@ -1,27 +0,0 @@ -#include -#define KLPT_equiv_bound_coeff 7 -#define KLPT_equiv_num_iter 50625 -#define KLPT_primality_num_iter 32 -#define KLPT_signing_klpt_length 2030 -#define KLPT_signing_num_gamma_trial 64 -#define KLPT_gamma_exponent_interval_size 0 -#define KLPT_gamma_exponent_center_shift 15 -#define KLPT_repres_num_gamma_trial 32768 -#define KLPT_signing_number_strong_approx 6784 -#define KLPT_random_prime_attempts 64 -#define KLPT_secret_key_prime_size 126 -#define KLPT_keygen_length 1305 -#define KLPT_keygen_num_gamma_trial 64 -#define KLPT_eichler_smallnorm_bitsize 225 -#define KLPT_keygen_number_strong_approx 5218 -#define KLPT_eichler_number_mu_norm 13 -#define KLPT_eichler_strong_approx_log_margin 2 -#define KLPT_eichler_num_equiv_ideal 51 -#define KLPT_eichler_number_strong_approx 5020 -#define SQISIGN_response_attempts 64 -#define SQISIGN_random_length 0 -#define SQISIGN_signing_total_length 2030 -#define SQISIGN_signing_length 14 -#define SQISIGN_keygen_length 9 -extern const short SMALL_PRIMES_1MOD4[11]; -extern const ibz_t PROD_SMALL_PRIMES_3MOD4; diff --git a/src/precomp/ref/lvl5/include/quaternion_constants.h b/src/precomp/ref/lvl5/include/quaternion_constants.h new file mode 100644 index 0000000..a2f4b52 --- /dev/null +++ b/src/precomp/ref/lvl5/include/quaternion_constants.h @@ -0,0 +1,6 @@ +#include +#define QUAT_primality_num_iter 32 +#define QUAT_repres_bound_input 21 +#define QUAT_equiv_bound_coeff 64 +#define FINDUV_box_size 3 +#define FINDUV_cube_size 2400 diff --git a/src/precomp/ref/lvl5/include/quaternion_data.h b/src/precomp/ref/lvl5/include/quaternion_data.h index c3de3e1..a5eb110 100644 --- a/src/precomp/ref/lvl5/include/quaternion_data.h +++ b/src/precomp/ref/lvl5/include/quaternion_data.h @@ -1,7 +1,12 @@ -#include #include -#define NUM_ALTERNATE_EXTREMAL_ORDERS 7 +#define MAXORD_O0 (EXTREMAL_ORDERS->order) +#define STANDARD_EXTREMAL_ORDER (EXTREMAL_ORDERS[0]) +#define NUM_ALTERNATE_EXTREMAL_ORDERS 6 +#define ALTERNATE_EXTREMAL_ORDERS (EXTREMAL_ORDERS+1) +#define ALTERNATE_CONNECTING_IDEALS (CONNECTING_IDEALS+1) +#define ALTERNATE_CONJUGATING_ELEMENTS (CONJUGATING_ELEMENTS+1) +extern const ibz_t QUAT_prime_cofactor; extern const quat_alg_t QUATALG_PINFTY; -extern const quat_order_t MAXORD_O0; -extern const quat_p_extremal_maximal_order_t STANDARD_EXTREMAL_ORDER; -extern const quat_p_extremal_maximal_order_t ALTERNATE_EXTREMAL_ORDERS[7]; +extern const quat_p_extremal_maximal_order_t EXTREMAL_ORDERS[7]; +extern const quat_left_ideal_t CONNECTING_IDEALS[7]; +extern const quat_alg_elem_t CONJUGATING_ELEMENTS[7]; diff --git a/src/precomp/ref/lvl5/include/torsion_constants.h b/src/precomp/ref/lvl5/include/torsion_constants.h index e479113..363f86e 100644 --- a/src/precomp/ref/lvl5/include/torsion_constants.h +++ b/src/precomp/ref/lvl5/include/torsion_constants.h @@ -1,24 +1,6 @@ -#include -#define TORSION_2POWER_BYTES 19 -#define TORSION_3POWER_BYTES 15 -#define TORSION_23POWER_BYTES 33 -extern const uint64_t TORSION_PLUS_EVEN_POWER; -extern const uint64_t TORSION_ODD_PRIMES[34]; -extern const uint64_t TORSION_ODD_POWERS[34]; -extern const uint64_t TORSION_PLUS_ODD_PRIMES[7]; -extern const size_t TORSION_PLUS_ODD_POWERS[7]; -extern const uint64_t TORSION_MINUS_ODD_PRIMES[27]; -extern const size_t TORSION_MINUS_ODD_POWERS[27]; -extern const size_t DEGREE_COMMITMENT_POWERS[34]; -extern const ibz_t CHARACTERISTIC; -extern const ibz_t TORSION_ODD; -extern const ibz_t TORSION_ODD_PRIMEPOWERS[34]; -extern const ibz_t TORSION_ODD_PLUS; -extern const ibz_t TORSION_ODD_MINUS; +#include +#define TORSION_2POWER_BYTES 63 +extern const ibz_t TWO_TO_SECURITY_BITS; extern const ibz_t TORSION_PLUS_2POWER; -extern const ibz_t TORSION_PLUS_3POWER; -extern const ibz_t TORSION_PLUS_23POWER; -extern const ibz_t DEGREE_COMMITMENT; -extern const ibz_t DEGREE_COMMITMENT_PLUS; -extern const ibz_t DEGREE_COMMITMENT_MINUS; -extern const ibz_t DEGREE_CHALLENGE; +extern const ibz_t SEC_DEGREE; +extern const ibz_t COM_DEGREE; diff --git a/src/precomp/ref/lvl5/klpt_constants.c b/src/precomp/ref/lvl5/klpt_constants.c deleted file mode 100644 index 3358164..0000000 --- a/src/precomp/ref/lvl5/klpt_constants.c +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include -#include -#if 0 -#elif 8*DIGIT_LEN == 16 -const short SMALL_PRIMES_1MOD4[11] = {0x5, 0xd, 0x11, 0x1d, 0x25, 0x29, 0x35, 0x3d, 0x49, 0x59, 0x61}; -const ibz_t PROD_SMALL_PRIMES_3MOD4 = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x173b,0x80bd,0xa9d7,0xa185}}}; -#elif 8*DIGIT_LEN == 32 -const short SMALL_PRIMES_1MOD4[11] = {0x5, 0xd, 0x11, 0x1d, 0x25, 0x29, 0x35, 0x3d, 0x49, 0x59, 0x61}; -const ibz_t PROD_SMALL_PRIMES_3MOD4 = {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x80bd173b,0xa185a9d7}}}; -#elif 8*DIGIT_LEN == 64 -const short SMALL_PRIMES_1MOD4[11] = {0x5, 0xd, 0x11, 0x1d, 0x25, 0x29, 0x35, 0x3d, 0x49, 0x59, 0x61}; -const ibz_t PROD_SMALL_PRIMES_3MOD4 = {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xa185a9d780bd173b}}}; -#endif diff --git a/src/precomp/ref/lvl5/quaternion_data.c b/src/precomp/ref/lvl5/quaternion_data.c index 2db9959..98b7924 100644 --- a/src/precomp/ref/lvl5/quaternion_data.c +++ b/src/precomp/ref/lvl5/quaternion_data.c @@ -1,20 +1,3176 @@ #include #include #include +const ibz_t QUAT_prime_cofactor = #if 0 -#elif 8*DIGIT_LEN == 16 -const quat_alg_t QUATALG_PINFTY = {{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xa6e1,0x68ad,0x994c,0x74ce,0x7819,0xa29a,0xfaf0,0xea65,0x4a0d,0xc590,0xfe3a,0x7d01,0x2650,0xbe63,0x2bd,0xe792,0x6936,0xb003,0x8c15,0x9bc6,0xa886,0x5946,0x25}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xa6e1,0x68ad,0x994c,0x74ce,0x7819,0xa29a,0xfaf0,0xea65,0x4a0d,0xc590,0xfe3a,0x7d01,0x2650,0xbe63,0x2bd,0xe792,0x6936,0xb003,0x8c15,0x9bc6,0xa886,0x5946,0x25}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xa6e1,0x68ad,0x994c,0x74ce,0x7819,0xa29a,0xfaf0,0xea65,0x4a0d,0xc590,0xfe3a,0x7d01,0x2650,0xbe63,0x2bd,0xe792,0x6936,0xb003,0x8c15,0x9bc6,0xa886,0x5946,0x25}}}}}}; -const quat_order_t MAXORD_O0 = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}; -const quat_p_extremal_maximal_order_t STANDARD_EXTREMAL_ORDER = {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1}; -const quat_p_extremal_maximal_order_t ALTERNATE_EXTREMAL_ORDERS[7] = {{{{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x780,0x54c4,0xe2ea,0x6e86,0xa092,0x7b62,0xeb6f,0x9605,0x30bc,0x6611,0x2837,0xcd8d,0x6686,0xdabf,0x68e4,0x83a}}}, {{{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x780,0x54c4,0xe2ea,0x6e86,0xa092,0x7b62,0xeb6f,0x9605,0x30bc,0x6611,0x2837,0xcd8d,0x6686,0xdabf,0x68e4,0x83a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3c0,0x2a62,0x7175,0x3743,0x5049,0xbdb1,0xf5b7,0x4b02,0x985e,0xb308,0x941b,0x66c6,0xb343,0x6d5f,0x3472,0x41d}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3c0,0x2a62,0x7175,0x3743,0x5049,0xbdb1,0xf5b7,0x4b02,0x985e,0xb308,0x941b,0x66c6,0xb343,0x6d5f,0x3472,0x41d}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x2000,0xbe1c,0x7883,0x84d6,0x2ae9,0x1722,0x5ace,0xbc6c,0x5342,0x16a,0x1f2e,0xf43f,0x8bbd,0x7982,0x65b,0x671f,0x3c44,0x583c,0x9c8d,0x7183,0x4b9b,0x194f,0xcbb8,0x2934,0x662d,0x1ff1,0x53a9,0x628a,0xe9ba,0x2c,0xd9f1,0x21}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x1000,0xdf0e,0x3c41,0xc26b,0x1574,0xb91,0x2d67,0x5e36,0x29a1,0xb5,0x8f97,0xfa1f,0x45de,0xbcc1,0x832d,0x338f,0x1e22,0xac1e,0xce46,0xb8c1,0xa5cd,0xca7,0x65dc,0x949a,0xb316,0x8ff8,0x29d4,0x3145,0x74dd,0x8016,0xecf8,0x10}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x3801,0x1391,0x8f27,0xb895,0x4f80,0x6227,0x2267,0xb3c0,0xed3e,0x55f1,0x5e39,0x2853,0x2d84,0xf483,0xec50,0x6374,0x3c44,0x583c,0x9c8d,0x7183,0x4b9b,0x194f,0xcbb8,0x2934,0x662d,0x1ff1,0x53a9,0x628a,0xe9ba,0x2c,0xd9f1,0x21}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3c0,0x2a62,0x7175,0x3743,0x5049,0xbdb1,0xf5b7,0x4b02,0x985e,0xb308,0x941b,0x66c6,0xb343,0x6d5f,0x3472,0x41d}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x780,0x54c4,0xe2ea,0x6e86,0xa092,0x7b62,0xeb6f,0x9605,0x30bc,0x6611,0x2837,0xcd8d,0x6686,0xdabf,0x68e4,0x83a}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xcffe,0x5515,0xd2b9,0x9881,0xb6d1,0x69f5,0x70cd,0x1158,0xcc08,0x56f0,0x81e9,0x97d7,0xbc73,0x9fe,0x3415,0x754}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x3}, {{{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x79d8,0xa418,0x41f3,0xf4dc,0x43,0x4f00,0xdcbc,0x38cd,0x4762,0x1b84,0x2da8,0x879c,0x5f56,0xa12d,0x407d,0xe5b}}}, {{{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x79d8,0xa418,0x41f3,0xf4dc,0x43,0x4f00,0xdcbc,0x38cd,0x4762,0x1b84,0x2da8,0x879c,0x5f56,0xa12d,0x407d,0xe5b}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3cec,0xd20c,0x20f9,0xfa6e,0x21,0x2780,0xee5e,0x1c66,0x23b1,0xdc2,0x16d4,0x43ce,0xafab,0xd096,0xa03e,0x72d}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf320,0xe93e,0x2f41,0x4463,0xd4d,0x88af,0x389a,0x970a,0x2041,0x6587,0x4c38,0xd00c,0xe51f,0xebb9,0x99dc,0x9107,0x91df,0x338d,0xff0a,0xb41c,0x9d14,0x1ae6,0xa7f5,0xa7a3,0x1000,0x6e2f,0xfb25,0x5ce6,0x4d76,0x5398,0xdca,0x67}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x9fe1,0x3429,0x7833,0x9ffd,0x67d7,0xeceb,0x1c64,0x915,0xe876,0x71d9,0xfcf9,0x8499,0xeb89,0xa049,0x6f47,0xd594,0xa0bf,0xae38,0xff9d,0xae71,0xd86e,0x3df5,0xa995,0xa974,0x666,0x5f46,0x6475,0x585c,0x522f,0x54a3,0x38b7,0x29}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3cec,0xd20c,0x20f9,0xfa6e,0x21,0x2780,0xee5e,0x1c66,0x23b1,0xdc2,0x16d4,0x43ce,0xafab,0xd096,0xa03e,0x72d}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x79d8,0xa418,0x41f3,0xf4dc,0x43,0x4f00,0xdcbc,0x38cd,0x4762,0x1b84,0x2da8,0x879c,0x5f56,0xa12d,0x407d,0xe5b}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0x3925,0x3252,0xfa7c,0x972c,0xec9b,0x8f3a,0x1cc3,0xff55,0x49ca,0x6e33,0x586e,0xf6e9,0xcf6f,0x49fd,0xf8ac,0x9d6}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x5}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x5}, {{{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x519e,0x3adc,0x1d00,0x1db9,0x2ac3,0x29ff,0xfd89,0xbeaf,0xe910,0xd574,0x1469,0xd70d,0x439,0x81ba,0xefbb,0x3fa6}}}, {{{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x519e,0x3adc,0x1d00,0x1db9,0x2ac3,0x29ff,0xfd89,0xbeaf,0xe910,0xd574,0x1469,0xd70d,0x439,0x81ba,0xefbb,0x3fa6}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x28cf,0x1d6e,0x8e80,0x8edc,0x9561,0x94ff,0xfec4,0x5f57,0x7488,0xeaba,0x8a34,0xeb86,0x21c,0xc0dd,0x77dd,0x1fd3}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xaec2,0xfcca,0x2f4b,0xdd31,0x1c7a,0x1312,0x9a21,0xbcb7,0xf69e,0xd9e6,0x1c01,0x1382,0x9d48,0x7a41,0x25b,0xc4d3,0xf24b,0x1bb7,0x2dd5,0x9c44,0xbf2,0x4deb,0x8688,0x6bc9,0xab70,0xcc31,0x403c,0x71f,0xb871,0x8c2,0xcb6d,0x7e9}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x5761,0xfe65,0x97a5,0x6e98,0xe3d,0x8989,0xcd10,0x5e5b,0x7b4f,0xecf3,0xe00,0x9c1,0xcea4,0xbd20,0x812d,0xe269,0xf925,0x8ddb,0x16ea,0x4e22,0x85f9,0x26f5,0xc344,0x35e4,0xd5b8,0x6618,0xa01e,0x838f,0x5c38,0x8461,0xe5b6,0x3f4}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x674a,0xd5f0,0xad5b,0x7b20,0x76dd,0x4113,0x9ab1,0xc6be,0xaaac,0xe16,0xbbb7,0xf256,0xeeb,0x3e83,0x7a9c,0x4ef8,0xfb04,0x389f,0x3f36,0x95ea,0xd5cc,0xedc9,0x19a5,0x9b8f,0x2711,0x46f,0x8bb9,0xbcc5,0xceb4,0x6046,0xa710,0x2e0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x28cf,0x1d6e,0x8e80,0x8edc,0x9561,0x94ff,0xfec4,0x5f57,0x7488,0xeaba,0x8a34,0xeb86,0x21c,0xc0dd,0x77dd,0x1fd3}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x519e,0x3adc,0x1d00,0x1db9,0x2ac3,0x29ff,0xfd89,0xbeaf,0xe910,0xd574,0x1469,0xd70d,0x439,0x81ba,0xefbb,0x3fa6}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6a4c,0x7c53,0x6b84,0xab45,0x5331,0xff1b,0x7a32,0x2ea4,0xf5e3,0x66ba,0x41ac,0x3763,0x5e06,0x8d36,0x7691,0xa2c2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x16}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xb}, {{{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc18c,0xc160,0x3367,0x784a,0x9d9a,0xfb08,0xda65,0x6b9,0x53ab,0xb83a,0x9ed1,0x5144,0xaed8,0xe628,0x7ad7,0x1b6}}}, {{{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc18c,0xc160,0x3367,0x784a,0x9d9a,0xfb08,0xda65,0x6b9,0x53ab,0xb83a,0x9ed1,0x5144,0xaed8,0xe628,0x7ad7,0x1b6}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x60c6,0xe0b0,0x19b3,0x3c25,0x4ecd,0xfd84,0xed32,0x835c,0x29d5,0xdc1d,0x4f68,0x28a2,0x576c,0xf314,0x3d6b,0xdb}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x3248,0x69aa,0x4787,0x6ffe,0xcb76,0x7f13,0xdde2,0x266d,0x3fad,0xcef1,0x1634,0xcc80,0xec10,0xb929,0x6036,0xdf7f,0xd572,0xd23a,0xbda6,0xd476,0x8db9,0x6fc2,0x43b9,0x2a81,0x43c3,0x95a8,0x8a20,0xbd0f,0x854,0x4add,0x7784,0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xd0bf,0xeb19,0xa99e,0xb87e,0x8a04,0xcfcc,0xb5bb,0xc975,0x2ff6,0xd522,0xf88a,0x12ff,0x5118,0xc3fa,0xe212,0xde9b,0xd572,0xd23a,0xbda6,0xd476,0x8db9,0x6fc2,0x43b9,0x2a81,0x43c3,0x95a8,0x8a20,0xbd0f,0x854,0x4add,0x7784,0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x60c6,0xe0b0,0x19b3,0x3c25,0x4ecd,0xfd84,0xed32,0x835c,0x29d5,0xdc1d,0x4f68,0x28a2,0x576c,0xf314,0x3d6b,0xdb}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc18c,0xc160,0x3367,0x784a,0x9d9a,0xfb08,0xda65,0x6b9,0x53ab,0xb83a,0x9ed1,0x5144,0xaed8,0xe628,0x7ad7,0x1b6}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6189,0x7e90,0x9de8,0xb77f,0x4171,0xaf47,0x2826,0x5cf8,0xfb6,0xf9cf,0x1da9,0xb980,0x9af8,0xf52f,0x7e23,0xe3}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xd}, {{{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd7ac,0xc5b6,0x766e,0x8b8d,0xb9f0,0x36c7,0x9615,0xec1e,0x84f,0xc4d1,0xc224,0x2350,0xc0c2,0xf391,0xfa07,0x1f84}}}, {{{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd7ac,0xc5b6,0x766e,0x8b8d,0xb9f0,0x36c7,0x9615,0xec1e,0x84f,0xc4d1,0xc224,0x2350,0xc0c2,0xf391,0xfa07,0x1f84}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6bd6,0x62db,0xbb37,0x45c6,0xdcf8,0x9b63,0x4b0a,0xf60f,0x8427,0x6268,0x6112,0x11a8,0xe061,0xf9c8,0x7d03,0xfc2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x2dc8,0xb21,0x692b,0xb60f,0xd128,0x67bb,0x46da,0xd395,0x5f11,0xddc8,0x7b56,0xd919,0xeeed,0xccad,0x720e,0xa545,0x7b10,0xf6c,0x69e2,0x7856,0x3944,0xc307,0xeac2,0xaf86,0x901f,0xa1a5,0xdc68,0xd979,0x17a,0x5cb2,0xbcd0,0x1f0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xbef7,0xe45a,0x5529,0xf902,0xac34,0xf923,0x5e12,0xc46c,0x1275,0xb6aa,0xb793,0x4c62,0x151c,0x5fa,0x31c5,0x85d5,0xc29a,0xb855,0xebbc,0x76aa,0xfe6a,0x974c,0xebf1,0x294c,0xf4bc,0x4426,0x15be,0x8d86,0x69c2,0xf7b1,0xe121,0x74}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6bd6,0x62db,0xbb37,0x45c6,0xdcf8,0x9b63,0x4b0a,0xf60f,0x8427,0x6268,0x6112,0x11a8,0xe061,0xf9c8,0x7d03,0xfc2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd7ac,0xc5b6,0x766e,0x8b8d,0xb9f0,0x36c7,0x9615,0xec1e,0x84f,0xc4d1,0xc224,0x2350,0xc0c2,0xf391,0xfa07,0x1f84}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0xf747,0xfd81,0x31b,0xb0ea,0x2ae1,0xec6f,0x23d8,0xbcdd,0xbd8a,0xaa29,0x4373,0xae28,0xab29,0x32e3,0x85da,0x4e12}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x11}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x11}, {{{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x7332,0x9105,0xff5a,0xdd46,0xd4f8,0x2531,0x7e5b,0xde4a,0x6237,0x259e,0xf722,0x6c2,0xe02f,0x4545,0x39fd,0xa9d,0x1}}}, {{{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x7332,0x9105,0xff5a,0xdd46,0xd4f8,0x2531,0x7e5b,0xde4a,0x6237,0x259e,0xf722,0x6c2,0xe02f,0x4545,0x39fd,0xa9d,0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb999,0x4882,0x7fad,0x6ea3,0xea7c,0x9298,0x3f2d,0xef25,0x311b,0x12cf,0x7b91,0x8361,0xf017,0xa2a2,0x9cfe,0x854e}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xfae2,0x2be4,0xe3e2,0x3c68,0x22d9,0xc88f,0x4e95,0x6342,0xf7d,0x1931,0xcf98,0x7af,0xf77c,0x9bb4,0x408f,0xad10,0x3647,0x2aab,0x80b3,0x3b27,0x5802,0xa56,0x2d11,0xe11a,0x4b4,0x1e65,0x204c,0xe836,0x7880,0x40df,0x8e89,0x8ad5}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x7d71,0x15f2,0x71f1,0x9e34,0x916c,0xe447,0x274a,0xb1a1,0x87be,0xc98,0xe7cc,0x3d7,0x7bbe,0xcdda,0x2047,0xd688,0x9b23,0x9555,0xc059,0x1d93,0x2c01,0x852b,0x1688,0x708d,0x825a,0xf32,0x1026,0x741b,0xbc40,0xa06f,0xc744,0x456a}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xfb40,0x59f6,0xa101,0x3ff0,0xab0e,0xefe1,0xb19c,0xed0b,0x9380,0x58b5,0x3ab2,0x5d17,0xd404,0x2f25,0xe75b,0x3638,0x681d,0x4205,0x199f,0xf1b3,0x4373,0x6156,0x3751,0xff06,0xca40,0x7f9c,0x676b,0xa904,0x8d3c,0x6dd6,0x5d6d,0x462}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb999,0x4882,0x7fad,0x6ea3,0xea7c,0x9298,0x3f2d,0xef25,0x311b,0x12cf,0x7b91,0x8361,0xf017,0xa2a2,0x9cfe,0x854e}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x7332,0x9105,0xff5a,0xdd46,0xd4f8,0x2531,0x7e5b,0xde4a,0x6237,0x259e,0xf722,0x6c2,0xe02f,0x4545,0x39fd,0xa9d,0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0x9834,0xbdf0,0x27b3,0xa22,0x237c,0x5622,0xfaf7,0x9b1f,0x1cbf,0x3f9d,0xb2cd,0xe91e,0x8e54,0x57d5,0x324f,0x2fda}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0xbe}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x13}, {{{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6d66,0xb89b,0x870f,0x16c9,0x2719,0xb8aa,0x7793,0xee59,0xcfbc,0x8d0,0x8885,0x1f3c,0x8151,0x7f6a,0x863,0x899}}}, {{{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6d66,0xb89b,0x870f,0x16c9,0x2719,0xb8aa,0x7793,0xee59,0xcfbc,0x8d0,0x8885,0x1f3c,0x8151,0x7f6a,0x863,0x899}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb6b3,0xdc4d,0xc387,0x8b64,0x138c,0xdc55,0xbbc9,0x772c,0x67de,0x8468,0x4442,0x8f9e,0x40a8,0xbfb5,0x8431,0x44c}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x252,0x2422,0x18ca,0x3372,0x513b,0xb36a,0xc000,0x88f5,0xaa17,0xaa18,0xaec9,0x32e9,0x27f7,0x5aa9,0xefe0,0x6c5a,0xd15d,0x6bc8,0xd19a,0xc135,0xb668,0xe43,0xd176,0x69ea,0x2365,0xa335,0x8719,0xc65,0xaa03,0x9f95,0xf600,0x24}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x129,0x1211,0xc65,0x99b9,0x289d,0x59b5,0xe000,0xc47a,0x550b,0xd50c,0xd764,0x9974,0x93fb,0x2d54,0x77f0,0xb62d,0x68ae,0x35e4,0xe8cd,0x609a,0xdb34,0x721,0x68bb,0xb4f5,0x91b2,0xd19a,0xc38c,0x8632,0xd501,0x4fca,0x7b00,0x12}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xe4a6,0x4a8c,0x6543,0x7d2,0x245a,0x32ba,0x6117,0x9010,0xbcb4,0x38c9,0x8393,0x2457,0xd9ca,0xf93a,0x4c70,0x1efd,0x9b1f,0x23ed,0x45de,0x4067,0xe778,0xaf6b,0xf07c,0xcdf8,0x6121,0x8bbc,0x2d08,0x5977,0xe356,0x3531,0x5200,0xc}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb6b3,0xdc4d,0xc387,0x8b64,0x138c,0xdc55,0xbbc9,0x772c,0x67de,0x8468,0x4442,0x8f9e,0x40a8,0xbfb5,0x8431,0x44c}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6d66,0xb89b,0x870f,0x16c9,0x2719,0xb8aa,0x7793,0xee59,0xcfbc,0x8d0,0x8885,0x1f3c,0x8151,0x7f6a,0x863,0x899}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0xa8c0,0x88f6,0xd200,0x37f5,0xc85a,0x3677,0x3976,0xb189,0xe7f3,0xff76,0x481f,0x8bc6,0x3531,0xddf1,0x151a,0x1ec6}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x6}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1f}}; -#elif 8*DIGIT_LEN == 32 -const quat_alg_t QUATALG_PINFTY = {{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xa6e1ffff,0x994c68ad,0x781974ce,0xfaf0a29a,0x4a0dea65,0xfe3ac590,0x26507d01,0x2bdbe63,0x6936e792,0x8c15b003,0xa8869bc6,0x255946}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xa6e1ffff,0x994c68ad,0x781974ce,0xfaf0a29a,0x4a0dea65,0xfe3ac590,0x26507d01,0x2bdbe63,0x6936e792,0x8c15b003,0xa8869bc6,0x255946}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xa6e1ffff,0x994c68ad,0x781974ce,0xfaf0a29a,0x4a0dea65,0xfe3ac590,0x26507d01,0x2bdbe63,0x6936e792,0x8c15b003,0xa8869bc6,0x255946}}}}}}; -const quat_order_t MAXORD_O0 = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}; -const quat_p_extremal_maximal_order_t STANDARD_EXTREMAL_ORDER = {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1}; -const quat_p_extremal_maximal_order_t ALTERNATE_EXTREMAL_ORDERS[7] = {{{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x54c40780,0x6e86e2ea,0x7b62a092,0x9605eb6f,0x661130bc,0xcd8d2837,0xdabf6686,0x83a68e4}}}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x54c40780,0x6e86e2ea,0x7b62a092,0x9605eb6f,0x661130bc,0xcd8d2837,0xdabf6686,0x83a68e4}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2a6203c0,0x37437175,0xbdb15049,0x4b02f5b7,0xb308985e,0x66c6941b,0x6d5fb343,0x41d3472}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2a6203c0,0x37437175,0xbdb15049,0x4b02f5b7,0xb308985e,0x66c6941b,0x6d5fb343,0x41d3472}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xbe1c2000,0x84d67883,0x17222ae9,0xbc6c5ace,0x16a5342,0xf43f1f2e,0x79828bbd,0x671f065b,0x583c3c44,0x71839c8d,0x194f4b9b,0x2934cbb8,0x1ff1662d,0x628a53a9,0x2ce9ba,0x21d9f1}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdf0e1000,0xc26b3c41,0xb911574,0x5e362d67,0xb529a1,0xfa1f8f97,0xbcc145de,0x338f832d,0xac1e1e22,0xb8c1ce46,0xca7a5cd,0x949a65dc,0x8ff8b316,0x314529d4,0x801674dd,0x10ecf8}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x13913801,0xb8958f27,0x62274f80,0xb3c02267,0x55f1ed3e,0x28535e39,0xf4832d84,0x6374ec50,0x583c3c44,0x71839c8d,0x194f4b9b,0x2934cbb8,0x1ff1662d,0x628a53a9,0x2ce9ba,0x21d9f1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2a6203c0,0x37437175,0xbdb15049,0x4b02f5b7,0xb308985e,0x66c6941b,0x6d5fb343,0x41d3472}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x54c40780,0x6e86e2ea,0x7b62a092,0x9605eb6f,0x661130bc,0xcd8d2837,0xdabf6686,0x83a68e4}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x5515cffe,0x9881d2b9,0x69f5b6d1,0x115870cd,0x56f0cc08,0x97d781e9,0x9febc73,0x7543415}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x3}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa41879d8,0xf4dc41f3,0x4f000043,0x38cddcbc,0x1b844762,0x879c2da8,0xa12d5f56,0xe5b407d}}}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa41879d8,0xf4dc41f3,0x4f000043,0x38cddcbc,0x1b844762,0x879c2da8,0xa12d5f56,0xe5b407d}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd20c3cec,0xfa6e20f9,0x27800021,0x1c66ee5e,0xdc223b1,0x43ce16d4,0xd096afab,0x72da03e}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe93ef320,0x44632f41,0x88af0d4d,0x970a389a,0x65872041,0xd00c4c38,0xebb9e51f,0x910799dc,0x338d91df,0xb41cff0a,0x1ae69d14,0xa7a3a7f5,0x6e2f1000,0x5ce6fb25,0x53984d76,0x670dca}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x34299fe1,0x9ffd7833,0xeceb67d7,0x9151c64,0x71d9e876,0x8499fcf9,0xa049eb89,0xd5946f47,0xae38a0bf,0xae71ff9d,0x3df5d86e,0xa974a995,0x5f460666,0x585c6475,0x54a3522f,0x2938b7}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd20c3cec,0xfa6e20f9,0x27800021,0x1c66ee5e,0xdc223b1,0x43ce16d4,0xd096afab,0x72da03e}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa41879d8,0xf4dc41f3,0x4f000043,0x38cddcbc,0x1b844762,0x879c2da8,0xa12d5f56,0xe5b407d}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x32523925,0x972cfa7c,0x8f3aec9b,0xff551cc3,0x6e3349ca,0xf6e9586e,0x49fdcf6f,0x9d6f8ac}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x5}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x5}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3adc519e,0x1db91d00,0x29ff2ac3,0xbeaffd89,0xd574e910,0xd70d1469,0x81ba0439,0x3fa6efbb}}}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3adc519e,0x1db91d00,0x29ff2ac3,0xbeaffd89,0xd574e910,0xd70d1469,0x81ba0439,0x3fa6efbb}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1d6e28cf,0x8edc8e80,0x94ff9561,0x5f57fec4,0xeaba7488,0xeb868a34,0xc0dd021c,0x1fd377dd}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xfccaaec2,0xdd312f4b,0x13121c7a,0xbcb79a21,0xd9e6f69e,0x13821c01,0x7a419d48,0xc4d3025b,0x1bb7f24b,0x9c442dd5,0x4deb0bf2,0x6bc98688,0xcc31ab70,0x71f403c,0x8c2b871,0x7e9cb6d}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xfe655761,0x6e9897a5,0x89890e3d,0x5e5bcd10,0xecf37b4f,0x9c10e00,0xbd20cea4,0xe269812d,0x8ddbf925,0x4e2216ea,0x26f585f9,0x35e4c344,0x6618d5b8,0x838fa01e,0x84615c38,0x3f4e5b6}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd5f0674a,0x7b20ad5b,0x411376dd,0xc6be9ab1,0xe16aaac,0xf256bbb7,0x3e830eeb,0x4ef87a9c,0x389ffb04,0x95ea3f36,0xedc9d5cc,0x9b8f19a5,0x46f2711,0xbcc58bb9,0x6046ceb4,0x2e0a710}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1d6e28cf,0x8edc8e80,0x94ff9561,0x5f57fec4,0xeaba7488,0xeb868a34,0xc0dd021c,0x1fd377dd}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3adc519e,0x1db91d00,0x29ff2ac3,0xbeaffd89,0xd574e910,0xd70d1469,0x81ba0439,0x3fa6efbb}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x7c536a4c,0xab456b84,0xff1b5331,0x2ea47a32,0x66baf5e3,0x376341ac,0x8d365e06,0xa2c27691}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x16}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xb}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc160c18c,0x784a3367,0xfb089d9a,0x6b9da65,0xb83a53ab,0x51449ed1,0xe628aed8,0x1b67ad7}}}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc160c18c,0x784a3367,0xfb089d9a,0x6b9da65,0xb83a53ab,0x51449ed1,0xe628aed8,0x1b67ad7}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe0b060c6,0x3c2519b3,0xfd844ecd,0x835ced32,0xdc1d29d5,0x28a24f68,0xf314576c,0xdb3d6b}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x69aa3248,0x6ffe4787,0x7f13cb76,0x266ddde2,0xcef13fad,0xcc801634,0xb929ec10,0xdf7f6036,0xd23ad572,0xd476bda6,0x6fc28db9,0x2a8143b9,0x95a843c3,0xbd0f8a20,0x4add0854,0x17784}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xeb19d0bf,0xb87ea99e,0xcfcc8a04,0xc975b5bb,0xd5222ff6,0x12fff88a,0xc3fa5118,0xde9be212,0xd23ad572,0xd476bda6,0x6fc28db9,0x2a8143b9,0x95a843c3,0xbd0f8a20,0x4add0854,0x17784}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe0b060c6,0x3c2519b3,0xfd844ecd,0x835ced32,0xdc1d29d5,0x28a24f68,0xf314576c,0xdb3d6b}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc160c18c,0x784a3367,0xfb089d9a,0x6b9da65,0xb83a53ab,0x51449ed1,0xe628aed8,0x1b67ad7}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x7e906189,0xb77f9de8,0xaf474171,0x5cf82826,0xf9cf0fb6,0xb9801da9,0xf52f9af8,0xe37e23}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xd}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc5b6d7ac,0x8b8d766e,0x36c7b9f0,0xec1e9615,0xc4d1084f,0x2350c224,0xf391c0c2,0x1f84fa07}}}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc5b6d7ac,0x8b8d766e,0x36c7b9f0,0xec1e9615,0xc4d1084f,0x2350c224,0xf391c0c2,0x1f84fa07}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x62db6bd6,0x45c6bb37,0x9b63dcf8,0xf60f4b0a,0x62688427,0x11a86112,0xf9c8e061,0xfc27d03}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb212dc8,0xb60f692b,0x67bbd128,0xd39546da,0xddc85f11,0xd9197b56,0xccadeeed,0xa545720e,0xf6c7b10,0x785669e2,0xc3073944,0xaf86eac2,0xa1a5901f,0xd979dc68,0x5cb2017a,0x1f0bcd0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe45abef7,0xf9025529,0xf923ac34,0xc46c5e12,0xb6aa1275,0x4c62b793,0x5fa151c,0x85d531c5,0xb855c29a,0x76aaebbc,0x974cfe6a,0x294cebf1,0x4426f4bc,0x8d8615be,0xf7b169c2,0x74e121}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x62db6bd6,0x45c6bb37,0x9b63dcf8,0xf60f4b0a,0x62688427,0x11a86112,0xf9c8e061,0xfc27d03}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc5b6d7ac,0x8b8d766e,0x36c7b9f0,0xec1e9615,0xc4d1084f,0x2350c224,0xf391c0c2,0x1f84fa07}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xfd81f747,0xb0ea031b,0xec6f2ae1,0xbcdd23d8,0xaa29bd8a,0xae284373,0x32e3ab29,0x4e1285da}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x11}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x11}, {{{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x91057332,0xdd46ff5a,0x2531d4f8,0xde4a7e5b,0x259e6237,0x6c2f722,0x4545e02f,0xa9d39fd,0x1}}}, {{{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x91057332,0xdd46ff5a,0x2531d4f8,0xde4a7e5b,0x259e6237,0x6c2f722,0x4545e02f,0xa9d39fd,0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4882b999,0x6ea37fad,0x9298ea7c,0xef253f2d,0x12cf311b,0x83617b91,0xa2a2f017,0x854e9cfe}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x2be4fae2,0x3c68e3e2,0xc88f22d9,0x63424e95,0x19310f7d,0x7afcf98,0x9bb4f77c,0xad10408f,0x2aab3647,0x3b2780b3,0xa565802,0xe11a2d11,0x1e6504b4,0xe836204c,0x40df7880,0x8ad58e89}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x15f27d71,0x9e3471f1,0xe447916c,0xb1a1274a,0xc9887be,0x3d7e7cc,0xcdda7bbe,0xd6882047,0x95559b23,0x1d93c059,0x852b2c01,0x708d1688,0xf32825a,0x741b1026,0xa06fbc40,0x456ac744}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x59f6fb40,0x3ff0a101,0xefe1ab0e,0xed0bb19c,0x58b59380,0x5d173ab2,0x2f25d404,0x3638e75b,0x4205681d,0xf1b3199f,0x61564373,0xff063751,0x7f9cca40,0xa904676b,0x6dd68d3c,0x4625d6d}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4882b999,0x6ea37fad,0x9298ea7c,0xef253f2d,0x12cf311b,0x83617b91,0xa2a2f017,0x854e9cfe}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x91057332,0xdd46ff5a,0x2531d4f8,0xde4a7e5b,0x259e6237,0x6c2f722,0x4545e02f,0xa9d39fd,0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xbdf09834,0xa2227b3,0x5622237c,0x9b1ffaf7,0x3f9d1cbf,0xe91eb2cd,0x57d58e54,0x2fda324f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0xbe}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x13}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb89b6d66,0x16c9870f,0xb8aa2719,0xee597793,0x8d0cfbc,0x1f3c8885,0x7f6a8151,0x8990863}}}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb89b6d66,0x16c9870f,0xb8aa2719,0xee597793,0x8d0cfbc,0x1f3c8885,0x7f6a8151,0x8990863}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdc4db6b3,0x8b64c387,0xdc55138c,0x772cbbc9,0x846867de,0x8f9e4442,0xbfb540a8,0x44c8431}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x24220252,0x337218ca,0xb36a513b,0x88f5c000,0xaa18aa17,0x32e9aec9,0x5aa927f7,0x6c5aefe0,0x6bc8d15d,0xc135d19a,0xe43b668,0x69ead176,0xa3352365,0xc658719,0x9f95aa03,0x24f600}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x12110129,0x99b90c65,0x59b5289d,0xc47ae000,0xd50c550b,0x9974d764,0x2d5493fb,0xb62d77f0,0x35e468ae,0x609ae8cd,0x721db34,0xb4f568bb,0xd19a91b2,0x8632c38c,0x4fcad501,0x127b00}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x4a8ce4a6,0x7d26543,0x32ba245a,0x90106117,0x38c9bcb4,0x24578393,0xf93ad9ca,0x1efd4c70,0x23ed9b1f,0x406745de,0xaf6be778,0xcdf8f07c,0x8bbc6121,0x59772d08,0x3531e356,0xc5200}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdc4db6b3,0x8b64c387,0xdc55138c,0x772cbbc9,0x846867de,0x8f9e4442,0xbfb540a8,0x44c8431}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb89b6d66,0x16c9870f,0xb8aa2719,0xee597793,0x8d0cfbc,0x1f3c8885,0x7f6a8151,0x8990863}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x88f6a8c0,0x37f5d200,0x3677c85a,0xb1893976,0xff76e7f3,0x8bc6481f,0xddf13531,0x1ec6151a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x6}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1f}}; -#elif 8*DIGIT_LEN == 64 -const quat_alg_t QUATALG_PINFTY = {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0xffffffffffffffff,0x994c68ada6e1ffff,0xfaf0a29a781974ce,0xfe3ac5904a0dea65,0x2bdbe6326507d01,0x8c15b0036936e792,0x255946a8869bc6}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0xffffffffffffffff,0x994c68ada6e1ffff,0xfaf0a29a781974ce,0xfe3ac5904a0dea65,0x2bdbe6326507d01,0x8c15b0036936e792,0x255946a8869bc6}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0xffffffffffffffff,0x994c68ada6e1ffff,0xfaf0a29a781974ce,0xfe3ac5904a0dea65,0x2bdbe6326507d01,0x8c15b0036936e792,0x255946a8869bc6}}}}}}; -const quat_order_t MAXORD_O0 = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}; -const quat_p_extremal_maximal_order_t STANDARD_EXTREMAL_ORDER = {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1}; -const quat_p_extremal_maximal_order_t ALTERNATE_EXTREMAL_ORDERS[7] = {{{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6e86e2ea54c40780,0x9605eb6f7b62a092,0xcd8d2837661130bc,0x83a68e4dabf6686}}}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6e86e2ea54c40780,0x9605eb6f7b62a092,0xcd8d2837661130bc,0x83a68e4dabf6686}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x374371752a6203c0,0x4b02f5b7bdb15049,0x66c6941bb308985e,0x41d34726d5fb343}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x374371752a6203c0,0x4b02f5b7bdb15049,0x66c6941bb308985e,0x41d34726d5fb343}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x84d67883be1c2000,0xbc6c5ace17222ae9,0xf43f1f2e016a5342,0x671f065b79828bbd,0x71839c8d583c3c44,0x2934cbb8194f4b9b,0x628a53a91ff1662d,0x21d9f1002ce9ba}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc26b3c41df0e1000,0x5e362d670b911574,0xfa1f8f9700b529a1,0x338f832dbcc145de,0xb8c1ce46ac1e1e22,0x949a65dc0ca7a5cd,0x314529d48ff8b316,0x10ecf8801674dd}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb8958f2713913801,0xb3c0226762274f80,0x28535e3955f1ed3e,0x6374ec50f4832d84,0x71839c8d583c3c44,0x2934cbb8194f4b9b,0x628a53a91ff1662d,0x21d9f1002ce9ba}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x374371752a6203c0,0x4b02f5b7bdb15049,0x66c6941bb308985e,0x41d34726d5fb343}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6e86e2ea54c40780,0x9605eb6f7b62a092,0xcd8d2837661130bc,0x83a68e4dabf6686}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x9881d2b95515cffe,0x115870cd69f5b6d1,0x97d781e956f0cc08,0x754341509febc73}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x3}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xf4dc41f3a41879d8,0x38cddcbc4f000043,0x879c2da81b844762,0xe5b407da12d5f56}}}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xf4dc41f3a41879d8,0x38cddcbc4f000043,0x879c2da81b844762,0xe5b407da12d5f56}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xfa6e20f9d20c3cec,0x1c66ee5e27800021,0x43ce16d40dc223b1,0x72da03ed096afab}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x44632f41e93ef320,0x970a389a88af0d4d,0xd00c4c3865872041,0x910799dcebb9e51f,0xb41cff0a338d91df,0xa7a3a7f51ae69d14,0x5ce6fb256e2f1000,0x670dca53984d76}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9ffd783334299fe1,0x9151c64eceb67d7,0x8499fcf971d9e876,0xd5946f47a049eb89,0xae71ff9dae38a0bf,0xa974a9953df5d86e,0x585c64755f460666,0x2938b754a3522f}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xfa6e20f9d20c3cec,0x1c66ee5e27800021,0x43ce16d40dc223b1,0x72da03ed096afab}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xf4dc41f3a41879d8,0x38cddcbc4f000043,0x879c2da81b844762,0xe5b407da12d5f56}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x972cfa7c32523925,0xff551cc38f3aec9b,0xf6e9586e6e3349ca,0x9d6f8ac49fdcf6f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x5}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x5}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1db91d003adc519e,0xbeaffd8929ff2ac3,0xd70d1469d574e910,0x3fa6efbb81ba0439}}}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1db91d003adc519e,0xbeaffd8929ff2ac3,0xd70d1469d574e910,0x3fa6efbb81ba0439}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8edc8e801d6e28cf,0x5f57fec494ff9561,0xeb868a34eaba7488,0x1fd377ddc0dd021c}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdd312f4bfccaaec2,0xbcb79a2113121c7a,0x13821c01d9e6f69e,0xc4d3025b7a419d48,0x9c442dd51bb7f24b,0x6bc986884deb0bf2,0x71f403ccc31ab70,0x7e9cb6d08c2b871}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6e9897a5fe655761,0x5e5bcd1089890e3d,0x9c10e00ecf37b4f,0xe269812dbd20cea4,0x4e2216ea8ddbf925,0x35e4c34426f585f9,0x838fa01e6618d5b8,0x3f4e5b684615c38}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x7b20ad5bd5f0674a,0xc6be9ab1411376dd,0xf256bbb70e16aaac,0x4ef87a9c3e830eeb,0x95ea3f36389ffb04,0x9b8f19a5edc9d5cc,0xbcc58bb9046f2711,0x2e0a7106046ceb4}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8edc8e801d6e28cf,0x5f57fec494ff9561,0xeb868a34eaba7488,0x1fd377ddc0dd021c}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1db91d003adc519e,0xbeaffd8929ff2ac3,0xd70d1469d574e910,0x3fa6efbb81ba0439}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xab456b847c536a4c,0x2ea47a32ff1b5331,0x376341ac66baf5e3,0xa2c276918d365e06}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x16}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xb}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x784a3367c160c18c,0x6b9da65fb089d9a,0x51449ed1b83a53ab,0x1b67ad7e628aed8}}}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x784a3367c160c18c,0x6b9da65fb089d9a,0x51449ed1b83a53ab,0x1b67ad7e628aed8}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3c2519b3e0b060c6,0x835ced32fd844ecd,0x28a24f68dc1d29d5,0xdb3d6bf314576c}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6ffe478769aa3248,0x266ddde27f13cb76,0xcc801634cef13fad,0xdf7f6036b929ec10,0xd476bda6d23ad572,0x2a8143b96fc28db9,0xbd0f8a2095a843c3,0x177844add0854}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb87ea99eeb19d0bf,0xc975b5bbcfcc8a04,0x12fff88ad5222ff6,0xde9be212c3fa5118,0xd476bda6d23ad572,0x2a8143b96fc28db9,0xbd0f8a2095a843c3,0x177844add0854}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3c2519b3e0b060c6,0x835ced32fd844ecd,0x28a24f68dc1d29d5,0xdb3d6bf314576c}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x784a3367c160c18c,0x6b9da65fb089d9a,0x51449ed1b83a53ab,0x1b67ad7e628aed8}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb77f9de87e906189,0x5cf82826af474171,0xb9801da9f9cf0fb6,0xe37e23f52f9af8}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xd}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8b8d766ec5b6d7ac,0xec1e961536c7b9f0,0x2350c224c4d1084f,0x1f84fa07f391c0c2}}}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8b8d766ec5b6d7ac,0xec1e961536c7b9f0,0x2350c224c4d1084f,0x1f84fa07f391c0c2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x45c6bb3762db6bd6,0xf60f4b0a9b63dcf8,0x11a8611262688427,0xfc27d03f9c8e061}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb60f692b0b212dc8,0xd39546da67bbd128,0xd9197b56ddc85f11,0xa545720eccadeeed,0x785669e20f6c7b10,0xaf86eac2c3073944,0xd979dc68a1a5901f,0x1f0bcd05cb2017a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf9025529e45abef7,0xc46c5e12f923ac34,0x4c62b793b6aa1275,0x85d531c505fa151c,0x76aaebbcb855c29a,0x294cebf1974cfe6a,0x8d8615be4426f4bc,0x74e121f7b169c2}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x45c6bb3762db6bd6,0xf60f4b0a9b63dcf8,0x11a8611262688427,0xfc27d03f9c8e061}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8b8d766ec5b6d7ac,0xec1e961536c7b9f0,0x2350c224c4d1084f,0x1f84fa07f391c0c2}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xb0ea031bfd81f747,0xbcdd23d8ec6f2ae1,0xae284373aa29bd8a,0x4e1285da32e3ab29}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x11}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x11}, {{{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xdd46ff5a91057332,0xde4a7e5b2531d4f8,0x6c2f722259e6237,0xa9d39fd4545e02f,0x1}}}, {{{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xdd46ff5a91057332,0xde4a7e5b2531d4f8,0x6c2f722259e6237,0xa9d39fd4545e02f,0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6ea37fad4882b999,0xef253f2d9298ea7c,0x83617b9112cf311b,0x854e9cfea2a2f017}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3c68e3e22be4fae2,0x63424e95c88f22d9,0x7afcf9819310f7d,0xad10408f9bb4f77c,0x3b2780b32aab3647,0xe11a2d110a565802,0xe836204c1e6504b4,0x8ad58e8940df7880}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9e3471f115f27d71,0xb1a1274ae447916c,0x3d7e7cc0c9887be,0xd6882047cdda7bbe,0x1d93c05995559b23,0x708d1688852b2c01,0x741b10260f32825a,0x456ac744a06fbc40}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3ff0a10159f6fb40,0xed0bb19cefe1ab0e,0x5d173ab258b59380,0x3638e75b2f25d404,0xf1b3199f4205681d,0xff06375161564373,0xa904676b7f9cca40,0x4625d6d6dd68d3c}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6ea37fad4882b999,0xef253f2d9298ea7c,0x83617b9112cf311b,0x854e9cfea2a2f017}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xdd46ff5a91057332,0xde4a7e5b2531d4f8,0x6c2f722259e6237,0xa9d39fd4545e02f,0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xa2227b3bdf09834,0x9b1ffaf75622237c,0xe91eb2cd3f9d1cbf,0x2fda324f57d58e54}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0xbe}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x13}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x16c9870fb89b6d66,0xee597793b8aa2719,0x1f3c888508d0cfbc,0x89908637f6a8151}}}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x16c9870fb89b6d66,0xee597793b8aa2719,0x1f3c888508d0cfbc,0x89908637f6a8151}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8b64c387dc4db6b3,0x772cbbc9dc55138c,0x8f9e4442846867de,0x44c8431bfb540a8}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x337218ca24220252,0x88f5c000b36a513b,0x32e9aec9aa18aa17,0x6c5aefe05aa927f7,0xc135d19a6bc8d15d,0x69ead1760e43b668,0xc658719a3352365,0x24f6009f95aa03}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x99b90c6512110129,0xc47ae00059b5289d,0x9974d764d50c550b,0xb62d77f02d5493fb,0x609ae8cd35e468ae,0xb4f568bb0721db34,0x8632c38cd19a91b2,0x127b004fcad501}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x7d265434a8ce4a6,0x9010611732ba245a,0x2457839338c9bcb4,0x1efd4c70f93ad9ca,0x406745de23ed9b1f,0xcdf8f07caf6be778,0x59772d088bbc6121,0xc52003531e356}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8b64c387dc4db6b3,0x772cbbc9dc55138c,0x8f9e4442846867de,0x44c8431bfb540a8}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x16c9870fb89b6d66,0xee597793b8aa2719,0x1f3c888508d0cfbc,0x89908637f6a8151}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x37f5d20088f6a8c0,0xb18939763677c85a,0x8bc6481fff76e7f3,0x1ec6151addf13531}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x6}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1f}}; +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x33,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x200}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x33,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x33,0x0,0x0,0x0,0x0,0x0,0x0,0x200000000000000}}} #endif +; +const quat_alg_t QUATALG_PINFTY = { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x1af}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x1afffff}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0xffffffffffffffff,0xffffffffffffffff,0xffffffffffffffff,0xffffffffffffffff,0xffffffffffffffff,0xffffffffffffffff,0x1afffffffffffff}}} +#endif +}; +const quat_p_extremal_maximal_order_t EXTREMAL_ORDERS[7] = {{{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 1}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc584,0x10dc,0x9924,0xb9c2,0x5a67,0xfbc8,0xbdfb,0xe941,0xc61,0xdee2,0xcd5c,0xc570,0xa2d4,0xb3ff,0x2e51,0x4927}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x10dcc584,0xb9c29924,0xfbc85a67,0xe941bdfb,0xdee20c61,0xc570cd5c,0xb3ffa2d4,0x49272e51}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb9c2992410dcc584,0xe941bdfbfbc85a67,0xc570cd5cdee20c61,0x49272e51b3ffa2d4}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc584,0x10dc,0x9924,0xb9c2,0x5a67,0xfbc8,0xbdfb,0xe941,0xc61,0xdee2,0xcd5c,0xc570,0xa2d4,0xb3ff,0x2e51,0x4927}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x10dcc584,0xb9c29924,0xfbc85a67,0xe941bdfb,0xdee20c61,0xc570cd5c,0xb3ffa2d4,0x49272e51}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb9c2992410dcc584,0xe941bdfbfbc85a67,0xc570cd5cdee20c61,0x49272e51b3ffa2d4}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x62c2,0x86e,0x4c92,0xdce1,0x2d33,0xfde4,0xdefd,0xf4a0,0x630,0x6f71,0x66ae,0x62b8,0xd16a,0xd9ff,0x9728,0x2493}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x86e62c2,0xdce14c92,0xfde42d33,0xf4a0defd,0x6f710630,0x62b866ae,0xd9ffd16a,0x24939728}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xdce14c92086e62c2,0xf4a0defdfde42d33,0x62b866ae6f710630,0x24939728d9ffd16a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0xc93,0xd634,0x4632,0x353f,0x76ba,0x220d,0x5084,0x3187,0xb121,0xfc8,0x6860,0xa3e4,0x1368,0x7388,0x5e0,0x7e52}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xd6340c93,0x353f4632,0x220d76ba,0x31875084,0xfc8b121,0xa3e46860,0x73881368,0x7e5205e0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x353f4632d6340c93,0x31875084220d76ba,0xa3e468600fc8b121,0x7e5205e073881368}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x2f6d,0xbfbd,0x6af0,0xbcd3,0x5c61,0x8f62,0x9b0b,0xd78a,0x3142,0x61aa,0x4716,0x208,0x93c7,0x43bd,0x97d6,0xda1a,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xd7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xbfbd2f6d,0xbcd36af0,0x8f625c61,0xd78a9b0b,0x61aa3142,0x2084716,0x43bd93c7,0xda1a97d6,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xd7ffff}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbcd36af0bfbd2f6d,0xd78a9b0b8f625c61,0x208471661aa3142,0xda1a97d643bd93c7,0xffffffffffffffff,0xffffffffffffffff,0xffffffffffffffff,0xd7ffffffffffff}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x62c2,0x86e,0x4c92,0xdce1,0x2d33,0xfde4,0xdefd,0xf4a0,0x630,0x6f71,0x66ae,0x62b8,0xd16a,0xd9ff,0x9728,0x2493}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x86e62c2,0xdce14c92,0xfde42d33,0xf4a0defd,0x6f710630,0x62b866ae,0xd9ffd16a,0x24939728}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xdce14c92086e62c2,0xf4a0defdfde42d33,0x62b866ae6f710630,0x24939728d9ffd16a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9add,0x156b,0x8705,0x6bb9,0x8bdf,0xd034,0x21a6,0xb827,0x44e9,0x34c7,0x3da3,0xa9fd,0xcebd,0x3ec0,0xcd63,0xca1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x156b9add,0x6bb98705,0xd0348bdf,0xb82721a6,0x34c744e9,0xa9fd3da3,0x3ec0cebd,0xca1cd63}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6bb98705156b9add,0xb82721a6d0348bdf,0xa9fd3da334c744e9,0xca1cd633ec0cebd}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc584,0x10dc,0x9924,0xb9c2,0x5a67,0xfbc8,0xbdfb,0xe941,0xc61,0xdee2,0xcd5c,0xc570,0xa2d4,0xb3ff,0x2e51,0x4927}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x10dcc584,0xb9c29924,0xfbc85a67,0xe941bdfb,0xdee20c61,0xc570cd5c,0xb3ffa2d4,0x49272e51}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb9c2992410dcc584,0xe941bdfbfbc85a67,0xc570cd5cdee20c61,0x49272e51b3ffa2d4}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0xc93,0xd634,0x4632,0x353f,0x76ba,0x220d,0x5084,0x3187,0xb121,0xfc8,0x6860,0xa3e4,0x1368,0x7388,0x5e0,0x7e52}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xd6340c93,0x353f4632,0x220d76ba,0x31875084,0xfc8b121,0xa3e46860,0x73881368,0x7e5205e0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x353f4632d6340c93,0x31875084220d76ba,0xa3e468600fc8b121,0x7e5205e073881368}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 5}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x169a,0xd34,0xbfd7,0x4089,0x1be8,0xc17d,0xfefb,0x6efd,0x76e0,0x58ea,0xfedb,0xd204,0x1e3,0x3b9a,0x47d6,0xdf28,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xd34169a,0x4089bfd7,0xc17d1be8,0x6efdfefb,0x58ea76e0,0xd204fedb,0x3b9a01e3,0xdf2847d6,0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x4089bfd70d34169a,0x6efdfefbc17d1be8,0xd204fedb58ea76e0,0xdf2847d63b9a01e3,0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x169a,0xd34,0xbfd7,0x4089,0x1be8,0xc17d,0xfefb,0x6efd,0x76e0,0x58ea,0xfedb,0xd204,0x1e3,0x3b9a,0x47d6,0xdf28,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xd34169a,0x4089bfd7,0xc17d1be8,0x6efdfefb,0x58ea76e0,0xd204fedb,0x3b9a01e3,0xdf2847d6,0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x4089bfd70d34169a,0x6efdfefbc17d1be8,0xd204fedb58ea76e0,0xdf2847d63b9a01e3,0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xb4d,0x869a,0xdfeb,0x2044,0x8df4,0xe0be,0xff7d,0x377e,0x3b70,0xac75,0x7f6d,0xe902,0xf1,0x1dcd,0x23eb,0x6f94,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x869a0b4d,0x2044dfeb,0xe0be8df4,0x377eff7d,0xac753b70,0xe9027f6d,0x1dcd00f1,0x6f9423eb,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x2044dfeb869a0b4d,0x377eff7de0be8df4,0xe9027f6dac753b70,0x6f9423eb1dcd00f1,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -17, ._mp_d = (mp_limb_t[]) {0x2412,0x6ec4,0x4dda,0x2cde,0x281d,0xaaa7,0x3a33,0xc1d6,0x5c26,0x22e3,0x816d,0x13fb,0xac81,0x58e8,0xd1a7,0xadaa,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -9, ._mp_d = (mp_limb_t[]) {0x6ec42412,0x2cde4dda,0xaaa7281d,0xc1d63a33,0x22e35c26,0x13fb816d,0x58e8ac81,0xadaad1a7,0xc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -5, ._mp_d = (mp_limb_t[]) {0x2cde4dda6ec42412,0xc1d63a33aaa7281d,0x13fb816d22e35c26,0xadaad1a758e8ac81,0xc}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x1f45,0x5630,0xd526,0x9cc7,0x1aab,0x114d,0x87b3,0xbb27,0xc6b6,0xe50,0x8bb4,0x813f,0xff7a,0xf810,0xa8d3,0x66ee,0xfffc,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x35f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x56301f45,0x9cc7d526,0x114d1aab,0xbb2787b3,0xe50c6b6,0x813f8bb4,0xf810ff7a,0x66eea8d3,0xfffffffc,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x35fffff}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9cc7d52656301f45,0xbb2787b3114d1aab,0x813f8bb40e50c6b6,0x66eea8d3f810ff7a,0xfffffffffffffffc,0xffffffffffffffff,0xffffffffffffffff,0x35fffffffffffff}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xb4d,0x869a,0xdfeb,0x2044,0x8df4,0xe0be,0xff7d,0x377e,0x3b70,0xac75,0x7f6d,0xe902,0xf1,0x1dcd,0x23eb,0x6f94,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x869a0b4d,0x2044dfeb,0xe0be8df4,0x377eff7d,0xac753b70,0xe9027f6d,0x1dcd00f1,0x6f9423eb,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x2044dfeb869a0b4d,0x377eff7de0be8df4,0xe9027f6dac753b70,0x6f9423eb1dcd00f1,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x94}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x94}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x94}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x233f,0x38d9,0x6fc1,0xa333,0xaeb,0xce6a,0x2a4c,0xa1c1,0x274c,0xa9fc,0xd4c6,0xb0b3,0x555b,0x7a48,0x411a,0x2bdc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x38d9233f,0xa3336fc1,0xce6a0aeb,0xa1c12a4c,0xa9fc274c,0xb0b3d4c6,0x7a48555b,0x2bdc411a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa3336fc138d9233f,0xa1c12a4cce6a0aeb,0xb0b3d4c6a9fc274c,0x2bdc411a7a48555b}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x169a,0xd34,0xbfd7,0x4089,0x1be8,0xc17d,0xfefb,0x6efd,0x76e0,0x58ea,0xfedb,0xd204,0x1e3,0x3b9a,0x47d6,0xdf28,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xd34169a,0x4089bfd7,0xc17d1be8,0x6efdfefb,0x58ea76e0,0xd204fedb,0x3b9a01e3,0xdf2847d6,0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x4089bfd70d34169a,0x6efdfefbc17d1be8,0xd204fedb58ea76e0,0xdf2847d63b9a01e3,0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -17, ._mp_d = (mp_limb_t[]) {0x2412,0x6ec4,0x4dda,0x2cde,0x281d,0xaaa7,0x3a33,0xc1d6,0x5c26,0x22e3,0x816d,0x13fb,0xac81,0x58e8,0xd1a7,0xadaa,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -9, ._mp_d = (mp_limb_t[]) {0x6ec42412,0x2cde4dda,0xaaa7281d,0xc1d63a33,0x22e35c26,0x13fb816d,0x58e8ac81,0xadaad1a7,0xc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -5, ._mp_d = (mp_limb_t[]) {0x2cde4dda6ec42412,0xc1d63a33aaa7281d,0x13fb816d22e35c26,0xadaad1a758e8ac81,0xc}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x94}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x94}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x94}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 37}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xc31e,0x416e,0xe2a5,0x25c2,0xa926,0x45fa,0x578b,0xf395,0x6ac9,0x7901,0xd14d,0xd089,0x9e5c,0xe062,0xbc4,0x583b,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x416ec31e,0x25c2e2a5,0x45faa926,0xf395578b,0x79016ac9,0xd089d14d,0xe0629e5c,0x583b0bc4,0x3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x25c2e2a5416ec31e,0xf395578b45faa926,0xd089d14d79016ac9,0x583b0bc4e0629e5c,0x3}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xc31e,0x416e,0xe2a5,0x25c2,0xa926,0x45fa,0x578b,0xf395,0x6ac9,0x7901,0xd14d,0xd089,0x9e5c,0xe062,0xbc4,0x583b,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x416ec31e,0x25c2e2a5,0x45faa926,0xf395578b,0x79016ac9,0xd089d14d,0xe0629e5c,0x583b0bc4,0x3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x25c2e2a5416ec31e,0xf395578b45faa926,0xd089d14d79016ac9,0x583b0bc4e0629e5c,0x3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x618f,0xa0b7,0x7152,0x12e1,0x5493,0xa2fd,0xabc5,0xf9ca,0xb564,0xbc80,0xe8a6,0x6844,0x4f2e,0x7031,0x85e2,0xac1d,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xa0b7618f,0x12e17152,0xa2fd5493,0xf9caabc5,0xbc80b564,0x6844e8a6,0x70314f2e,0xac1d85e2,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x12e17152a0b7618f,0xf9caabc5a2fd5493,0x6844e8a6bc80b564,0xac1d85e270314f2e,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x4c2,0x1467,0x5829,0xf8ca,0x2d31,0xb661,0xa4a1,0x434a,0x25cb,0xbffa,0xe232,0x8565,0x2305,0xe42,0x3f64,0x710,0x11}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x146704c2,0xf8ca5829,0xb6612d31,0x434aa4a1,0xbffa25cb,0x8565e232,0xe422305,0x7103f64,0x11}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xf8ca5829146704c2,0x434aa4a1b6612d31,0x8565e232bffa25cb,0x7103f640e422305,0x11}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -32, ._mp_d = (mp_limb_t[]) {0x3b03,0xe541,0x6454,0x6f9,0x3808,0xb93,0x7509,0x2b52,0xed1,0xf4fe,0x8961,0x4869,0x4671,0xdd21,0x4c4c,0x70b0,0xfff9,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x35f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0xe5413b03,0x6f96454,0xb933808,0x2b527509,0xf4fe0ed1,0x48698961,0xdd214671,0x70b04c4c,0xfffffff9,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x35fffff}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x6f96454e5413b03,0x2b5275090b933808,0x48698961f4fe0ed1,0x70b04c4cdd214671,0xfffffffffffffff9,0xffffffffffffffff,0xffffffffffffffff,0x35fffffffffffff}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x618f,0xa0b7,0x7152,0x12e1,0x5493,0xa2fd,0xabc5,0xf9ca,0xb564,0xbc80,0xe8a6,0x6844,0x4f2e,0x7031,0x85e2,0xac1d,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xa0b7618f,0x12e17152,0xa2fd5493,0xf9caabc5,0xbc80b564,0x6844e8a6,0x70314f2e,0xac1d85e2,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x12e17152a0b7618f,0xf9caabc5a2fd5493,0x6844e8a6bc80b564,0xac1d85e270314f2e,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0xf4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0xf4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0xf4}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0xe953,0xf5ac,0x2ee2,0xc962,0x459d,0xd9a0,0xd761,0x7c5a,0x8268,0xcf36,0x9b08,0xb7a6,0xbd23,0x7e04,0xe324,0x23ba}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xf5ace953,0xc9622ee2,0xd9a0459d,0x7c5ad761,0xcf368268,0xb7a69b08,0x7e04bd23,0x23bae324}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xc9622ee2f5ace953,0x7c5ad761d9a0459d,0xb7a69b08cf368268,0x23bae3247e04bd23}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xc31e,0x416e,0xe2a5,0x25c2,0xa926,0x45fa,0x578b,0xf395,0x6ac9,0x7901,0xd14d,0xd089,0x9e5c,0xe062,0xbc4,0x583b,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x416ec31e,0x25c2e2a5,0x45faa926,0xf395578b,0x79016ac9,0xd089d14d,0xe0629e5c,0x583b0bc4,0x3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x25c2e2a5416ec31e,0xf395578b45faa926,0xd089d14d79016ac9,0x583b0bc4e0629e5c,0x3}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x4c2,0x1467,0x5829,0xf8ca,0x2d31,0xb661,0xa4a1,0x434a,0x25cb,0xbffa,0xe232,0x8565,0x2305,0xe42,0x3f64,0x710,0x11}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x146704c2,0xf8ca5829,0xb6612d31,0x434aa4a1,0xbffa25cb,0x8565e232,0xe422305,0x7103f64,0x11}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xf8ca5829146704c2,0x434aa4a1b6612d31,0x8565e232bffa25cb,0x7103f640e422305,0x11}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0xf4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0xf4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0xf4}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 61}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xf94,0x28f0,0x8955,0xb7aa,0x538f,0x65b6,0x5a15,0xd3b4,0x9667,0xcba4,0x3554,0x11f8,0x25a9,0x6265,0x196a,0x83d,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x28f00f94,0xb7aa8955,0x65b6538f,0xd3b45a15,0xcba49667,0x11f83554,0x626525a9,0x83d196a,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xb7aa895528f00f94,0xd3b45a1565b6538f,0x11f83554cba49667,0x83d196a626525a9,0x1}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xf94,0x28f0,0x8955,0xb7aa,0x538f,0x65b6,0x5a15,0xd3b4,0x9667,0xcba4,0x3554,0x11f8,0x25a9,0x6265,0x196a,0x83d,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x28f00f94,0xb7aa8955,0x65b6538f,0xd3b45a15,0xcba49667,0x11f83554,0x626525a9,0x83d196a,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xb7aa895528f00f94,0xd3b45a1565b6538f,0x11f83554cba49667,0x83d196a626525a9,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7ca,0x9478,0x44aa,0xdbd5,0x29c7,0xb2db,0x2d0a,0xe9da,0x4b33,0x65d2,0x1aaa,0x88fc,0x92d4,0x3132,0x8cb5,0x841e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x947807ca,0xdbd544aa,0xb2db29c7,0xe9da2d0a,0x65d24b33,0x88fc1aaa,0x313292d4,0x841e8cb5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xdbd544aa947807ca,0xe9da2d0ab2db29c7,0x88fc1aaa65d24b33,0x841e8cb5313292d4}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -17, ._mp_d = (mp_limb_t[]) {0x5409,0xed37,0x7339,0xcbe7,0x95ab,0x2582,0x18fa,0xcc9d,0x13ae,0x2543,0xaefd,0xb168,0xfdbc,0x68b,0xc9af,0x6d9d,0x6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -9, ._mp_d = (mp_limb_t[]) {0xed375409,0xcbe77339,0x258295ab,0xcc9d18fa,0x254313ae,0xb168aefd,0x68bfdbc,0x6d9dc9af,0x6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -5, ._mp_d = (mp_limb_t[]) {0xcbe77339ed375409,0xcc9d18fa258295ab,0xb168aefd254313ae,0x6d9dc9af068bfdbc,0x6}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -32, ._mp_d = (mp_limb_t[]) {0x7013,0x423f,0x42b7,0x3f3d,0x82a,0x9883,0x52bf,0xfede,0x8018,0xa449,0xf571,0xb8a,0x3139,0xbe7,0x439d,0x9e1f,0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xd8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0x423f7013,0x3f3d42b7,0x9883082a,0xfede52bf,0xa4498018,0xb8af571,0xbe73139,0x9e1f439d,0x2,0x0,0x0,0x0,0x0,0x0,0x0,0xd80000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x3f3d42b7423f7013,0xfede52bf9883082a,0xb8af571a4498018,0x9e1f439d0be73139,0x2,0x0,0x0,0xd8000000000000}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7ca,0x9478,0x44aa,0xdbd5,0x29c7,0xb2db,0x2d0a,0xe9da,0x4b33,0x65d2,0x1aaa,0x88fc,0x92d4,0x3132,0x8cb5,0x841e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x947807ca,0xdbd544aa,0xb2db29c7,0xe9da2d0a,0x65d24b33,0x88fc1aaa,0x313292d4,0x841e8cb5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xdbd544aa947807ca,0xe9da2d0ab2db29c7,0x88fc1aaa65d24b33,0x841e8cb5313292d4}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x61}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x61}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x61}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xca2d,0x34af,0xea29,0x177b,0x91ed,0x86ca,0x588a,0xe94d,0x55df,0x4621,0xa1e4,0x67d7,0xb617,0x6a1,0x88f5,0x87b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x34afca2d,0x177bea29,0x86ca91ed,0xe94d588a,0x462155df,0x67d7a1e4,0x6a1b617,0x87b88f5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x177bea2934afca2d,0xe94d588a86ca91ed,0x67d7a1e4462155df,0x87b88f506a1b617}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xf94,0x28f0,0x8955,0xb7aa,0x538f,0x65b6,0x5a15,0xd3b4,0x9667,0xcba4,0x3554,0x11f8,0x25a9,0x6265,0x196a,0x83d,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x28f00f94,0xb7aa8955,0x65b6538f,0xd3b45a15,0xcba49667,0x11f83554,0x626525a9,0x83d196a,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xb7aa895528f00f94,0xd3b45a1565b6538f,0x11f83554cba49667,0x83d196a626525a9,0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -17, ._mp_d = (mp_limb_t[]) {0x5409,0xed37,0x7339,0xcbe7,0x95ab,0x2582,0x18fa,0xcc9d,0x13ae,0x2543,0xaefd,0xb168,0xfdbc,0x68b,0xc9af,0x6d9d,0x6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -9, ._mp_d = (mp_limb_t[]) {0xed375409,0xcbe77339,0x258295ab,0xcc9d18fa,0x254313ae,0xb168aefd,0x68bfdbc,0x6d9dc9af,0x6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -5, ._mp_d = (mp_limb_t[]) {0xcbe77339ed375409,0xcc9d18fa258295ab,0xb168aefd254313ae,0x6d9dc9af068bfdbc,0x6}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x61}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x61}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x61}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 97}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1e34,0xdf45,0xcfa6,0xa203,0xe18a,0xd8c5,0x1d42,0x7a30,0x86ce,0x7a12,0xf933,0x741d,0x6b48,0xe48e,0xbf65,0x1854}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdf451e34,0xa203cfa6,0xd8c5e18a,0x7a301d42,0x7a1286ce,0x741df933,0xe48e6b48,0x1854bf65}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa203cfa6df451e34,0x7a301d42d8c5e18a,0x741df9337a1286ce,0x1854bf65e48e6b48}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1e34,0xdf45,0xcfa6,0xa203,0xe18a,0xd8c5,0x1d42,0x7a30,0x86ce,0x7a12,0xf933,0x741d,0x6b48,0xe48e,0xbf65,0x1854}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdf451e34,0xa203cfa6,0xd8c5e18a,0x7a301d42,0x7a1286ce,0x741df933,0xe48e6b48,0x1854bf65}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa203cfa6df451e34,0x7a301d42d8c5e18a,0x741df9337a1286ce,0x1854bf65e48e6b48}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8f1a,0x6fa2,0xe7d3,0x5101,0xf0c5,0x6c62,0xea1,0x3d18,0x4367,0xbd09,0xfc99,0x3a0e,0x35a4,0xf247,0x5fb2,0xc2a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6fa28f1a,0x5101e7d3,0x6c62f0c5,0x3d180ea1,0xbd094367,0x3a0efc99,0xf24735a4,0xc2a5fb2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x5101e7d36fa28f1a,0x3d180ea16c62f0c5,0x3a0efc99bd094367,0xc2a5fb2f24735a4}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xcf03,0xa322,0x8523,0x93d,0x3bc,0x4b50,0x33ca,0x56b5,0x863f,0x87c8,0x38bf,0x98c6,0x8ce8,0xfab7,0xfc02,0x78ed}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa322cf03,0x93d8523,0x4b5003bc,0x56b533ca,0x87c8863f,0x98c638bf,0xfab78ce8,0x78edfc02}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x93d8523a322cf03,0x56b533ca4b5003bc,0x98c638bf87c8863f,0x78edfc02fab78ce8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x24ed,0x1400,0x74a1,0x1310,0xce8a,0x1c0d,0x512a,0x3500,0x2451,0x6992,0x892c,0x3cdb,0x45d8,0x520,0x420,0xf11f,0x6cb,0xbe4d,0xd06c,0xcbe4,0x4d06,0x6cbe,0xe4d0,0x6cb,0xbe4d,0xd06c,0xcbe4,0x4d06,0x6cbe,0xe4d0,0x6cb,0x15}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x140024ed,0x131074a1,0x1c0dce8a,0x3500512a,0x69922451,0x3cdb892c,0x52045d8,0xf11f0420,0xbe4d06cb,0xcbe4d06c,0x6cbe4d06,0x6cbe4d0,0xd06cbe4d,0x4d06cbe4,0xe4d06cbe,0x1506cb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x131074a1140024ed,0x3500512a1c0dce8a,0x3cdb892c69922451,0xf11f0420052045d8,0xcbe4d06cbe4d06cb,0x6cbe4d06cbe4d06,0x4d06cbe4d06cbe4d,0x1506cbe4d06cbe}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8f1a,0x6fa2,0xe7d3,0x5101,0xf0c5,0x6c62,0xea1,0x3d18,0x4367,0xbd09,0xfc99,0x3a0e,0x35a4,0xf247,0x5fb2,0xc2a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6fa28f1a,0x5101e7d3,0x6c62f0c5,0x3d180ea1,0xbd094367,0x3a0efc99,0xf24735a4,0xc2a5fb2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x5101e7d36fa28f1a,0x3d180ea16c62f0c5,0x3a0efc99bd094367,0xc2a5fb2f24735a4}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xb}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0x98b3,0xd2e,0x314c,0x5199,0x7a5a,0xb592,0xbd65,0x1ef7,0x7d32,0x94fd,0x6cfe,0x68e3,0xcda6,0x8d91,0xfb73,0x88}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xd2e98b3,0x5199314c,0xb5927a5a,0x1ef7bd65,0x94fd7d32,0x68e36cfe,0x8d91cda6,0x88fb73}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x5199314c0d2e98b3,0x1ef7bd65b5927a5a,0x68e36cfe94fd7d32,0x88fb738d91cda6}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1e34,0xdf45,0xcfa6,0xa203,0xe18a,0xd8c5,0x1d42,0x7a30,0x86ce,0x7a12,0xf933,0x741d,0x6b48,0xe48e,0xbf65,0x1854}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdf451e34,0xa203cfa6,0xd8c5e18a,0x7a301d42,0x7a1286ce,0x741df933,0xe48e6b48,0x1854bf65}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa203cfa6df451e34,0x7a301d42d8c5e18a,0x741df9337a1286ce,0x1854bf65e48e6b48}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xcf03,0xa322,0x8523,0x93d,0x3bc,0x4b50,0x33ca,0x56b5,0x863f,0x87c8,0x38bf,0x98c6,0x8ce8,0xfab7,0xfc02,0x78ed}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa322cf03,0x93d8523,0x4b5003bc,0x56b533ca,0x87c8863f,0x98c638bf,0xfab78ce8,0x78edfc02}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x93d8523a322cf03,0x56b533ca4b5003bc,0x98c638bf87c8863f,0x78edfc02fab78ce8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xb}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 113}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x779c,0xdc0d,0x3c7f,0x2e51,0x85b9,0xfb7d,0xb29e,0xd38c,0x64bb,0x9ea5,0xa4fa,0x79a3,0xdf70,0xf359,0xca21,0xa977,0x6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xdc0d779c,0x2e513c7f,0xfb7d85b9,0xd38cb29e,0x9ea564bb,0x79a3a4fa,0xf359df70,0xa977ca21,0x6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x2e513c7fdc0d779c,0xd38cb29efb7d85b9,0x79a3a4fa9ea564bb,0xa977ca21f359df70,0x6}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x779c,0xdc0d,0x3c7f,0x2e51,0x85b9,0xfb7d,0xb29e,0xd38c,0x64bb,0x9ea5,0xa4fa,0x79a3,0xdf70,0xf359,0xca21,0xa977,0x6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xdc0d779c,0x2e513c7f,0xfb7d85b9,0xd38cb29e,0x9ea564bb,0x79a3a4fa,0xf359df70,0xa977ca21,0x6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x2e513c7fdc0d779c,0xd38cb29efb7d85b9,0x79a3a4fa9ea564bb,0xa977ca21f359df70,0x6}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xbbce,0xee06,0x9e3f,0x9728,0xc2dc,0x7dbe,0x594f,0xe9c6,0xb25d,0x4f52,0xd27d,0x3cd1,0xefb8,0xf9ac,0xe510,0x54bb,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xee06bbce,0x97289e3f,0x7dbec2dc,0xe9c6594f,0x4f52b25d,0x3cd1d27d,0xf9acefb8,0x54bbe510,0x3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x97289e3fee06bbce,0xe9c6594f7dbec2dc,0x3cd1d27d4f52b25d,0x54bbe510f9acefb8,0x3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -17, ._mp_d = (mp_limb_t[]) {0x8db1,0xaa9d,0x1944,0x727a,0xc6c3,0xffc0,0x39b4,0x5643,0x2de0,0xb534,0xc0a9,0x5371,0x8e58,0x80df,0xa6c4,0x5a83,0x36}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -9, ._mp_d = (mp_limb_t[]) {0xaa9d8db1,0x727a1944,0xffc0c6c3,0x564339b4,0xb5342de0,0x5371c0a9,0x80df8e58,0x5a83a6c4,0x36}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -5, ._mp_d = (mp_limb_t[]) {0x727a1944aa9d8db1,0x564339b4ffc0c6c3,0x5371c0a9b5342de0,0x5a83a6c480df8e58,0x36}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -32, ._mp_d = (mp_limb_t[]) {0x9c90,0x5de8,0xf815,0x67c5,0x989,0xc9,0x7c9e,0x180b,0x526d,0xdf5a,0x3386,0xea88,0x580a,0x24c5,0x5507,0x3bad,0x10,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x438}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0x5de89c90,0x67c5f815,0xc90989,0x180b7c9e,0xdf5a526d,0xea883386,0x24c5580a,0x3bad5507,0x10,0x0,0x0,0x0,0x0,0x0,0x0,0x4380000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x67c5f8155de89c90,0x180b7c9e00c90989,0xea883386df5a526d,0x3bad550724c5580a,0x10,0x0,0x0,0x438000000000000}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xbbce,0xee06,0x9e3f,0x9728,0xc2dc,0x7dbe,0x594f,0xe9c6,0xb25d,0x4f52,0xd27d,0x3cd1,0xefb8,0xf9ac,0xe510,0x54bb,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xee06bbce,0x97289e3f,0x7dbec2dc,0xe9c6594f,0x4f52b25d,0x3cd1d27d,0xf9acefb8,0x54bbe510,0x3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x97289e3fee06bbce,0xe9c6594f7dbec2dc,0x3cd1d27d4f52b25d,0x54bbe510f9acefb8,0x3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2e9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2e9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2e9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xa1f8,0x1530,0xa6be,0x126c,0xfd3b,0xbdd9,0xb3bc,0x8495,0x5457,0x1985,0xcfae,0xf440,0x4ea6,0x84ba,0x6881,0x2eb1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1530a1f8,0x126ca6be,0xbdd9fd3b,0x8495b3bc,0x19855457,0xf440cfae,0x84ba4ea6,0x2eb16881}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x126ca6be1530a1f8,0x8495b3bcbdd9fd3b,0xf440cfae19855457,0x2eb1688184ba4ea6}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x779c,0xdc0d,0x3c7f,0x2e51,0x85b9,0xfb7d,0xb29e,0xd38c,0x64bb,0x9ea5,0xa4fa,0x79a3,0xdf70,0xf359,0xca21,0xa977,0x6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xdc0d779c,0x2e513c7f,0xfb7d85b9,0xd38cb29e,0x9ea564bb,0x79a3a4fa,0xf359df70,0xa977ca21,0x6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x2e513c7fdc0d779c,0xd38cb29efb7d85b9,0x79a3a4fa9ea564bb,0xa977ca21f359df70,0x6}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -17, ._mp_d = (mp_limb_t[]) {0x8db1,0xaa9d,0x1944,0x727a,0xc6c3,0xffc0,0x39b4,0x5643,0x2de0,0xb534,0xc0a9,0x5371,0x8e58,0x80df,0xa6c4,0x5a83,0x36}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -9, ._mp_d = (mp_limb_t[]) {0xaa9d8db1,0x727a1944,0xffc0c6c3,0x564339b4,0xb5342de0,0x5371c0a9,0x80df8e58,0x5a83a6c4,0x36}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -5, ._mp_d = (mp_limb_t[]) {0x727a1944aa9d8db1,0x564339b4ffc0c6c3,0x5371c0a9b5342de0,0x5a83a6c480df8e58,0x36}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2e9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2e9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2e9}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 149}}; +const quat_left_ideal_t CONNECTING_IDEALS[7] = {{{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb4ca,0xbe8d,0xcee3,0x9669,0x9cb,0x86eb,0xf6f9,0x374b,0x2e68,0xd1f2,0x3315,0xab5f,0x2208,0xa9c9,0x686e,0x2541}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbe8db4ca,0x9669cee3,0x86eb09cb,0x374bf6f9,0xd1f22e68,0xab5f3315,0xa9c92208,0x2541686e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x9669cee3be8db4ca,0x374bf6f986eb09cb,0xab5f3315d1f22e68,0x2541686ea9c92208}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdb03,0x2777,0xbc36,0x4be5,0x38dd,0xd474,0x83b4,0x41a7,0x5426,0xa361,0x1f00,0xc617,0xe350,0x8cb4,0x2b1c,0xaa2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2777db03,0x4be5bc36,0xd47438dd,0x41a783b4,0xa3615426,0xc6171f00,0x8cb4e350,0xaa22b1c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4be5bc362777db03,0x41a783b4d47438dd,0xc6171f00a3615426,0xaa22b1c8cb4e350}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb4ca,0xbe8d,0xcee3,0x9669,0x9cb,0x86eb,0xf6f9,0x374b,0x2e68,0xd1f2,0x3315,0xab5f,0x2208,0xa9c9,0x686e,0x2541}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbe8db4ca,0x9669cee3,0x86eb09cb,0x374bf6f9,0xd1f22e68,0xab5f3315,0xa9c92208,0x2541686e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x9669cee3be8db4ca,0x374bf6f986eb09cb,0xab5f3315d1f22e68,0x2541686ea9c92208}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd9c7,0x9715,0x12ad,0x4a84,0xd0ee,0xb276,0x7344,0xf5a4,0xda41,0x2e90,0x1415,0xe548,0x3eb7,0x1d14,0x3d52,0x1a9f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9715d9c7,0x4a8412ad,0xb276d0ee,0xf5a47344,0x2e90da41,0xe5481415,0x1d143eb7,0x1a9f3d52}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4a8412ad9715d9c7,0xf5a47344b276d0ee,0xe54814152e90da41,0x1a9f3d521d143eb7}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xda65,0xdf46,0xe771,0xcb34,0x84e5,0xc375,0xfb7c,0x1ba5,0x1734,0xe8f9,0x998a,0x55af,0x9104,0x54e4,0xb437,0x12a0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdf46da65,0xcb34e771,0xc37584e5,0x1ba5fb7c,0xe8f91734,0x55af998a,0x54e49104,0x12a0b437}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xcb34e771df46da65,0x1ba5fb7cc37584e5,0x55af998ae8f91734,0x12a0b43754e49104}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8412,0x5a4d,0xe982,0x7e48,0x619e,0x6d03,0x297c,0x2598,0x6aff,0x24ff,0xc89e,0x51c8,0x6f8,0x6965,0x7e7b,0x13de}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x5a4d8412,0x7e48e982,0x6d03619e,0x2598297c,0x24ff6aff,0x51c8c89e,0x696506f8,0x13de7e7b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7e48e9825a4d8412,0x2598297c6d03619e,0x51c8c89e24ff6aff,0x13de7e7b696506f8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6e7d,0xd8b2,0x8be,0xf2e3,0x7c3e,0x1572,0x7609,0xf4ae,0x8366,0xb93e,0x53ec,0x9b03,0x6573,0xae18,0x41b0,0x707}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd8b26e7d,0xf2e308be,0x15727c3e,0xf4ae7609,0xb93e8366,0x9b0353ec,0xae186573,0x70741b0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xf2e308bed8b26e7d,0xf4ae760915727c3e,0x9b0353ecb93e8366,0x70741b0ae186573}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8412,0x5a4d,0xe982,0x7e48,0x619e,0x6d03,0x297c,0x2598,0x6aff,0x24ff,0xc89e,0x51c8,0x6f8,0x6965,0x7e7b,0x13de}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x5a4d8412,0x7e48e982,0x6d03619e,0x2598297c,0x24ff6aff,0x51c8c89e,0x696506f8,0x13de7e7b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7e48e9825a4d8412,0x2598297c6d03619e,0x51c8c89e24ff6aff,0x13de7e7b696506f8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1595,0x819b,0xe0c3,0x8b65,0xe55f,0x5790,0xb373,0x30e9,0xe798,0x6bc0,0x74b1,0xb6c5,0xa184,0xbb4c,0x3cca,0xcd7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x819b1595,0x8b65e0c3,0x5790e55f,0x30e9b373,0x6bc0e798,0xb6c574b1,0xbb4ca184,0xcd73cca}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8b65e0c3819b1595,0x30e9b3735790e55f,0xb6c574b16bc0e798,0xcd73ccabb4ca184}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc209,0x2d26,0x74c1,0x3f24,0xb0cf,0x3681,0x14be,0x92cc,0xb57f,0x127f,0x644f,0x28e4,0x837c,0xb4b2,0x3f3d,0x9ef}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2d26c209,0x3f2474c1,0x3681b0cf,0x92cc14be,0x127fb57f,0x28e4644f,0xb4b2837c,0x9ef3f3d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3f2474c12d26c209,0x92cc14be3681b0cf,0x28e4644f127fb57f,0x9ef3f3db4b2837c}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb376,0x7694,0x643d,0xf407,0xf5c,0x6e43,0xd345,0x5c1f,0xecc4,0x777d,0x1005,0x24fe,0x88e4,0x536a,0x5c85,0xe09}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x7694b376,0xf407643d,0x6e430f5c,0x5c1fd345,0x777decc4,0x24fe1005,0x536a88e4,0xe095c85}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xf407643d7694b376,0x5c1fd3456e430f5c,0x24fe1005777decc4,0xe095c85536a88e4}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9427,0xa69c,0xda24,0xb3a7,0x4f9a,0x22fc,0xa39a,0xcb05,0xd93e,0x923d,0xb97d,0xad95,0x3374,0x96bd,0xbdeb,0x51}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa69c9427,0xb3a7da24,0x22fc4f9a,0xcb05a39a,0x923dd93e,0xad95b97d,0x96bd3374,0x51bdeb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb3a7da24a69c9427,0xcb05a39a22fc4f9a,0xad95b97d923dd93e,0x51bdeb96bd3374}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb376,0x7694,0x643d,0xf407,0xf5c,0x6e43,0xd345,0x5c1f,0xecc4,0x777d,0x1005,0x24fe,0x88e4,0x536a,0x5c85,0xe09}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x7694b376,0xf407643d,0x6e430f5c,0x5c1fd345,0x777decc4,0x24fe1005,0x536a88e4,0xe095c85}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xf407643d7694b376,0x5c1fd3456e430f5c,0x24fe1005777decc4,0xe095c85536a88e4}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1f4f,0xcff8,0x8a18,0x405f,0xbfc2,0x4b46,0x2fab,0x911a,0x1385,0xe540,0x5687,0x7768,0x556f,0xbcad,0x9e99,0xdb7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xcff81f4f,0x405f8a18,0x4b46bfc2,0x911a2fab,0xe5401385,0x77685687,0xbcad556f,0xdb79e99}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x405f8a18cff81f4f,0x911a2fab4b46bfc2,0x77685687e5401385,0xdb79e99bcad556f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x59bb,0xbb4a,0xb21e,0x7a03,0x87ae,0xb721,0xe9a2,0x2e0f,0xf662,0xbbbe,0x802,0x127f,0x4472,0xa9b5,0xae42,0x704}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbb4a59bb,0x7a03b21e,0xb72187ae,0x2e0fe9a2,0xbbbef662,0x127f0802,0xa9b54472,0x704ae42}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7a03b21ebb4a59bb,0x2e0fe9a2b72187ae,0x127f0802bbbef662,0x704ae42a9b54472}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7a2a,0xcc34,0x1fb9,0x5b4e,0x6acf,0x4f0f,0xbb68,0x211d,0xa57b,0xae74,0x782,0xa512,0xd75c,0xb576,0x5af5,0xa035}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xcc347a2a,0x5b4e1fb9,0x4f0f6acf,0x211dbb68,0xae74a57b,0xa5120782,0xb576d75c,0xa0355af5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x5b4e1fb9cc347a2a,0x211dbb684f0f6acf,0xa5120782ae74a57b,0xa0355af5b576d75c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xa3e3,0x12fb,0x32f3,0xb40f,0x4bbe,0x537d,0xbefc,0xdda9,0x8954,0xaca9,0xaaf3,0xc020,0x17da,0xf48f,0x88fd,0x21a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x12fba3e3,0xb40f32f3,0x537d4bbe,0xdda9befc,0xaca98954,0xc020aaf3,0xf48f17da,0x21a88fd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb40f32f312fba3e3,0xdda9befc537d4bbe,0xc020aaf3aca98954,0x21a88fdf48f17da}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7a2a,0xcc34,0x1fb9,0x5b4e,0x6acf,0x4f0f,0xbb68,0x211d,0xa57b,0xae74,0x782,0xa512,0xd75c,0xb576,0x5af5,0xa035}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xcc347a2a,0x5b4e1fb9,0x4f0f6acf,0x211dbb68,0xae74a57b,0xa5120782,0xb576d75c,0xa0355af5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x5b4e1fb9cc347a2a,0x211dbb684f0f6acf,0xa5120782ae74a57b,0xa0355af5b576d75c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd647,0xb938,0xecc6,0xa73e,0x1f10,0xfb92,0xfc6b,0x4373,0x1c26,0x1cb,0x5c8f,0xe4f1,0xbf81,0xc0e7,0xd1f7,0x9e1a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb938d647,0xa73eecc6,0xfb921f10,0x4373fc6b,0x1cb1c26,0xe4f15c8f,0xc0e7bf81,0x9e1ad1f7}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa73eecc6b938d647,0x4373fc6bfb921f10,0xe4f15c8f01cb1c26,0x9e1ad1f7c0e7bf81}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3d15,0xe61a,0xfdc,0xada7,0xb567,0x2787,0xddb4,0x908e,0x52bd,0x573a,0x3c1,0x5289,0x6bae,0xdabb,0xad7a,0x501a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe61a3d15,0xada70fdc,0x2787b567,0x908eddb4,0x573a52bd,0x528903c1,0xdabb6bae,0x501aad7a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xada70fdce61a3d15,0x908eddb42787b567,0x528903c1573a52bd,0x501aad7adabb6bae}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x81d6,0x1f29,0xf1a,0x365e,0x8f4a,0x95c8,0x38b1,0x87f1,0xb9ff,0x9cca,0x8239,0x1cb1,0x70f,0x8fde,0x5f3f,0x25be}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1f2981d6,0x365e0f1a,0x95c88f4a,0x87f138b1,0x9ccab9ff,0x1cb18239,0x8fde070f,0x25be5f3f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x365e0f1a1f2981d6,0x87f138b195c88f4a,0x1cb182399ccab9ff,0x25be5f3f8fde070f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xbe61,0x7c4c,0xa49c,0x48f9,0x3fb4,0xb80a,0xf823,0xd427,0x593e,0x9ec7,0x3a56,0xda06,0x551e,0x2875,0xc2cb,0xfb0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x7c4cbe61,0x48f9a49c,0xb80a3fb4,0xd427f823,0x9ec7593e,0xda063a56,0x2875551e,0xfb0c2cb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x48f9a49c7c4cbe61,0xd427f823b80a3fb4,0xda063a569ec7593e,0xfb0c2cb2875551e}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x81d6,0x1f29,0xf1a,0x365e,0x8f4a,0x95c8,0x38b1,0x87f1,0xb9ff,0x9cca,0x8239,0x1cb1,0x70f,0x8fde,0x5f3f,0x25be}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1f2981d6,0x365e0f1a,0x95c88f4a,0x87f138b1,0x9ccab9ff,0x1cb18239,0x8fde070f,0x25be5f3f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x365e0f1a1f2981d6,0x87f138b195c88f4a,0x1cb182399ccab9ff,0x25be5f3f8fde070f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc375,0xa2dc,0x6a7d,0xed64,0x4f95,0xddbe,0x408d,0xb3c9,0x60c0,0xfe03,0x47e2,0x42ab,0xb1f0,0x6768,0x9c74,0x160d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa2dcc375,0xed646a7d,0xddbe4f95,0xb3c9408d,0xfe0360c0,0x42ab47e2,0x6768b1f0,0x160d9c74}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xed646a7da2dcc375,0xb3c9408dddbe4f95,0x42ab47e2fe0360c0,0x160d9c746768b1f0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc0eb,0xf94,0x78d,0x1b2f,0x47a5,0xcae4,0x9c58,0xc3f8,0x5cff,0xce65,0xc11c,0x8e58,0x387,0xc7ef,0x2f9f,0x12df}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf94c0eb,0x1b2f078d,0xcae447a5,0xc3f89c58,0xce655cff,0x8e58c11c,0xc7ef0387,0x12df2f9f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1b2f078d0f94c0eb,0xc3f89c58cae447a5,0x8e58c11cce655cff,0x12df2f9fc7ef0387}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x5a86,0x1729,0x8ced,0x8280,0xd48f,0x1e0f,0x5e39,0x24b3,0x74ba,0xa294,0xd9f3,0x4e2e,0x8cc1,0xee6b,0xdd2,0x3079}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x17295a86,0x82808ced,0x1e0fd48f,0x24b35e39,0xa29474ba,0x4e2ed9f3,0xee6b8cc1,0x30790dd2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x82808ced17295a86,0x24b35e391e0fd48f,0x4e2ed9f3a29474ba,0x30790dd2ee6b8cc1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9203,0x57ee,0x3867,0xdf50,0xd8ad,0xbe9c,0x9e30,0x7a77,0xcd0f,0x77d9,0xbb7f,0x65f1,0x1b16,0xbbf5,0xe5c0,0x2563}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x57ee9203,0xdf503867,0xbe9cd8ad,0x7a779e30,0x77d9cd0f,0x65f1bb7f,0xbbf51b16,0x2563e5c0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xdf50386757ee9203,0x7a779e30be9cd8ad,0x65f1bb7f77d9cd0f,0x2563e5c0bbf51b16}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x5a86,0x1729,0x8ced,0x8280,0xd48f,0x1e0f,0x5e39,0x24b3,0x74ba,0xa294,0xd9f3,0x4e2e,0x8cc1,0xee6b,0xdd2,0x3079}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x17295a86,0x82808ced,0x1e0fd48f,0x24b35e39,0xa29474ba,0x4e2ed9f3,0xee6b8cc1,0x30790dd2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x82808ced17295a86,0x24b35e391e0fd48f,0x4e2ed9f3a29474ba,0x30790dd2ee6b8cc1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc883,0xbf3a,0x5485,0xa330,0xfbe1,0x5f72,0xc008,0xaa3b,0xa7aa,0x2aba,0x1e74,0xe83d,0x71aa,0x3276,0x2812,0xb15}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbf3ac883,0xa3305485,0x5f72fbe1,0xaa3bc008,0x2abaa7aa,0xe83d1e74,0x327671aa,0xb152812}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa3305485bf3ac883,0xaa3bc0085f72fbe1,0xe83d1e742abaa7aa,0xb152812327671aa}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xad43,0x8b94,0x4676,0xc140,0xea47,0x8f07,0xaf1c,0x1259,0x3a5d,0xd14a,0x6cf9,0xa717,0xc660,0x7735,0x86e9,0x183c}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8b94ad43,0xc1404676,0x8f07ea47,0x1259af1c,0xd14a3a5d,0xa7176cf9,0x7735c660,0x183c86e9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc14046768b94ad43,0x1259af1c8f07ea47,0xa7176cf9d14a3a5d,0x183c86e97735c660}}} +#endif +, &MAXORD_O0}}; +const quat_alg_elem_t CONJUGATING_ELEMENTS[7] = {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8fcd,0xe605,0x8b19,0xe24f,0x42a8,0x5b5f,0x7aae,0x78f3,0x828e,0x7553,0x5216,0x7176,0x559,0x367e,0x938b,0x2fe3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe6058fcd,0xe24f8b19,0x5b5f42a8,0x78f37aae,0x7553828e,0x71765216,0x367e0559,0x2fe3938b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xe24f8b19e6058fcd,0x78f37aae5b5f42a8,0x717652167553828e,0x2fe3938b367e0559}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0x8fcd,0xe605,0x8b19,0xe24f,0x42a8,0x5b5f,0x7aae,0x78f3,0x828e,0x7553,0x5216,0x7176,0x559,0x367e,0x938b,0x2fe3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xe6058fcd,0xe24f8b19,0x5b5f42a8,0x78f37aae,0x7553828e,0x71765216,0x367e0559,0x2fe3938b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xe24f8b19e6058fcd,0x78f37aae5b5f42a8,0x717652167553828e,0x2fe3938b367e0559}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0x2315,0x38d9,0x6fc1,0xa333,0xaeb,0xce6a,0x2a4c,0xa1c1,0x274c,0xa9fc,0xd4c6,0xb0b3,0x555b,0x7a48,0x411a,0x2bdc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x38d92315,0xa3336fc1,0xce6a0aeb,0xa1c12a4c,0xa9fc274c,0xb0b3d4c6,0x7a48555b,0x2bdc411a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xa3336fc138d92315,0xa1c12a4cce6a0aeb,0xb0b3d4c6a9fc274c,0x2bdc411a7a48555b}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0x2315,0x38d9,0x6fc1,0xa333,0xaeb,0xce6a,0x2a4c,0xa1c1,0x274c,0xa9fc,0xd4c6,0xb0b3,0x555b,0x7a48,0x411a,0x2bdc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x38d92315,0xa3336fc1,0xce6a0aeb,0xa1c12a4c,0xa9fc274c,0xb0b3d4c6,0x7a48555b,0x2bdc411a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xa3336fc138d92315,0xa1c12a4cce6a0aeb,0xb0b3d4c6a9fc274c,0x2bdc411a7a48555b}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe8f5,0xf5ac,0x2ee2,0xc962,0x459d,0xd9a0,0xd761,0x7c5a,0x8268,0xcf36,0x9b08,0xb7a6,0xbd23,0x7e04,0xe324,0x23ba}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf5ace8f5,0xc9622ee2,0xd9a0459d,0x7c5ad761,0xcf368268,0xb7a69b08,0x7e04bd23,0x23bae324}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc9622ee2f5ace8f5,0x7c5ad761d9a0459d,0xb7a69b08cf368268,0x23bae3247e04bd23}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe8f5,0xf5ac,0x2ee2,0xc962,0x459d,0xd9a0,0xd761,0x7c5a,0x8268,0xcf36,0x9b08,0xb7a6,0xbd23,0x7e04,0xe324,0x23ba}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf5ace8f5,0xc9622ee2,0xd9a0459d,0x7c5ad761,0xcf368268,0xb7a69b08,0x7e04bd23,0x23bae324}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc9622ee2f5ace8f5,0x7c5ad761d9a0459d,0xb7a69b08cf368268,0x23bae3247e04bd23}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xfef5,0x4752,0xbb14,0x6ee3,0x5898,0x6a2,0x8282,0x1179,0xe429,0xf5d1,0x5ad8,0x642d,0x3061,0x58d,0x9c04,0x917b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4752fef5,0x6ee3bb14,0x6a25898,0x11798282,0xf5d1e429,0x642d5ad8,0x58d3061,0x917b9c04}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6ee3bb144752fef5,0x1179828206a25898,0x642d5ad8f5d1e429,0x917b9c04058d3061}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0xfef5,0x4752,0xbb14,0x6ee3,0x5898,0x6a2,0x8282,0x1179,0xe429,0xf5d1,0x5ad8,0x642d,0x3061,0x58d,0x9c04,0x917b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x4752fef5,0x6ee3bb14,0x6a25898,0x11798282,0xf5d1e429,0x642d5ad8,0x58d3061,0x917b9c04}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x6ee3bb144752fef5,0x1179828206a25898,0x642d5ad8f5d1e429,0x917b9c04058d3061}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x7}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x7}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x7}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x7}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0xc375,0xa2dc,0x6a7d,0xed64,0x4f95,0xddbe,0x408d,0xb3c9,0x60c0,0xfe03,0x47e2,0x42ab,0xb1f0,0x6768,0x9c74,0x160d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xa2dcc375,0xed646a7d,0xddbe4f95,0xb3c9408d,0xfe0360c0,0x42ab47e2,0x6768b1f0,0x160d9c74}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xed646a7da2dcc375,0xb3c9408dddbe4f95,0x42ab47e2fe0360c0,0x160d9c746768b1f0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0xc375,0xa2dc,0x6a7d,0xed64,0x4f95,0xddbe,0x408d,0xb3c9,0x60c0,0xfe03,0x47e2,0x42ab,0xb1f0,0x6768,0x9c74,0x160d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xa2dcc375,0xed646a7d,0xddbe4f95,0xb3c9408d,0xfe0360c0,0x42ab47e2,0x6768b1f0,0x160d9c74}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xed646a7da2dcc375,0xb3c9408dddbe4f95,0x42ab47e2fe0360c0,0x160d9c746768b1f0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0x95f7,0xbdd2,0x75d6,0x430e,0x5c58,0xbd78,0x16b0,0x1278,0xc3f8,0x16b,0xb5dc,0xbbcf,0xfa18,0x1815,0x3c32,0x624a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xbdd295f7,0x430e75d6,0xbd785c58,0x127816b0,0x16bc3f8,0xbbcfb5dc,0x1815fa18,0x624a3c32}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x430e75d6bdd295f7,0x127816b0bd785c58,0xbbcfb5dc016bc3f8,0x624a3c321815fa18}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0x95f7,0xbdd2,0x75d6,0x430e,0x5c58,0xbd78,0x16b0,0x1278,0xc3f8,0x16b,0xb5dc,0xbbcf,0xfa18,0x1815,0x3c32,0x624a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xbdd295f7,0x430e75d6,0xbd785c58,0x127816b0,0x16bc3f8,0xbbcfb5dc,0x1815fa18,0x624a3c32}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x430e75d6bdd295f7,0x127816b0bd785c58,0xbbcfb5dc016bc3f8,0x624a3c321815fa18}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd}}} +#endif +}}}; diff --git a/src/precomp/ref/lvl5/sqisign_parameters.txt b/src/precomp/ref/lvl5/sqisign_parameters.txt index 5ae4c99..947af4b 100644 --- a/src/precomp/ref/lvl5/sqisign_parameters.txt +++ b/src/precomp/ref/lvl5/sqisign_parameters.txt @@ -1,3 +1,3 @@ lvl = 5 -p = 0x255946a8869bc68c15b0036936e79202bdbe6326507d01fe3ac5904a0dea65faf0a29a781974ce994c68ada6e1ffffffffffffffffffffffffffffffffffff -B = 320000 +p = 0x1afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +num_orders = 7 diff --git a/src/precomp/ref/lvl5/torsion_constants.c b/src/precomp/ref/lvl5/torsion_constants.c index 6b536af..6fb2f97 100644 --- a/src/precomp/ref/lvl5/torsion_constants.c +++ b/src/precomp/ref/lvl5/torsion_constants.c @@ -1,68 +1,43 @@ #include #include #include +const ibz_t TWO_TO_SECURITY_BITS = #if 0 -#elif 8*DIGIT_LEN == 16 -const uint64_t TORSION_PLUS_EVEN_POWER = 0x91; -const uint64_t TORSION_ODD_PRIMES[34] = {0x3, 0xd, 0x29, 0x43, 0x67, 0x1cd, 0x33b, 0x5, 0x7, 0x11, 0x25, 0x35, 0x49, 0x7f, 0x97, 0x283, 0x2dd, 0x2e3, 0x3f1, 0x9eb, 0x1039, 0x13c3, 0x1bd7, 0x2965, 0x3517, 0x3a4b, 0x3cb5, 0x3e77, 0x4897, 0x5abb, 0xbc3b, 0xf70f, 0xfff1, 0x4db19}; -const uint64_t TORSION_ODD_POWERS[34] = {0x48, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const uint64_t TORSION_PLUS_ODD_PRIMES[7] = {0x3, 0xd, 0x29, 0x43, 0x67, 0x1cd, 0x33b}; -const size_t TORSION_PLUS_ODD_POWERS[7] = {0x48, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6}; -const uint64_t TORSION_MINUS_ODD_PRIMES[27] = {0x5, 0x7, 0x11, 0x25, 0x35, 0x49, 0x7f, 0x97, 0x283, 0x2dd, 0x2e3, 0x3f1, 0x9eb, 0x1039, 0x13c3, 0x1bd7, 0x2965, 0x3517, 0x3a4b, 0x3cb5, 0x3e77, 0x4897, 0x5abb, 0xbc3b, 0xf70f, 0xfff1, 0x4db19}; -const size_t TORSION_MINUS_ODD_POWERS[27] = {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const size_t DEGREE_COMMITMENT_POWERS[34] = {0x0, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const ibz_t CHARACTERISTIC = {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xa6e1,0x68ad,0x994c,0x74ce,0x7819,0xa29a,0xfaf0,0xea65,0x4a0d,0xc590,0xfe3a,0x7d01,0x2650,0xbe63,0x2bd,0xe792,0x6936,0xb003,0x8c15,0x9bc6,0xa886,0x5946,0x25}}}; -const ibz_t TORSION_ODD = {{._mp_alloc = 0, ._mp_size = 41, ._mp_d = (mp_limb_t[]) {0x6443,0x4509,0x1585,0x113b,0x6c1d,0xac5,0x133e,0xbacd,0xbe1d,0xc40e,0x6dbd,0x1dab,0x7f88,0x84f7,0x9a8a,0xa77f,0xc9a3,0x9952,0x1850,0xa5c9,0x61d3,0xead,0x4f3e,0x684b,0x56d7,0x8f3d,0x6e0b,0x5c5b,0xed75,0x2a69,0xb601,0x6fb3,0x773f,0x44fa,0xc95c,0x5720,0x1ac,0x6b82,0xf6d9,0xf93,0x78}}}; -const ibz_t TORSION_ODD_PRIMEPOWERS[34] = {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf6a1,0xc929,0x9735,0x1e67,0x6c11,0x60e7,0x56bc,0x4}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xa6b9,0x49}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xd6b1,0x1b20,0x1}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x5f59,0xfbd,0x15}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x1f51,0x310,0x116}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6739,0x2acb,0x19d4,0x22}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa389,0x2c91,0x8ff6,0x470}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x7}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x25}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x35}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x49}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x7f}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x97}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x283}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2dd}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2e3}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3f1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9eb}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1039}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x13c3}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1bd7}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2965}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3517}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3a4b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3cb5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3e77}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4897}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5abb}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xbc3b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xf70f}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xfff1}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xdb19,0x4}}}}; -const ibz_t TORSION_ODD_PLUS = {{._mp_alloc = 0, ._mp_size = 23, ._mp_d = (mp_limb_t[]) {0xd371,0x3456,0x4ca6,0xba67,0x3c0c,0x514d,0xfd78,0xf532,0x2506,0x62c8,0xff1d,0x3e80,0x9328,0xdf31,0x15e,0x73c9,0xb49b,0xd801,0x460a,0x4de3,0x5443,0xaca3,0x12}}}; -const ibz_t TORSION_ODD_MINUS = {{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0xb0f3,0xa6d1,0x9048,0x1def,0x2075,0x4e99,0xa926,0xc786,0x4dda,0xdcb1,0xa4b,0x6123,0xe306,0x599e,0xfd2a,0x844f,0xae9c,0x6dde,0x6}}}; -const ibz_t TORSION_PLUS_2POWER = {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2}}}; -const ibz_t TORSION_PLUS_3POWER = {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf6a1,0xc929,0x9735,0x1e67,0x6c11,0x60e7,0x56bc,0x4}}}; -const ibz_t TORSION_PLUS_23POWER = {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xed42,0x9253,0x2e6b,0x3ccf,0xd822,0xc1ce,0xad78,0x8}}}; -const ibz_t DEGREE_COMMITMENT = {{._mp_alloc = 0, ._mp_size = 34, ._mp_d = (mp_limb_t[]) {0x8463,0x2824,0xc02f,0xad88,0x1daa,0x1fe6,0x44e3,0x41c4,0xd324,0x8315,0xd382,0x1f79,0xf852,0x980a,0x9bf7,0x3bf8,0xe38f,0x4576,0xb36,0x7082,0x9fe4,0x3c,0x63db,0x611f,0x3261,0x345,0x3575,0xfefa,0xf00e,0x8537,0x712c,0x9f1c,0xabde,0x1b}}}; -const ibz_t DEGREE_COMMITMENT_PLUS = {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3ad1,0x4eb4,0x7a3,0x1f00,0x1d6a,0x7d31,0x865,0xc7bc,0x9962,0xf08a,0x13f9,0xe003,0x6d0e,0xc440,0x4dd4,0x4}}}; -const ibz_t DEGREE_COMMITMENT_MINUS = {{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0xb0f3,0xa6d1,0x9048,0x1def,0x2075,0x4e99,0xa926,0xc786,0x4dda,0xdcb1,0xa4b,0x6123,0xe306,0x599e,0xfd2a,0x844f,0xae9c,0x6dde,0x6}}}; -const ibz_t DEGREE_CHALLENGE = {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xed42,0x9253,0x2e6b,0x3ccf,0xd822,0xc1ce,0xad78,0x8}}}; -#elif 8*DIGIT_LEN == 32 -const uint64_t TORSION_PLUS_EVEN_POWER = 0x91; -const uint64_t TORSION_ODD_PRIMES[34] = {0x3, 0xd, 0x29, 0x43, 0x67, 0x1cd, 0x33b, 0x5, 0x7, 0x11, 0x25, 0x35, 0x49, 0x7f, 0x97, 0x283, 0x2dd, 0x2e3, 0x3f1, 0x9eb, 0x1039, 0x13c3, 0x1bd7, 0x2965, 0x3517, 0x3a4b, 0x3cb5, 0x3e77, 0x4897, 0x5abb, 0xbc3b, 0xf70f, 0xfff1, 0x4db19}; -const uint64_t TORSION_ODD_POWERS[34] = {0x48, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const uint64_t TORSION_PLUS_ODD_PRIMES[7] = {0x3, 0xd, 0x29, 0x43, 0x67, 0x1cd, 0x33b}; -const size_t TORSION_PLUS_ODD_POWERS[7] = {0x48, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6}; -const uint64_t TORSION_MINUS_ODD_PRIMES[27] = {0x5, 0x7, 0x11, 0x25, 0x35, 0x49, 0x7f, 0x97, 0x283, 0x2dd, 0x2e3, 0x3f1, 0x9eb, 0x1039, 0x13c3, 0x1bd7, 0x2965, 0x3517, 0x3a4b, 0x3cb5, 0x3e77, 0x4897, 0x5abb, 0xbc3b, 0xf70f, 0xfff1, 0x4db19}; -const size_t TORSION_MINUS_ODD_POWERS[27] = {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const size_t DEGREE_COMMITMENT_POWERS[34] = {0x0, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const ibz_t CHARACTERISTIC = {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xa6e1ffff,0x994c68ad,0x781974ce,0xfaf0a29a,0x4a0dea65,0xfe3ac590,0x26507d01,0x2bdbe63,0x6936e792,0x8c15b003,0xa8869bc6,0x255946}}}; -const ibz_t TORSION_ODD = {{._mp_alloc = 0, ._mp_size = 21, ._mp_d = (mp_limb_t[]) {0x45096443,0x113b1585,0xac56c1d,0xbacd133e,0xc40ebe1d,0x1dab6dbd,0x84f77f88,0xa77f9a8a,0x9952c9a3,0xa5c91850,0xead61d3,0x684b4f3e,0x8f3d56d7,0x5c5b6e0b,0x2a69ed75,0x6fb3b601,0x44fa773f,0x5720c95c,0x6b8201ac,0xf93f6d9,0x78}}}; -const ibz_t TORSION_ODD_PRIMEPOWERS[34] = {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc929f6a1,0x1e679735,0x60e76c11,0x456bc}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x49a6b9}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1b20d6b1,0x1}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xfbd5f59,0x15}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x3101f51,0x116}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x2acb6739,0x2219d4}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x2c91a389,0x4708ff6}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x7}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x25}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x35}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x49}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x7f}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x97}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x283}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2dd}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2e3}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3f1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9eb}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1039}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x13c3}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1bd7}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2965}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3517}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3a4b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3cb5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3e77}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4897}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5abb}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xbc3b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xf70f}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xfff1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4db19}}}}; -const ibz_t TORSION_ODD_PLUS = {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x3456d371,0xba674ca6,0x514d3c0c,0xf532fd78,0x62c82506,0x3e80ff1d,0xdf319328,0x73c9015e,0xd801b49b,0x4de3460a,0xaca35443,0x12}}}; -const ibz_t TORSION_ODD_MINUS = {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xa6d1b0f3,0x1def9048,0x4e992075,0xc786a926,0xdcb14dda,0x61230a4b,0x599ee306,0x844ffd2a,0x6ddeae9c,0x6}}}; -const ibz_t TORSION_PLUS_2POWER = {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x20000}}}; -const ibz_t TORSION_PLUS_3POWER = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc929f6a1,0x1e679735,0x60e76c11,0x456bc}}}; -const ibz_t TORSION_PLUS_23POWER = {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0xed420000,0x2e6b9253,0xd8223ccf,0xad78c1ce,0x8}}}; -const ibz_t DEGREE_COMMITMENT = {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x28248463,0xad88c02f,0x1fe61daa,0x41c444e3,0x8315d324,0x1f79d382,0x980af852,0x3bf89bf7,0x4576e38f,0x70820b36,0x3c9fe4,0x611f63db,0x3453261,0xfefa3575,0x8537f00e,0x9f1c712c,0x1babde}}}; -const ibz_t DEGREE_COMMITMENT_PLUS = {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4eb43ad1,0x1f0007a3,0x7d311d6a,0xc7bc0865,0xf08a9962,0xe00313f9,0xc4406d0e,0x44dd4}}}; -const ibz_t DEGREE_COMMITMENT_MINUS = {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xa6d1b0f3,0x1def9048,0x4e992075,0xc786a926,0xdcb14dda,0x61230a4b,0x599ee306,0x844ffd2a,0x6ddeae9c,0x6}}}; -const ibz_t DEGREE_CHALLENGE = {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0xed420000,0x2e6b9253,0xd8223ccf,0xad78c1ce,0x8}}}; -#elif 8*DIGIT_LEN == 64 -const uint64_t TORSION_PLUS_EVEN_POWER = 0x91; -const uint64_t TORSION_ODD_PRIMES[34] = {0x3, 0xd, 0x29, 0x43, 0x67, 0x1cd, 0x33b, 0x5, 0x7, 0x11, 0x25, 0x35, 0x49, 0x7f, 0x97, 0x283, 0x2dd, 0x2e3, 0x3f1, 0x9eb, 0x1039, 0x13c3, 0x1bd7, 0x2965, 0x3517, 0x3a4b, 0x3cb5, 0x3e77, 0x4897, 0x5abb, 0xbc3b, 0xf70f, 0xfff1, 0x4db19}; -const uint64_t TORSION_ODD_POWERS[34] = {0x48, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const uint64_t TORSION_PLUS_ODD_PRIMES[7] = {0x3, 0xd, 0x29, 0x43, 0x67, 0x1cd, 0x33b}; -const size_t TORSION_PLUS_ODD_POWERS[7] = {0x48, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6}; -const uint64_t TORSION_MINUS_ODD_PRIMES[27] = {0x5, 0x7, 0x11, 0x25, 0x35, 0x49, 0x7f, 0x97, 0x283, 0x2dd, 0x2e3, 0x3f1, 0x9eb, 0x1039, 0x13c3, 0x1bd7, 0x2965, 0x3517, 0x3a4b, 0x3cb5, 0x3e77, 0x4897, 0x5abb, 0xbc3b, 0xf70f, 0xfff1, 0x4db19}; -const size_t TORSION_MINUS_ODD_POWERS[27] = {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const size_t DEGREE_COMMITMENT_POWERS[34] = {0x0, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const ibz_t CHARACTERISTIC = {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0xffffffffffffffff,0x994c68ada6e1ffff,0xfaf0a29a781974ce,0xfe3ac5904a0dea65,0x2bdbe6326507d01,0x8c15b0036936e792,0x255946a8869bc6}}}; -const ibz_t TORSION_ODD = {{._mp_alloc = 0, ._mp_size = 11, ._mp_d = (mp_limb_t[]) {0x113b158545096443,0xbacd133e0ac56c1d,0x1dab6dbdc40ebe1d,0xa77f9a8a84f77f88,0xa5c918509952c9a3,0x684b4f3e0ead61d3,0x5c5b6e0b8f3d56d7,0x6fb3b6012a69ed75,0x5720c95c44fa773f,0xf93f6d96b8201ac,0x78}}}; -const ibz_t TORSION_ODD_PRIMEPOWERS[34] = {{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1e679735c929f6a1,0x456bc60e76c11}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x49a6b9}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11b20d6b1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x150fbd5f59}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11603101f51}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2219d42acb6739}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4708ff62c91a389}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x7}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x25}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x35}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x49}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x7f}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x97}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x283}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2dd}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2e3}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3f1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9eb}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1039}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x13c3}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1bd7}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2965}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3517}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3a4b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3cb5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3e77}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4897}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5abb}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xbc3b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xf70f}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xfff1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4db19}}}}; -const ibz_t TORSION_ODD_PLUS = {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xba674ca63456d371,0xf532fd78514d3c0c,0x3e80ff1d62c82506,0x73c9015edf319328,0x4de3460ad801b49b,0x12aca35443}}}; -const ibz_t TORSION_ODD_MINUS = {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x1def9048a6d1b0f3,0xc786a9264e992075,0x61230a4bdcb14dda,0x844ffd2a599ee306,0x66ddeae9c}}}; -const ibz_t TORSION_PLUS_2POWER = {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x20000}}}; -const ibz_t TORSION_PLUS_3POWER = {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1e679735c929f6a1,0x456bc60e76c11}}}; -const ibz_t TORSION_PLUS_23POWER = {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x2e6b9253ed420000,0xad78c1ced8223ccf,0x8}}}; -const ibz_t DEGREE_COMMITMENT = {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xad88c02f28248463,0x41c444e31fe61daa,0x1f79d3828315d324,0x3bf89bf7980af852,0x70820b364576e38f,0x611f63db003c9fe4,0xfefa357503453261,0x9f1c712c8537f00e,0x1babde}}}; -const ibz_t DEGREE_COMMITMENT_PLUS = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1f0007a34eb43ad1,0xc7bc08657d311d6a,0xe00313f9f08a9962,0x44dd4c4406d0e}}}; -const ibz_t DEGREE_COMMITMENT_MINUS = {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x1def9048a6d1b0f3,0xc786a9264e992075,0x61230a4bdcb14dda,0x844ffd2a599ee306,0x66ddeae9c}}}; -const ibz_t DEGREE_CHALLENGE = {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x2e6b9253ed420000,0xad78c1ced8223ccf,0x8}}}; +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x1}}} #endif +; +const ibz_t TORSION_PLUS_2POWER = +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x10}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x100000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x10000000000000}}} +#endif +; +const ibz_t SEC_DEGREE = +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 65, ._mp_d = (mp_limb_t[]) {0x283,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 33, ._mp_d = (mp_limb_t[]) {0x283,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x283,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#endif +; +const ibz_t COM_DEGREE = +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 65, ._mp_d = (mp_limb_t[]) {0x283,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 33, ._mp_d = (mp_limb_t[]) {0x283,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x283,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#endif +; diff --git a/src/precomp/ref/lvlx.cmake b/src/precomp/ref/lvlx.cmake new file mode 100644 index 0000000..7e93c5d --- /dev/null +++ b/src/precomp/ref/lvlx.cmake @@ -0,0 +1,40 @@ +set(SOURCE_FILES_PRECOMP_${SVARIANT_UPPER}_REF + ec_params.c + e0_basis.c + hd_splitting_transforms.c +) + +if(ENABLE_SIGN) + set(SOURCE_FILES_PRECOMP_${SVARIANT_UPPER}_REF + ${SOURCE_FILES_PRECOMP_${SVARIANT_UPPER}_REF} + torsion_constants.c + quaternion_data.c + endomorphism_action.c + ) +endif() + +add_library(${LIB_PRECOMP_${SVARIANT_UPPER}} STATIC ${SOURCE_FILES_PRECOMP_${SVARIANT_UPPER}_REF}) +target_link_libraries(${LIB_PRECOMP_${SVARIANT_UPPER}} $<$:GMP>) +target_include_directories(${LIB_PRECOMP_${SVARIANT_UPPER}} PRIVATE ${INC_QUATERNION} ${PROJECT_SOURCE_DIR}/quaternion/ref/generic/include ${INC_PUBLIC} ${PROJECT_SOURCE_DIR}/src/hd/ref/include ${PROJECT_SOURCE_DIR}/src/ec/ref/include ${PROJECT_SOURCE_DIR}/src/ec/ref/${SVARIANT_LOWER}/include ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_COMMON}) +target_compile_options(${LIB_PRECOMP_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) +target_compile_definitions(${LIB_PRECOMP_${SVARIANT_UPPER}} PUBLIC SQISIGN_VARIANT=${SVARIANT_LOWER}) + +find_program(SAGEMATH sage) +add_custom_target(precomp_${SVARIANT_LOWER} + DEPENDS "./sqisign_parameters.txt" + COMMAND "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precomp/precompute_torsion_constants.sage" + COMMAND "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precomp/precompute_quaternion_constants.sage" + COMMAND "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precomp/precompute_sizes.sage" + COMMAND "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precomp/precompute_quaternion_data.sage" + COMMAND "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precomp/precompute_endomorphism_action.sage" + COMMAND "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precomp/ec_params.sage" + COMMAND "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precomp/precompute_hd_splitting.sage" + COMMAND "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precomp/precompute_E0_basis.sage" + WORKING_DIRECTORY + "${CMAKE_CURRENT_SOURCE_DIR}" +) + +set_directory_properties(PROPERTIES CLEAN_NO_CUSTOM true) +set_target_properties(precomp_${SVARIANT_LOWER} PROPERTIES EXCLUDE_FROM_ALL TRUE) + +add_dependencies(precomp precomp_${SVARIANT_LOWER}) diff --git a/src/protocols/ref/CMakeLists.txt b/src/protocols/ref/CMakeLists.txt deleted file mode 100644 index aa7ec53..0000000 --- a/src/protocols/ref/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -set(PROTOCOLSX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/protocolsx) - -include(${SELECT_SQISIGN_VARIANT}) diff --git a/src/protocols/ref/include/protocols.h b/src/protocols/ref/include/protocols.h deleted file mode 100644 index ab2991d..0000000 --- a/src/protocols/ref/include/protocols.h +++ /dev/null @@ -1,269 +0,0 @@ -/** @file - * - * @authors Antonin Leroux - * - * @brief The protocols - */ - -#ifndef PROTOCOLS_H -#define PROTOCOLS_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -/** @defgroup protocols_protocols SQIsign protocols - * @{ -*/ -/** @defgroup protocols_t Types for sqisign protocols - * @{ -*/ - -/** @brief Type for the signature - * - * @typedef signature_t - * - * @struct signature - * -*/ - - -typedef struct signature { - id2iso_compressed_long_two_isog_t zip; /// the compressed isogeny - digit_t r[NWORDS_FIELD]; /// first scalar encoding the challenge - struct { - unsigned char select23; // this&1 is bit2, this&2 is bit3 - digit_t scalar2[NWORDS_FIELD]; - digit_t scalar3[NWORDS_FIELD]; - } s; /// second scalar encoding the challenge -} signature_t; - -/** @brief Type for the public keys - * - * @typedef public_key_t - * - * @struct public_key - * -*/ -typedef struct public_key { - ec_curve_t E; /// the normalized A coefficient of the Montgomery curve -} public_key_t; - -/** @brief Type for the secret keys - * - * @typedef secret_key_t - * - * @struct secret_key - * -*/ -typedef struct secret_key { - ec_curve_t curve; /// the j-invariant - quat_left_ideal_t lideal_small; /// ideal of prime norm - quat_left_ideal_t lideal_two; /// ideal of norm a power of 2 - quat_alg_elem_t gen_two; /// generator of lideal_two - ec_point_t kernel_dual; /// kernel of the dual of the last step of the phi_two - ec_basis_t basis_plus; /// basis pushed through phi_two - ec_basis_t basis_minus; /// basis pushed through phi_two -} secret_key_t; - - -/** @} -*/ - - -/*************************** Functions *****************************/ - - -void secret_key_init(secret_key_t *sk); -void secret_key_finalize(secret_key_t *sk); - -void signature_init(signature_t *sig); -void signature_finalize(signature_t *sig); - -/** @defgroup signature The signature protocol - * @{ -*/ - -/** - * @brief Computing a key pair - * - * @param pk : Output the public key - * @param sk : Output the secret key - * @returns a bit indicating if the computation succeeded - */ -int protocols_keygen(public_key_t *pk, secret_key_t *sk); - - -/** - * @brief Computing a commitment isogeny from the starting curve - * - * @param ideal Output: the left O0-ideal defining the commitment isogeny - * @param E1 Output: the codomain curve, normalized à la ec_curve_normalize() - * @param basis Input and output: a basis on E0 which will be pushed through the commitment i -sogeny - */ -void protocols_commit(quat_left_ideal_t *ideal, ec_curve_t *E1, ec_basis_t *basis); - -/** - * @brief Hashing a commitment curve and a message to a challenge - * - * @param scalars Output: scalars defining the challenge kernel in terms of a deterministic t -orsion basis of the commitment curve - * @param curve: the commitment curve - * @param message: byte string to be signed - * @param length: length of the message - */ -void hash_to_challenge(ibz_vec_2_t *scalars, const ec_curve_t *curve, const unsigned char *message, size_t length); - - -/** - * @brief Computing a challenge isogeny from a commitment curve - * - * @param ideal Output: the left O0-ideal defining the challenge isogeny (pulled back through - the commitment) - * @param sig Output: signature structure in which the members r and s will be filled by this - function - * @param E1: commitment curve - * @param pushedbasis6: image of the precomputed fixed torsion basis #BASIS_CHALLENGE under t -he commitment isogeny - * @param hash: message hash according to hash_to_challenge() - * @param out_E2: optional output (can be NULL) to store the value of the challenge curve for - testing and debugging - */ -void protocols_challenge(quat_left_ideal_t *ideal, signature_t *sig, const ec_curve_t *E1, const ec_basis_t *pushedbasis6, const ibz_vec_2_t *hash, ec_curve_t *out_E2); - - -/** - * @brief Computing a signature - * - * @param sig Output: the signature - * @param pk the public key - * @param sk the secret key - * @param m the message - * @param l the message length - * @returns a bit indicating if the computation succeeded - */ -int protocols_sign(signature_t *sig,const public_key_t *pk, const secret_key_t *sk,const unsigned char* m, size_t l); - - -/** @} -*/ - - -/** @defgroup verification The verification protocol - * @{ -*/ - - -/** - * @brief Recovering the challenge curve from a signature - * - * @param E2 Output: the challenge curve, will be normalized à la ec_curve_normalize() - * @param dual Output: point defining the first step of the dual of the response isogeny - * @param sig the signature - * @param pk the public key - */ -void protocols_verif_unpack_chall(ec_curve_t *E2, ec_point_t *dual, const signature_t *sig, const public_key_t *pk); - -/** - * @brief Verifying the challenge from a signature - * - * @param sig the signature - * @param E2 the challenge curve - * @param dual point defining the first step of the dual of the response isogeny - * @param m the message - * @param l the message length - * @returns a single bit indicating whether the given data forms correct signature data - */ -int protocols_verif_from_chall(const signature_t *sig, ec_curve_t const *E2, const ec_point_t *dual, const unsigned char* m, size_t l); - - -/** - * @brief Verifying a signature - * - * @param sig: the signature - * @param pk the public key - * @param m the message - * @param l length of the message - * @returns a bit indicating if the verification succeeded - */ -int protocols_verif(const signature_t *sig,const public_key_t *pk,const unsigned char* m, size_t l); - - -/** @} -*/ - - -/*************************** Encoding *****************************/ - - -/** @defgroup encoding Encoding and decoding functions - * @{ -*/ - -/** - * @brief Encodes a public key as a byte array - * - * @param enc : Output the encoded public key - * @param pk : public key - */ -void public_key_encode(unsigned char *enc, const public_key_t* pk); - -/** - * @brief Encodes a secret key as a byte array - * - * @param enc : Output the encoded secret key (including public key) - * @param sk : secret key - * @param pk : public key - */ -void secret_key_encode(unsigned char *enc, const secret_key_t* sk, const public_key_t* pk); - -/** - * @brief Encodes a signature as a byte array - * - * @param enc : Output the encoded signature - * @param sig : signature - */ -void signature_encode(unsigned char* enc, const signature_t* sig); - -/** - * @brief Encodes a public key as a byte array - * - * @param pk : Output the decoded public key - * @param enc : encoded public key - */ -void public_key_decode(public_key_t* pk, const unsigned char *enc); - -/** - * @brief Encodes a secret key (and public key) as a byte array - * - * @param sk : Output the decoded secret key - * @param pk : Output the decoded public key contained in enc - * @param enc : encoded secret key - */ -void secret_key_decode(secret_key_t* sk, public_key_t* pk, const unsigned char *enc); - -/** - * @brief Encodes a signature as a byte array - * - * @param sig : Output the decoded signature - * @param enc : encoded signature - */ -void signature_decode(signature_t* sig, const unsigned char* enc); - -/** @} -*/ -/** @} -*/ - -#endif diff --git a/src/protocols/ref/lvl1/CMakeLists.txt b/src/protocols/ref/lvl1/CMakeLists.txt deleted file mode 100644 index 5ec15cc..0000000 --- a/src/protocols/ref/lvl1/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ - -set(SOURCE_FILES_PROTOCOLS_GENERIC_REF - ${PROTOCOLSX_DIR}/sign.c - ${PROTOCOLSX_DIR}/verif.c - ${PROTOCOLSX_DIR}/keygen.c - ${PROTOCOLSX_DIR}/encode.c -) - -add_library(${LIB_PROTOCOLS_${SVARIANT_UPPER}} ${SOURCE_FILES_PROTOCOLS_GENERIC_REF}) -target_include_directories(${LIB_PROTOCOLS_${SVARIANT_UPPER}} PRIVATE common ${INC_PUBLIC} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_ID2ISO} ${INC_PROTOCOLS} ${INC_COMMON}) -target_compile_options(${LIB_PROTOCOLS_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) diff --git a/src/protocols/ref/lvl1/test/CMakeLists.txt b/src/protocols/ref/lvl1/test/CMakeLists.txt deleted file mode 100644 index 8ca34dc..0000000 --- a/src/protocols/ref/lvl1/test/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ -set(SOURCE_FILES_PROTOCOLS_GENERIC_REF_TESTS - ${PROTOCOLSX_DIR}/test/commitment.c - ${PROTOCOLSX_DIR}/test/challenge.c - ${PROTOCOLSX_DIR}/test/verif.c - ${PROTOCOLSX_DIR}/test/keygen.c - ${PROTOCOLSX_DIR}/test/encode.c - ${PROTOCOLSX_DIR}/test/test_protocols.c -) -add_executable(sqisign_test_protocols_${SVARIANT_LOWER} ${SOURCE_FILES_PROTOCOLS_GENERIC_REF_TESTS}) -target_link_libraries(sqisign_test_protocols_${SVARIANT_LOWER} ${LIB_PROTOCOLS_${SVARIANT_UPPER}} ${LIB_ID2ISO_${SVARIANT_UPPER}} ${LIB_EC} ${LIB_KLPT_${SVARIANT_UPPER}} ${LIB_QUATERNION} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_INTBIG} ${LIB_PUBLIC} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}} ${GMP} sqisign_common_sys ) -target_include_directories(sqisign_test_protocols_${SVARIANT_LOWER} PRIVATE ${INC_PUBLIC} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_COMMON} ${INC_ID2ISO} ${INC_PROTOCOLS} ./include/) - -add_test(sqisign_test_protocols_${SVARIANT_LOWER} sqisign_test_protocols_${SVARIANT_LOWER}) diff --git a/src/protocols/ref/lvl3/CMakeLists.txt b/src/protocols/ref/lvl3/CMakeLists.txt deleted file mode 100644 index 5ec15cc..0000000 --- a/src/protocols/ref/lvl3/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ - -set(SOURCE_FILES_PROTOCOLS_GENERIC_REF - ${PROTOCOLSX_DIR}/sign.c - ${PROTOCOLSX_DIR}/verif.c - ${PROTOCOLSX_DIR}/keygen.c - ${PROTOCOLSX_DIR}/encode.c -) - -add_library(${LIB_PROTOCOLS_${SVARIANT_UPPER}} ${SOURCE_FILES_PROTOCOLS_GENERIC_REF}) -target_include_directories(${LIB_PROTOCOLS_${SVARIANT_UPPER}} PRIVATE common ${INC_PUBLIC} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_ID2ISO} ${INC_PROTOCOLS} ${INC_COMMON}) -target_compile_options(${LIB_PROTOCOLS_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) diff --git a/src/protocols/ref/lvl3/test/CMakeLists.txt b/src/protocols/ref/lvl3/test/CMakeLists.txt deleted file mode 100644 index 8ca34dc..0000000 --- a/src/protocols/ref/lvl3/test/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ -set(SOURCE_FILES_PROTOCOLS_GENERIC_REF_TESTS - ${PROTOCOLSX_DIR}/test/commitment.c - ${PROTOCOLSX_DIR}/test/challenge.c - ${PROTOCOLSX_DIR}/test/verif.c - ${PROTOCOLSX_DIR}/test/keygen.c - ${PROTOCOLSX_DIR}/test/encode.c - ${PROTOCOLSX_DIR}/test/test_protocols.c -) -add_executable(sqisign_test_protocols_${SVARIANT_LOWER} ${SOURCE_FILES_PROTOCOLS_GENERIC_REF_TESTS}) -target_link_libraries(sqisign_test_protocols_${SVARIANT_LOWER} ${LIB_PROTOCOLS_${SVARIANT_UPPER}} ${LIB_ID2ISO_${SVARIANT_UPPER}} ${LIB_EC} ${LIB_KLPT_${SVARIANT_UPPER}} ${LIB_QUATERNION} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_INTBIG} ${LIB_PUBLIC} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}} ${GMP} sqisign_common_sys ) -target_include_directories(sqisign_test_protocols_${SVARIANT_LOWER} PRIVATE ${INC_PUBLIC} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_COMMON} ${INC_ID2ISO} ${INC_PROTOCOLS} ./include/) - -add_test(sqisign_test_protocols_${SVARIANT_LOWER} sqisign_test_protocols_${SVARIANT_LOWER}) diff --git a/src/protocols/ref/lvl5/CMakeLists.txt b/src/protocols/ref/lvl5/CMakeLists.txt deleted file mode 100644 index 5ec15cc..0000000 --- a/src/protocols/ref/lvl5/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ - -set(SOURCE_FILES_PROTOCOLS_GENERIC_REF - ${PROTOCOLSX_DIR}/sign.c - ${PROTOCOLSX_DIR}/verif.c - ${PROTOCOLSX_DIR}/keygen.c - ${PROTOCOLSX_DIR}/encode.c -) - -add_library(${LIB_PROTOCOLS_${SVARIANT_UPPER}} ${SOURCE_FILES_PROTOCOLS_GENERIC_REF}) -target_include_directories(${LIB_PROTOCOLS_${SVARIANT_UPPER}} PRIVATE common ${INC_PUBLIC} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_ID2ISO} ${INC_PROTOCOLS} ${INC_COMMON}) -target_compile_options(${LIB_PROTOCOLS_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) diff --git a/src/protocols/ref/lvl5/test/CMakeLists.txt b/src/protocols/ref/lvl5/test/CMakeLists.txt deleted file mode 100644 index 8ca34dc..0000000 --- a/src/protocols/ref/lvl5/test/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ -set(SOURCE_FILES_PROTOCOLS_GENERIC_REF_TESTS - ${PROTOCOLSX_DIR}/test/commitment.c - ${PROTOCOLSX_DIR}/test/challenge.c - ${PROTOCOLSX_DIR}/test/verif.c - ${PROTOCOLSX_DIR}/test/keygen.c - ${PROTOCOLSX_DIR}/test/encode.c - ${PROTOCOLSX_DIR}/test/test_protocols.c -) -add_executable(sqisign_test_protocols_${SVARIANT_LOWER} ${SOURCE_FILES_PROTOCOLS_GENERIC_REF_TESTS}) -target_link_libraries(sqisign_test_protocols_${SVARIANT_LOWER} ${LIB_PROTOCOLS_${SVARIANT_UPPER}} ${LIB_ID2ISO_${SVARIANT_UPPER}} ${LIB_EC} ${LIB_KLPT_${SVARIANT_UPPER}} ${LIB_QUATERNION} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_INTBIG} ${LIB_PUBLIC} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}} ${GMP} sqisign_common_sys ) -target_include_directories(sqisign_test_protocols_${SVARIANT_LOWER} PRIVATE ${INC_PUBLIC} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_COMMON} ${INC_ID2ISO} ${INC_PROTOCOLS} ./include/) - -add_test(sqisign_test_protocols_${SVARIANT_LOWER} sqisign_test_protocols_${SVARIANT_LOWER}) diff --git a/src/protocols/ref/protocolsx/encode.c b/src/protocols/ref/protocolsx/encode.c deleted file mode 100644 index 64eea28..0000000 --- a/src/protocols/ref/protocolsx/encode.c +++ /dev/null @@ -1,467 +0,0 @@ -#include -#include -#include -#include - - -// digits - -static void encode_digits(unsigned char* enc, const digit_t* x, size_t nbytes) -{ -#ifdef TARGET_BIG_ENDIAN - const size_t ndigits = nbytes / sizeof(digit_t); - const size_t rem = nbytes % sizeof(digit_t); - - for (size_t i = 0; i < ndigits; i++) - ((digit_t*)enc)[i] = BSWAP_DIGIT(x[i]); - if (rem) { - digit_t ld = BSWAP_DIGIT(x[ndigits]); - memcpy(enc + ndigits*sizeof(digit_t), (unsigned char*)&ld, rem); - } -#else - memcpy(enc, (const unsigned char*)x, nbytes); -#endif -} - -static void decode_digits(digit_t* dec, const unsigned char* x, size_t nbytes, size_t ndigits) -{ - assert(nbytes <= ndigits*sizeof(digit_t)); - memcpy((unsigned char*)dec, x, nbytes); - memset((unsigned char*)dec + nbytes, 0, ndigits*sizeof(*dec)-nbytes); - -#ifdef TARGET_BIG_ENDIAN - for (size_t i = 0; i < ndigits; i++) - dec[i] = BSWAP_DIGIT(dec[i]); -#endif -} - - -// ibz_t - -static void ibz_encode(unsigned char *enc, const ibz_t *x, size_t nbytes) -{ -#ifndef NDEBUG -{ - // make sure there is enough space - ibz_t abs, bnd; - ibz_init(&bnd); - ibz_init(&abs); - ibz_pow(&bnd, &ibz_const_two, 8*nbytes-1); - ibz_abs(&abs, x); - assert(ibz_cmp(&abs, &bnd) < 0); - ibz_finalize(&bnd); - ibz_finalize(&abs); -} -#endif - const size_t digits = (nbytes + sizeof(digit_t) - 1) / sizeof(digit_t); - digit_t d[digits]; - memset(d, 0, sizeof(d)); - if (ibz_cmp(x, &ibz_const_zero) >= 0) { - // non-negative, straightforward. - ibz_to_digits(d, x); - } - else { - // negative; use two's complement. - ibz_t tmp; - ibz_init(&tmp); - ibz_neg(&tmp, x); - ibz_sub(&tmp, &tmp, &ibz_const_one); - ibz_to_digits(d, &tmp); - for (size_t i = 0; i < digits; ++i) - d[i] = ~d[i]; -#ifndef NDEBUG -{ - // make sure the result is correct - ibz_t chk; - ibz_init(&chk); - ibz_copy_digit_array(&tmp, d); - ibz_sub(&tmp, &tmp, x); - ibz_pow(&chk, &ibz_const_two, 8*sizeof(d)); - assert(!ibz_cmp(&tmp, &chk)); - ibz_finalize(&chk); -} -#endif - ibz_finalize(&tmp); - } - encode_digits(enc, d, nbytes); -} - -static void ibz_decode(ibz_t* dec, const unsigned char *x, size_t nbytes) -{ - assert(nbytes > 0); - const size_t ndigits = (nbytes + sizeof(digit_t) - 1) / sizeof(digit_t); - assert(ndigits > 0); - digit_t d[ndigits]; - memset(d, 0, sizeof(d)); - decode_digits(d, x, nbytes, ndigits); - if (x[nbytes-1] >> 7) { - // negative, decode two's complement - const size_t s = sizeof(digit_t)-1 - (sizeof(d) - nbytes); - assert(s < sizeof(digit_t)); - d[ndigits-1] |= ((digit_t) -1) >> 8*s << 8*s; - for (size_t i = 0; i < ndigits; ++i) - d[i] = ~d[i]; - ibz_copy_digits(dec, d, ndigits); - ibz_add(dec, dec, &ibz_const_one); - ibz_neg(dec, dec); - } - else { - // non-negative - ibz_copy_digits(dec, d, ndigits); - } -} - - -// fp2_t - -static void fp2_encode(const fp2_t* x, unsigned char *enc) -{ - fp2_t y; - fp2_frommont(&y, x); - encode_digits(enc, y.re, FP2_ENCODED_BYTES / 2); - encode_digits(enc + FP2_ENCODED_BYTES / 2, y.im, FP2_ENCODED_BYTES / 2); -} - -void fp2_decode(const unsigned char *x, fp2_t *dec) -{ - decode_digits(dec->re, x, FP2_ENCODED_BYTES / 2, NWORDS_FIELD); - decode_digits(dec->im, x + FP2_ENCODED_BYTES / 2, FP2_ENCODED_BYTES / 2, NWORDS_FIELD); - fp2_tomont(dec, dec); -} - - -// curves and points - -static void proj_encode(fp2_t const *x, fp2_t const *z, unsigned char *enc) -{ - assert(!fp2_is_zero(z)); - fp2_t tmp = *z; - fp2_inv(&tmp); -#ifndef NDEBUG -{ -fp2_t chk; -fp2_mul(&chk, z, &tmp); -fp2_t one = {0}; -fp_mont_setone(one.re); -assert(fp2_is_equal(&chk, &one)); -} -#endif - fp2_mul(&tmp, x, &tmp); - fp2_encode(&tmp, enc); -} - -static void proj_decode(const unsigned char *enc, fp2_t *x, fp2_t *z) -{ - fp2_decode(enc, x); - fp_mont_setone(z->re); - memset(z->im, 0, sizeof(z->im)); -} - -static void ec_curve_encode(const ec_curve_t* curve, unsigned char *enc) -{ - proj_encode(&curve->A, &curve->C, enc); -} - -static void ec_curve_decode(const unsigned char *enc, ec_curve_t* curve) -{ - proj_decode(enc, &curve->A, &curve->C); -} - -static void ec_point_encode(unsigned char *enc, const ec_point_t* point) -{ - proj_encode(&point->x, &point->z, enc); -} - -static void ec_point_decode(ec_point_t* point, const unsigned char *enc) -{ - proj_decode(enc, &point->x, &point->z); -} - -static void ec_basis_encode(unsigned char *enc, const ec_basis_t* basis) -{ - ec_point_encode(enc, &basis->P); - enc += EC_POINT_ENCODED_BYTES; - ec_point_encode(enc, &basis->Q); - enc += EC_POINT_ENCODED_BYTES; - ec_point_encode(enc, &basis->PmQ); -} - -static void ec_basis_decode(ec_basis_t* basis, const unsigned char *enc) -{ - ec_point_decode(&basis->P, enc); - enc += EC_POINT_ENCODED_BYTES; - ec_point_decode(&basis->Q, enc); - enc += EC_POINT_ENCODED_BYTES; - ec_point_decode(&basis->PmQ, enc); -} - - -// quat_alg_elem_t - -static void quat_alg_elem_encode(unsigned char *enc, const quat_alg_elem_t* elt) -{ - ibz_encode(enc, &elt->denom, QUAT_ALG_ELEM_ENCODED_BYTES); - enc += QUAT_ALG_ELEM_ENCODED_BYTES; - ibz_encode(enc, &elt->coord[0], QUAT_ALG_ELEM_ENCODED_BYTES); - enc += QUAT_ALG_ELEM_ENCODED_BYTES; - ibz_encode(enc, &elt->coord[1], QUAT_ALG_ELEM_ENCODED_BYTES); - enc += QUAT_ALG_ELEM_ENCODED_BYTES; - ibz_encode(enc, &elt->coord[2], QUAT_ALG_ELEM_ENCODED_BYTES); - enc += QUAT_ALG_ELEM_ENCODED_BYTES; - ibz_encode(enc, &elt->coord[3], QUAT_ALG_ELEM_ENCODED_BYTES); -} - -static void quat_alg_elem_decode(quat_alg_elem_t* elt, const unsigned char *enc) -{ - ibz_decode(&elt->denom, enc, QUAT_ALG_ELEM_ENCODED_BYTES); - enc += QUAT_ALG_ELEM_ENCODED_BYTES; - ibz_decode(&elt->coord[0], enc, QUAT_ALG_ELEM_ENCODED_BYTES); - enc += QUAT_ALG_ELEM_ENCODED_BYTES; - ibz_decode(&elt->coord[1], enc, QUAT_ALG_ELEM_ENCODED_BYTES); - enc += QUAT_ALG_ELEM_ENCODED_BYTES; - ibz_decode(&elt->coord[2], enc, QUAT_ALG_ELEM_ENCODED_BYTES); - enc += QUAT_ALG_ELEM_ENCODED_BYTES; - ibz_decode(&elt->coord[3], enc, QUAT_ALG_ELEM_ENCODED_BYTES); -} - - -// compressed isogeny chains - -static void id2iso_compressed_long_two_isog_encode(const id2iso_compressed_long_two_isog_t* isog, unsigned char *enc) -{ -unsigned char *const start = enc; - assert(isog->length == ZIP_CHAIN_LEN); - for (int i = 0; i < ZIP_CHAIN_LEN; ++i) { - ibz_encode(enc, &isog->zip_chain[i], ID2ISO_COMPRESSED_LONG_TWO_ISOG_ZIP_CHAIN_BYTES); - enc += ID2ISO_COMPRESSED_LONG_TWO_ISOG_ZIP_CHAIN_BYTES; - } - *enc++ = isog->bit_first_step; -assert(enc - start == ID2ISO_COMPRESSED_LONG_TWO_ISOG_BYTES); -} - -static void id2iso_compressed_long_two_isog_decode(const unsigned char *enc, id2iso_compressed_long_two_isog_t* isog) -{ -const unsigned char *const start = enc; - for (int i = 0; i < ZIP_CHAIN_LEN; ++i) { - ibz_decode(&isog->zip_chain[i], enc, ID2ISO_COMPRESSED_LONG_TWO_ISOG_ZIP_CHAIN_BYTES); - enc += ID2ISO_COMPRESSED_LONG_TWO_ISOG_ZIP_CHAIN_BYTES; - } - isog->bit_first_step = *enc++; -assert(enc - start == ID2ISO_COMPRESSED_LONG_TWO_ISOG_BYTES); -} - - -// public API - - -/** - * @brief Encodes a public key to a byte array - * - * @param enc Output: encoded public key - * @param pk: the public key - */ -void public_key_encode(unsigned char *enc, const public_key_t* pk) -{ - ec_curve_encode(&pk->E, enc); -} - -/** - * @brief Decodes a public key from a byte array - * - * @param pk Output: the decoded public key - * @param enc: encoded public key - */ -void public_key_decode(public_key_t* pk, const unsigned char *enc) -{ - ec_curve_decode(enc, &pk->E); -} - - -/** - * @brief Encodes a secret key to a byte array - * - * @param enc Output: encoded secret key - * @param sk: the secret key - * @param pk: the associated public key - */ -void secret_key_encode(unsigned char *enc, const secret_key_t* sk, const public_key_t* pk) -{ -unsigned char *const start = enc; -#ifndef NDEBUG -{ -fp2_t lhs, rhs; -fp2_mul(&lhs, &sk->curve.A, &pk->E.C); -fp2_mul(&rhs, &sk->curve.C, &pk->E.A); -assert(fp2_is_equal(&lhs, &rhs)); -} -#endif - ec_curve_encode(&sk->curve, enc); - enc += EC_CURVE_ENCODED_BYTES; - quat_alg_elem_encode(enc, &sk->gen_two); - enc += 5*QUAT_ALG_ELEM_ENCODED_BYTES; - ec_point_encode(enc, &sk->kernel_dual); - enc += EC_POINT_ENCODED_BYTES; - ec_basis_encode(enc, &sk->basis_plus); - enc += EC_BASIS_ENCODED_BYTES; - ec_basis_encode(enc, &sk->basis_minus); - enc += EC_BASIS_ENCODED_BYTES; -assert(enc - start == SECRETKEY_BYTES); -} - -static void secret_key_populate_full(secret_key_t* sk); - -/** - * @brief Decodes a secret key from a byte array - * - * @param sk Output: the decoded secret key - * @param pk Output: the associated public key - * @param enc: encoded secret key - */ -void secret_key_decode(secret_key_t* sk, public_key_t* pk, const unsigned char *enc) -{ -const unsigned char *const start = enc; - ec_curve_decode(enc, &sk->curve); - enc += EC_CURVE_ENCODED_BYTES; - quat_alg_elem_decode(&sk->gen_two, enc); - enc += 5*QUAT_ALG_ELEM_ENCODED_BYTES; - ec_point_decode(&sk->kernel_dual, enc); - enc += EC_POINT_ENCODED_BYTES; - ec_basis_decode(&sk->basis_plus, enc); - enc += EC_BASIS_ENCODED_BYTES; - ec_basis_decode(&sk->basis_minus, enc); - enc += EC_BASIS_ENCODED_BYTES; - pk->E = sk->curve; -assert(enc - start == SECRETKEY_BYTES); - - secret_key_populate_full(sk); -} - -/** - * Fully populates the decoded key - */ -static void secret_key_populate_full(secret_key_t* sk) -{ - // have: curve, gen_two, kernel_dual, basis_plus, basis_minus - // want: order, lideal_small, lideal_two - - ibz_t norm_two, norm_small; - ibz_init(&norm_two); - ibz_init(&norm_small); - - ibz_pow(&norm_two, &ibz_const_two, KLPT_keygen_length); - { - ibq_t norm; - ibq_init(&norm); - ibz_t tmp; - ibz_init(&tmp); - quat_alg_norm(&norm, &sk->gen_two, &QUATALG_PINFTY); - int r = ibq_to_ibz(&tmp, &norm); - assert(r); - ibz_div(&norm_small, &tmp, &tmp, &norm_two); - assert(ibz_is_zero(&tmp)); - ibq_finalize(&norm); - ibz_finalize(&tmp); - } - - quat_lideal_make_primitive_then_create(&sk->lideal_two, &sk->gen_two, &norm_two, &STANDARD_EXTREMAL_ORDER.order, &QUATALG_PINFTY); - - quat_alg_elem_t conj; - quat_alg_elem_init(&conj); - quat_alg_conj(&conj, &sk->gen_two); - quat_lideal_make_primitive_then_create(&sk->lideal_small, &conj, &norm_small, &STANDARD_EXTREMAL_ORDER.order, &QUATALG_PINFTY); - quat_alg_elem_finalize(&conj); - - ibz_finalize(&norm_small); - ibz_finalize(&norm_two); -} - - -/** - * @brief Encodes a signature to a byte array - * - * @param enc Output: encoded signature - * @param sig: the signature - */ -void signature_encode(unsigned char* enc, const signature_t* sig) -{ -unsigned char *const start = enc; - id2iso_compressed_long_two_isog_encode(&sig->zip, enc); - enc += ID2ISO_COMPRESSED_LONG_TWO_ISOG_BYTES; - encode_digits(enc, sig->r, TORSION_23POWER_BYTES); - enc += TORSION_23POWER_BYTES; - *enc++ = sig->s.select23; - encode_digits(enc, sig->s.scalar2, TORSION_2POWER_BYTES); - enc += TORSION_2POWER_BYTES; - encode_digits(enc, sig->s.scalar3, TORSION_3POWER_BYTES); - enc += TORSION_3POWER_BYTES; -assert(enc - start == SIGNATURE_LEN); -} - -/** - * @brief Decodes a signature from a byte array - * - * @param sig Output: the decoded signature - * @param enc: encoded signature - */ -void signature_decode(signature_t* sig, const unsigned char* enc) -{ -const unsigned char *const start = enc; - id2iso_compressed_long_two_isog_decode(enc, &sig->zip); - enc += ID2ISO_COMPRESSED_LONG_TWO_ISOG_BYTES; - memset(&sig->r, 0, sizeof(sig->r)); - decode_digits(sig->r, enc, TORSION_23POWER_BYTES, sizeof(sig->r)/sizeof(*sig->r)); - enc += TORSION_23POWER_BYTES; - memset(&sig->s, 0, sizeof(sig->s)); - sig->s.select23 = *enc++; - decode_digits(sig->s.scalar2, enc, TORSION_2POWER_BYTES, sizeof(sig->s.scalar2)/sizeof(*sig->s.scalar2)); - enc += TORSION_2POWER_BYTES; - decode_digits(sig->s.scalar3, enc, TORSION_3POWER_BYTES, sizeof(sig->s.scalar3)/sizeof(*sig->s.scalar3)); - enc += TORSION_3POWER_BYTES; -assert(enc - start == SIGNATURE_LEN); -} - - - -#include - -void hash_to_challenge(ibz_vec_2_t *scalars, const ec_curve_t *curve, const unsigned char *message, size_t length) -{ - unsigned char *buf = malloc(FP2_ENCODED_BYTES + length); - { - fp2_t j; - ec_j_inv(&j, curve); - fp2_encode(&j, buf); - memcpy(buf + FP2_ENCODED_BYTES, message, length); - } - - //FIXME omits some vectors, notably (a,1) with gcd(a,6)!=1 but also things like (2,3). - { - digit_t digits[NWORDS_FIELD]; - - //FIXME should use SHAKE128 for smaller parameter sets? - SHAKE256((void *) digits, sizeof(digits), buf, FP2_ENCODED_BYTES + length); - -#ifdef TARGET_BIG_ENDIAN - for (size_t i = 0; i < NWORDS_FIELD; i++) - digits[i] = BSWAP_DIGIT(digits[i]); -#endif - - ibz_set(&(*scalars)[0], 1); //FIXME - ibz_copy_digit_array(&(*scalars)[1], digits); - } - -#ifndef NDEBUG -{ -ibz_t gcd; -ibz_init(&gcd); -ibz_set(&gcd, 6); -ibz_gcd(&gcd, &gcd, &(*scalars)[0]); -ibz_gcd(&gcd, &gcd, &(*scalars)[1]); -assert(ibz_is_one(&gcd)); -ibz_finalize(&gcd); -} -#endif - - free(buf); -} - diff --git a/src/protocols/ref/protocolsx/keygen.c b/src/protocols/ref/protocolsx/keygen.c deleted file mode 100644 index b793f97..0000000 --- a/src/protocols/ref/protocolsx/keygen.c +++ /dev/null @@ -1,238 +0,0 @@ -#include - - -void secret_key_init(secret_key_t *sk) { - quat_left_ideal_init(&sk->lideal_small); - quat_left_ideal_init(&sk->lideal_two); - quat_alg_elem_init(&sk->gen_two); -} - -void secret_key_finalize(secret_key_t *sk) { - quat_left_ideal_finalize(&sk->lideal_small); - quat_left_ideal_finalize(&sk->lideal_two); - quat_alg_elem_finalize(&sk->gen_two); -} - - -/** - * @brief Computing a key pair - * - * @param pk : Output the public key - * @param sk : Output the secret key - * @returns a bit indicating if the computation succeeded - * assumes that sk and pk have been initialized - */ -int protocols_keygen(public_key_t *pk, secret_key_t *sk) { - - // var dec - int found = 1; - ibz_t temp,remainder; - ibq_t ibq_norm; - quat_alg_elem_t gen,gen_two; - quat_alg_elem_t quat_temp; - - quat_left_ideal_t lideal_two_one,lideal_small_one; - quat_order_t right_order; - id2iso_compressed_long_two_isog_t zip; - quat_alg_coord_t coeffs; - ibz_mat_4x4_t reduced,gram; - - ec_basis_t basis_plus,basis_minus; - ec_basis_t odd_basis[2]; - ec_curve_t curve = {0}; - ec_point_t kernel_dual = {0}; - ec_basis_t even_basis = {0}; - ec_isog_even_t isog_two_one; - - - // var init - ibq_init(&ibq_norm); - ibz_init(&temp);ibz_init(&remainder); - quat_alg_elem_init(&gen);quat_alg_elem_init(&quat_temp); - quat_alg_elem_init(&gen_two); - quat_left_ideal_init(&lideal_two_one); - quat_left_ideal_init(&lideal_small_one); - quat_order_init(&right_order); - quat_alg_coord_init(&coeffs); - ibz_mat_4x4_init(&reduced);ibz_mat_4x4_init(&gram); - - // computing the length of the walk - int length = KLPT_keygen_length/TORSION_PLUS_EVEN_POWER; - assert(KLPT_keygen_length==TORSION_PLUS_EVEN_POWER*length); - - found = 0; - int cnt = 0; - while (!found && cnt < SQISIGN_response_attempts) { - cnt ++; - - // computation of lideal_small - found = klpt_keygen_random_ideal(&sk->lideal_small,&STANDARD_EXTREMAL_ORDER,&QUATALG_PINFTY); - if (!found) { - continue; - } - - - // application of keygen_klpt to compute a generator of lideal_two - found = found && klpt_keygen_klpt(&gen,&sk->lideal_small,&QUATALG_PINFTY); - quat_alg_normalize(&gen); - assert(quat_lattice_contains(&coeffs,&sk->lideal_small.lattice,&gen,&QUATALG_PINFTY)); - #ifndef NDEBUG - quat_left_ideal_t ideal_test; - quat_left_ideal_init(&ideal_test); - quat_lideal_make_primitive_then_create(&ideal_test,&gen,&sk->lideal_small.norm,&STANDARD_EXTREMAL_ORDER.order,&QUATALG_PINFTY); - assert(quat_lideal_equals(&ideal_test,&sk->lideal_small,&QUATALG_PINFTY)); - quat_left_ideal_finalize(&ideal_test); - #endif - - // gen = conjugate(gen) - quat_alg_conj(&gen,&gen); - - // sk.gen_two = gen - quat_alg_elem_copy(&sk->gen_two,&gen); - - - - // computation of the norm of lideal_two - quat_alg_norm(&ibq_norm,&gen,&QUATALG_PINFTY); - ibq_to_ibz(&temp,&ibq_norm); - ibz_div(&temp,&remainder,&temp,&sk->lideal_small.norm); - assert(0==ibz_cmp(&remainder,&ibz_const_zero)); - - // computation of lideal_two - quat_lideal_make_primitive_then_create(&sk->lideal_two,&gen,&temp,&STANDARD_EXTREMAL_ORDER.order,&QUATALG_PINFTY); - // for debug we check that the two ideals are equivalent - assert(quat_lideal_isom(&quat_temp,&sk->lideal_two,&sk->lideal_small,&QUATALG_PINFTY)); - - // we compute a better generator to make the translation - // for this, we look for a generator with odd trace - int find_gen = 0; - while (!find_gen) { - ibz_rand_interval_minm_m(&coeffs[0],KLPT_equiv_bound_coeff); - ibz_rand_interval_minm_m(&coeffs[1],KLPT_equiv_bound_coeff); - ibz_rand_interval_minm_m(&coeffs[2],KLPT_equiv_bound_coeff); - ibz_rand_interval_minm_m(&coeffs[3],KLPT_equiv_bound_coeff); - ibz_mat_4x4_eval(&gen.coord,&sk->lideal_two.lattice.basis,&coeffs); - ibz_copy(&gen.denom,&sk->lideal_two.lattice.denom); - - quat_alg_trace(&ibq_norm,&gen); - ibq_to_ibz(&temp,&ibq_norm); - find_gen = (0!=ibz_get(&temp)%2); - } - - // computing the ideal of the first step as lideal_two_one = O0 < gen,2^f > - ibz_pow(&remainder,&ibz_const_two,TORSION_PLUS_EVEN_POWER); - quat_lideal_create_from_primitive(&lideal_two_one,&gen,&remainder,&STANDARD_EXTREMAL_ORDER.order,&QUATALG_PINFTY); - - // computing the right_order - quat_lideal_right_order(&right_order,&lideal_two_one,&QUATALG_PINFTY); - - // for debug checking that gen is indeed contained in right_order - assert(quat_lattice_contains(&coeffs,&right_order,&gen,&QUATALG_PINFTY)); - - // computing an ideal equivalent to lideal_two_one - quat_lideal_reduce_basis(&reduced,&gram,&lideal_two_one,&QUATALG_PINFTY); - found = found && klpt_lideal_equiv(&gen_two,&temp,&reduced,&gram,&lideal_two_one.norm,&lideal_two_one.lattice.denom,&QUATALG_PINFTY); - if (!found) { - continue; - } - - // lideal_small = O0 < gen_two , temp> - quat_lideal_create_from_primitive(&lideal_small_one,&gen_two,&temp,&STANDARD_EXTREMAL_ORDER.order,&QUATALG_PINFTY); - quat_alg_conj(&gen_two,&gen_two); - assert(quat_lattice_contains(&coeffs,&lideal_two_one.lattice,&gen_two,&QUATALG_PINFTY)); - assert(quat_lideal_isom(&quat_temp,&lideal_two_one,&lideal_small_one,&QUATALG_PINFTY)); - - // casting gen into the right order of lideal_small_one - // gen = gen_two * gen * gen_two^ {-1} - quat_alg_elem_copy(&quat_temp,&gen_two); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&lideal_two_one.norm); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&lideal_small_one.norm); - quat_alg_mul(&gen,&quat_temp,&gen,&QUATALG_PINFTY); - quat_alg_conj(&quat_temp,&gen_two); - quat_alg_mul(&gen,&gen,&quat_temp,&QUATALG_PINFTY); - - - #ifndef NDEBUG - quat_left_ideal_init(&ideal_test); - quat_lideal_right_order(&right_order,&lideal_small_one,&QUATALG_PINFTY); - assert(quat_lattice_contains(&coeffs,&right_order,&gen,&QUATALG_PINFTY)); - int lideal_generator_ok = quat_lideal_generator_coprime(&quat_temp,&lideal_small_one,&ibz_const_two,&QUATALG_PINFTY,0); - assert(lideal_generator_ok); - quat_alg_mul(&quat_temp,&quat_temp,&gen,&QUATALG_PINFTY); - ibz_pow(&temp,&ibz_const_two,TORSION_PLUS_EVEN_POWER*(length -1) ); - ibz_mul(&temp,&temp,&lideal_small_one.norm); - quat_lideal_create_from_primitive(&ideal_test,&quat_temp,&temp,&STANDARD_EXTREMAL_ORDER.order,&QUATALG_PINFTY); - assert(quat_lideal_isom(&quat_temp,&ideal_test,&sk->lideal_small,&QUATALG_PINFTY)); - quat_left_ideal_finalize(&ideal_test); - #endif - - - // copying the precomputed basis - basis_plus = BASIS_ODD_PLUS; - basis_minus = BASIS_ODD_MINUS; - odd_basis[0] = basis_minus; - odd_basis[1] = basis_plus; - - // copying the starting curve - curve = CURVE_E0; - - // Computing the first isogeny - id2iso_ideal_to_isogeny_even(&isog_two_one,&lideal_two_one); - - // computation of the deterministic second point as the kernel dual - ec_complete_basis_2(&even_basis,&curve,&isog_two_one.kernel); - kernel_dual = even_basis.Q; - - // evaluation through the first isogeny - ec_eval_even_basis(&curve,&isog_two_one,odd_basis,2); - basis_minus = odd_basis[0]; basis_plus=odd_basis[1]; - ec_curve_t E = CURVE_E0; - ec_eval_even(&E,&isog_two_one,&kernel_dual,1); - - // init of the zip - id2iso_compressed_long_two_isog_init(&zip, length-1); - - - // Computing the rest of the chain - found = found && id2iso_ideal_to_isogeny_two_long_power_of_2(&zip,&curve,&basis_minus,&basis_plus,&kernel_dual,&gen,length-1,&lideal_small_one,&lideal_two_one,&gen_two,&QUATALG_PINFTY); - if (!found) { - continue; - } - } - - sk->curve = curve; - sk->kernel_dual = kernel_dual; - sk->basis_minus = basis_minus; - sk->basis_plus = basis_plus; - - // normalizing the curve - ec_isom_t isom; - ec_curve_normalize(&sk->curve,&isom,&sk->curve); - ec_iso_eval(&sk->kernel_dual,&isom); - ec_iso_eval(&sk->basis_minus.P,&isom); - ec_iso_eval(&sk->basis_minus.Q,&isom); - ec_iso_eval(&sk->basis_minus.PmQ,&isom); - ec_iso_eval(&sk->basis_plus.P,&isom); - ec_iso_eval(&sk->basis_plus.Q,&isom); - ec_iso_eval(&sk->basis_plus.PmQ,&isom); - - // setting the public key - pk->E = sk->curve; - - - // var finalize - ibq_finalize(&ibq_norm); - ibz_finalize(&temp);ibz_finalize(&remainder); - quat_alg_elem_finalize(&gen); - quat_alg_elem_finalize(&gen_two); - quat_left_ideal_finalize(&lideal_two_one); - quat_left_ideal_finalize(&lideal_small_one); - quat_order_finalize(&right_order); - quat_alg_coord_finalize(&coeffs); - ibz_mat_4x4_finalize(&reduced);ibz_mat_4x4_finalize(&gram); - quat_alg_elem_finalize(&quat_temp); - id2iso_compressed_long_two_isog_finalize(&zip); - - - return found; -} diff --git a/src/protocols/ref/protocolsx/sign.c b/src/protocols/ref/protocolsx/sign.c deleted file mode 100644 index 1e531ba..0000000 --- a/src/protocols/ref/protocolsx/sign.c +++ /dev/null @@ -1,762 +0,0 @@ -#include - - -void signature_init(signature_t *sig) -{ - id2iso_compressed_long_two_isog_init(&sig->zip, SQISIGN_signing_length); -} - -void signature_finalize(signature_t *sig) -{ - id2iso_compressed_long_two_isog_finalize(&sig->zip); -} - - -void protocols_commit(quat_left_ideal_t *ideal, ec_curve_t *E1, ec_basis_t *basis) -{ - ibz_vec_2_t vec; - ibz_vec_2_init(&vec); - - ibz_t tmp; - ibz_init(&tmp); - - // sample the random scalars - do { - ibz_rand_interval(&vec[0], &ibz_const_one, &DEGREE_COMMITMENT); - ibz_rand_interval(&vec[1], &ibz_const_one, &DEGREE_COMMITMENT); - ibz_gcd(&tmp, &vec[0], &vec[1]); - ibz_gcd(&tmp, &tmp, &DEGREE_COMMITMENT); - } while (!ibz_is_one(&tmp)); - - // deduce the commitment ideal - { - quat_alg_elem_t gen; - quat_alg_elem_init(&gen); - - ibz_set(&gen.denom, 1); - for (unsigned i = 0; i < 4; ++i) { - ibz_mul(&gen.coord[i], &COMMITMENT_IDEAL_DISTORTION_ENDO.coord[i], &vec[1]); - if (i) - ibz_neg(&gen.coord[i], &gen.coord[i]); // conjugate - } - ibz_add(&gen.coord[0], &gen.coord[0], &vec[0]); - // now gen = a + b*dual(theta) where vec=(a,b) and theta is the distortion map - - quat_alg_mul(&gen, &COMMITMENT_IDEAL_UNDISTORTED_GEN, &gen, &QUATALG_PINFTY); - - #ifndef NDEBUG - quat_alg_coord_t coeffs; - ibz_t temp,remainder; - quat_alg_coord_init(&coeffs); - ibz_init(&temp);ibz_init(&remainder); - quat_alg_make_primitive(&coeffs,&temp,&gen,&MAXORD_O0,&QUATALG_PINFTY); - ibz_mul(&gen.denom,&gen.denom,&temp); - quat_alg_normalize(&gen); - assert(quat_alg_is_primitive(&gen,&MAXORD_O0,&QUATALG_PINFTY)); - ibq_t ibq_norm; - ibq_init(&ibq_norm); - quat_alg_norm(&ibq_norm,&gen,&QUATALG_PINFTY); - assert(ibq_to_ibz(&temp,&ibq_norm)); - ibq_finalize(&ibq_norm); - ibz_gcd(&temp,&temp,&DEGREE_COMMITMENT); - ibz_div(&temp,&remainder,&temp,&DEGREE_COMMITMENT); - assert(0==ibz_cmp(&remainder,&ibz_const_zero)); - ibz_finalize(&temp);ibz_finalize(&remainder); - quat_alg_coord_finalize(&coeffs); - #endif - - - quat_lideal_make_primitive_then_create(ideal, &gen, &DEGREE_COMMITMENT, &MAXORD_O0, &QUATALG_PINFTY); - assert(!ibz_cmp(&ideal->norm, &DEGREE_COMMITMENT)); - - quat_alg_elem_finalize(&gen); - } - - // deduce the commitment isogeny - ec_isog_odd_t isogeny; - { - isogeny.curve = CURVE_E0; - for (size_t i = 0; i < sizeof(TORSION_ODD_PRIMES)/sizeof(*TORSION_ODD_PRIMES); ++i) - isogeny.degree[i] = DEGREE_COMMITMENT_POWERS[i]; - - digit_t scalars_plus[2][NWORDS_FIELD], scalars_minus[2][NWORDS_FIELD]; - ibz_mod(&tmp, &vec[0], &DEGREE_COMMITMENT_PLUS); - ibz_to_digit_array(scalars_plus[0], &tmp); - ibz_mod(&tmp, &vec[1], &DEGREE_COMMITMENT_PLUS); - ibz_to_digit_array(scalars_plus[1], &tmp); - ibz_mod(&tmp, &vec[0], &DEGREE_COMMITMENT_MINUS); - ibz_to_digit_array(scalars_minus[0], &tmp); - ibz_mod(&tmp, &vec[1], &DEGREE_COMMITMENT_MINUS); - ibz_to_digit_array(scalars_minus[1], &tmp); - - ec_biscalar_mul(&isogeny.ker_plus, &CURVE_E0, scalars_plus[0], scalars_plus[1], &BASIS_COMMITMENT_PLUS); - ec_biscalar_mul(&isogeny.ker_minus, &CURVE_E0, scalars_minus[0], scalars_minus[1], &BASIS_COMMITMENT_MINUS); - } - - ec_curve_t E1comp; - ec_eval_odd_basis(&E1comp, &isogeny, basis, 1); - - // normalize E1 with the pushed basis - { - ec_isom_t isom; - ec_curve_normalize(E1, &isom, &E1comp); - ec_iso_eval(&basis->P, &isom); - ec_iso_eval(&basis->Q, &isom); - ec_iso_eval(&basis->PmQ, &isom); - } - - ibz_finalize(&tmp); - ibz_vec_2_finalize(&vec); -} - -void protocols_challenge(quat_left_ideal_t *ideal, signature_t *sig, const ec_curve_t *E1, const ec_basis_t *pushedbasis6, const ibz_vec_2_t *hash, ec_curve_t *out_E2) -{ - // compute deterministic and pushed 2*3*-torsion bases on E1 - ec_basis_t E1basis6, E1basis2, E1basis3; - ec_basis_t pushedbasis2, pushedbasis3; - ec_curve_to_basis_6(&E1basis6, E1); - { - digit_t scalar[NWORDS_FIELD]; - ibz_to_digit_array(scalar, &TORSION_PLUS_3POWER); - ec_mul(&E1basis2.P, E1, scalar, &E1basis6.P); - ec_mul(&E1basis2.Q, E1, scalar, &E1basis6.Q); - ec_mul(&E1basis2.PmQ, E1, scalar, &E1basis6.PmQ); - ec_mul(&pushedbasis2.P, E1, scalar, &pushedbasis6->P); - ec_mul(&pushedbasis2.Q, E1, scalar, &pushedbasis6->Q); - ec_mul(&pushedbasis2.PmQ, E1, scalar, &pushedbasis6->PmQ); - ibz_to_digit_array(scalar, &TORSION_PLUS_2POWER); - ec_mul(&E1basis3.P, E1, scalar, &E1basis6.P); - ec_mul(&E1basis3.Q, E1, scalar, &E1basis6.Q); - ec_mul(&E1basis3.PmQ, E1, scalar, &E1basis6.PmQ); - ec_mul(&pushedbasis3.P, E1, scalar, &pushedbasis6->P); - ec_mul(&pushedbasis3.Q, E1, scalar, &pushedbasis6->Q); - ec_mul(&pushedbasis3.PmQ, E1, scalar, &pushedbasis6->PmQ); - } - - // compute the kernel of the challenge isogeny - ec_point_t ker; - { - digit_t scalars[2][NWORDS_FIELD]; - ibz_to_digit_array(scalars[0], &(*hash)[0]); - ibz_to_digit_array(scalars[1], &(*hash)[1]); - ec_biscalar_mul(&ker, E1, scalars[0], scalars[1], &E1basis6); - } - ec_point_t ker2, ker3; - { - digit_t scalar[NWORDS_FIELD]; - ibz_to_digit_array(scalar, &TORSION_PLUS_3POWER); - ec_mul(&ker2, E1, scalar, &ker); - ibz_to_digit_array(scalar, &TORSION_PLUS_2POWER); - ec_mul(&ker3, E1, scalar, &ker); - } - - // compute ideal corresponding to the challenge isogeny, pulled back to O0 - { - // compute the logarithm of the kernel with respect to the pushed basis - ibz_vec_2_t vec2, vec3; - ibz_vec_2_init(&vec2); - ibz_vec_2_init(&vec3); - digit_t log[2][NWORDS_FIELD]; - - ec_dlog_2(log[0], log[1], &pushedbasis2, &ker2, E1); - - ibz_copy_digit_array(&vec2[0], log[0]); - ibz_copy_digit_array(&vec2[1], log[1]); - - ec_dlog_3(log[0], log[1], &pushedbasis3, &ker3, E1); - - ibz_copy_digit_array(&vec3[0], log[0]); - ibz_copy_digit_array(&vec3[1], log[1]); - - // now compute the ideal - id2iso_kernel_dlogs_to_ideal(ideal, &vec2, &vec3); - - ibz_vec_2_finalize(&vec2); - ibz_vec_2_finalize(&vec3); - assert(!ibz_cmp(&ideal->norm, &DEGREE_CHALLENGE)); - } - - // compute the isogeny, evaluate at suitable point to find kernel of dual - ec_curve_t Emid, E2comp, E2; - ec_point_t pts[2]; - ec_isom_t E2isom; - { - ec_isog_even_t isog2 = {.curve = *E1, .length = TORSION_PLUS_EVEN_POWER, .kernel = ker2}; - - // find a point independent to the kernel to push it through - { - bool const bit2 = !ibz_divides(&(*hash)[0], &ibz_const_two); - bool const bit3 = !ibz_divides(&(*hash)[0], &ibz_const_three); - if (bit2 == bit3) { - pts[0] = bit2 ? E1basis6.Q : E1basis6.P; - } - else { - digit_t scalars[2][NWORDS_FIELD]; - ibz_to_digit_array(scalars[bit3], &TORSION_PLUS_2POWER); - ibz_to_digit_array(scalars[bit2], &TORSION_PLUS_3POWER); - ec_biscalar_mul(&pts[0], E1, scalars[0], scalars[1], &E1basis6); - } - } - pts[1] = ker; - - ec_eval_even(&Emid, &isog2, pts, 2); - assert(!fp2_is_zero(&Emid.C)); - - assert(TORSION_ODD_PRIMES[0] == 3); - ec_isog_odd_t isog3 = {.curve = Emid, .degree = {TORSION_ODD_POWERS[0]}, .ker_plus = pts[1]}; - - ec_eval_odd(&E2comp, &isog3, pts, 1); - assert(!fp2_is_zero(&E2comp.C)); - - ec_curve_normalize(&E2, &E2isom, &E2comp); - if (out_E2) *out_E2 = E2; - - ec_iso_eval(&pts[0], &E2isom); - } - // now the kernel of the dual is in pts[0] - - // decompose kernel of dual over deterministic 2*3*-torsion basis on E2 - ibz_vec_2_t vec2, vec3; - ibz_vec_2_init(&vec2); - ibz_vec_2_init(&vec3); - ec_basis_t E2basis6; - { - ec_basis_t E2basis2, E2basis3; - ec_curve_to_basis_6(&E2basis6, &E2); - - // set up the 2-power and 3-power bases as images of the 2*3*-torsion one - { - digit_t scalar[NWORDS_FIELD]; - ibz_to_digit_array(scalar, &TORSION_PLUS_3POWER); - ec_mul(&E2basis2.P, &E2, scalar, &E2basis6.P); - ec_mul(&E2basis2.Q, &E2, scalar, &E2basis6.Q); - ec_mul(&E2basis2.PmQ, &E2, scalar, &E2basis6.PmQ); - ibz_to_digit_array(scalar, &TORSION_PLUS_2POWER); - ec_mul(&E2basis3.P, &E2, scalar, &E2basis6.P); - ec_mul(&E2basis3.Q, &E2, scalar, &E2basis6.Q); - ec_mul(&E2basis3.PmQ, &E2, scalar, &E2basis6.PmQ); - } - - // compute the 2-power and 3-power parts of the kernel of the dual - { - digit_t scalar[NWORDS_FIELD]; - ibz_to_digit_array(scalar, &TORSION_PLUS_2POWER); - ec_mul(&pts[1], &E2, scalar, &pts[0]); - ibz_to_digit_array(scalar, &TORSION_PLUS_3POWER); - ec_mul(&pts[0], &E2, scalar, &pts[0]); - } - - // now compute the logarithms - { - digit_t scalars[2][NWORDS_FIELD]; - - ec_dlog_2(scalars[0], scalars[1], &E2basis2, &pts[0], &E2); - ibz_copy_digit_array(&vec2[0], scalars[0]); - ibz_copy_digit_array(&vec2[1], scalars[1]); -//ibz_vec_2_print(&vec2); -#ifndef NDEBUG -{ - ec_point_t tmp; - ec_biscalar_mul(&tmp, &E2, scalars[0], scalars[1], &E2basis2); - assert(ec_is_equal(&tmp, &pts[0])); -} -#endif - - ec_dlog_3(scalars[0], scalars[1], &E2basis3, &pts[1], &E2); - ibz_copy_digit_array(&vec3[0], scalars[0]); - ibz_copy_digit_array(&vec3[1], scalars[1]); -//ibz_vec_2_print(&vec3); -#ifndef NDEBUG -{ - ec_point_t tmp; - ec_biscalar_mul(&tmp, &E2, scalars[0], scalars[1], &E2basis3); - assert(ec_is_equal(&tmp, &pts[1])); -} -#endif - } - } - - // encode this projective vector in the signature field s - bool const bit2 = !ibz_divides(&vec2[0], &ibz_const_two); - bool const bit3 = !ibz_divides(&vec3[0], &ibz_const_three); - { - assert(!ibz_divides(&vec2[!bit2], &ibz_const_two)); - assert(!ibz_divides(&vec3[!bit3], &ibz_const_three)); - - { - ibz_t inv; - ibz_init(&inv); - - ibz_invmod(&inv, &vec2[!bit2], &TORSION_PLUS_2POWER); - ibz_mul(&vec2[bit2], &vec2[bit2], &inv); - ibz_mod(&vec2[bit2], &vec2[bit2], &TORSION_PLUS_2POWER); - ibz_set(&vec2[!bit2], 1); - - ibz_invmod(&inv, &vec3[!bit3], &TORSION_PLUS_3POWER); - ibz_mul(&vec3[bit3], &vec3[bit3], &inv); - ibz_mod(&vec3[bit3], &vec3[bit3], &TORSION_PLUS_3POWER); - ibz_set(&vec3[!bit3], 1); - - ibz_finalize(&inv); - } -//printf("bit2=%u bit3=%u\n", (unsigned) bit2, (unsigned) bit3); -//ibz_vec_2_print(&vec2); -//ibz_vec_2_print(&vec3); - - sig->s.select23 = bit2 | ((unsigned) bit3 << 1); - ibz_to_digit_array(sig->s.scalar2, &vec2[bit2]); - ibz_to_digit_array(sig->s.scalar3, &vec3[bit3]); - } - - // find another independent point R deterministically - ec_point_t R; - if (bit2 == bit3) { - R = bit2 ? E2basis6.Q : E2basis6.P; - } - else { - digit_t scalars[2][NWORDS_FIELD]; - ibz_to_digit_array(scalars[bit3], &TORSION_PLUS_2POWER); - ibz_to_digit_array(scalars[bit2], &TORSION_PLUS_3POWER); - ec_biscalar_mul(&R, &E2, scalars[0], scalars[1], &E2basis6); - } - - // evaluate the dual of the challenge isogeny - { - { - ec_isom_t E2isom_inv = E2isom; - ec_iso_inv(&E2isom_inv); - ec_iso_eval(&pts[0], &E2isom_inv); - ec_iso_eval(&pts[1], &E2isom_inv); - ec_iso_eval(&R, &E2isom_inv); - } - - assert(TORSION_ODD_PRIMES[0] == 3); - ec_isog_odd_t isog3dual = {.curve = E2comp, .degree = {TORSION_ODD_POWERS[0]}, .ker_plus = pts[1]}; - ec_curve_t Emidcomp; - pts[1] = R; - ec_eval_odd(&Emidcomp, &isog3dual, pts, 2); - assert(!fp2_is_zero(&Emidcomp.C)); -#ifndef NDEBUG -{ - fp2_t j1, j2; - ec_j_inv(&j1, &Emid); - ec_j_inv(&j2, &Emidcomp); - assert(fp2_is_equal(&j1, &j2)); -} -#endif - - R = pts[1]; - - ec_isog_even_t isog2dual = {.curve = Emidcomp, .length = TORSION_PLUS_EVEN_POWER, .kernel = pts[0]}; - ec_curve_t E1comp; - ec_eval_even(&E1comp, &isog2dual, &R, 1); - assert(!fp2_is_zero(&E1comp.C)); -#ifndef NDEBUG -{ - fp2_t j1, j2; - ec_j_inv(&j1, E1); - ec_j_inv(&j2, &E1comp); - assert(fp2_is_equal(&j1, &j2)); -} -#endif - - { - ec_isom_t E1isom; - ec_isomorphism(&E1isom, &E1comp, E1); - ec_iso_eval(&R, &E1isom); - } - } - - ibz_t r; - ibz_init(&r); - //TODO this should just be a 1-dimensional logarithm in the 2*3*-torsion - { - ec_point_t R2, R3; - { - digit_t scalar[NWORDS_FIELD]; - ibz_to_digit_array(scalar, &TORSION_PLUS_3POWER); - ec_mul(&R2, E1, scalar, &R); - ibz_to_digit_array(scalar, &TORSION_PLUS_2POWER); - ec_mul(&R3, E1, scalar, &R); - } - - ibz_vec_2_t log2, log3; - ibz_vec_2_init(&log2); - ibz_vec_2_init(&log3); - { - digit_t scalars[2][NWORDS_FIELD] = {0}; - ec_dlog_2(scalars[0], scalars[1], &E1basis2, &R2, E1); -#ifndef NDEBUG -{ - ec_point_t tmp; - ec_biscalar_mul(&tmp, E1, scalars[0], scalars[1], &E1basis2); - assert(ec_is_equal(&tmp, &R2)); -} -#endif - ibz_copy_digit_array(&log2[0], scalars[0]); - ibz_copy_digit_array(&log2[1], scalars[1]); - memset(scalars, 0, sizeof(scalars)); - ec_dlog_3(scalars[0], scalars[1], &E1basis3, &R3, E1); -#ifndef NDEBUG -{ - ec_point_t tmp; - ec_biscalar_mul(&tmp, E1, scalars[0], scalars[1], &E1basis3); - assert(ec_is_equal(&tmp, &R3)); -} -#endif - ibz_copy_digit_array(&log3[0], scalars[0]); - ibz_copy_digit_array(&log3[1], scalars[1]); -#ifndef NDEBUG -{ -ibz_t lhs, rhs; -ibz_init(&lhs); -ibz_init(&rhs); -// check log2 is a multiple of hash modulo 2* -ibz_mul(&lhs, &log2[0], &(*hash)[1]); -ibz_mul(&rhs, &log2[1], &(*hash)[0]); -ibz_mod(&lhs, &lhs, &TORSION_PLUS_2POWER); -ibz_mod(&rhs, &rhs, &TORSION_PLUS_2POWER); -assert(!ibz_cmp(&lhs, &rhs)); -// check log3 is a multiple of hash modulo 3* -ibz_mul(&lhs, &log3[0], &(*hash)[1]); -ibz_mul(&rhs, &log3[1], &(*hash)[0]); -ibz_mod(&lhs, &lhs, &TORSION_PLUS_3POWER); -ibz_mod(&rhs, &rhs, &TORSION_PLUS_3POWER); -assert(!ibz_cmp(&lhs, &rhs)); -ibz_finalize(&lhs); -ibz_finalize(&rhs); -} -#endif - - { - ibz_t r2, r3; - ibz_init(&r2); - ibz_init(&r3); - bool bit = ibz_divides(&log2[0], &ibz_const_two); - assert(!ibz_divides(&log2[bit], &ibz_const_two)); - ibz_invmod(&r2, &log2[bit], &TORSION_PLUS_2POWER); - ibz_mul(&r2, &(*hash)[bit], &r2); - ibz_mod(&r2, &r2, &TORSION_PLUS_2POWER); -//ibz_printf("r2 = %#Zx\n", &r2); -#ifndef NDEBUG -{ - digit_t scalar[NWORDS_FIELD]; - ibz_to_digit_array(scalar, &r2); - ec_point_t T1, T2; - ec_mul(&T1, E1, scalar, &R); - ibz_to_digit_array(scalar, &TORSION_PLUS_3POWER); - ec_mul(&T1, E1, scalar, &T1); - ec_mul(&T2, E1, scalar, &ker); - assert(ec_is_equal(&T1, &T2)); -} -#endif - bit = ibz_divides(&log3[0], &ibz_const_three); - assert(!ibz_divides(&log3[bit], &ibz_const_three)); - ibz_invmod(&r3, &log3[bit], &TORSION_PLUS_3POWER); - ibz_mul(&r3, &(*hash)[bit], &r3); - ibz_mod(&r3, &r3, &TORSION_PLUS_3POWER); -//ibz_printf("r3 = %#Zx\n", &r3); -#ifndef NDEBUG -{ - digit_t scalar[NWORDS_FIELD]; - ibz_to_digit_array(scalar, &r3); - ec_point_t T1, T2; - ec_mul(&T1, E1, scalar, &R); - ibz_to_digit_array(scalar, &TORSION_PLUS_2POWER); - ec_mul(&T1, E1, scalar, &T1); - ec_mul(&T2, E1, scalar, &ker); - assert(ec_is_equal(&T1, &T2)); -} -#endif - ibz_crt(&r, &r2, &r3, &TORSION_PLUS_2POWER, &TORSION_PLUS_3POWER); - // check if we mixed up the signs and correct it in that case - { - digit_t scalar[NWORDS_FIELD]; - ibz_to_digit_array(scalar, &r); - ec_point_t T; - ec_mul(&T, E1, scalar, &R); - if (!ec_is_equal(&T, &ker)) { - ibz_sub(&r3, &TORSION_PLUS_3POWER, &r3); - ibz_crt(&r, &r2, &r3, &TORSION_PLUS_2POWER, &TORSION_PLUS_3POWER); - } - } - ibz_finalize(&r2); - ibz_finalize(&r3); - } - } - - ibz_vec_2_finalize(&log2); - ibz_vec_2_finalize(&log3); - ibz_vec_2_finalize(&vec2); - ibz_vec_2_finalize(&vec3); - } -#ifndef NDEBUG -{ - digit_t scalar[NWORDS_FIELD]; - ibz_to_digit_array(scalar, &r); - ec_point_t T; - ec_mul(&T, E1, scalar, &R); - assert(ec_is_equal(&T, &ker)); -assert(!ibz_divides(&r, &ibz_const_two)); -assert(!ibz_divides(&r, &ibz_const_three)); -} -#endif - - ibz_to_digit_array(sig->r, &r); - - ibz_finalize(&r); -} - - - -int protocols_sign(signature_t *sig,const public_key_t *pk, const secret_key_t *sk, const unsigned char* m, size_t l) { - - // var dec - quat_order_t right_order_key; - quat_left_ideal_t ideal_commit,ideal_challenge; - quat_alg_elem_t gen,gen_small,gen_answer,delta; - ibq_t ibq_norm; - ibz_t norm,temp,remainder; - ibz_mat_4x4_t reduced,gram; - quat_alg_coord_t coeffs; - - quat_left_ideal_t ideal_comchall,ideal_seccomchall; - quat_left_ideal_t ideal_eichler_rand; - quat_left_ideal_t ideal_pullback,ideal_input_klpt; - quat_alg_elem_t gen_challenge; - - - // var init - ibq_init(&ibq_norm); - ibz_init(&norm);ibz_init(&temp); - ibz_init(&remainder); - quat_order_init(&right_order_key); - quat_left_ideal_init(&ideal_commit); - quat_left_ideal_init(&ideal_challenge); - quat_alg_elem_init(&gen); - quat_alg_elem_init(&gen_small); - quat_alg_elem_init(&delta); - ibz_mat_4x4_init(&reduced); - ibz_mat_4x4_init(&gram); - quat_alg_coord_init(&coeffs); - quat_left_ideal_init(&ideal_comchall); - quat_left_ideal_init(&ideal_seccomchall); - quat_left_ideal_init(&ideal_eichler_rand); - quat_left_ideal_init(&ideal_pullback); - quat_left_ideal_init(&ideal_input_klpt); - quat_alg_elem_init(&gen_challenge); - - - ec_curve_t curve = sk->curve; - ec_basis_t basis_plus = sk->basis_plus; - ec_basis_t basis_minus = sk->basis_minus; - ec_point_t kernel_dual = sk->kernel_dual; - - // Commitment (computes ideal_commit and pushes the 2*3*-torsion basis) - ec_curve_t E1; - ec_basis_t E1basis = BASIS_CHALLENGE; - { - protocols_commit(&ideal_commit, &E1, &E1basis); - - assert(!fp2_is_zero(&E1.C)); - assert(!fp2_is_zero(&E1basis.P.z) && !fp2_is_zero(&E1basis.Q.z) && !fp2_is_zero(&E1basis.PmQ.z)); - } - - - // Challenge (computes ideal_challenge and sig->r, sig->s) - ec_curve_t E2_for_testing; //XXX - { - ibz_vec_2_t vec; - ibz_vec_2_init(&vec); - - hash_to_challenge(&vec, &E1, m, l); - - protocols_challenge(&ideal_challenge, sig, &E1, &E1basis, &vec, &E2_for_testing); - - ibz_vec_2_finalize(&vec); - } - assert(ibz_get(&ideal_commit.norm)%2!=0); - - // ideal_comchall is the intersectin of ideal_commit and ideal_challenge - quat_lideal_inter(&ideal_comchall,&ideal_challenge,&ideal_commit,&QUATALG_PINFTY); - - #ifndef NDEBUG - // debug the norm - ibz_mul(&temp,&ideal_commit.norm,&ideal_challenge.norm); - assert(0==ibz_cmp(&temp,&ideal_comchall.norm)); - #endif - - int lideal_generator_ok = quat_lideal_generator(&gen,&ideal_comchall,&QUATALG_PINFTY,0); - assert(lideal_generator_ok); - // computing the generator of ideal seccomchall as gen = sk.gen_two * gen - quat_alg_elem_copy(&gen_challenge,&gen); - quat_alg_norm(&ibq_norm,&gen_challenge,&QUATALG_PINFTY); - ibq_to_ibz(&norm,&ibq_norm); - - // computing a good norm element for sk.lideal_small - lideal_generator_ok = quat_lideal_generator_coprime(&gen_small,&sk->lideal_small,&norm,&QUATALG_PINFTY,0); - assert(lideal_generator_ok); - quat_alg_conj(&gen_small,&gen_small); - quat_alg_normalize(&gen_small); - - // gen = gen_small * gen_challenge - quat_alg_mul(&gen,&gen_small,&gen_challenge,&QUATALG_PINFTY); - ibz_mul(&temp,&ideal_comchall.norm,&sk->lideal_small.norm); - quat_alg_normalize(&gen); - - // computing of the right order of lideal_small - quat_lideal_right_order(&right_order_key,&sk->lideal_small,&QUATALG_PINFTY); - assert(quat_lattice_contains(&coeffs,&right_order_key,&gen,&QUATALG_PINFTY)); - - // creation of ideal_seccomchall - quat_lideal_make_primitive_then_create(&ideal_seccomchall,&gen,&temp,&right_order_key,&QUATALG_PINFTY); - - // copying a generator for later - quat_alg_elem_copy(&gen_challenge,&gen); - - - #ifndef NDEBUG - // debug the norm - ibz_mul(&temp,&ideal_comchall.norm,&sk->lideal_small.norm); - assert(0==ibz_cmp(&temp,&ideal_seccomchall.norm)); - #endif - - int found = 0; - - for (unsigned attempt = 0; !found && attempt < SQISIGN_response_attempts; ++attempt) { - // TODUPDATE add a random ideal of norm 2^SQISIGN_random_length (right now SQISIGN_random_length ) - - // now we are computing a small ideal equivalent to ideal_seccomchall - //TODUPDATE replace with another randomization to ensure a good distribution in the eichler order class set - quat_lideal_reduce_basis(&reduced,&gram,&ideal_seccomchall,&QUATALG_PINFTY); - found = klpt_lideal_equiv(&gen,&temp,&reduced,&gram,&ideal_seccomchall.norm,&ideal_seccomchall.lattice.denom,&QUATALG_PINFTY); - if (!found) { - continue; - } - // quat_alg_elem_copy(&gen_challenge,&gen); - quat_alg_conj(&gen_challenge,&gen); - - // computing ideal_eichler_rand = right_order_key < gen, temp > - quat_lideal_create_from_primitive(&ideal_eichler_rand,&gen,&temp,&right_order_key,&QUATALG_PINFTY); - - assert(quat_lideal_isom(&delta,&ideal_eichler_rand,&ideal_seccomchall,&QUATALG_PINFTY)); - - // computing the pullback through sk->lideal_small - quat_alg_mul(&gen,&gen_small,&gen,&QUATALG_PINFTY); - quat_alg_normalize(&gen); - quat_lideal_create_from_primitive(&ideal_pullback,&gen,&ideal_eichler_rand.norm,&MAXORD_O0,&QUATALG_PINFTY); - - // computing the final input ideal as equivalent to ideal_pullback - quat_lideal_reduce_basis(&reduced,&gram,&ideal_pullback,&QUATALG_PINFTY); - found = found && klpt_lideal_equiv(&gen,&temp,&reduced,&gram,&ideal_pullback.norm,&ideal_pullback.lattice.denom,&QUATALG_PINFTY); - // ruling out failure, or extreme values of gen - if (!found || 0==ibz_cmp(&gen.coord[0],&ibz_const_zero) || 0==ibz_cmp(&gen.coord[1],&ibz_const_zero)) { - found = 0; - continue; - - } - - // creating this ideal - quat_lideal_create_from_primitive(&ideal_input_klpt,&gen,&temp,&MAXORD_O0,&QUATALG_PINFTY); - assert(quat_lideal_isom(&delta,&ideal_input_klpt,&ideal_pullback,&QUATALG_PINFTY)); - - // applying klpt - quat_alg_conj(&delta,&gen); - #ifndef NDEBUG - assert(quat_lattice_contains(&coeffs,&ideal_pullback.lattice,&delta,&QUATALG_PINFTY)); - #endif - - - // applying signing klpt - found = klpt_signing_klpt(&gen,&ideal_input_klpt,&sk->lideal_small,&delta,&QUATALG_PINFTY); - if (!found) { - continue; - - } - assert(quat_lattice_contains(&coeffs,&ideal_input_klpt.lattice,&gen,&QUATALG_PINFTY)); - - // gen = gen *delta /norm(ideal_input_klpt) - quat_alg_mul(&gen,&gen,&delta,&QUATALG_PINFTY); - ibz_mul(&gen.denom,&gen.denom,&ideal_input_klpt.norm); - quat_alg_normalize(&gen); - - // for debug we check that gen is contained in the right order and ideal - assert(quat_lattice_contains(&coeffs,&ideal_pullback.lattice,&gen,&QUATALG_PINFTY)); - assert(quat_lattice_contains(&coeffs,&right_order_key,&gen,&QUATALG_PINFTY)); - - // gen = conjugate(gen) - // gen should be the generator of the ideal to be translated - quat_alg_conj(&gen,&gen); - - - #ifndef NDEBUG - quat_left_ideal_t ideal_signing_test; - quat_left_ideal_init(&ideal_signing_test); - ibz_pow(&temp,&ibz_const_two,KLPT_signing_klpt_length); - quat_lideal_create_from_primitive(&ideal_signing_test,&gen,&temp,&right_order_key,&QUATALG_PINFTY); - assert(quat_lideal_isom(&delta,&ideal_signing_test,&ideal_seccomchall,&QUATALG_PINFTY)); - assert(quat_lideal_isom(&delta,&ideal_eichler_rand,&ideal_seccomchall,&QUATALG_PINFTY)); - assert(quat_lideal_isom(&delta,&ideal_eichler_rand,&ideal_seccomchall,&QUATALG_PINFTY)); - assert(0==ibz_cmp(&temp,&ideal_signing_test.norm)); - quat_alg_conj(&delta,&gen); - quat_lideal_create_from_primitive(&ideal_signing_test,&delta,&ideal_eichler_rand.norm,&right_order_key,&QUATALG_PINFTY); - assert(quat_lideal_equals(&ideal_signing_test,&ideal_eichler_rand,&QUATALG_PINFTY)); - quat_left_ideal_finalize(&ideal_signing_test); - #endif - - // checking cyclicity - quat_alg_conj(&delta,&gen); - assert(quat_lattice_contains(&coeffs,&ideal_eichler_rand.lattice,&delta,&QUATALG_PINFTY)); - // quat_alg_elem_copy(&delta,&gen); - quat_alg_mul(&delta,&delta,&gen_challenge,&QUATALG_PINFTY); - ibz_mul(&delta.denom,&delta.denom,&ideal_eichler_rand.norm); - quat_alg_normalize(&delta); - assert(quat_lattice_contains(&coeffs,&right_order_key,&delta,&QUATALG_PINFTY)); - found = found && quat_alg_is_primitive(&delta,&right_order_key,&QUATALG_PINFTY); - if (!found) { - continue; - } - - assert(SQISIGN_signing_length == KLPT_signing_klpt_length/TORSION_PLUS_EVEN_POWER); - - found = found && id2iso_ideal_to_isogeny_two_long_power_of_2(&sig->zip,&curve,&basis_minus,&basis_plus,&kernel_dual,&gen,SQISIGN_signing_length,&sk->lideal_small,&sk->lideal_two,&sk->gen_two,&QUATALG_PINFTY); - } - - // if (!found) - // return found; - - // quick check to see if we got the correct curve in the end -#ifndef NDEBUG - if (found) { - fp2_t jchall, jresp; - ec_j_inv(&jchall, &E2_for_testing); - ec_j_inv(&jresp, &curve); - assert(fp2_is_equal(&jchall, &jresp)); - } else { - printf("signature failed \n"); - } -#endif - - // var finalize - ibq_finalize(&ibq_norm); - ibz_finalize(&norm);ibz_finalize(&temp); - ibz_finalize(&remainder); - quat_order_finalize(&right_order_key); - quat_left_ideal_finalize(&ideal_commit); - quat_left_ideal_finalize(&ideal_challenge); - quat_alg_elem_finalize(&gen); - quat_alg_elem_finalize(&gen_small); - quat_alg_elem_finalize(&delta); - ibz_mat_4x4_finalize(&reduced); - ibz_mat_4x4_finalize(&gram); - quat_alg_coord_finalize(&coeffs); - quat_left_ideal_finalize(&ideal_comchall); - quat_left_ideal_finalize(&ideal_seccomchall); - quat_left_ideal_finalize(&ideal_eichler_rand); - quat_left_ideal_finalize(&ideal_pullback); - quat_left_ideal_finalize(&ideal_input_klpt); - quat_alg_elem_finalize(&gen_challenge); - - return found; -} - diff --git a/src/protocols/ref/protocolsx/test/challenge.c b/src/protocols/ref/protocolsx/test/challenge.c deleted file mode 100644 index 3ae8d74..0000000 --- a/src/protocols/ref/protocolsx/test/challenge.c +++ /dev/null @@ -1,83 +0,0 @@ - -#include - -#include -#include -#include -#include -#include "test_protocols.h" - -static void fp2_print(char *name, fp2_t const a){ - fp2_t b; - fp2_set(&b, 1); - fp2_mul(&b, &b, &a); - printf("%s = 0x", name); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.re[i]); - printf(" + i*0x"); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.im[i]); - printf("\n"); -} - -static void curve_print(char *name, ec_curve_t E){ - fp2_t a; - fp2_copy(&a, &E.C); - fp2_inv(&a); - fp2_mul(&a, &a, &E.A); - fp2_print(name, a); -} - - -int test_challenge() -{ - int res = 1; - - quat_left_ideal_t ideal_comm, ideal_chall; - quat_left_ideal_init(&ideal_comm); - quat_left_ideal_init(&ideal_chall); - - // commitment - ec_curve_t E1; - ec_basis_t E1basis = BASIS_CHALLENGE; - protocols_commit(&ideal_comm, &E1, &E1basis); -// curve_print("E1", E1); - - signature_t sig = {{0}, {0xcafecafecafecafe}, {0xcc, {0xdeadbeef}, {0xdeadbeef}}}; - { - ibz_vec_2_t vec; - ibz_vec_2_init(&vec); - - char msg[] = "Hello, world!"; - hash_to_challenge(&vec, &E1, (unsigned char *) msg, strlen(msg)); -// ibz_vec_2_print(&vec); - - protocols_challenge(&ideal_chall, &sig, &E1, &E1basis, &vec, NULL); -// quat_left_ideal_print(&ideal_chall); -{ -// printf("r = 0x"); -if (0) { -for (ssize_t i = sizeof(sig.r)/sizeof(*sig.r)-1; i >= 0; --i) - printf("%016" PRIx64, sig.r[i]); -printf("\n"); -printf("s.bit2 = %u\n", !!(sig.s.select23 & 1)); -printf("s.bit3 = %u\n", !!(sig.s.select23 & 2)); -printf("s.scalar2 = 0x"); -for (ssize_t i = sizeof(sig.s.scalar2)/sizeof(*sig.s.scalar2)-1; i >= 0; --i) - printf("%016" PRIx64, sig.s.scalar2[i]); -printf("\n"); -printf("s.scalar3 = 0x"); -for (ssize_t i = sizeof(sig.s.scalar3)/sizeof(*sig.s.scalar3)-1; i >= 0; --i) - printf("%016" PRIx64, sig.s.scalar3[i]); -printf("\n"); -} -} - ibz_vec_2_finalize(&vec); - } - - quat_left_ideal_finalize(&ideal_comm); - quat_left_ideal_finalize(&ideal_chall); - - return res; -} - diff --git a/src/protocols/ref/protocolsx/test/commitment.c b/src/protocols/ref/protocolsx/test/commitment.c deleted file mode 100644 index 02717d1..0000000 --- a/src/protocols/ref/protocolsx/test/commitment.c +++ /dev/null @@ -1,56 +0,0 @@ - -#include -#include -#include -#include -#include "test_protocols.h" - - -static void fp2_print(char *name, fp2_t const a){ - fp2_t b; - fp2_set(&b, 1); - fp2_mul(&b, &b, &a); - printf("%s = 0x", name); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.re[i]); - printf(" + i*0x"); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.im[i]); - printf("\n"); -} - -static void curve_print(char *name, ec_curve_t E){ - fp2_t a; - fp2_copy(&a, &E.C); - fp2_inv(&a); - fp2_mul(&a, &a, &E.A); - fp2_print(name, a); -} - -bool curve_is_canonical(ec_curve_t const *E); // test_protocols.c - -int test_commitment() -{ - int res = 1; - - quat_left_ideal_t ideal; - quat_left_ideal_init(&ideal); - - ec_curve_t E1; - ec_basis_t E1basis = BASIS_CHALLENGE; - - protocols_commit(&ideal, &E1, &E1basis); - - res &= !ibz_cmp(&ideal.norm, &DEGREE_COMMITMENT); - - res &= curve_is_canonical(&E1); - -// quat_left_ideal_print(&ideal); - res &= !fp2_is_zero(&E1.C); -// curve_print("E1", E1); - - quat_left_ideal_finalize(&ideal); - - return res; -} - diff --git a/src/protocols/ref/protocolsx/test/encode.c b/src/protocols/ref/protocolsx/test/encode.c deleted file mode 100644 index 1d9e340..0000000 --- a/src/protocols/ref/protocolsx/test/encode.c +++ /dev/null @@ -1,104 +0,0 @@ -#include - -#include -#include -#include -#include "test_protocols.h" - -#include "../encode.c" - - -static int test_ibz_encdec() { - int res = 1; - ibz_t nm, nm_rec; - ibz_init(&nm_rec); - - { - ibz_set_from_str(&nm, "8892374823748723894723847892374897234897238478923748237", 16); - int nm_bits = ibz_bitsize(&nm); - int nm_bytes = (nm_bits + 7) / 8; - unsigned char *enc = malloc(nm_bytes); - - ibz_encode(enc, &nm, nm_bytes); - - ibz_decode(&nm_rec, enc, nm_bytes); - - res &= (ibz_cmp(&nm, &nm_rec) == 0); - - free(enc); - ibz_finalize(&nm); - } - - { - ibz_set_from_str(&nm, "-123", 16); - int nm_bits = 23; - int nm_bytes = (nm_bits + 7) / 8; - unsigned char *enc = malloc(nm_bytes); - - ibz_encode(enc, &nm, nm_bytes); - - ibz_decode(&nm_rec, enc, nm_bytes); - - res &= (ibz_cmp(&nm, &nm_rec) == 0); - - free(enc); - ibz_finalize(&nm); - } - - ibz_finalize(&nm_rec); - return res; -} - - -static void print_fp2(const fp2_t d, int len) { - printf("re: "); - for (int i = 0; i < len; ++i) { - printf("%016" PRIx64 " ", d.re[i]); - } printf("\n"); - printf("im: "); - for (int i = 0; i < len; ++i) { - printf("%016" PRIx64 " ", d.im[i]); - } printf("\n"); -} -static void print_pk(const public_key_t *pk) { - print_fp2(pk->E.A, NWORDS_FIELD); - print_fp2(pk->E.C, NWORDS_FIELD); -} - -static int test_with_key(public_key_t *pk, secret_key_t *sk) { - printf("Encoded bytes: %d\n", PUBLICKEY_BYTES); - printf("pkenc\n"); - print_pk(pk); - unsigned char *pkEnc = malloc(PUBLICKEY_BYTES); - unsigned char *pkEnc2 = malloc(PUBLICKEY_BYTES); - - public_key_t pkdec = { 0 }; - - public_key_encode(pkEnc, pk); - - public_key_decode(&pkdec, pkEnc); - printf("pkdec\n"); - print_pk(&pkdec); - - public_key_encode(pkEnc2, &pkdec); - - int res = !memcmp(pkEnc, pkEnc2, PUBLICKEY_BYTES); - - free(pkEnc); - free(pkEnc2); - return res; -} - -int test_encode() { - int res = 1; - - public_key_t pk; - secret_key_t sk; - secret_key_init(&sk); - - res= res & protocols_keygen(&pk,&sk); - res = res & test_with_key(&pk, &sk); - - secret_key_finalize(&sk); - return res; -} diff --git a/src/protocols/ref/protocolsx/test/keygen.c b/src/protocols/ref/protocolsx/test/keygen.c deleted file mode 100644 index 8ea403a..0000000 --- a/src/protocols/ref/protocolsx/test/keygen.c +++ /dev/null @@ -1,32 +0,0 @@ -#include -#include -#include -#include "test_protocols.h" - -bool curve_is_canonical(ec_curve_t const *E); // test_protocols.c - -int test_inner_keygen() { - - int res = 1; - public_key_t pk; - secret_key_t sk; - secret_key_init(&sk); - - res &= protocols_keygen(&pk, &sk); - res &= curve_is_canonical(&sk.curve); - res &= curve_is_canonical(&pk.E); - - secret_key_finalize(&sk); - return res; -} - -int test_keygen() { - - int res = 1; - - for (int i = 0; i<1; i++) { - res &= test_inner_keygen(); - } - - return 1; -} diff --git a/src/protocols/ref/protocolsx/test/test_protocols.c b/src/protocols/ref/protocolsx/test/test_protocols.c deleted file mode 100644 index 600a457..0000000 --- a/src/protocols/ref/protocolsx/test/test_protocols.c +++ /dev/null @@ -1,88 +0,0 @@ -#include -#include -#include -#include - -#include "test_protocols.h" - - - - -//XXX FIXME stolen from src/ec/opt/generic/test/isog-test.c -void fp2_print(char *name, fp2_t const a){ - fp2_t b; - fp2_set(&b, 1); - fp2_mul(&b, &b, &a); - printf("%s = 0x", name); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.re[i]); - printf(" + i*0x"); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.im[i]); - printf("\n"); -} - -void point_print(char *name, ec_point_t P){ - fp2_t a; - if(fp2_is_zero(&P.z)){ - printf("%s = INF\n", name); - } - else{ - fp2_copy(&a, &P.z); - fp2_inv(&a); - fp2_mul(&a, &a, &P.x); - fp2_print(name, a); - } -} - -void curve_print(char *name, ec_curve_t E){ - fp2_t a; - fp2_copy(&a, &E.C); - fp2_inv(&a); - fp2_mul(&a, &a, &E.A); - fp2_print(name, a); -} -//XXX - - -bool curve_is_canonical(ec_curve_t const *E) -{ - ec_curve_t EE; - ec_isom_t isom; - ec_curve_normalize(&EE, &isom, E); - - fp2_t lhs, rhs; - fp2_mul(&lhs, &E->A, &EE.C); - fp2_mul(&rhs, &E->C, &EE.A); - return fp2_is_equal(&lhs, &rhs); -} - - -// run all tests in module -int main(){ - int res = 1; - - randombytes_init((unsigned char *) "some", (unsigned char *) "string", 128); - - // printf("\nRunning encoding tests\n"); - // res &= test_encode(); - - printf("\nRunning protocols module unit tests\n \n"); - - printf("\nRunning keygen tests\n \n"); - res &= test_keygen(); - - printf("\nRunning signature tests\n \n"); - res &= test_commitment(); - res &= test_challenge(); - res &= test_sign_verif(); - - - if(!res){ - printf("\nSome tests failed!\n"); - } - else { - printf("All tests passed!\n"); - } - return(!res); -} diff --git a/src/protocols/ref/protocolsx/test/test_protocols.h b/src/protocols/ref/protocolsx/test/test_protocols.h deleted file mode 100644 index 6236a58..0000000 --- a/src/protocols/ref/protocolsx/test/test_protocols.h +++ /dev/null @@ -1,21 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -/** @internal - * @ingroup protocols_protocols - * @defgroup protocols_tests Test functions for proocols - * @{ - */ -int test_commitment(); -int test_challenge(); -int test_sign_verif(); -int test_keygen(); -int test_sign(); -int test_encode(); -/** @} - */ \ No newline at end of file diff --git a/src/protocols/ref/protocolsx/test/verif.c b/src/protocols/ref/protocolsx/test/verif.c deleted file mode 100644 index 19bd654..0000000 --- a/src/protocols/ref/protocolsx/test/verif.c +++ /dev/null @@ -1,153 +0,0 @@ - -#include -#include - -#include -#include -#include -#include -#include "test_protocols.h" -#include - -static __inline__ uint64_t rdtsc(void) -{ - return (uint64_t) cpucycles(); -} - -static void fp2_print(char *name, fp2_t const a){ - fp2_t b; - fp2_set(&b, 1); - fp2_mul(&b, &b, &a); - printf("%s = 0x", name); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.re[i]); - printf(" + i*0x"); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.im[i]); - printf("\n"); -} - -static void curve_print(char *name, ec_curve_t E){ - fp2_t a; - fp2_copy(&a, &E.C); - fp2_inv(&a); - fp2_mul(&a, &a, &E.A); - fp2_print(name, a); -} - -int test_full_verif() { - int res = 1; - public_key_t pk; - secret_key_t sk; - secret_key_init(&sk); - -setlocale(LC_NUMERIC, ""); -uint64_t t0, t1; - - -t0 = rdtsc(); - res= res & protocols_keygen(&pk,&sk); - if (!res) { - printf("keygen failed \n"); - } -t1 = rdtsc(); -// printf("\x1b[34mkeygen took %'" PRIu64 " cycles\x1b[0m\n", t1-t0); - - // printf(" \n\n keygen done \n\n"); - - // init the sig - signature_t sig; - signature_init(&sig); -t0 = rdtsc(); - res = res & protocols_sign(&sig,&pk,&sk,(unsigned char*)"test",4); - if (!res) { - printf("sign failed \n"); - } - - -t1 = rdtsc(); -// printf("\x1b[34msigning took %'" PRIu64 " cycles\x1b[0m\n", t1-t0); - - assert(res); - // printf(" \n signing done \n"); - - - // printf(" \n starting verification \n "); - -// t0 = rdtsc(); - res = res & protocols_verif(&sig,&pk,(unsigned char*)"test",4); -// t1 = rdtsc(); -// printf("\x1b[34mverifying took %'" PRIu64 " cycles\x1b[0m\n", t1-t0); - - printf(" \x1b[35mfull\x1b[0m signature was: %s\n\n", res ? "\x1b[32mvalid\x1b[0m" : "\x1b[31minvalid\x1b[0m"); - - - signature_finalize(&sig); - secret_key_finalize(&sk); - - return res; -} - -bool curve_is_canonical(ec_curve_t const *E); // test_protocols.c - -int test_verif_from_chall() -{ - int res = 1; - - quat_left_ideal_t ideal_comm, ideal_chall; - quat_left_ideal_init(&ideal_comm); - quat_left_ideal_init(&ideal_chall); - - // commitment - ec_curve_t E1; - ec_basis_t E1basis = BASIS_CHALLENGE; - protocols_commit(&ideal_comm, &E1, &E1basis); - - // challenge - char const msg[] = "Hello, world!"; - signature_t sig = {{0}, {0xcafecafecafecafe}, {0xcc, {0xdeadbeef}, {0xdeadbeef}}}; - ec_curve_t E2; - { - ibz_vec_2_t vec; - ibz_vec_2_init(&vec); - - hash_to_challenge(&vec, &E1, (unsigned char *) msg, strlen(msg)); -//ibz_vec_2_print(&vec); - - protocols_challenge(&ideal_chall, &sig, &E1, &E1basis, &vec, &E2); - - ibz_vec_2_finalize(&vec); - } - - ec_point_t dual; - // now let's check it - int valid = protocols_verif_from_chall(&sig, &E2, &dual, (unsigned char *) msg, strlen(msg)); - printf("\n\x1b[35mchallenge\x1b[0m signature was: %s\n\n", valid ? "\x1b[32mvalid\x1b[0m" : "\x1b[31minvalid\x1b[0m"); - res &= valid; - - res &= curve_is_canonical(&E1); - res &= curve_is_canonical(&E2); - - quat_left_ideal_finalize(&ideal_comm); - quat_left_ideal_finalize(&ideal_chall); - - return res; -} - -int test_sign_verif() -{ - int res = 1; - - for (int i =0;i<2;i++) { - printf("#%d ",i); - res &= test_full_verif(); - } - - if (!res) { - printf("\n Keygen + Sign + Verif failed ! \n"); - } - // res &= test_verif_from_chall(); - - - return res; -} diff --git a/src/protocols/ref/protocolsx/verif.c b/src/protocols/ref/protocolsx/verif.c deleted file mode 100644 index 33a73c7..0000000 --- a/src/protocols/ref/protocolsx/verif.c +++ /dev/null @@ -1,236 +0,0 @@ -#include -#include - -static inline void copy_point(ec_point_t* A, const ec_point_t* B){ - fp2_copy(&A->x, &B->x); - fp2_copy(&A->z, &B->z); -} - -//XXX FIXME stolen from src/ec/opt/generic/test/isog-test.c -static void fp2_print(char *name, fp2_t const a){ - fp2_t b; - fp2_set(&b, 1); - fp2_mul(&b, &b, &a); - printf("%s = 0x", name); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.re[i]); - printf(" + i*0x"); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.im[i]); - printf("\n"); -} - -static void curve_print(char *name, ec_curve_t E){ - fp2_t a; - fp2_copy(&a, &E.C); - fp2_inv(&a); - fp2_mul(&a, &a, &E.A); - fp2_print(name, a); -} -//XXX - -static void point_print(char *name, ec_point_t P){ - fp2_t a; - if(fp2_is_zero(&P.z)){ - printf("%s = INF\n", name); - } - else{ - fp2_copy(&a, &P.z); - fp2_inv(&a); - fp2_mul(&a, &a, &P.x); - fp2_print(name, a); - } -} - - -void protocols_verif_unpack_chall(ec_curve_t *E2, ec_point_t *dual, const signature_t *sig, const public_key_t *pk) -{ - // Generate 2^f-basis - ec_basis_t B2; - ec_curve_to_basis_2(&B2, &pk->E); - if(sig->zip.bit_first_step){ - // Swap P and Q - ec_point_t tmp; - copy_point(&tmp, &B2.P); - copy_point(&B2.P, &B2.Q); - copy_point(&B2.Q, &tmp); - } - - // 2^f-isogeny chains - ec_point_t K; - digit_t scalar[NWORDS_FIELD]; - ec_curve_t E; - ec_isog_even_t isog2; - fp2_copy(&E.A, &pk->E.A); - fp2_copy(&E.C, &pk->E.C); - isog2.length = POWER_OF_2; - for(size_t i = 0; i < sig->zip.length-1; i++){ - ibz_to_digit_array(scalar, &sig->zip.zip_chain[i]); - ec_ladder3pt(&K, scalar, &B2.Q, &B2.P, &B2.PmQ, &E); - copy_point(&isog2.kernel, &K); - fp2_copy(&isog2.curve.A, &E.A); - fp2_copy(&isog2.curve.C, &E.C); - ec_eval_even(&E, &isog2, &B2.P, 1); - ec_complete_basis_2(&B2, &E, &B2.P); - } - ibz_to_digit_array(scalar, &sig->zip.zip_chain[sig->zip.length-1]); - ec_ladder3pt(&K, scalar, &B2.Q, &B2.P, &B2.PmQ, &E); - copy_point(&isog2.kernel, &K); - fp2_copy(&isog2.curve.A, &E.A); - fp2_copy(&isog2.curve.C, &E.C); - ec_eval_even(&E, &isog2, &B2.P, 1); - - copy_point(dual,&B2.P); - // Normalize curve - ec_isom_t isom; - ec_curve_normalize(E2, &isom, &E); - ec_iso_eval(dual,&isom); - -} - -int protocols_verif_from_chall(const signature_t *sig, ec_curve_t const *E2, const ec_point_t *dual, const unsigned char* m, size_t l) -{ - - // Generate 2^f and 3^g bases - ec_basis_t B2, B3, B6; - ec_curve_to_basis_6(&B6, E2); - copy_point(&B3.P, &B6.P); - copy_point(&B3.Q, &B6.Q); - copy_point(&B3.PmQ, &B6.PmQ); - for(size_t i = 0; i < POWER_OF_2; i++){ - ec_dbl(&B3.P, E2, &B3.P); - ec_dbl(&B3.Q, E2, &B3.Q); - ec_dbl(&B3.PmQ, E2, &B3.PmQ); - } - copy_point(&B2.P, &B6.P); - copy_point(&B2.Q, &B6.Q); - copy_point(&B2.PmQ, &B6.PmQ); - for(size_t i = 0; i < POWER_OF_3; i++){ - ec_point_t tmp; - ec_dbl(&tmp, E2, &B2.P); - ec_add(&B2.P, &tmp, &B2.P, &B2.P); - ec_dbl(&tmp, E2, &B2.Q); - ec_add(&B2.Q, &tmp, &B2.Q, &B2.Q); - ec_dbl(&tmp, E2, &B2.PmQ); - ec_add(&B2.PmQ, &tmp, &B2.PmQ, &B2.PmQ); - } - - bool const bit2 = sig->s.select23 & 1; - bool const bit3 = sig->s.select23 & 2; - - if(!bit2){ - // Swap P2 and Q2 - ec_point_t tmp; - copy_point(&tmp, &B2.P); - copy_point(&B2.P, &B2.Q); - copy_point(&B2.Q, &tmp); - } - if(!bit3){ - // Swap P3 and Q3 - ec_point_t tmp; - copy_point(&tmp, &B3.P); - copy_point(&B3.P, &B3.Q); - copy_point(&B3.Q, &tmp); - } - - // Kernels for the dual of the challenge isogeny - ec_point_t K2, K3; - ec_ladder3pt(&K2, sig->s.scalar2, &B2.P, &B2.Q, &B2.PmQ, E2); - ec_ladder3pt(&K3, sig->s.scalar3, &B3.P, &B3.Q, &B3.PmQ, E2); - - // Evaluating the dual isogeny - ec_isog_odd_t isog3={0}; - ec_point_t push_points[2]; - if (bit2 == bit3) { - push_points[0] = bit2 ? B6.Q : B6.P; - } - else { - digit_t scalars[2][NWORDS_FIELD]; - ibz_to_digit_array(scalars[bit3], &TORSION_PLUS_2POWER); - ibz_to_digit_array(scalars[bit2], &TORSION_PLUS_3POWER); - ec_biscalar_mul(&push_points[0], E2, scalars[0], scalars[1], &B6); - } - copy_point(&push_points[1], &K3); - ec_isog_even_t isog2; - isog2.length = POWER_OF_2; - copy_point(&isog2.kernel, &K2); - - - // entering the cyclicity test zone - ec_point_t test1,test2; - test1 = *dual; - test2 = K2; - for (int i =0 ; i < TORSION_PLUS_EVEN_POWER-1; i++) { - ec_dbl(&test1,E2,&test1); - ec_dbl(&test2,E2,&test2); - } - assert(!fp2_is_zero(&test1.z)); - assert(!fp2_is_zero(&test2.z)); - if (ec_is_equal(&test1,&test2)) { - return 0; - } - - fp2_copy(&isog2.curve.A, &E2->A); - fp2_copy(&isog2.curve.C, &E2->C); - ec_curve_t E; - ec_eval_even(&E, &isog2, push_points, 2); - isog3.degree[0] = POWER_OF_3; - copy_point(&isog3.ker_plus, &push_points[1]); - fp2_copy(&isog3.curve.A, &E.A); - fp2_copy(&isog3.curve.C, &E.C); - ec_eval_odd(&E, &isog3, push_points, 1); -assert(!fp2_is_zero(&E.C)); - - // Normalize curve - ec_curve_t E1; - ec_isom_t isom; - ec_curve_normalize(&E1, &isom, &E); - ec_iso_eval(&push_points[0], &isom); -assert(!fp2_is_zero(&E1.C)); - - // Generate 2^f*3^g basis - ec_curve_to_basis_6(&B6, &E1); - - // Recover original challenge kernel point from the hash - ec_point_t K; - ibz_vec_2_t vec; - ibz_vec_2_init(&vec); - hash_to_challenge(&vec, &E1, m, l); - digit_t scalars[2][NWORDS_FIELD]; - ibz_to_digit_array(scalars[0], &vec[0]); - ibz_to_digit_array(scalars[1], &vec[1]); - ec_biscalar_mul(&K, &E1, scalars[0], scalars[1], &B6); - ibz_vec_2_finalize(&vec); -assert(!fp2_is_zero(&K.z)); - - // Multiply Q by r - ec_mul(&push_points[0], &E1, sig->r, &push_points[0]); -assert(!fp2_is_zero(&push_points[0].z)); - - return ec_is_equal(&K, &push_points[0]); -} - - -/** @defgroup verification The verification protocol - * @{ -*/ - -/** - * @brief Verifying a signature - * - * @param sig: the signature - * @param pk the public key - * @param m the message - * @returns a bit indicating if the verification succeeded - */ -int protocols_verif(const signature_t *sig, const public_key_t *pk, const unsigned char* m, size_t l) -{ - //TODO general input checks? - - ec_curve_t E2; - ec_point_t dual; - protocols_verif_unpack_chall(&E2, &dual, sig, pk); - - return protocols_verif_from_chall(sig, &E2, &dual, m, l); -} - diff --git a/src/quaternion/ref/generic/CMakeLists.txt b/src/quaternion/ref/generic/CMakeLists.txt index a7272b8..0578882 100644 --- a/src/quaternion/ref/generic/CMakeLists.txt +++ b/src/quaternion/ref/generic/CMakeLists.txt @@ -1,18 +1,29 @@ set(SOURCE_FILES_QUATERNION_GENERIC_REF + intbig.c algebra.c ideal.c dim4.c dim2.c integers.c lattice.c + lat_ball.c finit.c printer.c - lll.c - matkermod.c + lll/rationals.c + lll/l2.c + lll/lll_verification.c + lll/lll_applications.c + lll/rationals.c + normeq.c + hnf/ibz_division.c + hnf/hnf_internal.c + hnf/hnf.c + test/random_input_generation.c ) -add_library(${LIB_QUATERNION} ${SOURCE_FILES_QUATERNION_GENERIC_REF}) -target_include_directories(${LIB_QUATERNION} PRIVATE common ${INC_PUBLIC} ${INC_COMMON} ${INC_INTBIG} ${INC_QUATERNION}) +add_library(${LIB_QUATERNION} STATIC ${SOURCE_FILES_QUATERNION_GENERIC_REF}) +target_link_libraries(${LIB_QUATERNION} GMP m) +target_include_directories(${LIB_QUATERNION} PRIVATE common ${INC_PUBLIC} ${INC_COMMON} ${INC_QUATERNION} internal_quaternion_headers) target_compile_options(${LIB_QUATERNION} PRIVATE ${C_OPT_FLAGS}) add_subdirectory(test) diff --git a/src/quaternion/ref/generic/algebra.c b/src/quaternion/ref/generic/algebra.c index 7a52fb8..50629f9 100644 --- a/src/quaternion/ref/generic/algebra.c +++ b/src/quaternion/ref/generic/algebra.c @@ -1,287 +1,280 @@ #include #include "internal.h" -//Internal helper functions +// Internal helper functions -//in internal.h: -//static inline void quat_alg_init_set_ui(quat_alg_t *alg, unsigned int p) { -// ibz_t bp; -// ibz_init(&bp); -// ibz_set(&bp, p); -// quat_alg_init_set(alg, &bp); -// ibz_finalize(&bp); -//} - -void quat_alg_coord_add(quat_alg_coord_t *res, const quat_alg_coord_t *a, const quat_alg_coord_t *b){ - ibz_add(&((*res)[0]),&((*a)[0]),&((*b)[0])); - ibz_add(&((*res)[1]),&((*a)[1]),&((*b)[1])); - ibz_add(&((*res)[2]),&((*a)[2]),&((*b)[2])); - ibz_add(&((*res)[3]),&((*a)[3]),&((*b)[3])); +void +quat_alg_init_set_ui(quat_alg_t *alg, unsigned int p) +{ + ibz_t bp; + ibz_init(&bp); + ibz_set(&bp, p); + quat_alg_init_set(alg, &bp); + ibz_finalize(&bp); } -void quat_alg_coord_sub(quat_alg_coord_t *res, const quat_alg_coord_t *a, const quat_alg_coord_t *b){ - ibz_sub(&((*res)[0]),&((*a)[0]),&((*b)[0])); - ibz_sub(&((*res)[1]),&((*a)[1]),&((*b)[1])); - ibz_sub(&((*res)[2]),&((*a)[2]),&((*b)[2])); - ibz_sub(&((*res)[3]),&((*a)[3]),&((*b)[3])); +void +quat_alg_coord_mul(ibz_vec_4_t *res, const ibz_vec_4_t *a, const ibz_vec_4_t *b, const quat_alg_t *alg) +{ + ibz_t prod; + ibz_vec_4_t sum; + ibz_init(&prod); + ibz_vec_4_init(&sum); + + ibz_set(&(sum[0]), 0); + ibz_set(&(sum[1]), 0); + ibz_set(&(sum[2]), 0); + ibz_set(&(sum[3]), 0); + + // compute 1 coordinate + ibz_mul(&prod, &((*a)[2]), &((*b)[2])); + ibz_sub(&(sum[0]), &(sum[0]), &prod); + ibz_mul(&prod, &((*a)[3]), &((*b)[3])); + ibz_sub(&(sum[0]), &(sum[0]), &prod); + ibz_mul(&(sum[0]), &(sum[0]), &(alg->p)); + ibz_mul(&prod, &((*a)[0]), &((*b)[0])); + ibz_add(&(sum[0]), &(sum[0]), &prod); + ibz_mul(&prod, &((*a)[1]), &((*b)[1])); + ibz_sub(&(sum[0]), &(sum[0]), &prod); + // compute i coordiante + ibz_mul(&prod, &((*a)[2]), &((*b)[3])); + ibz_add(&(sum[1]), &(sum[1]), &prod); + ibz_mul(&prod, &((*a)[3]), &((*b)[2])); + ibz_sub(&(sum[1]), &(sum[1]), &prod); + ibz_mul(&(sum[1]), &(sum[1]), &(alg->p)); + ibz_mul(&prod, &((*a)[0]), &((*b)[1])); + ibz_add(&(sum[1]), &(sum[1]), &prod); + ibz_mul(&prod, &((*a)[1]), &((*b)[0])); + ibz_add(&(sum[1]), &(sum[1]), &prod); + // compute j coordiante + ibz_mul(&prod, &((*a)[0]), &((*b)[2])); + ibz_add(&(sum[2]), &(sum[2]), &prod); + ibz_mul(&prod, &((*a)[2]), &((*b)[0])); + ibz_add(&(sum[2]), &(sum[2]), &prod); + ibz_mul(&prod, &((*a)[1]), &((*b)[3])); + ibz_sub(&(sum[2]), &(sum[2]), &prod); + ibz_mul(&prod, &((*a)[3]), &((*b)[1])); + ibz_add(&(sum[2]), &(sum[2]), &prod); + // compute ij coordiante + ibz_mul(&prod, &((*a)[0]), &((*b)[3])); + ibz_add(&(sum[3]), &(sum[3]), &prod); + ibz_mul(&prod, &((*a)[3]), &((*b)[0])); + ibz_add(&(sum[3]), &(sum[3]), &prod); + ibz_mul(&prod, &((*a)[2]), &((*b)[1])); + ibz_sub(&(sum[3]), &(sum[3]), &prod); + ibz_mul(&prod, &((*a)[1]), &((*b)[2])); + ibz_add(&(sum[3]), &(sum[3]), &prod); + + ibz_copy(&((*res)[0]), &(sum[0])); + ibz_copy(&((*res)[1]), &(sum[1])); + ibz_copy(&((*res)[2]), &(sum[2])); + ibz_copy(&((*res)[3]), &(sum[3])); + + ibz_finalize(&prod); + ibz_vec_4_finalize(&sum); } -void quat_alg_equal_denom(quat_alg_elem_t *res_a, quat_alg_elem_t *res_b, const quat_alg_elem_t *a, const quat_alg_elem_t *b){ - ibz_t gcd, r; - ibz_init(&gcd); - ibz_init(&r); - ibz_gcd(&gcd, &(a->denom), &(b->denom)); - //temporarily set res_a.denom to a.denom/gcd, and res_b.denom to b.denom/gcd - ibz_div(&(res_a->denom), &r, &(a->denom), &gcd); - ibz_div(&(res_b->denom), &r, &(b->denom), &gcd); - for (int i = 0; i<4;i++){ - //multiply coordiates by reduced denominators from the other element - ibz_mul(&(res_a->coord[i]), &(a->coord[i]), &(res_b->denom)); - ibz_mul(&(res_b->coord[i]), &(b->coord[i]), &(res_a->denom)); - } - // multiply both reduced denominators - ibz_mul(&(res_a->denom), &(res_a->denom), &(res_b->denom)); - // multiply them by the gcd to get the new common denominator - ibz_mul(&(res_b->denom), &(res_a->denom), &gcd); - ibz_mul(&(res_a->denom), &(res_a->denom), &gcd); - ibz_finalize(&gcd); - ibz_finalize(&r); -} - -//Public Functions - -void quat_alg_add(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b){ - quat_alg_elem_t res_a, res_b; - quat_alg_elem_init(&res_a); - quat_alg_elem_init(&res_b); - // put both on the same denominator - quat_alg_equal_denom(&res_a,&res_b,a,b); - //then add - ibz_copy(&(res->denom), &(res_a.denom)); - quat_alg_coord_add(&(res->coord),&(res_a.coord),&(res_b.coord)); - quat_alg_elem_finalize(&res_a); - quat_alg_elem_finalize(&res_b); -} - -void quat_alg_sub(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b){ - quat_alg_elem_t res_a, res_b; - quat_alg_elem_init(&res_a); - quat_alg_elem_init(&res_b); - // put both on the same denominator - quat_alg_equal_denom(&res_a,&res_b,a,b); - //then substract - ibz_copy(&res->denom, &res_a.denom); - quat_alg_coord_sub(&res->coord,&res_a.coord,&res_b.coord); - quat_alg_elem_finalize(&res_a); - quat_alg_elem_finalize(&res_b); -} - -void quat_alg_mul(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b, const quat_alg_t *alg){ - ibz_t prod; - quat_alg_coord_t sum; - ibz_init(&prod); - quat_alg_coord_init(&sum); - - ibz_set(&(sum[0]), 0); - ibz_set(&(sum[1]), 0); - ibz_set(&(sum[2]), 0); - ibz_set(&(sum[3]), 0); - - //denominator: product of denominators - ibz_mul(&(res->denom), &(a->denom),&(b->denom)); - -// compute 1 coordinate - ibz_mul(&prod, &(a->coord[2]),&(b->coord[2])); - ibz_sub(&(sum[0]),&(sum[0]),&prod); - ibz_mul(&prod, &(a->coord[3]),&(b->coord[3])); - ibz_sub(&(sum[0]),&(sum[0]),&prod); - ibz_mul(&(sum[0]), &(sum[0]),&(alg->p)); - ibz_mul(&prod, &(a->coord[0]),&(b->coord[0])); - ibz_add(&(sum[0]),&(sum[0]),&prod); - ibz_mul(&prod, &(a->coord[1]),&(b->coord[1])); - ibz_sub(&(sum[0]),&(sum[0]),&prod); -// compute i coordiante - ibz_mul(&prod, &(a->coord[2]),&(b->coord[3])); - ibz_add(&(sum[1]),&(sum[1]),&prod); - ibz_mul(&prod, &(a->coord[3]),&(b->coord[2])); - ibz_sub(&(sum[1]),&(sum[1]),&prod); - ibz_mul(&(sum[1]), &(sum[1]),&(alg->p)); - ibz_mul(&prod, &(a->coord[0]),&(b->coord[1])); - ibz_add(&(sum[1]),&(sum[1]),&prod); - ibz_mul(&prod, &(a->coord[1]),&(b->coord[0])); - ibz_add(&(sum[1]),&(sum[1]),&prod); -// compute j coordiante - ibz_mul(&prod, &(a->coord[0]),&(b->coord[2])); - ibz_add(&(sum[2]),&(sum[2]),&prod); - ibz_mul(&prod, &(a->coord[2]),&(b->coord[0])); - ibz_add(&(sum[2]),&(sum[2]),&prod); - ibz_mul(&prod, &(a->coord[1]),&(b->coord[3])); - ibz_sub(&(sum[2]),&(sum[2]),&prod); - ibz_mul(&prod, &(a->coord[3]),&(b->coord[1])); - ibz_add(&(sum[2]),&(sum[2]),&prod); -// compute ij coordiante - ibz_mul(&prod, &(a->coord[0]),&(b->coord[3])); - ibz_add(&(sum[3]),&(sum[3]),&prod); - ibz_mul(&prod, &(a->coord[3]),&(b->coord[0])); - ibz_add(&(sum[3]),&(sum[3]),&prod); - ibz_mul(&prod, &(a->coord[2]),&(b->coord[1])); - ibz_sub(&(sum[3]),&(sum[3]),&prod); - ibz_mul(&prod, &(a->coord[1]),&(b->coord[2])); - ibz_add(&(sum[3]),&(sum[3]),&prod); - - ibz_copy(&(res->coord[0]),&(sum[0])); - ibz_copy(&(res->coord[1]),&(sum[1])); - ibz_copy(&(res->coord[2]),&(sum[2])); - ibz_copy(&(res->coord[3]),&(sum[3])); - - ibz_finalize(&prod); - quat_alg_coord_finalize(&sum); -} - -void quat_alg_rightmul_mat(ibz_mat_4x4_t *mulmat, const quat_alg_elem_t *a, const quat_alg_t *alg) { - quat_alg_elem_t e, res; - quat_alg_elem_init(&e); - quat_alg_elem_init(&res); +void +quat_alg_equal_denom(quat_alg_elem_t *res_a, quat_alg_elem_t *res_b, const quat_alg_elem_t *a, const quat_alg_elem_t *b) +{ + ibz_t gcd, r; + ibz_init(&gcd); + ibz_init(&r); + ibz_gcd(&gcd, &(a->denom), &(b->denom)); + // temporarily set res_a.denom to a.denom/gcd, and res_b.denom to b.denom/gcd + ibz_div(&(res_a->denom), &r, &(a->denom), &gcd); + ibz_div(&(res_b->denom), &r, &(b->denom), &gcd); for (int i = 0; i < 4; i++) { - // i-th standard basis vector - if (i) - ibz_set(&e.coord[i-1], 0); - ibz_set(&e.coord[i], 1); - quat_alg_mul(&res, &e, a, alg); - for (int j = 0; j < 4; j++) - ibz_copy(&(*mulmat)[j][i], &res.coord[j]); + // multiply coordiates by reduced denominators from the other element + ibz_mul(&(res_a->coord[i]), &(a->coord[i]), &(res_b->denom)); + ibz_mul(&(res_b->coord[i]), &(b->coord[i]), &(res_a->denom)); } - quat_alg_elem_finalize(&e); - quat_alg_elem_finalize(&res); + // multiply both reduced denominators + ibz_mul(&(res_a->denom), &(res_a->denom), &(res_b->denom)); + // multiply them by the gcd to get the new common denominator + ibz_mul(&(res_b->denom), &(res_a->denom), &gcd); + ibz_mul(&(res_a->denom), &(res_a->denom), &gcd); + ibz_finalize(&gcd); + ibz_finalize(&r); } -void quat_alg_norm(ibq_t *res, const quat_alg_elem_t *a, const quat_alg_t *alg){ - quat_alg_elem_t conj, norm; - quat_alg_elem_init(&conj); - quat_alg_elem_init(&norm); - - quat_alg_conj(&conj,a); - quat_alg_mul(&norm,a,&conj,alg); - ibq_set(res,&(norm.coord[0]),&(norm.denom)); +// Public Functions - quat_alg_elem_finalize(&conj); - quat_alg_elem_finalize(&norm); +void +quat_alg_add(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b) +{ + quat_alg_elem_t res_a, res_b; + quat_alg_elem_init(&res_a); + quat_alg_elem_init(&res_b); + // put both on the same denominator + quat_alg_equal_denom(&res_a, &res_b, a, b); + // then add + ibz_copy(&(res->denom), &(res_a.denom)); + ibz_vec_4_add(&(res->coord), &(res_a.coord), &(res_b.coord)); + quat_alg_elem_finalize(&res_a); + quat_alg_elem_finalize(&res_b); } -void quat_alg_trace(ibq_t *res, const quat_alg_elem_t *a){ - quat_alg_elem_t trace; - quat_alg_elem_init(&trace); - - ibz_copy(&(trace.denom), &(a->denom)); - ibz_add(&(trace.coord[0]),&(a->coord[0]),&(a->coord[0])); - ibz_sub(&(trace.coord[1]),&(a->coord[1]),&(a->coord[1])); - ibz_sub(&(trace.coord[2]),&(a->coord[2]),&(a->coord[2])); - ibz_sub(&(trace.coord[3]),&(a->coord[3]),&(a->coord[3])); - ibq_set(res,&(trace.coord[0]),&(trace.denom)); - - quat_alg_elem_finalize(&trace); +void +quat_alg_sub(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b) +{ + quat_alg_elem_t res_a, res_b; + quat_alg_elem_init(&res_a); + quat_alg_elem_init(&res_b); + // put both on the same denominator + quat_alg_equal_denom(&res_a, &res_b, a, b); + // then substract + ibz_copy(&res->denom, &res_a.denom); + ibz_vec_4_sub(&res->coord, &res_a.coord, &res_b.coord); + quat_alg_elem_finalize(&res_a); + quat_alg_elem_finalize(&res_b); } -void quat_alg_scalar(quat_alg_elem_t *elem, const ibz_t *numerator, const ibz_t *denominator){ - ibz_copy(&(elem->denom),denominator); - ibz_copy(&(elem->coord[0]),numerator); - ibz_set(&(elem->coord[1]),0); - ibz_set(&(elem->coord[2]),0); - ibz_set(&(elem->coord[3]),0); +void +quat_alg_mul(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b, const quat_alg_t *alg) +{ + // denominator: product of denominators + ibz_mul(&(res->denom), &(a->denom), &(b->denom)); + quat_alg_coord_mul(&(res->coord), &(a->coord), &(b->coord), alg); } -void quat_alg_conj(quat_alg_elem_t *conj, const quat_alg_elem_t *x){ - ibz_copy(&(conj->denom), &(x->denom)); - ibz_copy(&(conj->coord[0]),&(x->coord[0])); - ibz_neg(&(conj->coord[1]),&(x->coord[1])); - ibz_neg(&(conj->coord[2]),&(x->coord[2])); - ibz_neg(&(conj->coord[3]),&(x->coord[3])); +void +quat_alg_norm(ibz_t *res_num, ibz_t *res_denom, const quat_alg_elem_t *a, const quat_alg_t *alg) +{ + ibz_t r, g; + quat_alg_elem_t norm; + ibz_init(&r); + ibz_init(&g); + quat_alg_elem_init(&norm); + + quat_alg_conj(&norm, a); + quat_alg_mul(&norm, a, &norm, alg); + ibz_gcd(&g, &(norm.coord[0]), &(norm.denom)); + ibz_div(res_num, &r, &(norm.coord[0]), &g); + ibz_div(res_denom, &r, &(norm.denom), &g); + ibz_abs(res_denom, res_denom); + ibz_abs(res_num, res_num); + assert(ibz_cmp(res_denom, &ibz_const_zero) > 0); + + quat_alg_elem_finalize(&norm); + ibz_finalize(&r); + ibz_finalize(&g); } -//defined in header -//int quat_alg_is_primitive(const quat_alg_elem_t *x, const quat_order_t *order, const quat_alg_t *alg) { -// quat_alg_coord_t *coord; -// quat_alg_coord_init(coord); -// int ok = quat_lattice_contains(coord, order, x); - //assert(ok); - //unused(ok); -// ibz_t *cnt; -// ibz_init(cnt); -// ibz_content(cnt, coord); -// ok = ibz_is_one(cnt); -// ibz_finalize(cnt); -// quat_alg_coord_finalize(coord); -// return ok; -//} -// -//static inline void quat_alg_make_primitive(quat_alg_coord_t *primitive_x, ibz_t *content, const quat_alg_elem_t *x, const quat_order_t *order, const quat_alg_t *alg){ -// int ok = quat_lattice_contains(primitive_x, order, x); - //assert(ok); - //unused(ok); -// ibz_content(content, primitive_x); -// for(int i = 0; i <4; i++){ -// ibz_div(primitive_x[i], NULL, primitive_x[i], content); -// } -//} +void +quat_alg_scalar(quat_alg_elem_t *elem, const ibz_t *numerator, const ibz_t *denominator) +{ + ibz_copy(&(elem->denom), denominator); + ibz_copy(&(elem->coord[0]), numerator); + ibz_set(&(elem->coord[1]), 0); + ibz_set(&(elem->coord[2]), 0); + ibz_set(&(elem->coord[3]), 0); +} -void quat_alg_normalize(quat_alg_elem_t *x){ - ibz_t gcd,r, zero; - ibz_init(&gcd); - ibz_init(&r); - ibz_init(&zero); - ibz_content(&gcd,&(x->coord)); - ibz_gcd(&gcd,&gcd,&(x->denom)); - ibz_div(&(x->denom),&r,&(x->denom),&gcd); - for (int i = 0; i < 4; i++){ - ibz_div(&(x->coord[i]),&r,&(x->coord[i]),&gcd); - } - ibz_set(&zero,0); - if (0denom))){ - for (int i = 0; i < 4; i++){ - ibz_neg(&(x->coord[i]),&(x->coord[i])); +void +quat_alg_conj(quat_alg_elem_t *conj, const quat_alg_elem_t *x) +{ + ibz_copy(&(conj->denom), &(x->denom)); + ibz_copy(&(conj->coord[0]), &(x->coord[0])); + ibz_neg(&(conj->coord[1]), &(x->coord[1])); + ibz_neg(&(conj->coord[2]), &(x->coord[2])); + ibz_neg(&(conj->coord[3]), &(x->coord[3])); +} + +void +quat_alg_make_primitive(ibz_vec_4_t *primitive_x, ibz_t *content, const quat_alg_elem_t *x, const quat_lattice_t *order) +{ + int ok UNUSED = quat_lattice_contains(primitive_x, order, x); + assert(ok); + ibz_vec_4_content(content, primitive_x); + ibz_t r; + ibz_init(&r); + for (int i = 0; i < 4; i++) { + ibz_div(*primitive_x + i, &r, *primitive_x + i, content); } - ibz_neg(&(x->denom),&(x->denom)); - } - ibz_finalize(&gcd); - ibz_finalize(&r); - ibz_finalize(&zero); + ibz_finalize(&r); } -int quat_alg_elem_is_zero(const quat_alg_elem_t *x){ - int res = quat_alg_coord_is_zero(&(x->coord)); - return(res); +void +quat_alg_normalize(quat_alg_elem_t *x) +{ + ibz_t gcd, sign, r; + ibz_init(&gcd); + ibz_init(&sign); + ibz_init(&r); + ibz_vec_4_content(&gcd, &(x->coord)); + ibz_gcd(&gcd, &gcd, &(x->denom)); + ibz_div(&(x->denom), &r, &(x->denom), &gcd); + ibz_vec_4_scalar_div(&(x->coord), &gcd, &(x->coord)); + ibz_set(&sign, 2 * (0 > ibz_cmp(&ibz_const_zero, &(x->denom))) - 1); + ibz_vec_4_scalar_mul(&(x->coord), &sign, &(x->coord)); + ibz_mul(&(x->denom), &sign, &(x->denom)); + ibz_finalize(&gcd); + ibz_finalize(&sign); + ibz_finalize(&r); } -int quat_alg_coord_is_zero(const quat_alg_coord_t *x){ - int res = 1; - for (int i = 0; i < 4; i++){ - res &= ibz_is_zero(&((*x)[i])); - } - return(res); +int +quat_alg_elem_equal(const quat_alg_elem_t *a, const quat_alg_elem_t *b) +{ + quat_alg_elem_t diff; + quat_alg_elem_init(&diff); + quat_alg_sub(&diff, a, b); + int res = quat_alg_elem_is_zero(&diff); + quat_alg_elem_finalize(&diff); + return (res); } -// helper functions for lattices -void quat_alg_elem_copy_ibz(quat_alg_elem_t *elem, const ibz_t *denom, const ibz_t *coord0,const ibz_t *coord1,const ibz_t *coord2,const ibz_t *coord3){ - ibz_copy(&(elem->coord[0]), coord0); - ibz_copy(&(elem->coord[1]), coord1); - ibz_copy(&(elem->coord[2]), coord2); - ibz_copy(&(elem->coord[3]), coord3); - - ibz_copy(&(elem->denom),denom); +int +quat_alg_elem_is_zero(const quat_alg_elem_t *x) +{ + int res = ibz_vec_4_is_zero(&(x->coord)); + return (res); } -void quat_alg_elem_set(quat_alg_elem_t *elem, int64_t denom, int64_t coord0, int64_t coord1, int64_t coord2, int64_t coord3){ +void +quat_alg_elem_set(quat_alg_elem_t *elem, int32_t denom, int32_t coord0, int32_t coord1, int32_t coord2, int32_t coord3) +{ ibz_set(&(elem->coord[0]), coord0); ibz_set(&(elem->coord[1]), coord1); ibz_set(&(elem->coord[2]), coord2); ibz_set(&(elem->coord[3]), coord3); - ibz_set(&(elem->denom),denom); + ibz_set(&(elem->denom), denom); } -void quat_alg_elem_mul_by_scalar(quat_alg_elem_t *res, const ibz_t *scalar, const quat_alg_elem_t *elem){ - for(int i = 0; i < 4; i++){ - ibz_mul(&(res->coord[i]), &(elem->coord[i]),scalar); - } - ibz_copy(&(res->denom),&(elem->denom)); +void +quat_alg_elem_copy(quat_alg_elem_t *copy, const quat_alg_elem_t *copied) +{ + ibz_copy(©->denom, &copied->denom); + ibz_copy(©->coord[0], &copied->coord[0]); + ibz_copy(©->coord[1], &copied->coord[1]); + ibz_copy(©->coord[2], &copied->coord[2]); + ibz_copy(©->coord[3], &copied->coord[3]); +} + +// helper functions for lattices +void +quat_alg_elem_copy_ibz(quat_alg_elem_t *elem, + const ibz_t *denom, + const ibz_t *coord0, + const ibz_t *coord1, + const ibz_t *coord2, + const ibz_t *coord3) +{ + ibz_copy(&(elem->coord[0]), coord0); + ibz_copy(&(elem->coord[1]), coord1); + ibz_copy(&(elem->coord[2]), coord2); + ibz_copy(&(elem->coord[3]), coord3); + + ibz_copy(&(elem->denom), denom); +} + +void +quat_alg_elem_mul_by_scalar(quat_alg_elem_t *res, const ibz_t *scalar, const quat_alg_elem_t *elem) +{ + for (int i = 0; i < 4; i++) { + ibz_mul(&(res->coord[i]), &(elem->coord[i]), scalar); + } + ibz_copy(&(res->denom), &(elem->denom)); } diff --git a/src/quaternion/ref/generic/dim2.c b/src/quaternion/ref/generic/dim2.c index ff46caf..b31ae77 100644 --- a/src/quaternion/ref/generic/dim2.c +++ b/src/quaternion/ref/generic/dim2.c @@ -1,40 +1,66 @@ #include #include "internal.h" -//internal helpers, also for other files -void ibz_vec_2_set(ibz_vec_2_t *vec, int a0, int a1){ - ibz_set(&((*vec)[0]),a0); - ibz_set(&((*vec)[1]),a1); +// internal helpers, also for other files +void +ibz_vec_2_set(ibz_vec_2_t *vec, int a0, int a1) +{ + ibz_set(&((*vec)[0]), a0); + ibz_set(&((*vec)[1]), a1); } -void ibz_mat_2x2_set(ibz_mat_2x2_t *mat, int a00, int a01, int a10, int a11){ - ibz_set(&((*mat)[0][0]),a00); - ibz_set(&((*mat)[0][1]),a01); - ibz_set(&((*mat)[1][0]),a10); - ibz_set(&((*mat)[1][1]),a11); +void +ibz_mat_2x2_set(ibz_mat_2x2_t *mat, int a00, int a01, int a10, int a11) +{ + ibz_set(&((*mat)[0][0]), a00); + ibz_set(&((*mat)[0][1]), a01); + ibz_set(&((*mat)[1][0]), a10); + ibz_set(&((*mat)[1][1]), a11); } -void ibz_mat_2x2_det_from_ibz(ibz_t *det, const ibz_t *a11, const ibz_t *a12, const ibz_t *a21, const ibz_t *a22){ +void +ibz_mat_2x2_copy(ibz_mat_2x2_t *copy, const ibz_mat_2x2_t *copied) +{ + ibz_copy(&((*copy)[0][0]), &((*copied)[0][0])); + ibz_copy(&((*copy)[0][1]), &((*copied)[0][1])); + ibz_copy(&((*copy)[1][0]), &((*copied)[1][0])); + ibz_copy(&((*copy)[1][1]), &((*copied)[1][1])); +} + +void +ibz_mat_2x2_add(ibz_mat_2x2_t *sum, const ibz_mat_2x2_t *a, const ibz_mat_2x2_t *b) +{ + ibz_add(&((*sum)[0][0]), &((*a)[0][0]), &((*b)[0][0])); + ibz_add(&((*sum)[0][1]), &((*a)[0][1]), &((*b)[0][1])); + ibz_add(&((*sum)[1][0]), &((*a)[1][0]), &((*b)[1][0])); + ibz_add(&((*sum)[1][1]), &((*a)[1][1]), &((*b)[1][1])); +} + +void +ibz_mat_2x2_det_from_ibz(ibz_t *det, const ibz_t *a11, const ibz_t *a12, const ibz_t *a21, const ibz_t *a22) +{ ibz_t prod; ibz_init(&prod); - ibz_mul(&prod,a12,a21); - ibz_mul(det,a11,a22); - ibz_sub(det,det,&prod); + ibz_mul(&prod, a12, a21); + ibz_mul(det, a11, a22); + ibz_sub(det, det, &prod); ibz_finalize(&prod); } -void ibz_mat_2x2_eval(ibz_vec_2_t *res, const ibz_mat_2x2_t *mat, const ibz_vec_2_t *vec){ +void +ibz_mat_2x2_eval(ibz_vec_2_t *res, const ibz_mat_2x2_t *mat, const ibz_vec_2_t *vec) +{ ibz_t prod; ibz_vec_2_t matvec; ibz_init(&prod); ibz_vec_2_init(&matvec); - ibz_mul(&prod,&((*mat)[0][0]),&((*vec)[0])); + ibz_mul(&prod, &((*mat)[0][0]), &((*vec)[0])); ibz_copy(&(matvec[0]), &prod); - ibz_mul(&prod,&((*mat)[0][1]),&((*vec)[1])); - ibz_add(&(matvec[0]),&(matvec[0]), &prod); - ibz_mul(&prod,&((*mat)[1][0]),&((*vec)[0])); + ibz_mul(&prod, &((*mat)[0][1]), &((*vec)[1])); + ibz_add(&(matvec[0]), &(matvec[0]), &prod); + ibz_mul(&prod, &((*mat)[1][0]), &((*vec)[0])); ibz_copy(&(matvec[1]), &prod); - ibz_mul(&prod,&((*mat)[1][1]),&((*vec)[1])); - ibz_add(&(matvec[1]),&(matvec[1]), &prod); + ibz_mul(&prod, &((*mat)[1][1]), &((*vec)[1])); + ibz_add(&(matvec[1]), &(matvec[1]), &prod); ibz_copy(&((*res)[0]), &(matvec[0])); ibz_copy(&((*res)[1]), &(matvec[1])); ibz_finalize(&prod); @@ -43,511 +69,64 @@ void ibz_mat_2x2_eval(ibz_vec_2_t *res, const ibz_mat_2x2_t *mat, const ibz_vec_ // modular 2x2 operations -void ibz_2x2_mul_mod(ibz_mat_2x2_t *prod, const ibz_mat_2x2_t *mat_a, const ibz_mat_2x2_t *mat_b, const ibz_t *m){ +void +ibz_2x2_mul_mod(ibz_mat_2x2_t *prod, const ibz_mat_2x2_t *mat_a, const ibz_mat_2x2_t *mat_b, const ibz_t *m) +{ ibz_t mul; ibz_mat_2x2_t sums; ibz_init(&mul); ibz_mat_2x2_init(&sums); - for(int i = 0; i < 2; i++){ - for(int j = 0; j < 2; j++){ - ibz_set(&(sums[i][j]),0); + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + ibz_set(&(sums[i][j]), 0); } } - for(int i = 0; i < 2; i++){ - for(int j = 0; j < 2; j++){ - for(int k = 0; k < 2; k++){ - ibz_mul(&mul,&((*mat_a)[i][k]), &((*mat_b)[k][j])); - ibz_add(&(sums[i][j]),&(sums[i][j]), &mul); - ibz_mod(&(sums[i][j]),&(sums[i][j]), m); - } + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + for (int k = 0; k < 2; k++) { + ibz_mul(&mul, &((*mat_a)[i][k]), &((*mat_b)[k][j])); + ibz_add(&(sums[i][j]), &(sums[i][j]), &mul); + ibz_mod(&(sums[i][j]), &(sums[i][j]), m); + } } } - for(int i = 0; i < 2; i++){ - for(int j = 0; j < 2; j++){ - ibz_copy(&((*prod)[i][j]),&(sums[i][j])); + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + ibz_copy(&((*prod)[i][j]), &(sums[i][j])); } } ibz_finalize(&mul); ibz_mat_2x2_finalize(&sums); } -int ibz_2x2_inv_mod(ibz_mat_2x2_t *inv, const ibz_mat_2x2_t *mat, const ibz_t *m){ - ibz_t det, prod; +int +ibz_mat_2x2_inv_mod(ibz_mat_2x2_t *inv, const ibz_mat_2x2_t *mat, const ibz_t *m) +{ + ibz_t det, prod; ibz_init(&det); ibz_init(&prod); - ibz_mul(&det,&((*mat)[0][0]),&((*mat)[1][1])); - ibz_mod(&det,&det,m); - ibz_mul(&prod,&((*mat)[0][1]),&((*mat)[1][0])); - ibz_sub(&det,&det,&prod); - ibz_mod(&det,&det,m); - int res = ibz_invmod(&det,&det,m); - if(res){ - ibz_copy(&prod,&((*mat)[0][0])); - ibz_copy(&((*inv)[0][0]), &((*mat)[1][1])); - ibz_copy(&((*inv)[1][1]), &prod); - ibz_neg(&((*inv)[1][0]), &((*mat)[1][0])); - ibz_neg(&((*inv)[0][1]), &((*mat)[0][1])); - for(int i = 0; i<2;i++){ - for(int j = 0; j<2;j++){ - ibz_mul(&((*inv)[i][j]),&((*inv)[i][j]),&det); - ibz_mod(&((*inv)[i][j]),&((*inv)[i][j]),m); - } + ibz_mul(&det, &((*mat)[0][0]), &((*mat)[1][1])); + ibz_mod(&det, &det, m); + ibz_mul(&prod, &((*mat)[0][1]), &((*mat)[1][0])); + ibz_sub(&det, &det, &prod); + ibz_mod(&det, &det, m); + int res = ibz_invmod(&det, &det, m); + // return 0 matrix if non invertible determinant + ibz_set(&prod, res); + ibz_mul(&det, &det, &prod); + // compute inverse + ibz_copy(&prod, &((*mat)[0][0])); + ibz_copy(&((*inv)[0][0]), &((*mat)[1][1])); + ibz_copy(&((*inv)[1][1]), &prod); + ibz_neg(&((*inv)[1][0]), &((*mat)[1][0])); + ibz_neg(&((*inv)[0][1]), &((*mat)[0][1])); + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + ibz_mul(&((*inv)[i][j]), &((*inv)[i][j]), &det); + ibz_mod(&((*inv)[i][j]), &((*inv)[i][j]), m); } } ibz_finalize(&det); ibz_finalize(&prod); - return(res); -} - -//helper for cvp -int quat_dim2_lattice_contains(ibz_mat_2x2_t *basis, ibz_t *coord1, ibz_t *coord2){ - int res = 1; - ibz_t prod, sum, det, r; - ibz_init(&det); - ibz_init(&r); - ibz_init(&sum); - ibz_init(&prod); - // compute det, then both coordinates (inverse*det)*vec, where vec is (coord1, coord2) and check wthether det divides both results - ibz_mat_2x2_det_from_ibz(&det, &((*basis)[0][0]), &((*basis)[0][1]), &((*basis)[1][0]), &((*basis)[1][1])); - ibz_mul(&sum,coord1,&((*basis)[1][1])); - ibz_mul(&prod,coord2,&((*basis)[0][1])); - ibz_sub(&sum,&sum,&prod); - ibz_div(&prod,&r,&sum,&det); - res = res && ibz_is_zero(&r); - ibz_mul(&sum,coord2,&((*basis)[0][0])); - ibz_mul(&prod,coord1,&((*basis)[1][0])); - ibz_sub(&sum,&sum,&prod); - ibz_div(&prod,&r,&sum,&det); - res = res && ibz_is_zero(&r); - ibz_finalize(&det); - ibz_finalize(&r); - ibz_finalize(&sum); - ibz_finalize(&prod); - return(res); -} - -void quat_dim2_lattice_norm(ibz_t *norm, const ibz_t *coord1, const ibz_t *coord2, const ibz_t *norm_q){ - ibz_t prod, sum; - ibz_init(&prod); - ibz_init(&sum); - ibz_mul(&sum,coord1,coord1); - ibz_mul(&prod,coord2,coord2); - ibz_mul(&prod,&prod,norm_q); - ibz_add(norm,&sum,&prod); - ibz_finalize(&prod); - ibz_finalize(&sum); -} - -void quat_dim2_lattice_bilinear(ibz_t *res, const ibz_t *v11, const ibz_t *v12,const ibz_t *v21, const ibz_t *v22, const ibz_t *norm_q){ - ibz_t prod, sum; - ibz_init(&prod); - ibz_init(&sum); - ibz_mul(&sum,v11,v21); - ibz_mul(&prod,v12,v22); - ibz_mul(&prod,&prod,norm_q); - ibz_add(res,&sum,&prod); - ibz_finalize(&prod); - ibz_finalize(&sum); -} - -// algo 3.1.14 Cohen (exact solution for shortest vector in dimension 2, than take a second, orthogonal vector) -void quat_dim2_lattice_short_basis(ibz_mat_2x2_t *reduced, const ibz_mat_2x2_t *basis, const ibz_t *norm_q){ - ibz_vec_2_t a,b,t; - ibz_t prod,sum, norm_a, norm_b, r, norm_t, n; - ibz_vec_2_init(&a); - ibz_vec_2_init(&b); - ibz_vec_2_init(&t); - ibz_init(&prod); - ibz_init(&sum); - ibz_init(&r); - ibz_init(&n); - ibz_init(&norm_t); - ibz_init(&norm_a); - ibz_init(&norm_b); - // init a,b - ibz_copy(&(a[0]),&((*basis)[0][0])); - ibz_copy(&(a[1]),&((*basis)[1][0])); - ibz_copy(&(b[0]),&((*basis)[0][1])); - ibz_copy(&(b[1]),&((*basis)[1][1])); - // compute initial norms - quat_dim2_lattice_norm(&norm_a,&(a[0]),&(a[1]), norm_q); - quat_dim2_lattice_norm(&norm_b,&(b[0]),&(b[1]), norm_q); - // exchange if needed - if(ibz_cmp(&norm_a,&norm_b)<0){ - ibz_copy(&sum,&(a[0])); - ibz_copy(&(a[0]),&(b[0])); - ibz_copy(&(b[0]),&sum); - ibz_copy(&sum,&(a[1])); - ibz_copy(&(a[1]),&(b[1])); - ibz_copy(&(b[1]),&sum); - ibz_copy(&sum,&norm_a); - ibz_copy(&norm_a,&norm_b); - ibz_copy(&norm_b,&sum); - } - int test = 1; - while(test){ - //compute n - quat_dim2_lattice_bilinear(&n,&(a[0]),&(a[1]),&(b[0]),&(b[1]),norm_q); - // set r - ibz_rounded_div(&r,&n,&norm_b); - // compute t_norm - ibz_set(&prod,2); - ibz_mul(&prod,&prod,&n); - ibz_mul(&prod,&prod,&r); - ibz_sub(&sum,&norm_a,&prod); - ibz_mul(&prod,&r,&r); - ibz_mul(&prod,&prod,&norm_b); - ibz_add(&norm_t,&sum,&prod); - // test: - if(ibz_cmp(&norm_b,&norm_t)>0){ - // compute t, a, b - ibz_copy(&norm_a,&norm_b); - ibz_copy(&norm_b,&norm_t); - // t is a -rb, a is b, b is t - ibz_mul(&prod,&r,&(b[0])); - ibz_sub(&(t[0]),&(a[0]),&prod); - ibz_mul(&prod,&r,&(b[1])); - ibz_sub(&(t[1]),&(a[1]),&prod); - ibz_copy(&(a[0]),&(b[0])); - ibz_copy(&(a[1]),&(b[1])); - ibz_copy(&(b[0]),&(t[0])); - ibz_copy(&(b[1]),&(t[1])); - } else { - test = 0; - } - } - // output : now b is short: need to get 2nd short vector: idea: take shortest among t and a - if(ibz_cmp(&norm_t,&norm_a)<0){ - ibz_mul(&prod,&r,&(b[0])); - ibz_sub(&(a[0]),&(a[0]),&prod); - ibz_mul(&prod,&r,&(b[1])); - ibz_sub(&(a[1]),&(a[1]),&prod); - } - ibz_copy(&((*reduced)[0][0]),&(b[0])); - ibz_copy(&((*reduced)[1][0]),&(b[1])); - ibz_copy(&((*reduced)[0][1]),&(a[0])); - ibz_copy(&((*reduced)[1][1]),&(a[1])); - - ibz_finalize(&prod); - ibz_finalize(&sum); - ibz_finalize(&norm_a); - ibz_finalize(&norm_b); - ibz_finalize(&norm_t); - ibz_vec_2_finalize(&a); - ibz_vec_2_finalize(&b); - ibz_vec_2_finalize(&t); - ibz_finalize(&r); - ibz_finalize(&n); -} - -// compute the rounded value of /, where a* is a orthogonalised with respect to b -void quat_dim2_lattice_get_coefficient_with_orthogonalisation(ibz_t *res, const ibz_t *a0,const ibz_t *a1,const ibz_t *b0,const ibz_t *b1,const ibz_t *t0,const ibz_t *t1,const ibz_t *norm_q){ - ibz_t norm_b, bilinear, astar1,astar0, prod, norm_astar; - ibz_init(&norm_b); - ibz_init(&norm_astar); - ibz_init(&bilinear); - ibz_init(&prod); - ibz_init(&astar0); - ibz_init(&astar1); - quat_dim2_lattice_norm(&norm_b,b0,b1,norm_q); - quat_dim2_lattice_bilinear(&bilinear,a0,a1,b0,b1,norm_q); - ibz_mul(&astar0,a0,&norm_b); - ibz_mul(&prod,b0,&bilinear); - ibz_sub(&astar0,&astar0,&prod); - ibz_mul(&astar1,a1,&norm_b); - ibz_mul(&prod,b1,&bilinear); - ibz_sub(&astar1,&astar1,&prod); - quat_dim2_lattice_norm(&norm_astar,&astar0,&astar1,norm_q); - quat_dim2_lattice_bilinear(&bilinear,&astar0,&astar1,t0,t1,norm_q); - ibz_mul(&bilinear,&bilinear,&norm_b); - ibz_rounded_div(res,&bilinear,&norm_astar); - ibz_finalize(&norm_b); - ibz_finalize(&norm_astar); - ibz_finalize(&bilinear); - ibz_finalize(&prod); - ibz_finalize(&astar0); - ibz_finalize(&astar1); -} - -// find a closest vector to target in lattice, using a reduced basis given as argument basis. -//nearest plane algo as in https://cims.nyu.edu/~regev/teaching/lattices_fall_2004/ln/cvp.pdf, but without basis: basicallly just a projection -void quat_dim2_lattice_closest_vector(ibz_vec_2_t *target_minus_closest, ibz_vec_2_t *closest_coords_in_basis, const ibz_mat_2x2_t *reduced_basis, const ibz_vec_2_t *target, const ibz_t *norm_q){ - ibz_vec_2_t coords, work; - ibz_t prod, sum, norm_a, norm_b, r; - ibz_vec_2_init(&coords); - ibz_vec_2_init(&work); - ibz_init(&prod); - ibz_init(&sum); - ibz_init(&norm_a); - ibz_init(&norm_b); - ibz_init(&r); - // init work - ibz_copy(&(work[0]),&((*target)[0])); - ibz_copy(&(work[1]),&((*target)[1])); - // norm a,b - quat_dim2_lattice_norm(&norm_a,&((*reduced_basis)[0][0]),&((*reduced_basis)[1][0]), norm_q); - quat_dim2_lattice_norm(&norm_b,&((*reduced_basis)[0][1]),&((*reduced_basis)[1][1]), norm_q); - // use 2nd basis vector (the larger one), and orthogonalise it with respect to the first one - quat_dim2_lattice_get_coefficient_with_orthogonalisation(&(coords[1]),&((*reduced_basis)[0][1]),&((*reduced_basis)[1][1]), &((*reduced_basis)[0][0]),&((*reduced_basis)[1][0]),&(work[0]),&(work[1]),norm_q); - // sustract projection from vector - ibz_mul(&prod,&((*reduced_basis)[0][1]),&(coords[1])); - ibz_sub(&(work[0]),&(work[0]),&prod); - ibz_mul(&prod,&((*reduced_basis)[1][1]),&(coords[1])); - ibz_sub(&(work[1]),&(work[1]),&prod ); - // use 1st basis vector (the smaller one) - quat_dim2_lattice_bilinear(&(coords[0]),&(work[0]),&(work[1]),&((*reduced_basis)[0][0]),&((*reduced_basis)[1][0]),norm_q); - ibz_rounded_div(&(coords[0]),&(coords[0]),&norm_a); - // substract projection from vector - ibz_mul(&prod,&((*reduced_basis)[0][0]),&(coords[0])); - ibz_sub(&(work[0]),&(work[0]),&prod); - ibz_mul(&prod,&((*reduced_basis)[1][0]),&(coords[0])); - ibz_sub(&(work[1]),&(work[1]),&prod ); - // copy results to output - ibz_copy(&((*target_minus_closest)[0]),&(work[0])); - ibz_copy(&((*target_minus_closest)[1]),&(work[1])); - ibz_copy(&((*closest_coords_in_basis)[0]),&(coords[0])); - ibz_copy(&((*closest_coords_in_basis)[1]),&(coords[1])); - - ibz_vec_2_finalize(&coords); - ibz_vec_2_finalize(&work); - ibz_finalize(&prod); - ibz_finalize(&sum); - ibz_finalize(&norm_a); - ibz_finalize(&norm_b); - ibz_finalize(&r); -} - -// give a,b,c such that ax^2 + bxy + cy^2 = N(Bz), where B is the basis, z the vector x,y and N the quadratic form (coord1^2 + q coord2^2) -void quat_dim2_lattice_get_qf_on_lattice(ibz_t *qf_a, ibz_t *qf_b,ibz_t *qf_c, const ibz_mat_2x2_t *basis ,const ibz_t *norm_q){ - ibz_t a, b, c; - ibz_init(&a); - ibz_init(&b); - ibz_init(&c); - quat_dim2_lattice_bilinear(&b,&((*basis)[0][0]), &((*basis)[1][0]), &((*basis)[0][1]), &((*basis)[1][1]),norm_q); - ibz_set(&a,2); - ibz_mul(&b,&b,&a); - quat_dim2_lattice_norm(&a,&((*basis)[0][0]), &((*basis)[1][0]),norm_q); - quat_dim2_lattice_norm(&c, &((*basis)[0][1]), &((*basis)[1][1]),norm_q); - ibz_copy(qf_a,&a); - ibz_copy(qf_b,&b); - ibz_copy(qf_c,&c); - ibz_finalize(&a); - ibz_finalize(&b); - ibz_finalize(&c); -} - -int quat_dim2_lattice_test_cvp_condition(quat_alg_elem_t* elem, const ibz_vec_2_t* vec, const void* params){ - ibz_t *p = ((ibz_t *) params); - ibz_t sum, two; - ibz_init(&sum); - ibz_init(&two); - ibz_set(&two,2); - ibz_add(&sum,&((*vec)[0]),&((*vec)[1])); - ibz_mod(&sum,&sum,p); - int res = (0 ==ibz_cmp(&sum,&two)); - if(res){ - quat_alg_elem_copy_ibz(elem,&two,&((*vec)[0]),&((*vec)[1]),&((*vec)[0]),&((*vec)[1])); - } - ibz_finalize(&sum); - ibz_finalize(&two); - return(res); -} - -int quat_dim2_lattice_bound_and_condition(quat_alg_elem_t *res, const ibz_t *x, const ibz_t *y, int (*condition)(quat_alg_elem_t* , const ibz_vec_2_t*, const void*), const void* params, const ibz_vec_2_t* target_minus_closest, const ibz_mat_2x2_t *lat_basis, const ibz_t* norm_q, const ibz_t* norm_bound){ - ibz_vec_2_t sum, proposal; - ibz_t norm; - int ok = 0; - ibz_init(&norm); - ibz_vec_2_init(&sum); - ibz_vec_2_init(&proposal); - // put x,y from lattice basis in canonical basis - ibz_copy(&(proposal[0]), x); - ibz_copy(&(proposal[1]), y); - ibz_mat_2x2_eval(&proposal,lat_basis,&proposal); - //compute norm of target -closest-proposal - ibz_sub(&(sum[0]),&((*target_minus_closest)[0]),&((proposal)[0])); - ibz_sub(&(sum[1]),&((*target_minus_closest)[1]),&((proposal)[1])); - quat_dim2_lattice_norm(&norm,&(sum[0]),&(sum[1]),norm_q); - // test - if( ibz_cmp(&norm,norm_bound) <= 0){ - ok = condition(res,&sum,params); - } - ibz_finalize(&norm); - ibz_vec_2_finalize(&sum); - ibz_vec_2_finalize(&proposal); - return(ok); -} - -int quat_dim2_lattice_qf_value_bound_generation(ibz_t *res, const ibz_t *num_a, const ibz_t *denom_a, const ibz_t *num_b, const ibz_t *denom_b){ - int ok = 1; - ibz_t sqrt_num, sqrt_denom, one, zero, common_denom, r; - ibz_init(&sqrt_num); - ibz_init(&sqrt_denom); - ibz_init(&one); - ibz_init(&zero); - ibz_init(&common_denom); - ibz_init(&r); - ibz_set(&zero,0); - ibz_set(&one,1); - ibz_mul(&r,num_a,denom_a); - if((ibz_cmp(denom_a,&zero)<0)||ibz_is_zero(denom_a)||ibz_is_zero(denom_b)){ - ok = 0; - } - if(ok){ - ibz_sqrt_floor(&sqrt_num,num_a); - ibz_add(&sqrt_num,&sqrt_num, &one); - ibz_sqrt_floor(&sqrt_denom,denom_a); - - ibz_mul(&common_denom,denom_b,&sqrt_denom); - ibz_mul(&sqrt_num,&sqrt_num,denom_b); - ibz_mul(&r,&sqrt_denom,num_b); - ibz_add(&sqrt_num,&sqrt_num,&r); - ibz_div(res,&r,&sqrt_num,&common_denom); - ibz_add(res,res,&one); - - } - ibz_finalize(&sqrt_num); - ibz_finalize(&sqrt_denom); - ibz_finalize(&one); - ibz_finalize(&zero); - ibz_finalize(&common_denom); - ibz_finalize(&r); - return(ok); -} - -//Uses algorithm 2.7.5 (Fincke-Pohst) from Henri Cohen's "A Course in Computational Algebraic Number Theory" (Springer Verlag, in series "Graduate texts in Mathematics") from 1993 -//Slightly adapted to work without rational numbers and their square roots -//Therefore needing a test to make sure the bounds are respected -int quat_dim2_lattice_qf_enumerate_short_vec(quat_alg_elem_t *res,int (*condition)(quat_alg_elem_t*, const ibz_vec_2_t*, const void*), const void *params, const ibz_vec_2_t *target_minus_closest, const ibz_mat_2x2_t *lat_basis, const ibz_t *norm_q,const ibz_t *norm_bound, const int max_tries){ - int ok = 1; - int found = 0; - int tries = 0; - int stop = 0; - ibz_t bound_y, bound_x, x, y, disc, prod, var, one, four_a2, four_a2_norm_bound, four_a2_c_minus_b2, four_a3,two_a, zero, y2, qf_a, qf_b, qf_c, norm_bound_for_enumeration; - ibz_init(&bound_y); - ibz_init(&bound_x); - ibz_init(&y); - ibz_init(&y2); - ibz_init(&x); - ibz_init(&qf_a); - ibz_init(&qf_b); - ibz_init(&qf_c); - ibz_init(&var); - ibz_init(&one); - ibz_init(&zero); - ibz_init(&disc); - ibz_init(&prod); - ibz_init(&four_a2); - ibz_init(&two_a); - ibz_init(&norm_bound_for_enumeration); - ibz_init(&four_a2_norm_bound); - ibz_init(&four_a2_c_minus_b2); - ibz_init(&four_a3); - ibz_set(&one,1); - ibz_set(&zero,0); - // substract norm of distance from bound to not enumerate too large vectors at beginning - // this is an heuristic which can fail, so in case it is really bad, we do not do it - quat_dim2_lattice_norm(&norm_bound_for_enumeration,&((*target_minus_closest)[0]),&((*target_minus_closest)[1]),norm_q); - ibz_sub(&norm_bound_for_enumeration,norm_bound,&norm_bound_for_enumeration); - if(ibz_cmp(&norm_bound_for_enumeration,&zero)<=0){ - ibz_copy(&norm_bound_for_enumeration, norm_bound); - } - //Set qf_a, qf_b, qf_c such that for x,y, a vector represented in lat_basis, ax^2 + bxy + cy^2 is the norm defined by norm_q - quat_dim2_lattice_get_qf_on_lattice(&qf_a,&qf_b,&qf_c,lat_basis,norm_q); - //discriminant computation - ibz_mul(&disc,&qf_a,&qf_c); - ibz_set(&var,4); - ibz_mul(&disc,&disc,&var); - ibz_mul(&prod,&qf_b,&qf_b); - ibz_sub(&disc,&disc,&prod); - // only continue if disc is not zero nor negative - if (ibz_cmp(&disc,&zero)<=0){ - ok = 0; - } - if(ok){ - // precomputations - ibz_set(&var,2); - ibz_mul(&two_a,&var,&qf_a);//2a init - ibz_mul(&four_a2,&two_a,&two_a);//4a^2 init - ibz_mul(&four_a2_norm_bound,&four_a2,&norm_bound_for_enumeration);//4a^2*norm_bound init - ibz_mul(&four_a3,&four_a2,&qf_a);//4a^3 init - ibz_copy(&four_a2_c_minus_b2,&prod);//equals b^2 now, since prod was not reused since - ibz_mul(&prod,&four_a2,&qf_c); - ibz_sub(&four_a2_c_minus_b2,&prod,&four_a2_c_minus_b2);//now has correct value - // y bound generation - quat_dim2_lattice_qf_value_bound_generation(&bound_y,&four_a2_norm_bound,&four_a2_c_minus_b2,&zero,&one); - ibz_neg(&y,&bound_y); - ibz_sub(&y,&y,&one); // y is set - while((!found) && (!stop) && (ibz_cmp(&y,&bound_y)<0) && (tries #include "internal.h" -//internal helper functions -void ibz_mat_4x4_mul(ibz_mat_4x4_t *res, const ibz_mat_4x4_t *a, const ibz_mat_4x4_t *b){ +// internal helper functions +void +ibz_mat_4x4_mul(ibz_mat_4x4_t *res, const ibz_mat_4x4_t *a, const ibz_mat_4x4_t *b) +{ ibz_mat_4x4_t mat; ibz_t prod; ibz_init(&prod); ibz_mat_4x4_init(&mat); - for (int i = 0; i <4; i++){ - for (int j = 0; j <4; j++){ - ibz_set(&(mat[i][j]),0); - for (int k = 0; k <4; k++){ - ibz_mul(&prod,&((*a)[i][k]), &((*b)[k][j])); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(mat[i][j]), 0); + for (int k = 0; k < 4; k++) { + ibz_mul(&prod, &((*a)[i][k]), &((*b)[k][j])); ibz_add(&(mat[i][j]), &(mat[i][j]), &prod); } } } - for (int i = 0; i <4; i++){ - for (int j = 0; j <4; j++){ - ibz_copy(&((*res)[i][j]),&(mat[i][j])); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_copy(&((*res)[i][j]), &(mat[i][j])); } } ibz_mat_4x4_finalize(&mat); ibz_finalize(&prod); } -//helper functions for lattices -void ibz_vec_4_set(ibz_vec_4_t *vec, int64_t coord0, int64_t coord1, int64_t coord2, int64_t coord3){ - ibz_set(&((*vec)[0]),coord0); - ibz_set(&((*vec)[1]),coord1); - ibz_set(&((*vec)[2]),coord2); - ibz_set(&((*vec)[3]),coord3); +// helper functions for lattices +void +ibz_vec_4_set(ibz_vec_4_t *vec, int32_t coord0, int32_t coord1, int32_t coord2, int32_t coord3) +{ + ibz_set(&((*vec)[0]), coord0); + ibz_set(&((*vec)[1]), coord1); + ibz_set(&((*vec)[2]), coord2); + ibz_set(&((*vec)[3]), coord3); } -void ibz_vec_4_copy(ibz_vec_4_t *new, const ibz_vec_4_t *vec){ - for (int i = 0; i <4; i++){ - ibz_copy(&((*new)[i]),&((*vec)[i])); +void +ibz_vec_4_copy(ibz_vec_4_t *new, const ibz_vec_4_t *vec) +{ + for (int i = 0; i < 4; i++) { + ibz_copy(&((*new)[i]), &((*vec)[i])); } } -void ibz_vec_4_negate(ibz_vec_4_t *neg, const ibz_vec_4_t *vec){ - for (int i = 0; i <4; i++){ - ibz_neg(&((*neg)[i]),&((*vec)[i])); +void +ibz_vec_4_copy_ibz(ibz_vec_4_t *res, const ibz_t *coord0, const ibz_t *coord1, const ibz_t *coord2, const ibz_t *coord3) +{ + ibz_copy(&((*res)[0]), coord0); + ibz_copy(&((*res)[1]), coord1); + ibz_copy(&((*res)[2]), coord2); + ibz_copy(&((*res)[3]), coord3); +} + +void +ibz_vec_4_content(ibz_t *content, const ibz_vec_4_t *v) +{ + ibz_gcd(content, &((*v)[0]), &((*v)[1])); + ibz_gcd(content, &((*v)[2]), content); + ibz_gcd(content, &((*v)[3]), content); +} + +void +ibz_vec_4_negate(ibz_vec_4_t *neg, const ibz_vec_4_t *vec) +{ + for (int i = 0; i < 4; i++) { + ibz_neg(&((*neg)[i]), &((*vec)[i])); } } -void ibz_vec_4_linear_combination(ibz_vec_4_t *lc, const ibz_t *coeff_a, const ibz_vec_4_t *vec_a, const ibz_t *coeff_b, const ibz_vec_4_t *vec_b){ +void +ibz_vec_4_add(ibz_vec_4_t *res, const ibz_vec_4_t *a, const ibz_vec_4_t *b) +{ + ibz_add(&((*res)[0]), &((*a)[0]), &((*b)[0])); + ibz_add(&((*res)[1]), &((*a)[1]), &((*b)[1])); + ibz_add(&((*res)[2]), &((*a)[2]), &((*b)[2])); + ibz_add(&((*res)[3]), &((*a)[3]), &((*b)[3])); +} + +void +ibz_vec_4_sub(ibz_vec_4_t *res, const ibz_vec_4_t *a, const ibz_vec_4_t *b) +{ + ibz_sub(&((*res)[0]), &((*a)[0]), &((*b)[0])); + ibz_sub(&((*res)[1]), &((*a)[1]), &((*b)[1])); + ibz_sub(&((*res)[2]), &((*a)[2]), &((*b)[2])); + ibz_sub(&((*res)[3]), &((*a)[3]), &((*b)[3])); +} + +int +ibz_vec_4_is_zero(const ibz_vec_4_t *x) +{ + int res = 1; + for (int i = 0; i < 4; i++) { + res &= ibz_is_zero(&((*x)[i])); + } + return (res); +} + +void +ibz_vec_4_linear_combination(ibz_vec_4_t *lc, + const ibz_t *coeff_a, + const ibz_vec_4_t *vec_a, + const ibz_t *coeff_b, + const ibz_vec_4_t *vec_b) +{ ibz_t prod; ibz_vec_4_t sums; ibz_vec_4_init(&sums); ibz_init(&prod); - for (int i = 0; i <4; i++){ - ibz_mul(&(sums[i]),coeff_a,&((*vec_a)[i])); - ibz_mul(&prod,coeff_b,&((*vec_b)[i])); - ibz_add(&(sums[i]),&(sums[i]),&prod); + for (int i = 0; i < 4; i++) { + ibz_mul(&(sums[i]), coeff_a, &((*vec_a)[i])); + ibz_mul(&prod, coeff_b, &((*vec_b)[i])); + ibz_add(&(sums[i]), &(sums[i]), &prod); } - for (int i = 0; i <4; i++){ - ibz_copy(&((*lc)[i]),&(sums[i])); + for (int i = 0; i < 4; i++) { + ibz_copy(&((*lc)[i]), &(sums[i])); } ibz_finalize(&prod); ibz_vec_4_finalize(&sums); } -int ibz_vec_4_scalar_div(ibz_vec_4_t *quot, const ibz_t *scalar, const ibz_vec_4_t *vec){ +void +ibz_vec_4_scalar_mul(ibz_vec_4_t *prod, const ibz_t *scalar, const ibz_vec_4_t *vec) +{ + for (int i = 0; i < 4; i++) { + ibz_mul(&((*prod)[i]), &((*vec)[i]), scalar); + } +} + +int +ibz_vec_4_scalar_div(ibz_vec_4_t *quot, const ibz_t *scalar, const ibz_vec_4_t *vec) +{ int res = 1; ibz_t r; ibz_init(&r); - for(int i = 0; i < 4; i++){ - ibz_div(&((*quot)[i]),&r,&((*vec)[i]),scalar); + for (int i = 0; i < 4; i++) { + ibz_div(&((*quot)[i]), &r, &((*vec)[i]), scalar); res = res && ibz_is_zero(&r); } ibz_finalize(&r); - return(res); + return (res); } -void ibz_mat_4x4_copy(ibz_mat_4x4_t *new, const ibz_mat_4x4_t *mat){ - for(int i = 0; i <4; i++){ - for(int j = 0; j<4; j++){ - ibz_copy(&((*new)[i][j]),&((*mat)[i][j])); +void +ibz_mat_4x4_copy(ibz_mat_4x4_t *new, const ibz_mat_4x4_t *mat) +{ + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_copy(&((*new)[i][j]), &((*mat)[i][j])); } } } -void ibz_mat_4x4_negate(ibz_mat_4x4_t *neg, const ibz_mat_4x4_t *mat){ - for(int i = 0; i <4; i++){ - for(int j = 0; j<4; j++){ - ibz_neg(&((*neg)[i][j]),&((*mat)[i][j])); +void +ibz_mat_4x4_negate(ibz_mat_4x4_t *neg, const ibz_mat_4x4_t *mat) +{ + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_neg(&((*neg)[i][j]), &((*mat)[i][j])); } } } -void ibz_mat_4x4_transpose(ibz_mat_4x4_t *transposed, const ibz_mat_4x4_t *mat){ +void +ibz_mat_4x4_transpose(ibz_mat_4x4_t *transposed, const ibz_mat_4x4_t *mat) +{ ibz_mat_4x4_t work; ibz_mat_4x4_init(&work); - for(int i = 0; i < 4; i ++){ - for(int j = 0; j < 4; j ++){ - ibz_copy(&(work[i][j]),&((*mat)[j][i])); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_copy(&(work[i][j]), &((*mat)[j][i])); } } - ibz_mat_4x4_copy(transposed,&work); + ibz_mat_4x4_copy(transposed, &work); ibz_mat_4x4_finalize(&work); } -void ibz_mat_4x4_zero(ibz_mat_4x4_t *zero){ - for(int i = 0; i <4; i++){ - for(int j = 0; j<4; j++){ - ibz_set(&((*zero)[i][j]),0); +void +ibz_mat_4x4_zero(ibz_mat_4x4_t *zero) +{ + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&((*zero)[i][j]), 0); } } } -void ibz_mat_4x4_identity(ibz_mat_4x4_t *id){ - for(int i = 0; i <4; i++){ - for(int j = 0; j<4; j++){ - ibz_set(&((*id)[i][j]),0); +void +ibz_mat_4x4_identity(ibz_mat_4x4_t *id) +{ + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&((*id)[i][j]), 0); } - ibz_set(&((*id)[i][i]),1); + ibz_set(&((*id)[i][i]), 1); } } -int ibz_mat_4x4_is_identity(const ibz_mat_4x4_t *mat){ +int +ibz_mat_4x4_is_identity(const ibz_mat_4x4_t *mat) +{ int res = 1; - for(int i = 0; i <4; i++){ - for(int j = 0; j<4; j++){ - res = res && (ibz_get(&((*mat)[i][j])) == (i==j)); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + res = res && ibz_is_one(&((*mat)[i][j])) == (i == j); } } - return(res); + return (res); } -int ibz_mat_4x4_equal(const ibz_mat_4x4_t *mat1, const ibz_mat_4x4_t *mat2){ +int +ibz_mat_4x4_equal(const ibz_mat_4x4_t *mat1, const ibz_mat_4x4_t *mat2) +{ int res = 0; - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - res = res || ibz_cmp(&((*mat1)[i][j]),&((*mat2)[i][j])); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + res = res | ibz_cmp(&((*mat1)[i][j]), &((*mat2)[i][j])); } } - return(!res); + return (!res); } -void ibz_mat_4x4_scalar_mul(ibz_mat_4x4_t *prod, const ibz_t *scalar, const ibz_mat_4x4_t *mat){ - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_mul(&((*prod)[i][j]),&((*mat)[i][j]),scalar); +void +ibz_mat_4x4_scalar_mul(ibz_mat_4x4_t *prod, const ibz_t *scalar, const ibz_mat_4x4_t *mat) +{ + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_mul(&((*prod)[i][j]), &((*mat)[i][j]), scalar); } } } -void ibz_mat_4x4_gcd(ibz_t *gcd, const ibz_mat_4x4_t *mat){ +void +ibz_mat_4x4_gcd(ibz_t *gcd, const ibz_mat_4x4_t *mat) +{ ibz_t d; ibz_init(&d); ibz_copy(&d, &((*mat)[0][0])); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_gcd(&d,&d,&((*mat)[i][j])); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_gcd(&d, &d, &((*mat)[i][j])); } } - ibz_copy(gcd,&d); + ibz_copy(gcd, &d); ibz_finalize(&d); } -int ibz_mat_4x4_scalar_div(ibz_mat_4x4_t *quot, const ibz_t *scalar, const ibz_mat_4x4_t *mat){ +int +ibz_mat_4x4_scalar_div(ibz_mat_4x4_t *quot, const ibz_t *scalar, const ibz_mat_4x4_t *mat) +{ int res = 1; ibz_t r; ibz_init(&r); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_div(&((*quot)[i][j]),&r,&((*mat)[i][j]),scalar); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_div(&((*quot)[i][j]), &r, &((*mat)[i][j]), scalar); res = res && ibz_is_zero(&r); } } ibz_finalize(&r); - return(res); + return (res); } - -int ibz_mat_4x4_is_hnf(const ibz_mat_4x4_t *mat){ - int res = 1; - int found = 0; - int ind = 0; - ibz_t zero; - ibz_init(&zero); - // upper triangular - for (int i = 0; i < 4; i++){ - // upper triangular - for (int j = 0; j < i; j++){ - res = res && ibz_is_zero(&((*mat)[i][j])); - } - // find first non 0 element of line - found = 0; - for (int j = i; j < 4; j++){ - if(found){ - // all values are positive, and first non-0 is the largest of that line - res = res && (ibz_cmp(&((*mat)[i][j]),&zero)>=0); - res = res && (ibz_cmp(&((*mat)[i][ind]),&((*mat)[i][j]))>0); - } else { - if(!ibz_is_zero(&((*mat)[i][j]))){ - found = 1; - ind = j; - // mustbe non-negative - res = res && (ibz_cmp(&((*mat)[i][j]),&zero)>0); - } - } - } - } - // check that first nom-zero elements ndex per column is strictly increasing - int linestart = -1; - int i = 0; - for(int j = 0; j<4; j++){ - while((i < 4) &&(ibz_is_zero(&((*mat)[i][j])))){ - i = i+1; - } if (i != 4) { - res = res && (linestart < i); - } - i = 0; - } - ibz_finalize(&zero); - return res; -} - -//Algorithm used is the one at number 2.4.5 in Henri Cohen's "A Course in Computational Algebraic Number Theory" (Springer Verlag, in series "Graduate texts in Mathematics") from 1993 -// assumes ibz_xgcd outputs u,v which are small in absolute value (as described in the book)void ibz_mat_4x8_hnf_core(ibz_mat_4x4_t *hnf, const ibz_mat_4x8_t *generators) -void ibz_mat_4x8_hnf_core(ibz_mat_4x4_t *hnf, const ibz_mat_4x8_t *generators) +// 4x4 inversion helper functions +void +ibz_inv_dim4_make_coeff_pmp(ibz_t *coeff, + const ibz_t *a1, + const ibz_t *a2, + const ibz_t *b1, + const ibz_t *b2, + const ibz_t *c1, + const ibz_t *c2) { - int i = 3; - int j = 7; - int k = 7; - ibz_t b, u, v, d, zero, coeff_1, coeff_2, r; - ibz_vec_4_t c; - ibz_vec_4_t a[8]; - ibz_init(&b); - ibz_init(&d); - ibz_init(&u); - ibz_init(&v); - ibz_init(&r); - ibz_init(&coeff_1); - ibz_init(&coeff_2); - ibz_init(&zero); - ibz_set(&zero,0); - ibz_vec_4_init(&c); - for (int h = 0; h < 8; h++){ - ibz_vec_4_init(&(a[h])); - ibz_copy(&(a[h][0]), &((*generators)[0][h])); - ibz_copy(&(a[h][1]), &((*generators)[1][h])); - ibz_copy(&(a[h][2]), &((*generators)[2][h])); - ibz_copy(&(a[h][3]), &((*generators)[3][h])); - } - while (i != -1){ - while (j != 0){ - j = j - 1; - if (!ibz_is_zero(&(a[j][i]))){ - // assumtion that ibz_xgcd outputs u,v which are small in absolute value is needed here - ibz_xgcd(&d,&u,&v,&(a[k][i]),&(a[j][i])); - // also, needs u non 0, but v can be 0 if needed - if(ibz_is_zero(&u)){ - ibz_div(&v,&r,&(a[k][i]),&(a[j][i])); - ibz_set(&u,1); - ibz_sub(&v,&u,&v); - } - ibz_vec_4_linear_combination(&c,&u,&(a[k]),&v,&(a[j])); - ibz_div(&coeff_1,&r, &(a[k][i]),&d); - ibz_div(&coeff_2,&r, &(a[j][i]),&d); - ibz_neg(&coeff_2, &coeff_2); - ibz_vec_4_linear_combination(&(a[j]),&coeff_1,&(a[j]),&coeff_2,&(a[k])); - ibz_vec_4_copy(&(a[k]),&c); - } - } - ibz_copy(&b,&(a[k][i])); - if (ibz_cmp(&b, &zero) < 0){ - ibz_vec_4_negate(&(a[k]),&(a[k])); - ibz_neg(&b, &b); - } - if (ibz_is_zero(&b)){ - k = k + 1; - } else { - for(j = k+1; j < 8; j++) { - ibz_div(&d,&r,&(a[j][i]),&b); - if(ibz_cmp(&r,&zero) < 0){ - ibz_set(&r,1); - ibz_sub(&d,&d,&r); - } - ibz_set(&r,1); - ibz_neg(&d,&d); - ibz_vec_4_linear_combination(&(a[j]),&r,&(a[j]),&d ,&(a[k])); - } - } - if (i != 0) { - k = k - 1; - j = k; - } - i = i - 1; - } - for (j = 4; j < 8; j++) { - for(i = 0; i < 4; i++){ - ibz_copy(&((*hnf)[i][j-4]),&(a[j][i])); - } - } - - ibz_finalize(&b); - ibz_finalize(&d); - ibz_finalize(&u); - ibz_finalize(&v); - ibz_finalize(&r); - ibz_finalize(&coeff_1); - ibz_finalize(&coeff_2); - ibz_finalize(&zero); - ibz_vec_4_finalize(&c); - for (int h = 0; h < 8; h++) - { - ibz_vec_4_finalize(&(a[h])); - } -} - -void ibz_mat_4x4_hnf_mod(ibz_mat_4x4_t *hnf, const ibz_mat_4x4_t *mat, const ibz_t *mod){ - ibz_mat_4x8_t input; - ibz_mat_4x8_init(&input); - for(int i = 0; i <4; i++){ - for(int j = 0; j <4; j++){ - ibz_copy(&(input[i][j]),&((*mat)[i][j])); - ibz_set(&(input[i][j+4]),0); - } - ibz_copy(&(input[i][i+4]),mod); - } - ibz_mat_4x8_hnf_core(hnf,&input); - ibz_mat_4x8_finalize(&input); -} - - -// functions to verify lll -void ibq_vec_4_copy_ibz(ibq_t (*vec)[4], const ibz_t *coeff0, const ibz_t *coeff1,const ibz_t *coeff2,const ibz_t *coeff3){ - ibz_t one; - ibz_init(&one); - ibz_set(&one,1); - ibq_set(&((*vec)[0]),coeff0,&one); - ibq_set(&((*vec)[1]),coeff1,&one); - ibq_set(&((*vec)[2]),coeff2,&one); - ibq_set(&((*vec)[3]),coeff3,&one); - ibz_finalize(&one); -} - - -void quat_dim4_lll_bilinear(ibq_t *b, const ibq_t (*vec0)[4], const ibq_t (*vec1)[4], const ibz_t *q){ - ibq_t sum, prod,norm_q; - ibz_t one; - ibz_init(&one); - ibz_set(&one,1); - ibq_init(&sum); - ibq_init(&prod); - ibq_init(&norm_q); - ibq_set(&norm_q,q,&one); - - ibq_mul(&sum,&((*vec0)[0]),&((*vec1)[0])); - ibq_mul(&prod,&((*vec0)[1]),&((*vec1)[1])); - ibq_add(&sum,&sum,&prod); - ibq_mul(&prod,&((*vec0)[2]),&((*vec1)[2])); - ibq_mul(&prod,&prod,&norm_q); - ibq_add(&sum,&sum,&prod); - ibq_mul(&prod,&((*vec0)[3]),&((*vec1)[3])); - ibq_mul(&prod,&prod,&norm_q); - ibq_add(b,&sum,&prod); - - ibz_finalize(&one); - ibq_finalize(&sum); - ibq_finalize(&prod); - ibq_finalize(&norm_q); -} - -void quat_dim4_gram_schmidt_transposed_with_ibq(ibq_t (*orthogonalised_transposed)[4][4], const ibz_mat_4x4_t *mat, const ibz_t *q){ - ibq_t work[4][4]; - ibq_t vec[4]; - ibq_t norm, b, coeff, prod; - ibq_init(&norm); - ibq_init(&coeff); - ibq_init(&prod); - ibq_init(&b); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibq_init(&(work[i][j])); - } - ibq_init(&(vec[i])); - } - // transpose the input matrix to be able to work on vectors - for(int i = 0; i < 4; i++){ - ibq_vec_4_copy_ibz(&(work[i]),&((*mat)[0][i]),&((*mat)[1][i]),&((*mat)[2][i]),&((*mat)[3][i])); - } - - for(int i = 0; i < 4; i++){ - quat_dim4_lll_bilinear(&norm,&(work[i]),&(work[i]),q); - ibq_inv(&norm,&norm); - for(int j = i+1; j < 4; j++){ - ibq_vec_4_copy_ibz(&vec, &((*mat)[0][j]),&((*mat)[1][j]),&((*mat)[2][j]),&((*mat)[3][j])); - quat_dim4_lll_bilinear(&b,&(work[i]),&vec,q); - ibq_mul(&coeff,&norm,&b); - for(int k = 0; k < 4; k++){ - ibq_mul(&prod,&coeff,&(work[i][k])); - ibq_sub(&(work[j][k]),&(work[j][k]),&prod); - } - } - } - - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibq_copy(&((*orthogonalised_transposed)[i][j]),&(work[i][j])); - } - } - - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibq_finalize(&(work[i][j])); - } - ibq_finalize(&(vec[i])); - } - ibq_finalize(&norm); - ibq_finalize(&coeff); - ibq_finalize(&prod); - ibq_finalize(&b); -} - -int quat_dim4_lll_verify(const ibz_mat_4x4_t *mat, const ibq_t *coeff, const ibz_t *q){ - int res = 1; - ibq_t orthogonalised_transposed[4][4]; - ibq_t tmp_vec[4]; - ibq_t div,tmp,mu,two, norm, b; - ibz_t mu2_floored,num,denom; - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibq_init(&(orthogonalised_transposed[i][j])); - } - ibq_init(&(tmp_vec[i])); - } - ibq_init(&div); - ibq_init(&tmp); - ibq_init(&norm); - ibq_init(&b); - ibq_init(&mu); - ibq_init(&two); - ibz_init(&mu2_floored); - ibz_init(&num); - ibz_init(&denom); - ibz_set(&num,2); - ibz_set(&denom,1); - ibq_set(&two,&num,&denom); - - quat_dim4_gram_schmidt_transposed_with_ibq(&orthogonalised_transposed, mat,q); - // check small bilinear products/norms - for(int i = 0; i < 4; i++){ - for(int j = 0; j < i; j++){ - ibq_vec_4_copy_ibz(&tmp_vec, &((*mat)[0][i]),&((*mat)[1][i]),&((*mat)[2][i]),&((*mat)[3][i])); - quat_dim4_lll_bilinear(&b, &(orthogonalised_transposed[j]),&tmp_vec,q); - quat_dim4_lll_bilinear(&norm, &(orthogonalised_transposed[j]),&(orthogonalised_transposed[j]),q); - ibq_inv(&tmp,&norm); - ibq_mul(&mu,&b,&tmp); - //mu contains 2mu from now on - ibq_mul(&tmp,&mu,&two); - ibq_num(&num,&tmp); - ibq_denom(&denom,&tmp); - //assume rounding to 0 - ibz_div(&mu2_floored,&denom,&num,&denom); - // 2*mu floores is 0 or mu is exactly 1/2, so (2mu)^2 is exactly 1 - ibq_mul(&tmp,&tmp,&tmp); - res = res && (ibz_is_zero(&mu2_floored) || ibq_is_one(&tmp)); - } - } - for(int i = 1; i < 4; i++){ - ibq_vec_4_copy_ibz(&tmp_vec, &((*mat)[0][i]),&((*mat)[1][i]),&((*mat)[2][i]),&((*mat)[3][i])); - quat_dim4_lll_bilinear(&b, &(orthogonalised_transposed[i-1]),&tmp_vec,q); - quat_dim4_lll_bilinear(&norm, &(orthogonalised_transposed[i-1]),&(orthogonalised_transposed[i-1]),q); - ibq_inv(&tmp,&norm); - ibq_mul(&mu,&b,&tmp); - // tmp is mu^2 - ibq_mul(&tmp,&mu,&mu); - // mu is coeff-mu^2 - ibq_sub(&mu,coeff,&tmp); - quat_dim4_lll_bilinear(&tmp, &(orthogonalised_transposed[i]),&(orthogonalised_transposed[i]),q); - //get (3/4-mu^2)norm(i-1) - ibq_mul(&div,&norm,&mu); - res = res && (ibq_cmp(&tmp,&div) >= 0); - } - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibq_finalize(&(orthogonalised_transposed[i][j])); - } - ibq_finalize(&(tmp_vec[i])); - } - ibq_finalize(&div); - ibq_finalize(&norm); - ibq_finalize(&b); - ibq_finalize(&tmp); - ibq_finalize(&mu); - ibq_finalize(&two); - ibz_finalize(&mu2_floored); - ibz_finalize(&num); - ibz_finalize(&denom); - return(res); -} - -//4x4 inversion helper functions -void ibz_inv_dim4_make_coeff_pmp(ibz_t *coeff, const ibz_t *a1, const ibz_t *a2, const ibz_t *b1, const ibz_t *b2, const ibz_t *c1, const ibz_t *c2){ ibz_t prod, sum; ibz_init(&prod); ibz_init(&sum); - ibz_mul(&sum,a1,a2); - ibz_mul(&prod,b1,b2); - ibz_sub(&sum,&sum,&prod); - ibz_mul(&prod,c1,c2); - ibz_add(coeff,&sum,&prod); + ibz_mul(&sum, a1, a2); + ibz_mul(&prod, b1, b2); + ibz_sub(&sum, &sum, &prod); + ibz_mul(&prod, c1, c2); + ibz_add(coeff, &sum, &prod); ibz_finalize(&prod); ibz_finalize(&sum); } -void ibz_inv_dim4_make_coeff_mpm(ibz_t *coeff, const ibz_t *a1, const ibz_t *a2, const ibz_t *b1, const ibz_t *b2, const ibz_t *c1, const ibz_t *c2){ +void +ibz_inv_dim4_make_coeff_mpm(ibz_t *coeff, + const ibz_t *a1, + const ibz_t *a2, + const ibz_t *b1, + const ibz_t *b2, + const ibz_t *c1, + const ibz_t *c2) +{ ibz_t prod, sum; ibz_init(&prod); ibz_init(&sum); - ibz_mul(&sum,b1,b2); - ibz_mul(&prod,a1,a2); - ibz_sub(&sum,&sum,&prod); - ibz_mul(&prod,c1,c2); - ibz_sub(coeff,&sum,&prod); + ibz_mul(&sum, b1, b2); + ibz_mul(&prod, a1, a2); + ibz_sub(&sum, &sum, &prod); + ibz_mul(&prod, c1, c2); + ibz_sub(coeff, &sum, &prod); ibz_finalize(&prod); ibz_finalize(&sum); } -//Method from https://www.geometrictools.com/Documentation/LaplaceExpansionTheorem.pdf 3rd of May 2023, 16h15 CEST -int ibz_mat_4x4_inv_with_det_as_denom(ibz_mat_4x4_t *inv, ibz_t *det, const ibz_mat_4x4_t *mat){ - ibz_t prod,work_det; +// Method from https://www.geometrictools.com/Documentation/LaplaceExpansionTheorem.pdf 3rd of May +// 2023, 16h15 CEST +int +ibz_mat_4x4_inv_with_det_as_denom(ibz_mat_4x4_t *inv, ibz_t *det, const ibz_mat_4x4_t *mat) +{ + ibz_t prod, work_det; ibz_mat_4x4_t work; ibz_t s[6]; ibz_t c[6]; - for (int i = 0; i < 6; i++){ + for (int i = 0; i < 6; i++) { ibz_init(&(s[i])); ibz_init(&(c[i])); } @@ -536,307 +323,148 @@ int ibz_mat_4x4_inv_with_det_as_denom(ibz_mat_4x4_t *inv, ibz_t *det, const ibz_ ibz_init(&prod); ibz_init(&work_det); - //compute some 2x2 minors, store them in s and c - for (int i = 0; i < 3; i++){ - ibz_mat_2x2_det_from_ibz(&(s[i]),&((*mat)[0][0]),&((*mat)[0][i+1]),&((*mat)[1][0]),&((*mat)[1][i+1])); - ibz_mat_2x2_det_from_ibz(&(c[i]),&((*mat)[2][0]),&((*mat)[2][i+1]),&((*mat)[3][0]),&((*mat)[3][i+1])); + // compute some 2x2 minors, store them in s and c + for (int i = 0; i < 3; i++) { + ibz_mat_2x2_det_from_ibz(&(s[i]), &((*mat)[0][0]), &((*mat)[0][i + 1]), &((*mat)[1][0]), &((*mat)[1][i + 1])); + ibz_mat_2x2_det_from_ibz(&(c[i]), &((*mat)[2][0]), &((*mat)[2][i + 1]), &((*mat)[3][0]), &((*mat)[3][i + 1])); } - for (int i = 0; i < 2; i++){ - ibz_mat_2x2_det_from_ibz(&(s[3+i]),&((*mat)[0][1]),&((*mat)[0][2+i]),&((*mat)[1][1]),&((*mat)[1][2+i])); - ibz_mat_2x2_det_from_ibz(&(c[3+i]),&((*mat)[2][1]),&((*mat)[2][2+i]),&((*mat)[3][1]),&((*mat)[3][2+i])); + for (int i = 0; i < 2; i++) { + ibz_mat_2x2_det_from_ibz( + &(s[3 + i]), &((*mat)[0][1]), &((*mat)[0][2 + i]), &((*mat)[1][1]), &((*mat)[1][2 + i])); + ibz_mat_2x2_det_from_ibz( + &(c[3 + i]), &((*mat)[2][1]), &((*mat)[2][2 + i]), &((*mat)[3][1]), &((*mat)[3][2 + i])); } - ibz_mat_2x2_det_from_ibz(&(s[5]),&((*mat)[0][2]),&((*mat)[0][3]),&((*mat)[1][2]),&((*mat)[1][3])); - ibz_mat_2x2_det_from_ibz(&(c[5]),&((*mat)[2][2]),&((*mat)[2][3]),&((*mat)[3][2]),&((*mat)[3][3])); + ibz_mat_2x2_det_from_ibz(&(s[5]), &((*mat)[0][2]), &((*mat)[0][3]), &((*mat)[1][2]), &((*mat)[1][3])); + ibz_mat_2x2_det_from_ibz(&(c[5]), &((*mat)[2][2]), &((*mat)[2][3]), &((*mat)[3][2]), &((*mat)[3][3])); - //compute det - ibz_set(&work_det,0); - for (int i = 0; i < 6; i++){ - ibz_mul(&prod,&(s[i]),&(c[5-i])); - if ((i != 1) && (i != 4)){ - ibz_add(&work_det,&work_det,&prod); + // compute det + ibz_set(&work_det, 0); + for (int i = 0; i < 6; i++) { + ibz_mul(&prod, &(s[i]), &(c[5 - i])); + if ((i != 1) && (i != 4)) { + ibz_add(&work_det, &work_det, &prod); } else { - ibz_sub(&work_det,&work_det,&prod); + ibz_sub(&work_det, &work_det, &prod); } } - if (!ibz_is_zero(&work_det)){ - //compute transposed adjugate - for (int j = 0; j < 4; j++){ - for (int k = 0; k < 2; k++){ - if ((k + j + 1) % 2 == 1){ - ibz_inv_dim4_make_coeff_pmp(&(work[j][k]), &((*mat)[1-k][(j==0)]), &(c[6-j-(j==0)]), &((*mat)[1-k][2-(j>1)]), &(c[4-j-(j==1)]), &((*mat)[1-k][3-(j==3)]), &(c[3-j-(j==1)-(j==2)])); - } else { - ibz_inv_dim4_make_coeff_mpm(&(work[j][k]), &((*mat)[1-k][(j==0)]), &(c[6-j-(j==0)]), &((*mat)[1-k][2-(j>1)]), &(c[4-j-(j==1)]), &((*mat)[1-k][3-(j==3)]), &(c[3-j-(j==1)-(j==2)])); - } - } - for (int k = 2; k < 4; k++){ - if ((k + j + 1) % 2 == 1){ - ibz_inv_dim4_make_coeff_pmp(&(work[j][k]), &((*mat)[3-(k==3)][(j==0)]), &(s[6-j-(j==0)]),&((*mat)[3-(k==3)][2-(j>1)]), &(s[4-j-(j==1)]),&((*mat)[3-(k==3)][3-(j==3)]), &(s[3-j-(j==1)-(j==2)])); - } else { - ibz_inv_dim4_make_coeff_mpm(&(work[j][k]), &((*mat)[3-(k==3)][(j==0)]), &(s[6-j-(j==0)]),&((*mat)[3-(k==3)][2-(j>1)]), &(s[4-j-(j==1)]),&((*mat)[3-(k==3)][3-(j==3)]), &(s[3-j-(j==1)-(j==2)])); - } + // compute transposed adjugate + for (int j = 0; j < 4; j++) { + for (int k = 0; k < 2; k++) { + if ((k + j + 1) % 2 == 1) { + ibz_inv_dim4_make_coeff_pmp(&(work[j][k]), + &((*mat)[1 - k][(j == 0)]), + &(c[6 - j - (j == 0)]), + &((*mat)[1 - k][2 - (j > 1)]), + &(c[4 - j - (j == 1)]), + &((*mat)[1 - k][3 - (j == 3)]), + &(c[3 - j - (j == 1) - (j == 2)])); + } else { + ibz_inv_dim4_make_coeff_mpm(&(work[j][k]), + &((*mat)[1 - k][(j == 0)]), + &(c[6 - j - (j == 0)]), + &((*mat)[1 - k][2 - (j > 1)]), + &(c[4 - j - (j == 1)]), + &((*mat)[1 - k][3 - (j == 3)]), + &(c[3 - j - (j == 1) - (j == 2)])); + } + } + for (int k = 2; k < 4; k++) { + if ((k + j + 1) % 2 == 1) { + ibz_inv_dim4_make_coeff_pmp(&(work[j][k]), + &((*mat)[3 - (k == 3)][(j == 0)]), + &(s[6 - j - (j == 0)]), + &((*mat)[3 - (k == 3)][2 - (j > 1)]), + &(s[4 - j - (j == 1)]), + &((*mat)[3 - (k == 3)][3 - (j == 3)]), + &(s[3 - j - (j == 1) - (j == 2)])); + } else { + ibz_inv_dim4_make_coeff_mpm(&(work[j][k]), + &((*mat)[3 - (k == 3)][(j == 0)]), + &(s[6 - j - (j == 0)]), + &((*mat)[3 - (k == 3)][2 - (j > 1)]), + &(s[4 - j - (j == 1)]), + &((*mat)[3 - (k == 3)][3 - (j == 3)]), + &(s[3 - j - (j == 1) - (j == 2)])); } } - // put transposed adjugate in result - if(inv != NULL) - ibz_mat_4x4_copy(inv,&work); } - //output det in any case - if(det != NULL) - ibz_copy(det,&work_det); - for (int i = 0; i < 6; i++){ + if (inv != NULL) { + // put transposed adjugate in result, or 0 if no inverse + ibz_set(&prod, !ibz_is_zero(&work_det)); + ibz_mat_4x4_scalar_mul(inv, &prod, &work); + } + // output det + if (det != NULL) + ibz_copy(det, &work_det); + for (int i = 0; i < 6; i++) { ibz_finalize(&s[i]); ibz_finalize(&c[i]); } ibz_mat_4x4_finalize(&work); ibz_finalize(&work_det); ibz_finalize(&prod); - return(!ibz_is_zero(det)); -} - -// larger matrix modular kernel - -//Algorithm used is the one at number 2.3.1 in Henri Cohen's "A Course in Computational Algebraic Number Theory" (Springer Verlag, in series "Graduate texts in Mathematics") from 1993 -//most notations also are from there, except their r becoming kernel_dimension here and prod being used instaed of d as temporary variable. -int ibz_4x5_right_ker_mod_prime(ibz_vec_5_t *ker, const ibz_mat_4x5_t *mat, const ibz_t *p){ - int k, i, j, kernel_dim, columns, rows; - int c[4] ={0,0,0,0}; - int d[5]; - ibz_mat_4x5_t work_mat; - ibz_t prod, var; - ibz_init(&prod); - ibz_init(&var); - k = 0; - columns = 5; - rows = 4; - j = 0; - kernel_dim = 0; - ibz_mat_4x5_init(&work_mat); - for(int s = 0; s < rows; s++){ - for(int t = 0; t < columns; t++){ - ibz_mod(&(work_mat[s][t]),&((*mat)[s][t]),p); - } - } - while(k 0){ - ibz_mod(&((*ker)[s]),&(work_mat[d[s]-1][k]),p); - } - } - } - } - } - ibz_finalize(&prod); - ibz_finalize(&var); - ibz_mat_4x5_finalize(&work_mat); - return(kernel_dim==1); -} - -//same algo as ibz_4x5_right_ker_mod_prime, same notations, just the column number changes -int ibz_4x4_right_ker_mod_prime(ibz_vec_4_t *ker, const ibz_mat_4x4_t *mat, const ibz_t *p){ - int k, i, j, kernel_dim, columns, rows; - int c[4] ={0,0,0,0}; - int d[4]; - ibz_mat_4x4_t work_mat; - ibz_t prod, var; - ibz_init(&prod); - ibz_init(&var); - k = 0; - columns = 4; - rows = 4; - j = 0; - kernel_dim = 0; - ibz_mat_4x4_init(&work_mat); - for(int s = 0; s < rows; s++){ - for(int t = 0; t < columns; t++){ - ibz_mod(&(work_mat[s][t]),&((*mat)[s][t]),p); - } - } - while(k 0){ - ibz_mod(&((*ker)[s]),&(work_mat[d[s]-1][k]),p); - } - } - } - } - } - ibz_finalize(&prod); - ibz_finalize(&var); - ibz_mat_4x4_finalize(&work_mat); - return(kernel_dim==1); -} - -int ibz_4x4_right_ker_mod_power_of_2(ibz_vec_4_t *ker, const ibz_mat_4x4_t *mat, unsigned short exp) -{ - ibz_mat_4x4_t full_ker; - ibz_mat_4x5_t howell; - ibz_t pow2; - ibz_mat_4x4_init(&full_ker); - ibz_mat_4x5_init(&howell); - ibz_init(&pow2); - - // 2^exp - ibz_set(&pow2, 1); - ibz_mul_2exp(&pow2, &pow2, exp); - - ibz_mat_right_ker_mod(4, 4, full_ker, *mat, &pow2); - int zeros = ibz_mat_howell(4, 4, howell, NULL, full_ker, &pow2); - - int dim = 0; - for (int j = zeros; j < 5; j++) { - int primitive = 0; - for (int i = 0; i < 4; i++) - primitive |= !ibz_is_even(&howell[i][j]); - if (primitive) { - for (int i = 0; i < 4; i++) - ibz_copy(&(*ker)[i], &howell[i][j]); - dim++; - } - } - - ibz_mat_4x4_finalize(&full_ker); - ibz_mat_4x5_finalize(&howell); - ibz_finalize(&pow2); - - return dim == 1; + return (!ibz_is_zero(det)); } // matrix evaluation -void ibz_mat_4x4_eval(quat_alg_coord_t *res, const ibz_mat_4x4_t *mat, const quat_alg_coord_t *vec){ - quat_alg_coord_t sum; +void +ibz_mat_4x4_eval(ibz_vec_4_t *res, const ibz_mat_4x4_t *mat, const ibz_vec_4_t *vec) +{ + ibz_vec_4_t sum; ibz_t prod; ibz_init(&prod); - quat_alg_coord_init(&sum); - for (int i = 0; i <4; i++){ - ibz_set(&(sum[i]),0); - } - for (int i = 0; i <4; i++){ - for (int j = 0; j <4; j++){ + ibz_vec_4_init(&sum); + // assume initialization to 0 + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { ibz_mul(&prod, &(*mat)[i][j], &(*vec)[j]); - ibz_add(&(sum[i]),&(sum[i]), &prod); + ibz_add(&(sum[i]), &(sum[i]), &prod); } } - for (int i = 0; i <4; i++){ - ibz_copy(&(*res)[i],&(sum[i])); - } + ibz_vec_4_copy(res, &sum); ibz_finalize(&prod); - quat_alg_coord_finalize(&sum); + ibz_vec_4_finalize(&sum); +} + +void +ibz_mat_4x4_eval_t(ibz_vec_4_t *res, const ibz_vec_4_t *vec, const ibz_mat_4x4_t *mat) +{ + ibz_vec_4_t sum; + ibz_t prod; + ibz_init(&prod); + ibz_vec_4_init(&sum); + // assume initialization to 0 + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_mul(&prod, &(*mat)[j][i], &(*vec)[j]); + ibz_add(&(sum[i]), &(sum[i]), &prod); + } + } + ibz_vec_4_copy(res, &sum); + ibz_finalize(&prod); + ibz_vec_4_finalize(&sum); } // quadratic forms -void quat_qf_eval(ibz_t *res, const ibz_mat_4x4_t *qf, const quat_alg_coord_t *coord){ - quat_alg_coord_t sum; +void +quat_qf_eval(ibz_t *res, const ibz_mat_4x4_t *qf, const ibz_vec_4_t *coord) +{ + ibz_vec_4_t sum; ibz_t prod; ibz_init(&prod); - quat_alg_coord_init(&sum); + ibz_vec_4_init(&sum); ibz_mat_4x4_eval(&sum, qf, coord); - for (int i = 0; i <4; i++){ - ibz_mul(&prod,&(sum[i]), &(*coord)[i]); - if (i>0){ - ibz_add(&(sum[0]),&(sum[0]), &prod); + for (int i = 0; i < 4; i++) { + ibz_mul(&prod, &(sum[i]), &(*coord)[i]); + if (i > 0) { + ibz_add(&(sum[0]), &(sum[0]), &prod); } else { - ibz_copy(&sum[0],&prod); + ibz_copy(&sum[0], &prod); } } - ibz_copy(res,&sum[0]); + ibz_copy(res, &sum[0]); ibz_finalize(&prod); - quat_alg_coord_finalize(&sum); + ibz_vec_4_finalize(&sum); } - - -//Defined in headerfile -//static void ibz_content(ibz_t *content, const quat_alg_coord_t *v) { -// ibz_gcd(content, v[0], v[1]); -// ibz_gcd(content, v[2], content); -// ibz_gcd(content, v[3], content); -//} diff --git a/src/quaternion/ref/generic/finit.c b/src/quaternion/ref/generic/finit.c index 2754a9e..b3808ed 100644 --- a/src/quaternion/ref/generic/finit.c +++ b/src/quaternion/ref/generic/finit.c @@ -1,158 +1,122 @@ -#include +#include "internal.h" - -void quat_alg_init_set(quat_alg_t *alg, const ibz_t *p){ +void +quat_alg_init_set(quat_alg_t *alg, const ibz_t *p) +{ ibz_init(&(*alg).p); - ibz_mat_4x4_init(&(*alg).gram); ibz_copy(&(*alg).p, p); - ibz_set(&(*alg).gram[0][0], 1); - ibz_set(&(*alg).gram[1][1], 1); - ibz_copy(&(*alg).gram[2][2], p); - ibz_copy(&(*alg).gram[3][3], p); } -void quat_alg_finalize(quat_alg_t *alg){ +void +quat_alg_finalize(quat_alg_t *alg) +{ ibz_finalize(&(*alg).p); - ibz_mat_4x4_finalize(&(*alg).gram); } -void quat_alg_elem_init(quat_alg_elem_t *elem){ - quat_alg_coord_init(&(*elem).coord); +void +quat_alg_elem_init(quat_alg_elem_t *elem) +{ + ibz_vec_4_init(&(*elem).coord); ibz_init(&(*elem).denom); ibz_set(&(*elem).denom, 1); } -void quat_alg_elem_finalize(quat_alg_elem_t *elem){ - quat_alg_coord_finalize(&(*elem).coord); +void +quat_alg_elem_finalize(quat_alg_elem_t *elem) +{ + ibz_vec_4_finalize(&(*elem).coord); ibz_finalize(&(*elem).denom); } -void quat_alg_coord_init(quat_alg_coord_t *coord){ - for(int i = 0; i < 4; i++){ - ibz_init(&(*coord)[i]); +void +ibz_vec_2_init(ibz_vec_2_t *vec) +{ + ibz_init(&((*vec)[0])); + ibz_init(&((*vec)[1])); +} + +void +ibz_vec_2_finalize(ibz_vec_2_t *vec) +{ + ibz_finalize(&((*vec)[0])); + ibz_finalize(&((*vec)[1])); +} + +void +ibz_vec_4_init(ibz_vec_4_t *vec) +{ + for (int i = 0; i < 4; i++) { + ibz_init(&(*vec)[i]); } } -void quat_alg_coord_finalize(quat_alg_coord_t *coord){ - for(int i = 0; i < 4; i++){ - ibz_finalize(&(*coord)[i]); +void +ibz_vec_4_finalize(ibz_vec_4_t *vec) +{ + for (int i = 0; i < 4; i++) { + ibz_finalize(&(*vec)[i]); } } -void ibz_vec_4_init(ibz_vec_4_t *vec){ - for(int i = 0; i < 4; i++){ - ibz_init(&(*vec)[i]); - } -} -void ibz_vec_4_finalize(ibz_vec_4_t *vec){ - for(int i = 0; i < 4; i++){ - ibz_finalize(&(*vec)[i]); - } -} - -void ibz_vec_5_init(ibz_vec_5_t *vec){ - for(int i = 0; i < 5; i++){ - ibz_init(&(*vec)[i]); - } -} -void ibz_vec_5_finalize(ibz_vec_5_t *vec){ - for(int i = 0; i < 5; i++){ - ibz_finalize(&(*vec)[i]); - } -} - -void ibz_mat_2x2_init(ibz_mat_2x2_t *mat){ - for(int i = 0; i < 2; i++){ - for(int j = 0; j < 2; j++){ +void +ibz_mat_2x2_init(ibz_mat_2x2_t *mat) +{ + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { ibz_init(&(*mat)[i][j]); } } } -void ibz_mat_2x2_finalize(ibz_mat_2x2_t *mat){ - for(int i = 0; i < 2; i++){ - for(int j = 0; j < 2; j++){ +void +ibz_mat_2x2_finalize(ibz_mat_2x2_t *mat) +{ + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { ibz_finalize(&(*mat)[i][j]); } } } -void ibz_mat_4x4_init(ibz_mat_4x4_t *mat){ - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ +void +ibz_mat_4x4_init(ibz_mat_4x4_t *mat) +{ + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { ibz_init(&(*mat)[i][j]); } } } -void ibz_mat_4x4_finalize(ibz_mat_4x4_t *mat){ - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ +void +ibz_mat_4x4_finalize(ibz_mat_4x4_t *mat) +{ + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { ibz_finalize(&(*mat)[i][j]); } } } -void ibz_mat_4x5_init(ibz_mat_4x5_t *mat){ - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 5; j++){ - ibz_init(&(*mat)[i][j]); - } - } -} -void ibz_mat_4x5_finalize(ibz_mat_4x5_t *mat){ - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 5; j++){ - ibz_finalize(&(*mat)[i][j]); - } - } -} - -void ibz_mat_4x8_init(ibz_mat_4x8_t *mat){ - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 8; j++){ - ibz_init(&(*mat)[i][j]); - } - } -} -void ibz_mat_4x8_finalize(ibz_mat_4x8_t *mat){ - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 8; j++){ - ibz_finalize(&(*mat)[i][j]); - } - } -} - -void ibz_mat_init(int rows, int cols, ibz_t mat[rows][cols]) { - for (int i = 0; i < rows; i++) - for (int j = 0; j < cols; j++) - ibz_init(&mat[i][j]); -} - -void ibz_mat_finalize(int rows, int cols, ibz_t mat[rows][cols]) { - for (int i = 0; i < rows; i++) - for (int j = 0; j < cols; j++) - ibz_finalize(&mat[i][j]); -} - -void quat_lattice_init(quat_lattice_t *lat){ +void +quat_lattice_init(quat_lattice_t *lat) +{ ibz_mat_4x4_init(&(*lat).basis); ibz_init(&(*lat).denom); ibz_set(&(*lat).denom, 1); } -void quat_lattice_finalize(quat_lattice_t *lat){ +void +quat_lattice_finalize(quat_lattice_t *lat) +{ ibz_finalize(&(*lat).denom); ibz_mat_4x4_finalize(&(*lat).basis); } -void quat_order_init(quat_order_t *order){ - quat_lattice_init(order); -} -void quat_order_finalize(quat_order_t *order){ - quat_lattice_finalize(order); -} - -void quat_left_ideal_init(quat_left_ideal_t *lideal){ +void +quat_left_ideal_init(quat_left_ideal_t *lideal) +{ quat_lattice_init(&(*lideal).lattice); ibz_init(&(*lideal).norm); - (*lideal).parent_order=NULL; + (*lideal).parent_order = NULL; } -void quat_left_ideal_finalize(quat_left_ideal_t *lideal){ +void +quat_left_ideal_finalize(quat_left_ideal_t *lideal) +{ ibz_finalize(&(*lideal).norm); quat_lattice_finalize(&(*lideal).lattice); } diff --git a/src/quaternion/ref/generic/hnf/hnf.c b/src/quaternion/ref/generic/hnf/hnf.c new file mode 100644 index 0000000..1fb4c0f --- /dev/null +++ b/src/quaternion/ref/generic/hnf/hnf.c @@ -0,0 +1,210 @@ +#include "hnf_internal.h" +#include "internal.h" + +// HNF test function +int +ibz_mat_4x4_is_hnf(const ibz_mat_4x4_t *mat) +{ + int res = 1; + int found; + int ind = 0; + ibz_t zero; + ibz_init(&zero); + // upper triangular + for (int i = 0; i < 4; i++) { + // upper triangular + for (int j = 0; j < i; j++) { + res = res && ibz_is_zero(&((*mat)[i][j])); + } + // find first non 0 element of line + found = 0; + for (int j = i; j < 4; j++) { + if (found) { + // all values are positive, and first non-0 is the largest of that line + res = res && (ibz_cmp(&((*mat)[i][j]), &zero) >= 0); + res = res && (ibz_cmp(&((*mat)[i][ind]), &((*mat)[i][j])) > 0); + } else { + if (!ibz_is_zero(&((*mat)[i][j]))) { + found = 1; + ind = j; + // mustbe non-negative + res = res && (ibz_cmp(&((*mat)[i][j]), &zero) > 0); + } + } + } + } + // check that first nom-zero elements ndex per column is strictly increasing + int linestart = -1; + int i = 0; + for (int j = 0; j < 4; j++) { + while ((i < 4) && (ibz_is_zero(&((*mat)[i][j])))) { + i = i + 1; + } + if (i != 4) { + res = res && (linestart < i); + } + i = 0; + } + ibz_finalize(&zero); + return res; +} + +// Untested HNF helpers +// centered mod +void +ibz_vec_4_linear_combination_mod(ibz_vec_4_t *lc, + const ibz_t *coeff_a, + const ibz_vec_4_t *vec_a, + const ibz_t *coeff_b, + const ibz_vec_4_t *vec_b, + const ibz_t *mod) +{ + ibz_t prod, m; + ibz_vec_4_t sums; + ibz_vec_4_init(&sums); + ibz_init(&prod); + ibz_init(&m); + ibz_copy(&m, mod); + for (int i = 0; i < 4; i++) { + ibz_mul(&(sums[i]), coeff_a, &((*vec_a)[i])); + ibz_mul(&prod, coeff_b, &((*vec_b)[i])); + ibz_add(&(sums[i]), &(sums[i]), &prod); + ibz_centered_mod(&(sums[i]), &(sums[i]), &m); + } + for (int i = 0; i < 4; i++) { + ibz_copy(&((*lc)[i]), &(sums[i])); + } + ibz_finalize(&prod); + ibz_finalize(&m); + ibz_vec_4_finalize(&sums); +} + +void +ibz_vec_4_copy_mod(ibz_vec_4_t *res, const ibz_vec_4_t *vec, const ibz_t *mod) +{ + ibz_t m; + ibz_init(&m); + ibz_copy(&m, mod); + for (int i = 0; i < 4; i++) { + ibz_centered_mod(&((*res)[i]), &((*vec)[i]), &m); + } + ibz_finalize(&m); +} + +// no need to center this, and not 0 +void +ibz_vec_4_scalar_mul_mod(ibz_vec_4_t *prod, const ibz_t *scalar, const ibz_vec_4_t *vec, const ibz_t *mod) +{ + ibz_t m, s; + ibz_init(&m); + ibz_init(&s); + ibz_copy(&s, scalar); + ibz_copy(&m, mod); + for (int i = 0; i < 4; i++) { + ibz_mul(&((*prod)[i]), &((*vec)[i]), &s); + ibz_mod(&((*prod)[i]), &((*prod)[i]), &m); + } + ibz_finalize(&m); + ibz_finalize(&s); +} + +// Algorithm used is the one at number 2.4.8 in Henri Cohen's "A Course in Computational Algebraic +// Number Theory" (Springer Verlag, in series "Graduate texts in Mathematics") from 1993 +// assumes ibz_xgcd outputs u,v which are small in absolute value (as described in the +// book) +void +ibz_mat_4xn_hnf_mod_core(ibz_mat_4x4_t *hnf, int generator_number, const ibz_vec_4_t *generators, const ibz_t *mod) +{ + int i = 3; + assert(generator_number > 3); + int n = generator_number; + int j = n - 1; + int k = n - 1; + ibz_t b, u, v, d, q, m, coeff_1, coeff_2, r; + ibz_vec_4_t c; + ibz_vec_4_t a[generator_number]; + ibz_vec_4_t w[4]; + ibz_init(&b); + ibz_init(&d); + ibz_init(&u); + ibz_init(&v); + ibz_init(&r); + ibz_init(&m); + ibz_init(&q); + ibz_init(&coeff_1); + ibz_init(&coeff_2); + ibz_vec_4_init(&c); + for (int h = 0; h < n; h++) { + if (h < 4) + ibz_vec_4_init(&(w[h])); + ibz_vec_4_init(&(a[h])); + ibz_copy(&(a[h][0]), &(generators[h][0])); + ibz_copy(&(a[h][1]), &(generators[h][1])); + ibz_copy(&(a[h][2]), &(generators[h][2])); + ibz_copy(&(a[h][3]), &(generators[h][3])); + } + assert(ibz_cmp(mod, &ibz_const_zero) > 0); + ibz_copy(&m, mod); + while (i != -1) { + while (j != 0) { + j = j - 1; + if (!ibz_is_zero(&(a[j][i]))) { + // assumtion that ibz_xgcd outputs u,v which are small in absolute + // value is needed here also, needs u non 0, but v can be 0 if needed + ibz_xgcd_with_u_not_0(&d, &u, &v, &(a[k][i]), &(a[j][i])); + ibz_vec_4_linear_combination(&c, &u, &(a[k]), &v, &(a[j])); + ibz_div(&coeff_1, &r, &(a[k][i]), &d); + ibz_div(&coeff_2, &r, &(a[j][i]), &d); + ibz_neg(&coeff_2, &coeff_2); + ibz_vec_4_linear_combination_mod( + &(a[j]), &coeff_1, &(a[j]), &coeff_2, &(a[k]), &m); // do lin comb mod m + ibz_vec_4_copy_mod(&(a[k]), &c, &m); // mod m in copy + } + } + ibz_xgcd_with_u_not_0(&d, &u, &v, &(a[k][i]), &m); + ibz_vec_4_scalar_mul_mod(&(w[i]), &u, &(a[k]), &m); // mod m in scalar mult + if (ibz_is_zero(&(w[i][i]))) { + ibz_copy(&(w[i][i]), &m); + } + for (int h = i + 1; h < 4; h++) { + ibz_div_floor(&q, &r, &(w[h][i]), &(w[i][i])); + ibz_neg(&q, &q); + ibz_vec_4_linear_combination(&(w[h]), &ibz_const_one, &(w[h]), &q, &(w[i])); + } + ibz_div(&m, &r, &m, &d); + assert(ibz_is_zero(&r)); + if (i != 0) { + k = k - 1; + i = i - 1; + j = k; + if (ibz_is_zero(&(a[k][i]))) + ibz_copy(&(a[k][i]), &m); + + } else { + k = k - 1; + i = i - 1; + j = k; + } + } + for (j = 0; j < 4; j++) { + for (i = 0; i < 4; i++) { + ibz_copy(&((*hnf)[i][j]), &(w[j][i])); + } + } + + ibz_finalize(&b); + ibz_finalize(&d); + ibz_finalize(&u); + ibz_finalize(&v); + ibz_finalize(&r); + ibz_finalize(&q); + ibz_finalize(&coeff_1); + ibz_finalize(&coeff_2); + ibz_finalize(&m); + ibz_vec_4_finalize(&c); + for (int h = 0; h < n; h++) { + if (h < 4) + ibz_vec_4_finalize(&(w[h])); + ibz_vec_4_finalize(&(a[h])); + } +} \ No newline at end of file diff --git a/src/quaternion/ref/generic/hnf/hnf_internal.c b/src/quaternion/ref/generic/hnf/hnf_internal.c new file mode 100644 index 0000000..b2db5b5 --- /dev/null +++ b/src/quaternion/ref/generic/hnf/hnf_internal.c @@ -0,0 +1,182 @@ +#include "hnf_internal.h" +#include "internal.h" + +// Small helper for integers +void +ibz_mod_not_zero(ibz_t *res, const ibz_t *x, const ibz_t *mod) +{ + ibz_t m, t; + ibz_init(&m); + ibz_init(&t); + ibz_mod(&m, x, mod); + ibz_set(&t, ibz_is_zero(&m)); + ibz_mul(&t, &t, mod); + ibz_add(res, &m, &t); + ibz_finalize(&m); + ibz_finalize(&t); +} + +// centered and rather positive then negative +void +ibz_centered_mod(ibz_t *remainder, const ibz_t *a, const ibz_t *mod) +{ + assert(ibz_cmp(mod, &ibz_const_zero) > 0); + ibz_t tmp, d, t; + ibz_init(&tmp); + ibz_init(&d); + ibz_init(&t); + ibz_div_floor(&d, &tmp, mod, &ibz_const_two); + ibz_mod_not_zero(&tmp, a, mod); + ibz_set(&t, ibz_cmp(&tmp, &d) > 0); + ibz_mul(&t, &t, mod); + ibz_sub(remainder, &tmp, &t); + ibz_finalize(&tmp); + ibz_finalize(&d); + ibz_finalize(&t); +} + +// if c, res = x, else res = y +void +ibz_conditional_assign(ibz_t *res, const ibz_t *x, const ibz_t *y, int c) +{ + ibz_t s, t, r; + ibz_init(&r); + ibz_init(&s); + ibz_init(&t); + ibz_set(&s, c != 0); + ibz_sub(&t, &ibz_const_one, &s); + ibz_mul(&r, &s, x); + ibz_mul(res, &t, y); + ibz_add(res, &r, res); + ibz_finalize(&r); + ibz_finalize(&s); + ibz_finalize(&t); +} + +// mpz_gcdext specification specifies unique outputs used here +void +ibz_xgcd_with_u_not_0(ibz_t *d, ibz_t *u, ibz_t *v, const ibz_t *x, const ibz_t *y) +{ + if (ibz_is_zero(x) & ibz_is_zero(y)) { + ibz_set(d, 1); + ibz_set(u, 1); + ibz_set(v, 0); + return; + } + ibz_t q, r, x1, y1; + ibz_init(&q); + ibz_init(&r); + ibz_init(&x1); + ibz_init(&y1); + ibz_copy(&x1, x); + ibz_copy(&y1, y); + + // xgcd + ibz_xgcd(d, u, v, &x1, &y1); + + // make sure u!=0 (v can be 0 if needed) + // following GMP specification, u == 0 implies y|x + if (ibz_is_zero(u)) { + if (!ibz_is_zero(&x1)) { + if (ibz_is_zero(&y1)) { + ibz_set(&y1, 1); + } + ibz_div(&q, &r, &x1, &y1); + assert(ibz_is_zero(&r)); + ibz_sub(v, v, &q); + } + ibz_set(u, 1); + } + if (!ibz_is_zero(&x1)) { + // Make sure ux > 0 (and as small as possible) + assert(ibz_cmp(d, &ibz_const_zero) > 0); + ibz_mul(&r, &x1, &y1); + int neg = ibz_cmp(&r, &ibz_const_zero) < 0; + ibz_mul(&q, &x1, u); + while (ibz_cmp(&q, &ibz_const_zero) <= 0) { + ibz_div(&q, &r, &y1, d); + assert(ibz_is_zero(&r)); + if (neg) { + ibz_neg(&q, &q); + } + ibz_add(u, u, &q); + ibz_div(&q, &r, &x1, d); + assert(ibz_is_zero(&r)); + if (neg) { + ibz_neg(&q, &q); + } + ibz_sub(v, v, &q); + + ibz_mul(&q, &x1, u); + } + } + +#ifndef NDEBUG + int res = 0; + ibz_t sum, prod, test, cmp; + ibz_init(&sum); + ibz_init(&prod); + ibz_init(&cmp); + ibz_init(&test); + // sign correct + res = res | !(ibz_cmp(d, &ibz_const_zero) >= 0); + if (ibz_is_zero(&x1) && ibz_is_zero(&y1)) { + res = res | !(ibz_is_zero(v) && ibz_is_one(u) && ibz_is_one(d)); + } else { + if (!ibz_is_zero(&x1) && !ibz_is_zero(&y1)) { + // GCD divides x + ibz_div(&sum, &prod, &x1, d); + res = res | !ibz_is_zero(&prod); + // Small enough + ibz_mul(&prod, &x1, u); + res = res | !(ibz_cmp(&prod, &ibz_const_zero) > 0); + ibz_mul(&sum, &sum, &y1); + ibz_abs(&sum, &sum); + res = res | !(ibz_cmp(&prod, &sum) <= 0); + + // GCD divides y + ibz_div(&sum, &prod, &y1, d); + res = res | !ibz_is_zero(&prod); + // Small enough + ibz_mul(&prod, &y1, v); + res = res | !(ibz_cmp(&prod, &ibz_const_zero) <= 0); + ibz_mul(&sum, &sum, &x1); + ibz_abs(&sum, &sum); + res = res | !(ibz_cmp(&prod, &sum) < 0); + } else { + // GCD divides x + ibz_div(&sum, &prod, &x1, d); + res = res | !ibz_is_zero(&prod); + // GCD divides y + ibz_div(&sum, &prod, &y1, d); + res = res | !ibz_is_zero(&prod); + if (ibz_is_zero(&x1) && !ibz_is_zero(&y1)) { + ibz_abs(&prod, v); + res = res | !(ibz_is_one(&prod)); + res = res | !(ibz_is_one(u)); + } else { + ibz_abs(&prod, u); + res = res | !(ibz_is_one(&prod)); + res = res | !(ibz_is_zero(v)); + } + } + + // Bezout coeffs + ibz_mul(&sum, &x1, u); + ibz_mul(&prod, &y1, v); + ibz_add(&sum, &sum, &prod); + res = res | !(ibz_cmp(&sum, d) == 0); + } + assert(!res); + ibz_finalize(&sum); + ibz_finalize(&prod); + ibz_finalize(&cmp); + ibz_finalize(&test); + +#endif + + ibz_finalize(&x1); + ibz_finalize(&y1); + ibz_finalize(&q); + ibz_finalize(&r); +} diff --git a/src/quaternion/ref/generic/hnf/hnf_tests.c b/src/quaternion/ref/generic/hnf/hnf_tests.c new file mode 100644 index 0000000..b278151 --- /dev/null +++ b/src/quaternion/ref/generic/hnf/hnf_tests.c @@ -0,0 +1,1019 @@ + +#include "hnf_internal.h" +#include "quaternion_tests.h" +#include + +// test helper for xgcd_not_0 + +// round a/b to closest integer +void +ibz_rounded_div(ibz_t *q, const ibz_t *a, const ibz_t *b) +{ + ibz_t r, sign_q, abs_b; + ibz_init(&r); + ibz_init(&sign_q); + ibz_init(&abs_b); + + // assumed to round towards 0 + ibz_abs(&abs_b, b); + // q is of same sign as a*b (and 0 if a is 0) + ibz_mul(&sign_q, a, b); + ibz_div(q, &r, a, b); + ibz_abs(&r, &r); + ibz_add(&r, &r, &r); + ibz_set(&sign_q, (1 - 2 * (ibz_cmp(&sign_q, &ibz_const_zero) < 0)) * (ibz_cmp(&r, &abs_b) > 0)); + ibz_add(q, q, &sign_q); + ibz_finalize(&r); + ibz_finalize(&sign_q); + ibz_finalize(&abs_b); +} + +// old HNF version, used only in tests of the new HNF +// Algorithm used is the one at number 2.4.5 in Henri Cohen's "A Course in Computational Algebraic +// Number Theory" (Springer Verlag, in series "Graduate texts in Mathematics") from 1993 +// assumes ibz_xgcd outputs u,v which are small in absolute value (as described in the +// book) +void +ibz_mat_4xn_hnf_core(ibz_mat_4x4_t *hnf, int generator_number, const ibz_vec_4_t *generators) +{ + assert(generator_number > 3); + int n = generator_number; + int i = 3; + int j = n - 1; + int k = n - 1; + ibz_t b, u, v, d, zero, coeff_1, coeff_2, r; + ibz_vec_4_t c; + ibz_vec_4_t a[n]; + ibz_init(&b); + ibz_init(&d); + ibz_init(&u); + ibz_init(&v); + ibz_init(&r); + ibz_init(&coeff_1); + ibz_init(&coeff_2); + ibz_init(&zero); + ibz_set(&zero, 0); + ibz_vec_4_init(&c); + for (int h = 0; h < n; h++) { + ibz_vec_4_init(&(a[h])); + ibz_copy(&(a[h][0]), &(generators[h][0])); + ibz_copy(&(a[h][1]), &(generators[h][1])); + ibz_copy(&(a[h][2]), &(generators[h][2])); + ibz_copy(&(a[h][3]), &(generators[h][3])); + } + while (i != -1) { + while (j != 0) { + j = j - 1; + if (!ibz_is_zero(&(a[j][i]))) { + // assumtion that ibz_xgcd outputs u,v which are small in absolute + // value is needed here + ibz_xgcd(&d, &u, &v, &(a[k][i]), &(a[j][i])); + // also, needs u non 0, but v can be 0 if needed + if (ibz_is_zero(&u)) { + ibz_div(&v, &r, &(a[k][i]), &(a[j][i])); + ibz_set(&u, 1); + ibz_sub(&v, &u, &v); + } + ibz_vec_4_linear_combination(&c, &u, &(a[k]), &v, &(a[j])); + ibz_div(&coeff_1, &r, &(a[k][i]), &d); + ibz_div(&coeff_2, &r, &(a[j][i]), &d); + ibz_neg(&coeff_2, &coeff_2); + ibz_vec_4_linear_combination(&(a[j]), &coeff_1, &(a[j]), &coeff_2, &(a[k])); + ibz_vec_4_copy(&(a[k]), &c); + } + } + ibz_copy(&b, &(a[k][i])); + if (ibz_cmp(&b, &zero) < 0) { + ibz_vec_4_negate(&(a[k]), &(a[k])); + ibz_neg(&b, &b); + } + if (ibz_is_zero(&b)) { + k = k + 1; + } else { + for (j = k + 1; j < n; j++) { + ibz_div(&d, &r, &(a[j][i]), &b); + if (ibz_cmp(&r, &zero) < 0) { + ibz_set(&r, 1); + ibz_sub(&d, &d, &r); + } + ibz_set(&r, 1); + ibz_neg(&d, &d); + ibz_vec_4_linear_combination(&(a[j]), &r, &(a[j]), &d, &(a[k])); + } + } + if (i != 0) { + k = k - 1; + j = k; + } + i = i - 1; + } + for (j = 0; j < 4; j++) { + for (i = 0; i < 4; i++) { + ibz_copy(&((*hnf)[i][j]), &(a[n - 4 + j][i])); + } + } + + ibz_finalize(&b); + ibz_finalize(&d); + ibz_finalize(&u); + ibz_finalize(&v); + ibz_finalize(&r); + ibz_finalize(&coeff_1); + ibz_finalize(&coeff_2); + ibz_finalize(&zero); + ibz_vec_4_finalize(&c); + for (int h = 0; h < n; h++) { + ibz_vec_4_finalize(&(a[h])); + } +} + +// integer hnf helpers + +// void ibz_mod_not_zero(ibz_t *res, const ibz_t *x, const ibz_t *mod); +int +quat_test_ibz_mod_not_zero(void) +{ + int res = 0; + ibz_t m, a, r, d; + int s, x; + ibz_init(&m); + ibz_init(&a); + ibz_init(&r); + ibz_init(&d); + s = 5; + ibz_set(&m, s); + for (x = -20; x < 20; x++) { + ibz_set(&a, x); + ibz_mod_not_zero(&r, &a, &m); + ibz_sub(&d, &r, &a); + res = res || !ibz_divides(&d, &m); + res = res || !(ibz_cmp(&r, &m) <= 0); + res = res || !(ibz_cmp(&ibz_const_one, &r) <= 0); + ibz_mod_not_zero(&a, &a, &m); + res = res || !(ibz_cmp(&a, &r) == 0); + res = res || !(ibz_cmp(&r, &m) <= 0); + res = res || !(ibz_cmp(&ibz_const_one, &r) <= 0); + } + + if (res != 0) { + printf("Quaternion unit test ibz_mod_not_zero failed\n"); + } + ibz_finalize(&m); + ibz_finalize(&a); + ibz_finalize(&r); + ibz_finalize(&d); + return (res); +} + +// void ibz_centered_mod(ibz_t *remainder, const ibz_t *a, const ibz_t *mod); +int +quat_test_ibz_centered_mod(void) +{ + int res = 0; + ibz_t m, a, r, d, h; + int s, x; + ibz_init(&m); + ibz_init(&a); + ibz_init(&r); + ibz_init(&d); + ibz_init(&h); + s = 5; + ibz_set(&m, s); + for (x = -20; x < 20; x++) { + ibz_set(&a, x); + ibz_centered_mod(&r, &a, &m); + ibz_sub(&d, &r, &a); + res = res || !ibz_divides(&d, &m); + ibz_mul(&h, &r, &ibz_const_two); + res = res || !(ibz_cmp(&h, &m) <= 0); + ibz_neg(&h, &h); + res = res || !(ibz_cmp(&h, &m) < 0); + ibz_centered_mod(&a, &a, &m); + res = res || !(ibz_cmp(&a, &r) == 0); + } + + if (res != 0) { + printf("Quaternion unit test ibz_centered_mod failed\n"); + } + ibz_finalize(&m); + ibz_finalize(&a); + ibz_finalize(&r); + ibz_finalize(&d); + ibz_finalize(&h); + return (res); +} + +// void ibz_conditional_assign(ibz_t *res, const ibz_t *x, const ibz_t *y, int c); +int +quat_test_ibz_conditional_assign(void) +{ + int res = 0; + ibz_t x, y, r; + ibz_init(&x); + ibz_init(&y); + ibz_init(&r); + ibz_set(&x, 5); + ibz_set(&y, -9); + ibz_conditional_assign(&r, &x, &y, 1); + res = res || !(ibz_cmp(&x, &r) == 0); + ibz_conditional_assign(&r, &x, &y, 0); + res = res || !(ibz_cmp(&y, &r) == 0); + ibz_conditional_assign(&x, &x, &y, 0); + res = res || !(ibz_cmp(&y, &x) == 0); + ibz_set(&x, -5); + ibz_set(&y, -0); + ibz_conditional_assign(&y, &x, &y, 1); + res = res || !(ibz_cmp(&y, &x) == 0); + + if (res != 0) { + printf("Quaternion unit test ibz_conditional_assign failed\n"); + } + ibz_finalize(&x); + ibz_finalize(&y); + ibz_finalize(&r); + return (res); +} + +// This tests that our xgcd_with_u_non_0 respects all criteria required by our HNF +int +quat_test_helper_ibz_xgcd_with_u_not_0(const ibz_t *gcd, const ibz_t *u, const ibz_t *v, const ibz_t *x, const ibz_t *y) +{ + int res = 0; + ibz_t sum, prod, test, cmp; + ibz_init(&sum); + ibz_init(&prod); + ibz_init(&cmp); + ibz_init(&test); + // sign correct + res = res | !(ibz_cmp(gcd, &ibz_const_zero) >= 0); + if (ibz_is_zero(x) && ibz_is_zero(y)) { + res = res | !(ibz_is_zero(v) && ibz_is_one(u) && ibz_is_one(gcd)); + } else { + if (!ibz_is_zero(x) && !ibz_is_zero(y)) { + // GCD divides x + ibz_div(&sum, &prod, x, gcd); + res = res | !ibz_is_zero(&prod); + // Small enough + ibz_mul(&prod, x, u); + res = res | !(ibz_cmp(&prod, &ibz_const_zero) > 0); + ibz_mul(&sum, &sum, y); + ibz_abs(&sum, &sum); + res = res | !(ibz_cmp(&prod, &sum) <= 0); + + // GCD divides y + ibz_div(&sum, &prod, y, gcd); + res = res | !ibz_is_zero(&prod); + // Small enough + ibz_mul(&prod, y, v); + res = res | !(ibz_cmp(&prod, &ibz_const_zero) <= 0); + ibz_mul(&sum, &sum, x); + ibz_abs(&sum, &sum); + res = res | !(ibz_cmp(&prod, &sum) < 0); + } else { + // GCD divides x + ibz_div(&sum, &prod, x, gcd); + res = res | !ibz_is_zero(&prod); + // GCD divides y + ibz_div(&sum, &prod, y, gcd); + res = res | !ibz_is_zero(&prod); + if (ibz_is_zero(x) && !ibz_is_zero(y)) { + ibz_abs(&prod, v); + res = res | !(ibz_is_one(&prod)); + res = res | !(ibz_is_one(u)); + } else { + ibz_abs(&prod, u); + res = res | !(ibz_is_one(&prod)); + res = res | !(ibz_is_zero(v)); + } + } + // Bezout coeffs + ibz_mul(&sum, x, u); + ibz_mul(&prod, y, v); + ibz_add(&sum, &sum, &prod); + res = res | !(ibz_cmp(&sum, gcd) == 0); + } + assert(!res); + ibz_finalize(&sum); + ibz_finalize(&prod); + ibz_finalize(&cmp); + ibz_finalize(&test); + + return (res); +} +// void ibz_xgcd_with_u_not_0(ibz_t *d, ibz_t *u, ibz_t *v, const ibz_t *x, const ibz_t +// *y); +int +quat_test_ibz_xgcd_with_u_not_0(void) +{ + int res = 0; + ibz_t x, y, u, v, d, s, p; + ibz_init(&x); + ibz_init(&y); + ibz_init(&u); + ibz_init(&v); + ibz_init(&d); + ibz_init(&s); + ibz_init(&p); + + ibz_set(&x, 75); + ibz_set(&y, 50); + ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | quat_test_helper_ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | (ibz_cmp_int32(&d, 25) != 0); + + ibz_set(&x, -75); + ibz_set(&y, 50); + ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | quat_test_helper_ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | (ibz_cmp_int32(&d, 25) != 0); + + ibz_set(&x, -75); + ibz_set(&y, -50); + ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | quat_test_helper_ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | (ibz_cmp_int32(&d, 25) != 0); + + ibz_set(&x, 75); + ibz_set(&y, -50); + ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | quat_test_helper_ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | (ibz_cmp_int32(&d, 25) != 0); + + ibz_set(&x, 50); + ibz_set(&y, 50); + ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | quat_test_helper_ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | (ibz_cmp_int32(&d, 50) != 0); + + ibz_set(&x, 0); + ibz_set(&y, -50); + ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | quat_test_helper_ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | (ibz_cmp_int32(&d, 50) != 0); + + ibz_set(&x, -50); + ibz_set(&y, 0); + ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | quat_test_helper_ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | (ibz_cmp_int32(&d, 50) != 0); + + ibz_set(&x, 0); + ibz_set(&y, 0); + ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | quat_test_helper_ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + + for (int i = -20; i <= 20; i++) { + for (int j = -20; j <= 20; j++) { + ibz_set(&x, i); + ibz_set(&y, j); + ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | quat_test_helper_ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + } + } + + if (res != 0) { + printf("Quaternion unit test ibz_xgcd_with_u_not_0 failed\n"); + } + ibz_finalize(&x); + ibz_finalize(&y); + ibz_finalize(&u); + ibz_finalize(&v); + ibz_finalize(&d); + ibz_finalize(&s); + ibz_finalize(&p); + return (res); +} + +// void ibz_rounded_div(ibz_t *q, const ibz_t *a, const ibz_t *b); +int +quat_test_ibz_rounded_div(void) +{ + int res = 0; + ibz_t q, a, b; + ibz_init(&a); + ibz_init(&b); + ibz_init(&q); + + // basic tests + ibz_set(&a, 15); + ibz_set(&b, 3); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 5) == 0); + ibz_set(&a, 16); + ibz_set(&b, 3); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 5) == 0); + ibz_set(&a, 17); + ibz_set(&b, 3); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 6) == 0); + ibz_set(&a, 37); + ibz_set(&b, 5); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 7) == 0); + // test sign combination + ibz_set(&a, 149); + ibz_set(&b, 12); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 12) == 0); + ibz_set(&a, 149); + ibz_set(&b, -12); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, -12) == 0); + ibz_set(&a, -149); + ibz_set(&b, -12); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 12) == 0); + ibz_set(&a, -149); + ibz_set(&b, 12); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, -12) == 0); + ibz_set(&a, 151); + ibz_set(&b, 12); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 13) == 0); + ibz_set(&a, -151); + ibz_set(&b, -12); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 13) == 0); + ibz_set(&a, 151); + ibz_set(&b, -12); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, -13) == 0); + ibz_set(&a, -151); + ibz_set(&b, 12); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, -13) == 0); + // divisibles with sign + ibz_set(&a, 144); + ibz_set(&b, 12); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 12) == 0); + ibz_set(&a, -144); + ibz_set(&b, -12); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 12) == 0); + ibz_set(&a, 144); + ibz_set(&b, -12); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, -12) == 0); + ibz_set(&a, -144); + ibz_set(&b, 12); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, -12) == 0); + // tests close to 0 + ibz_set(&a, -12); + ibz_set(&b, -25); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 0) == 0); + ibz_set(&a, 12); + ibz_set(&b, 25); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 0) == 0); + ibz_set(&a, -12); + ibz_set(&b, 25); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 0) == 0); + ibz_set(&a, 12); + ibz_set(&b, -25); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 0) == 0); + ibz_set(&a, -12); + ibz_set(&b, -23); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 1) == 0); + ibz_set(&a, 12); + ibz_set(&b, 23); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 1) == 0); + ibz_set(&a, -12); + ibz_set(&b, 23); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, -1) == 0); + ibz_set(&a, 12); + ibz_set(&b, -23); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, -1) == 0); + // test output equal input + ibz_set(&a, -151); + ibz_set(&b, 12); + ibz_rounded_div(&a, &a, &b); + res = res || !(ibz_cmp_int32(&a, -13) == 0); + ibz_set(&a, -151); + ibz_set(&b, 12); + ibz_rounded_div(&b, &a, &b); + res = res || !(ibz_cmp_int32(&b, -13) == 0); + // test for cmp not returning 1 or -1 or 0 + ibz_set(&a, 2046874253); + ibz_set(&b, 412308266); + ibz_rounded_div(&b, &a, &b); + res = res || !(ibz_cmp_int32(&b, 5) == 0); + + if (res != 0) { + printf("Quaternion unit test ibz_rounded_div failed\n"); + } + ibz_finalize(&a); + ibz_finalize(&b); + ibz_finalize(&q); + return (res); +} + +// int ibz_mat_4x4_is_hnf(const ibz_mat_4x4_t *mat); +int +quat_test_ibz_mat_4x4_is_hnf(void) +{ + int res = 0; + ibz_mat_4x4_t mat; + ibz_mat_4x4_init(&mat); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(mat[i][j]), 0); + } + } + res = res || (!ibz_mat_4x4_is_hnf(&mat)); + ibz_set(&(mat[0][0]), 7); + ibz_set(&(mat[0][1]), 6); + ibz_set(&(mat[0][2]), 5); + ibz_set(&(mat[0][3]), 4); + ibz_set(&(mat[1][1]), 6); + ibz_set(&(mat[1][2]), 5); + ibz_set(&(mat[1][3]), 4); + ibz_set(&(mat[2][2]), 5); + ibz_set(&(mat[2][3]), 4); + ibz_set(&(mat[3][3]), 4); + res = res || (!ibz_mat_4x4_is_hnf(&mat)); + + ibz_set(&(mat[0][0]), 7); + ibz_set(&(mat[0][1]), 0); + ibz_set(&(mat[0][2]), 5); + ibz_set(&(mat[0][3]), 4); + ibz_set(&(mat[1][1]), 0); + ibz_set(&(mat[1][2]), 0); + ibz_set(&(mat[1][3]), 0); + ibz_set(&(mat[2][2]), 5); + ibz_set(&(mat[2][3]), 4); + ibz_set(&(mat[3][3]), 4); + res = res || (!ibz_mat_4x4_is_hnf(&mat)); + + // negative tests + ibz_set(&(mat[0][0]), 7); + ibz_set(&(mat[0][1]), 0); + ibz_set(&(mat[0][2]), 5); + ibz_set(&(mat[0][3]), 4); + ibz_set(&(mat[1][1]), 1); + ibz_set(&(mat[1][2]), 5); + ibz_set(&(mat[1][3]), 9); + ibz_set(&(mat[2][2]), 5); + ibz_set(&(mat[2][3]), 4); + ibz_set(&(mat[3][3]), 4); + res = res || (ibz_mat_4x4_is_hnf(&mat)); + + ibz_set(&(mat[0][0]), 7); + ibz_set(&(mat[0][1]), 0); + ibz_set(&(mat[0][2]), 5); + ibz_set(&(mat[0][3]), 4); + ibz_set(&(mat[1][1]), 1); + ibz_set(&(mat[1][2]), -5); + ibz_set(&(mat[1][3]), 1); + ibz_set(&(mat[2][2]), 5); + ibz_set(&(mat[2][3]), 4); + ibz_set(&(mat[3][3]), 4); + res = res || (ibz_mat_4x4_is_hnf(&mat)); + + ibz_set(&(mat[0][0]), 7); + ibz_set(&(mat[0][1]), 0); + ibz_set(&(mat[0][2]), 5); + ibz_set(&(mat[0][3]), 4); + ibz_set(&(mat[1][0]), 2); + ibz_set(&(mat[1][1]), 3); + ibz_set(&(mat[1][2]), 1); + ibz_set(&(mat[1][3]), 1); + ibz_set(&(mat[2][2]), 5); + ibz_set(&(mat[2][3]), 4); + ibz_set(&(mat[3][3]), 4); + res = res || (ibz_mat_4x4_is_hnf(&mat)); + + ibz_set(&(mat[0][0]), 7); + ibz_set(&(mat[0][1]), 0); + ibz_set(&(mat[0][2]), 5); + ibz_set(&(mat[0][3]), 4); + ibz_set(&(mat[1][0]), 2); + ibz_set(&(mat[1][1]), 3); + ibz_set(&(mat[1][2]), -1); + ibz_set(&(mat[1][3]), 7); + ibz_set(&(mat[2][2]), 0); + ibz_set(&(mat[2][3]), 0); + ibz_set(&(mat[3][3]), 4); + res = res || (ibz_mat_4x4_is_hnf(&mat)); + + if (res != 0) { + printf("Quaternion unit test hnf_ibz_mat_4x4_is_hnf failed\n"); + } + ibz_mat_4x4_finalize(&mat); + return (res); +} + +// void ibz_mat_4xn_hnf_core(ibz_mat_4x4_t *hnf, int generator_number, const +// ibz_vec_4_t +// (*generators)[generator_number]); +int +quat_test_ibz_mat_4xn_hnf_core(void) +{ + int res = 0; + ibz_vec_4_t generators[8]; + ibz_mat_4x4_t hnf, cmp; + for (int i = 0; i < 8; i++) + ibz_vec_4_init(&(generators[i])); + ibz_mat_4x4_init(&hnf); + ibz_mat_4x4_init(&cmp); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 8; j++) { + ibz_set(&(generators[j][i]), 0); + } + } + ibz_mat_4xn_hnf_core(&hnf, 8, generators); + res = res || (!ibz_mat_4x4_is_hnf(&hnf)); + // also should test that they generate the same lattice. Since HNF is unique, copute the HNF for + // test vectors might be ok + + ibz_set(&(generators[2][0]), 2); + ibz_set(&(generators[3][1]), 3); + ibz_set(&(generators[4][0]), 4); + ibz_set(&(generators[2][3]), 5); + ibz_set(&(generators[7][3]), 6); + ibz_set(&(generators[7][1]), 7); + ibz_set(&(generators[3][1]), 8); + ibz_set(&(generators[1][1]), 9); + ibz_set(&(generators[6][0]), 10); + ibz_set(&(generators[5][0]), 11); + ibz_set(&(generators[0][0]), 12); + ibz_mat_4xn_hnf_core(&hnf, 8, generators); + res = res || (!ibz_mat_4x4_is_hnf(&hnf)); + + ibz_set(&(generators[5][2]), 1); + ibz_set(&(generators[0][2]), 2); + ibz_mat_4xn_hnf_core(&hnf, 8, generators); + res = res || (!ibz_mat_4x4_is_hnf(&hnf)); + + // test equality of result to a known hnf + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 8; j++) { + ibz_set(&(generators[j][i]), 0); + } + } + ibz_set(&(generators[0][0]), 4); + ibz_set(&(generators[2][0]), 3); + ibz_set(&(generators[4][0]), 1); + ibz_set(&(generators[7][0]), -1); + ibz_set(&(generators[1][1]), 5); + ibz_set(&(generators[5][1]), -2); + ibz_set(&(generators[2][2]), 3); + ibz_set(&(generators[6][2]), 1); + ibz_set(&(generators[5][2]), 1); + ibz_set(&(generators[3][3]), 7); + ibz_set(&(generators[7][3]), -3); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(cmp[i][j]), 0); + } + ibz_set(&(cmp[i][i]), 1); + } + ibz_mat_4xn_hnf_core(&hnf, 8, generators); + res = res || (!ibz_mat_4x4_equal(&cmp, &hnf)); + + // test known hnf encountered in + // https://github.com/SQISign/sqisign-nist/issues/38#issuecomment-1554585079 + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 8; j++) { + ibz_set(&(generators[j][i]), 0); + } + } + ibz_set(&(generators[4][0]), 438); + ibz_set(&(generators[4][1]), 400); + ibz_set(&(generators[4][2]), 156); + ibz_set(&(generators[4][3]), -2); + ibz_set(&(generators[5][0]), -400); + ibz_set(&(generators[5][1]), 438); + ibz_set(&(generators[5][2]), 2); + ibz_set(&(generators[5][3]), 156); + ibz_set(&(generators[6][0]), -28826); + ibz_set(&(generators[6][1]), -148); + ibz_set(&(generators[6][2]), 220); + ibz_set(&(generators[6][3]), -122); + ibz_set(&(generators[7][0]), 586); + ibz_set(&(generators[7][1]), -28426); + ibz_set(&(generators[7][2]), 278); + ibz_set(&(generators[7][3]), 218); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(cmp[i][j]), 0); + } + } + ibz_set(&(cmp[0][0]), 2321156); + ibz_set(&(cmp[1][1]), 2321156); + ibz_set(&(cmp[0][2]), 620252); + ibz_set(&(cmp[1][2]), 365058); + ibz_set(&(cmp[2][2]), 2); + ibz_set(&(cmp[0][3]), 1956098); + ibz_set(&(cmp[1][3]), 620252); + ibz_set(&(cmp[3][3]), 2); + ibz_mat_4xn_hnf_core(&hnf, 8, generators); + res = res || (!ibz_mat_4x4_equal(&cmp, &hnf)); + + if (res != 0) { + printf("Quaternion unit test dim4_ibz_mat_4xn_hnf_core failed\n"); + } + for (int i = 0; i < 8; i++) + ibz_vec_4_finalize(&(generators[i])); + ibz_mat_4x4_finalize(&hnf); + ibz_mat_4x4_finalize(&cmp); + return (res); +} + +// void ibz_mat_4xn_hnf_mod_core(ibz_mat_4x4_t *hnf, int generator_number, const ibz_vec_4_t +// (*generators)[generator_number], const ibz_t *mod); +int +quat_test_ibz_mat_4xn_hnf_mod_core(void) +{ + int res = 0; + ibz_t det; + ibz_vec_4_t generators[8]; + ibz_mat_4x4_t hnf, cmp; + ibz_init(&det); + ibz_mat_4x4_init(&hnf); + ibz_mat_4x4_init(&cmp); + for (int i = 0; i < 8; i++) + ibz_vec_4_init(&(generators[i])); + + ibz_set(&(generators[2][0]), 2); + ibz_set(&(generators[3][1]), 3); + ibz_set(&(generators[4][0]), 4); + ibz_set(&(generators[2][3]), 5); + ibz_set(&(generators[7][3]), 6); + ibz_set(&(generators[7][1]), 7); + ibz_set(&(generators[3][1]), 8); + ibz_set(&(generators[1][1]), 9); + ibz_set(&(generators[6][0]), 10); + ibz_set(&(generators[5][0]), 11); + ibz_set(&(generators[0][0]), 12); + ibz_set(&(generators[5][2]), 1); + ibz_set(&(generators[0][2]), 2); + ibz_set(&det, 4); + ibz_mat_4xn_hnf_mod_core(&hnf, 8, generators, &det); + res = res || (!ibz_mat_4x4_is_hnf(&hnf)); + + // test equality of result to a known hnf + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 8; j++) { + ibz_set(&(generators[j][i]), 0); + } + } + ibz_set(&(generators[0][0]), 4); + ibz_set(&(generators[2][0]), 3); + ibz_set(&(generators[4][0]), 1); + ibz_set(&(generators[7][0]), -1); + ibz_set(&(generators[1][1]), 5); + ibz_set(&(generators[5][1]), -2); + ibz_set(&(generators[2][2]), 3); + ibz_set(&(generators[6][2]), 1); + ibz_set(&(generators[5][2]), 1); + ibz_set(&(generators[3][3]), 7); + ibz_set(&(generators[7][3]), -3); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(cmp[i][j]), 0); + } + ibz_set(&(cmp[i][i]), 1); + } + ibz_set(&det, 1); + ibz_mat_4xn_hnf_mod_core(&hnf, 8, generators, &det); + res = res || (!ibz_mat_4x4_equal(&cmp, &hnf)); + + // test known hnf encountered in + // https://github.com/SQISign/sqisign-nist/issues/38#issuecomment-1554585079 + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 8; j++) { + ibz_set(&(generators[j][i]), 0); + } + } + ibz_set(&(generators[4][0]), 438); + ibz_set(&(generators[4][1]), 400); + ibz_set(&(generators[4][2]), 156); + ibz_set(&(generators[4][3]), -2); + ibz_set(&(generators[5][0]), -400); + ibz_set(&(generators[5][1]), 438); + ibz_set(&(generators[5][2]), 2); + ibz_set(&(generators[5][3]), 156); + ibz_set(&(generators[6][0]), -28826); + ibz_set(&(generators[6][1]), -148); + ibz_set(&(generators[6][2]), 220); + ibz_set(&(generators[6][3]), -122); + ibz_set(&(generators[7][0]), 586); + ibz_set(&(generators[7][1]), -28426); + ibz_set(&(generators[7][2]), 278); + ibz_set(&(generators[7][3]), 218); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(cmp[i][j]), 0); + } + } + ibz_set(&(cmp[0][0]), 2321156); + ibz_set(&(cmp[1][1]), 2321156); + ibz_set(&(cmp[0][2]), 620252); + ibz_set(&(cmp[1][2]), 365058); + ibz_set(&(cmp[2][2]), 2); + ibz_set(&(cmp[0][3]), 1956098); + ibz_set(&(cmp[1][3]), 620252); + ibz_set(&(cmp[3][3]), 2); + ibz_set_from_str(&det, "21551060705344", 10); + ibz_mat_4xn_hnf_mod_core(&hnf, 8, generators, &det); + res = res || (!ibz_mat_4x4_equal(&cmp, &hnf)); + + // use non-modular hnf version to test + ibz_set(&(generators[4][0]), 438); + ibz_set(&(generators[4][0]), 438); + ibz_set(&(generators[4][1]), 400); + ibz_set(&(generators[4][2]), 156); + ibz_set(&(generators[5][3]), -2); + ibz_set(&(generators[5][0]), -40); + ibz_set(&(generators[5][1]), 438); + ibz_set(&(generators[5][2]), 20); + ibz_set(&(generators[5][3]), 156); + ibz_set(&(generators[6][0]), -28826); + ibz_set(&(generators[6][1]), -148); + ibz_set(&(generators[6][2]), 220); + ibz_set(&(generators[6][3]), -122); + ibz_set(&(generators[7][0]), 586); + ibz_set(&(generators[7][1]), -28426); + ibz_set(&(generators[7][2]), 278); + ibz_set(&(generators[7][3]), 218); + ibz_mat_4xn_hnf_core(&cmp, 8, generators); + ibz_mat_4x4_inv_with_det_as_denom(NULL, &det, &cmp); + ibz_abs(&det, &det); + ibz_mat_4xn_hnf_mod_core(&hnf, 8, generators, &det); + res = res || (!ibz_mat_4x4_equal(&cmp, &hnf)); + + if (res != 0) { + printf("Quaternion unit test dim4_ibz_mat_4x8_hnf_mod_core failed\n"); + } + ibz_mat_4x4_finalize(&hnf); + ibz_mat_4x4_finalize(&cmp); + ibz_finalize(&det); + for (int i = 0; i < 8; i++) + ibz_vec_4_finalize(&(generators[i])); + return (res); +} + +// void ibz_mat_4xn_hnf_core(ibz_mat_4x4_t *hnf, int generator_number, const +// ibz_vec_4_t +// (*generators)[generator_number]); +int +quat_test_ibz_mat_4xn_hnf_core_randomized(void) +{ + // only partial test, since lattice equality cannot be tested without hnf, so only one inclusion + // is checked + int res = 0; + ibz_vec_4_t generators[8]; + quat_alg_elem_t vec; + quat_lattice_t lat; + ibz_mat_4x4_t hnf, cmp; + for (int i = 0; i < 8; i++) + ibz_vec_4_init(&(generators[i])); + quat_lattice_init(&lat); + quat_alg_elem_init(&vec); + ibz_mat_4x4_init(&hnf); + ibz_mat_4x4_init(&cmp); + int32_t rand[8][4]; + int det_non_0; + + for (int iter = 0; iter < 10; iter++) { + int randret = randombytes((unsigned char *)rand, sizeof(rand)); + if (randret != 0) + return 1; + + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 8; j++) { + ibz_set(&(generators[j][i]), rand[j][i]); + } + } + ibz_mat_4xn_hnf_core(&hnf, 8, generators); + res = res || (!ibz_mat_4x4_is_hnf(&hnf)); + // also should test that they generate the same lattice. However, can only check one + // inclusion efficiently (and this only if full rank), so do so + det_non_0 = 1; + for (int i = 0; i < 4; i++) { + det_non_0 = det_non_0 && ibz_is_zero(&(hnf[i][i])); + } + if (det_non_0) { + ibz_mat_4x4_copy(&(lat.basis), &hnf); + ibz_set(&(lat.denom), 1); + ibz_set(&(vec.denom), 1); + for (int i = 0; i < 8; i++) { + ibz_vec_4_copy(&(vec.coord), &(generators[i])); + res = res || !quat_lattice_contains(NULL, &lat, &vec); + } + } + } + + if (res != 0) { + printf("Quaternion unit test with randomization for ibz_mat_4xn_hnf_core " + "failed\n"); + } + quat_lattice_finalize(&lat); + quat_alg_elem_finalize(&vec); + ibz_mat_4x4_finalize(&hnf); + ibz_mat_4x4_finalize(&cmp); + for (int i = 0; i < 8; i++) + ibz_vec_4_finalize(&(generators[i])); + return (res); +} + +// void ibz_mat_4xn_hnf_mod_core(ibz_mat_4x4_t *hnf, int generator_number, const ibz_vec_4_t +// (*generators)[generator_number],const ibz_t *mod); +int +quat_test_ibz_mat_4xn_hnf_mod_core_randomized(void) +{ + // only partial test, since lattice equality cannot be tested without hnf, so only one inclusion + // is checked + int res = 0; + int32_t rand[8][4]; + int32_t rand_m; + int randret; + quat_alg_elem_t vec; + quat_lattice_t lat; + ibz_vec_4_t generators[8]; + ibz_t det, m; + ibz_mat_4x4_t hnf, cmp; + ibz_init(&det); + ibz_init(&m); + quat_lattice_init(&lat); + quat_alg_elem_init(&vec); + ibz_mat_4x4_init(&hnf); + ibz_mat_4x4_init(&cmp); + for (int i = 0; i < 8; i++) + ibz_vec_4_init(&(generators[i])); + + for (int iter = 0; iter < 10; iter++) { + randret = randombytes((unsigned char *)rand, sizeof(rand)); + if (randret != 0) { + res = 1; + goto end; + } + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 8; j++) { + ibz_set(&(generators[j][i]), rand[j][i]); + } + } + rand_m = 0; + while (rand_m <= 0) { + randret = randombytes((unsigned char *)&rand_m, sizeof(int32_t)); + if (randret != 0) { + res = 1; + goto end; + } + } + ibz_set(&m, rand_m); + + ibz_mat_4xn_hnf_core(&cmp, 8, generators); + res = res || (!ibz_mat_4x4_is_hnf(&cmp)); + ibz_mat_4x4_inv_with_det_as_denom(NULL, &det, &cmp); + if (!ibz_is_zero(&det)) { + ibz_mul(&det, &det, &m); + ibz_mat_4xn_hnf_mod_core(&hnf, 8, generators, &det); + res = res || (!ibz_mat_4x4_equal(&hnf, &cmp)); + } + } + +end:; + if (res != 0) { + printf("Quaternion unit test with randomization for ibz_mat_4xn_hnf_mod_core failed\n"); + } + quat_lattice_finalize(&lat); + quat_alg_elem_finalize(&vec); + ibz_mat_4x4_finalize(&hnf); + ibz_mat_4x4_finalize(&cmp); + ibz_finalize(&det); + ibz_finalize(&m); + for (int i = 0; i < 8; i++) + ibz_vec_4_finalize(&(generators[i])); + return (res); +} + +// run all previous tests +int +quat_test_hnf(void) +{ + int res = 0; + printf("\nRunning quaternion tests of matrices, vectors and quadratic forms in dimension 4\n"); + res = res | quat_test_ibz_mod_not_zero(); + res = res | quat_test_ibz_centered_mod(); + res = res | quat_test_ibz_conditional_assign(); + res = res | quat_test_ibz_xgcd_with_u_not_0(); + res = res | quat_test_ibz_rounded_div(); + res = res | quat_test_ibz_mat_4x4_is_hnf(); + res = res | quat_test_ibz_mat_4xn_hnf_core(); + res = res | quat_test_ibz_mat_4xn_hnf_mod_core(); + res = res | quat_test_ibz_mat_4xn_hnf_core_randomized(); + res = res | quat_test_ibz_mat_4xn_hnf_mod_core_randomized(); + return (res); +} diff --git a/src/quaternion/ref/generic/hnf/ibz_division.c b/src/quaternion/ref/generic/hnf/ibz_division.c new file mode 100644 index 0000000..622361d --- /dev/null +++ b/src/quaternion/ref/generic/hnf/ibz_division.c @@ -0,0 +1,12 @@ +#include "hnf_internal.h" +#if defined(MINI_GMP) +#include +#else +#include +#endif + +void +ibz_xgcd(ibz_t *gcd, ibz_t *u, ibz_t *v, const ibz_t *a, const ibz_t *b) +{ + mpz_gcdext(*gcd, *u, *v, *a, *b); +} \ No newline at end of file diff --git a/src/quaternion/ref/generic/ideal.c b/src/quaternion/ref/generic/ideal.c index 5e10c4c..9cf863a 100644 --- a/src/quaternion/ref/generic/ideal.c +++ b/src/quaternion/ref/generic/ideal.c @@ -2,370 +2,322 @@ #include #include "internal.h" -void quat_lideal_create_principal(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const quat_order_t *order, const quat_alg_t *alg) { - ibz_mat_4x4_t mulmat; - ibq_t norm; - ibz_mat_4x4_init(&mulmat); - ibq_init(&norm); - - // Multiply order basis on the right by x - quat_alg_rightmul_mat(&mulmat, x, alg); - ibz_mat_4x4_mul(&lideal->lattice.basis, &mulmat, &order->basis); - - // Adjust denominators - ibz_mul(&lideal->lattice.denom, &x->denom, &order->denom); - quat_lattice_reduce_denom(&lideal->lattice, &lideal->lattice); - - // Compute HNF - quat_lattice_hnf(&lideal->lattice); - - // Compute norm and check it's integral - quat_alg_norm(&norm, x, alg); - assert(ibq_is_ibz(&norm)); - ibq_to_ibz(&lideal->norm, &norm); - - // Set order - lideal->parent_order = order; - - ibq_finalize(&norm); - ibz_mat_4x4_finalize(&mulmat); +// assumes parent order and lattice correctly set, computes and sets the norm +void +quat_lideal_norm(quat_left_ideal_t *lideal) +{ + quat_lattice_index(&(lideal->norm), &(lideal->lattice), (lideal->parent_order)); + int ok UNUSED = ibz_sqrt(&(lideal->norm), &(lideal->norm)); + assert(ok); } -void quat_lideal_create_from_primitive(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const ibz_t *N, const quat_order_t *order, const quat_alg_t *alg) { +// assumes parent order and lattice correctly set, recomputes and verifies its norm +static int +quat_lideal_norm_verify(const quat_left_ideal_t *lideal) +{ + int res; + ibz_t index; + ibz_init(&index); + quat_lattice_index(&index, &(lideal->lattice), (lideal->parent_order)); + ibz_sqrt(&index, &index); + res = (ibz_cmp(&(lideal->norm), &index) == 0); + ibz_finalize(&index); + return (res); +} + +void +quat_lideal_copy(quat_left_ideal_t *copy, const quat_left_ideal_t *copied) +{ + copy->parent_order = copied->parent_order; + ibz_copy(©->norm, &copied->norm); + ibz_copy(©->lattice.denom, &copied->lattice.denom); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_copy(©->lattice.basis[i][j], &copied->lattice.basis[i][j]); + } + } +} + +void +quat_lideal_create_principal(quat_left_ideal_t *lideal, + const quat_alg_elem_t *x, + const quat_lattice_t *order, + const quat_alg_t *alg) +{ + assert(quat_order_is_maximal(order, alg)); + assert(quat_lattice_contains(NULL, order, x)); + ibz_t norm_n, norm_d; + ibz_init(&norm_n); + ibz_init(&norm_d); + + // Multiply order on the right by x + quat_lattice_alg_elem_mul(&(lideal->lattice), order, x, alg); + + // Reduce denominator. This conserves HNF + quat_lattice_reduce_denom(&lideal->lattice, &lideal->lattice); + + // Compute norm and check it's integral + quat_alg_norm(&norm_n, &norm_d, x, alg); + assert(ibz_is_one(&norm_d)); + ibz_copy(&lideal->norm, &norm_n); + + // Set order + lideal->parent_order = order; + ibz_finalize(&norm_n); + ibz_finalize(&norm_d); +} + +void +quat_lideal_create(quat_left_ideal_t *lideal, + const quat_alg_elem_t *x, + const ibz_t *N, + const quat_lattice_t *order, + const quat_alg_t *alg) +{ + assert(quat_order_is_maximal(order, alg)); + assert(!quat_alg_elem_is_zero(x)); + quat_lattice_t ON; quat_lattice_init(&ON); - + // Compute ideal generated by x quat_lideal_create_principal(lideal, x, order, alg); - // Compute norm - ibz_gcd(&lideal->norm, &lideal->norm, N); - // Compute ideal generated by N (without reducing denominator) ibz_mat_4x4_scalar_mul(&ON.basis, N, &order->basis); ibz_copy(&ON.denom, &order->denom); - + // Add lattices (reduces denominators) quat_lattice_add(&lideal->lattice, &lideal->lattice, &ON); - -#ifndef NDEBUG - // verify norm - ibz_t tmp; - ibz_init(&tmp); - quat_lattice_index(&tmp,&(lideal->lattice),(lideal->parent_order)); - int ok = ibz_sqrt(&tmp,&tmp); - assert(ok); - ok = (0==ibz_cmp(&tmp,&(lideal->norm))); - assert(ok); - ibz_finalize(&tmp); -#endif - // Set order lideal->parent_order = order; + // Compute norm + quat_lideal_norm(lideal); quat_lattice_finalize(&ON); } -void quat_lideal_make_primitive_then_create(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const ibz_t *N, const quat_order_t *order, const quat_alg_t *alg) { - quat_alg_elem_t prim; - ibz_t imprim, n1; - quat_alg_elem_init(&prim); - ibz_init(&imprim); - ibz_init(&n1); - - // Store the primitive part of x in elem - quat_alg_make_primitive(&prim.coord, &imprim, x, order, alg); - ibz_mat_4x4_eval(&prim.coord, &order->basis, &prim.coord); - ibz_copy(&prim.denom, &order->denom); - - // imprim = gcd(imprimitive part of x, N) - // n1 = N / imprim - ibz_gcd(&imprim, &imprim, N); - ibz_div(&n1, &imprim, N, &imprim); - - // Generate the ideal (elem, n1) - quat_lideal_create_from_primitive(lideal, &prim, &n1, order, alg); - - quat_alg_elem_finalize(&prim); - ibz_finalize(&imprim); - ibz_finalize(&n1); -} - -int quat_lideal_random_2e(quat_left_ideal_t *lideal, const quat_order_t *order, const quat_alg_t *alg, int64_t e, unsigned char n) { - ibq_t norm; - ibz_t norm_num; - ibq_init(&norm); - ibz_init(&norm_num); - - quat_alg_elem_t gen; - quat_alg_elem_init(&gen); - ibz_set(&gen.coord[0], 1); - - // Start with the trivial left ideal of O - quat_lideal_create_principal(lideal, &gen, order, alg); - - // Create the lattice 2·O - quat_lattice_t O2; - quat_lattice_init(&O2); - if (ibz_get(&order->denom) % 2 == 0) { - ibz_mat_4x4_copy(&O2.basis, &order->basis); - ibz_div_2exp(&O2.denom, &order->denom, 1); - } else { - ibz_mat_4x4_scalar_mul(&O2.basis, &ibz_const_two, &order->basis); - ibz_copy(&O2.denom, &order->denom); - } - - for (int i = 0; i < e; ++i) { - // Take random gen ∈ lideal until one is found such that - // val₂(N(gen)) > i and gen ∉ 2·O - do { - if (!quat_lattice_random_elem(&gen, &lideal->lattice, n)) - return 0; - - quat_alg_norm(&norm, &gen, alg); - int ok = ibq_to_ibz(&norm_num, &norm); - assert(ok); - // N(gen)/N(I) - ibz_div_2exp(&norm_num, &norm_num, i); - } - // Check that 2-norm has increased, do not backtrack - while ((ibz_get(&norm_num) % 2 != 0) || - quat_lattice_contains(NULL, &O2, &gen, alg)); - - // Redefine lideal as (gen, 2^(i+1)) - ibz_mul(&norm_num, &lideal->norm, &ibz_const_two); - quat_lideal_create_from_primitive(lideal, &gen, &norm_num, order, alg); - assert(ibz_cmp(&lideal->norm, &norm_num) == 0); - } - - quat_lattice_finalize(&O2); - ibq_finalize(&norm); - ibz_finalize(&norm_num); - quat_alg_elem_finalize(&gen); - return 1; -} - -int quat_lideal_generator(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const quat_alg_t *alg, int bound) { - return(quat_lideal_generator_coprime(gen, lideal, &ibz_const_one, alg,bound)); -} - -int quat_lideal_generator_coprime(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const ibz_t *n, const quat_alg_t *alg, int bound) { - ibq_t norm; - ibz_t norm_int, norm_n,gcd, r, q, n2, gcd_ref; +int +quat_lideal_generator(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const quat_alg_t *alg) +{ + ibz_t norm_int, norm_n, gcd, r, q, norm_denom; ibz_vec_4_t vec; ibz_vec_4_init(&vec); - ibq_init(&norm); + ibz_init(&norm_denom); ibz_init(&norm_int); ibz_init(&norm_n); - ibz_init(&gcd_ref); - ibz_init(&n2); ibz_init(&r); ibz_init(&q); ibz_init(&gcd); - ibz_mul(&norm_n, &lideal->norm, n); - ibz_mul(&n2, n, n); - ibz_gcd(&gcd_ref,n,&(lideal->norm)); - int a, b, c, d, int_norm; - int used_bound = QUATERNION_lideal_generator_search_bound; - if(bound != 0) - used_bound = bound; - assert(used_bound > 0); + int a, b, c, d; int found = 0; - for (int_norm = 1; int_norm < used_bound; int_norm++){ - for (a = -int_norm; a <= int_norm; a++){ - for (b = -int_norm + abs(a); b <= int_norm - abs(a); b++){ - for (c = -int_norm + abs(a) + abs(b); c <= int_norm - abs(a) - abs(b); c++){ + int int_norm = 0; + while (1) { + int_norm++; + for (a = -int_norm; a <= int_norm; a++) { + for (b = -int_norm + abs(a); b <= int_norm - abs(a); b++) { + for (c = -int_norm + abs(a) + abs(b); c <= int_norm - abs(a) - abs(b); c++) { d = int_norm - abs(a) - abs(b) - abs(c); - ibz_vec_4_set(&vec,a,b,c,d); - ibz_content(&gcd, &vec); - if(ibz_is_one(&gcd)){ - ibz_mat_4x4_eval(&(gen->coord),&(lideal->lattice.basis),&vec); - ibz_copy(&(gen->denom),&(lideal->lattice.denom)); - quat_alg_norm(&norm, gen, alg); - found = ibq_to_ibz(&norm_int, &norm); - if(found){ - ibz_div(&q,&r,&norm_int,&(lideal->norm)); - found = ibz_is_zero(&r); - if(found){ - ibz_gcd(&gcd, &norm_n, &q); - found = (0==ibz_cmp(&gcd, &ibz_const_one)); - if(found){ - ibz_gcd(&gcd, &n2, &norm_int); - found = (0==ibz_cmp(&gcd, &gcd_ref)); - } - } - } - if(found) + ibz_vec_4_set(&vec, a, b, c, d); + ibz_vec_4_content(&gcd, &vec); + if (ibz_is_one(&gcd)) { + ibz_mat_4x4_eval(&(gen->coord), &(lideal->lattice.basis), &vec); + ibz_copy(&(gen->denom), &(lideal->lattice.denom)); + quat_alg_norm(&norm_int, &norm_denom, gen, alg); + assert(ibz_is_one(&norm_denom)); + ibz_div(&q, &r, &norm_int, &(lideal->norm)); + assert(ibz_is_zero(&r)); + ibz_gcd(&gcd, &(lideal->norm), &q); + found = (0 == ibz_cmp(&gcd, &ibz_const_one)); + if (found) goto fin; } } } } } - fin:; +fin:; ibz_finalize(&r); ibz_finalize(&q); - ibq_finalize(&norm); + ibz_finalize(&norm_denom); ibz_finalize(&norm_int); ibz_finalize(&norm_n); - ibz_finalize(&gcd_ref); - ibz_finalize(&n2); ibz_vec_4_finalize(&vec); ibz_finalize(&gcd); - return(found); + return (found); } -int quat_lideal_mul(quat_left_ideal_t *product, const quat_left_ideal_t *lideal, const quat_alg_elem_t *alpha, const quat_alg_t *alg, int bound) { - ibq_t norm, norm_lideal; - ibz_t norm_int, num, denom; - quat_alg_elem_t gen; - ibq_init(&norm); - ibq_init(&norm_lideal); - ibz_init(&norm_int); - ibz_init(&num); - ibz_init(&denom); - quat_alg_elem_init(&gen); - - quat_alg_norm(&norm, alpha, alg); - ibq_num(&num,&norm); - ibq_denom(&denom,&norm); - ibz_gcd(&denom,&denom,&num); - ibz_div(&norm_int,&denom,&num,&denom); - // Find a random generator gen of norm coprime to N(alpha) - // Warning: hardcoded the default constant, and this call can fail! - int found = quat_lideal_generator_coprime(&gen, lideal, &norm_int, alg,0); - if(found){ - // Define the ideal (gen·α, N(lideal)·N(α)) - quat_alg_mul(&gen, &gen, alpha, alg); - ibz_copy(&num,&(lideal->norm)); - ibz_set(&denom,1); - ibq_set(&norm_lideal,&num,&denom); - ibq_mul(&norm, &norm, &norm_lideal); - int ok = ibq_to_ibz(&norm_int, &norm); - assert(ok); - quat_lideal_create_from_primitive(product, &gen, &norm_int, lideal->parent_order, alg); - } - - ibq_finalize(&norm); - ibz_finalize(&norm_int); - ibq_finalize(&norm_lideal); - ibz_finalize(&num); - ibz_finalize(&denom); - quat_alg_elem_finalize(&gen); - return(found); -} - -void quat_lideal_add(quat_left_ideal_t *sum, const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg) { - assert(I1->parent_order == I2->parent_order); - quat_lattice_add(&sum->lattice, &I1->lattice, &I2->lattice); - quat_lattice_index(&sum->norm, &sum->lattice, I1->parent_order); - int ok = ibz_sqrt(&sum->norm, &sum->norm); - assert(ok); - sum->parent_order = I1->parent_order; -} - -void quat_lideal_inter(quat_left_ideal_t *inter, const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg) { - assert(I1->parent_order == I2->parent_order); - quat_lattice_intersect(&inter->lattice, &I1->lattice, &I2->lattice); - quat_lattice_index(&inter->norm, &inter->lattice, I1->parent_order); - int ok = ibz_sqrt(&inter->norm, &inter->norm); - assert(ok); - inter->parent_order = I1->parent_order; -} - -int quat_lideal_equals(const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg) { - return I1->parent_order == I2->parent_order - && ibz_cmp(&I1->norm, &I2->norm) == 0 - && quat_lattice_equal(&I1->lattice, &I2->lattice); -} - -int quat_lideal_isom(quat_alg_elem_t *iso, const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg){ - // Only accept strict equality of parent orders - if (I1->parent_order != I2->parent_order) - return 0; - - quat_lattice_t trans; - ibz_mat_4x4_t lll; - ibq_t norm, norm_bound; - quat_lattice_init(&trans); - ibz_mat_4x4_init(&lll); - ibq_init(&norm_bound); ibq_init(&norm); - - quat_lattice_right_transporter(&trans, &I1->lattice, &I2->lattice, alg); - - int err = quat_lattice_lll(&lll, &trans, &alg->p, 0); - assert(!err); - // The shortest vector found by lll is a candidate - for (int i = 0; i < 4; i++) - ibz_copy(&iso->coord[i], &lll[i][0]); - ibz_copy(&iso->denom, &trans.denom); - - // bound on the smallest vector in transporter: N₂ / N₁ - ibq_set(&norm_bound, &I2->norm, &I1->norm); - quat_alg_norm(&norm, iso, alg); - - int isom = ibq_cmp(&norm, &norm_bound) <= 0; - - quat_lattice_finalize(&trans); - ibz_mat_4x4_finalize(&lll); - ibq_finalize(&norm_bound); ibq_finalize(&norm); - - return isom; -} - -void quat_lideal_right_order(quat_order_t *order, const quat_left_ideal_t *lideal, const quat_alg_t *alg){ - quat_lattice_right_transporter(order, &lideal->lattice, &lideal->lattice, alg); -} - -void quat_lideal_reduce_basis(ibz_mat_4x4_t *reduced, ibz_mat_4x4_t *gram, const quat_left_ideal_t *lideal, const quat_alg_t *alg){ - ibz_mat_4x4_t prod; - ibz_mat_4x4_init(&prod); - quat_lattice_lll(reduced,&(lideal ->lattice),&(alg->p),0); - ibz_mat_4x4_transpose(&prod,reduced); - ibz_mat_4x4_mul(&prod,&prod,&(alg ->gram)); - ibz_mat_4x4_mul(gram,&prod,reduced); - ibz_mat_4x4_finalize(&prod); -} - -/***************************** Function from quaternion_tools.c ***************************************/ - -void quat_connecting_ideal(quat_left_ideal_t *connecting_ideal, const quat_order_t *O1, const quat_order_t *O2, const quat_alg_t *alg){ - quat_lattice_t inter; - ibz_t norm,one; - ibz_mat_4x4_t gens; - quat_alg_elem_t gen; - quat_left_ideal_t I[4]; +void +quat_lideal_mul(quat_left_ideal_t *product, + const quat_left_ideal_t *lideal, + const quat_alg_elem_t *alpha, + const quat_alg_t *alg) +{ + assert(quat_order_is_maximal((lideal->parent_order), alg)); + ibz_t norm, norm_d; ibz_init(&norm); - ibz_init(&one); - quat_lattice_init(&inter); - ibz_mat_4x4_init(&gens); - quat_alg_elem_init(&gen); - for (int i = 0; i < 4; i++) { - quat_left_ideal_init(I + i); - } - ibz_set(&one,1); - - quat_lattice_intersect(&inter,O1,O2); - quat_lattice_index(&norm,&inter,O1); - ibz_mat_4x4_scalar_mul(&gens,&norm,&(O2->basis)); - quat_alg_scalar(&gen,&norm,&one); - quat_lideal_create_principal(connecting_ideal, &gen, O1, alg); - for (int i = 0; i < 4; i++) {; - quat_alg_elem_copy_ibz(&gen,&(O2->denom),&(gens[0][i]),&(gens[1][i]),&(gens[2][i]),&(gens[3][i])); - quat_lideal_create_principal(I + i, &gen, O1, alg); - } - - quat_lideal_add(connecting_ideal, connecting_ideal, I+0, alg); - quat_lideal_add(connecting_ideal, connecting_ideal, I+1, alg); - quat_lideal_add(connecting_ideal, connecting_ideal, I+2, alg); - quat_lideal_add(connecting_ideal, connecting_ideal, I+3, alg); - + ibz_init(&norm_d); + quat_lattice_alg_elem_mul(&(product->lattice), &(lideal->lattice), alpha, alg); + product->parent_order = lideal->parent_order; + quat_alg_norm(&norm, &norm_d, alpha, alg); + ibz_mul(&(product->norm), &(lideal->norm), &norm); + assert(ibz_divides(&(product->norm), &norm_d)); + ibz_div(&(product->norm), &norm, &(product->norm), &norm_d); + assert(quat_lideal_norm_verify(lideal)); + ibz_finalize(&norm_d); ibz_finalize(&norm); - ibz_finalize(&one); - quat_lattice_finalize(&inter); - ibz_mat_4x4_finalize(&gens); - quat_alg_elem_finalize(&gen); - for (int i = 0; i < 4; i++) { - quat_left_ideal_finalize(I + i); - } +} + +void +quat_lideal_add(quat_left_ideal_t *sum, const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg) +{ + assert(I1->parent_order == I2->parent_order); + assert(quat_order_is_maximal((I2->parent_order), alg)); + quat_lattice_add(&sum->lattice, &I1->lattice, &I2->lattice); + sum->parent_order = I1->parent_order; + quat_lideal_norm(sum); +} + +void +quat_lideal_inter(quat_left_ideal_t *inter, + const quat_left_ideal_t *I1, + const quat_left_ideal_t *I2, + const quat_alg_t *alg) +{ + assert(I1->parent_order == I2->parent_order); + assert(quat_order_is_maximal((I2->parent_order), alg)); + quat_lattice_intersect(&inter->lattice, &I1->lattice, &I2->lattice); + inter->parent_order = I1->parent_order; + quat_lideal_norm(inter); +} + +int +quat_lideal_equals(const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg) +{ + assert(quat_order_is_maximal((I2->parent_order), alg)); + assert(quat_order_is_maximal((I1->parent_order), alg)); + return (I1->parent_order == I2->parent_order) & (ibz_cmp(&I1->norm, &I2->norm) == 0) & + quat_lattice_equal(&I1->lattice, &I2->lattice); +} + +void +quat_lideal_inverse_lattice_without_hnf(quat_lattice_t *inv, const quat_left_ideal_t *lideal, const quat_alg_t *alg) +{ + assert(quat_order_is_maximal((lideal->parent_order), alg)); + quat_lattice_conjugate_without_hnf(inv, &(lideal->lattice)); + ibz_mul(&(inv->denom), &(inv->denom), &(lideal->norm)); +} + +// following the implementation of ideal isomorphisms in the code of LearningToSQI's sage +// implementation of SQIsign +void +quat_lideal_right_transporter(quat_lattice_t *trans, + const quat_left_ideal_t *lideal1, + const quat_left_ideal_t *lideal2, + const quat_alg_t *alg) +{ + assert(quat_order_is_maximal((lideal1->parent_order), alg)); + assert(quat_order_is_maximal((lideal2->parent_order), alg)); + assert(lideal1->parent_order == lideal2->parent_order); + quat_lattice_t inv; + quat_lattice_init(&inv); + quat_lideal_inverse_lattice_without_hnf(&inv, lideal1, alg); + quat_lattice_mul(trans, &inv, &(lideal2->lattice), alg); + quat_lattice_finalize(&inv); +} + +void +quat_lideal_right_order(quat_lattice_t *order, const quat_left_ideal_t *lideal, const quat_alg_t *alg) +{ + assert(quat_order_is_maximal((lideal->parent_order), alg)); + quat_lideal_right_transporter(order, lideal, lideal, alg); +} + +void +quat_lideal_class_gram(ibz_mat_4x4_t *G, const quat_left_ideal_t *lideal, const quat_alg_t *alg) +{ + quat_lattice_gram(G, &(lideal->lattice), alg); + + // divide by norm · denominator² + ibz_t divisor, rmd; + ibz_init(&divisor); + ibz_init(&rmd); + + ibz_mul(&divisor, &(lideal->lattice.denom), &(lideal->lattice.denom)); + ibz_mul(&divisor, &divisor, &(lideal->norm)); + + for (int i = 0; i < 4; i++) { + for (int j = 0; j <= i; j++) { + ibz_div(&(*G)[i][j], &rmd, &(*G)[i][j], &divisor); + assert(ibz_is_zero(&rmd)); + } + } + for (int i = 0; i < 4; i++) { + for (int j = 0; j <= i - 1; j++) { + ibz_copy(&(*G)[j][i], &(*G)[i][j]); + } + } + + ibz_finalize(&rmd); + ibz_finalize(&divisor); +} + +void +quat_lideal_conjugate_without_hnf(quat_left_ideal_t *conj, + quat_lattice_t *new_parent_order, + const quat_left_ideal_t *lideal, + const quat_alg_t *alg) +{ + quat_lideal_right_order(new_parent_order, lideal, alg); + quat_lattice_conjugate_without_hnf(&(conj->lattice), &(lideal->lattice)); + conj->parent_order = new_parent_order; + ibz_copy(&(conj->norm), &(lideal->norm)); +} + +int +quat_order_discriminant(ibz_t *disc, const quat_lattice_t *order, const quat_alg_t *alg) +{ + int ok = 0; + ibz_t det, sqr, div; + ibz_mat_4x4_t transposed, norm, prod; + ibz_init(&det); + ibz_init(&sqr); + ibz_init(&div); + ibz_mat_4x4_init(&transposed); + ibz_mat_4x4_init(&norm); + ibz_mat_4x4_init(&prod); + ibz_mat_4x4_transpose(&transposed, &(order->basis)); + // multiply gram matrix by 2 because of reduced trace + ibz_mat_4x4_identity(&norm); + ibz_copy(&(norm[2][2]), &(alg->p)); + ibz_copy(&(norm[3][3]), &(alg->p)); + ibz_mat_4x4_scalar_mul(&norm, &ibz_const_two, &norm); + ibz_mat_4x4_mul(&prod, &transposed, &norm); + ibz_mat_4x4_mul(&prod, &prod, &(order->basis)); + ibz_mat_4x4_inv_with_det_as_denom(NULL, &det, &prod); + ibz_mul(&div, &(order->denom), &(order->denom)); + ibz_mul(&div, &div, &div); + ibz_mul(&div, &div, &div); + ibz_div(&sqr, &div, &det, &div); + ok = ibz_is_zero(&div); + ok = ok & ibz_sqrt(disc, &sqr); + ibz_finalize(&det); + ibz_finalize(&div); + ibz_finalize(&sqr); + ibz_mat_4x4_finalize(&transposed); + ibz_mat_4x4_finalize(&norm); + ibz_mat_4x4_finalize(&prod); + return (ok); +} + +int +quat_order_is_maximal(const quat_lattice_t *order, const quat_alg_t *alg) +{ + int res; + ibz_t disc; + ibz_init(&disc); + quat_order_discriminant(&disc, order, alg); + res = (ibz_cmp(&disc, &(alg->p)) == 0); + ibz_finalize(&disc); + return (res); } diff --git a/src/quaternion/ref/generic/include/intbig.h b/src/quaternion/ref/generic/include/intbig.h new file mode 100644 index 0000000..a0c2c02 --- /dev/null +++ b/src/quaternion/ref/generic/include/intbig.h @@ -0,0 +1,303 @@ +/** @file + * + * @authors Luca De Feo, Sina Schaeffler + * + * @brief Declarations for big integers in the reference implementation + */ + +#ifndef INTBIG_H +#define INTBIG_H + +#include +#if defined(MINI_GMP) +#include +#include +#else +#include +#endif +#include +#include + +/** @ingroup quat_quat + * @defgroup ibz_all Signed big integers (gmp-based) + * @{ + */ + +/** @defgroup ibz_t Precise number types + * @{ + */ + +/** @brief Type for signed long integers + * + * @typedef ibz_t + * + * For integers of arbitrary size, used by intbig module, using gmp + */ +typedef mpz_t ibz_t; + +/** @} + */ + +/** @defgroup ibz_c Constants + * @{ + */ + +/** + * Constant zero + */ +extern const ibz_t ibz_const_zero; + +/** + * Constant one + */ +extern const ibz_t ibz_const_one; + +/** + * Constant two + */ +extern const ibz_t ibz_const_two; + +/** + * Constant three + */ +extern const ibz_t ibz_const_three; + +/** @} + */ + +/** @defgroup ibz_finit Constructors and Destructors + * @{ + */ + +void ibz_init(ibz_t *x); +void ibz_finalize(ibz_t *x); + +/** @} + */ + +/** @defgroup ibz_za Basic integer arithmetic + * @{ + */ + +/** @brief sum=a+b + */ +void ibz_add(ibz_t *sum, const ibz_t *a, const ibz_t *b); + +/** @brief diff=a-b + */ +void ibz_sub(ibz_t *diff, const ibz_t *a, const ibz_t *b); + +/** @brief prod=a*b + */ +void ibz_mul(ibz_t *prod, const ibz_t *a, const ibz_t *b); + +/** @brief neg=-a + */ +void ibz_neg(ibz_t *neg, const ibz_t *a); + +/** @brief abs=|a| + */ +void ibz_abs(ibz_t *abs, const ibz_t *a); + +/** @brief Euclidean division of a by b + * + * Computes quotient, remainder so that remainder+quotient*b = a where 0<=|remainder|<|b| + * The quotient is rounded towards zero. + */ +void ibz_div(ibz_t *quotient, ibz_t *remainder, const ibz_t *a, const ibz_t *b); + +/** @brief Euclidean division of a by 2^exp + * + * Computes a right shift of abs(a) by exp bits, then sets sign(quotient) to sign(a). + * + * Division and rounding is as in ibz_div. + */ +void ibz_div_2exp(ibz_t *quotient, const ibz_t *a, uint32_t exp); + +/** @brief Two adic valuation computation + * + * Computes the position of the first 1 in the binary representation of the integer given in input + * + * When this number is a power of two this gives the two adic valuation of the integer + */ +int ibz_two_adic(ibz_t *pow); + +/** @brief r = a mod b + * + * Assumes valid inputs + * The sign of the divisor is ignored, the result is always non-negative + */ +void ibz_mod(ibz_t *r, const ibz_t *a, const ibz_t *b); + +unsigned long int ibz_mod_ui(const mpz_t *n, unsigned long int d); + +/** @brief Test if a = 0 mod b + */ +int ibz_divides(const ibz_t *a, const ibz_t *b); + +/** @brief pow=x^e + * + * Assumes valid inputs, The case 0^0 yields 1. + */ +void ibz_pow(ibz_t *pow, const ibz_t *x, uint32_t e); + +/** @brief pow=(x^e) mod m + * + * Assumes valid inputs + */ +void ibz_pow_mod(ibz_t *pow, const ibz_t *x, const ibz_t *e, const ibz_t *m); + +/** @brief Compare a and b + * + * @returns a positive value if a > b, zero if a = b, and a negative value if a < b + */ +int ibz_cmp(const ibz_t *a, const ibz_t *b); + +/** @brief Test if x is 0 + * + * @returns 1 if x=0, 0 otherwise + */ +int ibz_is_zero(const ibz_t *x); + +/** @brief Test if x is 1 + * + * @returns 1 if x=1, 0 otherwise + */ +int ibz_is_one(const ibz_t *x); + +/** @brief Compare x to y + * + * @returns 0 if x=y, positive if x>y, negative if x= 0 and target must hold sufficient elements to hold ibz + * + * @param target Target digit_t array + * @param ibz ibz source ibz_t element + */ +void ibz_to_digits(digit_t *target, const ibz_t *ibz); +#define ibz_to_digit_array(T, I) \ + do { \ + memset((T), 0, sizeof(T)); \ + ibz_to_digits((T), (I)); \ + } while (0) + +/** @brief get int32_t equal to the lowest bits of i + * + * Should not be used to get the value of i if its bitsize is close to 32 bit + * It can however be used on any i to get an int32_t of the same parity as i (and same value modulo + * 4) + * + * @param i Input integer + */ +int32_t ibz_get(const ibz_t *i); + +/** @brief generate random value in [a, b] + * assumed that a >= 0 and b >= 0 and a < b + * @returns 1 on success, 0 on failiure + */ +int ibz_rand_interval(ibz_t *rand, const ibz_t *a, const ibz_t *b); + +/** @brief generate random value in [-m, m] + * assumed that m > 0 and bitlength of m < 32 bit + * @returns 1 on success, 0 on failiure + */ +int ibz_rand_interval_minm_m(ibz_t *rand, int32_t m); + +/** @brief Bitsize of a. + * + * @returns Bitsize of a. + * + */ +int ibz_bitsize(const ibz_t *a); + +/** @brief Size of a in given base. + * + * @returns Size of a in given base. + * + */ +int ibz_size_in_base(const ibz_t *a, int base); + +/** @} + */ + +/** @defgroup ibz_n Number theory functions + * @{ + */ + +/** + * @brief Greatest common divisor + * + * @param gcd Output: Set to the gcd of a and b + * @param a + * @param b + */ +void ibz_gcd(ibz_t *gcd, const ibz_t *a, const ibz_t *b); + +/** + * @brief Modular inverse + * + * @param inv Output: Set to the integer in [0,mod[ such that a*inv = 1 mod (mod) if it exists + * @param a + * @param mod + * @returns 1 if inverse exists and was computed, 0 otherwise + */ +int ibz_invmod(ibz_t *inv, const ibz_t *a, const ibz_t *mod); + +/** + * @brief Floor of Integer square root + * + * @param sqrt Output: Set to the floor of an integer square root + * @param a number of which a floor of an integer square root is searched + */ +void ibz_sqrt_floor(ibz_t *sqrt, const ibz_t *a); + +/** @} + */ + +// end of ibz_all +/** @} + */ +#endif diff --git a/src/quaternion/ref/generic/include/quaternion.h b/src/quaternion/ref/generic/include/quaternion.h index 34d164e..a567657 100644 --- a/src/quaternion/ref/generic/include/quaternion.h +++ b/src/quaternion/ref/generic/include/quaternion.h @@ -1,164 +1,133 @@ /** @file - * + * * @authors Luca De Feo, Sina Schaeffler - * + * * @brief Declarations for quaternion algebra operations -*/ + */ #ifndef QUATERNION_H #define QUATERNION_H -//#include -#include +// #include +#include +#include "intbig.h" #include - -#define QUATERNION_lideal_generator_search_bound 1024 - /** @defgroup quat_quat Quaternion algebra * @{ -*/ + */ /** @defgroup quat_vec_t Types for integer vectors and matrices * @{ -*/ + */ + +/** @brief Type for vector of 2 big integers + * + * @typedef ibz_vec_2_t + */ +typedef ibz_t ibz_vec_2_t[2]; /** @brief Type for vectors of 4 integers - * + * * @typedef ibz_vec_4_t - * + * * Represented as a vector of 4 ibz_t (big integer) elements -*/ + */ typedef ibz_t ibz_vec_4_t[4]; -/** @brief Type for vectors of 5 integers - * - * @typedef ibz_vec_5_t - * - * Represented as a vector of 5 ibz_t (big integer) elements -*/ -typedef ibz_t ibz_vec_5_t[5]; - /** @brief Type for 2 by 2 matrices of integers - * + * * @typedef ibz_mat_2x2_t - * + * * Represented as a matrix of 2 vectors of 2 ibz_t (big integer) elements -*/ + */ typedef ibz_t ibz_mat_2x2_t[2][2]; /** @brief Type for 4 by 4 matrices of integers - * + * * @typedef ibz_mat_4x4_t - * + * * Represented as a matrix of 4 vectors of 4 ibz_t (big integer) elements -*/ + */ typedef ibz_t ibz_mat_4x4_t[4][4]; - -/** @brief Type for 4 by 5 matrices of integers - * - * @typedef ibz_mat_4x5_t - * - * Represented as a matrix of 4 vectors of 5 ibz_t (big integer) elements -*/ -typedef ibz_t ibz_mat_4x5_t[4][5]; - -/** @brief Type for 4 by 8 matrices of integers - * - * @typedef ibz_mat_4x8_t - * - * Consists in and 4 by 8 matrix of ibz_t (big integers) -*/ -typedef ibz_t ibz_mat_4x8_t[4][8]; /** * @} -*/ + */ /** @defgroup quat_quat_t Types for quaternion algebras * @{ -*/ + */ /** @brief Type for quaternion algebras - * + * * @typedef quat_alg_t * * @struct quat_alg - * + * * The quaternion algebra ramified at p = 3 mod 4 and ∞. -*/ -typedef struct quat_alg { + */ +typedef struct quat_alg +{ ibz_t p; ///< Prime number, must be = 3 mod 4. - ibz_mat_4x4_t gram; ///< Gram matrix of the norm form } quat_alg_t; -/** @brief Type for integer coordinates in a basis - * - * @typedef quat_alg_coord_t - * - * Represented as a vector of 4 ibz_t (big integer) elements -*/ -typedef ibz_vec_4_t quat_alg_coord_t; - /** @brief Type for quaternion algebra elements - * + * * @typedef quat_alg_elem_t - * + * * @struct quat_alg_elem - * + * * Represented as a array *coord* of 4 ibz_t integers and a common ibz_t denominator *denom*. - * - * The representation is not necessarily normalized, that is, gcd(denom, content(coord)) might not be 1. - * For getting a normalized representation, use the quat_alg_normalize function - * - * The elements are always represented in basis (1,i,j,ij) of the quaternion algebra, with i^2=-1 and j^2 = -p -*/ -typedef struct quat_alg_elem { - ibz_t denom; ///< Denominator by which all coordinates are divided (big integer, must not be 0) - quat_alg_coord_t coord; ///< Numerators of the 4 coordinates of the quaternion algebra element in basis (1,i,j,ij) + * + * The representation is not necessarily normalized, that is, gcd(denom, content(coord)) might not + * be 1. For getting a normalized representation, use the quat_alg_normalize function + * + * The elements are always represented in basis (1,i,j,ij) of the quaternion algebra, with i^2=-1 + * and j^2 = -p + */ +typedef struct quat_alg_elem +{ + ibz_t denom; ///< Denominator by which all coordinates are divided (big integer, must not be 0) + ibz_vec_4_t coord; ///< Numerators of the 4 coordinates of the quaternion algebra element in basis (1,i,j,ij) } quat_alg_elem_t; /** @brief Type for lattices in dimension 4 - * + * * @typedef quat_lattice_t - * + * * @struct quat_lattice - * + * * Represented as a rational (`frac`) times an integreal lattice (`basis`) - * - * The basis is in hermite normal form, and its columns divided by its denominator are elements of the quaternion algebra, represented in basis (1,i,j,ij) where i^2 = -1, j^2 = -p. - * + * + * The basis is such that its columns divided by its denominator are elements of + * the quaternion algebra, represented in basis (1,i,j,ij) where i^2 = -1, j^2 = -p. + * * All lattices must have full rank (4) -*/ -typedef struct quat_lattice { - ibz_t denom; ///< Denominator by which the basis is divided (big integer, must not be 0) - ibz_mat_4x4_t basis; ///< Integer basis of the lattice in hermite normal form (its columns divided by denom are algebra elements in the usual basis) + */ +typedef struct quat_lattice +{ + ibz_t denom; ///< Denominator by which the basis is divided (big integer, must not be 0) + ibz_mat_4x4_t basis; ///< Integer basis of the lattice (its columns divided by denom are + ///< algebra elements in the usual basis) } quat_lattice_t; -/** @brief Type for quaternion orders - * - * @typedef quat_order_t - * - * Internally represented as a quat_lattice_t. - * - * That means that the basis is in hermite normal form, and its columns divided by its denominator are elements of the quaternion algebra, represented in basis (1,i,j,ij) where i^2 = -1, j^2 = -p. -*/ -typedef quat_lattice_t quat_order_t; - -/** @brief Type for left ideals in quaternion algebras - * +/** @brief Type for left ideals of maximal orders in quaternion algebras + * * @typedef quat_left_ideal_t - * + * * @struct quat_left_ideal - * - * The basis of the lattice representing it is in hermite normal form, and its columns divided by its denominator are elements of the quaternion algebra, represented in basis (1,i,j,ij) where i^2 = -1, j^2 = -p. -*/ -typedef struct quat_left_ideal { - quat_lattice_t lattice; ///< lattice representing the ideal - ibz_t norm; ///< norm of the lattice - const quat_order_t* parent_order; ///< should be a maximal ideal + * + * The basis of the lattice representing it is such that its columns divided by its denominator are + * elements of the quaternion algebra, represented in basis (1,i,j,ij) where i^2 = -1, j^2 = -p. + */ +typedef struct quat_left_ideal +{ + quat_lattice_t lattice; ///< lattice representing the ideal + ibz_t norm; ///< norm of the lattice + const quat_lattice_t *parent_order; ///< should be a maximal order } quat_left_ideal_t; /** @} -*/ + */ /** @brief Type for extremal maximal orders * @@ -167,116 +136,92 @@ typedef struct quat_left_ideal { * @struct quat_p_extremal_maximal_order * * The basis of the order representing it is in hermite normal form, and its columns divid -ed by its denominator are elements of the quaternion algebra, represented in basis (1,i,j, -ij) where i^2 = -q, j^2 = -p. +ed by its denominator are elements of the quaternion algebra, represented in basis (1,z,t, +tz) where z^2 = -q, t^2 = -p. */ -typedef struct quat_p_extremal_maximal_order { - quat_order_t order; ///< the order represented as a lattice - quat_alg_elem_t i; ///< the element of small discriminant - quat_alg_elem_t j; ///< the element of norm p orthogonal to i - int64_t q; ///< the absolute value of sqrt of i +typedef struct quat_p_extremal_maximal_order +{ + quat_lattice_t order; ///< the order represented as a lattice + quat_alg_elem_t z; ///< the element of small discriminant + quat_alg_elem_t t; ///< the element of norm p orthogonal to z + uint32_t q; ///< the absolute value of the square of z } quat_p_extremal_maximal_order_t; +/** @brief Type for represent integer parameters + * + * @typedef quat_p_extremal_maximal_order_t + * + * @struct quat_p_extremal_maximal_order + * + */ +typedef struct quat_represent_integer_params +{ + int primality_test_iterations; ///< Primality test iterations + const quat_p_extremal_maximal_order_t *order; ///< The standard extremal maximal order + const quat_alg_t *algebra; ///< The quaternion algebra +} quat_represent_integer_params_t; + /*************************** Functions *****************************/ - /** @defgroup quat_c Constructors and Destructors * @{ -*/ + */ void quat_alg_init_set(quat_alg_t *alg, const ibz_t *p); void quat_alg_finalize(quat_alg_t *alg); void quat_alg_elem_init(quat_alg_elem_t *elem); void quat_alg_elem_finalize(quat_alg_elem_t *elem); -void quat_alg_coord_init(quat_alg_coord_t *coord); -void quat_alg_coord_finalize(quat_alg_coord_t *coord); +void ibz_vec_2_init(ibz_vec_2_t *vec); +void ibz_vec_2_finalize(ibz_vec_2_t *vec); void ibz_vec_4_init(ibz_vec_4_t *vec); void ibz_vec_4_finalize(ibz_vec_4_t *vec); -void ibz_vec_5_init(ibz_vec_5_t *vec); -void ibz_vec_5_finalize(ibz_vec_5_t *vec); - void ibz_mat_2x2_init(ibz_mat_2x2_t *mat); void ibz_mat_2x2_finalize(ibz_mat_2x2_t *mat); void ibz_mat_4x4_init(ibz_mat_4x4_t *mat); void ibz_mat_4x4_finalize(ibz_mat_4x4_t *mat); -void ibz_mat_4x5_init(ibz_mat_4x5_t *mat); -void ibz_mat_4x5_finalize(ibz_mat_4x5_t *mat); - -void ibz_mat_4x8_init(ibz_mat_4x8_t *mat); -void ibz_mat_4x8_finalize(ibz_mat_4x8_t *mat); - -/** @brief initiazlize matrix with arbitrary dimensions - */ -void ibz_mat_init(int rows, int cols, ibz_t mat[rows][cols]); -/** @brief finalize matrix with arbitrary dimensions - */ -void ibz_mat_finalize(int rows, int cols, ibz_t mat[rows][cols]); - void quat_lattice_init(quat_lattice_t *lat); void quat_lattice_finalize(quat_lattice_t *lat); -void quat_order_init(quat_order_t *order); -void quat_order_finalize(quat_order_t *order); - void quat_left_ideal_init(quat_left_ideal_t *lideal); void quat_left_ideal_finalize(quat_left_ideal_t *lideal); /** @} -*/ - + */ /** @defgroup quat_printers Print functions for types from the quaternion module * @{ -*/ + */ void ibz_mat_2x2_print(const ibz_mat_2x2_t *mat); void ibz_mat_4x4_print(const ibz_mat_4x4_t *mat); -void ibz_mat_4x5_print(const ibz_mat_4x5_t *mat); -void ibz_mat_4x8_print(const ibz_mat_4x8_t *mat); -void ibz_mat_print(int rows, int cols, const ibz_t mat[rows][cols]); void ibz_vec_2_print(const ibz_vec_2_t *vec); void ibz_vec_4_print(const ibz_vec_4_t *vec); -void ibz_vec_5_print(const ibz_vec_5_t *vec); - void quat_lattice_print(const quat_lattice_t *lat); void quat_alg_print(const quat_alg_t *alg); void quat_alg_elem_print(const quat_alg_elem_t *elem); -void quat_alg_coord_print(const quat_alg_coord_t *coord); -void quat_order_print(const quat_order_t *order); void quat_left_ideal_print(const quat_left_ideal_t *lideal); /** @} -*/ + */ /** @defgroup quat_int Integer functions for quaternion algebra * @{ -*/ + */ /** @defgroup quat_int_mat Integer matrix and vector functions * @{ -*/ - -/** @brief mat*vec in dimension 2 for integers - * - * @param res Output vector - * @param mat Input vector - * @param vec Input vector */ -void ibz_mat_2x2_eval(ibz_vec_2_t *res, const ibz_mat_2x2_t *mat, const ibz_vec_2_t *vec); -/** - * @brief a*b for 2x2 integer matrices modulo m +/** @brief Copy matrix * - * @param prod Output matrix - * @param mat_a Input matrix - * @param mat_b Input matrix - * @param m Integer modulo + * @param copy Output: Matrix into which copied will be copied + * @param copied */ -void ibz_2x2_mul_mod(ibz_mat_2x2_t *prod, const ibz_mat_2x2_t *mat_a, const ibz_mat_2x2_t *mat_b, const ibz_t *m); +void ibz_mat_2x2_copy(ibz_mat_2x2_t *copy, const ibz_mat_2x2_t *copied); /** * @brief Inverse of 2x2 integer matrices modulo m @@ -286,78 +231,95 @@ void ibz_2x2_mul_mod(ibz_mat_2x2_t *prod, const ibz_mat_2x2_t *mat_a, const ibz_ * @param m Integer modulo * @return 1 if inverse exists 0 otherwise */ -int ibz_2x2_inv_mod(ibz_mat_2x2_t *inv, const ibz_mat_2x2_t *mat, const ibz_t *m); +int ibz_mat_2x2_inv_mod(ibz_mat_2x2_t *inv, const ibz_mat_2x2_t *mat, const ibz_t *m); + +/** @brief mat*vec in dimension 2 for integers + * + * @param res Output vector + * @param mat Input vector + * @param vec Input vector + */ +void ibz_mat_2x2_eval(ibz_vec_2_t *res, const ibz_mat_2x2_t *mat, const ibz_vec_2_t *vec); + +/** @brief Copies all values from a 4x4 integer matrix to another one + * + * @param new Output: matrix which will have its entries set to mat's entries + * @param mat Input matrix + */ +void ibz_mat_4x4_copy(ibz_mat_4x4_t *new, + const ibz_mat_4x4_t *mat); // dim4, lattice, test/dim4, ideal + +/** @brief transpose a 4x4 integer matrix + * + * @param transposed Output: is set to the transposition of mat + * @param mat Input matrix + */ +void ibz_mat_4x4_transpose(ibz_mat_4x4_t *transposed, const ibz_mat_4x4_t *mat); + +/** @brief a*b for a,b integer 4x4 matrices + * + * Naive implementation + * + * @param res Output: A 4x4 integer matrix + * @param a + * @param b + */ +void ibz_mat_4x4_mul(ibz_mat_4x4_t *res, const ibz_mat_4x4_t *a, const ibz_mat_4x4_t *b); + +/** @brief divides all values in matrix by same scalar + * + * @returns 1 if scalar divided all values in mat, 0 otherwise (division is performed in both cases) + * @param quot Output + * @param scalar + * @param mat + */ +int ibz_mat_4x4_scalar_div(ibz_mat_4x4_t *quot, const ibz_t *scalar, const ibz_mat_4x4_t *mat); /** * @brief mat*vec - * - * + * + * * @param res Output: coordinate vector * @param mat Integer 4x4 matrix * @param vec Integer vector (coordinate vector) * - * Multiplies 4x4 integer matrix mat by a 4-integers vector vec + * Multiplies 4x4 integer matrix mat by a 4-integers column vector vec */ -void ibz_mat_4x4_eval(ibz_vec_4_t *res, const ibz_mat_4x4_t *mat, const ibz_vec_4_t *vec); +void ibz_mat_4x4_eval(ibz_vec_4_t *res, const ibz_mat_4x4_t *mat, const ibz_vec_4_t *vec); /** - * @brief Computes modulo p the left kernel of mat where p is prime - * - * Algorithm used is the one at number 2.3.1 in Henri Cohen's "A Course in Computational Algebraic Number Theory" (Springer Verlag, in series "Graduate texts in Mathematics") from 1993 + * @brief vec*mat * - * @param ker Output: a vector in kernel which is not 0 modulo p if exists, otherwise 0 - * @param mat A 4×5 matrix - * @param p Integer modulo which the kernel computation is done, must be prime - * @return 1 if a unique such vector was found, 0 otherwise - * + * + * @param res Output: coordinate vector. + * @param vec Integer vector (coordinate vector) + * @param mat Integer 4x4 matrix + * + * Multiplies 4x4 integer matrix mat by a 4-integers row vector vec (on the left) */ -int ibz_4x5_right_ker_mod_prime(ibz_vec_5_t *ker, const ibz_mat_4x5_t *mat, const ibz_t *p); - -/** - * @brief Computes modulo p the left kernel of mat where p is prime - * - * Algorithm used is the one at number 2.3.1 in Henri Cohen's "A Course in Computational Algebraic Number Theory" (Springer Verlag, in series "Graduate texts in Mathematics") from 1993 - * - * @param ker Output: a vector in kernel which is not 0 modulo p if exists, otherwise 0 - * @param mat A 4×4 matrix - * @param p Integer modulo which the kernel computation is done, must be prime - * @return 1 if a unique such vector was found, 0 otherwise - * - */ -int ibz_4x4_right_ker_mod_prime(ibz_vec_4_t *ker, const ibz_mat_4x4_t *mat, const ibz_t *p); - -/** - * @brief Computes the right kernel of mat modulo 2^exp - * - * @param ker Output: a vector in kernel which is not 0 modulo 2, if it exists, otherwise 0 - * @param mat A 4×4 matrix - * @param exp exponent defining the modulus - * @return 1 if a unique such vector was found, 0 otherwise - * - */ -int ibz_4x4_right_ker_mod_power_of_2(ibz_vec_4_t *ker, const ibz_mat_4x4_t *mat, unsigned short exp); - -/** - * @brief content of a 4-vector of integers - * - * The content is the GCD of all entries. - * - * @param v A 4-vector of integers - * @param content Output: the resulting gcd - */ -static inline void ibz_content(ibz_t *content, const ibz_vec_4_t *v) { - ibz_gcd(content, &((*v)[0]), &((*v)[1])); - ibz_gcd(content, &((*v)[2]), content); - ibz_gcd(content, &((*v)[3]), content); -} +void ibz_mat_4x4_eval_t(ibz_vec_4_t *res, const ibz_vec_4_t *vec, const ibz_mat_4x4_t *mat); /** @} -*/ + */ - -/** @defgroup quat_integer Integer functions for quaternion algebra +/** @defgroup quat_integer Higher-level integer functions for quaternion algebra * @{ -*/ + */ + +/** + * @brief Generates a random prime + * + * A number is accepted as prime if it passes a 30-round Miller-Rabin test. + * This function is fairly inefficient and mostly meant for tests. + * + * @returns 1 if a prime is found, 0 otherwise + * @param p Output: The prime (if found) + * @param is3mod4 If 1, the prime is required to be 3 mod 4, if 0 no congruence condition is imposed + * @param bitsize Maximal size of output prime + * @param probability_test_iterations Miller-Rabin iteartions for probabilistic primality testing in + * rejection sampling + */ +int ibz_generate_random_prime(ibz_t *p, int is3mod4, int bitsize, int probability_test_iterations); /** * @brief Find integers x and y such that x^2 + n*y^2 = p @@ -370,211 +332,64 @@ static inline void ibz_content(ibz_t *content, const ibz_vec_4_t *v) { * @param p seond parameter defining the equation, must be prime * @return 1 if success, 0 otherwise */ -int ibz_cornacchia_prime(ibz_t *x, ibz_t *y, const ibz_t *n , const ibz_t *p); - -/** - * @brief Solving cornacchia to find x² + n y³ = 2^exp_adjust * p in the special case of n=3 mod 4 - * - * This function sometimes fails to find a solution even if one exists and all parameters are as specified. - * - * @param x Output: an integer - * @param y Output: an integer - * @param n an integer - * @param p a prime integer - * @param exp_adjust an exponent, must be > 0 - * @returns 1 if success, 0 if failure to find a solution - */ -int ibz_cornacchia_special_prime(ibz_t *x, ibz_t *y, const ibz_t *n, const ibz_t *p, const int exp_adjust); - -/** - * @brief Find x and y such that x^2 + y^2 = n - * - * Uses "extended" version of Cornacchia's algorithm which also allows to solve x^2 + y^2 = n for some composite numbers. - * This uses a prime factor decomposition of n via trial division for primes in the list, computes solutions for n's prime factors - * and then uses complex multiplication. Since (x+iz)(x-iy) = x^2 + y^2, - * so a solution xp,yp for p and xq,yq for q give a solution for pq by computing (xp+iyp)*(xq+iyq). - * - * @param x Output - * @param y Output - * @param n parameter defining the equation. To get an output if one exists, only 1 of its prime factors can exceed the largest prime in prime_list - * @param prime_list list of consecutive primes starting from 2 - * @param prime_list_length number of elements of prime_list. Cans be smaller than that number, in which case only the beginning of the list is used. - * @param primality_test_iterations number of Miller-Rabin iterations to verify primality before trying to compute a square root of 1 modulo the remaining number once all small primes were factored out - * @param bad_primes_prod Assumed to be a product of small primes which are 3 mod 4. Used only to accelerate failure in case its gcd with n is not 1. Can be NULL - * @return 1 if success, 0 otherwise - */ -int ibz_cornacchia_extended(ibz_t *x, ibz_t *y, const ibz_t *n, const short *prime_list, const int prime_list_length, short primality_test_iterations, const ibz_t *bad_primes_prod); +int ibz_cornacchia_prime(ibz_t *x, ibz_t *y, const ibz_t *n, const ibz_t *p); /** @} -*/ - + */ /** @defgroup quat_qf Quadratic form functions * @{ -*/ + */ /** * @brief Quadratic form evaluation - * + * * qf and coord must be represented in the same basis. * * @param res Output: coordinate vector * @param qf Quadratic form (4x4 integer matrix) * @param coord Integer vector (coordinate vector) */ -void quat_qf_eval(ibz_t *res, const ibz_mat_4x4_t *qf, const quat_alg_coord_t *coord); +void quat_qf_eval(ibz_t *res, const ibz_mat_4x4_t *qf, const ibz_vec_4_t *coord); /** @} -*/ - -/** @defgroup quat_lat_2x2 Functions for lattices in dimension 2 - * @{ -*/ - -/** - * @brief Find a lattice vector close to a target vector satisfying extra conditions. - * - * Given a target vector `target` = (x₀,y₀), enumerate vectors `v` = (x,y) in lattice `lat` with distance - * (x₀ - x)² + `qf` (y₀ - y)² < 2^`dist_bound`. On each vector `condition(res, target - v, params)` is called: if it returns a - * non-zero value, processing stops and the same value is returned; if it returns 0 processing continues - * until `max_tries` vectors have been tried. - * - * The implementation will first reduce the basis by finding a short vector with algorithm 1.3.14 (Gauss) from Henri Cohen's "A Course in Computational Algebraic Number Theory" (Springer Verlag, in series "Graduate texts in Mathematics") from 1993. - * Then a second one is added to this basis after reduction by projection on the first one. - * A close vector is found using 2 projection as in https://cims.nyu.edu/~regev/teaching/lattices_fall_2004/ln/cvp.pdf (15.5.2023,16h15CEST) using the already reduced matrix - * Finally, short vectors are enumerated below an enumeration bound set to (2 ^ dist_bound - (distance of target to close vector)). - * Each short vector is added to the close vector, and then the distance to the target is measured. If it is below 2^dist_bound, it is tested for condition. - * If coundition returns 1, the algorithm terminates and returns 1, otherwise it returns 0 when max_tries vectors have been tried - * - * The enumeration bound is an heuristic to avoid starting the search with vectors which will be too far from the target, since enumeration starts at the largest vectors. - * It can in some cases lead to failures even though solutions do exist, an in other cases be insufficient to get a valid result in reasonable time. - * - * Enumeration uses algorithm 2.7.5 (Fincke-Pohst) from Henri Cohen's "A Course in Computational Algebraic Number Theory" (Springer Verlag, in series "Graduate texts in Mathematics") from 1993 - * Slightly adapted to work without rational numbers and their square roots - * Therefore needing a test to make sure the bounds are respected, which is integrated in quat_dim2_lattice_bound_and_condition - * - * @param res Output: quaternion element returned by `condition` - * @param lat_basis basis of an integral 2-dimensional lattice - * @param target target vector for CVP - * @param qf Small integer defining a quadratic form x² + qf y² - * @param dist_bound Log of the maximum distance between `target` and the enumerated vectors - * @param condition Filter the vectors of `lat` by passing them to `condition`. When it returns a non-zero value, the result is put into `res` and the processing stops. - * @param params Extra parameters passed to `condition`. May be NULL. - * @param max_tries Try at most `max_tries` vectors close to `target` - * @return 1 if an element was found, 0 otherwise */ -int quat_2x2_lattice_enumerate_cvp_filter(quat_alg_elem_t *res, - const ibz_mat_2x2_t *lat_basis, const ibz_vec_2_t *target, - unsigned int qf, unsigned int dist_bound, - int (*condition)(quat_alg_elem_t* , const ibz_vec_2_t*, const void*), const void* params, - unsigned int max_tries); /** @} -*/ -/** @} -*/ + */ /** @defgroup quat_quat_f Quaternion algebra functions * @{ -*/ -void quat_alg_add(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b); -void quat_alg_sub(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b); + */ +/** + * @brief Copies an algebra element + * + * @param copy Output: The element into which another one is copied + * @param copied Source element copied into copy + */ +void quat_alg_elem_copy(quat_alg_elem_t *copy, const quat_alg_elem_t *copied); + void quat_alg_mul(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b, const quat_alg_t *alg); /** @brief reduced norm of alg_elem x - * - * @param res Output: rational which will contain the reduced norm of a + * + * @param res_num Output: rational which will contain the numerator of the reduced norm of a + * @param res_denom Output: rational which will contain the denominator of the reduced norm of a (it + * is 1 if the norm is integer) * @param x Algebra element whose norm is computed * @param alg The quaternion algebra -*/ -void quat_alg_norm(ibq_t *res, const quat_alg_elem_t *x, const quat_alg_t *alg); - -/** @brief reduced trace of alg_elem x - * - * @param res Output: rational which will contain the reduced trace of a - * @param x Algebra element whose trace will be computed -*/ -void quat_alg_trace(ibq_t *res, const quat_alg_elem_t *x); - + */ +void quat_alg_norm(ibz_t *res_num, ibz_t *res_denom, const quat_alg_elem_t *x, const quat_alg_t *alg); /** @brief Normalize representation of alg_elem x - * + * * @param x Algebra element whose representation will be normalized - * + * * Modification of x. * Sets coord and denom of x so that gcd(denom, content(coord))=1 * without changing the value of x = (coord0/denom, coord1/denom, coord2/denom, coord3/denom). -*/ + */ void quat_alg_normalize(quat_alg_elem_t *x); -/** @brief Test if x is 0 - * - * @returns 1 if x=0, 0 otherwise - * - * x is 0 iff all coordinates in x->coord are 0 -*/ -int quat_alg_elem_is_zero(const quat_alg_elem_t *x); - -/** @brief Test if x is 0 - * - * @returns 1 if x=0, 0 otherwise - * - * x is 0 iff all coordinates in x are 0 -*/ -int quat_alg_coord_is_zero(const quat_alg_coord_t *x); - - -// end quat_quat_f -/** @} -*/ - -/** @defgroup quat_lat_f Lattice functions - * @{ -*/ - -void quat_lattice_add(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2); -void quat_lattice_intersect(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2); -void quat_lattice_mul(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2, const quat_alg_t *alg); - -/** - * @brief Modifies a lattice to put it in hermite normal form - * - * In-place modification of the lattice. - * - * @param lat input lattice - * - * On a correct lattice this function changes nothing (since it is already in HNF), but it can be used to put a handmade one in correct form in order to use the other lattice functions. - */ -void quat_lattice_hnf(quat_lattice_t *lat); - -/** - * @brief Test whether x ∈ lat. If so, compute its coordinates in lat's basis. - * - * @param coord Output: Set to the coordinates of x in lat. May be NULL. - * @param lat The lattice - * @param x An element of the quaternion algebra - * @param alg The quaternion algebra - * @return true if x ∈ lat - */ -int quat_lattice_contains(quat_alg_coord_t *coord, const quat_lattice_t *lat, const quat_alg_elem_t *x, const quat_alg_t *alg); - - -/********************************* Functions from ideal.c ************************************/ - -/** @addtogroup quat_quat_f - * @{ -*/ - -/** - * @brief Creates algebra element from scalar - * - * Resulting element has 1-coordinate equal to numerator/denominator - * - * @param elem Output: algebra element with numerator/denominator as first coordiante (1-coordinate), 0 elsewhere (i,j,ij coordinates) - * @param numerator - * @param denominator Assumed non zero - */ -void quat_alg_scalar(quat_alg_elem_t *elem, const ibz_t *numerator, const ibz_t *denominator); - /** * @brief Standard involution in a quaternion algebra * @@ -592,116 +407,111 @@ void quat_alg_conj(quat_alg_elem_t *conj, const quat_alg_elem_t *x); * * @param primitive_x Output: coordinates of a primitive element of `order` (in `order`'s basis) * @param content Output: content of `x`'s coordinate vector in order's basis - * @param alg the quaternion algebra * @param order order of `alg` * @param x element of order, must be in `order` */ -static inline void quat_alg_make_primitive(quat_alg_coord_t *primitive_x, ibz_t *content, const quat_alg_elem_t *x, const quat_order_t *order, const quat_alg_t *alg) { - int ok = quat_lattice_contains(primitive_x, order, x, alg); - assert(ok); - ibz_content(content, primitive_x); - ibz_t r; - ibz_init(&r); - for(int i = 0; i < 4; i++) { - ibz_div(*primitive_x + i, &r, *primitive_x + i, content); - } - ibz_finalize(&r); -} +void quat_alg_make_primitive(ibz_vec_4_t *primitive_x, + ibz_t *content, + const quat_alg_elem_t *x, + const quat_lattice_t *order); + +// end quat_quat_f +/** @} + */ + +/** @defgroup quat_lat_f Lattice functions + * @{ + */ + +void quat_lattice_intersect(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2); /** - * @brief Tests if x ∈ order is primitive + * @brief Test whether x ∈ lat. If so, compute its coordinates in lat's basis. * - * @param alg quaternion algebra - * @param order quaternion order - * @param x element of the order (fails if x ∉ order) - * - * @returns 1 if x is primitive, 0 otherwise + * @param coord Output: Set to the coordinates of x in lat. May be NULL. + * @param lat The lattice, not necessarily in HNF but full rank + * @param x An element of the quaternion algebra + * @return true if x ∈ lat */ -static inline int quat_alg_is_primitive(const quat_alg_elem_t *x, const quat_order_t *order, const quat_alg_t *alg) { - quat_alg_coord_t coord; - ibz_t cnt; - quat_alg_coord_init(&coord); - ibz_init(&cnt); +int quat_lattice_contains(ibz_vec_4_t *coord, const quat_lattice_t *lat, const quat_alg_elem_t *x); - quat_alg_make_primitive(&coord,&cnt,x,order,alg); - int ok = ibz_is_one(&cnt); +/** + * @brief Conjugate of a lattice with basis not in HNF + * + * @param conj Output: The lattice conjugate to lat. ATTENTION: is not under HNF + * @param lat Input lattice + */ +void quat_lattice_conjugate_without_hnf(quat_lattice_t *conj, const quat_lattice_t *lat); - ibz_finalize(&cnt); - quat_alg_coord_finalize(&coord); - return ok; -} +/** + * @brief Multiply a lattice and an algebra element + * + * The element is multiplied to the right of the lattice + * + * @param prod Output: Lattice lat*elem + * @param lat Input lattice + * @param elem Algebra element + * @param alg The quaternion algebra + */ +void quat_lattice_alg_elem_mul(quat_lattice_t *prod, + const quat_lattice_t *lat, + const quat_alg_elem_t *elem, + const quat_alg_t *alg); // ideal -//end quat_quat_f +/** + * @brief Sample from the intersection of a lattice with a ball + * + * Sample a uniform non-zero vector of norm ≤ `radius` from the lattice. + * + * @param res Output: sampled quaternion from the lattice + * @param lattice Input lattice + * @param alg The quaternion algebra + * @param radius The ball radius (quaternion norm) + * @return 0 if an error occurred (ball too small or RNG error), 1 otherwise + */ +int quat_lattice_sample_from_ball(quat_alg_elem_t *res, + const quat_lattice_t *lattice, + const quat_alg_t *alg, + const ibz_t *radius); + +// end quat_lat_f /** @} -*/ + */ /** @defgroup quat_lideal_f Functions for left ideals * @{ -*/ + */ /** @defgroup quat_lideal_c Creating left ideals * @{ -*/ + */ /** - * @brief Left principal ideal of order, generated by x + * @brief Left ideal of order, generated by x and N as order*x+order*N * * @param lideal Output: left ideal - * @param alg quaternion algebra + * @param alg quaternion algebra * @param order maximal order of alg whose left ideal is searched - * @param x generating element - * - * Creates the left ideal in 'order' generated by the element 'x' - */ -void quat_lideal_create_principal(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const quat_order_t *order, const quat_alg_t *alg); - -/** - * @brief Left ideal of order, generated by primitive x and N - * - * @param lideal Output: left ideal - * @param alg quaternion algebra - * @param order maximal order of alg whose left ideal is searched - * @param x generating element, must be a primitive element of order + * @param x generating element. Must be non-zero * @param N generating integer - * - * Creates the left ideal in order generated by the element x and the integer N - * - */ -void quat_lideal_create_from_primitive(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const ibz_t *N, const quat_order_t *order, const quat_alg_t *alg); - -/** - * @brief Make x primitive, remove content from N, then generate ideal * - * @param lideal Output: left ideal - * @param alg quaternion algebra - * @param order maximal order of alg whose left ideal is searched - * @param x generating element, a primitive element of order obtained from it will be used for generation - * @param N generating integer - * - * Given `x` = n·y ∈ order` with `y` primitive, given an integer `N`, create the ideal - * generated by `y` and `N / gcd(n, N)`. - * - */ -void quat_lideal_make_primitive_then_create(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const ibz_t *N, const quat_order_t *order, const quat_alg_t *alg); - -/** - * @brief Random left ideal of norm 2^e + * Creates the left ideal in order generated by the element x and the integer N. + * If x is not divisible (inside the order) by any integer divisor n>1 of N, + * then the norm of the output ideal is N. * - * @param lideal Output: random left ideal (of parents alg and order) with norm 2^e - * @param alg parent algebra for which an ideal is chosen. Is a quaterion algebra - * @param order parent order for which an ideal is chosen. Must be maximal - * @param e int64_t determining the norm of the resulting ideal - * @param n Parameter controlling the amount of randomness used by the algorithm - * @return 0 if PRNG failed, 1 otherwise. */ -int quat_lideal_random_2e(quat_left_ideal_t *lideal, const quat_order_t *order, const quat_alg_t *alg, int64_t e, unsigned char n); +void quat_lideal_create(quat_left_ideal_t *lideal, + const quat_alg_elem_t *x, + const ibz_t *N, + const quat_lattice_t *order, + const quat_alg_t *alg); /** @} -*/ + */ /** @defgroup quat_lideal_gen Generators of left ideals * @{ -*/ + */ /** * @brief Generator of 'lideal' @@ -710,66 +520,41 @@ int quat_lideal_random_2e(quat_left_ideal_t *lideal, const quat_order_t *order, * @param gen Output: non scalar generator of lideal * @param lideal left ideal * @param alg the quaternion algebra - * @param bound Bound used for enumeration of elements. Must be non-negative. If 0, a default value is used. - * - * Ideal is generated by gen and the ideal's norm - * - * Bound has as default value QUATERNION_lideal_generator_search_bound - */ -int quat_lideal_generator(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const quat_alg_t *alg, int bound); - -/** - * @brief Primitive generator of a left ideal of norm coprime to a given integer * - * @returns 1 if such a generator was found, 0 otherwise - * @param gen Output: generator of lideal, coprime to n - * @param lideal left ideal - * @param n value to which the generator norm should be coprime. (assumes gcd(n, norm(lideal)) = 1). If this is not fulfilled, the returned element is a generator such that gcd(n^2,norm(gen)) = gcd(n,norm(lideal)) - * @param alg the quaternion algebra - * @param bound Bound used for enumeration of elements. Must be non-negative. If 0, a default value 0 is used. - * - * Finds a primitive generator of 'lideal' of norm coprime with n (assumes gcd(n, norm(lideal)) = 1) - * - * gen is such that lideal is generated by gen and the ideal's norm - * + * Ideal is generated by gen and the ideal's norm + * * Bound has as default value QUATERNION_lideal_generator_search_bound */ -int quat_lideal_generator_coprime(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const ibz_t *n, const quat_alg_t *alg, int bound); - +int quat_lideal_generator(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const quat_alg_t *alg); /** @} -*/ + */ /** @defgroup quat_lideal_op Operations on left ideals * @{ -*/ + */ /** - * @brief Left ideal product of left ideal I and element alpha + * @brief Copies an ideal * - * @returns 1 if a product could be computed, 0 otherwise (in the later case, one might retry with a higher bound) - * @param product Output: lideal I*alpha, must have integer norm - * @param lideal left ideal - * @param alpha element multiplied to lideal to get the product ideal - * @param alg the quaternion algebra - * @param bound used for internal ideal_generator search. Must be positive. Setting it to 0 uses the default value. - * - * I*alpha where I is a left-ideal and alpha an element of the algebra - * - * The resulting ideal must have an integer norm - * - * Bound has as default value QUATERNION_lideal_generator_search_bound + * @param copy Output: The ideal into which another one is copied + * @param copied Source ideal copied into copy. The parent order is not copied (only the pointer). */ -int quat_lideal_mul(quat_left_ideal_t *product, const quat_left_ideal_t *lideal, const quat_alg_elem_t *alpha, const quat_alg_t *alg, int bound); +void quat_lideal_copy(quat_left_ideal_t *copy, const quat_left_ideal_t *copied); /** - * @brief Sum of two left ideals + * @brief Conjugate of a left ideal (not in HNF) * - * @param sum Output: Left ideal which is the sum of the 2 inputs - * @param lideal1 left ideal - * @param lideal2 left ideal + * @param conj Output: Ideal conjugate to lideal, with norm and parent order correctly set, but its + * lattice not in HNF + * @param new_parent_order Output: Will be set to the right order of lideal, and serve as parent + * order for conj (so must have at least the lifetime of conj) + * @param lideal input left ideal (of which conj will be the conjugate) * @param alg the quaternion algebra */ -void quat_lideal_add(quat_left_ideal_t *sum, const quat_left_ideal_t *lideal1, const quat_left_ideal_t *lideal2, const quat_alg_t *alg); +void quat_lideal_conjugate_without_hnf(quat_left_ideal_t *conj, + quat_lattice_t *new_parent_order, + const quat_left_ideal_t *lideal, + const quat_alg_t *alg); /** * @brief Intersection of two left ideals @@ -779,98 +564,145 @@ void quat_lideal_add(quat_left_ideal_t *sum, const quat_left_ideal_t *lideal1, c * @param lideal2 left ideal * @param alg the quaternion algebra */ -void quat_lideal_inter(quat_left_ideal_t *intersection, const quat_left_ideal_t *lideal1, const quat_left_ideal_t *lideal2, const quat_alg_t *alg); +void quat_lideal_inter(quat_left_ideal_t *intersection, + const quat_left_ideal_t *lideal1, + const quat_left_ideal_t *lideal2, + const quat_alg_t *alg); /** - * @brief Equality test for left ideals + * @brief L2-reduce the basis of the left ideal, without considering its denominator * - * @returns 1 if both left ideals are equal, 0 otherwise - * @param lideal1 left ideal - * @param lideal2 left ideal + * This function reduce the basis of the lattice of the ideal, but it does completely ignore its + * denominator. So the outputs of this function must still e divided by the appropriate power of + * lideal.lattice.denom. + * + * Implements the L2 Algorithm of Nguyen-Stehlé, also known as fplll: + * https://iacr.org/archive/eurocrypt2005/34940217/34940217.pdf + * + * Parameters are in lll/lll_internals.h + * + * @param reduced Output: Lattice defining the ideal, which has its basis in a lll-reduced form. + * Must be divided by lideal.lattice.denom before usage + * @param gram Output: Matrix of the quadratic form given by the norm on the basis of the reduced + * ideal, divided by the norm of the ideal + * @param lideal ideal whose basis will be reduced * @param alg the quaternion algebra */ -int quat_lideal_equals(const quat_left_ideal_t *lideal1, const quat_left_ideal_t *lideal2, const quat_alg_t *alg); +void quat_lideal_reduce_basis(ibz_mat_4x4_t *reduced, + ibz_mat_4x4_t *gram, + const quat_left_ideal_t *lideal, + const quat_alg_t *alg); // replaces lideal_lll /** - * @brief Element representing an isomorphism between I1 and I2 + * @brief Multplies two ideals and L2-reduces the lattice of the result * - * @returns 1 if isomorphic, 0 otherwise - * @param iso Output: algebra element such that I1*iso = I2. - * @param lideal1 left ideal - * @param lideal2 left ideal - * @param alg the quaternion algebra - * - * If I1 and I2 are isomorphic, set `iso` to an element of `alg` such that I1*iso = I2, - * and return 1. Otherwise return 0. + * Implements the L2 Algorithm of Nguyen-Stehlé, also known as fplll: + * https://iacr.org/archive/eurocrypt2005/34940217/34940217.pdf * - * I1 and I2 must have the same parent order (where "same" means they - * point to the same object), in order to be considered isomorphic. + * Parameters are in lll/lll_internals.h + * + * @param prod Output: The product ideal with its lattice basis being L2-reduced + * @param gram Output: Gram matrix of the reduced norm (as quadratic but not bilinear form) on the + * basis of prod, divided by the norm of prod + * @param lideal1 Ideal at left in the product + * @param lideal2 Ideal at right in the product + * @param alg The quaternion algebra */ -int quat_lideal_isom(quat_alg_elem_t *iso, const quat_left_ideal_t *lideal1, const quat_left_ideal_t *lideal2, const quat_alg_t *alg); +void quat_lideal_lideal_mul_reduced(quat_left_ideal_t *prod, + ibz_mat_4x4_t *gram, + const quat_left_ideal_t *lideal1, + const quat_left_ideal_t *lideal2, + const quat_alg_t *alg); /** - * @brief Right order of a left ideal + * @brief Replaces an ideal by a smaller equivalent one of prime norm * - * @param order Output: right order of the given ideal - * @param lideal left ideal - * @param alg the quaternion algebra + * @returns 1 if the computation succeeded and 0 otherwise + * @param lideal In- and Output: Ideal to be replaced + * @param alg The quaternion algebra + * @param primality_num_iter number of repetition for primality testing + * @param equiv_bound_coeff bound on the coefficients for the candidates */ -void quat_lideal_right_order(quat_order_t *order, const quat_left_ideal_t *lideal, const quat_alg_t *alg); - - -/** - * @brief LLL-reduce the basis of the left ideal, without considering its denominator - * - * This function reduce the basis of the lattice of the ideal, but it does completely ignore its denominator. - * So the outputs of this function must still e divided by the appropriate power of lideal.lattice.denom. - * - * @param reduced Output: Lattice defining the ideal, which has its basis in a lll-reduced form. Must be divided by lideal.lattice.denom before usage - * @param gram Output: gram matrix of the reduced basis. Must be divided by (lideal.lattice.denom)^2 before usage - * @param lideal Ideal whose basis will be reduced - * @param alg the quaternion algebra - */ -void quat_lideal_reduce_basis(ibz_mat_4x4_t *reduced, ibz_mat_4x4_t *gram, const quat_left_ideal_t *lideal, const quat_alg_t *alg); //replaces lideal_lll +int quat_lideal_prime_norm_reduced_equivalent(quat_left_ideal_t *lideal, + const quat_alg_t *alg, + const int primality_num_iter, + const int equiv_bound_coeff); /** @} -*/ + */ // end quat_lideal_f /** @} -*/ + */ - - -/***************************** Functions from quaternion_tools.c ***************************************/ - -/** @defgroup quat_order_op Operations on orders +/** @defgroup quat_normeq Functions specific to special extremal maximal orders * @{ -*/ + */ /** - * @brief Connecting ideal of 2 orders in the same algebra + * @brief Representing an integer by the quadratic norm form of a maximal extremal order * - * @param connecting_ideal Output: ideal which is a right ideal of O1 and a left ideal of O2 - * @param alg quaternion algebra - * @param order1 maximal order left of the searched ideal - * @param order2 order right of the searched ideal + * @returns 1 if the computation succeeded + * @param gamma Output: a quaternion element + * @param n_gamma Target norm of gamma. n_gamma must be odd. If n_gamma/(p*params.order->q) < + * 2^QUAT_repres_bound_input failure is likely + * @param non_diag If set to 1 (instead of 0) and the order is O0, an additional property is ensured + * @param params Represent integer parameters specifying the algebra, the special extremal order, + * the number of trials for finding gamma and the number of iterations of the primality test. + * Special requirements apply if non-diag is set to 1 + * + * This algorithm finds a primitive quaternion element gamma of n_gamma inside any maximal extremal + * order. Failure is possible. Most efficient for the standard order. + * + * If non-diag is set to 1,this algorithm finds a primitive quaternion element gamma with some + * special properties used in fixed degree isogeny of n_gamma inside any maximal extremal order such + * that params->order->q=1 mod 4. Failure is possible. Most efficient for the standard order. The + * most important property is to avoid diagonal isogenies, meaning that the gamma returned by the + * algorithm must not be contained inside ZZ + 2 O where O is the maximal order params->order When O + * is the special order O0 corresponding to j=1728, we further need to avoid endomorphisms of E0xE0 + * and there is another requirement + * + * If non-diag is set to 1, the number of trials for finding gamma (in params), the number of + * iterations of the primality test and the value of params->order->q is required to be 1 mod 4 */ -void quat_connecting_ideal(quat_left_ideal_t *connecting_ideal, const quat_order_t *order1, const quat_order_t *order2, const quat_alg_t *alg); +int quat_represent_integer(quat_alg_elem_t *gamma, + const ibz_t *n_gamma, + int non_diag, + const quat_represent_integer_params_t *params); + +/** @brief Basis change to (1,i,(i+j)/2,(1+ij)/2) for elements of O0 + * + * Change the basis in which an element is give from 1,i,j,ij to (1,i,(i+j)/2,(1+ij)/2) the ususal + * basis of the special maximal order O0 Only for elements of O0 + * + * @param vec Output: Coordinates of el in basis (1,i,(i+j)/2,(1+ij)/2) + * @param el Imput: An algebra element in O0 + */ +void quat_change_to_O0_basis(ibz_vec_4_t *vec, const quat_alg_elem_t *el); /** - * @brief LLL reduction on 4-dimensional lattice, coefficient is 0.99 + * @brief Random O0-ideal of given norm * - * @param red Output: LLL reduced basis - * @param lattice lattice with 4-dimensional basis - * @param q parameter q for non-standard basis - * @param precision floating-point precision for LLL algorithm, if 0 is provided a default precision is taken + * Much faster if norm is prime and is_prime is set to 1 + * + * @param lideal Output: O0-ideal of norm norm + * @param norm Norm of the ideal to be found + * @param is_prime Indicates if norm is prime: 1 if it is, 0 otherwise + * @param params Represent Integer parameters from the level-dependent constants + * @param prime_cofactor Prime distinct from the prime p defining the algebra but of similar size + * and coprime to norm. If is_prime is 1, it might be NULL. + * @returns 1 if success, 0 if no ideal found or randomness failed */ -int quat_lattice_lll(ibz_mat_4x4_t *red, const quat_lattice_t *lattice, const ibz_t *q, int precision); - +int quat_sampling_random_ideal_O0_given_norm(quat_left_ideal_t *lideal, + const ibz_t *norm, + int is_prime, + const quat_represent_integer_params_t *params, + const ibz_t *prime_cofactor); +// end quat_normeq /** @} -*/ - + */ // end quat_quat /** @} -*/ + */ #endif diff --git a/src/quaternion/ref/generic/intbig.c b/src/quaternion/ref/generic/intbig.c new file mode 100644 index 0000000..b0462dc --- /dev/null +++ b/src/quaternion/ref/generic/intbig.c @@ -0,0 +1,791 @@ +#include "intbig_internal.h" +#include +#include +#include +#include +#include +#include + +// #define DEBUG_VERBOSE + +#ifdef DEBUG_VERBOSE +#define DEBUG_STR_PRINTF(x) printf("%s\n", (x)); + +static void +DEBUG_STR_FUN_INT_MP(const char *op, int arg1, const ibz_t *arg2) +{ + int arg2_size = ibz_size_in_base(arg2, 16); + char arg2_str[arg2_size + 2]; + ibz_convert_to_str(arg2, arg2_str, 16); + + printf("%s,%x,%s\n", op, arg1, arg2_str); +} + +static void +DEBUG_STR_FUN_3(const char *op, const ibz_t *arg1, const ibz_t *arg2, const ibz_t *arg3) +{ + int arg1_size = ibz_size_in_base(arg1, 16); + char arg1_str[arg1_size + 2]; + ibz_convert_to_str(arg1, arg1_str, 16); + + int arg2_size = ibz_size_in_base(arg2, 16); + char arg2_str[arg2_size + 2]; + ibz_convert_to_str(arg2, arg2_str, 16); + + int arg3_size = ibz_size_in_base(arg3, 16); + char arg3_str[arg3_size + 2]; + ibz_convert_to_str(arg3, arg3_str, 16); + + printf("%s,%s,%s,%s\n", op, arg1_str, arg2_str, arg3_str); +} + +static void +DEBUG_STR_FUN_MP2_INT(const char *op, const ibz_t *arg1, const ibz_t *arg2, int arg3) +{ + int arg1_size = ibz_size_in_base(arg1, 16); + char arg1_str[arg1_size + 2]; + ibz_convert_to_str(arg1, arg1_str, 16); + + int arg2_size = ibz_size_in_base(arg2, 16); + char arg2_str[arg2_size + 2]; + ibz_convert_to_str(arg2, arg2_str, 16); + + printf("%s,%s,%s,%x\n", op, arg1_str, arg2_str, arg3); +} + +static void +DEBUG_STR_FUN_INT_MP2(const char *op, int arg1, const ibz_t *arg2, const ibz_t *arg3) +{ + int arg2_size = ibz_size_in_base(arg2, 16); + char arg2_str[arg2_size + 2]; + ibz_convert_to_str(arg2, arg2_str, 16); + + int arg3_size = ibz_size_in_base(arg3, 16); + char arg3_str[arg3_size + 2]; + ibz_convert_to_str(arg3, arg3_str, 16); + + if (arg1 >= 0) + printf("%s,%x,%s,%s\n", op, arg1, arg2_str, arg3_str); + else + printf("%s,-%x,%s,%s\n", op, -arg1, arg2_str, arg3_str); +} + +static void +DEBUG_STR_FUN_INT_MP_INT(const char *op, int arg1, const ibz_t *arg2, int arg3) +{ + int arg2_size = ibz_size_in_base(arg2, 16); + char arg2_str[arg2_size + 2]; + ibz_convert_to_str(arg2, arg2_str, 16); + + printf("%s,%x,%s,%x\n", op, arg1, arg2_str, arg3); +} + +static void +DEBUG_STR_FUN_4(const char *op, const ibz_t *arg1, const ibz_t *arg2, const ibz_t *arg3, const ibz_t *arg4) +{ + int arg1_size = ibz_size_in_base(arg1, 16); + char arg1_str[arg1_size + 2]; + ibz_convert_to_str(arg1, arg1_str, 16); + + int arg2_size = ibz_size_in_base(arg2, 16); + char arg2_str[arg2_size + 2]; + ibz_convert_to_str(arg2, arg2_str, 16); + + int arg3_size = ibz_size_in_base(arg3, 16); + char arg3_str[arg3_size + 2]; + ibz_convert_to_str(arg3, arg3_str, 16); + + int arg4_size = ibz_size_in_base(arg4, 16); + char arg4_str[arg4_size + 2]; + ibz_convert_to_str(arg4, arg4_str, 16); + + printf("%s,%s,%s,%s,%s\n", op, arg1_str, arg2_str, arg3_str, arg4_str); +} +#else +#define DEBUG_STR_PRINTF(x) +#define DEBUG_STR_FUN_INT_MP(op, arg1, arg2) +#define DEBUG_STR_FUN_3(op, arg1, arg2, arg3) +#define DEBUG_STR_FUN_INT_MP2(op, arg1, arg2, arg3) +#define DEBUG_STR_FUN_INT_MP_INT(op, arg1, arg2, arg3) +#define DEBUG_STR_FUN_4(op, arg1, arg2, arg3, arg4) +#endif + +/** @defgroup ibz_t Constants + * @{ + */ + +const __mpz_struct ibz_const_zero[1] = { + { + ._mp_alloc = 0, + ._mp_size = 0, + ._mp_d = (mp_limb_t[]){ 0 }, + } +}; + +const __mpz_struct ibz_const_one[1] = { + { + ._mp_alloc = 0, + ._mp_size = 1, + ._mp_d = (mp_limb_t[]){ 1 }, + } +}; + +const __mpz_struct ibz_const_two[1] = { + { + ._mp_alloc = 0, + ._mp_size = 1, + ._mp_d = (mp_limb_t[]){ 2 }, + } +}; + +const __mpz_struct ibz_const_three[1] = { + { + ._mp_alloc = 0, + ._mp_size = 1, + ._mp_d = (mp_limb_t[]){ 3 }, + } +}; + +void +ibz_init(ibz_t *x) +{ + mpz_init(*x); +} + +void +ibz_finalize(ibz_t *x) +{ + mpz_clear(*x); +} + +void +ibz_add(ibz_t *sum, const ibz_t *a, const ibz_t *b) +{ +#ifdef DEBUG_VERBOSE + ibz_t a_cp, b_cp; + ibz_init(&a_cp); + ibz_init(&b_cp); + ibz_copy(&a_cp, a); + ibz_copy(&b_cp, b); +#endif + mpz_add(*sum, *a, *b); +#ifdef DEBUG_VERBOSE + DEBUG_STR_FUN_3("ibz_add", sum, &a_cp, &b_cp); + ibz_finalize(&a_cp); + ibz_finalize(&b_cp); +#endif +} + +void +ibz_sub(ibz_t *diff, const ibz_t *a, const ibz_t *b) +{ +#ifdef DEBUG_VERBOSE + ibz_t a_cp, b_cp; + ibz_init(&a_cp); + ibz_init(&b_cp); + ibz_copy(&a_cp, a); + ibz_copy(&b_cp, b); +#endif + mpz_sub(*diff, *a, *b); + +#ifdef DEBUG_VERBOSE + DEBUG_STR_FUN_3("ibz_sub", diff, &a_cp, &b_cp); + ibz_finalize(&a_cp); + ibz_finalize(&b_cp); +#endif +} + +void +ibz_mul(ibz_t *prod, const ibz_t *a, const ibz_t *b) +{ +#ifdef DEBUG_VERBOSE + ibz_t a_cp, b_cp; + ibz_init(&a_cp); + ibz_init(&b_cp); + ibz_copy(&a_cp, a); + ibz_copy(&b_cp, b); +#endif + mpz_mul(*prod, *a, *b); +#ifdef DEBUG_VERBOSE + DEBUG_STR_FUN_3("ibz_mul", prod, &a_cp, &b_cp); + ibz_finalize(&a_cp); + ibz_finalize(&b_cp); +#endif +} + +void +ibz_neg(ibz_t *neg, const ibz_t *a) +{ + mpz_neg(*neg, *a); +} + +void +ibz_abs(ibz_t *abs, const ibz_t *a) +{ + mpz_abs(*abs, *a); +} + +void +ibz_div(ibz_t *quotient, ibz_t *remainder, const ibz_t *a, const ibz_t *b) +{ +#ifdef DEBUG_VERBOSE + ibz_t a_cp, b_cp; + ibz_init(&a_cp); + ibz_init(&b_cp); + ibz_copy(&a_cp, a); + ibz_copy(&b_cp, b); +#endif + mpz_tdiv_qr(*quotient, *remainder, *a, *b); +#ifdef DEBUG_VERBOSE + DEBUG_STR_FUN_4("ibz_div", quotient, remainder, &a_cp, &b_cp); + ibz_finalize(&a_cp); + ibz_finalize(&b_cp); +#endif +} + +void +ibz_div_2exp(ibz_t *quotient, const ibz_t *a, uint32_t exp) +{ +#ifdef DEBUG_VERBOSE + ibz_t a_cp; + ibz_init(&a_cp); + ibz_copy(&a_cp, a); +#endif + mpz_tdiv_q_2exp(*quotient, *a, exp); +#ifdef DEBUG_VERBOSE + DEBUG_STR_FUN_MP2_INT("ibz_div_2exp,%Zx,%Zx,%x\n", quotient, &a_cp, exp); + ibz_finalize(&a_cp); +#endif +} + +void +ibz_div_floor(ibz_t *q, ibz_t *r, const ibz_t *n, const ibz_t *d) +{ + mpz_fdiv_qr(*q, *r, *n, *d); +} + +void +ibz_mod(ibz_t *r, const ibz_t *a, const ibz_t *b) +{ + mpz_mod(*r, *a, *b); +} + +unsigned long int +ibz_mod_ui(const mpz_t *n, unsigned long int d) +{ + return mpz_fdiv_ui(*n, d); +} + +int +ibz_divides(const ibz_t *a, const ibz_t *b) +{ + return mpz_divisible_p(*a, *b); +} + +void +ibz_pow(ibz_t *pow, const ibz_t *x, uint32_t e) +{ + mpz_pow_ui(*pow, *x, e); +} + +void +ibz_pow_mod(ibz_t *pow, const ibz_t *x, const ibz_t *e, const ibz_t *m) +{ + mpz_powm(*pow, *x, *e, *m); + DEBUG_STR_FUN_4("ibz_pow_mod", pow, x, e, m); +} + +int +ibz_two_adic(ibz_t *pow) +{ + return mpz_scan1(*pow, 0); +} + +int +ibz_cmp(const ibz_t *a, const ibz_t *b) +{ + int ret = mpz_cmp(*a, *b); + DEBUG_STR_FUN_INT_MP2("ibz_cmp", ret, a, b); + return ret; +} + +int +ibz_is_zero(const ibz_t *x) +{ + int ret = !mpz_cmp_ui(*x, 0); + DEBUG_STR_FUN_INT_MP("ibz_is_zero", ret, x); + return ret; +} + +int +ibz_is_one(const ibz_t *x) +{ + int ret = !mpz_cmp_ui(*x, 1); + DEBUG_STR_FUN_INT_MP("ibz_is_one", ret, x); + return ret; +} + +int +ibz_cmp_int32(const ibz_t *x, int32_t y) +{ + int ret = mpz_cmp_si(*x, (signed long int)y); + DEBUG_STR_FUN_INT_MP_INT("ibz_cmp_int32", ret, x, y); + return ret; +} + +int +ibz_is_even(const ibz_t *x) +{ + int ret = !mpz_tstbit(*x, 0); + DEBUG_STR_FUN_INT_MP("ibz_is_even", ret, x); + return ret; +} + +int +ibz_is_odd(const ibz_t *x) +{ + int ret = mpz_tstbit(*x, 0); + DEBUG_STR_FUN_INT_MP("ibz_is_odd", ret, x); + return ret; +} + +void +ibz_set(ibz_t *i, int32_t x) +{ + mpz_set_si(*i, x); +} + +int +ibz_convert_to_str(const ibz_t *i, char *str, int base) +{ + if (!str || (base != 10 && base != 16)) + return 0; + + mpz_get_str(str, base, *i); + + return 1; +} + +void +ibz_print(const ibz_t *num, int base) +{ + assert(base == 10 || base == 16); + + int num_size = ibz_size_in_base(num, base); + char num_str[num_size + 2]; + ibz_convert_to_str(num, num_str, base); + printf("%s", num_str); +} + +int +ibz_set_from_str(ibz_t *i, const char *str, int base) +{ + return (1 + mpz_set_str(*i, str, base)); +} + +void +ibz_copy(ibz_t *target, const ibz_t *value) +{ + mpz_set(*target, *value); +} + +void +ibz_swap(ibz_t *a, ibz_t *b) +{ + mpz_swap(*a, *b); +} + +int32_t +ibz_get(const ibz_t *i) +{ +#if LONG_MAX == INT32_MAX + return (int32_t)mpz_get_si(*i); +#elif LONG_MAX > INT32_MAX + // Extracts the sign bit and the 31 least significant bits + signed long int t = mpz_get_si(*i); + return (int32_t)((t >> (sizeof(signed long int) * 8 - 32)) & INT32_C(0x80000000)) | (t & INT32_C(0x7FFFFFFF)); +#else +#error Unsupported configuration: LONG_MAX must be >= INT32_MAX +#endif +} + +int +ibz_rand_interval(ibz_t *rand, const ibz_t *a, const ibz_t *b) +{ + int randret; + int ret = 1; + mpz_t tmp; + mpz_t bmina; + mpz_init(bmina); + mpz_sub(bmina, *b, *a); + + if (mpz_sgn(bmina) == 0) { + mpz_set(*rand, *a); + mpz_clear(bmina); + return 1; + } + + size_t len_bits = mpz_sizeinbase(bmina, 2); + size_t len_bytes = (len_bits + 7) / 8; + size_t sizeof_limb = sizeof(mp_limb_t); + size_t sizeof_limb_bits = sizeof_limb * 8; + size_t len_limbs = (len_bytes + sizeof_limb - 1) / sizeof_limb; + + mp_limb_t mask = ((mp_limb_t)-1) >> (sizeof_limb_bits - len_bits) % sizeof_limb_bits; + mp_limb_t r[len_limbs]; + +#ifndef NDEBUG + { + for (size_t i = 0; i < len_limbs; ++i) + r[i] = (mp_limb_t)-1; + r[len_limbs - 1] = mask; + mpz_t check; + mpz_roinit_n(check, r, len_limbs); + assert(mpz_cmp(check, bmina) >= 0); // max sampled value >= b - a + mpz_t bmina2; + mpz_init(bmina2); + mpz_add(bmina2, bmina, bmina); + assert(mpz_cmp(check, bmina2) < 0); // max sampled value < 2 * (b - a) + mpz_clear(bmina2); + } +#endif + + do { + randret = randombytes((unsigned char *)r, len_bytes); + if (randret != 0) { + ret = 0; + goto err; + } +#ifdef TARGET_BIG_ENDIAN + for (size_t i = 0; i < len_limbs; ++i) + r[i] = BSWAP_DIGIT(r[i]); +#endif + r[len_limbs - 1] &= mask; + mpz_roinit_n(tmp, r, len_limbs); + if (mpz_cmp(tmp, bmina) <= 0) + break; + } while (1); + + mpz_add(*rand, tmp, *a); +err: + mpz_clear(bmina); + return ret; +} + +int +ibz_rand_interval_i(ibz_t *rand, int32_t a, int32_t b) +{ + uint32_t diff, mask; + int32_t rand32; + + if (!(a >= 0 && b >= 0 && b > a)) { + printf("a = %d b = %d\n", a, b); + } + assert(a >= 0 && b >= 0 && b > a); + + diff = b - a; + + // Create a mask with 1 + ceil(log2(diff)) least significant bits set +#if (defined(__GNUC__) || defined(__clang__)) && INT_MAX == INT32_MAX + mask = (1 << (32 - __builtin_clz((uint32_t)diff))) - 1; +#else + uint32_t diff2 = diff, tmp; + + mask = (diff2 > 0xFFFF) << 4; + diff2 >>= mask; + + tmp = (diff2 > 0xFF) << 3; + diff2 >>= tmp; + mask |= tmp; + + tmp = (diff2 > 0xF) << 2; + diff2 >>= tmp; + mask |= tmp; + + tmp = (diff2 > 0x3) << 1; + diff2 >>= tmp; + mask |= tmp; + + mask |= diff2 >> 1; + + mask = (1 << (mask + 1)) - 1; +#endif + + assert(mask >= diff && mask < 2 * diff); + + // Rejection sampling + do { + randombytes((unsigned char *)&rand32, sizeof(rand32)); + +#ifdef TARGET_BIG_ENDIAN + rand32 = BSWAP32(rand32); +#endif + + rand32 &= mask; + } while (rand32 > (int32_t)diff); + + rand32 += a; + ibz_set(rand, rand32); + + return 1; +} + +int +ibz_rand_interval_minm_m(ibz_t *rand, int32_t m) +{ + int ret = 1; + mpz_t m_big; + + // m_big = 2 * m + mpz_init_set_si(m_big, m); + mpz_add(m_big, m_big, m_big); + + // Sample in [0, 2*m] + ret = ibz_rand_interval(rand, &ibz_const_zero, &m_big); + + // Adjust to range [-m, m] + mpz_sub_ui(*rand, *rand, m); + + mpz_clear(m_big); + + return ret; +} + +int +ibz_rand_interval_bits(ibz_t *rand, uint32_t m) +{ + int ret = 1; + mpz_t tmp; + mpz_t low; + mpz_init_set_ui(tmp, 1); + mpz_mul_2exp(tmp, tmp, m); + mpz_init(low); + mpz_neg(low, tmp); + ret = ibz_rand_interval(rand, &low, &tmp); + mpz_clear(tmp); + mpz_clear(low); + if (ret != 1) + goto err; + mpz_sub_ui(*rand, *rand, (unsigned long int)m); + return ret; +err: + mpz_clear(tmp); + mpz_clear(low); + return ret; +} + +int +ibz_bitsize(const ibz_t *a) +{ + return (int)mpz_sizeinbase(*a, 2); +} + +int +ibz_size_in_base(const ibz_t *a, int base) +{ + return (int)mpz_sizeinbase(*a, base); +} + +void +ibz_copy_digits(ibz_t *target, const digit_t *dig, int dig_len) +{ + mpz_import(*target, dig_len, -1, sizeof(digit_t), 0, 0, dig); +} + +void +ibz_to_digits(digit_t *target, const ibz_t *ibz) +{ + // From the GMP documentation: + // "If op is zero then the count returned will be zero and nothing written to rop." + // The next line ensures zero is written to the first limb of target if ibz is zero; + // target is then overwritten by the actual value if it is not. + target[0] = 0; + mpz_export(target, NULL, -1, sizeof(digit_t), 0, 0, *ibz); +} + +int +ibz_probab_prime(const ibz_t *n, int reps) +{ + int ret = mpz_probab_prime_p(*n, reps); + DEBUG_STR_FUN_INT_MP_INT("ibz_probab_prime", ret, n, reps); + return ret; +} + +void +ibz_gcd(ibz_t *gcd, const ibz_t *a, const ibz_t *b) +{ + mpz_gcd(*gcd, *a, *b); +} + +int +ibz_invmod(ibz_t *inv, const ibz_t *a, const ibz_t *mod) +{ + return (mpz_invert(*inv, *a, *mod) ? 1 : 0); +} + +int +ibz_legendre(const ibz_t *a, const ibz_t *p) +{ + return mpz_legendre(*a, *p); +} + +int +ibz_sqrt(ibz_t *sqrt, const ibz_t *a) +{ + if (mpz_perfect_square_p(*a)) { + mpz_sqrt(*sqrt, *a); + return 1; + } else { + return 0; + } +} + +void +ibz_sqrt_floor(ibz_t *sqrt, const ibz_t *a) +{ + mpz_sqrt(*sqrt, *a); +} + +int +ibz_sqrt_mod_p(ibz_t *sqrt, const ibz_t *a, const ibz_t *p) +{ +#ifndef NDEBUG + assert(ibz_probab_prime(p, 100)); +#endif + // Case a = 0 + { + ibz_t test; + ibz_init(&test); + ibz_mod(&test, a, p); + if (ibz_is_zero(&test)) { + ibz_set(sqrt, 0); + } + ibz_finalize(&test); + } +#ifdef DEBUG_VERBOSE + ibz_t a_cp, p_cp; + ibz_init(&a_cp); + ibz_init(&p_cp); + ibz_copy(&a_cp, a); + ibz_copy(&p_cp, p); +#endif + + mpz_t amod, tmp, exp, a4, a2, q, z, qnr, x, y, b, pm1; + mpz_init(amod); + mpz_init(tmp); + mpz_init(exp); + mpz_init(a4); + mpz_init(a2); + mpz_init(q); + mpz_init(z); + mpz_init(qnr); + mpz_init(x); + mpz_init(y); + mpz_init(b); + mpz_init(pm1); + + int ret = 1; + + mpz_mod(amod, *a, *p); + if (mpz_cmp_ui(amod, 0) < 0) { + mpz_add(amod, *p, amod); + } + + if (mpz_legendre(amod, *p) != 1) { + ret = 0; + goto end; + } + + mpz_sub_ui(pm1, *p, 1); + + if (mpz_mod_ui(tmp, *p, 4) == 3) { + // p % 4 == 3 + mpz_add_ui(tmp, *p, 1); + mpz_fdiv_q_2exp(tmp, tmp, 2); + mpz_powm(*sqrt, amod, tmp, *p); + } else if (mpz_mod_ui(tmp, *p, 8) == 5) { + // p % 8 == 5 + mpz_sub_ui(tmp, *p, 1); + mpz_fdiv_q_2exp(tmp, tmp, 2); + mpz_powm(tmp, amod, tmp, *p); // a^{(p-1)/4} mod p + if (!mpz_cmp_ui(tmp, 1)) { + mpz_add_ui(tmp, *p, 3); + mpz_fdiv_q_2exp(tmp, tmp, 3); + mpz_powm(*sqrt, amod, tmp, *p); // a^{(p+3)/8} mod p + } else { + mpz_sub_ui(tmp, *p, 5); + mpz_fdiv_q_2exp(tmp, tmp, 3); // (p - 5) / 8 + mpz_mul_2exp(a4, amod, 2); // 4*a + mpz_powm(tmp, a4, tmp, *p); + + mpz_mul_2exp(a2, amod, 1); + mpz_mul(tmp, a2, tmp); + mpz_mod(*sqrt, tmp, *p); + } + } else { + // p % 8 == 1 -> Shanks-Tonelli + int e = 0; + mpz_sub_ui(q, *p, 1); + while (mpz_tstbit(q, e) == 0) + e++; + mpz_fdiv_q_2exp(q, q, e); + + // 1. find generator - non-quadratic residue + mpz_set_ui(qnr, 2); + while (mpz_legendre(qnr, *p) != -1) + mpz_add_ui(qnr, qnr, 1); + mpz_powm(z, qnr, q, *p); + + // 2. Initialize + mpz_set(y, z); + mpz_powm(y, amod, q, *p); // y = a^q mod p + + mpz_add_ui(tmp, q, 1); // tmp = (q + 1) / 2 + mpz_fdiv_q_2exp(tmp, tmp, 1); + + mpz_powm(x, amod, tmp, *p); // x = a^(q + 1)/2 mod p + + mpz_set_ui(exp, 1); + mpz_mul_2exp(exp, exp, e - 2); + + for (int i = 0; i < e; ++i) { + mpz_powm(b, y, exp, *p); + + if (!mpz_cmp(b, pm1)) { + mpz_mul(x, x, z); + mpz_mod(x, x, *p); + + mpz_mul(y, y, z); + mpz_mul(y, y, z); + mpz_mod(y, y, *p); + } + + mpz_powm_ui(z, z, 2, *p); + mpz_fdiv_q_2exp(exp, exp, 1); + } + + mpz_set(*sqrt, x); + } + +#ifdef DEBUG_VERBOSE + DEBUG_STR_FUN_3("ibz_sqrt_mod_p", sqrt, &a_cp, &p_cp); + ibz_finalize(&a_cp); + ibz_finalize(&p_cp); +#endif + +end: + mpz_clear(amod); + mpz_clear(tmp); + mpz_clear(exp); + mpz_clear(a4); + mpz_clear(a2); + mpz_clear(q); + mpz_clear(z); + mpz_clear(qnr); + mpz_clear(x); + mpz_clear(y); + mpz_clear(b); + mpz_clear(pm1); + + return ret; +} diff --git a/src/quaternion/ref/generic/integers.c b/src/quaternion/ref/generic/integers.c index db91a83..ec7cda0 100644 --- a/src/quaternion/ref/generic/integers.c +++ b/src/quaternion/ref/generic/integers.c @@ -1,319 +1,116 @@ #include #include "internal.h" #include +#include +#include -//Small helper for integers -void ibz_rounded_div(ibz_t *q, const ibz_t *a, const ibz_t *b){ - ibz_t r,sign_q, abs_b; - ibz_init(&r); - ibz_init(&sign_q); - ibz_init(&abs_b); +// Random prime generation for tests +int +ibz_generate_random_prime(ibz_t *p, int is3mod4, int bitsize, int probability_test_iterations) +{ + assert(bitsize != 0); + int found = 0; + ibz_t two_pow, two_powp; - //assumed to round towards 0 - ibz_abs(&abs_b,b); - // q is of same sign as a*b (and 0 if a is 0) - ibz_mul(&sign_q,a,b); - ibz_div(q,&r,a,b); - ibz_abs(&r,&r); - ibz_add(&r,&r,&r); - if(ibz_cmp(&r,&abs_b)>0){ - ibz_set(&r,0); - if(ibz_cmp(&sign_q,&r)<0){ - ibz_set(&sign_q,-1); - } else { - ibz_set(&sign_q,1); + ibz_init(&two_pow); + ibz_init(&two_powp); + ibz_pow(&two_pow, &ibz_const_two, (bitsize - 1) - (0 != is3mod4)); + ibz_pow(&two_powp, &ibz_const_two, bitsize - (0 != is3mod4)); + + int cnt = 0; + while (!found) { + cnt++; + if (cnt % 100000 == 0) { + printf("Random prime generation is still running after %d attempts, this is not " + "normal! The expected number of attempts is %d \n", + cnt, + bitsize); } - ibz_add(q,q,&sign_q); - } - ibz_finalize(&r); - ibz_finalize(&sign_q); - ibz_finalize(&abs_b); + ibz_rand_interval(p, &two_pow, &two_powp); + ibz_add(p, p, p); + if (is3mod4) { + ibz_add(p, p, p); + ibz_add(p, &ibz_const_two, p); + } + ibz_add(p, &ibz_const_one, p); + + found = ibz_probab_prime(p, probability_test_iterations); + } + ibz_finalize(&two_pow); + ibz_finalize(&two_powp); + return found; } - -// this function assumes that there is a sqrt of -1 mod p and p is prime -//algorithm read at http://www.lix.polytechnique.fr/Labo/Francois.Morain/Articles/cornac.pdf, on 2nd of may 2023, 14h45 CEST -int ibz_cornacchia_prime(ibz_t *x, ibz_t *y, const ibz_t *n, const ibz_t *p){ - int res = 1; - ibz_t two, r0, r1, r2, a, x0, prod; +// solves x^2 + n y^2 == p for positive integers x, y +// assumes that p is prime and -n mod p is a square +int +ibz_cornacchia_prime(ibz_t *x, ibz_t *y, const ibz_t *n, const ibz_t *p) +{ + ibz_t r0, r1, r2, a, prod; ibz_init(&r0); ibz_init(&r1); ibz_init(&r2); ibz_init(&a); ibz_init(&prod); - ibz_init(&two); + + int res = 0; // manage case p = 2 separately - ibz_set(&two,2); - int test = ibz_cmp(p,&two); - if(test==0){ - if (ibz_is_one(n)){ - ibz_set(x,1); - ibz_set(y,1); + if (!ibz_cmp(p, &ibz_const_two)) { + if (ibz_is_one(n)) { + ibz_set(x, 1); + ibz_set(y, 1); res = 1; - } else { - res = 0; } + goto done; + } + // manage case p = n separately + if (!ibz_cmp(p, n)) { + ibz_set(x, 0); + ibz_set(y, 1); + res = 1; + goto done; } - - //test coprimality (should always be ok in our cases) - ibz_gcd(&r2,p,n); - if (ibz_is_one(&r2) && (test != 0)){ - // get sqrt of -n mod p - ibz_set(&r2,0); - ibz_sub(&r2,&r2,n); - res = res && ibz_sqrt_mod_p(&r2,&r2,p); - if (res){ - // run loop - ibz_copy(&prod,p); - ibz_copy(&r1,p); - while(ibz_cmp(&prod,p)>=0){ - ibz_div(&a,&r0,&r2,&r1); - ibz_mul(&prod,&r0,&r0); - ibz_copy(&r2,&r1); - ibz_copy(&r1,&r0); - } - // test if result is solution - ibz_sub(&a,p,&prod); - ibz_div(&a,&r2,&a,n); - res = res && (ibz_is_zero(&r2)); - res = res && ibz_sqrt(y,&a); - if (res){ - ibz_copy(x,&r0); - ibz_mul(&a,y,y); - ibz_mul(&a,&a,n); - ibz_add(&prod,&prod,&a); - res = res && (0==ibz_cmp(&prod,p)); - } - } + // test coprimality (should always be ok in our cases) + ibz_gcd(&r2, p, n); + if (!ibz_is_one(&r2)) + goto done; + + // get sqrt of -n mod p + ibz_neg(&r2, n); + if (!ibz_sqrt_mod_p(&r2, &r2, p)) + goto done; + + // run loop + ibz_copy(&prod, p); + ibz_copy(&r1, p); + ibz_copy(&r0, p); + while (ibz_cmp(&prod, p) >= 0) { + ibz_div(&a, &r0, &r2, &r1); + ibz_mul(&prod, &r0, &r0); + ibz_copy(&r2, &r1); + ibz_copy(&r1, &r0); } + // test if result is solution + ibz_sub(&a, p, &prod); + ibz_div(&a, &r2, &a, n); + if (!ibz_is_zero(&r2)) + goto done; + if (!ibz_sqrt(y, &a)) + goto done; + + ibz_copy(x, &r0); + ibz_mul(&a, y, y); + ibz_mul(&a, &a, n); + ibz_add(&prod, &prod, &a); + res = !ibz_cmp(&prod, p); + +done: ibz_finalize(&r0); ibz_finalize(&r1); ibz_finalize(&r2); ibz_finalize(&a); ibz_finalize(&prod); - ibz_finalize(&two); - return(res); -} - -int ibz_cornacchia_special_prime(ibz_t *x, ibz_t *y, const ibz_t *n, const ibz_t *p, const int exp_adjust){ - int res = 1; - ibz_t two, r0, r1, r2, a, x0, prod; - ibz_t p4; - ibz_t test_square; - ibz_init(&test_square); - ibz_init(&r0); - ibz_init(&r1); - ibz_init(&r2); - ibz_init(&a); - ibz_init(&prod); - ibz_init(&two); - ibz_init(&p4); - ibz_set(&two,2); - ibz_pow(&p4,&two,exp_adjust); - ibz_mul(&p4,p,&p4); - - assert(exp_adjust>0); - -#ifndef NDEBUG - ibz_set(&r0,3); - ibz_set(&r1,4); - ibz_mod(&r2,n,&r1); - assert((ibz_cmp(&r2,&r0)==0)); - ibz_set(&r0,0); - ibz_set(&r1,0); - ibz_set(&r2,0); -#endif - - // manage case p = 2 separately - int test = ibz_cmp(p,&two); - if(test==0){ - if (ibz_is_one(n)){ - ibz_set(x,1); - ibz_set(y,1); - res = 1; - } else { - res = 0; - } - } - - //test coprimality (should always be ok in our cases) - ibz_gcd(&r2,p,n); - if (ibz_is_one(&r2) && (test != 0)){ - - // get sqrt of -n mod p - ibz_set(&r2,0); - ibz_sub(&r2,&r2,n); - res = res && ibz_sqrt_mod_p(&r2,&r2,p); - res = res && (ibz_get(&r2)%2 != 0); - - - ibz_mul(&test_square,&r2,&r2); - ibz_add(&test_square,&test_square,n); - ibz_mod(&test_square,&test_square,&p4); - res = res && ibz_is_zero(&test_square); - if (res){ - // run loop - ibz_copy(&prod,&p4); - ibz_copy(&r1,&p4); - while(ibz_cmp(&prod,&p4)>=0){ - ibz_div(&a,&r0,&r2,&r1); - ibz_mul(&prod,&r0,&r0); - ibz_copy(&r2,&r1); - ibz_copy(&r1,&r0); - } - // test if result is solution - ibz_sub(&a,&p4,&prod); - ibz_div(&a,&r2,&a,n); - res = res && ibz_is_zero(&r2); - res = res && ibz_sqrt(y,&a); - if (res){ - ibz_copy(x,&r0); - ibz_mul(&a,y,y); - ibz_mul(&a,&a,n); - ibz_add(&prod,&prod,&a); - res = res && (0==ibz_cmp(&prod,&p4)); - } - } - } - ibz_finalize(&r0); - ibz_finalize(&r1); - ibz_finalize(&r2); - ibz_finalize(&a); - ibz_finalize(&prod); - ibz_finalize(&two); - ibz_finalize(&p4); - ibz_finalize(&test_square); - return(res); -} - -//returns complex product of a and b -void ibz_complex_mul(ibz_t *re_res, ibz_t *im_res, const ibz_t *re_a, const ibz_t *im_a, const ibz_t *re_b, const ibz_t *im_b){ - ibz_t prod, re, im; - ibz_init(&prod); - ibz_init(&re); - ibz_init(&im); - ibz_mul(&re, re_a,re_b); - ibz_mul(&prod, im_a, im_b); - ibz_sub(&re,&re,&prod); - ibz_mul(&im, re_a,im_b); - ibz_mul(&prod, im_a, re_b); - ibz_add(&im,&im,&prod); - ibz_copy(im_res,&im); - ibz_copy(re_res,&re); - ibz_finalize(&prod); - ibz_finalize(&re); - ibz_finalize(&im); -} - -//multiplies res by a^e with res and a integer complex numbers -void ibz_complex_mul_by_complex_power(ibz_t *re_res, ibz_t *im_res, const ibz_t *re_a, const ibz_t *im_a, int64_t exp){ - ibz_t re_x,im_x; - ibz_init(&re_x); - ibz_init(&im_x); - ibz_set(&re_x,1); - ibz_set(&im_x,0); - for (int i = 0; i < 64; i++){ - ibz_complex_mul(&re_x,&im_x,&re_x,&im_x,&re_x,&im_x); - if((exp>>(63-i)) & 1){ - ibz_complex_mul(&re_x,&im_x,&re_x,&im_x,re_a,im_a); - } - } - ibz_complex_mul(re_res,im_res,re_res,im_res,&re_x,&im_x); - ibz_finalize(&re_x); - ibz_finalize(&im_x); -} - -//multiplies to res the result of the solutions of cornacchia for prime depending on valuation val (prime-adic valuation) -int ibz_cornacchia_extended_prime_loop(ibz_t *re_res, ibz_t *im_res, int64_t prime, int64_t val){ - ibz_t re, im, p, n; - ibz_init(&re); - ibz_init(&im); - ibz_init(&p); - ibz_init(&n); - ibz_set(&n,1); - ibz_set(&p, prime); - int res = ibz_cornacchia_prime(&re,&im,&n,&p); - if(res){ - ibz_complex_mul_by_complex_power(re_res, im_res, &re, &im, val); - } - ibz_finalize(&re); - ibz_finalize(&im); - ibz_finalize(&p); - ibz_finalize(&n); - return(res); -} - -int ibz_cornacchia_extended(ibz_t *x, ibz_t *y, const ibz_t *n, const short *prime_list, const int prime_list_length, short primality_test_iterations, const ibz_t *bad_primes_prod){ - int res = 1; - ibz_t four, one, nodd, q, r, p; - ibz_init(&four); - ibz_init(&one); - ibz_init(&nodd); - ibz_init(&r); - ibz_init(&q); - ibz_init(&p); - int64_t *valuations = malloc(prime_list_length*sizeof(int64_t)); - ibz_set(&four,4); - ibz_set(&one,1); - - // if a prime which is 3 mod 4 divides n, extended Cornacchia can't solve the equation - if(bad_primes_prod != NULL){ - ibz_gcd(&q,n,bad_primes_prod); - if(!ibz_is_one(&q)){ - res = 0; - } - } - - if(res){ - // get the valuations and the unfactored part by attempting division by all given primes - ibz_copy(&nodd,n); - for (int i = 0; i < prime_list_length; i++){ - valuations[i] = 0; - if (((*(prime_list + i) % 4) == 1) || (i == 0)){ - ibz_set(&r, 0); - ibz_set(&p, *(prime_list + i)); - ibz_copy(&q,&nodd); - while(ibz_is_zero(&r)){ - valuations[i] +=1; - ibz_copy(&nodd,&q); - ibz_div(&q,&r,&nodd,&p); - } - valuations[i] -=1; - } - } - - // compute the remainder mod 4 - ibz_mod(&r,&nodd,&four); - if (ibz_is_one(&r)){ // we hope the 'unfactored' part is a prime 1 mod 4 - if (ibz_probab_prime(&nodd, primality_test_iterations) || ibz_is_one(&nodd)){ - if (ibz_is_one(&nodd)){ // the unfactored part is 1 - ibz_set(x,1); - ibz_set(y,0); - } else { // the 'unfactored' part is prime, can use Cornacchia - res = res && ibz_cornacchia_prime(x,y,&one, &nodd); - } - if (res == 1){ // no need to continue if failure here - for (int i = 0; i < prime_list_length; i++){ - if (valuations[i] != 0){ - res = res && ibz_cornacchia_extended_prime_loop(x, y, prime_list[i], valuations[i]); - } - } - } - } else { - res = 0; - } - } else { - res = 0; - } - } - free(valuations); - ibz_finalize(&four); - ibz_finalize(&one); - ibz_finalize(&nodd); - ibz_finalize(&r); - ibz_finalize(&q); - ibz_finalize(&p); - return(res); + return res; } diff --git a/src/quaternion/ref/generic/internal.h b/src/quaternion/ref/generic/internal.h deleted file mode 100644 index da3fc00..0000000 --- a/src/quaternion/ref/generic/internal.h +++ /dev/null @@ -1,740 +0,0 @@ -/** @file - * - * @authors Sina Schaeffler - * - * @brief Declarations for helper functions for quaternion algebra implementation - */ - -#ifndef QUAT_HELPER_H -#define QUAT_HELPER_H - -#include - -/** @internal - * @ingroup quat_quat - * @defgroup quat_helpers Quaternion module internal functions - * @{ - */ - - -/** @internal - * @defgroup quat_alg_helpers Helper functions for the alg library - * @{ - */ - -/** @internal - * @brief helper function for initializing small quaternion algebras. - */ -static inline void quat_alg_init_set_ui(quat_alg_t *alg, unsigned int p) { - ibz_t bp; - ibz_init(&bp); - ibz_set(&bp, p); - quat_alg_init_set(alg, &bp); - ibz_finalize(&bp); -} - -/** @brief a+b - * - * Add two integer 4-vectors - * - * @param res Output: Will contain sum - * @param a - * @param b - */ -void quat_alg_coord_add(quat_alg_coord_t *res, const quat_alg_coord_t *a, const quat_alg_coord_t *b); - -/** @brief a-b - * - * Substract two integer 4-vectors - * - * @param res Output: Will contain difference - * @param a - * @param b - */ -void quat_alg_coord_sub(quat_alg_coord_t *res, const quat_alg_coord_t *a, const quat_alg_coord_t *b); - -/** @brief Compute same denominator form of two quaternion algebra elements - * - * res_a=a and res_b=b (representing the same element) and res_a.denom = res_b.denom - * - * @param res_a - * @param res_b - * @param a - * @param b - */ -void quat_alg_equal_denom(quat_alg_elem_t *res_a, quat_alg_elem_t *res_b, const quat_alg_elem_t *a, const quat_alg_elem_t *b); - -/** @brief Copies the given values into an algebra element, without normalizing it - * - * @param elem Output: algebra element of coordinates [coord0,coord1,coord2,coord3] and denominator denom - * @param denom Denominator, must be non zero - * @param coord0 Coordinate on 1 (0th vector of standard algebra basis) - * @param coord1 Coordinate on i (1st vector of standard algebra basis) - * @param coord2 Coordinate on j (2nd vector of standard algebra basis) - * @param coord3 Coordinate on ij (3rd vector of standard algebra basis) - */ -void quat_alg_elem_copy_ibz(quat_alg_elem_t *elem, const ibz_t *denom, const ibz_t *coord0, const ibz_t *coord1, const ibz_t *coord2, const ibz_t *coord3); - -/** @brief Sets an algebra element to the given integer values, without normalizing it - * - * @param elem Output: algebra element of coordinates [coord0,coord1,coord2,coord3] and denominator denom - * @param denom Denominator, must be non zero - * @param coord0 Coordinate on 1 (0th vector of standard algebra basis) - * @param coord1 Coordinate on i (1st vector of standard algebra basis) - * @param coord2 Coordinate on j (2nd vector of standard algebra basis) - * @param coord3 Coordinate on ij (3rd vector of standard algebra basis) - */ -void quat_alg_elem_set(quat_alg_elem_t *elem, int64_t denom, int64_t coord0, int64_t coord1, int64_t coord2, int64_t coord3); - -/** @brief Multiplies algebra element by integer scalar, without normalizing it - * - * @param res Output - * @param scalar Integer - * @param elem Algebra element - */ -void quat_alg_elem_mul_by_scalar(quat_alg_elem_t *res, const ibz_t *scalar, const quat_alg_elem_t *elem); - -/** @brief Compute the right multiplication table of a quaternion (without denominator) - * - * @param mulmat Output - * @param a Quaternion - * @param alg The algebra - */ -void quat_alg_rightmul_mat(ibz_mat_4x4_t *mulmat, const quat_alg_elem_t *a, const quat_alg_t *alg); -/** @} - */ - -/** @internal - * @defgroup quat_int_helpers Helper functions for integer functions - * @{ - */ - -/** @internal - * @defgroup quat_int_small_helpers Small integer functions - * @{ - */ - -/** @brief round a/b to closest integer q - */ -void ibz_rounded_div(ibz_t *q, const ibz_t *a, const ibz_t *b); - -/** @brief Compare ibz_t with long - */ -static int ibz_cmp_si(ibz_t *x, int64_t y) { - ibz_t Y; - ibz_init(&Y); - ibz_set(&Y, y); - int res = ibz_cmp(x, &Y); - ibz_finalize(&Y); - return res; -} -/** @} - */ - -/** @internal - * @defgroup quat_cornacchia_helpers Helper functions for the cornacchia function - * @{ - */ - -/** @brief Complex product of a and b - * - * re_res + i*im_res = (re_a+i*im_a)*(re_b+i*im_b) where i a usual complex 4th root of unity - * - * @param re_res Output: real part of the result - * @param im_res Output: imaginary part of the result - * @param re_a Real part of a - * @param im_a Imaginary part of a - * @param re_b Real part of b - * @param im_b Imaginary part of b - */ -void ibz_complex_mul(ibz_t *re_res, ibz_t *im_res, const ibz_t *re_a, const ibz_t *im_a, const ibz_t *re_b, const ibz_t *im_b); - -/** @brief Multiplies res by a^e with res and a integer complex numbers - * - * re_res + i*im_res = (re_res+i*im_res)*((re_a+i*im_a)^exp) where i a usual complex 4th root of unity - * - * @param re_res Output: real part of the result. Also used as input. - * @param im_res Output: imaginary part of the result. Also used as input. - * @param re_a Real part of a - * @param im_a Imaginary part of a - * @param exp res*(a^exp) will be computed, exp should be a positive integer or 0 - */ -void ibz_complex_mul_by_complex_power(ibz_t *re_res, ibz_t *im_res, const ibz_t *re_a, const ibz_t *im_a, int64_t exp); - -/** @brief Multiplies to res the result of the solutions of cornacchia for prime depending on valuation val (prime-adic valuation) - * - * re_res + i*im_res = (re_res+i*im_res)*((x+i*y)^val) where i a usual complex 4th root of unity, and x,y an integer sulotion to x^2 + y^2 = prime - * - * @param re_res Output: real part of the result. Also used as input. - * @param im_res Output: imaginary part of the result. Also used as input. - * @param prime a prime factor of n on which extended Cornacchia was called - * @param val prime-adic valuation of the n on which extended Cornacchia was called - * @returns 1 if an integer solution x,y to x^2 + y^2 = prime was found by Cornacchia_prime, 0 otherwise - */ -int ibz_cornacchia_extended_prime_loop(ibz_t *re_res, ibz_t *im_res, int64_t prime, int64_t val); -/** @} - */ -/** @} - */ - -/** @internal - * @defgroup quat_dim4_helpers Helper functions for functions for matrices or vectors in dimension 4 - * @{ - */ - -/** @internal - * @defgroup quat_inv_helpers Helper functions for the integer matrix inversion function - * @{ - */ - -/** @brief a1a2+b1b2+c1c2 - * - * @param coeff Output: The coefficien which was computed as a1a2+b1b2-c1c2 - * @param a1 - * @param a2 - * @param b1 - * @param b2 - * @param c1 - * @param c2 - */ -void ibz_inv_dim4_make_coeff_pmp(ibz_t *coeff, const ibz_t *a1, const ibz_t *a2, const ibz_t *b1, const ibz_t *b2, const ibz_t *c1, const ibz_t *c2); - -/** @brief -a1a2+b1b2-c1c2 - * - * @param coeff Output: The coefficien which was computed as -a1a2+b1b2-c1c2 - * @param a1 - * @param a2 - * @param b1 - * @param b2 - * @param c1 - * @param c2 - */ -void ibz_inv_dim4_make_coeff_mpm(ibz_t *coeff, const ibz_t *a1, const ibz_t *a2, const ibz_t *b1, const ibz_t *b2, const ibz_t *c1, const ibz_t *c2); - -/** @brief Matrix determinant and a matrix inv such that inv/det is the inverse matrix of the input - * - * Implemented following the methof of 2x2 minors explained at Method from https://www.geometrictools.com/Documentation/LaplaceExpansionTheorem.pdf (visited on 3rd of May 2023, 16h15 CEST) - * - * @returns 1 if the determinant of mat is not 0 and an inverse was computed, 0 otherwise - * @param inv Output: Will contain an integer matrix which, dividet by det, will yield the rational inverse of the matrix if it exists, can be NULL - * @param det Output: Will contain the determinant of the input matrix, can be NULL - * @param mat Matrix of which the inverse will be computed - */ -int ibz_mat_4x4_inv_with_det_as_denom(ibz_mat_4x4_t *inv, ibz_t *det, const ibz_mat_4x4_t *mat); - -/** @brief a*b for a,b integer 4x4 matrices - * - * Naive implementation - * - * @param res Output: A 4x4 integer matrix - * @param a - * @param b - */ -void ibz_mat_4x4_mul(ibz_mat_4x4_t *res, const ibz_mat_4x4_t *a, const ibz_mat_4x4_t *b); -/** @} - */ - -/** @internal - * @defgroup quat_lll_verify_helpers Helper functions for lll verification in dimension 4 - * @{ - */ - -/** @brief Set an ibq vector to 4 given integer coefficients - */ -void ibq_vec_4_copy_ibz(ibq_t (*vec)[4], const ibz_t *coeff0, const ibz_t *coeff1,const ibz_t *coeff2,const ibz_t *coeff3); - -/** @brief Bilinear form vec00*vec10+vec01*vec11+q*vec02*vec12+q*vec03*vec13 for ibz_q - */ -void quat_dim4_lll_bilinear(ibq_t *b, const ibq_t (*vec0)[4], const ibq_t (*vec1)[4], const ibz_t *q); - -/** @brief Outputs the transposition of the orthogonalised matrix of mat (as fractions) - * - * For the bilinear form vec00*vec10+vec01*vec11+q*vec02*vec12+q*vec03*vec13 - */ -void quat_dim4_gram_schmidt_transposed_with_ibq(ibq_t (*orthogonalised_transposed)[4][4], const ibz_mat_4x4_t *mat, const ibz_t *q); - -/** @brief Verifies if mat is lll-reduced for parameter coeff and norm defined by q - * - * For the bilinear form vec00*vec10+vec01*vec11+q*vec02*vec12+q*vec03*vec13 - */ -int quat_dim4_lll_verify(const ibz_mat_4x4_t *mat, const ibq_t *coeff, const ibz_t *q); -/** @} - */ - -/** @internal - * @defgroup quat_dim4_lat_helpers Helper functions on vectors and matrices used mainly for lattices - * @{ - */ - -/** @brief Set a vector of 4 integers to given values - * - * @param vec Output: is set to given coordinates - * @param coord0 - * @param coord1 - * @param coord2 - * @param coord3 - */ -void ibz_vec_4_set(ibz_vec_4_t *vec, int64_t coord0, int64_t coord1, int64_t coord2, int64_t coord3); - -/** @brief Copy all values from one vector to another - * - * @param new Output: is set to same values as vec - * @param vec - */ -void ibz_vec_4_copy(ibz_vec_4_t *new, const ibz_vec_4_t *vec); - -/** @brief Compute the linear combination lc = coeff_a vec_a + coeff_b vec_b - * - * @param lc Output: linear combination lc = coeff_a vec_a + coeff_b vec_b - * @param coeff_a Scalar multiplied to vec_a - * @param vec_a - * @param coeff_b Scalar multiplied to vec_b - * @param vec_b - */ -void ibz_vec_4_linear_combination(ibz_vec_4_t *lc, const ibz_t *coeff_a, const ibz_vec_4_t *vec_a, const ibz_t *coeff_b, const ibz_vec_4_t *vec_b); - -/** @brief divides all values in vector by same scalar - * - * @returns 1 if scalar divided all values in mat, 0 otherwise (division is performed in both cases) - * @param quot Output - * @param scalar - * @param vec - */ -int ibz_vec_4_scalar_div(ibz_vec_4_t *quot, const ibz_t *scalar, const ibz_vec_4_t *vec); - -/** @brief Negation for vectors of 4 integers - * - * @param neg Output: is set to -vec - * @param vec - */ -void ibz_vec_4_negate(ibz_vec_4_t *neg, const ibz_vec_4_t *vec); - -/** @brief Copies all values from a 4x4 integer matrix to another one - * - * @param new Output: matrix which will have its entries set to mat's entries - * @param mat Input matrix - */ -void ibz_mat_4x4_copy(ibz_mat_4x4_t *new, const ibz_mat_4x4_t *mat); - -/** @brief -mat for mat a 4x4 integer matrix - * - * @param neg Output: is set to -mat - * @param mat Input matrix - */ -void ibz_mat_4x4_negate(ibz_mat_4x4_t *neg, const ibz_mat_4x4_t *mat); - -/** @brief transpose a 4x4 integer matrix - * - * @param transposed Output: is set to the transposition of mat - * @param mat Input matrix - */ -void ibz_mat_4x4_transpose(ibz_mat_4x4_t *transposed, const ibz_mat_4x4_t *mat); - -/** @brief Set all coefficients of a matrix to zero for 4x4 integer matrices - * - * @param zero - */ -void ibz_mat_4x4_zero(ibz_mat_4x4_t *zero); - -/** @brief Set a matrix to the identity for 4x4 integer matrices - * - * @param id - */ -void ibz_mat_4x4_identity(ibz_mat_4x4_t *id); - -/** @brief Test equality to identity for 4x4 integer matrices - * - * @returns 1 if mat is the identity matrix, 0 otherwise - * @param mat - */ -int ibz_mat_4x4_is_identity(const ibz_mat_4x4_t *mat); - -/** @brief Equality test for 4x4 integer matrices - * - * @returns 1 if equal, 0 otherwise - * @param mat1 - * @param mat2 - */ -int ibz_mat_4x4_equal(const ibz_mat_4x4_t *mat1, const ibz_mat_4x4_t *mat2); - -/** @brief Matrix by integer multiplication - * - * @param prod Output - * @param scalar - * @param mat - */ -void ibz_mat_4x4_scalar_mul(ibz_mat_4x4_t *prod, const ibz_t *scalar, const ibz_mat_4x4_t *mat); - -/** @brief gcd of all values in matrix - * - * @param gcd Output - * @param mat - */ -void ibz_mat_4x4_gcd(ibz_t *gcd, const ibz_mat_4x4_t *mat); - -/** @brief divides all values in matrix by same scalar - * - * @returns 1 if scalar divided all values in mat, 0 otherwise (division is performed in both cases) - * @param quot Output - * @param scalar - * @param mat - */ -int ibz_mat_4x4_scalar_div(ibz_mat_4x4_t *quot, const ibz_t *scalar, const ibz_mat_4x4_t *mat); - -/** @brief Modular matrix multiplication of aribitrarily sized matrices - * - * res = A * B (mod) - * - * @param from - * @param through - * @param to - * @param res Output: a from × to matrix. Cannot point to the same memory as A or B. - * @param A a from × through matrix - * @param B a through × to matrix - * @param mod modulo - */ -void ibz_mat_mulmod(int from, int through, int to, ibz_t res[from][to], const ibz_t A[from][through], const ibz_t B[through][to], const ibz_t *mod); - -/** @brief Compute the Howell form of a matrix modulo an integer - * - * Source: https://link.springer.com/chapter/10.1007/3-540-68530-8_12 - * Adapted from PARI/GP - * - * @param rows The number of rows of the input - * @param cols The number of columns of the input, must be <= rows - * @param howell Output: the Howell form H of mat - * @param trans Output: the transformation matrix U s.t. mat·U = H. May be NULL. - * @param mat The matrix - * @param mod The integer modulus - * @return the number of zero-columns to the lef of `howell`. - */ -int ibz_mat_howell(int rows, int cols, ibz_t howell[rows][rows+1], ibz_t trans[rows+1][rows+1], const ibz_t mat[rows][cols], ibz_t *mod); - -/** @brief Compute the right kernel of a matrix modulo an integer - * - * Computes the Howell normal form of the kernel. - * - * Source: https://link.springer.com/chapter/10.1007/3-540-68530-8_12 - * Adapted from PARI/GP - * - * @param rows The number of rows of the input - * @param cols The number of columns of the input, must be <= rows - * @param ker Output: the kernel - * @param mat The matrix - * @param mod The integer modulus - */ -void ibz_mat_right_ker_mod(int rows, int cols, ibz_t ker[cols][cols], const ibz_t mat[rows][cols], ibz_t *mod); - - -/** @brief Verifies whether the 4x4 input matrix is in Hermite Normal Form - * - * @returns 1 if mat is in HNF, 0 otherwise - * @param mat Matrix to be tested - */ -int ibz_mat_4x4_is_hnf(const ibz_mat_4x4_t *mat); - -/** @brief Hermite Normal Form of a matrix of 8 integer vectors - * - * Algorithm used is the one at number 2.4.5 in Henri Cohen's "A Course in Computational Algebraic Number Theory" (Springer Verlag, in series "Graduate texts in Mathematics") from 1993 - * - * @param hnf Output: Matrix in Hermite Normal Form generating the same lattice as generators - * @param generators matrix whose colums generate the same lattice than the output - */ -void ibz_mat_4x8_hnf_core(ibz_mat_4x4_t *hnf, const ibz_mat_4x8_t *generators); - -/** @brief Hermite Normal Form of a matrix concatenated with mod*Id - * - * @param hnf Output: Matrix in Hermite Normal Form generating the same lattice as generators - * @param mat matrix whose colums and mod*Id generate the same lattice than the output - * @param mod mod*Id is appended to the matrix. A hnf of this concatenation is then output - */ -void ibz_mat_4x4_hnf_mod(ibz_mat_4x4_t *hnf, const ibz_mat_4x4_t *mat, const ibz_t *mod); - -/** @} - */ -/** @} - */ - -/** @internal - * @defgroup quat_dim2_helpers Helper functions for dimension 2 - * @{ - */ - -/** @internal - * @defgroup quat_dim2_other_helpers Set and other small helper functions for dimension 2 matrix and vector - * @{ - */ - -/** @brief Set vector coefficients to the given integers - * - * @param vec Output: Vector - * @param a0 - * @param a1 - */ -void ibz_vec_2_set(ibz_vec_2_t *vec, int a0, int a1); - -/** @brief Set matrix coefficients to the given integers - * - * @param mat Output: Matrix - * @param a00 - * @param a01 - * @param a10 - * @param a11 - */ -void ibz_mat_2x2_set(ibz_mat_2x2_t *mat, int a00, int a01, int a10, int a11); - -/** @brief Determinant of a 2x2 integer matrix given as 4 integers - * - * @param det Output: Determinant of the matrix - * @param a11 matrix coefficient (upper left corner) - * @param a12 matrix coefficient (upper right corner) - * @param a21 matrix coefficient (lower left corner) - * @param a22 matrix coefficient (lower right corner) - */ -void ibz_mat_2x2_det_from_ibz(ibz_t *det, const ibz_t *a11, const ibz_t *a12, const ibz_t *a21, const ibz_t *a22); -/** @} - */ - -/** @internal - * @defgroup quat_cvp_helpers Helper functions for 2x2 cvp - * @{ - */ - -/** @brief Checks if the vector (coord1,coord2) has integer coordinates in basis - * - * @param basis Rank 2 matrix - * @param coord1 - * @param coord2 - * @returns 1 if the vector (coord1,coord2) has integer coordinates in basis, 0 otherwise - */ -int quat_dim2_lattice_contains(ibz_mat_2x2_t *basis, ibz_t *coord1, ibz_t *coord2); - - -/** @brief coord1^2 + norm_q*coord2^2 - * - * This defines a quadratic form in dimension 2 where coord1 is the first and coord2 the second coordinate of the vector on which it is evaluated - * - * @param norm Output: coord1^2 + norm_q*coord2^2 - * @param coord1 - * @param coord2 - * @param norm_q Positive integer - */ -void quat_dim2_lattice_norm(ibz_t *norm, const ibz_t *coord1, const ibz_t *coord2, const ibz_t *norm_q); - -/** @brief v11*v21 + norm_q*v12*v22 - * - * This defines a bilinear form in dimension 2 where v11,v12 are coordinates of the first vector, v21,v22 of the second vector - * - * @param res Output: v11*v21+q*v12*v22 - * @param v11 - * @param v12 - * @param v21 - * @param v22 - * @param norm_q Positive integer - */ -void quat_dim2_lattice_bilinear(ibz_t *res, const ibz_t *v11, const ibz_t *v12, const ibz_t *v21, const ibz_t *v22, const ibz_t *norm_q); - -/** @brief Basis of the integral lattice represented by basis, which is small for the norm x^2 + qy^2 (in standard basis) - * - * Additionally, the first vector in the basis has a smaller norm than the second one. - * - * Algorithm 1.3.14 from Henri Cohen's "A Course in Computational Algebraic Number Theory" (Springer Verlag, in series "Graduate texts in Mathematics") from 1993 - * which finds a shortest vector in the lattice. - * - * @param reduced Output: Matrix of 2 column vectors of small norm x^2 + qy^2 which are a basis of the lattice the basis argument represents - * @param basis Basis of a rank 2 lattice in dimension 2 - * @param norm_q Positive integer defining a quadratic form x^2 + qy^2 (x,y coordinates of a vector in the standard basis of R^2) for which the reduced output basis shound be small - */ -void quat_dim2_lattice_short_basis(ibz_mat_2x2_t *reduced, const ibz_mat_2x2_t *basis, const ibz_t *norm_q); - -/** @brief Uses a and b to compute a* orthogonal to b, then computes the projection res of t on a* (uses the norm associated to norm_q) - * - * Helper for quat_dim2_lattice_closest_vector, implicitly computes an orthogonalised basis (b,a*) from (b,a) and a projection f the target t on its second vector - * - * Uses the norm associated to norm_q by x^2 + qy^2, for x,y coordinates of a vector - * - * @param res Output: The coefficient (projection of t on a* orthogonal to b) which was computed - * @param a0 will be the 1st coeff of a, the second vector of the input basis - * @param a1 will be the 2nd coeff of a, the second vector of the input basis - * @param b0 will be the 1st coeff of b, the first vector of the input basis - * @param b1 will be the 2nd coeff of b, the first vector of the input basis - * @param t0 will be the 1st coeff of the target vector, which one wnat to project on the orthogonalised basis' second vector - * @param t1 will be the 2nd coeff of the target vector, which one wnat to project on the orthogonalised basis' second vector - * @param norm_q Positive integer defining a quadratic form x^2 + qy^2 - */ -void quat_dim2_lattice_get_coefficient_with_orthogonalisation(ibz_t *res, const ibz_t *a0,const ibz_t *a1,const ibz_t *b0,const ibz_t *b1,const ibz_t *t0,const ibz_t *t1,const ibz_t *norm_q); - -/** @brief Finds a vector close to the given target in a lattice of which a reduced basis is given - * - * Nearest plane algo as in https://cims.nyu.edu/~regev/teaching/lattices_fall_2004/ln/cvp.pdf (15.5.23,16h10), but without basis reduction: - * Basically just two projections - * - * @param target_minus_closest Output: Vector in standard basis corresponding to target minus the close vector in the lattice which is output in closest_coords_in_basis - * @param closest_coords_in_basis Output: Represents a vector in the lattice close to target, represented by its coordinates in the given absis of the lattice - * @param reduced_basis Reduced basis of the lattice, reduction should be done using lll or an exact shortest vector algorithm - * @param target vector to which the solution should be close - * @param norm_q Positive integer defining a quadratic form x^2 + qy^2 (x,y coordinates of a vector in the standard basis of R^2) for which the reduced output basis shound be small - */ -void quat_dim2_lattice_closest_vector(ibz_vec_2_t *target_minus_closest, ibz_vec_2_t *closest_coords_in_basis, const ibz_mat_2x2_t *reduced_basis, const ibz_vec_2_t *target, const ibz_t *norm_q); - -/** @brief give a,b,c such that ax^2 + bxy + cy^2 = N(Bz), where B is the basis, z the vector x,y and N the quadratic form (coord1^2 + q coord2^2) - * - * @param qf_a Output: b in the formula - * @param qf_b Output: b in the formula - * @param qf_c Output: c in the formula - * @param basis Basis of the lattice - * @param norm_q Positive integer defining a quadratic form x^2 + qy^2 (x,y coordinates of a vector in the standard basis of R^2) for which the reduced output basis shound be small - */ -void quat_dim2_lattice_get_qf_on_lattice(ibz_t *qf_a, ibz_t *qf_b, ibz_t *qf_c, const ibz_mat_2x2_t *basis, const ibz_t *norm_q); - -/** @brief Test version of the condition argument in the cvp enumeration algorithms. - * - * Sets elem[0] and elem[2] to vec[0], elem[1] and elem[3] to vec[1] if vec[0] + vec[1] mod p is 2, where p is the ibz_t to which params points - * - * This defines a quadratic form in dimension 2 where coord1 is the first and coord2 the second coordinate of the vector on which it is evaluated - * - * @param elem Output as described below - * @param vec - * @param params void* which must point to an ibz_t - */ -int quat_dim2_lattice_test_cvp_condition(quat_alg_elem_t* elem, const ibz_vec_2_t* vec, const void* params); - -/** - * @brief Find vector of small norm in a positive definite quadratic form, satisfying extra conditions. - * - * @param res Output: The quat_alg_elem (dimension 4, with denominator) which the condition sets when it is fulfilled - * @param x first coordinate in the lattice basis lat_basis of a short vector (for the norm written coeff1^2 + q coeff2 ^2 in the standard basis) - * @param y first coordinate in the lattice basis lat_basis of a short vector (for the norm written coeff1^2 + q coeff2 ^2 in the standard basis) - * @param condition a filter function returning whether res is set to a valid output or not. The algorithm stops when it succeeds (outputs 1) - * @param params extra parameters passed to `condition`. May be NULL. - * @param target_minus_closest vector which will be added to the enumerated short vectors before checking the bound - * @param lat_basis reduced basis of the lattice, in which a short vector is searched for - * @param norm_q defines the quadratic form coord1^2+norm_q*coord2^2 (in standard basis) used as norm - * @param norm_bound only vectors with norm smaller than this bound are tested for condition - * @return 1 if vector was found, 0 otherwise - */ -int quat_dim2_lattice_bound_and_condition(quat_alg_elem_t *res, const ibz_t *x, const ibz_t *y, int (*condition)(quat_alg_elem_t *, const ibz_vec_2_t *, const void *), const void *params, const ibz_vec_2_t *target_minus_closest, const ibz_mat_2x2_t *lat_basis, const ibz_t *norm_q, const ibz_t *norm_bound); - -/** @brief Computes an integer slightly larger than sqrt(num_a/denom_a)+num_b/denom_b. - * - * More precisely, if denoting sqrt_ the integer part of the square root, and _ the integer part of a rational, - * res = 1+_((sqrt_(num_a)+1)/sqrt_(denom_a) + num_b/denom_b) - * - * @param res upper approximation of sqrt(num_a/denom_a)+num_b/denom_b - * @param num_a must be of same sign as denom_a - * @param denom_a must be non 0 and of same sign as num_a - * @param num_b - * @param denom_b must be non 0 - */ -int quat_dim2_lattice_qf_value_bound_generation(ibz_t *res, const ibz_t *num_a, const ibz_t *denom_a, const ibz_t *num_b, const ibz_t *denom_b); - -/** - * @brief Find vector of small norm in a positive definite quadratic form, satisfying extra conditions. - * - * Enumerates up to `max_tries` vectors `(x,y)` such that `qfa x² + qfb xy + qfc y² < norm_bound`; the first - * vector such that `quat_dim2_lattice_bound_and_condition(res,x,y,condition,params,target_minus_closest,lat_basis, norm_q,norm_bound) == 1` is returned. - * The vector enumeration starts by vectors close to the bound - * - * Uses algorithm 2.7.5 (Fincke-Pohst) from Henri Cohen's "A Course in Computational Algebraic Number Theory" (Springer Verlag, in series "Graduate texts in Mathematics") from 1993 - * Slightly adapted to work without rational numbers and their square roots - * Therefore needing a test to make sure the bounds are respected, which is integrated in quat_dim2_lattice_bound_and_condition - * Also the norm bound is initialised a bit lower that the bound received, to leave space for the added target_minus_closest - * - * @param res Output: selected vector (x,y) - * @param condition a filter function returning whether a vector should be output or not - * @param params extra parameters passed to `condition`. May be NULL. - * @param target_minus_closest vector which will be added to the enumerated short vectors before checking the bound - * @param lat_basis reduced basis of the lattice, in which a short vector is searched for - * @param norm_q defines the quadratic form coord1^2+norm_q*coord2^2 (in standard basis) used as norm - * @param norm_bound only vectors with norm smaller than this bound are tested for condition and output - * @param max_tries maximum number of calls to filter - * @return 1 if vector was found, 0 otherwise - */ -int quat_dim2_lattice_qf_enumerate_short_vec(quat_alg_elem_t *res, int (*condition)(quat_alg_elem_t *, const ibz_vec_2_t *, const void *), const void *params, const ibz_vec_2_t *target_minus_closest, const ibz_mat_2x2_t *lat_basis, const ibz_t *norm_q, const ibz_t *norm_bound, const int max_tries); -/** @} - */ -/** @} - */ - -/** @internal - * @defgroup quat_lattice_helper Helper functions for the lattice library (dimension 4) - * @{ - */ - -/** - * @brief Lattice equality - * - * Lattice bases are assumed to be under HNF, but denominators are free. - * - * @returns 1 if both lattices are equal, 0 otherwise -*/ -int quat_lattice_equal(const quat_lattice_t *lat1, const quat_lattice_t *lat2); - -/** @brief Divides basis and denominator of a lattice by their gcd - * - * @param reduced Output - * @param lat Lattice - */ -void quat_lattice_reduce_denom(quat_lattice_t *reduced, const quat_lattice_t *lat); - -/** - * @brief Computes the dual lattice of lat, without putting its basis in HNF - * - * This function returns a lattice not under HNF. For careful internal use only. - * - * Coputation method described in https://cseweb.ucsd.edu/classes/sp14/cse206A-a/lec4.pdf consulted on 19 of May 2023, 12h40 CEST - * - * @param dual Output: The dual lattice of lat. ATTENTION: is not under HNF. hnf computation must be applied before using lattice functions on it - * @param lat lattice, the dual of it will be computed - */ -void quat_lattice_dual_without_hnf(quat_lattice_t *dual, const quat_lattice_t *lat); - -/** - * @brief Test whether x ∈ lat. If so, compute its coordinates in lat's basis. - * - * Lattice assumed of full rank and under HNF, none of both is tested so far. - * - * @param coord Output: Set to the coordinates of x in lat - * @param lat The lattice - * @param x An element of the quaternion algebra, in same basis as the lattice lat - * @return true if x ∈ lat - */ -int quat_lattice_contains_without_alg(quat_alg_coord_t *coord, const quat_lattice_t *lat, const quat_alg_elem_t *x); - -/** @brief The index of sublat into overlat - * - * Assumes inputs are in HNF. - * - * @param index Output - * @param sublat A lattice in HNF, must be sublattice of overlat - * @param overlat A lattice in HNF, must be overlattice of sublat - */ -void quat_lattice_index(ibz_t *index, const quat_lattice_t *sublat, const quat_lattice_t *overlat); - -/** @brief Random lattice element from a small parallelogram - * - * Sample a random element in `lattice` by taking a random linear - * combination of the basis with uniform coefficients in - * [-2^(n-1),2^(n-1)-1]. - * - * @param elem Output element - * @param lattice Whence the element is sampled - * @param n Number of random bits for the coefficients. Must be <= 64. - * @return 0 if PRNG failed (in this case elem is set to 0), 1 otherwise - */ -int quat_lattice_random_elem(quat_alg_elem_t *elem, const quat_lattice_t *lattice, unsigned char n); - -/** @brief Compute the right transporter from lat1 to lat2 - * - * The ideal of those x such that lat1·x ⊂ lat2 - */ -void quat_lattice_right_transporter(quat_lattice_t *trans, const quat_lattice_t *lat1, const quat_lattice_t *lat2, const quat_alg_t *alg); - -/** @} - */ -/** @} - */ -/** @} - */ - -#endif diff --git a/src/quaternion/ref/generic/internal_quaternion_headers/dpe.h b/src/quaternion/ref/generic/internal_quaternion_headers/dpe.h new file mode 100644 index 0000000..b9a7a35 --- /dev/null +++ b/src/quaternion/ref/generic/internal_quaternion_headers/dpe.h @@ -0,0 +1,743 @@ +/* Copyright (C) 2004-2024 Patrick Pelissier, Paul Zimmermann, LORIA/INRIA. + +This file is part of the DPE Library. + +The DPE Library is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The DPE Library is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with the DPE Library; see the file COPYING.LIB. +If not, see . */ + +#ifndef __DPE +#define __DPE + +#include /* For abort */ +#include /* For fprintf */ +#include /* for round, floor, ceil */ +#include + +/* if you change the version, please change it in Makefile too */ +#define DPE_VERSION_MAJOR 1 +#define DPE_VERSION_MINOR 7 + +#if defined(__GNUC__) && (__GNUC__ >= 3) +# define DPE_LIKELY(x) (__builtin_expect(!!(x),1)) +# define DPE_UNLIKELY(x) (__builtin_expect((x),0)) +# define DPE_UNUSED_ATTR __attribute__((unused)) +#else +# define DPE_LIKELY(x) (x) +# define DPE_UNLIKELY(x) (x) +# define DPE_UNUSED_ATTR +#endif + +/* If no user defined mode, define it to double */ +#if !defined(DPE_USE_DOUBLE) && !defined(DPE_USE_LONGDOUBLE) && !defined(DPE_USE_FLOAT128) +# define DPE_USE_DOUBLE +#endif + +#if defined(DPE_USE_DOUBLE) && defined(DPE_USE_LONGDOUBLE) +# error "Either DPE_USE_DOUBLE or DPE_USE_LONGDOUBLE shall be defined." +#elif defined(DPE_USE_DOUBLE) && defined(DPE_USE_USE_FLOAT128) +# error "Either DPE_USE_DOUBLE or DPE_USE_FLOAT128 shall be defined." +#elif defined(DPE_USE_LONG_DOUBLE) && defined(DPE_USE_USE_FLOAT128) +# error "Either DPE_USE_LONG_DOUBLE or DPE_USE_FLOAT128 shall be defined." +#endif + +#if (defined(__i386) || defined (__x86_64)) && !defined(DPE_LITTLEENDIAN32) && defined(DPE_USE_DOUBLE) +# define DPE_LITTLEENDIAN32 +#endif + +#if (defined(__STDC_VERSION__) && (__STDC_VERSION__>=199901L)) || defined (__GLIBC__) +# define DPE_DEFINE_ROUND_TRUNC +#endif + +#if defined(__GNUC__) && (__GNUC__ *10 + __GNUC_MINOR__) >= 43 +# define DPE_ISFINITE __builtin_isfinite +#elif defined(isfinite) +# define DPE_ISFINITE isfinite /* new C99 function */ +#else +# define DPE_ISFINITE finite /* obsolete BSD function */ +#endif + +/* DPE_LDEXP(DPE_DOUBLE m, DPEEXP e) return x = m * 2^e */ +/* DPE_FREXP(DPE_DOUBLE x, DPEEXP *e) returns m, e such that x = m * 2^e with + 1/2 <= m < 1 */ +/* DPE_ROUND(DPE_DOUBLE x) returns the nearest integer to x */ +#if defined(DPE_USE_DOUBLE) +# define DPE_DOUBLE double /* mantissa type */ +# define DPE_BITSIZE 53 /* bitsize of DPE_DOUBLE */ +# define DPE_2_POW_BITSIZE 0x1P53 +# if defined(__GNUC__) && (__GNUC__ *10 + __GNUC_MINOR__) >= 40 +# define DPE_LDEXP __builtin_ldexp +# define DPE_FREXP __builtin_frexp +# define DPE_FLOOR __builtin_floor +# define DPE_CEIL __builtin_ceil +# ifdef DPE_DEFINE_ROUND_TRUNC +# define DPE_ROUND __builtin_round +# define DPE_TRUNC __builtin_trunc +# endif +# else +# define DPE_LDEXP ldexp +# define DPE_FREXP frexp +# define DPE_FLOOR floor +# define DPE_CEIL ceil +# ifdef DPE_DEFINE_ROUND_TRUNC +# define DPE_ROUND round +# define DPE_TRUNC trunc +# endif +# endif + +#elif defined(DPE_USE_LONGDOUBLE) +# define DPE_DOUBLE long double +# define DPE_BITSIZE 64 +# define DPE_2_POW_BITSIZE 0x1P64 +# define DPE_LDEXP ldexpl +# define DPE_FREXP frexpl +# define DPE_FLOOR floorl +# define DPE_CEIL ceill +# ifdef DPE_DEFINE_ROUND_TRUNC +# define DPE_ROUND roundl +# define DPE_TRUNC truncl +# endif + +#elif defined(DPE_USE_FLOAT128) +# include "quadmath.h" +# define DPE_DOUBLE __float128 +# define DPE_BITSIZE 113 +# define DPE_2_POW_BITSIZE 0x1P113 +# define DPE_LDEXP ldexpq +# define DPE_FLOOR floorq +# define DPE_CEIL ceilq +# define DPE_FREXP frexpq +# ifdef DPE_DEFINE_ROUND_TRUNC +# define DPE_ROUND roundq +# define DPE_TRUNC truncq +# endif + +#else +# error "neither DPE_USE_DOUBLE, nor DPE_USE_LONGDOUBLE, nor DPE_USE_FLOAT128 is defined" +#endif + +/* If no C99, do what we can */ +#ifndef DPE_DEFINE_ROUND_TRUNC +# define DPE_ROUND(x) ((DPE_DOUBLE) ((long long) ((x) + ((x) >= 0.0 ? 0.5 : -0.5)))) +# define DPE_TRUNC(x) ((DPE_DOUBLE) ((long long) ((x) + 0.0))) +#endif + +#if defined(DPE_USE_LONG) +# define DPE_EXP_T long /* exponent type */ +# define DPE_EXPMIN LONG_MIN /* smallest possible exponent */ +#elif defined(DPE_USE_LONGLONG) +# define DPE_EXP_T long long +# define DPE_EXPMIN LLONG_MIN +#else +# define DPE_EXP_T int /* exponent type */ +# define DPE_EXPMIN INT_MIN /* smallest possible exponent */ +#endif + +#ifdef DPE_LITTLEENDIAN32 +typedef union +{ + double d; +#if INT_MAX == 0x7FFFFFFFL + int i[2]; +#elif LONG_MAX == 0x7FFFFFFFL + long i[2]; +#elif SHRT_MAX == 0x7FFFFFFFL + short i[2]; +#else +# error Cannot find a 32 bits integer type. +#endif +} dpe_double_words; +#endif + +typedef struct +{ + DPE_DOUBLE d; /* significand */ + DPE_EXP_T exp; /* exponent */ +} dpe_struct; + +typedef dpe_struct dpe_t[1]; + +#define DPE_MANT(x) ((x)->d) +#define DPE_EXP(x) ((x)->exp) +#define DPE_SIGN(x) ((DPE_MANT(x) < 0.0) ? -1 : (DPE_MANT(x) > 0.0)) + +#define DPE_INLINE static inline + +/* initialize */ +DPE_INLINE void +dpe_init (dpe_t x DPE_UNUSED_ATTR) +{ +} + +/* clear */ +DPE_INLINE void +dpe_clear (dpe_t x DPE_UNUSED_ATTR) +{ +} + +/* set x to y */ +DPE_INLINE void +dpe_set (dpe_t x, dpe_t y) +{ + DPE_MANT(x) = DPE_MANT(y); + DPE_EXP(x) = DPE_EXP(y); +} + +/* set x to -y */ +DPE_INLINE void +dpe_neg (dpe_t x, dpe_t y) +{ + DPE_MANT(x) = -DPE_MANT(y); + DPE_EXP(x) = DPE_EXP(y); +} + +/* set x to |y| */ +DPE_INLINE void +dpe_abs (dpe_t x, dpe_t y) +{ + DPE_MANT(x) = (DPE_MANT(y) >= 0) ? DPE_MANT(y) : -DPE_MANT(y); + DPE_EXP(x) = DPE_EXP(y); +} + +/* set mantissa in [1/2, 1), except for 0 which has minimum exponent */ +/* FIXME: don't inline this function yet ? */ +static void +dpe_normalize (dpe_t x) +{ + if (DPE_UNLIKELY (DPE_MANT(x) == 0.0 || DPE_ISFINITE (DPE_MANT(x)) == 0)) + { + if (DPE_MANT(x) == 0.0) + DPE_EXP(x) = DPE_EXPMIN; + /* otherwise let the exponent of NaN, Inf unchanged */ + } + else + { + DPE_EXP_T e; +#ifdef DPE_LITTLEENDIAN32 /* 32-bit little endian */ + dpe_double_words dw; + dw.d = DPE_MANT(x); + e = (dw.i[1] >> 20) & 0x7FF; /* unbiased exponent, 1022 for m=1/2 */ + DPE_EXP(x) += e - 1022; + dw.i[1] = (dw.i[1] & 0x800FFFFF) | 0x3FE00000; + DPE_MANT(x) = dw.d; +#else /* portable code */ + double m = DPE_MANT(x); + DPE_MANT(x) = DPE_FREXP (m, &e); + DPE_EXP(x) += e; +#endif + } +} + +#if defined(DPE_USE_DOUBLE) +static const double dpe_scale_tab[54] = { + 0x1P0, 0x1P-1, 0x1P-2, 0x1P-3, 0x1P-4, 0x1P-5, 0x1P-6, 0x1P-7, 0x1P-8, + 0x1P-9, 0x1P-10, 0x1P-11, 0x1P-12, 0x1P-13, 0x1P-14, 0x1P-15, 0x1P-16, + 0x1P-17, 0x1P-18, 0x1P-19, 0x1P-20, 0x1P-21, 0x1P-22, 0x1P-23, 0x1P-24, + 0x1P-25, 0x1P-26, 0x1P-27, 0x1P-28, 0x1P-29, 0x1P-30, 0x1P-31, 0x1P-32, + 0x1P-33, 0x1P-34, 0x1P-35, 0x1P-36, 0x1P-37, 0x1P-38, 0x1P-39, 0x1P-40, + 0x1P-41, 0x1P-42, 0x1P-43, 0x1P-44, 0x1P-45, 0x1P-46, 0x1P-47, 0x1P-48, + 0x1P-49, 0x1P-50, 0x1P-51, 0x1P-52, 0x1P-53}; +#endif + +DPE_INLINE DPE_DOUBLE +dpe_scale (DPE_DOUBLE d, int s) +{ + /* -DPE_BITSIZE < s <= 0 and 1/2 <= d < 1 */ +#if defined(DPE_USE_DOUBLE) + return d * dpe_scale_tab [-s]; +#else /* portable code */ + return DPE_LDEXP (d, s); +#endif +} + +/* set x to y */ +DPE_INLINE void +dpe_set_d (dpe_t x, double y) +{ + DPE_MANT(x) = (DPE_DOUBLE) y; + DPE_EXP(x) = 0; + dpe_normalize (x); +} + +/* set x to y */ +DPE_INLINE void +dpe_set_ld (dpe_t x, long double y) +{ + DPE_MANT(x) = (DPE_DOUBLE) y; + DPE_EXP(x) = 0; + dpe_normalize (x); +} + +/* set x to y */ +DPE_INLINE void +dpe_set_ui (dpe_t x, unsigned long y) +{ + DPE_MANT(x) = (DPE_DOUBLE) y; + DPE_EXP(x) = 0; + dpe_normalize (x); +} + +/* set x to y */ +DPE_INLINE void +dpe_set_si (dpe_t x, long y) +{ + DPE_MANT(x) = (DPE_DOUBLE) y; + DPE_EXP(x) = 0; + dpe_normalize (x); +} + +DPE_INLINE long +dpe_get_si (dpe_t x) +{ + DPE_DOUBLE d = DPE_LDEXP (DPE_MANT (x), DPE_EXP (x)); + return (long) d; +} + +DPE_INLINE unsigned long +dpe_get_ui (dpe_t x) +{ + DPE_DOUBLE d = DPE_LDEXP (DPE_MANT (x), DPE_EXP (x)); + return (d < 0.0) ? 0 : (unsigned long) d; +} + +DPE_INLINE double +dpe_get_d (dpe_t x) +{ + return DPE_LDEXP (DPE_MANT (x), DPE_EXP (x)); +} + +DPE_INLINE long double +dpe_get_ld (dpe_t x) +{ + return DPE_LDEXP (DPE_MANT (x), DPE_EXP (x)); +} + +#if defined(__GMP_H__) || defined(__MINI_GMP_H__) +/* set x to y */ +DPE_INLINE void +dpe_set_z (dpe_t x, mpz_t y) +{ + long e; + DPE_MANT(x) = mpz_get_d_2exp (&e, y); + DPE_EXP(x) = (DPE_EXP_T) e; +} + +/* set x to y, rounded to nearest */ +DPE_INLINE void +dpe_get_z (mpz_t x, dpe_t y) +{ + DPE_EXP_T ey = DPE_EXP(y); + if (ey >= DPE_BITSIZE) /* y is an integer */ + { + DPE_DOUBLE d = DPE_MANT(y) * DPE_2_POW_BITSIZE; /* d is an integer */ + mpz_set_d (x, d); /* should be exact */ + mpz_mul_2exp (x, x, (unsigned long) ey - DPE_BITSIZE); + } + else /* DPE_EXP(y) < DPE_BITSIZE */ + { + if (DPE_UNLIKELY (ey < 0)) /* |y| < 1/2 */ + mpz_set_ui (x, 0); + else + { + DPE_DOUBLE d = DPE_LDEXP(DPE_MANT(y), ey); + mpz_set_d (x, (double) DPE_ROUND(d)); + } + } +} + +/* return e and x such that y = x*2^e */ +DPE_INLINE mp_exp_t +dpe_get_z_exp (mpz_t x, dpe_t y) +{ + mpz_set_d (x, DPE_MANT (y) * DPE_2_POW_BITSIZE); + return DPE_EXP(y) - DPE_BITSIZE; +} +#endif + +/* x <- y + z, assuming y and z are normalized, returns x normalized */ +DPE_INLINE void +dpe_add (dpe_t x, dpe_t y, dpe_t z) +{ + if (DPE_UNLIKELY (DPE_EXP(y) > DPE_EXP(z) + DPE_BITSIZE)) + /* |z| < 1/2*ulp(y), thus o(y+z) = y */ + dpe_set (x, y); + else if (DPE_UNLIKELY (DPE_EXP(z) > DPE_EXP(y) + DPE_BITSIZE)) + dpe_set (x, z); + else + { + DPE_EXP_T d = DPE_EXP(y) - DPE_EXP(z); /* |d| <= DPE_BITSIZE */ + + if (d >= 0) + { + DPE_MANT(x) = DPE_MANT(y) + dpe_scale (DPE_MANT(z), -d); + DPE_EXP(x) = DPE_EXP(y); + } + else + { + DPE_MANT(x) = DPE_MANT(z) + dpe_scale (DPE_MANT(y), d); + DPE_EXP(x) = DPE_EXP(z); + } + dpe_normalize (x); + } +} + +/* x <- y - z, assuming y and z are normalized, returns x normalized */ +DPE_INLINE void +dpe_sub (dpe_t x, dpe_t y, dpe_t z) +{ + if (DPE_UNLIKELY (DPE_EXP(y) > DPE_EXP(z) + DPE_BITSIZE)) + /* |z| < 1/2*ulp(y), thus o(y-z) = y */ + dpe_set (x, y); + else if (DPE_UNLIKELY (DPE_EXP(z) > DPE_EXP(y) + DPE_BITSIZE)) + dpe_neg (x, z); + else + { + DPE_EXP_T d = DPE_EXP(y) - DPE_EXP(z); /* |d| <= DPE_BITSIZE */ + + if (d >= 0) + { + DPE_MANT(x) = DPE_MANT(y) - dpe_scale (DPE_MANT(z), -d); + DPE_EXP(x) = DPE_EXP(y); + } + else + { + DPE_MANT(x) = dpe_scale (DPE_MANT(y), d) - DPE_MANT(z); + DPE_EXP(x) = DPE_EXP(z); + } + dpe_normalize (x); + } +} + +/* x <- y * z, assuming y and z are normalized, returns x normalized */ +DPE_INLINE void +dpe_mul (dpe_t x, dpe_t y, dpe_t z) +{ + DPE_MANT(x) = DPE_MANT(y) * DPE_MANT(z); + DPE_EXP(x) = DPE_EXP(y) + DPE_EXP(z); + dpe_normalize (x); +} + +/* x <- sqrt(y), assuming y is normalized, returns x normalized */ +DPE_INLINE void +dpe_sqrt (dpe_t x, dpe_t y) +{ + DPE_EXP_T ey = DPE_EXP(y); + if (ey % 2) + { + /* since 1/2 <= my < 1, 1/4 <= my/2 < 1 */ + DPE_MANT(x) = sqrt (0.5 * DPE_MANT(y)); + DPE_EXP(x) = (ey + 1) / 2; + } + else + { + DPE_MANT(x) = sqrt (DPE_MANT(y)); + DPE_EXP(x) = ey / 2; + } +} + +/* x <- y / z, assuming y and z are normalized, returns x normalized. + Assumes z is not zero. */ +DPE_INLINE void +dpe_div (dpe_t x, dpe_t y, dpe_t z) +{ + DPE_MANT(x) = DPE_MANT(y) / DPE_MANT(z); + DPE_EXP(x) = DPE_EXP(y) - DPE_EXP(z); + dpe_normalize (x); +} + +/* x <- y * z, assuming y normalized, returns x normalized */ +DPE_INLINE void +dpe_mul_ui (dpe_t x, dpe_t y, unsigned long z) +{ + DPE_MANT(x) = DPE_MANT(y) * (DPE_DOUBLE) z; + DPE_EXP(x) = DPE_EXP(y); + dpe_normalize (x); +} + +/* x <- y / z, assuming y normalized, z non-zero, returns x normalized */ +DPE_INLINE void +dpe_div_ui (dpe_t x, dpe_t y, unsigned long z) +{ + DPE_MANT(x) = DPE_MANT(y) / (DPE_DOUBLE) z; + DPE_EXP(x) = DPE_EXP(y); + dpe_normalize (x); +} + +/* x <- y * 2^e */ +DPE_INLINE void +dpe_mul_2exp (dpe_t x, dpe_t y, unsigned long e) +{ + DPE_MANT(x) = DPE_MANT(y); + DPE_EXP(x) = DPE_EXP(y) + (DPE_EXP_T) e; +} + +/* x <- y / 2^e */ +DPE_INLINE void +dpe_div_2exp (dpe_t x, dpe_t y, unsigned long e) +{ + DPE_MANT(x) = DPE_MANT(y); + DPE_EXP(x) = DPE_EXP(y) - (DPE_EXP_T) e; +} + +/* return e and x such that y = x*2^e (equality is not guaranteed if the 'long' + type has fewer bits than the significand in dpe_t) */ +DPE_INLINE DPE_EXP_T +dpe_get_si_exp (long *x, dpe_t y) +{ + if (sizeof(long) == 4) /* 32-bit word: long has 31 bits */ + { + *x = (long) (DPE_MANT(y) * 2147483648.0); + return DPE_EXP(y) - 31; + } + else if (sizeof(long) == 8) /* 64-bit word: long has 63 bits */ + { + *x = (long) (DPE_MANT (y) * 9223372036854775808.0); + return DPE_EXP(y) - 63; + } + else + { + fprintf (stderr, "Error, neither 32-bit nor 64-bit word\n"); + exit (1); + } +} + +static DPE_UNUSED_ATTR int dpe_str_prec = 16; +static int dpe_out_str (FILE *s, int base, dpe_t x) DPE_UNUSED_ATTR; + +static int +dpe_out_str (FILE *s, int base, dpe_t x) +{ + DPE_DOUBLE d = DPE_MANT(x); + DPE_EXP_T e2 = DPE_EXP(x); + int e10 = 0; + char sign = ' '; + if (DPE_UNLIKELY (base != 10)) + { + fprintf (stderr, "Error in dpe_out_str, only base 10 allowed\n"); + exit (1); + } + if (d == 0.0) +#ifdef DPE_USE_DOUBLE + return fprintf (s, "%1.*f", dpe_str_prec, d); +#else + return fprintf (s, "%1.*Lf", dpe_str_prec, (long double) d); +#endif + if (d < 0) + { + d = -d; + sign = '-'; + } + if (e2 > 0) + { + while (e2 > 0) + { + e2 --; + d *= 2.0; + if (d >= 10.0) + { + d /= 10.0; + e10 ++; + } + } + } + else /* e2 <= 0 */ + { + while (e2 < 0) + { + e2 ++; + d /= 2.0; + if (d < 1.0) + { + d *= 10.0; + e10 --; + } + } + } +#ifdef DPE_USE_DOUBLE + return fprintf (s, "%c%1.*f*10^%d", sign, dpe_str_prec, d, e10); +#else + return fprintf (s, "%c%1.*Lf*10^%d", sign, dpe_str_prec, (long double) d, e10); +#endif +} + +static size_t dpe_inp_str (dpe_t x, FILE *s, int base) DPE_UNUSED_ATTR; + +static size_t +dpe_inp_str (dpe_t x, FILE *s, int base) +{ + size_t res; + DPE_DOUBLE d; + if (DPE_UNLIKELY (base != 10)) + { + fprintf (stderr, "Error in dpe_out_str, only base 10 allowed\n"); + exit (1); + } +#ifdef DPE_USE_DOUBLE + res = fscanf (s, "%lf", &d); +#elif defined(DPE_USE_LONGDOUBLE) + res = fscanf (s, "%Lf", &d); +#else + { + long double d_ld; + res = fscanf (s, "%Lf", &d_ld); + d = d_ld; + } +#endif + dpe_set_d (x, d); + return res; +} + +DPE_INLINE void +dpe_dump (dpe_t x) +{ + dpe_out_str (stdout, 10, x); + putchar ('\n'); +} + +DPE_INLINE int +dpe_zero_p (dpe_t x) +{ + return DPE_MANT (x) == 0; +} + +/* return a positive value if x > y + a negative value if x < y + and 0 otherwise (x=y). */ +DPE_INLINE int +dpe_cmp (dpe_t x, dpe_t y) +{ + int sx = DPE_SIGN(x); + int d = sx - DPE_SIGN(y); + + if (d != 0) + return d; + else if (DPE_EXP(x) > DPE_EXP(y)) + return (sx > 0) ? 1 : -1; + else if (DPE_EXP(y) > DPE_EXP(x)) + return (sx > 0) ? -1 : 1; + else /* DPE_EXP(x) = DPE_EXP(y) */ + return (DPE_MANT(x) < DPE_MANT(y)) ? -1 : (DPE_MANT(x) > DPE_MANT(y)); +} + +DPE_INLINE int +dpe_cmp_d (dpe_t x, double d) +{ + dpe_t y; + dpe_set_d (y, d); + return dpe_cmp (x, y); +} + +DPE_INLINE int +dpe_cmp_ui (dpe_t x, unsigned long d) +{ + dpe_t y; + dpe_set_ui (y, d); + return dpe_cmp (x, y); +} + +DPE_INLINE int +dpe_cmp_si (dpe_t x, long d) +{ + dpe_t y; + dpe_set_si (y, d); + return dpe_cmp (x, y); +} + +/* set x to integer nearest to y */ +DPE_INLINE void +dpe_round (dpe_t x, dpe_t y) +{ + if (DPE_EXP(y) < 0) /* |y| < 1/2 */ + dpe_set_ui (x, 0); + else if (DPE_EXP(y) >= DPE_BITSIZE) /* y is an integer */ + dpe_set (x, y); + else + { + DPE_DOUBLE d; + d = DPE_LDEXP(DPE_MANT(y), DPE_EXP(y)); + dpe_set_d (x, DPE_ROUND(d)); + } +} + +/* set x to the fractional part of y, defined as y - trunc(y), thus the + fractional part has absolute value in [0, 1), and same sign as y */ +DPE_INLINE void +dpe_frac (dpe_t x, dpe_t y) +{ + /* If |y| is smaller than 1, keep it */ + if (DPE_EXP(y) <= 0) + dpe_set (x, y); + else if (DPE_EXP(y) >= DPE_BITSIZE) /* y is an integer */ + dpe_set_ui (x, 0); + else + { + DPE_DOUBLE d; + d = DPE_LDEXP(DPE_MANT(y), DPE_EXP(y)); + dpe_set_d (x, d - DPE_TRUNC(d)); + } +} + +/* set x to largest integer <= y */ +DPE_INLINE void +dpe_floor (dpe_t x, dpe_t y) +{ + if (DPE_EXP(y) <= 0) /* |y| < 1 */ + { + if (DPE_SIGN(y) >= 0) /* 0 <= y < 1 */ + dpe_set_ui (x, 0); + else /* -1 < y < 0 */ + dpe_set_si (x, -1); + } + else if (DPE_EXP(y) >= DPE_BITSIZE) /* y is an integer */ + dpe_set (x, y); + else + { + DPE_DOUBLE d; + d = DPE_LDEXP(DPE_MANT(y), DPE_EXP(y)); + dpe_set_d (x, DPE_FLOOR(d)); + } +} + +/* set x to smallest integer >= y */ +DPE_INLINE void +dpe_ceil (dpe_t x, dpe_t y) +{ + if (DPE_EXP(y) <= 0) /* |y| < 1 */ + { + if (DPE_SIGN(y) > 0) /* 0 < y < 1 */ + dpe_set_ui (x, 1); + else /* -1 < y <= 0 */ + dpe_set_si (x, 0); + } + else if (DPE_EXP(y) >= DPE_BITSIZE) /* y is an integer */ + dpe_set (x, y); + else + { + DPE_DOUBLE d; + d = DPE_LDEXP(DPE_MANT(y), DPE_EXP(y)); + dpe_set_d (x, DPE_CEIL(d)); + } +} + +DPE_INLINE void +dpe_swap (dpe_t x, dpe_t y) +{ + DPE_EXP_T i = DPE_EXP (x); + DPE_DOUBLE d = DPE_MANT (x); + DPE_EXP (x) = DPE_EXP (y); + DPE_MANT (x) = DPE_MANT (y); + DPE_EXP (y) = i; + DPE_MANT (y) = d; +} + +#endif /* __DPE */ diff --git a/src/quaternion/ref/generic/internal_quaternion_headers/hnf_internal.h b/src/quaternion/ref/generic/internal_quaternion_headers/hnf_internal.h new file mode 100644 index 0000000..5ecc871 --- /dev/null +++ b/src/quaternion/ref/generic/internal_quaternion_headers/hnf_internal.h @@ -0,0 +1,94 @@ +/** @file + * + * @authors Sina Schaeffler + * + * @brief Declarations for functions internal to the HNF computation and its tests + */ + +#ifndef QUAT_HNF_HELPERS_H +#define QUAT_HNF_HELPERS_H + +#include + +/** @internal + * @ingroup quat_helpers + * @defgroup quat_hnf_helpers Internal functions for the HNF computation and tests + */ + +/** @internal + * @ingroup quat_hnf_helpers + * @defgroup quat_hnf_helpers_ibz Internal renamed GMP functions for the HNF computation + */ + +/** + * @brief GCD and Bézout coefficients u, v such that ua + bv = gcd + * + * @param gcd Output: Set to the gcd of a and b + * @param u Output: integer such that ua+bv=gcd + * @param v Output: Integer such that ua+bv=gcd + * @param a + * @param b + */ +void ibz_xgcd(ibz_t *gcd, + ibz_t *u, + ibz_t *v, + const ibz_t *a, + const ibz_t *b); // integers, dim4, test/integers, test/dim4 + +/** @} + */ + +/** @internal + * @ingroup quat_hnf_helpers + * @defgroup quat_hnf_integer_helpers Integer functions internal to the HNF computation and tests + * @{ + */ + +/** @brief x mod mod, with x in [1,mod] + * + * @param res Output: res = x [mod] and 0 0 + */ +void ibz_mod_not_zero(ibz_t *res, const ibz_t *x, const ibz_t *mod); + +/** @brief x mod mod, with x in ]-mod/2,mod/2] + * + * Centered and rather positive then negative. + * + * @param remainder Output: remainder = x [mod] and -mod/2 0 + */ +void ibz_centered_mod(ibz_t *remainder, const ibz_t *a, const ibz_t *mod); + +/** @brief if c then x else y + * + * @param res Output: if c, res = x, else res = y + * @param x + * @param y + * @param c condition: must be 0 or 1 + */ +void ibz_conditional_assign(ibz_t *res, const ibz_t *x, const ibz_t *y, int c); + +/** @brief d = gcd(x,y)>0 and d = ux+vy and u!= 0 and d>0 and u, v of small absolute value, u not 0 + * + * More precisely: + * If x and y are both non 0, -|xy|/d= 0, b >= 0 and a < b + * @returns 1 on success, 0 on failiure + */ +int ibz_rand_interval_i(ibz_t *rand, int32_t a, int32_t b); + +/** @brief generate random value in [-2^m, 2^m] + * assumed that m > 0 and bitlength of m < 32 bit + * @returns 1 on success, 0 on failiure + */ +int ibz_rand_interval_bits(ibz_t *rand, uint32_t m); + +/** @brief set str to a string containing the representation of i in base + * + * Base should be 10 or 16 + * + * str should be an array of length enough to store the representation of in + * in base, which can be obtained by ibz_sizeinbase(i, base) + 2, where the 2 + * is for the sign and the null terminator + * + * Case for base 16 does not matter + * + * @returns 1 if the integer could be converted to a string, 0 otherwise + */ +int ibz_convert_to_str(const ibz_t *i, char *str, int base); + +/** @brief print num in base to stdout + * + * Base should be 10 or 16 + */ +void ibz_print(const ibz_t *num, int base); + +/** @brief set i to integer contained in string when read as number in base + * + * Base should be 10 or 16, and the number should be written without ponctuation or whitespaces + * + * Case for base 16 does not matter + * + * @returns 1 if the string could be converted to an integer, 0 otherwise + */ +int ibz_set_from_str(ibz_t *i, const char *str, int base); + +/** + * @brief Probabilistic primality test + * + * @param n The number to test + * @param reps Number of Miller-Rabin repetitions. The more, the slower and the less likely are + * false positives + * @return 1 if probably prime, 0 if certainly not prime, 2 if certainly prime + * + * Using GMP's implementation: + * + * From GMP's documentation: "This function performs some trial divisions, a Baillie-PSW probable + * prime test, then reps-24 Miller-Rabin probabilistic primality tests." + */ +int ibz_probab_prime(const ibz_t *n, int reps); + +/** + * @brief Square root modulo a prime + * + * @returns 1 if square root of a mod p exists and was computed, 0 otherwise + * @param sqrt Output: Set to a square root of a mod p if any exist + * @param a number of which a square root mod p is searched + * @param p assumed prime + */ +int ibz_sqrt_mod_p(ibz_t *sqrt, const ibz_t *a, const ibz_t *p); + +/** + * @brief Integer square root of a perfect square + * + * @returns 1 if an integer square root of a exists and was computed, 0 otherwise + * @param sqrt Output: Set to a integer square root of a if any exist + * @param a number of which an integer square root is searched + */ +int ibz_sqrt(ibz_t *sqrt, const ibz_t *a); + +/** + * @brief Legendre symbol of a mod p + * + * @returns Legendre symbol of a mod p + * @param a + * @param p assumed prime + * + * Uses GMP's implementation + * + * If output is 1, a is a square mod p, if -1, not. If 0, it is divisible by p + */ +int ibz_legendre(const ibz_t *a, const ibz_t *p); + +/** @} + */ + +// end of ibz_all +/** @} + */ +#endif diff --git a/src/quaternion/ref/generic/internal_quaternion_headers/internal.h b/src/quaternion/ref/generic/internal_quaternion_headers/internal.h new file mode 100644 index 0000000..edbba34 --- /dev/null +++ b/src/quaternion/ref/generic/internal_quaternion_headers/internal.h @@ -0,0 +1,812 @@ +/** @file + * + * @authors Sina Schaeffler + * + * @brief Declarations for helper functions for quaternion algebra implementation + */ + +#ifndef QUAT_HELPER_H +#define QUAT_HELPER_H + +#include +#include +#include "intbig_internal.h" + +/** @internal + * @ingroup quat_quat + * @defgroup quat_helpers Quaternion module internal functions + * @{ + */ + +/** @internal + * @defgroup quat_alg_helpers Helper functions for the alg library + * @{ + */ + +/** @internal + * @brief helper function for initializing small quaternion algebras. + */ +void quat_alg_init_set_ui(quat_alg_t *alg, + unsigned int p); // test/lattice, test/ideal, test/algebra + +/** @brief a*b + * + * Multiply two coordinate vectors as elements of the algebra in basis (1,i,j,ij) with i^2 = -1, j^2 + * = -p + * + * @param res Output: Will contain product + * @param a + * @param b + * @param alg The quaternion algebra + */ +void quat_alg_coord_mul(ibz_vec_4_t *res, const ibz_vec_4_t *a, const ibz_vec_4_t *b, const quat_alg_t *alg); + +/** @brief a=b + * + * Test if a and b represent the same quaternion algebra element + * + * @param a + * @param b + * @returns 1 if a=b, 0 otherwise + */ +int quat_alg_elem_equal(const quat_alg_elem_t *a, const quat_alg_elem_t *b); + +/** @brief Test if x is 0 + * + * @returns 1 if x=0, 0 otherwise + * + * x is 0 iff all coordinates in x->coord are 0 + */ +int quat_alg_elem_is_zero(const quat_alg_elem_t *x); + +/** @brief Compute same denominator form of two quaternion algebra elements + * + * res_a=a and res_b=b (representing the same element) and res_a.denom = res_b.denom + * + * @param res_a + * @param res_b + * @param a + * @param b + */ +void quat_alg_equal_denom(quat_alg_elem_t *res_a, + quat_alg_elem_t *res_b, + const quat_alg_elem_t *a, + const quat_alg_elem_t *b); + +/** @brief Copies the given values into an algebra element, without normalizing it + * + * @param elem Output: algebra element of coordinates [coord0,coord1,coord2,coord3] and denominator + * denom + * @param denom Denominator, must be non zero + * @param coord0 Coordinate on 1 (0th vector of standard algebra basis) + * @param coord1 Coordinate on i (1st vector of standard algebra basis) + * @param coord2 Coordinate on j (2nd vector of standard algebra basis) + * @param coord3 Coordinate on ij (3rd vector of standard algebra basis) + */ +void quat_alg_elem_copy_ibz(quat_alg_elem_t *elem, + const ibz_t *denom, + const ibz_t *coord0, + const ibz_t *coord1, + const ibz_t *coord2, + const ibz_t *coord3); + +/** @brief Sets an algebra element to the given integer values, without normalizing it + * + * @param elem Output: algebra element of coordinates [coord0,coord1,coord2,coord3] and denominator + * denom + * @param denom Denominator, must be non zero + * @param coord0 Coordinate on 1 (0th vector of standard algebra basis) + * @param coord1 Coordinate on i (1st vector of standard algebra basis) + * @param coord2 Coordinate on j (2nd vector of standard algebra basis) + * @param coord3 Coordinate on ij (3rd vector of standard algebra basis) + */ +void quat_alg_elem_set(quat_alg_elem_t *elem, + int32_t denom, + int32_t coord0, + int32_t coord1, + int32_t coord2, + int32_t coord3); + +/** + * @brief Creates algebra element from scalar + * + * Resulting element has 1-coordinate equal to numerator/denominator + * + * @param elem Output: algebra element with numerator/denominator as first coordiante + * (1-coordinate), 0 elsewhere (i,j,ij coordinates) + * @param numerator + * @param denominator Assumed non zero + */ +void quat_alg_scalar(quat_alg_elem_t *elem, const ibz_t *numerator, const ibz_t *denominator); + +/** @brief a+b for algebra elements + * + * @param res Output + * @param a Algebra element + * @param b Algebra element + */ +void quat_alg_add(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b); + +/** @brief a-b for algebra elements + * + * @param res Output + * @param a Algebra element + * @param b Algebra element + */ +void quat_alg_sub(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b); + +/** @brief Multiplies algebra element by integer scalar, without normalizing it + * + * @param res Output + * @param scalar Integer + * @param elem Algebra element + */ +void quat_alg_elem_mul_by_scalar(quat_alg_elem_t *res, const ibz_t *scalar, const quat_alg_elem_t *elem); + +/** @} + */ + +/** @internal + * @defgroup quat_dim4_helpers Helper functions for functions for matrices or vectors in dimension 4 + * @{ + */ + +/** @internal + * @defgroup quat_inv_helpers Helper functions for the integer matrix inversion function + * @{ + */ + +/** @brief a1a2+b1b2+c1c2 + * + * @param coeff Output: The coefficien which was computed as a1a2+b1b2-c1c2 + * @param a1 + * @param a2 + * @param b1 + * @param b2 + * @param c1 + * @param c2 + */ +void ibz_inv_dim4_make_coeff_pmp(ibz_t *coeff, + const ibz_t *a1, + const ibz_t *a2, + const ibz_t *b1, + const ibz_t *b2, + const ibz_t *c1, + const ibz_t *c2); + +/** @brief -a1a2+b1b2-c1c2 + * + * @param coeff Output: The coefficien which was computed as -a1a2+b1b2-c1c2 + * @param a1 + * @param a2 + * @param b1 + * @param b2 + * @param c1 + * @param c2 + */ +void ibz_inv_dim4_make_coeff_mpm(ibz_t *coeff, + const ibz_t *a1, + const ibz_t *a2, + const ibz_t *b1, + const ibz_t *b2, + const ibz_t *c1, + const ibz_t *c2); + +/** @brief Matrix determinant and a matrix inv such that inv/det is the inverse matrix of the input + * + * Implemented following the methof of 2x2 minors explained at Method from + * https://www.geometrictools.com/Documentation/LaplaceExpansionTheorem.pdf (visited on 3rd of May + * 2023, 16h15 CEST) + * + * @returns 1 if the determinant of mat is not 0 and an inverse was computed, 0 otherwise + * @param inv Output: Will contain an integer matrix which, dividet by det, will yield the rational + * inverse of the matrix if it exists, can be NULL + * @param det Output: Will contain the determinant of the input matrix, can be NULL + * @param mat Matrix of which the inverse will be computed + */ +int ibz_mat_4x4_inv_with_det_as_denom(ibz_mat_4x4_t *inv, ibz_t *det, const ibz_mat_4x4_t *mat); + +/** @} + */ + +/** @internal + * @defgroup quat_dim4_lat_helpers Helper functions on vectors and matrices used mainly for lattices + * @{ + */ + +/** @brief Copy all values from one vector to another + * + * @param new Output: is set to same values as vec + * @param vec + */ +void ibz_vec_4_copy(ibz_vec_4_t *new, const ibz_vec_4_t *vec); + +/** @brief set res to values coord0,coord1,coord2,coord3 + * + * @param res Output: Will contain vector (coord0,coord1,coord2,coord3) + * @param coord0 + * @param coord1 + * @param coord2 + * @param coord3 + */ +void ibz_vec_4_copy_ibz(ibz_vec_4_t *res, + const ibz_t *coord0, + const ibz_t *coord1, + const ibz_t *coord2, + const ibz_t *coord3); + +/** @brief Set a vector of 4 integers to given values + * + * @param vec Output: is set to given coordinates + * @param coord0 + * @param coord1 + * @param coord2 + * @param coord3 + */ +void ibz_vec_4_set(ibz_vec_4_t *vec, int32_t coord0, int32_t coord1, int32_t coord2, int32_t coord3); + +/** @brief a+b + * + * Add two integer 4-vectors + * + * @param res Output: Will contain sum + * @param a + * @param b + */ +void ibz_vec_4_add(ibz_vec_4_t *res, const ibz_vec_4_t *a, const ibz_vec_4_t *b); + +/** @brief a-b + * + * Substract two integer 4-vectors + * + * @param res Output: Will contain difference + * @param a + * @param b + */ +void ibz_vec_4_sub(ibz_vec_4_t *res, const ibz_vec_4_t *a, const ibz_vec_4_t *b); + +/** @brief x=0 + * + * Test if a vector x has only zero coordinates + * + * @returns 0 if x has at least one non-zero coordinates, 1 otherwise + * @param x + */ +int ibz_vec_4_is_zero(const ibz_vec_4_t *x); + +/** @brief Compute the linear combination lc = coeff_a vec_a + coeff_b vec_b + * + * @param lc Output: linear combination lc = coeff_a vec_a + coeff_b vec_b + * @param coeff_a Scalar multiplied to vec_a + * @param vec_a + * @param coeff_b Scalar multiplied to vec_b + * @param vec_b + */ +void ibz_vec_4_linear_combination(ibz_vec_4_t *lc, + const ibz_t *coeff_a, + const ibz_vec_4_t *vec_a, + const ibz_t *coeff_b, + const ibz_vec_4_t *vec_b); + +/** @brief multiplies all values in vector by same scalar + * + * @param prod Output + * @param scalar + * @param vec + */ +void ibz_vec_4_scalar_mul(ibz_vec_4_t *prod, const ibz_t *scalar, const ibz_vec_4_t *vec); + +/** @brief divides all values in vector by same scalar + * + * @returns 1 if scalar divided all values in mat, 0 otherwise (division is performed in both cases) + * @param quot Output + * @param scalar + * @param vec + */ +int ibz_vec_4_scalar_div(ibz_vec_4_t *quot, const ibz_t *scalar, const ibz_vec_4_t *vec); + +/** @brief Negation for vectors of 4 integers + * + * @param neg Output: is set to -vec + * @param vec + */ +void ibz_vec_4_negate(ibz_vec_4_t *neg, const ibz_vec_4_t *vec); + +/** + * @brief content of a 4-vector of integers + * + * The content is the GCD of all entries. + * + * @param v A 4-vector of integers + * @param content Output: the resulting gcd + */ +void ibz_vec_4_content(ibz_t *content, const ibz_vec_4_t *v); + +/** @brief -mat for mat a 4x4 integer matrix + * + * @param neg Output: is set to -mat + * @param mat Input matrix + */ +void ibz_mat_4x4_negate(ibz_mat_4x4_t *neg, const ibz_mat_4x4_t *mat); + +/** @brief Set all coefficients of a matrix to zero for 4x4 integer matrices + * + * @param zero + */ +void ibz_mat_4x4_zero(ibz_mat_4x4_t *zero); + +/** @brief Set a matrix to the identity for 4x4 integer matrices + * + * @param id + */ +void ibz_mat_4x4_identity(ibz_mat_4x4_t *id); + +/** @brief Test equality to identity for 4x4 integer matrices + * + * @returns 1 if mat is the identity matrix, 0 otherwise + * @param mat + */ +int ibz_mat_4x4_is_identity(const ibz_mat_4x4_t *mat); + +/** @brief Equality test for 4x4 integer matrices + * + * @returns 1 if equal, 0 otherwise + * @param mat1 + * @param mat2 + */ +int ibz_mat_4x4_equal(const ibz_mat_4x4_t *mat1, const ibz_mat_4x4_t *mat2); + +/** @brief Copies all values from a 4x4 integer matrix to another one + * + * @param new Output: matrix which will have its entries set to mat's entries + * @param mat Input matrix + */ +void ibz_mat_4x4_copy(ibz_mat_4x4_t *new, const ibz_mat_4x4_t *mat); + +/** @brief Matrix by integer multiplication + * + * @param prod Output + * @param scalar + * @param mat + */ +void ibz_mat_4x4_scalar_mul(ibz_mat_4x4_t *prod, const ibz_t *scalar, const ibz_mat_4x4_t *mat); + +/** @brief gcd of all values in matrix + * + * @param gcd Output + * @param mat + */ +void ibz_mat_4x4_gcd(ibz_t *gcd, const ibz_mat_4x4_t *mat); + +/** @brief Verifies whether the 4x4 input matrix is in Hermite Normal Form + * + * @returns 1 if mat is in HNF, 0 otherwise + * @param mat Matrix to be tested + */ +int ibz_mat_4x4_is_hnf(const ibz_mat_4x4_t *mat); + +/** @brief Hermite Normal Form of a matrix of 8 integer vectors, computed using a multiple of its + * determinant as modulo + * + * Algorithm used is the one at number 2.4.8 in Henri Cohen's "A Course in Computational Algebraic + * Number Theory" (Springer Verlag, in series "Graduate texts in Mathematics") from 1993 + * + * @param hnf Output: Matrix in Hermite Normal Form generating the same lattice as generators + * @param generators matrix whose colums generate the same lattice than the output + * @param generator_number number of generators given + * @param mod integer, must be a multiple of the volume of the lattice generated by the columns of + * generators + */ +void ibz_mat_4xn_hnf_mod_core(ibz_mat_4x4_t *hnf, + int generator_number, + const ibz_vec_4_t *generators, + const ibz_t *mod); + +/** @} + */ +/** @} + */ + +/** @internal + * @defgroup quat_dim2_helpers Helper functions for dimension 2 + * @{ + */ + +/** @brief Set vector coefficients to the given integers + * + * @param vec Output: Vector + * @param a0 + * @param a1 + */ +void ibz_vec_2_set(ibz_vec_2_t *vec, int a0, int a1); // test/dim2 + +/** @brief Set matrix coefficients to the given integers + * + * @param mat Output: Matrix + * @param a00 + * @param a01 + * @param a10 + * @param a11 + */ +void ibz_mat_2x2_set(ibz_mat_2x2_t *mat, int a00, int a01, int a10, int a11); // test/dim2 + +void ibz_mat_2x2_add(ibz_mat_2x2_t *sum, const ibz_mat_2x2_t *a, + const ibz_mat_2x2_t *b); // unused + +/** @brief Determinant of a 2x2 integer matrix given as 4 integers + * + * @param det Output: Determinant of the matrix + * @param a11 matrix coefficient (upper left corner) + * @param a12 matrix coefficient (upper right corner) + * @param a21 matrix coefficient (lower left corner) + * @param a22 matrix coefficient (lower right corner) + */ +void ibz_mat_2x2_det_from_ibz(ibz_t *det, + const ibz_t *a11, + const ibz_t *a12, + const ibz_t *a21, + const ibz_t *a22); // dim4 + +/** + * @brief a*b for 2x2 integer matrices modulo m + * + * @param prod Output matrix + * @param mat_a Input matrix + * @param mat_b Input matrix + * @param m Integer modulo + */ +void ibz_2x2_mul_mod(ibz_mat_2x2_t *prod, + const ibz_mat_2x2_t *mat_a, + const ibz_mat_2x2_t *mat_b, + const ibz_t *m); // test/dim2 +/** @} + */ + +/** @internal + * @defgroup quat_lattice_helper Helper functions for the lattice library (dimension 4) + * @{ + */ + +/** + * @brief Modifies a lattice to put it in hermite normal form + * + * In-place modification of the lattice. + * + * @param lat input lattice + * + * On a correct lattice this function changes nothing (since it is already in HNF), but it can be + * used to put a handmade one in correct form in order to use the other lattice functions. + */ +void quat_lattice_hnf(quat_lattice_t *lat); // lattice, test/lattice, test/algebra, + +/** + * @brief Lattice equality + * + * Lattice bases are assumed to be under HNF, but denominators are free. + * + * @returns 1 if both lattices are equal, 0 otherwise + * @param lat1 + * @param lat2 + */ +int quat_lattice_equal(const quat_lattice_t *lat1, + const quat_lattice_t *lat2); // ideal, lattice, test/lattice, test/ideal + +/** + * @brief Lattice inclusion test + * + * Lattice bases are assumed to be under HNF, but denominators are free. + * + * @returns 1 if sublat is included in overlat, 0 otherwise + * @param sublat Lattice whose inclusion in overlat will be testes + * @param overlat + */ +int quat_lattice_inclusion(const quat_lattice_t *sublat, + const quat_lattice_t *overlat); // test/lattice, test/ideal + +/** @brief Divides basis and denominator of a lattice by their gcd + * + * @param reduced Output + * @param lat Lattice + */ +void quat_lattice_reduce_denom(quat_lattice_t *reduced, + const quat_lattice_t *lat); // lattice, ideal, + +/** @brief a+b for lattices + * + * @param res Output + * @param lat1 Lattice + * @param lat2 Lattice + */ +void quat_lattice_add(quat_lattice_t *res, + const quat_lattice_t *lat1, + const quat_lattice_t *lat2); // ideal, lattice, test/lattice + +/** @brief a*b for lattices + * + * @param res Output + * @param lat1 Lattice + * @param lat2 Lattice + * @param alg The quaternion algebra + */ +void quat_lattice_mul(quat_lattice_t *res, + const quat_lattice_t *lat1, + const quat_lattice_t *lat2, + const quat_alg_t *alg); // ideal, lattie, test/ideal, test/lattice + +/** + * @brief Computes the dual lattice of lat, without putting its basis in HNF + * + * This function returns a lattice not under HNF. For careful internal use only. + * + * Computation method described in https://cseweb.ucsd.edu/classes/sp14/cse206A-a/lec4.pdf consulted + * on 19 of May 2023, 12h40 CEST + * + * @param dual Output: The dual lattice of lat. ATTENTION: is not under HNF. hnf computation must be + * applied before using lattice functions on it + * @param lat lattice, the dual of it will be computed + */ +void quat_lattice_dual_without_hnf(quat_lattice_t *dual, + const quat_lattice_t *lat); // lattice, ideal + +/** + * @brief Multiply all columns of lat with coord (as algebra elements) + * + * The columns and coord are seen as algebra elements in basis 1,i,j,ij, i^2 = -1, j^2 = -p). Coord + * is multiplied to the right of lat. + * + * The output matrix is not under HNF. + * + * @param prod Output: Matrix not under HND whose columns represent the algebra elements obtained as + * L*coord for L column of lat. + * @param lat Matrix whose columns are algebra elements in basis (1,i,j,ij) + * @param coord Integer coordinate algebra element in basis (1,i,j,ij) + * @param alg The quaternion algebra + */ +void quat_lattice_mat_alg_coord_mul_without_hnf(ibz_mat_4x4_t *prod, + const ibz_mat_4x4_t *lat, + const ibz_vec_4_t *coord, + const quat_alg_t *alg); // lattice + +/** @brief The index of sublat into overlat + * + * Assumes inputs are in HNF. + * + * @param index Output + * @param sublat A lattice in HNF, must be sublattice of overlat + * @param overlat A lattice in HNF, must be overlattice of sublat + */ +void quat_lattice_index(ibz_t *index, const quat_lattice_t *sublat, + const quat_lattice_t *overlat); // ideal + +/** @brief Compute the Gram matrix of the quaternion trace bilinear form + * + * Given a lattice of the quaternion algebra, computes the Gram matrix + * of the bilinear form + * + * 〈a,b〉 := [lattice->denom^2] Tr(a·conj(b)) + * + * multiplied by the square of the denominator of the lattice. + * + * This matrix always has integer entries. + * + * @param G Output: Gram matrix of the trace bilinear form on the lattice, multiplied by the square + * of the denominator of the lattice + * @param lattice A lattice + * @param alg The quaternion algebra + */ +void quat_lattice_gram(ibz_mat_4x4_t *G, const quat_lattice_t *lattice, const quat_alg_t *alg); + +/** + * @brief Compute an integer parallelogram containing the ball of + * given radius for the positive definite quadratic form defined by + * the Gram matrix G. + * + * The computed parallelogram is defined by the vectors + * + * (x₁ x₂ x₃ x₄) · U + * + * with x_i ∈ [ -box[i], box[i] ]. + * + * @param box Output: bounds of the parallelogram + * @param U Output: Unimodular transformation defining the parallelogram + * @param G Gram matrix of the quadratic form, must be full rank + * @param radius Radius of the ball, must be non-negative + * @returns 0 if the box only contains the origin, 1 otherwise + */ +int quat_lattice_bound_parallelogram(ibz_vec_4_t *box, ibz_mat_4x4_t *U, const ibz_mat_4x4_t *G, const ibz_t *radius); + +/** @} + */ + +/** @internal + * @defgroup quat_lideal_helper Helper functions for ideals and orders + * @{ + */ +/** @brief Set norm of an ideal given its lattice and parent order + * + * @param lideal In/Output: Ideal which has lattice and parent_order correctly set, but not + * necessarily the norm. Will have norm correctly set too. + */ +void quat_lideal_norm(quat_left_ideal_t *lideal); // ideal + +/** + * @brief Left principal ideal of order, generated by x + * + * @param lideal Output: left ideal + * @param alg quaternion algebra + * @param order maximal order of alg whose left ideal is searched + * @param x generating element + * + * Creates the left ideal in 'order' generated by the element 'x' + */ +void quat_lideal_create_principal(quat_left_ideal_t *lideal, + const quat_alg_elem_t *x, + const quat_lattice_t *order, + const quat_alg_t *alg); // ideal, test/ideal + +/** + * @brief Equality test for left ideals + * + * @returns 1 if both left ideals are equal, 0 otherwise + * @param lideal1 left ideal + * @param lideal2 left ideal + * @param alg the quaternion algebra + */ +int quat_lideal_equals(const quat_left_ideal_t *lideal1, + const quat_left_ideal_t *lideal2, + const quat_alg_t *alg); // test/ideal + +/** + * @brief Sum of two left ideals + * + * @param sum Output: Left ideal which is the sum of the 2 inputs + * @param lideal1 left ideal + * @param lideal2 left ideal + * @param alg the quaternion algebra + */ +void quat_lideal_add(quat_left_ideal_t *sum, + const quat_left_ideal_t *lideal1, + const quat_left_ideal_t *lideal2, + const quat_alg_t *alg); // Not used outside + +/** + * @brief Left ideal product of left ideal I and element alpha + * + * @param product Output: lideal I*alpha, must have integer norm + * @param lideal left ideal + * @param alpha element multiplied to lideal to get the product ideal + * @param alg the quaternion algebra + * + * I*alpha where I is a left-ideal and alpha an element of the algebra + * + * The resulting ideal must have an integer norm + * + */ +void quat_lideal_mul(quat_left_ideal_t *product, + const quat_left_ideal_t *lideal, + const quat_alg_elem_t *alpha, + const quat_alg_t *alg); // test/ideal + +/** @brief Computes the inverse ideal (for a left ideal of a maximal order) without putting it under + * HNF + * + * This function returns a lattice not under HNF. For careful internal use only + * + * Computes the inverse ideal for lideal as conjugate(lideal)/norm(lideal) + * + * @param inv Output: lattice which is lattice representation of the inverse ideal of lideal + * ATTENTION: is not under HNF. hnf computation must be applied before using lattice functions on it + * @param lideal Left ideal of a maximal order in alg + * @param alg The quaternion algebra + */ +void quat_lideal_inverse_lattice_without_hnf(quat_lattice_t *inv, + const quat_left_ideal_t *lideal, + const quat_alg_t *alg); // ideal + +/** @brief Computes the right transporter of two left ideals of the same maximal order + * + * Following the implementation of ideal isomorphisms in the code of LearningToSQI's sage + * implementation of SQIsign. Computes the right transporter of (J:I) as inverse(I)J. + * + * @param trans Output: lattice which is right transporter from lideal1 to lideal2 (lideal2:lideal1) + * @param lideal1 Left ideal of the same maximal order than lideal1 in alg + * @param lideal2 Left ideal of the same maximal order than lideal1 in alg + * @param alg The quaternion algebra + */ +void quat_lideal_right_transporter(quat_lattice_t *trans, + const quat_left_ideal_t *lideal1, + const quat_left_ideal_t *lideal2, + const quat_alg_t *alg); + +/** + * @brief Right order of a left ideal + * + * @param order Output: right order of the given ideal + * @param lideal left ideal + * @param alg the quaternion algebra + */ +void quat_lideal_right_order(quat_lattice_t *order, const quat_left_ideal_t *lideal, + const quat_alg_t *alg); // ideal + +/** + * @brief Gram matrix of the trace map of the ideal class + * + * Compute the Gram matrix of the bilinear form + * + * 〈a, b〉 := Tr(a·conj(b)) / norm(lideal) + * + * on the basis of the ideal. This matrix has integer entries and its + * integer congruence class only depends on the ideal class. + * + * @param G Output: Gram matrix of the trace map + * @param lideal left ideal + * @param alg the quaternion algebra + */ +void quat_lideal_class_gram(ibz_mat_4x4_t *G, const quat_left_ideal_t *lideal, const quat_alg_t *alg); + +/** @brief Test if order is maximal + * + * Checks if the discriminant of the order equals the prime p defining the quaternion algebra. + * + * It is not verified whether the order is really an order. The output 1 only means that if it is an + * order, then it is maximal. + * + * @returns 1 if order is maximal (assuming it is an order), 0 otherwise + * @param order An order of the quaternion algebra (assumes to be an order, this is not tested) + * @param alg The quaternion algebra + */ +int quat_order_is_maximal(const quat_lattice_t *order, + const quat_alg_t *alg); // ideal (only in asserts) + +/** @brief Compute the discriminant of an order as sqrt(det(gram(reduced_norm))) + * + * @param disc: Output: The discriminant sqrt(det(gram(reduced_norm))) + * @param order An order of the quaternion algebra + * @param alg The quaternion algebra + */ +int quat_order_discriminant(ibz_t *disc, const quat_lattice_t *order, + const quat_alg_t *alg); // ideal + +/** @} + */ + +/** @internal + * @ingroup quat_normeq + * @{ + */ + +/** @brief Set lattice to O0 + * + * @param O0 Lattice to be set to (1,i,(i+j)/2,(1+ij)/2) + */ +void quat_lattice_O0_set(quat_lattice_t *O0); + +/** @brief Set p-extremal maximal order to O0 + * + * @param O0 p-extremal order to be set to (1,i,(i+j)/2,(1+ij)/2) + */ +void quat_lattice_O0_set_extremal(quat_p_extremal_maximal_order_t *O0); + +/** + * @brief Create an element of a extremal maximal order from its coefficients + * + * @param elem Output: the quaternion element + * @param order the order + * @param coeffs the vector of 4 ibz coefficients + * @param Bpoo quaternion algebra + * + * elem = x + z*y + z*u + t*z*v + * where coeffs = [x,y,u,v] and t = order.t z = order.z + * + */ +void quat_order_elem_create(quat_alg_elem_t *elem, + const quat_p_extremal_maximal_order_t *order, + const ibz_vec_4_t *coeffs, + const quat_alg_t *Bpoo); // normeq, untested + +/** @} + */ +/** @} + */ + +#endif diff --git a/src/quaternion/ref/generic/internal_quaternion_headers/lll_internals.h b/src/quaternion/ref/generic/internal_quaternion_headers/lll_internals.h new file mode 100644 index 0000000..e8d9014 --- /dev/null +++ b/src/quaternion/ref/generic/internal_quaternion_headers/lll_internals.h @@ -0,0 +1,238 @@ +#ifndef LLL_INTERNALS_H +#define LLL_INTERNALS_H + +/** @file + * + * @authors Sina Schaeffler + * + * @brief Declarations of functions only used for the LLL tets + */ + +#include + +/** @internal + * @ingroup quat_helpers + * @defgroup lll_internal Functions only used for LLL or its tests + * @{ + */ + +/** @internal + * @ingroup lll_internal + * @defgroup lll_params Parameters used by the L2 implementation (floats) and its tests (ints) + * @{ + */ + +#define DELTABAR 0.995 +#define DELTA_NUM 99 +#define DELTA_DENOM 100 + +#define ETABAR 0.505 +#define EPSILON_NUM 1 +#define EPSILON_DENOM 100 + +#define PREC 64 +/** + * @} + */ + +/** @internal + * @ingroup lll_internal + * @defgroup ibq_t Types for rationals + * @{ + */ + +/** @brief Type for fractions of integers + * + * @typedef ibq_t + * + * For fractions of integers of arbitrary size, used by intbig module, using gmp + */ +typedef ibz_t ibq_t[2]; +typedef ibq_t ibq_vec_4_t[4]; +typedef ibq_t ibq_mat_4x4_t[4][4]; + +/**@} + */ + +/** @internal + * @ingroup lll_internal + * @defgroup lll_ibq_c Constructors and Destructors and Printers + * @{ + */ + +void ibq_init(ibq_t *x); +void ibq_finalize(ibq_t *x); + +void ibq_mat_4x4_init(ibq_mat_4x4_t *mat); +void ibq_mat_4x4_finalize(ibq_mat_4x4_t *mat); + +void ibq_vec_4_init(ibq_vec_4_t *vec); +void ibq_vec_4_finalize(ibq_vec_4_t *vec); + +void ibq_mat_4x4_print(const ibq_mat_4x4_t *mat); +void ibq_vec_4_print(const ibq_vec_4_t *vec); + +/** @} + */ + +/** @internal + * @ingroup lll_internal + * @defgroup lll_qa Basic fraction arithmetic + * @{ + */ + +/** @brief sum=a+b + */ +void ibq_add(ibq_t *sum, const ibq_t *a, const ibq_t *b); + +/** @brief diff=a-b + */ +void ibq_sub(ibq_t *diff, const ibq_t *a, const ibq_t *b); + +/** @brief neg=-x + */ +void ibq_neg(ibq_t *neg, const ibq_t *x); + +/** @brief abs=|x| + */ +void ibq_abs(ibq_t *abs, const ibq_t *x); + +/** @brief prod=a*b + */ +void ibq_mul(ibq_t *prod, const ibq_t *a, const ibq_t *b); + +/** @brief inv=1/x + * + * @returns 0 if x is 0, 1 if inverse exists and was computed + */ +int ibq_inv(ibq_t *inv, const ibq_t *x); + +/** @brief Compare a and b + * + * @returns a positive value if a > b, zero if a = b, and a negative value if a < b + */ +int ibq_cmp(const ibq_t *a, const ibq_t *b); + +/** @brief Test if x is 0 + * + * @returns 1 if x=0, 0 otherwise + */ +int ibq_is_zero(const ibq_t *x); + +/** @brief Test if x is 1 + * + * @returns 1 if x=1, 0 otherwise + */ +int ibq_is_one(const ibq_t *x); + +/** @brief Set q to a/b if b not 0 + * + * @returns 1 if b not 0 and q is set, 0 otherwise + */ +int ibq_set(ibq_t *q, const ibz_t *a, const ibz_t *b); + +/** @brief Copy value into target + */ +void ibq_copy(ibq_t *target, const ibq_t *value); + +/** @brief Checks if q is an integer + * + * @returns 1 if yes, 0 if not + */ +int ibq_is_ibz(const ibq_t *q); + +/** + * @brief Converts a fraction q to an integer y, if q is an integer. + * + * @returns 1 if z is an integer, 0 if not + */ +int ibq_to_ibz(ibz_t *z, const ibq_t *q); +/** @} + */ + +/** @internal + * @ingroup lll_internal + * @defgroup quat_lll_verify_helpers Helper functions for lll verification in dimension 4 + * @{ + */ + +/** @brief Set ibq to parameters delta and eta = 1/2 + epsilon using L2 constants + */ +void quat_lll_set_ibq_parameters(ibq_t *delta, ibq_t *eta); + +/** @brief Set an ibq vector to 4 given integer coefficients + */ +void ibq_vec_4_copy_ibz(ibq_vec_4_t *vec, + const ibz_t *coeff0, + const ibz_t *coeff1, + const ibz_t *coeff2, + const ibz_t *coeff3); // dim4, test/dim4 + +/** @brief Bilinear form vec00*vec10+vec01*vec11+q*vec02*vec12+q*vec03*vec13 for ibz_q + */ +void quat_lll_bilinear(ibq_t *b, const ibq_vec_4_t *vec0, const ibq_vec_4_t *vec1, + const ibz_t *q); // dim4, test/dim4 + +/** @brief Outputs the transposition of the orthogonalised matrix of mat (as fractions) + * + * For the bilinear form vec00*vec10+vec01*vec11+q*vec02*vec12+q*vec03*vec13 + */ +void quat_lll_gram_schmidt_transposed_with_ibq(ibq_mat_4x4_t *orthogonalised_transposed, + const ibz_mat_4x4_t *mat, + const ibz_t *q); // dim4 + +/** @brief Verifies if mat is lll-reduced for parameter coeff and norm defined by q + * + * For the bilinear form vec00*vec10+vec01*vec11+q*vec02*vec12+q*vec03*vec13 + */ +int quat_lll_verify(const ibz_mat_4x4_t *mat, + const ibq_t *delta, + const ibq_t *eta, + const quat_alg_t *alg); // test/lattice, test/dim4 + /** @} + */ + +/** @internal + * @ingroup lll_internal + * @defgroup lll_internal_gram Internal LLL function + * @{ + */ + +/** @brief In-place L2 reduction core function + * + * Given a lattice basis represented by the columns of a 4x4 matrix + * and the Gram matrix of its bilinear form, L2-reduces the basis + * in-place and updates the Gram matrix accordingly. + * + * Implements the L2 Algorithm of Nguyen-Stehlé, also known as fplll: + * https://iacr.org/archive/eurocrypt2005/34940217/34940217.pdf + * + * Parameters are in lll/lll_internals.h + * + * @param G In/Output: Gram matrix of the lattice basis + * @param basis In/Output: lattice basis + */ +void quat_lll_core(ibz_mat_4x4_t *G, ibz_mat_4x4_t *basis); + +/** + * @brief LLL reduction on 4-dimensional lattice + * + * Implements the L2 Algorithm of Nguyen-Stehlé, also known as fplll: + * https://iacr.org/archive/eurocrypt2005/34940217/34940217.pdf + * + * Parameters are in lll/lll_internals.h + * + * @param red Output: LLL reduced basis + * @param lattice In/Output: lattice with 4-dimensional basis + * @param alg The quaternion algebra + */ +int quat_lattice_lll(ibz_mat_4x4_t *red, const quat_lattice_t *lattice, const quat_alg_t *alg); + +/** + * @} + */ + +// end of lll_internal +/** @} + */ +#endif diff --git a/src/quaternion/ref/generic/internal_quaternion_headers/quaternion_tests.h b/src/quaternion/ref/generic/internal_quaternion_headers/quaternion_tests.h new file mode 100644 index 0000000..ba67135 --- /dev/null +++ b/src/quaternion/ref/generic/internal_quaternion_headers/quaternion_tests.h @@ -0,0 +1,349 @@ +/** @file + * + * @authors Sina Schaeffler + * + * @brief Declarations of tests of quaternion algebra operations + */ + +#ifndef QUATERNION_TESTS_H +#define QUATERNION_TESTS_H + +#include +#include +#include "internal.h" + +/** @internal + * @ingroup quat_helpers + * @defgroup quat_tests Quaternion module test functions + * @{ + */ + +/** @internal + * @ingroup quat_tests + * @defgroup quat_test_inputs Quaternion module random test input generation + * @{ + */ + +/** + * @brief Generates list of random ideals of a special extremal order + * + * @param ideals Output: Array of iterations left ideals of the given special extremal order and of + * norms of size norm_bitsize + * @param norm_bitsize Bitsize of the norms of the outut ideals + * @param iterations Number of ideals to sample. Most be smaller than ideals is long + * @param params quat_represent_integer_params_t parameters for the left order of the ideals to be + * sampled. + * @return 0 if success, 1 if failure + */ +int quat_test_input_random_ideal_generation(quat_left_ideal_t *ideals, + int norm_bitsize, + int iterations, + const quat_represent_integer_params_t *params); + +/** + * @brief Generates list of random ideals of a special extremal order + * + * @param lattices Output: Array of iterations left ideals of the given special extremal order and + * of norms of size norm_bitsize, given only by their lattices + * @param norms Output: Array which will contain the norms of the sampled ideals, in the same order + * as their lattices are. Can be NULL, in which case no norm is output. Otherwise, it must be an + * array of length at least iterations + * @param norm_bitsize Bitsize of the norms of the outut ideals + * @param iterations Number of ideals to sample. Most be smaller than lattices is long + * @param params quat_represent_integer_params_t parameters for the left order of the ideals to be + * sampled. + * @return 0 if success, 1 if failure + */ +int quat_test_input_random_ideal_lattice_generation(quat_lattice_t *lattices, + ibz_t *norms, + int norm_bitsize, + int iterations, + const quat_represent_integer_params_t *params); + +/** + * @brief Generates list of random lattices + * + * @param lattices Output: Array of iterations lattices + * @param bitsize Bitsize of the coefficients of a random basis of the lattices + * @param iterations Number of lattices to sample.Most be smaller than lattices is long + * @param in_hnf If not 0, the lattices are put in HNF before being outputs. Their coefficients in + * this basis might be larger than bitsize. + * @return 0 if success, 1 if failure + */ +int quat_test_input_random_lattice_generation(quat_lattice_t *lattices, int bitsize, int iterations, int in_hnf); +/** + * @} + */ + +/** @brief Test for integer functions + * + * void ibz_init(ibz_t *x); + * + * void ibz_finalize(ibz_t *x); + * + * void ibz_add(ibz_t *sum, const ibz_t *a, const ibz_t *b); + * + * void ibz_sub(ibz_t *diff, const ibz_t *a, const ibz_t *b); + * + * void ibz_mul(ibz_t *prod, const ibz_t *a, const ibz_t *b); + * + * void ibz_neg(ibz_t *neg, const ibz_t *a); + * + * void ibz_abs(ibz_t *abs, const ibz_t *a); + * + * void ibz_div(ibz_t *quotient, ibz_t *remainder, const ibz_t *a, const ibz_t *b); + * + * void ibz_div_2exp(ibz_t *quotient, const ibz_t *a, uint32_t exp); + * + * void ibz_mod(ibz_t *r, const ibz_t *a, const ibz_t *b); + * + * unsigned long int ibz_mod_ui(const mpz_t *n, unsigned long int d); + * + * int ibz_divides(const ibz_t *a, const ibz_t *b); + * + * void ibz_pow(ibz_t *pow, const ibz_t *x, uint32_t e); + * + * void ibz_pow_mod(ibz_t *pow, const ibz_t *x, const ibz_t *e, const ibz_t *m); + * + * int ibz_cmp(const ibz_t *a, const ibz_t *b); + * + * int ibz_is_zero(const ibz_t *x); + * + * int ibz_is_one(const ibz_t *x); + * + * int ibz_cmp_int32(const ibz_t *x, int32_t y); + * + * int ibz_is_even(const ibz_t *x); + * + * int ibz_is_odd(const ibz_t *x); + * + * void ibz_set(ibz_t *i, int32_t x); + * + * void ibz_copy(ibz_t *target, const ibz_t *value); + * + * void ibz_swap(ibz_t *a, ibz_t *b); + * + * void ibz_copy_digits(ibz_t *target, const digit_t *dig, int dig_len); + * + * void ibz_to_digits(digit_t *target, const ibz_t *ibz); + * + * int32_t ibz_get(const ibz_t *i); + * + * int ibz_rand_interval(ibz_t *rand, const ibz_t *a, const ibz_t *b); + * + * int ibz_rand_interval_minm_m(ibz_t *rand, int32_t m); + * + * int ibz_bitsize(const ibz_t *a); + * + * void ibz_gcd(ibz_t *gcd, const ibz_t *a, const ibz_t *b); + * + * int ibz_invmod(ibz_t *inv, const ibz_t *a, const ibz_t *mod); + * + * void ibz_sqrt_floor(ibz_t *sqrt, const ibz_t *a); + */ +int ibz_test_intbig(void); + +/** @brief Test for implementations of GMP functions missing from the mini-GMP API + * + * int mpz_legendre(const mpz_t a, const mpz_t p); + * + * double mpz_get_d_2exp(signed long int *exp, const mpz_t op); + */ +int mini_gmp_test(void); + +/** @brief Test initializers and finalizers for quaternion algebra types + * + * Test initializers and finalizers for the following types: + * + * quat_alg_t + * + * quat_alg_elem_t + * + * quat_alg_coord_t + * + * ibz_vec_2_t + * + * ibz_vec_4_t + * + * ibz_mat_2x2_t + * + * ibz_mat_4x4_t + * + * quat_lattice_t + * + * quat_lattice_t + * + * quat_left_ideal_t + */ +int quat_test_finit(void); + +/** @brief Test integer, quadratic form and matrix functions for dimension 4 from the quaternion + * module + * + * Runs unit tests for the following functions + * + * void ibz_mat_4x4_eval(quat_alg_coord_t *res, const ibz_mat_4x4_t *mat, const quat_alg_coord_t + * *vec); + * + * void quat_qf_eval(ibz_t *res, const ibz_mat_4x4_t *qf, const quat_alg_coord_t *coord); + * + * void ibz_vec_4_content(ibz_t *content, const quat_alg_coord_t *v); + */ +int quat_test_dim4(void); + +/** @brief Test integer, lattice and matrix functions for dimension 2 from the quaternion module + * + * Runs unit tests for the following functions + * + * void ibz_mat_2x2_copy(ibz_vec_2_t *copy, const ibz_mat_2x2_t *copied); + * + * void ibz_mat_2x2_eval(ibz_vec_2_t *res, const ibz_mat_2x2_t *mat, const ibz_vec_2_t *vec); + * + * void ibz_mat_4x4_eval_t(ibz_vec_4_t *res, const ibz_vec_4_t *vec, const ibz_mat_4x4_t *mat); + * + * void ibz_2x2_mul_mod(ibz_mat_2x2_t *prod, const ibz_mat_2x2_t *mat_a, const ibz_mat_2x2_t *mat_b, + * const ibz_t *m); + * + * int ibz_mat_2x2_inv_mod(ibz_mat_2x2_t *inv, const ibz_mat_2x2_t *mat, const ibz_t *m); + */ +int quat_test_dim2(void); + +/** @brief Test integer functions + * + * Runs unit tests for the following functions + * + * int ibz_generate_random_prime(ibz_t *p, int is3mod4, int bitsize); + * + * int ibz_cornacchia_prime(ibz_t *x, ibz_t *y, const ibz_t *n, const ibz_t *p); + */ +int quat_test_integers(void); + +/** @brief Test operations on quaternion algebra elements + * + * Runs unit tests for the following functions + * + * void quat_alg_add(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b); + * + * void quat_alg_sub(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b); + * + * void quat_alg_mul(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b, const + * quat_alg_t *alg); + * + * void quat_alg_norm(ibz_t *res_num, ibz_t *res_denom, const quat_alg_elem_t *a, const quat_alg_t + * *alg); + * + * void quat_alg_scalar(quat_alg_elem_t *elem, const ibz_t *numerator, const ibz_t *denominator); + * + * void quat_alg_conj(quat_alg_elem_t *conj, const quat_alg_elem_t *x); + * + * void quat_alg_make_primitive(quat_alg_coord_t *primitive_x, ibz_t *content, const quat_alg_elem_t + * *x, const quat_lattice_t *order, const quat_alg_t *alg){ + * + * void quat_alg_normalize(quat_alg_elem_t *x); + * + * int quat_alg_elem_is_zero(const quat_alg_elem_t *x); + * + * int quat_alg_coord_is_zero(const quat_alg_coord_t *x); + * + * void quat_alg_elem_copy(quat_alg_elem_t *copy, const quat_alg_elem_t *copied); + */ +int quat_test_algebra(void); + +/** @brief Test operations on lattices + * + * Runs unit tests for the following functions + * + * void quat_lattice_add(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t + * *lat2); + * + * void quat_lattice_intersect(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t + * *lat2); + * + * void quat_lattice_conjugate_without_hnf(quat_lattice_t *conj, const quat_lattice_t *lat); + * + * void quat_lattice_alg_elem_mul(quat_lattice_t *prod, const quat_lattice_t *lat, const + * quat_alg_elem_t *elem, const quat_alg_t *alg); + * + * void quat_lattice_mul(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t + * *lat2, const quat_alg_t *alg); + * + * int quat_lattice_contains(quat_alg_coord_t *coord, const quat_lattice_t *lat, const + * quat_alg_elem_t *x, const quat_alg_t *alg); + * + * void quat_lattice_hnf(quat_lattice_t *lat); + */ +int quat_test_lattice(void); + +/** @brief Test for lattice reduction and functions based on it + * + * int quat_lideal_reduce_basis(ibz_mat_4x4_t *reduced, ibz_mat_4x4_t *gram, const quat_left_ideal_t + * *lideal, const quat_alg_t *alg); + * + * int quat_lideal_lideal_mul_reduced(quat_left_ideal_t *prod, ibz_mat_4x4_t *gram, const + * quat_left_ideal_t *lideal1,const quat_left_ideal_t *lideal2, const quat_alg_t *alg); + * + * int quat_lideal_prime_norm_reduced_equivalent(quat_left_ideal_t *lideal, const quat_alg_t *alg, + * const int primality_num_iter, const int equiv_bound_coeff); + */ +int quat_test_lll(void); + +/** @brief Test operations on left ideals and their creation + * + * Runs unit tests for the following functions + * + * void quat_lideal_copy(quat_left_ideal_t *copy, const quat_left_ideal_t *copied) + * + * void quat_lideal_create_principal(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const + * quat_lattice_t *order, const quat_alg_t *alg); + * + * void quat_lideal_create(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const + * ibz_t *N, const quat_lattice_t *order, const quat_alg_t *alg); + * + * int quat_lideal_generator(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const + * quat_alg_t); + * + * void quat_lideal_add(quat_left_ideal_t *sum, const quat_left_ideal_t *I1, const quat_left_ideal_t + * *I2, const quat_alg_t *alg); + * + * void quat_lideal_inter(quat_left_ideal_t *intersection, const quat_left_ideal_t *I1, const + * quat_left_ideal_t *I2, const quat_alg_t *alg); + * + * int quat_lideal_equals(const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t + * *alg); + * + */ +int quat_test_lideal(void); + +/** @brief Test operations on represent integer + * + * int quat_sampling_random_ideal_O0_given_norm(quat_left_ideal_t *lideal,const ibz_t *norm,int + * is_prime,const quat_represent_integer_params_t *params,int prime_sampling_attempts); + * + * void quat_change_to_O0_basis(ibz_vec_4_t *vec, const quat_alg_elem_t *el); + * + * int quat_represent_integer(quat_alg_elem_t *gamma, const ibz_t *n_gamma, int non_diag, const + * quat_represent_integer_params_t *params); + */ +int quat_test_normeq(void); + +/** @brief Test functions for sampling lattice points of bounded norm + * + * int quat_lattice_sample_from_ball(ibz_vec_4_t *x, const quat_lattice_t *lattice, const quat_alg_t + * *alg, const ibz_t *radius); + */ +int quat_test_lat_ball(void); + +/** @brief Test for hnf core and verification + * + */ +int quat_test_hnf(void); + +/** @brief Test with randomization for complex functions where this is possible + * + */ +int quat_test_with_randomization(void); + +/** @} + */ + +#endif diff --git a/src/quaternion/ref/generic/lat_ball.c b/src/quaternion/ref/generic/lat_ball.c new file mode 100644 index 0000000..c7bbb96 --- /dev/null +++ b/src/quaternion/ref/generic/lat_ball.c @@ -0,0 +1,139 @@ +#include +#include +#include +#include "internal.h" +#include "lll_internals.h" + +int +quat_lattice_bound_parallelogram(ibz_vec_4_t *box, ibz_mat_4x4_t *U, const ibz_mat_4x4_t *G, const ibz_t *radius) +{ + ibz_t denom, rem; + ibz_init(&denom); + ibz_init(&rem); + ibz_mat_4x4_t dualG; + ibz_mat_4x4_init(&dualG); + +// Compute the Gram matrix of the dual lattice +#ifndef NDEBUG + int inv_check = ibz_mat_4x4_inv_with_det_as_denom(&dualG, &denom, G); + assert(inv_check); +#else + (void)ibz_mat_4x4_inv_with_det_as_denom(&dualG, &denom, G); +#endif + // Initialize the dual lattice basis to the identity matrix + ibz_mat_4x4_identity(U); + // Reduce the dual lattice + quat_lll_core(&dualG, U); + + // Compute the parallelogram's bounds + int trivial = 1; + for (int i = 0; i < 4; i++) { + ibz_mul(&(*box)[i], &dualG[i][i], radius); + ibz_div(&(*box)[i], &rem, &(*box)[i], &denom); + ibz_sqrt_floor(&(*box)[i], &(*box)[i]); + trivial &= ibz_is_zero(&(*box)[i]); + } + + // Compute the transpose transformation matrix +#ifndef NDEBUG + int inv = ibz_mat_4x4_inv_with_det_as_denom(U, &denom, U); +#else + (void)ibz_mat_4x4_inv_with_det_as_denom(U, &denom, U); +#endif + // U is unitary, det(U) = ± 1 + ibz_mat_4x4_scalar_mul(U, &denom, U); +#ifndef NDEBUG + assert(inv); + ibz_abs(&denom, &denom); + assert(ibz_is_one(&denom)); +#endif + + ibz_mat_4x4_finalize(&dualG); + ibz_finalize(&denom); + ibz_finalize(&rem); + return !trivial; +} + +int +quat_lattice_sample_from_ball(quat_alg_elem_t *res, + const quat_lattice_t *lattice, + const quat_alg_t *alg, + const ibz_t *radius) +{ + assert(ibz_cmp(radius, &ibz_const_zero) > 0); + + ibz_vec_4_t box; + ibz_vec_4_init(&box); + ibz_mat_4x4_t U, G; + ibz_mat_4x4_init(&U); + ibz_mat_4x4_init(&G); + ibz_vec_4_t x; + ibz_vec_4_init(&x); + ibz_t rad, tmp; + ibz_init(&rad); + ibz_init(&tmp); + + // Compute the Gram matrix of the lattice + quat_lattice_gram(&G, lattice, alg); + + // Correct ball radius by the denominator + ibz_mul(&rad, radius, &lattice->denom); + ibz_mul(&rad, &rad, &lattice->denom); + // Correct by 2 (Gram matrix corresponds to twice the norm) + ibz_mul(&rad, &rad, &ibz_const_two); + + // Compute a bounding parallelogram for the ball, stop if it only + // contains the origin + int ok = quat_lattice_bound_parallelogram(&box, &U, &G, &rad); + if (!ok) + goto err; + + // Rejection sampling from the parallelogram +#ifndef NDEBUG + int cnt = 0; +#endif + do { + // Sample vector + for (int i = 0; i < 4; i++) { + if (ibz_is_zero(&box[i])) { + ibz_copy(&x[i], &ibz_const_zero); + } else { + ibz_add(&tmp, &box[i], &box[i]); + ok &= ibz_rand_interval(&x[i], &ibz_const_zero, &tmp); + ibz_sub(&x[i], &x[i], &box[i]); + if (!ok) + goto err; + } + } + // Map to parallelogram + ibz_mat_4x4_eval_t(&x, &x, &U); + // Evaluate quadratic form + quat_qf_eval(&tmp, &G, &x); +#ifndef NDEBUG + cnt++; + if (cnt % 100 == 0) + printf("Lattice sampling rejected %d times", cnt - 1); +#endif + } while (ibz_is_zero(&tmp) || (ibz_cmp(&tmp, &rad) > 0)); + + // Evaluate linear combination + ibz_mat_4x4_eval(&(res->coord), &(lattice->basis), &x); + ibz_copy(&(res->denom), &(lattice->denom)); + quat_alg_normalize(res); + +#ifndef NDEBUG + // Check norm is smaller than radius + quat_alg_norm(&tmp, &rad, res, alg); + ibz_mul(&rad, &rad, radius); + assert(ibz_cmp(&tmp, &rad) <= 0); +#endif + +err: + ibz_finalize(&rad); + ibz_finalize(&tmp); + ibz_vec_4_finalize(&x); + ibz_mat_4x4_finalize(&U); + ibz_mat_4x4_finalize(&G); + ibz_vec_4_finalize(&box); + return ok; +} diff --git a/src/quaternion/ref/generic/lattice.c b/src/quaternion/ref/generic/lattice.c index b1f3802..c98bae9 100644 --- a/src/quaternion/ref/generic/lattice.c +++ b/src/quaternion/ref/generic/lattice.c @@ -2,468 +2,327 @@ #include #include "internal.h" -//helper functions -int quat_lattice_equal(const quat_lattice_t *lat1, const quat_lattice_t *lat2){ - int equal; - ibz_t abs_denom1, abs_denom2; - ibz_mat_4x4_t m1,m2; - ibz_init(&abs_denom1); - ibz_init(&abs_denom2); - ibz_mat_4x4_init(&m1); - ibz_mat_4x4_init(&m2); - // test if both are in HNF as needed - assert(ibz_mat_4x4_is_hnf(&(lat1->basis))); - assert(ibz_mat_4x4_is_hnf(&(lat2->basis))); - // get absolute values of denominators - ibz_neg(&abs_denom1,&(lat1->denom)); - if(ibz_cmp(&abs_denom1,&(lat1->denom)) <0 ){ - ibz_neg(&abs_denom1,&abs_denom1); - } - ibz_neg(&abs_denom2,&(lat2->denom)); - if(ibz_cmp(&abs_denom2,&(lat2->denom)) <0 ){ - ibz_neg(&abs_denom2,&abs_denom2); - } - // cross-multiply by denomiators to get both basis on same denominators - ibz_mat_4x4_scalar_mul(&m1,&abs_denom2,&(lat1->basis)); - ibz_mat_4x4_scalar_mul(&m2,&abs_denom1,&(lat2->basis)); - // baoth are still HNF, so simply test for equality - equal = ibz_mat_4x4_equal(&m1,&m2); - ibz_finalize(&abs_denom1); - ibz_finalize(&abs_denom2); - ibz_mat_4x4_finalize(&m1); - ibz_mat_4x4_finalize(&m2); - return(equal); +// helper functions +int +quat_lattice_equal(const quat_lattice_t *lat1, const quat_lattice_t *lat2) +{ + int equal = 1; + quat_lattice_t a, b; + quat_lattice_init(&a); + quat_lattice_init(&b); + quat_lattice_reduce_denom(&a, lat1); + quat_lattice_reduce_denom(&b, lat2); + ibz_abs(&(a.denom), &(a.denom)); + ibz_abs(&(b.denom), &(b.denom)); + quat_lattice_hnf(&a); + quat_lattice_hnf(&b); + equal = equal && (ibz_cmp(&(a.denom), &(b.denom)) == 0); + equal = equal && ibz_mat_4x4_equal(&(a.basis), &(b.basis)); + quat_lattice_finalize(&a); + quat_lattice_finalize(&b); + return (equal); } -void quat_lattice_reduce_denom(quat_lattice_t *reduced, const quat_lattice_t *lat){ +// sublattice test +int +quat_lattice_inclusion(const quat_lattice_t *sublat, const quat_lattice_t *overlat) +{ + int res; + quat_lattice_t sum; + quat_lattice_init(&sum); + quat_lattice_add(&sum, overlat, sublat); + res = quat_lattice_equal(&sum, overlat); + quat_lattice_finalize(&sum); + return (res); +} + +void +quat_lattice_reduce_denom(quat_lattice_t *reduced, const quat_lattice_t *lat) +{ ibz_t gcd; ibz_init(&gcd); - ibz_mat_4x4_gcd(&gcd,&(lat->basis)); - ibz_gcd(&gcd,&gcd,&(lat->denom)); - ibz_mat_4x4_scalar_div(&(reduced->basis),&gcd,&(lat->basis)); - ibz_div(&(reduced->denom),&gcd,&(lat->denom),&gcd); + ibz_mat_4x4_gcd(&gcd, &(lat->basis)); + ibz_gcd(&gcd, &gcd, &(lat->denom)); + ibz_mat_4x4_scalar_div(&(reduced->basis), &gcd, &(lat->basis)); + ibz_div(&(reduced->denom), &gcd, &(lat->denom), &gcd); + ibz_abs(&(reduced->denom), &(reduced->denom)); ibz_finalize(&gcd); } -// This function returns a lattice not under HNF. For careful internal use only -// method described in https://cseweb.ucsd.edu/classes/sp14/cse206A-a/lec4.pdf consulted on 19 of May 2023, 12h40 CEST -void quat_lattice_dual_without_hnf(quat_lattice_t *dual, const quat_lattice_t *lat){ +void +quat_lattice_conjugate_without_hnf(quat_lattice_t *conj, const quat_lattice_t *lat) +{ + ibz_mat_4x4_copy(&(conj->basis), &(lat->basis)); + ibz_copy(&(conj->denom), &(lat->denom)); + + for (int row = 1; row < 4; ++row) { + for (int col = 0; col < 4; ++col) { + ibz_neg(&(conj->basis[row][col]), &(conj->basis[row][col])); + } + } +} + +// Method described in https://cseweb.ucsd.edu/classes/sp14/cse206A-a/lec4.pdf consulted on 19 of +// May 2023, 12h40 CEST +void +quat_lattice_dual_without_hnf(quat_lattice_t *dual, const quat_lattice_t *lat) +{ ibz_mat_4x4_t inv; ibz_t det; ibz_init(&det); ibz_mat_4x4_init(&inv); - ibz_mat_4x4_transpose(&inv,&(lat->basis)); - ibz_mat_4x4_inv_with_det_as_denom(&inv,&det,&inv); + ibz_mat_4x4_inv_with_det_as_denom(&inv, &det, &(lat->basis)); + ibz_mat_4x4_transpose(&inv, &inv); // dual_denom = det/lat_denom - ibz_mat_4x4_scalar_mul(&(dual->basis),&(lat->denom),&inv); - ibz_copy(&(dual-> denom),&det); - + ibz_mat_4x4_scalar_mul(&(dual->basis), &(lat->denom), &inv); + ibz_copy(&(dual->denom), &det); + ibz_finalize(&det); ibz_mat_4x4_finalize(&inv); } -void quat_lattice_add(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2){ - ibz_mat_4x8_t hnf_input; +void +quat_lattice_add(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2) +{ + ibz_vec_4_t generators[8]; ibz_mat_4x4_t tmp; + ibz_t det1, det2, detprod; + ibz_init(&det1); + ibz_init(&det2); + ibz_init(&detprod); + for (int i = 0; i < 8; i++) + ibz_vec_4_init(&(generators[i])); ibz_mat_4x4_init(&tmp); - ibz_mat_4x8_init(&hnf_input); - ibz_mat_4x4_scalar_mul(&tmp,&(lat1->denom),&(lat2->basis)); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_copy(&(hnf_input[i][j]),&(tmp[i][j])); + ibz_mat_4x4_scalar_mul(&tmp, &(lat1->denom), &(lat2->basis)); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_copy(&(generators[j][i]), &(tmp[i][j])); } } - ibz_mat_4x4_scalar_mul(&tmp,&(lat2->denom),&(lat1->basis)); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_copy(&(hnf_input[i][4+j]),&(tmp[i][j])); + ibz_mat_4x4_inv_with_det_as_denom(NULL, &det1, &tmp); + ibz_mat_4x4_scalar_mul(&tmp, &(lat2->denom), &(lat1->basis)); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_copy(&(generators[4 + j][i]), &(tmp[i][j])); } } - ibz_mat_4x8_hnf_core(&(res->basis),&hnf_input); - ibz_mul(&(res->denom),&(lat1->denom), &(lat2->denom)); - quat_lattice_reduce_denom(res,res); - ibz_mat_4x8_finalize(&hnf_input); + ibz_mat_4x4_inv_with_det_as_denom(NULL, &det2, &tmp); + assert(!ibz_is_zero(&det1)); + assert(!ibz_is_zero(&det2)); + ibz_gcd(&detprod, &det1, &det2); + ibz_mat_4xn_hnf_mod_core(&(res->basis), 8, generators, &detprod); + ibz_mul(&(res->denom), &(lat1->denom), &(lat2->denom)); + quat_lattice_reduce_denom(res, res); ibz_mat_4x4_finalize(&tmp); + ibz_finalize(&det1); + ibz_finalize(&det2); + ibz_finalize(&detprod); + for (int i = 0; i < 8; i++) + ibz_vec_4_finalize(&(generators[i])); } -// method described in https://cseweb.ucsd.edu/classes/sp14/cse206A-a/lec4.pdf consulted on 19 of May 2023, 12h40 CEST -void quat_lattice_intersect(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2){ +// method described in https://cseweb.ucsd.edu/classes/sp14/cse206A-a/lec4.pdf consulted on 19 of +// May 2023, 12h40 CEST +void +quat_lattice_intersect(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2) +{ quat_lattice_t dual1, dual2, dual_res; quat_lattice_init(&dual1); quat_lattice_init(&dual2); quat_lattice_init(&dual_res); - quat_lattice_dual_without_hnf(&dual1,lat1); - - quat_lattice_dual_without_hnf(&dual2,lat2); - quat_lattice_add(&dual_res,&dual1,&dual2); - quat_lattice_dual_without_hnf(res,&dual_res); - quat_lattice_hnf(res); + quat_lattice_dual_without_hnf(&dual1, lat1); + + quat_lattice_dual_without_hnf(&dual2, lat2); + quat_lattice_add(&dual_res, &dual1, &dual2); + quat_lattice_dual_without_hnf(res, &dual_res); + quat_lattice_hnf(res); // could be removed if we do not expect HNF any more quat_lattice_finalize(&dual1); quat_lattice_finalize(&dual2); quat_lattice_finalize(&dual_res); } -void quat_lattice_mul(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2, const quat_alg_t *alg){ - ibz_t denom, d, r; - ibz_mat_4x8_t hnf_input; - ibz_mat_4x4_t tmp1,tmp2; - quat_alg_elem_t elem1,elem2,elem_res; - quat_lattice_t lat_res; - ibz_init(&denom); - ibz_init(&d); - ibz_init(&r); - quat_lattice_init(&lat_res); - ibz_mat_4x4_init(&tmp1); - ibz_mat_4x4_init(&tmp2); - quat_alg_elem_init(&elem1); - quat_alg_elem_init(&elem2); - quat_alg_elem_init(&elem_res); - ibz_mat_4x8_init(&hnf_input); - ibz_mul(&denom,&(lat1->denom),&(lat2->denom)); - for(int k = 0; k < 2; k++){ - quat_alg_elem_copy_ibz(&elem1,&(lat1->denom),&(lat1->basis[0][k]),&(lat1->basis[1][k]),&(lat1->basis[2][k]),&(lat1->basis[3][k])); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_copy(&(elem2.coord[j]),&(lat2->basis[i][j])); - } - quat_alg_elem_copy_ibz(&elem2,&(lat2->denom),&(lat2->basis[0][i]),&(lat2->basis[1][i]),&(lat2->basis[2][i]),&(lat2->basis[3][i])); - quat_alg_mul(&elem_res,&elem1,&elem2,alg); - //should check that denom is as expected (product of both), otherwise set it to that to avoid issues - if(0!=ibz_cmp(&denom,&(elem_res.denom))){ - ibz_div(&d,&r,&denom,&(elem_res.denom)); - quat_alg_elem_mul_by_scalar(&elem_res,&d,&elem_res); - } - for(int j = 0; j < 4; j++){ - ibz_copy(&(hnf_input[j][4*k+i]),&(elem_res.coord[j])); - } - } - } - ibz_mat_4x8_hnf_core(&tmp1,&hnf_input); - - for(int k = 0; k < 2; k++){ - quat_alg_elem_copy_ibz(&elem1,&(lat1->denom),&(lat1->basis[0][2+k]),&(lat1->basis[1][2+k]),&(lat1->basis[2][2+k]),&(lat1->basis[3][2+k])); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_copy(&(elem2.coord[j]),&(lat2->basis[i][j])); - } - quat_alg_elem_copy_ibz(&elem2,&(lat2->denom),&(lat2->basis[0][i]),&(lat2->basis[1][i]),&(lat2->basis[2][i]),&(lat2->basis[3][i])); - quat_alg_mul(&elem_res,&elem1,&elem2,alg); - //should check that denom is as expected (product of both), otherwise set it to that to avoid issues - if(0!=ibz_cmp(&denom,&(elem_res.denom))){ - ibz_div(&d,&r,&denom,&(elem_res.denom)); - quat_alg_elem_mul_by_scalar(&elem_res,&d,&elem_res); - } - for(int j = 0; j < 4; j++){ - ibz_copy(&(hnf_input[j][4*k+i]),&(elem_res.coord[j])); - } - } - } - ibz_mat_4x8_hnf_core(&tmp2,&hnf_input); - - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_copy(&(hnf_input[i][j]),&(tmp1[i][j])); - ibz_copy(&(hnf_input[i][4+j]),&(tmp2[i][j])); - } - } - ibz_mat_4x8_hnf_core(&(res->basis),&hnf_input); - - ibz_copy(&(res->denom),&denom); - quat_lattice_reduce_denom(res,res); - - ibz_mat_4x8_finalize(&hnf_input); - ibz_mat_4x4_finalize(&tmp1); - ibz_mat_4x4_finalize(&tmp2); - quat_alg_elem_finalize(&elem1); - quat_alg_elem_finalize(&elem2); - quat_alg_elem_finalize(&elem_res); - quat_lattice_finalize(&lat_res); - ibz_finalize(&denom); - ibz_finalize(&d); - ibz_finalize(&r); -} - -// lattice assumed of full rank and under HNF, none of both is tested so far -int quat_lattice_contains_without_alg(quat_alg_coord_t *coord, const quat_lattice_t *lat, const quat_alg_elem_t *x){ - int res = 1; - ibz_vec_4_t work_coord, work_x, column; - ibz_t r, prod, one; - ibz_init(&r); - ibz_init(&prod); - ibz_init(&one); - ibz_vec_4_init(&work_coord); - ibz_vec_4_init(&work_x); - ibz_vec_4_init(&column); - // test if rank 4 lattice under HNF - assert(ibz_mat_4x4_is_hnf(&(lat->basis))); - for(int i = 0; i < 4; i++){ - assert(!ibz_is_zero(&(lat->basis[i][i]))); - } - ibz_set(&one,1); - for(int i = 0; i < 4;i++){ - // put on same denominator, 1st part - ibz_mul(&(work_x[i]), &(x->coord[i]),&(lat->denom)); - } - for(int i = 0; i < 4;i++){ - if(res){ - // put on same denominator, 2nd part - ibz_mul(&prod,&(x->denom), &(lat->basis[3-i][3-i])); - ibz_div(&(work_coord[3-i]), &r,&(work_x[3-i]), &prod); - if(ibz_is_zero(&r)){ - for (int j = 0; j < 4;j++){ - // put on same denominator here also - ibz_mul(&(column[j]),&(lat->basis[j][3-i]),&(x->denom)); - } - // negate quotient - ibz_neg(&r,&(work_coord[3-i])); - ibz_vec_4_linear_combination(&work_x, &one, &work_x, &r,&column); - } else { - res = 0; - } - } - } - //final test - for(int i = 0; i < 4;i++){ - // now x should be 0 if it is in lattice - res = res && ibz_is_zero(&(work_x[i])); - } - - //copy result - if(res && (coord != NULL)){ - for(int i = 0; i < 4;i++){ - ibz_copy(&((*coord)[i]),&(work_coord[i])); - } - } - ibz_finalize(&r); - ibz_finalize(&prod); - ibz_finalize(&one); - ibz_vec_4_finalize(&work_coord); - ibz_vec_4_finalize(&work_x); - ibz_vec_4_finalize(&column); - return(res); -} - -// lattice assumed of full rank and under HNF, none of both is tested so far -int quat_lattice_contains(quat_alg_coord_t *coord, const quat_lattice_t *lat, const quat_alg_elem_t *x, const quat_alg_t *alg){ - return(quat_lattice_contains_without_alg(coord,lat,x)); -} - -void quat_lattice_index(ibz_t *index, const quat_lattice_t *sublat, const quat_lattice_t *overlat) { - ibz_t tmp; - ibz_init(&tmp); - - // index = (overlat->denom)⁴ - ibz_mul(index, &overlat->denom, &overlat->denom); - ibz_mul(index, index, index); - // index = (overlat->denom)⁴ · det(sublat->basis) +void +quat_lattice_mat_alg_coord_mul_without_hnf(ibz_mat_4x4_t *prod, + const ibz_mat_4x4_t *lat, + const ibz_vec_4_t *coord, + const quat_alg_t *alg) +{ + ibz_vec_4_t p, a; + ibz_vec_4_init(&p); + ibz_vec_4_init(&a); for (int i = 0; i < 4; i++) { - ibz_mul(index, index, &sublat->basis[i][i]); + ibz_vec_4_copy_ibz(&a, &((*lat)[0][i]), &((*lat)[1][i]), &((*lat)[2][i]), &((*lat)[3][i])); + quat_alg_coord_mul(&p, &a, coord, alg); + ibz_copy(&((*prod)[0][i]), &(p[0])); + ibz_copy(&((*prod)[1][i]), &(p[1])); + ibz_copy(&((*prod)[2][i]), &(p[2])); + ibz_copy(&((*prod)[3][i]), &(p[3])); } + ibz_vec_4_finalize(&p); + ibz_vec_4_finalize(&a); +} + +void +quat_lattice_alg_elem_mul(quat_lattice_t *prod, + const quat_lattice_t *lat, + const quat_alg_elem_t *elem, + const quat_alg_t *alg) +{ + quat_lattice_mat_alg_coord_mul_without_hnf(&(prod->basis), &(lat->basis), &(elem->coord), alg); + ibz_mul(&(prod->denom), &(lat->denom), &(elem->denom)); + quat_lattice_hnf(prod); +} + +void +quat_lattice_mul(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2, const quat_alg_t *alg) +{ + ibz_vec_4_t elem1, elem2, elem_res; + ibz_vec_4_t generators[16]; + ibz_mat_4x4_t detmat; + ibz_t det; + quat_lattice_t lat_res; + ibz_init(&det); + ibz_mat_4x4_init(&detmat); + quat_lattice_init(&lat_res); + ibz_vec_4_init(&elem1); + ibz_vec_4_init(&elem2); + ibz_vec_4_init(&elem_res); + for (int i = 0; i < 16; i++) + ibz_vec_4_init(&(generators[i])); + for (int k = 0; k < 4; k++) { + ibz_vec_4_copy_ibz( + &elem1, &(lat1->basis[0][k]), &(lat1->basis[1][k]), &(lat1->basis[2][k]), &(lat1->basis[3][k])); + for (int i = 0; i < 4; i++) { + ibz_vec_4_copy_ibz( + &elem2, &(lat2->basis[0][i]), &(lat2->basis[1][i]), &(lat2->basis[2][i]), &(lat2->basis[3][i])); + quat_alg_coord_mul(&elem_res, &elem1, &elem2, alg); + for (int j = 0; j < 4; j++) { + if (k == 0) + ibz_copy(&(detmat[i][j]), &(elem_res[j])); + ibz_copy(&(generators[4 * k + i][j]), &(elem_res[j])); + } + } + } + ibz_mat_4x4_inv_with_det_as_denom(NULL, &det, &detmat); + ibz_abs(&det, &det); + ibz_mat_4xn_hnf_mod_core(&(res->basis), 16, generators, &det); + ibz_mul(&(res->denom), &(lat1->denom), &(lat2->denom)); + quat_lattice_reduce_denom(res, res); + ibz_vec_4_finalize(&elem1); + ibz_vec_4_finalize(&elem2); + ibz_vec_4_finalize(&elem_res); + quat_lattice_finalize(&lat_res); + ibz_finalize(&det); + ibz_mat_4x4_finalize(&(detmat)); + for (int i = 0; i < 16; i++) + ibz_vec_4_finalize(&(generators[i])); +} + +// lattice assumed of full rank +int +quat_lattice_contains(ibz_vec_4_t *coord, const quat_lattice_t *lat, const quat_alg_elem_t *x) +{ + int divisible = 0; + ibz_vec_4_t work_coord; + ibz_mat_4x4_t inv; + ibz_t det, prod; + ibz_init(&prod); + ibz_init(&det); + ibz_vec_4_init(&work_coord); + ibz_mat_4x4_init(&inv); + ibz_mat_4x4_inv_with_det_as_denom(&inv, &det, &(lat->basis)); + assert(!ibz_is_zero(&det)); + ibz_mat_4x4_eval(&work_coord, &inv, &(x->coord)); + ibz_vec_4_scalar_mul(&(work_coord), &(lat->denom), &work_coord); + ibz_mul(&prod, &(x->denom), &det); + divisible = ibz_vec_4_scalar_div(&work_coord, &prod, &work_coord); + // copy result + if (divisible && (coord != NULL)) { + for (int i = 0; i < 4; i++) { + ibz_copy(&((*coord)[i]), &(work_coord[i])); + } + } + ibz_finalize(&prod); + ibz_finalize(&det); + ibz_mat_4x4_finalize(&inv); + ibz_vec_4_finalize(&work_coord); + return (divisible); +} + +void +quat_lattice_index(ibz_t *index, const quat_lattice_t *sublat, const quat_lattice_t *overlat) +{ + ibz_t tmp, det; + ibz_init(&tmp); + ibz_init(&det); + + // det = det(sublat->basis) + ibz_mat_4x4_inv_with_det_as_denom(NULL, &det, &sublat->basis); + // tmp = (overlat->denom)⁴ + ibz_mul(&tmp, &overlat->denom, &overlat->denom); + ibz_mul(&tmp, &tmp, &tmp); + // index = (overlat->denom)⁴ · det(sublat->basis) + ibz_mul(index, &det, &tmp); // tmp = (sublat->denom)⁴ ibz_mul(&tmp, &sublat->denom, &sublat->denom); ibz_mul(&tmp, &tmp, &tmp); + // det = det(overlat->basis) + ibz_mat_4x4_inv_with_det_as_denom(NULL, &det, &overlat->basis); // tmp = (sublat->denom)⁴ · det(overlat->basis) - for (int i = 0; i < 4; i++) { - ibz_mul(&tmp, &tmp, &overlat->basis[i][i]); - } + ibz_mul(&tmp, &tmp, &det); // index = index / tmp ibz_div(index, &tmp, index, &tmp); assert(ibz_is_zero(&tmp)); // index = |index| ibz_abs(index, index); - + ibz_finalize(&tmp); + ibz_finalize(&det); } -void quat_lattice_hnf(quat_lattice_t *lat){ - ibz_mat_4x8_t hnf_input; - ibz_mat_4x8_init(&hnf_input); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(hnf_input[i][j]),0); - } - } - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_copy(&(hnf_input[i][4+j]),&(lat->basis[i][j])); - } - } - ibz_mat_4x8_hnf_core(&(lat->basis),&hnf_input); - quat_lattice_reduce_denom(lat,lat); - ibz_mat_4x8_finalize(&hnf_input); -} - -int quat_lattice_random_elem(quat_alg_elem_t *elem, const quat_lattice_t *lattice, unsigned char n) { - assert(n <= 64); - - // Set elem to 0 - for (int i = 0; i < 4; i++) - ibz_set(&elem->coord[i], 0); - ibz_set(&elem->denom, 1); - - // Take random coefficients - int64_t rand[4]; - int randret = randombytes((unsigned char*)rand, 4*sizeof(uint64_t)); - if (randret != 0) - return 0; - - // Make the linear combination - quat_alg_elem_t tmp; - quat_alg_elem_init(&tmp); - for (int j = 0; j < 4; j++) { - rand[j] >>= (64-n); - for (int i = 0; i < 4; i++) { - ibz_set(&tmp.coord[i], rand[j]); - ibz_mul(&tmp.coord[i], &tmp.coord[i], &lattice->basis[i][j]); - } - quat_alg_add(elem, elem, &tmp); - } - quat_alg_elem_finalize(&tmp); - - // Set the denominator - ibz_copy(&elem->denom, &lattice->denom); - - return 1; -} - -/** Right transporter **/ - -/** @brief to[to_row] = (-1)^neg · c · from[from_row] - * - * c may be NULL, in which case c = 1 - */ -static inline void copy_row(ibz_mat_4x4_t to, int to_row, int neg, const ibz_t *c, const ibz_mat_4x4_t from, int from_row) { - for (int j = 0; j < 4; j++) { - if (c) - ibz_mul(&to[to_row][j], c, &from[from_row][j]); - else - ibz_copy(&to[to_row][j], &from[from_row][j]); - if (neg) - ibz_neg(&to[to_row][j], &to[to_row][j]); - } -} - -/** @brief copy matrix into columns of cols - */ -static inline void mat_to_col_16x4(ibz_t (*cols)[16][4], int col, const ibz_mat_4x4_t *mat) { - for (int i = 0; i < 4; i++) - for (int j = 0; j < 4; j++) - ibz_copy(&((*cols)[j+4*i][col]), &((*mat)[i][j])); -} - -/** @brief take the gcd of content with all entries - */ -static inline void mat_16x4_content(ibz_t *content, const ibz_t (*mat)[16][4]){ - for(int i = 0; i < 16; i++) - for(int j = 0; j < 4; j++) - ibz_gcd(content, content, &((*mat)[i][j])); -} - -/** @brief take the gcd of content with all entries - */ -static inline void mat_16x4_mul_by_scalar(ibz_t (*prod)[16][4], const ibz_t (*mat)[16][4],const ibz_t *scalar){ - for(int i = 0; i < 16; i++) - for(int j = 0; j < 4; j++) - ibz_mul(&((*prod)[i][j]), scalar, &((*mat)[i][j])); -} - -/** @brief take the gcd of content with all entries - */ -static inline int mat_16x4_div_by_scalar(ibz_t (*quot)[16][4], const ibz_t (*mat)[16][4],const ibz_t *scalar){ - int ok = 1; - ibz_t r; - ibz_init(&r); - for(int i = 0; i < 16; i++) - for(int j = 0; j < 4; j++) - ibz_div(&((*quot)[i][j]),&r,&((*mat)[i][j]),scalar); - ok = ok && (ibz_is_zero(&r)); - ibz_finalize(&r); - return(ok); -} - -void quat_lattice_right_transporter(quat_lattice_t *trans, const quat_lattice_t *lat1, const quat_lattice_t *lat2, const quat_alg_t *alg) +void +quat_lattice_hnf(quat_lattice_t *lat) { - ibz_t det1, det2, tmp, thrash, content; - ibz_mat_4x4_t lat2_inv, tmpmat; - ibz_t work[16][4]; - ibz_init(&det1); - ibz_init(&det2); - ibz_init(&tmp); - ibz_init(&thrash); - ibz_init(&content); - ibz_mat_4x4_init(&lat2_inv); - ibz_mat_4x4_init(&tmpmat); - ibz_mat_init(16,4,work); - - // Compute the dual lattice Λ₂* of Λ₂ = num(lat2) - // Could be optimized, given it's triangular - // M₂ = Λ₂*/det₂ - int invertible = ibz_mat_4x4_inv_with_det_as_denom(&lat2_inv, &det2, &lat2->basis); - assert(invertible); - - // WARNING: hard-cording right multiplication table of "standard" basis - // Prone to breakage if the basis changes - // - // M = d₂/(d₁ det₂) · table - // - // Λ₂* Id Λ₁ - ibz_mat_4x4_mul(&tmpmat, &lat2_inv, &lat1->basis); - mat_to_col_16x4(&work, 0, &tmpmat); - // Λ₂* [0 -1 0 0 ; 1 0 0 0 ; 0 0 0 1 ; 0 0 -1 0] Λ₁ - copy_row(tmpmat, 0, 1, NULL, lat1->basis, 1); - copy_row(tmpmat, 1, 0, NULL, lat1->basis, 0); - copy_row(tmpmat, 2, 0, NULL, lat1->basis, 3); - copy_row(tmpmat, 3, 1, NULL, lat1->basis, 2); - ibz_mat_4x4_mul(&tmpmat, &lat2_inv, &tmpmat); - mat_to_col_16x4(&work, 1, &tmpmat); - // Λ₂* [0 0 -p 0 ; 0 0 0 -p ; 1 0 0 0 ; 0 1 0 0] Λ₁ - copy_row(tmpmat, 0, 1, &alg->p, lat1->basis, 2); - copy_row(tmpmat, 1, 1, &alg->p, lat1->basis, 3); - copy_row(tmpmat, 2, 0, NULL, lat1->basis, 0); - copy_row(tmpmat, 3, 0, NULL, lat1->basis, 1); - ibz_mat_4x4_mul(&tmpmat, &lat2_inv, &tmpmat); - mat_to_col_16x4(&work, 2, &tmpmat); - // Λ₂*[0 0 0 -p ; 0 0 p 0 ; 0 -1 0 0 ; 1 0 0 0] Λ₁ - copy_row(tmpmat, 0, 1, &alg->p, lat1->basis, 3); - copy_row(tmpmat, 1, 0, &alg->p, lat1->basis, 2); - copy_row(tmpmat, 2, 1, NULL, lat1->basis, 1); - copy_row(tmpmat, 3, 0, NULL, lat1->basis, 0); - ibz_mat_4x4_mul(&tmpmat, &lat2_inv, &tmpmat); - mat_to_col_16x4(&work, 3, &tmpmat); - - ibz_mul(&det1, &lat1->basis[0][0], &lat1->basis[1][1]); - ibz_mul(&tmp, &lat1->basis[2][2], &lat1->basis[3][3]); - ibz_mul(&det1, &det1, &tmp); - ibz_mul(&det1, &det1, &lat2->denom); - ibz_gcd(&tmp, &det1, &lat1->denom); - ibz_div(&det1, &thrash, &det1, &tmp); - - { - int ok = 1; - mat_16x4_content(&content,&work); - ok &= mat_16x4_div_by_scalar(&work,&work,&content); - assert(ok); - - ibz_mul(&content, &content, &lat2->denom); - ibz_mul(&det2, &det2, &lat1->denom); - ibz_gcd(&tmp, &det2, &content); - ibz_div(&det2, &thrash, &det2, &tmp); - ibz_div(&content, &thrash, &content, &tmp); - mat_16x4_mul_by_scalar(&work,&work,&content); - ibz_mul(&det2, &det2, &det1); - - ibz_mat_right_ker_mod(16, 4, trans->basis, work, &det2); - ibz_mat_4x4_hnf_mod(&trans->basis, &trans->basis, &det2); - ibz_copy(&trans->denom, &det1); - quat_lattice_reduce_denom(trans, trans); + ibz_t mod; + ibz_vec_4_t generators[4]; + ibz_init(&mod); + ibz_mat_4x4_inv_with_det_as_denom(NULL, &mod, &(lat->basis)); + ibz_abs(&mod, &mod); + for (int i = 0; i < 4; i++) + ibz_vec_4_init(&(generators[i])); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_copy(&(generators[j][i]), &(lat->basis[i][j])); + } } - - ibz_mat_finalize(16,4,work); - ibz_finalize(&det1); - ibz_finalize(&det2); - ibz_finalize(&tmp); - ibz_finalize(&thrash); - ibz_finalize(&content); - ibz_mat_4x4_finalize(&lat2_inv); - ibz_mat_4x4_finalize(&tmpmat); + ibz_mat_4xn_hnf_mod_core(&(lat->basis), 4, generators, &mod); + quat_lattice_reduce_denom(lat, lat); + ibz_finalize(&mod); + for (int i = 0; i < 4; i++) + ibz_vec_4_finalize(&(generators[i])); +} + +void +quat_lattice_gram(ibz_mat_4x4_t *G, const quat_lattice_t *lattice, const quat_alg_t *alg) +{ + ibz_t tmp; + ibz_init(&tmp); + for (int i = 0; i < 4; i++) { + for (int j = 0; j <= i; j++) { + ibz_set(&(*G)[i][j], 0); + for (int k = 0; k < 4; k++) { + ibz_mul(&tmp, &(lattice->basis)[k][i], &(lattice->basis)[k][j]); + if (k >= 2) + ibz_mul(&tmp, &tmp, &alg->p); + ibz_add(&(*G)[i][j], &(*G)[i][j], &tmp); + } + ibz_mul(&(*G)[i][j], &(*G)[i][j], &ibz_const_two); + } + } + for (int i = 0; i < 4; i++) { + for (int j = i + 1; j < 4; j++) { + ibz_copy(&(*G)[i][j], &(*G)[j][i]); + } + } + ibz_finalize(&tmp); } diff --git a/src/quaternion/ref/generic/lll.c b/src/quaternion/ref/generic/lll.c deleted file mode 100644 index 9391578..0000000 --- a/src/quaternion/ref/generic/lll.c +++ /dev/null @@ -1,366 +0,0 @@ -#include -#include "internal.h" - -// RED(k,l) sub-algorithm -static void RED(ibz_mat_4x4_t *basis, ibq_t (*u)[4][4], ibz_t (*H)[4][4], int k, int l) { - ibq_t tmp, tmp2; - ibz_t q, tibz, num, den, r; - ibq_init(&tmp); - ibq_init(&tmp2); - ibz_init(&q); - ibz_init(&tibz); - ibz_init(&num); - ibz_init(&den); - ibz_init(&r); - ibz_set(&num,1); - ibz_set(&den,2); - ibq_set(&tmp,&num,&den); - ibz_set(&num,0); - ibz_set(&den,0); - - // if |u_{k,l}| <= 0.5, terminate - ibq_abs(&tmp2, &((*u)[k][l])); - if (ibq_cmp(&tmp2, &tmp) <= 0) - goto end; - - // q <- floor(0.5 + u_{k,l}) - ibq_add(&tmp, &tmp, &((*u)[k][l])); - - ibq_num(&num, &tmp); - ibq_denom(&den, &tmp); - //FDIV was used, needs reeimplementation - ibz_div_floor(&q,&r, &num, &den); - //ibq_floor(tmp, tmp); - //ibz_set_f(q, tmp); - - // b_k = b_k - q*b_l - for (int i = 0; i < 4; ++i) { - ibz_mul(&tibz, &q, &((*basis)[l][i])); - ibz_sub(&((*basis)[k][i]), &((*basis)[k][i]), &tibz); - } - - // H_k = H_k - q*H_l - for (int i = 0; i < 4; ++i) { - ibz_mul(&tibz, &q, &((*H)[l][i])); - ibz_sub(&((*H)[k][i]), &((*H)[k][i]), &tibz); - } - - // u_{k,j} = u_{k,l}-q - ibq_set(&tmp2, &q,&ibz_const_one); - ibq_sub(&((*u)[k][l]), &((*u)[k][l]), &tmp2); - - // forall_i \in 1..l-1: u_{k,i} = u_{k,i} - q*u_{l,i} - for (int i = 0; i <= l-1; ++i) { - ibq_mul(&tmp, &tmp2, &((*u)[l][i])); - ibq_sub(&((*u)[k][i]), &((*u)[k][i]), &tmp); - } - -end: - ibq_finalize(&tmp); - ibq_finalize(&tmp2); - ibz_finalize(&q); - ibz_finalize(&tibz); - ibz_finalize(&num); - ibz_finalize(&den); - ibz_finalize(&r); -} - -// SWAP(k) sub-algorithm -static void SWAP(ibz_mat_4x4_t *basis, ibq_t (*u)[4][4], ibz_t (*H)[4][4], ibq_t (*B)[4], ibq_t (*bStar)[4][4], int k, int kmax) { - ibq_t tmp, tmp2, tmp3, u_tmp, B_tmp, b[4]; - ibq_init(&tmp); - ibq_init(&tmp2); - ibq_init(&tmp3); - ibq_init(&u_tmp); - ibq_init(&B_tmp); - - for (int i = 0; i < 4; ++i) { - ibq_init(&(b[i])); - } - - // swap b_k and b_{k-1} - for (int i = 0; i < 4; ++i) { - ibz_swap(&((*basis)[k][i]), &((*basis)[k-1][i])); - } - - // swap H_k and H_{k-1} - for (int i = 0; i < 4; ++i) { - ibz_swap(&((*H)[k][i]), &((*H)[k-1][i])); - } - - if (k > 1) { - // swap u_{k,j} and u_{k-1,j} - for (int j = 0; j <= k - 2; ++j) { - ibq_swap(&((*u)[k][j]), &((*u)[k-1][j])); - } - } - - // u = u_{k,k-1} - ibq_copy(&u_tmp, &((*u)[k][k - 1])); - - // B = B_k + u^2*B_{k-1} - ibq_mul(&B_tmp, &u_tmp, &u_tmp); - ibq_mul(&B_tmp, &B_tmp, &((*B)[k-1])); - ibq_add(&B_tmp, &((*B)[k]), &B_tmp); - - // u_{k,k-1} = u*B_{k-1} / B - ibq_mul(&tmp, &u_tmp, &((*B)[k-1])); - ibq_div(&((*u)[k][k-1]), &tmp, &B_tmp); - - // b = bSTAR_{k-1} - for (int i = 0; i < 4; ++i) { - ibq_copy(&(b[i]), &((*bStar)[k-1][i])); - } - // bSTAR_{k-1}=bSTAR_k+u*b - for (int i = 0; i < 4; ++i) { - ibq_mul(&tmp, &u_tmp, &(b[i])); - ibq_add(&((*bStar)[k-1][i]), &((*bStar)[k][i]), &tmp); - } - // bSTAR_k = -u_{k,k-1}*bSTAR_k+(B_k/B)*b - ibq_div(&tmp2, &((*B)[k]), &B_tmp); // B_k/B - ibq_neg(&tmp, &((*u)[k][k-1])); - for (int i = 0; i < 4; ++i) { - ibq_mul(&((*bStar)[k][i]), &tmp, &((*bStar)[k][i])); - ibq_mul(&tmp3, &tmp2, &(b[i])); - ibq_add(&((*bStar)[k][i]), &((*bStar)[k][i]), &tmp3); - } - - // B_k = B_{k-1}*B_k/B - ibq_mul(&((*B)[k]), &((*B)[k-1]), &((*B)[k])); - ibq_div(&((*B)[k]), &((*B)[k]), &B_tmp); - - // B_{k-1} = B - ibq_copy(&((*B)[k-1]), &B_tmp); - - for (int i = k+1; i <= kmax; ++i) { - // t = u_{i,k} - ibq_copy(&tmp, &((*u)[i][k])); - - // u_{i,k} = u_{i,k-1} - u*t - ibq_mul(&((*u)[i][k]), &u_tmp, &tmp); - ibq_sub(&((*u)[i][k]), &((*u)[i][k-1]), &((*u)[i][k])); - - // u_{i,k-1} = t + u_{k,k-1}*u_{i,k} - ibq_mul(&tmp2, &((*u)[k][k-1]), &((*u)[i][k])); - ibq_add(&((*u)[i][k-1]), &tmp, &tmp2); - } - - ibq_finalize(&tmp); - ibq_finalize(&tmp2); - ibq_finalize(&tmp3); - ibq_finalize(&u_tmp); - ibq_finalize(&B_tmp); - for (int i = 0; i < 4; ++i) { - ibq_finalize(&(b[i])); - } - -} - -// m1[0]*m2[0] + m1[1]*m2[1] + q*(m1[2]*m2[2] + m1[3]*m2[3]) -static void dotproduct_row(ibz_t *mul, const ibz_mat_4x4_t *m1, const ibz_mat_4x4_t *m2, const ibz_t *q, int m1j, int m2j) { - ibz_set(mul, 0); - ibz_t tmp1, tmp2; - ibz_init(&tmp1); - ibz_init(&tmp2); - for (int i = 0; i < 2; ++i) { - ibz_mul(&tmp1, &((*m1)[m1j][i]), &((*m2)[m2j][i])); - ibz_add(mul, mul, &tmp1); - } - for (int i = 2; i < 4; ++i) { - ibz_mul(&tmp1, &((*m1)[m1j][i]), &((*m2)[m2j][i])); - ibz_add(&tmp2, &tmp2, &tmp1); - } - ibz_mul(&tmp2, &tmp2, q); - ibz_add(mul, mul, &tmp2); - - ibz_finalize(&tmp1); - ibz_finalize(&tmp2); -} - -static void dotproduct_zr_row(ibq_t *mul, const ibz_mat_4x4_t *m1, const ibq_t (*m2)[4][4], const ibz_t *q, int m1j, int m2j) { - ibq_set(mul, &ibz_const_zero, &ibz_const_one); - ibq_t tmp1, tmp2; - ibq_init(&tmp1); - ibq_init(&tmp2); - for (int i = 0; i < 2; ++i) { - ibq_set(&tmp1, &((*m1)[m1j][i]), &ibz_const_one); - ibq_mul(&tmp1, &tmp1, &((*m2)[m2j][i])); - ibq_add(mul, mul, &tmp1); - } - for (int i = 2; i < 4; ++i) { - ibq_set(&tmp1, &((*m1)[m1j][i]), &ibz_const_one); - ibq_mul(&tmp1, &tmp1, &((*m2)[m2j][i])); - ibq_add(&tmp2, &tmp2, &tmp1); - } - ibq_set(&tmp1, q, &ibz_const_one); - ibq_mul(&tmp2, &tmp2, &tmp1); - ibq_add(mul, mul, &tmp2); - - ibq_finalize(&tmp1); - ibq_finalize(&tmp2); -} - -static void dotproduct_rr_row(ibq_t *mul, const ibq_t (*m1)[4][4], const ibq_t (*m2)[4][4], const ibz_t *q, int m1j, int m2j) { - //ibq_set(mul, 0); - ibq_set(mul, &ibz_const_zero, &ibz_const_one); - ibq_t tmp1, tmp2; - ibq_init(&tmp1); - ibq_init(&tmp2); - for (int i = 0; i < 2; ++i) { - ibq_mul(&tmp1, &((*m1)[m1j][i]), &((*m2)[m2j][i])); - ibq_add(mul, mul, &tmp1); - } - for (int i = 2; i < 4; ++i) { - ibq_mul(&tmp1, &((*m1)[m1j][i]), &((*m2)[m2j][i])); - ibq_add(&tmp2, &tmp2, &tmp1); - } - ibq_set(&tmp1, q, &ibz_const_one); - ibq_mul(&tmp2, &tmp2, &tmp1); - ibq_add(mul, mul, &tmp2); - - ibq_finalize(&tmp1); - ibq_finalize(&tmp2); -} - -static void mul_row(ibq_t (*mul)[4][4], const ibq_t *a, const ibq_t (*m)[4][4], int j) { - for (int i = 0; i < 4; ++i) { - ibq_mul(&((*mul)[j][i]), a, &((*m)[j][i])); - } -} - -static void add_row(ibz_mat_4x4_t *add, const ibz_mat_4x4_t *a, const ibz_mat_4x4_t *b, int j, int aj, int bj) { - for (int i = 0; i < 4; ++i) { - ibz_add(&((*add)[j][i]), &((*a)[aj][i]), &((*b)[bj][i])); - } -} - -static void sub_row(ibq_t (*add)[4][4], const ibq_t (*a)[4][4], const ibq_t (*b)[4][4], int j, int aj, int bj) { - for (int i = 0; i < 4; ++i) { - ibq_sub(&((*add)[j][i]), &((*a)[aj][i]), &((*b)[bj][i])); - } -} - -/// @brief LLL reduction on 4-dimensional lattice -/// Implements Algorithm 2.6.3 from Henri Cohen's "A Course in Computational Algebraic Number Theory" -/// @param red -/// @param lattice -/// @return -int quat_lattice_lll(ibz_mat_4x4_t *red, const quat_lattice_t *lattice, const ibz_t *q, int precision) { - (void) precision; - int ret = 0; - ibz_mat_4x4_t basis; - ibq_t bStar[4][4]; - ibq_t bStar_tmp[4][4]; - ibq_t tmp; - ibz_t tmp_z; - ibz_t den; - ibz_t num; - ibq_t cnst; - ibq_t u[4][4]; - ibz_t H[4][4]; // -> I_4 - ibq_t B[4]; - ibq_init(&tmp); - ibz_init(&tmp_z); - ibz_init(&den); - ibz_init(&num); - ibq_init(&cnst); - for (int i = 0; i < 4; ++i) - ibq_init(&(B[i])); - - ibz_mat_4x4_init(&basis); - ibz_mat_4x4_transpose(&basis, &(lattice->basis)); - - // Step 1: Initialize: ... - for (int i = 0; i < 4; ++i) { - for (int j = 0; j < 4; ++j) { - ibq_init(&(u[i][j])); - ibq_init(&(bStar[i][j])); - ibq_init(&(bStar_tmp[i][j])); - // bSTAR_1 = b_1 (we copy all) - if (i == j){ - ibz_init(&(H[i][j])); - ibz_set(&(H[i][j]), 1); - } - else { - ibz_init(&(H[i][j])); - } - } - } - int k = 1, kmax = 0; - // bStar_1 = b_1 - for (int i = 0; i < 4; ++i) - ibq_set(&(bStar[0][i]), &(basis[0][i]), &ibz_const_one); - // B_1 = b_1 * b_1 - dotproduct_row(&tmp_z, &basis, &basis, q, 0, 0); - ibq_set(&(B[0]), &tmp_z, &ibz_const_one); - ibz_set(&num,99); - ibz_set(&den,100); - ibq_set(&cnst,&num,&den); - - while (k < 4) { - // Step 2: Incremental Gram-Schmidt - // if (k <= kmax) -> we can omit.. - if (k > kmax) { - kmax = k; - for (int i = 0; i < 4; ++i) { - ibq_set(&(bStar[k][i]), &(basis[k][i]), &ibz_const_one); - } - for (int j = 0; j <= k-1; ++j) { - // bStar_k = b_k -> already done initially - // nop - // u_{k,j} = b_k*bSTAR_j/B_j - dotproduct_zr_row(&tmp, &basis, &bStar, q, k, j); - ibq_div(&(u[k][j]), &tmp, &(B[j])); - // bStar_k = bStar_k - u_{k,j}*bStar_j - mul_row(&bStar_tmp, &(u[k][j]), &bStar, j); - sub_row(&bStar, &bStar, &bStar_tmp, k, k, j); - } - // B_k = bStar_k*bStar_k - dotproduct_rr_row(&(B[k]), &bStar, &bStar, q, k, k); - if (ibq_is_zero(&(B[k]))) { - // b_i did not form a basis, terminate with error - ret = -1; - goto err; - } - } - - while(1) { - // Step 3: Test LLL condition - RED(&basis, &u, &H, k, k - 1); - // If B_k < (0.75 - u_{k,k-1}^2)*B_{k-1} - ibq_mul(&tmp, &(u[k][k-1]), &(u[k][k-1])); - ibq_sub(&tmp, &cnst, &tmp); - ibq_mul(&tmp, &tmp, &(B[k-1])); - if (ibq_cmp(&(B[k]), &tmp) < 0) { - SWAP(&basis, &u, &H, &B, &bStar, k, kmax); - k = (k - 1 > 1 ? k - 1 : 1); - } else { - for (int l = k - 2; l >= 0; --l) { - RED(&basis, &u, &H, k, l); - } - k++; - break; - } - } - } - ibz_mat_4x4_transpose(red, &basis); - -err: - ibq_finalize(&tmp); - ibz_finalize(&tmp_z); - ibz_finalize(&num); - ibz_finalize(&den); - ibq_finalize(&cnst); - for (int i = 0; i < 4; ++i) { - for (int j = 0; j < 4; ++j) { - ibq_finalize(&(u[i][j])); - ibz_finalize(&(H[i][j])); - ibq_finalize(&(bStar[i][j])); - ibq_finalize(&(bStar_tmp[i][j])); - } - } - for (int i = 0; i < 4; ++i) - ibq_finalize(&(B[i])); - ibz_mat_4x4_finalize(&basis); - return ret; -} diff --git a/src/quaternion/ref/generic/lll/l2.c b/src/quaternion/ref/generic/lll/l2.c new file mode 100644 index 0000000..8c49b21 --- /dev/null +++ b/src/quaternion/ref/generic/lll/l2.c @@ -0,0 +1,190 @@ +#include +#include "lll_internals.h" +#include "internal.h" + +#include "dpe.h" + +// Access entry of symmetric matrix +#define SYM(M, i, j) (i < j ? &M[j][i] : &M[i][j]) + +void +quat_lll_core(ibz_mat_4x4_t *G, ibz_mat_4x4_t *basis) +{ + dpe_t dpe_const_one, dpe_const_DELTABAR; + + dpe_init(dpe_const_one); + dpe_set_ui(dpe_const_one, 1); + + dpe_init(dpe_const_DELTABAR); + dpe_set_d(dpe_const_DELTABAR, DELTABAR); + + // fp variables for Gram-Schmidt orthogonalization and Lovasz' conditions + dpe_t r[4][4], u[4][4], lovasz[4]; + for (int i = 0; i < 4; i++) { + dpe_init(lovasz[i]); + for (int j = 0; j <= i; j++) { + dpe_init(r[i][j]); + dpe_init(u[i][j]); + } + } + + // threshold for swaps + dpe_t delta_bar; + dpe_init(delta_bar); + dpe_set_d(delta_bar, DELTABAR); + + // Other work variables + dpe_t Xf, tmpF; + dpe_init(Xf); + dpe_init(tmpF); + ibz_t X, tmpI; + ibz_init(&X); + ibz_init(&tmpI); + + // Main L² loop + dpe_set_z(r[0][0], (*G)[0][0]); + int kappa = 1; + while (kappa < 4) { + // size reduce b_κ + int done = 0; + while (!done) { + // Recompute the κ-th row of the Choleski Factorisation + // Loop invariant: + // r[κ][j] ≈ u[κ][j] ‖b_j*‖² ≈ 〈b_κ, b_j*〉 + for (int j = 0; j <= kappa; j++) { + dpe_set_z(r[kappa][j], (*G)[kappa][j]); + for (int k = 0; k < j; k++) { + dpe_mul(tmpF, r[kappa][k], u[j][k]); + dpe_sub(r[kappa][j], r[kappa][j], tmpF); + } + if (j < kappa) + dpe_div(u[kappa][j], r[kappa][j], r[j][j]); + } + + done = 1; + // size reduce + for (int i = kappa - 1; i >= 0; i--) { + if (dpe_cmp_d(u[kappa][i], ETABAR) > 0 || dpe_cmp_d(u[kappa][i], -ETABAR) < 0) { + done = 0; + dpe_set(Xf, u[kappa][i]); + dpe_round(Xf, Xf); + dpe_get_z(X, Xf); + // Update basis: b_κ ← b_κ - X·b_i + for (int j = 0; j < 4; j++) { + ibz_mul(&tmpI, &X, &(*basis)[j][i]); + ibz_sub(&(*basis)[j][kappa], &(*basis)[j][kappa], &tmpI); + } + // Update lower half of the Gram matrix + // = - 2X + X² = + // - X - X( - X·) + //// 〈b_κ, b_κ〉 ← 〈b_κ, b_κ〉 - X·〈b_κ, b_i〉 + ibz_mul(&tmpI, &X, &(*G)[kappa][i]); + ibz_sub(&(*G)[kappa][kappa], &(*G)[kappa][kappa], &tmpI); + for (int j = 0; j < 4; j++) { // works because i < κ + // 〈b_κ, b_j〉 ← 〈b_κ, b_j〉 - X·〈b_i, b_j〉 + ibz_mul(&tmpI, &X, SYM((*G), i, j)); + ibz_sub(SYM((*G), kappa, j), SYM((*G), kappa, j), &tmpI); + } + // After the loop: + //// 〈b_κ,b_κ〉 ← 〈b_κ,b_κ〉 - X·〈b_κ,b_i〉 - X·(〈b_κ,b_i〉 - X·〈b_i, + /// b_i〉) = 〈b_κ - X·b_i, b_κ - X·b_i〉 + // + // Update u[kappa][j] + for (int j = 0; j < i; j++) { + dpe_mul(tmpF, Xf, u[i][j]); + dpe_sub(u[kappa][j], u[kappa][j], tmpF); + } + } + } + } + + // Check Lovasz' conditions + // lovasz[0] = ‖b_κ‖² + dpe_set_z(lovasz[0], (*G)[kappa][kappa]); + // lovasz[i] = lovasz[i-1] - u[κ][i-1]·r[κ][i-1] + for (int i = 1; i < kappa; i++) { + dpe_mul(tmpF, u[kappa][i - 1], r[kappa][i - 1]); + dpe_sub(lovasz[i], lovasz[i - 1], tmpF); + } + int swap; + for (swap = kappa; swap > 0; swap--) { + dpe_mul(tmpF, delta_bar, r[swap - 1][swap - 1]); + if (dpe_cmp(tmpF, lovasz[swap - 1]) < 0) + break; + } + + // Insert b_κ before b_swap + if (kappa != swap) { + // Insert b_κ before b_swap in the basis and in the lower half Gram matrix + for (int j = kappa; j > swap; j--) { + for (int i = 0; i < 4; i++) { + ibz_swap(&(*basis)[i][j], &(*basis)[i][j - 1]); + if (i == j - 1) + ibz_swap(&(*G)[i][i], &(*G)[j][j]); + else if (i != j) + ibz_swap(SYM((*G), i, j), SYM((*G), i, j - 1)); + } + } + // Copy row u[κ] and r[κ] in swap position, ignore what follows + for (int i = 0; i < swap; i++) { + dpe_set(u[swap][i], u[kappa][i]); + dpe_set(r[swap][i], r[kappa][i]); + } + dpe_set(r[swap][swap], lovasz[swap]); + // swap complete + kappa = swap; + } + + kappa += 1; + } + +#ifndef NDEBUG + // Check size-reducedness + for (int i = 0; i < 4; i++) + for (int j = 0; j < i; j++) { + dpe_abs(u[i][j], u[i][j]); + assert(dpe_cmp_d(u[i][j], ETABAR) <= 0); + } + // Check Lovasz' conditions + for (int i = 1; i < 4; i++) { + dpe_mul(tmpF, u[i][i - 1], u[i][i - 1]); + dpe_sub(tmpF, dpe_const_DELTABAR, tmpF); + dpe_mul(tmpF, tmpF, r[i - 1][i - 1]); + assert(dpe_cmp(tmpF, r[i][i]) <= 0); + } +#endif + + // Fill in the upper half of the Gram matrix + for (int i = 0; i < 4; i++) { + for (int j = i + 1; j < 4; j++) + ibz_copy(&(*G)[i][j], &(*G)[j][i]); + } + + // Clearinghouse + ibz_finalize(&X); + ibz_finalize(&tmpI); + dpe_clear(dpe_const_one); + dpe_clear(dpe_const_DELTABAR); + dpe_clear(Xf); + dpe_clear(tmpF); + dpe_clear(delta_bar); + for (int i = 0; i < 4; i++) { + dpe_clear(lovasz[i]); + for (int j = 0; j <= i; j++) { + dpe_clear(r[i][j]); + dpe_clear(u[i][j]); + } + } +} + +int +quat_lattice_lll(ibz_mat_4x4_t *red, const quat_lattice_t *lattice, const quat_alg_t *alg) +{ + ibz_mat_4x4_t G; // Gram Matrix + ibz_mat_4x4_init(&G); + quat_lattice_gram(&G, lattice, alg); + ibz_mat_4x4_copy(red, &lattice->basis); + quat_lll_core(&G, red); + ibz_mat_4x4_finalize(&G); + return 0; +} diff --git a/src/quaternion/ref/generic/lll/lll_applications.c b/src/quaternion/ref/generic/lll/lll_applications.c new file mode 100644 index 0000000..6c763b8 --- /dev/null +++ b/src/quaternion/ref/generic/lll/lll_applications.c @@ -0,0 +1,127 @@ +#include +#include +#include "lll_internals.h" + +void +quat_lideal_reduce_basis(ibz_mat_4x4_t *reduced, + ibz_mat_4x4_t *gram, + const quat_left_ideal_t *lideal, + const quat_alg_t *alg) +{ + assert(quat_order_is_maximal((lideal->parent_order), alg)); + ibz_t gram_corrector; + ibz_init(&gram_corrector); + ibz_mul(&gram_corrector, &(lideal->lattice.denom), &(lideal->lattice.denom)); + quat_lideal_class_gram(gram, lideal, alg); + ibz_mat_4x4_copy(reduced, &(lideal->lattice.basis)); + quat_lll_core(gram, reduced); + ibz_mat_4x4_scalar_mul(gram, &gram_corrector, gram); + for (int i = 0; i < 4; i++) { + ibz_div_2exp(&((*gram)[i][i]), &((*gram)[i][i]), 1); + for (int j = i + 1; j < 4; j++) { + ibz_set(&((*gram)[i][j]), 0); + } + } + ibz_finalize(&gram_corrector); +} + +void +quat_lideal_lideal_mul_reduced(quat_left_ideal_t *prod, + ibz_mat_4x4_t *gram, + const quat_left_ideal_t *lideal1, + const quat_left_ideal_t *lideal2, + const quat_alg_t *alg) +{ + ibz_mat_4x4_t red; + ibz_mat_4x4_init(&red); + + quat_lattice_mul(&(prod->lattice), &(lideal1->lattice), &(lideal2->lattice), alg); + prod->parent_order = lideal1->parent_order; + quat_lideal_norm(prod); + quat_lideal_reduce_basis(&red, gram, prod, alg); + ibz_mat_4x4_copy(&(prod->lattice.basis), &red); + + ibz_mat_4x4_finalize(&red); +} + +int +quat_lideal_prime_norm_reduced_equivalent(quat_left_ideal_t *lideal, + const quat_alg_t *alg, + const int primality_num_iter, + const int equiv_bound_coeff) +{ + ibz_mat_4x4_t gram, red; + ibz_mat_4x4_init(&gram); + ibz_mat_4x4_init(&red); + + int found = 0; + + // computing the reduced basis + quat_lideal_reduce_basis(&red, &gram, lideal, alg); + + quat_alg_elem_t new_alpha; + quat_alg_elem_init(&new_alpha); + ibz_t tmp, remainder, adjusted_norm; + ibz_init(&tmp); + ibz_init(&remainder); + ibz_init(&adjusted_norm); + + ibz_mul(&adjusted_norm, &lideal->lattice.denom, &lideal->lattice.denom); + + int ctr = 0; + + // equiv_num_iter = (2 * equiv_bound_coeff + 1)^4 + assert(equiv_bound_coeff < (1 << 20)); + int equiv_num_iter = (2 * equiv_bound_coeff + 1); + equiv_num_iter = equiv_num_iter * equiv_num_iter; + equiv_num_iter = equiv_num_iter * equiv_num_iter; + + while (!found && ctr < equiv_num_iter) { + ctr++; + // we select our linear combination at random + ibz_rand_interval_minm_m(&new_alpha.coord[0], equiv_bound_coeff); + ibz_rand_interval_minm_m(&new_alpha.coord[1], equiv_bound_coeff); + ibz_rand_interval_minm_m(&new_alpha.coord[2], equiv_bound_coeff); + ibz_rand_interval_minm_m(&new_alpha.coord[3], equiv_bound_coeff); + + // computation of the norm of the vector sampled + quat_qf_eval(&tmp, &gram, &new_alpha.coord); + + // compute the norm of the equivalent ideal + // can be improved by removing the power of two first and the odd part only if the trial + // division failed (this should always be called on an ideal of norm 2^x * N for some + // big prime N ) + ibz_div(&tmp, &remainder, &tmp, &adjusted_norm); + + // debug : check that the remainder is zero + assert(ibz_is_zero(&remainder)); + + // pseudo-primality test + if (ibz_probab_prime(&tmp, primality_num_iter)) { + + // computes the generator using a matrix multiplication + ibz_mat_4x4_eval(&new_alpha.coord, &red, &new_alpha.coord); + ibz_copy(&new_alpha.denom, &lideal->lattice.denom); + assert(quat_lattice_contains(NULL, &lideal->lattice, &new_alpha)); + + quat_alg_conj(&new_alpha, &new_alpha); + ibz_mul(&new_alpha.denom, &new_alpha.denom, &lideal->norm); + quat_lideal_mul(lideal, lideal, &new_alpha, alg); + assert(ibz_probab_prime(&lideal->norm, primality_num_iter)); + + found = 1; + break; + } + } + assert(found); + + ibz_finalize(&tmp); + ibz_finalize(&remainder); + ibz_finalize(&adjusted_norm); + quat_alg_elem_finalize(&new_alpha); + + ibz_mat_4x4_finalize(&gram); + ibz_mat_4x4_finalize(&red); + + return found; +} diff --git a/src/quaternion/ref/generic/lll/lll_benchmarks.c b/src/quaternion/ref/generic/lll/lll_benchmarks.c new file mode 100644 index 0000000..6b9bfba --- /dev/null +++ b/src/quaternion/ref/generic/lll/lll_benchmarks.c @@ -0,0 +1,377 @@ +#include "lll_internals.h" +#include "quaternion_tests.h" +#include +#include +#include + +// norms must be either a vector of length iterations of norms or NULL +int +quat_bench_lll_benchmark_lll_core(int bitsize, + int iterations, + int warmup_loops, //(int)(100000 / (bitsize*bitsize)) + 1; + quat_lattice_t *lattices, + const ibz_t *norms, + const quat_alg_t *alg, + int add_tests) +{ + int res = 0; + uint64_t start, end, time; + quat_lattice_t test; + ibz_t num, denom; + ibq_t eta, delta; + ibz_mat_4x4_t *reds; + ibz_mat_4x4_t gram; + ibz_init(&num); + ibz_init(&denom); + ibq_init(&eta); + ibq_init(&delta); + quat_lattice_init(&test); + ibz_mat_4x4_init(&gram); + quat_lll_set_ibq_parameters(&delta, &eta); + + reds = (ibz_mat_4x4_t *)malloc(iterations * sizeof(ibz_mat_4x4_t)); + for (int i = 0; i < iterations; i++) + ibz_mat_4x4_init(&(reds[i])); + + // warmup setup + quat_lattice_t *wu; + ibz_mat_4x4_t *wur; + wu = (quat_lattice_t *)malloc(warmup_loops * sizeof(quat_lattice_t)); + wur = (ibz_mat_4x4_t *)malloc(warmup_loops * sizeof(ibz_mat_4x4_t)); + for (int i = 0; i < warmup_loops; i++) { + quat_lattice_init(&(wu[i])); + ibz_mat_4x4_init(&(wur[i])); + } + quat_test_input_random_lattice_generation(wu, bitsize, warmup_loops, 1); + // Case for unknown norms + if (norms == NULL) { + printf("Start warmup and measures for bitsize %d iterations %d with non-ideals\n", bitsize, iterations); + // warmup loop + for (int iter = 0; iter < warmup_loops; iter++) { + quat_lattice_gram(&gram, &(lattices[iter]), alg); + ibz_mat_4x4_copy(&(reds[iter]), &(lattices[iter].basis)); + quat_lll_core(&gram, &(reds[iter])); + } + // benchmark loop + start = cpucycles(); + for (int iter = 0; iter < iterations; iter++) { + quat_lattice_gram(&gram, &(lattices[iter]), alg); + ibz_mat_4x4_copy(&(reds[iter]), &(lattices[iter].basis)); + quat_lll_core(&gram, &(reds[iter])); + } + end = cpucycles(); + } else { + // Using division by norm + quat_lattice_t O0; + quat_left_ideal_t *ideals; + quat_lattice_init(&O0); + quat_lattice_O0_set(&O0); + ideals = (quat_left_ideal_t *)malloc(iterations * sizeof(quat_left_ideal_t)); + for (int i = 0; i < iterations; i++) { + quat_left_ideal_init(&(ideals[i])); + ibz_mat_4x4_copy(&(ideals[i].lattice.basis), &(lattices[i].basis)); + ibz_copy(&(ideals[i].lattice.denom), &(lattices[i].denom)); + ibz_copy(&(ideals[i].norm), &(norms[i])); + (ideals[i].parent_order) = &O0; + } + + printf("Start warmup and measures for bitsize %d iterations %d with ideals\n", bitsize, iterations); + // warmup loop + for (int iter = 0; iter < warmup_loops; iter++) { + quat_lideal_class_gram(&gram, &(ideals[iter % iterations]), alg); + ibz_mat_4x4_copy(&(reds[iter % iterations]), &(ideals[iter % iterations].lattice.basis)); + quat_lll_core(&gram, &(reds[iter % iterations])); + } + // benchmark loop + start = cpucycles(); + for (int iter = 0; iter < iterations; iter++) { + quat_lideal_class_gram(&gram, &(ideals[iter]), alg); + ibz_mat_4x4_copy(&(reds[iter]), &(ideals[iter].lattice.basis)); + quat_lll_core(&gram, &(reds[iter])); + } + end = cpucycles(); + for (int i = 0; i < iterations; i++) + quat_left_ideal_finalize(&(ideals[i])); + free(ideals); + quat_lattice_finalize(&O0); + } + // results output + time = (end - start); + printf("%" PRIu64 " cycles per lattice\n%d Lattices %" PRIu64 " cycles total\n", + (uint64_t)(time / iterations), + iterations, + time); + + // test loop + if (add_tests) { + for (int iter = 0; iter < iterations; iter++) { + // test lll reduced + res = res || !quat_lll_verify(&(reds[iter]), &delta, &eta, alg); + // test lattice equality + ibz_copy(&(test.denom), &((lattices[iter]).denom)); + ibz_mat_4x4_copy(&(test.basis), &(reds[iter])); + quat_lattice_hnf(&test); + res = res || !quat_lattice_equal(&test, &(lattices[iter])); + } + + if (res != 0) { + printf("Quaternion benchmark tests for lll_core failed\n"); + } + } + printf("\n"); + + ibz_finalize(&num); + ibz_finalize(&denom); + ibq_finalize(&delta); + ibq_finalize(&eta); + quat_lattice_finalize(&test); + ibz_mat_4x4_finalize(&gram); + for (int i = 0; i < warmup_loops; i++) { + quat_lattice_finalize(&(wu[i])); + ibz_mat_4x4_finalize(&(wur[i])); + } + for (int i = 0; i < iterations; i++) + ibz_mat_4x4_finalize(&(reds[i])); + free(reds); + free(wu); + free(wur); + return (res); +} + +// ideals determines if generated as ideals: 0 means ideals, 1 lattices without HNF, 2 and any other +// number lattices in HNF tests if tests are run +int +quat_bench_lll_one_level(const ibz_t *prime, + const int *norm_bitsizes, + int nb_bitsizes, + int iterations, + int ideals, + int tests) +{ + // initializations + quat_alg_t alg; + quat_p_extremal_maximal_order_t order; + quat_lattice_t *lattices; + ibz_t *norms; + const ibz_t *used_norms; + quat_represent_integer_params_t params; + quat_alg_init_set(&alg, prime); + lattices = malloc(iterations * sizeof(quat_lattice_t)); + norms = malloc(iterations * sizeof(ibz_t)); + // initialize params: + quat_lattice_init(&(order.order)); + quat_alg_elem_init(&(order.t)); + quat_alg_elem_init(&(order.z)); + quat_lattice_O0_set_extremal(&order); + params.algebra = &alg; + params.order = ℴ + params.primality_test_iterations = 30; + int res = 0; + int randret = 0; + if (ideals == 0) { + used_norms = norms; + } else { + used_norms = NULL; + } + + // run benchmarks + for (int i = 0; i < iterations; i++) { + quat_lattice_init(&(lattices[i])); + ibz_init(&(norms[i])); + } + for (int i = 0; i < nb_bitsizes; i++) { + int warmups = (int)(100000 / (norm_bitsizes[i] * norm_bitsizes[i])) + 1; + if (ideals == 0) { + randret = randret || quat_test_input_random_ideal_lattice_generation( + lattices, norms, norm_bitsizes[i], iterations, ¶ms); + } else { + randret = randret || quat_test_input_random_lattice_generation( + lattices, norm_bitsizes[i], iterations, ideals - 1); // in HNF + } + if (!randret) { + res = res || quat_bench_lll_benchmark_lll_core( + norm_bitsizes[i], iterations, warmups, lattices, used_norms, &alg, tests); + } + } + quat_alg_finalize(&alg); + for (int i = 0; i < iterations; i++) { + ibz_finalize(&(norms[i])); + quat_lattice_finalize(&(lattices[i])); + } + quat_lattice_finalize(&(order.order)); + quat_alg_elem_finalize(&(order.t)); + quat_alg_elem_finalize(&(order.z)); + free(norms); + free(lattices); + return (res + 2 * (randret)); +} + +// this function must be adapted if algorithms or parameters change +int +quat_bench_lll_level(int lvl, int iterations, int ideals, int tests) +{ + if (!((lvl == 1) || (lvl == 3) || (lvl == 5))) { + printf("Invalid input level to quat_bench_lll_level: %d\n", lvl); + return (1); + } + ibz_t prime; + int norm_bitsizes[4] = { 0 }; + int nb_bitsizes = 4; + ibz_init(&prime); + if (lvl == 5) { + ibz_set_from_str(&prime, + "1afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffff", + 16); + norm_bitsizes[0] = 254; + norm_bitsizes[1] = 254; + norm_bitsizes[2] = 747; + norm_bitsizes[3] = 1006; + } + if (lvl == 3) { + ibz_set_from_str(&prime, + "40fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "fffffffffffffffffffffff", + 16); + norm_bitsizes[0] = 193; + norm_bitsizes[1] = 193; + norm_bitsizes[2] = 571; + norm_bitsizes[3] = 761; + } + if (lvl == 1) { + ibz_set_from_str(&prime, "4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16); + norm_bitsizes[0] = 127; + norm_bitsizes[1] = 127; + norm_bitsizes[2] = 377; + norm_bitsizes[3] = 501; + } + printf("Running benchmarks for lvl %d with bitsizes of [%d, %d, %d, %d] \n", + lvl, + norm_bitsizes[0], + norm_bitsizes[1], + norm_bitsizes[2], + norm_bitsizes[3]); + printf("Using prime "); + ibz_print(&prime, 10); + printf("\n"); + printf("With %d iterations, ", iterations); + if (tests == 0) + printf("no "); + printf("tests, and lattices generated as "); + if (ideals == 0) + printf("ideals"); + else { + printf("lattices"); + if (ideals != 1) + printf("not in hnf"); + } + printf("\n\n"); + int res = quat_bench_lll_one_level(&prime, norm_bitsizes, nb_bitsizes, iterations, ideals, tests); + ibz_finalize(&prime); + return (res); +} + +int +main(int argc, char *argv[]) +{ + uint32_t seed[12]; + int iterations = SQISIGN_TEST_REPS; + int help = 0; + int seed_set = 0; + int tests = 0; + int ideals = 0; + int res = 0; + int level = 1; + int level_set = 0; + +#ifndef NDEBUG + fprintf(stderr, + "\x1b[31mIt looks like SQIsign was compiled with assertions enabled.\n" + "This will severely impact performance measurements.\x1b[0m\n"); +#endif + + for (int i = 1; i < argc; i++) { + if (!tests && strcmp(argv[i], "--tests") == 0) { + tests = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + + if (level_set == 0 && sscanf(argv[i], "--level=%d", &level) == 1) { + level_set = 1; + continue; + } + + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!help && strcmp(argv[i], "--not_ideals") == 0) { + ideals = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + } + + if (help || (level != 1 && level != 3 && level != 5)) { + printf("Usage: %s [--level=] [--iterations=] [--tests] [--seed=]\n", argv[0]); + printf("Where is either 1 or 3 or 5; if not passed, runs on all levels\n"); + printf("Where is the number of iterations used for benchmarking; if not " + "present, uses the default: %d)\n", + iterations); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + printf("Additional verifications are run on each output if --tests is passed\n"); + printf("If --not_ideals is passed, input lattices are not generated as random O0 ideals of " + "norm of a level-specific bitsize, but as random lattices with entries of the same " + "bitsize\n"); + printf("Output has last bit set if tests failed, second-to-last if randomness failed\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + cpucycles_init(); + + if (level_set != 0) { + res = quat_bench_lll_level(level, iterations, ideals, tests); + } else { + for (level = 1; level <= 5; level += 2) { + res |= quat_bench_lll_level(level, iterations, ideals, tests); + } + } + + return (res); +} + +// Notes on realistic benchmarks: +// Denominator is always 2 +// Lattice numerators have following maximal bitsizes (when in HNF): +// lvl5: 254, 254, 755-757, ni 1006 +// lvl3: 193, 193, 570-571, ni 760-761 +// lvl1: 127, 127, 372-377, ni 500-501 +// where only the "ni" ones are not calls through the ideal reduction function. +// The largest coeff of all ideals above is about 2 times its norm. +// The quat_bench_lll_level and main functions takes the above into account. +// In particular lattices are always generated as ideals of O0 in HNF. + +// Measures obtained by prints in the L2 function and its applications diff --git a/src/quaternion/ref/generic/lll/lll_tests.c b/src/quaternion/ref/generic/lll/lll_tests.c new file mode 100644 index 0000000..0a0c773 --- /dev/null +++ b/src/quaternion/ref/generic/lll/lll_tests.c @@ -0,0 +1,794 @@ +#include "lll_internals.h" +#include "quaternion_tests.h" +#include + +int +quat_test_lll_ibq_consts(void) +{ + int ret = 0; + ibq_t t; + ibz_t tmp1, tmp2, tmp3; + ibz_init(&tmp1); + ibz_init(&tmp2); + ibz_init(&tmp3); + ibq_init(&t); + + ibz_set(&tmp1, 123); + ibz_set(&tmp2, -123); + if (!ibq_set(&t, &tmp1, &tmp2)) { + ret = -1; + goto err; + } + + if (ibq_is_one(&t)) { + ret = -1; + goto err; + } + + if (!ibq_is_ibz(&t)) { + ret = -1; + goto err; + } + + if (!ibq_to_ibz(&tmp3, &t)) { + ret = -1; + goto err; + } + + if (ibz_is_one(&tmp3)) { + ret = -1; + goto err; + } + + ibz_set(&tmp2, 123); + if (!ibq_set(&t, &tmp1, &tmp2)) { + ret = -1; + goto err; + } + + if (!ibq_is_one(&t)) { + ret = -1; + goto err; + } + + if (!ibq_is_ibz(&t)) { + ret = -1; + goto err; + } + + if (!ibq_to_ibz(&tmp3, &t)) { + ret = -1; + goto err; + } + + if (!ibz_is_one(&tmp3)) { + ret = -1; + goto err; + } + + ibz_set(&tmp1, 0); + ibq_set(&t, &tmp1, &tmp2); + + if (!ibq_is_zero(&t)) { + ret = -1; + goto err; + } + + if (!ibq_is_ibz(&t)) { + ret = -1; + goto err; + } + + if (!ibq_to_ibz(&tmp3, &t)) { + ret = -1; + goto err; + } + + if (!ibz_is_zero(&tmp3)) { + ret = -1; + goto err; + } + +err: + ibq_finalize(&t); + ibz_finalize(&tmp1); + ibz_finalize(&tmp2); + ibz_finalize(&tmp3); + return ret; +} + +// test for lll verification +// void ibq_vec_4_copy_ibz(ibq_vec_4_t *vec, const ibz_t *coeff0, const ibz_t *coeff1,const ibz_t +// *coeff2,const ibz_t *coeff3); +int +quat_test_lll_ibq_vec_4_copy_ibz(void) +{ + int res = 0; + ibq_vec_4_t vec; + ibz_vec_4_t vec_z; + ibz_vec_4_init(&vec_z); + ibq_vec_4_init(&vec); + ibz_vec_4_set(&vec_z, 2, 3, 4, 5); + ibq_vec_4_copy_ibz(&vec, &(vec_z[0]), &(vec_z[1]), &(vec_z[2]), &(vec_z[3])); + for (int i = 0; i < 4; i++) { + ibq_to_ibz(&(vec_z[i]), &(vec[i])); + res = res || (ibz_cmp_int32(&(vec_z[i]), i + 2) != 0); + } + + if (res != 0) { + printf("Quaternion unit test lll_ibq_vec_4_copy_ibz failed\n"); + } + ibz_vec_4_finalize(&vec_z); + ibq_vec_4_finalize(&vec); + return (res); +} + +// void quat_lll_bilinear(ibq_t *b, const ibq_vec_4_t *vec0, const ibq_vec_4_t *vec1, const +// ibz_t *q); +int +quat_test_lll_bilinear(void) +{ + int res = 0; + ibz_vec_4_t init_helper; + ibq_vec_4_t vec0, vec1; + ibz_t q; + ibq_t cmp, b; + ibz_vec_4_init(&init_helper); + ibq_init(&cmp); + ibq_init(&b); + ibz_init(&q); + ibq_vec_4_init(&vec0); + ibq_vec_4_init(&vec1); + ibz_vec_4_set(&init_helper, 1, 2, 3, 4); + ibq_vec_4_copy_ibz(&vec0, &(init_helper[0]), &(init_helper[1]), &(init_helper[2]), &(init_helper[3])); + ibz_vec_4_set(&init_helper, 9, -8, 7, -6); + ibq_vec_4_copy_ibz(&vec1, &(init_helper[0]), &(init_helper[1]), &(init_helper[2]), &(init_helper[3])); + for (int i = 0; i < 4; i++) { + ibq_inv(&(vec0[i]), &(vec0[i])); + } + ibz_set(&q, 3); + ibz_vec_4_set(&init_helper, 15, 2, 0, 0); + ibq_set(&cmp, &(init_helper[0]), &(init_helper[1])); + quat_lll_bilinear(&b, &vec0, &vec1, &q); + res = res || (ibq_cmp(&b, &cmp)); + + if (res != 0) { + printf("Quaternion unit test quat_lll_bilinear failed\n"); + } + ibq_finalize(&cmp); + ibq_finalize(&b); + ibz_finalize(&q); + ibz_vec_4_finalize(&init_helper); + ibq_vec_4_finalize(&vec0); + ibq_vec_4_finalize(&vec1); + return (res); +} + +// void quat_lll_gram_schmidt_transposed_with_ibq(ibq_mat_4x4_t *orthogonalised_transposed, const +// ibz_mat_4x4_t *mat, const ibz_t *q); +int +quat_test_lll_gram_schmidt_transposed_with_ibq(void) +{ + int res = 0; + int zero; + ibq_mat_4x4_t ot, cmp; + ibz_mat_4x4_t mat; + ibz_t q, num, denom; + ibq_t b; + ibz_init(&q); + ibz_init(&num); + ibz_init(&denom); + ibq_init(&b); + ibz_mat_4x4_init(&mat); + ibq_mat_4x4_init(&ot); + ibq_mat_4x4_init(&cmp); + + ibz_mat_4x4_zero(&mat); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(mat[i][j]), i * i + (j + 5) * j - 2 + (i == j)); + } + } + ibz_set(&q, 3); + quat_lll_gram_schmidt_transposed_with_ibq(&ot, &mat, &q); + // test orthogonality + for (int i = 0; i < 4; i++) { + for (int j = i + 1; j < 4; j++) { + quat_lll_bilinear(&b, &(ot[i]), &(ot[j]), &q); + res = res || !ibq_is_zero(&b); + } + } + // test first vector is identical to mat + for (int i = 0; i < 4; i++) { + ibq_to_ibz(&q, &(ot[0][i])); + res = res || ibz_cmp(&q, &(mat[i][0])); + } + // test no zero vector + for (int i = 0; i < 4; i++) { + zero = 1; + for (int j = 0; j < 4; j++) { + zero = zero && ibq_is_zero(&(ot[i][j])); + } + res = res || zero; + } + + ibz_set(&(mat[0][0]), 1); + ibz_set(&(mat[0][1]), 0); + ibz_set(&(mat[0][2]), 1); + ibz_set(&(mat[0][3]), 0); + ibz_set(&(mat[1][0]), 0); + ibz_set(&(mat[1][1]), 1); + ibz_set(&(mat[1][2]), 0); + ibz_set(&(mat[1][3]), 1); + ibz_set(&(mat[2][0]), 1); + ibz_set(&(mat[2][1]), 0); + ibz_set(&(mat[2][2]), 2); + ibz_set(&(mat[2][3]), 0); + ibz_set(&(mat[3][0]), 0); + ibz_set(&(mat[3][1]), 1); + ibz_set(&(mat[3][2]), 0); + ibz_set(&(mat[3][3]), 2); + ibz_set(&denom, 1); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibq_set(&(cmp[i][j]), &(mat[j][i]), &denom); + } + } + ibz_set(&denom, 3); + ibz_set(&num, -2); + ibq_set(&(cmp[2][0]), &num, &denom); + ibq_set(&(cmp[3][1]), &num, &denom); + ibz_set(&num, 1); + ibq_set(&(cmp[2][2]), &num, &denom); + ibq_set(&(cmp[3][3]), &num, &denom); + ibz_set(&q, 2); + quat_lll_gram_schmidt_transposed_with_ibq(&ot, &mat, &q); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + res = res || ibq_cmp(&(cmp[i][j]), &(ot[i][j])); + } + } + + ibz_set(&(mat[0][0]), 1); + ibz_set(&(mat[0][1]), 0); + ibz_set(&(mat[0][2]), 1); + ibz_set(&(mat[0][3]), 0); + ibz_set(&(mat[1][0]), 0); + ibz_set(&(mat[1][1]), 1); + ibz_set(&(mat[1][2]), 0); + ibz_set(&(mat[1][3]), 1); + ibz_set(&(mat[2][0]), 1); + ibz_set(&(mat[2][1]), 0); + ibz_set(&(mat[2][2]), 2); + ibz_set(&(mat[2][3]), 1); + ibz_set(&(mat[3][0]), 0); + ibz_set(&(mat[3][1]), 1); + ibz_set(&(mat[3][2]), 0); + ibz_set(&(mat[3][3]), 2); + ibz_set(&denom, 1); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibq_set(&(cmp[i][j]), &(mat[j][i]), &denom); + } + } + ibz_set(&denom, 3); + ibz_set(&num, -2); + ibq_set(&(cmp[2][0]), &num, &denom); + ibq_set(&(cmp[3][1]), &num, &denom); + ibz_set(&num, 1); + ibq_set(&(cmp[2][2]), &num, &denom); + ibq_set(&(cmp[3][3]), &num, &denom); + ibz_set(&num, 0); + ibq_set(&(cmp[3][0]), &num, &denom); + ibq_set(&(cmp[3][2]), &num, &denom); + ibz_set(&q, 2); + quat_lll_gram_schmidt_transposed_with_ibq(&ot, &mat, &q); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + res = res || ibq_cmp(&(cmp[i][j]), &(ot[i][j])); + } + } + + if (res != 0) { + printf("Quaternion unit test dim4_gram_schmidt_transposed_with_ibq failed\n"); + } + ibz_finalize(&q); + ibz_finalize(&num); + ibz_finalize(&denom); + ibq_finalize(&b); + ibz_mat_4x4_finalize(&mat); + ibq_mat_4x4_finalize(&ot); + ibq_mat_4x4_finalize(&cmp); + return (res); +} + +// int quat_lll_verify(const ibz_mat_4x4_t *mat, const ibq_t *delta, const ibq_t *eta, const +// quat_alg_t *alg); +int +quat_test_lll_verify(void) +{ + int res = 0; + ibz_mat_4x4_t mat; + ibz_t q, coeff_num, coeff_denom; + ibq_t eta, delta; + quat_alg_t alg; + ibz_mat_4x4_init(&mat); + ibz_init(&q); + ibq_init(&delta); + ibq_init(&eta); + ibz_init(&coeff_num); + ibz_init(&coeff_denom); + + // reduced: non-1 norm + ibz_set(&q, 3); + quat_alg_init_set(&alg, &q); + ibq_set(&eta, &ibz_const_one, &ibz_const_two); + ibq_set(&delta, &ibz_const_three, &ibz_const_two); + ibq_mul(&delta, &delta, &eta); + ibz_set(&(mat[0][0]), 0); + ibz_set(&(mat[0][1]), 2); + ibz_set(&(mat[0][2]), 3); + ibz_set(&(mat[0][3]), -14); + ibz_set(&(mat[1][0]), 2); + ibz_set(&(mat[1][1]), -1); + ibz_set(&(mat[1][2]), -4); + ibz_set(&(mat[1][3]), -8); + ibz_set(&(mat[2][0]), 1); + ibz_set(&(mat[2][1]), -2); + ibz_set(&(mat[2][2]), 1); + ibz_set(&(mat[2][3]), 0); + ibz_set(&(mat[3][0]), 1); + ibz_set(&(mat[3][1]), 1); + ibz_set(&(mat[3][2]), 0); + ibz_set(&(mat[3][3]), 7); + res = res || !quat_lll_verify(&mat, &delta, &eta, &alg); + quat_alg_finalize(&alg); + + // reduced: non-1 norm + ibz_set(&q, 103); + quat_alg_init_set(&alg, &q); + ibz_set(&coeff_num, 99); + ibz_set(&coeff_denom, 100); + ibq_set(&delta, &coeff_num, &coeff_denom); + ibz_set(&(mat[0][0]), 3); + ibz_set(&(mat[0][1]), 0); + ibz_set(&(mat[0][2]), 90); + ibz_set(&(mat[0][3]), -86); + ibz_set(&(mat[1][0]), 11); + ibz_set(&(mat[1][1]), 15); + ibz_set(&(mat[1][2]), 12); + ibz_set(&(mat[1][3]), 50); + ibz_set(&(mat[2][0]), 1); + ibz_set(&(mat[2][1]), -2); + ibz_set(&(mat[2][2]), 0); + ibz_set(&(mat[2][3]), 3); + ibz_set(&(mat[3][0]), -1); + ibz_set(&(mat[3][1]), 0); + ibz_set(&(mat[3][2]), 5); + ibz_set(&(mat[3][3]), 5); + res = res || !quat_lll_verify(&mat, &delta, &eta, &alg); + quat_alg_finalize(&alg); + + if (res != 0) { + printf("Quaternion unit test quat_lll_verify failed\n"); + } + ibz_finalize(&q); + ibq_finalize(&delta); + ibq_finalize(&eta); + ibz_finalize(&coeff_num); + ibz_finalize(&coeff_denom); + ibz_mat_4x4_finalize(&mat); + return (res); +} + +// int quat_lattice_lll(ibz_mat_4x4_t *red, const quat_lattice_t *lattice, const ibz_t *q, int +// precision); +int +quat_test_lll_lattice_lll(void) +{ + int res = 0; + quat_lattice_t lat, test; + ibz_mat_4x4_t red; + ibz_t num, denom, q; + ibq_t eta, delta; + quat_alg_t alg; + ibz_init(&num); + ibz_init(&denom); + ibz_init(&q); + ibq_init(&delta); + ibq_init(&eta); + ibz_mat_4x4_init(&red); + quat_lattice_init(&lat); + quat_lattice_init(&test); + ibz_set(&q, 103); + quat_alg_init_set(&alg, &q); + + // set lattice + ibz_set(&lat.denom, 60); + ibz_mat_4x4_zero(&(lat.basis)); + ibz_set(&lat.basis[0][0], 3); + ibz_set(&lat.basis[1][0], 7); + ibz_set(&lat.basis[0][1], 1); + ibz_set(&lat.basis[3][1], -6); + ibz_set(&lat.basis[1][2], 12); + ibz_set(&lat.basis[2][2], 5); + ibz_set(&lat.basis[0][3], -19); + ibz_set(&lat.basis[3][3], 3); + + quat_lattice_hnf(&lat); + + res = res || quat_lattice_lll(&red, &lat, &alg); + // test lll reduced + quat_lll_set_ibq_parameters(&delta, &eta); + res = res || !quat_lll_verify(&red, &delta, &eta, &alg); + // test lattice equality + ibz_copy(&(test.denom), &(lat.denom)); + ibz_mat_4x4_copy(&(test.basis), &(red)); + quat_lattice_hnf(&test); + res = res || !quat_lattice_equal(&test, &lat); + + if (res != 0) { + printf("Quaternion unit test lll_lattice_lll failed\n"); + } + ibz_finalize(&num); + ibz_finalize(&denom); + ibz_finalize(&q); + ibq_finalize(&eta); + ibq_finalize(&delta); + ibz_mat_4x4_finalize(&red); + quat_lattice_finalize(&lat); + quat_lattice_finalize(&test); + quat_alg_finalize(&alg); + return (res); +} + +// int quat_lattice_lll(ibz_mat_4x4_t *red, const quat_lattice_t *lattice, const quat_alg_t *alg); +int +quat_test_lll_randomized_lattice_lll(void) +{ + int res = 0; + quat_lattice_t lat, test; + ibz_mat_4x4_t red; + ibz_t q, det; + ibq_t delta, eta; + int32_t rand[4][4]; + int32_t rand_denom; + uint32_t rand_q; + ibz_init(&q); + ibz_init(&det); + ibq_init(&eta); + ibq_init(&delta); + ibz_mat_4x4_init(&red); + quat_lattice_init(&lat); + quat_lattice_init(&test); + quat_lll_set_ibq_parameters(&delta, &eta); + + for (int iter = 0; iter < 20; iter++) { + quat_alg_t alg; + rand_denom = 0; + while (rand_denom <= 0) { + int randret = randombytes((unsigned char *)&rand_denom, sizeof(int32_t)); + if (randret != 0) + return 1; + } + int randret = randombytes((unsigned char *)&rand_q, sizeof(uint32_t)); + if (randret != 0) + return 1; + // generate random invertible matrix + ibz_set(&det, 0); + while (ibz_is_zero(&det)) { + randret = randombytes((unsigned char *)rand, sizeof(rand)); + if (randret != 0) + return 1; + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(lat.basis[i][j]), rand[j][i]); + } + } + ibz_mat_4x4_inv_with_det_as_denom(NULL, &det, &(lat.basis)); + } + + // set lattice + ibz_set(&lat.denom, rand_denom); + quat_lattice_hnf(&lat); + // set algebra + ibz_set(&q, 1 + (rand_q % 1023)); + quat_alg_init_set(&alg, &q); + // reduce + res = res || quat_lattice_lll(&red, &lat, &alg); + // test lll reduced + res = res || !quat_lll_verify(&red, &delta, &eta, &alg); + // test lattice equality + ibz_copy(&(test.denom), &(lat.denom)); + ibz_mat_4x4_copy(&(test.basis), &(red)); + quat_lattice_hnf(&test); + res = res || !quat_lattice_equal(&test, &lat); + quat_alg_finalize(&alg); + } + + if (res != 0) { + printf("Quaternion unit test of lll with randomization for lattice_lll failed\n"); + } + ibz_finalize(&q); + ibz_finalize(&det); + ibq_finalize(&delta); + ibq_finalize(&eta); + ibz_mat_4x4_finalize(&red); + quat_lattice_finalize(&lat); + quat_lattice_finalize(&test); + return (res); +} + +// int quat_lideal_reduce_basis(ibz_mat_4x4_t *reduced, ibz_mat_4x4_t *gram, const +// quat_left_ideal_t *lideal, const quat_alg_t *alg); +int +quat_test_lideal_reduce_basis() +{ + int res = 0; + ibz_mat_4x4_t red, gram, prod, gram_norm; + ibz_vec_4_t vec; + quat_left_ideal_t lideal; + quat_lattice_t test; + quat_alg_t alg; + quat_alg_elem_t init_helper; + quat_lattice_t order; + ibq_t delta, eta; + ibz_t num, denom, norm, test_norm; + ibz_init(&num); + ibz_init(&denom); + ibz_init(&norm); + ibz_init(&test_norm); + ibq_init(&delta); + ibq_init(&eta); + ibz_vec_4_init(&vec); + ibz_mat_4x4_init(&prod); + ibz_mat_4x4_init(&gram_norm); + quat_lattice_init(&test); + quat_alg_elem_init(&init_helper); + quat_lattice_init(&order); + quat_alg_init_set_ui(&alg, 19); + ibz_mat_4x4_init(&gram); + ibz_mat_4x4_init(&red); + quat_left_ideal_init(&lideal); + quat_lattice_O0_set(&order); + quat_alg_elem_set(&init_helper, 1, 1, 2, 8, 8); + quat_lideal_create_principal(&lideal, &init_helper, &order, &alg); + quat_lattice_reduce_denom(&(lideal.lattice), &(lideal.lattice)); + quat_lideal_reduce_basis(&red, &gram, &lideal, &alg); + quat_lll_set_ibq_parameters(&delta, &eta); + res = res || !quat_lll_verify(&red, &delta, &eta, &alg); + // test reduced and lideal generate same lattice + ibz_mat_4x4_copy(&(test.basis), &red); + ibz_copy(&(test.denom), &(lideal.lattice.denom)); + quat_lattice_hnf(&test); + res = res || !quat_lattice_equal(&(lideal.lattice), &test); + // test gram matrix is gram matrix + ibz_mat_4x4_identity(&gram_norm); + ibz_copy(&(gram_norm[2][2]), &(alg.p)); + ibz_copy(&(gram_norm[3][3]), &(alg.p)); + ibz_mat_4x4_transpose(&prod, &red); + ibz_mat_4x4_mul(&prod, &prod, &gram_norm); + ibz_mat_4x4_mul(&prod, &prod, &red); + for (int i = 0; i < 4; i++) { + ibz_vec_4_set(&vec, (i == 0), (i == 1), (i == 2), (i == 3)); + quat_qf_eval(&norm, &gram, &vec); + quat_qf_eval(&test_norm, &prod, &vec); + ibz_mul(&norm, &(lideal.norm), &norm); + res = res || !(ibz_cmp(&norm, &test_norm) == 0); + } + + if (res != 0) { + printf("Quaternion unit test lideal_reduce_basis failed\n"); + } + ibz_finalize(&num); + ibz_finalize(&denom); + ibz_finalize(&norm); + ibz_finalize(&test_norm); + ibq_finalize(&delta); + ibq_finalize(&eta); + quat_lattice_finalize(&test); + quat_alg_elem_finalize(&init_helper); + ibz_mat_4x4_finalize(&prod); + quat_lattice_finalize(&order); + quat_alg_finalize(&alg); + ibz_vec_4_finalize(&vec); + ibz_mat_4x4_finalize(&gram); + ibz_mat_4x4_finalize(&red); + ibz_mat_4x4_finalize(&gram_norm); + quat_left_ideal_finalize(&lideal); + return (res); +} + +// int quat_lideal_lideal_mul_reduced(quat_left_ideal_t *prod, ibz_mat_4x4_t *gram, const +// quat_left_ideal_t *lideal1,const quat_left_ideal_t *lideal2, const quat_alg_t *alg); +int +quat_test_lll_lideal_lideal_mul_reduced() +{ + int res = 0; + ibz_t n, norm, test_norm; + ibq_t delta, eta; + ibz_vec_4_t vec; + quat_alg_t alg; + quat_alg_elem_t gen; + quat_lattice_t order, ro; + quat_left_ideal_t lideal1, lideal2, prod, i1, i2; + ibz_mat_4x4_t gram; + ibz_mat_4x4_t gram_test; + + ibz_init(&n); + ibz_init(&norm); + ibz_init(&test_norm); + ibq_init(&delta); + ibq_init(&eta); + ibz_vec_4_init(&vec); + quat_alg_elem_init(&gen); + quat_left_ideal_init(&lideal1); + quat_left_ideal_init(&lideal2); + quat_left_ideal_init(&i1); + quat_left_ideal_init(&i2); + quat_left_ideal_init(&prod); + quat_lattice_init(&order); + quat_lattice_init(&ro); + ibz_mat_4x4_init(&gram); + ibz_mat_4x4_init(&gram_test); + + quat_alg_init_set_ui(&alg, 103); + quat_lattice_O0_set(&order); + quat_lll_set_ibq_parameters(&delta, &eta); + + ibz_set(&n, 113); + quat_alg_elem_set(&gen, 1, 10, 0, 1, 3); + quat_lideal_create(&lideal1, &gen, &n, &order, &alg); + + ibz_set(&n, 89); + quat_alg_elem_set(&gen, 2, 2, 5, 1, 4); + quat_lideal_create(&lideal2, &gen, &n, &order, &alg); + + quat_lideal_copy(&i1, &lideal1); + quat_lideal_copy(&i2, &lideal2); + + quat_lideal_lideal_mul_reduced(&prod, &gram, &lideal1, &lideal2, &alg); + res = res || !quat_lll_verify(&(prod.lattice.basis), &delta, &eta, &alg); + ibz_mat_4x4_identity(&(gram_test)); + ibz_copy(&(gram_test[2][2]), &(alg.p)); + ibz_copy(&(gram_test[3][3]), &(alg.p)); + ibz_mat_4x4_mul(&(gram_test), &(gram_test), &(prod.lattice.basis)); + ibz_mat_4x4_transpose(&(gram_test), &(gram_test)); + ibz_mat_4x4_mul(&(gram_test), &(gram_test), &(prod.lattice.basis)); + for (int i = 0; i < 4; i++) { + ibz_vec_4_set(&vec, (i == 0), (i == 1), (i == 2), (i == 3)); + quat_qf_eval(&norm, &gram, &vec); + quat_qf_eval(&test_norm, &gram_test, &vec); + ibz_mul(&norm, &(prod.norm), &norm); + res = res || !(ibz_cmp(&norm, &test_norm) == 0); + } + quat_lattice_hnf(&(prod.lattice)); + + res = res || !quat_lideal_equals(&i1, &lideal1, &alg); + res = res || !quat_lideal_equals(&i2, &lideal2, &alg); + quat_lattice_mul(&i1.lattice, &i1.lattice, &i2.lattice, &alg); + res = res || !quat_lattice_equal(&i1.lattice, &prod.lattice); + res = res || !(prod.parent_order == lideal1.parent_order); + i1.parent_order = lideal1.parent_order; + quat_lideal_norm(&i1); + res = res || !quat_lideal_equals(&i1, &prod, &alg); + + if (res != 0) { + printf("Quaternion unit test lideal_lideal_mul_reduced failed\n"); + } + ibz_finalize(&n); + ibz_finalize(&norm); + ibz_finalize(&test_norm); + ibq_finalize(&delta); + ibq_finalize(&eta); + ibz_vec_4_finalize(&vec); + quat_alg_elem_finalize(&gen); + quat_left_ideal_finalize(&lideal1); + quat_left_ideal_finalize(&lideal2); + quat_left_ideal_finalize(&i1); + quat_left_ideal_finalize(&i2); + quat_left_ideal_finalize(&prod); + quat_lattice_finalize(&order); + quat_lattice_finalize(&ro); + quat_alg_finalize(&alg); + ibz_mat_4x4_finalize(&gram); + ibz_mat_4x4_finalize(&gram_test); + return (res); +} + +// int quat_lideal_prime_norm_reduced_equivalent(quat_left_ideal_t *lideal, const quat_alg_t *alg, +// const int primality_num_iter, const int equiv_bound_coeff, const int equiv_num_iter); +int +quat_test_lll_lideal_prime_norm_reduced_equivalent() +{ + int res = 0; + ibz_t n, d; + quat_alg_t alg; + quat_alg_elem_t gen; + ibz_mat_4x4_t red, gram; + quat_lattice_t order, ro, ro2; + quat_left_ideal_t lideal1, lideal2, i1; + + ibz_init(&n); + ibz_init(&d); + quat_alg_elem_init(&gen); + quat_left_ideal_init(&lideal1); + quat_left_ideal_init(&lideal2); + quat_left_ideal_init(&i1); + quat_lattice_init(&order); + quat_lattice_init(&ro); + quat_lattice_init(&ro2); + ibz_mat_4x4_init(&red); + ibz_mat_4x4_init(&gram); + + quat_alg_init_set_ui(&alg, 103); + quat_lattice_O0_set(&order); + + ibz_set(&n, 113); + quat_alg_elem_set(&gen, 1, 10, 0, 1, 3); + quat_lideal_create(&lideal1, &gen, &n, &order, &alg); + + quat_lideal_copy(&i1, &lideal1); + quat_lideal_right_order(&ro, &lideal1, &alg); + + quat_lideal_prime_norm_reduced_equivalent(&lideal1, &alg, 20, 20); + + // test norm correctness + quat_lattice_hnf(&(lideal1.lattice)); + ibz_copy(&n, &(lideal1.norm)); + quat_lideal_norm(&lideal1); + res = res || (0 != ibz_cmp(&n, &(lideal1.norm))); + + // test norm primality + res = res || !ibz_probab_prime(&n, 20); + + // test equivalence + quat_lideal_right_order(&ro2, &lideal1, &alg); + quat_lattice_mul(&(lideal2.lattice), &ro, &ro2, &alg); + ibz_set(&(lideal2.lattice.denom), 1); + lideal2.parent_order = &ro; + quat_lattice_hnf(&(lideal2.lattice)); + quat_lideal_norm(&lideal2); + // now lideal2 is a connecting idea of ro and ro2 + quat_lideal_reduce_basis(&red, &gram, &lideal2, &alg); + quat_alg_elem_copy_ibz(&gen, &(lideal2.lattice.denom), &(red[0][0]), &(red[1][0]), &(red[2][0]), &(red[3][0])); + quat_alg_norm(&n, &d, &gen, &alg); + assert(ibz_is_one(&d)); + res = res || (0 != ibz_cmp(&n, &(lideal2.norm))); + + if (res != 0) { + printf("Quaternion unit test lideal_prime_norm_reduced_equivalent failed\n"); + } + ibz_finalize(&n); + ibz_finalize(&d); + ibz_mat_4x4_finalize(&red); + ibz_mat_4x4_finalize(&gram); + quat_alg_elem_finalize(&gen); + quat_left_ideal_finalize(&lideal1); + quat_left_ideal_finalize(&lideal2); + quat_left_ideal_finalize(&i1); + quat_lattice_finalize(&order); + quat_lattice_finalize(&ro); + quat_lattice_finalize(&ro2); + quat_alg_finalize(&alg); + return (res); +} + +// run all previous tests +int +quat_test_lll(void) +{ + int res = 0; + printf("\nRunning quaternion tests of lll and its subfunctions\n"); + res = res | quat_test_lll_ibq_consts(); + res = res | quat_test_lll_ibq_vec_4_copy_ibz(); + res = res | quat_test_lll_bilinear(); + res = res | quat_test_lll_gram_schmidt_transposed_with_ibq(); + res = res | quat_test_lll_verify(); + res = res | quat_test_lll_lattice_lll(); + res = res | quat_test_lll_randomized_lattice_lll(); + res = res | quat_test_lideal_reduce_basis(); + res = res | quat_test_lll_lideal_lideal_mul_reduced(); + res = res | quat_test_lll_lideal_prime_norm_reduced_equivalent(); + return (res); +} diff --git a/src/quaternion/ref/generic/lll/lll_verification.c b/src/quaternion/ref/generic/lll/lll_verification.c new file mode 100644 index 0000000..359c91f --- /dev/null +++ b/src/quaternion/ref/generic/lll/lll_verification.c @@ -0,0 +1,174 @@ +#include "lll_internals.h" + +// functions to verify lll +void +quat_lll_set_ibq_parameters(ibq_t *delta, ibq_t *eta) +{ + ibz_t num, denom; + ibz_init(&num); + ibz_init(&denom); + ibq_set(delta, &ibz_const_one, &ibz_const_two); + ibz_set(&num, EPSILON_NUM); + ibz_set(&denom, EPSILON_DENOM); + ibq_set(eta, &num, &denom); + ibq_add(eta, eta, delta); + ibz_set(&num, DELTA_NUM); + ibz_set(&denom, DELTA_DENOM); + ibq_set(delta, &num, &denom); + ibz_finalize(&num); + ibz_finalize(&denom); +} + +void +ibq_vec_4_copy_ibz(ibq_vec_4_t *vec, const ibz_t *coeff0, const ibz_t *coeff1, const ibz_t *coeff2, const ibz_t *coeff3) +{ + ibz_t one; + ibz_init(&one); + ibz_set(&one, 1); + ibq_set(&((*vec)[0]), coeff0, &one); + ibq_set(&((*vec)[1]), coeff1, &one); + ibq_set(&((*vec)[2]), coeff2, &one); + ibq_set(&((*vec)[3]), coeff3, &one); + ibz_finalize(&one); +} + +void +quat_lll_bilinear(ibq_t *b, const ibq_vec_4_t *vec0, const ibq_vec_4_t *vec1, const ibz_t *q) +{ + ibq_t sum, prod, norm_q; + ibz_t one; + ibz_init(&one); + ibz_set(&one, 1); + ibq_init(&sum); + ibq_init(&prod); + ibq_init(&norm_q); + ibq_set(&norm_q, q, &one); + + ibq_mul(&sum, &((*vec0)[0]), &((*vec1)[0])); + ibq_mul(&prod, &((*vec0)[1]), &((*vec1)[1])); + ibq_add(&sum, &sum, &prod); + ibq_mul(&prod, &((*vec0)[2]), &((*vec1)[2])); + ibq_mul(&prod, &prod, &norm_q); + ibq_add(&sum, &sum, &prod); + ibq_mul(&prod, &((*vec0)[3]), &((*vec1)[3])); + ibq_mul(&prod, &prod, &norm_q); + ibq_add(b, &sum, &prod); + + ibz_finalize(&one); + ibq_finalize(&sum); + ibq_finalize(&prod); + ibq_finalize(&norm_q); +} + +void +quat_lll_gram_schmidt_transposed_with_ibq(ibq_mat_4x4_t *orthogonalised_transposed, + const ibz_mat_4x4_t *mat, + const ibz_t *q) +{ + ibq_mat_4x4_t work; + ibq_vec_4_t vec; + ibq_t norm, b, coeff, prod; + ibq_init(&norm); + ibq_init(&coeff); + ibq_init(&prod); + ibq_init(&b); + ibq_mat_4x4_init(&work); + ibq_vec_4_init(&vec); + // transpose the input matrix to be able to work on vectors + for (int i = 0; i < 4; i++) { + ibq_vec_4_copy_ibz(&(work[i]), &((*mat)[0][i]), &((*mat)[1][i]), &((*mat)[2][i]), &((*mat)[3][i])); + } + + for (int i = 0; i < 4; i++) { + quat_lll_bilinear(&norm, &(work[i]), &(work[i]), q); + ibq_inv(&norm, &norm); + for (int j = i + 1; j < 4; j++) { + ibq_vec_4_copy_ibz(&vec, &((*mat)[0][j]), &((*mat)[1][j]), &((*mat)[2][j]), &((*mat)[3][j])); + quat_lll_bilinear(&b, &(work[i]), &vec, q); + ibq_mul(&coeff, &norm, &b); + for (int k = 0; k < 4; k++) { + ibq_mul(&prod, &coeff, &(work[i][k])); + ibq_sub(&(work[j][k]), &(work[j][k]), &prod); + } + } + } + + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibq_copy(&((*orthogonalised_transposed)[i][j]), &(work[i][j])); + } + } + + ibq_finalize(&norm); + ibq_finalize(&coeff); + ibq_finalize(&prod); + ibq_finalize(&b); + ibq_mat_4x4_finalize(&work); + ibq_vec_4_finalize(&vec); +} + +int +quat_lll_verify(const ibz_mat_4x4_t *mat, const ibq_t *delta, const ibq_t *eta, const quat_alg_t *alg) +{ + int res = 1; + ibq_mat_4x4_t orthogonalised_transposed; + ibq_vec_4_t tmp_vec; + ibq_t div, tmp, mu, two, norm, b; + ibz_t mu2_floored, num, denom; + ibq_mat_4x4_init(&orthogonalised_transposed); + ibq_vec_4_init(&tmp_vec); + ibq_init(&div); + ibq_init(&tmp); + ibq_init(&norm); + ibq_init(&b); + ibq_init(&mu); + ibq_init(&two); + ibz_init(&mu2_floored); + ibz_init(&num); + ibz_init(&denom); + ibz_set(&num, 2); + ibz_set(&denom, 1); + ibq_set(&two, &num, &denom); + + quat_lll_gram_schmidt_transposed_with_ibq(&orthogonalised_transposed, mat, &(alg->p)); + // check small bilinear products/norms + for (int i = 0; i < 4; i++) { + for (int j = 0; j < i; j++) { + ibq_vec_4_copy_ibz(&tmp_vec, &((*mat)[0][i]), &((*mat)[1][i]), &((*mat)[2][i]), &((*mat)[3][i])); + quat_lll_bilinear(&b, &(orthogonalised_transposed[j]), &tmp_vec, &(alg->p)); + quat_lll_bilinear(&norm, &(orthogonalised_transposed[j]), &(orthogonalised_transposed[j]), &(alg->p)); + ibq_inv(&tmp, &norm); + ibq_mul(&mu, &b, &tmp); + ibq_abs(&mu, &mu); + // compare to eta + res = res && (ibq_cmp(&mu, eta) <= 0); + } + } + for (int i = 1; i < 4; i++) { + ibq_vec_4_copy_ibz(&tmp_vec, &((*mat)[0][i]), &((*mat)[1][i]), &((*mat)[2][i]), &((*mat)[3][i])); + quat_lll_bilinear(&b, &(orthogonalised_transposed[i - 1]), &tmp_vec, &(alg->p)); + quat_lll_bilinear(&norm, &(orthogonalised_transposed[i - 1]), &(orthogonalised_transposed[i - 1]), &(alg->p)); + ibq_inv(&tmp, &norm); + ibq_mul(&mu, &b, &tmp); + // tmp is mu^2 + ibq_mul(&tmp, &mu, &mu); + // mu is delta-mu^2 + ibq_sub(&mu, delta, &tmp); + quat_lll_bilinear(&tmp, &(orthogonalised_transposed[i]), &(orthogonalised_transposed[i]), &(alg->p)); + // get (delta-mu^2)norm(i-1) + ibq_mul(&div, &norm, &mu); + res = res && (ibq_cmp(&tmp, &div) >= 0); + } + ibq_mat_4x4_finalize(&orthogonalised_transposed); + ibq_vec_4_finalize(&tmp_vec); + ibq_finalize(&div); + ibq_finalize(&norm); + ibq_finalize(&b); + ibq_finalize(&tmp); + ibq_finalize(&mu); + ibq_finalize(&two); + ibz_finalize(&mu2_floored); + ibz_finalize(&num); + ibz_finalize(&denom); + return (res); +} diff --git a/src/quaternion/ref/generic/lll/rationals.c b/src/quaternion/ref/generic/lll/rationals.c new file mode 100644 index 0000000..0c5387e --- /dev/null +++ b/src/quaternion/ref/generic/lll/rationals.c @@ -0,0 +1,233 @@ +#include +#include "internal.h" +#include "lll_internals.h" + +void +ibq_init(ibq_t *x) +{ + ibz_init(&((*x)[0])); + ibz_init(&((*x)[1])); + ibz_set(&((*x)[1]), 1); +} + +void +ibq_finalize(ibq_t *x) +{ + ibz_finalize(&((*x)[0])); + ibz_finalize(&((*x)[1])); +} + +void +ibq_mat_4x4_init(ibq_mat_4x4_t *mat) +{ + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibq_init(&(*mat)[i][j]); + } + } +} +void +ibq_mat_4x4_finalize(ibq_mat_4x4_t *mat) +{ + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibq_finalize(&(*mat)[i][j]); + } + } +} + +void +ibq_vec_4_init(ibq_vec_4_t *vec) +{ + for (int i = 0; i < 4; i++) { + ibq_init(&(*vec)[i]); + } +} +void +ibq_vec_4_finalize(ibq_vec_4_t *vec) +{ + for (int i = 0; i < 4; i++) { + ibq_finalize(&(*vec)[i]); + } +} + +void +ibq_mat_4x4_print(const ibq_mat_4x4_t *mat) +{ + printf("matrix: "); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_print(&((*mat)[i][j][0]), 10); + printf("/"); + ibz_print(&((*mat)[i][j][1]), 10); + printf(" "); + } + printf("\n "); + } + printf("\n"); +} + +void +ibq_vec_4_print(const ibq_vec_4_t *vec) +{ + printf("vector: "); + for (int i = 0; i < 4; i++) { + ibz_print(&((*vec)[i][0]), 10); + printf("/"); + ibz_print(&((*vec)[i][1]), 10); + printf(" "); + } + printf("\n\n"); +} + +void +ibq_reduce(ibq_t *x) +{ + ibz_t gcd, r; + ibz_init(&gcd); + ibz_init(&r); + ibz_gcd(&gcd, &((*x)[0]), &((*x)[1])); + ibz_div(&((*x)[0]), &r, &((*x)[0]), &gcd); + assert(ibz_is_zero(&r)); + ibz_div(&((*x)[1]), &r, &((*x)[1]), &gcd); + assert(ibz_is_zero(&r)); + ibz_finalize(&gcd); + ibz_finalize(&r); +} + +void +ibq_add(ibq_t *sum, const ibq_t *a, const ibq_t *b) +{ + ibz_t add, prod; + ibz_init(&add); + ibz_init(&prod); + + ibz_mul(&add, &((*a)[0]), &((*b)[1])); + ibz_mul(&prod, &((*b)[0]), &((*a)[1])); + ibz_add(&((*sum)[0]), &add, &prod); + ibz_mul(&((*sum)[1]), &((*a)[1]), &((*b)[1])); + ibz_finalize(&add); + ibz_finalize(&prod); +} + +void +ibq_neg(ibq_t *neg, const ibq_t *x) +{ + ibz_copy(&((*neg)[1]), &((*x)[1])); + ibz_neg(&((*neg)[0]), &((*x)[0])); +} + +void +ibq_sub(ibq_t *diff, const ibq_t *a, const ibq_t *b) +{ + ibq_t neg; + ibq_init(&neg); + ibq_neg(&neg, b); + ibq_add(diff, a, &neg); + ibq_finalize(&neg); +} + +void +ibq_abs(ibq_t *abs, const ibq_t *x) // once +{ + ibq_t neg; + ibq_init(&neg); + ibq_neg(&neg, x); + if (ibq_cmp(x, &neg) < 0) + ibq_copy(abs, &neg); + else + ibq_copy(abs, x); + ibq_finalize(&neg); +} + +void +ibq_mul(ibq_t *prod, const ibq_t *a, const ibq_t *b) +{ + ibz_mul(&((*prod)[0]), &((*a)[0]), &((*b)[0])); + ibz_mul(&((*prod)[1]), &((*a)[1]), &((*b)[1])); +} + +int +ibq_inv(ibq_t *inv, const ibq_t *x) +{ + int res = !ibq_is_zero(x); + if (res) { + ibz_copy(&((*inv)[0]), &((*x)[0])); + ibz_copy(&((*inv)[1]), &((*x)[1])); + ibz_swap(&((*inv)[1]), &((*inv)[0])); + } + return (res); +} + +int +ibq_cmp(const ibq_t *a, const ibq_t *b) +{ + ibz_t x, y; + ibz_init(&x); + ibz_init(&y); + ibz_copy(&x, &((*a)[0])); + ibz_copy(&y, &((*b)[0])); + ibz_mul(&y, &y, &((*a)[1])); + ibz_mul(&x, &x, &((*b)[1])); + if (ibz_cmp(&((*a)[1]), &ibz_const_zero) > 0) { + ibz_neg(&y, &y); + ibz_neg(&x, &x); + } + if (ibz_cmp(&((*b)[1]), &ibz_const_zero) > 0) { + ibz_neg(&y, &y); + ibz_neg(&x, &x); + } + int res = ibz_cmp(&x, &y); + ibz_finalize(&x); + ibz_finalize(&y); + return (res); +} + +int +ibq_is_zero(const ibq_t *x) +{ + return ibz_is_zero(&((*x)[0])); +} + +int +ibq_is_one(const ibq_t *x) +{ + return (0 == ibz_cmp(&((*x)[0]), &((*x)[1]))); +} + +int +ibq_set(ibq_t *q, const ibz_t *a, const ibz_t *b) +{ + ibz_copy(&((*q)[0]), a); + ibz_copy(&((*q)[1]), b); + return !ibz_is_zero(b); +} + +void +ibq_copy(ibq_t *target, const ibq_t *value) // once +{ + ibz_copy(&((*target)[0]), &((*value)[0])); + ibz_copy(&((*target)[1]), &((*value)[1])); +} + +int +ibq_is_ibz(const ibq_t *q) +{ + ibz_t r; + ibz_init(&r); + ibz_mod(&r, &((*q)[0]), &((*q)[1])); + int res = ibz_is_zero(&r); + ibz_finalize(&r); + return (res); +} + +int +ibq_to_ibz(ibz_t *z, const ibq_t *q) +{ + ibz_t r; + ibz_init(&r); + ibz_div(z, &r, &((*q)[0]), &((*q)[1])); + int res = ibz_is_zero(&r); + ibz_finalize(&r); + return (res); +} diff --git a/src/quaternion/ref/generic/matkermod.c b/src/quaternion/ref/generic/matkermod.c deleted file mode 100644 index f2def12..0000000 --- a/src/quaternion/ref/generic/matkermod.c +++ /dev/null @@ -1,421 +0,0 @@ -#include "internal.h" - -/***************** Howell form **********************/ - -/** @brief Compute u s.t. gcd(u, mod) = 1 and ux = gcd(x, mod) - */ -static int unit(ibz_t *unit, ibz_t *gcd, const ibz_t *x, const ibz_t *mod) { - if (ibz_is_zero(x)) - return 0; - ibz_t stab, nmod, nmod2, thrash, tmp; - ibz_init(&stab); ibz_init(&nmod); ibz_init(&nmod2); ibz_init(&thrash); ibz_init(&tmp); - ibz_xgcd(gcd, unit, &thrash, x, mod); - ibz_div(&nmod, &thrash, mod, gcd); - // Stabilizer(unit, nmod) - ibz_gcd(&stab, unit, &nmod); - ibz_div(&nmod2, &thrash, mod, &stab); - ibz_div(&stab, &thrash, unit, &stab); - // Split(nmod2, stab) - for (int i = ibz_bitsize(&nmod2); i > 0; i >>= 1) { - ibz_mul(&stab, &stab, &stab); - ibz_mod(&stab, &stab, &nmod2); - } - ibz_gcd(&stab, &stab, &nmod2); - ibz_div(&stab, &thrash, &nmod2, &stab); -#ifndef NDEBUG - ibz_mul(&thrash, &stab, &nmod); - ibz_add(&thrash, unit, &thrash); - ibz_gcd(&thrash, &thrash, mod); - ibz_gcd(&tmp, unit, &nmod); - assert(ibz_cmp(&thrash, &tmp) == 0); -#endif - // Finish off - ibz_mul(&stab, &stab, &nmod); - ibz_add(unit, unit, &stab); - ibz_mod(unit, unit, mod); -#ifndef NDEBUG - ibz_gcd(&stab, unit, mod); - assert(ibz_is_one(&stab)); - ibz_mul(&stab, unit, x); - ibz_mod(&stab, &stab, mod); - assert(ibz_cmp(&stab, gcd) == 0); -#endif - ibz_finalize(&stab); ibz_finalize(&nmod); ibz_finalize(&nmod2); ibz_finalize(&thrash); ibz_finalize(&tmp); - return 1; -} - -/** @brief Linear combination of two columns - * - * (mat[][j] | mat[][k]) <- (mat[][j] | mat[][k]) * U (mod) - * - * only update columns between start (included) and end (excluded) - */ -static void gen_elem(int rows, int cols, ibz_t mat[rows][cols], int j, int k, int start, int end, const ibz_mat_2x2_t *U, const ibz_t *mod) -{ - ibz_t tmp1, tmp2; - ibz_init(&tmp1); ibz_init(&tmp2); - for (int i = start; i < end; i++) { - ibz_mul(&tmp1, &mat[i][j], &(*U)[0][0]); - ibz_mul(&tmp2, &mat[i][k], &(*U)[1][0]); - ibz_add(&tmp1, &tmp1, &tmp2); - - ibz_mul(&tmp2, &mat[i][j], &(*U)[0][1]); - ibz_mul(&mat[i][k], &mat[i][k], &(*U)[1][1]); - ibz_add(&mat[i][k], &tmp2, &mat[i][k]); - - ibz_mod(&mat[i][j], &tmp1, mod); - ibz_mod(&mat[i][k], &mat[i][k], mod); - } - ibz_finalize(&tmp1); ibz_finalize(&tmp2); -} - -/** @brief Swap columns j and k of mat - */ -static inline void swap_col(int rows, int cols, ibz_t mat[rows][cols], int j, int k) -{ - ibz_t tmp; - ibz_init(&tmp); - for (int i = 0; i < rows; i++) { - ibz_copy(&tmp, &mat[i][j]); - ibz_copy(&mat[i][j], &mat[i][k]); - ibz_copy(&mat[i][k], &tmp); - } - ibz_finalize(&tmp); -} - -/** @brief Check if column is all zeros - */ -static inline int is_col_zero(int rows, int cols, ibz_t mat[rows][cols], int j) -{ - int is_zero = 1; - for (int i = 0; i < rows; i++) - is_zero &= ibz_is_zero(&mat[i][j]); - return is_zero; -} - -/** Check that mat * trans = howell - */ -static int howell_check_matrices(int rows, int cols, const ibz_t howell[rows][rows+1], const ibz_t trans[rows+1][rows+1], const ibz_t mat[rows][cols], ibz_t *mod) -{ - const int extra = rows + 1 - cols; - ibz_t test[rows][rows+1], res[rows][rows+1]; - ibz_mat_init(rows, rows+1, test); - ibz_mat_init(rows, rows+1, res); - - // copy mat to the right of test - for (int i = 0; i < rows; i++) - for (int j = 0; j < cols; j++) - ibz_mod(&test[i][j+extra], &mat[i][j], mod); - - ibz_mat_mulmod(rows, rows+1, rows+1, res, test, trans, mod); - - int ok = 1; - for (int i = 0; i < rows; i++) - for (int j = 0; j < rows+1; j++) - ok &= ibz_cmp(&howell[i][j], &res[i][j]) == 0; - - ibz_mat_finalize(rows, rows+1, res); - ibz_mat_finalize(rows, rows+1, test); - - return ok; -} - -void ibz_mat_mulmod(int from, int through, int to, ibz_t res[from][to], const ibz_t A[from][through], const ibz_t B[through][to], const ibz_t *mod) -{ - ibz_t tmp; - ibz_init(&tmp); - for (int i = 0; i < from; i++) { - for (int j = 0; j < to; j++) { - ibz_set(&res[i][j], 0); - for (int k = 0; k < through; k++) { - ibz_mul(&tmp, &A[i][k], &B[k][j]); - ibz_add(&res[i][j], &res[i][j], &tmp); - ibz_mod(&res[i][j], &res[i][j], mod); - } - } - } - ibz_finalize(&tmp); -} - -int ibz_mat_howell(int rows, int cols, ibz_t howell[rows][rows+1], ibz_t trans[rows+1][rows+1], const ibz_t mat[rows][cols], ibz_t *mod) { - assert(cols <= rows); - const int extra = rows + 1 - cols; - - ibz_mat_2x2_t U; - ibz_t gcd, u, q; - ibz_mat_2x2_init(&U); - ibz_init(&gcd); ibz_init(&u); ibz_init(&q); - - // copy mat to the right of howell - for (int i = 0; i < rows; i++) { - for (int j = cols; j < rows+1; j++) - ibz_set(&howell[i][j-cols], 0); - for (int j = 0; j < cols; j++) - ibz_mod(&howell[i][j+extra], &mat[i][j], mod); - } - // initialize trans to identity - if (trans) { - for (int i = 0; i < rows+1; i++) { - for (int j = 0; j < rows+1; j++) - if (j != i) ibz_set(&trans[i][j], 0); - ibz_set(&trans[i][i], 1); - } - assert(howell_check_matrices(rows, cols, howell, trans, mat, mod)); - } - - // Put in upper triangular form - for (int i = rows-1; i >= extra-1; i--) { - for (int j = extra; j <= i; j++) { - if (ibz_is_zero(&howell[i][j])) - continue; - ibz_xgcd_ann(&gcd, &U[0][0], &U[1][0], &U[0][1], &U[1][1], &howell[i][j], &howell[i][i+1]); - gen_elem(rows, rows+1, howell, j, i+1, 0, i, &U, mod); - ibz_set(&howell[i][j], 0); - ibz_copy(&howell[i][i+1], &gcd); - // - if (trans) { - gen_elem(rows+1, rows+1, trans, j, i+1, 0, rows+1, &U, mod); - assert(howell_check_matrices(rows, cols, howell, trans, mat, mod)); - } - } - } - - // Put in reduced Howell form - for (int i = rows-1; i >= 0; i--) { - /* normalize diagonal coefficient */ - if (unit(&u, &gcd, &howell[i][i+1], mod)) { - for (int k = 0; k < i; k++) { - ibz_mul(&howell[k][i+1], &howell[k][i+1], &u); - ibz_mod(&howell[k][i+1], &howell[k][i+1], mod); - } - ibz_copy(&howell[i][i+1], &gcd); - // - if (trans) { - for (int k = 0; k < rows+1; k++) { - ibz_mul(&trans[k][i+1], &trans[k][i+1], &u); - ibz_mod(&trans[k][i+1], &trans[k][i+1], mod); - } - assert(howell_check_matrices(rows, cols, howell, trans, mat, mod)); - } - } - - /* reduce right of the diagonal */ - ibz_t *pivot = &howell[i][i+1]; - if (!ibz_is_zero(pivot)) { - for (int j = i+2; j < rows+1; j++) { - assert(ibz_cmp(pivot, &ibz_const_zero) > 0); - ibz_div(&q, &howell[i][j], &howell[i][j], pivot); - // howell[][j] -= q howell[][i+1] - for (int k = 0; k < i; k++) { - ibz_mul(&u, &q, &howell[k][i+1]); - ibz_sub(&howell[k][j], &howell[k][j], &u); - ibz_mod(&howell[k][j], &howell[k][j], mod); - } - // trans[][j] -= q trans[][i+1] - if (trans) { - for (int k = 0; k < rows+1; k++) { - ibz_mul(&u, &q, &trans[k][i+1]); - ibz_sub(&trans[k][j], &trans[k][j], &u); - ibz_mod(&trans[k][j], &trans[k][j], mod); - } - assert(howell_check_matrices(rows, cols, howell, trans, mat, mod)); - } - } - } - - /* ensure Howell property */ - if (i > 0) { - ibz_gcd(&gcd, pivot, mod); - if (!ibz_is_one(&gcd)) { - // Ann(pivot) - ibz_div(&u, &gcd, mod, &gcd); - for (int k = 0; k < rows; k++) { - if (k < i) { - ibz_mul(&howell[k][0], &howell[k][i+1], &u); - ibz_mod(&howell[k][0], &howell[k][0], mod); - } else { - ibz_set(&howell[k][0], 0); - } - } - // trans[][0] += u trans[][i+1] - if (trans) { - for (int k = 0; k < rows+1; k++) { - ibz_mul(&q, &u, &trans[k][i+1]); - ibz_add(&trans[k][0], &trans[k][0], &q); - ibz_mod(&trans[k][0], &trans[k][0], mod); - } - assert(howell_check_matrices(rows, cols, howell, trans, mat, mod)); - } - - for (int i2 = i-1; i2 >= 0; i2--) { - if (ibz_is_zero(&howell[i2][0])) - continue; - if (ibz_is_zero(&howell[i2][i2+1])) { - swap_col(rows, rows+1, howell, 0, i2+1); - if (trans) { - swap_col(rows+1, rows+1, trans, 0, i2+1); - assert(howell_check_matrices(rows, cols, howell, trans, mat, mod)); - } - continue; - } - ibz_xgcd_ann(&gcd, &U[0][0], &U[1][0], &U[0][1], &U[1][1], &howell[i2][0], &howell[i2][i2+1]); - gen_elem(rows, rows+1, howell, 0, i2+1, 0, i2, &U, mod); - ibz_set(&howell[i2][0], 0); - ibz_copy(&howell[i2][i2+1], &gcd); - // - if (trans) { - gen_elem(rows, rows+1, trans, 0, i2+1, 0, rows+1, &U, mod); - assert(howell_check_matrices(rows, cols, howell, trans, mat, mod)); - } - } - } - } - } - - /* put zero columns first */ - int read, write; - for (read = rows, write = rows; read >= 1; read--) { - if (!is_col_zero(rows, rows+1, howell, read)) { - if (read < write) { - swap_col(rows, rows+1, howell, read, write); - if (trans) { - swap_col(rows+1, rows+1, trans, read, write); - assert(howell_check_matrices(rows, cols, howell, trans, mat, mod)); - } - } - write--; - } - } - - // Finalize - ibz_mat_2x2_finalize(&U); - ibz_finalize(&gcd); ibz_finalize(&u); ibz_finalize(&q); - - return write + 1; -} - -void ibz_mat_right_ker_mod(int rows, int cols, ibz_t ker[cols][cols], const ibz_t mat[rows][cols], ibz_t *mod) -{ - assert(cols <= rows); - const int extra = rows + 1 - cols; - - ibz_t tmp; - ibz_mat_2x2_t U; - ibz_t howell[rows][rows+1], trans[rows+1][rows+1], preker[rows+1][rows+1], near_ker[cols][rows+1]; - - ibz_init(&tmp); - ibz_mat_2x2_init(&U); - ibz_mat_init(rows, rows+1, howell); - ibz_mat_init(rows+1, rows+1, trans); - ibz_mat_init(rows+1, rows+1, preker); - ibz_mat_init(cols, rows+1, near_ker); - - // Compute Howell form of mat - int zeros = ibz_mat_howell(rows, cols, howell, trans, mat, mod); - - // Compute right kernel of Howell form - for (int j = rows, i = rows-1; j >= 0; j--) { - while (i >= 0 && ibz_is_zero(&howell[i][j])) - i--; - if (i < 0) { - ibz_set(&preker[j][j], 1); - continue; - } - ibz_t *pivot = &howell[i][j]; - - // Ann(pivot) - ibz_gcd(&tmp, pivot, mod); - if (!ibz_is_one(&tmp)) - ibz_div(&preker[j][j], &tmp, mod, &tmp); - - for (int j2 = j+1; j2 <= rows; j2++) { - // howell[i][j+1..rows] * preker[j+1..rows][j2] - for (int k = j+1; k <= rows; k++) { - ibz_mul(&tmp, &howell[i][k], &preker[k][j2]); - ibz_add(&preker[j][j2], &preker[j][j2], &tmp); - } - ibz_mod(&preker[j][j2], &preker[j][j2], mod); - // - ibz_div(&preker[j][j2], &tmp, &preker[j][j2], pivot); - assert(ibz_is_zero(&tmp)); - if (!ibz_is_zero(&preker[j][j2])) - ibz_sub(&preker[j][j2], mod, &preker[j][j2]); - } - } - -#ifndef NDEBUG - // Check that preker is indeed a kernel of howell - ibz_t acc; - ibz_init(&acc); - for (int i = 0; i < rows; i++) { - for (int j = 0; j < rows+1; j++) { - ibz_set(&acc, 0); - for (int k = 0; k < rows+1; k++) { - ibz_mul(&tmp, &howell[i][k], &preker[k][j]); - ibz_add(&acc, &acc, &tmp); - } - ibz_mod(&acc, &acc, mod); - assert(ibz_is_zero(&acc)); - } - } - ibz_finalize(&acc); -#endif - - // Apply (bottom part of) transition matrix to computed kernel - for (int i = 0; i < cols; i++) { - for (int j = 0; j < rows+1; j++) { - for (int k = 0; k < rows+1; k++) { - ibz_mul(&tmp, &trans[i+extra][k], &preker[k][j]); - ibz_add(&near_ker[i][j], &near_ker[i][j], &tmp); - } - ibz_mod(&near_ker[i][j], &near_ker[i][j], mod); - } - } - - // Move zero columns to the start - int read, write; - for (read = rows, write = rows; read >= 0; read--) { - if (!is_col_zero(cols, rows+1, near_ker, read)) { - if (read < write) { - swap_col(cols, rows+1, near_ker, read, write); - } - write--; - } - } - - // Put in upper triangular form - const int diag_shift = rows - cols + 1; // i-th diagonal is at (i+diag_shift) column - for (int i = cols-1; i >= 0; i--) { - for (int j = write+1; j < i+diag_shift; j++) { - if (ibz_is_zero(&near_ker[i][j])) - continue; - ibz_xgcd_ann(&tmp, &U[0][0], &U[1][0], &U[0][1], &U[1][1], &near_ker[i][j], &near_ker[i][i+diag_shift]); - gen_elem(cols, rows+1, near_ker, j, i+diag_shift, 0, i+1, &U, mod); - ibz_set(&howell[i][j], 0); - ibz_copy(&howell[i][i+diag_shift], &tmp); - } - } - -#ifndef NDEBUG - // Check that ker is indeed a kernel of mat - ibz_t check[rows][rows+1]; - ibz_mat_init(rows, rows+1, check); - ibz_mat_mulmod(rows, cols, rows+1, check, mat, near_ker, mod); - for (int i = 0; i < rows; i++) - for (int j = 0; j < rows+1; j++) - assert(ibz_is_zero(&check[i][j])); - ibz_mat_finalize(rows, rows+1, check); -#endif - - // Copy result - for (int i = 0; i < cols; i++) - for (int j = 0; j < cols; j++) - ibz_copy(&ker[i][j], &near_ker[i][j+rows-cols+1]); - // Finalize - ibz_finalize(&tmp); - ibz_mat_2x2_finalize(&U); - ibz_mat_finalize(rows, rows+1, howell); - ibz_mat_finalize(rows+1, rows+1, trans); - ibz_mat_finalize(rows+1, rows+1, preker); - ibz_mat_finalize(cols, rows+1, near_ker); -} diff --git a/src/quaternion/ref/generic/normeq.c b/src/quaternion/ref/generic/normeq.c new file mode 100644 index 0000000..8c133dd --- /dev/null +++ b/src/quaternion/ref/generic/normeq.c @@ -0,0 +1,369 @@ +#include +#include "internal.h" + +/** @file + * + * @authors Antonin Leroux + * + * @brief Functions related to norm equation solving or special extremal orders + */ + +void +quat_lattice_O0_set(quat_lattice_t *O0) +{ + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(O0->basis[i][j]), 0); + } + } + ibz_set(&(O0->denom), 2); + ibz_set(&(O0->basis[0][0]), 2); + ibz_set(&(O0->basis[1][1]), 2); + ibz_set(&(O0->basis[2][2]), 1); + ibz_set(&(O0->basis[1][2]), 1); + ibz_set(&(O0->basis[3][3]), 1); + ibz_set(&(O0->basis[0][3]), 1); +} + +void +quat_lattice_O0_set_extremal(quat_p_extremal_maximal_order_t *O0) +{ + ibz_set(&O0->z.coord[1], 1); + ibz_set(&O0->t.coord[2], 1); + ibz_set(&O0->z.denom, 1); + ibz_set(&O0->t.denom, 1); + O0->q = 1; + quat_lattice_O0_set(&(O0->order)); +} + +void +quat_order_elem_create(quat_alg_elem_t *elem, + const quat_p_extremal_maximal_order_t *order, + const ibz_vec_4_t *coeffs, + const quat_alg_t *Bpoo) +{ + + // var dec + quat_alg_elem_t quat_temp; + + // var init + quat_alg_elem_init(&quat_temp); + + // elem = x + quat_alg_scalar(elem, &(*coeffs)[0], &ibz_const_one); + + // quat_temp = i*y + quat_alg_scalar(&quat_temp, &((*coeffs)[1]), &ibz_const_one); + quat_alg_mul(&quat_temp, &order->z, &quat_temp, Bpoo); + + // elem = x + i*y + quat_alg_add(elem, elem, &quat_temp); + + // quat_temp = z * j + quat_alg_scalar(&quat_temp, &(*coeffs)[2], &ibz_const_one); + quat_alg_mul(&quat_temp, &order->t, &quat_temp, Bpoo); + + // elem = x + i* + z*j + quat_alg_add(elem, elem, &quat_temp); + + // quat_temp = t * j * i + quat_alg_scalar(&quat_temp, &(*coeffs)[3], &ibz_const_one); + quat_alg_mul(&quat_temp, &order->t, &quat_temp, Bpoo); + quat_alg_mul(&quat_temp, &quat_temp, &order->z, Bpoo); + + // elem = x + i*y + j*z + j*i*t + quat_alg_add(elem, elem, &quat_temp); + + quat_alg_elem_finalize(&quat_temp); +} + +int +quat_represent_integer(quat_alg_elem_t *gamma, + const ibz_t *n_gamma, + int non_diag, + const quat_represent_integer_params_t *params) +{ + + if (ibz_is_even(n_gamma)) { + return 0; + } + // var dec + int found; + ibz_t cornacchia_target; + ibz_t adjusted_n_gamma, q; + ibz_t bound, sq_bound, temp; + ibz_t test; + ibz_vec_4_t coeffs; // coeffs = [x,y,z,t] + quat_alg_elem_t quat_temp; + + if (non_diag) + assert(params->order->q % 4 == 1); + + // var init + found = 0; + ibz_init(&bound); + ibz_init(&test); + ibz_init(&temp); + ibz_init(&q); + ibz_init(&sq_bound); + ibz_vec_4_init(&coeffs); + quat_alg_elem_init(&quat_temp); + ibz_init(&adjusted_n_gamma); + ibz_init(&cornacchia_target); + + ibz_set(&q, params->order->q); + + // this could be removed in the current state + int standard_order = (params->order->q == 1); + + // adjusting the norm of gamma (multiplying by 4 to find a solution in an order of odd level) + if (non_diag || standard_order) { + ibz_mul(&adjusted_n_gamma, n_gamma, &ibz_const_two); + ibz_mul(&adjusted_n_gamma, &adjusted_n_gamma, &ibz_const_two); + } else { + ibz_copy(&adjusted_n_gamma, n_gamma); + } + // computation of the first bound = sqrt (adjust_n_gamma / p - q) + ibz_div(&sq_bound, &bound, &adjusted_n_gamma, &((params->algebra)->p)); + ibz_set(&temp, params->order->q); + ibz_sub(&sq_bound, &sq_bound, &temp); + ibz_sqrt_floor(&bound, &sq_bound); + + // the size of the search space is roughly n_gamma / (p√q) + ibz_t counter; + ibz_init(&counter); + ibz_mul(&temp, &temp, &((params->algebra)->p)); + ibz_mul(&temp, &temp, &((params->algebra)->p)); + ibz_sqrt_floor(&temp, &temp); + ibz_div(&counter, &temp, &adjusted_n_gamma, &temp); + + // entering the main loop + while (!found && ibz_cmp(&counter, &ibz_const_zero) != 0) { + // decreasing the counter + ibz_sub(&counter, &counter, &ibz_const_one); + + // we start by sampling the first coordinate + ibz_rand_interval(&coeffs[2], &ibz_const_one, &bound); + + // then, we sample the second coordinate + // computing the second bound in temp as sqrt( (adjust_n_gamma - p*coeffs[2]²)/qp ) + ibz_mul(&cornacchia_target, &coeffs[2], &coeffs[2]); + ibz_mul(&temp, &cornacchia_target, &(params->algebra->p)); + ibz_sub(&temp, &adjusted_n_gamma, &temp); + ibz_mul(&sq_bound, &q, &(params->algebra->p)); + ibz_div(&temp, &sq_bound, &temp, &sq_bound); + ibz_sqrt_floor(&temp, &temp); + + if (ibz_cmp(&temp, &ibz_const_zero) == 0) { + continue; + } + // sampling the second value + ibz_rand_interval(&coeffs[3], &ibz_const_one, &temp); + + // compute cornacchia_target = n_gamma - p * (z² + q*t²) + ibz_mul(&temp, &coeffs[3], &coeffs[3]); + ibz_mul(&temp, &q, &temp); + ibz_add(&cornacchia_target, &cornacchia_target, &temp); + ibz_mul(&cornacchia_target, &cornacchia_target, &((params->algebra)->p)); + ibz_sub(&cornacchia_target, &adjusted_n_gamma, &cornacchia_target); + assert(ibz_cmp(&cornacchia_target, &ibz_const_zero) > 0); + + // applying cornacchia + if (ibz_probab_prime(&cornacchia_target, params->primality_test_iterations)) + found = ibz_cornacchia_prime(&(coeffs[0]), &(coeffs[1]), &q, &cornacchia_target); + else + found = 0; + + if (found && non_diag && standard_order) { + // check that we can divide by two at least once + // the treatmeat depends if the basis contains (1+j)/2 or (1+k)/2 + // we must have x = t mod 2 and y = z mod 2 + // if q=1 we can simply swap x and y + if (ibz_is_odd(&coeffs[0]) != ibz_is_odd(&coeffs[3])) { + ibz_swap(&coeffs[1], &coeffs[0]); + } + // we further check that (x-t)/2 = 1 mod 2 and (y-z)/2 = 1 mod 2 to ensure that the + // resulting endomorphism will behave well for dim 2 computations + found = found && ((ibz_get(&coeffs[0]) - ibz_get(&coeffs[3])) % 4 == 2) && + ((ibz_get(&coeffs[1]) - ibz_get(&coeffs[2])) % 4 == 2); + } + if (found) { + +#ifndef NDEBUG + ibz_set(&temp, (params->order->q)); + ibz_mul(&temp, &temp, &(coeffs[1])); + ibz_mul(&temp, &temp, &(coeffs[1])); + ibz_mul(&test, &(coeffs[0]), &(coeffs[0])); + ibz_add(&temp, &temp, &test); + assert(0 == ibz_cmp(&temp, &cornacchia_target)); + + ibz_mul(&cornacchia_target, &(coeffs[3]), &(coeffs[3])); + ibz_mul(&cornacchia_target, &cornacchia_target, &(params->algebra->p)); + ibz_mul(&temp, &(coeffs[1]), &(coeffs[1])); + ibz_add(&cornacchia_target, &cornacchia_target, &temp); + ibz_set(&temp, (params->order->q)); + ibz_mul(&cornacchia_target, &cornacchia_target, &temp); + ibz_mul(&temp, &(coeffs[0]), &coeffs[0]); + ibz_add(&cornacchia_target, &cornacchia_target, &temp); + ibz_mul(&temp, &(coeffs[2]), &coeffs[2]); + ibz_mul(&temp, &temp, &(params->algebra->p)); + ibz_add(&cornacchia_target, &cornacchia_target, &temp); + assert(0 == ibz_cmp(&cornacchia_target, &adjusted_n_gamma)); +#endif + // translate x,y,z,t into the quaternion element gamma + quat_order_elem_create(gamma, (params->order), &coeffs, (params->algebra)); +#ifndef NDEBUG + quat_alg_norm(&temp, &(coeffs[0]), gamma, (params->algebra)); + assert(ibz_is_one(&(coeffs[0]))); + assert(0 == ibz_cmp(&temp, &adjusted_n_gamma)); + assert(quat_lattice_contains(NULL, &((params->order)->order), gamma)); +#endif + // making gamma primitive + // coeffs contains the coefficients of primitivized gamma in the basis of order + quat_alg_make_primitive(&coeffs, &temp, gamma, &((params->order)->order)); + + if (non_diag || standard_order) + found = (ibz_cmp(&temp, &ibz_const_two) == 0); + else + found = (ibz_cmp(&temp, &ibz_const_one) == 0); + } + } + + if (found) { + // new gamma + ibz_mat_4x4_eval(&coeffs, &(((params->order)->order).basis), &coeffs); + ibz_copy(&gamma->coord[0], &coeffs[0]); + ibz_copy(&gamma->coord[1], &coeffs[1]); + ibz_copy(&gamma->coord[2], &coeffs[2]); + ibz_copy(&gamma->coord[3], &coeffs[3]); + ibz_copy(&gamma->denom, &(((params->order)->order).denom)); + } + // var finalize + ibz_finalize(&counter); + ibz_finalize(&bound); + ibz_finalize(&temp); + ibz_finalize(&sq_bound); + ibz_vec_4_finalize(&coeffs); + quat_alg_elem_finalize(&quat_temp); + ibz_finalize(&adjusted_n_gamma); + ibz_finalize(&cornacchia_target); + ibz_finalize(&q); + ibz_finalize(&test); + + return found; +} + +int +quat_sampling_random_ideal_O0_given_norm(quat_left_ideal_t *lideal, + const ibz_t *norm, + int is_prime, + const quat_represent_integer_params_t *params, + const ibz_t *prime_cofactor) +{ + + ibz_t n_temp, norm_d; + ibz_t disc; + quat_alg_elem_t gen, gen_rerand; + int found = 0; + ibz_init(&n_temp); + ibz_init(&norm_d); + ibz_init(&disc); + quat_alg_elem_init(&gen); + quat_alg_elem_init(&gen_rerand); + + // when the norm is prime we can be quite efficient + // by avoiding to run represent integer + // the first step is to generate one ideal of the correct norm + if (is_prime) { + + // we find a quaternion element of norm divisible by norm + while (!found) { + // generating a trace-zero element at random + ibz_set(&gen.coord[0], 0); + ibz_sub(&n_temp, norm, &ibz_const_one); + for (int i = 1; i < 4; i++) + ibz_rand_interval(&gen.coord[i], &ibz_const_zero, &n_temp); + + // first, we compute the norm of the gen + quat_alg_norm(&n_temp, &norm_d, &gen, (params->algebra)); + assert(ibz_is_one(&norm_d)); + + // and finally the negation mod norm + ibz_neg(&disc, &n_temp); + ibz_mod(&disc, &disc, norm); + // now we check that -n is a square mod norm + // and if the square root exists we compute it + found = ibz_sqrt_mod_p(&gen.coord[0], &disc, norm); + found = found && !quat_alg_elem_is_zero(&gen); + } + } else { + assert(prime_cofactor != NULL); + // if it is not prime or we don't know if it is prime, we may just use represent integer + // and use a precomputed prime as cofactor + assert(!ibz_is_zero(norm)); + ibz_mul(&n_temp, prime_cofactor, norm); + found = quat_represent_integer(&gen, &n_temp, 0, params); + found = found && !quat_alg_elem_is_zero(&gen); + } +#ifndef NDEBUG + if (found) { + // first, we compute the norm of the gen + quat_alg_norm(&n_temp, &norm_d, &gen, (params->algebra)); + assert(ibz_is_one(&norm_d)); + ibz_mod(&n_temp, &n_temp, norm); + assert(ibz_cmp(&n_temp, &ibz_const_zero) == 0); + } +#endif + + // now we just have to rerandomize the class of the ideal generated by gen + found = 0; + while (!found) { + for (int i = 0; i < 4; i++) { + ibz_rand_interval(&gen_rerand.coord[i], &ibz_const_one, norm); + } + quat_alg_norm(&n_temp, &norm_d, &gen_rerand, (params->algebra)); + assert(ibz_is_one(&norm_d)); + ibz_gcd(&disc, &n_temp, norm); + found = ibz_is_one(&disc); + found = found && !quat_alg_elem_is_zero(&gen_rerand); + } + + quat_alg_mul(&gen, &gen, &gen_rerand, (params->algebra)); + // in both cases, whether norm is prime or not prime, + // gen is not divisible by any integer factor of the target norm + // therefore the call below will yield an ideal of the correct norm + quat_lideal_create(lideal, &gen, norm, &((params->order)->order), (params->algebra)); + assert(ibz_cmp(norm, &(lideal->norm)) == 0); + + ibz_finalize(&n_temp); + quat_alg_elem_finalize(&gen); + quat_alg_elem_finalize(&gen_rerand); + ibz_finalize(&norm_d); + ibz_finalize(&disc); + return (found); +} + +void +quat_change_to_O0_basis(ibz_vec_4_t *vec, const quat_alg_elem_t *el) +{ + ibz_t tmp; + ibz_init(&tmp); + ibz_copy(&(*vec)[2], &el->coord[2]); + ibz_add(&(*vec)[2], &(*vec)[2], &(*vec)[2]); // double (not optimal if el->denom is even...) + ibz_copy(&(*vec)[3], &el->coord[3]); // double (not optimal if el->denom is even...) + ibz_add(&(*vec)[3], &(*vec)[3], &(*vec)[3]); + ibz_sub(&(*vec)[0], &el->coord[0], &el->coord[3]); + ibz_sub(&(*vec)[1], &el->coord[1], &el->coord[2]); + + assert(ibz_divides(&(*vec)[0], &el->denom)); + assert(ibz_divides(&(*vec)[1], &el->denom)); + assert(ibz_divides(&(*vec)[2], &el->denom)); + assert(ibz_divides(&(*vec)[3], &el->denom)); + + ibz_div(&(*vec)[0], &tmp, &(*vec)[0], &el->denom); + ibz_div(&(*vec)[1], &tmp, &(*vec)[1], &el->denom); + ibz_div(&(*vec)[2], &tmp, &(*vec)[2], &el->denom); + ibz_div(&(*vec)[3], &tmp, &(*vec)[3], &el->denom); + + ibz_finalize(&tmp); +} diff --git a/src/quaternion/ref/generic/printer.c b/src/quaternion/ref/generic/printer.c index da0f86e..6d6a3ca 100644 --- a/src/quaternion/ref/generic/printer.c +++ b/src/quaternion/ref/generic/printer.c @@ -1,158 +1,132 @@ -#include +#include +#include "internal.h" -void ibz_mat_2x2_print(const ibz_mat_2x2_t *mat){ - ibz_printf("matrix: "); - for(int i = 0; i < 2; i++){ - for(int j = 0; j < 2; j++){ - ibz_printf("%Zd ", &((*mat)[i][j])); +void +ibz_mat_2x2_print(const ibz_mat_2x2_t *mat) +{ + printf("matrix: "); + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + ibz_print(&((*mat)[i][j]), 10); + printf(" "); } - ibz_printf("\n "); + printf("\n "); } - ibz_printf("\n"); + printf("\n"); } -void ibz_mat_4x4_print(const ibz_mat_4x4_t *mat){ - ibz_printf("matrix: "); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_printf("%Zd ", &((*mat)[i][j])); +void +ibz_mat_4x4_print(const ibz_mat_4x4_t *mat) +{ + printf("matrix: "); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_print(&((*mat)[i][j]), 10); + printf(" "); } - ibz_printf("\n "); + printf("\n "); } - ibz_printf("\n"); + printf("\n"); } -void ibz_mat_4x5_print(const ibz_mat_4x5_t *mat){ - ibz_printf("matrix: "); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 5; j++){ - ibz_printf("%Zd ", &((*mat)[i][j])); +void +ibz_vec_2_print(const ibz_vec_2_t *vec) +{ + printf("vector: "); + for (int i = 0; i < 2; i++) { + ibz_print(&((*vec)[i]), 10); + printf(" "); + } + printf("\n\n"); +} + +void +ibz_vec_4_print(const ibz_vec_4_t *vec) +{ + printf("vector: "); + for (int i = 0; i < 4; i++) { + ibz_print(&((*vec)[i]), 10); + printf(" "); + } + printf("\n\n"); +} + +void +quat_lattice_print(const quat_lattice_t *lat) +{ + printf("lattice\n"); + printf("denominator: "); + ibz_print(&(lat->denom), 10); + printf("\n"); + printf("basis: "); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_print(&((lat->basis)[i][j]), 10); + printf(" "); } - ibz_printf("\n "); + printf("\n "); } - ibz_printf("\n"); + printf("\n"); } -void ibz_mat_4x8_print(const ibz_mat_4x8_t *mat){ - ibz_printf("matrix: "); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 8; j++){ - ibz_printf("%Zd ", &((*mat)[i][j])); +void +quat_alg_print(const quat_alg_t *alg) +{ + printf("quaternion algebra ramified at "); + ibz_print(&(alg->p), 10); + printf(" and infinity\n\n"); +} + +void +quat_alg_elem_print(const quat_alg_elem_t *elem) +{ + printf("denominator: "); + ibz_print(&(elem->denom), 10); + printf("\n"); + printf("coordinates: "); + for (int i = 0; i < 4; i++) { + ibz_print(&((elem->coord)[i]), 10); + printf(" "); + } + printf("\n\n"); +} + +void +quat_left_ideal_print(const quat_left_ideal_t *lideal) +{ + printf("left ideal\n"); + printf("norm: "); + ibz_print(&(lideal->norm), 10); + printf("\n"); + printf("denominator: "); + ibz_print(&(lideal->lattice.denom), 10); + printf("\n"); + printf("basis: "); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_print(&((lideal->lattice.basis)[i][j]), 10); + printf(" "); } - ibz_printf("\n "); - } - ibz_printf("\n"); -} - -void ibz_mat_print(int rows, int cols, const ibz_t mat[rows][cols]){ - ibz_printf("matrix: "); - for(int i = 0; i < rows; i++){ - for(int j = 0; j < cols; j++){ - ibz_printf("%Zd ", &mat[i][j]); + if (i != 3) { + printf("\n "); + } else { + printf("\n"); } - ibz_printf("\n "); } - ibz_printf("\n"); -} - - -void ibz_vec_2_print(const ibz_vec_2_t *vec){ - ibz_printf("vector: "); - for(int i = 0; i < 2; i++){ - ibz_printf("%Zd ", &((*vec)[i])); - } - ibz_printf("\n\n"); -} - -void ibz_vec_4_print(const ibz_vec_4_t *vec){ - ibz_printf("vector: "); - for(int i = 0; i < 4; i++){ - ibz_printf("%Zd ", &((*vec)[i])); - } - ibz_printf("\n\n"); -} -void ibz_vec_5_print(const ibz_vec_5_t *vec){ - ibz_printf("vector: "); - for(int i = 0; i < 5; i++){ - ibz_printf("%Zd ", &((*vec)[i])); - } - ibz_printf("\n\n"); -} - - -void quat_lattice_print(const quat_lattice_t *lat){ - ibz_printf("lattice\n"); - ibz_printf("denominator: %Zd\n",(lat->denom)); - ibz_printf("basis: "); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_printf("%Zd ", &((lat->basis)[i][j])); + if ((lideal->parent_order) != NULL) { + printf("parent order denominator: "); + ibz_print(&(lideal->parent_order->denom), 10); + printf("\n"); + printf("parent order basis: "); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_print(&((lideal->parent_order->basis)[i][j]), 10); + printf(" "); } - ibz_printf("\n "); - } - ibz_printf("\n"); -} - -void quat_alg_print(const quat_alg_t *alg){ - ibz_printf("quaternion algebra ramified at %Zd and infinity\n\n", &(alg->p)); -} - -void quat_alg_elem_print(const quat_alg_elem_t *elem){ - ibz_printf("denominator: %Zd\n",(elem->denom)); - ibz_printf("coordinates: "); - for(int i = 0; i < 4; i++){ - ibz_printf("%Zd ",&((elem->coord)[i])); - } - ibz_printf("\n\n"); -} - -void quat_alg_coord_print(const quat_alg_coord_t *coord){ - ibz_printf("coordinates: "); - for(int i = 0; i < 4; i++){ - ibz_printf("%Zd ",&((*coord)[i])); - } - ibz_printf("\n\n"); -} - -void quat_order_print(const quat_order_t *order){ - ibz_printf("order\n"); - ibz_printf("denominator: %Zd\n",&(order->denom)); - ibz_printf("basis: "); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_printf("%Zd ", &((order->basis)[i][j])); - } - ibz_printf("\n "); - } - ibz_printf("\n"); -} - -void quat_left_ideal_print(const quat_left_ideal_t *lideal){ - ibz_printf("left ideal\n"); - ibz_printf("norm : %Zd\n",&(lideal->norm)); - ibz_printf("denominator: %Zd\n",&(lideal->lattice.denom)); - ibz_printf("basis: "); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_printf("%Zd ", &((lideal->lattice.basis)[i][j])); - } - if(i!=3){ - ibz_printf("\n "); - } else { - ibz_printf("\n"); - } - } - if((lideal->parent_order )!= NULL){ - ibz_printf("parent order denominator: %Zd\n",&(lideal->parent_order->denom)); - ibz_printf("parent order basis: "); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_printf("%Zd ", &((lideal->parent_order->basis)[i][j])); - } - ibz_printf("\n "); + printf("\n "); } } else { - ibz_printf("Parent order not given!\n"); + printf("Parent order not given!\n"); } - ibz_printf("\n"); + printf("\n"); } diff --git a/src/quaternion/ref/generic/test/CMakeLists.txt b/src/quaternion/ref/generic/test/CMakeLists.txt index 6598004..35dc5e1 100644 --- a/src/quaternion/ref/generic/test/CMakeLists.txt +++ b/src/quaternion/ref/generic/test/CMakeLists.txt @@ -1,21 +1,40 @@ -set(SOURCE_FILES_QUATERNION_GENERIC_REF_TESTS +set(SOURCE_FILES_QUATERNION_GENERIC_REF + intbig.c algebra.c ideal.c dim4.c dim2.c integers.c lattice.c + lat_ball.c finit.c - matkermod.c + mini-gmp.c + normeq.c randomized.c - test_quaternions.c ) -add_executable(sqisign_test_quaternion ${SOURCE_FILES_QUATERNION_GENERIC_REF_TESTS}) -target_link_libraries(sqisign_test_quaternion ${LIB_INTBIG} ${LIB_QUATERNION} ${GMP} sqisign_common_sys ) -target_include_directories(sqisign_test_quaternion PRIVATE ${INC_INTBIG} ${INC_COMMON} ${INC_QUATERNION} ${INC_PUBLIC} ) + +if (NOT GMP_LIBRARY STREQUAL "MINI") + list(APPEND SOURCE_FILES_QUATERNION_GENERIC_REF ${PROJECT_SOURCE_DIR}/src/mini-gmp/mini-gmp-extra.c) +endif() + +set(SOURCE_FILES_QUATERNION_GENERIC_REF_TESTS + ${SOURCE_FILES_QUATERNION_GENERIC_REF} + ../hnf/hnf_tests.c + ../lll/lll_verification.c + ../lll/lll_tests.c +) +add_executable(sqisign_test_quaternion ${SOURCE_FILES_QUATERNION_GENERIC_REF_TESTS} test_quaternions.c) +target_link_libraries(sqisign_test_quaternion ${LIB_QUATERNION} ${GMP} sqisign_common_sys) +target_include_directories(sqisign_test_quaternion PRIVATE ../internal_quaternion_headers ${INC_COMMON} ${INC_QUATERNION} ${INC_PUBLIC} ${PROJECT_SOURCE_DIR}/src/mini-gmp) + +add_executable(sqisign_bm_quaternion ${SOURCE_FILES_QUATERNION_GENERIC_REF_TESTS} ../lll/lll_benchmarks.c) +target_link_libraries(sqisign_bm_quaternion ${LIB_QUATERNION} ${GMP} sqisign_common_test) +target_include_directories(sqisign_bm_quaternion PRIVATE ../internal_quaternion_headers ${INC_COMMON} ${INC_QUATERNION} ${INC_PUBLIC} ${PROJECT_SOURCE_DIR}/src/mini-gmp) # MSAN and GMP lead to false positives, see # https://gmplib.org/list-archives/gmp-bugs/2019-March/004529.html if(NOT CMAKE_BUILD_TYPE STREQUAL "MSAN") add_test(sqisign_test_quaternion sqisign_test_quaternion) endif() + +set(BM_BINS ${BM_BINS} sqisign_bm_quaternion CACHE INTERNAL "List of benchmark executables") diff --git a/src/quaternion/ref/generic/test/algebra.c b/src/quaternion/ref/generic/test/algebra.c index 90949c8..60ce769 100644 --- a/src/quaternion/ref/generic/test/algebra.c +++ b/src/quaternion/ref/generic/test/algebra.c @@ -2,162 +2,93 @@ // tests of internal helper functions -//static inline void quat_alg_init_set_ui(quat_alg_t *alg, unsigned int p); -int quat_test_init_set_ui(){ +// static inline void quat_alg_init_set_ui(quat_alg_t *alg, unsigned int p); +int +quat_test_init_set_ui(void) +{ int res = 0; int p = 5; quat_alg_t alg; - ibz_mat_4x4_t cmp; - ibz_mat_4x4_init(&cmp); quat_alg_init_set_ui(&alg, p); - res = res || (p != ibz_get(&(alg.p))); - ibz_mat_4x4_identity(&cmp); - ibz_set(&(cmp[2][2]),p); - ibz_set(&(cmp[3][3]),p); - res = res || !ibz_mat_4x4_equal(&cmp,&(alg.gram)); - if (res != 0){ + res = res || (ibz_cmp_int32(&(alg.p), p) != 0); + if (res != 0) { printf("Quaternion unit test alg_init_set_ui failed\n"); } quat_alg_finalize(&alg); - ibz_mat_4x4_finalize(&cmp); - return(res); + return (res); } -//void quat_alg_coord_add(quat_alg_coord_t *res, const quat_alg_coord_t *a, const quat_alg_coord_t *b); -int quat_test_alg_coord_add(){ +// void quat_alg_coord_mul(ibz_vec_4_t *res, const ibz_vec_4_t *a, const ibz_vec_4_t *b, const +// quat_alg_t *alg); +int +quat_test_alg_coord_mul(void) +{ int res = 0; - quat_alg_coord_t a, b, c, cmp; - quat_alg_coord_init(&a); - quat_alg_coord_init(&b); - quat_alg_coord_init(&c); - quat_alg_coord_init(&cmp); + quat_alg_t alg; + quat_alg_init_set_ui(&alg, 7); + ibz_vec_4_t a, b, c, cmp; + ibz_vec_4_init(&a); + ibz_vec_4_init(&b); + ibz_vec_4_init(&c); + ibz_vec_4_init(&cmp); - - ibz_set(&(a[0]),1); - ibz_set(&(a[1]),-2); - ibz_set(&(a[2]),7); - ibz_set(&(a[3]),199); - ibz_set(&(b[0]),-6); - ibz_set(&(b[1]),2); - ibz_set(&(b[2]),67); - ibz_set(&(b[3]),-22); - ibz_set(&(cmp[0]),-5); - ibz_set(&(cmp[1]),0); - ibz_set(&(cmp[2]),74); - ibz_set(&(cmp[3]),177); - quat_alg_coord_add(&c,&a,&b); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(c[i]),&(cmp[i])); + ibz_set(&(a[0]), 152); + ibz_set(&(a[1]), 57); + ibz_set(&(a[2]), 190); + ibz_set(&(a[3]), 28); + ibz_set(&(b[0]), 165); + ibz_set(&(b[1]), 35); + ibz_set(&(b[2]), 231); + ibz_set(&(b[3]), 770); + ibz_set(&(cmp[0]), -435065); + ibz_set(&(cmp[1]), 993549); + ibz_set(&(cmp[2]), 23552); + ibz_set(&(cmp[3]), 128177); + quat_alg_coord_mul(&c, &a, &b, &alg); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(c[i]), &(cmp[i])); + } + ibz_set(&(alg.p), 11); + ibz_set(&(cmp[0]), -696865); + ibz_set(&(cmp[1]), 1552877); + quat_alg_coord_mul(&c, &a, &b, &alg); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(c[i]), &(cmp[i])); } - ibz_set(&(a[0]),-122); - ibz_set(&(a[1]),0); - ibz_set(&(a[2]),-7); - ibz_set(&(a[3]),1889); - ibz_set(&(b[0]),-6); - ibz_set(&(b[1]),2); - ibz_set(&(b[2]),67); - ibz_set(&(b[3]),-1889); - ibz_set(&(cmp[0]),-128); - ibz_set(&(cmp[1]),2); - ibz_set(&(cmp[2]),60); - ibz_set(&(cmp[3]),0); - quat_alg_coord_add(&c,&a,&b); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(c[i]),&(cmp[i])); + ibz_set(&(alg.p), 7); + ibz_set(&(a[0]), 1); + ibz_set(&(a[1]), 1); + ibz_set(&(a[2]), 1); + ibz_set(&(a[3]), 1); + ibz_set(&(cmp[0]), -14); + ibz_set(&(cmp[1]), 2); + ibz_set(&(cmp[2]), 2); + ibz_set(&(cmp[3]), 2); + quat_alg_coord_mul(&a, &a, &a, &alg); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(a[i]), &(cmp[i])); } - ibz_set(&(a[0]),-1); - ibz_set(&(a[1]),2); - ibz_set(&(a[2]),-7); - ibz_set(&(a[3]),19);; - ibz_set(&(cmp[0]),-2); - ibz_set(&(cmp[1]),4); - ibz_set(&(cmp[2]),-14); - ibz_set(&(cmp[3]),38); - quat_alg_coord_add(&a,&a,&a); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(a[i]),&(cmp[i])); + if (res != 0) { + printf("Quaternion unit test alg_coord_mul failed\n"); } - - if (res != 0){ - printf("Quaternion unit test alg_coord_add failed\n"); - } - quat_alg_coord_finalize(&a); - quat_alg_coord_finalize(&b); - quat_alg_coord_finalize(&c); - quat_alg_coord_finalize(&cmp); - return(res); + ibz_vec_4_finalize(&a); + ibz_vec_4_finalize(&b); + ibz_vec_4_finalize(&c); + ibz_vec_4_finalize(&cmp); + quat_alg_finalize(&alg); + return (res); } -//void quat_alg_coord_sub(quat_alg_coord_t *res, const quat_alg_coord_t *a, const quat_alg_coord_t *b); -int quat_test_alg_coord_sub(){ - int res = 0; - quat_alg_coord_t a, b, c, cmp; - quat_alg_coord_init(&a); - quat_alg_coord_init(&b); - quat_alg_coord_init(&c); - quat_alg_coord_init(&cmp); - - ibz_set(&(a[0]),1); - ibz_set(&(a[1]),-2); - ibz_set(&(a[2]),7); - ibz_set(&(a[3]),199); - ibz_set(&(b[0]),-6); - ibz_set(&(b[1]),2); - ibz_set(&(b[2]),67); - ibz_set(&(b[3]),-22); - ibz_set(&(cmp[0]),7); - ibz_set(&(cmp[1]),-4); - ibz_set(&(cmp[2]),-60); - ibz_set(&(cmp[3]),221); - quat_alg_coord_sub(&c,&a,&b); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(c[i]),&(cmp[i])); - } - - ibz_set(&(a[0]),-122); - ibz_set(&(a[1]),0); - ibz_set(&(a[2]),-7); - ibz_set(&(a[3]),1889); - ibz_set(&(b[0]),-6); - ibz_set(&(b[1]),2); - ibz_set(&(b[2]),67); - ibz_set(&(b[3]),-1889); - ibz_set(&(cmp[0]),-116); - ibz_set(&(cmp[1]),-2); - ibz_set(&(cmp[2]),-74); - ibz_set(&(cmp[3]),3778); - quat_alg_coord_sub(&c,&a,&b); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(c[i]),&(cmp[i])); - } - - ibz_set(&(a[0]),-1); - ibz_set(&(a[1]),2); - ibz_set(&(a[2]),-7); - ibz_set(&(a[3]),19);; - ibz_set(&(cmp[0]),0); - ibz_set(&(cmp[1]),0); - ibz_set(&(cmp[2]),0); - ibz_set(&(cmp[3]),0); - quat_alg_coord_sub(&a,&a,&a); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(a[i]),&(cmp[i])); - } - - if (res != 0){ - printf("Quaternion unit test alg_coord_sub failed\n"); - } - quat_alg_coord_finalize(&a); - quat_alg_coord_finalize(&b); - quat_alg_coord_finalize(&c); - quat_alg_coord_finalize(&cmp); - return(res); -} - -//void quat_alg_equal_denom(quat_alg_elem_t *res_a, quat_alg_elem_t *res_b, const quat_alg_elem_t *a, const quat_alg_elem_t *b); -int quat_test_alg_equal_denom(){ +// void quat_alg_equal_denom(quat_alg_elem_t *res_a, quat_alg_elem_t *res_b, const quat_alg_elem_t +// *a, const quat_alg_elem_t *b); +int +quat_test_alg_equal_denom(void) +{ int res = 0; quat_alg_elem_t a, b, res_a, res_b, cmp_a, cmp_b; quat_alg_elem_init(&a); @@ -167,118 +98,117 @@ int quat_test_alg_equal_denom(){ quat_alg_elem_init(&cmp_a); quat_alg_elem_init(&cmp_b); - ibz_set(&(a.coord[0]),-12); - ibz_set(&(a.coord[1]),0); - ibz_set(&(a.coord[2]),-7); - ibz_set(&(a.coord[3]),19); - ibz_set(&(a.denom),9); - ibz_set(&(b.coord[0]),-6); - ibz_set(&(b.coord[1]),2); - ibz_set(&(b.coord[2]),67); - ibz_set(&(b.coord[3]),-19); - ibz_set(&(b.denom),3); - ibz_set(&(cmp_a.coord[0]),-12); - ibz_set(&(cmp_a.coord[1]),0); - ibz_set(&(cmp_a.coord[2]),-7); - ibz_set(&(cmp_a.coord[3]),19); - ibz_set(&(cmp_a.denom),9); - ibz_set(&(cmp_b.coord[0]),-18); - ibz_set(&(cmp_b.coord[1]),6); - ibz_set(&(cmp_b.coord[2]),201); - ibz_set(&(cmp_b.coord[3]),-57); - ibz_set(&(cmp_b.denom),9); - quat_alg_equal_denom(&res_a,&res_b,&a,&b); - res = res || ibz_cmp(&(res_a.denom),&(cmp_a.denom)); - res = res || ibz_cmp(&(res_b.denom),&(cmp_b.denom)); - res = res || ibz_cmp(&(cmp_a.denom),&(cmp_b.denom)); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(res_a.coord[i]),&(cmp_a.coord[i])); - res = res || ibz_cmp(&(res_b.coord[i]),&(cmp_b.coord[i])); + ibz_set(&(a.coord[0]), -12); + ibz_set(&(a.coord[1]), 0); + ibz_set(&(a.coord[2]), -7); + ibz_set(&(a.coord[3]), 19); + ibz_set(&(a.denom), 9); + ibz_set(&(b.coord[0]), -6); + ibz_set(&(b.coord[1]), 2); + ibz_set(&(b.coord[2]), 67); + ibz_set(&(b.coord[3]), -19); + ibz_set(&(b.denom), 3); + ibz_set(&(cmp_a.coord[0]), -12); + ibz_set(&(cmp_a.coord[1]), 0); + ibz_set(&(cmp_a.coord[2]), -7); + ibz_set(&(cmp_a.coord[3]), 19); + ibz_set(&(cmp_a.denom), 9); + ibz_set(&(cmp_b.coord[0]), -18); + ibz_set(&(cmp_b.coord[1]), 6); + ibz_set(&(cmp_b.coord[2]), 201); + ibz_set(&(cmp_b.coord[3]), -57); + ibz_set(&(cmp_b.denom), 9); + quat_alg_equal_denom(&res_a, &res_b, &a, &b); + res = res || ibz_cmp(&(res_a.denom), &(cmp_a.denom)); + res = res || ibz_cmp(&(res_b.denom), &(cmp_b.denom)); + res = res || ibz_cmp(&(cmp_a.denom), &(cmp_b.denom)); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(res_a.coord[i]), &(cmp_a.coord[i])); + res = res || ibz_cmp(&(res_b.coord[i]), &(cmp_b.coord[i])); } - - ibz_set(&(a.coord[0]),-12); - ibz_set(&(a.coord[1]),0); - ibz_set(&(a.coord[2]),-7); - ibz_set(&(a.coord[3]),19); - ibz_set(&(a.denom),9); - ibz_set(&(b.coord[0]),-6); - ibz_set(&(b.coord[1]),2); - ibz_set(&(b.coord[2]),67); - ibz_set(&(b.coord[3]),-19); - ibz_set(&(b.denom),6); - ibz_set(&(cmp_a.coord[0]),-24); - ibz_set(&(cmp_a.coord[1]),0); - ibz_set(&(cmp_a.coord[2]),-14); - ibz_set(&(cmp_a.coord[3]),38); - ibz_set(&(cmp_a.denom),18); - ibz_set(&(cmp_b.coord[0]),-18); - ibz_set(&(cmp_b.coord[1]),6); - ibz_set(&(cmp_b.coord[2]),201); - ibz_set(&(cmp_b.coord[3]),-57); - ibz_set(&(cmp_b.denom),18); - quat_alg_equal_denom(&res_a,&res_b,&a,&b); - res = res || ibz_cmp(&(res_a.denom),&(cmp_a.denom)); - res = res || ibz_cmp(&(res_b.denom),&(cmp_b.denom)); - res = res || ibz_cmp(&(cmp_a.denom),&(cmp_b.denom)); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(res_a.coord[i]),&(cmp_a.coord[i])); - res = res || ibz_cmp(&(res_b.coord[i]),&(cmp_b.coord[i])); + ibz_set(&(a.coord[0]), -12); + ibz_set(&(a.coord[1]), 0); + ibz_set(&(a.coord[2]), -7); + ibz_set(&(a.coord[3]), 19); + ibz_set(&(a.denom), 9); + ibz_set(&(b.coord[0]), -6); + ibz_set(&(b.coord[1]), 2); + ibz_set(&(b.coord[2]), 67); + ibz_set(&(b.coord[3]), -19); + ibz_set(&(b.denom), 6); + ibz_set(&(cmp_a.coord[0]), -24); + ibz_set(&(cmp_a.coord[1]), 0); + ibz_set(&(cmp_a.coord[2]), -14); + ibz_set(&(cmp_a.coord[3]), 38); + ibz_set(&(cmp_a.denom), 18); + ibz_set(&(cmp_b.coord[0]), -18); + ibz_set(&(cmp_b.coord[1]), 6); + ibz_set(&(cmp_b.coord[2]), 201); + ibz_set(&(cmp_b.coord[3]), -57); + ibz_set(&(cmp_b.denom), 18); + quat_alg_equal_denom(&res_a, &res_b, &a, &b); + res = res || ibz_cmp(&(res_a.denom), &(cmp_a.denom)); + res = res || ibz_cmp(&(res_b.denom), &(cmp_b.denom)); + res = res || ibz_cmp(&(cmp_a.denom), &(cmp_b.denom)); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(res_a.coord[i]), &(cmp_a.coord[i])); + res = res || ibz_cmp(&(res_b.coord[i]), &(cmp_b.coord[i])); } - ibz_set(&(a.coord[0]),-12); - ibz_set(&(a.coord[1]),0); - ibz_set(&(a.coord[2]),-7); - ibz_set(&(a.coord[3]),19); - ibz_set(&(a.denom),6); - ibz_set(&(b.coord[0]),-6); - ibz_set(&(b.coord[1]),2); - ibz_set(&(b.coord[2]),67); - ibz_set(&(b.coord[3]),-19); - ibz_set(&(b.denom),6); - ibz_set(&(cmp_a.coord[0]),-12); - ibz_set(&(cmp_a.coord[1]),0); - ibz_set(&(cmp_a.coord[2]),-7); - ibz_set(&(cmp_a.coord[3]),19); - ibz_set(&(cmp_a.denom),6); - ibz_set(&(cmp_b.coord[0]),-6); - ibz_set(&(cmp_b.coord[1]),2); - ibz_set(&(cmp_b.coord[2]),67); - ibz_set(&(cmp_b.coord[3]),-19); - ibz_set(&(cmp_b.denom),6); - quat_alg_equal_denom(&res_a,&res_b,&a,&b); - res = res || ibz_cmp(&(res_a.denom),&(cmp_a.denom)); - res = res || ibz_cmp(&(res_b.denom),&(cmp_b.denom)); - res = res || ibz_cmp(&(cmp_a.denom),&(cmp_b.denom)); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(res_a.coord[i]),&(cmp_a.coord[i])); - res = res || ibz_cmp(&(res_b.coord[i]),&(cmp_b.coord[i])); + ibz_set(&(a.coord[0]), -12); + ibz_set(&(a.coord[1]), 0); + ibz_set(&(a.coord[2]), -7); + ibz_set(&(a.coord[3]), 19); + ibz_set(&(a.denom), 6); + ibz_set(&(b.coord[0]), -6); + ibz_set(&(b.coord[1]), 2); + ibz_set(&(b.coord[2]), 67); + ibz_set(&(b.coord[3]), -19); + ibz_set(&(b.denom), 6); + ibz_set(&(cmp_a.coord[0]), -12); + ibz_set(&(cmp_a.coord[1]), 0); + ibz_set(&(cmp_a.coord[2]), -7); + ibz_set(&(cmp_a.coord[3]), 19); + ibz_set(&(cmp_a.denom), 6); + ibz_set(&(cmp_b.coord[0]), -6); + ibz_set(&(cmp_b.coord[1]), 2); + ibz_set(&(cmp_b.coord[2]), 67); + ibz_set(&(cmp_b.coord[3]), -19); + ibz_set(&(cmp_b.denom), 6); + quat_alg_equal_denom(&res_a, &res_b, &a, &b); + res = res || ibz_cmp(&(res_a.denom), &(cmp_a.denom)); + res = res || ibz_cmp(&(res_b.denom), &(cmp_b.denom)); + res = res || ibz_cmp(&(cmp_a.denom), &(cmp_b.denom)); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(res_a.coord[i]), &(cmp_a.coord[i])); + res = res || ibz_cmp(&(res_b.coord[i]), &(cmp_b.coord[i])); } - ibz_set(&(a.coord[0]),-12); - ibz_set(&(a.coord[1]),0); - ibz_set(&(a.coord[2]),-7); - ibz_set(&(a.coord[3]),19); - ibz_set(&(a.denom),6); - ibz_set(&(cmp_a.coord[0]),-12); - ibz_set(&(cmp_a.coord[1]),0); - ibz_set(&(cmp_a.coord[2]),-7); - ibz_set(&(cmp_a.coord[3]),19); - ibz_set(&(cmp_a.denom),6); - ibz_set(&(cmp_b.coord[0]),-12); - ibz_set(&(cmp_b.coord[1]),0); - ibz_set(&(cmp_b.coord[2]),-7); - ibz_set(&(cmp_b.coord[3]),19); - ibz_set(&(cmp_b.denom),6); - quat_alg_equal_denom(&a,&b,&a,&a); - res = res || ibz_cmp(&(a.denom),&(a.denom)); - res = res || ibz_cmp(&(b.denom),&(b.denom)); - res = res || ibz_cmp(&(cmp_a.denom),&(cmp_b.denom)); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(a.coord[i]),&(a.coord[i])); - res = res || ibz_cmp(&(b.coord[i]),&(b.coord[i])); + ibz_set(&(a.coord[0]), -12); + ibz_set(&(a.coord[1]), 0); + ibz_set(&(a.coord[2]), -7); + ibz_set(&(a.coord[3]), 19); + ibz_set(&(a.denom), 6); + ibz_set(&(cmp_a.coord[0]), -12); + ibz_set(&(cmp_a.coord[1]), 0); + ibz_set(&(cmp_a.coord[2]), -7); + ibz_set(&(cmp_a.coord[3]), 19); + ibz_set(&(cmp_a.denom), 6); + ibz_set(&(cmp_b.coord[0]), -12); + ibz_set(&(cmp_b.coord[1]), 0); + ibz_set(&(cmp_b.coord[2]), -7); + ibz_set(&(cmp_b.coord[3]), 19); + ibz_set(&(cmp_b.denom), 6); + quat_alg_equal_denom(&a, &b, &a, &a); + res = res || ibz_cmp(&(a.denom), &(a.denom)); + res = res || ibz_cmp(&(b.denom), &(b.denom)); + res = res || ibz_cmp(&(cmp_a.denom), &(cmp_b.denom)); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(a.coord[i]), &(a.coord[i])); + res = res || ibz_cmp(&(b.coord[i]), &(b.coord[i])); } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test alg_equal_denom failed\n"); } quat_alg_elem_finalize(&a); @@ -287,15 +217,15 @@ int quat_test_alg_equal_denom(){ quat_alg_elem_finalize(&res_b); quat_alg_elem_finalize(&cmp_a); quat_alg_elem_finalize(&cmp_b); - return(res); + return (res); } +// Tests of public functions -//Tests of public functions - - -//void quat_alg_add(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b); -int quat_test_alg_add(){ +// void quat_alg_add(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b); +int +quat_test_alg_add(void) +{ int res = 0; quat_alg_elem_t a, b, c, cmp; quat_alg_elem_init(&a); @@ -303,76 +233,78 @@ int quat_test_alg_add(){ quat_alg_elem_init(&c); quat_alg_elem_init(&cmp); - ibz_set(&(a.coord[0]),-12); - ibz_set(&(a.coord[1]),0); - ibz_set(&(a.coord[2]),-7); - ibz_set(&(a.coord[3]),19); - ibz_set(&(a.denom),9); - ibz_set(&(b.coord[0]),-6); - ibz_set(&(b.coord[1]),2); - ibz_set(&(b.coord[2]),7); - ibz_set(&(b.coord[3]),-19); - ibz_set(&(b.denom),3); - ibz_set(&(cmp.coord[0]),-30); - ibz_set(&(cmp.coord[1]),6); - ibz_set(&(cmp.coord[2]),14); - ibz_set(&(cmp.coord[3]),-38); - ibz_set(&(cmp.denom),9); + ibz_set(&(a.coord[0]), -12); + ibz_set(&(a.coord[1]), 0); + ibz_set(&(a.coord[2]), -7); + ibz_set(&(a.coord[3]), 19); + ibz_set(&(a.denom), 9); + ibz_set(&(b.coord[0]), -6); + ibz_set(&(b.coord[1]), 2); + ibz_set(&(b.coord[2]), 7); + ibz_set(&(b.coord[3]), -19); + ibz_set(&(b.denom), 3); + ibz_set(&(cmp.coord[0]), -30); + ibz_set(&(cmp.coord[1]), 6); + ibz_set(&(cmp.coord[2]), 14); + ibz_set(&(cmp.coord[3]), -38); + ibz_set(&(cmp.denom), 9); quat_alg_add(&c, &a, &b); - res = res || ibz_cmp(&(c.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(c.coord[i]),&(cmp.coord[i])); + res = res || ibz_cmp(&(c.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(c.coord[i]), &(cmp.coord[i])); } - ibz_set(&(a.coord[0]),-12); - ibz_set(&(a.coord[1]),0); - ibz_set(&(a.coord[2]),-7); - ibz_set(&(a.coord[3]),19); - ibz_set(&(a.denom),9); - ibz_set(&(b.coord[0]),-6); - ibz_set(&(b.coord[1]),2); - ibz_set(&(b.coord[2]),7); - ibz_set(&(b.coord[3]),-19); - ibz_set(&(b.denom),6); - ibz_set(&(cmp.coord[0]),-42); - ibz_set(&(cmp.coord[1]),6); - ibz_set(&(cmp.coord[2]),7); - ibz_set(&(cmp.coord[3]),-19); - ibz_set(&(cmp.denom),18); + ibz_set(&(a.coord[0]), -12); + ibz_set(&(a.coord[1]), 0); + ibz_set(&(a.coord[2]), -7); + ibz_set(&(a.coord[3]), 19); + ibz_set(&(a.denom), 9); + ibz_set(&(b.coord[0]), -6); + ibz_set(&(b.coord[1]), 2); + ibz_set(&(b.coord[2]), 7); + ibz_set(&(b.coord[3]), -19); + ibz_set(&(b.denom), 6); + ibz_set(&(cmp.coord[0]), -42); + ibz_set(&(cmp.coord[1]), 6); + ibz_set(&(cmp.coord[2]), 7); + ibz_set(&(cmp.coord[3]), -19); + ibz_set(&(cmp.denom), 18); quat_alg_add(&c, &a, &b); - res = res || ibz_cmp(&(c.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(c.coord[i]),&(cmp.coord[i])); + res = res || ibz_cmp(&(c.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(c.coord[i]), &(cmp.coord[i])); } - ibz_set(&(a.coord[0]),-12); - ibz_set(&(a.coord[1]),0); - ibz_set(&(a.coord[2]),-7); - ibz_set(&(a.coord[3]),19); - ibz_set(&(a.denom),9); - ibz_set(&(cmp.coord[0]),-24); - ibz_set(&(cmp.coord[1]),0); - ibz_set(&(cmp.coord[2]),-14); - ibz_set(&(cmp.coord[3]),38); - ibz_set(&(cmp.denom),9); + ibz_set(&(a.coord[0]), -12); + ibz_set(&(a.coord[1]), 0); + ibz_set(&(a.coord[2]), -7); + ibz_set(&(a.coord[3]), 19); + ibz_set(&(a.denom), 9); + ibz_set(&(cmp.coord[0]), -24); + ibz_set(&(cmp.coord[1]), 0); + ibz_set(&(cmp.coord[2]), -14); + ibz_set(&(cmp.coord[3]), 38); + ibz_set(&(cmp.denom), 9); quat_alg_add(&a, &a, &a); - res = res || ibz_cmp(&(a.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(a.coord[i]),&(cmp.coord[i])); + res = res || ibz_cmp(&(a.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(a.coord[i]), &(cmp.coord[i])); } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test alg_add failed\n"); } quat_alg_elem_finalize(&a); quat_alg_elem_finalize(&b); quat_alg_elem_finalize(&c); quat_alg_elem_finalize(&cmp); - return(res); + return (res); } -//void quat_alg_sub(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b); -int quat_test_alg_sub(){ +// void quat_alg_sub(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b); +int +quat_test_alg_sub(void) +{ int res = 0; quat_alg_elem_t a, b, c, cmp; quat_alg_elem_init(&a); @@ -380,76 +312,81 @@ int quat_test_alg_sub(){ quat_alg_elem_init(&c); quat_alg_elem_init(&cmp); - ibz_set(&(a.coord[0]),-12); - ibz_set(&(a.coord[1]),0); - ibz_set(&(a.coord[2]),-7); - ibz_set(&(a.coord[3]),19); - ibz_set(&(a.denom),9); - ibz_set(&(b.coord[0]),-6); - ibz_set(&(b.coord[1]),2); - ibz_set(&(b.coord[2]),7); - ibz_set(&(b.coord[3]),-19); - ibz_set(&(b.denom),3); - ibz_set(&(cmp.coord[0]),-12-3*(-6)); - ibz_set(&(cmp.coord[1]),-3*2); - ibz_set(&(cmp.coord[2]),-7-3*7); - ibz_set(&(cmp.coord[3]),19-3*(-19)); - ibz_set(&(cmp.denom),9); + ibz_set(&(a.coord[0]), -12); + ibz_set(&(a.coord[1]), 0); + ibz_set(&(a.coord[2]), -7); + ibz_set(&(a.coord[3]), 19); + ibz_set(&(a.denom), 9); + ibz_set(&(b.coord[0]), -6); + ibz_set(&(b.coord[1]), 2); + ibz_set(&(b.coord[2]), 7); + ibz_set(&(b.coord[3]), -19); + ibz_set(&(b.denom), 3); + ibz_set(&(cmp.coord[0]), -12 - 3 * (-6)); + ibz_set(&(cmp.coord[1]), -3 * 2); + ibz_set(&(cmp.coord[2]), -7 - 3 * 7); + ibz_set(&(cmp.coord[3]), 19 - 3 * (-19)); + ibz_set(&(cmp.denom), 9); quat_alg_sub(&c, &a, &b); - res = res || ibz_cmp(&(c.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(c.coord[i]),&(cmp.coord[i])); + res = res || ibz_cmp(&(c.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(c.coord[i]), &(cmp.coord[i])); } - ibz_set(&(a.coord[0]),-12); - ibz_set(&(a.coord[1]),0); - ibz_set(&(a.coord[2]),-7); - ibz_set(&(a.coord[3]),19); - ibz_set(&(a.denom),9); - ibz_set(&(b.coord[0]),-6); - ibz_set(&(b.coord[1]),2); - ibz_set(&(b.coord[2]),7); - ibz_set(&(b.coord[3]),-19); - ibz_set(&(b.denom),6); - ibz_set(&(cmp.coord[0]),-2*12-3*(-6)); - ibz_set(&(cmp.coord[1]),-3*2); - ibz_set(&(cmp.coord[2]),-2*7-3*7); - ibz_set(&(cmp.coord[3]),2*19-3*(-19)); - ibz_set(&(cmp.denom),18); + ibz_set(&(a.coord[0]), -12); + ibz_set(&(a.coord[1]), 0); + ibz_set(&(a.coord[2]), -7); + ibz_set(&(a.coord[3]), 19); + ibz_set(&(a.denom), 9); + ibz_set(&(b.coord[0]), -6); + ibz_set(&(b.coord[1]), 2); + ibz_set(&(b.coord[2]), 7); + ibz_set(&(b.coord[3]), -19); + ibz_set(&(b.denom), 6); + ibz_set(&(cmp.coord[0]), -2 * 12 - 3 * (-6)); + ibz_set(&(cmp.coord[1]), -3 * 2); + ibz_set(&(cmp.coord[2]), -2 * 7 - 3 * 7); + ibz_set(&(cmp.coord[3]), 2 * 19 - 3 * (-19)); + ibz_set(&(cmp.denom), 18); quat_alg_sub(&a, &a, &b); - res = res || ibz_cmp(&(a.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(a.coord[i]),&(cmp.coord[i])); + res = res || ibz_cmp(&(a.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(a.coord[i]), &(cmp.coord[i])); } - ibz_set(&(a.coord[0]),-12); - ibz_set(&(a.coord[1]),0); - ibz_set(&(a.coord[2]),-7); - ibz_set(&(a.coord[3]),19); - ibz_set(&(a.denom),9); - ibz_set(&(cmp.coord[0]),0); - ibz_set(&(cmp.coord[1]),0); - ibz_set(&(cmp.coord[2]),0); - ibz_set(&(cmp.coord[3]),0); - ibz_set(&(cmp.denom),9); + ibz_set(&(a.coord[0]), -12); + ibz_set(&(a.coord[1]), 0); + ibz_set(&(a.coord[2]), -7); + ibz_set(&(a.coord[3]), 19); + ibz_set(&(a.denom), 9); + ibz_set(&(cmp.coord[0]), 0); + ibz_set(&(cmp.coord[1]), 0); + ibz_set(&(cmp.coord[2]), 0); + ibz_set(&(cmp.coord[3]), 0); + ibz_set(&(cmp.denom), 9); quat_alg_sub(&a, &a, &a); - res = res || ibz_cmp(&(a.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(a.coord[i]),&(cmp.coord[i])); + res = res || ibz_cmp(&(a.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(a.coord[i]), &(cmp.coord[i])); } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test alg_sub failed\n"); } quat_alg_elem_finalize(&a); quat_alg_elem_finalize(&b); quat_alg_elem_finalize(&c); quat_alg_elem_finalize(&cmp); - return(res); + return (res); } -//void quat_alg_mul(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b, const quat_alg_t *alg); -int quat_test_alg_mul(){ +// void quat_alg_mul(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b, const +// quat_alg_t *alg); +int +quat_test_alg_mul(void) +{ int res = 0; quat_alg_t alg; quat_alg_init_set_ui(&alg, 7); @@ -459,71 +396,75 @@ int quat_test_alg_mul(){ quat_alg_elem_init(&c); quat_alg_elem_init(&cmp); - ibz_set(&(a.coord[0]),152); - ibz_set(&(a.coord[1]),57); - ibz_set(&(a.coord[2]),190); - ibz_set(&(a.coord[3]),28); - ibz_set(&(a.denom),76); - ibz_set(&(b.coord[0]),165); - ibz_set(&(b.coord[1]),35); - ibz_set(&(b.coord[2]),231); - ibz_set(&(b.coord[3]),770); - ibz_set(&(b.denom),385); - ibz_set(&(cmp.coord[0]),-435065); - ibz_set(&(cmp.coord[1]),993549); - ibz_set(&(cmp.coord[2]),23552); - ibz_set(&(cmp.coord[3]),128177); - ibz_set(&(cmp.denom),29260); + ibz_set(&(a.coord[0]), 152); + ibz_set(&(a.coord[1]), 57); + ibz_set(&(a.coord[2]), 190); + ibz_set(&(a.coord[3]), 28); + ibz_set(&(a.denom), 76); + ibz_set(&(b.coord[0]), 165); + ibz_set(&(b.coord[1]), 35); + ibz_set(&(b.coord[2]), 231); + ibz_set(&(b.coord[3]), 770); + ibz_set(&(b.denom), 385); + ibz_set(&(cmp.coord[0]), -435065); + ibz_set(&(cmp.coord[1]), 993549); + ibz_set(&(cmp.coord[2]), 23552); + ibz_set(&(cmp.coord[3]), 128177); + ibz_set(&(cmp.denom), 29260); quat_alg_mul(&c, &a, &b, &alg); - res = res || ibz_cmp(&(c.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(c.coord[i]),&(cmp.coord[i])); + res = res || ibz_cmp(&(c.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(c.coord[i]), &(cmp.coord[i])); } - ibz_set(&(alg.p),11); - ibz_set(&(cmp.coord[0]),-696865); - ibz_set(&(cmp.coord[1]),1552877); - ibz_set(&(cmp.denom),29260); + ibz_set(&(alg.p), 11); + ibz_set(&(cmp.coord[0]), -696865); + ibz_set(&(cmp.coord[1]), 1552877); + ibz_set(&(cmp.denom), 29260); quat_alg_mul(&c, &a, &b, &alg); - res = res || ibz_cmp(&(c.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(c.coord[i]),&(cmp.coord[i])); + res = res || ibz_cmp(&(c.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(c.coord[i]), &(cmp.coord[i])); } - ibz_set(&(alg.p),7); - ibz_set(&(a.coord[0]),1); - ibz_set(&(a.coord[1]),1); - ibz_set(&(a.coord[2]),1); - ibz_set(&(a.coord[3]),1); - ibz_set(&(a.denom),2); - ibz_set(&(cmp.coord[0]),-14); - ibz_set(&(cmp.coord[1]),2); - ibz_set(&(cmp.coord[2]),2); - ibz_set(&(cmp.coord[3]),2); - ibz_set(&(cmp.denom),4); + ibz_set(&(alg.p), 7); + ibz_set(&(a.coord[0]), 1); + ibz_set(&(a.coord[1]), 1); + ibz_set(&(a.coord[2]), 1); + ibz_set(&(a.coord[3]), 1); + ibz_set(&(a.denom), 2); + ibz_set(&(cmp.coord[0]), -14); + ibz_set(&(cmp.coord[1]), 2); + ibz_set(&(cmp.coord[2]), 2); + ibz_set(&(cmp.coord[3]), 2); + ibz_set(&(cmp.denom), 4); quat_alg_mul(&c, &a, &a, &alg); - res = res || ibz_cmp(&(c.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(c.coord[i]),&(cmp.coord[i])); + res = res || ibz_cmp(&(c.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(c.coord[i]), &(cmp.coord[i])); } - ibz_set(&(alg.p),7); - ibz_set(&(a.coord[0]),1); - ibz_set(&(a.coord[1]),1); - ibz_set(&(a.coord[2]),1); - ibz_set(&(a.coord[3]),1); - ibz_set(&(a.denom),2); - ibz_set(&(cmp.coord[0]),-14); - ibz_set(&(cmp.coord[1]),2); - ibz_set(&(cmp.coord[2]),2); - ibz_set(&(cmp.coord[3]),2); - ibz_set(&(cmp.denom),4); + ibz_set(&(alg.p), 7); + ibz_set(&(a.coord[0]), 1); + ibz_set(&(a.coord[1]), 1); + ibz_set(&(a.coord[2]), 1); + ibz_set(&(a.coord[3]), 1); + ibz_set(&(a.denom), 2); + ibz_set(&(cmp.coord[0]), -14); + ibz_set(&(cmp.coord[1]), 2); + ibz_set(&(cmp.coord[2]), 2); + ibz_set(&(cmp.coord[3]), 2); + ibz_set(&(cmp.denom), 4); quat_alg_mul(&a, &a, &a, &alg); - res = res || ibz_cmp(&(a.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(a.coord[i]),&(cmp.coord[i])); + res = res || ibz_cmp(&(a.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(a.coord[i]), &(cmp.coord[i])); } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test alg_mul failed\n"); } quat_alg_elem_finalize(&a); @@ -531,155 +472,101 @@ int quat_test_alg_mul(){ quat_alg_elem_finalize(&c); quat_alg_elem_finalize(&cmp); quat_alg_finalize(&alg); - return(res); + return (res); } -//void quat_alg_norm(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_t *alg); -int quat_test_alg_norm(){ +// void quat_alg_norm(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_t *alg); +int +quat_test_alg_norm(void) +{ int res = 0; quat_alg_t alg; quat_alg_init_set_ui(&alg, 11); quat_alg_elem_t a; - ibq_t norm, cmp; - ibz_t num, denom; + ibz_t num, denom, cmp_num, cmp_denom; quat_alg_elem_init(&a); - ibq_init(&norm); - ibq_init(&cmp); ibz_init(&num); ibz_init(&denom); + ibz_init(&cmp_num); + ibz_init(&cmp_denom); - ibz_set(&(alg.p),11); - ibz_set(&(a.coord[0]),1); - ibz_set(&(a.coord[1]),5); - ibz_set(&(a.coord[2]),7); - ibz_set(&(a.coord[3]),2); - ibz_set(&(a.denom),2); - ibz_set(&num,609); - ibz_set(&denom,4); - ibq_set(&cmp,&num,&denom); - quat_alg_norm(&norm,&a,&alg); - res = res || (ibq_cmp(&norm,&cmp)); + ibz_set(&(alg.p), 11); + ibz_set(&(a.coord[0]), 1); + ibz_set(&(a.coord[1]), 5); + ibz_set(&(a.coord[2]), 7); + ibz_set(&(a.coord[3]), 2); + ibz_set(&(a.denom), 2); + ibz_set(&cmp_num, 609); + ibz_set(&cmp_denom, 4); + quat_alg_norm(&num, &denom, &a, &alg); + res = res || (ibz_cmp(&num, &cmp_num)); + res = res || (ibz_cmp(&denom, &cmp_denom)); // same vector, not reduced - ibz_set(&(alg.p),11); - ibz_set(&(a.coord[0]),2); - ibz_set(&(a.coord[1]),10); - ibz_set(&(a.coord[2]),14); - ibz_set(&(a.coord[3]),4); - ibz_set(&(a.denom),4); - ibz_set(&num,609); - ibz_set(&denom,4); - ibq_set(&cmp,&num,&denom); - quat_alg_norm(&norm,&a,&alg); - res = res || (ibq_cmp(&norm,&cmp)); + ibz_set(&(alg.p), 11); + ibz_set(&(a.coord[0]), 2); + ibz_set(&(a.coord[1]), 10); + ibz_set(&(a.coord[2]), 14); + ibz_set(&(a.coord[3]), 4); + ibz_set(&(a.denom), 4); + ibz_set(&cmp_num, 609); + ibz_set(&cmp_denom, 4); + quat_alg_norm(&num, &denom, &a, &alg); + res = res || (ibz_cmp(&num, &cmp_num)); + res = res || (ibz_cmp(&denom, &cmp_denom)); - ibz_set(&(alg.p),11); - ibz_set(&(a.coord[0]),152); - ibz_set(&(a.coord[1]),57); - ibz_set(&(a.coord[2]),190); - ibz_set(&(a.coord[3]),28); - ibz_set(&(a.denom),76); - ibz_set(&num,432077); - ibz_set(&denom,5776); - ibq_set(&cmp,&num,&denom); - quat_alg_norm(&norm,&a,&alg); - res = res || (ibq_cmp(&norm,&cmp)); + ibz_set(&(alg.p), 11); + ibz_set(&(a.coord[0]), 152); + ibz_set(&(a.coord[1]), 57); + ibz_set(&(a.coord[2]), 190); + ibz_set(&(a.coord[3]), 28); + ibz_set(&(a.denom), 76); + ibz_set(&cmp_num, 432077); + ibz_set(&cmp_denom, 5776); + quat_alg_norm(&num, &denom, &a, &alg); + res = res || (ibz_cmp(&num, &cmp_num)); + res = res || (ibz_cmp(&denom, &cmp_denom)); - ibz_set(&(alg.p),11); - ibz_set(&(a.coord[0]),0); - ibz_set(&(a.coord[1]),12); - ibz_set(&(a.coord[2]),35); - ibz_set(&(a.coord[3]),49); - ibz_set(&(a.denom),28); - ibz_set(&num,20015); - ibz_set(&denom,392); - ibq_set(&cmp,&num,&denom); - quat_alg_norm(&norm,&a,&alg); - res = res || (ibq_cmp(&norm,&cmp)); + ibz_set(&(alg.p), 11); + ibz_set(&(a.coord[0]), 0); + ibz_set(&(a.coord[1]), 12); + ibz_set(&(a.coord[2]), 35); + ibz_set(&(a.coord[3]), 49); + ibz_set(&(a.denom), 28); + ibz_set(&cmp_num, 20015); + ibz_set(&cmp_denom, 392); + quat_alg_norm(&num, &denom, &a, &alg); + res = res || (ibz_cmp(&num, &cmp_num)); + res = res || (ibz_cmp(&denom, &cmp_denom)); - ibz_set(&(alg.p),7); - ibz_set(&(a.coord[0]),152); - ibz_set(&(a.coord[1]),57); - ibz_set(&(a.coord[2]),190); - ibz_set(&(a.coord[3]),28); - ibz_set(&(a.denom),76); - ibz_set(&num,284541); - ibz_set(&denom,5776); - ibq_set(&cmp,&num,&denom); - quat_alg_norm(&norm,&a,&alg); - res = res || (ibq_cmp(&norm,&cmp)); + ibz_set(&(alg.p), 7); + ibz_set(&(a.coord[0]), 152); + ibz_set(&(a.coord[1]), 57); + ibz_set(&(a.coord[2]), 190); + ibz_set(&(a.coord[3]), 28); + ibz_set(&(a.denom), 76); + ibz_set(&cmp_num, 284541); + ibz_set(&cmp_denom, 5776); + quat_alg_norm(&num, &denom, &a, &alg); + res = res || (ibz_cmp(&num, &cmp_num)); + res = res || (ibz_cmp(&denom, &cmp_denom)); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test alg_norm failed\n"); } quat_alg_elem_finalize(&a); - ibq_finalize(&norm); - ibq_finalize(&cmp); + ibz_finalize(&cmp_num); + ibz_finalize(&cmp_denom); ibz_finalize(&num); ibz_finalize(&denom); quat_alg_finalize(&alg); - return(res); + return (res); } -//void quat_alg_trace(quat_alg_elem_t *res, const quat_alg_elem_t *a); -int quat_test_alg_trace(){ - int res = 0; - quat_alg_elem_t a; - ibq_t trace, cmp; - ibz_t num, denom; - quat_alg_elem_init(&a); - ibq_init(&trace); - ibq_init(&cmp); - ibz_init(&num); - ibz_init(&denom); - - ibz_set(&(a.coord[0]),152); - ibz_set(&(a.coord[1]),57); - ibz_set(&(a.coord[2]),190); - ibz_set(&(a.coord[3]),28); - ibz_set(&(a.denom),76); - ibz_set(&num,4); - ibz_set(&denom,1); - ibq_set(&cmp,&num,&denom); - quat_alg_trace(&trace,&a); - res = res || (ibq_cmp(&trace,&cmp)); - - ibz_set(&(a.coord[0]),0); - ibz_set(&(a.coord[1]),12); - ibz_set(&(a.coord[2]),35); - ibz_set(&(a.coord[3]),49); - ibz_set(&(a.denom),28); - ibz_set(&num,0); - ibz_set(&denom,1); - ibq_set(&cmp,&num,&denom); - quat_alg_trace(&trace,&a); - res = res || (ibq_cmp(&trace,&cmp)); - - ibz_set(&(a.coord[0]),5); - ibz_set(&(a.coord[1]),0); - ibz_set(&(a.coord[2]),0); - ibz_set(&(a.coord[3]),0); - ibz_set(&(a.denom),2); - ibz_set(&num,10); - ibz_set(&denom,2); - ibq_set(&cmp,&num,&denom); - quat_alg_trace(&trace,&a); - res = res || (ibq_cmp(&trace,&cmp)); - - if (res != 0){ - printf("Quaternion unit test alg_trace failed\n"); - } - quat_alg_elem_finalize(&a); - ibq_finalize(&trace); - ibq_finalize(&cmp); - ibz_finalize(&num); - ibz_finalize(&denom); - return(res); -} - - -//void quat_alg_scalar(quat_alg_elem_t *elem, const ibz_t *numerator, const ibz_t *denominator); -int quat_test_alg_scalar(){ +// void quat_alg_scalar(quat_alg_elem_t *elem, const ibz_t *numerator, const ibz_t *denominator); +int +quat_test_alg_scalar(void) +{ int res = 0; quat_alg_elem_t elem, cmp; ibz_t denom, num; @@ -695,10 +582,11 @@ int quat_test_alg_scalar(){ ibz_set(&(cmp.coord[2]), 0); ibz_set(&(cmp.coord[3]), 0); ibz_set(&(cmp.denom), 1); - quat_alg_scalar(&elem,&num,&denom); - res = res || ibz_cmp(&(elem.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(elem.coord[i]),&(cmp.coord[i])); + quat_alg_scalar(&elem, &num, &denom); + res = res || ibz_cmp(&(elem.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(elem.coord[i]), &(cmp.coord[i])); } ibz_set(&num, 5); @@ -708,10 +596,11 @@ int quat_test_alg_scalar(){ ibz_set(&(cmp.coord[2]), 0); ibz_set(&(cmp.coord[3]), 0); ibz_set(&(cmp.denom), 9); - quat_alg_scalar(&elem,&num,&denom); - res = res || ibz_cmp(&(elem.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(elem.coord[i]),&(cmp.coord[i])); + quat_alg_scalar(&elem, &num, &denom); + res = res || ibz_cmp(&(elem.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(elem.coord[i]), &(cmp.coord[i])); } ibz_set(&num, -125); @@ -721,23 +610,26 @@ int quat_test_alg_scalar(){ ibz_set(&(cmp.coord[2]), 0); ibz_set(&(cmp.coord[3]), 0); ibz_set(&(cmp.denom), 25); - quat_alg_scalar(&elem,&num,&denom); - res = res || ibz_cmp(&(elem.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(elem.coord[i]),&(cmp.coord[i])); + quat_alg_scalar(&elem, &num, &denom); + res = res || ibz_cmp(&(elem.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(elem.coord[i]), &(cmp.coord[i])); } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test alg_scalar failed\n"); } quat_alg_elem_finalize(&elem); quat_alg_elem_finalize(&cmp); ibz_finalize(&num); ibz_finalize(&denom); - return(res); + return (res); } -//void quat_alg_conj(quat_alg_elem_t *conj, const quat_alg_elem_t *x); -int quat_test_alg_conj(){ +// void quat_alg_conj(quat_alg_elem_t *conj, const quat_alg_elem_t *x); +int +quat_test_alg_conj(void) +{ int res = 0; quat_alg_elem_t a, conj, cmp; quat_alg_elem_init(&cmp); @@ -754,10 +646,11 @@ int quat_test_alg_conj(){ ibz_set(&(cmp.coord[2]), 0); ibz_set(&(cmp.coord[3]), -7); ibz_set(&(cmp.denom), 25); - quat_alg_conj(&conj,&a); - res = res || ibz_cmp(&(conj.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(conj.coord[i]),&(cmp.coord[i])); + quat_alg_conj(&conj, &a); + res = res || ibz_cmp(&(conj.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(conj.coord[i]), &(cmp.coord[i])); } ibz_set(&(a.coord[0]), -125); @@ -770,189 +663,122 @@ int quat_test_alg_conj(){ ibz_set(&(cmp.coord[2]), 0); ibz_set(&(cmp.coord[3]), 30); ibz_set(&(cmp.denom), 25); - quat_alg_conj(&conj,&a); - res = res || ibz_cmp(&(conj.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(conj.coord[i]),&(cmp.coord[i])); + quat_alg_conj(&conj, &a); + res = res || ibz_cmp(&(conj.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(conj.coord[i]), &(cmp.coord[i])); } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test alg_conj failed\n"); } quat_alg_elem_finalize(&a); quat_alg_elem_finalize(&conj); quat_alg_elem_finalize(&cmp); - return(res); + return (res); } -//void quat_alg_make_primitive(quat_alg_coord_t *primitive_x, ibz_t *content, const quat_alg_elem_t *x, const quat_order_t *order, const quat_alg_t *alg); -int quat_test_alg_make_primitive(){ +// void quat_alg_make_primitive(quat_alg_coord_t *primitive_x, ibz_t *content, const quat_alg_elem_t +// *x, const quat_lattice_t *order, const quat_alg_t *alg); +int +quat_test_alg_make_primitive(void) +{ int res = 0; quat_alg_elem_t x; quat_alg_t alg; - quat_order_t order; - quat_alg_coord_t prim, x_coord_in_order; + quat_lattice_t order; + ibz_vec_4_t prim, x_coord_in_order; ibz_t cmp_cnt, cnt; quat_alg_elem_init(&x); quat_alg_init_set_ui(&alg, 19); - quat_alg_coord_init(&x_coord_in_order); - quat_alg_coord_init(&prim); - quat_order_init(&order); + ibz_vec_4_init(&x_coord_in_order); + ibz_vec_4_init(&prim); + quat_lattice_init(&order); ibz_init(&cmp_cnt); ibz_init(&cnt); - - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(order.basis[i][j]),0); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(order.basis[i][j]), 0); } } - ibz_set(&(order.basis[0][0]),1); - ibz_set(&(order.basis[0][3]),-1); - ibz_set(&(order.basis[1][1]),-2); - ibz_set(&(order.basis[2][2]),1); - ibz_set(&(order.basis[2][1]),1); - ibz_set(&(order.basis[3][3]),-3); - ibz_set(&(order.denom),6); + ibz_set(&(order.basis[0][0]), 1); + ibz_set(&(order.basis[0][3]), -1); + ibz_set(&(order.basis[1][1]), -2); + ibz_set(&(order.basis[2][2]), 1); + ibz_set(&(order.basis[2][1]), 1); + ibz_set(&(order.basis[3][3]), -3); + ibz_set(&(order.denom), 6); quat_lattice_hnf(&order); // x=1, should succeed if order - ibz_set(&(x.denom),1); - ibz_set(&(x.coord[0]),1); - ibz_set(&(x.coord[1]),0); - ibz_set(&(x.coord[2]),0); - ibz_set(&(x.coord[3]),0); + ibz_set(&(x.denom), 1); + ibz_set(&(x.coord[0]), 1); + ibz_set(&(x.coord[1]), 0); + ibz_set(&(x.coord[2]), 0); + ibz_set(&(x.coord[3]), 0); // is it an order? - res = res || (0==quat_lattice_contains(&prim,&order,&x,&alg)); + res = res || (0 == quat_lattice_contains(&prim, &order, &x)); // actual test - ibz_set(&(x.denom),6); - ibz_set(&(x.coord[0]),2); - ibz_set(&(x.coord[1]),-4); - ibz_set(&(x.coord[2]),26); - ibz_set(&(x.coord[3]),18); + ibz_set(&(x.denom), 6); + ibz_set(&(x.coord[0]), 2); + ibz_set(&(x.coord[1]), -4); + ibz_set(&(x.coord[2]), 26); + ibz_set(&(x.coord[3]), 18); - res = res || (0==quat_lattice_contains(&x_coord_in_order,&order,&x,&alg)); - ibz_content(&cmp_cnt,&x_coord_in_order); - quat_alg_make_primitive(&prim,&cnt,&x,&order,&alg); - res = res || ibz_cmp(&cnt,&cmp_cnt); - ibz_content(&cmp_cnt,&prim); + res = res || (0 == quat_lattice_contains(&x_coord_in_order, &order, &x)); + ibz_vec_4_content(&cmp_cnt, &x_coord_in_order); + quat_alg_make_primitive(&prim, &cnt, &x, &order); + res = res || ibz_cmp(&cnt, &cmp_cnt); + ibz_vec_4_content(&cmp_cnt, &prim); res = res || !ibz_is_one(&cmp_cnt); - //multiply by cnt, and compare to x in order - //assumes contains is correct - for(int i = 0; i < 4; i++){ - ibz_mul(&cmp_cnt,&cnt,&(prim[i])); - res = res || ibz_cmp(&cmp_cnt,&(x_coord_in_order[i])); + // multiply by cnt, and compare to x in order + // assumes contains is correct + for (int i = 0; i < 4; i++) { + ibz_mul(&cmp_cnt, &cnt, &(prim[i])); + res = res || ibz_cmp(&cmp_cnt, &(x_coord_in_order[i])); } - //on a primitive element - ibz_set(&(x.denom),6); - ibz_set(&(x.coord[0]),2); - ibz_set(&(x.coord[1]),-4); - ibz_set(&(x.coord[2]),5); - ibz_set(&(x.coord[3]),18); + // on a primitive element + ibz_set(&(x.denom), 6); + ibz_set(&(x.coord[0]), 2); + ibz_set(&(x.coord[1]), -4); + ibz_set(&(x.coord[2]), 5); + ibz_set(&(x.coord[3]), 18); - res = res || (0==quat_lattice_contains(&x_coord_in_order,&order,&x,&alg)); - ibz_content(&cmp_cnt,&x_coord_in_order); - quat_alg_make_primitive(&prim,&cnt,&x,&order,&alg); - res = res || ibz_cmp(&cnt,&cmp_cnt); - ibz_content(&cmp_cnt,&prim); + res = res || (0 == quat_lattice_contains(&x_coord_in_order, &order, &x)); + ibz_vec_4_content(&cmp_cnt, &x_coord_in_order); + quat_alg_make_primitive(&prim, &cnt, &x, &order); + res = res || ibz_cmp(&cnt, &cmp_cnt); + ibz_vec_4_content(&cmp_cnt, &prim); res = res || !ibz_is_one(&cmp_cnt); // this x is is primitive, so cnt should be 1 res = res || !ibz_is_one(&cnt); - //multiply by cnt, and compare to x in order - //assumes contains is correct - for(int i = 0; i < 4; i++){ - ibz_mul(&cmp_cnt,&cnt,&(prim[i])); - res = res || ibz_cmp(&cmp_cnt,&(x_coord_in_order[i])); + // multiply by cnt, and compare to x in order + // assumes contains is correct + for (int i = 0; i < 4; i++) { + ibz_mul(&cmp_cnt, &cnt, &(prim[i])); + res = res || ibz_cmp(&cmp_cnt, &(x_coord_in_order[i])); } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test alg_make_primitive failed\n"); } quat_alg_elem_finalize(&x); quat_alg_finalize(&alg); - quat_alg_coord_finalize(&x_coord_in_order); - quat_alg_coord_finalize(&prim); - quat_order_finalize(&order); + ibz_vec_4_finalize(&x_coord_in_order); + ibz_vec_4_finalize(&prim); + quat_lattice_finalize(&order); ibz_finalize(&cmp_cnt); ibz_finalize(&cnt); - return(res); + return (res); } -//int quat_alg_is_primitive(const quat_alg_elem_t *x, const quat_order_t *order, const quat_alg_t *alg): -int quat_test_alg_is_primitive(){ - int res = 0; - ibz_t cnt; - quat_alg_elem_t x; - quat_alg_t alg; - quat_order_t order; - quat_alg_coord_t coord; - quat_alg_elem_init(&x); - quat_alg_init_set_ui(&alg, 19); - quat_order_init(&order); - quat_alg_coord_init(&coord); - ibz_init(&cnt); - - - - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(order.basis[i][j]),0); - } - } - ibz_set(&(order.basis[0][0]),1); - ibz_set(&(order.basis[0][3]),-1); - ibz_set(&(order.basis[1][1]),-2); - ibz_set(&(order.basis[2][2]),1); - ibz_set(&(order.basis[2][1]),1); - ibz_set(&(order.basis[3][3]),-3); - ibz_set(&(order.denom),6); - quat_lattice_hnf(&order); - // x=1, should succeed if order - ibz_set(&(x.denom),1); - ibz_set(&(x.coord[0]),1); - ibz_set(&(x.coord[1]),0); - ibz_set(&(x.coord[2]),0); - ibz_set(&(x.coord[3]),0); - // is it an order? - res = res || (0==quat_lattice_contains(&coord,&order,&x,&alg)); - - // actual test, this is not primitive - ibz_set(&(x.denom),6); - ibz_set(&(x.coord[0]),2); - ibz_set(&(x.coord[1]),-4); - ibz_set(&(x.coord[2]),26); - ibz_set(&(x.coord[3]),18); - // x not primitive - res = res || (0==quat_lattice_contains(&coord,&order,&x,&alg)); - ibz_content(&cnt,&coord); - res = res || ibz_is_one(&cnt); - res = res || quat_alg_is_primitive(&x,&order,&alg); - - // actual test, this is primitive - ibz_set(&(x.denom),6); - ibz_set(&(x.coord[0]),2); - ibz_set(&(x.coord[1]),-4); - ibz_set(&(x.coord[2]),5); - ibz_set(&(x.coord[3]),18); - // x is primitive - res = res || (0==quat_lattice_contains(&coord,&order,&x,&alg)); - ibz_content(&cnt,&coord); - res = res || !ibz_is_one(&cnt); - res = res || !quat_alg_is_primitive(&x,&order,&alg); - if (res != 0){ - printf("Quaternion unit test alg_is_primitive failed\n"); - } - quat_alg_elem_finalize(&x); - quat_alg_finalize(&alg); - quat_order_finalize(&order); - quat_alg_coord_finalize(&coord); - ibz_finalize(&cnt); - return(res); -} - -//void quat_alg_normalize(quat_alg_elem_t *x); -int quat_test_alg_normalize(){ +// void quat_alg_normalize(quat_alg_elem_t *x); +int +quat_test_alg_normalize(void) +{ int res = 0; quat_alg_elem_t x, cmp; ibz_t gcd; @@ -972,11 +798,12 @@ int quat_test_alg_normalize(){ ibz_set(&(cmp.coord[3]), 30); ibz_set(&(cmp.denom), 25); quat_alg_normalize(&x); - res = res || ibz_cmp(&(x.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(x.coord[i]),&(cmp.coord[i])); + res = res || ibz_cmp(&(x.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(x.coord[i]), &(cmp.coord[i])); } - //divide by gcd + // divide by gcd ibz_set(&(x.coord[0]), -36); ibz_set(&(x.coord[1]), 18); ibz_set(&(x.coord[2]), 0); @@ -988,11 +815,12 @@ int quat_test_alg_normalize(){ ibz_set(&(cmp.coord[3]), -50); ibz_set(&(cmp.denom), 8); quat_alg_normalize(&x); - res = res || ibz_cmp(&(x.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(x.coord[i]),&(cmp.coord[i])); + res = res || ibz_cmp(&(x.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(x.coord[i]), &(cmp.coord[i])); } - //divide by gcd + // divide by gcd ibz_set(&(x.coord[0]), -36); ibz_set(&(x.coord[1]), 18); ibz_set(&(x.coord[2]), 0); @@ -1004,125 +832,166 @@ int quat_test_alg_normalize(){ ibz_set(&(cmp.coord[3]), 50); ibz_set(&(cmp.denom), 1); quat_alg_normalize(&x); - res = res || ibz_cmp(&(x.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(x.coord[i]),&(cmp.coord[i])); + res = res || ibz_cmp(&(x.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(x.coord[i]), &(cmp.coord[i])); } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test alg_normalize failed\n"); } quat_alg_elem_finalize(&x); quat_alg_elem_finalize(&cmp); ibz_finalize(&gcd); - return(res); + return (res); } -//int quat_alg_elem_is_zero(const quat_alg_elem_t *x); -int quat_test_alg_elem_is_zero(){ +// int quat_alg_elem_equal(const quat_alg_elem_t *a, const quat_alg_elem_t *b); +int +quat_test_alg_elem_equal(void) +{ + int res = 0; + quat_alg_elem_t a, b; + quat_alg_elem_init(&a); + quat_alg_elem_init(&b); + ibz_vec_4_set(&(a.coord), 1, -3, -2, 2); + ibz_set(&(a.denom), 5); + ibz_vec_4_set(&(b.coord), 3, -9, -6, 6); + ibz_set(&(b.denom), 15); + res = res || !quat_alg_elem_equal(&a, &b); + res = res || !quat_alg_elem_equal(&a, &a); + res = res || !quat_alg_elem_equal(&b, &b); + ibz_vec_4_set(&(a.coord), 1, -3, -2, 2); + ibz_set(&(a.denom), 5); + ibz_vec_4_set(&(b.coord), 3, -9, -6, 3); + ibz_set(&(b.denom), 15); + res = res || quat_alg_elem_equal(&a, &b); + ibz_vec_4_set(&(a.coord), 5, -15, -10, 10); + ibz_set(&(a.denom), 25); + ibz_vec_4_set(&(b.coord), 3, -9, -6, 6); + ibz_set(&(b.denom), 15); + res = res || !quat_alg_elem_equal(&a, &b); + ibz_vec_4_set(&(a.coord), 5, -15, -10, 10); + ibz_set(&(a.denom), 25); + ibz_vec_4_set(&(b.coord), 0, -9, -6, 6); + ibz_set(&(b.denom), 5); + res = res || quat_alg_elem_equal(&a, &b); + if (res != 0) { + printf("Quaternion unit test alg_elem_equal failed\n"); + } + quat_alg_elem_finalize(&a); + quat_alg_elem_finalize(&b); + return (res); +} + +// int quat_alg_elem_is_zero(const quat_alg_elem_t *x); +int +quat_test_alg_elem_is_zero(void) +{ int res = 0; quat_alg_elem_t x; quat_alg_elem_init(&x); - ibz_set(&(x.denom),1); - ibz_set(&(x.coord[0]),0); - ibz_set(&(x.coord[1]),0); - ibz_set(&(x.coord[2]),0); - ibz_set(&(x.coord[3]),0); - res = res | (1-quat_alg_elem_is_zero(&x)); - ibz_set(&(x.denom),56865); - res = res | (1-quat_alg_elem_is_zero(&x)); - ibz_set(&(x.denom),0); + ibz_set(&(x.denom), 1); + ibz_set(&(x.coord[0]), 0); + ibz_set(&(x.coord[1]), 0); + ibz_set(&(x.coord[2]), 0); + ibz_set(&(x.coord[3]), 0); + res = res | (1 - quat_alg_elem_is_zero(&x)); + ibz_set(&(x.denom), 56865); + res = res | (1 - quat_alg_elem_is_zero(&x)); + ibz_set(&(x.denom), 0); // maybe failure should be accepted here, but according to doc, this is still 0 - res = res | (1-quat_alg_elem_is_zero(&x)); - ibz_set(&(x.coord[3]),1); + res = res | (1 - quat_alg_elem_is_zero(&x)); + ibz_set(&(x.coord[3]), 1); res = res | quat_alg_elem_is_zero(&x); - ibz_set(&(x.denom),56865); + ibz_set(&(x.denom), 56865); res = res | quat_alg_elem_is_zero(&x); - ibz_set(&(x.coord[3]),-1); + ibz_set(&(x.coord[3]), -1); res = res | quat_alg_elem_is_zero(&x); - ibz_set(&(x.coord[2]),1); - ibz_set(&(x.coord[3]),0); + ibz_set(&(x.coord[2]), 1); + ibz_set(&(x.coord[3]), 0); res = res | quat_alg_elem_is_zero(&x); - ibz_set(&(x.coord[2]),-20); + ibz_set(&(x.coord[2]), -20); res = res | quat_alg_elem_is_zero(&x); - ibz_set(&(x.coord[1]),1); - ibz_set(&(x.coord[2]),0); + ibz_set(&(x.coord[1]), 1); + ibz_set(&(x.coord[2]), 0); res = res | quat_alg_elem_is_zero(&x); - ibz_set(&(x.coord[1]),-50000); + ibz_set(&(x.coord[1]), -50000); res = res | quat_alg_elem_is_zero(&x); - ibz_set(&(x.coord[0]),1); - ibz_set(&(x.coord[1]),0); + ibz_set(&(x.coord[0]), 1); + ibz_set(&(x.coord[1]), 0); res = res | quat_alg_elem_is_zero(&x); - ibz_set(&(x.coord[0]),-90000); + ibz_set(&(x.coord[0]), -90000); res = res | quat_alg_elem_is_zero(&x); - ibz_set(&(x.coord[0]),0); - ibz_set(&(x.coord[1]),-500); - ibz_set(&(x.coord[2]),20); - ibz_set(&(x.coord[3]),0); + ibz_set(&(x.coord[0]), 0); + ibz_set(&(x.coord[1]), -500); + ibz_set(&(x.coord[2]), 20); + ibz_set(&(x.coord[3]), 0); res = res | quat_alg_elem_is_zero(&x); - ibz_set(&(x.coord[0]),19); - ibz_set(&(x.coord[1]),-500); - ibz_set(&(x.coord[2]),20); - ibz_set(&(x.coord[3]),-2); + ibz_set(&(x.coord[0]), 19); + ibz_set(&(x.coord[1]), -500); + ibz_set(&(x.coord[2]), 20); + ibz_set(&(x.coord[3]), -2); res = res | quat_alg_elem_is_zero(&x); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test alg_elem_is_zero failed\n"); } quat_alg_elem_finalize(&x); - return(res); + return (res); } -//int quat_alg_coord_is_zero(const quat_alg_coord_t *x); -int quat_test_alg_coord_is_zero(){ +// void quat_alg_elem_set(quat_alg_elem_t *elem, int32_t denom, int32_t coord0, int32_t coord1, +// int32_t coord2, int32_t coord3) +int +quat_test_alg_elem_set(void) +{ int res = 0; - quat_alg_coord_t x; - quat_alg_coord_init(&x); - ibz_set(&(x[0]),0); - ibz_set(&(x[1]),0); - ibz_set(&(x[2]),0); - ibz_set(&(x[3]),0); - res = res | (1-quat_alg_coord_is_zero(&x)); - ibz_set(&(x[3]),1); - res = res | quat_alg_coord_is_zero(&x); - ibz_set(&(x[3]),-1); - res = res | quat_alg_coord_is_zero(&x); - ibz_set(&(x[2]),1); - ibz_set(&(x[3]),0); - res = res | quat_alg_coord_is_zero(&x); - ibz_set(&(x[2]),-20); - res = res | quat_alg_coord_is_zero(&x); - ibz_set(&(x[1]),1); - ibz_set(&(x[2]),0); - res = res | quat_alg_coord_is_zero(&x); - ibz_set(&(x[1]),-50000); - res = res | quat_alg_coord_is_zero(&x); - ibz_set(&(x[0]),1); - ibz_set(&(x[1]),0); - res = res | quat_alg_coord_is_zero(&x); - ibz_set(&(x[0]),-90000); - res = res | quat_alg_coord_is_zero(&x); - ibz_set(&(x[0]),0); - ibz_set(&(x[1]),-500); - ibz_set(&(x[2]),20); - ibz_set(&(x[3]),0); - res = res | quat_alg_coord_is_zero(&x); - ibz_set(&(x[0]),19); - ibz_set(&(x[1]),-500); - ibz_set(&(x[2]),20); - ibz_set(&(x[3]),-2); - res = res | quat_alg_coord_is_zero(&x); - if (res != 0){ - printf("Quaternion unit test alg_coord_is_zero failed\n"); + quat_alg_elem_t elem; + quat_alg_elem_init(&elem); + quat_alg_elem_set(&elem, 5, 1, 2, 3, 4); + res = res || (ibz_cmp_int32(&(elem.coord[0]), 1) != 0); + res = res || (ibz_cmp_int32(&(elem.coord[1]), 2) != 0); + res = res || (ibz_cmp_int32(&(elem.coord[2]), 3) != 0); + res = res || (ibz_cmp_int32(&(elem.coord[3]), 4) != 0); + res = res || (ibz_cmp_int32(&(elem.denom), 5) != 0); + + if (res != 0) { + printf("Quaternion unit test alg_elem_set failed\n"); } - quat_alg_coord_finalize(&x); - return(res); + quat_alg_elem_finalize(&elem); + return (res); } - -//void quat_alg_elem_set(quat_alg_elem_t *elem, const ibz_t *denom, const ibz_t *coord0,const ibz_t *coord1,const ibz_t *coord2,const ibz_t *coord3){ -int quat_test_alg_elem_copy_ibz(){ +// void quat_alg_elem_copy(quat_alg_elem_t *copy, const quat_alg_elem_t *copied); +int +quat_test_alg_elem_copy() +{ int res = 0; - ibz_t a,b,c,d,q; + quat_alg_elem_t elem, copy; + quat_alg_elem_init(&elem); + quat_alg_elem_init(©); + quat_alg_elem_set(&elem, 7, -2, 9, 2091, 21); + quat_alg_elem_copy(©, &elem); + res = res || !quat_alg_elem_equal(&elem, ©); + quat_alg_elem_set(&elem, 3, -6, 9, 2091, 21); + quat_alg_elem_copy(©, &elem); + res = res || !quat_alg_elem_equal(&elem, ©); + if (res) { + printf("Quaternion unit test alg_elem_copy failed\n"); + } + quat_alg_elem_finalize(&elem); + quat_alg_elem_finalize(©); + return (res); +} + +// void quat_alg_elem_copy_ibz(quat_alg_elem_t *elem, const ibz_t *denom, const ibz_t *coord0,const +// ibz_t *coord1,const ibz_t *coord2,const ibz_t *coord3){ +int +quat_test_alg_elem_copy_ibz(void) +{ + int res = 0; + ibz_t a, b, c, d, q; quat_alg_elem_t elem; quat_alg_elem_init(&elem); ibz_init(&a); @@ -1130,19 +999,19 @@ int quat_test_alg_elem_copy_ibz(){ ibz_init(&c); ibz_init(&d); ibz_init(&q); - ibz_set(&a,1); - ibz_set(&b,2); - ibz_set(&c,3); - ibz_set(&d,4); - ibz_set(&q,5); - quat_alg_elem_copy_ibz(&elem,&q,&a,&b,&c,&d); - res = res || ibz_cmp(&(elem.coord[0]),&a); - res = res || ibz_cmp(&(elem.coord[1]),&b); - res = res || ibz_cmp(&(elem.coord[2]),&c); - res = res || ibz_cmp(&(elem.coord[3]),&d); - res = res || ibz_cmp(&(elem.denom),&q); + ibz_set(&a, 1); + ibz_set(&b, 2); + ibz_set(&c, 3); + ibz_set(&d, 4); + ibz_set(&q, 5); + quat_alg_elem_copy_ibz(&elem, &q, &a, &b, &c, &d); + res = res || ibz_cmp(&(elem.coord[0]), &a); + res = res || ibz_cmp(&(elem.coord[1]), &b); + res = res || ibz_cmp(&(elem.coord[2]), &c); + res = res || ibz_cmp(&(elem.coord[3]), &d); + res = res || ibz_cmp(&(elem.denom), &q); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test alg_elem_copy_ibz failed\n"); } ibz_finalize(&a); @@ -1151,31 +1020,14 @@ int quat_test_alg_elem_copy_ibz(){ ibz_finalize(&d); ibz_finalize(&q); quat_alg_elem_finalize(&elem); - return(res); + return (res); } - -//void quat_alg_elem_set(quat_alg_elem_t *elem, int64_t denom, int64_t coord0, int64_t coord1, int64_t coord2, int64_t coord3) -int quat_test_alg_elem_set(){ - int res = 0; - quat_alg_elem_t elem; - quat_alg_elem_init(&elem); - quat_alg_elem_set(&elem,5,1,2,3,4); - res = res || (ibz_get(&(elem.coord[0])) != 1); - res = res || (ibz_get(&(elem.coord[1])) != 2); - res = res || (ibz_get(&(elem.coord[2])) != 3); - res = res || (ibz_get(&(elem.coord[3])) != 4); - res = res || (ibz_get(&(elem.denom)) != 5); - - if (res != 0){ - printf("Quaternion unit test alg_elem_set failed\n"); - } - quat_alg_elem_finalize(&elem); - return(res); -} - -//void quat_alg_elem_mul_by_scalar(quat_alg_elem_t *res, const ibz_t *scalar, const quat_alg_elem_t *elem); -int quat_test_alg_elem_mul_by_scalar(){ +// void quat_alg_elem_mul_by_scalar(quat_alg_elem_t *res, const ibz_t *scalar, const quat_alg_elem_t +// *elem); +int +quat_test_alg_elem_mul_by_scalar(void) +{ int res = 0; ibz_t scalar; quat_alg_elem_t elem, cmp, prod; @@ -1184,109 +1036,73 @@ int quat_test_alg_elem_mul_by_scalar(){ quat_alg_elem_init(&prod); quat_alg_elem_init(&cmp); - ibz_set(&scalar,6); - ibz_set(&(elem.denom),2); - ibz_set(&(elem.coord[0]),2); - ibz_set(&(elem.coord[1]),-4); - ibz_set(&(elem.coord[2]),5); - ibz_set(&(elem.coord[3]),25); - ibz_set(&(cmp.denom),2); - ibz_set(&(cmp.coord[0]),12); - ibz_set(&(cmp.coord[1]),-24); - ibz_set(&(cmp.coord[2]),30); - ibz_set(&(cmp.coord[3]),150); - - quat_alg_elem_mul_by_scalar(&prod,&scalar,&elem); - res = res || ibz_cmp(&(prod.coord[0]),&(cmp.coord[0])); - res = res || ibz_cmp(&(prod.coord[1]),&(cmp.coord[1])); - res = res || ibz_cmp(&(prod.coord[2]),&(cmp.coord[2])); - res = res || ibz_cmp(&(prod.coord[3]),&(cmp.coord[3])); - res = res || ibz_cmp(&(prod.denom),&(cmp.denom)); + ibz_set(&scalar, 6); + ibz_set(&(elem.denom), 2); + ibz_set(&(elem.coord[0]), 2); + ibz_set(&(elem.coord[1]), -4); + ibz_set(&(elem.coord[2]), 5); + ibz_set(&(elem.coord[3]), 25); + ibz_set(&(cmp.denom), 2); + ibz_set(&(cmp.coord[0]), 12); + ibz_set(&(cmp.coord[1]), -24); + ibz_set(&(cmp.coord[2]), 30); + ibz_set(&(cmp.coord[3]), 150); + + quat_alg_elem_mul_by_scalar(&prod, &scalar, &elem); + res = res || ibz_cmp(&(prod.coord[0]), &(cmp.coord[0])); + res = res || ibz_cmp(&(prod.coord[1]), &(cmp.coord[1])); + res = res || ibz_cmp(&(prod.coord[2]), &(cmp.coord[2])); + res = res || ibz_cmp(&(prod.coord[3]), &(cmp.coord[3])); + res = res || ibz_cmp(&(prod.denom), &(cmp.denom)); // denom should not be modified - res = res || ibz_cmp(&(prod.denom),&(elem.denom)); + res = res || ibz_cmp(&(prod.denom), &(elem.denom)); - ibz_set(&scalar,-3); - ibz_set(&(cmp.denom),2); - ibz_set(&(cmp.coord[0]),-6); - ibz_set(&(cmp.coord[1]),12); - ibz_set(&(cmp.coord[2]),-15); - ibz_set(&(cmp.coord[3]),-75); - - quat_alg_elem_mul_by_scalar(&prod,&scalar,&elem); - res = res || ibz_cmp(&(prod.coord[0]),&(cmp.coord[0])); - res = res || ibz_cmp(&(prod.coord[1]),&(cmp.coord[1])); - res = res || ibz_cmp(&(prod.coord[2]),&(cmp.coord[2])); - res = res || ibz_cmp(&(prod.coord[3]),&(cmp.coord[3])); - res = res || ibz_cmp(&(prod.denom),&(cmp.denom)); + ibz_set(&scalar, -3); + ibz_set(&(cmp.denom), 2); + ibz_set(&(cmp.coord[0]), -6); + ibz_set(&(cmp.coord[1]), 12); + ibz_set(&(cmp.coord[2]), -15); + ibz_set(&(cmp.coord[3]), -75); - if (res != 0){ + quat_alg_elem_mul_by_scalar(&prod, &scalar, &elem); + res = res || ibz_cmp(&(prod.coord[0]), &(cmp.coord[0])); + res = res || ibz_cmp(&(prod.coord[1]), &(cmp.coord[1])); + res = res || ibz_cmp(&(prod.coord[2]), &(cmp.coord[2])); + res = res || ibz_cmp(&(prod.coord[3]), &(cmp.coord[3])); + res = res || ibz_cmp(&(prod.denom), &(cmp.denom)); + + if (res != 0) { printf("Quaternion unit test alg_elem_mul_by_scalar failed\n"); } ibz_finalize(&scalar); quat_alg_elem_finalize(&elem); quat_alg_elem_finalize(&prod); quat_alg_elem_finalize(&cmp); - return(res); -} - - -//void quat_alg_rightmul_mat(ibz_mat_4x4_t *mulmat, const quat_alg_elem_t *a, const quat_alg_t *alg); -int quat_test_alg_rightmul_mat(){ - int res = 0; - ibz_mat_4x4_t mat; - quat_alg_t alg; - quat_alg_elem_t elem, prod, test, prodmat; - quat_alg_init_set_ui(&alg,19); - ibz_mat_4x4_init(&mat); - quat_alg_elem_init(&prod); - quat_alg_elem_init(&prodmat); - quat_alg_elem_init(&test); - quat_alg_elem_init(&elem); - - quat_alg_elem_set(&elem, 2,4,2,6,8); - quat_alg_elem_set(&elem, 12,9,81,27,-6); - quat_alg_rightmul_mat(&mat,&elem,&alg); - ibz_mat_4x4_eval(&(prodmat.coord),&mat,&(test.coord)); - ibz_mul(&(prodmat.denom),&(test.denom),&(elem.denom)); - quat_alg_mul(&prod,&test,&elem,&alg); - quat_alg_sub(&test,&prod,&prod); - res = res || !quat_alg_elem_is_zero(&test); - - if (res != 0){ - printf("Quaternion unit test alg_rightmul_mat failed\n"); - } - ibz_mat_4x4_finalize(&mat); - quat_alg_elem_finalize(&prod); - quat_alg_elem_finalize(&prodmat); - quat_alg_elem_finalize(&test); - quat_alg_elem_finalize(&elem); - quat_alg_finalize(&alg); - return(res); + return (res); } // run all previous tests -int quat_test_algebra(){ +int +quat_test_algebra(void) +{ int res = 0; printf("\nRunning quaternion tests of algebra operations\n"); res = res | quat_test_init_set_ui(); - res = res | quat_test_alg_coord_add(); - res = res | quat_test_alg_coord_sub(); + res = res | quat_test_alg_coord_mul(); res = res | quat_test_alg_equal_denom(); res = res | quat_test_alg_add(); res = res | quat_test_alg_sub(); res = res | quat_test_alg_mul(); res = res | quat_test_alg_norm(); - res = res | quat_test_alg_trace(); res = res | quat_test_alg_scalar(); res = res | quat_test_alg_conj(); res = res | quat_test_alg_make_primitive(); - res = res | quat_test_alg_is_primitive(); res = res | quat_test_alg_normalize(); + res = res | quat_test_alg_elem_equal(); res = res | quat_test_alg_elem_is_zero(); - res = res | quat_test_alg_coord_is_zero(); - res = res | quat_test_alg_elem_copy_ibz(); res = res | quat_test_alg_elem_set(); + res = res | quat_test_alg_elem_copy_ibz(); + res = res | quat_test_alg_elem_copy(); res = res | quat_test_alg_elem_mul_by_scalar(); - res = res | quat_test_alg_rightmul_mat(); - return(res); + return (res); } diff --git a/src/quaternion/ref/generic/test/dim2.c b/src/quaternion/ref/generic/test/dim2.c index be3d64f..16d5efc 100644 --- a/src/quaternion/ref/generic/test/dim2.c +++ b/src/quaternion/ref/generic/test/dim2.c @@ -1,16 +1,16 @@ #include "quaternion_tests.h" // void ibz_vec_2_set(ibz_vec_2_t *vec, int a0, int a1); -int quat_test_dim2_ibz_vec_2_set() +int +quat_test_dim2_ibz_vec_2_set(void) { int res = 0; ibz_vec_2_t vec; ibz_vec_2_init(&vec); ibz_vec_2_set(&vec, 2, 5); - res = res || !(ibz_get(&(vec[0])) == 2); - res = res || !(ibz_get(&(vec[1])) == 5); - if (res != 0) - { + res = res || (ibz_cmp_int32(&(vec[0]), 2) != 0); + res = res || (ibz_cmp_int32(&(vec[1]), 5) != 0); + if (res != 0) { printf("Quaternion unit test dim2_ibz_vec_2_set failed\n"); } ibz_vec_2_finalize(&vec); @@ -18,66 +18,105 @@ int quat_test_dim2_ibz_vec_2_set() } // void ibz_mat_2x2_set(ibz_mat_2x2_t *mat, int a00, int a01, int a10, int a11); -int quat_test_dim2_ibz_mat_2x2_set() +int +quat_test_dim2_ibz_mat_2x2_set(void) { int res = 0; ibz_mat_2x2_t mat; ibz_mat_2x2_init(&mat); ibz_mat_2x2_set(&mat, 2, 7, -1, 5); - res = res || !(ibz_get(&(mat[0][0])) == 2); - res = res || !(ibz_get(&(mat[0][1])) == 7); - res = res || !(ibz_get(&(mat[1][0])) == -1); - res = res || !(ibz_get(&(mat[1][1])) == 5); - if (res != 0) - { + res = res || (ibz_cmp_int32(&(mat[0][0]), 2) != 0); + res = res || (ibz_cmp_int32(&(mat[0][1]), 7) != 0); + res = res || (ibz_cmp_int32(&(mat[1][0]), -1) != 0); + res = res || (ibz_cmp_int32(&(mat[1][1]), 5) != 0); + if (res != 0) { printf("Quaternion unit test dim2_ibz_mat_2x2_set failed\n"); } ibz_mat_2x2_finalize(&mat); return (res); } -//void ibz_mat_2x2_det_from_ibz(ibz_t *det, const ibz_t *a11, const ibz_t *a12, const ibz_t *a21, const ibz_t *a22); -int quat_test_dim2_ibz_mat_2x2_det_from_ibz(){ +// void ibz_mat_2x2_copy(ibz_vec_2_t *copy, const ibz_mat_2x2_t *copied); +int +quat_test_dim2_ibz_mat_2x2_copy(void) +{ int res = 0; - ibz_t det,cmp,a11,a12,a21,a22; + ibz_mat_2x2_t mat, copy; + ibz_mat_2x2_init(&mat); + ibz_mat_2x2_init(©); + + ibz_mat_2x2_set(&mat, 1, -1, 2, 4); + res = res || (0 == ibz_cmp_int32(&(copy[0][0]), 1)); + res = res || (0 == ibz_cmp_int32(&(copy[0][1]), -1)); + res = res || (0 == ibz_cmp_int32(&(copy[1][0]), 2)); + res = res || (0 == ibz_cmp_int32(&(copy[1][1]), 4)); + res = res || (0 != ibz_cmp_int32(&(mat[0][0]), 1)); + res = res || (0 != ibz_cmp_int32(&(mat[0][1]), -1)); + res = res || (0 != ibz_cmp_int32(&(mat[1][0]), 2)); + res = res || (0 != ibz_cmp_int32(&(mat[1][1]), 4)); + ibz_mat_2x2_copy(©, &mat); + res = res || (0 != ibz_cmp_int32(&(copy[0][0]), 1)); + res = res || (0 != ibz_cmp_int32(&(copy[0][1]), -1)); + res = res || (0 != ibz_cmp_int32(&(copy[1][0]), 2)); + res = res || (0 != ibz_cmp_int32(&(copy[1][1]), 4)); + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + res = res || (0 != ibz_cmp(&(mat[i][j]), &(copy[i][j]))); + } + } + + if (res != 0) { + printf("Quaternion unit test dim2_ibz_mat_2x2_copy failed\n"); + } + ibz_mat_2x2_finalize(&mat); + ibz_mat_2x2_finalize(©); + return (res); +} + +// void ibz_mat_2x2_det_from_ibz(ibz_t *det, const ibz_t *a11, const ibz_t *a12, const ibz_t *a21, +// const ibz_t *a22); +int +quat_test_dim2_ibz_mat_2x2_det_from_ibz(void) +{ + int res = 0; + ibz_t det, cmp, a11, a12, a21, a22; ibz_init(&a11); ibz_init(&a12); ibz_init(&a21); ibz_init(&a22); ibz_init(&det); ibz_init(&cmp); - - ibz_set(&a11,1); - ibz_set(&a12,0); - ibz_set(&a21,0); - ibz_set(&a22,1); - ibz_set(&cmp,1); - ibz_mat_2x2_det_from_ibz(&det,&a11,&a12,&a21,&a22); - res = res || ibz_cmp(&cmp,&det); - ibz_set(&a11,2); - ibz_set(&a12,3); - ibz_set(&a21,1); - ibz_set(&a22,-2); - ibz_set(&cmp,-7); - ibz_mat_2x2_det_from_ibz(&det,&a11,&a12,&a21,&a22); - res = res || ibz_cmp(&cmp,&det); + ibz_set(&a11, 1); + ibz_set(&a12, 0); + ibz_set(&a21, 0); + ibz_set(&a22, 1); + ibz_set(&cmp, 1); + ibz_mat_2x2_det_from_ibz(&det, &a11, &a12, &a21, &a22); + res = res || ibz_cmp(&cmp, &det); - ibz_set(&a11,0); - ibz_set(&a12,3); - ibz_set(&a21,-1); - ibz_set(&a22,0); - ibz_set(&cmp,3); - ibz_mat_2x2_det_from_ibz(&det,&a11,&a12,&a21,&a22); - res = res || ibz_cmp(&cmp,&det); + ibz_set(&a11, 2); + ibz_set(&a12, 3); + ibz_set(&a21, 1); + ibz_set(&a22, -2); + ibz_set(&cmp, -7); + ibz_mat_2x2_det_from_ibz(&det, &a11, &a12, &a21, &a22); + res = res || ibz_cmp(&cmp, &det); - ibz_set(&a11,2); - ibz_set(&cmp,0); - ibz_mat_2x2_det_from_ibz(&a11,&a11,&a11,&a11,&a11); - res = res || ibz_cmp(&cmp,&a11); + ibz_set(&a11, 0); + ibz_set(&a12, 3); + ibz_set(&a21, -1); + ibz_set(&a22, 0); + ibz_set(&cmp, 3); + ibz_mat_2x2_det_from_ibz(&det, &a11, &a12, &a21, &a22); + res = res || ibz_cmp(&cmp, &det); + ibz_set(&a11, 2); + ibz_set(&cmp, 0); + ibz_mat_2x2_det_from_ibz(&a11, &a11, &a11, &a11, &a11); + res = res || ibz_cmp(&cmp, &a11); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim2_ibz_mat_2x2_det_from_ibz failed\n"); } ibz_finalize(&a11); @@ -90,7 +129,8 @@ int quat_test_dim2_ibz_mat_2x2_det_from_ibz(){ } // void ibz_mat_2x2_eval(ibz_vec_2_t *res, const ibz_mat_2x2_t *mat, const ibz_vec_2_t *vec); -int quat_test_dim2_ibz_mat_2x2_eval() +int +quat_test_dim2_ibz_mat_2x2_eval(void) { int res = 0; ibz_vec_2_t vec, ret, cmp; @@ -114,8 +154,7 @@ int quat_test_dim2_ibz_mat_2x2_eval() res = res || ibz_cmp(&(vec[0]), &(cmp[0])); res = res || ibz_cmp(&(vec[1]), &(cmp[1])); - if (res != 0) - { + if (res != 0) { printf("Quaternion unit test dim2_ibz_mat_2x2_eval failed\n"); } ibz_vec_2_finalize(&vec); @@ -127,8 +166,10 @@ int quat_test_dim2_ibz_mat_2x2_eval() // modular 2x2 operations -// void ibz_2x2_mul_mod(ibz_mat_2x2_t *prod, const ibz_mat_2x2_t *mat_a, const ibz_mat_2x2_t *mat_b, const ibz_t *m); -int quat_test_dim2_ibz_mat_2x2_mul_mod() +// void ibz_2x2_mul_mod(ibz_mat_2x2_t *prod, const ibz_mat_2x2_t *mat_a, const ibz_mat_2x2_t *mat_b, +// const ibz_t *m); +int +quat_test_dim2_ibz_mat_2x2_mul_mod(void) { int res = 0; ibz_t m; @@ -164,8 +205,7 @@ int quat_test_dim2_ibz_mat_2x2_mul_mod() res = res || ibz_cmp(&(a[1][0]), &(cmp[1][0])); res = res || ibz_cmp(&(a[1][1]), &(cmp[1][1])); - if (res != 0) - { + if (res != 0) { printf("Quaternion unit test dim2_ibz_mat_2x2_mul_mod failed\n"); } ibz_mat_2x2_finalize(&a); @@ -176,8 +216,9 @@ int quat_test_dim2_ibz_mat_2x2_mul_mod() return (res); } -// int ibz_2x2_inv_mod(ibz_mat_2x2_t *inv, const ibz_mat_2x2_t *mat, const ibz_t *m); -int quat_test_dim2_ibz_mat_2x2_inv_mod() +// int ibz_mat_2x2_inv_mod(ibz_mat_2x2_t *inv, const ibz_mat_2x2_t *mat, const ibz_t *m); +int +quat_test_dim2_ibz_mat_2x2_inv_mod(void) { int res = 0; ibz_t m; @@ -192,48 +233,41 @@ int quat_test_dim2_ibz_mat_2x2_inv_mod() // inverse exists ibz_set(&m, 7); ibz_mat_2x2_set(&a, 2, -3, 1, 3); - if (ibz_2x2_inv_mod(&inv, &a, &m)) - { + if (ibz_mat_2x2_inv_mod(&inv, &a, &m)) { // ibz_2x2_mul_mod(&prod,&a,&inv, &m); ibz_2x2_mul_mod(&prod, &inv, &a, &m); res = res || ibz_cmp(&(prod[0][0]), &(id[0][0])); res = res || ibz_cmp(&(prod[0][1]), &(id[0][1])); res = res || ibz_cmp(&(prod[1][0]), &(id[1][0])); res = res || ibz_cmp(&(prod[1][1]), &(id[1][1])); - } - else - { + } else { res = 1; } ibz_set(&m, 12); ibz_mat_2x2_set(&a, 2, 7, 1, -2); ibz_mat_2x2_set(&inv, 2, 7, 1, -2); - if (ibz_2x2_inv_mod(&inv, &inv, &m)) - { + if (ibz_mat_2x2_inv_mod(&inv, &inv, &m)) { ibz_2x2_mul_mod(&prod, &a, &inv, &m); res = res || ibz_cmp(&(prod[0][0]), &(id[0][0])); res = res || ibz_cmp(&(prod[0][1]), &(id[0][1])); res = res || ibz_cmp(&(prod[1][0]), &(id[1][0])); res = res || ibz_cmp(&(prod[1][1]), &(id[1][1])); - } - else - { + } else { res = 1; } // no inverse ibz_set(&m, 25); ibz_mat_2x2_set(&a, 2, -2, -1, 1); - res = res || ibz_2x2_inv_mod(&inv, &a, &m); + res = res || ibz_mat_2x2_inv_mod(&inv, &a, &m); ibz_set(&m, 7); ibz_mat_2x2_set(&a, 2, 3, 1, -2); - res = res || ibz_2x2_inv_mod(&inv, &a, &m); + res = res || ibz_mat_2x2_inv_mod(&inv, &a, &m); ibz_set(&m, 25); ibz_mat_2x2_set(&a, 2, 1, 1, -2); - res = res || ibz_2x2_inv_mod(&inv, &a, &m); + res = res || ibz_mat_2x2_inv_mod(&inv, &a, &m); - if (res != 0) - { + if (res != 0) { printf("Quaternion unit test dim2_ibz_mat_2x2_inv_mod failed\n"); } ibz_mat_2x2_finalize(&a); @@ -244,944 +278,19 @@ int quat_test_dim2_ibz_mat_2x2_inv_mod() return (res); } - -// cvp helper functions - -// int quat_dim2_lattice_contains(ibz_mat_2x2_t *basis, ibz_t *coord1, ibz_t *coord2); -int quat_test_dim2_lattice_contains() -{ - int res = 0; - ibz_mat_2x2_t basis; - ibz_t c1, c2; - ibz_mat_2x2_init(&basis); - ibz_init(&c1); - ibz_init(&c2); - ibz_mat_2x2_set(&basis, -1, 2, 5, 0); - ibz_set(&c1, 0); - ibz_set(&c2, 0); - res = res || !quat_dim2_lattice_contains(&basis, &c1, &c2); - ibz_set(&c1, 1); - ibz_set(&c2, 5); - res = res || !quat_dim2_lattice_contains(&basis, &c1, &c2); - ibz_set(&c1, 1); - ibz_set(&c2, 4); - res = res || quat_dim2_lattice_contains(&basis, &c1, &c2); - - if (res != 0) - { - printf("Quaternion unit test dim2_lattice_contains failed\n"); - } - ibz_mat_2x2_finalize(&basis); - ibz_finalize(&c1); - ibz_finalize(&c2); - return (res); -} - -// void quat_dim2_lattice_norm(ibz_t *norm, const ibz_t *coord1, const ibz_t *coord2, const ibz_t *norm_q) -int quat_test_dim2_lattice_norm() -{ - int res = 0; - ibz_t norm, cmp, q, a, b; - ibz_init(&a); - ibz_init(&b); - ibz_init(&q); - ibz_init(&norm); - ibz_init(&cmp); - ibz_set(&a, 1); - ibz_set(&b, 2); - ibz_set(&q, 3); - ibz_set(&cmp, 1 * 1 + 3 * 2 * 2); - quat_dim2_lattice_norm(&norm, &a, &b, &q); - res = res || ibz_cmp(&norm, &cmp); - ibz_set(&a, 7); - ibz_set(&b, -2); - ibz_set(&q, 5); - ibz_set(&cmp, 7 * 7 + 5 * 2 * 2); - quat_dim2_lattice_norm(&norm, &a, &b, &q); - res = res || ibz_cmp(&norm, &cmp); - ibz_set(&cmp, 7 * 7 + 7 * 7 * 7); - quat_dim2_lattice_norm(&a, &a, &a, &a); - res = res || ibz_cmp(&a, &cmp); - if (res != 0) - { - printf("Quaternion unit test dim2_lattice_norm failed\n"); - } - ibz_finalize(&a); - ibz_finalize(&b); - ibz_finalize(&q); - ibz_finalize(&norm); - ibz_finalize(&cmp); - return (res); -} - -// void quat_dim2_lattice_bilinear(ibz_t *res, const ibz_t *v11, const ibz_t *v12,const ibz_t *v21, const ibz_t *v22, const ibz_t *norm_q); -int quat_test_dim2_lattice_bilinear() -{ - int res = 0; - ibz_t prod, cmp, q, a, b, c, d; - ibz_init(&a); - ibz_init(&b); - ibz_init(&c); - ibz_init(&d); - ibz_init(&q); - ibz_init(&prod); - ibz_init(&cmp); - ibz_set(&a, 1); - ibz_set(&b, 2); - ibz_set(&c, 3); - ibz_set(&d, 4); - ibz_set(&q, 3); - ibz_set(&cmp, 1 * 3 + 3 * 2 * 4); - quat_dim2_lattice_bilinear(&prod, &a, &b, &c, &d, &q); - res = res || ibz_cmp(&prod, &cmp); - ibz_set(&a, 7); - ibz_set(&b, -2); - ibz_set(&c, 4); - ibz_set(&d, 7); - ibz_set(&q, 5); - ibz_set(&cmp, 7 * 4 - 5 * 2 * 7); - quat_dim2_lattice_bilinear(&prod, &a, &b, &c, &d, &q); - res = res || ibz_cmp(&prod, &cmp); - ibz_set(&cmp, 7 * 7 + 7 * 7 * 7); - quat_dim2_lattice_bilinear(&a, &a, &a, &a, &a, &a); - res = res || ibz_cmp(&a, &cmp); - if (res != 0) - { - printf("Quaternion unit test dim2_lattice_bilinear failed\n"); - } - ibz_finalize(&a); - ibz_finalize(&b); - ibz_finalize(&c); - ibz_finalize(&d); - ibz_finalize(&q); - ibz_finalize(&prod); - ibz_finalize(&cmp); - return (res); -} - -// according to conditions from https://cseweb.ucsd.edu/classes/wi12/cse206A-a/lec3.pdf -int quat_dim2_lattice_verify_lll(const ibz_mat_2x2_t *mat, const ibz_t *norm_q){ - ibz_t prod, norm_a, norm_bstar, norm_b, b_ab, b_abstar, b_bbstar,p01_denom,p00_denom, norm_p00,norm_p01; - ibz_vec_2_t p00,p01,bstar; - ibz_vec_2_init(&p00); - ibz_vec_2_init(&p01); - ibz_vec_2_init(&bstar); - ibz_init(&prod); - ibz_init(&norm_a); - ibz_init(&norm_bstar); - ibz_init(&norm_b); - ibz_init(&b_ab); - ibz_init(&b_bbstar); - ibz_init(&b_abstar); - ibz_init(&p00_denom); - ibz_init(&p01_denom); - ibz_init(&norm_p00); - ibz_init(&norm_p01); - quat_dim2_lattice_norm(&norm_a,&((*mat)[0][0]),&((*mat)[1][0]),norm_q); - quat_dim2_lattice_norm(&norm_b,&((*mat)[0][1]),&((*mat)[1][1]),norm_q); - quat_dim2_lattice_bilinear(&b_ab,&((*mat)[0][0]),&((*mat)[1][0]),&((*mat)[0][1]),&((*mat)[1][1]),norm_q); - ibz_mul(&(bstar[0]),&((*mat)[0][1]),&norm_b); - ibz_mul(&prod,&((*mat)[0][0]),&b_ab); - ibz_sub(&(bstar[0]),&(bstar[0]),&prod); - ibz_mul(&(bstar[1]),&((*mat)[1][1]),&norm_b); - ibz_mul(&prod,&((*mat)[1][0]),&b_ab); - ibz_sub(&(bstar[1]),&(bstar[1]),&prod); - quat_dim2_lattice_norm(&norm_bstar,&(bstar[0]),&(bstar[1]),norm_q); - quat_dim2_lattice_bilinear(&b_bbstar,&(bstar[0]),&(bstar[1]),&((*mat)[0][1]),&((*mat)[1][1]),norm_q); - quat_dim2_lattice_bilinear(&b_abstar,&((*mat)[0][0]),&((*mat)[1][0]),&(bstar[0]),&(bstar[1]),norm_q); - // first projection - ibz_mul(&(p00[0]),&((*mat)[0][0]),&norm_bstar); - ibz_mul(&prod,&(bstar[0]),&b_abstar); - ibz_add(&(p00[0]),&(p00[0]),&prod); - ibz_mul(&(p00[1]),&((*mat)[1][0]),&norm_bstar); - ibz_mul(&prod,&(bstar[1]),&b_abstar); - ibz_add(&(p00[1]),&(p00[1]),&prod); - ibz_copy(&p00_denom,&norm_bstar); - // second projection - ibz_mul(&(p01[0]),&((*mat)[0][0]),&b_ab); - ibz_mul(&(p01[0]),&(p01[0]),&norm_bstar); - ibz_mul(&prod,&(bstar[0]),&b_bbstar); - ibz_mul(&prod,&prod,&norm_a); - ibz_add(&(p01[0]),&(p01[0]),&prod); - ibz_mul(&(p01[1]),&((*mat)[1][0]),&b_ab); - ibz_mul(&(p01[1]),&(p01[1]),&norm_bstar); - ibz_mul(&prod,&(bstar[1]),&b_bbstar); - ibz_mul(&prod,&prod,&norm_a); - ibz_add(&(p01[1]),&(p01[1]),&prod); - ibz_mul(&p01_denom,&norm_a,&norm_bstar); - // compute norms - quat_dim2_lattice_norm(&norm_p00,&(p00[0]),&(p00[1]),norm_q); - quat_dim2_lattice_norm(&norm_p01,&(p01[0]),&(p01[1]),norm_q); - // compare on same denom - ibz_mul(&norm_p00,&norm_p00,&norm_a); - ibz_mul(&norm_p00,&norm_p00,&norm_a); - ibz_mul(&p00_denom,&p00_denom,&norm_a); - int res = (ibz_cmp(&norm_p00,&norm_p01)<=0); - // also check 2times bilinear against norm - ibz_set(&prod,2); - ibz_mul(&prod,&b_ab,&prod); - res = res && (ibz_cmp(&prod,&norm_a)< 0); - - ibz_finalize(&prod); - ibz_finalize(&norm_a); - ibz_finalize(&norm_bstar); - ibz_finalize(&norm_b); - ibz_finalize(&norm_p00); - ibz_finalize(&norm_p01); - ibz_finalize(&b_ab); - ibz_finalize(&b_abstar); - ibz_finalize(&b_bbstar); - ibz_finalize(&p00_denom); - ibz_finalize(&p01_denom); - ibz_vec_2_finalize(&p00); - ibz_vec_2_finalize(&p01); - ibz_vec_2_finalize(&bstar); - return(res); -} - -// void quat_dim2_lattice_short_basis(ibz_mat_2x2_t *reduced, const ibz_mat_2x2_t *basis, const ibz_t *norm_q); -int quat_test_dim2_lattice_short_basis() -{ - int res = 0; - ibz_mat_2x2_t basis, cmp, red; - ibz_t prod, sum, norm_q, bound; - ibz_init(&prod); - ibz_init(&sum); - ibz_init(&norm_q); - ibz_init(&bound); - ibz_mat_2x2_init(&basis); - ibz_mat_2x2_init(&cmp); - ibz_mat_2x2_init(&red); - // first test - ibz_mat_2x2_set(&basis, 3, 5, 7, 9); - ibz_set(&norm_q, 2); - quat_dim2_lattice_short_basis(&red, &basis, &norm_q); - // check second basis vector larger (or at least equal) than 1st - res = res || (ibz_cmp(&sum, &prod) > 0); - // check mutual inclusion of lattices - res = res || (!quat_dim2_lattice_contains(&red, &(basis[0][0]), &(basis[1][0]))); - res = res || (!quat_dim2_lattice_contains(&red, &(basis[0][1]), &(basis[1][1]))); - res = res || (!quat_dim2_lattice_contains(&basis, &(red[0][0]), &(red[1][0]))); - res = res || (!quat_dim2_lattice_contains(&basis, &(red[0][1]), &(red[1][1]))); - // check bilinear form value is small - ibz_set(&bound, 12); - quat_dim2_lattice_bilinear(&sum, &(red[0][0]), &(red[0][1]), &(red[0][1]), &(red[1][1]), &norm_q); - res = res || (ibz_cmp(&sum, &bound) > 0); - // check norm smaller than original - ibz_set(&bound, 12); - quat_dim2_lattice_norm(&sum, &(red[0][0]), &(red[1][0]), &norm_q); - res = res || (ibz_cmp(&sum, &bound) > 0); - quat_dim2_lattice_norm(&prod, &(red[0][1]), &(red[1][1]), &norm_q); - res = res || (ibz_cmp(&prod, &bound) > 0); - // check lll - res = res || !quat_dim2_lattice_verify_lll(&red,&norm_q); - - // second test - ibz_mat_2x2_set(&basis, 48, 4, 81, 9); - ibz_set(&norm_q, 9); - quat_dim2_lattice_short_basis(&red, &basis, &norm_q); - // check second basis vector larger (or at least equal) than 1st - res = res || (ibz_cmp(&sum, &prod) > 0); - // check mutual inclusion of lattices - res = res || (!quat_dim2_lattice_contains(&red, &(basis[0][0]), &(basis[1][0]))); - res = res || (!quat_dim2_lattice_contains(&red, &(basis[0][1]), &(basis[1][1]))); - res = res || (!quat_dim2_lattice_contains(&basis, &(red[0][0]), &(red[1][0]))); - res = res || (!quat_dim2_lattice_contains(&basis, &(red[0][1]), &(red[1][1]))); - // check bilinear form value is small - ibz_set(&bound, 50 * 100); - quat_dim2_lattice_bilinear(&sum, &(red[0][0]), &(red[0][1]), &(red[0][1]), &(red[1][1]), &norm_q); - res = res || (ibz_cmp(&sum, &bound) > 0); - // check norm smaller than original - ibz_set(&bound, 50 * 50); - quat_dim2_lattice_norm(&sum, &(red[0][0]), &(red[1][0]), &norm_q); - res = res || (ibz_cmp(&sum, &bound) > 0); - quat_dim2_lattice_norm(&prod, &(red[0][1]), &(red[1][1]), &norm_q); - res = res || (ibz_cmp(&prod, &bound) > 0); - // check lll - res = res || !quat_dim2_lattice_verify_lll(&red,&norm_q); - - // third test - ibz_mat_2x2_set(&basis, -1, 2, 3, 2); - ibz_set(&norm_q, 2); - quat_dim2_lattice_short_basis(&red, &basis, &norm_q); - // check second basis vector larger (or at least equal) than 1st - res = res || (ibz_cmp(&sum, &prod) > 0); - // check mutual inclusion of lattices - res = res || (!quat_dim2_lattice_contains(&red, &(basis[0][0]), &(basis[1][0]))); - res = res || (!quat_dim2_lattice_contains(&red, &(basis[0][1]), &(basis[1][1]))); - res = res || (!quat_dim2_lattice_contains(&basis, &(red[0][0]), &(red[1][0]))); - res = res || (!quat_dim2_lattice_contains(&basis, &(red[0][1]), &(red[1][1]))); - // check bilinear form value is small - ibz_set(&bound, 12); - quat_dim2_lattice_bilinear(&sum, &(red[0][0]), &(red[0][1]), &(red[0][1]), &(red[1][1]), &norm_q); - res = res || (ibz_cmp(&sum, &bound) > 0); - // check norm smaller than original - ibz_set(&bound, 12); - quat_dim2_lattice_norm(&sum, &(red[0][0]), &(red[1][0]), &norm_q); - res = res || (ibz_cmp(&sum, &bound) > 0); - quat_dim2_lattice_norm(&prod, &(red[0][1]), &(red[1][1]), &norm_q); - res = res || (ibz_cmp(&prod, &bound) > 0); - // check lll - res = res || !quat_dim2_lattice_verify_lll(&red,&norm_q); - - //4th test - ibz_set(&norm_q, 12165); - ibz_mat_2x2_set(&basis, 364, 0, 1323546, 266606); - quat_dim2_lattice_short_basis(&red, &basis,&norm_q); - // check second basis vector larger (or at least equal) than 1st - res = res || (ibz_cmp(&sum, &prod) > 0); - // check mutual inclusion of lattices - res = res || (!quat_dim2_lattice_contains(&red, &(basis[0][0]), &(basis[1][0]))); - res = res || (!quat_dim2_lattice_contains(&red, &(basis[0][1]), &(basis[1][1]))); - res = res || (!quat_dim2_lattice_contains(&basis, &(red[0][0]), &(red[1][0]))); - res = res || (!quat_dim2_lattice_contains(&basis, &(red[0][1]), &(red[1][1]))); - // check bilinear form value is small - quat_dim2_lattice_norm(&bound, &(basis[0][1]), &(basis[1][1]),&norm_q); - quat_dim2_lattice_bilinear(&sum, &(red[0][0]), &(red[0][1]), &(red[0][1]), &(red[1][1]), &norm_q); - res = res || (ibz_cmp(&sum, &bound) > 0); - // check norm smaller than original - quat_dim2_lattice_norm(&bound, &(basis[0][1]), &(basis[1][1]),&norm_q); - quat_dim2_lattice_norm(&sum, &(red[0][0]), &(red[1][0]), &norm_q); - res = res || (ibz_cmp(&sum, &bound) > 0); - quat_dim2_lattice_norm(&prod, &(red[0][1]), &(red[1][1]), &norm_q); - res = res || (ibz_cmp(&prod, &bound) > 0); - // check lll - res = res || !quat_dim2_lattice_verify_lll(&red,&norm_q); - - if (res != 0) - { - printf("Quaternion unit test dim2_lattice_short_basis failed\n"); - } - ibz_finalize(&prod); - ibz_finalize(&sum); - ibz_finalize(&norm_q); - ibz_finalize(&bound); - ibz_mat_2x2_finalize(&basis); - ibz_mat_2x2_finalize(&cmp); - ibz_mat_2x2_finalize(&red); - return res; -} - -//void quat_dim2_lattice_get_coefficient_with_orthogonalisation(ibz_t *res, const ibz_t *a0,const ibz_t *a1,const ibz_t *b0,const ibz_t *b1,const ibz_t *t0,const ibz_t *t1,const ibz_t *norm_q); -int quat_test_dim2_lattice_get_coefficient_with_orthogonalisation(){ - int res = 0; - ibz_t out, q, cmp; - ibz_vec_2_t a, b, t; - ibz_init(&out); - ibz_init(&q); - ibz_vec_2_init(&a); - ibz_vec_2_init(&b); - ibz_vec_2_init(&t); - ibz_init(&cmp); - - ibz_vec_2_set(&b,364,203); - ibz_vec_2_set(&a,136,-606); - ibz_vec_2_set(&t,4312, 1122); - ibz_set(&q,1); - ibz_set(&cmp,2); - quat_dim2_lattice_get_coefficient_with_orthogonalisation(&out,&(a[0]),&(a[1]),&(b[0]),&(b[1]),&(t[0]),&(t[1]),&q); - res = res || ibz_cmp(&cmp,&out); - - if (res != 0) - { - printf("Quaternion unit test dim2_lattice_get_coefficient_with_orthogonalisation failed\n"); - } - ibz_finalize(&out); - ibz_finalize(&q); - ibz_vec_2_finalize(&a); - ibz_vec_2_finalize(&b); - ibz_vec_2_finalize(&t); - ibz_finalize(&cmp); - return(res); -} - -// void quat_dim2_lattice_closest_vector(ibz_vec_2_t *target_minus_closest, ibz_vec_2_t *closest_coords_in_basis, const ibz_mat_2x2_t *reduced_basis, const ibz_vec_2_t *target, const ibz_t *norm_q); -// void quat_dim2_lattice_closest_vector(ibz_vec_2_t *target_minus_closest, ibz_vec_2_t *closest_coords_in_basis, const ibz_mat_2x2_t *reduced_basis, const ibz_vec_2_t *target, const ibz_t *norm_q); -int quat_test_dim2_lattice_closest_vector() -{ - int res = 0; - ibz_vec_2_t target, coords, diff, cmp_c, cmp_d; - ibz_t q; - ibz_mat_2x2_t basis; - ibz_mat_2x2_init(&basis); - ibz_init(&q); - ibz_vec_2_init(&diff); - ibz_vec_2_init(&target); - ibz_vec_2_init(&coords); - ibz_vec_2_init(&cmp_c); - ibz_vec_2_init(&cmp_d); - - ibz_vec_2_set(&target, 1216765, 879777); - ibz_set(&q, 12165); - ibz_mat_2x2_set(&basis, 364, 0, 1323546, 266606); - quat_dim2_lattice_short_basis(&basis, &basis,&q); - res = res || !quat_dim2_lattice_verify_lll(&basis,&q); - - quat_dim2_lattice_norm(&(cmp_d[0]),&(basis[0][0]),&(basis[1][0]),&q); - quat_dim2_lattice_norm(&(cmp_d[1]),&(basis[0][1]),&(basis[1][1]),&q); - quat_dim2_lattice_closest_vector(&diff, &coords, &basis, &target, &q); - quat_dim2_lattice_norm(&(cmp_c[0]),&(diff[0]),&(diff[1]),&q); - // test if diff has short norm - res = res || (ibz_cmp(&(cmp_d[0]), &(cmp_c[0]))<0); - res = res || (ibz_cmp(&(cmp_d[1]), &(cmp_c[0]))<0);// test coord in std basis + diff gives target - ibz_mul(&(cmp_c[0]), &(basis[0][0]), &(coords[0])); - ibz_mul(&(cmp_d[0]), &(basis[0][1]), &(coords[1])); - ibz_add(&(cmp_c[0]), &(cmp_c[0]), &(cmp_d[0])); - ibz_mul(&(cmp_c[1]), &(basis[1][0]), &(coords[0])); - ibz_mul(&(cmp_d[1]), &(basis[1][1]), &(coords[1])); - ibz_add(&(cmp_c[1]), &(cmp_c[1]), &(cmp_d[1])); - ibz_add(&(cmp_d[1]), &(diff[1]), &(cmp_c[1])); - ibz_add(&(cmp_d[0]), &(diff[0]), &(cmp_c[0])); - res = res || ibz_cmp(&(target[0]), &(cmp_d[0])); - res = res || ibz_cmp(&(target[1]), &(cmp_d[1])); - - ibz_set_from_str(&(target[0]),"24331603791763515691729329496192502951056898161849272968170597636916968011043891967931576902713229532952543949167870260",10); - ibz_set_from_str(&(target[1]),"320864169455876864410246920205472260746024223953596490297261861428291460634916982031632479909031611896628831462307645903",10); - ibz_set_from_str(&(basis[0][0]),"83823929950128301594915602697228677079260482500022964929273",10); - ibz_set_from_str(&(basis[0][1]),"0",10); - ibz_set_from_str(&(basis[1][0]),"26601400243014239200180507899382755112580169588401175904342542265512938583814884922817611265843666255091702318534544478",10); - ibz_set_from_str(&(basis[1][1]),"702645123228401649030937397460831326065409163240113467483219315690011711473572222698591407715178198721852976513892308529",10); - ibz_set(&q, 1); - quat_dim2_lattice_short_basis(&basis, &basis,&q); - res = res || !quat_dim2_lattice_verify_lll(&basis,&q); - - quat_dim2_lattice_norm(&(cmp_d[0]),&(basis[0][0]),&(basis[1][0]),&q); - quat_dim2_lattice_norm(&(cmp_d[1]),&(basis[0][1]),&(basis[1][1]),&q); - quat_dim2_lattice_closest_vector(&diff, &coords, &basis, &target, &q); - quat_dim2_lattice_norm(&(cmp_c[0]),&(diff[0]),&(diff[1]),&q); - quat_dim2_lattice_bilinear(&(cmp_c[1]),&(basis[0][0]),&(basis[1][0]),&(basis[0][1]),&(basis[1][1]),&q); - quat_dim2_lattice_bilinear(&(cmp_c[1]),&(basis[0][0]),&(basis[1][0]),&(diff[0]),&(diff[1]),&q); - quat_dim2_lattice_bilinear(&(cmp_c[1]),&(basis[0][1]),&(basis[1][1]),&(diff[0]),&(diff[1]),&q); - // test if diff has short norm - res = res || (ibz_cmp(&(cmp_d[0]), &(cmp_c[0]))<0); - res = res || (ibz_cmp(&(cmp_d[1]), &(cmp_c[0]))<0); - // test coord in std basis + diff gives target - ibz_mul(&(cmp_c[0]), &(basis[0][0]), &(coords[0])); - ibz_mul(&(cmp_d[0]), &(basis[0][1]), &(coords[1])); - ibz_add(&(cmp_c[0]), &(cmp_c[0]), &(cmp_d[0])); - ibz_mul(&(cmp_c[1]), &(basis[1][0]), &(coords[0])); - ibz_mul(&(cmp_d[1]), &(basis[1][1]), &(coords[1])); - ibz_add(&(cmp_c[1]), &(cmp_c[1]), &(cmp_d[1])); - ibz_add(&(cmp_d[1]), &(diff[1]), &(cmp_c[1])); - ibz_add(&(cmp_d[0]), &(diff[0]), &(cmp_c[0])); - res = res || ibz_cmp(&(target[0]), &(cmp_d[0])); - res = res || ibz_cmp(&(target[1]), &(cmp_d[1])); - - if (res != 0) - { - printf("Quaternion unit test dim2_lattice_closest_vector failed\n"); - } - ibz_mat_2x2_finalize(&basis); - ibz_finalize(&q); - ibz_vec_2_finalize(&diff); - ibz_vec_2_finalize(&target); - ibz_vec_2_finalize(&coords); - ibz_vec_2_finalize(&cmp_c); - ibz_vec_2_finalize(&cmp_d); - return (res); -} - -// void quat_dim2_lattice_get_qf_on_lattice(ibz_t *qf_a, ibz_t *qf_b,ibz_t *qf_c, const ibz_mat_2x2_t *basis ,const ibz_t *norm_q); -int quat_test_dim2_lattice_get_qf_on_lattice() -{ - int res = 0; - ibz_t a, b, c, q, cmp_a, cmp_b, cmp_c; - ibz_mat_2x2_t basis; - ibz_mat_2x2_init(&basis); - ibz_init(&a); - ibz_init(&b); - ibz_init(&c); - ibz_init(&q); - ibz_init(&cmp_a); - ibz_init(&cmp_b); - ibz_init(&cmp_c); - ibz_mat_2x2_set(&basis, -3, 2, 1, 2); - ibz_set(&q, 2); - ibz_set(&cmp_a, 11); - ibz_set(&cmp_b, -4); - ibz_set(&cmp_c, 12); - quat_dim2_lattice_get_qf_on_lattice(&a, &b, &c, &basis, &q); - res = res || ibz_cmp(&a, &cmp_a); - res = res || ibz_cmp(&b, &cmp_b); - res = res || ibz_cmp(&c, &cmp_c); - ibz_mat_2x2_set(&basis, 5, 7, -1, 1); - ibz_set(&q, 20); - ibz_set(&cmp_a, 5 * 5 + 20); - ibz_set(&cmp_b, 2 * (5 * 7 - 20)); - ibz_set(&cmp_c, 7 * 7 + 20); - quat_dim2_lattice_get_qf_on_lattice(&q, &b, &c, &basis, &q); - res = res || ibz_cmp(&q, &cmp_a); - res = res || ibz_cmp(&b, &cmp_b); - res = res || ibz_cmp(&c, &cmp_c); - if (res != 0) - { - printf("Quaternion unit test dim2_lattice_get_qf_on_lattice failed\n"); - } - ibz_mat_2x2_finalize(&basis); - ibz_finalize(&a); - ibz_finalize(&b); - ibz_finalize(&c); - ibz_finalize(&q); - ibz_finalize(&cmp_a); - ibz_finalize(&cmp_b); - ibz_finalize(&cmp_c); - return (res); -} - -// int quat_dim2_lattice_test_cvp_condition(quat_alg_elem_t* elem, const ibz_vec_2_t* vec, const void* params); -int quat_test_dim2_lattice_test_cvp_condition() -{ - int res = 0; - ibz_vec_2_t vec; - quat_alg_elem_t elem; - ibz_t p; - void *params = (void *)&p; - quat_alg_elem_init(&elem); - ibz_vec_2_init(&vec); - ibz_init(&p); - ibz_vec_2_set(&vec, 5, 7); - ibz_set(&p, 5); - res = res || !quat_dim2_lattice_test_cvp_condition(&elem, &vec, params); - res = res || ibz_cmp(&(elem.coord[0]), &(vec[0])); - res = res || ibz_cmp(&(elem.coord[1]), &(vec[1])); - res = res || ibz_cmp(&(elem.coord[2]), &(vec[0])); - res = res || ibz_cmp(&(elem.coord[3]), &(vec[1])); - ibz_vec_2_set(&vec, 5, 8); - ibz_set(&p, 5); - res = res || quat_dim2_lattice_test_cvp_condition(&elem, &vec, params); - - if (res != 0) - { - printf("Quaternion unit test dim2_lattice_test_cvp_condition failed\n"); - } - quat_alg_elem_finalize(&elem); - ibz_vec_2_finalize(&vec); - ibz_finalize(&p); - return (res); -} - -// int quat_dim2_lattice_bound_and_condition(quat_alg_elem_t *res, const ibz_t *x, const ibz_t *y, int (*condition)(quat_alg_elem_t* , const ibz_vec_2_t*, const void*), const void* params, const ibz_vec_2_t* target_minus_closest, const ibz_mat_2x2_t *lat_basis, const ibz_t *norm_q, const ibz_t *norm_bound); -int quat_test_dim2_lattice_bound_and_condition() -{ - int res = 0; - quat_alg_elem_t out; - ibz_t x, y, q, bound, p; - ibz_vec_2_t cmp, diff; - ibz_mat_2x2_t basis; - quat_alg_elem_init(&out); - ibz_init(&x); - ibz_init(&y); - ibz_init(&q); - ibz_init(&p); - ibz_init(&bound); - ibz_vec_2_init(&cmp); - ibz_vec_2_init(&diff); - ibz_mat_2x2_init(&basis); - void *params = (void *)&p; - - // should pass - ibz_mat_2x2_set(&basis, -3, 2, 1, 2); - ibz_set(&q, 2); - ibz_set(&x, -1); - ibz_set(&y, 3); - ibz_set(&p, 3); - ibz_set(&bound, 1000); - ibz_vec_2_set(&diff, 1, 0); - // out contains target - closest - short = diff - short - ibz_vec_2_set(&cmp, -8, -5); - if (quat_dim2_lattice_bound_and_condition(&out, &x, &y, &quat_dim2_lattice_test_cvp_condition, params, &diff, &basis, &q, &bound)) - { - res = res || ibz_cmp(&(cmp[0]), &(out.coord[0])); - res = res || ibz_cmp(&(cmp[1]), &(out.coord[1])); - } - else - { - res = 1; - } - // fail due to bound - ibz_set(&bound, 10); - res = res || quat_dim2_lattice_bound_and_condition(&out, &x, &y, &quat_dim2_lattice_test_cvp_condition, params, &diff, &basis, &q, &bound); - - // fail due to condition - ibz_set(&bound, 1000); - ibz_set(&p, 2); - res = res || quat_dim2_lattice_bound_and_condition(&out, &x, &y, &quat_dim2_lattice_test_cvp_condition, params, &diff, &basis, &q, &bound); - - if (res != 0) - { - printf("Quaternion unit test dim2_lattice_bound_and_condition failed\n"); - } - quat_alg_elem_finalize(&out); - ibz_finalize(&x); - ibz_finalize(&y); - ibz_finalize(&q); - ibz_finalize(&p); - ibz_finalize(&bound); - ibz_vec_2_finalize(&cmp); - ibz_vec_2_finalize(&diff); - ibz_mat_2x2_finalize(&basis); - return (res); -} - -// int quat_dim2_lattice_qf_value_bound_generation(ibz_t *res, const ibz_t *num_a, const ibz_t *denom_a, const ibz_t *num_b, const ibz_t *denom_b){ -int quat_test_dim2_lattice_qf_value_bound_generation() -{ - int res = 0; - ibz_t sqrt_num, sqrt_denom, num_b, denom_b, cmp, bound; - ibz_init(&sqrt_denom); - ibz_init(&sqrt_num); - ibz_init(&denom_b); - ibz_init(&num_b); - ibz_init(&cmp); - ibz_init(&bound); - - ibz_set(&sqrt_denom, 4); - ibz_set(&sqrt_num, 10); - ibz_set(&denom_b, 2); - ibz_set(&num_b, 5); - ibz_set(&cmp, 5); - quat_dim2_lattice_qf_value_bound_generation(&bound, &sqrt_num, &sqrt_denom, &num_b, &denom_b); - res = res || ibz_cmp(&bound, &cmp); - - ibz_set(&sqrt_denom, 6); - ibz_set(&sqrt_num, 9); - ibz_set(&denom_b, 2); - ibz_set(&num_b, 3); - ibz_set(&cmp, 4); - quat_dim2_lattice_qf_value_bound_generation(&bound, &sqrt_num, &sqrt_denom, &num_b, &denom_b); - res = res || ibz_cmp(&bound, &cmp); - - if (res != 0) - { - printf("Quaternion unit test dim2_lattice_qf_value_bound_generation failed\n"); - } - ibz_finalize(&sqrt_denom); - ibz_finalize(&sqrt_num); - ibz_finalize(&denom_b); - ibz_finalize(&num_b); - ibz_finalize(&cmp); - ibz_finalize(&bound); - return res; -} - -// int quat_dim2_lattice_qf_enumerate_short_vec(quat_alg_elem_t *res,int (*condition)(quat_alg_elem_t*, const ibz_vec_2_t*, const void*), const void *params, const ibz_vec_2_t *target_minus_closest, const ibz_mat_2x2_t *lat_basis, const ibz_t *norm_q,const ibz_t *norm_bound, const int max_tries); -int quat_test_dim2_lattice_qf_enumerate_short_vec() -{ - int res = 0; - quat_alg_elem_t out; - ibz_t q, bound, p; - ibz_vec_2_t diff; - ibz_mat_2x2_t basis; - int max_tries = 1000; - quat_alg_elem_init(&out); - void *params = (void *)&p; - ibz_init(&q); - ibz_init(&p); - ibz_init(&bound); - ibz_vec_2_init(&diff); - ibz_mat_2x2_init(&basis); - ibz_set(&p, 3); - - // should pass - ibz_mat_2x2_set(&basis, -3, 2, 1, 2); - ibz_set(&q, 2); - ibz_set(&p, 3); - ibz_set(&bound, 200); - max_tries = 20000; - ibz_vec_2_set(&diff, 2, 1); - if (quat_dim2_lattice_qf_enumerate_short_vec(&out, &quat_dim2_lattice_test_cvp_condition, params, &diff, &basis, &q, &bound, max_tries)) - { - res = res || quat_dim2_lattice_bound_and_condition(&out, &(out.coord[0]), &(out.coord[1]), &quat_dim2_lattice_test_cvp_condition, params, &diff, &basis, &q, &bound); - } - else - { - res = 1; - } - - // should passibz_vec_2_set(&target, 1216765, 879777); - ibz_mat_2x2_set(&basis, 364, 0, 1323546, 266606); - ibz_set(&q, 12165); - ibz_set(&p, 3); - ibz_set(&bound, 1024*64); - ibz_mul(&bound,&bound,&bound); - max_tries = 100; - ibz_vec_2_set(&diff, -18287, -155); - if (quat_dim2_lattice_qf_enumerate_short_vec(&out, &quat_dim2_lattice_test_cvp_condition, params, &diff, &basis, &q, &bound, max_tries)) - { - res = res || quat_dim2_lattice_bound_and_condition(&out, &(out.coord[0]), &(out.coord[1]), &quat_dim2_lattice_test_cvp_condition, params, &diff, &basis, &q, &bound); - } - else - { - res = 1; - } - - // should fail - ibz_mat_2x2_set(&basis, -3, 2, 1, 2); - ibz_set(&q, 2); - ibz_set(&p, 2); - ibz_set(&bound, 200); - max_tries = 2000; - ibz_vec_2_set(&diff, 2, 1); - res = res || quat_dim2_lattice_qf_enumerate_short_vec(&out, &quat_dim2_lattice_test_cvp_condition, params, &diff, &basis, &q, &bound, max_tries); - - // should fail - ibz_mat_2x2_set(&basis, -3, 2, 1, 2); - ibz_set(&q, 2); - ibz_set(&p, 2); - ibz_set(&bound, 50); - max_tries = 2000; - ibz_vec_2_set(&diff, 2, 1); - res = res || quat_dim2_lattice_qf_enumerate_short_vec(&out, &quat_dim2_lattice_test_cvp_condition, params, &diff, &basis, &q, &bound, max_tries); - - if (res != 0) - { - printf("Quaternion unit test dim2_lattice_qf_enumerate_short_vec failed\n"); - } - quat_alg_elem_finalize(&out); - ibz_finalize(&q); - ibz_finalize(&p); - ibz_finalize(&bound); - ibz_vec_2_finalize(&diff); - ibz_mat_2x2_finalize(&basis); - return (res); -} - -// int quat_2x2_lattice_enumerate_cvp_filter(quat_alg_elem_t *res, const ibz_mat_2x2_t *lat_basis, const ibz_vec_2_t *target,unsigned int qf, unsigned int dist_bound, int (*condition)(quat_alg_elem_t* , const ibz_vec_2_t*, const void*), const void* params, unsigned int max_tries); -int quat_test_dim2_2x2_lattice_enumerate_cvp_filter() -{ - int res = 0; - ibz_t p, bound, norm_q, norm; - quat_alg_elem_t cvp_res; - ibz_mat_2x2_t basis; - ibz_vec_2_t target, diff, found; - ibz_mat_2x2_init(&basis); - quat_alg_elem_init(&cvp_res); - ibz_vec_2_init(&target); - ibz_vec_2_init(&diff); - ibz_vec_2_init(&found); - ibz_init(&p); - ibz_init(&norm_q); - ibz_init(&norm); - ibz_init(&bound); - unsigned int q; - unsigned int dist_bound; - void *params = (void *)&p; - unsigned int max_tries; - - // solution should exist - ibz_mat_2x2_set(&basis, -3, 2, 1, 2); - ibz_vec_2_set(&target, -3, 3); - ibz_set(&p, 3); - q = 2; - dist_bound = 10; - max_tries = 20000; - if (quat_2x2_lattice_enumerate_cvp_filter(&cvp_res, &basis, &target, q, dist_bound, &quat_dim2_lattice_test_cvp_condition, params, max_tries)) - { - // used cvp_res and condition to exfiltrate standard coords of distance to target from close vector found - ibz_copy(&(diff[0]), &(cvp_res.coord[0])); - ibz_copy(&(diff[1]), &(cvp_res.coord[1])); - // compute close vector in lattice from target and diff - ibz_sub(&(found[0]), &(target[0]), &(diff[0])); - ibz_sub(&(found[1]), &(target[1]), &(diff[1])); - // norm bound on diff ok? - ibz_set(&norm_q, q); - ibz_set(&bound, 2); - ibz_pow(&bound, &bound, dist_bound); - quat_dim2_lattice_norm(&norm, &(diff[0]), &(diff[1]), &norm_q); - res = res || !(ibz_cmp(&norm, &bound) < 0); - // Condition ok - res = res || (!quat_dim2_lattice_test_cvp_condition(&cvp_res, &diff, params)); - // Is in lattice - res = res || (!quat_dim2_lattice_contains(&basis, &(found[0]), &(found[1]))); - } - else - { - res = 1; - } - - // solution should exist - ibz_mat_2x2_set(&basis, -1, 2, 3, 2); - ibz_vec_2_set(&target, -3, 3); - ibz_set(&p, 3); - q = 2; - dist_bound = 10; - max_tries = 20000; - if (quat_2x2_lattice_enumerate_cvp_filter(&cvp_res, &basis, &target, q, dist_bound, &quat_dim2_lattice_test_cvp_condition, params, max_tries)) - { - // used cvp_res and condition to exfiltrate standard coords of distance to target from close vector found - ibz_copy(&(diff[0]), &(cvp_res.coord[0])); - ibz_copy(&(diff[1]), &(cvp_res.coord[1])); - // compute close vector in lattice from target and diff - ibz_sub(&(found[0]), &(target[0]), &(diff[0])); - ibz_sub(&(found[1]), &(target[1]), &(diff[1])); - // norm bound on diff ok? - ibz_set(&norm_q, q); - ibz_set(&bound, 2); - ibz_pow(&bound, &bound, dist_bound); - quat_dim2_lattice_norm(&norm, &(diff[0]), &(diff[1]), &norm_q); - res = res || !(ibz_cmp(&norm, &bound) < 0); - // Condition ok - res = res || (!quat_dim2_lattice_test_cvp_condition(&cvp_res, &diff, params)); - // Is in lattice - res = res || (!quat_dim2_lattice_contains(&basis, &(found[0]), &(found[1]))); - } - else - { - res = 1; - } - - // solution should not exist because of lower dist_bound - ibz_mat_2x2_set(&basis, -1, 2, 1, 2); - ibz_vec_2_set(&target, -3, 3); - ibz_set(&p, 5); - q = 3; - dist_bound = 1; - max_tries = 1000; - res = res || (quat_2x2_lattice_enumerate_cvp_filter(&cvp_res, &basis, &target, q, dist_bound, &quat_dim2_lattice_test_cvp_condition, params, max_tries)); - - // solution should not exist because of impossible condition - ibz_mat_2x2_set(&basis, -1, 2, 1, 2); - ibz_vec_2_set(&target, -3, 3); - ibz_set(&p, 2); - q = 3; - dist_bound = 20; - max_tries = 1000; - res = res || (quat_2x2_lattice_enumerate_cvp_filter(&cvp_res, &basis, &target, q, dist_bound, &quat_dim2_lattice_test_cvp_condition, params, max_tries)); - - // should succeed, but close to bound - ibz_vec_2_set(&target, 1216765, 879777); - q = 12165; - dist_bound = 32; - ibz_set(&p, 3); - max_tries = 100; - ibz_mat_2x2_set(&basis, 364, 0, 1323546, 266606); - if (quat_2x2_lattice_enumerate_cvp_filter(&cvp_res, &basis, &target, q, dist_bound, &quat_dim2_lattice_test_cvp_condition, params, max_tries)) - { - // used cvp_res and condition to exfiltrate standard coords of distance to target from close vector found - ibz_copy(&(diff[0]), &(cvp_res.coord[0])); - ibz_copy(&(diff[1]), &(cvp_res.coord[1])); - // compute close vector in lattice from target and diff - ibz_sub(&(found[0]), &(target[0]), &(diff[0])); - ibz_sub(&(found[1]), &(target[1]), &(diff[1])); - // norm bound on diff ok? - ibz_set(&norm_q, q); - ibz_set(&bound, 2); - ibz_pow(&bound, &bound, dist_bound); - quat_dim2_lattice_norm(&norm, &(diff[0]), &(diff[1]), &norm_q); - res = res || !(ibz_cmp(&norm, &bound) < 0); - // Condition ok - res = res || (!quat_dim2_lattice_test_cvp_condition(&cvp_res, &diff, params)); - // Is in lattice - res = res || (!quat_dim2_lattice_contains(&basis, &(found[0]), &(found[1]))); - } - else - { - res = 1; - } - - ibz_vec_2_set(&target, 1216765, -223409); - q = 12; - dist_bound = 25; - ibz_set(&p, 3); - max_tries = 50; - ibz_mat_2x2_set(&basis, 364, 2, -132346, 26606); - if (quat_2x2_lattice_enumerate_cvp_filter(&cvp_res, &basis, &target, q, dist_bound, &quat_dim2_lattice_test_cvp_condition, params, max_tries)) - { - // used cvp_res and condition to exfiltrate standard coords of distance to target from close vector found - ibz_copy(&(diff[0]), &(cvp_res.coord[0])); - ibz_copy(&(diff[1]), &(cvp_res.coord[1])); - // compute close vector in lattice from target and diff - ibz_sub(&(found[0]), &(target[0]), &(diff[0])); - ibz_sub(&(found[1]), &(target[1]), &(diff[1])); - // norm bound on diff ok? - ibz_set(&norm_q, q); - ibz_set(&bound, 2); - ibz_pow(&bound, &bound, dist_bound); - quat_dim2_lattice_norm(&norm, &(diff[0]), &(diff[1]), &norm_q); - res = res || !(ibz_cmp(&norm, &bound) < 0); - // Condition ok - res = res || (!quat_dim2_lattice_test_cvp_condition(&cvp_res, &diff, params)); - // Is in lattice - res = res || (!quat_dim2_lattice_contains(&basis, &(found[0]), &(found[1]))); - } - else - { - res = 1; - } - - //large passing test - ibz_set_from_str(&(target[0]),"24331603791763515691729329496192502951056898161849272968170597636916968011043891967931576902713229532952543949167870260",10); - ibz_set_from_str(&(target[1]),"320864169455876864410246920205472260746024223953596490297261861428291460634916982031632479909031611896628831462307645903",10); - ibz_set_from_str(&(basis[0][0]),"83823929950128301594915602697228677079260482500022964929273",10); - ibz_set_from_str(&(basis[0][1]),"0",10); - ibz_set_from_str(&(basis[1][0]),"26601400243014239200180507899382755112580169588401175904342542265512938583814884922817611265843666255091702318534544478",10); - ibz_set_from_str(&(basis[1][1]),"702645123228401649030937397460831326065409163240113467483219315690011711473572222698591407715178198721852976513892308529",10); - q = 1; - dist_bound = 600; - ibz_set(&p, 3); - max_tries = 1000; - if (quat_2x2_lattice_enumerate_cvp_filter(&cvp_res, &basis, &target, q, dist_bound, &quat_dim2_lattice_test_cvp_condition, params, max_tries)) - { - // used cvp_res and condition to exfiltrate standard coords of distance to target from close vector found - ibz_copy(&(diff[0]), &(cvp_res.coord[0])); - ibz_copy(&(diff[1]), &(cvp_res.coord[1])); - // compute close vector in lattice from target and diff - ibz_sub(&(found[0]), &(target[0]), &(diff[0])); - ibz_sub(&(found[1]), &(target[1]), &(diff[1])); - // norm bound on diff ok? - ibz_set(&norm_q, q); - ibz_set(&bound, 2); - ibz_pow(&bound, &bound, dist_bound); - quat_dim2_lattice_norm(&norm, &(diff[0]), &(diff[1]), &norm_q); - res = res || !(ibz_cmp(&norm, &bound) < 0); - // Condition ok - res = res || (!quat_dim2_lattice_test_cvp_condition(&cvp_res, &diff, params)); - // Is in lattice - res = res || (!quat_dim2_lattice_contains(&basis, &(found[0]), &(found[1]))); - } - else - { - res = 1; - } - - if (res != 0) - { - printf("Quaternion unit test dim2_2x2_lattice_enumerate_cvp_filter failed\n"); - } - ibz_mat_2x2_finalize(&basis); - quat_alg_elem_finalize(&cvp_res); - ibz_vec_2_finalize(&target); - ibz_vec_2_finalize(&diff); - ibz_vec_2_finalize(&found); - ibz_finalize(&p); - ibz_finalize(&norm_q); - ibz_finalize(&norm); - ibz_finalize(&bound); - return res; -} - // run all previous tests -int quat_test_dim2() +int +quat_test_dim2(void) { int res = 0; - printf("\nRunning quaternion tests of functions for matrices, vectors and lattices in dimension 2\n"); + printf("\nRunning quaternion tests of functions for matrices, vectors and lattices in " + "dimension 2\n"); res = res | quat_test_dim2_ibz_vec_2_set(); res = res | quat_test_dim2_ibz_mat_2x2_set(); + res = res | quat_test_dim2_ibz_mat_2x2_copy(); res = res | quat_test_dim2_ibz_mat_2x2_det_from_ibz(); res = res | quat_test_dim2_ibz_mat_2x2_eval(); res = res | quat_test_dim2_ibz_mat_2x2_mul_mod(); res = res | quat_test_dim2_ibz_mat_2x2_inv_mod(); - res = res | quat_test_dim2_lattice_test_cvp_condition(); - res = res | quat_test_dim2_lattice_contains(); - res = res | quat_test_dim2_lattice_norm(); - res = res | quat_test_dim2_lattice_bilinear(); - res = res | quat_test_dim2_lattice_short_basis(); - res = res | quat_test_dim2_lattice_get_coefficient_with_orthogonalisation(); - res = res | quat_test_dim2_lattice_closest_vector(); - res = res | quat_test_dim2_lattice_get_qf_on_lattice(); - res = res | quat_test_dim2_lattice_bound_and_condition(); - res = res | quat_test_dim2_lattice_qf_value_bound_generation(); - res = res | quat_test_dim2_lattice_qf_enumerate_short_vec(); - res = res | quat_test_dim2_2x2_lattice_enumerate_cvp_filter(); return (res); } diff --git a/src/quaternion/ref/generic/test/dim4.c b/src/quaternion/ref/generic/test/dim4.c index a66dd49..0ad38ce 100644 --- a/src/quaternion/ref/generic/test/dim4.c +++ b/src/quaternion/ref/generic/test/dim4.c @@ -1,16 +1,18 @@ #include "quaternion_tests.h" // internal helper function -//void ibz_mat_4x4_mul(ibz_mat_4x4_t *res, const ibz_mat_4x4_t *a, const ibz_mat_4x4_t *b) -int quat_test_dim4_ibz_mat_4x4_mul(){ +// void ibz_mat_4x4_mul(ibz_mat_4x4_t *res, const ibz_mat_4x4_t *a, const ibz_mat_4x4_t *b) +int +quat_test_dim4_ibz_mat_4x4_mul(void) +{ int res = 0; ibz_mat_4x4_t a, b, prod, cmp; ibz_mat_4x4_init(&a); ibz_mat_4x4_init(&b); ibz_mat_4x4_init(&prod); ibz_mat_4x4_init(&cmp); - for (int i = 0; i <4; i++){ - for (int j = 0; j <4; j++){ + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { ibz_set(&(a[i][j]), 0); ibz_set(&(b[i][j]), 0); ibz_set(&(cmp[i][j]), 0); @@ -49,10 +51,10 @@ int quat_test_dim4_ibz_mat_4x4_mul(){ ibz_set(&(cmp[3][2]), -1); ibz_set(&(cmp[3][3]), 2); ibz_mat_4x4_mul(&prod, &a, &b); - res = res || ibz_mat_4x4_equal(&cmp,&prod); + res = res || ibz_mat_4x4_equal(&cmp, &prod); ibz_mat_4x4_mul(&b, &a, &b); - res = res || ibz_mat_4x4_equal(&b,&cmp); + res = res || ibz_mat_4x4_equal(&b, &cmp); ibz_set(&(b[0][0]), -1); ibz_set(&(b[1][0]), 1); @@ -64,9 +66,9 @@ int quat_test_dim4_ibz_mat_4x4_mul(){ ibz_set(&(b[3][2]), -1); ibz_set(&(b[3][3]), 2); ibz_mat_4x4_mul(&a, &a, &b); - res = res || ibz_mat_4x4_equal(&a,&cmp); + res = res || ibz_mat_4x4_equal(&a, &cmp); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim4_ibz_mat_4x4_mul failed\n"); } ibz_mat_4x4_finalize(&a); @@ -77,78 +79,322 @@ int quat_test_dim4_ibz_mat_4x4_mul(){ } // helper functions for lattices -//void ibz_vec_4_set(ibz_vec_4_t *vec, int64_t coord0, int64_t coord1, int64_t coord2, int64_t coord3) -int quat_test_dim4_ibz_vec_4_set(){ +// void ibz_vec_4_set(ibz_vec_4_t *vec, int32_t coord0, int32_t coord1, int32_t coord2, int32_t +// coord3) +int +quat_test_dim4_ibz_vec_4_set(void) +{ int res = 0; ibz_vec_4_t a; ibz_vec_4_init(&a); - ibz_vec_4_set(&a,1,2,3,4); - res = res || !(1 == ibz_get(&(a[0]))); - res = res || !(2 == ibz_get(&(a[1]))); - res = res || !(3 == ibz_get(&(a[2]))); - res = res || !(4 == ibz_get(&(a[3]))); - if (res != 0){ + ibz_vec_4_set(&a, 1, 2, 3, 4); + res = res || !(ibz_cmp_int32(&(a[0]), 1) == 0); + res = res || !(ibz_cmp_int32(&(a[1]), 2) == 0); + res = res || !(ibz_cmp_int32(&(a[2]), 3) == 0); + res = res || !(ibz_cmp_int32(&(a[3]), 4) == 0); + if (res != 0) { printf("Quaternion unit test dim4_ibz_vec_4_set failed\n"); } ibz_vec_4_finalize(&a); - return(res); + return (res); } - -//void ibz_vec_4_copy(ibz_vec_4_t *new, const ibz_vec_4_t *vec); -int quat_test_dim4_ibz_vec_4_copy(){ +// void ibz_vec_4_copy(ibz_vec_4_t *new, const ibz_vec_4_t *vec); +int +quat_test_dim4_ibz_vec_4_copy(void) +{ int res = 0; - ibz_vec_4_t a,b; + ibz_vec_4_t a, b; ibz_vec_4_init(&a); ibz_vec_4_init(&b); - ibz_vec_4_set(&a,1,2,3,4); - ibz_vec_4_copy(&b,&a); - res = res || !(1 == ibz_get(&(b[0]))); - res = res || !(2 == ibz_get(&(b[1]))); - res = res || !(3 == ibz_get(&(b[2]))); - res = res || !(4 == ibz_get(&(b[3]))); - ibz_vec_4_copy(&a,&a); - res = res || !(1 == ibz_get(&(a[0]))); - res = res || !(2 == ibz_get(&(a[1]))); - res = res || !(3 == ibz_get(&(a[2]))); - res = res || !(4 == ibz_get(&(a[3]))); + ibz_vec_4_set(&a, 1, 2, 3, 4); + ibz_vec_4_copy(&b, &a); + res = res || !(ibz_cmp_int32(&(b[0]), 1) == 0); + res = res || !(ibz_cmp_int32(&(b[1]), 2) == 0); + res = res || !(ibz_cmp_int32(&(b[2]), 3) == 0); + res = res || !(ibz_cmp_int32(&(b[3]), 4) == 0); + ibz_vec_4_copy(&a, &a); + res = res || !(ibz_cmp_int32(&(a[0]), 1) == 0); + res = res || !(ibz_cmp_int32(&(a[1]), 2) == 0); + res = res || !(ibz_cmp_int32(&(a[2]), 3) == 0); + res = res || !(ibz_cmp_int32(&(a[3]), 4) == 0); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim4_ibz_vec_4_copy failed\n"); } ibz_vec_4_finalize(&a); ibz_vec_4_finalize(&b); - return(res); + return (res); } - -//void ibz_vec_4_negate(ibz_vec_4_t *neg, const ibz_vec_4_t *vec); -int quat_test_dim4_ibz_vec_4_negate(){ +// void ibz_vec_4_negate(ibz_vec_4_t *neg, const ibz_vec_4_t *vec); +int +quat_test_dim4_ibz_vec_4_negate(void) +{ int res = 0; - ibz_vec_4_t a,b; + ibz_vec_4_t a, b; ibz_vec_4_init(&a); ibz_vec_4_init(&b); - ibz_vec_4_set(&a,1,2,3,4); - ibz_vec_4_negate(&b,&a); - res = res || !(-1 == ibz_get(&(b[0]))); - res = res || !(-2 == ibz_get(&(b[1]))); - res = res || !(-3 == ibz_get(&(b[2]))); - res = res || !(-4 == ibz_get(&(b[3]))); - ibz_vec_4_negate(&a,&a); - res = res || !(-1 == ibz_get(&(a[0]))); - res = res || !(-2 == ibz_get(&(a[1]))); - res = res || !(-3 == ibz_get(&(a[2]))); - res = res || !(-4 == ibz_get(&(a[3]))); - if (res != 0){ + ibz_vec_4_set(&a, 1, 2, 3, 4); + ibz_vec_4_negate(&b, &a); + res = res || !(ibz_cmp_int32(&(b[0]), -1) == 0); + res = res || !(ibz_cmp_int32(&(b[1]), -2) == 0); + res = res || !(ibz_cmp_int32(&(b[2]), -3) == 0); + res = res || !(ibz_cmp_int32(&(b[3]), -4) == 0); + ibz_vec_4_negate(&a, &a); + res = res || !(ibz_cmp_int32(&(a[0]), -1) == 0); + res = res || !(ibz_cmp_int32(&(a[1]), -2) == 0); + res = res || !(ibz_cmp_int32(&(a[2]), -3) == 0); + res = res || !(ibz_cmp_int32(&(a[3]), -4) == 0); + if (res != 0) { printf("Quaternion unit test dim4_ibz_vec_4_negate failed\n"); } ibz_vec_4_finalize(&a); ibz_vec_4_finalize(&b); - return(res); + return (res); } -//void ibz_vec_4_linear_combination(ibz_vec_4_t *lc, const ibz_t *coeff_a, const ibz_vec_4_t *vec_a, const ibz_t *coeff_b, const ibz_vec_4_t *vec_b){ -int quat_test_dim4_ibz_vec_4_linear_combination(){ +// void ibz_vec_4_copy_ibz(ibz_vec_4_t *coord, const ibz_t *coord0,const ibz_t *coord1,const ibz_t +// *coord2,const ibz_t *coord3){ +int +quat_test_dim4_vec_4_copy_ibz(void) +{ + int res = 0; + ibz_t a, b, c, d; + ibz_vec_4_t coord; + ibz_vec_4_init(&coord); + ibz_init(&a); + ibz_init(&b); + ibz_init(&c); + ibz_init(&d); + ibz_set(&a, 1); + ibz_set(&b, 2); + ibz_set(&c, 3); + ibz_set(&d, 4); + ibz_vec_4_copy_ibz(&coord, &a, &b, &c, &d); + res = res || ibz_cmp(&(coord[0]), &a); + res = res || ibz_cmp(&(coord[1]), &b); + res = res || ibz_cmp(&(coord[2]), &c); + res = res || ibz_cmp(&(coord[3]), &d); + + if (res != 0) { + printf("Quaternion unit test dim4_vec_4_copy_ibz failed\n"); + } + ibz_finalize(&a); + ibz_finalize(&b); + ibz_finalize(&c); + ibz_finalize(&d); + ibz_vec_4_finalize(&coord); + return (res); +} + +// void ibz_vec_4_add(ibz_vec_4_t *res, const ibz_vec_4_t *a, const ibz_vec_4_t *b); +int +quat_test_dim4_ibz_vec_4_add(void) +{ + int res = 0; + ibz_vec_4_t a, b, c, cmp; + ibz_vec_4_init(&a); + ibz_vec_4_init(&b); + ibz_vec_4_init(&c); + ibz_vec_4_init(&cmp); + + ibz_set(&(a[0]), 1); + ibz_set(&(a[1]), -2); + ibz_set(&(a[2]), 7); + ibz_set(&(a[3]), 199); + ibz_set(&(b[0]), -6); + ibz_set(&(b[1]), 2); + ibz_set(&(b[2]), 67); + ibz_set(&(b[3]), -22); + ibz_set(&(cmp[0]), -5); + ibz_set(&(cmp[1]), 0); + ibz_set(&(cmp[2]), 74); + ibz_set(&(cmp[3]), 177); + ibz_vec_4_add(&c, &a, &b); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(c[i]), &(cmp[i])); + } + + ibz_set(&(a[0]), -122); + ibz_set(&(a[1]), 0); + ibz_set(&(a[2]), -7); + ibz_set(&(a[3]), 1889); + ibz_set(&(b[0]), -6); + ibz_set(&(b[1]), 2); + ibz_set(&(b[2]), 67); + ibz_set(&(b[3]), -1889); + ibz_set(&(cmp[0]), -128); + ibz_set(&(cmp[1]), 2); + ibz_set(&(cmp[2]), 60); + ibz_set(&(cmp[3]), 0); + ibz_vec_4_add(&c, &a, &b); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(c[i]), &(cmp[i])); + } + + ibz_set(&(a[0]), -1); + ibz_set(&(a[1]), 2); + ibz_set(&(a[2]), -7); + ibz_set(&(a[3]), 19); + ; + ibz_set(&(cmp[0]), -2); + ibz_set(&(cmp[1]), 4); + ibz_set(&(cmp[2]), -14); + ibz_set(&(cmp[3]), 38); + ibz_vec_4_add(&a, &a, &a); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(a[i]), &(cmp[i])); + } + + if (res != 0) { + printf("Quaternion unit test dim4_ibz_vec_4_add failed\n"); + } + ibz_vec_4_finalize(&a); + ibz_vec_4_finalize(&b); + ibz_vec_4_finalize(&c); + ibz_vec_4_finalize(&cmp); + return (res); +} + +// void ibz_vec_4_sub(ibz_vec_4_t *res, const ibz_vec_4_t *a, const ibz_vec_4_t *b); +int +quat_test_dim4_ibz_vec_4_sub(void) +{ + int res = 0; + ibz_vec_4_t a, b, c, cmp; + ibz_vec_4_init(&a); + ibz_vec_4_init(&b); + ibz_vec_4_init(&c); + ibz_vec_4_init(&cmp); + + ibz_set(&(a[0]), 1); + ibz_set(&(a[1]), -2); + ibz_set(&(a[2]), 7); + ibz_set(&(a[3]), 199); + ibz_set(&(b[0]), -6); + ibz_set(&(b[1]), 2); + ibz_set(&(b[2]), 67); + ibz_set(&(b[3]), -22); + ibz_set(&(cmp[0]), 7); + ibz_set(&(cmp[1]), -4); + ibz_set(&(cmp[2]), -60); + ibz_set(&(cmp[3]), 221); + ibz_vec_4_sub(&c, &a, &b); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(c[i]), &(cmp[i])); + } + + ibz_set(&(a[0]), -122); + ibz_set(&(a[1]), 0); + ibz_set(&(a[2]), -7); + ibz_set(&(a[3]), 1889); + ibz_set(&(b[0]), -6); + ibz_set(&(b[1]), 2); + ibz_set(&(b[2]), 67); + ibz_set(&(b[3]), -1889); + ibz_set(&(cmp[0]), -116); + ibz_set(&(cmp[1]), -2); + ibz_set(&(cmp[2]), -74); + ibz_set(&(cmp[3]), 3778); + ibz_vec_4_sub(&c, &a, &b); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(c[i]), &(cmp[i])); + } + + ibz_set(&(a[0]), -1); + ibz_set(&(a[1]), 2); + ibz_set(&(a[2]), -7); + ibz_set(&(a[3]), 19); + ; + ibz_set(&(cmp[0]), 0); + ibz_set(&(cmp[1]), 0); + ibz_set(&(cmp[2]), 0); + ibz_set(&(cmp[3]), 0); + ibz_vec_4_sub(&a, &a, &a); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(a[i]), &(cmp[i])); + } + + if (res != 0) { + printf("Quaternion unit test dim4_ibz_vec_4_sub failed\n"); + } + ibz_vec_4_finalize(&a); + ibz_vec_4_finalize(&b); + ibz_vec_4_finalize(&c); + ibz_vec_4_finalize(&cmp); + return (res); +} + +// void ibz_vec_4_is_zero(ibz_vec_4_t *x); +int +quat_test_dim4_ibz_vec_4_is_zero(void) +{ + int res = 0; + ibz_vec_4_t x; + ibz_vec_4_init(&x); + ibz_vec_4_set(&x, 0, 0, 0, 0); + res = res || !ibz_vec_4_is_zero(&x); + ibz_vec_4_set(&x, 20, 0, 0, 0); + res = res || ibz_vec_4_is_zero(&x); + ibz_vec_4_set(&x, 0, -1, 0, 0); + res = res || ibz_vec_4_is_zero(&x); + ibz_vec_4_set(&x, 0, 0, 2, 0); + res = res || ibz_vec_4_is_zero(&x); + ibz_vec_4_set(&x, 0, 0, 0, 1); + res = res || ibz_vec_4_is_zero(&x); + ibz_vec_4_set(&x, 1, 1, 1, 1); + res = res || ibz_vec_4_is_zero(&x); + ibz_vec_4_set(&x, -1, 1, 1, -1); + res = res || ibz_vec_4_is_zero(&x); + ibz_vec_4_set(&x, 0, 0, 0, 0); + ibz_set(&(x[0]), 0); + ibz_set(&(x[1]), 0); + ibz_set(&(x[2]), 0); + ibz_set(&(x[3]), 0); + res = res | (1 - ibz_vec_4_is_zero(&x)); + ibz_set(&(x[3]), 1); + res = res | ibz_vec_4_is_zero(&x); + ibz_set(&(x[3]), -1); + res = res | ibz_vec_4_is_zero(&x); + ibz_set(&(x[2]), 1); + ibz_set(&(x[3]), 0); + res = res | ibz_vec_4_is_zero(&x); + ibz_set(&(x[2]), -20); + res = res | ibz_vec_4_is_zero(&x); + ibz_set(&(x[1]), 1); + ibz_set(&(x[2]), 0); + res = res | ibz_vec_4_is_zero(&x); + ibz_set(&(x[1]), -50000); + res = res | ibz_vec_4_is_zero(&x); + ibz_set(&(x[0]), 1); + ibz_set(&(x[1]), 0); + res = res | ibz_vec_4_is_zero(&x); + ibz_set(&(x[0]), -90000); + res = res | ibz_vec_4_is_zero(&x); + ibz_set(&(x[0]), 0); + ibz_set(&(x[1]), -500); + ibz_set(&(x[2]), 20); + ibz_set(&(x[3]), 0); + res = res | ibz_vec_4_is_zero(&x); + ibz_set(&(x[0]), 19); + ibz_set(&(x[1]), -500); + ibz_set(&(x[2]), 20); + ibz_set(&(x[3]), -2); + res = res | ibz_vec_4_is_zero(&x); + + if (res != 0) { + printf("Quaternion unit test dim4_ibz_vec_4_is_zero failed\n"); + } + ibz_vec_4_finalize(&x); + return (res); +} + +// void ibz_vec_4_linear_combination(ibz_vec_4_t *lc, const ibz_t *coeff_a, const ibz_vec_4_t +// *vec_a, const ibz_t *coeff_b, const ibz_vec_4_t *vec_b){ +int +quat_test_dim4_ibz_vec_4_linear_combination(void) +{ int res = 0; ibz_vec_4_t a, b, lc, cmp; ibz_t ca, cb; @@ -158,21 +404,21 @@ int quat_test_dim4_ibz_vec_4_linear_combination(){ ibz_vec_4_init(&b); ibz_vec_4_init(&lc); ibz_vec_4_init(&cmp); - ibz_vec_4_set(&a,1,2,3,4); - ibz_vec_4_set(&b,-2,1,3,-3); - ibz_set(&ca,2); - ibz_set(&cb,-1); - ibz_vec_4_set(&cmp,4,3,3,11); - ibz_vec_4_linear_combination(&lc,&ca,&a,&cb,&b); - for(int i = 0; i < 4; i++){ - res = res || ibz_cmp(&(lc[i]),&(cmp[i])); + ibz_vec_4_set(&a, 1, 2, 3, 4); + ibz_vec_4_set(&b, -2, 1, 3, -3); + ibz_set(&ca, 2); + ibz_set(&cb, -1); + ibz_vec_4_set(&cmp, 4, 3, 3, 11); + ibz_vec_4_linear_combination(&lc, &ca, &a, &cb, &b); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(lc[i]), &(cmp[i])); } - ibz_vec_4_set(&cmp,1,2,3,4); - ibz_vec_4_linear_combination(&a,&ca,&a,&cb,&a); - for(int i = 0; i < 4; i++){ - res = res || ibz_cmp(&(a[i]),&(cmp[i])); + ibz_vec_4_set(&cmp, 1, 2, 3, 4); + ibz_vec_4_linear_combination(&a, &ca, &a, &cb, &a); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(a[i]), &(cmp[i])); } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim4_ibz_vec_4_linear_combination failed\n"); } ibz_finalize(&ca); @@ -181,106 +427,150 @@ int quat_test_dim4_ibz_vec_4_linear_combination(){ ibz_vec_4_finalize(&b); ibz_vec_4_finalize(&lc); ibz_vec_4_finalize(&cmp); - return(res); + return (res); } -//int ibz_vec_4_scalar_div(ibz_vec_4_t *quot, const ibz_t *scalar, const ibz_vec_4_t *vec); -int quat_test_dim4_ibz_vec_4_scalar_div(){ +// void ibz_vec_4_scalar_mul(ibz_vec_4_t *prod, const ibz_t *scalar, const ibz_vec_4_t *vec); +int +quat_test_dim4_ibz_vec_4_scalar_mul(void) +{ int res = 0; int s; ibz_t scalar; - ibz_vec_4_t quot,vec; + ibz_vec_4_t prod, vec; + ibz_vec_4_init(&vec); + ibz_vec_4_init(&prod); + ibz_init(&scalar); + + s = 5; + ibz_set(&scalar, s); + for (int i = 0; i < 4; i++) { + ibz_set(&(vec[i]), (i)); + } + ibz_vec_4_scalar_mul(&prod, &scalar, &vec); + for (int i = 0; i < 4; i++) { + res = res || (ibz_cmp_int32(&(prod[i]), i * s) != 0); + } + + ibz_vec_4_scalar_mul(&vec, &scalar, &vec); + for (int i = 0; i < 4; i++) { + res = res || (ibz_cmp_int32(&(vec[i]), i * s) != 0); + } + + if (res != 0) { + printf("Quaternion unit test dim4_ibz_vec_4_scalar_mul failed\n"); + } + ibz_vec_4_finalize(&vec); + ibz_vec_4_finalize(&prod); + ibz_finalize(&scalar); + return (res); +} + +// int ibz_vec_4_scalar_div(ibz_vec_4_t *quot, const ibz_t *scalar, const ibz_vec_4_t *vec); +int +quat_test_dim4_ibz_vec_4_scalar_div(void) +{ + int res = 0; + int s; + ibz_t scalar; + ibz_vec_4_t quot, vec; ibz_vec_4_init(&vec); ibz_vec_4_init("); ibz_init(&scalar); s = 5; - ibz_set(&scalar,s); - for(int i = 0; i < 4; i++){ - ibz_set(&(vec[i]),(i)*s); + ibz_set(&scalar, s); + for (int i = 0; i < 4; i++) { + ibz_set(&(vec[i]), (i)*s); } - res = res || !ibz_vec_4_scalar_div(",&scalar,&vec); - for(int i = 0; i < 4; i++){ - res = res || (ibz_get(&(quot[i])) !=i); + res = res || !ibz_vec_4_scalar_div(", &scalar, &vec); + for (int i = 0; i < 4; i++) { + res = res || (ibz_cmp_int32(&(quot[i]), i) != 0); } - res = res || ibz_vec_4_scalar_div(&vec,&scalar,&vec); - for(int i = 0; i < 4; i++){ - res = res || (ibz_get(&(vec[i])) !=i); + res = res || ibz_vec_4_scalar_div(&vec, &scalar, &vec); + for (int i = 0; i < 4; i++) { + res = res || (ibz_cmp_int32(&(vec[i]), i) != 0); } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim4_ibz_vec_4_scalar_div failed\n"); } ibz_vec_4_finalize(&vec); ibz_vec_4_finalize("); ibz_finalize(&scalar); - return(res); + return (res); } -//void ibz_mat_4x4_copy(ibz_mat_4x4_t *new, const ibz_mat_4x4_t *mat); -int quat_test_dim4_ibz_mat_4x4_copy(){ +// void ibz_mat_4x4_copy(ibz_mat_4x4_t *new, const ibz_mat_4x4_t *mat); +int +quat_test_dim4_ibz_mat_4x4_copy(void) +{ int res = 0; ibz_mat_4x4_t mat, new; ibz_mat_4x4_init(&new); ibz_mat_4x4_init(&mat); ibz_mat_4x4_zero(&mat); - ibz_set(&(mat[0][0]),1); - ibz_set(&(mat[0][1]),2); - ibz_set(&(mat[0][2]),-7); + ibz_set(&(mat[0][0]), 1); + ibz_set(&(mat[0][1]), 2); + ibz_set(&(mat[0][2]), -7); ibz_set(&(mat[0][3]), 77); - ibz_set(&(mat[2][0]),13); - ibz_set(&(mat[1][1]),20); - ibz_set(&(mat[3][2]),-77); + ibz_set(&(mat[2][0]), 13); + ibz_set(&(mat[1][1]), 20); + ibz_set(&(mat[3][2]), -77); ibz_set(&(mat[3][3]), 7); - ibz_mat_4x4_copy(&new,&mat); - res = res || !ibz_mat_4x4_equal(&new,&mat); - if (res != 0){ + ibz_mat_4x4_copy(&new, &mat); + res = res || !ibz_mat_4x4_equal(&new, &mat); + if (res != 0) { printf("Quaternion unit test dim4_ibz_mat_4x4_copy failed\n"); } ibz_mat_4x4_finalize(&new); ibz_mat_4x4_finalize(&mat); - return(res); + return (res); } -//void ibz_mat_4x4_negate(ibz_mat_4x4_t *neg, const ibz_mat_4x4_t *mat); -int quat_test_dim4_ibz_mat_4x4_negate(){ +// void ibz_mat_4x4_negate(ibz_mat_4x4_t *neg, const ibz_mat_4x4_t *mat); +int +quat_test_dim4_ibz_mat_4x4_negate(void) +{ int res = 0; - ibz_mat_4x4_t mat, neg,cmp; + ibz_mat_4x4_t mat, neg, cmp; ibz_mat_4x4_init(&neg); ibz_mat_4x4_init(&mat); ibz_mat_4x4_init(&cmp); ibz_mat_4x4_zero(&cmp); ibz_mat_4x4_zero(&mat); - ibz_set(&(mat[0][0]),1); - ibz_set(&(cmp[0][0]),-1); - ibz_set(&(mat[0][1]),2); - ibz_set(&(cmp[0][1]),-2); - ibz_set(&(mat[0][2]),-7); - ibz_set(&(cmp[0][2]),7); + ibz_set(&(mat[0][0]), 1); + ibz_set(&(cmp[0][0]), -1); + ibz_set(&(mat[0][1]), 2); + ibz_set(&(cmp[0][1]), -2); + ibz_set(&(mat[0][2]), -7); + ibz_set(&(cmp[0][2]), 7); ibz_set(&(mat[0][3]), 77); ibz_set(&(cmp[0][3]), -77); - ibz_set(&(mat[2][0]),13); - ibz_set(&(cmp[2][0]),-13); - ibz_set(&(mat[1][1]),20); - ibz_set(&(cmp[1][1]),-20); - ibz_set(&(mat[3][2]),-77); - ibz_set(&(cmp[3][2]),77); + ibz_set(&(mat[2][0]), 13); + ibz_set(&(cmp[2][0]), -13); + ibz_set(&(mat[1][1]), 20); + ibz_set(&(cmp[1][1]), -20); + ibz_set(&(mat[3][2]), -77); + ibz_set(&(cmp[3][2]), 77); ibz_set(&(mat[3][3]), 7); ibz_set(&(cmp[3][3]), -7); - ibz_mat_4x4_negate(&neg,&mat); - res = res || !ibz_mat_4x4_equal(&neg,&cmp); - if (res != 0){ + ibz_mat_4x4_negate(&neg, &mat); + res = res || !ibz_mat_4x4_equal(&neg, &cmp); + if (res != 0) { printf("Quaternion unit test dim4_ibz_mat_4x4_negate failed\n"); } ibz_mat_4x4_finalize(&neg); ibz_mat_4x4_finalize(&mat); ibz_mat_4x4_finalize(&cmp); - return(res); + return (res); } -//void ibz_mat_4x4_transpose(ibz_mat_4x4_t *transposed, const ibz_mat_4x4_t *mat) -int quat_test_dim4_ibz_mat_4x4_transpose(){ +// void ibz_mat_4x4_transpose(ibz_mat_4x4_t *transposed, const ibz_mat_4x4_t *mat) +int +quat_test_dim4_ibz_mat_4x4_transpose(void) +{ int res = 0; ibz_mat_4x4_t mat, transposed, cmp; ibz_mat_4x4_init(&transposed); @@ -288,159 +578,170 @@ int quat_test_dim4_ibz_mat_4x4_transpose(){ ibz_mat_4x4_init(&cmp); ibz_mat_4x4_zero(&mat); ibz_mat_4x4_zero(&cmp); - ibz_set(&(mat[0][0]),1); - ibz_set(&(cmp[0][0]),1); - ibz_set(&(mat[0][1]),2); - ibz_set(&(cmp[1][0]),2); - ibz_set(&(mat[0][2]),-7); - ibz_set(&(cmp[2][0]),-7); + ibz_set(&(mat[0][0]), 1); + ibz_set(&(cmp[0][0]), 1); + ibz_set(&(mat[0][1]), 2); + ibz_set(&(cmp[1][0]), 2); + ibz_set(&(mat[0][2]), -7); + ibz_set(&(cmp[2][0]), -7); ibz_set(&(mat[0][3]), 77); ibz_set(&(cmp[3][0]), 77); - ibz_set(&(mat[2][0]),13); - ibz_set(&(cmp[0][2]),13); - ibz_set(&(mat[1][1]),20); - ibz_set(&(cmp[1][1]),20); - ibz_set(&(mat[3][2]),-77); - ibz_set(&(cmp[2][3]),-77); + ibz_set(&(mat[2][0]), 13); + ibz_set(&(cmp[0][2]), 13); + ibz_set(&(mat[1][1]), 20); + ibz_set(&(cmp[1][1]), 20); + ibz_set(&(mat[3][2]), -77); + ibz_set(&(cmp[2][3]), -77); ibz_set(&(mat[3][3]), 7); ibz_set(&(cmp[3][3]), 7); - ibz_mat_4x4_transpose(&transposed,&mat); - res = res || !ibz_mat_4x4_equal(&transposed,&cmp); - if (res != 0){ + ibz_mat_4x4_transpose(&transposed, &mat); + res = res || !ibz_mat_4x4_equal(&transposed, &cmp); + if (res != 0) { printf("Quaternion unit test dim4_ibz_mat_4x4_transpose failed\n"); } ibz_mat_4x4_finalize(&transposed); ibz_mat_4x4_finalize(&mat); ibz_mat_4x4_finalize(&cmp); - return(res); + return (res); } -//void ibz_mat_4x4_zero(ibz_mat_4x4_t *zero); -int quat_test_dim4_ibz_mat_4x4_zero(){ +// void ibz_mat_4x4_zero(ibz_mat_4x4_t *zero); +int +quat_test_dim4_ibz_mat_4x4_zero(void) +{ int res = 0; ibz_mat_4x4_t mat, cmp; ibz_mat_4x4_init(&cmp); ibz_mat_4x4_init(&mat); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(cmp[i][j]),0); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(cmp[i][j]), 0); } } ibz_mat_4x4_zero(&mat); - res = res || !ibz_mat_4x4_equal(&cmp,&mat); - if (res != 0){ + res = res || !ibz_mat_4x4_equal(&cmp, &mat); + if (res != 0) { printf("Quaternion unit test dim4_ibz_mat_4x4_zero failed\n"); } ibz_mat_4x4_finalize(&cmp); ibz_mat_4x4_finalize(&mat); - return(res); + return (res); } -//void ibz_mat_4x4_identity(ibz_mat_4x4_t *id); -int quat_test_dim4_ibz_mat_4x4_identity(){ +// void ibz_mat_4x4_identity(ibz_mat_4x4_t *id); +int +quat_test_dim4_ibz_mat_4x4_identity(void) +{ int res = 0; ibz_mat_4x4_t mat, cmp; ibz_mat_4x4_init(&cmp); ibz_mat_4x4_init(&mat); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(cmp[i][j]),0); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(cmp[i][j]), 0); } - ibz_set(&(cmp[i][i]),1); + ibz_set(&(cmp[i][i]), 1); } ibz_mat_4x4_identity(&mat); - res = res || !ibz_mat_4x4_equal(&cmp,&mat); - if (res != 0){ + res = res || !ibz_mat_4x4_equal(&cmp, &mat); + if (res != 0) { printf("Quaternion unit test dim4_ibz_mat_4x4_identity failed\n"); } ibz_mat_4x4_finalize(&cmp); ibz_mat_4x4_finalize(&mat); - return(res); + return (res); } -//int ibz_mat_4x4_is_identity(const ibz_mat_4x4_t *mat); -int quat_test_dim4_ibz_mat_4x4_is_identity(){ +// int ibz_mat_4x4_is_identity(const ibz_mat_4x4_t *mat); +int +quat_test_dim4_ibz_mat_4x4_is_identity(void) +{ int res = 0; ibz_mat_4x4_t mat; ibz_mat_4x4_init(&mat); ibz_mat_4x4_identity(&mat); res = res || !ibz_mat_4x4_is_identity(&mat); - ibz_set(&(mat[0][1]),1); + ibz_set(&(mat[0][1]), 1); res = res || ibz_mat_4x4_is_identity(&mat); - ibz_set(&(mat[0][1]),0); - ibz_set(&(mat[3][3]),0); + ibz_set(&(mat[0][1]), 0); + ibz_set(&(mat[3][3]), 0); res = res || ibz_mat_4x4_is_identity(&mat); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim4_ibz_mat_4x4_is_identity failed\n"); } ibz_mat_4x4_finalize(&mat); - return(res); + return (res); } -//int ibz_mat_4x4_equal(const ibz_mat_4x4_t *mat1, const ibz_mat_4x4_t *mat2); -int quat_test_dim4_ibz_mat_4x4_equal(){ +// int ibz_mat_4x4_equal(const ibz_mat_4x4_t *mat1, const ibz_mat_4x4_t *mat2); +int +quat_test_dim4_ibz_mat_4x4_equal(void) +{ int res = 0; - ibz_mat_4x4_t a,b; + ibz_mat_4x4_t a, b; ibz_mat_4x4_init(&a); ibz_mat_4x4_init(&b); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(a[i][j]),i+j); - ibz_set(&(b[i][j]),i+j); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(a[i][j]), i + j); + ibz_set(&(b[i][j]), i + j); } } - res = res || (!ibz_mat_4x4_equal(&a,&b)); + res = res || (!ibz_mat_4x4_equal(&a, &b)); - ibz_set(&(b[2][2]),2); - res = res || ibz_mat_4x4_equal(&a,&b); + ibz_set(&(b[2][2]), 2); + res = res || ibz_mat_4x4_equal(&a, &b); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim4_ibz_mat_4x4_equal failed\n"); } ibz_mat_4x4_finalize(&a); ibz_mat_4x4_finalize(&b); - return(res); + return (res); } -//void ibz_mat_4x4_scalar_mul(ibz_mat_4x4_t *prod, const ibz_t *scalar, const ibz_mat_4x4_t *mat); -int quat_test_dim4_ibz_mat_4x4_scalar_mul(){ +// void ibz_mat_4x4_scalar_mul(ibz_mat_4x4_t *prod, const ibz_t *scalar, const ibz_mat_4x4_t *mat); +int +quat_test_dim4_ibz_mat_4x4_scalar_mul(void) +{ int res = 0; int s; ibz_t scalar; - ibz_mat_4x4_t prod,mat,cmp; + ibz_mat_4x4_t prod, mat, cmp; ibz_mat_4x4_init(&mat); ibz_mat_4x4_init(&cmp); ibz_mat_4x4_init(&prod); ibz_init(&scalar); s = 5; - ibz_set(&scalar,s); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(mat[i][j]),i+j); - ibz_set(&(cmp[i][j]),(i+j)*s); + ibz_set(&scalar, s); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(mat[i][j]), i + j); + ibz_set(&(cmp[i][j]), (i + j) * s); } } - ibz_mat_4x4_scalar_mul(&prod,&scalar,&mat); - res = res || (!ibz_mat_4x4_equal(&prod,&cmp)); + ibz_mat_4x4_scalar_mul(&prod, &scalar, &mat); + res = res || (!ibz_mat_4x4_equal(&prod, &cmp)); + ibz_mat_4x4_scalar_mul(&mat, &scalar, &mat); + res = res || (!ibz_mat_4x4_equal(&mat, &cmp)); - ibz_mat_4x4_scalar_mul(&mat,&scalar,&mat); - res = res || (!ibz_mat_4x4_equal(&mat,&cmp)); - - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim4_ibz_mat_4x4_scalar_mul failed\n"); } ibz_mat_4x4_finalize(&mat); ibz_mat_4x4_finalize(&cmp); ibz_mat_4x4_finalize(&prod); ibz_finalize(&scalar); - return(res); + return (res); } // void ibz_mat_4x4_gcd(ibz_t *gcd, const ibz_mat_4x4_t *mat); -int quat_test_dim4_ibz_mat_4x4_gcd(){ +int +quat_test_dim4_ibz_mat_4x4_gcd(void) +{ int res = 0; int d; ibz_t cmp, gcd; @@ -448,736 +749,80 @@ int quat_test_dim4_ibz_mat_4x4_gcd(){ ibz_mat_4x4_init(&mat); ibz_init(&cmp); ibz_init(&gcd); - + d = 2; - ibz_set(&cmp,d); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(mat[i][j]),d*i*j); + ibz_set(&cmp, d); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(mat[i][j]), d * i * j); } } - ibz_mat_4x4_gcd(&gcd,&mat); - res = res || ibz_cmp(&gcd,&cmp); + ibz_mat_4x4_gcd(&gcd, &mat); + res = res || ibz_cmp(&gcd, &cmp); d = 21; - ibz_set(&cmp,d); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(mat[i][j]),d*i*j); + ibz_set(&cmp, d); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(mat[i][j]), d * i * j); } } - ibz_mat_4x4_gcd(&gcd,&mat); - res = res || ibz_cmp(&gcd,&cmp); + ibz_mat_4x4_gcd(&gcd, &mat); + res = res || ibz_cmp(&gcd, &cmp); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim4_ibz_mat_4x4_gcd failed\n"); } ibz_mat_4x4_finalize(&mat); ibz_finalize(&cmp); ibz_finalize(&gcd); - return(res); + return (res); } -//int ibz_mat_4x4_scalar_div(ibz_mat_4x4_t *quot, const ibz_t *scalar, const ibz_mat_4x4_t *mat); -int quat_test_dim4_ibz_mat_4x4_scalar_div(){ +// int ibz_mat_4x4_scalar_div(ibz_mat_4x4_t *quot, const ibz_t *scalar, const ibz_mat_4x4_t *mat); +int +quat_test_dim4_ibz_mat_4x4_scalar_div(void) +{ int res = 0; int s; ibz_t scalar; - ibz_mat_4x4_t quot,mat,cmp; + ibz_mat_4x4_t quot, mat, cmp; ibz_mat_4x4_init(&mat); ibz_mat_4x4_init(&cmp); ibz_mat_4x4_init("); ibz_init(&scalar); s = 5; - ibz_set(&scalar,s); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(mat[i][j]),(i+j)*s); - ibz_set(&(cmp[i][j]),(i+j)); + ibz_set(&scalar, s); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(mat[i][j]), (i + j) * s); + ibz_set(&(cmp[i][j]), (i + j)); } } - ibz_mat_4x4_scalar_div(",&scalar,&mat); - res = res || (!ibz_mat_4x4_equal(",&cmp)); + ibz_mat_4x4_scalar_div(", &scalar, &mat); + res = res || (!ibz_mat_4x4_equal(", &cmp)); - ibz_mat_4x4_scalar_div(&mat,&scalar,&mat); - res = res || (!ibz_mat_4x4_equal(&mat,&cmp)); + ibz_mat_4x4_scalar_div(&mat, &scalar, &mat); + res = res || (!ibz_mat_4x4_equal(&mat, &cmp)); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim4_ibz_mat_4x4_scalar_div failed\n"); } ibz_mat_4x4_finalize(&mat); ibz_mat_4x4_finalize(&cmp); ibz_mat_4x4_finalize("); ibz_finalize(&scalar); - return(res); + return (res); } - -//int ibz_mat_4x4_is_hnf(const ibz_mat_4x4_t *mat); -int quat_test_dim4_is_hnf(){ +// void ibz_inv_dim4_make_coeff_pmp(ibz_t *coeff, const ibz_t *a1, const ibz_t *a2, const ibz_t *b1, +// const ibz_t *b2, const ibz_t *c1, const ibz_t *c2); +int +quat_test_dim4_ibz_inv_dim4_make_coeff_pmp(void) +{ int res = 0; - ibz_mat_4x4_t mat; - ibz_mat_4x4_init(&mat); - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 4; j++){ - ibz_set(&(mat[i][j]),0); - } - } - res = res || (!ibz_mat_4x4_is_hnf(&mat)); - ibz_set(&(mat[0][0]),7); - ibz_set(&(mat[0][1]),6); - ibz_set(&(mat[0][2]),5); - ibz_set(&(mat[0][3]),4); - ibz_set(&(mat[1][1]),6); - ibz_set(&(mat[1][2]),5); - ibz_set(&(mat[1][3]),4); - ibz_set(&(mat[2][2]),5); - ibz_set(&(mat[2][3]),4); - ibz_set(&(mat[3][3]),4); - res = res || (!ibz_mat_4x4_is_hnf(&mat)); - - ibz_set(&(mat[0][0]),7); - ibz_set(&(mat[0][1]),0); - ibz_set(&(mat[0][2]),5); - ibz_set(&(mat[0][3]),4); - ibz_set(&(mat[1][1]),0); - ibz_set(&(mat[1][2]),0); - ibz_set(&(mat[1][3]),0); - ibz_set(&(mat[2][2]),5); - ibz_set(&(mat[2][3]),4); - ibz_set(&(mat[3][3]),4); - res = res || (!ibz_mat_4x4_is_hnf(&mat)); - - // negative tests - ibz_set(&(mat[0][0]),7); - ibz_set(&(mat[0][1]),0); - ibz_set(&(mat[0][2]),5); - ibz_set(&(mat[0][3]),4); - ibz_set(&(mat[1][1]),1); - ibz_set(&(mat[1][2]),5); - ibz_set(&(mat[1][3]),9); - ibz_set(&(mat[2][2]),5); - ibz_set(&(mat[2][3]),4); - ibz_set(&(mat[3][3]),4); - res = res || (ibz_mat_4x4_is_hnf(&mat)); - - ibz_set(&(mat[0][0]),7); - ibz_set(&(mat[0][1]),0); - ibz_set(&(mat[0][2]),5); - ibz_set(&(mat[0][3]),4); - ibz_set(&(mat[1][1]),1); - ibz_set(&(mat[1][2]),-5); - ibz_set(&(mat[1][3]),1); - ibz_set(&(mat[2][2]),5); - ibz_set(&(mat[2][3]),4); - ibz_set(&(mat[3][3]),4); - res = res || (ibz_mat_4x4_is_hnf(&mat)); - - - ibz_set(&(mat[0][0]),7); - ibz_set(&(mat[0][1]),0); - ibz_set(&(mat[0][2]),5); - ibz_set(&(mat[0][3]),4); - ibz_set(&(mat[1][0]),2); - ibz_set(&(mat[1][1]),3); - ibz_set(&(mat[1][2]),1); - ibz_set(&(mat[1][3]),1); - ibz_set(&(mat[2][2]),5); - ibz_set(&(mat[2][3]),4); - ibz_set(&(mat[3][3]),4); - res = res || (ibz_mat_4x4_is_hnf(&mat)); - - - ibz_set(&(mat[0][0]),7); - ibz_set(&(mat[0][1]),0); - ibz_set(&(mat[0][2]),5); - ibz_set(&(mat[0][3]),4); - ibz_set(&(mat[1][0]),2); - ibz_set(&(mat[1][1]),3); - ibz_set(&(mat[1][2]),-1); - ibz_set(&(mat[1][3]),7); - ibz_set(&(mat[2][2]),0); - ibz_set(&(mat[2][3]),0); - ibz_set(&(mat[3][3]),4); - res = res || (ibz_mat_4x4_is_hnf(&mat)); - - if (res != 0){ - printf("Quaternion unit test dim4_ibz_mat_4x4_is_hnf failed\n"); - } - ibz_mat_4x4_finalize(&mat); - return(res); -} - - -//void ibz_mat_4x8_hnf_core(ibz_mat_4x4_t *hnf, const ibz_mat_4x8_t *generators); -int quat_test_dim4_ibz_mat_4x8_hnf_core(){ - int res = 0; - ibz_mat_4x8_t mat; - ibz_mat_4x4_t hnf,cmp; - ibz_mat_4x8_init(&mat); - ibz_mat_4x4_init(&hnf); - ibz_mat_4x4_init(&cmp); - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 8; j++){ - ibz_set(&(mat[i][j]),0); - } - } - ibz_mat_4x8_hnf_core(&hnf,&mat); - res = res || (!ibz_mat_4x4_is_hnf(&hnf)); - // also should test that they generate the same lattice. Since HNF is unique, copute the HNF for test vectors might be ok - - ibz_set(&(mat[0][2]),2); - ibz_set(&(mat[1][3]),3); - ibz_set(&(mat[0][4]),4); - ibz_set(&(mat[3][2]),5); - ibz_set(&(mat[3][7]),6); - ibz_set(&(mat[1][7]),7); - ibz_set(&(mat[1][3]),8); - ibz_set(&(mat[1][1]),9); - ibz_set(&(mat[0][6]),10); - ibz_set(&(mat[0][5]),11); - ibz_set(&(mat[0][0]),12); - ibz_mat_4x8_hnf_core(&hnf,&mat); - res = res || (!ibz_mat_4x4_is_hnf(&hnf)); - - ibz_set(&(mat[2][5]),1); - ibz_set(&(mat[2][0]),2); - ibz_mat_4x8_hnf_core(&hnf,&mat); - res = res || (!ibz_mat_4x4_is_hnf(&hnf)); - - // test equality of result to a known hnf - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 8; j++){ - ibz_set(&(mat[i][j]),0); - } - } - ibz_set(&(mat[0][0]),4); - ibz_set(&(mat[0][2]),3); - ibz_set(&(mat[0][4]),1); - ibz_set(&(mat[0][7]),-1); - ibz_set(&(mat[1][1]),5); - ibz_set(&(mat[1][5]),-2); - ibz_set(&(mat[2][2]),3); - ibz_set(&(mat[2][6]),1); - ibz_set(&(mat[2][5]),1); - ibz_set(&(mat[3][3]),7); - ibz_set(&(mat[3][7]),-3); - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 4; j++){ - ibz_set(&(cmp[i][j]),0); - } - ibz_set(&(cmp[i][i]),1); - } - ibz_mat_4x8_hnf_core(&hnf,&mat); - res = res || (!ibz_mat_4x4_equal(&cmp,&hnf)); - - // test known hnf encountered in - // https://github.com/SQISign/sqisign-nist/issues/38#issuecomment-1554585079 - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 8; j++){ - ibz_set(&(mat[i][j]),0); - } - } - ibz_set(&(mat[0][4]),438); - ibz_set(&(mat[1][4]),400); - ibz_set(&(mat[2][4]),156); - ibz_set(&(mat[3][4]),-2); - ibz_set(&(mat[0][5]),-400); - ibz_set(&(mat[1][5]),438); - ibz_set(&(mat[2][5]),2); - ibz_set(&(mat[3][5]),156); - ibz_set(&(mat[0][6]),-28826); - ibz_set(&(mat[1][6]),-148); - ibz_set(&(mat[2][6]),220); - ibz_set(&(mat[3][6]),-122); - ibz_set(&(mat[0][7]),586); - ibz_set(&(mat[1][7]),-28426); - ibz_set(&(mat[2][7]),278); - ibz_set(&(mat[3][7]),218); - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 4; j++){ - ibz_set(&(cmp[i][j]),0); - } - } - ibz_set(&(cmp[0][0]),2321156); - ibz_set(&(cmp[1][1]),2321156); - ibz_set(&(cmp[0][2]),620252); - ibz_set(&(cmp[1][2]),365058); - ibz_set(&(cmp[2][2]),2); - ibz_set(&(cmp[0][3]),1956098); - ibz_set(&(cmp[1][3]),620252); - ibz_set(&(cmp[3][3]),2); - ibz_mat_4x8_hnf_core(&hnf,&mat); - res = res || (!ibz_mat_4x4_equal(&cmp,&hnf)); - - if (res != 0){ - printf("Quaternion unit test dim4_ibz_mat_4x8_hnf_core failed\n"); - } - ibz_mat_4x8_finalize(&mat); - ibz_mat_4x4_finalize(&hnf); - ibz_mat_4x4_finalize(&cmp); - return(res); -} - -//void ibz_mat_4x4_hnf_mod(ibz_mat_4x4_t *hnf, const ibz_mat_4x4_t *mat, const ibz_t *mod); -int quat_test_dim4_ibz_mat_4x4_hnf_mod(){ - int res = 0; - ibz_mat_4x4_t hnf, mat, cmp; - ibz_t mod; - ibz_mat_4x4_init(&hnf); - ibz_mat_4x4_init(&mat); - ibz_mat_4x4_init(&cmp); - ibz_init(&mod); - - ibz_set(&mod,3); - ibz_set(&(mat[0][0]), 4); - ibz_set(&(mat[0][1]), 0); - ibz_set(&(mat[0][2]), 3); - ibz_set(&(mat[0][3]), 0); - ibz_set(&(mat[1][0]), 0); - ibz_set(&(mat[1][1]), 5); - ibz_set(&(mat[1][2]), 0); - ibz_set(&(mat[1][3]), 0); - ibz_set(&(mat[2][0]), 3); - ibz_set(&(mat[2][1]), -1); - ibz_set(&(mat[2][2]), 3); - ibz_set(&(mat[2][3]), -5); - ibz_set(&(mat[3][0]), 7); - ibz_set(&(mat[3][1]), 0); - ibz_set(&(mat[3][2]), 0); - ibz_set(&(mat[3][3]), 11); - - ibz_set(&(cmp[0][0]), 3); - ibz_set(&(cmp[0][1]), 2); - ibz_set(&(cmp[0][2]), 1); - ibz_set(&(cmp[0][3]), 1); - ibz_set(&(cmp[1][0]), 0); - ibz_set(&(cmp[1][1]), 1); - ibz_set(&(cmp[1][2]), 0); - ibz_set(&(cmp[1][3]), 0); - ibz_set(&(cmp[2][0]), 0); - ibz_set(&(cmp[2][1]), 0); - ibz_set(&(cmp[2][2]), 1); - ibz_set(&(cmp[2][3]), 0); - ibz_set(&(cmp[3][0]), 0); - ibz_set(&(cmp[3][1]), 0); - ibz_set(&(cmp[3][2]), 0); - ibz_set(&(cmp[3][3]), 1); - - ibz_mat_4x4_hnf_mod(&hnf, &mat, &mod); - res = res || !ibz_mat_4x4_equal(&hnf,&cmp); - - ibz_set(&mod,100); - ibz_set(&(mat[0][0]), 12); - ibz_set(&(mat[0][1]), -111); - ibz_set(&(mat[0][2]), 12); - ibz_set(&(mat[0][3]), -345); - ibz_set(&(mat[1][0]), 1134); - ibz_set(&(mat[1][1]), -2); - ibz_set(&(mat[1][2]), 56); - ibz_set(&(mat[1][3]), 72); - ibz_set(&(mat[2][0]), 8); - ibz_set(&(mat[2][1]), 231); - ibz_set(&(mat[2][2]), -21); - ibz_set(&(mat[2][3]), 22); - ibz_set(&(mat[3][0]), 30); - ibz_set(&(mat[3][1]), 34); - ibz_set(&(mat[3][2]), 5); - ibz_set(&(mat[3][3]), -33); - - ibz_set(&(cmp[0][0]), 4); - ibz_set(&(cmp[0][1]), 2); - ibz_set(&(cmp[0][2]), 3); - ibz_set(&(cmp[0][3]), 3); - ibz_set(&(cmp[1][0]), 0); - ibz_set(&(cmp[1][1]), 2); - ibz_set(&(cmp[1][2]), 0); - ibz_set(&(cmp[1][3]), 0); - ibz_set(&(cmp[2][0]), 0); - ibz_set(&(cmp[2][1]), 0); - ibz_set(&(cmp[2][2]), 1); - ibz_set(&(cmp[2][3]), 0); - ibz_set(&(cmp[3][0]), 0); - ibz_set(&(cmp[3][1]), 0); - ibz_set(&(cmp[3][2]), 0); - ibz_set(&(cmp[3][3]), 1); - - ibz_mat_4x4_hnf_mod(&hnf, &mat, &mod); - res = res || !ibz_mat_4x4_equal(&hnf,&cmp); - - ibz_set(&mod,3); - ibz_set(&(cmp[0][0]), 3); - ibz_set(&(cmp[0][1]), 0); - ibz_set(&(cmp[0][2]), 0); - ibz_set(&(cmp[0][3]), 0); - ibz_set(&(cmp[1][0]), 0); - ibz_set(&(cmp[1][1]), 3); - ibz_set(&(cmp[1][2]), 0); - ibz_set(&(cmp[1][3]), 1); - ibz_set(&(cmp[2][0]), 0); - ibz_set(&(cmp[2][1]), 0); - ibz_set(&(cmp[2][2]), 1); - ibz_set(&(cmp[2][3]), 0); - ibz_set(&(cmp[3][0]), 0); - ibz_set(&(cmp[3][1]), 0); - ibz_set(&(cmp[3][2]), 0); - ibz_set(&(cmp[3][3]), 1); - - ibz_mat_4x4_hnf_mod(&mat, &mat, &mod); - res = res || !ibz_mat_4x4_equal(&mat,&cmp); - - if (res != 0){ - printf("Quaternion unit test dim4_ibz_mat_4x4_hnf_mod failed\n"); - } - ibz_mat_4x4_finalize(&hnf); - ibz_mat_4x4_finalize(&mat); - ibz_mat_4x4_finalize(&cmp); - ibz_finalize(&mod); - return(res); -} - - -// test for lll verification -//void ibq_vec_4_copy_ibz(ibq_t (*vec)[4], const ibz_t *coeff0, const ibz_t *coeff1,const ibz_t *coeff2,const ibz_t *coeff3); -int quat_test_dim4_ibq_vec_4_copy_ibz(){ - int res = 0; - ibq_t vec[4]; - ibz_vec_4_t vec_z; - ibz_vec_4_init(&vec_z); - ibq_init(&(vec[0])); - ibq_init(&(vec[1])); - ibq_init(&(vec[2])); - ibq_init(&(vec[3])); - ibz_vec_4_set(&vec_z,2,3,4,5); - ibq_vec_4_copy_ibz(&vec,&(vec_z[0]),&(vec_z[1]),&(vec_z[2]),&(vec_z[3])); - for(int i = 0; i <4; i++){ - ibq_to_ibz(&(vec_z[i]),&(vec[i])); - res = res || !(ibz_get(&(vec_z[i]))==i+2); - } - - if (res != 0){ - printf("Quaternion unit test dim4_ibq_vec_4_copy_ibz failed\n"); - } - ibz_vec_4_finalize(&vec_z); - ibq_finalize(&(vec[0])); - ibq_finalize(&(vec[1])); - ibq_finalize(&(vec[2])); - ibq_finalize(&(vec[3])); - return(res); -} - -//void quat_dim4_lll_bilinear(ibq_t *b, const ibq_t (*vec0)[4], const ibq_t (*vec1)[4], const ibz_t *q); -int quat_test_dim4_lll_bilinear(){ - int res = 0; - ibz_vec_4_t init_helper; - ibq_t vec0[4]; - ibq_t vec1[4]; - ibz_t q; - ibq_t cmp, b; - ibz_vec_4_init(&init_helper); - ibq_init(&cmp); - ibq_init(&b); - ibz_init(&q); - for(int i = 0; i <4; i++){ - ibq_init(&(vec0[i])); - ibq_init(&(vec1[i])); - } - ibz_vec_4_set(&init_helper,1,2,3,4); - ibq_vec_4_copy_ibz(&vec0,&(init_helper[0]),&(init_helper[1]),&(init_helper[2]),&(init_helper[3])); - ibz_vec_4_set(&init_helper,9,-8,7,-6); - ibq_vec_4_copy_ibz(&vec1,&(init_helper[0]),&(init_helper[1]),&(init_helper[2]),&(init_helper[3])); - for(int i = 0; i <4; i++){ - ibq_inv(&(vec0[i]),&(vec0[i])); - } - ibz_set(&q,3); - ibz_vec_4_set(&init_helper,15,2,0,0); - ibq_set(&cmp,&(init_helper[0]),&(init_helper[1])); - quat_dim4_lll_bilinear(&b,&vec0,&vec1,&q); - res = res || (ibq_cmp(&b,&cmp)); - - if (res != 0){ - printf("Quaternion unit test quat_dim4_lll_bilinear failed\n"); - } - ibq_finalize(&cmp); - ibq_finalize(&b); - ibz_finalize(&q); - ibz_vec_4_finalize(&init_helper); - for(int i = 0; i <4; i++){ - ibq_finalize(&(vec0[i])); - ibq_finalize(&(vec1[i])); - } - return(res); -} - -//void quat_dim4_gram_schmidt_transposed_with_ibq(ibq_t (*orthogonalised_transposed)[4][4], const ibz_mat_4x4_t *mat, const ibz_t *q); -int quat_test_dim4_gram_schmidt_transposed_with_ibq(){ - int res = 0; - int zero; - ibq_t ot[4][4]; - ibq_t cmp[4][4]; - ibz_mat_4x4_t mat; - ibz_t q, num, denom; - ibq_t b; - ibz_init(&q); - ibz_init(&num); - ibz_init(&denom); - ibq_init(&b); - ibz_mat_4x4_init(&mat); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibq_init(&(cmp[i][j])); - ibq_init(&(ot[i][j])); - } - } - - - ibz_mat_4x4_zero(&mat); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(mat[i][j]), i*i+(j+5)*j-2+(i==j)); - } - } - ibz_set(&q,3); - quat_dim4_gram_schmidt_transposed_with_ibq(&ot,&mat,&q); - // test orthogonality - for(int i = 0; i < 4; i++){ - for(int j = i+1; j < 4; j++){ - quat_dim4_lll_bilinear(&b,&(ot[i]),&(ot[j]),&q); - res = res || !ibq_is_zero(&b); - } - } - // test first vector is identical to mat - for(int i = 0; i < 4; i++){ - ibq_to_ibz(&q,&(ot[0][i])); - res = res || ibz_cmp(&q,&(mat[i][0])); - } - // test no zero vector - for(int i = 0; i < 4; i++){ - zero = 1; - for(int j = 0; j < 4; j++){ - zero = zero && ibq_is_zero(&(ot[i][j])); - } - res = res || zero; - } - - ibz_set(&(mat[0][0]), 1); - ibz_set(&(mat[0][1]), 0); - ibz_set(&(mat[0][2]), 1); - ibz_set(&(mat[0][3]), 0); - ibz_set(&(mat[1][0]), 0); - ibz_set(&(mat[1][1]), 1); - ibz_set(&(mat[1][2]), 0); - ibz_set(&(mat[1][3]), 1); - ibz_set(&(mat[2][0]), 1); - ibz_set(&(mat[2][1]), 0); - ibz_set(&(mat[2][2]), 2); - ibz_set(&(mat[2][3]), 0); - ibz_set(&(mat[3][0]), 0); - ibz_set(&(mat[3][1]), 1); - ibz_set(&(mat[3][2]), 0); - ibz_set(&(mat[3][3]), 2); - ibz_set(&denom,1); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibq_set(&(cmp[i][j]),&(mat[j][i]),&denom); - } - } - ibz_set(&denom,3); - ibz_set(&num,-2); - ibq_set(&(cmp[2][0]),&num,&denom); - ibq_set(&(cmp[3][1]),&num,&denom); - ibz_set(&num,1); - ibq_set(&(cmp[2][2]),&num,&denom); - ibq_set(&(cmp[3][3]),&num,&denom); - ibz_set(&q,2); - quat_dim4_gram_schmidt_transposed_with_ibq(&ot,&mat,&q); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - res = res || ibq_cmp(&(cmp[i][j]),&(ot[i][j])); - } - } - - ibz_set(&(mat[0][0]), 1); - ibz_set(&(mat[0][1]), 0); - ibz_set(&(mat[0][2]), 1); - ibz_set(&(mat[0][3]), 0); - ibz_set(&(mat[1][0]), 0); - ibz_set(&(mat[1][1]), 1); - ibz_set(&(mat[1][2]), 0); - ibz_set(&(mat[1][3]), 1); - ibz_set(&(mat[2][0]), 1); - ibz_set(&(mat[2][1]), 0); - ibz_set(&(mat[2][2]), 2); - ibz_set(&(mat[2][3]), 1); - ibz_set(&(mat[3][0]), 0); - ibz_set(&(mat[3][1]), 1); - ibz_set(&(mat[3][2]), 0); - ibz_set(&(mat[3][3]), 2); - ibz_set(&denom,1); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibq_set(&(cmp[i][j]),&(mat[j][i]),&denom); - } - } - ibz_set(&denom,3); - ibz_set(&num,-2); - ibq_set(&(cmp[2][0]),&num,&denom); - ibq_set(&(cmp[3][1]),&num,&denom); - ibz_set(&num,1); - ibq_set(&(cmp[2][2]),&num,&denom); - ibq_set(&(cmp[3][3]),&num,&denom); - ibz_set(&num,0); - ibq_set(&(cmp[3][0]),&num,&denom); - ibq_set(&(cmp[3][2]),&num,&denom); - ibz_set(&q,2); - quat_dim4_gram_schmidt_transposed_with_ibq(&ot,&mat,&q); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - res = res || ibq_cmp(&(cmp[i][j]),&(ot[i][j])); - } - } - - if (res != 0){ - printf("Quaternion unit test dim4_gram_schmidt_transposed_with_ibq failed\n"); - } - ibz_finalize(&q); - ibz_finalize(&num); - ibz_finalize(&denom); - ibq_finalize(&b); - ibz_mat_4x4_finalize(&mat); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibq_finalize(&(ot[i][j])); - ibq_finalize(&(cmp[i][j])); - } - } - return(res); -} - - - -//int quat_dim4_lll_verify(const ibz_mat_4x4_t *mat, const ibq_t *coeff, const ibz_t *q); -int quat_test_dim4_lll_verify(){ - int res = 0; - ibz_mat_4x4_t mat; - ibz_t q, coeff_num, coeff_denom; - ibq_t coeff; - ibz_mat_4x4_init(&mat); - ibz_init(&q); - ibq_init(&coeff); - ibz_init(&coeff_num); - ibz_init(&coeff_denom); - - ibz_mat_4x4_identity(&mat); - ibz_set(&q,1); - ibz_set(&coeff_num,1); - ibz_set(&coeff_denom,1); - ibq_set(&coeff,&coeff_num,&coeff_denom); - res = res || !quat_dim4_lll_verify(&mat,&coeff,&q); - - // non reduced - ibz_set(&q,1); - ibz_set(&coeff_num,99); - ibz_set(&coeff_denom,100); - ibq_set(&coeff,&coeff_num,&coeff_denom); - ibz_mat_4x4_identity(&mat); - ibz_set(&(mat[0][0]),50); - res = res || quat_dim4_lll_verify(&mat,&coeff,&q); - - // non reduced - ibz_set(&q,1); - ibz_set(&coeff_num,99); - ibz_set(&coeff_denom,100); - ibq_set(&coeff,&coeff_num,&coeff_denom); - ibz_mat_4x4_identity(&mat); - ibz_set(&(mat[0][1]),4); - res = res || quat_dim4_lll_verify(&mat,&coeff,&q); - - // reduced - ibz_set(&q,1); - ibz_set(&coeff_num,99); - ibz_set(&coeff_denom,100); - ibq_set(&coeff,&coeff_num,&coeff_denom); - ibz_set(&(mat[0][0]), 0); - ibz_set(&(mat[0][1]), 2); - ibz_set(&(mat[0][2]), 1); - ibz_set(&(mat[0][3]), -7); - ibz_set(&(mat[1][0]), 2); - ibz_set(&(mat[1][1]), -1); - ibz_set(&(mat[1][2]), -1); - ibz_set(&(mat[1][3]), -6); - ibz_set(&(mat[2][0]), 1); - ibz_set(&(mat[2][1]), -2); - ibz_set(&(mat[2][2]), 4); - ibz_set(&(mat[2][3]), 1); - ibz_set(&(mat[3][0]), 1); - ibz_set(&(mat[3][1]), 1); - ibz_set(&(mat[3][2]), 0); - ibz_set(&(mat[3][3]), 13); - res = res || !quat_dim4_lll_verify(&mat,&coeff,&q); - - // reduced: non-1 norm - ibz_set(&q,3); - ibz_set(&coeff_num,99); - ibz_set(&coeff_denom,100); - ibq_set(&coeff,&coeff_num,&coeff_denom); - ibz_set(&(mat[0][0]), 0); - ibz_set(&(mat[0][1]), 2); - ibz_set(&(mat[0][2]), 3); - ibz_set(&(mat[0][3]), -14); - ibz_set(&(mat[1][0]), 2); - ibz_set(&(mat[1][1]), -1); - ibz_set(&(mat[1][2]), -4); - ibz_set(&(mat[1][3]), -8); - ibz_set(&(mat[2][0]), 1); - ibz_set(&(mat[2][1]), -2); - ibz_set(&(mat[2][2]), 1); - ibz_set(&(mat[2][3]), 0); - ibz_set(&(mat[3][0]), 1); - ibz_set(&(mat[3][1]), 1); - ibz_set(&(mat[3][2]), 0); - ibz_set(&(mat[3][3]), 7); - res = res || !quat_dim4_lll_verify(&mat,&coeff,&q); - - // reduced: non-1 norm - ibz_set(&q,103); - ibz_set(&coeff_num,99); - ibz_set(&coeff_denom,100); - ibq_set(&coeff,&coeff_num,&coeff_denom); - ibz_set(&(mat[0][0]), 3); - ibz_set(&(mat[0][1]), 0); - ibz_set(&(mat[0][2]), 90); - ibz_set(&(mat[0][3]), -86); - ibz_set(&(mat[1][0]), 11); - ibz_set(&(mat[1][1]), 15); - ibz_set(&(mat[1][2]), 12); - ibz_set(&(mat[1][3]), 50); - ibz_set(&(mat[2][0]), 1); - ibz_set(&(mat[2][1]), -2); - ibz_set(&(mat[2][2]), 0); - ibz_set(&(mat[2][3]), 3); - ibz_set(&(mat[3][0]), -1); - ibz_set(&(mat[3][1]), 0); - ibz_set(&(mat[3][2]), 5); - ibz_set(&(mat[3][3]), 5); - res = res || !quat_dim4_lll_verify(&mat,&coeff,&q); - - if (res != 0){ - printf("Quaternion unit test quat_dim4_lll_verify failed\n"); - } - ibz_finalize(&q); - ibq_finalize(&coeff); - ibz_finalize(&coeff_num); - ibz_finalize(&coeff_denom); - ibz_mat_4x4_finalize(&mat); - return(res); -} - -//void ibz_inv_dim4_make_coeff_pmp(ibz_t *coeff, const ibz_t *a1, const ibz_t *a2, const ibz_t *b1, const ibz_t *b2, const ibz_t *c1, const ibz_t *c2); -int quat_test_dim4_ibz_inv_dim4_make_coeff_pmp(){ - int res = 0; - ibz_t coeff,cmp,a1,a2,b1,b2, c1, c2; + ibz_t coeff, cmp, a1, a2, b1, b2, c1, c2; ibz_init(&a1); ibz_init(&a2); ibz_init(&b1); @@ -1187,32 +832,32 @@ int quat_test_dim4_ibz_inv_dim4_make_coeff_pmp(){ ibz_init(&coeff); ibz_init(&cmp); - ibz_set(&a1,0); - ibz_set(&a2,3); - ibz_set(&b1,-1); - ibz_set(&b2,0); - ibz_set(&c1,-1); - ibz_set(&c2,0); - ibz_set(&cmp,0); - ibz_inv_dim4_make_coeff_pmp(&coeff,&a1,&a2,&b1,&b2, &c1,&c2); - res = res || ibz_cmp(&cmp,&coeff); + ibz_set(&a1, 0); + ibz_set(&a2, 3); + ibz_set(&b1, -1); + ibz_set(&b2, 0); + ibz_set(&c1, -1); + ibz_set(&c2, 0); + ibz_set(&cmp, 0); + ibz_inv_dim4_make_coeff_pmp(&coeff, &a1, &a2, &b1, &b2, &c1, &c2); + res = res || ibz_cmp(&cmp, &coeff); - ibz_set(&a1,2); - ibz_set(&a2,3); - ibz_set(&b1,-1); - ibz_set(&b2,1); - ibz_set(&c1,-4); - ibz_set(&c2,2); - ibz_set(&cmp,-1); - ibz_inv_dim4_make_coeff_pmp(&coeff,&a1,&a2,&b1,&b2, &c1,&c2); - res = res || ibz_cmp(&cmp,&coeff); + ibz_set(&a1, 2); + ibz_set(&a2, 3); + ibz_set(&b1, -1); + ibz_set(&b2, 1); + ibz_set(&c1, -4); + ibz_set(&c2, 2); + ibz_set(&cmp, -1); + ibz_inv_dim4_make_coeff_pmp(&coeff, &a1, &a2, &b1, &b2, &c1, &c2); + res = res || ibz_cmp(&cmp, &coeff); - ibz_set(&a1,2); - ibz_set(&cmp,4); - ibz_inv_dim4_make_coeff_pmp(&a1,&a1,&a1,&a1,&a1, &a1,&a1); - res = res || ibz_cmp(&cmp,&a1); + ibz_set(&a1, 2); + ibz_set(&cmp, 4); + ibz_inv_dim4_make_coeff_pmp(&a1, &a1, &a1, &a1, &a1, &a1, &a1); + res = res || ibz_cmp(&cmp, &a1); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim4_ibz_inv_dim4_make_coeff_pmp failed\n"); } ibz_finalize(&a1); @@ -1226,10 +871,13 @@ int quat_test_dim4_ibz_inv_dim4_make_coeff_pmp(){ return res; } -//void ibz_inv_make_coeff_mpm(ibz_t *coeff, const ibz_t *a1, const ibz_t *a2, const ibz_t *b1, const ibz_t *b2, const ibz_t *c1, const ibz_t *c2); -int quat_test_dim4_ibz_inv_dim4_make_coeff_mpm(){ +// void ibz_inv_make_coeff_mpm(ibz_t *coeff, const ibz_t *a1, const ibz_t *a2, const ibz_t *b1, +// const ibz_t *b2, const ibz_t *c1, const ibz_t *c2); +int +quat_test_dim4_ibz_inv_dim4_make_coeff_mpm(void) +{ int res = 0; - ibz_t coeff,cmp,a1,a2,b1,b2, c1, c2; + ibz_t coeff, cmp, a1, a2, b1, b2, c1, c2; ibz_init(&a1); ibz_init(&a2); ibz_init(&b1); @@ -1239,34 +887,32 @@ int quat_test_dim4_ibz_inv_dim4_make_coeff_mpm(){ ibz_init(&coeff); ibz_init(&cmp); - ibz_set(&a1,0); - ibz_set(&a2,3); - ibz_set(&b1,-1); - ibz_set(&b2,0); - ibz_set(&c1,-1); - ibz_set(&c2,0); - ibz_set(&cmp,0); - ibz_inv_dim4_make_coeff_mpm(&coeff,&a1,&a2,&b1,&b2, &c1,&c2); - res = res || ibz_cmp(&cmp,&coeff); + ibz_set(&a1, 0); + ibz_set(&a2, 3); + ibz_set(&b1, -1); + ibz_set(&b2, 0); + ibz_set(&c1, -1); + ibz_set(&c2, 0); + ibz_set(&cmp, 0); + ibz_inv_dim4_make_coeff_mpm(&coeff, &a1, &a2, &b1, &b2, &c1, &c2); + res = res || ibz_cmp(&cmp, &coeff); - ibz_set(&a1,2); - ibz_set(&a2,3); - ibz_set(&b1,-1); - ibz_set(&b2,1); - ibz_set(&c1,-4); - ibz_set(&c2,2); - ibz_set(&cmp,1); - ibz_inv_dim4_make_coeff_mpm(&coeff,&a1,&a2,&b1,&b2, &c1,&c2); - res = res || ibz_cmp(&cmp,&coeff); + ibz_set(&a1, 2); + ibz_set(&a2, 3); + ibz_set(&b1, -1); + ibz_set(&b2, 1); + ibz_set(&c1, -4); + ibz_set(&c2, 2); + ibz_set(&cmp, 1); + ibz_inv_dim4_make_coeff_mpm(&coeff, &a1, &a2, &b1, &b2, &c1, &c2); + res = res || ibz_cmp(&cmp, &coeff); + ibz_set(&a1, 2); + ibz_set(&cmp, -4); + ibz_inv_dim4_make_coeff_mpm(&a1, &a1, &a1, &a1, &a1, &a1, &a1); + res = res || ibz_cmp(&cmp, &a1); - ibz_set(&a1,2); - ibz_set(&cmp,-4); - ibz_inv_dim4_make_coeff_mpm(&a1,&a1,&a1,&a1,&a1, &a1,&a1); - res = res || ibz_cmp(&cmp,&a1); - - - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim4_ibz_inv_dim4_make_coeff_mpm failed\n"); } ibz_finalize(&a1); @@ -1281,24 +927,30 @@ int quat_test_dim4_ibz_inv_dim4_make_coeff_mpm(){ } // returns 1 if inverse is valid, 0 otherwise -int quat_test_dim4_validate_mat_4x4_rational_inv_if_exists(const ibz_mat_4x4_t *mat, const ibz_t *det, const ibz_mat_4x4_t *inv){ +int +quat_test_dim4_validate_mat_4x4_rational_inv_if_exists(const ibz_mat_4x4_t *mat, + const ibz_t *det, + const ibz_mat_4x4_t *inv) +{ int res = 1; ibz_mat_4x4_t det_id, prod; ibz_mat_4x4_init(&det_id); ibz_mat_4x4_init(&prod); ibz_mat_4x4_identity(&det_id); - ibz_mat_4x4_scalar_mul(&det_id,det,&det_id); + ibz_mat_4x4_scalar_mul(&det_id, det, &det_id); ibz_mat_4x4_mul(&prod, inv, mat); - res = res && ibz_mat_4x4_equal(&det_id,&prod); + res = res && ibz_mat_4x4_equal(&det_id, &prod); ibz_mat_4x4_mul(&prod, mat, inv); - res = res && ibz_mat_4x4_equal(&det_id,&prod); + res = res && ibz_mat_4x4_equal(&det_id, &prod); ibz_mat_4x4_finalize(&det_id); ibz_mat_4x4_finalize(&prod); return res; } -//int ibz_4x4_inv_with_det_as_denom(ibz_mat_4x4_t *inv, ibz_t *det, const ibz_mat_4x4_t mat); -int quat_test_dim4_ibz_mat_4x4_inv_with_det_as_denom(){ +// int ibz_4x4_inv_with_det_as_denom(ibz_mat_4x4_t *inv, ibz_t *det, const ibz_mat_4x4_t mat); +int +quat_test_dim4_ibz_mat_4x4_inv_with_det_as_denom(void) +{ int res = 0; ibz_t det; ibz_mat_4x4_t mat, inv; @@ -1307,45 +959,45 @@ int quat_test_dim4_ibz_mat_4x4_inv_with_det_as_denom(){ ibz_mat_4x4_init(&inv); ibz_mat_4x4_zero(&mat); - res = res || ibz_mat_4x4_inv_with_det_as_denom(&inv,&det,&mat); + res = res || ibz_mat_4x4_inv_with_det_as_denom(&inv, &det, &mat); res = res || !ibz_is_zero(&det); ibz_mat_4x4_identity(&mat); - if(ibz_mat_4x4_inv_with_det_as_denom(&inv,&det,&mat)){ + if (ibz_mat_4x4_inv_with_det_as_denom(&inv, &det, &mat)) { res = res || !ibz_is_one(&det); - res = res || !quat_test_dim4_validate_mat_4x4_rational_inv_if_exists(&inv,&det,&mat); + res = res || !quat_test_dim4_validate_mat_4x4_rational_inv_if_exists(&inv, &det, &mat); } else { res = 1; } - ibz_set(&(mat[0][0]),2); - ibz_set(&(mat[0][1]),-17); - ibz_set(&(mat[0][2]),3); - ibz_set(&(mat[0][3]),5); - ibz_set(&(mat[1][1]),-2); - ibz_set(&(mat[1][2]),3); - ibz_set(&(mat[1][3]),2); - ibz_set(&(mat[2][2]),-3); - ibz_set(&(mat[2][3]),0); - ibz_set(&(mat[3][3]),1); - if(ibz_mat_4x4_inv_with_det_as_denom(&inv,&det,&mat)){ - res = res || (ibz_get(&det)!=12); - res = res || !quat_test_dim4_validate_mat_4x4_rational_inv_if_exists(&inv,&det,&mat); + ibz_set(&(mat[0][0]), 2); + ibz_set(&(mat[0][1]), -17); + ibz_set(&(mat[0][2]), 3); + ibz_set(&(mat[0][3]), 5); + ibz_set(&(mat[1][1]), -2); + ibz_set(&(mat[1][2]), 3); + ibz_set(&(mat[1][3]), 2); + ibz_set(&(mat[2][2]), -3); + ibz_set(&(mat[2][3]), 0); + ibz_set(&(mat[3][3]), 1); + if (ibz_mat_4x4_inv_with_det_as_denom(&inv, &det, &mat)) { + res = res || (ibz_cmp_int32(&det, 12) != 0); + res = res || !quat_test_dim4_validate_mat_4x4_rational_inv_if_exists(&inv, &det, &mat); } else { res = 1; } - ibz_set(&(mat[3][0]),1); - ibz_set(&(mat[3][1]),8); - ibz_set(&(mat[3][2]),-9); - ibz_set(&(mat[2][0]),3); - ibz_set(&(mat[2][1]),0); - ibz_set(&(mat[1][0]),4); - if(ibz_mat_4x4_inv_with_det_as_denom(&inv,&det,&mat)){ - res = res || (ibz_get(&det)!=-1503); - res = res || !quat_test_dim4_validate_mat_4x4_rational_inv_if_exists(&inv,&det,&mat); + ibz_set(&(mat[3][0]), 1); + ibz_set(&(mat[3][1]), 8); + ibz_set(&(mat[3][2]), -9); + ibz_set(&(mat[2][0]), 3); + ibz_set(&(mat[2][1]), 0); + ibz_set(&(mat[1][0]), 4); + if (ibz_mat_4x4_inv_with_det_as_denom(&inv, &det, &mat)) { + res = res || (ibz_cmp_int32(&det, -1503) != 0); + res = res || !quat_test_dim4_validate_mat_4x4_rational_inv_if_exists(&inv, &det, &mat); } else { res = 1; } - - if (res != 0){ + + if (res != 0) { printf("Quaternion unit test dim4_ibz_mat_4x4_inv_with_det_as_denom failed\n"); } ibz_mat_4x4_finalize(&mat); @@ -1354,335 +1006,22 @@ int quat_test_dim4_ibz_mat_4x4_inv_with_det_as_denom(){ return res; } -// larger matrix modular kernel - -// returns 1 if product is 0 mod p, 0 otherwise -int quat_test_dim4_4x5_vec_5_mul_is_zero_mod(const ibz_mat_4x5_t *mat, const ibz_vec_5_t *vec, ibz_t *p){ - int res = 1; - ibz_t prod, sum; - ibz_init(&prod); - ibz_init(&sum); - for(int i = 0; i < 4; i++){ - ibz_set(&sum,0); - for(int j = 0; j < 5; j++){ - ibz_mul(&prod,&((*mat)[i][j]),&((*vec)[j])); - ibz_add(&sum,&sum,&prod); - ibz_mod(&sum,&sum,p); - } - res = res && ibz_is_zero(&sum); - } - ibz_finalize(&sum); - ibz_finalize(&prod); - return(res); -} - -//int ibz_4x5_right_ker_mod_prime(ibz_vec_5_t *ker, const ibz_mat_4x5_t *mat, const ibz_t *p); -int quat_test_dim4_ibz_4x5_right_ker_mod_prime(){ - int res = 0; - ibz_t prime; - ibz_mat_4x5_t mat; - ibz_vec_5_t ker; - ibz_mat_4x5_init(&mat); - ibz_vec_5_init(&ker); - ibz_init(&prime); - - // kernel has dimension 1 - ibz_set(&prime,5); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 5; j++){ - ibz_set(&(mat[i][j]),0); - } - } - ibz_set(&(mat[0][0]),2); - ibz_set(&(mat[1][1]),3); - ibz_set(&(mat[2][2]),3); - ibz_set(&(mat[1][3]),1); - ibz_set(&(mat[3][3]),2); - ibz_set(&(mat[3][2]),1); - ibz_set(&(mat[0][4]),1); - if (ibz_4x5_right_ker_mod_prime(&ker,&mat,&prime)){ - res = res || !quat_test_dim4_4x5_vec_5_mul_is_zero_mod(&mat,&ker,&prime); - } else { - res = 1; - } - - // too large kernel - ibz_set(&prime,5); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 5; j++){ - ibz_set(&(mat[i][j]),0); - } - } - res = res || ibz_4x5_right_ker_mod_prime(&ker,&mat,&prime); - ibz_set(&(mat[0][0]),1); - ibz_set(&(mat[2][2]),2); - ibz_set(&(mat[3][3]),3); - res = res || ibz_4x5_right_ker_mod_prime(&ker,&mat,&prime); - - if (res != 0){ - printf("Quaternion unit test dim4_ibz_4x5_right_ker_mod_prime failed\n"); - } - ibz_vec_5_finalize(&ker); - ibz_mat_4x5_finalize(&mat); - ibz_finalize(&prime); - return(res); -} - -// returns 1 if product is 0 mod p, 0 otherwise -int quat_test_dim4_4x4_vec_4_mul_is_zero_mod(const ibz_mat_4x4_t *mat, const ibz_vec_4_t *vec, ibz_t *p){ - int res = 1; - ibz_t prod, sum; - ibz_init(&prod); - ibz_init(&sum); - for(int i = 0; i < 4; i++){ - ibz_set(&sum,0); - for(int j = 0; j < 4; j++){ - ibz_mul(&prod,&((*mat)[i][j]),&((*vec)[j])); - ibz_add(&sum,&sum,&prod); - ibz_mod(&sum,&sum,p); - } - res = res && ibz_is_zero(&sum); - } - ibz_finalize(&sum); - ibz_finalize(&prod); - return(res); -} - -//int ibz_4x4_right_ker_mod_prime(ibz_vec_4_t *ker, const ibz_mat_4x4_t *mat, const ibz_t *p); -int quat_test_dim4_ibz_4x4_right_ker_mod_prime(){ - int res = 0; - ibz_t prime; - ibz_mat_4x4_t mat; - ibz_vec_4_t ker; - ibz_mat_4x4_init(&mat); - ibz_vec_4_init(&ker); - ibz_init(&prime); - - // kernel has dimension 1 - ibz_set(&prime,5); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(mat[i][j]),0); - } - } - ibz_set(&(mat[0][0]),2); - ibz_set(&(mat[1][1]),3); - ibz_set(&(mat[2][2]),3); - ibz_set(&(mat[2][3]),1); - ibz_set(&(mat[3][3]),2); - ibz_set(&(mat[3][2]),1); - if (ibz_4x4_right_ker_mod_prime(&ker,&mat,&prime)){ - res = res || !quat_test_dim4_4x4_vec_4_mul_is_zero_mod(&mat,&ker,&prime); - } else { - res = 1; - } - - // too large kernel - ibz_set(&prime,5); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(mat[i][j]),0); - } - } - res = res || ibz_4x4_right_ker_mod_prime(&ker,&mat,&prime); - ibz_set(&(mat[1][2]),2); - ibz_set(&(mat[3][3]),3); - res = res || ibz_4x4_right_ker_mod_prime(&ker,&mat,&prime); - - // too small kernel - ibz_set(&(mat[0][0]),1); - ibz_set(&(mat[1][1]),2); - ibz_set(&(mat[2][2]),3); - ibz_set(&(mat[3][3]),2); - res = res || ibz_4x4_right_ker_mod_prime(&ker,&mat,&prime); - - if (res != 0){ - printf("Quaternion unit test dim4_ibz_4x4_right_ker_mod_prime failed\n"); - } - ibz_vec_4_finalize(&ker); - ibz_mat_4x4_finalize(&mat); - ibz_finalize(&prime); - return(res); -} - -//int ibz_4x4_right_ker_mod_power_of_2(ibz_vec_4_t *ker, const ibz_mat_4x4_t *mat, unsigned short exp); -int quat_test_dim4_ibz_4x4_right_ker_mod_power_of_2(){ - int res = 0; - int zero = 1; - - ibz_mat_4x4_t mat; - ibz_vec_4_t ker; - ibz_vec_4_t prod; - ibz_t q, r, two; - ibz_mat_4x4_init(&mat); - ibz_vec_4_init(&ker); - ibz_vec_4_init(&prod); - ibz_init(&q); - ibz_init(&r); - ibz_init(&two); - ibz_set(&two,2); - - // A diagonal matrix with an obvious kernel over the 2-adics - ibz_mat_4x4_zero(&mat); - ibz_set(&mat[0][0], 1); - ibz_set(&mat[1][1], 1); - ibz_set(&mat[2][1], 1); - ibz_set(&mat[3][3], 2); - - res |= ibz_4x4_right_ker_mod_power_of_2(&ker, &mat, 60) != 1; - - res |= ibz_cmp_si(&ker[0], 0); - res |= ibz_cmp_si(&ker[1], 0); - res |= ibz_cmp_si(&ker[2], 1); - res |= ibz_cmp_si(&ker[3], 0); - - // such a vector does exist - ibz_mat_4x4_zero(&mat); - ibz_set(&mat[0][0], 4); - ibz_set(&mat[0][1], 21); - ibz_set(&mat[0][2], 0); - ibz_set(&mat[0][3], 2); - ibz_set(&mat[1][0], 82); - ibz_set(&mat[1][1], 21); - ibz_set(&mat[1][2], 0); - ibz_set(&mat[1][3], 22); - ibz_set(&mat[2][0], 22); - ibz_set(&mat[2][1], 128); - ibz_set(&mat[2][2], 22); - ibz_set(&mat[2][3], 108); - ibz_set(&mat[3][0], 32); - ibz_set(&mat[3][1], 10); - ibz_set(&mat[3][2], 4); - ibz_set(&mat[3][3], 4); - - if (ibz_4x4_right_ker_mod_power_of_2(&ker, &mat, 6)){ - zero = 1; - ibz_mat_4x4_eval(&prod,&mat,&ker); - for (int i = 0; i < 4; i++){ - ibz_div(&q,&r,&(ker[i]),&two); - zero = zero && ibz_is_zero(&r); - ibz_pow(&q,&two,6); - ibz_mod(&(prod[i]),&(prod[i]),&q); - } - res |= !quat_alg_coord_is_zero(&prod); - res |= zero; - } else { - res = 1; - } - - // such a vector does exist (since 0 row) - ibz_mat_4x4_zero(&mat); - ibz_set(&mat[0][0], 1); - ibz_set(&mat[0][1], 1); - ibz_set(&mat[0][2], 2); - ibz_set(&mat[1][0], 3); - ibz_set(&mat[1][1], 9); - ibz_set(&mat[1][2], 9); - ibz_set(&mat[2][0], 7); - ibz_set(&mat[2][1], 1); - ibz_set(&mat[2][2], 8); - ibz_set(&mat[2][3], 5); - - if (ibz_4x4_right_ker_mod_power_of_2(&ker, &mat, 6)){ - zero = 1; - ibz_mat_4x4_eval(&prod,&mat,&ker); - for (int i = 0; i < 4; i++){ - ibz_div(&q,&r,&(ker[i]),&two); - zero = zero && ibz_is_zero(&r); - ibz_pow(&q,&two,6); - ibz_mod(&(prod[i]),&(prod[i]),&q); - } - res |= !quat_alg_coord_is_zero(&prod); - res |= zero; - } else { - res = 1; - } - - - // Vector exists - ibz_mat_4x4_zero(&mat); - ibz_set(&mat[0][0], 1); - ibz_set(&mat[0][1], 1); - ibz_set(&mat[0][2], 2); - ibz_set(&mat[1][0], 3); - ibz_set(&mat[1][1], 9); - ibz_set(&mat[1][2], 0); - ibz_set(&mat[2][0], 7); - ibz_set(&mat[2][1], 1); - ibz_set(&mat[2][2], 8); - ibz_set(&mat[2][3], 5); - - res |= !ibz_4x4_right_ker_mod_power_of_2(&ker, &mat, 6); - // Can check exact match, thanks to Howell form - res |= ibz_cmp_si(&ker[0], 43) != 0; - res |= ibz_cmp_si(&ker[1], 7) != 0; - res |= ibz_cmp_si(&ker[2], 7) != 0; - res |= ibz_cmp_si(&ker[3], 4) != 0; - - // Vector exists - ibz_mat_4x4_zero(&mat); - ibz_set(&mat[0][0], 1); - ibz_set(&mat[0][1], 1); - ibz_set(&mat[0][2], 2); - ibz_set(&mat[1][0], 3); - ibz_set(&mat[1][1], 9); - ibz_set(&mat[1][2], 0); - ibz_set(&mat[1][3], 1); - ibz_set(&mat[2][0], 7); - ibz_set(&mat[2][1], 1); - ibz_set(&mat[2][2], 1); - ibz_set(&mat[2][3], 5); - - res |= !ibz_4x4_right_ker_mod_power_of_2(&ker, &mat, 6); - // Can check exact match, thanks to Howell form - res |= ibz_cmp_si(&ker[0], 31) != 0; - res |= ibz_cmp_si(&ker[1], 25) != 0; - res |= ibz_cmp_si(&ker[2], 4) != 0; - res |= ibz_cmp_si(&ker[3], 2) != 0; - - // such a vector does not exist, since bad kernel - ibz_mat_4x4_zero(&mat); - ibz_set(&mat[0][0], 1); - ibz_set(&mat[0][1], 1); - ibz_set(&mat[0][2], 2); - ibz_set(&mat[1][0], 3); - ibz_set(&mat[1][1], 9); - ibz_set(&mat[1][2], 0); - ibz_set(&mat[2][0], 7); - ibz_set(&mat[2][1], 1); - ibz_set(&mat[2][2], 8); - ibz_set(&mat[2][3], 5); - ibz_set(&mat[3][0], 1); - - res |= ibz_4x4_right_ker_mod_power_of_2(&ker, &mat, 6); - - - - if (res != 0){ - printf("Quaternion unit dim4_ibz_4x4_right_ker_mod_power_of_2 failed\n"); - } - ibz_mat_4x4_finalize(&mat); - ibz_vec_4_finalize(&ker); - ibz_vec_4_finalize(&prod); - ibz_finalize(&q); - ibz_finalize(&r); - ibz_finalize(&two); - return(res); -} - -//void ibz_mat_4x4_eval(quat_alg_coord_t *res, const ibz_mat_4x4_t *mat, const quat_alg_coord_t *vec); -int quat_test_dim4_ibz_mat_4x4_eval(){ +// void ibz_mat_4x4_eval(ibz_vec_4_t *res, const ibz_mat_4x4_t *mat, const ibz_vec_4_t *vec); +// void ibz_mat_4x4_eval_t(ibz_vec_4_t *res, const ibz_vec_4_t *vec, const ibz_mat_4x4_t *mat); +int +quat_test_dim4_ibz_mat_4x4_eval(void) +{ int res = 0; ibz_mat_4x4_t mat; - quat_alg_coord_t vec, cmp, vres; - quat_alg_coord_init(&cmp); - quat_alg_coord_init(&vres); - quat_alg_coord_init(&vec); + ibz_vec_4_t vec, cmp, vres; + ibz_vec_4_init(&cmp); + ibz_vec_4_init(&vres); + ibz_vec_4_init(&vec); ibz_mat_4x4_init(&mat); - for (int i = 0; i <4; i++){ - for (int j = 0; j <4; j++){ - ibz_set(&(mat[i][j]), i*j); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(mat[i][j]), i * j); } ibz_set(&(vec[i]), i); } @@ -1690,144 +1029,167 @@ int quat_test_dim4_ibz_mat_4x4_eval(){ ibz_set(&(cmp[1]), 14); ibz_set(&(cmp[2]), 28); ibz_set(&(cmp[3]), 42); - ibz_mat_4x4_eval(&vres,&mat,&vec); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(vres[i]),&(cmp[i])); + ibz_mat_4x4_eval(&vres, &mat, &vec); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(vres[i]), &(cmp[i])); } + ibz_vec_4_set(&vres, 0, 0, 0, 0); + ibz_mat_4x4_transpose(&mat, &mat); + ibz_mat_4x4_eval_t(&vres, &vec, &mat); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(vres[i]), &(cmp[i])); + } + ibz_mat_4x4_transpose(&mat, &mat); - for (int i = 0; i <4; i++){ - for (int j = 0; j <4; j++){ - ibz_set(&(mat[i][j]), i*(j-1)+1); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(mat[i][j]), i * (j - 1) + 1); } - ibz_set(&(vec[i]), i*i-2); + ibz_set(&(vec[i]), i * i - 2); } ibz_set(&(cmp[0]), 6); ibz_set(&(cmp[1]), 24); ibz_set(&(cmp[2]), 42); ibz_set(&(cmp[3]), 60); - ibz_mat_4x4_eval(&vres,&mat,&vec); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(vres[i]),&(cmp[i])); + ibz_mat_4x4_eval(&vres, &mat, &vec); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(vres[i]), &(cmp[i])); } + ibz_vec_4_set(&vres, 0, 0, 0, 0); + ibz_mat_4x4_transpose(&mat, &mat); + ibz_mat_4x4_eval_t(&vres, &vec, &mat); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(vres[i]), &(cmp[i])); + } + ibz_mat_4x4_transpose(&mat, &mat); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim4_ibz_mat_4x4_eval failed\n"); } - quat_alg_coord_finalize(&cmp); - quat_alg_coord_finalize(&vres); - quat_alg_coord_finalize(&vec); + ibz_vec_4_finalize(&cmp); + ibz_vec_4_finalize(&vres); + ibz_vec_4_finalize(&vec); ibz_mat_4x4_finalize(&mat); return res; } -//void quat_qf_eval(ibz_t *res, const ibz_mat_4x4_t *qf, const quat_alg_coord_t *coord); -int quat_test_dim4_qf_eval(){ +// void quat_qf_eval(ibz_t *res, const ibz_mat_4x4_t *qf, const quat_alg_coord_t *coord); +int +quat_test_dim4_qf_eval(void) +{ int res = 0; ibz_t ires, cmp; ibz_mat_4x4_t qf; - quat_alg_coord_t vec; + ibz_vec_4_t vec; ibz_init(&cmp); ibz_init(&ires); - quat_alg_coord_init(&vec); + ibz_vec_4_init(&vec); ibz_mat_4x4_init(&qf); - for (int i = 0; i <4; i++){ - for (int j = 0; j <4; j++){ - ibz_set(&(qf[i][j]), i*j); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(qf[i][j]), i * j); } ibz_set(&(vec[i]), i); } ibz_set(&(cmp), 196); - quat_qf_eval(&ires,&qf,&vec); - res = res || ibz_cmp(&ires,&cmp); + quat_qf_eval(&ires, &qf, &vec); + res = res || ibz_cmp(&ires, &cmp); - for (int i = 0; i <4; i++){ - for (int j = 0; j <4; j++){ - ibz_set(&(qf[i][j]), (i+1)*(j+1)-4); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(qf[i][j]), (i + 1) * (j + 1) - 4); } - ibz_set(&(vec[i]), (i-1)*2-2); + ibz_set(&(vec[i]), (i - 1) * 2 - 2); } - ibz_set(&(cmp), -4*16); - quat_qf_eval(&ires,&qf,&vec); - res = res || ibz_cmp(&ires,&cmp); + ibz_set(&(cmp), -4 * 16); + quat_qf_eval(&ires, &qf, &vec); + res = res || ibz_cmp(&ires, &cmp); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim4_qf_eval failed\n"); } ibz_finalize(&cmp); ibz_finalize(&ires); - quat_alg_coord_finalize(&vec); + ibz_vec_4_finalize(&vec); ibz_mat_4x4_finalize(&qf); return res; } -//void ibz_content(ibz_t *content, const quat_alg_coord_t *v); -int quat_test_dim4_ibz_content(){ +// void ibz_vec_4_content(ibz_t *content, const quat_alg_coord_t *v); +int +quat_test_dim4_ibz_vec_4_content(void) +{ int res = 0; - ibz_t c,cmp; - quat_alg_coord_t x; + ibz_t c, cmp; + ibz_vec_4_t x; ibz_init(&c); ibz_init(&cmp); - quat_alg_coord_init(&x); + ibz_vec_4_init(&x); - ibz_set(&(x[0]),0); - ibz_set(&(x[1]),0); - ibz_set(&(x[2]),0); - ibz_set(&(x[3]),0); - ibz_set(&cmp,0); - ibz_content(&c,&x); - res = res || ibz_cmp(&c,&cmp); + ibz_set(&(x[0]), 0); + ibz_set(&(x[1]), 0); + ibz_set(&(x[2]), 0); + ibz_set(&(x[3]), 0); + ibz_set(&cmp, 0); + ibz_vec_4_content(&c, &x); + res = res || ibz_cmp(&c, &cmp); - ibz_set(&(x[0]),5); - ibz_set(&(x[1]),25); - ibz_set(&(x[2]),125); - ibz_set(&(x[3]),30); - ibz_set(&cmp,5); - ibz_content(&c,&x); - res = res || ibz_cmp(&c,&cmp); + ibz_set(&(x[0]), 5); + ibz_set(&(x[1]), 25); + ibz_set(&(x[2]), 125); + ibz_set(&(x[3]), 30); + ibz_set(&cmp, 5); + ibz_vec_4_content(&c, &x); + res = res || ibz_cmp(&c, &cmp); - ibz_set(&(x[0]),5); - ibz_set(&(x[1]),2); - ibz_set(&(x[2]),125); - ibz_set(&(x[3]),30); - ibz_set(&cmp,1); - ibz_content(&c,&x); - res = res || ibz_cmp(&c,&cmp); + ibz_set(&(x[0]), 5); + ibz_set(&(x[1]), 2); + ibz_set(&(x[2]), 125); + ibz_set(&(x[3]), 30); + ibz_set(&cmp, 1); + ibz_vec_4_content(&c, &x); + res = res || ibz_cmp(&c, &cmp); - ibz_set(&(x[0]),5); - ibz_set(&(x[1]),-2); - ibz_set(&(x[2]),125); - ibz_set(&(x[3]),0); - ibz_set(&cmp,1); - ibz_content(&c,&x); - res = res || ibz_cmp(&c,&cmp); + ibz_set(&(x[0]), 5); + ibz_set(&(x[1]), -2); + ibz_set(&(x[2]), 125); + ibz_set(&(x[3]), 0); + ibz_set(&cmp, 1); + ibz_vec_4_content(&c, &x); + res = res || ibz_cmp(&c, &cmp); - ibz_set(&(x[0]),0); - ibz_set(&(x[1]),-2); - ibz_set(&(x[2]),0); - ibz_set(&(x[3]),0); - ibz_set(&cmp,2); - ibz_content(&c,&x); - res = res || ibz_cmp(&c,&cmp); + ibz_set(&(x[0]), 0); + ibz_set(&(x[1]), -2); + ibz_set(&(x[2]), 0); + ibz_set(&(x[3]), 0); + ibz_set(&cmp, 2); + ibz_vec_4_content(&c, &x); + res = res || ibz_cmp(&c, &cmp); - if (res != 0){ - printf("Quaternion unit test dim4_ibz_content failed\n"); + if (res != 0) { + printf("Quaternion unit test dim4_ibz_vec_4_content failed\n"); } - quat_alg_coord_finalize(&x); + ibz_vec_4_finalize(&x); ibz_finalize(&c); ibz_finalize(&cmp); return res; } - // run all previous tests -int quat_test_dim4(){ +int +quat_test_dim4(void) +{ int res = 0; printf("\nRunning quaternion tests of matrices, vectors and quadratic forms in dimension 4\n"); res = res | quat_test_dim4_ibz_mat_4x4_mul(); res = res | quat_test_dim4_ibz_vec_4_set(); res = res | quat_test_dim4_ibz_vec_4_copy(); res = res | quat_test_dim4_ibz_vec_4_negate(); + res = res | quat_test_dim4_vec_4_copy_ibz(); + res = res | quat_test_dim4_ibz_vec_4_add(); + res = res | quat_test_dim4_ibz_vec_4_sub(); + res = res | quat_test_dim4_ibz_vec_4_is_zero(); res = res | quat_test_dim4_ibz_vec_4_linear_combination(); res = res | quat_test_dim4_ibz_mat_4x4_copy(); res = res | quat_test_dim4_ibz_mat_4x4_negate(); @@ -1838,22 +1200,13 @@ int quat_test_dim4(){ res = res | quat_test_dim4_ibz_mat_4x4_equal(); res = res | quat_test_dim4_ibz_mat_4x4_scalar_mul(); res = res | quat_test_dim4_ibz_mat_4x4_gcd(); + res = res | quat_test_dim4_ibz_vec_4_scalar_mul(); res = res | quat_test_dim4_ibz_mat_4x4_scalar_div(); - res = res | quat_test_dim4_is_hnf(); - res = res | quat_test_dim4_ibz_mat_4x8_hnf_core(); - res = res | quat_test_dim4_ibz_mat_4x4_hnf_mod(); - res = res | quat_test_dim4_ibq_vec_4_copy_ibz(); - res = res | quat_test_dim4_lll_bilinear(); - res = res | quat_test_dim4_gram_schmidt_transposed_with_ibq(); - res = res | quat_test_dim4_lll_verify(); res = res | quat_test_dim4_ibz_inv_dim4_make_coeff_pmp(); res = res | quat_test_dim4_ibz_inv_dim4_make_coeff_mpm(); res = res | quat_test_dim4_ibz_mat_4x4_inv_with_det_as_denom(); - res = res | quat_test_dim4_ibz_4x5_right_ker_mod_prime(); - res = res | quat_test_dim4_ibz_4x4_right_ker_mod_prime(); - res = res | quat_test_dim4_ibz_4x4_right_ker_mod_power_of_2(); res = res | quat_test_dim4_ibz_mat_4x4_eval(); res = res | quat_test_dim4_qf_eval(); - res = res | quat_test_dim4_ibz_content(); - return(res); + res = res | quat_test_dim4_ibz_vec_4_content(); + return (res); } diff --git a/src/quaternion/ref/generic/test/finit.c b/src/quaternion/ref/generic/test/finit.c index 88da165..9335246 100644 --- a/src/quaternion/ref/generic/test/finit.c +++ b/src/quaternion/ref/generic/test/finit.c @@ -2,276 +2,193 @@ // Schema of tests: initialize structure, assign values, finalize -//void quat_alg_init(quat_alg_t *alg); -//void quat_alg_finalize(quat_alg_t *alg); -int quat_test_finit_alg(){ +// void quat_alg_init(quat_alg_t *alg); +// void quat_alg_finalize(quat_alg_t *alg); +int +quat_test_finit_alg(void) +{ int res = 0; quat_alg_t alg; ibz_t p; - ibz_mat_4x4_t cmp; - ibz_mat_4x4_init(&cmp); ibz_init(&p); - ibz_set(&p,7); + ibz_set(&p, 7); quat_alg_init_set(&alg, &p); - res = res || ibz_cmp(&(alg.p),&p); - ibz_mat_4x4_identity(&cmp); - ibz_copy(&(cmp[2][2]),&p); - ibz_copy(&(cmp[3][3]),&p); - res = res || !ibz_mat_4x4_equal(&cmp,&(alg.gram)); - if (res != 0){ + res = res || ibz_cmp(&(alg.p), &p); + if (res != 0) { printf("Quaternion unit test finit_alg failed\n"); } - ibz_mat_4x4_finalize(&cmp); ibz_finalize(&p); quat_alg_finalize(&alg); return res; } -//void quat_alg_elem_init(quat_alg_elem_t *elem); -//void quat_alg_elem_finalize(quat_alg_elem_t *elem); -int quat_test_finit_alg_elem(){ +// void quat_alg_elem_init(quat_alg_elem_t *elem); +// void quat_alg_elem_finalize(quat_alg_elem_t *elem); +int +quat_test_finit_alg_elem(void) +{ quat_alg_elem_t elem; int res; quat_alg_elem_init(&elem); - ibz_set(&(elem.coord[0]),0); - ibz_set(&(elem.coord[1]),1); - ibz_set(&(elem.coord[2]),2); - ibz_set(&(elem.coord[3]),3); - ibz_set(&(elem.denom),1); - res = 1-(1==ibz_is_one(&(elem.denom))); - for(int i = 0; i <4; i++){ - res = res || (i!=ibz_get(&(elem.coord[i]))); + ibz_set(&(elem.coord[0]), 0); + ibz_set(&(elem.coord[1]), 1); + ibz_set(&(elem.coord[2]), 2); + ibz_set(&(elem.coord[3]), 3); + ibz_set(&(elem.denom), 1); + res = 1 - (1 == ibz_is_one(&(elem.denom))); + for (int i = 0; i < 4; i++) { + res = res || (ibz_cmp_int32(&(elem.coord[i]), i) != 0); } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test finit_alg_elem failed\n"); } quat_alg_elem_finalize(&elem); return res; } -//void quat_alg_coord_init(quat_alg_coord_t *coord); -//void quat_alg_coord_finalize(quat_alg_coord_t *coord); -int quat_test_finit_alg_coord(){ - quat_alg_coord_t coord; +// void ibz_vec_2_init(ibz_vec_2_t *vec); +// void ibz_vec_2_finalize(ibz_vec_2_t *vec); +int +quat_test_finit_ibz_vec_2(void) +{ + ibz_vec_2_t vec; int res = 0; - quat_alg_coord_init(&coord); - ibz_set(&(coord[0]),0); - ibz_set(&(coord[1]),1); - ibz_set(&(coord[2]),2); - ibz_set(&(coord[3]),3); - for(int i = 0; i <4; i++){ - res = res || (i!=ibz_get(&(coord[i]))); + ibz_vec_2_init(&vec); + for (int i = 0; i < 2; i++) { + ibz_set(&(vec[i]), i); } - if (res != 0){ - printf("Quaternion unit test finit_alg_coord failed\n"); + for (int i = 0; i < 2; i++) { + res = res || (ibz_cmp_int32(&(vec[i]), i) != 0); } - quat_alg_coord_finalize(&coord); + if (res != 0) { + printf("Quaternion unit test finit_ibz_vec_2 failed\n"); + } + ibz_vec_2_finalize(&vec); return res; } -//void ibz_vec_4_init(ibz_vec_4_t *vec); -//void ibz_vec_4_finalize(ibz_vec_4_t *vec); -int quat_test_finit_ibz_vec_4(){ +// void ibz_vec_4_init(ibz_vec_4_t *vec); +// void ibz_vec_4_finalize(ibz_vec_4_t *vec); +int +quat_test_finit_ibz_vec_4(void) +{ ibz_vec_4_t vec; int res = 0; ibz_vec_4_init(&vec); - for(int i = 0; i <4; i++){ - ibz_set(&(vec[i]),i); + for (int i = 0; i < 4; i++) { + ibz_set(&(vec[i]), i); } - for(int i = 0; i <4; i++){ - res = res || (i!=ibz_get(&(vec[i]))); + for (int i = 0; i < 4; i++) { + res = res || (ibz_cmp_int32(&(vec[i]), i) != 0); } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test finit_ibz_vec_4 failed\n"); } ibz_vec_4_finalize(&vec); return res; } -//void ibz_vec_5_init(ibz_vec_5_t *vec); -//void ibz_vec_5_finalize(ibz_vec_5_t *vec); -int quat_test_finit_ibz_vec_5(){ - ibz_vec_5_t vec; - int res = 0; - ibz_vec_5_init(&vec); - for(int i = 0; i <5; i++){ - ibz_set(&(vec[i]),i); - } - for(int i = 0; i <5; i++){ - res = res || (i!=ibz_get(&(vec[i]))); - } - if (res != 0){ - printf("Quaternion unit test finit_ibz_vec_5 failed\n"); - } - ibz_vec_5_finalize(&vec); - return res; -} - -//void ibz_mat_2x2_init(ibz_mat_2x2_t *mat); -//void ibz_mat_2x2_finalize(ibz_mat_2x2_t *mat); -int quat_test_finit_ibz_mat_2x2(){ +// void ibz_mat_2x2_init(ibz_mat_2x2_t *mat); +// void ibz_mat_2x2_finalize(ibz_mat_2x2_t *mat); +int +quat_test_finit_ibz_mat_2x2(void) +{ ibz_mat_2x2_t mat; int res = 0; ibz_mat_2x2_init(&mat); - for (int i = 0; i < 2; i++){ - for (int j = 0; j < 2; j++){ - ibz_set(&(mat[i][j]),i+j); + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + ibz_set(&(mat[i][j]), i + j); } } - for(int i = 0; i <2; i++){ - for (int j = 0; j < 2; j++){ - res = res || (i+j!=ibz_get(&(mat[i][j]))); + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + res = res || (ibz_cmp_int32(&(mat[i][j]), i + j) != 0); } } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test finit_ibz_mat_2x2 failed\n"); } ibz_mat_2x2_finalize(&mat); return res; } -//void ibz_mat_4x4_init(ibz_mat_4x4_t *mat); -//void ibz_mat_4x4_finalize(ibz_mat_4x4_t *mat); -int quat_test_finit_ibz_mat_4x4(){ +// void ibz_mat_4x4_init(ibz_mat_4x4_t *mat); +// void ibz_mat_4x4_finalize(ibz_mat_4x4_t *mat); +int +quat_test_finit_ibz_mat_4x4(void) +{ ibz_mat_4x4_t mat; int res = 0; ibz_mat_4x4_init(&mat); - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 4; j++){ - ibz_set(&(mat[i][j]),i+j); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(mat[i][j]), i + j); } } - for(int i = 0; i <4; i++){ - for (int j = 0; j < 4; j++){ - res = res || (i+j!=ibz_get(&(mat[i][j]))); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + res = res || (ibz_cmp_int32(&(mat[i][j]), i + j) != 0); } } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test finit_ibz_mat_4x4 failed\n"); } ibz_mat_4x4_finalize(&mat); return res; } - -//void ibz_mat_4x5_init(ibz_mat_4x5_t *mat); -//void ibz_mat_4x5_finalize(ibz_mat_4x5_t *mat); -int quat_test_finit_ibz_mat_4x5(){ - ibz_mat_4x5_t mat; - int res = 0; - ibz_mat_4x5_init(&mat); - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 5; j++){ - ibz_set(&(mat[i][j]),i+j); - } - } - for(int i = 0; i <4; i++){ - for (int j = 0; j < 5; j++){ - res = res || (i+j!=ibz_get(&(mat[i][j]))); - } - } - if (res != 0){ - printf("Quaternion unit test finit_ibz_mat_4x5 failed\n"); - } - ibz_mat_4x5_finalize(&mat); - return res; -} - -//void ibz_mat_4x8_init(ibz_mat_4x8_t *mat); -//void ibz_mat_4x8_finalize(ibz_mat_4x8_t *mat); -int quat_test_finit_ibz_mat_4x8(){ - ibz_mat_4x8_t mat; - int res = 0; - ibz_mat_4x8_init(&mat); - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 8; j++){ - ibz_set(&(mat[i][j]),i+j); - } - } - for(int i = 0; i <4; i++){ - for (int j = 0; j < 8; j++){ - res = res || (i+j!=ibz_get(&(mat[i][j]))); - } - } - if (res != 0){ - printf("Quaternion unit test finit_ibz_mat_4x8 failed\n"); - } - ibz_mat_4x8_finalize(&mat); - return res; -} - -//void quat_lattice_init(quat_lattice_t *lat); -//void quat_lattice_finalize(quat_lattice_t *lat); -int quat_test_finit_lattice(){ +// void quat_lattice_init(quat_lattice_t *lat); +// void quat_lattice_finalize(quat_lattice_t *lat); +int +quat_test_finit_lattice(void) +{ quat_lattice_t lat; int res = 0; quat_lattice_init(&lat); - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 4; j++){ - ibz_set(&(lat.basis[i][j]),i+j); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(lat.basis[i][j]), i + j); } } - ibz_set(&(lat.denom),1); - res = 1-(1==ibz_is_one(&(lat.denom))); - for(int i = 0; i <4; i++){ - for (int j = 0; j < 4; j++){ - res = res || (i+j!=ibz_get(&(lat.basis[i][j]))); + ibz_set(&(lat.denom), 1); + res = 1 - (1 == ibz_is_one(&(lat.denom))); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + res = res || (ibz_cmp_int32(&(lat.basis[i][j]), i + j) != 0); } } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test finit_alg_lattice failed\n"); } quat_lattice_finalize(&lat); return res; } -//void quat_order_init(quat_order_t *order); -//void quat_order_finalize(quat_order_t *order); -int quat_test_finit_order(){ - quat_order_t order; - int res = 0; - quat_order_init(&order); - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 4; j++){ - ibz_set(&(order.basis[i][j]),i+j); - } - } - ibz_set(&(order.denom),1); - res = 1-(1==ibz_is_one(&(order.denom))); - for(int i = 0; i <4; i++){ - for (int j = 0; j < 4; j++){ - res = res || (i+j!=ibz_get(&(order.basis[i][j]))); - } - } - if (res != 0){ - printf("Quaternion unit test finit_alg_order failed\n"); - } - quat_order_finalize(&order); - return res; -} - -//void quat_left_ideal_init(quat_left_ideal_t *lideal); -//void quat_left_ideal_finalize(quat_left_ideal_t *lideal); -int quat_test_finit_lideal(){ +// void quat_left_ideal_init(quat_left_ideal_t *lideal); +// void quat_left_ideal_finalize(quat_left_ideal_t *lideal); +int +quat_test_finit_lideal(void) +{ quat_left_ideal_t lideal; int res = 0; quat_left_ideal_init(&lideal); - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 4; j++){ - ibz_set(&(lideal.lattice.basis[i][j]),i+j); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(lideal.lattice.basis[i][j]), i + j); } } - ibz_set(&(lideal.lattice.denom),1); - ibz_set(&(lideal.norm),5); + ibz_set(&(lideal.lattice.denom), 1); + ibz_set(&(lideal.norm), 5); lideal.parent_order = NULL; - res = 1-(1==ibz_is_one(&(lideal.lattice.denom))); - for(int i = 0; i <4; i++){ - for (int j = 0; j < 4; j++){ - res = res || (i+j!=ibz_get(&(lideal.lattice.basis[i][j]))); + res = 1 - (1 == ibz_is_one(&(lideal.lattice.denom))); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + res = res || (ibz_cmp_int32(&(lideal.lattice.basis[i][j]), i + j) != 0); } } - res = res || (5!=ibz_get(&(lideal.norm))); - if (res != 0){ + res = res || (ibz_cmp_int32(&(lideal.norm), 5) != 0); + if (res != 0) { printf("Quaternion unit test finit_alg_lideal failed\n"); } quat_left_ideal_finalize(&lideal); @@ -279,21 +196,18 @@ int quat_test_finit_lideal(){ } // run all previous tests -int quat_test_finit(){ +int +quat_test_finit(void) +{ int res = 0; printf("\nRunning quaternion tests of initializers and finalizers\n"); res = res | quat_test_finit_alg(); res = res | quat_test_finit_alg_elem(); - res = res | quat_test_finit_alg_coord(); + res = res | quat_test_finit_ibz_vec_2(); res = res | quat_test_finit_ibz_vec_4(); - res = res | quat_test_finit_ibz_vec_5(); res = res | quat_test_finit_ibz_mat_2x2(); res = res | quat_test_finit_ibz_mat_4x4(); - res = res | quat_test_finit_ibz_mat_4x5(); - res = res | quat_test_finit_ibz_mat_4x8(); res = res | quat_test_finit_lattice(); - res = res | quat_test_finit_order(); res = res | quat_test_finit_lideal(); - return(res); + return (res); } - diff --git a/src/quaternion/ref/generic/test/ideal.c b/src/quaternion/ref/generic/test/ideal.c index ab82d24..7e92ab8 100644 --- a/src/quaternion/ref/generic/test/ideal.c +++ b/src/quaternion/ref/generic/test/ideal.c @@ -1,55 +1,122 @@ #include "quaternion_tests.h" -//void quat_lideal_create_principal(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const quat_order_t *order, const quat_alg_t *alg); -int quat_test_lideal_create_principal(){ +// void quat_lideal_norm(quat_left_ideal_t *lideal); +int +quat_test_lideal_norm(void) +{ int res = 0; - - // Example from https://github.com/SQISign/sqisign-nist/issues/38#issuecomment-1554585079 + quat_left_ideal_t lideal; + quat_lattice_t order; quat_alg_t alg; - quat_order_t lat; + quat_alg_elem_t gen; + ibz_t norm; + ibz_init(&norm); + quat_left_ideal_init(&lideal); + quat_lattice_init(&order); + quat_alg_elem_init(&gen); + quat_alg_init_set_ui(&alg, 23); + quat_lattice_O0_set(&order); + quat_alg_elem_set(&gen, 1, 3, 2, 1, 4); + assert(quat_lattice_contains(NULL, &order, &gen)); + ibz_set(&norm, 17); + quat_lideal_create(&lideal, &gen, &norm, &order, &alg); + ibz_copy(&norm, &(lideal.norm)); + ibz_set(&(lideal.norm), 0); + quat_lideal_norm(&lideal); + res = res || ibz_cmp(&(lideal.norm), &norm); + + if (res != 0) { + printf("Quaternion unit test lideal_norm failed\n"); + } + ibz_finalize(&norm); + quat_left_ideal_finalize(&lideal); + quat_lattice_finalize(&order); + quat_alg_elem_finalize(&gen); + quat_alg_finalize(&alg); + return (res); +} + +// void quat_lideal_copy(quat_left_ideal_t *copy, const quat_left_ideal_t *copied); +int +quat_test_lideal_copy() +{ + int res = 0; + quat_left_ideal_t copy, copied; + quat_alg_elem_t elem; + quat_alg_t alg; + quat_lattice_t order; + quat_alg_init_set_ui(&alg, 103); + quat_lattice_init(&order); + quat_alg_elem_init(&elem); + quat_left_ideal_init(©); + quat_left_ideal_init(&copied); + quat_lattice_O0_set(&order); + quat_alg_elem_set(&elem, 1, 4, 2, 9, -1); + quat_lideal_create_principal(&copied, &elem, &order, &alg); + quat_lideal_copy(©, &copied); + res = res | !(quat_lideal_equals(©, &copied, &alg)); + ibz_set(&(elem.coord[0]), 23); + quat_lideal_create_principal(&copied, &elem, &order, &alg); + res = res | (quat_lideal_equals(©, &copied, &alg)); + quat_lideal_copy(©, &copied); + res = res | !(quat_lideal_equals(©, &copied, &alg)); + if (res) { + printf("Quaternion unit test lideal_copy failed\n"); + } + quat_alg_elem_finalize(&elem); + quat_alg_finalize(&alg); + quat_lattice_finalize(&order); + quat_left_ideal_finalize(©); + quat_left_ideal_finalize(&copied); + return (res); +} + +// void quat_lideal_create_principal(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const +// quat_lattice_t *order, const quat_alg_t *alg); +int +quat_test_lideal_create_principal(void) +{ + int res = 0; + + quat_alg_t alg; + quat_lattice_t lat; quat_alg_elem_t gamma; quat_left_ideal_t I; quat_alg_init_set_ui(&alg, 367); - quat_order_init(&lat); + quat_lattice_init(&lat); quat_alg_elem_init(&gamma); quat_left_ideal_init(&I); - ibz_set(&lat.denom, 2); - ibz_set(&lat.basis[0][0], 2); - ibz_set(&lat.basis[1][1], 2); - ibz_set(&lat.basis[1][2], 1); - ibz_set(&lat.basis[2][2], 1); - ibz_set(&lat.basis[3][3], 1); - ibz_set(&lat.basis[0][3], 1); + quat_lattice_O0_set(&lat); ibz_set(&gamma.coord[0], 219); ibz_set(&gamma.coord[1], 200); ibz_set(&gamma.coord[2], 78); ibz_set(&gamma.coord[3], -1); quat_lideal_create_principal(&I, &gamma, &lat, &alg); - + res |= I.parent_order != ⪫ - res |= ibz_cmp_si(&I.norm, 2321156); + res |= ibz_cmp_int32(&I.norm, 2321156); res |= ibz_cmp(&I.lattice.denom, &ibz_const_one); - - res |= ibz_cmp_si(&I.lattice.basis[0][0], 1160578); - res |= ibz_cmp_si(&I.lattice.basis[1][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[2][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[3][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[0][1], 0); - res |= ibz_cmp_si(&I.lattice.basis[1][1], 1160578); - res |= ibz_cmp_si(&I.lattice.basis[2][1], 0); - res |= ibz_cmp_si(&I.lattice.basis[3][1], 0); + res |= ibz_cmp_int32(&I.lattice.basis[0][0], 1160578); + res |= ibz_cmp_int32(&I.lattice.basis[1][0], 0); + res |= ibz_cmp_int32(&I.lattice.basis[2][0], 0); + res |= ibz_cmp_int32(&I.lattice.basis[3][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[0][2], 310126); - res |= ibz_cmp_si(&I.lattice.basis[1][2], 182529); - res |= ibz_cmp_si(&I.lattice.basis[2][2], 1); - res |= ibz_cmp_si(&I.lattice.basis[3][2], 0); - - res |= ibz_cmp_si(&I.lattice.basis[0][3], 978049); - res |= ibz_cmp_si(&I.lattice.basis[1][3], 310126); - res |= ibz_cmp_si(&I.lattice.basis[2][3], 0); - res |= ibz_cmp_si(&I.lattice.basis[3][3], 1); + res |= ibz_cmp_int32(&I.lattice.basis[0][1], 0); + res |= ibz_cmp_int32(&I.lattice.basis[1][1], 1160578); + res |= ibz_cmp_int32(&I.lattice.basis[2][1], 0); + res |= ibz_cmp_int32(&I.lattice.basis[3][1], 0); + + res |= ibz_cmp_int32(&I.lattice.basis[0][2], 310126); + res |= ibz_cmp_int32(&I.lattice.basis[1][2], 182529); + res |= ibz_cmp_int32(&I.lattice.basis[2][2], 1); + res |= ibz_cmp_int32(&I.lattice.basis[3][2], 0); + + res |= ibz_cmp_int32(&I.lattice.basis[0][3], 978049); + res |= ibz_cmp_int32(&I.lattice.basis[1][3], 310126); + res |= ibz_cmp_int32(&I.lattice.basis[2][3], 0); + res |= ibz_cmp_int32(&I.lattice.basis[3][3], 1); // same test, just with gamma not reduced ibz_set(&gamma.coord[0], 438); @@ -61,28 +128,28 @@ int quat_test_lideal_create_principal(){ quat_lideal_create_principal(&I, &gamma, &lat, &alg); res |= I.parent_order != ⪫ - res |= ibz_cmp_si(&I.norm, 2321156); + res |= ibz_cmp_int32(&I.norm, 2321156); res |= ibz_cmp(&I.lattice.denom, &ibz_const_one); - res |= ibz_cmp_si(&I.lattice.basis[0][0], 1160578); - res |= ibz_cmp_si(&I.lattice.basis[1][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[2][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[3][0], 0); + res |= ibz_cmp_int32(&I.lattice.basis[0][0], 1160578); + res |= ibz_cmp_int32(&I.lattice.basis[1][0], 0); + res |= ibz_cmp_int32(&I.lattice.basis[2][0], 0); + res |= ibz_cmp_int32(&I.lattice.basis[3][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[0][1], 0); - res |= ibz_cmp_si(&I.lattice.basis[1][1], 1160578); - res |= ibz_cmp_si(&I.lattice.basis[2][1], 0); - res |= ibz_cmp_si(&I.lattice.basis[3][1], 0); + res |= ibz_cmp_int32(&I.lattice.basis[0][1], 0); + res |= ibz_cmp_int32(&I.lattice.basis[1][1], 1160578); + res |= ibz_cmp_int32(&I.lattice.basis[2][1], 0); + res |= ibz_cmp_int32(&I.lattice.basis[3][1], 0); - res |= ibz_cmp_si(&I.lattice.basis[0][2], 310126); - res |= ibz_cmp_si(&I.lattice.basis[1][2], 182529); - res |= ibz_cmp_si(&I.lattice.basis[2][2], 1); - res |= ibz_cmp_si(&I.lattice.basis[3][2], 0); + res |= ibz_cmp_int32(&I.lattice.basis[0][2], 310126); + res |= ibz_cmp_int32(&I.lattice.basis[1][2], 182529); + res |= ibz_cmp_int32(&I.lattice.basis[2][2], 1); + res |= ibz_cmp_int32(&I.lattice.basis[3][2], 0); - res |= ibz_cmp_si(&I.lattice.basis[0][3], 978049); - res |= ibz_cmp_si(&I.lattice.basis[1][3], 310126); - res |= ibz_cmp_si(&I.lattice.basis[2][3], 0); - res |= ibz_cmp_si(&I.lattice.basis[3][3], 1); + res |= ibz_cmp_int32(&I.lattice.basis[0][3], 978049); + res |= ibz_cmp_int32(&I.lattice.basis[1][3], 310126); + res |= ibz_cmp_int32(&I.lattice.basis[2][3], 0); + res |= ibz_cmp_int32(&I.lattice.basis[3][3], 1); // same test, just with gamma and basis not reduced ibz_set(&lat.denom, 6); @@ -99,220 +166,123 @@ int quat_test_lideal_create_principal(){ ibz_set(&gamma.denom, 2); quat_lideal_create_principal(&I, &gamma, &lat, &alg); - + res |= I.parent_order != ⪫ - res |= ibz_cmp_si(&I.norm, 2321156); + res |= ibz_cmp_int32(&I.norm, 2321156); res |= ibz_cmp(&I.lattice.denom, &ibz_const_one); - - res |= ibz_cmp_si(&I.lattice.basis[0][0], 1160578); - res |= ibz_cmp_si(&I.lattice.basis[1][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[2][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[3][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[0][1], 0); - res |= ibz_cmp_si(&I.lattice.basis[1][1], 1160578); - res |= ibz_cmp_si(&I.lattice.basis[2][1], 0); - res |= ibz_cmp_si(&I.lattice.basis[3][1], 0); + res |= ibz_cmp_int32(&I.lattice.basis[0][0], 1160578); + res |= ibz_cmp_int32(&I.lattice.basis[1][0], 0); + res |= ibz_cmp_int32(&I.lattice.basis[2][0], 0); + res |= ibz_cmp_int32(&I.lattice.basis[3][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[0][2], 310126); - res |= ibz_cmp_si(&I.lattice.basis[1][2], 182529); - res |= ibz_cmp_si(&I.lattice.basis[2][2], 1); - res |= ibz_cmp_si(&I.lattice.basis[3][2], 0); - - res |= ibz_cmp_si(&I.lattice.basis[0][3], 978049); - res |= ibz_cmp_si(&I.lattice.basis[1][3], 310126); - res |= ibz_cmp_si(&I.lattice.basis[2][3], 0); - res |= ibz_cmp_si(&I.lattice.basis[3][3], 1); + res |= ibz_cmp_int32(&I.lattice.basis[0][1], 0); + res |= ibz_cmp_int32(&I.lattice.basis[1][1], 1160578); + res |= ibz_cmp_int32(&I.lattice.basis[2][1], 0); + res |= ibz_cmp_int32(&I.lattice.basis[3][1], 0); + res |= ibz_cmp_int32(&I.lattice.basis[0][2], 310126); + res |= ibz_cmp_int32(&I.lattice.basis[1][2], 182529); + res |= ibz_cmp_int32(&I.lattice.basis[2][2], 1); + res |= ibz_cmp_int32(&I.lattice.basis[3][2], 0); + + res |= ibz_cmp_int32(&I.lattice.basis[0][3], 978049); + res |= ibz_cmp_int32(&I.lattice.basis[1][3], 310126); + res |= ibz_cmp_int32(&I.lattice.basis[2][3], 0); + res |= ibz_cmp_int32(&I.lattice.basis[3][3], 1); quat_alg_finalize(&alg); - quat_order_finalize(&lat); + quat_lattice_finalize(&lat); quat_alg_elem_finalize(&gamma); quat_left_ideal_finalize(&I); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test lideal_create_principal failed\n"); } - return(res); + return (res); } -//void quat_lideal_create_from_primitive(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const ibz_t *N, const quat_order_t *order, const quat_alg_t *alg); -int quat_test_lideal_create_from_primitive(){ +// void quat_lideal_create(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const +// ibz_t *N, const quat_lattice_t *order, const quat_alg_t *alg); +int +quat_test_lideal_create_from_primitive(void) +{ int res = 0; - // Example from https://github.com/SQISign/sqisign-nist/issues/38#issuecomment-1554585079 quat_alg_t alg; - quat_order_t lat; + quat_lattice_t lat; quat_alg_elem_t gamma; ibz_t N; quat_left_ideal_t I; quat_alg_init_set_ui(&alg, 367); - quat_order_init(&lat); + quat_lattice_init(&lat); quat_alg_elem_init(&gamma); ibz_init(&N); quat_left_ideal_init(&I); - ibz_set(&lat.denom, 2); - ibz_set(&lat.basis[0][0], 2); - ibz_set(&lat.basis[1][1], 2); - ibz_set(&lat.basis[1][2], 1); - ibz_set(&lat.basis[2][2], 1); - ibz_set(&lat.basis[3][3], 1); - ibz_set(&lat.basis[0][3], 1); + quat_lattice_O0_set(&lat); ibz_set(&gamma.coord[0], 219); ibz_set(&gamma.coord[1], 200); ibz_set(&gamma.coord[2], 78); ibz_set(&gamma.coord[3], -1); ibz_set(&N, 31); - quat_lideal_create_from_primitive(&I, &gamma, &N, &lat, &alg); - + quat_lideal_create(&I, &gamma, &N, &lat, &alg); + res |= I.parent_order != ⪫ res |= ibz_cmp(&I.norm, &N); res |= ibz_cmp(&I.lattice.denom, &ibz_const_two); - res |= ibz_cmp_si(&I.lattice.basis[0][0], 62); - res |= ibz_cmp_si(&I.lattice.basis[1][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[2][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[3][0], 0); + res |= ibz_cmp_int32(&I.lattice.basis[0][0], 62); + res |= ibz_cmp_int32(&I.lattice.basis[1][0], 0); + res |= ibz_cmp_int32(&I.lattice.basis[2][0], 0); + res |= ibz_cmp_int32(&I.lattice.basis[3][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[0][1], 0); - res |= ibz_cmp_si(&I.lattice.basis[1][1], 62); - res |= ibz_cmp_si(&I.lattice.basis[2][1], 0); - res |= ibz_cmp_si(&I.lattice.basis[3][1], 0); - - res |= ibz_cmp_si(&I.lattice.basis[0][2], 2); - res |= ibz_cmp_si(&I.lattice.basis[1][2], 1); - res |= ibz_cmp_si(&I.lattice.basis[2][2], 1); - res |= ibz_cmp_si(&I.lattice.basis[3][2], 0); - - res |= ibz_cmp_si(&I.lattice.basis[0][3], 61); - res |= ibz_cmp_si(&I.lattice.basis[1][3], 2); - res |= ibz_cmp_si(&I.lattice.basis[2][3], 0); - res |= ibz_cmp_si(&I.lattice.basis[3][3], 1); + res |= ibz_cmp_int32(&I.lattice.basis[0][1], 0); + res |= ibz_cmp_int32(&I.lattice.basis[1][1], 62); + res |= ibz_cmp_int32(&I.lattice.basis[2][1], 0); + res |= ibz_cmp_int32(&I.lattice.basis[3][1], 0); + + res |= ibz_cmp_int32(&I.lattice.basis[0][2], 2); + res |= ibz_cmp_int32(&I.lattice.basis[1][2], 1); + res |= ibz_cmp_int32(&I.lattice.basis[2][2], 1); + res |= ibz_cmp_int32(&I.lattice.basis[3][2], 0); + + res |= ibz_cmp_int32(&I.lattice.basis[0][3], 61); + res |= ibz_cmp_int32(&I.lattice.basis[1][3], 2); + res |= ibz_cmp_int32(&I.lattice.basis[2][3], 0); + res |= ibz_cmp_int32(&I.lattice.basis[3][3], 1); quat_alg_finalize(&alg); - quat_order_finalize(&lat); + quat_lattice_finalize(&lat); quat_alg_elem_finalize(&gamma); ibz_finalize(&N); quat_left_ideal_finalize(&I); - - if (res != 0){ + + if (res != 0) { printf("Quaternion unit test lideal_create_from_primitive failed\n"); } - return(res); + return (res); } -//void quat_lideal_make_primitive_then_create(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const ibz_t *N, const quat_order_t *order, const quat_alg_t *alg); -int quat_test_lideal_make_primitive_then_create(){ - int res = 0; - ibz_t n, cnt; - quat_alg_t alg; - quat_alg_elem_t gen, x; - quat_alg_coord_t prim; - quat_order_t order; - quat_left_ideal_t lideal,cmp; - quat_left_ideal_init(&lideal); - quat_left_ideal_init(&cmp); - quat_alg_init_set_ui(&alg, 103); - quat_alg_elem_init(&gen); - quat_alg_elem_init(&x); - quat_alg_coord_init(&prim); - quat_order_init(&order); - ibz_init(&n); - ibz_init(&cnt); - - - ibz_set(&order.denom, 2); - ibz_set(&order.basis[0][0], 2); - ibz_set(&order.basis[1][1], 2); - ibz_set(&order.basis[1][2], 1); - ibz_set(&order.basis[2][2], 1); - ibz_set(&order.basis[3][3], 1); - ibz_set(&order.basis[0][3], 1); - - ibz_set(&x.coord[0], 6); - ibz_set(&x.coord[1], 10); - ibz_set(&x.coord[2], 14); - ibz_set(&x.coord[3], 22); - ibz_set(&n, 17); - - quat_lideal_make_primitive_then_create(&lideal,&x,&n,&order,&alg); - quat_alg_make_primitive(&prim,&cnt,&x,&order,&alg); - ibz_mat_4x4_eval(&(gen.coord),&(order.basis),&prim); - ibz_copy(&gen.denom,&order.denom); - quat_lideal_create_from_primitive(&cmp,&gen,&n,&order,&alg); - res = res || !quat_lideal_equals(&lideal,&cmp,&alg); - - if (res != 0){ - printf("Quaternion unit test lideal_make_primitive_then_create failed\n"); - } - quat_alg_finalize(&alg); - quat_alg_elem_finalize(&gen); - quat_alg_elem_finalize(&x); - quat_alg_coord_finalize(&prim); - quat_order_finalize(&order); - ibz_finalize(&n); - ibz_finalize(&cnt); - quat_left_ideal_finalize(&lideal); - quat_left_ideal_finalize(&cmp); - return(res); -} - -//void quat_lideal_random_2e(quat_left_ideal_t *lideal, const quat_order_t *order, const quat_alg_t *alg, int64_t e, unsigned char n); -int quat_test_lideal_random_2e(){ +// int quat_lideal_generator(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const quat_alg_t +// *alg) +int +quat_test_lideal_generator(void) +{ int res = 0; quat_alg_t alg; - quat_order_t order; - quat_left_ideal_t lideal; - quat_alg_init_set_ui(&alg, 103); - quat_order_init(&order); - quat_left_ideal_init(&lideal); - - ibz_set(&order.denom, 2); - ibz_set(&order.basis[0][0], 2); - ibz_set(&order.basis[1][1], 2); - ibz_set(&order.basis[1][2], 1); - ibz_set(&order.basis[2][2], 1); - ibz_set(&order.basis[3][3], 1); - ibz_set(&order.basis[0][3], 1); - - // Pretty much self-testing (thanks to embedded asserts) - res |= quat_lideal_random_2e(&lideal, &order, &alg, 100, 10) == 0; - - quat_alg_finalize(&alg); - quat_order_finalize(&order); - quat_left_ideal_finalize(&lideal); - - if (res != 0){ - printf("Quaternion unit test lideal_random_2e failed\n"); - } - return(res); -} - -//int quat_lideal_generator(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const quat_alg_t *alg, int bound) -int quat_test_lideal_generator(){ - int res = 0; - - quat_alg_t alg; - quat_order_t order; + quat_lattice_t order; quat_alg_elem_t gen; ibz_t N; quat_left_ideal_t lideal, lideal2; quat_alg_init_set_ui(&alg, 103); - quat_order_init(&order); + quat_lattice_init(&order); quat_alg_elem_init(&gen); ibz_init(&N); quat_left_ideal_init(&lideal); quat_left_ideal_init(&lideal2); - - ibz_set(&order.denom, 2); - ibz_set(&order.basis[0][0], 2); - ibz_set(&order.basis[1][1], 2); - ibz_set(&order.basis[1][2], 1); - ibz_set(&order.basis[2][2], 1); - ibz_set(&order.basis[3][3], 1); - ibz_set(&order.basis[0][3], 1); + quat_lattice_O0_set(&order); ibz_set(&gen.coord[0], 3); ibz_set(&gen.coord[1], 5); @@ -320,148 +290,47 @@ int quat_test_lideal_generator(){ ibz_set(&gen.coord[3], 11); ibz_set(&N, 17); - quat_lideal_create_from_primitive(&lideal, &gen, &N, &order, &alg); - + quat_lideal_create(&lideal, &gen, &N, &order, &alg); + // Try to regenerate the same ideal for (int i = 0; i <= 10; i++) { - res |= !quat_lideal_generator(&gen, &lideal, &alg,0); - quat_lideal_create_from_primitive(&lideal2, &gen, &N, &order, &alg); + res |= !quat_lideal_generator(&gen, &lideal, &alg); + quat_lideal_create(&lideal2, &gen, &N, &order, &alg); res |= !quat_lideal_equals(&lideal, &lideal2, &alg); } - + quat_alg_finalize(&alg); - quat_order_finalize(&order); + quat_lattice_finalize(&order); quat_alg_elem_finalize(&gen); ibz_finalize(&N); quat_left_ideal_finalize(&lideal); quat_left_ideal_finalize(&lideal2); - - if (res != 0){ + + if (res != 0) { printf("Quaternion unit test lideal_generator failed\n"); } - return(res); + return (res); } -//int quat_lideal_generator_coprime(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const ibz_t *n, const quat_alg_t *alg, int bound); -int quat_test_lideal_generator_coprime(){ +// void quat_lideal_mul(quat_left_ideal_t *product, const quat_left_ideal_t *lideal, const +// quat_alg_elem_t *alpha, const quat_alg_t *alg); +int +quat_test_lideal_mul(void) +{ int res = 0; quat_alg_t alg; - quat_order_t order, order2; - quat_alg_elem_t gen; - ibz_t N, M, gcd, norm_int, prod; - ibq_t norm; - quat_left_ideal_t lideal, lideal2; - quat_alg_init_set_ui(&alg, 103); - quat_order_init(&order); - quat_order_init(&order2); - quat_alg_elem_init(&gen); - ibz_init(&N); - ibz_init(&M); - ibz_init(&norm_int); - ibz_init(&prod); - ibz_init(&gcd); - ibq_init(&norm); - quat_left_ideal_init(&lideal); - quat_left_ideal_init(&lideal2); - - ibz_set(&order.denom, 2); - ibz_set(&order.basis[0][0], 2); - ibz_set(&order.basis[1][1], 2); - ibz_set(&order.basis[1][2], 1); - ibz_set(&order.basis[2][2], 1); - ibz_set(&order.basis[3][3], 1); - ibz_set(&order.basis[0][3], 1); - - ibz_set(&gen.coord[0], 3); - ibz_set(&gen.coord[1], 5); - ibz_set(&gen.coord[2], 7); - ibz_set(&gen.coord[3], 11); - ibz_set(&N, 5); - // product of primes < 50 - ibz_set(&M, 614889782588491410l); - - quat_lideal_create_from_primitive(&lideal, &gen, &N, &order, &alg); - - res |= !quat_lideal_generator_coprime(&gen, &lideal, &M, &alg,0); - quat_alg_norm(&norm, &gen, &alg); - res |= !ibq_to_ibz(&norm_int, &norm); - // case with coprimality - ibz_gcd(&gcd, &norm_int, &M); - res |= !ibz_is_one(&gcd); - // test other formula - ibz_mul(&prod,&M,&M); - ibz_gcd(&prod,&prod,&norm_int); - ibz_gcd(&gcd, &(lideal.norm), &M); - res |= ibz_cmp(&gcd,&prod); - - quat_lideal_create_from_primitive(&lideal2, &gen, &N, &order, &alg); - res |= !quat_lideal_equals(&lideal, &lideal2, &alg); - res |= !quat_alg_is_primitive(&gen,&(lideal.lattice), &alg); - - - - ibz_set(&(order.denom),1); - quat_alg_elem_set(&gen,1,2,4,2,6); - - quat_lideal_create_from_primitive(&lideal, &gen, &N, &order, &alg); - - ibz_set(&M,15); - res |= !quat_lideal_generator_coprime(&gen, &lideal, &M, &alg,0); - quat_alg_norm(&norm, &gen, &alg); - res |= !ibq_to_ibz(&norm_int, &norm); - // test other formula - ibz_mul(&prod,&M,&M); - ibz_gcd(&prod,&prod,&norm_int); - ibz_gcd(&gcd, &(lideal.norm), &M); - res |= ibz_cmp(&gcd,&prod); - - quat_lideal_create_from_primitive(&lideal2, &gen, &N, &order, &alg); - res |= !quat_lideal_equals(&lideal, &lideal2, &alg); - res |= !quat_alg_is_primitive(&gen,&(lideal.lattice), &alg); - - quat_alg_finalize(&alg); - quat_order_finalize(&order); - quat_order_finalize(&order2); - quat_alg_elem_finalize(&gen); - ibz_finalize(&N); - ibz_finalize(&M); - ibz_finalize(&norm_int); - ibz_finalize(&prod); - ibz_finalize(&gcd); - ibq_finalize(&norm); - quat_left_ideal_finalize(&lideal); - quat_left_ideal_finalize(&lideal2); - - if (res != 0){ - printf("Quaternion unit test lideal_generator_coprime failed\n"); - } - return(res); -} - -//int quat_lideal_mul(quat_left_ideal_t *product, const quat_left_ideal_t *lideal, const quat_alg_elem_t *alpha, const quat_alg_t *alg, int bound); -int quat_test_lideal_mul(){ - int res = 0; - - quat_alg_t alg; - quat_order_t order; + quat_lattice_t order; quat_alg_elem_t gen1, gen2, gen_prod; quat_left_ideal_t lideal, lideal2; quat_alg_init_set_ui(&alg, 103); - quat_order_init(&order); + quat_lattice_init(&order); quat_alg_elem_init(&gen1); quat_alg_elem_init(&gen2); quat_alg_elem_init(&gen_prod); quat_left_ideal_init(&lideal); quat_left_ideal_init(&lideal2); - - ibz_set(&order.denom, 2); - ibz_set(&order.basis[0][0], 2); - ibz_set(&order.basis[1][1], 2); - ibz_set(&order.basis[1][2], 1); - ibz_set(&order.basis[2][2], 1); - ibz_set(&order.basis[3][3], 1); - ibz_set(&order.basis[0][3], 1); + quat_lattice_O0_set(&order); ibz_set(&gen1.coord[0], 3); ibz_set(&gen1.coord[1], 5); @@ -474,46 +343,108 @@ int quat_test_lideal_mul(){ // Check that (O·gen1)·gen2 == O·(gen1·gen2) quat_lideal_create_principal(&lideal, &gen1, &order, &alg); - res |= !quat_lideal_mul(&lideal, &lideal, &gen2, &alg,0); + quat_lideal_mul(&lideal, &lideal, &gen2, &alg); quat_alg_mul(&gen_prod, &gen1, &gen2, &alg); quat_lideal_create_principal(&lideal2, &gen_prod, &order, &alg); res |= !quat_lideal_equals(&lideal, &lideal2, &alg); // Same test, but with non-integral gen2 - ibz_set(&(gen2.denom),2); + ibz_set(&(gen2.denom), 2); quat_lideal_create_principal(&lideal, &gen1, &order, &alg); - res |= !quat_lideal_mul(&lideal, &lideal, &gen2, &alg,0); + quat_lideal_mul(&lideal, &lideal, &gen2, &alg); quat_alg_mul(&gen_prod, &gen1, &gen2, &alg); quat_lideal_create_principal(&lideal2, &gen_prod, &order, &alg); res |= !quat_lideal_equals(&lideal, &lideal2, &alg); - + quat_alg_finalize(&alg); - quat_order_finalize(&order); + quat_lattice_finalize(&order); quat_alg_elem_finalize(&gen1); quat_alg_elem_finalize(&gen2); quat_alg_elem_finalize(&gen_prod); quat_left_ideal_finalize(&lideal); quat_left_ideal_finalize(&lideal2); - - if (res != 0){ + + if (res != 0) { printf("Quaternion unit test lideal_mul failed\n"); } - return(res); + return (res); } -//void quat_lideal_add(quat_left_ideal_t *sum, const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg); -//void quat_lideal_inter(quat_left_ideal_t *intersection, const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg); -//int quat_lideal_equals(const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg); -int quat_test_lideal_add_intersect_equals(){ +// void quat_lideal_conjugate_without_hnf(quat_left_ideal_t *conj, quat_lattice_t *new_parent_order, +// const quat_left_ideal_t *lideal, const quat_alg_t *alg); +int +quat_test_lideal_conj_without_hnf(void) +{ + int res = 0; + ibz_t n; + quat_lattice_t o, ro, rro, test, cmp; + quat_left_ideal_t lideal, conj; + quat_alg_elem_t gen; + quat_alg_t alg; + ibz_init(&n); + quat_alg_elem_init(&gen); + quat_lattice_init(&o); + quat_lattice_init(&ro); + quat_lattice_init(&rro); + quat_lattice_init(&test); + quat_left_ideal_init(&lideal); + quat_left_ideal_init(&conj); + quat_lattice_init(&cmp); + quat_alg_init_set_ui(&alg, 103); + ibz_set(&n, 25); + quat_alg_elem_set(&gen, 1, 2, 3, 0, 2); + quat_lattice_O0_set(&o); + quat_lideal_create(&lideal, &gen, &n, &o, &alg); + + quat_lideal_conjugate_without_hnf(&conj, &ro, &lideal, &alg); + quat_lattice_hnf(&(conj.lattice)); + quat_lattice_mul(&test, &(lideal.lattice), &(conj.lattice), &alg); + ibz_copy(&(cmp.denom), &(o.denom)); + ibz_mat_4x4_scalar_mul(&(cmp.basis), &n, &(o.basis)); + res = res || !quat_lattice_equal(&test, &cmp); + quat_lattice_mul(&test, &(conj.lattice), &(lideal.lattice), &alg); + ibz_copy(&(cmp.denom), &(ro.denom)); + ibz_mat_4x4_scalar_mul(&(cmp.basis), &n, &(ro.basis)); + res = res || !quat_lattice_equal(&test, &cmp); + quat_lideal_conjugate_without_hnf(&conj, &rro, &conj, &alg); + res = res || !quat_lattice_equal(&rro, &o); + conj.parent_order = &o; + quat_lattice_hnf(&(conj.lattice)); + res = res || !quat_lideal_equals(&conj, &lideal, &alg); + + if (res != 0) { + printf("Quaternion unit test lideal_conj_without_hnf failed\n"); + } + ibz_finalize(&n); + quat_alg_elem_finalize(&gen); + quat_lattice_finalize(&o); + quat_lattice_finalize(&ro); + quat_lattice_finalize(&rro); + quat_lattice_finalize(&test); + quat_lattice_finalize(&cmp); + quat_alg_finalize(&alg); + quat_left_ideal_finalize(&lideal); + quat_left_ideal_finalize(&conj); + return (res); +} + +// void quat_lideal_add(quat_left_ideal_t *sum, const quat_left_ideal_t *I1, const quat_left_ideal_t +// *I2, const quat_alg_t *alg); void quat_lideal_inter(quat_left_ideal_t *intersection, const +// quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg); int +// quat_lideal_equals(const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t +// *alg); +int +quat_test_lideal_add_intersect_equals(void) +{ int res = 0; quat_alg_t alg; - quat_order_t order; + quat_lattice_t order; quat_alg_elem_t gen1, gen2, gen3; ibz_t N1, N2, N3; quat_left_ideal_t lideal1, lideal2, lideal3, lideal4, lideal5; quat_alg_init_set_ui(&alg, 103); - quat_order_init(&order); + quat_lattice_init(&order); quat_alg_elem_init(&gen1); quat_alg_elem_init(&gen2); quat_alg_elem_init(&gen3); @@ -526,31 +457,25 @@ int quat_test_lideal_add_intersect_equals(){ quat_left_ideal_init(&lideal4); quat_left_ideal_init(&lideal5); - ibz_set(&order.denom, 2); - ibz_set(&order.basis[0][0], 2); - ibz_set(&order.basis[1][1], 2); - ibz_set(&order.basis[1][2], 1); - ibz_set(&order.basis[2][2], 1); - ibz_set(&order.basis[3][3], 1); - ibz_set(&order.basis[0][3], 1); + quat_lattice_O0_set(&order); ibz_set(&gen1.coord[0], 3); ibz_set(&gen1.coord[1], 5); ibz_set(&gen1.coord[2], 7); ibz_set(&gen1.coord[3], 11); ibz_set(&N1, 17); - quat_lideal_create_from_primitive(&lideal1, &gen1, &N1, &order, &alg); + quat_lideal_create(&lideal1, &gen1, &N1, &order, &alg); ibz_set(&gen2.coord[0], -2); ibz_set(&gen2.coord[1], 13); ibz_set(&gen2.coord[2], -17); ibz_set(&gen2.coord[3], 19); ibz_set(&N2, 43); - quat_lideal_create_from_primitive(&lideal2, &gen2, &N2, &order, &alg); + quat_lideal_create(&lideal2, &gen2, &N2, &order, &alg); quat_alg_mul(&gen3, &gen2, &gen1, &alg); quat_lideal_create_principal(&lideal3, &gen3, &order, &alg); - + // Union should be the whole ring quat_lideal_add(&lideal4, &lideal1, &lideal2, &alg); res |= !ibz_is_one(&lideal4.norm); @@ -559,7 +484,7 @@ int quat_test_lideal_add_intersect_equals(){ // Self-intersection should be stable quat_lideal_inter(&lideal4, &lideal1, &lideal1, &alg); res |= !quat_lideal_equals(&lideal4, &lideal1, &alg); - + // Self-union should be stable quat_lideal_add(&lideal4, &lideal1, &lideal1, &alg); res |= !quat_lideal_equals(&lideal4, &lideal1, &alg); @@ -582,10 +507,10 @@ int quat_test_lideal_add_intersect_equals(){ quat_lideal_add(&lideal5, &lideal2, &lideal3, &alg); quat_lideal_inter(&lideal5, &lideal1, &lideal5, &alg); res |= !quat_lideal_equals(&lideal4, &lideal5, &alg); - res |= ibz_cmp_si(&lideal4.norm, 17); - + res |= ibz_cmp_int32(&lideal4.norm, 17); + quat_alg_finalize(&alg); - quat_order_finalize(&order); + quat_lattice_finalize(&order); quat_alg_elem_finalize(&gen1); quat_alg_elem_finalize(&gen2); quat_alg_elem_finalize(&gen3); @@ -597,371 +522,403 @@ int quat_test_lideal_add_intersect_equals(){ quat_left_ideal_finalize(&lideal3); quat_left_ideal_finalize(&lideal4); quat_left_ideal_finalize(&lideal5); - - if (res != 0){ + + if (res != 0) { printf("Quaternion unit test lideal_add_intersect_equals failed\n"); } - return(res); + return (res); } -//int quat_lideal_isom(quat_alg_elem_t *iso, const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg); -int quat_test_lideal_isom(){ +// void quat_lideal_inverse_lattice_without_hnf(quat_lattice_t *inv, const quat_left_ideal_t +// *lideal, const quat_alg_t *alg); +int +quat_test_lideal_inverse_lattice_without_hnf(void) +{ int res = 0; - quat_left_ideal_t lideal1,lideal2,prod; + quat_left_ideal_t lideal; + quat_lattice_t inv, prod; ibz_t norm; - quat_alg_elem_t init_helper, isom; - quat_order_t order, order2; + quat_alg_elem_t init_helper; + quat_lattice_t order; + quat_alg_t alg; + ibz_init(&norm); + quat_left_ideal_init(&lideal); + quat_lattice_init(&inv); + quat_lattice_init(&prod); + quat_alg_init_set_ui(&alg, 19); + quat_lattice_init(&order); + quat_alg_elem_init(&init_helper); + + ibz_set(&(order.basis[0][0]), 4); + ibz_set(&(order.basis[0][1]), 0); + ibz_set(&(order.basis[0][2]), 2); + ibz_set(&(order.basis[0][3]), 2); + ibz_set(&(order.basis[1][0]), 0); + ibz_set(&(order.basis[1][1]), 8); + ibz_set(&(order.basis[1][2]), 4); + ibz_set(&(order.basis[1][3]), 3); + ibz_set(&(order.basis[2][0]), 0); + ibz_set(&(order.basis[2][1]), 0); + ibz_set(&(order.basis[2][2]), 2); + ibz_set(&(order.basis[2][3]), 0); + ibz_set(&(order.basis[3][0]), 0); + ibz_set(&(order.basis[3][1]), 0); + ibz_set(&(order.basis[3][2]), 0); + ibz_set(&(order.basis[3][3]), 1); + ibz_set(&(order.denom), 4); + quat_alg_elem_set(&init_helper, 1, 2, 3, 0, 1); + ibz_set(&norm, 15); + quat_lideal_create(&lideal, &init_helper, &norm, &order, &alg); + quat_lideal_inverse_lattice_without_hnf(&inv, &lideal, &alg); + quat_lattice_mul(&prod, &(lideal.lattice), &inv, &alg); + res = res || !quat_lattice_equal(&prod, &order); + + if (res != 0) { + printf("Quaternion unit test lideal_inverse_lattice_without_hnf failed\n"); + } + ibz_finalize(&norm); + quat_left_ideal_finalize(&lideal); + quat_lattice_finalize(&inv); + quat_lattice_finalize(&prod); + quat_alg_finalize(&alg); + quat_lattice_finalize(&order); + quat_alg_elem_finalize(&init_helper); + return (res); +} + +// void quat_lideal_right_transporter(quat_lattice_t *trans, const quat_left_ideal_t *lideal1, const +// quat_left_ideal_t *lideal2, const quat_alg_t *alg); +int +quat_test_lideal_right_transporter(void) +{ + int res = 0; + quat_left_ideal_t lideal1, lideal2; + quat_lattice_t trans, prod; + ibz_t norm; + quat_alg_elem_t init_helper; + quat_lattice_t order; quat_alg_t alg; ibz_init(&norm); quat_left_ideal_init(&lideal1); quat_left_ideal_init(&lideal2); - quat_left_ideal_init(&prod); - quat_alg_init_set_ui(&alg,19); - quat_order_init(&order); - quat_order_init(&order2); - quat_alg_elem_init(&isom); + quat_lattice_init(&trans); + quat_lattice_init(&prod); + quat_alg_init_set_ui(&alg, 19); + quat_lattice_init(&order); quat_alg_elem_init(&init_helper); - ibz_set(&(order.basis[0][0]),4); - ibz_set(&(order.basis[0][1]),0); - ibz_set(&(order.basis[0][2]),2); - ibz_set(&(order.basis[0][3]),2); - ibz_set(&(order.basis[1][0]),0); - ibz_set(&(order.basis[1][1]),8); - ibz_set(&(order.basis[1][2]),4); - ibz_set(&(order.basis[1][3]),3); - ibz_set(&(order.basis[2][0]),0); - ibz_set(&(order.basis[2][1]),0); - ibz_set(&(order.basis[2][2]),2); - ibz_set(&(order.basis[2][3]),0); - ibz_set(&(order.basis[3][0]),0); - ibz_set(&(order.basis[3][1]),0); - ibz_set(&(order.basis[3][2]),0); - ibz_set(&(order.basis[3][3]),1); - ibz_set(&(order.denom),4); - quat_alg_elem_set(&init_helper,1,2,6,2,1); - quat_lideal_create_principal(&lideal1,&init_helper,&order,&alg); - quat_alg_elem_set(&init_helper,3,1,6,5,1); - res |= !quat_lideal_mul(&lideal2,&lideal1,&init_helper,&alg,0); - res = res || !quat_lideal_isom(&isom,&lideal1,&lideal2,&alg); - if(!res){ - res |= !quat_lideal_mul(&prod,&lideal1,&isom,&alg,0); - res = res || !quat_lideal_equals(&prod,&lideal2,&alg); - } - - // not same order - ibz_set(&(order2.basis[0][0]),2); - ibz_set(&(order2.basis[0][1]),0); - ibz_set(&(order2.basis[0][2]),1); - ibz_set(&(order2.basis[0][3]),0); - ibz_set(&(order2.basis[1][0]),0); - ibz_set(&(order2.basis[1][1]),2); - ibz_set(&(order2.basis[1][2]),0); - ibz_set(&(order2.basis[1][3]),1); - ibz_set(&(order2.basis[2][0]),0); - ibz_set(&(order2.basis[2][1]),0); - ibz_set(&(order2.basis[2][2]),1); - ibz_set(&(order2.basis[2][3]),0); - ibz_set(&(order2.basis[3][0]),0); - ibz_set(&(order2.basis[3][1]),0); - ibz_set(&(order2.basis[3][2]),0); - ibz_set(&(order2.basis[3][3]),1); - ibz_set(&(order2.denom),2); - quat_alg_elem_set(&init_helper,1,2,6,2,1); - quat_lideal_create_principal(&lideal2,&init_helper,&order2,&alg); - res = res || quat_lideal_isom(&isom,&lideal1,&lideal2,&alg); - - // should add test for not isomorphic ideals - - if (res != 0){ - printf("Quaternion unit test lideal_isom failed\n"); + ibz_set(&(order.basis[0][0]), 4); + ibz_set(&(order.basis[0][1]), 0); + ibz_set(&(order.basis[0][2]), 2); + ibz_set(&(order.basis[0][3]), 2); + ibz_set(&(order.basis[1][0]), 0); + ibz_set(&(order.basis[1][1]), 8); + ibz_set(&(order.basis[1][2]), 4); + ibz_set(&(order.basis[1][3]), 3); + ibz_set(&(order.basis[2][0]), 0); + ibz_set(&(order.basis[2][1]), 0); + ibz_set(&(order.basis[2][2]), 2); + ibz_set(&(order.basis[2][3]), 0); + ibz_set(&(order.basis[3][0]), 0); + ibz_set(&(order.basis[3][1]), 0); + ibz_set(&(order.basis[3][2]), 0); + ibz_set(&(order.basis[3][3]), 1); + ibz_set(&(order.denom), 4); + quat_alg_elem_set(&init_helper, 1, 2, 3, 0, 1); + ibz_set(&norm, 15); + quat_lideal_create(&lideal1, &init_helper, &norm, &order, &alg); + quat_alg_elem_set(&init_helper, 1, 4, 3, 0, 1); + ibz_set(&norm, 11); + quat_lideal_create(&lideal2, &init_helper, &norm, &order, &alg); + quat_lideal_right_transporter(&trans, &lideal1, &lideal2, &alg); + quat_lattice_mul(&prod, &(lideal1.lattice), &trans, &alg); + res = res || !quat_lattice_inclusion(&prod, &(lideal2.lattice)); + quat_lideal_right_transporter(&trans, &lideal2, &lideal1, &alg); + quat_lattice_mul(&prod, &(lideal2.lattice), &trans, &alg); + res = res || !quat_lattice_inclusion(&prod, &(lideal1.lattice)); + quat_lideal_right_transporter(&(lideal1.lattice), &lideal2, &lideal1, &alg); + res = res || !quat_lattice_equal(&trans, &(lideal1.lattice)); + quat_alg_elem_set(&init_helper, 1, 2, 3, 0, 1); + ibz_set(&norm, 15); + quat_lideal_create(&lideal1, &init_helper, &norm, &order, &alg); + quat_lideal_right_transporter(&(lideal2.lattice), &lideal2, &lideal1, &alg); + res = res || !quat_lattice_equal(&trans, &(lideal2.lattice)); + if (res != 0) { + printf("Quaternion unit test lideal_right_transporter failed\n"); } + ibz_finalize(&norm); quat_left_ideal_finalize(&lideal1); quat_left_ideal_finalize(&lideal2); - quat_left_ideal_finalize(&prod); - ibz_finalize(&norm); + quat_lattice_finalize(&trans); + quat_lattice_finalize(&prod); quat_alg_finalize(&alg); - quat_order_finalize(&order); - quat_order_finalize(&order2); - quat_alg_elem_finalize(&isom); + quat_lattice_finalize(&order); quat_alg_elem_finalize(&init_helper); - return(res); + return (res); } -//void quat_lideal_right_order(quat_order_t *order, const quat_left_ideal_t *lideal, const quat_alg_t *alg); -int quat_test_lideal_right_order(){ +// void quat_lideal_right_order(quat_lattice_t *order, const quat_left_ideal_t *lideal, const +// quat_alg_t *alg); +int +quat_test_lideal_right_order(void) +{ int res = 0; ibz_t norm; quat_alg_t alg; quat_alg_elem_t gen; - quat_order_t order,rorder; + quat_lattice_t order, rorder; quat_lattice_t prod; quat_alg_elem_t test; - quat_left_ideal_t lideal, cmp; - quat_order_init(&order); - quat_order_init(&rorder); + quat_left_ideal_t lideal; + quat_lattice_init(&order); + quat_lattice_init(&rorder); quat_lattice_init(&prod); - quat_alg_init_set_ui(&alg,19); + quat_alg_init_set_ui(&alg, 19); quat_left_ideal_init(&lideal); quat_alg_elem_init(&test); quat_alg_elem_init(&gen); + ibz_init(&norm); - ibz_set(&(order.basis[0][0]),4); - ibz_set(&(order.basis[0][1]),0); - ibz_set(&(order.basis[0][2]),2); - ibz_set(&(order.basis[0][3]),2); - ibz_set(&(order.basis[1][0]),0); - ibz_set(&(order.basis[1][1]),8); - ibz_set(&(order.basis[1][2]),4); - ibz_set(&(order.basis[1][3]),3); - ibz_set(&(order.basis[2][0]),0); - ibz_set(&(order.basis[2][1]),0); - ibz_set(&(order.basis[2][2]),2); - ibz_set(&(order.basis[2][3]),0); - ibz_set(&(order.basis[3][0]),0); - ibz_set(&(order.basis[3][1]),0); - ibz_set(&(order.basis[3][2]),0); - ibz_set(&(order.basis[3][3]),1); - ibz_set(&(order.denom),4); - quat_alg_elem_set(&gen,1,2,1,8,-8); - quat_lideal_create_principal(&lideal,&gen,&order,&alg); + ibz_set(&(order.basis[0][0]), 4); + ibz_set(&(order.basis[0][1]), 0); + ibz_set(&(order.basis[0][2]), 2); + ibz_set(&(order.basis[0][3]), 2); + ibz_set(&(order.basis[1][0]), 0); + ibz_set(&(order.basis[1][1]), 8); + ibz_set(&(order.basis[1][2]), 4); + ibz_set(&(order.basis[1][3]), 3); + ibz_set(&(order.basis[2][0]), 0); + ibz_set(&(order.basis[2][1]), 0); + ibz_set(&(order.basis[2][2]), 2); + ibz_set(&(order.basis[2][3]), 0); + ibz_set(&(order.basis[3][0]), 0); + ibz_set(&(order.basis[3][1]), 0); + ibz_set(&(order.basis[3][2]), 0); + ibz_set(&(order.basis[3][3]), 1); + ibz_set(&(order.denom), 4); + quat_alg_elem_set(&gen, 1, 3, 3, 0, 1); + ibz_set(&norm, 15); + quat_lideal_create(&lideal, &gen, &norm, &order, &alg); - quat_lideal_right_order(&rorder,&lideal,&alg); + quat_lideal_right_order(&rorder, &lideal, &alg); // test order is in HNF res = res || !ibz_mat_4x4_is_hnf(&(rorder.basis)); // test order is of dimension 4 (assuming HNF) - for(int i = 0; i < 4; i++){ - quat_alg_elem_copy_ibz(&test,&(rorder.denom),&(rorder.basis[0][i]),&(rorder.basis[1][i]),&(rorder.basis[2][i]),&(rorder.basis[3][i])); - res = res || quat_alg_elem_is_zero(&test); + for (int i = 0; i < 4; i++) { + res = res || ibz_is_zero(&(rorder.basis[i][i])); } // test order contains 1 - quat_alg_elem_set(&test,1,1,0,0,0); - res = res || !quat_lattice_contains(NULL,&rorder,&test,&alg); + quat_alg_elem_set(&test, 1, 1, 0, 0, 0); + res = res || !quat_lattice_contains(NULL, &rorder, &test); + // test it is stable by product + quat_lattice_mul(&prod, &rorder, &rorder, &alg); + res = res || !quat_lattice_inclusion(&prod, &rorder); // test it is right order of ideal - quat_lattice_mul(&prod,&(lideal.lattice),&rorder,&alg); - for(int i = 0; i < 4; i++){ - quat_alg_elem_copy_ibz(&test,&(prod.denom),&(prod.basis[0][i]),&(prod.basis[1][i]),&(prod.basis[2][i]),&(prod.basis[3][i])); - res = res || !quat_lattice_contains(NULL,&(lideal.lattice),&test,&alg); - } + quat_lattice_mul(&prod, &(lideal.lattice), &rorder, &alg); + res = res || !quat_lattice_inclusion(&prod, &(lideal.lattice)); - ibz_set(&(order.basis[0][0]),2); - ibz_set(&(order.basis[0][1]),0); - ibz_set(&(order.basis[0][2]),1); - ibz_set(&(order.basis[0][3]),0); - ibz_set(&(order.basis[1][0]),0); - ibz_set(&(order.basis[1][1]),2); - ibz_set(&(order.basis[1][2]),0); - ibz_set(&(order.basis[1][3]),1); - ibz_set(&(order.basis[2][0]),0); - ibz_set(&(order.basis[2][1]),0); - ibz_set(&(order.basis[2][2]),1); - ibz_set(&(order.basis[2][3]),0); - ibz_set(&(order.basis[3][0]),0); - ibz_set(&(order.basis[3][1]),0); - ibz_set(&(order.basis[3][2]),0); - ibz_set(&(order.basis[3][3]),1); - ibz_set(&(order.denom),2); - quat_alg_elem_set(&gen,1,1,2,8,8); - quat_lideal_create_principal(&lideal,&gen,&order,&alg); + quat_lattice_O0_set(&order); - quat_lideal_right_order(&rorder,&lideal,&alg); - quat_lattice_mul(&prod,&(lideal.lattice),&rorder,&alg); + quat_alg_elem_set(&gen, 1, 1, 1, 1, 0); + ibz_set(&norm, 35); + quat_lideal_create(&lideal, &gen, &norm, &order, &alg); + + quat_lideal_right_order(&rorder, &lideal, &alg); + quat_lattice_mul(&prod, &(lideal.lattice), &rorder, &alg); // test order is in HNF res = res || !ibz_mat_4x4_is_hnf(&(rorder.basis)); // test order is of dimension 4 (assuming HNF) - for(int i = 0; i < 4; i++){ - quat_alg_elem_copy_ibz(&test,&(rorder.denom),&(rorder.basis[0][i]),&(rorder.basis[1][i]),&(rorder.basis[2][i]),&(rorder.basis[3][i])); - res = res || quat_alg_elem_is_zero(&test); + for (int i = 0; i < 4; i++) { + res = res || ibz_is_zero(&(rorder.basis[i][i])); } // test order contains 1 - quat_alg_elem_set(&test,1,1,0,0,0); - res = res || !quat_lattice_contains(NULL,&rorder,&test,&alg); + quat_alg_elem_set(&test, 1, 1, 0, 0, 0); + res = res || !quat_lattice_contains(NULL, &rorder, &test); + // test it is stable by product + quat_lattice_mul(&prod, &rorder, &rorder, &alg); + res = res || !quat_lattice_inclusion(&prod, &rorder); // test it is right order of ideal - quat_lattice_mul(&prod,&(lideal.lattice),&rorder,&alg); - for(int i = 0; i < 4; i++){ - quat_alg_elem_copy_ibz(&test,&(prod.denom),&(prod.basis[0][i]),&(prod.basis[1][i]),&(prod.basis[2][i]),&(prod.basis[3][i])); - res = res || !quat_lattice_contains(NULL,&(lideal.lattice),&test,&alg); - } + quat_lattice_mul(&prod, &(lideal.lattice), &rorder, &alg); + res = res || !quat_lattice_inclusion(&prod, &(lideal.lattice)); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test lideal_right_order failed\n"); } quat_alg_elem_finalize(&test); - quat_order_finalize(&order); - quat_order_finalize(&rorder); + quat_lattice_finalize(&order); + quat_lattice_finalize(&rorder); quat_lattice_finalize(&prod); quat_left_ideal_finalize(&lideal); quat_alg_finalize(&alg); quat_alg_elem_finalize(&gen); - return(res); + ibz_finalize(&norm); + return (res); } -//void quat_lideal_reduce_basis(ibz_mat_4x4_t *reduced, ibz_mat_4x4_t *gram, const quat_left_ideal_t *lideal, const quat_alg_t *alg); //replaces lideal_lll -int quat_test_lideal_reduce_basis(){ +/********************* Functions from quaternion_tools.c **********************/ + +// int quat_order_discriminant(ibz_t *disc, const quat_lattice_t *order, const quat_alg_t *alg); +int +quat_test_lideal_order_discriminant(void) +{ int res = 0; - ibz_mat_4x4_t red, gram, prod; - quat_left_ideal_t lideal; - quat_lattice_t test; + ibz_t disc; quat_alg_t alg; - quat_alg_elem_t init_helper; - quat_order_t order; - ibq_t coeff; - ibz_t num,denom; - ibz_init(&num); - ibz_init(&denom); - ibq_init(&coeff); - ibz_mat_4x4_init(&prod); - quat_lattice_init(&test); - quat_alg_elem_init(&init_helper); - quat_order_init(&order); - quat_alg_init_set_ui(&alg,19); - ibz_mat_4x4_init(&gram); - ibz_mat_4x4_init(&red); - quat_left_ideal_init(&lideal); + quat_lattice_t order; + ibz_init(&disc); + quat_lattice_init(&order); + quat_alg_init_set_ui(&alg, 43); + quat_lattice_O0_set(&order); + quat_order_discriminant(&disc, &order, &alg); + res = res | ibz_cmp(&(alg.p), &disc); + if (res != 0) { + printf("Quaternion unit test lideal_order_discriminant failed\n"); + } + ibz_finalize(&disc); + quat_lattice_finalize(&order); + quat_alg_finalize(&alg); + return (res); +} + +// int quat_order_is_maximal(const quat_lattice_t *order, const quat_alg_t *alg); +int +quat_test_lideal_order_is_maximal(void) +{ + int res = 0; + quat_alg_t alg; + quat_lattice_t order; + quat_lattice_init(&order); + quat_alg_init_set_ui(&alg, 43); + quat_lattice_O0_set(&order); + res = res | !quat_order_is_maximal(&order, &alg); ibz_mat_4x4_identity(&(order.basis)); - ibz_set(&(order.denom),2); - quat_alg_elem_set(&init_helper,1,1,2,8,8); - quat_lideal_create_principal(&lideal,&init_helper,&order,&alg); - quat_lattice_reduce_denom(&(lideal.lattice),&(lideal.lattice)); - quat_lideal_reduce_basis(&red,&gram,&lideal,&alg); - // test if red is lll-reduced, assuming he used coeff was at least 3/4 - ibz_set(&num,99); - ibz_set(&denom,100); - ibq_set(&coeff,&num,&denom); - res = res || !quat_dim4_lll_verify(&red,&coeff,&(alg.p)); - // test reduced and lideal generate same lattice - ibz_mat_4x4_copy(&(test.basis),&red); - ibz_copy(&(test.denom),&(lideal.lattice.denom)); - quat_lattice_hnf(&test); - res = res || !quat_lattice_equal(&(lideal.lattice),&test); - // test gram matrix is gram matrix - ibz_mat_4x4_transpose(&prod,&red); - ibz_mat_4x4_mul(&prod,&prod,&(alg.gram)); - ibz_mat_4x4_mul(&prod,&prod,&red); - res = res || !ibz_mat_4x4_equal(&prod,&gram); - if (res != 0){ - printf("Quaternion unit test lideal_reduce_basis failed\n"); + ibz_set(&(order.denom), 1); + res = res | quat_order_is_maximal(&order, &alg); + if (res != 0) { + printf("Quaternion unit test lideal__order_is_maximal failed\n"); } - ibz_finalize(&num); - ibz_finalize(&denom); - ibq_finalize(&coeff); - quat_lattice_finalize(&test); - quat_alg_elem_finalize(&init_helper); - ibz_mat_4x4_finalize(&prod); - quat_order_finalize(&order); + quat_lattice_finalize(&order); quat_alg_finalize(&alg); - ibz_mat_4x4_finalize(&gram); - ibz_mat_4x4_finalize(&red); - quat_left_ideal_finalize(&lideal); - return(res); + return (res); } -/***************************** Functions from quaternion_tools.c ***************************************/ - -//void quat_connecting_ideal(quat_left_ideal_t *connecting_ideal, const quat_order_t *O1, const quat_order_t *O2, const quat_alg_t *alg); -int quat_test_lideal_connecting_ideal(){ +// void quat_lideal_class_gram(ibz_mat_4x4_t *G, const quat_left_ideal_t *lideal, const quat_alg_t +// *alg); +int +quat_test_lideal_class_gram() +{ int res = 0; - ibz_t norm; + ibz_t norm, norm1, norm2, cmp; + ibz_mat_4x4_t gram, gram_l; + quat_left_ideal_t lideal; + quat_lattice_t order; + quat_alg_elem_t elem, elem1, elem2; + ibz_vec_4_t vec, vec1, vec2; quat_alg_t alg; - quat_alg_elem_t gen; - quat_order_t o1, o2; - quat_lattice_t prod; - quat_alg_elem_t test; - quat_left_ideal_t lideal, cmp; - quat_order_init(&o1); - quat_order_init(&o2); - quat_lattice_init(&prod); - quat_alg_init_set_ui(&alg,19); + ibz_init(&norm); + ibz_init(&norm1); + ibz_init(&norm2); + ibz_init(&cmp); + ibz_mat_4x4_init(&gram); + ibz_mat_4x4_init(&gram_l); + ibz_vec_4_init(&vec); + ibz_vec_4_init(&vec1); + ibz_vec_4_init(&vec2); quat_left_ideal_init(&lideal); - quat_alg_elem_init(&test); + quat_lattice_init(&order); + quat_alg_elem_init(&elem); + quat_alg_elem_init(&elem1); + quat_alg_elem_init(&elem2); + quat_alg_init_set_ui(&alg, 103); - ibz_set(&(o1.basis[0][0]),4); - ibz_set(&(o1.basis[0][1]),0); - ibz_set(&(o1.basis[0][2]),2); - ibz_set(&(o1.basis[0][3]),2); - ibz_set(&(o1.basis[1][0]),0); - ibz_set(&(o1.basis[1][1]),8); - ibz_set(&(o1.basis[1][2]),4); - ibz_set(&(o1.basis[1][3]),3); - ibz_set(&(o1.basis[2][0]),0); - ibz_set(&(o1.basis[2][1]),0); - ibz_set(&(o1.basis[2][2]),2); - ibz_set(&(o1.basis[2][3]),0); - ibz_set(&(o1.basis[3][0]),0); - ibz_set(&(o1.basis[3][1]),0); - ibz_set(&(o1.basis[3][2]),0); - ibz_set(&(o1.basis[3][3]),1); - ibz_set(&(o1.denom),4); + // setup + quat_lattice_O0_set(&order); + ibz_set(&cmp, 101); + quat_alg_elem_set(&elem, 1, 9, 4, 1, 1); + quat_lideal_create(&lideal, &elem, &cmp, &order, &alg); - ibz_set(&(o2.basis[0][0]),2); - ibz_set(&(o2.basis[0][1]),0); - ibz_set(&(o2.basis[0][2]),1); - ibz_set(&(o2.basis[0][3]),0); - ibz_set(&(o2.basis[1][0]),0); - ibz_set(&(o2.basis[1][1]),2); - ibz_set(&(o2.basis[1][2]),0); - ibz_set(&(o2.basis[1][3]),1); - ibz_set(&(o2.basis[2][0]),0); - ibz_set(&(o2.basis[2][1]),0); - ibz_set(&(o2.basis[2][2]),1); - ibz_set(&(o2.basis[2][3]),0); - ibz_set(&(o2.basis[3][0]),0); - ibz_set(&(o2.basis[3][1]),0); - ibz_set(&(o2.basis[3][2]),0); - ibz_set(&(o2.basis[3][3]),1); - ibz_set(&(o2.denom),2); + // test relation to lattice_gram output + quat_lideal_class_gram(&gram, &lideal, &alg); + ibz_mul(&cmp, &(lideal.lattice.denom), &(lideal.lattice.denom)); + ibz_mul(&cmp, &cmp, &(lideal.norm)); + ibz_mat_4x4_scalar_mul(&gram, &cmp, &gram); + quat_lattice_gram(&gram_l, &(lideal.lattice), &alg); + res = res | !ibz_mat_4x4_equal(&gram, &gram_l); - quat_connecting_ideal(&lideal,&o1,&o2,&alg); - quat_lattice_mul(&prod,&o1,&(lideal.lattice),&alg); - for(int i = 0; i < 4; i++){ - quat_alg_elem_copy_ibz(&test,&(prod.denom),&(prod.basis[0][i]),&(prod.basis[1][i]),&(prod.basis[2][i]),&(prod.basis[3][i])); - res = res || !quat_lattice_contains(NULL,&(lideal.lattice),&test,&alg); - } - quat_lattice_mul(&prod,&(lideal.lattice),&o2,&alg); - for(int i = 0; i < 4; i++){ - quat_alg_elem_copy_ibz(&test,&(prod.denom),&(prod.basis[0][i]),&(prod.basis[1][i]),&(prod.basis[2][i]),&(prod.basis[3][i])); - res = res || !quat_lattice_contains(NULL,&(lideal.lattice),&test,&alg); - } + // repeat lattice_gram test + quat_alg_elem_set(&elem1, 2, 360, 149, 1, 0); + quat_alg_elem_set(&elem2, 2, 53, 360, 0, 1); + int ok = quat_lattice_contains(&vec1, &(lideal.lattice), &elem1); + ok = ok && quat_lattice_contains(&vec2, &(lideal.lattice), &elem2); + assert(ok); + quat_alg_conj(&elem2, &elem2); + quat_alg_mul(&elem1, &elem1, &elem2, &alg); + ibz_mul(&norm1, &(elem1.coord[0]), &ibz_const_two); + ibz_div(&norm1, &cmp, &norm1, &(elem1.denom)); - quat_connecting_ideal(&lideal,&o2,&o2,&alg); - quat_lattice_mul(&prod,&o2,&(lideal.lattice),&alg); - for(int i = 0; i < 4; i++){ - quat_alg_elem_copy_ibz(&test,&(prod.denom),&(prod.basis[0][i]),&(prod.basis[1][i]),&(prod.basis[2][i]),&(prod.basis[3][i])); - res = res || !quat_lattice_contains(NULL,&(lideal.lattice),&test,&alg); - } - quat_lattice_mul(&prod,&(lideal.lattice),&o2,&alg); - for(int i = 0; i < 4; i++){ - quat_alg_elem_copy_ibz(&test,&(prod.denom),&(prod.basis[0][i]),&(prod.basis[1][i]),&(prod.basis[2][i]),&(prod.basis[3][i])); - res = res || !quat_lattice_contains(NULL,&(lideal.lattice),&test,&alg); + ibz_mat_4x4_eval(&vec1, &gram, &vec1); + ibz_set(&norm2, 0); + for (int i = 0; i < 4; i++) { + ibz_mul(&cmp, &(vec1[i]), &(vec2[i])); + ibz_add(&norm2, &norm2, &cmp); } + ibz_div(&norm2, &cmp, &norm2, &(lideal.lattice.denom)); + ibz_div(&norm2, &cmp, &norm2, &(lideal.lattice.denom)); - if (res != 0){ - printf("Quaternion unit test lideal_connecting_ideal failed\n"); + res = res | !(0 == ibz_cmp(&norm1, &norm2)); + + // test for norm + quat_lideal_class_gram(&gram, &lideal, &alg); + quat_lattice_contains(&vec, &(lideal.lattice), &elem); + quat_alg_norm(&norm, &cmp, &elem, &alg); + assert(ibz_is_one(&cmp)); + ibz_mul(&norm, &norm, &ibz_const_two); + ibz_div(&norm, &cmp, &norm, &(lideal.norm)); + + assert(ibz_is_zero(&cmp)); + quat_qf_eval(&cmp, &gram, &vec); + res = res | !(0 == ibz_cmp(&cmp, &norm)); + + if (res != 0) { + printf("Quaternion unit test lideal_class_gram failed\n"); } - quat_alg_elem_finalize(&test); - quat_order_finalize(&o1); - quat_order_finalize(&o2); - quat_lattice_finalize(&prod); + ibz_finalize(&norm); + ibz_finalize(&norm1); + ibz_finalize(&norm2); + ibz_finalize(&cmp); + ibz_mat_4x4_finalize(&gram); + ibz_mat_4x4_finalize(&gram_l); + ibz_vec_4_finalize(&vec); + ibz_vec_4_finalize(&vec1); + ibz_vec_4_finalize(&vec2); quat_left_ideal_finalize(&lideal); + quat_lattice_finalize(&order); + quat_alg_elem_finalize(&elem); + quat_alg_elem_finalize(&elem1); + quat_alg_elem_finalize(&elem2); quat_alg_finalize(&alg); - return(res); + return (res); } // run all previous tests -int quat_test_lideal(){ +int +quat_test_lideal(void) +{ int res = 0; printf("\nRunning quaternion tests of ideal and order functions\n"); + res = res | quat_test_lideal_norm(); + res = res | quat_test_lideal_copy(); res = res | quat_test_lideal_create_principal(); res = res | quat_test_lideal_create_from_primitive(); - res = res | quat_test_lideal_make_primitive_then_create(); - res = res | quat_test_lideal_random_2e(); res = res | quat_test_lideal_generator(); - res = res | quat_test_lideal_generator_coprime(); res = res | quat_test_lideal_mul(); + res = res | quat_test_lideal_conj_without_hnf(); res = res | quat_test_lideal_add_intersect_equals(); - res = res | quat_test_lideal_isom(); + res = res | quat_test_lideal_inverse_lattice_without_hnf(); + res = res | quat_test_lideal_right_transporter(); res = res | quat_test_lideal_right_order(); - res = res | quat_test_lideal_reduce_basis(); - res = res | quat_test_lideal_connecting_ideal(); - return(res); + res = res | quat_test_lideal_order_discriminant(); + res = res | quat_test_lideal_order_is_maximal(); + res = res | quat_test_lideal_class_gram(); + return (res); } diff --git a/src/quaternion/ref/generic/test/intbig.c b/src/quaternion/ref/generic/test/intbig.c new file mode 100644 index 0000000..2a91d2a --- /dev/null +++ b/src/quaternion/ref/generic/test/intbig.c @@ -0,0 +1,977 @@ +#include +#include +#include +#include +#include "intbig_internal.h" + +// void ibz_init(ibz_t *x); +// void ibz_finalize(ibz_t *x); +// int ibz_cmp(const ibz_t *a, const ibz_t *b); +// int ibz_is_zero(const ibz_t *x); +// int ibz_is_one(const ibz_t *x); +// int ibz_cmp_int32(const ibz_t *x, int32_t y); +// int ibz_is_even(const ibz_t *x); +// int ibz_is_odd(const ibz_t *x); +// void ibz_set(ibz_t *i, int32_t x); +// void ibz_copy(ibz_t *target, const ibz_t *value); +// void ibz_swap(ibz_t *a, ibz_t *b); +// int32_t ibz_get(const ibz_t *i); +// int ibz_bitsize(const ibz_t *a); +int +ibz_test_init_set_cmp() +{ + int res = 0; + ibz_t a, b, c; + ibz_init(&a); + ibz_init(&b); + ibz_init(&c); + + res = res | !ibz_is_zero(&a); + ibz_set(&a, 1); + res = res | !ibz_is_one(&a); + res = res | ibz_is_zero(&a); + res = res | (0 != ibz_cmp(&b, &c)); + res = res | (0 == ibz_cmp(&a, &c)); + res = res | ibz_is_even(&a); + res = res | !ibz_is_odd(&a); + res = res | !ibz_is_even(&b); + res = res | ibz_is_odd(&b); + ibz_copy(&b, &a); + res = res | !ibz_is_one(&a); + res = res | !ibz_is_one(&b); + res = res | (0 != ibz_cmp(&a, &b)); + res = res | (0 == ibz_cmp(&c, &b)); + ibz_swap(&b, &c); + res = res | (0 == ibz_cmp(&a, &b)); + res = res | (0 == ibz_cmp(&c, &b)); + res = res | (0 != ibz_cmp(&a, &c)); + res = res | (ibz_bitsize(&a) != 1); + res = res | (ibz_get(&a) != 1); + res = res | (ibz_cmp_int32(&a, 1) != 0); + res = res | (ibz_bitsize(&b) > 1); + res = res | (ibz_get(&b) != 0); + res = res | (ibz_cmp_int32(&b, 0) != 0); + + ibz_set(&a, -1); + res = res | !(ibz_cmp(&a, &b) < 0); + res = res | !(ibz_cmp(&b, &c) < 0); + res = res | !(ibz_cmp(&b, &a) > 0); + res = res | !(ibz_cmp(&c, &b) > 0); + ibz_copy(&b, &a); + res = res | (0 != ibz_cmp(&a, &b)); + res = res | (0 == ibz_cmp(&c, &b)); + ibz_swap(&b, &c); + res = res | (0 == ibz_cmp(&a, &b)); + res = res | (0 != ibz_cmp(&c, &a)); + + ibz_set_from_str(&a, "-10000000000000000011111100000001", 10); + res = res | !(ibz_cmp(&a, &b) < 0); + res = res | !(ibz_cmp(&b, &a) > 0); + ibz_copy(&b, &a); + res = res | (0 != ibz_cmp(&a, &b)); + res = res | (0 == ibz_cmp(&c, &b)); + ibz_swap(&b, &c); + res = res | (0 == ibz_cmp(&a, &b)); + res = res | (0 != ibz_cmp(&c, &a)); + + ibz_set_from_str(&a, "1aaaa00000000000000000123", 16); + res = res | !(ibz_cmp(&a, &c) > 0); + res = res | !(ibz_cmp(&c, &a) < 0); + res = res | (ibz_bitsize(&a) != 4 * 24 + 1); + res = res | (ibz_get(&a) != 16 * 18 + 3); + if (res) { + printf("Quaternion module integer group test ibz_test_init_set_cmp failed\n"); + } + + ibz_set_from_str(&a, "deadbeef12345678", 16); + res = res | (ibz_get(&a) != 0x12345678); + + // Test INT32_MAX and INT32_MIN + ibz_set_from_str(&a, "-2147483648", 10); + ibz_set(&b, INT32_MIN); + res = res | (ibz_get(&a) != -2147483648); + res = res | (ibz_cmp_int32(&a, -2147483648) != 0); + res = res | (0 != ibz_cmp(&a, &b)); + ibz_set_from_str(&a, "2147483647", 10); + ibz_set(&b, INT32_MAX); + res = res | (ibz_get(&a) != 2147483647); + res = res | (ibz_cmp_int32(&a, 2147483647) != 0); + res = res | (0 != ibz_cmp(&a, &b)); + + ibz_finalize(&a); + ibz_finalize(&b); + ibz_finalize(&c); + return (res); +} + +// void ibz_add(ibz_t *sum, const ibz_t *a, const ibz_t *b); +// void ibz_sub(ibz_t *diff, const ibz_t *a, const ibz_t *b); +// void ibz_neg(ibz_t *neg, const ibz_t *a); +// void ibz_abs(ibz_t *abs, const ibz_t *a); +int +ibz_test_add_sub_neg_abs() +{ + int res = 0; + ibz_t a, b, c, d, r, q, m; + ibz_init(&a); + ibz_init(&b); + ibz_init(&c); + ibz_init(&d); + ibz_init(&r); + ibz_init(&q); + ibz_init(&m); + + ibz_set_from_str(&a, "10000111100002222", 16); + ibz_copy(&c, &a); + ibz_add(&d, &a, &b); + res = res | (0 != ibz_cmp(&b, &q)); + res = res | (0 != ibz_cmp(&a, &c)); + res = res | (0 != ibz_cmp(&d, &c)); + ibz_add(&d, &b, &a); + res = res | (0 != ibz_cmp(&b, &q)); + res = res | (0 != ibz_cmp(&a, &c)); + res = res | (0 != ibz_cmp(&d, &c)); + // add test for adding non-0, sub, mul, ... + ibz_set_from_str(&b, "20000111100002223", 16); + ibz_set_from_str(&c, "30000222200004445", 16); + ibz_add(&d, &a, &b); + res = res | (0 != ibz_cmp(&d, &c)); + ibz_neg(&m, &a); + ibz_add(&q, &m, &d); + res = res | (0 != ibz_cmp(&q, &b)); + ibz_neg(&m, &m); + res = res | (0 != ibz_cmp(&m, &a)); + ibz_add(&q, &m, &b); + res = res | (0 != ibz_cmp(&q, &c)); + ibz_neg(&m, &m); + ibz_sub(&q, &b, &m); + res = res | (0 != ibz_cmp(&q, &c)); + ibz_neg(&m, &m); + res = res | (0 != ibz_cmp(&a, &m)); + ibz_sub(&q, &d, &a); + res = res | (0 != ibz_cmp(&q, &b)); + ibz_neg(&d, &d); + ibz_neg(&m, &a); + ibz_neg(&c, &b); + ibz_sub(&q, &d, &m); + res = res | (0 != ibz_cmp(&q, &c)); + ibz_sub(&q, &m, &b); + res = res | (0 != ibz_cmp(&q, &d)); + ibz_abs(&r, &r); + res = res | !ibz_is_zero(&r); + ibz_abs(&r, &a); + res = res | (0 != ibz_cmp(&a, &r)); + ibz_abs(&r, &m); + res = res | (0 != ibz_cmp(&a, &r)); + ibz_neg(&m, &m); + res = res | (0 != ibz_cmp(&a, &m)); + + if (res) { + printf("Quaternion module integer group test ibz_test_add_sub_neg_abs failed\n"); + } + ibz_finalize(&a); + ibz_finalize(&b); + ibz_finalize(&c); + ibz_finalize(&d); + ibz_finalize(&r); + ibz_finalize(&q); + ibz_finalize(&m); + return (res); +} + +// void ibz_mul(ibz_t *prod, const ibz_t *a, const ibz_t *b); +// void ibz_sqrt_floor(ibz_t *sqrt, const ibz_t *a); +int +ibz_test_mul_sqrt() +{ + int res = 0; + ibz_t a, b, c, d, r, q, m; + ibz_init(&a); + ibz_init(&b); + ibz_init(&c); + ibz_init(&d); + ibz_init(&r); + ibz_init(&q); + ibz_init(&m); + + // zero + ibz_set_from_str(&a, "2113309833171849999003363", 10); + ibz_copy(&c, &a); + ibz_set(&b, 0); + ibz_mul(&m, &a, &b); + res = res | (0 != ibz_cmp(&m, &b)); + res = res | (0 != ibz_cmp(&a, &c)); + ibz_mul(&m, &b, &a); + res = res | (0 != ibz_cmp(&m, &b)); + res = res | (0 != ibz_cmp(&a, &c)); + // one + ibz_set(&b, 1); + ibz_mul(&m, &a, &b); + res = res | (0 != ibz_cmp(&m, &a)); + res = res | (0 != ibz_cmp(&a, &c)); + ibz_mul(&m, &b, &a); + res = res | (0 != ibz_cmp(&m, &a)); + res = res | (0 != ibz_cmp(&a, &c)); + // -1 + ibz_neg(&b, &b); + ibz_neg(&d, &a); + ibz_mul(&m, &a, &b); + res = res | (0 != ibz_cmp(&m, &d)); + res = res | (0 != ibz_cmp(&a, &c)); + ibz_mul(&m, &b, &a); + res = res | (0 != ibz_cmp(&m, &d)); + res = res | (0 != ibz_cmp(&a, &c)); + // larger + ibz_set_from_str(&b, "34575345632322576567896", 10); + ibz_set_from_str(&c, "73068417910102676801285574959599851857101834248", 10); + ibz_mul(&m, &a, &b); + res = res | (0 != ibz_cmp(&m, &c)); + ibz_neg(&b, &b); + ibz_neg(&a, &a); + ibz_mul(&m, &a, &b); + res = res | (0 != ibz_cmp(&m, &c)); + ibz_neg(&a, &a); + ibz_neg(&c, &c); + ibz_mul(&m, &a, &b); + res = res | (0 != ibz_cmp(&m, &c)); + ibz_neg(&b, &b); + ibz_neg(&a, &a); + ibz_mul(&m, &a, &b); + res = res | (0 != ibz_cmp(&m, &c)); + + // sqrt tests + ibz_abs(&b, &b); + ibz_abs(&a, &a); + ibz_mul(&m, &a, &a); + ibz_sqrt_floor(&d, &m); + res = res | (0 != ibz_cmp(&d, &a)); + ibz_mul(&m, &b, &b); + ibz_sqrt_floor(&d, &m); + res = res | (0 != ibz_cmp(&d, &b)); + ibz_set(&d, 1); + ibz_mul(&m, &b, &b); + ibz_sub(&m, &m, &d); + ibz_sub(&c, &b, &d); + ibz_sqrt_floor(&d, &m); + res = res | (0 != ibz_cmp(&d, &c)); + + if (res) { + printf("Quaternion module integer group test ibz_test_mul_sqrt failed\n"); + } + ibz_finalize(&a); + ibz_finalize(&b); + ibz_finalize(&c); + ibz_finalize(&d); + ibz_finalize(&r); + ibz_finalize(&q); + ibz_finalize(&m); + return (res); +} + +// void ibz_div(ibz_t *quotient, ibz_t *remainder, const ibz_t *a, const ibz_t *b); +// int ibz_divides(const ibz_t *a, const ibz_t *b); +int +ibz_test_div() +{ + int res = 0; + ibz_t a, b, c, d, r, q, m; + ibz_init(&a); + ibz_init(&b); + ibz_init(&c); + ibz_init(&d); + ibz_init(&r); + ibz_init(&q); + ibz_init(&m); + + // one + ibz_set_from_str(&a, "2113309833171849999003363", 10); + ibz_copy(&c, &a); + ibz_set(&b, 1); + ibz_copy(&d, &b); + res = res | !ibz_divides(&a, &b); + ibz_div(&q, &r, &a, &b); + res = res | !ibz_is_zero(&r); + res = res | (0 != ibz_cmp(&q, &a)); + res = res | (0 != ibz_cmp(&c, &a)); + res = res | (0 != ibz_cmp(&b, &d)); + // not one, zero remainder + ibz_set_from_str(&b, "15678200126527887351125", 10); + ibz_mul(&d, &a, &b); + ibz_copy(&c, &d); + res = res | !ibz_divides(&d, &b); + res = res | !ibz_divides(&d, &a); + res = res | !ibz_divides(&d, &d); + ibz_div(&q, &r, &d, &b); + res = res | !ibz_is_zero(&r); + res = res | (0 != ibz_cmp(&q, &a)); + ibz_div(&q, &r, &d, &a); + res = res | !ibz_is_zero(&r); + res = res | (0 != ibz_cmp(&q, &b)); + // flipping signs + ibz_neg(&a, &a); + ibz_neg(&b, &b); + ibz_div(&q, &r, &d, &b); + res = res | !ibz_is_zero(&r); + res = res | (0 != ibz_cmp(&q, &a)); + ibz_div(&q, &r, &d, &a); + res = res | !ibz_is_zero(&r); + res = res | (0 != ibz_cmp(&q, &b)); + ibz_neg(&a, &a); + ibz_neg(&d, &d); + ibz_div(&q, &r, &d, &b); + res = res | !ibz_is_zero(&r); + res = res | (0 != ibz_cmp(&q, &a)); + ibz_div(&q, &r, &d, &a); + res = res | !ibz_is_zero(&r); + res = res | (0 != ibz_cmp(&q, &b)); + ibz_neg(&a, &a); + ibz_neg(&b, &b); + ibz_div(&q, &r, &d, &b); + res = res | !ibz_is_zero(&r); + res = res | (0 != ibz_cmp(&q, &a)); + ibz_div(&q, &r, &d, &a); + res = res | !ibz_is_zero(&r); + res = res | (0 != ibz_cmp(&q, &b)); + // non-zero remainder + ibz_neg(&a, &a); + ibz_neg(&d, &d); + ibz_set_from_str(&c, "8678205677345432110000", 10); + ibz_add(&d, &d, &c); + ibz_div(&q, &r, &d, &b); + ibz_mul(&m, &q, &b); + ibz_add(&m, &m, &r); + res = res | (0 != ibz_cmp(&d, &m)); + ibz_abs(&m, &r); + ibz_abs(&q, &b); + res = res | (0 <= ibz_cmp(&m, &q)); + ibz_set(&q, 0); + res = + res | !(((ibz_cmp(&q, &r) <= 0) && (ibz_cmp(&q, &d) < 0)) || ((ibz_cmp(&q, &r) >= 0) && (ibz_cmp(&r, &d) > 0))); + // flip signs + ibz_neg(&d, &d); + ibz_div(&q, &r, &d, &b); + ibz_mul(&m, &q, &b); + ibz_add(&m, &m, &r); + res = res | (0 != ibz_cmp(&d, &m)); + ibz_abs(&m, &r); + ibz_abs(&q, &b); + res = res | (0 <= ibz_cmp(&m, &q)); + ibz_set(&q, 0); + res = + res | !(((ibz_cmp(&q, &r) <= 0) && (ibz_cmp(&q, &d) < 0)) || ((ibz_cmp(&q, &r) >= 0) && (ibz_cmp(&r, &d) > 0))); + ibz_neg(&b, &b); + ibz_div(&q, &r, &d, &b); + ibz_mul(&m, &q, &b); + ibz_add(&m, &m, &r); + res = res | (0 != ibz_cmp(&d, &m)); + ibz_abs(&m, &r); + ibz_abs(&q, &b); + res = res | (0 <= ibz_cmp(&m, &q)); + ibz_set(&q, 0); + res = + res | !(((ibz_cmp(&q, &r) <= 0) && (ibz_cmp(&q, &d) < 0)) || ((ibz_cmp(&q, &r) >= 0) && (ibz_cmp(&r, &d) > 0))); + ibz_neg(&d, &d); + ibz_div(&q, &r, &d, &b); + ibz_mul(&m, &q, &b); + ibz_add(&m, &m, &r); + res = res | (0 != ibz_cmp(&d, &m)); + ibz_abs(&m, &r); + ibz_abs(&q, &b); + res = res | (0 <= ibz_cmp(&m, &q)); + ibz_set(&q, 0); + res = + res | !(((ibz_cmp(&q, &r) <= 0) && (ibz_cmp(&q, &d) < 0)) || ((ibz_cmp(&q, &r) >= 0) && (ibz_cmp(&r, &d) > 0))); + + if (res) { + printf("Quaternion module integer group test ibz_test_div failed\n"); + } + ibz_finalize(&a); + ibz_finalize(&b); + ibz_finalize(&c); + ibz_finalize(&d); + ibz_finalize(&r); + ibz_finalize(&q); + ibz_finalize(&m); + return (res); +} + +// void ibz_mod(ibz_t *r, const ibz_t *a, const ibz_t *b); +// unsigned long int ibz_mod_ui(const mpz_t *n, unsigned long int d); +int +ibz_test_mod() +{ + int res = 0; + ibz_t a, b, c, r, m; + ibz_init(&a); + ibz_init(&b); + ibz_init(&c); + ibz_init(&r); + ibz_init(&m); + + ibz_set_from_str(&a, "2113309833171849999003363", 10); + res = res | (ibz_mod_ui(&a, 3) != 0); + res = res | (ibz_mod_ui(&a, 2) != 1); + ibz_set_from_str(&m, "2113309833171840000000000", 10); + ibz_mod(&r, &a, &m); + ibz_add(&c, &r, &m); + res = res | (0 != ibz_cmp(&c, &a)); + ibz_neg(&b, &a); + res = res | (ibz_mod_ui(&b, 3) != 0); + res = res | (ibz_mod_ui(&b, 2) != 1); + ibz_mod(&r, &b, &m); + ibz_sub(&c, &r, &m); + ibz_sub(&c, &c, &m); + res = res | (0 != ibz_cmp(&c, &b)); + + if (res) { + printf("Quaternion module integer group test ibz_test_mod failed\n"); + } + ibz_finalize(&a); + ibz_finalize(&b); + ibz_finalize(&c); + ibz_finalize(&r); + ibz_finalize(&m); + return (res); +} + +// void ibz_pow(ibz_t *pow, const ibz_t *x, uint32_t e); +// void ibz_pow_mod(ibz_t *pow, const ibz_t *x, const ibz_t *e, const ibz_t *m); +// void ibz_div_2exp(ibz_t *quotient, const ibz_t *a, uint32_t exp); +int +ibz_test_pow() +{ + int res = 0; + ibz_t a, b, c, d, e, m; + ibz_init(&a); + ibz_init(&b); + ibz_init(&c); + ibz_init(&d); + ibz_init(&e); + ibz_init(&m); + + ibz_set_from_str(&a, "aaaaaaaabbbbbbbb2222221111", 16); + ibz_copy(&c, &a); + int exp = 10; + ibz_set(&b, 1); + for (int i = 1; i < exp + 1; i++) + ibz_mul(&b, &b, &a); + ibz_pow(&d, &a, exp); + res = res | (0 != ibz_cmp(&c, &a)); + res = res | (0 != ibz_cmp(&d, &b)); + ibz_neg(&a, &a); + ibz_copy(&c, &a); + ibz_pow(&d, &a, exp); + res = res | (0 != ibz_cmp(&c, &a)); + res = res | (0 != ibz_cmp(&d, &b)); + exp = 9; + ibz_set(&b, 1); + for (int i = 1; i < exp + 1; i++) + ibz_mul(&b, &b, &a); + ibz_pow(&d, &a, exp); + res = res | (0 != ibz_cmp(&c, &a)); + res = res | (0 != ibz_cmp(&d, &b)); + + ibz_set_from_str(&a, "aaaaaaaabbbbbbbb2222221111", 16); + ibz_set_from_str(&m, "cdabde24864122912341", 16); + exp = 10; + ibz_set(&m, exp); + ibz_copy(&c, &a); + ibz_set(&b, 1); + for (int i = 1; i < exp + 1; i++) { + ibz_mul(&b, &b, &a); + ibz_mod(&b, &b, &m); + } + ibz_pow_mod(&d, &a, &e, &m); + res = res | (0 != ibz_cmp(&c, &a)); + res = res | (0 != ibz_cmp(&d, &b)); + + exp = 23; + ibz_set(&b, 2); + ibz_pow(&b, &b, exp); + ibz_div(&m, &b, &a, &b); + ibz_div_2exp(&d, &a, exp); + res = res | (0 != ibz_cmp(&c, &a)); + res = res | (0 != ibz_cmp(&m, &d)); + + if (res) { + printf("Quaternion module integer group test ibz_test_pow failed\n"); + } + ibz_finalize(&a); + ibz_finalize(&b); + ibz_finalize(&c); + ibz_finalize(&d); + ibz_finalize(&e); + ibz_finalize(&m); + return (res); +} + +// void ibz_gcd(ibz_t *gcd, const ibz_t *a, const ibz_t *b); +// int ibz_invmod(ibz_t *inv, const ibz_t *a, const ibz_t *mod);ibz_test_mod() +int +ibz_test_gcd() +{ + int res = 0; + ibz_t a, b, c, d, ac, bc, m; + ibz_init(&a); + ibz_init(&b); + ibz_init(&c); + ibz_init(&d); + ibz_init(&ac); + ibz_init(&bc); + ibz_init(&m); + + // fixed large test + ibz_set_from_str(&c, "25791357069084", 10); + ibz_set_from_str(&a, "6173271838293993987767", 10); + ibz_set_from_str(&b, "89882267321617266071838286", 10); + ibz_mul(&ac, &a, &c); + ibz_mul(&bc, &b, &c); + ibz_gcd(&d, &ac, &bc); + res = res | (0 != ibz_cmp(&c, &d)); + ibz_mul(&m, &a, &c); + res = res | (0 != ibz_cmp(&ac, &m)); + ibz_mul(&m, &b, &c); + res = res | (0 != ibz_cmp(&bc, &m)); + // gcd is positif whatever the inputs are + ibz_neg(&ac, &ac); + ibz_gcd(&d, &ac, &bc); + res = res | (0 != ibz_cmp(&c, &d)); + ibz_neg(&bc, &bc); + ibz_gcd(&d, &ac, &bc); + res = res | (0 != ibz_cmp(&c, &d)); + ibz_neg(&ac, &ac); + ibz_gcd(&d, &ac, &bc); + res = res | (0 != ibz_cmp(&c, &d)); + // different sizes do not matter + ibz_set(&d, 2); + ibz_gcd(&m, &ac, &d); + res = res | (0 != ibz_cmp(&m, &d)); + + // invmod + ibz_invmod(&d, &a, &b); + res = res | (0 >= ibz_cmp(&b, &d)); + ibz_set(&m, 0); + res = res | (0 <= ibz_cmp(&m, &d)); + ibz_mul(&m, &d, &a); + ibz_mod(&m, &m, &b); + res = res | !ibz_is_one(&m); + // negative changes nothing + ibz_neg(&a, &a); + ibz_invmod(&d, &a, &b); + res = res | (0 >= ibz_cmp(&b, &d)); + ibz_set(&m, 0); + res = res | (0 <= ibz_cmp(&m, &d)); + ibz_mul(&m, &d, &a); + ibz_mod(&m, &m, &b); + res = res | !ibz_is_one(&m); + + if (res) { + printf("Quaternion module integer group test ibz_test_gcd failed\n"); + } + ibz_finalize(&a); + ibz_finalize(&b); + ibz_finalize(&c); + ibz_finalize(&d); + ibz_finalize(&ac); + ibz_finalize(&bc); + ibz_finalize(&m); + return (res); +} + +// Tests ibz_sqrt_mod_p +// Allows to provide the number of repetitions and the bit-size of the primes. +int +ibz_test_sqrt_mod_p(int reps, int prime_n) +{ + int res = 0; + + // Initialize GMP variables + ibz_t prime, a, prime_minus_a, asq, sqrt, tmp; + ibz_t prime_p4m3, prime_p5m8, prime_p1m8; + ibz_t prime_p4m3_x2, prime_p5m8_x2, prime_p1m8_x2; + ibz_t two_to_the_n_minus_1; + ibz_init(&prime); + ibz_init(&prime_p4m3); + ibz_init(&prime_p5m8); + ibz_init(&prime_p1m8); + ibz_init(&prime_p4m3_x2); + ibz_init(&prime_p5m8_x2); + ibz_init(&prime_p1m8_x2); + ibz_init(&a); + ibz_init(&prime_minus_a); + ibz_init(&asq); + ibz_init(&sqrt); + ibz_init(&tmp); + ibz_init(&two_to_the_n_minus_1); + + // Generate random prime number + int n = prime_n; // Number of bits + ibz_set(&two_to_the_n_minus_1, 1); + mpz_mul_2exp(two_to_the_n_minus_1, two_to_the_n_minus_1, n); + ibz_sub(&two_to_the_n_minus_1, &two_to_the_n_minus_1, &ibz_const_one); + + for (int r = 0; r < reps; ++r) { + ibz_rand_interval(&prime, &ibz_const_zero, &two_to_the_n_minus_1); + if (ibz_is_even(&prime)) + ibz_add(&prime, &prime, &ibz_const_one); + + int p4m3 = 0, p5m8 = 0, p1m8 = 0; + + while (p4m3 == 0 || p5m8 == 0 || p1m8 == 0) { + do { + ibz_add(&prime, &prime, &ibz_const_two); + } while (!mpz_probab_prime_p(prime, 25)); + + if (mpz_mod_ui(tmp, prime, 4) == 3) { + ibz_copy(&prime_p4m3, &prime); + p4m3 = 1; + } else if (mpz_mod_ui(tmp, prime, 8) == 5) { + ibz_copy(&prime_p5m8, &prime); + p5m8 = 1; + } else if (mpz_mod_ui(tmp, prime, 8) == 1) { + ibz_copy(&prime_p1m8, &prime); + p1m8 = 1; + } else { + res = 1; + goto err; + } + } + + ibz_t *primes[] = { &prime_p4m3, &prime_p5m8, &prime_p1m8 }; + ibz_t *primes_x2[] = { &prime_p4m3_x2, &prime_p5m8_x2, &prime_p1m8_x2 }; + for (int i = 0; i < 3; ++i) // 2p + mpz_mul_2exp(*primes_x2[i], *primes[i], 1); + + // Test sqrt mod p + for (int i = 0; i < 3; ++i) { + ibz_sub(&tmp, primes[i], &ibz_const_one); + ibz_rand_interval(&a, &ibz_const_zero, &tmp); + ibz_sub(&prime_minus_a, (primes[i]), &a); + mpz_powm_ui(asq, a, 2, *primes[i]); + + int no_sqrt = !ibz_sqrt_mod_p(&sqrt, &asq, primes[i]); + mpz_powm_ui(tmp, sqrt, 2, *primes[i]); + + if (no_sqrt || (ibz_cmp(&sqrt, &a) && ibz_cmp(&sqrt, &prime_minus_a))) { + res = 1; + goto err; + } + } + } + +err: + if (res) { + printf("Quaternion module integer test ibz_test_sqrt_mod_p failed\n"); + } + ibz_finalize(&prime); + ibz_finalize(&prime_p4m3); + ibz_finalize(&prime_p5m8); + ibz_finalize(&prime_p1m8); + ibz_finalize(&prime_p4m3_x2); + ibz_finalize(&prime_p5m8_x2); + ibz_finalize(&prime_p1m8_x2); + ibz_finalize(&a); + ibz_finalize(&prime_minus_a); + ibz_finalize(&asq); + ibz_finalize(&sqrt); + ibz_finalize(&tmp); + ibz_finalize(&two_to_the_n_minus_1); + return res; +} + +int +ibz_test_rand_interval(int reps) +{ + int res = 0; + ibz_t low, high, rand; + ibz_init(&low); + ibz_init(&high); + ibz_init(&rand); + ibz_set_from_str(&low, "ffa", 16); + ibz_set_from_str(&high, "eeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", 16); + + for (int i = 0; i < reps; ++i) { + res = ibz_rand_interval(&rand, &low, &high); + if (res != 1) { + res = 1; + goto err; + } else { + res = 0; + } + + if (ibz_cmp(&rand, &low) < 0 || ibz_cmp(&rand, &high) > 0) { + res = 1; + goto err; + } + } +err: + if (res) { + printf("Quaternion module integer test ibz_test_rand_interval failed\n"); + } + ibz_finalize(&low); + ibz_finalize(&high); + ibz_finalize(&rand); + return res; +} + +int +ibz_test_rand_interval_i(int reps) +{ + int res = 0; + int32_t low, high; + ibz_t rand, cmp; + ibz_init(&rand); + ibz_init(&cmp); + + for (int i = 0; i < reps; ++i) { + randombytes((unsigned char *)&low, sizeof(int32_t)); + randombytes((unsigned char *)&high, sizeof(int32_t)); + if (low < 0) + low = -low; + if (high < 0) + high = -high; + // The function requires a < b, thus a != b + if (low == high) { + continue; + } + if (low > high) { + int32_t tmp = low; + low = high; + high = tmp; + } + + res = ibz_rand_interval_i(&rand, low, high); + if (res != 1) { + res = 1; + goto err; + } else { + res = 0; + } + ibz_set(&cmp, low); + if (ibz_cmp(&rand, &cmp) < 0) { + res = 1; + goto err; + } + ibz_set(&cmp, high); + if (ibz_cmp(&rand, &cmp) > 0) { + res = 1; + goto err; + } + } + +err: + if (res) { + printf("Quaternion module integer test ibz_test_rand_interval_i failed\n"); + } + ibz_finalize(&rand); + ibz_finalize(&cmp); + return res; +} + +int +ibz_test_rand_interval_minm_m(int reps) +{ + int res = 0; + int32_t m; + ibz_t rand; + ibz_init(&rand); + + for (int i = 0; i < reps; ++i) { + randombytes((unsigned char *)&m, sizeof(int32_t)); + if (m < 0) + m = -m; + m >>= 1; // less than 32 bit + + if (m < 0) { + res = 1; + goto err; + } + + res = ibz_rand_interval_minm_m(&rand, m); + if (res != 1) { + res = 1; + goto err; + } else { + res = 0; + } + if (ibz_cmp_int32(&rand, -m) < 0) { + res = 1; + goto err; + } + if (ibz_cmp_int32(&rand, m) > 0) { + res = 1; + goto err; + } + } + +err: + if (res) { + printf("Quaternion module integer test ibz_test_rand_interval_minm_m failed\n"); + } + ibz_finalize(&rand); + return res; +} + +int +ibz_test_copy_digits(void) +{ + int res = 0; + const digit_t d1[] = { 0x12345678 }; + const digit_t d2[] = { 2, 1 }; + + const char d1str[] = "12345678"; +#if RADIX == 32 + const char d2str[] = "100000002"; +#elif RADIX == 64 + const char d2str[] = "10000000000000002"; +#endif + + char d1_intbig_str[80] = { 0 }; + char d2_intbig_str[80] = { 0 }; + + ibz_t d1_intbig, d2_intbig; + ibz_init(&d1_intbig); + ibz_init(&d2_intbig); + + ibz_copy_digits(&d1_intbig, d1, 1); + ibz_copy_digits(&d2_intbig, d2, 2); + + ibz_convert_to_str(&d1_intbig, d1_intbig_str, 16); + ibz_convert_to_str(&d2_intbig, d2_intbig_str, 16); + + if (memcmp(d1str, d1_intbig_str, sizeof(d1str))) { + res = 1; + goto err; + } + if (memcmp(d2str, d2_intbig_str, sizeof(d2str))) { + res = 1; + goto err; + } +err: + if (res) { + printf("Quaternion module integer test ibz_test_copy_digits failed\n"); + } + ibz_finalize(&d1_intbig); + ibz_finalize(&d2_intbig); + return res; +} + +int +ibz_test_to_digits(void) +{ + int res = 0; + ibz_t d1_intbig, d2_intbig, zero_intbig; + ibz_t d1_intbig_rec, d2_intbig_rec, zero_intbig_rec, cof, cof2; + const char d1str[] = "12345678"; + const char d2str[] = "10000000000000002"; + ibz_init(&d1_intbig); + ibz_init(&d2_intbig); + + ibz_set_from_str(&d1_intbig, d1str, 16); + ibz_set_from_str(&d2_intbig, d2str, 16); + ibz_init(&zero_intbig); + + ibz_init(&d1_intbig_rec); + ibz_init(&d2_intbig_rec); + ibz_init(&zero_intbig_rec); + ibz_init(&cof); + ibz_init(&cof2); + + size_t d1_digits = (mpz_sizeinbase(d1_intbig, 2) + sizeof(digit_t) * 8 - 1) / (sizeof(digit_t) * 8); + size_t d2_digits = (mpz_sizeinbase(d2_intbig, 2) + sizeof(digit_t) * 8 - 1) / (sizeof(digit_t) * 8); + + digit_t d1[d1_digits]; + digit_t d2[d2_digits]; + digit_t zero[1]; + + ibz_to_digits(d1, &d1_intbig); + ibz_to_digits(d2, &d2_intbig); + ibz_to_digits(zero, &zero_intbig); + + // A lazy test, but we know that this conversion should be correct from the previous test + + ibz_copy_digits(&d1_intbig_rec, d1, d1_digits); + ibz_copy_digits(&d2_intbig_rec, d2, d2_digits); + ibz_copy_digits(&zero_intbig_rec, zero, 1); + + if (ibz_cmp(&d1_intbig, &d1_intbig_rec) || ibz_cmp(&zero_intbig, &zero_intbig_rec)) { + res = 1; + goto err; + } + +#if RADIX == 64 + const digit_t p_cofactor_for_3g[5] = { + 0x0000000000000000, 0x74f9dace0d9ec800, 0x63a25b437f655001, 0x0000000000000019, 0 + }; + digit_t p_cofactor_for_3g_rec[10] = { 0 }; +#elif RADIX == 32 + const digit_t p_cofactor_for_3g[10] = { 0x00000000, 0x00000000, 0x0d9ec800, 0x74f9dace, 0x7f655001, + 0x63a25b43, 0x00000019, 0x00000000, 0, 0 }; + digit_t p_cofactor_for_3g_rec[5] = { 0 }; +#endif + ibz_copy_digits(&cof, p_cofactor_for_3g, 5); + ibz_to_digits(p_cofactor_for_3g_rec, &cof); + ibz_copy_digits(&cof2, p_cofactor_for_3g_rec, 5); + + if (ibz_cmp(&cof, &cof2)) { + res = 1; + goto err; + } + +#if RADIX == 32 + digit_t da[3] = { 0, 0, 0 }; +#elif RADIX == 64 + digit_t da[2] = { 0, 0 }; +#endif + + ibz_t strval, strval_check; + ibz_init(&strval_check); + ibz_init(&strval); + ibz_set_from_str(&strval, "1617406613339667622221321", 10); + ibz_to_digits(da, &strval); + ibz_copy_digits(&strval_check, da, sizeof(da) / sizeof(digit_t)); + // ibz_printf("strval: %Zd\nstrval_check: %Zd\n", strval, strval_check); + if (ibz_cmp(&strval, &strval_check)) { + res = 1; + goto err; + } + +err: + if (res) { + printf("Quaternion module integer test ibz_test_to_digits failed\n"); + } + ibz_finalize(&d1_intbig); + ibz_finalize(&d2_intbig); + ibz_finalize(&zero_intbig); + ibz_finalize(&d1_intbig_rec); + ibz_finalize(&d2_intbig_rec); + ibz_finalize(&zero_intbig_rec); + ibz_finalize(&cof); + ibz_finalize(&cof2); + ibz_finalize(&strval); + ibz_finalize(&strval_check); + return res; +} + +int +ibz_test_intbig() +{ + int reps = 2; + int prime_n = 103; + int res = 0; + printf("\nRunning quaternion tests of gmp-based integer functions\n"); + res = res | ibz_test_init_set_cmp(); + res = res | ibz_test_add_sub_neg_abs(); + res = res | ibz_test_mul_sqrt(); + res = res | ibz_test_div(); + res = res | ibz_test_mod(); + res = res | ibz_test_pow(); + res = res | ibz_test_gcd(); + res = res | ibz_test_sqrt_mod_p(reps, prime_n); + res = res | ibz_test_rand_interval(reps); + res = res | ibz_test_rand_interval_i(reps); + res = res | ibz_test_rand_interval_minm_m(reps); + res = res | ibz_test_copy_digits(); + res = res | ibz_test_to_digits(); + return res; +} diff --git a/src/quaternion/ref/generic/test/integers.c b/src/quaternion/ref/generic/test/integers.c index 4eecc6a..1adc072 100644 --- a/src/quaternion/ref/generic/test/integers.c +++ b/src/quaternion/ref/generic/test/integers.c @@ -1,288 +1,44 @@ #include "quaternion_tests.h" - -//integer helpers -//void ibz_rounded_div(ibz_t *q, const ibz_t *a, const ibz_t *b); -int quat_test_integer_ibz_rounded_div(){ +// int ibz_generate_random_prime(ibz_t *p, int is3mod4, int bitsize); +int +quat_test_ibz_generate_random_prime() +{ int res = 0; - ibz_t q, a, b; - ibz_init(&a); - ibz_init(&b); - ibz_init(&q); - - // basic tests - ibz_set(&a,15); - ibz_set(&b,3); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==5); - ibz_set(&a,16); - ibz_set(&b,3); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==5); - ibz_set(&a,17); - ibz_set(&b,3); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==6); - ibz_set(&a,37); - ibz_set(&b,5); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==7); - // test sign combination - ibz_set(&a,149); - ibz_set(&b,12); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==12); - ibz_set(&a,149); - ibz_set(&b,-12); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==-12); - ibz_set(&a,-149); - ibz_set(&b,-12); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==12); - ibz_set(&a,-149); - ibz_set(&b,12); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==-12); - ibz_set(&a,151); - ibz_set(&b,12); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==13); - ibz_set(&a,-151); - ibz_set(&b,-12); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==13); - ibz_set(&a,151); - ibz_set(&b,-12); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==-13); - ibz_set(&a,-151); - ibz_set(&b,12); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==-13); - //divisibles with sign - ibz_set(&a,144); - ibz_set(&b,12); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==12); - ibz_set(&a,-144); - ibz_set(&b,-12); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==12); - ibz_set(&a,144); - ibz_set(&b,-12); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==-12); - ibz_set(&a,-144); - ibz_set(&b,12); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==-12); - // tests close to 0 - ibz_set(&a,-12); - ibz_set(&b,-25); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==0); - ibz_set(&a,12); - ibz_set(&b,25); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==0); - ibz_set(&a,-12); - ibz_set(&b,25); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==0); - ibz_set(&a,12); - ibz_set(&b,-25); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==0); - ibz_set(&a,-12); - ibz_set(&b,-23); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==1); - ibz_set(&a,12); - ibz_set(&b,23); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==1); - ibz_set(&a,-12); - ibz_set(&b,23); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==-1); - ibz_set(&a,12); - ibz_set(&b,-23); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==-1); - // test output equal input - ibz_set(&a,-151); - ibz_set(&b,12); - ibz_rounded_div(&a,&a,&b); - res = res || !(ibz_get(&a)==-13); - ibz_set(&a,-151); - ibz_set(&b,12); - ibz_rounded_div(&b,&a,&b); - res = res || !(ibz_get(&b)==-13); - // test for cmp not returning 1 or -1 or 0 - ibz_set(&a,4292606433816540); - ibz_set(&b,864673106105940); - ibz_rounded_div(&b,&a,&b); - res = res || !(ibz_get(&b)==5); - - if (res != 0){ - printf("Quaternion unit test integer_ibz_rounded_div failed\n"); + int bitsize, is3mod4, primality_test_attempts; + ibz_t p; + ibz_init(&p); + bitsize = 20; + primality_test_attempts = 30; + is3mod4 = 1; + res = res || !ibz_generate_random_prime(&p, is3mod4, bitsize, primality_test_attempts); + res = res || (ibz_probab_prime(&p, 20) == 0); + res = res || (ibz_bitsize(&p) < bitsize); + res = res || (is3mod4 && (ibz_get(&p) % 4 != 3)); + bitsize = 30; + is3mod4 = 0; + res = res || !ibz_generate_random_prime(&p, is3mod4, bitsize, primality_test_attempts); + res = res || (ibz_probab_prime(&p, 20) == 0); + res = res || (ibz_bitsize(&p) < bitsize); + res = res || (is3mod4 && (ibz_get(&p) % 4 != 3)); + is3mod4 = 1; + res = res || !ibz_generate_random_prime(&p, is3mod4, bitsize, primality_test_attempts); + res = res || (ibz_probab_prime(&p, 20) == 0); + res = res || (ibz_bitsize(&p) < bitsize); + res = res || (is3mod4 && (ibz_get(&p) % 4 != 3)); + if (res) { + printf("Quaternion unit test ibz_generate_random_prime failed\n"); } - ibz_finalize(&a); - ibz_finalize(&b); - ibz_finalize(&q); - return(res); + ibz_finalize(&p); + return (res); } -// tests for cornacchia helper functions -//void ibz_complex_mul(ibz_t *re_res, ibz_t *im_res, const ibz_t *re_a, const ibz_t *im_a, const ibz_t *re_b, const ibz_t *im_b); -int quat_test_integer_ibz_complex_mul(){ +// int ibz_cornacchia_prime(ibz_t *x, ibz_t *y, const ibz_t *n, const ibz_t *p); +int +quat_test_integer_ibz_cornacchia_prime(void) +{ int res = 0; - ibz_t re_res, re_a, re_b, re_cmp, im_res, im_a, im_b, im_cmp; - ibz_init(&re_res); - ibz_init(&re_a); - ibz_init(&re_b); - ibz_init(&re_cmp); - ibz_init(&im_res); - ibz_init(&im_a); - ibz_init(&im_b); - ibz_init(&im_cmp); - - ibz_set(&re_a, 1); - ibz_set(&im_a, 2); - ibz_set(&re_b, 3); - ibz_set(&im_b, -4); - ibz_set(&re_cmp, 11); - ibz_set(&im_cmp, 2); - ibz_complex_mul(&re_res,&im_res,&re_a,&im_a,&re_b,&im_b); - res = res || ibz_cmp(&re_res,&re_cmp); - res = res || ibz_cmp(&im_res,&im_cmp); - - ibz_set(&re_a, -3); - ibz_set(&im_a, -5); - ibz_set(&re_b, 2); - ibz_set(&im_b, 4); - ibz_set(&re_cmp, 14); - ibz_set(&im_cmp, -22); - ibz_complex_mul(&re_res,&im_res,&re_a,&im_a,&re_b,&im_b); - res = res || ibz_cmp(&re_res,&re_cmp); - res = res || ibz_cmp(&im_res,&im_cmp); - - if (res != 0){ - printf("Quaternion unit test integer_ibz_complex_mul failed\n"); - } - ibz_finalize(&re_res); - ibz_finalize(&re_cmp); - ibz_finalize(&re_a); - ibz_finalize(&re_b); - ibz_finalize(&im_res); - ibz_finalize(&im_cmp); - ibz_finalize(&im_a); - ibz_finalize(&im_b); - return(res); -} - -//void ibz_complex_mul_by_complex_power(ibz_t *re_res, ibz_t *im_res, const ibz_t *re_a, const ibz_t *im_a, int64_t exp); -int quat_test_integer_ibz_complex_mul_by_complex_power(){ - int res = 0; - int64_t exp; - ibz_t re_res, re_a, re_cmp, im_res, im_a, im_cmp; - ibz_init(&re_res); - ibz_init(&re_a); - ibz_init(&re_cmp); - ibz_init(&im_res); - ibz_init(&im_a); - ibz_init(&im_cmp); - - exp = 0; - ibz_set(&re_a, 1); - ibz_set(&im_a, 2); - ibz_set(&re_res, 3); - ibz_set(&im_res, -4); - ibz_set(&re_cmp, 3); - ibz_set(&im_cmp, -4); - ibz_complex_mul_by_complex_power(&re_res,&im_res,&re_a,&im_a,exp); - res = res || ibz_cmp(&re_res,&re_cmp); - res = res || ibz_cmp(&im_res,&im_cmp); - - exp = 1; - ibz_set(&re_a, 1); - ibz_set(&im_a, 2); - ibz_set(&re_res, 3); - ibz_set(&im_res, -4); - ibz_set(&re_cmp, 11); - ibz_set(&im_cmp, 2); - ibz_complex_mul_by_complex_power(&re_res,&im_res,&re_a,&im_a,exp); - res = res || ibz_cmp(&re_res,&re_cmp); - res = res || ibz_cmp(&im_res,&im_cmp); - - exp = 2; - ibz_set(&re_a, 1); - ibz_set(&im_a, 2); - ibz_set(&re_res, 3); - ibz_set(&im_res, -4); - ibz_set(&re_cmp, 7); - ibz_set(&im_cmp, 24); - ibz_complex_mul_by_complex_power(&re_res,&im_res,&re_a,&im_a,exp); - res = res || ibz_cmp(&re_res,&re_cmp); - res = res || ibz_cmp(&im_res,&im_cmp); - - if (res != 0){ - printf("Quaternion unit test integer_ibz_complex_mul_by_complex_power failed\n"); - } - ibz_finalize(&re_res); - ibz_finalize(&re_cmp); - ibz_finalize(&re_a); - ibz_finalize(&im_res); - ibz_finalize(&im_cmp); - ibz_finalize(&im_a); - return(res); -} - -//int ibz_cornacchia_extended_prime_loop(ibz_t *re_res, ibz_t *im_res, int64_t prime, int64_t val); -int quat_test_integer_ibz_cornacchia_extended_prime_loop(){ - int res = 0; - int64_t p, re_a, im_a; - ibz_t re_res, re_cmp, im_res, im_cmp, prod; - ibz_init(&re_res); - ibz_init(&re_cmp); - ibz_init(&im_res); - ibz_init(&im_cmp); - ibz_init(&prod); - - p = 5; - ibz_set(&re_res, 1); - ibz_set(&im_res, 1); - ibz_set(&re_cmp, -1); - ibz_set(&im_cmp, 7); - ibz_cornacchia_extended_prime_loop(&re_res, &im_res, p, 2); - res = res || ibz_cmp(&re_res,&re_cmp); - res = res || ibz_cmp(&im_res,&im_cmp); - - p = 7; - ibz_set(&re_res, -1); - ibz_set(&im_res, 7); - ibz_set(&re_cmp, -1); - ibz_set(&im_cmp, 7); - ibz_cornacchia_extended_prime_loop(&re_res, &im_res, p, 0); - res = res || ibz_cmp(&re_res,&re_cmp); - res = res || ibz_cmp(&im_res,&im_cmp); - - if (res != 0){ - printf("Quaternion unit test integer_ibz_cornacchia_extended_prime_loop failed\n"); - } - ibz_finalize(&re_res); - ibz_finalize(&re_cmp); - ibz_finalize(&im_res); - ibz_finalize(&im_cmp); - ibz_finalize(&prod); - return(res); -} - -//int ibz_cornacchia_prime(ibz_t *x, ibz_t *y, const ibz_t *n, const ibz_t *p); -int quat_test_integer_ibz_cornacchia_prime(){ - int res = 0; - ibz_t x,y,n, prod,c_res,p; + ibz_t x, y, n, prod, c_res, p; ibz_init(&x); ibz_init(&y); ibz_init(&n); @@ -293,54 +49,54 @@ int quat_test_integer_ibz_cornacchia_prime(){ ibz_set(&n, 1); // there is a solution in these cases ibz_set(&p, 5); - if(ibz_cornacchia_prime(&x,&y,&n,&p)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_mul(&prod,&prod,&n); - ibz_add(&c_res,&c_res,&prod); - res = res || ibz_cmp(&p,&c_res); + if (ibz_cornacchia_prime(&x, &y, &n, &p)) { + ibz_mul(&c_res, &x, &x); + ibz_mul(&prod, &y, &y); + ibz_mul(&prod, &prod, &n); + ibz_add(&c_res, &c_res, &prod); + res = res || ibz_cmp(&p, &c_res); } else { res = 1; } ibz_set(&p, 2); - if(ibz_cornacchia_prime(&x,&y,&n,&p)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_mul(&prod,&prod,&n); - ibz_add(&c_res,&c_res,&prod); - res = res || ibz_cmp(&p,&c_res); + if (ibz_cornacchia_prime(&x, &y, &n, &p)) { + ibz_mul(&c_res, &x, &x); + ibz_mul(&prod, &y, &y); + ibz_mul(&prod, &prod, &n); + ibz_add(&c_res, &c_res, &prod); + res = res || ibz_cmp(&p, &c_res); } else { res = 1; } ibz_set(&p, 41); - if(ibz_cornacchia_prime(&x,&y,&n,&p)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_mul(&prod,&prod,&n); - ibz_add(&c_res,&c_res,&prod); - res = res || ibz_cmp(&p,&c_res); + if (ibz_cornacchia_prime(&x, &y, &n, &p)) { + ibz_mul(&c_res, &x, &x); + ibz_mul(&prod, &y, &y); + ibz_mul(&prod, &prod, &n); + ibz_add(&c_res, &c_res, &prod); + res = res || ibz_cmp(&p, &c_res); } else { res = 1; } ibz_set(&n, 2); ibz_set(&p, 3); - if(ibz_cornacchia_prime(&x,&y,&n,&p)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_mul(&prod,&prod,&n); - ibz_add(&c_res,&c_res,&prod); - res = res || ibz_cmp(&p,&c_res); + if (ibz_cornacchia_prime(&x, &y, &n, &p)) { + ibz_mul(&c_res, &x, &x); + ibz_mul(&prod, &y, &y); + ibz_mul(&prod, &prod, &n); + ibz_add(&c_res, &c_res, &prod); + res = res || ibz_cmp(&p, &c_res); } else { res = 1; } ibz_set(&n, 3); ibz_set(&p, 7); - if(ibz_cornacchia_prime(&x,&y,&n,&p)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_mul(&prod,&prod,&n); - ibz_add(&c_res,&c_res,&prod); - res = res || ibz_cmp(&p,&c_res); + if (ibz_cornacchia_prime(&x, &y, &n, &p)) { + ibz_mul(&c_res, &x, &x); + ibz_mul(&prod, &y, &y); + ibz_mul(&prod, &prod, &n); + ibz_add(&c_res, &c_res, &prod); + res = res || ibz_cmp(&p, &c_res); } else { res = 1; } @@ -348,13 +104,17 @@ int quat_test_integer_ibz_cornacchia_prime(){ ibz_set(&n, 1); // there is no solution in these cases ibz_set(&p, 7); - res = res || ibz_cornacchia_prime(&x,&y,&n,&p); + res = res || ibz_cornacchia_prime(&x, &y, &n, &p); ibz_set(&p, 3); - res = res || ibz_cornacchia_prime(&x,&y,&n,&p); + res = res || ibz_cornacchia_prime(&x, &y, &n, &p); ibz_set(&n, 3); ibz_set(&p, 5); - res = res || ibz_cornacchia_prime(&x,&y,&n,&p); - if (res != 0){ + res = res || ibz_cornacchia_prime(&x, &y, &n, &p); + // This should be solved + ibz_set(&n, 3); + ibz_set(&p, 3); + res = res || !ibz_cornacchia_prime(&x, &y, &n, &p); + if (res != 0) { printf("Quaternion unit test integer_ibz_cornacchia_prime failed\n"); } ibz_finalize(&x); @@ -366,222 +126,13 @@ int quat_test_integer_ibz_cornacchia_prime(){ return res; } - -//int ibz_cornacchia_special_prime(ibz_t *x, ibz_t *y, const ibz_t *n, const ibz_t *p, const int exp_adjust); -int quat_test_integer_ibz_cornacchia_special_prime(){ - int res = 0; - int exp_adjust; - ibz_t x,y,n, prod,c_res,p, cmp, two; - ibz_init(&x); - ibz_init(&y); - ibz_init(&n); - ibz_init(&p); - ibz_init(&prod); - ibz_init(&c_res); - ibz_init(&cmp); - ibz_init(&two); - ibz_set(&two,2); - - ibz_set(&n, 3); - // there is a solution in these cases - ibz_set(&p, 43); - exp_adjust = 2; - //x^2 + 3y^2 = 4*43, (5,7) is solution - if(ibz_cornacchia_special_prime(&x,&y,&n,&p, exp_adjust)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_mul(&prod,&prod,&n); - ibz_add(&c_res,&c_res,&prod); - ibz_pow(&cmp,&two,exp_adjust); - ibz_mul(&cmp,&cmp,&p); - res = res || ibz_cmp(&cmp,&c_res); - } else { - res = 1; - } - ibz_set(&n, 7); - exp_adjust = 3; - ibz_set(&p, 11); - //x^2 + 7y^2 = 8*11, (5,3) is solution - if(ibz_cornacchia_special_prime(&x,&y,&n,&p, exp_adjust)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_mul(&prod,&prod,&n); - ibz_add(&c_res,&c_res,&prod); - ibz_pow(&cmp,&two,exp_adjust); - ibz_mul(&cmp,&cmp,&p); - res = res || ibz_cmp(&cmp,&c_res); - } else { - res = 1; - } - /* Failing testcase, needs investigation - ibz_set(&n, 15); - exp_adjust = 4; - ibz_set(&p, 31); - //x^2 + 15y^2 = 16*31, (19,3) is solution - if(ibz_cornacchia_special_prime(&x,&y,&n,&p, exp_adjust)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_mul(&prod,&prod,&n); - ibz_add(&c_res,&c_res,&prod); - ibz_pow(&cmp,&two,exp_adjust); - ibz_mul(&cmp,&cmp,&p); - res = res || ibz_cmp(&cmp,&c_res); - } else { - res = 1; - } - ibz_set(&n, 3); - exp_adjust = 2; - ibz_set(&p, 7); - //x^2 + 3y^2 = 4*7, (1,3) is solution - if(ibz_cornacchia_special_prime(&x,&y,&n,&p, exp_adjust)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_mul(&prod,&prod,&n); - ibz_add(&c_res,&c_res,&prod); - ibz_pow(&cmp,&two,exp_adjust); - ibz_mul(&cmp,&cmp,&p); - res = res || ibz_cmp(&cmp,&c_res); - } else { - res = 1; - } - */ - - // there is no solution in these cases - ibz_set(&n, 3); - ibz_set(&p, 11); - exp_adjust = 3; - res = res || ibz_cornacchia_special_prime(&x,&y,&n,&p, exp_adjust); - - if (res != 0){ - printf("Quaternion unit test integer_ibz_cornacchia_special_prime failed\n"); - } - ibz_finalize(&x); - ibz_finalize(&y); - ibz_finalize(&n); - ibz_finalize(&p); - ibz_finalize(&prod); - ibz_finalize(&c_res); - ibz_finalize(&two); - ibz_finalize(&cmp); - return res; -} - -//int ibz_cornacchia_extended(ibz_t *x, ibz_t *y, const ibz_t *n, const short *prime_list, const int prime_list_length, short primality_test_iterations, const ibz_t *bad_primes_prod); -int quat_test_integer_ibz_cornacchia_extended(){ - int res = 0; - ibz_t x,y,n, prod,c_res,bad; - short primes[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101}; - int primes_length = 26; - short iterations = 20; - ibz_init(&x); - ibz_init(&y); - ibz_init(&n); - ibz_init(&prod); - ibz_init(&c_res); - ibz_init(&bad); - ibz_set(&bad,3*7*11*19); - - // there is a solution in these cases - ibz_set(&n, 5); - if(ibz_cornacchia_extended(&x,&y,&n, primes, 4,iterations, NULL)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_add(&c_res,&c_res,&prod); - res = res || ibz_cmp(&n,&c_res); - } else { - res = 1; - } - ibz_set(&n, 50); - if(ibz_cornacchia_extended(&x,&y,&n, primes, 7,iterations,NULL)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_add(&c_res,&c_res,&prod); - res = res || ibz_cmp(&n,&c_res); - } else { - res = 1; - } - ibz_set(&n, 4100); - if(ibz_cornacchia_extended(&x,&y,&n, primes, primes_length,iterations,&bad)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_add(&c_res,&c_res,&prod); - res = res || ibz_cmp(&n,&c_res); - } else { - res = 1; - } - // test product of all small primes - ibz_set(&n, 5*13*17*29*37*41); - ibz_set(&x, 53*61*73*89*97); - ibz_mul(&n, &n, &x); - ibz_set(&x, 404); - ibz_mul(&n, &n, &x); - if(ibz_cornacchia_extended(&x,&y,&n, primes, primes_length,iterations,NULL)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_add(&c_res,&c_res,&prod); - res = res || ibz_cmp(&n,&c_res); - } else { - res = 1; - } - // test with large prime - ibz_set(&n, 1381); // prime and 1 mod 4 - if(ibz_cornacchia_extended(&x,&y,&n, primes, primes_length,iterations,&bad)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_add(&c_res,&c_res,&prod); - res = res || ibz_cmp(&n,&c_res); - } else { - res = 1; - } - // test with large prime part - ibz_set(&n, 5*13*17*29*37*97); - ibz_set(&x, 1381); // prime and 1 mod 4 - ibz_mul(&n, &n, &x); - if(ibz_cornacchia_extended(&x,&y,&n, primes, primes_length,iterations,NULL)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_add(&c_res,&c_res,&prod); - res = res || ibz_cmp(&n,&c_res); - } else { - res = 1; - } - - // there is no solution in these cases - ibz_set(&n, 7); - res = res || ibz_cornacchia_extended(&x,&y,&n, primes, primes_length,iterations,&bad); - ibz_set(&n, 3); - res = res || ibz_cornacchia_extended(&x,&y,&n, primes, primes_length,iterations,&bad); - ibz_set(&n, 6); - res = res || ibz_cornacchia_extended(&x,&y,&n, primes, primes_length,iterations,NULL); - ibz_set(&n, 30); - res = res || ibz_cornacchia_extended(&x,&y,&n, primes, primes_length,iterations,&bad); - ibz_set(&n, 30*1381); - res = res || ibz_cornacchia_extended(&x,&y,&n, primes, primes_length,iterations,&bad); - - if (res != 0){ - printf("Quaternion unit test integer_ibz_cornacchia_extended failed\n"); - } - ibz_finalize(&x); - ibz_finalize(&y); - ibz_finalize(&n); - ibz_finalize(&prod); - ibz_finalize(&c_res); - ibz_finalize(&bad); - return res; -} - - // run all previous tests -int quat_test_integers(){ +int +quat_test_integers(void) +{ int res = 0; printf("\nRunning quaternion tests of integer functions\n"); - res = res | quat_test_integer_ibz_rounded_div(); - res = res | quat_test_integer_ibz_complex_mul(); - res = res | quat_test_integer_ibz_complex_mul_by_complex_power(); - res = res | quat_test_integer_ibz_cornacchia_extended_prime_loop(); + res = res | quat_test_ibz_generate_random_prime(); res = res | quat_test_integer_ibz_cornacchia_prime(); - res = res | quat_test_integer_ibz_cornacchia_special_prime(); - res = res | quat_test_integer_ibz_cornacchia_extended(); - return(res); + return (res); } - diff --git a/src/quaternion/ref/generic/test/lat_ball.c b/src/quaternion/ref/generic/test/lat_ball.c new file mode 100644 index 0000000..da8ca21 --- /dev/null +++ b/src/quaternion/ref/generic/test/lat_ball.c @@ -0,0 +1,266 @@ +#include "quaternion_tests.h" +#include + +// int quat_lattice_bound_parallelogram(ibz_vec_4_t *box, ibz_mat_4x4_t *U, const ibz_mat_4x4_t *G, +// const ibz_t *radius); +int +quat_test_lat_ball_paralellogram_randomized(int iterations, int bitsize) +{ + int res = 0; + + quat_lattice_t lattice; + ibz_t radius, length, tmp; + ibz_mat_4x4_t U, G; + ibz_vec_4_t box, dbox, x; + quat_lattice_init(&lattice); + ibz_vec_4_init(&box); + ibz_vec_4_init(&dbox); + ibz_vec_4_init(&x); + ibz_mat_4x4_init(&U); + ibz_mat_4x4_init(&G); + ibz_init(&radius); + ibz_init(&length); + ibz_init(&tmp); + + for (int it = 0; it < iterations; it++) { +// Create a random positive definite quadatic form +#ifndef NDEBUG + int randret = quat_test_input_random_lattice_generation(&lattice, bitsize, 1, 0); + assert(randret == 0); +#else + (void)quat_test_input_random_lattice_generation(&lattice, bitsize, 1, 0); +#endif + ibz_mat_4x4_transpose(&G, &lattice.basis); + ibz_mat_4x4_mul(&G, &G, &lattice.basis); + +// Set radius to 2 × sqrt(lattice volume) +#ifndef NDEBUG + int ok = ibz_mat_4x4_inv_with_det_as_denom(NULL, &radius, &(lattice.basis)); + assert(ok); +#else + (void)ibz_mat_4x4_inv_with_det_as_denom(NULL, &radius, &(lattice.basis)); +#endif + ibz_abs(&radius, &radius); + ibz_sqrt_floor(&radius, &radius); + ibz_mul(&radius, &radius, &ibz_const_two); + + quat_lattice_bound_parallelogram(&box, &U, &G, &radius); + for (int i = 0; i < 4; i++) { + // dbox is a box with sides dbox[i] = 2*box[i] + 1 + ibz_add(&dbox[i], &box[i], &box[i]); + ibz_add(&dbox[i], &dbox[i], &ibz_const_one); + // initialize x[i] to the bottom of dbox[i] + ibz_neg(&x[i], &dbox[i]); + } + + // Integrate U into the Gram matrix + ibz_mat_4x4_mul(&G, &U, &G); + ibz_mat_4x4_transpose(&U, &U); + ibz_mat_4x4_mul(&G, &G, &U); + + // We treat x[0]...x[4] as a counter, incrementing one by one + // but skipping values that are inside the parallelogram defined + // by box. + while (1) { + // x is out of the parallelogram, so its length must be + // greater than the radius + quat_qf_eval(&length, &G, &x); + if (ibz_cmp(&length, &radius) <= 0) { + res = 1; + break; + } + + // Increment counter + ibz_add(&x[0], &x[0], &ibz_const_one); + // if x[0] just entered the interval + ibz_add(&tmp, &x[0], &box[0]); + if (ibz_is_zero(&tmp)) { + int inbox = 1; + for (int i = 1; i < 4; i++) { + ibz_abs(&tmp, &x[i]); + inbox &= ibz_cmp(&tmp, &box[i]) <= 0; + } + // if x[1]...x[3] are all in the respective intervals + // jump straight to the end of x[0]'s interval + if (inbox) + ibz_set(&x[0], 1); + } + + // if x[0] became positive, loop the counter + if (ibz_is_one(&x[0])) { + ibz_neg(&x[0], &dbox[0]); + int carry = 1; + for (int i = 1; carry && i < 4; i++) { + ibz_add(&x[i], &x[i], &ibz_const_one); + if (ibz_cmp(&x[i], &dbox[i]) > 0) { + ibz_neg(&x[i], &dbox[i]); + } else { + carry = 0; + } + } + + // If there still is a carry, we are at the end + if (carry) + break; + } + } + } + + quat_lattice_finalize(&lattice); + ibz_vec_4_finalize(&box); + ibz_vec_4_finalize(&dbox); + ibz_vec_4_finalize(&x); + ibz_mat_4x4_finalize(&U); + ibz_mat_4x4_finalize(&G); + ibz_finalize(&radius); + ibz_finalize(&length); + ibz_finalize(&tmp); + + if (res != 0) { + printf("Quaternion unit test lat_ball_paralellogram_randomized failed\n"); + } + return (res); +} + +// helper which tests quat_lattice_sample_from_ball on given input +int +quat_test_lat_ball_sample_helper(const quat_lattice_t *lat, const ibz_t *radius, const quat_alg_t *alg) +{ + int res = 0; + quat_alg_elem_t vec; + ibz_t norm_d, norm_n; + ibz_init(&norm_d); + ibz_init(&norm_n); + quat_alg_elem_init(&vec); + // check return value + res |= !quat_lattice_sample_from_ball(&vec, lat, alg, radius); + // check result is in lattice + res |= !quat_lattice_contains(NULL, lat, &vec); + quat_alg_norm(&norm_n, &norm_d, &vec, alg); + // test that n/d <= r so that n <= rd + ibz_mul(&norm_d, &norm_d, radius); + res |= !(ibz_cmp(&norm_n, &norm_d) <= 0); + + ibz_finalize(&norm_d); + ibz_finalize(&norm_n); + quat_alg_elem_finalize(&vec); + return res; +} + +// int quat_lattice_sample_from_ball(ibz_vec_4_t *x, const quat_lattice_t *lattice, const quat_alg_t +// *alg, const ibz_t *radius); +int +quat_test_lat_ball_sample_from_ball() +{ + int res = 0; + + ibz_t norm_n, norm_d; + quat_alg_t alg; + quat_alg_elem_t vec; + quat_lattice_t lattice; + ibz_t radius; + + quat_alg_init_set_ui(&alg, 11); + ibz_init(&norm_n); + ibz_init(&norm_d); + quat_lattice_init(&lattice); + ibz_init(&radius); + quat_alg_elem_init(&vec); + + for (int it = 0; it < 3; it++) { + if (it == 0) { + ibz_mat_4x4_identity(&(lattice.basis)); // Test inner product + } else if (it == 1) { + ibz_set(&lattice.denom, 13); // Test with denominator + } else { // if (it == 2) + // Test a very much non-orthogonal qf + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + ibz_add(&(lattice.basis[i][j]), &(lattice.basis[i][j]), &ibz_const_one); + } + + for (int i = 0; i < 100; i++) { + ibz_set(&radius, i + 1); + res |= quat_test_lat_ball_sample_helper(&lattice, &radius, &alg); + if (res != 0) + break; + } + } + + if (res != 0) { + printf("Quaternion unit test lat_ball_sample_from_ball failed\n"); + } + + quat_alg_finalize(&alg); + quat_lattice_finalize(&lattice); + ibz_finalize(&radius); + quat_alg_elem_finalize(&vec); + ibz_finalize(&norm_n); + ibz_finalize(&norm_d); + return (res); +} + +int +quat_test_lat_ball_sample_from_ball_randomized(int iterations, int bitsize) +{ + int res = 0; + + ibz_t norm_n, norm_d; + quat_alg_t alg; + quat_alg_elem_t vec; + quat_lattice_t *lattices; + ibz_t radius; + + quat_alg_init_set_ui(&alg, 11); + ibz_init(&norm_n); + ibz_init(&norm_d); + lattices = malloc(iterations * sizeof(quat_lattice_t)); + for (int i = 0; i < iterations; i++) + quat_lattice_init(&(lattices[i])); + ibz_init(&radius); + quat_alg_elem_init(&vec); + + int randret = quat_test_input_random_lattice_generation(lattices, bitsize, iterations, 0); + + if (!randret) { + for (int i = 0; i < iterations; i++) { +#ifndef NDEBUG + + int ok = ibz_mat_4x4_inv_with_det_as_denom(NULL, &radius, &(lattices[i].basis)); + assert(ok); +#else + (void)ibz_mat_4x4_inv_with_det_as_denom(NULL, &radius, &(lattices[i].basis)); +#endif + ibz_abs(&radius, &radius); + res |= quat_test_lat_ball_sample_helper(&(lattices[i]), &radius, &alg); + if (res != 0) + break; + } + } + + if (res != 0) { + printf("Quaternion unit test lat_ball_sample_from_ball_randomized failed\n"); + } + + quat_alg_finalize(&alg); + for (int i = 0; i < iterations; i++) + quat_lattice_finalize(&(lattices[i])); + free(lattices); + ibz_finalize(&radius); + quat_alg_elem_finalize(&vec); + ibz_finalize(&norm_n); + ibz_finalize(&norm_d); + return (res); +} + +// run all previous tests +int +quat_test_lat_ball(void) +{ + int res = 0; + printf("\nRunning quaternion tests for sampling lattice points of bounded norm\n"); + res = res | quat_test_lat_ball_sample_from_ball(); + res = res | quat_test_lat_ball_sample_from_ball_randomized(100, 10); + res = res | quat_test_lat_ball_paralellogram_randomized(100, 100); + return (res); +} diff --git a/src/quaternion/ref/generic/test/lattice.c b/src/quaternion/ref/generic/test/lattice.c index 2dd4f06..51c4326 100644 --- a/src/quaternion/ref/generic/test/lattice.c +++ b/src/quaternion/ref/generic/test/lattice.c @@ -2,8 +2,10 @@ // helper functions -//int quat_lattice_equal(const quat_lattice_t *lat1, const quat_lattice_t *lat2); -int quat_test_lattice_equal(){ +// int quat_lattice_equal(const quat_lattice_t *lat1, const quat_lattice_t *lat2); +int +quat_test_lattice_equal(void) +{ int res = 0; quat_lattice_t lat, cmp; quat_lattice_init(&lat); @@ -11,43 +13,91 @@ int quat_test_lattice_equal(){ ibz_mat_4x4_identity(&(lat.basis)); ibz_mat_4x4_identity(&(cmp.basis)); - res = res || !quat_lattice_equal(&lat,&cmp); - ibz_set(&(lat.denom),5); - ibz_set(&(cmp.denom),4); - res = res || quat_lattice_equal(&lat,&cmp); - ibz_set(&(lat.denom),1); - ibz_set(&(cmp.denom),-1); - res = res || !quat_lattice_equal(&lat,&cmp); - ibz_set(&(lat.denom),3); - ibz_set(&(cmp.denom),3); - res = res || !quat_lattice_equal(&lat,&cmp); - ibz_set(&(lat.basis[0][0]),1); - ibz_set(&(lat.basis[0][3]),-1); - ibz_set(&(lat.basis[1][1]),-2); - ibz_set(&(lat.basis[2][2]),1); - ibz_set(&(lat.basis[2][1]),1); - ibz_set(&(lat.basis[3][3]),-3); - ibz_set(&(lat.denom),6); + res = res || !quat_lattice_equal(&lat, &cmp); + ibz_set(&(lat.denom), 5); + ibz_set(&(cmp.denom), 4); + res = res || quat_lattice_equal(&lat, &cmp); + ibz_set(&(lat.denom), 1); + ibz_set(&(cmp.denom), -1); + res = res || !quat_lattice_equal(&lat, &cmp); + ibz_set(&(lat.denom), 3); + ibz_set(&(cmp.denom), 3); + res = res || !quat_lattice_equal(&lat, &cmp); + ibz_set(&(lat.basis[0][0]), 1); + ibz_set(&(lat.basis[0][3]), -1); + ibz_set(&(lat.basis[1][1]), -2); + ibz_set(&(lat.basis[2][2]), 1); + ibz_set(&(lat.basis[2][1]), 1); + ibz_set(&(lat.basis[3][3]), -3); + ibz_set(&(lat.denom), 6); quat_lattice_hnf(&lat); ibz_mat_4x4_copy(&(cmp.basis), &(lat.basis)); - ibz_set(&(cmp.denom),6); - res = res || !quat_lattice_equal(&lat,&cmp); - ibz_set(&(cmp.denom),-7); - res = res || quat_lattice_equal(&lat,&cmp); - ibz_set(&(cmp.denom),6); - ibz_set(&(cmp.basis[3][3]),165); - res = res || quat_lattice_equal(&lat,&cmp); + ibz_set(&(cmp.denom), 6); + res = res || !quat_lattice_equal(&lat, &cmp); + ibz_set(&(cmp.denom), -7); + res = res || quat_lattice_equal(&lat, &cmp); + ibz_set(&(cmp.denom), 6); + ibz_set(&(cmp.basis[3][3]), 165); + res = res || quat_lattice_equal(&lat, &cmp); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test lattice_equal failed\n"); } quat_lattice_finalize(&lat); quat_lattice_finalize(&cmp); - return(res); + return (res); } -//void quat_lattice_reduce_denom(quat_lattice_t *reduced, const quat_lattice_t *lat); -int quat_test_lattice_reduce_denom(){ +// int quat_lattice_inclusion(const quat_lattice_t *sublat, const quat_lattice_t *overlat) +int +quat_test_lattice_inclusion(void) +{ + int res = 0; + quat_lattice_t lat, cmp; + quat_lattice_init(&lat); + quat_lattice_init(&cmp); + + ibz_mat_4x4_identity(&(lat.basis)); + ibz_mat_4x4_identity(&(cmp.basis)); + res = res || !quat_lattice_inclusion(&lat, &cmp); + ibz_set(&(lat.denom), 5); + ibz_set(&(cmp.denom), 4); + res = res || quat_lattice_inclusion(&lat, &cmp); + ibz_set(&(lat.denom), 1); + ibz_set(&(cmp.denom), 3); + res = res || !quat_lattice_inclusion(&lat, &cmp); + ibz_set(&(lat.denom), 3); + ibz_set(&(cmp.denom), 3); + res = res || !quat_lattice_inclusion(&lat, &cmp); + ibz_set(&(lat.basis[0][0]), 1); + ibz_set(&(lat.basis[0][3]), -1); + ibz_set(&(lat.basis[1][1]), -2); + ibz_set(&(lat.basis[2][2]), 1); + ibz_set(&(lat.basis[2][1]), 1); + ibz_set(&(lat.basis[3][3]), -3); + ibz_set(&(lat.denom), 6); + quat_lattice_hnf(&lat); + ibz_mat_4x4_copy(&(cmp.basis), &(lat.basis)); + ibz_set(&(cmp.denom), 6); + res = res || !quat_lattice_inclusion(&lat, &cmp); + ibz_set(&(cmp.denom), 12); + res = res || !quat_lattice_inclusion(&lat, &cmp); + ibz_set(&(cmp.denom), 6); + ibz_set(&(cmp.basis[3][3]), 165); + res = res || quat_lattice_inclusion(&lat, &cmp); + + if (res != 0) { + printf("Quaternion unit test lattice_inclusion failed\n"); + } + quat_lattice_finalize(&lat); + quat_lattice_finalize(&cmp); + return (res); +} + +// void quat_lattice_reduce_denom(quat_lattice_t *reduced, const quat_lattice_t *lat); +int +quat_test_lattice_reduce_denom(void) +{ int res = 0; int s; quat_lattice_t red, lat, cmp; @@ -56,78 +106,126 @@ int quat_test_lattice_reduce_denom(){ quat_lattice_init(&lat); s = 15; - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(lat.basis[i][j]),(i+j)*s); - ibz_set(&(cmp.basis[i][j]),(i+j)); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(lat.basis[i][j]), (i + j) * s); + ibz_set(&(cmp.basis[i][j]), (i + j)); } } - ibz_set(&(lat.denom),4*s); + ibz_set(&(lat.denom), 4 * s); ibz_set(&(cmp.denom), 4); - quat_lattice_reduce_denom(&red,&lat); - res = res || (!ibz_mat_4x4_equal(&(red.basis),&(cmp.basis))); - res = res || ibz_cmp(&(red.denom),&(cmp.denom)); + quat_lattice_reduce_denom(&red, &lat); + res = res || (!ibz_mat_4x4_equal(&(red.basis), &(cmp.basis))); + res = res || ibz_cmp(&(red.denom), &(cmp.denom)); + quat_lattice_reduce_denom(&lat, &lat); + res = res || (!ibz_mat_4x4_equal(&(lat.basis), &(cmp.basis))); + res = res || ibz_cmp(&(lat.denom), &(cmp.denom)); - quat_lattice_reduce_denom(&lat,&lat); - res = res || (!ibz_mat_4x4_equal(&(lat.basis),&(cmp.basis))); - res = res || ibz_cmp(&(lat.denom),&(cmp.denom)); - - if (res != 0){ + if (res != 0) { printf("Quaternion unit test lattice_reduce_denom failed\n"); } quat_lattice_finalize(&red); quat_lattice_finalize(&cmp); quat_lattice_finalize(&lat); - return(res); + return (res); } -//void quat_lattice_dual_without_hnf(quat_lattice_t *dual, const quat_lattice_t *lat); -int quat_test_lattice_dual_without_hnf(){ +// void quat_lattice_conjugate_without_hnf(quat_lattice_t *conj, const quat_lattice_t *lat); +int +quat_test_lattice_conjugate_without_hnf(void) +{ int res = 0; - quat_lattice_t lat, dual,cmp; + quat_lattice_t lat, conj, cmp; + quat_lattice_init(&lat); + quat_lattice_init(&conj); + quat_lattice_init(&cmp); + // set lattice + ibz_mat_4x4_zero(&(lat.basis)); + ibz_set(&(lat.basis[0][0]), 4); + ibz_set(&(lat.basis[0][3]), 1); + ibz_set(&(lat.basis[1][1]), -2); + ibz_set(&(lat.basis[2][2]), -1); + ibz_set(&(lat.basis[2][1]), -1); + ibz_set(&(lat.basis[3][3]), -3); + ibz_set(&(lat.denom), 6); + ibz_mat_4x4_zero(&(cmp.basis)); + ibz_set(&(cmp.basis[0][0]), 4); + ibz_set(&(cmp.basis[0][3]), 1); + ibz_set(&(cmp.basis[1][1]), 2); + ibz_set(&(cmp.basis[2][2]), 1); + ibz_set(&(cmp.basis[2][1]), 1); + ibz_set(&(cmp.basis[3][3]), 3); + ibz_set(&(cmp.denom), 6); + quat_lattice_hnf(&lat); + quat_lattice_conjugate_without_hnf(&conj, &lat); + quat_lattice_hnf(&conj); + quat_lattice_hnf(&cmp); + res = res || !quat_lattice_equal(&conj, &cmp); + // test whether coj of conj is original lattice + quat_lattice_conjugate_without_hnf(&conj, &conj); + quat_lattice_hnf(&conj); + res = res || !quat_lattice_equal(&conj, &lat); + + if (res != 0) { + printf("Quaternion unit test lattice_conjugate_without_hnf failed\n"); + } + quat_lattice_finalize(&lat); + quat_lattice_finalize(&conj); + quat_lattice_finalize(&cmp); + return (res); +} + +// void quat_lattice_dual_without_hnf(quat_lattice_t *dual, const quat_lattice_t *lat); +int +quat_test_lattice_dual_without_hnf(void) +{ + int res = 0; + quat_lattice_t lat, dual, cmp; quat_lattice_init(&lat); quat_lattice_init(&dual); quat_lattice_init(&cmp); // set lattice ibz_mat_4x4_zero(&(lat.basis)); - ibz_set(&(lat.basis[0][0]),1); - ibz_set(&(lat.basis[0][3]),-1); - ibz_set(&(lat.basis[1][1]),-2); - ibz_set(&(lat.basis[2][2]),1); - ibz_set(&(lat.basis[2][1]),1); - ibz_set(&(lat.basis[3][3]),-3); - ibz_set(&(lat.denom),6); + ibz_set(&(lat.basis[0][0]), 1); + ibz_set(&(lat.basis[0][3]), -1); + ibz_set(&(lat.basis[1][1]), -2); + ibz_set(&(lat.basis[2][2]), 1); + ibz_set(&(lat.basis[2][1]), 1); + ibz_set(&(lat.basis[3][3]), -3); + ibz_set(&(lat.denom), 6); ibz_mat_4x4_zero(&(cmp.basis)); - ibz_set(&(cmp.basis[0][0]),6); - ibz_set(&(cmp.basis[1][1]),3); - ibz_set(&(cmp.basis[2][2]),6); - ibz_set(&(cmp.basis[3][3]),2); - ibz_set(&(cmp.denom),1); + ibz_set(&(cmp.basis[0][0]), 6); + ibz_set(&(cmp.basis[1][1]), 3); + ibz_set(&(cmp.basis[2][2]), 6); + ibz_set(&(cmp.basis[3][3]), 2); + ibz_set(&(cmp.denom), 1); quat_lattice_hnf(&lat); // test whether dual of dual is original lattice, but dual is not. - quat_lattice_dual_without_hnf(&dual,&lat); + quat_lattice_dual_without_hnf(&dual, &lat); quat_lattice_hnf(&dual); quat_lattice_hnf(&cmp); - res = res || !quat_lattice_equal(&dual,&cmp); - res = res || quat_lattice_equal(&dual,&lat); - quat_lattice_dual_without_hnf(&dual,&dual); + res = res || !quat_lattice_equal(&dual, &cmp); + res = res || quat_lattice_equal(&dual, &lat); + quat_lattice_dual_without_hnf(&dual, &dual); quat_lattice_hnf(&dual); - res = res || !quat_lattice_equal(&dual,&lat); - + res = res || !quat_lattice_equal(&dual, &lat); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test lattice_dual_without_hnf failed\n"); } quat_lattice_finalize(&lat); quat_lattice_finalize(&dual); quat_lattice_finalize(&cmp); - return(res); + return (res); } -//void quat_lattice_add(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2); -int quat_test_lattice_add(){ +// void quat_lattice_add(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t +// *lat2); +int +quat_test_lattice_add(void) +{ int res = 0; quat_lattice_t lat1, lat2, cmp, sum; quat_lattice_init(&lat1); @@ -137,72 +235,75 @@ int quat_test_lattice_add(){ ibz_mat_4x4_zero(&(lat1.basis)); ibz_mat_4x4_zero(&(lat2.basis)); ibz_mat_4x4_zero(&(cmp.basis)); - ibz_set(&(lat1.basis[0][0]),44); - ibz_set(&(lat1.basis[0][2]),3); - ibz_set(&(lat1.basis[0][3]),32); - ibz_set(&(lat2.basis[0][0]),1); - ibz_set(&(cmp.basis[0][0]),2); - ibz_set(&(cmp.basis[0][2]),1); - ibz_set(&(lat1.basis[1][1]),5); - ibz_set(&(lat2.basis[1][1]),2); - ibz_set(&(cmp.basis[1][1]),1); - ibz_set(&(lat1.basis[2][2]),3); - ibz_set(&(lat2.basis[2][2]),1); - ibz_set(&(cmp.basis[2][2]),1); - ibz_set(&(lat1.basis[3][3]),1); - ibz_set(&(lat2.basis[3][3]),3); - ibz_set(&(cmp.basis[3][3]),3); - ibz_set(&(lat1.denom),4); - ibz_set(&(lat2.denom),6); - ibz_set(&(cmp.denom),12); + ibz_set(&(lat1.basis[0][0]), 44); + ibz_set(&(lat1.basis[0][2]), 3); + ibz_set(&(lat1.basis[0][3]), 32); + ibz_set(&(lat2.basis[0][0]), 1); + ibz_set(&(cmp.basis[0][0]), 2); + ibz_set(&(cmp.basis[0][2]), 1); + ibz_set(&(lat1.basis[1][1]), 5); + ibz_set(&(lat2.basis[1][1]), 2); + ibz_set(&(cmp.basis[1][1]), 1); + ibz_set(&(lat1.basis[2][2]), 3); + ibz_set(&(lat2.basis[2][2]), 1); + ibz_set(&(cmp.basis[2][2]), 1); + ibz_set(&(lat1.basis[3][3]), 1); + ibz_set(&(lat2.basis[3][3]), 3); + ibz_set(&(cmp.basis[3][3]), 3); + ibz_set(&(lat1.denom), 4); + ibz_set(&(lat2.denom), 6); + ibz_set(&(cmp.denom), 12); - quat_lattice_add(&sum,&lat1,&lat2); - res = res || (!ibz_mat_4x4_equal(&(sum.basis),&(cmp.basis))); - res = res || ibz_cmp(&(sum.denom),&(cmp.denom)); + quat_lattice_add(&sum, &lat1, &lat2); + res = res || (!ibz_mat_4x4_equal(&(sum.basis), &(cmp.basis))); + res = res || ibz_cmp(&(sum.denom), &(cmp.denom)); // same lattices but not under hnf ibz_mat_4x4_zero(&(lat1.basis)); ibz_mat_4x4_zero(&(lat2.basis)); - ibz_set(&(lat1.basis[0][0]),4); - ibz_set(&(lat1.basis[0][2]),3); - ibz_set(&(lat2.basis[0][0]),1); - ibz_set(&(lat2.basis[0][3]),-1); - ibz_set(&(lat1.basis[1][1]),5); - ibz_set(&(lat2.basis[1][1]),-2); - ibz_set(&(lat1.basis[2][2]),3); - ibz_set(&(lat2.basis[2][2]),1); - ibz_set(&(lat2.basis[2][1]),1); - ibz_set(&(lat1.basis[3][3]),7); - ibz_set(&(lat2.basis[3][3]),-3); - ibz_set(&(lat1.denom),4); - ibz_set(&(lat2.denom),6); + ibz_set(&(lat1.basis[0][0]), 4); + ibz_set(&(lat1.basis[0][2]), 3); + ibz_set(&(lat2.basis[0][0]), 1); + ibz_set(&(lat2.basis[0][3]), -1); + ibz_set(&(lat1.basis[1][1]), 5); + ibz_set(&(lat2.basis[1][1]), -2); + ibz_set(&(lat1.basis[2][2]), 3); + ibz_set(&(lat2.basis[2][2]), 1); + ibz_set(&(lat2.basis[2][1]), 1); + ibz_set(&(lat1.basis[3][3]), 7); + ibz_set(&(lat2.basis[3][3]), -3); + ibz_set(&(lat1.denom), 4); + ibz_set(&(lat2.denom), 6); - quat_lattice_add(&sum,&lat1,&lat2); - res = res || (!ibz_mat_4x4_equal(&(sum.basis),&(cmp.basis))); - res = res || ibz_cmp(&(sum.denom),&(cmp.denom)); + quat_lattice_add(&sum, &lat1, &lat2); + res = res || (!ibz_mat_4x4_equal(&(sum.basis), &(cmp.basis))); + res = res || ibz_cmp(&(sum.denom), &(cmp.denom)); - //double in place gives hnf - ibz_mat_4x4_copy(&(cmp.basis),&lat2.basis); - ibz_copy(&(cmp.denom),&(lat2.denom)); + // double in place gives hnf + ibz_mat_4x4_copy(&(cmp.basis), &lat2.basis); + ibz_copy(&(cmp.denom), &(lat2.denom)); quat_lattice_hnf(&cmp); - quat_lattice_add(&lat2,&lat2,&lat2); - res = res || (!ibz_mat_4x4_equal(&(lat2.basis),&(cmp.basis))); - res = res || ibz_cmp(&(lat2.denom),&(cmp.denom)); + quat_lattice_add(&lat2, &lat2, &lat2); + res = res || (!ibz_mat_4x4_equal(&(lat2.basis), &(cmp.basis))); + res = res || ibz_cmp(&(lat2.denom), &(cmp.denom)); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test lattice_add failed\n"); } quat_lattice_finalize(&lat1); quat_lattice_finalize(&lat2); quat_lattice_finalize(&sum); quat_lattice_finalize(&cmp); - return(res); + return (res); } -//void quat_lattice_intersect(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2); -int quat_test_lattice_intersect(){ +// void quat_lattice_intersect(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t +// *lat2); +int +quat_test_lattice_intersect(void) +{ int res = 0; - quat_lattice_t lat1,lat2, inter, cmp; + quat_lattice_t lat1, lat2, inter, cmp; quat_lattice_init(&lat1); quat_lattice_init(&lat2); quat_lattice_init(&inter); @@ -210,50 +311,163 @@ int quat_test_lattice_intersect(){ ibz_mat_4x4_zero(&(cmp.basis)); ibz_mat_4x4_zero(&(lat1.basis)); ibz_mat_4x4_zero(&(lat2.basis)); - ibz_set(&(lat1.basis[0][0]),4); - ibz_set(&(lat1.basis[0][2]),3); - ibz_set(&(lat2.basis[0][0]),1); - ibz_set(&(lat2.basis[0][3]),-1); - ibz_set(&(lat1.basis[1][1]),5); - ibz_set(&(lat2.basis[1][1]),-2); - ibz_set(&(lat1.basis[2][2]),3); - ibz_set(&(lat2.basis[2][2]),1); - ibz_set(&(lat2.basis[2][1]),1); - ibz_set(&(lat1.basis[3][3]),7); - ibz_set(&(lat2.basis[3][3]),-3); - ibz_set(&(lat1.denom),4); - ibz_set(&(lat2.denom),6); + ibz_set(&(lat1.basis[0][0]), 4); + ibz_set(&(lat1.basis[0][2]), 3); + ibz_set(&(lat2.basis[0][0]), 1); + ibz_set(&(lat2.basis[0][3]), -1); + ibz_set(&(lat1.basis[1][1]), 5); + ibz_set(&(lat2.basis[1][1]), -2); + ibz_set(&(lat1.basis[2][2]), 3); + ibz_set(&(lat2.basis[2][2]), 1); + ibz_set(&(lat2.basis[2][1]), 1); + ibz_set(&(lat1.basis[3][3]), 7); + ibz_set(&(lat2.basis[3][3]), -3); + ibz_set(&(lat1.denom), 4); + ibz_set(&(lat2.denom), 6); quat_lattice_hnf(&lat1); quat_lattice_hnf(&lat2); - - ibz_set(&(cmp.basis[0][0]),2); - ibz_set(&(cmp.basis[0][2]),1); - ibz_set(&(cmp.basis[1][1]),10); - ibz_set(&(cmp.basis[2][2]),3); - ibz_set(&(cmp.basis[3][3]),7); - ibz_set(&(cmp.denom),2); - quat_lattice_intersect(&inter,&lat1,&lat2); - res = res || !quat_lattice_equal(&inter,&cmp); - quat_lattice_intersect(&lat2,&lat1,&lat2); - res = res || !quat_lattice_equal(&lat2,&cmp); - ibz_mat_4x4_copy(&(cmp.basis),&(lat1.basis)); - ibz_copy(&(cmp.denom),&(lat1.denom)); - quat_lattice_intersect(&lat1,&lat1,&lat1); - res = res || !quat_lattice_equal(&lat1,&cmp); + ibz_set(&(cmp.basis[0][0]), 2); + ibz_set(&(cmp.basis[0][2]), 1); + ibz_set(&(cmp.basis[1][1]), 10); + ibz_set(&(cmp.basis[2][2]), 3); + ibz_set(&(cmp.basis[3][3]), 7); + ibz_set(&(cmp.denom), 2); + quat_lattice_intersect(&inter, &lat1, &lat2); - if (res != 0){ + res = res || !quat_lattice_equal(&inter, &cmp); + quat_lattice_intersect(&lat2, &lat1, &lat2); + res = res || !quat_lattice_equal(&lat2, &cmp); + ibz_mat_4x4_copy(&(cmp.basis), &(lat1.basis)); + ibz_copy(&(cmp.denom), &(lat1.denom)); + quat_lattice_intersect(&lat1, &lat1, &lat1); + res = res || !quat_lattice_equal(&lat1, &cmp); + + if (res != 0) { printf("Quaternion unit test lattice_intersect failed\n"); } quat_lattice_finalize(&lat1); quat_lattice_finalize(&lat2); quat_lattice_finalize(&inter); quat_lattice_finalize(&cmp); - return(res); + return (res); } -//void quat_lattice_mul(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2, const quat_alg_t *alg); -int quat_test_lattice_mul(){ +// void quat_lattice_mat_alg_coord_mul_without_hnf(ibz_mat_4x4_t *prod, const ibz_mat_4x4_t *lat, +// const ibz_vec_4_t *coord, const quat_alg_t *alg); +int +quat_test_lattice_mat_alg_coord_mul_without_hnf(void) +{ + int res = 0; + ibz_mat_4x4_t prod, cmp, lat; + ibz_vec_4_t elem; + quat_alg_t alg; + ibz_mat_4x4_init(&prod); + ibz_mat_4x4_init(&cmp); + ibz_mat_4x4_init(&lat); + ibz_vec_4_init(&elem); + quat_alg_init_set_ui(&alg, 23); + ibz_vec_4_set(&elem, 3, 4, -1, 0); + ibz_set(&(lat[0][0]), 11); + ibz_set(&(lat[1][1]), 13); + ibz_set(&(lat[2][2]), 15); + ibz_set(&(lat[3][3]), 4); + ibz_set(&(lat[0][1]), 9); + ibz_set(&(lat[1][3]), 1); + quat_lattice_mat_alg_coord_mul_without_hnf(&prod, &lat, &elem, &alg); + ibz_set(&(cmp[0][0]), 33); + ibz_set(&(cmp[1][0]), 44); + ibz_set(&(cmp[2][0]), -11); + ibz_set(&(cmp[3][0]), 0); + ibz_set(&(cmp[0][1]), 27 - 4 * 13); + ibz_set(&(cmp[1][1]), 36 + 3 * 13); + ibz_set(&(cmp[2][1]), -9 + 0); + ibz_set(&(cmp[3][1]), 0 - 13); + ibz_set(&(cmp[0][2]), 15 * 23); + ibz_set(&(cmp[1][2]), 0); + ibz_set(&(cmp[2][2]), 45); + ibz_set(&(cmp[3][2]), -60); + ibz_set(&(cmp[0][3]), -4); + ibz_set(&(cmp[1][3]), 3 + 23 * 4); + ibz_set(&(cmp[2][3]), 0 + 4 * 4); + ibz_set(&(cmp[3][3]), -1 + 4 * 3); + res = res || !ibz_mat_4x4_equal(&cmp, &prod); + quat_lattice_mat_alg_coord_mul_without_hnf(&lat, &lat, &elem, &alg); + res = res || !ibz_mat_4x4_equal(&cmp, &lat); + + if (res != 0) { + printf("Quaternion unit test lattice_mat_alg_coord_mul_without_hnf failed\n"); + } + ibz_mat_4x4_finalize(&prod); + ibz_mat_4x4_finalize(&cmp); + ibz_mat_4x4_finalize(&lat); + ibz_vec_4_finalize(&elem); + quat_alg_finalize(&alg); + return (res); +} + +// void quat_lattice_alg_elem_mul(quat_lattice_t *prod, const quat_lattice_t *lat, const +// quat_alg_elem_t *elem, const quat_alg_t *alg); +int +quat_test_lattice_alg_elem_mul(void) +{ + int res = 0; + quat_lattice_t prod, cmp, lat; + quat_alg_elem_t elem; + quat_alg_t alg; + quat_lattice_init(&prod); + quat_lattice_init(&cmp); + quat_lattice_init(&lat); + quat_alg_elem_init(&elem); + quat_alg_init_set_ui(&alg, 23); + quat_alg_elem_set(&elem, 2, 3, 4, -1, 0); + ibz_set(&(lat.basis[0][0]), 11); + ibz_set(&(lat.basis[1][1]), -13); + ibz_set(&(lat.basis[2][2]), 15); + ibz_set(&(lat.basis[3][3]), -4); + ibz_set(&(lat.basis[0][1]), 2); + ibz_set(&(lat.basis[1][3]), -1); + ibz_set(&(lat.denom), 5); + quat_lattice_hnf(&lat); + quat_lattice_alg_elem_mul(&prod, &lat, &elem, &alg); + ibz_set(&(cmp.basis[0][0]), 33); + ibz_set(&(cmp.basis[1][0]), 44); + ibz_set(&(cmp.basis[2][0]), -11); + ibz_set(&(cmp.basis[3][0]), 0); + ibz_set(&(cmp.basis[0][1]), 27 - 4 * 13); + ibz_set(&(cmp.basis[1][1]), 36 + 3 * 13); + ibz_set(&(cmp.basis[2][1]), -9 + 0); + ibz_set(&(cmp.basis[3][1]), 0 - 13); + ibz_set(&(cmp.basis[0][2]), 15 * 23); + ibz_set(&(cmp.basis[1][2]), 0); + ibz_set(&(cmp.basis[2][2]), 45); + ibz_set(&(cmp.basis[3][2]), -60); + ibz_set(&(cmp.basis[0][3]), -4); + ibz_set(&(cmp.basis[1][3]), 3 + 23 * 4); + ibz_set(&(cmp.basis[2][3]), 0 + 4 * 4); + ibz_set(&(cmp.basis[3][3]), -1 + 4 * 3); + ibz_set(&(cmp.denom), 10); + quat_lattice_hnf(&cmp); + res = res || !quat_lattice_equal(&cmp, &prod); + quat_lattice_alg_elem_mul(&lat, &lat, &elem, &alg); + res = res || !quat_lattice_equal(&cmp, &lat); + + if (res != 0) { + printf("Quaternion unit test lattice_alg_elem_mul failed\n"); + } + quat_lattice_finalize(&prod); + quat_lattice_finalize(&cmp); + quat_lattice_finalize(&lat); + quat_alg_elem_finalize(&elem); + quat_alg_finalize(&alg); + return (res); +} + +// void quat_lattice_mul(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t +// *lat2, const quat_alg_t *alg); +int +quat_test_lattice_mul(void) +{ int res = 0; quat_lattice_t lat1, lat2, cmp, prod; quat_alg_t alg; @@ -263,77 +477,77 @@ int quat_test_lattice_mul(){ quat_lattice_init(&cmp); quat_alg_init_set_ui(&alg, 19); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(lat1.basis[i][j]),0); - ibz_set(&(lat2.basis[i][j]),0); - ibz_set(&(cmp.basis[i][j]),0); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(lat1.basis[i][j]), 0); + ibz_set(&(lat2.basis[i][j]), 0); + ibz_set(&(cmp.basis[i][j]), 0); } } - ibz_set(&(lat1.basis[0][0]),44); - ibz_set(&(lat1.basis[0][2]),3); - ibz_set(&(lat1.basis[0][3]),32); - ibz_set(&(lat2.basis[0][0]),1); - ibz_set(&(cmp.basis[0][0]),1); - ibz_set(&(lat1.basis[1][1]),5); - ibz_set(&(lat2.basis[1][1]),2); - ibz_set(&(cmp.basis[1][1]),1); - ibz_set(&(lat1.basis[2][2]),3); - ibz_set(&(lat2.basis[2][2]),1); - ibz_set(&(cmp.basis[2][2]),1); - ibz_set(&(lat1.basis[3][3]),1); - ibz_set(&(lat2.basis[3][3]),3); - ibz_set(&(cmp.basis[3][3]),1); - ibz_set(&(lat1.denom),4); - ibz_set(&(lat2.denom),6); - ibz_set(&(cmp.denom),24); + ibz_set(&(lat1.basis[0][0]), 44); + ibz_set(&(lat1.basis[0][2]), 3); + ibz_set(&(lat1.basis[0][3]), 32); + ibz_set(&(lat2.basis[0][0]), 1); + ibz_set(&(cmp.basis[0][0]), 1); + ibz_set(&(lat1.basis[1][1]), 5); + ibz_set(&(lat2.basis[1][1]), 2); + ibz_set(&(cmp.basis[1][1]), 1); + ibz_set(&(lat1.basis[2][2]), 3); + ibz_set(&(lat2.basis[2][2]), 1); + ibz_set(&(cmp.basis[2][2]), 1); + ibz_set(&(lat1.basis[3][3]), 1); + ibz_set(&(lat2.basis[3][3]), 3); + ibz_set(&(cmp.basis[3][3]), 1); + ibz_set(&(lat1.denom), 4); + ibz_set(&(lat2.denom), 6); + ibz_set(&(cmp.denom), 24); - quat_lattice_mul(&prod,&lat1,&lat2,&alg); - res = res || (!ibz_mat_4x4_equal(&(prod.basis),&(cmp.basis))); - res = res || ibz_cmp(&(prod.denom),&(cmp.denom)); + quat_lattice_mul(&prod, &lat1, &lat2, &alg); + res = res || (!ibz_mat_4x4_equal(&(prod.basis), &(cmp.basis))); + res = res || ibz_cmp(&(prod.denom), &(cmp.denom)); // same lattices but not under hnf - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(lat1.basis[i][j]),0); - ibz_set(&(lat2.basis[i][j]),0); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(lat1.basis[i][j]), 0); + ibz_set(&(lat2.basis[i][j]), 0); } } - ibz_set(&(lat1.basis[0][0]),4); - ibz_set(&(lat1.basis[0][2]),3); - ibz_set(&(lat2.basis[0][0]),1); - ibz_set(&(lat2.basis[0][3]),-1); - ibz_set(&(lat1.basis[1][1]),5); - ibz_set(&(lat2.basis[1][1]),-2); - ibz_set(&(lat1.basis[2][2]),3); - ibz_set(&(lat2.basis[2][2]),1); - ibz_set(&(lat2.basis[2][1]),1); - ibz_set(&(lat1.basis[3][3]),7); - ibz_set(&(lat2.basis[3][3]),-3); - ibz_set(&(lat1.denom),4); - ibz_set(&(lat2.denom),6); + ibz_set(&(lat1.basis[0][0]), 4); + ibz_set(&(lat1.basis[0][2]), 3); + ibz_set(&(lat2.basis[0][0]), 1); + ibz_set(&(lat2.basis[0][3]), -1); + ibz_set(&(lat1.basis[1][1]), 5); + ibz_set(&(lat2.basis[1][1]), -2); + ibz_set(&(lat1.basis[2][2]), 3); + ibz_set(&(lat2.basis[2][2]), 1); + ibz_set(&(lat2.basis[2][1]), 1); + ibz_set(&(lat1.basis[3][3]), 7); + ibz_set(&(lat2.basis[3][3]), -3); + ibz_set(&(lat1.denom), 4); + ibz_set(&(lat2.denom), 6); - quat_lattice_mul(&prod,&lat1,&lat2,&alg); - res = res || (!ibz_mat_4x4_equal(&(prod.basis),&(cmp.basis))); - res = res || ibz_cmp(&(prod.denom),&(cmp.denom)); + quat_lattice_mul(&prod, &lat1, &lat2, &alg); + res = res || (!ibz_mat_4x4_equal(&(prod.basis), &(cmp.basis))); + res = res || ibz_cmp(&(prod.denom), &(cmp.denom)); - //double in place gives hnf - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(cmp.basis[i][j]),0); + // double in place gives hnf + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(cmp.basis[i][j]), 0); } } - ibz_set(&(cmp.basis[0][0]),1); - ibz_set(&(cmp.basis[1][1]),1); - ibz_set(&(cmp.basis[2][2]),1); - ibz_set(&(cmp.basis[3][3]),1); - ibz_set(&(cmp.denom),36); - quat_lattice_mul(&lat2,&lat2,&lat2,&alg); - res = res || (!ibz_mat_4x4_equal(&(lat2.basis),&(cmp.basis))); - res = res || ibz_cmp(&(lat2.denom),&(cmp.denom)); + ibz_set(&(cmp.basis[0][0]), 1); + ibz_set(&(cmp.basis[1][1]), 1); + ibz_set(&(cmp.basis[2][2]), 1); + ibz_set(&(cmp.basis[3][3]), 1); + ibz_set(&(cmp.denom), 36); + quat_lattice_mul(&lat2, &lat2, &lat2, &alg); + res = res || (!ibz_mat_4x4_equal(&(lat2.basis), &(cmp.basis))); + res = res || ibz_cmp(&(lat2.denom), &(cmp.denom)); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test lattice_mul failed\n"); } quat_lattice_finalize(&lat1); @@ -341,178 +555,101 @@ int quat_test_lattice_mul(){ quat_lattice_finalize(&prod); quat_lattice_finalize(&cmp); quat_alg_finalize(&alg); - return(res); + return (res); } -//int quat_lattice_contains_without_alg(quat_alg_coord_t *coord, const quat_lattice_t *lat, const quat_alg_elem_t *x); -int quat_test_lattice_contains_without_alg(){ - int res = 0; - quat_alg_elem_t x; - quat_alg_coord_t coord, cmp; - quat_lattice_t lat; - quat_alg_elem_init(&x); - quat_alg_coord_init(&coord); - quat_alg_coord_init(&cmp); - quat_lattice_init(&lat); - - // lattice 1 - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(lat.basis[i][j]),0); - } - } - ibz_set(&(lat.basis[0][0]),4); - ibz_set(&(lat.basis[0][2]),3); - ibz_set(&(lat.basis[1][1]),5); - ibz_set(&(lat.basis[2][2]),3); - ibz_set(&(lat.basis[3][3]),7); - ibz_set(&(lat.denom),4); - - // x 1, should fail - ibz_set(&(x.denom),3); - ibz_set(&(x.coord[0]),1); - ibz_set(&(x.coord[1]),-2); - ibz_set(&(x.coord[2]),26); - ibz_set(&(x.coord[3]),9); - - res = res || quat_lattice_contains_without_alg(&coord,&lat,&x); - // again, but with NULL - res = res || quat_lattice_contains_without_alg(NULL,&lat,&x); - - - // lattice 2 - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(lat.basis[i][j]),0); - } - } - ibz_set(&(lat.basis[0][0]),1); - ibz_set(&(lat.basis[0][3]),-1); - ibz_set(&(lat.basis[1][1]),-2); - ibz_set(&(lat.basis[2][2]),1); - ibz_set(&(lat.basis[2][1]),1); - ibz_set(&(lat.basis[3][3]),-3); - ibz_set(&(lat.denom),6); - quat_lattice_hnf(&lat); - // x 1, should succeed - ibz_set(&(x.denom),3); - ibz_set(&(x.coord[0]),1); - ibz_set(&(x.coord[1]),-2); - ibz_set(&(x.coord[2]),26); - ibz_set(&(x.coord[3]),9); - ibz_set(&(cmp[0]),2); - ibz_set(&(cmp[1]),-2); - ibz_set(&(cmp[2]),52); - ibz_set(&(cmp[3]),6); - - res = res || (0==quat_lattice_contains_without_alg(&coord,&lat,&x)); - - res = res || ibz_cmp(&(coord[0]),&(cmp[0])); - res = res || ibz_cmp(&(coord[1]),&(cmp[1])); - res = res || ibz_cmp(&(coord[2]),&(cmp[2])); - res = res || ibz_cmp(&(coord[3]),&(cmp[3])); - // again, but with NULL - res = res || (0==quat_lattice_contains_without_alg(NULL,&lat,&x)); - - - if (res != 0){ - printf("Quaternion unit test lattice_contains_without_alg failed\n"); - } - quat_alg_elem_finalize(&x); - quat_alg_coord_finalize(&coord); - quat_alg_coord_finalize(&cmp); - quat_lattice_finalize(&lat); - return(res); -} - -//int quat_lattice_contains(quat_alg_coord_t *coord, const quat_lattice_t *lat, const quat_alg_elem_t *x, const quat_alg_t *alg); -int quat_test_lattice_contains(){ +// int quat_lattice_contains(quat_alg_coord_t *coord, const quat_lattice_t *lat, const +// quat_alg_elem_t *x, const quat_alg_t *alg); +int +quat_test_lattice_contains(void) +{ int res = 0; quat_alg_t alg; quat_alg_elem_t x; - quat_alg_coord_t coord, cmp; + ibz_vec_4_t coord, cmp; quat_lattice_t lat; quat_alg_init_set_ui(&alg, 103); quat_alg_elem_init(&x); - quat_alg_coord_init(&coord); - quat_alg_coord_init(&cmp); + ibz_vec_4_init(&coord); + ibz_vec_4_init(&cmp); quat_lattice_init(&lat); // lattice 1 - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(lat.basis[i][j]),0); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(lat.basis[i][j]), 0); } } - ibz_set(&(lat.basis[0][0]),4); - ibz_set(&(lat.basis[0][2]),3); - ibz_set(&(lat.basis[1][1]),5); - ibz_set(&(lat.basis[2][2]),3); - ibz_set(&(lat.basis[3][3]),7); - ibz_set(&(lat.denom),4); + ibz_set(&(lat.basis[0][0]), 4); + ibz_set(&(lat.basis[0][2]), 3); + ibz_set(&(lat.basis[1][1]), 5); + ibz_set(&(lat.basis[2][2]), 3); + ibz_set(&(lat.basis[3][3]), 7); + ibz_set(&(lat.denom), 4); // x 1, should fail - ibz_set(&(x.denom),3); - ibz_set(&(x.coord[0]),1); - ibz_set(&(x.coord[1]),-2); - ibz_set(&(x.coord[2]),26); - ibz_set(&(x.coord[3]),9); + ibz_set(&(x.denom), 3); + ibz_set(&(x.coord[0]), 1); + ibz_set(&(x.coord[1]), -2); + ibz_set(&(x.coord[2]), 26); + ibz_set(&(x.coord[3]), 9); - res = res || quat_lattice_contains(&coord,&lat,&x,&alg); + res = res || quat_lattice_contains(&coord, &lat, &x); // again, but with NULL - res = res || quat_lattice_contains(NULL,&lat,&x,&alg); - + res = res || quat_lattice_contains(NULL, &lat, &x); // lattice 2 - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(lat.basis[i][j]),0); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(lat.basis[i][j]), 0); } } - ibz_set(&(lat.basis[0][0]),1); - ibz_set(&(lat.basis[0][3]),-1); - ibz_set(&(lat.basis[1][1]),-2); - ibz_set(&(lat.basis[2][2]),1); - ibz_set(&(lat.basis[2][1]),1); - ibz_set(&(lat.basis[3][3]),-3); - ibz_set(&(lat.denom),6); + ibz_set(&(lat.basis[0][0]), 1); + ibz_set(&(lat.basis[0][3]), -1); + ibz_set(&(lat.basis[1][1]), -2); + ibz_set(&(lat.basis[2][2]), 1); + ibz_set(&(lat.basis[2][1]), 1); + ibz_set(&(lat.basis[3][3]), -3); + ibz_set(&(lat.denom), 6); quat_lattice_hnf(&lat); // x 1, should succeed - ibz_set(&(x.denom),3); - ibz_set(&(x.coord[0]),1); - ibz_set(&(x.coord[1]),-2); - ibz_set(&(x.coord[2]),26); - ibz_set(&(x.coord[3]),9); - ibz_set(&(cmp[0]),2); - ibz_set(&(cmp[1]),-2); - ibz_set(&(cmp[2]),52); - ibz_set(&(cmp[3]),6); + ibz_set(&(x.denom), 3); + ibz_set(&(x.coord[0]), 1); + ibz_set(&(x.coord[1]), -2); + ibz_set(&(x.coord[2]), 26); + ibz_set(&(x.coord[3]), 9); + ibz_set(&(cmp[0]), 2); + ibz_set(&(cmp[1]), -2); + ibz_set(&(cmp[2]), 52); + ibz_set(&(cmp[3]), 6); - res = res || (0==quat_lattice_contains(&coord,&lat,&x,&alg)); + res = res || (0 == quat_lattice_contains(&coord, &lat, &x)); - res = res || ibz_cmp(&(coord[0]),&(cmp[0])); - res = res || ibz_cmp(&(coord[1]),&(cmp[1])); - res = res || ibz_cmp(&(coord[2]),&(cmp[2])); - res = res || ibz_cmp(&(coord[3]),&(cmp[3])); + res = res || ibz_cmp(&(coord[0]), &(cmp[0])); + res = res || ibz_cmp(&(coord[1]), &(cmp[1])); + res = res || ibz_cmp(&(coord[2]), &(cmp[2])); + res = res || ibz_cmp(&(coord[3]), &(cmp[3])); // again, but with NULL - res = res || (0==quat_lattice_contains(NULL,&lat,&x,&alg)); + res = res || (0 == quat_lattice_contains(NULL, &lat, &x)); - - if (res != 0){ + if (res != 0) { printf("Quaternion unit test lattice_contains failed\n"); } quat_alg_finalize(&alg); quat_alg_elem_finalize(&x); - quat_alg_coord_finalize(&coord); - quat_alg_coord_finalize(&cmp); + ibz_vec_4_finalize(&coord); + ibz_vec_4_finalize(&cmp); quat_lattice_finalize(&lat); - return(res); + return (res); } -//void quat_lattice_index(ibz_t *index, const quat_lattice_t *sublat, const quat_lattice_t *overlat); -int quat_test_lattice_index(){ +// void quat_lattice_index(ibz_t *index, const quat_lattice_t *sublat, const quat_lattice_t +// *overlat); +int +quat_test_lattice_index(void) +{ int res = 0; - quat_lattice_t sublat,overlat; + quat_lattice_t sublat, overlat; ibz_t index; ibz_init(&index); quat_lattice_init(&sublat); @@ -520,267 +657,187 @@ int quat_test_lattice_index(){ ibz_mat_4x4_zero(&(sublat.basis)); ibz_mat_4x4_identity(&(overlat.basis)); - ibz_set(&(overlat.denom),2); - ibz_set(&(sublat.basis[0][0]),2); - ibz_set(&(sublat.basis[0][1]),0); - ibz_set(&(sublat.basis[0][2]),1); - ibz_set(&(sublat.basis[0][3]),0); - ibz_set(&(sublat.basis[1][0]),0); - ibz_set(&(sublat.basis[1][1]),4); - ibz_set(&(sublat.basis[1][2]),2); - ibz_set(&(sublat.basis[1][3]),3); - ibz_set(&(sublat.basis[2][0]),0); - ibz_set(&(sublat.basis[2][1]),0); - ibz_set(&(sublat.basis[2][2]),1); - ibz_set(&(sublat.basis[2][3]),0); - ibz_set(&(sublat.basis[3][0]),0); - ibz_set(&(sublat.basis[3][1]),0); - ibz_set(&(sublat.basis[3][2]),0); - ibz_set(&(sublat.basis[3][3]),1); - ibz_set(&(sublat.denom),2); - quat_lattice_index(&index,&sublat,&overlat); + ibz_set(&(overlat.denom), 2); + ibz_set(&(sublat.basis[0][0]), 2); + ibz_set(&(sublat.basis[0][1]), 0); + ibz_set(&(sublat.basis[0][2]), 1); + ibz_set(&(sublat.basis[0][3]), 0); + ibz_set(&(sublat.basis[1][0]), 0); + ibz_set(&(sublat.basis[1][1]), 4); + ibz_set(&(sublat.basis[1][2]), 2); + ibz_set(&(sublat.basis[1][3]), 3); + ibz_set(&(sublat.basis[2][0]), 0); + ibz_set(&(sublat.basis[2][1]), 0); + ibz_set(&(sublat.basis[2][2]), 1); + ibz_set(&(sublat.basis[2][3]), 0); + ibz_set(&(sublat.basis[3][0]), 0); + ibz_set(&(sublat.basis[3][1]), 0); + ibz_set(&(sublat.basis[3][2]), 0); + ibz_set(&(sublat.basis[3][3]), 1); + ibz_set(&(sublat.denom), 2); + quat_lattice_index(&index, &sublat, &overlat); - res = res || !(ibz_get(&index)==8); + res = res || !(ibz_cmp_int32(&index, 8) == 0); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test lattice_index failed\n"); } quat_lattice_finalize(&sublat); quat_lattice_finalize(&overlat); ibz_finalize(&index); - return(res); + return (res); } -//void quat_lattice_hnf(quat_lattice_t *lat); -int quat_test_lattice_hnf(){ +// void quat_lattice_hnf(quat_lattice_t *lat); +int +quat_test_lattice_hnf(void) +{ int res = 0; quat_lattice_t lat, cmp; quat_lattice_init(&lat); quat_lattice_init(&cmp); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(lat.basis[i][j]),0); - ibz_set(&(cmp.basis[i][j]),0); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(lat.basis[i][j]), 0); + ibz_set(&(cmp.basis[i][j]), 0); } } - ibz_set(&(lat.basis[0][0]),1); - ibz_set(&(lat.basis[0][3]),-1); - ibz_set(&(lat.basis[1][1]),-2); - ibz_set(&(lat.basis[2][2]),1); - ibz_set(&(lat.basis[2][1]),1); - ibz_set(&(lat.basis[3][3]),-3); - ibz_set(&(cmp.basis[0][0]),1); - ibz_set(&(cmp.basis[1][1]),2); - ibz_set(&(cmp.basis[2][2]),1); - ibz_set(&(cmp.basis[3][3]),3); - ibz_set(&(cmp.denom),6); - ibz_set(&(lat.denom),6); + ibz_set(&(lat.basis[0][0]), 1); + ibz_set(&(lat.basis[0][3]), -1); + ibz_set(&(lat.basis[1][1]), -2); + ibz_set(&(lat.basis[2][2]), 1); + ibz_set(&(lat.basis[2][1]), 1); + ibz_set(&(lat.basis[3][3]), -3); + ibz_set(&(cmp.basis[0][0]), 1); + ibz_set(&(cmp.basis[1][1]), 2); + ibz_set(&(cmp.basis[2][2]), 1); + ibz_set(&(cmp.basis[3][3]), 3); + ibz_set(&(cmp.denom), 6); + ibz_set(&(lat.denom), 6); quat_lattice_hnf(&lat); - res = res || (!ibz_mat_4x4_equal(&(lat.basis),&(cmp.basis))); - res = res || ibz_cmp(&(lat.denom),&(cmp.denom)); + res = res || (!ibz_mat_4x4_equal(&(lat.basis), &(cmp.basis))); + res = res || ibz_cmp(&(lat.denom), &(cmp.denom)); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test lattice_hnf failed\n"); } quat_lattice_finalize(&lat); quat_lattice_finalize(&cmp); - return(res); + return (res); } -//int quat_lattice_lll(ibz_mat_4x4_t *red, const quat_lattice_t *lattice, const ibz_t *q, int precision); -int quat_test_lattice_lll(){ - int res = 0; - quat_lattice_t lat, test; - ibz_mat_4x4_t red; - ibz_t num, denom, q; - ibq_t coeff; - ibz_init(&num); - ibz_init(&denom); - ibz_init(&q); - ibq_init(&coeff); - ibz_mat_4x4_init(&red); - quat_lattice_init(&lat); - quat_lattice_init(&test); - - // set lattice - ibz_set(&lat.denom, 60); - ibz_mat_4x4_zero(&(lat.basis)); - ibz_set(&lat.basis[0][0], 3); - ibz_set(&lat.basis[1][0], 7); - ibz_set(&lat.basis[0][1], 1); - ibz_set(&lat.basis[3][1], -6); - ibz_set(&lat.basis[1][2], 12); - ibz_set(&lat.basis[2][2], 5); - ibz_set(&lat.basis[0][3], -19); - ibz_set(&lat.basis[3][3], 3); - - quat_lattice_hnf(&lat); - - ibz_set(&q,103); - res = res || quat_lattice_lll(&red,&lat,&q,10); - // test lll reduced - ibz_set(&num,3); - ibz_set(&denom,4); - ibq_set(&coeff,&num,&denom); - res = res || !quat_dim4_lll_verify(&red,&coeff,&q); - // test lattice equality - ibz_copy(&(test.denom),&(lat.denom)); - ibz_mat_4x4_copy(&(test.basis),&(red)); - quat_lattice_hnf(&test); - res = res || !quat_lattice_equal(&test,&lat); - - if (res != 0){ - printf("Quaternion unit test lattice_lll failed\n"); - } - ibz_finalize(&num); - ibz_finalize(&denom); - ibz_finalize(&q); - ibq_finalize(&coeff); - ibz_mat_4x4_finalize(&red); - quat_lattice_finalize(&lat); - quat_lattice_finalize(&test); - return(res); -} - -//int quat_lattice_random_elem(quat_alg_elem_t *elem, const quat_lattice_t *lattice, unsigned char n) -int quat_test_lattice_random_elem(){ - int res = 0; - - quat_lattice_t lat; - quat_alg_elem_t elem; - quat_lattice_init(&lat); - quat_alg_elem_init(&elem); - - ibz_set(&lat.denom, 60); - ibz_set(&lat.basis[0][0], 3); - ibz_set(&lat.basis[1][0], 7); - ibz_set(&lat.basis[0][1], 1); - ibz_set(&lat.basis[3][1], -6); - ibz_set(&lat.basis[1][2], 12); - ibz_set(&lat.basis[2][2], 5); - ibz_set(&lat.basis[0][3], -19); - ibz_set(&lat.basis[3][3], 3); - quat_lattice_hnf(&lat); - - for (int i = 0; i <= 10; i++) { - int prng = quat_lattice_random_elem(&elem, &lat, 3); - assert(prng); - res |= !quat_lattice_contains_without_alg(&elem.coord, &lat, &elem); - for (int j = 0; j < 4; j++) { - res |= !(ibz_get(&elem.coord[j]) < (1 << 2)); - res |= !(-(1 << 2) <= ibz_get(&elem.coord[j])); - } - } - - quat_lattice_finalize(&lat); - quat_alg_elem_finalize(&elem); - - if (res != 0){ - printf("Quaternion unit test lattice_random_elem failed\n"); - } - return res; -} - -//void quat_lattice_right_transporter(quat_lattice_t *trans, const quat_lattice_t *lat1, const quat_lattice_t *lat1) -int quat_test_lattice_right_transporter_hnf(){ +int +quat_test_lattice_gram() +{ int res = 0; + quat_lattice_t lattice; + ibz_mat_4x4_t gram; + ibz_t test, norm1, norm2; + ibz_vec_4_t vec1, vec2; + quat_alg_elem_t elem1, elem2; quat_alg_t alg; - quat_lattice_t lat1, lat2, trans, exp; + quat_lattice_init(&lattice); + ibz_mat_4x4_init(&gram); + ibz_init(&test); + ibz_init(&norm1); + ibz_init(&norm2); + ibz_vec_4_init(&vec1); + ibz_vec_4_init(&vec2); + quat_alg_elem_init(&elem1); + quat_alg_elem_init(&elem2); quat_alg_init_set_ui(&alg, 103); - quat_lattice_init(&lat1); - quat_lattice_init(&lat2); - quat_lattice_init(&trans); - quat_lattice_init(&exp); - ibz_set(&lat1.basis[0][0], 9); - ibz_set(&lat1.basis[0][1], 4); - ibz_set(&lat1.basis[0][2], 7); - ibz_set(&lat1.basis[1][1], 12); - ibz_set(&lat1.basis[1][3], 6); - ibz_set(&lat1.basis[2][2], 8); - ibz_set(&lat1.basis[2][3], 3); - ibz_set(&lat1.basis[3][3], 3); - ibz_set(&lat1.denom, 11); + quat_lattice_O0_set(&lattice); + quat_lattice_gram(&gram, &lattice, &alg); + quat_alg_elem_set(&elem1, 1, 2, 3, 4, 1); + quat_alg_elem_set(&elem2, 1, 2, 4, 4, 1); + quat_lattice_contains(&vec1, &lattice, &elem1); + quat_lattice_contains(&vec2, &lattice, &elem2); + quat_alg_conj(&elem2, &elem2); + quat_alg_mul(&elem1, &elem1, &elem2, &alg); + ibz_mul(&norm1, &(elem1.coord[0]), &ibz_const_two); + ibz_div(&norm1, &test, &norm1, &(elem1.denom)); - quat_lattice_mul(&lat2, &lat1, &lat1, &alg); - quat_lattice_right_transporter(&trans, &lat1, &lat2, &alg); - - ibz_set(&exp.basis[0][0], 1); - ibz_set(&exp.basis[1][1], 12); - ibz_set(&exp.basis[1][3], 6); - ibz_set(&exp.basis[2][2], 8); - ibz_set(&exp.basis[2][3], 3); - ibz_set(&exp.basis[3][3], 3); - ibz_set(&exp.denom, 11); - - res |= !quat_lattice_equal(&trans, &exp); - - ibz_set(&(alg.p),19); - ibz_set(&(alg.gram[2][2]),19); - ibz_set(&(alg.gram[3][3]),19); - ibz_set(&lat1.basis[0][0], -12); - ibz_set(&lat1.basis[0][1], 60); - ibz_set(&lat1.basis[0][2], 42); - ibz_set(&lat1.basis[0][3], 60); - ibz_set(&lat1.basis[1][0], 9); - ibz_set(&lat1.basis[1][1], 24); - ibz_set(&lat1.basis[1][2], 0); - ibz_set(&lat1.basis[1][3], -21); - ibz_set(&lat1.basis[2][0], 0); - ibz_set(&lat1.basis[2][1], -18); - ibz_set(&lat1.basis[2][2], 27); - ibz_set(&lat1.basis[2][3], 3); - ibz_set(&lat1.basis[3][0], 0); - ibz_set(&lat1.basis[3][1], 0); - ibz_set(&lat1.basis[3][2], 15); - ibz_set(&lat1.basis[3][3], 3); - ibz_set(&lat1.denom, 15); - - quat_lattice_hnf(&lat1); - quat_lattice_reduce_denom(&lat1, &lat1); - quat_lattice_mul(&lat2, &lat1, &lat1, &alg); - quat_lattice_right_transporter(&trans, &lat1, &lat2, &alg); - ibz_mat_4x4_zero(&(exp.basis)); - ibz_set(&exp.basis[0][0], 2); - ibz_set(&exp.basis[1][1], 1); - ibz_set(&exp.basis[2][2], 2); - ibz_set(&exp.basis[2][3], 1); - ibz_set(&exp.basis[3][3], 1); - ibz_set(&exp.denom, 5); - - res |= !quat_lattice_equal(&trans, &exp); - - if (res != 0){ - printf("Quaternion unit test lattice_right_transporter_hnf failed\n"); + ibz_mat_4x4_eval(&vec1, &gram, &vec1); + ibz_set(&norm2, 0); + for (int i = 0; i < 4; i++) { + ibz_mul(&test, &(vec1[i]), &(vec2[i])); + ibz_add(&norm2, &norm2, &test); } - quat_alg_finalize(&alg); - quat_lattice_finalize(&lat1); - quat_lattice_finalize(&lat2); - quat_lattice_finalize(&trans); - quat_lattice_finalize(&exp); - return(res); -} + ibz_div(&norm2, &test, &norm2, &(lattice.denom)); + ibz_div(&norm2, &test, &norm2, &(lattice.denom)); + res = res | !(ibz_cmp(&norm1, &norm2) == 0); + ibz_mat_4x4_zero(&(lattice.basis)); + ibz_set(&(lattice.basis[0][0]), 202); + ibz_set(&(lattice.basis[1][1]), 202); + ibz_set(&(lattice.basis[2][2]), 1); + ibz_set(&(lattice.basis[3][3]), 1); + ibz_set(&(lattice.basis[0][2]), 158); + ibz_set(&(lattice.basis[0][3]), 53); + ibz_set(&(lattice.basis[1][2]), 149); + ibz_set(&(lattice.basis[1][3]), 158); + ibz_set(&(lattice.denom), 2); + quat_lattice_gram(&gram, &lattice, &alg); + + quat_alg_elem_set(&elem1, 2, 360, 149, 1, 0); + quat_alg_elem_set(&elem2, 2, 53, 360, 0, 1); + int ok = quat_lattice_contains(&vec1, &lattice, &elem1); + ok = ok && quat_lattice_contains(&vec2, &lattice, &elem2); + assert(ok); + quat_alg_conj(&elem2, &elem2); + quat_alg_mul(&elem1, &elem1, &elem2, &alg); + ibz_mul(&norm1, &(elem1.coord[0]), &ibz_const_two); + ibz_div(&norm1, &test, &norm1, &(elem1.denom)); + + ibz_mat_4x4_eval(&vec1, &gram, &vec1); + ibz_set(&norm2, 0); + for (int i = 0; i < 4; i++) { + ibz_mul(&test, &(vec1[i]), &(vec2[i])); + ibz_add(&norm2, &norm2, &test); + } + ibz_div(&norm2, &test, &norm2, &(lattice.denom)); + ibz_div(&norm2, &test, &norm2, &(lattice.denom)); + res = res | !(ibz_cmp(&norm1, &norm2) == 0); + + if (res != 0) { + printf("Quaternion unit test lattice_gram failed\n"); + } + quat_lattice_finalize(&lattice); + ibz_mat_4x4_finalize(&gram); + ibz_finalize(&test); + ibz_finalize(&norm1); + ibz_finalize(&norm2); + ibz_vec_4_finalize(&vec1); + ibz_vec_4_finalize(&vec2); + quat_alg_elem_finalize(&elem1); + quat_alg_elem_finalize(&elem2); + quat_alg_finalize(&alg); + return (res); +} // run all previous tests -int quat_test_lattice(){ +int +quat_test_lattice(void) +{ int res = 0; printf("\nRunning quaternion tests of lattice functions\n"); res = res | quat_test_lattice_equal(); + res = res | quat_test_lattice_inclusion(); res = res | quat_test_lattice_reduce_denom(); + res = res | quat_test_lattice_conjugate_without_hnf(); res = res | quat_test_lattice_dual_without_hnf(); res = res | quat_test_lattice_add(); res = res | quat_test_lattice_intersect(); + res = res | quat_test_lattice_mat_alg_coord_mul_without_hnf(); + res = res | quat_test_lattice_alg_elem_mul(); res = res | quat_test_lattice_mul(); - res = res | quat_test_lattice_contains_without_alg(); res = res | quat_test_lattice_contains(); res = res | quat_test_lattice_index(); res = res | quat_test_lattice_hnf(); - res = res | quat_test_lattice_lll(); - res = res | quat_test_lattice_random_elem(); - res = res | quat_test_lattice_right_transporter_hnf(); - return(res); + res = res | quat_test_lattice_gram(); + return (res); } diff --git a/src/quaternion/ref/generic/test/matkermod.c b/src/quaternion/ref/generic/test/matkermod.c deleted file mode 100644 index 1a9b804..0000000 --- a/src/quaternion/ref/generic/test/matkermod.c +++ /dev/null @@ -1,218 +0,0 @@ -#include "quaternion_tests.h" - -//void ibz_mat_howell(int rows, int cols, ibz_t howell[rows][rows+1], const ibz_t mat[rows][cols], ibz_t *mod) -int quat_test_ibz_mat_howell(){ - int res = 0; - - // Examples from Mulders & Storjohan - - ibz_t mod; - ibz_t stormin[3][3], stormout[3][4], stormtrans[4][4], expected[3][4]; - ibz_init(&mod); - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) - ibz_init(&stormin[i][j]); - for (int j = 0; j < 4; j++) { - ibz_init(&stormout[i][j]); - ibz_init(&expected[i][j]); - } - } - for (int i = 0; i < 4; i++) - for (int j = 0; j < 4; j++) - ibz_init(&stormtrans[i][j]); - - ibz_set(&mod, 12); - ibz_set(&expected[0][2], 4); - ibz_set(&expected[1][2], 1); - ibz_set(&expected[2][3], 1); - - ibz_set(&stormin[0][0], 4); - ibz_set(&stormin[1][0], 1); - ibz_set(&stormin[2][1], 5); - int zeros = ibz_mat_howell(3, 3, stormout, stormtrans, stormin, &mod); - res |= zeros != 2; - - for (int i = 0; i < 3; i++) - for (int j = 0; j < 3; j++) - res |= ibz_cmp(&stormout[i][j], &expected[i][j]); - - ibz_set(&stormin[0][0], 8); - ibz_set(&stormin[1][0], 5); - ibz_set(&stormin[2][0], 5); - ibz_set(&stormin[1][1], 9); - ibz_set(&stormin[2][1], 8); - ibz_set(&stormin[2][2], 10); - zeros = ibz_mat_howell(3, 3, stormout, stormtrans, stormin, &mod); - res |= zeros != 2; - - for (int i = 0; i < 3; i++) - for (int j = 0; j < 4; j++) - res |= ibz_cmp(&stormout[i][j], &expected[i][j]); - - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) - ibz_finalize(&stormin[i][j]); - for (int j = 0; j < 4; j++) { - ibz_finalize(&stormout[i][j]); - ibz_finalize(&expected[i][j]); - } - } - for (int i = 0; i < 4; i++) - for (int j = 0; j < 4; j++) - ibz_finalize(&stormtrans[i][j]); - - // An example computed in Pari - ibz_t in[5][3], out[5][6], exp[5][6], trans[6][6]; - for (int i = 0; i < 5; i++) { - for (int j = 0; j < 3; j++) - ibz_init(&in[i][j]); - for (int j = 0; j < 6; j++) { - ibz_init(&out[i][j]); - ibz_init(&exp[i][j]); - } - } - for (int i = 0; i < 6; i++) - for (int j = 0; j < 6; j++) - ibz_init(&trans[i][j]); - - ibz_set(&mod, 60); - - ibz_set(&in[0][0], 1); - ibz_set(&in[0][1], 2); - ibz_set(&in[0][2], -3); - ibz_set(&in[1][0], 4); - ibz_set(&in[1][1], 5); - ibz_set(&in[1][2], 6); - ibz_set(&in[2][0], 7); - ibz_set(&in[2][1], 8); - ibz_set(&in[2][2], 19); - ibz_set(&in[3][0], 10); - ibz_set(&in[3][1], 11); - ibz_set(&in[3][2], 12); - ibz_set(&in[4][0], 13); - ibz_set(&in[4][1], 14); - ibz_set(&in[4][2], 15); - - ibz_set(&exp[0][2], 12); - ibz_set(&exp[0][3], 6); - ibz_set(&exp[2][3], 10); - ibz_set(&exp[1][4], 9); - ibz_set(&exp[2][4], 6); - ibz_set(&exp[3][4], 3); - ibz_set(&exp[0][5], 1); - ibz_set(&exp[1][5], 1); - ibz_set(&exp[2][5], 1); - ibz_set(&exp[3][5], 1); - ibz_set(&exp[4][5], 1); - - zeros = ibz_mat_howell(5, 3, out, trans, in, &mod); - res |= zeros != 2; - - for (int i = 0; i < 5; i++) - for (int j = 0; j < 6; j++) - res |= ibz_cmp(&out[i][j], &exp[i][j]); - - if (res != 0){ - printf("Quaternion unit test ibz_mat_howell failed\n"); - } - for (int i = 0; i < 5; i++) { - for (int j = 0; j < 3; j++) - ibz_finalize(&in[i][j]); - for (int j = 0; j < 6; j++) { - ibz_finalize(&out[i][j]); - ibz_finalize(&exp[i][j]); - } - } - for (int i = 0; i < 6; i++) - for (int j = 0; j < 6; j++) - ibz_finalize(&trans[i][j]); - ibz_finalize(&mod); - return res; -} - - -//void ibz_mat_right_ker_mod(int rows, int cols, ibz_t ker[cols][rows], const ibz_t mat[rows][cols], ibz_t *mod) -int quat_test_ibz_mat_right_ker_mod() { - int res = 0; - - // An example computed in Pari - ibz_t mod, a, b, tmp; - ibz_init(&mod); - ibz_init(&a); - ibz_init(&b); - ibz_init(&tmp); - ibz_t mat[5][3], ker[3][5]; - for (int i = 0; i < 5; i++) { - for (int j = 0; j < 3; j++) { - ibz_init(&mat[i][j]); - ibz_init(&ker[j][i]); - } - } - - ibz_set(&mod, 60); - - ibz_set(&mat[0][0], 1); - ibz_set(&mat[0][1], 2); - ibz_set(&mat[0][2], -3); - ibz_set(&mat[1][0], 4); - ibz_set(&mat[1][1], 5); - ibz_set(&mat[1][2], 6); - ibz_set(&mat[2][0], 7); - ibz_set(&mat[2][1], 8); - ibz_set(&mat[2][2], 19); - ibz_set(&mat[3][0], 10); - ibz_set(&mat[3][1], 11); - ibz_set(&mat[3][2], 12); - ibz_set(&mat[4][0], 13); - ibz_set(&mat[4][1], 14); - ibz_set(&mat[4][2], 15); - - // self-testing thanks to assertions - ibz_mat_right_ker_mod(5, 3, ker, mat, &mod); - - // Randomized test - ibz_set(&mod, 6402373705728000l); - for (int r = 0; r < 10; r++) { - for (int i = 0; i < 2; i++) - for (int j = 0; j < 3; j++) - ibz_rand_interval(&mat[i][j], &ibz_const_zero, &mod); - for (int i = 2; i < 5; i++) { - ibz_rand_interval(&a, &ibz_const_zero, &mod); - ibz_rand_interval(&b, &ibz_const_zero, &mod); - for (int j = 0; j < 3; j++) { - ibz_mul(&tmp, &mat[0][j], &a); - ibz_mul(&mat[i][j], &mat[1][1], &b); - ibz_add(&mat[i][j], &mat[i][j], &tmp); - ibz_mod(&mat[i][j], &mat[i][j], &mod); - } - } - - // self-testing thanks to assertions - ibz_mat_right_ker_mod(5, 3, ker, mat, &mod); - } - - - if (res != 0){ - printf("Quaternion unit test ibz_mat_howell failed\n"); - } - for (int i = 0; i < 5; i++) { - for (int j = 0; j < 3; j++) { - ibz_finalize(&mat[i][j]); - ibz_finalize(&ker[j][i]); - } - } - ibz_finalize(&mod); - ibz_finalize(&a); - ibz_finalize(&b); - ibz_finalize(&tmp); - return res; -} - -// run all previous tests -int quat_test_matkermod(){ - int res = 0; - printf("\nRunning quaternion tests of matkermod\n"); - res = res | quat_test_ibz_mat_howell(); - res = res | quat_test_ibz_mat_right_ker_mod(); - return(res); -} diff --git a/src/quaternion/ref/generic/test/mini-gmp.c b/src/quaternion/ref/generic/test/mini-gmp.c new file mode 100644 index 0000000..9870c21 --- /dev/null +++ b/src/quaternion/ref/generic/test/mini-gmp.c @@ -0,0 +1,211 @@ +#include +#include +#include +#include +#include "mini-gmp-extra.h" +#include "intbig_internal.h" +#include "rng.h" + +#define RANDOM_TEST_ITERS 1000 + +int +mini_gmp_test_mpz_legendre(void) +{ + int res = 0; + const int levels = 3; + const int cofactor[] = { 5, 65, 27 }; + const int e[] = { 248, 376, 500 }; + + int as[] = { -2, -1, 0, 1, 2 }; + // clang-format off + int legendre[3][5] = { + { -1, -1, 0, 1, 1, }, + { -1, -1, 0, 1, 1, }, + { -1, -1, 0, 1, 1, }, + }; + // clang-format on + + mpz_t a, p; + mpz_init(a); + mpz_init(p); + + for (int i = 0; i < levels; i++) { + // build cofactor*2^e - 1 for the i-th level + mpz_set_ui(p, 1); + mpz_mul_2exp(p, p, e[i]); + mpz_mul_ui(p, p, cofactor[i]); + mpz_sub_ui(p, p, 1); + + for (unsigned long j = 0; j < sizeof(as) / sizeof(as[0]); j++) { + mpz_set_si(a, as[j]); + res = res | (mini_mpz_legendre(a, p) != legendre[i][j]); + } + +#if defined(__GMP_H__) + for (int j = 0; j < RANDOM_TEST_ITERS; j++) { + ibz_rand_interval(&a, &ibz_const_zero, &p); + // Compare against the full GMP implementation + res = res | (mini_mpz_legendre(a, p) != mpz_legendre(a, p)); + } +#endif + } + + mpz_clear(a); + mpz_clear(p); + + if (res) { + printf("mini-gmp test mpz_legendre failed\n"); + } + + return res; +} + +typedef union +{ + double d; + int64_t s64; + unsigned char uc[sizeof(int64_t)]; +} double_int64_uchar_t; + +int +mini_gmp_test_mpz_get_d_2exp(void) +{ + int res = 0; + signed long int e, e2 UNUSED; + double d, d2 UNUSED; + mpz_t op; + + mpz_init(op); + + // Test 0 + mpz_set_si(op, 0); + d = mini_mpz_get_d_2exp(&e, op); + res = res | (e != 0); + res = res | (d != 0.0); // exact floating point comparison + + // Test 1 + mpz_set_si(op, 1); + d = mini_mpz_get_d_2exp(&e, op); + res = res | (e != 1); + res = res | (d != 0.5); // exact floating point comparison + + // Test -1 + mpz_set_si(op, -1); + d = mini_mpz_get_d_2exp(&e, op); + res = res | (e != 1); + res = res | (d != -0.5); // exact floating point comparison + + // Test a few powers of 2: 2^1, 2^2, 2^4, 2^8, ..., 2^65536, and their negatives + for (int i = 0; i <= 16; i++) { + mpz_set_ui(op, 1); + mpz_mul_2exp(op, op, 1 << i); + + d = mini_mpz_get_d_2exp(&e, op); + res = res | (e != (1 << i) + 1); + res = res | (d != 0.5); // exact floating point comparison + + mpz_neg(op, op); + d = mini_mpz_get_d_2exp(&e, op); + res = res | (e != (1 << i) + 1); + res = res | (d != -0.5); // exact floating point comparison + } + + // Test random doubles with random exponent + double_int64_uchar_t dd; + volatile uint16_t ee; + + for (uint32_t i = 0; i < RANDOM_TEST_ITERS; i++) { + randombytes(dd.uc, sizeof(dd.uc)); + randombytes((unsigned char *)&ee, sizeof(ee)); + +#ifdef TARGET_BIG_ENDIAN + // Ensure reproducibility in big-endian systems + dd.s64 = BSWAP64(dd.s64); + ee = BSWAP16(ee); +#endif + + dd.s64 &= 0x800fffffffffffff; // clear exponent + dd.s64 |= 0x3fe0000000000000; // set exponent to -1 + + if (ee >= DBL_MANT_DIG) { + mpz_set_d(op, dd.d * (INT64_C(1) << DBL_MANT_DIG)); + mpz_mul_2exp(op, op, ee - DBL_MANT_DIG); + } else { + // Since it fits in a double, round it first to ensure it's an integer + dd.d = round(dd.d * (INT64_C(1) << ee)); + mpz_set_d(op, dd.d); + dd.d /= INT64_C(1) << ee; + // These cases (-1, 0, 1) were already tested, and +/- 1 would require special-casing below + if (fabs(dd.d) <= 1.0) { + continue; + } + } + + d = mini_mpz_get_d_2exp(&e, op); + + res = res | (e != ee); + res = res | (d != dd.d); + +#if defined(__GMP_H__) + // Compare against the full GMP implementation + d2 = mpz_get_d_2exp(&e2, op); + + res = res | (e != e2); + res = res | (d != d2); +#endif + } + +#if defined(__GMP_H__) + for (int exp2 = 1023; exp2 <= 1025; exp2++) { + for (int sign_outer = -1; sign_outer <= 1; sign_outer += 2) { + for (int sign_inner = -1; sign_inner <= 1; sign_inner += 2) { + for (int i = 1; i < 15; i++) { + mpz_set_si(op, i); + mpz_mul_2exp(op, op, 55); + if (sign_inner > 0) + mpz_add_ui(op, op, 1); + else + mpz_sub_ui(op, op, 1); + mpz_mul_2exp(op, op, exp2 - 55); + mpz_mul_si(op, op, sign_outer); + + d = mini_mpz_get_d_2exp(&e, op); + d2 = mpz_get_d_2exp(&e2, op); + + res = res | (e != e2); + res = res | (d != d2); + } + } + } + } + + // Test random integers + for (uint32_t i = 0; i < RANDOM_TEST_ITERS; i++) { + ibz_rand_interval_bits(&op, 8 * (i + 1)); + + d = mini_mpz_get_d_2exp(&e, op); + d2 = mpz_get_d_2exp(&e2, op); + + res = res | (e != e2); + res = res | (d != d2); + } +#endif + + if (res) { + printf("mini-gmp test mpz_get_d_2exp failed\n"); + } + + mpz_clear(op); + + return res; +} + +int +mini_gmp_test(void) +{ + int res = 0; + printf("\nRunning tests for implementations of GMP functions missing from the mini-GMP API\n"); + res = res | mini_gmp_test_mpz_legendre(); + res = res | mini_gmp_test_mpz_get_d_2exp(); + return res; +} diff --git a/src/quaternion/ref/generic/test/normeq.c b/src/quaternion/ref/generic/test/normeq.c new file mode 100644 index 0000000..cbdeea3 --- /dev/null +++ b/src/quaternion/ref/generic/test/normeq.c @@ -0,0 +1,384 @@ +#include "quaternion_tests.h" +#include +#include + +// helpers for setting parameters + +// test if parameters are such that represent_inter is likely to find a solution +int +quat_test_input_for_repres_bound(const ibz_t *p, const ibz_t *M, int q) +{ + ibz_t c, r; + ibz_init(&c); + ibz_init(&r); + ibz_set(&r, q); + ibz_mul(&r, &r, p); + ibz_div(&c, &r, M, &r); + ibz_set(&r, 1 << 20); + int res = (ibz_cmp(&r, &c) <= 0); + ibz_finalize(&c); + ibz_finalize(&r); + return (res); +} + +// 1 if ok, 0 if error +int +quat_test_special_extremal_setup(quat_represent_integer_params_t *params, const quat_alg_t *alg) +{ // check the order is maximal and i,j generate a suborder + int res = 1; + ibz_vec_4_t ij; + quat_lattice_t lat; + quat_lattice_t test; + ibz_vec_4_init(&ij); + quat_lattice_init(&lat); + quat_lattice_init(&test); + quat_alg_coord_mul(&ij, &(params->order->z.coord), &(params->order->t.coord), alg); + ibz_copy(&(lat.denom), &(params->order->z.denom)); + ibz_copy(&(lat.basis[0][0]), &(lat.denom)); + for (int i = 0; i < 4; i++) { + ibz_copy(&(lat.basis[i][3]), &(ij[i])); + ibz_mul(&(lat.basis[i][2]), &(params->order->t.coord[i]), &(lat.denom)); + ibz_copy(&(lat.basis[i][1]), &(params->order->z.coord[i])); + } + quat_lattice_hnf(&lat); + quat_lattice_mul(&test, &lat, &lat, alg); + res = res && quat_lattice_inclusion(&test, &lat); + quat_lattice_mul(&test, &(params->order->order), &(params->order->order), alg); + res = res && quat_lattice_inclusion(&test, &(params->order->order)); + res = res && quat_order_is_maximal(&(params->order->order), alg); + res = res && quat_lattice_inclusion(&lat, &(params->order->order)); + ibz_vec_4_finalize(&ij); + quat_lattice_finalize(&lat); + quat_lattice_finalize(&test); + return (res); +} + +void +quat_test_set_params_standard(quat_represent_integer_params_t *params, + quat_p_extremal_maximal_order_t *order, + const quat_alg_t *alg) +{ + quat_lattice_O0_set_extremal(order); + + params->algebra = alg; + params->order = order; + assert(quat_test_special_extremal_setup(params, alg)); +} + +void +quat_test_set_params_non_standard(quat_represent_integer_params_t *params, + quat_p_extremal_maximal_order_t *order, + const quat_alg_t *alg) +{ + ibz_set_from_str(&order->z.coord[1], "214764116738303679745780048598183569015", 10); + ibz_set(&order->z.coord[2], 0); + ibz_set_from_str(&order->z.coord[3], "1", 10); + ibz_set_from_str(&order->z.denom, "73403150722045993989123427738005336972", 10); + ibz_set(&order->t.coord[2], 1); + ibz_set(&order->t.denom, 1); + order->q = 13; + ibz_set_from_str(&(order->order.basis[0][0]), "73403150722045993989123427738005336972", 10); + ibz_set_from_str(&(order->order.basis[1][1]), + "2694011267961700664357934052637599020390646823337886018360381743577635064392", + 10); + ibz_set_from_str(&(order->order.basis[2][2]), "36701575361022996994561713869002668486", 10); + ibz_set(&(order->order.basis[3][3]), 1); + ibz_set_from_str(&(order->order.basis[0][2]), "36701575361022996994561713869002668486", 10); + ibz_set_from_str(&(order->order.basis[0][3]), "0", 10); + ibz_set_from_str(&(order->order.basis[1][2]), "0", 10); + ibz_set_from_str(&(order->order.basis[1][3]), "214764116738303679745780048598183569015", 10); + ibz_set_from_str(&(order->order.denom), "73403150722045993989123427738005336972", 10); + + params->algebra = alg; + params->order = order; + + assert(quat_test_special_extremal_setup(params, alg)); +} + +// void quat_order_elem_create(quat_alg_elem_t *elem, const quat_p_extremal_maximal_order_t *order, +// const ibz_vec_4_t *coeffs, const quat_alg_t *Bpoo); +int +quat_test_order_elem_create() +{ + int res = 0; + quat_p_extremal_maximal_order_t O0; + ibz_vec_4_t vec, cmp; + quat_alg_t alg; + quat_alg_elem_t elem; + ibz_vec_4_init(&vec); + ibz_vec_4_init(&cmp); + quat_alg_elem_init(&elem); + quat_alg_elem_init(&(O0.z)); + quat_alg_elem_init(&(O0.t)); + quat_lattice_init(&(O0.order)); + quat_alg_init_set_ui(&alg, 103); + + quat_lattice_O0_set_extremal(&O0); + ibz_vec_4_set(&vec, 1, 7, 2, -2); + ibz_vec_4_copy(&cmp, &vec); + ibz_neg(&(cmp[3]), &(cmp[3])); + quat_order_elem_create(&elem, &O0, &vec, &alg); + res = res | ibz_cmp(&(elem.denom), &ibz_const_one); + for (int i = 0; i < 4; i++) + res = res | ibz_cmp(&(elem.coord[i]), &cmp[i]); + + if (res) { + printf("Quaternion unit test order_elem_create failed\n"); + } + ibz_vec_4_finalize(&vec); + ibz_vec_4_finalize(&cmp); + quat_alg_elem_finalize(&elem); + quat_alg_elem_finalize(&(O0.z)); + quat_alg_elem_finalize(&(O0.t)); + quat_lattice_finalize(&(O0.order)); + quat_alg_finalize(&alg); + return (res); +} + +// int quat_sampling_random_ideal_O0_given_norm(quat_left_ideal_t *lideal,const ibz_t *norm,int +// is_prime,const quat_represent_integer_params_t *params,int prime_sampling_attempts); +int +quat_test_sampling_random_ideal_O0_given_norm() +{ + int res = 0; + quat_left_ideal_t lideal; + quat_lattice_t test; + quat_represent_integer_params_t params; + quat_p_extremal_maximal_order_t O0; + quat_alg_t alg; + ibz_t p, norm, coprime; + quat_lattice_init(&test); + ibz_init(&norm); + ibz_init(&p); + ibz_init(&coprime); + quat_left_ideal_init(&lideal); + quat_alg_elem_init(&(O0.z)); + quat_alg_elem_init(&(O0.t)); + quat_lattice_init(&(O0.order)); + params.primality_test_iterations = 30; + ibz_set(&p, 1533069323); + quat_alg_init_set(&alg, &p); + quat_test_set_params_standard(¶ms, &O0, &alg); + ibz_set(&p, 1338708463); + res = res || !quat_sampling_random_ideal_O0_given_norm(&lideal, &p, 1, ¶ms, NULL); + res = res || (ibz_cmp(&(lideal.norm), &p) != 0); + quat_lideal_norm(&lideal); + res = res || (ibz_cmp(&(lideal.norm), &p) != 0); + res = res || !ibz_mat_4x4_equal(&(O0.order.basis), &(lideal.parent_order->basis)); + res = res || (0 != ibz_cmp(&(O0.order.denom), &(lideal.parent_order->denom))); + quat_lattice_mul(&test, &(lideal.lattice), &(lideal.lattice), &alg); + res = res || !quat_lattice_inclusion(&test, &(lideal.lattice)); + + ibz_set(&p, 3093 * 59471); + ibz_set(&coprime, 1533069337); + res = res || !quat_sampling_random_ideal_O0_given_norm(&lideal, &p, 0, ¶ms, &coprime); + res = res || (ibz_cmp(&(lideal.norm), &p) != 0); + quat_lideal_norm(&lideal); + res = res || (ibz_cmp(&(lideal.norm), &p) != 0); + res = res || !ibz_mat_4x4_equal(&(O0.order.basis), &(lideal.parent_order->basis)); + res = res || (0 != ibz_cmp(&(O0.order.denom), &(lideal.parent_order->denom))); + quat_lattice_mul(&test, &(lideal.lattice), &(lideal.lattice), &alg); + res = res || !quat_lattice_inclusion(&test, &(lideal.lattice)); + + if (res) { + printf("Quaternion unit test sampling_random_ideal_O0_given_norm failed\n"); + } + quat_left_ideal_finalize(&lideal); + quat_alg_elem_finalize(&(O0.z)); + quat_alg_elem_finalize(&(O0.t)); + quat_lattice_finalize(&(O0.order)); + ibz_finalize(&norm); + ibz_finalize(&p); + ibz_finalize(&coprime); + quat_lattice_finalize(&test); + quat_alg_finalize(&alg); + return (res); +} + +// void quat_change_to_O0_basis(ibz_vec_4_t *vec, const quat_alg_elem_t *el); +int +quat_test_change_to_O0_basis() +{ + int res = 0; + quat_alg_elem_t cmp, elem; + ibz_vec_4_t out; + quat_lattice_t O0; + quat_alg_elem_init(&elem); + quat_alg_elem_init(&cmp); + ibz_vec_4_init(&out); + quat_lattice_init(&O0); + quat_lattice_O0_set(&O0); + + quat_alg_elem_set(&cmp, 2, 2, 7, 1, -4); + quat_alg_elem_copy(&elem, &cmp); + quat_change_to_O0_basis(&out, &elem); + res = res || !quat_alg_elem_equal(&elem, &cmp); + quat_alg_elem_set(&elem, 1, 0, 0, 0, 0); + ibz_mat_4x4_eval(&(elem.coord), &(O0.basis), &out); + ibz_copy(&(elem.denom), &(O0.denom)); + res = res || !quat_alg_elem_equal(&elem, &cmp); + + quat_alg_elem_set(&cmp, 2, 1, 0, 6, -3); + quat_alg_elem_copy(&elem, &cmp); + quat_change_to_O0_basis(&out, &elem); + res = res || !quat_alg_elem_equal(&elem, &cmp); + quat_alg_elem_set(&elem, 1, 0, 0, 0, 0); + ibz_mat_4x4_eval(&(elem.coord), &(O0.basis), &out); + ibz_copy(&(elem.denom), &(O0.denom)); + res = res || !quat_alg_elem_equal(&elem, &cmp); + + quat_alg_elem_set(&cmp, 1, -8, 2, 1, 3); + quat_alg_elem_copy(&elem, &cmp); + quat_change_to_O0_basis(&out, &elem); + res = res || !quat_alg_elem_equal(&elem, &cmp); + quat_alg_elem_set(&elem, 1, 0, 0, 0, 0); + ibz_mat_4x4_eval(&(elem.coord), &(O0.basis), &out); + ibz_copy(&(elem.denom), &(O0.denom)); + res = res || !quat_alg_elem_equal(&elem, &cmp); + + if (res) { + printf("Quaternion unit test change_to_O0_basis failed"); + } + quat_alg_elem_finalize(&elem); + quat_alg_elem_finalize(&cmp); + ibz_vec_4_finalize(&out); + quat_lattice_finalize(&O0); + return (res); +} + +int +quat_test_represent_integer_internal(int gamma_iter, + int prim_iter, + int nbits, + int randomized, + int standard, + int non_diag) +{ + int tested = 0; + int rand_ret = 1; + int res = 0; + ibz_t p, norm_n, M, norm_d; + ibz_vec_4_t coord; + quat_alg_t Bpoo; + quat_alg_elem_t gamma; + // must initialize special extremal order, product and primes + quat_represent_integer_params_t params; + quat_p_extremal_maximal_order_t order; + quat_lattice_init(&order.order); + quat_alg_elem_init(&order.z); + quat_alg_elem_init(&order.t); + quat_alg_elem_init(&gamma); + ibz_vec_4_init(&coord); + ibz_init(&M); + ibz_init(&p); + ibz_init(&norm_d); + ibz_init(&norm_n); + quat_alg_init_set_ui(&Bpoo, 101); + + // setup + params.primality_test_iterations = gamma_iter; + + while (!tested) { + if (standard) { + ibz_set(&p, 0); + rand_ret = !ibz_generate_random_prime(&p, 1, 2 * nbits, 32); + rand_ret = rand_ret || !ibz_rand_interval_bits(&M, 2 * nbits + 24 + 100 * non_diag); + ibz_copy(&(Bpoo.p), &p); + quat_test_set_params_standard(¶ms, &order, &Bpoo); + } else { + ibz_set_from_str(&p, "23920667128620486487914848107166358953830561597426178123910317653495243603967", 10); + int real_nbits = ibz_bitsize(&p); + rand_ret = !ibz_rand_interval_bits(&M, real_nbits + 24 + 100 * non_diag); + ibz_copy(&(Bpoo.p), &p); + quat_test_set_params_non_standard(¶ms, &order, &Bpoo); + } + // make test more realistic by keeping some properties always given in SQIsign + tested = (ibz_get(&p) % 8 == 7); + tested = tested && (ibz_get(&M) % 2 == 1); + tested = tested && quat_test_input_for_repres_bound(&(Bpoo.p), &M, params.order->q); + if (rand_ret) + break; + } + + if (!rand_ret) { + res = !quat_represent_integer(&gamma, &M, non_diag, ¶ms); + if (!res) { + quat_alg_norm(&norm_n, &norm_d, &gamma, &Bpoo); + res = res || !ibz_is_one(&norm_d); + res = res || !(ibz_cmp(&norm_n, &M) == 0); + res = res || !quat_lattice_contains(NULL, &(params.order->order), &gamma); + if (non_diag) { + if (standard) { + ibz_mul(&norm_n, &ibz_const_two, &ibz_const_two); + // add not sub since basis in quat_order_elem_create is 1,i,j,-ij for O0 + ibz_add(&norm_d, &(gamma.coord[0]), &(gamma.coord[3])); + ibz_mod(&norm_d, &norm_d, &norm_n); + res = res || (0 != ibz_cmp(&ibz_const_two, &norm_d)); + ibz_sub(&norm_d, &(gamma.coord[1]), &(gamma.coord[2])); + ibz_mod(&norm_d, &norm_d, &norm_n); + res = res || (0 != ibz_cmp(&ibz_const_two, &norm_d)); + } else { + quat_lattice_contains(&coord, &(params.order->order), &gamma); + ibz_gcd(&norm_d, &(coord[1]), &(coord[2])); + ibz_gcd(&norm_d, &norm_d, &(coord[3])); + res = res || ibz_is_even(&norm_d); + } + } + } + } else { + printf("Randomness failure in quat_represent_integer test\n"); + } + + quat_alg_finalize(&Bpoo); + ibz_finalize(&p); + ibz_finalize(&M); + ibz_finalize(&norm_n); + ibz_finalize(&norm_d); + ibz_vec_4_finalize(&coord); + quat_lattice_finalize(&order.order); + quat_alg_elem_finalize(&order.z); + quat_alg_elem_finalize(&order.t); + quat_alg_elem_finalize(&gamma); + return res | (rand_ret); +} + +// int quat_represent_integer(quat_alg_elem_t *gamma, const ibz_t *n_gamma, const +// quat_represent_integer_params_t *params); +int +quat_test_represent_integer(void) +{ + int res = 0; + int prim_iter = 32; + int gamma_iter = 16384; + + res = res | quat_test_represent_integer_internal(prim_iter, gamma_iter, 64, 1, 1, 0); + res = res | quat_test_represent_integer_internal(prim_iter, gamma_iter, 64, 1, 1, 1); + + gamma_iter = 32768; + res = res | quat_test_represent_integer_internal(prim_iter, gamma_iter, 128, 1, 1, 0); + res = res | quat_test_represent_integer_internal(prim_iter, gamma_iter, 128, 1, 1, 1); + + gamma_iter = 100000; + res = res | quat_test_represent_integer_internal(prim_iter, gamma_iter, 128, 1, 0, 0); + res = res | quat_test_represent_integer_internal(prim_iter, gamma_iter, 128, 1, 0, 1); + + if (res) { + printf("Quaternion unit test represent_integer failed\n"); + } + return (res); +} + +int +quat_test_normeq(void) +{ + + int res = 0; + printf("\nRunning quaternion tests of functions for special extremal orders\n"); + + res = res | quat_test_change_to_O0_basis(); + res = res | quat_test_order_elem_create(); + res = res | quat_test_sampling_random_ideal_O0_given_norm(); + res = res | quat_test_represent_integer(); + + return res; +} diff --git a/src/quaternion/ref/generic/test/quaternion_tests.h b/src/quaternion/ref/generic/test/quaternion_tests.h deleted file mode 100644 index 130b471..0000000 --- a/src/quaternion/ref/generic/test/quaternion_tests.h +++ /dev/null @@ -1,188 +0,0 @@ -/** @file - * - * @authors Sina Schaeffler - * - * @brief Declarations of tests of quaternion algebra operations - */ - -#ifndef QUATERNION_TESTS_H -#define QUATERNION_TESTS_H - -#include -#include -#include "../internal.h" - -/** @internal - * @ingroup quat_quat - * @defgroup quat_tests Quaternion module test functions - * @{ - */ - -/** @brief Test initializers and finalizers for quaternion algebra types - * - * Test initializers and finalizers for the following types: - * - * quat_alg_t - * - * quat_alg_elem_t - * - * quat_alg_coord_t - * - * ibz_vec_4_t - * - * ibz_vec_5_t - * - * ibz_mat_2x2_t - * - * ibz_mat_4x4_t - * - * ibz_mat_4x5_t - * - * ibz_mat_4x8_t - * - * quat_lattice_t - * - * quat_order_t - * - * quat_left_ideal_t - */ -int quat_test_finit(); - -/** @brief Test integer, quadratic form and matrix functions for dimension 4 from the quaternion module - * - * Runs unit tests for the following functions - * - * int ibz_4x5_right_ker_mod_prime(ibz_vec_5_t *ker, const ibz_mat_4x5_t *mat, const ibz_t *p); - * - * int ibz_4x4_right_ker_mod_prime(ibz_vec_4_t *ker, const ibz_mat_4x4_t *mat, const ibz_t *p); - * - * int ibz_4x4_right_ker_mod_power_of_2(ibz_vec_4_t *ker, const ibz_mat_4x4_t *mat, unsigned short exp); - * - * void ibz_mat_4x4_eval(quat_alg_coord_t *res, const ibz_mat_4x4_t *mat, const quat_alg_coord_t *vec); - * - * void quat_qf_eval(ibz_t *res, const ibz_mat_4x4_t *qf, const quat_alg_coord_t *coord); - * - * void ibz_content(ibz_t *content, const quat_alg_coord_t *v); - */ -int quat_test_dim4(); - -/** @brief Test integer, lattice and matrix functions for dimension 2 from the quaternion module - * - * Runs unit tests for the following functions - * - * void ibz_mat_2x2_eval(ibz_vec_2_t *res, const ibz_mat_2x2_t *mat, const ibz_vec_2_t *vec); - * - * void ibz_2x2_mul_mod(ibz_mat_2x2_t *prod, const ibz_mat_2x2_t *mat_a, const ibz_mat_2x2_t *mat_b, const ibz_t *m); - * - * int ibz_2x2_inv_mod(ibz_mat_2x2_t *inv, const ibz_mat_2x2_t *mat, const ibz_t *m); - * - * int quat_2x2_lattice_enumerate_cvp_filter(quat_alg_elem_t *res, const ibz_mat_2x2_t *lat_basis, const ibz_vec_2_t *target,unsigned int qf, unsigned int dist_bound, int (*condition)(quat_alg_elem_t* , const ibz_vec_2_t*, const void*), const void* params, unsigned int max_tries); - */ -int quat_test_dim2(); - -/** @brief Test integer functions - * - * Runs unit tests for the following functions - * - * int ibz_cornacchia_prime(ibz_t *x, ibz_t *y, const ibz_t *n, const ibz_t *p); - * - * int ibz_cornacchia_special_prime(ibz_t *x, ibz_t *y, const ibz_t *n, const ibz_t *p, const int exp_adjust); - * - * int ibz_cornacchia_extended(ibz_t *x, ibz_t *y, const ibz_t *n, const short *prime_list, const int prime_list_length, short primality_test_iterations, const ibz_t *bad_primes_prod); - */ -int quat_test_integers(); - -/** @brief Test operations on quaternion algebra elements - * - * Runs unit tests for the following functions - * - * void quat_alg_add(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b); - * - * void quat_alg_sub(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b); - * - * void quat_alg_mul(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b, const quat_alg_t *alg); - * - * void quat_alg_norm(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_t *alg); - * - * void quat_alg_trace(quat_alg_elem_t *res, const quat_alg_elem_t *a); - * - * void quat_alg_scalar(quat_alg_elem_t *elem, const ibz_t *numerator, const ibz_t *denominator); - * - * void quat_alg_conj(quat_alg_elem_t *conj, const quat_alg_elem_t *x); - * - * void quat_alg_make_primitive(quat_alg_coord_t *primitive_x, ibz_t *content, const quat_alg_elem_t *x, const quat_order_t *order, const quat_alg_t *alg){ - * - * int quat_alg_is_primitive(const quat_alg_elem_t *x, const quat_order_t *order, const quat_alg_t *alg): - * - * void quat_alg_normalize(quat_alg_elem_t *x); - * - * int quat_alg_elem_is_zero(const quat_alg_elem_t *x); - * - * int quat_alg_coord_is_zero(const quat_alg_coord_t *x); - */ -int quat_test_algebra(); - -/** @brief Test operations on lattices - * - * Runs unit tests for the following functions - * - * void quat_lattice_add(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2); - * - * void quat_lattice_intersect(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2); - * - * void quat_lattice_mul(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2, const quat_alg_t *alg); - * - * int quat_lattice_contains(quat_alg_coord_t *coord, const quat_lattice_t *lat, const quat_alg_elem_t *x, const quat_alg_t *alg); - * - * void quat_lattice_hnf(quat_lattice_t *lat); - */ -int quat_test_lattice(); - -/** @brief Test operations on left ideals and their creation - * - * Runs unit tests for the following functions - * - * void quat_lideal_create_principal(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const quat_order_t *order, const quat_alg_t *alg); - * - * void quat_lideal_create_from_primitive(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const ibz_t *N, const quat_order_t *order, const quat_alg_t *alg); - * - * void quat_lideal_make_primitive_then_create(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const ibz_t *N, const quat_order_t *order, const quat_alg_t *alg); - * - * void quat_lideal_random_2e(quat_left_ideal_t *lideal, const quat_order_t *order, const quat_alg_t *alg, int64_t e); - * - * int quat_lideal_generator(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const quat_alg_t *alg, int bound); - * - * int quat_lideal_generator_coprime(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const ibz_t *n, const quat_alg_t *alg, int bound); - * - * int quat_lideal_mul(quat_left_ideal_t *product, const quat_left_ideal_t *lideal, const quat_alg_elem_t *alpha, const quat_alg_t *alg, int bound); - * - * void quat_lideal_add(quat_left_ideal_t *sum, const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg); - * - * void quat_lideal_inter(quat_left_ideal_t *intersection, const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg); - * - * int quat_lideal_equals(const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg); - * - * int quat_lideal_isom(quat_alg_elem_t *iso, const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg); - * - * void quat_lideal_right_order(quat_order_t *order, const quat_left_ideal_t *lideal, const quat_alg_t *alg); - * - * void quat_lideal_reduce_basis(ibz_mat_4x4_t *reduced, ibz_mat_4x4_t *gram, const quat_left_ideal_t *lideal, const quat_alg_t *alg); //replaces lideal_lll - * - * void quat_connecting_ideal(quat_left_ideal_t *connecting_ideal, const quat_order_t *O1, const quat_order_t *O2, const quat_alg_t *alg); -*/ -int quat_test_lideal(); - -/** @brief test matkermod and Howell form - */ -int quat_test_matkermod(); - -/** @brief Test with randomization for complex functions where this is possible - * - */ -int quat_test_with_randomization(); - - -/** @} - */ - -#endif diff --git a/src/quaternion/ref/generic/test/random_input_generation.c b/src/quaternion/ref/generic/test/random_input_generation.c new file mode 100644 index 0000000..1cbe716 --- /dev/null +++ b/src/quaternion/ref/generic/test/random_input_generation.c @@ -0,0 +1,109 @@ +#include "quaternion_tests.h" +#include + +int +quat_test_input_random_ideal_generation(quat_left_ideal_t *ideals, + int norm_bitsize, + int iterations, + const quat_represent_integer_params_t *params) +{ + int randret = 0; + ibz_t norm, cofactor; + ibz_init(&norm); + ibz_init(&cofactor); + int size_p = ibz_bitsize(&(params->algebra->p)); + randret = !ibz_generate_random_prime(&cofactor, + 0, + ((norm_bitsize + 5) > size_p) * (norm_bitsize + 5) + + ((norm_bitsize + 5) <= size_p) * size_p, + params->primality_test_iterations); + if ((randret != 0) || ibz_is_zero(&cofactor)) { + printf("Random generation failed in quat_test_input_random_ideal_generation\n"); + goto fin; + } + + for (int iter = 0; iter < iterations; iter++) { + // generate random odd norm + randret = !ibz_rand_interval_bits(&norm, norm_bitsize - 1); + ibz_add(&norm, &norm, &norm); + ibz_add(&norm, &norm, &ibz_const_one); + if ((randret != 0) || ibz_is_zero(&norm)) { + printf("Random generation failed in quat_test_input_random_ideal_generation\n"); + goto fin; + } + ibz_abs(&norm, &norm); + // compute ideal + randret = !quat_sampling_random_ideal_O0_given_norm(&(ideals[iter]), &norm, 0, params, &cofactor); + if (randret != 0) { + printf("Random generation failed in quat_test_input_random_ideal_generation\n"); + goto fin; + } + } +fin:; + ibz_finalize(&norm); + ibz_finalize(&cofactor); + return (randret); +} + +// norms is either of length iterations or NULL +int +quat_test_input_random_ideal_lattice_generation(quat_lattice_t *lattices, + ibz_t *norms, + int norm_bitsize, + int iterations, + const quat_represent_integer_params_t *params) +{ + quat_left_ideal_t *ideals; + ideals = malloc(iterations * sizeof(quat_left_ideal_t)); + for (int i = 0; i < iterations; i++) + quat_left_ideal_init(&(ideals[i])); + int randret = quat_test_input_random_ideal_generation(ideals, norm_bitsize, iterations, params); + + for (int iter = 0; iter < iterations; iter++) { + ibz_mat_4x4_copy(&(lattices[iter].basis), &(ideals[iter].lattice.basis)); + ibz_copy(&(lattices[iter].denom), &(ideals[iter].lattice.denom)); + if (norms != NULL) { + ibz_copy(&(norms[iter]), &(ideals[iter].norm)); + } + } + for (int i = 0; i < iterations; i++) + quat_left_ideal_finalize(&(ideals[i])); + free(ideals); + return randret; +} + +int +quat_test_input_random_lattice_generation(quat_lattice_t *lattices, int bitsize, int iterations, int in_hnf) +{ + ibz_t det; + ibz_init(&det); + int randret = 0; + for (int iter = 0; iter < iterations; iter++) { + // generate random invertible matrix + ibz_set(&det, 0); + while (ibz_is_zero(&det)) { + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + randret = !ibz_rand_interval_bits(&((lattices[iter]).basis[i][j]), bitsize); + if (randret != 0) { + printf("Random generation failed in " + "quat_test_input_random_lattice_generation\n"); + goto fin; + } + } + } + randret = !ibz_rand_interval_bits(&((lattices[iter]).denom), bitsize); + if (randret != 0) { + printf("Random generation failed in quat_test_input_random_lattice_generation\n"); + goto fin; + } + ibz_mat_4x4_inv_with_det_as_denom(NULL, &det, &((lattices[iter]).basis)); + ibz_mul(&det, &det, &(lattices[iter].denom)); + if (in_hnf && !ibz_is_zero(&det)) + quat_lattice_hnf(&(lattices[iter])); + } + } +fin:; + ibz_finalize(&det); + return (randret); +} diff --git a/src/quaternion/ref/generic/test/randomized.c b/src/quaternion/ref/generic/test/randomized.c index 2168da8..b088b1c 100644 --- a/src/quaternion/ref/generic/test/randomized.c +++ b/src/quaternion/ref/generic/test/randomized.c @@ -1,14 +1,14 @@ #include "quaternion_tests.h" #include -// int ibz_2x2_inv_mod(ibz_mat_2x2_t *inv, const ibz_mat_2x2_t *mat, const ibz_t *m); -int quat_test_randomized_ibz_mat_2x2_inv_mod() +// int ibz_mat_2x2_inv_mod(ibz_mat_2x2_t *inv, const ibz_mat_2x2_t *mat, const ibz_t *m); +int +quat_test_randomized_ibz_mat_2x2_inv_mod(int bitsize_matrix, int bitsize_modulus, int iterations) { + int randret = 0; int res = 0; ibz_t m, det, gcd; ibz_mat_2x2_t a, inv, id, prod; - int64_t rand[4]; - int64_t rand_m; ibz_init(&m); ibz_init(&det); ibz_init(&gcd); @@ -18,47 +18,46 @@ int quat_test_randomized_ibz_mat_2x2_inv_mod() ibz_mat_2x2_init(&id); ibz_mat_2x2_set(&id, 1, 0, 0, 1); - - for (int iter = 0; iter < 100; iter++){ + for (int iter = 0; iter < iterations; iter++) { // generate random matrix and modulo, with modulo larger than 2 - int randret = randombytes((unsigned char*)rand, 4*sizeof(uint64_t)); - if (randret != 0) - return 1; - ibz_mat_2x2_set(&a, rand[0],rand[1],rand[2],rand[3]); - rand_m = 0; - while(rand_m < 2) { - int randret = randombytes((unsigned char*)&rand_m, sizeof(uint64_t)); - if (randret != 0) - return 1; + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + randret = randret | !ibz_rand_interval_bits(&(a[i][j]), bitsize_matrix); + } } - ibz_set(&m,rand_m); + randret = randret | !ibz_rand_interval_bits(&m, bitsize_modulus); + ibz_abs(&m, &m); + ibz_add(&m, &m, &ibz_const_two); + if (randret != 0) + goto fin; // compute det - ibz_mat_2x2_det_from_ibz(&det,&(a[0][0]),&(a[0][1]),&(a[1][0]),&(a[1][1])); + ibz_mat_2x2_det_from_ibz(&det, &(a[0][0]), &(a[0][1]), &(a[1][0]), &(a[1][1])); // is it prime to mod - ibz_gcd(&gcd,&det,&m); - if(ibz_is_one(&gcd)){ + ibz_gcd(&gcd, &det, &m); + if (ibz_is_one(&gcd)) { // matrix should be invertible mod m - if (ibz_2x2_inv_mod(&inv, &a, &m)) - { + if (ibz_mat_2x2_inv_mod(&inv, &a, &m)) { // ibz_2x2_mul_mod(&prod,&a,&inv, &m); ibz_2x2_mul_mod(&prod, &inv, &a, &m); res = res || ibz_cmp(&(prod[0][0]), &(id[0][0])); res = res || ibz_cmp(&(prod[0][1]), &(id[0][1])); res = res || ibz_cmp(&(prod[1][0]), &(id[1][0])); res = res || ibz_cmp(&(prod[1][1]), &(id[1][1])); - } - else - { + } else { res = 1; } } else { - res = res || ibz_2x2_inv_mod(&inv, &a, &m); + res = res || ibz_mat_2x2_inv_mod(&inv, &a, &m); } } - if (res != 0) - { +fin:; + if (randret != 0) { + printf("Randomness failed in quaternion unit test with randomization for " + "ibz_mat_2x2_inv_mod\n"); + } + if (res != 0) { printf("Quaternion unit test with randomization for ibz_mat_2x2_inv_mod failed\n"); } ibz_mat_2x2_finalize(&a); @@ -71,94 +70,12 @@ int quat_test_randomized_ibz_mat_2x2_inv_mod() return (res); } -// int quat_2x2_lattice_enumerate_cvp_filter(quat_alg_elem_t *res, const ibz_mat_2x2_t *lat_basis, const ibz_vec_2_t *target,unsigned int qf, unsigned int dist_bound, int (*condition)(quat_alg_elem_t* , const ibz_vec_2_t*, const void*), const void* params, unsigned int max_tries); -int quat_test_randomized_2x2_lattice_enumerate_cvp_filter() +// int ibz_4x4_inv_with_det_as_denom(ibz_mat_4x4_t *inv, ibz_t *det, const ibz_mat_4x4_t mat); +int +quat_test_randomized_ibz_mat_4x4_inv_with_det_as_denom(int matrix_bitsize, int iterations) { - // test only wether a result is returned which verifies the conditions, if true is returned - // cannot test wether false is retured correctly or not - int res = 0; - ibz_t p, bound, norm_q, norm; - quat_alg_elem_t cvp_res; - ibz_mat_2x2_t basis; - ibz_vec_2_t target, diff, found; - ibz_mat_2x2_init(&basis); - quat_alg_elem_init(&cvp_res); - ibz_vec_2_init(&target); - ibz_vec_2_init(&diff); - ibz_vec_2_init(&found); - ibz_init(&p); - ibz_init(&norm_q); - ibz_init(&norm); - ibz_init(&bound); - unsigned int q; - unsigned int dist_bound; - void *params = (void *)&p; - unsigned int max_tries; - int64_t rand[9]; - - // fix p since only used inside condition which is internal, unused by any external function - ibz_set(&p, 3); - - - for (int iter = 0; iter < 20; iter++){ - // generate random matrix with non-0 det - ibz_set(&bound,0); - while(ibz_is_zero(&bound)){ - int randret = randombytes((unsigned char*)rand, 9*sizeof(uint64_t)); - if (randret != 0) - return 1; - ibz_mat_2x2_set(&basis, rand[0],rand[1],rand[2],rand[3]); - // check det is not 0 - ibz_mat_2x2_det_from_ibz(&bound,&(basis[0][0]),&(basis[0][1]),&(basis[1][0]),&(basis[1][1])); - } - // set target - ibz_vec_2_set(&target, rand[4], rand[5]); - //set other params randomly in reasonable ranges - q = ((unsigned int)rand[6]) % 1024; - if(q == 0){ - q = 1; - } - dist_bound = ((unsigned int)rand[7]) % 128; - max_tries = ((unsigned int)rand[8]) % 16384; - if (quat_2x2_lattice_enumerate_cvp_filter(&cvp_res, &basis, &target, q, dist_bound, &quat_dim2_lattice_test_cvp_condition, params, max_tries)){ - // used cvp_res and condition to exfiltrate standard coords of distance to target from close vector found - ibz_copy(&(diff[0]), &(cvp_res.coord[0])); - ibz_copy(&(diff[1]), &(cvp_res.coord[1])); - // compute close vector in lattice from target and diff - ibz_sub(&(found[0]), &(target[0]), &(diff[0])); - ibz_sub(&(found[1]), &(target[1]), &(diff[1])); - // norm bound on diff ok? - ibz_set(&norm_q, q); - ibz_set(&bound, 2); - ibz_pow(&bound, &bound, dist_bound); - quat_dim2_lattice_norm(&norm, &(diff[0]), &(diff[1]), &norm_q); - res = res || !(ibz_cmp(&norm, &bound) < 0); - // Condition ok - res = res || (!quat_dim2_lattice_test_cvp_condition(&cvp_res, &diff, params)); - // Is in lattice - res = res || (!quat_dim2_lattice_contains(&basis, &(found[0]), &(found[1]))); - } - } - - if (res != 0) - { - printf("Quaternion unit test with randomization for 2x2_lattice_enumerate_cvp_filter failed\n"); - } - ibz_mat_2x2_finalize(&basis); - quat_alg_elem_finalize(&cvp_res); - ibz_vec_2_finalize(&target); - ibz_vec_2_finalize(&diff); - ibz_vec_2_finalize(&found); - ibz_finalize(&p); - ibz_finalize(&norm_q); - ibz_finalize(&norm); - ibz_finalize(&bound); - return res; -} - -//int ibz_4x4_inv_with_det_as_denom(ibz_mat_4x4_t *inv, ibz_t *det, const ibz_mat_4x4_t mat); -int quat_test_randomized_ibz_mat_4x4_inv_with_det_as_denom(){ int res = 0; + int randret = 0; ibz_t det; ibz_mat_4x4_t mat, inv; ibz_mat_4x4_t det_id, prod; @@ -168,22 +85,31 @@ int quat_test_randomized_ibz_mat_4x4_inv_with_det_as_denom(){ ibz_mat_4x4_init(&mat); ibz_mat_4x4_init(&inv); - for (int r = 0; r < 10; r++) { + for (int r = 0; r < iterations; r++) { do { for (int i = 0; i < 4; i++) - for (int j = 0; j < 4; j++) - ibz_rand_interval_i(&mat[i][j], -(1 << 20), 1 << 20); + for (int j = 0; j < 4; j++) { + randret = randret | !ibz_rand_interval_bits(&mat[i][j], matrix_bitsize); + if (randret != 0) + goto fin; + } } while (!ibz_mat_4x4_inv_with_det_as_denom(&inv, &det, &mat)); ibz_mat_4x4_identity(&det_id); - ibz_mat_4x4_scalar_mul(&det_id,&det,&det_id); + ibz_mat_4x4_scalar_mul(&det_id, &det, &det_id); ibz_mat_4x4_mul(&prod, &inv, &mat); - res = res || !ibz_mat_4x4_equal(&det_id,&prod); + res = res || !ibz_mat_4x4_equal(&det_id, &prod); ibz_mat_4x4_mul(&prod, &mat, &inv); - res = res || !ibz_mat_4x4_equal(&det_id,&prod); + res = res || !ibz_mat_4x4_equal(&det_id, &prod); } - - if (res != 0){ - printf("Quaternion unit test with randomization for ibz_mat_4x4_inv_with_det_as_denom failed\n"); + +fin:; + if (randret != 0) { + printf("Randomness failed in quaternion unit test with randomization for " + "ibz_mat_2x2_inv_mod\n"); + } + if (res != 0) { + printf("Quaternion unit test with randomization for ibz_mat_4x4_inv_with_det_as_denom " + "failed\n"); } ibz_mat_4x4_finalize(&det_id); ibz_mat_4x4_finalize(&prod); @@ -193,545 +119,155 @@ int quat_test_randomized_ibz_mat_4x4_inv_with_det_as_denom(){ return res; } -//void ibz_mat_4x8_hnf_core(ibz_mat_4x4_t *hnf, const ibz_mat_4x8_t *generators); -int quat_test_randomized_ibz_mat_4x8_hnf_core(){ - // only partial test, since lattice equality cannot be tested without hnf, so only one inclusion is checked - int res = 0; - quat_alg_elem_t vec; - quat_lattice_t lat; - ibz_mat_4x8_t mat; - ibz_mat_4x4_t hnf,cmp; - quat_lattice_init(&lat); - quat_alg_elem_init(&vec); - ibz_mat_4x8_init(&mat); - ibz_mat_4x4_init(&hnf); - ibz_mat_4x4_init(&cmp); - int64_t rand[8][4]; - int det_non_0; - - for (int iter = 0; iter < 100; iter++){ - int randret = randombytes((unsigned char*)rand, 8*4*sizeof(uint64_t)); - if (randret != 0) - return 1; - - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 8; j++){ - ibz_set(&(mat[i][j]),rand[j][i]); - } - } - ibz_mat_4x8_hnf_core(&hnf,&mat); - res = res || (!ibz_mat_4x4_is_hnf(&hnf)); - // also should test that they generate the same lattice. However, can only check one inclusion efficiently (and this only if full rank), so do so - det_non_0 = 1; - for(int i = 0; i <4; i ++){ - det_non_0 = det_non_0 && ibz_is_zero(&(hnf[i][i])); - } - if(det_non_0){ - ibz_mat_4x4_copy(&(lat.basis),&hnf); - ibz_set(&(lat.denom),1); - for(int i = 0; i <8; i ++){ - quat_alg_elem_copy_ibz(&vec,&(lat.denom), &(mat[i][0]), &(mat[i][1]), &(mat[i][2]), &(mat[i][3])); - res = res || !quat_lattice_contains_without_alg(NULL,&lat,&vec); - } - } - } - - if (res != 0){ - printf("Quaternion unit test with randomization for ibz_mat_4x8_hnf_core failed\n"); - } - quat_lattice_finalize(&lat); - quat_alg_elem_finalize(&vec); - ibz_mat_4x8_finalize(&mat); - ibz_mat_4x4_finalize(&hnf); - ibz_mat_4x4_finalize(&cmp); - return(res); -} - -//int ibz_4x5_right_ker_mod_prime(ibz_vec_5_t *ker, const ibz_mat_4x5_t *mat, const ibz_t *p); -int quat_test_randomized_ibz_4x5_right_ker_mod_prime(){ - // check that if the function returns 1, the vector is in the kernel - int res = 0; - ibz_t prime; - ibz_mat_4x5_t mat; - ibz_vec_5_t ker; - ibz_t prod, sum; - ibz_init(&prod); - ibz_init(&sum); - ibz_mat_4x5_init(&mat); - ibz_vec_5_init(&ker); - ibz_init(&prime); - int64_t rand[5][4]; - int64_t rand_p; - - - for (int iter = 0; iter < 100; iter++){ - // generate random matrix and modulo, with modulo larger than 2 - int randret = randombytes((unsigned char*)rand, 4*5*sizeof(uint64_t)); - if (randret != 0) - return 1; - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 5; j++){ - ibz_set(&(mat[i][j]),rand[j][i]); - } - } - rand_p = 0; - while(rand_p ==0) { - int randret = randombytes((unsigned char*)&rand_p, sizeof(uint64_t)); - if (randret != 0) - return 1; - ibz_set(&prime,rand_p); - if(!ibz_probab_prime(&prime,20)) - rand_p = 0; - } - if (ibz_4x5_right_ker_mod_prime(&ker,&mat,&prime)){ - for(int i = 0; i < 4; i++){ - ibz_set(&sum,0); - for(int j = 0; j < 5; j++){ - ibz_mul(&prod,&(mat[i][j]),&(ker[j])); - ibz_add(&sum,&sum,&prod); - ibz_mod(&sum,&sum,&prime); - } - res = res || !ibz_is_zero(&sum); - } - } - } - - if (res != 0){ - printf("Quaternion unit test with randomization for ibz_4x5_right_ker_mod_prime failed\n"); - } - ibz_finalize(&sum); - ibz_finalize(&prod); - ibz_vec_5_finalize(&ker); - ibz_mat_4x5_finalize(&mat); - ibz_finalize(&prime); - return(res); -} - - -//int ibz_4x4_right_ker_mod_prime(ibz_vec_4_t *ker, const ibz_mat_4x4_t *mat, const ibz_t *p); -int quat_test_randomized_ibz_4x4_right_ker_mod_prime(){ - int res = 0; - ibz_t prime; - ibz_mat_4x4_t mat, rank3, rank2; - ibz_vec_4_t ker; - ibz_t prod, sum,det; - ibz_init(&prod); - ibz_init(&sum); - ibz_init(&det); - ibz_mat_4x4_init(&mat); - ibz_mat_4x4_init(&rank3); - ibz_mat_4x4_init(&rank2); - ibz_vec_4_init(&ker); - ibz_init(&prime); - int64_t rand[4][4]; - int64_t rand_p; - ibz_mat_4x4_identity(&rank3); - ibz_set(&(rank3[3][3]),0); - ibz_mat_4x4_identity(&rank2); - ibz_set(&(rank2[3][3]),0); - ibz_set(&(rank2[2][2]),0); - - // test case where always 1 solution - for (int iter = 0; iter < 100; iter++){ - rand_p = 0; - while(rand_p ==0) { - int randret = randombytes((unsigned char*)&rand_p, sizeof(uint64_t)); - if (randret != 0) - return 1; - ibz_set(&prime,rand_p); - if(!ibz_probab_prime(&prime,20)) - rand_p = 0; - } - // generate random invertible matrix - ibz_set(&det,0); - while(ibz_is_zero(&det)){ - int randret = randombytes((unsigned char*)rand, 4*4*sizeof(uint64_t)); - if (randret != 0) - return 1; - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 4; j++){ - ibz_set(&(mat[i][j]),rand[j][i]); - } - } - ibz_mat_4x4_inv_with_det_as_denom(NULL,&det,&mat); - ibz_mod(&det,&det,&prime); - } - // rank 4 matrix does not work - res = res || ibz_4x4_right_ker_mod_prime(&ker,&mat,&prime); - // multiply with rank3 to get random rank 3 matrix - ibz_mat_4x4_mul(&mat,&mat,&rank3); - - if (ibz_4x4_right_ker_mod_prime(&ker,&mat,&prime)){ - for(int i = 0; i < 4; i++){ - ibz_set(&sum,0); - for(int j = 0; j < 4; j++){ - ibz_mul(&prod,&(mat[i][j]),&(ker[j])); - ibz_add(&sum,&sum,&prod); - ibz_mod(&sum,&sum,&prime); - } - res = res || !ibz_is_zero(&sum); - } - } else { - res = 1; - } - // multiply with rank2 to get matrix of too small rank - ibz_mat_4x4_mul(&mat,&mat,&rank2); - res = res || ibz_4x4_right_ker_mod_prime(&ker,&mat,&prime); - ibz_mat_4x4_mul(&mat,&mat,&rank2); - res = res || ibz_4x4_right_ker_mod_prime(&ker,&mat,&prime); - ibz_mat_4x4_mul(&mat,&mat,&rank2); - res = res || ibz_4x4_right_ker_mod_prime(&ker,&mat,&prime); - } - - if (res != 0){ - printf("Quaternion unit test with randomization for ibz_4x4_right_ker_mod_prime failed\n"); - } - ibz_finalize(&sum); - ibz_finalize(&prod); - ibz_finalize(&det); - ibz_vec_4_finalize(&ker); - ibz_mat_4x4_finalize(&mat); - ibz_mat_4x4_finalize(&rank3); - ibz_mat_4x4_finalize(&rank2); - ibz_finalize(&prime); - return(res); -} - -//int ibz_4x4_right_ker_mod_power_of_2(ibz_vec_4_t *ker, const ibz_mat_4x4_t *mat, unsigned short exp); -int quat_test_randomized_ibz_4x4_right_ker_mod_power_of_2(){ - // this only tests that if a vector is returned, it fullfills the conditions - int res = 0; - int zero = 1; - short exp; - int64_t rand[4][4]; - uint64_t rand_exp; - ibz_mat_4x4_t mat, rank3; - ibz_vec_4_t ker; - ibz_vec_4_t prod; - ibz_t q, r, two, det; - ibz_mat_4x4_init(&mat); - ibz_mat_4x4_init(&rank3); - ibz_vec_4_init(&ker); - ibz_vec_4_init(&prod); - ibz_init(&q); - ibz_init(&r); - ibz_init(&det); - ibz_init(&two); - ibz_set(&two,2); - ibz_mat_4x4_identity(&rank3); - ibz_set(&(rank3[3][3]),0); - - for (int iter = 0; iter < 100; iter++){ - rand_exp = 0; - while(rand_exp <=0) { - int randret = randombytes((unsigned char*)&rand_exp, sizeof(uint64_t)); - if (randret != 0) - return 1; - exp = ((short) ((unsigned char) rand_exp)); - } - // generate random invertible matrix - ibz_set(&det,0); - while(ibz_is_zero(&det)){ - int randret = randombytes((unsigned char*)rand, 4*4*sizeof(uint64_t)); - if (randret != 0) - return 1; - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 4; j++){ - ibz_set(&(mat[i][j]),rand[j][i]); - } - } - ibz_mat_4x4_inv_with_det_as_denom(NULL,&det,&mat); - ibz_div(&q,&det,&det,&two); - } - - - // rank 4 matrix does not work - res = res || ibz_4x4_right_ker_mod_power_of_2(&ker,&mat,exp); - // multiply with rank3 to get random rank 3 matrix - ibz_mat_4x4_mul(&mat,&mat,&rank3); - - if (ibz_4x4_right_ker_mod_power_of_2(&ker, &mat, exp)){ - zero = 1; - ibz_mat_4x4_eval(&prod,&mat,&ker); - for (int i = 0; i < 4; i++){ - ibz_div(&q,&r,&(ker[i]),&two); - zero = zero && ibz_is_zero(&r); - ibz_pow(&q,&two,exp); - ibz_mod(&(prod[i]),&(prod[i]),&q); - } - res |= !quat_alg_coord_is_zero(&prod); - res |= zero; - } - } - - - if (res != 0){ - printf("Quaternion unit test with randomization for ibz_4x4_right_ker_mod_power_of_2 failed\n"); - } - ibz_mat_4x4_finalize(&mat); - ibz_mat_4x4_finalize(&rank3); - ibz_vec_4_finalize(&ker); - ibz_vec_4_finalize(&prod); - ibz_finalize(&q); - ibz_finalize(&r); - ibz_finalize(&two); - ibz_finalize(&det); - return(res); -} - - -//int quat_lattice_lll(ibz_mat_4x4_t *red, const quat_lattice_t *lattice, const ibz_t *q, int precision); -int quat_test_randomized_lattice_lll(){ - int res = 0; - quat_lattice_t lat, test; - ibz_mat_4x4_t red; - ibz_t num, denom, q, det; - ibq_t coeff; - int64_t rand[4][4]; - uint32_t rand_q, rand_prec, rand_denom; - ibz_init(&num); - ibz_init(&denom); - ibz_init(&q); - ibz_init(&det); - ibq_init(&coeff); - ibz_mat_4x4_init(&red); - quat_lattice_init(&lat); - quat_lattice_init(&test); - ibz_set(&num,3); - ibz_set(&denom,4); - ibq_set(&coeff,&num,&denom); - - for (int iter = 0; iter < 20; iter++){ - rand_denom = 0; - while(rand_denom ==0) { - int randret = randombytes((unsigned char*)&rand_denom, sizeof(uint32_t)); - if (randret != 0) - return 1; - } - int randret = randombytes((unsigned char*)&rand_q, sizeof(uint32_t)); - if (randret != 0) - return 1; - // generate random invertible matrix - ibz_set(&det,0); - while(ibz_is_zero(&det)){ - int randret = randombytes((unsigned char*)rand, 4*4*sizeof(uint64_t)); - if (randret != 0) - return 1; - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 4; j++){ - ibz_set(&(lat.basis[i][j]),rand[j][i]); - } - } - ibz_mat_4x4_inv_with_det_as_denom(NULL,&det,&(lat.basis)); - } - - // set lattice - ibz_set(&lat.denom, rand_denom); - quat_lattice_hnf(&lat); - // set other parameter - ibz_set(&q,rand_q % 1024); - //reduce - res = res || quat_lattice_lll(&red,&lat,&q,0); - // test lll reduced - res = res || !quat_dim4_lll_verify(&red,&coeff,&q); - // test lattice equality - ibz_copy(&(test.denom),&(lat.denom)); - ibz_mat_4x4_copy(&(test.basis),&(red)); - quat_lattice_hnf(&test); - res = res || !quat_lattice_equal(&test,&lat); - } - - if (res != 0){ - printf("Quaternion unit test with randomization for lattice_lll failed\n"); - } - ibz_finalize(&num); - ibz_finalize(&denom); - ibz_finalize(&q); - ibz_finalize(&det); - ibq_finalize(&coeff); - ibz_mat_4x4_finalize(&red); - quat_lattice_finalize(&lat); - quat_lattice_finalize(&test); - return(res); -} - -//int quat_lattice_contains_without_alg(quat_alg_coord_t *coord, const quat_lattice_t *lat, const quat_alg_elem_t *x); -int quat_test_randomized_lattice_contains_without_alg(){ +// int quat_lattice_contains(ibz_vec_4_t *coord, const quat_lattice_t *lat, const quat_alg_elem_t +// *x); +int +quat_test_randomized_lattice_contains(int lattice_bitsize, int coord_bitsize, int iterations) +{ // only tests the case where the element is in the lattice int res = 0; + int randret = 0; ibz_t det; quat_alg_elem_t x, cmp; - quat_alg_coord_t coord; + ibz_vec_4_t coord, set_coord; quat_lattice_t lat; - uint64_t rand_denom; - int64_t rand[5][4]; ibz_init(&det); - quat_alg_coord_init(&coord); + ibz_vec_4_init(&coord); + ibz_vec_4_init(&set_coord); quat_alg_elem_init(&cmp); quat_alg_elem_init(&x); quat_lattice_init(&lat); - for (int iter = 0; iter < 10; iter++){ - rand_denom = 0; - while(rand_denom ==0) { - int randret = randombytes((unsigned char*)&rand_denom, sizeof(uint64_t)); - if (randret != 0) - return 1; - } - // generate random invertible matrix - ibz_set(&det,0); - while(ibz_is_zero(&det)){ - int randret = randombytes((unsigned char*)rand, 5*4*sizeof(uint64_t)); - if (randret != 0) - return 1; - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 4; j++){ - ibz_set(&(lat.basis[i][j]),rand[j][i]); - } - ibz_set(&(coord[i]),rand[4][i]); - } - ibz_mat_4x4_inv_with_det_as_denom(NULL,&det,&(lat.basis)); + for (int iter = 0; iter < iterations; iter++) { + randret = quat_test_input_random_lattice_generation(&lat, lattice_bitsize, 1, 1); + for (int i = 0; i < 4; i++) { + randret = randret | !ibz_rand_interval_bits(&(set_coord[i]), coord_bitsize); } + if (randret != 0) + goto fin; - ibz_set(&(lat.denom),rand_denom); - quat_lattice_hnf(&lat); - ibz_mat_4x4_eval(&(x.coord),&(lat.basis),&coord); - ibz_copy(&(x.denom),&(lat.denom)); - ibz_vec_4_set(&coord,1,0,1,0); - if(quat_lattice_contains_without_alg(&coord,&lat,&x)){ - ibz_mat_4x4_eval(&(cmp.coord),&(lat.basis),&coord); - ibz_copy(&(cmp.denom),&(lat.denom)); - quat_alg_sub(&cmp,&x,&cmp); + ibz_mat_4x4_eval(&(x.coord), &(lat.basis), &set_coord); + ibz_copy(&(x.denom), &(lat.denom)); + ibz_vec_4_set(&coord, 1, 0, 1, 0); + if (quat_lattice_contains(&coord, &lat, &x)) { + ibz_mat_4x4_eval(&(cmp.coord), &(lat.basis), &coord); + ibz_copy(&(cmp.denom), &(lat.denom)); + quat_alg_sub(&cmp, &x, &cmp); res = res || !quat_alg_elem_is_zero(&cmp); + ibz_vec_4_sub(&coord, &coord, &set_coord); + res = res || !ibz_vec_4_is_zero(&coord); } else { res = 1; } - } - - if (res != 0){ - printf("Quaternion unit test with randomization for lattice_contains_without_alg failed\n"); +fin:; + if (randret != 0) { + printf("Randomness failed in quaternion unit test with randomization for lattice_contains\n"); + } + if (res != 0) { + printf("Quaternion unit test with randomization for lattice_contains failed\n"); } ibz_finalize(&det); - quat_alg_coord_finalize(&coord); + ibz_vec_4_finalize(&coord); + ibz_vec_4_finalize(&set_coord); quat_alg_elem_finalize(&x); quat_alg_elem_finalize(&cmp); quat_lattice_finalize(&lat); - return(res); + return (res); } - -//int ibz_cornacchia_extended(ibz_t *x, ibz_t *y, const ibz_t *n, const short *prime_list, const int prime_list_length, short primality_test_iterations, const ibz_t *bad_primes_prod); -int quat_test_randomized_ibz_cornacchia_extended(){ +// void quat_lattice_add(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t +// *lat2) +int +quat_test_randomized_lattice_add(int lattice_bitsize, int iterations) +{ int res = 0; - ibz_t x,y,n, prod,c_res,bad, p; - int counter = 1; - int counter_p = 3; - int counter_good = 1; - short rand_exps[100]; - int64_t rand_fact; - short primes[100]; - short good_primes[100]; - int primes_length = 100; - short iterations = 20; + int randret = 0; + ibz_t det; + quat_lattice_t lat1, lat2, sum; + ibz_init(&det); + quat_lattice_init(&lat1); + quat_lattice_init(&lat2); + quat_lattice_init(&sum); + + for (int iter = 0; iter < iterations; iter++) { + randret = quat_test_input_random_lattice_generation(&lat1, lattice_bitsize, 1, 1); + randret = randret | quat_test_input_random_lattice_generation(&lat2, lattice_bitsize, 1, 1); + if (!randret) + goto fin; + quat_lattice_add(&sum, &lat1, &lat2); + res = res | !quat_lattice_inclusion(&lat1, &sum); + res = res | !quat_lattice_inclusion(&lat2, &sum); + } + +fin:; + if (randret != 0) { + printf("Randomness failed in quaternion unit test with randomization for lattice_add\n"); + } + if (res != 0) { + printf("Quaternion unit test with randomization for lattice_add failed\n"); + } + ibz_finalize(&det); + quat_lattice_finalize(&lat1); + quat_lattice_finalize(&lat2); + quat_lattice_finalize(&sum); + return (res); +} + +// int ibz_cornacchia_prime(ibz_t *x, ibz_t *y, const ibz_t *n, const ibz_t *p); +int +quat_test_randomized_ibz_cornacchia_prime(int bitsize, int n_bound, int iterations) +{ + int res = 0; + ibz_t x, y, n, prod, c_res, p; + int32_t rand_fact; + int randret = 0; ibz_init(&x); ibz_init(&y); ibz_init(&n); ibz_init(&p); ibz_init(&prod); ibz_init(&c_res); - ibz_init(&bad); - ibz_set(&bad,1); - good_primes[0] = 2; - primes[0] = 2; - while(counter <100){ - ibz_set(&p,counter_p); - if(ibz_probab_prime(&p,20)){ - primes[counter]=(short) counter_p; - if(counter_p%4 == 3){ - ibz_mul(&bad,&bad,&p); - } else { - good_primes[counter_good]=(short) counter_p; - counter_good++; - } - counter++; - } - counter_p++; - } - - for (int iter = 0; iter < 1000; iter++){ - ibz_set(&n,1); - int randret = randombytes((unsigned char*)&rand_exps, 100*sizeof(short)); - for(int i = 0; i < counter_good; i++){ - ibz_set(&p,good_primes[i]); - ibz_pow(&p,&p,((int)((unsigned short)rand_exps[i])%16)); - ibz_mul(&n,&n,&p); - } - // sample large prime as last factor + for (int iter = 0; iter < iterations; iter++) { + // Sample small n for cornacchia rand_fact = 0; - while(rand_fact == 0) { - int randret = randombytes((unsigned char*)&rand_fact, sizeof(uint64_t)); + while (rand_fact < 1) { + randret = randret | randombytes((unsigned char *)&rand_fact, sizeof(int32_t)); if (randret != 0) - return 1; - if(rand_fact < 0) - rand_fact = - rand_fact; - ibz_set(&p,rand_fact); - if(!ibz_probab_prime(&p,20)) - rand_fact = 0; + goto fin; + if (rand_fact < 0) + rand_fact = -rand_fact; + rand_fact = rand_fact % n_bound; + ibz_set(&n, rand_fact); } - ibz_mul(&n,&n,&p); - - ibz_set(&prod,4); - ibz_mod(&prod,&p,&prod); - if((ibz_probab_prime(&p,100) || (ibz_is_one(&p))) && (ibz_is_one(&prod))){ - res = res || (!ibz_cornacchia_extended(&x,&y,&n,primes,100,100,&bad)); - if(res){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_add(&c_res,&c_res,&prod); - res = res || ibz_cmp(&n,&c_res); + randret = randret | !ibz_generate_random_prime(&p, 0, bitsize, 32); + if (randret != 0) + goto fin; + // If the legendre symbol is ok, Cornacchia should sometimes be able to solve + ibz_neg(&prod, &n); + ibz_mod(&prod, &prod, &p); + if (ibz_legendre(&prod, &p) > -1) { + // If there is output, check the output is correct + if (ibz_cornacchia_prime(&x, &y, &n, &p)) { + ibz_mul(&c_res, &x, &x); + ibz_mul(&prod, &y, &y); + ibz_mul(&prod, &prod, &n); + ibz_add(&c_res, &c_res, &prod); + res = res || (0 != ibz_cmp(&p, &c_res)); } - //(this test depends on the primality test) - // now it is not a prime factor any more - ibz_set(&p,rand_fact); - ibz_mul(&n,&n,&p); - res = res || ibz_cornacchia_extended(&x,&y,&n,primes,100,1000,&bad); - // multiply with random bad primes - ibz_div(&n,&p,&n,&p); - int randret = randombytes((unsigned char*)&rand_exps, 100*sizeof(short)); - if (randret != 0) - return 1; - for(int i = 0; i < 100; i++){ - ibz_set(&p,primes[i]); - ibz_pow(&p,&p,((int)((unsigned short)rand_exps[i])%8)); - ibz_mul(&n,&n,&p); - } - ibz_gcd(&p,&n,&bad); - if(ibz_is_one(&p)){ - res = res || !ibz_cornacchia_extended(&x,&y,&n,primes,100,100,&bad); - if(res){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_add(&c_res,&c_res,&prod); - res = res || ibz_cmp(&n,&c_res); - } - } else { - res = res || ibz_cornacchia_extended(&x,&y,&n,primes,100,100,&bad); - } } else { - res = res || ibz_cornacchia_extended(&x,&y,&n,primes,100,1000,&bad); - for(int i = 0; i < 100; i++){ - ibz_set(&p,primes[i]); - ibz_pow(&p,&p,((int)((unsigned short)rand_exps[i])%8)); - ibz_mul(&n,&n,&p); - } - ibz_gcd(&p,&n,&bad); - res = res || ibz_cornacchia_extended(&x,&y,&n,primes,100,100,&bad); - } + // Otherwise Cornacchia should fail + res = res || (ibz_cornacchia_prime(&x, &y, &n, &p)); + } } +fin:; - if (res != 0){ - printf("Quaternion unit test with randomization for ibz_cornacchia_extended failed\n"); + if (randret != 0) { + printf("Randomness failed in quaternion unit test with randomization for " + "ibz_cornacchia_prime\n"); + } + if (res != 0) { + printf("Quaternion unit test with randomization for ibz_cornacchia_prime failed\n"); } ibz_finalize(&x); ibz_finalize(&y); @@ -739,24 +275,19 @@ int quat_test_randomized_ibz_cornacchia_extended(){ ibz_finalize(&p); ibz_finalize(&prod); ibz_finalize(&c_res); - ibz_finalize(&bad); return res; } - // run all previous tests -int quat_test_with_randomization(){ +int +quat_test_with_randomization(void) +{ int res = 0; printf("\nRunning randomized tests from quaternion module\n"); - res = res | quat_test_randomized_ibz_mat_2x2_inv_mod(); - res = res | quat_test_randomized_2x2_lattice_enumerate_cvp_filter(); - res = res | quat_test_randomized_ibz_mat_4x4_inv_with_det_as_denom(); - res = res | quat_test_randomized_ibz_mat_4x8_hnf_core(); - res = res | quat_test_randomized_ibz_4x5_right_ker_mod_prime(); - res = res | quat_test_randomized_ibz_4x4_right_ker_mod_prime(); - res = res | quat_test_randomized_ibz_4x4_right_ker_mod_power_of_2(); - res = res | quat_test_randomized_lattice_lll(); - res = res | quat_test_randomized_lattice_contains_without_alg(); - res = res | quat_test_randomized_ibz_cornacchia_extended(); - return(res); + res = res | quat_test_randomized_ibz_mat_2x2_inv_mod(370, 270, 100); + res = res | quat_test_randomized_ibz_mat_4x4_inv_with_det_as_denom(1500, 10); + res = res | quat_test_randomized_lattice_contains(250, 250, 10); + res = res | quat_test_randomized_lattice_add(700, 100); + res = res | quat_test_randomized_ibz_cornacchia_prime(128, 6, 10); + return (res); } diff --git a/src/quaternion/ref/generic/test/test_quaternions.c b/src/quaternion/ref/generic/test/test_quaternions.c index 111842c..ffa5ac0 100644 --- a/src/quaternion/ref/generic/test/test_quaternions.c +++ b/src/quaternion/ref/generic/test/test_quaternions.c @@ -1,20 +1,70 @@ +#include +#include +#include +#include + #include "quaternion_tests.h" +#include +#include // run all tests in module -int main(){ +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int help = 0; + int seed_set = 0; int res = 0; + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + } + + if (help) { + printf("Usage: %s [--seed=]\n", argv[0]); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + printf("Running quaternion module unit tests\n"); + + res = res | ibz_test_intbig(); + res = res | mini_gmp_test(); res = res | quat_test_finit(); res = res | quat_test_dim4(); res = res | quat_test_dim2(); - res = res | quat_test_matkermod(); res = res | quat_test_integers(); + res = res | quat_test_hnf(); res = res | quat_test_algebra(); res = res | quat_test_lattice(); + res = res | quat_test_lll(); res = res | quat_test_lideal(); + res = res | quat_test_normeq(); + res = res | quat_test_lat_ball(); res = res | quat_test_with_randomization(); - if(res != 0){ + if (res != 0) { printf("\nSome tests failed!\n"); } - return(res); + return (res); } diff --git a/src/protocols/CMakeLists.txt b/src/signature/CMakeLists.txt similarity index 100% rename from src/protocols/CMakeLists.txt rename to src/signature/CMakeLists.txt diff --git a/src/signature/ref/CMakeLists.txt b/src/signature/ref/CMakeLists.txt new file mode 100644 index 0000000..d0ba315 --- /dev/null +++ b/src/signature/ref/CMakeLists.txt @@ -0,0 +1,3 @@ +set(LVLX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lvlx) + +include(${SELECT_SQISIGN_VARIANT}) diff --git a/src/signature/ref/include/signature.h b/src/signature/ref/include/signature.h new file mode 100644 index 0000000..ba38c36 --- /dev/null +++ b/src/signature/ref/include/signature.h @@ -0,0 +1,97 @@ +/** @file + * + * @brief The key generation and signature protocols + */ + +#ifndef SIGNATURE_H +#define SIGNATURE_H + +#include +#include +#include +#include + +/** @defgroup signature SQIsignHD key generation and signature protocols + * @{ + */ +/** @defgroup signature_t Types for SQIsignHD key generation and signature protocols + * @{ + */ + +/** @brief Type for the secret keys + * + * @typedef secret_key_t + * + * @struct secret_key + * + */ +typedef struct secret_key +{ + ec_curve_t curve; /// the public curve, but with little precomputations + quat_left_ideal_t secret_ideal; + ibz_mat_2x2_t mat_BAcan_to_BA0_two; // mat_BA0_to_BAcan*BA0 = BAcan, where BAcan is the + // canonical basis of EA[2^e], and BA0 the image of the + // basis of E0[2^e] through the secret isogeny + ec_basis_t canonical_basis; // the canonical basis of the public key curve +} secret_key_t; + +/** @} + */ + +/*************************** Functions *****************************/ + +void secret_key_init(secret_key_t *sk); +void secret_key_finalize(secret_key_t *sk); + +/** + * @brief Key generation + * + * @param pk Output: will contain the public key + * @param sk Output: will contain the secret key + * @returns 1 if success, 0 otherwise + */ +int protocols_keygen(public_key_t *pk, secret_key_t *sk); + +/** + * @brief Signature computation + * + * @param sig Output: will contain the signature + * @param sk secret key + * @param pk public key + * @param m message + * @param l size + * @returns 1 if success, 0 otherwise + */ +int protocols_sign(signature_t *sig, const public_key_t *pk, secret_key_t *sk, const unsigned char *m, size_t l); + +/*************************** Encoding *****************************/ + +/** @defgroup encoding Encoding and decoding functions + * @{ + */ + +/** + * @brief Encodes a secret key as a byte array + * + * @param enc : Byte array to encode the secret key (including public key) in + * @param sk : Secret key to encode + * @param pk : Public key to encode + */ +void secret_key_to_bytes(unsigned char *enc, const secret_key_t *sk, const public_key_t *pk); + +/** + * @brief Decodes a secret key (and public key) from a byte array + * + * @param sk : Structure to decode the secret key in + * @param pk : Structure to decode the public key in + * @param enc : Byte array to decode + */ +void secret_key_from_bytes(secret_key_t *sk, public_key_t *pk, const unsigned char *enc); + +/** @} + */ + +/** @} + */ + +#endif diff --git a/src/signature/ref/lvl1/CMakeLists.txt b/src/signature/ref/lvl1/CMakeLists.txt new file mode 100644 index 0000000..c7637fa --- /dev/null +++ b/src/signature/ref/lvl1/CMakeLists.txt @@ -0,0 +1 @@ +include(../lvlx.cmake) diff --git a/src/signature/ref/lvl1/test/CMakeLists.txt b/src/signature/ref/lvl1/test/CMakeLists.txt new file mode 100644 index 0000000..316e0a8 --- /dev/null +++ b/src/signature/ref/lvl1/test/CMakeLists.txt @@ -0,0 +1 @@ +include(../../lvlx_test.cmake) diff --git a/src/signature/ref/lvl3/CMakeLists.txt b/src/signature/ref/lvl3/CMakeLists.txt new file mode 100644 index 0000000..c7637fa --- /dev/null +++ b/src/signature/ref/lvl3/CMakeLists.txt @@ -0,0 +1 @@ +include(../lvlx.cmake) diff --git a/src/signature/ref/lvl3/test/CMakeLists.txt b/src/signature/ref/lvl3/test/CMakeLists.txt new file mode 100644 index 0000000..316e0a8 --- /dev/null +++ b/src/signature/ref/lvl3/test/CMakeLists.txt @@ -0,0 +1 @@ +include(../../lvlx_test.cmake) diff --git a/src/signature/ref/lvl5/CMakeLists.txt b/src/signature/ref/lvl5/CMakeLists.txt new file mode 100644 index 0000000..c7637fa --- /dev/null +++ b/src/signature/ref/lvl5/CMakeLists.txt @@ -0,0 +1 @@ +include(../lvlx.cmake) diff --git a/src/signature/ref/lvl5/test/CMakeLists.txt b/src/signature/ref/lvl5/test/CMakeLists.txt new file mode 100644 index 0000000..316e0a8 --- /dev/null +++ b/src/signature/ref/lvl5/test/CMakeLists.txt @@ -0,0 +1 @@ +include(../../lvlx_test.cmake) diff --git a/src/signature/ref/lvlx.cmake b/src/signature/ref/lvlx.cmake new file mode 100644 index 0000000..aad1ee5 --- /dev/null +++ b/src/signature/ref/lvlx.cmake @@ -0,0 +1,13 @@ +set(SOURCE_FILES_SIGNATURE_GENERIC_REF + ${LVLX_DIR}/encode_signature.c + ${LVLX_DIR}/keygen.c + ${LVLX_DIR}/sign.c +) + +add_library(${LIB_SIGNATURE_${SVARIANT_UPPER}} STATIC ${SOURCE_FILES_SIGNATURE_GENERIC_REF}) +target_link_libraries(${LIB_SIGNATURE_${SVARIANT_UPPER}} ${LIB_QUATERNION} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}} ${LIB_HD_${SVARIANT_UPPER}} ${LIB_ID2ISO_${SVARIANT_UPPER}} ${LIB_VERIFICATION_${SVARIANT_UPPER}}) +target_include_directories(${LIB_SIGNATURE_${SVARIANT_UPPER}} PRIVATE ${INC_PUBLIC} ${INC_COMMON} ${INC_QUATERNION} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_HD} ${INC_ID2ISO} ${INC_VERIFICATION} ${INC_SIGNATURE}) +target_compile_options(${LIB_SIGNATURE_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) +target_compile_definitions(${LIB_SIGNATURE_${SVARIANT_UPPER}} PUBLIC SQISIGN_VARIANT=${SVARIANT_LOWER}) + +add_subdirectory(test) diff --git a/src/signature/ref/lvlx/encode_signature.c b/src/signature/ref/lvlx/encode_signature.c new file mode 100644 index 0000000..112c695 --- /dev/null +++ b/src/signature/ref/lvlx/encode_signature.c @@ -0,0 +1,208 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +typedef unsigned char byte_t; + +// digits + +static void +encode_digits(byte_t *enc, const digit_t *x, size_t nbytes) +{ +#ifdef TARGET_BIG_ENDIAN + const size_t ndigits = nbytes / sizeof(digit_t); + const size_t rem = nbytes % sizeof(digit_t); + + for (size_t i = 0; i < ndigits; i++) + ((digit_t *)enc)[i] = BSWAP_DIGIT(x[i]); + if (rem) { + digit_t ld = BSWAP_DIGIT(x[ndigits]); + memcpy(enc + ndigits * sizeof(digit_t), (byte_t *)&ld, rem); + } +#else + memcpy(enc, (const byte_t *)x, nbytes); +#endif +} + +static void +decode_digits(digit_t *x, const byte_t *enc, size_t nbytes, size_t ndigits) +{ + assert(nbytes <= ndigits * sizeof(digit_t)); + memcpy((byte_t *)x, enc, nbytes); + memset((byte_t *)x + nbytes, 0, ndigits * sizeof(digit_t) - nbytes); + +#ifdef TARGET_BIG_ENDIAN + for (size_t i = 0; i < ndigits; i++) + x[i] = BSWAP_DIGIT(x[i]); +#endif +} + +// ibz_t + +static byte_t * +ibz_to_bytes(byte_t *enc, const ibz_t *x, size_t nbytes, bool sgn) +{ +#ifndef NDEBUG + { + // make sure there is enough space + ibz_t abs, bnd; + ibz_init(&bnd); + ibz_init(&abs); + ibz_pow(&bnd, &ibz_const_two, 8 * nbytes - sgn); + ibz_abs(&abs, x); + assert(ibz_cmp(&abs, &bnd) < 0); + ibz_finalize(&bnd); + ibz_finalize(&abs); + } +#endif + const size_t digits = (nbytes + sizeof(digit_t) - 1) / sizeof(digit_t); + digit_t d[digits]; + memset(d, 0, sizeof(d)); + if (ibz_cmp(x, &ibz_const_zero) >= 0) { + // non-negative, straightforward. + ibz_to_digits(d, x); + } else { + assert(sgn); + // negative; use two's complement. + ibz_t tmp; + ibz_init(&tmp); + ibz_neg(&tmp, x); + ibz_sub(&tmp, &tmp, &ibz_const_one); + ibz_to_digits(d, &tmp); + for (size_t i = 0; i < digits; ++i) + d[i] = ~d[i]; +#ifndef NDEBUG + { + // make sure the result is correct + ibz_t chk; + ibz_init(&chk); + ibz_copy_digit_array(&tmp, d); + ibz_sub(&tmp, &tmp, x); + ibz_pow(&chk, &ibz_const_two, 8 * sizeof(d)); + assert(!ibz_cmp(&tmp, &chk)); + ibz_finalize(&chk); + } +#endif + ibz_finalize(&tmp); + } + encode_digits(enc, d, nbytes); + return enc + nbytes; +} + +static const byte_t * +ibz_from_bytes(ibz_t *x, const byte_t *enc, size_t nbytes, bool sgn) +{ + assert(nbytes > 0); + const size_t ndigits = (nbytes + sizeof(digit_t) - 1) / sizeof(digit_t); + assert(ndigits > 0); + digit_t d[ndigits]; + memset(d, 0, sizeof(d)); + decode_digits(d, enc, nbytes, ndigits); + if (sgn && enc[nbytes - 1] >> 7) { + // negative, decode two's complement + const size_t s = sizeof(digit_t) - 1 - (sizeof(d) - nbytes); + assert(s < sizeof(digit_t)); + d[ndigits - 1] |= ((digit_t)-1) >> 8 * s << 8 * s; + for (size_t i = 0; i < ndigits; ++i) + d[i] = ~d[i]; + ibz_copy_digits(x, d, ndigits); + ibz_add(x, x, &ibz_const_one); + ibz_neg(x, x); + } else { + // non-negative + ibz_copy_digits(x, d, ndigits); + } + return enc + nbytes; +} + +// public API + +void +secret_key_to_bytes(byte_t *enc, const secret_key_t *sk, const public_key_t *pk) +{ +#ifndef NDEBUG + byte_t *const start = enc; +#endif + + enc = public_key_to_bytes(enc, pk); + +#ifndef NDEBUG + { + fp2_t lhs, rhs; + fp2_mul(&lhs, &sk->curve.A, &pk->curve.C); + fp2_mul(&rhs, &sk->curve.C, &pk->curve.A); + assert(fp2_is_equal(&lhs, &rhs)); + } +#endif + + enc = ibz_to_bytes(enc, &sk->secret_ideal.norm, FP_ENCODED_BYTES, false); + { + quat_alg_elem_t gen; + quat_alg_elem_init(&gen); + int ret UNUSED = quat_lideal_generator(&gen, &sk->secret_ideal, &QUATALG_PINFTY); + assert(ret); + // we skip encoding the denominator since it won't change the generated ideal +#ifndef NDEBUG + { + // let's make sure that the denominator is indeed coprime to the norm of the ideal + ibz_t gcd; + ibz_init(&gcd); + ibz_gcd(&gcd, &gen.denom, &sk->secret_ideal.norm); + assert(!ibz_cmp(&gcd, &ibz_const_one)); + ibz_finalize(&gcd); + } +#endif + enc = ibz_to_bytes(enc, &gen.coord[0], FP_ENCODED_BYTES, true); + enc = ibz_to_bytes(enc, &gen.coord[1], FP_ENCODED_BYTES, true); + enc = ibz_to_bytes(enc, &gen.coord[2], FP_ENCODED_BYTES, true); + enc = ibz_to_bytes(enc, &gen.coord[3], FP_ENCODED_BYTES, true); + quat_alg_elem_finalize(&gen); + } + + enc = ibz_to_bytes(enc, &sk->mat_BAcan_to_BA0_two[0][0], TORSION_2POWER_BYTES, false); + enc = ibz_to_bytes(enc, &sk->mat_BAcan_to_BA0_two[0][1], TORSION_2POWER_BYTES, false); + enc = ibz_to_bytes(enc, &sk->mat_BAcan_to_BA0_two[1][0], TORSION_2POWER_BYTES, false); + enc = ibz_to_bytes(enc, &sk->mat_BAcan_to_BA0_two[1][1], TORSION_2POWER_BYTES, false); + + assert(enc - start == SECRETKEY_BYTES); +} + +void +secret_key_from_bytes(secret_key_t *sk, public_key_t *pk, const byte_t *enc) +{ +#ifndef NDEBUG + const byte_t *const start = enc; +#endif + + enc = public_key_from_bytes(pk, enc); + + { + ibz_t norm; + ibz_init(&norm); + quat_alg_elem_t gen; + quat_alg_elem_init(&gen); + enc = ibz_from_bytes(&norm, enc, FP_ENCODED_BYTES, false); + enc = ibz_from_bytes(&gen.coord[0], enc, FP_ENCODED_BYTES, true); + enc = ibz_from_bytes(&gen.coord[1], enc, FP_ENCODED_BYTES, true); + enc = ibz_from_bytes(&gen.coord[2], enc, FP_ENCODED_BYTES, true); + enc = ibz_from_bytes(&gen.coord[3], enc, FP_ENCODED_BYTES, true); + quat_lideal_create(&sk->secret_ideal, &gen, &norm, &MAXORD_O0, &QUATALG_PINFTY); + ibz_finalize(&norm); + quat_alg_elem_finalize(&gen); + } + + enc = ibz_from_bytes(&sk->mat_BAcan_to_BA0_two[0][0], enc, TORSION_2POWER_BYTES, false); + enc = ibz_from_bytes(&sk->mat_BAcan_to_BA0_two[0][1], enc, TORSION_2POWER_BYTES, false); + enc = ibz_from_bytes(&sk->mat_BAcan_to_BA0_two[1][0], enc, TORSION_2POWER_BYTES, false); + enc = ibz_from_bytes(&sk->mat_BAcan_to_BA0_two[1][1], enc, TORSION_2POWER_BYTES, false); + + assert(enc - start == SECRETKEY_BYTES); + + sk->curve = pk->curve; + ec_curve_to_basis_2f_from_hint(&sk->canonical_basis, &sk->curve, TORSION_EVEN_POWER, pk->hint_pk); +} diff --git a/src/signature/ref/lvlx/keygen.c b/src/signature/ref/lvlx/keygen.c new file mode 100644 index 0000000..c1c206c --- /dev/null +++ b/src/signature/ref/lvlx/keygen.c @@ -0,0 +1,64 @@ +#include +#include +#include +#include +#include + +void +secret_key_init(secret_key_t *sk) +{ + quat_left_ideal_init(&(sk->secret_ideal)); + ibz_mat_2x2_init(&(sk->mat_BAcan_to_BA0_two)); + ec_curve_init(&sk->curve); +} + +void +secret_key_finalize(secret_key_t *sk) +{ + quat_left_ideal_finalize(&(sk->secret_ideal)); + ibz_mat_2x2_finalize(&(sk->mat_BAcan_to_BA0_two)); +} + +int +protocols_keygen(public_key_t *pk, secret_key_t *sk) +{ + int found = 0; + ec_basis_t B_0_two; + + // iterating until a solution has been found + while (!found) { + + found = quat_sampling_random_ideal_O0_given_norm( + &sk->secret_ideal, &SEC_DEGREE, 1, &QUAT_represent_integer_params, NULL); + + // replacing the secret key ideal by a shorter equivalent one for efficiency + found = found && quat_lideal_prime_norm_reduced_equivalent( + &sk->secret_ideal, &QUATALG_PINFTY, QUAT_primality_num_iter, QUAT_equiv_bound_coeff); + + // ideal to isogeny clapotis + + found = found && dim2id2iso_arbitrary_isogeny_evaluation(&B_0_two, &sk->curve, &sk->secret_ideal); + } + + // Assert the isogeny was found and images have the correct order + assert(test_basis_order_twof(&B_0_two, &sk->curve, TORSION_EVEN_POWER)); + + // Compute a deterministic basis with a hint to speed up verification + pk->hint_pk = ec_curve_to_basis_2f_to_hint(&sk->canonical_basis, &sk->curve, TORSION_EVEN_POWER); + + // Assert the deterministic basis we computed has the correct order + assert(test_basis_order_twof(&sk->canonical_basis, &sk->curve, TORSION_EVEN_POWER)); + + // Compute the 2x2 matrix basis change from the canonical basis to the evaluation of our secret + // isogeny + change_of_basis_matrix_tate( + &sk->mat_BAcan_to_BA0_two, &sk->canonical_basis, &B_0_two, &sk->curve, TORSION_EVEN_POWER); + + // Set the public key from the codomain curve + copy_curve(&pk->curve, &sk->curve); + pk->curve.is_A24_computed_and_normalized = false; // We don't send any precomputation + + assert(fp2_is_one(&pk->curve.C) == 0xFFFFFFFF); + + return found; +} diff --git a/src/signature/ref/lvlx/sign.c b/src/signature/ref/lvlx/sign.c new file mode 100644 index 0000000..9216bbe --- /dev/null +++ b/src/signature/ref/lvlx/sign.c @@ -0,0 +1,634 @@ +#include +#include +#include +#include +#include +#include + +// compute the commitment with ideal to isogeny clapotis +// and apply it to the basis of E0 (together with the multiplication by some scalar u) +static bool +commit(ec_curve_t *E_com, ec_basis_t *basis_even_com, quat_left_ideal_t *lideal_com) +{ + + bool found = false; + + found = quat_sampling_random_ideal_O0_given_norm(lideal_com, &COM_DEGREE, 1, &QUAT_represent_integer_params, NULL); + // replacing it with a shorter prime norm equivalent ideal + found = found && quat_lideal_prime_norm_reduced_equivalent( + lideal_com, &QUATALG_PINFTY, QUAT_primality_num_iter, QUAT_equiv_bound_coeff); + // ideal to isogeny clapotis + found = found && dim2id2iso_arbitrary_isogeny_evaluation(basis_even_com, E_com, lideal_com); + return found; +} + +static void +compute_challenge_ideal_signature(quat_left_ideal_t *lideal_chall_two, const signature_t *sig, const secret_key_t *sk) +{ + ibz_vec_2_t vec; + ibz_vec_2_init(&vec); + + // vec is a vector [1, chall_coeff] coefficients encoding the kernel of the challenge + // isogeny as B[0] + chall_coeff*B[1] where B is the canonical basis of the + // 2^TORSION_EVEN_POWER torsion of EA + ibz_set(&vec[0], 1); + ibz_copy_digit_array(&vec[1], sig->chall_coeff); + + // now we compute the ideal associated to the challenge + // for that, we need to find vec such that + // the kernel of the challenge isogeny is generated by vec[0]*B0[0] + vec[1]*B0[1] where B0 + // is the image through the secret key isogeny of the canonical basis E0 + ibz_mat_2x2_eval(&vec, &(sk->mat_BAcan_to_BA0_two), &vec); + + // lideal_chall_two is the pullback of the ideal challenge through the secret key ideal + id2iso_kernel_dlogs_to_ideal_even(lideal_chall_two, &vec, TORSION_EVEN_POWER); + assert(ibz_cmp(&lideal_chall_two->norm, &TORSION_PLUS_2POWER) == 0); + + ibz_vec_2_finalize(&vec); +} + +static void +sample_response(quat_alg_elem_t *x, const quat_lattice_t *lattice, const ibz_t *lattice_content) +{ + ibz_t bound; + ibz_init(&bound); + ibz_pow(&bound, &ibz_const_two, SQIsign_response_length); + ibz_sub(&bound, &bound, &ibz_const_one); + ibz_mul(&bound, &bound, lattice_content); + + int ok UNUSED = quat_lattice_sample_from_ball(x, lattice, &QUATALG_PINFTY, &bound); + assert(ok); + + ibz_finalize(&bound); +} + +static void +compute_response_quat_element(quat_alg_elem_t *resp_quat, + ibz_t *lattice_content, + const secret_key_t *sk, + const quat_left_ideal_t *lideal_chall_two, + const quat_left_ideal_t *lideal_commit) +{ + quat_left_ideal_t lideal_chall_secret; + quat_lattice_t lattice_hom_chall_to_com, lat_commit; + + // Init + quat_left_ideal_init(&lideal_chall_secret); + quat_lattice_init(&lat_commit); + quat_lattice_init(&lattice_hom_chall_to_com); + + // lideal_chall_secret = lideal_secret * lideal_chall_two + quat_lideal_inter(&lideal_chall_secret, lideal_chall_two, &(sk->secret_ideal), &QUATALG_PINFTY); + + // now we compute lideal_com_to_chall which is dual(Icom)* lideal_chall_secret + quat_lattice_conjugate_without_hnf(&lat_commit, &(lideal_commit->lattice)); + quat_lattice_intersect(&lattice_hom_chall_to_com, &lideal_chall_secret.lattice, &lat_commit); + + // sampling the smallest response + ibz_mul(lattice_content, &lideal_chall_secret.norm, &lideal_commit->norm); + sample_response(resp_quat, &lattice_hom_chall_to_com, lattice_content); + + // Clean up + quat_left_ideal_finalize(&lideal_chall_secret); + quat_lattice_finalize(&lat_commit); + quat_lattice_finalize(&lattice_hom_chall_to_com); +} + +static void +compute_backtracking_signature(signature_t *sig, quat_alg_elem_t *resp_quat, ibz_t *lattice_content, ibz_t *remain) +{ + uint_fast8_t backtracking; + ibz_t tmp; + ibz_init(&tmp); + + ibz_vec_4_t dummy_coord; + ibz_vec_4_init(&dummy_coord); + + quat_alg_make_primitive(&dummy_coord, &tmp, resp_quat, &MAXORD_O0); + ibz_mul(&resp_quat->denom, &resp_quat->denom, &tmp); + assert(quat_lattice_contains(NULL, &MAXORD_O0, resp_quat)); + + // the backtracking is the common part of the response and the challenge + // its degree is the scalar tmp computed above such that quat_resp is in tmp * O0. + backtracking = ibz_two_adic(&tmp); + sig->backtracking = backtracking; + + ibz_pow(&tmp, &ibz_const_two, backtracking); + ibz_div(lattice_content, remain, lattice_content, &tmp); + + ibz_finalize(&tmp); + ibz_vec_4_finalize(&dummy_coord); +} + +static uint_fast8_t +compute_random_aux_norm_and_helpers(signature_t *sig, + ibz_t *random_aux_norm, + ibz_t *degree_resp_inv, + ibz_t *remain, + const ibz_t *lattice_content, + quat_alg_elem_t *resp_quat, + quat_left_ideal_t *lideal_com_resp, + quat_left_ideal_t *lideal_commit) +{ + uint_fast8_t pow_dim2_deg_resp; + uint_fast8_t exp_diadic_val_full_resp; + + ibz_t tmp, degree_full_resp, degree_odd_resp, norm_d; + + // Init + ibz_init(°ree_full_resp); + ibz_init(°ree_odd_resp); + ibz_init(&norm_d); + ibz_init(&tmp); + + quat_alg_norm(°ree_full_resp, &norm_d, resp_quat, &QUATALG_PINFTY); + + // dividing by n(lideal_com) * n(lideal_secret_chall) + assert(ibz_is_one(&norm_d)); + ibz_div(°ree_full_resp, remain, °ree_full_resp, lattice_content); + assert(ibz_cmp(remain, &ibz_const_zero) == 0); + + // computing the diadic valuation + exp_diadic_val_full_resp = ibz_two_adic(°ree_full_resp); + sig->two_resp_length = exp_diadic_val_full_resp; + + // removing the power of two part + ibz_pow(&tmp, &ibz_const_two, exp_diadic_val_full_resp); + ibz_div(°ree_odd_resp, remain, °ree_full_resp, &tmp); + assert(ibz_cmp(remain, &ibz_const_zero) == 0); +#ifndef NDEBUG + ibz_pow(&tmp, &ibz_const_two, SQIsign_response_length - sig->backtracking); + assert(ibz_cmp(&tmp, °ree_odd_resp) > 0); +#endif + + // creating the ideal + quat_alg_conj(resp_quat, resp_quat); + + // setting the norm + ibz_mul(&tmp, &lideal_commit->norm, °ree_odd_resp); + quat_lideal_create(lideal_com_resp, resp_quat, &tmp, &MAXORD_O0, &QUATALG_PINFTY); + + // now we compute the ideal_aux + // computing the norm + pow_dim2_deg_resp = SQIsign_response_length - exp_diadic_val_full_resp - sig->backtracking; + ibz_pow(remain, &ibz_const_two, pow_dim2_deg_resp); + ibz_sub(random_aux_norm, remain, °ree_odd_resp); + + // multiplying by 2^HD_extra_torsion to account for the fact that + // we use extra torsion above the kernel + for (int i = 0; i < HD_extra_torsion; i++) + ibz_mul(remain, remain, &ibz_const_two); + + ibz_invmod(degree_resp_inv, °ree_odd_resp, remain); + + ibz_finalize(°ree_full_resp); + ibz_finalize(°ree_odd_resp); + ibz_finalize(&norm_d); + ibz_finalize(&tmp); + + return pow_dim2_deg_resp; +} + +static int +evaluate_random_aux_isogeny_signature(ec_curve_t *E_aux, + ec_basis_t *B_aux, + const ibz_t *norm, + const quat_left_ideal_t *lideal_com_resp) +{ + quat_left_ideal_t lideal_aux; + quat_left_ideal_t lideal_aux_resp_com; + + // Init + quat_left_ideal_init(&lideal_aux); + quat_left_ideal_init(&lideal_aux_resp_com); + + // sampling the ideal at random + int found = quat_sampling_random_ideal_O0_given_norm( + &lideal_aux, norm, 0, &QUAT_represent_integer_params, &QUAT_prime_cofactor); + + if (found) { + // pushing forward + quat_lideal_inter(&lideal_aux_resp_com, lideal_com_resp, &lideal_aux, &QUATALG_PINFTY); + + // now we evaluate this isogeny on the basis of E0 + found = dim2id2iso_arbitrary_isogeny_evaluation(B_aux, E_aux, &lideal_aux_resp_com); + + // Clean up + quat_left_ideal_finalize(&lideal_aux_resp_com); + quat_left_ideal_finalize(&lideal_aux); + } + + return found; +} + +static int +compute_dim2_isogeny_challenge(theta_couple_curve_with_basis_t *codomain, + theta_couple_curve_with_basis_t *domain, + const ibz_t *degree_resp_inv, + int pow_dim2_deg_resp, + int exp_diadic_val_full_resp, + int reduced_order) +{ + // now, we compute the isogeny Phi : Ecom x Eaux -> Echl' x Eaux' + // where Echl' is 2^exp_diadic_val_full_resp isogenous to Echal + // ker Phi = <(Bcom_can.P,Baux.P),(Bcom_can.Q,Baux.Q)> + + // preparing the domain + theta_couple_curve_t EcomXEaux; + copy_curve(&EcomXEaux.E1, &domain->E1); + copy_curve(&EcomXEaux.E2, &domain->E2); + + // preparing the kernel + theta_kernel_couple_points_t dim_two_ker; + copy_bases_to_kernel(&dim_two_ker, &domain->B1, &domain->B2); + + // dividing by the degree of the response + digit_t scalar[NWORDS_ORDER]; + ibz_to_digit_array(scalar, degree_resp_inv); + ec_mul(&dim_two_ker.T1.P2, scalar, reduced_order, &dim_two_ker.T1.P2, &EcomXEaux.E2); + ec_mul(&dim_two_ker.T2.P2, scalar, reduced_order, &dim_two_ker.T2.P2, &EcomXEaux.E2); + ec_mul(&dim_two_ker.T1m2.P2, scalar, reduced_order, &dim_two_ker.T1m2.P2, &EcomXEaux.E2); + + // and multiplying by 2^exp_diadic... + double_couple_point_iter(&dim_two_ker.T1, exp_diadic_val_full_resp, &dim_two_ker.T1, &EcomXEaux); + double_couple_point_iter(&dim_two_ker.T2, exp_diadic_val_full_resp, &dim_two_ker.T2, &EcomXEaux); + double_couple_point_iter(&dim_two_ker.T1m2, exp_diadic_val_full_resp, &dim_two_ker.T1m2, &EcomXEaux); + + theta_couple_point_t pushed_points[3]; + theta_couple_point_t *const Tev1 = pushed_points + 0, *const Tev2 = pushed_points + 1, + *const Tev1m2 = pushed_points + 2; + + // Set points on the commitment curve + copy_point(&Tev1->P1, &domain->B1.P); + copy_point(&Tev2->P1, &domain->B1.Q); + copy_point(&Tev1m2->P1, &domain->B1.PmQ); + + // Zero points on the aux curve + ec_point_init(&Tev1->P2); + ec_point_init(&Tev2->P2); + ec_point_init(&Tev1m2->P2); + + theta_couple_curve_t codomain_product; + + // computation of the dim2 isogeny + if (!theta_chain_compute_and_eval_randomized(pow_dim2_deg_resp, + &EcomXEaux, + &dim_two_ker, + true, + &codomain_product, + pushed_points, + sizeof(pushed_points) / sizeof(*pushed_points))) + return 0; + + assert(test_couple_point_order_twof(Tev1, &codomain_product, reduced_order)); + + // Set the auxiliary curve + copy_curve(&codomain->E1, &codomain_product.E2); + + // Set the codomain curve from the dim 2 isogeny + // it should always be the first curve + copy_curve(&codomain->E2, &codomain_product.E1); + + // Set the evaluated basis points + copy_point(&codomain->B1.P, &Tev1->P2); + copy_point(&codomain->B1.Q, &Tev2->P2); + copy_point(&codomain->B1.PmQ, &Tev1m2->P2); + + copy_point(&codomain->B2.P, &Tev1->P1); + copy_point(&codomain->B2.Q, &Tev2->P1); + copy_point(&codomain->B2.PmQ, &Tev1m2->P1); + return 1; +} + +static int +compute_small_chain_isogeny_signature(ec_curve_t *E_chall_2, + ec_basis_t *B_chall_2, + const quat_alg_elem_t *resp_quat, + int pow_dim2_deg_resp, + int length) +{ + int ret = 1; + + ibz_t two_pow; + ibz_init(&two_pow); + + ibz_vec_2_t vec_resp_two; + ibz_vec_2_init(&vec_resp_two); + + quat_left_ideal_t lideal_resp_two; + quat_left_ideal_init(&lideal_resp_two); + + // computing the ideal + ibz_pow(&two_pow, &ibz_const_two, length); + + // we compute the generator of the challenge ideal + quat_lideal_create(&lideal_resp_two, resp_quat, &two_pow, &MAXORD_O0, &QUATALG_PINFTY); + + // computing the coefficients of the kernel in terms of the basis of O0 + id2iso_ideal_to_kernel_dlogs_even(&vec_resp_two, &lideal_resp_two); + + ec_point_t points[3]; + copy_point(&points[0], &B_chall_2->P); + copy_point(&points[1], &B_chall_2->Q); + copy_point(&points[2], &B_chall_2->PmQ); + + // getting down to the right order and applying the matrix + ec_dbl_iter_basis(B_chall_2, pow_dim2_deg_resp + HD_extra_torsion, B_chall_2, E_chall_2); + assert(test_basis_order_twof(B_chall_2, E_chall_2, length)); + + ec_point_t ker; + // applying the vector to find the kernel + ec_biscalar_mul_ibz_vec(&ker, &vec_resp_two, length, B_chall_2, E_chall_2); + assert(test_point_order_twof(&ker, E_chall_2, length)); + + // computing the isogeny and pushing the points + if (ec_eval_small_chain(E_chall_2, &ker, length, points, 3, true)) { + ret = 0; + } + + // copying the result + copy_point(&B_chall_2->P, &points[0]); + copy_point(&B_chall_2->Q, &points[1]); + copy_point(&B_chall_2->PmQ, &points[2]); + + ibz_finalize(&two_pow); + ibz_vec_2_finalize(&vec_resp_two); + quat_left_ideal_finalize(&lideal_resp_two); + + return ret; +} + +static int +compute_challenge_codomain_signature(const signature_t *sig, + secret_key_t *sk, + ec_curve_t *E_chall, + const ec_curve_t *E_chall_2, + ec_basis_t *B_chall_2) +{ + ec_isog_even_t phi_chall; + ec_basis_t bas_sk; + copy_basis(&bas_sk, &sk->canonical_basis); + + phi_chall.curve = sk->curve; + phi_chall.length = TORSION_EVEN_POWER - sig->backtracking; + assert(test_basis_order_twof(&bas_sk, &sk->curve, TORSION_EVEN_POWER)); + + // Compute the kernel + { + ec_ladder3pt(&phi_chall.kernel, sig->chall_coeff, &bas_sk.P, &bas_sk.Q, &bas_sk.PmQ, &sk->curve); + } + assert(test_point_order_twof(&phi_chall.kernel, &sk->curve, TORSION_EVEN_POWER)); + + // Double kernel to get correct order + ec_dbl_iter(&phi_chall.kernel, sig->backtracking, &phi_chall.kernel, &sk->curve); + + assert(test_point_order_twof(&phi_chall.kernel, E_chall, phi_chall.length)); + + // Compute the codomain from challenge isogeny + if (ec_eval_even(E_chall, &phi_chall, NULL, 0)) + return 0; + +#ifndef NDEBUG + fp2_t j_chall, j_codomain; + ec_j_inv(&j_codomain, E_chall_2); + ec_j_inv(&j_chall, E_chall); + // apparently its always the second one curve + assert(fp2_is_equal(&j_chall, &j_codomain)); +#endif + + // applying the isomorphism from E_chall_2 to E_chall + ec_isom_t isom; + if (ec_isomorphism(&isom, E_chall_2, E_chall)) + return 0; // error due to a corner case with 1/p probability + ec_iso_eval(&B_chall_2->P, &isom); + ec_iso_eval(&B_chall_2->Q, &isom); + ec_iso_eval(&B_chall_2->PmQ, &isom); + + return 1; +} + +static void +set_aux_curve_signature(signature_t *sig, ec_curve_t *E_aux) +{ + ec_normalize_curve(E_aux); + fp2_copy(&sig->E_aux_A, &E_aux->A); +} + +static void +compute_and_set_basis_change_matrix(signature_t *sig, + const ec_basis_t *B_aux_2, + ec_basis_t *B_chall_2, + ec_curve_t *E_aux_2, + ec_curve_t *E_chall, + int f) +{ + // Matrices for change of bases matrices + ibz_mat_2x2_t mat_Baux2_to_Baux2_can, mat_Bchall_can_to_Bchall; + ibz_mat_2x2_init(&mat_Baux2_to_Baux2_can); + ibz_mat_2x2_init(&mat_Bchall_can_to_Bchall); + + // Compute canonical bases + ec_basis_t B_can_chall, B_aux_2_can; + sig->hint_chall = ec_curve_to_basis_2f_to_hint(&B_can_chall, E_chall, TORSION_EVEN_POWER); + sig->hint_aux = ec_curve_to_basis_2f_to_hint(&B_aux_2_can, E_aux_2, TORSION_EVEN_POWER); + +#ifndef NDEBUG + { + // Ensure all points have the desired order + assert(test_basis_order_twof(&B_aux_2_can, E_aux_2, TORSION_EVEN_POWER)); + assert(test_basis_order_twof(B_aux_2, E_aux_2, f)); + fp2_t w0; + weil(&w0, f, &B_aux_2->P, &B_aux_2->Q, &B_aux_2->PmQ, E_aux_2); + } +#endif + + // compute the matrix to go from B_aux_2 to B_aux_2_can + change_of_basis_matrix_tate_invert(&mat_Baux2_to_Baux2_can, &B_aux_2_can, B_aux_2, E_aux_2, f); + + // apply the change of basis to B_chall_2 + matrix_application_even_basis(B_chall_2, E_chall, &mat_Baux2_to_Baux2_can, f); + +#ifndef NDEBUG + { + // Ensure all points have the desired order + assert(test_basis_order_twof(&B_can_chall, E_chall, TORSION_EVEN_POWER)); + } +#endif + + // compute the matrix to go from B_chall_can to B_chall_2 + change_of_basis_matrix_tate(&mat_Bchall_can_to_Bchall, B_chall_2, &B_can_chall, E_chall, f); + + // Assert all values in the matrix are of the expected size for packing + assert(ibz_bitsize(&mat_Bchall_can_to_Bchall[0][0]) <= SQIsign_response_length + HD_extra_torsion); + assert(ibz_bitsize(&mat_Bchall_can_to_Bchall[0][1]) <= SQIsign_response_length + HD_extra_torsion); + assert(ibz_bitsize(&mat_Bchall_can_to_Bchall[1][0]) <= SQIsign_response_length + HD_extra_torsion); + assert(ibz_bitsize(&mat_Bchall_can_to_Bchall[1][1]) <= SQIsign_response_length + HD_extra_torsion); + + // Set the basis change matrix to signature + ibz_to_digit_array(sig->mat_Bchall_can_to_B_chall[0][0], &(mat_Bchall_can_to_Bchall[0][0])); + ibz_to_digit_array(sig->mat_Bchall_can_to_B_chall[0][1], &(mat_Bchall_can_to_Bchall[0][1])); + ibz_to_digit_array(sig->mat_Bchall_can_to_B_chall[1][0], &(mat_Bchall_can_to_Bchall[1][0])); + ibz_to_digit_array(sig->mat_Bchall_can_to_B_chall[1][1], &(mat_Bchall_can_to_Bchall[1][1])); + + // Finalise the matrices + ibz_mat_2x2_finalize(&mat_Bchall_can_to_Bchall); + ibz_mat_2x2_finalize(&mat_Baux2_to_Baux2_can); +} + +int +protocols_sign(signature_t *sig, const public_key_t *pk, secret_key_t *sk, const unsigned char *m, size_t l) +{ + int ret = 0; + int reduced_order = 0; // work around false positive gcc warning + + uint_fast8_t pow_dim2_deg_resp; + assert(SQIsign_response_length <= (intmax_t)UINT_FAST8_MAX); // otherwise we might need more bits there + + ibz_t remain, lattice_content, random_aux_norm, degree_resp_inv; + ibz_init(&remain); + ibz_init(&lattice_content); + ibz_init(&random_aux_norm); + ibz_init(°ree_resp_inv); + + quat_alg_elem_t resp_quat; + quat_alg_elem_init(&resp_quat); + + quat_left_ideal_t lideal_commit, lideal_com_resp; + quat_left_ideal_init(&lideal_commit); + quat_left_ideal_init(&lideal_com_resp); + + // This structure holds two curves E1 x E2 together with a basis + // Bi of E[2^n] for each of these curves + theta_couple_curve_with_basis_t Ecom_Eaux; + // This structure holds two curves E1 x E2 together with a basis + // Bi of Ei[2^n] + theta_couple_curve_with_basis_t Eaux2_Echall2; + + // This will hold the challenge curve + ec_curve_t E_chall = sk->curve; + + ec_curve_init(&Ecom_Eaux.E1); + ec_curve_init(&Ecom_Eaux.E2); + + while (!ret) { + + // computing the commitment + ret = commit(&Ecom_Eaux.E1, &Ecom_Eaux.B1, &lideal_commit); + + // start again if the commitment generation has failed + if (!ret) { + continue; + } + + // Hash the message to a kernel generator + // i.e. a scalar such that ker = P + [s]Q + hash_to_challenge(&sig->chall_coeff, pk, &Ecom_Eaux.E1, m, l); + // Compute the challenge ideal and response quaternion element + { + quat_left_ideal_t lideal_chall_two; + quat_left_ideal_init(&lideal_chall_two); + + // computing the challenge ideal + compute_challenge_ideal_signature(&lideal_chall_two, sig, sk); + compute_response_quat_element(&resp_quat, &lattice_content, sk, &lideal_chall_two, &lideal_commit); + + // Clean up + quat_left_ideal_finalize(&lideal_chall_two); + } + + // computing the amount of backtracking we're making + // and removing it + compute_backtracking_signature(sig, &resp_quat, &lattice_content, &remain); + + // creating lideal_com * lideal_resp + // we first compute the norm of lideal_resp + // norm of the resp_quat + pow_dim2_deg_resp = compute_random_aux_norm_and_helpers(sig, + &random_aux_norm, + °ree_resp_inv, + &remain, + &lattice_content, + &resp_quat, + &lideal_com_resp, + &lideal_commit); + + // notational conventions: + // B0 = canonical basis of E0 + // B_com = image through commitment isogeny (odd degree) of canonical basis of E0 + // B_aux = image through aux_resp_com isogeny (odd degree) of canonical basis of E0 + + if (pow_dim2_deg_resp > 0) { + // Evaluate the random aux ideal on the curve E0 and its basis to find E_aux and B_aux + ret = + evaluate_random_aux_isogeny_signature(&Ecom_Eaux.E2, &Ecom_Eaux.B2, &random_aux_norm, &lideal_com_resp); + + // auxiliary isogeny computation failed we must start again + if (!ret) { + continue; + } + +#ifndef NDEBUG + // testing that the order of the points in the bases is as expected + assert(test_basis_order_twof(&Ecom_Eaux.B1, &Ecom_Eaux.E1, TORSION_EVEN_POWER)); + assert(test_basis_order_twof(&Ecom_Eaux.B2, &Ecom_Eaux.E2, TORSION_EVEN_POWER)); +#endif + + // applying the matrix to compute Baux + // first, we reduce to the relevant order + reduced_order = pow_dim2_deg_resp + HD_extra_torsion + sig->two_resp_length; + ec_dbl_iter_basis(&Ecom_Eaux.B1, TORSION_EVEN_POWER - reduced_order, &Ecom_Eaux.B1, &Ecom_Eaux.E1); + ec_dbl_iter_basis(&Ecom_Eaux.B2, TORSION_EVEN_POWER - reduced_order, &Ecom_Eaux.B2, &Ecom_Eaux.E2); + + // Given all the above data, compute a dim two isogeny with domain + // E_com x E_aux + // and codomain + // E_aux_2 x E_chall_2 (note: E_chall_2 is isomorphic to E_chall) + // and evaluated points stored as bases in + // B_aux_2 on E_aux_2 + // B_chall_2 on E_chall_2 + ret = compute_dim2_isogeny_challenge( + &Eaux2_Echall2, &Ecom_Eaux, °ree_resp_inv, pow_dim2_deg_resp, sig->two_resp_length, reduced_order); + if (!ret) + continue; + } else { + // No 2d isogeny needed, so simulate a "Kani matrix" identity here + copy_curve(&Eaux2_Echall2.E1, &Ecom_Eaux.E1); + copy_curve(&Eaux2_Echall2.E2, &Ecom_Eaux.E1); + + reduced_order = sig->two_resp_length; + ec_dbl_iter_basis(&Eaux2_Echall2.B1, TORSION_EVEN_POWER - reduced_order, &Ecom_Eaux.B1, &Ecom_Eaux.E1); + ec_dbl_iter_basis(&Eaux2_Echall2.B1, TORSION_EVEN_POWER - reduced_order, &Ecom_Eaux.B1, &Ecom_Eaux.E1); + copy_basis(&Eaux2_Echall2.B2, &Eaux2_Echall2.B1); + } + + // computation of the remaining small chain of two isogenies when needed + if (sig->two_resp_length > 0) { + if (!compute_small_chain_isogeny_signature( + &Eaux2_Echall2.E2, &Eaux2_Echall2.B2, &resp_quat, pow_dim2_deg_resp, sig->two_resp_length)) { + assert(0); // this shouldn't fail + } + } + + // computation of the challenge codomain + if (!compute_challenge_codomain_signature(sig, sk, &E_chall, &Eaux2_Echall2.E2, &Eaux2_Echall2.B2)) + assert(0); // this shouldn't fail + } + + // Set to the signature the Montgomery A-coefficient of E_aux_2 + set_aux_curve_signature(sig, &Eaux2_Echall2.E1); + + // Set the basis change matrix from canonical bases to the supplied bases + compute_and_set_basis_change_matrix( + sig, &Eaux2_Echall2.B1, &Eaux2_Echall2.B2, &Eaux2_Echall2.E1, &E_chall, reduced_order); + + quat_alg_elem_finalize(&resp_quat); + quat_left_ideal_finalize(&lideal_commit); + quat_left_ideal_finalize(&lideal_com_resp); + + ibz_finalize(&lattice_content); + ibz_finalize(&remain); + ibz_finalize(°ree_resp_inv); + ibz_finalize(&random_aux_norm); + + return ret; +} diff --git a/src/signature/ref/lvlx/test/bench_signature.c b/src/signature/ref/lvlx/test/bench_signature.c new file mode 100644 index 0000000..f101460 --- /dev/null +++ b/src/signature/ref/lvlx/test/bench_signature.c @@ -0,0 +1,140 @@ +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#define STRINGIFY2(x) #x +#define STRINGIFY(x) STRINGIFY2(x) + +static __inline__ uint64_t +rdtsc(void) +{ + return (uint64_t)cpucycles(); +} + +void +bench_sqisign(uint64_t bench) +{ + setlocale(LC_NUMERIC, ""); + uint64_t t0, t1; + clock_t t; + float ms; + + public_key_t pks[bench]; + secret_key_t sks[bench]; + signature_t sigs[bench]; + unsigned char msg[32] = { 0 }; + + for (uint64_t i = 0; i < bench; i++) { + public_key_init(&pks[i]); + secret_key_init(&sks[i]); + } + + printf("\n\nBenchmarking signatures for " STRINGIFY(SQISIGN_VARIANT) ":\n\n"); + t = tic(); + t0 = rdtsc(); + for (uint64_t i = 0; i < bench; ++i) { + protocols_keygen(&pks[i], &sks[i]); + } + t1 = rdtsc(); + ms = (1000. * (float)(clock() - t) / CLOCKS_PER_SEC); + printf("Average keygen time [%.2f ms]\n", (float)(ms / bench)); + printf("\x1b[34mAvg keygen: %'" PRIu64 " cycles\x1b[0m\n", (t1 - t0) / bench); + + t = tic(); + t0 = rdtsc(); + for (uint64_t i = 0; i < bench; ++i) { + protocols_sign(&(sigs[i]), &(pks[i]), &(sks[i]), msg, sizeof(msg) / sizeof(*msg)); + } + t1 = rdtsc(); + ms = (1000. * (float)(clock() - t) / CLOCKS_PER_SEC); + printf("Average signature time [%.2f ms]\n", (float)(ms / bench)); + printf("\x1b[34mAvg signature: %'" PRIu64 " cycles\x1b[0m\n", (t1 - t0) / bench); + + t = tic(); + t0 = rdtsc(); + for (uint64_t i = 0; i < bench; ++i) { + int check = protocols_verify(&(sigs[i]), &(pks[i]), msg, sizeof(msg) / sizeof(*msg)); + if (!check) { + printf("verif failed ! \n"); + } + } + t1 = rdtsc(); + ms = (1000. * (float)(clock() - t) / CLOCKS_PER_SEC); + printf("Average verification time [%.2f ms]\n", (float)(ms / bench)); + printf("\x1b[34mAvg verification: %'" PRIu64 " cycles\x1b[0m\n", (t1 - t0) / bench); + + for (uint64_t i = 0; i < bench; i++) { + public_key_finalize(&pks[i]); + secret_key_finalize(&sks[i]); + } +} + +// run all tests in module +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int iterations = SQISIGN_TEST_REPS; + int help = 0; + int seed_set = 0; + +#ifndef NDEBUG + fprintf(stderr, + "\x1b[31mIt looks like SQIsign was compiled with assertions enabled.\n" + "This will severely impact performance measurements.\x1b[0m\n"); +#endif + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + } + + if (help || iterations <= 0) { + printf("Usage: %s [--iterations=] [--seed=]\n", argv[0]); + printf("Where is the number of iterations used for benchmarking; if not " + "present, uses the default: %d)\n", + iterations); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + cpucycles_init(); + + bench_sqisign(iterations); + + return (0); +} diff --git a/src/signature/ref/lvlx/test/test_signature.c b/src/signature/ref/lvlx/test/test_signature.c new file mode 100644 index 0000000..911184d --- /dev/null +++ b/src/signature/ref/lvlx/test/test_signature.c @@ -0,0 +1,102 @@ +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +int +test_sqisign(int repeat) +{ + int res = 1; + + public_key_t pk; + secret_key_t sk; + signature_t sig; + const unsigned char msg[32] = { 0 }; + + public_key_init(&pk); + secret_key_init(&sk); + + printf("\n\nTesting signatures\n"); + for (int i = 0; i < repeat; ++i) { + printf("#%d \n", i); + + protocols_keygen(&pk, &sk); + protocols_sign(&sig, &pk, &sk, msg, 32); + int check = protocols_verify(&sig, &pk, msg, 32); + if (!check) { + printf("verif failed ! \n"); + } + } + + public_key_finalize(&pk); + secret_key_finalize(&sk); + + return res; +} + +// run all tests in module +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int iterations = SQISIGN_TEST_REPS; + int help = 0; + int seed_set = 0; + int res; + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + } + + if (help || iterations <= 0) { + printf("Usage: %s [--iterations=] [--seed=]\n", argv[0]); + printf("Where is the number of iterations used for testing; if not " + "present, uses the default: %d)\n", + iterations); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + + res = test_sqisign(iterations); + + if (!res) { + printf("\nSome tests failed!\n"); + } else { + printf("All tests passed!\n"); + } + return (!res); +} diff --git a/src/signature/ref/lvlx/test/test_threadsafety.c b/src/signature/ref/lvlx/test/test_threadsafety.c new file mode 100644 index 0000000..d5461b1 --- /dev/null +++ b/src/signature/ref/lvlx/test/test_threadsafety.c @@ -0,0 +1,125 @@ +#include +#include +#include + +#include +#include +#include +#include + +#include + +int threads = 4; +int iterations = SQISIGN_TEST_REPS; + +char dummy = 0; + +void * +test_sqisign(void *_) +{ + (void)_; + + bool res = 1; + + public_key_t pk; + secret_key_t sk; + signature_t sig; + unsigned char msg[32] = { 0 }; + + public_key_init(&pk); + secret_key_init(&sk); + + for (int i = 0; i < iterations; ++i) { + protocols_keygen(&pk, &sk); + int scheck = protocols_sign(&sig, &pk, &sk, msg, sizeof(msg) / sizeof(*msg)); + int check = protocols_verify(&sig, &pk, msg, sizeof(msg) / sizeof(*msg)); + assert(scheck); + assert(check); + res = res && scheck && check; + } + + public_key_finalize(&pk); + secret_key_finalize(&sk); + + return res ? &dummy : NULL; +} + +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int help = 0; + int seed_set = 0; + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + + if (sscanf(argv[i], "--threads=%d", &threads) == 1) { + continue; + } + } + + if (help || iterations <= 0 || threads <= 0) { + printf("Usage: %s [--iterations=] [--threads=] [--seed=]\n", argv[0]); + printf("Where is the number of iterations used for testing; if not " + "present, uses the default: %d)\n", + iterations); + printf("Where is the number of threads used for testing; if not " + "present, uses the default: %d)\n", + threads); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + + pthread_t thread_handles[threads]; + + { + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setstacksize(&attr, 8 << 20); // 8 MB + for (int i = 0; i < threads; ++i) + pthread_create(&thread_handles[i], &attr, &test_sqisign, NULL); + pthread_attr_destroy(&attr); + } + + bool ok = true; + for (int i = 0; i < threads; ++i) { + void *res; + pthread_join(thread_handles[i], &res); + ok = ok && res; + } + + if (!ok) { + printf("\nSome tests failed!\n"); + } else { + printf("All tests passed!\n"); + } + return !ok; +} diff --git a/src/signature/ref/lvlx_test.cmake b/src/signature/ref/lvlx_test.cmake new file mode 100644 index 0000000..19066c3 --- /dev/null +++ b/src/signature/ref/lvlx_test.cmake @@ -0,0 +1,23 @@ +add_executable(sqisign_test_signature_${SVARIANT_LOWER} ${LVLX_DIR}/test/test_signature.c) +target_link_libraries(sqisign_test_signature_${SVARIANT_LOWER} ${LIB_SIGNATURE_${SVARIANT_UPPER}} ${LIB_VERIFICATION_${SVARIANT_UPPER}} sqisign_common_test) +target_include_directories(sqisign_test_signature_${SVARIANT_LOWER} PRIVATE ${INC_PUBLIC} ${INC_COMMON} ${INC_QUATERNION} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_VERIFICATION} ${INC_SIGNATURE}) + +add_executable(sqisign_test_threadsafety_${SVARIANT_LOWER} ${LVLX_DIR}/test/test_threadsafety.c) +target_link_libraries(sqisign_test_threadsafety_${SVARIANT_LOWER} ${LIB_SIGNATURE_${SVARIANT_UPPER}} ${LIB_VERIFICATION_${SVARIANT_UPPER}} sqisign_common_test pthread) +target_include_directories(sqisign_test_threadsafety_${SVARIANT_LOWER} PRIVATE ${INC_PUBLIC} ${INC_COMMON} ${INC_QUATERNION} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_VERIFICATION} ${INC_SIGNATURE}) + +add_test(sqisign_test_signature_${SVARIANT_LOWER} sqisign_test_signature_${SVARIANT_LOWER} 3) +add_test(sqisign_test_threadsafety_${SVARIANT_LOWER} sqisign_test_threadsafety_${SVARIANT_LOWER} 3) + +add_custom_command( + TARGET sqisign_test_signature_${SVARIANT_LOWER} + POST_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS -E copy $ ${CMAKE_BINARY_DIR}/test/sqisign_${SVARIANT_LOWER} +) + +add_executable(sqisign_bench_signature_${SVARIANT_LOWER} ${LVLX_DIR}/test/bench_signature.c) +target_link_libraries(sqisign_bench_signature_${SVARIANT_LOWER} ${LIB_SIGNATURE_${SVARIANT_UPPER}} ${LIB_VERIFICATION_${SVARIANT_UPPER}} sqisign_common_sys) +target_include_directories(sqisign_bench_signature_${SVARIANT_LOWER} PRIVATE ${INC_PUBLIC} ${INC_COMMON} ${INC_QUATERNION} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_VERIFICATION} ${INC_SIGNATURE}) + +set(BM_BINS ${BM_BINS} sqisign_bench_signature_${SVARIANT_LOWER} CACHE INTERNAL "List of benchmark executables") diff --git a/src/sqisign.c b/src/sqisign.c index 31dcaf0..57fd75d 100644 --- a/src/sqisign.c +++ b/src/sqisign.c @@ -1,79 +1,106 @@ -#include +#include #include +#include +#include +#if defined(ENABLE_SIGN) +#include +#endif -int sqisign_keypair(unsigned char *pk, unsigned char *sk) { - int ret; +#if defined(ENABLE_SIGN) +SQISIGN_API +int +sqisign_keypair(unsigned char *pk, unsigned char *sk) +{ + int ret = 0; secret_key_t skt; public_key_t pkt = { 0 }; secret_key_init(&skt); ret = !protocols_keygen(&pkt, &skt); - secret_key_encode(sk, &skt, &pkt); - public_key_encode(pk, &pkt); + secret_key_to_bytes(sk, &skt, &pkt); + public_key_to_bytes(pk, &pkt); secret_key_finalize(&skt); return ret; } -int sqisign_sign(unsigned char *sm, - unsigned long long *smlen, const unsigned char *m, - unsigned long long mlen, const unsigned char *sk) { +SQISIGN_API +int +sqisign_sign(unsigned char *sm, + unsigned long long *smlen, + const unsigned char *m, + unsigned long long mlen, + const unsigned char *sk) +{ int ret = 0; secret_key_t skt; public_key_t pkt = { 0 }; signature_t sigt; secret_key_init(&skt); - signature_init(&sigt); - secret_key_decode(&skt, &pkt, sk); + secret_key_from_bytes(&skt, &pkt, sk); - ret = !protocols_sign(&sigt, &pkt, &skt, m, mlen); - signature_encode(sm, &sigt); + memmove(sm + SIGNATURE_BYTES, m, mlen); - memcpy(sm + SIGNATURE_LEN, m, mlen); - *smlen = SIGNATURE_LEN + mlen; - - secret_key_finalize(&skt); - signature_finalize(&sigt); - return ret; -} - -int sqisign_open(unsigned char *m, - unsigned long long *mlen, const unsigned char *sm, - unsigned long long smlen, const unsigned char *pk) { - int ret = 0; - public_key_t pkt = { 0 }; - signature_t sigt; - signature_init(&sigt); - - public_key_decode(&pkt, pk); - signature_decode(&sigt, sm); - - ret = !protocols_verif(&sigt, &pkt, sm + SIGNATURE_LEN, smlen - SIGNATURE_LEN); - - if (!ret) { - *mlen = smlen - SIGNATURE_LEN; - memmove(m, sm + SIGNATURE_LEN, *mlen); + ret = !protocols_sign(&sigt, &pkt, &skt, sm + SIGNATURE_BYTES, mlen); + if (ret != 0) { + *smlen = 0; + goto err; + } + + signature_to_bytes(sm, &sigt); + *smlen = SIGNATURE_BYTES + mlen; + +err: + secret_key_finalize(&skt); + return ret; +} +#endif + +SQISIGN_API +int +sqisign_open(unsigned char *m, + unsigned long long *mlen, + const unsigned char *sm, + unsigned long long smlen, + const unsigned char *pk) +{ + int ret = 0; + public_key_t pkt = { 0 }; + signature_t sigt; + + public_key_from_bytes(&pkt, pk); + signature_from_bytes(&sigt, sm); + + ret = !protocols_verify(&sigt, &pkt, sm + SIGNATURE_BYTES, smlen - SIGNATURE_BYTES); + + if (!ret) { + *mlen = smlen - SIGNATURE_BYTES; + memmove(m, sm + SIGNATURE_BYTES, *mlen); + } else { + *mlen = 0; + memset(m, 0, smlen - SIGNATURE_BYTES); } - signature_finalize(&sigt); return ret; } -int sqisign_verify(const unsigned char *m, - unsigned long long mlen, const unsigned char *sig, - unsigned long long siglen, const unsigned char *pk) { +SQISIGN_API +int +sqisign_verify(const unsigned char *m, + unsigned long long mlen, + const unsigned char *sig, + unsigned long long siglen, + const unsigned char *pk) +{ int ret = 0; public_key_t pkt = { 0 }; signature_t sigt; - signature_init(&sigt); - public_key_decode(&pkt, pk); - signature_decode(&sigt, sig); + public_key_from_bytes(&pkt, pk); + signature_from_bytes(&sigt, sig); - ret = !protocols_verif(&sigt, &pkt, m, mlen); + ret = !protocols_verify(&sigt, &pkt, m, mlen); - signature_finalize(&sigt); return ret; } - diff --git a/src/verification/CMakeLists.txt b/src/verification/CMakeLists.txt new file mode 100644 index 0000000..8c11419 --- /dev/null +++ b/src/verification/CMakeLists.txt @@ -0,0 +1 @@ +include(${SELECT_IMPL_TYPE}) diff --git a/src/verification/ref/CMakeLists.txt b/src/verification/ref/CMakeLists.txt new file mode 100644 index 0000000..d0ba315 --- /dev/null +++ b/src/verification/ref/CMakeLists.txt @@ -0,0 +1,3 @@ +set(LVLX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lvlx) + +include(${SELECT_SQISIGN_VARIANT}) diff --git a/src/verification/ref/include/verification.h b/src/verification/ref/include/verification.h new file mode 100644 index 0000000..af67469 --- /dev/null +++ b/src/verification/ref/include/verification.h @@ -0,0 +1,123 @@ +/** @file + * + * @brief The verification protocol + */ + +#ifndef VERIFICATION_H +#define VERIFICATION_H + +#include +#include + +/** @defgroup verification SQIsignHD verification protocol + * @{ + */ + +/** @defgroup verification_t Types for SQIsignHD verification protocol + * @{ + */ + +typedef digit_t scalar_t[NWORDS_ORDER]; +typedef scalar_t scalar_mtx_2x2_t[2][2]; + +/** @brief Type for the signature + * + * @typedef signature_t + * + * @struct signature + * + */ +typedef struct signature +{ + fp2_t E_aux_A; // the Montgomery A-coefficient for the auxiliary curve + uint8_t backtracking; + uint8_t two_resp_length; + scalar_mtx_2x2_t mat_Bchall_can_to_B_chall; // the matrix of the desired basis + scalar_t chall_coeff; + uint8_t hint_aux; + uint8_t hint_chall; +} signature_t; + +/** @brief Type for the public keys + * + * @typedef public_key_t + * + * @struct public_key + * + */ +typedef struct public_key +{ + ec_curve_t curve; // the normalized A-coefficient of the Montgomery curve + uint8_t hint_pk; +} public_key_t; + +/** @} + */ + +/*************************** Functions *****************************/ + +void public_key_init(public_key_t *pk); +void public_key_finalize(public_key_t *pk); + +void hash_to_challenge(scalar_t *scalar, + const public_key_t *pk, + const ec_curve_t *com_curve, + const unsigned char *message, + size_t length); + +/** + * @brief Verification + * + * @param sig signature + * @param pk public key + * @param m message + * @param l size + * @returns 1 if the signature verifies, 0 otherwise + */ +int protocols_verify(signature_t *sig, const public_key_t *pk, const unsigned char *m, size_t l); + +/*************************** Encoding *****************************/ + +/** @defgroup encoding Encoding and decoding functions + * @{ + */ + +/** + * @brief Encodes a signature as a byte array + * + * @param enc : Byte array to encode the signature in + * @param sig : Signature to encode + */ +void signature_to_bytes(unsigned char *enc, const signature_t *sig); + +/** + * @brief Decodes a signature from a byte array + * + * @param sig : Structure to decode the signature in + * @param enc : Byte array to decode + */ +void signature_from_bytes(signature_t *sig, const unsigned char *enc); + +/** + * @brief Encodes a public key as a byte array + * + * @param enc : Byte array to encode the public key in + * @param pk : Public key to encode + */ +unsigned char *public_key_to_bytes(unsigned char *enc, const public_key_t *pk); + +/** + * @brief Decodes a public key from a byte array + * + * @param pk : Structure to decode the public key in + * @param enc : Byte array to decode + */ +const unsigned char *public_key_from_bytes(public_key_t *pk, const unsigned char *enc); + +/** @} + */ + +/** @} + */ + +#endif diff --git a/src/verification/ref/lvl1/CMakeLists.txt b/src/verification/ref/lvl1/CMakeLists.txt new file mode 100644 index 0000000..c7637fa --- /dev/null +++ b/src/verification/ref/lvl1/CMakeLists.txt @@ -0,0 +1 @@ +include(../lvlx.cmake) diff --git a/src/verification/ref/lvl3/CMakeLists.txt b/src/verification/ref/lvl3/CMakeLists.txt new file mode 100644 index 0000000..c7637fa --- /dev/null +++ b/src/verification/ref/lvl3/CMakeLists.txt @@ -0,0 +1 @@ +include(../lvlx.cmake) diff --git a/src/verification/ref/lvl5/CMakeLists.txt b/src/verification/ref/lvl5/CMakeLists.txt new file mode 100644 index 0000000..c7637fa --- /dev/null +++ b/src/verification/ref/lvl5/CMakeLists.txt @@ -0,0 +1 @@ +include(../lvlx.cmake) diff --git a/src/verification/ref/lvlx.cmake b/src/verification/ref/lvlx.cmake new file mode 100644 index 0000000..2a4e96b --- /dev/null +++ b/src/verification/ref/lvlx.cmake @@ -0,0 +1,11 @@ +set(SOURCE_FILES_VERIFICATION_GENERIC_REF + ${LVLX_DIR}/common.c + ${LVLX_DIR}/encode_verification.c + ${LVLX_DIR}/verify.c +) + +add_library(${LIB_VERIFICATION_${SVARIANT_UPPER}} STATIC ${SOURCE_FILES_VERIFICATION_GENERIC_REF}) +target_link_libraries(${LIB_VERIFICATION_${SVARIANT_UPPER}} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_MP} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}} ${LIB_HD_${SVARIANT_UPPER}}) +target_include_directories(${LIB_VERIFICATION_${SVARIANT_UPPER}} PRIVATE ${INC_PUBLIC} ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_MP} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_HD} ${INC_VERIFICATION}) +target_compile_options(${LIB_VERIFICATION_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) +target_compile_definitions(${LIB_VERIFICATION_${SVARIANT_UPPER}} PUBLIC SQISIGN_VARIANT=${SVARIANT_LOWER}) diff --git a/src/verification/ref/lvlx/common.c b/src/verification/ref/lvlx/common.c new file mode 100644 index 0000000..d393e9c --- /dev/null +++ b/src/verification/ref/lvlx/common.c @@ -0,0 +1,88 @@ +#include +#include +#include +#include +#include +#include + +void +public_key_init(public_key_t *pk) +{ + ec_curve_init(&pk->curve); +} + +void +public_key_finalize(public_key_t *pk) +{ +} + +// compute the challenge as the hash of the message and the commitment curve and public key +void +hash_to_challenge(scalar_t *scalar, + const public_key_t *pk, + const ec_curve_t *com_curve, + const unsigned char *message, + size_t length) +{ + unsigned char buf[2 * FP2_ENCODED_BYTES]; + { + fp2_t j1, j2; + ec_j_inv(&j1, &pk->curve); + ec_j_inv(&j2, com_curve); + fp2_encode(buf, &j1); + fp2_encode(buf + FP2_ENCODED_BYTES, &j2); + } + + { + // The type scalar_t represents an element of GF(p), which is about + // 2*lambda bits, where lambda = 128, 192 or 256, according to the + // security level. Thus, the variable scalar should have enough memory + // for the values produced by SHAKE256 in the intermediate iterations. + + shake256incctx ctx; + + size_t hash_bytes = ((2 * SECURITY_BITS) + 7) / 8; + size_t limbs = (hash_bytes + sizeof(digit_t) - 1) / sizeof(digit_t); + size_t bits = (2 * SECURITY_BITS) % RADIX; + digit_t mask = ((digit_t)-1) >> ((RADIX - bits) % RADIX); +#ifdef TARGET_BIG_ENDIAN + mask = BSWAP_DIGIT(mask); +#endif + + shake256_inc_init(&ctx); + shake256_inc_absorb(&ctx, buf, 2 * FP2_ENCODED_BYTES); + shake256_inc_absorb(&ctx, message, length); + shake256_inc_finalize(&ctx); + shake256_inc_squeeze((void *)(*scalar), hash_bytes, &ctx); + (*scalar)[limbs - 1] &= mask; + for (int i = 2; i < HASH_ITERATIONS; i++) { + shake256_inc_init(&ctx); + shake256_inc_absorb(&ctx, (void *)(*scalar), hash_bytes); + shake256_inc_finalize(&ctx); + shake256_inc_squeeze((void *)(*scalar), hash_bytes, &ctx); + (*scalar)[limbs - 1] &= mask; + } + shake256_inc_init(&ctx); + shake256_inc_absorb(&ctx, (void *)(*scalar), hash_bytes); + shake256_inc_finalize(&ctx); + + hash_bytes = ((TORSION_EVEN_POWER - SQIsign_response_length) + 7) / 8; + limbs = (hash_bytes + sizeof(digit_t) - 1) / sizeof(digit_t); + bits = (TORSION_EVEN_POWER - SQIsign_response_length) % RADIX; + mask = ((digit_t)-1) >> ((RADIX - bits) % RADIX); +#ifdef TARGET_BIG_ENDIAN + mask = BSWAP_DIGIT(mask); +#endif + + memset(*scalar, 0, NWORDS_ORDER * sizeof(digit_t)); + shake256_inc_squeeze((void *)(*scalar), hash_bytes, &ctx); + (*scalar)[limbs - 1] &= mask; + +#ifdef TARGET_BIG_ENDIAN + for (int i = 0; i < NWORDS_ORDER; i++) + (*scalar)[i] = BSWAP_DIGIT((*scalar)[i]); +#endif + + mp_mod_2exp(*scalar, SECURITY_BITS, NWORDS_ORDER); + } +} diff --git a/src/verification/ref/lvlx/encode_verification.c b/src/verification/ref/lvlx/encode_verification.c new file mode 100644 index 0000000..fecdb9c --- /dev/null +++ b/src/verification/ref/lvlx/encode_verification.c @@ -0,0 +1,220 @@ +#include +#include +#include +#include +#include +#include + +typedef unsigned char byte_t; + +// digits + +static void +encode_digits(byte_t *enc, const digit_t *x, size_t nbytes) +{ +#ifdef TARGET_BIG_ENDIAN + const size_t ndigits = nbytes / sizeof(digit_t); + const size_t rem = nbytes % sizeof(digit_t); + + for (size_t i = 0; i < ndigits; i++) + ((digit_t *)enc)[i] = BSWAP_DIGIT(x[i]); + if (rem) { + digit_t ld = BSWAP_DIGIT(x[ndigits]); + memcpy(enc + ndigits * sizeof(digit_t), (byte_t *)&ld, rem); + } +#else + memcpy(enc, (const byte_t *)x, nbytes); +#endif +} + +static void +decode_digits(digit_t *x, const byte_t *enc, size_t nbytes, size_t ndigits) +{ + assert(nbytes <= ndigits * sizeof(digit_t)); + memcpy((byte_t *)x, enc, nbytes); + memset((byte_t *)x + nbytes, 0, ndigits * sizeof(digit_t) - nbytes); + +#ifdef TARGET_BIG_ENDIAN + for (size_t i = 0; i < ndigits; i++) + x[i] = BSWAP_DIGIT(x[i]); +#endif +} + +// fp2_t + +static byte_t * +fp2_to_bytes(byte_t *enc, const fp2_t *x) +{ + fp2_encode(enc, x); + return enc + FP2_ENCODED_BYTES; +} + +static const byte_t * +fp2_from_bytes(fp2_t *x, const byte_t *enc) +{ + fp2_decode(x, enc); + return enc + FP2_ENCODED_BYTES; +} + +// curves and points + +static byte_t * +proj_to_bytes(byte_t *enc, const fp2_t *x, const fp2_t *z) +{ + assert(!fp2_is_zero(z)); + fp2_t tmp = *z; + fp2_inv(&tmp); +#ifndef NDEBUG + { + fp2_t chk; + fp2_mul(&chk, z, &tmp); + fp2_t one; + fp2_set_one(&one); + assert(fp2_is_equal(&chk, &one)); + } +#endif + fp2_mul(&tmp, x, &tmp); + enc = fp2_to_bytes(enc, &tmp); + return enc; +} + +static const byte_t * +proj_from_bytes(fp2_t *x, fp2_t *z, const byte_t *enc) +{ + enc = fp2_from_bytes(x, enc); + fp2_set_one(z); + return enc; +} + +static byte_t * +ec_curve_to_bytes(byte_t *enc, const ec_curve_t *curve) +{ + return proj_to_bytes(enc, &curve->A, &curve->C); +} + +static const byte_t * +ec_curve_from_bytes(ec_curve_t *curve, const byte_t *enc) +{ + memset(curve, 0, sizeof(*curve)); + return proj_from_bytes(&curve->A, &curve->C, enc); +} + +static byte_t * +ec_point_to_bytes(byte_t *enc, const ec_point_t *point) +{ + return proj_to_bytes(enc, &point->x, &point->z); +} + +static const byte_t * +ec_point_from_bytes(ec_point_t *point, const byte_t *enc) +{ + return proj_from_bytes(&point->x, &point->z, enc); +} + +static byte_t * +ec_basis_to_bytes(byte_t *enc, const ec_basis_t *basis) +{ + enc = ec_point_to_bytes(enc, &basis->P); + enc = ec_point_to_bytes(enc, &basis->Q); + enc = ec_point_to_bytes(enc, &basis->PmQ); + return enc; +} + +static const byte_t * +ec_basis_from_bytes(ec_basis_t *basis, const byte_t *enc) +{ + enc = ec_point_from_bytes(&basis->P, enc); + enc = ec_point_from_bytes(&basis->Q, enc); + enc = ec_point_from_bytes(&basis->PmQ, enc); + return enc; +} + +// public API + +byte_t * +public_key_to_bytes(byte_t *enc, const public_key_t *pk) +{ +#ifndef NDEBUG + const byte_t *const start = enc; +#endif + enc = ec_curve_to_bytes(enc, &pk->curve); + *enc++ = pk->hint_pk; + assert(enc - start == PUBLICKEY_BYTES); + return enc; +} + +const byte_t * +public_key_from_bytes(public_key_t *pk, const byte_t *enc) +{ +#ifndef NDEBUG + const byte_t *const start = enc; +#endif + enc = ec_curve_from_bytes(&pk->curve, enc); + pk->hint_pk = *enc++; + assert(enc - start == PUBLICKEY_BYTES); + return enc; +} + +void +signature_to_bytes(byte_t *enc, const signature_t *sig) +{ +#ifndef NDEBUG + byte_t *const start = enc; +#endif + + enc = fp2_to_bytes(enc, &sig->E_aux_A); + + *enc++ = sig->backtracking; + *enc++ = sig->two_resp_length; + + size_t nbytes = (SQIsign_response_length + 9) / 8; + encode_digits(enc, sig->mat_Bchall_can_to_B_chall[0][0], nbytes); + enc += nbytes; + encode_digits(enc, sig->mat_Bchall_can_to_B_chall[0][1], nbytes); + enc += nbytes; + encode_digits(enc, sig->mat_Bchall_can_to_B_chall[1][0], nbytes); + enc += nbytes; + encode_digits(enc, sig->mat_Bchall_can_to_B_chall[1][1], nbytes); + enc += nbytes; + + nbytes = SECURITY_BITS / 8; + encode_digits(enc, sig->chall_coeff, nbytes); + enc += nbytes; + + *enc++ = sig->hint_aux; + *enc++ = sig->hint_chall; + + assert(enc - start == SIGNATURE_BYTES); +} + +void +signature_from_bytes(signature_t *sig, const byte_t *enc) +{ +#ifndef NDEBUG + const byte_t *const start = enc; +#endif + + enc = fp2_from_bytes(&sig->E_aux_A, enc); + + sig->backtracking = *enc++; + sig->two_resp_length = *enc++; + + size_t nbytes = (SQIsign_response_length + 9) / 8; + decode_digits(sig->mat_Bchall_can_to_B_chall[0][0], enc, nbytes, NWORDS_ORDER); + enc += nbytes; + decode_digits(sig->mat_Bchall_can_to_B_chall[0][1], enc, nbytes, NWORDS_ORDER); + enc += nbytes; + decode_digits(sig->mat_Bchall_can_to_B_chall[1][0], enc, nbytes, NWORDS_ORDER); + enc += nbytes; + decode_digits(sig->mat_Bchall_can_to_B_chall[1][1], enc, nbytes, NWORDS_ORDER); + enc += nbytes; + + nbytes = SECURITY_BITS / 8; + decode_digits(sig->chall_coeff, enc, nbytes, NWORDS_ORDER); + enc += nbytes; + + sig->hint_aux = *enc++; + sig->hint_chall = *enc++; + + assert(enc - start == SIGNATURE_BYTES); +} diff --git a/src/verification/ref/lvlx/verify.c b/src/verification/ref/lvlx/verify.c new file mode 100644 index 0000000..b5f78ad --- /dev/null +++ b/src/verification/ref/lvlx/verify.c @@ -0,0 +1,309 @@ +#include +#include +#include +#include +#include + +// Check that the basis change matrix elements are canonical +// representatives modulo 2^(SQIsign_response_length + 2). +static int +check_canonical_basis_change_matrix(const signature_t *sig) +{ + // This works as long as all values in sig->mat_Bchall_can_to_B_chall are + // positive integers. + int ret = 1; + scalar_t aux; + + memset(aux, 0, NWORDS_ORDER * sizeof(digit_t)); + aux[0] = 0x1; + multiple_mp_shiftl(aux, SQIsign_response_length + HD_extra_torsion - (int)sig->backtracking, NWORDS_ORDER); + + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + if (mp_compare(aux, sig->mat_Bchall_can_to_B_chall[i][j], NWORDS_ORDER) <= 0) { + ret = 0; + } + } + } + + return ret; +} + +// Compute the 2^n isogeny from the signature with kernel +// P + [chall_coeff]Q and store the codomain in E_chall +static int +compute_challenge_verify(ec_curve_t *E_chall, const signature_t *sig, const ec_curve_t *Epk, const uint8_t hint_pk) +{ + ec_basis_t bas_EA; + ec_isog_even_t phi_chall; + + // Set domain and length of 2^n isogeny + copy_curve(&phi_chall.curve, Epk); + phi_chall.length = TORSION_EVEN_POWER - sig->backtracking; + + // Compute the basis from the supplied hint + if (!ec_curve_to_basis_2f_from_hint(&bas_EA, &phi_chall.curve, TORSION_EVEN_POWER, hint_pk)) // canonical + return 0; + + // recovering the exact challenge + { + if (!ec_ladder3pt(&phi_chall.kernel, sig->chall_coeff, &bas_EA.P, &bas_EA.Q, &bas_EA.PmQ, &phi_chall.curve)) { + return 0; + }; + } + + // Double the kernel until is has the correct order + ec_dbl_iter(&phi_chall.kernel, sig->backtracking, &phi_chall.kernel, &phi_chall.curve); + + // Compute the codomain + copy_curve(E_chall, &phi_chall.curve); + if (ec_eval_even(E_chall, &phi_chall, NULL, 0)) + return 0; + return 1; +} + +// same as matrix_application_even_basis() in id2iso.c, with some modifications: +// - this version works with a matrix of scalars (not ibz_t). +// - reduction modulo 2^f of matrix elements is removed here, because it is +// assumed that the elements are already cannonical representatives modulo +// 2^f; this is ensured by calling check_canonical_basis_change_matrix() at +// the beginning of protocols_verify(). +static int +matrix_scalar_application_even_basis(ec_basis_t *bas, const ec_curve_t *E, scalar_mtx_2x2_t *mat, int f) +{ + scalar_t scalar0, scalar1; + memset(scalar0, 0, NWORDS_ORDER * sizeof(digit_t)); + memset(scalar1, 0, NWORDS_ORDER * sizeof(digit_t)); + + ec_basis_t tmp_bas; + copy_basis(&tmp_bas, bas); + + // For a matrix [[a, c], [b, d]] we compute: + // + // first basis element R = [a]P + [b]Q + if (!ec_biscalar_mul(&bas->P, (*mat)[0][0], (*mat)[1][0], f, &tmp_bas, E)) + return 0; + // second basis element S = [c]P + [d]Q + if (!ec_biscalar_mul(&bas->Q, (*mat)[0][1], (*mat)[1][1], f, &tmp_bas, E)) + return 0; + // Their difference R - S = [a - c]P + [b - d]Q + mp_sub(scalar0, (*mat)[0][0], (*mat)[0][1], NWORDS_ORDER); + mp_mod_2exp(scalar0, f, NWORDS_ORDER); + mp_sub(scalar1, (*mat)[1][0], (*mat)[1][1], NWORDS_ORDER); + mp_mod_2exp(scalar1, f, NWORDS_ORDER); + return ec_biscalar_mul(&bas->PmQ, scalar0, scalar1, f, &tmp_bas, E); +} + +// Compute the bases for the challenge and auxillary curve from +// the canonical bases. Challenge basis is reconstructed from the +// compressed scalars within the challenge. +static int +challenge_and_aux_basis_verify(ec_basis_t *B_chall_can, + ec_basis_t *B_aux_can, + ec_curve_t *E_chall, + ec_curve_t *E_aux, + signature_t *sig, + const int pow_dim2_deg_resp) +{ + + // recovering the canonical basis as TORSION_EVEN_POWER for consistency with signing + if (!ec_curve_to_basis_2f_from_hint(B_chall_can, E_chall, TORSION_EVEN_POWER, sig->hint_chall)) + return 0; + + // setting to the right order + ec_dbl_iter_basis(B_chall_can, + TORSION_EVEN_POWER - pow_dim2_deg_resp - HD_extra_torsion - sig->two_resp_length, + B_chall_can, + E_chall); + + if (!ec_curve_to_basis_2f_from_hint(B_aux_can, E_aux, TORSION_EVEN_POWER, sig->hint_aux)) + return 0; + + // setting to the right order + ec_dbl_iter_basis(B_aux_can, TORSION_EVEN_POWER - pow_dim2_deg_resp - HD_extra_torsion, B_aux_can, E_aux); + +#ifndef NDEBUG + if (!test_basis_order_twof(B_chall_can, E_chall, HD_extra_torsion + pow_dim2_deg_resp + sig->two_resp_length)) + debug_print("canonical basis has wrong order, expect something to fail"); +#endif + + // applying the change matrix on the basis of E_chall + return matrix_scalar_application_even_basis(B_chall_can, + E_chall, + &sig->mat_Bchall_can_to_B_chall, + pow_dim2_deg_resp + HD_extra_torsion + sig->two_resp_length); +} + +// When two_resp_length is non-zero, we must compute a small 2^n-isogeny +// updating E_chall as the codomain as well as push the basis on E_chall +// through this isogeny +static int +two_response_isogeny_verify(ec_curve_t *E_chall, ec_basis_t *B_chall_can, const signature_t *sig, int pow_dim2_deg_resp) +{ + ec_point_t ker, points[3]; + + // choosing the right point for the small two_isogenies + if (mp_is_even(sig->mat_Bchall_can_to_B_chall[0][0], NWORDS_ORDER) && + mp_is_even(sig->mat_Bchall_can_to_B_chall[1][0], NWORDS_ORDER)) { + copy_point(&ker, &B_chall_can->Q); + } else { + copy_point(&ker, &B_chall_can->P); + } + + copy_point(&points[0], &B_chall_can->P); + copy_point(&points[1], &B_chall_can->Q); + copy_point(&points[2], &B_chall_can->PmQ); + + ec_dbl_iter(&ker, pow_dim2_deg_resp + HD_extra_torsion, &ker, E_chall); + +#ifndef NDEBUG + if (!test_point_order_twof(&ker, E_chall, sig->two_resp_length)) + debug_print("kernel does not have order 2^(two_resp_length"); +#endif + + if (ec_eval_small_chain(E_chall, &ker, sig->two_resp_length, points, 3, false)) { + return 0; + } + +#ifndef NDEBUG + if (!test_point_order_twof(&points[0], E_chall, HD_extra_torsion + pow_dim2_deg_resp)) + debug_print("points[0] does not have order 2^(HD_extra_torsion + pow_dim2_deg_resp"); + if (!test_point_order_twof(&points[1], E_chall, HD_extra_torsion + pow_dim2_deg_resp)) + debug_print("points[1] does not have order 2^(HD_extra_torsion + pow_dim2_deg_resp"); + if (!test_point_order_twof(&points[2], E_chall, HD_extra_torsion + pow_dim2_deg_resp)) + debug_print("points[2] does not have order 2^(HD_extra_torsion + pow_dim2_deg_resp"); +#endif + + copy_point(&B_chall_can->P, &points[0]); + copy_point(&B_chall_can->Q, &points[1]); + copy_point(&B_chall_can->PmQ, &points[2]); + return 1; +} + +// The commitment curve can be recovered from the codomain of the 2D +// isogeny built from the bases computed during verification. +static int +compute_commitment_curve_verify(ec_curve_t *E_com, + const ec_basis_t *B_chall_can, + const ec_basis_t *B_aux_can, + const ec_curve_t *E_chall, + const ec_curve_t *E_aux, + int pow_dim2_deg_resp) + +{ +#ifndef NDEBUG + // Check all the points are the correct order + if (!test_basis_order_twof(B_chall_can, E_chall, HD_extra_torsion + pow_dim2_deg_resp)) + debug_print("B_chall_can does not have order 2^(HD_extra_torsion + pow_dim2_deg_resp"); + + if (!test_basis_order_twof(B_aux_can, E_aux, HD_extra_torsion + pow_dim2_deg_resp)) + debug_print("B_aux_can does not have order 2^(HD_extra_torsion + pow_dim2_deg_resp"); +#endif + + // now compute the dim2 isogeny from Echall x E_aux -> E_com x E_aux' + // of kernel B_chall_can x B_aux_can + + // first we set-up the kernel + theta_couple_curve_t EchallxEaux; + copy_curve(&EchallxEaux.E1, E_chall); + copy_curve(&EchallxEaux.E2, E_aux); + + theta_kernel_couple_points_t dim_two_ker; + copy_bases_to_kernel(&dim_two_ker, B_chall_can, B_aux_can); + + // computing the isogeny + theta_couple_curve_t codomain; + int codomain_splits; + ec_curve_init(&codomain.E1); + ec_curve_init(&codomain.E2); + // handling the special case where we don't need to perform any dim2 computation + if (pow_dim2_deg_resp == 0) { + codomain_splits = 1; + copy_curve(&codomain.E1, &EchallxEaux.E1); + copy_curve(&codomain.E2, &EchallxEaux.E2); + // We still need to check that E_chall is supersingular + // This assumes that HD_extra_torsion == 2 + if (!ec_is_basis_four_torsion(B_chall_can, E_chall)) { + return 0; + } + } else { + codomain_splits = theta_chain_compute_and_eval_verify( + pow_dim2_deg_resp, &EchallxEaux, &dim_two_ker, true, &codomain, NULL, 0); + } + + // computing the commitment curve + // its always the first one because of our (2^n,2^n)-isogeny formulae + copy_curve(E_com, &codomain.E1); + + return codomain_splits; +} + +// SQIsign verification +int +protocols_verify(signature_t *sig, const public_key_t *pk, const unsigned char *m, size_t l) +{ + int verify; + + if (!check_canonical_basis_change_matrix(sig)) + return 0; + + // Computation of the length of the dim 2 2^n isogeny + int pow_dim2_deg_resp = SQIsign_response_length - (int)sig->two_resp_length - (int)sig->backtracking; + + // basic sanity test: checking that the response is not too long + if (pow_dim2_deg_resp < 0) + return 0; + // The dim 2 isogeny embeds a dim 1 isogeny of odd degree, so it can + // never be of length 2. + if (pow_dim2_deg_resp == 1) + return 0; + + // check the public curve is valid + if (!ec_curve_verify_A(&(pk->curve).A)) + return 0; + + // Set auxiliary curve from the A-coefficient within the signature + ec_curve_t E_aux; + if (!ec_curve_init_from_A(&E_aux, &sig->E_aux_A)) + return 0; // invalid curve + + // checking that we are given A-coefficients and no precomputation + assert(fp2_is_one(&pk->curve.C) == 0xFFFFFFFF && !pk->curve.is_A24_computed_and_normalized); + + // computation of the challenge + ec_curve_t E_chall; + if (!compute_challenge_verify(&E_chall, sig, &pk->curve, pk->hint_pk)) { + return 0; + } + + // Computation of the canonical bases for the challenge and aux curve + ec_basis_t B_chall_can, B_aux_can; + + if (!challenge_and_aux_basis_verify(&B_chall_can, &B_aux_can, &E_chall, &E_aux, sig, pow_dim2_deg_resp)) { + return 0; + } + + // When two_resp_length != 0 we need to compute a second, short 2^r-isogeny + if (sig->two_resp_length > 0) { + if (!two_response_isogeny_verify(&E_chall, &B_chall_can, sig, pow_dim2_deg_resp)) { + return 0; + } + } + + // We can recover the commitment curve with a 2D isogeny + // The supplied signature did not compute an isogeny between eliptic products + // and so definitely is an invalid signature. + ec_curve_t E_com; + if (!compute_commitment_curve_verify(&E_com, &B_chall_can, &B_aux_can, &E_chall, &E_aux, pow_dim2_deg_resp)) + return 0; + + scalar_t chk_chall; + + // recomputing the challenge vector + hash_to_challenge(&chk_chall, pk, &E_com, m, l); + + // performing the final check + verify = mp_compare(sig->chall_coeff, chk_chall, NWORDS_ORDER) == 0; + + return verify; +} diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index e429faa..718786f 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,27 +1,22 @@ # SPDX-License-Identifier: Apache-2.0 FOREACH(SVARIANT ${SVARIANT_S}) + string(TOLOWER ${SVARIANT} SVARIANT_LOWER) string(TOUPPER ${SVARIANT} SVARIANT_UPPER) + add_executable(sqisign_test_kat_${SVARIANT} test_kat.c) target_link_libraries(sqisign_test_kat_${SVARIANT} sqisign_${SVARIANT_LOWER}_test) target_include_directories(sqisign_test_kat_${SVARIANT} PRIVATE ${PROJECT_SOURCE_DIR}/src/nistapi/${SVARIANT_LOWER} ${INC_PUBLIC} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_COMMON} ${INC_ID2ISO} ${INC_PROTOCOLS}) + add_test(sqisign_${SVARIANT}_KAT sqisign_test_kat_${SVARIANT}) - add_executable(sqisign_bench_${SVARIANT} bench.c) - target_link_libraries(sqisign_bench_${SVARIANT} sqisign_${SVARIANT_LOWER}) - target_include_directories(sqisign_bench_${SVARIANT} PUBLIC ${PROJECT_SOURCE_DIR}/src/common ${INC_PUBLIC} ${PROJECT_SOURCE_DIR}/src/nistapi/${SVARIANT_LOWER}) + if (ENABLE_SIGN) - add_executable(sqisign_test_scheme_${SVARIANT} test_sqisign.c) - target_link_libraries(sqisign_test_scheme_${SVARIANT} sqisign_${SVARIANT_LOWER}) - target_include_directories(sqisign_test_scheme_${SVARIANT} PUBLIC ${PROJECT_SOURCE_DIR}/src/common ${INC_PUBLIC} ${PROJECT_SOURCE_DIR}/src/nistapi/${SVARIANT_LOWER}) + add_executable(sqisign_test_scheme_${SVARIANT} test_sqisign.c) + target_link_libraries(sqisign_test_scheme_${SVARIANT} sqisign_${SVARIANT_LOWER}) + target_include_directories(sqisign_test_scheme_${SVARIANT} PUBLIC ${PROJECT_SOURCE_DIR}/src/common ${INC_PUBLIC} ${PROJECT_SOURCE_DIR}/src/nistapi/${SVARIANT_LOWER}) + add_test(sqisign_${SVARIANT}_SELFTEST sqisign_test_scheme_${SVARIANT}) - add_executable(sqisign_test_prof_${SVARIANT} test_sqisign_prof.c) - target_link_libraries(sqisign_test_prof_${SVARIANT} sqisign_${SVARIANT_LOWER}) - target_include_directories(sqisign_test_prof_${SVARIANT} PUBLIC ${PROJECT_SOURCE_DIR}/src/common ${INC_PUBLIC} ${PROJECT_SOURCE_DIR}/src/nistapi/${SVARIANT_LOWER}) + endif() - add_test(sqisign_${SVARIANT}_KAT sqisign_test_kat_${SVARIANT} 0) # testing only the first KAT - add_test(sqisign_${SVARIANT}_SELFTEST sqisign_test_scheme_${SVARIANT}) - - set_tests_properties(sqisign_${SVARIANT}_KAT PROPERTIES TIMEOUT 0) ENDFOREACH() - diff --git a/test/bench.c b/test/bench.c deleted file mode 100644 index 10232a0..0000000 --- a/test/bench.c +++ /dev/null @@ -1,135 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -#include -#include -#include -#include -#include -#include - - -#if defined(TARGET_OS_UNIX) && (defined(TARGET_ARM) || defined(TARGET_ARM64) || defined(TARGET_OTHER)) -#include -#endif -#if (defined(TARGET_ARM) || defined(TARGET_ARM64) || defined(TARGET_S390X) || defined(TARGET_OTHER)) -#define print_unit printf("nsec\n"); -#else -#define print_unit printf("cycles\n"); -#endif - -static int bench_sig(int runs, int csv); -static inline int64_t cpucycles(void); - -int main(int argc, char *argv[]) { - int rc = 0; - -#ifndef NDEBUG -fprintf(stderr, "\x1b[31mIt looks like SQIsign was compiled with assertions enabled.\n" - "This will severely impact performance measurements.\x1b[0m\n"); -#endif - - if (argc < 2) { - printf("One argument needed\n"); - rc = 1; - goto end; - } - int runs = atoi(argv[1]); - rc = bench_sig(runs, 0); -end: - return rc; -} - -#if (defined(TARGET_ARM) || defined(TARGET_ARM64) || defined(TARGET_S390X)) -#define BENCH_UNITS "nsec" -#else -#define BENCH_UNITS "cycles" -#endif - -int cmpfunc (const void *a, const void *b) { - return ( *(uint64_t *)a - * (uint64_t *)b ); -} - -#define BENCH_CODE_1(r) \ - cycles = 0; \ - for (i = 0; i < (r); ++i) { \ - cycles1 = cpucycles(); - -#define BENCH_CODE_2(name, csv) \ - cycles2 = cpucycles(); \ - if(i < LIST_SIZE) \ - cycles_list[i] = (cycles2 - cycles1);\ - cycles = cycles + (cycles2 - cycles1); \ - } \ - qsort(cycles_list, (runs < LIST_SIZE)? runs : LIST_SIZE, sizeof(uint64_t), cmpfunc);\ - if (csv) \ - printf("%2" PRId64 ",", cycles_list[(runs < LIST_SIZE)? runs/2 : LIST_SIZE/2]); \ - else { \ - printf(" %-20s-> median: %2" PRId64 ", average: %2" PRId64 " ", name, \ - cycles_list[(runs < LIST_SIZE)? runs/2 : LIST_SIZE/2], (cycles / runs)); \ - printf("%s\n", BENCH_UNITS); \ - } - -#define LIST_SIZE 10000 - -static int bench_sig(int runs, int csv) { - - int rc = 0; - int i; - - int64_t cycles, cycles1, cycles2; - int64_t cycles_list[10000]; - - const int m_len = 32; - - unsigned char *pk = calloc(CRYPTO_PUBLICKEYBYTES, 1); - unsigned char *sk = calloc(CRYPTO_SECRETKEYBYTES, 1); - unsigned char *sig = calloc(CRYPTO_BYTES + m_len, 1); - unsigned char *m = calloc(m_len, 1); - unsigned long long len = CRYPTO_BYTES; - - if (csv) { - printf("%s,", CRYPTO_ALGNAME); - } else { - printf("Benchmarking %s\n", CRYPTO_ALGNAME); - } - - BENCH_CODE_1(runs); - sqisign_keypair(pk, sk); - BENCH_CODE_2("sqisign_keypair", csv); - - BENCH_CODE_1(runs); - sqisign_sign(sig, &len, m, m_len, sk); - BENCH_CODE_2("sqisign_sign", csv); - - len = 32; - BENCH_CODE_1(runs); - sqisign_open(m, &len, sig, CRYPTO_BYTES, pk); - BENCH_CODE_2("sqisign_verify", csv); - - if (csv) { - printf("\n"); - } - - free(pk); - free(sk); - free(sig); - free(m); - return rc; -} - -static inline int64_t cpucycles(void) { -#if (defined(TARGET_AMD64) || defined(TARGET_X86)) - unsigned int hi, lo; - - asm volatile ("rdtsc" : "=a" (lo), "=d"(hi)); - return ((int64_t) lo) | (((int64_t) hi) << 32); -#elif (defined(TARGET_S390X)) - uint64_t tod; - asm volatile("stckf %0\n" : "=Q" (tod) : : "cc"); - return (tod * 1000 / 4096); -#else - struct timespec time; - clock_gettime(CLOCK_REALTIME, &time); - return (int64_t)(time.tv_sec * 1e9 + time.tv_nsec); -#endif -} diff --git a/test/test_kat.c b/test/test_kat.c index e27bd34..f68f8df 100644 --- a/test/test_kat.c +++ b/test/test_kat.c @@ -37,17 +37,22 @@ int main(int argc, char *argv[]) { static int test_sig_kat(int cnt) { +#if defined(ENABLE_SIGN) unsigned char seed[48]; - unsigned char *m, *sm, *m1, *sm_rsp; + unsigned char sk[CRYPTO_SECRETKEYBYTES]; + unsigned char pk[CRYPTO_PUBLICKEYBYTES]; + unsigned char sk_rsp[CRYPTO_SECRETKEYBYTES]; + unsigned char *sm; +#endif + unsigned char pk_rsp[CRYPTO_PUBLICKEYBYTES]; + unsigned char *m, *m1, *sm_rsp; unsigned long long mlen, smlen, mlen1; int count; int done; - unsigned char pk[CRYPTO_PUBLICKEYBYTES], sk[CRYPTO_SECRETKEYBYTES]; int ret_val; char fn_rsp[64]; FILE *fp_rsp; - unsigned char pk_rsp[CRYPTO_PUBLICKEYBYTES], sk_rsp[CRYPTO_SECRETKEYBYTES]; sprintf(fn_rsp, "../../KAT/PQCsignKAT_%d_%s.rsp", CRYPTO_SECRETKEYBYTES, CRYPTO_ALGNAME); if ( (fp_rsp = fopen(fn_rsp, "r")) == NULL ) { @@ -57,6 +62,7 @@ static int test_sig_kat(int cnt) { done = 0; do { + if ( FindMarker(fp_rsp, "count = ") ) { ret_val = fscanf(fp_rsp, "%d", &count); } else { @@ -67,12 +73,14 @@ static int test_sig_kat(int cnt) { if (cnt != -1 && cnt != count) continue; +#if defined(ENABLE_SIGN) if ( !ReadHex(fp_rsp, seed, 48, "seed = ") ) { printf("ERROR: unable to read 'seed' from <%s>\n", fn_rsp); return KAT_DATA_ERROR; } randombytes_init(seed, NULL, 256); +#endif if ( FindMarker(fp_rsp, "mlen = ") ) { ret_val = fscanf(fp_rsp, "%lld", &mlen); @@ -83,7 +91,9 @@ static int test_sig_kat(int cnt) { m = (unsigned char *)calloc(mlen, sizeof(unsigned char)); m1 = (unsigned char *)calloc(mlen, sizeof(unsigned char)); +#if defined(ENABLE_SIGN) sm = (unsigned char *)calloc(mlen + CRYPTO_BYTES, sizeof(unsigned char)); +#endif sm_rsp = (unsigned char *)calloc(mlen + CRYPTO_BYTES, sizeof(unsigned char)); if ( !ReadHex(fp_rsp, m, (int)mlen, "msg = ") ) { @@ -91,15 +101,20 @@ static int test_sig_kat(int cnt) { return KAT_DATA_ERROR; } +#if defined(ENABLE_SIGN) // Generate the public/private keypair if ( (ret_val = sqisign_keypair(pk, sk)) != 0) { printf("crypto_sign_keypair returned <%d>\n", ret_val); return KAT_CRYPTO_FAILURE; } +#endif + if ( !ReadHex(fp_rsp, pk_rsp, CRYPTO_PUBLICKEYBYTES, "pk = ") ) { printf("ERROR: unable to read 'pk' from <%s>\n", fn_rsp); return KAT_DATA_ERROR; } + +#if defined(ENABLE_SIGN) if ( !ReadHex(fp_rsp, sk_rsp, CRYPTO_SECRETKEYBYTES, "sk = ") ) { printf("ERROR: unable to read 'sk' from <%s>\n", fn_rsp); return KAT_DATA_ERROR; @@ -109,6 +124,7 @@ static int test_sig_kat(int cnt) { printf("ERROR: pk is different from <%s>\n", fn_rsp); return KAT_VERIFICATION_ERROR; } + if (memcmp(sk, sk_rsp, CRYPTO_SECRETKEYBYTES) != 0) { printf("ERROR: sk is different from <%s>\n", fn_rsp); return KAT_VERIFICATION_ERROR; @@ -129,11 +145,28 @@ static int test_sig_kat(int cnt) { return KAT_VERIFICATION_ERROR; } - if ( (ret_val = sqisign_open(m1, &mlen1, sm, smlen, pk)) != 0) { printf("crypto_sign_open returned <%d>\n", ret_val); return KAT_CRYPTO_FAILURE; } +#else + if ( FindMarker(fp_rsp, "smlen = ") ) { + ret_val = fscanf(fp_rsp, "%llu", &smlen); + } else { + printf("ERROR: unable to read 'smlen' from <%s>\n", fn_rsp); + return KAT_DATA_ERROR; + } + + if ( !ReadHex(fp_rsp, sm_rsp, smlen, "sm = ") ) { + printf("ERROR: unable to read 'sm' from <%s>\n", fn_rsp); + return KAT_DATA_ERROR; + } + + if ( (ret_val = sqisign_open(m1, &mlen1, sm_rsp, smlen, pk_rsp)) != 0 ) { + printf("crypto_sign_open returned <%d>\n", ret_val); + return KAT_CRYPTO_FAILURE; + } +#endif if ( mlen != mlen1 ) { printf("crypto_sign_open returned bad 'mlen': Got <%lld>, expected <%lld>\n", mlen1, mlen); @@ -147,7 +180,9 @@ static int test_sig_kat(int cnt) { free(m); free(m1); +#if defined(ENABLE_SIGN) free(sm); +#endif free(sm_rsp); } while ( !done ); diff --git a/test/test_sqisign.c b/test/test_sqisign.c index 5d47ba3..7c78b7f 100644 --- a/test/test_sqisign.c +++ b/test/test_sqisign.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 +#include #include #include #include @@ -7,6 +8,10 @@ #include #include #include +#include +#ifdef TARGET_BIG_ENDIAN +#include +#endif #ifdef ENABLE_CT_TESTING #include @@ -33,17 +38,18 @@ static void print_hex(const unsigned char *hex, int len) { } #endif - -static int test_sqisign() { +static int test_sqisign(unsigned long long in_msglen) { unsigned char *pk = calloc(CRYPTO_PUBLICKEYBYTES, 1); unsigned char *sk = calloc(CRYPTO_SECRETKEYBYTES, 1); - unsigned char *sig = calloc(CRYPTO_BYTES + 32, 1); + unsigned char *sig = calloc(CRYPTO_BYTES + in_msglen, 1); - unsigned char seed[48] = { 0 }; - unsigned char msg[32] = { 0 }; - unsigned long long msglen = 32; + unsigned char *msg = malloc(in_msglen); + unsigned char *msg_open = malloc(in_msglen); - randombytes_init(seed, NULL, 256); + unsigned long long msglen = in_msglen; + + randombytes(msg, in_msglen); + randombytes(msg_open, in_msglen); printf("Testing Keygen, Sign, Open: %s\n", CRYPTO_ALGNAME); @@ -57,9 +63,9 @@ static int test_sqisign() { VALGRIND_MAKE_MEM_DEFINED(pk, CRYPTO_PUBLICKEYBYTES); #endif - unsigned long long smlen = CRYPTO_BYTES + 32; + unsigned long long smlen = CRYPTO_BYTES + in_msglen; - res = sqisign_sign(sig, &smlen, msg, 32, sk); + res = sqisign_sign(sig, &smlen, msg, in_msglen, sk); if (res != 0) { res = -1; goto err; @@ -76,14 +82,16 @@ static int test_sqisign() { VALGRIND_MAKE_MEM_DEFINED(sig, smlen); #endif - res = sqisign_open(msg, &msglen, sig, smlen, pk); - if (res != 0) { + res = sqisign_open(msg_open, &msglen, sig, smlen, pk); + if (res != 0 || msglen != in_msglen || memcmp(msg_open, msg, msglen)) { res = -1; goto err; } + randombytes(msg_open, in_msglen); + sig[0] = ~sig[0]; - res = sqisign_open(msg, &msglen, sig, smlen, pk); + res = sqisign_open(msg_open, &msglen, sig, smlen, pk); if (res != 1) { res = -1; goto err; @@ -91,20 +99,87 @@ static int test_sqisign() { res = 0; } + // Test with `sm` and `m` as the same buffer + msglen = in_msglen; + randombytes(msg, in_msglen); + memcpy(sig, msg, msglen); + + res = sqisign_sign(sig, &smlen, sig, in_msglen, sk); + if (res != 0) { + res = -1; + goto err; + } + + randombytes(msg_open, in_msglen); + + res = sqisign_open(msg_open, &msglen, sig, smlen, pk); + if (res != 0 || msglen != in_msglen || memcmp(msg_open, msg, msglen)) { + res = -1; + goto err; + } + + err: free(pk); free(sk); free(sig); + free(msg); + free(msg_open); return res; } int main(int argc, char *argv[]) { - int rc = 0; + uint32_t seed[12] = { 0 }; + int help = 0; + int seed_set = 0; + int msglen_set = 0; + int res = 0; + unsigned long long msglen = 32; - rc = test_sqisign(); + for (int i = 1; i < argc; i++) { + unsigned int _msglen; - if (rc != 0) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + + if (!msglen_set && sscanf(argv[i], "--msglen=%u", &_msglen) == 1) { + msglen = (unsigned long long) _msglen; + msglen_set = 1; + } + } + + if (help) { + printf("Usage: %s [--seed=]\n", argv[0]); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + + res = test_sqisign(msglen); + + if (res != 0) { printf("test failed for %s\n", argv[1]); } - return rc; + return res; } diff --git a/test/test_sqisign_prof.c b/test/test_sqisign_prof.c deleted file mode 100644 index 4112b5d..0000000 --- a/test/test_sqisign_prof.c +++ /dev/null @@ -1,102 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -#include -#include -#include -#include -#include -#include -#include - -// Some hardcoded vectors for profiling - -#if CRYPTO_PUBLICKEYBYTES == 64 -const unsigned char pk[] = {0x9C,0xD1,0x15,0x09,0x55,0x1D,0x64,0x17,0x07,0xA4,0xD8,0x96,0x58,0x60,0xCD,0x0F,0xD7,0x82,0xCC,0x1C,0x87,0x25,0xB5,0x42,0xC4,0xDC,0x78,0x5D,0xEE,0xCA,0x56,0x24,0x2E,0xC6,0x7D,0x92,0x45,0xCD,0x46,0x4B,0x83,0x85,0x54,0xD3,0xA7,0xFA,0x4F,0x1D,0x90,0xC1,0x47,0x36,0xF8,0x24,0x4E,0x21,0x1D,0x6E,0x31,0xBD,0xB9,0x8D,0x50,0x0C}; -const unsigned char sk[] = {0x9C,0xD1,0x15,0x09,0x55,0x1D,0x64,0x17,0x07,0xA4,0xD8,0x96,0x58,0x60,0xCD,0x0F,0xD7,0x82,0xCC,0x1C,0x87,0x25,0xB5,0x42,0xC4,0xDC,0x78,0x5D,0xEE,0xCA,0x56,0x24,0x2E,0xC6,0x7D,0x92,0x45,0xCD,0x46,0x4B,0x83,0x85,0x54,0xD3,0xA7,0xFA,0x4F,0x1D,0x90,0xC1,0x47,0x36,0xF8,0x24,0x4E,0x21,0x1D,0x6E,0x31,0xBD,0xB9,0x8D,0x50,0x0C,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAF,0x71,0x87,0xCD,0xA3,0x13,0xF3,0x7F,0xF9,0xF3,0xFD,0xAB,0xC6,0x25,0x48,0xF9,0x69,0xF2,0x5C,0xAB,0x3B,0xF9,0xAD,0x2C,0x79,0x07,0x22,0x7C,0xA6,0xAD,0x10,0xF3,0x64,0x9A,0xD7,0xF3,0x68,0xB6,0xCD,0x97,0xD7,0x6F,0xF5,0x67,0x29,0xE9,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFA,0xB3,0x43,0xC8,0x0E,0xF4,0x16,0xB8,0xBE,0x87,0x4E,0x2F,0x6D,0x2D,0xA7,0x38,0x00,0x81,0x24,0x17,0x38,0x44,0xDB,0x60,0x19,0xB7,0xB8,0x23,0xC4,0x9E,0xB7,0xD1,0x1B,0x46,0x6C,0x99,0xDC,0xCD,0xF9,0xBD,0x34,0x1F,0x73,0x0E,0x92,0x32,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0x8D,0x38,0xC1,0x1F,0xF3,0xB5,0x0E,0x8B,0xED,0x00,0x09,0x48,0xC0,0x60,0x4D,0x63,0xCB,0xC8,0x94,0x3C,0xAD,0x5A,0x0F,0xCD,0x1A,0xBF,0x81,0x30,0x81,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0xC9,0x2E,0x58,0x2C,0xC3,0x50,0x79,0xFA,0x93,0x64,0x3B,0x1F,0x12,0xB3,0xF0,0x86,0x43,0xF6,0xBB,0xAA,0x1B,0xB4,0x3E,0xBB,0x60,0x1D,0x25,0x4D,0x03,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8E,0xF4,0xD1,0x0A,0x6D,0x33,0x6B,0x5F,0x52,0xCD,0x54,0x9A,0x2E,0x38,0x48,0xD1,0xDA,0xE6,0xDF,0x6D,0x25,0x78,0x1D,0x0F,0x22,0x06,0x23,0x25,0xD7,0xB5,0xCA,0x17,0x00,0xF2,0xDC,0xC3,0x7B,0x1C,0x21,0x2B,0x00,0x3D,0xD8,0x58,0x66,0x36,0xBE,0x3A,0x87,0x89,0xA4,0x05,0x11,0x67,0x93,0xCA,0xBE,0x12,0xD7,0xE5,0xB2,0x6B,0xCC,0x21,0x7C,0x1D,0x15,0x74,0x80,0x36,0xC1,0x80,0x65,0xAD,0x55,0x16,0x20,0xEF,0xA2,0x34,0xF6,0x54,0x76,0xEE,0x48,0xC3,0xA5,0x04,0x81,0x18,0x96,0x63,0x36,0x3D,0x44,0x11,0xE7,0xED,0xD0,0xB9,0xBA,0xC2,0xC9,0x3B,0xD5,0xB3,0x49,0x40,0x96,0xB7,0xD0,0xEF,0xF8,0xF1,0xF3,0xE3,0x48,0x1F,0x38,0x69,0xBB,0xBB,0x51,0xE2,0x4B,0x16,0x1C,0x24,0x20,0x12,0xF7,0x9E,0x4A,0x62,0x50,0xFE,0x4C,0xD6,0x69,0x9D,0x7E,0x38,0x24,0xD3,0x5E,0x48,0x47,0xE7,0x43,0xA0,0x7B,0x09,0x14,0x04,0xA6,0xBD,0x71,0xD7,0x5D,0x2D,0x7D,0x09,0x62,0xC9,0xF5,0x1B,0x1C,0xFE,0x30,0x0A,0xA1,0xFA,0xD4,0xC0,0x13,0x1E,0x69,0x06,0x6D,0x83,0x2E,0x3D,0x5E,0x46,0x20,0x30,0xDD,0x90,0xE7,0xD2,0x5A,0x28,0x19,0x07,0x47,0x5E,0x62,0xA3,0xDE,0x15,0x71,0xCA,0x21,0x57,0xC7,0x1E,0xE3,0x7F,0xC1,0x94,0x5A,0x84,0x04,0x08,0xE6,0xC6,0xDB,0x4C,0x4D,0x50,0x6A,0x27,0xEB,0x24,0xEF,0x8E,0x23,0x96,0x66,0xA6,0x63,0xF6,0x33,0xA6,0xF7,0x66,0xDF,0xE1,0x27,0xB3,0x27,0x80,0xAF,0xC0,0x6E,0x2E,0x5A,0x86,0xD8,0x6F,0xB9,0xA2,0x53,0xDD,0xD5,0x31,0xA3,0x8E,0x64,0x16,0xE4,0xFD,0x5F,0x12,0x39,0x99,0x57,0xCC,0x87,0x29,0x24,0x6C,0xB1,0xD5,0xD5,0x72,0x19,0xA5,0xAA,0x35,0xBE,0x69,0xA8,0x21,0x33,0x8D,0x0D,0x14,0xE5,0xAA,0x83,0xE6,0x3F,0x84,0x3C,0x0E,0x5C,0x4F,0xAB,0x40,0xFB,0xAB,0x31,0x5D,0x01,0x9A,0xDC,0x0D,0x29,0xA2,0x7B,0xB5,0xD9,0x8E,0x39,0x77,0xC5,0x16,0x31,0x0A,0xE2,0x1D,0x41,0xBD,0x0D,0xAC,0xCC,0x99,0x40,0xA4,0xCF,0x2A,0x36,0x33,0xE5,0x3A,0xF5,0x34,0xA7,0xA4,0x6E,0xA3,0x9A,0x2D,0x75,0xAB,0xBB,0x41,0x70,0xA3,0x99,0x0F,0xCD,0xA5,0xF7,0x97,0x91,0x85,0x25,0x2A,0xAB,0x38,0xA9,0x27,0x08,0x6D,0xFD,0x3C,0x0C,0x96,0x04,0x0F,0xA6,0xA8,0xC8,0x77,0x69,0xD6,0xDF,0xD4,0xBC,0x47,0xBE,0x0D,0x38,0x37,0x2C,0xE5,0x9B,0xCD,0x4C,0xDD,0xE3,0x24,0xDA,0x73,0x17,0x65,0xEB,0x43,0x0F,0x85,0x84,0xD7,0x4D,0x83,0x98,0xC7,0x3C,0xB8,0x75,0x4E,0x91,0x8C,0x37,0x07,0x61,0x28,0xC2,0xC8,0x92,0x62,0xA1,0xA2,0xBE,0x43,0x62,0xCF,0xF1,0x95,0xD4,0xA2,0x76,0xBE,0x74,0x7E,0x57,0x27,0xFF,0x58,0xA7,0xFE,0xB0,0xB4,0xCF,0x24,0x7F,0x1B}; -const unsigned char sm[] = {0xB2,0x9C,0xA1,0x76,0x40,0xDD,0x8D,0x78,0xA0,0x01,0xD6,0xF9,0x9D,0x80,0x69,0x9D,0x24,0xDB,0xB1,0x04,0xDF,0xD7,0x05,0x6D,0xA5,0x6F,0x2D,0xBF,0xD7,0x04,0xF7,0x56,0x18,0xFC,0x79,0x6B,0xEA,0x04,0x0E,0x06,0x12,0x45,0x0C,0xB5,0x88,0x55,0x3B,0x93,0x65,0x02,0x1A,0x3E,0x7B,0xC1,0xD5,0xCB,0x83,0xC8,0x25,0x05,0x6C,0xC7,0xE8,0xB2,0x03,0x85,0xB1,0x69,0xBA,0x04,0x79,0xA1,0x58,0xDB,0x7F,0x6F,0xE2,0x29,0x28,0x00,0xAE,0xBE,0xED,0x83,0xCC,0x6F,0x77,0x5C,0x9D,0x02,0xFE,0x2F,0x3C,0xFC,0xFE,0x3A,0x78,0x9E,0x89,0x05,0x1B,0xBE,0x86,0xD0,0xE2,0x94,0xA2,0xE3,0xAE,0x04,0xF0,0xAE,0x5A,0xE4,0x81,0x8C,0x5F,0xEA,0x17,0x02,0x6F,0xC9,0x04,0xC8,0x70,0x7B,0x07,0x8C,0xD5,0x06,0x2C,0xBF,0xB0,0x01,0x9E,0x51,0x39,0xB8,0xE3,0x07,0x00,0x73,0x64,0x1A,0xF4,0x20,0x36,0x39,0xA9,0xE6,0x35,0xDD,0x31,0x2C,0x16,0x9C,0x5B,0x0A,0x00,0xC6,0x22,0x3B,0xC7,0x4D,0xE2,0x8D,0x76,0xF1,0x04,0x06,0x4E,0x28,0x00,0xA8,0xAC,0xF7,0x00,0xD8,0x1C,0x4D,0x8D,0x73,0x4F,0xCB,0xFB,0xEA,0xDE,0x3D,0x3F,0x8A,0x03,0x9F,0xAA,0x2A,0x2C,0x99,0x57,0xE8,0x35,0xAD,0x55,0xB2,0x2E,0x75,0xBF,0x57,0xBB,0x55,0x6A,0xC8}; -const unsigned char msg[] = {0xD8,0x1C,0x4D,0x8D,0x73,0x4F,0xCB,0xFB,0xEA,0xDE,0x3D,0x3F,0x8A,0x03,0x9F,0xAA,0x2A,0x2C,0x99,0x57,0xE8,0x35,0xAD,0x55,0xB2,0x2E,0x75,0xBF,0x57,0xBB,0x55,0x6A,0xC8}; -const unsigned long long mlen = 33; -#elif CRYPTO_PUBLICKEYBYTES == 96 -const unsigned char pk[] = {0xC5,0xCD,0x57,0x1D,0xF8,0x66,0x30,0xA9,0x3C,0x72,0xB4,0x15,0x95,0xD1,0xFC,0x20,0xD2,0x58,0x09,0x55,0x88,0xCB,0x64,0x09,0xFE,0xA9,0xA4,0xE1,0x83,0xB8,0x66,0xC7,0x7D,0x2F,0x42,0x3A,0x75,0x59,0xFB,0x3D,0x6E,0x1A,0xDF,0x06,0x04,0xB3,0x68,0x02,0xDD,0xC5,0xC9,0x42,0x0E,0x8E,0xC5,0x5D,0x54,0x7F,0xB0,0x2B,0x83,0x34,0x6D,0xC9,0xCC,0x18,0x57,0xEB,0x58,0x9E,0xE9,0x4E,0x66,0x6B,0x37,0xD8,0xC5,0xF2,0xDF,0x6B,0xBB,0xD3,0xEA,0xE8,0xE2,0x80,0x78,0xD5,0x46,0x59,0x76,0x5E,0x2F,0xCF,0xCD,0x00}; -const unsigned char sk[] = {0xC5,0xCD,0x57,0x1D,0xF8,0x66,0x30,0xA9,0x3C,0x72,0xB4,0x15,0x95,0xD1,0xFC,0x20,0xD2,0x58,0x09,0x55,0x88,0xCB,0x64,0x09,0xFE,0xA9,0xA4,0xE1,0x83,0xB8,0x66,0xC7,0x7D,0x2F,0x42,0x3A,0x75,0x59,0xFB,0x3D,0x6E,0x1A,0xDF,0x06,0x04,0xB3,0x68,0x02,0xDD,0xC5,0xC9,0x42,0x0E,0x8E,0xC5,0x5D,0x54,0x7F,0xB0,0x2B,0x83,0x34,0x6D,0xC9,0xCC,0x18,0x57,0xEB,0x58,0x9E,0xE9,0x4E,0x66,0x6B,0x37,0xD8,0xC5,0xF2,0xDF,0x6B,0xBB,0xD3,0xEA,0xE8,0xE2,0x80,0x78,0xD5,0x46,0x59,0x76,0x5E,0x2F,0xCF,0xCD,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA6,0x25,0xA3,0xE9,0x72,0x58,0x8F,0xA8,0x1D,0xF7,0x63,0x37,0x83,0xA0,0x7C,0x17,0x06,0x82,0x14,0x32,0xC9,0x75,0xD2,0x7F,0x15,0xA3,0x4F,0xA6,0x7B,0x9D,0x22,0x5A,0xDA,0xCE,0xD4,0xDE,0x4B,0x43,0xD8,0xFC,0x47,0xCE,0x7D,0x27,0xED,0x46,0x91,0x5D,0x23,0xB7,0xC4,0x24,0x09,0x7C,0x49,0xDA,0xF3,0x08,0x3D,0x63,0x80,0x19,0xA4,0x08,0xE2,0x60,0x0D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x08,0x56,0xD9,0x6E,0xDE,0x15,0xB6,0x89,0xCE,0x0A,0xAC,0x09,0xEB,0xD7,0x57,0x79,0xA4,0xC3,0xE7,0x81,0x6D,0x66,0x39,0x2E,0xF0,0x0A,0xCA,0x5A,0x17,0x4C,0x39,0x1A,0xBB,0x6D,0xF1,0x70,0x6D,0x1A,0xCE,0x4E,0xC4,0x56,0xC7,0x17,0x03,0xE7,0x33,0x45,0x8A,0x34,0xE4,0xA6,0x5E,0xE8,0xBD,0x4A,0x59,0x0E,0x8F,0xB7,0x6B,0xDC,0x3F,0xA5,0x1A,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x1F,0x15,0xE0,0x2A,0xF5,0xA3,0x79,0x65,0x77,0xD5,0x10,0x00,0xD0,0xAE,0xDA,0xAD,0x34,0x4F,0xB7,0xBD,0x70,0xCE,0x10,0x69,0x0A,0x93,0xBF,0xE3,0xEB,0xFE,0x10,0x66,0xB1,0x7B,0x6B,0x9F,0x8B,0x19,0x76,0xEC,0x07,0x4A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD6,0x0B,0x88,0x66,0xD7,0xE3,0x4F,0x7D,0xC0,0x7F,0xD5,0xB3,0x84,0xEA,0x6C,0xDA,0xD7,0xE5,0xC3,0x3C,0xAC,0x15,0xB2,0x03,0x5B,0xB1,0x1F,0x6B,0x63,0x7C,0x4B,0x61,0xC0,0xC1,0x9B,0xF3,0xC2,0xBB,0xD7,0x2A,0x14,0x1F,0xDC,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x94,0x18,0xE5,0xDA,0xBD,0x77,0x87,0xAF,0x06,0xC1,0x41,0x85,0x3A,0x09,0x7D,0xBC,0x38,0x49,0x98,0xA7,0x71,0x36,0xB9,0x94,0x4C,0x83,0x98,0xB0,0x9C,0x49,0x58,0x70,0x37,0xD8,0x99,0x9B,0x47,0xA5,0x76,0x22,0xEA,0xF2,0x3A,0xDF,0x63,0x4F,0x01,0x14,0x2E,0xA3,0x26,0x36,0x17,0x90,0x4D,0xD6,0x1C,0xA2,0x9F,0x8C,0x0A,0xE5,0x47,0x14,0x3E,0x5A,0x59,0xF4,0x35,0x7E,0xBE,0x87,0xE5,0xC6,0x7A,0x3F,0xE2,0x8F,0x49,0xAC,0x8B,0xC6,0x1C,0xE6,0x93,0x8A,0x29,0x76,0x08,0x85,0x58,0xAD,0x7E,0xFA,0x02,0x5B,0xFC,0x8F,0xB9,0x40,0x46,0x58,0x00,0xFB,0x71,0xD1,0x34,0x70,0x90,0xAD,0x23,0xEE,0xC7,0xF1,0x9B,0x60,0x99,0xC5,0xCF,0xC3,0x07,0xF2,0x71,0xE3,0x58,0x30,0xA7,0x20,0x81,0xFD,0xDF,0x66,0xE6,0x5C,0x39,0x8B,0x68,0x44,0xD2,0x00,0x8D,0xFF,0x02,0xBC,0x76,0x0C,0xD8,0x96,0x16,0x96,0xC1,0xC7,0x53,0x86,0xB5,0x2F,0x81,0x4D,0x0B,0x1C,0xBE,0x51,0x01,0xAA,0x66,0x8E,0x9E,0x0F,0x8C,0xDB,0xB8,0x51,0x5F,0xC4,0x43,0xCB,0x82,0x64,0x7F,0xDE,0x4D,0xCD,0x0C,0xDF,0x7F,0x59,0xE6,0xA3,0x76,0x9B,0x01,0x78,0xF1,0x32,0x76,0x84,0x44,0x5B,0x4C,0x4C,0xFC,0xD1,0x15,0xDA,0x53,0xDA,0x7B,0xE2,0x9A,0x03,0xFB,0x45,0x4A,0x61,0xDF,0x6C,0x40,0x62,0xE2,0x49,0xF6,0xB4,0x49,0xDE,0x28,0xC1,0x28,0xCF,0x03,0xF1,0x5B,0x2B,0x0A,0x50,0xDB,0xBB,0x1D,0x88,0x02,0x10,0x6C,0x70,0x86,0x57,0x0F,0x99,0xC3,0x84,0xEB,0x11,0x5D,0xB6,0xC6,0x1C,0x70,0xCD,0xBD,0xC6,0x8C,0xCA,0x2D,0x8C,0xA3,0xE0,0xBB,0x0E,0xD7,0x11,0x22,0x4F,0x33,0x6F,0xDB,0x39,0x6E,0xAA,0x9D,0xEC,0xD1,0xF4,0xAD,0xF7,0xB4,0xE7,0x1C,0x08,0x00,0x38,0x62,0xE5,0x99,0x8B,0x4E,0x64,0x17,0xE9,0xB9,0xE8,0xD1,0xBA,0xAA,0x8C,0x9D,0x57,0xD9,0x22,0xD5,0x2B,0xFC,0x7B,0x86,0x59,0x33,0xE3,0x15,0xF3,0x53,0x67,0xA1,0x6A,0x6C,0xA8,0x47,0x47,0x37,0x3F,0xF1,0xF3,0x43,0xEF,0xC2,0x50,0xE6,0xE3,0x01,0x0A,0x3A,0x30,0x3E,0x4C,0x74,0x68,0xD7,0xCD,0x5A,0x44,0x73,0xE2,0xD8,0x9D,0x86,0x80,0x27,0xB2,0x0F,0xF8,0xA6,0x5F,0xC2,0x8E,0x56,0x3B,0x1F,0x90,0x83,0xBB,0xF8,0xAD,0xC8,0xA2,0x55,0x87,0xAC,0x84,0x64,0xA9,0xCF,0x2A,0x30,0x64,0x15,0x56,0x00,0x49,0x5A,0xDE,0x62,0x54,0x2A,0x87,0x8A,0x3B,0x51,0xE7,0x5B,0xA0,0x24,0x46,0x79,0x13,0x2F,0xCD,0x7C,0x22,0x3B,0x3C,0x52,0x29,0x2A,0x24,0x2C,0x0F,0x83,0x47,0x49,0xB3,0x0F,0x0F,0xD7,0xC8,0x82,0xF1,0x48,0x22,0xD7,0x13,0xF8,0x7F,0xF2,0x4D,0x01,0xA2,0x17,0x89,0x9B,0xD7,0xC7,0x1D,0x24,0xDD,0xA2,0xAD,0x2E,0x30,0x7A,0xCF,0x65,0x09,0x78,0x82,0xD6,0x7D,0xE5,0x56,0xBB,0xFB,0x89,0xDD,0x32,0x91,0x55,0xB8,0xDA,0x34,0xE7,0xF7,0x6E,0x8C,0x7D,0xF7,0x85,0x0D,0x0F,0x8F,0x0D,0xE6,0x67,0xC5,0x03,0xEF,0x71,0x08,0x25,0xA9,0xE7,0x0D,0x2B,0xCF,0x08,0xA2,0x30,0x8F,0x2B,0x13,0xDE,0xE2,0x44,0x7A,0xE1,0xE8,0x22,0x99,0xA8,0xE2,0xDD,0x7D,0x1F,0xE8,0x32,0x6A,0x87,0x52,0xFF,0xCD,0xB6,0x3F,0xD2,0x65,0xCA,0xDE,0xF4,0xC3,0x60,0x11,0x98,0x7D,0x00,0x54,0x33,0x09,0xDA,0x51,0xAC,0x69,0x8E,0x8E,0xFA,0x3C,0x9E,0x4C,0x42,0x5E,0xB7,0xD2,0x8F,0x6E,0x89,0x09,0x07,0x14,0x53,0x01,0x9C,0xB5,0xF1,0x5F,0x0F,0xE1,0x15,0x2E,0x56,0x5E,0x94,0xB4,0x8E,0x35,0x12,0x9D,0x68,0x4C,0x72,0xAF,0x23,0x51,0x01,0x08,0x81,0xE4,0xCA,0x2F,0xB8,0x63,0x95,0x94,0x90,0x73,0x7D,0xF9,0x6A,0x3A,0xF8,0x51,0x23,0xCC,0x5F,0x91,0x8B,0xA0,0x9B,0x35,0x38,0xC2,0x5F,0x8F,0x18,0x6B,0x1D,0x29,0xA3,0x3E,0x2B,0x24,0xD3,0x20,0x41,0x1D,0x42,0xE3,0x8A,0x79,0xC4,0xDD,0x00,0x09,0x33,0x53,0x3C,0xBF,0xA2,0xEC,0x69,0x70,0xE8,0xE2,0x3E,0xB5,0xE4,0xBE,0x7C,0xAA,0x3C,0x06,0xE4,0x35,0x08,0xF0,0xA8,0xF4,0xD1,0xB6,0x37,0x4D,0x3F,0x76,0x22,0xB1,0x64,0x91,0x8A,0x85,0xE8,0x1D,0x90,0xB2,0x3A,0x72,0x13,0xEF,0x53,0x25,0x02}; -const unsigned char sm[] = {0x30,0x6C,0xE5,0xF3,0x2F,0x45,0x82,0xC3,0x50,0x0A,0xF2,0x62,0x01,0x55,0xD3,0xE3,0x71,0xA3,0xF8,0xF8,0xE9,0x7F,0xC2,0xB1,0x22,0x01,0xEF,0x74,0x1C,0x2E,0xDB,0x2A,0xA4,0x06,0xE7,0xE8,0xE5,0x50,0x00,0x16,0x6D,0x17,0x79,0x12,0x3B,0xBD,0xA1,0xEA,0xC9,0x4E,0x37,0x01,0x5C,0xA5,0xA4,0xEB,0xFF,0x19,0xE4,0xC1,0xA4,0xBF,0x97,0x30,0x01,0xB5,0x1F,0x41,0x47,0x5C,0x42,0x45,0x88,0x83,0xDC,0xF7,0x0C,0x00,0x0F,0xD5,0x0A,0x8A,0x81,0x7E,0x14,0xEC,0xD7,0xD1,0x9C,0x53,0x01,0xF2,0xC0,0x58,0x9E,0x87,0xA2,0x26,0xD1,0x25,0x4C,0x3C,0xB2,0x00,0x9E,0xBF,0x2C,0x4A,0xE9,0x90,0x0B,0xA1,0x51,0xFE,0xB4,0x79,0x00,0x5B,0x2C,0xBB,0xE9,0x30,0x71,0xBB,0x4E,0x3F,0xAC,0x2B,0x3C,0x01,0xE7,0x50,0x29,0x4D,0x05,0xCC,0x03,0xDA,0x2E,0xC8,0xF2,0x0F,0x00,0x13,0xE0,0x28,0xCA,0xC0,0x64,0x88,0xDD,0xD5,0xBE,0xF3,0xBD,0x00,0x5D,0xA9,0xBA,0x82,0xD8,0xF2,0xA2,0x14,0xE0,0x87,0x84,0x4C,0x00,0x65,0x80,0x66,0xAA,0x9B,0x23,0x8B,0x33,0x9B,0x36,0x55,0x6B,0x01,0x5F,0x87,0x87,0xBE,0x49,0x32,0xE2,0x8B,0x70,0xEF,0x69,0x47,0x00,0x1A,0xF5,0xC0,0xDF,0x52,0xE4,0x13,0x21,0x86,0x2E,0x81,0x36,0x00,0x00,0x69,0x01,0x8C,0x3F,0xEB,0x9F,0xAC,0x4D,0xCF,0x6F,0x4B,0x85,0x2C,0x8D,0x42,0xF7,0xA6,0xF0,0xB8,0xA6,0x22,0xFE,0xBC,0x42,0x22,0x00,0x01,0xB0,0x74,0x5E,0x9F,0x8D,0x6E,0x8A,0x54,0xCE,0x67,0x03,0x08,0x01,0xF5,0x6F,0xA9,0xFE,0x51,0xB5,0x12,0xAF,0x06,0xFC,0x50,0xF9,0xEC,0x0A,0xD8,0x1C,0x4D,0x8D,0x73,0x4F,0xCB,0xFB,0xEA,0xDE,0x3D,0x3F,0x8A,0x03,0x9F,0xAA,0x2A,0x2C,0x99,0x57,0xE8,0x35,0xAD,0x55,0xB2,0x2E,0x75,0xBF,0x57,0xBB,0x55,0x6A,0xC8}; -const unsigned char msg[] = {0xD8,0x1C,0x4D,0x8D,0x73,0x4F,0xCB,0xFB,0xEA,0xDE,0x3D,0x3F,0x8A,0x03,0x9F,0xAA,0x2A,0x2C,0x99,0x57,0xE8,0x35,0xAD,0x55,0xB2,0x2E,0x75,0xBF,0x57,0xBB,0x55,0x6A,0xC8}; -const unsigned long long mlen = 33; -#elif CRYPTO_PUBLICKEYBYTES == 128 -const unsigned char pk[] = {0x6A,0x93,0x02,0xB5,0x1F,0x65,0xAC,0x67,0xC5,0x74,0xA0,0x5E,0x95,0x98,0x60,0x4D,0x95,0xAA,0x6E,0x3C,0x61,0xB9,0x3C,0xBA,0x98,0xEE,0xFE,0x80,0x89,0x05,0x65,0x2D,0x43,0x93,0x3D,0xC0,0xEC,0xEF,0x7B,0xE2,0x67,0x37,0x3E,0xB1,0xAC,0x61,0xD4,0xA9,0x11,0x38,0xD2,0x35,0xF7,0xBA,0x19,0xDD,0x12,0xE5,0x5F,0x48,0xD6,0xFE,0x1E,0x00,0x0A,0xAC,0xB9,0x0A,0xB4,0xFF,0xC3,0xD9,0x0D,0x79,0x3F,0x2A,0x12,0x91,0xDC,0x63,0x8F,0x80,0x28,0xE3,0x1F,0x7D,0xA9,0xFE,0x49,0x76,0x71,0xDB,0x2D,0xBA,0xC7,0x89,0x48,0x6A,0x61,0xC9,0x4B,0xCB,0xE9,0xA8,0xDD,0xD7,0x86,0x70,0x95,0x5C,0xFC,0x3A,0x10,0x4D,0x21,0x41,0x18,0x89,0x12,0x5A,0x96,0x68,0x59,0x1B,0x16,0xD4,0x04,0x00}; -const unsigned char sk[] = {0x6A,0x93,0x02,0xB5,0x1F,0x65,0xAC,0x67,0xC5,0x74,0xA0,0x5E,0x95,0x98,0x60,0x4D,0x95,0xAA,0x6E,0x3C,0x61,0xB9,0x3C,0xBA,0x98,0xEE,0xFE,0x80,0x89,0x05,0x65,0x2D,0x43,0x93,0x3D,0xC0,0xEC,0xEF,0x7B,0xE2,0x67,0x37,0x3E,0xB1,0xAC,0x61,0xD4,0xA9,0x11,0x38,0xD2,0x35,0xF7,0xBA,0x19,0xDD,0x12,0xE5,0x5F,0x48,0xD6,0xFE,0x1E,0x00,0x0A,0xAC,0xB9,0x0A,0xB4,0xFF,0xC3,0xD9,0x0D,0x79,0x3F,0x2A,0x12,0x91,0xDC,0x63,0x8F,0x80,0x28,0xE3,0x1F,0x7D,0xA9,0xFE,0x49,0x76,0x71,0xDB,0x2D,0xBA,0xC7,0x89,0x48,0x6A,0x61,0xC9,0x4B,0xCB,0xE9,0xA8,0xDD,0xD7,0x86,0x70,0x95,0x5C,0xFC,0x3A,0x10,0x4D,0x21,0x41,0x18,0x89,0x12,0x5A,0x96,0x68,0x59,0x1B,0x16,0xD4,0x04,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0xCB,0x52,0xB5,0x61,0x25,0x56,0xF9,0x2A,0x5E,0x3D,0x5D,0xBF,0x4D,0xF3,0x3E,0xA4,0xB3,0x78,0x5A,0x6A,0xA6,0xF7,0xDA,0xF7,0x9F,0x5C,0x5F,0xC8,0x63,0x27,0x5D,0x2F,0xBC,0xFE,0x4A,0x88,0x32,0x3B,0x0F,0x24,0xF8,0x48,0x0C,0x93,0x8F,0xA7,0xDD,0x40,0x3F,0xDA,0x74,0xF7,0x86,0x4F,0x3A,0x3E,0xE6,0xF7,0x87,0x05,0x12,0x78,0xB5,0xFD,0x7E,0x2E,0xF1,0xA9,0xC4,0xD6,0x4C,0x8B,0x5F,0x8A,0x9A,0x99,0x09,0x6A,0x1E,0xF1,0x68,0x32,0x6C,0xE8,0xE1,0x12,0x21,0x44,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC3,0x39,0xA9,0xC8,0x3E,0xB9,0x6D,0x9C,0xC2,0xD7,0x7A,0xE8,0x33,0xB3,0x01,0x26,0x7C,0x3E,0x8E,0x59,0x2C,0x19,0x65,0x92,0x35,0x84,0xF9,0x50,0x04,0x95,0x2E,0x69,0xD6,0x34,0x30,0x5E,0x4F,0x50,0xCE,0x7F,0xBD,0x89,0xE4,0x93,0x18,0x98,0x6B,0x0F,0x1F,0xA1,0xDB,0xBA,0xE1,0x7C,0x59,0x22,0x29,0x87,0x00,0x8A,0x1F,0x67,0x94,0x27,0xDA,0x64,0x5B,0xFC,0xE9,0x00,0x6C,0x68,0x15,0xE1,0x90,0x38,0xE6,0x10,0x3B,0x81,0x13,0xC2,0x58,0x7D,0xD4,0x21,0x15,0x32,0x91,0xE8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDB,0xE8,0xB4,0x7E,0xF0,0x4B,0x4E,0x0C,0x60,0x64,0x91,0x4B,0x85,0x8D,0xAC,0x47,0x56,0xAA,0x2C,0x89,0xD6,0x28,0xFD,0x56,0xAA,0x84,0xDD,0xBB,0xDD,0x33,0xB7,0xA8,0x48,0x5E,0xAA,0x43,0x6B,0x20,0x1A,0xFC,0x1B,0x9F,0x8A,0xEB,0xDE,0x42,0xD3,0xD8,0x96,0x20,0xB0,0x3D,0xC4,0x30,0x81,0x91,0xED,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x9F,0xA7,0xFA,0xCE,0xC9,0x8A,0xC6,0xFB,0x9E,0x4E,0x6A,0x3B,0x49,0xC4,0x4E,0xB8,0x29,0x29,0x61,0x5C,0xBA,0x18,0xD3,0xEF,0x33,0x51,0xE0,0xDA,0x72,0x0E,0xCB,0x37,0x6E,0xE1,0x4A,0x5E,0x86,0x88,0xB5,0x76,0x5E,0x24,0x1D,0xD1,0xC0,0x8A,0xC7,0x60,0x8D,0xCA,0x19,0xFB,0xB2,0x6B,0x58,0x9C,0x42,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA7,0x8B,0x0B,0xD3,0xAE,0x6D,0xBE,0x94,0x79,0x68,0x7E,0x49,0x6A,0x2F,0x81,0x52,0x79,0x1D,0xFD,0x83,0x4E,0xE2,0x59,0xEA,0x6A,0xE9,0x46,0xFE,0x37,0x2A,0xD2,0x82,0xA4,0xCA,0xCF,0x7B,0x22,0x13,0xBC,0x3D,0x86,0x1D,0x57,0x8E,0x89,0xE4,0x15,0xFD,0xF0,0x72,0x42,0x02,0x29,0x47,0x29,0x45,0xF2,0x03,0x6D,0x07,0x23,0xE4,0x23,0x00,0x66,0x7E,0x8A,0xA1,0xD7,0x6A,0x14,0x20,0x5A,0xAA,0x1D,0x62,0x18,0xCC,0x6C,0xD6,0x77,0x50,0x92,0xFB,0x13,0x66,0x80,0x42,0x84,0xC1,0x15,0x57,0x1E,0xAD,0x08,0x8E,0xAB,0xC5,0x3F,0xA7,0xA8,0x05,0x90,0x1F,0x97,0x9D,0x71,0x7F,0x0D,0xD8,0xF3,0x14,0x5B,0xCB,0xD1,0x71,0x2D,0xF5,0x03,0x9E,0xB4,0xED,0x56,0xCD,0xBD,0x53,0x04,0x00,0x45,0xFC,0x83,0x04,0x9C,0x31,0xB1,0x34,0x6A,0x7F,0xA5,0x4B,0x2D,0x82,0x00,0xE0,0x95,0xAA,0x80,0x89,0x2F,0xB9,0xA3,0x97,0xA6,0xE2,0x1B,0xCD,0x3C,0x66,0x21,0x33,0x1B,0x7E,0x56,0x0B,0xA4,0x6F,0x25,0xB0,0xB3,0x55,0x69,0x7F,0xF1,0x99,0x02,0xF1,0xB6,0xA1,0x9C,0x3C,0xC3,0x0E,0x58,0x3A,0x21,0x15,0xFB,0x5B,0x1C,0xBC,0x05,0x00,0x9A,0xB6,0x21,0x59,0x26,0xF0,0x90,0x69,0x5A,0x9D,0x14,0xB0,0xCC,0x49,0x53,0x82,0x49,0xCE,0xF9,0x8A,0x79,0x47,0x1B,0xA4,0x1D,0xA0,0x45,0xCA,0xD2,0x7C,0x88,0xC8,0xFD,0x13,0x25,0x16,0x37,0x5F,0xAF,0xAD,0x91,0x13,0x76,0x11,0x75,0xF5,0x0F,0xA2,0x5E,0x1A,0x1C,0x47,0x3C,0xD3,0x3A,0xC8,0x43,0x26,0x8C,0x51,0x5E,0x25,0x20,0x00,0x11,0x70,0x1B,0x05,0x0A,0x20,0x1A,0x78,0x62,0x9D,0x43,0x43,0xBE,0x85,0x74,0x32,0x67,0x58,0x07,0x2C,0xBA,0xDA,0x17,0x14,0xA2,0x17,0x94,0x50,0x2A,0xE7,0x84,0x6A,0xF7,0x3F,0x1C,0x6B,0xD7,0x61,0x81,0x89,0xF6,0x8E,0xBE,0x5C,0x60,0x2E,0x44,0x67,0xDD,0x19,0xA7,0x75,0x13,0x01,0x99,0x38,0x10,0x3A,0x96,0x30,0xBC,0x0A,0x17,0x00,0x1E,0xBA,0x74,0x17,0xCC,0x5E,0x4F,0xAC,0x4A,0x5D,0xBD,0x52,0xAC,0x5A,0x22,0x63,0xBB,0x5F,0xF5,0x5F,0xE2,0xDA,0x2F,0x4E,0x6D,0xC4,0xB3,0xE9,0x24,0x46,0x9F,0x33,0x45,0x63,0xB2,0x4C,0x5F,0xF0,0xC5,0x20,0x7A,0x57,0xA6,0xF2,0x69,0x88,0x46,0x9B,0x09,0xD4,0xBD,0x75,0x83,0xA3,0xB1,0x36,0x95,0xB7,0x9A,0xCC,0x75,0xDE,0x09,0x00,0xC6,0x16,0xAA,0xC1,0x53,0x2A,0x88,0xD9,0x61,0xA1,0x70,0x29,0xE8,0xD5,0x1E,0xB6,0x6A,0x64,0x31,0x41,0x1B,0xA3,0x83,0x6F,0xF7,0x75,0x27,0x75,0xF4,0xCE,0xB1,0x41,0xAA,0x99,0x0E,0xDD,0xA2,0xCC,0x84,0x30,0x16,0x5D,0x27,0x21,0x6A,0x40,0x62,0x48,0xAA,0x94,0x6A,0x17,0xDF,0x85,0x06,0xDE,0x49,0xC4,0xF6,0x15,0x56,0xD2,0x21,0x00,0x79,0x52,0xC2,0x4E,0x3F,0xAC,0x50,0xCD,0x59,0x04,0x36,0x6B,0x4B,0x6B,0xA5,0x7E,0x17,0xC5,0xF1,0xCA,0x5E,0x31,0x37,0x50,0xCE,0x09,0x1D,0xF1,0x6B,0xEE,0x1C,0x3C,0xA5,0x99,0x8B,0xE1,0xBD,0x26,0xE2,0x68,0x79,0x38,0x31,0x2B,0xCC,0xD3,0x01,0xFB,0xA2,0x71,0x6E,0xB9,0x31,0x71,0x53,0x65,0x19,0x9A,0xA0,0xE0,0x73,0xB0,0x04,0x00,0x85,0xF5,0xA3,0x51,0xDE,0x09,0xC6,0xE4,0x74,0xF3,0x1A,0x90,0xBB,0x35,0xE8,0x2A,0xD3,0xCB,0x80,0x2C,0x86,0x30,0xD8,0x74,0xE0,0x70,0x9D,0xD6,0x63,0x22,0x9C,0xC6,0x6E,0xCA,0x49,0x7E,0x33,0x2B,0x56,0xAB,0xAA,0x96,0xB1,0xD7,0x02,0x64,0xFF,0xF1,0xEC,0x0A,0xF6,0x69,0x1E,0x60,0x0B,0xB6,0x1F,0x75,0x6E,0x78,0xE0,0x76,0x0D,0x00,0x0E,0x0E,0x36,0x04,0x04,0x7C,0x33,0x89,0x8F,0xC3,0x92,0xEF,0x55,0x03,0x30,0xF6,0x4C,0x40,0x08,0x57,0x96,0xEB,0x6E,0x8C,0x94,0x2F,0xDF,0xBE,0xC1,0xEB,0x86,0x7E,0x4B,0xCB,0x3D,0x65,0xF7,0x92,0xC4,0xE5,0x02,0x23,0xBB,0x3F,0x55,0xCE,0x81,0x9A,0xED,0xA9,0x7D,0xC4,0x83,0xB0,0x14,0xA2,0x2E,0xE5,0xC7,0x6D,0xA4,0xB8,0x13,0x00,0x84,0xAB,0x87,0xD6,0xFF,0xC5,0x9A,0xA0,0x7A,0x38,0x8E,0xA4,0xD0,0xF8,0x61,0x9D,0xD1,0x21,0x8A,0xF2,0xC3,0xDD,0xA9,0xBF,0x2F,0x0C,0x70,0x47,0x31,0x8B,0x64,0x8E,0xF0,0x80,0x1C,0x42,0x5D,0x47,0x6C,0xF3,0xB5,0x7F,0xE7,0xD6,0x5D,0x94,0x5D,0xA1,0xB4,0x4F,0xC1,0xE3,0x14,0xC9,0xFF,0x1C,0x42,0x9D,0x64,0x3E,0x2F,0x23,0x10,0x00,0x57,0xF1,0x12,0xB3,0xF5,0xEC,0x14,0x0F,0x7D,0x2E,0x15,0x08,0x6E,0x81,0xD0,0x8A,0x1B,0xD9,0x95,0x6C,0xCE,0xEC,0x69,0xA4,0x36,0x5D,0xAF,0x0A,0x63,0xA6,0x80,0x77,0xB4,0xEC,0xD9,0x11,0xC0,0x05,0x65,0x10,0xB4,0xB2,0xBC,0x92,0x45,0x9E,0x77,0xCF,0x7D,0xDD,0x63,0x22,0xC0,0xA9,0x12,0x82,0xAF,0x30,0x9A,0x1B,0xE0,0xE7,0x0E,0x00,0xA8,0xD4,0x22,0x94,0x17,0x36,0x34,0xD0,0x69,0x84,0x14,0x08,0xEE,0x4C,0x5C,0x3B,0x35,0xBE,0xE5,0x12,0xBC,0x56,0xCF,0x7C,0x41,0x8C,0xFF,0x86,0x17,0xC8,0x46,0x39,0xB0,0x3D,0x57,0xD0,0x29,0xC3,0xE8,0xD6,0x17,0xCF,0x19,0x82,0x46,0xE0,0xF5,0x13,0xDC,0x5E,0x66,0x7D,0x9B,0xCC,0x90,0xF2,0x0F,0x9F,0xB7,0x21,0x41,0xCC,0x0C,0x00,0x90,0xF2,0x4B,0xD2,0xA9,0x00,0xD2,0x5D,0x90,0x13,0xA3,0x70,0x19,0x1F,0xA8,0x8D,0x18,0xA1,0x3A,0x90,0xD1,0x34,0x46,0x88,0xD3,0xAB,0xE4,0x5D,0xE6,0xA6,0xC0,0x64,0x7F,0x92,0xDE,0x0E,0xF0,0x43,0x46,0x00,0x02,0x64,0xA5,0x46,0x34,0x54,0xF6,0x59,0xCC,0x41,0xD8,0x42,0x78,0x23,0x36,0x37,0x26,0x95,0x9A,0x96,0xD5,0x91,0x15,0x00}; -const unsigned char sm[] = {0xD3,0x3B,0xF0,0xF0,0x83,0xFF,0x80,0xC0,0x02,0x1E,0xBB,0x85,0xF0,0xAA,0x03,0x4D,0x1A,0x5F,0x00,0xFD,0xE6,0xB7,0x50,0x2C,0x9B,0x50,0x00,0x15,0xAD,0x7D,0x75,0x2B,0x3E,0x47,0xD2,0x4A,0x45,0x01,0xD4,0xAC,0x85,0x0B,0xB4,0x3C,0xA4,0xA9,0x85,0x76,0x6D,0x48,0x56,0x9D,0xD2,0x68,0x1C,0x51,0x00,0x09,0xF5,0x73,0xE2,0xD4,0x6A,0x85,0x89,0xE6,0x06,0x95,0x09,0x79,0x9D,0x16,0xC2,0xA4,0xF1,0x01,0xEE,0x26,0x0B,0x7B,0xE5,0x5D,0x11,0x1F,0x7E,0xA7,0x08,0x75,0xA9,0x1D,0x05,0xC4,0x8B,0x13,0x00,0x75,0xE4,0x61,0x77,0x99,0x1D,0x74,0x6C,0x20,0xC2,0xFB,0x27,0xF8,0x99,0xA9,0xD4,0x04,0x5A,0x01,0x64,0xC7,0x68,0x2B,0x46,0x5F,0x4A,0x7B,0x53,0xAD,0xF1,0xF1,0xF4,0xBC,0x91,0x9E,0xF0,0x3E,0x00,0x62,0x54,0xCC,0xF4,0x1B,0x5F,0x6D,0x67,0x8E,0x17,0x65,0x2C,0xD6,0x3E,0xA6,0xC1,0x83,0xF3,0x01,0xBC,0x58,0xFC,0x44,0xC2,0x4A,0x70,0x79,0x9F,0x3A,0xFF,0xF2,0xF6,0x29,0x70,0xBA,0x7E,0x6F,0x01,0xD0,0x5A,0x2A,0x85,0x83,0x68,0x5B,0x7C,0xD7,0x55,0x6E,0x46,0xC3,0x89,0x93,0x36,0x1E,0xA2,0x01,0x91,0x78,0x7E,0x26,0x07,0x81,0x05,0xC0,0xBD,0x3B,0x54,0x09,0xFF,0xDA,0x68,0x42,0x40,0x14,0x01,0x97,0x22,0x89,0x58,0xA0,0x75,0x00,0x09,0xD5,0x48,0x21,0x59,0xA4,0x53,0x58,0x59,0x4F,0xFF,0x01,0xE9,0x2C,0x17,0xD5,0xF6,0x47,0xB3,0xE2,0x70,0xA3,0xCD,0x06,0xCB,0x0E,0xCD,0x2B,0x53,0x18,0x00,0x86,0xAE,0xFA,0x2B,0x45,0x41,0xDA,0xDF,0x76,0x50,0xD1,0x17,0x45,0x55,0x4B,0x5E,0xA2,0x28,0x00,0x01,0x1B,0x9E,0xFD,0xCE,0xAB,0x91,0x43,0xF9,0xF6,0x27,0x9E,0x01,0xFF,0x54,0x17,0xA4,0x76,0x66,0x85,0x7B,0x98,0x59,0xD7,0x31,0x64,0x04,0xC0,0x24,0xBF,0x26,0x8A,0x88,0x08,0x03,0x41,0x5B,0x47,0x97,0xE9,0x69,0x08,0x8E,0xD5,0xB3,0x46,0x53,0x09,0xBD,0xA6,0xDC,0xBC,0x5F,0x00,0x7E,0xD0,0xA3,0x2B,0xA4,0x3A,0xFA,0xB0,0x51,0x47,0x2F,0x3F,0xF0,0x79,0x03,0xD8,0x1C,0x4D,0x8D,0x73,0x4F,0xCB,0xFB,0xEA,0xDE,0x3D,0x3F,0x8A,0x03,0x9F,0xAA,0x2A,0x2C,0x99,0x57,0xE8,0x35,0xAD,0x55,0xB2,0x2E,0x75,0xBF,0x57,0xBB,0x55,0x6A,0xC8}; -const unsigned char msg[] = {0xD8,0x1C,0x4D,0x8D,0x73,0x4F,0xCB,0xFB,0xEA,0xDE,0x3D,0x3F,0x8A,0x03,0x9F,0xAA,0x2A,0x2C,0x99,0x57,0xE8,0x35,0xAD,0x55,0xB2,0x2E,0x75,0xBF,0x57,0xBB,0x55,0x6A,0xC8}; -const unsigned long long mlen = 33; -#else -#error "Not supported" -#endif - -static int test_sqisign_keygen() { - int res = 0; - unsigned char *pk = calloc(CRYPTO_PUBLICKEYBYTES, 1); - unsigned char *sk = calloc(CRYPTO_SECRETKEYBYTES, 1); - - res = sqisign_keypair(pk, sk); - if (res != 0) { - res = -1; - } - - free(pk); - free(sk); - return 0; -} - -static int test_sqisign_sign(int mlen) { - int res = 0; - unsigned char *sig = calloc(CRYPTO_BYTES + mlen, 1); - unsigned long long smlen = CRYPTO_BYTES + mlen; - - res = sqisign_sign(sig, &smlen, msg, mlen, sk); - if (res != 0) { - res = -1; - } - - free(sig); - return res; -} - - -static int test_sqisign_open(int mlen) { - int res = 0; - unsigned long long msglen = mlen; - unsigned char *msg = calloc(mlen, 1); - - unsigned long long smlen = CRYPTO_BYTES + mlen; - - res = sqisign_open(msg, &msglen, sm, smlen, pk); - if (res != 0) { - res = -1; - } - - - free(msg); - return res; -} - - -int main(int argc, char *argv[]) { - int rc = 0; - - if (argc <= 1) { - printf("Usage: <0(keygen)/1(sign)/2(open)>\n"); - exit(0); - } - - int ar = atoi(argv[1]); - - if (ar == 0) - return test_sqisign_keygen(); - else if (ar == 1) - return test_sqisign_sign(mlen); - else if (ar == 2) - return test_sqisign_open(mlen); - - printf("Usage: <1(keygen)/2(sign)/3(open)>\n"); - return 0; -}